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=-3.6 required=3.0 tests=DKIM_INVALID,DKIM_SIGNED, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE, SPF_PASS 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 CEECEC2D0DB for ; Fri, 24 Jan 2020 14:52:16 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 8E85E20838 for ; Fri, 24 Jan 2020 14:52:16 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="key not found in DNS" (0-bit key) header.d=mg.codeaurora.org header.i=@mg.codeaurora.org header.b="rX4uiwRi" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730028AbgAXOwP (ORCPT ); Fri, 24 Jan 2020 09:52:15 -0500 Received: from mail25.static.mailgun.info ([104.130.122.25]:35927 "EHLO mail25.static.mailgun.info" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729928AbgAXOwP (ORCPT ); Fri, 24 Jan 2020 09:52:15 -0500 DKIM-Signature: a=rsa-sha256; v=1; c=relaxed/relaxed; d=mg.codeaurora.org; q=dns/txt; s=smtp; t=1579877534; h=Message-ID: References: In-Reply-To: Subject: Cc: To: From: Date: Content-Transfer-Encoding: Content-Type: MIME-Version: Sender; bh=qnTdKurql8lb6CMF2cfZ4H6NoG57pVvtuHeYNDi3fMk=; b=rX4uiwRi/gWVXpNvOekFFlhlhD1EWeC7hGDC6Aeuv8G0P/gD6JWfIHDFHU/1+trZzHwK7hM8 Z3AdRCNfSsiI4rER4Ku+8OIjDs5KGf1vDIQ3/Qcn57izAWD+SnwfGjIkelnlf4xHxjvyrdCP Y/6HVm30dkBBc/BrKetIZGknm8A= X-Mailgun-Sending-Ip: 104.130.122.25 X-Mailgun-Sid: WyI1MzIzYiIsICJsaW51eC1hcm0tbXNtQHZnZXIua2VybmVsLm9yZyIsICJiZTllNGEiXQ== Received: from smtp.codeaurora.org (ec2-35-166-182-171.us-west-2.compute.amazonaws.com [35.166.182.171]) by mxa.mailgun.org with ESMTP id 5e2b049d.7fd3d0ae4a78-smtp-out-n03; Fri, 24 Jan 2020 14:52:13 -0000 (UTC) Received: by smtp.codeaurora.org (Postfix, from userid 1001) id DD2CDC447A5; Fri, 24 Jan 2020 14:52:11 +0000 (UTC) Received: from mail.codeaurora.org (localhost.localdomain [127.0.0.1]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) (Authenticated sender: saiprakash.ranjan) by smtp.codeaurora.org (Postfix) with ESMTPSA id 0FFFAC43383; Fri, 24 Jan 2020 14:52:10 +0000 (UTC) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Date: Fri, 24 Jan 2020 20:22:10 +0530 From: Sai Prakash Ranjan To: James Morse Cc: Borislav Petkov , Andy Gross , Bjorn Andersson , Mark Rutland , Rob Herring , devicetree@vger.kernel.org, Mauro Carvalho Chehab , Tony Luck , Robert Richter , linux-edac@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-arm-msm@vger.kernel.org, Stephen Boyd , Evan Green , tsoni@codeaurora.org, psodagud@codeaurora.org, baicar@os.amperecomputing.com Subject: Re: [PATCH 2/2] drivers: edac: Add EDAC support for Kryo CPU caches In-Reply-To: <04481690-028d-eb74-081d-aebb3ca9b037@arm.com> References: <0101016ed57a6559-46c6c649-db28-4945-a11c-7441b8e9ac5b-000000@us-west-2.amazonses.com> <20191230115030.GA30767@zn.tnic> <585db411bc542bf3f326627b7390e0ca@codeaurora.org> <04481690-028d-eb74-081d-aebb3ca9b037@arm.com> Message-ID: X-Sender: saiprakash.ranjan@codeaurora.org User-Agent: Roundcube Webmail/1.3.9 Sender: linux-arm-msm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-arm-msm@vger.kernel.org Hi James, On 2020-01-16 00:19, James Morse wrote: > Hi guys, > > (CC: +Tyler) > > On 13/01/2020 05:44, Sai Prakash Ranjan wrote: >> On 2019-12-30 17:20, Borislav Petkov wrote: >>> On Thu, Dec 05, 2019 at 09:53:18AM +0000, Sai Prakash Ranjan wrote: >>>> Kryo{3,4}XX CPU cores implement RAS extensions to support >>>> Error Correcting Code(ECC). Currently all Kryo{3,4}XX CPU >>>> cores (gold/silver a.k.a big/LITTLE) support ECC via RAS. >>> >>> via RAS what? ARM64_RAS_EXTN? >>> >>> In any case, this needs James to look at and especially if there's >>> some >>> ARM-generic functionality in there which should be shared, of course. > >> Yes it is ARM64_RAS_EXTN and I have been hoping if James can provide >> the feedback, >> it has been some time now since I posted this out. > > Sorry, I was out of the office for most of November/December, and I'm > slowly catching up... > > >>>> + >>>> +config EDAC_QCOM_KRYO_POLL >>>> +    depends on EDAC_QCOM_KRYO >>>> +    bool "Poll on Kryo ECC registers" >>>> +    help >>>> +      This option chooses whether or not you want to poll on the >>>> Kryo ECC >>>> +      registers. When this is enabled, the polling rate can be set >>>> as a >>>> +      module parameter. By default, it will call the polling >>>> function every >>>> +      second. >>> >>> Why is this a separate option and why should people use that? >>> >>> Can the polling/irq be switched automatically? > >> No it cannot be switched automatically. It is used in case some SoCs >> do not support an irq >> based mechanism for EDAC. >> But I am contradicting myself because I am telling that atleast one >> interrupt should be >> specified in bindings, >> so it is best if I drop this polling option for now. > > For now, sure. But I think this will come back for systems with > embarrassing amounts of > RAM that would rather scrub the errors than take a flood of IRQs. I'd > like this to be > controllable from user-space. > Ok so we should have an option to switch between polling and irq. > >>>> diff --git a/drivers/edac/Makefile b/drivers/edac/Makefile >>>> index d77200c9680b..29edcfa6ec0e 100644 >>>> --- a/drivers/edac/Makefile >>>> +++ b/drivers/edac/Makefile >>>> @@ -85,5 +85,6 @@ obj-$(CONFIG_EDAC_SYNOPSYS)        += >>>> synopsys_edac.o >>>>  obj-$(CONFIG_EDAC_XGENE)        += xgene_edac.o >>>>  obj-$(CONFIG_EDAC_TI)            += ti_edac.o >>>>  obj-$(CONFIG_EDAC_QCOM)            += qcom_edac.o >>>> +obj-$(CONFIG_EDAC_QCOM_KRYO)        += qcom_kryo_edac.o >>> >>> What is the difference between this new driver and the qcom_edac one? >>> Can >>> functionality be shared? > > High-level story time: > Until the 'v8.2' revision of the 'v8' Arm-architecture (the 64bit > one), arm didn't > describe how RAS should work. Partners implemented what they needed, > and we ended up with > this collection of drivers because they were all different. > > v8.2 fixed all this, the good news is once its done, we should never > need another edac > driver. (at least, not for SoCs built for v8.2). The downside is there > is quite a lot in > there, and we need to cover ACPI machines as well as DT. > That is true but the qcom_edac one which is merged is for LLC(system cache) which is a QCOM IP. >> qcom_edac driver is for QCOM system cache(last level cache), it should >> be renamed to >> qcom_llcc_edac.c. >> This new driver is for QCOM Kryo CPU core caches(L1,L2,L3). >> >> Functionality cannot be shared as these two are different IP blocks >> and best kept separate. > > The qcom_edac will be Qualcomm's pre-v8.2 support. > This series is about the v8.2 support which all looks totally > different to Linux. > As said before qcom_edac is for LLC which is not available on all SoCs. QCOM's pre v8.2 support is not upstreamed. > >>>> + * ARM Cortex-A55, Cortex-A75, Cortex-A76 TRM Chapter B3.3 >>> >>> Chapter? Where? URL? >>> >> >> I chose this because these TRMs are openly available and if you search >> for these above >> terms like >> "Cortex-A76 TRM Chapter B3.3" in google, then the first search result >> will be the TRM pdf, >> otherwise >> I would have to specify the long URL for the pdf and we do not know >> how long that URL link >> will be active. > > These are SoC/CPU specific. Using these we can't solve the whole > problem. > > The architecture all those should fit into is here: > https://static.docs.arm.com/ddi0587/cb/2019_07_05_DD_0587_C_b.pdf > (or https://developer.arm.com/docs/ and look for 'RAS') > > ... and the arm-arm. > Thanks for the link. > >>>> +static void dump_syndrome_reg(int error_type, int level, >>>> +                  u64 errxstatus, u64 errxmisc, >>>> +                  struct edac_device_ctl_info *edev_ctl) >>>> +{ >>>> +    char msg[KRYO_EDAC_MSG_MAX]; >>>> +    const char *error_msg; >>>> +    int cpu; >>>> + >>>> +    cpu = raw_smp_processor_id(); >>> >>> Why raw_? >>> >> >> Because we will be calling smp_processor_id in preemptible context and >> if we enable >> CONFIG_DEBUG_PREEMPT, >> we would get a nice backtrace. >> >> [    3.747468] BUG: using smp_processor_id() in preemptible [00000000] >> code: swapper/0/1 >> [    3.755527] caller is qcom_kryo_edac_probe+0x138/0x2b8 >> [    3.760819] CPU: 2 PID: 1 Comm: swapper/0 Tainted: G >> S                >> 5.4.0-rc7-next-20191113-00009-g8666855d6a5b-dirty #107 >> [    3.772323] Hardware name: Qualcomm Technologies, Inc. SM8150 MTP >> (DT) >> [    3.779030] Call trace: >> [    3.781556]  dump_backtrace+0x0/0x158 >> [    3.785331]  show_stack+0x14/0x20 >> [    3.788741]  dump_stack+0xb0/0xf4 >> [    3.792164]  debug_smp_processor_id+0xd8/0xe0 >> [    3.796639]  qcom_kryo_edac_probe+0x138/0x2b8 >> [    3.801116]  platform_drv_probe+0x50/0xa8 >> [    3.805236]  really_probe+0x108/0x360 >> [    3.808999]  driver_probe_device+0x58/0x100 >> [    3.813304]  device_driver_attach+0x6c/0x78 >> [    3.817606]  __driver_attach+0xb0/0xf0 >> [    3.821459]  bus_for_each_dev+0x68/0xc8 >> [    3.825407]  driver_attach+0x20/0x28 >> [    3.829083]  bus_add_driver+0x160/0x1f0 >> [    3.833030]  driver_register+0x60/0x110 >> [    3.836976]  __platform_driver_register+0x40/0x48 >> [    3.841813]  qcom_kryo_edac_driver_init+0x18/0x20 >> [    3.846645]  do_one_initcall+0x58/0x1a0 >> [    3.850596]  kernel_init_freeable+0x19c/0x240 >> [    3.855075]  kernel_init+0x10/0x108 >> [    3.858665]  ret_from_fork+0x10/0x1c > > and raw_ stops the backtrace? You are still preemptible. The problem > still exists, you've > just suppressed the warning. > > At any time in dump_syndrome_reg(), you could get an interrupt and > another task gets > scheduled. Later your thread is started on another cpu... but not the > one whose cpu number > you read from smp_processor_id(). Whatever you needed it for, might > have the wrong value. > Ok will correct this. > >>>> +static int kryo_l1_l2_setup_irq(struct platform_device *pdev, >>>> +                struct edac_device_ctl_info *edev_ctl) >>>> +{ >>>> +    int cpu, errirq, faultirq, ret; >>>> + >>>> +    edac_dev = devm_alloc_percpu(&pdev->dev, *edac_dev); >>>> +    if (!edac_dev) >>>> +        return -ENOMEM; >>>> + >>>> +    for_each_possible_cpu(cpu) { >>>> +        preempt_disable(); >>>> +        per_cpu(edac_dev, cpu) = edev_ctl; >>>> +        preempt_enable(); >>>> +    } >>> >>> That sillyness doesn't belong here, if at all. > >> Sorry but I do not understand the sillyness here. Could you please >> explain? > > preempt_disable() prevents another task being scheduled instead of > you, avoiding the risk > that you get scheduled on another cpu. In this case it doesn't matter > which cpu you are > running on as you aren't accessing _this_ cpu's edac_dev, you are > accessing each one in a > loop. > Thanks for the explanation James, now I get the sillyness. Thanks, Sai -- QUALCOMM INDIA, on behalf of Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by The Linux Foundation 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=-3.8 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SPF_HELO_NONE,SPF_PASS 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 C5921C2D0DB for ; Fri, 24 Jan 2020 14:54:50 +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 90CA320704 for ; Fri, 24 Jan 2020 14:54:50 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="YgVl4WIw"; dkim=fail reason="key not found in DNS" (0-bit key) header.d=mg.codeaurora.org header.i=@mg.codeaurora.org header.b="xV9PvNG4" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 90CA320704 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=codeaurora.org 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-Type: Content-Transfer-Encoding:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:Message-ID:References:In-Reply-To:Subject:To:From: Date:MIME-Version:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=Sw+5Moquce9SftiVF7sDmBekDsGpv/vgz1SKexhujYo=; b=YgVl4WIwxC3CEKIbn/q+Nt/1f +qOSGf0uOSWSCU3oY6+Xqp4FSXs9wS/5PjlthluNwnBZHsJhUOWXdRd0NsMej4YUi+BNO4UK/DnO/ qE1Heccrs1bv22OMI1ETbSizsHGtnI0uYCHGPFrQ7uZwPNMkycdape6HZPIQuqmYCublcvYiymo6I Vzh6+cHahDgsZHkQIovdI4z4eAV7PvWs6BohzZ+0Spw6J6O94pG8xH0P2j5R2jJGYhYR0mzs06ZeL QbKxKhChtpzJMCBGSGIZdsALUz0oXFQaIJaGAyUMoPS0h/PGUnNaTYNo5kDPjh1BvdGz5GyMelVK6 YSWXnmRzA==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1iv0MD-0007in-1N; Fri, 24 Jan 2020 14:54:49 +0000 Received: from mail25.static.mailgun.info ([104.130.122.25]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1iv0Jl-0005Hx-4e for linux-arm-kernel@lists.infradead.org; Fri, 24 Jan 2020 14:52:19 +0000 DKIM-Signature: a=rsa-sha256; v=1; c=relaxed/relaxed; d=mg.codeaurora.org; q=dns/txt; s=smtp; t=1579877535; h=Message-ID: References: In-Reply-To: Subject: Cc: To: From: Date: Content-Transfer-Encoding: Content-Type: MIME-Version: Sender; bh=qnTdKurql8lb6CMF2cfZ4H6NoG57pVvtuHeYNDi3fMk=; b=xV9PvNG4GJI0CWiYJgSL62q97I8UWaCL7in7C6YlwZZLriIIeYaLQwA6xi/iSgwcepvTeDrs Qou0g2BFlyrRZDsd/eMGNf9wYIACOFm7+8e5+oMp1sy0Fg46yRXgGl+MeAptPBMHjjaz/i8U vjVmCMT04As444izzIbhPKJlOlg= X-Mailgun-Sending-Ip: 104.130.122.25 X-Mailgun-Sid: WyJiYzAxZiIsICJsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmciLCAiYmU5ZTRhIl0= Received: from smtp.codeaurora.org (ec2-35-166-182-171.us-west-2.compute.amazonaws.com [35.166.182.171]) by mxa.mailgun.org with ESMTP id 5e2b049e.7f28a8a35570-smtp-out-n01; Fri, 24 Jan 2020 14:52:14 -0000 (UTC) Received: by smtp.codeaurora.org (Postfix, from userid 1001) id E2B60C447A6; Fri, 24 Jan 2020 14:52:11 +0000 (UTC) Received: from mail.codeaurora.org (localhost.localdomain [127.0.0.1]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) (Authenticated sender: saiprakash.ranjan) by smtp.codeaurora.org (Postfix) with ESMTPSA id 0FFFAC43383; Fri, 24 Jan 2020 14:52:10 +0000 (UTC) MIME-Version: 1.0 Date: Fri, 24 Jan 2020 20:22:10 +0530 From: Sai Prakash Ranjan To: James Morse Subject: Re: [PATCH 2/2] drivers: edac: Add EDAC support for Kryo CPU caches In-Reply-To: <04481690-028d-eb74-081d-aebb3ca9b037@arm.com> References: <0101016ed57a6559-46c6c649-db28-4945-a11c-7441b8e9ac5b-000000@us-west-2.amazonses.com> <20191230115030.GA30767@zn.tnic> <585db411bc542bf3f326627b7390e0ca@codeaurora.org> <04481690-028d-eb74-081d-aebb3ca9b037@arm.com> Message-ID: X-Sender: saiprakash.ranjan@codeaurora.org User-Agent: Roundcube Webmail/1.3.9 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200124_065217_315715_D6B6FE40 X-CRM114-Status: GOOD ( 36.49 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Mark Rutland , devicetree@vger.kernel.org, Tony Luck , psodagud@codeaurora.org, linux-arm-msm@vger.kernel.org, Stephen Boyd , tsoni@codeaurora.org, linux-kernel@vger.kernel.org, Rob Herring , Bjorn Andersson , Andy Gross , Borislav Petkov , Evan Green , Robert Richter , baicar@os.amperecomputing.com, Mauro Carvalho Chehab , linux-arm-kernel@lists.infradead.org, linux-edac@vger.kernel.org Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org SGkgSmFtZXMsCgpPbiAyMDIwLTAxLTE2IDAwOjE5LCBKYW1lcyBNb3JzZSB3cm90ZToKPiBIaSBn dXlzLAo+IAo+IChDQzogK1R5bGVyKQo+IAo+IE9uIDEzLzAxLzIwMjAgMDU6NDQsIFNhaSBQcmFr YXNoIFJhbmphbiB3cm90ZToKPj4gT24gMjAxOS0xMi0zMCAxNzoyMCwgQm9yaXNsYXYgUGV0a292 IHdyb3RlOgo+Pj4gT24gVGh1LCBEZWMgMDUsIDIwMTkgYXQgMDk6NTM6MThBTSArMDAwMCwgU2Fp IFByYWthc2ggUmFuamFuIHdyb3RlOgo+Pj4+IEtyeW97Myw0fVhYIENQVSBjb3JlcyBpbXBsZW1l bnQgUkFTIGV4dGVuc2lvbnMgdG8gc3VwcG9ydAo+Pj4+IEVycm9yIENvcnJlY3RpbmcgQ29kZShF Q0MpLiBDdXJyZW50bHkgYWxsIEtyeW97Myw0fVhYIENQVQo+Pj4+IGNvcmVzIChnb2xkL3NpbHZl ciBhLmsuYSBiaWcvTElUVExFKSBzdXBwb3J0IEVDQyB2aWEgUkFTLgo+Pj4gCj4+PiB2aWEgUkFT IHdoYXQ/IEFSTTY0X1JBU19FWFROPwo+Pj4gCj4+PiBJbiBhbnkgY2FzZSwgdGhpcyBuZWVkcyBK YW1lcyB0byBsb29rIGF0IGFuZCBlc3BlY2lhbGx5IGlmIHRoZXJlJ3MgCj4+PiBzb21lCj4+PiBB Uk0tZ2VuZXJpYyBmdW5jdGlvbmFsaXR5IGluIHRoZXJlIHdoaWNoIHNob3VsZCBiZSBzaGFyZWQs IG9mIGNvdXJzZS4KPiAKPj4gWWVzIGl0IGlzIEFSTTY0X1JBU19FWFROIGFuZCBJIGhhdmUgYmVl biBob3BpbmcgaWYgSmFtZXMgY2FuIHByb3ZpZGUgCj4+IHRoZSBmZWVkYmFjaywKPj4gaXQgaGFz IGJlZW4gc29tZSB0aW1lIG5vdyBzaW5jZSBJIHBvc3RlZCB0aGlzIG91dC4KPiAKPiBTb3JyeSwg SSB3YXMgb3V0IG9mIHRoZSBvZmZpY2UgZm9yIG1vc3Qgb2YgTm92ZW1iZXIvRGVjZW1iZXIsIGFu ZCBJJ20KPiBzbG93bHkgY2F0Y2hpbmcgdXAuLi4KPiAKPiAKPj4+PiArCj4+Pj4gK2NvbmZpZyBF REFDX1FDT01fS1JZT19QT0xMCj4+Pj4gK8KgwqDCoCBkZXBlbmRzIG9uIEVEQUNfUUNPTV9LUllP Cj4+Pj4gK8KgwqDCoCBib29sICJQb2xsIG9uIEtyeW8gRUNDIHJlZ2lzdGVycyIKPj4+PiArwqDC oMKgIGhlbHAKPj4+PiArwqDCoMKgwqDCoCBUaGlzIG9wdGlvbiBjaG9vc2VzIHdoZXRoZXIgb3Ig bm90IHlvdSB3YW50IHRvIHBvbGwgb24gdGhlIAo+Pj4+IEtyeW8gRUNDCj4+Pj4gK8KgwqDCoMKg wqAgcmVnaXN0ZXJzLiBXaGVuIHRoaXMgaXMgZW5hYmxlZCwgdGhlIHBvbGxpbmcgcmF0ZSBjYW4g YmUgc2V0IAo+Pj4+IGFzIGEKPj4+PiArwqDCoMKgwqDCoCBtb2R1bGUgcGFyYW1ldGVyLiBCeSBk ZWZhdWx0LCBpdCB3aWxsIGNhbGwgdGhlIHBvbGxpbmcgCj4+Pj4gZnVuY3Rpb24gZXZlcnkKPj4+ PiArwqDCoMKgwqDCoCBzZWNvbmQuCj4+PiAKPj4+IFdoeSBpcyB0aGlzIGEgc2VwYXJhdGUgb3B0 aW9uIGFuZCB3aHkgc2hvdWxkIHBlb3BsZSB1c2UgdGhhdD8KPj4+IAo+Pj4gQ2FuIHRoZSBwb2xs aW5nL2lycSBiZSBzd2l0Y2hlZCBhdXRvbWF0aWNhbGx5Pwo+IAo+PiBObyBpdCBjYW5ub3QgYmUg c3dpdGNoZWQgYXV0b21hdGljYWxseS4gSXQgaXMgdXNlZCBpbiBjYXNlIHNvbWUgU29DcyAKPj4g ZG8gbm90IHN1cHBvcnQgYW4gaXJxCj4+IGJhc2VkIG1lY2hhbmlzbSBmb3IgRURBQy4KPj4gQnV0 IEkgYW0gY29udHJhZGljdGluZyBteXNlbGYgYmVjYXVzZSBJIGFtIHRlbGxpbmcgdGhhdCBhdGxl YXN0IG9uZSAKPj4gaW50ZXJydXB0IHNob3VsZCBiZQo+PiBzcGVjaWZpZWQgaW4gYmluZGluZ3Ms Cj4+IHNvIGl0IGlzIGJlc3QgaWYgSSBkcm9wIHRoaXMgcG9sbGluZyBvcHRpb24gZm9yIG5vdy4K PiAKPiBGb3Igbm93LCBzdXJlLiBCdXQgSSB0aGluayB0aGlzIHdpbGwgY29tZSBiYWNrIGZvciBz eXN0ZW1zIHdpdGgKPiBlbWJhcnJhc3NpbmcgYW1vdW50cyBvZgo+IFJBTSB0aGF0IHdvdWxkIHJh dGhlciBzY3J1YiB0aGUgZXJyb3JzIHRoYW4gdGFrZSBhIGZsb29kIG9mIElSUXMuIEknZAo+IGxp a2UgdGhpcyB0byBiZQo+IGNvbnRyb2xsYWJsZSBmcm9tIHVzZXItc3BhY2UuCj4gCgpPayBzbyB3 ZSBzaG91bGQgaGF2ZSBhbiBvcHRpb24gdG8gc3dpdGNoIGJldHdlZW4gcG9sbGluZyBhbmQgaXJx LgoKPiAKPj4+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9lZGFjL01ha2VmaWxlIGIvZHJpdmVycy9l ZGFjL01ha2VmaWxlCj4+Pj4gaW5kZXggZDc3MjAwYzk2ODBiLi4yOWVkY2ZhNmVjMGUgMTAwNjQ0 Cj4+Pj4gLS0tIGEvZHJpdmVycy9lZGFjL01ha2VmaWxlCj4+Pj4gKysrIGIvZHJpdmVycy9lZGFj L01ha2VmaWxlCj4+Pj4gQEAgLTg1LDUgKzg1LDYgQEAgb2JqLSQoQ09ORklHX0VEQUNfU1lOT1BT WVMpwqDCoMKgwqDCoMKgwqAgKz0gCj4+Pj4gc3lub3BzeXNfZWRhYy5vCj4+Pj4gwqBvYmotJChD T05GSUdfRURBQ19YR0VORSnCoMKgwqDCoMKgwqDCoCArPSB4Z2VuZV9lZGFjLm8KPj4+PiDCoG9i ai0kKENPTkZJR19FREFDX1RJKcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKz0gdGlfZWRhYy5vCj4+ Pj4gwqBvYmotJChDT05GSUdfRURBQ19RQ09NKcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKz0gcWNv bV9lZGFjLm8KPj4+PiArb2JqLSQoQ09ORklHX0VEQUNfUUNPTV9LUllPKcKgwqDCoMKgwqDCoMKg ICs9IHFjb21fa3J5b19lZGFjLm8KPj4+IAo+Pj4gV2hhdCBpcyB0aGUgZGlmZmVyZW5jZSBiZXR3 ZWVuIHRoaXMgbmV3IGRyaXZlciBhbmQgdGhlIHFjb21fZWRhYyBvbmU/IAo+Pj4gQ2FuCj4+PiBm dW5jdGlvbmFsaXR5IGJlIHNoYXJlZD8KPiAKPiBIaWdoLWxldmVsIHN0b3J5IHRpbWU6Cj4gVW50 aWwgdGhlICd2OC4yJyByZXZpc2lvbiBvZiB0aGUgJ3Y4JyBBcm0tYXJjaGl0ZWN0dXJlICh0aGUg NjRiaXQKPiBvbmUpLCBhcm0gZGlkbid0Cj4gZGVzY3JpYmUgaG93IFJBUyBzaG91bGQgd29yay4g UGFydG5lcnMgaW1wbGVtZW50ZWQgd2hhdCB0aGV5IG5lZWRlZCwKPiBhbmQgd2UgZW5kZWQgdXAg d2l0aAo+IHRoaXMgY29sbGVjdGlvbiBvZiBkcml2ZXJzIGJlY2F1c2UgdGhleSB3ZXJlIGFsbCBk aWZmZXJlbnQuCj4gCj4gdjguMiBmaXhlZCBhbGwgdGhpcywgdGhlIGdvb2QgbmV3cyBpcyBvbmNl IGl0cyBkb25lLCB3ZSBzaG91bGQgbmV2ZXIKPiBuZWVkIGFub3RoZXIgZWRhYwo+IGRyaXZlci4g KGF0IGxlYXN0LCBub3QgZm9yIFNvQ3MgYnVpbHQgZm9yIHY4LjIpLiBUaGUgZG93bnNpZGUgaXMg dGhlcmUKPiBpcyBxdWl0ZSBhIGxvdCBpbgo+IHRoZXJlLCBhbmQgd2UgbmVlZCB0byBjb3ZlciBB Q1BJIG1hY2hpbmVzIGFzIHdlbGwgYXMgRFQuCj4gCgpUaGF0IGlzIHRydWUgYnV0IHRoZSBxY29t X2VkYWMgb25lIHdoaWNoIGlzIG1lcmdlZCBpcyBmb3IgTExDKHN5c3RlbSAKY2FjaGUpIHdoaWNo IGlzIGEgUUNPTSBJUC4KCj4+IHFjb21fZWRhYyBkcml2ZXIgaXMgZm9yIFFDT00gc3lzdGVtIGNh Y2hlKGxhc3QgbGV2ZWwgY2FjaGUpLCBpdCBzaG91bGQgCj4+IGJlIHJlbmFtZWQgdG8KPj4gcWNv bV9sbGNjX2VkYWMuYy4KPj4gVGhpcyBuZXcgZHJpdmVyIGlzIGZvciBRQ09NIEtyeW8gQ1BVIGNv cmUgY2FjaGVzKEwxLEwyLEwzKS4KPj4gCj4+IEZ1bmN0aW9uYWxpdHkgY2Fubm90IGJlIHNoYXJl ZCBhcyB0aGVzZSB0d28gYXJlIGRpZmZlcmVudCBJUCBibG9ja3MgCj4+IGFuZCBiZXN0IGtlcHQg c2VwYXJhdGUuCj4gCj4gVGhlIHFjb21fZWRhYyB3aWxsIGJlIFF1YWxjb21tJ3MgcHJlLXY4LjIg c3VwcG9ydC4KPiBUaGlzIHNlcmllcyBpcyBhYm91dCB0aGUgdjguMiBzdXBwb3J0IHdoaWNoIGFs bCBsb29rcyB0b3RhbGx5Cj4gZGlmZmVyZW50IHRvIExpbnV4Lgo+IAoKQXMgc2FpZCBiZWZvcmUg cWNvbV9lZGFjIGlzIGZvciBMTEMgd2hpY2ggaXMgbm90IGF2YWlsYWJsZSBvbiBhbGwgU29Dcy4K UUNPTSdzIHByZSB2OC4yIHN1cHBvcnQgaXMgbm90IHVwc3RyZWFtZWQuCgo+IAo+Pj4+ICsgKiBB Uk0gQ29ydGV4LUE1NSwgQ29ydGV4LUE3NSwgQ29ydGV4LUE3NiBUUk0gQ2hhcHRlciBCMy4zCj4+ PiAKPj4+IENoYXB0ZXI/IFdoZXJlPyBVUkw/Cj4+PiAKPj4gCj4+IEkgY2hvc2UgdGhpcyBiZWNh dXNlIHRoZXNlIFRSTXMgYXJlIG9wZW5seSBhdmFpbGFibGUgYW5kIGlmIHlvdSBzZWFyY2ggCj4+ IGZvciB0aGVzZSBhYm92ZQo+PiB0ZXJtcyBsaWtlCj4+ICJDb3J0ZXgtQTc2IFRSTSBDaGFwdGVy IEIzLjMiIGluIGdvb2dsZSwgdGhlbiB0aGUgZmlyc3Qgc2VhcmNoIHJlc3VsdCAKPj4gd2lsbCBi ZSB0aGUgVFJNIHBkZiwKPj4gb3RoZXJ3aXNlCj4+IEkgd291bGQgaGF2ZSB0byBzcGVjaWZ5IHRo ZSBsb25nIFVSTCBmb3IgdGhlIHBkZiBhbmQgd2UgZG8gbm90IGtub3cgCj4+IGhvdyBsb25nIHRo YXQgVVJMIGxpbmsKPj4gd2lsbCBiZSBhY3RpdmUuCj4gCj4gVGhlc2UgYXJlIFNvQy9DUFUgc3Bl Y2lmaWMuIFVzaW5nIHRoZXNlIHdlIGNhbid0IHNvbHZlIHRoZSB3aG9sZSAKPiBwcm9ibGVtLgo+ IAo+IFRoZSBhcmNoaXRlY3R1cmUgYWxsIHRob3NlIHNob3VsZCBmaXQgaW50byBpcyBoZXJlOgo+ IGh0dHBzOi8vc3RhdGljLmRvY3MuYXJtLmNvbS9kZGkwNTg3L2NiLzIwMTlfMDdfMDVfRERfMDU4 N19DX2IucGRmCj4gKG9yIGh0dHBzOi8vZGV2ZWxvcGVyLmFybS5jb20vZG9jcy8gYW5kIGxvb2sg Zm9yICdSQVMnKQo+IAo+IC4uLiBhbmQgdGhlIGFybS1hcm0uCj4gCgpUaGFua3MgZm9yIHRoZSBs aW5rLgoKPiAKPj4+PiArc3RhdGljIHZvaWQgZHVtcF9zeW5kcm9tZV9yZWcoaW50IGVycm9yX3R5 cGUsIGludCBsZXZlbCwKPj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB1 NjQgZXJyeHN0YXR1cywgdTY0IGVycnhtaXNjLAo+Pj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIHN0cnVjdCBlZGFjX2RldmljZV9jdGxfaW5mbyAqZWRldl9jdGwpCj4+Pj4g K3sKPj4+PiArwqDCoMKgIGNoYXIgbXNnW0tSWU9fRURBQ19NU0dfTUFYXTsKPj4+PiArwqDCoMKg IGNvbnN0IGNoYXIgKmVycm9yX21zZzsKPj4+PiArwqDCoMKgIGludCBjcHU7Cj4+Pj4gKwo+Pj4+ ICvCoMKgwqAgY3B1ID0gcmF3X3NtcF9wcm9jZXNzb3JfaWQoKTsKPj4+IAo+Pj4gV2h5IHJhd18/ Cj4+PiAKPj4gCj4+IEJlY2F1c2Ugd2Ugd2lsbCBiZSBjYWxsaW5nIHNtcF9wcm9jZXNzb3JfaWQg aW4gcHJlZW1wdGlibGUgY29udGV4dCBhbmQgCj4+IGlmIHdlIGVuYWJsZQo+PiBDT05GSUdfREVC VUdfUFJFRU1QVCwKPj4gd2Ugd291bGQgZ2V0IGEgbmljZSBiYWNrdHJhY2UuCj4+IAo+PiBbwqDC oMKgIDMuNzQ3NDY4XSBCVUc6IHVzaW5nIHNtcF9wcm9jZXNzb3JfaWQoKSBpbiBwcmVlbXB0aWJs ZSBbMDAwMDAwMDBdIAo+PiBjb2RlOiBzd2FwcGVyLzAvMQo+PiBbwqDCoMKgIDMuNzU1NTI3XSBj YWxsZXIgaXMgcWNvbV9rcnlvX2VkYWNfcHJvYmUrMHgxMzgvMHgyYjgKPj4gW8KgwqDCoCAzLjc2 MDgxOV0gQ1BVOiAyIFBJRDogMSBDb21tOiBzd2FwcGVyLzAgVGFpbnRlZDogRyAKPj4gU8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoAo+PiA1LjQuMC1yYzctbmV4dC0yMDE5MTExMy0wMDAw OS1nODY2Njg1NWQ2YTViLWRpcnR5ICMxMDcKPj4gW8KgwqDCoCAzLjc3MjMyM10gSGFyZHdhcmUg bmFtZTogUXVhbGNvbW0gVGVjaG5vbG9naWVzLCBJbmMuIFNNODE1MCBNVFAgCj4+IChEVCkKPj4g W8KgwqDCoCAzLjc3OTAzMF0gQ2FsbCB0cmFjZToKPj4gW8KgwqDCoCAzLjc4MTU1Nl3CoCBkdW1w X2JhY2t0cmFjZSsweDAvMHgxNTgKPj4gW8KgwqDCoCAzLjc4NTMzMV3CoCBzaG93X3N0YWNrKzB4 MTQvMHgyMAo+PiBbwqDCoMKgIDMuNzg4NzQxXcKgIGR1bXBfc3RhY2srMHhiMC8weGY0Cj4+IFvC oMKgwqAgMy43OTIxNjRdwqAgZGVidWdfc21wX3Byb2Nlc3Nvcl9pZCsweGQ4LzB4ZTAKPj4gW8Kg wqDCoCAzLjc5NjYzOV3CoCBxY29tX2tyeW9fZWRhY19wcm9iZSsweDEzOC8weDJiOAo+PiBbwqDC oMKgIDMuODAxMTE2XcKgIHBsYXRmb3JtX2Rydl9wcm9iZSsweDUwLzB4YTgKPj4gW8KgwqDCoCAz LjgwNTIzNl3CoCByZWFsbHlfcHJvYmUrMHgxMDgvMHgzNjAKPj4gW8KgwqDCoCAzLjgwODk5OV3C oCBkcml2ZXJfcHJvYmVfZGV2aWNlKzB4NTgvMHgxMDAKPj4gW8KgwqDCoCAzLjgxMzMwNF3CoCBk ZXZpY2VfZHJpdmVyX2F0dGFjaCsweDZjLzB4NzgKPj4gW8KgwqDCoCAzLjgxNzYwNl3CoCBfX2Ry aXZlcl9hdHRhY2grMHhiMC8weGYwCj4+IFvCoMKgwqAgMy44MjE0NTldwqAgYnVzX2Zvcl9lYWNo X2RldisweDY4LzB4YzgKPj4gW8KgwqDCoCAzLjgyNTQwN13CoCBkcml2ZXJfYXR0YWNoKzB4MjAv MHgyOAo+PiBbwqDCoMKgIDMuODI5MDgzXcKgIGJ1c19hZGRfZHJpdmVyKzB4MTYwLzB4MWYwCj4+ IFvCoMKgwqAgMy44MzMwMzBdwqAgZHJpdmVyX3JlZ2lzdGVyKzB4NjAvMHgxMTAKPj4gW8KgwqDC oCAzLjgzNjk3Nl3CoCBfX3BsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcisweDQwLzB4NDgKPj4gW8Kg wqDCoCAzLjg0MTgxM13CoCBxY29tX2tyeW9fZWRhY19kcml2ZXJfaW5pdCsweDE4LzB4MjAKPj4g W8KgwqDCoCAzLjg0NjY0NV3CoCBkb19vbmVfaW5pdGNhbGwrMHg1OC8weDFhMAo+PiBbwqDCoMKg IDMuODUwNTk2XcKgIGtlcm5lbF9pbml0X2ZyZWVhYmxlKzB4MTljLzB4MjQwCj4+IFvCoMKgwqAg My44NTUwNzVdwqAga2VybmVsX2luaXQrMHgxMC8weDEwOAo+PiBbwqDCoMKgIDMuODU4NjY1XcKg IHJldF9mcm9tX2ZvcmsrMHgxMC8weDFjCj4gCj4gYW5kIHJhd18gc3RvcHMgdGhlIGJhY2t0cmFj ZT8gWW91IGFyZSBzdGlsbCBwcmVlbXB0aWJsZS4gVGhlIHByb2JsZW0KPiBzdGlsbCBleGlzdHMs IHlvdSd2ZQo+IGp1c3Qgc3VwcHJlc3NlZCB0aGUgd2FybmluZy4KPiAKPiBBdCBhbnkgdGltZSBp biBkdW1wX3N5bmRyb21lX3JlZygpLCB5b3UgY291bGQgZ2V0IGFuIGludGVycnVwdCBhbmQKPiBh bm90aGVyIHRhc2sgZ2V0cwo+IHNjaGVkdWxlZC4gTGF0ZXIgeW91ciB0aHJlYWQgaXMgc3RhcnRl ZCBvbiBhbm90aGVyIGNwdS4uLiBidXQgbm90IHRoZQo+IG9uZSB3aG9zZSBjcHUgbnVtYmVyCj4g eW91IHJlYWQgZnJvbSBzbXBfcHJvY2Vzc29yX2lkKCkuIFdoYXRldmVyIHlvdSBuZWVkZWQgaXQg Zm9yLCBtaWdodAo+IGhhdmUgdGhlIHdyb25nIHZhbHVlLgo+IAoKT2sgd2lsbCBjb3JyZWN0IHRo aXMuCgo+IAo+Pj4+ICtzdGF0aWMgaW50IGtyeW9fbDFfbDJfc2V0dXBfaXJxKHN0cnVjdCBwbGF0 Zm9ybV9kZXZpY2UgKnBkZXYsCj4+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBz dHJ1Y3QgZWRhY19kZXZpY2VfY3RsX2luZm8gKmVkZXZfY3RsKQo+Pj4+ICt7Cj4+Pj4gK8KgwqDC oCBpbnQgY3B1LCBlcnJpcnEsIGZhdWx0aXJxLCByZXQ7Cj4+Pj4gKwo+Pj4+ICvCoMKgwqAgZWRh Y19kZXYgPSBkZXZtX2FsbG9jX3BlcmNwdSgmcGRldi0+ZGV2LCAqZWRhY19kZXYpOwo+Pj4+ICvC oMKgwqAgaWYgKCFlZGFjX2RldikKPj4+PiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuIC1FTk9NRU07 Cj4+Pj4gKwo+Pj4+ICvCoMKgwqAgZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkgewo+Pj4+ICvC oMKgwqDCoMKgwqDCoCBwcmVlbXB0X2Rpc2FibGUoKTsKPj4+PiArwqDCoMKgwqDCoMKgwqAgcGVy X2NwdShlZGFjX2RldiwgY3B1KSA9IGVkZXZfY3RsOwo+Pj4+ICvCoMKgwqDCoMKgwqDCoCBwcmVl bXB0X2VuYWJsZSgpOwo+Pj4+ICvCoMKgwqAgfQo+Pj4gCj4+PiBUaGF0IHNpbGx5bmVzcyBkb2Vz bid0IGJlbG9uZyBoZXJlLCBpZiBhdCBhbGwuCj4gCj4+IFNvcnJ5IGJ1dCBJIGRvIG5vdCB1bmRl cnN0YW5kIHRoZSBzaWxseW5lc3MgaGVyZS4gQ291bGQgeW91IHBsZWFzZSAKPj4gZXhwbGFpbj8K PiAKPiBwcmVlbXB0X2Rpc2FibGUoKSBwcmV2ZW50cyBhbm90aGVyIHRhc2sgYmVpbmcgc2NoZWR1 bGVkIGluc3RlYWQgb2YKPiB5b3UsIGF2b2lkaW5nIHRoZSByaXNrCj4gdGhhdCB5b3UgZ2V0IHNj aGVkdWxlZCBvbiBhbm90aGVyIGNwdS4gSW4gdGhpcyBjYXNlIGl0IGRvZXNuJ3QgbWF0dGVyCj4g d2hpY2ggY3B1IHlvdSBhcmUKPiBydW5uaW5nIG9uIGFzIHlvdSBhcmVuJ3QgYWNjZXNzaW5nIF90 aGlzXyBjcHUncyBlZGFjX2RldiwgeW91IGFyZQo+IGFjY2Vzc2luZyBlYWNoIG9uZSBpbiBhCj4g bG9vcC4KPiAKClRoYW5rcyBmb3IgdGhlIGV4cGxhbmF0aW9uIEphbWVzLCBub3cgSSBnZXQgdGhl IHNpbGx5bmVzcy4KClRoYW5rcywKU2FpCgotLSAKUVVBTENPTU0gSU5ESUEsIG9uIGJlaGFsZiBv ZiBRdWFsY29tbSBJbm5vdmF0aW9uIENlbnRlciwgSW5jLiBpcyBhIAptZW1iZXIKb2YgQ29kZSBB dXJvcmEgRm9ydW0sIGhvc3RlZCBieSBUaGUgTGludXggRm91bmRhdGlvbgoKX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KbGludXgtYXJtLWtlcm5lbCBtYWls aW5nIGxpc3QKbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0 cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtYXJtLWtlcm5lbAo=