From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-lj1-f171.google.com (mail-lj1-f171.google.com [209.85.208.171]) (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 BA51D6BB4C for ; Sun, 18 Feb 2024 13:16:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.171 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1708262192; cv=none; b=Gr02lA3Nj93foB/yxj8Cnq9sTP7fXEwKuiHlw7lrHIU5dm/x7zQS6kwsv2qg1JsDZFJ5q7AyUTo9Yk6MoKdMtcmK0brrE5Ahx8ftqfBaZRrrsZPEIABea3p7ZO5jfWpgGNMwd1KZXsiQJOTWZGlDK4HrbGd7Hy0TAZp+VnrXTvA= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1708262192; c=relaxed/simple; bh=tGjyG5Es/u5e2EQ6MEX6Kwwb292/TdG8Dg8mvMuWJjU=; h=MIME-Version:References:In-Reply-To:From:Date:Message-ID:Subject: To:Cc:Content-Type; b=uR+DzR1Je1457WpIW5U6oxBqYg9ws6UgYnIIfrCNAhBSfsgHWy07nXC3x7ym2F8WyZ9E3QLyU3v31zg1aV9sllCtZR5NfiOctxXlvlk3gsnoNy5BPsvbmgtLdnU99qMbhBNT67EvR4knDqRcTd3w/9A0JYfbzb4J3gkLacbOeVg= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=ventanamicro.com; spf=pass smtp.mailfrom=ventanamicro.com; dkim=pass (2048-bit key) header.d=ventanamicro.com header.i=@ventanamicro.com header.b=fP+S/noi; arc=none smtp.client-ip=209.85.208.171 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=ventanamicro.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=ventanamicro.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ventanamicro.com header.i=@ventanamicro.com header.b="fP+S/noi" Received: by mail-lj1-f171.google.com with SMTP id 38308e7fff4ca-2d180d6bd32so30437871fa.1 for ; Sun, 18 Feb 2024 05:16:29 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ventanamicro.com; s=google; t=1708262188; x=1708866988; darn=vger.kernel.org; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:from:to:cc:subject:date :message-id:reply-to; bh=vTnKqfoHT1ASyWl8mfZgt45UxVbowkxAeoQ3Mo9HwXc=; b=fP+S/noiSi4vwyBEwPakOJLNPm8ttOyNDTLE1X0AlwmBKVbiKHLhOzfePyTyIpEezq +uDaE7RENlZY2ZvQKbKx3nqYEXmrMnglMEEIqZ/iO7BLKaY9U6iiREhy+waz+PkegjDz zTLKes4wRBGOMxgLe6oOxx8g66D0rGjcJWS1svyI8NSMHMg+KoejCpaChJfH3W80aTa8 ha/d6Z7rNBqTbEWIODpHnGdmIm/x5gdCzXhqMaIfbhzHG/E9pNwiSoB3AOsS22t8WugB ciBVlIHidMtHpLnj1F+4A35A1VhqQE0zWLs6AzihDV1qzBVW6HAMeG858qE4qY5GlauT Gy6w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1708262188; x=1708866988; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=vTnKqfoHT1ASyWl8mfZgt45UxVbowkxAeoQ3Mo9HwXc=; b=k1Stb48zt9BMXKnihvRtqrNlOu6lngI2xh0Kq8cO9KzCik+h1C0AICZBcYtJQ09Oja 2AfWz+cbcduNPIQv9+lJgiu++m/UR4rDSD0T2hUmBHhDRtEfE/SV/ChcygBThAMeqZxu 3fmnUorhG/bv8xwN7gn5xv9ndB1eJhylR/I2EGKelssKvA9seYKh45JDgv/RAV7xN1No Y2AiBCKdQWnZUeqgeHc6ih35sP//c6IczL0iYrw0yqkKSdEWQfKxsv6+hMj7aSV97/vL 5m+ML+sW/0s6Gge0FL90VXlwDsz6e0kIjRn/kguzJna2b1wkhwizKJws+5naS6Zt8P3A kW9w== X-Forwarded-Encrypted: i=1; AJvYcCU0NnPTwrXkL/9RoNgwP3MxKrUsoD9fdaHKWGFUsM6vN0jJ4cuQbUHVllqR5yUjPjW34MhncdVeQyBruc2GlRf13Cy9kf4pn/yOhaSJ X-Gm-Message-State: AOJu0YxC24c0Zhwxoo5BKr521bETSUnh0yPo0/d1VgshODlOeghyxM1V 0jVZTwsUuTM5rKZazqbkK4yPtrqP9auHixKu7IhvIeGy1eROmaRj9uqg6dGIym27MUUUmEgZ4FD 7xH+tx1SmxEqdgIKBo1CrdA68Nhh6VxfRgqNFGg== X-Google-Smtp-Source: AGHT+IEhxFBrsWmO2v/7lmMxvcC+n0VDEv/TG5Px5+CBrsNKIhqLY2D6BWfanaJoMUHX54FRaPuMYuvAUjE+oMrz4O0= X-Received: by 2002:a2e:9083:0:b0:2d2:3a0d:b36e with SMTP id l3-20020a2e9083000000b002d23a0db36emr163129ljg.44.1708262187577; Sun, 18 Feb 2024 05:16:27 -0800 (PST) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 References: <20240127161753.114685-1-apatel@ventanamicro.com> <20240127161753.114685-19-apatel@ventanamicro.com> <87h6i8ckwg.ffs@tglx> In-Reply-To: <87h6i8ckwg.ffs@tglx> From: Anup Patel Date: Sun, 18 Feb 2024 18:46:14 +0530 Message-ID: Subject: Re: [PATCH v12 18/25] irqchip: Add RISC-V incoming MSI controller early driver To: Thomas Gleixner Cc: Palmer Dabbelt , Paul Walmsley , Rob Herring , Krzysztof Kozlowski , Frank Rowand , Conor Dooley , Marc Zyngier , =?UTF-8?B?QmrDtnJuIFTDtnBlbA==?= , Atish Patra , Andrew Jones , Sunil V L , Saravana Kannan , Anup Patel , linux-riscv@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Sat, Feb 17, 2024 at 12:10=E2=80=AFAM Thomas Gleixner wrote: > > On Sat, Jan 27 2024 at 21:47, Anup Patel wrote: > > + > > +#ifdef CONFIG_SMP > > +static irqreturn_t imsic_local_sync_handler(int irq, void *data) > > +{ > > + imsic_local_sync(); > > + return IRQ_HANDLED; > > +} > > + > > +static void imsic_ipi_send(unsigned int cpu) > > +{ > > + struct imsic_local_config *local =3D > > + per_cpu_ptr(imsic->global.local, cpu); > > Let it stick out. We switched to line length 100 quite some time > ago. Applies to the rest of the series too. Okay, I will update. > > > + writel_relaxed(IMSIC_IPI_ID, local->msi_va); > > +} > > + > > +static void imsic_ipi_starting_cpu(void) > > +{ > > + /* Enable IPIs for current CPU. */ > > + __imsic_id_set_enable(IMSIC_IPI_ID); > > + > > + /* Enable virtual IPI used for IMSIC ID synchronization */ > > + enable_percpu_irq(imsic->ipi_virq, 0); > > +} > > + > > +static void imsic_ipi_dying_cpu(void) > > +{ > > + /* > > + * Disable virtual IPI used for IMSIC ID synchronization so > > + * that we don't receive ID synchronization requests. > > + */ > > + disable_percpu_irq(imsic->ipi_virq); > > Shouldn't this disable the hardware too, i.e. > > __imsic_id_clear_enable() > > ? Yes, it should but somehow I missed and never saw any issue. I will update. > > > +} > > + > > +static int __init imsic_ipi_domain_init(void) > > +{ > > + int virq; > > + > > + /* Create IMSIC IPI multiplexing */ > > + virq =3D ipi_mux_create(IMSIC_NR_IPI, imsic_ipi_send); > > + if (virq <=3D 0) > > + return (virq < 0) ? virq : -ENOMEM; > > + imsic->ipi_virq =3D virq; > > + > > + /* First vIRQ is used for IMSIC ID synchronization */ > > + virq =3D request_percpu_irq(imsic->ipi_virq, imsic_local_sync_han= dler, > > + "riscv-imsic-lsync", imsic->global.loca= l); > > + if (virq) > > + return virq; > > Please use a separate 'ret' variable. I had to read this 3 times to make > sense of it. Okay, I will update. > > > + irq_set_status_flags(imsic->ipi_virq, IRQ_HIDDEN); > > + imsic->ipi_lsync_desc =3D irq_to_desc(imsic->ipi_virq); > > What's so special about this particular IPI that it can't be handled > like all the other IPIs? We are using this special under-the-hood IPI for synchronization of IRQ enable/disable and IRQ movement across CPUs. x86 has a more lazy approach of using a per-CPU timer so in the next revision I will move to a similar approach. This means both "ipi_virq" and "ipi_lsync_desc" will go away. > > > +static int __init imsic_early_probe(struct fwnode_handle *fwnode) > > +{ > > + int rc; > > + struct irq_domain *domain; > > https://www.kernel.org/doc/html/latest/process/maintainer-tip.html#variab= le-declarations Okay, I will update. > > > + > > + /* Find parent domain and register chained handler */ > > + domain =3D irq_find_matching_fwnode(riscv_get_intc_hwnode(), > > + DOMAIN_BUS_ANY); > > + if (!domain) { > > + pr_err("%pfwP: Failed to find INTC domain\n", fwnode); > > + return -ENOENT; > > + } > > + imsic_parent_irq =3D irq_create_mapping(domain, RV_IRQ_EXT); > > + if (!imsic_parent_irq) { > > + pr_err("%pfwP: Failed to create INTC mapping\n", fwnode); > > + return -ENOENT; > > + } > > + irq_set_chained_handler(imsic_parent_irq, imsic_handle_irq); > > + > > + /* Initialize IPI domain */ > > + rc =3D imsic_ipi_domain_init(); > > + if (rc) { > > + pr_err("%pfwP: Failed to initialize IPI domain\n", fwnode= ); > > + return rc; > > Leaves the chained handler around and enabled. Okay, I will set the chained hander after imsic_ipi_domain_init(). > > > diff --git a/drivers/irqchip/irq-riscv-imsic-state.c b/drivers/irqchip/= irq-riscv-imsic-state.c > > + > > +#define imsic_csr_write(__c, __v) \ > > +do { \ > > + csr_write(CSR_ISELECT, __c); \ > > + csr_write(CSR_IREG, __v); \ > > +} while (0) > > Any reason why these macros can't be inlines? No particular reason. I am fine with both maros and inline functions. I will update in the next revision. > > > +const struct imsic_global_config *imsic_get_global_config(void) > > +{ > > + return imsic ? &imsic->global : NULL; > > +} > > +EXPORT_SYMBOL_GPL(imsic_get_global_config); > > Why is this exported? This is for the KVM RISC-V module. We have follow up KVM RISC-V patchs which need to know the IMSIC global configuration so that it can assign IMSIC guest files to a Guest/VM. > > > +#define __imsic_id_read_clear_enabled(__id) \ > > + __imsic_eix_read_clear((__id), false) > > +#define __imsic_id_read_clear_pending(__id) \ > > + __imsic_eix_read_clear((__id), true) > > Please use inlines. Okay, I will update. > > > +void __imsic_eix_update(unsigned long base_id, > > + unsigned long num_id, bool pend, bool val) > > +{ > > + unsigned long i, isel, ireg; > > + unsigned long id =3D base_id, last_id =3D base_id + num_id; > > + > > + while (id < last_id) { > > + isel =3D id / BITS_PER_LONG; > > + isel *=3D BITS_PER_LONG / IMSIC_EIPx_BITS; > > + isel +=3D (pend) ? IMSIC_EIP0 : IMSIC_EIE0; > > + > > + ireg =3D 0; > > + for (i =3D id & (__riscv_xlen - 1); > > + (id < last_id) && (i < __riscv_xlen); i++) { > > + ireg |=3D BIT(i); > > + id++; > > + } > > This lacks a comment what this is doing. Okay, I will add a comment block. > > > + > > + /* > > + * The IMSIC EIEx and EIPx registers are indirectly > > + * accessed via using ISELECT and IREG CSRs so we > > + * need to access these CSRs without getting preempted. > > + * > > + * All existing users of this function call this > > + * function with local IRQs disabled so we don't > > + * need to do anything special here. > > + */ > > + if (val) > > + imsic_csr_set(isel, ireg); > > + else > > + imsic_csr_clear(isel, ireg); > > + } > > +} > > + > > +void imsic_local_sync(void) > > +{ > > + struct imsic_local_priv *lpriv =3D this_cpu_ptr(imsic->lpriv); > > + struct imsic_local_config *mlocal; > > + struct imsic_vector *mvec; > > + unsigned long flags; > > + int i; > > + > > + raw_spin_lock_irqsave(&lpriv->ids_lock, flags); > > + for (i =3D 1; i <=3D imsic->global.nr_ids; i++) { > > + if (i =3D=3D IMSIC_IPI_ID) > > + continue; > > + > > + if (test_bit(i, lpriv->ids_enabled_bitmap)) > > + __imsic_id_set_enable(i); > > + else > > + __imsic_id_clear_enable(i); > > + > > + mvec =3D lpriv->ids_move[i]; > > + lpriv->ids_move[i] =3D NULL; > > + if (mvec) { > > + if (__imsic_id_read_clear_pending(i)) { > > + mlocal =3D per_cpu_ptr(imsic->global.loca= l, > > + mvec->cpu); > > + writel_relaxed(mvec->local_id, mlocal->ms= i_va); > > + } > > + > > + imsic_vector_free(&lpriv->vectors[i]); > > + } > > Again an uncommented piece of magic which you will have forgotten what > it does 3 month down the road :) Sure, I will add a comment block. > > > + > > + } > > + raw_spin_unlock_irqrestore(&lpriv->ids_lock, flags); > > +} > > + > > +void imsic_local_delivery(bool enable) > > +{ > > + if (enable) { > > + imsic_csr_write(IMSIC_EITHRESHOLD, IMSIC_ENABLE_EITHRESHO= LD); > > + imsic_csr_write(IMSIC_EIDELIVERY, IMSIC_ENABLE_EIDELIVERY= ); > > + return; > > + } > > + > > + imsic_csr_write(IMSIC_EIDELIVERY, IMSIC_DISABLE_EIDELIVERY); > > + imsic_csr_write(IMSIC_EITHRESHOLD, IMSIC_DISABLE_EITHRESHOLD); > > +} > > + > > +#ifdef CONFIG_SMP > > +static void imsic_remote_sync(unsigned int cpu) > > +{ > > + /* > > + * We simply inject ID synchronization IPI to a target CPU > > + * if it is not same as the current CPU. The ipi_send_mask() > > + * implementation of IPI mux will inject ID synchronization > > + * IPI only for CPUs that have enabled it so offline CPUs > > + * won't receive IPI. An offline CPU will unconditionally > > + * synchronize IDs through imsic_starting_cpu() when the > > + * CPU is brought up. > > + */ > > + if (cpu_online(cpu)) { > > + if (cpu !=3D smp_processor_id()) > > + __ipi_send_mask(imsic->ipi_lsync_desc, cpumask_of= (cpu)); > > Still wondering why this can't use the regular API. There might be a > reason, but then it wants to be documented. As mentioned above, the "ipi_virq" and "irq_lsync_desc" will be replaced by a per-CPU timer in the next revision. > > > + else > > + imsic_local_sync(); > > + } > > +} > > +#else > > +static inline void imsic_remote_sync(unsigned int cpu) > > +{ > > + imsic_local_sync(); > > +} > > +#endif > > + > > +void imsic_vector_mask(struct imsic_vector *vec) > > +{ > > + struct imsic_local_priv *lpriv; > > + unsigned long flags; > > + > > + lpriv =3D per_cpu_ptr(imsic->lpriv, vec->cpu); > > + if (WARN_ON(&lpriv->vectors[vec->local_id] !=3D vec)) > > + return; > > + > > + raw_spin_lock_irqsave(&lpriv->ids_lock, flags); > > AFAICT, this is used from an irqchip callback: > > static void imsic_irq_mask(struct irq_data *d) > { > imsic_vector_mask(irq_data_get_irq_chip_data(d)); > } > > So no need to use irqsave() here. Those callbacks run always with > interrupts disabled when called from the core. Okay, I will update. > > > +void imsic_vector_move(struct imsic_vector *old_vec, > > + struct imsic_vector *new_vec) > > +{ > > + struct imsic_local_priv *old_lpriv, *new_lpriv; > > + unsigned long flags, flags1; > > + > > + if (WARN_ON(old_vec->cpu =3D=3D new_vec->cpu)) > > + return; > > + > > + old_lpriv =3D per_cpu_ptr(imsic->lpriv, old_vec->cpu); > > + if (WARN_ON(&old_lpriv->vectors[old_vec->local_id] !=3D old_vec)) > > + return; > > + > > + new_lpriv =3D per_cpu_ptr(imsic->lpriv, new_vec->cpu); > > + if (WARN_ON(&new_lpriv->vectors[new_vec->local_id] !=3D new_vec)) > > + return; > > + > > + raw_spin_lock_irqsave(&old_lpriv->ids_lock, flags); > > + raw_spin_lock_irqsave(&new_lpriv->ids_lock, flags1); > > Lockdep should yell at you for this, rightfully so. And not only because > of the missing nested() annotation. > > Assume there are two CPUs setting affinity for two different interrupts. > > CPU0 moves an interrupt to CPU1 and CPU1 moves another interrupt to > CPU0. The resulting lock order is: > > CPU0 CPU1 > lock(lpriv[CPU0]); lock(lpriv[CPU1]); > lock(lpriv[CPU1]); lock(lpriv[CPU0]); > > a classic ABBA deadlock. > > You need to take those locks always in the same order. Look at > double_raw_lock() in kernel/sched/sched.h. I have simplified the locking to avoid this nested locks so this will be much simpler without any lock nesting. > > > + /* Unmask the new vector entry */ > > + if (test_bit(old_vec->local_id, old_lpriv->ids_enabled_bitmap)) > > + bitmap_set(new_lpriv->ids_enabled_bitmap, > > + new_vec->local_id, 1); > > Either make that one line or please add brackets. See: > > https://www.kernel.org/doc/html/latest/process/maintainer-tip.html#brac= ket-rules Okay, I will update. > > > +static int __init imsic_local_init(void) > > +{ > > + struct imsic_global_config *global =3D &imsic->global; > > + struct imsic_local_priv *lpriv; > > + struct imsic_vector *vec; > > + int cpu, i; > > + > > + /* Allocate per-CPU private state */ > > + imsic->lpriv =3D alloc_percpu(typeof(*(imsic->lpriv))); > > + if (!imsic->lpriv) > > + return -ENOMEM; > > + > > + /* Setup per-CPU private state */ > > + for_each_possible_cpu(cpu) { > > + lpriv =3D per_cpu_ptr(imsic->lpriv, cpu); > > + > > + raw_spin_lock_init(&lpriv->ids_lock); > > + > > + /* Allocate enabled bitmap */ > > + lpriv->ids_enabled_bitmap =3D bitmap_zalloc(global->nr_id= s + 1, > > + GFP_KERNEL); > > + if (!lpriv->ids_enabled_bitmap) { > > + imsic_local_cleanup(); > > + return -ENOMEM; > > + } > > + > > + /* Allocate move array */ > > + lpriv->ids_move =3D kcalloc(global->nr_ids + 1, > > + sizeof(*lpriv->ids_move), GFP_KER= NEL); > > + if (!lpriv->ids_move) { > > + imsic_local_cleanup(); > > + return -ENOMEM; > > + } > > + > > + /* Allocate vector array */ > > + lpriv->vectors =3D kcalloc(global->nr_ids + 1, > > + sizeof(*lpriv->vectors), GFP_KER= NEL); > > + if (!lpriv->vectors) { > > + imsic_local_cleanup(); > > + return -ENOMEM; > > Third instance of the same pattern. goto cleanup; perhaps? Okay, I will add goto here. > > > +struct imsic_vector *imsic_vector_alloc(unsigned int hwirq, > > + const struct cpumask *mask) > > +{ > > + struct imsic_vector *vec =3D NULL; > > + struct imsic_local_priv *lpriv; > > + unsigned long flags; > > + unsigned int cpu; > > + int local_id; > > + > > + raw_spin_lock_irqsave(&imsic->matrix_lock, flags); > > + local_id =3D irq_matrix_alloc(imsic->matrix, mask, false, &cpu); > > + raw_spin_unlock_irqrestore(&imsic->matrix_lock, flags); > > + if (local_id < 0) > > + return NULL; > > + > > + lpriv =3D per_cpu_ptr(imsic->lpriv, cpu); > > + vec =3D &lpriv->vectors[local_id]; > > + vec->hwirq =3D hwirq; > > + > > + return vec; > > +} > > ... > > > +int imsic_hwirq_alloc(void) > > +{ > > + int ret; > > + unsigned long flags; > > + > > + raw_spin_lock_irqsave(&imsic->hwirqs_lock, flags); > > + ret =3D bitmap_find_free_region(imsic->hwirqs_used_bitmap, > > + imsic->nr_hwirqs, 0); > > + raw_spin_unlock_irqrestore(&imsic->hwirqs_lock, flags); > > + > > + return ret; > > +} > > This part is just to create a unique hwirq number, right? Yes, this is only for unique hwirq. We can directly use virq instead of hwirq so this hwirq allocation/management will go away in the next revision. > > > + > > + /* Find number of guest index bits in MSI address */ > > + rc =3D of_property_read_u32(to_of_node(fwnode), > > + "riscv,guest-index-bits", > > + &global->guest_index_bits); > > + if (rc) > > + global->guest_index_bits =3D 0; > > So here you get the index bits, but then 50 lines further down you do > sanity checking. Wouldn't it make sense to do that right here? > > Same for the other bits. This is intentional because we already have a AIA ACPI series where this helps to reduce the number of "if (acpi_disabled)" checks. > > > + > > +/* > > + * The IMSIC driver uses 1 IPI for ID synchronization and > > + * arch/riscv/kernel/smp.c require 6 IPIs so we fix the > > + * total number of IPIs to 8. > > + */ > > +#define IMSIC_IPI_ID 1 > > +#define IMSIC_NR_IPI 8 > > + > > +struct imsic_vector { > > + /* Fixed details of the vector */ > > + unsigned int cpu; > > + unsigned int local_id; > > + /* Details saved by driver in the vector */ > > + unsigned int hwirq; > > +}; > > + > > +struct imsic_local_priv { > > + /* Local state of interrupt identities */ > > + raw_spinlock_t ids_lock; > > + unsigned long *ids_enabled_bitmap; > > + struct imsic_vector **ids_move; > > + > > + /* Local vector table */ > > + struct imsic_vector *vectors; > > Please make those structs tabular: > > https://www.kernel.org/doc/html/latest/process/maintainer-tip.html#struct= -declarations-and-initializers Okay, I will update. > > > +void __imsic_eix_update(unsigned long base_id, > > + unsigned long num_id, bool pend, bool val); > > + > > +#define __imsic_id_set_enable(__id) \ > > + __imsic_eix_update((__id), 1, false, true) > > +#define __imsic_id_clear_enable(__id) \ > > + __imsic_eix_update((__id), 1, false, false) > > inlines please. Okay, I will update. Regards, Anup 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 64AEBC48BF6 for ; Sun, 18 Feb 2024 13:16:44 +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:To:Subject:Message-ID:Date:From: In-Reply-To:References:MIME-Version:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=aQ/NVH0tN5U6bCr7KIN3jUxCdacet8VQpchYNFlbbCU=; b=TrCbrn58e7cw3p QjIkf37K5f1JbuIbE/+ba5qtEXPYx3TqhWZalAaaxZmPY/2mRvoxAL4xmyr3yt3F8fKwVqIjdUVlj +5sXlYUPQkn1KWZEZ3/rqpJeb+pQm/k71W99xSJciEQ6TfIKacMdQl4FfgBrCdPYQwu5Y3kvrVFix DOlEdD8Gl0gA2CbK+dmWzbX4mCnhJlHds8xfCJMg9Xq6pDrZRAm8uZopK/aaTcYBhggCufGxGDHQx txzeXOMxkXdy1JgZ8bSh+BsTg9ahaY7z+pW/01JcX0e3NnIEZVTcqgC2VRuHkcVspjxrhlVhhOAko Nd89XHVvHIOpoAzthLOQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1rbh23-00000007lTp-3R9M; Sun, 18 Feb 2024 13:16:35 +0000 Received: from mail-lj1-x231.google.com ([2a00:1450:4864:20::231]) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1rbh1z-00000007lSp-2Z2h for linux-riscv@lists.infradead.org; Sun, 18 Feb 2024 13:16:33 +0000 Received: by mail-lj1-x231.google.com with SMTP id 38308e7fff4ca-2d23473a563so5631741fa.3 for ; Sun, 18 Feb 2024 05:16:29 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ventanamicro.com; s=google; t=1708262188; x=1708866988; darn=lists.infradead.org; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:from:to:cc:subject:date :message-id:reply-to; bh=vTnKqfoHT1ASyWl8mfZgt45UxVbowkxAeoQ3Mo9HwXc=; b=eru7cZ6bay4RxocHMoA1aY/1VSSn6lsJ5HBjCBkhmIgOrZtc4XzBLzIVyIPOjdwYb0 Hm/eFdJvBZu5VmBCKRHJZrVPBZ47n8+VFuIBguV/ey0MpDl+z+IUo/ai+k0SU2B4eia5 AqwZ92fy8J546gt2qx2egx9an3YZk2DzW05YlhFQfOicYAtKi9hR3Nae2IAyNN6hAJFw NvEe5cthQLEOdzV5ZN5Fxq3zIRCZoKhDwP+Uzuid62VFnDYeaC7CUX51em0RLlRQQIvm SwiL6UR3DmMFTMyNzi7Lu7UdmJkAPM1eOmfDahDxi5viwXoaBRXU8YZEhGjCH5c3CMzT w3mg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1708262188; x=1708866988; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=vTnKqfoHT1ASyWl8mfZgt45UxVbowkxAeoQ3Mo9HwXc=; b=gqYyvViCy0xzy1JzvJ3juAG0pLSnHMOSCOAGzYYHIcCwHfeouMfcs96rX3pv43tI4p 95X1DlLBDxKs1CqyJ+DmF8oJXSxTNfNIzCnKMAdOsyLhi+nUajAxuu8VJ+vokNRfSS4L 0cBCF89iV+Yk5Fbr5hZ1Z/zgcvmmUhMuJXcccrHZ/xN5/kUFzKZUyR8AyZsOrrjC7D75 d5a64hyQn8dhYuoWgCyFesCDPmrYPKM2JGIghuxJmcrkB6NIea0YAVS+VL0WSwuGv0O4 0aLywUg9ux8WDTu+ed0ovpCgSYQaxiYKOZAe8i3n7NpzaoSDiTMNLnyF2upZ2SE4GFnv bF6w== X-Forwarded-Encrypted: i=1; AJvYcCWhyZbruGA6pGcHPPflf0591lib5l9j7mviMjVvfsdTEhsm4bH+W9CHpdbHGlTNtiu/P/5veNXeeB21M+j4Ql5Pg/Fvj//1+RghNxq3VEC7 X-Gm-Message-State: AOJu0YyAJvZBLlBejplhAeNBm6GpuXoRPAsDkfFWhRgeY0vcIJ95iJ5i e7iPlKNpaBq1HsHKhhh3MJwkk+8eS0S43LCfO6rwNa0YLI0Lo5ZucivSKjaLyHaZGHeL8o3tA7+ YETu8maCzJrNnq4UcrZmsPprsQa9/XMz4TTwv/g== X-Google-Smtp-Source: AGHT+IEhxFBrsWmO2v/7lmMxvcC+n0VDEv/TG5Px5+CBrsNKIhqLY2D6BWfanaJoMUHX54FRaPuMYuvAUjE+oMrz4O0= X-Received: by 2002:a2e:9083:0:b0:2d2:3a0d:b36e with SMTP id l3-20020a2e9083000000b002d23a0db36emr163129ljg.44.1708262187577; Sun, 18 Feb 2024 05:16:27 -0800 (PST) MIME-Version: 1.0 References: <20240127161753.114685-1-apatel@ventanamicro.com> <20240127161753.114685-19-apatel@ventanamicro.com> <87h6i8ckwg.ffs@tglx> In-Reply-To: <87h6i8ckwg.ffs@tglx> From: Anup Patel Date: Sun, 18 Feb 2024 18:46:14 +0530 Message-ID: Subject: Re: [PATCH v12 18/25] irqchip: Add RISC-V incoming MSI controller early driver To: Thomas Gleixner X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240218_051631_701558_CB09E3CA X-CRM114-Status: GOOD ( 43.65 ) 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: devicetree@vger.kernel.org, Conor Dooley , Saravana Kannan , Marc Zyngier , Anup Patel , Atish Patra , linux-kernel@vger.kernel.org, =?UTF-8?B?QmrDtnJuIFTDtnBlbA==?= , Rob Herring , Palmer Dabbelt , Krzysztof Kozlowski , Paul Walmsley , linux-riscv@lists.infradead.org, Frank Rowand , linux-arm-kernel@lists.infradead.org, Andrew Jones 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 T24gU2F0LCBGZWIgMTcsIDIwMjQgYXQgMTI6MTDigK9BTSBUaG9tYXMgR2xlaXhuZXIgPHRnbHhA bGludXRyb25peC5kZT4gd3JvdGU6Cj4KPiBPbiBTYXQsIEphbiAyNyAyMDI0IGF0IDIxOjQ3LCBB bnVwIFBhdGVsIHdyb3RlOgo+ID4gKwo+ID4gKyNpZmRlZiBDT05GSUdfU01QCj4gPiArc3RhdGlj IGlycXJldHVybl90IGltc2ljX2xvY2FsX3N5bmNfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkYXRh KQo+ID4gK3sKPiA+ICsgICAgIGltc2ljX2xvY2FsX3N5bmMoKTsKPiA+ICsgICAgIHJldHVybiBJ UlFfSEFORExFRDsKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIHZvaWQgaW1zaWNfaXBpX3NlbmQo dW5zaWduZWQgaW50IGNwdSkKPiA+ICt7Cj4gPiArICAgICBzdHJ1Y3QgaW1zaWNfbG9jYWxfY29u ZmlnICpsb2NhbCA9Cj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJfY3B1X3B0 cihpbXNpYy0+Z2xvYmFsLmxvY2FsLCBjcHUpOwo+Cj4gTGV0IGl0IHN0aWNrIG91dC4gV2Ugc3dp dGNoZWQgdG8gbGluZSBsZW5ndGggMTAwIHF1aXRlIHNvbWUgdGltZQo+IGFnby4gQXBwbGllcyB0 byB0aGUgcmVzdCBvZiB0aGUgc2VyaWVzIHRvby4KCk9rYXksIEkgd2lsbCB1cGRhdGUuCgo+Cj4g PiArICAgICB3cml0ZWxfcmVsYXhlZChJTVNJQ19JUElfSUQsIGxvY2FsLT5tc2lfdmEpOwo+ID4g K30KPiA+ICsKPiA+ICtzdGF0aWMgdm9pZCBpbXNpY19pcGlfc3RhcnRpbmdfY3B1KHZvaWQpCj4g PiArewo+ID4gKyAgICAgLyogRW5hYmxlIElQSXMgZm9yIGN1cnJlbnQgQ1BVLiAqLwo+ID4gKyAg ICAgX19pbXNpY19pZF9zZXRfZW5hYmxlKElNU0lDX0lQSV9JRCk7Cj4gPiArCj4gPiArICAgICAv KiBFbmFibGUgdmlydHVhbCBJUEkgdXNlZCBmb3IgSU1TSUMgSUQgc3luY2hyb25pemF0aW9uICov Cj4gPiArICAgICBlbmFibGVfcGVyY3B1X2lycShpbXNpYy0+aXBpX3ZpcnEsIDApOwo+ID4gK30K PiA+ICsKPiA+ICtzdGF0aWMgdm9pZCBpbXNpY19pcGlfZHlpbmdfY3B1KHZvaWQpCj4gPiArewo+ ID4gKyAgICAgLyoKPiA+ICsgICAgICAqIERpc2FibGUgdmlydHVhbCBJUEkgdXNlZCBmb3IgSU1T SUMgSUQgc3luY2hyb25pemF0aW9uIHNvCj4gPiArICAgICAgKiB0aGF0IHdlIGRvbid0IHJlY2Vp dmUgSUQgc3luY2hyb25pemF0aW9uIHJlcXVlc3RzLgo+ID4gKyAgICAgICovCj4gPiArICAgICBk aXNhYmxlX3BlcmNwdV9pcnEoaW1zaWMtPmlwaV92aXJxKTsKPgo+IFNob3VsZG4ndCB0aGlzIGRp c2FibGUgdGhlIGhhcmR3YXJlIHRvbywgaS5lLgo+Cj4gICAgICAgICAgIF9faW1zaWNfaWRfY2xl YXJfZW5hYmxlKCkKPgo+ID8KClllcywgaXQgc2hvdWxkIGJ1dCBzb21laG93IEkgbWlzc2VkIGFu ZCBuZXZlciBzYXcgYW55IGlzc3VlLgoKSSB3aWxsIHVwZGF0ZS4KCj4KPiA+ICt9Cj4gPiArCj4g PiArc3RhdGljIGludCBfX2luaXQgaW1zaWNfaXBpX2RvbWFpbl9pbml0KHZvaWQpCj4gPiArewo+ ID4gKyAgICAgaW50IHZpcnE7Cj4gPiArCj4gPiArICAgICAvKiBDcmVhdGUgSU1TSUMgSVBJIG11 bHRpcGxleGluZyAqLwo+ID4gKyAgICAgdmlycSA9IGlwaV9tdXhfY3JlYXRlKElNU0lDX05SX0lQ SSwgaW1zaWNfaXBpX3NlbmQpOwo+ID4gKyAgICAgaWYgKHZpcnEgPD0gMCkKPiA+ICsgICAgICAg ICAgICAgcmV0dXJuICh2aXJxIDwgMCkgPyB2aXJxIDogLUVOT01FTTsKPiA+ICsgICAgIGltc2lj LT5pcGlfdmlycSA9IHZpcnE7Cj4gPiArCj4gPiArICAgICAvKiBGaXJzdCB2SVJRIGlzIHVzZWQg Zm9yIElNU0lDIElEIHN5bmNocm9uaXphdGlvbiAqLwo+ID4gKyAgICAgdmlycSA9IHJlcXVlc3Rf cGVyY3B1X2lycShpbXNpYy0+aXBpX3ZpcnEsIGltc2ljX2xvY2FsX3N5bmNfaGFuZGxlciwKPiA+ ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJpc2N2LWltc2ljLWxzeW5jIiwgaW1z aWMtPmdsb2JhbC5sb2NhbCk7Cj4gPiArICAgICBpZiAodmlycSkKPiA+ICsgICAgICAgICAgICAg cmV0dXJuIHZpcnE7Cj4KPiBQbGVhc2UgdXNlIGEgc2VwYXJhdGUgJ3JldCcgdmFyaWFibGUuIEkg aGFkIHRvIHJlYWQgdGhpcyAzIHRpbWVzIHRvIG1ha2UKPiBzZW5zZSBvZiBpdC4KCk9rYXksIEkg d2lsbCB1cGRhdGUuCgo+Cj4gPiArICAgICBpcnFfc2V0X3N0YXR1c19mbGFncyhpbXNpYy0+aXBp X3ZpcnEsIElSUV9ISURERU4pOwo+ID4gKyAgICAgaW1zaWMtPmlwaV9sc3luY19kZXNjID0gaXJx X3RvX2Rlc2MoaW1zaWMtPmlwaV92aXJxKTsKPgo+IFdoYXQncyBzbyBzcGVjaWFsIGFib3V0IHRo aXMgcGFydGljdWxhciBJUEkgdGhhdCBpdCBjYW4ndCBiZSBoYW5kbGVkCj4gbGlrZSBhbGwgdGhl IG90aGVyIElQSXM/CgpXZSBhcmUgdXNpbmcgdGhpcyBzcGVjaWFsIHVuZGVyLXRoZS1ob29kIElQ SSBmb3Igc3luY2hyb25pemF0aW9uCm9mIElSUSBlbmFibGUvZGlzYWJsZSBhbmQgSVJRIG1vdmVt ZW50IGFjcm9zcyBDUFVzLgoKeDg2IGhhcyBhIG1vcmUgbGF6eSBhcHByb2FjaCBvZiB1c2luZyBh IHBlci1DUFUgdGltZXIgc28gaW4KdGhlIG5leHQgcmV2aXNpb24gSSB3aWxsIG1vdmUgdG8gYSBz aW1pbGFyIGFwcHJvYWNoLiBUaGlzIG1lYW5zCmJvdGggImlwaV92aXJxIiBhbmQgImlwaV9sc3lu Y19kZXNjIiB3aWxsIGdvIGF3YXkuCgo+Cj4gPiArc3RhdGljIGludCBfX2luaXQgaW1zaWNfZWFy bHlfcHJvYmUoc3RydWN0IGZ3bm9kZV9oYW5kbGUgKmZ3bm9kZSkKPiA+ICt7Cj4gPiArICAgICBp bnQgcmM7Cj4gPiArICAgICBzdHJ1Y3QgaXJxX2RvbWFpbiAqZG9tYWluOwo+Cj4gaHR0cHM6Ly93 d3cua2VybmVsLm9yZy9kb2MvaHRtbC9sYXRlc3QvcHJvY2Vzcy9tYWludGFpbmVyLXRpcC5odG1s I3ZhcmlhYmxlLWRlY2xhcmF0aW9ucwoKT2theSwgSSB3aWxsIHVwZGF0ZS4KCj4KPiA+ICsKPiA+ ICsgICAgIC8qIEZpbmQgcGFyZW50IGRvbWFpbiBhbmQgcmVnaXN0ZXIgY2hhaW5lZCBoYW5kbGVy ICovCj4gPiArICAgICBkb21haW4gPSBpcnFfZmluZF9tYXRjaGluZ19md25vZGUocmlzY3ZfZ2V0 X2ludGNfaHdub2RlKCksCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgRE9NQUlOX0JVU19BTlkpOwo+ID4gKyAgICAgaWYgKCFkb21haW4pIHsKPiA+ICsgICAgICAg ICAgICAgcHJfZXJyKCIlcGZ3UDogRmFpbGVkIHRvIGZpbmQgSU5UQyBkb21haW5cbiIsIGZ3bm9k ZSk7Cj4gPiArICAgICAgICAgICAgIHJldHVybiAtRU5PRU5UOwo+ID4gKyAgICAgfQo+ID4gKyAg ICAgaW1zaWNfcGFyZW50X2lycSA9IGlycV9jcmVhdGVfbWFwcGluZyhkb21haW4sIFJWX0lSUV9F WFQpOwo+ID4gKyAgICAgaWYgKCFpbXNpY19wYXJlbnRfaXJxKSB7Cj4gPiArICAgICAgICAgICAg IHByX2VycigiJXBmd1A6IEZhaWxlZCB0byBjcmVhdGUgSU5UQyBtYXBwaW5nXG4iLCBmd25vZGUp Owo+ID4gKyAgICAgICAgICAgICByZXR1cm4gLUVOT0VOVDsKPiA+ICsgICAgIH0KPiA+ICsgICAg IGlycV9zZXRfY2hhaW5lZF9oYW5kbGVyKGltc2ljX3BhcmVudF9pcnEsIGltc2ljX2hhbmRsZV9p cnEpOwo+ID4gKwo+ID4gKyAgICAgLyogSW5pdGlhbGl6ZSBJUEkgZG9tYWluICovCj4gPiArICAg ICByYyA9IGltc2ljX2lwaV9kb21haW5faW5pdCgpOwo+ID4gKyAgICAgaWYgKHJjKSB7Cj4gPiAr ICAgICAgICAgICAgIHByX2VycigiJXBmd1A6IEZhaWxlZCB0byBpbml0aWFsaXplIElQSSBkb21h aW5cbiIsIGZ3bm9kZSk7Cj4gPiArICAgICAgICAgICAgIHJldHVybiByYzsKPgo+IExlYXZlcyB0 aGUgY2hhaW5lZCBoYW5kbGVyIGFyb3VuZCBhbmQgZW5hYmxlZC4KCk9rYXksIEkgd2lsbCBzZXQg dGhlIGNoYWluZWQgaGFuZGVyIGFmdGVyIGltc2ljX2lwaV9kb21haW5faW5pdCgpLgoKPgo+ID4g ZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXJxY2hpcC9pcnEtcmlzY3YtaW1zaWMtc3RhdGUuYyBiL2Ry aXZlcnMvaXJxY2hpcC9pcnEtcmlzY3YtaW1zaWMtc3RhdGUuYwo+ID4gKwo+ID4gKyNkZWZpbmUg aW1zaWNfY3NyX3dyaXRlKF9fYywgX192KSAgICAgICAgICAgIFwKPiA+ICtkbyB7ICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCj4gPiArICAgICBjc3Jfd3JpdGUoQ1NS X0lTRUxFQ1QsIF9fYyk7ICAgICAgICAgICAgXAo+ID4gKyAgICAgY3NyX3dyaXRlKENTUl9JUkVH LCBfX3YpOyAgICAgICAgICAgICAgIFwKPiA+ICt9IHdoaWxlICgwKQo+Cj4gQW55IHJlYXNvbiB3 aHkgdGhlc2UgbWFjcm9zIGNhbid0IGJlIGlubGluZXM/CgpObyBwYXJ0aWN1bGFyIHJlYXNvbi4g SSBhbSBmaW5lIHdpdGggYm90aCBtYXJvcyBhbmQgaW5saW5lIGZ1bmN0aW9ucy4KCkkgd2lsbCB1 cGRhdGUgaW4gdGhlIG5leHQgcmV2aXNpb24uCgo+Cj4gPiArY29uc3Qgc3RydWN0IGltc2ljX2ds b2JhbF9jb25maWcgKmltc2ljX2dldF9nbG9iYWxfY29uZmlnKHZvaWQpCj4gPiArewo+ID4gKyAg ICAgcmV0dXJuIGltc2ljID8gJmltc2ljLT5nbG9iYWwgOiBOVUxMOwo+ID4gK30KPiA+ICtFWFBP UlRfU1lNQk9MX0dQTChpbXNpY19nZXRfZ2xvYmFsX2NvbmZpZyk7Cj4KPiBXaHkgaXMgdGhpcyBl eHBvcnRlZD8KClRoaXMgaXMgZm9yIHRoZSBLVk0gUklTQy1WIG1vZHVsZS4gV2UgaGF2ZSBmb2xs b3cgdXAKS1ZNIFJJU0MtViBwYXRjaHMgd2hpY2ggbmVlZCB0byBrbm93IHRoZSBJTVNJQyBnbG9i YWwKY29uZmlndXJhdGlvbiBzbyB0aGF0IGl0IGNhbiBhc3NpZ24gSU1TSUMgZ3Vlc3QgZmlsZXMg dG8gYQpHdWVzdC9WTS4KCj4KPiA+ICsjZGVmaW5lIF9faW1zaWNfaWRfcmVhZF9jbGVhcl9lbmFi bGVkKF9faWQpICAgICAgICAgIFwKPiA+ICsgICAgIF9faW1zaWNfZWl4X3JlYWRfY2xlYXIoKF9f aWQpLCBmYWxzZSkKPiA+ICsjZGVmaW5lIF9faW1zaWNfaWRfcmVhZF9jbGVhcl9wZW5kaW5nKF9f aWQpICAgICAgICAgIFwKPiA+ICsgICAgIF9faW1zaWNfZWl4X3JlYWRfY2xlYXIoKF9faWQpLCB0 cnVlKQo+Cj4gUGxlYXNlIHVzZSBpbmxpbmVzLgoKT2theSwgSSB3aWxsIHVwZGF0ZS4KCj4KPiA+ ICt2b2lkIF9faW1zaWNfZWl4X3VwZGF0ZSh1bnNpZ25lZCBsb25nIGJhc2VfaWQsCj4gPiArICAg ICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBudW1faWQsIGJvb2wgcGVuZCwgYm9vbCB2 YWwpCj4gPiArewo+ID4gKyAgICAgdW5zaWduZWQgbG9uZyBpLCBpc2VsLCBpcmVnOwo+ID4gKyAg ICAgdW5zaWduZWQgbG9uZyBpZCA9IGJhc2VfaWQsIGxhc3RfaWQgPSBiYXNlX2lkICsgbnVtX2lk Owo+ID4gKwo+ID4gKyAgICAgd2hpbGUgKGlkIDwgbGFzdF9pZCkgewo+ID4gKyAgICAgICAgICAg ICBpc2VsID0gaWQgLyBCSVRTX1BFUl9MT05HOwo+ID4gKyAgICAgICAgICAgICBpc2VsICo9IEJJ VFNfUEVSX0xPTkcgLyBJTVNJQ19FSVB4X0JJVFM7Cj4gPiArICAgICAgICAgICAgIGlzZWwgKz0g KHBlbmQpID8gSU1TSUNfRUlQMCA6IElNU0lDX0VJRTA7Cj4gPiArCj4gPiArICAgICAgICAgICAg IGlyZWcgPSAwOwo+ID4gKyAgICAgICAgICAgICBmb3IgKGkgPSBpZCAmIChfX3Jpc2N2X3hsZW4g LSAxKTsKPiA+ICsgICAgICAgICAgICAgICAgICAoaWQgPCBsYXN0X2lkKSAmJiAoaSA8IF9fcmlz Y3ZfeGxlbik7IGkrKykgewo+ID4gKyAgICAgICAgICAgICAgICAgICAgIGlyZWcgfD0gQklUKGkp Owo+ID4gKyAgICAgICAgICAgICAgICAgICAgIGlkKys7Cj4gPiArICAgICAgICAgICAgIH0KPgo+ IFRoaXMgbGFja3MgYSBjb21tZW50IHdoYXQgdGhpcyBpcyBkb2luZy4KCk9rYXksIEkgd2lsbCBh ZGQgYSBjb21tZW50IGJsb2NrLgoKPgo+ID4gKwo+ID4gKyAgICAgICAgICAgICAvKgo+ID4gKyAg ICAgICAgICAgICAgKiBUaGUgSU1TSUMgRUlFeCBhbmQgRUlQeCByZWdpc3RlcnMgYXJlIGluZGly ZWN0bHkKPiA+ICsgICAgICAgICAgICAgICogYWNjZXNzZWQgdmlhIHVzaW5nIElTRUxFQ1QgYW5k IElSRUcgQ1NScyBzbyB3ZQo+ID4gKyAgICAgICAgICAgICAgKiBuZWVkIHRvIGFjY2VzcyB0aGVz ZSBDU1JzIHdpdGhvdXQgZ2V0dGluZyBwcmVlbXB0ZWQuCj4gPiArICAgICAgICAgICAgICAqCj4g PiArICAgICAgICAgICAgICAqIEFsbCBleGlzdGluZyB1c2VycyBvZiB0aGlzIGZ1bmN0aW9uIGNh bGwgdGhpcwo+ID4gKyAgICAgICAgICAgICAgKiBmdW5jdGlvbiB3aXRoIGxvY2FsIElSUXMgZGlz YWJsZWQgc28gd2UgZG9uJ3QKPiA+ICsgICAgICAgICAgICAgICogbmVlZCB0byBkbyBhbnl0aGlu ZyBzcGVjaWFsIGhlcmUuCj4gPiArICAgICAgICAgICAgICAqLwo+ID4gKyAgICAgICAgICAgICBp ZiAodmFsKQo+ID4gKyAgICAgICAgICAgICAgICAgICAgIGltc2ljX2Nzcl9zZXQoaXNlbCwgaXJl Zyk7Cj4gPiArICAgICAgICAgICAgIGVsc2UKPiA+ICsgICAgICAgICAgICAgICAgICAgICBpbXNp Y19jc3JfY2xlYXIoaXNlbCwgaXJlZyk7Cj4gPiArICAgICB9Cj4gPiArfQo+ID4gKwo+ID4gK3Zv aWQgaW1zaWNfbG9jYWxfc3luYyh2b2lkKQo+ID4gK3sKPiA+ICsgICAgIHN0cnVjdCBpbXNpY19s b2NhbF9wcml2ICpscHJpdiA9IHRoaXNfY3B1X3B0cihpbXNpYy0+bHByaXYpOwo+ID4gKyAgICAg c3RydWN0IGltc2ljX2xvY2FsX2NvbmZpZyAqbWxvY2FsOwo+ID4gKyAgICAgc3RydWN0IGltc2lj X3ZlY3RvciAqbXZlYzsKPiA+ICsgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Cj4gPiArICAgICBp bnQgaTsKPiA+ICsKPiA+ICsgICAgIHJhd19zcGluX2xvY2tfaXJxc2F2ZSgmbHByaXYtPmlkc19s b2NrLCBmbGFncyk7Cj4gPiArICAgICBmb3IgKGkgPSAxOyBpIDw9IGltc2ljLT5nbG9iYWwubnJf aWRzOyBpKyspIHsKPiA+ICsgICAgICAgICAgICAgaWYgKGkgPT0gSU1TSUNfSVBJX0lEKQo+ID4g KyAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwo+ID4gKwo+ID4gKyAgICAgICAgICAgICBp ZiAodGVzdF9iaXQoaSwgbHByaXYtPmlkc19lbmFibGVkX2JpdG1hcCkpCj4gPiArICAgICAgICAg ICAgICAgICAgICAgX19pbXNpY19pZF9zZXRfZW5hYmxlKGkpOwo+ID4gKyAgICAgICAgICAgICBl bHNlCj4gPiArICAgICAgICAgICAgICAgICAgICAgX19pbXNpY19pZF9jbGVhcl9lbmFibGUoaSk7 Cj4gPiArCj4gPiArICAgICAgICAgICAgIG12ZWMgPSBscHJpdi0+aWRzX21vdmVbaV07Cj4gPiAr ICAgICAgICAgICAgIGxwcml2LT5pZHNfbW92ZVtpXSA9IE5VTEw7Cj4gPiArICAgICAgICAgICAg IGlmIChtdmVjKSB7Cj4gPiArICAgICAgICAgICAgICAgICAgICAgaWYgKF9faW1zaWNfaWRfcmVh ZF9jbGVhcl9wZW5kaW5nKGkpKSB7Cj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICBt bG9jYWwgPSBwZXJfY3B1X3B0cihpbXNpYy0+Z2xvYmFsLmxvY2FsLAo+ID4gKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXZlYy0+Y3B1KTsKPiA+ICsg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlbF9yZWxheGVkKG12ZWMtPmxvY2FsX2lk LCBtbG9jYWwtPm1zaV92YSk7Cj4gPiArICAgICAgICAgICAgICAgICAgICAgfQo+ID4gKwo+ID4g KyAgICAgICAgICAgICAgICAgICAgIGltc2ljX3ZlY3Rvcl9mcmVlKCZscHJpdi0+dmVjdG9yc1tp XSk7Cj4gPiArICAgICAgICAgICAgIH0KPgo+IEFnYWluIGFuIHVuY29tbWVudGVkIHBpZWNlIG9m IG1hZ2ljIHdoaWNoIHlvdSB3aWxsIGhhdmUgZm9yZ290dGVuIHdoYXQKPiBpdCBkb2VzIDMgbW9u dGggZG93biB0aGUgcm9hZCA6KQoKU3VyZSwgSSB3aWxsIGFkZCBhIGNvbW1lbnQgYmxvY2suCgo+ Cj4gPiArCj4gPiArICAgICB9Cj4gPiArICAgICByYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgm bHByaXYtPmlkc19sb2NrLCBmbGFncyk7Cj4gPiArfQo+ID4gKwo+ID4gK3ZvaWQgaW1zaWNfbG9j YWxfZGVsaXZlcnkoYm9vbCBlbmFibGUpCj4gPiArewo+ID4gKyAgICAgaWYgKGVuYWJsZSkgewo+ ID4gKyAgICAgICAgICAgICBpbXNpY19jc3Jfd3JpdGUoSU1TSUNfRUlUSFJFU0hPTEQsIElNU0lD X0VOQUJMRV9FSVRIUkVTSE9MRCk7Cj4gPiArICAgICAgICAgICAgIGltc2ljX2Nzcl93cml0ZShJ TVNJQ19FSURFTElWRVJZLCBJTVNJQ19FTkFCTEVfRUlERUxJVkVSWSk7Cj4gPiArICAgICAgICAg ICAgIHJldHVybjsKPiA+ICsgICAgIH0KPiA+ICsKPiA+ICsgICAgIGltc2ljX2Nzcl93cml0ZShJ TVNJQ19FSURFTElWRVJZLCBJTVNJQ19ESVNBQkxFX0VJREVMSVZFUlkpOwo+ID4gKyAgICAgaW1z aWNfY3NyX3dyaXRlKElNU0lDX0VJVEhSRVNIT0xELCBJTVNJQ19ESVNBQkxFX0VJVEhSRVNIT0xE KTsKPiA+ICt9Cj4gPiArCj4gPiArI2lmZGVmIENPTkZJR19TTVAKPiA+ICtzdGF0aWMgdm9pZCBp bXNpY19yZW1vdGVfc3luYyh1bnNpZ25lZCBpbnQgY3B1KQo+ID4gK3sKPiA+ICsgICAgIC8qCj4g PiArICAgICAgKiBXZSBzaW1wbHkgaW5qZWN0IElEIHN5bmNocm9uaXphdGlvbiBJUEkgdG8gYSB0 YXJnZXQgQ1BVCj4gPiArICAgICAgKiBpZiBpdCBpcyBub3Qgc2FtZSBhcyB0aGUgY3VycmVudCBD UFUuIFRoZSBpcGlfc2VuZF9tYXNrKCkKPiA+ICsgICAgICAqIGltcGxlbWVudGF0aW9uIG9mIElQ SSBtdXggd2lsbCBpbmplY3QgSUQgc3luY2hyb25pemF0aW9uCj4gPiArICAgICAgKiBJUEkgb25s eSBmb3IgQ1BVcyB0aGF0IGhhdmUgZW5hYmxlZCBpdCBzbyBvZmZsaW5lIENQVXMKPiA+ICsgICAg ICAqIHdvbid0IHJlY2VpdmUgSVBJLiBBbiBvZmZsaW5lIENQVSB3aWxsIHVuY29uZGl0aW9uYWxs eQo+ID4gKyAgICAgICogc3luY2hyb25pemUgSURzIHRocm91Z2ggaW1zaWNfc3RhcnRpbmdfY3B1 KCkgd2hlbiB0aGUKPiA+ICsgICAgICAqIENQVSBpcyBicm91Z2h0IHVwLgo+ID4gKyAgICAgICov Cj4gPiArICAgICBpZiAoY3B1X29ubGluZShjcHUpKSB7Cj4gPiArICAgICAgICAgICAgIGlmIChj cHUgIT0gc21wX3Byb2Nlc3Nvcl9pZCgpKQo+ID4gKyAgICAgICAgICAgICAgICAgICAgIF9faXBp X3NlbmRfbWFzayhpbXNpYy0+aXBpX2xzeW5jX2Rlc2MsIGNwdW1hc2tfb2YoY3B1KSk7Cj4KPiBT dGlsbCB3b25kZXJpbmcgd2h5IHRoaXMgY2FuJ3QgdXNlIHRoZSByZWd1bGFyIEFQSS4gVGhlcmUg bWlnaHQgYmUgYQo+IHJlYXNvbiwgYnV0IHRoZW4gaXQgd2FudHMgdG8gYmUgZG9jdW1lbnRlZC4K CkFzIG1lbnRpb25lZCBhYm92ZSwgdGhlICJpcGlfdmlycSIgYW5kICJpcnFfbHN5bmNfZGVzYyIg d2lsbApiZSByZXBsYWNlZCBieSBhIHBlci1DUFUgdGltZXIgaW4gdGhlIG5leHQgcmV2aXNpb24u Cgo+Cj4gPiArICAgICAgICAgICAgIGVsc2UKPiA+ICsgICAgICAgICAgICAgICAgICAgICBpbXNp Y19sb2NhbF9zeW5jKCk7Cj4gPiArICAgICB9Cj4gPiArfQo+ID4gKyNlbHNlCj4gPiArc3RhdGlj IGlubGluZSB2b2lkIGltc2ljX3JlbW90ZV9zeW5jKHVuc2lnbmVkIGludCBjcHUpCj4gPiArewo+ ID4gKyAgICAgaW1zaWNfbG9jYWxfc3luYygpOwo+ID4gK30KPiA+ICsjZW5kaWYKPiA+ICsKPiA+ ICt2b2lkIGltc2ljX3ZlY3Rvcl9tYXNrKHN0cnVjdCBpbXNpY192ZWN0b3IgKnZlYykKPiA+ICt7 Cj4gPiArICAgICBzdHJ1Y3QgaW1zaWNfbG9jYWxfcHJpdiAqbHByaXY7Cj4gPiArICAgICB1bnNp Z25lZCBsb25nIGZsYWdzOwo+ID4gKwo+ID4gKyAgICAgbHByaXYgPSBwZXJfY3B1X3B0cihpbXNp Yy0+bHByaXYsIHZlYy0+Y3B1KTsKPiA+ICsgICAgIGlmIChXQVJOX09OKCZscHJpdi0+dmVjdG9y c1t2ZWMtPmxvY2FsX2lkXSAhPSB2ZWMpKQo+ID4gKyAgICAgICAgICAgICByZXR1cm47Cj4gPiAr Cj4gPiArICAgICByYXdfc3Bpbl9sb2NrX2lycXNhdmUoJmxwcml2LT5pZHNfbG9jaywgZmxhZ3Mp Owo+Cj4gQUZBSUNULCB0aGlzIGlzIHVzZWQgZnJvbSBhbiBpcnFjaGlwIGNhbGxiYWNrOgo+Cj4g c3RhdGljIHZvaWQgaW1zaWNfaXJxX21hc2soc3RydWN0IGlycV9kYXRhICpkKQo+IHsKPiAgICAg ICAgIGltc2ljX3ZlY3Rvcl9tYXNrKGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpKTsKPiB9 Cj4KPiBTbyBubyBuZWVkIHRvIHVzZSBpcnFzYXZlKCkgaGVyZS4gVGhvc2UgY2FsbGJhY2tzIHJ1 biBhbHdheXMgd2l0aAo+IGludGVycnVwdHMgZGlzYWJsZWQgd2hlbiBjYWxsZWQgZnJvbSB0aGUg Y29yZS4KCk9rYXksIEkgd2lsbCB1cGRhdGUuCgo+Cj4gPiArdm9pZCBpbXNpY192ZWN0b3JfbW92 ZShzdHJ1Y3QgaW1zaWNfdmVjdG9yICpvbGRfdmVjLAo+ID4gKyAgICAgICAgICAgICAgICAgICAg IHN0cnVjdCBpbXNpY192ZWN0b3IgKm5ld192ZWMpCj4gPiArewo+ID4gKyAgICAgc3RydWN0IGlt c2ljX2xvY2FsX3ByaXYgKm9sZF9scHJpdiwgKm5ld19scHJpdjsKPiA+ICsgICAgIHVuc2lnbmVk IGxvbmcgZmxhZ3MsIGZsYWdzMTsKPiA+ICsKPiA+ICsgICAgIGlmIChXQVJOX09OKG9sZF92ZWMt PmNwdSA9PSBuZXdfdmVjLT5jcHUpKQo+ID4gKyAgICAgICAgICAgICByZXR1cm47Cj4gPiArCj4g PiArICAgICBvbGRfbHByaXYgPSBwZXJfY3B1X3B0cihpbXNpYy0+bHByaXYsIG9sZF92ZWMtPmNw dSk7Cj4gPiArICAgICBpZiAoV0FSTl9PTigmb2xkX2xwcml2LT52ZWN0b3JzW29sZF92ZWMtPmxv Y2FsX2lkXSAhPSBvbGRfdmVjKSkKPiA+ICsgICAgICAgICAgICAgcmV0dXJuOwo+ID4gKwo+ID4g KyAgICAgbmV3X2xwcml2ID0gcGVyX2NwdV9wdHIoaW1zaWMtPmxwcml2LCBuZXdfdmVjLT5jcHUp Owo+ID4gKyAgICAgaWYgKFdBUk5fT04oJm5ld19scHJpdi0+dmVjdG9yc1tuZXdfdmVjLT5sb2Nh bF9pZF0gIT0gbmV3X3ZlYykpCj4gPiArICAgICAgICAgICAgIHJldHVybjsKPiA+ICsKPiA+ICsg ICAgIHJhd19zcGluX2xvY2tfaXJxc2F2ZSgmb2xkX2xwcml2LT5pZHNfbG9jaywgZmxhZ3MpOwo+ ID4gKyAgICAgcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZuZXdfbHByaXYtPmlkc19sb2NrLCBmbGFn czEpOwo+Cj4gTG9ja2RlcCBzaG91bGQgeWVsbCBhdCB5b3UgZm9yIHRoaXMsIHJpZ2h0ZnVsbHkg c28uIEFuZCBub3Qgb25seSBiZWNhdXNlCj4gb2YgdGhlIG1pc3NpbmcgbmVzdGVkKCkgYW5ub3Rh dGlvbi4KPgo+IEFzc3VtZSB0aGVyZSBhcmUgdHdvIENQVXMgc2V0dGluZyBhZmZpbml0eSBmb3Ig dHdvIGRpZmZlcmVudCBpbnRlcnJ1cHRzLgo+Cj4gQ1BVMCBtb3ZlcyBhbiBpbnRlcnJ1cHQgdG8g Q1BVMSBhbmQgQ1BVMSBtb3ZlcyBhbm90aGVyIGludGVycnVwdCB0bwo+IENQVTAuIFRoZSByZXN1 bHRpbmcgbG9jayBvcmRlciBpczoKPgo+IENQVTAgICAgICAgICAgICAgICAgICAgICBDUFUxCj4g bG9jayhscHJpdltDUFUwXSk7ICAgICAgIGxvY2sobHByaXZbQ1BVMV0pOwo+IGxvY2sobHByaXZb Q1BVMV0pOyAgICAgICBsb2NrKGxwcml2W0NQVTBdKTsKPgo+IGEgY2xhc3NpYyBBQkJBIGRlYWRs b2NrLgo+Cj4gWW91IG5lZWQgdG8gdGFrZSB0aG9zZSBsb2NrcyBhbHdheXMgaW4gdGhlIHNhbWUg b3JkZXIuIExvb2sgYXQKPiBkb3VibGVfcmF3X2xvY2soKSBpbiBrZXJuZWwvc2NoZWQvc2NoZWQu aC4KCkkgaGF2ZSBzaW1wbGlmaWVkIHRoZSBsb2NraW5nIHRvIGF2b2lkIHRoaXMgbmVzdGVkIGxv Y2tzIHNvIHRoaXMKd2lsbCBiZSBtdWNoIHNpbXBsZXIgd2l0aG91dCBhbnkgbG9jayBuZXN0aW5n LgoKPgo+ID4gKyAgICAgLyogVW5tYXNrIHRoZSBuZXcgdmVjdG9yIGVudHJ5ICovCj4gPiArICAg ICBpZiAodGVzdF9iaXQob2xkX3ZlYy0+bG9jYWxfaWQsIG9sZF9scHJpdi0+aWRzX2VuYWJsZWRf Yml0bWFwKSkKPiA+ICsgICAgICAgICAgICAgYml0bWFwX3NldChuZXdfbHByaXYtPmlkc19lbmFi bGVkX2JpdG1hcCwKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICBuZXdfdmVjLT5sb2NhbF9p ZCwgMSk7Cj4KPiBFaXRoZXIgbWFrZSB0aGF0IG9uZSBsaW5lIG9yIHBsZWFzZSBhZGQgYnJhY2tl dHMuIFNlZToKPgo+ICAgaHR0cHM6Ly93d3cua2VybmVsLm9yZy9kb2MvaHRtbC9sYXRlc3QvcHJv Y2Vzcy9tYWludGFpbmVyLXRpcC5odG1sI2JyYWNrZXQtcnVsZXMKCk9rYXksIEkgd2lsbCB1cGRh dGUuCgo+Cj4gPiArc3RhdGljIGludCBfX2luaXQgaW1zaWNfbG9jYWxfaW5pdCh2b2lkKQo+ID4g K3sKPiA+ICsgICAgIHN0cnVjdCBpbXNpY19nbG9iYWxfY29uZmlnICpnbG9iYWwgPSAmaW1zaWMt Pmdsb2JhbDsKPiA+ICsgICAgIHN0cnVjdCBpbXNpY19sb2NhbF9wcml2ICpscHJpdjsKPiA+ICsg ICAgIHN0cnVjdCBpbXNpY192ZWN0b3IgKnZlYzsKPiA+ICsgICAgIGludCBjcHUsIGk7Cj4gPiAr Cj4gPiArICAgICAvKiBBbGxvY2F0ZSBwZXItQ1BVIHByaXZhdGUgc3RhdGUgKi8KPiA+ICsgICAg IGltc2ljLT5scHJpdiA9IGFsbG9jX3BlcmNwdSh0eXBlb2YoKihpbXNpYy0+bHByaXYpKSk7Cj4g PiArICAgICBpZiAoIWltc2ljLT5scHJpdikKPiA+ICsgICAgICAgICAgICAgcmV0dXJuIC1FTk9N RU07Cj4gPiArCj4gPiArICAgICAvKiBTZXR1cCBwZXItQ1BVIHByaXZhdGUgc3RhdGUgKi8KPiA+ ICsgICAgIGZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKPiA+ICsgICAgICAgICAgICAgbHBy aXYgPSBwZXJfY3B1X3B0cihpbXNpYy0+bHByaXYsIGNwdSk7Cj4gPiArCj4gPiArICAgICAgICAg ICAgIHJhd19zcGluX2xvY2tfaW5pdCgmbHByaXYtPmlkc19sb2NrKTsKPiA+ICsKPiA+ICsgICAg ICAgICAgICAgLyogQWxsb2NhdGUgZW5hYmxlZCBiaXRtYXAgKi8KPiA+ICsgICAgICAgICAgICAg bHByaXYtPmlkc19lbmFibGVkX2JpdG1hcCA9IGJpdG1hcF96YWxsb2MoZ2xvYmFsLT5ucl9pZHMg KyAxLAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBHRlBfS0VSTkVMKTsKPiA+ICsgICAgICAgICAgICAgaWYgKCFscHJpdi0+aWRzX2Vu YWJsZWRfYml0bWFwKSB7Cj4gPiArICAgICAgICAgICAgICAgICAgICAgaW1zaWNfbG9jYWxfY2xl YW51cCgpOwo+ID4gKyAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOwo+ID4gKyAg ICAgICAgICAgICB9Cj4gPiArCj4gPiArICAgICAgICAgICAgIC8qIEFsbG9jYXRlIG1vdmUgYXJy YXkgKi8KPiA+ICsgICAgICAgICAgICAgbHByaXYtPmlkc19tb3ZlID0ga2NhbGxvYyhnbG9iYWwt Pm5yX2lkcyArIDEsCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNp emVvZigqbHByaXYtPmlkc19tb3ZlKSwgR0ZQX0tFUk5FTCk7Cj4gPiArICAgICAgICAgICAgIGlm ICghbHByaXYtPmlkc19tb3ZlKSB7Cj4gPiArICAgICAgICAgICAgICAgICAgICAgaW1zaWNfbG9j YWxfY2xlYW51cCgpOwo+ID4gKyAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOwo+ ID4gKyAgICAgICAgICAgICB9Cj4gPiArCj4gPiArICAgICAgICAgICAgIC8qIEFsbG9jYXRlIHZl Y3RvciBhcnJheSAqLwo+ID4gKyAgICAgICAgICAgICBscHJpdi0+dmVjdG9ycyA9IGtjYWxsb2Mo Z2xvYmFsLT5ucl9pZHMgKyAxLAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgc2l6ZW9mKCpscHJpdi0+dmVjdG9ycyksIEdGUF9LRVJORUwpOwo+ID4gKyAgICAgICAg ICAgICBpZiAoIWxwcml2LT52ZWN0b3JzKSB7Cj4gPiArICAgICAgICAgICAgICAgICAgICAgaW1z aWNfbG9jYWxfY2xlYW51cCgpOwo+ID4gKyAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRU5P TUVNOwo+Cj4gVGhpcmQgaW5zdGFuY2Ugb2YgdGhlIHNhbWUgcGF0dGVybi4gZ290byBjbGVhbnVw OyBwZXJoYXBzPwoKT2theSwgSSB3aWxsIGFkZCBnb3RvIGhlcmUuCgo+Cj4gPiArc3RydWN0IGlt c2ljX3ZlY3RvciAqaW1zaWNfdmVjdG9yX2FsbG9jKHVuc2lnbmVkIGludCBod2lycSwKPiA+ICsg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGNwdW1hc2sg Km1hc2spCj4gPiArewo+ID4gKyAgICAgc3RydWN0IGltc2ljX3ZlY3RvciAqdmVjID0gTlVMTDsK PiA+ICsgICAgIHN0cnVjdCBpbXNpY19sb2NhbF9wcml2ICpscHJpdjsKPiA+ICsgICAgIHVuc2ln bmVkIGxvbmcgZmxhZ3M7Cj4gPiArICAgICB1bnNpZ25lZCBpbnQgY3B1Owo+ID4gKyAgICAgaW50 IGxvY2FsX2lkOwo+ID4gKwo+ID4gKyAgICAgcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZpbXNpYy0+ bWF0cml4X2xvY2ssIGZsYWdzKTsKPiA+ICsgICAgIGxvY2FsX2lkID0gaXJxX21hdHJpeF9hbGxv YyhpbXNpYy0+bWF0cml4LCBtYXNrLCBmYWxzZSwgJmNwdSk7Cj4gPiArICAgICByYXdfc3Bpbl91 bmxvY2tfaXJxcmVzdG9yZSgmaW1zaWMtPm1hdHJpeF9sb2NrLCBmbGFncyk7Cj4gPiArICAgICBp ZiAobG9jYWxfaWQgPCAwKQo+ID4gKyAgICAgICAgICAgICByZXR1cm4gTlVMTDsKPiA+ICsKPiA+ ICsgICAgIGxwcml2ID0gcGVyX2NwdV9wdHIoaW1zaWMtPmxwcml2LCBjcHUpOwo+ID4gKyAgICAg dmVjID0gJmxwcml2LT52ZWN0b3JzW2xvY2FsX2lkXTsKPiA+ICsgICAgIHZlYy0+aHdpcnEgPSBo d2lycTsKPiA+ICsKPiA+ICsgICAgIHJldHVybiB2ZWM7Cj4gPiArfQo+Cj4gLi4uCj4KPiA+ICtp bnQgaW1zaWNfaHdpcnFfYWxsb2Modm9pZCkKPiA+ICt7Cj4gPiArICAgICBpbnQgcmV0Owo+ID4g KyAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKPiA+ICsKPiA+ICsgICAgIHJhd19zcGluX2xvY2tf aXJxc2F2ZSgmaW1zaWMtPmh3aXJxc19sb2NrLCBmbGFncyk7Cj4gPiArICAgICByZXQgPSBiaXRt YXBfZmluZF9mcmVlX3JlZ2lvbihpbXNpYy0+aHdpcnFzX3VzZWRfYml0bWFwLAo+ID4gKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1zaWMtPm5yX2h3aXJxcywgMCk7Cj4gPiAr ICAgICByYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW1zaWMtPmh3aXJxc19sb2NrLCBmbGFn cyk7Cj4gPiArCj4gPiArICAgICByZXR1cm4gcmV0Owo+ID4gK30KPgo+IFRoaXMgcGFydCBpcyBq dXN0IHRvIGNyZWF0ZSBhIHVuaXF1ZSBod2lycSBudW1iZXIsIHJpZ2h0PwoKWWVzLCB0aGlzIGlz IG9ubHkgZm9yIHVuaXF1ZSBod2lycS4gV2UgY2FuIGRpcmVjdGx5IHVzZSB2aXJxCmluc3RlYWQg b2YgaHdpcnEgc28gdGhpcyBod2lycSBhbGxvY2F0aW9uL21hbmFnZW1lbnQgd2lsbApnbyBhd2F5 IGluIHRoZSBuZXh0IHJldmlzaW9uLgoKPgo+ID4gKwo+ID4gKyAgICAgLyogRmluZCBudW1iZXIg b2YgZ3Vlc3QgaW5kZXggYml0cyBpbiBNU0kgYWRkcmVzcyAqLwo+ID4gKyAgICAgcmMgPSBvZl9w cm9wZXJ0eV9yZWFkX3UzMih0b19vZl9ub2RlKGZ3bm9kZSksCj4gPiArICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICJyaXNjdixndWVzdC1pbmRleC1iaXRzIiwKPiA+ICsgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgJmdsb2JhbC0+Z3Vlc3RfaW5kZXhfYml0cyk7Cj4gPiArICAg ICBpZiAocmMpCj4gPiArICAgICAgICAgICAgIGdsb2JhbC0+Z3Vlc3RfaW5kZXhfYml0cyA9IDA7 Cj4KPiBTbyBoZXJlIHlvdSBnZXQgdGhlIGluZGV4IGJpdHMsIGJ1dCB0aGVuIDUwIGxpbmVzIGZ1 cnRoZXIgZG93biB5b3UgZG8KPiBzYW5pdHkgY2hlY2tpbmcuIFdvdWxkbid0IGl0IG1ha2Ugc2Vu c2UgdG8gZG8gdGhhdCByaWdodCBoZXJlPwo+Cj4gU2FtZSBmb3IgdGhlIG90aGVyIGJpdHMuCgpU aGlzIGlzIGludGVudGlvbmFsIGJlY2F1c2Ugd2UgYWxyZWFkeSBoYXZlIGEgQUlBIEFDUEkgc2Vy aWVzCndoZXJlIHRoaXMgaGVscHMgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2YgImlmIChhY3BpX2Rp c2FibGVkKSIKY2hlY2tzLgoKPgo+ID4gKwo+ID4gKy8qCj4gPiArICogVGhlIElNU0lDIGRyaXZl ciB1c2VzIDEgSVBJIGZvciBJRCBzeW5jaHJvbml6YXRpb24gYW5kCj4gPiArICogYXJjaC9yaXNj di9rZXJuZWwvc21wLmMgcmVxdWlyZSA2IElQSXMgc28gd2UgZml4IHRoZQo+ID4gKyAqIHRvdGFs IG51bWJlciBvZiBJUElzIHRvIDguCj4gPiArICovCj4gPiArI2RlZmluZSBJTVNJQ19JUElfSUQg ICAgICAgICAgICAgICAgICAgICAgICAgMQo+ID4gKyNkZWZpbmUgSU1TSUNfTlJfSVBJICAgICAg ICAgICAgICAgICAgICAgICAgIDgKPiA+ICsKPiA+ICtzdHJ1Y3QgaW1zaWNfdmVjdG9yIHsKPiA+ ICsgICAgIC8qIEZpeGVkIGRldGFpbHMgb2YgdGhlIHZlY3RvciAqLwo+ID4gKyAgICAgdW5zaWdu ZWQgaW50IGNwdTsKPiA+ICsgICAgIHVuc2lnbmVkIGludCBsb2NhbF9pZDsKPiA+ICsgICAgIC8q IERldGFpbHMgc2F2ZWQgYnkgZHJpdmVyIGluIHRoZSB2ZWN0b3IgKi8KPiA+ICsgICAgIHVuc2ln bmVkIGludCBod2lycTsKPiA+ICt9Owo+ID4gKwo+ID4gK3N0cnVjdCBpbXNpY19sb2NhbF9wcml2 IHsKPiA+ICsgICAgIC8qIExvY2FsIHN0YXRlIG9mIGludGVycnVwdCBpZGVudGl0aWVzICovCj4g PiArICAgICByYXdfc3BpbmxvY2tfdCBpZHNfbG9jazsKPiA+ICsgICAgIHVuc2lnbmVkIGxvbmcg Kmlkc19lbmFibGVkX2JpdG1hcDsKPiA+ICsgICAgIHN0cnVjdCBpbXNpY192ZWN0b3IgKippZHNf bW92ZTsKPiA+ICsKPiA+ICsgICAgIC8qIExvY2FsIHZlY3RvciB0YWJsZSAqLwo+ID4gKyAgICAg c3RydWN0IGltc2ljX3ZlY3RvciAqdmVjdG9yczsKPgo+IFBsZWFzZSBtYWtlIHRob3NlIHN0cnVj dHMgdGFidWxhcjoKPgo+IGh0dHBzOi8vd3d3Lmtlcm5lbC5vcmcvZG9jL2h0bWwvbGF0ZXN0L3By b2Nlc3MvbWFpbnRhaW5lci10aXAuaHRtbCNzdHJ1Y3QtZGVjbGFyYXRpb25zLWFuZC1pbml0aWFs aXplcnMKCk9rYXksIEkgd2lsbCB1cGRhdGUuCgo+Cj4gPiArdm9pZCBfX2ltc2ljX2VpeF91cGRh dGUodW5zaWduZWQgbG9uZyBiYXNlX2lkLAo+ID4gKyAgICAgICAgICAgICAgICAgICAgIHVuc2ln bmVkIGxvbmcgbnVtX2lkLCBib29sIHBlbmQsIGJvb2wgdmFsKTsKPiA+ICsKPiA+ICsjZGVmaW5l IF9faW1zaWNfaWRfc2V0X2VuYWJsZShfX2lkKSAgICAgICAgICBcCj4gPiArICAgICBfX2ltc2lj X2VpeF91cGRhdGUoKF9faWQpLCAxLCBmYWxzZSwgdHJ1ZSkKPiA+ICsjZGVmaW5lIF9faW1zaWNf aWRfY2xlYXJfZW5hYmxlKF9faWQpICAgICAgICBcCj4gPiArICAgICBfX2ltc2ljX2VpeF91cGRh dGUoKF9faWQpLCAxLCBmYWxzZSwgZmFsc2UpCj4KPiBpbmxpbmVzIHBsZWFzZS4KCk9rYXksIEkg d2lsbCB1cGRhdGUuCgpSZWdhcmRzLApBbnVwCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fXwpsaW51eC1yaXNjdiBtYWlsaW5nIGxpc3QKbGludXgtcmlzY3ZA bGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xp c3RpbmZvL2xpbnV4LXJpc2N2Cg== 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 49957C5475B for ; Sun, 18 Feb 2024 13:16:51 +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:Cc:To:Subject:Message-ID:Date:From: In-Reply-To:References:MIME-Version:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=CmwQMWJbGs0yk1rlJ8ur0iJm/iE9RMAVdUrVaCgPGAU=; b=jUkiCc5qSrzABY /UGs/NyPcLDeeVID1mFR/6AqWdc8GvbGMBtvGtyeVmNe0mi+61LjYtWUukTyn0TlaKLGBHidMQt8+ wbclJ2eHc2XZnHLAIzjkGLqYUOkVHnQzIKgAObNc+ZWfpNR1enosdHIDso8wEfGQesD1MzDRNOzXj +SSO9eqQrAY/enEJUJT4HqzIrQszoNFvtr3RxZGSXqcY31IFt8odpUZ+6UWV9VjM/ifim04Z+qlmg 5/7V2qJEGoHYazTbZc8RrmkG3/+fbXjqgWsIPPBZp+YmSQNwanzWHeVAu5yG9zhWeUbp8y1eOEmAN KkTqDFtokLiYM8CqVIcQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1rbh23-00000007lTk-0uKq; Sun, 18 Feb 2024 13:16:35 +0000 Received: from mail-lj1-x234.google.com ([2a00:1450:4864:20::234]) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1rbh1z-00000007lSo-2YRr for linux-arm-kernel@lists.infradead.org; Sun, 18 Feb 2024 13:16:33 +0000 Received: by mail-lj1-x234.google.com with SMTP id 38308e7fff4ca-2d09cf00214so31001121fa.0 for ; Sun, 18 Feb 2024 05:16:29 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ventanamicro.com; s=google; t=1708262188; x=1708866988; darn=lists.infradead.org; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:from:to:cc:subject:date :message-id:reply-to; bh=vTnKqfoHT1ASyWl8mfZgt45UxVbowkxAeoQ3Mo9HwXc=; b=eru7cZ6bay4RxocHMoA1aY/1VSSn6lsJ5HBjCBkhmIgOrZtc4XzBLzIVyIPOjdwYb0 Hm/eFdJvBZu5VmBCKRHJZrVPBZ47n8+VFuIBguV/ey0MpDl+z+IUo/ai+k0SU2B4eia5 AqwZ92fy8J546gt2qx2egx9an3YZk2DzW05YlhFQfOicYAtKi9hR3Nae2IAyNN6hAJFw NvEe5cthQLEOdzV5ZN5Fxq3zIRCZoKhDwP+Uzuid62VFnDYeaC7CUX51em0RLlRQQIvm SwiL6UR3DmMFTMyNzi7Lu7UdmJkAPM1eOmfDahDxi5viwXoaBRXU8YZEhGjCH5c3CMzT w3mg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1708262188; x=1708866988; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=vTnKqfoHT1ASyWl8mfZgt45UxVbowkxAeoQ3Mo9HwXc=; b=ckLwCxsR8H0xGy1HTPhKSEDidZLpFbB7WUBAfjPgZMA1gXJnTl6Y83X8uQ30fRlnAU fUjq5YcVJ+nnNsieoTegLjg9hlY3LEYSv28ns8nEhm17isl/E0vswszyYdeSVXHnTSk9 Po7ep4oubEiJHUYNXNF+5XjEB57lV03VnG2YwMrIBOnKKifjnWbrk3p6Wlf7t6ehj/B+ XANL/syHwfn86B0xmR85rVwWDfgN/E1uxoy+L6GJO0BR+AvMaUjxukDy98+6x4LWuLvk xuIbPms9zVa/lld1oAwjw6fSplASi/woQfWq5v4ee6WnCHwfg3UqvMcKFYvNktv0a4ez wRUg== X-Forwarded-Encrypted: i=1; AJvYcCWS8P6HtZQuQFzR/j6tKfLbCAOxPL5fWfRha0UC9axuLsCfs/me8ZrADFs9M3Qz4quNPcSGJYvUytbVPNXRoaf12CjU79QwlAKddms/rQhWOfTmj9Q= X-Gm-Message-State: AOJu0YyWf4Zu+lSZ30gfUXGrGtFKbHEQzErseZCBVqrUJBo20sB9ZNRX qzUrcv1DqmtIP1UE4KGC3nB2pbsfDkjCgxAKESw4TwS6aw13XoqVAyZ3C2vb4WdmGhRXghUNJbL qWHI1IEQIsfm+fGDvVQAfqpmnTSh6uFrUGQKUVA== X-Google-Smtp-Source: AGHT+IEhxFBrsWmO2v/7lmMxvcC+n0VDEv/TG5Px5+CBrsNKIhqLY2D6BWfanaJoMUHX54FRaPuMYuvAUjE+oMrz4O0= X-Received: by 2002:a2e:9083:0:b0:2d2:3a0d:b36e with SMTP id l3-20020a2e9083000000b002d23a0db36emr163129ljg.44.1708262187577; Sun, 18 Feb 2024 05:16:27 -0800 (PST) MIME-Version: 1.0 References: <20240127161753.114685-1-apatel@ventanamicro.com> <20240127161753.114685-19-apatel@ventanamicro.com> <87h6i8ckwg.ffs@tglx> In-Reply-To: <87h6i8ckwg.ffs@tglx> From: Anup Patel Date: Sun, 18 Feb 2024 18:46:14 +0530 Message-ID: Subject: Re: [PATCH v12 18/25] irqchip: Add RISC-V incoming MSI controller early driver To: Thomas Gleixner Cc: Palmer Dabbelt , Paul Walmsley , Rob Herring , Krzysztof Kozlowski , Frank Rowand , Conor Dooley , Marc Zyngier , =?UTF-8?B?QmrDtnJuIFTDtnBlbA==?= , Atish Patra , Andrew Jones , Sunil V L , Saravana Kannan , Anup Patel , linux-riscv@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240218_051631_701767_B33DB040 X-CRM114-Status: GOOD ( 45.38 ) 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 T24gU2F0LCBGZWIgMTcsIDIwMjQgYXQgMTI6MTDigK9BTSBUaG9tYXMgR2xlaXhuZXIgPHRnbHhA bGludXRyb25peC5kZT4gd3JvdGU6Cj4KPiBPbiBTYXQsIEphbiAyNyAyMDI0IGF0IDIxOjQ3LCBB bnVwIFBhdGVsIHdyb3RlOgo+ID4gKwo+ID4gKyNpZmRlZiBDT05GSUdfU01QCj4gPiArc3RhdGlj IGlycXJldHVybl90IGltc2ljX2xvY2FsX3N5bmNfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkYXRh KQo+ID4gK3sKPiA+ICsgICAgIGltc2ljX2xvY2FsX3N5bmMoKTsKPiA+ICsgICAgIHJldHVybiBJ UlFfSEFORExFRDsKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIHZvaWQgaW1zaWNfaXBpX3NlbmQo dW5zaWduZWQgaW50IGNwdSkKPiA+ICt7Cj4gPiArICAgICBzdHJ1Y3QgaW1zaWNfbG9jYWxfY29u ZmlnICpsb2NhbCA9Cj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJfY3B1X3B0 cihpbXNpYy0+Z2xvYmFsLmxvY2FsLCBjcHUpOwo+Cj4gTGV0IGl0IHN0aWNrIG91dC4gV2Ugc3dp dGNoZWQgdG8gbGluZSBsZW5ndGggMTAwIHF1aXRlIHNvbWUgdGltZQo+IGFnby4gQXBwbGllcyB0 byB0aGUgcmVzdCBvZiB0aGUgc2VyaWVzIHRvby4KCk9rYXksIEkgd2lsbCB1cGRhdGUuCgo+Cj4g PiArICAgICB3cml0ZWxfcmVsYXhlZChJTVNJQ19JUElfSUQsIGxvY2FsLT5tc2lfdmEpOwo+ID4g K30KPiA+ICsKPiA+ICtzdGF0aWMgdm9pZCBpbXNpY19pcGlfc3RhcnRpbmdfY3B1KHZvaWQpCj4g PiArewo+ID4gKyAgICAgLyogRW5hYmxlIElQSXMgZm9yIGN1cnJlbnQgQ1BVLiAqLwo+ID4gKyAg ICAgX19pbXNpY19pZF9zZXRfZW5hYmxlKElNU0lDX0lQSV9JRCk7Cj4gPiArCj4gPiArICAgICAv KiBFbmFibGUgdmlydHVhbCBJUEkgdXNlZCBmb3IgSU1TSUMgSUQgc3luY2hyb25pemF0aW9uICov Cj4gPiArICAgICBlbmFibGVfcGVyY3B1X2lycShpbXNpYy0+aXBpX3ZpcnEsIDApOwo+ID4gK30K PiA+ICsKPiA+ICtzdGF0aWMgdm9pZCBpbXNpY19pcGlfZHlpbmdfY3B1KHZvaWQpCj4gPiArewo+ ID4gKyAgICAgLyoKPiA+ICsgICAgICAqIERpc2FibGUgdmlydHVhbCBJUEkgdXNlZCBmb3IgSU1T SUMgSUQgc3luY2hyb25pemF0aW9uIHNvCj4gPiArICAgICAgKiB0aGF0IHdlIGRvbid0IHJlY2Vp dmUgSUQgc3luY2hyb25pemF0aW9uIHJlcXVlc3RzLgo+ID4gKyAgICAgICovCj4gPiArICAgICBk aXNhYmxlX3BlcmNwdV9pcnEoaW1zaWMtPmlwaV92aXJxKTsKPgo+IFNob3VsZG4ndCB0aGlzIGRp c2FibGUgdGhlIGhhcmR3YXJlIHRvbywgaS5lLgo+Cj4gICAgICAgICAgIF9faW1zaWNfaWRfY2xl YXJfZW5hYmxlKCkKPgo+ID8KClllcywgaXQgc2hvdWxkIGJ1dCBzb21laG93IEkgbWlzc2VkIGFu ZCBuZXZlciBzYXcgYW55IGlzc3VlLgoKSSB3aWxsIHVwZGF0ZS4KCj4KPiA+ICt9Cj4gPiArCj4g PiArc3RhdGljIGludCBfX2luaXQgaW1zaWNfaXBpX2RvbWFpbl9pbml0KHZvaWQpCj4gPiArewo+ ID4gKyAgICAgaW50IHZpcnE7Cj4gPiArCj4gPiArICAgICAvKiBDcmVhdGUgSU1TSUMgSVBJIG11 bHRpcGxleGluZyAqLwo+ID4gKyAgICAgdmlycSA9IGlwaV9tdXhfY3JlYXRlKElNU0lDX05SX0lQ SSwgaW1zaWNfaXBpX3NlbmQpOwo+ID4gKyAgICAgaWYgKHZpcnEgPD0gMCkKPiA+ICsgICAgICAg ICAgICAgcmV0dXJuICh2aXJxIDwgMCkgPyB2aXJxIDogLUVOT01FTTsKPiA+ICsgICAgIGltc2lj LT5pcGlfdmlycSA9IHZpcnE7Cj4gPiArCj4gPiArICAgICAvKiBGaXJzdCB2SVJRIGlzIHVzZWQg Zm9yIElNU0lDIElEIHN5bmNocm9uaXphdGlvbiAqLwo+ID4gKyAgICAgdmlycSA9IHJlcXVlc3Rf cGVyY3B1X2lycShpbXNpYy0+aXBpX3ZpcnEsIGltc2ljX2xvY2FsX3N5bmNfaGFuZGxlciwKPiA+ ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJpc2N2LWltc2ljLWxzeW5jIiwgaW1z aWMtPmdsb2JhbC5sb2NhbCk7Cj4gPiArICAgICBpZiAodmlycSkKPiA+ICsgICAgICAgICAgICAg cmV0dXJuIHZpcnE7Cj4KPiBQbGVhc2UgdXNlIGEgc2VwYXJhdGUgJ3JldCcgdmFyaWFibGUuIEkg aGFkIHRvIHJlYWQgdGhpcyAzIHRpbWVzIHRvIG1ha2UKPiBzZW5zZSBvZiBpdC4KCk9rYXksIEkg d2lsbCB1cGRhdGUuCgo+Cj4gPiArICAgICBpcnFfc2V0X3N0YXR1c19mbGFncyhpbXNpYy0+aXBp X3ZpcnEsIElSUV9ISURERU4pOwo+ID4gKyAgICAgaW1zaWMtPmlwaV9sc3luY19kZXNjID0gaXJx X3RvX2Rlc2MoaW1zaWMtPmlwaV92aXJxKTsKPgo+IFdoYXQncyBzbyBzcGVjaWFsIGFib3V0IHRo aXMgcGFydGljdWxhciBJUEkgdGhhdCBpdCBjYW4ndCBiZSBoYW5kbGVkCj4gbGlrZSBhbGwgdGhl IG90aGVyIElQSXM/CgpXZSBhcmUgdXNpbmcgdGhpcyBzcGVjaWFsIHVuZGVyLXRoZS1ob29kIElQ SSBmb3Igc3luY2hyb25pemF0aW9uCm9mIElSUSBlbmFibGUvZGlzYWJsZSBhbmQgSVJRIG1vdmVt ZW50IGFjcm9zcyBDUFVzLgoKeDg2IGhhcyBhIG1vcmUgbGF6eSBhcHByb2FjaCBvZiB1c2luZyBh IHBlci1DUFUgdGltZXIgc28gaW4KdGhlIG5leHQgcmV2aXNpb24gSSB3aWxsIG1vdmUgdG8gYSBz aW1pbGFyIGFwcHJvYWNoLiBUaGlzIG1lYW5zCmJvdGggImlwaV92aXJxIiBhbmQgImlwaV9sc3lu Y19kZXNjIiB3aWxsIGdvIGF3YXkuCgo+Cj4gPiArc3RhdGljIGludCBfX2luaXQgaW1zaWNfZWFy bHlfcHJvYmUoc3RydWN0IGZ3bm9kZV9oYW5kbGUgKmZ3bm9kZSkKPiA+ICt7Cj4gPiArICAgICBp bnQgcmM7Cj4gPiArICAgICBzdHJ1Y3QgaXJxX2RvbWFpbiAqZG9tYWluOwo+Cj4gaHR0cHM6Ly93 d3cua2VybmVsLm9yZy9kb2MvaHRtbC9sYXRlc3QvcHJvY2Vzcy9tYWludGFpbmVyLXRpcC5odG1s I3ZhcmlhYmxlLWRlY2xhcmF0aW9ucwoKT2theSwgSSB3aWxsIHVwZGF0ZS4KCj4KPiA+ICsKPiA+ ICsgICAgIC8qIEZpbmQgcGFyZW50IGRvbWFpbiBhbmQgcmVnaXN0ZXIgY2hhaW5lZCBoYW5kbGVy ICovCj4gPiArICAgICBkb21haW4gPSBpcnFfZmluZF9tYXRjaGluZ19md25vZGUocmlzY3ZfZ2V0 X2ludGNfaHdub2RlKCksCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgRE9NQUlOX0JVU19BTlkpOwo+ID4gKyAgICAgaWYgKCFkb21haW4pIHsKPiA+ICsgICAgICAg ICAgICAgcHJfZXJyKCIlcGZ3UDogRmFpbGVkIHRvIGZpbmQgSU5UQyBkb21haW5cbiIsIGZ3bm9k ZSk7Cj4gPiArICAgICAgICAgICAgIHJldHVybiAtRU5PRU5UOwo+ID4gKyAgICAgfQo+ID4gKyAg ICAgaW1zaWNfcGFyZW50X2lycSA9IGlycV9jcmVhdGVfbWFwcGluZyhkb21haW4sIFJWX0lSUV9F WFQpOwo+ID4gKyAgICAgaWYgKCFpbXNpY19wYXJlbnRfaXJxKSB7Cj4gPiArICAgICAgICAgICAg IHByX2VycigiJXBmd1A6IEZhaWxlZCB0byBjcmVhdGUgSU5UQyBtYXBwaW5nXG4iLCBmd25vZGUp Owo+ID4gKyAgICAgICAgICAgICByZXR1cm4gLUVOT0VOVDsKPiA+ICsgICAgIH0KPiA+ICsgICAg IGlycV9zZXRfY2hhaW5lZF9oYW5kbGVyKGltc2ljX3BhcmVudF9pcnEsIGltc2ljX2hhbmRsZV9p cnEpOwo+ID4gKwo+ID4gKyAgICAgLyogSW5pdGlhbGl6ZSBJUEkgZG9tYWluICovCj4gPiArICAg ICByYyA9IGltc2ljX2lwaV9kb21haW5faW5pdCgpOwo+ID4gKyAgICAgaWYgKHJjKSB7Cj4gPiAr ICAgICAgICAgICAgIHByX2VycigiJXBmd1A6IEZhaWxlZCB0byBpbml0aWFsaXplIElQSSBkb21h aW5cbiIsIGZ3bm9kZSk7Cj4gPiArICAgICAgICAgICAgIHJldHVybiByYzsKPgo+IExlYXZlcyB0 aGUgY2hhaW5lZCBoYW5kbGVyIGFyb3VuZCBhbmQgZW5hYmxlZC4KCk9rYXksIEkgd2lsbCBzZXQg dGhlIGNoYWluZWQgaGFuZGVyIGFmdGVyIGltc2ljX2lwaV9kb21haW5faW5pdCgpLgoKPgo+ID4g ZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXJxY2hpcC9pcnEtcmlzY3YtaW1zaWMtc3RhdGUuYyBiL2Ry aXZlcnMvaXJxY2hpcC9pcnEtcmlzY3YtaW1zaWMtc3RhdGUuYwo+ID4gKwo+ID4gKyNkZWZpbmUg aW1zaWNfY3NyX3dyaXRlKF9fYywgX192KSAgICAgICAgICAgIFwKPiA+ICtkbyB7ICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCj4gPiArICAgICBjc3Jfd3JpdGUoQ1NS X0lTRUxFQ1QsIF9fYyk7ICAgICAgICAgICAgXAo+ID4gKyAgICAgY3NyX3dyaXRlKENTUl9JUkVH LCBfX3YpOyAgICAgICAgICAgICAgIFwKPiA+ICt9IHdoaWxlICgwKQo+Cj4gQW55IHJlYXNvbiB3 aHkgdGhlc2UgbWFjcm9zIGNhbid0IGJlIGlubGluZXM/CgpObyBwYXJ0aWN1bGFyIHJlYXNvbi4g SSBhbSBmaW5lIHdpdGggYm90aCBtYXJvcyBhbmQgaW5saW5lIGZ1bmN0aW9ucy4KCkkgd2lsbCB1 cGRhdGUgaW4gdGhlIG5leHQgcmV2aXNpb24uCgo+Cj4gPiArY29uc3Qgc3RydWN0IGltc2ljX2ds b2JhbF9jb25maWcgKmltc2ljX2dldF9nbG9iYWxfY29uZmlnKHZvaWQpCj4gPiArewo+ID4gKyAg ICAgcmV0dXJuIGltc2ljID8gJmltc2ljLT5nbG9iYWwgOiBOVUxMOwo+ID4gK30KPiA+ICtFWFBP UlRfU1lNQk9MX0dQTChpbXNpY19nZXRfZ2xvYmFsX2NvbmZpZyk7Cj4KPiBXaHkgaXMgdGhpcyBl eHBvcnRlZD8KClRoaXMgaXMgZm9yIHRoZSBLVk0gUklTQy1WIG1vZHVsZS4gV2UgaGF2ZSBmb2xs b3cgdXAKS1ZNIFJJU0MtViBwYXRjaHMgd2hpY2ggbmVlZCB0byBrbm93IHRoZSBJTVNJQyBnbG9i YWwKY29uZmlndXJhdGlvbiBzbyB0aGF0IGl0IGNhbiBhc3NpZ24gSU1TSUMgZ3Vlc3QgZmlsZXMg dG8gYQpHdWVzdC9WTS4KCj4KPiA+ICsjZGVmaW5lIF9faW1zaWNfaWRfcmVhZF9jbGVhcl9lbmFi bGVkKF9faWQpICAgICAgICAgIFwKPiA+ICsgICAgIF9faW1zaWNfZWl4X3JlYWRfY2xlYXIoKF9f aWQpLCBmYWxzZSkKPiA+ICsjZGVmaW5lIF9faW1zaWNfaWRfcmVhZF9jbGVhcl9wZW5kaW5nKF9f aWQpICAgICAgICAgIFwKPiA+ICsgICAgIF9faW1zaWNfZWl4X3JlYWRfY2xlYXIoKF9faWQpLCB0 cnVlKQo+Cj4gUGxlYXNlIHVzZSBpbmxpbmVzLgoKT2theSwgSSB3aWxsIHVwZGF0ZS4KCj4KPiA+ ICt2b2lkIF9faW1zaWNfZWl4X3VwZGF0ZSh1bnNpZ25lZCBsb25nIGJhc2VfaWQsCj4gPiArICAg ICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBudW1faWQsIGJvb2wgcGVuZCwgYm9vbCB2 YWwpCj4gPiArewo+ID4gKyAgICAgdW5zaWduZWQgbG9uZyBpLCBpc2VsLCBpcmVnOwo+ID4gKyAg ICAgdW5zaWduZWQgbG9uZyBpZCA9IGJhc2VfaWQsIGxhc3RfaWQgPSBiYXNlX2lkICsgbnVtX2lk Owo+ID4gKwo+ID4gKyAgICAgd2hpbGUgKGlkIDwgbGFzdF9pZCkgewo+ID4gKyAgICAgICAgICAg ICBpc2VsID0gaWQgLyBCSVRTX1BFUl9MT05HOwo+ID4gKyAgICAgICAgICAgICBpc2VsICo9IEJJ VFNfUEVSX0xPTkcgLyBJTVNJQ19FSVB4X0JJVFM7Cj4gPiArICAgICAgICAgICAgIGlzZWwgKz0g KHBlbmQpID8gSU1TSUNfRUlQMCA6IElNU0lDX0VJRTA7Cj4gPiArCj4gPiArICAgICAgICAgICAg IGlyZWcgPSAwOwo+ID4gKyAgICAgICAgICAgICBmb3IgKGkgPSBpZCAmIChfX3Jpc2N2X3hsZW4g LSAxKTsKPiA+ICsgICAgICAgICAgICAgICAgICAoaWQgPCBsYXN0X2lkKSAmJiAoaSA8IF9fcmlz Y3ZfeGxlbik7IGkrKykgewo+ID4gKyAgICAgICAgICAgICAgICAgICAgIGlyZWcgfD0gQklUKGkp Owo+ID4gKyAgICAgICAgICAgICAgICAgICAgIGlkKys7Cj4gPiArICAgICAgICAgICAgIH0KPgo+ IFRoaXMgbGFja3MgYSBjb21tZW50IHdoYXQgdGhpcyBpcyBkb2luZy4KCk9rYXksIEkgd2lsbCBh ZGQgYSBjb21tZW50IGJsb2NrLgoKPgo+ID4gKwo+ID4gKyAgICAgICAgICAgICAvKgo+ID4gKyAg ICAgICAgICAgICAgKiBUaGUgSU1TSUMgRUlFeCBhbmQgRUlQeCByZWdpc3RlcnMgYXJlIGluZGly ZWN0bHkKPiA+ICsgICAgICAgICAgICAgICogYWNjZXNzZWQgdmlhIHVzaW5nIElTRUxFQ1QgYW5k IElSRUcgQ1NScyBzbyB3ZQo+ID4gKyAgICAgICAgICAgICAgKiBuZWVkIHRvIGFjY2VzcyB0aGVz ZSBDU1JzIHdpdGhvdXQgZ2V0dGluZyBwcmVlbXB0ZWQuCj4gPiArICAgICAgICAgICAgICAqCj4g PiArICAgICAgICAgICAgICAqIEFsbCBleGlzdGluZyB1c2VycyBvZiB0aGlzIGZ1bmN0aW9uIGNh bGwgdGhpcwo+ID4gKyAgICAgICAgICAgICAgKiBmdW5jdGlvbiB3aXRoIGxvY2FsIElSUXMgZGlz YWJsZWQgc28gd2UgZG9uJ3QKPiA+ICsgICAgICAgICAgICAgICogbmVlZCB0byBkbyBhbnl0aGlu ZyBzcGVjaWFsIGhlcmUuCj4gPiArICAgICAgICAgICAgICAqLwo+ID4gKyAgICAgICAgICAgICBp ZiAodmFsKQo+ID4gKyAgICAgICAgICAgICAgICAgICAgIGltc2ljX2Nzcl9zZXQoaXNlbCwgaXJl Zyk7Cj4gPiArICAgICAgICAgICAgIGVsc2UKPiA+ICsgICAgICAgICAgICAgICAgICAgICBpbXNp Y19jc3JfY2xlYXIoaXNlbCwgaXJlZyk7Cj4gPiArICAgICB9Cj4gPiArfQo+ID4gKwo+ID4gK3Zv aWQgaW1zaWNfbG9jYWxfc3luYyh2b2lkKQo+ID4gK3sKPiA+ICsgICAgIHN0cnVjdCBpbXNpY19s b2NhbF9wcml2ICpscHJpdiA9IHRoaXNfY3B1X3B0cihpbXNpYy0+bHByaXYpOwo+ID4gKyAgICAg c3RydWN0IGltc2ljX2xvY2FsX2NvbmZpZyAqbWxvY2FsOwo+ID4gKyAgICAgc3RydWN0IGltc2lj X3ZlY3RvciAqbXZlYzsKPiA+ICsgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Cj4gPiArICAgICBp bnQgaTsKPiA+ICsKPiA+ICsgICAgIHJhd19zcGluX2xvY2tfaXJxc2F2ZSgmbHByaXYtPmlkc19s b2NrLCBmbGFncyk7Cj4gPiArICAgICBmb3IgKGkgPSAxOyBpIDw9IGltc2ljLT5nbG9iYWwubnJf aWRzOyBpKyspIHsKPiA+ICsgICAgICAgICAgICAgaWYgKGkgPT0gSU1TSUNfSVBJX0lEKQo+ID4g KyAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwo+ID4gKwo+ID4gKyAgICAgICAgICAgICBp ZiAodGVzdF9iaXQoaSwgbHByaXYtPmlkc19lbmFibGVkX2JpdG1hcCkpCj4gPiArICAgICAgICAg ICAgICAgICAgICAgX19pbXNpY19pZF9zZXRfZW5hYmxlKGkpOwo+ID4gKyAgICAgICAgICAgICBl bHNlCj4gPiArICAgICAgICAgICAgICAgICAgICAgX19pbXNpY19pZF9jbGVhcl9lbmFibGUoaSk7 Cj4gPiArCj4gPiArICAgICAgICAgICAgIG12ZWMgPSBscHJpdi0+aWRzX21vdmVbaV07Cj4gPiAr ICAgICAgICAgICAgIGxwcml2LT5pZHNfbW92ZVtpXSA9IE5VTEw7Cj4gPiArICAgICAgICAgICAg IGlmIChtdmVjKSB7Cj4gPiArICAgICAgICAgICAgICAgICAgICAgaWYgKF9faW1zaWNfaWRfcmVh ZF9jbGVhcl9wZW5kaW5nKGkpKSB7Cj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICBt bG9jYWwgPSBwZXJfY3B1X3B0cihpbXNpYy0+Z2xvYmFsLmxvY2FsLAo+ID4gKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXZlYy0+Y3B1KTsKPiA+ICsg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlbF9yZWxheGVkKG12ZWMtPmxvY2FsX2lk LCBtbG9jYWwtPm1zaV92YSk7Cj4gPiArICAgICAgICAgICAgICAgICAgICAgfQo+ID4gKwo+ID4g KyAgICAgICAgICAgICAgICAgICAgIGltc2ljX3ZlY3Rvcl9mcmVlKCZscHJpdi0+dmVjdG9yc1tp XSk7Cj4gPiArICAgICAgICAgICAgIH0KPgo+IEFnYWluIGFuIHVuY29tbWVudGVkIHBpZWNlIG9m IG1hZ2ljIHdoaWNoIHlvdSB3aWxsIGhhdmUgZm9yZ290dGVuIHdoYXQKPiBpdCBkb2VzIDMgbW9u dGggZG93biB0aGUgcm9hZCA6KQoKU3VyZSwgSSB3aWxsIGFkZCBhIGNvbW1lbnQgYmxvY2suCgo+ Cj4gPiArCj4gPiArICAgICB9Cj4gPiArICAgICByYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgm bHByaXYtPmlkc19sb2NrLCBmbGFncyk7Cj4gPiArfQo+ID4gKwo+ID4gK3ZvaWQgaW1zaWNfbG9j YWxfZGVsaXZlcnkoYm9vbCBlbmFibGUpCj4gPiArewo+ID4gKyAgICAgaWYgKGVuYWJsZSkgewo+ ID4gKyAgICAgICAgICAgICBpbXNpY19jc3Jfd3JpdGUoSU1TSUNfRUlUSFJFU0hPTEQsIElNU0lD X0VOQUJMRV9FSVRIUkVTSE9MRCk7Cj4gPiArICAgICAgICAgICAgIGltc2ljX2Nzcl93cml0ZShJ TVNJQ19FSURFTElWRVJZLCBJTVNJQ19FTkFCTEVfRUlERUxJVkVSWSk7Cj4gPiArICAgICAgICAg ICAgIHJldHVybjsKPiA+ICsgICAgIH0KPiA+ICsKPiA+ICsgICAgIGltc2ljX2Nzcl93cml0ZShJ TVNJQ19FSURFTElWRVJZLCBJTVNJQ19ESVNBQkxFX0VJREVMSVZFUlkpOwo+ID4gKyAgICAgaW1z aWNfY3NyX3dyaXRlKElNU0lDX0VJVEhSRVNIT0xELCBJTVNJQ19ESVNBQkxFX0VJVEhSRVNIT0xE KTsKPiA+ICt9Cj4gPiArCj4gPiArI2lmZGVmIENPTkZJR19TTVAKPiA+ICtzdGF0aWMgdm9pZCBp bXNpY19yZW1vdGVfc3luYyh1bnNpZ25lZCBpbnQgY3B1KQo+ID4gK3sKPiA+ICsgICAgIC8qCj4g PiArICAgICAgKiBXZSBzaW1wbHkgaW5qZWN0IElEIHN5bmNocm9uaXphdGlvbiBJUEkgdG8gYSB0 YXJnZXQgQ1BVCj4gPiArICAgICAgKiBpZiBpdCBpcyBub3Qgc2FtZSBhcyB0aGUgY3VycmVudCBD UFUuIFRoZSBpcGlfc2VuZF9tYXNrKCkKPiA+ICsgICAgICAqIGltcGxlbWVudGF0aW9uIG9mIElQ SSBtdXggd2lsbCBpbmplY3QgSUQgc3luY2hyb25pemF0aW9uCj4gPiArICAgICAgKiBJUEkgb25s eSBmb3IgQ1BVcyB0aGF0IGhhdmUgZW5hYmxlZCBpdCBzbyBvZmZsaW5lIENQVXMKPiA+ICsgICAg ICAqIHdvbid0IHJlY2VpdmUgSVBJLiBBbiBvZmZsaW5lIENQVSB3aWxsIHVuY29uZGl0aW9uYWxs eQo+ID4gKyAgICAgICogc3luY2hyb25pemUgSURzIHRocm91Z2ggaW1zaWNfc3RhcnRpbmdfY3B1 KCkgd2hlbiB0aGUKPiA+ICsgICAgICAqIENQVSBpcyBicm91Z2h0IHVwLgo+ID4gKyAgICAgICov Cj4gPiArICAgICBpZiAoY3B1X29ubGluZShjcHUpKSB7Cj4gPiArICAgICAgICAgICAgIGlmIChj cHUgIT0gc21wX3Byb2Nlc3Nvcl9pZCgpKQo+ID4gKyAgICAgICAgICAgICAgICAgICAgIF9faXBp X3NlbmRfbWFzayhpbXNpYy0+aXBpX2xzeW5jX2Rlc2MsIGNwdW1hc2tfb2YoY3B1KSk7Cj4KPiBT dGlsbCB3b25kZXJpbmcgd2h5IHRoaXMgY2FuJ3QgdXNlIHRoZSByZWd1bGFyIEFQSS4gVGhlcmUg bWlnaHQgYmUgYQo+IHJlYXNvbiwgYnV0IHRoZW4gaXQgd2FudHMgdG8gYmUgZG9jdW1lbnRlZC4K CkFzIG1lbnRpb25lZCBhYm92ZSwgdGhlICJpcGlfdmlycSIgYW5kICJpcnFfbHN5bmNfZGVzYyIg d2lsbApiZSByZXBsYWNlZCBieSBhIHBlci1DUFUgdGltZXIgaW4gdGhlIG5leHQgcmV2aXNpb24u Cgo+Cj4gPiArICAgICAgICAgICAgIGVsc2UKPiA+ICsgICAgICAgICAgICAgICAgICAgICBpbXNp Y19sb2NhbF9zeW5jKCk7Cj4gPiArICAgICB9Cj4gPiArfQo+ID4gKyNlbHNlCj4gPiArc3RhdGlj IGlubGluZSB2b2lkIGltc2ljX3JlbW90ZV9zeW5jKHVuc2lnbmVkIGludCBjcHUpCj4gPiArewo+ ID4gKyAgICAgaW1zaWNfbG9jYWxfc3luYygpOwo+ID4gK30KPiA+ICsjZW5kaWYKPiA+ICsKPiA+ ICt2b2lkIGltc2ljX3ZlY3Rvcl9tYXNrKHN0cnVjdCBpbXNpY192ZWN0b3IgKnZlYykKPiA+ICt7 Cj4gPiArICAgICBzdHJ1Y3QgaW1zaWNfbG9jYWxfcHJpdiAqbHByaXY7Cj4gPiArICAgICB1bnNp Z25lZCBsb25nIGZsYWdzOwo+ID4gKwo+ID4gKyAgICAgbHByaXYgPSBwZXJfY3B1X3B0cihpbXNp Yy0+bHByaXYsIHZlYy0+Y3B1KTsKPiA+ICsgICAgIGlmIChXQVJOX09OKCZscHJpdi0+dmVjdG9y c1t2ZWMtPmxvY2FsX2lkXSAhPSB2ZWMpKQo+ID4gKyAgICAgICAgICAgICByZXR1cm47Cj4gPiAr Cj4gPiArICAgICByYXdfc3Bpbl9sb2NrX2lycXNhdmUoJmxwcml2LT5pZHNfbG9jaywgZmxhZ3Mp Owo+Cj4gQUZBSUNULCB0aGlzIGlzIHVzZWQgZnJvbSBhbiBpcnFjaGlwIGNhbGxiYWNrOgo+Cj4g c3RhdGljIHZvaWQgaW1zaWNfaXJxX21hc2soc3RydWN0IGlycV9kYXRhICpkKQo+IHsKPiAgICAg ICAgIGltc2ljX3ZlY3Rvcl9tYXNrKGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpKTsKPiB9 Cj4KPiBTbyBubyBuZWVkIHRvIHVzZSBpcnFzYXZlKCkgaGVyZS4gVGhvc2UgY2FsbGJhY2tzIHJ1 biBhbHdheXMgd2l0aAo+IGludGVycnVwdHMgZGlzYWJsZWQgd2hlbiBjYWxsZWQgZnJvbSB0aGUg Y29yZS4KCk9rYXksIEkgd2lsbCB1cGRhdGUuCgo+Cj4gPiArdm9pZCBpbXNpY192ZWN0b3JfbW92 ZShzdHJ1Y3QgaW1zaWNfdmVjdG9yICpvbGRfdmVjLAo+ID4gKyAgICAgICAgICAgICAgICAgICAg IHN0cnVjdCBpbXNpY192ZWN0b3IgKm5ld192ZWMpCj4gPiArewo+ID4gKyAgICAgc3RydWN0IGlt c2ljX2xvY2FsX3ByaXYgKm9sZF9scHJpdiwgKm5ld19scHJpdjsKPiA+ICsgICAgIHVuc2lnbmVk IGxvbmcgZmxhZ3MsIGZsYWdzMTsKPiA+ICsKPiA+ICsgICAgIGlmIChXQVJOX09OKG9sZF92ZWMt PmNwdSA9PSBuZXdfdmVjLT5jcHUpKQo+ID4gKyAgICAgICAgICAgICByZXR1cm47Cj4gPiArCj4g PiArICAgICBvbGRfbHByaXYgPSBwZXJfY3B1X3B0cihpbXNpYy0+bHByaXYsIG9sZF92ZWMtPmNw dSk7Cj4gPiArICAgICBpZiAoV0FSTl9PTigmb2xkX2xwcml2LT52ZWN0b3JzW29sZF92ZWMtPmxv Y2FsX2lkXSAhPSBvbGRfdmVjKSkKPiA+ICsgICAgICAgICAgICAgcmV0dXJuOwo+ID4gKwo+ID4g KyAgICAgbmV3X2xwcml2ID0gcGVyX2NwdV9wdHIoaW1zaWMtPmxwcml2LCBuZXdfdmVjLT5jcHUp Owo+ID4gKyAgICAgaWYgKFdBUk5fT04oJm5ld19scHJpdi0+dmVjdG9yc1tuZXdfdmVjLT5sb2Nh bF9pZF0gIT0gbmV3X3ZlYykpCj4gPiArICAgICAgICAgICAgIHJldHVybjsKPiA+ICsKPiA+ICsg ICAgIHJhd19zcGluX2xvY2tfaXJxc2F2ZSgmb2xkX2xwcml2LT5pZHNfbG9jaywgZmxhZ3MpOwo+ ID4gKyAgICAgcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZuZXdfbHByaXYtPmlkc19sb2NrLCBmbGFn czEpOwo+Cj4gTG9ja2RlcCBzaG91bGQgeWVsbCBhdCB5b3UgZm9yIHRoaXMsIHJpZ2h0ZnVsbHkg c28uIEFuZCBub3Qgb25seSBiZWNhdXNlCj4gb2YgdGhlIG1pc3NpbmcgbmVzdGVkKCkgYW5ub3Rh dGlvbi4KPgo+IEFzc3VtZSB0aGVyZSBhcmUgdHdvIENQVXMgc2V0dGluZyBhZmZpbml0eSBmb3Ig dHdvIGRpZmZlcmVudCBpbnRlcnJ1cHRzLgo+Cj4gQ1BVMCBtb3ZlcyBhbiBpbnRlcnJ1cHQgdG8g Q1BVMSBhbmQgQ1BVMSBtb3ZlcyBhbm90aGVyIGludGVycnVwdCB0bwo+IENQVTAuIFRoZSByZXN1 bHRpbmcgbG9jayBvcmRlciBpczoKPgo+IENQVTAgICAgICAgICAgICAgICAgICAgICBDUFUxCj4g bG9jayhscHJpdltDUFUwXSk7ICAgICAgIGxvY2sobHByaXZbQ1BVMV0pOwo+IGxvY2sobHByaXZb Q1BVMV0pOyAgICAgICBsb2NrKGxwcml2W0NQVTBdKTsKPgo+IGEgY2xhc3NpYyBBQkJBIGRlYWRs b2NrLgo+Cj4gWW91IG5lZWQgdG8gdGFrZSB0aG9zZSBsb2NrcyBhbHdheXMgaW4gdGhlIHNhbWUg b3JkZXIuIExvb2sgYXQKPiBkb3VibGVfcmF3X2xvY2soKSBpbiBrZXJuZWwvc2NoZWQvc2NoZWQu aC4KCkkgaGF2ZSBzaW1wbGlmaWVkIHRoZSBsb2NraW5nIHRvIGF2b2lkIHRoaXMgbmVzdGVkIGxv Y2tzIHNvIHRoaXMKd2lsbCBiZSBtdWNoIHNpbXBsZXIgd2l0aG91dCBhbnkgbG9jayBuZXN0aW5n LgoKPgo+ID4gKyAgICAgLyogVW5tYXNrIHRoZSBuZXcgdmVjdG9yIGVudHJ5ICovCj4gPiArICAg ICBpZiAodGVzdF9iaXQob2xkX3ZlYy0+bG9jYWxfaWQsIG9sZF9scHJpdi0+aWRzX2VuYWJsZWRf Yml0bWFwKSkKPiA+ICsgICAgICAgICAgICAgYml0bWFwX3NldChuZXdfbHByaXYtPmlkc19lbmFi bGVkX2JpdG1hcCwKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICBuZXdfdmVjLT5sb2NhbF9p ZCwgMSk7Cj4KPiBFaXRoZXIgbWFrZSB0aGF0IG9uZSBsaW5lIG9yIHBsZWFzZSBhZGQgYnJhY2tl dHMuIFNlZToKPgo+ICAgaHR0cHM6Ly93d3cua2VybmVsLm9yZy9kb2MvaHRtbC9sYXRlc3QvcHJv Y2Vzcy9tYWludGFpbmVyLXRpcC5odG1sI2JyYWNrZXQtcnVsZXMKCk9rYXksIEkgd2lsbCB1cGRh dGUuCgo+Cj4gPiArc3RhdGljIGludCBfX2luaXQgaW1zaWNfbG9jYWxfaW5pdCh2b2lkKQo+ID4g K3sKPiA+ICsgICAgIHN0cnVjdCBpbXNpY19nbG9iYWxfY29uZmlnICpnbG9iYWwgPSAmaW1zaWMt Pmdsb2JhbDsKPiA+ICsgICAgIHN0cnVjdCBpbXNpY19sb2NhbF9wcml2ICpscHJpdjsKPiA+ICsg ICAgIHN0cnVjdCBpbXNpY192ZWN0b3IgKnZlYzsKPiA+ICsgICAgIGludCBjcHUsIGk7Cj4gPiAr Cj4gPiArICAgICAvKiBBbGxvY2F0ZSBwZXItQ1BVIHByaXZhdGUgc3RhdGUgKi8KPiA+ICsgICAg IGltc2ljLT5scHJpdiA9IGFsbG9jX3BlcmNwdSh0eXBlb2YoKihpbXNpYy0+bHByaXYpKSk7Cj4g PiArICAgICBpZiAoIWltc2ljLT5scHJpdikKPiA+ICsgICAgICAgICAgICAgcmV0dXJuIC1FTk9N RU07Cj4gPiArCj4gPiArICAgICAvKiBTZXR1cCBwZXItQ1BVIHByaXZhdGUgc3RhdGUgKi8KPiA+ ICsgICAgIGZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKPiA+ICsgICAgICAgICAgICAgbHBy aXYgPSBwZXJfY3B1X3B0cihpbXNpYy0+bHByaXYsIGNwdSk7Cj4gPiArCj4gPiArICAgICAgICAg ICAgIHJhd19zcGluX2xvY2tfaW5pdCgmbHByaXYtPmlkc19sb2NrKTsKPiA+ICsKPiA+ICsgICAg ICAgICAgICAgLyogQWxsb2NhdGUgZW5hYmxlZCBiaXRtYXAgKi8KPiA+ICsgICAgICAgICAgICAg bHByaXYtPmlkc19lbmFibGVkX2JpdG1hcCA9IGJpdG1hcF96YWxsb2MoZ2xvYmFsLT5ucl9pZHMg KyAxLAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBHRlBfS0VSTkVMKTsKPiA+ICsgICAgICAgICAgICAgaWYgKCFscHJpdi0+aWRzX2Vu YWJsZWRfYml0bWFwKSB7Cj4gPiArICAgICAgICAgICAgICAgICAgICAgaW1zaWNfbG9jYWxfY2xl YW51cCgpOwo+ID4gKyAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOwo+ID4gKyAg ICAgICAgICAgICB9Cj4gPiArCj4gPiArICAgICAgICAgICAgIC8qIEFsbG9jYXRlIG1vdmUgYXJy YXkgKi8KPiA+ICsgICAgICAgICAgICAgbHByaXYtPmlkc19tb3ZlID0ga2NhbGxvYyhnbG9iYWwt Pm5yX2lkcyArIDEsCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNp emVvZigqbHByaXYtPmlkc19tb3ZlKSwgR0ZQX0tFUk5FTCk7Cj4gPiArICAgICAgICAgICAgIGlm ICghbHByaXYtPmlkc19tb3ZlKSB7Cj4gPiArICAgICAgICAgICAgICAgICAgICAgaW1zaWNfbG9j YWxfY2xlYW51cCgpOwo+ID4gKyAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOwo+ ID4gKyAgICAgICAgICAgICB9Cj4gPiArCj4gPiArICAgICAgICAgICAgIC8qIEFsbG9jYXRlIHZl Y3RvciBhcnJheSAqLwo+ID4gKyAgICAgICAgICAgICBscHJpdi0+dmVjdG9ycyA9IGtjYWxsb2Mo Z2xvYmFsLT5ucl9pZHMgKyAxLAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgc2l6ZW9mKCpscHJpdi0+dmVjdG9ycyksIEdGUF9LRVJORUwpOwo+ID4gKyAgICAgICAg ICAgICBpZiAoIWxwcml2LT52ZWN0b3JzKSB7Cj4gPiArICAgICAgICAgICAgICAgICAgICAgaW1z aWNfbG9jYWxfY2xlYW51cCgpOwo+ID4gKyAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRU5P TUVNOwo+Cj4gVGhpcmQgaW5zdGFuY2Ugb2YgdGhlIHNhbWUgcGF0dGVybi4gZ290byBjbGVhbnVw OyBwZXJoYXBzPwoKT2theSwgSSB3aWxsIGFkZCBnb3RvIGhlcmUuCgo+Cj4gPiArc3RydWN0IGlt c2ljX3ZlY3RvciAqaW1zaWNfdmVjdG9yX2FsbG9jKHVuc2lnbmVkIGludCBod2lycSwKPiA+ICsg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGNwdW1hc2sg Km1hc2spCj4gPiArewo+ID4gKyAgICAgc3RydWN0IGltc2ljX3ZlY3RvciAqdmVjID0gTlVMTDsK PiA+ICsgICAgIHN0cnVjdCBpbXNpY19sb2NhbF9wcml2ICpscHJpdjsKPiA+ICsgICAgIHVuc2ln bmVkIGxvbmcgZmxhZ3M7Cj4gPiArICAgICB1bnNpZ25lZCBpbnQgY3B1Owo+ID4gKyAgICAgaW50 IGxvY2FsX2lkOwo+ID4gKwo+ID4gKyAgICAgcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZpbXNpYy0+ bWF0cml4X2xvY2ssIGZsYWdzKTsKPiA+ICsgICAgIGxvY2FsX2lkID0gaXJxX21hdHJpeF9hbGxv YyhpbXNpYy0+bWF0cml4LCBtYXNrLCBmYWxzZSwgJmNwdSk7Cj4gPiArICAgICByYXdfc3Bpbl91 bmxvY2tfaXJxcmVzdG9yZSgmaW1zaWMtPm1hdHJpeF9sb2NrLCBmbGFncyk7Cj4gPiArICAgICBp ZiAobG9jYWxfaWQgPCAwKQo+ID4gKyAgICAgICAgICAgICByZXR1cm4gTlVMTDsKPiA+ICsKPiA+ ICsgICAgIGxwcml2ID0gcGVyX2NwdV9wdHIoaW1zaWMtPmxwcml2LCBjcHUpOwo+ID4gKyAgICAg dmVjID0gJmxwcml2LT52ZWN0b3JzW2xvY2FsX2lkXTsKPiA+ICsgICAgIHZlYy0+aHdpcnEgPSBo d2lycTsKPiA+ICsKPiA+ICsgICAgIHJldHVybiB2ZWM7Cj4gPiArfQo+Cj4gLi4uCj4KPiA+ICtp bnQgaW1zaWNfaHdpcnFfYWxsb2Modm9pZCkKPiA+ICt7Cj4gPiArICAgICBpbnQgcmV0Owo+ID4g KyAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKPiA+ICsKPiA+ICsgICAgIHJhd19zcGluX2xvY2tf aXJxc2F2ZSgmaW1zaWMtPmh3aXJxc19sb2NrLCBmbGFncyk7Cj4gPiArICAgICByZXQgPSBiaXRt YXBfZmluZF9mcmVlX3JlZ2lvbihpbXNpYy0+aHdpcnFzX3VzZWRfYml0bWFwLAo+ID4gKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1zaWMtPm5yX2h3aXJxcywgMCk7Cj4gPiAr ICAgICByYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW1zaWMtPmh3aXJxc19sb2NrLCBmbGFn cyk7Cj4gPiArCj4gPiArICAgICByZXR1cm4gcmV0Owo+ID4gK30KPgo+IFRoaXMgcGFydCBpcyBq dXN0IHRvIGNyZWF0ZSBhIHVuaXF1ZSBod2lycSBudW1iZXIsIHJpZ2h0PwoKWWVzLCB0aGlzIGlz IG9ubHkgZm9yIHVuaXF1ZSBod2lycS4gV2UgY2FuIGRpcmVjdGx5IHVzZSB2aXJxCmluc3RlYWQg b2YgaHdpcnEgc28gdGhpcyBod2lycSBhbGxvY2F0aW9uL21hbmFnZW1lbnQgd2lsbApnbyBhd2F5 IGluIHRoZSBuZXh0IHJldmlzaW9uLgoKPgo+ID4gKwo+ID4gKyAgICAgLyogRmluZCBudW1iZXIg b2YgZ3Vlc3QgaW5kZXggYml0cyBpbiBNU0kgYWRkcmVzcyAqLwo+ID4gKyAgICAgcmMgPSBvZl9w cm9wZXJ0eV9yZWFkX3UzMih0b19vZl9ub2RlKGZ3bm9kZSksCj4gPiArICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICJyaXNjdixndWVzdC1pbmRleC1iaXRzIiwKPiA+ICsgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgJmdsb2JhbC0+Z3Vlc3RfaW5kZXhfYml0cyk7Cj4gPiArICAg ICBpZiAocmMpCj4gPiArICAgICAgICAgICAgIGdsb2JhbC0+Z3Vlc3RfaW5kZXhfYml0cyA9IDA7 Cj4KPiBTbyBoZXJlIHlvdSBnZXQgdGhlIGluZGV4IGJpdHMsIGJ1dCB0aGVuIDUwIGxpbmVzIGZ1 cnRoZXIgZG93biB5b3UgZG8KPiBzYW5pdHkgY2hlY2tpbmcuIFdvdWxkbid0IGl0IG1ha2Ugc2Vu c2UgdG8gZG8gdGhhdCByaWdodCBoZXJlPwo+Cj4gU2FtZSBmb3IgdGhlIG90aGVyIGJpdHMuCgpU aGlzIGlzIGludGVudGlvbmFsIGJlY2F1c2Ugd2UgYWxyZWFkeSBoYXZlIGEgQUlBIEFDUEkgc2Vy aWVzCndoZXJlIHRoaXMgaGVscHMgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2YgImlmIChhY3BpX2Rp c2FibGVkKSIKY2hlY2tzLgoKPgo+ID4gKwo+ID4gKy8qCj4gPiArICogVGhlIElNU0lDIGRyaXZl ciB1c2VzIDEgSVBJIGZvciBJRCBzeW5jaHJvbml6YXRpb24gYW5kCj4gPiArICogYXJjaC9yaXNj di9rZXJuZWwvc21wLmMgcmVxdWlyZSA2IElQSXMgc28gd2UgZml4IHRoZQo+ID4gKyAqIHRvdGFs IG51bWJlciBvZiBJUElzIHRvIDguCj4gPiArICovCj4gPiArI2RlZmluZSBJTVNJQ19JUElfSUQg ICAgICAgICAgICAgICAgICAgICAgICAgMQo+ID4gKyNkZWZpbmUgSU1TSUNfTlJfSVBJICAgICAg ICAgICAgICAgICAgICAgICAgIDgKPiA+ICsKPiA+ICtzdHJ1Y3QgaW1zaWNfdmVjdG9yIHsKPiA+ ICsgICAgIC8qIEZpeGVkIGRldGFpbHMgb2YgdGhlIHZlY3RvciAqLwo+ID4gKyAgICAgdW5zaWdu ZWQgaW50IGNwdTsKPiA+ICsgICAgIHVuc2lnbmVkIGludCBsb2NhbF9pZDsKPiA+ICsgICAgIC8q IERldGFpbHMgc2F2ZWQgYnkgZHJpdmVyIGluIHRoZSB2ZWN0b3IgKi8KPiA+ICsgICAgIHVuc2ln bmVkIGludCBod2lycTsKPiA+ICt9Owo+ID4gKwo+ID4gK3N0cnVjdCBpbXNpY19sb2NhbF9wcml2 IHsKPiA+ICsgICAgIC8qIExvY2FsIHN0YXRlIG9mIGludGVycnVwdCBpZGVudGl0aWVzICovCj4g PiArICAgICByYXdfc3BpbmxvY2tfdCBpZHNfbG9jazsKPiA+ICsgICAgIHVuc2lnbmVkIGxvbmcg Kmlkc19lbmFibGVkX2JpdG1hcDsKPiA+ICsgICAgIHN0cnVjdCBpbXNpY192ZWN0b3IgKippZHNf bW92ZTsKPiA+ICsKPiA+ICsgICAgIC8qIExvY2FsIHZlY3RvciB0YWJsZSAqLwo+ID4gKyAgICAg c3RydWN0IGltc2ljX3ZlY3RvciAqdmVjdG9yczsKPgo+IFBsZWFzZSBtYWtlIHRob3NlIHN0cnVj dHMgdGFidWxhcjoKPgo+IGh0dHBzOi8vd3d3Lmtlcm5lbC5vcmcvZG9jL2h0bWwvbGF0ZXN0L3By b2Nlc3MvbWFpbnRhaW5lci10aXAuaHRtbCNzdHJ1Y3QtZGVjbGFyYXRpb25zLWFuZC1pbml0aWFs aXplcnMKCk9rYXksIEkgd2lsbCB1cGRhdGUuCgo+Cj4gPiArdm9pZCBfX2ltc2ljX2VpeF91cGRh dGUodW5zaWduZWQgbG9uZyBiYXNlX2lkLAo+ID4gKyAgICAgICAgICAgICAgICAgICAgIHVuc2ln bmVkIGxvbmcgbnVtX2lkLCBib29sIHBlbmQsIGJvb2wgdmFsKTsKPiA+ICsKPiA+ICsjZGVmaW5l IF9faW1zaWNfaWRfc2V0X2VuYWJsZShfX2lkKSAgICAgICAgICBcCj4gPiArICAgICBfX2ltc2lj X2VpeF91cGRhdGUoKF9faWQpLCAxLCBmYWxzZSwgdHJ1ZSkKPiA+ICsjZGVmaW5lIF9faW1zaWNf aWRfY2xlYXJfZW5hYmxlKF9faWQpICAgICAgICBcCj4gPiArICAgICBfX2ltc2ljX2VpeF91cGRh dGUoKF9faWQpLCAxLCBmYWxzZSwgZmFsc2UpCj4KPiBpbmxpbmVzIHBsZWFzZS4KCk9rYXksIEkg d2lsbCB1cGRhdGUuCgpSZWdhcmRzLApBbnVwCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fXwpsaW51eC1hcm0ta2VybmVsIG1haWxpbmcgbGlzdApsaW51eC1h cm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcv bWFpbG1hbi9saXN0aW5mby9saW51eC1hcm0ta2VybmVsCg==