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=-5.3 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED,USER_AGENT_SANE_1 autolearn=no 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 1D7F5C11F65 for ; Wed, 30 Jun 2021 15:49:32 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 010C9613D9 for ; Wed, 30 Jun 2021 15:49:31 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235798AbhF3PwA (ORCPT ); Wed, 30 Jun 2021 11:52:00 -0400 Received: from foss.arm.com ([217.140.110.172]:41390 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235726AbhF3Pv7 (ORCPT ); Wed, 30 Jun 2021 11:51:59 -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 5AFE6106F; Wed, 30 Jun 2021 08:49:30 -0700 (PDT) Received: from lpieralisi (e121166-lin.cambridge.arm.com [10.1.196.255]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id E73913F718; Wed, 30 Jun 2021 08:49:27 -0700 (PDT) Date: Wed, 30 Jun 2021 16:49:23 +0100 From: Lorenzo Pieralisi To: Ard Biesheuvel Cc: Robin Murphy , Catalin Marinas , ACPI Devel Maling List , Veronika Kabatova , Will Deacon , CKI Project , Mark Rutland , Memory Management , skt-results-master@redhat.com, Jeff Bastian , Jan Stancek , Linux ARM , "Rafael J. Wysocki" , Len Brown , Hanjun Guo , Sudeep Holla , lv.zheng@intel.com, Tony Luck , James Morse Subject: Re: =?utf-8?B?4p2MIEZBSUw=?= =?utf-8?Q?=3A?= Test report for kernel 5.13.0-rc7 (arm-next, 8ab9b1a9) Message-ID: <20210630154923.GA16215@lpieralisi> References: <31ffe8fc-f5ee-2858-26c5-0fd8bdd68702@arm.com> <20210625110944.GB20835@arm.com> <48b23351-3dba-bec8-242f-3c918ae55708@arm.com> <8a28663f-6541-6ff4-3de0-b140e3f8a5b9@arm.com> <20210629144415.GA28457@lpieralisi> <14ca6f72-9b0f-ebd7-9cf8-a5d6190c8e5d@arm.com> <20210629163543.GA12361@arm.com> <20210630103715.GA12089@lpieralisi> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: User-Agent: Mutt/1.9.4 (2018-02-28) Precedence: bulk List-ID: X-Mailing-List: linux-acpi@vger.kernel.org On Wed, Jun 30, 2021 at 03:22:57PM +0200, Ard Biesheuvel wrote: > On Wed, 30 Jun 2021 at 13:17, Robin Murphy wrote: > > > > On 2021-06-30 11:37, Lorenzo Pieralisi wrote: > > > On Tue, Jun 29, 2021 at 05:35:43PM +0100, Catalin Marinas wrote: > > >> On Tue, Jun 29, 2021 at 04:14:55PM +0100, Robin Murphy wrote: > > >>> On 2021-06-29 15:44, Lorenzo Pieralisi wrote: > > >>>> On Tue, Jun 29, 2021 at 12:48:14PM +0100, Robin Murphy wrote: > > >>>>> [ +ACPI audience ] > > >>>>> > > >>>>> On 2021-06-25 12:15, Robin Murphy wrote: > > >>>>>> On 2021-06-25 12:09, Catalin Marinas wrote: > > >>>>>>> On Fri, Jun 25, 2021 at 12:02:52PM +0100, Robin Murphy wrote: > > >>>>>>>> On 2021-06-25 10:52, Veronika Kabatova wrote: > > >>>>>>>> [...] > > >>>>>>>>>>> ❌ stress: stress-ng > > >>>>>>>>>> > > >>>>>>>>>> Oh no, this looks like another alignment fault in memcpy: > > >>>>>>>>>> > > >>>>>>>>>> [13330.651903] Unable to handle kernel paging request at > > >>>>>>>>>> virtual address ffff8000534705ff > > >> [...] > > >>>>>>>>>> [13330.652218] Call trace: > > >>>>>>>>>> [13330.652221] __memcpy+0x168/0x250 > > >>>>>>>>>> [13330.652225] acpi_data_show+0x5c/0x8c > > >>>>>>>>>> [13330.652232] sysfs_kf_bin_read+0x78/0xa0 > > >>>>>>>>>> [13330.652238] kernfs_file_read_iter+0x9c/0x1a4 > > >>>>>>>>>> [13330.652241] kernfs_fop_read_iter+0x34/0x50 > > >>>>>>>>>> [13330.652244] new_sync_read+0xdc/0x154 > > >>>>>>>>>> [13330.652253] vfs_read+0x158/0x1e4 > > >>>>>>>>>> [13330.652260] ksys_read+0x64/0xec > > >>>>>>>>>> [13330.652266] __arm64_sys_read+0x28/0x34 > > >>>>>>>>>> [13330.652273] invoke_syscall+0x50/0x120 > > >>>>>>>>>> [13330.652280] el0_svc_common.constprop.0+0x4c/0xd4 > > >>>>>>>>>> [13330.652284] do_el0_svc+0x30/0x9c > > >>>>>>>>>> [13330.652286] el0_svc+0x2c/0x54 > > >>>>>>>>>> [13330.652294] el0t_64_sync_handler+0x1a4/0x1b0 > > >>>>>>>>>> [13330.652296] el0t_64_sync+0x19c/0x1a0 > > >>>>>>>>>> [13330.652303] Code: a984346c a9c4342c f1010042 54fffee8 (a97c3c8e) > > >>>>>>>>>> [13330.652307] ---[ end trace 227d4380f57145d4 ]--- > > >>>>>>>>>> > > >>>>>>>>>> So maybe this issue isn't limited to weird modules, after all... > > >>>>>>>>> > > >>>>>>>>> It ran on the machine from the same set that we were able to reproduce > > >>>>>>>>> it on previously. If you or anyone else have an idea on how > > >>>>>>>>> to stabilize the reproducibility or have a debug patch we'll be happy to try it. > > >>>>>>>> > > >>>>>>>> Possibly it depends on the individual machines' firmware exactly how the > > >>>>>>>> relevant bits of their ACPI tables are aligned in memory? > > >>>>>>>> > > >>>>>>>> I've started digging into that callstack - it may not be a "weird module" > > >>>>>>>> but it's definitely crusty ACPI code... a238317ce818 ("ACPI: Clean up > > >>>>>>>> acpi_os_map/unmap_memory() to eliminate __iomem.") looks frankly a bit > > >>>>>>>> questionable in its decision to blithely cast away __iomem, but then the > > >>>>>>>> rationale in aafc65c731fe ("ACPI: add arm64 to the platforms that use > > >>>>>>>> ioremap") seems particularly dubious on top of that (especially > > >>>>>>>> given this end result). > > >> [...] > > >>>>> After picking through the UEFI spec I think I've now got a clearer picture > > >>>>> of what's happening, but I'm not sure where it goes from here... > > >>>>> > > >>>>> The spec implies that it *is* legitimate for runtime-loaded ACPI tables to > > >>>>> lie outside the EFI memory map, and that case they must be assumed to be > > >>>>> uncached, so the behaviour of acpi_os_ioremap() is correct. > > >>>> > > >>>> I'd agree with the reasoning, it would be good to pinpoint whether > > >>>> that's what actually triggers the issue. > > >>>> > > >>>> I'd like to replicate it if possible (it is TX2 HW but firmware > > >>>> config is likely to differ from the HW I have at hand), the > > >>>> test command line that triggers the fault would be useful as > > >>>> a starting point. > > >>>> > > >>>> Furthermore, is this a v5.13-rc* regression ? If so it would be > > >>>> good to bisect it - I can't recollect arm64 changes that could > > >>>> have introduced this regression in the last cycle but I may have > > >>>> missed something. > > >>> > > >>> The actual change which has brought this to light is the update to arm64's > > >>> memcpy() routine for 5.13 - the new version is more aggressive at making > > >>> unaligned loads from the source buffer, so now triggers alignment faults > > >>> more readily when (wrongly) used on iomem mappings in places that were > > >>> getting away with it by chance under the previous implementation (see also > > >>> [1], for example). > > >> > > >> I wouldn't revert any of the memcpy() stuff as it just uncovered an > > >> existing bug in how the ACPI tables are handled. Could we actually hit > > >> a similar issue with C code parsing the ACPI tables? > > > > > > I agree - I don't think a revert should be considered, this looks like > > > a long standing ACPI bug. > > > > > > This needs debugging but I believe that it all depends on the table > > > being in the EFI map or not. I'd help a lot if I managed to reproduce > > > the bug for a given set-up so that we can check which table is causing > > > it. > > > > > >> Is there a way to map the ACPI tables as Normal Noncacheable > > >> (ioremap_wc)? > > > > > > That's a good point. IIUC UEFI 2.9 (2.3.6) requires tables loaded at > > > runtime (see above - I really would like to understand what table > > > is triggering this bug) that are not in the EFI memory map and whose > > > attributes cannot be retrieved through ACPI descriptors to be considered > > > non-cacheable. > > > > > > The question is whether [arm64] acpi_os_ioremap() can be changed so that > > > the above is mapped to Normal NC rather than device-nGnRnE; this may > > > cause surprises the other way around (given that dev-nGnRnE is an > > > all encompassing fallback - again IIUC, I believe Ard knows better > > > than me if he has time to chime in). > > > > > > We need a reproducer and some tracing in the ACPI code. > > > > Having looked even more at the sysfs code, I think this might not > > actually be an ACPI table per se, but specifically only the Generic > > Error Status Block pointed to by the BERT (so maybe it also requires the > > machine to have experienced a boot-time error to be present?). ACPI > > merely says that this is "a range of addressable memory" and "System > > firmware must report this memory range as firmware reserved", so I have > > no idea whether there's any specific expectation of how it's supposed to > > be mapped. > > > > Thanks for digging that up. > > If the memory in question is firmware reserved, it should appear in > the EFI memory map, and have the memory type attributes set, in which Thanks a lot Ard for chiming in. How are those memory type attributes determined by firmware ? > case acpi_os_ioremap() should do the right thing. The question is what the right thing is or reworded what those attributes are supposed to be for the Boot Error Region in question (as Robin reported, ACPI specs 6.4, 18.3.1, "the Boot Error Region is a range of addressable memory" and "..must report this memory range as firmware reserved"). > IIRC (but I don't have time to check - I'm on vacation), the ACPI core > code does have separate code paths internally, but they are all > brought out via acpi_os_ioremap() where MMIO and memory are combined > again. Perhaps we should start looking at addressing this? BTW, commit in question: git log -p 7dae6326ed76 I believe you mean, if the OS maps an address with acpi_os_map_memory(), we must convey the "memory" information to the arm64 back-end (instead of falling back to acpi_os_ioremap()) so that the back-end can map it with "memory" semantics (ie by choosing attributes that may need to override the EFI memory map ones) ? In current code, even if the BERT were mapped with acpi_os_map_iomem() this would change nothing since it's acpi_os_ioremap() that runs the rule (backed up by EFI memory map region info). > So how does the sysfs code find the contents of this file? If some > code is interpreting the BERT, could it be updated to use memory > semantics explicitly when dumping the error status block? See the commit above. Do you mean replacing the mapping function in acpi_data_show() with something explicit eg ioremap_wc() through a back-end specific implementation ? Thanks, Lorenzo 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=-5.7 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI, SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_SANE_1 autolearn=no 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 D79DDC11F65 for ; Wed, 30 Jun 2021 15:52:07 +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 A33B6613D9 for ; Wed, 30 Jun 2021 15:52:07 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org A33B6613D9 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=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:References: Message-ID:Subject:Cc:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=NKhUp/blT3lBn91gVR1z2KKP+vuzanp6Y8yIhic36D8=; b=3U+FE08ZhM0fYW 8N1CUDUWwSD4bhcs4hQWdIHeG5BXKffGOA6qd9K69j8FkWiqc+ncVPbn0GM7kPcW8dBQCLJ4/I0tF 9alYLjdcvpVesIo2aC+K2AW2+oflruF9bYffXzF8Z9D+45gZD0ARoiHRhnCT13VmvSN3flH2wnP2m jyVAmMN9bUiS/dWpJ3IJIvie7mKeYz2eHc22ZVM2FPH+yExtQkpzMaEk2lbh1SR5oBKHruNMuy6UB vhc1Y6h6PH3WTGjbwdfqnyiGs5oH/UGhbPM/Nd9/rXi3SBJiWnNjTnd/gL4kqGg8pvLTscaRPxH44 ewePrrZMxm3YMZHXPH5Q==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1lycTG-00EfG3-R5; Wed, 30 Jun 2021 15:49:50 +0000 Received: from foss.arm.com ([217.140.110.172]) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1lycT8-00EfDP-VS for linux-arm-kernel@lists.infradead.org; Wed, 30 Jun 2021 15:49:48 +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 5AFE6106F; Wed, 30 Jun 2021 08:49:30 -0700 (PDT) Received: from lpieralisi (e121166-lin.cambridge.arm.com [10.1.196.255]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id E73913F718; Wed, 30 Jun 2021 08:49:27 -0700 (PDT) Date: Wed, 30 Jun 2021 16:49:23 +0100 From: Lorenzo Pieralisi To: Ard Biesheuvel Cc: Robin Murphy , Catalin Marinas , ACPI Devel Maling List , Veronika Kabatova , Will Deacon , CKI Project , Mark Rutland , Memory Management , skt-results-master@redhat.com, Jeff Bastian , Jan Stancek , Linux ARM , "Rafael J. Wysocki" , Len Brown , Hanjun Guo , Sudeep Holla , lv.zheng@intel.com, Tony Luck , James Morse Subject: Re: =?utf-8?B?4p2MIEZBSUw=?= =?utf-8?Q?=3A?= Test report for kernel 5.13.0-rc7 (arm-next, 8ab9b1a9) Message-ID: <20210630154923.GA16215@lpieralisi> References: <31ffe8fc-f5ee-2858-26c5-0fd8bdd68702@arm.com> <20210625110944.GB20835@arm.com> <48b23351-3dba-bec8-242f-3c918ae55708@arm.com> <8a28663f-6541-6ff4-3de0-b140e3f8a5b9@arm.com> <20210629144415.GA28457@lpieralisi> <14ca6f72-9b0f-ebd7-9cf8-a5d6190c8e5d@arm.com> <20210629163543.GA12361@arm.com> <20210630103715.GA12089@lpieralisi> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.9.4 (2018-02-28) X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210630_084943_163493_3D2455AF X-CRM114-Status: GOOD ( 62.31 ) 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 T24gV2VkLCBKdW4gMzAsIDIwMjEgYXQgMDM6MjI6NTdQTSArMDIwMCwgQXJkIEJpZXNoZXV2ZWwg d3JvdGU6Cj4gT24gV2VkLCAzMCBKdW4gMjAyMSBhdCAxMzoxNywgUm9iaW4gTXVycGh5IDxyb2Jp bi5tdXJwaHlAYXJtLmNvbT4gd3JvdGU6Cj4gPgo+ID4gT24gMjAyMS0wNi0zMCAxMTozNywgTG9y ZW56byBQaWVyYWxpc2kgd3JvdGU6Cj4gPiA+IE9uIFR1ZSwgSnVuIDI5LCAyMDIxIGF0IDA1OjM1 OjQzUE0gKzAxMDAsIENhdGFsaW4gTWFyaW5hcyB3cm90ZToKPiA+ID4+IE9uIFR1ZSwgSnVuIDI5 LCAyMDIxIGF0IDA0OjE0OjU1UE0gKzAxMDAsIFJvYmluIE11cnBoeSB3cm90ZToKPiA+ID4+PiBP biAyMDIxLTA2LTI5IDE1OjQ0LCBMb3JlbnpvIFBpZXJhbGlzaSB3cm90ZToKPiA+ID4+Pj4gT24g VHVlLCBKdW4gMjksIDIwMjEgYXQgMTI6NDg6MTRQTSArMDEwMCwgUm9iaW4gTXVycGh5IHdyb3Rl Ogo+ID4gPj4+Pj4gWyArQUNQSSBhdWRpZW5jZSBdCj4gPiA+Pj4+Pgo+ID4gPj4+Pj4gT24gMjAy MS0wNi0yNSAxMjoxNSwgUm9iaW4gTXVycGh5IHdyb3RlOgo+ID4gPj4+Pj4+IE9uIDIwMjEtMDYt MjUgMTI6MDksIENhdGFsaW4gTWFyaW5hcyB3cm90ZToKPiA+ID4+Pj4+Pj4gT24gRnJpLCBKdW4g MjUsIDIwMjEgYXQgMTI6MDI6NTJQTSArMDEwMCwgUm9iaW4gTXVycGh5IHdyb3RlOgo+ID4gPj4+ Pj4+Pj4gT24gMjAyMS0wNi0yNSAxMDo1MiwgVmVyb25pa2EgS2FiYXRvdmEgd3JvdGU6Cj4gPiA+ Pj4+Pj4+PiBbLi4uXQo+ID4gPj4+Pj4+Pj4+Pj4gICAgICAgICAgICDinYwgc3RyZXNzOiBzdHJl c3MtbmcKPiA+ID4+Pj4+Pj4+Pj4KPiA+ID4+Pj4+Pj4+Pj4gT2ggbm8sIHRoaXMgbG9va3MgbGlr ZSBhbm90aGVyIGFsaWdubWVudCBmYXVsdCBpbiBtZW1jcHk6Cj4gPiA+Pj4+Pj4+Pj4+Cj4gPiA+ Pj4+Pj4+Pj4+IFsxMzMzMC42NTE5MDNdIFVuYWJsZSB0byBoYW5kbGUga2VybmVsIHBhZ2luZyBy ZXF1ZXN0IGF0Cj4gPiA+Pj4+Pj4+Pj4+IHZpcnR1YWwgYWRkcmVzcyBmZmZmODAwMDUzNDcwNWZm Cj4gPiA+PiBbLi4uXQo+ID4gPj4+Pj4+Pj4+PiBbMTMzMzAuNjUyMjE4XSBDYWxsIHRyYWNlOgo+ ID4gPj4+Pj4+Pj4+PiBbMTMzMzAuNjUyMjIxXSAgX19tZW1jcHkrMHgxNjgvMHgyNTAKPiA+ID4+ Pj4+Pj4+Pj4gWzEzMzMwLjY1MjIyNV0gIGFjcGlfZGF0YV9zaG93KzB4NWMvMHg4Ywo+ID4gPj4+ Pj4+Pj4+PiBbMTMzMzAuNjUyMjMyXSAgc3lzZnNfa2ZfYmluX3JlYWQrMHg3OC8weGEwCj4gPiA+ Pj4+Pj4+Pj4+IFsxMzMzMC42NTIyMzhdICBrZXJuZnNfZmlsZV9yZWFkX2l0ZXIrMHg5Yy8weDFh NAo+ID4gPj4+Pj4+Pj4+PiBbMTMzMzAuNjUyMjQxXSAga2VybmZzX2ZvcF9yZWFkX2l0ZXIrMHgz NC8weDUwCj4gPiA+Pj4+Pj4+Pj4+IFsxMzMzMC42NTIyNDRdICBuZXdfc3luY19yZWFkKzB4ZGMv MHgxNTQKPiA+ID4+Pj4+Pj4+Pj4gWzEzMzMwLjY1MjI1M10gIHZmc19yZWFkKzB4MTU4LzB4MWU0 Cj4gPiA+Pj4+Pj4+Pj4+IFsxMzMzMC42NTIyNjBdICBrc3lzX3JlYWQrMHg2NC8weGVjCj4gPiA+ Pj4+Pj4+Pj4+IFsxMzMzMC42NTIyNjZdICBfX2FybTY0X3N5c19yZWFkKzB4MjgvMHgzNAo+ID4g Pj4+Pj4+Pj4+PiBbMTMzMzAuNjUyMjczXSAgaW52b2tlX3N5c2NhbGwrMHg1MC8weDEyMAo+ID4g Pj4+Pj4+Pj4+PiBbMTMzMzAuNjUyMjgwXSAgZWwwX3N2Y19jb21tb24uY29uc3Rwcm9wLjArMHg0 Yy8weGQ0Cj4gPiA+Pj4+Pj4+Pj4+IFsxMzMzMC42NTIyODRdICBkb19lbDBfc3ZjKzB4MzAvMHg5 Ywo+ID4gPj4+Pj4+Pj4+PiBbMTMzMzAuNjUyMjg2XSAgZWwwX3N2YysweDJjLzB4NTQKPiA+ID4+ Pj4+Pj4+Pj4gWzEzMzMwLjY1MjI5NF0gIGVsMHRfNjRfc3luY19oYW5kbGVyKzB4MWE0LzB4MWIw Cj4gPiA+Pj4+Pj4+Pj4+IFsxMzMzMC42NTIyOTZdICBlbDB0XzY0X3N5bmMrMHgxOWMvMHgxYTAK PiA+ID4+Pj4+Pj4+Pj4gWzEzMzMwLjY1MjMwM10gQ29kZTogYTk4NDM0NmMgYTljNDM0MmMgZjEw MTAwNDIgNTRmZmZlZTggKGE5N2MzYzhlKQo+ID4gPj4+Pj4+Pj4+PiBbMTMzMzAuNjUyMzA3XSAt LS1bIGVuZCB0cmFjZSAyMjdkNDM4MGY1NzE0NWQ0IF0tLS0KPiA+ID4+Pj4+Pj4+Pj4KPiA+ID4+ Pj4+Pj4+Pj4gU28gbWF5YmUgdGhpcyBpc3N1ZSBpc24ndCBsaW1pdGVkIHRvIHdlaXJkIG1vZHVs ZXMsIGFmdGVyIGFsbC4uLgo+ID4gPj4+Pj4+Pj4+Cj4gPiA+Pj4+Pj4+Pj4gSXQgcmFuIG9uIHRo ZSBtYWNoaW5lIGZyb20gdGhlIHNhbWUgc2V0IHRoYXQgd2Ugd2VyZSBhYmxlIHRvIHJlcHJvZHVj ZQo+ID4gPj4+Pj4+Pj4+IGl0IG9uIHByZXZpb3VzbHkuIElmIHlvdSBvciBhbnlvbmUgZWxzZSBo YXZlIGFuIGlkZWEgb24gaG93Cj4gPiA+Pj4+Pj4+Pj4gdG8gc3RhYmlsaXplIHRoZSByZXByb2R1 Y2liaWxpdHkgb3IgaGF2ZSBhIGRlYnVnIHBhdGNoIHdlJ2xsIGJlIGhhcHB5IHRvIHRyeSBpdC4K PiA+ID4+Pj4+Pj4+Cj4gPiA+Pj4+Pj4+PiBQb3NzaWJseSBpdCBkZXBlbmRzIG9uIHRoZSBpbmRp dmlkdWFsIG1hY2hpbmVzJyBmaXJtd2FyZSBleGFjdGx5IGhvdyB0aGUKPiA+ID4+Pj4+Pj4+IHJl bGV2YW50IGJpdHMgb2YgdGhlaXIgQUNQSSB0YWJsZXMgYXJlIGFsaWduZWQgaW4gbWVtb3J5Pwo+ ID4gPj4+Pj4+Pj4KPiA+ID4+Pj4+Pj4+IEkndmUgc3RhcnRlZCBkaWdnaW5nIGludG8gdGhhdCBj YWxsc3RhY2sgLSBpdCBtYXkgbm90IGJlIGEgIndlaXJkIG1vZHVsZSIKPiA+ID4+Pj4+Pj4+IGJ1 dCBpdCdzIGRlZmluaXRlbHkgY3J1c3R5IEFDUEkgY29kZS4uLiBhMjM4MzE3Y2U4MTggKCJBQ1BJ OiBDbGVhbiB1cAo+ID4gPj4+Pj4+Pj4gYWNwaV9vc19tYXAvdW5tYXBfbWVtb3J5KCkgdG8gZWxp bWluYXRlIF9faW9tZW0uIikgbG9va3MgZnJhbmtseSBhIGJpdAo+ID4gPj4+Pj4+Pj4gcXVlc3Rp b25hYmxlIGluIGl0cyBkZWNpc2lvbiB0byBibGl0aGVseSBjYXN0IGF3YXkgX19pb21lbSwgYnV0 IHRoZW4gdGhlCj4gPiA+Pj4+Pj4+PiByYXRpb25hbGUgaW4gYWFmYzY1YzczMWZlICgiQUNQSTog YWRkIGFybTY0IHRvIHRoZSBwbGF0Zm9ybXMgdGhhdCB1c2UKPiA+ID4+Pj4+Pj4+IGlvcmVtYXAi KSBzZWVtcyBwYXJ0aWN1bGFybHkgZHViaW91cyBvbiB0b3Agb2YgdGhhdCAoZXNwZWNpYWxseQo+ ID4gPj4+Pj4+Pj4gZ2l2ZW4gdGhpcyBlbmQgcmVzdWx0KS4KPiA+ID4+IFsuLi5dCj4gPiA+Pj4+ PiBBZnRlciBwaWNraW5nIHRocm91Z2ggdGhlIFVFRkkgc3BlYyBJIHRoaW5rIEkndmUgbm93IGdv dCBhIGNsZWFyZXIgcGljdHVyZQo+ID4gPj4+Pj4gb2Ygd2hhdCdzIGhhcHBlbmluZywgYnV0IEkn bSBub3Qgc3VyZSB3aGVyZSBpdCBnb2VzIGZyb20gaGVyZS4uLgo+ID4gPj4+Pj4KPiA+ID4+Pj4+ IFRoZSBzcGVjIGltcGxpZXMgdGhhdCBpdCAqaXMqIGxlZ2l0aW1hdGUgZm9yIHJ1bnRpbWUtbG9h ZGVkIEFDUEkgdGFibGVzIHRvCj4gPiA+Pj4+PiBsaWUgb3V0c2lkZSB0aGUgRUZJIG1lbW9yeSBt YXAsIGFuZCB0aGF0IGNhc2UgdGhleSBtdXN0IGJlIGFzc3VtZWQgdG8gYmUKPiA+ID4+Pj4+IHVu Y2FjaGVkLCBzbyB0aGUgYmVoYXZpb3VyIG9mIGFjcGlfb3NfaW9yZW1hcCgpIGlzIGNvcnJlY3Qu Cj4gPiA+Pj4+Cj4gPiA+Pj4+IEknZCBhZ3JlZSB3aXRoIHRoZSByZWFzb25pbmcsIGl0IHdvdWxk IGJlIGdvb2QgdG8gcGlucG9pbnQgd2hldGhlcgo+ID4gPj4+PiB0aGF0J3Mgd2hhdCBhY3R1YWxs eSB0cmlnZ2VycyB0aGUgaXNzdWUuCj4gPiA+Pj4+Cj4gPiA+Pj4+IEknZCBsaWtlIHRvIHJlcGxp Y2F0ZSBpdCBpZiBwb3NzaWJsZSAoaXQgaXMgVFgyIEhXIGJ1dCBmaXJtd2FyZQo+ID4gPj4+PiBj b25maWcgaXMgbGlrZWx5IHRvIGRpZmZlciBmcm9tIHRoZSBIVyBJIGhhdmUgYXQgaGFuZCksIHRo ZQo+ID4gPj4+PiB0ZXN0IGNvbW1hbmQgbGluZSB0aGF0IHRyaWdnZXJzIHRoZSBmYXVsdCB3b3Vs ZCBiZSB1c2VmdWwgYXMKPiA+ID4+Pj4gYSBzdGFydGluZyBwb2ludC4KPiA+ID4+Pj4KPiA+ID4+ Pj4gRnVydGhlcm1vcmUsIGlzIHRoaXMgYSB2NS4xMy1yYyogcmVncmVzc2lvbiA/IElmIHNvIGl0 IHdvdWxkIGJlCj4gPiA+Pj4+IGdvb2QgdG8gYmlzZWN0IGl0IC0gSSBjYW4ndCByZWNvbGxlY3Qg YXJtNjQgY2hhbmdlcyB0aGF0IGNvdWxkCj4gPiA+Pj4+IGhhdmUgaW50cm9kdWNlZCB0aGlzIHJl Z3Jlc3Npb24gaW4gdGhlIGxhc3QgY3ljbGUgYnV0IEkgbWF5IGhhdmUKPiA+ID4+Pj4gbWlzc2Vk IHNvbWV0aGluZy4KPiA+ID4+Pgo+ID4gPj4+IFRoZSBhY3R1YWwgY2hhbmdlIHdoaWNoIGhhcyBi cm91Z2h0IHRoaXMgdG8gbGlnaHQgaXMgdGhlIHVwZGF0ZSB0byBhcm02NCdzCj4gPiA+Pj4gbWVt Y3B5KCkgcm91dGluZSBmb3IgNS4xMyAtIHRoZSBuZXcgdmVyc2lvbiBpcyBtb3JlIGFnZ3Jlc3Np dmUgYXQgbWFraW5nCj4gPiA+Pj4gdW5hbGlnbmVkIGxvYWRzIGZyb20gdGhlIHNvdXJjZSBidWZm ZXIsIHNvIG5vdyB0cmlnZ2VycyBhbGlnbm1lbnQgZmF1bHRzCj4gPiA+Pj4gbW9yZSByZWFkaWx5 IHdoZW4gKHdyb25nbHkpIHVzZWQgb24gaW9tZW0gbWFwcGluZ3MgaW4gcGxhY2VzIHRoYXQgd2Vy ZQo+ID4gPj4+IGdldHRpbmcgYXdheSB3aXRoIGl0IGJ5IGNoYW5jZSB1bmRlciB0aGUgcHJldmlv dXMgaW1wbGVtZW50YXRpb24gKHNlZSBhbHNvCj4gPiA+Pj4gWzFdLCBmb3IgZXhhbXBsZSkuCj4g PiA+Pgo+ID4gPj4gSSB3b3VsZG4ndCByZXZlcnQgYW55IG9mIHRoZSBtZW1jcHkoKSBzdHVmZiBh cyBpdCBqdXN0IHVuY292ZXJlZCBhbgo+ID4gPj4gZXhpc3RpbmcgYnVnIGluIGhvdyB0aGUgQUNQ SSB0YWJsZXMgYXJlIGhhbmRsZWQuIENvdWxkIHdlIGFjdHVhbGx5IGhpdAo+ID4gPj4gYSBzaW1p bGFyIGlzc3VlIHdpdGggQyBjb2RlIHBhcnNpbmcgdGhlIEFDUEkgdGFibGVzPwo+ID4gPgo+ID4g PiBJIGFncmVlIC0gSSBkb24ndCB0aGluayBhIHJldmVydCBzaG91bGQgYmUgY29uc2lkZXJlZCwg dGhpcyBsb29rcyBsaWtlCj4gPiA+IGEgbG9uZyBzdGFuZGluZyBBQ1BJIGJ1Zy4KPiA+ID4KPiA+ ID4gVGhpcyBuZWVkcyBkZWJ1Z2dpbmcgYnV0IEkgYmVsaWV2ZSB0aGF0IGl0IGFsbCBkZXBlbmRz IG9uIHRoZSB0YWJsZQo+ID4gPiBiZWluZyBpbiB0aGUgRUZJIG1hcCBvciBub3QuIEknZCBoZWxw IGEgbG90IGlmIEkgbWFuYWdlZCB0byByZXByb2R1Y2UKPiA+ID4gdGhlIGJ1ZyBmb3IgYSBnaXZl biBzZXQtdXAgc28gdGhhdCB3ZSBjYW4gY2hlY2sgd2hpY2ggdGFibGUgaXMgY2F1c2luZwo+ID4g PiBpdC4KPiA+ID4KPiA+ID4+IElzIHRoZXJlIGEgd2F5IHRvIG1hcCB0aGUgQUNQSSB0YWJsZXMg YXMgTm9ybWFsIE5vbmNhY2hlYWJsZQo+ID4gPj4gKGlvcmVtYXBfd2MpPwo+ID4gPgo+ID4gPiBU aGF0J3MgYSBnb29kIHBvaW50LiBJSVVDIFVFRkkgMi45ICgyLjMuNikgcmVxdWlyZXMgdGFibGVz IGxvYWRlZCBhdAo+ID4gPiBydW50aW1lIChzZWUgYWJvdmUgLSBJIHJlYWxseSB3b3VsZCBsaWtl IHRvIHVuZGVyc3RhbmQgd2hhdCB0YWJsZQo+ID4gPiBpcyB0cmlnZ2VyaW5nIHRoaXMgYnVnKSB0 aGF0IGFyZSBub3QgaW4gdGhlIEVGSSBtZW1vcnkgbWFwIGFuZCB3aG9zZQo+ID4gPiBhdHRyaWJ1 dGVzIGNhbm5vdCBiZSByZXRyaWV2ZWQgdGhyb3VnaCBBQ1BJIGRlc2NyaXB0b3JzIHRvIGJlIGNv bnNpZGVyZWQKPiA+ID4gbm9uLWNhY2hlYWJsZS4KPiA+ID4KPiA+ID4gVGhlIHF1ZXN0aW9uIGlz IHdoZXRoZXIgW2FybTY0XSBhY3BpX29zX2lvcmVtYXAoKSBjYW4gYmUgY2hhbmdlZCBzbyB0aGF0 Cj4gPiA+IHRoZSBhYm92ZSBpcyBtYXBwZWQgdG8gTm9ybWFsIE5DIHJhdGhlciB0aGFuIGRldmlj ZS1uR25SbkU7IHRoaXMgbWF5Cj4gPiA+IGNhdXNlIHN1cnByaXNlcyB0aGUgb3RoZXIgd2F5IGFy b3VuZCAoZ2l2ZW4gdGhhdCBkZXYtbkduUm5FIGlzIGFuCj4gPiA+IGFsbCBlbmNvbXBhc3Npbmcg ZmFsbGJhY2sgLSBhZ2FpbiBJSVVDLCBJIGJlbGlldmUgQXJkIGtub3dzIGJldHRlcgo+ID4gPiB0 aGFuIG1lIGlmIGhlIGhhcyB0aW1lIHRvIGNoaW1lIGluKS4KPiA+ID4KPiA+ID4gV2UgbmVlZCBh IHJlcHJvZHVjZXIgYW5kIHNvbWUgdHJhY2luZyBpbiB0aGUgQUNQSSBjb2RlLgo+ID4KPiA+IEhh dmluZyBsb29rZWQgZXZlbiBtb3JlIGF0IHRoZSBzeXNmcyBjb2RlLCBJIHRoaW5rIHRoaXMgbWln aHQgbm90Cj4gPiBhY3R1YWxseSBiZSBhbiBBQ1BJIHRhYmxlIHBlciBzZSwgYnV0IHNwZWNpZmlj YWxseSBvbmx5IHRoZSBHZW5lcmljCj4gPiBFcnJvciBTdGF0dXMgQmxvY2sgcG9pbnRlZCB0byBi eSB0aGUgQkVSVCAoc28gbWF5YmUgaXQgYWxzbyByZXF1aXJlcyB0aGUKPiA+IG1hY2hpbmUgdG8g aGF2ZSBleHBlcmllbmNlZCBhIGJvb3QtdGltZSBlcnJvciB0byBiZSBwcmVzZW50PykuIEFDUEkK PiA+IG1lcmVseSBzYXlzIHRoYXQgdGhpcyBpcyAiYSByYW5nZSBvZiBhZGRyZXNzYWJsZSBtZW1v cnkiIGFuZCAiU3lzdGVtCj4gPiBmaXJtd2FyZSBtdXN0IHJlcG9ydCB0aGlzIG1lbW9yeSByYW5n ZSBhcyBmaXJtd2FyZSByZXNlcnZlZCIsIHNvIEkgaGF2ZQo+ID4gbm8gaWRlYSB3aGV0aGVyIHRo ZXJlJ3MgYW55IHNwZWNpZmljIGV4cGVjdGF0aW9uIG9mIGhvdyBpdCdzIHN1cHBvc2VkIHRvCj4g PiBiZSBtYXBwZWQuCj4gPgo+IAo+IFRoYW5rcyBmb3IgZGlnZ2luZyB0aGF0IHVwLgo+IAo+IElm IHRoZSBtZW1vcnkgaW4gcXVlc3Rpb24gaXMgZmlybXdhcmUgcmVzZXJ2ZWQsIGl0IHNob3VsZCBh cHBlYXIgaW4KPiB0aGUgRUZJIG1lbW9yeSBtYXAsIGFuZCBoYXZlIHRoZSBtZW1vcnkgdHlwZSBh dHRyaWJ1dGVzIHNldCwgaW4gd2hpY2gKClRoYW5rcyBhIGxvdCBBcmQgZm9yIGNoaW1pbmcgaW4u CgpIb3cgYXJlIHRob3NlIG1lbW9yeSB0eXBlIGF0dHJpYnV0ZXMgZGV0ZXJtaW5lZCBieSBmaXJt d2FyZSA/Cgo+IGNhc2UgYWNwaV9vc19pb3JlbWFwKCkgc2hvdWxkIGRvIHRoZSByaWdodCB0aGlu Zy4KClRoZSBxdWVzdGlvbiBpcyB3aGF0IHRoZSByaWdodCB0aGluZyBpcyBvciByZXdvcmRlZCB3 aGF0IHRob3NlCmF0dHJpYnV0ZXMgYXJlIHN1cHBvc2VkIHRvIGJlIGZvciB0aGUgQm9vdCBFcnJv ciBSZWdpb24gaW4gcXVlc3Rpb24gKGFzClJvYmluIHJlcG9ydGVkLCBBQ1BJIHNwZWNzIDYuNCwg MTguMy4xLCAidGhlIEJvb3QgRXJyb3IgUmVnaW9uIGlzIGEKcmFuZ2Ugb2YgYWRkcmVzc2FibGUg bWVtb3J5IiBhbmQgIi4ubXVzdCByZXBvcnQgdGhpcyBtZW1vcnkgcmFuZ2UKYXMgZmlybXdhcmUg cmVzZXJ2ZWQiKS4KCj4gSUlSQyAoYnV0IEkgZG9uJ3QgaGF2ZSB0aW1lIHRvIGNoZWNrIC0gSSdt IG9uIHZhY2F0aW9uKSwgdGhlIEFDUEkgY29yZQo+IGNvZGUgZG9lcyBoYXZlIHNlcGFyYXRlIGNv ZGUgcGF0aHMgaW50ZXJuYWxseSwgYnV0IHRoZXkgYXJlIGFsbAo+IGJyb3VnaHQgb3V0IHZpYSBh Y3BpX29zX2lvcmVtYXAoKSB3aGVyZSBNTUlPIGFuZCBtZW1vcnkgYXJlIGNvbWJpbmVkCj4gYWdh aW4uIFBlcmhhcHMgd2Ugc2hvdWxkIHN0YXJ0IGxvb2tpbmcgYXQgYWRkcmVzc2luZyB0aGlzPwoK QlRXLCBjb21taXQgaW4gcXVlc3Rpb246CgpnaXQgbG9nIC1wIDdkYWU2MzI2ZWQ3NgoKSSBiZWxp ZXZlIHlvdSBtZWFuLCBpZiB0aGUgT1MgbWFwcyBhbiBhZGRyZXNzIHdpdGggYWNwaV9vc19tYXBf bWVtb3J5KCksCndlIG11c3QgY29udmV5IHRoZSAibWVtb3J5IiBpbmZvcm1hdGlvbiB0byB0aGUg YXJtNjQgYmFjay1lbmQgKGluc3RlYWQKb2YgZmFsbGluZyBiYWNrIHRvIGFjcGlfb3NfaW9yZW1h cCgpKSBzbyB0aGF0IHRoZSBiYWNrLWVuZCBjYW4gbWFwIGl0CndpdGggIm1lbW9yeSIgc2VtYW50 aWNzIChpZSBieSBjaG9vc2luZyBhdHRyaWJ1dGVzIHRoYXQgbWF5IG5lZWQgdG8Kb3ZlcnJpZGUg dGhlIEVGSSBtZW1vcnkgbWFwIG9uZXMpID8KCkluIGN1cnJlbnQgY29kZSwgZXZlbiBpZiB0aGUg QkVSVCB3ZXJlIG1hcHBlZCB3aXRoIGFjcGlfb3NfbWFwX2lvbWVtKCkKdGhpcyB3b3VsZCBjaGFu Z2Ugbm90aGluZyBzaW5jZSBpdCdzIGFjcGlfb3NfaW9yZW1hcCgpIHRoYXQgcnVucyB0aGUKcnVs ZSAoYmFja2VkIHVwIGJ5IEVGSSBtZW1vcnkgbWFwIHJlZ2lvbiBpbmZvKS4KCj4gU28gaG93IGRv ZXMgdGhlIHN5c2ZzIGNvZGUgZmluZCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlPyBJZiBzb21l Cj4gY29kZSBpcyBpbnRlcnByZXRpbmcgdGhlIEJFUlQsIGNvdWxkIGl0IGJlIHVwZGF0ZWQgdG8g dXNlIG1lbW9yeQo+IHNlbWFudGljcyBleHBsaWNpdGx5IHdoZW4gZHVtcGluZyB0aGUgZXJyb3Ig c3RhdHVzIGJsb2NrPwoKU2VlIHRoZSBjb21taXQgYWJvdmUuIERvIHlvdSBtZWFuIHJlcGxhY2lu ZyB0aGUgbWFwcGluZyBmdW5jdGlvbgppbiBhY3BpX2RhdGFfc2hvdygpIHdpdGggc29tZXRoaW5n IGV4cGxpY2l0IGVnIGlvcmVtYXBfd2MoKSB0aHJvdWdoCmEgYmFjay1lbmQgc3BlY2lmaWMgaW1w bGVtZW50YXRpb24gPwoKVGhhbmtzLApMb3JlbnpvCgpfX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fXwpsaW51eC1hcm0ta2VybmVsIG1haWxpbmcgbGlzdApsaW51 eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5v cmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1hcm0ta2VybmVsCg==