From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.5 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, UNWANTED_LANGUAGE_BODY,USER_AGENT_SANE_1 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 813F3C5ACC4 for ; Thu, 20 Feb 2020 03:12:03 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 4C8102465D for ; Thu, 20 Feb 2020 03:12:03 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727928AbgBTDMB (ORCPT ); Wed, 19 Feb 2020 22:12:01 -0500 Received: from szxga05-in.huawei.com ([45.249.212.191]:10224 "EHLO huawei.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1727211AbgBTDMB (ORCPT ); Wed, 19 Feb 2020 22:12:01 -0500 Received: from DGGEMS402-HUB.china.huawei.com (unknown [172.30.72.60]) by Forcepoint Email with ESMTP id D666413F5CF89FEEF4BC; Thu, 20 Feb 2020 11:11:57 +0800 (CST) Received: from [127.0.0.1] (10.173.222.27) by DGGEMS402-HUB.china.huawei.com (10.3.19.202) with Microsoft SMTP Server id 14.3.439.0; Thu, 20 Feb 2020 11:11:48 +0800 Subject: Re: [PATCH v4 08/20] irqchip/gic-v4.1: Plumb get/set_irqchip_state SGI callbacks To: Marc Zyngier CC: , , , , Lorenzo Pieralisi , Jason Cooper , "Robert Richter" , Thomas Gleixner , "Eric Auger" , James Morse , "Julien Thierry" , Suzuki K Poulose References: <20200214145736.18550-1-maz@kernel.org> <20200214145736.18550-9-maz@kernel.org> <4b7f71f1-5e7f-e6af-f47d-7ed0d3a8739f@huawei.com> <75597af0d2373ac4d92d8162a1338cbb@kernel.org> <19a7c193f0e4b97343e822a35f0911ed@kernel.org> From: Zenghui Yu Message-ID: <3d725ede-6631-59fb-1a10-9fb9890f3df6@huawei.com> Date: Thu, 20 Feb 2020 11:11:46 +0800 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:68.0) Gecko/20100101 Thunderbird/68.2.0 MIME-Version: 1.0 In-Reply-To: <19a7c193f0e4b97343e822a35f0911ed@kernel.org> Content-Type: text/plain; charset="utf-8"; format=flowed Content-Language: en-US Content-Transfer-Encoding: 8bit X-Originating-IP: [10.173.222.27] X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Marc, On 2020/2/18 23:31, Marc Zyngier wrote: > diff --git a/drivers/irqchip/irq-gic-v3-its.c > b/drivers/irqchip/irq-gic-v3-its.c > index 7656b353a95f..0ed286dba827 100644 > --- a/drivers/irqchip/irq-gic-v3-its.c > +++ b/drivers/irqchip/irq-gic-v3-its.c > @@ -144,7 +144,7 @@ struct event_lpi_map { >      u16            *col_map; >      irq_hw_number_t        lpi_base; >      int            nr_lpis; > -    raw_spinlock_t        vlpi_lock; > +    raw_spinlock_t        map_lock; So we use map_lock to protect both LPI's and VLPI's mapping affinity of a device, and use vpe_lock to protect vPE's affinity, OK. >      struct its_vm        *vm; >      struct its_vlpi_map    *vlpi_maps; >      int            nr_vlpis; > @@ -240,15 +240,33 @@ static struct its_vlpi_map *get_vlpi_map(struct > irq_data *d) >      return NULL; >  } > > -static int irq_to_cpuid(struct irq_data *d) > +static int irq_to_cpuid_lock(struct irq_data *d, unsigned long *flags) >  { > -    struct its_device *its_dev = irq_data_get_irq_chip_data(d); >      struct its_vlpi_map *map = get_vlpi_map(d); > +    int cpu; > > -    if (map) > -        return map->vpe->col_idx; > +    if (map) { > +        raw_spin_lock_irqsave(&map->vpe->vpe_lock, *flags); > +        cpu = map->vpe->col_idx; > +    } else { > +        struct its_device *its_dev = irq_data_get_irq_chip_data(d); > +        raw_spin_lock_irqsave(&its_dev->event_map.map_lock, *flags); > +        cpu = its_dev->event_map.col_map[its_get_event_id(d)]; > +    } > > -    return its_dev->event_map.col_map[its_get_event_id(d)]; > +    return cpu; > +} This helper is correct for normal LPIs and VLPIs, but wrong for per-vPE IRQ (doorbell) and vSGIs. irq_data_get_irq_chip_data() gets confused by both of them. > + > +static void irq_to_cpuid_unlock(struct irq_data *d, unsigned long flags) > +{ > +    struct its_vlpi_map *map = get_vlpi_map(d); > + > +    if (map) { > +        raw_spin_unlock_irqrestore(&map->vpe->vpe_lock, flags); > +    } else { > +        struct its_device *its_dev = irq_data_get_irq_chip_data(d); > +        raw_spin_unlock_irqrestore(&its_dev->event_map.map_lock, flags); > +    } >  } The same problem for this helper. > >  static struct its_collection *valid_col(struct its_collection *col) > @@ -1384,6 +1402,8 @@ static void direct_lpi_inv(struct irq_data *d) >  { >      struct its_vlpi_map *map = get_vlpi_map(d); >      void __iomem *rdbase; > +    unsigned long flags; > +    int cpu; >      u64 val; > >      if (map) { > @@ -1399,10 +1419,12 @@ static void direct_lpi_inv(struct irq_data *d) >      } > >      /* Target the redistributor this LPI is currently routed to */ > -    rdbase = per_cpu_ptr(gic_rdists->rdist, irq_to_cpuid(d))->rd_base; > +    cpu = irq_to_cpuid_lock(d, &flags); > +    rdbase = per_cpu_ptr(gic_rdists->rdist, cpu)->rd_base; >      gic_write_lpir(val, rdbase + GICR_INVLPIR); > >      wait_for_syncr(rdbase); > +    irq_to_cpuid_unlock(d, flags); >  } > >  static void lpi_update_config(struct irq_data *d, u8 clr, u8 set) > @@ -1471,11 +1493,11 @@ static void its_unmask_irq(struct irq_data *d) >  static int its_set_affinity(struct irq_data *d, const struct cpumask > *mask_val, >                  bool force) >  { > -    unsigned int cpu; >      const struct cpumask *cpu_mask = cpu_online_mask; >      struct its_device *its_dev = irq_data_get_irq_chip_data(d); >      struct its_collection *target_col; > -    u32 id = its_get_event_id(d); > +    unsigned int from, cpu; > +    unsigned long flags; > >      /* A forwarded interrupt should use irq_set_vcpu_affinity */ >      if (irqd_is_forwarded_to_vcpu(d)) > @@ -1496,12 +1518,16 @@ static int its_set_affinity(struct irq_data *d, > const struct cpumask *mask_val, >          return -EINVAL; > >      /* don't set the affinity when the target cpu is same as current > one */ > -    if (cpu != its_dev->event_map.col_map[id]) { > +    from = irq_to_cpuid_lock(d, &flags); > +    if (cpu != from) { > +        u32 id = its_get_event_id(d); > + >          target_col = &its_dev->its->collections[cpu]; >          its_send_movi(its_dev, target_col, id); >          its_dev->event_map.col_map[id] = cpu; >          irq_data_update_effective_affinity(d, cpumask_of(cpu)); >      } > +    irq_to_cpuid_unlock(d, flags); > >      return IRQ_SET_MASK_OK_DONE; >  } > @@ -1636,7 +1662,7 @@ static int its_vlpi_map(struct irq_data *d, struct > its_cmd_info *info) >      if (!info->map) >          return -EINVAL; > > -    raw_spin_lock(&its_dev->event_map.vlpi_lock); > +    raw_spin_lock(&its_dev->event_map.map_lock); > >      if (!its_dev->event_map.vm) { >          struct its_vlpi_map *maps; > @@ -1685,7 +1711,7 @@ static int its_vlpi_map(struct irq_data *d, struct > its_cmd_info *info) >      } > >  out: > -    raw_spin_unlock(&its_dev->event_map.vlpi_lock); > +    raw_spin_unlock(&its_dev->event_map.map_lock); >      return ret; >  } > > @@ -1695,7 +1721,7 @@ static int its_vlpi_get(struct irq_data *d, struct > its_cmd_info *info) >      struct its_vlpi_map *map; >      int ret = 0; > > -    raw_spin_lock(&its_dev->event_map.vlpi_lock); > +    raw_spin_lock(&its_dev->event_map.map_lock); > >      map = get_vlpi_map(d); > > @@ -1708,7 +1734,7 @@ static int its_vlpi_get(struct irq_data *d, struct > its_cmd_info *info) >      *info->map = *map; > >  out: > -    raw_spin_unlock(&its_dev->event_map.vlpi_lock); > +    raw_spin_unlock(&its_dev->event_map.map_lock); >      return ret; >  } > > @@ -1718,7 +1744,7 @@ static int its_vlpi_unmap(struct irq_data *d) >      u32 event = its_get_event_id(d); >      int ret = 0; > > -    raw_spin_lock(&its_dev->event_map.vlpi_lock); > +    raw_spin_lock(&its_dev->event_map.map_lock); > >      if (!its_dev->event_map.vm || !irqd_is_forwarded_to_vcpu(d)) { >          ret = -EINVAL; > @@ -1748,7 +1774,7 @@ static int its_vlpi_unmap(struct irq_data *d) >      } > >  out: > -    raw_spin_unlock(&its_dev->event_map.vlpi_lock); > +    raw_spin_unlock(&its_dev->event_map.map_lock); >      return ret; >  } > > @@ -3193,7 +3219,7 @@ static struct its_device *its_create_device(struct > its_node *its, u32 dev_id, >      dev->event_map.col_map = col_map; >      dev->event_map.lpi_base = lpi_base; >      dev->event_map.nr_lpis = nr_lpis; > -    raw_spin_lock_init(&dev->event_map.vlpi_lock); > +    raw_spin_lock_init(&dev->event_map.map_lock); >      dev->device_id = dev_id; >      INIT_LIST_HEAD(&dev->entry); > > @@ -3560,6 +3586,7 @@ static int its_vpe_set_affinity(struct irq_data *d, >  { >      struct its_vpe *vpe = irq_data_get_irq_chip_data(d); >      int from, cpu = cpumask_first(mask_val); > +    unsigned long flags; > >      /* >       * Changing affinity is mega expensive, so let's be as lazy as > @@ -3567,6 +3594,7 @@ static int its_vpe_set_affinity(struct irq_data *d, >       * into the proxy device, we need to move the doorbell >       * interrupt to its new location. >       */ > +    raw_spin_lock_irqsave(&vpe->vpe_lock, flags); >      if (vpe->col_idx == cpu) >          goto out; > > @@ -3586,6 +3614,7 @@ static int its_vpe_set_affinity(struct irq_data *d, > >  out: >      irq_data_update_effective_affinity(d, cpumask_of(cpu)); > +    raw_spin_unlock_irqrestore(&vpe->vpe_lock, flags); > >      return IRQ_SET_MASK_OK_DONE; >  } > @@ -3695,11 +3724,15 @@ static void its_vpe_send_inv(struct irq_data *d) > >      if (gic_rdists->has_direct_lpi) { >          void __iomem *rdbase; > +        unsigned long flags; > +        int cpu; > >          /* Target the redistributor this VPE is currently known on */ > -        rdbase = per_cpu_ptr(gic_rdists->rdist, vpe->col_idx)->rd_base; > +        cpu = irq_to_cpuid_lock(d, &flags); > +        rdbase = per_cpu_ptr(gic_rdists->rdist, cpu)->rd_base; >          gic_write_lpir(d->parent_data->hwirq, rdbase + GICR_INVLPIR); >          wait_for_syncr(rdbase); > +        irq_to_cpuid_unlock(d, flags); >      } else { >          its_vpe_send_cmd(vpe, its_send_inv); >      } Do we really need to grab the vpe_lock for those which are belong to the same irqchip with its_vpe_set_affinity()? The IRQ core code should already ensure the mutual exclusion among them, wrong? > @@ -3735,14 +3768,18 @@ static int its_vpe_set_irqchip_state(struct > irq_data *d, > >      if (gic_rdists->has_direct_lpi) { >          void __iomem *rdbase; > +        unsigned long flags; > +        int cpu; > > -        rdbase = per_cpu_ptr(gic_rdists->rdist, vpe->col_idx)->rd_base; > +        cpu = irq_to_cpuid_lock(d, &flags); > +        rdbase = per_cpu_ptr(gic_rdists->rdist, cpu)->rd_base; >          if (state) { >              gic_write_lpir(vpe->vpe_db_lpi, rdbase + GICR_SETLPIR); >          } else { >              gic_write_lpir(vpe->vpe_db_lpi, rdbase + GICR_CLRLPIR); >              wait_for_syncr(rdbase); >          } > +        irq_to_cpuid_unlock(d, flags); >      } else { >          if (state) >              its_vpe_send_cmd(vpe, its_send_int); > @@ -3854,14 +3891,17 @@ static void its_vpe_4_1_deschedule(struct > its_vpe *vpe, >  static void its_vpe_4_1_invall(struct its_vpe *vpe) >  { >      void __iomem *rdbase; > +    unsigned long flags; >      u64 val; > >      val  = GICR_INVALLR_V; >      val |= FIELD_PREP(GICR_INVALLR_VPEID, vpe->vpe_id); > >      /* Target the redistributor this vPE is currently known on */ > +    raw_spin_lock_irqsave(&vpe->vpe_lock, flags); >      rdbase = per_cpu_ptr(gic_rdists->rdist, vpe->col_idx)->rd_base; >      gic_write_lpir(val, rdbase + GICR_INVALLR); > +    raw_spin_unlock_irqrestore(&vpe->vpe_lock, flags); >  } > >  static int its_vpe_4_1_set_vcpu_affinity(struct irq_data *d, void > *vcpu_info) > @@ -3960,13 +4000,17 @@ static int its_sgi_get_irqchip_state(struct > irq_data *d, >                       enum irqchip_irq_state which, bool *val) >  { >      struct its_vpe *vpe = irq_data_get_irq_chip_data(d); > -    void __iomem *base = gic_data_rdist_cpu(vpe->col_idx)->rd_base + > SZ_128K; > +    void __iomem *base; > +    unsigned long flags; >      u32 count = 1000000;    /* 1s! */ >      u32 status; > +    int cpu; > >      if (which != IRQCHIP_STATE_PENDING) >          return -EINVAL; > > +    cpu = irq_to_cpuid_lock(d, &flags); > +    base = gic_data_rdist_cpu(cpu)->rd_base + SZ_128K; >      writel_relaxed(vpe->vpe_id, base + GICR_VSGIR); >      do { >          status = readl_relaxed(base + GICR_VSGIPENDR); > @@ -3983,6 +4027,7 @@ static int its_sgi_get_irqchip_state(struct > irq_data *d, >      } while(count); > >  out: > +    irq_to_cpuid_unlock(d, flags); >      *val = !!(status & (1 << d->hwirq)); > >      return 0; > @@ -4102,6 +4147,7 @@ static int its_vpe_init(struct its_vpe *vpe) >          return -ENOMEM; >      } > > +    raw_spin_lock_init(&vpe->vpe_lock); >      vpe->vpe_id = vpe_id; >      vpe->vpt_page = vpt_page; >      if (gic_rdists->has_rvpeid) > diff --git a/include/linux/irqchip/arm-gic-v4.h > b/include/linux/irqchip/arm-gic-v4.h > index 46c167a6349f..fc43a63875a3 100644 > --- a/include/linux/irqchip/arm-gic-v4.h > +++ b/include/linux/irqchip/arm-gic-v4.h > @@ -60,6 +60,7 @@ struct its_vpe { >          }; >      }; > > +    raw_spinlock_t        vpe_lock; >      /* >       * This collection ID is used to indirect the target >       * redistributor for this VPE. The ID itself isn't involved in I'm not sure if it's good enough, it may gets much clearer after splitting. Thanks, Zenghui From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.5 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, UNWANTED_LANGUAGE_BODY,USER_AGENT_SANE_1 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id C53D0C5ACC4 for ; Thu, 20 Feb 2020 03:12:06 +0000 (UTC) Received: from mm01.cs.columbia.edu (mm01.cs.columbia.edu [128.59.11.253]) by mail.kernel.org (Postfix) with ESMTP id 4D44324656 for ; Thu, 20 Feb 2020 03:12:06 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 4D44324656 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=huawei.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=kvmarm-bounces@lists.cs.columbia.edu Received: from localhost (localhost [127.0.0.1]) by mm01.cs.columbia.edu (Postfix) with ESMTP id ACF2B4AEB3; Wed, 19 Feb 2020 22:12:05 -0500 (EST) X-Virus-Scanned: at lists.cs.columbia.edu Received: from mm01.cs.columbia.edu ([127.0.0.1]) by localhost (mm01.cs.columbia.edu [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id Y9PC7nEDAiqD; Wed, 19 Feb 2020 22:12:04 -0500 (EST) Received: from mm01.cs.columbia.edu (localhost [127.0.0.1]) by mm01.cs.columbia.edu (Postfix) with ESMTP id 31C8F4AE96; Wed, 19 Feb 2020 22:12:04 -0500 (EST) Received: from localhost (localhost [127.0.0.1]) by mm01.cs.columbia.edu (Postfix) with ESMTP id 455DE4AE87 for ; Wed, 19 Feb 2020 22:12:03 -0500 (EST) X-Virus-Scanned: at lists.cs.columbia.edu Received: from mm01.cs.columbia.edu ([127.0.0.1]) by localhost (mm01.cs.columbia.edu [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id Ba8SwwyfRAMO for ; Wed, 19 Feb 2020 22:12:01 -0500 (EST) Received: from huawei.com (szxga05-in.huawei.com [45.249.212.191]) by mm01.cs.columbia.edu (Postfix) with ESMTPS id 0D0CC4ACFA for ; Wed, 19 Feb 2020 22:12:01 -0500 (EST) Received: from DGGEMS402-HUB.china.huawei.com (unknown [172.30.72.60]) by Forcepoint Email with ESMTP id D666413F5CF89FEEF4BC; Thu, 20 Feb 2020 11:11:57 +0800 (CST) Received: from [127.0.0.1] (10.173.222.27) by DGGEMS402-HUB.china.huawei.com (10.3.19.202) with Microsoft SMTP Server id 14.3.439.0; Thu, 20 Feb 2020 11:11:48 +0800 Subject: Re: [PATCH v4 08/20] irqchip/gic-v4.1: Plumb get/set_irqchip_state SGI callbacks To: Marc Zyngier References: <20200214145736.18550-1-maz@kernel.org> <20200214145736.18550-9-maz@kernel.org> <4b7f71f1-5e7f-e6af-f47d-7ed0d3a8739f@huawei.com> <75597af0d2373ac4d92d8162a1338cbb@kernel.org> <19a7c193f0e4b97343e822a35f0911ed@kernel.org> From: Zenghui Yu Message-ID: <3d725ede-6631-59fb-1a10-9fb9890f3df6@huawei.com> Date: Thu, 20 Feb 2020 11:11:46 +0800 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:68.0) Gecko/20100101 Thunderbird/68.2.0 MIME-Version: 1.0 In-Reply-To: <19a7c193f0e4b97343e822a35f0911ed@kernel.org> Content-Language: en-US X-Originating-IP: [10.173.222.27] X-CFilter-Loop: Reflected Cc: Lorenzo Pieralisi , Jason Cooper , kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Robert Richter , Thomas Gleixner , kvmarm@lists.cs.columbia.edu, linux-arm-kernel@lists.infradead.org X-BeenThere: kvmarm@lists.cs.columbia.edu X-Mailman-Version: 2.1.14 Precedence: list List-Id: Where KVM/ARM decisions are made List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Errors-To: kvmarm-bounces@lists.cs.columbia.edu Sender: kvmarm-bounces@lists.cs.columbia.edu SGkgTWFyYywKCk9uIDIwMjAvMi8xOCAyMzozMSwgTWFyYyBaeW5naWVyIHdyb3RlOgo+IGRpZmYg LS1naXQgYS9kcml2ZXJzL2lycWNoaXAvaXJxLWdpYy12My1pdHMuYyAKPiBiL2RyaXZlcnMvaXJx Y2hpcC9pcnEtZ2ljLXYzLWl0cy5jCj4gaW5kZXggNzY1NmIzNTNhOTVmLi4wZWQyODZkYmE4Mjcg MTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9pcnFjaGlwL2lycS1naWMtdjMtaXRzLmMKPiArKysgYi9k cml2ZXJzL2lycWNoaXAvaXJxLWdpYy12My1pdHMuYwo+IEBAIC0xNDQsNyArMTQ0LDcgQEAgc3Ry dWN0IGV2ZW50X2xwaV9tYXAgewo+ICDCoMKgwqDCoCB1MTbCoMKgwqDCoMKgwqDCoMKgwqDCoMKg ICpjb2xfbWFwOwo+ICDCoMKgwqDCoCBpcnFfaHdfbnVtYmVyX3TCoMKgwqDCoMKgwqDCoCBscGlf YmFzZTsKPiAgwqDCoMKgwqAgaW50wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBucl9scGlzOwo+IC3C oMKgwqAgcmF3X3NwaW5sb2NrX3TCoMKgwqDCoMKgwqDCoCB2bHBpX2xvY2s7Cj4gK8KgwqDCoCBy YXdfc3BpbmxvY2tfdMKgwqDCoMKgwqDCoMKgIG1hcF9sb2NrOwoKU28gd2UgdXNlIG1hcF9sb2Nr IHRvIHByb3RlY3QgYm90aCBMUEkncyBhbmQgVkxQSSdzIG1hcHBpbmcgYWZmaW5pdHkgb2YKYSBk ZXZpY2UsIGFuZCB1c2UgdnBlX2xvY2sgdG8gcHJvdGVjdCB2UEUncyBhZmZpbml0eSwgT0suCgo+ ICDCoMKgwqDCoCBzdHJ1Y3QgaXRzX3ZtwqDCoMKgwqDCoMKgwqAgKnZtOwo+ICDCoMKgwqDCoCBz dHJ1Y3QgaXRzX3ZscGlfbWFwwqDCoMKgICp2bHBpX21hcHM7Cj4gIMKgwqDCoMKgIGludMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgbnJfdmxwaXM7Cj4gQEAgLTI0MCwxNSArMjQwLDMzIEBAIHN0YXRp YyBzdHJ1Y3QgaXRzX3ZscGlfbWFwICpnZXRfdmxwaV9tYXAoc3RydWN0IAo+IGlycV9kYXRhICpk KQo+ICDCoMKgwqDCoCByZXR1cm4gTlVMTDsKPiAgwqB9Cj4gCj4gLXN0YXRpYyBpbnQgaXJxX3Rv X2NwdWlkKHN0cnVjdCBpcnFfZGF0YSAqZCkKPiArc3RhdGljIGludCBpcnFfdG9fY3B1aWRfbG9j ayhzdHJ1Y3QgaXJxX2RhdGEgKmQsIHVuc2lnbmVkIGxvbmcgKmZsYWdzKQo+ICDCoHsKPiAtwqDC oMKgIHN0cnVjdCBpdHNfZGV2aWNlICppdHNfZGV2ID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2Rh dGEoZCk7Cj4gIMKgwqDCoMKgIHN0cnVjdCBpdHNfdmxwaV9tYXAgKm1hcCA9IGdldF92bHBpX21h cChkKTsKPiArwqDCoMKgIGludCBjcHU7Cj4gCj4gLcKgwqDCoCBpZiAobWFwKQo+IC3CoMKgwqDC oMKgwqDCoCByZXR1cm4gbWFwLT52cGUtPmNvbF9pZHg7Cj4gK8KgwqDCoCBpZiAobWFwKSB7Cj4g K8KgwqDCoMKgwqDCoMKgIHJhd19zcGluX2xvY2tfaXJxc2F2ZSgmbWFwLT52cGUtPnZwZV9sb2Nr LCAqZmxhZ3MpOwo+ICvCoMKgwqDCoMKgwqDCoCBjcHUgPSBtYXAtPnZwZS0+Y29sX2lkeDsKPiAr wqDCoMKgIH0gZWxzZSB7Cj4gK8KgwqDCoMKgwqDCoMKgIHN0cnVjdCBpdHNfZGV2aWNlICppdHNf ZGV2ID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7Cj4gK8KgwqDCoMKgwqDCoMKgIHJh d19zcGluX2xvY2tfaXJxc2F2ZSgmaXRzX2Rldi0+ZXZlbnRfbWFwLm1hcF9sb2NrLCAqZmxhZ3Mp Owo+ICvCoMKgwqDCoMKgwqDCoCBjcHUgPSBpdHNfZGV2LT5ldmVudF9tYXAuY29sX21hcFtpdHNf Z2V0X2V2ZW50X2lkKGQpXTsKPiArwqDCoMKgIH0KPiAKPiAtwqDCoMKgIHJldHVybiBpdHNfZGV2 LT5ldmVudF9tYXAuY29sX21hcFtpdHNfZ2V0X2V2ZW50X2lkKGQpXTsKPiArwqDCoMKgIHJldHVy biBjcHU7Cj4gK30KClRoaXMgaGVscGVyIGlzIGNvcnJlY3QgZm9yIG5vcm1hbCBMUElzIGFuZCBW TFBJcywgYnV0IHdyb25nIGZvciBwZXItdlBFCklSUSAoZG9vcmJlbGwpIGFuZCB2U0dJcy4gaXJx X2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoKSBnZXRzIGNvbmZ1c2VkIGJ5CmJvdGggb2YgdGhlbS4K Cj4gKwo+ICtzdGF0aWMgdm9pZCBpcnFfdG9fY3B1aWRfdW5sb2NrKHN0cnVjdCBpcnFfZGF0YSAq ZCwgdW5zaWduZWQgbG9uZyBmbGFncykKPiArewo+ICvCoMKgwqAgc3RydWN0IGl0c192bHBpX21h cCAqbWFwID0gZ2V0X3ZscGlfbWFwKGQpOwo+ICsKPiArwqDCoMKgIGlmIChtYXApIHsKPiArwqDC oMKgwqDCoMKgwqAgcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1hcC0+dnBlLT52cGVfbG9j aywgZmxhZ3MpOwo+ICvCoMKgwqAgfSBlbHNlIHsKPiArwqDCoMKgwqDCoMKgwqAgc3RydWN0IGl0 c19kZXZpY2UgKml0c19kZXYgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKPiArwqDC oMKgwqDCoMKgwqAgcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJml0c19kZXYtPmV2ZW50X21h cC5tYXBfbG9jaywgZmxhZ3MpOwo+ICvCoMKgwqAgfQo+ICDCoH0KClRoZSBzYW1lIHByb2JsZW0g Zm9yIHRoaXMgaGVscGVyLgoKPiAKPiAgwqBzdGF0aWMgc3RydWN0IGl0c19jb2xsZWN0aW9uICp2 YWxpZF9jb2woc3RydWN0IGl0c19jb2xsZWN0aW9uICpjb2wpCj4gQEAgLTEzODQsNiArMTQwMiw4 IEBAIHN0YXRpYyB2b2lkIGRpcmVjdF9scGlfaW52KHN0cnVjdCBpcnFfZGF0YSAqZCkKPiAgwqB7 Cj4gIMKgwqDCoMKgIHN0cnVjdCBpdHNfdmxwaV9tYXAgKm1hcCA9IGdldF92bHBpX21hcChkKTsK PiAgwqDCoMKgwqAgdm9pZCBfX2lvbWVtICpyZGJhc2U7Cj4gK8KgwqDCoCB1bnNpZ25lZCBsb25n IGZsYWdzOwo+ICvCoMKgwqAgaW50IGNwdTsKPiAgwqDCoMKgwqAgdTY0IHZhbDsKPiAKPiAgwqDC oMKgwqAgaWYgKG1hcCkgewo+IEBAIC0xMzk5LDEwICsxNDE5LDEyIEBAIHN0YXRpYyB2b2lkIGRp cmVjdF9scGlfaW52KHN0cnVjdCBpcnFfZGF0YSAqZCkKPiAgwqDCoMKgwqAgfQo+IAo+ICDCoMKg wqDCoCAvKiBUYXJnZXQgdGhlIHJlZGlzdHJpYnV0b3IgdGhpcyBMUEkgaXMgY3VycmVudGx5IHJv dXRlZCB0byAqLwo+IC3CoMKgwqAgcmRiYXNlID0gcGVyX2NwdV9wdHIoZ2ljX3JkaXN0cy0+cmRp c3QsIGlycV90b19jcHVpZChkKSktPnJkX2Jhc2U7Cj4gK8KgwqDCoCBjcHUgPSBpcnFfdG9fY3B1 aWRfbG9jayhkLCAmZmxhZ3MpOwo+ICvCoMKgwqAgcmRiYXNlID0gcGVyX2NwdV9wdHIoZ2ljX3Jk aXN0cy0+cmRpc3QsIGNwdSktPnJkX2Jhc2U7Cj4gIMKgwqDCoMKgIGdpY193cml0ZV9scGlyKHZh bCwgcmRiYXNlICsgR0lDUl9JTlZMUElSKTsKPiAKPiAgwqDCoMKgwqAgd2FpdF9mb3Jfc3luY3Io cmRiYXNlKTsKPiArwqDCoMKgIGlycV90b19jcHVpZF91bmxvY2soZCwgZmxhZ3MpOwo+ICDCoH0K PiAKPiAgwqBzdGF0aWMgdm9pZCBscGlfdXBkYXRlX2NvbmZpZyhzdHJ1Y3QgaXJxX2RhdGEgKmQs IHU4IGNsciwgdTggc2V0KQo+IEBAIC0xNDcxLDExICsxNDkzLDExIEBAIHN0YXRpYyB2b2lkIGl0 c191bm1hc2tfaXJxKHN0cnVjdCBpcnFfZGF0YSAqZCkKPiAgwqBzdGF0aWMgaW50IGl0c19zZXRf YWZmaW5pdHkoc3RydWN0IGlycV9kYXRhICpkLCBjb25zdCBzdHJ1Y3QgY3B1bWFzayAKPiAqbWFz a192YWwsCj4gIMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGJvb2wgZm9yY2UpCj4g IMKgewo+IC3CoMKgwqAgdW5zaWduZWQgaW50IGNwdTsKPiAgwqDCoMKgwqAgY29uc3Qgc3RydWN0 IGNwdW1hc2sgKmNwdV9tYXNrID0gY3B1X29ubGluZV9tYXNrOwo+ICDCoMKgwqDCoCBzdHJ1Y3Qg aXRzX2RldmljZSAqaXRzX2RldiA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOwo+ICDC oMKgwqDCoCBzdHJ1Y3QgaXRzX2NvbGxlY3Rpb24gKnRhcmdldF9jb2w7Cj4gLcKgwqDCoCB1MzIg aWQgPSBpdHNfZ2V0X2V2ZW50X2lkKGQpOwo+ICvCoMKgwqAgdW5zaWduZWQgaW50IGZyb20sIGNw dTsKPiArwqDCoMKgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Cj4gCj4gIMKgwqDCoMKgIC8qIEEgZm9y d2FyZGVkIGludGVycnVwdCBzaG91bGQgdXNlIGlycV9zZXRfdmNwdV9hZmZpbml0eSAqLwo+ICDC oMKgwqDCoCBpZiAoaXJxZF9pc19mb3J3YXJkZWRfdG9fdmNwdShkKSkKPiBAQCAtMTQ5NiwxMiAr MTUxOCwxNiBAQCBzdGF0aWMgaW50IGl0c19zZXRfYWZmaW5pdHkoc3RydWN0IGlycV9kYXRhICpk LCAKPiBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqbWFza192YWwsCj4gIMKgwqDCoMKgwqDCoMKgwqAg cmV0dXJuIC1FSU5WQUw7Cj4gCj4gIMKgwqDCoMKgIC8qIGRvbid0IHNldCB0aGUgYWZmaW5pdHkg d2hlbiB0aGUgdGFyZ2V0IGNwdSBpcyBzYW1lIGFzIGN1cnJlbnQgCj4gb25lICovCj4gLcKgwqDC oCBpZiAoY3B1ICE9IGl0c19kZXYtPmV2ZW50X21hcC5jb2xfbWFwW2lkXSkgewo+ICvCoMKgwqAg ZnJvbSA9IGlycV90b19jcHVpZF9sb2NrKGQsICZmbGFncyk7Cj4gK8KgwqDCoCBpZiAoY3B1ICE9 IGZyb20pIHsKPiArwqDCoMKgwqDCoMKgwqAgdTMyIGlkID0gaXRzX2dldF9ldmVudF9pZChkKTsK PiArCj4gIMKgwqDCoMKgwqDCoMKgwqAgdGFyZ2V0X2NvbCA9ICZpdHNfZGV2LT5pdHMtPmNvbGxl Y3Rpb25zW2NwdV07Cj4gIMKgwqDCoMKgwqDCoMKgwqAgaXRzX3NlbmRfbW92aShpdHNfZGV2LCB0 YXJnZXRfY29sLCBpZCk7Cj4gIMKgwqDCoMKgwqDCoMKgwqAgaXRzX2Rldi0+ZXZlbnRfbWFwLmNv bF9tYXBbaWRdID0gY3B1Owo+ICDCoMKgwqDCoMKgwqDCoMKgIGlycV9kYXRhX3VwZGF0ZV9lZmZl Y3RpdmVfYWZmaW5pdHkoZCwgY3B1bWFza19vZihjcHUpKTsKPiAgwqDCoMKgwqAgfQo+ICvCoMKg wqAgaXJxX3RvX2NwdWlkX3VubG9jayhkLCBmbGFncyk7Cj4gCj4gIMKgwqDCoMKgIHJldHVybiBJ UlFfU0VUX01BU0tfT0tfRE9ORTsKPiAgwqB9Cj4gQEAgLTE2MzYsNyArMTY2Miw3IEBAIHN0YXRp YyBpbnQgaXRzX3ZscGlfbWFwKHN0cnVjdCBpcnFfZGF0YSAqZCwgc3RydWN0IAo+IGl0c19jbWRf aW5mbyAqaW5mbykKPiAgwqDCoMKgwqAgaWYgKCFpbmZvLT5tYXApCj4gIMKgwqDCoMKgwqDCoMKg wqAgcmV0dXJuIC1FSU5WQUw7Cj4gCj4gLcKgwqDCoCByYXdfc3Bpbl9sb2NrKCZpdHNfZGV2LT5l dmVudF9tYXAudmxwaV9sb2NrKTsKPiArwqDCoMKgIHJhd19zcGluX2xvY2soJml0c19kZXYtPmV2 ZW50X21hcC5tYXBfbG9jayk7Cj4gCj4gIMKgwqDCoMKgIGlmICghaXRzX2Rldi0+ZXZlbnRfbWFw LnZtKSB7Cj4gIMKgwqDCoMKgwqDCoMKgwqAgc3RydWN0IGl0c192bHBpX21hcCAqbWFwczsKPiBA QCAtMTY4NSw3ICsxNzExLDcgQEAgc3RhdGljIGludCBpdHNfdmxwaV9tYXAoc3RydWN0IGlycV9k YXRhICpkLCBzdHJ1Y3QgCj4gaXRzX2NtZF9pbmZvICppbmZvKQo+ICDCoMKgwqDCoCB9Cj4gCj4g IMKgb3V0Ogo+IC3CoMKgwqAgcmF3X3NwaW5fdW5sb2NrKCZpdHNfZGV2LT5ldmVudF9tYXAudmxw aV9sb2NrKTsKPiArwqDCoMKgIHJhd19zcGluX3VubG9jaygmaXRzX2Rldi0+ZXZlbnRfbWFwLm1h cF9sb2NrKTsKPiAgwqDCoMKgwqAgcmV0dXJuIHJldDsKPiAgwqB9Cj4gCj4gQEAgLTE2OTUsNyAr MTcyMSw3IEBAIHN0YXRpYyBpbnQgaXRzX3ZscGlfZ2V0KHN0cnVjdCBpcnFfZGF0YSAqZCwgc3Ry dWN0IAo+IGl0c19jbWRfaW5mbyAqaW5mbykKPiAgwqDCoMKgwqAgc3RydWN0IGl0c192bHBpX21h cCAqbWFwOwo+ICDCoMKgwqDCoCBpbnQgcmV0ID0gMDsKPiAKPiAtwqDCoMKgIHJhd19zcGluX2xv Y2soJml0c19kZXYtPmV2ZW50X21hcC52bHBpX2xvY2spOwo+ICvCoMKgwqAgcmF3X3NwaW5fbG9j aygmaXRzX2Rldi0+ZXZlbnRfbWFwLm1hcF9sb2NrKTsKPiAKPiAgwqDCoMKgwqAgbWFwID0gZ2V0 X3ZscGlfbWFwKGQpOwo+IAo+IEBAIC0xNzA4LDcgKzE3MzQsNyBAQCBzdGF0aWMgaW50IGl0c192 bHBpX2dldChzdHJ1Y3QgaXJxX2RhdGEgKmQsIHN0cnVjdCAKPiBpdHNfY21kX2luZm8gKmluZm8p Cj4gIMKgwqDCoMKgICppbmZvLT5tYXAgPSAqbWFwOwo+IAo+ICDCoG91dDoKPiAtwqDCoMKgIHJh d19zcGluX3VubG9jaygmaXRzX2Rldi0+ZXZlbnRfbWFwLnZscGlfbG9jayk7Cj4gK8KgwqDCoCBy YXdfc3Bpbl91bmxvY2soJml0c19kZXYtPmV2ZW50X21hcC5tYXBfbG9jayk7Cj4gIMKgwqDCoMKg IHJldHVybiByZXQ7Cj4gIMKgfQo+IAo+IEBAIC0xNzE4LDcgKzE3NDQsNyBAQCBzdGF0aWMgaW50 IGl0c192bHBpX3VubWFwKHN0cnVjdCBpcnFfZGF0YSAqZCkKPiAgwqDCoMKgwqAgdTMyIGV2ZW50 ID0gaXRzX2dldF9ldmVudF9pZChkKTsKPiAgwqDCoMKgwqAgaW50IHJldCA9IDA7Cj4gCj4gLcKg wqDCoCByYXdfc3Bpbl9sb2NrKCZpdHNfZGV2LT5ldmVudF9tYXAudmxwaV9sb2NrKTsKPiArwqDC oMKgIHJhd19zcGluX2xvY2soJml0c19kZXYtPmV2ZW50X21hcC5tYXBfbG9jayk7Cj4gCj4gIMKg wqDCoMKgIGlmICghaXRzX2Rldi0+ZXZlbnRfbWFwLnZtIHx8ICFpcnFkX2lzX2ZvcndhcmRlZF90 b192Y3B1KGQpKSB7Cj4gIMKgwqDCoMKgwqDCoMKgwqAgcmV0ID0gLUVJTlZBTDsKPiBAQCAtMTc0 OCw3ICsxNzc0LDcgQEAgc3RhdGljIGludCBpdHNfdmxwaV91bm1hcChzdHJ1Y3QgaXJxX2RhdGEg KmQpCj4gIMKgwqDCoMKgIH0KPiAKPiAgwqBvdXQ6Cj4gLcKgwqDCoCByYXdfc3Bpbl91bmxvY2so Jml0c19kZXYtPmV2ZW50X21hcC52bHBpX2xvY2spOwo+ICvCoMKgwqAgcmF3X3NwaW5fdW5sb2Nr KCZpdHNfZGV2LT5ldmVudF9tYXAubWFwX2xvY2spOwo+ICDCoMKgwqDCoCByZXR1cm4gcmV0Owo+ ICDCoH0KPiAKPiBAQCAtMzE5Myw3ICszMjE5LDcgQEAgc3RhdGljIHN0cnVjdCBpdHNfZGV2aWNl ICppdHNfY3JlYXRlX2RldmljZShzdHJ1Y3QgCj4gaXRzX25vZGUgKml0cywgdTMyIGRldl9pZCwK PiAgwqDCoMKgwqAgZGV2LT5ldmVudF9tYXAuY29sX21hcCA9IGNvbF9tYXA7Cj4gIMKgwqDCoMKg IGRldi0+ZXZlbnRfbWFwLmxwaV9iYXNlID0gbHBpX2Jhc2U7Cj4gIMKgwqDCoMKgIGRldi0+ZXZl bnRfbWFwLm5yX2xwaXMgPSBucl9scGlzOwo+IC3CoMKgwqAgcmF3X3NwaW5fbG9ja19pbml0KCZk ZXYtPmV2ZW50X21hcC52bHBpX2xvY2spOwo+ICvCoMKgwqAgcmF3X3NwaW5fbG9ja19pbml0KCZk ZXYtPmV2ZW50X21hcC5tYXBfbG9jayk7Cj4gIMKgwqDCoMKgIGRldi0+ZGV2aWNlX2lkID0gZGV2 X2lkOwo+ICDCoMKgwqDCoCBJTklUX0xJU1RfSEVBRCgmZGV2LT5lbnRyeSk7Cj4gCj4gQEAgLTM1 NjAsNiArMzU4Niw3IEBAIHN0YXRpYyBpbnQgaXRzX3ZwZV9zZXRfYWZmaW5pdHkoc3RydWN0IGly cV9kYXRhICpkLAo+ICDCoHsKPiAgwqDCoMKgwqAgc3RydWN0IGl0c192cGUgKnZwZSA9IGlycV9k YXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOwo+ICDCoMKgwqDCoCBpbnQgZnJvbSwgY3B1ID0gY3B1 bWFza19maXJzdChtYXNrX3ZhbCk7Cj4gK8KgwqDCoCB1bnNpZ25lZCBsb25nIGZsYWdzOwo+IAo+ ICDCoMKgwqDCoCAvKgo+ICDCoMKgwqDCoMKgICogQ2hhbmdpbmcgYWZmaW5pdHkgaXMgbWVnYSBl eHBlbnNpdmUsIHNvIGxldCdzIGJlIGFzIGxhenkgYXMKPiBAQCAtMzU2Nyw2ICszNTk0LDcgQEAg c3RhdGljIGludCBpdHNfdnBlX3NldF9hZmZpbml0eShzdHJ1Y3QgaXJxX2RhdGEgKmQsCj4gIMKg wqDCoMKgwqAgKiBpbnRvIHRoZSBwcm94eSBkZXZpY2UsIHdlIG5lZWQgdG8gbW92ZSB0aGUgZG9v cmJlbGwKPiAgwqDCoMKgwqDCoCAqIGludGVycnVwdCB0byBpdHMgbmV3IGxvY2F0aW9uLgo+ICDC oMKgwqDCoMKgICovCj4gK8KgwqDCoCByYXdfc3Bpbl9sb2NrX2lycXNhdmUoJnZwZS0+dnBlX2xv Y2ssIGZsYWdzKTsKPiAgwqDCoMKgwqAgaWYgKHZwZS0+Y29sX2lkeCA9PSBjcHUpCj4gIMKgwqDC oMKgwqDCoMKgwqAgZ290byBvdXQ7Cj4gCj4gQEAgLTM1ODYsNiArMzYxNCw3IEBAIHN0YXRpYyBp bnQgaXRzX3ZwZV9zZXRfYWZmaW5pdHkoc3RydWN0IGlycV9kYXRhICpkLAo+IAo+ICDCoG91dDoK PiAgwqDCoMKgwqAgaXJxX2RhdGFfdXBkYXRlX2VmZmVjdGl2ZV9hZmZpbml0eShkLCBjcHVtYXNr X29mKGNwdSkpOwo+ICvCoMKgwqAgcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZwZS0+dnBl X2xvY2ssIGZsYWdzKTsKPiAKPiAgwqDCoMKgwqAgcmV0dXJuIElSUV9TRVRfTUFTS19PS19ET05F Owo+ICDCoH0KPiBAQCAtMzY5NSwxMSArMzcyNCwxNSBAQCBzdGF0aWMgdm9pZCBpdHNfdnBlX3Nl bmRfaW52KHN0cnVjdCBpcnFfZGF0YSAqZCkKPiAKPiAgwqDCoMKgwqAgaWYgKGdpY19yZGlzdHMt Pmhhc19kaXJlY3RfbHBpKSB7Cj4gIMKgwqDCoMKgwqDCoMKgwqAgdm9pZCBfX2lvbWVtICpyZGJh c2U7Cj4gK8KgwqDCoMKgwqDCoMKgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Cj4gK8KgwqDCoMKgwqDC oMKgIGludCBjcHU7Cj4gCj4gIMKgwqDCoMKgwqDCoMKgwqAgLyogVGFyZ2V0IHRoZSByZWRpc3Ry aWJ1dG9yIHRoaXMgVlBFIGlzIGN1cnJlbnRseSBrbm93biBvbiAqLwo+IC3CoMKgwqDCoMKgwqDC oCByZGJhc2UgPSBwZXJfY3B1X3B0cihnaWNfcmRpc3RzLT5yZGlzdCwgdnBlLT5jb2xfaWR4KS0+ cmRfYmFzZTsKPiArwqDCoMKgwqDCoMKgwqAgY3B1ID0gaXJxX3RvX2NwdWlkX2xvY2soZCwgJmZs YWdzKTsKPiArwqDCoMKgwqDCoMKgwqAgcmRiYXNlID0gcGVyX2NwdV9wdHIoZ2ljX3JkaXN0cy0+ cmRpc3QsIGNwdSktPnJkX2Jhc2U7Cj4gIMKgwqDCoMKgwqDCoMKgwqAgZ2ljX3dyaXRlX2xwaXIo ZC0+cGFyZW50X2RhdGEtPmh3aXJxLCByZGJhc2UgKyBHSUNSX0lOVkxQSVIpOwo+ICDCoMKgwqDC oMKgwqDCoMKgIHdhaXRfZm9yX3N5bmNyKHJkYmFzZSk7Cj4gK8KgwqDCoMKgwqDCoMKgIGlycV90 b19jcHVpZF91bmxvY2soZCwgZmxhZ3MpOwo+ICDCoMKgwqDCoCB9IGVsc2Ugewo+ICDCoMKgwqDC oMKgwqDCoMKgIGl0c192cGVfc2VuZF9jbWQodnBlLCBpdHNfc2VuZF9pbnYpOwo+ICDCoMKgwqDC oCB9CgpEbyB3ZSByZWFsbHkgbmVlZCB0byBncmFiIHRoZSB2cGVfbG9jayBmb3IgdGhvc2Ugd2hp Y2ggYXJlIGJlbG9uZyB0bwp0aGUgc2FtZSBpcnFjaGlwIHdpdGggaXRzX3ZwZV9zZXRfYWZmaW5p dHkoKT8gVGhlIElSUSBjb3JlIGNvZGUgc2hvdWxkCmFscmVhZHkgZW5zdXJlIHRoZSBtdXR1YWwg ZXhjbHVzaW9uIGFtb25nIHRoZW0sIHdyb25nPwoKPiBAQCAtMzczNSwxNCArMzc2OCwxOCBAQCBz dGF0aWMgaW50IGl0c192cGVfc2V0X2lycWNoaXBfc3RhdGUoc3RydWN0IAo+IGlycV9kYXRhICpk LAo+IAo+ICDCoMKgwqDCoCBpZiAoZ2ljX3JkaXN0cy0+aGFzX2RpcmVjdF9scGkpIHsKPiAgwqDC oMKgwqDCoMKgwqDCoCB2b2lkIF9faW9tZW0gKnJkYmFzZTsKPiArwqDCoMKgwqDCoMKgwqAgdW5z aWduZWQgbG9uZyBmbGFnczsKPiArwqDCoMKgwqDCoMKgwqAgaW50IGNwdTsKPiAKPiAtwqDCoMKg wqDCoMKgwqAgcmRiYXNlID0gcGVyX2NwdV9wdHIoZ2ljX3JkaXN0cy0+cmRpc3QsIHZwZS0+Y29s X2lkeCktPnJkX2Jhc2U7Cj4gK8KgwqDCoMKgwqDCoMKgIGNwdSA9IGlycV90b19jcHVpZF9sb2Nr KGQsICZmbGFncyk7Cj4gK8KgwqDCoMKgwqDCoMKgIHJkYmFzZSA9IHBlcl9jcHVfcHRyKGdpY19y ZGlzdHMtPnJkaXN0LCBjcHUpLT5yZF9iYXNlOwo+ICDCoMKgwqDCoMKgwqDCoMKgIGlmIChzdGF0 ZSkgewo+ICDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZ2ljX3dyaXRlX2xwaXIodnBlLT52cGVf ZGJfbHBpLCByZGJhc2UgKyBHSUNSX1NFVExQSVIpOwo+ICDCoMKgwqDCoMKgwqDCoMKgIH0gZWxz ZSB7Cj4gIMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBnaWNfd3JpdGVfbHBpcih2cGUtPnZwZV9k Yl9scGksIHJkYmFzZSArIEdJQ1JfQ0xSTFBJUik7Cj4gIMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCB3YWl0X2Zvcl9zeW5jcihyZGJhc2UpOwo+ICDCoMKgwqDCoMKgwqDCoMKgIH0KPiArwqDCoMKg wqDCoMKgwqAgaXJxX3RvX2NwdWlkX3VubG9jayhkLCBmbGFncyk7Cj4gIMKgwqDCoMKgIH0gZWxz ZSB7Cj4gIMKgwqDCoMKgwqDCoMKgwqAgaWYgKHN0YXRlKQo+ICDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgaXRzX3ZwZV9zZW5kX2NtZCh2cGUsIGl0c19zZW5kX2ludCk7Cj4gQEAgLTM4NTQsMTQg KzM4OTEsMTcgQEAgc3RhdGljIHZvaWQgaXRzX3ZwZV80XzFfZGVzY2hlZHVsZShzdHJ1Y3QgCj4g aXRzX3ZwZSAqdnBlLAo+ICDCoHN0YXRpYyB2b2lkIGl0c192cGVfNF8xX2ludmFsbChzdHJ1Y3Qg aXRzX3ZwZSAqdnBlKQo+ICDCoHsKPiAgwqDCoMKgwqAgdm9pZCBfX2lvbWVtICpyZGJhc2U7Cj4g K8KgwqDCoCB1bnNpZ25lZCBsb25nIGZsYWdzOwo+ICDCoMKgwqDCoCB1NjQgdmFsOwo+IAo+ICDC oMKgwqDCoCB2YWzCoCA9IEdJQ1JfSU5WQUxMUl9WOwo+ICDCoMKgwqDCoCB2YWwgfD0gRklFTERf UFJFUChHSUNSX0lOVkFMTFJfVlBFSUQsIHZwZS0+dnBlX2lkKTsKPiAKPiAgwqDCoMKgwqAgLyog VGFyZ2V0IHRoZSByZWRpc3RyaWJ1dG9yIHRoaXMgdlBFIGlzIGN1cnJlbnRseSBrbm93biBvbiAq Lwo+ICvCoMKgwqAgcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZ2cGUtPnZwZV9sb2NrLCBmbGFncyk7 Cj4gIMKgwqDCoMKgIHJkYmFzZSA9IHBlcl9jcHVfcHRyKGdpY19yZGlzdHMtPnJkaXN0LCB2cGUt PmNvbF9pZHgpLT5yZF9iYXNlOwo+ICDCoMKgwqDCoCBnaWNfd3JpdGVfbHBpcih2YWwsIHJkYmFz ZSArIEdJQ1JfSU5WQUxMUik7Cj4gK8KgwqDCoCByYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgm dnBlLT52cGVfbG9jaywgZmxhZ3MpOwo+ICDCoH0KPiAKPiAgwqBzdGF0aWMgaW50IGl0c192cGVf NF8xX3NldF92Y3B1X2FmZmluaXR5KHN0cnVjdCBpcnFfZGF0YSAqZCwgdm9pZCAKPiAqdmNwdV9p bmZvKQo+IEBAIC0zOTYwLDEzICs0MDAwLDE3IEBAIHN0YXRpYyBpbnQgaXRzX3NnaV9nZXRfaXJx Y2hpcF9zdGF0ZShzdHJ1Y3QgCj4gaXJxX2RhdGEgKmQsCj4gIMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBlbnVtIGlycWNoaXBfaXJxX3N0YXRlIHdoaWNoLCBib29s ICp2YWwpCj4gIMKgewo+ICDCoMKgwqDCoCBzdHJ1Y3QgaXRzX3ZwZSAqdnBlID0gaXJxX2RhdGFf Z2V0X2lycV9jaGlwX2RhdGEoZCk7Cj4gLcKgwqDCoCB2b2lkIF9faW9tZW0gKmJhc2UgPSBnaWNf ZGF0YV9yZGlzdF9jcHUodnBlLT5jb2xfaWR4KS0+cmRfYmFzZSArIAo+IFNaXzEyOEs7Cj4gK8Kg wqDCoCB2b2lkIF9faW9tZW0gKmJhc2U7Cj4gK8KgwqDCoCB1bnNpZ25lZCBsb25nIGZsYWdzOwo+ ICDCoMKgwqDCoCB1MzIgY291bnQgPSAxMDAwMDAwO8KgwqDCoCAvKiAxcyEgKi8KPiAgwqDCoMKg wqAgdTMyIHN0YXR1czsKPiArwqDCoMKgIGludCBjcHU7Cj4gCj4gIMKgwqDCoMKgIGlmICh3aGlj aCAhPSBJUlFDSElQX1NUQVRFX1BFTkRJTkcpCj4gIMKgwqDCoMKgwqDCoMKgwqAgcmV0dXJuIC1F SU5WQUw7Cj4gCj4gK8KgwqDCoCBjcHUgPSBpcnFfdG9fY3B1aWRfbG9jayhkLCAmZmxhZ3MpOwo+ ICvCoMKgwqAgYmFzZSA9IGdpY19kYXRhX3JkaXN0X2NwdShjcHUpLT5yZF9iYXNlICsgU1pfMTI4 SzsKPiAgwqDCoMKgwqAgd3JpdGVsX3JlbGF4ZWQodnBlLT52cGVfaWQsIGJhc2UgKyBHSUNSX1ZT R0lSKTsKPiAgwqDCoMKgwqAgZG8gewo+ICDCoMKgwqDCoMKgwqDCoMKgIHN0YXR1cyA9IHJlYWRs X3JlbGF4ZWQoYmFzZSArIEdJQ1JfVlNHSVBFTkRSKTsKPiBAQCAtMzk4Myw2ICs0MDI3LDcgQEAg c3RhdGljIGludCBpdHNfc2dpX2dldF9pcnFjaGlwX3N0YXRlKHN0cnVjdCAKPiBpcnFfZGF0YSAq ZCwKPiAgwqDCoMKgwqAgfSB3aGlsZShjb3VudCk7Cj4gCj4gIMKgb3V0Ogo+ICvCoMKgwqAgaXJx X3RvX2NwdWlkX3VubG9jayhkLCBmbGFncyk7Cj4gIMKgwqDCoMKgICp2YWwgPSAhIShzdGF0dXMg JiAoMSA8PCBkLT5od2lycSkpOwo+IAo+ICDCoMKgwqDCoCByZXR1cm4gMDsKPiBAQCAtNDEwMiw2 ICs0MTQ3LDcgQEAgc3RhdGljIGludCBpdHNfdnBlX2luaXQoc3RydWN0IGl0c192cGUgKnZwZSkK PiAgwqDCoMKgwqDCoMKgwqDCoCByZXR1cm4gLUVOT01FTTsKPiAgwqDCoMKgwqAgfQo+IAo+ICvC oMKgwqAgcmF3X3NwaW5fbG9ja19pbml0KCZ2cGUtPnZwZV9sb2NrKTsKPiAgwqDCoMKgwqAgdnBl LT52cGVfaWQgPSB2cGVfaWQ7Cj4gIMKgwqDCoMKgIHZwZS0+dnB0X3BhZ2UgPSB2cHRfcGFnZTsK PiAgwqDCoMKgwqAgaWYgKGdpY19yZGlzdHMtPmhhc19ydnBlaWQpCj4gZGlmZiAtLWdpdCBhL2lu Y2x1ZGUvbGludXgvaXJxY2hpcC9hcm0tZ2ljLXY0LmggCj4gYi9pbmNsdWRlL2xpbnV4L2lycWNo aXAvYXJtLWdpYy12NC5oCj4gaW5kZXggNDZjMTY3YTYzNDlmLi5mYzQzYTYzODc1YTMgMTAwNjQ0 Cj4gLS0tIGEvaW5jbHVkZS9saW51eC9pcnFjaGlwL2FybS1naWMtdjQuaAo+ICsrKyBiL2luY2x1 ZGUvbGludXgvaXJxY2hpcC9hcm0tZ2ljLXY0LmgKPiBAQCAtNjAsNiArNjAsNyBAQCBzdHJ1Y3Qg aXRzX3ZwZSB7Cj4gIMKgwqDCoMKgwqDCoMKgwqAgfTsKPiAgwqDCoMKgwqAgfTsKPiAKPiArwqDC oMKgIHJhd19zcGlubG9ja190wqDCoMKgwqDCoMKgwqAgdnBlX2xvY2s7Cj4gIMKgwqDCoMKgIC8q Cj4gIMKgwqDCoMKgwqAgKiBUaGlzIGNvbGxlY3Rpb24gSUQgaXMgdXNlZCB0byBpbmRpcmVjdCB0 aGUgdGFyZ2V0Cj4gIMKgwqDCoMKgwqAgKiByZWRpc3RyaWJ1dG9yIGZvciB0aGlzIFZQRS4gVGhl IElEIGl0c2VsZiBpc24ndCBpbnZvbHZlZCBpbgoKSSdtIG5vdCBzdXJlIGlmIGl0J3MgZ29vZCBl bm91Z2gsIGl0IG1heSBnZXRzIG11Y2ggY2xlYXJlciBhZnRlcgpzcGxpdHRpbmcuCgoKVGhhbmtz LApaZW5naHVpCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f Xwprdm1hcm0gbWFpbGluZyBsaXN0Cmt2bWFybUBsaXN0cy5jcy5jb2x1bWJpYS5lZHUKaHR0cHM6 Ly9saXN0cy5jcy5jb2x1bWJpYS5lZHUvbWFpbG1hbi9saXN0aW5mby9rdm1hcm0K From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.5 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SPF_HELO_NONE,SPF_PASS,UNWANTED_LANGUAGE_BODY,USER_AGENT_SANE_1 autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id D0024C7619D for ; Thu, 20 Feb 2020 03:12:13 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id A07A124656 for ; Thu, 20 Feb 2020 03:12:13 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="Ob2CkSnR" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org A07A124656 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=huawei.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender:Content-Type: Content-Transfer-Encoding:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:Date:Message-ID:From: References:To:Subject:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=5of3iT64EqghnFud+wCZA1Kqit0b8foVzCB0lQ5Ac74=; b=Ob2CkSnRuKmOKOK+va+ngpGxA qzLqCKAs4n2anmywHVvUX4LY9XQ6PR3q8RPN3TEZ589YTbja7XxgPEG3Uqt/VWYwTo30S5odObdqZ Nd3X2bWV9P54fPFJ5A8K7/O4yeTrWHdCxQgnFmx06t5HQKz8mRWqOodcmk6MmtK6O9aDqNTLudAoC s4wS3d6rvmQ+4AqDChHXnzK67AdSxuP6bRDCdZx/T0L77yKaGbq/yhVF6tthbsmQJ3H7qxLD4BGQo JzYY8kc6/W6W0t0euO8nqDgXXrwRjChg0K+2vCrMRMub5Uz9NbOzneqSra/KEavaYiORmyJruicW3 2YEeisRvw==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1j4cFy-0006hM-Sb; Thu, 20 Feb 2020 03:12:06 +0000 Received: from szxga05-in.huawei.com ([45.249.212.191] helo=huawei.com) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1j4cFu-0006gR-Eg for linux-arm-kernel@lists.infradead.org; Thu, 20 Feb 2020 03:12:04 +0000 Received: from DGGEMS402-HUB.china.huawei.com (unknown [172.30.72.60]) by Forcepoint Email with ESMTP id D666413F5CF89FEEF4BC; Thu, 20 Feb 2020 11:11:57 +0800 (CST) Received: from [127.0.0.1] (10.173.222.27) by DGGEMS402-HUB.china.huawei.com (10.3.19.202) with Microsoft SMTP Server id 14.3.439.0; Thu, 20 Feb 2020 11:11:48 +0800 Subject: Re: [PATCH v4 08/20] irqchip/gic-v4.1: Plumb get/set_irqchip_state SGI callbacks To: Marc Zyngier References: <20200214145736.18550-1-maz@kernel.org> <20200214145736.18550-9-maz@kernel.org> <4b7f71f1-5e7f-e6af-f47d-7ed0d3a8739f@huawei.com> <75597af0d2373ac4d92d8162a1338cbb@kernel.org> <19a7c193f0e4b97343e822a35f0911ed@kernel.org> From: Zenghui Yu Message-ID: <3d725ede-6631-59fb-1a10-9fb9890f3df6@huawei.com> Date: Thu, 20 Feb 2020 11:11:46 +0800 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:68.0) Gecko/20100101 Thunderbird/68.2.0 MIME-Version: 1.0 In-Reply-To: <19a7c193f0e4b97343e822a35f0911ed@kernel.org> Content-Language: en-US X-Originating-IP: [10.173.222.27] X-CFilter-Loop: Reflected X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200219_191202_829351_C6AE252A X-CRM114-Status: GOOD ( 23.76 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Lorenzo Pieralisi , Jason Cooper , kvm@vger.kernel.org, Suzuki K Poulose , linux-kernel@vger.kernel.org, Eric Auger , Robert Richter , James Morse , Julien Thierry , Thomas Gleixner , kvmarm@lists.cs.columbia.edu, linux-arm-kernel@lists.infradead.org Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org SGkgTWFyYywKCk9uIDIwMjAvMi8xOCAyMzozMSwgTWFyYyBaeW5naWVyIHdyb3RlOgo+IGRpZmYg LS1naXQgYS9kcml2ZXJzL2lycWNoaXAvaXJxLWdpYy12My1pdHMuYyAKPiBiL2RyaXZlcnMvaXJx Y2hpcC9pcnEtZ2ljLXYzLWl0cy5jCj4gaW5kZXggNzY1NmIzNTNhOTVmLi4wZWQyODZkYmE4Mjcg MTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9pcnFjaGlwL2lycS1naWMtdjMtaXRzLmMKPiArKysgYi9k cml2ZXJzL2lycWNoaXAvaXJxLWdpYy12My1pdHMuYwo+IEBAIC0xNDQsNyArMTQ0LDcgQEAgc3Ry dWN0IGV2ZW50X2xwaV9tYXAgewo+ICDCoMKgwqDCoCB1MTbCoMKgwqDCoMKgwqDCoMKgwqDCoMKg ICpjb2xfbWFwOwo+ICDCoMKgwqDCoCBpcnFfaHdfbnVtYmVyX3TCoMKgwqDCoMKgwqDCoCBscGlf YmFzZTsKPiAgwqDCoMKgwqAgaW50wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBucl9scGlzOwo+IC3C oMKgwqAgcmF3X3NwaW5sb2NrX3TCoMKgwqDCoMKgwqDCoCB2bHBpX2xvY2s7Cj4gK8KgwqDCoCBy YXdfc3BpbmxvY2tfdMKgwqDCoMKgwqDCoMKgIG1hcF9sb2NrOwoKU28gd2UgdXNlIG1hcF9sb2Nr IHRvIHByb3RlY3QgYm90aCBMUEkncyBhbmQgVkxQSSdzIG1hcHBpbmcgYWZmaW5pdHkgb2YKYSBk ZXZpY2UsIGFuZCB1c2UgdnBlX2xvY2sgdG8gcHJvdGVjdCB2UEUncyBhZmZpbml0eSwgT0suCgo+ ICDCoMKgwqDCoCBzdHJ1Y3QgaXRzX3ZtwqDCoMKgwqDCoMKgwqAgKnZtOwo+ICDCoMKgwqDCoCBz dHJ1Y3QgaXRzX3ZscGlfbWFwwqDCoMKgICp2bHBpX21hcHM7Cj4gIMKgwqDCoMKgIGludMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgbnJfdmxwaXM7Cj4gQEAgLTI0MCwxNSArMjQwLDMzIEBAIHN0YXRp YyBzdHJ1Y3QgaXRzX3ZscGlfbWFwICpnZXRfdmxwaV9tYXAoc3RydWN0IAo+IGlycV9kYXRhICpk KQo+ICDCoMKgwqDCoCByZXR1cm4gTlVMTDsKPiAgwqB9Cj4gCj4gLXN0YXRpYyBpbnQgaXJxX3Rv X2NwdWlkKHN0cnVjdCBpcnFfZGF0YSAqZCkKPiArc3RhdGljIGludCBpcnFfdG9fY3B1aWRfbG9j ayhzdHJ1Y3QgaXJxX2RhdGEgKmQsIHVuc2lnbmVkIGxvbmcgKmZsYWdzKQo+ICDCoHsKPiAtwqDC oMKgIHN0cnVjdCBpdHNfZGV2aWNlICppdHNfZGV2ID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2Rh dGEoZCk7Cj4gIMKgwqDCoMKgIHN0cnVjdCBpdHNfdmxwaV9tYXAgKm1hcCA9IGdldF92bHBpX21h cChkKTsKPiArwqDCoMKgIGludCBjcHU7Cj4gCj4gLcKgwqDCoCBpZiAobWFwKQo+IC3CoMKgwqDC oMKgwqDCoCByZXR1cm4gbWFwLT52cGUtPmNvbF9pZHg7Cj4gK8KgwqDCoCBpZiAobWFwKSB7Cj4g K8KgwqDCoMKgwqDCoMKgIHJhd19zcGluX2xvY2tfaXJxc2F2ZSgmbWFwLT52cGUtPnZwZV9sb2Nr LCAqZmxhZ3MpOwo+ICvCoMKgwqDCoMKgwqDCoCBjcHUgPSBtYXAtPnZwZS0+Y29sX2lkeDsKPiAr wqDCoMKgIH0gZWxzZSB7Cj4gK8KgwqDCoMKgwqDCoMKgIHN0cnVjdCBpdHNfZGV2aWNlICppdHNf ZGV2ID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7Cj4gK8KgwqDCoMKgwqDCoMKgIHJh d19zcGluX2xvY2tfaXJxc2F2ZSgmaXRzX2Rldi0+ZXZlbnRfbWFwLm1hcF9sb2NrLCAqZmxhZ3Mp Owo+ICvCoMKgwqDCoMKgwqDCoCBjcHUgPSBpdHNfZGV2LT5ldmVudF9tYXAuY29sX21hcFtpdHNf Z2V0X2V2ZW50X2lkKGQpXTsKPiArwqDCoMKgIH0KPiAKPiAtwqDCoMKgIHJldHVybiBpdHNfZGV2 LT5ldmVudF9tYXAuY29sX21hcFtpdHNfZ2V0X2V2ZW50X2lkKGQpXTsKPiArwqDCoMKgIHJldHVy biBjcHU7Cj4gK30KClRoaXMgaGVscGVyIGlzIGNvcnJlY3QgZm9yIG5vcm1hbCBMUElzIGFuZCBW TFBJcywgYnV0IHdyb25nIGZvciBwZXItdlBFCklSUSAoZG9vcmJlbGwpIGFuZCB2U0dJcy4gaXJx X2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoKSBnZXRzIGNvbmZ1c2VkIGJ5CmJvdGggb2YgdGhlbS4K Cj4gKwo+ICtzdGF0aWMgdm9pZCBpcnFfdG9fY3B1aWRfdW5sb2NrKHN0cnVjdCBpcnFfZGF0YSAq ZCwgdW5zaWduZWQgbG9uZyBmbGFncykKPiArewo+ICvCoMKgwqAgc3RydWN0IGl0c192bHBpX21h cCAqbWFwID0gZ2V0X3ZscGlfbWFwKGQpOwo+ICsKPiArwqDCoMKgIGlmIChtYXApIHsKPiArwqDC oMKgwqDCoMKgwqAgcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1hcC0+dnBlLT52cGVfbG9j aywgZmxhZ3MpOwo+ICvCoMKgwqAgfSBlbHNlIHsKPiArwqDCoMKgwqDCoMKgwqAgc3RydWN0IGl0 c19kZXZpY2UgKml0c19kZXYgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKPiArwqDC oMKgwqDCoMKgwqAgcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJml0c19kZXYtPmV2ZW50X21h cC5tYXBfbG9jaywgZmxhZ3MpOwo+ICvCoMKgwqAgfQo+ICDCoH0KClRoZSBzYW1lIHByb2JsZW0g Zm9yIHRoaXMgaGVscGVyLgoKPiAKPiAgwqBzdGF0aWMgc3RydWN0IGl0c19jb2xsZWN0aW9uICp2 YWxpZF9jb2woc3RydWN0IGl0c19jb2xsZWN0aW9uICpjb2wpCj4gQEAgLTEzODQsNiArMTQwMiw4 IEBAIHN0YXRpYyB2b2lkIGRpcmVjdF9scGlfaW52KHN0cnVjdCBpcnFfZGF0YSAqZCkKPiAgwqB7 Cj4gIMKgwqDCoMKgIHN0cnVjdCBpdHNfdmxwaV9tYXAgKm1hcCA9IGdldF92bHBpX21hcChkKTsK PiAgwqDCoMKgwqAgdm9pZCBfX2lvbWVtICpyZGJhc2U7Cj4gK8KgwqDCoCB1bnNpZ25lZCBsb25n IGZsYWdzOwo+ICvCoMKgwqAgaW50IGNwdTsKPiAgwqDCoMKgwqAgdTY0IHZhbDsKPiAKPiAgwqDC oMKgwqAgaWYgKG1hcCkgewo+IEBAIC0xMzk5LDEwICsxNDE5LDEyIEBAIHN0YXRpYyB2b2lkIGRp cmVjdF9scGlfaW52KHN0cnVjdCBpcnFfZGF0YSAqZCkKPiAgwqDCoMKgwqAgfQo+IAo+ICDCoMKg wqDCoCAvKiBUYXJnZXQgdGhlIHJlZGlzdHJpYnV0b3IgdGhpcyBMUEkgaXMgY3VycmVudGx5IHJv dXRlZCB0byAqLwo+IC3CoMKgwqAgcmRiYXNlID0gcGVyX2NwdV9wdHIoZ2ljX3JkaXN0cy0+cmRp c3QsIGlycV90b19jcHVpZChkKSktPnJkX2Jhc2U7Cj4gK8KgwqDCoCBjcHUgPSBpcnFfdG9fY3B1 aWRfbG9jayhkLCAmZmxhZ3MpOwo+ICvCoMKgwqAgcmRiYXNlID0gcGVyX2NwdV9wdHIoZ2ljX3Jk aXN0cy0+cmRpc3QsIGNwdSktPnJkX2Jhc2U7Cj4gIMKgwqDCoMKgIGdpY193cml0ZV9scGlyKHZh bCwgcmRiYXNlICsgR0lDUl9JTlZMUElSKTsKPiAKPiAgwqDCoMKgwqAgd2FpdF9mb3Jfc3luY3Io cmRiYXNlKTsKPiArwqDCoMKgIGlycV90b19jcHVpZF91bmxvY2soZCwgZmxhZ3MpOwo+ICDCoH0K PiAKPiAgwqBzdGF0aWMgdm9pZCBscGlfdXBkYXRlX2NvbmZpZyhzdHJ1Y3QgaXJxX2RhdGEgKmQs IHU4IGNsciwgdTggc2V0KQo+IEBAIC0xNDcxLDExICsxNDkzLDExIEBAIHN0YXRpYyB2b2lkIGl0 c191bm1hc2tfaXJxKHN0cnVjdCBpcnFfZGF0YSAqZCkKPiAgwqBzdGF0aWMgaW50IGl0c19zZXRf YWZmaW5pdHkoc3RydWN0IGlycV9kYXRhICpkLCBjb25zdCBzdHJ1Y3QgY3B1bWFzayAKPiAqbWFz a192YWwsCj4gIMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGJvb2wgZm9yY2UpCj4g IMKgewo+IC3CoMKgwqAgdW5zaWduZWQgaW50IGNwdTsKPiAgwqDCoMKgwqAgY29uc3Qgc3RydWN0 IGNwdW1hc2sgKmNwdV9tYXNrID0gY3B1X29ubGluZV9tYXNrOwo+ICDCoMKgwqDCoCBzdHJ1Y3Qg aXRzX2RldmljZSAqaXRzX2RldiA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOwo+ICDC oMKgwqDCoCBzdHJ1Y3QgaXRzX2NvbGxlY3Rpb24gKnRhcmdldF9jb2w7Cj4gLcKgwqDCoCB1MzIg aWQgPSBpdHNfZ2V0X2V2ZW50X2lkKGQpOwo+ICvCoMKgwqAgdW5zaWduZWQgaW50IGZyb20sIGNw dTsKPiArwqDCoMKgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Cj4gCj4gIMKgwqDCoMKgIC8qIEEgZm9y d2FyZGVkIGludGVycnVwdCBzaG91bGQgdXNlIGlycV9zZXRfdmNwdV9hZmZpbml0eSAqLwo+ICDC oMKgwqDCoCBpZiAoaXJxZF9pc19mb3J3YXJkZWRfdG9fdmNwdShkKSkKPiBAQCAtMTQ5NiwxMiAr MTUxOCwxNiBAQCBzdGF0aWMgaW50IGl0c19zZXRfYWZmaW5pdHkoc3RydWN0IGlycV9kYXRhICpk LCAKPiBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqbWFza192YWwsCj4gIMKgwqDCoMKgwqDCoMKgwqAg cmV0dXJuIC1FSU5WQUw7Cj4gCj4gIMKgwqDCoMKgIC8qIGRvbid0IHNldCB0aGUgYWZmaW5pdHkg d2hlbiB0aGUgdGFyZ2V0IGNwdSBpcyBzYW1lIGFzIGN1cnJlbnQgCj4gb25lICovCj4gLcKgwqDC oCBpZiAoY3B1ICE9IGl0c19kZXYtPmV2ZW50X21hcC5jb2xfbWFwW2lkXSkgewo+ICvCoMKgwqAg ZnJvbSA9IGlycV90b19jcHVpZF9sb2NrKGQsICZmbGFncyk7Cj4gK8KgwqDCoCBpZiAoY3B1ICE9 IGZyb20pIHsKPiArwqDCoMKgwqDCoMKgwqAgdTMyIGlkID0gaXRzX2dldF9ldmVudF9pZChkKTsK PiArCj4gIMKgwqDCoMKgwqDCoMKgwqAgdGFyZ2V0X2NvbCA9ICZpdHNfZGV2LT5pdHMtPmNvbGxl Y3Rpb25zW2NwdV07Cj4gIMKgwqDCoMKgwqDCoMKgwqAgaXRzX3NlbmRfbW92aShpdHNfZGV2LCB0 YXJnZXRfY29sLCBpZCk7Cj4gIMKgwqDCoMKgwqDCoMKgwqAgaXRzX2Rldi0+ZXZlbnRfbWFwLmNv bF9tYXBbaWRdID0gY3B1Owo+ICDCoMKgwqDCoMKgwqDCoMKgIGlycV9kYXRhX3VwZGF0ZV9lZmZl Y3RpdmVfYWZmaW5pdHkoZCwgY3B1bWFza19vZihjcHUpKTsKPiAgwqDCoMKgwqAgfQo+ICvCoMKg wqAgaXJxX3RvX2NwdWlkX3VubG9jayhkLCBmbGFncyk7Cj4gCj4gIMKgwqDCoMKgIHJldHVybiBJ UlFfU0VUX01BU0tfT0tfRE9ORTsKPiAgwqB9Cj4gQEAgLTE2MzYsNyArMTY2Miw3IEBAIHN0YXRp YyBpbnQgaXRzX3ZscGlfbWFwKHN0cnVjdCBpcnFfZGF0YSAqZCwgc3RydWN0IAo+IGl0c19jbWRf aW5mbyAqaW5mbykKPiAgwqDCoMKgwqAgaWYgKCFpbmZvLT5tYXApCj4gIMKgwqDCoMKgwqDCoMKg wqAgcmV0dXJuIC1FSU5WQUw7Cj4gCj4gLcKgwqDCoCByYXdfc3Bpbl9sb2NrKCZpdHNfZGV2LT5l dmVudF9tYXAudmxwaV9sb2NrKTsKPiArwqDCoMKgIHJhd19zcGluX2xvY2soJml0c19kZXYtPmV2 ZW50X21hcC5tYXBfbG9jayk7Cj4gCj4gIMKgwqDCoMKgIGlmICghaXRzX2Rldi0+ZXZlbnRfbWFw LnZtKSB7Cj4gIMKgwqDCoMKgwqDCoMKgwqAgc3RydWN0IGl0c192bHBpX21hcCAqbWFwczsKPiBA QCAtMTY4NSw3ICsxNzExLDcgQEAgc3RhdGljIGludCBpdHNfdmxwaV9tYXAoc3RydWN0IGlycV9k YXRhICpkLCBzdHJ1Y3QgCj4gaXRzX2NtZF9pbmZvICppbmZvKQo+ICDCoMKgwqDCoCB9Cj4gCj4g IMKgb3V0Ogo+IC3CoMKgwqAgcmF3X3NwaW5fdW5sb2NrKCZpdHNfZGV2LT5ldmVudF9tYXAudmxw aV9sb2NrKTsKPiArwqDCoMKgIHJhd19zcGluX3VubG9jaygmaXRzX2Rldi0+ZXZlbnRfbWFwLm1h cF9sb2NrKTsKPiAgwqDCoMKgwqAgcmV0dXJuIHJldDsKPiAgwqB9Cj4gCj4gQEAgLTE2OTUsNyAr MTcyMSw3IEBAIHN0YXRpYyBpbnQgaXRzX3ZscGlfZ2V0KHN0cnVjdCBpcnFfZGF0YSAqZCwgc3Ry dWN0IAo+IGl0c19jbWRfaW5mbyAqaW5mbykKPiAgwqDCoMKgwqAgc3RydWN0IGl0c192bHBpX21h cCAqbWFwOwo+ICDCoMKgwqDCoCBpbnQgcmV0ID0gMDsKPiAKPiAtwqDCoMKgIHJhd19zcGluX2xv Y2soJml0c19kZXYtPmV2ZW50X21hcC52bHBpX2xvY2spOwo+ICvCoMKgwqAgcmF3X3NwaW5fbG9j aygmaXRzX2Rldi0+ZXZlbnRfbWFwLm1hcF9sb2NrKTsKPiAKPiAgwqDCoMKgwqAgbWFwID0gZ2V0 X3ZscGlfbWFwKGQpOwo+IAo+IEBAIC0xNzA4LDcgKzE3MzQsNyBAQCBzdGF0aWMgaW50IGl0c192 bHBpX2dldChzdHJ1Y3QgaXJxX2RhdGEgKmQsIHN0cnVjdCAKPiBpdHNfY21kX2luZm8gKmluZm8p Cj4gIMKgwqDCoMKgICppbmZvLT5tYXAgPSAqbWFwOwo+IAo+ICDCoG91dDoKPiAtwqDCoMKgIHJh d19zcGluX3VubG9jaygmaXRzX2Rldi0+ZXZlbnRfbWFwLnZscGlfbG9jayk7Cj4gK8KgwqDCoCBy YXdfc3Bpbl91bmxvY2soJml0c19kZXYtPmV2ZW50X21hcC5tYXBfbG9jayk7Cj4gIMKgwqDCoMKg IHJldHVybiByZXQ7Cj4gIMKgfQo+IAo+IEBAIC0xNzE4LDcgKzE3NDQsNyBAQCBzdGF0aWMgaW50 IGl0c192bHBpX3VubWFwKHN0cnVjdCBpcnFfZGF0YSAqZCkKPiAgwqDCoMKgwqAgdTMyIGV2ZW50 ID0gaXRzX2dldF9ldmVudF9pZChkKTsKPiAgwqDCoMKgwqAgaW50IHJldCA9IDA7Cj4gCj4gLcKg wqDCoCByYXdfc3Bpbl9sb2NrKCZpdHNfZGV2LT5ldmVudF9tYXAudmxwaV9sb2NrKTsKPiArwqDC oMKgIHJhd19zcGluX2xvY2soJml0c19kZXYtPmV2ZW50X21hcC5tYXBfbG9jayk7Cj4gCj4gIMKg wqDCoMKgIGlmICghaXRzX2Rldi0+ZXZlbnRfbWFwLnZtIHx8ICFpcnFkX2lzX2ZvcndhcmRlZF90 b192Y3B1KGQpKSB7Cj4gIMKgwqDCoMKgwqDCoMKgwqAgcmV0ID0gLUVJTlZBTDsKPiBAQCAtMTc0 OCw3ICsxNzc0LDcgQEAgc3RhdGljIGludCBpdHNfdmxwaV91bm1hcChzdHJ1Y3QgaXJxX2RhdGEg KmQpCj4gIMKgwqDCoMKgIH0KPiAKPiAgwqBvdXQ6Cj4gLcKgwqDCoCByYXdfc3Bpbl91bmxvY2so Jml0c19kZXYtPmV2ZW50X21hcC52bHBpX2xvY2spOwo+ICvCoMKgwqAgcmF3X3NwaW5fdW5sb2Nr KCZpdHNfZGV2LT5ldmVudF9tYXAubWFwX2xvY2spOwo+ICDCoMKgwqDCoCByZXR1cm4gcmV0Owo+ ICDCoH0KPiAKPiBAQCAtMzE5Myw3ICszMjE5LDcgQEAgc3RhdGljIHN0cnVjdCBpdHNfZGV2aWNl ICppdHNfY3JlYXRlX2RldmljZShzdHJ1Y3QgCj4gaXRzX25vZGUgKml0cywgdTMyIGRldl9pZCwK PiAgwqDCoMKgwqAgZGV2LT5ldmVudF9tYXAuY29sX21hcCA9IGNvbF9tYXA7Cj4gIMKgwqDCoMKg IGRldi0+ZXZlbnRfbWFwLmxwaV9iYXNlID0gbHBpX2Jhc2U7Cj4gIMKgwqDCoMKgIGRldi0+ZXZl bnRfbWFwLm5yX2xwaXMgPSBucl9scGlzOwo+IC3CoMKgwqAgcmF3X3NwaW5fbG9ja19pbml0KCZk ZXYtPmV2ZW50X21hcC52bHBpX2xvY2spOwo+ICvCoMKgwqAgcmF3X3NwaW5fbG9ja19pbml0KCZk ZXYtPmV2ZW50X21hcC5tYXBfbG9jayk7Cj4gIMKgwqDCoMKgIGRldi0+ZGV2aWNlX2lkID0gZGV2 X2lkOwo+ICDCoMKgwqDCoCBJTklUX0xJU1RfSEVBRCgmZGV2LT5lbnRyeSk7Cj4gCj4gQEAgLTM1 NjAsNiArMzU4Niw3IEBAIHN0YXRpYyBpbnQgaXRzX3ZwZV9zZXRfYWZmaW5pdHkoc3RydWN0IGly cV9kYXRhICpkLAo+ICDCoHsKPiAgwqDCoMKgwqAgc3RydWN0IGl0c192cGUgKnZwZSA9IGlycV9k YXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOwo+ICDCoMKgwqDCoCBpbnQgZnJvbSwgY3B1ID0gY3B1 bWFza19maXJzdChtYXNrX3ZhbCk7Cj4gK8KgwqDCoCB1bnNpZ25lZCBsb25nIGZsYWdzOwo+IAo+ ICDCoMKgwqDCoCAvKgo+ICDCoMKgwqDCoMKgICogQ2hhbmdpbmcgYWZmaW5pdHkgaXMgbWVnYSBl eHBlbnNpdmUsIHNvIGxldCdzIGJlIGFzIGxhenkgYXMKPiBAQCAtMzU2Nyw2ICszNTk0LDcgQEAg c3RhdGljIGludCBpdHNfdnBlX3NldF9hZmZpbml0eShzdHJ1Y3QgaXJxX2RhdGEgKmQsCj4gIMKg wqDCoMKgwqAgKiBpbnRvIHRoZSBwcm94eSBkZXZpY2UsIHdlIG5lZWQgdG8gbW92ZSB0aGUgZG9v cmJlbGwKPiAgwqDCoMKgwqDCoCAqIGludGVycnVwdCB0byBpdHMgbmV3IGxvY2F0aW9uLgo+ICDC oMKgwqDCoMKgICovCj4gK8KgwqDCoCByYXdfc3Bpbl9sb2NrX2lycXNhdmUoJnZwZS0+dnBlX2xv Y2ssIGZsYWdzKTsKPiAgwqDCoMKgwqAgaWYgKHZwZS0+Y29sX2lkeCA9PSBjcHUpCj4gIMKgwqDC oMKgwqDCoMKgwqAgZ290byBvdXQ7Cj4gCj4gQEAgLTM1ODYsNiArMzYxNCw3IEBAIHN0YXRpYyBp bnQgaXRzX3ZwZV9zZXRfYWZmaW5pdHkoc3RydWN0IGlycV9kYXRhICpkLAo+IAo+ICDCoG91dDoK PiAgwqDCoMKgwqAgaXJxX2RhdGFfdXBkYXRlX2VmZmVjdGl2ZV9hZmZpbml0eShkLCBjcHVtYXNr X29mKGNwdSkpOwo+ICvCoMKgwqAgcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZwZS0+dnBl X2xvY2ssIGZsYWdzKTsKPiAKPiAgwqDCoMKgwqAgcmV0dXJuIElSUV9TRVRfTUFTS19PS19ET05F Owo+ICDCoH0KPiBAQCAtMzY5NSwxMSArMzcyNCwxNSBAQCBzdGF0aWMgdm9pZCBpdHNfdnBlX3Nl bmRfaW52KHN0cnVjdCBpcnFfZGF0YSAqZCkKPiAKPiAgwqDCoMKgwqAgaWYgKGdpY19yZGlzdHMt Pmhhc19kaXJlY3RfbHBpKSB7Cj4gIMKgwqDCoMKgwqDCoMKgwqAgdm9pZCBfX2lvbWVtICpyZGJh c2U7Cj4gK8KgwqDCoMKgwqDCoMKgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Cj4gK8KgwqDCoMKgwqDC oMKgIGludCBjcHU7Cj4gCj4gIMKgwqDCoMKgwqDCoMKgwqAgLyogVGFyZ2V0IHRoZSByZWRpc3Ry aWJ1dG9yIHRoaXMgVlBFIGlzIGN1cnJlbnRseSBrbm93biBvbiAqLwo+IC3CoMKgwqDCoMKgwqDC oCByZGJhc2UgPSBwZXJfY3B1X3B0cihnaWNfcmRpc3RzLT5yZGlzdCwgdnBlLT5jb2xfaWR4KS0+ cmRfYmFzZTsKPiArwqDCoMKgwqDCoMKgwqAgY3B1ID0gaXJxX3RvX2NwdWlkX2xvY2soZCwgJmZs YWdzKTsKPiArwqDCoMKgwqDCoMKgwqAgcmRiYXNlID0gcGVyX2NwdV9wdHIoZ2ljX3JkaXN0cy0+ cmRpc3QsIGNwdSktPnJkX2Jhc2U7Cj4gIMKgwqDCoMKgwqDCoMKgwqAgZ2ljX3dyaXRlX2xwaXIo ZC0+cGFyZW50X2RhdGEtPmh3aXJxLCByZGJhc2UgKyBHSUNSX0lOVkxQSVIpOwo+ICDCoMKgwqDC oMKgwqDCoMKgIHdhaXRfZm9yX3N5bmNyKHJkYmFzZSk7Cj4gK8KgwqDCoMKgwqDCoMKgIGlycV90 b19jcHVpZF91bmxvY2soZCwgZmxhZ3MpOwo+ICDCoMKgwqDCoCB9IGVsc2Ugewo+ICDCoMKgwqDC oMKgwqDCoMKgIGl0c192cGVfc2VuZF9jbWQodnBlLCBpdHNfc2VuZF9pbnYpOwo+ICDCoMKgwqDC oCB9CgpEbyB3ZSByZWFsbHkgbmVlZCB0byBncmFiIHRoZSB2cGVfbG9jayBmb3IgdGhvc2Ugd2hp Y2ggYXJlIGJlbG9uZyB0bwp0aGUgc2FtZSBpcnFjaGlwIHdpdGggaXRzX3ZwZV9zZXRfYWZmaW5p dHkoKT8gVGhlIElSUSBjb3JlIGNvZGUgc2hvdWxkCmFscmVhZHkgZW5zdXJlIHRoZSBtdXR1YWwg ZXhjbHVzaW9uIGFtb25nIHRoZW0sIHdyb25nPwoKPiBAQCAtMzczNSwxNCArMzc2OCwxOCBAQCBz dGF0aWMgaW50IGl0c192cGVfc2V0X2lycWNoaXBfc3RhdGUoc3RydWN0IAo+IGlycV9kYXRhICpk LAo+IAo+ICDCoMKgwqDCoCBpZiAoZ2ljX3JkaXN0cy0+aGFzX2RpcmVjdF9scGkpIHsKPiAgwqDC oMKgwqDCoMKgwqDCoCB2b2lkIF9faW9tZW0gKnJkYmFzZTsKPiArwqDCoMKgwqDCoMKgwqAgdW5z aWduZWQgbG9uZyBmbGFnczsKPiArwqDCoMKgwqDCoMKgwqAgaW50IGNwdTsKPiAKPiAtwqDCoMKg wqDCoMKgwqAgcmRiYXNlID0gcGVyX2NwdV9wdHIoZ2ljX3JkaXN0cy0+cmRpc3QsIHZwZS0+Y29s X2lkeCktPnJkX2Jhc2U7Cj4gK8KgwqDCoMKgwqDCoMKgIGNwdSA9IGlycV90b19jcHVpZF9sb2Nr KGQsICZmbGFncyk7Cj4gK8KgwqDCoMKgwqDCoMKgIHJkYmFzZSA9IHBlcl9jcHVfcHRyKGdpY19y ZGlzdHMtPnJkaXN0LCBjcHUpLT5yZF9iYXNlOwo+ICDCoMKgwqDCoMKgwqDCoMKgIGlmIChzdGF0 ZSkgewo+ICDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZ2ljX3dyaXRlX2xwaXIodnBlLT52cGVf ZGJfbHBpLCByZGJhc2UgKyBHSUNSX1NFVExQSVIpOwo+ICDCoMKgwqDCoMKgwqDCoMKgIH0gZWxz ZSB7Cj4gIMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBnaWNfd3JpdGVfbHBpcih2cGUtPnZwZV9k Yl9scGksIHJkYmFzZSArIEdJQ1JfQ0xSTFBJUik7Cj4gIMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCB3YWl0X2Zvcl9zeW5jcihyZGJhc2UpOwo+ICDCoMKgwqDCoMKgwqDCoMKgIH0KPiArwqDCoMKg wqDCoMKgwqAgaXJxX3RvX2NwdWlkX3VubG9jayhkLCBmbGFncyk7Cj4gIMKgwqDCoMKgIH0gZWxz ZSB7Cj4gIMKgwqDCoMKgwqDCoMKgwqAgaWYgKHN0YXRlKQo+ICDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgaXRzX3ZwZV9zZW5kX2NtZCh2cGUsIGl0c19zZW5kX2ludCk7Cj4gQEAgLTM4NTQsMTQg KzM4OTEsMTcgQEAgc3RhdGljIHZvaWQgaXRzX3ZwZV80XzFfZGVzY2hlZHVsZShzdHJ1Y3QgCj4g aXRzX3ZwZSAqdnBlLAo+ICDCoHN0YXRpYyB2b2lkIGl0c192cGVfNF8xX2ludmFsbChzdHJ1Y3Qg aXRzX3ZwZSAqdnBlKQo+ICDCoHsKPiAgwqDCoMKgwqAgdm9pZCBfX2lvbWVtICpyZGJhc2U7Cj4g K8KgwqDCoCB1bnNpZ25lZCBsb25nIGZsYWdzOwo+ICDCoMKgwqDCoCB1NjQgdmFsOwo+IAo+ICDC oMKgwqDCoCB2YWzCoCA9IEdJQ1JfSU5WQUxMUl9WOwo+ICDCoMKgwqDCoCB2YWwgfD0gRklFTERf UFJFUChHSUNSX0lOVkFMTFJfVlBFSUQsIHZwZS0+dnBlX2lkKTsKPiAKPiAgwqDCoMKgwqAgLyog VGFyZ2V0IHRoZSByZWRpc3RyaWJ1dG9yIHRoaXMgdlBFIGlzIGN1cnJlbnRseSBrbm93biBvbiAq Lwo+ICvCoMKgwqAgcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZ2cGUtPnZwZV9sb2NrLCBmbGFncyk7 Cj4gIMKgwqDCoMKgIHJkYmFzZSA9IHBlcl9jcHVfcHRyKGdpY19yZGlzdHMtPnJkaXN0LCB2cGUt PmNvbF9pZHgpLT5yZF9iYXNlOwo+ICDCoMKgwqDCoCBnaWNfd3JpdGVfbHBpcih2YWwsIHJkYmFz ZSArIEdJQ1JfSU5WQUxMUik7Cj4gK8KgwqDCoCByYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgm dnBlLT52cGVfbG9jaywgZmxhZ3MpOwo+ICDCoH0KPiAKPiAgwqBzdGF0aWMgaW50IGl0c192cGVf NF8xX3NldF92Y3B1X2FmZmluaXR5KHN0cnVjdCBpcnFfZGF0YSAqZCwgdm9pZCAKPiAqdmNwdV9p bmZvKQo+IEBAIC0zOTYwLDEzICs0MDAwLDE3IEBAIHN0YXRpYyBpbnQgaXRzX3NnaV9nZXRfaXJx Y2hpcF9zdGF0ZShzdHJ1Y3QgCj4gaXJxX2RhdGEgKmQsCj4gIMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBlbnVtIGlycWNoaXBfaXJxX3N0YXRlIHdoaWNoLCBib29s ICp2YWwpCj4gIMKgewo+ICDCoMKgwqDCoCBzdHJ1Y3QgaXRzX3ZwZSAqdnBlID0gaXJxX2RhdGFf Z2V0X2lycV9jaGlwX2RhdGEoZCk7Cj4gLcKgwqDCoCB2b2lkIF9faW9tZW0gKmJhc2UgPSBnaWNf ZGF0YV9yZGlzdF9jcHUodnBlLT5jb2xfaWR4KS0+cmRfYmFzZSArIAo+IFNaXzEyOEs7Cj4gK8Kg wqDCoCB2b2lkIF9faW9tZW0gKmJhc2U7Cj4gK8KgwqDCoCB1bnNpZ25lZCBsb25nIGZsYWdzOwo+ ICDCoMKgwqDCoCB1MzIgY291bnQgPSAxMDAwMDAwO8KgwqDCoCAvKiAxcyEgKi8KPiAgwqDCoMKg wqAgdTMyIHN0YXR1czsKPiArwqDCoMKgIGludCBjcHU7Cj4gCj4gIMKgwqDCoMKgIGlmICh3aGlj aCAhPSBJUlFDSElQX1NUQVRFX1BFTkRJTkcpCj4gIMKgwqDCoMKgwqDCoMKgwqAgcmV0dXJuIC1F SU5WQUw7Cj4gCj4gK8KgwqDCoCBjcHUgPSBpcnFfdG9fY3B1aWRfbG9jayhkLCAmZmxhZ3MpOwo+ ICvCoMKgwqAgYmFzZSA9IGdpY19kYXRhX3JkaXN0X2NwdShjcHUpLT5yZF9iYXNlICsgU1pfMTI4 SzsKPiAgwqDCoMKgwqAgd3JpdGVsX3JlbGF4ZWQodnBlLT52cGVfaWQsIGJhc2UgKyBHSUNSX1ZT R0lSKTsKPiAgwqDCoMKgwqAgZG8gewo+ICDCoMKgwqDCoMKgwqDCoMKgIHN0YXR1cyA9IHJlYWRs X3JlbGF4ZWQoYmFzZSArIEdJQ1JfVlNHSVBFTkRSKTsKPiBAQCAtMzk4Myw2ICs0MDI3LDcgQEAg c3RhdGljIGludCBpdHNfc2dpX2dldF9pcnFjaGlwX3N0YXRlKHN0cnVjdCAKPiBpcnFfZGF0YSAq ZCwKPiAgwqDCoMKgwqAgfSB3aGlsZShjb3VudCk7Cj4gCj4gIMKgb3V0Ogo+ICvCoMKgwqAgaXJx X3RvX2NwdWlkX3VubG9jayhkLCBmbGFncyk7Cj4gIMKgwqDCoMKgICp2YWwgPSAhIShzdGF0dXMg JiAoMSA8PCBkLT5od2lycSkpOwo+IAo+ICDCoMKgwqDCoCByZXR1cm4gMDsKPiBAQCAtNDEwMiw2 ICs0MTQ3LDcgQEAgc3RhdGljIGludCBpdHNfdnBlX2luaXQoc3RydWN0IGl0c192cGUgKnZwZSkK PiAgwqDCoMKgwqDCoMKgwqDCoCByZXR1cm4gLUVOT01FTTsKPiAgwqDCoMKgwqAgfQo+IAo+ICvC oMKgwqAgcmF3X3NwaW5fbG9ja19pbml0KCZ2cGUtPnZwZV9sb2NrKTsKPiAgwqDCoMKgwqAgdnBl LT52cGVfaWQgPSB2cGVfaWQ7Cj4gIMKgwqDCoMKgIHZwZS0+dnB0X3BhZ2UgPSB2cHRfcGFnZTsK PiAgwqDCoMKgwqAgaWYgKGdpY19yZGlzdHMtPmhhc19ydnBlaWQpCj4gZGlmZiAtLWdpdCBhL2lu Y2x1ZGUvbGludXgvaXJxY2hpcC9hcm0tZ2ljLXY0LmggCj4gYi9pbmNsdWRlL2xpbnV4L2lycWNo aXAvYXJtLWdpYy12NC5oCj4gaW5kZXggNDZjMTY3YTYzNDlmLi5mYzQzYTYzODc1YTMgMTAwNjQ0 Cj4gLS0tIGEvaW5jbHVkZS9saW51eC9pcnFjaGlwL2FybS1naWMtdjQuaAo+ICsrKyBiL2luY2x1 ZGUvbGludXgvaXJxY2hpcC9hcm0tZ2ljLXY0LmgKPiBAQCAtNjAsNiArNjAsNyBAQCBzdHJ1Y3Qg aXRzX3ZwZSB7Cj4gIMKgwqDCoMKgwqDCoMKgwqAgfTsKPiAgwqDCoMKgwqAgfTsKPiAKPiArwqDC oMKgIHJhd19zcGlubG9ja190wqDCoMKgwqDCoMKgwqAgdnBlX2xvY2s7Cj4gIMKgwqDCoMKgIC8q Cj4gIMKgwqDCoMKgwqAgKiBUaGlzIGNvbGxlY3Rpb24gSUQgaXMgdXNlZCB0byBpbmRpcmVjdCB0 aGUgdGFyZ2V0Cj4gIMKgwqDCoMKgwqAgKiByZWRpc3RyaWJ1dG9yIGZvciB0aGlzIFZQRS4gVGhl IElEIGl0c2VsZiBpc24ndCBpbnZvbHZlZCBpbgoKSSdtIG5vdCBzdXJlIGlmIGl0J3MgZ29vZCBl bm91Z2gsIGl0IG1heSBnZXRzIG11Y2ggY2xlYXJlciBhZnRlcgpzcGxpdHRpbmcuCgoKVGhhbmtz LApaZW5naHVpCgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X18KbGludXgtYXJtLWtlcm5lbCBtYWlsaW5nIGxpc3QKbGludXgtYXJtLWtlcm5lbEBsaXN0cy5p bmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8v bGludXgtYXJtLWtlcm5lbAo=