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 X-Spam-Level: X-Spam-Status: No, score=-8.5 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_PASS,URIBL_BLOCKED, USER_AGENT_MUTT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id CC54FC43387 for ; Tue, 8 Jan 2019 18:37:34 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 9F7F220660 for ; Tue, 8 Jan 2019 18:37:34 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729543AbfAHShd (ORCPT ); Tue, 8 Jan 2019 13:37:33 -0500 Received: from foss.arm.com ([217.140.101.70]:58304 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729041AbfAHShc (ORCPT ); Tue, 8 Jan 2019 13:37:32 -0500 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.72.51.249]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 522D0A78; Tue, 8 Jan 2019 10:37:32 -0800 (PST) Received: from e103592.cambridge.arm.com (usa-sjc-imap-foss1.foss.arm.com [10.72.51.249]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 178BA3F70D; Tue, 8 Jan 2019 10:37:29 -0800 (PST) Date: Tue, 8 Jan 2019 18:37:27 +0000 From: Dave Martin To: Julien Thierry Cc: Marc Zyngier , mark.rutland@arm.com, daniel.thompson@linaro.org, Ard Biesheuvel , catalin.marinas@arm.com, will.deacon@arm.com, linux-kernel@vger.kernel.org, christoffer.dall@arm.com, james.morse@arm.com, Oleg Nesterov , joel@joelfernandes.org, linux-arm-kernel@lists.infradead.org Subject: Re: [PATCH v8 12/26] arm64: irqflags: Use ICC_PMR_EL1 for interrupt masking Message-ID: <20190108183727.GD5840@e103592.cambridge.arm.com> References: <1546956464-48825-1-git-send-email-julien.thierry@arm.com> <1546956464-48825-13-git-send-email-julien.thierry@arm.com> <20190108153957.GA5840@e103592.cambridge.arm.com> <8cae8016-d2c7-3c86-9832-f4278d42ea21@arm.com> <20190108164510.GB5840@e103592.cambridge.arm.com> <699ebbc0-fff9-0a1c-9dfa-4b7da078904c@arm.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <699ebbc0-fff9-0a1c-9dfa-4b7da078904c@arm.com> User-Agent: Mutt/1.5.23 (2014-03-12) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tue, Jan 08, 2019 at 05:58:59PM +0000, Julien Thierry wrote: > > > On 08/01/2019 16:45, Dave Martin wrote: > > On Tue, Jan 08, 2019 at 03:51:18PM +0000, Marc Zyngier wrote: > >> On 08/01/2019 15:40, Dave Martin wrote: > >>> On Tue, Jan 08, 2019 at 02:07:30PM +0000, Julien Thierry wrote: > >>>> Instead disabling interrupts by setting the PSR.I bit, use a priority > >>>> higher than the one used for interrupts to mask them via PMR. > >>>> > >>>> When using PMR to disable interrupts, the value of PMR will be used > >>>> instead of PSR.[DAIF] for the irqflags. > >>>> > >>>> Signed-off-by: Julien Thierry > >>>> Suggested-by: Daniel Thompson > >>>> Cc: Catalin Marinas > >>>> Cc: Will Deacon > >>>> Cc: Ard Biesheuvel > >>>> Cc: Oleg Nesterov > >>>> --- > >>>> arch/arm64/include/asm/efi.h | 11 ++++ > >>>> arch/arm64/include/asm/irqflags.h | 123 +++++++++++++++++++++++++++++--------- > >>>> 2 files changed, 106 insertions(+), 28 deletions(-) > >>> > >>> [...] > >>> > >>>> diff --git a/arch/arm64/include/asm/irqflags.h b/arch/arm64/include/asm/irqflags.h > >>>> index 24692ed..fa3b06f 100644 > >>>> --- a/arch/arm64/include/asm/irqflags.h > >>>> +++ b/arch/arm64/include/asm/irqflags.h > >>>> @@ -18,7 +18,9 @@ > >>> > >>> [...] > >>> > >>>> static inline void arch_local_irq_enable(void) > >>>> { > >>>> - asm volatile( > >>>> - "msr daifclr, #2 // arch_local_irq_enable" > >>>> - : > >>>> + unsigned long unmasked = GIC_PRIO_IRQON; > >>>> + > >>>> + asm volatile(ALTERNATIVE( > >>>> + "msr daifclr, #2 // arch_local_irq_enable\n" > >>>> + "nop", > >>>> + "msr_s " __stringify(SYS_ICC_PMR_EL1) ",%0\n" > >>>> + "dsb sy", > >>> > >>> I'm still not convinced these dsbs are needed. > >>> > >>> Without the dsb, we are probably not guaranteed to take a pending > >>> interrupt _immediately_ on unmasking, but I'm not sure that's a > >>> problem. > >>> > >>> What goes wrong if we omit them? > >> > >> Then the GIC doesn't know it can now deliver interrupts of a lower > >> priority. Only a dsb can guarantee that the GIC's view of PMR will get > >> updated. > >> > >> See 9.1.6 (Observability of the effects of accesses to the GIC > >> registers), which states: > >> > >> > >> Architectural execution of a DSB instruction guarantees that > >> — The last value written to ICC_PMR_EL1 or GICC_PMR is observed by the > >> associated Redistributor. > >> > >> > >> So yes, DSB is required. > > > > But it says neither what is means for the PMR write to be "observed by > > the redistributor", nor whether the DSB is required for the > > redistributor to observe the write at all. (So, is an implementation > > allowed to cached in the CPU interface indefinitely until forcibly > > flushed to the redistributor by a DSB, and in any case can the write's > > reaching the distributor in finite time or not have any effect that we > > care about in this case?). > > > > > > My reason for querying this is that temporary local masking of classes > > of interrupts seems an obvious use case for the PMR, and the DSB > > requirement flies rather in the face of this. > > > > > > Have we seen hardware where interrupts may stall forever upstream of the > > CPU interface after a PMR write, until a dsb is executed by the CPU? > > > > I don't have too much GICv3 hardware at hand but the one I tested > *seems* to work without the DSB. But of course this does not mean it is > correct even on that hardware. > > As you said it is not clear what is meant by "observed by the > redistributor", it can mean that the redistributor is allowed to stop > forwarding interrupts of lower priority or it can mean that it always > forwards them as the CPU interface is required to prevent masked > priority interrupts to be signaled to the CPU. The hardware I'm using > might be in the latter case... or not... > > > > > If so that is sad, but I guess we have to live with it. > > > > Also, is it ever important in Linux that a pending interrupt be taken > > immediately upon unmasking (and how do we know that said interrupt is > > pending)? If not, we don't care precisely when such interrupts are > > pended to the PE, just that such an interrupt cannot be taken before > > the PMR write that unmasks it. It would be insane for the self- > > synchronization of PMR writes to lack this guarantee (and a DSB after > > the PMR write would do no good anyway in that case). > > > > The first thing that comes to mind for this would be the RT world, I'm > not sure it would it would be nice to have interrupts "actually > unmasked" at some random time in the future. If the PMR write were to start propagating immediately and DSB merely waited for it to reach the redistributor, then there would be no random delay -- rather, the DSB would generate some pointless system load and prevent any useful work being done in the interim, without actually speeding anything up. Of course, it sounds like the GIC spec doesn't mandate such an implementation, so we can't rely on this. > Otherwise, aren't there some parts of the kernel that expect being able > to take interrupts? (memory allocation comes to mind). What happens if > the interrupt might not happen? > > Also, code that does: > > while (!poll_update_from_irq()) { > local_irq_disable(); > > // do stuff > > local_irq_enable(); > } > > Might never see interrupts. It is not clear to me whether that is the > case for the loop in do_idle() and the check for need_resched(). > > I don't know if drivers might have such code patterns. For appropriate self-synchronising behaviour in PMR writes, this problem is solvable: if you have a pending PMR write followed by a PMR write with a more restrictive bound (so disabling some interrupts) then the second write could be stalled until the first has synchronised, providing an opportunity to take pending interrupts before they would get masked. There might be implementations that do something like this, but I guess we can't rely on this either. I'll defer to the experts... Cheers ---Dave 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 X-Spam-Level: X-Spam-Status: No, score=-13.0 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_PASS,URIBL_BLOCKED,USER_AGENT_MUTT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 52F25C43387 for ; Tue, 8 Jan 2019 18:37:39 +0000 (UTC) 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 mail.kernel.org (Postfix) with ESMTPS id 28D5720827 for ; Tue, 8 Jan 2019 18:37:39 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="Kb5F20ne" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 28D5720827 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=arm.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; 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=O9N61o1c7kPqqJCKZa+1TwWo+iD0G5+0/C4waUbKDME=; b=Kb5F20neyGkt8m YsR/msZO1wwVjPGdlxN/TG6EKDcsYaazn1qj3ILR6MJ/fuVqKtEpf7GV69sqjs2d4M3DdB2aMIanl hWjFOTocgC4pXMZc3sXiti09Px/6s7nbZe4IH1sqmg4xhRGV+wb65DHie8amdopqb6OVyoX1d1LpU DoUOMj2fMaywWqGQB+8ksmUZdSuhXSiTnho3Zdny0YwXHAelG8R/nkGA91zoRbp8L6u1dZHxCerT4 M4YCF8UQ7g+C49fUa/lnT6cnJBqtxcafLPnhK6ymrUC9LYrMNWn/eWTELC4rYW08njEz6B4DJX7OL hb0K5Xe6O6jaa4OO6xZQ==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.90_1 #2 (Red Hat Linux)) id 1ggwFt-0003YF-WE; Tue, 08 Jan 2019 18:37:38 +0000 Received: from usa-sjc-mx-foss1.foss.arm.com ([217.140.101.70] helo=foss.arm.com) by bombadil.infradead.org with esmtp (Exim 4.90_1 #2 (Red Hat Linux)) id 1ggwFo-0003X2-Rw for linux-arm-kernel@lists.infradead.org; Tue, 08 Jan 2019 18:37:35 +0000 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.72.51.249]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 522D0A78; Tue, 8 Jan 2019 10:37:32 -0800 (PST) Received: from e103592.cambridge.arm.com (usa-sjc-imap-foss1.foss.arm.com [10.72.51.249]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 178BA3F70D; Tue, 8 Jan 2019 10:37:29 -0800 (PST) Date: Tue, 8 Jan 2019 18:37:27 +0000 From: Dave Martin To: Julien Thierry Subject: Re: [PATCH v8 12/26] arm64: irqflags: Use ICC_PMR_EL1 for interrupt masking Message-ID: <20190108183727.GD5840@e103592.cambridge.arm.com> References: <1546956464-48825-1-git-send-email-julien.thierry@arm.com> <1546956464-48825-13-git-send-email-julien.thierry@arm.com> <20190108153957.GA5840@e103592.cambridge.arm.com> <8cae8016-d2c7-3c86-9832-f4278d42ea21@arm.com> <20190108164510.GB5840@e103592.cambridge.arm.com> <699ebbc0-fff9-0a1c-9dfa-4b7da078904c@arm.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <699ebbc0-fff9-0a1c-9dfa-4b7da078904c@arm.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20190108_103733_040863_B4B907D5 X-CRM114-Status: GOOD ( 41.12 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: mark.rutland@arm.com, daniel.thompson@linaro.org, Ard Biesheuvel , Marc Zyngier , catalin.marinas@arm.com, will.deacon@arm.com, linux-kernel@vger.kernel.org, christoffer.dall@arm.com, james.morse@arm.com, Oleg Nesterov , joel@joelfernandes.org, linux-arm-kernel@lists.infradead.org Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org T24gVHVlLCBKYW4gMDgsIDIwMTkgYXQgMDU6NTg6NTlQTSArMDAwMCwgSnVsaWVuIFRoaWVycnkg d3JvdGU6Cj4gCj4gCj4gT24gMDgvMDEvMjAxOSAxNjo0NSwgRGF2ZSBNYXJ0aW4gd3JvdGU6Cj4g PiBPbiBUdWUsIEphbiAwOCwgMjAxOSBhdCAwMzo1MToxOFBNICswMDAwLCBNYXJjIFp5bmdpZXIg d3JvdGU6Cj4gPj4gT24gMDgvMDEvMjAxOSAxNTo0MCwgRGF2ZSBNYXJ0aW4gd3JvdGU6Cj4gPj4+ IE9uIFR1ZSwgSmFuIDA4LCAyMDE5IGF0IDAyOjA3OjMwUE0gKzAwMDAsIEp1bGllbiBUaGllcnJ5 IHdyb3RlOgo+ID4+Pj4gSW5zdGVhZCBkaXNhYmxpbmcgaW50ZXJydXB0cyBieSBzZXR0aW5nIHRo ZSBQU1IuSSBiaXQsIHVzZSBhIHByaW9yaXR5Cj4gPj4+PiBoaWdoZXIgdGhhbiB0aGUgb25lIHVz ZWQgZm9yIGludGVycnVwdHMgdG8gbWFzayB0aGVtIHZpYSBQTVIuCj4gPj4+Pgo+ID4+Pj4gV2hl biB1c2luZyBQTVIgdG8gZGlzYWJsZSBpbnRlcnJ1cHRzLCB0aGUgdmFsdWUgb2YgUE1SIHdpbGwg YmUgdXNlZAo+ID4+Pj4gaW5zdGVhZCBvZiBQU1IuW0RBSUZdIGZvciB0aGUgaXJxZmxhZ3MuCj4g Pj4+Pgo+ID4+Pj4gU2lnbmVkLW9mZi1ieTogSnVsaWVuIFRoaWVycnkgPGp1bGllbi50aGllcnJ5 QGFybS5jb20+Cj4gPj4+PiBTdWdnZXN0ZWQtYnk6IERhbmllbCBUaG9tcHNvbiA8ZGFuaWVsLnRo b21wc29uQGxpbmFyby5vcmc+Cj4gPj4+PiBDYzogQ2F0YWxpbiBNYXJpbmFzIDxjYXRhbGluLm1h cmluYXNAYXJtLmNvbT4KPiA+Pj4+IENjOiBXaWxsIERlYWNvbiA8d2lsbC5kZWFjb25AYXJtLmNv bT4KPiA+Pj4+IENjOiBBcmQgQmllc2hldXZlbCA8YXJkLmJpZXNoZXV2ZWxAbGluYXJvLm9yZz4K PiA+Pj4+IENjOiBPbGVnIE5lc3Rlcm92IDxvbGVnQHJlZGhhdC5jb20+Cj4gPj4+PiAtLS0KPiA+ Pj4+ICBhcmNoL2FybTY0L2luY2x1ZGUvYXNtL2VmaS5oICAgICAgfCAgMTEgKysrKwo+ID4+Pj4g IGFyY2gvYXJtNjQvaW5jbHVkZS9hc20vaXJxZmxhZ3MuaCB8IDEyMyArKysrKysrKysrKysrKysr KysrKysrKysrKysrKy0tLS0tLS0tLQo+ID4+Pj4gIDIgZmlsZXMgY2hhbmdlZCwgMTA2IGluc2Vy dGlvbnMoKyksIDI4IGRlbGV0aW9ucygtKQo+ID4+Pgo+ID4+PiBbLi4uXQo+ID4+Pgo+ID4+Pj4g ZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vaXJxZmxhZ3MuaCBiL2FyY2gvYXJt NjQvaW5jbHVkZS9hc20vaXJxZmxhZ3MuaAo+ID4+Pj4gaW5kZXggMjQ2OTJlZC4uZmEzYjA2ZiAx MDA2NDQKPiA+Pj4+IC0tLSBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vaXJxZmxhZ3MuaAo+ID4+ Pj4gKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9pcnFmbGFncy5oCj4gPj4+PiBAQCAtMTgs NyArMTgsOSBAQAo+ID4+Pgo+ID4+PiBbLi4uXQo+ID4+Pgo+ID4+Pj4gIHN0YXRpYyBpbmxpbmUg dm9pZCBhcmNoX2xvY2FsX2lycV9lbmFibGUodm9pZCkKPiA+Pj4+ICB7Cj4gPj4+PiAtCWFzbSB2 b2xhdGlsZSgKPiA+Pj4+IC0JCSJtc3IJZGFpZmNsciwgIzIJCS8vIGFyY2hfbG9jYWxfaXJxX2Vu YWJsZSIKPiA+Pj4+IC0JCToKPiA+Pj4+ICsJdW5zaWduZWQgbG9uZyB1bm1hc2tlZCA9IEdJQ19Q UklPX0lSUU9OOwo+ID4+Pj4gKwo+ID4+Pj4gKwlhc20gdm9sYXRpbGUoQUxURVJOQVRJVkUoCj4g Pj4+PiArCQkibXNyCWRhaWZjbHIsICMyCQkvLyBhcmNoX2xvY2FsX2lycV9lbmFibGVcbiIKPiA+ Pj4+ICsJCSJub3AiLAo+ID4+Pj4gKwkJIm1zcl9zICAiIF9fc3RyaW5naWZ5KFNZU19JQ0NfUE1S X0VMMSkgIiwlMFxuIgo+ID4+Pj4gKwkJImRzYglzeSIsCj4gPj4+Cj4gPj4+IEknbSBzdGlsbCBu b3QgY29udmluY2VkIHRoZXNlIGRzYnMgYXJlIG5lZWRlZC4KPiA+Pj4KPiA+Pj4gV2l0aG91dCB0 aGUgZHNiLCB3ZSBhcmUgcHJvYmFibHkgbm90IGd1YXJhbnRlZWQgdG8gdGFrZSBhIHBlbmRpbmcK PiA+Pj4gaW50ZXJydXB0IF9pbW1lZGlhdGVseV8gb24gdW5tYXNraW5nLCBidXQgSSdtIG5vdCBz dXJlIHRoYXQncyBhCj4gPj4+IHByb2JsZW0uCj4gPj4+Cj4gPj4+IFdoYXQgZ29lcyB3cm9uZyBp ZiB3ZSBvbWl0IHRoZW0/Cj4gPj4KPiA+PiBUaGVuIHRoZSBHSUMgZG9lc24ndCBrbm93IGl0IGNh biBub3cgZGVsaXZlciBpbnRlcnJ1cHRzIG9mIGEgbG93ZXIKPiA+PiBwcmlvcml0eS4gT25seSBh IGRzYiBjYW4gZ3VhcmFudGVlIHRoYXQgdGhlIEdJQydzIHZpZXcgb2YgUE1SIHdpbGwgZ2V0Cj4g Pj4gdXBkYXRlZC4KPiA+Pgo+ID4+IFNlZSA5LjEuNiAoT2JzZXJ2YWJpbGl0eSBvZiB0aGUgZWZm ZWN0cyBvZiBhY2Nlc3NlcyB0byB0aGUgR0lDCj4gPj4gcmVnaXN0ZXJzKSwgd2hpY2ggc3RhdGVz Ogo+ID4+Cj4gPj4gPHF1b3RlPgo+ID4+IEFyY2hpdGVjdHVyYWwgZXhlY3V0aW9uIG9mIGEgRFNC IGluc3RydWN0aW9uIGd1YXJhbnRlZXMgdGhhdAo+ID4+IOKAlCBUaGUgbGFzdCB2YWx1ZSB3cml0 dGVuIHRvIElDQ19QTVJfRUwxIG9yIEdJQ0NfUE1SIGlzIG9ic2VydmVkIGJ5IHRoZQo+ID4+IGFz c29jaWF0ZWQgUmVkaXN0cmlidXRvci4KPiA+PiA8L3F1b3RlPgo+ID4+Cj4gPj4gU28geWVzLCBE U0IgaXMgcmVxdWlyZWQuCj4gPiAKPiA+IEJ1dCBpdCBzYXlzIG5laXRoZXIgd2hhdCBpcyBtZWFu cyBmb3IgdGhlIFBNUiB3cml0ZSB0byBiZSAib2JzZXJ2ZWQgYnkKPiA+IHRoZSByZWRpc3RyaWJ1 dG9yIiwgbm9yIHdoZXRoZXIgdGhlIERTQiBpcyByZXF1aXJlZCBmb3IgdGhlCj4gPiByZWRpc3Ry aWJ1dG9yIHRvIG9ic2VydmUgdGhlIHdyaXRlIGF0IGFsbC4gIChTbywgaXMgYW4gaW1wbGVtZW50 YXRpb24KPiA+IGFsbG93ZWQgdG8gY2FjaGVkIGluIHRoZSBDUFUgaW50ZXJmYWNlIGluZGVmaW5p dGVseSB1bnRpbCBmb3JjaWJseQo+ID4gZmx1c2hlZCB0byB0aGUgcmVkaXN0cmlidXRvciBieSBh IERTQiwgYW5kIGluIGFueSBjYXNlIGNhbiB0aGUgd3JpdGUncwo+ID4gcmVhY2hpbmcgdGhlIGRp c3RyaWJ1dG9yIGluIGZpbml0ZSB0aW1lIG9yIG5vdCBoYXZlIGFueSBlZmZlY3QgdGhhdCB3ZQo+ ID4gY2FyZSBhYm91dCBpbiB0aGlzIGNhc2U/KS4KPiA+IAo+ID4gCj4gPiBNeSByZWFzb24gZm9y IHF1ZXJ5aW5nIHRoaXMgaXMgdGhhdCB0ZW1wb3JhcnkgbG9jYWwgbWFza2luZyBvZiBjbGFzc2Vz Cj4gPiBvZiBpbnRlcnJ1cHRzIHNlZW1zIGFuIG9idmlvdXMgdXNlIGNhc2UgZm9yIHRoZSBQTVIs IGFuZCB0aGUgRFNCCj4gPiByZXF1aXJlbWVudCBmbGllcyByYXRoZXIgaW4gdGhlIGZhY2Ugb2Yg dGhpcy4KPiA+IAo+ID4gCj4gPiBIYXZlIHdlIHNlZW4gaGFyZHdhcmUgd2hlcmUgaW50ZXJydXB0 cyBtYXkgc3RhbGwgZm9yZXZlciB1cHN0cmVhbSBvZiB0aGUKPiA+IENQVSBpbnRlcmZhY2UgYWZ0 ZXIgYSBQTVIgd3JpdGUsIHVudGlsIGEgZHNiIGlzIGV4ZWN1dGVkIGJ5IHRoZSBDUFU/Cj4gPiAK PiAKPiBJIGRvbid0IGhhdmUgdG9vIG11Y2ggR0lDdjMgaGFyZHdhcmUgYXQgaGFuZCBidXQgdGhl IG9uZSBJIHRlc3RlZAo+ICpzZWVtcyogdG8gd29yayB3aXRob3V0IHRoZSBEU0IuIEJ1dCBvZiBj b3Vyc2UgdGhpcyBkb2VzIG5vdCBtZWFuIGl0IGlzCj4gY29ycmVjdCBldmVuIG9uIHRoYXQgaGFy ZHdhcmUuCj4gCj4gQXMgeW91IHNhaWQgaXQgaXMgbm90IGNsZWFyIHdoYXQgaXMgbWVhbnQgYnkg Im9ic2VydmVkIGJ5IHRoZQo+IHJlZGlzdHJpYnV0b3IiLCBpdCBjYW4gbWVhbiB0aGF0IHRoZSBy ZWRpc3RyaWJ1dG9yIGlzIGFsbG93ZWQgdG8gc3RvcAo+IGZvcndhcmRpbmcgaW50ZXJydXB0cyBv ZiBsb3dlciBwcmlvcml0eSBvciBpdCBjYW4gbWVhbiB0aGF0IGl0IGFsd2F5cwo+IGZvcndhcmRz IHRoZW0gYXMgdGhlIENQVSBpbnRlcmZhY2UgaXMgcmVxdWlyZWQgdG8gcHJldmVudCBtYXNrZWQK PiBwcmlvcml0eSBpbnRlcnJ1cHRzIHRvIGJlIHNpZ25hbGVkIHRvIHRoZSBDUFUuIFRoZSBoYXJk d2FyZSBJJ20gdXNpbmcKPiBtaWdodCBiZSBpbiB0aGUgbGF0dGVyIGNhc2UuLi4gb3Igbm90Li4u Cj4gCj4gCj4gCj4gPiBJZiBzbyB0aGF0IGlzIHNhZCwgYnV0IEkgZ3Vlc3Mgd2UgaGF2ZSB0byBs aXZlIHdpdGggaXQuCj4gPiAKPiA+IEFsc28sIGlzIGl0IGV2ZXIgaW1wb3J0YW50IGluIExpbnV4 IHRoYXQgYSBwZW5kaW5nIGludGVycnVwdCBiZSB0YWtlbgo+ID4gaW1tZWRpYXRlbHkgdXBvbiB1 bm1hc2tpbmcgKGFuZCBob3cgZG8gd2Uga25vdyB0aGF0IHNhaWQgaW50ZXJydXB0IGlzCj4gPiBw ZW5kaW5nKT8gIElmIG5vdCwgd2UgZG9uJ3QgY2FyZSBwcmVjaXNlbHkgd2hlbiBzdWNoIGludGVy cnVwdHMgYXJlCj4gPiBwZW5kZWQgdG8gdGhlIFBFLCBqdXN0IHRoYXQgc3VjaCBhbiBpbnRlcnJ1 cHQgY2Fubm90IGJlIHRha2VuIGJlZm9yZQo+ID4gdGhlIFBNUiB3cml0ZSB0aGF0IHVubWFza3Mg aXQuICBJdCB3b3VsZCBiZSBpbnNhbmUgZm9yIHRoZSBzZWxmLQo+ID4gc3luY2hyb25pemF0aW9u IG9mIFBNUiB3cml0ZXMgdG8gbGFjayB0aGlzIGd1YXJhbnRlZSAoYW5kIGEgRFNCIGFmdGVyCj4g PiB0aGUgUE1SIHdyaXRlIHdvdWxkIGRvIG5vIGdvb2QgYW55d2F5IGluIHRoYXQgY2FzZSkuCj4g PiAKPiAKPiBUaGUgZmlyc3QgdGhpbmcgdGhhdCBjb21lcyB0byBtaW5kIGZvciB0aGlzIHdvdWxk IGJlIHRoZSBSVCB3b3JsZCwgSSdtCj4gbm90IHN1cmUgaXQgd291bGQgaXQgd291bGQgYmUgbmlj ZSB0byBoYXZlIGludGVycnVwdHMgImFjdHVhbGx5Cj4gdW5tYXNrZWQiIGF0IHNvbWUgcmFuZG9t IHRpbWUgaW4gdGhlIGZ1dHVyZS4KCklmIHRoZSBQTVIgd3JpdGUgd2VyZSB0byBzdGFydCBwcm9w YWdhdGluZyBpbW1lZGlhdGVseSBhbmQgRFNCIG1lcmVseQp3YWl0ZWQgZm9yIGl0IHRvIHJlYWNo IHRoZSByZWRpc3RyaWJ1dG9yLCB0aGVuIHRoZXJlIHdvdWxkIGJlIG5vCnJhbmRvbSBkZWxheSAt LSByYXRoZXIsIHRoZSBEU0Igd291bGQgZ2VuZXJhdGUgc29tZSBwb2ludGxlc3Mgc3lzdGVtCmxv YWQgYW5kIHByZXZlbnQgYW55IHVzZWZ1bCB3b3JrIGJlaW5nIGRvbmUgaW4gdGhlIGludGVyaW0s IHdpdGhvdXQKYWN0dWFsbHkgc3BlZWRpbmcgYW55dGhpbmcgdXAuCgpPZiBjb3Vyc2UsIGl0IHNv dW5kcyBsaWtlIHRoZSBHSUMgc3BlYyBkb2Vzbid0IG1hbmRhdGUgc3VjaCBhbgppbXBsZW1lbnRh dGlvbiwgc28gd2UgY2FuJ3QgcmVseSBvbiB0aGlzLgoKPiBPdGhlcndpc2UsIGFyZW4ndCB0aGVy ZSBzb21lIHBhcnRzIG9mIHRoZSBrZXJuZWwgdGhhdCBleHBlY3QgYmVpbmcgYWJsZQo+IHRvIHRh a2UgaW50ZXJydXB0cz8gKG1lbW9yeSBhbGxvY2F0aW9uIGNvbWVzIHRvIG1pbmQpLiBXaGF0IGhh cHBlbnMgaWYKPiB0aGUgaW50ZXJydXB0IG1pZ2h0IG5vdCBoYXBwZW4/Cj4gCj4gQWxzbywgY29k ZSB0aGF0IGRvZXM6Cj4gCj4gd2hpbGUgKCFwb2xsX3VwZGF0ZV9mcm9tX2lycSgpKSB7Cj4gCWxv Y2FsX2lycV9kaXNhYmxlKCk7Cj4gCj4gCS8vIGRvIHN0dWZmCj4gCj4gCWxvY2FsX2lycV9lbmFi bGUoKTsKPiB9Cj4gCj4gTWlnaHQgbmV2ZXIgc2VlIGludGVycnVwdHMuIEl0IGlzIG5vdCBjbGVh ciB0byBtZSB3aGV0aGVyIHRoYXQgaXMgdGhlCj4gY2FzZSBmb3IgdGhlIGxvb3AgaW4gZG9faWRs ZSgpIGFuZCB0aGUgY2hlY2sgZm9yIG5lZWRfcmVzY2hlZCgpLgo+IAo+IEkgZG9uJ3Qga25vdyBp ZiBkcml2ZXJzIG1pZ2h0IGhhdmUgc3VjaCBjb2RlIHBhdHRlcm5zLgoKRm9yIGFwcHJvcHJpYXRl IHNlbGYtc3luY2hyb25pc2luZyBiZWhhdmlvdXIgaW4gUE1SIHdyaXRlcywgdGhpcwpwcm9ibGVt IGlzIHNvbHZhYmxlOiBpZiB5b3UgaGF2ZSBhIHBlbmRpbmcgUE1SIHdyaXRlIGZvbGxvd2VkIGJ5 IGEKUE1SIHdyaXRlIHdpdGggYSBtb3JlIHJlc3RyaWN0aXZlIGJvdW5kIChzbyBkaXNhYmxpbmcg c29tZSBpbnRlcnJ1cHRzKQp0aGVuIHRoZSBzZWNvbmQgd3JpdGUgY291bGQgYmUgc3RhbGxlZCB1 bnRpbCB0aGUgZmlyc3QgaGFzIHN5bmNocm9uaXNlZCwKcHJvdmlkaW5nIGFuIG9wcG9ydHVuaXR5 IHRvIHRha2UgcGVuZGluZyBpbnRlcnJ1cHRzIGJlZm9yZSB0aGV5IHdvdWxkCmdldCBtYXNrZWQu CgpUaGVyZSBtaWdodCBiZSBpbXBsZW1lbnRhdGlvbnMgdGhhdCBkbyBzb21ldGhpbmcgbGlrZSB0 aGlzLCBidXQgSSBndWVzcwp3ZSBjYW4ndCByZWx5IG9uIHRoaXMgZWl0aGVyLgoKSSdsbCBkZWZl ciB0byB0aGUgZXhwZXJ0cy4uLgoKQ2hlZXJzCi0tLURhdmUKCl9fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fCmxpbnV4LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0 CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFk ZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFybS1rZXJuZWwK