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=-10.3 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,MAILING_LIST_MULTI, NICE_REPLY_A,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_SANE_1 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 74761C433DB for ; Mon, 22 Mar 2021 23:01:39 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 3B029619A4 for ; Mon, 22 Mar 2021 23:01:39 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230174AbhCVXBJ (ORCPT ); Mon, 22 Mar 2021 19:01:09 -0400 Received: from foss.arm.com ([217.140.110.172]:38854 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229995AbhCVXAh (ORCPT ); Mon, 22 Mar 2021 19:00:37 -0400 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id DF45ED6E; Mon, 22 Mar 2021 16:00:36 -0700 (PDT) Received: from [10.57.55.187] (unknown [10.57.55.187]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id E16583F792; Mon, 22 Mar 2021 16:00:35 -0700 (PDT) Subject: Re: [PATCH v4 18/19] coresight: sink: Add TRBE driver To: Mathieu Poirier , Mike Leach Cc: linux-arm-kernel , Linux Kernel Mailing List , Anshuman Khandual , Leo Yan References: <20210225193543.2920532-1-suzuki.poulose@arm.com> <20210225193543.2920532-19-suzuki.poulose@arm.com> <5685C840-7F03-4A53-9183-D5771308F5B8@arm.com> <20210322212443.GB1684006@xps15> From: Suzuki K Poulose Message-ID: <29a2e793-c679-939f-70fb-455effbcaba1@arm.com> Date: Mon, 22 Mar 2021 23:00:34 +0000 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.16; rv:78.0) Gecko/20100101 Thunderbird/78.8.1 MIME-Version: 1.0 In-Reply-To: <20210322212443.GB1684006@xps15> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-GB Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 22/03/2021 21:24, Mathieu Poirier wrote: > On Fri, Mar 19, 2021 at 11:55:10AM +0000, Mike Leach wrote: >> HI Suzuki, >> >> On Fri, 19 Mar 2021 at 10:30, Suzuki K Poulose wrote: >>> >>> Hi Mike >>> >>>> On 8 Mar 2021, at 17:26, Mike Leach wrote: >>>> >>>> Hi Suzuki, >>>> >>>> On Thu, 25 Feb 2021 at 19:36, Suzuki K Poulose wrote: >>>>> >>>>> From: Anshuman Khandual >>>>> >>>>> Trace Buffer Extension (TRBE) implements a trace buffer per CPU which is >>>>> accessible via the system registers. The TRBE supports different addressing >>>>> modes including CPU virtual address and buffer modes including the circular >>>>> buffer mode. The TRBE buffer is addressed by a base pointer (TRBBASER_EL1), >>>>> an write pointer (TRBPTR_EL1) and a limit pointer (TRBLIMITR_EL1). But the >>>>> access to the trace buffer could be prohibited by a higher exception level >>>>> (EL3 or EL2), indicated by TRBIDR_EL1.P. The TRBE can also generate a CPU >>>>> private interrupt (PPI) on address translation errors and when the buffer >>>>> is full. Overall implementation here is inspired from the Arm SPE driver. >>>>> >>>>> Cc: Mathieu Poirier >>>>> Cc: Mike Leach >>>>> Cc: Suzuki K Poulose >>>>> Signed-off-by: Anshuman Khandual >>>>> Signed-off-by: Suzuki K Poulose >>>>> >>>>> + >>>>> +static unsigned long arm_trbe_update_buffer(struct coresight_device *csdev, >>>>> + struct perf_output_handle *handle, >>>>> + void *config) >>>>> +{ >>>>> + struct trbe_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent); >>>>> + struct trbe_cpudata *cpudata = dev_get_drvdata(&csdev->dev); >>>>> + struct trbe_buf *buf = config; >>>>> + enum trbe_fault_action act; >>>>> + unsigned long size, offset; >>>>> + unsigned long write, base, status; >>>>> + unsigned long flags; >>>>> + >>>>> + WARN_ON(buf->cpudata != cpudata); >>>>> + WARN_ON(cpudata->cpu != smp_processor_id()); >>>>> + WARN_ON(cpudata->drvdata != drvdata); >>>>> + if (cpudata->mode != CS_MODE_PERF) >>>>> + return 0; >>>>> + >>>>> + perf_aux_output_flag(handle, PERF_AUX_FLAG_CORESIGHT_FORMAT_RAW); >>>>> + >>>>> + /* >>>>> + * We are about to disable the TRBE. And this could in turn >>>>> + * fill up the buffer triggering, an IRQ. This could be consumed >>>>> + * by the PE asynchronously, causing a race here against >>>>> + * the IRQ handler in closing out the handle. So, let us >>>>> + * make sure the IRQ can't trigger while we are collecting >>>>> + * the buffer. We also make sure that a WRAP event is handled >>>>> + * accordingly. >>>>> + */ >>>>> + local_irq_save(flags); >>>>> + >>>>> + /* >>>>> + * If the TRBE was disabled due to lack of space in the AUX buffer or a >>>>> + * spurious fault, the driver leaves it disabled, truncating the buffer. >>>>> + * Since the etm_perf driver expects to close out the AUX buffer, the >>>>> + * driver skips it. Thus, just pass in 0 size here to indicate that the >>>>> + * buffer was truncated. >>>>> + */ >>>>> + if (!is_trbe_enabled()) { >>>>> + size = 0; >>>>> + goto done; >>>>> + } >>>>> + /* >>>>> + * perf handle structure needs to be shared with the TRBE IRQ handler for >>>>> + * capturing trace data and restarting the handle. There is a probability >>>>> + * of an undefined reference based crash when etm event is being stopped >>>>> + * while a TRBE IRQ also getting processed. This happens due the release >>>>> + * of perf handle via perf_aux_output_end() in etm_event_stop(). Stopping >>>>> + * the TRBE here will ensure that no IRQ could be generated when the perf >>>>> + * handle gets freed in etm_event_stop(). >>>>> + */ >>>>> + trbe_drain_and_disable_local(); >>>>> + write = get_trbe_write_pointer(); >>>>> + base = get_trbe_base_pointer(); >>>>> + >>>>> + /* Check if there is a pending interrupt and handle it here */ >>>>> + status = read_sysreg_s(SYS_TRBSR_EL1); >>>>> + if (is_trbe_irq(status)) { >>>>> + >>>>> + /* >>>>> + * Now that we are handling the IRQ here, clear the IRQ >>>>> + * from the status, to let the irq handler know that it >>>>> + * is taken care of. >>>>> + */ >>>>> + clr_trbe_irq(); >>>>> + isb(); >>>>> + >>>>> + act = trbe_get_fault_act(status); >>>>> + /* >>>>> + * If this was not due to a WRAP event, we have some >>>>> + * errors and as such buffer is empty. >>>>> + */ >>>>> + if (act != TRBE_FAULT_ACT_WRAP) { >>>>> + size = 0; >>>>> + goto done; >>>>> + } >>>> >>>> We are using TRBE FILL mode - which halts capture on a full buffer and >>>> triggers the IRQ, without disabling the source first. >>>> This means that the mode is inherently lossy (unless by some unlikely >>>> co-incidence the last byte that caused the wrap was also the last byte >>>> to be sent from an ETE that was in the process of being disabled.) >>>> Therefore we must have a perf_aux_output_flag(handle, >>>> PERF_AUX_FLAG_TRUNCATED) call in here to signal that some trace was >>>> lost, for consistence of operation with ETR etc, and intelpt. >>>> >>> >>> I agree that the there is a bit of loss here due to the FILL mode. But it is not comparable to that of the ETR. In this case, the WRAP event is triggered when we flush the ETE. i.e, this could be mostly due to the fact that the tracing was enabled for the kernel mode and the last few bytes of trace which caused the FILL belong to the code responsible for stopping the components in the CoreSight trace. I personally do not think this data is of any interest to the user. >>> Otherwise, if the data didn’t belong to the perf event side, it should have triggered the IRQ. >>> >>> This is true in case of the buffer overflow interrupt too, with a bit more data lost. i.e, since the interrupt is PPI, the overflow is triggered when the buffer is full (which includes the data that is cached in the TRBE). But there could be a bit of data that is still cached in the ETE, before it is captured in the trace. And the moment we get a FILL event, we stop executing anything that is relevant for the Trace session (as we are in the driver handling the interrupt). >>> And then we reconfigure the buffer to continue the execution. Now, the interrupt delivery is not necessarily synchronous and there could be data lost in the interval between WRAP event and the IRQ is triggered. >>> >>> I am OK with suggesting that there was some loss of trace data during the session, if we hit WRAP event. But this could cause worry to the consumers that they lost too much of trace data of their interest, while that is not the case. >>> >> >> We can never know what has been lost. It may be some trace around the >> driver of no interest to the user, it may also be an event or >> timestamp related to an earlier marker - which could be highly >> relevant. >> With ETR we do not know how much is lost on wrap - it might be one >> byte, it might be much more - but the point is we mark as truncated >> for _any_ amount. >> >> It is unfortunate that we will see multiple buffers marked as >> truncated - but this is far better than creating the false impression >> that no trace has been lost - that there is a continuous record where >> there is not. >> For some users - such as autofdo where sampling is taking place anyway >> - truncated buffers probably do not matter. For others - who are >> looking to trace a specific section of code - then they need to be >> aware that there could be decode anomolies relating to buffer wrap. >> > > I think Mike has a point here - we should report it to users when data gets > lost, no matter how small that lost is. If that is a problem they always have > the choice of dedicating more pages to the AUX buffer. Agreed, I have included this in the next version. Thanks Suzuki 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=-10.5 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, MAILING_LIST_MULTI,NICE_REPLY_A,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_SANE_1 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 34F61C433E0 for ; Mon, 22 Mar 2021 23:02:26 +0000 (UTC) Received: from desiato.infradead.org (desiato.infradead.org [90.155.92.199]) (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 A3DAC61984 for ; Mon, 22 Mar 2021 23:02:25 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org A3DAC61984 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=arm.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+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=desiato.20200630; h=Sender:Content-Type: Content-Transfer-Encoding:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:Date:Message-ID:From: References:Cc:To:Subject:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=zFR3FjAWGkH5b02nwVK67Uax0wCQ0sGQRKhWgjeC+ro=; b=jR8zi00KqVZ73PO5sh/J2OlO5 JMfn0SO69jZNKyiP7FZ3bqPzRWNGmWC3qChr/iV4VUx8uC0uFAS6hG9f2ba4gdlYkv/XizGSOWo6g e+u4e+CTe7B/AQmxi6LNkV4kuogPWbw8GZpl2em9W8rbV52sD9H/ArhDUYJU4NWY5Mvp7PtaFfzvp rEIt8pec82NHZKNLlGVFxpAPB/EsVtkSZQtwFGkHnXySbZl9HgHbYa20VLGiBj4+uWNsqZBgJ1PS7 VjR/SxpC13IOKNfN6DtpIjxtHWufpCYVda8OMB9J2jxY4PM/E/lK6C/eDOmz/XjLx1P6zGEBLTomR YzYqFGvpA==; Received: from localhost ([::1] helo=desiato.infradead.org) by desiato.infradead.org with esmtp (Exim 4.94 #2 (Red Hat Linux)) id 1lOTXP-00Cn0K-32; Mon, 22 Mar 2021 23:00:43 +0000 Received: from foss.arm.com ([217.140.110.172]) by desiato.infradead.org with esmtp (Exim 4.94 #2 (Red Hat Linux)) id 1lOTXK-00Cmz2-LC for linux-arm-kernel@lists.infradead.org; Mon, 22 Mar 2021 23:00:40 +0000 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id DF45ED6E; Mon, 22 Mar 2021 16:00:36 -0700 (PDT) Received: from [10.57.55.187] (unknown [10.57.55.187]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id E16583F792; Mon, 22 Mar 2021 16:00:35 -0700 (PDT) Subject: Re: [PATCH v4 18/19] coresight: sink: Add TRBE driver To: Mathieu Poirier , Mike Leach Cc: linux-arm-kernel , Linux Kernel Mailing List , Anshuman Khandual , Leo Yan References: <20210225193543.2920532-1-suzuki.poulose@arm.com> <20210225193543.2920532-19-suzuki.poulose@arm.com> <5685C840-7F03-4A53-9183-D5771308F5B8@arm.com> <20210322212443.GB1684006@xps15> From: Suzuki K Poulose Message-ID: <29a2e793-c679-939f-70fb-455effbcaba1@arm.com> Date: Mon, 22 Mar 2021 23:00:34 +0000 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.16; rv:78.0) Gecko/20100101 Thunderbird/78.8.1 MIME-Version: 1.0 In-Reply-To: <20210322212443.GB1684006@xps15> Content-Language: en-GB X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210322_230039_000011_30C88A3D X-CRM114-Status: GOOD ( 43.36 ) 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-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org T24gMjIvMDMvMjAyMSAyMToyNCwgTWF0aGlldSBQb2lyaWVyIHdyb3RlOgo+IE9uIEZyaSwgTWFy IDE5LCAyMDIxIGF0IDExOjU1OjEwQU0gKzAwMDAsIE1pa2UgTGVhY2ggd3JvdGU6Cj4+IEhJIFN1 enVraSwKPj4KPj4gT24gRnJpLCAxOSBNYXIgMjAyMSBhdCAxMDozMCwgU3V6dWtpIEsgUG91bG9z ZSA8c3V6dWtpLnBvdWxvc2VAYXJtLmNvbT4gd3JvdGU6Cj4+Pgo+Pj4gSGkgTWlrZQo+Pj4KPj4+ PiBPbiA4IE1hciAyMDIxLCBhdCAxNzoyNiwgTWlrZSBMZWFjaCA8bWlrZS5sZWFjaEBsaW5hcm8u b3JnPiB3cm90ZToKPj4+Pgo+Pj4+IEhpIFN1enVraSwKPj4+Pgo+Pj4+IE9uIFRodSwgMjUgRmVi IDIwMjEgYXQgMTk6MzYsIFN1enVraSBLIFBvdWxvc2UgPHN1enVraS5wb3Vsb3NlQGFybS5jb20+ IHdyb3RlOgo+Pj4+Pgo+Pj4+PiBGcm9tOiBBbnNodW1hbiBLaGFuZHVhbCA8YW5zaHVtYW4ua2hh bmR1YWxAYXJtLmNvbT4KPj4+Pj4KPj4+Pj4gVHJhY2UgQnVmZmVyIEV4dGVuc2lvbiAoVFJCRSkg aW1wbGVtZW50cyBhIHRyYWNlIGJ1ZmZlciBwZXIgQ1BVIHdoaWNoIGlzCj4+Pj4+IGFjY2Vzc2li bGUgdmlhIHRoZSBzeXN0ZW0gcmVnaXN0ZXJzLiBUaGUgVFJCRSBzdXBwb3J0cyBkaWZmZXJlbnQg YWRkcmVzc2luZwo+Pj4+PiBtb2RlcyBpbmNsdWRpbmcgQ1BVIHZpcnR1YWwgYWRkcmVzcyBhbmQg YnVmZmVyIG1vZGVzIGluY2x1ZGluZyB0aGUgY2lyY3VsYXIKPj4+Pj4gYnVmZmVyIG1vZGUuIFRo ZSBUUkJFIGJ1ZmZlciBpcyBhZGRyZXNzZWQgYnkgYSBiYXNlIHBvaW50ZXIgKFRSQkJBU0VSX0VM MSksCj4+Pj4+IGFuIHdyaXRlIHBvaW50ZXIgKFRSQlBUUl9FTDEpIGFuZCBhIGxpbWl0IHBvaW50 ZXIgKFRSQkxJTUlUUl9FTDEpLiBCdXQgdGhlCj4+Pj4+IGFjY2VzcyB0byB0aGUgdHJhY2UgYnVm ZmVyIGNvdWxkIGJlIHByb2hpYml0ZWQgYnkgYSBoaWdoZXIgZXhjZXB0aW9uIGxldmVsCj4+Pj4+ IChFTDMgb3IgRUwyKSwgaW5kaWNhdGVkIGJ5IFRSQklEUl9FTDEuUC4gVGhlIFRSQkUgY2FuIGFs c28gZ2VuZXJhdGUgYSBDUFUKPj4+Pj4gcHJpdmF0ZSBpbnRlcnJ1cHQgKFBQSSkgb24gYWRkcmVz cyB0cmFuc2xhdGlvbiBlcnJvcnMgYW5kIHdoZW4gdGhlIGJ1ZmZlcgo+Pj4+PiBpcyBmdWxsLiBP dmVyYWxsIGltcGxlbWVudGF0aW9uIGhlcmUgaXMgaW5zcGlyZWQgZnJvbSB0aGUgQXJtIFNQRSBk cml2ZXIuCj4+Pj4+Cj4+Pj4+IENjOiBNYXRoaWV1IFBvaXJpZXIgPG1hdGhpZXUucG9pcmllckBs aW5hcm8ub3JnPgo+Pj4+PiBDYzogTWlrZSBMZWFjaCA8bWlrZS5sZWFjaEBsaW5hcm8ub3JnPgo+ Pj4+PiBDYzogU3V6dWtpIEsgUG91bG9zZSA8c3V6dWtpLnBvdWxvc2VAYXJtLmNvbT4KPj4+Pj4g U2lnbmVkLW9mZi1ieTogQW5zaHVtYW4gS2hhbmR1YWwgPGFuc2h1bWFuLmtoYW5kdWFsQGFybS5j b20+Cj4+Pj4+IFNpZ25lZC1vZmYtYnk6IFN1enVraSBLIFBvdWxvc2UgPHN1enVraS5wb3Vsb3Nl QGFybS5jb20+Cj4+Pj4+Cj4+Pj4+ICsKPj4+Pj4gK3N0YXRpYyB1bnNpZ25lZCBsb25nIGFybV90 cmJlX3VwZGF0ZV9idWZmZXIoc3RydWN0IGNvcmVzaWdodF9kZXZpY2UgKmNzZGV2LAo+Pj4+PiAr ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBwZXJmX291 dHB1dF9oYW5kbGUgKmhhbmRsZSwKPj4+Pj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICB2b2lkICpjb25maWcpCj4+Pj4+ICt7Cj4+Pj4+ICsgICAgICAgc3RydWN0 IHRyYmVfZHJ2ZGF0YSAqZHJ2ZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShjc2Rldi0+ZGV2LnBhcmVu dCk7Cj4+Pj4+ICsgICAgICAgc3RydWN0IHRyYmVfY3B1ZGF0YSAqY3B1ZGF0YSA9IGRldl9nZXRf ZHJ2ZGF0YSgmY3NkZXYtPmRldik7Cj4+Pj4+ICsgICAgICAgc3RydWN0IHRyYmVfYnVmICpidWYg PSBjb25maWc7Cj4+Pj4+ICsgICAgICAgZW51bSB0cmJlX2ZhdWx0X2FjdGlvbiBhY3Q7Cj4+Pj4+ ICsgICAgICAgdW5zaWduZWQgbG9uZyBzaXplLCBvZmZzZXQ7Cj4+Pj4+ICsgICAgICAgdW5zaWdu ZWQgbG9uZyB3cml0ZSwgYmFzZSwgc3RhdHVzOwo+Pj4+PiArICAgICAgIHVuc2lnbmVkIGxvbmcg ZmxhZ3M7Cj4+Pj4+ICsKPj4+Pj4gKyAgICAgICBXQVJOX09OKGJ1Zi0+Y3B1ZGF0YSAhPSBjcHVk YXRhKTsKPj4+Pj4gKyAgICAgICBXQVJOX09OKGNwdWRhdGEtPmNwdSAhPSBzbXBfcHJvY2Vzc29y X2lkKCkpOwo+Pj4+PiArICAgICAgIFdBUk5fT04oY3B1ZGF0YS0+ZHJ2ZGF0YSAhPSBkcnZkYXRh KTsKPj4+Pj4gKyAgICAgICBpZiAoY3B1ZGF0YS0+bW9kZSAhPSBDU19NT0RFX1BFUkYpCj4+Pj4+ ICsgICAgICAgICAgICAgICByZXR1cm4gMDsKPj4+Pj4gKwo+Pj4+PiArICAgICAgIHBlcmZfYXV4 X291dHB1dF9mbGFnKGhhbmRsZSwgUEVSRl9BVVhfRkxBR19DT1JFU0lHSFRfRk9STUFUX1JBVyk7 Cj4+Pj4+ICsKPj4+Pj4gKyAgICAgICAvKgo+Pj4+PiArICAgICAgICAqIFdlIGFyZSBhYm91dCB0 byBkaXNhYmxlIHRoZSBUUkJFLiBBbmQgdGhpcyBjb3VsZCBpbiB0dXJuCj4+Pj4+ICsgICAgICAg ICogZmlsbCB1cCB0aGUgYnVmZmVyIHRyaWdnZXJpbmcsIGFuIElSUS4gVGhpcyBjb3VsZCBiZSBj b25zdW1lZAo+Pj4+PiArICAgICAgICAqIGJ5IHRoZSBQRSBhc3luY2hyb25vdXNseSwgY2F1c2lu ZyBhIHJhY2UgaGVyZSBhZ2FpbnN0Cj4+Pj4+ICsgICAgICAgICogdGhlIElSUSBoYW5kbGVyIGlu IGNsb3Npbmcgb3V0IHRoZSBoYW5kbGUuIFNvLCBsZXQgdXMKPj4+Pj4gKyAgICAgICAgKiBtYWtl IHN1cmUgdGhlIElSUSBjYW4ndCB0cmlnZ2VyIHdoaWxlIHdlIGFyZSBjb2xsZWN0aW5nCj4+Pj4+ ICsgICAgICAgICogdGhlIGJ1ZmZlci4gV2UgYWxzbyBtYWtlIHN1cmUgdGhhdCBhIFdSQVAgZXZl bnQgaXMgaGFuZGxlZAo+Pj4+PiArICAgICAgICAqIGFjY29yZGluZ2x5Lgo+Pj4+PiArICAgICAg ICAqLwo+Pj4+PiArICAgICAgIGxvY2FsX2lycV9zYXZlKGZsYWdzKTsKPj4+Pj4gKwo+Pj4+PiAr ICAgICAgIC8qCj4+Pj4+ICsgICAgICAgICogSWYgdGhlIFRSQkUgd2FzIGRpc2FibGVkIGR1ZSB0 byBsYWNrIG9mIHNwYWNlIGluIHRoZSBBVVggYnVmZmVyIG9yIGEKPj4+Pj4gKyAgICAgICAgKiBz cHVyaW91cyBmYXVsdCwgdGhlIGRyaXZlciBsZWF2ZXMgaXQgZGlzYWJsZWQsIHRydW5jYXRpbmcg dGhlIGJ1ZmZlci4KPj4+Pj4gKyAgICAgICAgKiBTaW5jZSB0aGUgZXRtX3BlcmYgZHJpdmVyIGV4 cGVjdHMgdG8gY2xvc2Ugb3V0IHRoZSBBVVggYnVmZmVyLCB0aGUKPj4+Pj4gKyAgICAgICAgKiBk cml2ZXIgc2tpcHMgaXQuIFRodXMsIGp1c3QgcGFzcyBpbiAwIHNpemUgaGVyZSB0byBpbmRpY2F0 ZSB0aGF0IHRoZQo+Pj4+PiArICAgICAgICAqIGJ1ZmZlciB3YXMgdHJ1bmNhdGVkLgo+Pj4+PiAr ICAgICAgICAqLwo+Pj4+PiArICAgICAgIGlmICghaXNfdHJiZV9lbmFibGVkKCkpIHsKPj4+Pj4g KyAgICAgICAgICAgICAgIHNpemUgPSAwOwo+Pj4+PiArICAgICAgICAgICAgICAgZ290byBkb25l Owo+Pj4+PiArICAgICAgIH0KPj4+Pj4gKyAgICAgICAvKgo+Pj4+PiArICAgICAgICAqIHBlcmYg aGFuZGxlIHN0cnVjdHVyZSBuZWVkcyB0byBiZSBzaGFyZWQgd2l0aCB0aGUgVFJCRSBJUlEgaGFu ZGxlciBmb3IKPj4+Pj4gKyAgICAgICAgKiBjYXB0dXJpbmcgdHJhY2UgZGF0YSBhbmQgcmVzdGFy dGluZyB0aGUgaGFuZGxlLiBUaGVyZSBpcyBhIHByb2JhYmlsaXR5Cj4+Pj4+ICsgICAgICAgICog b2YgYW4gdW5kZWZpbmVkIHJlZmVyZW5jZSBiYXNlZCBjcmFzaCB3aGVuIGV0bSBldmVudCBpcyBi ZWluZyBzdG9wcGVkCj4+Pj4+ICsgICAgICAgICogd2hpbGUgYSBUUkJFIElSUSBhbHNvIGdldHRp bmcgcHJvY2Vzc2VkLiBUaGlzIGhhcHBlbnMgZHVlIHRoZSByZWxlYXNlCj4+Pj4+ICsgICAgICAg ICogb2YgcGVyZiBoYW5kbGUgdmlhIHBlcmZfYXV4X291dHB1dF9lbmQoKSBpbiBldG1fZXZlbnRf c3RvcCgpLiBTdG9wcGluZwo+Pj4+PiArICAgICAgICAqIHRoZSBUUkJFIGhlcmUgd2lsbCBlbnN1 cmUgdGhhdCBubyBJUlEgY291bGQgYmUgZ2VuZXJhdGVkIHdoZW4gdGhlIHBlcmYKPj4+Pj4gKyAg ICAgICAgKiBoYW5kbGUgZ2V0cyBmcmVlZCBpbiBldG1fZXZlbnRfc3RvcCgpLgo+Pj4+PiArICAg ICAgICAqLwo+Pj4+PiArICAgICAgIHRyYmVfZHJhaW5fYW5kX2Rpc2FibGVfbG9jYWwoKTsKPj4+ Pj4gKyAgICAgICB3cml0ZSA9IGdldF90cmJlX3dyaXRlX3BvaW50ZXIoKTsKPj4+Pj4gKyAgICAg ICBiYXNlID0gZ2V0X3RyYmVfYmFzZV9wb2ludGVyKCk7Cj4+Pj4+ICsKPj4+Pj4gKyAgICAgICAv KiBDaGVjayBpZiB0aGVyZSBpcyBhIHBlbmRpbmcgaW50ZXJydXB0IGFuZCBoYW5kbGUgaXQgaGVy ZSAqLwo+Pj4+PiArICAgICAgIHN0YXR1cyA9IHJlYWRfc3lzcmVnX3MoU1lTX1RSQlNSX0VMMSk7 Cj4+Pj4+ICsgICAgICAgaWYgKGlzX3RyYmVfaXJxKHN0YXR1cykpIHsKPj4+Pj4gKwo+Pj4+PiAr ICAgICAgICAgICAgICAgLyoKPj4+Pj4gKyAgICAgICAgICAgICAgICAqIE5vdyB0aGF0IHdlIGFy ZSBoYW5kbGluZyB0aGUgSVJRIGhlcmUsIGNsZWFyIHRoZSBJUlEKPj4+Pj4gKyAgICAgICAgICAg ICAgICAqIGZyb20gdGhlIHN0YXR1cywgdG8gbGV0IHRoZSBpcnEgaGFuZGxlciBrbm93IHRoYXQg aXQKPj4+Pj4gKyAgICAgICAgICAgICAgICAqIGlzIHRha2VuIGNhcmUgb2YuCj4+Pj4+ICsgICAg ICAgICAgICAgICAgKi8KPj4+Pj4gKyAgICAgICAgICAgICAgIGNscl90cmJlX2lycSgpOwo+Pj4+ PiArICAgICAgICAgICAgICAgaXNiKCk7Cj4+Pj4+ICsKPj4+Pj4gKyAgICAgICAgICAgICAgIGFj dCA9IHRyYmVfZ2V0X2ZhdWx0X2FjdChzdGF0dXMpOwo+Pj4+PiArICAgICAgICAgICAgICAgLyoK Pj4+Pj4gKyAgICAgICAgICAgICAgICAqIElmIHRoaXMgd2FzIG5vdCBkdWUgdG8gYSBXUkFQIGV2 ZW50LCB3ZSBoYXZlIHNvbWUKPj4+Pj4gKyAgICAgICAgICAgICAgICAqIGVycm9ycyBhbmQgYXMg c3VjaCBidWZmZXIgaXMgZW1wdHkuCj4+Pj4+ICsgICAgICAgICAgICAgICAgKi8KPj4+Pj4gKyAg ICAgICAgICAgICAgIGlmIChhY3QgIT0gVFJCRV9GQVVMVF9BQ1RfV1JBUCkgewo+Pj4+PiArICAg ICAgICAgICAgICAgICAgICAgICBzaXplID0gMDsKPj4+Pj4gKyAgICAgICAgICAgICAgICAgICAg ICAgZ290byBkb25lOwo+Pj4+PiArICAgICAgICAgICAgICAgfQo+Pj4+Cj4+Pj4gV2UgYXJlIHVz aW5nIFRSQkUgRklMTCBtb2RlIC0gd2hpY2ggaGFsdHMgY2FwdHVyZSBvbiBhIGZ1bGwgYnVmZmVy IGFuZAo+Pj4+IHRyaWdnZXJzIHRoZSBJUlEsIHdpdGhvdXQgZGlzYWJsaW5nIHRoZSBzb3VyY2Ug Zmlyc3QuCj4+Pj4gVGhpcyBtZWFucyB0aGF0IHRoZSBtb2RlIGlzIGluaGVyZW50bHkgbG9zc3kg KHVubGVzcyBieSBzb21lIHVubGlrZWx5Cj4+Pj4gY28taW5jaWRlbmNlIHRoZSBsYXN0IGJ5dGUg dGhhdCBjYXVzZWQgdGhlIHdyYXAgd2FzIGFsc28gdGhlIGxhc3QgYnl0ZQo+Pj4+IHRvIGJlIHNl bnQgZnJvbSBhbiBFVEUgdGhhdCB3YXMgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgZGlzYWJsZWQu KQo+Pj4+IFRoZXJlZm9yZSB3ZSBtdXN0IGhhdmUgYSBwZXJmX2F1eF9vdXRwdXRfZmxhZyhoYW5k bGUsCj4+Pj4gUEVSRl9BVVhfRkxBR19UUlVOQ0FURUQpIGNhbGwgaW4gaGVyZSB0byBzaWduYWwg dGhhdCBzb21lIHRyYWNlIHdhcwo+Pj4+IGxvc3QsIGZvciBjb25zaXN0ZW5jZSBvZiBvcGVyYXRp b24gd2l0aCBFVFIgZXRjLCBhbmQgaW50ZWxwdC4KPj4+Pgo+Pj4KPj4+IEkgYWdyZWUgdGhhdCB0 aGUgdGhlcmUgaXMgYSBiaXQgb2YgbG9zcyBoZXJlIGR1ZSB0byB0aGUgRklMTCBtb2RlLiBCdXQg aXQgaXMgbm90ICBjb21wYXJhYmxlIHRvIHRoYXQgb2YgdGhlIEVUUi4gSW4gdGhpcyBjYXNlLCB0 aGUgV1JBUCBldmVudCBpcyB0cmlnZ2VyZWQgd2hlbiB3ZSBmbHVzaCB0aGUgRVRFLiBpLmUsIHRo aXMgY291bGQgYmUgbW9zdGx5IGR1ZSB0byB0aGUgZmFjdCB0aGF0IHRoZSB0cmFjaW5nIHdhcyBl bmFibGVkIGZvciB0aGUga2VybmVsIG1vZGUgYW5kIHRoZSBsYXN0IGZldyBieXRlcyBvZiB0cmFj ZSB3aGljaCBjYXVzZWQgdGhlIEZJTEwgYmVsb25nIHRvIHRoZSBjb2RlIHJlc3BvbnNpYmxlIGZv ciBzdG9wcGluZyB0aGUgY29tcG9uZW50cyBpbiB0aGUgQ29yZVNpZ2h0IHRyYWNlLiBJIHBlcnNv bmFsbHkgZG8gbm90IHRoaW5rIHRoaXMgZGF0YSBpcyBvZiBhbnkgaW50ZXJlc3QgdG8gdGhlIHVz ZXIuCj4+PiBPdGhlcndpc2UsIGlmIHRoZSBkYXRhIGRpZG7igJl0IGJlbG9uZyB0byB0aGUgcGVy ZiBldmVudCBzaWRlLCBpdCBzaG91bGQgaGF2ZSB0cmlnZ2VyZWQgdGhlIElSUS4KPj4+Cj4+PiBU aGlzIGlzIHRydWUgaW4gY2FzZSBvZiB0aGUgYnVmZmVyIG92ZXJmbG93IGludGVycnVwdCB0b28s IHdpdGggYSBiaXQgbW9yZSBkYXRhIGxvc3QuIGkuZSwgc2luY2UgdGhlIGludGVycnVwdCBpcyBQ UEksIHRoZSBvdmVyZmxvdyBpcyB0cmlnZ2VyZWQgd2hlbiB0aGUgYnVmZmVyIGlzIGZ1bGwgKHdo aWNoIGluY2x1ZGVzIHRoZSBkYXRhIHRoYXQgaXMgY2FjaGVkIGluIHRoZSBUUkJFKS4gQnV0IHRo ZXJlIGNvdWxkIGJlIGEgYml0IG9mIGRhdGEgdGhhdCBpcyBzdGlsbCBjYWNoZWQgaW4gdGhlIEVU RSwgYmVmb3JlIGl0IGlzIGNhcHR1cmVkIGluIHRoZSB0cmFjZS4gQW5kIHRoZSBtb21lbnQgd2Ug Z2V0IGEgRklMTCBldmVudCwgd2Ugc3RvcCBleGVjdXRpbmcgYW55dGhpbmcgdGhhdCBpcyByZWxl dmFudCBmb3IgdGhlIFRyYWNlIHNlc3Npb24gKGFzIHdlIGFyZSBpbiB0aGUgZHJpdmVyIGhhbmRs aW5nIHRoZSBpbnRlcnJ1cHQpLgo+Pj4gQW5kIHRoZW4gd2UgcmVjb25maWd1cmUgdGhlIGJ1ZmZl ciB0byBjb250aW51ZSB0aGUgZXhlY3V0aW9uLiBOb3csIHRoZSBpbnRlcnJ1cHQgZGVsaXZlcnkg aXMgbm90IG5lY2Vzc2FyaWx5IHN5bmNocm9ub3VzIGFuZCB0aGVyZSBjb3VsZCBiZSBkYXRhIGxv c3QgaW4gdGhlIGludGVydmFsIGJldHdlZW4gV1JBUCBldmVudCBhbmQgdGhlIElSUSBpcyB0cmln Z2VyZWQuCj4+Pgo+Pj4gSSBhbSBPSyB3aXRoIHN1Z2dlc3RpbmcgdGhhdCB0aGVyZSB3YXMgc29t ZSBsb3NzIG9mIHRyYWNlIGRhdGEgZHVyaW5nIHRoZSBzZXNzaW9uLCBpZiB3ZSBoaXQgV1JBUCBl dmVudC4gQnV0IHRoaXMgY291bGQgY2F1c2Ugd29ycnkgdG8gdGhlIGNvbnN1bWVycyB0aGF0IHRo ZXkgbG9zdCB0b28gbXVjaCBvZiB0cmFjZSBkYXRhIG9mIHRoZWlyIGludGVyZXN0LCB3aGlsZSB0 aGF0IGlzIG5vdCB0aGUgY2FzZS4KPj4+Cj4+Cj4+IFdlIGNhbiBuZXZlciBrbm93IHdoYXQgaGFz IGJlZW4gbG9zdC4gSXQgbWF5IGJlIHNvbWUgdHJhY2UgYXJvdW5kIHRoZQo+PiBkcml2ZXIgb2Yg bm8gaW50ZXJlc3QgdG8gdGhlIHVzZXIsIGl0IG1heSBhbHNvIGJlIGFuIGV2ZW50IG9yCj4+IHRp bWVzdGFtcCByZWxhdGVkIHRvIGFuIGVhcmxpZXIgbWFya2VyIC0gd2hpY2ggY291bGQgYmUgaGln aGx5Cj4+IHJlbGV2YW50Lgo+PiBXaXRoIEVUUiB3ZSBkbyBub3Qga25vdyBob3cgbXVjaCBpcyBs b3N0IG9uIHdyYXAgLSBpdCBtaWdodCBiZSBvbmUKPj4gYnl0ZSwgaXQgbWlnaHQgYmUgbXVjaCBt b3JlIC0gYnV0IHRoZSBwb2ludCBpcyB3ZSBtYXJrIGFzIHRydW5jYXRlZAo+PiBmb3IgX2FueV8g YW1vdW50Lgo+Pgo+PiBJdCBpcyB1bmZvcnR1bmF0ZSB0aGF0IHdlIHdpbGwgc2VlIG11bHRpcGxl IGJ1ZmZlcnMgbWFya2VkIGFzCj4+IHRydW5jYXRlZCAtIGJ1dCB0aGlzIGlzIGZhciBiZXR0ZXIg dGhhbiBjcmVhdGluZyB0aGUgZmFsc2UgaW1wcmVzc2lvbgo+PiB0aGF0IG5vIHRyYWNlIGhhcyBi ZWVuIGxvc3QgLSB0aGF0IHRoZXJlIGlzIGEgY29udGludW91cyByZWNvcmQgd2hlcmUKPj4gdGhl cmUgaXMgbm90Lgo+PiBGb3Igc29tZSB1c2VycyAtIHN1Y2ggYXMgYXV0b2ZkbyB3aGVyZSBzYW1w bGluZyBpcyB0YWtpbmcgcGxhY2UgYW55d2F5Cj4+IC0gdHJ1bmNhdGVkIGJ1ZmZlcnMgcHJvYmFi bHkgZG8gbm90IG1hdHRlci4gRm9yIG90aGVycyAtIHdobyBhcmUKPj4gbG9va2luZyB0byB0cmFj ZSBhIHNwZWNpZmljIHNlY3Rpb24gb2YgY29kZSAtIHRoZW4gdGhleSBuZWVkIHRvIGJlCj4+IGF3 YXJlIHRoYXQgdGhlcmUgY291bGQgYmUgZGVjb2RlIGFub21vbGllcyByZWxhdGluZyB0byBidWZm ZXIgd3JhcC4KPj4KPiAKPiBJIHRoaW5rIE1pa2UgaGFzIGEgcG9pbnQgaGVyZSAtIHdlIHNob3Vs ZCByZXBvcnQgaXQgdG8gdXNlcnMgd2hlbiBkYXRhIGdldHMKPiBsb3N0LCBubyBtYXR0ZXIgaG93 IHNtYWxsIHRoYXQgbG9zdCBpcy4gSWYgdGhhdCBpcyBhIHByb2JsZW0gdGhleSBhbHdheXMgaGF2 ZQo+IHRoZSBjaG9pY2Ugb2YgZGVkaWNhdGluZyBtb3JlIHBhZ2VzIHRvIHRoZSBBVVggYnVmZmVy LgoKQWdyZWVkLCBJIGhhdmUgaW5jbHVkZWQgdGhpcyBpbiB0aGUgbmV4dCB2ZXJzaW9uLgoKVGhh bmtzClN1enVraQoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X18KbGludXgtYXJtLWtlcm5lbCBtYWlsaW5nIGxpc3QKbGludXgtYXJtLWtlcm5lbEBsaXN0cy5p bmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8v bGludXgtYXJtLWtlcm5lbAo=