From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pl1-f179.google.com (mail-pl1-f179.google.com [209.85.214.179]) (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 5FF2F152195 for ; Fri, 12 Apr 2024 22:21:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.179 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712960468; cv=none; b=KR/V32aDbihNhGYTVXsjQb0Qg1ZjLa/Aip4hQBPG6cPdrvQQ+X8lWgydGWmRZ0buAdQqKRBNMHzSq8weAzjCtc0JaCVVfUWZIeR6IuNLsbWdn3kmjoJ8PXmCJvdltucvUeldHwHySmYCu7RBJam4OB7V7lroUVKoSHyfZcoegng= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712960468; c=relaxed/simple; bh=jxUqPVI7QMdYiKJZ44makQXptF3fBvNQiGIoT8TIpWE=; h=Date:From:To:Cc:Subject:Message-ID:References:MIME-Version: Content-Type:Content-Disposition:In-Reply-To; b=NhGUQO+Rqcrlv/rWgAjFrcx7yKxsPFWNVfRA4ttHPyFjP4DC+PvDL/RYPAUqLvMvH+BdK1x7Big4k0zL0zfiNjQ5fx1ZrpSv/P/kbtZLUTvij5e2/va05eYqOvd1thL9fbEsvrO3a0NDeBj1niIE8bU9Wyk3VHkyAstgRgsBaQY= 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=S94Ro6Zh; arc=none smtp.client-ip=209.85.214.179 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="S94Ro6Zh" Received: by mail-pl1-f179.google.com with SMTP id d9443c01a7336-1e5c11076b9so6622225ad.3 for ; Fri, 12 Apr 2024 15:21:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rivosinc-com.20230601.gappssmtp.com; s=20230601; t=1712960466; x=1713565266; 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=Qw7f13VaApE9P7VRpDrEHdpAzJF1wdaPoxbwIFLmIG4=; b=S94Ro6ZhN7ITDylPwfn0rMRGoJN/Phk0BXblZhqkza5fOV5xlstpCdrlHQoBGIhRif /5fGqRmL986v/v+nVNKCDYgxV/tonrBwJF7PV0KXEskS3yIa+UHvQcoFR1d4yu7yomQp 6Pq3dfTWgQYfTBrRWekPt82sc/ktVTa1O95XznZFUqkspSnvzRh5y0GtHdl6fc7I1sCO NRRcSvF5oPkQs76R+JR2XF74Y61Y9dXdjR3RnS5cNZPMJw92sVdy/begk7w/dzULgtxm 8A2hrtNupxVoMNwCLm67fSraIgkvIbWSttKntWo4FP2ih2F9ice6h+1pMTO7IEkMN5lg 9eNQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1712960466; x=1713565266; 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=Qw7f13VaApE9P7VRpDrEHdpAzJF1wdaPoxbwIFLmIG4=; b=tdZF9W8lJtM5LwXYzh+aFL33dkrzpSmaGpW5Ae+mSMZswqds+jrgwZj69qfJIBojdo huBaK2Fj40UaSPzYhZhLNbauDYxLIag2iWPrT95J238l3P3/lNQxJu9rU/u9nWXvZ/we EtqFddxjrAgqwRLi2wXLvxreMev5LVMhll6rge74w/o+nUgcZQdaz+kb1f2wJX7Jktbj /zvwew1VOUReirljgWmHvlozRejYpJtO3ryWtTOjoBukHBBz0u/oPsJtrjm6heA5P803 2778U2eYFlM0we6K4VNXBJAR3GUX3Oa3zUajp9MqT20xIRymKaSxrzrirrB/M7uYY2bE IlsA== X-Forwarded-Encrypted: i=1; AJvYcCWAgfF6t8BRxsgOhmiFKfpGq7j6UsEn6anmeASd2yc13jowT7fEa96XjFjBXufa5+fSNjH6UVSB3fBC31Ni245bt6fV3PdO05FV X-Gm-Message-State: AOJu0Yy3HqXvxgDCIdwbmvkJOPPHYhgcxU+Gvay9yLkX2AMSOsgKDwyo a2Dj4KJZmScA8yU2Tw2C+fbnph1P8OfqQo/hEI0e/hSuFr5ncupSjNOv0xw/qKY= X-Google-Smtp-Source: AGHT+IHUI2RaMq8jaayA5FcthPXUJDbqZ0+AxzpHu6ba0uA91gdIC4L0mbVqNIRm0limEGVhmp0sjg== X-Received: by 2002:a17:903:2609:b0:1e2:ca65:68c2 with SMTP id jd9-20020a170903260900b001e2ca6568c2mr3674124plb.51.1712960465476; Fri, 12 Apr 2024 15:21:05 -0700 (PDT) Received: from ghost ([50.145.13.30]) by smtp.gmail.com with ESMTPSA id b7-20020a170902650700b001e245c5afbfsm3554986plk.155.2024.04.12.15.21.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 12 Apr 2024 15:21:05 -0700 (PDT) Date: Fri, 12 Apr 2024 15:21:02 -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 16/19] riscv: hwprobe: Add vendor extension probing Message-ID: References: <20240411-dev-charlie-support_thead_vector_6_9-v1-0-4af9815ec746@rivosinc.com> <20240411-dev-charlie-support_thead_vector_6_9-v1-16-4af9815ec746@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 Fri, Apr 12, 2024 at 02:43:01PM -0700, Evan Green wrote: > On Fri, Apr 12, 2024 at 1:20 PM Charlie Jenkins wrote: > > > > On Fri, Apr 12, 2024 at 12:07:46PM -0700, Evan Green wrote: > > > On Fri, Apr 12, 2024 at 11:17 AM Charlie Jenkins wrote: > > > > > > > > On Fri, Apr 12, 2024 at 10:05:21AM -0700, Evan Green wrote: > > > > > On Thu, Apr 11, 2024 at 9:12 PM Charlie Jenkins wrote: > > > > > > > > > > > > Add a new hwprobe key "RISCV_HWPROBE_KEY_VENDOR_EXT_0" which allows > > > > > > userspace to probe for the new RISCV_ISA_VENDOR_EXT_XTHEADVECTOR vendor > > > > > > extension. > > > > > > > > > > > > Signed-off-by: Charlie Jenkins > > > > > > --- > > > > > > arch/riscv/include/asm/hwprobe.h | 4 +-- > > > > > > arch/riscv/include/uapi/asm/hwprobe.h | 10 +++++- > > > > > > arch/riscv/kernel/sys_hwprobe.c | 59 +++++++++++++++++++++++++++++++++-- > > > > > > 3 files changed, 68 insertions(+), 5 deletions(-) > > > > > > > > > > > > diff --git a/arch/riscv/include/asm/hwprobe.h b/arch/riscv/include/asm/hwprobe.h > > > > > > index 630507dff5ea..e68496b4f8de 100644 > > > > > > --- a/arch/riscv/include/asm/hwprobe.h > > > > > > +++ b/arch/riscv/include/asm/hwprobe.h > > > > > > @@ -1,6 +1,6 @@ > > > > > > /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ > > > > > > /* > > > > > > - * Copyright 2023 Rivos, Inc > > > > > > + * Copyright 2023-2024 Rivos, Inc > > > > > > */ > > > > > > > > > > > > #ifndef _ASM_HWPROBE_H > > > > > > @@ -8,7 +8,7 @@ > > > > > > > > > > > > #include > > > > > > > > > > > > -#define RISCV_HWPROBE_MAX_KEY 6 > > > > > > +#define RISCV_HWPROBE_MAX_KEY 7 > > > > > > > > > > > > static inline bool riscv_hwprobe_key_is_valid(__s64 key) > > > > > > { > > > > > > diff --git a/arch/riscv/include/uapi/asm/hwprobe.h b/arch/riscv/include/uapi/asm/hwprobe.h > > > > > > index 9f2a8e3ff204..6614d3adfc75 100644 > > > > > > --- a/arch/riscv/include/uapi/asm/hwprobe.h > > > > > > +++ b/arch/riscv/include/uapi/asm/hwprobe.h > > > > > > @@ -1,6 +1,6 @@ > > > > > > /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ > > > > > > /* > > > > > > - * Copyright 2023 Rivos, Inc > > > > > > + * Copyright 2023-2024 Rivos, Inc > > > > > > */ > > > > > > > > > > > > #ifndef _UAPI_ASM_HWPROBE_H > > > > > > @@ -67,6 +67,14 @@ struct riscv_hwprobe { > > > > > > #define RISCV_HWPROBE_MISALIGNED_UNSUPPORTED (4 << 0) > > > > > > #define RISCV_HWPROBE_MISALIGNED_MASK (7 << 0) > > > > > > #define RISCV_HWPROBE_KEY_ZICBOZ_BLOCK_SIZE 6 > > > > > > +/* > > > > > > + * It is not possible for one CPU to have multiple vendor ids, so each vendor > > > > > > + * has its own vendor extension "namespace". The keys for each vendor starts > > > > > > + * at zero. > > > > > > + */ > > > > > > +#define RISCV_HWPROBE_KEY_VENDOR_EXT_0 7 > > > > > > + /* T-Head */ > > > > > > +#define RISCV_HWPROBE_VENDOR_EXT_XTHEADVECTOR (1 << 0) > > > > > > /* Increase RISCV_HWPROBE_MAX_KEY when adding items. */ > > > > > > > > > > > > /* Flags */ > > > > > > diff --git a/arch/riscv/kernel/sys_hwprobe.c b/arch/riscv/kernel/sys_hwprobe.c > > > > > > index e0a42c851511..365ce7380443 100644 > > > > > > --- a/arch/riscv/kernel/sys_hwprobe.c > > > > > > +++ b/arch/riscv/kernel/sys_hwprobe.c > > > > > > @@ -69,7 +69,8 @@ static void hwprobe_isa_ext0(struct riscv_hwprobe *pair, > > > > > > if (riscv_isa_extension_available(NULL, c)) > > > > > > pair->value |= RISCV_HWPROBE_IMA_C; > > > > > > > > > > > > - if (has_vector() && !riscv_has_vendor_extension_unlikely(RISCV_ISA_VENDOR_EXT_XTHEADVECTOR)) > > > > > > + if (has_vector() && > > > > > > + !__riscv_isa_vendor_extension_available(NULL, RISCV_ISA_VENDOR_EXT_XTHEADVECTOR)) > > > > > > pair->value |= RISCV_HWPROBE_IMA_V; > > > > > > > > > > > > /* > > > > > > @@ -112,7 +113,8 @@ static void hwprobe_isa_ext0(struct riscv_hwprobe *pair, > > > > > > EXT_KEY(ZACAS); > > > > > > EXT_KEY(ZICOND); > > > > > > > > > > > > - if (has_vector() && !riscv_has_vendor_extension_unlikely(RISCV_ISA_VENDOR_EXT_XTHEADVECTOR)) { > > > > > > + if (has_vector() && > > > > > > + !riscv_has_vendor_extension_unlikely(RISCV_ISA_VENDOR_EXT_XTHEADVECTOR)) { > > > > > > EXT_KEY(ZVBB); > > > > > > EXT_KEY(ZVBC); > > > > > > EXT_KEY(ZVKB); > > > > > > @@ -139,6 +141,55 @@ static void hwprobe_isa_ext0(struct riscv_hwprobe *pair, > > > > > > pair->value &= ~missing; > > > > > > } > > > > > > > > > > > > +static void hwprobe_isa_vendor_ext0(struct riscv_hwprobe *pair, > > > > > > + const struct cpumask *cpus) > > > > > > +{ > > > > > > + int cpu; > > > > > > + u64 missing = 0; > > > > > > + > > > > > > + pair->value = 0; > > > > > > + > > > > > > + struct riscv_hwprobe mvendorid = { > > > > > > + .key = RISCV_HWPROBE_KEY_MVENDORID, > > > > > > + .value = 0 > > > > > > + }; > > > > > > + > > > > > > + hwprobe_arch_id(&mvendorid, cpus); > > > > > > + > > > > > > + /* Set value to zero if CPUs in the set do not have the same vendor. */ > > > > > > + if (mvendorid.value == -1ULL) > > > > > > + return; > > > > > > + > > > > > > + /* > > > > > > + * Loop through and record vendor extensions that 1) anyone has, and > > > > > > + * 2) anyone doesn't have. > > > > > > + */ > > > > > > + for_each_cpu(cpu, cpus) { > > > > > > + struct riscv_isainfo *isavendorinfo = &hart_isa_vendor[cpu]; > > > > > > + > > > > > > +#define VENDOR_EXT_KEY(ext) \ > > > > > > + do { \ > > > > > > + if (__riscv_isa_vendor_extension_available(isavendorinfo->isa, \ > > > > > > + RISCV_ISA_VENDOR_EXT_##ext)) \ > > > > > > + pair->value |= RISCV_HWPROBE_VENDOR_EXT_##ext; \ > > > > > > + else \ > > > > > > + missing |= RISCV_HWPROBE_VENDOR_EXT_##ext; \ > > > > > > + } while (false) > > > > > > + > > > > > > + /* > > > > > > + * Only use VENDOR_EXT_KEY() for extensions which can be exposed to userspace, > > > > > > + * regardless of the kernel's configuration, as no other checks, besides > > > > > > + * presence in the hart_vendor_isa bitmap, are made. > > > > > > + */ > > > > > > + VENDOR_EXT_KEY(XTHEADVECTOR); > > > > > > + > > > > > > +#undef VENDOR_EXT_KEY > > > > > > > > > > Hey Charlie, > > > > > Thanks for writing this up! At the very least I think the > > > > > THEAD-specific stuff should probably end up in its own file, otherwise > > > > > it'll get chaotic with vendors clamoring to add stuff right here. > > > > > > > > Great idea! > > > > > > > > > What do you think about this approach: > > > > > * We leave RISCV_HWPROBE_MAX_KEY as the max key for the "generic > > > > > world", eg 6-ish > > > > > * We define that any key above 0x8000000000000000 is in the vendor > > > > > space, so the meaning of the keys depends first on the mvendorid > > > > > value. > > > > > * In the kernel code, each new vendor adds on to a global struct, > > > > > which might look something like: > > > > > struct hwprobe_vendor_space vendor_space[] = { > > > > > { > > > > > .mvendorid = VENDOR_THEAD, > > > > > .max_hwprobe_key = THEAD_MAX_HWPROBE_KEY, // currently > > > > > 1 or 0x8000000000000001 with what you've got. > > > > > .hwprobe_fn = thead_hwprobe > > > > > }, > > > > > ... > > > > > }; > > > > > > > > > > * A hwprobe_thead.c implements thead_hwprobe(), and is called > > > > > whenever the generic hwprobe encounters a key >=0x8000000000000000. > > > > > * Generic code for setting up the VDSO can then still call the > > > > > vendor-specific hwprobe_fn() repeatedly with an "all CPUs" mask from > > > > > the base to max_hwprobe_key and set up the cached tables in userspace. > > > > > * Since the VDSO data has limited space we may have to cap the number > > > > > of vendor keys we cache to be lower than max_hwprobe_key. Since the > > > > > data itself is not exposed to usermode we can raise this cap later if > > > > > needed. > > > > > > > > I know vendor extensions are kind of the "wild west" of riscv, but in > > > > spite of that I want to design a consistent API. The issue I had with > > > > having this "vendor space" for exposing vendor extensions was that this > > > > is something that is inherently the same for all vendors. I see a vendor > > > > space like this more applicable for something like > > > > "RISCV_HWPROBE_KEY_ZICBOZ_BLOCK_SIZE" where a vendor has a specific > > > > value they would like to expose. I do agree that having a vendor space > > > > is a good design choice, but I am not convinced that vendor extensions > > > > are the proper use-case. > > > > > > > > By having RISCV_HWPROBE_KEY_VENDOR_EXT_0 we can expose the vendor > > > > extensions in the same way that standard extensions are exposed, with a > > > > bitmask representing each extension. If these are instead in the vendor > > > > space, each vendor would probably be inclined to introduce a key like > > > > RISCV_HWPROBE_KEY_THEAD_EXT_0 that returns a bitmask of all of the thead > > > > vendor extensions. This duplicated effort is what I am trying to avoid. > > > > The alternative would be that vendors have a separate key for each > > > > vendor extension they would like to expose, but that is strictly less > > > > efficient than the existing bitmask probing. > > > > > > > > Do you think that having the vendor space is appropriate for vendor > > > > extensions given my concerns? > > > > > > I do see what you're going for. It's tidy for a bitmask to just let > > > anyone allocate the next bit, but leaves you with the same problem > > > when a vendor decides they want to expose an enum, or decides they > > > want to expose a bazillion things. I think a generalized version of > > > > This patch is strictly to expose if a vendor extension is supported, > > how does exposing enums factor in here? > > > > > the approach you've written would be: simply let vendors allocate keys > > > from the same global space we're already using. My worry was that it > > > > I am missing how my proposal suggests allowing vendors to allocate keys > > in a global space. > > > > > would turn into an expansive suburban sprawl of mostly dead bits, or > > > in the case of vendor-specific keys, full of "if (mvendor_id() != > > > MINE) return 0;". My hope with the vendored keyspace is it would keep > > > > An application will always need to check vendorid before calling hwprobe > > with a vendor-specific feature? If that hwprobe support is a key above > > 1<<63, then the application will need to pass that vendor-specific key > > and interpret the vendor-specific value. If that hwprobe support is what > > I have proposed here, then the user calls the standardized vendor > > extension hwprobe endpoint and then needs to interpret the result based > > on the vendor of the cpumask. In both cases they need to check the > > vendorid of the cpumask. In the test case I added I failed to check the > > vendorid but I should have had that. > > > > > the sprawl from polluting the general array of (hopefully valuable) > > > info with stuff that's likely to become less relevant as time passes. > > > It also lowers the bar a bit to make it easier for vendors to expose > > > bits, as they don't consume global space for everyone for all of time, > > > just themselves. > > > > The vendor keys are tied directly to the vendor. So as it grows we would > > have something like: > > > > #define RISCV_HWPROBE_KEY_VENDOR_EXT_0 7 > > /* T-Head */ > > #define RISCV_HWPROBE_VENDOR_EXT_XTHEADVECTOR (1 << 0) > > #define RISCV_HWPROBE_VENDOR_EXT_XTHEAD2 (2 << 0) > > #define RISCV_HWPROBE_VENDOR_EXT_XTHEAD3 (3 << 0) > > /* Vendor 2 */ > > #define RISCV_HWPROBE_VENDOR_EXT_XVENDOR1 (1 << 0) > > #define RISCV_HWPROBE_VENDOR_EXT_XVENDOR2 (2 << 0) > > /* Vendor 3 */ > > ... > > > > The keys overlap between vendors. To determine which extension a vendor > > supports, hwprobe gets data from hart_isa_vendor[cpu]. If the vendor is > > vendor 2, it is not possible for a vendor extension from vendor 3 to end > > up in there. Only the extensions from that vendor can be supported by > > that vendor's hardware. > > Gotcha. You're right I had misinterpreted this, thinking XTHEADVECTOR > was a valid bit regardless of mvendorid, and that other vendors would > have to choose new bits for their features and always return 0 for > XTHEADVECTOR. With your explanation, it seems like you're allocating > keys (in no particular order) whose meaning will change based on > mvendorid. > > I guess I'm still not convinced that saving each vendor from having to > add a VENDOR_EXT key in their keyspace is worth the sacrifice of > spraying the vendor-specific keys across the generic keyspace. Are > there advantages to having a single key whose category is similar but > whose bits are entirely vendor-defined? Maybe if I were userspace and > my feature could be satisfied equivalently by XTHEADVECTOR or > XRIVOSOTHERTHING, then I could do one hwprobe call instead of two? But > I don't think the vendors are going to be consistent enough for that > equivalency to ever prove useful. The advantages in my head of the > separate vendor keyspace are: > * Keeps the kernel code simple: if key >= (1 >> 63) > vendor_config->do_hwprobe(), rather than having all these little calls > in each specific switch case for vendor_config->do_vendor_ext0(), > vendor_config->do_vendor_ext1(), etc. The consistency between vendors is guaranteed in this scheme. They just add the extension to hwprobe_isa_vendor_ext0. The following code is the critical code from the kernel: for_each_cpu(cpu, cpus) { struct riscv_isainfo *isavendorinfo = &hart_isa_vendor[cpu]; #define VENDOR_EXT_KEY(ext) \ do { \ if (__riscv_isa_vendor_extension_available(isavendorinfo->isa, \ RISCV_ISA_VENDOR_EXT_##ext)) \ pair->value |= RISCV_HWPROBE_VENDOR_EXT_##ext; \ else \ missing |= RISCV_HWPROBE_VENDOR_EXT_##ext; \ } while (false) /* * Only use VENDOR_EXT_KEY() for extensions which can be exposed to userspace, * regardless of the kernel's configuration, as no other checks, besides * presence in the hart_vendor_isa bitmap, are made. */ VENDOR_EXT_KEY(XTHEADVECTOR); #undef VENDOR_EXT_KEY } /* Now turn off reporting features if any CPU is missing it. */ pair->value &= ~missing; The only thing a vendor will have to do is add an entry below VENDOR_EXT_KEY(XTHEADVECTOR) with their extension name (of course populating a value for the key as well). This existing code will then check if the extension is compatible with the hardware and appropriate populate the bitmask. All vendors get this functionality for "free" without needing to write the boilerplate code to expose vendor extensions through hwprobe. Now that I write this out I do see that I overlooked that this code needs to check the vendorid to ensure that the given extension is actually associated with the vendorid. This would make this more complicated but still seems like a low barrier to entry for a new vendor, as well as a standard API for getting all vendor extensions that are available on the platform regardless of which platform is being used. > * It extends easily into passing other forms of vendor hwprobe info > later, rather than solving only the case of risc-v extensions now, and > then having to do this all again for each additional category of > vendor data. This is a great point. I do agree that a different solution will be necessary for arbitrary vendor data and I am all for making something future compatible. At the same time I don't want to get trapped into something that is suboptimal for the sake of doing less work later. There is no chance of any compatibility once we leave the realm of riscv extensions, so once a vendor needs something exported I would be happy to write the code to support that. > * Similarly, it discourages future vendors from trying to squint and > find a way to make a vaguely generic sounding category for their own > hwprobe key which will ultimately only ever be filled in by them > anyway. What do you mean by this? There are no "categories" here, the vendor just writes out their extension VENDOR_EXT_KEY(XVENDOREXTENSION) and it gets shuttled to userspace on the hwprobe vendor call. - Charlie > > -Evan 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 A5F7AC4345F for ; Fri, 12 Apr 2024 22:21:15 +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=4GtK+URodoQSMRXzEZFzOzj/MoYGT3MQGJQWIj5y8s8=; b=Jcc3iWxKzR0d/E tECtPI1k1qIZQFL0a/Cw0JY56uSkgYJIFDu/ix1v4RSJTx2RNsdfQkrCHBevGRpkogymO9XTwNdzw B7hFnPCZpf1zpySiEjzv44VUFonRai7Tos09GcpclCQPRgs0EFtk/lTPCi6BVanX/j/pVSL6NqDg3 RtEGae6V0T3IJJ0BLu6lAq0OAv7u8VD45ObMNGLrm2xz5DOQlqcabgMzmAFL2iyXyqCxC4XR5vHE1 8n1iXzORFaZoLy7JdgyvkdZh5zOovdYuKyNlaH9QPOwOMtxw2D9o3xT3Ckl8d2U2nVwlr9YhZKOsk yb/sfGx1kaIb2f9E0mxw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1rvPGf-00000001WkF-2KW4; Fri, 12 Apr 2024 22:21:09 +0000 Received: from mail-pl1-x634.google.com ([2607:f8b0:4864:20::634]) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1rvPGd-00000001WjM-0CfO for linux-riscv@lists.infradead.org; Fri, 12 Apr 2024 22:21:08 +0000 Received: by mail-pl1-x634.google.com with SMTP id d9443c01a7336-1e424bd30fbso11248445ad.0 for ; Fri, 12 Apr 2024 15:21:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rivosinc-com.20230601.gappssmtp.com; s=20230601; t=1712960466; x=1713565266; 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=Qw7f13VaApE9P7VRpDrEHdpAzJF1wdaPoxbwIFLmIG4=; b=bfSZPAkj7S2ZiHzryk4ZcakIs7TlsOUKkJyxRyIEOhtLGWJA7rEaq1vh0udJ+KOsNr JEhVZUKXwR9tj6TzAyD94IouhOLLawH+a5Gwf0WNakcMSXlcynrnCkYgB+30CZCBQ/lx CVxsPwSG40vRxite4pMJ1piOJPca8C4Z0LKlzPZYlf7fY9Xb+n4taQCS9bqWoACLntJO +ocESAzPEJ3/CmPXemolrNC5dLO1NCEIUNnh46r758b96fCkDgy3TEhjLwcw4diN3XdZ fSq3IG+mYw2nZnA6VbwN1yWLT0V1tbRFlyT+YdTifNSxF5cEgvDN2LyULfv++UEcoYgv tzSw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1712960466; x=1713565266; 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=Qw7f13VaApE9P7VRpDrEHdpAzJF1wdaPoxbwIFLmIG4=; b=KJqAt5f6+WF1tnC6MTz09gNHk2p9bgGKsRQcM1ElSm1MVP0TJ8RheKTJh/mZ9ps0jh y4EQA9hFtUz8rCKGc99YFq6AGzia5dV37s5UvR+dRfDv1iHexlboPYX5zXeLiPtrtWLR HtSJrxQHjH9nDVOq+UDRH+64ymBmBNCi60/aeoXkHNblIvnJ57YpRu3cRh+KqvoSQCLB o/It6d03dr1s193/HLAnZjaSpksS83kksNJ1xg/jVRDEOnE2vPCZAfa5u62y7yB6ijG3 OCwKHGGhIHW6y/6jOBmPpjRZD+AG3K9XQ0BQlwsTBjfqUXtXL8Xe+4OFcTNdOLAw0cIy X7ew== X-Forwarded-Encrypted: i=1; AJvYcCXxsw+J5YKFephLo5sAlGtplnr7QT4FzGIjltmaLteR963KjLe0O6n+maaGISfhtaKocZ4DsiO7FrusK4t2jDdM5jpjHyhjd+1Dqxme3qjv X-Gm-Message-State: AOJu0YzBwG3RCvgCho0QipQH0KILiLqZvmfDudXrAf6n0DdVTItLWdCo XNj8K8ct6QvVEF10mRFm74Gy3vuvWkXS0GbjoyFUBG0CmWGy87+rDAh5R6h9VmU= X-Google-Smtp-Source: AGHT+IHUI2RaMq8jaayA5FcthPXUJDbqZ0+AxzpHu6ba0uA91gdIC4L0mbVqNIRm0limEGVhmp0sjg== X-Received: by 2002:a17:903:2609:b0:1e2:ca65:68c2 with SMTP id jd9-20020a170903260900b001e2ca6568c2mr3674124plb.51.1712960465476; Fri, 12 Apr 2024 15:21:05 -0700 (PDT) Received: from ghost ([50.145.13.30]) by smtp.gmail.com with ESMTPSA id b7-20020a170902650700b001e245c5afbfsm3554986plk.155.2024.04.12.15.21.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 12 Apr 2024 15:21:05 -0700 (PDT) Date: Fri, 12 Apr 2024 15:21:02 -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 16/19] riscv: hwprobe: Add vendor extension probing Message-ID: References: <20240411-dev-charlie-support_thead_vector_6_9-v1-0-4af9815ec746@rivosinc.com> <20240411-dev-charlie-support_thead_vector_6_9-v1-16-4af9815ec746@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-20240412_152107_137797_D1396D33 X-CRM114-Status: GOOD ( 64.43 ) 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 T24gRnJpLCBBcHIgMTIsIDIwMjQgYXQgMDI6NDM6MDFQTSAtMDcwMCwgRXZhbiBHcmVlbiB3cm90 ZToKPiBPbiBGcmksIEFwciAxMiwgMjAyNCBhdCAxOjIw4oCvUE0gQ2hhcmxpZSBKZW5raW5zIDxj aGFybGllQHJpdm9zaW5jLmNvbT4gd3JvdGU6Cj4gPgo+ID4gT24gRnJpLCBBcHIgMTIsIDIwMjQg YXQgMTI6MDc6NDZQTSAtMDcwMCwgRXZhbiBHcmVlbiB3cm90ZToKPiA+ID4gT24gRnJpLCBBcHIg MTIsIDIwMjQgYXQgMTE6MTfigK9BTSBDaGFybGllIEplbmtpbnMgPGNoYXJsaWVAcml2b3NpbmMu Y29tPiB3cm90ZToKPiA+ID4gPgo+ID4gPiA+IE9uIEZyaSwgQXByIDEyLCAyMDI0IGF0IDEwOjA1 OjIxQU0gLTA3MDAsIEV2YW4gR3JlZW4gd3JvdGU6Cj4gPiA+ID4gPiBPbiBUaHUsIEFwciAxMSwg MjAyNCBhdCA5OjEy4oCvUE0gQ2hhcmxpZSBKZW5raW5zIDxjaGFybGllQHJpdm9zaW5jLmNvbT4g d3JvdGU6Cj4gPiA+ID4gPiA+Cj4gPiA+ID4gPiA+IEFkZCBhIG5ldyBod3Byb2JlIGtleSAiUklT Q1ZfSFdQUk9CRV9LRVlfVkVORE9SX0VYVF8wIiB3aGljaCBhbGxvd3MKPiA+ID4gPiA+ID4gdXNl cnNwYWNlIHRvIHByb2JlIGZvciB0aGUgbmV3IFJJU0NWX0lTQV9WRU5ET1JfRVhUX1hUSEVBRFZF Q1RPUiB2ZW5kb3IKPiA+ID4gPiA+ID4gZXh0ZW5zaW9uLgo+ID4gPiA+ID4gPgo+ID4gPiA+ID4g PiBTaWduZWQtb2ZmLWJ5OiBDaGFybGllIEplbmtpbnMgPGNoYXJsaWVAcml2b3NpbmMuY29tPgo+ ID4gPiA+ID4gPiAtLS0KPiA+ID4gPiA+ID4gIGFyY2gvcmlzY3YvaW5jbHVkZS9hc20vaHdwcm9i ZS5oICAgICAgfCAgNCArLS0KPiA+ID4gPiA+ID4gIGFyY2gvcmlzY3YvaW5jbHVkZS91YXBpL2Fz bS9od3Byb2JlLmggfCAxMCArKysrKy0KPiA+ID4gPiA+ID4gIGFyY2gvcmlzY3Yva2VybmVsL3N5 c19od3Byb2JlLmMgICAgICAgfCA1OSArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyst LQo+ID4gPiA+ID4gPiAgMyBmaWxlcyBjaGFuZ2VkLCA2OCBpbnNlcnRpb25zKCspLCA1IGRlbGV0 aW9ucygtKQo+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiBkaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9p bmNsdWRlL2FzbS9od3Byb2JlLmggYi9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL2h3cHJvYmUuaAo+ ID4gPiA+ID4gPiBpbmRleCA2MzA1MDdkZmY1ZWEuLmU2ODQ5NmI0ZjhkZSAxMDA2NDQKPiA+ID4g PiA+ID4gLS0tIGEvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9od3Byb2JlLmgKPiA+ID4gPiA+ID4g KysrIGIvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9od3Byb2JlLmgKPiA+ID4gPiA+ID4gQEAgLTEs NiArMSw2IEBACj4gPiA+ID4gPiA+ICAvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIu MCBXSVRIIExpbnV4LXN5c2NhbGwtbm90ZSAqLwo+ID4gPiA+ID4gPiAgLyoKPiA+ID4gPiA+ID4g LSAqIENvcHlyaWdodCAyMDIzIFJpdm9zLCBJbmMKPiA+ID4gPiA+ID4gKyAqIENvcHlyaWdodCAy MDIzLTIwMjQgUml2b3MsIEluYwo+ID4gPiA+ID4gPiAgICovCj4gPiA+ID4gPiA+Cj4gPiA+ID4g PiA+ICAjaWZuZGVmIF9BU01fSFdQUk9CRV9ICj4gPiA+ID4gPiA+IEBAIC04LDcgKzgsNyBAQAo+ ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiAgI2luY2x1ZGUgPHVhcGkvYXNtL2h3cHJvYmUuaD4KPiA+ ID4gPiA+ID4KPiA+ID4gPiA+ID4gLSNkZWZpbmUgUklTQ1ZfSFdQUk9CRV9NQVhfS0VZIDYKPiA+ ID4gPiA+ID4gKyNkZWZpbmUgUklTQ1ZfSFdQUk9CRV9NQVhfS0VZIDcKPiA+ID4gPiA+ID4KPiA+ ID4gPiA+ID4gIHN0YXRpYyBpbmxpbmUgYm9vbCByaXNjdl9od3Byb2JlX2tleV9pc192YWxpZChf X3M2NCBrZXkpCj4gPiA+ID4gPiA+ICB7Cj4gPiA+ID4gPiA+IGRpZmYgLS1naXQgYS9hcmNoL3Jp c2N2L2luY2x1ZGUvdWFwaS9hc20vaHdwcm9iZS5oIGIvYXJjaC9yaXNjdi9pbmNsdWRlL3VhcGkv YXNtL2h3cHJvYmUuaAo+ID4gPiA+ID4gPiBpbmRleCA5ZjJhOGUzZmYyMDQuLjY2MTRkM2FkZmM3 NSAxMDA2NDQKPiA+ID4gPiA+ID4gLS0tIGEvYXJjaC9yaXNjdi9pbmNsdWRlL3VhcGkvYXNtL2h3 cHJvYmUuaAo+ID4gPiA+ID4gPiArKysgYi9hcmNoL3Jpc2N2L2luY2x1ZGUvdWFwaS9hc20vaHdw cm9iZS5oCj4gPiA+ID4gPiA+IEBAIC0xLDYgKzEsNiBAQAo+ID4gPiA+ID4gPiAgLyogU1BEWC1M aWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgV0lUSCBMaW51eC1zeXNjYWxsLW5vdGUgKi8KPiA+ ID4gPiA+ID4gIC8qCj4gPiA+ID4gPiA+IC0gKiBDb3B5cmlnaHQgMjAyMyBSaXZvcywgSW5jCj4g PiA+ID4gPiA+ICsgKiBDb3B5cmlnaHQgMjAyMy0yMDI0IFJpdm9zLCBJbmMKPiA+ID4gPiA+ID4g ICAqLwo+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiAgI2lmbmRlZiBfVUFQSV9BU01fSFdQUk9CRV9I Cj4gPiA+ID4gPiA+IEBAIC02Nyw2ICs2NywxNCBAQCBzdHJ1Y3QgcmlzY3ZfaHdwcm9iZSB7Cj4g PiA+ID4gPiA+ICAjZGVmaW5lICAgICAgICAgICAgICAgIFJJU0NWX0hXUFJPQkVfTUlTQUxJR05F RF9VTlNVUFBPUlRFRCAgICAoNCA8PCAwKQo+ID4gPiA+ID4gPiAgI2RlZmluZSAgICAgICAgICAg ICAgICBSSVNDVl9IV1BST0JFX01JU0FMSUdORURfTUFTSyAgICAgICAgICAgKDcgPDwgMCkKPiA+ ID4gPiA+ID4gICNkZWZpbmUgUklTQ1ZfSFdQUk9CRV9LRVlfWklDQk9aX0JMT0NLX1NJWkUgICAg Ngo+ID4gPiA+ID4gPiArLyoKPiA+ID4gPiA+ID4gKyAqIEl0IGlzIG5vdCBwb3NzaWJsZSBmb3Ig b25lIENQVSB0byBoYXZlIG11bHRpcGxlIHZlbmRvciBpZHMsIHNvIGVhY2ggdmVuZG9yCj4gPiA+ ID4gPiA+ICsgKiBoYXMgaXRzIG93biB2ZW5kb3IgZXh0ZW5zaW9uICJuYW1lc3BhY2UiLiBUaGUg a2V5cyBmb3IgZWFjaCB2ZW5kb3Igc3RhcnRzCj4gPiA+ID4gPiA+ICsgKiBhdCB6ZXJvLgo+ID4g PiA+ID4gPiArICovCj4gPiA+ID4gPiA+ICsjZGVmaW5lIFJJU0NWX0hXUFJPQkVfS0VZX1ZFTkRP Ul9FWFRfMCA3Cj4gPiA+ID4gPiA+ICsgLyogVC1IZWFkICovCj4gPiA+ID4gPiA+ICsjZGVmaW5l ICAgICAgICAgICAgICAgIFJJU0NWX0hXUFJPQkVfVkVORE9SX0VYVF9YVEhFQURWRUNUT1IgICAo MSA8PCAwKQo+ID4gPiA+ID4gPiAgLyogSW5jcmVhc2UgUklTQ1ZfSFdQUk9CRV9NQVhfS0VZIHdo ZW4gYWRkaW5nIGl0ZW1zLiAqLwo+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiAgLyogRmxhZ3MgKi8K PiA+ID4gPiA+ID4gZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3Yva2VybmVsL3N5c19od3Byb2JlLmMg Yi9hcmNoL3Jpc2N2L2tlcm5lbC9zeXNfaHdwcm9iZS5jCj4gPiA+ID4gPiA+IGluZGV4IGUwYTQy Yzg1MTUxMS4uMzY1Y2U3MzgwNDQzIDEwMDY0NAo+ID4gPiA+ID4gPiAtLS0gYS9hcmNoL3Jpc2N2 L2tlcm5lbC9zeXNfaHdwcm9iZS5jCj4gPiA+ID4gPiA+ICsrKyBiL2FyY2gvcmlzY3Yva2VybmVs L3N5c19od3Byb2JlLmMKPiA+ID4gPiA+ID4gQEAgLTY5LDcgKzY5LDggQEAgc3RhdGljIHZvaWQg aHdwcm9iZV9pc2FfZXh0MChzdHJ1Y3QgcmlzY3ZfaHdwcm9iZSAqcGFpciwKPiA+ID4gPiA+ID4g ICAgICAgICBpZiAocmlzY3ZfaXNhX2V4dGVuc2lvbl9hdmFpbGFibGUoTlVMTCwgYykpCj4gPiA+ ID4gPiA+ICAgICAgICAgICAgICAgICBwYWlyLT52YWx1ZSB8PSBSSVNDVl9IV1BST0JFX0lNQV9D Owo+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiAtICAgICAgIGlmIChoYXNfdmVjdG9yKCkgJiYgIXJp c2N2X2hhc192ZW5kb3JfZXh0ZW5zaW9uX3VubGlrZWx5KFJJU0NWX0lTQV9WRU5ET1JfRVhUX1hU SEVBRFZFQ1RPUikpCj4gPiA+ID4gPiA+ICsgICAgICAgaWYgKGhhc192ZWN0b3IoKSAmJgo+ID4g PiA+ID4gPiArICAgICAgICAgICAhX19yaXNjdl9pc2FfdmVuZG9yX2V4dGVuc2lvbl9hdmFpbGFi bGUoTlVMTCwgUklTQ1ZfSVNBX1ZFTkRPUl9FWFRfWFRIRUFEVkVDVE9SKSkKPiA+ID4gPiA+ID4g ICAgICAgICAgICAgICAgIHBhaXItPnZhbHVlIHw9IFJJU0NWX0hXUFJPQkVfSU1BX1Y7Cj4gPiA+ ID4gPiA+Cj4gPiA+ID4gPiA+ICAgICAgICAgLyoKPiA+ID4gPiA+ID4gQEAgLTExMiw3ICsxMTMs OCBAQCBzdGF0aWMgdm9pZCBod3Byb2JlX2lzYV9leHQwKHN0cnVjdCByaXNjdl9od3Byb2JlICpw YWlyLAo+ID4gPiA+ID4gPiAgICAgICAgICAgICAgICAgRVhUX0tFWShaQUNBUyk7Cj4gPiA+ID4g PiA+ICAgICAgICAgICAgICAgICBFWFRfS0VZKFpJQ09ORCk7Cj4gPiA+ID4gPiA+Cj4gPiA+ID4g PiA+IC0gICAgICAgICAgICAgICBpZiAoaGFzX3ZlY3RvcigpICYmICFyaXNjdl9oYXNfdmVuZG9y X2V4dGVuc2lvbl91bmxpa2VseShSSVNDVl9JU0FfVkVORE9SX0VYVF9YVEhFQURWRUNUT1IpKSB7 Cj4gPiA+ID4gPiA+ICsgICAgICAgICAgICAgICBpZiAoaGFzX3ZlY3RvcigpICYmCj4gPiA+ID4g PiA+ICsgICAgICAgICAgICAgICAgICAgIXJpc2N2X2hhc192ZW5kb3JfZXh0ZW5zaW9uX3VubGlr ZWx5KFJJU0NWX0lTQV9WRU5ET1JfRVhUX1hUSEVBRFZFQ1RPUikpIHsKPiA+ID4gPiA+ID4gICAg ICAgICAgICAgICAgICAgICAgICAgRVhUX0tFWShaVkJCKTsKPiA+ID4gPiA+ID4gICAgICAgICAg ICAgICAgICAgICAgICAgRVhUX0tFWShaVkJDKTsKPiA+ID4gPiA+ID4gICAgICAgICAgICAgICAg ICAgICAgICAgRVhUX0tFWShaVktCKTsKPiA+ID4gPiA+ID4gQEAgLTEzOSw2ICsxNDEsNTUgQEAg c3RhdGljIHZvaWQgaHdwcm9iZV9pc2FfZXh0MChzdHJ1Y3QgcmlzY3ZfaHdwcm9iZSAqcGFpciwK PiA+ID4gPiA+ID4gICAgICAgICBwYWlyLT52YWx1ZSAmPSB+bWlzc2luZzsKPiA+ID4gPiA+ID4g IH0KPiA+ID4gPiA+ID4KPiA+ID4gPiA+ID4gK3N0YXRpYyB2b2lkIGh3cHJvYmVfaXNhX3ZlbmRv cl9leHQwKHN0cnVjdCByaXNjdl9od3Byb2JlICpwYWlyLAo+ID4gPiA+ID4gPiArICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqY3B1cykKPiA+ ID4gPiA+ID4gK3sKPiA+ID4gPiA+ID4gKyAgICAgICBpbnQgY3B1Owo+ID4gPiA+ID4gPiArICAg ICAgIHU2NCBtaXNzaW5nID0gMDsKPiA+ID4gPiA+ID4gKwo+ID4gPiA+ID4gPiArICAgICAgIHBh aXItPnZhbHVlID0gMDsKPiA+ID4gPiA+ID4gKwo+ID4gPiA+ID4gPiArICAgICAgIHN0cnVjdCBy aXNjdl9od3Byb2JlIG12ZW5kb3JpZCA9IHsKPiA+ID4gPiA+ID4gKyAgICAgICAgICAgICAgIC5r ZXkgPSBSSVNDVl9IV1BST0JFX0tFWV9NVkVORE9SSUQsCj4gPiA+ID4gPiA+ICsgICAgICAgICAg ICAgICAudmFsdWUgPSAwCj4gPiA+ID4gPiA+ICsgICAgICAgfTsKPiA+ID4gPiA+ID4gKwo+ID4g PiA+ID4gPiArICAgICAgIGh3cHJvYmVfYXJjaF9pZCgmbXZlbmRvcmlkLCBjcHVzKTsKPiA+ID4g PiA+ID4gKwo+ID4gPiA+ID4gPiArICAgICAgIC8qIFNldCB2YWx1ZSB0byB6ZXJvIGlmIENQVXMg aW4gdGhlIHNldCBkbyBub3QgaGF2ZSB0aGUgc2FtZSB2ZW5kb3IuICovCj4gPiA+ID4gPiA+ICsg ICAgICAgaWYgKG12ZW5kb3JpZC52YWx1ZSA9PSAtMVVMTCkKPiA+ID4gPiA+ID4gKyAgICAgICAg ICAgICAgIHJldHVybjsKPiA+ID4gPiA+ID4gKwo+ID4gPiA+ID4gPiArICAgICAgIC8qCj4gPiA+ ID4gPiA+ICsgICAgICAgICogTG9vcCB0aHJvdWdoIGFuZCByZWNvcmQgdmVuZG9yIGV4dGVuc2lv bnMgdGhhdCAxKSBhbnlvbmUgaGFzLCBhbmQKPiA+ID4gPiA+ID4gKyAgICAgICAgKiAyKSBhbnlv bmUgZG9lc24ndCBoYXZlLgo+ID4gPiA+ID4gPiArICAgICAgICAqLwo+ID4gPiA+ID4gPiArICAg ICAgIGZvcl9lYWNoX2NwdShjcHUsIGNwdXMpIHsKPiA+ID4gPiA+ID4gKyAgICAgICAgICAgICAg IHN0cnVjdCByaXNjdl9pc2FpbmZvICppc2F2ZW5kb3JpbmZvID0gJmhhcnRfaXNhX3ZlbmRvcltj cHVdOwo+ID4gPiA+ID4gPiArCj4gPiA+ID4gPiA+ICsjZGVmaW5lIFZFTkRPUl9FWFRfS0VZKGV4 dCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBcCj4gPiA+ID4gPiA+ICsgICAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCj4gPiA+ ID4gPiA+ICsgICAgICAgICAgICAgICBpZiAoX19yaXNjdl9pc2FfdmVuZG9yX2V4dGVuc2lvbl9h dmFpbGFibGUoaXNhdmVuZG9yaW5mby0+aXNhLCAgICAgICAgICBcCj4gPiA+ID4gPiA+ICsgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJJU0NW X0lTQV9WRU5ET1JfRVhUXyMjZXh0KSkgICBcCj4gPiA+ID4gPiA+ICsgICAgICAgICAgICAgICAg ICAgICAgIHBhaXItPnZhbHVlIHw9IFJJU0NWX0hXUFJPQkVfVkVORE9SX0VYVF8jI2V4dDsgICAg ICAgICAgICAgICAgICBcCj4gPiA+ID4gPiA+ICsgICAgICAgICAgICAgICBlbHNlICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBcCj4gPiA+ID4gPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIG1pc3NpbmcgfD0gUklTQ1Zf SFdQUk9CRV9WRU5ET1JfRVhUXyMjZXh0OyAgICAgICAgICAgICAgICAgICAgICBcCj4gPiA+ID4g PiA+ICsgICAgICAgfSB3aGlsZSAoZmFsc2UpCj4gPiA+ID4gPiA+ICsKPiA+ID4gPiA+ID4gKyAg ICAgICAvKgo+ID4gPiA+ID4gPiArICAgICAgICAqIE9ubHkgdXNlIFZFTkRPUl9FWFRfS0VZKCkg Zm9yIGV4dGVuc2lvbnMgd2hpY2ggY2FuIGJlIGV4cG9zZWQgdG8gdXNlcnNwYWNlLAo+ID4gPiA+ ID4gPiArICAgICAgICAqIHJlZ2FyZGxlc3Mgb2YgdGhlIGtlcm5lbCdzIGNvbmZpZ3VyYXRpb24s IGFzIG5vIG90aGVyIGNoZWNrcywgYmVzaWRlcwo+ID4gPiA+ID4gPiArICAgICAgICAqIHByZXNl bmNlIGluIHRoZSBoYXJ0X3ZlbmRvcl9pc2EgYml0bWFwLCBhcmUgbWFkZS4KPiA+ID4gPiA+ID4g KyAgICAgICAgKi8KPiA+ID4gPiA+ID4gKyAgICAgICBWRU5ET1JfRVhUX0tFWShYVEhFQURWRUNU T1IpOwo+ID4gPiA+ID4gPiArCj4gPiA+ID4gPiA+ICsjdW5kZWYgVkVORE9SX0VYVF9LRVkKPiA+ ID4gPiA+Cj4gPiA+ID4gPiBIZXkgQ2hhcmxpZSwKPiA+ID4gPiA+IFRoYW5rcyBmb3Igd3JpdGlu ZyB0aGlzIHVwISBBdCB0aGUgdmVyeSBsZWFzdCBJIHRoaW5rIHRoZQo+ID4gPiA+ID4gVEhFQUQt c3BlY2lmaWMgc3R1ZmYgc2hvdWxkIHByb2JhYmx5IGVuZCB1cCBpbiBpdHMgb3duIGZpbGUsIG90 aGVyd2lzZQo+ID4gPiA+ID4gaXQnbGwgZ2V0IGNoYW90aWMgd2l0aCB2ZW5kb3JzIGNsYW1vcmlu ZyB0byBhZGQgc3R1ZmYgcmlnaHQgaGVyZS4KPiA+ID4gPgo+ID4gPiA+IEdyZWF0IGlkZWEhCj4g PiA+ID4KPiA+ID4gPiA+IFdoYXQgZG8geW91IHRoaW5rIGFib3V0IHRoaXMgYXBwcm9hY2g6Cj4g PiA+ID4gPiAgKiBXZSBsZWF2ZSBSSVNDVl9IV1BST0JFX01BWF9LRVkgYXMgdGhlIG1heCBrZXkg Zm9yIHRoZSAiZ2VuZXJpYwo+ID4gPiA+ID4gd29ybGQiLCBlZyA2LWlzaAo+ID4gPiA+ID4gICog V2UgZGVmaW5lIHRoYXQgYW55IGtleSBhYm92ZSAweDgwMDAwMDAwMDAwMDAwMDAgaXMgaW4gdGhl IHZlbmRvcgo+ID4gPiA+ID4gc3BhY2UsIHNvIHRoZSBtZWFuaW5nIG9mIHRoZSBrZXlzIGRlcGVu ZHMgZmlyc3Qgb24gdGhlIG12ZW5kb3JpZAo+ID4gPiA+ID4gdmFsdWUuCj4gPiA+ID4gPiAgKiBJ biB0aGUga2VybmVsIGNvZGUsIGVhY2ggbmV3IHZlbmRvciBhZGRzIG9uIHRvIGEgZ2xvYmFsIHN0 cnVjdCwKPiA+ID4gPiA+IHdoaWNoIG1pZ2h0IGxvb2sgc29tZXRoaW5nIGxpa2U6Cj4gPiA+ID4g PiBzdHJ1Y3QgaHdwcm9iZV92ZW5kb3Jfc3BhY2UgdmVuZG9yX3NwYWNlW10gPSB7Cj4gPiA+ID4g PiAgICAgICAgIHsKPiA+ID4gPiA+ICAgICAgICAgICAgICAgICAubXZlbmRvcmlkID0gVkVORE9S X1RIRUFELAo+ID4gPiA+ID4gICAgICAgICAgICAgICAgIC5tYXhfaHdwcm9iZV9rZXkgPSBUSEVB RF9NQVhfSFdQUk9CRV9LRVksIC8vIGN1cnJlbnRseQo+ID4gPiA+ID4gMSBvciAweDgwMDAwMDAw MDAwMDAwMDEgd2l0aCB3aGF0IHlvdSd2ZSBnb3QuCj4gPiA+ID4gPiAgICAgICAgICAgICAgICAg Lmh3cHJvYmVfZm4gPSB0aGVhZF9od3Byb2JlCj4gPiA+ID4gPiAgICAgICAgIH0sCj4gPiA+ID4g PiAgICAgICAgIC4uLgo+ID4gPiA+ID4gfTsKPiA+ID4gPiA+Cj4gPiA+ID4gPiAgKiBBIGh3cHJv YmVfdGhlYWQuYyBpbXBsZW1lbnRzIHRoZWFkX2h3cHJvYmUoKSwgYW5kIGlzIGNhbGxlZAo+ID4g PiA+ID4gd2hlbmV2ZXIgdGhlIGdlbmVyaWMgaHdwcm9iZSBlbmNvdW50ZXJzIGEga2V5ID49MHg4 MDAwMDAwMDAwMDAwMDAwLgo+ID4gPiA+ID4gICogR2VuZXJpYyBjb2RlIGZvciBzZXR0aW5nIHVw IHRoZSBWRFNPIGNhbiB0aGVuIHN0aWxsIGNhbGwgdGhlCj4gPiA+ID4gPiB2ZW5kb3Itc3BlY2lm aWMgaHdwcm9iZV9mbigpIHJlcGVhdGVkbHkgd2l0aCBhbiAiYWxsIENQVXMiIG1hc2sgZnJvbQo+ ID4gPiA+ID4gdGhlIGJhc2UgdG8gbWF4X2h3cHJvYmVfa2V5IGFuZCBzZXQgdXAgdGhlIGNhY2hl ZCB0YWJsZXMgaW4gdXNlcnNwYWNlLgo+ID4gPiA+ID4gICogU2luY2UgdGhlIFZEU08gZGF0YSBo YXMgbGltaXRlZCBzcGFjZSB3ZSBtYXkgaGF2ZSB0byBjYXAgdGhlIG51bWJlcgo+ID4gPiA+ID4g b2YgdmVuZG9yIGtleXMgd2UgY2FjaGUgdG8gYmUgbG93ZXIgdGhhbiBtYXhfaHdwcm9iZV9rZXku IFNpbmNlIHRoZQo+ID4gPiA+ID4gZGF0YSBpdHNlbGYgaXMgbm90IGV4cG9zZWQgdG8gdXNlcm1v ZGUgd2UgY2FuIHJhaXNlIHRoaXMgY2FwIGxhdGVyIGlmCj4gPiA+ID4gPiBuZWVkZWQuCj4gPiA+ ID4KPiA+ID4gPiBJIGtub3cgdmVuZG9yIGV4dGVuc2lvbnMgYXJlIGtpbmQgb2YgdGhlICJ3aWxk IHdlc3QiIG9mIHJpc2N2LCBidXQgaW4KPiA+ID4gPiBzcGl0ZSBvZiB0aGF0IEkgd2FudCB0byBk ZXNpZ24gYSBjb25zaXN0ZW50IEFQSS4gVGhlIGlzc3VlIEkgaGFkIHdpdGgKPiA+ID4gPiBoYXZp bmcgdGhpcyAidmVuZG9yIHNwYWNlIiBmb3IgZXhwb3NpbmcgdmVuZG9yIGV4dGVuc2lvbnMgd2Fz IHRoYXQgdGhpcwo+ID4gPiA+IGlzIHNvbWV0aGluZyB0aGF0IGlzIGluaGVyZW50bHkgdGhlIHNh bWUgZm9yIGFsbCB2ZW5kb3JzLiBJIHNlZSBhIHZlbmRvcgo+ID4gPiA+IHNwYWNlIGxpa2UgdGhp cyBtb3JlIGFwcGxpY2FibGUgZm9yIHNvbWV0aGluZyBsaWtlCj4gPiA+ID4gIlJJU0NWX0hXUFJP QkVfS0VZX1pJQ0JPWl9CTE9DS19TSVpFIiB3aGVyZSBhIHZlbmRvciBoYXMgYSBzcGVjaWZpYwo+ ID4gPiA+IHZhbHVlIHRoZXkgd291bGQgbGlrZSB0byBleHBvc2UuIEkgZG8gYWdyZWUgdGhhdCBo YXZpbmcgYSB2ZW5kb3Igc3BhY2UKPiA+ID4gPiBpcyBhIGdvb2QgZGVzaWduIGNob2ljZSwgYnV0 IEkgYW0gbm90IGNvbnZpbmNlZCB0aGF0IHZlbmRvciBleHRlbnNpb25zCj4gPiA+ID4gYXJlIHRo ZSBwcm9wZXIgdXNlLWNhc2UuCj4gPiA+ID4KPiA+ID4gPiBCeSBoYXZpbmcgUklTQ1ZfSFdQUk9C RV9LRVlfVkVORE9SX0VYVF8wIHdlIGNhbiBleHBvc2UgdGhlIHZlbmRvcgo+ID4gPiA+IGV4dGVu c2lvbnMgaW4gdGhlIHNhbWUgd2F5IHRoYXQgc3RhbmRhcmQgZXh0ZW5zaW9ucyBhcmUgZXhwb3Nl ZCwgd2l0aCBhCj4gPiA+ID4gYml0bWFzayByZXByZXNlbnRpbmcgZWFjaCBleHRlbnNpb24uIElm IHRoZXNlIGFyZSBpbnN0ZWFkIGluIHRoZSB2ZW5kb3IKPiA+ID4gPiBzcGFjZSwgZWFjaCB2ZW5k b3Igd291bGQgcHJvYmFibHkgYmUgaW5jbGluZWQgdG8gaW50cm9kdWNlIGEga2V5IGxpa2UKPiA+ ID4gPiBSSVNDVl9IV1BST0JFX0tFWV9USEVBRF9FWFRfMCB0aGF0IHJldHVybnMgYSBiaXRtYXNr IG9mIGFsbCBvZiB0aGUgdGhlYWQKPiA+ID4gPiB2ZW5kb3IgZXh0ZW5zaW9ucy4gVGhpcyBkdXBs aWNhdGVkIGVmZm9ydCBpcyB3aGF0IEkgYW0gdHJ5aW5nIHRvIGF2b2lkLgo+ID4gPiA+IFRoZSBh bHRlcm5hdGl2ZSB3b3VsZCBiZSB0aGF0IHZlbmRvcnMgaGF2ZSBhIHNlcGFyYXRlIGtleSBmb3Ig ZWFjaAo+ID4gPiA+IHZlbmRvciBleHRlbnNpb24gdGhleSB3b3VsZCBsaWtlIHRvIGV4cG9zZSwg YnV0IHRoYXQgaXMgc3RyaWN0bHkgbGVzcwo+ID4gPiA+IGVmZmljaWVudCB0aGFuIHRoZSBleGlz dGluZyBiaXRtYXNrIHByb2JpbmcuCj4gPiA+ID4KPiA+ID4gPiBEbyB5b3UgdGhpbmsgdGhhdCBo YXZpbmcgdGhlIHZlbmRvciBzcGFjZSBpcyBhcHByb3ByaWF0ZSBmb3IgdmVuZG9yCj4gPiA+ID4g ZXh0ZW5zaW9ucyBnaXZlbiBteSBjb25jZXJucz8KPiA+ID4KPiA+ID4gSSBkbyBzZWUgd2hhdCB5 b3UncmUgZ29pbmcgZm9yLiBJdCdzIHRpZHkgZm9yIGEgYml0bWFzayB0byBqdXN0IGxldAo+ID4g PiBhbnlvbmUgYWxsb2NhdGUgdGhlIG5leHQgYml0LCBidXQgbGVhdmVzIHlvdSB3aXRoIHRoZSBz YW1lIHByb2JsZW0KPiA+ID4gd2hlbiBhIHZlbmRvciBkZWNpZGVzIHRoZXkgd2FudCB0byBleHBv c2UgYW4gZW51bSwgb3IgZGVjaWRlcyB0aGV5Cj4gPiA+IHdhbnQgdG8gZXhwb3NlIGEgYmF6aWxs aW9uIHRoaW5ncy4gSSB0aGluayBhIGdlbmVyYWxpemVkIHZlcnNpb24gb2YKPiA+Cj4gPiBUaGlz IHBhdGNoIGlzIHN0cmljdGx5IHRvIGV4cG9zZSBpZiBhIHZlbmRvciBleHRlbnNpb24gaXMgc3Vw cG9ydGVkLAo+ID4gaG93IGRvZXMgZXhwb3NpbmcgZW51bXMgZmFjdG9yIGluIGhlcmU/Cj4gPgo+ ID4gPiB0aGUgYXBwcm9hY2ggeW91J3ZlIHdyaXR0ZW4gd291bGQgYmU6IHNpbXBseSBsZXQgdmVu ZG9ycyBhbGxvY2F0ZSBrZXlzCj4gPiA+IGZyb20gdGhlIHNhbWUgZ2xvYmFsIHNwYWNlIHdlJ3Jl IGFscmVhZHkgdXNpbmcuIE15IHdvcnJ5IHdhcyB0aGF0IGl0Cj4gPgo+ID4gSSBhbSBtaXNzaW5n IGhvdyBteSBwcm9wb3NhbCBzdWdnZXN0cyBhbGxvd2luZyB2ZW5kb3JzIHRvIGFsbG9jYXRlIGtl eXMKPiA+IGluIGEgZ2xvYmFsIHNwYWNlLgo+ID4KPiA+ID4gd291bGQgdHVybiBpbnRvIGFuIGV4 cGFuc2l2ZSBzdWJ1cmJhbiBzcHJhd2wgb2YgbW9zdGx5IGRlYWQgYml0cywgb3IKPiA+ID4gaW4g dGhlIGNhc2Ugb2YgdmVuZG9yLXNwZWNpZmljIGtleXMsIGZ1bGwgb2YgImlmIChtdmVuZG9yX2lk KCkgIT0KPiA+ID4gTUlORSkgcmV0dXJuIDA7Ii4gTXkgaG9wZSB3aXRoIHRoZSB2ZW5kb3JlZCBr ZXlzcGFjZSBpcyBpdCB3b3VsZCBrZWVwCj4gPgo+ID4gQW4gYXBwbGljYXRpb24gd2lsbCBhbHdh eXMgbmVlZCB0byBjaGVjayB2ZW5kb3JpZCBiZWZvcmUgY2FsbGluZyBod3Byb2JlCj4gPiB3aXRo IGEgdmVuZG9yLXNwZWNpZmljIGZlYXR1cmU/IElmIHRoYXQgaHdwcm9iZSBzdXBwb3J0IGlzIGEg a2V5IGFib3ZlCj4gPiAxPDw2MywgdGhlbiB0aGUgYXBwbGljYXRpb24gd2lsbCBuZWVkIHRvIHBh c3MgdGhhdCB2ZW5kb3Itc3BlY2lmaWMga2V5Cj4gPiBhbmQgaW50ZXJwcmV0IHRoZSB2ZW5kb3It c3BlY2lmaWMgdmFsdWUuIElmIHRoYXQgaHdwcm9iZSBzdXBwb3J0IGlzIHdoYXQKPiA+IEkgaGF2 ZSBwcm9wb3NlZCBoZXJlLCB0aGVuIHRoZSB1c2VyIGNhbGxzIHRoZSBzdGFuZGFyZGl6ZWQgdmVu ZG9yCj4gPiBleHRlbnNpb24gaHdwcm9iZSBlbmRwb2ludCBhbmQgdGhlbiBuZWVkcyB0byBpbnRl cnByZXQgdGhlIHJlc3VsdCBiYXNlZAo+ID4gb24gdGhlIHZlbmRvciBvZiB0aGUgY3B1bWFzay4g SW4gYm90aCBjYXNlcyB0aGV5IG5lZWQgdG8gY2hlY2sgdGhlCj4gPiB2ZW5kb3JpZCBvZiB0aGUg Y3B1bWFzay4gSW4gdGhlIHRlc3QgY2FzZSBJIGFkZGVkIEkgZmFpbGVkIHRvIGNoZWNrIHRoZQo+ ID4gdmVuZG9yaWQgYnV0IEkgc2hvdWxkIGhhdmUgaGFkIHRoYXQuCj4gPgo+ID4gPiB0aGUgc3By YXdsIGZyb20gcG9sbHV0aW5nIHRoZSBnZW5lcmFsIGFycmF5IG9mIChob3BlZnVsbHkgdmFsdWFi bGUpCj4gPiA+IGluZm8gd2l0aCBzdHVmZiB0aGF0J3MgbGlrZWx5IHRvIGJlY29tZSBsZXNzIHJl bGV2YW50IGFzIHRpbWUgcGFzc2VzLgo+ID4gPiBJdCBhbHNvIGxvd2VycyB0aGUgYmFyIGEgYml0 IHRvIG1ha2UgaXQgZWFzaWVyIGZvciB2ZW5kb3JzIHRvIGV4cG9zZQo+ID4gPiBiaXRzLCBhcyB0 aGV5IGRvbid0IGNvbnN1bWUgZ2xvYmFsIHNwYWNlIGZvciBldmVyeW9uZSBmb3IgYWxsIG9mIHRp bWUsCj4gPiA+IGp1c3QgdGhlbXNlbHZlcy4KPiA+Cj4gPiBUaGUgdmVuZG9yIGtleXMgYXJlIHRp ZWQgZGlyZWN0bHkgdG8gdGhlIHZlbmRvci4gU28gYXMgaXQgZ3Jvd3Mgd2Ugd291bGQKPiA+IGhh dmUgc29tZXRoaW5nIGxpa2U6Cj4gPgo+ID4gI2RlZmluZSBSSVNDVl9IV1BST0JFX0tFWV9WRU5E T1JfRVhUXzAgIDcKPiA+IC8qIFQtSGVhZCAqLwo+ID4gI2RlZmluZSAgICAgICAgIFJJU0NWX0hX UFJPQkVfVkVORE9SX0VYVF9YVEhFQURWRUNUT1IgICAoMSA8PCAwKQo+ID4gI2RlZmluZSAgICAg ICAgIFJJU0NWX0hXUFJPQkVfVkVORE9SX0VYVF9YVEhFQUQyICAgICAgICAoMiA8PCAwKQo+ID4g I2RlZmluZSAgICAgICAgIFJJU0NWX0hXUFJPQkVfVkVORE9SX0VYVF9YVEhFQUQzICAgICAgICAo MyA8PCAwKQo+ID4gLyogVmVuZG9yIDIgKi8KPiA+ICNkZWZpbmUgICAgICAgICBSSVNDVl9IV1BS T0JFX1ZFTkRPUl9FWFRfWFZFTkRPUjEgICAgICAgKDEgPDwgMCkKPiA+ICNkZWZpbmUgICAgICAg ICBSSVNDVl9IV1BST0JFX1ZFTkRPUl9FWFRfWFZFTkRPUjIgICAgICAgKDIgPDwgMCkKPiA+IC8q IFZlbmRvciAzICovCj4gPiAuLi4KPiA+Cj4gPiBUaGUga2V5cyBvdmVybGFwIGJldHdlZW4gdmVu ZG9ycy4gVG8gZGV0ZXJtaW5lIHdoaWNoIGV4dGVuc2lvbiBhIHZlbmRvcgo+ID4gc3VwcG9ydHMs IGh3cHJvYmUgZ2V0cyBkYXRhIGZyb20gaGFydF9pc2FfdmVuZG9yW2NwdV0uIElmIHRoZSB2ZW5k b3IgaXMKPiA+IHZlbmRvciAyLCBpdCBpcyBub3QgcG9zc2libGUgZm9yIGEgdmVuZG9yIGV4dGVu c2lvbiBmcm9tIHZlbmRvciAzIHRvIGVuZAo+ID4gdXAgaW4gdGhlcmUuIE9ubHkgdGhlIGV4dGVu c2lvbnMgZnJvbSB0aGF0IHZlbmRvciBjYW4gYmUgc3VwcG9ydGVkIGJ5Cj4gPiB0aGF0IHZlbmRv cidzIGhhcmR3YXJlLgo+IAo+IEdvdGNoYS4gWW91J3JlIHJpZ2h0IEkgaGFkIG1pc2ludGVycHJl dGVkIHRoaXMsIHRoaW5raW5nIFhUSEVBRFZFQ1RPUgo+IHdhcyBhIHZhbGlkIGJpdCByZWdhcmRs ZXNzIG9mIG12ZW5kb3JpZCwgYW5kIHRoYXQgb3RoZXIgdmVuZG9ycyB3b3VsZAo+IGhhdmUgdG8g Y2hvb3NlIG5ldyBiaXRzIGZvciB0aGVpciBmZWF0dXJlcyBhbmQgYWx3YXlzIHJldHVybiAwIGZv cgo+IFhUSEVBRFZFQ1RPUi4gV2l0aCB5b3VyIGV4cGxhbmF0aW9uLCBpdCBzZWVtcyBsaWtlIHlv dSdyZSBhbGxvY2F0aW5nCj4ga2V5cyAoaW4gbm8gcGFydGljdWxhciBvcmRlcikgd2hvc2UgbWVh bmluZyB3aWxsIGNoYW5nZSBiYXNlZCBvbgo+IG12ZW5kb3JpZC4KPiAKPiBJIGd1ZXNzIEknbSBz dGlsbCBub3QgY29udmluY2VkIHRoYXQgc2F2aW5nIGVhY2ggdmVuZG9yIGZyb20gaGF2aW5nIHRv Cj4gYWRkIGEgVkVORE9SX0VYVCBrZXkgaW4gdGhlaXIga2V5c3BhY2UgaXMgd29ydGggdGhlIHNh Y3JpZmljZSBvZgo+IHNwcmF5aW5nIHRoZSB2ZW5kb3Itc3BlY2lmaWMga2V5cyBhY3Jvc3MgdGhl IGdlbmVyaWMga2V5c3BhY2UuIEFyZQo+IHRoZXJlIGFkdmFudGFnZXMgdG8gaGF2aW5nIGEgc2lu Z2xlIGtleSB3aG9zZSBjYXRlZ29yeSBpcyBzaW1pbGFyIGJ1dAo+IHdob3NlIGJpdHMgYXJlIGVu dGlyZWx5IHZlbmRvci1kZWZpbmVkPyBNYXliZSBpZiBJIHdlcmUgdXNlcnNwYWNlIGFuZAo+IG15 IGZlYXR1cmUgY291bGQgYmUgc2F0aXNmaWVkIGVxdWl2YWxlbnRseSBieSBYVEhFQURWRUNUT1Ig b3IKPiBYUklWT1NPVEhFUlRISU5HLCB0aGVuIEkgY291bGQgZG8gb25lIGh3cHJvYmUgY2FsbCBp bnN0ZWFkIG9mIHR3bz8gQnV0Cj4gSSBkb24ndCB0aGluayB0aGUgdmVuZG9ycyBhcmUgZ29pbmcg dG8gYmUgY29uc2lzdGVudCBlbm91Z2ggZm9yIHRoYXQKPiBlcXVpdmFsZW5jeSB0byBldmVyIHBy b3ZlIHVzZWZ1bC4gVGhlIGFkdmFudGFnZXMgaW4gbXkgaGVhZCBvZiB0aGUKPiBzZXBhcmF0ZSB2 ZW5kb3Iga2V5c3BhY2UgYXJlOgo+ICAqIEtlZXBzIHRoZSBrZXJuZWwgY29kZSBzaW1wbGU6IGlm IGtleSA+PSAoMSA+PiA2MykKPiB2ZW5kb3JfY29uZmlnLT5kb19od3Byb2JlKCksIHJhdGhlciB0 aGFuIGhhdmluZyBhbGwgdGhlc2UgbGl0dGxlIGNhbGxzCj4gaW4gZWFjaCBzcGVjaWZpYyBzd2l0 Y2ggY2FzZSBmb3IgdmVuZG9yX2NvbmZpZy0+ZG9fdmVuZG9yX2V4dDAoKSwKPiB2ZW5kb3JfY29u ZmlnLT5kb192ZW5kb3JfZXh0MSgpLCBldGMuCgpUaGUgY29uc2lzdGVuY3kgYmV0d2VlbiB2ZW5k b3JzIGlzIGd1YXJhbnRlZWQgaW4gdGhpcyBzY2hlbWUuIFRoZXkganVzdAphZGQgdGhlIGV4dGVu c2lvbiB0byBod3Byb2JlX2lzYV92ZW5kb3JfZXh0MC4gVGhlIGZvbGxvd2luZyBjb2RlIGlzIHRo ZQpjcml0aWNhbCBjb2RlIGZyb20gdGhlIGtlcm5lbDoKCglmb3JfZWFjaF9jcHUoY3B1LCBjcHVz KSB7CgkJc3RydWN0IHJpc2N2X2lzYWluZm8gKmlzYXZlbmRvcmluZm8gPSAmaGFydF9pc2FfdmVu ZG9yW2NwdV07CgojZGVmaW5lIFZFTkRPUl9FWFRfS0VZKGV4dCkJCQkJCQkJCVwKCWRvIHsJCQkJ CQkJCQkJXAoJCWlmIChfX3Jpc2N2X2lzYV92ZW5kb3JfZXh0ZW5zaW9uX2F2YWlsYWJsZShpc2F2 ZW5kb3JpbmZvLT5pc2EsCQlcCgkJCQkJCQkgUklTQ1ZfSVNBX1ZFTkRPUl9FWFRfIyNleHQpKQlc CgkJCXBhaXItPnZhbHVlIHw9IFJJU0NWX0hXUFJPQkVfVkVORE9SX0VYVF8jI2V4dDsJCQlcCgkJ ZWxzZQkJCQkJCQkJCVwKCQkJbWlzc2luZyB8PSBSSVNDVl9IV1BST0JFX1ZFTkRPUl9FWFRfIyNl eHQ7CQkJXAoJfSB3aGlsZSAoZmFsc2UpCgoJLyoKCSAqIE9ubHkgdXNlIFZFTkRPUl9FWFRfS0VZ KCkgZm9yIGV4dGVuc2lvbnMgd2hpY2ggY2FuIGJlIGV4cG9zZWQgdG8gdXNlcnNwYWNlLAoJICog cmVnYXJkbGVzcyBvZiB0aGUga2VybmVsJ3MgY29uZmlndXJhdGlvbiwgYXMgbm8gb3RoZXIgY2hl Y2tzLCBiZXNpZGVzCgkgKiBwcmVzZW5jZSBpbiB0aGUgaGFydF92ZW5kb3JfaXNhIGJpdG1hcCwg YXJlIG1hZGUuCgkgKi8KCVZFTkRPUl9FWFRfS0VZKFhUSEVBRFZFQ1RPUik7CgojdW5kZWYgVkVO RE9SX0VYVF9LRVkKCX0KCgkvKiBOb3cgdHVybiBvZmYgcmVwb3J0aW5nIGZlYXR1cmVzIGlmIGFu eSBDUFUgaXMgbWlzc2luZyBpdC4gKi8KCXBhaXItPnZhbHVlICY9IH5taXNzaW5nOwoKVGhlIG9u bHkgdGhpbmcgYSB2ZW5kb3Igd2lsbCBoYXZlIHRvIGRvIGlzIGFkZCBhbiBlbnRyeSBiZWxvdwpW RU5ET1JfRVhUX0tFWShYVEhFQURWRUNUT1IpIHdpdGggdGhlaXIgZXh0ZW5zaW9uIG5hbWUgKG9m IGNvdXJzZQpwb3B1bGF0aW5nIGEgdmFsdWUgZm9yIHRoZSBrZXkgYXMgd2VsbCkuIFRoaXMgZXhp c3RpbmcgY29kZSB3aWxsIHRoZW4KY2hlY2sgaWYgdGhlIGV4dGVuc2lvbiBpcyBjb21wYXRpYmxl IHdpdGggdGhlIGhhcmR3YXJlIGFuZCBhcHByb3ByaWF0ZQpwb3B1bGF0ZSB0aGUgYml0bWFzay4g QWxsIHZlbmRvcnMgZ2V0IHRoaXMgZnVuY3Rpb25hbGl0eSBmb3IgImZyZWUiCndpdGhvdXQgbmVl ZGluZyB0byB3cml0ZSB0aGUgYm9pbGVycGxhdGUgY29kZSB0byBleHBvc2UgdmVuZG9yCmV4dGVu c2lvbnMgdGhyb3VnaCBod3Byb2JlLgoKTm93IHRoYXQgSSB3cml0ZSB0aGlzIG91dCBJIGRvIHNl ZSB0aGF0IEkgb3Zlcmxvb2tlZCB0aGF0IHRoaXMgY29kZQpuZWVkcyB0byBjaGVjayB0aGUgdmVu ZG9yaWQgdG8gZW5zdXJlIHRoYXQgdGhlIGdpdmVuIGV4dGVuc2lvbiBpcwphY3R1YWxseSBhc3Nv Y2lhdGVkIHdpdGggdGhlIHZlbmRvcmlkLiBUaGlzIHdvdWxkIG1ha2UgdGhpcyBtb3JlCmNvbXBs aWNhdGVkIGJ1dCBzdGlsbCBzZWVtcyBsaWtlIGEgbG93IGJhcnJpZXIgdG8gZW50cnkgZm9yIGEg bmV3CnZlbmRvciwgYXMgd2VsbCBhcyBhIHN0YW5kYXJkIEFQSSBmb3IgZ2V0dGluZyBhbGwgdmVu ZG9yIGV4dGVuc2lvbnMgdGhhdAphcmUgYXZhaWxhYmxlIG9uIHRoZSBwbGF0Zm9ybSByZWdhcmRs ZXNzIG9mIHdoaWNoIHBsYXRmb3JtIGlzIGJlaW5nCnVzZWQuCgo+ICAqIEl0IGV4dGVuZHMgZWFz aWx5IGludG8gcGFzc2luZyBvdGhlciBmb3JtcyBvZiB2ZW5kb3IgaHdwcm9iZSBpbmZvCj4gbGF0 ZXIsIHJhdGhlciB0aGFuIHNvbHZpbmcgb25seSB0aGUgY2FzZSBvZiByaXNjLXYgZXh0ZW5zaW9u cyBub3csIGFuZAo+IHRoZW4gaGF2aW5nIHRvIGRvIHRoaXMgYWxsIGFnYWluIGZvciBlYWNoIGFk ZGl0aW9uYWwgY2F0ZWdvcnkgb2YKPiB2ZW5kb3IgZGF0YS4KClRoaXMgaXMgYSBncmVhdCBwb2lu dC4gSSBkbyBhZ3JlZSB0aGF0IGEgZGlmZmVyZW50IHNvbHV0aW9uIHdpbGwgYmUKbmVjZXNzYXJ5 IGZvciBhcmJpdHJhcnkgdmVuZG9yIGRhdGEgYW5kIEkgYW0gYWxsIGZvciBtYWtpbmcgc29tZXRo aW5nCmZ1dHVyZSBjb21wYXRpYmxlLiBBdCB0aGUgc2FtZSB0aW1lIEkgZG9uJ3Qgd2FudCB0byBn ZXQgdHJhcHBlZCBpbnRvCnNvbWV0aGluZyB0aGF0IGlzIHN1Ym9wdGltYWwgZm9yIHRoZSBzYWtl IG9mIGRvaW5nIGxlc3Mgd29yayBsYXRlci4KVGhlcmUgaXMgbm8gY2hhbmNlIG9mIGFueSBjb21w YXRpYmlsaXR5IG9uY2Ugd2UgbGVhdmUgdGhlIHJlYWxtIG9mCnJpc2N2IGV4dGVuc2lvbnMsIHNv IG9uY2UgYSB2ZW5kb3IgbmVlZHMgc29tZXRoaW5nIGV4cG9ydGVkIEkgd291bGQgYmUKaGFwcHkg dG8gd3JpdGUgdGhlIGNvZGUgdG8gc3VwcG9ydCB0aGF0LiAKCj4gICogU2ltaWxhcmx5LCBpdCBk aXNjb3VyYWdlcyBmdXR1cmUgdmVuZG9ycyBmcm9tIHRyeWluZyB0byBzcXVpbnQgYW5kCj4gZmlu ZCBhIHdheSB0byBtYWtlIGEgdmFndWVseSBnZW5lcmljIHNvdW5kaW5nIGNhdGVnb3J5IGZvciB0 aGVpciBvd24KPiBod3Byb2JlIGtleSB3aGljaCB3aWxsIHVsdGltYXRlbHkgb25seSBldmVyIGJl IGZpbGxlZCBpbiBieSB0aGVtCj4gYW55d2F5LgoKV2hhdCBkbyB5b3UgbWVhbiBieSB0aGlzPyBU aGVyZSBhcmUgbm8gImNhdGVnb3JpZXMiIGhlcmUsIHRoZSB2ZW5kb3IKanVzdCB3cml0ZXMgb3V0 IHRoZWlyIGV4dGVuc2lvbiBWRU5ET1JfRVhUX0tFWShYVkVORE9SRVhURU5TSU9OKSBhbmQgaXQK Z2V0cyBzaHV0dGxlZCB0byB1c2Vyc3BhY2Ugb24gdGhlIGh3cHJvYmUgdmVuZG9yIGNhbGwuCgot IENoYXJsaWUKCj4gCj4gLUV2YW4KCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fCmxpbnV4LXJpc2N2IG1haWxpbmcgbGlzdApsaW51eC1yaXNjdkBsaXN0cy5p bmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8v bGludXgtcmlzY3YK 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 73559C4345F for ; Fri, 12 Apr 2024 22:21:25 +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=JlqSL/Bh03WrsHiM6zgLQNiKafOarhFTxmfH6J88VzU=; b=kefe0mYBNVYt0d OqGcBjsfGiLJ+d3pF2j4eFeOGh2BVi5zzssxUzy9cAsTbAXdH2nepBtPOUJP7HKC2FT2ZXxRNRgxf LSfUYFLoZpTFrcboh9dMbcsnmvJ19oXQimVRX0jznlZdO7DNge7Rf7OyVVCqPnPv38Ki0r8fpPCTo nVWfdlVgt0fYXRiB/8EWY1m2CGGysR8U7y4giND842qXzwEoYa5Zo6Kd/VgMr5HPg1ZUToMbI6fvd NqtZLvdJHYEK3kDujz3EsmGqK7YLEYPJIGCz2DFLPN4Uh9CMjTSbHwEx6ARWk+hAhwUtOPobPJHdu A/lZFydl/KqHtzqF7hCg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1rvPGg-00000001WkM-13s1; Fri, 12 Apr 2024 22:21:10 +0000 Received: from mail-pl1-x629.google.com ([2607:f8b0:4864:20::629]) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1rvPGd-00000001WjN-0DEp for linux-arm-kernel@lists.infradead.org; Fri, 12 Apr 2024 22:21:08 +0000 Received: by mail-pl1-x629.google.com with SMTP id d9443c01a7336-1e5c11076b9so6622235ad.3 for ; Fri, 12 Apr 2024 15:21:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rivosinc-com.20230601.gappssmtp.com; s=20230601; t=1712960466; x=1713565266; 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=Qw7f13VaApE9P7VRpDrEHdpAzJF1wdaPoxbwIFLmIG4=; b=bfSZPAkj7S2ZiHzryk4ZcakIs7TlsOUKkJyxRyIEOhtLGWJA7rEaq1vh0udJ+KOsNr JEhVZUKXwR9tj6TzAyD94IouhOLLawH+a5Gwf0WNakcMSXlcynrnCkYgB+30CZCBQ/lx CVxsPwSG40vRxite4pMJ1piOJPca8C4Z0LKlzPZYlf7fY9Xb+n4taQCS9bqWoACLntJO +ocESAzPEJ3/CmPXemolrNC5dLO1NCEIUNnh46r758b96fCkDgy3TEhjLwcw4diN3XdZ fSq3IG+mYw2nZnA6VbwN1yWLT0V1tbRFlyT+YdTifNSxF5cEgvDN2LyULfv++UEcoYgv tzSw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1712960466; x=1713565266; 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=Qw7f13VaApE9P7VRpDrEHdpAzJF1wdaPoxbwIFLmIG4=; b=KzcOxYmAXV4YYNWGnVeVzD/3n55IzUq0fYaes772DaW5d5FN+JX05OAXzH3HtDh+9j 4RLiXSs7aHTsehktxYh9cQxown3l38mP3CvRE22xJ6axqschXNy54rQE9FeN2abyqhrm 3mMaEw0N4/bSPIJuEYikrT2STFnMmbcQq/PsXOXtbuRyYy7iPCjsYdA5RDL81j99J/yb ShtdMvwtj+28hvaAQBpPVgDnacP/XT/z9wBCy+rph2+YLemDYTUBodmeetaHknmktdRY p+Ym+jkW9Q9HIOFv+DrgLXKDUka3NQzIWoxL8n+g7eGguFZsBLQ4wuT4qABros1S4G9b d8gQ== X-Forwarded-Encrypted: i=1; AJvYcCWRkOsAT6oOj6OIIWdtyQKzP7fO5/noxwvLTfdyCMLgt41zWRq6xw0g0iOz/oAw51lyzChnPnjyM72WgDn8GNvLXC3+hQWIwYPqUYtaJq2tX11pZhs= X-Gm-Message-State: AOJu0Yzf9BwmInLjf2SLyt5DbYI1TidD1GYFE2/RchIgin5q0mrdBdxt No0kDD2QVLJTqYoeE5nOa2Z8urFdzkqC4GEDKEK2SojtAwHWHlq4Li0aU4Bgf1U= X-Google-Smtp-Source: AGHT+IHUI2RaMq8jaayA5FcthPXUJDbqZ0+AxzpHu6ba0uA91gdIC4L0mbVqNIRm0limEGVhmp0sjg== X-Received: by 2002:a17:903:2609:b0:1e2:ca65:68c2 with SMTP id jd9-20020a170903260900b001e2ca6568c2mr3674124plb.51.1712960465476; Fri, 12 Apr 2024 15:21:05 -0700 (PDT) Received: from ghost ([50.145.13.30]) by smtp.gmail.com with ESMTPSA id b7-20020a170902650700b001e245c5afbfsm3554986plk.155.2024.04.12.15.21.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 12 Apr 2024 15:21:05 -0700 (PDT) Date: Fri, 12 Apr 2024 15:21:02 -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 16/19] riscv: hwprobe: Add vendor extension probing Message-ID: References: <20240411-dev-charlie-support_thead_vector_6_9-v1-0-4af9815ec746@rivosinc.com> <20240411-dev-charlie-support_thead_vector_6_9-v1-16-4af9815ec746@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-20240412_152107_137620_ECFF5AFD X-CRM114-Status: GOOD ( 65.51 ) 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 T24gRnJpLCBBcHIgMTIsIDIwMjQgYXQgMDI6NDM6MDFQTSAtMDcwMCwgRXZhbiBHcmVlbiB3cm90 ZToKPiBPbiBGcmksIEFwciAxMiwgMjAyNCBhdCAxOjIw4oCvUE0gQ2hhcmxpZSBKZW5raW5zIDxj aGFybGllQHJpdm9zaW5jLmNvbT4gd3JvdGU6Cj4gPgo+ID4gT24gRnJpLCBBcHIgMTIsIDIwMjQg YXQgMTI6MDc6NDZQTSAtMDcwMCwgRXZhbiBHcmVlbiB3cm90ZToKPiA+ID4gT24gRnJpLCBBcHIg MTIsIDIwMjQgYXQgMTE6MTfigK9BTSBDaGFybGllIEplbmtpbnMgPGNoYXJsaWVAcml2b3NpbmMu Y29tPiB3cm90ZToKPiA+ID4gPgo+ID4gPiA+IE9uIEZyaSwgQXByIDEyLCAyMDI0IGF0IDEwOjA1 OjIxQU0gLTA3MDAsIEV2YW4gR3JlZW4gd3JvdGU6Cj4gPiA+ID4gPiBPbiBUaHUsIEFwciAxMSwg MjAyNCBhdCA5OjEy4oCvUE0gQ2hhcmxpZSBKZW5raW5zIDxjaGFybGllQHJpdm9zaW5jLmNvbT4g d3JvdGU6Cj4gPiA+ID4gPiA+Cj4gPiA+ID4gPiA+IEFkZCBhIG5ldyBod3Byb2JlIGtleSAiUklT Q1ZfSFdQUk9CRV9LRVlfVkVORE9SX0VYVF8wIiB3aGljaCBhbGxvd3MKPiA+ID4gPiA+ID4gdXNl cnNwYWNlIHRvIHByb2JlIGZvciB0aGUgbmV3IFJJU0NWX0lTQV9WRU5ET1JfRVhUX1hUSEVBRFZF Q1RPUiB2ZW5kb3IKPiA+ID4gPiA+ID4gZXh0ZW5zaW9uLgo+ID4gPiA+ID4gPgo+ID4gPiA+ID4g PiBTaWduZWQtb2ZmLWJ5OiBDaGFybGllIEplbmtpbnMgPGNoYXJsaWVAcml2b3NpbmMuY29tPgo+ ID4gPiA+ID4gPiAtLS0KPiA+ID4gPiA+ID4gIGFyY2gvcmlzY3YvaW5jbHVkZS9hc20vaHdwcm9i ZS5oICAgICAgfCAgNCArLS0KPiA+ID4gPiA+ID4gIGFyY2gvcmlzY3YvaW5jbHVkZS91YXBpL2Fz bS9od3Byb2JlLmggfCAxMCArKysrKy0KPiA+ID4gPiA+ID4gIGFyY2gvcmlzY3Yva2VybmVsL3N5 c19od3Byb2JlLmMgICAgICAgfCA1OSArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyst LQo+ID4gPiA+ID4gPiAgMyBmaWxlcyBjaGFuZ2VkLCA2OCBpbnNlcnRpb25zKCspLCA1IGRlbGV0 aW9ucygtKQo+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiBkaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9p bmNsdWRlL2FzbS9od3Byb2JlLmggYi9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL2h3cHJvYmUuaAo+ ID4gPiA+ID4gPiBpbmRleCA2MzA1MDdkZmY1ZWEuLmU2ODQ5NmI0ZjhkZSAxMDA2NDQKPiA+ID4g PiA+ID4gLS0tIGEvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9od3Byb2JlLmgKPiA+ID4gPiA+ID4g KysrIGIvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9od3Byb2JlLmgKPiA+ID4gPiA+ID4gQEAgLTEs NiArMSw2IEBACj4gPiA+ID4gPiA+ICAvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIu MCBXSVRIIExpbnV4LXN5c2NhbGwtbm90ZSAqLwo+ID4gPiA+ID4gPiAgLyoKPiA+ID4gPiA+ID4g LSAqIENvcHlyaWdodCAyMDIzIFJpdm9zLCBJbmMKPiA+ID4gPiA+ID4gKyAqIENvcHlyaWdodCAy MDIzLTIwMjQgUml2b3MsIEluYwo+ID4gPiA+ID4gPiAgICovCj4gPiA+ID4gPiA+Cj4gPiA+ID4g PiA+ICAjaWZuZGVmIF9BU01fSFdQUk9CRV9ICj4gPiA+ID4gPiA+IEBAIC04LDcgKzgsNyBAQAo+ ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiAgI2luY2x1ZGUgPHVhcGkvYXNtL2h3cHJvYmUuaD4KPiA+ ID4gPiA+ID4KPiA+ID4gPiA+ID4gLSNkZWZpbmUgUklTQ1ZfSFdQUk9CRV9NQVhfS0VZIDYKPiA+ ID4gPiA+ID4gKyNkZWZpbmUgUklTQ1ZfSFdQUk9CRV9NQVhfS0VZIDcKPiA+ID4gPiA+ID4KPiA+ ID4gPiA+ID4gIHN0YXRpYyBpbmxpbmUgYm9vbCByaXNjdl9od3Byb2JlX2tleV9pc192YWxpZChf X3M2NCBrZXkpCj4gPiA+ID4gPiA+ICB7Cj4gPiA+ID4gPiA+IGRpZmYgLS1naXQgYS9hcmNoL3Jp c2N2L2luY2x1ZGUvdWFwaS9hc20vaHdwcm9iZS5oIGIvYXJjaC9yaXNjdi9pbmNsdWRlL3VhcGkv YXNtL2h3cHJvYmUuaAo+ID4gPiA+ID4gPiBpbmRleCA5ZjJhOGUzZmYyMDQuLjY2MTRkM2FkZmM3 NSAxMDA2NDQKPiA+ID4gPiA+ID4gLS0tIGEvYXJjaC9yaXNjdi9pbmNsdWRlL3VhcGkvYXNtL2h3 cHJvYmUuaAo+ID4gPiA+ID4gPiArKysgYi9hcmNoL3Jpc2N2L2luY2x1ZGUvdWFwaS9hc20vaHdw cm9iZS5oCj4gPiA+ID4gPiA+IEBAIC0xLDYgKzEsNiBAQAo+ID4gPiA+ID4gPiAgLyogU1BEWC1M aWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgV0lUSCBMaW51eC1zeXNjYWxsLW5vdGUgKi8KPiA+ ID4gPiA+ID4gIC8qCj4gPiA+ID4gPiA+IC0gKiBDb3B5cmlnaHQgMjAyMyBSaXZvcywgSW5jCj4g PiA+ID4gPiA+ICsgKiBDb3B5cmlnaHQgMjAyMy0yMDI0IFJpdm9zLCBJbmMKPiA+ID4gPiA+ID4g ICAqLwo+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiAgI2lmbmRlZiBfVUFQSV9BU01fSFdQUk9CRV9I Cj4gPiA+ID4gPiA+IEBAIC02Nyw2ICs2NywxNCBAQCBzdHJ1Y3QgcmlzY3ZfaHdwcm9iZSB7Cj4g PiA+ID4gPiA+ICAjZGVmaW5lICAgICAgICAgICAgICAgIFJJU0NWX0hXUFJPQkVfTUlTQUxJR05F RF9VTlNVUFBPUlRFRCAgICAoNCA8PCAwKQo+ID4gPiA+ID4gPiAgI2RlZmluZSAgICAgICAgICAg ICAgICBSSVNDVl9IV1BST0JFX01JU0FMSUdORURfTUFTSyAgICAgICAgICAgKDcgPDwgMCkKPiA+ ID4gPiA+ID4gICNkZWZpbmUgUklTQ1ZfSFdQUk9CRV9LRVlfWklDQk9aX0JMT0NLX1NJWkUgICAg Ngo+ID4gPiA+ID4gPiArLyoKPiA+ID4gPiA+ID4gKyAqIEl0IGlzIG5vdCBwb3NzaWJsZSBmb3Ig b25lIENQVSB0byBoYXZlIG11bHRpcGxlIHZlbmRvciBpZHMsIHNvIGVhY2ggdmVuZG9yCj4gPiA+ ID4gPiA+ICsgKiBoYXMgaXRzIG93biB2ZW5kb3IgZXh0ZW5zaW9uICJuYW1lc3BhY2UiLiBUaGUg a2V5cyBmb3IgZWFjaCB2ZW5kb3Igc3RhcnRzCj4gPiA+ID4gPiA+ICsgKiBhdCB6ZXJvLgo+ID4g PiA+ID4gPiArICovCj4gPiA+ID4gPiA+ICsjZGVmaW5lIFJJU0NWX0hXUFJPQkVfS0VZX1ZFTkRP Ul9FWFRfMCA3Cj4gPiA+ID4gPiA+ICsgLyogVC1IZWFkICovCj4gPiA+ID4gPiA+ICsjZGVmaW5l ICAgICAgICAgICAgICAgIFJJU0NWX0hXUFJPQkVfVkVORE9SX0VYVF9YVEhFQURWRUNUT1IgICAo MSA8PCAwKQo+ID4gPiA+ID4gPiAgLyogSW5jcmVhc2UgUklTQ1ZfSFdQUk9CRV9NQVhfS0VZIHdo ZW4gYWRkaW5nIGl0ZW1zLiAqLwo+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiAgLyogRmxhZ3MgKi8K PiA+ID4gPiA+ID4gZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3Yva2VybmVsL3N5c19od3Byb2JlLmMg Yi9hcmNoL3Jpc2N2L2tlcm5lbC9zeXNfaHdwcm9iZS5jCj4gPiA+ID4gPiA+IGluZGV4IGUwYTQy Yzg1MTUxMS4uMzY1Y2U3MzgwNDQzIDEwMDY0NAo+ID4gPiA+ID4gPiAtLS0gYS9hcmNoL3Jpc2N2 L2tlcm5lbC9zeXNfaHdwcm9iZS5jCj4gPiA+ID4gPiA+ICsrKyBiL2FyY2gvcmlzY3Yva2VybmVs L3N5c19od3Byb2JlLmMKPiA+ID4gPiA+ID4gQEAgLTY5LDcgKzY5LDggQEAgc3RhdGljIHZvaWQg aHdwcm9iZV9pc2FfZXh0MChzdHJ1Y3QgcmlzY3ZfaHdwcm9iZSAqcGFpciwKPiA+ID4gPiA+ID4g ICAgICAgICBpZiAocmlzY3ZfaXNhX2V4dGVuc2lvbl9hdmFpbGFibGUoTlVMTCwgYykpCj4gPiA+ ID4gPiA+ICAgICAgICAgICAgICAgICBwYWlyLT52YWx1ZSB8PSBSSVNDVl9IV1BST0JFX0lNQV9D Owo+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiAtICAgICAgIGlmIChoYXNfdmVjdG9yKCkgJiYgIXJp c2N2X2hhc192ZW5kb3JfZXh0ZW5zaW9uX3VubGlrZWx5KFJJU0NWX0lTQV9WRU5ET1JfRVhUX1hU SEVBRFZFQ1RPUikpCj4gPiA+ID4gPiA+ICsgICAgICAgaWYgKGhhc192ZWN0b3IoKSAmJgo+ID4g PiA+ID4gPiArICAgICAgICAgICAhX19yaXNjdl9pc2FfdmVuZG9yX2V4dGVuc2lvbl9hdmFpbGFi bGUoTlVMTCwgUklTQ1ZfSVNBX1ZFTkRPUl9FWFRfWFRIRUFEVkVDVE9SKSkKPiA+ID4gPiA+ID4g ICAgICAgICAgICAgICAgIHBhaXItPnZhbHVlIHw9IFJJU0NWX0hXUFJPQkVfSU1BX1Y7Cj4gPiA+ ID4gPiA+Cj4gPiA+ID4gPiA+ICAgICAgICAgLyoKPiA+ID4gPiA+ID4gQEAgLTExMiw3ICsxMTMs OCBAQCBzdGF0aWMgdm9pZCBod3Byb2JlX2lzYV9leHQwKHN0cnVjdCByaXNjdl9od3Byb2JlICpw YWlyLAo+ID4gPiA+ID4gPiAgICAgICAgICAgICAgICAgRVhUX0tFWShaQUNBUyk7Cj4gPiA+ID4g PiA+ICAgICAgICAgICAgICAgICBFWFRfS0VZKFpJQ09ORCk7Cj4gPiA+ID4gPiA+Cj4gPiA+ID4g PiA+IC0gICAgICAgICAgICAgICBpZiAoaGFzX3ZlY3RvcigpICYmICFyaXNjdl9oYXNfdmVuZG9y X2V4dGVuc2lvbl91bmxpa2VseShSSVNDVl9JU0FfVkVORE9SX0VYVF9YVEhFQURWRUNUT1IpKSB7 Cj4gPiA+ID4gPiA+ICsgICAgICAgICAgICAgICBpZiAoaGFzX3ZlY3RvcigpICYmCj4gPiA+ID4g PiA+ICsgICAgICAgICAgICAgICAgICAgIXJpc2N2X2hhc192ZW5kb3JfZXh0ZW5zaW9uX3VubGlr ZWx5KFJJU0NWX0lTQV9WRU5ET1JfRVhUX1hUSEVBRFZFQ1RPUikpIHsKPiA+ID4gPiA+ID4gICAg ICAgICAgICAgICAgICAgICAgICAgRVhUX0tFWShaVkJCKTsKPiA+ID4gPiA+ID4gICAgICAgICAg ICAgICAgICAgICAgICAgRVhUX0tFWShaVkJDKTsKPiA+ID4gPiA+ID4gICAgICAgICAgICAgICAg ICAgICAgICAgRVhUX0tFWShaVktCKTsKPiA+ID4gPiA+ID4gQEAgLTEzOSw2ICsxNDEsNTUgQEAg c3RhdGljIHZvaWQgaHdwcm9iZV9pc2FfZXh0MChzdHJ1Y3QgcmlzY3ZfaHdwcm9iZSAqcGFpciwK PiA+ID4gPiA+ID4gICAgICAgICBwYWlyLT52YWx1ZSAmPSB+bWlzc2luZzsKPiA+ID4gPiA+ID4g IH0KPiA+ID4gPiA+ID4KPiA+ID4gPiA+ID4gK3N0YXRpYyB2b2lkIGh3cHJvYmVfaXNhX3ZlbmRv cl9leHQwKHN0cnVjdCByaXNjdl9od3Byb2JlICpwYWlyLAo+ID4gPiA+ID4gPiArICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqY3B1cykKPiA+ ID4gPiA+ID4gK3sKPiA+ID4gPiA+ID4gKyAgICAgICBpbnQgY3B1Owo+ID4gPiA+ID4gPiArICAg ICAgIHU2NCBtaXNzaW5nID0gMDsKPiA+ID4gPiA+ID4gKwo+ID4gPiA+ID4gPiArICAgICAgIHBh aXItPnZhbHVlID0gMDsKPiA+ID4gPiA+ID4gKwo+ID4gPiA+ID4gPiArICAgICAgIHN0cnVjdCBy aXNjdl9od3Byb2JlIG12ZW5kb3JpZCA9IHsKPiA+ID4gPiA+ID4gKyAgICAgICAgICAgICAgIC5r ZXkgPSBSSVNDVl9IV1BST0JFX0tFWV9NVkVORE9SSUQsCj4gPiA+ID4gPiA+ICsgICAgICAgICAg ICAgICAudmFsdWUgPSAwCj4gPiA+ID4gPiA+ICsgICAgICAgfTsKPiA+ID4gPiA+ID4gKwo+ID4g PiA+ID4gPiArICAgICAgIGh3cHJvYmVfYXJjaF9pZCgmbXZlbmRvcmlkLCBjcHVzKTsKPiA+ID4g PiA+ID4gKwo+ID4gPiA+ID4gPiArICAgICAgIC8qIFNldCB2YWx1ZSB0byB6ZXJvIGlmIENQVXMg aW4gdGhlIHNldCBkbyBub3QgaGF2ZSB0aGUgc2FtZSB2ZW5kb3IuICovCj4gPiA+ID4gPiA+ICsg ICAgICAgaWYgKG12ZW5kb3JpZC52YWx1ZSA9PSAtMVVMTCkKPiA+ID4gPiA+ID4gKyAgICAgICAg ICAgICAgIHJldHVybjsKPiA+ID4gPiA+ID4gKwo+ID4gPiA+ID4gPiArICAgICAgIC8qCj4gPiA+ ID4gPiA+ICsgICAgICAgICogTG9vcCB0aHJvdWdoIGFuZCByZWNvcmQgdmVuZG9yIGV4dGVuc2lv bnMgdGhhdCAxKSBhbnlvbmUgaGFzLCBhbmQKPiA+ID4gPiA+ID4gKyAgICAgICAgKiAyKSBhbnlv bmUgZG9lc24ndCBoYXZlLgo+ID4gPiA+ID4gPiArICAgICAgICAqLwo+ID4gPiA+ID4gPiArICAg ICAgIGZvcl9lYWNoX2NwdShjcHUsIGNwdXMpIHsKPiA+ID4gPiA+ID4gKyAgICAgICAgICAgICAg IHN0cnVjdCByaXNjdl9pc2FpbmZvICppc2F2ZW5kb3JpbmZvID0gJmhhcnRfaXNhX3ZlbmRvcltj cHVdOwo+ID4gPiA+ID4gPiArCj4gPiA+ID4gPiA+ICsjZGVmaW5lIFZFTkRPUl9FWFRfS0VZKGV4 dCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBcCj4gPiA+ID4gPiA+ICsgICAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCj4gPiA+ ID4gPiA+ICsgICAgICAgICAgICAgICBpZiAoX19yaXNjdl9pc2FfdmVuZG9yX2V4dGVuc2lvbl9h dmFpbGFibGUoaXNhdmVuZG9yaW5mby0+aXNhLCAgICAgICAgICBcCj4gPiA+ID4gPiA+ICsgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJJU0NW X0lTQV9WRU5ET1JfRVhUXyMjZXh0KSkgICBcCj4gPiA+ID4gPiA+ICsgICAgICAgICAgICAgICAg ICAgICAgIHBhaXItPnZhbHVlIHw9IFJJU0NWX0hXUFJPQkVfVkVORE9SX0VYVF8jI2V4dDsgICAg ICAgICAgICAgICAgICBcCj4gPiA+ID4gPiA+ICsgICAgICAgICAgICAgICBlbHNlICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBcCj4gPiA+ID4gPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIG1pc3NpbmcgfD0gUklTQ1Zf SFdQUk9CRV9WRU5ET1JfRVhUXyMjZXh0OyAgICAgICAgICAgICAgICAgICAgICBcCj4gPiA+ID4g PiA+ICsgICAgICAgfSB3aGlsZSAoZmFsc2UpCj4gPiA+ID4gPiA+ICsKPiA+ID4gPiA+ID4gKyAg ICAgICAvKgo+ID4gPiA+ID4gPiArICAgICAgICAqIE9ubHkgdXNlIFZFTkRPUl9FWFRfS0VZKCkg Zm9yIGV4dGVuc2lvbnMgd2hpY2ggY2FuIGJlIGV4cG9zZWQgdG8gdXNlcnNwYWNlLAo+ID4gPiA+ ID4gPiArICAgICAgICAqIHJlZ2FyZGxlc3Mgb2YgdGhlIGtlcm5lbCdzIGNvbmZpZ3VyYXRpb24s IGFzIG5vIG90aGVyIGNoZWNrcywgYmVzaWRlcwo+ID4gPiA+ID4gPiArICAgICAgICAqIHByZXNl bmNlIGluIHRoZSBoYXJ0X3ZlbmRvcl9pc2EgYml0bWFwLCBhcmUgbWFkZS4KPiA+ID4gPiA+ID4g KyAgICAgICAgKi8KPiA+ID4gPiA+ID4gKyAgICAgICBWRU5ET1JfRVhUX0tFWShYVEhFQURWRUNU T1IpOwo+ID4gPiA+ID4gPiArCj4gPiA+ID4gPiA+ICsjdW5kZWYgVkVORE9SX0VYVF9LRVkKPiA+ ID4gPiA+Cj4gPiA+ID4gPiBIZXkgQ2hhcmxpZSwKPiA+ID4gPiA+IFRoYW5rcyBmb3Igd3JpdGlu ZyB0aGlzIHVwISBBdCB0aGUgdmVyeSBsZWFzdCBJIHRoaW5rIHRoZQo+ID4gPiA+ID4gVEhFQUQt c3BlY2lmaWMgc3R1ZmYgc2hvdWxkIHByb2JhYmx5IGVuZCB1cCBpbiBpdHMgb3duIGZpbGUsIG90 aGVyd2lzZQo+ID4gPiA+ID4gaXQnbGwgZ2V0IGNoYW90aWMgd2l0aCB2ZW5kb3JzIGNsYW1vcmlu ZyB0byBhZGQgc3R1ZmYgcmlnaHQgaGVyZS4KPiA+ID4gPgo+ID4gPiA+IEdyZWF0IGlkZWEhCj4g PiA+ID4KPiA+ID4gPiA+IFdoYXQgZG8geW91IHRoaW5rIGFib3V0IHRoaXMgYXBwcm9hY2g6Cj4g PiA+ID4gPiAgKiBXZSBsZWF2ZSBSSVNDVl9IV1BST0JFX01BWF9LRVkgYXMgdGhlIG1heCBrZXkg Zm9yIHRoZSAiZ2VuZXJpYwo+ID4gPiA+ID4gd29ybGQiLCBlZyA2LWlzaAo+ID4gPiA+ID4gICog V2UgZGVmaW5lIHRoYXQgYW55IGtleSBhYm92ZSAweDgwMDAwMDAwMDAwMDAwMDAgaXMgaW4gdGhl IHZlbmRvcgo+ID4gPiA+ID4gc3BhY2UsIHNvIHRoZSBtZWFuaW5nIG9mIHRoZSBrZXlzIGRlcGVu ZHMgZmlyc3Qgb24gdGhlIG12ZW5kb3JpZAo+ID4gPiA+ID4gdmFsdWUuCj4gPiA+ID4gPiAgKiBJ biB0aGUga2VybmVsIGNvZGUsIGVhY2ggbmV3IHZlbmRvciBhZGRzIG9uIHRvIGEgZ2xvYmFsIHN0 cnVjdCwKPiA+ID4gPiA+IHdoaWNoIG1pZ2h0IGxvb2sgc29tZXRoaW5nIGxpa2U6Cj4gPiA+ID4g PiBzdHJ1Y3QgaHdwcm9iZV92ZW5kb3Jfc3BhY2UgdmVuZG9yX3NwYWNlW10gPSB7Cj4gPiA+ID4g PiAgICAgICAgIHsKPiA+ID4gPiA+ICAgICAgICAgICAgICAgICAubXZlbmRvcmlkID0gVkVORE9S X1RIRUFELAo+ID4gPiA+ID4gICAgICAgICAgICAgICAgIC5tYXhfaHdwcm9iZV9rZXkgPSBUSEVB RF9NQVhfSFdQUk9CRV9LRVksIC8vIGN1cnJlbnRseQo+ID4gPiA+ID4gMSBvciAweDgwMDAwMDAw MDAwMDAwMDEgd2l0aCB3aGF0IHlvdSd2ZSBnb3QuCj4gPiA+ID4gPiAgICAgICAgICAgICAgICAg Lmh3cHJvYmVfZm4gPSB0aGVhZF9od3Byb2JlCj4gPiA+ID4gPiAgICAgICAgIH0sCj4gPiA+ID4g PiAgICAgICAgIC4uLgo+ID4gPiA+ID4gfTsKPiA+ID4gPiA+Cj4gPiA+ID4gPiAgKiBBIGh3cHJv YmVfdGhlYWQuYyBpbXBsZW1lbnRzIHRoZWFkX2h3cHJvYmUoKSwgYW5kIGlzIGNhbGxlZAo+ID4g PiA+ID4gd2hlbmV2ZXIgdGhlIGdlbmVyaWMgaHdwcm9iZSBlbmNvdW50ZXJzIGEga2V5ID49MHg4 MDAwMDAwMDAwMDAwMDAwLgo+ID4gPiA+ID4gICogR2VuZXJpYyBjb2RlIGZvciBzZXR0aW5nIHVw IHRoZSBWRFNPIGNhbiB0aGVuIHN0aWxsIGNhbGwgdGhlCj4gPiA+ID4gPiB2ZW5kb3Itc3BlY2lm aWMgaHdwcm9iZV9mbigpIHJlcGVhdGVkbHkgd2l0aCBhbiAiYWxsIENQVXMiIG1hc2sgZnJvbQo+ ID4gPiA+ID4gdGhlIGJhc2UgdG8gbWF4X2h3cHJvYmVfa2V5IGFuZCBzZXQgdXAgdGhlIGNhY2hl ZCB0YWJsZXMgaW4gdXNlcnNwYWNlLgo+ID4gPiA+ID4gICogU2luY2UgdGhlIFZEU08gZGF0YSBo YXMgbGltaXRlZCBzcGFjZSB3ZSBtYXkgaGF2ZSB0byBjYXAgdGhlIG51bWJlcgo+ID4gPiA+ID4g b2YgdmVuZG9yIGtleXMgd2UgY2FjaGUgdG8gYmUgbG93ZXIgdGhhbiBtYXhfaHdwcm9iZV9rZXku IFNpbmNlIHRoZQo+ID4gPiA+ID4gZGF0YSBpdHNlbGYgaXMgbm90IGV4cG9zZWQgdG8gdXNlcm1v ZGUgd2UgY2FuIHJhaXNlIHRoaXMgY2FwIGxhdGVyIGlmCj4gPiA+ID4gPiBuZWVkZWQuCj4gPiA+ ID4KPiA+ID4gPiBJIGtub3cgdmVuZG9yIGV4dGVuc2lvbnMgYXJlIGtpbmQgb2YgdGhlICJ3aWxk IHdlc3QiIG9mIHJpc2N2LCBidXQgaW4KPiA+ID4gPiBzcGl0ZSBvZiB0aGF0IEkgd2FudCB0byBk ZXNpZ24gYSBjb25zaXN0ZW50IEFQSS4gVGhlIGlzc3VlIEkgaGFkIHdpdGgKPiA+ID4gPiBoYXZp bmcgdGhpcyAidmVuZG9yIHNwYWNlIiBmb3IgZXhwb3NpbmcgdmVuZG9yIGV4dGVuc2lvbnMgd2Fz IHRoYXQgdGhpcwo+ID4gPiA+IGlzIHNvbWV0aGluZyB0aGF0IGlzIGluaGVyZW50bHkgdGhlIHNh bWUgZm9yIGFsbCB2ZW5kb3JzLiBJIHNlZSBhIHZlbmRvcgo+ID4gPiA+IHNwYWNlIGxpa2UgdGhp cyBtb3JlIGFwcGxpY2FibGUgZm9yIHNvbWV0aGluZyBsaWtlCj4gPiA+ID4gIlJJU0NWX0hXUFJP QkVfS0VZX1pJQ0JPWl9CTE9DS19TSVpFIiB3aGVyZSBhIHZlbmRvciBoYXMgYSBzcGVjaWZpYwo+ ID4gPiA+IHZhbHVlIHRoZXkgd291bGQgbGlrZSB0byBleHBvc2UuIEkgZG8gYWdyZWUgdGhhdCBo YXZpbmcgYSB2ZW5kb3Igc3BhY2UKPiA+ID4gPiBpcyBhIGdvb2QgZGVzaWduIGNob2ljZSwgYnV0 IEkgYW0gbm90IGNvbnZpbmNlZCB0aGF0IHZlbmRvciBleHRlbnNpb25zCj4gPiA+ID4gYXJlIHRo ZSBwcm9wZXIgdXNlLWNhc2UuCj4gPiA+ID4KPiA+ID4gPiBCeSBoYXZpbmcgUklTQ1ZfSFdQUk9C RV9LRVlfVkVORE9SX0VYVF8wIHdlIGNhbiBleHBvc2UgdGhlIHZlbmRvcgo+ID4gPiA+IGV4dGVu c2lvbnMgaW4gdGhlIHNhbWUgd2F5IHRoYXQgc3RhbmRhcmQgZXh0ZW5zaW9ucyBhcmUgZXhwb3Nl ZCwgd2l0aCBhCj4gPiA+ID4gYml0bWFzayByZXByZXNlbnRpbmcgZWFjaCBleHRlbnNpb24uIElm IHRoZXNlIGFyZSBpbnN0ZWFkIGluIHRoZSB2ZW5kb3IKPiA+ID4gPiBzcGFjZSwgZWFjaCB2ZW5k b3Igd291bGQgcHJvYmFibHkgYmUgaW5jbGluZWQgdG8gaW50cm9kdWNlIGEga2V5IGxpa2UKPiA+ ID4gPiBSSVNDVl9IV1BST0JFX0tFWV9USEVBRF9FWFRfMCB0aGF0IHJldHVybnMgYSBiaXRtYXNr IG9mIGFsbCBvZiB0aGUgdGhlYWQKPiA+ID4gPiB2ZW5kb3IgZXh0ZW5zaW9ucy4gVGhpcyBkdXBs aWNhdGVkIGVmZm9ydCBpcyB3aGF0IEkgYW0gdHJ5aW5nIHRvIGF2b2lkLgo+ID4gPiA+IFRoZSBh bHRlcm5hdGl2ZSB3b3VsZCBiZSB0aGF0IHZlbmRvcnMgaGF2ZSBhIHNlcGFyYXRlIGtleSBmb3Ig ZWFjaAo+ID4gPiA+IHZlbmRvciBleHRlbnNpb24gdGhleSB3b3VsZCBsaWtlIHRvIGV4cG9zZSwg YnV0IHRoYXQgaXMgc3RyaWN0bHkgbGVzcwo+ID4gPiA+IGVmZmljaWVudCB0aGFuIHRoZSBleGlz dGluZyBiaXRtYXNrIHByb2JpbmcuCj4gPiA+ID4KPiA+ID4gPiBEbyB5b3UgdGhpbmsgdGhhdCBo YXZpbmcgdGhlIHZlbmRvciBzcGFjZSBpcyBhcHByb3ByaWF0ZSBmb3IgdmVuZG9yCj4gPiA+ID4g ZXh0ZW5zaW9ucyBnaXZlbiBteSBjb25jZXJucz8KPiA+ID4KPiA+ID4gSSBkbyBzZWUgd2hhdCB5 b3UncmUgZ29pbmcgZm9yLiBJdCdzIHRpZHkgZm9yIGEgYml0bWFzayB0byBqdXN0IGxldAo+ID4g PiBhbnlvbmUgYWxsb2NhdGUgdGhlIG5leHQgYml0LCBidXQgbGVhdmVzIHlvdSB3aXRoIHRoZSBz YW1lIHByb2JsZW0KPiA+ID4gd2hlbiBhIHZlbmRvciBkZWNpZGVzIHRoZXkgd2FudCB0byBleHBv c2UgYW4gZW51bSwgb3IgZGVjaWRlcyB0aGV5Cj4gPiA+IHdhbnQgdG8gZXhwb3NlIGEgYmF6aWxs aW9uIHRoaW5ncy4gSSB0aGluayBhIGdlbmVyYWxpemVkIHZlcnNpb24gb2YKPiA+Cj4gPiBUaGlz IHBhdGNoIGlzIHN0cmljdGx5IHRvIGV4cG9zZSBpZiBhIHZlbmRvciBleHRlbnNpb24gaXMgc3Vw cG9ydGVkLAo+ID4gaG93IGRvZXMgZXhwb3NpbmcgZW51bXMgZmFjdG9yIGluIGhlcmU/Cj4gPgo+ ID4gPiB0aGUgYXBwcm9hY2ggeW91J3ZlIHdyaXR0ZW4gd291bGQgYmU6IHNpbXBseSBsZXQgdmVu ZG9ycyBhbGxvY2F0ZSBrZXlzCj4gPiA+IGZyb20gdGhlIHNhbWUgZ2xvYmFsIHNwYWNlIHdlJ3Jl IGFscmVhZHkgdXNpbmcuIE15IHdvcnJ5IHdhcyB0aGF0IGl0Cj4gPgo+ID4gSSBhbSBtaXNzaW5n IGhvdyBteSBwcm9wb3NhbCBzdWdnZXN0cyBhbGxvd2luZyB2ZW5kb3JzIHRvIGFsbG9jYXRlIGtl eXMKPiA+IGluIGEgZ2xvYmFsIHNwYWNlLgo+ID4KPiA+ID4gd291bGQgdHVybiBpbnRvIGFuIGV4 cGFuc2l2ZSBzdWJ1cmJhbiBzcHJhd2wgb2YgbW9zdGx5IGRlYWQgYml0cywgb3IKPiA+ID4gaW4g dGhlIGNhc2Ugb2YgdmVuZG9yLXNwZWNpZmljIGtleXMsIGZ1bGwgb2YgImlmIChtdmVuZG9yX2lk KCkgIT0KPiA+ID4gTUlORSkgcmV0dXJuIDA7Ii4gTXkgaG9wZSB3aXRoIHRoZSB2ZW5kb3JlZCBr ZXlzcGFjZSBpcyBpdCB3b3VsZCBrZWVwCj4gPgo+ID4gQW4gYXBwbGljYXRpb24gd2lsbCBhbHdh eXMgbmVlZCB0byBjaGVjayB2ZW5kb3JpZCBiZWZvcmUgY2FsbGluZyBod3Byb2JlCj4gPiB3aXRo IGEgdmVuZG9yLXNwZWNpZmljIGZlYXR1cmU/IElmIHRoYXQgaHdwcm9iZSBzdXBwb3J0IGlzIGEg a2V5IGFib3ZlCj4gPiAxPDw2MywgdGhlbiB0aGUgYXBwbGljYXRpb24gd2lsbCBuZWVkIHRvIHBh c3MgdGhhdCB2ZW5kb3Itc3BlY2lmaWMga2V5Cj4gPiBhbmQgaW50ZXJwcmV0IHRoZSB2ZW5kb3It c3BlY2lmaWMgdmFsdWUuIElmIHRoYXQgaHdwcm9iZSBzdXBwb3J0IGlzIHdoYXQKPiA+IEkgaGF2 ZSBwcm9wb3NlZCBoZXJlLCB0aGVuIHRoZSB1c2VyIGNhbGxzIHRoZSBzdGFuZGFyZGl6ZWQgdmVu ZG9yCj4gPiBleHRlbnNpb24gaHdwcm9iZSBlbmRwb2ludCBhbmQgdGhlbiBuZWVkcyB0byBpbnRl cnByZXQgdGhlIHJlc3VsdCBiYXNlZAo+ID4gb24gdGhlIHZlbmRvciBvZiB0aGUgY3B1bWFzay4g SW4gYm90aCBjYXNlcyB0aGV5IG5lZWQgdG8gY2hlY2sgdGhlCj4gPiB2ZW5kb3JpZCBvZiB0aGUg Y3B1bWFzay4gSW4gdGhlIHRlc3QgY2FzZSBJIGFkZGVkIEkgZmFpbGVkIHRvIGNoZWNrIHRoZQo+ ID4gdmVuZG9yaWQgYnV0IEkgc2hvdWxkIGhhdmUgaGFkIHRoYXQuCj4gPgo+ID4gPiB0aGUgc3By YXdsIGZyb20gcG9sbHV0aW5nIHRoZSBnZW5lcmFsIGFycmF5IG9mIChob3BlZnVsbHkgdmFsdWFi bGUpCj4gPiA+IGluZm8gd2l0aCBzdHVmZiB0aGF0J3MgbGlrZWx5IHRvIGJlY29tZSBsZXNzIHJl bGV2YW50IGFzIHRpbWUgcGFzc2VzLgo+ID4gPiBJdCBhbHNvIGxvd2VycyB0aGUgYmFyIGEgYml0 IHRvIG1ha2UgaXQgZWFzaWVyIGZvciB2ZW5kb3JzIHRvIGV4cG9zZQo+ID4gPiBiaXRzLCBhcyB0 aGV5IGRvbid0IGNvbnN1bWUgZ2xvYmFsIHNwYWNlIGZvciBldmVyeW9uZSBmb3IgYWxsIG9mIHRp bWUsCj4gPiA+IGp1c3QgdGhlbXNlbHZlcy4KPiA+Cj4gPiBUaGUgdmVuZG9yIGtleXMgYXJlIHRp ZWQgZGlyZWN0bHkgdG8gdGhlIHZlbmRvci4gU28gYXMgaXQgZ3Jvd3Mgd2Ugd291bGQKPiA+IGhh dmUgc29tZXRoaW5nIGxpa2U6Cj4gPgo+ID4gI2RlZmluZSBSSVNDVl9IV1BST0JFX0tFWV9WRU5E T1JfRVhUXzAgIDcKPiA+IC8qIFQtSGVhZCAqLwo+ID4gI2RlZmluZSAgICAgICAgIFJJU0NWX0hX UFJPQkVfVkVORE9SX0VYVF9YVEhFQURWRUNUT1IgICAoMSA8PCAwKQo+ID4gI2RlZmluZSAgICAg ICAgIFJJU0NWX0hXUFJPQkVfVkVORE9SX0VYVF9YVEhFQUQyICAgICAgICAoMiA8PCAwKQo+ID4g I2RlZmluZSAgICAgICAgIFJJU0NWX0hXUFJPQkVfVkVORE9SX0VYVF9YVEhFQUQzICAgICAgICAo MyA8PCAwKQo+ID4gLyogVmVuZG9yIDIgKi8KPiA+ICNkZWZpbmUgICAgICAgICBSSVNDVl9IV1BS T0JFX1ZFTkRPUl9FWFRfWFZFTkRPUjEgICAgICAgKDEgPDwgMCkKPiA+ICNkZWZpbmUgICAgICAg ICBSSVNDVl9IV1BST0JFX1ZFTkRPUl9FWFRfWFZFTkRPUjIgICAgICAgKDIgPDwgMCkKPiA+IC8q IFZlbmRvciAzICovCj4gPiAuLi4KPiA+Cj4gPiBUaGUga2V5cyBvdmVybGFwIGJldHdlZW4gdmVu ZG9ycy4gVG8gZGV0ZXJtaW5lIHdoaWNoIGV4dGVuc2lvbiBhIHZlbmRvcgo+ID4gc3VwcG9ydHMs IGh3cHJvYmUgZ2V0cyBkYXRhIGZyb20gaGFydF9pc2FfdmVuZG9yW2NwdV0uIElmIHRoZSB2ZW5k b3IgaXMKPiA+IHZlbmRvciAyLCBpdCBpcyBub3QgcG9zc2libGUgZm9yIGEgdmVuZG9yIGV4dGVu c2lvbiBmcm9tIHZlbmRvciAzIHRvIGVuZAo+ID4gdXAgaW4gdGhlcmUuIE9ubHkgdGhlIGV4dGVu c2lvbnMgZnJvbSB0aGF0IHZlbmRvciBjYW4gYmUgc3VwcG9ydGVkIGJ5Cj4gPiB0aGF0IHZlbmRv cidzIGhhcmR3YXJlLgo+IAo+IEdvdGNoYS4gWW91J3JlIHJpZ2h0IEkgaGFkIG1pc2ludGVycHJl dGVkIHRoaXMsIHRoaW5raW5nIFhUSEVBRFZFQ1RPUgo+IHdhcyBhIHZhbGlkIGJpdCByZWdhcmRs ZXNzIG9mIG12ZW5kb3JpZCwgYW5kIHRoYXQgb3RoZXIgdmVuZG9ycyB3b3VsZAo+IGhhdmUgdG8g Y2hvb3NlIG5ldyBiaXRzIGZvciB0aGVpciBmZWF0dXJlcyBhbmQgYWx3YXlzIHJldHVybiAwIGZv cgo+IFhUSEVBRFZFQ1RPUi4gV2l0aCB5b3VyIGV4cGxhbmF0aW9uLCBpdCBzZWVtcyBsaWtlIHlv dSdyZSBhbGxvY2F0aW5nCj4ga2V5cyAoaW4gbm8gcGFydGljdWxhciBvcmRlcikgd2hvc2UgbWVh bmluZyB3aWxsIGNoYW5nZSBiYXNlZCBvbgo+IG12ZW5kb3JpZC4KPiAKPiBJIGd1ZXNzIEknbSBz dGlsbCBub3QgY29udmluY2VkIHRoYXQgc2F2aW5nIGVhY2ggdmVuZG9yIGZyb20gaGF2aW5nIHRv Cj4gYWRkIGEgVkVORE9SX0VYVCBrZXkgaW4gdGhlaXIga2V5c3BhY2UgaXMgd29ydGggdGhlIHNh Y3JpZmljZSBvZgo+IHNwcmF5aW5nIHRoZSB2ZW5kb3Itc3BlY2lmaWMga2V5cyBhY3Jvc3MgdGhl IGdlbmVyaWMga2V5c3BhY2UuIEFyZQo+IHRoZXJlIGFkdmFudGFnZXMgdG8gaGF2aW5nIGEgc2lu Z2xlIGtleSB3aG9zZSBjYXRlZ29yeSBpcyBzaW1pbGFyIGJ1dAo+IHdob3NlIGJpdHMgYXJlIGVu dGlyZWx5IHZlbmRvci1kZWZpbmVkPyBNYXliZSBpZiBJIHdlcmUgdXNlcnNwYWNlIGFuZAo+IG15 IGZlYXR1cmUgY291bGQgYmUgc2F0aXNmaWVkIGVxdWl2YWxlbnRseSBieSBYVEhFQURWRUNUT1Ig b3IKPiBYUklWT1NPVEhFUlRISU5HLCB0aGVuIEkgY291bGQgZG8gb25lIGh3cHJvYmUgY2FsbCBp bnN0ZWFkIG9mIHR3bz8gQnV0Cj4gSSBkb24ndCB0aGluayB0aGUgdmVuZG9ycyBhcmUgZ29pbmcg dG8gYmUgY29uc2lzdGVudCBlbm91Z2ggZm9yIHRoYXQKPiBlcXVpdmFsZW5jeSB0byBldmVyIHBy b3ZlIHVzZWZ1bC4gVGhlIGFkdmFudGFnZXMgaW4gbXkgaGVhZCBvZiB0aGUKPiBzZXBhcmF0ZSB2 ZW5kb3Iga2V5c3BhY2UgYXJlOgo+ICAqIEtlZXBzIHRoZSBrZXJuZWwgY29kZSBzaW1wbGU6IGlm IGtleSA+PSAoMSA+PiA2MykKPiB2ZW5kb3JfY29uZmlnLT5kb19od3Byb2JlKCksIHJhdGhlciB0 aGFuIGhhdmluZyBhbGwgdGhlc2UgbGl0dGxlIGNhbGxzCj4gaW4gZWFjaCBzcGVjaWZpYyBzd2l0 Y2ggY2FzZSBmb3IgdmVuZG9yX2NvbmZpZy0+ZG9fdmVuZG9yX2V4dDAoKSwKPiB2ZW5kb3JfY29u ZmlnLT5kb192ZW5kb3JfZXh0MSgpLCBldGMuCgpUaGUgY29uc2lzdGVuY3kgYmV0d2VlbiB2ZW5k b3JzIGlzIGd1YXJhbnRlZWQgaW4gdGhpcyBzY2hlbWUuIFRoZXkganVzdAphZGQgdGhlIGV4dGVu c2lvbiB0byBod3Byb2JlX2lzYV92ZW5kb3JfZXh0MC4gVGhlIGZvbGxvd2luZyBjb2RlIGlzIHRo ZQpjcml0aWNhbCBjb2RlIGZyb20gdGhlIGtlcm5lbDoKCglmb3JfZWFjaF9jcHUoY3B1LCBjcHVz KSB7CgkJc3RydWN0IHJpc2N2X2lzYWluZm8gKmlzYXZlbmRvcmluZm8gPSAmaGFydF9pc2FfdmVu ZG9yW2NwdV07CgojZGVmaW5lIFZFTkRPUl9FWFRfS0VZKGV4dCkJCQkJCQkJCVwKCWRvIHsJCQkJ CQkJCQkJXAoJCWlmIChfX3Jpc2N2X2lzYV92ZW5kb3JfZXh0ZW5zaW9uX2F2YWlsYWJsZShpc2F2 ZW5kb3JpbmZvLT5pc2EsCQlcCgkJCQkJCQkgUklTQ1ZfSVNBX1ZFTkRPUl9FWFRfIyNleHQpKQlc CgkJCXBhaXItPnZhbHVlIHw9IFJJU0NWX0hXUFJPQkVfVkVORE9SX0VYVF8jI2V4dDsJCQlcCgkJ ZWxzZQkJCQkJCQkJCVwKCQkJbWlzc2luZyB8PSBSSVNDVl9IV1BST0JFX1ZFTkRPUl9FWFRfIyNl eHQ7CQkJXAoJfSB3aGlsZSAoZmFsc2UpCgoJLyoKCSAqIE9ubHkgdXNlIFZFTkRPUl9FWFRfS0VZ KCkgZm9yIGV4dGVuc2lvbnMgd2hpY2ggY2FuIGJlIGV4cG9zZWQgdG8gdXNlcnNwYWNlLAoJICog cmVnYXJkbGVzcyBvZiB0aGUga2VybmVsJ3MgY29uZmlndXJhdGlvbiwgYXMgbm8gb3RoZXIgY2hl Y2tzLCBiZXNpZGVzCgkgKiBwcmVzZW5jZSBpbiB0aGUgaGFydF92ZW5kb3JfaXNhIGJpdG1hcCwg YXJlIG1hZGUuCgkgKi8KCVZFTkRPUl9FWFRfS0VZKFhUSEVBRFZFQ1RPUik7CgojdW5kZWYgVkVO RE9SX0VYVF9LRVkKCX0KCgkvKiBOb3cgdHVybiBvZmYgcmVwb3J0aW5nIGZlYXR1cmVzIGlmIGFu eSBDUFUgaXMgbWlzc2luZyBpdC4gKi8KCXBhaXItPnZhbHVlICY9IH5taXNzaW5nOwoKVGhlIG9u bHkgdGhpbmcgYSB2ZW5kb3Igd2lsbCBoYXZlIHRvIGRvIGlzIGFkZCBhbiBlbnRyeSBiZWxvdwpW RU5ET1JfRVhUX0tFWShYVEhFQURWRUNUT1IpIHdpdGggdGhlaXIgZXh0ZW5zaW9uIG5hbWUgKG9m IGNvdXJzZQpwb3B1bGF0aW5nIGEgdmFsdWUgZm9yIHRoZSBrZXkgYXMgd2VsbCkuIFRoaXMgZXhp c3RpbmcgY29kZSB3aWxsIHRoZW4KY2hlY2sgaWYgdGhlIGV4dGVuc2lvbiBpcyBjb21wYXRpYmxl IHdpdGggdGhlIGhhcmR3YXJlIGFuZCBhcHByb3ByaWF0ZQpwb3B1bGF0ZSB0aGUgYml0bWFzay4g QWxsIHZlbmRvcnMgZ2V0IHRoaXMgZnVuY3Rpb25hbGl0eSBmb3IgImZyZWUiCndpdGhvdXQgbmVl ZGluZyB0byB3cml0ZSB0aGUgYm9pbGVycGxhdGUgY29kZSB0byBleHBvc2UgdmVuZG9yCmV4dGVu c2lvbnMgdGhyb3VnaCBod3Byb2JlLgoKTm93IHRoYXQgSSB3cml0ZSB0aGlzIG91dCBJIGRvIHNl ZSB0aGF0IEkgb3Zlcmxvb2tlZCB0aGF0IHRoaXMgY29kZQpuZWVkcyB0byBjaGVjayB0aGUgdmVu ZG9yaWQgdG8gZW5zdXJlIHRoYXQgdGhlIGdpdmVuIGV4dGVuc2lvbiBpcwphY3R1YWxseSBhc3Nv Y2lhdGVkIHdpdGggdGhlIHZlbmRvcmlkLiBUaGlzIHdvdWxkIG1ha2UgdGhpcyBtb3JlCmNvbXBs aWNhdGVkIGJ1dCBzdGlsbCBzZWVtcyBsaWtlIGEgbG93IGJhcnJpZXIgdG8gZW50cnkgZm9yIGEg bmV3CnZlbmRvciwgYXMgd2VsbCBhcyBhIHN0YW5kYXJkIEFQSSBmb3IgZ2V0dGluZyBhbGwgdmVu ZG9yIGV4dGVuc2lvbnMgdGhhdAphcmUgYXZhaWxhYmxlIG9uIHRoZSBwbGF0Zm9ybSByZWdhcmRs ZXNzIG9mIHdoaWNoIHBsYXRmb3JtIGlzIGJlaW5nCnVzZWQuCgo+ICAqIEl0IGV4dGVuZHMgZWFz aWx5IGludG8gcGFzc2luZyBvdGhlciBmb3JtcyBvZiB2ZW5kb3IgaHdwcm9iZSBpbmZvCj4gbGF0 ZXIsIHJhdGhlciB0aGFuIHNvbHZpbmcgb25seSB0aGUgY2FzZSBvZiByaXNjLXYgZXh0ZW5zaW9u cyBub3csIGFuZAo+IHRoZW4gaGF2aW5nIHRvIGRvIHRoaXMgYWxsIGFnYWluIGZvciBlYWNoIGFk ZGl0aW9uYWwgY2F0ZWdvcnkgb2YKPiB2ZW5kb3IgZGF0YS4KClRoaXMgaXMgYSBncmVhdCBwb2lu dC4gSSBkbyBhZ3JlZSB0aGF0IGEgZGlmZmVyZW50IHNvbHV0aW9uIHdpbGwgYmUKbmVjZXNzYXJ5 IGZvciBhcmJpdHJhcnkgdmVuZG9yIGRhdGEgYW5kIEkgYW0gYWxsIGZvciBtYWtpbmcgc29tZXRo aW5nCmZ1dHVyZSBjb21wYXRpYmxlLiBBdCB0aGUgc2FtZSB0aW1lIEkgZG9uJ3Qgd2FudCB0byBn ZXQgdHJhcHBlZCBpbnRvCnNvbWV0aGluZyB0aGF0IGlzIHN1Ym9wdGltYWwgZm9yIHRoZSBzYWtl IG9mIGRvaW5nIGxlc3Mgd29yayBsYXRlci4KVGhlcmUgaXMgbm8gY2hhbmNlIG9mIGFueSBjb21w YXRpYmlsaXR5IG9uY2Ugd2UgbGVhdmUgdGhlIHJlYWxtIG9mCnJpc2N2IGV4dGVuc2lvbnMsIHNv IG9uY2UgYSB2ZW5kb3IgbmVlZHMgc29tZXRoaW5nIGV4cG9ydGVkIEkgd291bGQgYmUKaGFwcHkg dG8gd3JpdGUgdGhlIGNvZGUgdG8gc3VwcG9ydCB0aGF0LiAKCj4gICogU2ltaWxhcmx5LCBpdCBk aXNjb3VyYWdlcyBmdXR1cmUgdmVuZG9ycyBmcm9tIHRyeWluZyB0byBzcXVpbnQgYW5kCj4gZmlu ZCBhIHdheSB0byBtYWtlIGEgdmFndWVseSBnZW5lcmljIHNvdW5kaW5nIGNhdGVnb3J5IGZvciB0 aGVpciBvd24KPiBod3Byb2JlIGtleSB3aGljaCB3aWxsIHVsdGltYXRlbHkgb25seSBldmVyIGJl IGZpbGxlZCBpbiBieSB0aGVtCj4gYW55d2F5LgoKV2hhdCBkbyB5b3UgbWVhbiBieSB0aGlzPyBU aGVyZSBhcmUgbm8gImNhdGVnb3JpZXMiIGhlcmUsIHRoZSB2ZW5kb3IKanVzdCB3cml0ZXMgb3V0 IHRoZWlyIGV4dGVuc2lvbiBWRU5ET1JfRVhUX0tFWShYVkVORE9SRVhURU5TSU9OKSBhbmQgaXQK Z2V0cyBzaHV0dGxlZCB0byB1c2Vyc3BhY2Ugb24gdGhlIGh3cHJvYmUgdmVuZG9yIGNhbGwuCgot IENoYXJsaWUKCj4gCj4gLUV2YW4KCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fCmxpbnV4LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4LWFybS1rZXJu ZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFu L2xpc3RpbmZvL2xpbnV4LWFybS1rZXJuZWwK