From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pl1-f171.google.com (mail-pl1-f171.google.com [209.85.214.171]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7B59EC12C for ; Thu, 2 May 2024 22:31:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.171 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1714689085; cv=none; b=Yulk/JkeqMZZZbpjYlk1eex1p4spEH6QRn7fxtg5n2lNIrdxVRFtnVlinIxovLhlOH59grlT3LVFaPyvOWm/iih57MNdqhrpMb47r7yTP9lwb03aT+3KdxwxIktHt6gthGg0XE+mR4fgvFtq3ksPCvakuAtzp5Tmg2m4hacIwPk= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1714689085; c=relaxed/simple; bh=f82peEUjrrTIPyTLZwB1hItFW5o9yEFomHOt1jtuqEQ=; h=Date:From:To:Cc:Subject:Message-ID:References:MIME-Version: Content-Type:Content-Disposition:In-Reply-To; b=gSj19SEPH4TkcU0p/2NYiCm3G4CSvXSHEuxxKR69TN5KGpurYdrfZnbJz5NQgVnW7L0Y28RHB8dtqW1l2ApheFw37IJBcUz1ur2qlGXJ7hZYLFUiHIZFH0+XYcH/8NCNEQ8UPrTOS4tRw0BDCInoLq59Se0EvtfvY1DJrZqOSU8= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=rivosinc.com; spf=pass smtp.mailfrom=rivosinc.com; dkim=pass (2048-bit key) header.d=rivosinc-com.20230601.gappssmtp.com header.i=@rivosinc-com.20230601.gappssmtp.com header.b=cGQb62gF; arc=none smtp.client-ip=209.85.214.171 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=rivosinc.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=rivosinc.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=rivosinc-com.20230601.gappssmtp.com header.i=@rivosinc-com.20230601.gappssmtp.com header.b="cGQb62gF" Received: by mail-pl1-f171.google.com with SMTP id d9443c01a7336-1e3c3aa8938so57072005ad.1 for ; Thu, 02 May 2024 15:31:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rivosinc-com.20230601.gappssmtp.com; s=20230601; t=1714689083; x=1715293883; darn=vger.kernel.org; h=in-reply-to:content-transfer-encoding:content-disposition :mime-version:references:message-id:subject:cc:to:from:date:from:to :cc:subject:date:message-id:reply-to; bh=Jyw7zxfMEtfqyw3yPaaOuPprN3b7DB1YugAVazrGrkk=; b=cGQb62gFbFeL04pZkWu00KsobaiEO+ScW4VM1V0cOD0OY8iFPkQdWhyCYgzFIKV9H1 D8mAil92WthL7p1ZvNPejdvY8NulvaLcmp61UxO+NxkWhKu30/6/67+aUQ9fyWmVTiAT MvwXyeXWqmLUff5gk0aCK2r88hcZAu89jQU8r9ad2zYc44Vzk8MbLvay7A9cpgWBV4Oj 4kO/ixtEXQRfSJuEkOkXnM8O5hVGoFDID1EBU7nx/aDzNtinMjAK/lpo+BA5BRNnSNYp v1RPfOH8CBLOBMClNKRtJFITpNrVHqVamBUc4SIuOxn972l583QJCEWi/NBDui0J83fw i7Sw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1714689083; x=1715293883; h=in-reply-to:content-transfer-encoding:content-disposition :mime-version:references:message-id:subject:cc:to:from:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=Jyw7zxfMEtfqyw3yPaaOuPprN3b7DB1YugAVazrGrkk=; b=lP/udadcsXBA3wyXTI9zJ1kuyCrECvlDOSFRUfsBmx5c0ztnVHxjQVGCBy+PM6VVjQ hR+mf4SfjDqlX8NraCCgZ/wk8SBPvATRUUg6K6PbX0ntlQTVIYn8sAXuahPB+0H0QR6A htnHe/MGxG9lb0fLDeGAb3WeAgTUQ1sHPtvPoQ3KDlzGI/C3JEu+PY+nl33doFULBPFs N4IQ2SsRWPB1jqiAa/QsoJ4PIm/lBZfkQavXq1b5oWbTOlTprSj9PrE2lbqMZer7qi6A xauEfr0zMctVeo9v17/deeL0kLac5yCKSn6/Z92slcwvbTt8Ks3YTJOl/zyqtmSSo448 ds/Q== X-Forwarded-Encrypted: i=1; AJvYcCUsjwoLyNMb2Xg6IbsZt+wCsZARFzOZNbupKSAlmHao5+OZ7kUH0LItqEGCMljjKnxeLXP/jZYnRRhmjcE0IDx8GVg2EncbUTCY X-Gm-Message-State: AOJu0YwYa38mFR+pWM2gBlwdfJrhcy1YF5sTz4IE5LoK4U1oCEGiQ19t jvXbe7n8agr9WY0Rc803mzfsoFEgm8tNURLptqUPbS2RjygU9cEqv7MdqdWmgYE= X-Google-Smtp-Source: AGHT+IFB+rtKMcM3DQ0bkb6f6tzj/9Q4q165q3JA8fWP2cX4VeLL+YWsW17aB2bGX2oOxX/u+yG8AQ== X-Received: by 2002:a17:902:f685:b0:1e4:9c2f:d343 with SMTP id l5-20020a170902f68500b001e49c2fd343mr1287136plg.7.1714689082510; Thu, 02 May 2024 15:31:22 -0700 (PDT) Received: from ghost ([50.145.13.30]) by smtp.gmail.com with ESMTPSA id l9-20020a170903244900b001e3e13781c4sm1867363pls.54.2024.05.02.15.31.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 May 2024 15:31:21 -0700 (PDT) Date: Thu, 2 May 2024 15:31:17 -0700 From: Charlie Jenkins To: Evan Green Cc: Conor Dooley , Rob Herring , Krzysztof Kozlowski , Paul Walmsley , Palmer Dabbelt , Albert Ou , Guo Ren , Conor Dooley , Chen-Yu Tsai , Jernej Skrabec , Samuel Holland , Conor Dooley , =?iso-8859-1?Q?Cl=E9ment_L=E9ger?= , Jonathan Corbet , Shuah Khan , linux-riscv@lists.infradead.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Palmer Dabbelt , linux-arm-kernel@lists.infradead.org, linux-sunxi@lists.linux.dev, linux-doc@vger.kernel.org, linux-kselftest@vger.kernel.org Subject: Re: [PATCH v4 05/16] riscv: Extend cpufeature.c to detect vendor extensions Message-ID: References: <20240426-dev-charlie-support_thead_vector_6_9-v4-0-b692f3c516ec@rivosinc.com> <20240426-dev-charlie-support_thead_vector_6_9-v4-5-b692f3c516ec@rivosinc.com> Precedence: bulk X-Mailing-List: linux-doc@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: On Wed, May 01, 2024 at 09:44:15AM -0700, Evan Green wrote: > On Fri, Apr 26, 2024 at 2:29 PM Charlie Jenkins wrote: > > > > Separate vendor extensions out into one struct per vendor > > instead of adding vendor extensions onto riscv_isa_ext. > > > > Add a hidden config RISCV_ISA_VENDOR_EXT to conditionally include this > > code. > > > > The xtheadvector vendor extension is added using these changes. > > > > Signed-off-by: Charlie Jenkins > > --- > > arch/riscv/Kconfig | 2 + > > arch/riscv/Kconfig.vendor | 19 ++++++ > > arch/riscv/include/asm/cpufeature.h | 18 ++++++ > > arch/riscv/include/asm/vendor_extensions.h | 26 ++++++++ > > arch/riscv/include/asm/vendor_extensions/thead.h | 19 ++++++ > > arch/riscv/kernel/Makefile | 2 + > > arch/riscv/kernel/cpufeature.c | 77 ++++++++++++++++++------ > > arch/riscv/kernel/vendor_extensions.c | 18 ++++++ > > arch/riscv/kernel/vendor_extensions/Makefile | 3 + > > arch/riscv/kernel/vendor_extensions/thead.c | 36 +++++++++++ > > 10 files changed, 200 insertions(+), 20 deletions(-) > > > > diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig > > index be09c8836d56..fec86fba3acd 100644 > > --- a/arch/riscv/Kconfig > > +++ b/arch/riscv/Kconfig > > @@ -759,6 +759,8 @@ config RISCV_EFFICIENT_UNALIGNED_ACCESS > > > > endchoice > > > > +source "arch/riscv/Kconfig.vendor" > > + > > endmenu # "Platform type" > > > > menu "Kernel features" > > diff --git a/arch/riscv/Kconfig.vendor b/arch/riscv/Kconfig.vendor > > new file mode 100644 > > index 000000000000..4fc86810af1d > > --- /dev/null > > +++ b/arch/riscv/Kconfig.vendor > > @@ -0,0 +1,19 @@ > > +menu "Vendor extensions" > > + > > +config RISCV_ISA_VENDOR_EXT > > + bool > > + > > +menu "T-Head" > > +config RISCV_ISA_VENDOR_EXT_THEAD > > + bool "T-Head vendor extension support" > > + select RISCV_ISA_VENDOR_EXT > > + default y > > + help > > + Say N here if you want to disable all T-Head vendor extension > > + support. This will cause any T-Head vendor extensions that are > > + requested to be ignored. > > + > > + If you don't know what to do here, say Y. > > +endmenu > > + > > +endmenu > > diff --git a/arch/riscv/include/asm/cpufeature.h b/arch/riscv/include/asm/cpufeature.h > > index 0c4f08577015..fedd479ccfd1 100644 > > --- a/arch/riscv/include/asm/cpufeature.h > > +++ b/arch/riscv/include/asm/cpufeature.h > > @@ -35,6 +35,24 @@ extern u32 riscv_vlenb_of; > > > > void riscv_user_isa_enable(void); > > > > +#define _RISCV_ISA_EXT_DATA(_name, _id, _subset_exts, _subset_exts_size) { \ > > + .name = #_name, \ > > + .property = #_name, \ > > + .id = _id, \ > > + .subset_ext_ids = _subset_exts, \ > > + .subset_ext_size = _subset_exts_size \ > > +} > > + > > +#define __RISCV_ISA_EXT_DATA(_name, _id) _RISCV_ISA_EXT_DATA(_name, _id, NULL, 0) > > + > > +/* Used to declare pure "lasso" extension (Zk for instance) */ > > +#define __RISCV_ISA_EXT_BUNDLE(_name, _bundled_exts) \ > > + _RISCV_ISA_EXT_DATA(_name, RISCV_ISA_EXT_INVALID, _bundled_exts, ARRAY_SIZE(_bundled_exts)) > > + > > +/* Used to declare extensions that are a superset of other extensions (Zvbb for instance) */ > > +#define __RISCV_ISA_EXT_SUPERSET(_name, _id, _sub_exts) \ > > + _RISCV_ISA_EXT_DATA(_name, _id, _sub_exts, ARRAY_SIZE(_sub_exts)) > > + > > #if defined(CONFIG_RISCV_MISALIGNED) > > bool check_unaligned_access_emulated_all_cpus(void); > > void unaligned_emulation_finish(void); > > diff --git a/arch/riscv/include/asm/vendor_extensions.h b/arch/riscv/include/asm/vendor_extensions.h > > new file mode 100644 > > index 000000000000..0af1ddd0af70 > > --- /dev/null > > +++ b/arch/riscv/include/asm/vendor_extensions.h > > @@ -0,0 +1,26 @@ > > +/* SPDX-License-Identifier: GPL-2.0-only */ > > +/* > > + * Copyright 2024 Rivos, Inc > > + */ > > + > > +#ifndef _ASM_VENDOR_EXTENSIONS_H > > +#define _ASM_VENDOR_EXTENSIONS_H > > + > > +#include > > + > > +#include > > +#include > > + > > +struct riscv_isa_vendor_ext_data_list { > > + const struct riscv_isa_ext_data *ext_data; > > + struct riscv_isainfo *per_hart_vendor_bitmap; > > + unsigned long *vendor_bitmap; > > It took a lot of digging for me to understand this was the set of > vendor extensions supported on all harts. Can we add that to the name, > maybe something like isa_bitmap_all_harts? (I wonder if we could drop > the vendor part of the name since we already know we're in a > vendor_ext_data_list structure). > > > + const size_t ext_data_count; > > + const size_t bitmap_size; > > +}; > > + > > +extern const struct riscv_isa_vendor_ext_data_list *riscv_isa_vendor_ext_list[]; > > + > > +extern const size_t riscv_isa_vendor_ext_list_size; > > + > > +#endif /* _ASM_VENDOR_EXTENSIONS_H */ > > diff --git a/arch/riscv/include/asm/vendor_extensions/thead.h b/arch/riscv/include/asm/vendor_extensions/thead.h > > new file mode 100644 > > index 000000000000..92eec729888d > > --- /dev/null > > +++ b/arch/riscv/include/asm/vendor_extensions/thead.h > > @@ -0,0 +1,19 @@ > > +/* SPDX-License-Identifier: GPL-2.0 */ > > +#ifndef _ASM_RISCV_VENDOR_EXTENSIONS_THEAD_H > > +#define _ASM_RISCV_VENDOR_EXTENSIONS_THEAD_H > > + > > +#include > > + > > +#include > > + > > +#define RISCV_ISA_VENDOR_EXT_XTHEADVECTOR 0 > > + > > +/* > > + * Extension keys should be strictly less than max. > > + * It is safe to increment this when necessary. > > + */ > > +#define RISCV_ISA_VENDOR_EXT_MAX_THEAD 32 > > + > > +extern const struct riscv_isa_vendor_ext_data_list riscv_isa_vendor_ext_list_thead; > > + > > +#endif > > diff --git a/arch/riscv/kernel/Makefile b/arch/riscv/kernel/Makefile > > index 81d94a8ee10f..53361c50fb46 100644 > > --- a/arch/riscv/kernel/Makefile > > +++ b/arch/riscv/kernel/Makefile > > @@ -58,6 +58,8 @@ obj-y += riscv_ksyms.o > > obj-y += stacktrace.o > > obj-y += cacheinfo.o > > obj-y += patch.o > > +obj-y += vendor_extensions.o > > +obj-y += vendor_extensions/ > > obj-y += probes/ > > obj-y += tests/ > > obj-$(CONFIG_MMU) += vdso.o vdso/ > > diff --git a/arch/riscv/kernel/cpufeature.c b/arch/riscv/kernel/cpufeature.c > > index 8158f34c3e36..c073494519eb 100644 > > --- a/arch/riscv/kernel/cpufeature.c > > +++ b/arch/riscv/kernel/cpufeature.c > > @@ -24,6 +24,7 @@ > > #include > > #include > > #include > > +#include > > > > #define NUM_ALPHA_EXTS ('z' - 'a' + 1) > > > > @@ -102,24 +103,6 @@ static bool riscv_isa_extension_check(int id) > > return true; > > } > > > > -#define _RISCV_ISA_EXT_DATA(_name, _id, _subset_exts, _subset_exts_size) { \ > > - .name = #_name, \ > > - .property = #_name, \ > > - .id = _id, \ > > - .subset_ext_ids = _subset_exts, \ > > - .subset_ext_size = _subset_exts_size \ > > -} > > - > > -#define __RISCV_ISA_EXT_DATA(_name, _id) _RISCV_ISA_EXT_DATA(_name, _id, NULL, 0) > > - > > -/* Used to declare pure "lasso" extension (Zk for instance) */ > > -#define __RISCV_ISA_EXT_BUNDLE(_name, _bundled_exts) \ > > - _RISCV_ISA_EXT_DATA(_name, RISCV_ISA_EXT_INVALID, _bundled_exts, ARRAY_SIZE(_bundled_exts)) > > - > > -/* Used to declare extensions that are a superset of other extensions (Zvbb for instance) */ > > -#define __RISCV_ISA_EXT_SUPERSET(_name, _id, _sub_exts) \ > > - _RISCV_ISA_EXT_DATA(_name, _id, _sub_exts, ARRAY_SIZE(_sub_exts)) > > - > > static const unsigned int riscv_zk_bundled_exts[] = { > > RISCV_ISA_EXT_ZBKB, > > RISCV_ISA_EXT_ZBKC, > > @@ -353,6 +336,10 @@ static void __init riscv_parse_isa_string(unsigned long *this_hwcap, struct risc > > bool ext_long = false, ext_err = false; > > > > switch (*ext) { > > + case 'x': > > + case 'X': > > + pr_warn_once("Vendor extensions are ignored in riscv,isa. Use riscv,isa-extensions instead."); > > + continue; > > case 's': > > /* > > * Workaround for invalid single-letter 's' & 'u' (QEMU). > > @@ -368,8 +355,6 @@ static void __init riscv_parse_isa_string(unsigned long *this_hwcap, struct risc > > } > > fallthrough; > > case 'S': > > - case 'x': > > - case 'X': > > case 'z': > > case 'Z': > > /* > > @@ -572,6 +557,54 @@ static void __init riscv_fill_hwcap_from_isa_string(unsigned long *isa2hwcap) > > acpi_put_table((struct acpi_table_header *)rhct); > > } > > > > +static void __init riscv_fill_cpu_vendor_ext(struct device_node *cpu_node, int cpu) > > +{ > > + if (!IS_ENABLED(CONFIG_RISCV_ISA_VENDOR_EXT)) > > + return; > > + > > + for (int i = 0; i < riscv_isa_vendor_ext_list_size; i++) { > > + const struct riscv_isa_vendor_ext_data_list *ext_list = riscv_isa_vendor_ext_list[i]; > > + > > + for (int j = 0; j < ext_list->ext_data_count; j++) { > > + const struct riscv_isa_ext_data ext = ext_list->ext_data[j]; > > + struct riscv_isainfo *isavendorinfo = &ext_list->per_hart_vendor_bitmap[cpu]; > > + > > + if (of_property_match_string(cpu_node, "riscv,isa-extensions", > > + ext.property) < 0) > > + continue; > > + > > + /* > > + * Assume that subset extensions are all members of the > > + * same vendor. > > + */ > > + if (ext.subset_ext_size) > > + for (int k = 0; k < ext.subset_ext_size; k++) > > + set_bit(ext.subset_ext_ids[k], isavendorinfo->isa); > > + > > + set_bit(ext.id, isavendorinfo->isa); > > + } > > This loop seems super similar to the regular one (in > riscv_fill_hwcap_from_ext_list() in the random, possibly old, kernel I > have open). Could we refactor these together into a common helper? The > other loop has an extra stanza for riscv_isa_extension_check(), so > we'd have to add an extra condition there, but otherwise it looks > pretty compatible? > > > + } > > +} > > + > > +static void __init riscv_fill_vendor_ext_list(int cpu) > > +{ > > + if (!IS_ENABLED(CONFIG_RISCV_ISA_VENDOR_EXT)) > > + return; > > + > > + for (int i = 0; i < riscv_isa_vendor_ext_list_size; i++) { > > + const struct riscv_isa_vendor_ext_data_list *ext_list = riscv_isa_vendor_ext_list[i]; > > + > > + if (bitmap_empty(ext_list->vendor_bitmap, ext_list->bitmap_size)) > > + bitmap_copy(ext_list->vendor_bitmap, > > + ext_list->per_hart_vendor_bitmap[cpu].isa, > > + ext_list->bitmap_size); > > Could you get into trouble here if the set of vendor extensions > reduces to zero, and then becomes non-zero? To illustrate, consider > these masks: > cpu 0: 0x0000C000 > cpu 1: 0x00000003 <<< vendor_bitmap ANDs out to 0 > cpu 2: 0x00000010 <<< oops, we end up copying this into vendor_bitmap > > > + else > > + bitmap_and(ext_list->vendor_bitmap, ext_list->vendor_bitmap, > > + ext_list->per_hart_vendor_bitmap[cpu].isa, > > + ext_list->bitmap_size); > > + } > > +} > > + > > static int __init riscv_fill_hwcap_from_ext_list(unsigned long *isa2hwcap) > > { > > unsigned int cpu; > > @@ -615,6 +648,8 @@ static int __init riscv_fill_hwcap_from_ext_list(unsigned long *isa2hwcap) > > } > > } > > > > + riscv_fill_cpu_vendor_ext(cpu_node, cpu); > > + > > of_node_put(cpu_node); > > > > /* > > @@ -630,6 +665,8 @@ static int __init riscv_fill_hwcap_from_ext_list(unsigned long *isa2hwcap) > > bitmap_copy(riscv_isa, isainfo->isa, RISCV_ISA_EXT_MAX); > > else > > bitmap_and(riscv_isa, riscv_isa, isainfo->isa, RISCV_ISA_EXT_MAX); > > + > > + riscv_fill_vendor_ext_list(cpu); > > } > > > > if (bitmap_empty(riscv_isa, RISCV_ISA_EXT_MAX)) > > diff --git a/arch/riscv/kernel/vendor_extensions.c b/arch/riscv/kernel/vendor_extensions.c > > new file mode 100644 > > index 000000000000..f76cb3013c2d > > --- /dev/null > > +++ b/arch/riscv/kernel/vendor_extensions.c > > @@ -0,0 +1,18 @@ > > +// SPDX-License-Identifier: GPL-2.0-only > > +/* > > + * Copyright 2024 Rivos, Inc > > + */ > > + > > +#include > > +#include > > + > > +#include > > +#include > > + > > +const struct riscv_isa_vendor_ext_data_list *riscv_isa_vendor_ext_list[] = { > > +#ifdef CONFIG_RISCV_ISA_VENDOR_EXT_THEAD > > + &riscv_isa_vendor_ext_list_thead, > > +#endif > > +}; > > + > > +const size_t riscv_isa_vendor_ext_list_size = ARRAY_SIZE(riscv_isa_vendor_ext_list); > > diff --git a/arch/riscv/kernel/vendor_extensions/Makefile b/arch/riscv/kernel/vendor_extensions/Makefile > > new file mode 100644 > > index 000000000000..3383066baaab > > --- /dev/null > > +++ b/arch/riscv/kernel/vendor_extensions/Makefile > > @@ -0,0 +1,3 @@ > > +# SPDX-License-Identifier: GPL-2.0-only > > + > > +obj-$(CONFIG_RISCV_ISA_VENDOR_EXT_THEAD) += thead.o > > diff --git a/arch/riscv/kernel/vendor_extensions/thead.c b/arch/riscv/kernel/vendor_extensions/thead.c > > new file mode 100644 > > index 000000000000..edb20b928c0c > > --- /dev/null > > +++ b/arch/riscv/kernel/vendor_extensions/thead.c > > @@ -0,0 +1,36 @@ > > +// SPDX-License-Identifier: GPL-2.0-only > > + > > +#include > > +#include > > +#include > > + > > +#include > > +#include > > + > > +/* All T-Head vendor extensions supported in Linux */ > > +const struct riscv_isa_ext_data riscv_isa_vendor_ext_thead[] = { > > + __RISCV_ISA_EXT_DATA(xtheadvector, RISCV_ISA_VENDOR_EXT_XTHEADVECTOR), > > +}; > > + > > +/* > > + * The first member of this struct must be a bitmap named isa so it can be > > + * compatible with riscv_isainfo even though the sizes of the bitmaps may be > > + * different. > This is kinda yucky, as you're casting a bitmap of a different size > into a struct riscv_isainfo *, which has a known size. I don't > necessarily have a fabulous suggestion to fix though. The best I can > come up with is refactor struct riscv_isainfo to be: > struct riscv_isainfo { > int count; > unsigned long isa[0]; > }; > > then declare a standard one (for hart_isa, which is statically allocated): > struct riscv_std_isainfo { > int count; > DECLARE_BITMAP(isa, RISCV_ISA_EXT_MAX); > } > > and a thead one > struct riscv_thead_isainfo { > int count; > DECLARE_BITMAP(isa, RISCV_ISA_VENDOR_EXT_MAX_THEAD); > } > > But there's still a cast in there, as you'd cast the specialized > structs to struct riscv_isainfo *. But at least the size is in there > to be enforced at runtime, rather than a compile-time check that's > wrong. So I'll just leave this half baked thought here, and maybe you > can think of a cleaner way, or ignore it :). > After looking into this a bit more, I am not sure there is a "clean" way of doing this. Kees wrote an interesting article about an adjacent problem [1], and my takeaway was that there are some people working to improve situations like this. This pattern is very close to the standard struct with the length of the array as one element and the array itself as another element. There are two major differences though, one being that the count is put through a simple macro BITS_TO_LONGS to calculate the size of the array. The other is that count is a compile time constant that should be populated into all structs of the type, since we have arrays of riscv_isainfo that should be allocated at compile time to all have the same count. Ideally what I would want is something like: struct riscv_thead_isainfo { int count = RISCV_ISA_VENDOR_EXT_MAX_THEAD; DECLARE_BITMAP(isa, RISCV_ISA_VENDOR_EXT_MAX_THEAD); } Otherwise we need to populate count at runtime and that defeats the point in my opinion since this is currently known by accessing the "bitmap_size" of the statically allocated struct: const struct riscv_isa_vendor_ext_data_list riscv_isa_vendor_ext_list_thead This also has the downside of having the same "count" repeated across all of the instances of riscv_thead_isainfo of which there are by default 65 (one for each of the CPUs configured with NR_CPUS which defaults to 64 plus an additional for the least-common-denominator across all CPUs). It's a relatively large amount of bits that gets "wasted". Just for some background here, the purpose here is to be able to have a standardized "struct riscv_isa_vendor_ext_data_list" that each vendor will be able to populate with their vendor extensions. The thought was that each vendor will have a different number of extensions so each vendor doesn't need to reserve the same amount of space in their statically allocated bitmap. vendorA may be able to fit their extensions in 64 bits but vendorB may need 128. We're talking about a small amount of space savings here. We could forego this casting entirely and say each vendor will need a maximum of X bits. It may be unlikely for any vendor to ever end up with more than 64 vendor extensions that they want exposed to the kernel. But if any vendor ever does end up with more than 64, all of the vendors end up needing to have to allocate 128 bits in their bitmask that is allocated for each possible CPU. [1] https://people.kernel.org/kees/bounded-flexible-arrays-in-c - Charlie > > > + */ > > +struct riscv_isavendorinfo_thead { > > + DECLARE_BITMAP(isa, RISCV_ISA_VENDOR_EXT_MAX_THEAD); > > +}; > > + > > +/* Hart specific T-Head vendor extension support */ > > +static struct riscv_isavendorinfo_thead hart_vendorinfo_thead[NR_CPUS]; > > + > > +/* Set of T-Head vendor extensions supported on all harts */ > > +DECLARE_BITMAP(vendorinfo_thead, RISCV_ISA_VENDOR_EXT_MAX_THEAD); > > + > > +const struct riscv_isa_vendor_ext_data_list riscv_isa_vendor_ext_list_thead = { > > + .ext_data = riscv_isa_vendor_ext_thead, > > + .per_hart_vendor_bitmap = (struct riscv_isainfo *)hart_vendorinfo_thead, > > + .vendor_bitmap = vendorinfo_thead, > > + .ext_data_count = ARRAY_SIZE(riscv_isa_vendor_ext_thead), > > + .bitmap_size = RISCV_ISA_VENDOR_EXT_MAX_THEAD > > +}; > > > > -- > > 2.44.0 > > From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id D1E56C4345F for ; Thu, 2 May 2024 22:31:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:References: Message-ID:Subject:Cc:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=B0huz7oqUan/2+zkv81uWqbQ5Yrd76AB37zpVOwZbqg=; b=xUFU0Zy0imGkVi exbtJ9APbM+5GeR/Zjbx8M3aXb9aIl840i9N7W7IlmI96XJrFVtf4xFrqAL6Y36w9q8yqZ1l2wKMZ uIzv6MeMzd+un5El7u0r81eEi9Mp+1INWSTToOkri6IvNR6kLUIlxr6gFhz3mEyJmUURKbhDvF/g4 zX1I/FbSUhxiLyw+8WqQf2hoHZpfEbWUkN9Emiz2eO6JfIfCRxSmWCNaFXZWdJuQWlOZ13kXFzOBo To6NtzNe6viKsm0FHOWVl9jI1UV2LAeWjTG1Y/RahtaIwqRYxmxgzZsiIL/rTOHFrcJuAEOb4ltJN VHiIUGXpHqESUPLstACw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1s2exe-0000000E76M-34Sf; Thu, 02 May 2024 22:31:30 +0000 Received: from mail-pl1-x631.google.com ([2607:f8b0:4864:20::631]) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1s2exa-0000000E74Y-2HcU for linux-riscv@lists.infradead.org; Thu, 02 May 2024 22:31:28 +0000 Received: by mail-pl1-x631.google.com with SMTP id d9443c01a7336-1e3c3aa8938so57072015ad.1 for ; Thu, 02 May 2024 15:31:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rivosinc-com.20230601.gappssmtp.com; s=20230601; t=1714689083; x=1715293883; darn=lists.infradead.org; h=in-reply-to:content-transfer-encoding:content-disposition :mime-version:references:message-id:subject:cc:to:from:date:from:to :cc:subject:date:message-id:reply-to; bh=Jyw7zxfMEtfqyw3yPaaOuPprN3b7DB1YugAVazrGrkk=; b=os/QpqjFyv1ZPT93tA2Cmn+x5gBc6LqWx57CT7UogIG/t3JJk4EMND8bAv4u5jeQ1P QAdv/aJeQM9+h9kCQWr59bRNfCqwj/GrtRiDdBk/160fjGbO0d9jkuX9Zfg1Ae0wFyiw leoWsEyLz6dkVHvqUAm/yiW0hil27PpUKPxZRUiONYks6E4i6Zkg90HBgSpJqujJONO/ VL3YojBAhOYs4ICz3ux/81XPmkQ9cos6bAozSePnNZdquAXLqdst4a19KQPuAzCc+Qj1 MTlhcB7znCS0uzeAr/5PbSxVi7WrtxxmXk5CxPLnc2KPy0oZznzxwZ3whORe7m9PKxnH sG+g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1714689083; x=1715293883; h=in-reply-to:content-transfer-encoding:content-disposition :mime-version:references:message-id:subject:cc:to:from:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=Jyw7zxfMEtfqyw3yPaaOuPprN3b7DB1YugAVazrGrkk=; b=gKO3VSBxIMvPBC9nDQ5aoLJhNRU3QE7sq54TrHJy2ml7C4qyO0GyNu45cxFzZXSuGR 5HQsp47aSKs2vcAqK0iSYLpRiYQ5VGSyf45HtmRAViOX9yv+I7gCxdfQNReU96NJGzuV x/yNy7sOZ1XqMaqLqqfeZjTcqm82jgcrR9TZRzHOYxKhUgdaQkroEJYPWGLFICe5vQkk TB332iX4bMJg3dKT7xDkkxf1C7fg/OQnlXhdFqNzf8xsPMcjubfEE5LCfllQZ5akaXwk TFdUpiMyXPCcMFHNb2LFcxvGZImwzk9CtyjY4+9GPyw4tAHif5oy6CT5oi8fzxZYgD0Q YPZA== X-Forwarded-Encrypted: i=1; AJvYcCXFb7TJEdexui6MA/xoFyfZWFndYyAzU76oZRM1dr9CsE8LOOG3Tnc/YOZ+uiLI71bLoCNUhzo6pTxvCxtloF1q39W9Rxk4EkQWbjm3Fwq7 X-Gm-Message-State: AOJu0Yy0i0ya7D9XLDlhmV3aJE9tim70cVZpWVmiORDSadZsLG8ZTjcB 20BBbkqlEuzPeDdLO/bJG73TKbZvU5iTj1JA1v+fd2PAMLhIZ/uYx7SK6ZlJ9w0= X-Google-Smtp-Source: AGHT+IFB+rtKMcM3DQ0bkb6f6tzj/9Q4q165q3JA8fWP2cX4VeLL+YWsW17aB2bGX2oOxX/u+yG8AQ== X-Received: by 2002:a17:902:f685:b0:1e4:9c2f:d343 with SMTP id l5-20020a170902f68500b001e49c2fd343mr1287136plg.7.1714689082510; Thu, 02 May 2024 15:31:22 -0700 (PDT) Received: from ghost ([50.145.13.30]) by smtp.gmail.com with ESMTPSA id l9-20020a170903244900b001e3e13781c4sm1867363pls.54.2024.05.02.15.31.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 May 2024 15:31:21 -0700 (PDT) Date: Thu, 2 May 2024 15:31:17 -0700 From: Charlie Jenkins To: Evan Green Cc: Conor Dooley , Rob Herring , Krzysztof Kozlowski , Paul Walmsley , Palmer Dabbelt , Albert Ou , Guo Ren , Conor Dooley , Chen-Yu Tsai , Jernej Skrabec , Samuel Holland , Conor Dooley , =?iso-8859-1?Q?Cl=E9ment_L=E9ger?= , Jonathan Corbet , Shuah Khan , linux-riscv@lists.infradead.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Palmer Dabbelt , linux-arm-kernel@lists.infradead.org, linux-sunxi@lists.linux.dev, linux-doc@vger.kernel.org, linux-kselftest@vger.kernel.org Subject: Re: [PATCH v4 05/16] riscv: Extend cpufeature.c to detect vendor extensions Message-ID: References: <20240426-dev-charlie-support_thead_vector_6_9-v4-0-b692f3c516ec@rivosinc.com> <20240426-dev-charlie-support_thead_vector_6_9-v4-5-b692f3c516ec@rivosinc.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240502_153126_824620_A3E31F0B X-CRM114-Status: GOOD ( 40.30 ) X-BeenThere: linux-riscv@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-riscv" Errors-To: linux-riscv-bounces+linux-riscv=archiver.kernel.org@lists.infradead.org T24gV2VkLCBNYXkgMDEsIDIwMjQgYXQgMDk6NDQ6MTVBTSAtMDcwMCwgRXZhbiBHcmVlbiB3cm90 ZToKPiBPbiBGcmksIEFwciAyNiwgMjAyNCBhdCAyOjI54oCvUE0gQ2hhcmxpZSBKZW5raW5zIDxj aGFybGllQHJpdm9zaW5jLmNvbT4gd3JvdGU6Cj4gPgo+ID4gU2VwYXJhdGUgdmVuZG9yIGV4dGVu c2lvbnMgb3V0IGludG8gb25lIHN0cnVjdCBwZXIgdmVuZG9yCj4gPiBpbnN0ZWFkIG9mIGFkZGlu ZyB2ZW5kb3IgZXh0ZW5zaW9ucyBvbnRvIHJpc2N2X2lzYV9leHQuCj4gPgo+ID4gQWRkIGEgaGlk ZGVuIGNvbmZpZyBSSVNDVl9JU0FfVkVORE9SX0VYVCB0byBjb25kaXRpb25hbGx5IGluY2x1ZGUg dGhpcwo+ID4gY29kZS4KPiA+Cj4gPiBUaGUgeHRoZWFkdmVjdG9yIHZlbmRvciBleHRlbnNpb24g aXMgYWRkZWQgdXNpbmcgdGhlc2UgY2hhbmdlcy4KPiA+Cj4gPiBTaWduZWQtb2ZmLWJ5OiBDaGFy bGllIEplbmtpbnMgPGNoYXJsaWVAcml2b3NpbmMuY29tPgo+ID4gLS0tCj4gPiAgYXJjaC9yaXNj di9LY29uZmlnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDIgKwo+ID4gIGFyY2gv cmlzY3YvS2NvbmZpZy52ZW5kb3IgICAgICAgICAgICAgICAgICAgICAgICB8IDE5ICsrKysrKwo+ ID4gIGFyY2gvcmlzY3YvaW5jbHVkZS9hc20vY3B1ZmVhdHVyZS5oICAgICAgICAgICAgICB8IDE4 ICsrKysrKwo+ID4gIGFyY2gvcmlzY3YvaW5jbHVkZS9hc20vdmVuZG9yX2V4dGVuc2lvbnMuaCAg ICAgICB8IDI2ICsrKysrKysrCj4gPiAgYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS92ZW5kb3JfZXh0 ZW5zaW9ucy90aGVhZC5oIHwgMTkgKysrKysrCj4gPiAgYXJjaC9yaXNjdi9rZXJuZWwvTWFrZWZp bGUgICAgICAgICAgICAgICAgICAgICAgIHwgIDIgKwo+ID4gIGFyY2gvcmlzY3Yva2VybmVsL2Nw dWZlYXR1cmUuYyAgICAgICAgICAgICAgICAgICB8IDc3ICsrKysrKysrKysrKysrKysrKy0tLS0t LQo+ID4gIGFyY2gvcmlzY3Yva2VybmVsL3ZlbmRvcl9leHRlbnNpb25zLmMgICAgICAgICAgICB8 IDE4ICsrKysrKwo+ID4gIGFyY2gvcmlzY3Yva2VybmVsL3ZlbmRvcl9leHRlbnNpb25zL01ha2Vm aWxlICAgICB8ICAzICsKPiA+ICBhcmNoL3Jpc2N2L2tlcm5lbC92ZW5kb3JfZXh0ZW5zaW9ucy90 aGVhZC5jICAgICAgfCAzNiArKysrKysrKysrKwo+ID4gIDEwIGZpbGVzIGNoYW5nZWQsIDIwMCBp bnNlcnRpb25zKCspLCAyMCBkZWxldGlvbnMoLSkKPiA+Cj4gPiBkaWZmIC0tZ2l0IGEvYXJjaC9y aXNjdi9LY29uZmlnIGIvYXJjaC9yaXNjdi9LY29uZmlnCj4gPiBpbmRleCBiZTA5Yzg4MzZkNTYu LmZlYzg2ZmJhM2FjZCAxMDA2NDQKPiA+IC0tLSBhL2FyY2gvcmlzY3YvS2NvbmZpZwo+ID4gKysr IGIvYXJjaC9yaXNjdi9LY29uZmlnCj4gPiBAQCAtNzU5LDYgKzc1OSw4IEBAIGNvbmZpZyBSSVND Vl9FRkZJQ0lFTlRfVU5BTElHTkVEX0FDQ0VTUwo+ID4KPiA+ICBlbmRjaG9pY2UKPiA+Cj4gPiAr c291cmNlICJhcmNoL3Jpc2N2L0tjb25maWcudmVuZG9yIgo+ID4gKwo+ID4gIGVuZG1lbnUgIyAi UGxhdGZvcm0gdHlwZSIKPiA+Cj4gPiAgbWVudSAiS2VybmVsIGZlYXR1cmVzIgo+ID4gZGlmZiAt LWdpdCBhL2FyY2gvcmlzY3YvS2NvbmZpZy52ZW5kb3IgYi9hcmNoL3Jpc2N2L0tjb25maWcudmVu ZG9yCj4gPiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+ID4gaW5kZXggMDAwMDAwMDAwMDAwLi40ZmM4 NjgxMGFmMWQKPiA+IC0tLSAvZGV2L251bGwKPiA+ICsrKyBiL2FyY2gvcmlzY3YvS2NvbmZpZy52 ZW5kb3IKPiA+IEBAIC0wLDAgKzEsMTkgQEAKPiA+ICttZW51ICJWZW5kb3IgZXh0ZW5zaW9ucyIK PiA+ICsKPiA+ICtjb25maWcgUklTQ1ZfSVNBX1ZFTkRPUl9FWFQKPiA+ICsgICAgICAgYm9vbAo+ ID4gKwo+ID4gK21lbnUgIlQtSGVhZCIKPiA+ICtjb25maWcgUklTQ1ZfSVNBX1ZFTkRPUl9FWFRf VEhFQUQKPiA+ICsgICAgICAgYm9vbCAiVC1IZWFkIHZlbmRvciBleHRlbnNpb24gc3VwcG9ydCIK PiA+ICsgICAgICAgc2VsZWN0IFJJU0NWX0lTQV9WRU5ET1JfRVhUCj4gPiArICAgICAgIGRlZmF1 bHQgeQo+ID4gKyAgICAgICBoZWxwCj4gPiArICAgICAgICAgU2F5IE4gaGVyZSBpZiB5b3Ugd2Fu dCB0byBkaXNhYmxlIGFsbCBULUhlYWQgdmVuZG9yIGV4dGVuc2lvbgo+ID4gKyAgICAgICAgIHN1 cHBvcnQuIFRoaXMgd2lsbCBjYXVzZSBhbnkgVC1IZWFkIHZlbmRvciBleHRlbnNpb25zIHRoYXQg YXJlCj4gPiArICAgICAgICAgcmVxdWVzdGVkIHRvIGJlIGlnbm9yZWQuCj4gPiArCj4gPiArICAg ICAgICAgSWYgeW91IGRvbid0IGtub3cgd2hhdCB0byBkbyBoZXJlLCBzYXkgWS4KPiA+ICtlbmRt ZW51Cj4gPiArCj4gPiArZW5kbWVudQo+ID4gZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3YvaW5jbHVk ZS9hc20vY3B1ZmVhdHVyZS5oIGIvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9jcHVmZWF0dXJlLmgK PiA+IGluZGV4IDBjNGYwODU3NzAxNS4uZmVkZDQ3OWNjZmQxIDEwMDY0NAo+ID4gLS0tIGEvYXJj aC9yaXNjdi9pbmNsdWRlL2FzbS9jcHVmZWF0dXJlLmgKPiA+ICsrKyBiL2FyY2gvcmlzY3YvaW5j bHVkZS9hc20vY3B1ZmVhdHVyZS5oCj4gPiBAQCAtMzUsNiArMzUsMjQgQEAgZXh0ZXJuIHUzMiBy aXNjdl92bGVuYl9vZjsKPiA+Cj4gPiAgdm9pZCByaXNjdl91c2VyX2lzYV9lbmFibGUodm9pZCk7 Cj4gPgo+ID4gKyNkZWZpbmUgX1JJU0NWX0lTQV9FWFRfREFUQShfbmFtZSwgX2lkLCBfc3Vic2V0 X2V4dHMsIF9zdWJzZXRfZXh0c19zaXplKSB7ICAgICBcCj4gPiArICAgICAgIC5uYW1lID0gI19u YW1lLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIFwKPiA+ICsgICAgICAgLnByb3BlcnR5ID0gI19uYW1lLCAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAo+ID4gKyAgICAgICAuaWQgPSBfaWQs ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBcCj4gPiArICAgICAgIC5zdWJzZXRfZXh0X2lkcyA9IF9zdWJzZXRfZXh0cywgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKPiA+ICsgICAgICAgLnN1YnNldF9l eHRfc2l6ZSA9IF9zdWJzZXRfZXh0c19zaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgXAo+ID4gK30KPiA+ICsKPiA+ICsjZGVmaW5lIF9fUklTQ1ZfSVNBX0VYVF9EQVRBKF9u YW1lLCBfaWQpIF9SSVNDVl9JU0FfRVhUX0RBVEEoX25hbWUsIF9pZCwgTlVMTCwgMCkKPiA+ICsK PiA+ICsvKiBVc2VkIHRvIGRlY2xhcmUgcHVyZSAibGFzc28iIGV4dGVuc2lvbiAoWmsgZm9yIGlu c3RhbmNlKSAqLwo+ID4gKyNkZWZpbmUgX19SSVNDVl9JU0FfRVhUX0JVTkRMRShfbmFtZSwgX2J1 bmRsZWRfZXh0cykgXAo+ID4gKyAgICAgICBfUklTQ1ZfSVNBX0VYVF9EQVRBKF9uYW1lLCBSSVND Vl9JU0FfRVhUX0lOVkFMSUQsIF9idW5kbGVkX2V4dHMsIEFSUkFZX1NJWkUoX2J1bmRsZWRfZXh0 cykpCj4gPiArCj4gPiArLyogVXNlZCB0byBkZWNsYXJlIGV4dGVuc2lvbnMgdGhhdCBhcmUgYSBz dXBlcnNldCBvZiBvdGhlciBleHRlbnNpb25zIChadmJiIGZvciBpbnN0YW5jZSkgKi8KPiA+ICsj ZGVmaW5lIF9fUklTQ1ZfSVNBX0VYVF9TVVBFUlNFVChfbmFtZSwgX2lkLCBfc3ViX2V4dHMpIFwK PiA+ICsgICAgICAgX1JJU0NWX0lTQV9FWFRfREFUQShfbmFtZSwgX2lkLCBfc3ViX2V4dHMsIEFS UkFZX1NJWkUoX3N1Yl9leHRzKSkKPiA+ICsKPiA+ICAjaWYgZGVmaW5lZChDT05GSUdfUklTQ1Zf TUlTQUxJR05FRCkKPiA+ICBib29sIGNoZWNrX3VuYWxpZ25lZF9hY2Nlc3NfZW11bGF0ZWRfYWxs X2NwdXModm9pZCk7Cj4gPiAgdm9pZCB1bmFsaWduZWRfZW11bGF0aW9uX2ZpbmlzaCh2b2lkKTsK PiA+IGRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL3ZlbmRvcl9leHRlbnNpb25z LmggYi9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL3ZlbmRvcl9leHRlbnNpb25zLmgKPiA+IG5ldyBm aWxlIG1vZGUgMTAwNjQ0Cj4gPiBpbmRleCAwMDAwMDAwMDAwMDAuLjBhZjFkZGQwYWY3MAo+ID4g LS0tIC9kZXYvbnVsbAo+ID4gKysrIGIvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS92ZW5kb3JfZXh0 ZW5zaW9ucy5oCj4gPiBAQCAtMCwwICsxLDI2IEBACj4gPiArLyogU1BEWC1MaWNlbnNlLUlkZW50 aWZpZXI6IEdQTC0yLjAtb25seSAqLwo+ID4gKy8qCj4gPiArICogQ29weXJpZ2h0IDIwMjQgUml2 b3MsIEluYwo+ID4gKyAqLwo+ID4gKwo+ID4gKyNpZm5kZWYgX0FTTV9WRU5ET1JfRVhURU5TSU9O U19ICj4gPiArI2RlZmluZSBfQVNNX1ZFTkRPUl9FWFRFTlNJT05TX0gKPiA+ICsKPiA+ICsjaW5j bHVkZSA8YXNtL2NwdWZlYXR1cmUuaD4KPiA+ICsKPiA+ICsjaW5jbHVkZSA8bGludXgvYXJyYXlf c2l6ZS5oPgo+ID4gKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgo+ID4gKwo+ID4gK3N0cnVjdCBy aXNjdl9pc2FfdmVuZG9yX2V4dF9kYXRhX2xpc3Qgewo+ID4gKyAgICAgICBjb25zdCBzdHJ1Y3Qg cmlzY3ZfaXNhX2V4dF9kYXRhICpleHRfZGF0YTsKPiA+ICsgICAgICAgc3RydWN0IHJpc2N2X2lz YWluZm8gKnBlcl9oYXJ0X3ZlbmRvcl9iaXRtYXA7Cj4gPiArICAgICAgIHVuc2lnbmVkIGxvbmcg KnZlbmRvcl9iaXRtYXA7Cj4gCj4gSXQgdG9vayBhIGxvdCBvZiBkaWdnaW5nIGZvciBtZSB0byB1 bmRlcnN0YW5kIHRoaXMgd2FzIHRoZSBzZXQgb2YKPiB2ZW5kb3IgZXh0ZW5zaW9ucyBzdXBwb3J0 ZWQgb24gYWxsIGhhcnRzLiBDYW4gd2UgYWRkIHRoYXQgdG8gdGhlIG5hbWUsCj4gbWF5YmUgc29t ZXRoaW5nIGxpa2UgaXNhX2JpdG1hcF9hbGxfaGFydHM/IChJIHdvbmRlciBpZiB3ZSBjb3VsZCBk cm9wCj4gdGhlIHZlbmRvciBwYXJ0IG9mIHRoZSBuYW1lIHNpbmNlIHdlIGFscmVhZHkga25vdyB3 ZSdyZSBpbiBhCj4gdmVuZG9yX2V4dF9kYXRhX2xpc3Qgc3RydWN0dXJlKS4KPiAKPiA+ICsgICAg ICAgY29uc3Qgc2l6ZV90IGV4dF9kYXRhX2NvdW50Owo+ID4gKyAgICAgICBjb25zdCBzaXplX3Qg Yml0bWFwX3NpemU7Cj4gPiArfTsKPiA+ICsKPiA+ICtleHRlcm4gY29uc3Qgc3RydWN0IHJpc2N2 X2lzYV92ZW5kb3JfZXh0X2RhdGFfbGlzdCAqcmlzY3ZfaXNhX3ZlbmRvcl9leHRfbGlzdFtdOwo+ ID4gKwo+ID4gK2V4dGVybiBjb25zdCBzaXplX3QgcmlzY3ZfaXNhX3ZlbmRvcl9leHRfbGlzdF9z aXplOwo+ID4gKwo+ID4gKyNlbmRpZiAvKiBfQVNNX1ZFTkRPUl9FWFRFTlNJT05TX0ggKi8KPiA+ IGRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL3ZlbmRvcl9leHRlbnNpb25zL3Ro ZWFkLmggYi9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL3ZlbmRvcl9leHRlbnNpb25zL3RoZWFkLmgK PiA+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gPiBpbmRleCAwMDAwMDAwMDAwMDAuLjkyZWVjNzI5 ODg4ZAo+ID4gLS0tIC9kZXYvbnVsbAo+ID4gKysrIGIvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS92 ZW5kb3JfZXh0ZW5zaW9ucy90aGVhZC5oCj4gPiBAQCAtMCwwICsxLDE5IEBACj4gPiArLyogU1BE WC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgKi8KPiA+ICsjaWZuZGVmIF9BU01fUklTQ1Zf VkVORE9SX0VYVEVOU0lPTlNfVEhFQURfSAo+ID4gKyNkZWZpbmUgX0FTTV9SSVNDVl9WRU5ET1Jf RVhURU5TSU9OU19USEVBRF9ICj4gPiArCj4gPiArI2luY2x1ZGUgPGFzbS92ZW5kb3JfZXh0ZW5z aW9ucy5oPgo+ID4gKwo+ID4gKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgo+ID4gKwo+ID4gKyNk ZWZpbmUgUklTQ1ZfSVNBX1ZFTkRPUl9FWFRfWFRIRUFEVkVDVE9SICAgICAgICAgICAgICAwCj4g PiArCj4gPiArLyoKPiA+ICsgKiBFeHRlbnNpb24ga2V5cyBzaG91bGQgYmUgc3RyaWN0bHkgbGVz cyB0aGFuIG1heC4KPiA+ICsgKiBJdCBpcyBzYWZlIHRvIGluY3JlbWVudCB0aGlzIHdoZW4gbmVj ZXNzYXJ5Lgo+ID4gKyAqLwo+ID4gKyNkZWZpbmUgUklTQ1ZfSVNBX1ZFTkRPUl9FWFRfTUFYX1RI RUFEICAgICAgICAgICAgICAgICAzMgo+ID4gKwo+ID4gK2V4dGVybiBjb25zdCBzdHJ1Y3Qgcmlz Y3ZfaXNhX3ZlbmRvcl9leHRfZGF0YV9saXN0IHJpc2N2X2lzYV92ZW5kb3JfZXh0X2xpc3RfdGhl YWQ7Cj4gPiArCj4gPiArI2VuZGlmCj4gPiBkaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9rZXJuZWwv TWFrZWZpbGUgYi9hcmNoL3Jpc2N2L2tlcm5lbC9NYWtlZmlsZQo+ID4gaW5kZXggODFkOTRhOGVl MTBmLi41MzM2MWM1MGZiNDYgMTAwNjQ0Cj4gPiAtLS0gYS9hcmNoL3Jpc2N2L2tlcm5lbC9NYWtl ZmlsZQo+ID4gKysrIGIvYXJjaC9yaXNjdi9rZXJuZWwvTWFrZWZpbGUKPiA+IEBAIC01OCw2ICs1 OCw4IEBAIG9iai15ICs9IHJpc2N2X2tzeW1zLm8KPiA+ICBvYmoteSAgKz0gc3RhY2t0cmFjZS5v Cj4gPiAgb2JqLXkgICs9IGNhY2hlaW5mby5vCj4gPiAgb2JqLXkgICs9IHBhdGNoLm8KPiA+ICtv YmoteSAgKz0gdmVuZG9yX2V4dGVuc2lvbnMubwo+ID4gK29iai15ICArPSB2ZW5kb3JfZXh0ZW5z aW9ucy8KPiA+ICBvYmoteSAgKz0gcHJvYmVzLwo+ID4gIG9iai15ICArPSB0ZXN0cy8KPiA+ICBv YmotJChDT05GSUdfTU1VKSArPSB2ZHNvLm8gdmRzby8KPiA+IGRpZmYgLS1naXQgYS9hcmNoL3Jp c2N2L2tlcm5lbC9jcHVmZWF0dXJlLmMgYi9hcmNoL3Jpc2N2L2tlcm5lbC9jcHVmZWF0dXJlLmMK PiA+IGluZGV4IDgxNThmMzRjM2UzNi4uYzA3MzQ5NDUxOWViIDEwMDY0NAo+ID4gLS0tIGEvYXJj aC9yaXNjdi9rZXJuZWwvY3B1ZmVhdHVyZS5jCj4gPiArKysgYi9hcmNoL3Jpc2N2L2tlcm5lbC9j cHVmZWF0dXJlLmMKPiA+IEBAIC0yNCw2ICsyNCw3IEBACj4gPiAgI2luY2x1ZGUgPGFzbS9wcm9j ZXNzb3IuaD4KPiA+ICAjaW5jbHVkZSA8YXNtL3NiaS5oPgo+ID4gICNpbmNsdWRlIDxhc20vdmVj dG9yLmg+Cj4gPiArI2luY2x1ZGUgPGFzbS92ZW5kb3JfZXh0ZW5zaW9ucy5oPgo+ID4KPiA+ICAj ZGVmaW5lIE5VTV9BTFBIQV9FWFRTICgneicgLSAnYScgKyAxKQo+ID4KPiA+IEBAIC0xMDIsMjQg KzEwMyw2IEBAIHN0YXRpYyBib29sIHJpc2N2X2lzYV9leHRlbnNpb25fY2hlY2soaW50IGlkKQo+ ID4gICAgICAgICByZXR1cm4gdHJ1ZTsKPiA+ICB9Cj4gPgo+ID4gLSNkZWZpbmUgX1JJU0NWX0lT QV9FWFRfREFUQShfbmFtZSwgX2lkLCBfc3Vic2V0X2V4dHMsIF9zdWJzZXRfZXh0c19zaXplKSB7 ICAgICBcCj4gPiAtICAgICAgIC5uYW1lID0gI19uYW1lLCAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKPiA+IC0gICAgICAgLnByb3BlcnR5 ID0gI19uYW1lLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgXAo+ID4gLSAgICAgICAuaWQgPSBfaWQsICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCj4gPiAtICAgICAgIC5zdWJzZXRf ZXh0X2lkcyA9IF9zdWJzZXRfZXh0cywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIFwKPiA+IC0gICAgICAgLnN1YnNldF9leHRfc2l6ZSA9IF9zdWJzZXRfZXh0c19zaXpl ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAo+ID4gLX0KPiA+IC0KPiA+IC0j ZGVmaW5lIF9fUklTQ1ZfSVNBX0VYVF9EQVRBKF9uYW1lLCBfaWQpIF9SSVNDVl9JU0FfRVhUX0RB VEEoX25hbWUsIF9pZCwgTlVMTCwgMCkKPiA+IC0KPiA+IC0vKiBVc2VkIHRvIGRlY2xhcmUgcHVy ZSAibGFzc28iIGV4dGVuc2lvbiAoWmsgZm9yIGluc3RhbmNlKSAqLwo+ID4gLSNkZWZpbmUgX19S SVNDVl9JU0FfRVhUX0JVTkRMRShfbmFtZSwgX2J1bmRsZWRfZXh0cykgXAo+ID4gLSAgICAgICBf UklTQ1ZfSVNBX0VYVF9EQVRBKF9uYW1lLCBSSVNDVl9JU0FfRVhUX0lOVkFMSUQsIF9idW5kbGVk X2V4dHMsIEFSUkFZX1NJWkUoX2J1bmRsZWRfZXh0cykpCj4gPiAtCj4gPiAtLyogVXNlZCB0byBk ZWNsYXJlIGV4dGVuc2lvbnMgdGhhdCBhcmUgYSBzdXBlcnNldCBvZiBvdGhlciBleHRlbnNpb25z IChadmJiIGZvciBpbnN0YW5jZSkgKi8KPiA+IC0jZGVmaW5lIF9fUklTQ1ZfSVNBX0VYVF9TVVBF UlNFVChfbmFtZSwgX2lkLCBfc3ViX2V4dHMpIFwKPiA+IC0gICAgICAgX1JJU0NWX0lTQV9FWFRf REFUQShfbmFtZSwgX2lkLCBfc3ViX2V4dHMsIEFSUkFZX1NJWkUoX3N1Yl9leHRzKSkKPiA+IC0K PiA+ICBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHJpc2N2X3prX2J1bmRsZWRfZXh0c1tdID0g ewo+ID4gICAgICAgICBSSVNDVl9JU0FfRVhUX1pCS0IsCj4gPiAgICAgICAgIFJJU0NWX0lTQV9F WFRfWkJLQywKPiA+IEBAIC0zNTMsNiArMzM2LDEwIEBAIHN0YXRpYyB2b2lkIF9faW5pdCByaXNj dl9wYXJzZV9pc2Ffc3RyaW5nKHVuc2lnbmVkIGxvbmcgKnRoaXNfaHdjYXAsIHN0cnVjdCByaXNj Cj4gPiAgICAgICAgICAgICAgICAgYm9vbCBleHRfbG9uZyA9IGZhbHNlLCBleHRfZXJyID0gZmFs c2U7Cj4gPgo+ID4gICAgICAgICAgICAgICAgIHN3aXRjaCAoKmV4dCkgewo+ID4gKyAgICAgICAg ICAgICAgIGNhc2UgJ3gnOgo+ID4gKyAgICAgICAgICAgICAgIGNhc2UgJ1gnOgo+ID4gKyAgICAg ICAgICAgICAgICAgICAgICAgcHJfd2Fybl9vbmNlKCJWZW5kb3IgZXh0ZW5zaW9ucyBhcmUgaWdu b3JlZCBpbiByaXNjdixpc2EuIFVzZSByaXNjdixpc2EtZXh0ZW5zaW9ucyBpbnN0ZWFkLiIpOwo+ ID4gKyAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Cj4gPiAgICAgICAgICAgICAgICAg Y2FzZSAncyc6Cj4gPiAgICAgICAgICAgICAgICAgICAgICAgICAvKgo+ID4gICAgICAgICAgICAg ICAgICAgICAgICAgICogV29ya2Fyb3VuZCBmb3IgaW52YWxpZCBzaW5nbGUtbGV0dGVyICdzJyAm ICd1JyAoUUVNVSkuCj4gPiBAQCAtMzY4LDggKzM1NSw2IEBAIHN0YXRpYyB2b2lkIF9faW5pdCBy aXNjdl9wYXJzZV9pc2Ffc3RyaW5nKHVuc2lnbmVkIGxvbmcgKnRoaXNfaHdjYXAsIHN0cnVjdCBy aXNjCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICB9Cj4gPiAgICAgICAgICAgICAgICAgICAg ICAgICBmYWxsdGhyb3VnaDsKPiA+ICAgICAgICAgICAgICAgICBjYXNlICdTJzoKPiA+IC0gICAg ICAgICAgICAgICBjYXNlICd4JzoKPiA+IC0gICAgICAgICAgICAgICBjYXNlICdYJzoKPiA+ICAg ICAgICAgICAgICAgICBjYXNlICd6JzoKPiA+ICAgICAgICAgICAgICAgICBjYXNlICdaJzoKPiA+ ICAgICAgICAgICAgICAgICAgICAgICAgIC8qCj4gPiBAQCAtNTcyLDYgKzU1Nyw1NCBAQCBzdGF0 aWMgdm9pZCBfX2luaXQgcmlzY3ZfZmlsbF9od2NhcF9mcm9tX2lzYV9zdHJpbmcodW5zaWduZWQg bG9uZyAqaXNhMmh3Y2FwKQo+ID4gICAgICAgICAgICAgICAgIGFjcGlfcHV0X3RhYmxlKChzdHJ1 Y3QgYWNwaV90YWJsZV9oZWFkZXIgKilyaGN0KTsKPiA+ICB9Cj4gPgo+ID4gK3N0YXRpYyB2b2lk IF9faW5pdCByaXNjdl9maWxsX2NwdV92ZW5kb3JfZXh0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqY3B1 X25vZGUsIGludCBjcHUpCj4gPiArewo+ID4gKyAgICAgICBpZiAoIUlTX0VOQUJMRUQoQ09ORklH X1JJU0NWX0lTQV9WRU5ET1JfRVhUKSkKPiA+ICsgICAgICAgICAgICAgICByZXR1cm47Cj4gPiAr Cj4gPiArICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmlzY3ZfaXNhX3ZlbmRvcl9leHRfbGlz dF9zaXplOyBpKyspIHsKPiA+ICsgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgcmlzY3ZfaXNh X3ZlbmRvcl9leHRfZGF0YV9saXN0ICpleHRfbGlzdCA9IHJpc2N2X2lzYV92ZW5kb3JfZXh0X2xp c3RbaV07Cj4gPiArCj4gPiArICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBleHRf bGlzdC0+ZXh0X2RhdGFfY291bnQ7IGorKykgewo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAg Y29uc3Qgc3RydWN0IHJpc2N2X2lzYV9leHRfZGF0YSBleHQgPSBleHRfbGlzdC0+ZXh0X2RhdGFb al07Cj4gPiArICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcmlzY3ZfaXNhaW5mbyAqaXNh dmVuZG9yaW5mbyA9ICZleHRfbGlzdC0+cGVyX2hhcnRfdmVuZG9yX2JpdG1hcFtjcHVdOwo+ID4g Kwo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9mX3Byb3BlcnR5X21hdGNoX3N0cmlu ZyhjcHVfbm9kZSwgInJpc2N2LGlzYS1leHRlbnNpb25zIiwKPiA+ICsgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0LnByb3BlcnR5KSA8IDApCj4g PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwo+ID4gKwo+ID4gKyAg ICAgICAgICAgICAgICAgICAgICAgLyoKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAqIEFz c3VtZSB0aGF0IHN1YnNldCBleHRlbnNpb25zIGFyZSBhbGwgbWVtYmVycyBvZiB0aGUKPiA+ICsg ICAgICAgICAgICAgICAgICAgICAgICAqIHNhbWUgdmVuZG9yLgo+ID4gKyAgICAgICAgICAgICAg ICAgICAgICAgICovCj4gPiArICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXh0LnN1YnNldF9l eHRfc2l6ZSkKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgayA9 IDA7IGsgPCBleHQuc3Vic2V0X2V4dF9zaXplOyBrKyspCj4gPiArICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgc2V0X2JpdChleHQuc3Vic2V0X2V4dF9pZHNba10sIGlzYXZl bmRvcmluZm8tPmlzYSk7Cj4gPiArCj4gPiArICAgICAgICAgICAgICAgICAgICAgICBzZXRfYml0 KGV4dC5pZCwgaXNhdmVuZG9yaW5mby0+aXNhKTsKPiA+ICsgICAgICAgICAgICAgICB9Cj4gCj4g VGhpcyBsb29wIHNlZW1zIHN1cGVyIHNpbWlsYXIgdG8gdGhlIHJlZ3VsYXIgb25lIChpbgo+IHJp c2N2X2ZpbGxfaHdjYXBfZnJvbV9leHRfbGlzdCgpIGluIHRoZSByYW5kb20sIHBvc3NpYmx5IG9s ZCwga2VybmVsIEkKPiBoYXZlIG9wZW4pLiBDb3VsZCB3ZSByZWZhY3RvciB0aGVzZSB0b2dldGhl ciBpbnRvIGEgY29tbW9uIGhlbHBlcj8gVGhlCj4gb3RoZXIgbG9vcCBoYXMgYW4gZXh0cmEgc3Rh bnphIGZvciByaXNjdl9pc2FfZXh0ZW5zaW9uX2NoZWNrKCksIHNvCj4gd2UnZCBoYXZlIHRvIGFk ZCBhbiBleHRyYSBjb25kaXRpb24gdGhlcmUsIGJ1dCBvdGhlcndpc2UgaXQgbG9va3MKPiBwcmV0 dHkgY29tcGF0aWJsZT8KPiAKPiA+ICsgICAgICAgfQo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMg dm9pZCBfX2luaXQgcmlzY3ZfZmlsbF92ZW5kb3JfZXh0X2xpc3QoaW50IGNwdSkKPiA+ICt7Cj4g PiArICAgICAgIGlmICghSVNfRU5BQkxFRChDT05GSUdfUklTQ1ZfSVNBX1ZFTkRPUl9FWFQpKQo+ ID4gKyAgICAgICAgICAgICAgIHJldHVybjsKPiA+ICsKPiA+ICsgICAgICAgZm9yIChpbnQgaSA9 IDA7IGkgPCByaXNjdl9pc2FfdmVuZG9yX2V4dF9saXN0X3NpemU7IGkrKykgewo+ID4gKyAgICAg ICAgICAgICAgIGNvbnN0IHN0cnVjdCByaXNjdl9pc2FfdmVuZG9yX2V4dF9kYXRhX2xpc3QgKmV4 dF9saXN0ID0gcmlzY3ZfaXNhX3ZlbmRvcl9leHRfbGlzdFtpXTsKPiA+ICsKPiA+ICsgICAgICAg ICAgICAgICBpZiAoYml0bWFwX2VtcHR5KGV4dF9saXN0LT52ZW5kb3JfYml0bWFwLCBleHRfbGlz dC0+Yml0bWFwX3NpemUpKQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgYml0bWFwX2NvcHko ZXh0X2xpc3QtPnZlbmRvcl9iaXRtYXAsCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBleHRfbGlzdC0+cGVyX2hhcnRfdmVuZG9yX2JpdG1hcFtjcHVdLmlzYSwKPiA+ICsg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dF9saXN0LT5iaXRtYXBfc2l6ZSk7 Cj4gCj4gQ291bGQgeW91IGdldCBpbnRvIHRyb3VibGUgaGVyZSBpZiB0aGUgc2V0IG9mIHZlbmRv ciBleHRlbnNpb25zCj4gcmVkdWNlcyB0byB6ZXJvLCBhbmQgdGhlbiBiZWNvbWVzIG5vbi16ZXJv PyBUbyBpbGx1c3RyYXRlLCBjb25zaWRlcgo+IHRoZXNlIG1hc2tzOgo+IGNwdSAwOiAweDAwMDBD MDAwCj4gY3B1IDE6IDB4MDAwMDAwMDMgPDw8IHZlbmRvcl9iaXRtYXAgQU5EcyBvdXQgdG8gMAo+ IGNwdSAyOiAweDAwMDAwMDEwIDw8PCBvb3BzLCB3ZSBlbmQgdXAgY29weWluZyB0aGlzIGludG8g dmVuZG9yX2JpdG1hcAo+IAo+ID4gKyAgICAgICAgICAgICAgIGVsc2UKPiA+ICsgICAgICAgICAg ICAgICAgICAgICAgIGJpdG1hcF9hbmQoZXh0X2xpc3QtPnZlbmRvcl9iaXRtYXAsIGV4dF9saXN0 LT52ZW5kb3JfYml0bWFwLAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBl eHRfbGlzdC0+cGVyX2hhcnRfdmVuZG9yX2JpdG1hcFtjcHVdLmlzYSwKPiA+ICsgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgZXh0X2xpc3QtPmJpdG1hcF9zaXplKTsKPiA+ICsgICAg ICAgfQo+ID4gK30KPiA+ICsKPiA+ICBzdGF0aWMgaW50IF9faW5pdCByaXNjdl9maWxsX2h3Y2Fw X2Zyb21fZXh0X2xpc3QodW5zaWduZWQgbG9uZyAqaXNhMmh3Y2FwKQo+ID4gIHsKPiA+ICAgICAg ICAgdW5zaWduZWQgaW50IGNwdTsKPiA+IEBAIC02MTUsNiArNjQ4LDggQEAgc3RhdGljIGludCBf X2luaXQgcmlzY3ZfZmlsbF9od2NhcF9mcm9tX2V4dF9saXN0KHVuc2lnbmVkIGxvbmcgKmlzYTJo d2NhcCkKPiA+ICAgICAgICAgICAgICAgICAgICAgICAgIH0KPiA+ICAgICAgICAgICAgICAgICB9 Cj4gPgo+ID4gKyAgICAgICAgICAgICAgIHJpc2N2X2ZpbGxfY3B1X3ZlbmRvcl9leHQoY3B1X25v ZGUsIGNwdSk7Cj4gPiArCj4gPiAgICAgICAgICAgICAgICAgb2Zfbm9kZV9wdXQoY3B1X25vZGUp Owo+ID4KPiA+ICAgICAgICAgICAgICAgICAvKgo+ID4gQEAgLTYzMCw2ICs2NjUsOCBAQCBzdGF0 aWMgaW50IF9faW5pdCByaXNjdl9maWxsX2h3Y2FwX2Zyb21fZXh0X2xpc3QodW5zaWduZWQgbG9u ZyAqaXNhMmh3Y2FwKQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgYml0bWFwX2NvcHkocmlz Y3ZfaXNhLCBpc2FpbmZvLT5pc2EsIFJJU0NWX0lTQV9FWFRfTUFYKTsKPiA+ICAgICAgICAgICAg ICAgICBlbHNlCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICBiaXRtYXBfYW5kKHJpc2N2X2lz YSwgcmlzY3ZfaXNhLCBpc2FpbmZvLT5pc2EsIFJJU0NWX0lTQV9FWFRfTUFYKTsKPiA+ICsKPiA+ ICsgICAgICAgICAgICAgICByaXNjdl9maWxsX3ZlbmRvcl9leHRfbGlzdChjcHUpOwo+ID4gICAg ICAgICB9Cj4gPgo+ID4gICAgICAgICBpZiAoYml0bWFwX2VtcHR5KHJpc2N2X2lzYSwgUklTQ1Zf SVNBX0VYVF9NQVgpKQo+ID4gZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3Yva2VybmVsL3ZlbmRvcl9l eHRlbnNpb25zLmMgYi9hcmNoL3Jpc2N2L2tlcm5lbC92ZW5kb3JfZXh0ZW5zaW9ucy5jCj4gPiBu ZXcgZmlsZSBtb2RlIDEwMDY0NAo+ID4gaW5kZXggMDAwMDAwMDAwMDAwLi5mNzZjYjMwMTNjMmQK PiA+IC0tLSAvZGV2L251bGwKPiA+ICsrKyBiL2FyY2gvcmlzY3Yva2VybmVsL3ZlbmRvcl9leHRl bnNpb25zLmMKPiA+IEBAIC0wLDAgKzEsMTggQEAKPiA+ICsvLyBTUERYLUxpY2Vuc2UtSWRlbnRp ZmllcjogR1BMLTIuMC1vbmx5Cj4gPiArLyoKPiA+ICsgKiBDb3B5cmlnaHQgMjAyNCBSaXZvcywg SW5jCj4gPiArICovCj4gPiArCj4gPiArI2luY2x1ZGUgPGFzbS92ZW5kb3JfZXh0ZW5zaW9ucy5o Pgo+ID4gKyNpbmNsdWRlIDxhc20vdmVuZG9yX2V4dGVuc2lvbnMvdGhlYWQuaD4KPiA+ICsKPiA+ ICsjaW5jbHVkZSA8bGludXgvYXJyYXlfc2l6ZS5oPgo+ID4gKyNpbmNsdWRlIDxsaW51eC90eXBl cy5oPgo+ID4gKwo+ID4gK2NvbnN0IHN0cnVjdCByaXNjdl9pc2FfdmVuZG9yX2V4dF9kYXRhX2xp c3QgKnJpc2N2X2lzYV92ZW5kb3JfZXh0X2xpc3RbXSA9IHsKPiA+ICsjaWZkZWYgQ09ORklHX1JJ U0NWX0lTQV9WRU5ET1JfRVhUX1RIRUFECj4gPiArICAgICAgICZyaXNjdl9pc2FfdmVuZG9yX2V4 dF9saXN0X3RoZWFkLAo+ID4gKyNlbmRpZgo+ID4gK307Cj4gPiArCj4gPiArY29uc3Qgc2l6ZV90 IHJpc2N2X2lzYV92ZW5kb3JfZXh0X2xpc3Rfc2l6ZSA9IEFSUkFZX1NJWkUocmlzY3ZfaXNhX3Zl bmRvcl9leHRfbGlzdCk7Cj4gPiBkaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9rZXJuZWwvdmVuZG9y X2V4dGVuc2lvbnMvTWFrZWZpbGUgYi9hcmNoL3Jpc2N2L2tlcm5lbC92ZW5kb3JfZXh0ZW5zaW9u cy9NYWtlZmlsZQo+ID4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPiA+IGluZGV4IDAwMDAwMDAwMDAw MC4uMzM4MzA2NmJhYWFiCj4gPiAtLS0gL2Rldi9udWxsCj4gPiArKysgYi9hcmNoL3Jpc2N2L2tl cm5lbC92ZW5kb3JfZXh0ZW5zaW9ucy9NYWtlZmlsZQo+ID4gQEAgLTAsMCArMSwzIEBACj4gPiAr IyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5Cj4gPiArCj4gPiArb2JqLSQo Q09ORklHX1JJU0NWX0lTQV9WRU5ET1JfRVhUX1RIRUFEKSAgICAgICArPSB0aGVhZC5vCj4gPiBk aWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9rZXJuZWwvdmVuZG9yX2V4dGVuc2lvbnMvdGhlYWQuYyBi L2FyY2gvcmlzY3Yva2VybmVsL3ZlbmRvcl9leHRlbnNpb25zL3RoZWFkLmMKPiA+IG5ldyBmaWxl IG1vZGUgMTAwNjQ0Cj4gPiBpbmRleCAwMDAwMDAwMDAwMDAuLmVkYjIwYjkyOGMwYwo+ID4gLS0t IC9kZXYvbnVsbAo+ID4gKysrIGIvYXJjaC9yaXNjdi9rZXJuZWwvdmVuZG9yX2V4dGVuc2lvbnMv dGhlYWQuYwo+ID4gQEAgLTAsMCArMSwzNiBAQAo+ID4gKy8vIFNQRFgtTGljZW5zZS1JZGVudGlm aWVyOiBHUEwtMi4wLW9ubHkKPiA+ICsKPiA+ICsjaW5jbHVkZSA8YXNtL2NwdWZlYXR1cmUuaD4K PiA+ICsjaW5jbHVkZSA8YXNtL3ZlbmRvcl9leHRlbnNpb25zLmg+Cj4gPiArI2luY2x1ZGUgPGFz bS92ZW5kb3JfZXh0ZW5zaW9ucy90aGVhZC5oPgo+ID4gKwo+ID4gKyNpbmNsdWRlIDxsaW51eC9h cnJheV9zaXplLmg+Cj4gPiArI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Cj4gPiArCj4gPiArLyog QWxsIFQtSGVhZCB2ZW5kb3IgZXh0ZW5zaW9ucyBzdXBwb3J0ZWQgaW4gTGludXggKi8KPiA+ICtj b25zdCBzdHJ1Y3QgcmlzY3ZfaXNhX2V4dF9kYXRhIHJpc2N2X2lzYV92ZW5kb3JfZXh0X3RoZWFk W10gPSB7Cj4gPiArICAgICAgIF9fUklTQ1ZfSVNBX0VYVF9EQVRBKHh0aGVhZHZlY3RvciwgUklT Q1ZfSVNBX1ZFTkRPUl9FWFRfWFRIRUFEVkVDVE9SKSwKPiA+ICt9Owo+ID4gKwo+ID4gKy8qCj4g PiArICogVGhlIGZpcnN0IG1lbWJlciBvZiB0aGlzIHN0cnVjdCBtdXN0IGJlIGEgYml0bWFwIG5h bWVkIGlzYSBzbyBpdCBjYW4gYmUKPiA+ICsgKiBjb21wYXRpYmxlIHdpdGggcmlzY3ZfaXNhaW5m byBldmVuIHRob3VnaCB0aGUgc2l6ZXMgb2YgdGhlIGJpdG1hcHMgbWF5IGJlCj4gPiArICogZGlm ZmVyZW50Lgo+IFRoaXMgaXMga2luZGEgeXVja3ksIGFzIHlvdSdyZSBjYXN0aW5nIGEgYml0bWFw IG9mIGEgZGlmZmVyZW50IHNpemUKPiBpbnRvIGEgc3RydWN0IHJpc2N2X2lzYWluZm8gKiwgd2hp Y2ggaGFzIGEga25vd24gc2l6ZS4gSSBkb24ndAo+IG5lY2Vzc2FyaWx5IGhhdmUgYSBmYWJ1bG91 cyBzdWdnZXN0aW9uIHRvIGZpeCB0aG91Z2guIFRoZSBiZXN0IEkgY2FuCj4gY29tZSB1cCB3aXRo IGlzIHJlZmFjdG9yIHN0cnVjdCByaXNjdl9pc2FpbmZvIHRvIGJlOgo+IHN0cnVjdCByaXNjdl9p c2FpbmZvIHsKPiAgICAgaW50IGNvdW50Owo+ICAgICB1bnNpZ25lZCBsb25nIGlzYVswXTsKPiB9 Owo+IAo+IHRoZW4gZGVjbGFyZSBhIHN0YW5kYXJkIG9uZSAoZm9yIGhhcnRfaXNhLCB3aGljaCBp cyBzdGF0aWNhbGx5IGFsbG9jYXRlZCk6Cj4gc3RydWN0IHJpc2N2X3N0ZF9pc2FpbmZvIHsKPiAg ICAgaW50IGNvdW50Owo+ICAgICBERUNMQVJFX0JJVE1BUChpc2EsIFJJU0NWX0lTQV9FWFRfTUFY KTsKPiB9Cj4gCj4gYW5kIGEgdGhlYWQgb25lCj4gc3RydWN0IHJpc2N2X3RoZWFkX2lzYWluZm8g ewo+ICAgICBpbnQgY291bnQ7Cj4gICAgIERFQ0xBUkVfQklUTUFQKGlzYSwgUklTQ1ZfSVNBX1ZF TkRPUl9FWFRfTUFYX1RIRUFEKTsKPiB9Cj4gCj4gQnV0IHRoZXJlJ3Mgc3RpbGwgYSBjYXN0IGlu IHRoZXJlLCBhcyB5b3UnZCBjYXN0IHRoZSBzcGVjaWFsaXplZAo+IHN0cnVjdHMgdG8gc3RydWN0 IHJpc2N2X2lzYWluZm8gKi4gQnV0IGF0IGxlYXN0IHRoZSBzaXplIGlzIGluIHRoZXJlCj4gdG8g YmUgZW5mb3JjZWQgYXQgcnVudGltZSwgcmF0aGVyIHRoYW4gYSBjb21waWxlLXRpbWUgY2hlY2sg dGhhdCdzCj4gd3JvbmcuICBTbyBJJ2xsIGp1c3QgbGVhdmUgdGhpcyBoYWxmIGJha2VkIHRob3Vn aHQgaGVyZSwgYW5kIG1heWJlIHlvdQo+IGNhbiB0aGluayBvZiBhIGNsZWFuZXIgd2F5LCBvciBp Z25vcmUgaXQgOikuCj4gCgpBZnRlciBsb29raW5nIGludG8gdGhpcyBhIGJpdCBtb3JlLCBJIGFt IG5vdCBzdXJlIHRoZXJlIGlzIGEgImNsZWFuIiB3YXkKb2YgZG9pbmcgdGhpcy4gS2VlcyB3cm90 ZSBhbiBpbnRlcmVzdGluZyBhcnRpY2xlIGFib3V0IGFuIGFkamFjZW50CnByb2JsZW0gWzFdLCBh bmQgbXkgdGFrZWF3YXkgd2FzIHRoYXQgdGhlcmUgYXJlIHNvbWUgcGVvcGxlIHdvcmtpbmcgdG8K aW1wcm92ZSBzaXR1YXRpb25zIGxpa2UgdGhpcy4gVGhpcyBwYXR0ZXJuIGlzIHZlcnkgY2xvc2Ug dG8gdGhlIHN0YW5kYXJkCnN0cnVjdCB3aXRoIHRoZSBsZW5ndGggb2YgdGhlIGFycmF5IGFzIG9u ZSBlbGVtZW50IGFuZCB0aGUgYXJyYXkgaXRzZWxmCmFzIGFub3RoZXIgZWxlbWVudC4gVGhlcmUg YXJlIHR3byBtYWpvciBkaWZmZXJlbmNlcyB0aG91Z2gsIG9uZSBiZWluZwp0aGF0IHRoZSBjb3Vu dCBpcyBwdXQgdGhyb3VnaCBhIHNpbXBsZSBtYWNybyBCSVRTX1RPX0xPTkdTIHRvIGNhbGN1bGF0 ZQp0aGUgc2l6ZSBvZiB0aGUgYXJyYXkuIFRoZSBvdGhlciBpcyB0aGF0IGNvdW50IGlzIGEgY29t cGlsZSB0aW1lCmNvbnN0YW50IHRoYXQgc2hvdWxkIGJlIHBvcHVsYXRlZCBpbnRvIGFsbCBzdHJ1 Y3RzIG9mIHRoZSB0eXBlLCBzaW5jZSB3ZQpoYXZlIGFycmF5cyBvZiByaXNjdl9pc2FpbmZvIHRo YXQgc2hvdWxkIGJlIGFsbG9jYXRlZCBhdCBjb21waWxlIHRpbWUgdG8KYWxsIGhhdmUgdGhlIHNh bWUgY291bnQuIElkZWFsbHkgd2hhdCBJIHdvdWxkIHdhbnQgaXMgc29tZXRoaW5nIGxpa2U6Cgpz dHJ1Y3QgcmlzY3ZfdGhlYWRfaXNhaW5mbyB7CiAgICAgaW50IGNvdW50ID0gUklTQ1ZfSVNBX1ZF TkRPUl9FWFRfTUFYX1RIRUFEOwogICAgIERFQ0xBUkVfQklUTUFQKGlzYSwgUklTQ1ZfSVNBX1ZF TkRPUl9FWFRfTUFYX1RIRUFEKTsKfQoKT3RoZXJ3aXNlIHdlIG5lZWQgdG8gcG9wdWxhdGUgY291 bnQgYXQgcnVudGltZSBhbmQgdGhhdCBkZWZlYXRzIHRoZQpwb2ludCBpbiBteSBvcGluaW9uIHNp bmNlIHRoaXMgaXMgY3VycmVudGx5IGtub3duIGJ5IGFjY2Vzc2luZwp0aGUgImJpdG1hcF9zaXpl IiBvZiB0aGUgc3RhdGljYWxseSBhbGxvY2F0ZWQgc3RydWN0OgoKY29uc3Qgc3RydWN0IHJpc2N2 X2lzYV92ZW5kb3JfZXh0X2RhdGFfbGlzdCByaXNjdl9pc2FfdmVuZG9yX2V4dF9saXN0X3RoZWFk CgpUaGlzIGFsc28gaGFzIHRoZSBkb3duc2lkZSBvZiBoYXZpbmcgdGhlIHNhbWUgImNvdW50IiBy ZXBlYXRlZCBhY3Jvc3MKYWxsIG9mIHRoZSBpbnN0YW5jZXMgb2YgcmlzY3ZfdGhlYWRfaXNhaW5m byBvZiB3aGljaCB0aGVyZSBhcmUgYnkKZGVmYXVsdCA2NSAob25lIGZvciBlYWNoIG9mIHRoZSBD UFVzIGNvbmZpZ3VyZWQgd2l0aCBOUl9DUFVTIHdoaWNoCmRlZmF1bHRzIHRvIDY0IHBsdXMgYW4g YWRkaXRpb25hbCBmb3IgdGhlIGxlYXN0LWNvbW1vbi1kZW5vbWluYXRvcgphY3Jvc3MgYWxsIENQ VXMpLiBJdCdzIGEgcmVsYXRpdmVseSBsYXJnZSBhbW91bnQgb2YgYml0cyB0aGF0IGdldHMKIndh c3RlZCIuCgpKdXN0IGZvciBzb21lIGJhY2tncm91bmQgaGVyZSwgdGhlIHB1cnBvc2UgaGVyZSBp cyB0byBiZSBhYmxlIHRvIGhhdmUgYQpzdGFuZGFyZGl6ZWQgInN0cnVjdCByaXNjdl9pc2FfdmVu ZG9yX2V4dF9kYXRhX2xpc3QiIHRoYXQgZWFjaCB2ZW5kb3IKd2lsbCBiZSBhYmxlIHRvIHBvcHVs YXRlIHdpdGggdGhlaXIgdmVuZG9yIGV4dGVuc2lvbnMuIFRoZSB0aG91Z2h0IHdhcwp0aGF0IGVh Y2ggdmVuZG9yIHdpbGwgaGF2ZSBhIGRpZmZlcmVudCBudW1iZXIgb2YgZXh0ZW5zaW9ucyBzbyBl YWNoCnZlbmRvciBkb2Vzbid0IG5lZWQgdG8gcmVzZXJ2ZSB0aGUgc2FtZSBhbW91bnQgb2Ygc3Bh Y2UgaW4gdGhlaXIKc3RhdGljYWxseSBhbGxvY2F0ZWQgYml0bWFwLiB2ZW5kb3JBIG1heSBiZSBh YmxlIHRvIGZpdCB0aGVpciBleHRlbnNpb25zCmluIDY0IGJpdHMgYnV0IHZlbmRvckIgbWF5IG5l ZWQgMTI4LiBXZSdyZSB0YWxraW5nIGFib3V0IGEgc21hbGwgYW1vdW50Cm9mIHNwYWNlIHNhdmlu Z3MgaGVyZS4gV2UgY291bGQgZm9yZWdvIHRoaXMgY2FzdGluZyBlbnRpcmVseSBhbmQgc2F5CmVh Y2ggdmVuZG9yIHdpbGwgbmVlZCBhIG1heGltdW0gb2YgWCBiaXRzLiBJdCBtYXkgYmUgdW5saWtl bHkgZm9yIGFueQp2ZW5kb3IgdG8gZXZlciBlbmQgdXAgd2l0aCBtb3JlIHRoYW4gNjQgdmVuZG9y IGV4dGVuc2lvbnMgdGhhdCB0aGV5IHdhbnQKZXhwb3NlZCB0byB0aGUga2VybmVsLiBCdXQgaWYg YW55IHZlbmRvciBldmVyIGRvZXMgZW5kIHVwIHdpdGggbW9yZSB0aGFuCjY0LCBhbGwgb2YgdGhl IHZlbmRvcnMgZW5kIHVwIG5lZWRpbmcgdG8gaGF2ZSB0byBhbGxvY2F0ZSAxMjggYml0cyBpbgp0 aGVpciBiaXRtYXNrIHRoYXQgaXMgYWxsb2NhdGVkIGZvciBlYWNoIHBvc3NpYmxlIENQVS4KClsx XSBodHRwczovL3Blb3BsZS5rZXJuZWwub3JnL2tlZXMvYm91bmRlZC1mbGV4aWJsZS1hcnJheXMt aW4tYwoKLSBDaGFybGllCgo+IAo+ID4gKyAqLwo+ID4gK3N0cnVjdCByaXNjdl9pc2F2ZW5kb3Jp bmZvX3RoZWFkIHsKPiA+ICsgICAgICAgREVDTEFSRV9CSVRNQVAoaXNhLCBSSVNDVl9JU0FfVkVO RE9SX0VYVF9NQVhfVEhFQUQpOwo+ID4gK307Cj4gPiArCj4gPiArLyogSGFydCBzcGVjaWZpYyBU LUhlYWQgdmVuZG9yIGV4dGVuc2lvbiBzdXBwb3J0ICovCj4gPiArc3RhdGljIHN0cnVjdCByaXNj dl9pc2F2ZW5kb3JpbmZvX3RoZWFkIGhhcnRfdmVuZG9yaW5mb190aGVhZFtOUl9DUFVTXTsKPiA+ ICsKPiA+ICsvKiBTZXQgb2YgVC1IZWFkIHZlbmRvciBleHRlbnNpb25zIHN1cHBvcnRlZCBvbiBh bGwgaGFydHMgKi8KPiA+ICtERUNMQVJFX0JJVE1BUCh2ZW5kb3JpbmZvX3RoZWFkLCBSSVNDVl9J U0FfVkVORE9SX0VYVF9NQVhfVEhFQUQpOwo+ID4gKwo+ID4gK2NvbnN0IHN0cnVjdCByaXNjdl9p c2FfdmVuZG9yX2V4dF9kYXRhX2xpc3QgcmlzY3ZfaXNhX3ZlbmRvcl9leHRfbGlzdF90aGVhZCA9 IHsKPiA+ICsgICAgICAgLmV4dF9kYXRhID0gcmlzY3ZfaXNhX3ZlbmRvcl9leHRfdGhlYWQsCj4g PiArICAgICAgIC5wZXJfaGFydF92ZW5kb3JfYml0bWFwID0gKHN0cnVjdCByaXNjdl9pc2FpbmZv ICopaGFydF92ZW5kb3JpbmZvX3RoZWFkLAo+ID4gKyAgICAgICAudmVuZG9yX2JpdG1hcCA9IHZl bmRvcmluZm9fdGhlYWQsCj4gPiArICAgICAgIC5leHRfZGF0YV9jb3VudCA9IEFSUkFZX1NJWkUo cmlzY3ZfaXNhX3ZlbmRvcl9leHRfdGhlYWQpLAo+ID4gKyAgICAgICAuYml0bWFwX3NpemUgPSBS SVNDVl9JU0FfVkVORE9SX0VYVF9NQVhfVEhFQUQKPiA+ICt9Owo+ID4KPiA+IC0tCj4gPiAyLjQ0 LjAKPiA+CgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwps aW51eC1yaXNjdiBtYWlsaW5nIGxpc3QKbGludXgtcmlzY3ZAbGlzdHMuaW5mcmFkZWFkLm9yZwpo dHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LXJpc2N2Cg== From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id E2D52C4345F for ; Thu, 2 May 2024 22:31:43 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:References: Message-ID:Subject:Cc:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=7lxCh9yXiEZAoffzV5Ur+aW7IMaiZ7IaIysH7LhnoXo=; b=Rc8+WRJwNTd+e2 +PWHQblRDscgQm7v6BB+Dyu63kQlTW+nQXvfk86fSZ1eAhU7bG2cHUUBzQ7qMbn3Ld1i/TNIVRYbm NNtEBolyn85Tofz/MnwdHgTbHMkjmLM6ifZUJVEmeTuxh2Ad2OHaFLjy8YRMbZe5lZdjvlnmaaO6F n7p6LqGWjtOOAd8q9R2QEp+/LpCuUmh3RoOzXfO6V8mk79P5w2pQwZLvSgAh7FGqt7uJ9clYouCfu DWR8tB65H9uJzN6oHXIEIR0uYLqjH9nj42vTsH7NYfRAuk3j7O6iP0/GKsrtDFF5gK+4BseqhYS4M P9plN/iS0QvHKylUs6uA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1s2exf-0000000E76Y-2all; Thu, 02 May 2024 22:31:31 +0000 Received: from mail-pl1-x62e.google.com ([2607:f8b0:4864:20::62e]) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1s2exa-0000000E74d-2DIn for linux-arm-kernel@lists.infradead.org; Thu, 02 May 2024 22:31:28 +0000 Received: by mail-pl1-x62e.google.com with SMTP id d9443c01a7336-1ecff927a45so10269495ad.0 for ; Thu, 02 May 2024 15:31:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rivosinc-com.20230601.gappssmtp.com; s=20230601; t=1714689083; x=1715293883; darn=lists.infradead.org; h=in-reply-to:content-transfer-encoding:content-disposition :mime-version:references:message-id:subject:cc:to:from:date:from:to :cc:subject:date:message-id:reply-to; bh=Jyw7zxfMEtfqyw3yPaaOuPprN3b7DB1YugAVazrGrkk=; b=os/QpqjFyv1ZPT93tA2Cmn+x5gBc6LqWx57CT7UogIG/t3JJk4EMND8bAv4u5jeQ1P QAdv/aJeQM9+h9kCQWr59bRNfCqwj/GrtRiDdBk/160fjGbO0d9jkuX9Zfg1Ae0wFyiw leoWsEyLz6dkVHvqUAm/yiW0hil27PpUKPxZRUiONYks6E4i6Zkg90HBgSpJqujJONO/ VL3YojBAhOYs4ICz3ux/81XPmkQ9cos6bAozSePnNZdquAXLqdst4a19KQPuAzCc+Qj1 MTlhcB7znCS0uzeAr/5PbSxVi7WrtxxmXk5CxPLnc2KPy0oZznzxwZ3whORe7m9PKxnH sG+g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1714689083; x=1715293883; h=in-reply-to:content-transfer-encoding:content-disposition :mime-version:references:message-id:subject:cc:to:from:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=Jyw7zxfMEtfqyw3yPaaOuPprN3b7DB1YugAVazrGrkk=; b=hXybWzUW/l0V2xHfsEN75kMTpUdEMsVkiHk8Wj/Mo+XF8wh6GINDeYR9U84XxtXqO3 t7FmDJTVUGMaMjQYAAEL5jlQPVfjKZsakGnG01gF3wlCdMJn9afVFIkfDaA4NrBbF3kM Sd1llw8LdXiFhM3fJGqIZt/jawVo4AWiPNEww2LnBIvtBSTwCuFkgqDN5V09eadXDKDw g6cnVC2CLF5oAf7WqEPAxtje9gXUV7bcqvA0wl2pV9D0Kvq0r69M+AeZ2ysTLWBF72sg VO8/cEgpkHd5yAtKTyJbsptIR1DTiyq27ec52pfHyWVgqGzKmNP7MHw/vX+Gu5JcsqRQ TEVg== X-Forwarded-Encrypted: i=1; AJvYcCVcQZsL1lGwz1Cn4lG1o6lqiSdwWlZSWkYkqT+WSgj6LCKrZQKU3OKl8dOz55hcnhxaxSSp4qHnH1MlxR/WFco3mXsAUghIzkwYEtclTqcarmaCFNo= X-Gm-Message-State: AOJu0YyXH9WVhkpKBz1jjhlX/2crwFMiTYkA4j/nZWKha/pWcpRbSruj OlnO9FduuTjhP/Kn9lpDKB+R+/HT4Uhhy3N+QpgSU8pFrBlth7OVfb3dL8gg//g= X-Google-Smtp-Source: AGHT+IFB+rtKMcM3DQ0bkb6f6tzj/9Q4q165q3JA8fWP2cX4VeLL+YWsW17aB2bGX2oOxX/u+yG8AQ== X-Received: by 2002:a17:902:f685:b0:1e4:9c2f:d343 with SMTP id l5-20020a170902f68500b001e49c2fd343mr1287136plg.7.1714689082510; Thu, 02 May 2024 15:31:22 -0700 (PDT) Received: from ghost ([50.145.13.30]) by smtp.gmail.com with ESMTPSA id l9-20020a170903244900b001e3e13781c4sm1867363pls.54.2024.05.02.15.31.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 May 2024 15:31:21 -0700 (PDT) Date: Thu, 2 May 2024 15:31:17 -0700 From: Charlie Jenkins To: Evan Green Cc: Conor Dooley , Rob Herring , Krzysztof Kozlowski , Paul Walmsley , Palmer Dabbelt , Albert Ou , Guo Ren , Conor Dooley , Chen-Yu Tsai , Jernej Skrabec , Samuel Holland , Conor Dooley , =?iso-8859-1?Q?Cl=E9ment_L=E9ger?= , Jonathan Corbet , Shuah Khan , linux-riscv@lists.infradead.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Palmer Dabbelt , linux-arm-kernel@lists.infradead.org, linux-sunxi@lists.linux.dev, linux-doc@vger.kernel.org, linux-kselftest@vger.kernel.org Subject: Re: [PATCH v4 05/16] riscv: Extend cpufeature.c to detect vendor extensions Message-ID: References: <20240426-dev-charlie-support_thead_vector_6_9-v4-0-b692f3c516ec@rivosinc.com> <20240426-dev-charlie-support_thead_vector_6_9-v4-5-b692f3c516ec@rivosinc.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240502_153126_804287_6929C414 X-CRM114-Status: GOOD ( 41.76 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org T24gV2VkLCBNYXkgMDEsIDIwMjQgYXQgMDk6NDQ6MTVBTSAtMDcwMCwgRXZhbiBHcmVlbiB3cm90 ZToKPiBPbiBGcmksIEFwciAyNiwgMjAyNCBhdCAyOjI54oCvUE0gQ2hhcmxpZSBKZW5raW5zIDxj aGFybGllQHJpdm9zaW5jLmNvbT4gd3JvdGU6Cj4gPgo+ID4gU2VwYXJhdGUgdmVuZG9yIGV4dGVu c2lvbnMgb3V0IGludG8gb25lIHN0cnVjdCBwZXIgdmVuZG9yCj4gPiBpbnN0ZWFkIG9mIGFkZGlu ZyB2ZW5kb3IgZXh0ZW5zaW9ucyBvbnRvIHJpc2N2X2lzYV9leHQuCj4gPgo+ID4gQWRkIGEgaGlk ZGVuIGNvbmZpZyBSSVNDVl9JU0FfVkVORE9SX0VYVCB0byBjb25kaXRpb25hbGx5IGluY2x1ZGUg dGhpcwo+ID4gY29kZS4KPiA+Cj4gPiBUaGUgeHRoZWFkdmVjdG9yIHZlbmRvciBleHRlbnNpb24g aXMgYWRkZWQgdXNpbmcgdGhlc2UgY2hhbmdlcy4KPiA+Cj4gPiBTaWduZWQtb2ZmLWJ5OiBDaGFy bGllIEplbmtpbnMgPGNoYXJsaWVAcml2b3NpbmMuY29tPgo+ID4gLS0tCj4gPiAgYXJjaC9yaXNj di9LY29uZmlnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDIgKwo+ID4gIGFyY2gv cmlzY3YvS2NvbmZpZy52ZW5kb3IgICAgICAgICAgICAgICAgICAgICAgICB8IDE5ICsrKysrKwo+ ID4gIGFyY2gvcmlzY3YvaW5jbHVkZS9hc20vY3B1ZmVhdHVyZS5oICAgICAgICAgICAgICB8IDE4 ICsrKysrKwo+ID4gIGFyY2gvcmlzY3YvaW5jbHVkZS9hc20vdmVuZG9yX2V4dGVuc2lvbnMuaCAg ICAgICB8IDI2ICsrKysrKysrCj4gPiAgYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS92ZW5kb3JfZXh0 ZW5zaW9ucy90aGVhZC5oIHwgMTkgKysrKysrCj4gPiAgYXJjaC9yaXNjdi9rZXJuZWwvTWFrZWZp bGUgICAgICAgICAgICAgICAgICAgICAgIHwgIDIgKwo+ID4gIGFyY2gvcmlzY3Yva2VybmVsL2Nw dWZlYXR1cmUuYyAgICAgICAgICAgICAgICAgICB8IDc3ICsrKysrKysrKysrKysrKysrKy0tLS0t LQo+ID4gIGFyY2gvcmlzY3Yva2VybmVsL3ZlbmRvcl9leHRlbnNpb25zLmMgICAgICAgICAgICB8 IDE4ICsrKysrKwo+ID4gIGFyY2gvcmlzY3Yva2VybmVsL3ZlbmRvcl9leHRlbnNpb25zL01ha2Vm aWxlICAgICB8ICAzICsKPiA+ICBhcmNoL3Jpc2N2L2tlcm5lbC92ZW5kb3JfZXh0ZW5zaW9ucy90 aGVhZC5jICAgICAgfCAzNiArKysrKysrKysrKwo+ID4gIDEwIGZpbGVzIGNoYW5nZWQsIDIwMCBp bnNlcnRpb25zKCspLCAyMCBkZWxldGlvbnMoLSkKPiA+Cj4gPiBkaWZmIC0tZ2l0IGEvYXJjaC9y aXNjdi9LY29uZmlnIGIvYXJjaC9yaXNjdi9LY29uZmlnCj4gPiBpbmRleCBiZTA5Yzg4MzZkNTYu LmZlYzg2ZmJhM2FjZCAxMDA2NDQKPiA+IC0tLSBhL2FyY2gvcmlzY3YvS2NvbmZpZwo+ID4gKysr IGIvYXJjaC9yaXNjdi9LY29uZmlnCj4gPiBAQCAtNzU5LDYgKzc1OSw4IEBAIGNvbmZpZyBSSVND Vl9FRkZJQ0lFTlRfVU5BTElHTkVEX0FDQ0VTUwo+ID4KPiA+ICBlbmRjaG9pY2UKPiA+Cj4gPiAr c291cmNlICJhcmNoL3Jpc2N2L0tjb25maWcudmVuZG9yIgo+ID4gKwo+ID4gIGVuZG1lbnUgIyAi UGxhdGZvcm0gdHlwZSIKPiA+Cj4gPiAgbWVudSAiS2VybmVsIGZlYXR1cmVzIgo+ID4gZGlmZiAt LWdpdCBhL2FyY2gvcmlzY3YvS2NvbmZpZy52ZW5kb3IgYi9hcmNoL3Jpc2N2L0tjb25maWcudmVu ZG9yCj4gPiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+ID4gaW5kZXggMDAwMDAwMDAwMDAwLi40ZmM4 NjgxMGFmMWQKPiA+IC0tLSAvZGV2L251bGwKPiA+ICsrKyBiL2FyY2gvcmlzY3YvS2NvbmZpZy52 ZW5kb3IKPiA+IEBAIC0wLDAgKzEsMTkgQEAKPiA+ICttZW51ICJWZW5kb3IgZXh0ZW5zaW9ucyIK PiA+ICsKPiA+ICtjb25maWcgUklTQ1ZfSVNBX1ZFTkRPUl9FWFQKPiA+ICsgICAgICAgYm9vbAo+ ID4gKwo+ID4gK21lbnUgIlQtSGVhZCIKPiA+ICtjb25maWcgUklTQ1ZfSVNBX1ZFTkRPUl9FWFRf VEhFQUQKPiA+ICsgICAgICAgYm9vbCAiVC1IZWFkIHZlbmRvciBleHRlbnNpb24gc3VwcG9ydCIK PiA+ICsgICAgICAgc2VsZWN0IFJJU0NWX0lTQV9WRU5ET1JfRVhUCj4gPiArICAgICAgIGRlZmF1 bHQgeQo+ID4gKyAgICAgICBoZWxwCj4gPiArICAgICAgICAgU2F5IE4gaGVyZSBpZiB5b3Ugd2Fu dCB0byBkaXNhYmxlIGFsbCBULUhlYWQgdmVuZG9yIGV4dGVuc2lvbgo+ID4gKyAgICAgICAgIHN1 cHBvcnQuIFRoaXMgd2lsbCBjYXVzZSBhbnkgVC1IZWFkIHZlbmRvciBleHRlbnNpb25zIHRoYXQg YXJlCj4gPiArICAgICAgICAgcmVxdWVzdGVkIHRvIGJlIGlnbm9yZWQuCj4gPiArCj4gPiArICAg ICAgICAgSWYgeW91IGRvbid0IGtub3cgd2hhdCB0byBkbyBoZXJlLCBzYXkgWS4KPiA+ICtlbmRt ZW51Cj4gPiArCj4gPiArZW5kbWVudQo+ID4gZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3YvaW5jbHVk ZS9hc20vY3B1ZmVhdHVyZS5oIGIvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9jcHVmZWF0dXJlLmgK PiA+IGluZGV4IDBjNGYwODU3NzAxNS4uZmVkZDQ3OWNjZmQxIDEwMDY0NAo+ID4gLS0tIGEvYXJj aC9yaXNjdi9pbmNsdWRlL2FzbS9jcHVmZWF0dXJlLmgKPiA+ICsrKyBiL2FyY2gvcmlzY3YvaW5j bHVkZS9hc20vY3B1ZmVhdHVyZS5oCj4gPiBAQCAtMzUsNiArMzUsMjQgQEAgZXh0ZXJuIHUzMiBy aXNjdl92bGVuYl9vZjsKPiA+Cj4gPiAgdm9pZCByaXNjdl91c2VyX2lzYV9lbmFibGUodm9pZCk7 Cj4gPgo+ID4gKyNkZWZpbmUgX1JJU0NWX0lTQV9FWFRfREFUQShfbmFtZSwgX2lkLCBfc3Vic2V0 X2V4dHMsIF9zdWJzZXRfZXh0c19zaXplKSB7ICAgICBcCj4gPiArICAgICAgIC5uYW1lID0gI19u YW1lLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIFwKPiA+ICsgICAgICAgLnByb3BlcnR5ID0gI19uYW1lLCAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAo+ID4gKyAgICAgICAuaWQgPSBfaWQs ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBcCj4gPiArICAgICAgIC5zdWJzZXRfZXh0X2lkcyA9IF9zdWJzZXRfZXh0cywgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKPiA+ICsgICAgICAgLnN1YnNldF9l eHRfc2l6ZSA9IF9zdWJzZXRfZXh0c19zaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgXAo+ID4gK30KPiA+ICsKPiA+ICsjZGVmaW5lIF9fUklTQ1ZfSVNBX0VYVF9EQVRBKF9u YW1lLCBfaWQpIF9SSVNDVl9JU0FfRVhUX0RBVEEoX25hbWUsIF9pZCwgTlVMTCwgMCkKPiA+ICsK PiA+ICsvKiBVc2VkIHRvIGRlY2xhcmUgcHVyZSAibGFzc28iIGV4dGVuc2lvbiAoWmsgZm9yIGlu c3RhbmNlKSAqLwo+ID4gKyNkZWZpbmUgX19SSVNDVl9JU0FfRVhUX0JVTkRMRShfbmFtZSwgX2J1 bmRsZWRfZXh0cykgXAo+ID4gKyAgICAgICBfUklTQ1ZfSVNBX0VYVF9EQVRBKF9uYW1lLCBSSVND Vl9JU0FfRVhUX0lOVkFMSUQsIF9idW5kbGVkX2V4dHMsIEFSUkFZX1NJWkUoX2J1bmRsZWRfZXh0 cykpCj4gPiArCj4gPiArLyogVXNlZCB0byBkZWNsYXJlIGV4dGVuc2lvbnMgdGhhdCBhcmUgYSBz dXBlcnNldCBvZiBvdGhlciBleHRlbnNpb25zIChadmJiIGZvciBpbnN0YW5jZSkgKi8KPiA+ICsj ZGVmaW5lIF9fUklTQ1ZfSVNBX0VYVF9TVVBFUlNFVChfbmFtZSwgX2lkLCBfc3ViX2V4dHMpIFwK PiA+ICsgICAgICAgX1JJU0NWX0lTQV9FWFRfREFUQShfbmFtZSwgX2lkLCBfc3ViX2V4dHMsIEFS UkFZX1NJWkUoX3N1Yl9leHRzKSkKPiA+ICsKPiA+ICAjaWYgZGVmaW5lZChDT05GSUdfUklTQ1Zf TUlTQUxJR05FRCkKPiA+ICBib29sIGNoZWNrX3VuYWxpZ25lZF9hY2Nlc3NfZW11bGF0ZWRfYWxs X2NwdXModm9pZCk7Cj4gPiAgdm9pZCB1bmFsaWduZWRfZW11bGF0aW9uX2ZpbmlzaCh2b2lkKTsK PiA+IGRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL3ZlbmRvcl9leHRlbnNpb25z LmggYi9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL3ZlbmRvcl9leHRlbnNpb25zLmgKPiA+IG5ldyBm aWxlIG1vZGUgMTAwNjQ0Cj4gPiBpbmRleCAwMDAwMDAwMDAwMDAuLjBhZjFkZGQwYWY3MAo+ID4g LS0tIC9kZXYvbnVsbAo+ID4gKysrIGIvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS92ZW5kb3JfZXh0 ZW5zaW9ucy5oCj4gPiBAQCAtMCwwICsxLDI2IEBACj4gPiArLyogU1BEWC1MaWNlbnNlLUlkZW50 aWZpZXI6IEdQTC0yLjAtb25seSAqLwo+ID4gKy8qCj4gPiArICogQ29weXJpZ2h0IDIwMjQgUml2 b3MsIEluYwo+ID4gKyAqLwo+ID4gKwo+ID4gKyNpZm5kZWYgX0FTTV9WRU5ET1JfRVhURU5TSU9O U19ICj4gPiArI2RlZmluZSBfQVNNX1ZFTkRPUl9FWFRFTlNJT05TX0gKPiA+ICsKPiA+ICsjaW5j bHVkZSA8YXNtL2NwdWZlYXR1cmUuaD4KPiA+ICsKPiA+ICsjaW5jbHVkZSA8bGludXgvYXJyYXlf c2l6ZS5oPgo+ID4gKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgo+ID4gKwo+ID4gK3N0cnVjdCBy aXNjdl9pc2FfdmVuZG9yX2V4dF9kYXRhX2xpc3Qgewo+ID4gKyAgICAgICBjb25zdCBzdHJ1Y3Qg cmlzY3ZfaXNhX2V4dF9kYXRhICpleHRfZGF0YTsKPiA+ICsgICAgICAgc3RydWN0IHJpc2N2X2lz YWluZm8gKnBlcl9oYXJ0X3ZlbmRvcl9iaXRtYXA7Cj4gPiArICAgICAgIHVuc2lnbmVkIGxvbmcg KnZlbmRvcl9iaXRtYXA7Cj4gCj4gSXQgdG9vayBhIGxvdCBvZiBkaWdnaW5nIGZvciBtZSB0byB1 bmRlcnN0YW5kIHRoaXMgd2FzIHRoZSBzZXQgb2YKPiB2ZW5kb3IgZXh0ZW5zaW9ucyBzdXBwb3J0 ZWQgb24gYWxsIGhhcnRzLiBDYW4gd2UgYWRkIHRoYXQgdG8gdGhlIG5hbWUsCj4gbWF5YmUgc29t ZXRoaW5nIGxpa2UgaXNhX2JpdG1hcF9hbGxfaGFydHM/IChJIHdvbmRlciBpZiB3ZSBjb3VsZCBk cm9wCj4gdGhlIHZlbmRvciBwYXJ0IG9mIHRoZSBuYW1lIHNpbmNlIHdlIGFscmVhZHkga25vdyB3 ZSdyZSBpbiBhCj4gdmVuZG9yX2V4dF9kYXRhX2xpc3Qgc3RydWN0dXJlKS4KPiAKPiA+ICsgICAg ICAgY29uc3Qgc2l6ZV90IGV4dF9kYXRhX2NvdW50Owo+ID4gKyAgICAgICBjb25zdCBzaXplX3Qg Yml0bWFwX3NpemU7Cj4gPiArfTsKPiA+ICsKPiA+ICtleHRlcm4gY29uc3Qgc3RydWN0IHJpc2N2 X2lzYV92ZW5kb3JfZXh0X2RhdGFfbGlzdCAqcmlzY3ZfaXNhX3ZlbmRvcl9leHRfbGlzdFtdOwo+ ID4gKwo+ID4gK2V4dGVybiBjb25zdCBzaXplX3QgcmlzY3ZfaXNhX3ZlbmRvcl9leHRfbGlzdF9z aXplOwo+ID4gKwo+ID4gKyNlbmRpZiAvKiBfQVNNX1ZFTkRPUl9FWFRFTlNJT05TX0ggKi8KPiA+ IGRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL3ZlbmRvcl9leHRlbnNpb25zL3Ro ZWFkLmggYi9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL3ZlbmRvcl9leHRlbnNpb25zL3RoZWFkLmgK PiA+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gPiBpbmRleCAwMDAwMDAwMDAwMDAuLjkyZWVjNzI5 ODg4ZAo+ID4gLS0tIC9kZXYvbnVsbAo+ID4gKysrIGIvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS92 ZW5kb3JfZXh0ZW5zaW9ucy90aGVhZC5oCj4gPiBAQCAtMCwwICsxLDE5IEBACj4gPiArLyogU1BE WC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgKi8KPiA+ICsjaWZuZGVmIF9BU01fUklTQ1Zf VkVORE9SX0VYVEVOU0lPTlNfVEhFQURfSAo+ID4gKyNkZWZpbmUgX0FTTV9SSVNDVl9WRU5ET1Jf RVhURU5TSU9OU19USEVBRF9ICj4gPiArCj4gPiArI2luY2x1ZGUgPGFzbS92ZW5kb3JfZXh0ZW5z aW9ucy5oPgo+ID4gKwo+ID4gKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgo+ID4gKwo+ID4gKyNk ZWZpbmUgUklTQ1ZfSVNBX1ZFTkRPUl9FWFRfWFRIRUFEVkVDVE9SICAgICAgICAgICAgICAwCj4g PiArCj4gPiArLyoKPiA+ICsgKiBFeHRlbnNpb24ga2V5cyBzaG91bGQgYmUgc3RyaWN0bHkgbGVz cyB0aGFuIG1heC4KPiA+ICsgKiBJdCBpcyBzYWZlIHRvIGluY3JlbWVudCB0aGlzIHdoZW4gbmVj ZXNzYXJ5Lgo+ID4gKyAqLwo+ID4gKyNkZWZpbmUgUklTQ1ZfSVNBX1ZFTkRPUl9FWFRfTUFYX1RI RUFEICAgICAgICAgICAgICAgICAzMgo+ID4gKwo+ID4gK2V4dGVybiBjb25zdCBzdHJ1Y3Qgcmlz Y3ZfaXNhX3ZlbmRvcl9leHRfZGF0YV9saXN0IHJpc2N2X2lzYV92ZW5kb3JfZXh0X2xpc3RfdGhl YWQ7Cj4gPiArCj4gPiArI2VuZGlmCj4gPiBkaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9rZXJuZWwv TWFrZWZpbGUgYi9hcmNoL3Jpc2N2L2tlcm5lbC9NYWtlZmlsZQo+ID4gaW5kZXggODFkOTRhOGVl MTBmLi41MzM2MWM1MGZiNDYgMTAwNjQ0Cj4gPiAtLS0gYS9hcmNoL3Jpc2N2L2tlcm5lbC9NYWtl ZmlsZQo+ID4gKysrIGIvYXJjaC9yaXNjdi9rZXJuZWwvTWFrZWZpbGUKPiA+IEBAIC01OCw2ICs1 OCw4IEBAIG9iai15ICs9IHJpc2N2X2tzeW1zLm8KPiA+ICBvYmoteSAgKz0gc3RhY2t0cmFjZS5v Cj4gPiAgb2JqLXkgICs9IGNhY2hlaW5mby5vCj4gPiAgb2JqLXkgICs9IHBhdGNoLm8KPiA+ICtv YmoteSAgKz0gdmVuZG9yX2V4dGVuc2lvbnMubwo+ID4gK29iai15ICArPSB2ZW5kb3JfZXh0ZW5z aW9ucy8KPiA+ICBvYmoteSAgKz0gcHJvYmVzLwo+ID4gIG9iai15ICArPSB0ZXN0cy8KPiA+ICBv YmotJChDT05GSUdfTU1VKSArPSB2ZHNvLm8gdmRzby8KPiA+IGRpZmYgLS1naXQgYS9hcmNoL3Jp c2N2L2tlcm5lbC9jcHVmZWF0dXJlLmMgYi9hcmNoL3Jpc2N2L2tlcm5lbC9jcHVmZWF0dXJlLmMK PiA+IGluZGV4IDgxNThmMzRjM2UzNi4uYzA3MzQ5NDUxOWViIDEwMDY0NAo+ID4gLS0tIGEvYXJj aC9yaXNjdi9rZXJuZWwvY3B1ZmVhdHVyZS5jCj4gPiArKysgYi9hcmNoL3Jpc2N2L2tlcm5lbC9j cHVmZWF0dXJlLmMKPiA+IEBAIC0yNCw2ICsyNCw3IEBACj4gPiAgI2luY2x1ZGUgPGFzbS9wcm9j ZXNzb3IuaD4KPiA+ICAjaW5jbHVkZSA8YXNtL3NiaS5oPgo+ID4gICNpbmNsdWRlIDxhc20vdmVj dG9yLmg+Cj4gPiArI2luY2x1ZGUgPGFzbS92ZW5kb3JfZXh0ZW5zaW9ucy5oPgo+ID4KPiA+ICAj ZGVmaW5lIE5VTV9BTFBIQV9FWFRTICgneicgLSAnYScgKyAxKQo+ID4KPiA+IEBAIC0xMDIsMjQg KzEwMyw2IEBAIHN0YXRpYyBib29sIHJpc2N2X2lzYV9leHRlbnNpb25fY2hlY2soaW50IGlkKQo+ ID4gICAgICAgICByZXR1cm4gdHJ1ZTsKPiA+ICB9Cj4gPgo+ID4gLSNkZWZpbmUgX1JJU0NWX0lT QV9FWFRfREFUQShfbmFtZSwgX2lkLCBfc3Vic2V0X2V4dHMsIF9zdWJzZXRfZXh0c19zaXplKSB7 ICAgICBcCj4gPiAtICAgICAgIC5uYW1lID0gI19uYW1lLCAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKPiA+IC0gICAgICAgLnByb3BlcnR5 ID0gI19uYW1lLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgXAo+ID4gLSAgICAgICAuaWQgPSBfaWQsICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCj4gPiAtICAgICAgIC5zdWJzZXRf ZXh0X2lkcyA9IF9zdWJzZXRfZXh0cywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIFwKPiA+IC0gICAgICAgLnN1YnNldF9leHRfc2l6ZSA9IF9zdWJzZXRfZXh0c19zaXpl ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAo+ID4gLX0KPiA+IC0KPiA+IC0j ZGVmaW5lIF9fUklTQ1ZfSVNBX0VYVF9EQVRBKF9uYW1lLCBfaWQpIF9SSVNDVl9JU0FfRVhUX0RB VEEoX25hbWUsIF9pZCwgTlVMTCwgMCkKPiA+IC0KPiA+IC0vKiBVc2VkIHRvIGRlY2xhcmUgcHVy ZSAibGFzc28iIGV4dGVuc2lvbiAoWmsgZm9yIGluc3RhbmNlKSAqLwo+ID4gLSNkZWZpbmUgX19S SVNDVl9JU0FfRVhUX0JVTkRMRShfbmFtZSwgX2J1bmRsZWRfZXh0cykgXAo+ID4gLSAgICAgICBf UklTQ1ZfSVNBX0VYVF9EQVRBKF9uYW1lLCBSSVNDVl9JU0FfRVhUX0lOVkFMSUQsIF9idW5kbGVk X2V4dHMsIEFSUkFZX1NJWkUoX2J1bmRsZWRfZXh0cykpCj4gPiAtCj4gPiAtLyogVXNlZCB0byBk ZWNsYXJlIGV4dGVuc2lvbnMgdGhhdCBhcmUgYSBzdXBlcnNldCBvZiBvdGhlciBleHRlbnNpb25z IChadmJiIGZvciBpbnN0YW5jZSkgKi8KPiA+IC0jZGVmaW5lIF9fUklTQ1ZfSVNBX0VYVF9TVVBF UlNFVChfbmFtZSwgX2lkLCBfc3ViX2V4dHMpIFwKPiA+IC0gICAgICAgX1JJU0NWX0lTQV9FWFRf REFUQShfbmFtZSwgX2lkLCBfc3ViX2V4dHMsIEFSUkFZX1NJWkUoX3N1Yl9leHRzKSkKPiA+IC0K PiA+ICBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHJpc2N2X3prX2J1bmRsZWRfZXh0c1tdID0g ewo+ID4gICAgICAgICBSSVNDVl9JU0FfRVhUX1pCS0IsCj4gPiAgICAgICAgIFJJU0NWX0lTQV9F WFRfWkJLQywKPiA+IEBAIC0zNTMsNiArMzM2LDEwIEBAIHN0YXRpYyB2b2lkIF9faW5pdCByaXNj dl9wYXJzZV9pc2Ffc3RyaW5nKHVuc2lnbmVkIGxvbmcgKnRoaXNfaHdjYXAsIHN0cnVjdCByaXNj Cj4gPiAgICAgICAgICAgICAgICAgYm9vbCBleHRfbG9uZyA9IGZhbHNlLCBleHRfZXJyID0gZmFs c2U7Cj4gPgo+ID4gICAgICAgICAgICAgICAgIHN3aXRjaCAoKmV4dCkgewo+ID4gKyAgICAgICAg ICAgICAgIGNhc2UgJ3gnOgo+ID4gKyAgICAgICAgICAgICAgIGNhc2UgJ1gnOgo+ID4gKyAgICAg ICAgICAgICAgICAgICAgICAgcHJfd2Fybl9vbmNlKCJWZW5kb3IgZXh0ZW5zaW9ucyBhcmUgaWdu b3JlZCBpbiByaXNjdixpc2EuIFVzZSByaXNjdixpc2EtZXh0ZW5zaW9ucyBpbnN0ZWFkLiIpOwo+ ID4gKyAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Cj4gPiAgICAgICAgICAgICAgICAg Y2FzZSAncyc6Cj4gPiAgICAgICAgICAgICAgICAgICAgICAgICAvKgo+ID4gICAgICAgICAgICAg ICAgICAgICAgICAgICogV29ya2Fyb3VuZCBmb3IgaW52YWxpZCBzaW5nbGUtbGV0dGVyICdzJyAm ICd1JyAoUUVNVSkuCj4gPiBAQCAtMzY4LDggKzM1NSw2IEBAIHN0YXRpYyB2b2lkIF9faW5pdCBy aXNjdl9wYXJzZV9pc2Ffc3RyaW5nKHVuc2lnbmVkIGxvbmcgKnRoaXNfaHdjYXAsIHN0cnVjdCBy aXNjCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICB9Cj4gPiAgICAgICAgICAgICAgICAgICAg ICAgICBmYWxsdGhyb3VnaDsKPiA+ICAgICAgICAgICAgICAgICBjYXNlICdTJzoKPiA+IC0gICAg ICAgICAgICAgICBjYXNlICd4JzoKPiA+IC0gICAgICAgICAgICAgICBjYXNlICdYJzoKPiA+ICAg ICAgICAgICAgICAgICBjYXNlICd6JzoKPiA+ICAgICAgICAgICAgICAgICBjYXNlICdaJzoKPiA+ ICAgICAgICAgICAgICAgICAgICAgICAgIC8qCj4gPiBAQCAtNTcyLDYgKzU1Nyw1NCBAQCBzdGF0 aWMgdm9pZCBfX2luaXQgcmlzY3ZfZmlsbF9od2NhcF9mcm9tX2lzYV9zdHJpbmcodW5zaWduZWQg bG9uZyAqaXNhMmh3Y2FwKQo+ID4gICAgICAgICAgICAgICAgIGFjcGlfcHV0X3RhYmxlKChzdHJ1 Y3QgYWNwaV90YWJsZV9oZWFkZXIgKilyaGN0KTsKPiA+ICB9Cj4gPgo+ID4gK3N0YXRpYyB2b2lk IF9faW5pdCByaXNjdl9maWxsX2NwdV92ZW5kb3JfZXh0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqY3B1 X25vZGUsIGludCBjcHUpCj4gPiArewo+ID4gKyAgICAgICBpZiAoIUlTX0VOQUJMRUQoQ09ORklH X1JJU0NWX0lTQV9WRU5ET1JfRVhUKSkKPiA+ICsgICAgICAgICAgICAgICByZXR1cm47Cj4gPiAr Cj4gPiArICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmlzY3ZfaXNhX3ZlbmRvcl9leHRfbGlz dF9zaXplOyBpKyspIHsKPiA+ICsgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgcmlzY3ZfaXNh X3ZlbmRvcl9leHRfZGF0YV9saXN0ICpleHRfbGlzdCA9IHJpc2N2X2lzYV92ZW5kb3JfZXh0X2xp c3RbaV07Cj4gPiArCj4gPiArICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBleHRf bGlzdC0+ZXh0X2RhdGFfY291bnQ7IGorKykgewo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAg Y29uc3Qgc3RydWN0IHJpc2N2X2lzYV9leHRfZGF0YSBleHQgPSBleHRfbGlzdC0+ZXh0X2RhdGFb al07Cj4gPiArICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcmlzY3ZfaXNhaW5mbyAqaXNh dmVuZG9yaW5mbyA9ICZleHRfbGlzdC0+cGVyX2hhcnRfdmVuZG9yX2JpdG1hcFtjcHVdOwo+ID4g Kwo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9mX3Byb3BlcnR5X21hdGNoX3N0cmlu ZyhjcHVfbm9kZSwgInJpc2N2LGlzYS1leHRlbnNpb25zIiwKPiA+ICsgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0LnByb3BlcnR5KSA8IDApCj4g PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwo+ID4gKwo+ID4gKyAg ICAgICAgICAgICAgICAgICAgICAgLyoKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAqIEFz c3VtZSB0aGF0IHN1YnNldCBleHRlbnNpb25zIGFyZSBhbGwgbWVtYmVycyBvZiB0aGUKPiA+ICsg ICAgICAgICAgICAgICAgICAgICAgICAqIHNhbWUgdmVuZG9yLgo+ID4gKyAgICAgICAgICAgICAg ICAgICAgICAgICovCj4gPiArICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXh0LnN1YnNldF9l eHRfc2l6ZSkKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgayA9 IDA7IGsgPCBleHQuc3Vic2V0X2V4dF9zaXplOyBrKyspCj4gPiArICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgc2V0X2JpdChleHQuc3Vic2V0X2V4dF9pZHNba10sIGlzYXZl bmRvcmluZm8tPmlzYSk7Cj4gPiArCj4gPiArICAgICAgICAgICAgICAgICAgICAgICBzZXRfYml0 KGV4dC5pZCwgaXNhdmVuZG9yaW5mby0+aXNhKTsKPiA+ICsgICAgICAgICAgICAgICB9Cj4gCj4g VGhpcyBsb29wIHNlZW1zIHN1cGVyIHNpbWlsYXIgdG8gdGhlIHJlZ3VsYXIgb25lIChpbgo+IHJp c2N2X2ZpbGxfaHdjYXBfZnJvbV9leHRfbGlzdCgpIGluIHRoZSByYW5kb20sIHBvc3NpYmx5IG9s ZCwga2VybmVsIEkKPiBoYXZlIG9wZW4pLiBDb3VsZCB3ZSByZWZhY3RvciB0aGVzZSB0b2dldGhl ciBpbnRvIGEgY29tbW9uIGhlbHBlcj8gVGhlCj4gb3RoZXIgbG9vcCBoYXMgYW4gZXh0cmEgc3Rh bnphIGZvciByaXNjdl9pc2FfZXh0ZW5zaW9uX2NoZWNrKCksIHNvCj4gd2UnZCBoYXZlIHRvIGFk ZCBhbiBleHRyYSBjb25kaXRpb24gdGhlcmUsIGJ1dCBvdGhlcndpc2UgaXQgbG9va3MKPiBwcmV0 dHkgY29tcGF0aWJsZT8KPiAKPiA+ICsgICAgICAgfQo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMg dm9pZCBfX2luaXQgcmlzY3ZfZmlsbF92ZW5kb3JfZXh0X2xpc3QoaW50IGNwdSkKPiA+ICt7Cj4g PiArICAgICAgIGlmICghSVNfRU5BQkxFRChDT05GSUdfUklTQ1ZfSVNBX1ZFTkRPUl9FWFQpKQo+ ID4gKyAgICAgICAgICAgICAgIHJldHVybjsKPiA+ICsKPiA+ICsgICAgICAgZm9yIChpbnQgaSA9 IDA7IGkgPCByaXNjdl9pc2FfdmVuZG9yX2V4dF9saXN0X3NpemU7IGkrKykgewo+ID4gKyAgICAg ICAgICAgICAgIGNvbnN0IHN0cnVjdCByaXNjdl9pc2FfdmVuZG9yX2V4dF9kYXRhX2xpc3QgKmV4 dF9saXN0ID0gcmlzY3ZfaXNhX3ZlbmRvcl9leHRfbGlzdFtpXTsKPiA+ICsKPiA+ICsgICAgICAg ICAgICAgICBpZiAoYml0bWFwX2VtcHR5KGV4dF9saXN0LT52ZW5kb3JfYml0bWFwLCBleHRfbGlz dC0+Yml0bWFwX3NpemUpKQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgYml0bWFwX2NvcHko ZXh0X2xpc3QtPnZlbmRvcl9iaXRtYXAsCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBleHRfbGlzdC0+cGVyX2hhcnRfdmVuZG9yX2JpdG1hcFtjcHVdLmlzYSwKPiA+ICsg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dF9saXN0LT5iaXRtYXBfc2l6ZSk7 Cj4gCj4gQ291bGQgeW91IGdldCBpbnRvIHRyb3VibGUgaGVyZSBpZiB0aGUgc2V0IG9mIHZlbmRv ciBleHRlbnNpb25zCj4gcmVkdWNlcyB0byB6ZXJvLCBhbmQgdGhlbiBiZWNvbWVzIG5vbi16ZXJv PyBUbyBpbGx1c3RyYXRlLCBjb25zaWRlcgo+IHRoZXNlIG1hc2tzOgo+IGNwdSAwOiAweDAwMDBD MDAwCj4gY3B1IDE6IDB4MDAwMDAwMDMgPDw8IHZlbmRvcl9iaXRtYXAgQU5EcyBvdXQgdG8gMAo+ IGNwdSAyOiAweDAwMDAwMDEwIDw8PCBvb3BzLCB3ZSBlbmQgdXAgY29weWluZyB0aGlzIGludG8g dmVuZG9yX2JpdG1hcAo+IAo+ID4gKyAgICAgICAgICAgICAgIGVsc2UKPiA+ICsgICAgICAgICAg ICAgICAgICAgICAgIGJpdG1hcF9hbmQoZXh0X2xpc3QtPnZlbmRvcl9iaXRtYXAsIGV4dF9saXN0 LT52ZW5kb3JfYml0bWFwLAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBl eHRfbGlzdC0+cGVyX2hhcnRfdmVuZG9yX2JpdG1hcFtjcHVdLmlzYSwKPiA+ICsgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgZXh0X2xpc3QtPmJpdG1hcF9zaXplKTsKPiA+ICsgICAg ICAgfQo+ID4gK30KPiA+ICsKPiA+ICBzdGF0aWMgaW50IF9faW5pdCByaXNjdl9maWxsX2h3Y2Fw X2Zyb21fZXh0X2xpc3QodW5zaWduZWQgbG9uZyAqaXNhMmh3Y2FwKQo+ID4gIHsKPiA+ICAgICAg ICAgdW5zaWduZWQgaW50IGNwdTsKPiA+IEBAIC02MTUsNiArNjQ4LDggQEAgc3RhdGljIGludCBf X2luaXQgcmlzY3ZfZmlsbF9od2NhcF9mcm9tX2V4dF9saXN0KHVuc2lnbmVkIGxvbmcgKmlzYTJo d2NhcCkKPiA+ICAgICAgICAgICAgICAgICAgICAgICAgIH0KPiA+ICAgICAgICAgICAgICAgICB9 Cj4gPgo+ID4gKyAgICAgICAgICAgICAgIHJpc2N2X2ZpbGxfY3B1X3ZlbmRvcl9leHQoY3B1X25v ZGUsIGNwdSk7Cj4gPiArCj4gPiAgICAgICAgICAgICAgICAgb2Zfbm9kZV9wdXQoY3B1X25vZGUp Owo+ID4KPiA+ICAgICAgICAgICAgICAgICAvKgo+ID4gQEAgLTYzMCw2ICs2NjUsOCBAQCBzdGF0 aWMgaW50IF9faW5pdCByaXNjdl9maWxsX2h3Y2FwX2Zyb21fZXh0X2xpc3QodW5zaWduZWQgbG9u ZyAqaXNhMmh3Y2FwKQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgYml0bWFwX2NvcHkocmlz Y3ZfaXNhLCBpc2FpbmZvLT5pc2EsIFJJU0NWX0lTQV9FWFRfTUFYKTsKPiA+ICAgICAgICAgICAg ICAgICBlbHNlCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICBiaXRtYXBfYW5kKHJpc2N2X2lz YSwgcmlzY3ZfaXNhLCBpc2FpbmZvLT5pc2EsIFJJU0NWX0lTQV9FWFRfTUFYKTsKPiA+ICsKPiA+ ICsgICAgICAgICAgICAgICByaXNjdl9maWxsX3ZlbmRvcl9leHRfbGlzdChjcHUpOwo+ID4gICAg ICAgICB9Cj4gPgo+ID4gICAgICAgICBpZiAoYml0bWFwX2VtcHR5KHJpc2N2X2lzYSwgUklTQ1Zf SVNBX0VYVF9NQVgpKQo+ID4gZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3Yva2VybmVsL3ZlbmRvcl9l eHRlbnNpb25zLmMgYi9hcmNoL3Jpc2N2L2tlcm5lbC92ZW5kb3JfZXh0ZW5zaW9ucy5jCj4gPiBu ZXcgZmlsZSBtb2RlIDEwMDY0NAo+ID4gaW5kZXggMDAwMDAwMDAwMDAwLi5mNzZjYjMwMTNjMmQK PiA+IC0tLSAvZGV2L251bGwKPiA+ICsrKyBiL2FyY2gvcmlzY3Yva2VybmVsL3ZlbmRvcl9leHRl bnNpb25zLmMKPiA+IEBAIC0wLDAgKzEsMTggQEAKPiA+ICsvLyBTUERYLUxpY2Vuc2UtSWRlbnRp ZmllcjogR1BMLTIuMC1vbmx5Cj4gPiArLyoKPiA+ICsgKiBDb3B5cmlnaHQgMjAyNCBSaXZvcywg SW5jCj4gPiArICovCj4gPiArCj4gPiArI2luY2x1ZGUgPGFzbS92ZW5kb3JfZXh0ZW5zaW9ucy5o Pgo+ID4gKyNpbmNsdWRlIDxhc20vdmVuZG9yX2V4dGVuc2lvbnMvdGhlYWQuaD4KPiA+ICsKPiA+ ICsjaW5jbHVkZSA8bGludXgvYXJyYXlfc2l6ZS5oPgo+ID4gKyNpbmNsdWRlIDxsaW51eC90eXBl cy5oPgo+ID4gKwo+ID4gK2NvbnN0IHN0cnVjdCByaXNjdl9pc2FfdmVuZG9yX2V4dF9kYXRhX2xp c3QgKnJpc2N2X2lzYV92ZW5kb3JfZXh0X2xpc3RbXSA9IHsKPiA+ICsjaWZkZWYgQ09ORklHX1JJ U0NWX0lTQV9WRU5ET1JfRVhUX1RIRUFECj4gPiArICAgICAgICZyaXNjdl9pc2FfdmVuZG9yX2V4 dF9saXN0X3RoZWFkLAo+ID4gKyNlbmRpZgo+ID4gK307Cj4gPiArCj4gPiArY29uc3Qgc2l6ZV90 IHJpc2N2X2lzYV92ZW5kb3JfZXh0X2xpc3Rfc2l6ZSA9IEFSUkFZX1NJWkUocmlzY3ZfaXNhX3Zl bmRvcl9leHRfbGlzdCk7Cj4gPiBkaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9rZXJuZWwvdmVuZG9y X2V4dGVuc2lvbnMvTWFrZWZpbGUgYi9hcmNoL3Jpc2N2L2tlcm5lbC92ZW5kb3JfZXh0ZW5zaW9u cy9NYWtlZmlsZQo+ID4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPiA+IGluZGV4IDAwMDAwMDAwMDAw MC4uMzM4MzA2NmJhYWFiCj4gPiAtLS0gL2Rldi9udWxsCj4gPiArKysgYi9hcmNoL3Jpc2N2L2tl cm5lbC92ZW5kb3JfZXh0ZW5zaW9ucy9NYWtlZmlsZQo+ID4gQEAgLTAsMCArMSwzIEBACj4gPiAr IyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5Cj4gPiArCj4gPiArb2JqLSQo Q09ORklHX1JJU0NWX0lTQV9WRU5ET1JfRVhUX1RIRUFEKSAgICAgICArPSB0aGVhZC5vCj4gPiBk aWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9rZXJuZWwvdmVuZG9yX2V4dGVuc2lvbnMvdGhlYWQuYyBi L2FyY2gvcmlzY3Yva2VybmVsL3ZlbmRvcl9leHRlbnNpb25zL3RoZWFkLmMKPiA+IG5ldyBmaWxl IG1vZGUgMTAwNjQ0Cj4gPiBpbmRleCAwMDAwMDAwMDAwMDAuLmVkYjIwYjkyOGMwYwo+ID4gLS0t IC9kZXYvbnVsbAo+ID4gKysrIGIvYXJjaC9yaXNjdi9rZXJuZWwvdmVuZG9yX2V4dGVuc2lvbnMv dGhlYWQuYwo+ID4gQEAgLTAsMCArMSwzNiBAQAo+ID4gKy8vIFNQRFgtTGljZW5zZS1JZGVudGlm aWVyOiBHUEwtMi4wLW9ubHkKPiA+ICsKPiA+ICsjaW5jbHVkZSA8YXNtL2NwdWZlYXR1cmUuaD4K PiA+ICsjaW5jbHVkZSA8YXNtL3ZlbmRvcl9leHRlbnNpb25zLmg+Cj4gPiArI2luY2x1ZGUgPGFz bS92ZW5kb3JfZXh0ZW5zaW9ucy90aGVhZC5oPgo+ID4gKwo+ID4gKyNpbmNsdWRlIDxsaW51eC9h cnJheV9zaXplLmg+Cj4gPiArI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Cj4gPiArCj4gPiArLyog QWxsIFQtSGVhZCB2ZW5kb3IgZXh0ZW5zaW9ucyBzdXBwb3J0ZWQgaW4gTGludXggKi8KPiA+ICtj b25zdCBzdHJ1Y3QgcmlzY3ZfaXNhX2V4dF9kYXRhIHJpc2N2X2lzYV92ZW5kb3JfZXh0X3RoZWFk W10gPSB7Cj4gPiArICAgICAgIF9fUklTQ1ZfSVNBX0VYVF9EQVRBKHh0aGVhZHZlY3RvciwgUklT Q1ZfSVNBX1ZFTkRPUl9FWFRfWFRIRUFEVkVDVE9SKSwKPiA+ICt9Owo+ID4gKwo+ID4gKy8qCj4g PiArICogVGhlIGZpcnN0IG1lbWJlciBvZiB0aGlzIHN0cnVjdCBtdXN0IGJlIGEgYml0bWFwIG5h bWVkIGlzYSBzbyBpdCBjYW4gYmUKPiA+ICsgKiBjb21wYXRpYmxlIHdpdGggcmlzY3ZfaXNhaW5m byBldmVuIHRob3VnaCB0aGUgc2l6ZXMgb2YgdGhlIGJpdG1hcHMgbWF5IGJlCj4gPiArICogZGlm ZmVyZW50Lgo+IFRoaXMgaXMga2luZGEgeXVja3ksIGFzIHlvdSdyZSBjYXN0aW5nIGEgYml0bWFw IG9mIGEgZGlmZmVyZW50IHNpemUKPiBpbnRvIGEgc3RydWN0IHJpc2N2X2lzYWluZm8gKiwgd2hp Y2ggaGFzIGEga25vd24gc2l6ZS4gSSBkb24ndAo+IG5lY2Vzc2FyaWx5IGhhdmUgYSBmYWJ1bG91 cyBzdWdnZXN0aW9uIHRvIGZpeCB0aG91Z2guIFRoZSBiZXN0IEkgY2FuCj4gY29tZSB1cCB3aXRo IGlzIHJlZmFjdG9yIHN0cnVjdCByaXNjdl9pc2FpbmZvIHRvIGJlOgo+IHN0cnVjdCByaXNjdl9p c2FpbmZvIHsKPiAgICAgaW50IGNvdW50Owo+ICAgICB1bnNpZ25lZCBsb25nIGlzYVswXTsKPiB9 Owo+IAo+IHRoZW4gZGVjbGFyZSBhIHN0YW5kYXJkIG9uZSAoZm9yIGhhcnRfaXNhLCB3aGljaCBp cyBzdGF0aWNhbGx5IGFsbG9jYXRlZCk6Cj4gc3RydWN0IHJpc2N2X3N0ZF9pc2FpbmZvIHsKPiAg ICAgaW50IGNvdW50Owo+ICAgICBERUNMQVJFX0JJVE1BUChpc2EsIFJJU0NWX0lTQV9FWFRfTUFY KTsKPiB9Cj4gCj4gYW5kIGEgdGhlYWQgb25lCj4gc3RydWN0IHJpc2N2X3RoZWFkX2lzYWluZm8g ewo+ICAgICBpbnQgY291bnQ7Cj4gICAgIERFQ0xBUkVfQklUTUFQKGlzYSwgUklTQ1ZfSVNBX1ZF TkRPUl9FWFRfTUFYX1RIRUFEKTsKPiB9Cj4gCj4gQnV0IHRoZXJlJ3Mgc3RpbGwgYSBjYXN0IGlu IHRoZXJlLCBhcyB5b3UnZCBjYXN0IHRoZSBzcGVjaWFsaXplZAo+IHN0cnVjdHMgdG8gc3RydWN0 IHJpc2N2X2lzYWluZm8gKi4gQnV0IGF0IGxlYXN0IHRoZSBzaXplIGlzIGluIHRoZXJlCj4gdG8g YmUgZW5mb3JjZWQgYXQgcnVudGltZSwgcmF0aGVyIHRoYW4gYSBjb21waWxlLXRpbWUgY2hlY2sg dGhhdCdzCj4gd3JvbmcuICBTbyBJJ2xsIGp1c3QgbGVhdmUgdGhpcyBoYWxmIGJha2VkIHRob3Vn aHQgaGVyZSwgYW5kIG1heWJlIHlvdQo+IGNhbiB0aGluayBvZiBhIGNsZWFuZXIgd2F5LCBvciBp Z25vcmUgaXQgOikuCj4gCgpBZnRlciBsb29raW5nIGludG8gdGhpcyBhIGJpdCBtb3JlLCBJIGFt IG5vdCBzdXJlIHRoZXJlIGlzIGEgImNsZWFuIiB3YXkKb2YgZG9pbmcgdGhpcy4gS2VlcyB3cm90 ZSBhbiBpbnRlcmVzdGluZyBhcnRpY2xlIGFib3V0IGFuIGFkamFjZW50CnByb2JsZW0gWzFdLCBh bmQgbXkgdGFrZWF3YXkgd2FzIHRoYXQgdGhlcmUgYXJlIHNvbWUgcGVvcGxlIHdvcmtpbmcgdG8K aW1wcm92ZSBzaXR1YXRpb25zIGxpa2UgdGhpcy4gVGhpcyBwYXR0ZXJuIGlzIHZlcnkgY2xvc2Ug dG8gdGhlIHN0YW5kYXJkCnN0cnVjdCB3aXRoIHRoZSBsZW5ndGggb2YgdGhlIGFycmF5IGFzIG9u ZSBlbGVtZW50IGFuZCB0aGUgYXJyYXkgaXRzZWxmCmFzIGFub3RoZXIgZWxlbWVudC4gVGhlcmUg YXJlIHR3byBtYWpvciBkaWZmZXJlbmNlcyB0aG91Z2gsIG9uZSBiZWluZwp0aGF0IHRoZSBjb3Vu dCBpcyBwdXQgdGhyb3VnaCBhIHNpbXBsZSBtYWNybyBCSVRTX1RPX0xPTkdTIHRvIGNhbGN1bGF0 ZQp0aGUgc2l6ZSBvZiB0aGUgYXJyYXkuIFRoZSBvdGhlciBpcyB0aGF0IGNvdW50IGlzIGEgY29t cGlsZSB0aW1lCmNvbnN0YW50IHRoYXQgc2hvdWxkIGJlIHBvcHVsYXRlZCBpbnRvIGFsbCBzdHJ1 Y3RzIG9mIHRoZSB0eXBlLCBzaW5jZSB3ZQpoYXZlIGFycmF5cyBvZiByaXNjdl9pc2FpbmZvIHRo YXQgc2hvdWxkIGJlIGFsbG9jYXRlZCBhdCBjb21waWxlIHRpbWUgdG8KYWxsIGhhdmUgdGhlIHNh bWUgY291bnQuIElkZWFsbHkgd2hhdCBJIHdvdWxkIHdhbnQgaXMgc29tZXRoaW5nIGxpa2U6Cgpz dHJ1Y3QgcmlzY3ZfdGhlYWRfaXNhaW5mbyB7CiAgICAgaW50IGNvdW50ID0gUklTQ1ZfSVNBX1ZF TkRPUl9FWFRfTUFYX1RIRUFEOwogICAgIERFQ0xBUkVfQklUTUFQKGlzYSwgUklTQ1ZfSVNBX1ZF TkRPUl9FWFRfTUFYX1RIRUFEKTsKfQoKT3RoZXJ3aXNlIHdlIG5lZWQgdG8gcG9wdWxhdGUgY291 bnQgYXQgcnVudGltZSBhbmQgdGhhdCBkZWZlYXRzIHRoZQpwb2ludCBpbiBteSBvcGluaW9uIHNp bmNlIHRoaXMgaXMgY3VycmVudGx5IGtub3duIGJ5IGFjY2Vzc2luZwp0aGUgImJpdG1hcF9zaXpl IiBvZiB0aGUgc3RhdGljYWxseSBhbGxvY2F0ZWQgc3RydWN0OgoKY29uc3Qgc3RydWN0IHJpc2N2 X2lzYV92ZW5kb3JfZXh0X2RhdGFfbGlzdCByaXNjdl9pc2FfdmVuZG9yX2V4dF9saXN0X3RoZWFk CgpUaGlzIGFsc28gaGFzIHRoZSBkb3duc2lkZSBvZiBoYXZpbmcgdGhlIHNhbWUgImNvdW50IiBy ZXBlYXRlZCBhY3Jvc3MKYWxsIG9mIHRoZSBpbnN0YW5jZXMgb2YgcmlzY3ZfdGhlYWRfaXNhaW5m byBvZiB3aGljaCB0aGVyZSBhcmUgYnkKZGVmYXVsdCA2NSAob25lIGZvciBlYWNoIG9mIHRoZSBD UFVzIGNvbmZpZ3VyZWQgd2l0aCBOUl9DUFVTIHdoaWNoCmRlZmF1bHRzIHRvIDY0IHBsdXMgYW4g YWRkaXRpb25hbCBmb3IgdGhlIGxlYXN0LWNvbW1vbi1kZW5vbWluYXRvcgphY3Jvc3MgYWxsIENQ VXMpLiBJdCdzIGEgcmVsYXRpdmVseSBsYXJnZSBhbW91bnQgb2YgYml0cyB0aGF0IGdldHMKIndh c3RlZCIuCgpKdXN0IGZvciBzb21lIGJhY2tncm91bmQgaGVyZSwgdGhlIHB1cnBvc2UgaGVyZSBp cyB0byBiZSBhYmxlIHRvIGhhdmUgYQpzdGFuZGFyZGl6ZWQgInN0cnVjdCByaXNjdl9pc2FfdmVu ZG9yX2V4dF9kYXRhX2xpc3QiIHRoYXQgZWFjaCB2ZW5kb3IKd2lsbCBiZSBhYmxlIHRvIHBvcHVs YXRlIHdpdGggdGhlaXIgdmVuZG9yIGV4dGVuc2lvbnMuIFRoZSB0aG91Z2h0IHdhcwp0aGF0IGVh Y2ggdmVuZG9yIHdpbGwgaGF2ZSBhIGRpZmZlcmVudCBudW1iZXIgb2YgZXh0ZW5zaW9ucyBzbyBl YWNoCnZlbmRvciBkb2Vzbid0IG5lZWQgdG8gcmVzZXJ2ZSB0aGUgc2FtZSBhbW91bnQgb2Ygc3Bh Y2UgaW4gdGhlaXIKc3RhdGljYWxseSBhbGxvY2F0ZWQgYml0bWFwLiB2ZW5kb3JBIG1heSBiZSBh YmxlIHRvIGZpdCB0aGVpciBleHRlbnNpb25zCmluIDY0IGJpdHMgYnV0IHZlbmRvckIgbWF5IG5l ZWQgMTI4LiBXZSdyZSB0YWxraW5nIGFib3V0IGEgc21hbGwgYW1vdW50Cm9mIHNwYWNlIHNhdmlu Z3MgaGVyZS4gV2UgY291bGQgZm9yZWdvIHRoaXMgY2FzdGluZyBlbnRpcmVseSBhbmQgc2F5CmVh Y2ggdmVuZG9yIHdpbGwgbmVlZCBhIG1heGltdW0gb2YgWCBiaXRzLiBJdCBtYXkgYmUgdW5saWtl bHkgZm9yIGFueQp2ZW5kb3IgdG8gZXZlciBlbmQgdXAgd2l0aCBtb3JlIHRoYW4gNjQgdmVuZG9y IGV4dGVuc2lvbnMgdGhhdCB0aGV5IHdhbnQKZXhwb3NlZCB0byB0aGUga2VybmVsLiBCdXQgaWYg YW55IHZlbmRvciBldmVyIGRvZXMgZW5kIHVwIHdpdGggbW9yZSB0aGFuCjY0LCBhbGwgb2YgdGhl IHZlbmRvcnMgZW5kIHVwIG5lZWRpbmcgdG8gaGF2ZSB0byBhbGxvY2F0ZSAxMjggYml0cyBpbgp0 aGVpciBiaXRtYXNrIHRoYXQgaXMgYWxsb2NhdGVkIGZvciBlYWNoIHBvc3NpYmxlIENQVS4KClsx XSBodHRwczovL3Blb3BsZS5rZXJuZWwub3JnL2tlZXMvYm91bmRlZC1mbGV4aWJsZS1hcnJheXMt aW4tYwoKLSBDaGFybGllCgo+IAo+ID4gKyAqLwo+ID4gK3N0cnVjdCByaXNjdl9pc2F2ZW5kb3Jp bmZvX3RoZWFkIHsKPiA+ICsgICAgICAgREVDTEFSRV9CSVRNQVAoaXNhLCBSSVNDVl9JU0FfVkVO RE9SX0VYVF9NQVhfVEhFQUQpOwo+ID4gK307Cj4gPiArCj4gPiArLyogSGFydCBzcGVjaWZpYyBU LUhlYWQgdmVuZG9yIGV4dGVuc2lvbiBzdXBwb3J0ICovCj4gPiArc3RhdGljIHN0cnVjdCByaXNj dl9pc2F2ZW5kb3JpbmZvX3RoZWFkIGhhcnRfdmVuZG9yaW5mb190aGVhZFtOUl9DUFVTXTsKPiA+ ICsKPiA+ICsvKiBTZXQgb2YgVC1IZWFkIHZlbmRvciBleHRlbnNpb25zIHN1cHBvcnRlZCBvbiBh bGwgaGFydHMgKi8KPiA+ICtERUNMQVJFX0JJVE1BUCh2ZW5kb3JpbmZvX3RoZWFkLCBSSVNDVl9J U0FfVkVORE9SX0VYVF9NQVhfVEhFQUQpOwo+ID4gKwo+ID4gK2NvbnN0IHN0cnVjdCByaXNjdl9p c2FfdmVuZG9yX2V4dF9kYXRhX2xpc3QgcmlzY3ZfaXNhX3ZlbmRvcl9leHRfbGlzdF90aGVhZCA9 IHsKPiA+ICsgICAgICAgLmV4dF9kYXRhID0gcmlzY3ZfaXNhX3ZlbmRvcl9leHRfdGhlYWQsCj4g PiArICAgICAgIC5wZXJfaGFydF92ZW5kb3JfYml0bWFwID0gKHN0cnVjdCByaXNjdl9pc2FpbmZv ICopaGFydF92ZW5kb3JpbmZvX3RoZWFkLAo+ID4gKyAgICAgICAudmVuZG9yX2JpdG1hcCA9IHZl bmRvcmluZm9fdGhlYWQsCj4gPiArICAgICAgIC5leHRfZGF0YV9jb3VudCA9IEFSUkFZX1NJWkUo cmlzY3ZfaXNhX3ZlbmRvcl9leHRfdGhlYWQpLAo+ID4gKyAgICAgICAuYml0bWFwX3NpemUgPSBS SVNDVl9JU0FfVkVORE9SX0VYVF9NQVhfVEhFQUQKPiA+ICt9Owo+ID4KPiA+IC0tCj4gPiAyLjQ0 LjAKPiA+CgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwps aW51eC1hcm0ta2VybmVsIG1haWxpbmcgbGlzdApsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJh ZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51 eC1hcm0ta2VybmVsCg==