From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.remote-ip=100.103.45.18 ARC-Seal: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; cv=none; t=1794513767; b=LlkqCQ78fzDj71k+s+pyhN/vzV+SVWZxoHlh+8ZcKZQAFvPmUZStB1qBjtnge3rUZ98B 7Rfs4h2hGXkWVaPPGnWhQZZY4RxR0TDg09s9f7x1OrXEhjPQ36oVAwnwfpgkFx0GmPLk9 x2+jOewCOVxT8fX/mzjxgACT3QngukcOACFsOr1nqfUUsB+nwxGRL2yYpMZ7HIOH9dtTc b/oAsvM3nYcS4sqKaXnx0GwvFuCy56TDnJ0pLQUfGXYDSIiJKKWoJlijouE+v2L68Lgl/ kbYDugymdKaru7jXhpZ9PRryhHJlyxsOLCQH8IzdrTVZY5Trtr29hbiylJXdapjBWiw== ARC-Message-Signature: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; c=relaxed/relaxed; t=1794513767; h=Received:DKIM-Signature:Date:From:To:Cc:Subject:Message-ID: References:MIME-Version:Content-Type:Content-Disposition: Content-Transfer-Encoding:In-Reply-To; bh=kRsJE9S/70yOGQSUq2MlgQujyTFrN9aLjM+eaSxSfek=; b=IWHhX+mCtDDtzaD5+baXWoH94VbZ81GNtO+nlosxW3X2M0HP/Vb3UoA0OeKrUYalq6zZ +h6/mmZQZxIyKVItlko4ca5ecYmaIkn4PciQAkqcKDT9QJJZOKkm72L7uLIdJDzNIoY5z ZEcVytGheLpnW+oi2FGSSwxeIbpICwtCdG1g0pwpycwtZo/MLcuumGnjD004UcuPGmd6G 4o5E6xr/dTNiFv8nb0EF+bk+VsY0uqUUZfl7v8OpqnRBU4hDj9IiTlzHHYrVl4kYYQR0k oIn5dbcOaK8UubZwQBxrD56gwF43xc8FckqVouP1AhdxgWZgQ5bSPY7DK/EjpNrEqrA== ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256 header.s=k20260515 header.b=iXXCGePG; arc=none smtp.remote-ip=100.103.45.18 Received: from smtp.kernel.org (quasi.space.kernel.org [100.103.45.18]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (prime256v1)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 22510606A31C; Thu, 12 Nov 2026 20:02:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256 header.s=k20260515 header.b=iXXCGePG Received: by smtp.kernel.org (Postfix) with ESMTPSA id 291CB1F000C4; Thu, 12 Nov 2026 20:02:46 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1794513766; bh=kRsJE9S/70yOGQSUq2MlgQujyTFrN9aLjM+eaSxSfek=; h=Date:From:To:Cc:Subject:References:In-Reply-To; b=iXXCGePGQJ3YsqnugdvJXMJeGBJiscAo887Qwn5UOj9vmXdobRDyLCxWo3h9W9Fq4 94i19MI8QPzHukPl5h1iWi54+DLQqqT898RHQTKI6y7CZhH9zUEF9kLAuR9lyGfyWe tKAx0FzHMGLnQvnQsKke6tQANKJiRlF49ClwlDCnTkvK2222ZhOBIhXDK/9z8+p4cQ 2qA/d1iB+ohHdfWQfI6QQr+18k6BJ7ET6iVb6rf5pEI45dfw/+xM6HOV2c5TZalwiM GLeem4S6CP5EHu7MRNHVwtxl1bcHWzEGIv2pauBU8yj1aY+WEZ4/Hb/TveVAz4xHAg TaLmZB+wbwghg== Date: Thu, 12 Nov 2026 12:02:44 -0800 From: Drew Fustini To: Radim =?utf-8?B?S3LEjW3DocWZ?= Cc: Adrien Ricciardi , Alexandre Ghiti , Albert Ou , Atish Patra , Babu Moger , Ben Horgan , Borislav Petkov , Chen Pei , Conor Dooley , Conor Dooley , Dave Hansen , Dave Martin , Fenghua Yu , Gong Shuai , Gong Shuai , guo.wenjia23@zte.com.cn, James Morse , Kornel =?utf-8?Q?Dul=C4=99ba?= , Krzysztof Kozlowski , liu.qingtao2@zte.com.cn, Liu Zhiwei , Palmer Dabbelt , Paul Walmsley , Peter Newman , Reinette Chatre , Rob Herring , Samuel Holland , Sunil V L , Tony Luck , Weiwei Li , yunhui cui , Zhanpeng Zhang , Catalin Marinas , Jonathan Cameron , Shaopeng Tan , Zeng Heng , linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org, x86@kernel.org, devicetree@vger.kernel.org, linux-doc@vger.kernel.org Subject: Re: [PATCH v11 1/5] riscv_cbqri: Add capacity controller core Message-ID: References: <20261108-dfustini-atl-sc-cbqri-dt-v11-0-33a1bf0cf01c@kernel.org> <20261108-dfustini-atl-sc-cbqri-dt-v11-1-33a1bf0cf01c@kernel.org> X-Mailing-List: linux-doc@vger.kernel.org List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: On Thu, Nov 12, 2026 at 05:14:50PM +0100, Radim Krčmář wrote: Hi Radim, thanks for the review. > 2026-11-08T15:20:50-08:00, Drew Fustini : > > Add the core for RISC-V CBQRI capacity controllers: the register > > layout, the capability probe, and the allocation operations that > > program a capacity block mask for an RCID and read it back. > > > > A discovery layer maps the register block and describes the controller > > in a cbqri_controller_info descriptor. riscv_cbqri_register_cc() probes > > the controller from that descriptor and adds it to the controller list, > > which stays private to the core. The core owns the controller state > > after registration, so nothing in it depends on how the controller was > > discovered. The caller keeps the register mapping alive. > > > > Co-developed-by: Adrien Ricciardi > > Signed-off-by: Adrien Ricciardi > > Signed-off-by: Drew Fustini > > --- > > diff --git a/drivers/resctrl/cbqri_devices.c b/drivers/resctrl/cbqri_devices.c > > +static u64 cbqri_readq(void __iomem *addr) > > +{ > > + return lo_hi_readq(addr); > > +} > > + > > +static void cbqri_clear_cunits(struct cbqri_controller *ctrl) > > +{ > > + if (ctrl->cc.cunits) { > > + writel(0, ctrl->base + CBQRI_CC_CUNITS_OFF); > > + writel(0, ctrl->base + CBQRI_CC_CUNITS_OFF + 4); > > nit: lo_hi_writeq? Good idea, I'll switch to that. > > +int cbqri_apply_cache_config(struct cbqri_controller *ctrl, u32 closid, > > + const struct cbqri_cc_config *cfg) > > +{ > > [...] > > + mutex_lock(&ctrl->lock); > > [...] > > +out: > > + mutex_unlock(&ctrl->lock); > > + return err; > > nit: guard the mutex? Also a good idea, I'll switch for this function and also cbqri_read_cache_config(). > > > +static int cbqri_probe_feature(struct cbqri_controller *ctrl, int reg_offset, > > + int operation, int *status, bool *access_type_supported) > > +{ > > + const u64 active_mask = CBQRI_CONTROL_REGISTERS_OP_MASK | > > + CBQRI_CONTROL_REGISTERS_AT_MASK | > > + CBQRI_CONTROL_REGISTERS_RCID_MASK; > > + u64 reg, saved_reg; > > + int at; > > + > > + /* > > + * Default the output to false so the status==0 (feature not > > + * implemented) path returns a deterministic value to the caller > > + * rather than leaving an uninitialized bool. > > + */ > > + *access_type_supported = false; > > + > > + /* Keep the initial register value to preserve the WPRI fields */ > > + reg = cbqri_readq(ctrl->base + reg_offset); > > + saved_reg = reg; > > + > > + /* Drain any in-flight firmware op before issuing our own write. */ > > + if (cbqri_wait_busy_flag(ctrl, reg_offset, &saved_reg) < 0) { > > + pr_err("BUSY timeout before probe operation\n"); > > + return -EIO; > > + } > > + > > + /* > > + * Execute the requested operation with all active fields > > + * (OP/AT/RCID) zeroed except OP itself. Every bit not in > > + * active_mask is WPRI and gets carried over from saved_reg. > > + */ > > + reg = (saved_reg & ~active_mask) | > > + FIELD_PREP(CBQRI_CONTROL_REGISTERS_OP_MASK, operation); > > + writel(lower_32_bits(reg), ctrl->base + reg_offset); > > + if (cbqri_wait_busy_flag(ctrl, reg_offset, ®) < 0) { > > + pr_err_ratelimited("BUSY timeout during operation\n"); > > + return -EIO; > > + } > > + > > + /* Get the operation status */ > > + *status = FIELD_GET(CBQRI_CONTROL_REGISTERS_STATUS_MASK, reg); > > + > > + /* > > + * Check for AT support if the register is implemented > > + * (if not, the status value will remain 0) > > + */ > > + if (*status != 0) { > > + /* > > + * Re-issue operation with AT=CODE so the controller > > + * latches AT=CODE on supported hardware (or resets it to 0 > > + * on hardware that doesn't). OP must be a defined CBQRI op > > + * here. OP=0 is a no-op and would silently disable CDP. > > OP=0 is a reserved for future standard use. > (Hopefully just fails, but it could be worse if it gets implemented as > something other than no-op.) I'll reword and drop the incorrect statement that OP=0 is a no-op. > > > + */ > > + reg = (saved_reg & ~active_mask) | > > + FIELD_PREP(CBQRI_CONTROL_REGISTERS_OP_MASK, operation) | > > + FIELD_PREP(CBQRI_CONTROL_REGISTERS_AT_MASK, > > + CBQRI_CONTROL_REGISTERS_AT_CODE); > > + writel(lower_32_bits(reg), ctrl->base + reg_offset); > > + if (cbqri_wait_busy_flag(ctrl, reg_offset, ®) < 0) { > > + pr_err("BUSY timeout setting AT field\n"); > > + return -EIO; > > + } > > + > > + /* > > + * If the AT field value has been reset to zero, > > + * then AT support is not present > > + */ > > + at = FIELD_GET(CBQRI_CONTROL_REGISTERS_AT_MASK, reg); > > I think it would be safer to also check the status field. > > I'm not too clear whether the spec actually allows returning 5 (invalid > AT) when the AT is invalid, but an implementation that does that > wouldn't surprise me. > > (For example when an implementation supports data AT and a custom AT, so > code AT isn't supported, but AT in general is -- it could keep the > failing code AT and just report the error.) That seems reasonable. I will change it to only report AT support when the AT field reads back as code with status = success. > > + if (at == CBQRI_CONTROL_REGISTERS_AT_CODE) > > + *access_type_supported = true; > > + } > > + > > + /* > > + * Restore the original register value. > > + * Clear OP to avoid re-triggering the probe op. > > + */ > > + saved_reg &= ~CBQRI_CONTROL_REGISTERS_OP_MASK; > > + writel(lower_32_bits(saved_reg), ctrl->base + reg_offset); > > It would be better to do nothing than trigger an illegal OP. > All our writes should modify the non-WPRI bits anyway, so restoring them > does nothing. I agree. I'll drop the restore write. > > + if (cbqri_wait_busy_flag(ctrl, reg_offset, NULL) < 0) { > > + pr_err("BUSY timeout restoring register value\n"); > > + return -EIO; > > + } > > + > > + return 0; > > +} > > + > > +static int cbqri_probe_cc(struct cbqri_controller *ctrl) > > +{ > > [...] > > + > > + /* > > + * The driver programs the v1.0 register layout. Controllers that > > + * report 0.x differ only in capability bits that read as zero, so > > + * they are accepted. Anything newer than 1.0 may move fields. > > + */ > > + if (ver_major > 1 || (ver_major == 1 && ver_minor > 0)) { > > I think we could accept ver_major == 1 even with ver_minor > 0 since the > minor specifications shouldn't be doing backward-incompatible changes. > > (If we fix the OP=0, we shouldn't be invoking any other behavior that > might change.) Good point. I'll skip the ver_minor check and reject ver_major > 1. > I'd be more careful about accepting anything pre-1.0, since I would > expect there was a breaking change in the spec somewhere, and we could > program it incorrectly... Do we even care about pre-1.0 hardware? I went through the tagged drafts in the riscv-cbqri repo, v0.9.1 through v1.0-rc3. The registers and encodings that this driver uses are the same in all of them. RPFX/P were added in bits that had been reserved. If I add that information to the comment, then would that be acceptable to you? Thanks, Drew From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (prime256v1) server-digest SHA256) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 33120606A331 for ; Thu, 12 Nov 2026 20:02:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.a=rsa-sha256 header.s=bombadil.20210309 header.b=Yj0KPASS; dkim=fail reason="signature verification failed" (2048-bit key) header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256 header.s=k20260515 header.b=iXXCGePG 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-Unsubscribe-Post:List-Owner; bh=Ucn41AD0o7jUqzJ2yrvjVckZKq0Dr3XlKk1dhWJDsj0=; b=Yj0KPASS3m+8L524Dc6qRlo9Kq e8/hH82BUpE9YACqD2ZzKh+3OtYkpONRl4y51EBgBkj5OdroDBI7TNlWuarz3W1aya5U9qpVL4BBe wVpMo04N+vIgqZYjhU2uJCd+PbQhiTX+Wi0CxfhEYxQ9OkeF6ylJtWW3DNjq0KXhvriL2xqjmHaB6 k9RN4xpUSDahUnwoFynofYnsSgVCopUbBp1H485NmZs5HZxCIR90t6ZTNYvzXPhkpp/aL6lRv9FSA GQLD8nq29Prb2tjPsIxREH/Yllnr2mmEBoDJCskFUggf0HwUDREghITAwdYLTUnt9+9+S0r1OyYmQ 7kE2bZVg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.100.1 #2 (Red Hat Linux)) id 1xRb0T-0000000AzNP-3kRR; Thu, 12 Nov 2026 20:02:49 +0000 Received: from sea.source.kernel.org ([2600:3c0a:e001:78e:0:1991:8:25]) by bombadil.infradead.org with esmtps (Exim 4.100.1 #2 (Red Hat Linux)) id 1xRb0R-0000000AzNG-2LgD for linux-riscv@lists.infradead.org; Thu, 12 Nov 2026 20:02:47 +0000 Received: from smtp.kernel.org (quasi.space.kernel.org [100.103.45.18]) by sea.source.kernel.org (Postfix) with ESMTP id CC96B41E63; Thu, 12 Nov 2026 20:02:46 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 291CB1F000C4; Thu, 12 Nov 2026 20:02:46 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1794513766; bh=kRsJE9S/70yOGQSUq2MlgQujyTFrN9aLjM+eaSxSfek=; h=Date:From:To:Cc:Subject:References:In-Reply-To; b=iXXCGePGQJ3YsqnugdvJXMJeGBJiscAo887Qwn5UOj9vmXdobRDyLCxWo3h9W9Fq4 94i19MI8QPzHukPl5h1iWi54+DLQqqT898RHQTKI6y7CZhH9zUEF9kLAuR9lyGfyWe tKAx0FzHMGLnQvnQsKke6tQANKJiRlF49ClwlDCnTkvK2222ZhOBIhXDK/9z8+p4cQ 2qA/d1iB+ohHdfWQfI6QQr+18k6BJ7ET6iVb6rf5pEI45dfw/+xM6HOV2c5TZalwiM GLeem4S6CP5EHu7MRNHVwtxl1bcHWzEGIv2pauBU8yj1aY+WEZ4/Hb/TveVAz4xHAg TaLmZB+wbwghg== Date: Thu, 12 Nov 2026 12:02:44 -0800 From: Drew Fustini To: Radim =?utf-8?B?S3LEjW3DocWZ?= Cc: Adrien Ricciardi , Alexandre Ghiti , Albert Ou , Atish Patra , Babu Moger , Ben Horgan , Borislav Petkov , Chen Pei , Conor Dooley , Conor Dooley , Dave Hansen , Dave Martin , Fenghua Yu , Gong Shuai , Gong Shuai , guo.wenjia23@zte.com.cn, James Morse , Kornel =?utf-8?Q?Dul=C4=99ba?= , Krzysztof Kozlowski , liu.qingtao2@zte.com.cn, Liu Zhiwei , Palmer Dabbelt , Paul Walmsley , Peter Newman , Reinette Chatre , Rob Herring , Samuel Holland , Sunil V L , Tony Luck , Weiwei Li , yunhui cui , Zhanpeng Zhang , Catalin Marinas , Jonathan Cameron , Shaopeng Tan , Zeng Heng , linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org, x86@kernel.org, devicetree@vger.kernel.org, linux-doc@vger.kernel.org Subject: Re: [PATCH v11 1/5] riscv_cbqri: Add capacity controller core Message-ID: References: <20261108-dfustini-atl-sc-cbqri-dt-v11-0-33a1bf0cf01c@kernel.org> <20261108-dfustini-atl-sc-cbqri-dt-v11-1-33a1bf0cf01c@kernel.org> X-Archived-By: MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: X-BeenThere: linux-riscv@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-riscv" X-Spam-Status: No, score=-13.9 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_EF,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE, SPF_PASS autolearn=ham autolearn_force=no version=4.0.1 X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on aws-us-west-2-korg-listserv-alma10-1 T24gVGh1LCBOb3YgMTIsIDIwMjYgYXQgMDU6MTQ6NTBQTSArMDEwMCwgUmFkaW0gS3LEjW3DocWZ IHdyb3RlOgoKSGkgUmFkaW0sIHRoYW5rcyBmb3IgdGhlIHJldmlldy4KCj4gMjAyNi0xMS0wOFQx NToyMDo1MC0wODowMCwgRHJldyBGdXN0aW5pIDxmdXN0aW5pQGtlcm5lbC5vcmc+Ogo+ID4gQWRk IHRoZSBjb3JlIGZvciBSSVNDLVYgQ0JRUkkgY2FwYWNpdHkgY29udHJvbGxlcnM6IHRoZSByZWdp c3Rlcgo+ID4gbGF5b3V0LCB0aGUgY2FwYWJpbGl0eSBwcm9iZSwgYW5kIHRoZSBhbGxvY2F0aW9u IG9wZXJhdGlvbnMgdGhhdAo+ID4gcHJvZ3JhbSBhIGNhcGFjaXR5IGJsb2NrIG1hc2sgZm9yIGFu IFJDSUQgYW5kIHJlYWQgaXQgYmFjay4KPiA+Cj4gPiBBIGRpc2NvdmVyeSBsYXllciBtYXBzIHRo ZSByZWdpc3RlciBibG9jayBhbmQgZGVzY3JpYmVzIHRoZSBjb250cm9sbGVyCj4gPiBpbiBhIGNi cXJpX2NvbnRyb2xsZXJfaW5mbyBkZXNjcmlwdG9yLiByaXNjdl9jYnFyaV9yZWdpc3Rlcl9jYygp IHByb2Jlcwo+ID4gdGhlIGNvbnRyb2xsZXIgZnJvbSB0aGF0IGRlc2NyaXB0b3IgYW5kIGFkZHMg aXQgdG8gdGhlIGNvbnRyb2xsZXIgbGlzdCwKPiA+IHdoaWNoIHN0YXlzIHByaXZhdGUgdG8gdGhl IGNvcmUuIFRoZSBjb3JlIG93bnMgdGhlIGNvbnRyb2xsZXIgc3RhdGUKPiA+IGFmdGVyIHJlZ2lz dHJhdGlvbiwgc28gbm90aGluZyBpbiBpdCBkZXBlbmRzIG9uIGhvdyB0aGUgY29udHJvbGxlciB3 YXMKPiA+IGRpc2NvdmVyZWQuIFRoZSBjYWxsZXIga2VlcHMgdGhlIHJlZ2lzdGVyIG1hcHBpbmcg YWxpdmUuCj4gPgo+ID4gQ28tZGV2ZWxvcGVkLWJ5OiBBZHJpZW4gUmljY2lhcmRpIDxhcmljY2lh cmRpQGJheWxpYnJlLmNvbT4KPiA+IFNpZ25lZC1vZmYtYnk6IEFkcmllbiBSaWNjaWFyZGkgPGFy aWNjaWFyZGlAYmF5bGlicmUuY29tPgo+ID4gU2lnbmVkLW9mZi1ieTogRHJldyBGdXN0aW5pIDxm dXN0aW5pQGtlcm5lbC5vcmc+Cj4gPiAtLS0KPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL3Jlc2N0 cmwvY2JxcmlfZGV2aWNlcy5jIGIvZHJpdmVycy9yZXNjdHJsL2NicXJpX2RldmljZXMuYwo+ID4g K3N0YXRpYyB1NjQgY2JxcmlfcmVhZHEodm9pZCBfX2lvbWVtICphZGRyKQo+ID4gK3sKPiA+ICsJ cmV0dXJuIGxvX2hpX3JlYWRxKGFkZHIpOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgdm9pZCBj YnFyaV9jbGVhcl9jdW5pdHMoc3RydWN0IGNicXJpX2NvbnRyb2xsZXIgKmN0cmwpCj4gPiArewo+ ID4gKwlpZiAoY3RybC0+Y2MuY3VuaXRzKSB7Cj4gPiArCQl3cml0ZWwoMCwgY3RybC0+YmFzZSAr IENCUVJJX0NDX0NVTklUU19PRkYpOwo+ID4gKwkJd3JpdGVsKDAsIGN0cmwtPmJhc2UgKyBDQlFS SV9DQ19DVU5JVFNfT0ZGICsgNCk7Cj4gCj4gbml0OiBsb19oaV93cml0ZXE/CgpHb29kIGlkZWEs IEknbGwgc3dpdGNoIHRvIHRoYXQuCgo+ID4gK2ludCBjYnFyaV9hcHBseV9jYWNoZV9jb25maWco c3RydWN0IGNicXJpX2NvbnRyb2xsZXIgKmN0cmwsIHUzMiBjbG9zaWQsCj4gPiArCQkJICAgICBj b25zdCBzdHJ1Y3QgY2JxcmlfY2NfY29uZmlnICpjZmcpCj4gPiArewo+ID4gWy4uLl0KPiA+ICsJ bXV0ZXhfbG9jaygmY3RybC0+bG9jayk7Cj4gPiBbLi4uXQo+ID4gK291dDoKPiA+ICsJbXV0ZXhf dW5sb2NrKCZjdHJsLT5sb2NrKTsKPiA+ICsJcmV0dXJuIGVycjsKPiAKPiBuaXQ6IGd1YXJkIHRo ZSBtdXRleD8KCkFsc28gYSBnb29kIGlkZWEsIEknbGwgc3dpdGNoIGZvciB0aGlzIGZ1bmN0aW9u IGFuZCBhbHNvCmNicXJpX3JlYWRfY2FjaGVfY29uZmlnKCkuCgo+IAo+ID4gK3N0YXRpYyBpbnQg Y2JxcmlfcHJvYmVfZmVhdHVyZShzdHJ1Y3QgY2JxcmlfY29udHJvbGxlciAqY3RybCwgaW50IHJl Z19vZmZzZXQsCj4gPiArCQkJICAgICAgIGludCBvcGVyYXRpb24sIGludCAqc3RhdHVzLCBib29s ICphY2Nlc3NfdHlwZV9zdXBwb3J0ZWQpCj4gPiArewo+ID4gKwljb25zdCB1NjQgYWN0aXZlX21h c2sgPSBDQlFSSV9DT05UUk9MX1JFR0lTVEVSU19PUF9NQVNLIHwKPiA+ICsJCQkJQ0JRUklfQ09O VFJPTF9SRUdJU1RFUlNfQVRfTUFTSyB8Cj4gPiArCQkJCUNCUVJJX0NPTlRST0xfUkVHSVNURVJT X1JDSURfTUFTSzsKPiA+ICsJdTY0IHJlZywgc2F2ZWRfcmVnOwo+ID4gKwlpbnQgYXQ7Cj4gPiAr Cj4gPiArCS8qCj4gPiArCSAqIERlZmF1bHQgdGhlIG91dHB1dCB0byBmYWxzZSBzbyB0aGUgc3Rh dHVzPT0wIChmZWF0dXJlIG5vdAo+ID4gKwkgKiBpbXBsZW1lbnRlZCkgcGF0aCByZXR1cm5zIGEg ZGV0ZXJtaW5pc3RpYyB2YWx1ZSB0byB0aGUgY2FsbGVyCj4gPiArCSAqIHJhdGhlciB0aGFuIGxl YXZpbmcgYW4gdW5pbml0aWFsaXplZCBib29sLgo+ID4gKwkgKi8KPiA+ICsJKmFjY2Vzc190eXBl X3N1cHBvcnRlZCA9IGZhbHNlOwo+ID4gKwo+ID4gKwkvKiBLZWVwIHRoZSBpbml0aWFsIHJlZ2lz dGVyIHZhbHVlIHRvIHByZXNlcnZlIHRoZSBXUFJJIGZpZWxkcyAqLwo+ID4gKwlyZWcgPSBjYnFy aV9yZWFkcShjdHJsLT5iYXNlICsgcmVnX29mZnNldCk7Cj4gPiArCXNhdmVkX3JlZyA9IHJlZzsK PiA+ICsKPiA+ICsJLyogRHJhaW4gYW55IGluLWZsaWdodCBmaXJtd2FyZSBvcCBiZWZvcmUgaXNz dWluZyBvdXIgb3duIHdyaXRlLiAqLwo+ID4gKwlpZiAoY2Jxcmlfd2FpdF9idXN5X2ZsYWcoY3Ry bCwgcmVnX29mZnNldCwgJnNhdmVkX3JlZykgPCAwKSB7Cj4gPiArCQlwcl9lcnIoIkJVU1kgdGlt ZW91dCBiZWZvcmUgcHJvYmUgb3BlcmF0aW9uXG4iKTsKPiA+ICsJCXJldHVybiAtRUlPOwo+ID4g Kwl9Cj4gPiArCj4gPiArCS8qCj4gPiArCSAqIEV4ZWN1dGUgdGhlIHJlcXVlc3RlZCBvcGVyYXRp b24gd2l0aCBhbGwgYWN0aXZlIGZpZWxkcwo+ID4gKwkgKiAoT1AvQVQvUkNJRCkgemVyb2VkIGV4 Y2VwdCBPUCBpdHNlbGYuIEV2ZXJ5IGJpdCBub3QgaW4KPiA+ICsJICogYWN0aXZlX21hc2sgaXMg V1BSSSBhbmQgZ2V0cyBjYXJyaWVkIG92ZXIgZnJvbSBzYXZlZF9yZWcuCj4gPiArCSAqLwo+ID4g KwlyZWcgPSAoc2F2ZWRfcmVnICYgfmFjdGl2ZV9tYXNrKSB8Cj4gPiArCSAgICAgIEZJRUxEX1BS RVAoQ0JRUklfQ09OVFJPTF9SRUdJU1RFUlNfT1BfTUFTSywgb3BlcmF0aW9uKTsKPiA+ICsJd3Jp dGVsKGxvd2VyXzMyX2JpdHMocmVnKSwgY3RybC0+YmFzZSArIHJlZ19vZmZzZXQpOwo+ID4gKwlp ZiAoY2Jxcmlfd2FpdF9idXN5X2ZsYWcoY3RybCwgcmVnX29mZnNldCwgJnJlZykgPCAwKSB7Cj4g PiArCQlwcl9lcnJfcmF0ZWxpbWl0ZWQoIkJVU1kgdGltZW91dCBkdXJpbmcgb3BlcmF0aW9uXG4i KTsKPiA+ICsJCXJldHVybiAtRUlPOwo+ID4gKwl9Cj4gPiArCj4gPiArCS8qIEdldCB0aGUgb3Bl cmF0aW9uIHN0YXR1cyAqLwo+ID4gKwkqc3RhdHVzID0gRklFTERfR0VUKENCUVJJX0NPTlRST0xf UkVHSVNURVJTX1NUQVRVU19NQVNLLCByZWcpOwo+ID4gKwo+ID4gKwkvKgo+ID4gKwkgKiBDaGVj ayBmb3IgQVQgc3VwcG9ydCBpZiB0aGUgcmVnaXN0ZXIgaXMgaW1wbGVtZW50ZWQKPiA+ICsJICog KGlmIG5vdCwgdGhlIHN0YXR1cyB2YWx1ZSB3aWxsIHJlbWFpbiAwKQo+ID4gKwkgKi8KPiA+ICsJ aWYgKCpzdGF0dXMgIT0gMCkgewo+ID4gKwkJLyoKPiA+ICsJCSAqIFJlLWlzc3VlIG9wZXJhdGlv biB3aXRoIEFUPUNPREUgc28gdGhlIGNvbnRyb2xsZXIKPiA+ICsJCSAqIGxhdGNoZXMgQVQ9Q09E RSBvbiBzdXBwb3J0ZWQgaGFyZHdhcmUgKG9yIHJlc2V0cyBpdCB0byAwCj4gPiArCQkgKiBvbiBo YXJkd2FyZSB0aGF0IGRvZXNuJ3QpLiBPUCBtdXN0IGJlIGEgZGVmaW5lZCBDQlFSSSBvcAo+ID4g KwkJICogaGVyZS4gT1A9MCBpcyBhIG5vLW9wIGFuZCB3b3VsZCBzaWxlbnRseSBkaXNhYmxlIENE UC4KPiAKPiBPUD0wIGlzIGEgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSBzdGFuZGFyZCB1c2UuCj4gKEhv cGVmdWxseSBqdXN0IGZhaWxzLCBidXQgaXQgY291bGQgYmUgd29yc2UgaWYgaXQgZ2V0cyBpbXBs ZW1lbnRlZCBhcwo+ICBzb21ldGhpbmcgb3RoZXIgdGhhbiBuby1vcC4pCgpJJ2xsIHJld29yZCBh bmQgZHJvcCB0aGUgaW5jb3JyZWN0IHN0YXRlbWVudCB0aGF0IE9QPTAgaXMgYSBuby1vcC4KCj4g Cj4gPiArCQkgKi8KPiA+ICsJCXJlZyA9IChzYXZlZF9yZWcgJiB+YWN0aXZlX21hc2spIHwKPiA+ ICsJCSAgICAgIEZJRUxEX1BSRVAoQ0JRUklfQ09OVFJPTF9SRUdJU1RFUlNfT1BfTUFTSywgb3Bl cmF0aW9uKSB8Cj4gPiArCQkgICAgICBGSUVMRF9QUkVQKENCUVJJX0NPTlRST0xfUkVHSVNURVJT X0FUX01BU0ssCj4gPiArCQkJCSBDQlFSSV9DT05UUk9MX1JFR0lTVEVSU19BVF9DT0RFKTsKPiA+ ICsJCXdyaXRlbChsb3dlcl8zMl9iaXRzKHJlZyksIGN0cmwtPmJhc2UgKyByZWdfb2Zmc2V0KTsK PiA+ICsJCWlmIChjYnFyaV93YWl0X2J1c3lfZmxhZyhjdHJsLCByZWdfb2Zmc2V0LCAmcmVnKSA8 IDApIHsKPiA+ICsJCQlwcl9lcnIoIkJVU1kgdGltZW91dCBzZXR0aW5nIEFUIGZpZWxkXG4iKTsK PiA+ICsJCQlyZXR1cm4gLUVJTzsKPiA+ICsJCX0KPiA+ICsKPiA+ICsJCS8qCj4gPiArCQkgKiBJ ZiB0aGUgQVQgZmllbGQgdmFsdWUgaGFzIGJlZW4gcmVzZXQgdG8gemVybywKPiA+ICsJCSAqIHRo ZW4gQVQgc3VwcG9ydCBpcyBub3QgcHJlc2VudAo+ID4gKwkJICovCj4gPiArCQlhdCA9IEZJRUxE X0dFVChDQlFSSV9DT05UUk9MX1JFR0lTVEVSU19BVF9NQVNLLCByZWcpOwo+IAo+IEkgdGhpbmsg aXQgd291bGQgYmUgc2FmZXIgdG8gYWxzbyBjaGVjayB0aGUgc3RhdHVzIGZpZWxkLgo+IAo+IEkn bSBub3QgdG9vIGNsZWFyIHdoZXRoZXIgdGhlIHNwZWMgYWN0dWFsbHkgYWxsb3dzIHJldHVybmlu ZyA1IChpbnZhbGlkCj4gQVQpIHdoZW4gdGhlIEFUIGlzIGludmFsaWQsIGJ1dCBhbiBpbXBsZW1l bnRhdGlvbiB0aGF0IGRvZXMgdGhhdAo+IHdvdWxkbid0IHN1cnByaXNlIG1lLgo+IAo+IChGb3Ig ZXhhbXBsZSB3aGVuIGFuIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIGRhdGEgQVQgYW5kIGEgY3Vz dG9tIEFULCBzbwo+IGNvZGUgQVQgaXNuJ3Qgc3VwcG9ydGVkLCBidXQgQVQgaW4gZ2VuZXJhbCBp cyAtLSBpdCBjb3VsZCBrZWVwIHRoZQo+IGZhaWxpbmcgY29kZSBBVCBhbmQganVzdCByZXBvcnQg dGhlIGVycm9yLikKClRoYXQgc2VlbXMgcmVhc29uYWJsZS4gSSB3aWxsIGNoYW5nZSBpdCB0byBv bmx5IHJlcG9ydCBBVCBzdXBwb3J0IHdoZW4KdGhlIEFUIGZpZWxkIHJlYWRzIGJhY2sgYXMgY29k ZSB3aXRoIHN0YXR1cyA9IHN1Y2Nlc3MuCgo+ID4gKwkJaWYgKGF0ID09IENCUVJJX0NPTlRST0xf UkVHSVNURVJTX0FUX0NPREUpCj4gPiArCQkJKmFjY2Vzc190eXBlX3N1cHBvcnRlZCA9IHRydWU7 Cj4gPiArCX0KPiA+ICsKPiA+ICsJLyoKPiA+ICsJICogUmVzdG9yZSB0aGUgb3JpZ2luYWwgcmVn aXN0ZXIgdmFsdWUuCj4gPiArCSAqIENsZWFyIE9QIHRvIGF2b2lkIHJlLXRyaWdnZXJpbmcgdGhl IHByb2JlIG9wLgo+ID4gKwkgKi8KPiA+ICsJc2F2ZWRfcmVnICY9IH5DQlFSSV9DT05UUk9MX1JF R0lTVEVSU19PUF9NQVNLOwo+ID4gKwl3cml0ZWwobG93ZXJfMzJfYml0cyhzYXZlZF9yZWcpLCBj dHJsLT5iYXNlICsgcmVnX29mZnNldCk7Cj4gCj4gSXQgd291bGQgYmUgYmV0dGVyIHRvIGRvIG5v dGhpbmcgdGhhbiB0cmlnZ2VyIGFuIGlsbGVnYWwgT1AuCj4gQWxsIG91ciB3cml0ZXMgc2hvdWxk IG1vZGlmeSB0aGUgbm9uLVdQUkkgYml0cyBhbnl3YXksIHNvIHJlc3RvcmluZyB0aGVtCj4gZG9l cyBub3RoaW5nLgoKSSBhZ3JlZS4gSSdsbCBkcm9wIHRoZSByZXN0b3JlIHdyaXRlLgoKPiA+ICsJ aWYgKGNicXJpX3dhaXRfYnVzeV9mbGFnKGN0cmwsIHJlZ19vZmZzZXQsIE5VTEwpIDwgMCkgewo+ ID4gKwkJcHJfZXJyKCJCVVNZIHRpbWVvdXQgcmVzdG9yaW5nIHJlZ2lzdGVyIHZhbHVlXG4iKTsK PiA+ICsJCXJldHVybiAtRUlPOwo+ID4gKwl9Cj4gPiArCj4gPiArCXJldHVybiAwOwo+ID4gK30K PiA+ICsKPiA+ICtzdGF0aWMgaW50IGNicXJpX3Byb2JlX2NjKHN0cnVjdCBjYnFyaV9jb250cm9s bGVyICpjdHJsKQo+ID4gK3sKPiA+IFsuLi5dCj4gPiArCj4gPiArCS8qCj4gPiArCSAqIFRoZSBk cml2ZXIgcHJvZ3JhbXMgdGhlIHYxLjAgcmVnaXN0ZXIgbGF5b3V0LiBDb250cm9sbGVycyB0aGF0 Cj4gPiArCSAqIHJlcG9ydCAwLnggZGlmZmVyIG9ubHkgaW4gY2FwYWJpbGl0eSBiaXRzIHRoYXQg cmVhZCBhcyB6ZXJvLCBzbwo+ID4gKwkgKiB0aGV5IGFyZSBhY2NlcHRlZC4gQW55dGhpbmcgbmV3 ZXIgdGhhbiAxLjAgbWF5IG1vdmUgZmllbGRzLgo+ID4gKwkgKi8KPiA+ICsJaWYgKHZlcl9tYWpv ciA+IDEgfHwgKHZlcl9tYWpvciA9PSAxICYmIHZlcl9taW5vciA+IDApKSB7Cj4gCj4gSSB0aGlu ayB3ZSBjb3VsZCBhY2NlcHQgdmVyX21ham9yID09IDEgZXZlbiB3aXRoIHZlcl9taW5vciA+IDAg c2luY2UgdGhlCj4gbWlub3Igc3BlY2lmaWNhdGlvbnMgc2hvdWxkbid0IGJlIGRvaW5nIGJhY2t3 YXJkLWluY29tcGF0aWJsZSBjaGFuZ2VzLgo+IAo+IChJZiB3ZSBmaXggdGhlIE9QPTAsIHdlIHNo b3VsZG4ndCBiZSBpbnZva2luZyBhbnkgb3RoZXIgYmVoYXZpb3IgdGhhdAo+ICBtaWdodCBjaGFu Z2UuKQoKR29vZCBwb2ludC4gSSdsbCBza2lwIHRoZSB2ZXJfbWlub3IgY2hlY2sgYW5kIHJlamVj dCB2ZXJfbWFqb3IgPiAxLgoKPiBJJ2QgYmUgbW9yZSBjYXJlZnVsIGFib3V0IGFjY2VwdGluZyBh bnl0aGluZyBwcmUtMS4wLCBzaW5jZSBJIHdvdWxkCj4gZXhwZWN0IHRoZXJlIHdhcyBhIGJyZWFr aW5nIGNoYW5nZSBpbiB0aGUgc3BlYyBzb21ld2hlcmUsIGFuZCB3ZSBjb3VsZAo+IHByb2dyYW0g aXQgaW5jb3JyZWN0bHkuLi4gIERvIHdlIGV2ZW4gY2FyZSBhYm91dCBwcmUtMS4wIGhhcmR3YXJl PwoKSSB3ZW50IHRocm91Z2ggdGhlIHRhZ2dlZCBkcmFmdHMgaW4gdGhlIHJpc2N2LWNicXJpIHJl cG8sIHYwLjkuMSB0aHJvdWdoCnYxLjAtcmMzLiBUaGUgcmVnaXN0ZXJzIGFuZCBlbmNvZGluZ3Mg dGhhdCB0aGlzIGRyaXZlciB1c2VzIGFyZSB0aGUgc2FtZQppbiBhbGwgb2YgdGhlbS4gUlBGWC9Q IHdlcmUgYWRkZWQgaW4gYml0cyB0aGF0IGhhZCBiZWVuIHJlc2VydmVkLgoKSWYgSSBhZGQgdGhh dCBpbmZvcm1hdGlvbiB0byB0aGUgY29tbWVudCwgdGhlbiB3b3VsZCB0aGF0IGJlIGFjY2VwdGFi bGUKdG8geW91PwoKVGhhbmtzLApEcmV3CgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fXwpsaW51eC1yaXNjdiBtYWlsaW5nIGxpc3QKbGludXgtcmlzY3ZAbGlz dHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3Rp bmZvL2xpbnV4LXJpc2N2Cg==