From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id DDCA9C433F5 for ; Wed, 19 Jan 2022 20:43:05 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233914AbiASUnE (ORCPT ); Wed, 19 Jan 2022 15:43:04 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:46558 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230288AbiASUnE (ORCPT ); Wed, 19 Jan 2022 15:43:04 -0500 Received: from ams.source.kernel.org (ams.source.kernel.org [IPv6:2604:1380:4601:e00::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 0AABDC061574; Wed, 19 Jan 2022 12:43:04 -0800 (PST) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id C9A5AB81B40; Wed, 19 Jan 2022 20:43:02 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 3EEBAC004E1; Wed, 19 Jan 2022 20:43:01 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1642624981; bh=MYdffHsoiG3EHyAMjktxM2ofz/n5wkMwONpV0Nte2Cc=; h=Date:From:To:Cc:Subject:In-Reply-To:From; b=WNEtlRC2A1ACqYqANxnXl4w6LgJIsbTg1+FcDOru2xLG/04GiIHhpXHiypVxqPqoJ mgcBHAhLy7od99+LxMNNv0llAle2tjK8UbIPaMXkc1j5TbFePbGhMpm6MeQKubXHqP q6auDJ5MTnQPEi97UJDA6N3JyFcgWxVTcnxzoeHNEA+paE5ZT1Z1x0MIDETEHSGyDF 7U9Inogrtr0C5hTG1r+dD1yIN8zvQu1PONjkiNS91KFeY69YhQcCW8qJ6w/1wuESLK svzdACsj7hCprWHtEZ7tr0PAICJpBvecPba5jGB6ezFwQiN1lhbVj1ti85tdDwWH7o GR/6nrncDXW7A== Date: Wed, 19 Jan 2022 14:42:59 -0600 From: Bjorn Helgaas To: Shuai Xue Cc: "Rafael J. Wysocki" , bp@alien8.de, tony.luck@intel.com, james.morse@arm.com, lenb@kernel.org, rjw@rjwysocki.net, bhelgaas@google.com, zhangliguang@linux.alibaba.com, zhuo.song@linux.alibaba.com, linux-kernel@vger.kernel.org, linux-acpi@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-pci@vger.kernel.org Subject: Re: [PATCH v5] ACPI: Move sdei_init and ghes_init ahead to handle platform errors earlier Message-ID: <20220119204259.GA962224@bhelgaas> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: Precedence: bulk List-ID: X-Mailing-List: linux-acpi@vger.kernel.org On Wed, Jan 19, 2022 at 02:40:11PM +0800, Shuai Xue wrote: > [+to Rafael, question about HEST/GHES/SDEI init] > > Hi, Bjorn, > > Thank you for your comments and quick reply. > > 在 2022/1/19 AM6:49, Bjorn Helgaas 写道: > > On Sun, Jan 16, 2022 at 04:43:10PM +0800, Shuai Xue wrote: > >> On an ACPI system, ACPI is initialised very early from a > >> subsys_initcall(), while SDEI is not ready until a > >> subsys_initcall_sync(). This patch is to reduce the time before GHES > >> initialization. > >> > >> The SDEI driver provides functions (e.g. apei_sdei_register_ghes(), > >> apei_sdei_unregister_ghes()) to register or unregister event callback > >> for dispatcher in firmware. When the GHES driver probing, it registers > >> the corresponding callback according to the notification type specified > >> by GHES. If the GHES notification type is SDEI, the GHES driver will > >> call apei_sdei_register_ghes() to register event call. > >> > >> When the firmware emits an event, it migrates the handling of the event > >> into the kernel at the registered entry-point __sdei_asm_handler. And > >> finally, the kernel will call the registered event callback and return > >> status_code to indicate the status of event handling. SDEI_EV_FAILED > >> indicates that the kernel failed to handle the event. > >> > >> Consequently, when an error occurs during kernel booting, the kernel is > >> unable to handle and report errors until the GHES driver is initialized > >> by device_initcall(), in which the event callback is registered. For > >> example, when the kernel booting, the console logs many times from > >> firmware before GHES drivers init in our platform: > >> > >> Trip in MM PCIe RAS handle(Intr:910) > >> Clean PE[1.1.1] ERR_STS:0x4000100 -> 0 INT_STS:F0000000 > >> Find RP(98:1.0) > >> --Walk dev(98:1.0) CE:0 UCE:4000 > >> ... > >> ERROR: sdei_dispatch_event(32a) ret:-1 > >> --handler(910) end > > > > If I understand correctly, the firmware noticed an error, tried to > > report it to the kernel, and is complaining because the kernel isn't > > ready to handle it yet. And the reason for this patch is to reduce > > these complaints from the firmware. > > My thoughts exactly :) > > > That doesn't seem like a very good reason for this patch. There is > > *always* a window before the kernel is ready to handle events from the > > firmware. > > Yes, there is always a window. But if we could do better in kernel that > reduces the window by 90% (from 33 seconds to 3 second), why not? > > > Why is the firmware noticing these errors in the first place? If > > you're seeing these complaints regularly, my guess is that either you > > have some terrible hardware or (more likely) the firmware isn't > > clearing some expected error condition correctly. For example, maybe > > the Unsupported Request errors that happen while enumerating PCIe > > devices are being reported. > > > > If you register the callback function, the kernel will now start > > seeing these error reports. What happens then? Does the kernel log > > the errors somewhere? Is that better than the current situation where > > the firmware logs them? > > Yep, it is a hardware issue. The firmware only logs in console > (ttyAMA0) and we can not see it in kernel side. After the kernel > starts seeing these error reports, we could see EDAC/ghes and > efi/cper detailed logs in dmesg. We did not notice the problem until > we check the console log, which inspired us to reduce the window > when kernel startup, so that we can see the message clearly and > properly. I think the intuition is to check the log of dmesg, not > the console. > > However, I DO think that: > > > > - Removing acpi_hest_init() from acpi_pci_root_init(), and > > > > - Converting ghes_init() and sdei_init() from initcalls to explicit > > calls > > > > are very good reasons to do something like this patch because HEST is > > not PCI-specific, and IMO, explicit calls are better than initcalls > > because initcall ordering is implicit and not well-defined within a > > level. > > Haha, if the above reasons still don't convince you, I would like to > accept yours :) Should we do it in one patch or separate it into two > patches? IMO, this can be done in one patch, but this would probably go via Rafael. > >> -static int __init ghes_init(void) > >> +void __init ghes_init(void) > >> { > >> int rc; > >> > >> if (acpi_disabled) > >> - return -ENODEV; > >> + return; > >> > >> switch (hest_disable) { > >> case HEST_NOT_FOUND: > >> - return -ENODEV; > >> + pr_info(GHES_PFX "HEST is not found!\n"); > > > > I don't know whether this "HEST is not found" message is > > worthwhile or not. I don't think lack of an HEST is an error, and > > users may be alarmed. But this is an ACPI thing, so up to you and > > Rafael. > > If we explicit call ghes_init(), we can't tell if ghes is > initialized successfully based on the return value of initcall. So I > add a info message. When ghes_init() is an initcall and you return -ENODEV for the HEST_NOT_FOUND case, I don't think we log any message about that, do we? do_one_initcall() will capture and return the -ENODEV, but the caller (do_initcall_level()) just ignores it. > >> @@ -1495,8 +1494,7 @@ static int __init ghes_init(void) > >> else > >> pr_info(GHES_PFX "Failed to enable APEI firmware first mode.\n"); > >> > >> - return 0; > >> + return; > >> err: > >> - return rc; > >> + ghes_disable = 1; > > > > Why do you set ghes_disable here? As far as I can tell, we will never > > look at it again. The places we do look at it are: > > > > - ghes_init(): earlier in this function, so we've already done that, > > > > - acpi_hest_init(): we've already called that, too, and > > > > - acpi_bus_osc_negotiate_platform_control(): called from > > acpi_bus_init(), which we've already called. > > I add it for future potential usage. Thank you for pointing it out. > If you think it is not necessary, I will delete it in next version. I think it is not necessary to save information that will never be used. If you need it in the future, you can add it and the reason will be obvious. Bjorn From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 7F7FEC43217 for ; Wed, 19 Jan 2022 20:44:24 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:MIME-Version: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:References: List-Owner; bh=/9yzTpRILrRrDBpeeKNrDT5+DrlID6sbDqwqEBIY+Ok=; b=uePbpvDxDo5xbJ 4bnuc49sZr+FGEYp2dvGH5XRfz+J/2VM0NPIojV2LqmOE6S8rdeM4ZyLAavpcZTi39he+tLMPm7ui zB69lwzu98N5f92NiBT4QgBsw4C7OZxbN6DWJ+v10y/bwXteLBG7k1tGkRPQFzesbbx3F4Ncp/ncr A89HeacIqtSHOrjPeZchPxxgZxaWoqmw4Xb82gAO2eN0zXS7RaasFDi2QkWtPEKaAKqnppHVzFvyF 0B921Gwd9cXAqJXP4ZVeePpw7+JztdOnpI8WfOOly4jCpQwpe4c71s45yV3uadpKhMCypeJluobeC djBkzgIjReqq5LJd3F/w==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1nAHnO-007MML-VG; Wed, 19 Jan 2022 20:43:07 +0000 Received: from dfw.source.kernel.org ([139.178.84.217]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1nAHnL-007MKo-6k for linux-arm-kernel@lists.infradead.org; Wed, 19 Jan 2022 20:43:04 +0000 Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 242DE6171D; Wed, 19 Jan 2022 20:43:02 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 3EEBAC004E1; Wed, 19 Jan 2022 20:43:01 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1642624981; bh=MYdffHsoiG3EHyAMjktxM2ofz/n5wkMwONpV0Nte2Cc=; h=Date:From:To:Cc:Subject:In-Reply-To:From; b=WNEtlRC2A1ACqYqANxnXl4w6LgJIsbTg1+FcDOru2xLG/04GiIHhpXHiypVxqPqoJ mgcBHAhLy7od99+LxMNNv0llAle2tjK8UbIPaMXkc1j5TbFePbGhMpm6MeQKubXHqP q6auDJ5MTnQPEi97UJDA6N3JyFcgWxVTcnxzoeHNEA+paE5ZT1Z1x0MIDETEHSGyDF 7U9Inogrtr0C5hTG1r+dD1yIN8zvQu1PONjkiNS91KFeY69YhQcCW8qJ6w/1wuESLK svzdACsj7hCprWHtEZ7tr0PAICJpBvecPba5jGB6ezFwQiN1lhbVj1ti85tdDwWH7o GR/6nrncDXW7A== Date: Wed, 19 Jan 2022 14:42:59 -0600 From: Bjorn Helgaas To: Shuai Xue Cc: "Rafael J. Wysocki" , bp@alien8.de, tony.luck@intel.com, james.morse@arm.com, lenb@kernel.org, rjw@rjwysocki.net, bhelgaas@google.com, zhangliguang@linux.alibaba.com, zhuo.song@linux.alibaba.com, linux-kernel@vger.kernel.org, linux-acpi@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-pci@vger.kernel.org Subject: Re: [PATCH v5] ACPI: Move sdei_init and ghes_init ahead to handle platform errors earlier Message-ID: <20220119204259.GA962224@bhelgaas> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20220119_124303_387175_CB909234 X-CRM114-Status: GOOD ( 60.16 ) 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 T24gV2VkLCBKYW4gMTksIDIwMjIgYXQgMDI6NDA6MTFQTSArMDgwMCwgU2h1YWkgWHVlIHdyb3Rl Ogo+IFsrdG8gUmFmYWVsLCBxdWVzdGlvbiBhYm91dCBIRVNUL0dIRVMvU0RFSSBpbml0XQo+IAo+ IEhpLCBCam9ybiwKPiAKPiBUaGFuayB5b3UgZm9yIHlvdXIgY29tbWVudHMgYW5kIHF1aWNrIHJl cGx5Lgo+IAo+IOWcqCAyMDIyLzEvMTkgQU02OjQ5LCBCam9ybiBIZWxnYWFzIOWGmemBkzoKPiA+ IE9uIFN1biwgSmFuIDE2LCAyMDIyIGF0IDA0OjQzOjEwUE0gKzA4MDAsIFNodWFpIFh1ZSB3cm90 ZToKPiA+PiBPbiBhbiBBQ1BJIHN5c3RlbSwgQUNQSSBpcyBpbml0aWFsaXNlZCB2ZXJ5IGVhcmx5 IGZyb20gYQo+ID4+IHN1YnN5c19pbml0Y2FsbCgpLCB3aGlsZSBTREVJIGlzIG5vdCByZWFkeSB1 bnRpbCBhCj4gPj4gc3Vic3lzX2luaXRjYWxsX3N5bmMoKS4gVGhpcyBwYXRjaCBpcyB0byByZWR1 Y2UgdGhlIHRpbWUgYmVmb3JlIEdIRVMKPiA+PiBpbml0aWFsaXphdGlvbi4KPiA+Pgo+ID4+IFRo ZSBTREVJIGRyaXZlciBwcm92aWRlcyBmdW5jdGlvbnMgKGUuZy4gYXBlaV9zZGVpX3JlZ2lzdGVy X2doZXMoKSwKPiA+PiBhcGVpX3NkZWlfdW5yZWdpc3Rlcl9naGVzKCkpIHRvIHJlZ2lzdGVyIG9y IHVucmVnaXN0ZXIgZXZlbnQgY2FsbGJhY2sKPiA+PiBmb3IgZGlzcGF0Y2hlciBpbiBmaXJtd2Fy ZS4gV2hlbiB0aGUgR0hFUyBkcml2ZXIgcHJvYmluZywgaXQgcmVnaXN0ZXJzCj4gPj4gdGhlIGNv cnJlc3BvbmRpbmcgY2FsbGJhY2sgYWNjb3JkaW5nIHRvIHRoZSBub3RpZmljYXRpb24gdHlwZSBz cGVjaWZpZWQKPiA+PiBieSBHSEVTLiBJZiB0aGUgR0hFUyBub3RpZmljYXRpb24gdHlwZSBpcyBT REVJLCB0aGUgR0hFUyBkcml2ZXIgd2lsbAo+ID4+IGNhbGwgYXBlaV9zZGVpX3JlZ2lzdGVyX2do ZXMoKSB0byByZWdpc3RlciBldmVudCBjYWxsLgo+ID4+Cj4gPj4gV2hlbiB0aGUgZmlybXdhcmUg ZW1pdHMgYW4gZXZlbnQsIGl0IG1pZ3JhdGVzIHRoZSBoYW5kbGluZyBvZiB0aGUgZXZlbnQKPiA+ PiBpbnRvIHRoZSBrZXJuZWwgYXQgdGhlIHJlZ2lzdGVyZWQgZW50cnktcG9pbnQgX19zZGVpX2Fz bV9oYW5kbGVyLiBBbmQKPiA+PiBmaW5hbGx5LCB0aGUga2VybmVsIHdpbGwgY2FsbCB0aGUgcmVn aXN0ZXJlZCBldmVudCBjYWxsYmFjayBhbmQgcmV0dXJuCj4gPj4gc3RhdHVzX2NvZGUgdG8gaW5k aWNhdGUgdGhlIHN0YXR1cyBvZiBldmVudCBoYW5kbGluZy4gU0RFSV9FVl9GQUlMRUQKPiA+PiBp bmRpY2F0ZXMgdGhhdCB0aGUga2VybmVsIGZhaWxlZCB0byBoYW5kbGUgdGhlIGV2ZW50Lgo+ID4+ Cj4gPj4gQ29uc2VxdWVudGx5LCB3aGVuIGFuIGVycm9yIG9jY3VycyBkdXJpbmcga2VybmVsIGJv b3RpbmcsIHRoZSBrZXJuZWwgaXMKPiA+PiB1bmFibGUgdG8gaGFuZGxlIGFuZCByZXBvcnQgZXJy b3JzIHVudGlsIHRoZSBHSEVTIGRyaXZlciBpcyBpbml0aWFsaXplZAo+ID4+IGJ5IGRldmljZV9p bml0Y2FsbCgpLCBpbiB3aGljaCB0aGUgZXZlbnQgY2FsbGJhY2sgaXMgcmVnaXN0ZXJlZC4gIEZv cgo+ID4+IGV4YW1wbGUsIHdoZW4gdGhlIGtlcm5lbCBib290aW5nLCB0aGUgY29uc29sZSBsb2dz IG1hbnkgdGltZXMgZnJvbQo+ID4+IGZpcm13YXJlIGJlZm9yZSBHSEVTIGRyaXZlcnMgaW5pdCBp biBvdXIgcGxhdGZvcm06Cj4gPj4KPiA+PiAJVHJpcCBpbiBNTSBQQ0llIFJBUyBoYW5kbGUoSW50 cjo5MTApCj4gPj4gICAJQ2xlYW4gUEVbMS4xLjFdIEVSUl9TVFM6MHg0MDAwMTAwIC0+IDAgSU5U X1NUUzpGMDAwMDAwMAo+ID4+IAlGaW5kIFJQKDk4OjEuMCkKPiA+PiAJLS1XYWxrIGRldig5ODox LjApIENFOjAgVUNFOjQwMDAKPiA+PiAJLi4uCj4gPj4gCUVSUk9SOiAgIHNkZWlfZGlzcGF0Y2hf ZXZlbnQoMzJhKSByZXQ6LTEKPiA+PiAJLS1oYW5kbGVyKDkxMCkgZW5kCj4gPiAKPiA+IElmIEkg dW5kZXJzdGFuZCBjb3JyZWN0bHksIHRoZSBmaXJtd2FyZSBub3RpY2VkIGFuIGVycm9yLCB0cmll ZCB0bwo+ID4gcmVwb3J0IGl0IHRvIHRoZSBrZXJuZWwsIGFuZCBpcyBjb21wbGFpbmluZyBiZWNh dXNlIHRoZSBrZXJuZWwgaXNuJ3QKPiA+IHJlYWR5IHRvIGhhbmRsZSBpdCB5ZXQuICBBbmQgdGhl IHJlYXNvbiBmb3IgdGhpcyBwYXRjaCBpcyB0byByZWR1Y2UKPiA+IHRoZXNlIGNvbXBsYWludHMg ZnJvbSB0aGUgZmlybXdhcmUuCj4gCj4gTXkgdGhvdWdodHMgZXhhY3RseSA6KQo+IAo+ID4gVGhh dCBkb2Vzbid0IHNlZW0gbGlrZSBhIHZlcnkgZ29vZCByZWFzb24gZm9yIHRoaXMgcGF0Y2guICBU aGVyZSBpcwo+ID4gKmFsd2F5cyogYSB3aW5kb3cgYmVmb3JlIHRoZSBrZXJuZWwgaXMgcmVhZHkg dG8gaGFuZGxlIGV2ZW50cyBmcm9tIHRoZQo+ID4gZmlybXdhcmUuCj4gCj4gWWVzLCB0aGVyZSBp cyBhbHdheXMgYSB3aW5kb3cuIEJ1dCBpZiB3ZSBjb3VsZCBkbyBiZXR0ZXIgaW4ga2VybmVsIHRo YXQKPiByZWR1Y2VzIHRoZSB3aW5kb3cgYnkgOTAlIChmcm9tIDMzIHNlY29uZHMgdG8gMyBzZWNv bmQpLCB3aHkgbm90Pwo+IAo+ID4gV2h5IGlzIHRoZSBmaXJtd2FyZSBub3RpY2luZyB0aGVzZSBl cnJvcnMgaW4gdGhlIGZpcnN0IHBsYWNlPyAgSWYKPiA+IHlvdSdyZSBzZWVpbmcgdGhlc2UgY29t cGxhaW50cyByZWd1bGFybHksIG15IGd1ZXNzIGlzIHRoYXQgZWl0aGVyIHlvdQo+ID4gaGF2ZSBz b21lIHRlcnJpYmxlIGhhcmR3YXJlIG9yIChtb3JlIGxpa2VseSkgdGhlIGZpcm13YXJlIGlzbid0 Cj4gPiBjbGVhcmluZyBzb21lIGV4cGVjdGVkIGVycm9yIGNvbmRpdGlvbiBjb3JyZWN0bHkuICBG b3IgZXhhbXBsZSwgbWF5YmUKPiA+IHRoZSBVbnN1cHBvcnRlZCBSZXF1ZXN0IGVycm9ycyB0aGF0 IGhhcHBlbiB3aGlsZSBlbnVtZXJhdGluZyBQQ0llCj4gPiBkZXZpY2VzIGFyZSBiZWluZyByZXBv cnRlZC4KPiA+Cj4gPiBJZiB5b3UgcmVnaXN0ZXIgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uLCB0aGUg a2VybmVsIHdpbGwgbm93IHN0YXJ0Cj4gPiBzZWVpbmcgdGhlc2UgZXJyb3IgcmVwb3J0cy4gIFdo YXQgaGFwcGVucyB0aGVuPyAgRG9lcyB0aGUga2VybmVsIGxvZwo+ID4gdGhlIGVycm9ycyBzb21l d2hlcmU/ICBJcyB0aGF0IGJldHRlciB0aGFuIHRoZSBjdXJyZW50IHNpdHVhdGlvbiB3aGVyZQo+ ID4gdGhlIGZpcm13YXJlIGxvZ3MgdGhlbT8KPiAKPiBZZXAsIGl0IGlzIGEgaGFyZHdhcmUgaXNz dWUuIFRoZSBmaXJtd2FyZSBvbmx5IGxvZ3MgaW4gY29uc29sZQo+ICh0dHlBTUEwKSBhbmQgd2Ug Y2FuIG5vdCBzZWUgaXQgaW4ga2VybmVsIHNpZGUuIEFmdGVyIHRoZSBrZXJuZWwKPiBzdGFydHMg c2VlaW5nIHRoZXNlIGVycm9yIHJlcG9ydHMsIHdlIGNvdWxkIHNlZSBFREFDL2doZXMgYW5kCj4g ZWZpL2NwZXIgZGV0YWlsZWQgbG9ncyBpbiBkbWVzZy4gV2UgZGlkIG5vdCBub3RpY2UgdGhlIHBy b2JsZW0gdW50aWwKPiB3ZSBjaGVjayB0aGUgY29uc29sZSBsb2csIHdoaWNoIGluc3BpcmVkIHVz IHRvIHJlZHVjZSB0aGUgd2luZG93Cj4gd2hlbiBrZXJuZWwgc3RhcnR1cCwgc28gdGhhdCB3ZSBj YW4gc2VlIHRoZSBtZXNzYWdlIGNsZWFybHkgYW5kCj4gcHJvcGVybHkuIEkgdGhpbmsgdGhlIGlu dHVpdGlvbiBpcyB0byBjaGVjayB0aGUgbG9nIG9mIGRtZXNnLCBub3QKPiB0aGUgY29uc29sZS4K Cj4gPiBIb3dldmVyLCBJIERPIHRoaW5rIHRoYXQ6Cj4gPiAKPiA+ICAgLSBSZW1vdmluZyBhY3Bp X2hlc3RfaW5pdCgpIGZyb20gYWNwaV9wY2lfcm9vdF9pbml0KCksIGFuZAo+ID4gCj4gPiAgIC0g Q29udmVydGluZyBnaGVzX2luaXQoKSBhbmQgc2RlaV9pbml0KCkgZnJvbSBpbml0Y2FsbHMgdG8g ZXhwbGljaXQKPiA+ICAgICBjYWxscwo+ID4gCj4gPiBhcmUgdmVyeSBnb29kIHJlYXNvbnMgdG8g ZG8gc29tZXRoaW5nIGxpa2UgdGhpcyBwYXRjaCBiZWNhdXNlIEhFU1QgaXMKPiA+IG5vdCBQQ0kt c3BlY2lmaWMsIGFuZCBJTU8sIGV4cGxpY2l0IGNhbGxzIGFyZSBiZXR0ZXIgdGhhbiBpbml0Y2Fs bHMKPiA+IGJlY2F1c2UgaW5pdGNhbGwgb3JkZXJpbmcgaXMgaW1wbGljaXQgYW5kIG5vdCB3ZWxs LWRlZmluZWQgd2l0aGluIGEKPiA+IGxldmVsLgo+IAo+IEhhaGEsIGlmIHRoZSBhYm92ZSByZWFz b25zIHN0aWxsIGRvbid0IGNvbnZpbmNlIHlvdSwgSSB3b3VsZCBsaWtlIHRvCj4gYWNjZXB0IHlv dXJzIDopIFNob3VsZCB3ZSBkbyBpdCBpbiBvbmUgcGF0Y2ggb3Igc2VwYXJhdGUgaXQgaW50byB0 d28KPiBwYXRjaGVzPwoKSU1PLCB0aGlzIGNhbiBiZSBkb25lIGluIG9uZSBwYXRjaCwgYnV0IHRo aXMgd291bGQgcHJvYmFibHkgZ28gdmlhClJhZmFlbC4KCj4gPj4gLXN0YXRpYyBpbnQgX19pbml0 IGdoZXNfaW5pdCh2b2lkKQo+ID4+ICt2b2lkIF9faW5pdCBnaGVzX2luaXQodm9pZCkKPiA+PiAg ewo+ID4+ICAJaW50IHJjOwo+ID4+ICAKPiA+PiAgCWlmIChhY3BpX2Rpc2FibGVkKQo+ID4+IC0J CXJldHVybiAtRU5PREVWOwo+ID4+ICsJCXJldHVybjsKPiA+PiAgCj4gPj4gIAlzd2l0Y2ggKGhl c3RfZGlzYWJsZSkgewo+ID4+ICAJY2FzZSBIRVNUX05PVF9GT1VORDoKPiA+PiAtCQlyZXR1cm4g LUVOT0RFVjsKPiA+PiArCQlwcl9pbmZvKEdIRVNfUEZYICJIRVNUIGlzIG5vdCBmb3VuZCFcbiIp Owo+ID4gCj4gPiBJIGRvbid0IGtub3cgd2hldGhlciB0aGlzICJIRVNUIGlzIG5vdCBmb3VuZCIg bWVzc2FnZSBpcwo+ID4gd29ydGh3aGlsZSBvciBub3QuICBJIGRvbid0IHRoaW5rIGxhY2sgb2Yg YW4gSEVTVCBpcyBhbiBlcnJvciwgYW5kCj4gPiB1c2VycyBtYXkgYmUgYWxhcm1lZC4gIEJ1dCB0 aGlzIGlzIGFuIEFDUEkgdGhpbmcsIHNvIHVwIHRvIHlvdSBhbmQKPiA+IFJhZmFlbC4KPiAKPiBJ ZiB3ZSBleHBsaWNpdCBjYWxsIGdoZXNfaW5pdCgpLCB3ZSBjYW4ndCB0ZWxsIGlmIGdoZXMgaXMK PiBpbml0aWFsaXplZCBzdWNjZXNzZnVsbHkgYmFzZWQgb24gdGhlIHJldHVybiB2YWx1ZSBvZiBp bml0Y2FsbC4gU28gSQo+IGFkZCBhIGluZm8gbWVzc2FnZS4KCldoZW4gZ2hlc19pbml0KCkgaXMg YW4gaW5pdGNhbGwgYW5kIHlvdSByZXR1cm4gLUVOT0RFViBmb3IgdGhlCkhFU1RfTk9UX0ZPVU5E IGNhc2UsIEkgZG9uJ3QgdGhpbmsgd2UgbG9nIGFueSBtZXNzYWdlIGFib3V0IHRoYXQsIGRvCndl PyAgZG9fb25lX2luaXRjYWxsKCkgd2lsbCBjYXB0dXJlIGFuZCByZXR1cm4gdGhlIC1FTk9ERVYs IGJ1dCB0aGUKY2FsbGVyIChkb19pbml0Y2FsbF9sZXZlbCgpKSBqdXN0IGlnbm9yZXMgaXQuCgo+ ID4+IEBAIC0xNDk1LDggKzE0OTQsNyBAQCBzdGF0aWMgaW50IF9faW5pdCBnaGVzX2luaXQodm9p ZCkKPiA+PiAgCWVsc2UKPiA+PiAgCQlwcl9pbmZvKEdIRVNfUEZYICJGYWlsZWQgdG8gZW5hYmxl IEFQRUkgZmlybXdhcmUgZmlyc3QgbW9kZS5cbiIpOwo+ID4+ICAKPiA+PiAtCXJldHVybiAwOwo+ ID4+ICsJcmV0dXJuOwo+ID4+ICBlcnI6Cj4gPj4gLQlyZXR1cm4gcmM7Cj4gPj4gKwlnaGVzX2Rp c2FibGUgPSAxOwo+ID4gCj4gPiBXaHkgZG8geW91IHNldCBnaGVzX2Rpc2FibGUgaGVyZT8gIEFz IGZhciBhcyBJIGNhbiB0ZWxsLCB3ZSB3aWxsIG5ldmVyCj4gPiBsb29rIGF0IGl0IGFnYWluLiAg VGhlIHBsYWNlcyB3ZSBkbyBsb29rIGF0IGl0IGFyZToKPiA+IAo+ID4gICAtIGdoZXNfaW5pdCgp OiBlYXJsaWVyIGluIHRoaXMgZnVuY3Rpb24sIHNvIHdlJ3ZlIGFscmVhZHkgZG9uZSB0aGF0LAo+ ID4gCj4gPiAgIC0gYWNwaV9oZXN0X2luaXQoKTogd2UndmUgYWxyZWFkeSBjYWxsZWQgdGhhdCwg dG9vLCBhbmQKPiA+IAo+ID4gICAtIGFjcGlfYnVzX29zY19uZWdvdGlhdGVfcGxhdGZvcm1fY29u dHJvbCgpOiBjYWxsZWQgZnJvbQo+ID4gICAgIGFjcGlfYnVzX2luaXQoKSwgd2hpY2ggd2UndmUg YWxyZWFkeSBjYWxsZWQuCj4gCj4gSSBhZGQgaXQgZm9yIGZ1dHVyZSBwb3RlbnRpYWwgdXNhZ2Uu IFRoYW5rIHlvdSBmb3IgcG9pbnRpbmcgaXQgb3V0Lgo+IElmIHlvdSB0aGluayBpdCBpcyBub3Qg bmVjZXNzYXJ5LCBJIHdpbGwgZGVsZXRlIGl0IGluIG5leHQgdmVyc2lvbi4KCkkgdGhpbmsgaXQg aXMgbm90IG5lY2Vzc2FyeSB0byBzYXZlIGluZm9ybWF0aW9uIHRoYXQgd2lsbCBuZXZlciBiZQp1 c2VkLiAgSWYgeW91IG5lZWQgaXQgaW4gdGhlIGZ1dHVyZSwgeW91IGNhbiBhZGQgaXQgYW5kIHRo ZSByZWFzb24Kd2lsbCBiZSBvYnZpb3VzLgoKQmpvcm4KCl9fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fCmxpbnV4LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0Cmxp bnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFk Lm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFybS1rZXJuZWwK