From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2F3A639A05E; Mon, 25 May 2026 08:03:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779696225; cv=none; b=h0KJDoVX5lvvrOJIkLhTtOR0/ddQe4p5uHP9b5owthQGzHqBzYh47lirL9mmh9Bu6c/1auToT6rgl9HnOoSVQsXXnL3FVEhtZ9HLtQZ34m47GhmGKujSQnnHNfEW6xSb1Ck0iT1CNjHmvJDsBYUVIr9TP3T1sZ/tEpKyB0wenZU= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779696225; c=relaxed/simple; bh=PGW33jkG0ytHAOM4/u8MBm8PHU5LhOmdvbWEn91/8h8=; h=Date:From:To:Cc:Subject:Message-ID:References:MIME-Version: Content-Type:Content-Disposition:In-Reply-To; b=JZ4ZXU+9N/J0n2OUSiEYl/6fhUloh4T/inSDJU3NXIfQjVK3WNz1S1Lnwz6f4hvbouuaBScheeRFpKcWf2bVbpFlSHb2JDfJdbu4497Y16/Qf5xyKqpZd4YspN1m2SywBrt1p3qmR3bPxHrVARnJCfrgQKtMVnupfPx/+AzB8zI= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=QLNaWFV4; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="QLNaWFV4" Received: by smtp.kernel.org (Postfix) with ESMTPSA id EC6CE1F000E9; Mon, 25 May 2026 08:03:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1779696223; bh=BOrC5Jdt7tSQ1mek0vqBg6Eje/kEfHxLXhl4Whd7avw=; h=Date:From:To:Cc:Subject:References:In-Reply-To; b=QLNaWFV4gesWuUkek2lAl7ecqv45jOPfPIJlweBVXD6Xa90bJxUoz/8+H5gdW1V7X fuWL27jJHpg5xqJMucJKgk9KA/arqMamCEm6wFWXimsGoDAHUMBQb/5jbfaoebgfUD OiBQcj2H3ME13Tk4LkFNpCTzD5ZJMNY0aUd8/+BMhslPuinYXQg6SpLoiouxETEJYk FQ8SnV8TAuOlX9JM7czLaflnGjteke2Lru4Y6Hrdt1w04NuXaD+Z9uM4sM9/+GmsMX wdBEiNVlcwXzwO+K1mGx3A7no01o9aveV5jTKUCy/oXgIW2YsuBAXeulkubFsTHd3A j5x/vAafwzBoQ== Date: Mon, 25 May 2026 10:03:32 +0200 From: Lorenzo Pieralisi To: "Rafael J. Wysocki" Cc: Len Brown , Sunil V L , Marc Zyngier , Thomas Gleixner , Huacai Chen , Anup Patel , Hanjun Guo , Sudeep Holla , Catalin Marinas , Will Deacon , linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org, linux-acpi@vger.kernel.org, linux-arm-kernel@lists.infradead.org, loongarch@lists.linux.dev Subject: Re: [PATCH 1/2] drivers/acpi: Move RISC-V interrupt controllers autodep to ACPI IRQ code Message-ID: References: <20260505-gic-v5-acpi-iwb-probe-deferral-v1-0-b37b85998362@kernel.org> <20260505-gic-v5-acpi-iwb-probe-deferral-v1-1-b37b85998362@kernel.org> Precedence: bulk X-Mailing-List: linux-acpi@vger.kernel.org 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 Fri, May 22, 2026 at 07:45:27PM +0200, Rafael J. Wysocki wrote: > On Tue, May 5, 2026 at 10:48 AM Lorenzo Pieralisi wrote: > > > > RISC-V implements arch code to detect probe dependencies for devices and > > the interrupt controller the devices GSIs are routed to. > > > > The code itself is arch agnostic apart from an arch specific helper > > function required to retrieve the acpi_handle of the interrupt controller > > that manages the device GSI interrupt. > > > > In order to enable IRQ probe dependencies detection on other > > architectures, move RISC-V IRQ probe dependency detection code to > > generic ACPI IRQ code. > > > > RISC-V IRQ code detecting IRQ probe dependency has some limitations/latent > > bugs: > > > > - riscv_acpi_irq_get_dep() would force the loop in > > riscv_acpi_add_irq_dep() to stop at the first IRQ index that does not > > map to an interrupt controller handle (missing some possible > > dependencies) > > - riscv_acpi_add_prt_dep() does not validate acpi_get_handle() output > > - riscv_acpi_add_prt_dep() logic to handle memory allocation failure is > > forcing the loop to continue on the same PRT entry > > > > Fix the above limitations along with the code move. > > I'd rather do the cleanup first, possibly in multiple steps, and then > move the code separately. > > As it stands, it's quite hard to figure out what's going on and why. Yes, shortcuts are never a good idea. I will do. Thanks, Lorenzo > > Allow interrupt controller drivers to register an arch specific > > function to determine the acpi_handle for a specific GSI number to use > > the mechanism if needed by the respective interrupt controller drivers. > > > > Signed-off-by: Lorenzo Pieralisi > > Cc: Huacai Chen > > Cc: Thomas Gleixner > > Cc: Anup Patel > > Cc: "Rafael J. Wysocki" > > Cc: Sunil V L > > Cc: Marc Zyngier > > --- > > arch/riscv/include/asm/acpi.h | 1 + > > drivers/acpi/irq.c | 172 +++++++++++++++++++++++++++++++++++- > > drivers/acpi/riscv/irq.c | 141 +---------------------------- > > drivers/irqchip/irq-gic-v3.c | 2 +- > > drivers/irqchip/irq-gic-v5.c | 2 +- > > drivers/irqchip/irq-gic.c | 2 +- > > drivers/irqchip/irq-loongarch-cpu.c | 2 +- > > drivers/irqchip/irq-riscv-intc.c | 3 +- > > include/linux/acpi.h | 5 +- > > 9 files changed, 181 insertions(+), 149 deletions(-) > > > > diff --git a/arch/riscv/include/asm/acpi.h b/arch/riscv/include/asm/acpi.h > > index 26ab37c171bc..f598520ac903 100644 > > --- a/arch/riscv/include/asm/acpi.h > > +++ b/arch/riscv/include/asm/acpi.h > > @@ -67,6 +67,7 @@ int acpi_get_riscv_isa(struct acpi_table_header *table, > > > > void acpi_get_cbo_block_size(struct acpi_table_header *table, u32 *cbom_size, > > u32 *cboz_size, u32 *cbop_size); > > +acpi_handle acpi_get_riscv_gsi_handle(u32 gsi); > > #else > > static inline void acpi_init_rintc_map(void) { } > > static inline struct acpi_madt_rintc *acpi_cpu_get_madt_rintc(int cpu) > > diff --git a/drivers/acpi/irq.c b/drivers/acpi/irq.c > > index d1595156c86a..e4293458bf61 100644 > > --- a/drivers/acpi/irq.c > > +++ b/drivers/acpi/irq.c > > @@ -13,6 +13,7 @@ > > enum acpi_irq_model_id acpi_irq_model; > > > > static acpi_gsi_domain_disp_fn acpi_get_gsi_domain_id; > > +static acpi_gsi_handle_disp_fn acpi_get_gsi_handle; > > static u32 (*acpi_gsi_to_irq_fallback)(u32 gsi); > > > > /** > > @@ -321,15 +322,19 @@ const struct cpumask *acpi_irq_get_affinity(acpi_handle handle, > > > > /** > > * acpi_set_irq_model - Setup the GSI irqdomain information > > - * @model: the value assigned to acpi_irq_model > > - * @fn: a dispatcher function that will return the domain fwnode > > - * for a given GSI > > + * @model: the value assigned to acpi_irq_model > > + * @fn: a dispatcher function that will return the domain fwnode > > + * for a given GSI > > + * @gsi_dep_fn: a function to retrieve the acpi_handle a GSI interrupt is > > + * dependent on > > + * > > */ > > void __init acpi_set_irq_model(enum acpi_irq_model_id model, > > - acpi_gsi_domain_disp_fn fn) > > + acpi_gsi_domain_disp_fn fn, acpi_gsi_handle_disp_fn gsi_dep_fn) > > { > > acpi_irq_model = model; > > acpi_get_gsi_domain_id = fn; > > + acpi_get_gsi_handle = gsi_dep_fn; > > } > > > > /* > > @@ -385,3 +390,162 @@ struct irq_domain *acpi_irq_create_hierarchy(unsigned int flags, > > host_data); > > } > > EXPORT_SYMBOL_GPL(acpi_irq_create_hierarchy); > > + > > +struct acpi_irq_dep_ctx { > > + int rc; > > + unsigned int index; > > + acpi_handle handle; > > +}; > > + > > +static acpi_status acpi_irq_get_parent(struct acpi_resource *ares, void *context) > > +{ > > + struct acpi_irq_dep_ctx *ctx = context; > > + struct acpi_resource_irq *irq; > > + struct acpi_resource_extended_irq *eirq; > > + > > + switch (ares->type) { > > + case ACPI_RESOURCE_TYPE_IRQ: > > + irq = &ares->data.irq; > > + if (ctx->index >= irq->interrupt_count) { > > + ctx->index -= irq->interrupt_count; > > + return AE_OK; > > + } > > + ctx->handle = acpi_get_gsi_handle(irq->interrupts[ctx->index]); > > + ctx->rc = 0; > > + return AE_CTRL_TERMINATE; > > + case ACPI_RESOURCE_TYPE_EXTENDED_IRQ: > > + eirq = &ares->data.extended_irq; > > + if (eirq->producer_consumer == ACPI_PRODUCER) > > + return AE_OK; > > + > > + if (ctx->index >= eirq->interrupt_count) { > > + ctx->index -= eirq->interrupt_count; > > + return AE_OK; > > + } > > + > > + /* Support GSIs only */ > > + if (eirq->resource_source.string_length) > > + return AE_OK; > > + > > + ctx->handle = acpi_get_gsi_handle(eirq->interrupts[ctx->index]); > > + ctx->rc = 0; > > + return AE_CTRL_TERMINATE; > > + } > > + > > + return AE_OK; > > +} > > + > > +static int acpi_irq_get_dep(acpi_handle handle, unsigned int index, acpi_handle *gsi_handle) > > +{ > > + struct acpi_irq_dep_ctx ctx = {-EINVAL, index, NULL}; > > + > > + if (!gsi_handle) > > + return -EINVAL; > > + > > + acpi_walk_resources(handle, METHOD_NAME__CRS, acpi_irq_get_parent, &ctx); > > + *gsi_handle = ctx.handle; > > + > > + return ctx.rc; > > +} > > + > > +static bool acpi_prt_entry_valid(void *prt_entry) > > +{ > > + struct acpi_pci_routing_table *entry = prt_entry; > > + > > + return entry && entry->length > 0; > > +} > > + > > +static void *acpi_prt_next_entry(void *prt_entry) > > +{ > > + struct acpi_pci_routing_table *entry = prt_entry; > > + > > + return prt_entry + entry->length; > > +} > > + > > +static u32 acpi_add_prt_dep(acpi_handle handle) > > +{ > > + struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; > > + struct acpi_pci_routing_table *entry; > > + struct acpi_handle_list dep_devices; > > + acpi_handle gsi_handle; > > + acpi_handle link_handle; > > + acpi_status status; > > + u32 count = 0; > > + > > + status = acpi_get_irq_routing_table(handle, &buffer); > > + if (ACPI_FAILURE(status)) { > > + acpi_handle_err(handle, "failed to get IRQ routing table\n"); > > + kfree(buffer.pointer); > > + return 0; > > + } > > + > > + entry = buffer.pointer; > > + for (; acpi_prt_entry_valid(entry); entry = acpi_prt_next_entry(entry)) { > > + if (entry->source[0]) { > > + status = acpi_get_handle(handle, entry->source, &link_handle); > > + if (ACPI_FAILURE(status)) > > + continue; > > + dep_devices.count = 1; > > + dep_devices.handles = kcalloc(1, sizeof(*dep_devices.handles), GFP_KERNEL); > > + if (!dep_devices.handles) { > > + acpi_handle_err(handle, "failed to allocate memory\n"); > > + continue; > > + } > > + > > + dep_devices.handles[0] = link_handle; > > + count += acpi_scan_add_dep(handle, &dep_devices); > > + } else { > > + gsi_handle = acpi_get_gsi_handle(entry->source_index); > > + if (!gsi_handle) > > + continue; > > + dep_devices.count = 1; > > + dep_devices.handles = kcalloc(1, sizeof(*dep_devices.handles), GFP_KERNEL); > > + if (!dep_devices.handles) { > > + acpi_handle_err(handle, "failed to allocate memory\n"); > > + continue; > > + } > > + > > + dep_devices.handles[0] = gsi_handle; > > + count += acpi_scan_add_dep(handle, &dep_devices); > > + } > > + } > > + > > + kfree(buffer.pointer); > > + return count; > > +} > > + > > +static u32 acpi_add_irq_dep(acpi_handle handle) > > +{ > > + struct acpi_handle_list dep_devices; > > + acpi_handle gsi_handle; > > + u32 count = 0; > > + int i; > > + > > + for (i = 0; !acpi_irq_get_dep(handle, i, &gsi_handle); i++) { > > + if (!gsi_handle) > > + continue; > > + > > + dep_devices.count = 1; > > + dep_devices.handles = kcalloc(1, sizeof(*dep_devices.handles), GFP_KERNEL); > > + if (!dep_devices.handles) { > > + acpi_handle_err(handle, "failed to allocate memory\n"); > > + continue; > > + } > > + > > + dep_devices.handles[0] = gsi_handle; > > + count += acpi_scan_add_dep(handle, &dep_devices); > > + } > > + > > + return count; > > +} > > + > > +u32 acpi_irq_add_auto_dep(acpi_handle handle) > > +{ > > + if (!acpi_get_gsi_handle) > > + return 0; > > + > > + if (acpi_has_method(handle, "_PRT")) > > + return acpi_add_prt_dep(handle); > > + > > + return acpi_add_irq_dep(handle); > > +} > > diff --git a/drivers/acpi/riscv/irq.c b/drivers/acpi/riscv/irq.c > > index 9b88d0993e88..da2c42e0ebfd 100644 > > --- a/drivers/acpi/riscv/irq.c > > +++ b/drivers/acpi/riscv/irq.c > > @@ -23,12 +23,6 @@ struct riscv_ext_intc_list { > > struct list_head list; > > }; > > > > -struct acpi_irq_dep_ctx { > > - int rc; > > - unsigned int index; > > - acpi_handle handle; > > -}; > > - > > LIST_HEAD(ext_intc_list); > > > > static int irqchip_cmp_func(const void *in0, const void *in1) > > @@ -254,7 +248,7 @@ void __init riscv_acpi_init_gsi_mapping(void) > > acpi_get_devices("RSCV0006", riscv_acpi_create_gsi_map_smsi, NULL, NULL); > > } > > > > -static acpi_handle riscv_acpi_get_gsi_handle(u32 gsi) > > +acpi_handle acpi_get_riscv_gsi_handle(u32 gsi) > > { > > struct riscv_ext_intc_list *ext_intc_element; > > struct list_head *i; > > @@ -269,138 +263,7 @@ static acpi_handle riscv_acpi_get_gsi_handle(u32 gsi) > > return NULL; > > } > > > > -static acpi_status riscv_acpi_irq_get_parent(struct acpi_resource *ares, void *context) > > -{ > > - struct acpi_irq_dep_ctx *ctx = context; > > - struct acpi_resource_irq *irq; > > - struct acpi_resource_extended_irq *eirq; > > - > > - switch (ares->type) { > > - case ACPI_RESOURCE_TYPE_IRQ: > > - irq = &ares->data.irq; > > - if (ctx->index >= irq->interrupt_count) { > > - ctx->index -= irq->interrupt_count; > > - return AE_OK; > > - } > > - ctx->handle = riscv_acpi_get_gsi_handle(irq->interrupts[ctx->index]); > > - return AE_CTRL_TERMINATE; > > - case ACPI_RESOURCE_TYPE_EXTENDED_IRQ: > > - eirq = &ares->data.extended_irq; > > - if (eirq->producer_consumer == ACPI_PRODUCER) > > - return AE_OK; > > - > > - if (ctx->index >= eirq->interrupt_count) { > > - ctx->index -= eirq->interrupt_count; > > - return AE_OK; > > - } > > - > > - /* Support GSIs only */ > > - if (eirq->resource_source.string_length) > > - return AE_OK; > > - > > - ctx->handle = riscv_acpi_get_gsi_handle(eirq->interrupts[ctx->index]); > > - return AE_CTRL_TERMINATE; > > - } > > - > > - return AE_OK; > > -} > > - > > -static int riscv_acpi_irq_get_dep(acpi_handle handle, unsigned int index, acpi_handle *gsi_handle) > > -{ > > - struct acpi_irq_dep_ctx ctx = {-EINVAL, index, NULL}; > > - > > - if (!gsi_handle) > > - return 0; > > - > > - acpi_walk_resources(handle, METHOD_NAME__CRS, riscv_acpi_irq_get_parent, &ctx); > > - *gsi_handle = ctx.handle; > > - if (*gsi_handle) > > - return 1; > > - > > - return 0; > > -} > > - > > -static u32 riscv_acpi_add_prt_dep(acpi_handle handle) > > -{ > > - struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; > > - struct acpi_pci_routing_table *entry; > > - struct acpi_handle_list dep_devices; > > - acpi_handle gsi_handle; > > - acpi_handle link_handle; > > - acpi_status status; > > - u32 count = 0; > > - > > - status = acpi_get_irq_routing_table(handle, &buffer); > > - if (ACPI_FAILURE(status)) { > > - acpi_handle_err(handle, "failed to get IRQ routing table\n"); > > - kfree(buffer.pointer); > > - return 0; > > - } > > - > > - entry = buffer.pointer; > > - while (entry && (entry->length > 0)) { > > - if (entry->source[0]) { > > - acpi_get_handle(handle, entry->source, &link_handle); > > - dep_devices.count = 1; > > - dep_devices.handles = kzalloc_objs(*dep_devices.handles, > > - 1); > > - if (!dep_devices.handles) { > > - acpi_handle_err(handle, "failed to allocate memory\n"); > > - continue; > > - } > > - > > - dep_devices.handles[0] = link_handle; > > - count += acpi_scan_add_dep(handle, &dep_devices); > > - } else { > > - gsi_handle = riscv_acpi_get_gsi_handle(entry->source_index); > > - dep_devices.count = 1; > > - dep_devices.handles = kzalloc_objs(*dep_devices.handles, > > - 1); > > - if (!dep_devices.handles) { > > - acpi_handle_err(handle, "failed to allocate memory\n"); > > - continue; > > - } > > - > > - dep_devices.handles[0] = gsi_handle; > > - count += acpi_scan_add_dep(handle, &dep_devices); > > - } > > - > > - entry = (struct acpi_pci_routing_table *) > > - ((unsigned long)entry + entry->length); > > - } > > - > > - kfree(buffer.pointer); > > - return count; > > -} > > - > > -static u32 riscv_acpi_add_irq_dep(acpi_handle handle) > > -{ > > - struct acpi_handle_list dep_devices; > > - acpi_handle gsi_handle; > > - u32 count = 0; > > - int i; > > - > > - for (i = 0; > > - riscv_acpi_irq_get_dep(handle, i, &gsi_handle); > > - i++) { > > - dep_devices.count = 1; > > - dep_devices.handles = kzalloc_objs(*dep_devices.handles, 1); > > - if (!dep_devices.handles) { > > - acpi_handle_err(handle, "failed to allocate memory\n"); > > - continue; > > - } > > - > > - dep_devices.handles[0] = gsi_handle; > > - count += acpi_scan_add_dep(handle, &dep_devices); > > - } > > - > > - return count; > > -} > > - > > u32 arch_acpi_add_auto_dep(acpi_handle handle) > > { > > - if (acpi_has_method(handle, "_PRT")) > > - return riscv_acpi_add_prt_dep(handle); > > - > > - return riscv_acpi_add_irq_dep(handle); > > + return acpi_irq_add_auto_dep(handle); > > } > > diff --git a/drivers/irqchip/irq-gic-v3.c b/drivers/irqchip/irq-gic-v3.c > > index 99444a1b2ffa..2673954d4577 100644 > > --- a/drivers/irqchip/irq-gic-v3.c > > +++ b/drivers/irqchip/irq-gic-v3.c > > @@ -2588,7 +2588,7 @@ gic_acpi_init(union acpi_subtable_headers *header, const unsigned long end) > > if (err) > > goto out_fwhandle_free; > > > > - acpi_set_irq_model(ACPI_IRQ_MODEL_GIC, gic_v3_get_gsi_domain_id); > > + acpi_set_irq_model(ACPI_IRQ_MODEL_GIC, gic_v3_get_gsi_domain_id, NULL); > > > > if (static_branch_likely(&supports_deactivate_key)) > > gic_acpi_setup_kvm_info(); > > diff --git a/drivers/irqchip/irq-gic-v5.c b/drivers/irqchip/irq-gic-v5.c > > index 6b0903be8ebf..03cc2830b260 100644 > > --- a/drivers/irqchip/irq-gic-v5.c > > +++ b/drivers/irqchip/irq-gic-v5.c > > @@ -1242,7 +1242,7 @@ static int __init gic_acpi_init(union acpi_subtable_headers *header, const unsig > > if (ret) > > goto out_irs; > > > > - acpi_set_irq_model(ACPI_IRQ_MODEL_GIC_V5, gic_v5_get_gsi_domain_id); > > + acpi_set_irq_model(ACPI_IRQ_MODEL_GIC_V5, gic_v5_get_gsi_domain_id, NULL); > > > > return 0; > > > > diff --git a/drivers/irqchip/irq-gic.c b/drivers/irqchip/irq-gic.c > > index ec70c84e9f91..f6bc29f515fb 100644 > > --- a/drivers/irqchip/irq-gic.c > > +++ b/drivers/irqchip/irq-gic.c > > @@ -1690,7 +1690,7 @@ static int __init gic_v2_acpi_init(union acpi_subtable_headers *header, > > return ret; > > } > > > > - acpi_set_irq_model(ACPI_IRQ_MODEL_GIC, gic_v2_get_gsi_domain_id); > > + acpi_set_irq_model(ACPI_IRQ_MODEL_GIC, gic_v2_get_gsi_domain_id, NULL); > > > > if (IS_ENABLED(CONFIG_ARM_GIC_V2M)) > > gicv2m_init(NULL, gic_data[0].domain); > > diff --git a/drivers/irqchip/irq-loongarch-cpu.c b/drivers/irqchip/irq-loongarch-cpu.c > > index 950bc087e388..84ce24889488 100644 > > --- a/drivers/irqchip/irq-loongarch-cpu.c > > +++ b/drivers/irqchip/irq-loongarch-cpu.c > > @@ -168,7 +168,7 @@ static int __init cpuintc_acpi_init(union acpi_subtable_headers *header, > > panic("Failed to add irqdomain for LoongArch CPU"); > > > > set_handle_irq(&handle_cpu_irq); > > - acpi_set_irq_model(ACPI_IRQ_MODEL_LPIC, lpic_get_gsi_domain_id); > > + acpi_set_irq_model(ACPI_IRQ_MODEL_LPIC, lpic_get_gsi_domain_id, NULL); > > acpi_set_gsi_to_irq_fallback(lpic_gsi_to_irq); > > ret = acpi_cascade_irqdomain_init(); > > > > diff --git a/drivers/irqchip/irq-riscv-intc.c b/drivers/irqchip/irq-riscv-intc.c > > index 84418dbd5a27..0595144116e2 100644 > > --- a/drivers/irqchip/irq-riscv-intc.c > > +++ b/drivers/irqchip/irq-riscv-intc.c > > @@ -384,7 +384,8 @@ static int __init riscv_intc_acpi_init(union acpi_subtable_headers *header, > > if (rc) > > irq_domain_free_fwnode(fn); > > else > > - acpi_set_irq_model(ACPI_IRQ_MODEL_RINTC, riscv_acpi_get_gsi_domain_id); > > + acpi_set_irq_model(ACPI_IRQ_MODEL_RINTC, riscv_acpi_get_gsi_domain_id, > > + acpi_get_riscv_gsi_handle); > > > > return rc; > > } > > diff --git a/include/linux/acpi.h b/include/linux/acpi.h > > index 67effb91fa98..468fc6a54651 100644 > > --- a/include/linux/acpi.h > > +++ b/include/linux/acpi.h > > @@ -360,9 +360,10 @@ int acpi_gsi_to_irq (u32 gsi, unsigned int *irq); > > int acpi_isa_irq_to_gsi (unsigned isa_irq, u32 *gsi); > > > > typedef struct fwnode_handle *(*acpi_gsi_domain_disp_fn)(u32); > > +typedef acpi_handle (*acpi_gsi_handle_disp_fn)(u32); > > > > void acpi_set_irq_model(enum acpi_irq_model_id model, > > - acpi_gsi_domain_disp_fn fn); > > + acpi_gsi_domain_disp_fn fn, acpi_gsi_handle_disp_fn gsi_dep_fn); > > acpi_gsi_domain_disp_fn acpi_get_gsi_dispatcher(void); > > void acpi_set_gsi_to_irq_fallback(u32 (*)(u32)); > > > > @@ -372,6 +373,8 @@ struct irq_domain *acpi_irq_create_hierarchy(unsigned int flags, > > const struct irq_domain_ops *ops, > > void *host_data); > > > > +u32 acpi_irq_add_auto_dep(acpi_handle handle); > > + > > #ifdef CONFIG_X86_IO_APIC > > extern int acpi_get_override_irq(u32 gsi, int *trigger, int *polarity); > > #else > > > > -- > > 2.54.0 > > 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 21C6DCD5BBF for ; Mon, 25 May 2026 08:03:57 +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:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:References: Message-ID:Subject: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=qaDWd6UrbMGIMjLqKPWl+xMvlIOtYJunvSrmyWadL/g=; b=s5Yk+5JKLsgFfk XM2Ox/Ubpem2ldspzoeJ8N1/f6P3YyRDpL1O9N5PJge7zjF/8kCkM/NjeEsZ3NmPGRjKxdnNl8Gjm piTlNmUJdguzAvmLmg4g9qTP5SXfgYPXMPk7rGyaw2gLGW6HECnHAcoU1eXkFpShFhFR/SjGSXO+n hQqBNepJiuQMEmSrfwAaXqe4DKf3dhX69NP8fZwlrh216tmow2rigEov50vJVm3Leybusq1LIO0M8 8HvkQfFhXHJMpUiFyga+lLOfWmx5o3r3Lk0GqHJo248FvH+Fy5xMqNPj3UcFgmG2e5CEt8YUk/tKY TwBBqJY9NHuTJii5u+RA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.99.1 #2 (Red Hat Linux)) id 1wRQHq-0000000GaSD-0rWY; Mon, 25 May 2026 08:03:46 +0000 Received: from tor.source.kernel.org ([2600:3c04:e001:324:0:1991:8:25]) by bombadil.infradead.org with esmtps (Exim 4.99.1 #2 (Red Hat Linux)) id 1wRQHo-0000000GaRq-3oL0; Mon, 25 May 2026 08:03:45 +0000 Received: from smtp.kernel.org (quasi.space.kernel.org [100.103.45.18]) by tor.source.kernel.org (Postfix) with ESMTP id 1842A600FF; Mon, 25 May 2026 08:03:44 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id EC6CE1F000E9; Mon, 25 May 2026 08:03:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1779696223; bh=BOrC5Jdt7tSQ1mek0vqBg6Eje/kEfHxLXhl4Whd7avw=; h=Date:From:To:Cc:Subject:References:In-Reply-To; b=QLNaWFV4gesWuUkek2lAl7ecqv45jOPfPIJlweBVXD6Xa90bJxUoz/8+H5gdW1V7X fuWL27jJHpg5xqJMucJKgk9KA/arqMamCEm6wFWXimsGoDAHUMBQb/5jbfaoebgfUD OiBQcj2H3ME13Tk4LkFNpCTzD5ZJMNY0aUd8/+BMhslPuinYXQg6SpLoiouxETEJYk FQ8SnV8TAuOlX9JM7czLaflnGjteke2Lru4Y6Hrdt1w04NuXaD+Z9uM4sM9/+GmsMX wdBEiNVlcwXzwO+K1mGx3A7no01o9aveV5jTKUCy/oXgIW2YsuBAXeulkubFsTHd3A j5x/vAafwzBoQ== Date: Mon, 25 May 2026 10:03:32 +0200 From: Lorenzo Pieralisi To: "Rafael J. Wysocki" Subject: Re: [PATCH 1/2] drivers/acpi: Move RISC-V interrupt controllers autodep to ACPI IRQ code Message-ID: References: <20260505-gic-v5-acpi-iwb-probe-deferral-v1-0-b37b85998362@kernel.org> <20260505-gic-v5-acpi-iwb-probe-deferral-v1-1-b37b85998362@kernel.org> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: X-BeenThere: linux-riscv@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Catalin Marinas , Marc Zyngier , Huacai Chen , Hanjun Guo , linux-kernel@vger.kernel.org, Sudeep Holla , linux-acpi@vger.kernel.org, Thomas Gleixner , loongarch@lists.linux.dev, Anup Patel , linux-riscv@lists.infradead.org, Will Deacon , linux-arm-kernel@lists.infradead.org, Len Brown Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-riscv" Errors-To: linux-riscv-bounces+linux-riscv=archiver.kernel.org@lists.infradead.org T24gRnJpLCBNYXkgMjIsIDIwMjYgYXQgMDc6NDU6MjdQTSArMDIwMCwgUmFmYWVsIEouIFd5c29j a2kgd3JvdGU6Cj4gT24gVHVlLCBNYXkgNSwgMjAyNiBhdCAxMDo0OOKAr0FNIExvcmVuem8gUGll cmFsaXNpIDxscGllcmFsaXNpQGtlcm5lbC5vcmc+IHdyb3RlOgo+ID4KPiA+IFJJU0MtViBpbXBs ZW1lbnRzIGFyY2ggY29kZSB0byBkZXRlY3QgcHJvYmUgZGVwZW5kZW5jaWVzIGZvciBkZXZpY2Vz IGFuZAo+ID4gdGhlIGludGVycnVwdCBjb250cm9sbGVyIHRoZSBkZXZpY2VzIEdTSXMgYXJlIHJv dXRlZCB0by4KPiA+Cj4gPiBUaGUgY29kZSBpdHNlbGYgaXMgYXJjaCBhZ25vc3RpYyBhcGFydCBm cm9tIGFuIGFyY2ggc3BlY2lmaWMgaGVscGVyCj4gPiBmdW5jdGlvbiByZXF1aXJlZCB0byByZXRy aWV2ZSB0aGUgYWNwaV9oYW5kbGUgb2YgdGhlIGludGVycnVwdCBjb250cm9sbGVyCj4gPiB0aGF0 IG1hbmFnZXMgdGhlIGRldmljZSBHU0kgaW50ZXJydXB0Lgo+ID4KPiA+IEluIG9yZGVyIHRvIGVu YWJsZSBJUlEgcHJvYmUgZGVwZW5kZW5jaWVzIGRldGVjdGlvbiBvbiBvdGhlcgo+ID4gYXJjaGl0 ZWN0dXJlcywgbW92ZSBSSVNDLVYgSVJRIHByb2JlIGRlcGVuZGVuY3kgZGV0ZWN0aW9uIGNvZGUg dG8KPiA+IGdlbmVyaWMgQUNQSSBJUlEgY29kZS4KPiA+Cj4gPiBSSVNDLVYgSVJRIGNvZGUgZGV0 ZWN0aW5nIElSUSBwcm9iZSBkZXBlbmRlbmN5IGhhcyBzb21lIGxpbWl0YXRpb25zL2xhdGVudAo+ ID4gYnVnczoKPiA+Cj4gPiAtIHJpc2N2X2FjcGlfaXJxX2dldF9kZXAoKSB3b3VsZCBmb3JjZSB0 aGUgbG9vcCBpbgo+ID4gICByaXNjdl9hY3BpX2FkZF9pcnFfZGVwKCkgdG8gc3RvcCBhdCB0aGUg Zmlyc3QgSVJRIGluZGV4IHRoYXQgZG9lcyBub3QKPiA+ICAgbWFwIHRvIGFuIGludGVycnVwdCBj b250cm9sbGVyIGhhbmRsZSAobWlzc2luZyBzb21lIHBvc3NpYmxlCj4gPiAgIGRlcGVuZGVuY2ll cykKPiA+IC0gcmlzY3ZfYWNwaV9hZGRfcHJ0X2RlcCgpIGRvZXMgbm90IHZhbGlkYXRlIGFjcGlf Z2V0X2hhbmRsZSgpIG91dHB1dAo+ID4gLSByaXNjdl9hY3BpX2FkZF9wcnRfZGVwKCkgbG9naWMg dG8gaGFuZGxlIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUgaXMKPiA+ICAgZm9yY2luZyB0aGUg bG9vcCB0byBjb250aW51ZSBvbiB0aGUgc2FtZSBQUlQgZW50cnkKPiA+Cj4gPiBGaXggdGhlIGFi b3ZlIGxpbWl0YXRpb25zIGFsb25nIHdpdGggdGhlIGNvZGUgbW92ZS4KPiAKPiBJJ2QgcmF0aGVy IGRvIHRoZSBjbGVhbnVwIGZpcnN0LCBwb3NzaWJseSBpbiBtdWx0aXBsZSBzdGVwcywgYW5kIHRo ZW4KPiBtb3ZlIHRoZSBjb2RlIHNlcGFyYXRlbHkuCj4gCj4gQXMgaXQgc3RhbmRzLCBpdCdzIHF1 aXRlIGhhcmQgdG8gZmlndXJlIG91dCB3aGF0J3MgZ29pbmcgb24gYW5kIHdoeS4KClllcywgc2hv cnRjdXRzIGFyZSBuZXZlciBhIGdvb2QgaWRlYS4gSSB3aWxsIGRvLgoKVGhhbmtzLApMb3Jlbnpv Cgo+ID4gQWxsb3cgaW50ZXJydXB0IGNvbnRyb2xsZXIgZHJpdmVycyB0byByZWdpc3RlciBhbiBh cmNoIHNwZWNpZmljCj4gPiBmdW5jdGlvbiB0byBkZXRlcm1pbmUgdGhlIGFjcGlfaGFuZGxlIGZv ciBhIHNwZWNpZmljIEdTSSBudW1iZXIgdG8gdXNlCj4gPiB0aGUgbWVjaGFuaXNtIGlmIG5lZWRl ZCBieSB0aGUgcmVzcGVjdGl2ZSBpbnRlcnJ1cHQgY29udHJvbGxlciBkcml2ZXJzLgo+ID4KPiA+ IFNpZ25lZC1vZmYtYnk6IExvcmVuem8gUGllcmFsaXNpIDxscGllcmFsaXNpQGtlcm5lbC5vcmc+ Cj4gPiBDYzogSHVhY2FpIENoZW4gPGNoZW5odWFjYWlAa2VybmVsLm9yZz4KPiA+IENjOiBUaG9t YXMgR2xlaXhuZXIgPHRnbHhAa2VybmVsLm9yZz4KPiA+IENjOiBBbnVwIFBhdGVsIDxhbnVwQGJy YWluZmF1bHQub3JnPgo+ID4gQ2M6ICJSYWZhZWwgSi4gV3lzb2NraSIgPHJhZmFlbEBrZXJuZWwu b3JnPgo+ID4gQ2M6IFN1bmlsIFYgTCA8c3VuaWx2bEB2ZW50YW5hbWljcm8uY29tPgo+ID4gQ2M6 IE1hcmMgWnluZ2llciA8bWF6QGtlcm5lbC5vcmc+Cj4gPiAtLS0KPiA+ICBhcmNoL3Jpc2N2L2lu Y2x1ZGUvYXNtL2FjcGkuaCAgICAgICB8ICAgMSArCj4gPiAgZHJpdmVycy9hY3BpL2lycS5jICAg ICAgICAgICAgICAgICAgfCAxNzIgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyst Cj4gPiAgZHJpdmVycy9hY3BpL3Jpc2N2L2lycS5jICAgICAgICAgICAgfCAxNDEgKy0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0KPiA+ICBkcml2ZXJzL2lycWNoaXAvaXJxLWdpYy12My5jICAg ICAgICB8ICAgMiArLQo+ID4gIGRyaXZlcnMvaXJxY2hpcC9pcnEtZ2ljLXY1LmMgICAgICAgIHwg ICAyICstCj4gPiAgZHJpdmVycy9pcnFjaGlwL2lycS1naWMuYyAgICAgICAgICAgfCAgIDIgKy0K PiA+ICBkcml2ZXJzL2lycWNoaXAvaXJxLWxvb25nYXJjaC1jcHUuYyB8ICAgMiArLQo+ID4gIGRy aXZlcnMvaXJxY2hpcC9pcnEtcmlzY3YtaW50Yy5jICAgIHwgICAzICstCj4gPiAgaW5jbHVkZS9s aW51eC9hY3BpLmggICAgICAgICAgICAgICAgfCAgIDUgKy0KPiA+ICA5IGZpbGVzIGNoYW5nZWQs IDE4MSBpbnNlcnRpb25zKCspLCAxNDkgZGVsZXRpb25zKC0pCj4gPgo+ID4gZGlmZiAtLWdpdCBh L2FyY2gvcmlzY3YvaW5jbHVkZS9hc20vYWNwaS5oIGIvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9h Y3BpLmgKPiA+IGluZGV4IDI2YWIzN2MxNzFiYy4uZjU5ODUyMGFjOTAzIDEwMDY0NAo+ID4gLS0t IGEvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9hY3BpLmgKPiA+ICsrKyBiL2FyY2gvcmlzY3YvaW5j bHVkZS9hc20vYWNwaS5oCj4gPiBAQCAtNjcsNiArNjcsNyBAQCBpbnQgYWNwaV9nZXRfcmlzY3Zf aXNhKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqdGFibGUsCj4gPgo+ID4gIHZvaWQgYWNwaV9n ZXRfY2JvX2Jsb2NrX3NpemUoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICp0YWJsZSwgdTMyICpj Ym9tX3NpemUsCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMiAqY2Jvel9zaXpl LCB1MzIgKmNib3Bfc2l6ZSk7Cj4gPiArYWNwaV9oYW5kbGUgYWNwaV9nZXRfcmlzY3ZfZ3NpX2hh bmRsZSh1MzIgZ3NpKTsKPiA+ICAjZWxzZQo+ID4gIHN0YXRpYyBpbmxpbmUgdm9pZCBhY3BpX2lu aXRfcmludGNfbWFwKHZvaWQpIHsgfQo+ID4gIHN0YXRpYyBpbmxpbmUgc3RydWN0IGFjcGlfbWFk dF9yaW50YyAqYWNwaV9jcHVfZ2V0X21hZHRfcmludGMoaW50IGNwdSkKPiA+IGRpZmYgLS1naXQg YS9kcml2ZXJzL2FjcGkvaXJxLmMgYi9kcml2ZXJzL2FjcGkvaXJxLmMKPiA+IGluZGV4IGQxNTk1 MTU2Yzg2YS4uZTQyOTM0NThiZjYxIDEwMDY0NAo+ID4gLS0tIGEvZHJpdmVycy9hY3BpL2lycS5j Cj4gPiArKysgYi9kcml2ZXJzL2FjcGkvaXJxLmMKPiA+IEBAIC0xMyw2ICsxMyw3IEBACj4gPiAg ZW51bSBhY3BpX2lycV9tb2RlbF9pZCBhY3BpX2lycV9tb2RlbDsKPiA+Cj4gPiAgc3RhdGljIGFj cGlfZ3NpX2RvbWFpbl9kaXNwX2ZuIGFjcGlfZ2V0X2dzaV9kb21haW5faWQ7Cj4gPiArc3RhdGlj IGFjcGlfZ3NpX2hhbmRsZV9kaXNwX2ZuIGFjcGlfZ2V0X2dzaV9oYW5kbGU7Cj4gPiAgc3RhdGlj IHUzMiAoKmFjcGlfZ3NpX3RvX2lycV9mYWxsYmFjaykodTMyIGdzaSk7Cj4gPgo+ID4gIC8qKgo+ ID4gQEAgLTMyMSwxNSArMzIyLDE5IEBAIGNvbnN0IHN0cnVjdCBjcHVtYXNrICphY3BpX2lycV9n ZXRfYWZmaW5pdHkoYWNwaV9oYW5kbGUgaGFuZGxlLAo+ID4KPiA+ICAvKioKPiA+ICAgKiBhY3Bp X3NldF9pcnFfbW9kZWwgLSBTZXR1cCB0aGUgR1NJIGlycWRvbWFpbiBpbmZvcm1hdGlvbgo+ID4g LSAqIEBtb2RlbDogdGhlIHZhbHVlIGFzc2lnbmVkIHRvIGFjcGlfaXJxX21vZGVsCj4gPiAtICog QGZuOiBhIGRpc3BhdGNoZXIgZnVuY3Rpb24gdGhhdCB3aWxsIHJldHVybiB0aGUgZG9tYWluIGZ3 bm9kZQo+ID4gLSAqICAgICBmb3IgYSBnaXZlbiBHU0kKPiA+ICsgKiBAbW9kZWw6ICAgICB0aGUg dmFsdWUgYXNzaWduZWQgdG8gYWNwaV9pcnFfbW9kZWwKPiA+ICsgKiBAZm46ICAgICAgICAgICAg ICAgIGEgZGlzcGF0Y2hlciBmdW5jdGlvbiB0aGF0IHdpbGwgcmV0dXJuIHRoZSBkb21haW4gZndu b2RlCj4gPiArICogICAgICAgICAgICAgZm9yIGEgZ2l2ZW4gR1NJCj4gPiArICogQGdzaV9kZXBf Zm46IGEgZnVuY3Rpb24gdG8gcmV0cmlldmUgdGhlIGFjcGlfaGFuZGxlIGEgR1NJIGludGVycnVw dCBpcwo+ID4gKyAqICAgICAgICAgICAgIGRlcGVuZGVudCBvbgo+ID4gKyAqCj4gPiAgICovCj4g PiAgdm9pZCBfX2luaXQgYWNwaV9zZXRfaXJxX21vZGVsKGVudW0gYWNwaV9pcnFfbW9kZWxfaWQg bW9kZWwsCj4gPiAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9nc2lfZG9tYWlu X2Rpc3BfZm4gZm4pCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9nc2lf ZG9tYWluX2Rpc3BfZm4gZm4sIGFjcGlfZ3NpX2hhbmRsZV9kaXNwX2ZuIGdzaV9kZXBfZm4pCj4g PiAgewo+ID4gICAgICAgICBhY3BpX2lycV9tb2RlbCA9IG1vZGVsOwo+ID4gICAgICAgICBhY3Bp X2dldF9nc2lfZG9tYWluX2lkID0gZm47Cj4gPiArICAgICAgIGFjcGlfZ2V0X2dzaV9oYW5kbGUg PSBnc2lfZGVwX2ZuOwo+ID4gIH0KPiA+Cj4gPiAgLyoKPiA+IEBAIC0zODUsMyArMzkwLDE2MiBA QCBzdHJ1Y3QgaXJxX2RvbWFpbiAqYWNwaV9pcnFfY3JlYXRlX2hpZXJhcmNoeSh1bnNpZ25lZCBp bnQgZmxhZ3MsCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg aG9zdF9kYXRhKTsKPiA+ICB9Cj4gPiAgRVhQT1JUX1NZTUJPTF9HUEwoYWNwaV9pcnFfY3JlYXRl X2hpZXJhcmNoeSk7Cj4gPiArCj4gPiArc3RydWN0IGFjcGlfaXJxX2RlcF9jdHggewo+ID4gKyAg ICAgICBpbnQgICAgICAgICAgICAgcmM7Cj4gPiArICAgICAgIHVuc2lnbmVkIGludCAgICBpbmRl eDsKPiA+ICsgICAgICAgYWNwaV9oYW5kbGUgICAgIGhhbmRsZTsKPiA+ICt9Owo+ID4gKwo+ID4g K3N0YXRpYyBhY3BpX3N0YXR1cyBhY3BpX2lycV9nZXRfcGFyZW50KHN0cnVjdCBhY3BpX3Jlc291 cmNlICphcmVzLCB2b2lkICpjb250ZXh0KQo+ID4gK3sKPiA+ICsgICAgICAgc3RydWN0IGFjcGlf aXJxX2RlcF9jdHggKmN0eCA9IGNvbnRleHQ7Cj4gPiArICAgICAgIHN0cnVjdCBhY3BpX3Jlc291 cmNlX2lycSAqaXJxOwo+ID4gKyAgICAgICBzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9leHRlbmRlZF9p cnEgKmVpcnE7Cj4gPiArCj4gPiArICAgICAgIHN3aXRjaCAoYXJlcy0+dHlwZSkgewo+ID4gKyAg ICAgICBjYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9JUlE6Cj4gPiArICAgICAgICAgICAgICAgaXJx ID0gJmFyZXMtPmRhdGEuaXJxOwo+ID4gKyAgICAgICAgICAgICAgIGlmIChjdHgtPmluZGV4ID49 IGlycS0+aW50ZXJydXB0X2NvdW50KSB7Cj4gPiArICAgICAgICAgICAgICAgICAgICAgICBjdHgt PmluZGV4IC09IGlycS0+aW50ZXJydXB0X2NvdW50Owo+ID4gKyAgICAgICAgICAgICAgICAgICAg ICAgcmV0dXJuIEFFX09LOwo+ID4gKyAgICAgICAgICAgICAgIH0KPiA+ICsgICAgICAgICAgICAg ICBjdHgtPmhhbmRsZSA9IGFjcGlfZ2V0X2dzaV9oYW5kbGUoaXJxLT5pbnRlcnJ1cHRzW2N0eC0+ aW5kZXhdKTsKPiA+ICsgICAgICAgICAgICAgICBjdHgtPnJjID0gMDsKPiA+ICsgICAgICAgICAg ICAgICByZXR1cm4gQUVfQ1RSTF9URVJNSU5BVEU7Cj4gPiArICAgICAgIGNhc2UgQUNQSV9SRVNP VVJDRV9UWVBFX0VYVEVOREVEX0lSUToKPiA+ICsgICAgICAgICAgICAgICBlaXJxID0gJmFyZXMt PmRhdGEuZXh0ZW5kZWRfaXJxOwo+ID4gKyAgICAgICAgICAgICAgIGlmIChlaXJxLT5wcm9kdWNl cl9jb25zdW1lciA9PSBBQ1BJX1BST0RVQ0VSKQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAg cmV0dXJuIEFFX09LOwo+ID4gKwo+ID4gKyAgICAgICAgICAgICAgIGlmIChjdHgtPmluZGV4ID49 IGVpcnEtPmludGVycnVwdF9jb3VudCkgewo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgY3R4 LT5pbmRleCAtPSBlaXJxLT5pbnRlcnJ1cHRfY291bnQ7Cj4gPiArICAgICAgICAgICAgICAgICAg ICAgICByZXR1cm4gQUVfT0s7Cj4gPiArICAgICAgICAgICAgICAgfQo+ID4gKwo+ID4gKyAgICAg ICAgICAgICAgIC8qIFN1cHBvcnQgR1NJcyBvbmx5ICovCj4gPiArICAgICAgICAgICAgICAgaWYg KGVpcnEtPnJlc291cmNlX3NvdXJjZS5zdHJpbmdfbGVuZ3RoKQo+ID4gKyAgICAgICAgICAgICAg ICAgICAgICAgcmV0dXJuIEFFX09LOwo+ID4gKwo+ID4gKyAgICAgICAgICAgICAgIGN0eC0+aGFu ZGxlID0gYWNwaV9nZXRfZ3NpX2hhbmRsZShlaXJxLT5pbnRlcnJ1cHRzW2N0eC0+aW5kZXhdKTsK PiA+ICsgICAgICAgICAgICAgICBjdHgtPnJjID0gMDsKPiA+ICsgICAgICAgICAgICAgICByZXR1 cm4gQUVfQ1RSTF9URVJNSU5BVEU7Cj4gPiArICAgICAgIH0KPiA+ICsKPiA+ICsgICAgICAgcmV0 dXJuIEFFX09LOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgaW50IGFjcGlfaXJxX2dldF9kZXAo YWNwaV9oYW5kbGUgaGFuZGxlLCB1bnNpZ25lZCBpbnQgaW5kZXgsIGFjcGlfaGFuZGxlICpnc2lf aGFuZGxlKQo+ID4gK3sKPiA+ICsgICAgICAgc3RydWN0IGFjcGlfaXJxX2RlcF9jdHggY3R4ID0g ey1FSU5WQUwsIGluZGV4LCBOVUxMfTsKPiA+ICsKPiA+ICsgICAgICAgaWYgKCFnc2lfaGFuZGxl KQo+ID4gKyAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwo+ID4gKwo+ID4gKyAgICAgICBh Y3BpX3dhbGtfcmVzb3VyY2VzKGhhbmRsZSwgTUVUSE9EX05BTUVfX0NSUywgYWNwaV9pcnFfZ2V0 X3BhcmVudCwgJmN0eCk7Cj4gPiArICAgICAgICpnc2lfaGFuZGxlID0gY3R4LmhhbmRsZTsKPiA+ ICsKPiA+ICsgICAgICAgcmV0dXJuIGN0eC5yYzsKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIGJv b2wgYWNwaV9wcnRfZW50cnlfdmFsaWQodm9pZCAqcHJ0X2VudHJ5KQo+ID4gK3sKPiA+ICsgICAg ICAgc3RydWN0IGFjcGlfcGNpX3JvdXRpbmdfdGFibGUgKmVudHJ5ID0gcHJ0X2VudHJ5Owo+ID4g Kwo+ID4gKyAgICAgICByZXR1cm4gZW50cnkgJiYgZW50cnktPmxlbmd0aCA+IDA7Cj4gPiArfQo+ ID4gKwo+ID4gK3N0YXRpYyB2b2lkICphY3BpX3BydF9uZXh0X2VudHJ5KHZvaWQgKnBydF9lbnRy eSkKPiA+ICt7Cj4gPiArICAgICAgIHN0cnVjdCBhY3BpX3BjaV9yb3V0aW5nX3RhYmxlICplbnRy eSA9IHBydF9lbnRyeTsKPiA+ICsKPiA+ICsgICAgICAgcmV0dXJuIHBydF9lbnRyeSArIGVudHJ5 LT5sZW5ndGg7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyB1MzIgYWNwaV9hZGRfcHJ0X2RlcChh Y3BpX2hhbmRsZSBoYW5kbGUpCj4gPiArewo+ID4gKyAgICAgICBzdHJ1Y3QgYWNwaV9idWZmZXIg YnVmZmVyID0geyBBQ1BJX0FMTE9DQVRFX0JVRkZFUiwgTlVMTCB9Owo+ID4gKyAgICAgICBzdHJ1 Y3QgYWNwaV9wY2lfcm91dGluZ190YWJsZSAqZW50cnk7Cj4gPiArICAgICAgIHN0cnVjdCBhY3Bp X2hhbmRsZV9saXN0IGRlcF9kZXZpY2VzOwo+ID4gKyAgICAgICBhY3BpX2hhbmRsZSBnc2lfaGFu ZGxlOwo+ID4gKyAgICAgICBhY3BpX2hhbmRsZSBsaW5rX2hhbmRsZTsKPiA+ICsgICAgICAgYWNw aV9zdGF0dXMgc3RhdHVzOwo+ID4gKyAgICAgICB1MzIgY291bnQgPSAwOwo+ID4gKwo+ID4gKyAg ICAgICBzdGF0dXMgPSBhY3BpX2dldF9pcnFfcm91dGluZ190YWJsZShoYW5kbGUsICZidWZmZXIp Owo+ID4gKyAgICAgICBpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKPiA+ICsgICAgICAgICAg ICAgICBhY3BpX2hhbmRsZV9lcnIoaGFuZGxlLCAiZmFpbGVkIHRvIGdldCBJUlEgcm91dGluZyB0 YWJsZVxuIik7Cj4gPiArICAgICAgICAgICAgICAga2ZyZWUoYnVmZmVyLnBvaW50ZXIpOwo+ID4g KyAgICAgICAgICAgICAgIHJldHVybiAwOwo+ID4gKyAgICAgICB9Cj4gPiArCj4gPiArICAgICAg IGVudHJ5ID0gYnVmZmVyLnBvaW50ZXI7Cj4gPiArICAgICAgIGZvciAoOyBhY3BpX3BydF9lbnRy eV92YWxpZChlbnRyeSk7IGVudHJ5ID0gYWNwaV9wcnRfbmV4dF9lbnRyeShlbnRyeSkpIHsKPiA+ ICsgICAgICAgICAgICAgICBpZiAoZW50cnktPnNvdXJjZVswXSkgewo+ID4gKyAgICAgICAgICAg ICAgICAgICAgICAgc3RhdHVzID0gYWNwaV9nZXRfaGFuZGxlKGhhbmRsZSwgZW50cnktPnNvdXJj ZSwgJmxpbmtfaGFuZGxlKTsKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIGlmIChBQ1BJX0ZB SUxVUkUoc3RhdHVzKSkKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGlu dWU7Cj4gPiArICAgICAgICAgICAgICAgICAgICAgICBkZXBfZGV2aWNlcy5jb3VudCA9IDE7Cj4g PiArICAgICAgICAgICAgICAgICAgICAgICBkZXBfZGV2aWNlcy5oYW5kbGVzID0ga2NhbGxvYygx LCBzaXplb2YoKmRlcF9kZXZpY2VzLmhhbmRsZXMpLCBHRlBfS0VSTkVMKTsKPiA+ICsgICAgICAg ICAgICAgICAgICAgICAgIGlmICghZGVwX2RldmljZXMuaGFuZGxlcykgewo+ID4gKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBhY3BpX2hhbmRsZV9lcnIoaGFuZGxlLCAiZmFpbGVkIHRv IGFsbG9jYXRlIG1lbW9yeVxuIik7Cj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IGNvbnRpbnVlOwo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgfQo+ID4gKwo+ID4gKyAgICAg ICAgICAgICAgICAgICAgICAgZGVwX2RldmljZXMuaGFuZGxlc1swXSA9IGxpbmtfaGFuZGxlOwo+ ID4gKyAgICAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gYWNwaV9zY2FuX2FkZF9kZXAoaGFu ZGxlLCAmZGVwX2RldmljZXMpOwo+ID4gKyAgICAgICAgICAgICAgIH0gZWxzZSB7Cj4gPiArICAg ICAgICAgICAgICAgICAgICAgICBnc2lfaGFuZGxlID0gYWNwaV9nZXRfZ3NpX2hhbmRsZShlbnRy eS0+c291cmNlX2luZGV4KTsKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIGlmICghZ3NpX2hh bmRsZSkKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Cj4gPiAr ICAgICAgICAgICAgICAgICAgICAgICBkZXBfZGV2aWNlcy5jb3VudCA9IDE7Cj4gPiArICAgICAg ICAgICAgICAgICAgICAgICBkZXBfZGV2aWNlcy5oYW5kbGVzID0ga2NhbGxvYygxLCBzaXplb2Yo KmRlcF9kZXZpY2VzLmhhbmRsZXMpLCBHRlBfS0VSTkVMKTsKPiA+ICsgICAgICAgICAgICAgICAg ICAgICAgIGlmICghZGVwX2RldmljZXMuaGFuZGxlcykgewo+ID4gKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBhY3BpX2hhbmRsZV9lcnIoaGFuZGxlLCAiZmFpbGVkIHRvIGFsbG9jYXRl IG1lbW9yeVxuIik7Cj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVl Owo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgfQo+ID4gKwo+ID4gKyAgICAgICAgICAgICAg ICAgICAgICAgZGVwX2RldmljZXMuaGFuZGxlc1swXSA9IGdzaV9oYW5kbGU7Cj4gPiArICAgICAg ICAgICAgICAgICAgICAgICBjb3VudCArPSBhY3BpX3NjYW5fYWRkX2RlcChoYW5kbGUsICZkZXBf ZGV2aWNlcyk7Cj4gPiArICAgICAgICAgICAgICAgfQo+ID4gKyAgICAgICB9Cj4gPiArCj4gPiAr ICAgICAgIGtmcmVlKGJ1ZmZlci5wb2ludGVyKTsKPiA+ICsgICAgICAgcmV0dXJuIGNvdW50Owo+ ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgdTMyIGFjcGlfYWRkX2lycV9kZXAoYWNwaV9oYW5kbGUg aGFuZGxlKQo+ID4gK3sKPiA+ICsgICAgICAgc3RydWN0IGFjcGlfaGFuZGxlX2xpc3QgZGVwX2Rl dmljZXM7Cj4gPiArICAgICAgIGFjcGlfaGFuZGxlIGdzaV9oYW5kbGU7Cj4gPiArICAgICAgIHUz MiBjb3VudCA9IDA7Cj4gPiArICAgICAgIGludCBpOwo+ID4gKwo+ID4gKyAgICAgICBmb3IgKGkg PSAwOyAhYWNwaV9pcnFfZ2V0X2RlcChoYW5kbGUsIGksICZnc2lfaGFuZGxlKTsgaSsrKSB7Cj4g PiArICAgICAgICAgICAgICAgaWYgKCFnc2lfaGFuZGxlKQo+ID4gKyAgICAgICAgICAgICAgICAg ICAgICAgY29udGludWU7Cj4gPiArCj4gPiArICAgICAgICAgICAgICAgZGVwX2RldmljZXMuY291 bnQgPSAxOwo+ID4gKyAgICAgICAgICAgICAgIGRlcF9kZXZpY2VzLmhhbmRsZXMgPSBrY2FsbG9j KDEsIHNpemVvZigqZGVwX2RldmljZXMuaGFuZGxlcyksIEdGUF9LRVJORUwpOwo+ID4gKyAgICAg ICAgICAgICAgIGlmICghZGVwX2RldmljZXMuaGFuZGxlcykgewo+ID4gKyAgICAgICAgICAgICAg ICAgICAgICAgYWNwaV9oYW5kbGVfZXJyKGhhbmRsZSwgImZhaWxlZCB0byBhbGxvY2F0ZSBtZW1v cnlcbiIpOwo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Cj4gPiArICAgICAg ICAgICAgICAgfQo+ID4gKwo+ID4gKyAgICAgICAgICAgICAgIGRlcF9kZXZpY2VzLmhhbmRsZXNb MF0gPSBnc2lfaGFuZGxlOwo+ID4gKyAgICAgICAgICAgICAgIGNvdW50ICs9IGFjcGlfc2Nhbl9h ZGRfZGVwKGhhbmRsZSwgJmRlcF9kZXZpY2VzKTsKPiA+ICsgICAgICAgfQo+ID4gKwo+ID4gKyAg ICAgICByZXR1cm4gY291bnQ7Cj4gPiArfQo+ID4gKwo+ID4gK3UzMiBhY3BpX2lycV9hZGRfYXV0 b19kZXAoYWNwaV9oYW5kbGUgaGFuZGxlKQo+ID4gK3sKPiA+ICsgICAgICAgaWYgKCFhY3BpX2dl dF9nc2lfaGFuZGxlKQo+ID4gKyAgICAgICAgICAgICAgIHJldHVybiAwOwo+ID4gKwo+ID4gKyAg ICAgICBpZiAoYWNwaV9oYXNfbWV0aG9kKGhhbmRsZSwgIl9QUlQiKSkKPiA+ICsgICAgICAgICAg ICAgICByZXR1cm4gYWNwaV9hZGRfcHJ0X2RlcChoYW5kbGUpOwo+ID4gKwo+ID4gKyAgICAgICBy ZXR1cm4gYWNwaV9hZGRfaXJxX2RlcChoYW5kbGUpOwo+ID4gK30KPiA+IGRpZmYgLS1naXQgYS9k cml2ZXJzL2FjcGkvcmlzY3YvaXJxLmMgYi9kcml2ZXJzL2FjcGkvcmlzY3YvaXJxLmMKPiA+IGlu ZGV4IDliODhkMDk5M2U4OC4uZGEyYzQyZTBlYmZkIDEwMDY0NAo+ID4gLS0tIGEvZHJpdmVycy9h Y3BpL3Jpc2N2L2lycS5jCj4gPiArKysgYi9kcml2ZXJzL2FjcGkvcmlzY3YvaXJxLmMKPiA+IEBA IC0yMywxMiArMjMsNiBAQCBzdHJ1Y3QgcmlzY3ZfZXh0X2ludGNfbGlzdCB7Cj4gPiAgICAgICAg IHN0cnVjdCBsaXN0X2hlYWQgICAgICAgIGxpc3Q7Cj4gPiAgfTsKPiA+Cj4gPiAtc3RydWN0IGFj cGlfaXJxX2RlcF9jdHggewo+ID4gLSAgICAgICBpbnQgICAgICAgICAgICAgcmM7Cj4gPiAtICAg ICAgIHVuc2lnbmVkIGludCAgICBpbmRleDsKPiA+IC0gICAgICAgYWNwaV9oYW5kbGUgICAgIGhh bmRsZTsKPiA+IC19Owo+ID4gLQo+ID4gIExJU1RfSEVBRChleHRfaW50Y19saXN0KTsKPiA+Cj4g PiAgc3RhdGljIGludCBpcnFjaGlwX2NtcF9mdW5jKGNvbnN0IHZvaWQgKmluMCwgY29uc3Qgdm9p ZCAqaW4xKQo+ID4gQEAgLTI1NCw3ICsyNDgsNyBAQCB2b2lkIF9faW5pdCByaXNjdl9hY3BpX2lu aXRfZ3NpX21hcHBpbmcodm9pZCkKPiA+ICAgICAgICAgYWNwaV9nZXRfZGV2aWNlcygiUlNDVjAw MDYiLCByaXNjdl9hY3BpX2NyZWF0ZV9nc2lfbWFwX3Ntc2ksIE5VTEwsIE5VTEwpOwo+ID4gIH0K PiA+Cj4gPiAtc3RhdGljIGFjcGlfaGFuZGxlIHJpc2N2X2FjcGlfZ2V0X2dzaV9oYW5kbGUodTMy IGdzaSkKPiA+ICthY3BpX2hhbmRsZSBhY3BpX2dldF9yaXNjdl9nc2lfaGFuZGxlKHUzMiBnc2kp Cj4gPiAgewo+ID4gICAgICAgICBzdHJ1Y3QgcmlzY3ZfZXh0X2ludGNfbGlzdCAqZXh0X2ludGNf ZWxlbWVudDsKPiA+ICAgICAgICAgc3RydWN0IGxpc3RfaGVhZCAqaTsKPiA+IEBAIC0yNjksMTM4 ICsyNjMsNyBAQCBzdGF0aWMgYWNwaV9oYW5kbGUgcmlzY3ZfYWNwaV9nZXRfZ3NpX2hhbmRsZSh1 MzIgZ3NpKQo+ID4gICAgICAgICByZXR1cm4gTlVMTDsKPiA+ICB9Cj4gPgo+ID4gLXN0YXRpYyBh Y3BpX3N0YXR1cyByaXNjdl9hY3BpX2lycV9nZXRfcGFyZW50KHN0cnVjdCBhY3BpX3Jlc291cmNl ICphcmVzLCB2b2lkICpjb250ZXh0KQo+ID4gLXsKPiA+IC0gICAgICAgc3RydWN0IGFjcGlfaXJx X2RlcF9jdHggKmN0eCA9IGNvbnRleHQ7Cj4gPiAtICAgICAgIHN0cnVjdCBhY3BpX3Jlc291cmNl X2lycSAqaXJxOwo+ID4gLSAgICAgICBzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9leHRlbmRlZF9pcnEg KmVpcnE7Cj4gPiAtCj4gPiAtICAgICAgIHN3aXRjaCAoYXJlcy0+dHlwZSkgewo+ID4gLSAgICAg ICBjYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9JUlE6Cj4gPiAtICAgICAgICAgICAgICAgaXJxID0g JmFyZXMtPmRhdGEuaXJxOwo+ID4gLSAgICAgICAgICAgICAgIGlmIChjdHgtPmluZGV4ID49IGly cS0+aW50ZXJydXB0X2NvdW50KSB7Cj4gPiAtICAgICAgICAgICAgICAgICAgICAgICBjdHgtPmlu ZGV4IC09IGlycS0+aW50ZXJydXB0X2NvdW50Owo+ID4gLSAgICAgICAgICAgICAgICAgICAgICAg cmV0dXJuIEFFX09LOwo+ID4gLSAgICAgICAgICAgICAgIH0KPiA+IC0gICAgICAgICAgICAgICBj dHgtPmhhbmRsZSA9IHJpc2N2X2FjcGlfZ2V0X2dzaV9oYW5kbGUoaXJxLT5pbnRlcnJ1cHRzW2N0 eC0+aW5kZXhdKTsKPiA+IC0gICAgICAgICAgICAgICByZXR1cm4gQUVfQ1RSTF9URVJNSU5BVEU7 Cj4gPiAtICAgICAgIGNhc2UgQUNQSV9SRVNPVVJDRV9UWVBFX0VYVEVOREVEX0lSUToKPiA+IC0g ICAgICAgICAgICAgICBlaXJxID0gJmFyZXMtPmRhdGEuZXh0ZW5kZWRfaXJxOwo+ID4gLSAgICAg ICAgICAgICAgIGlmIChlaXJxLT5wcm9kdWNlcl9jb25zdW1lciA9PSBBQ1BJX1BST0RVQ0VSKQo+ ID4gLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFFX09LOwo+ID4gLQo+ID4gLSAgICAg ICAgICAgICAgIGlmIChjdHgtPmluZGV4ID49IGVpcnEtPmludGVycnVwdF9jb3VudCkgewo+ID4g LSAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5pbmRleCAtPSBlaXJxLT5pbnRlcnJ1cHRfY291 bnQ7Cj4gPiAtICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQUVfT0s7Cj4gPiAtICAgICAg ICAgICAgICAgfQo+ID4gLQo+ID4gLSAgICAgICAgICAgICAgIC8qIFN1cHBvcnQgR1NJcyBvbmx5 ICovCj4gPiAtICAgICAgICAgICAgICAgaWYgKGVpcnEtPnJlc291cmNlX3NvdXJjZS5zdHJpbmdf bGVuZ3RoKQo+ID4gLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFFX09LOwo+ID4gLQo+ ID4gLSAgICAgICAgICAgICAgIGN0eC0+aGFuZGxlID0gcmlzY3ZfYWNwaV9nZXRfZ3NpX2hhbmRs ZShlaXJxLT5pbnRlcnJ1cHRzW2N0eC0+aW5kZXhdKTsKPiA+IC0gICAgICAgICAgICAgICByZXR1 cm4gQUVfQ1RSTF9URVJNSU5BVEU7Cj4gPiAtICAgICAgIH0KPiA+IC0KPiA+IC0gICAgICAgcmV0 dXJuIEFFX09LOwo+ID4gLX0KPiA+IC0KPiA+IC1zdGF0aWMgaW50IHJpc2N2X2FjcGlfaXJxX2dl dF9kZXAoYWNwaV9oYW5kbGUgaGFuZGxlLCB1bnNpZ25lZCBpbnQgaW5kZXgsIGFjcGlfaGFuZGxl ICpnc2lfaGFuZGxlKQo+ID4gLXsKPiA+IC0gICAgICAgc3RydWN0IGFjcGlfaXJxX2RlcF9jdHgg Y3R4ID0gey1FSU5WQUwsIGluZGV4LCBOVUxMfTsKPiA+IC0KPiA+IC0gICAgICAgaWYgKCFnc2lf aGFuZGxlKQo+ID4gLSAgICAgICAgICAgICAgIHJldHVybiAwOwo+ID4gLQo+ID4gLSAgICAgICBh Y3BpX3dhbGtfcmVzb3VyY2VzKGhhbmRsZSwgTUVUSE9EX05BTUVfX0NSUywgcmlzY3ZfYWNwaV9p cnFfZ2V0X3BhcmVudCwgJmN0eCk7Cj4gPiAtICAgICAgICpnc2lfaGFuZGxlID0gY3R4LmhhbmRs ZTsKPiA+IC0gICAgICAgaWYgKCpnc2lfaGFuZGxlKQo+ID4gLSAgICAgICAgICAgICAgIHJldHVy biAxOwo+ID4gLQo+ID4gLSAgICAgICByZXR1cm4gMDsKPiA+IC19Cj4gPiAtCj4gPiAtc3RhdGlj IHUzMiByaXNjdl9hY3BpX2FkZF9wcnRfZGVwKGFjcGlfaGFuZGxlIGhhbmRsZSkKPiA+IC17Cj4g PiAtICAgICAgIHN0cnVjdCBhY3BpX2J1ZmZlciBidWZmZXIgPSB7IEFDUElfQUxMT0NBVEVfQlVG RkVSLCBOVUxMIH07Cj4gPiAtICAgICAgIHN0cnVjdCBhY3BpX3BjaV9yb3V0aW5nX3RhYmxlICpl bnRyeTsKPiA+IC0gICAgICAgc3RydWN0IGFjcGlfaGFuZGxlX2xpc3QgZGVwX2RldmljZXM7Cj4g PiAtICAgICAgIGFjcGlfaGFuZGxlIGdzaV9oYW5kbGU7Cj4gPiAtICAgICAgIGFjcGlfaGFuZGxl IGxpbmtfaGFuZGxlOwo+ID4gLSAgICAgICBhY3BpX3N0YXR1cyBzdGF0dXM7Cj4gPiAtICAgICAg IHUzMiBjb3VudCA9IDA7Cj4gPiAtCj4gPiAtICAgICAgIHN0YXR1cyA9IGFjcGlfZ2V0X2lycV9y b3V0aW5nX3RhYmxlKGhhbmRsZSwgJmJ1ZmZlcik7Cj4gPiAtICAgICAgIGlmIChBQ1BJX0ZBSUxV UkUoc3RhdHVzKSkgewo+ID4gLSAgICAgICAgICAgICAgIGFjcGlfaGFuZGxlX2VycihoYW5kbGUs ICJmYWlsZWQgdG8gZ2V0IElSUSByb3V0aW5nIHRhYmxlXG4iKTsKPiA+IC0gICAgICAgICAgICAg ICBrZnJlZShidWZmZXIucG9pbnRlcik7Cj4gPiAtICAgICAgICAgICAgICAgcmV0dXJuIDA7Cj4g PiAtICAgICAgIH0KPiA+IC0KPiA+IC0gICAgICAgZW50cnkgPSBidWZmZXIucG9pbnRlcjsKPiA+ IC0gICAgICAgd2hpbGUgKGVudHJ5ICYmIChlbnRyeS0+bGVuZ3RoID4gMCkpIHsKPiA+IC0gICAg ICAgICAgICAgICBpZiAoZW50cnktPnNvdXJjZVswXSkgewo+ID4gLSAgICAgICAgICAgICAgICAg ICAgICAgYWNwaV9nZXRfaGFuZGxlKGhhbmRsZSwgZW50cnktPnNvdXJjZSwgJmxpbmtfaGFuZGxl KTsKPiA+IC0gICAgICAgICAgICAgICAgICAgICAgIGRlcF9kZXZpY2VzLmNvdW50ID0gMTsKPiA+ IC0gICAgICAgICAgICAgICAgICAgICAgIGRlcF9kZXZpY2VzLmhhbmRsZXMgPSBremFsbG9jX29i anMoKmRlcF9kZXZpY2VzLmhhbmRsZXMsCj4gPiAtICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOwo+ID4gLSAgICAgICAgICAgICAgICAg ICAgICAgaWYgKCFkZXBfZGV2aWNlcy5oYW5kbGVzKSB7Cj4gPiAtICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIGFjcGlfaGFuZGxlX2VycihoYW5kbGUsICJmYWlsZWQgdG8gYWxsb2NhdGUg bWVtb3J5XG4iKTsKPiA+IC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7 Cj4gPiAtICAgICAgICAgICAgICAgICAgICAgICB9Cj4gPiAtCj4gPiAtICAgICAgICAgICAgICAg ICAgICAgICBkZXBfZGV2aWNlcy5oYW5kbGVzWzBdID0gbGlua19oYW5kbGU7Cj4gPiAtICAgICAg ICAgICAgICAgICAgICAgICBjb3VudCArPSBhY3BpX3NjYW5fYWRkX2RlcChoYW5kbGUsICZkZXBf ZGV2aWNlcyk7Cj4gPiAtICAgICAgICAgICAgICAgfSBlbHNlIHsKPiA+IC0gICAgICAgICAgICAg ICAgICAgICAgIGdzaV9oYW5kbGUgPSByaXNjdl9hY3BpX2dldF9nc2lfaGFuZGxlKGVudHJ5LT5z b3VyY2VfaW5kZXgpOwo+ID4gLSAgICAgICAgICAgICAgICAgICAgICAgZGVwX2RldmljZXMuY291 bnQgPSAxOwo+ID4gLSAgICAgICAgICAgICAgICAgICAgICAgZGVwX2RldmljZXMuaGFuZGxlcyA9 IGt6YWxsb2Nfb2JqcygqZGVwX2RldmljZXMuaGFuZGxlcywKPiA+IC0gICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7Cj4gPiAtICAgICAg ICAgICAgICAgICAgICAgICBpZiAoIWRlcF9kZXZpY2VzLmhhbmRsZXMpIHsKPiA+IC0gICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9oYW5kbGVfZXJyKGhhbmRsZSwgImZhaWxlZCB0 byBhbGxvY2F0ZSBtZW1vcnlcbiIpOwo+ID4gLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBjb250aW51ZTsKPiA+IC0gICAgICAgICAgICAgICAgICAgICAgIH0KPiA+IC0KPiA+IC0gICAg ICAgICAgICAgICAgICAgICAgIGRlcF9kZXZpY2VzLmhhbmRsZXNbMF0gPSBnc2lfaGFuZGxlOwo+ ID4gLSAgICAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gYWNwaV9zY2FuX2FkZF9kZXAoaGFu ZGxlLCAmZGVwX2RldmljZXMpOwo+ID4gLSAgICAgICAgICAgICAgIH0KPiA+IC0KPiA+IC0gICAg ICAgICAgICAgICBlbnRyeSA9IChzdHJ1Y3QgYWNwaV9wY2lfcm91dGluZ190YWJsZSAqKQo+ID4g LSAgICAgICAgICAgICAgICAgICAgICAgKCh1bnNpZ25lZCBsb25nKWVudHJ5ICsgZW50cnktPmxl bmd0aCk7Cj4gPiAtICAgICAgIH0KPiA+IC0KPiA+IC0gICAgICAga2ZyZWUoYnVmZmVyLnBvaW50 ZXIpOwo+ID4gLSAgICAgICByZXR1cm4gY291bnQ7Cj4gPiAtfQo+ID4gLQo+ID4gLXN0YXRpYyB1 MzIgcmlzY3ZfYWNwaV9hZGRfaXJxX2RlcChhY3BpX2hhbmRsZSBoYW5kbGUpCj4gPiAtewo+ID4g LSAgICAgICBzdHJ1Y3QgYWNwaV9oYW5kbGVfbGlzdCBkZXBfZGV2aWNlczsKPiA+IC0gICAgICAg YWNwaV9oYW5kbGUgZ3NpX2hhbmRsZTsKPiA+IC0gICAgICAgdTMyIGNvdW50ID0gMDsKPiA+IC0g ICAgICAgaW50IGk7Cj4gPiAtCj4gPiAtICAgICAgIGZvciAoaSA9IDA7Cj4gPiAtICAgICAgICAg ICAgcmlzY3ZfYWNwaV9pcnFfZ2V0X2RlcChoYW5kbGUsIGksICZnc2lfaGFuZGxlKTsKPiA+IC0g ICAgICAgICAgICBpKyspIHsKPiA+IC0gICAgICAgICAgICAgICBkZXBfZGV2aWNlcy5jb3VudCA9 IDE7Cj4gPiAtICAgICAgICAgICAgICAgZGVwX2RldmljZXMuaGFuZGxlcyA9IGt6YWxsb2Nfb2Jq cygqZGVwX2RldmljZXMuaGFuZGxlcywgMSk7Cj4gPiAtICAgICAgICAgICAgICAgaWYgKCFkZXBf ZGV2aWNlcy5oYW5kbGVzKSB7Cj4gPiAtICAgICAgICAgICAgICAgICAgICAgICBhY3BpX2hhbmRs ZV9lcnIoaGFuZGxlLCAiZmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeVxuIik7Cj4gPiAtICAgICAg ICAgICAgICAgICAgICAgICBjb250aW51ZTsKPiA+IC0gICAgICAgICAgICAgICB9Cj4gPiAtCj4g PiAtICAgICAgICAgICAgICAgZGVwX2RldmljZXMuaGFuZGxlc1swXSA9IGdzaV9oYW5kbGU7Cj4g PiAtICAgICAgICAgICAgICAgY291bnQgKz0gYWNwaV9zY2FuX2FkZF9kZXAoaGFuZGxlLCAmZGVw X2RldmljZXMpOwo+ID4gLSAgICAgICB9Cj4gPiAtCj4gPiAtICAgICAgIHJldHVybiBjb3VudDsK PiA+IC19Cj4gPiAtCj4gPiAgdTMyIGFyY2hfYWNwaV9hZGRfYXV0b19kZXAoYWNwaV9oYW5kbGUg aGFuZGxlKQo+ID4gIHsKPiA+IC0gICAgICAgaWYgKGFjcGlfaGFzX21ldGhvZChoYW5kbGUsICJf UFJUIikpCj4gPiAtICAgICAgICAgICAgICAgcmV0dXJuIHJpc2N2X2FjcGlfYWRkX3BydF9kZXAo aGFuZGxlKTsKPiA+IC0KPiA+IC0gICAgICAgcmV0dXJuIHJpc2N2X2FjcGlfYWRkX2lycV9kZXAo aGFuZGxlKTsKPiA+ICsgICAgICAgcmV0dXJuIGFjcGlfaXJxX2FkZF9hdXRvX2RlcChoYW5kbGUp Owo+ID4gIH0KPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2lycWNoaXAvaXJxLWdpYy12My5jIGIv ZHJpdmVycy9pcnFjaGlwL2lycS1naWMtdjMuYwo+ID4gaW5kZXggOTk0NDRhMWIyZmZhLi4yNjcz OTU0ZDQ1NzcgMTAwNjQ0Cj4gPiAtLS0gYS9kcml2ZXJzL2lycWNoaXAvaXJxLWdpYy12My5jCj4g PiArKysgYi9kcml2ZXJzL2lycWNoaXAvaXJxLWdpYy12My5jCj4gPiBAQCAtMjU4OCw3ICsyNTg4 LDcgQEAgZ2ljX2FjcGlfaW5pdCh1bmlvbiBhY3BpX3N1YnRhYmxlX2hlYWRlcnMgKmhlYWRlciwg Y29uc3QgdW5zaWduZWQgbG9uZyBlbmQpCj4gPiAgICAgICAgIGlmIChlcnIpCj4gPiAgICAgICAg ICAgICAgICAgZ290byBvdXRfZndoYW5kbGVfZnJlZTsKPiA+Cj4gPiAtICAgICAgIGFjcGlfc2V0 X2lycV9tb2RlbChBQ1BJX0lSUV9NT0RFTF9HSUMsIGdpY192M19nZXRfZ3NpX2RvbWFpbl9pZCk7 Cj4gPiArICAgICAgIGFjcGlfc2V0X2lycV9tb2RlbChBQ1BJX0lSUV9NT0RFTF9HSUMsIGdpY192 M19nZXRfZ3NpX2RvbWFpbl9pZCwgTlVMTCk7Cj4gPgo+ID4gICAgICAgICBpZiAoc3RhdGljX2Jy YW5jaF9saWtlbHkoJnN1cHBvcnRzX2RlYWN0aXZhdGVfa2V5KSkKPiA+ICAgICAgICAgICAgICAg ICBnaWNfYWNwaV9zZXR1cF9rdm1faW5mbygpOwo+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXJx Y2hpcC9pcnEtZ2ljLXY1LmMgYi9kcml2ZXJzL2lycWNoaXAvaXJxLWdpYy12NS5jCj4gPiBpbmRl eCA2YjA5MDNiZThlYmYuLjAzY2MyODMwYjI2MCAxMDA2NDQKPiA+IC0tLSBhL2RyaXZlcnMvaXJx Y2hpcC9pcnEtZ2ljLXY1LmMKPiA+ICsrKyBiL2RyaXZlcnMvaXJxY2hpcC9pcnEtZ2ljLXY1LmMK PiA+IEBAIC0xMjQyLDcgKzEyNDIsNyBAQCBzdGF0aWMgaW50IF9faW5pdCBnaWNfYWNwaV9pbml0 KHVuaW9uIGFjcGlfc3VidGFibGVfaGVhZGVycyAqaGVhZGVyLCBjb25zdCB1bnNpZwo+ID4gICAg ICAgICBpZiAocmV0KQo+ID4gICAgICAgICAgICAgICAgIGdvdG8gb3V0X2lyczsKPiA+Cj4gPiAt ICAgICAgIGFjcGlfc2V0X2lycV9tb2RlbChBQ1BJX0lSUV9NT0RFTF9HSUNfVjUsIGdpY192NV9n ZXRfZ3NpX2RvbWFpbl9pZCk7Cj4gPiArICAgICAgIGFjcGlfc2V0X2lycV9tb2RlbChBQ1BJX0lS UV9NT0RFTF9HSUNfVjUsIGdpY192NV9nZXRfZ3NpX2RvbWFpbl9pZCwgTlVMTCk7Cj4gPgo+ID4g ICAgICAgICByZXR1cm4gMDsKPiA+Cj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9pcnFjaGlwL2ly cS1naWMuYyBiL2RyaXZlcnMvaXJxY2hpcC9pcnEtZ2ljLmMKPiA+IGluZGV4IGVjNzBjODRlOWY5 MS4uZjZiYzI5ZjUxNWZiIDEwMDY0NAo+ID4gLS0tIGEvZHJpdmVycy9pcnFjaGlwL2lycS1naWMu Ywo+ID4gKysrIGIvZHJpdmVycy9pcnFjaGlwL2lycS1naWMuYwo+ID4gQEAgLTE2OTAsNyArMTY5 MCw3IEBAIHN0YXRpYyBpbnQgX19pbml0IGdpY192Ml9hY3BpX2luaXQodW5pb24gYWNwaV9zdWJ0 YWJsZV9oZWFkZXJzICpoZWFkZXIsCj4gPiAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKPiA+ ICAgICAgICAgfQo+ID4KPiA+IC0gICAgICAgYWNwaV9zZXRfaXJxX21vZGVsKEFDUElfSVJRX01P REVMX0dJQywgZ2ljX3YyX2dldF9nc2lfZG9tYWluX2lkKTsKPiA+ICsgICAgICAgYWNwaV9zZXRf aXJxX21vZGVsKEFDUElfSVJRX01PREVMX0dJQywgZ2ljX3YyX2dldF9nc2lfZG9tYWluX2lkLCBO VUxMKTsKPiA+Cj4gPiAgICAgICAgIGlmIChJU19FTkFCTEVEKENPTkZJR19BUk1fR0lDX1YyTSkp Cj4gPiAgICAgICAgICAgICAgICAgZ2ljdjJtX2luaXQoTlVMTCwgZ2ljX2RhdGFbMF0uZG9tYWlu KTsKPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2lycWNoaXAvaXJxLWxvb25nYXJjaC1jcHUuYyBi L2RyaXZlcnMvaXJxY2hpcC9pcnEtbG9vbmdhcmNoLWNwdS5jCj4gPiBpbmRleCA5NTBiYzA4N2Uz ODguLjg0Y2UyNDg4OTQ4OCAxMDA2NDQKPiA+IC0tLSBhL2RyaXZlcnMvaXJxY2hpcC9pcnEtbG9v bmdhcmNoLWNwdS5jCj4gPiArKysgYi9kcml2ZXJzL2lycWNoaXAvaXJxLWxvb25nYXJjaC1jcHUu Ywo+ID4gQEAgLTE2OCw3ICsxNjgsNyBAQCBzdGF0aWMgaW50IF9faW5pdCBjcHVpbnRjX2FjcGlf aW5pdCh1bmlvbiBhY3BpX3N1YnRhYmxlX2hlYWRlcnMgKmhlYWRlciwKPiA+ICAgICAgICAgICAg ICAgICBwYW5pYygiRmFpbGVkIHRvIGFkZCBpcnFkb21haW4gZm9yIExvb25nQXJjaCBDUFUiKTsK PiA+Cj4gPiAgICAgICAgIHNldF9oYW5kbGVfaXJxKCZoYW5kbGVfY3B1X2lycSk7Cj4gPiAtICAg ICAgIGFjcGlfc2V0X2lycV9tb2RlbChBQ1BJX0lSUV9NT0RFTF9MUElDLCBscGljX2dldF9nc2lf ZG9tYWluX2lkKTsKPiA+ICsgICAgICAgYWNwaV9zZXRfaXJxX21vZGVsKEFDUElfSVJRX01PREVM X0xQSUMsIGxwaWNfZ2V0X2dzaV9kb21haW5faWQsIE5VTEwpOwo+ID4gICAgICAgICBhY3BpX3Nl dF9nc2lfdG9faXJxX2ZhbGxiYWNrKGxwaWNfZ3NpX3RvX2lycSk7Cj4gPiAgICAgICAgIHJldCA9 IGFjcGlfY2FzY2FkZV9pcnFkb21haW5faW5pdCgpOwo+ID4KPiA+IGRpZmYgLS1naXQgYS9kcml2 ZXJzL2lycWNoaXAvaXJxLXJpc2N2LWludGMuYyBiL2RyaXZlcnMvaXJxY2hpcC9pcnEtcmlzY3Yt aW50Yy5jCj4gPiBpbmRleCA4NDQxOGRiZDVhMjcuLjA1OTUxNDQxMTZlMiAxMDA2NDQKPiA+IC0t LSBhL2RyaXZlcnMvaXJxY2hpcC9pcnEtcmlzY3YtaW50Yy5jCj4gPiArKysgYi9kcml2ZXJzL2ly cWNoaXAvaXJxLXJpc2N2LWludGMuYwo+ID4gQEAgLTM4NCw3ICszODQsOCBAQCBzdGF0aWMgaW50 IF9faW5pdCByaXNjdl9pbnRjX2FjcGlfaW5pdCh1bmlvbiBhY3BpX3N1YnRhYmxlX2hlYWRlcnMg KmhlYWRlciwKPiA+ICAgICAgICAgaWYgKHJjKQo+ID4gICAgICAgICAgICAgICAgIGlycV9kb21h aW5fZnJlZV9md25vZGUoZm4pOwo+ID4gICAgICAgICBlbHNlCj4gPiAtICAgICAgICAgICAgICAg YWNwaV9zZXRfaXJxX21vZGVsKEFDUElfSVJRX01PREVMX1JJTlRDLCByaXNjdl9hY3BpX2dldF9n c2lfZG9tYWluX2lkKTsKPiA+ICsgICAgICAgICAgICAgICBhY3BpX3NldF9pcnFfbW9kZWwoQUNQ SV9JUlFfTU9ERUxfUklOVEMsIHJpc2N2X2FjcGlfZ2V0X2dzaV9kb21haW5faWQsCj4gPiArICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfZ2V0X3Jpc2N2X2dzaV9oYW5kbGUp Owo+ID4KPiA+ICAgICAgICAgcmV0dXJuIHJjOwo+ID4gIH0KPiA+IGRpZmYgLS1naXQgYS9pbmNs dWRlL2xpbnV4L2FjcGkuaCBiL2luY2x1ZGUvbGludXgvYWNwaS5oCj4gPiBpbmRleCA2N2VmZmI5 MWZhOTguLjQ2OGZjNmE1NDY1MSAxMDA2NDQKPiA+IC0tLSBhL2luY2x1ZGUvbGludXgvYWNwaS5o Cj4gPiArKysgYi9pbmNsdWRlL2xpbnV4L2FjcGkuaAo+ID4gQEAgLTM2MCw5ICszNjAsMTAgQEAg aW50IGFjcGlfZ3NpX3RvX2lycSAodTMyIGdzaSwgdW5zaWduZWQgaW50ICppcnEpOwo+ID4gIGlu dCBhY3BpX2lzYV9pcnFfdG9fZ3NpICh1bnNpZ25lZCBpc2FfaXJxLCB1MzIgKmdzaSk7Cj4gPgo+ ID4gIHR5cGVkZWYgc3RydWN0IGZ3bm9kZV9oYW5kbGUgKigqYWNwaV9nc2lfZG9tYWluX2Rpc3Bf Zm4pKHUzMik7Cj4gPiArdHlwZWRlZiBhY3BpX2hhbmRsZSAoKmFjcGlfZ3NpX2hhbmRsZV9kaXNw X2ZuKSh1MzIpOwo+ID4KPiA+ICB2b2lkIGFjcGlfc2V0X2lycV9tb2RlbChlbnVtIGFjcGlfaXJx X21vZGVsX2lkIG1vZGVsLAo+ID4gLSAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9nc2lfZG9t YWluX2Rpc3BfZm4gZm4pOwo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9nc2lfZG9t YWluX2Rpc3BfZm4gZm4sIGFjcGlfZ3NpX2hhbmRsZV9kaXNwX2ZuIGdzaV9kZXBfZm4pOwo+ID4g IGFjcGlfZ3NpX2RvbWFpbl9kaXNwX2ZuIGFjcGlfZ2V0X2dzaV9kaXNwYXRjaGVyKHZvaWQpOwo+ ID4gIHZvaWQgYWNwaV9zZXRfZ3NpX3RvX2lycV9mYWxsYmFjayh1MzIgKCopKHUzMikpOwo+ID4K PiA+IEBAIC0zNzIsNiArMzczLDggQEAgc3RydWN0IGlycV9kb21haW4gKmFjcGlfaXJxX2NyZWF0 ZV9oaWVyYXJjaHkodW5zaWduZWQgaW50IGZsYWdzLAo+ID4gICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGlycV9kb21haW5fb3BzICpvcHMs Cj4gPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpo b3N0X2RhdGEpOwo+ID4KPiA+ICt1MzIgYWNwaV9pcnFfYWRkX2F1dG9fZGVwKGFjcGlfaGFuZGxl IGhhbmRsZSk7Cj4gPiArCj4gPiAgI2lmZGVmIENPTkZJR19YODZfSU9fQVBJQwo+ID4gIGV4dGVy biBpbnQgYWNwaV9nZXRfb3ZlcnJpZGVfaXJxKHUzMiBnc2ksIGludCAqdHJpZ2dlciwgaW50ICpw b2xhcml0eSk7Cj4gPiAgI2Vsc2UKPiA+Cj4gPiAtLQo+ID4gMi41NC4wCj4gPgoKX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KbGludXgtcmlzY3YgbWFpbGlu ZyBsaXN0CmxpbnV4LXJpc2N2QGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJh ZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1yaXNjdgo=