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=-17.8 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,NICE_REPLY_A,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, 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 82605C433E0 for ; Wed, 23 Dec 2020 13:45:34 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 419472313C for ; Wed, 23 Dec 2020 13:45:34 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728528AbgLWNpd (ORCPT ); Wed, 23 Dec 2020 08:45:33 -0500 Received: from foss.arm.com ([217.140.110.172]:50336 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728251AbgLWNpd (ORCPT ); Wed, 23 Dec 2020 08:45:33 -0500 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 923461042; Wed, 23 Dec 2020 05:44:46 -0800 (PST) Received: from [10.57.34.90] (unknown [10.57.34.90]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id B75E33F66E; Wed, 23 Dec 2020 05:44:44 -0800 (PST) Subject: Re: [PATCH v2 1/7] iommu/io-pgtable: Introduce dynamic io-pgtable fmt registration To: isaacm@codeaurora.org Cc: kernel-team@android.com, will@kernel.org, pdaly@codeaurora.org, linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, iommu@lists.linux-foundation.org, freedreno@lists.freedesktop.org, linux-arm-kernel@lists.infradead.org, pratikp@codeaurora.org References: <1608597876-32367-1-git-send-email-isaacm@codeaurora.org> <1608597876-32367-2-git-send-email-isaacm@codeaurora.org> <4f388512-c3df-e9fc-ebd4-624ab36a6858@arm.com> <8b48b371811a170053e2ca810ab63abf@codeaurora.org> From: Robin Murphy Message-ID: <64657a85-e2d5-e13f-d6b5-9d68c4142b80@arm.com> Date: Wed, 23 Dec 2020 13:44:43 +0000 User-Agent: Mozilla/5.0 (Windows NT 10.0; rv:78.0) Gecko/20100101 Thunderbird/78.6.0 MIME-Version: 1.0 In-Reply-To: <8b48b371811a170053e2ca810ab63abf@codeaurora.org> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-GB Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-arm-msm@vger.kernel.org On 2020-12-22 19:54, isaacm@codeaurora.org wrote: > On 2020-12-22 11:27, Robin Murphy wrote: >> On 2020-12-22 00:44, Isaac J. Manjarres wrote: >>> The io-pgtable code constructs an array of init functions for each >>> page table format at compile time. This is not ideal, as this >>> increases the footprint of the io-pgtable code, as well as prevents >>> io-pgtable formats from being built as kernel modules. >>> >>> In preparation for modularizing the io-pgtable formats, switch to a >>> dynamic registration scheme, where each io-pgtable format can register >>> their init functions with the io-pgtable code at boot or module >>> insertion time. >>> >>> Signed-off-by: Isaac J. Manjarres >>> --- >>>   drivers/iommu/io-pgtable-arm-v7s.c | 34 +++++++++++++- >>>   drivers/iommu/io-pgtable-arm.c     | 90 >>> ++++++++++++++++++++++++++---------- >>>   drivers/iommu/io-pgtable.c         | 94 >>> ++++++++++++++++++++++++++++++++------ >>>   include/linux/io-pgtable.h         | 51 +++++++++++++-------- >>>   4 files changed, 209 insertions(+), 60 deletions(-) >>> >>> diff --git a/drivers/iommu/io-pgtable-arm-v7s.c >>> b/drivers/iommu/io-pgtable-arm-v7s.c >>> index 1d92ac9..89aad2f 100644 >>> --- a/drivers/iommu/io-pgtable-arm-v7s.c >>> +++ b/drivers/iommu/io-pgtable-arm-v7s.c >>> @@ -28,6 +28,7 @@ >>>   #include >>>   #include >>>   #include >>> +#include >>>   #include >>>   #include >>>   #include >>> @@ -835,7 +836,8 @@ static struct io_pgtable >>> *arm_v7s_alloc_pgtable(struct io_pgtable_cfg *cfg, >>>       return NULL; >>>   } >>>   -struct io_pgtable_init_fns io_pgtable_arm_v7s_init_fns = { >>> +static struct io_pgtable_init_fns io_pgtable_arm_v7s_init_fns = { >>> +    .fmt    = ARM_V7S, >>>       .alloc    = arm_v7s_alloc_pgtable, >>>       .free    = arm_v7s_free_pgtable, >>>   }; >>> @@ -982,5 +984,33 @@ static int __init arm_v7s_do_selftests(void) >>>       pr_info("self test ok\n"); >>>       return 0; >>>   } >>> -subsys_initcall(arm_v7s_do_selftests); >>> +#else >>> +static int arm_v7s_do_selftests(void) >>> +{ >>> +    return 0; >>> +} >>>   #endif >>> + >>> +static int __init arm_v7s_init(void) >>> +{ >>> +    int ret; >>> + >>> +    ret = io_pgtable_ops_register(&io_pgtable_arm_v7s_init_fns); >>> +    if (ret < 0) { >>> +        pr_err("Failed to register ARM V7S format\n"); >> >> Super-nit: I think "v7s" should probably be lowercase there. Also >> general consistency WRT to showing the error code and whether or not >> to abbreviate "format" would be nice. >> > Ok, I can fix this accordingly. > >>> +        return ret; >>> +    } >>> + >>> +    ret = arm_v7s_do_selftests(); >>> +    if (ret < 0) >>> +        io_pgtable_ops_unregister(&io_pgtable_arm_v7s_init_fns); >>> + >>> +    return ret; >>> +} >>> +core_initcall(arm_v7s_init); >>> + >>> +static void __exit arm_v7s_exit(void) >>> +{ >>> +    io_pgtable_ops_unregister(&io_pgtable_arm_v7s_init_fns); >>> +} >>> +module_exit(arm_v7s_exit); >>> diff --git a/drivers/iommu/io-pgtable-arm.c >>> b/drivers/iommu/io-pgtable-arm.c >>> index 87def58..ff0ea2f 100644 >>> --- a/drivers/iommu/io-pgtable-arm.c >>> +++ b/drivers/iommu/io-pgtable-arm.c >>> @@ -13,6 +13,7 @@ >>>   #include >>>   #include >>>   #include >>> +#include >>>   #include >>>   #include >>>   #include >>> @@ -1043,29 +1044,32 @@ arm_mali_lpae_alloc_pgtable(struct >>> io_pgtable_cfg *cfg, void *cookie) >>>       return NULL; >>>   } >>>   -struct io_pgtable_init_fns io_pgtable_arm_64_lpae_s1_init_fns = { >>> -    .alloc    = arm_64_lpae_alloc_pgtable_s1, >>> -    .free    = arm_lpae_free_pgtable, >>> -}; >>> - >>> -struct io_pgtable_init_fns io_pgtable_arm_64_lpae_s2_init_fns = { >>> -    .alloc    = arm_64_lpae_alloc_pgtable_s2, >>> -    .free    = arm_lpae_free_pgtable, >>> -}; >>> - >>> -struct io_pgtable_init_fns io_pgtable_arm_32_lpae_s1_init_fns = { >>> -    .alloc    = arm_32_lpae_alloc_pgtable_s1, >>> -    .free    = arm_lpae_free_pgtable, >>> -}; >>> - >>> -struct io_pgtable_init_fns io_pgtable_arm_32_lpae_s2_init_fns = { >>> -    .alloc    = arm_32_lpae_alloc_pgtable_s2, >>> -    .free    = arm_lpae_free_pgtable, >>> -}; >>> - >>> -struct io_pgtable_init_fns io_pgtable_arm_mali_lpae_init_fns = { >>> -    .alloc    = arm_mali_lpae_alloc_pgtable, >>> -    .free    = arm_lpae_free_pgtable, >>> +static struct io_pgtable_init_fns io_pgtable_arm_lpae_init_fns[] = { >>> +    { >>> +        .fmt    = ARM_32_LPAE_S1, >>> +        .alloc    = arm_32_lpae_alloc_pgtable_s1, >>> +        .free    = arm_lpae_free_pgtable, >>> +    }, >>> +    { >>> +        .fmt    = ARM_32_LPAE_S2, >>> +        .alloc    = arm_32_lpae_alloc_pgtable_s2, >>> +        .free    = arm_lpae_free_pgtable, >>> +    }, >>> +    { >>> +        .fmt    = ARM_64_LPAE_S1, >>> +        .alloc    = arm_64_lpae_alloc_pgtable_s1, >>> +        .free    = arm_lpae_free_pgtable, >>> +    }, >>> +    { >>> +        .fmt    = ARM_64_LPAE_S2, >>> +        .alloc    = arm_64_lpae_alloc_pgtable_s2, >>> +        .free    = arm_lpae_free_pgtable, >>> +    }, >>> +    { >>> +        .fmt    = ARM_MALI_LPAE, >>> +        .alloc    = arm_mali_lpae_alloc_pgtable, >>> +        .free    = arm_lpae_free_pgtable, >>> +    }, >>>   }; >>>     #ifdef CONFIG_IOMMU_IO_PGTABLE_LPAE_SELFTEST >>> @@ -1250,5 +1254,43 @@ static int __init arm_lpae_do_selftests(void) >>>       pr_info("selftest: completed with %d PASS %d FAIL\n", pass, fail); >>>       return fail ? -EFAULT : 0; >>>   } >>> -subsys_initcall(arm_lpae_do_selftests); >>> +#else >>> +static int __init arm_lpae_do_selftests(void) >>> +{ >>> +    return 0; >>> +} >>>   #endif >>> + >>> +static int __init arm_lpae_init(void) >>> +{ >>> +    int ret, i; >>> + >>> +    for (i = 0; i < ARRAY_SIZE(io_pgtable_arm_lpae_init_fns); i++) { >>> +        ret = >>> io_pgtable_ops_register(&io_pgtable_arm_lpae_init_fns[i]); >>> +        if (ret < 0) { >>> +            pr_err("Failed to register ARM LPAE fmt: %d\n"); >>> +            goto err_io_pgtable_register; >>> +        } >>> +    } >>> + >>> +    ret = arm_lpae_do_selftests(); >>> +    if (ret < 0) >>> +        goto err_io_pgtable_register; >>> + >>> +    return 0; >>> + >>> +err_io_pgtable_register: >>> +    for (i = i - 1; i >= 0; i--) >> >> Personally I find "while (i--)" a bit clearer for this kind of >> unwinding, but maybe post-decrement isn't to everyone's taste. >> > I'm not particularly attached to the current approach, so a while loop > is okay with me :). > >>> +        io_pgtable_ops_unregister(&io_pgtable_arm_lpae_init_fns[i]); >>> +    return ret; >>> +} >>> +core_initcall(arm_lpae_init); >>> + >>> +static void __exit arm_lpae_exit(void) >>> +{ >>> +    int i; >>> + >>> +    for (i = 0; i < ARRAY_SIZE(io_pgtable_arm_lpae_init_fns); i++) >>> +        io_pgtable_ops_unregister(&io_pgtable_arm_lpae_init_fns[i]); >>> +} >>> +module_exit(arm_lpae_exit); >>> diff --git a/drivers/iommu/io-pgtable.c b/drivers/iommu/io-pgtable.c >>> index 94394c8..2c6eb2e 100644 >>> --- a/drivers/iommu/io-pgtable.c >>> +++ b/drivers/iommu/io-pgtable.c >>> @@ -10,33 +10,45 @@ >>>   #include >>>   #include >>>   #include >>> +#include >>> +#include >>>   #include >>>   -static const struct io_pgtable_init_fns * >>> -io_pgtable_init_table[IO_PGTABLE_NUM_FMTS] = { >>> -#ifdef CONFIG_IOMMU_IO_PGTABLE_LPAE >>> -    [ARM_32_LPAE_S1] = &io_pgtable_arm_32_lpae_s1_init_fns, >>> -    [ARM_32_LPAE_S2] = &io_pgtable_arm_32_lpae_s2_init_fns, >>> -    [ARM_64_LPAE_S1] = &io_pgtable_arm_64_lpae_s1_init_fns, >>> -    [ARM_64_LPAE_S2] = &io_pgtable_arm_64_lpae_s2_init_fns, >>> -    [ARM_MALI_LPAE] = &io_pgtable_arm_mali_lpae_init_fns, >>> -#endif >>> -#ifdef CONFIG_IOMMU_IO_PGTABLE_ARMV7S >>> -    [ARM_V7S] = &io_pgtable_arm_v7s_init_fns, >>> -#endif >>> +struct io_pgtable_init_fns_node { >>> +    struct io_pgtable_init_fns *fns; >>> +    struct list_head list; >>>   }; >>>   +static LIST_HEAD(io_pgtable_init_fns_list); >>> +static DEFINE_RWLOCK(io_pgtable_init_fns_list_lock); >>> + >>> +static struct io_pgtable_init_fns *io_pgtable_get_init_fns(enum >>> io_pgtable_fmt fmt) >>> +{ >>> +    struct io_pgtable_init_fns_node *iter; >>> +    struct io_pgtable_init_fns *fns = NULL; >>> + >>> +    read_lock(&io_pgtable_init_fns_list_lock); >>> +    list_for_each_entry(iter, &io_pgtable_init_fns_list, list) >>> +        if (iter->fns->fmt == fmt) { >>> +            fns = iter->fns; >>> +            break; >>> +        } >>> +    read_unlock(&io_pgtable_init_fns_list_lock); >>> + >>> +    return fns; >>> +} >> >> I think it would be a lot easier to stick with a simple array indexed >> by enum - that way you can just set/clear/test entries without needing >> to worry about locking. Basically just remove the const and the >> initialisers from the existing one ;) >> >> (and if you think you're concerned about memory, consider that just >> the list head plus lock is already half the size of the table) >> >> Other than that, I think this all looks pretty promising - I'd suggest >> sending a non-RFC after rc1 so that it gets everyone's proper >> attention. >> >> Thanks, >> Robin. >> > > Thanks for all of the feedback! With respect to the comment about > keeping the current array, > don't we need some sort of lock to protect access to the data structure > (e.g. concurrent access > if adding two ops for the same format)? Or do you mean that we should > use atomic operations to > handle this cleanly? I don't think any races are realistically possible - built-in initcalls should run sequentially, while module init should be serialised by the module loader lock, so registrations should never be able to race against each other. And if there could be a race between registering a format and somebody trying to use it, then something's fundamentally wrong anyway - sure we could use READ_ONCE/WRITE_ONCE for accessing the table, but that would be basically be admitting that we've failed at the primary purpose of making sure formats are loaded *before* the users that depend on them. With a directly-indexed table there's no contention between looking up one format and registering another unrelated format, unlike with a list. Robin. > > Thanks, > Isaac >>> + >>>   struct io_pgtable_ops *alloc_io_pgtable_ops(enum io_pgtable_fmt fmt, >>>                           struct io_pgtable_cfg *cfg, >>>                           void *cookie) >>>   { >>>       struct io_pgtable *iop; >>> -    const struct io_pgtable_init_fns *fns; >>> +    struct io_pgtable_init_fns *fns; >>>         if (fmt >= IO_PGTABLE_NUM_FMTS) >>>           return NULL; >>>   -    fns = io_pgtable_init_table[fmt]; >>> +    fns = io_pgtable_get_init_fns(fmt); >>>       if (!fns) >>>           return NULL; >>>   @@ -59,12 +71,64 @@ EXPORT_SYMBOL_GPL(alloc_io_pgtable_ops); >>>   void free_io_pgtable_ops(struct io_pgtable_ops *ops) >>>   { >>>       struct io_pgtable *iop; >>> +    struct io_pgtable_init_fns *fns; >>>         if (!ops) >>>           return; >>>         iop = io_pgtable_ops_to_pgtable(ops); >>>       io_pgtable_tlb_flush_all(iop); >>> -    io_pgtable_init_table[iop->fmt]->free(iop); >>> +    fns = io_pgtable_get_init_fns(iop->fmt); >>> +    if (fns) >>> +        fns->free(iop); >>>   } >>>   EXPORT_SYMBOL_GPL(free_io_pgtable_ops); >>> + >>> +int io_pgtable_ops_register(struct io_pgtable_init_fns *init_fns) >>> +{ >>> +    struct io_pgtable_init_fns_node *iter, *fns_node; >>> +    int ret = 0; >>> + >>> +    if (!init_fns || init_fns->fmt >= IO_PGTABLE_NUM_FMTS || >>> +        !init_fns->alloc || !init_fns->free) >>> +        return -EINVAL; >>> + >>> +    fns_node = kzalloc(sizeof(*fns_node), GFP_KERNEL); >>> +    if (!fns_node) >>> +        return -ENOMEM; >>> + >>> +    write_lock(&io_pgtable_init_fns_list_lock); >>> +    list_for_each_entry(iter, &io_pgtable_init_fns_list, list) >>> +        if (iter->fns->fmt == init_fns->fmt) { >>> +            ret = -EEXIST; >>> +            kfree(fns_node); >>> +            break; >>> +        } >>> + >>> +    if (!ret) { >>> +        fns_node->fns = init_fns; >>> +        INIT_LIST_HEAD(&fns_node->list); >>> +        list_add_tail(&fns_node->list, &io_pgtable_init_fns_list); >>> +    } >>> +    write_unlock(&io_pgtable_init_fns_list_lock); >>> +    return ret; >>> +} >>> +EXPORT_SYMBOL_GPL(io_pgtable_ops_register); >>> + >>> +void io_pgtable_ops_unregister(struct io_pgtable_init_fns *init_fns) >>> +{ >>> +    struct io_pgtable_init_fns_node *iter, *tmp; >>> + >>> +    if (!init_fns) >>> +        return; >>> + >>> +    write_lock(&io_pgtable_init_fns_list_lock); >>> +    list_for_each_entry_safe(iter, tmp, &io_pgtable_init_fns_list, >>> list) >>> +        if (iter->fns == init_fns) { >>> +            list_del(&iter->list); >>> +            kfree(iter); >>> +            break; >>> +        } >>> +    write_unlock(&io_pgtable_init_fns_list_lock); >>> +} >>> +EXPORT_SYMBOL_GPL(io_pgtable_ops_unregister); >>> diff --git a/include/linux/io-pgtable.h b/include/linux/io-pgtable.h >>> index ea727eb..45b367ce 100644 >>> --- a/include/linux/io-pgtable.h >>> +++ b/include/linux/io-pgtable.h >>> @@ -163,6 +163,38 @@ struct io_pgtable_ops { >>>   }; >>>     /** >>> + * struct io_pgtable_init_fns - Alloc/free a set of page tables for a >>> + *                              particular format. >>> + * >>> + * @fmt:   The page table format. >>> + * @alloc: Allocate a set of page tables described by cfg. >>> + * @free:  Free the page tables associated with iop. >>> + */ >>> +struct io_pgtable_init_fns { >>> +    enum io_pgtable_fmt fmt; >>> +    struct io_pgtable *(*alloc)(struct io_pgtable_cfg *cfg, void >>> *cookie); >>> +    void (*free)(struct io_pgtable *iop); >>> +}; >>> + >>> +/** >>> + * io_pgtable_ops_register() - Register the page table routines for >>> a page table >>> + *                             format. >>> + * >>> + * @init_fns: The functions for allocating and freeing the page >>> tables of >>> + *            a particular format. >>> + */ >>> +int io_pgtable_ops_register(struct io_pgtable_init_fns *init_fns); >>> + >>> +/** >>> + * io_pgtable_ops_unregister() - Unregister the page table routines >>> for a page >>> + *                               table format. >>> + * >>> + * @init_fns: The functions for allocating and freeing the page >>> tables of >>> + *            a particular format. >>> + */ >>> +void io_pgtable_ops_unregister(struct io_pgtable_init_fns *init_fns); >>> + >>> +/** >>>    * alloc_io_pgtable_ops() - Allocate a page table allocator for use >>> by an IOMMU. >>>    * >>>    * @fmt:    The page table format. >>> @@ -233,23 +265,4 @@ io_pgtable_tlb_add_page(struct io_pgtable *iop, >>>           iop->cfg.tlb->tlb_add_page(gather, iova, granule, >>> iop->cookie); >>>   } >>>   -/** >>> - * struct io_pgtable_init_fns - Alloc/free a set of page tables for a >>> - *                              particular format. >>> - * >>> - * @alloc: Allocate a set of page tables described by cfg. >>> - * @free:  Free the page tables associated with iop. >>> - */ >>> -struct io_pgtable_init_fns { >>> -    struct io_pgtable *(*alloc)(struct io_pgtable_cfg *cfg, void >>> *cookie); >>> -    void (*free)(struct io_pgtable *iop); >>> -}; >>> - >>> -extern struct io_pgtable_init_fns io_pgtable_arm_32_lpae_s1_init_fns; >>> -extern struct io_pgtable_init_fns io_pgtable_arm_32_lpae_s2_init_fns; >>> -extern struct io_pgtable_init_fns io_pgtable_arm_64_lpae_s1_init_fns; >>> -extern struct io_pgtable_init_fns io_pgtable_arm_64_lpae_s2_init_fns; >>> -extern struct io_pgtable_init_fns io_pgtable_arm_v7s_init_fns; >>> -extern struct io_pgtable_init_fns io_pgtable_arm_mali_lpae_init_fns; >>> - >>>   #endif /* __IO_PGTABLE_H */ >>> >> >> _______________________________________________ >> linux-arm-kernel mailing list >> linux-arm-kernel@lists.infradead.org >> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel > _______________________________________________ > iommu mailing list > iommu@lists.linux-foundation.org > https://lists.linuxfoundation.org/mailman/listinfo/iommu 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=-17.8 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,NICE_REPLY_A,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, 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 45C44C433E0 for ; Wed, 23 Dec 2020 13:44:53 +0000 (UTC) Received: from whitealder.osuosl.org (smtp1.osuosl.org [140.211.166.138]) (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 D3B9D2313E for ; Wed, 23 Dec 2020 13:44:52 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org D3B9D2313E Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=arm.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=iommu-bounces@lists.linux-foundation.org Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id A344F86812; Wed, 23 Dec 2020 13:44:52 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from whitealder.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id dSeDzFsUlai0; Wed, 23 Dec 2020 13:44:50 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by whitealder.osuosl.org (Postfix) with ESMTP id 689DA86752; Wed, 23 Dec 2020 13:44:50 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 4C775C1825; Wed, 23 Dec 2020 13:44:50 +0000 (UTC) Received: from whitealder.osuosl.org (smtp1.osuosl.org [140.211.166.138]) by lists.linuxfoundation.org (Postfix) with ESMTP id 48850C0893 for ; Wed, 23 Dec 2020 13:44:49 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id 3D295867FA for ; Wed, 23 Dec 2020 13:44:49 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from whitealder.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id qvjmYHeRr7GZ for ; Wed, 23 Dec 2020 13:44:47 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by whitealder.osuosl.org (Postfix) with ESMTP id 5508186752 for ; Wed, 23 Dec 2020 13:44:47 +0000 (UTC) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 923461042; Wed, 23 Dec 2020 05:44:46 -0800 (PST) Received: from [10.57.34.90] (unknown [10.57.34.90]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id B75E33F66E; Wed, 23 Dec 2020 05:44:44 -0800 (PST) Subject: Re: [PATCH v2 1/7] iommu/io-pgtable: Introduce dynamic io-pgtable fmt registration To: isaacm@codeaurora.org References: <1608597876-32367-1-git-send-email-isaacm@codeaurora.org> <1608597876-32367-2-git-send-email-isaacm@codeaurora.org> <4f388512-c3df-e9fc-ebd4-624ab36a6858@arm.com> <8b48b371811a170053e2ca810ab63abf@codeaurora.org> From: Robin Murphy Message-ID: <64657a85-e2d5-e13f-d6b5-9d68c4142b80@arm.com> Date: Wed, 23 Dec 2020 13:44:43 +0000 User-Agent: Mozilla/5.0 (Windows NT 10.0; rv:78.0) Gecko/20100101 Thunderbird/78.6.0 MIME-Version: 1.0 In-Reply-To: <8b48b371811a170053e2ca810ab63abf@codeaurora.org> Content-Language: en-GB Cc: freedreno@lists.freedesktop.org, kernel-team@android.com, pdaly@codeaurora.org, linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, iommu@lists.linux-foundation.org, will@kernel.org, linux-arm-kernel@lists.infradead.org, pratikp@codeaurora.org X-BeenThere: iommu@lists.linux-foundation.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: Development issues for Linux IOMMU support 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: iommu-bounces@lists.linux-foundation.org Sender: "iommu" T24gMjAyMC0xMi0yMiAxOTo1NCwgaXNhYWNtQGNvZGVhdXJvcmEub3JnIHdyb3RlOgo+IE9uIDIw MjAtMTItMjIgMTE6MjcsIFJvYmluIE11cnBoeSB3cm90ZToKPj4gT24gMjAyMC0xMi0yMiAwMDo0 NCwgSXNhYWMgSi4gTWFuamFycmVzIHdyb3RlOgo+Pj4gVGhlIGlvLXBndGFibGUgY29kZSBjb25z dHJ1Y3RzIGFuIGFycmF5IG9mIGluaXQgZnVuY3Rpb25zIGZvciBlYWNoCj4+PiBwYWdlIHRhYmxl IGZvcm1hdCBhdCBjb21waWxlIHRpbWUuIFRoaXMgaXMgbm90IGlkZWFsLCBhcyB0aGlzCj4+PiBp bmNyZWFzZXMgdGhlIGZvb3RwcmludCBvZiB0aGUgaW8tcGd0YWJsZSBjb2RlLCBhcyB3ZWxsIGFz IHByZXZlbnRzCj4+PiBpby1wZ3RhYmxlIGZvcm1hdHMgZnJvbSBiZWluZyBidWlsdCBhcyBrZXJu ZWwgbW9kdWxlcy4KPj4+Cj4+PiBJbiBwcmVwYXJhdGlvbiBmb3IgbW9kdWxhcml6aW5nIHRoZSBp by1wZ3RhYmxlIGZvcm1hdHMsIHN3aXRjaCB0byBhCj4+PiBkeW5hbWljIHJlZ2lzdHJhdGlvbiBz Y2hlbWUsIHdoZXJlIGVhY2ggaW8tcGd0YWJsZSBmb3JtYXQgY2FuIHJlZ2lzdGVyCj4+PiB0aGVp ciBpbml0IGZ1bmN0aW9ucyB3aXRoIHRoZSBpby1wZ3RhYmxlIGNvZGUgYXQgYm9vdCBvciBtb2R1 bGUKPj4+IGluc2VydGlvbiB0aW1lLgo+Pj4KPj4+IFNpZ25lZC1vZmYtYnk6IElzYWFjIEouIE1h bmphcnJlcyA8aXNhYWNtQGNvZGVhdXJvcmEub3JnPgo+Pj4gLS0tCj4+PiDCoCBkcml2ZXJzL2lv bW11L2lvLXBndGFibGUtYXJtLXY3cy5jIHwgMzQgKysrKysrKysrKysrKy0KPj4+IMKgIGRyaXZl cnMvaW9tbXUvaW8tcGd0YWJsZS1hcm0uY8KgwqDCoMKgIHwgOTAgCj4+PiArKysrKysrKysrKysr KysrKysrKysrKysrKy0tLS0tLS0tLS0KPj4+IMKgIGRyaXZlcnMvaW9tbXUvaW8tcGd0YWJsZS5j wqDCoMKgwqDCoMKgwqDCoCB8IDk0IAo+Pj4gKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KystLS0tLS0KPj4+IMKgIGluY2x1ZGUvbGludXgvaW8tcGd0YWJsZS5owqDCoMKgwqDCoMKgwqDC oCB8IDUxICsrKysrKysrKysrKystLS0tLS0tLQo+Pj4gwqAgNCBmaWxlcyBjaGFuZ2VkLCAyMDkg aW5zZXJ0aW9ucygrKSwgNjAgZGVsZXRpb25zKC0pCj4+Pgo+Pj4gZGlmZiAtLWdpdCBhL2RyaXZl cnMvaW9tbXUvaW8tcGd0YWJsZS1hcm0tdjdzLmMgCj4+PiBiL2RyaXZlcnMvaW9tbXUvaW8tcGd0 YWJsZS1hcm0tdjdzLmMKPj4+IGluZGV4IDFkOTJhYzkuLjg5YWFkMmYgMTAwNjQ0Cj4+PiAtLS0g YS9kcml2ZXJzL2lvbW11L2lvLXBndGFibGUtYXJtLXY3cy5jCj4+PiArKysgYi9kcml2ZXJzL2lv bW11L2lvLXBndGFibGUtYXJtLXY3cy5jCj4+PiBAQCAtMjgsNiArMjgsNyBAQAo+Pj4gwqAgI2lu Y2x1ZGUgPGxpbnV4L2lvbW11Lmg+Cj4+PiDCoCAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Cj4+ PiDCoCAjaW5jbHVkZSA8bGludXgva21lbWxlYWsuaD4KPj4+ICsjaW5jbHVkZSA8bGludXgvbW9k dWxlLmg+Cj4+PiDCoCAjaW5jbHVkZSA8bGludXgvc2l6ZXMuaD4KPj4+IMKgICNpbmNsdWRlIDxs aW51eC9zbGFiLmg+Cj4+PiDCoCAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KPj4+IEBAIC04 MzUsNyArODM2LDggQEAgc3RhdGljIHN0cnVjdCBpb19wZ3RhYmxlIAo+Pj4gKmFybV92N3NfYWxs b2NfcGd0YWJsZShzdHJ1Y3QgaW9fcGd0YWJsZV9jZmcgKmNmZywKPj4+IMKgwqDCoMKgwqAgcmV0 dXJuIE5VTEw7Cj4+PiDCoCB9Cj4+PiDCoCAtc3RydWN0IGlvX3BndGFibGVfaW5pdF9mbnMgaW9f cGd0YWJsZV9hcm1fdjdzX2luaXRfZm5zID0gewo+Pj4gK3N0YXRpYyBzdHJ1Y3QgaW9fcGd0YWJs ZV9pbml0X2ZucyBpb19wZ3RhYmxlX2FybV92N3NfaW5pdF9mbnMgPSB7Cj4+PiArwqDCoMKgIC5m bXTCoMKgwqAgPSBBUk1fVjdTLAo+Pj4gwqDCoMKgwqDCoCAuYWxsb2PCoMKgwqAgPSBhcm1fdjdz X2FsbG9jX3BndGFibGUsCj4+PiDCoMKgwqDCoMKgIC5mcmVlwqDCoMKgID0gYXJtX3Y3c19mcmVl X3BndGFibGUsCj4+PiDCoCB9Owo+Pj4gQEAgLTk4Miw1ICs5ODQsMzMgQEAgc3RhdGljIGludCBf X2luaXQgYXJtX3Y3c19kb19zZWxmdGVzdHModm9pZCkKPj4+IMKgwqDCoMKgwqAgcHJfaW5mbygi c2VsZiB0ZXN0IG9rXG4iKTsKPj4+IMKgwqDCoMKgwqAgcmV0dXJuIDA7Cj4+PiDCoCB9Cj4+PiAt c3Vic3lzX2luaXRjYWxsKGFybV92N3NfZG9fc2VsZnRlc3RzKTsKPj4+ICsjZWxzZQo+Pj4gK3N0 YXRpYyBpbnQgYXJtX3Y3c19kb19zZWxmdGVzdHModm9pZCkKPj4+ICt7Cj4+PiArwqDCoMKgIHJl dHVybiAwOwo+Pj4gK30KPj4+IMKgICNlbmRpZgo+Pj4gKwo+Pj4gK3N0YXRpYyBpbnQgX19pbml0 IGFybV92N3NfaW5pdCh2b2lkKQo+Pj4gK3sKPj4+ICvCoMKgwqAgaW50IHJldDsKPj4+ICsKPj4+ ICvCoMKgwqAgcmV0ID0gaW9fcGd0YWJsZV9vcHNfcmVnaXN0ZXIoJmlvX3BndGFibGVfYXJtX3Y3 c19pbml0X2Zucyk7Cj4+PiArwqDCoMKgIGlmIChyZXQgPCAwKSB7Cj4+PiArwqDCoMKgwqDCoMKg wqAgcHJfZXJyKCJGYWlsZWQgdG8gcmVnaXN0ZXIgQVJNIFY3UyBmb3JtYXRcbiIpOwo+Pgo+PiBT dXBlci1uaXQ6IEkgdGhpbmsgInY3cyIgc2hvdWxkIHByb2JhYmx5IGJlIGxvd2VyY2FzZSB0aGVy ZS4gQWxzbwo+PiBnZW5lcmFsIGNvbnNpc3RlbmN5IFdSVCB0byBzaG93aW5nIHRoZSBlcnJvciBj b2RlIGFuZCB3aGV0aGVyIG9yIG5vdAo+PiB0byBhYmJyZXZpYXRlICJmb3JtYXQiIHdvdWxkIGJl IG5pY2UuCj4+Cj4gT2ssIEkgY2FuIGZpeCB0aGlzIGFjY29yZGluZ2x5Lgo+IAo+Pj4gK8KgwqDC oMKgwqDCoMKgIHJldHVybiByZXQ7Cj4+PiArwqDCoMKgIH0KPj4+ICsKPj4+ICvCoMKgwqAgcmV0 ID0gYXJtX3Y3c19kb19zZWxmdGVzdHMoKTsKPj4+ICvCoMKgwqAgaWYgKHJldCA8IDApCj4+PiAr wqDCoMKgwqDCoMKgwqAgaW9fcGd0YWJsZV9vcHNfdW5yZWdpc3RlcigmaW9fcGd0YWJsZV9hcm1f djdzX2luaXRfZm5zKTsKPj4+ICsKPj4+ICvCoMKgwqAgcmV0dXJuIHJldDsKPj4+ICt9Cj4+PiAr Y29yZV9pbml0Y2FsbChhcm1fdjdzX2luaXQpOwo+Pj4gKwo+Pj4gK3N0YXRpYyB2b2lkIF9fZXhp dCBhcm1fdjdzX2V4aXQodm9pZCkKPj4+ICt7Cj4+PiArwqDCoMKgIGlvX3BndGFibGVfb3BzX3Vu cmVnaXN0ZXIoJmlvX3BndGFibGVfYXJtX3Y3c19pbml0X2Zucyk7Cj4+PiArfQo+Pj4gK21vZHVs ZV9leGl0KGFybV92N3NfZXhpdCk7Cj4+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9pb21tdS9pby1w Z3RhYmxlLWFybS5jIAo+Pj4gYi9kcml2ZXJzL2lvbW11L2lvLXBndGFibGUtYXJtLmMKPj4+IGlu ZGV4IDg3ZGVmNTguLmZmMGVhMmYgMTAwNjQ0Cj4+PiAtLS0gYS9kcml2ZXJzL2lvbW11L2lvLXBn dGFibGUtYXJtLmMKPj4+ICsrKyBiL2RyaXZlcnMvaW9tbXUvaW8tcGd0YWJsZS1hcm0uYwo+Pj4g QEAgLTEzLDYgKzEzLDcgQEAKPj4+IMKgICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KPj4+IMKg ICNpbmNsdWRlIDxsaW51eC9pby1wZ3RhYmxlLmg+Cj4+PiDCoCAjaW5jbHVkZSA8bGludXgva2Vy bmVsLmg+Cj4+PiArI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgo+Pj4gwqAgI2luY2x1ZGUgPGxp bnV4L3NpemVzLmg+Cj4+PiDCoCAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgo+Pj4gwqAgI2luY2x1 ZGUgPGxpbnV4L3R5cGVzLmg+Cj4+PiBAQCAtMTA0MywyOSArMTA0NCwzMiBAQCBhcm1fbWFsaV9s cGFlX2FsbG9jX3BndGFibGUoc3RydWN0IAo+Pj4gaW9fcGd0YWJsZV9jZmcgKmNmZywgdm9pZCAq Y29va2llKQo+Pj4gwqDCoMKgwqDCoCByZXR1cm4gTlVMTDsKPj4+IMKgIH0KPj4+IMKgIC1zdHJ1 Y3QgaW9fcGd0YWJsZV9pbml0X2ZucyBpb19wZ3RhYmxlX2FybV82NF9scGFlX3MxX2luaXRfZm5z ID0gewo+Pj4gLcKgwqDCoCAuYWxsb2PCoMKgwqAgPSBhcm1fNjRfbHBhZV9hbGxvY19wZ3RhYmxl X3MxLAo+Pj4gLcKgwqDCoCAuZnJlZcKgwqDCoCA9IGFybV9scGFlX2ZyZWVfcGd0YWJsZSwKPj4+ IC19Owo+Pj4gLQo+Pj4gLXN0cnVjdCBpb19wZ3RhYmxlX2luaXRfZm5zIGlvX3BndGFibGVfYXJt XzY0X2xwYWVfczJfaW5pdF9mbnMgPSB7Cj4+PiAtwqDCoMKgIC5hbGxvY8KgwqDCoCA9IGFybV82 NF9scGFlX2FsbG9jX3BndGFibGVfczIsCj4+PiAtwqDCoMKgIC5mcmVlwqDCoMKgID0gYXJtX2xw YWVfZnJlZV9wZ3RhYmxlLAo+Pj4gLX07Cj4+PiAtCj4+PiAtc3RydWN0IGlvX3BndGFibGVfaW5p dF9mbnMgaW9fcGd0YWJsZV9hcm1fMzJfbHBhZV9zMV9pbml0X2ZucyA9IHsKPj4+IC3CoMKgwqAg LmFsbG9jwqDCoMKgID0gYXJtXzMyX2xwYWVfYWxsb2NfcGd0YWJsZV9zMSwKPj4+IC3CoMKgwqAg LmZyZWXCoMKgwqAgPSBhcm1fbHBhZV9mcmVlX3BndGFibGUsCj4+PiAtfTsKPj4+IC0KPj4+IC1z dHJ1Y3QgaW9fcGd0YWJsZV9pbml0X2ZucyBpb19wZ3RhYmxlX2FybV8zMl9scGFlX3MyX2luaXRf Zm5zID0gewo+Pj4gLcKgwqDCoCAuYWxsb2PCoMKgwqAgPSBhcm1fMzJfbHBhZV9hbGxvY19wZ3Rh YmxlX3MyLAo+Pj4gLcKgwqDCoCAuZnJlZcKgwqDCoCA9IGFybV9scGFlX2ZyZWVfcGd0YWJsZSwK Pj4+IC19Owo+Pj4gLQo+Pj4gLXN0cnVjdCBpb19wZ3RhYmxlX2luaXRfZm5zIGlvX3BndGFibGVf YXJtX21hbGlfbHBhZV9pbml0X2ZucyA9IHsKPj4+IC3CoMKgwqAgLmFsbG9jwqDCoMKgID0gYXJt X21hbGlfbHBhZV9hbGxvY19wZ3RhYmxlLAo+Pj4gLcKgwqDCoCAuZnJlZcKgwqDCoCA9IGFybV9s cGFlX2ZyZWVfcGd0YWJsZSwKPj4+ICtzdGF0aWMgc3RydWN0IGlvX3BndGFibGVfaW5pdF9mbnMg aW9fcGd0YWJsZV9hcm1fbHBhZV9pbml0X2Zuc1tdID0gewo+Pj4gK8KgwqDCoCB7Cj4+PiArwqDC oMKgwqDCoMKgwqAgLmZtdMKgwqDCoCA9IEFSTV8zMl9MUEFFX1MxLAo+Pj4gK8KgwqDCoMKgwqDC oMKgIC5hbGxvY8KgwqDCoCA9IGFybV8zMl9scGFlX2FsbG9jX3BndGFibGVfczEsCj4+PiArwqDC oMKgwqDCoMKgwqAgLmZyZWXCoMKgwqAgPSBhcm1fbHBhZV9mcmVlX3BndGFibGUsCj4+PiArwqDC oMKgIH0sCj4+PiArwqDCoMKgIHsKPj4+ICvCoMKgwqDCoMKgwqDCoCAuZm10wqDCoMKgID0gQVJN XzMyX0xQQUVfUzIsCj4+PiArwqDCoMKgwqDCoMKgwqAgLmFsbG9jwqDCoMKgID0gYXJtXzMyX2xw YWVfYWxsb2NfcGd0YWJsZV9zMiwKPj4+ICvCoMKgwqDCoMKgwqDCoCAuZnJlZcKgwqDCoCA9IGFy bV9scGFlX2ZyZWVfcGd0YWJsZSwKPj4+ICvCoMKgwqAgfSwKPj4+ICvCoMKgwqAgewo+Pj4gK8Kg wqDCoMKgwqDCoMKgIC5mbXTCoMKgwqAgPSBBUk1fNjRfTFBBRV9TMSwKPj4+ICvCoMKgwqDCoMKg wqDCoCAuYWxsb2PCoMKgwqAgPSBhcm1fNjRfbHBhZV9hbGxvY19wZ3RhYmxlX3MxLAo+Pj4gK8Kg wqDCoMKgwqDCoMKgIC5mcmVlwqDCoMKgID0gYXJtX2xwYWVfZnJlZV9wZ3RhYmxlLAo+Pj4gK8Kg wqDCoCB9LAo+Pj4gK8KgwqDCoCB7Cj4+PiArwqDCoMKgwqDCoMKgwqAgLmZtdMKgwqDCoCA9IEFS TV82NF9MUEFFX1MyLAo+Pj4gK8KgwqDCoMKgwqDCoMKgIC5hbGxvY8KgwqDCoCA9IGFybV82NF9s cGFlX2FsbG9jX3BndGFibGVfczIsCj4+PiArwqDCoMKgwqDCoMKgwqAgLmZyZWXCoMKgwqAgPSBh cm1fbHBhZV9mcmVlX3BndGFibGUsCj4+PiArwqDCoMKgIH0sCj4+PiArwqDCoMKgIHsKPj4+ICvC oMKgwqDCoMKgwqDCoCAuZm10wqDCoMKgID0gQVJNX01BTElfTFBBRSwKPj4+ICvCoMKgwqDCoMKg wqDCoCAuYWxsb2PCoMKgwqAgPSBhcm1fbWFsaV9scGFlX2FsbG9jX3BndGFibGUsCj4+PiArwqDC oMKgwqDCoMKgwqAgLmZyZWXCoMKgwqAgPSBhcm1fbHBhZV9mcmVlX3BndGFibGUsCj4+PiArwqDC oMKgIH0sCj4+PiDCoCB9Owo+Pj4gwqDCoMKgICNpZmRlZiBDT05GSUdfSU9NTVVfSU9fUEdUQUJM RV9MUEFFX1NFTEZURVNUCj4+PiBAQCAtMTI1MCw1ICsxMjU0LDQzIEBAIHN0YXRpYyBpbnQgX19p bml0IGFybV9scGFlX2RvX3NlbGZ0ZXN0cyh2b2lkKQo+Pj4gwqDCoMKgwqDCoCBwcl9pbmZvKCJz ZWxmdGVzdDogY29tcGxldGVkIHdpdGggJWQgUEFTUyAlZCBGQUlMXG4iLCBwYXNzLCBmYWlsKTsK Pj4+IMKgwqDCoMKgwqAgcmV0dXJuIGZhaWwgPyAtRUZBVUxUIDogMDsKPj4+IMKgIH0KPj4+IC1z dWJzeXNfaW5pdGNhbGwoYXJtX2xwYWVfZG9fc2VsZnRlc3RzKTsKPj4+ICsjZWxzZQo+Pj4gK3N0 YXRpYyBpbnQgX19pbml0IGFybV9scGFlX2RvX3NlbGZ0ZXN0cyh2b2lkKQo+Pj4gK3sKPj4+ICvC oMKgwqAgcmV0dXJuIDA7Cj4+PiArfQo+Pj4gwqAgI2VuZGlmCj4+PiArCj4+PiArc3RhdGljIGlu dCBfX2luaXQgYXJtX2xwYWVfaW5pdCh2b2lkKQo+Pj4gK3sKPj4+ICvCoMKgwqAgaW50IHJldCwg aTsKPj4+ICsKPj4+ICvCoMKgwqAgZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaW9fcGd0YWJs ZV9hcm1fbHBhZV9pbml0X2Zucyk7IGkrKykgewo+Pj4gK8KgwqDCoMKgwqDCoMKgIHJldCA9IAo+ Pj4gaW9fcGd0YWJsZV9vcHNfcmVnaXN0ZXIoJmlvX3BndGFibGVfYXJtX2xwYWVfaW5pdF9mbnNb aV0pOwo+Pj4gK8KgwqDCoMKgwqDCoMKgIGlmIChyZXQgPCAwKSB7Cj4+PiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCBwcl9lcnIoIkZhaWxlZCB0byByZWdpc3RlciBBUk0gTFBBRSBmbXQ6ICVkXG4i KTsKPj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGdvdG8gZXJyX2lvX3BndGFibGVfcmVnaXN0 ZXI7Cj4+PiArwqDCoMKgwqDCoMKgwqAgfQo+Pj4gK8KgwqDCoCB9Cj4+PiArCj4+PiArwqDCoMKg IHJldCA9IGFybV9scGFlX2RvX3NlbGZ0ZXN0cygpOwo+Pj4gK8KgwqDCoCBpZiAocmV0IDwgMCkK Pj4+ICvCoMKgwqDCoMKgwqDCoCBnb3RvIGVycl9pb19wZ3RhYmxlX3JlZ2lzdGVyOwo+Pj4gKwo+ Pj4gK8KgwqDCoCByZXR1cm4gMDsKPj4+ICsKPj4+ICtlcnJfaW9fcGd0YWJsZV9yZWdpc3RlcjoK Pj4+ICvCoMKgwqAgZm9yIChpID0gaSAtIDE7IGkgPj0gMDsgaS0tKQo+Pgo+PiBQZXJzb25hbGx5 IEkgZmluZCAid2hpbGUgKGktLSkiIGEgYml0IGNsZWFyZXIgZm9yIHRoaXMga2luZCBvZgo+PiB1 bndpbmRpbmcsIGJ1dCBtYXliZSBwb3N0LWRlY3JlbWVudCBpc24ndCB0byBldmVyeW9uZSdzIHRh c3RlLgo+Pgo+IEknbSBub3QgcGFydGljdWxhcmx5IGF0dGFjaGVkIHRvIHRoZSBjdXJyZW50IGFw cHJvYWNoLCBzbyBhIHdoaWxlIGxvb3AKPiBpcyBva2F5IHdpdGggbWUgOikuCj4gCj4+PiArwqDC oMKgwqDCoMKgwqAgaW9fcGd0YWJsZV9vcHNfdW5yZWdpc3RlcigmaW9fcGd0YWJsZV9hcm1fbHBh ZV9pbml0X2Zuc1tpXSk7Cj4+PiArwqDCoMKgIHJldHVybiByZXQ7Cj4+PiArfQo+Pj4gK2NvcmVf aW5pdGNhbGwoYXJtX2xwYWVfaW5pdCk7Cj4+PiArCj4+PiArc3RhdGljIHZvaWQgX19leGl0IGFy bV9scGFlX2V4aXQodm9pZCkKPj4+ICt7Cj4+PiArwqDCoMKgIGludCBpOwo+Pj4gKwo+Pj4gK8Kg wqDCoCBmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShpb19wZ3RhYmxlX2FybV9scGFlX2luaXRf Zm5zKTsgaSsrKQo+Pj4gK8KgwqDCoMKgwqDCoMKgIGlvX3BndGFibGVfb3BzX3VucmVnaXN0ZXIo JmlvX3BndGFibGVfYXJtX2xwYWVfaW5pdF9mbnNbaV0pOwo+Pj4gK30KPj4+ICttb2R1bGVfZXhp dChhcm1fbHBhZV9leGl0KTsKPj4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2lvbW11L2lvLXBndGFi bGUuYyBiL2RyaXZlcnMvaW9tbXUvaW8tcGd0YWJsZS5jCj4+PiBpbmRleCA5NDM5NGM4Li4yYzZl YjJlIDEwMDY0NAo+Pj4gLS0tIGEvZHJpdmVycy9pb21tdS9pby1wZ3RhYmxlLmMKPj4+ICsrKyBi L2RyaXZlcnMvaW9tbXUvaW8tcGd0YWJsZS5jCj4+PiBAQCAtMTAsMzMgKzEwLDQ1IEBACj4+PiDC oCAjaW5jbHVkZSA8bGludXgvYnVnLmg+Cj4+PiDCoCAjaW5jbHVkZSA8bGludXgvaW8tcGd0YWJs ZS5oPgo+Pj4gwqAgI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgo+Pj4gKyNpbmNsdWRlIDxsaW51 eC9yd2xvY2suaD4KPj4+ICsjaW5jbHVkZSA8bGludXgvc2xhYi5oPgo+Pj4gwqAgI2luY2x1ZGUg PGxpbnV4L3R5cGVzLmg+Cj4+PiDCoCAtc3RhdGljIGNvbnN0IHN0cnVjdCBpb19wZ3RhYmxlX2lu aXRfZm5zICoKPj4+IC1pb19wZ3RhYmxlX2luaXRfdGFibGVbSU9fUEdUQUJMRV9OVU1fRk1UU10g PSB7Cj4+PiAtI2lmZGVmIENPTkZJR19JT01NVV9JT19QR1RBQkxFX0xQQUUKPj4+IC3CoMKgwqAg W0FSTV8zMl9MUEFFX1MxXSA9ICZpb19wZ3RhYmxlX2FybV8zMl9scGFlX3MxX2luaXRfZm5zLAo+ Pj4gLcKgwqDCoCBbQVJNXzMyX0xQQUVfUzJdID0gJmlvX3BndGFibGVfYXJtXzMyX2xwYWVfczJf aW5pdF9mbnMsCj4+PiAtwqDCoMKgIFtBUk1fNjRfTFBBRV9TMV0gPSAmaW9fcGd0YWJsZV9hcm1f NjRfbHBhZV9zMV9pbml0X2ZucywKPj4+IC3CoMKgwqAgW0FSTV82NF9MUEFFX1MyXSA9ICZpb19w Z3RhYmxlX2FybV82NF9scGFlX3MyX2luaXRfZm5zLAo+Pj4gLcKgwqDCoCBbQVJNX01BTElfTFBB RV0gPSAmaW9fcGd0YWJsZV9hcm1fbWFsaV9scGFlX2luaXRfZm5zLAo+Pj4gLSNlbmRpZgo+Pj4g LSNpZmRlZiBDT05GSUdfSU9NTVVfSU9fUEdUQUJMRV9BUk1WN1MKPj4+IC3CoMKgwqAgW0FSTV9W N1NdID0gJmlvX3BndGFibGVfYXJtX3Y3c19pbml0X2ZucywKPj4+IC0jZW5kaWYKPj4+ICtzdHJ1 Y3QgaW9fcGd0YWJsZV9pbml0X2Zuc19ub2RlIHsKPj4+ICvCoMKgwqAgc3RydWN0IGlvX3BndGFi bGVfaW5pdF9mbnMgKmZuczsKPj4+ICvCoMKgwqAgc3RydWN0IGxpc3RfaGVhZCBsaXN0Owo+Pj4g wqAgfTsKPj4+IMKgICtzdGF0aWMgTElTVF9IRUFEKGlvX3BndGFibGVfaW5pdF9mbnNfbGlzdCk7 Cj4+PiArc3RhdGljIERFRklORV9SV0xPQ0soaW9fcGd0YWJsZV9pbml0X2Zuc19saXN0X2xvY2sp Owo+Pj4gKwo+Pj4gK3N0YXRpYyBzdHJ1Y3QgaW9fcGd0YWJsZV9pbml0X2ZucyAqaW9fcGd0YWJs ZV9nZXRfaW5pdF9mbnMoZW51bSAKPj4+IGlvX3BndGFibGVfZm10IGZtdCkKPj4+ICt7Cj4+PiAr wqDCoMKgIHN0cnVjdCBpb19wZ3RhYmxlX2luaXRfZm5zX25vZGUgKml0ZXI7Cj4+PiArwqDCoMKg IHN0cnVjdCBpb19wZ3RhYmxlX2luaXRfZm5zICpmbnMgPSBOVUxMOwo+Pj4gKwo+Pj4gK8KgwqDC oCByZWFkX2xvY2soJmlvX3BndGFibGVfaW5pdF9mbnNfbGlzdF9sb2NrKTsKPj4+ICvCoMKgwqAg bGlzdF9mb3JfZWFjaF9lbnRyeShpdGVyLCAmaW9fcGd0YWJsZV9pbml0X2Zuc19saXN0LCBsaXN0 KQo+Pj4gK8KgwqDCoMKgwqDCoMKgIGlmIChpdGVyLT5mbnMtPmZtdCA9PSBmbXQpIHsKPj4+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIGZucyA9IGl0ZXItPmZuczsKPj4+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIGJyZWFrOwo+Pj4gK8KgwqDCoMKgwqDCoMKgIH0KPj4+ICvCoMKgwqAgcmVhZF91 bmxvY2soJmlvX3BndGFibGVfaW5pdF9mbnNfbGlzdF9sb2NrKTsKPj4+ICsKPj4+ICvCoMKgwqAg cmV0dXJuIGZuczsKPj4+ICt9Cj4+Cj4+IEkgdGhpbmsgaXQgd291bGQgYmUgYSBsb3QgZWFzaWVy IHRvIHN0aWNrIHdpdGggYSBzaW1wbGUgYXJyYXkgaW5kZXhlZAo+PiBieSBlbnVtIC0gdGhhdCB3 YXkgeW91IGNhbiBqdXN0IHNldC9jbGVhci90ZXN0IGVudHJpZXMgd2l0aG91dCBuZWVkaW5nCj4+ IHRvIHdvcnJ5IGFib3V0IGxvY2tpbmcuIEJhc2ljYWxseSBqdXN0IHJlbW92ZSB0aGUgY29uc3Qg YW5kIHRoZQo+PiBpbml0aWFsaXNlcnMgZnJvbSB0aGUgZXhpc3Rpbmcgb25lIDspCj4+Cj4+IChh bmQgaWYgeW91IHRoaW5rIHlvdSdyZSBjb25jZXJuZWQgYWJvdXQgbWVtb3J5LCBjb25zaWRlciB0 aGF0IGp1c3QKPj4gdGhlIGxpc3QgaGVhZCBwbHVzIGxvY2sgaXMgYWxyZWFkeSBoYWxmIHRoZSBz aXplIG9mIHRoZSB0YWJsZSkKPj4KPj4gT3RoZXIgdGhhbiB0aGF0LCBJIHRoaW5rIHRoaXMgYWxs IGxvb2tzIHByZXR0eSBwcm9taXNpbmcgLSBJJ2Qgc3VnZ2VzdAo+PiBzZW5kaW5nIGEgbm9uLVJG QyBhZnRlciByYzEgc28gdGhhdCBpdCBnZXRzIGV2ZXJ5b25lJ3MgcHJvcGVyCj4+IGF0dGVudGlv bi4KPj4KPj4gVGhhbmtzLAo+PiBSb2Jpbi4KPj4KPiAKPiBUaGFua3MgZm9yIGFsbCBvZiB0aGUg ZmVlZGJhY2shIFdpdGggcmVzcGVjdCB0byB0aGUgY29tbWVudCBhYm91dCAKPiBrZWVwaW5nIHRo ZSBjdXJyZW50IGFycmF5LAo+IGRvbid0IHdlIG5lZWQgc29tZSBzb3J0IG9mIGxvY2sgdG8gcHJv dGVjdCBhY2Nlc3MgdG8gdGhlIGRhdGEgc3RydWN0dXJlIAo+IChlLmcuIGNvbmN1cnJlbnQgYWNj ZXNzCj4gaWYgYWRkaW5nIHR3byBvcHMgZm9yIHRoZSBzYW1lIGZvcm1hdCk/IE9yIGRvIHlvdSBt ZWFuIHRoYXQgd2Ugc2hvdWxkIAo+IHVzZSBhdG9taWMgb3BlcmF0aW9ucyB0bwo+IGhhbmRsZSB0 aGlzIGNsZWFubHk/CgpJIGRvbid0IHRoaW5rIGFueSByYWNlcyBhcmUgcmVhbGlzdGljYWxseSBw b3NzaWJsZSAtIGJ1aWx0LWluIGluaXRjYWxscyAKc2hvdWxkIHJ1biBzZXF1ZW50aWFsbHksIHdo aWxlIG1vZHVsZSBpbml0IHNob3VsZCBiZSBzZXJpYWxpc2VkIGJ5IHRoZSAKbW9kdWxlIGxvYWRl ciBsb2NrLCBzbyByZWdpc3RyYXRpb25zIHNob3VsZCBuZXZlciBiZSBhYmxlIHRvIHJhY2UgCmFn YWluc3QgZWFjaCBvdGhlci4gQW5kIGlmIHRoZXJlIGNvdWxkIGJlIGEgcmFjZSBiZXR3ZWVuIHJl Z2lzdGVyaW5nIGEgCmZvcm1hdCBhbmQgc29tZWJvZHkgdHJ5aW5nIHRvIHVzZSBpdCwgdGhlbiBz b21ldGhpbmcncyBmdW5kYW1lbnRhbGx5IAp3cm9uZyBhbnl3YXkgLSBzdXJlIHdlIGNvdWxkIHVz ZSBSRUFEX09OQ0UvV1JJVEVfT05DRSBmb3IgYWNjZXNzaW5nIHRoZSAKdGFibGUsIGJ1dCB0aGF0 IHdvdWxkIGJlIGJhc2ljYWxseSBiZSBhZG1pdHRpbmcgdGhhdCB3ZSd2ZSBmYWlsZWQgYXQgdGhl IApwcmltYXJ5IHB1cnBvc2Ugb2YgbWFraW5nIHN1cmUgZm9ybWF0cyBhcmUgbG9hZGVkICpiZWZv cmUqIHRoZSB1c2VycyAKdGhhdCBkZXBlbmQgb24gdGhlbS4KCldpdGggYSBkaXJlY3RseS1pbmRl eGVkIHRhYmxlIHRoZXJlJ3Mgbm8gY29udGVudGlvbiBiZXR3ZWVuIGxvb2tpbmcgdXAgCm9uZSBm b3JtYXQgYW5kIHJlZ2lzdGVyaW5nIGFub3RoZXIgdW5yZWxhdGVkIGZvcm1hdCwgdW5saWtlIHdp dGggYSBsaXN0LgoKUm9iaW4uCgo+IAo+IFRoYW5rcywKPiBJc2FhYwo+Pj4gKwo+Pj4gwqAgc3Ry dWN0IGlvX3BndGFibGVfb3BzICphbGxvY19pb19wZ3RhYmxlX29wcyhlbnVtIGlvX3BndGFibGVf Zm10IGZtdCwKPj4+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIHN0cnVjdCBpb19wZ3RhYmxlX2NmZyAqY2ZnLAo+Pj4gwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdm9pZCAqY29va2llKQo+Pj4gwqAgewo+ Pj4gwqDCoMKgwqDCoCBzdHJ1Y3QgaW9fcGd0YWJsZSAqaW9wOwo+Pj4gLcKgwqDCoCBjb25zdCBz dHJ1Y3QgaW9fcGd0YWJsZV9pbml0X2ZucyAqZm5zOwo+Pj4gK8KgwqDCoCBzdHJ1Y3QgaW9fcGd0 YWJsZV9pbml0X2ZucyAqZm5zOwo+Pj4gwqDCoMKgwqDCoMKgwqAgaWYgKGZtdCA+PSBJT19QR1RB QkxFX05VTV9GTVRTKQo+Pj4gwqDCoMKgwqDCoMKgwqDCoMKgIHJldHVybiBOVUxMOwo+Pj4gwqAg LcKgwqDCoCBmbnMgPSBpb19wZ3RhYmxlX2luaXRfdGFibGVbZm10XTsKPj4+ICvCoMKgwqAgZm5z ID0gaW9fcGd0YWJsZV9nZXRfaW5pdF9mbnMoZm10KTsKPj4+IMKgwqDCoMKgwqAgaWYgKCFmbnMp Cj4+PiDCoMKgwqDCoMKgwqDCoMKgwqAgcmV0dXJuIE5VTEw7Cj4+PiDCoCBAQCAtNTksMTIgKzcx LDY0IEBAIEVYUE9SVF9TWU1CT0xfR1BMKGFsbG9jX2lvX3BndGFibGVfb3BzKTsKPj4+IMKgIHZv aWQgZnJlZV9pb19wZ3RhYmxlX29wcyhzdHJ1Y3QgaW9fcGd0YWJsZV9vcHMgKm9wcykKPj4+IMKg IHsKPj4+IMKgwqDCoMKgwqAgc3RydWN0IGlvX3BndGFibGUgKmlvcDsKPj4+ICvCoMKgwqAgc3Ry dWN0IGlvX3BndGFibGVfaW5pdF9mbnMgKmZuczsKPj4+IMKgwqDCoMKgwqDCoMKgIGlmICghb3Bz KQo+Pj4gwqDCoMKgwqDCoMKgwqDCoMKgIHJldHVybjsKPj4+IMKgwqDCoMKgwqDCoMKgIGlvcCA9 IGlvX3BndGFibGVfb3BzX3RvX3BndGFibGUob3BzKTsKPj4+IMKgwqDCoMKgwqAgaW9fcGd0YWJs ZV90bGJfZmx1c2hfYWxsKGlvcCk7Cj4+PiAtwqDCoMKgIGlvX3BndGFibGVfaW5pdF90YWJsZVtp b3AtPmZtdF0tPmZyZWUoaW9wKTsKPj4+ICvCoMKgwqAgZm5zID0gaW9fcGd0YWJsZV9nZXRfaW5p dF9mbnMoaW9wLT5mbXQpOwo+Pj4gK8KgwqDCoCBpZiAoZm5zKQo+Pj4gK8KgwqDCoMKgwqDCoMKg IGZucy0+ZnJlZShpb3ApOwo+Pj4gwqAgfQo+Pj4gwqAgRVhQT1JUX1NZTUJPTF9HUEwoZnJlZV9p b19wZ3RhYmxlX29wcyk7Cj4+PiArCj4+PiAraW50IGlvX3BndGFibGVfb3BzX3JlZ2lzdGVyKHN0 cnVjdCBpb19wZ3RhYmxlX2luaXRfZm5zICppbml0X2ZucykKPj4+ICt7Cj4+PiArwqDCoMKgIHN0 cnVjdCBpb19wZ3RhYmxlX2luaXRfZm5zX25vZGUgKml0ZXIsICpmbnNfbm9kZTsKPj4+ICvCoMKg wqAgaW50IHJldCA9IDA7Cj4+PiArCj4+PiArwqDCoMKgIGlmICghaW5pdF9mbnMgfHwgaW5pdF9m bnMtPmZtdCA+PSBJT19QR1RBQkxFX05VTV9GTVRTIHx8Cj4+PiArwqDCoMKgwqDCoMKgwqAgIWlu aXRfZm5zLT5hbGxvYyB8fCAhaW5pdF9mbnMtPmZyZWUpCj4+PiArwqDCoMKgwqDCoMKgwqAgcmV0 dXJuIC1FSU5WQUw7Cj4+PiArCj4+PiArwqDCoMKgIGZuc19ub2RlID0ga3phbGxvYyhzaXplb2Yo KmZuc19ub2RlKSwgR0ZQX0tFUk5FTCk7Cj4+PiArwqDCoMKgIGlmICghZm5zX25vZGUpCj4+PiAr wqDCoMKgwqDCoMKgwqAgcmV0dXJuIC1FTk9NRU07Cj4+PiArCj4+PiArwqDCoMKgIHdyaXRlX2xv Y2soJmlvX3BndGFibGVfaW5pdF9mbnNfbGlzdF9sb2NrKTsKPj4+ICvCoMKgwqAgbGlzdF9mb3Jf ZWFjaF9lbnRyeShpdGVyLCAmaW9fcGd0YWJsZV9pbml0X2Zuc19saXN0LCBsaXN0KQo+Pj4gK8Kg wqDCoMKgwqDCoMKgIGlmIChpdGVyLT5mbnMtPmZtdCA9PSBpbml0X2Zucy0+Zm10KSB7Cj4+PiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXQgPSAtRUVYSVNUOwo+Pj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqAga2ZyZWUoZm5zX25vZGUpOwo+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgYnJl YWs7Cj4+PiArwqDCoMKgwqDCoMKgwqAgfQo+Pj4gKwo+Pj4gK8KgwqDCoCBpZiAoIXJldCkgewo+ Pj4gK8KgwqDCoMKgwqDCoMKgIGZuc19ub2RlLT5mbnMgPSBpbml0X2ZuczsKPj4+ICvCoMKgwqDC oMKgwqDCoCBJTklUX0xJU1RfSEVBRCgmZm5zX25vZGUtPmxpc3QpOwo+Pj4gK8KgwqDCoMKgwqDC oMKgIGxpc3RfYWRkX3RhaWwoJmZuc19ub2RlLT5saXN0LCAmaW9fcGd0YWJsZV9pbml0X2Zuc19s aXN0KTsKPj4+ICvCoMKgwqAgfQo+Pj4gK8KgwqDCoCB3cml0ZV91bmxvY2soJmlvX3BndGFibGVf aW5pdF9mbnNfbGlzdF9sb2NrKTsKPj4+ICvCoMKgwqAgcmV0dXJuIHJldDsKPj4+ICt9Cj4+PiAr RVhQT1JUX1NZTUJPTF9HUEwoaW9fcGd0YWJsZV9vcHNfcmVnaXN0ZXIpOwo+Pj4gKwo+Pj4gK3Zv aWQgaW9fcGd0YWJsZV9vcHNfdW5yZWdpc3RlcihzdHJ1Y3QgaW9fcGd0YWJsZV9pbml0X2ZucyAq aW5pdF9mbnMpCj4+PiArewo+Pj4gK8KgwqDCoCBzdHJ1Y3QgaW9fcGd0YWJsZV9pbml0X2Zuc19u b2RlICppdGVyLCAqdG1wOwo+Pj4gKwo+Pj4gK8KgwqDCoCBpZiAoIWluaXRfZm5zKQo+Pj4gK8Kg wqDCoMKgwqDCoMKgIHJldHVybjsKPj4+ICsKPj4+ICvCoMKgwqAgd3JpdGVfbG9jaygmaW9fcGd0 YWJsZV9pbml0X2Zuc19saXN0X2xvY2spOwo+Pj4gK8KgwqDCoCBsaXN0X2Zvcl9lYWNoX2VudHJ5 X3NhZmUoaXRlciwgdG1wLCAmaW9fcGd0YWJsZV9pbml0X2Zuc19saXN0LCAKPj4+IGxpc3QpCj4+ PiArwqDCoMKgwqDCoMKgwqAgaWYgKGl0ZXItPmZucyA9PSBpbml0X2Zucykgewo+Pj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqAgbGlzdF9kZWwoJml0ZXItPmxpc3QpOwo+Pj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqAga2ZyZWUoaXRlcik7Cj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBicmVh azsKPj4+ICvCoMKgwqDCoMKgwqDCoCB9Cj4+PiArwqDCoMKgIHdyaXRlX3VubG9jaygmaW9fcGd0 YWJsZV9pbml0X2Zuc19saXN0X2xvY2spOwo+Pj4gK30KPj4+ICtFWFBPUlRfU1lNQk9MX0dQTChp b19wZ3RhYmxlX29wc191bnJlZ2lzdGVyKTsKPj4+IGRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4 L2lvLXBndGFibGUuaCBiL2luY2x1ZGUvbGludXgvaW8tcGd0YWJsZS5oCj4+PiBpbmRleCBlYTcy N2ViLi40NWIzNjdjZSAxMDA2NDQKPj4+IC0tLSBhL2luY2x1ZGUvbGludXgvaW8tcGd0YWJsZS5o Cj4+PiArKysgYi9pbmNsdWRlL2xpbnV4L2lvLXBndGFibGUuaAo+Pj4gQEAgLTE2Myw2ICsxNjMs MzggQEAgc3RydWN0IGlvX3BndGFibGVfb3BzIHsKPj4+IMKgIH07Cj4+PiDCoMKgwqAgLyoqCj4+ PiArICogc3RydWN0IGlvX3BndGFibGVfaW5pdF9mbnMgLSBBbGxvYy9mcmVlIGEgc2V0IG9mIHBh Z2UgdGFibGVzIGZvciBhCj4+PiArICrCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHBhcnRpY3VsYXIgZm9ybWF0Lgo+Pj4gKyAqCj4+PiAr ICogQGZtdDrCoMKgIFRoZSBwYWdlIHRhYmxlIGZvcm1hdC4KPj4+ICsgKiBAYWxsb2M6IEFsbG9j YXRlIGEgc2V0IG9mIHBhZ2UgdGFibGVzIGRlc2NyaWJlZCBieSBjZmcuCj4+PiArICogQGZyZWU6 wqAgRnJlZSB0aGUgcGFnZSB0YWJsZXMgYXNzb2NpYXRlZCB3aXRoIGlvcC4KPj4+ICsgKi8KPj4+ ICtzdHJ1Y3QgaW9fcGd0YWJsZV9pbml0X2ZucyB7Cj4+PiArwqDCoMKgIGVudW0gaW9fcGd0YWJs ZV9mbXQgZm10Owo+Pj4gK8KgwqDCoCBzdHJ1Y3QgaW9fcGd0YWJsZSAqKCphbGxvYykoc3RydWN0 IGlvX3BndGFibGVfY2ZnICpjZmcsIHZvaWQgCj4+PiAqY29va2llKTsKPj4+ICvCoMKgwqAgdm9p ZCAoKmZyZWUpKHN0cnVjdCBpb19wZ3RhYmxlICppb3ApOwo+Pj4gK307Cj4+PiArCj4+PiArLyoq Cj4+PiArICogaW9fcGd0YWJsZV9vcHNfcmVnaXN0ZXIoKSAtIFJlZ2lzdGVyIHRoZSBwYWdlIHRh YmxlIHJvdXRpbmVzIGZvciAKPj4+IGEgcGFnZSB0YWJsZQo+Pj4gKyAqwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZm9ybWF0Lgo+Pj4gKyAq Cj4+PiArICogQGluaXRfZm5zOiBUaGUgZnVuY3Rpb25zIGZvciBhbGxvY2F0aW5nIGFuZCBmcmVl aW5nIHRoZSBwYWdlIAo+Pj4gdGFibGVzIG9mCj4+PiArICrCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IGEgcGFydGljdWxhciBmb3JtYXQuCj4+PiArICovCj4+PiAraW50IGlvX3BndGFibGVfb3BzX3Jl Z2lzdGVyKHN0cnVjdCBpb19wZ3RhYmxlX2luaXRfZm5zICppbml0X2Zucyk7Cj4+PiArCj4+PiAr LyoqCj4+PiArICogaW9fcGd0YWJsZV9vcHNfdW5yZWdpc3RlcigpIC0gVW5yZWdpc3RlciB0aGUg cGFnZSB0YWJsZSByb3V0aW5lcyAKPj4+IGZvciBhIHBhZ2UKPj4+ICsgKsKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB0YWJsZSBmb3Jt YXQuCj4+PiArICoKPj4+ICsgKiBAaW5pdF9mbnM6IFRoZSBmdW5jdGlvbnMgZm9yIGFsbG9jYXRp bmcgYW5kIGZyZWVpbmcgdGhlIHBhZ2UgCj4+PiB0YWJsZXMgb2YKPj4+ICsgKsKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgYSBwYXJ0aWN1bGFyIGZvcm1hdC4KPj4+ICsgKi8KPj4+ICt2b2lkIGlvX3Bn dGFibGVfb3BzX3VucmVnaXN0ZXIoc3RydWN0IGlvX3BndGFibGVfaW5pdF9mbnMgKmluaXRfZm5z KTsKPj4+ICsKPj4+ICsvKioKPj4+IMKgwqAgKiBhbGxvY19pb19wZ3RhYmxlX29wcygpIC0gQWxs b2NhdGUgYSBwYWdlIHRhYmxlIGFsbG9jYXRvciBmb3IgdXNlIAo+Pj4gYnkgYW4gSU9NTVUuCj4+ PiDCoMKgICoKPj4+IMKgwqAgKiBAZm10OsKgwqDCoCBUaGUgcGFnZSB0YWJsZSBmb3JtYXQuCj4+ PiBAQCAtMjMzLDIzICsyNjUsNCBAQCBpb19wZ3RhYmxlX3RsYl9hZGRfcGFnZShzdHJ1Y3QgaW9f cGd0YWJsZSAqaW9wLAo+Pj4gwqDCoMKgwqDCoMKgwqDCoMKgIGlvcC0+Y2ZnLnRsYi0+dGxiX2Fk ZF9wYWdlKGdhdGhlciwgaW92YSwgZ3JhbnVsZSwgCj4+PiBpb3AtPmNvb2tpZSk7Cj4+PiDCoCB9 Cj4+PiDCoCAtLyoqCj4+PiAtICogc3RydWN0IGlvX3BndGFibGVfaW5pdF9mbnMgLSBBbGxvYy9m cmVlIGEgc2V0IG9mIHBhZ2UgdGFibGVzIGZvciBhCj4+PiAtICrCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHBhcnRpY3VsYXIgZm9ybWF0 Lgo+Pj4gLSAqCj4+PiAtICogQGFsbG9jOiBBbGxvY2F0ZSBhIHNldCBvZiBwYWdlIHRhYmxlcyBk ZXNjcmliZWQgYnkgY2ZnLgo+Pj4gLSAqIEBmcmVlOsKgIEZyZWUgdGhlIHBhZ2UgdGFibGVzIGFz c29jaWF0ZWQgd2l0aCBpb3AuCj4+PiAtICovCj4+PiAtc3RydWN0IGlvX3BndGFibGVfaW5pdF9m bnMgewo+Pj4gLcKgwqDCoCBzdHJ1Y3QgaW9fcGd0YWJsZSAqKCphbGxvYykoc3RydWN0IGlvX3Bn dGFibGVfY2ZnICpjZmcsIHZvaWQgCj4+PiAqY29va2llKTsKPj4+IC3CoMKgwqAgdm9pZCAoKmZy ZWUpKHN0cnVjdCBpb19wZ3RhYmxlICppb3ApOwo+Pj4gLX07Cj4+PiAtCj4+PiAtZXh0ZXJuIHN0 cnVjdCBpb19wZ3RhYmxlX2luaXRfZm5zIGlvX3BndGFibGVfYXJtXzMyX2xwYWVfczFfaW5pdF9m bnM7Cj4+PiAtZXh0ZXJuIHN0cnVjdCBpb19wZ3RhYmxlX2luaXRfZm5zIGlvX3BndGFibGVfYXJt XzMyX2xwYWVfczJfaW5pdF9mbnM7Cj4+PiAtZXh0ZXJuIHN0cnVjdCBpb19wZ3RhYmxlX2luaXRf Zm5zIGlvX3BndGFibGVfYXJtXzY0X2xwYWVfczFfaW5pdF9mbnM7Cj4+PiAtZXh0ZXJuIHN0cnVj dCBpb19wZ3RhYmxlX2luaXRfZm5zIGlvX3BndGFibGVfYXJtXzY0X2xwYWVfczJfaW5pdF9mbnM7 Cj4+PiAtZXh0ZXJuIHN0cnVjdCBpb19wZ3RhYmxlX2luaXRfZm5zIGlvX3BndGFibGVfYXJtX3Y3 c19pbml0X2ZuczsKPj4+IC1leHRlcm4gc3RydWN0IGlvX3BndGFibGVfaW5pdF9mbnMgaW9fcGd0 YWJsZV9hcm1fbWFsaV9scGFlX2luaXRfZm5zOwo+Pj4gLQo+Pj4gwqAgI2VuZGlmIC8qIF9fSU9f UEdUQUJMRV9IICovCj4+Pgo+Pgo+PiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fXwo+PiBsaW51eC1hcm0ta2VybmVsIG1haWxpbmcgbGlzdAo+PiBsaW51eC1h cm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcKPj4gaHR0cDovL2xpc3RzLmluZnJhZGVhZC5v cmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1hcm0ta2VybmVsCj4gX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX18KPiBpb21tdSBtYWlsaW5nIGxpc3QKPiBpb21t dUBsaXN0cy5saW51eC1mb3VuZGF0aW9uLm9yZwo+IGh0dHBzOi8vbGlzdHMubGludXhmb3VuZGF0 aW9uLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2lvbW11Cl9fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fCmlvbW11IG1haWxpbmcgbGlzdAppb21tdUBsaXN0cy5saW51 eC1mb3VuZGF0aW9uLm9yZwpodHRwczovL2xpc3RzLmxpbnV4Zm91bmRhdGlvbi5vcmcvbWFpbG1h bi9saXN0aW5mby9pb21tdQ== 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=-17.8 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,NICE_REPLY_A,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, 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 9A14DC433DB for ; Wed, 23 Dec 2020 13:44:50 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (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 471D323128 for ; Wed, 23 Dec 2020 13:44:50 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 471D323128 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=arm.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=dri-devel-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 5E6B98990D; Wed, 23 Dec 2020 13:44:49 +0000 (UTC) Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by gabe.freedesktop.org (Postfix) with ESMTP id C24F289316; Wed, 23 Dec 2020 13:44:47 +0000 (UTC) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 923461042; Wed, 23 Dec 2020 05:44:46 -0800 (PST) Received: from [10.57.34.90] (unknown [10.57.34.90]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id B75E33F66E; Wed, 23 Dec 2020 05:44:44 -0800 (PST) Subject: Re: [PATCH v2 1/7] iommu/io-pgtable: Introduce dynamic io-pgtable fmt registration To: isaacm@codeaurora.org References: <1608597876-32367-1-git-send-email-isaacm@codeaurora.org> <1608597876-32367-2-git-send-email-isaacm@codeaurora.org> <4f388512-c3df-e9fc-ebd4-624ab36a6858@arm.com> <8b48b371811a170053e2ca810ab63abf@codeaurora.org> From: Robin Murphy Message-ID: <64657a85-e2d5-e13f-d6b5-9d68c4142b80@arm.com> Date: Wed, 23 Dec 2020 13:44:43 +0000 User-Agent: Mozilla/5.0 (Windows NT 10.0; rv:78.0) Gecko/20100101 Thunderbird/78.6.0 MIME-Version: 1.0 In-Reply-To: <8b48b371811a170053e2ca810ab63abf@codeaurora.org> Content-Language: en-GB X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: freedreno@lists.freedesktop.org, kernel-team@android.com, pdaly@codeaurora.org, linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, iommu@lists.linux-foundation.org, will@kernel.org, linux-arm-kernel@lists.infradead.org, pratikp@codeaurora.org Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" T24gMjAyMC0xMi0yMiAxOTo1NCwgaXNhYWNtQGNvZGVhdXJvcmEub3JnIHdyb3RlOgo+IE9uIDIw MjAtMTItMjIgMTE6MjcsIFJvYmluIE11cnBoeSB3cm90ZToKPj4gT24gMjAyMC0xMi0yMiAwMDo0 NCwgSXNhYWMgSi4gTWFuamFycmVzIHdyb3RlOgo+Pj4gVGhlIGlvLXBndGFibGUgY29kZSBjb25z dHJ1Y3RzIGFuIGFycmF5IG9mIGluaXQgZnVuY3Rpb25zIGZvciBlYWNoCj4+PiBwYWdlIHRhYmxl IGZvcm1hdCBhdCBjb21waWxlIHRpbWUuIFRoaXMgaXMgbm90IGlkZWFsLCBhcyB0aGlzCj4+PiBp bmNyZWFzZXMgdGhlIGZvb3RwcmludCBvZiB0aGUgaW8tcGd0YWJsZSBjb2RlLCBhcyB3ZWxsIGFz IHByZXZlbnRzCj4+PiBpby1wZ3RhYmxlIGZvcm1hdHMgZnJvbSBiZWluZyBidWlsdCBhcyBrZXJu ZWwgbW9kdWxlcy4KPj4+Cj4+PiBJbiBwcmVwYXJhdGlvbiBmb3IgbW9kdWxhcml6aW5nIHRoZSBp by1wZ3RhYmxlIGZvcm1hdHMsIHN3aXRjaCB0byBhCj4+PiBkeW5hbWljIHJlZ2lzdHJhdGlvbiBz Y2hlbWUsIHdoZXJlIGVhY2ggaW8tcGd0YWJsZSBmb3JtYXQgY2FuIHJlZ2lzdGVyCj4+PiB0aGVp ciBpbml0IGZ1bmN0aW9ucyB3aXRoIHRoZSBpby1wZ3RhYmxlIGNvZGUgYXQgYm9vdCBvciBtb2R1 bGUKPj4+IGluc2VydGlvbiB0aW1lLgo+Pj4KPj4+IFNpZ25lZC1vZmYtYnk6IElzYWFjIEouIE1h bmphcnJlcyA8aXNhYWNtQGNvZGVhdXJvcmEub3JnPgo+Pj4gLS0tCj4+PiDCoCBkcml2ZXJzL2lv bW11L2lvLXBndGFibGUtYXJtLXY3cy5jIHwgMzQgKysrKysrKysrKysrKy0KPj4+IMKgIGRyaXZl cnMvaW9tbXUvaW8tcGd0YWJsZS1hcm0uY8KgwqDCoMKgIHwgOTAgCj4+PiArKysrKysrKysrKysr KysrKysrKysrKysrKy0tLS0tLS0tLS0KPj4+IMKgIGRyaXZlcnMvaW9tbXUvaW8tcGd0YWJsZS5j wqDCoMKgwqDCoMKgwqDCoCB8IDk0IAo+Pj4gKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KystLS0tLS0KPj4+IMKgIGluY2x1ZGUvbGludXgvaW8tcGd0YWJsZS5owqDCoMKgwqDCoMKgwqDC oCB8IDUxICsrKysrKysrKysrKystLS0tLS0tLQo+Pj4gwqAgNCBmaWxlcyBjaGFuZ2VkLCAyMDkg aW5zZXJ0aW9ucygrKSwgNjAgZGVsZXRpb25zKC0pCj4+Pgo+Pj4gZGlmZiAtLWdpdCBhL2RyaXZl cnMvaW9tbXUvaW8tcGd0YWJsZS1hcm0tdjdzLmMgCj4+PiBiL2RyaXZlcnMvaW9tbXUvaW8tcGd0 YWJsZS1hcm0tdjdzLmMKPj4+IGluZGV4IDFkOTJhYzkuLjg5YWFkMmYgMTAwNjQ0Cj4+PiAtLS0g YS9kcml2ZXJzL2lvbW11L2lvLXBndGFibGUtYXJtLXY3cy5jCj4+PiArKysgYi9kcml2ZXJzL2lv bW11L2lvLXBndGFibGUtYXJtLXY3cy5jCj4+PiBAQCAtMjgsNiArMjgsNyBAQAo+Pj4gwqAgI2lu Y2x1ZGUgPGxpbnV4L2lvbW11Lmg+Cj4+PiDCoCAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Cj4+ PiDCoCAjaW5jbHVkZSA8bGludXgva21lbWxlYWsuaD4KPj4+ICsjaW5jbHVkZSA8bGludXgvbW9k dWxlLmg+Cj4+PiDCoCAjaW5jbHVkZSA8bGludXgvc2l6ZXMuaD4KPj4+IMKgICNpbmNsdWRlIDxs aW51eC9zbGFiLmg+Cj4+PiDCoCAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KPj4+IEBAIC04 MzUsNyArODM2LDggQEAgc3RhdGljIHN0cnVjdCBpb19wZ3RhYmxlIAo+Pj4gKmFybV92N3NfYWxs b2NfcGd0YWJsZShzdHJ1Y3QgaW9fcGd0YWJsZV9jZmcgKmNmZywKPj4+IMKgwqDCoMKgwqAgcmV0 dXJuIE5VTEw7Cj4+PiDCoCB9Cj4+PiDCoCAtc3RydWN0IGlvX3BndGFibGVfaW5pdF9mbnMgaW9f cGd0YWJsZV9hcm1fdjdzX2luaXRfZm5zID0gewo+Pj4gK3N0YXRpYyBzdHJ1Y3QgaW9fcGd0YWJs ZV9pbml0X2ZucyBpb19wZ3RhYmxlX2FybV92N3NfaW5pdF9mbnMgPSB7Cj4+PiArwqDCoMKgIC5m bXTCoMKgwqAgPSBBUk1fVjdTLAo+Pj4gwqDCoMKgwqDCoCAuYWxsb2PCoMKgwqAgPSBhcm1fdjdz X2FsbG9jX3BndGFibGUsCj4+PiDCoMKgwqDCoMKgIC5mcmVlwqDCoMKgID0gYXJtX3Y3c19mcmVl X3BndGFibGUsCj4+PiDCoCB9Owo+Pj4gQEAgLTk4Miw1ICs5ODQsMzMgQEAgc3RhdGljIGludCBf X2luaXQgYXJtX3Y3c19kb19zZWxmdGVzdHModm9pZCkKPj4+IMKgwqDCoMKgwqAgcHJfaW5mbygi c2VsZiB0ZXN0IG9rXG4iKTsKPj4+IMKgwqDCoMKgwqAgcmV0dXJuIDA7Cj4+PiDCoCB9Cj4+PiAt c3Vic3lzX2luaXRjYWxsKGFybV92N3NfZG9fc2VsZnRlc3RzKTsKPj4+ICsjZWxzZQo+Pj4gK3N0 YXRpYyBpbnQgYXJtX3Y3c19kb19zZWxmdGVzdHModm9pZCkKPj4+ICt7Cj4+PiArwqDCoMKgIHJl dHVybiAwOwo+Pj4gK30KPj4+IMKgICNlbmRpZgo+Pj4gKwo+Pj4gK3N0YXRpYyBpbnQgX19pbml0 IGFybV92N3NfaW5pdCh2b2lkKQo+Pj4gK3sKPj4+ICvCoMKgwqAgaW50IHJldDsKPj4+ICsKPj4+ ICvCoMKgwqAgcmV0ID0gaW9fcGd0YWJsZV9vcHNfcmVnaXN0ZXIoJmlvX3BndGFibGVfYXJtX3Y3 c19pbml0X2Zucyk7Cj4+PiArwqDCoMKgIGlmIChyZXQgPCAwKSB7Cj4+PiArwqDCoMKgwqDCoMKg wqAgcHJfZXJyKCJGYWlsZWQgdG8gcmVnaXN0ZXIgQVJNIFY3UyBmb3JtYXRcbiIpOwo+Pgo+PiBT dXBlci1uaXQ6IEkgdGhpbmsgInY3cyIgc2hvdWxkIHByb2JhYmx5IGJlIGxvd2VyY2FzZSB0aGVy ZS4gQWxzbwo+PiBnZW5lcmFsIGNvbnNpc3RlbmN5IFdSVCB0byBzaG93aW5nIHRoZSBlcnJvciBj b2RlIGFuZCB3aGV0aGVyIG9yIG5vdAo+PiB0byBhYmJyZXZpYXRlICJmb3JtYXQiIHdvdWxkIGJl IG5pY2UuCj4+Cj4gT2ssIEkgY2FuIGZpeCB0aGlzIGFjY29yZGluZ2x5Lgo+IAo+Pj4gK8KgwqDC oMKgwqDCoMKgIHJldHVybiByZXQ7Cj4+PiArwqDCoMKgIH0KPj4+ICsKPj4+ICvCoMKgwqAgcmV0 ID0gYXJtX3Y3c19kb19zZWxmdGVzdHMoKTsKPj4+ICvCoMKgwqAgaWYgKHJldCA8IDApCj4+PiAr wqDCoMKgwqDCoMKgwqAgaW9fcGd0YWJsZV9vcHNfdW5yZWdpc3RlcigmaW9fcGd0YWJsZV9hcm1f djdzX2luaXRfZm5zKTsKPj4+ICsKPj4+ICvCoMKgwqAgcmV0dXJuIHJldDsKPj4+ICt9Cj4+PiAr Y29yZV9pbml0Y2FsbChhcm1fdjdzX2luaXQpOwo+Pj4gKwo+Pj4gK3N0YXRpYyB2b2lkIF9fZXhp dCBhcm1fdjdzX2V4aXQodm9pZCkKPj4+ICt7Cj4+PiArwqDCoMKgIGlvX3BndGFibGVfb3BzX3Vu cmVnaXN0ZXIoJmlvX3BndGFibGVfYXJtX3Y3c19pbml0X2Zucyk7Cj4+PiArfQo+Pj4gK21vZHVs ZV9leGl0KGFybV92N3NfZXhpdCk7Cj4+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9pb21tdS9pby1w Z3RhYmxlLWFybS5jIAo+Pj4gYi9kcml2ZXJzL2lvbW11L2lvLXBndGFibGUtYXJtLmMKPj4+IGlu ZGV4IDg3ZGVmNTguLmZmMGVhMmYgMTAwNjQ0Cj4+PiAtLS0gYS9kcml2ZXJzL2lvbW11L2lvLXBn dGFibGUtYXJtLmMKPj4+ICsrKyBiL2RyaXZlcnMvaW9tbXUvaW8tcGd0YWJsZS1hcm0uYwo+Pj4g QEAgLTEzLDYgKzEzLDcgQEAKPj4+IMKgICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KPj4+IMKg ICNpbmNsdWRlIDxsaW51eC9pby1wZ3RhYmxlLmg+Cj4+PiDCoCAjaW5jbHVkZSA8bGludXgva2Vy bmVsLmg+Cj4+PiArI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgo+Pj4gwqAgI2luY2x1ZGUgPGxp bnV4L3NpemVzLmg+Cj4+PiDCoCAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgo+Pj4gwqAgI2luY2x1 ZGUgPGxpbnV4L3R5cGVzLmg+Cj4+PiBAQCAtMTA0MywyOSArMTA0NCwzMiBAQCBhcm1fbWFsaV9s cGFlX2FsbG9jX3BndGFibGUoc3RydWN0IAo+Pj4gaW9fcGd0YWJsZV9jZmcgKmNmZywgdm9pZCAq Y29va2llKQo+Pj4gwqDCoMKgwqDCoCByZXR1cm4gTlVMTDsKPj4+IMKgIH0KPj4+IMKgIC1zdHJ1 Y3QgaW9fcGd0YWJsZV9pbml0X2ZucyBpb19wZ3RhYmxlX2FybV82NF9scGFlX3MxX2luaXRfZm5z ID0gewo+Pj4gLcKgwqDCoCAuYWxsb2PCoMKgwqAgPSBhcm1fNjRfbHBhZV9hbGxvY19wZ3RhYmxl X3MxLAo+Pj4gLcKgwqDCoCAuZnJlZcKgwqDCoCA9IGFybV9scGFlX2ZyZWVfcGd0YWJsZSwKPj4+ IC19Owo+Pj4gLQo+Pj4gLXN0cnVjdCBpb19wZ3RhYmxlX2luaXRfZm5zIGlvX3BndGFibGVfYXJt XzY0X2xwYWVfczJfaW5pdF9mbnMgPSB7Cj4+PiAtwqDCoMKgIC5hbGxvY8KgwqDCoCA9IGFybV82 NF9scGFlX2FsbG9jX3BndGFibGVfczIsCj4+PiAtwqDCoMKgIC5mcmVlwqDCoMKgID0gYXJtX2xw YWVfZnJlZV9wZ3RhYmxlLAo+Pj4gLX07Cj4+PiAtCj4+PiAtc3RydWN0IGlvX3BndGFibGVfaW5p dF9mbnMgaW9fcGd0YWJsZV9hcm1fMzJfbHBhZV9zMV9pbml0X2ZucyA9IHsKPj4+IC3CoMKgwqAg LmFsbG9jwqDCoMKgID0gYXJtXzMyX2xwYWVfYWxsb2NfcGd0YWJsZV9zMSwKPj4+IC3CoMKgwqAg LmZyZWXCoMKgwqAgPSBhcm1fbHBhZV9mcmVlX3BndGFibGUsCj4+PiAtfTsKPj4+IC0KPj4+IC1z dHJ1Y3QgaW9fcGd0YWJsZV9pbml0X2ZucyBpb19wZ3RhYmxlX2FybV8zMl9scGFlX3MyX2luaXRf Zm5zID0gewo+Pj4gLcKgwqDCoCAuYWxsb2PCoMKgwqAgPSBhcm1fMzJfbHBhZV9hbGxvY19wZ3Rh YmxlX3MyLAo+Pj4gLcKgwqDCoCAuZnJlZcKgwqDCoCA9IGFybV9scGFlX2ZyZWVfcGd0YWJsZSwK Pj4+IC19Owo+Pj4gLQo+Pj4gLXN0cnVjdCBpb19wZ3RhYmxlX2luaXRfZm5zIGlvX3BndGFibGVf YXJtX21hbGlfbHBhZV9pbml0X2ZucyA9IHsKPj4+IC3CoMKgwqAgLmFsbG9jwqDCoMKgID0gYXJt X21hbGlfbHBhZV9hbGxvY19wZ3RhYmxlLAo+Pj4gLcKgwqDCoCAuZnJlZcKgwqDCoCA9IGFybV9s cGFlX2ZyZWVfcGd0YWJsZSwKPj4+ICtzdGF0aWMgc3RydWN0IGlvX3BndGFibGVfaW5pdF9mbnMg aW9fcGd0YWJsZV9hcm1fbHBhZV9pbml0X2Zuc1tdID0gewo+Pj4gK8KgwqDCoCB7Cj4+PiArwqDC oMKgwqDCoMKgwqAgLmZtdMKgwqDCoCA9IEFSTV8zMl9MUEFFX1MxLAo+Pj4gK8KgwqDCoMKgwqDC oMKgIC5hbGxvY8KgwqDCoCA9IGFybV8zMl9scGFlX2FsbG9jX3BndGFibGVfczEsCj4+PiArwqDC oMKgwqDCoMKgwqAgLmZyZWXCoMKgwqAgPSBhcm1fbHBhZV9mcmVlX3BndGFibGUsCj4+PiArwqDC oMKgIH0sCj4+PiArwqDCoMKgIHsKPj4+ICvCoMKgwqDCoMKgwqDCoCAuZm10wqDCoMKgID0gQVJN XzMyX0xQQUVfUzIsCj4+PiArwqDCoMKgwqDCoMKgwqAgLmFsbG9jwqDCoMKgID0gYXJtXzMyX2xw YWVfYWxsb2NfcGd0YWJsZV9zMiwKPj4+ICvCoMKgwqDCoMKgwqDCoCAuZnJlZcKgwqDCoCA9IGFy bV9scGFlX2ZyZWVfcGd0YWJsZSwKPj4+ICvCoMKgwqAgfSwKPj4+ICvCoMKgwqAgewo+Pj4gK8Kg wqDCoMKgwqDCoMKgIC5mbXTCoMKgwqAgPSBBUk1fNjRfTFBBRV9TMSwKPj4+ICvCoMKgwqDCoMKg wqDCoCAuYWxsb2PCoMKgwqAgPSBhcm1fNjRfbHBhZV9hbGxvY19wZ3RhYmxlX3MxLAo+Pj4gK8Kg wqDCoMKgwqDCoMKgIC5mcmVlwqDCoMKgID0gYXJtX2xwYWVfZnJlZV9wZ3RhYmxlLAo+Pj4gK8Kg wqDCoCB9LAo+Pj4gK8KgwqDCoCB7Cj4+PiArwqDCoMKgwqDCoMKgwqAgLmZtdMKgwqDCoCA9IEFS TV82NF9MUEFFX1MyLAo+Pj4gK8KgwqDCoMKgwqDCoMKgIC5hbGxvY8KgwqDCoCA9IGFybV82NF9s cGFlX2FsbG9jX3BndGFibGVfczIsCj4+PiArwqDCoMKgwqDCoMKgwqAgLmZyZWXCoMKgwqAgPSBh cm1fbHBhZV9mcmVlX3BndGFibGUsCj4+PiArwqDCoMKgIH0sCj4+PiArwqDCoMKgIHsKPj4+ICvC oMKgwqDCoMKgwqDCoCAuZm10wqDCoMKgID0gQVJNX01BTElfTFBBRSwKPj4+ICvCoMKgwqDCoMKg wqDCoCAuYWxsb2PCoMKgwqAgPSBhcm1fbWFsaV9scGFlX2FsbG9jX3BndGFibGUsCj4+PiArwqDC oMKgwqDCoMKgwqAgLmZyZWXCoMKgwqAgPSBhcm1fbHBhZV9mcmVlX3BndGFibGUsCj4+PiArwqDC oMKgIH0sCj4+PiDCoCB9Owo+Pj4gwqDCoMKgICNpZmRlZiBDT05GSUdfSU9NTVVfSU9fUEdUQUJM RV9MUEFFX1NFTEZURVNUCj4+PiBAQCAtMTI1MCw1ICsxMjU0LDQzIEBAIHN0YXRpYyBpbnQgX19p bml0IGFybV9scGFlX2RvX3NlbGZ0ZXN0cyh2b2lkKQo+Pj4gwqDCoMKgwqDCoCBwcl9pbmZvKCJz ZWxmdGVzdDogY29tcGxldGVkIHdpdGggJWQgUEFTUyAlZCBGQUlMXG4iLCBwYXNzLCBmYWlsKTsK Pj4+IMKgwqDCoMKgwqAgcmV0dXJuIGZhaWwgPyAtRUZBVUxUIDogMDsKPj4+IMKgIH0KPj4+IC1z dWJzeXNfaW5pdGNhbGwoYXJtX2xwYWVfZG9fc2VsZnRlc3RzKTsKPj4+ICsjZWxzZQo+Pj4gK3N0 YXRpYyBpbnQgX19pbml0IGFybV9scGFlX2RvX3NlbGZ0ZXN0cyh2b2lkKQo+Pj4gK3sKPj4+ICvC oMKgwqAgcmV0dXJuIDA7Cj4+PiArfQo+Pj4gwqAgI2VuZGlmCj4+PiArCj4+PiArc3RhdGljIGlu dCBfX2luaXQgYXJtX2xwYWVfaW5pdCh2b2lkKQo+Pj4gK3sKPj4+ICvCoMKgwqAgaW50IHJldCwg aTsKPj4+ICsKPj4+ICvCoMKgwqAgZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaW9fcGd0YWJs ZV9hcm1fbHBhZV9pbml0X2Zucyk7IGkrKykgewo+Pj4gK8KgwqDCoMKgwqDCoMKgIHJldCA9IAo+ Pj4gaW9fcGd0YWJsZV9vcHNfcmVnaXN0ZXIoJmlvX3BndGFibGVfYXJtX2xwYWVfaW5pdF9mbnNb aV0pOwo+Pj4gK8KgwqDCoMKgwqDCoMKgIGlmIChyZXQgPCAwKSB7Cj4+PiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCBwcl9lcnIoIkZhaWxlZCB0byByZWdpc3RlciBBUk0gTFBBRSBmbXQ6ICVkXG4i KTsKPj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGdvdG8gZXJyX2lvX3BndGFibGVfcmVnaXN0 ZXI7Cj4+PiArwqDCoMKgwqDCoMKgwqAgfQo+Pj4gK8KgwqDCoCB9Cj4+PiArCj4+PiArwqDCoMKg IHJldCA9IGFybV9scGFlX2RvX3NlbGZ0ZXN0cygpOwo+Pj4gK8KgwqDCoCBpZiAocmV0IDwgMCkK Pj4+ICvCoMKgwqDCoMKgwqDCoCBnb3RvIGVycl9pb19wZ3RhYmxlX3JlZ2lzdGVyOwo+Pj4gKwo+ Pj4gK8KgwqDCoCByZXR1cm4gMDsKPj4+ICsKPj4+ICtlcnJfaW9fcGd0YWJsZV9yZWdpc3RlcjoK Pj4+ICvCoMKgwqAgZm9yIChpID0gaSAtIDE7IGkgPj0gMDsgaS0tKQo+Pgo+PiBQZXJzb25hbGx5 IEkgZmluZCAid2hpbGUgKGktLSkiIGEgYml0IGNsZWFyZXIgZm9yIHRoaXMga2luZCBvZgo+PiB1 bndpbmRpbmcsIGJ1dCBtYXliZSBwb3N0LWRlY3JlbWVudCBpc24ndCB0byBldmVyeW9uZSdzIHRh c3RlLgo+Pgo+IEknbSBub3QgcGFydGljdWxhcmx5IGF0dGFjaGVkIHRvIHRoZSBjdXJyZW50IGFw cHJvYWNoLCBzbyBhIHdoaWxlIGxvb3AKPiBpcyBva2F5IHdpdGggbWUgOikuCj4gCj4+PiArwqDC oMKgwqDCoMKgwqAgaW9fcGd0YWJsZV9vcHNfdW5yZWdpc3RlcigmaW9fcGd0YWJsZV9hcm1fbHBh ZV9pbml0X2Zuc1tpXSk7Cj4+PiArwqDCoMKgIHJldHVybiByZXQ7Cj4+PiArfQo+Pj4gK2NvcmVf aW5pdGNhbGwoYXJtX2xwYWVfaW5pdCk7Cj4+PiArCj4+PiArc3RhdGljIHZvaWQgX19leGl0IGFy bV9scGFlX2V4aXQodm9pZCkKPj4+ICt7Cj4+PiArwqDCoMKgIGludCBpOwo+Pj4gKwo+Pj4gK8Kg wqDCoCBmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShpb19wZ3RhYmxlX2FybV9scGFlX2luaXRf Zm5zKTsgaSsrKQo+Pj4gK8KgwqDCoMKgwqDCoMKgIGlvX3BndGFibGVfb3BzX3VucmVnaXN0ZXIo JmlvX3BndGFibGVfYXJtX2xwYWVfaW5pdF9mbnNbaV0pOwo+Pj4gK30KPj4+ICttb2R1bGVfZXhp dChhcm1fbHBhZV9leGl0KTsKPj4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2lvbW11L2lvLXBndGFi bGUuYyBiL2RyaXZlcnMvaW9tbXUvaW8tcGd0YWJsZS5jCj4+PiBpbmRleCA5NDM5NGM4Li4yYzZl YjJlIDEwMDY0NAo+Pj4gLS0tIGEvZHJpdmVycy9pb21tdS9pby1wZ3RhYmxlLmMKPj4+ICsrKyBi L2RyaXZlcnMvaW9tbXUvaW8tcGd0YWJsZS5jCj4+PiBAQCAtMTAsMzMgKzEwLDQ1IEBACj4+PiDC oCAjaW5jbHVkZSA8bGludXgvYnVnLmg+Cj4+PiDCoCAjaW5jbHVkZSA8bGludXgvaW8tcGd0YWJs ZS5oPgo+Pj4gwqAgI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgo+Pj4gKyNpbmNsdWRlIDxsaW51 eC9yd2xvY2suaD4KPj4+ICsjaW5jbHVkZSA8bGludXgvc2xhYi5oPgo+Pj4gwqAgI2luY2x1ZGUg PGxpbnV4L3R5cGVzLmg+Cj4+PiDCoCAtc3RhdGljIGNvbnN0IHN0cnVjdCBpb19wZ3RhYmxlX2lu aXRfZm5zICoKPj4+IC1pb19wZ3RhYmxlX2luaXRfdGFibGVbSU9fUEdUQUJMRV9OVU1fRk1UU10g PSB7Cj4+PiAtI2lmZGVmIENPTkZJR19JT01NVV9JT19QR1RBQkxFX0xQQUUKPj4+IC3CoMKgwqAg W0FSTV8zMl9MUEFFX1MxXSA9ICZpb19wZ3RhYmxlX2FybV8zMl9scGFlX3MxX2luaXRfZm5zLAo+ Pj4gLcKgwqDCoCBbQVJNXzMyX0xQQUVfUzJdID0gJmlvX3BndGFibGVfYXJtXzMyX2xwYWVfczJf aW5pdF9mbnMsCj4+PiAtwqDCoMKgIFtBUk1fNjRfTFBBRV9TMV0gPSAmaW9fcGd0YWJsZV9hcm1f NjRfbHBhZV9zMV9pbml0X2ZucywKPj4+IC3CoMKgwqAgW0FSTV82NF9MUEFFX1MyXSA9ICZpb19w Z3RhYmxlX2FybV82NF9scGFlX3MyX2luaXRfZm5zLAo+Pj4gLcKgwqDCoCBbQVJNX01BTElfTFBB RV0gPSAmaW9fcGd0YWJsZV9hcm1fbWFsaV9scGFlX2luaXRfZm5zLAo+Pj4gLSNlbmRpZgo+Pj4g LSNpZmRlZiBDT05GSUdfSU9NTVVfSU9fUEdUQUJMRV9BUk1WN1MKPj4+IC3CoMKgwqAgW0FSTV9W N1NdID0gJmlvX3BndGFibGVfYXJtX3Y3c19pbml0X2ZucywKPj4+IC0jZW5kaWYKPj4+ICtzdHJ1 Y3QgaW9fcGd0YWJsZV9pbml0X2Zuc19ub2RlIHsKPj4+ICvCoMKgwqAgc3RydWN0IGlvX3BndGFi bGVfaW5pdF9mbnMgKmZuczsKPj4+ICvCoMKgwqAgc3RydWN0IGxpc3RfaGVhZCBsaXN0Owo+Pj4g wqAgfTsKPj4+IMKgICtzdGF0aWMgTElTVF9IRUFEKGlvX3BndGFibGVfaW5pdF9mbnNfbGlzdCk7 Cj4+PiArc3RhdGljIERFRklORV9SV0xPQ0soaW9fcGd0YWJsZV9pbml0X2Zuc19saXN0X2xvY2sp Owo+Pj4gKwo+Pj4gK3N0YXRpYyBzdHJ1Y3QgaW9fcGd0YWJsZV9pbml0X2ZucyAqaW9fcGd0YWJs ZV9nZXRfaW5pdF9mbnMoZW51bSAKPj4+IGlvX3BndGFibGVfZm10IGZtdCkKPj4+ICt7Cj4+PiAr wqDCoMKgIHN0cnVjdCBpb19wZ3RhYmxlX2luaXRfZm5zX25vZGUgKml0ZXI7Cj4+PiArwqDCoMKg IHN0cnVjdCBpb19wZ3RhYmxlX2luaXRfZm5zICpmbnMgPSBOVUxMOwo+Pj4gKwo+Pj4gK8KgwqDC oCByZWFkX2xvY2soJmlvX3BndGFibGVfaW5pdF9mbnNfbGlzdF9sb2NrKTsKPj4+ICvCoMKgwqAg bGlzdF9mb3JfZWFjaF9lbnRyeShpdGVyLCAmaW9fcGd0YWJsZV9pbml0X2Zuc19saXN0LCBsaXN0 KQo+Pj4gK8KgwqDCoMKgwqDCoMKgIGlmIChpdGVyLT5mbnMtPmZtdCA9PSBmbXQpIHsKPj4+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIGZucyA9IGl0ZXItPmZuczsKPj4+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIGJyZWFrOwo+Pj4gK8KgwqDCoMKgwqDCoMKgIH0KPj4+ICvCoMKgwqAgcmVhZF91 bmxvY2soJmlvX3BndGFibGVfaW5pdF9mbnNfbGlzdF9sb2NrKTsKPj4+ICsKPj4+ICvCoMKgwqAg cmV0dXJuIGZuczsKPj4+ICt9Cj4+Cj4+IEkgdGhpbmsgaXQgd291bGQgYmUgYSBsb3QgZWFzaWVy IHRvIHN0aWNrIHdpdGggYSBzaW1wbGUgYXJyYXkgaW5kZXhlZAo+PiBieSBlbnVtIC0gdGhhdCB3 YXkgeW91IGNhbiBqdXN0IHNldC9jbGVhci90ZXN0IGVudHJpZXMgd2l0aG91dCBuZWVkaW5nCj4+ IHRvIHdvcnJ5IGFib3V0IGxvY2tpbmcuIEJhc2ljYWxseSBqdXN0IHJlbW92ZSB0aGUgY29uc3Qg YW5kIHRoZQo+PiBpbml0aWFsaXNlcnMgZnJvbSB0aGUgZXhpc3Rpbmcgb25lIDspCj4+Cj4+IChh bmQgaWYgeW91IHRoaW5rIHlvdSdyZSBjb25jZXJuZWQgYWJvdXQgbWVtb3J5LCBjb25zaWRlciB0 aGF0IGp1c3QKPj4gdGhlIGxpc3QgaGVhZCBwbHVzIGxvY2sgaXMgYWxyZWFkeSBoYWxmIHRoZSBz aXplIG9mIHRoZSB0YWJsZSkKPj4KPj4gT3RoZXIgdGhhbiB0aGF0LCBJIHRoaW5rIHRoaXMgYWxs IGxvb2tzIHByZXR0eSBwcm9taXNpbmcgLSBJJ2Qgc3VnZ2VzdAo+PiBzZW5kaW5nIGEgbm9uLVJG QyBhZnRlciByYzEgc28gdGhhdCBpdCBnZXRzIGV2ZXJ5b25lJ3MgcHJvcGVyCj4+IGF0dGVudGlv bi4KPj4KPj4gVGhhbmtzLAo+PiBSb2Jpbi4KPj4KPiAKPiBUaGFua3MgZm9yIGFsbCBvZiB0aGUg ZmVlZGJhY2shIFdpdGggcmVzcGVjdCB0byB0aGUgY29tbWVudCBhYm91dCAKPiBrZWVwaW5nIHRo ZSBjdXJyZW50IGFycmF5LAo+IGRvbid0IHdlIG5lZWQgc29tZSBzb3J0IG9mIGxvY2sgdG8gcHJv dGVjdCBhY2Nlc3MgdG8gdGhlIGRhdGEgc3RydWN0dXJlIAo+IChlLmcuIGNvbmN1cnJlbnQgYWNj ZXNzCj4gaWYgYWRkaW5nIHR3byBvcHMgZm9yIHRoZSBzYW1lIGZvcm1hdCk/IE9yIGRvIHlvdSBt ZWFuIHRoYXQgd2Ugc2hvdWxkIAo+IHVzZSBhdG9taWMgb3BlcmF0aW9ucyB0bwo+IGhhbmRsZSB0 aGlzIGNsZWFubHk/CgpJIGRvbid0IHRoaW5rIGFueSByYWNlcyBhcmUgcmVhbGlzdGljYWxseSBw b3NzaWJsZSAtIGJ1aWx0LWluIGluaXRjYWxscyAKc2hvdWxkIHJ1biBzZXF1ZW50aWFsbHksIHdo aWxlIG1vZHVsZSBpbml0IHNob3VsZCBiZSBzZXJpYWxpc2VkIGJ5IHRoZSAKbW9kdWxlIGxvYWRl ciBsb2NrLCBzbyByZWdpc3RyYXRpb25zIHNob3VsZCBuZXZlciBiZSBhYmxlIHRvIHJhY2UgCmFn YWluc3QgZWFjaCBvdGhlci4gQW5kIGlmIHRoZXJlIGNvdWxkIGJlIGEgcmFjZSBiZXR3ZWVuIHJl Z2lzdGVyaW5nIGEgCmZvcm1hdCBhbmQgc29tZWJvZHkgdHJ5aW5nIHRvIHVzZSBpdCwgdGhlbiBz b21ldGhpbmcncyBmdW5kYW1lbnRhbGx5IAp3cm9uZyBhbnl3YXkgLSBzdXJlIHdlIGNvdWxkIHVz ZSBSRUFEX09OQ0UvV1JJVEVfT05DRSBmb3IgYWNjZXNzaW5nIHRoZSAKdGFibGUsIGJ1dCB0aGF0 IHdvdWxkIGJlIGJhc2ljYWxseSBiZSBhZG1pdHRpbmcgdGhhdCB3ZSd2ZSBmYWlsZWQgYXQgdGhl IApwcmltYXJ5IHB1cnBvc2Ugb2YgbWFraW5nIHN1cmUgZm9ybWF0cyBhcmUgbG9hZGVkICpiZWZv cmUqIHRoZSB1c2VycyAKdGhhdCBkZXBlbmQgb24gdGhlbS4KCldpdGggYSBkaXJlY3RseS1pbmRl eGVkIHRhYmxlIHRoZXJlJ3Mgbm8gY29udGVudGlvbiBiZXR3ZWVuIGxvb2tpbmcgdXAgCm9uZSBm b3JtYXQgYW5kIHJlZ2lzdGVyaW5nIGFub3RoZXIgdW5yZWxhdGVkIGZvcm1hdCwgdW5saWtlIHdp dGggYSBsaXN0LgoKUm9iaW4uCgo+IAo+IFRoYW5rcywKPiBJc2FhYwo+Pj4gKwo+Pj4gwqAgc3Ry dWN0IGlvX3BndGFibGVfb3BzICphbGxvY19pb19wZ3RhYmxlX29wcyhlbnVtIGlvX3BndGFibGVf Zm10IGZtdCwKPj4+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIHN0cnVjdCBpb19wZ3RhYmxlX2NmZyAqY2ZnLAo+Pj4gwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdm9pZCAqY29va2llKQo+Pj4gwqAgewo+ Pj4gwqDCoMKgwqDCoCBzdHJ1Y3QgaW9fcGd0YWJsZSAqaW9wOwo+Pj4gLcKgwqDCoCBjb25zdCBz dHJ1Y3QgaW9fcGd0YWJsZV9pbml0X2ZucyAqZm5zOwo+Pj4gK8KgwqDCoCBzdHJ1Y3QgaW9fcGd0 YWJsZV9pbml0X2ZucyAqZm5zOwo+Pj4gwqDCoMKgwqDCoMKgwqAgaWYgKGZtdCA+PSBJT19QR1RB QkxFX05VTV9GTVRTKQo+Pj4gwqDCoMKgwqDCoMKgwqDCoMKgIHJldHVybiBOVUxMOwo+Pj4gwqAg LcKgwqDCoCBmbnMgPSBpb19wZ3RhYmxlX2luaXRfdGFibGVbZm10XTsKPj4+ICvCoMKgwqAgZm5z ID0gaW9fcGd0YWJsZV9nZXRfaW5pdF9mbnMoZm10KTsKPj4+IMKgwqDCoMKgwqAgaWYgKCFmbnMp Cj4+PiDCoMKgwqDCoMKgwqDCoMKgwqAgcmV0dXJuIE5VTEw7Cj4+PiDCoCBAQCAtNTksMTIgKzcx LDY0IEBAIEVYUE9SVF9TWU1CT0xfR1BMKGFsbG9jX2lvX3BndGFibGVfb3BzKTsKPj4+IMKgIHZv aWQgZnJlZV9pb19wZ3RhYmxlX29wcyhzdHJ1Y3QgaW9fcGd0YWJsZV9vcHMgKm9wcykKPj4+IMKg IHsKPj4+IMKgwqDCoMKgwqAgc3RydWN0IGlvX3BndGFibGUgKmlvcDsKPj4+ICvCoMKgwqAgc3Ry dWN0IGlvX3BndGFibGVfaW5pdF9mbnMgKmZuczsKPj4+IMKgwqDCoMKgwqDCoMKgIGlmICghb3Bz KQo+Pj4gwqDCoMKgwqDCoMKgwqDCoMKgIHJldHVybjsKPj4+IMKgwqDCoMKgwqDCoMKgIGlvcCA9 IGlvX3BndGFibGVfb3BzX3RvX3BndGFibGUob3BzKTsKPj4+IMKgwqDCoMKgwqAgaW9fcGd0YWJs ZV90bGJfZmx1c2hfYWxsKGlvcCk7Cj4+PiAtwqDCoMKgIGlvX3BndGFibGVfaW5pdF90YWJsZVtp b3AtPmZtdF0tPmZyZWUoaW9wKTsKPj4+ICvCoMKgwqAgZm5zID0gaW9fcGd0YWJsZV9nZXRfaW5p dF9mbnMoaW9wLT5mbXQpOwo+Pj4gK8KgwqDCoCBpZiAoZm5zKQo+Pj4gK8KgwqDCoMKgwqDCoMKg IGZucy0+ZnJlZShpb3ApOwo+Pj4gwqAgfQo+Pj4gwqAgRVhQT1JUX1NZTUJPTF9HUEwoZnJlZV9p b19wZ3RhYmxlX29wcyk7Cj4+PiArCj4+PiAraW50IGlvX3BndGFibGVfb3BzX3JlZ2lzdGVyKHN0 cnVjdCBpb19wZ3RhYmxlX2luaXRfZm5zICppbml0X2ZucykKPj4+ICt7Cj4+PiArwqDCoMKgIHN0 cnVjdCBpb19wZ3RhYmxlX2luaXRfZm5zX25vZGUgKml0ZXIsICpmbnNfbm9kZTsKPj4+ICvCoMKg wqAgaW50IHJldCA9IDA7Cj4+PiArCj4+PiArwqDCoMKgIGlmICghaW5pdF9mbnMgfHwgaW5pdF9m bnMtPmZtdCA+PSBJT19QR1RBQkxFX05VTV9GTVRTIHx8Cj4+PiArwqDCoMKgwqDCoMKgwqAgIWlu aXRfZm5zLT5hbGxvYyB8fCAhaW5pdF9mbnMtPmZyZWUpCj4+PiArwqDCoMKgwqDCoMKgwqAgcmV0 dXJuIC1FSU5WQUw7Cj4+PiArCj4+PiArwqDCoMKgIGZuc19ub2RlID0ga3phbGxvYyhzaXplb2Yo KmZuc19ub2RlKSwgR0ZQX0tFUk5FTCk7Cj4+PiArwqDCoMKgIGlmICghZm5zX25vZGUpCj4+PiAr wqDCoMKgwqDCoMKgwqAgcmV0dXJuIC1FTk9NRU07Cj4+PiArCj4+PiArwqDCoMKgIHdyaXRlX2xv Y2soJmlvX3BndGFibGVfaW5pdF9mbnNfbGlzdF9sb2NrKTsKPj4+ICvCoMKgwqAgbGlzdF9mb3Jf ZWFjaF9lbnRyeShpdGVyLCAmaW9fcGd0YWJsZV9pbml0X2Zuc19saXN0LCBsaXN0KQo+Pj4gK8Kg wqDCoMKgwqDCoMKgIGlmIChpdGVyLT5mbnMtPmZtdCA9PSBpbml0X2Zucy0+Zm10KSB7Cj4+PiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXQgPSAtRUVYSVNUOwo+Pj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqAga2ZyZWUoZm5zX25vZGUpOwo+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgYnJl YWs7Cj4+PiArwqDCoMKgwqDCoMKgwqAgfQo+Pj4gKwo+Pj4gK8KgwqDCoCBpZiAoIXJldCkgewo+ Pj4gK8KgwqDCoMKgwqDCoMKgIGZuc19ub2RlLT5mbnMgPSBpbml0X2ZuczsKPj4+ICvCoMKgwqDC oMKgwqDCoCBJTklUX0xJU1RfSEVBRCgmZm5zX25vZGUtPmxpc3QpOwo+Pj4gK8KgwqDCoMKgwqDC oMKgIGxpc3RfYWRkX3RhaWwoJmZuc19ub2RlLT5saXN0LCAmaW9fcGd0YWJsZV9pbml0X2Zuc19s aXN0KTsKPj4+ICvCoMKgwqAgfQo+Pj4gK8KgwqDCoCB3cml0ZV91bmxvY2soJmlvX3BndGFibGVf aW5pdF9mbnNfbGlzdF9sb2NrKTsKPj4+ICvCoMKgwqAgcmV0dXJuIHJldDsKPj4+ICt9Cj4+PiAr RVhQT1JUX1NZTUJPTF9HUEwoaW9fcGd0YWJsZV9vcHNfcmVnaXN0ZXIpOwo+Pj4gKwo+Pj4gK3Zv aWQgaW9fcGd0YWJsZV9vcHNfdW5yZWdpc3RlcihzdHJ1Y3QgaW9fcGd0YWJsZV9pbml0X2ZucyAq aW5pdF9mbnMpCj4+PiArewo+Pj4gK8KgwqDCoCBzdHJ1Y3QgaW9fcGd0YWJsZV9pbml0X2Zuc19u b2RlICppdGVyLCAqdG1wOwo+Pj4gKwo+Pj4gK8KgwqDCoCBpZiAoIWluaXRfZm5zKQo+Pj4gK8Kg wqDCoMKgwqDCoMKgIHJldHVybjsKPj4+ICsKPj4+ICvCoMKgwqAgd3JpdGVfbG9jaygmaW9fcGd0 YWJsZV9pbml0X2Zuc19saXN0X2xvY2spOwo+Pj4gK8KgwqDCoCBsaXN0X2Zvcl9lYWNoX2VudHJ5 X3NhZmUoaXRlciwgdG1wLCAmaW9fcGd0YWJsZV9pbml0X2Zuc19saXN0LCAKPj4+IGxpc3QpCj4+ PiArwqDCoMKgwqDCoMKgwqAgaWYgKGl0ZXItPmZucyA9PSBpbml0X2Zucykgewo+Pj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqAgbGlzdF9kZWwoJml0ZXItPmxpc3QpOwo+Pj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqAga2ZyZWUoaXRlcik7Cj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBicmVh azsKPj4+ICvCoMKgwqDCoMKgwqDCoCB9Cj4+PiArwqDCoMKgIHdyaXRlX3VubG9jaygmaW9fcGd0 YWJsZV9pbml0X2Zuc19saXN0X2xvY2spOwo+Pj4gK30KPj4+ICtFWFBPUlRfU1lNQk9MX0dQTChp b19wZ3RhYmxlX29wc191bnJlZ2lzdGVyKTsKPj4+IGRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4 L2lvLXBndGFibGUuaCBiL2luY2x1ZGUvbGludXgvaW8tcGd0YWJsZS5oCj4+PiBpbmRleCBlYTcy N2ViLi40NWIzNjdjZSAxMDA2NDQKPj4+IC0tLSBhL2luY2x1ZGUvbGludXgvaW8tcGd0YWJsZS5o Cj4+PiArKysgYi9pbmNsdWRlL2xpbnV4L2lvLXBndGFibGUuaAo+Pj4gQEAgLTE2Myw2ICsxNjMs MzggQEAgc3RydWN0IGlvX3BndGFibGVfb3BzIHsKPj4+IMKgIH07Cj4+PiDCoMKgwqAgLyoqCj4+ PiArICogc3RydWN0IGlvX3BndGFibGVfaW5pdF9mbnMgLSBBbGxvYy9mcmVlIGEgc2V0IG9mIHBh Z2UgdGFibGVzIGZvciBhCj4+PiArICrCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHBhcnRpY3VsYXIgZm9ybWF0Lgo+Pj4gKyAqCj4+PiAr ICogQGZtdDrCoMKgIFRoZSBwYWdlIHRhYmxlIGZvcm1hdC4KPj4+ICsgKiBAYWxsb2M6IEFsbG9j YXRlIGEgc2V0IG9mIHBhZ2UgdGFibGVzIGRlc2NyaWJlZCBieSBjZmcuCj4+PiArICogQGZyZWU6 wqAgRnJlZSB0aGUgcGFnZSB0YWJsZXMgYXNzb2NpYXRlZCB3aXRoIGlvcC4KPj4+ICsgKi8KPj4+ ICtzdHJ1Y3QgaW9fcGd0YWJsZV9pbml0X2ZucyB7Cj4+PiArwqDCoMKgIGVudW0gaW9fcGd0YWJs ZV9mbXQgZm10Owo+Pj4gK8KgwqDCoCBzdHJ1Y3QgaW9fcGd0YWJsZSAqKCphbGxvYykoc3RydWN0 IGlvX3BndGFibGVfY2ZnICpjZmcsIHZvaWQgCj4+PiAqY29va2llKTsKPj4+ICvCoMKgwqAgdm9p ZCAoKmZyZWUpKHN0cnVjdCBpb19wZ3RhYmxlICppb3ApOwo+Pj4gK307Cj4+PiArCj4+PiArLyoq Cj4+PiArICogaW9fcGd0YWJsZV9vcHNfcmVnaXN0ZXIoKSAtIFJlZ2lzdGVyIHRoZSBwYWdlIHRh YmxlIHJvdXRpbmVzIGZvciAKPj4+IGEgcGFnZSB0YWJsZQo+Pj4gKyAqwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZm9ybWF0Lgo+Pj4gKyAq Cj4+PiArICogQGluaXRfZm5zOiBUaGUgZnVuY3Rpb25zIGZvciBhbGxvY2F0aW5nIGFuZCBmcmVl aW5nIHRoZSBwYWdlIAo+Pj4gdGFibGVzIG9mCj4+PiArICrCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IGEgcGFydGljdWxhciBmb3JtYXQuCj4+PiArICovCj4+PiAraW50IGlvX3BndGFibGVfb3BzX3Jl Z2lzdGVyKHN0cnVjdCBpb19wZ3RhYmxlX2luaXRfZm5zICppbml0X2Zucyk7Cj4+PiArCj4+PiAr LyoqCj4+PiArICogaW9fcGd0YWJsZV9vcHNfdW5yZWdpc3RlcigpIC0gVW5yZWdpc3RlciB0aGUg cGFnZSB0YWJsZSByb3V0aW5lcyAKPj4+IGZvciBhIHBhZ2UKPj4+ICsgKsKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB0YWJsZSBmb3Jt YXQuCj4+PiArICoKPj4+ICsgKiBAaW5pdF9mbnM6IFRoZSBmdW5jdGlvbnMgZm9yIGFsbG9jYXRp bmcgYW5kIGZyZWVpbmcgdGhlIHBhZ2UgCj4+PiB0YWJsZXMgb2YKPj4+ICsgKsKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgYSBwYXJ0aWN1bGFyIGZvcm1hdC4KPj4+ICsgKi8KPj4+ICt2b2lkIGlvX3Bn dGFibGVfb3BzX3VucmVnaXN0ZXIoc3RydWN0IGlvX3BndGFibGVfaW5pdF9mbnMgKmluaXRfZm5z KTsKPj4+ICsKPj4+ICsvKioKPj4+IMKgwqAgKiBhbGxvY19pb19wZ3RhYmxlX29wcygpIC0gQWxs b2NhdGUgYSBwYWdlIHRhYmxlIGFsbG9jYXRvciBmb3IgdXNlIAo+Pj4gYnkgYW4gSU9NTVUuCj4+ PiDCoMKgICoKPj4+IMKgwqAgKiBAZm10OsKgwqDCoCBUaGUgcGFnZSB0YWJsZSBmb3JtYXQuCj4+ PiBAQCAtMjMzLDIzICsyNjUsNCBAQCBpb19wZ3RhYmxlX3RsYl9hZGRfcGFnZShzdHJ1Y3QgaW9f cGd0YWJsZSAqaW9wLAo+Pj4gwqDCoMKgwqDCoMKgwqDCoMKgIGlvcC0+Y2ZnLnRsYi0+dGxiX2Fk ZF9wYWdlKGdhdGhlciwgaW92YSwgZ3JhbnVsZSwgCj4+PiBpb3AtPmNvb2tpZSk7Cj4+PiDCoCB9 Cj4+PiDCoCAtLyoqCj4+PiAtICogc3RydWN0IGlvX3BndGFibGVfaW5pdF9mbnMgLSBBbGxvYy9m cmVlIGEgc2V0IG9mIHBhZ2UgdGFibGVzIGZvciBhCj4+PiAtICrCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHBhcnRpY3VsYXIgZm9ybWF0 Lgo+Pj4gLSAqCj4+PiAtICogQGFsbG9jOiBBbGxvY2F0ZSBhIHNldCBvZiBwYWdlIHRhYmxlcyBk ZXNjcmliZWQgYnkgY2ZnLgo+Pj4gLSAqIEBmcmVlOsKgIEZyZWUgdGhlIHBhZ2UgdGFibGVzIGFz c29jaWF0ZWQgd2l0aCBpb3AuCj4+PiAtICovCj4+PiAtc3RydWN0IGlvX3BndGFibGVfaW5pdF9m bnMgewo+Pj4gLcKgwqDCoCBzdHJ1Y3QgaW9fcGd0YWJsZSAqKCphbGxvYykoc3RydWN0IGlvX3Bn dGFibGVfY2ZnICpjZmcsIHZvaWQgCj4+PiAqY29va2llKTsKPj4+IC3CoMKgwqAgdm9pZCAoKmZy ZWUpKHN0cnVjdCBpb19wZ3RhYmxlICppb3ApOwo+Pj4gLX07Cj4+PiAtCj4+PiAtZXh0ZXJuIHN0 cnVjdCBpb19wZ3RhYmxlX2luaXRfZm5zIGlvX3BndGFibGVfYXJtXzMyX2xwYWVfczFfaW5pdF9m bnM7Cj4+PiAtZXh0ZXJuIHN0cnVjdCBpb19wZ3RhYmxlX2luaXRfZm5zIGlvX3BndGFibGVfYXJt XzMyX2xwYWVfczJfaW5pdF9mbnM7Cj4+PiAtZXh0ZXJuIHN0cnVjdCBpb19wZ3RhYmxlX2luaXRf Zm5zIGlvX3BndGFibGVfYXJtXzY0X2xwYWVfczFfaW5pdF9mbnM7Cj4+PiAtZXh0ZXJuIHN0cnVj dCBpb19wZ3RhYmxlX2luaXRfZm5zIGlvX3BndGFibGVfYXJtXzY0X2xwYWVfczJfaW5pdF9mbnM7 Cj4+PiAtZXh0ZXJuIHN0cnVjdCBpb19wZ3RhYmxlX2luaXRfZm5zIGlvX3BndGFibGVfYXJtX3Y3 c19pbml0X2ZuczsKPj4+IC1leHRlcm4gc3RydWN0IGlvX3BndGFibGVfaW5pdF9mbnMgaW9fcGd0 YWJsZV9hcm1fbWFsaV9scGFlX2luaXRfZm5zOwo+Pj4gLQo+Pj4gwqAgI2VuZGlmIC8qIF9fSU9f UEdUQUJMRV9IICovCj4+Pgo+Pgo+PiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fXwo+PiBsaW51eC1hcm0ta2VybmVsIG1haWxpbmcgbGlzdAo+PiBsaW51eC1h cm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcKPj4gaHR0cDovL2xpc3RzLmluZnJhZGVhZC5v cmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1hcm0ta2VybmVsCj4gX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX18KPiBpb21tdSBtYWlsaW5nIGxpc3QKPiBpb21t dUBsaXN0cy5saW51eC1mb3VuZGF0aW9uLm9yZwo+IGh0dHBzOi8vbGlzdHMubGludXhmb3VuZGF0 aW9uLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2lvbW11Cl9fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fCmRyaS1kZXZlbCBtYWlsaW5nIGxpc3QKZHJpLWRldmVsQGxp c3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFu L2xpc3RpbmZvL2RyaS1kZXZlbAo= 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=-17.8 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,NICE_REPLY_A,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED,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 3E484C433DB for ; Wed, 23 Dec 2020 13:46:27 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (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 E2E9723129 for ; Wed, 23 Dec 2020 13:46:26 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org E2E9723129 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=arm.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+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=merlin.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=eD6hGb+kxM9rHtye1Qh0qXvctAHJgtTkUDmrdpNvH1Q=; b=GF97FLf7mckkbTXwTTLRNueEW YWV9b32SYeHPP1cv9TXjLaixj5rGVXa8EgEy7UQGvb0+wU3Ck9Dx/zh87hDl/fm6fAIijhtJo5vF7 cDVPGVQR3c+f93H6QipBoFJ6kczugDYBdIFga6GP8Mif99bMYMcu3Sdg+kyvlpcu0WE7165p2H22y zPLEmq6+qywlDY3QH81Njw9vFTWd5uBRe/07GCoL1+tLqJh/kRV9xkBCWWSMzR3UVh0Inb1le8dUu izFx1lKdYtZX09dTHpo0caOAB2GNAuTbefnXMRs6RUaUcCQjacCDDDFR7QqJuythF+D7YD5SqSGXA cpjyOCW7w==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1ks4Rp-0006Zj-Bt; Wed, 23 Dec 2020 13:45:01 +0000 Received: from foss.arm.com ([217.140.110.172]) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1ks4Rg-0006Uc-A4 for linux-arm-kernel@lists.infradead.org; Wed, 23 Dec 2020 13:44:55 +0000 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 923461042; Wed, 23 Dec 2020 05:44:46 -0800 (PST) Received: from [10.57.34.90] (unknown [10.57.34.90]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id B75E33F66E; Wed, 23 Dec 2020 05:44:44 -0800 (PST) Subject: Re: [PATCH v2 1/7] iommu/io-pgtable: Introduce dynamic io-pgtable fmt registration To: isaacm@codeaurora.org References: <1608597876-32367-1-git-send-email-isaacm@codeaurora.org> <1608597876-32367-2-git-send-email-isaacm@codeaurora.org> <4f388512-c3df-e9fc-ebd4-624ab36a6858@arm.com> <8b48b371811a170053e2ca810ab63abf@codeaurora.org> From: Robin Murphy Message-ID: <64657a85-e2d5-e13f-d6b5-9d68c4142b80@arm.com> Date: Wed, 23 Dec 2020 13:44:43 +0000 User-Agent: Mozilla/5.0 (Windows NT 10.0; rv:78.0) Gecko/20100101 Thunderbird/78.6.0 MIME-Version: 1.0 In-Reply-To: <8b48b371811a170053e2ca810ab63abf@codeaurora.org> Content-Language: en-GB X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20201223_084452_525455_DC080A9B X-CRM114-Status: GOOD ( 34.84 ) 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: freedreno@lists.freedesktop.org, kernel-team@android.com, pdaly@codeaurora.org, linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, iommu@lists.linux-foundation.org, will@kernel.org, linux-arm-kernel@lists.infradead.org, pratikp@codeaurora.org Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org T24gMjAyMC0xMi0yMiAxOTo1NCwgaXNhYWNtQGNvZGVhdXJvcmEub3JnIHdyb3RlOgo+IE9uIDIw MjAtMTItMjIgMTE6MjcsIFJvYmluIE11cnBoeSB3cm90ZToKPj4gT24gMjAyMC0xMi0yMiAwMDo0 NCwgSXNhYWMgSi4gTWFuamFycmVzIHdyb3RlOgo+Pj4gVGhlIGlvLXBndGFibGUgY29kZSBjb25z dHJ1Y3RzIGFuIGFycmF5IG9mIGluaXQgZnVuY3Rpb25zIGZvciBlYWNoCj4+PiBwYWdlIHRhYmxl IGZvcm1hdCBhdCBjb21waWxlIHRpbWUuIFRoaXMgaXMgbm90IGlkZWFsLCBhcyB0aGlzCj4+PiBp bmNyZWFzZXMgdGhlIGZvb3RwcmludCBvZiB0aGUgaW8tcGd0YWJsZSBjb2RlLCBhcyB3ZWxsIGFz IHByZXZlbnRzCj4+PiBpby1wZ3RhYmxlIGZvcm1hdHMgZnJvbSBiZWluZyBidWlsdCBhcyBrZXJu ZWwgbW9kdWxlcy4KPj4+Cj4+PiBJbiBwcmVwYXJhdGlvbiBmb3IgbW9kdWxhcml6aW5nIHRoZSBp by1wZ3RhYmxlIGZvcm1hdHMsIHN3aXRjaCB0byBhCj4+PiBkeW5hbWljIHJlZ2lzdHJhdGlvbiBz Y2hlbWUsIHdoZXJlIGVhY2ggaW8tcGd0YWJsZSBmb3JtYXQgY2FuIHJlZ2lzdGVyCj4+PiB0aGVp ciBpbml0IGZ1bmN0aW9ucyB3aXRoIHRoZSBpby1wZ3RhYmxlIGNvZGUgYXQgYm9vdCBvciBtb2R1 bGUKPj4+IGluc2VydGlvbiB0aW1lLgo+Pj4KPj4+IFNpZ25lZC1vZmYtYnk6IElzYWFjIEouIE1h bmphcnJlcyA8aXNhYWNtQGNvZGVhdXJvcmEub3JnPgo+Pj4gLS0tCj4+PiDCoCBkcml2ZXJzL2lv bW11L2lvLXBndGFibGUtYXJtLXY3cy5jIHwgMzQgKysrKysrKysrKysrKy0KPj4+IMKgIGRyaXZl cnMvaW9tbXUvaW8tcGd0YWJsZS1hcm0uY8KgwqDCoMKgIHwgOTAgCj4+PiArKysrKysrKysrKysr KysrKysrKysrKysrKy0tLS0tLS0tLS0KPj4+IMKgIGRyaXZlcnMvaW9tbXUvaW8tcGd0YWJsZS5j wqDCoMKgwqDCoMKgwqDCoCB8IDk0IAo+Pj4gKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KystLS0tLS0KPj4+IMKgIGluY2x1ZGUvbGludXgvaW8tcGd0YWJsZS5owqDCoMKgwqDCoMKgwqDC oCB8IDUxICsrKysrKysrKysrKystLS0tLS0tLQo+Pj4gwqAgNCBmaWxlcyBjaGFuZ2VkLCAyMDkg aW5zZXJ0aW9ucygrKSwgNjAgZGVsZXRpb25zKC0pCj4+Pgo+Pj4gZGlmZiAtLWdpdCBhL2RyaXZl cnMvaW9tbXUvaW8tcGd0YWJsZS1hcm0tdjdzLmMgCj4+PiBiL2RyaXZlcnMvaW9tbXUvaW8tcGd0 YWJsZS1hcm0tdjdzLmMKPj4+IGluZGV4IDFkOTJhYzkuLjg5YWFkMmYgMTAwNjQ0Cj4+PiAtLS0g YS9kcml2ZXJzL2lvbW11L2lvLXBndGFibGUtYXJtLXY3cy5jCj4+PiArKysgYi9kcml2ZXJzL2lv bW11L2lvLXBndGFibGUtYXJtLXY3cy5jCj4+PiBAQCAtMjgsNiArMjgsNyBAQAo+Pj4gwqAgI2lu Y2x1ZGUgPGxpbnV4L2lvbW11Lmg+Cj4+PiDCoCAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Cj4+ PiDCoCAjaW5jbHVkZSA8bGludXgva21lbWxlYWsuaD4KPj4+ICsjaW5jbHVkZSA8bGludXgvbW9k dWxlLmg+Cj4+PiDCoCAjaW5jbHVkZSA8bGludXgvc2l6ZXMuaD4KPj4+IMKgICNpbmNsdWRlIDxs aW51eC9zbGFiLmg+Cj4+PiDCoCAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KPj4+IEBAIC04 MzUsNyArODM2LDggQEAgc3RhdGljIHN0cnVjdCBpb19wZ3RhYmxlIAo+Pj4gKmFybV92N3NfYWxs b2NfcGd0YWJsZShzdHJ1Y3QgaW9fcGd0YWJsZV9jZmcgKmNmZywKPj4+IMKgwqDCoMKgwqAgcmV0 dXJuIE5VTEw7Cj4+PiDCoCB9Cj4+PiDCoCAtc3RydWN0IGlvX3BndGFibGVfaW5pdF9mbnMgaW9f cGd0YWJsZV9hcm1fdjdzX2luaXRfZm5zID0gewo+Pj4gK3N0YXRpYyBzdHJ1Y3QgaW9fcGd0YWJs ZV9pbml0X2ZucyBpb19wZ3RhYmxlX2FybV92N3NfaW5pdF9mbnMgPSB7Cj4+PiArwqDCoMKgIC5m bXTCoMKgwqAgPSBBUk1fVjdTLAo+Pj4gwqDCoMKgwqDCoCAuYWxsb2PCoMKgwqAgPSBhcm1fdjdz X2FsbG9jX3BndGFibGUsCj4+PiDCoMKgwqDCoMKgIC5mcmVlwqDCoMKgID0gYXJtX3Y3c19mcmVl X3BndGFibGUsCj4+PiDCoCB9Owo+Pj4gQEAgLTk4Miw1ICs5ODQsMzMgQEAgc3RhdGljIGludCBf X2luaXQgYXJtX3Y3c19kb19zZWxmdGVzdHModm9pZCkKPj4+IMKgwqDCoMKgwqAgcHJfaW5mbygi c2VsZiB0ZXN0IG9rXG4iKTsKPj4+IMKgwqDCoMKgwqAgcmV0dXJuIDA7Cj4+PiDCoCB9Cj4+PiAt c3Vic3lzX2luaXRjYWxsKGFybV92N3NfZG9fc2VsZnRlc3RzKTsKPj4+ICsjZWxzZQo+Pj4gK3N0 YXRpYyBpbnQgYXJtX3Y3c19kb19zZWxmdGVzdHModm9pZCkKPj4+ICt7Cj4+PiArwqDCoMKgIHJl dHVybiAwOwo+Pj4gK30KPj4+IMKgICNlbmRpZgo+Pj4gKwo+Pj4gK3N0YXRpYyBpbnQgX19pbml0 IGFybV92N3NfaW5pdCh2b2lkKQo+Pj4gK3sKPj4+ICvCoMKgwqAgaW50IHJldDsKPj4+ICsKPj4+ ICvCoMKgwqAgcmV0ID0gaW9fcGd0YWJsZV9vcHNfcmVnaXN0ZXIoJmlvX3BndGFibGVfYXJtX3Y3 c19pbml0X2Zucyk7Cj4+PiArwqDCoMKgIGlmIChyZXQgPCAwKSB7Cj4+PiArwqDCoMKgwqDCoMKg wqAgcHJfZXJyKCJGYWlsZWQgdG8gcmVnaXN0ZXIgQVJNIFY3UyBmb3JtYXRcbiIpOwo+Pgo+PiBT dXBlci1uaXQ6IEkgdGhpbmsgInY3cyIgc2hvdWxkIHByb2JhYmx5IGJlIGxvd2VyY2FzZSB0aGVy ZS4gQWxzbwo+PiBnZW5lcmFsIGNvbnNpc3RlbmN5IFdSVCB0byBzaG93aW5nIHRoZSBlcnJvciBj b2RlIGFuZCB3aGV0aGVyIG9yIG5vdAo+PiB0byBhYmJyZXZpYXRlICJmb3JtYXQiIHdvdWxkIGJl IG5pY2UuCj4+Cj4gT2ssIEkgY2FuIGZpeCB0aGlzIGFjY29yZGluZ2x5Lgo+IAo+Pj4gK8KgwqDC oMKgwqDCoMKgIHJldHVybiByZXQ7Cj4+PiArwqDCoMKgIH0KPj4+ICsKPj4+ICvCoMKgwqAgcmV0 ID0gYXJtX3Y3c19kb19zZWxmdGVzdHMoKTsKPj4+ICvCoMKgwqAgaWYgKHJldCA8IDApCj4+PiAr wqDCoMKgwqDCoMKgwqAgaW9fcGd0YWJsZV9vcHNfdW5yZWdpc3RlcigmaW9fcGd0YWJsZV9hcm1f djdzX2luaXRfZm5zKTsKPj4+ICsKPj4+ICvCoMKgwqAgcmV0dXJuIHJldDsKPj4+ICt9Cj4+PiAr Y29yZV9pbml0Y2FsbChhcm1fdjdzX2luaXQpOwo+Pj4gKwo+Pj4gK3N0YXRpYyB2b2lkIF9fZXhp dCBhcm1fdjdzX2V4aXQodm9pZCkKPj4+ICt7Cj4+PiArwqDCoMKgIGlvX3BndGFibGVfb3BzX3Vu cmVnaXN0ZXIoJmlvX3BndGFibGVfYXJtX3Y3c19pbml0X2Zucyk7Cj4+PiArfQo+Pj4gK21vZHVs ZV9leGl0KGFybV92N3NfZXhpdCk7Cj4+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9pb21tdS9pby1w Z3RhYmxlLWFybS5jIAo+Pj4gYi9kcml2ZXJzL2lvbW11L2lvLXBndGFibGUtYXJtLmMKPj4+IGlu ZGV4IDg3ZGVmNTguLmZmMGVhMmYgMTAwNjQ0Cj4+PiAtLS0gYS9kcml2ZXJzL2lvbW11L2lvLXBn dGFibGUtYXJtLmMKPj4+ICsrKyBiL2RyaXZlcnMvaW9tbXUvaW8tcGd0YWJsZS1hcm0uYwo+Pj4g QEAgLTEzLDYgKzEzLDcgQEAKPj4+IMKgICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KPj4+IMKg ICNpbmNsdWRlIDxsaW51eC9pby1wZ3RhYmxlLmg+Cj4+PiDCoCAjaW5jbHVkZSA8bGludXgva2Vy bmVsLmg+Cj4+PiArI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgo+Pj4gwqAgI2luY2x1ZGUgPGxp bnV4L3NpemVzLmg+Cj4+PiDCoCAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgo+Pj4gwqAgI2luY2x1 ZGUgPGxpbnV4L3R5cGVzLmg+Cj4+PiBAQCAtMTA0MywyOSArMTA0NCwzMiBAQCBhcm1fbWFsaV9s cGFlX2FsbG9jX3BndGFibGUoc3RydWN0IAo+Pj4gaW9fcGd0YWJsZV9jZmcgKmNmZywgdm9pZCAq Y29va2llKQo+Pj4gwqDCoMKgwqDCoCByZXR1cm4gTlVMTDsKPj4+IMKgIH0KPj4+IMKgIC1zdHJ1 Y3QgaW9fcGd0YWJsZV9pbml0X2ZucyBpb19wZ3RhYmxlX2FybV82NF9scGFlX3MxX2luaXRfZm5z ID0gewo+Pj4gLcKgwqDCoCAuYWxsb2PCoMKgwqAgPSBhcm1fNjRfbHBhZV9hbGxvY19wZ3RhYmxl X3MxLAo+Pj4gLcKgwqDCoCAuZnJlZcKgwqDCoCA9IGFybV9scGFlX2ZyZWVfcGd0YWJsZSwKPj4+ IC19Owo+Pj4gLQo+Pj4gLXN0cnVjdCBpb19wZ3RhYmxlX2luaXRfZm5zIGlvX3BndGFibGVfYXJt XzY0X2xwYWVfczJfaW5pdF9mbnMgPSB7Cj4+PiAtwqDCoMKgIC5hbGxvY8KgwqDCoCA9IGFybV82 NF9scGFlX2FsbG9jX3BndGFibGVfczIsCj4+PiAtwqDCoMKgIC5mcmVlwqDCoMKgID0gYXJtX2xw YWVfZnJlZV9wZ3RhYmxlLAo+Pj4gLX07Cj4+PiAtCj4+PiAtc3RydWN0IGlvX3BndGFibGVfaW5p dF9mbnMgaW9fcGd0YWJsZV9hcm1fMzJfbHBhZV9zMV9pbml0X2ZucyA9IHsKPj4+IC3CoMKgwqAg LmFsbG9jwqDCoMKgID0gYXJtXzMyX2xwYWVfYWxsb2NfcGd0YWJsZV9zMSwKPj4+IC3CoMKgwqAg LmZyZWXCoMKgwqAgPSBhcm1fbHBhZV9mcmVlX3BndGFibGUsCj4+PiAtfTsKPj4+IC0KPj4+IC1z dHJ1Y3QgaW9fcGd0YWJsZV9pbml0X2ZucyBpb19wZ3RhYmxlX2FybV8zMl9scGFlX3MyX2luaXRf Zm5zID0gewo+Pj4gLcKgwqDCoCAuYWxsb2PCoMKgwqAgPSBhcm1fMzJfbHBhZV9hbGxvY19wZ3Rh YmxlX3MyLAo+Pj4gLcKgwqDCoCAuZnJlZcKgwqDCoCA9IGFybV9scGFlX2ZyZWVfcGd0YWJsZSwK Pj4+IC19Owo+Pj4gLQo+Pj4gLXN0cnVjdCBpb19wZ3RhYmxlX2luaXRfZm5zIGlvX3BndGFibGVf YXJtX21hbGlfbHBhZV9pbml0X2ZucyA9IHsKPj4+IC3CoMKgwqAgLmFsbG9jwqDCoMKgID0gYXJt X21hbGlfbHBhZV9hbGxvY19wZ3RhYmxlLAo+Pj4gLcKgwqDCoCAuZnJlZcKgwqDCoCA9IGFybV9s cGFlX2ZyZWVfcGd0YWJsZSwKPj4+ICtzdGF0aWMgc3RydWN0IGlvX3BndGFibGVfaW5pdF9mbnMg aW9fcGd0YWJsZV9hcm1fbHBhZV9pbml0X2Zuc1tdID0gewo+Pj4gK8KgwqDCoCB7Cj4+PiArwqDC oMKgwqDCoMKgwqAgLmZtdMKgwqDCoCA9IEFSTV8zMl9MUEFFX1MxLAo+Pj4gK8KgwqDCoMKgwqDC oMKgIC5hbGxvY8KgwqDCoCA9IGFybV8zMl9scGFlX2FsbG9jX3BndGFibGVfczEsCj4+PiArwqDC oMKgwqDCoMKgwqAgLmZyZWXCoMKgwqAgPSBhcm1fbHBhZV9mcmVlX3BndGFibGUsCj4+PiArwqDC oMKgIH0sCj4+PiArwqDCoMKgIHsKPj4+ICvCoMKgwqDCoMKgwqDCoCAuZm10wqDCoMKgID0gQVJN XzMyX0xQQUVfUzIsCj4+PiArwqDCoMKgwqDCoMKgwqAgLmFsbG9jwqDCoMKgID0gYXJtXzMyX2xw YWVfYWxsb2NfcGd0YWJsZV9zMiwKPj4+ICvCoMKgwqDCoMKgwqDCoCAuZnJlZcKgwqDCoCA9IGFy bV9scGFlX2ZyZWVfcGd0YWJsZSwKPj4+ICvCoMKgwqAgfSwKPj4+ICvCoMKgwqAgewo+Pj4gK8Kg wqDCoMKgwqDCoMKgIC5mbXTCoMKgwqAgPSBBUk1fNjRfTFBBRV9TMSwKPj4+ICvCoMKgwqDCoMKg wqDCoCAuYWxsb2PCoMKgwqAgPSBhcm1fNjRfbHBhZV9hbGxvY19wZ3RhYmxlX3MxLAo+Pj4gK8Kg wqDCoMKgwqDCoMKgIC5mcmVlwqDCoMKgID0gYXJtX2xwYWVfZnJlZV9wZ3RhYmxlLAo+Pj4gK8Kg wqDCoCB9LAo+Pj4gK8KgwqDCoCB7Cj4+PiArwqDCoMKgwqDCoMKgwqAgLmZtdMKgwqDCoCA9IEFS TV82NF9MUEFFX1MyLAo+Pj4gK8KgwqDCoMKgwqDCoMKgIC5hbGxvY8KgwqDCoCA9IGFybV82NF9s cGFlX2FsbG9jX3BndGFibGVfczIsCj4+PiArwqDCoMKgwqDCoMKgwqAgLmZyZWXCoMKgwqAgPSBh cm1fbHBhZV9mcmVlX3BndGFibGUsCj4+PiArwqDCoMKgIH0sCj4+PiArwqDCoMKgIHsKPj4+ICvC oMKgwqDCoMKgwqDCoCAuZm10wqDCoMKgID0gQVJNX01BTElfTFBBRSwKPj4+ICvCoMKgwqDCoMKg wqDCoCAuYWxsb2PCoMKgwqAgPSBhcm1fbWFsaV9scGFlX2FsbG9jX3BndGFibGUsCj4+PiArwqDC oMKgwqDCoMKgwqAgLmZyZWXCoMKgwqAgPSBhcm1fbHBhZV9mcmVlX3BndGFibGUsCj4+PiArwqDC oMKgIH0sCj4+PiDCoCB9Owo+Pj4gwqDCoMKgICNpZmRlZiBDT05GSUdfSU9NTVVfSU9fUEdUQUJM RV9MUEFFX1NFTEZURVNUCj4+PiBAQCAtMTI1MCw1ICsxMjU0LDQzIEBAIHN0YXRpYyBpbnQgX19p bml0IGFybV9scGFlX2RvX3NlbGZ0ZXN0cyh2b2lkKQo+Pj4gwqDCoMKgwqDCoCBwcl9pbmZvKCJz ZWxmdGVzdDogY29tcGxldGVkIHdpdGggJWQgUEFTUyAlZCBGQUlMXG4iLCBwYXNzLCBmYWlsKTsK Pj4+IMKgwqDCoMKgwqAgcmV0dXJuIGZhaWwgPyAtRUZBVUxUIDogMDsKPj4+IMKgIH0KPj4+IC1z dWJzeXNfaW5pdGNhbGwoYXJtX2xwYWVfZG9fc2VsZnRlc3RzKTsKPj4+ICsjZWxzZQo+Pj4gK3N0 YXRpYyBpbnQgX19pbml0IGFybV9scGFlX2RvX3NlbGZ0ZXN0cyh2b2lkKQo+Pj4gK3sKPj4+ICvC oMKgwqAgcmV0dXJuIDA7Cj4+PiArfQo+Pj4gwqAgI2VuZGlmCj4+PiArCj4+PiArc3RhdGljIGlu dCBfX2luaXQgYXJtX2xwYWVfaW5pdCh2b2lkKQo+Pj4gK3sKPj4+ICvCoMKgwqAgaW50IHJldCwg aTsKPj4+ICsKPj4+ICvCoMKgwqAgZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaW9fcGd0YWJs ZV9hcm1fbHBhZV9pbml0X2Zucyk7IGkrKykgewo+Pj4gK8KgwqDCoMKgwqDCoMKgIHJldCA9IAo+ Pj4gaW9fcGd0YWJsZV9vcHNfcmVnaXN0ZXIoJmlvX3BndGFibGVfYXJtX2xwYWVfaW5pdF9mbnNb aV0pOwo+Pj4gK8KgwqDCoMKgwqDCoMKgIGlmIChyZXQgPCAwKSB7Cj4+PiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCBwcl9lcnIoIkZhaWxlZCB0byByZWdpc3RlciBBUk0gTFBBRSBmbXQ6ICVkXG4i KTsKPj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGdvdG8gZXJyX2lvX3BndGFibGVfcmVnaXN0 ZXI7Cj4+PiArwqDCoMKgwqDCoMKgwqAgfQo+Pj4gK8KgwqDCoCB9Cj4+PiArCj4+PiArwqDCoMKg IHJldCA9IGFybV9scGFlX2RvX3NlbGZ0ZXN0cygpOwo+Pj4gK8KgwqDCoCBpZiAocmV0IDwgMCkK Pj4+ICvCoMKgwqDCoMKgwqDCoCBnb3RvIGVycl9pb19wZ3RhYmxlX3JlZ2lzdGVyOwo+Pj4gKwo+ Pj4gK8KgwqDCoCByZXR1cm4gMDsKPj4+ICsKPj4+ICtlcnJfaW9fcGd0YWJsZV9yZWdpc3RlcjoK Pj4+ICvCoMKgwqAgZm9yIChpID0gaSAtIDE7IGkgPj0gMDsgaS0tKQo+Pgo+PiBQZXJzb25hbGx5 IEkgZmluZCAid2hpbGUgKGktLSkiIGEgYml0IGNsZWFyZXIgZm9yIHRoaXMga2luZCBvZgo+PiB1 bndpbmRpbmcsIGJ1dCBtYXliZSBwb3N0LWRlY3JlbWVudCBpc24ndCB0byBldmVyeW9uZSdzIHRh c3RlLgo+Pgo+IEknbSBub3QgcGFydGljdWxhcmx5IGF0dGFjaGVkIHRvIHRoZSBjdXJyZW50IGFw cHJvYWNoLCBzbyBhIHdoaWxlIGxvb3AKPiBpcyBva2F5IHdpdGggbWUgOikuCj4gCj4+PiArwqDC oMKgwqDCoMKgwqAgaW9fcGd0YWJsZV9vcHNfdW5yZWdpc3RlcigmaW9fcGd0YWJsZV9hcm1fbHBh ZV9pbml0X2Zuc1tpXSk7Cj4+PiArwqDCoMKgIHJldHVybiByZXQ7Cj4+PiArfQo+Pj4gK2NvcmVf aW5pdGNhbGwoYXJtX2xwYWVfaW5pdCk7Cj4+PiArCj4+PiArc3RhdGljIHZvaWQgX19leGl0IGFy bV9scGFlX2V4aXQodm9pZCkKPj4+ICt7Cj4+PiArwqDCoMKgIGludCBpOwo+Pj4gKwo+Pj4gK8Kg wqDCoCBmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShpb19wZ3RhYmxlX2FybV9scGFlX2luaXRf Zm5zKTsgaSsrKQo+Pj4gK8KgwqDCoMKgwqDCoMKgIGlvX3BndGFibGVfb3BzX3VucmVnaXN0ZXIo JmlvX3BndGFibGVfYXJtX2xwYWVfaW5pdF9mbnNbaV0pOwo+Pj4gK30KPj4+ICttb2R1bGVfZXhp dChhcm1fbHBhZV9leGl0KTsKPj4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2lvbW11L2lvLXBndGFi bGUuYyBiL2RyaXZlcnMvaW9tbXUvaW8tcGd0YWJsZS5jCj4+PiBpbmRleCA5NDM5NGM4Li4yYzZl YjJlIDEwMDY0NAo+Pj4gLS0tIGEvZHJpdmVycy9pb21tdS9pby1wZ3RhYmxlLmMKPj4+ICsrKyBi L2RyaXZlcnMvaW9tbXUvaW8tcGd0YWJsZS5jCj4+PiBAQCAtMTAsMzMgKzEwLDQ1IEBACj4+PiDC oCAjaW5jbHVkZSA8bGludXgvYnVnLmg+Cj4+PiDCoCAjaW5jbHVkZSA8bGludXgvaW8tcGd0YWJs ZS5oPgo+Pj4gwqAgI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgo+Pj4gKyNpbmNsdWRlIDxsaW51 eC9yd2xvY2suaD4KPj4+ICsjaW5jbHVkZSA8bGludXgvc2xhYi5oPgo+Pj4gwqAgI2luY2x1ZGUg PGxpbnV4L3R5cGVzLmg+Cj4+PiDCoCAtc3RhdGljIGNvbnN0IHN0cnVjdCBpb19wZ3RhYmxlX2lu aXRfZm5zICoKPj4+IC1pb19wZ3RhYmxlX2luaXRfdGFibGVbSU9fUEdUQUJMRV9OVU1fRk1UU10g PSB7Cj4+PiAtI2lmZGVmIENPTkZJR19JT01NVV9JT19QR1RBQkxFX0xQQUUKPj4+IC3CoMKgwqAg W0FSTV8zMl9MUEFFX1MxXSA9ICZpb19wZ3RhYmxlX2FybV8zMl9scGFlX3MxX2luaXRfZm5zLAo+ Pj4gLcKgwqDCoCBbQVJNXzMyX0xQQUVfUzJdID0gJmlvX3BndGFibGVfYXJtXzMyX2xwYWVfczJf aW5pdF9mbnMsCj4+PiAtwqDCoMKgIFtBUk1fNjRfTFBBRV9TMV0gPSAmaW9fcGd0YWJsZV9hcm1f NjRfbHBhZV9zMV9pbml0X2ZucywKPj4+IC3CoMKgwqAgW0FSTV82NF9MUEFFX1MyXSA9ICZpb19w Z3RhYmxlX2FybV82NF9scGFlX3MyX2luaXRfZm5zLAo+Pj4gLcKgwqDCoCBbQVJNX01BTElfTFBB RV0gPSAmaW9fcGd0YWJsZV9hcm1fbWFsaV9scGFlX2luaXRfZm5zLAo+Pj4gLSNlbmRpZgo+Pj4g LSNpZmRlZiBDT05GSUdfSU9NTVVfSU9fUEdUQUJMRV9BUk1WN1MKPj4+IC3CoMKgwqAgW0FSTV9W N1NdID0gJmlvX3BndGFibGVfYXJtX3Y3c19pbml0X2ZucywKPj4+IC0jZW5kaWYKPj4+ICtzdHJ1 Y3QgaW9fcGd0YWJsZV9pbml0X2Zuc19ub2RlIHsKPj4+ICvCoMKgwqAgc3RydWN0IGlvX3BndGFi bGVfaW5pdF9mbnMgKmZuczsKPj4+ICvCoMKgwqAgc3RydWN0IGxpc3RfaGVhZCBsaXN0Owo+Pj4g wqAgfTsKPj4+IMKgICtzdGF0aWMgTElTVF9IRUFEKGlvX3BndGFibGVfaW5pdF9mbnNfbGlzdCk7 Cj4+PiArc3RhdGljIERFRklORV9SV0xPQ0soaW9fcGd0YWJsZV9pbml0X2Zuc19saXN0X2xvY2sp Owo+Pj4gKwo+Pj4gK3N0YXRpYyBzdHJ1Y3QgaW9fcGd0YWJsZV9pbml0X2ZucyAqaW9fcGd0YWJs ZV9nZXRfaW5pdF9mbnMoZW51bSAKPj4+IGlvX3BndGFibGVfZm10IGZtdCkKPj4+ICt7Cj4+PiAr wqDCoMKgIHN0cnVjdCBpb19wZ3RhYmxlX2luaXRfZm5zX25vZGUgKml0ZXI7Cj4+PiArwqDCoMKg IHN0cnVjdCBpb19wZ3RhYmxlX2luaXRfZm5zICpmbnMgPSBOVUxMOwo+Pj4gKwo+Pj4gK8KgwqDC oCByZWFkX2xvY2soJmlvX3BndGFibGVfaW5pdF9mbnNfbGlzdF9sb2NrKTsKPj4+ICvCoMKgwqAg bGlzdF9mb3JfZWFjaF9lbnRyeShpdGVyLCAmaW9fcGd0YWJsZV9pbml0X2Zuc19saXN0LCBsaXN0 KQo+Pj4gK8KgwqDCoMKgwqDCoMKgIGlmIChpdGVyLT5mbnMtPmZtdCA9PSBmbXQpIHsKPj4+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIGZucyA9IGl0ZXItPmZuczsKPj4+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIGJyZWFrOwo+Pj4gK8KgwqDCoMKgwqDCoMKgIH0KPj4+ICvCoMKgwqAgcmVhZF91 bmxvY2soJmlvX3BndGFibGVfaW5pdF9mbnNfbGlzdF9sb2NrKTsKPj4+ICsKPj4+ICvCoMKgwqAg cmV0dXJuIGZuczsKPj4+ICt9Cj4+Cj4+IEkgdGhpbmsgaXQgd291bGQgYmUgYSBsb3QgZWFzaWVy IHRvIHN0aWNrIHdpdGggYSBzaW1wbGUgYXJyYXkgaW5kZXhlZAo+PiBieSBlbnVtIC0gdGhhdCB3 YXkgeW91IGNhbiBqdXN0IHNldC9jbGVhci90ZXN0IGVudHJpZXMgd2l0aG91dCBuZWVkaW5nCj4+ IHRvIHdvcnJ5IGFib3V0IGxvY2tpbmcuIEJhc2ljYWxseSBqdXN0IHJlbW92ZSB0aGUgY29uc3Qg YW5kIHRoZQo+PiBpbml0aWFsaXNlcnMgZnJvbSB0aGUgZXhpc3Rpbmcgb25lIDspCj4+Cj4+IChh bmQgaWYgeW91IHRoaW5rIHlvdSdyZSBjb25jZXJuZWQgYWJvdXQgbWVtb3J5LCBjb25zaWRlciB0 aGF0IGp1c3QKPj4gdGhlIGxpc3QgaGVhZCBwbHVzIGxvY2sgaXMgYWxyZWFkeSBoYWxmIHRoZSBz aXplIG9mIHRoZSB0YWJsZSkKPj4KPj4gT3RoZXIgdGhhbiB0aGF0LCBJIHRoaW5rIHRoaXMgYWxs IGxvb2tzIHByZXR0eSBwcm9taXNpbmcgLSBJJ2Qgc3VnZ2VzdAo+PiBzZW5kaW5nIGEgbm9uLVJG QyBhZnRlciByYzEgc28gdGhhdCBpdCBnZXRzIGV2ZXJ5b25lJ3MgcHJvcGVyCj4+IGF0dGVudGlv bi4KPj4KPj4gVGhhbmtzLAo+PiBSb2Jpbi4KPj4KPiAKPiBUaGFua3MgZm9yIGFsbCBvZiB0aGUg ZmVlZGJhY2shIFdpdGggcmVzcGVjdCB0byB0aGUgY29tbWVudCBhYm91dCAKPiBrZWVwaW5nIHRo ZSBjdXJyZW50IGFycmF5LAo+IGRvbid0IHdlIG5lZWQgc29tZSBzb3J0IG9mIGxvY2sgdG8gcHJv dGVjdCBhY2Nlc3MgdG8gdGhlIGRhdGEgc3RydWN0dXJlIAo+IChlLmcuIGNvbmN1cnJlbnQgYWNj ZXNzCj4gaWYgYWRkaW5nIHR3byBvcHMgZm9yIHRoZSBzYW1lIGZvcm1hdCk/IE9yIGRvIHlvdSBt ZWFuIHRoYXQgd2Ugc2hvdWxkIAo+IHVzZSBhdG9taWMgb3BlcmF0aW9ucyB0bwo+IGhhbmRsZSB0 aGlzIGNsZWFubHk/CgpJIGRvbid0IHRoaW5rIGFueSByYWNlcyBhcmUgcmVhbGlzdGljYWxseSBw b3NzaWJsZSAtIGJ1aWx0LWluIGluaXRjYWxscyAKc2hvdWxkIHJ1biBzZXF1ZW50aWFsbHksIHdo aWxlIG1vZHVsZSBpbml0IHNob3VsZCBiZSBzZXJpYWxpc2VkIGJ5IHRoZSAKbW9kdWxlIGxvYWRl ciBsb2NrLCBzbyByZWdpc3RyYXRpb25zIHNob3VsZCBuZXZlciBiZSBhYmxlIHRvIHJhY2UgCmFn YWluc3QgZWFjaCBvdGhlci4gQW5kIGlmIHRoZXJlIGNvdWxkIGJlIGEgcmFjZSBiZXR3ZWVuIHJl Z2lzdGVyaW5nIGEgCmZvcm1hdCBhbmQgc29tZWJvZHkgdHJ5aW5nIHRvIHVzZSBpdCwgdGhlbiBz b21ldGhpbmcncyBmdW5kYW1lbnRhbGx5IAp3cm9uZyBhbnl3YXkgLSBzdXJlIHdlIGNvdWxkIHVz ZSBSRUFEX09OQ0UvV1JJVEVfT05DRSBmb3IgYWNjZXNzaW5nIHRoZSAKdGFibGUsIGJ1dCB0aGF0 IHdvdWxkIGJlIGJhc2ljYWxseSBiZSBhZG1pdHRpbmcgdGhhdCB3ZSd2ZSBmYWlsZWQgYXQgdGhl IApwcmltYXJ5IHB1cnBvc2Ugb2YgbWFraW5nIHN1cmUgZm9ybWF0cyBhcmUgbG9hZGVkICpiZWZv cmUqIHRoZSB1c2VycyAKdGhhdCBkZXBlbmQgb24gdGhlbS4KCldpdGggYSBkaXJlY3RseS1pbmRl eGVkIHRhYmxlIHRoZXJlJ3Mgbm8gY29udGVudGlvbiBiZXR3ZWVuIGxvb2tpbmcgdXAgCm9uZSBm b3JtYXQgYW5kIHJlZ2lzdGVyaW5nIGFub3RoZXIgdW5yZWxhdGVkIGZvcm1hdCwgdW5saWtlIHdp dGggYSBsaXN0LgoKUm9iaW4uCgo+IAo+IFRoYW5rcywKPiBJc2FhYwo+Pj4gKwo+Pj4gwqAgc3Ry dWN0IGlvX3BndGFibGVfb3BzICphbGxvY19pb19wZ3RhYmxlX29wcyhlbnVtIGlvX3BndGFibGVf Zm10IGZtdCwKPj4+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIHN0cnVjdCBpb19wZ3RhYmxlX2NmZyAqY2ZnLAo+Pj4gwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdm9pZCAqY29va2llKQo+Pj4gwqAgewo+ Pj4gwqDCoMKgwqDCoCBzdHJ1Y3QgaW9fcGd0YWJsZSAqaW9wOwo+Pj4gLcKgwqDCoCBjb25zdCBz dHJ1Y3QgaW9fcGd0YWJsZV9pbml0X2ZucyAqZm5zOwo+Pj4gK8KgwqDCoCBzdHJ1Y3QgaW9fcGd0 YWJsZV9pbml0X2ZucyAqZm5zOwo+Pj4gwqDCoMKgwqDCoMKgwqAgaWYgKGZtdCA+PSBJT19QR1RB QkxFX05VTV9GTVRTKQo+Pj4gwqDCoMKgwqDCoMKgwqDCoMKgIHJldHVybiBOVUxMOwo+Pj4gwqAg LcKgwqDCoCBmbnMgPSBpb19wZ3RhYmxlX2luaXRfdGFibGVbZm10XTsKPj4+ICvCoMKgwqAgZm5z ID0gaW9fcGd0YWJsZV9nZXRfaW5pdF9mbnMoZm10KTsKPj4+IMKgwqDCoMKgwqAgaWYgKCFmbnMp Cj4+PiDCoMKgwqDCoMKgwqDCoMKgwqAgcmV0dXJuIE5VTEw7Cj4+PiDCoCBAQCAtNTksMTIgKzcx LDY0IEBAIEVYUE9SVF9TWU1CT0xfR1BMKGFsbG9jX2lvX3BndGFibGVfb3BzKTsKPj4+IMKgIHZv aWQgZnJlZV9pb19wZ3RhYmxlX29wcyhzdHJ1Y3QgaW9fcGd0YWJsZV9vcHMgKm9wcykKPj4+IMKg IHsKPj4+IMKgwqDCoMKgwqAgc3RydWN0IGlvX3BndGFibGUgKmlvcDsKPj4+ICvCoMKgwqAgc3Ry dWN0IGlvX3BndGFibGVfaW5pdF9mbnMgKmZuczsKPj4+IMKgwqDCoMKgwqDCoMKgIGlmICghb3Bz KQo+Pj4gwqDCoMKgwqDCoMKgwqDCoMKgIHJldHVybjsKPj4+IMKgwqDCoMKgwqDCoMKgIGlvcCA9 IGlvX3BndGFibGVfb3BzX3RvX3BndGFibGUob3BzKTsKPj4+IMKgwqDCoMKgwqAgaW9fcGd0YWJs ZV90bGJfZmx1c2hfYWxsKGlvcCk7Cj4+PiAtwqDCoMKgIGlvX3BndGFibGVfaW5pdF90YWJsZVtp b3AtPmZtdF0tPmZyZWUoaW9wKTsKPj4+ICvCoMKgwqAgZm5zID0gaW9fcGd0YWJsZV9nZXRfaW5p dF9mbnMoaW9wLT5mbXQpOwo+Pj4gK8KgwqDCoCBpZiAoZm5zKQo+Pj4gK8KgwqDCoMKgwqDCoMKg IGZucy0+ZnJlZShpb3ApOwo+Pj4gwqAgfQo+Pj4gwqAgRVhQT1JUX1NZTUJPTF9HUEwoZnJlZV9p b19wZ3RhYmxlX29wcyk7Cj4+PiArCj4+PiAraW50IGlvX3BndGFibGVfb3BzX3JlZ2lzdGVyKHN0 cnVjdCBpb19wZ3RhYmxlX2luaXRfZm5zICppbml0X2ZucykKPj4+ICt7Cj4+PiArwqDCoMKgIHN0 cnVjdCBpb19wZ3RhYmxlX2luaXRfZm5zX25vZGUgKml0ZXIsICpmbnNfbm9kZTsKPj4+ICvCoMKg wqAgaW50IHJldCA9IDA7Cj4+PiArCj4+PiArwqDCoMKgIGlmICghaW5pdF9mbnMgfHwgaW5pdF9m bnMtPmZtdCA+PSBJT19QR1RBQkxFX05VTV9GTVRTIHx8Cj4+PiArwqDCoMKgwqDCoMKgwqAgIWlu aXRfZm5zLT5hbGxvYyB8fCAhaW5pdF9mbnMtPmZyZWUpCj4+PiArwqDCoMKgwqDCoMKgwqAgcmV0 dXJuIC1FSU5WQUw7Cj4+PiArCj4+PiArwqDCoMKgIGZuc19ub2RlID0ga3phbGxvYyhzaXplb2Yo KmZuc19ub2RlKSwgR0ZQX0tFUk5FTCk7Cj4+PiArwqDCoMKgIGlmICghZm5zX25vZGUpCj4+PiAr wqDCoMKgwqDCoMKgwqAgcmV0dXJuIC1FTk9NRU07Cj4+PiArCj4+PiArwqDCoMKgIHdyaXRlX2xv Y2soJmlvX3BndGFibGVfaW5pdF9mbnNfbGlzdF9sb2NrKTsKPj4+ICvCoMKgwqAgbGlzdF9mb3Jf ZWFjaF9lbnRyeShpdGVyLCAmaW9fcGd0YWJsZV9pbml0X2Zuc19saXN0LCBsaXN0KQo+Pj4gK8Kg wqDCoMKgwqDCoMKgIGlmIChpdGVyLT5mbnMtPmZtdCA9PSBpbml0X2Zucy0+Zm10KSB7Cj4+PiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXQgPSAtRUVYSVNUOwo+Pj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqAga2ZyZWUoZm5zX25vZGUpOwo+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgYnJl YWs7Cj4+PiArwqDCoMKgwqDCoMKgwqAgfQo+Pj4gKwo+Pj4gK8KgwqDCoCBpZiAoIXJldCkgewo+ Pj4gK8KgwqDCoMKgwqDCoMKgIGZuc19ub2RlLT5mbnMgPSBpbml0X2ZuczsKPj4+ICvCoMKgwqDC oMKgwqDCoCBJTklUX0xJU1RfSEVBRCgmZm5zX25vZGUtPmxpc3QpOwo+Pj4gK8KgwqDCoMKgwqDC oMKgIGxpc3RfYWRkX3RhaWwoJmZuc19ub2RlLT5saXN0LCAmaW9fcGd0YWJsZV9pbml0X2Zuc19s aXN0KTsKPj4+ICvCoMKgwqAgfQo+Pj4gK8KgwqDCoCB3cml0ZV91bmxvY2soJmlvX3BndGFibGVf aW5pdF9mbnNfbGlzdF9sb2NrKTsKPj4+ICvCoMKgwqAgcmV0dXJuIHJldDsKPj4+ICt9Cj4+PiAr RVhQT1JUX1NZTUJPTF9HUEwoaW9fcGd0YWJsZV9vcHNfcmVnaXN0ZXIpOwo+Pj4gKwo+Pj4gK3Zv aWQgaW9fcGd0YWJsZV9vcHNfdW5yZWdpc3RlcihzdHJ1Y3QgaW9fcGd0YWJsZV9pbml0X2ZucyAq aW5pdF9mbnMpCj4+PiArewo+Pj4gK8KgwqDCoCBzdHJ1Y3QgaW9fcGd0YWJsZV9pbml0X2Zuc19u b2RlICppdGVyLCAqdG1wOwo+Pj4gKwo+Pj4gK8KgwqDCoCBpZiAoIWluaXRfZm5zKQo+Pj4gK8Kg wqDCoMKgwqDCoMKgIHJldHVybjsKPj4+ICsKPj4+ICvCoMKgwqAgd3JpdGVfbG9jaygmaW9fcGd0 YWJsZV9pbml0X2Zuc19saXN0X2xvY2spOwo+Pj4gK8KgwqDCoCBsaXN0X2Zvcl9lYWNoX2VudHJ5 X3NhZmUoaXRlciwgdG1wLCAmaW9fcGd0YWJsZV9pbml0X2Zuc19saXN0LCAKPj4+IGxpc3QpCj4+ PiArwqDCoMKgwqDCoMKgwqAgaWYgKGl0ZXItPmZucyA9PSBpbml0X2Zucykgewo+Pj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqAgbGlzdF9kZWwoJml0ZXItPmxpc3QpOwo+Pj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqAga2ZyZWUoaXRlcik7Cj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBicmVh azsKPj4+ICvCoMKgwqDCoMKgwqDCoCB9Cj4+PiArwqDCoMKgIHdyaXRlX3VubG9jaygmaW9fcGd0 YWJsZV9pbml0X2Zuc19saXN0X2xvY2spOwo+Pj4gK30KPj4+ICtFWFBPUlRfU1lNQk9MX0dQTChp b19wZ3RhYmxlX29wc191bnJlZ2lzdGVyKTsKPj4+IGRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4 L2lvLXBndGFibGUuaCBiL2luY2x1ZGUvbGludXgvaW8tcGd0YWJsZS5oCj4+PiBpbmRleCBlYTcy N2ViLi40NWIzNjdjZSAxMDA2NDQKPj4+IC0tLSBhL2luY2x1ZGUvbGludXgvaW8tcGd0YWJsZS5o Cj4+PiArKysgYi9pbmNsdWRlL2xpbnV4L2lvLXBndGFibGUuaAo+Pj4gQEAgLTE2Myw2ICsxNjMs MzggQEAgc3RydWN0IGlvX3BndGFibGVfb3BzIHsKPj4+IMKgIH07Cj4+PiDCoMKgwqAgLyoqCj4+ PiArICogc3RydWN0IGlvX3BndGFibGVfaW5pdF9mbnMgLSBBbGxvYy9mcmVlIGEgc2V0IG9mIHBh Z2UgdGFibGVzIGZvciBhCj4+PiArICrCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHBhcnRpY3VsYXIgZm9ybWF0Lgo+Pj4gKyAqCj4+PiAr ICogQGZtdDrCoMKgIFRoZSBwYWdlIHRhYmxlIGZvcm1hdC4KPj4+ICsgKiBAYWxsb2M6IEFsbG9j YXRlIGEgc2V0IG9mIHBhZ2UgdGFibGVzIGRlc2NyaWJlZCBieSBjZmcuCj4+PiArICogQGZyZWU6 wqAgRnJlZSB0aGUgcGFnZSB0YWJsZXMgYXNzb2NpYXRlZCB3aXRoIGlvcC4KPj4+ICsgKi8KPj4+ ICtzdHJ1Y3QgaW9fcGd0YWJsZV9pbml0X2ZucyB7Cj4+PiArwqDCoMKgIGVudW0gaW9fcGd0YWJs ZV9mbXQgZm10Owo+Pj4gK8KgwqDCoCBzdHJ1Y3QgaW9fcGd0YWJsZSAqKCphbGxvYykoc3RydWN0 IGlvX3BndGFibGVfY2ZnICpjZmcsIHZvaWQgCj4+PiAqY29va2llKTsKPj4+ICvCoMKgwqAgdm9p ZCAoKmZyZWUpKHN0cnVjdCBpb19wZ3RhYmxlICppb3ApOwo+Pj4gK307Cj4+PiArCj4+PiArLyoq Cj4+PiArICogaW9fcGd0YWJsZV9vcHNfcmVnaXN0ZXIoKSAtIFJlZ2lzdGVyIHRoZSBwYWdlIHRh YmxlIHJvdXRpbmVzIGZvciAKPj4+IGEgcGFnZSB0YWJsZQo+Pj4gKyAqwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZm9ybWF0Lgo+Pj4gKyAq Cj4+PiArICogQGluaXRfZm5zOiBUaGUgZnVuY3Rpb25zIGZvciBhbGxvY2F0aW5nIGFuZCBmcmVl aW5nIHRoZSBwYWdlIAo+Pj4gdGFibGVzIG9mCj4+PiArICrCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IGEgcGFydGljdWxhciBmb3JtYXQuCj4+PiArICovCj4+PiAraW50IGlvX3BndGFibGVfb3BzX3Jl Z2lzdGVyKHN0cnVjdCBpb19wZ3RhYmxlX2luaXRfZm5zICppbml0X2Zucyk7Cj4+PiArCj4+PiAr LyoqCj4+PiArICogaW9fcGd0YWJsZV9vcHNfdW5yZWdpc3RlcigpIC0gVW5yZWdpc3RlciB0aGUg cGFnZSB0YWJsZSByb3V0aW5lcyAKPj4+IGZvciBhIHBhZ2UKPj4+ICsgKsKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB0YWJsZSBmb3Jt YXQuCj4+PiArICoKPj4+ICsgKiBAaW5pdF9mbnM6IFRoZSBmdW5jdGlvbnMgZm9yIGFsbG9jYXRp bmcgYW5kIGZyZWVpbmcgdGhlIHBhZ2UgCj4+PiB0YWJsZXMgb2YKPj4+ICsgKsKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgYSBwYXJ0aWN1bGFyIGZvcm1hdC4KPj4+ICsgKi8KPj4+ICt2b2lkIGlvX3Bn dGFibGVfb3BzX3VucmVnaXN0ZXIoc3RydWN0IGlvX3BndGFibGVfaW5pdF9mbnMgKmluaXRfZm5z KTsKPj4+ICsKPj4+ICsvKioKPj4+IMKgwqAgKiBhbGxvY19pb19wZ3RhYmxlX29wcygpIC0gQWxs b2NhdGUgYSBwYWdlIHRhYmxlIGFsbG9jYXRvciBmb3IgdXNlIAo+Pj4gYnkgYW4gSU9NTVUuCj4+ PiDCoMKgICoKPj4+IMKgwqAgKiBAZm10OsKgwqDCoCBUaGUgcGFnZSB0YWJsZSBmb3JtYXQuCj4+ PiBAQCAtMjMzLDIzICsyNjUsNCBAQCBpb19wZ3RhYmxlX3RsYl9hZGRfcGFnZShzdHJ1Y3QgaW9f cGd0YWJsZSAqaW9wLAo+Pj4gwqDCoMKgwqDCoMKgwqDCoMKgIGlvcC0+Y2ZnLnRsYi0+dGxiX2Fk ZF9wYWdlKGdhdGhlciwgaW92YSwgZ3JhbnVsZSwgCj4+PiBpb3AtPmNvb2tpZSk7Cj4+PiDCoCB9 Cj4+PiDCoCAtLyoqCj4+PiAtICogc3RydWN0IGlvX3BndGFibGVfaW5pdF9mbnMgLSBBbGxvYy9m cmVlIGEgc2V0IG9mIHBhZ2UgdGFibGVzIGZvciBhCj4+PiAtICrCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHBhcnRpY3VsYXIgZm9ybWF0 Lgo+Pj4gLSAqCj4+PiAtICogQGFsbG9jOiBBbGxvY2F0ZSBhIHNldCBvZiBwYWdlIHRhYmxlcyBk ZXNjcmliZWQgYnkgY2ZnLgo+Pj4gLSAqIEBmcmVlOsKgIEZyZWUgdGhlIHBhZ2UgdGFibGVzIGFz c29jaWF0ZWQgd2l0aCBpb3AuCj4+PiAtICovCj4+PiAtc3RydWN0IGlvX3BndGFibGVfaW5pdF9m bnMgewo+Pj4gLcKgwqDCoCBzdHJ1Y3QgaW9fcGd0YWJsZSAqKCphbGxvYykoc3RydWN0IGlvX3Bn dGFibGVfY2ZnICpjZmcsIHZvaWQgCj4+PiAqY29va2llKTsKPj4+IC3CoMKgwqAgdm9pZCAoKmZy ZWUpKHN0cnVjdCBpb19wZ3RhYmxlICppb3ApOwo+Pj4gLX07Cj4+PiAtCj4+PiAtZXh0ZXJuIHN0 cnVjdCBpb19wZ3RhYmxlX2luaXRfZm5zIGlvX3BndGFibGVfYXJtXzMyX2xwYWVfczFfaW5pdF9m bnM7Cj4+PiAtZXh0ZXJuIHN0cnVjdCBpb19wZ3RhYmxlX2luaXRfZm5zIGlvX3BndGFibGVfYXJt XzMyX2xwYWVfczJfaW5pdF9mbnM7Cj4+PiAtZXh0ZXJuIHN0cnVjdCBpb19wZ3RhYmxlX2luaXRf Zm5zIGlvX3BndGFibGVfYXJtXzY0X2xwYWVfczFfaW5pdF9mbnM7Cj4+PiAtZXh0ZXJuIHN0cnVj dCBpb19wZ3RhYmxlX2luaXRfZm5zIGlvX3BndGFibGVfYXJtXzY0X2xwYWVfczJfaW5pdF9mbnM7 Cj4+PiAtZXh0ZXJuIHN0cnVjdCBpb19wZ3RhYmxlX2luaXRfZm5zIGlvX3BndGFibGVfYXJtX3Y3 c19pbml0X2ZuczsKPj4+IC1leHRlcm4gc3RydWN0IGlvX3BndGFibGVfaW5pdF9mbnMgaW9fcGd0 YWJsZV9hcm1fbWFsaV9scGFlX2luaXRfZm5zOwo+Pj4gLQo+Pj4gwqAgI2VuZGlmIC8qIF9fSU9f UEdUQUJMRV9IICovCj4+Pgo+Pgo+PiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fXwo+PiBsaW51eC1hcm0ta2VybmVsIG1haWxpbmcgbGlzdAo+PiBsaW51eC1h cm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcKPj4gaHR0cDovL2xpc3RzLmluZnJhZGVhZC5v cmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1hcm0ta2VybmVsCj4gX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX18KPiBpb21tdSBtYWlsaW5nIGxpc3QKPiBpb21t dUBsaXN0cy5saW51eC1mb3VuZGF0aW9uLm9yZwo+IGh0dHBzOi8vbGlzdHMubGludXhmb3VuZGF0 aW9uLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2lvbW11CgpfX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fXwpsaW51eC1hcm0ta2VybmVsIG1haWxpbmcgbGlzdApsaW51 eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5v cmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1hcm0ta2VybmVsCg==