From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-ot1-x32b.google.com (mail-ot1-x32b.google.com [IPv6:2607:f8b0:4864:20::32b]) by sourceware.org (Postfix) with ESMTPS id BA362385483B for ; Thu, 14 Jan 2021 19:28:52 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org BA362385483B Received: by mail-ot1-x32b.google.com with SMTP id c18so472025oto.3 for ; Thu, 14 Jan 2021 11:28:52 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=IDXFqlJHL1hFoEYkygawaU7bIS6RugaASw/ZPgvSXgk=; b=FFFb/R+Hc0SZw5/9uNrp4e79X2NbsWaxyDz/pcPE0hyM73I+QI88IPcCRtDUpd42zu 39D0dAFGEB8N13vKdZerxDb6ishGQrXtJ5lm7Gw05NO5LAIE9t6rboa+980w2YGNoKWb glGPLj9twLU2n0jNy/yU/c7UOYIZExHGlR7iI0gzETq/7JwufIbwhb+YFmMZijcB8Whi 2AS6E7IHTaNuHoxn19ZWRcYn2WYOMsmodTp7EoOr4Csr1KBESZilNGau58yHF962y7ad Lns6yLZGveN/RPALQiVAcYSytgKwfS5INv9sFQ2kTLEo1nFluDCxQQ44AaXPwZ5MHPYi VnGQ== X-Gm-Message-State: AOAM533PvZXc9TJolRg1JR1I6UIhkIDYWPAq3/aVeaRHmNWtrU1q67B+ pu9bkN7bf4FAWM8M76t9RLkTkdFzIt/5BgM6moE= X-Google-Smtp-Source: ABdhPJxL5p9Jq/jWrwJXcQ7tMBmPUJ1UlsOxv+sWHUi+WGhMxzZvpGV7Sqp8A4W9hQGyecu5FNbMFI+Uz8qACCuAvcw= X-Received: by 2002:a05:6830:10d2:: with SMTP id z18mr5660537oto.90.1610652530288; Thu, 14 Jan 2021 11:28:50 -0800 (PST) MIME-Version: 1.0 References: <20201031154437.2689427-1-hjl.tools@gmail.com> <20201031154437.2689427-2-hjl.tools@gmail.com> <42ca59b0-47af-6e46-03a1-2bb2ab7dfdc1@linaro.org> In-Reply-To: <42ca59b0-47af-6e46-03a1-2bb2ab7dfdc1@linaro.org> From: "H.J. Lu" Date: Thu, 14 Jan 2021 11:28:13 -0800 Message-ID: Subject: V5 [PATCH 1/2] x86: Move x86 processor cache info to cpu_features To: Adhemerval Zanella Cc: GNU C Library , Florian Weimer Content-Type: multipart/mixed; boundary="000000000000ecdb9d05b8e1430b" X-Spam-Status: No, score=-3036.1 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP, URIBL_BLACK autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 14 Jan 2021 19:28:59 -0000 --000000000000ecdb9d05b8e1430b Content-Type: text/plain; charset="UTF-8" On Thu, Jan 14, 2021 at 6:13 AM Adhemerval Zanella wrote: > > > > On 31/10/2020 12:44, H.J. Lu via Libc-alpha wrote: > > 1. Move x86 processor cache info to _dl_x86_cpu_features in ld.so. > > 2. Update tunable bounds with TUNABLE_SET_WITH_BOUNDS. > > 3. Move x86 cache info initialization to dl-cacheinfo.h and initialize > > x86 cache info in init_cpu_features (). > > 4. Put x86 cache info for libc in cacheinfo.h, which is included in > > libc-start.c in libc.a and is included in cacheinfo.c in libc.so. > > Patch looks ok for 2.33 with a small nit below regarding an implicit check. > > I have checked with some build variations (default and static-pie) > and it shows no regression. I saw that --enable-tunables=no is not > building anymore, but it is due another patch. > > Reviewed-by: Adhemerval Zanella > > > --- > > sysdeps/x86/cacheinfo.c | 46 ++- > > sysdeps/x86/cacheinfo.h | 400 ++----------------------- > > sysdeps/x86/cpu-features.c | 35 +-- > > sysdeps/x86/dl-cacheinfo.h | 460 +++++++++++++++++++++++++++++ > > sysdeps/x86/include/cpu-features.h | 22 ++ > > 5 files changed, 551 insertions(+), 412 deletions(-) > > > > diff --git a/sysdeps/x86/cacheinfo.c b/sysdeps/x86/cacheinfo.c > > index 0d2fe3a2fa..e1ea4d5228 100644 > > --- a/sysdeps/x86/cacheinfo.c > > +++ b/sysdeps/x86/cacheinfo.c > > @@ -18,11 +18,8 @@ > > > > #if IS_IN (libc) > > > > -#include > > #include > > -#include > > #include > > -#include > > > > /* Get the value of the system variable NAME. */ > > long int > > @@ -30,20 +27,45 @@ attribute_hidden > > __cache_sysconf (int name) > > { > > const struct cpu_features *cpu_features = __get_cpu_features (); > > + switch (name) > > + { > > + case _SC_LEVEL1_ICACHE_SIZE: > > + return cpu_features->level1_icache_size; > > > > - if (cpu_features->basic.kind == arch_kind_intel) > > - return handle_intel (name, cpu_features); > > + case _SC_LEVEL1_DCACHE_SIZE: > > + return cpu_features->level1_dcache_size; > > > > - if (cpu_features->basic.kind == arch_kind_amd) > > - return handle_amd (name); > > + case _SC_LEVEL1_DCACHE_ASSOC: > > + return cpu_features->level1_dcache_assoc; > > > > - if (cpu_features->basic.kind == arch_kind_zhaoxin) > > - return handle_zhaoxin (name); > > + case _SC_LEVEL1_DCACHE_LINESIZE: > > + return cpu_features->level1_dcache_linesize; > > > > - // XXX Fill in more vendors. > > + case _SC_LEVEL2_CACHE_SIZE: > > + return cpu_features->level2_cache_size; > > > > - /* CPU not known, we have no information. */ > > - return 0; > > + case _SC_LEVEL2_CACHE_ASSOC: > > + return cpu_features->level2_cache_assoc; > > + > > + case _SC_LEVEL2_CACHE_LINESIZE: > > + return cpu_features->level2_cache_linesize; > > + > > + case _SC_LEVEL3_CACHE_SIZE: > > + return cpu_features->level3_cache_size; > > + > > + case _SC_LEVEL3_CACHE_ASSOC: > > + return cpu_features->level3_cache_assoc; > > + > > + case _SC_LEVEL3_CACHE_LINESIZE: > > + return cpu_features->level3_cache_linesize; > > + > > + case _SC_LEVEL4_CACHE_SIZE: > > + return cpu_features->level4_cache_size; > > + > > + default: > > + break; > > + } > > + return -1; > > } > > > > # ifdef SHARED > > Ok, so now it handles _SC_LEVEL1_ICACHE_SIZE <= name < _SC_LEVEL4_CACHE_LINESIZE > and returns -1 otherwise. It align with sysconf interface. > > > diff --git a/sysdeps/x86/cacheinfo.h b/sysdeps/x86/cacheinfo.h > > index 0aec0e2875..5aa40b45b5 100644 > > --- a/sysdeps/x86/cacheinfo.h > > +++ b/sysdeps/x86/cacheinfo.h > > @@ -18,7 +18,16 @@ > > > > #include > > #include > > +#include > > +#include > > > > +#if HAVE_TUNABLES > > +# define TUNABLE_NAMESPACE cpu > > +# include /* Get STDOUT_FILENO for _dl_printf. */ > > +# include > > +#endif > > + > > +#if IS_IN (libc) > > /* Data cache size for use in memory and string routines, typically > > L1 size, rounded to multiple of 256 bytes. */ > > long int __x86_data_cache_size_half attribute_hidden = 32 * 1024 / 2; > > Ok. > > > @@ -45,385 +54,30 @@ long int __x86_rep_movsb_threshold attribute_hidden = 2048; > > /* Threshold to use Enhanced REP STOSB. */ > > long int __x86_rep_stosb_threshold attribute_hidden = 2048; > > > > -static void > > -get_common_cache_info (long int *shared_ptr, unsigned int *threads_ptr, > > - long int core) > > -{ > > - unsigned int eax; > > - unsigned int ebx; > > - unsigned int ecx; > > - unsigned int edx; > > - > > - /* Number of logical processors sharing L2 cache. */ > > - int threads_l2; > > - > > - /* Number of logical processors sharing L3 cache. */ > > - int threads_l3; > > - > > - const struct cpu_features *cpu_features = __get_cpu_features (); > > - int max_cpuid = cpu_features->basic.max_cpuid; > > - unsigned int family = cpu_features->basic.family; > > - unsigned int model = cpu_features->basic.model; > > - long int shared = *shared_ptr; > > - unsigned int threads = *threads_ptr; > > - bool inclusive_cache = true; > > - bool support_count_mask = true; > > - > > - /* Try L3 first. */ > > - unsigned int level = 3; > > - > > - if (cpu_features->basic.kind == arch_kind_zhaoxin && family == 6) > > - support_count_mask = false; > > - > > - if (shared <= 0) > > - { > > - /* Try L2 otherwise. */ > > - level = 2; > > - shared = core; > > - threads_l2 = 0; > > - threads_l3 = -1; > > - } > > - else > > - { > > - threads_l2 = 0; > > - threads_l3 = 0; > > - } > > - > > - /* A value of 0 for the HTT bit indicates there is only a single > > - logical processor. */ > > - if (HAS_CPU_FEATURE (HTT)) > > - { > > - /* Figure out the number of logical threads that share the > > - highest cache level. */ > > - if (max_cpuid >= 4) > > - { > > - int i = 0; > > - > > - /* Query until cache level 2 and 3 are enumerated. */ > > - int check = 0x1 | (threads_l3 == 0) << 1; > > - do > > - { > > - __cpuid_count (4, i++, eax, ebx, ecx, edx); > > - > > - /* There seems to be a bug in at least some Pentium Ds > > - which sometimes fail to iterate all cache parameters. > > - Do not loop indefinitely here, stop in this case and > > - assume there is no such information. */ > > - if (cpu_features->basic.kind == arch_kind_intel > > - && (eax & 0x1f) == 0 ) > > - goto intel_bug_no_cache_info; > > - > > - switch ((eax >> 5) & 0x7) > > - { > > - default: > > - break; > > - case 2: > > - if ((check & 0x1)) > > - { > > - /* Get maximum number of logical processors > > - sharing L2 cache. */ > > - threads_l2 = (eax >> 14) & 0x3ff; > > - check &= ~0x1; > > - } > > - break; > > - case 3: > > - if ((check & (0x1 << 1))) > > - { > > - /* Get maximum number of logical processors > > - sharing L3 cache. */ > > - threads_l3 = (eax >> 14) & 0x3ff; > > - > > - /* Check if L2 and L3 caches are inclusive. */ > > - inclusive_cache = (edx & 0x2) != 0; > > - check &= ~(0x1 << 1); > > - } > > - break; > > - } > > - } > > - while (check); > > - > > - /* If max_cpuid >= 11, THREADS_L2/THREADS_L3 are the maximum > > - numbers of addressable IDs for logical processors sharing > > - the cache, instead of the maximum number of threads > > - sharing the cache. */ > > - if (max_cpuid >= 11 && support_count_mask) > > - { > > - /* Find the number of logical processors shipped in > > - one core and apply count mask. */ > > - i = 0; > > - > > - /* Count SMT only if there is L3 cache. Always count > > - core if there is no L3 cache. */ > > - int count = ((threads_l2 > 0 && level == 3) > > - | ((threads_l3 > 0 > > - || (threads_l2 > 0 && level == 2)) << 1)); > > - > > - while (count) > > - { > > - __cpuid_count (11, i++, eax, ebx, ecx, edx); > > - > > - int shipped = ebx & 0xff; > > - int type = ecx & 0xff00; > > - if (shipped == 0 || type == 0) > > - break; > > - else if (type == 0x100) > > - { > > - /* Count SMT. */ > > - if ((count & 0x1)) > > - { > > - int count_mask; > > - > > - /* Compute count mask. */ > > - asm ("bsr %1, %0" > > - : "=r" (count_mask) : "g" (threads_l2)); > > - count_mask = ~(-1 << (count_mask + 1)); > > - threads_l2 = (shipped - 1) & count_mask; > > - count &= ~0x1; > > - } > > - } > > - else if (type == 0x200) > > - { > > - /* Count core. */ > > - if ((count & (0x1 << 1))) > > - { > > - int count_mask; > > - int threads_core > > - = (level == 2 ? threads_l2 : threads_l3); > > - > > - /* Compute count mask. */ > > - asm ("bsr %1, %0" > > - : "=r" (count_mask) : "g" (threads_core)); > > - count_mask = ~(-1 << (count_mask + 1)); > > - threads_core = (shipped - 1) & count_mask; > > - if (level == 2) > > - threads_l2 = threads_core; > > - else > > - threads_l3 = threads_core; > > - count &= ~(0x1 << 1); > > - } > > - } > > - } > > - } > > - if (threads_l2 > 0) > > - threads_l2 += 1; > > - if (threads_l3 > 0) > > - threads_l3 += 1; > > - if (level == 2) > > - { > > - if (threads_l2) > > - { > > - threads = threads_l2; > > - if (cpu_features->basic.kind == arch_kind_intel > > - && threads > 2 > > - && family == 6) > > - switch (model) > > - { > > - case 0x37: > > - case 0x4a: > > - case 0x4d: > > - case 0x5a: > > - case 0x5d: > > - /* Silvermont has L2 cache shared by 2 cores. */ > > - threads = 2; > > - break; > > - default: > > - break; > > - } > > - } > > - } > > - else if (threads_l3) > > - threads = threads_l3; > > - } > > - else > > - { > > -intel_bug_no_cache_info: > > - /* Assume that all logical threads share the highest cache > > - level. */ > > - threads > > - = ((cpu_features->features[COMMON_CPUID_INDEX_1].cpuid.ebx > > - >> 16) & 0xff); > > - } > > - > > - /* Cap usage of highest cache level to the number of supported > > - threads. */ > > - if (shared > 0 && threads > 0) > > - shared /= threads; > > - } > > - > > - /* Account for non-inclusive L2 and L3 caches. */ > > - if (!inclusive_cache) > > - { > > - if (threads_l2 > 0) > > - core /= threads_l2; > > - shared += core; > > - } > > - > > - *shared_ptr = shared; > > - *threads_ptr = threads; > > -} > > - > > static void > > init_cacheinfo (void) > > { > > - /* Find out what brand of processor. */ > > - unsigned int ebx; > > - unsigned int ecx; > > - unsigned int edx; > > - int max_cpuid_ex; > > - long int data = -1; > > - long int shared = -1; > > - long int core; > > - unsigned int threads = 0; > > const struct cpu_features *cpu_features = __get_cpu_features (); > > + long int data = cpu_features->data_cache_size; > > + __x86_raw_data_cache_size_half = data / 2; > > + __x86_raw_data_cache_size = data; > > + /* Round data cache size to multiple of 256 bytes. */ > > + data = data & ~255L; > > + __x86_data_cache_size_half = data / 2; > > + __x86_data_cache_size = data; > > + > > + long int shared = cpu_features->shared_cache_size; > > + __x86_raw_shared_cache_size_half = shared / 2; > > + __x86_raw_shared_cache_size = shared; > > + /* Round shared cache size to multiple of 256 bytes. */ > > + shared = shared & ~255L; > > + __x86_shared_cache_size_half = shared / 2; > > + __x86_shared_cache_size = shared; > > > > - /* NB: In libc.so, cpu_features is defined in ld.so and is initialized > > - by DL_PLATFORM_INIT or IFUNC relocation before init_cacheinfo is > > - called by IFUNC relocation. In libc.a, init_cacheinfo is called > > - from init_cpu_features by ARCH_INIT_CPU_FEATURES. */ > > - assert (cpu_features->basic.kind != arch_kind_unknown); > > - > > - if (cpu_features->basic.kind == arch_kind_intel) > > - { > > - data = handle_intel (_SC_LEVEL1_DCACHE_SIZE, cpu_features); > > - core = handle_intel (_SC_LEVEL2_CACHE_SIZE, cpu_features); > > - shared = handle_intel (_SC_LEVEL3_CACHE_SIZE, cpu_features); > > - > > - get_common_cache_info (&shared, &threads, core); > > - } > > - else if (cpu_features->basic.kind == arch_kind_zhaoxin) > > - { > > - data = handle_zhaoxin (_SC_LEVEL1_DCACHE_SIZE); > > - core = handle_zhaoxin (_SC_LEVEL2_CACHE_SIZE); > > - shared = handle_zhaoxin (_SC_LEVEL3_CACHE_SIZE); > > - > > - get_common_cache_info (&shared, &threads, core); > > - } > > - else if (cpu_features->basic.kind == arch_kind_amd) > > - { > > - data = handle_amd (_SC_LEVEL1_DCACHE_SIZE); > > - long int core = handle_amd (_SC_LEVEL2_CACHE_SIZE); > > - shared = handle_amd (_SC_LEVEL3_CACHE_SIZE); > > - > > - /* Get maximum extended function. */ > > - __cpuid (0x80000000, max_cpuid_ex, ebx, ecx, edx); > > - > > - if (shared <= 0) > > - /* No shared L3 cache. All we have is the L2 cache. */ > > - shared = core; > > - else > > - { > > - /* Figure out the number of logical threads that share L3. */ > > - if (max_cpuid_ex >= 0x80000008) > > - { > > - /* Get width of APIC ID. */ > > - __cpuid (0x80000008, max_cpuid_ex, ebx, ecx, edx); > > - threads = 1 << ((ecx >> 12) & 0x0f); > > - } > > - > > - if (threads == 0 || cpu_features->basic.family >= 0x17) > > - { > > - /* If APIC ID width is not available, use logical > > - processor count. */ > > - __cpuid (0x00000001, max_cpuid_ex, ebx, ecx, edx); > > - > > - if ((edx & (1 << 28)) != 0) > > - threads = (ebx >> 16) & 0xff; > > - } > > - > > - /* Cap usage of highest cache level to the number of > > - supported threads. */ > > - if (threads > 0) > > - shared /= threads; > > - > > - /* Get shared cache per ccx for Zen architectures. */ > > - if (cpu_features->basic.family >= 0x17) > > - { > > - unsigned int eax; > > - > > - /* Get number of threads share the L3 cache in CCX. */ > > - __cpuid_count (0x8000001D, 0x3, eax, ebx, ecx, edx); > > - > > - unsigned int threads_per_ccx = ((eax >> 14) & 0xfff) + 1; > > - shared *= threads_per_ccx; > > - } > > - else > > - { > > - /* Account for exclusive L2 and L3 caches. */ > > - shared += core; > > - } > > - } > > - } > > - > > - /* Prefer cache size configure via tuning. */ > > - if (cpu_features->data_cache_size != 0) > > - data = cpu_features->data_cache_size; > > - > > - if (data > 0) > > - { > > - __x86_raw_data_cache_size_half = data / 2; > > - __x86_raw_data_cache_size = data; > > - /* Round data cache size to multiple of 256 bytes. */ > > - data = data & ~255L; > > - __x86_data_cache_size_half = data / 2; > > - __x86_data_cache_size = data; > > - } > > - > > - /* Prefer cache size configure via tuning. */ > > - if (cpu_features->shared_cache_size != 0) > > - shared = cpu_features->shared_cache_size; > > - > > - if (shared > 0) > > - { > > - __x86_raw_shared_cache_size_half = shared / 2; > > - __x86_raw_shared_cache_size = shared; > > - /* Round shared cache size to multiple of 256 bytes. */ > > - shared = shared & ~255L; > > - __x86_shared_cache_size_half = shared / 2; > > - __x86_shared_cache_size = shared; > > - } > > - > > - /* The default setting for the non_temporal threshold is 3/4 of one > > - thread's share of the chip's cache. For most Intel and AMD processors > > - with an initial release date between 2017 and 2020, a thread's typical > > - share of the cache is from 500 KBytes to 2 MBytes. Using the 3/4 > > - threshold leaves 125 KBytes to 500 KBytes of the thread's data > > - in cache after a maximum temporal copy, which will maintain > > - in cache a reasonable portion of the thread's stack and other > > - active data. If the threshold is set higher than one thread's > > - share of the cache, it has a substantial risk of negatively > > - impacting the performance of other threads running on the chip. */ > > __x86_shared_non_temporal_threshold > > - = (cpu_features->non_temporal_threshold != 0 > > - ? cpu_features->non_temporal_threshold > > - : __x86_shared_cache_size * 3 / 4); > > - > > - /* NB: The REP MOVSB threshold must be greater than VEC_SIZE * 8. */ > > - unsigned int minimum_rep_movsb_threshold; > > - /* NB: The default REP MOVSB threshold is 2048 * (VEC_SIZE / 16). */ > > - unsigned int rep_movsb_threshold; > > - if (CPU_FEATURE_USABLE_P (cpu_features, AVX512F) > > - && !CPU_FEATURE_PREFERRED_P (cpu_features, Prefer_No_AVX512)) > > - { > > - rep_movsb_threshold = 2048 * (64 / 16); > > - minimum_rep_movsb_threshold = 64 * 8; > > - } > > - else if (CPU_FEATURE_PREFERRED_P (cpu_features, > > - AVX_Fast_Unaligned_Load)) > > - { > > - rep_movsb_threshold = 2048 * (32 / 16); > > - minimum_rep_movsb_threshold = 32 * 8; > > - } > > - else > > - { > > - rep_movsb_threshold = 2048 * (16 / 16); > > - minimum_rep_movsb_threshold = 16 * 8; > > - } > > - if (cpu_features->rep_movsb_threshold > minimum_rep_movsb_threshold) > > - __x86_rep_movsb_threshold = cpu_features->rep_movsb_threshold; > > - else > > - __x86_rep_movsb_threshold = rep_movsb_threshold; > > + = cpu_features->non_temporal_threshold; > > > > -# if HAVE_TUNABLES > > + __x86_rep_movsb_threshold = cpu_features->rep_movsb_threshold; > > __x86_rep_stosb_threshold = cpu_features->rep_stosb_threshold; > > -# endif > > } > > +#endif > > Ok, it is refactoring the code. > > > diff --git a/sysdeps/x86/cpu-features.c b/sysdeps/x86/cpu-features.c > > index f26deba38d..51c12d89ca 100644 > > --- a/sysdeps/x86/cpu-features.c > > +++ b/sysdeps/x86/cpu-features.c > > @@ -16,21 +16,12 @@ > > License along with the GNU C Library; if not, see > > . */ > > > > -#include > > #include > > #include > > -#if IS_IN (libc) && !defined SHARED > > -# include > > -# include > > -# include > > -# include > > -#endif > > +#include > > +#include > > > > #if HAVE_TUNABLES > > -# define TUNABLE_NAMESPACE cpu > > -# include /* Get STDOUT_FILENO for _dl_printf. */ > > -# include > > - > > extern void TUNABLE_CALLBACK (set_hwcaps) (tunable_val_t *) > > attribute_hidden; > > > > Ok. > > > @@ -642,24 +633,14 @@ no_cpuid: > > cpu_features->basic.model = model; > > cpu_features->basic.stepping = stepping; > > > > + dl_init_cacheinfo (cpu_features); > > + > > #if HAVE_TUNABLES > > TUNABLE_GET (hwcaps, tunable_val_t *, TUNABLE_CALLBACK (set_hwcaps)); > > - cpu_features->non_temporal_threshold > > - = TUNABLE_GET (x86_non_temporal_threshold, long int, NULL); > > - cpu_features->rep_movsb_threshold > > - = TUNABLE_GET (x86_rep_movsb_threshold, long int, NULL); > > - cpu_features->rep_stosb_threshold > > - = TUNABLE_GET (x86_rep_stosb_threshold, long int, NULL); > > - cpu_features->data_cache_size > > - = TUNABLE_GET (x86_data_cache_size, long int, NULL); > > - cpu_features->shared_cache_size > > - = TUNABLE_GET (x86_shared_cache_size, long int, NULL); > > -#endif > > - > > - /* Reuse dl_platform, dl_hwcap and dl_hwcap_mask for x86. */ > > -#if !HAVE_TUNABLES && defined SHARED > > - /* The glibc.cpu.hwcap_mask tunable is initialized already, so no need to do > > - this. */ > > +#elif defined SHARED > > + /* Reuse dl_platform, dl_hwcap and dl_hwcap_mask for x86. The > > + glibc.cpu.hwcap_mask tunable is initialized already, so no > > + need to do this. */ > > GLRO(dl_hwcap_mask) = HWCAP_IMPORTANT; > > #endif > > > > Ok. > > > diff --git a/sysdeps/x86/dl-cacheinfo.h b/sysdeps/x86/dl-cacheinfo.h > > index b2b90074b0..9632ee7818 100644 > > --- a/sysdeps/x86/dl-cacheinfo.h > > +++ b/sysdeps/x86/dl-cacheinfo.h > > @@ -476,3 +476,463 @@ handle_zhaoxin (int name) > > /* Nothing found. */ > > return 0; > > } > > + > > +static void > > +get_common_cache_info (long int *shared_ptr, unsigned int *threads_ptr, > > + long int core) > > +{ > > + unsigned int eax; > > + unsigned int ebx; > > + unsigned int ecx; > > + unsigned int edx; > > + > > + /* Number of logical processors sharing L2 cache. */ > > + int threads_l2; > > + > > + /* Number of logical processors sharing L3 cache. */ > > + int threads_l3; > > + > > + const struct cpu_features *cpu_features = __get_cpu_features (); > > + int max_cpuid = cpu_features->basic.max_cpuid; > > + unsigned int family = cpu_features->basic.family; > > + unsigned int model = cpu_features->basic.model; > > + long int shared = *shared_ptr; > > + unsigned int threads = *threads_ptr; > > + bool inclusive_cache = true; > > + bool support_count_mask = true; > > + > > + /* Try L3 first. */ > > + unsigned int level = 3; > > + > > + if (cpu_features->basic.kind == arch_kind_zhaoxin && family == 6) > > + support_count_mask = false; > > + > > + if (shared <= 0) > > + { > > + /* Try L2 otherwise. */ > > + level = 2; > > + shared = core; > > + threads_l2 = 0; > > + threads_l3 = -1; > > + } > > + else > > + { > > + threads_l2 = 0; > > + threads_l3 = 0; > > + } > > + > > + /* A value of 0 for the HTT bit indicates there is only a single > > + logical processor. */ > > + if (HAS_CPU_FEATURE (HTT)) > > + { > > + /* Figure out the number of logical threads that share the > > + highest cache level. */ > > + if (max_cpuid >= 4) > > + { > > + int i = 0; > > + > > + /* Query until cache level 2 and 3 are enumerated. */ > > + int check = 0x1 | (threads_l3 == 0) << 1; > > + do > > + { > > + __cpuid_count (4, i++, eax, ebx, ecx, edx); > > + > > + /* There seems to be a bug in at least some Pentium Ds > > + which sometimes fail to iterate all cache parameters. > > + Do not loop indefinitely here, stop in this case and > > + assume there is no such information. */ > > + if (cpu_features->basic.kind == arch_kind_intel > > + && (eax & 0x1f) == 0 ) > > + goto intel_bug_no_cache_info; > > + > > + switch ((eax >> 5) & 0x7) > > + { > > + default: > > + break; > > + case 2: > > + if ((check & 0x1)) > > + { > > + /* Get maximum number of logical processors > > + sharing L2 cache. */ > > + threads_l2 = (eax >> 14) & 0x3ff; > > + check &= ~0x1; > > + } > > + break; > > + case 3: > > + if ((check & (0x1 << 1))) > > + { > > + /* Get maximum number of logical processors > > + sharing L3 cache. */ > > + threads_l3 = (eax >> 14) & 0x3ff; > > + > > + /* Check if L2 and L3 caches are inclusive. */ > > + inclusive_cache = (edx & 0x2) != 0; > > + check &= ~(0x1 << 1); > > + } > > + break; > > + } > > + } > > + while (check); > > + > > + /* If max_cpuid >= 11, THREADS_L2/THREADS_L3 are the maximum > > + numbers of addressable IDs for logical processors sharing > > + the cache, instead of the maximum number of threads > > + sharing the cache. */ > > + if (max_cpuid >= 11 && support_count_mask) > > + { > > + /* Find the number of logical processors shipped in > > + one core and apply count mask. */ > > + i = 0; > > + > > + /* Count SMT only if there is L3 cache. Always count > > + core if there is no L3 cache. */ > > + int count = ((threads_l2 > 0 && level == 3) > > + | ((threads_l3 > 0 > > + || (threads_l2 > 0 && level == 2)) << 1)); > > + > > + while (count) > > + { > > + __cpuid_count (11, i++, eax, ebx, ecx, edx); > > + > > + int shipped = ebx & 0xff; > > + int type = ecx & 0xff00; > > + if (shipped == 0 || type == 0) > > + break; > > + else if (type == 0x100) > > + { > > + /* Count SMT. */ > > + if ((count & 0x1)) > > + { > > + int count_mask; > > + > > + /* Compute count mask. */ > > + asm ("bsr %1, %0" > > + : "=r" (count_mask) : "g" (threads_l2)); > > + count_mask = ~(-1 << (count_mask + 1)); > > + threads_l2 = (shipped - 1) & count_mask; > > + count &= ~0x1; > > + } > > + } > > + else if (type == 0x200) > > + { > > + /* Count core. */ > > + if ((count & (0x1 << 1))) > > + { > > + int count_mask; > > + int threads_core > > + = (level == 2 ? threads_l2 : threads_l3); > > + > > + /* Compute count mask. */ > > + asm ("bsr %1, %0" > > + : "=r" (count_mask) : "g" (threads_core)); > > + count_mask = ~(-1 << (count_mask + 1)); > > + threads_core = (shipped - 1) & count_mask; > > + if (level == 2) > > + threads_l2 = threads_core; > > + else > > + threads_l3 = threads_core; > > + count &= ~(0x1 << 1); > > + } > > + } > > + } > > + } > > + if (threads_l2 > 0) > > + threads_l2 += 1; > > + if (threads_l3 > 0) > > + threads_l3 += 1; > > + if (level == 2) > > + { > > + if (threads_l2) > > + { > > + threads = threads_l2; > > + if (cpu_features->basic.kind == arch_kind_intel > > + && threads > 2 > > + && family == 6) > > + switch (model) > > + { > > + case 0x37: > > + case 0x4a: > > + case 0x4d: > > + case 0x5a: > > + case 0x5d: > > + /* Silvermont has L2 cache shared by 2 cores. */ > > + threads = 2; > > + break; > > + default: > > + break; > > + } > > + } > > + } > > + else if (threads_l3) > > + threads = threads_l3; > > + } > > + else > > + { > > +intel_bug_no_cache_info: > > + /* Assume that all logical threads share the highest cache > > + level. */ > > + threads > > + = ((cpu_features->features[COMMON_CPUID_INDEX_1].cpuid.ebx > > + >> 16) & 0xff); > > + } > > + > > + /* Cap usage of highest cache level to the number of supported > > + threads. */ > > + if (shared > 0 && threads > 0) > > + shared /= threads; > > + } > > + > > + /* Account for non-inclusive L2 and L3 caches. */ > > + if (!inclusive_cache) > > + { > > + if (threads_l2 > 0) > > + core /= threads_l2; > > + shared += core; > > + } > > + > > + *shared_ptr = shared; > > + *threads_ptr = threads; > > +} > > + > > Ok, so this is function moved from sysdeps/x86/cacheinfo.h. > > > +static void > > +dl_init_cacheinfo (struct cpu_features *cpu_features) > > +{ > > + /* Find out what brand of processor. */ > > + unsigned int ebx; > > + unsigned int ecx; > > + unsigned int edx; > > + int max_cpuid_ex; > > + long int data = -1; > > + long int shared = -1; > > + long int core; > > + unsigned int threads = 0; > > + unsigned long int level1_icache_size = -1; > > + unsigned long int level1_dcache_size = -1; > > + unsigned long int level1_dcache_assoc = -1; > > + unsigned long int level1_dcache_linesize = -1; > > + unsigned long int level2_cache_size = -1; > > + unsigned long int level2_cache_assoc = -1; > > + unsigned long int level2_cache_linesize = -1; > > + unsigned long int level3_cache_size = -1; > > + unsigned long int level3_cache_assoc = -1; > > + unsigned long int level3_cache_linesize = -1; > > + unsigned long int level4_cache_size = -1; > > + > > + if (cpu_features->basic.kind == arch_kind_intel) > > + { > > + data = handle_intel (_SC_LEVEL1_DCACHE_SIZE, cpu_features); > > + core = handle_intel (_SC_LEVEL2_CACHE_SIZE, cpu_features); > > + shared = handle_intel (_SC_LEVEL3_CACHE_SIZE, cpu_features); > > + > > + level1_icache_size > > + = handle_intel (_SC_LEVEL1_ICACHE_SIZE, cpu_features); > > + level1_dcache_size = data; > > + level1_dcache_assoc > > + = handle_intel (_SC_LEVEL1_DCACHE_ASSOC, cpu_features); > > + level1_dcache_linesize > > + = handle_intel (_SC_LEVEL1_DCACHE_LINESIZE, cpu_features); > > + level2_cache_size = core; > > + level2_cache_assoc > > + = handle_intel (_SC_LEVEL2_CACHE_ASSOC, cpu_features); > > + level2_cache_linesize > > + = handle_intel (_SC_LEVEL2_CACHE_LINESIZE, cpu_features); > > + level3_cache_size = shared; > > + level3_cache_assoc > > + = handle_intel (_SC_LEVEL3_CACHE_ASSOC, cpu_features); > > + level3_cache_linesize > > + = handle_intel (_SC_LEVEL3_CACHE_LINESIZE, cpu_features); > > + level4_cache_size > > + = handle_intel (_SC_LEVEL4_CACHE_SIZE, cpu_features); > > + > > + get_common_cache_info (&shared, &threads, core); > > + } > > + else if (cpu_features->basic.kind == arch_kind_zhaoxin) > > + { > > + data = handle_zhaoxin (_SC_LEVEL1_DCACHE_SIZE); > > + core = handle_zhaoxin (_SC_LEVEL2_CACHE_SIZE); > > + shared = handle_zhaoxin (_SC_LEVEL3_CACHE_SIZE); > > + > > + level1_icache_size = handle_zhaoxin (_SC_LEVEL1_ICACHE_SIZE); > > + level1_dcache_size = data; > > + level1_dcache_assoc = handle_zhaoxin (_SC_LEVEL1_DCACHE_ASSOC); > > + level1_dcache_linesize = handle_zhaoxin (_SC_LEVEL1_DCACHE_LINESIZE); > > + level2_cache_size = core; > > + level2_cache_assoc = handle_zhaoxin (_SC_LEVEL2_CACHE_ASSOC); > > + level2_cache_linesize = handle_zhaoxin (_SC_LEVEL2_CACHE_LINESIZE); > > + level3_cache_size = shared; > > + level3_cache_assoc = handle_zhaoxin (_SC_LEVEL3_CACHE_ASSOC); > > + level3_cache_linesize = handle_zhaoxin (_SC_LEVEL3_CACHE_LINESIZE); > > + > > + get_common_cache_info (&shared, &threads, core); > > + } > > + else if (cpu_features->basic.kind == arch_kind_amd) > > + { > > + data = handle_amd (_SC_LEVEL1_DCACHE_SIZE); > > + core = handle_amd (_SC_LEVEL2_CACHE_SIZE); > > + shared = handle_amd (_SC_LEVEL3_CACHE_SIZE); > > + > > + level1_icache_size = handle_amd (_SC_LEVEL1_ICACHE_SIZE); > > + level1_dcache_size = data; > > + level1_dcache_assoc = handle_amd (_SC_LEVEL1_DCACHE_ASSOC); > > + level1_dcache_linesize = handle_amd (_SC_LEVEL1_DCACHE_LINESIZE); > > + level2_cache_size = core; > > + level2_cache_assoc = handle_amd (_SC_LEVEL2_CACHE_ASSOC); > > + level2_cache_linesize = handle_amd (_SC_LEVEL2_CACHE_LINESIZE); > > + level3_cache_size = shared; > > + level3_cache_assoc = handle_amd (_SC_LEVEL3_CACHE_ASSOC); > > + level3_cache_linesize = handle_amd (_SC_LEVEL3_CACHE_LINESIZE); > > + > > + /* Get maximum extended function. */ > > + __cpuid (0x80000000, max_cpuid_ex, ebx, ecx, edx); > > + > > + if (shared <= 0) > > + /* No shared L3 cache. All we have is the L2 cache. */ > > + shared = core; > > + else > > + { > > + /* Figure out the number of logical threads that share L3. */ > > + if (max_cpuid_ex >= 0x80000008) > > + { > > + /* Get width of APIC ID. */ > > + __cpuid (0x80000008, max_cpuid_ex, ebx, ecx, edx); > > + threads = 1 << ((ecx >> 12) & 0x0f); > > + } > > + > > + if (threads == 0 || cpu_features->basic.family >= 0x17) > > + { > > + /* If APIC ID width is not available, use logical > > + processor count. */ > > + __cpuid (0x00000001, max_cpuid_ex, ebx, ecx, edx); > > + > > + if ((edx & (1 << 28)) != 0) > > + threads = (ebx >> 16) & 0xff; > > + } > > + > > + /* Cap usage of highest cache level to the number of > > + supported threads. */ > > + if (threads > 0) > > + shared /= threads; > > + > > + /* Get shared cache per ccx for Zen architectures. */ > > + if (cpu_features->basic.family >= 0x17) > > + { > > + unsigned int eax; > > + > > + /* Get number of threads share the L3 cache in CCX. */ > > + __cpuid_count (0x8000001D, 0x3, eax, ebx, ecx, edx); > > + > > + unsigned int threads_per_ccx = ((eax >> 14) & 0xfff) + 1; > > + shared *= threads_per_ccx; > > + } > > + else > > + { > > + /* Account for exclusive L2 and L3 caches. */ > > + shared += core; > > + } > > + } > > + } > > + > > + cpu_features->level1_icache_size = level1_icache_size; > > + cpu_features->level1_dcache_size = level1_dcache_size; > > + cpu_features->level1_dcache_assoc = level1_dcache_assoc; > > + cpu_features->level1_dcache_linesize = level1_dcache_linesize; > > + cpu_features->level2_cache_size = level2_cache_size; > > + cpu_features->level2_cache_assoc = level2_cache_assoc; > > + cpu_features->level2_cache_linesize = level2_cache_linesize; > > + cpu_features->level3_cache_size = level3_cache_size; > > + cpu_features->level3_cache_assoc = level3_cache_assoc; > > + cpu_features->level3_cache_linesize = level3_cache_linesize; > > + cpu_features->level4_cache_size = level4_cache_size; > > Ok, so you are expanding the definitions by family. > > > + > > + /* The default setting for the non_temporal threshold is 3/4 of one > > + thread's share of the chip's cache. For most Intel and AMD processors > > + with an initial release date between 2017 and 2020, a thread's typical > > + share of the cache is from 500 KBytes to 2 MBytes. Using the 3/4 > > + threshold leaves 125 KBytes to 500 KBytes of the thread's data > > + in cache after a maximum temporal copy, which will maintain > > + in cache a reasonable portion of the thread's stack and other > > + active data. If the threshold is set higher than one thread's > > + share of the cache, it has a substantial risk of negatively > > + impacting the performance of other threads running on the chip. */ > > + unsigned long int non_temporal_threshold = shared * 3 / 4; > > + > > +#if HAVE_TUNABLES > > + /* NB: The REP MOVSB threshold must be greater than VEC_SIZE * 8. */ > > + unsigned int minimum_rep_movsb_threshold; > > +#endif > > + /* NB: The default REP MOVSB threshold is 2048 * (VEC_SIZE / 16). */ > > + unsigned int rep_movsb_threshold; > > + if (CPU_FEATURE_USABLE_P (cpu_features, AVX512F) > > + && !CPU_FEATURE_PREFERRED_P (cpu_features, Prefer_No_AVX512)) > > + { > > + rep_movsb_threshold = 2048 * (64 / 16); > > +#if HAVE_TUNABLES > > + minimum_rep_movsb_threshold = 64 * 8; > > +#endif > > + } > > + else if (CPU_FEATURE_PREFERRED_P (cpu_features, > > + AVX_Fast_Unaligned_Load)) > > + { > > + rep_movsb_threshold = 2048 * (32 / 16); > > +#if HAVE_TUNABLES > > + minimum_rep_movsb_threshold = 32 * 8; > > +#endif > > + } > > + else > > + { > > + rep_movsb_threshold = 2048 * (16 / 16); > > +#if HAVE_TUNABLES > > + minimum_rep_movsb_threshold = 16 * 8; > > +#endif > > + } > > + > > + /* The default threshold to use Enhanced REP STOSB. */ > > + unsigned long int rep_stosb_threshold = 2048; > > + > > Ok. > > > +#if HAVE_TUNABLES > > + long int tunable_size; > > + > > + tunable_size = TUNABLE_GET (x86_data_cache_size, long int, NULL); > > + /* NB: Ignore the default value 0. */ > > + if (tunable_size) > > No implicit checks, same as the others below. Fixed. > > + data = tunable_size; > > + > > + tunable_size = TUNABLE_GET (x86_shared_cache_size, long int, NULL); > > + /* NB: Ignore the default value 0. */ > > + if (tunable_size) Fixed. > > + shared = tunable_size; > > + > > + tunable_size = TUNABLE_GET (x86_non_temporal_threshold, long int, NULL); > > + /* NB: Ignore the default value 0. */ > > + if (tunable_size) Fixed. > > + non_temporal_threshold = tunable_size; > > + > > + tunable_size = TUNABLE_GET (x86_rep_movsb_threshold, long int, NULL); > > + if (tunable_size > minimum_rep_movsb_threshold) > > + rep_movsb_threshold = tunable_size; > > + > > + /* NB: The default value of the x86_rep_stosb_threshold tunable is the > > + same as the default value of __x86_rep_stosb_threshold and the > > + minimum value is fixed. */ > > + rep_stosb_threshold = TUNABLE_GET (x86_rep_stosb_threshold, > > + long int, NULL); > > + > > + TUNABLE_SET_WITH_BOUNDS (x86_data_cache_size, long int, data, > > + 0, (long int) -1); > > + TUNABLE_SET_WITH_BOUNDS (x86_shared_cache_size, long int, shared, > > + 0, (long int) -1); > > + TUNABLE_SET_WITH_BOUNDS (x86_non_temporal_threshold, long int, > > + non_temporal_threshold, 0, (long int) -1); > > + TUNABLE_SET_WITH_BOUNDS (x86_rep_movsb_threshold, long int, > > + rep_movsb_threshold, > > + minimum_rep_movsb_threshold, (long int) -1); > > + TUNABLE_SET_WITH_BOUNDS (x86_rep_stosb_threshold, long int, > > + rep_stosb_threshold, 1, (long int) -1); > > +#endif > > Ok. Are the bounds ok for the architecture? The bounds are OK since they are derived from CPUID. > > + > > + cpu_features->data_cache_size = data; > > + cpu_features->shared_cache_size = shared; > > + cpu_features->non_temporal_threshold = non_temporal_threshold; > > + cpu_features->rep_movsb_threshold = rep_movsb_threshold; > > + cpu_features->rep_stosb_threshold = rep_stosb_threshold; > > +} > > Ok. > > > diff --git a/sysdeps/x86/include/cpu-features.h b/sysdeps/x86/include/cpu-features.h > > index f62be0b9b3..3f3bd93320 100644 > > --- a/sysdeps/x86/include/cpu-features.h > > +++ b/sysdeps/x86/include/cpu-features.h > > @@ -153,6 +153,28 @@ struct cpu_features > > unsigned long int rep_movsb_threshold; > > /* Threshold to use "rep stosb". */ > > unsigned long int rep_stosb_threshold; > > + /* _SC_LEVEL1_ICACHE_SIZE. */ > > + unsigned long int level1_icache_size; > > + /* _SC_LEVEL1_DCACHE_SIZE. */ > > + unsigned long int level1_dcache_size; > > + /* _SC_LEVEL1_DCACHE_ASSOC. */ > > + unsigned long int level1_dcache_assoc; > > + /* _SC_LEVEL1_DCACHE_LINESIZE. */ > > + unsigned long int level1_dcache_linesize; > > + /* _SC_LEVEL2_CACHE_ASSOC. */ > > + unsigned long int level2_cache_size; > > + /* _SC_LEVEL2_DCACHE_ASSOC. */ > > + unsigned long int level2_cache_assoc; > > + /* _SC_LEVEL2_CACHE_LINESIZE. */ > > + unsigned long int level2_cache_linesize; > > + /* /_SC_LEVEL3_CACHE_SIZE. */ > > + unsigned long int level3_cache_size; > > + /* _SC_LEVEL3_CACHE_ASSOC. */ > > + unsigned long int level3_cache_assoc; > > + /* _SC_LEVEL3_CACHE_LINESIZE. */ > > + unsigned long int level3_cache_linesize; > > + /* /_SC_LEVEL4_CACHE_SIZE. */ > > + unsigned long int level4_cache_size; > > }; > > > > # if defined (_LIBC) && !IS_IN (nonlib) > > > > Ok. Here is the updated patch I am checking in. Thanks. -- H.J. --000000000000ecdb9d05b8e1430b Content-Type: text/x-patch; charset="US-ASCII"; name="0001-x86-Move-x86-processor-cache-info-to-cpu_features.patch" Content-Disposition: attachment; filename="0001-x86-Move-x86-processor-cache-info-to-cpu_features.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_kjx8sikn0 RnJvbSBlYmVmNTlhZTZmMTA0ZmQwYzhiODMyYTdmNTYxMzZkMzlmYjRlOWUzIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiAiSC5KLiBMdSIgPGhqbC50b29sc0BnbWFpbC5jb20+CkRhdGU6 IEZyaSwgMTggU2VwIDIwMjAgMDc6NTU6MTQgLTA3MDAKU3ViamVjdDogW1BBVENIXSB4ODY6IE1v dmUgeDg2IHByb2Nlc3NvciBjYWNoZSBpbmZvIHRvIGNwdV9mZWF0dXJlcwoKMS4gTW92ZSB4ODYg cHJvY2Vzc29yIGNhY2hlIGluZm8gdG8gX2RsX3g4Nl9jcHVfZmVhdHVyZXMgaW4gbGQuc28uCjIu IFVwZGF0ZSB0dW5hYmxlIGJvdW5kcyB3aXRoIFRVTkFCTEVfU0VUX1dJVEhfQk9VTkRTLgozLiBN b3ZlIHg4NiBjYWNoZSBpbmZvIGluaXRpYWxpemF0aW9uIHRvIGRsLWNhY2hlaW5mby5oIGFuZCBp bml0aWFsaXplCng4NiBjYWNoZSBpbmZvIGluIGluaXRfY3B1X2ZlYXR1cmVzICgpLgo0LiBQdXQg eDg2IGNhY2hlIGluZm8gZm9yIGxpYmMgaW4gY2FjaGVpbmZvLmgsIHdoaWNoIGlzIGluY2x1ZGVk IGluCmxpYmMtc3RhcnQuYyBpbiBsaWJjLmEgYW5kIGlzIGluY2x1ZGVkIGluIGNhY2hlaW5mby5j IGluIGxpYmMuc28uCgpSZXZpZXdlZC1ieTogQWRoZW1lcnZhbCBaYW5lbGxhICA8YWRoZW1lcnZh bC56YW5lbGxhQGxpbmFyby5vcmc+Ci0tLQogc3lzZGVwcy94ODYvY2FjaGVpbmZvLmMgICAgICAg ICAgICB8ICA0NiArKy0KIHN5c2RlcHMveDg2L2NhY2hlaW5mby5oICAgICAgICAgICAgfCA0MDAg KystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogc3lzZGVwcy94ODYvY3B1LWZlYXR1cmVzLmMgICAg ICAgICB8ICAzNSArLS0KIHN5c2RlcHMveDg2L2RsLWNhY2hlaW5mby5oICAgICAgICAgfCA0NjAg KysrKysrKysrKysrKysrKysrKysrKysrKysrKysKIHN5c2RlcHMveDg2L2luY2x1ZGUvY3B1LWZl YXR1cmVzLmggfCAgMjIgKysKIDUgZmlsZXMgY2hhbmdlZCwgNTUxIGluc2VydGlvbnMoKyksIDQx MiBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9zeXNkZXBzL3g4Ni9jYWNoZWluZm8uYyBiL3N5 c2RlcHMveDg2L2NhY2hlaW5mby5jCmluZGV4IGVkNGUxYTViNTguLjM1MGNiYTVmZGEgMTAwNjQ0 Ci0tLSBhL3N5c2RlcHMveDg2L2NhY2hlaW5mby5jCisrKyBiL3N5c2RlcHMveDg2L2NhY2hlaW5m by5jCkBAIC0xOCwxMSArMTgsOCBAQAogCiAjaWYgSVNfSU4gKGxpYmMpCiAKLSNpbmNsdWRlIDxh c3NlcnQuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxjcHVpZC5oPgogI2luY2x1 ZGUgPGxkc29kZWZzLmg+Ci0jaW5jbHVkZSA8ZGwtY2FjaGVpbmZvLmg+CiAKIC8qIEdldCB0aGUg dmFsdWUgb2YgdGhlIHN5c3RlbSB2YXJpYWJsZSBOQU1FLiAgKi8KIGxvbmcgaW50CkBAIC0zMCwy MCArMjcsNDUgQEAgYXR0cmlidXRlX2hpZGRlbgogX19jYWNoZV9zeXNjb25mIChpbnQgbmFtZSkK IHsKICAgY29uc3Qgc3RydWN0IGNwdV9mZWF0dXJlcyAqY3B1X2ZlYXR1cmVzID0gX19nZXRfY3B1 X2ZlYXR1cmVzICgpOworICBzd2l0Y2ggKG5hbWUpCisgICAgeworICAgIGNhc2UgX1NDX0xFVkVM MV9JQ0FDSEVfU0laRToKKyAgICAgIHJldHVybiBjcHVfZmVhdHVyZXMtPmxldmVsMV9pY2FjaGVf c2l6ZTsKIAotICBpZiAoY3B1X2ZlYXR1cmVzLT5iYXNpYy5raW5kID09IGFyY2hfa2luZF9pbnRl bCkKLSAgICByZXR1cm4gaGFuZGxlX2ludGVsIChuYW1lLCBjcHVfZmVhdHVyZXMpOworICAgIGNh c2UgX1NDX0xFVkVMMV9EQ0FDSEVfU0laRToKKyAgICAgIHJldHVybiBjcHVfZmVhdHVyZXMtPmxl dmVsMV9kY2FjaGVfc2l6ZTsKIAotICBpZiAoY3B1X2ZlYXR1cmVzLT5iYXNpYy5raW5kID09IGFy Y2hfa2luZF9hbWQpCi0gICAgcmV0dXJuIGhhbmRsZV9hbWQgKG5hbWUpOworICAgIGNhc2UgX1ND X0xFVkVMMV9EQ0FDSEVfQVNTT0M6CisgICAgICByZXR1cm4gY3B1X2ZlYXR1cmVzLT5sZXZlbDFf ZGNhY2hlX2Fzc29jOwogCi0gIGlmIChjcHVfZmVhdHVyZXMtPmJhc2ljLmtpbmQgPT0gYXJjaF9r aW5kX3poYW94aW4pCi0gICAgcmV0dXJuIGhhbmRsZV96aGFveGluIChuYW1lKTsKKyAgICBjYXNl IF9TQ19MRVZFTDFfRENBQ0hFX0xJTkVTSVpFOgorICAgICAgcmV0dXJuIGNwdV9mZWF0dXJlcy0+ bGV2ZWwxX2RjYWNoZV9saW5lc2l6ZTsKIAotICAvLyBYWFggRmlsbCBpbiBtb3JlIHZlbmRvcnMu CisgICAgY2FzZSBfU0NfTEVWRUwyX0NBQ0hFX1NJWkU6CisgICAgICByZXR1cm4gY3B1X2ZlYXR1 cmVzLT5sZXZlbDJfY2FjaGVfc2l6ZTsKIAotICAvKiBDUFUgbm90IGtub3duLCB3ZSBoYXZlIG5v IGluZm9ybWF0aW9uLiAgKi8KLSAgcmV0dXJuIDA7CisgICAgY2FzZSBfU0NfTEVWRUwyX0NBQ0hF X0FTU09DOgorICAgICAgcmV0dXJuIGNwdV9mZWF0dXJlcy0+bGV2ZWwyX2NhY2hlX2Fzc29jOwor CisgICAgY2FzZSBfU0NfTEVWRUwyX0NBQ0hFX0xJTkVTSVpFOgorICAgICAgcmV0dXJuIGNwdV9m ZWF0dXJlcy0+bGV2ZWwyX2NhY2hlX2xpbmVzaXplOworCisgICAgY2FzZSBfU0NfTEVWRUwzX0NB Q0hFX1NJWkU6CisgICAgICByZXR1cm4gY3B1X2ZlYXR1cmVzLT5sZXZlbDNfY2FjaGVfc2l6ZTsK KworICAgIGNhc2UgX1NDX0xFVkVMM19DQUNIRV9BU1NPQzoKKyAgICAgIHJldHVybiBjcHVfZmVh dHVyZXMtPmxldmVsM19jYWNoZV9hc3NvYzsKKworICAgIGNhc2UgX1NDX0xFVkVMM19DQUNIRV9M SU5FU0laRToKKyAgICAgIHJldHVybiBjcHVfZmVhdHVyZXMtPmxldmVsM19jYWNoZV9saW5lc2l6 ZTsKKworICAgIGNhc2UgX1NDX0xFVkVMNF9DQUNIRV9TSVpFOgorICAgICAgcmV0dXJuIGNwdV9m ZWF0dXJlcy0+bGV2ZWw0X2NhY2hlX3NpemU7CisKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7 CisgICAgfQorICByZXR1cm4gLTE7CiB9CiAKICMgaWZkZWYgU0hBUkVECmRpZmYgLS1naXQgYS9z eXNkZXBzL3g4Ni9jYWNoZWluZm8uaCBiL3N5c2RlcHMveDg2L2NhY2hlaW5mby5oCmluZGV4IDAw ZDJkOGE1MmEuLjY4YzI1MzU0MmYgMTAwNjQ0Ci0tLSBhL3N5c2RlcHMveDg2L2NhY2hlaW5mby5o CisrKyBiL3N5c2RlcHMveDg2L2NhY2hlaW5mby5oCkBAIC0xOCw3ICsxOCwxNiBAQAogCiAjaW5j bHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8Y3B1aWQuaD4K KyNpbmNsdWRlIDxjcHUtZmVhdHVyZXMuaD4KIAorI2lmIEhBVkVfVFVOQUJMRVMKKyMgZGVmaW5l IFRVTkFCTEVfTkFNRVNQQUNFIGNwdQorIyBpbmNsdWRlIDx1bmlzdGQuaD4JCS8qIEdldCBTVERP VVRfRklMRU5PIGZvciBfZGxfcHJpbnRmLiAgKi8KKyMgaW5jbHVkZSA8ZWxmL2RsLXR1bmFibGVz Lmg+CisjZW5kaWYKKworI2lmIElTX0lOIChsaWJjKQogLyogRGF0YSBjYWNoZSBzaXplIGZvciB1 c2UgaW4gbWVtb3J5IGFuZCBzdHJpbmcgcm91dGluZXMsIHR5cGljYWxseQogICAgTDEgc2l6ZSwg cm91bmRlZCB0byBtdWx0aXBsZSBvZiAyNTYgYnl0ZXMuICAqLwogbG9uZyBpbnQgX194ODZfZGF0 YV9jYWNoZV9zaXplX2hhbGYgYXR0cmlidXRlX2hpZGRlbiA9IDMyICogMTAyNCAvIDI7CkBAIC00 NSwzODUgKzU0LDMwIEBAIGxvbmcgaW50IF9feDg2X3JlcF9tb3ZzYl90aHJlc2hvbGQgYXR0cmli dXRlX2hpZGRlbiA9IDIwNDg7CiAvKiBUaHJlc2hvbGQgdG8gdXNlIEVuaGFuY2VkIFJFUCBTVE9T Qi4gICovCiBsb25nIGludCBfX3g4Nl9yZXBfc3Rvc2JfdGhyZXNob2xkIGF0dHJpYnV0ZV9oaWRk ZW4gPSAyMDQ4OwogCi1zdGF0aWMgdm9pZAotZ2V0X2NvbW1vbl9jYWNoZV9pbmZvIChsb25nIGlu dCAqc2hhcmVkX3B0ciwgdW5zaWduZWQgaW50ICp0aHJlYWRzX3B0ciwKLQkJICAgICAgIGxvbmcg aW50IGNvcmUpCi17Ci0gIHVuc2lnbmVkIGludCBlYXg7Ci0gIHVuc2lnbmVkIGludCBlYng7Ci0g IHVuc2lnbmVkIGludCBlY3g7Ci0gIHVuc2lnbmVkIGludCBlZHg7Ci0KLSAgLyogTnVtYmVyIG9m IGxvZ2ljYWwgcHJvY2Vzc29ycyBzaGFyaW5nIEwyIGNhY2hlLiAgKi8KLSAgaW50IHRocmVhZHNf bDI7Ci0KLSAgLyogTnVtYmVyIG9mIGxvZ2ljYWwgcHJvY2Vzc29ycyBzaGFyaW5nIEwzIGNhY2hl LiAgKi8KLSAgaW50IHRocmVhZHNfbDM7Ci0KLSAgY29uc3Qgc3RydWN0IGNwdV9mZWF0dXJlcyAq Y3B1X2ZlYXR1cmVzID0gX19nZXRfY3B1X2ZlYXR1cmVzICgpOwotICBpbnQgbWF4X2NwdWlkID0g Y3B1X2ZlYXR1cmVzLT5iYXNpYy5tYXhfY3B1aWQ7Ci0gIHVuc2lnbmVkIGludCBmYW1pbHkgPSBj cHVfZmVhdHVyZXMtPmJhc2ljLmZhbWlseTsKLSAgdW5zaWduZWQgaW50IG1vZGVsID0gY3B1X2Zl YXR1cmVzLT5iYXNpYy5tb2RlbDsKLSAgbG9uZyBpbnQgc2hhcmVkID0gKnNoYXJlZF9wdHI7Ci0g IHVuc2lnbmVkIGludCB0aHJlYWRzID0gKnRocmVhZHNfcHRyOwotICBib29sIGluY2x1c2l2ZV9j YWNoZSA9IHRydWU7Ci0gIGJvb2wgc3VwcG9ydF9jb3VudF9tYXNrID0gdHJ1ZTsKLQotICAvKiBU cnkgTDMgZmlyc3QuICAqLwotICB1bnNpZ25lZCBpbnQgbGV2ZWwgPSAzOwotCi0gIGlmIChjcHVf ZmVhdHVyZXMtPmJhc2ljLmtpbmQgPT0gYXJjaF9raW5kX3poYW94aW4gJiYgZmFtaWx5ID09IDYp Ci0gICAgc3VwcG9ydF9jb3VudF9tYXNrID0gZmFsc2U7Ci0KLSAgaWYgKHNoYXJlZCA8PSAwKQot ICAgIHsKLSAgICAgIC8qIFRyeSBMMiBvdGhlcndpc2UuICAqLwotICAgICAgbGV2ZWwgID0gMjsK LSAgICAgIHNoYXJlZCA9IGNvcmU7Ci0gICAgICB0aHJlYWRzX2wyID0gMDsKLSAgICAgIHRocmVh ZHNfbDMgPSAtMTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB0aHJlYWRzX2wyID0gMDsK LSAgICAgIHRocmVhZHNfbDMgPSAwOwotICAgIH0KLQotICAvKiBBIHZhbHVlIG9mIDAgZm9yIHRo ZSBIVFQgYml0IGluZGljYXRlcyB0aGVyZSBpcyBvbmx5IGEgc2luZ2xlCi0gICAgIGxvZ2ljYWwg cHJvY2Vzc29yLiAgKi8KLSAgaWYgKEhBU19DUFVfRkVBVFVSRSAoSFRUKSkKLSAgICB7Ci0gICAg ICAvKiBGaWd1cmUgb3V0IHRoZSBudW1iZXIgb2YgbG9naWNhbCB0aHJlYWRzIHRoYXQgc2hhcmUg dGhlCi0gICAgICAgICBoaWdoZXN0IGNhY2hlIGxldmVsLiAgKi8KLSAgICAgIGlmIChtYXhfY3B1 aWQgPj0gNCkKLSAgICAgICAgewotICAgICAgICAgIGludCBpID0gMDsKLQotICAgICAgICAgIC8q IFF1ZXJ5IHVudGlsIGNhY2hlIGxldmVsIDIgYW5kIDMgYXJlIGVudW1lcmF0ZWQuICAqLwotICAg ICAgICAgIGludCBjaGVjayA9IDB4MSB8ICh0aHJlYWRzX2wzID09IDApIDw8IDE7Ci0gICAgICAg ICAgZG8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgX19jcHVpZF9jb3VudCAoNCwgaSsr LCBlYXgsIGVieCwgZWN4LCBlZHgpOwotCi0gICAgICAgICAgICAgIC8qIFRoZXJlIHNlZW1zIHRv IGJlIGEgYnVnIGluIGF0IGxlYXN0IHNvbWUgUGVudGl1bSBEcwotICAgICAgICAgICAgICAgICB3 aGljaCBzb21ldGltZXMgZmFpbCB0byBpdGVyYXRlIGFsbCBjYWNoZSBwYXJhbWV0ZXJzLgotICAg ICAgICAgICAgICAgICBEbyBub3QgbG9vcCBpbmRlZmluaXRlbHkgaGVyZSwgc3RvcCBpbiB0aGlz IGNhc2UgYW5kCi0gICAgICAgICAgICAgICAgIGFzc3VtZSB0aGVyZSBpcyBubyBzdWNoIGluZm9y bWF0aW9uLiAgKi8KLSAgICAgICAgICAgICAgaWYgKGNwdV9mZWF0dXJlcy0+YmFzaWMua2luZCA9 PSBhcmNoX2tpbmRfaW50ZWwKLSAgICAgICAgICAgICAgICAgICYmIChlYXggJiAweDFmKSA9PSAw ICkKLSAgICAgICAgICAgICAgICBnb3RvIGludGVsX2J1Z19ub19jYWNoZV9pbmZvOwotCi0gICAg ICAgICAgICAgIHN3aXRjaCAoKGVheCA+PiA1KSAmIDB4NykKLSAgICAgICAgICAgICAgICB7Ci0g ICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAg ICAgICAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICAgICAgaWYgKChjaGVjayAm IDB4MSkpCi0gICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAg LyogR2V0IG1heGltdW0gbnVtYmVyIG9mIGxvZ2ljYWwgcHJvY2Vzc29ycwotICAgICAgICAgICAg ICAgICAgICAgICAgICAgc2hhcmluZyBMMiBjYWNoZS4gICovCi0gICAgICAgICAgICAgICAgICAg ICAgICB0aHJlYWRzX2wyID0gKGVheCA+PiAxNCkgJiAweDNmZjsKLSAgICAgICAgICAgICAgICAg ICAgICAgIGNoZWNrICY9IH4weDE7Ci0gICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAg ICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAg ICAgICAgICAgaWYgKChjaGVjayAmICgweDEgPDwgMSkpKQotICAgICAgICAgICAgICAgICAgICAg IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdldCBtYXhpbXVtIG51bWJlciBvZiBsb2dp Y2FsIHByb2Nlc3NvcnMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJpbmcgTDMgY2Fj aGUuICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkc19sMyA9IChlYXggPj4gMTQp ICYgMHgzZmY7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIENoZWNrIGlmIEwyIGFuZCBM MyBjYWNoZXMgYXJlIGluY2x1c2l2ZS4gICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpbmNs dXNpdmVfY2FjaGUgPSAoZWR4ICYgMHgyKSAhPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAg Y2hlY2sgJj0gfigweDEgPDwgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAg ICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAg ICAgICAgd2hpbGUgKGNoZWNrKTsKLQotICAgICAgICAgIC8qIElmIG1heF9jcHVpZCA+PSAxMSwg VEhSRUFEU19MMi9USFJFQURTX0wzIGFyZSB0aGUgbWF4aW11bQotICAgICAgICAgICAgIG51bWJl cnMgb2YgYWRkcmVzc2FibGUgSURzIGZvciBsb2dpY2FsIHByb2Nlc3NvcnMgc2hhcmluZwotICAg ICAgICAgICAgIHRoZSBjYWNoZSwgaW5zdGVhZCBvZiB0aGUgbWF4aW11bSBudW1iZXIgb2YgdGhy ZWFkcwotICAgICAgICAgICAgIHNoYXJpbmcgdGhlIGNhY2hlLiAgKi8KLSAgICAgICAgICBpZiAo bWF4X2NwdWlkID49IDExICYmIHN1cHBvcnRfY291bnRfbWFzaykKLSAgICAgICAgICAgIHsKLSAg ICAgICAgICAgICAgLyogRmluZCB0aGUgbnVtYmVyIG9mIGxvZ2ljYWwgcHJvY2Vzc29ycyBzaGlw cGVkIGluCi0gICAgICAgICAgICAgICAgIG9uZSBjb3JlIGFuZCBhcHBseSBjb3VudCBtYXNrLiAg Ki8KLSAgICAgICAgICAgICAgaSA9IDA7Ci0KLSAgICAgICAgICAgICAgLyogQ291bnQgU01UIG9u bHkgaWYgdGhlcmUgaXMgTDMgY2FjaGUuICBBbHdheXMgY291bnQKLSAgICAgICAgICAgICAgICAg Y29yZSBpZiB0aGVyZSBpcyBubyBMMyBjYWNoZS4gICovCi0gICAgICAgICAgICAgIGludCBjb3Vu dCA9ICgodGhyZWFkc19sMiA+IDAgJiYgbGV2ZWwgPT0gMykKLSAgICAgICAgICAgICAgICAgICAg ICAgICAgIHwgKCh0aHJlYWRzX2wzID4gMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHx8ICh0aHJlYWRzX2wyID4gMCAmJiBsZXZlbCA9PSAyKSkgPDwgMSkpOwotCi0gICAgICAgICAg ICAgIHdoaWxlIChjb3VudCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBf X2NwdWlkX2NvdW50ICgxMSwgaSsrLCBlYXgsIGVieCwgZWN4LCBlZHgpOwotCi0gICAgICAgICAg ICAgICAgICBpbnQgc2hpcHBlZCA9IGVieCAmIDB4ZmY7Ci0gICAgICAgICAgICAgICAgICBpbnQg dHlwZSA9IGVjeCAmIDB4ZmYwMDsKLSAgICAgICAgICAgICAgICAgIGlmIChzaGlwcGVkID09IDAg fHwgdHlwZSA9PSAwKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAg ICAgIGVsc2UgaWYgKHR5cGUgPT0gMHgxMDApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAg ICAgICAgICAgICAgICAgICAvKiBDb3VudCBTTVQuICAqLwotICAgICAgICAgICAgICAgICAgICAg IGlmICgoY291bnQgJiAweDEpKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAg ICAgICAgICAgICAgICAgICBpbnQgY291bnRfbWFzazsKLQotICAgICAgICAgICAgICAgICAgICAg ICAgICAvKiBDb21wdXRlIGNvdW50IG1hc2suICAqLwotICAgICAgICAgICAgICAgICAgICAgICAg ICBhc20gKCJic3IgJTEsICUwIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIj1y IiAoY291bnRfbWFzaykgOiAiZyIgKHRocmVhZHNfbDIpKTsKLSAgICAgICAgICAgICAgICAgICAg ICAgICAgY291bnRfbWFzayA9IH4oLTEgPDwgKGNvdW50X21hc2sgKyAxKSk7Ci0gICAgICAgICAg ICAgICAgICAgICAgICAgIHRocmVhZHNfbDIgPSAoc2hpcHBlZCAtIDEpICYgY291bnRfbWFzazsK LSAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQgJj0gfjB4MTsKLSAgICAgICAgICAgICAg ICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgZWxz ZSBpZiAodHlwZSA9PSAweDIwMCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAg ICAgICAgICAgIC8qIENvdW50IGNvcmUuICAqLwotICAgICAgICAgICAgICAgICAgICAgIGlmICgo Y291bnQgJiAoMHgxIDw8IDEpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAg ICAgICAgICAgICAgICAgICAgaW50IGNvdW50X21hc2s7Ci0gICAgICAgICAgICAgICAgICAgICAg ICAgIGludCB0aHJlYWRzX2NvcmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IChsZXZl bCA9PSAyID8gdGhyZWFkc19sMiA6IHRocmVhZHNfbDMpOwotCi0gICAgICAgICAgICAgICAgICAg ICAgICAgIC8qIENvbXB1dGUgY291bnQgbWFzay4gICovCi0gICAgICAgICAgICAgICAgICAgICAg ICAgIGFzbSAoImJzciAlMSwgJTAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAi PXIiIChjb3VudF9tYXNrKSA6ICJnIiAodGhyZWFkc19jb3JlKSk7Ci0gICAgICAgICAgICAgICAg ICAgICAgICAgIGNvdW50X21hc2sgPSB+KC0xIDw8IChjb3VudF9tYXNrICsgMSkpOwotICAgICAg ICAgICAgICAgICAgICAgICAgICB0aHJlYWRzX2NvcmUgPSAoc2hpcHBlZCAtIDEpICYgY291bnRf bWFzazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxldmVsID09IDIpCi0gICAgICAg ICAgICAgICAgICAgICAgICAgICAgdGhyZWFkc19sMiA9IHRocmVhZHNfY29yZTsKLSAgICAgICAg ICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVh ZHNfbDMgPSB0aHJlYWRzX2NvcmU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ICY9 IH4oMHgxIDw8IDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAg ICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIGlmICh0 aHJlYWRzX2wyID4gMCkKLSAgICAgICAgICAgIHRocmVhZHNfbDIgKz0gMTsKLSAgICAgICAgICBp ZiAodGhyZWFkc19sMyA+IDApCi0gICAgICAgICAgICB0aHJlYWRzX2wzICs9IDE7Ci0gICAgICAg ICAgaWYgKGxldmVsID09IDIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmICh0aHJl YWRzX2wyKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHRocmVhZHMgPSB0 aHJlYWRzX2wyOwotICAgICAgICAgICAgICAgICAgaWYgKGNwdV9mZWF0dXJlcy0+YmFzaWMua2lu ZCA9PSBhcmNoX2tpbmRfaW50ZWwKLSAgICAgICAgICAgICAgICAgICAgICAmJiB0aHJlYWRzID4g MgotICAgICAgICAgICAgICAgICAgICAgICYmIGZhbWlseSA9PSA2KQotICAgICAgICAgICAgICAg ICAgICBzd2l0Y2ggKG1vZGVsKQotICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAg ICAgICAgICAgICAgIGNhc2UgMHgzNzoKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMHg0 YToKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMHg0ZDoKLSAgICAgICAgICAgICAgICAg ICAgICAgIGNhc2UgMHg1YToKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMHg1ZDoKLSAg ICAgICAgICAgICAgICAgICAgICAgICAgLyogU2lsdmVybW9udCBoYXMgTDIgY2FjaGUgc2hhcmVk IGJ5IDIgY29yZXMuICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRzID0gMjsK LSAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAg ICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAg ICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAg IGVsc2UgaWYgKHRocmVhZHNfbDMpCi0gICAgICAgICAgICB0aHJlYWRzID0gdGhyZWFkc19sMzsK LSAgICAgICAgfQotICAgICAgZWxzZQotICAgICAgICB7Ci1pbnRlbF9idWdfbm9fY2FjaGVfaW5m bzoKLSAgICAgICAgICAvKiBBc3N1bWUgdGhhdCBhbGwgbG9naWNhbCB0aHJlYWRzIHNoYXJlIHRo ZSBoaWdoZXN0IGNhY2hlCi0gICAgICAgICAgICAgbGV2ZWwuICAqLwotICAgICAgICAgIHRocmVh ZHMKLSAgICAgICAgICAgID0gKChjcHVfZmVhdHVyZXMtPmZlYXR1cmVzW0NPTU1PTl9DUFVJRF9J TkRFWF8xXS5jcHVpZC5lYngKLSAgICAgICAgICAgICAgICA+PiAxNikgJiAweGZmKTsKLSAgICAg ICAgfQotCi0gICAgICAgIC8qIENhcCB1c2FnZSBvZiBoaWdoZXN0IGNhY2hlIGxldmVsIHRvIHRo ZSBudW1iZXIgb2Ygc3VwcG9ydGVkCi0gICAgICAgICAgIHRocmVhZHMuICAqLwotICAgICAgICBp ZiAoc2hhcmVkID4gMCAmJiB0aHJlYWRzID4gMCkKLSAgICAgICAgICBzaGFyZWQgLz0gdGhyZWFk czsKLSAgICB9Ci0KLSAgLyogQWNjb3VudCBmb3Igbm9uLWluY2x1c2l2ZSBMMiBhbmQgTDMgY2Fj aGVzLiAgKi8KLSAgaWYgKCFpbmNsdXNpdmVfY2FjaGUpCi0gICAgewotICAgICAgaWYgKHRocmVh ZHNfbDIgPiAwKQotICAgICAgICBjb3JlIC89IHRocmVhZHNfbDI7Ci0gICAgICBzaGFyZWQgKz0g Y29yZTsKLSAgICB9Ci0KLSAgKnNoYXJlZF9wdHIgPSBzaGFyZWQ7Ci0gICp0aHJlYWRzX3B0ciA9 IHRocmVhZHM7Ci19Ci0KIHN0YXRpYyB2b2lkCiBpbml0X2NhY2hlaW5mbyAodm9pZCkKIHsKLSAg LyogRmluZCBvdXQgd2hhdCBicmFuZCBvZiBwcm9jZXNzb3IuICAqLwotICB1bnNpZ25lZCBpbnQg ZWJ4OwotICB1bnNpZ25lZCBpbnQgZWN4OwotICB1bnNpZ25lZCBpbnQgZWR4OwotICBpbnQgbWF4 X2NwdWlkX2V4OwotICBsb25nIGludCBkYXRhID0gLTE7Ci0gIGxvbmcgaW50IHNoYXJlZCA9IC0x OwotICBsb25nIGludCBjb3JlOwotICB1bnNpZ25lZCBpbnQgdGhyZWFkcyA9IDA7CiAgIGNvbnN0 IHN0cnVjdCBjcHVfZmVhdHVyZXMgKmNwdV9mZWF0dXJlcyA9IF9fZ2V0X2NwdV9mZWF0dXJlcyAo KTsKKyAgbG9uZyBpbnQgZGF0YSA9IGNwdV9mZWF0dXJlcy0+ZGF0YV9jYWNoZV9zaXplOworICBf X3g4Nl9yYXdfZGF0YV9jYWNoZV9zaXplX2hhbGYgPSBkYXRhIC8gMjsKKyAgX194ODZfcmF3X2Rh dGFfY2FjaGVfc2l6ZSA9IGRhdGE7CisgIC8qIFJvdW5kIGRhdGEgY2FjaGUgc2l6ZSB0byBtdWx0 aXBsZSBvZiAyNTYgYnl0ZXMuICAqLworICBkYXRhID0gZGF0YSAmIH4yNTVMOworICBfX3g4Nl9k YXRhX2NhY2hlX3NpemVfaGFsZiA9IGRhdGEgLyAyOworICBfX3g4Nl9kYXRhX2NhY2hlX3NpemUg PSBkYXRhOworCisgIGxvbmcgaW50IHNoYXJlZCA9IGNwdV9mZWF0dXJlcy0+c2hhcmVkX2NhY2hl X3NpemU7CisgIF9feDg2X3Jhd19zaGFyZWRfY2FjaGVfc2l6ZV9oYWxmID0gc2hhcmVkIC8gMjsK KyAgX194ODZfcmF3X3NoYXJlZF9jYWNoZV9zaXplID0gc2hhcmVkOworICAvKiBSb3VuZCBzaGFy ZWQgY2FjaGUgc2l6ZSB0byBtdWx0aXBsZSBvZiAyNTYgYnl0ZXMuICAqLworICBzaGFyZWQgPSBz aGFyZWQgJiB+MjU1TDsKKyAgX194ODZfc2hhcmVkX2NhY2hlX3NpemVfaGFsZiA9IHNoYXJlZCAv IDI7CisgIF9feDg2X3NoYXJlZF9jYWNoZV9zaXplID0gc2hhcmVkOwogCi0gIC8qIE5COiBJbiBs aWJjLnNvLCBjcHVfZmVhdHVyZXMgaXMgZGVmaW5lZCBpbiBsZC5zbyBhbmQgaXMgaW5pdGlhbGl6 ZWQKLSAgICAgYnkgRExfUExBVEZPUk1fSU5JVCBvciBJRlVOQyByZWxvY2F0aW9uIGJlZm9yZSBp bml0X2NhY2hlaW5mbyBpcwotICAgICBjYWxsZWQgYnkgSUZVTkMgcmVsb2NhdGlvbi4gIEluIGxp YmMuYSwgaW5pdF9jYWNoZWluZm8gaXMgY2FsbGVkCi0gICAgIGZyb20gaW5pdF9jcHVfZmVhdHVy ZXMgYnkgQVJDSF9JTklUX0NQVV9GRUFUVVJFUy4gICovCi0gIGFzc2VydCAoY3B1X2ZlYXR1cmVz LT5iYXNpYy5raW5kICE9IGFyY2hfa2luZF91bmtub3duKTsKLQotICBpZiAoY3B1X2ZlYXR1cmVz LT5iYXNpYy5raW5kID09IGFyY2hfa2luZF9pbnRlbCkKLSAgICB7Ci0gICAgICBkYXRhID0gaGFu ZGxlX2ludGVsIChfU0NfTEVWRUwxX0RDQUNIRV9TSVpFLCBjcHVfZmVhdHVyZXMpOwotICAgICAg Y29yZSA9IGhhbmRsZV9pbnRlbCAoX1NDX0xFVkVMMl9DQUNIRV9TSVpFLCBjcHVfZmVhdHVyZXMp OwotICAgICAgc2hhcmVkID0gaGFuZGxlX2ludGVsIChfU0NfTEVWRUwzX0NBQ0hFX1NJWkUsIGNw dV9mZWF0dXJlcyk7Ci0KLSAgICAgIGdldF9jb21tb25fY2FjaGVfaW5mbyAoJnNoYXJlZCwgJnRo cmVhZHMsIGNvcmUpOwotICAgIH0KLSAgZWxzZSBpZiAoY3B1X2ZlYXR1cmVzLT5iYXNpYy5raW5k ID09IGFyY2hfa2luZF96aGFveGluKQotICAgIHsKLSAgICAgIGRhdGEgPSBoYW5kbGVfemhhb3hp biAoX1NDX0xFVkVMMV9EQ0FDSEVfU0laRSk7Ci0gICAgICBjb3JlID0gaGFuZGxlX3poYW94aW4g KF9TQ19MRVZFTDJfQ0FDSEVfU0laRSk7Ci0gICAgICBzaGFyZWQgPSBoYW5kbGVfemhhb3hpbiAo X1NDX0xFVkVMM19DQUNIRV9TSVpFKTsKLQotICAgICAgZ2V0X2NvbW1vbl9jYWNoZV9pbmZvICgm c2hhcmVkLCAmdGhyZWFkcywgY29yZSk7Ci0gICAgfQotICBlbHNlIGlmIChjcHVfZmVhdHVyZXMt PmJhc2ljLmtpbmQgPT0gYXJjaF9raW5kX2FtZCkKLSAgICB7Ci0gICAgICBkYXRhICAgPSBoYW5k bGVfYW1kIChfU0NfTEVWRUwxX0RDQUNIRV9TSVpFKTsKLSAgICAgIGxvbmcgaW50IGNvcmUgPSBo YW5kbGVfYW1kIChfU0NfTEVWRUwyX0NBQ0hFX1NJWkUpOwotICAgICAgc2hhcmVkID0gaGFuZGxl X2FtZCAoX1NDX0xFVkVMM19DQUNIRV9TSVpFKTsKLQotICAgICAgLyogR2V0IG1heGltdW0gZXh0 ZW5kZWQgZnVuY3Rpb24uICovCi0gICAgICBfX2NwdWlkICgweDgwMDAwMDAwLCBtYXhfY3B1aWRf ZXgsIGVieCwgZWN4LCBlZHgpOwotCi0gICAgICBpZiAoc2hhcmVkIDw9IDApCi0JLyogTm8gc2hh cmVkIEwzIGNhY2hlLiAgQWxsIHdlIGhhdmUgaXMgdGhlIEwyIGNhY2hlLiAgKi8KLQlzaGFyZWQg PSBjb3JlOwotICAgICAgZWxzZQotCXsKLQkgIC8qIEZpZ3VyZSBvdXQgdGhlIG51bWJlciBvZiBs b2dpY2FsIHRocmVhZHMgdGhhdCBzaGFyZSBMMy4gICovCi0JICBpZiAobWF4X2NwdWlkX2V4ID49 IDB4ODAwMDAwMDgpCi0JICAgIHsKLQkgICAgICAvKiBHZXQgd2lkdGggb2YgQVBJQyBJRC4gICov Ci0JICAgICAgX19jcHVpZCAoMHg4MDAwMDAwOCwgbWF4X2NwdWlkX2V4LCBlYngsIGVjeCwgZWR4 KTsKLQkgICAgICB0aHJlYWRzID0gMSA8PCAoKGVjeCA+PiAxMikgJiAweDBmKTsKLQkgICAgfQot Ci0JICBpZiAodGhyZWFkcyA9PSAwIHx8IGNwdV9mZWF0dXJlcy0+YmFzaWMuZmFtaWx5ID49IDB4 MTcpCi0JICAgIHsKLQkgICAgICAvKiBJZiBBUElDIElEIHdpZHRoIGlzIG5vdCBhdmFpbGFibGUs IHVzZSBsb2dpY2FsCi0JCSBwcm9jZXNzb3IgY291bnQuICAqLwotCSAgICAgIF9fY3B1aWQgKDB4 MDAwMDAwMDEsIG1heF9jcHVpZF9leCwgZWJ4LCBlY3gsIGVkeCk7Ci0KLQkgICAgICBpZiAoKGVk eCAmICgxIDw8IDI4KSkgIT0gMCkKLQkJdGhyZWFkcyA9IChlYnggPj4gMTYpICYgMHhmZjsKLQkg ICAgfQotCi0JICAvKiBDYXAgdXNhZ2Ugb2YgaGlnaGVzdCBjYWNoZSBsZXZlbCB0byB0aGUgbnVt YmVyIG9mCi0JICAgICBzdXBwb3J0ZWQgdGhyZWFkcy4gICovCi0JICBpZiAodGhyZWFkcyA+IDAp Ci0JICAgIHNoYXJlZCAvPSB0aHJlYWRzOwotCi0JICAvKiBHZXQgc2hhcmVkIGNhY2hlIHBlciBj Y3ggZm9yIFplbiBhcmNoaXRlY3R1cmVzLiAgKi8KLQkgIGlmIChjcHVfZmVhdHVyZXMtPmJhc2lj LmZhbWlseSA+PSAweDE3KQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgaW50IGVheDsKLQotCSAg ICAgIC8qIEdldCBudW1iZXIgb2YgdGhyZWFkcyBzaGFyZSB0aGUgTDMgY2FjaGUgaW4gQ0NYLiAg Ki8KLQkgICAgICBfX2NwdWlkX2NvdW50ICgweDgwMDAwMDFELCAweDMsIGVheCwgZWJ4LCBlY3gs IGVkeCk7Ci0KLQkgICAgICB1bnNpZ25lZCBpbnQgdGhyZWFkc19wZXJfY2N4ID0gKChlYXggPj4g MTQpICYgMHhmZmYpICsgMTsKLQkgICAgICBzaGFyZWQgKj0gdGhyZWFkc19wZXJfY2N4OwotCSAg ICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBBY2NvdW50IGZvciBleGNsdXNpdmUgTDIg YW5kIEwzIGNhY2hlcy4gICovCi0JICAgICAgc2hhcmVkICs9IGNvcmU7Ci0gICAgICAgICAgICB9 Ci0gICAgICB9Ci0gICAgfQotCi0gIC8qIFByZWZlciBjYWNoZSBzaXplIGNvbmZpZ3VyZSB2aWEg dHVuaW5nLiAgKi8KLSAgaWYgKGNwdV9mZWF0dXJlcy0+ZGF0YV9jYWNoZV9zaXplICE9IDApCi0g ICAgZGF0YSA9IGNwdV9mZWF0dXJlcy0+ZGF0YV9jYWNoZV9zaXplOwotCi0gIGlmIChkYXRhID4g MCkKLSAgICB7Ci0gICAgICBfX3g4Nl9yYXdfZGF0YV9jYWNoZV9zaXplX2hhbGYgPSBkYXRhIC8g MjsKLSAgICAgIF9feDg2X3Jhd19kYXRhX2NhY2hlX3NpemUgPSBkYXRhOwotICAgICAgLyogUm91 bmQgZGF0YSBjYWNoZSBzaXplIHRvIG11bHRpcGxlIG9mIDI1NiBieXRlcy4gICovCi0gICAgICBk YXRhID0gZGF0YSAmIH4yNTVMOwotICAgICAgX194ODZfZGF0YV9jYWNoZV9zaXplX2hhbGYgPSBk YXRhIC8gMjsKLSAgICAgIF9feDg2X2RhdGFfY2FjaGVfc2l6ZSA9IGRhdGE7Ci0gICAgfQotCi0g IC8qIFByZWZlciBjYWNoZSBzaXplIGNvbmZpZ3VyZSB2aWEgdHVuaW5nLiAgKi8KLSAgaWYgKGNw dV9mZWF0dXJlcy0+c2hhcmVkX2NhY2hlX3NpemUgIT0gMCkKLSAgICBzaGFyZWQgPSBjcHVfZmVh dHVyZXMtPnNoYXJlZF9jYWNoZV9zaXplOwotCi0gIGlmIChzaGFyZWQgPiAwKQotICAgIHsKLSAg ICAgIF9feDg2X3Jhd19zaGFyZWRfY2FjaGVfc2l6ZV9oYWxmID0gc2hhcmVkIC8gMjsKLSAgICAg IF9feDg2X3Jhd19zaGFyZWRfY2FjaGVfc2l6ZSA9IHNoYXJlZDsKLSAgICAgIC8qIFJvdW5kIHNo YXJlZCBjYWNoZSBzaXplIHRvIG11bHRpcGxlIG9mIDI1NiBieXRlcy4gICovCi0gICAgICBzaGFy ZWQgPSBzaGFyZWQgJiB+MjU1TDsKLSAgICAgIF9feDg2X3NoYXJlZF9jYWNoZV9zaXplX2hhbGYg PSBzaGFyZWQgLyAyOwotICAgICAgX194ODZfc2hhcmVkX2NhY2hlX3NpemUgPSBzaGFyZWQ7Ci0g ICAgfQotCi0gIC8qIFRoZSBkZWZhdWx0IHNldHRpbmcgZm9yIHRoZSBub25fdGVtcG9yYWwgdGhy ZXNob2xkIGlzIDMvNCBvZiBvbmUKLSAgICAgdGhyZWFkJ3Mgc2hhcmUgb2YgdGhlIGNoaXAncyBj YWNoZS4gRm9yIG1vc3QgSW50ZWwgYW5kIEFNRCBwcm9jZXNzb3JzCi0gICAgIHdpdGggYW4gaW5p dGlhbCByZWxlYXNlIGRhdGUgYmV0d2VlbiAyMDE3IGFuZCAyMDIwLCBhIHRocmVhZCdzIHR5cGlj YWwKLSAgICAgc2hhcmUgb2YgdGhlIGNhY2hlIGlzIGZyb20gNTAwIEtCeXRlcyB0byAyIE1CeXRl cy4gVXNpbmcgdGhlIDMvNAotICAgICB0aHJlc2hvbGQgbGVhdmVzIDEyNSBLQnl0ZXMgdG8gNTAw IEtCeXRlcyBvZiB0aGUgdGhyZWFkJ3MgZGF0YQotICAgICBpbiBjYWNoZSBhZnRlciBhIG1heGlt dW0gdGVtcG9yYWwgY29weSwgd2hpY2ggd2lsbCBtYWludGFpbgotICAgICBpbiBjYWNoZSBhIHJl YXNvbmFibGUgcG9ydGlvbiBvZiB0aGUgdGhyZWFkJ3Mgc3RhY2sgYW5kIG90aGVyCi0gICAgIGFj dGl2ZSBkYXRhLiBJZiB0aGUgdGhyZXNob2xkIGlzIHNldCBoaWdoZXIgdGhhbiBvbmUgdGhyZWFk J3MKLSAgICAgc2hhcmUgb2YgdGhlIGNhY2hlLCBpdCBoYXMgYSBzdWJzdGFudGlhbCByaXNrIG9m IG5lZ2F0aXZlbHkKLSAgICAgaW1wYWN0aW5nIHRoZSBwZXJmb3JtYW5jZSBvZiBvdGhlciB0aHJl YWRzIHJ1bm5pbmcgb24gdGhlIGNoaXAuICovCiAgIF9feDg2X3NoYXJlZF9ub25fdGVtcG9yYWxf dGhyZXNob2xkCi0gICAgPSAoY3B1X2ZlYXR1cmVzLT5ub25fdGVtcG9yYWxfdGhyZXNob2xkICE9 IDAKLSAgICAgICA/IGNwdV9mZWF0dXJlcy0+bm9uX3RlbXBvcmFsX3RocmVzaG9sZAotICAgICAg IDogX194ODZfc2hhcmVkX2NhY2hlX3NpemUgKiAzIC8gNCk7Ci0KLSAgLyogTkI6IFRoZSBSRVAg TU9WU0IgdGhyZXNob2xkIG11c3QgYmUgZ3JlYXRlciB0aGFuIFZFQ19TSVpFICogOC4gICovCi0g IHVuc2lnbmVkIGludCBtaW5pbXVtX3JlcF9tb3ZzYl90aHJlc2hvbGQ7Ci0gIC8qIE5COiBUaGUg ZGVmYXVsdCBSRVAgTU9WU0IgdGhyZXNob2xkIGlzIDIwNDggKiAoVkVDX1NJWkUgLyAxNikuICAq LwotICB1bnNpZ25lZCBpbnQgcmVwX21vdnNiX3RocmVzaG9sZDsKLSAgaWYgKENQVV9GRUFUVVJF X1VTQUJMRV9QIChjcHVfZmVhdHVyZXMsIEFWWDUxMkYpCi0gICAgICAmJiAhQ1BVX0ZFQVRVUkVf UFJFRkVSUkVEX1AgKGNwdV9mZWF0dXJlcywgUHJlZmVyX05vX0FWWDUxMikpCi0gICAgewotICAg ICAgcmVwX21vdnNiX3RocmVzaG9sZCA9IDIwNDggKiAoNjQgLyAxNik7Ci0gICAgICBtaW5pbXVt X3JlcF9tb3ZzYl90aHJlc2hvbGQgPSA2NCAqIDg7Ci0gICAgfQotICBlbHNlIGlmIChDUFVfRkVB VFVSRV9QUkVGRVJSRURfUCAoY3B1X2ZlYXR1cmVzLAotCQkJCSAgICBBVlhfRmFzdF9VbmFsaWdu ZWRfTG9hZCkpCi0gICAgewotICAgICAgcmVwX21vdnNiX3RocmVzaG9sZCA9IDIwNDggKiAoMzIg LyAxNik7Ci0gICAgICBtaW5pbXVtX3JlcF9tb3ZzYl90aHJlc2hvbGQgPSAzMiAqIDg7Ci0gICAg fQotICBlbHNlCi0gICAgewotICAgICAgcmVwX21vdnNiX3RocmVzaG9sZCA9IDIwNDggKiAoMTYg LyAxNik7Ci0gICAgICBtaW5pbXVtX3JlcF9tb3ZzYl90aHJlc2hvbGQgPSAxNiAqIDg7Ci0gICAg fQotICBpZiAoY3B1X2ZlYXR1cmVzLT5yZXBfbW92c2JfdGhyZXNob2xkID4gbWluaW11bV9yZXBf bW92c2JfdGhyZXNob2xkKQotICAgIF9feDg2X3JlcF9tb3ZzYl90aHJlc2hvbGQgPSBjcHVfZmVh dHVyZXMtPnJlcF9tb3ZzYl90aHJlc2hvbGQ7Ci0gIGVsc2UKLSAgICBfX3g4Nl9yZXBfbW92c2Jf dGhyZXNob2xkID0gcmVwX21vdnNiX3RocmVzaG9sZDsKKyAgICA9IGNwdV9mZWF0dXJlcy0+bm9u X3RlbXBvcmFsX3RocmVzaG9sZDsKIAotIyBpZiBIQVZFX1RVTkFCTEVTCisgIF9feDg2X3JlcF9t b3ZzYl90aHJlc2hvbGQgPSBjcHVfZmVhdHVyZXMtPnJlcF9tb3ZzYl90aHJlc2hvbGQ7CiAgIF9f eDg2X3JlcF9zdG9zYl90aHJlc2hvbGQgPSBjcHVfZmVhdHVyZXMtPnJlcF9zdG9zYl90aHJlc2hv bGQ7Ci0jIGVuZGlmCiB9CisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c2RlcHMveDg2L2NwdS1mZWF0 dXJlcy5jIGIvc3lzZGVwcy94ODYvY3B1LWZlYXR1cmVzLmMKaW5kZXggZTdkYTY4MmEyZS4uMDZl NDMwN2I3MSAxMDA2NDQKLS0tIGEvc3lzZGVwcy94ODYvY3B1LWZlYXR1cmVzLmMKKysrIGIvc3lz ZGVwcy94ODYvY3B1LWZlYXR1cmVzLmMKQEAgLTE2LDIyICsxNiwxMyBAQAogICAgTGljZW5zZSBh bG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHNlZQogICAgPGh0dHBzOi8vd3d3 LmdudS5vcmcvbGljZW5zZXMvPi4gICovCiAKLSNpbmNsdWRlIDxjcHVpZC5oPgogI2luY2x1ZGUg PGRsLWh3Y2FwLmg+CiAjaW5jbHVkZSA8bGliYy1wb2ludGVyLWFyaXRoLmg+CiAjaW5jbHVkZSA8 Z2V0LWlzYS1sZXZlbC5oPgotI2lmIElTX0lOIChsaWJjKSAmJiAhZGVmaW5lZCBTSEFSRUQKLSMg aW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jIGluY2x1ZGUgPHVuaXN0ZC5oPgotIyBpbmNsdWRlIDxkbC1j YWNoZWluZm8uaD4KLSMgaW5jbHVkZSA8Y2FjaGVpbmZvLmg+Ci0jZW5kaWYKKyNpbmNsdWRlIDxj YWNoZWluZm8uaD4KKyNpbmNsdWRlIDxkbC1jYWNoZWluZm8uaD4KIAogI2lmIEhBVkVfVFVOQUJM RVMKLSMgZGVmaW5lIFRVTkFCTEVfTkFNRVNQQUNFIGNwdQotIyBpbmNsdWRlIDx1bmlzdGQuaD4J CS8qIEdldCBTVERPVVRfRklMRU5PIGZvciBfZGxfcHJpbnRmLiAgKi8KLSMgaW5jbHVkZSA8ZWxm L2RsLXR1bmFibGVzLmg+Ci0KIGV4dGVybiB2b2lkIFRVTkFCTEVfQ0FMTEJBQ0sgKHNldF9od2Nh cHMpICh0dW5hYmxlX3ZhbF90ICopCiAgIGF0dHJpYnV0ZV9oaWRkZW47CiAKQEAgLTY0NiwyNCAr NjM3LDE0IEBAIG5vX2NwdWlkOgogICBjcHVfZmVhdHVyZXMtPmJhc2ljLm1vZGVsID0gbW9kZWw7 CiAgIGNwdV9mZWF0dXJlcy0+YmFzaWMuc3RlcHBpbmcgPSBzdGVwcGluZzsKIAorICBkbF9pbml0 X2NhY2hlaW5mbyAoY3B1X2ZlYXR1cmVzKTsKKwogI2lmIEhBVkVfVFVOQUJMRVMKICAgVFVOQUJM RV9HRVQgKGh3Y2FwcywgdHVuYWJsZV92YWxfdCAqLCBUVU5BQkxFX0NBTExCQUNLIChzZXRfaHdj YXBzKSk7Ci0gIGNwdV9mZWF0dXJlcy0+bm9uX3RlbXBvcmFsX3RocmVzaG9sZAotICAgID0gVFVO QUJMRV9HRVQgKHg4Nl9ub25fdGVtcG9yYWxfdGhyZXNob2xkLCBsb25nIGludCwgTlVMTCk7Ci0g IGNwdV9mZWF0dXJlcy0+cmVwX21vdnNiX3RocmVzaG9sZAotICAgID0gVFVOQUJMRV9HRVQgKHg4 Nl9yZXBfbW92c2JfdGhyZXNob2xkLCBsb25nIGludCwgTlVMTCk7Ci0gIGNwdV9mZWF0dXJlcy0+ cmVwX3N0b3NiX3RocmVzaG9sZAotICAgID0gVFVOQUJMRV9HRVQgKHg4Nl9yZXBfc3Rvc2JfdGhy ZXNob2xkLCBsb25nIGludCwgTlVMTCk7Ci0gIGNwdV9mZWF0dXJlcy0+ZGF0YV9jYWNoZV9zaXpl Ci0gICAgPSBUVU5BQkxFX0dFVCAoeDg2X2RhdGFfY2FjaGVfc2l6ZSwgbG9uZyBpbnQsIE5VTEwp OwotICBjcHVfZmVhdHVyZXMtPnNoYXJlZF9jYWNoZV9zaXplCi0gICAgPSBUVU5BQkxFX0dFVCAo eDg2X3NoYXJlZF9jYWNoZV9zaXplLCBsb25nIGludCwgTlVMTCk7Ci0jZW5kaWYKLQotICAvKiBS ZXVzZSBkbF9wbGF0Zm9ybSwgZGxfaHdjYXAgYW5kIGRsX2h3Y2FwX21hc2sgZm9yIHg4Ni4gICov Ci0jaWYgIUhBVkVfVFVOQUJMRVMgJiYgZGVmaW5lZCBTSEFSRUQKLSAgLyogVGhlIGdsaWJjLmNw dS5od2NhcF9tYXNrIHR1bmFibGUgaXMgaW5pdGlhbGl6ZWQgYWxyZWFkeSwgc28gbm8gbmVlZCB0 byBkbwotICAgICB0aGlzLiAgKi8KKyNlbGlmIGRlZmluZWQgU0hBUkVECisgIC8qIFJldXNlIGRs X3BsYXRmb3JtLCBkbF9od2NhcCBhbmQgZGxfaHdjYXBfbWFzayBmb3IgeDg2LiAgVGhlCisgICAg IGdsaWJjLmNwdS5od2NhcF9tYXNrIHR1bmFibGUgaXMgaW5pdGlhbGl6ZWQgYWxyZWFkeSwgc28g bm8KKyAgICAgbmVlZCB0byBkbyB0aGlzLiAgKi8KICAgR0xSTyhkbF9od2NhcF9tYXNrKSA9IEhX Q0FQX0lNUE9SVEFOVDsKICNlbmRpZgogCmRpZmYgLS1naXQgYS9zeXNkZXBzL3g4Ni9kbC1jYWNo ZWluZm8uaCBiL3N5c2RlcHMveDg2L2RsLWNhY2hlaW5mby5oCmluZGV4IDZhZGNlNDE0N2MuLjk2 YzQ5ZjI0MTEgMTAwNjQ0Ci0tLSBhL3N5c2RlcHMveDg2L2RsLWNhY2hlaW5mby5oCisrKyBiL3N5 c2RlcHMveDg2L2RsLWNhY2hlaW5mby5oCkBAIC00NzYsMyArNDc2LDQ2MyBAQCBoYW5kbGVfemhh b3hpbiAoaW50IG5hbWUpCiAgIC8qIE5vdGhpbmcgZm91bmQuICAqLwogICByZXR1cm4gMDsKIH0K Kworc3RhdGljIHZvaWQKK2dldF9jb21tb25fY2FjaGVfaW5mbyAobG9uZyBpbnQgKnNoYXJlZF9w dHIsIHVuc2lnbmVkIGludCAqdGhyZWFkc19wdHIsCisgICAgICAgICAgICAgICAgbG9uZyBpbnQg Y29yZSkKK3sKKyAgdW5zaWduZWQgaW50IGVheDsKKyAgdW5zaWduZWQgaW50IGVieDsKKyAgdW5z aWduZWQgaW50IGVjeDsKKyAgdW5zaWduZWQgaW50IGVkeDsKKworICAvKiBOdW1iZXIgb2YgbG9n aWNhbCBwcm9jZXNzb3JzIHNoYXJpbmcgTDIgY2FjaGUuICAqLworICBpbnQgdGhyZWFkc19sMjsK KworICAvKiBOdW1iZXIgb2YgbG9naWNhbCBwcm9jZXNzb3JzIHNoYXJpbmcgTDMgY2FjaGUuICAq LworICBpbnQgdGhyZWFkc19sMzsKKworICBjb25zdCBzdHJ1Y3QgY3B1X2ZlYXR1cmVzICpjcHVf ZmVhdHVyZXMgPSBfX2dldF9jcHVfZmVhdHVyZXMgKCk7CisgIGludCBtYXhfY3B1aWQgPSBjcHVf ZmVhdHVyZXMtPmJhc2ljLm1heF9jcHVpZDsKKyAgdW5zaWduZWQgaW50IGZhbWlseSA9IGNwdV9m ZWF0dXJlcy0+YmFzaWMuZmFtaWx5OworICB1bnNpZ25lZCBpbnQgbW9kZWwgPSBjcHVfZmVhdHVy ZXMtPmJhc2ljLm1vZGVsOworICBsb25nIGludCBzaGFyZWQgPSAqc2hhcmVkX3B0cjsKKyAgdW5z aWduZWQgaW50IHRocmVhZHMgPSAqdGhyZWFkc19wdHI7CisgIGJvb2wgaW5jbHVzaXZlX2NhY2hl ID0gdHJ1ZTsKKyAgYm9vbCBzdXBwb3J0X2NvdW50X21hc2sgPSB0cnVlOworCisgIC8qIFRyeSBM MyBmaXJzdC4gICovCisgIHVuc2lnbmVkIGludCBsZXZlbCA9IDM7CisKKyAgaWYgKGNwdV9mZWF0 dXJlcy0+YmFzaWMua2luZCA9PSBhcmNoX2tpbmRfemhhb3hpbiAmJiBmYW1pbHkgPT0gNikKKyAg ICBzdXBwb3J0X2NvdW50X21hc2sgPSBmYWxzZTsKKworICBpZiAoc2hhcmVkIDw9IDApCisgICAg eworICAgICAgLyogVHJ5IEwyIG90aGVyd2lzZS4gICovCisgICAgICBsZXZlbCAgPSAyOworICAg ICAgc2hhcmVkID0gY29yZTsKKyAgICAgIHRocmVhZHNfbDIgPSAwOworICAgICAgdGhyZWFkc19s MyA9IC0xOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHRocmVhZHNfbDIgPSAwOworICAg ICAgdGhyZWFkc19sMyA9IDA7CisgICAgfQorCisgIC8qIEEgdmFsdWUgb2YgMCBmb3IgdGhlIEhU VCBiaXQgaW5kaWNhdGVzIHRoZXJlIGlzIG9ubHkgYSBzaW5nbGUKKyAgICAgbG9naWNhbCBwcm9j ZXNzb3IuICAqLworICBpZiAoSEFTX0NQVV9GRUFUVVJFIChIVFQpKQorICAgIHsKKyAgICAgIC8q IEZpZ3VyZSBvdXQgdGhlIG51bWJlciBvZiBsb2dpY2FsIHRocmVhZHMgdGhhdCBzaGFyZSB0aGUK KyAgICAgICAgIGhpZ2hlc3QgY2FjaGUgbGV2ZWwuICAqLworICAgICAgaWYgKG1heF9jcHVpZCA+ PSA0KQorICAgICAgICB7CisgICAgICAgICAgaW50IGkgPSAwOworCisgICAgICAgICAgLyogUXVl cnkgdW50aWwgY2FjaGUgbGV2ZWwgMiBhbmQgMyBhcmUgZW51bWVyYXRlZC4gICovCisgICAgICAg ICAgaW50IGNoZWNrID0gMHgxIHwgKHRocmVhZHNfbDMgPT0gMCkgPDwgMTsKKyAgICAgICAgICBk bworICAgICAgICAgICAgeworICAgICAgICAgICAgICBfX2NwdWlkX2NvdW50ICg0LCBpKyssIGVh eCwgZWJ4LCBlY3gsIGVkeCk7CisKKyAgICAgICAgICAgICAgLyogVGhlcmUgc2VlbXMgdG8gYmUg YSBidWcgaW4gYXQgbGVhc3Qgc29tZSBQZW50aXVtIERzCisgICAgICAgICAgICAgICAgIHdoaWNo IHNvbWV0aW1lcyBmYWlsIHRvIGl0ZXJhdGUgYWxsIGNhY2hlIHBhcmFtZXRlcnMuCisgICAgICAg ICAgICAgICAgIERvIG5vdCBsb29wIGluZGVmaW5pdGVseSBoZXJlLCBzdG9wIGluIHRoaXMgY2Fz ZSBhbmQKKyAgICAgICAgICAgICAgICAgYXNzdW1lIHRoZXJlIGlzIG5vIHN1Y2ggaW5mb3JtYXRp b24uICAqLworICAgICAgICAgICAgICBpZiAoY3B1X2ZlYXR1cmVzLT5iYXNpYy5raW5kID09IGFy Y2hfa2luZF9pbnRlbAorICAgICAgICAgICAgICAgICAgJiYgKGVheCAmIDB4MWYpID09IDAgKQor ICAgICAgICAgICAgICAgIGdvdG8gaW50ZWxfYnVnX25vX2NhY2hlX2luZm87CisKKyAgICAgICAg ICAgICAgc3dpdGNoICgoZWF4ID4+IDUpICYgMHg3KQorICAgICAgICAgICAgICAgIHsKKyAgICAg ICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAg ICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICBpZiAoKGNoZWNrICYgMHgx KSkKKyAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBH ZXQgbWF4aW11bSBudW1iZXIgb2YgbG9naWNhbCBwcm9jZXNzb3JzCisgICAgICAgICAgICAgICAg ICAgICAgICAgICBzaGFyaW5nIEwyIGNhY2hlLiAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAg IHRocmVhZHNfbDIgPSAoZWF4ID4+IDE0KSAmIDB4M2ZmOworICAgICAgICAgICAgICAgICAgICAg ICAgY2hlY2sgJj0gfjB4MTsKKyAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAg ICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAg ICAgICBpZiAoKGNoZWNrICYgKDB4MSA8PCAxKSkpCisgICAgICAgICAgICAgICAgICAgICAgewor ICAgICAgICAgICAgICAgICAgICAgICAgLyogR2V0IG1heGltdW0gbnVtYmVyIG9mIGxvZ2ljYWwg cHJvY2Vzc29ycworICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmluZyBMMyBjYWNoZS4g ICovCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRzX2wzID0gKGVheCA+PiAxNCkgJiAw eDNmZjsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2hlY2sgaWYgTDIgYW5kIEwzIGNh Y2hlcyBhcmUgaW5jbHVzaXZlLiAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1c2l2 ZV9jYWNoZSA9IChlZHggJiAweDIpICE9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGVj ayAmPSB+KDB4MSA8PCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAg ICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAg ICB3aGlsZSAoY2hlY2spOworCisgICAgICAgICAgLyogSWYgbWF4X2NwdWlkID49IDExLCBUSFJF QURTX0wyL1RIUkVBRFNfTDMgYXJlIHRoZSBtYXhpbXVtCisgICAgICAgICAgICAgbnVtYmVycyBv ZiBhZGRyZXNzYWJsZSBJRHMgZm9yIGxvZ2ljYWwgcHJvY2Vzc29ycyBzaGFyaW5nCisgICAgICAg ICAgICAgdGhlIGNhY2hlLCBpbnN0ZWFkIG9mIHRoZSBtYXhpbXVtIG51bWJlciBvZiB0aHJlYWRz CisgICAgICAgICAgICAgc2hhcmluZyB0aGUgY2FjaGUuICAqLworICAgICAgICAgIGlmIChtYXhf Y3B1aWQgPj0gMTEgJiYgc3VwcG9ydF9jb3VudF9tYXNrKQorICAgICAgICAgICAgeworICAgICAg ICAgICAgICAvKiBGaW5kIHRoZSBudW1iZXIgb2YgbG9naWNhbCBwcm9jZXNzb3JzIHNoaXBwZWQg aW4KKyAgICAgICAgICAgICAgICAgb25lIGNvcmUgYW5kIGFwcGx5IGNvdW50IG1hc2suICAqLwor ICAgICAgICAgICAgICBpID0gMDsKKworICAgICAgICAgICAgICAvKiBDb3VudCBTTVQgb25seSBp ZiB0aGVyZSBpcyBMMyBjYWNoZS4gIEFsd2F5cyBjb3VudAorICAgICAgICAgICAgICAgICBjb3Jl IGlmIHRoZXJlIGlzIG5vIEwzIGNhY2hlLiAgKi8KKyAgICAgICAgICAgICAgaW50IGNvdW50ID0g KCh0aHJlYWRzX2wyID4gMCAmJiBsZXZlbCA9PSAzKQorICAgICAgICAgICAgICAgICAgICAgICAg ICAgfCAoKHRocmVhZHNfbDMgPiAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwg KHRocmVhZHNfbDIgPiAwICYmIGxldmVsID09IDIpKSA8PCAxKSk7CisKKyAgICAgICAgICAgICAg d2hpbGUgKGNvdW50KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIF9fY3B1 aWRfY291bnQgKDExLCBpKyssIGVheCwgZWJ4LCBlY3gsIGVkeCk7CisKKyAgICAgICAgICAgICAg ICAgIGludCBzaGlwcGVkID0gZWJ4ICYgMHhmZjsKKyAgICAgICAgICAgICAgICAgIGludCB0eXBl ID0gZWN4ICYgMHhmZjAwOworICAgICAgICAgICAgICAgICAgaWYgKHNoaXBwZWQgPT0gMCB8fCB0 eXBlID09IDApCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAg ZWxzZSBpZiAodHlwZSA9PSAweDEwMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAg ICAgICAgICAgICAgIC8qIENvdW50IFNNVC4gICovCisgICAgICAgICAgICAgICAgICAgICAgaWYg KChjb3VudCAmIDB4MSkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAg ICAgICAgICAgICAgIGludCBjb3VudF9tYXNrOworCisgICAgICAgICAgICAgICAgICAgICAgICAg IC8qIENvbXB1dGUgY291bnQgbWFzay4gICovCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFz bSAoImJzciAlMSwgJTAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiPXIiIChj b3VudF9tYXNrKSA6ICJnIiAodGhyZWFkc19sMikpOworICAgICAgICAgICAgICAgICAgICAgICAg ICBjb3VudF9tYXNrID0gfigtMSA8PCAoY291bnRfbWFzayArIDEpKTsKKyAgICAgICAgICAgICAg ICAgICAgICAgICAgdGhyZWFkc19sMiA9IChzaGlwcGVkIC0gMSkgJiBjb3VudF9tYXNrOworICAg ICAgICAgICAgICAgICAgICAgICAgICBjb3VudCAmPSB+MHgxOworICAgICAgICAgICAgICAgICAg ICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBlbHNlIGlm ICh0eXBlID09IDB4MjAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAg ICAgICAgLyogQ291bnQgY29yZS4gICovCisgICAgICAgICAgICAgICAgICAgICAgaWYgKChjb3Vu dCAmICgweDEgPDwgMSkpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAg ICAgICAgICAgICAgICBpbnQgY291bnRfbWFzazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAg aW50IHRocmVhZHNfY29yZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gKGxldmVsID09 IDIgPyB0aHJlYWRzX2wyIDogdGhyZWFkc19sMyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAg ICAgLyogQ29tcHV0ZSBjb3VudCBtYXNrLiAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAg YXNtICgiYnNyICUxLCAlMCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICI9ciIg KGNvdW50X21hc2spIDogImciICh0aHJlYWRzX2NvcmUpKTsKKyAgICAgICAgICAgICAgICAgICAg ICAgICAgY291bnRfbWFzayA9IH4oLTEgPDwgKGNvdW50X21hc2sgKyAxKSk7CisgICAgICAgICAg ICAgICAgICAgICAgICAgIHRocmVhZHNfY29yZSA9IChzaGlwcGVkIC0gMSkgJiBjb3VudF9tYXNr OworICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGV2ZWwgPT0gMikKKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICB0aHJlYWRzX2wyID0gdGhyZWFkc19jb3JlOworICAgICAgICAgICAg ICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkc19s MyA9IHRocmVhZHNfY29yZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQgJj0gfigw eDEgPDwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAg IH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgaWYgKHRocmVh ZHNfbDIgPiAwKQorICAgICAgICAgICAgdGhyZWFkc19sMiArPSAxOworICAgICAgICAgIGlmICh0 aHJlYWRzX2wzID4gMCkKKyAgICAgICAgICAgIHRocmVhZHNfbDMgKz0gMTsKKyAgICAgICAgICBp ZiAobGV2ZWwgPT0gMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKHRocmVhZHNf bDIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgdGhyZWFkcyA9IHRocmVh ZHNfbDI7CisgICAgICAgICAgICAgICAgICBpZiAoY3B1X2ZlYXR1cmVzLT5iYXNpYy5raW5kID09 IGFyY2hfa2luZF9pbnRlbAorICAgICAgICAgICAgICAgICAgICAgICYmIHRocmVhZHMgPiAyCisg ICAgICAgICAgICAgICAgICAgICAgJiYgZmFtaWx5ID09IDYpCisgICAgICAgICAgICAgICAgICAg IHN3aXRjaCAobW9kZWwpCisgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAg ICAgICAgICAgY2FzZSAweDM3OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAweDRhOgor ICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAweDRkOgorICAgICAgICAgICAgICAgICAgICAg ICAgY2FzZSAweDVhOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAweDVkOgorICAgICAg ICAgICAgICAgICAgICAgICAgICAvKiBTaWx2ZXJtb250IGhhcyBMMiBjYWNoZSBzaGFyZWQgYnkg MiBjb3Jlcy4gICovCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZHMgPSAyOworICAg ICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRl ZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAg ICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxz ZSBpZiAodGhyZWFkc19sMykKKyAgICAgICAgICAgIHRocmVhZHMgPSB0aHJlYWRzX2wzOworICAg ICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKK2ludGVsX2J1Z19ub19jYWNoZV9pbmZvOgor ICAgICAgICAgIC8qIEFzc3VtZSB0aGF0IGFsbCBsb2dpY2FsIHRocmVhZHMgc2hhcmUgdGhlIGhp Z2hlc3QgY2FjaGUKKyAgICAgICAgICAgICBsZXZlbC4gICovCisgICAgICAgICAgdGhyZWFkcwor ICAgICAgICAgICAgPSAoKGNwdV9mZWF0dXJlcy0+ZmVhdHVyZXNbQ09NTU9OX0NQVUlEX0lOREVY XzFdLmNwdWlkLmVieAorICAgICAgICAgICAgICAgID4+IDE2KSAmIDB4ZmYpOworICAgICAgICB9 CisKKyAgICAgICAgLyogQ2FwIHVzYWdlIG9mIGhpZ2hlc3QgY2FjaGUgbGV2ZWwgdG8gdGhlIG51 bWJlciBvZiBzdXBwb3J0ZWQKKyAgICAgICAgICAgdGhyZWFkcy4gICovCisgICAgICAgIGlmIChz aGFyZWQgPiAwICYmIHRocmVhZHMgPiAwKQorICAgICAgICAgIHNoYXJlZCAvPSB0aHJlYWRzOwor ICAgIH0KKworICAvKiBBY2NvdW50IGZvciBub24taW5jbHVzaXZlIEwyIGFuZCBMMyBjYWNoZXMu ICAqLworICBpZiAoIWluY2x1c2l2ZV9jYWNoZSkKKyAgICB7CisgICAgICBpZiAodGhyZWFkc19s MiA+IDApCisgICAgICAgIGNvcmUgLz0gdGhyZWFkc19sMjsKKyAgICAgIHNoYXJlZCArPSBjb3Jl OworICAgIH0KKworICAqc2hhcmVkX3B0ciA9IHNoYXJlZDsKKyAgKnRocmVhZHNfcHRyID0gdGhy ZWFkczsKK30KKworc3RhdGljIHZvaWQKK2RsX2luaXRfY2FjaGVpbmZvIChzdHJ1Y3QgY3B1X2Zl YXR1cmVzICpjcHVfZmVhdHVyZXMpCit7CisgIC8qIEZpbmQgb3V0IHdoYXQgYnJhbmQgb2YgcHJv Y2Vzc29yLiAgKi8KKyAgdW5zaWduZWQgaW50IGVieDsKKyAgdW5zaWduZWQgaW50IGVjeDsKKyAg dW5zaWduZWQgaW50IGVkeDsKKyAgaW50IG1heF9jcHVpZF9leDsKKyAgbG9uZyBpbnQgZGF0YSA9 IC0xOworICBsb25nIGludCBzaGFyZWQgPSAtMTsKKyAgbG9uZyBpbnQgY29yZTsKKyAgdW5zaWdu ZWQgaW50IHRocmVhZHMgPSAwOworICB1bnNpZ25lZCBsb25nIGludCBsZXZlbDFfaWNhY2hlX3Np emUgPSAtMTsKKyAgdW5zaWduZWQgbG9uZyBpbnQgbGV2ZWwxX2RjYWNoZV9zaXplID0gLTE7Cisg IHVuc2lnbmVkIGxvbmcgaW50IGxldmVsMV9kY2FjaGVfYXNzb2MgPSAtMTsKKyAgdW5zaWduZWQg bG9uZyBpbnQgbGV2ZWwxX2RjYWNoZV9saW5lc2l6ZSA9IC0xOworICB1bnNpZ25lZCBsb25nIGlu dCBsZXZlbDJfY2FjaGVfc2l6ZSA9IC0xOworICB1bnNpZ25lZCBsb25nIGludCBsZXZlbDJfY2Fj aGVfYXNzb2MgPSAtMTsKKyAgdW5zaWduZWQgbG9uZyBpbnQgbGV2ZWwyX2NhY2hlX2xpbmVzaXpl ID0gLTE7CisgIHVuc2lnbmVkIGxvbmcgaW50IGxldmVsM19jYWNoZV9zaXplID0gLTE7CisgIHVu c2lnbmVkIGxvbmcgaW50IGxldmVsM19jYWNoZV9hc3NvYyA9IC0xOworICB1bnNpZ25lZCBsb25n IGludCBsZXZlbDNfY2FjaGVfbGluZXNpemUgPSAtMTsKKyAgdW5zaWduZWQgbG9uZyBpbnQgbGV2 ZWw0X2NhY2hlX3NpemUgPSAtMTsKKworICBpZiAoY3B1X2ZlYXR1cmVzLT5iYXNpYy5raW5kID09 IGFyY2hfa2luZF9pbnRlbCkKKyAgICB7CisgICAgICBkYXRhID0gaGFuZGxlX2ludGVsIChfU0Nf TEVWRUwxX0RDQUNIRV9TSVpFLCBjcHVfZmVhdHVyZXMpOworICAgICAgY29yZSA9IGhhbmRsZV9p bnRlbCAoX1NDX0xFVkVMMl9DQUNIRV9TSVpFLCBjcHVfZmVhdHVyZXMpOworICAgICAgc2hhcmVk ID0gaGFuZGxlX2ludGVsIChfU0NfTEVWRUwzX0NBQ0hFX1NJWkUsIGNwdV9mZWF0dXJlcyk7CisK KyAgICAgIGxldmVsMV9pY2FjaGVfc2l6ZQorCT0gaGFuZGxlX2ludGVsIChfU0NfTEVWRUwxX0lD QUNIRV9TSVpFLCBjcHVfZmVhdHVyZXMpOworICAgICAgbGV2ZWwxX2RjYWNoZV9zaXplID0gZGF0 YTsKKyAgICAgIGxldmVsMV9kY2FjaGVfYXNzb2MKKwk9IGhhbmRsZV9pbnRlbCAoX1NDX0xFVkVM MV9EQ0FDSEVfQVNTT0MsIGNwdV9mZWF0dXJlcyk7CisgICAgICBsZXZlbDFfZGNhY2hlX2xpbmVz aXplCisJPSBoYW5kbGVfaW50ZWwgKF9TQ19MRVZFTDFfRENBQ0hFX0xJTkVTSVpFLCBjcHVfZmVh dHVyZXMpOworICAgICAgbGV2ZWwyX2NhY2hlX3NpemUgPSBjb3JlOworICAgICAgbGV2ZWwyX2Nh Y2hlX2Fzc29jCisJPSBoYW5kbGVfaW50ZWwgKF9TQ19MRVZFTDJfQ0FDSEVfQVNTT0MsIGNwdV9m ZWF0dXJlcyk7CisgICAgICBsZXZlbDJfY2FjaGVfbGluZXNpemUKKwk9IGhhbmRsZV9pbnRlbCAo X1NDX0xFVkVMMl9DQUNIRV9MSU5FU0laRSwgY3B1X2ZlYXR1cmVzKTsKKyAgICAgIGxldmVsM19j YWNoZV9zaXplID0gc2hhcmVkOworICAgICAgbGV2ZWwzX2NhY2hlX2Fzc29jCisJPSBoYW5kbGVf aW50ZWwgKF9TQ19MRVZFTDNfQ0FDSEVfQVNTT0MsIGNwdV9mZWF0dXJlcyk7CisgICAgICBsZXZl bDNfY2FjaGVfbGluZXNpemUKKwk9IGhhbmRsZV9pbnRlbCAoX1NDX0xFVkVMM19DQUNIRV9MSU5F U0laRSwgY3B1X2ZlYXR1cmVzKTsKKyAgICAgIGxldmVsNF9jYWNoZV9zaXplCisJPSBoYW5kbGVf aW50ZWwgKF9TQ19MRVZFTDRfQ0FDSEVfU0laRSwgY3B1X2ZlYXR1cmVzKTsKKworICAgICAgZ2V0 X2NvbW1vbl9jYWNoZV9pbmZvICgmc2hhcmVkLCAmdGhyZWFkcywgY29yZSk7CisgICAgfQorICBl bHNlIGlmIChjcHVfZmVhdHVyZXMtPmJhc2ljLmtpbmQgPT0gYXJjaF9raW5kX3poYW94aW4pCisg ICAgeworICAgICAgZGF0YSA9IGhhbmRsZV96aGFveGluIChfU0NfTEVWRUwxX0RDQUNIRV9TSVpF KTsKKyAgICAgIGNvcmUgPSBoYW5kbGVfemhhb3hpbiAoX1NDX0xFVkVMMl9DQUNIRV9TSVpFKTsK KyAgICAgIHNoYXJlZCA9IGhhbmRsZV96aGFveGluIChfU0NfTEVWRUwzX0NBQ0hFX1NJWkUpOwor CisgICAgICBsZXZlbDFfaWNhY2hlX3NpemUgPSBoYW5kbGVfemhhb3hpbiAoX1NDX0xFVkVMMV9J Q0FDSEVfU0laRSk7CisgICAgICBsZXZlbDFfZGNhY2hlX3NpemUgPSBkYXRhOworICAgICAgbGV2 ZWwxX2RjYWNoZV9hc3NvYyA9IGhhbmRsZV96aGFveGluIChfU0NfTEVWRUwxX0RDQUNIRV9BU1NP Qyk7CisgICAgICBsZXZlbDFfZGNhY2hlX2xpbmVzaXplID0gaGFuZGxlX3poYW94aW4gKF9TQ19M RVZFTDFfRENBQ0hFX0xJTkVTSVpFKTsKKyAgICAgIGxldmVsMl9jYWNoZV9zaXplID0gY29yZTsK KyAgICAgIGxldmVsMl9jYWNoZV9hc3NvYyA9IGhhbmRsZV96aGFveGluIChfU0NfTEVWRUwyX0NB Q0hFX0FTU09DKTsKKyAgICAgIGxldmVsMl9jYWNoZV9saW5lc2l6ZSA9IGhhbmRsZV96aGFveGlu IChfU0NfTEVWRUwyX0NBQ0hFX0xJTkVTSVpFKTsKKyAgICAgIGxldmVsM19jYWNoZV9zaXplID0g c2hhcmVkOworICAgICAgbGV2ZWwzX2NhY2hlX2Fzc29jID0gaGFuZGxlX3poYW94aW4gKF9TQ19M RVZFTDNfQ0FDSEVfQVNTT0MpOworICAgICAgbGV2ZWwzX2NhY2hlX2xpbmVzaXplID0gaGFuZGxl X3poYW94aW4gKF9TQ19MRVZFTDNfQ0FDSEVfTElORVNJWkUpOworCisgICAgICBnZXRfY29tbW9u X2NhY2hlX2luZm8gKCZzaGFyZWQsICZ0aHJlYWRzLCBjb3JlKTsKKyAgICB9CisgIGVsc2UgaWYg KGNwdV9mZWF0dXJlcy0+YmFzaWMua2luZCA9PSBhcmNoX2tpbmRfYW1kKQorICAgIHsKKyAgICAg IGRhdGEgID0gaGFuZGxlX2FtZCAoX1NDX0xFVkVMMV9EQ0FDSEVfU0laRSk7CisgICAgICBjb3Jl ID0gaGFuZGxlX2FtZCAoX1NDX0xFVkVMMl9DQUNIRV9TSVpFKTsKKyAgICAgIHNoYXJlZCA9IGhh bmRsZV9hbWQgKF9TQ19MRVZFTDNfQ0FDSEVfU0laRSk7CisKKyAgICAgIGxldmVsMV9pY2FjaGVf c2l6ZSA9IGhhbmRsZV9hbWQgKF9TQ19MRVZFTDFfSUNBQ0hFX1NJWkUpOworICAgICAgbGV2ZWwx X2RjYWNoZV9zaXplID0gZGF0YTsKKyAgICAgIGxldmVsMV9kY2FjaGVfYXNzb2MgPSBoYW5kbGVf YW1kIChfU0NfTEVWRUwxX0RDQUNIRV9BU1NPQyk7CisgICAgICBsZXZlbDFfZGNhY2hlX2xpbmVz aXplID0gaGFuZGxlX2FtZCAoX1NDX0xFVkVMMV9EQ0FDSEVfTElORVNJWkUpOworICAgICAgbGV2 ZWwyX2NhY2hlX3NpemUgPSBjb3JlOworICAgICAgbGV2ZWwyX2NhY2hlX2Fzc29jID0gaGFuZGxl X2FtZCAoX1NDX0xFVkVMMl9DQUNIRV9BU1NPQyk7CisgICAgICBsZXZlbDJfY2FjaGVfbGluZXNp emUgPSBoYW5kbGVfYW1kIChfU0NfTEVWRUwyX0NBQ0hFX0xJTkVTSVpFKTsKKyAgICAgIGxldmVs M19jYWNoZV9zaXplID0gc2hhcmVkOworICAgICAgbGV2ZWwzX2NhY2hlX2Fzc29jID0gaGFuZGxl X2FtZCAoX1NDX0xFVkVMM19DQUNIRV9BU1NPQyk7CisgICAgICBsZXZlbDNfY2FjaGVfbGluZXNp emUgPSBoYW5kbGVfYW1kIChfU0NfTEVWRUwzX0NBQ0hFX0xJTkVTSVpFKTsKKworICAgICAgLyog R2V0IG1heGltdW0gZXh0ZW5kZWQgZnVuY3Rpb24uICovCisgICAgICBfX2NwdWlkICgweDgwMDAw MDAwLCBtYXhfY3B1aWRfZXgsIGVieCwgZWN4LCBlZHgpOworCisgICAgICBpZiAoc2hhcmVkIDw9 IDApCisJLyogTm8gc2hhcmVkIEwzIGNhY2hlLiAgQWxsIHdlIGhhdmUgaXMgdGhlIEwyIGNhY2hl LiAgKi8KKwlzaGFyZWQgPSBjb3JlOworICAgICAgZWxzZQorCXsKKwkgIC8qIEZpZ3VyZSBvdXQg dGhlIG51bWJlciBvZiBsb2dpY2FsIHRocmVhZHMgdGhhdCBzaGFyZSBMMy4gICovCisJICBpZiAo bWF4X2NwdWlkX2V4ID49IDB4ODAwMDAwMDgpCisJICAgIHsKKwkgICAgICAvKiBHZXQgd2lkdGgg b2YgQVBJQyBJRC4gICovCisJICAgICAgX19jcHVpZCAoMHg4MDAwMDAwOCwgbWF4X2NwdWlkX2V4 LCBlYngsIGVjeCwgZWR4KTsKKwkgICAgICB0aHJlYWRzID0gMSA8PCAoKGVjeCA+PiAxMikgJiAw eDBmKTsKKwkgICAgfQorCisJICBpZiAodGhyZWFkcyA9PSAwIHx8IGNwdV9mZWF0dXJlcy0+YmFz aWMuZmFtaWx5ID49IDB4MTcpCisJICAgIHsKKwkgICAgICAvKiBJZiBBUElDIElEIHdpZHRoIGlz IG5vdCBhdmFpbGFibGUsIHVzZSBsb2dpY2FsCisJCSBwcm9jZXNzb3IgY291bnQuICAqLworCSAg ICAgIF9fY3B1aWQgKDB4MDAwMDAwMDEsIG1heF9jcHVpZF9leCwgZWJ4LCBlY3gsIGVkeCk7CisK KwkgICAgICBpZiAoKGVkeCAmICgxIDw8IDI4KSkgIT0gMCkKKwkJdGhyZWFkcyA9IChlYnggPj4g MTYpICYgMHhmZjsKKwkgICAgfQorCisJICAvKiBDYXAgdXNhZ2Ugb2YgaGlnaGVzdCBjYWNoZSBs ZXZlbCB0byB0aGUgbnVtYmVyIG9mCisJICAgICBzdXBwb3J0ZWQgdGhyZWFkcy4gICovCisJICBp ZiAodGhyZWFkcyA+IDApCisJICAgIHNoYXJlZCAvPSB0aHJlYWRzOworCisJICAvKiBHZXQgc2hh cmVkIGNhY2hlIHBlciBjY3ggZm9yIFplbiBhcmNoaXRlY3R1cmVzLiAgKi8KKwkgIGlmIChjcHVf ZmVhdHVyZXMtPmJhc2ljLmZhbWlseSA+PSAweDE3KQorCSAgICB7CisJICAgICAgdW5zaWduZWQg aW50IGVheDsKKworCSAgICAgIC8qIEdldCBudW1iZXIgb2YgdGhyZWFkcyBzaGFyZSB0aGUgTDMg Y2FjaGUgaW4gQ0NYLiAgKi8KKwkgICAgICBfX2NwdWlkX2NvdW50ICgweDgwMDAwMDFELCAweDMs IGVheCwgZWJ4LCBlY3gsIGVkeCk7CisKKwkgICAgICB1bnNpZ25lZCBpbnQgdGhyZWFkc19wZXJf Y2N4ID0gKChlYXggPj4gMTQpICYgMHhmZmYpICsgMTsKKwkgICAgICBzaGFyZWQgKj0gdGhyZWFk c19wZXJfY2N4OworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICAvKiBBY2NvdW50IGZv ciBleGNsdXNpdmUgTDIgYW5kIEwzIGNhY2hlcy4gICovCisJICAgICAgc2hhcmVkICs9IGNvcmU7 CisgICAgICAgICAgICB9CisJfQorICAgIH0KKworICBjcHVfZmVhdHVyZXMtPmxldmVsMV9pY2Fj aGVfc2l6ZSA9IGxldmVsMV9pY2FjaGVfc2l6ZTsKKyAgY3B1X2ZlYXR1cmVzLT5sZXZlbDFfZGNh Y2hlX3NpemUgPSBsZXZlbDFfZGNhY2hlX3NpemU7CisgIGNwdV9mZWF0dXJlcy0+bGV2ZWwxX2Rj YWNoZV9hc3NvYyA9IGxldmVsMV9kY2FjaGVfYXNzb2M7CisgIGNwdV9mZWF0dXJlcy0+bGV2ZWwx X2RjYWNoZV9saW5lc2l6ZSA9IGxldmVsMV9kY2FjaGVfbGluZXNpemU7CisgIGNwdV9mZWF0dXJl cy0+bGV2ZWwyX2NhY2hlX3NpemUgPSBsZXZlbDJfY2FjaGVfc2l6ZTsKKyAgY3B1X2ZlYXR1cmVz LT5sZXZlbDJfY2FjaGVfYXNzb2MgPSBsZXZlbDJfY2FjaGVfYXNzb2M7CisgIGNwdV9mZWF0dXJl cy0+bGV2ZWwyX2NhY2hlX2xpbmVzaXplID0gbGV2ZWwyX2NhY2hlX2xpbmVzaXplOworICBjcHVf ZmVhdHVyZXMtPmxldmVsM19jYWNoZV9zaXplID0gbGV2ZWwzX2NhY2hlX3NpemU7CisgIGNwdV9m ZWF0dXJlcy0+bGV2ZWwzX2NhY2hlX2Fzc29jID0gbGV2ZWwzX2NhY2hlX2Fzc29jOworICBjcHVf ZmVhdHVyZXMtPmxldmVsM19jYWNoZV9saW5lc2l6ZSA9IGxldmVsM19jYWNoZV9saW5lc2l6ZTsK KyAgY3B1X2ZlYXR1cmVzLT5sZXZlbDRfY2FjaGVfc2l6ZSA9IGxldmVsNF9jYWNoZV9zaXplOwor CisgIC8qIFRoZSBkZWZhdWx0IHNldHRpbmcgZm9yIHRoZSBub25fdGVtcG9yYWwgdGhyZXNob2xk IGlzIDMvNCBvZiBvbmUKKyAgICAgdGhyZWFkJ3Mgc2hhcmUgb2YgdGhlIGNoaXAncyBjYWNoZS4g Rm9yIG1vc3QgSW50ZWwgYW5kIEFNRCBwcm9jZXNzb3JzCisgICAgIHdpdGggYW4gaW5pdGlhbCBy ZWxlYXNlIGRhdGUgYmV0d2VlbiAyMDE3IGFuZCAyMDIwLCBhIHRocmVhZCdzIHR5cGljYWwKKyAg ICAgc2hhcmUgb2YgdGhlIGNhY2hlIGlzIGZyb20gNTAwIEtCeXRlcyB0byAyIE1CeXRlcy4gVXNp bmcgdGhlIDMvNAorICAgICB0aHJlc2hvbGQgbGVhdmVzIDEyNSBLQnl0ZXMgdG8gNTAwIEtCeXRl cyBvZiB0aGUgdGhyZWFkJ3MgZGF0YQorICAgICBpbiBjYWNoZSBhZnRlciBhIG1heGltdW0gdGVt cG9yYWwgY29weSwgd2hpY2ggd2lsbCBtYWludGFpbgorICAgICBpbiBjYWNoZSBhIHJlYXNvbmFi bGUgcG9ydGlvbiBvZiB0aGUgdGhyZWFkJ3Mgc3RhY2sgYW5kIG90aGVyCisgICAgIGFjdGl2ZSBk YXRhLiBJZiB0aGUgdGhyZXNob2xkIGlzIHNldCBoaWdoZXIgdGhhbiBvbmUgdGhyZWFkJ3MKKyAg ICAgc2hhcmUgb2YgdGhlIGNhY2hlLCBpdCBoYXMgYSBzdWJzdGFudGlhbCByaXNrIG9mIG5lZ2F0 aXZlbHkKKyAgICAgaW1wYWN0aW5nIHRoZSBwZXJmb3JtYW5jZSBvZiBvdGhlciB0aHJlYWRzIHJ1 bm5pbmcgb24gdGhlIGNoaXAuICovCisgIHVuc2lnbmVkIGxvbmcgaW50IG5vbl90ZW1wb3JhbF90 aHJlc2hvbGQgPSBzaGFyZWQgKiAzIC8gNDsKKworI2lmIEhBVkVfVFVOQUJMRVMKKyAgLyogTkI6 IFRoZSBSRVAgTU9WU0IgdGhyZXNob2xkIG11c3QgYmUgZ3JlYXRlciB0aGFuIFZFQ19TSVpFICog OC4gICovCisgIHVuc2lnbmVkIGludCBtaW5pbXVtX3JlcF9tb3ZzYl90aHJlc2hvbGQ7CisjZW5k aWYKKyAgLyogTkI6IFRoZSBkZWZhdWx0IFJFUCBNT1ZTQiB0aHJlc2hvbGQgaXMgMjA0OCAqIChW RUNfU0laRSAvIDE2KS4gICovCisgIHVuc2lnbmVkIGludCByZXBfbW92c2JfdGhyZXNob2xkOwor ICBpZiAoQ1BVX0ZFQVRVUkVfVVNBQkxFX1AgKGNwdV9mZWF0dXJlcywgQVZYNTEyRikKKyAgICAg ICYmICFDUFVfRkVBVFVSRV9QUkVGRVJSRURfUCAoY3B1X2ZlYXR1cmVzLCBQcmVmZXJfTm9fQVZY NTEyKSkKKyAgICB7CisgICAgICByZXBfbW92c2JfdGhyZXNob2xkID0gMjA0OCAqICg2NCAvIDE2 KTsKKyNpZiBIQVZFX1RVTkFCTEVTCisgICAgICBtaW5pbXVtX3JlcF9tb3ZzYl90aHJlc2hvbGQg PSA2NCAqIDg7CisjZW5kaWYKKyAgICB9CisgIGVsc2UgaWYgKENQVV9GRUFUVVJFX1BSRUZFUlJF RF9QIChjcHVfZmVhdHVyZXMsCisJCQkJICAgIEFWWF9GYXN0X1VuYWxpZ25lZF9Mb2FkKSkKKyAg ICB7CisgICAgICByZXBfbW92c2JfdGhyZXNob2xkID0gMjA0OCAqICgzMiAvIDE2KTsKKyNpZiBI QVZFX1RVTkFCTEVTCisgICAgICBtaW5pbXVtX3JlcF9tb3ZzYl90aHJlc2hvbGQgPSAzMiAqIDg7 CisjZW5kaWYKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICByZXBfbW92c2JfdGhyZXNob2xk ID0gMjA0OCAqICgxNiAvIDE2KTsKKyNpZiBIQVZFX1RVTkFCTEVTCisgICAgICBtaW5pbXVtX3Jl cF9tb3ZzYl90aHJlc2hvbGQgPSAxNiAqIDg7CisjZW5kaWYKKyAgICB9CisKKyAgLyogVGhlIGRl ZmF1bHQgdGhyZXNob2xkIHRvIHVzZSBFbmhhbmNlZCBSRVAgU1RPU0IuICAqLworICB1bnNpZ25l ZCBsb25nIGludCByZXBfc3Rvc2JfdGhyZXNob2xkID0gMjA0ODsKKworI2lmIEhBVkVfVFVOQUJM RVMKKyAgbG9uZyBpbnQgdHVuYWJsZV9zaXplOworCisgIHR1bmFibGVfc2l6ZSA9IFRVTkFCTEVf R0VUICh4ODZfZGF0YV9jYWNoZV9zaXplLCBsb25nIGludCwgTlVMTCk7CisgIC8qIE5COiBJZ25v cmUgdGhlIGRlZmF1bHQgdmFsdWUgMC4gICovCisgIGlmICh0dW5hYmxlX3NpemUgIT0gMCkKKyAg ICBkYXRhID0gdHVuYWJsZV9zaXplOworCisgIHR1bmFibGVfc2l6ZSA9IFRVTkFCTEVfR0VUICh4 ODZfc2hhcmVkX2NhY2hlX3NpemUsIGxvbmcgaW50LCBOVUxMKTsKKyAgLyogTkI6IElnbm9yZSB0 aGUgZGVmYXVsdCB2YWx1ZSAwLiAgKi8KKyAgaWYgKHR1bmFibGVfc2l6ZSAhPSAwKQorICAgIHNo YXJlZCA9IHR1bmFibGVfc2l6ZTsKKworICB0dW5hYmxlX3NpemUgPSBUVU5BQkxFX0dFVCAoeDg2 X25vbl90ZW1wb3JhbF90aHJlc2hvbGQsIGxvbmcgaW50LCBOVUxMKTsKKyAgLyogTkI6IElnbm9y ZSB0aGUgZGVmYXVsdCB2YWx1ZSAwLiAgKi8KKyAgaWYgKHR1bmFibGVfc2l6ZSAhPSAwKQorICAg IG5vbl90ZW1wb3JhbF90aHJlc2hvbGQgPSB0dW5hYmxlX3NpemU7CisKKyAgdHVuYWJsZV9zaXpl ID0gVFVOQUJMRV9HRVQgKHg4Nl9yZXBfbW92c2JfdGhyZXNob2xkLCBsb25nIGludCwgTlVMTCk7 CisgIGlmICh0dW5hYmxlX3NpemUgPiBtaW5pbXVtX3JlcF9tb3ZzYl90aHJlc2hvbGQpCisgICAg cmVwX21vdnNiX3RocmVzaG9sZCA9IHR1bmFibGVfc2l6ZTsKKworICAvKiBOQjogVGhlIGRlZmF1 bHQgdmFsdWUgb2YgdGhlIHg4Nl9yZXBfc3Rvc2JfdGhyZXNob2xkIHR1bmFibGUgaXMgdGhlCisg ICAgIHNhbWUgYXMgdGhlIGRlZmF1bHQgdmFsdWUgb2YgX194ODZfcmVwX3N0b3NiX3RocmVzaG9s ZCBhbmQgdGhlCisgICAgIG1pbmltdW0gdmFsdWUgaXMgZml4ZWQuICAqLworICByZXBfc3Rvc2Jf dGhyZXNob2xkID0gVFVOQUJMRV9HRVQgKHg4Nl9yZXBfc3Rvc2JfdGhyZXNob2xkLAorCQkJCSAg ICAgbG9uZyBpbnQsIE5VTEwpOworCisgIFRVTkFCTEVfU0VUX1dJVEhfQk9VTkRTICh4ODZfZGF0 YV9jYWNoZV9zaXplLCBsb25nIGludCwgZGF0YSwKKwkJCSAgIDAsIChsb25nIGludCkgLTEpOwor ICBUVU5BQkxFX1NFVF9XSVRIX0JPVU5EUyAoeDg2X3NoYXJlZF9jYWNoZV9zaXplLCBsb25nIGlu dCwgc2hhcmVkLAorCQkJICAgMCwgKGxvbmcgaW50KSAtMSk7CisgIFRVTkFCTEVfU0VUX1dJVEhf Qk9VTkRTICh4ODZfbm9uX3RlbXBvcmFsX3RocmVzaG9sZCwgbG9uZyBpbnQsCisJCQkgICBub25f dGVtcG9yYWxfdGhyZXNob2xkLCAwLCAobG9uZyBpbnQpIC0xKTsKKyAgVFVOQUJMRV9TRVRfV0lU SF9CT1VORFMgKHg4Nl9yZXBfbW92c2JfdGhyZXNob2xkLCBsb25nIGludCwKKwkJCSAgIHJlcF9t b3ZzYl90aHJlc2hvbGQsCisJCQkgICBtaW5pbXVtX3JlcF9tb3ZzYl90aHJlc2hvbGQsIChsb25n IGludCkgLTEpOworICBUVU5BQkxFX1NFVF9XSVRIX0JPVU5EUyAoeDg2X3JlcF9zdG9zYl90aHJl c2hvbGQsIGxvbmcgaW50LAorCQkJICAgcmVwX3N0b3NiX3RocmVzaG9sZCwgMSwgKGxvbmcgaW50 KSAtMSk7CisjZW5kaWYKKworICBjcHVfZmVhdHVyZXMtPmRhdGFfY2FjaGVfc2l6ZSA9IGRhdGE7 CisgIGNwdV9mZWF0dXJlcy0+c2hhcmVkX2NhY2hlX3NpemUgPSBzaGFyZWQ7CisgIGNwdV9mZWF0 dXJlcy0+bm9uX3RlbXBvcmFsX3RocmVzaG9sZCA9IG5vbl90ZW1wb3JhbF90aHJlc2hvbGQ7Cisg IGNwdV9mZWF0dXJlcy0+cmVwX21vdnNiX3RocmVzaG9sZCA9IHJlcF9tb3ZzYl90aHJlc2hvbGQ7 CisgIGNwdV9mZWF0dXJlcy0+cmVwX3N0b3NiX3RocmVzaG9sZCA9IHJlcF9zdG9zYl90aHJlc2hv bGQ7Cit9CmRpZmYgLS1naXQgYS9zeXNkZXBzL3g4Ni9pbmNsdWRlL2NwdS1mZWF0dXJlcy5oIGIv c3lzZGVwcy94ODYvaW5jbHVkZS9jcHUtZmVhdHVyZXMuaAppbmRleCA5OWU3ZWUwOGNmLi41MGNi NWExNWY1IDEwMDY0NAotLS0gYS9zeXNkZXBzL3g4Ni9pbmNsdWRlL2NwdS1mZWF0dXJlcy5oCisr KyBiL3N5c2RlcHMveDg2L2luY2x1ZGUvY3B1LWZlYXR1cmVzLmgKQEAgLTE0OSw2ICsxNDksMjgg QEAgc3RydWN0IGNwdV9mZWF0dXJlcwogICB1bnNpZ25lZCBsb25nIGludCByZXBfbW92c2JfdGhy ZXNob2xkOwogICAvKiBUaHJlc2hvbGQgdG8gdXNlICJyZXAgc3Rvc2IiLiAgKi8KICAgdW5zaWdu ZWQgbG9uZyBpbnQgcmVwX3N0b3NiX3RocmVzaG9sZDsKKyAgLyogX1NDX0xFVkVMMV9JQ0FDSEVf U0laRS4gICovCisgIHVuc2lnbmVkIGxvbmcgaW50IGxldmVsMV9pY2FjaGVfc2l6ZTsKKyAgLyog X1NDX0xFVkVMMV9EQ0FDSEVfU0laRS4gICovCisgIHVuc2lnbmVkIGxvbmcgaW50IGxldmVsMV9k Y2FjaGVfc2l6ZTsKKyAgLyogX1NDX0xFVkVMMV9EQ0FDSEVfQVNTT0MuICAqLworICB1bnNpZ25l ZCBsb25nIGludCBsZXZlbDFfZGNhY2hlX2Fzc29jOworICAvKiBfU0NfTEVWRUwxX0RDQUNIRV9M SU5FU0laRS4gICovCisgIHVuc2lnbmVkIGxvbmcgaW50IGxldmVsMV9kY2FjaGVfbGluZXNpemU7 CisgIC8qIF9TQ19MRVZFTDJfQ0FDSEVfQVNTT0MuICAqLworICB1bnNpZ25lZCBsb25nIGludCBs ZXZlbDJfY2FjaGVfc2l6ZTsKKyAgLyogX1NDX0xFVkVMMl9EQ0FDSEVfQVNTT0MuICAqLworICB1 bnNpZ25lZCBsb25nIGludCBsZXZlbDJfY2FjaGVfYXNzb2M7CisgIC8qIF9TQ19MRVZFTDJfQ0FD SEVfTElORVNJWkUuICAqLworICB1bnNpZ25lZCBsb25nIGludCBsZXZlbDJfY2FjaGVfbGluZXNp emU7CisgIC8qIC9fU0NfTEVWRUwzX0NBQ0hFX1NJWkUuICAqLworICB1bnNpZ25lZCBsb25nIGlu dCBsZXZlbDNfY2FjaGVfc2l6ZTsKKyAgLyogX1NDX0xFVkVMM19DQUNIRV9BU1NPQy4gICovCisg IHVuc2lnbmVkIGxvbmcgaW50IGxldmVsM19jYWNoZV9hc3NvYzsKKyAgLyogX1NDX0xFVkVMM19D QUNIRV9MSU5FU0laRS4gICovCisgIHVuc2lnbmVkIGxvbmcgaW50IGxldmVsM19jYWNoZV9saW5l c2l6ZTsKKyAgLyogL19TQ19MRVZFTDRfQ0FDSEVfU0laRS4gICovCisgIHVuc2lnbmVkIGxvbmcg aW50IGxldmVsNF9jYWNoZV9zaXplOwogfTsKIAogI2lmIGRlZmluZWQgKF9MSUJDKSAmJiAhSVNf SU4gKG5vbmxpYikKLS0gCjIuMjkuMgoK --000000000000ecdb9d05b8e1430b--