From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from Atcsqr.andestech.com (60-248-80-70.hinet-ip.hinet.net [60.248.80.70]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id ED73A12B7D; Tue, 19 Dec 2023 07:45:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=andestech.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=andestech.com Received: from mail.andestech.com (ATCPCS16.andestech.com [10.0.1.222]) by Atcsqr.andestech.com with ESMTP id 3BJ7hYaZ012432; Tue, 19 Dec 2023 15:43:34 +0800 (+08) (envelope-from peterlin@andestech.com) Received: from APC323 (10.0.12.98) by ATCPCS16.andestech.com (10.0.1.222) with Microsoft SMTP Server id 14.3.498.0; Tue, 19 Dec 2023 15:43:32 +0800 Date: Tue, 19 Dec 2023 15:43:29 +0800 From: Yu-Chien Peter Lin To: Anup Patel CC: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , Subject: Re: [PATCH v5 02/16] irqchip/riscv-intc: Allow large non-standard interrupt number Message-ID: References: <20231213070301.1684751-1-peterlin@andestech.com> <20231213070301.1684751-3-peterlin@andestech.com> Precedence: bulk X-Mailing-List: linux-perf-users@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: User-Agent: Mutt/2.2.12 (2023-09-09) X-DNSRBL: X-SPAM-SOURCE-CHECK: pass X-MAIL:Atcsqr.andestech.com 3BJ7hYaZ012432 Hi Anup, On Wed, Dec 13, 2023 at 08:49:23PM +0530, Anup Patel wrote: > On Wed, Dec 13, 2023 at 7:58 PM Anup Patel wrote: > > > > On Wed, Dec 13, 2023 at 12:34 PM Yu Chien Peter Lin > > wrote: > > > > > > Currently, the implementation of the RISC-V INTC driver uses the > > > interrupt cause as hardware interrupt number and has a limitation of > > > supporting a maximum of 64 interrupts. However, according to the > > > privileged spec, interrupt causes >= 16 are defined for platform use. > > > > I disagree with this patch. > > > > Even though RISC-V priv sepc allows interrupt causes >= 16, we > > still need CSRs to manage arbitrary local interrupts > > > > Currently, we have following standard CSRs: > > 1) [m|s]ie and [m|s]ip which are XLEN wide > > 2) With AIA, we have [m|s]ieh and [m|s]iph for RV32 > > > > Clearly, we can only have a XLEN number of standard local > > interrupts without AIA and 64 local interrupts with AIA. > > > > Now for implementations with custom CSRs (such as Andes), > > we still can't assume infinite local interrupts because HW will > > have a finite number of custom CSRs. > > > > > > > > This limitation prevents to fully utilize the available local interrupt > > > sources. Additionally, the interrupt number used on RISC-V are sparse, > > > with only interrupt numbers 1, 5 and 9 (plus Sscofpmf or T-Head's PMU > > > interrupt) being currently used for supervisor mode. > > > > > > Switch to using irq_domain_create_tree() to create the radix tree > > > map, so a larger number of hardware interrupts can be handled. > > > > > > Signed-off-by: Yu Chien Peter Lin > > > Reviewed-by: Charles Ci-Jyun Wu > > > Reviewed-by: Leo Yu-Chi Liang > > > --- > > > Changes v1 -> v2: > > > - Fixed irq mapping failure checking (suggested by Clément and Anup) > > > Changes v2 -> v3: > > > - No change > > > Changes v3 -> v4: (Suggested by Thomas [1]) > > > - Use pr_warn_ratelimited instead > > > - Fix coding style and commit message > > > Changes v4 -> v5: (Suggested by Thomas) > > > - Fix commit message > > > > > > [1] https://patchwork.kernel.org/project/linux-riscv/patch/20231023004100.2663486-3-peterlin@andestech.com/#25573085 > > > --- > > > drivers/irqchip/irq-riscv-intc.c | 12 ++++-------- > > > 1 file changed, 4 insertions(+), 8 deletions(-) > > > > > > diff --git a/drivers/irqchip/irq-riscv-intc.c b/drivers/irqchip/irq-riscv-intc.c > > > index e8d01b14ccdd..2fdd40f2a791 100644 > > > --- a/drivers/irqchip/irq-riscv-intc.c > > > +++ b/drivers/irqchip/irq-riscv-intc.c > > > @@ -24,10 +24,9 @@ static asmlinkage void riscv_intc_irq(struct pt_regs *regs) > > > { > > > unsigned long cause = regs->cause & ~CAUSE_IRQ_FLAG; > > > > > > - if (unlikely(cause >= BITS_PER_LONG)) > > > - panic("unexpected interrupt cause"); > > > - > > > - generic_handle_domain_irq(intc_domain, cause); > > > + if (generic_handle_domain_irq(intc_domain, cause)) > > > + pr_warn_ratelimited("Failed to handle interrupt (cause: %ld)\n", > > > + cause); > > > } > > > > > > /* > > > @@ -117,8 +116,7 @@ static int __init riscv_intc_init_common(struct fwnode_handle *fn) > > > { > > > int rc; > > > > > > - intc_domain = irq_domain_create_linear(fn, BITS_PER_LONG, > > > - &riscv_intc_domain_ops, NULL); > > > + intc_domain = irq_domain_create_tree(fn, &riscv_intc_domain_ops, NULL); > > > > I disagree with this change based on the reasoning above. > > > > Instead of this, we should determine the number of local interrupts > > based on the type of RISC-V intc: > > 1) For standard INTC without AIA, we have XLEN (or BITS_PER_LONG) > > local interrupts > > 2) For standart INTC with AIA, we have 64 local interrupts > > 3) For custom INTC (such as Andes), the number of local interrupt > > should be custom (Andes specific) which can be determined based > > on compatible string. > > > > Also, creating a linear domain with a fixed number of local interrupts > > ensures that drivers can't map a local interrupt beyond the availability > > of CSRs to manage it. > > Thinking about this more. We do have a problem because Andes local > interrupts are really sparse which is not the case for standard local > interrupts > > I have an alternate suggestion which goes as follows ... > > We use irq_domain_create_tree() in-place of irq_domain_create_linear() > and enforce checks on hwirq in riscv_intc_domain_alloc() to ensure that > we only allow hwirq for which we have corresponding standard or custom > CSR. > > To achieve this, riscv_intc_init_common() will have to save the following > as static global variables: > 1) riscv_intc_nr_irqs: Number of standard local interrupts > 2) riscv_intc_custom_base and riscv_intc_custom_nr_irqs: Base and > number of custom local interrupts. > > Using the above static global variables, the riscv_intc_domain_alloc() > can return error if one of the following conditions are met: > 1) riscv_intc_nr_irqs<= hwirq && hwirq < riscv_intc_custom_base > 2) (riscv_intc_custom_base + riscv_intc_custom_nr_irqs) <= hwirq > > For standard INTC, we can set the static global variable as follows: > riscv_intc_nr_irqs = XLEN or BITS_PER_LONG > riscv_intc_custom_base = riscv_intc_nr_irqs > riscv_intc_custom_nr_irqs = 0 > > For Andes INTC, we can set the static global variables as follows: > riscv_intc_nr_irqs = XLEN or BITS_PER_LONG > riscv_intc_custom_base = 256 > riscv_intc_custom_nr_irqs = XLEN or BITS_PER_LONG > > Regards, > Anup Thank you for offering your help on this. I will rework the patch accordingly. Best regards, Peter Lin > > > > > if (!intc_domain) { > > > pr_err("unable to add IRQ domain\n"); > > > return -ENXIO; > > > @@ -132,8 +130,6 @@ static int __init riscv_intc_init_common(struct fwnode_handle *fn) > > > > > > riscv_set_intc_hwnode_fn(riscv_intc_hwnode); > > > > > > - pr_info("%d local interrupts mapped\n", BITS_PER_LONG); > > > - > > > > Same as above, we should definitely advertise the type of INTC and > > number of local interrupts mapped. > > > > Regards, > > Anup > > > > > return 0; > > > } > > > > > > -- > > > 2.34.1 > > > > > > > > > _______________________________________________ > > > linux-riscv mailing list > > > linux-riscv@lists.infradead.org > > > http://lists.infradead.org/mailman/listinfo/linux-riscv 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 42C1CC41535 for ; Tue, 19 Dec 2023 07:45: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:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:References: Message-ID:Subject: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=Pm4PSs0LcjFHB4LwjqhdOtY+fOYMugWI/kiZhPCQszk=; b=HS8J/xjqQQQg7o W9V/5+gvx/Zol/WMWhfDiw3f+AdH7dX02DP5XY5Vh3S1myp9uYP2hZnH9CRixxDHTV7MHckXYWDIW uZa6tDM2FlZdnefJA2GXy98GRL3qolmpSagEbbw8MLHuX1NjPVfDe/xRSUs1qZEOLEq9tvwftXSWZ Bkj+NL0WYEWjjAaTHVgsP6zQHYUpjANRNxIGT5CmDdpZXYRO9o281O8NwUbLVFv0y+URIcwHsWikV u7Ye+fsWZzumRVbLZPqDOwb/2zwKdC3AqtYb0PZIHocIfuuZwAMsobGv9ywwxopKndyutytW3AhVe vImF+jw0AYN/SzZFZ50A==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1rFUmz-00D8qT-2C; Tue, 19 Dec 2023 07:45:17 +0000 Received: from 60-248-80-70.hinet-ip.hinet.net ([60.248.80.70] helo=Atcsqr.andestech.com) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1rFUmu-00D8nw-1Y; Tue, 19 Dec 2023 07:45:14 +0000 Received: from mail.andestech.com (ATCPCS16.andestech.com [10.0.1.222]) by Atcsqr.andestech.com with ESMTP id 3BJ7hYaZ012432; Tue, 19 Dec 2023 15:43:34 +0800 (+08) (envelope-from peterlin@andestech.com) Received: from APC323 (10.0.12.98) by ATCPCS16.andestech.com (10.0.1.222) with Microsoft SMTP Server id 14.3.498.0; Tue, 19 Dec 2023 15:43:32 +0800 Date: Tue, 19 Dec 2023 15:43:29 +0800 From: Yu-Chien Peter Lin To: Anup Patel Subject: Re: [PATCH v5 02/16] irqchip/riscv-intc: Allow large non-standard interrupt number Message-ID: References: <20231213070301.1684751-1-peterlin@andestech.com> <20231213070301.1684751-3-peterlin@andestech.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: User-Agent: Mutt/2.2.12 (2023-09-09) X-Originating-IP: [10.0.12.98] X-DNSRBL: X-MAIL: Atcsqr.andestech.com 3BJ7hYaZ012432 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20231218_234512_975986_78616EC4 X-CRM114-Status: GOOD ( 42.98 ) 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: , Cc: mark.rutland@arm.com, irogers@google.com, heiko@sntech.de, geert+renesas@glider.be, alexander.shishkin@linux.intel.com, paul.walmsley@sifive.com, linux-kernel@vger.kernel.org, conor.dooley@microchip.com, guoren@kernel.org, krzysztof.kozlowski+dt@linaro.org, linux-riscv@lists.infradead.org, will@kernel.org, linux-renesas-soc@vger.kernel.org, tim609@andestech.com, samuel@sholland.org, anup@brainfault.org, dminus@andestech.com, magnus.damm@gmail.com, jernej.skrabec@gmail.com, peterz@infradead.org, wens@csie.org, mingo@redhat.com, linux-arm-kernel@lists.infradead.org, inochiama@outlook.com, linux-sunxi@lists.linux.dev, ajones@ventanamicro.com, devicetree@vger.kernel.org, conor+dt@kernel.org, aou@eecs.berkeley.edu, andre.przywara@arm.com, locus84@andestech.com, acme@kernel.org, prabhakar.mahadev-lad.rj@bp.renesas.com, robh+dt@kernel.org, atishp@atishpatra.org, namhyung@kernel.org, tglx@linutronix.de, jszhang@kernel.org, ycliang@andestech.com, n.shubin@yadro.com, rdunlap@infradead.org, adrian.hunter@intel.com, conor@kernel.org, linux-perf-users@vger.kernel.org, evan@rivosinc.com, palmer@dabbelt.com, jolsa@kernel.org 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 SGkgQW51cCwKCk9uIFdlZCwgRGVjIDEzLCAyMDIzIGF0IDA4OjQ5OjIzUE0gKzA1MzAsIEFudXAg UGF0ZWwgd3JvdGU6Cj4gT24gV2VkLCBEZWMgMTMsIDIwMjMgYXQgNzo1OOKAr1BNIEFudXAgUGF0 ZWwgPGFwYXRlbEB2ZW50YW5hbWljcm8uY29tPiB3cm90ZToKPiA+Cj4gPiBPbiBXZWQsIERlYyAx MywgMjAyMyBhdCAxMjozNOKAr1BNIFl1IENoaWVuIFBldGVyIExpbgo+ID4gPHBldGVybGluQGFu ZGVzdGVjaC5jb20+IHdyb3RlOgo+ID4gPgo+ID4gPiBDdXJyZW50bHksIHRoZSBpbXBsZW1lbnRh dGlvbiBvZiB0aGUgUklTQy1WIElOVEMgZHJpdmVyIHVzZXMgdGhlCj4gPiA+IGludGVycnVwdCBj YXVzZSBhcyBoYXJkd2FyZSBpbnRlcnJ1cHQgbnVtYmVyIGFuZCBoYXMgYSBsaW1pdGF0aW9uIG9m Cj4gPiA+IHN1cHBvcnRpbmcgYSBtYXhpbXVtIG9mIDY0IGludGVycnVwdHMuIEhvd2V2ZXIsIGFj Y29yZGluZyB0byB0aGUKPiA+ID4gcHJpdmlsZWdlZCBzcGVjLCBpbnRlcnJ1cHQgY2F1c2VzID49 IDE2IGFyZSBkZWZpbmVkIGZvciBwbGF0Zm9ybSB1c2UuCj4gPgo+ID4gSSBkaXNhZ3JlZSB3aXRo IHRoaXMgcGF0Y2guCj4gPgo+ID4gRXZlbiB0aG91Z2ggUklTQy1WIHByaXYgc2VwYyBhbGxvd3Mg aW50ZXJydXB0IGNhdXNlcyA+PSAxNiwgd2UKPiA+IHN0aWxsIG5lZWQgQ1NScyB0byBtYW5hZ2Ug YXJiaXRyYXJ5IGxvY2FsIGludGVycnVwdHMKPiA+Cj4gPiBDdXJyZW50bHksIHdlIGhhdmUgZm9s bG93aW5nIHN0YW5kYXJkIENTUnM6Cj4gPiAxKSBbbXxzXWllIGFuZCBbbXxzXWlwIHdoaWNoIGFy ZSBYTEVOIHdpZGUKPiA+IDIpIFdpdGggQUlBLCB3ZSBoYXZlIFttfHNdaWVoIGFuZCBbbXxzXWlw aCBmb3IgUlYzMgo+ID4KPiA+IENsZWFybHksIHdlIGNhbiBvbmx5IGhhdmUgYSBYTEVOIG51bWJl ciBvZiBzdGFuZGFyZCBsb2NhbAo+ID4gaW50ZXJydXB0cyB3aXRob3V0IEFJQSBhbmQgNjQgbG9j YWwgaW50ZXJydXB0cyB3aXRoIEFJQS4KPiA+Cj4gPiBOb3cgZm9yIGltcGxlbWVudGF0aW9ucyB3 aXRoIGN1c3RvbSBDU1JzIChzdWNoIGFzIEFuZGVzKSwKPiA+IHdlIHN0aWxsIGNhbid0IGFzc3Vt ZSBpbmZpbml0ZSBsb2NhbCBpbnRlcnJ1cHRzIGJlY2F1c2UgSFcgd2lsbAo+ID4gaGF2ZSBhIGZp bml0ZSBudW1iZXIgb2YgY3VzdG9tIENTUnMuCj4gPgo+ID4gPgo+ID4gPiBUaGlzIGxpbWl0YXRp b24gcHJldmVudHMgdG8gZnVsbHkgdXRpbGl6ZSB0aGUgYXZhaWxhYmxlIGxvY2FsIGludGVycnVw dAo+ID4gPiBzb3VyY2VzLiBBZGRpdGlvbmFsbHksIHRoZSBpbnRlcnJ1cHQgbnVtYmVyIHVzZWQg b24gUklTQy1WIGFyZSBzcGFyc2UsCj4gPiA+IHdpdGggb25seSBpbnRlcnJ1cHQgbnVtYmVycyAx LCA1IGFuZCA5IChwbHVzIFNzY29mcG1mIG9yIFQtSGVhZCdzIFBNVQo+ID4gPiBpbnRlcnJ1cHQp IGJlaW5nIGN1cnJlbnRseSB1c2VkIGZvciBzdXBlcnZpc29yIG1vZGUuCj4gPiA+Cj4gPiA+IFN3 aXRjaCB0byB1c2luZyBpcnFfZG9tYWluX2NyZWF0ZV90cmVlKCkgdG8gY3JlYXRlIHRoZSByYWRp eCB0cmVlCj4gPiA+IG1hcCwgc28gYSBsYXJnZXIgbnVtYmVyIG9mIGhhcmR3YXJlIGludGVycnVw dHMgY2FuIGJlIGhhbmRsZWQuCj4gPiA+Cj4gPiA+IFNpZ25lZC1vZmYtYnk6IFl1IENoaWVuIFBl dGVyIExpbiA8cGV0ZXJsaW5AYW5kZXN0ZWNoLmNvbT4KPiA+ID4gUmV2aWV3ZWQtYnk6IENoYXJs ZXMgQ2ktSnl1biBXdSA8ZG1pbnVzQGFuZGVzdGVjaC5jb20+Cj4gPiA+IFJldmlld2VkLWJ5OiBM ZW8gWXUtQ2hpIExpYW5nIDx5Y2xpYW5nQGFuZGVzdGVjaC5jb20+Cj4gPiA+IC0tLQo+ID4gPiBD aGFuZ2VzIHYxIC0+IHYyOgo+ID4gPiAgIC0gRml4ZWQgaXJxIG1hcHBpbmcgZmFpbHVyZSBjaGVj a2luZyAoc3VnZ2VzdGVkIGJ5IENsw6ltZW50IGFuZCBBbnVwKQo+ID4gPiBDaGFuZ2VzIHYyIC0+ IHYzOgo+ID4gPiAgIC0gTm8gY2hhbmdlCj4gPiA+IENoYW5nZXMgdjMgLT4gdjQ6IChTdWdnZXN0 ZWQgYnkgVGhvbWFzIFsxXSkKPiA+ID4gICAtIFVzZSBwcl93YXJuX3JhdGVsaW1pdGVkIGluc3Rl YWQKPiA+ID4gICAtIEZpeCBjb2Rpbmcgc3R5bGUgYW5kIGNvbW1pdCBtZXNzYWdlCj4gPiA+IENo YW5nZXMgdjQgLT4gdjU6IChTdWdnZXN0ZWQgYnkgVGhvbWFzKQo+ID4gPiAgIC0gRml4IGNvbW1p dCBtZXNzYWdlCj4gPiA+Cj4gPiA+IFsxXSBodHRwczovL3BhdGNod29yay5rZXJuZWwub3JnL3By b2plY3QvbGludXgtcmlzY3YvcGF0Y2gvMjAyMzEwMjMwMDQxMDAuMjY2MzQ4Ni0zLXBldGVybGlu QGFuZGVzdGVjaC5jb20vIzI1NTczMDg1Cj4gPiA+IC0tLQo+ID4gPiAgZHJpdmVycy9pcnFjaGlw L2lycS1yaXNjdi1pbnRjLmMgfCAxMiArKysrLS0tLS0tLS0KPiA+ID4gIDEgZmlsZSBjaGFuZ2Vk LCA0IGluc2VydGlvbnMoKyksIDggZGVsZXRpb25zKC0pCj4gPiA+Cj4gPiA+IGRpZmYgLS1naXQg YS9kcml2ZXJzL2lycWNoaXAvaXJxLXJpc2N2LWludGMuYyBiL2RyaXZlcnMvaXJxY2hpcC9pcnEt cmlzY3YtaW50Yy5jCj4gPiA+IGluZGV4IGU4ZDAxYjE0Y2NkZC4uMmZkZDQwZjJhNzkxIDEwMDY0 NAo+ID4gPiAtLS0gYS9kcml2ZXJzL2lycWNoaXAvaXJxLXJpc2N2LWludGMuYwo+ID4gPiArKysg Yi9kcml2ZXJzL2lycWNoaXAvaXJxLXJpc2N2LWludGMuYwo+ID4gPiBAQCAtMjQsMTAgKzI0LDkg QEAgc3RhdGljIGFzbWxpbmthZ2Ugdm9pZCByaXNjdl9pbnRjX2lycShzdHJ1Y3QgcHRfcmVncyAq cmVncykKPiA+ID4gIHsKPiA+ID4gICAgICAgICB1bnNpZ25lZCBsb25nIGNhdXNlID0gcmVncy0+ Y2F1c2UgJiB+Q0FVU0VfSVJRX0ZMQUc7Cj4gPiA+Cj4gPiA+IC0gICAgICAgaWYgKHVubGlrZWx5 KGNhdXNlID49IEJJVFNfUEVSX0xPTkcpKQo+ID4gPiAtICAgICAgICAgICAgICAgcGFuaWMoInVu ZXhwZWN0ZWQgaW50ZXJydXB0IGNhdXNlIik7Cj4gPiA+IC0KPiA+ID4gLSAgICAgICBnZW5lcmlj X2hhbmRsZV9kb21haW5faXJxKGludGNfZG9tYWluLCBjYXVzZSk7Cj4gPiA+ICsgICAgICAgaWYg KGdlbmVyaWNfaGFuZGxlX2RvbWFpbl9pcnEoaW50Y19kb21haW4sIGNhdXNlKSkKPiA+ID4gKyAg ICAgICAgICAgICAgIHByX3dhcm5fcmF0ZWxpbWl0ZWQoIkZhaWxlZCB0byBoYW5kbGUgaW50ZXJy dXB0IChjYXVzZTogJWxkKVxuIiwKPiA+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgY2F1c2UpOwo+ID4gPiAgfQo+ID4gPgo+ID4gPiAgLyoKPiA+ID4gQEAgLTExNyw4ICsx MTYsNyBAQCBzdGF0aWMgaW50IF9faW5pdCByaXNjdl9pbnRjX2luaXRfY29tbW9uKHN0cnVjdCBm d25vZGVfaGFuZGxlICpmbikKPiA+ID4gIHsKPiA+ID4gICAgICAgICBpbnQgcmM7Cj4gPiA+Cj4g PiA+IC0gICAgICAgaW50Y19kb21haW4gPSBpcnFfZG9tYWluX2NyZWF0ZV9saW5lYXIoZm4sIEJJ VFNfUEVSX0xPTkcsCj4gPiA+IC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgJnJpc2N2X2ludGNfZG9tYWluX29wcywgTlVMTCk7Cj4gPiA+ICsgICAgICAgaW50 Y19kb21haW4gPSBpcnFfZG9tYWluX2NyZWF0ZV90cmVlKGZuLCAmcmlzY3ZfaW50Y19kb21haW5f b3BzLCBOVUxMKTsKPiA+Cj4gPiBJIGRpc2FncmVlIHdpdGggdGhpcyBjaGFuZ2UgYmFzZWQgb24g dGhlIHJlYXNvbmluZyBhYm92ZS4KPiA+Cj4gPiBJbnN0ZWFkIG9mIHRoaXMsIHdlIHNob3VsZCBk ZXRlcm1pbmUgdGhlIG51bWJlciBvZiBsb2NhbCBpbnRlcnJ1cHRzCj4gPiBiYXNlZCBvbiB0aGUg dHlwZSBvZiBSSVNDLVYgaW50YzoKPiA+IDEpIEZvciBzdGFuZGFyZCBJTlRDIHdpdGhvdXQgQUlB LCB3ZSBoYXZlIFhMRU4gKG9yIEJJVFNfUEVSX0xPTkcpCj4gPiAgICAgbG9jYWwgaW50ZXJydXB0 cwo+ID4gMikgRm9yIHN0YW5kYXJ0IElOVEMgd2l0aCBBSUEsIHdlIGhhdmUgNjQgbG9jYWwgaW50 ZXJydXB0cwo+ID4gMykgRm9yIGN1c3RvbSBJTlRDIChzdWNoIGFzIEFuZGVzKSwgdGhlIG51bWJl ciBvZiBsb2NhbCBpbnRlcnJ1cHQKPiA+ICAgICBzaG91bGQgYmUgY3VzdG9tIChBbmRlcyBzcGVj aWZpYykgd2hpY2ggY2FuIGJlIGRldGVybWluZWQgYmFzZWQKPiA+ICAgICBvbiBjb21wYXRpYmxl IHN0cmluZy4KPiA+Cj4gPiBBbHNvLCBjcmVhdGluZyBhIGxpbmVhciBkb21haW4gd2l0aCBhIGZp eGVkIG51bWJlciBvZiBsb2NhbCBpbnRlcnJ1cHRzCj4gPiBlbnN1cmVzIHRoYXQgZHJpdmVycyBj YW4ndCBtYXAgYSBsb2NhbCBpbnRlcnJ1cHQgYmV5b25kIHRoZSBhdmFpbGFiaWxpdHkKPiA+IG9m IENTUnMgdG8gbWFuYWdlIGl0Lgo+IAo+IFRoaW5raW5nIGFib3V0IHRoaXMgbW9yZS4gV2UgZG8g aGF2ZSBhIHByb2JsZW0gYmVjYXVzZSBBbmRlcyBsb2NhbAo+IGludGVycnVwdHMgYXJlIHJlYWxs eSBzcGFyc2Ugd2hpY2ggaXMgbm90IHRoZSBjYXNlIGZvciBzdGFuZGFyZCBsb2NhbAo+IGludGVy cnVwdHMKPiAKPiBJIGhhdmUgYW4gYWx0ZXJuYXRlIHN1Z2dlc3Rpb24gd2hpY2ggZ29lcyBhcyBm b2xsb3dzIC4uLgo+IAo+IFdlIHVzZSBpcnFfZG9tYWluX2NyZWF0ZV90cmVlKCkgaW4tcGxhY2Ug b2YgaXJxX2RvbWFpbl9jcmVhdGVfbGluZWFyKCkKPiBhbmQgZW5mb3JjZSBjaGVja3Mgb24gaHdp cnEgaW4gcmlzY3ZfaW50Y19kb21haW5fYWxsb2MoKSB0byBlbnN1cmUgdGhhdAo+IHdlIG9ubHkg YWxsb3cgaHdpcnEgZm9yIHdoaWNoIHdlIGhhdmUgY29ycmVzcG9uZGluZyBzdGFuZGFyZCBvciBj dXN0b20KPiBDU1IuCj4gCj4gVG8gYWNoaWV2ZSB0aGlzLCByaXNjdl9pbnRjX2luaXRfY29tbW9u KCkgd2lsbCBoYXZlIHRvIHNhdmUgdGhlIGZvbGxvd2luZwo+IGFzIHN0YXRpYyBnbG9iYWwgdmFy aWFibGVzOgo+IDEpIHJpc2N2X2ludGNfbnJfaXJxczogTnVtYmVyIG9mIHN0YW5kYXJkIGxvY2Fs IGludGVycnVwdHMKPiAyKSByaXNjdl9pbnRjX2N1c3RvbV9iYXNlIGFuZCByaXNjdl9pbnRjX2N1 c3RvbV9ucl9pcnFzOiBCYXNlIGFuZAo+ICAgICBudW1iZXIgb2YgY3VzdG9tIGxvY2FsIGludGVy cnVwdHMuCj4gCj4gVXNpbmcgdGhlIGFib3ZlIHN0YXRpYyBnbG9iYWwgdmFyaWFibGVzLCB0aGUg cmlzY3ZfaW50Y19kb21haW5fYWxsb2MoKQo+IGNhbiByZXR1cm4gZXJyb3IgaWYgb25lIG9mIHRo ZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0Ogo+IDEpIHJpc2N2X2ludGNfbnJfaXJxczw9 IGh3aXJxICYmIGh3aXJxIDwgcmlzY3ZfaW50Y19jdXN0b21fYmFzZQo+IDIpIChyaXNjdl9pbnRj X2N1c3RvbV9iYXNlICsgcmlzY3ZfaW50Y19jdXN0b21fbnJfaXJxcykgPD0gaHdpcnEKPiAKPiBG b3Igc3RhbmRhcmQgSU5UQywgd2UgY2FuIHNldCB0aGUgc3RhdGljIGdsb2JhbCB2YXJpYWJsZSBh cyBmb2xsb3dzOgo+IHJpc2N2X2ludGNfbnJfaXJxcyA9IFhMRU4gb3IgQklUU19QRVJfTE9ORwo+ IHJpc2N2X2ludGNfY3VzdG9tX2Jhc2UgPSByaXNjdl9pbnRjX25yX2lycXMKPiByaXNjdl9pbnRj X2N1c3RvbV9ucl9pcnFzID0gMAo+IAo+IEZvciBBbmRlcyBJTlRDLCB3ZSBjYW4gc2V0IHRoZSBz dGF0aWMgZ2xvYmFsIHZhcmlhYmxlcyBhcyBmb2xsb3dzOgo+IHJpc2N2X2ludGNfbnJfaXJxcyA9 IFhMRU4gb3IgQklUU19QRVJfTE9ORwo+IHJpc2N2X2ludGNfY3VzdG9tX2Jhc2UgPSAyNTYKPiBy aXNjdl9pbnRjX2N1c3RvbV9ucl9pcnFzID0gWExFTiBvciBCSVRTX1BFUl9MT05HCj4gCj4gUmVn YXJkcywKPiBBbnVwCgpUaGFuayB5b3UgZm9yIG9mZmVyaW5nIHlvdXIgaGVscCBvbiB0aGlzLgpJ IHdpbGwgcmV3b3JrIHRoZSBwYXRjaCBhY2NvcmRpbmdseS4KCkJlc3QgcmVnYXJkcywKUGV0ZXIg TGluCgo+ID4KPiA+ID4gICAgICAgICBpZiAoIWludGNfZG9tYWluKSB7Cj4gPiA+ICAgICAgICAg ICAgICAgICBwcl9lcnIoInVuYWJsZSB0byBhZGQgSVJRIGRvbWFpblxuIik7Cj4gPiA+ICAgICAg ICAgICAgICAgICByZXR1cm4gLUVOWElPOwo+ID4gPiBAQCAtMTMyLDggKzEzMCw2IEBAIHN0YXRp YyBpbnQgX19pbml0IHJpc2N2X2ludGNfaW5pdF9jb21tb24oc3RydWN0IGZ3bm9kZV9oYW5kbGUg KmZuKQo+ID4gPgo+ID4gPiAgICAgICAgIHJpc2N2X3NldF9pbnRjX2h3bm9kZV9mbihyaXNjdl9p bnRjX2h3bm9kZSk7Cj4gPiA+Cj4gPiA+IC0gICAgICAgcHJfaW5mbygiJWQgbG9jYWwgaW50ZXJy dXB0cyBtYXBwZWRcbiIsIEJJVFNfUEVSX0xPTkcpOwo+ID4gPiAtCj4gPgo+ID4gU2FtZSBhcyBh Ym92ZSwgd2Ugc2hvdWxkIGRlZmluaXRlbHkgYWR2ZXJ0aXNlIHRoZSB0eXBlIG9mIElOVEMgYW5k Cj4gPiBudW1iZXIgb2YgbG9jYWwgaW50ZXJydXB0cyBtYXBwZWQuCj4gPgo+ID4gUmVnYXJkcywK PiA+IEFudXAKPiA+Cj4gPiA+ICAgICAgICAgcmV0dXJuIDA7Cj4gPiA+ICB9Cj4gPiA+Cj4gPiA+ IC0tCj4gPiA+IDIuMzQuMQo+ID4gPgo+ID4gPgo+ID4gPiBfX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fXwo+ID4gPiBsaW51eC1yaXNjdiBtYWlsaW5nIGxpc3QK PiA+ID4gbGludXgtcmlzY3ZAbGlzdHMuaW5mcmFkZWFkLm9yZwo+ID4gPiBodHRwOi8vbGlzdHMu aW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LXJpc2N2CgpfX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpsaW51eC1yaXNjdiBtYWlsaW5nIGxp c3QKbGludXgtcmlzY3ZAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFk Lm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LXJpc2N2Cg==