From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 2CFB926AC5; Sat, 9 Mar 2024 10:33:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709980408; cv=none; b=Cv4ciaMJzh2LUq/zIsgIjrXyr57erUG7fH7eLC+vxFTGUpYf8+cRY2KAiQkOwYtmBL8YXdG5/CB0UvzwxFuudBNsWcU5YRdpB76XSsX5+OgRchDp6Ksb3femRt+hbdMOQZivg4NcC4wA9g6L21d9+ZWVMNUO/J6GDGUMuaBOt9k= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709980408; c=relaxed/simple; bh=ep80T4R3DsChFlCxVs40oKoocVSvRg0xEN7d7U/tIbo=; h=Date:Message-ID:From:To:Cc:Subject:In-Reply-To:References: MIME-Version:Content-Type; b=NHycoTwNQogjPm7AjfcYl34QiVJTdbFgoy6jCweAZjTFAQFsE2l8Vgnmsd62GjMcNYaA9gSyddKOWX8s+J8/MJ15WOeqAa+p87VAISs3ae1VOrcTtBvEL49tBBrRwQQAwANQlQXEP2K+nc52YAi5BZNZDF446VanwYzAQK3wjI0= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=KrmXG+T1; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="KrmXG+T1" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 7E1CCC433C7; Sat, 9 Mar 2024 10:33:27 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1709980407; bh=ep80T4R3DsChFlCxVs40oKoocVSvRg0xEN7d7U/tIbo=; h=Date:From:To:Cc:Subject:In-Reply-To:References:From; b=KrmXG+T15xq3cHjLexInxaHKvv7nQHc4nVfoQeFwC9C5CIKv3SG9hwz1HCKO4e8zZ y4dH4ErV1XuGC0zjuIdaXbPzooGVe6DIV4fN6WoT2A60aNMeBtQHdglR3VI0ipu3oV vXRQFRFJs8Lu+lZWG4/KbydkKnOPnwLnvuo2J3WMfqjqNJKp6tWHrZpPucsj1yL1S4 TdW7zjJxwTjv799dA9v7LwjE5OaEdc17Weq9gbG/aRuu/FMJUd4uPdXvK+B6FJmfLg ban7vmFsKfrm02sEGCibboTqgd4Ouvg6RpX8hJQEIdo+VGl+ATCFnC8rHiILYtqOOv w2OxHiQaa6siw== Received: from sofa.misterjones.org ([185.219.108.64] helo=wait-a-minute.misterjones.org) by disco-boy.misterjones.org with esmtpsa (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.95) (envelope-from ) id 1riu17-00Ay3W-63; Sat, 09 Mar 2024 10:33:25 +0000 Date: Sat, 09 Mar 2024 10:33:18 +0000 Message-ID: <8734szr8y9.wl-maz@kernel.org> From: Marc Zyngier To: Ruidong Tian Cc: catalin.marinas@arm.com, will@kernel.org, lpieralisi@kernel.org, guohanjun@huawei.com, sudeep.holla@arm.com, xueshuai@linux.alibaba.com, baolin.wang@linux.alibaba.com, linux-kernel@vger.kernel.org, linux-acpi@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Tyler Baicar Subject: Re: [PATCH 1/2] ACPI/AEST: Initial AEST driver In-Reply-To: References: <20240304111517.33001-1-tianruidong@linux.alibaba.com> <20240304111517.33001-2-tianruidong@linux.alibaba.com> <86wmqi19pg.wl-maz@kernel.org> User-Agent: Wanderlust/2.15.9 (Almost Unreal) SEMI-EPG/1.14.7 (Harue) FLIM-LB/1.14.9 (=?UTF-8?B?R29qxY0=?=) APEL-LB/10.8 EasyPG/1.0.0 Emacs/28.2 (x86_64-pc-linux-gnu) MULE/6.0 (HANACHIRUSATO) Precedence: bulk X-Mailing-List: linux-acpi@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 (generated by SEMI-EPG 1.14.7 - "Harue") Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable X-SA-Exim-Connect-IP: 185.219.108.64 X-SA-Exim-Rcpt-To: tianruidong@linux.alibaba.com, catalin.marinas@arm.com, will@kernel.org, lpieralisi@kernel.org, guohanjun@huawei.com, sudeep.holla@arm.com, xueshuai@linux.alibaba.com, baolin.wang@linux.alibaba.com, linux-kernel@vger.kernel.org, linux-acpi@vger.kernel.org, linux-arm-kernel@lists.infradead.org, baicar@os.amperecomputing.com X-SA-Exim-Mail-From: maz@kernel.org X-SA-Exim-Scanned: No (on disco-boy.misterjones.org); SAEximRunCond expanded to false On Fri, 08 Mar 2024 03:43:30 +0000, Ruidong Tian wrote: >=20 > =E5=9C=A8 2024/3/4 20:07, Marc Zyngier =E5=86=99=E9=81=93: > > On Mon, 04 Mar 2024 11:15:16 +0000, > > Ruidong Tian wrote: > >> diff --git a/arch/arm64/include/asm/ras.h b/arch/arm64/include/asm/ras= .h > >> new file mode 100644 > >> index 000000000000..2fb0d9741567 > >> --- /dev/null > >> +++ b/arch/arm64/include/asm/ras.h > >> @@ -0,0 +1,38 @@ > >> +/* SPDX-License-Identifier: GPL-2.0 */ > >> +#ifndef __ASM_RAS_H > >> +#define __ASM_RAS_H > >> + > >> +#include > >> +#include > >> + > >> +#define ERR_STATUS_AV BIT(31) > >> +#define ERR_STATUS_V BIT(30) > >> +#define ERR_STATUS_UE BIT(29) > >> +#define ERR_STATUS_ER BIT(28) > >> +#define ERR_STATUS_OF BIT(27) > >> +#define ERR_STATUS_MV BIT(26) > >> +#define ERR_STATUS_CE (BIT(25) | BIT(24)) > >> +#define ERR_STATUS_DE BIT(23) > >> +#define ERR_STATUS_PN BIT(22) > >> +#define ERR_STATUS_UET (BIT(21) | BIT(20)) > >> +#define ERR_STATUS_CI BIT(19) > >> +#define ERR_STATUS_IERR GENMASK_ULL(15, 8) > >> +#define ERR_STATUS_SERR GENMASK_ULL(7, 0) > > All these bits need to be defined in arch/arm64/tools/sysreg as > > ERXSTATUS_EL1 fields. >=20 > This file only describes the system register, but RAS MMIO registers > use these bits too. Would it be appropriate to define them in > arch/arm64/tools/sysreg? You are using them for system registers, they need to be defined there. The fact that they are also used to MMIO is anecdotal. [...] > >> +#define CASE_READ_CLEAR(x, clear) \ > >> + case (x): { \ > >> + res =3D read_sysreg_s(SYS_##x##_EL1); \ > >> + if (clear) \ > >> + write_sysreg_s(0, SYS_##x##_EL1); \ > >> + break; \ > >> + } > > Please don't use macros with side effects. This is horrible to debug. > > Instead, *return* the value from the macro, or pass the variable you > > want to affect as a parameter. >=20 > OK, I will pass **res** as a parameter like this: >=20 > #define CASE_READ_CLEAR(res, x, clear) \ > case (x): { \ > res =3D read_sysreg_s(SYS_##x##_EL1); \ > if (clear) \ > write_sysreg_s(0, SYS_##x##_EL1); \ > break; \ > } >=20 > >=20 > > Also, what ensures the synchronisation of this write? How is the W1TC > > aspect enforced? >=20 > aest_proc is just call in irq context, one ras error is just routed to > one core, so it is thread safe. And this is a Write-After-Read (WAR) > Hazards with dependence=EF=BC=8Ccan i assume that pipeline would guarantee > the order of writing and reading? You are missing the point. WAR hazarding doesn't mean that the write has taken effect, and can be delayed for as long as the CPU decides to, until the nest context synchronisation event. The W1TC question still stands. [...] > >> +static u64 aest_iomem_read_clear(u64 base, u32 offset, bool clear) > >> +{ > >> + u64 res; > >> + > >> + res =3D readq((void *)(base + offset)); > >> + if (clear) > >> + writeq(0, (void *)(base + offset)); > > Do you need the explicit synchronisation? What ordering are you trying > > to guarantee? >=20 > This read and write use the same address, pipeline would guarantee > the order of writing and reading. You are missing the point again. Non-relaxed accessors come with a DMB that enforces ordering with younger reads and older writes. Why do you need those? [...] > >> +static int __init aest_register_gsi(u32 gsi, int trigger, void *data, > >> + irq_handler_t aest_irq_func) > >> +{ > >> + int cpu, irq; > >> + > >> + irq =3D acpi_register_gsi(NULL, gsi, trigger, ACPI_ACTIVE_HIGH); > >> + > >> + if (irq =3D=3D -EINVAL) { > >> + pr_err("failed to map AEST GSI %d\n", gsi); > >> + return -EINVAL; > >> + } > >> + > >> + if (gsi < 16) { > >> + pr_err("invalid GSI %d\n", gsi); > >> + return -EINVAL; > >> + } else if (gsi < 32) { > >> + if (ppi_idx >=3D AEST_MAX_PPI) { > >> + pr_err("Unable to register PPI %d\n", gsi); > >> + return -EINVAL; > >> + } > >> + ppi_irqs[ppi_idx] =3D irq; > >> + enable_percpu_irq(irq, IRQ_TYPE_NONE); > > Enabling the PPI before requesting it? Looks... great. And how does > > this work on a system that supports EPPIs, which are in the > > [1119:1056] range? >=20 > It is better to enable it after request it, i will fix it next version. > My machine do not use EPPI as RAS interrupt, i can not test it now. Can > we support EPPI in later patch? No, because you shouldn't even have to care. Can you see a single driver in the tree that do this? >=20 > >=20 > > Also, if you get a trigger as a parameter, why the IRQ_TYPE_NONE? > >=20 > Sorry=EF=BC=8CI do not really understand this comment, should I use > (IRQ_LEVEL | IRQ_PER_CPU)? You tell me. Either the trigger is relevant, or it isn't. But I assume it is passed as a parameter to the function for a good reason. >=20 > >> + for_each_possible_cpu(cpu) { > >> + memcpy(per_cpu_ptr(ppi_data[ppi_idx], cpu), data, > >> + sizeof(struct aest_node)); > >> + } > >> + if (request_percpu_irq(irq, aest_irq_func, "AEST", > >> + ppi_data[ppi_idx++])) { > >> + pr_err("failed to register AEST IRQ %d\n", irq); > >> + return -EINVAL; > >> + } > >> + } else if (gsi < 1020) { > >> + if (request_irq(irq, aest_irq_func, IRQF_SHARED, "AEST", > >> + data)) { > > Why SHARED? Who would share a RAS interrupt????? >=20 > Multi AEST nodes may use the same interrupt, for example, one DDRC with > a RAS interrupt has two sub channels, these two sub channel is described > as two AEST node in AEST table, so they share the same one. In another > case, SMMU has two RAS node, TCU and TBU, they may also share the same > interrupt. I still find it odd, but hey, if that's the way people want to handle RAS, they might as well OR all of them and wire it to the RESET pin. > > >=20 > >> + pr_err("failed to register AEST IRQ %d\n", irq); > >> + return -EINVAL; > > Same question about extended SPIs. > >=20 > > All in all, this whole logic is totally useless. It isn't the driver's > > job to classify the GIC INTIDs... >=20 > AEST use both PPI and SPI, it seems that AEST driver must recognize > INTID in order to request irq number with different function, do you > have better solution here? Again, you should have to look at the INTID, ever. That's none of your business, and you don't even know what interrupt controller the system is presenting you anyway. The way to identify a per-CPU interrupt is to use the irq_is_percpu_devid() helper, and not to mess with pointless heuristics. Thanks, M. --=20 Without deviation from the norm, progress is not possible. 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 578B6C54E41 for ; Sat, 9 Mar 2024 10:33:51 +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:MIME-Version:References:In-Reply-To: Subject:Cc:To:From:Message-ID:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=glebbA5ZEJFRkpGlayXsAoruzAAA72oEPjaNDkH5v3w=; b=fnl0rZPIMllouN Y5Q94Wy2BTnd8gGrMWK2dGLO/bmZ/TYhAJpAIJYtBMORFmYAHvySCJto3ZwoeI3DRhrsAU4nPeqHq T5sxQ3gYDJkautGYwq/AJq0Neez4ufPlcj7UIV3VSdAs/+jwrAQ/+FUUHlI/m+sylPtDzs2LaqGqt 2h7YzHcHIR/TvbThLiMf89vCp5LrKjA7uTqjrrv1jbOVn1wfbKroRchVyNPI2SFjG9TNpuYp55ncP m8sTNkZ8qs+k3pS/vgRrJDPM2IciFG7klhAs+U3dcUwTXaJJTRNfYehNBXL/m9KDUc/NFPj/PGmvx GNTsNeZ6+385zbvnOvDg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1riu1G-0000000D7AI-1cnQ; Sat, 09 Mar 2024 10:33:34 +0000 Received: from sin.source.kernel.org ([145.40.73.55]) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1riu1D-0000000D793-0Sb1 for linux-arm-kernel@lists.infradead.org; Sat, 09 Mar 2024 10:33:33 +0000 Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by sin.source.kernel.org (Postfix) with ESMTP id 5FB41CE0691; Sat, 9 Mar 2024 10:33:28 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 7E1CCC433C7; Sat, 9 Mar 2024 10:33:27 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1709980407; bh=ep80T4R3DsChFlCxVs40oKoocVSvRg0xEN7d7U/tIbo=; h=Date:From:To:Cc:Subject:In-Reply-To:References:From; b=KrmXG+T15xq3cHjLexInxaHKvv7nQHc4nVfoQeFwC9C5CIKv3SG9hwz1HCKO4e8zZ y4dH4ErV1XuGC0zjuIdaXbPzooGVe6DIV4fN6WoT2A60aNMeBtQHdglR3VI0ipu3oV vXRQFRFJs8Lu+lZWG4/KbydkKnOPnwLnvuo2J3WMfqjqNJKp6tWHrZpPucsj1yL1S4 TdW7zjJxwTjv799dA9v7LwjE5OaEdc17Weq9gbG/aRuu/FMJUd4uPdXvK+B6FJmfLg ban7vmFsKfrm02sEGCibboTqgd4Ouvg6RpX8hJQEIdo+VGl+ATCFnC8rHiILYtqOOv w2OxHiQaa6siw== Received: from sofa.misterjones.org ([185.219.108.64] helo=wait-a-minute.misterjones.org) by disco-boy.misterjones.org with esmtpsa (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.95) (envelope-from ) id 1riu17-00Ay3W-63; Sat, 09 Mar 2024 10:33:25 +0000 Date: Sat, 09 Mar 2024 10:33:18 +0000 Message-ID: <8734szr8y9.wl-maz@kernel.org> From: Marc Zyngier To: Ruidong Tian Cc: catalin.marinas@arm.com, will@kernel.org, lpieralisi@kernel.org, guohanjun@huawei.com, sudeep.holla@arm.com, xueshuai@linux.alibaba.com, baolin.wang@linux.alibaba.com, linux-kernel@vger.kernel.org, linux-acpi@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Tyler Baicar Subject: Re: [PATCH 1/2] ACPI/AEST: Initial AEST driver In-Reply-To: References: <20240304111517.33001-1-tianruidong@linux.alibaba.com> <20240304111517.33001-2-tianruidong@linux.alibaba.com> <86wmqi19pg.wl-maz@kernel.org> User-Agent: Wanderlust/2.15.9 (Almost Unreal) SEMI-EPG/1.14.7 (Harue) FLIM-LB/1.14.9 (=?UTF-8?B?R29qxY0=?=) APEL-LB/10.8 EasyPG/1.0.0 Emacs/28.2 (x86_64-pc-linux-gnu) MULE/6.0 (HANACHIRUSATO) MIME-Version: 1.0 (generated by SEMI-EPG 1.14.7 - "Harue") X-SA-Exim-Connect-IP: 185.219.108.64 X-SA-Exim-Rcpt-To: tianruidong@linux.alibaba.com, catalin.marinas@arm.com, will@kernel.org, lpieralisi@kernel.org, guohanjun@huawei.com, sudeep.holla@arm.com, xueshuai@linux.alibaba.com, baolin.wang@linux.alibaba.com, linux-kernel@vger.kernel.org, linux-acpi@vger.kernel.org, linux-arm-kernel@lists.infradead.org, baicar@os.amperecomputing.com X-SA-Exim-Mail-From: maz@kernel.org X-SA-Exim-Scanned: No (on disco-boy.misterjones.org); SAEximRunCond expanded to false X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240309_023331_528926_D250FE12 X-CRM114-Status: GOOD ( 45.07 ) 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 T24gRnJpLCAwOCBNYXIgMjAyNCAwMzo0MzozMCArMDAwMCwKUnVpZG9uZyBUaWFuIDx0aWFucnVp ZG9uZ0BsaW51eC5hbGliYWJhLmNvbT4gd3JvdGU6Cj4gCj4g5ZyoIDIwMjQvMy80IDIwOjA3LCBN YXJjIFp5bmdpZXIg5YaZ6YGTOgo+ID4gT24gTW9uLCAwNCBNYXIgMjAyNCAxMToxNToxNiArMDAw MCwKPiA+IFJ1aWRvbmcgVGlhbjx0aWFucnVpZG9uZ0BsaW51eC5hbGliYWJhLmNvbT4gIHdyb3Rl Ogo+ID4+IGRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3Jhcy5oIGIvYXJjaC9h cm02NC9pbmNsdWRlL2FzbS9yYXMuaAo+ID4+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gPj4gaW5k ZXggMDAwMDAwMDAwMDAwLi4yZmIwZDk3NDE1NjcKPiA+PiAtLS0gL2Rldi9udWxsCj4gPj4gKysr IGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9yYXMuaAo+ID4+IEBAIC0wLDAgKzEsMzggQEAKPiA+ PiArLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgKi8KPiA+PiArI2lmbmRlZiBf X0FTTV9SQVNfSAo+ID4+ICsjZGVmaW5lIF9fQVNNX1JBU19ICj4gPj4gKwo+ID4+ICsjaW5jbHVk ZSA8bGludXgvdHlwZXMuaD4KPiA+PiArI2luY2x1ZGUgPGxpbnV4L2JpdHMuaD4KPiA+PiArCj4g Pj4gKyNkZWZpbmUgRVJSX1NUQVRVU19BVgkJQklUKDMxKQo+ID4+ICsjZGVmaW5lIEVSUl9TVEFU VVNfVgkJQklUKDMwKQo+ID4+ICsjZGVmaW5lIEVSUl9TVEFUVVNfVUUJCUJJVCgyOSkKPiA+PiAr I2RlZmluZSBFUlJfU1RBVFVTX0VSCQlCSVQoMjgpCj4gPj4gKyNkZWZpbmUgRVJSX1NUQVRVU19P RgkJQklUKDI3KQo+ID4+ICsjZGVmaW5lIEVSUl9TVEFUVVNfTVYJCUJJVCgyNikKPiA+PiArI2Rl ZmluZSBFUlJfU1RBVFVTX0NFCQkoQklUKDI1KSB8IEJJVCgyNCkpCj4gPj4gKyNkZWZpbmUgRVJS X1NUQVRVU19ERQkJQklUKDIzKQo+ID4+ICsjZGVmaW5lIEVSUl9TVEFUVVNfUE4JCUJJVCgyMikK PiA+PiArI2RlZmluZSBFUlJfU1RBVFVTX1VFVAkJKEJJVCgyMSkgfCBCSVQoMjApKQo+ID4+ICsj ZGVmaW5lIEVSUl9TVEFUVVNfQ0kJCUJJVCgxOSkKPiA+PiArI2RlZmluZSBFUlJfU1RBVFVTX0lF UlIgCUdFTk1BU0tfVUxMKDE1LCA4KQo+ID4+ICsjZGVmaW5lIEVSUl9TVEFUVVNfU0VSUiAJR0VO TUFTS19VTEwoNywgMCkKPiA+IEFsbCB0aGVzZSBiaXRzIG5lZWQgdG8gYmUgZGVmaW5lZCBpbiBh cmNoL2FybTY0L3Rvb2xzL3N5c3JlZyBhcwo+ID4gRVJYU1RBVFVTX0VMMSBmaWVsZHMuCj4gCj4g VGhpcyBmaWxlIG9ubHkgZGVzY3JpYmVzIHRoZSBzeXN0ZW0gcmVnaXN0ZXIsIGJ1dCBSQVMgTU1J TyByZWdpc3RlcnMKPiB1c2UgdGhlc2UgYml0cyB0b28uIFdvdWxkIGl0IGJlIGFwcHJvcHJpYXRl IHRvIGRlZmluZSB0aGVtIGluCj4gYXJjaC9hcm02NC90b29scy9zeXNyZWc/CgpZb3UgYXJlIHVz aW5nIHRoZW0gZm9yIHN5c3RlbSByZWdpc3RlcnMsIHRoZXkgbmVlZCB0byBiZSBkZWZpbmVkCnRo ZXJlLiBUaGUgZmFjdCB0aGF0IHRoZXkgYXJlIGFsc28gdXNlZCB0byBNTUlPIGlzIGFuZWNkb3Rh bC4KClsuLi5dCgo+ID4+ICsjZGVmaW5lIENBU0VfUkVBRF9DTEVBUih4LCBjbGVhcikJCQkJCVwK PiA+PiArCWNhc2UgKHgpOiB7CQkJCQkJCVwKPiA+PiArCQlyZXMgPSByZWFkX3N5c3JlZ19zKFNZ U18jI3gjI19FTDEpOwkJCVwKPiA+PiArCQlpZiAoY2xlYXIpCQkJCQkJXAo+ID4+ICsJCQl3cml0 ZV9zeXNyZWdfcygwLCBTWVNfIyN4IyNfRUwxKTsJCVwKPiA+PiArCQlicmVhazsJCQkJCQkJXAo+ ID4+ICsJfQo+ID4gUGxlYXNlIGRvbid0IHVzZSBtYWNyb3Mgd2l0aCBzaWRlIGVmZmVjdHMuIFRo aXMgaXMgaG9ycmlibGUgdG8gZGVidWcuCj4gPiBJbnN0ZWFkLCAqcmV0dXJuKiB0aGUgdmFsdWUg ZnJvbSB0aGUgbWFjcm8sIG9yIHBhc3MgdGhlIHZhcmlhYmxlIHlvdQo+ID4gd2FudCB0byBhZmZl Y3QgYXMgYSBwYXJhbWV0ZXIuCj4gCj4gT0ssIEkgd2lsbCBwYXNzICoqcmVzKiogYXMgYSBwYXJh bWV0ZXIgbGlrZSB0aGlzOgo+IAo+ICAgI2RlZmluZSBDQVNFX1JFQURfQ0xFQVIocmVzLCB4LCBj bGVhcikJCQlcCj4gCSAgY2FzZSAoeCk6IHsJCQkJCQlcCj4gCQkgIHJlcyA9IHJlYWRfc3lzcmVn X3MoU1lTXyMjeCMjX0VMMSk7CQlcCj4gCQkgIGlmIChjbGVhcikJCQkJCVwKPiAJCQkgIHdyaXRl X3N5c3JlZ19zKDAsIFNZU18jI3gjI19FTDEpOwlcCj4gCQkgIGJyZWFrOwkJCQkJXAo+IAkgIH0K PiAKPiA+IAo+ID4gQWxzbywgd2hhdCBlbnN1cmVzIHRoZSBzeW5jaHJvbmlzYXRpb24gb2YgdGhp cyB3cml0ZT8gSG93IGlzIHRoZSBXMVRDCj4gPiBhc3BlY3QgZW5mb3JjZWQ/Cj4gCj4gYWVzdF9w cm9jIGlzIGp1c3QgY2FsbCBpbiBpcnEgY29udGV4dCwgb25lIHJhcyBlcnJvciBpcyBqdXN0IHJv dXRlZCB0bwo+IG9uZSBjb3JlLCBzbyBpdCBpcyB0aHJlYWQgc2FmZS4gQW5kIHRoaXMgaXMgYSBX cml0ZS1BZnRlci1SZWFkIChXQVIpCj4gSGF6YXJkcyB3aXRoIGRlcGVuZGVuY2XvvIxjYW4gaSBh c3N1bWUgdGhhdCBwaXBlbGluZSB3b3VsZCBndWFyYW50ZWUKPiB0aGUgb3JkZXIgb2Ygd3JpdGlu ZyBhbmQgcmVhZGluZz8KCllvdSBhcmUgbWlzc2luZyB0aGUgcG9pbnQuIFdBUiBoYXphcmRpbmcg ZG9lc24ndCBtZWFuIHRoYXQgdGhlIHdyaXRlCmhhcyB0YWtlbiBlZmZlY3QsIGFuZCBjYW4gYmUg ZGVsYXllZCBmb3IgYXMgbG9uZyBhcyB0aGUgQ1BVIGRlY2lkZXMKdG8sIHVudGlsIHRoZSBuZXN0 IGNvbnRleHQgc3luY2hyb25pc2F0aW9uIGV2ZW50LgoKVGhlIFcxVEMgcXVlc3Rpb24gc3RpbGwg c3RhbmRzLgoKWy4uLl0KCj4gPj4gK3N0YXRpYyB1NjQgYWVzdF9pb21lbV9yZWFkX2NsZWFyKHU2 NCBiYXNlLCB1MzIgb2Zmc2V0LCBib29sIGNsZWFyKQo+ID4+ICt7Cj4gPj4gKwl1NjQgcmVzOwo+ ID4+ICsKPiA+PiArCXJlcyA9IHJlYWRxKCh2b2lkICopKGJhc2UgKyBvZmZzZXQpKTsKPiA+PiAr CWlmIChjbGVhcikKPiA+PiArCQl3cml0ZXEoMCwgKHZvaWQgKikoYmFzZSArIG9mZnNldCkpOwo+ ID4gRG8geW91IG5lZWQgdGhlIGV4cGxpY2l0IHN5bmNocm9uaXNhdGlvbj8gV2hhdCBvcmRlcmlu ZyBhcmUgeW91IHRyeWluZwo+ID4gdG8gZ3VhcmFudGVlPwo+IAo+IFRoaXMgcmVhZCBhbmQgd3Jp dGUgdXNlIHRoZSBzYW1lIGFkZHJlc3MsIHBpcGVsaW5lIHdvdWxkIGd1YXJhbnRlZQo+IHRoZSBv cmRlciBvZiB3cml0aW5nIGFuZCByZWFkaW5nLgoKWW91IGFyZSBtaXNzaW5nIHRoZSBwb2ludCBh Z2Fpbi4gTm9uLXJlbGF4ZWQgYWNjZXNzb3JzIGNvbWUgd2l0aCBhIERNQgp0aGF0IGVuZm9yY2Vz IG9yZGVyaW5nIHdpdGggeW91bmdlciByZWFkcyBhbmQgb2xkZXIgd3JpdGVzLiBXaHkgZG8geW91 Cm5lZWQgdGhvc2U/CgpbLi4uXQoKPiA+PiArc3RhdGljIGludCBfX2luaXQgYWVzdF9yZWdpc3Rl cl9nc2kodTMyIGdzaSwgaW50IHRyaWdnZXIsIHZvaWQgKmRhdGEsCj4gPj4gKwkJCQkJaXJxX2hh bmRsZXJfdCBhZXN0X2lycV9mdW5jKQo+ID4+ICt7Cj4gPj4gKwlpbnQgY3B1LCBpcnE7Cj4gPj4g Kwo+ID4+ICsJaXJxID0gYWNwaV9yZWdpc3Rlcl9nc2koTlVMTCwgZ3NpLCB0cmlnZ2VyLCBBQ1BJ X0FDVElWRV9ISUdIKTsKPiA+PiArCj4gPj4gKwlpZiAoaXJxID09IC1FSU5WQUwpIHsKPiA+PiAr CQlwcl9lcnIoImZhaWxlZCB0byBtYXAgQUVTVCBHU0kgJWRcbiIsIGdzaSk7Cj4gPj4gKwkJcmV0 dXJuIC1FSU5WQUw7Cj4gPj4gKwl9Cj4gPj4gKwo+ID4+ICsJaWYgKGdzaSA8IDE2KSB7Cj4gPj4g KwkJcHJfZXJyKCJpbnZhbGlkIEdTSSAlZFxuIiwgZ3NpKTsKPiA+PiArCQlyZXR1cm4gLUVJTlZB TDsKPiA+PiArCX0gZWxzZSBpZiAoZ3NpIDwgMzIpIHsKPiA+PiArCQlpZiAocHBpX2lkeCA+PSBB RVNUX01BWF9QUEkpIHsKPiA+PiArCQkJcHJfZXJyKCJVbmFibGUgdG8gcmVnaXN0ZXIgUFBJICVk XG4iLCBnc2kpOwo+ID4+ICsJCQlyZXR1cm4gLUVJTlZBTDsKPiA+PiArCQl9Cj4gPj4gKwkJcHBp X2lycXNbcHBpX2lkeF0gPSBpcnE7Cj4gPj4gKwkJZW5hYmxlX3BlcmNwdV9pcnEoaXJxLCBJUlFf VFlQRV9OT05FKTsKPiA+IEVuYWJsaW5nIHRoZSBQUEkgYmVmb3JlIHJlcXVlc3RpbmcgaXQ/IExv b2tzLi4uIGdyZWF0LiBBbmQgaG93IGRvZXMKPiA+IHRoaXMgd29yayBvbiBhIHN5c3RlbSB0aGF0 IHN1cHBvcnRzIEVQUElzLCB3aGljaCBhcmUgaW4gdGhlCj4gPiBbMTExOToxMDU2XSByYW5nZT8K PiAKPiBJdCBpcyBiZXR0ZXIgdG8gZW5hYmxlIGl0IGFmdGVyIHJlcXVlc3QgaXQsIGkgd2lsbCBm aXggaXQgbmV4dCB2ZXJzaW9uLgo+IE15IG1hY2hpbmUgZG8gbm90IHVzZSBFUFBJIGFzIFJBUyBp bnRlcnJ1cHQsIGkgY2FuIG5vdCB0ZXN0IGl0IG5vdy4gQ2FuCj4gd2Ugc3VwcG9ydCBFUFBJIGlu IGxhdGVyIHBhdGNoPwoKTm8sIGJlY2F1c2UgeW91IHNob3VsZG4ndCBldmVuIGhhdmUgdG8gY2Fy ZS4gQ2FuIHlvdSBzZWUgYSBzaW5nbGUKZHJpdmVyIGluIHRoZSB0cmVlIHRoYXQgZG8gdGhpcz8K Cj4gCj4gPiAKPiA+IEFsc28sIGlmIHlvdSBnZXQgYSB0cmlnZ2VyIGFzIGEgcGFyYW1ldGVyLCB3 aHkgdGhlIElSUV9UWVBFX05PTkU/Cj4gPiAKPiBTb3Jyee+8jEkgZG8gbm90IHJlYWxseSB1bmRl cnN0YW5kIHRoaXMgY29tbWVudCwgc2hvdWxkIEkgdXNlCj4gKElSUV9MRVZFTCB8IElSUV9QRVJf Q1BVKT8KCllvdSB0ZWxsIG1lLiBFaXRoZXIgdGhlIHRyaWdnZXIgaXMgcmVsZXZhbnQsIG9yIGl0 IGlzbid0LiBCdXQgSSBhc3N1bWUKaXQgaXMgcGFzc2VkIGFzIGEgcGFyYW1ldGVyIHRvIHRoZSBm dW5jdGlvbiBmb3IgYSBnb29kIHJlYXNvbi4KCj4gCj4gPj4gKwkJZm9yX2VhY2hfcG9zc2libGVf Y3B1KGNwdSkgewo+ID4+ICsJCQltZW1jcHkocGVyX2NwdV9wdHIocHBpX2RhdGFbcHBpX2lkeF0s IGNwdSksIGRhdGEsCj4gPj4gKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IGFlc3Rfbm9kZSkpOwo+ ID4+ICsJCX0KPiA+PiArCQlpZiAocmVxdWVzdF9wZXJjcHVfaXJxKGlycSwgYWVzdF9pcnFfZnVu YywgIkFFU1QiLAo+ID4+ICsJCQkJICAgICAgIHBwaV9kYXRhW3BwaV9pZHgrK10pKSB7Cj4gPj4g KwkJCXByX2VycigiZmFpbGVkIHRvIHJlZ2lzdGVyIEFFU1QgSVJRICVkXG4iLCBpcnEpOwo+ID4+ ICsJCQlyZXR1cm4gLUVJTlZBTDsKPiA+PiArCQl9Cj4gPj4gKwl9IGVsc2UgaWYgKGdzaSA8IDEw MjApIHsKPiA+PiArCQlpZiAocmVxdWVzdF9pcnEoaXJxLCBhZXN0X2lycV9mdW5jLCBJUlFGX1NI QVJFRCwgIkFFU1QiLAo+ID4+ICsJCQkJZGF0YSkpIHsKPiA+IFdoeSBTSEFSRUQ/IFdobyB3b3Vs ZCBzaGFyZSBhIFJBUyBpbnRlcnJ1cHQ/Pz8/Pwo+IAo+IE11bHRpIEFFU1Qgbm9kZXMgbWF5IHVz ZSB0aGUgc2FtZSBpbnRlcnJ1cHQsIGZvciBleGFtcGxlLCBvbmUgRERSQyB3aXRoCj4gYSBSQVMg aW50ZXJydXB0IGhhcyB0d28gc3ViIGNoYW5uZWxzLCB0aGVzZSB0d28gc3ViIGNoYW5uZWwgaXMg ZGVzY3JpYmVkCj4gYXMgdHdvIEFFU1Qgbm9kZSBpbiBBRVNUIHRhYmxlLCBzbyB0aGV5IHNoYXJl IHRoZSBzYW1lIG9uZS4gSW4gYW5vdGhlcgo+IGNhc2UsIFNNTVUgaGFzIHR3byBSQVMgbm9kZSwg VENVIGFuZCBUQlUsIHRoZXkgbWF5IGFsc28gc2hhcmUgdGhlIHNhbWUKPiBpbnRlcnJ1cHQuCgpJ IHN0aWxsIGZpbmQgaXQgb2RkLCBidXQgaGV5LCBpZiB0aGF0J3MgdGhlIHdheSBwZW9wbGUgd2Fu dCB0byBoYW5kbGUKUkFTLCB0aGV5IG1pZ2h0IGFzIHdlbGwgT1IgYWxsIG9mIHRoZW0gYW5kIHdp cmUgaXQgdG8gdGhlIFJFU0VUIHBpbi4KCj4KPiA+IAo+ID4+ICsJCQlwcl9lcnIoImZhaWxlZCB0 byByZWdpc3RlciBBRVNUIElSUSAlZFxuIiwgaXJxKTsKPiA+PiArCQkJcmV0dXJuIC1FSU5WQUw7 Cj4gPiBTYW1lIHF1ZXN0aW9uIGFib3V0IGV4dGVuZGVkIFNQSXMuCj4gPiAKPiA+IEFsbCBpbiBh bGwsIHRoaXMgd2hvbGUgbG9naWMgaXMgdG90YWxseSB1c2VsZXNzLiBJdCBpc24ndCB0aGUgZHJp dmVyJ3MKPiA+IGpvYiB0byBjbGFzc2lmeSB0aGUgR0lDIElOVElEcy4uLgo+IAo+IEFFU1QgdXNl IGJvdGggUFBJIGFuZCBTUEksIGl0IHNlZW1zIHRoYXQgQUVTVCBkcml2ZXIgbXVzdCByZWNvZ25p emUKPiBJTlRJRCBpbiBvcmRlciB0byByZXF1ZXN0IGlycSBudW1iZXIgd2l0aCBkaWZmZXJlbnQg ZnVuY3Rpb24sIGRvIHlvdQo+IGhhdmUgYmV0dGVyIHNvbHV0aW9uIGhlcmU/CgpBZ2FpbiwgeW91 IHNob3VsZCBoYXZlIHRvIGxvb2sgYXQgdGhlIElOVElELCBldmVyLiBUaGF0J3Mgbm9uZSBvZiB5 b3VyCmJ1c2luZXNzLCBhbmQgeW91IGRvbid0IGV2ZW4ga25vdyB3aGF0IGludGVycnVwdCBjb250 cm9sbGVyIHRoZSBzeXN0ZW0KaXMgcHJlc2VudGluZyB5b3UgYW55d2F5LiBUaGUgd2F5IHRvIGlk ZW50aWZ5IGEgcGVyLUNQVSBpbnRlcnJ1cHQgaXMKdG8gdXNlIHRoZSBpcnFfaXNfcGVyY3B1X2Rl dmlkKCkgaGVscGVyLCBhbmQgbm90IHRvIG1lc3Mgd2l0aApwb2ludGxlc3MgaGV1cmlzdGljcy4K ClRoYW5rcywKCglNLgoKLS0gCldpdGhvdXQgZGV2aWF0aW9uIGZyb20gdGhlIG5vcm0sIHByb2dy ZXNzIGlzIG5vdCBwb3NzaWJsZS4KCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fCmxpbnV4LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4LWFybS1rZXJu ZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFu L2xpc3RpbmZvL2xpbnV4LWFybS1rZXJuZWwK