From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pl1-f182.google.com (mail-pl1-f182.google.com [209.85.214.182]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8D55310781 for ; Wed, 6 Sep 2023 12:26:16 +0000 (UTC) Received: by mail-pl1-f182.google.com with SMTP id d9443c01a7336-1bf078d5f33so28105605ad.3 for ; Wed, 06 Sep 2023 05:26:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1694003176; x=1694607976; darn=lists.linux.dev; h=in-reply-to:content-transfer-encoding:content-disposition :mime-version:references:message-id:subject:cc:to:from:date:from:to :cc:subject:date:message-id:reply-to; bh=kjnnzDLUDo2+D27D03H2YWRaB12AVyK4xgoDBE0WK78=; b=ksoMkUSxQcUfnBG2VDniH75q1mm6zIrVyEzFnjp4qELkreeS5eKj/t+Nb34Q780KLP rAVj+6+N6Vh/uPcbe78a2vw0PhVGkryJ49HcibEWOkkK1KS3+OZaIR9fluWgsbuDTA21 cPUOuBW88MchfpgdqGNoLL+XjnJhfaozieTLHgQPDUDg6jv0I0X+TvFfzPQWjjpMCsT8 g5WmiVPJ75ZmPHx4jiUq64K1TANIZhSuQc8UuWk0lcDkvq6hSY9PetdEyG1nkofMeMZP X2kpkaqcE7SqrOcQVn32JaG6Nd1KARYzettf9PTtb+TTqH4oE70eUZdRKO1t/dICkELI omXA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1694003176; x=1694607976; h=in-reply-to:content-transfer-encoding:content-disposition :mime-version:references:message-id:subject:cc:to:from:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=kjnnzDLUDo2+D27D03H2YWRaB12AVyK4xgoDBE0WK78=; b=XCuOHId4uqH8jGDcNZkhlOSjSup94B/SATPxCZ/qe8qQqKsLgmXGt/y0dQhzIhNRGo Yfi25+xJczUp5J7QbmItOjw7jrGbCPPyxPPqHK59lqL0mlKgDwEGjlcQVtgJHeYRZIsN LTW/Fp2uHiM3ZT7vXdNw3sLFlH+E1T7csEQcg1O3Uh7fUi7pxxrMGu+RN30aZ5MR3Pg2 XNeb8nskIsIGGQQfhfunGW/k/M65nIjUz1Gl7EhD7fGK2s45MQu2tSLr7abP4yno9UCG SWZsnejov+T7bJt9KHjyVOC5DTZ5Sz80BsgXueRxkZ9fZ+xbXBSFMKietBJypF8GY0cj f2HA== X-Gm-Message-State: AOJu0YytBWaZtVYd3vJxu3O8PoAw8SsPadwV4Qj72Y3sU9598m8pKBk7 9elH9rooN3dqVuXUplJik3LF X-Google-Smtp-Source: AGHT+IFRy+f9cPt6hImhbeLHiudZgHv2ne6+5hiV0JlI5JP4oipQdy+eixxMA2W/+788/8cEth4xNw== X-Received: by 2002:a17:90b:fc8:b0:26f:2c5a:bbb3 with SMTP id gd8-20020a17090b0fc800b0026f2c5abbb3mr14027269pjb.40.1694003175797; Wed, 06 Sep 2023 05:26:15 -0700 (PDT) Received: from thinkpad ([120.138.12.139]) by smtp.gmail.com with ESMTPSA id 25-20020a17090a199900b002693505391csm13493081pji.37.2023.09.06.05.26.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 06 Sep 2023 05:26:15 -0700 (PDT) Date: Wed, 6 Sep 2023 17:56:05 +0530 From: Manivannan Sadhasivam To: Frank Li Cc: tglx@linutronix.de, aisheng.dong@nxp.com, bhelgaas@google.com, devicetree@vger.kernel.org, festevam@gmail.com, imx@lists.linux.dev, jdmason@kudzu.us, kernel@pengutronix.de, kishon@ti.com, krzysztof.kozlowski+dt@linaro.org, kw@linux.com, linux-arm-kernel@lists.infradead.org, linux-imx@nxp.com, linux-kernel@vger.kernel.org, linux-pci@vger.kernel.org, lorenzo.pieralisi@arm.com, lpieralisi@kernel.org, maz@kernel.org, ntb@lists.linux.dev, peng.fan@nxp.com, robh+dt@kernel.org, s.hauer@pengutronix.de, shawnguo@kernel.org Subject: Re: [PATCH 1/3] PCI: endpoint: Add RC-to-EP doorbell support using platform MSI controller Message-ID: <20230906122605.GB5930@thinkpad> References: <20230426203436.1277307-1-Frank.Li@nxp.com> <20230426203436.1277307-2-Frank.Li@nxp.com> <20230902045214.GA2913@thinkpad> <20230902045328.GB2913@thinkpad> Precedence: bulk X-Mailing-List: imx@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: On Wed, Sep 06, 2023 at 12:24:50AM -0400, Frank Li wrote: > On Sat, Sep 02, 2023 at 10:23:28AM +0530, Manivannan Sadhasivam wrote: > > On Sat, Sep 02, 2023 at 10:22:25AM +0530, Manivannan Sadhasivam wrote: > > > On Wed, Apr 26, 2023 at 04:34:34PM -0400, Frank Li wrote: > > > > This commit introduces a common method for sending messages from the Root Complex > > > > (RC) to the Endpoint (EP) by utilizing the platform MSI interrupt controller, > > > > such as ARM GIC, as an EP doorbell. Maps the memory assigned for the BAR region > > > > by the PCI host to the message address of the platform MSI interrupt controller > > > > in the PCI EP. As a result, when the PCI RC writes to the BAR region, it triggers > > > > an IRQ at the EP. This implementation serves as a common method for all endpoint > > > > function drivers. > > > > > > > > However, it currently supports only one EP physical function due to limitations > > > > in ARM MSI/IMS readiness. > > > > > > > > > > I've provided generic comments below, but I will do one more thorough review > > > after seeing epf-test driver patch. > > > > > > > Signed-off-by: Frank Li > > > > --- > > > > drivers/pci/endpoint/pci-epf-core.c | 109 ++++++++++++++++++++++++++++ > > > > include/linux/pci-epf.h | 16 ++++ > > > > 2 files changed, 125 insertions(+) > > > > > > > > diff --git a/drivers/pci/endpoint/pci-epf-core.c b/drivers/pci/endpoint/pci-epf-core.c > > > > index 355a6f56fcea..94ac82bf84c5 100644 > > > > --- a/drivers/pci/endpoint/pci-epf-core.c > > > > +++ b/drivers/pci/endpoint/pci-epf-core.c > > > > @@ -6,10 +6,12 @@ > > > > * Author: Kishon Vijay Abraham I > > > > */ > > > > > > > > +#include > > > > > > Why is this needed? > > > > > > > #include > > > > #include > > > > #include > > > > #include > > > > +#include > > > > > > > > #include > > > > #include > > > > @@ -300,6 +302,113 @@ void *pci_epf_alloc_space(struct pci_epf *epf, size_t size, enum pci_barno bar, > > > > } > > > > EXPORT_SYMBOL_GPL(pci_epf_alloc_space); > > > > > > > > +static enum irqreturn pci_epf_interrupt_handler(int irq, void *data) > > > > > > static irqreturn_t > > > > > > s/pci_epf_interrupt_handler/pci_epf_doorbell_handler > > > > > > > +{ > > > > + struct pci_epf *epf = data; > > > > + > > > > + if (epf->event_ops && epf->event_ops->doorbell) > > > > + epf->event_ops->doorbell(epf, irq - epf->virq_base); > > > > + > > > > + return IRQ_HANDLED; > > > > +} > > > > + > > > > +static void pci_epf_write_msi_msg(struct msi_desc *desc, struct msi_msg *msg) > > > > +{ > > > > + struct pci_epc *epc = container_of(desc->dev, struct pci_epc, dev); > > > > + struct pci_epf *epf; > > > > + > > > > + /* Todo: Need check correct epf if multi epf supported */ > > > > + list_for_each_entry(epf, &epc->pci_epf, list) { > > > > + if (epf->msg && desc->msi_index < epf->num_msgs) > > > > + epf->msg[desc->msi_index] = *msg; > > > > + } > > > > +} > > > > + > > > > +int pci_epf_alloc_doorbell(struct pci_epf *epf, u16 num_msgs) > > > > +{ > > > > + struct irq_domain *domain; > > > > + struct pci_epc *epc; > > > > + struct device *dev; > > > > + int virq; > > > > + int ret; > > > > + int i; > > > > + > > > > + epc = epf->epc; > > > > + dev = &epc->dev; > > > > > > "epc_dev" to make it explicit > > All other place use 'dev', I think better keep the consistent. > > Frank > > > > > > > + > > > > + /* > > > > + * Current only support 1 function. > > > > > > What does this mean exactly? Even a single EPC can support multiple EPFs > > > > > > > Please ignore above comment. > > > > - Mani > > > > > > + * PCI IMS(interrupt message store) ARM support have not been > > > > + * ready yet. > > > > > > No need to mention platform irq controller name. > > what's means? > "PCI IMS ARM support" is not needed. Just say that only one EPF is supported. > > > > > > > + */ > > > > + if (epc->function_num_map != 1) > > > > > > Why can't you use, epf->func_no? > > > > > > > + return -EOPNOTSUPP; > > > > + > > > > + domain = dev_get_msi_domain(dev->parent); > > > > + if (!domain) > > > > + return -EOPNTSUPP; > > > > > > Newline > > > > > > > + dev_set_msi_domain(dev, domain); > > > > + > > > > + /* use parent of_node to get device id information */ > > > > + dev->of_node = dev->parent->of_node; > > > > + > > > > > > Why do you need of_node assignment inside EPF core? > > GIC need it to allocate a MSI irq to platform devices. > I think it may improve if IMS support. > Can't you assign it in the EPF driver itself? I do not want any OF reference in the EPF core since it has no OF support. - Mani > Frank > > > > > > > > + epf->msg = kcalloc(num_msgs, sizeof(struct msi_msg), GFP_KERNEL); > > > > + if (!epf->msg) > > > > + return -ENOMEM; > > > > + > > > > + epf->num_msgs = num_msgs; > > > > + > > > > > > Move this to the start of the function, after checks. > > > > > > > + ret = platform_msi_domain_alloc_irqs(dev, num_msgs, pci_epf_write_msi_msg); > > > > + if (ret) { > > > > + dev_err(dev, "Can't allocate MSI from system MSI controller\n"); > > > > > > "Failed to allocate MSI" > > > > > > > + goto err_mem; > > > > > > err_free_mem > > > > > > > + } > > > > + > > > > + for (i = 0; i < num_msgs; i++) { > > > > + virq = msi_get_virq(dev, i); > > > > + if (i == 0) > > > > + epf->virq_base = virq; > > > > + > > > > + ret = request_irq(virq, pci_epf_interrupt_handler, 0, > > > > + "pci-epf-doorbell", epf); > > > > > > IRQ name should have an index, otherwise all of them will have the same name. > > > > > > > + > > > > + if (ret) { > > > > + dev_err(dev, "Failure request doorbell IRQ\n"); > > > > > > "Failed to request doorbell" > > > > > > > + goto err_irq; > > > > > > err_free_irq > > > > > > > + } > > > > + } > > > > + > > > > + epf->num_msgs = num_msgs; > > > > > > Newline > > > > > > > + return ret; > > > > + > > > > +err_irq: > > > > + platform_msi_domain_free_irqs(dev); > > > > +err_mem: > > > > + kfree(epf->msg); > > > > + epf->msg = NULL; > > > > + epf->num_msgs = 0; > > > > + > > > > + return ret; > > > > +} > > > > +EXPORT_SYMBOL_GPL(pci_epf_alloc_doorbell); > > > > + > > > > +void pci_epf_free_doorbell(struct pci_epf *epf) > > > > +{ > > > > + struct pci_epc *epc; > > > > + int i; > > > > + > > > > + epc = epf->epc; > > > > + > > > > + for (i = 0; i < epf->num_msgs; i++) > > > > + free_irq(epf->virq_base + i, epf); > > > > + > > > > + platform_msi_domain_free_irqs(&epc->dev); > > > > + kfree(epf->msg); > > > > + epf->msg = NULL; > > > > + epf->num_msgs = 0; > > > > +} > > > > +EXPORT_SYMBOL_GPL(pci_epf_free_doorbell); > > > > + > > > > static void pci_epf_remove_cfs(struct pci_epf_driver *driver) > > > > { > > > > struct config_group *group, *tmp; > > > > diff --git a/include/linux/pci-epf.h b/include/linux/pci-epf.h > > > > index b8441db2fa52..e187e3ee48d2 100644 > > > > --- a/include/linux/pci-epf.h > > > > +++ b/include/linux/pci-epf.h > > > > @@ -75,6 +75,7 @@ struct pci_epf_ops { > > > > struct pci_epc_event_ops { > > > > int (*core_init)(struct pci_epf *epf); > > > > int (*link_up)(struct pci_epf *epf); > > > > + int (*doorbell)(struct pci_epf *epf, int index); > > > > }; > > > > > > > > /** > > > > @@ -173,6 +174,9 @@ struct pci_epf { > > > > unsigned long vfunction_num_map; > > > > struct list_head pci_vepf; > > > > const struct pci_epc_event_ops *event_ops; > > > > + struct msi_msg *msg; > > > > + u16 num_msgs; > > > > + int virq_base; > > > > }; > > > > > > > > /** > > > > @@ -216,4 +220,16 @@ int pci_epf_bind(struct pci_epf *epf); > > > > void pci_epf_unbind(struct pci_epf *epf); > > > > int pci_epf_add_vepf(struct pci_epf *epf_pf, struct pci_epf *epf_vf); > > > > void pci_epf_remove_vepf(struct pci_epf *epf_pf, struct pci_epf *epf_vf); > > > > +int pci_epf_alloc_doorbell(struct pci_epf *epf, u16 nums); > > > > +void pci_epf_free_doorbell(struct pci_epf *epf); > > > > + > > > > +static inline struct msi_msg *epf_get_msg(struct pci_epf *epf) > > > > +{ > > > > + return epf->msg; > > > > +} > > > > + > > > > +static inline u16 epf_get_msg_num(struct pci_epf *epf) > > > > +{ > > > > + return epf->num_msgs; > > > > +} > > > > > > I don't see a need for these two functions as they are doing just dereferences. > > > > > > - Mani > > > > > > > #endif /* __LINUX_PCI_EPF_H */ > > > > -- > > > > 2.34.1 > > > > > > > > > > -- > > > மணிவண்ணன் சதாசிவம் > > > > -- > > மணிவண்ணன் சதாசிவம் -- மணிவண்ணன் சதாசிவம் 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 9D42DEB8FA5 for ; Wed, 6 Sep 2023 12:26:49 +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: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=+jaNQQ6cZfDsOhzsmoFRQbyk0ztoKEz9yYAiWz9ft0k=; b=AGr5bXncUiUJ2k S/Hau0bSJXtRW5h6nLZ3Wmqzi8b1U7cnBhjAa3Y5KKPugfOVPMs/P+mDaO4F7WxyMmM7VPHVNjcya 3bXjk+I7m8TBJxJFIm+XMSBQjoDVWCemLNqJvIoGcTN7gqIYdipDCH1jICxNOsr9y3bZQ1K+/pJks s3hZBB0CrigqRadQRoq73YT/7CPRm5sVsAFoVyOqnmDSJuqcZtEMjvW7ZA1H/fsv+jnQQX4AMDHEf ijNk6Z9UySS2hU5lksIC9WcTkFdXxWv2NYzhc0aOoBpBaf9wykCgzCIk7ShEJA4MO0jdUHjWUYsLT 26cKbQg2oDcSzSHMjBQg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1qdrbw-009Nj1-10; Wed, 06 Sep 2023 12:26:20 +0000 Received: from mail-pl1-x629.google.com ([2607:f8b0:4864:20::629]) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1qdrbt-009Nfg-1A for linux-arm-kernel@lists.infradead.org; Wed, 06 Sep 2023 12:26:19 +0000 Received: by mail-pl1-x629.google.com with SMTP id d9443c01a7336-1c364fb8a4cso3067945ad.1 for ; Wed, 06 Sep 2023 05:26:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1694003176; x=1694607976; darn=lists.infradead.org; h=in-reply-to:content-transfer-encoding:content-disposition :mime-version:references:message-id:subject:cc:to:from:date:from:to :cc:subject:date:message-id:reply-to; bh=kjnnzDLUDo2+D27D03H2YWRaB12AVyK4xgoDBE0WK78=; b=T7+prhaMYx5OfSPpVbAvBPMj84Xs2x9IjmOOtc3QnnE6dnUzNwAToclewcuMw6wNdB jAPCym4zdef8iCqPv0ZASUxvevVOBD0e5KQ+f1089Clh1y0i8UMygSyE6I/DHgmea+IB OIt5fS5cOSZaJ9old5UeLuKIZklF7H0bHwylNz0gVNOIUQqY/veKIw4/4+KUFl0fsI8D HyKEnFcantL1oaOdt4y2OCJT4rtBp7+4WaauC+EuLNHscTNMCUe0emWCtluAJPMA5uab OsUlAL4/Nx1fKQlVKjQwaWAE+Spdb2aRRc60n1IiVJ1xb1KbNm4GqN0aOFbWrZF5h18j 5M3w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1694003176; x=1694607976; h=in-reply-to:content-transfer-encoding:content-disposition :mime-version:references:message-id:subject:cc:to:from:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=kjnnzDLUDo2+D27D03H2YWRaB12AVyK4xgoDBE0WK78=; b=W0zA/2ZDg1S1HvuB09qtfV/QREKHSgsaz9wyXWHWtZLeN/XC0rGlMN06ErTQJB2pza vLnuLHexRXUFhNfR3akt7tvygp5+e7AoFRblwvo8H2SJpcnnVw/CiOiXLtzZ7TdytJiJ 3jCreO0T86S7PetKZM4VIhBPI2CpE9KeQI6z+ScpZ9fhwkrFoBKt7QSs9I7Zw4X9BmcI sO9sV1muu4QLfEfu38zbZxGSOVwBoKvtlxg9EYyPmvmnMJnIv4QmwU6mgkeVOyY7kPKC d2QztPyg/Kb7OdzH3xuAD5qxNQ3+SyMXBjhrmIy5zNSlwgd7UaLzQbuuocrPzNN+rzGC O4QA== X-Gm-Message-State: AOJu0YyxxsCot1gU36A8HrajS5CSU4MJ8OUIn0nrrB8v4WdwEiICzM5W eZD6q0y3DiVbe2chi/c6e6BO X-Google-Smtp-Source: AGHT+IFRy+f9cPt6hImhbeLHiudZgHv2ne6+5hiV0JlI5JP4oipQdy+eixxMA2W/+788/8cEth4xNw== X-Received: by 2002:a17:90b:fc8:b0:26f:2c5a:bbb3 with SMTP id gd8-20020a17090b0fc800b0026f2c5abbb3mr14027269pjb.40.1694003175797; Wed, 06 Sep 2023 05:26:15 -0700 (PDT) Received: from thinkpad ([120.138.12.139]) by smtp.gmail.com with ESMTPSA id 25-20020a17090a199900b002693505391csm13493081pji.37.2023.09.06.05.26.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 06 Sep 2023 05:26:15 -0700 (PDT) Date: Wed, 6 Sep 2023 17:56:05 +0530 From: Manivannan Sadhasivam To: Frank Li Cc: tglx@linutronix.de, aisheng.dong@nxp.com, bhelgaas@google.com, devicetree@vger.kernel.org, festevam@gmail.com, imx@lists.linux.dev, jdmason@kudzu.us, kernel@pengutronix.de, kishon@ti.com, krzysztof.kozlowski+dt@linaro.org, kw@linux.com, linux-arm-kernel@lists.infradead.org, linux-imx@nxp.com, linux-kernel@vger.kernel.org, linux-pci@vger.kernel.org, lorenzo.pieralisi@arm.com, lpieralisi@kernel.org, maz@kernel.org, ntb@lists.linux.dev, peng.fan@nxp.com, robh+dt@kernel.org, s.hauer@pengutronix.de, shawnguo@kernel.org Subject: Re: [PATCH 1/3] PCI: endpoint: Add RC-to-EP doorbell support using platform MSI controller Message-ID: <20230906122605.GB5930@thinkpad> References: <20230426203436.1277307-1-Frank.Li@nxp.com> <20230426203436.1277307-2-Frank.Li@nxp.com> <20230902045214.GA2913@thinkpad> <20230902045328.GB2913@thinkpad> 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-20230906_052617_405149_77E6A864 X-CRM114-Status: GOOD ( 46.72 ) 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 T24gV2VkLCBTZXAgMDYsIDIwMjMgYXQgMTI6MjQ6NTBBTSAtMDQwMCwgRnJhbmsgTGkgd3JvdGU6 Cj4gT24gU2F0LCBTZXAgMDIsIDIwMjMgYXQgMTA6MjM6MjhBTSArMDUzMCwgTWFuaXZhbm5hbiBT YWRoYXNpdmFtIHdyb3RlOgo+ID4gT24gU2F0LCBTZXAgMDIsIDIwMjMgYXQgMTA6MjI6MjVBTSAr MDUzMCwgTWFuaXZhbm5hbiBTYWRoYXNpdmFtIHdyb3RlOgo+ID4gPiBPbiBXZWQsIEFwciAyNiwg MjAyMyBhdCAwNDozNDozNFBNIC0wNDAwLCBGcmFuayBMaSB3cm90ZToKPiA+ID4gPiBUaGlzIGNv bW1pdCBpbnRyb2R1Y2VzIGEgY29tbW9uIG1ldGhvZCBmb3Igc2VuZGluZyBtZXNzYWdlcyBmcm9t IHRoZSBSb290IENvbXBsZXgKPiA+ID4gPiAoUkMpIHRvIHRoZSBFbmRwb2ludCAoRVApIGJ5IHV0 aWxpemluZyB0aGUgcGxhdGZvcm0gTVNJIGludGVycnVwdCBjb250cm9sbGVyLAo+ID4gPiA+IHN1 Y2ggYXMgQVJNIEdJQywgYXMgYW4gRVAgZG9vcmJlbGwuIE1hcHMgdGhlIG1lbW9yeSBhc3NpZ25l ZCBmb3IgdGhlIEJBUiByZWdpb24KPiA+ID4gPiBieSB0aGUgUENJIGhvc3QgdG8gdGhlIG1lc3Nh Z2UgYWRkcmVzcyBvZiB0aGUgcGxhdGZvcm0gTVNJIGludGVycnVwdCBjb250cm9sbGVyCj4gPiA+ ID4gaW4gdGhlIFBDSSBFUC4gQXMgYSByZXN1bHQsIHdoZW4gdGhlIFBDSSBSQyB3cml0ZXMgdG8g dGhlIEJBUiByZWdpb24sIGl0IHRyaWdnZXJzCj4gPiA+ID4gYW4gSVJRIGF0IHRoZSBFUC4gVGhp cyBpbXBsZW1lbnRhdGlvbiBzZXJ2ZXMgYXMgYSBjb21tb24gbWV0aG9kIGZvciBhbGwgZW5kcG9p bnQKPiA+ID4gPiBmdW5jdGlvbiBkcml2ZXJzLgo+ID4gPiA+IAo+ID4gPiA+IEhvd2V2ZXIsIGl0 IGN1cnJlbnRseSBzdXBwb3J0cyBvbmx5IG9uZSBFUCBwaHlzaWNhbCBmdW5jdGlvbiBkdWUgdG8g bGltaXRhdGlvbnMKPiA+ID4gPiBpbiBBUk0gTVNJL0lNUyByZWFkaW5lc3MuCj4gPiA+ID4gCj4g PiA+IAo+ID4gPiBJJ3ZlIHByb3ZpZGVkIGdlbmVyaWMgY29tbWVudHMgYmVsb3csIGJ1dCBJIHdp bGwgZG8gb25lIG1vcmUgdGhvcm91Z2ggcmV2aWV3Cj4gPiA+IGFmdGVyIHNlZWluZyBlcGYtdGVz dCBkcml2ZXIgcGF0Y2guCj4gPiA+IAo+ID4gPiA+IFNpZ25lZC1vZmYtYnk6IEZyYW5rIExpIDxG cmFuay5MaUBueHAuY29tPgo+ID4gPiA+IC0tLQo+ID4gPiA+ICBkcml2ZXJzL3BjaS9lbmRwb2lu dC9wY2ktZXBmLWNvcmUuYyB8IDEwOSArKysrKysrKysrKysrKysrKysrKysrKysrKysrCj4gPiA+ ID4gIGluY2x1ZGUvbGludXgvcGNpLWVwZi5oICAgICAgICAgICAgIHwgIDE2ICsrKysKPiA+ID4g PiAgMiBmaWxlcyBjaGFuZ2VkLCAxMjUgaW5zZXJ0aW9ucygrKQo+ID4gPiA+IAo+ID4gPiA+IGRp ZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9lbmRwb2ludC9wY2ktZXBmLWNvcmUuYyBiL2RyaXZlcnMv cGNpL2VuZHBvaW50L3BjaS1lcGYtY29yZS5jCj4gPiA+ID4gaW5kZXggMzU1YTZmNTZmY2VhLi45 NGFjODJiZjg0YzUgMTAwNjQ0Cj4gPiA+ID4gLS0tIGEvZHJpdmVycy9wY2kvZW5kcG9pbnQvcGNp LWVwZi1jb3JlLmMKPiA+ID4gPiArKysgYi9kcml2ZXJzL3BjaS9lbmRwb2ludC9wY2ktZXBmLWNv cmUuYwo+ID4gPiA+IEBAIC02LDEwICs2LDEyIEBACj4gPiA+ID4gICAqIEF1dGhvcjogS2lzaG9u IFZpamF5IEFicmFoYW0gSSA8a2lzaG9uQHRpLmNvbT4KPiA+ID4gPiAgICovCj4gPiA+ID4gIAo+ ID4gPiA+ICsjaW5jbHVkZSA8bGludXgvaXJxcmV0dXJuLmg+Cj4gPiA+IAo+ID4gPiBXaHkgaXMg dGhpcyBuZWVkZWQ/Cj4gPiA+IAo+ID4gPiA+ICAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Cj4g PiA+ID4gICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgo+ID4gPiA+ICAjaW5jbHVkZSA8 bGludXgvc2xhYi5oPgo+ID4gPiA+ICAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Cj4gPiA+ID4g KyNpbmNsdWRlIDxsaW51eC9tc2kuaD4KPiA+ID4gPiAgCj4gPiA+ID4gICNpbmNsdWRlIDxsaW51 eC9wY2ktZXBjLmg+Cj4gPiA+ID4gICNpbmNsdWRlIDxsaW51eC9wY2ktZXBmLmg+Cj4gPiA+ID4g QEAgLTMwMCw2ICszMDIsMTEzIEBAIHZvaWQgKnBjaV9lcGZfYWxsb2Nfc3BhY2Uoc3RydWN0IHBj aV9lcGYgKmVwZiwgc2l6ZV90IHNpemUsIGVudW0gcGNpX2Jhcm5vIGJhciwKPiA+ID4gPiAgfQo+ ID4gPiA+ICBFWFBPUlRfU1lNQk9MX0dQTChwY2lfZXBmX2FsbG9jX3NwYWNlKTsKPiA+ID4gPiAg Cj4gPiA+ID4gK3N0YXRpYyBlbnVtIGlycXJldHVybiBwY2lfZXBmX2ludGVycnVwdF9oYW5kbGVy KGludCBpcnEsIHZvaWQgKmRhdGEpCj4gPiA+IAo+ID4gPiBzdGF0aWMgaXJxcmV0dXJuX3QKPiA+ ID4gCj4gPiA+IHMvcGNpX2VwZl9pbnRlcnJ1cHRfaGFuZGxlci9wY2lfZXBmX2Rvb3JiZWxsX2hh bmRsZXIKPiA+ID4gCj4gPiA+ID4gK3sKPiA+ID4gPiArCXN0cnVjdCBwY2lfZXBmICplcGYgPSBk YXRhOwo+ID4gPiA+ICsKPiA+ID4gPiArCWlmIChlcGYtPmV2ZW50X29wcyAmJiBlcGYtPmV2ZW50 X29wcy0+ZG9vcmJlbGwpCj4gPiA+ID4gKwkJZXBmLT5ldmVudF9vcHMtPmRvb3JiZWxsKGVwZiwg aXJxIC0gZXBmLT52aXJxX2Jhc2UpOwo+ID4gPiA+ICsKPiA+ID4gPiArCXJldHVybiBJUlFfSEFO RExFRDsKPiA+ID4gPiArfQo+ID4gPiA+ICsKPiA+ID4gPiArc3RhdGljIHZvaWQgcGNpX2VwZl93 cml0ZV9tc2lfbXNnKHN0cnVjdCBtc2lfZGVzYyAqZGVzYywgc3RydWN0IG1zaV9tc2cgKm1zZykK PiA+ID4gPiArewo+ID4gPiA+ICsJc3RydWN0IHBjaV9lcGMgKmVwYyA9IGNvbnRhaW5lcl9vZihk ZXNjLT5kZXYsIHN0cnVjdCBwY2lfZXBjLCBkZXYpOwo+ID4gPiA+ICsJc3RydWN0IHBjaV9lcGYg KmVwZjsKPiA+ID4gPiArCj4gPiA+ID4gKwkvKiBUb2RvOiBOZWVkIGNoZWNrIGNvcnJlY3QgZXBm IGlmIG11bHRpIGVwZiBzdXBwb3J0ZWQgKi8KPiA+ID4gPiArCWxpc3RfZm9yX2VhY2hfZW50cnko ZXBmLCAmZXBjLT5wY2lfZXBmLCBsaXN0KSB7Cj4gPiA+ID4gKwkJaWYgKGVwZi0+bXNnICYmIGRl c2MtPm1zaV9pbmRleCA8IGVwZi0+bnVtX21zZ3MpCj4gPiA+ID4gKwkJCWVwZi0+bXNnW2Rlc2Mt Pm1zaV9pbmRleF0gPSAqbXNnOwo+ID4gPiA+ICsJfQo+ID4gPiA+ICt9Cj4gPiA+ID4gKwo+ID4g PiA+ICtpbnQgcGNpX2VwZl9hbGxvY19kb29yYmVsbChzdHJ1Y3QgcGNpX2VwZiAqZXBmLCB1MTYg bnVtX21zZ3MpCj4gPiA+ID4gK3sKPiA+ID4gPiArCXN0cnVjdCBpcnFfZG9tYWluICpkb21haW47 Cj4gPiA+ID4gKwlzdHJ1Y3QgcGNpX2VwYyAqZXBjOwo+ID4gPiA+ICsJc3RydWN0IGRldmljZSAq ZGV2Owo+ID4gPiA+ICsJaW50IHZpcnE7Cj4gPiA+ID4gKwlpbnQgcmV0Owo+ID4gPiA+ICsJaW50 IGk7Cj4gPiA+ID4gKwo+ID4gPiA+ICsJZXBjID0gZXBmLT5lcGM7Cj4gPiA+ID4gKwlkZXYgPSAm ZXBjLT5kZXY7Cj4gPiA+IAo+ID4gPiAiZXBjX2RldiIgdG8gbWFrZSBpdCBleHBsaWNpdAo+IAo+ IEFsbCBvdGhlciBwbGFjZSB1c2UgJ2RldicsIEkgdGhpbmsgYmV0dGVyIGtlZXAgdGhlIGNvbnNp c3RlbnQuCj4gCj4gRnJhbmsKPiA+ID4gCj4gPiA+ID4gKwo+ID4gPiA+ICsJLyoKPiA+ID4gPiAr CSAqIEN1cnJlbnQgb25seSBzdXBwb3J0IDEgZnVuY3Rpb24uCj4gPiA+IAo+ID4gPiBXaGF0IGRv ZXMgdGhpcyBtZWFuIGV4YWN0bHk/IEV2ZW4gYSBzaW5nbGUgRVBDIGNhbiBzdXBwb3J0IG11bHRp cGxlIEVQRnMKPiA+ID4gCj4gPiAKPiA+IFBsZWFzZSBpZ25vcmUgYWJvdmUgY29tbWVudC4KPiA+ IAo+ID4gLSBNYW5pCj4gPiAKPiA+ID4gPiArCSAqIFBDSSBJTVMoaW50ZXJydXB0IG1lc3NhZ2Ug c3RvcmUpIEFSTSBzdXBwb3J0IGhhdmUgbm90IGJlZW4KPiA+ID4gPiArCSAqIHJlYWR5IHlldC4K PiA+ID4gCj4gPiA+IE5vIG5lZWQgdG8gbWVudGlvbiBwbGF0Zm9ybSBpcnEgY29udHJvbGxlciBu YW1lLgo+IAo+IHdoYXQncyBtZWFucz8KPiAKCiJQQ0kgSU1TIEFSTSBzdXBwb3J0IiBpcyBub3Qg bmVlZGVkLiBKdXN0IHNheSB0aGF0IG9ubHkgb25lIEVQRiBpcyBzdXBwb3J0ZWQuCgo+ID4gPiAK PiA+ID4gPiArCSAqLwo+ID4gPiA+ICsJaWYgKGVwYy0+ZnVuY3Rpb25fbnVtX21hcCAhPSAxKQo+ ID4gPiAKPiA+ID4gV2h5IGNhbid0IHlvdSB1c2UsIGVwZi0+ZnVuY19ubz8KPiA+ID4gCj4gPiA+ ID4gKwkJcmV0dXJuIC1FT1BOT1RTVVBQOwo+ID4gPiA+ICsKPiA+ID4gPiArCWRvbWFpbiA9IGRl dl9nZXRfbXNpX2RvbWFpbihkZXYtPnBhcmVudCk7Cj4gPiA+ID4gKwlpZiAoIWRvbWFpbikKPiA+ ID4gPiArCQlyZXR1cm4gLUVPUE5UU1VQUDsKPiA+ID4gCj4gPiA+IE5ld2xpbmUKPiA+ID4gCj4g PiA+ID4gKwlkZXZfc2V0X21zaV9kb21haW4oZGV2LCBkb21haW4pOwo+ID4gPiA+ICsKPiA+ID4g PiArCS8qIHVzZSBwYXJlbnQgb2Zfbm9kZSB0byBnZXQgZGV2aWNlIGlkIGluZm9ybWF0aW9uICov Cj4gPiA+ID4gKwlkZXYtPm9mX25vZGUgPSBkZXYtPnBhcmVudC0+b2Zfbm9kZTsKPiA+ID4gPiAr Cj4gPiA+IAo+ID4gPiBXaHkgZG8geW91IG5lZWQgb2Zfbm9kZSBhc3NpZ25tZW50IGluc2lkZSBF UEYgY29yZT8KPiAKPiBHSUMgbmVlZCBpdCB0byBhbGxvY2F0ZSBhIE1TSSBpcnEgdG8gcGxhdGZv cm0gZGV2aWNlcy4KPiBJIHRoaW5rIGl0IG1heSBpbXByb3ZlIGlmIElNUyBzdXBwb3J0Lgo+IAoK Q2FuJ3QgeW91IGFzc2lnbiBpdCBpbiB0aGUgRVBGIGRyaXZlciBpdHNlbGY/IEkgZG8gbm90IHdh bnQgYW55IE9GIHJlZmVyZW5jZSBpbgp0aGUgRVBGIGNvcmUgc2luY2UgaXQgaGFzIG5vIE9GIHN1 cHBvcnQuCgotIE1hbmkKCj4gRnJhbmsKPiAKPiA+ID4gCj4gPiA+ID4gKwllcGYtPm1zZyA9IGtj YWxsb2MobnVtX21zZ3MsIHNpemVvZihzdHJ1Y3QgbXNpX21zZyksIEdGUF9LRVJORUwpOwo+ID4g PiA+ICsJaWYgKCFlcGYtPm1zZykKPiA+ID4gPiArCQlyZXR1cm4gLUVOT01FTTsKPiA+ID4gPiAr Cj4gPiA+ID4gKwllcGYtPm51bV9tc2dzID0gbnVtX21zZ3M7Cj4gPiA+ID4gKwo+ID4gPiAKPiA+ ID4gTW92ZSB0aGlzIHRvIHRoZSBzdGFydCBvZiB0aGUgZnVuY3Rpb24sIGFmdGVyIGNoZWNrcy4K PiA+ID4gCj4gPiA+ID4gKwlyZXQgPSBwbGF0Zm9ybV9tc2lfZG9tYWluX2FsbG9jX2lycXMoZGV2 LCBudW1fbXNncywgcGNpX2VwZl93cml0ZV9tc2lfbXNnKTsKPiA+ID4gPiArCWlmIChyZXQpIHsK PiA+ID4gPiArCQlkZXZfZXJyKGRldiwgIkNhbid0IGFsbG9jYXRlIE1TSSBmcm9tIHN5c3RlbSBN U0kgY29udHJvbGxlclxuIik7Cj4gPiA+IAo+ID4gPiAiRmFpbGVkIHRvIGFsbG9jYXRlIE1TSSIK PiA+ID4gCj4gPiA+ID4gKwkJZ290byBlcnJfbWVtOwo+ID4gPiAKPiA+ID4gZXJyX2ZyZWVfbWVt Cj4gPiA+IAo+ID4gPiA+ICsJfQo+ID4gPiA+ICsKPiA+ID4gPiArCWZvciAoaSA9IDA7IGkgPCBu dW1fbXNnczsgaSsrKSB7Cj4gPiA+ID4gKwkJdmlycSA9IG1zaV9nZXRfdmlycShkZXYsIGkpOwo+ ID4gPiA+ICsJCWlmIChpID09IDApCj4gPiA+ID4gKwkJCWVwZi0+dmlycV9iYXNlID0gdmlycTsK PiA+ID4gPiArCj4gPiA+ID4gKwkJcmV0ID0gcmVxdWVzdF9pcnEodmlycSwgcGNpX2VwZl9pbnRl cnJ1cHRfaGFuZGxlciwgMCwKPiA+ID4gPiArCQkJCSAgInBjaS1lcGYtZG9vcmJlbGwiLCBlcGYp Owo+ID4gPiAKPiA+ID4gSVJRIG5hbWUgc2hvdWxkIGhhdmUgYW4gaW5kZXgsIG90aGVyd2lzZSBh bGwgb2YgdGhlbSB3aWxsIGhhdmUgdGhlIHNhbWUgbmFtZS4KPiA+ID4gCj4gPiA+ID4gKwo+ID4g PiA+ICsJCWlmIChyZXQpIHsKPiA+ID4gPiArCQkJZGV2X2VycihkZXYsICJGYWlsdXJlIHJlcXVl c3QgZG9vcmJlbGwgSVJRXG4iKTsKPiA+ID4gCj4gPiA+ICJGYWlsZWQgdG8gcmVxdWVzdCBkb29y YmVsbCIKPiA+ID4gCj4gPiA+ID4gKwkJCWdvdG8gZXJyX2lycTsKPiA+ID4gCj4gPiA+IGVycl9m cmVlX2lycQo+ID4gPiAKPiA+ID4gPiArCQl9Cj4gPiA+ID4gKwl9Cj4gPiA+ID4gKwo+ID4gPiA+ ICsJZXBmLT5udW1fbXNncyA9IG51bV9tc2dzOwo+ID4gPiAKPiA+ID4gTmV3bGluZQo+ID4gPiAK PiA+ID4gPiArCXJldHVybiByZXQ7Cj4gPiA+ID4gKwo+ID4gPiA+ICtlcnJfaXJxOgo+ID4gPiA+ ICsJcGxhdGZvcm1fbXNpX2RvbWFpbl9mcmVlX2lycXMoZGV2KTsKPiA+ID4gPiArZXJyX21lbToK PiA+ID4gPiArCWtmcmVlKGVwZi0+bXNnKTsKPiA+ID4gPiArCWVwZi0+bXNnID0gTlVMTDsKPiA+ ID4gPiArCWVwZi0+bnVtX21zZ3MgPSAwOwo+ID4gPiA+ICsKPiA+ID4gPiArCXJldHVybiByZXQ7 Cj4gPiA+ID4gK30KPiA+ID4gPiArRVhQT1JUX1NZTUJPTF9HUEwocGNpX2VwZl9hbGxvY19kb29y YmVsbCk7Cj4gPiA+ID4gKwo+ID4gPiA+ICt2b2lkIHBjaV9lcGZfZnJlZV9kb29yYmVsbChzdHJ1 Y3QgcGNpX2VwZiAqZXBmKQo+ID4gPiA+ICt7Cj4gPiA+ID4gKwlzdHJ1Y3QgcGNpX2VwYyAqZXBj Owo+ID4gPiA+ICsJaW50IGk7Cj4gPiA+ID4gKwo+ID4gPiA+ICsJZXBjID0gZXBmLT5lcGM7Cj4g PiA+ID4gKwo+ID4gPiA+ICsJZm9yIChpID0gMDsgaSA8IGVwZi0+bnVtX21zZ3M7IGkrKykKPiA+ ID4gPiArCQlmcmVlX2lycShlcGYtPnZpcnFfYmFzZSArIGksIGVwZik7Cj4gPiA+ID4gKwo+ID4g PiA+ICsJcGxhdGZvcm1fbXNpX2RvbWFpbl9mcmVlX2lycXMoJmVwYy0+ZGV2KTsKPiA+ID4gPiAr CWtmcmVlKGVwZi0+bXNnKTsKPiA+ID4gPiArCWVwZi0+bXNnID0gTlVMTDsKPiA+ID4gPiArCWVw Zi0+bnVtX21zZ3MgPSAwOwo+ID4gPiA+ICt9Cj4gPiA+ID4gK0VYUE9SVF9TWU1CT0xfR1BMKHBj aV9lcGZfZnJlZV9kb29yYmVsbCk7Cj4gPiA+ID4gKwo+ID4gPiA+ICBzdGF0aWMgdm9pZCBwY2lf ZXBmX3JlbW92ZV9jZnMoc3RydWN0IHBjaV9lcGZfZHJpdmVyICpkcml2ZXIpCj4gPiA+ID4gIHsK PiA+ID4gPiAgCXN0cnVjdCBjb25maWdfZ3JvdXAgKmdyb3VwLCAqdG1wOwo+ID4gPiA+IGRpZmYg LS1naXQgYS9pbmNsdWRlL2xpbnV4L3BjaS1lcGYuaCBiL2luY2x1ZGUvbGludXgvcGNpLWVwZi5o Cj4gPiA+ID4gaW5kZXggYjg0NDFkYjJmYTUyLi5lMTg3ZTNlZTQ4ZDIgMTAwNjQ0Cj4gPiA+ID4g LS0tIGEvaW5jbHVkZS9saW51eC9wY2ktZXBmLmgKPiA+ID4gPiArKysgYi9pbmNsdWRlL2xpbnV4 L3BjaS1lcGYuaAo+ID4gPiA+IEBAIC03NSw2ICs3NSw3IEBAIHN0cnVjdCBwY2lfZXBmX29wcyB7 Cj4gPiA+ID4gIHN0cnVjdCBwY2lfZXBjX2V2ZW50X29wcyB7Cj4gPiA+ID4gIAlpbnQgKCpjb3Jl X2luaXQpKHN0cnVjdCBwY2lfZXBmICplcGYpOwo+ID4gPiA+ICAJaW50ICgqbGlua191cCkoc3Ry dWN0IHBjaV9lcGYgKmVwZik7Cj4gPiA+ID4gKwlpbnQgKCpkb29yYmVsbCkoc3RydWN0IHBjaV9l cGYgKmVwZiwgaW50IGluZGV4KTsKPiA+ID4gPiAgfTsKPiA+ID4gPiAgCj4gPiA+ID4gIC8qKgo+ ID4gPiA+IEBAIC0xNzMsNiArMTc0LDkgQEAgc3RydWN0IHBjaV9lcGYgewo+ID4gPiA+ICAJdW5z aWduZWQgbG9uZwkJdmZ1bmN0aW9uX251bV9tYXA7Cj4gPiA+ID4gIAlzdHJ1Y3QgbGlzdF9oZWFk CXBjaV92ZXBmOwo+ID4gPiA+ICAJY29uc3Qgc3RydWN0IHBjaV9lcGNfZXZlbnRfb3BzICpldmVu dF9vcHM7Cj4gPiA+ID4gKwlzdHJ1Y3QgbXNpX21zZyAqbXNnOwo+ID4gPiA+ICsJdTE2IG51bV9t c2dzOwo+ID4gPiA+ICsJaW50IHZpcnFfYmFzZTsKPiA+ID4gPiAgfTsKPiA+ID4gPiAgCj4gPiA+ ID4gIC8qKgo+ID4gPiA+IEBAIC0yMTYsNCArMjIwLDE2IEBAIGludCBwY2lfZXBmX2JpbmQoc3Ry dWN0IHBjaV9lcGYgKmVwZik7Cj4gPiA+ID4gIHZvaWQgcGNpX2VwZl91bmJpbmQoc3RydWN0IHBj aV9lcGYgKmVwZik7Cj4gPiA+ID4gIGludCBwY2lfZXBmX2FkZF92ZXBmKHN0cnVjdCBwY2lfZXBm ICplcGZfcGYsIHN0cnVjdCBwY2lfZXBmICplcGZfdmYpOwo+ID4gPiA+ICB2b2lkIHBjaV9lcGZf cmVtb3ZlX3ZlcGYoc3RydWN0IHBjaV9lcGYgKmVwZl9wZiwgc3RydWN0IHBjaV9lcGYgKmVwZl92 Zik7Cj4gPiA+ID4gK2ludCBwY2lfZXBmX2FsbG9jX2Rvb3JiZWxsKHN0cnVjdCBwY2lfZXBmICpl cGYsIHUxNiBudW1zKTsKPiA+ID4gPiArdm9pZCBwY2lfZXBmX2ZyZWVfZG9vcmJlbGwoc3RydWN0 IHBjaV9lcGYgKmVwZik7Cj4gPiA+ID4gKwo+ID4gPiA+ICtzdGF0aWMgaW5saW5lIHN0cnVjdCBt c2lfbXNnICplcGZfZ2V0X21zZyhzdHJ1Y3QgcGNpX2VwZiAqZXBmKQo+ID4gPiA+ICt7Cj4gPiA+ ID4gKwlyZXR1cm4gZXBmLT5tc2c7Cj4gPiA+ID4gK30KPiA+ID4gPiArCj4gPiA+ID4gK3N0YXRp YyBpbmxpbmUgdTE2IGVwZl9nZXRfbXNnX251bShzdHJ1Y3QgcGNpX2VwZiAqZXBmKQo+ID4gPiA+ ICt7Cj4gPiA+ID4gKwlyZXR1cm4gZXBmLT5udW1fbXNnczsKPiA+ID4gPiArfQo+ID4gPiAKPiA+ ID4gSSBkb24ndCBzZWUgYSBuZWVkIGZvciB0aGVzZSB0d28gZnVuY3Rpb25zIGFzIHRoZXkgYXJl IGRvaW5nIGp1c3QgZGVyZWZlcmVuY2VzLgo+ID4gPiAKPiA+ID4gLSBNYW5pCj4gPiA+IAo+ID4g PiA+ICAjZW5kaWYgLyogX19MSU5VWF9QQ0lfRVBGX0ggKi8KPiA+ID4gPiAtLSAKPiA+ID4gPiAy LjM0LjEKPiA+ID4gPiAKPiA+ID4gCj4gPiA+IC0tIAo+ID4gPiDgrq7grqPgrr/grrXgrqPgr43g rqPgrqngr40g4K6a4K6k4K6+4K6a4K6/4K614K6u4K+NCj4gPiAKPiA+IC0tIAo+ID4g4K6u4K6j 4K6/4K614K6j4K+N4K6j4K6p4K+NIOCumuCupOCuvuCumuCuv+CuteCuruCvjQoKLS0gCuCuruCu o+Cuv+CuteCuo+CvjeCuo+CuqeCvjSDgrprgrqTgrr7grprgrr/grrXgrq7gr40KCl9fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmxpbnV4LWFybS1rZXJuZWwg bWFpbGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8v bGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFybS1rZXJuZWwK