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=-16.7 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT 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 EFDBBC47076 for ; Fri, 21 May 2021 15:33:23 +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 BAB1E613D6 for ; Fri, 21 May 2021 15:33:23 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org BAB1E613D6 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=linux.intel.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 0277689D2E; Fri, 21 May 2021 15:33:19 +0000 (UTC) Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by gabe.freedesktop.org (Postfix) with ESMTPS id BFDD96EC56; Fri, 21 May 2021 15:33:14 +0000 (UTC) IronPort-SDR: QhhrZq/yxc7NjfpugSUVdTRjRf8oL8X+z9HFINuMlhgxAxRgW7QwmPqzWdss5eYgz/k8/Lx657 DnAa/2NFqIjQ== X-IronPort-AV: E=McAfee;i="6200,9189,9990"; a="265415704" X-IronPort-AV: E=Sophos;i="5.82,319,1613462400"; d="scan'208";a="265415704" Received: from fmsmga008.fm.intel.com ([10.253.24.58]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 21 May 2021 08:33:14 -0700 IronPort-SDR: kOIZYZ8aUE26ZiopgFSm0pto7felqxDcrzYSH1ZszazQVNjkwiMJ/zu+ZkRJmDFSt9zTf32bB4 Cbr8R1BbSlfw== X-IronPort-AV: E=Sophos;i="5.82,319,1613462400"; d="scan'208";a="441125399" Received: from imarinmo-mobl1.ger.corp.intel.com (HELO thellst-mobl1.intel.com) ([10.249.254.34]) by fmsmga008-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 21 May 2021 08:33:12 -0700 From: =?UTF-8?q?Thomas=20Hellstr=C3=B6m?= To: intel-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org Subject: [PATCH v3 04/12] drm/i915/ttm Initialize the ttm device and memory managers Date: Fri, 21 May 2021 17:32:45 +0200 Message-Id: <20210521153253.518037-5-thomas.hellstrom@linux.intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210521153253.518037-1-thomas.hellstrom@linux.intel.com> References: <20210521153253.518037-1-thomas.hellstrom@linux.intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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: =?UTF-8?q?Thomas=20Hellstr=C3=B6m?= , Matthew Auld Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" Temporarily remove the buddy allocator and related selftests and hook up the TTM range manager for i915 regions. Also modify the mock region selftests somewhat to account for a fragmenting manager. Signed-off-by: Thomas Hellström Reviewed-by: Matthew Auld #v2 --- v2: - Fix an error unwind in lmem_get_pages() (Reported by Matthew Auld) - Break out and modify usage of i915_sg_dma_sizes() (Reported by Mattew Auld) - Break out TTM changes to a separate patch (Reported by Christian König) v3: - Fix the same error unwind in mock_region_get_pages() (Reported by Matthew Auld) - Don't rely on new TTM functionality, but create a mock TTM device, (Reported by Christian König) --- drivers/gpu/drm/i915/Kconfig | 1 + drivers/gpu/drm/i915/Makefile | 2 +- drivers/gpu/drm/i915/gem/i915_gem_lmem.c | 59 +- .../gpu/drm/i915/gem/i915_gem_object_types.h | 6 +- drivers/gpu/drm/i915/gem/i915_gem_pages.c | 3 +- drivers/gpu/drm/i915/gem/i915_gem_region.c | 120 --- drivers/gpu/drm/i915/gem/i915_gem_region.h | 4 - drivers/gpu/drm/i915/gem/i915_gem_shmem.c | 4 +- drivers/gpu/drm/i915/gem/i915_gem_stolen.c | 10 +- drivers/gpu/drm/i915/gem/i915_gem_stolen.h | 9 +- drivers/gpu/drm/i915/gt/intel_gt.c | 2 - drivers/gpu/drm/i915/gt/intel_region_lmem.c | 27 +- drivers/gpu/drm/i915/i915_buddy.c | 435 ---------- drivers/gpu/drm/i915/i915_buddy.h | 131 --- drivers/gpu/drm/i915/i915_drv.c | 8 + drivers/gpu/drm/i915/i915_drv.h | 7 +- drivers/gpu/drm/i915/i915_gem.c | 1 + drivers/gpu/drm/i915/i915_globals.c | 1 - drivers/gpu/drm/i915/i915_globals.h | 1 - drivers/gpu/drm/i915/i915_scatterlist.c | 70 ++ drivers/gpu/drm/i915/i915_scatterlist.h | 4 + drivers/gpu/drm/i915/intel_memory_region.c | 180 ++-- drivers/gpu/drm/i915/intel_memory_region.h | 44 +- drivers/gpu/drm/i915/intel_region_ttm.c | 334 ++++++++ drivers/gpu/drm/i915/intel_region_ttm.h | 38 + drivers/gpu/drm/i915/selftests/i915_buddy.c | 789 ------------------ .../drm/i915/selftests/i915_mock_selftests.h | 1 - .../drm/i915/selftests/intel_memory_region.c | 133 +-- drivers/gpu/drm/i915/selftests/mock_region.c | 52 +- 29 files changed, 722 insertions(+), 1754 deletions(-) delete mode 100644 drivers/gpu/drm/i915/i915_buddy.c delete mode 100644 drivers/gpu/drm/i915/i915_buddy.h create mode 100644 drivers/gpu/drm/i915/intel_region_ttm.c create mode 100644 drivers/gpu/drm/i915/intel_region_ttm.h delete mode 100644 drivers/gpu/drm/i915/selftests/i915_buddy.c diff --git a/drivers/gpu/drm/i915/Kconfig b/drivers/gpu/drm/i915/Kconfig index 1e1cb245fca7..b63d374dff23 100644 --- a/drivers/gpu/drm/i915/Kconfig +++ b/drivers/gpu/drm/i915/Kconfig @@ -26,6 +26,7 @@ config DRM_I915 select SND_HDA_I915 if SND_HDA_CORE select CEC_CORE if CEC_NOTIFIER select VMAP_PFN + select DRM_TTM help Choose this option if you have a system that has "Intel Graphics Media Accelerator" or "HD Graphics" integrated graphics, diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile index d0d936d9137b..cb8823570996 100644 --- a/drivers/gpu/drm/i915/Makefile +++ b/drivers/gpu/drm/i915/Makefile @@ -50,6 +50,7 @@ i915-y += i915_drv.o \ intel_memory_region.o \ intel_pch.o \ intel_pm.o \ + intel_region_ttm.o \ intel_runtime_pm.o \ intel_sideband.o \ intel_step.o \ @@ -160,7 +161,6 @@ gem-y += \ i915-y += \ $(gem-y) \ i915_active.o \ - i915_buddy.o \ i915_cmd_parser.o \ i915_gem_evict.o \ i915_gem_gtt.o \ diff --git a/drivers/gpu/drm/i915/gem/i915_gem_lmem.c b/drivers/gpu/drm/i915/gem/i915_gem_lmem.c index f44bdd08f7cb..3b4aa28a076d 100644 --- a/drivers/gpu/drm/i915/gem/i915_gem_lmem.c +++ b/drivers/gpu/drm/i915/gem/i915_gem_lmem.c @@ -4,16 +4,71 @@ */ #include "intel_memory_region.h" +#include "intel_region_ttm.h" #include "gem/i915_gem_region.h" #include "gem/i915_gem_lmem.h" #include "i915_drv.h" +static void lmem_put_pages(struct drm_i915_gem_object *obj, + struct sg_table *pages) +{ + intel_region_ttm_node_free(obj->mm.region, obj->mm.st_mm_node); + obj->mm.dirty = false; + sg_free_table(pages); + kfree(pages); +} + +static int lmem_get_pages(struct drm_i915_gem_object *obj) +{ + unsigned int flags; + struct sg_table *pages; + + flags = I915_ALLOC_MIN_PAGE_SIZE; + if (obj->flags & I915_BO_ALLOC_CONTIGUOUS) + flags |= I915_ALLOC_CONTIGUOUS; + + obj->mm.st_mm_node = intel_region_ttm_node_alloc(obj->mm.region, + obj->base.size, + flags); + if (IS_ERR(obj->mm.st_mm_node)) + return PTR_ERR(obj->mm.st_mm_node); + + /* Range manager is always contigous */ + if (obj->mm.region->is_range_manager) + obj->flags |= I915_BO_ALLOC_CONTIGUOUS; + pages = intel_region_ttm_node_to_st(obj->mm.region, obj->mm.st_mm_node); + if (IS_ERR(pages)) { + intel_region_ttm_node_free(obj->mm.region, obj->mm.st_mm_node); + return PTR_ERR(pages); + } + + __i915_gem_object_set_pages(obj, pages, i915_sg_dma_sizes(pages->sgl)); + + if (obj->flags & I915_BO_ALLOC_CPU_CLEAR) { + void __iomem *vaddr = + i915_gem_object_lmem_io_map(obj, 0, obj->base.size); + + if (!vaddr) { + struct sg_table *pages = + __i915_gem_object_unset_pages(obj); + + if (!IS_ERR_OR_NULL(pages)) + lmem_put_pages(obj, pages); + } + + memset_io(vaddr, 0, obj->base.size); + io_mapping_unmap(vaddr); + } + + return 0; +} + const struct drm_i915_gem_object_ops i915_gem_lmem_obj_ops = { .name = "i915_gem_object_lmem", .flags = I915_GEM_OBJECT_HAS_IOMEM, - .get_pages = i915_gem_object_get_pages_buddy, - .put_pages = i915_gem_object_put_pages_buddy, + .get_pages = lmem_get_pages, + .put_pages = lmem_put_pages, .release = i915_gem_object_release_memory_region, }; diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object_types.h b/drivers/gpu/drm/i915/gem/i915_gem_object_types.h index 0415f99b6b95..f5b46d11e6e6 100644 --- a/drivers/gpu/drm/i915/gem/i915_gem_object_types.h +++ b/drivers/gpu/drm/i915/gem/i915_gem_object_types.h @@ -235,10 +235,12 @@ struct drm_i915_gem_object { * Memory region for this object. */ struct intel_memory_region *region; + /** - * List of memory region blocks allocated for this object. + * Memory manager node allocated for this object. */ - struct list_head blocks; + void *st_mm_node; + /** * Element within memory_region->objects or region->purgeable * if the object is marked as DONTNEED. Access is protected by diff --git a/drivers/gpu/drm/i915/gem/i915_gem_pages.c b/drivers/gpu/drm/i915/gem/i915_gem_pages.c index aed8a37ccdc9..62ee2185a41b 100644 --- a/drivers/gpu/drm/i915/gem/i915_gem_pages.c +++ b/drivers/gpu/drm/i915/gem/i915_gem_pages.c @@ -473,7 +473,8 @@ __i915_gem_object_get_sg(struct drm_i915_gem_object *obj, might_sleep(); GEM_BUG_ON(n >= obj->base.size >> PAGE_SHIFT); - GEM_BUG_ON(!i915_gem_object_has_pinned_pages(obj)); + if (!i915_gem_object_has_pinned_pages(obj)) + assert_object_held(obj); /* As we iterate forward through the sg, we record each entry in a * radixtree for quick repeated (backwards) lookups. If we have seen diff --git a/drivers/gpu/drm/i915/gem/i915_gem_region.c b/drivers/gpu/drm/i915/gem/i915_gem_region.c index ce8fcfc54079..f25e6646c5b7 100644 --- a/drivers/gpu/drm/i915/gem/i915_gem_region.c +++ b/drivers/gpu/drm/i915/gem/i915_gem_region.c @@ -8,129 +8,9 @@ #include "i915_drv.h" #include "i915_trace.h" -void -i915_gem_object_put_pages_buddy(struct drm_i915_gem_object *obj, - struct sg_table *pages) -{ - __intel_memory_region_put_pages_buddy(obj->mm.region, &obj->mm.blocks); - - obj->mm.dirty = false; - sg_free_table(pages); - kfree(pages); -} - -int -i915_gem_object_get_pages_buddy(struct drm_i915_gem_object *obj) -{ - const u64 max_segment = i915_sg_segment_size(); - struct intel_memory_region *mem = obj->mm.region; - struct list_head *blocks = &obj->mm.blocks; - resource_size_t size = obj->base.size; - resource_size_t prev_end; - struct i915_buddy_block *block; - unsigned int flags; - struct sg_table *st; - struct scatterlist *sg; - unsigned int sg_page_sizes; - int ret; - - st = kmalloc(sizeof(*st), GFP_KERNEL); - if (!st) - return -ENOMEM; - - if (sg_alloc_table(st, size >> PAGE_SHIFT, GFP_KERNEL)) { - kfree(st); - return -ENOMEM; - } - - flags = I915_ALLOC_MIN_PAGE_SIZE; - if (obj->flags & I915_BO_ALLOC_CONTIGUOUS) - flags |= I915_ALLOC_CONTIGUOUS; - - ret = __intel_memory_region_get_pages_buddy(mem, size, flags, blocks); - if (ret) - goto err_free_sg; - - GEM_BUG_ON(list_empty(blocks)); - - sg = st->sgl; - st->nents = 0; - sg_page_sizes = 0; - prev_end = (resource_size_t)-1; - - list_for_each_entry(block, blocks, link) { - u64 block_size, offset; - - block_size = min_t(u64, size, - i915_buddy_block_size(&mem->mm, block)); - offset = i915_buddy_block_offset(block); - - while (block_size) { - u64 len; - - if (offset != prev_end || sg->length >= max_segment) { - if (st->nents) { - sg_page_sizes |= sg->length; - sg = __sg_next(sg); - } - - sg_dma_address(sg) = mem->region.start + offset; - sg_dma_len(sg) = 0; - sg->length = 0; - st->nents++; - } - - len = min(block_size, max_segment - sg->length); - sg->length += len; - sg_dma_len(sg) += len; - - offset += len; - block_size -= len; - - prev_end = offset; - } - } - - sg_page_sizes |= sg->length; - sg_mark_end(sg); - i915_sg_trim(st); - - /* Intended for kernel internal use only */ - if (obj->flags & I915_BO_ALLOC_CPU_CLEAR) { - struct scatterlist *sg; - unsigned long i; - - for_each_sg(st->sgl, sg, st->nents, i) { - unsigned int length; - void __iomem *vaddr; - dma_addr_t daddr; - - daddr = sg_dma_address(sg); - daddr -= mem->region.start; - length = sg_dma_len(sg); - - vaddr = io_mapping_map_wc(&mem->iomap, daddr, length); - memset64((void __force *)vaddr, 0, length / sizeof(u64)); - io_mapping_unmap(vaddr); - } - - wmb(); - } - - __i915_gem_object_set_pages(obj, st, sg_page_sizes); - - return 0; - -err_free_sg: - sg_free_table(st); - kfree(st); - return ret; -} - void i915_gem_object_init_memory_region(struct drm_i915_gem_object *obj, struct intel_memory_region *mem) { - INIT_LIST_HEAD(&obj->mm.blocks); obj->mm.region = intel_memory_region_get(mem); if (obj->base.size <= mem->min_page_size) diff --git a/drivers/gpu/drm/i915/gem/i915_gem_region.h b/drivers/gpu/drm/i915/gem/i915_gem_region.h index ebddc86d78f7..84fcb3297400 100644 --- a/drivers/gpu/drm/i915/gem/i915_gem_region.h +++ b/drivers/gpu/drm/i915/gem/i915_gem_region.h @@ -12,10 +12,6 @@ struct intel_memory_region; struct drm_i915_gem_object; struct sg_table; -int i915_gem_object_get_pages_buddy(struct drm_i915_gem_object *obj); -void i915_gem_object_put_pages_buddy(struct drm_i915_gem_object *obj, - struct sg_table *pages); - void i915_gem_object_init_memory_region(struct drm_i915_gem_object *obj, struct intel_memory_region *mem); void i915_gem_object_release_memory_region(struct drm_i915_gem_object *obj); diff --git a/drivers/gpu/drm/i915/gem/i915_gem_shmem.c b/drivers/gpu/drm/i915/gem/i915_gem_shmem.c index a9bfa66c8da1..5d16c4462fda 100644 --- a/drivers/gpu/drm/i915/gem/i915_gem_shmem.c +++ b/drivers/gpu/drm/i915/gem/i915_gem_shmem.c @@ -628,11 +628,13 @@ static const struct intel_memory_region_ops shmem_region_ops = { .init_object = shmem_object_init, }; -struct intel_memory_region *i915_gem_shmem_setup(struct drm_i915_private *i915) +struct intel_memory_region *i915_gem_shmem_setup(struct drm_i915_private *i915, + u16 type, u16 instance) { return intel_memory_region_create(i915, 0, totalram_pages() << PAGE_SHIFT, PAGE_SIZE, 0, + type, instance, &shmem_region_ops); } diff --git a/drivers/gpu/drm/i915/gem/i915_gem_stolen.c b/drivers/gpu/drm/i915/gem/i915_gem_stolen.c index 293f640faa0a..c42abee206da 100644 --- a/drivers/gpu/drm/i915/gem/i915_gem_stolen.c +++ b/drivers/gpu/drm/i915/gem/i915_gem_stolen.c @@ -770,7 +770,8 @@ static const struct intel_memory_region_ops i915_region_stolen_lmem_ops = { }; struct intel_memory_region * -i915_gem_stolen_lmem_setup(struct drm_i915_private *i915) +i915_gem_stolen_lmem_setup(struct drm_i915_private *i915, u16 type, + u16 instance) { struct intel_uncore *uncore = &i915->uncore; struct pci_dev *pdev = to_pci_dev(i915->drm.dev); @@ -788,6 +789,7 @@ i915_gem_stolen_lmem_setup(struct drm_i915_private *i915) mem = intel_memory_region_create(i915, lmem_base, lmem_size, I915_GTT_PAGE_SIZE_4K, io_start, + type, instance, &i915_region_stolen_lmem_ops); if (IS_ERR(mem)) return mem; @@ -809,14 +811,15 @@ i915_gem_stolen_lmem_setup(struct drm_i915_private *i915) } struct intel_memory_region* -i915_gem_stolen_smem_setup(struct drm_i915_private *i915) +i915_gem_stolen_smem_setup(struct drm_i915_private *i915, u16 type, + u16 instance) { struct intel_memory_region *mem; mem = intel_memory_region_create(i915, intel_graphics_stolen_res.start, resource_size(&intel_graphics_stolen_res), - PAGE_SIZE, 0, + PAGE_SIZE, 0, type, instance, &i915_region_stolen_smem_ops); if (IS_ERR(mem)) return mem; @@ -824,7 +827,6 @@ i915_gem_stolen_smem_setup(struct drm_i915_private *i915) intel_memory_region_set_name(mem, "stolen-system"); mem->private = true; - return mem; } diff --git a/drivers/gpu/drm/i915/gem/i915_gem_stolen.h b/drivers/gpu/drm/i915/gem/i915_gem_stolen.h index 2bec6c367b9c..ccdf7befc571 100644 --- a/drivers/gpu/drm/i915/gem/i915_gem_stolen.h +++ b/drivers/gpu/drm/i915/gem/i915_gem_stolen.h @@ -21,8 +21,13 @@ int i915_gem_stolen_insert_node_in_range(struct drm_i915_private *dev_priv, u64 end); void i915_gem_stolen_remove_node(struct drm_i915_private *dev_priv, struct drm_mm_node *node); -struct intel_memory_region *i915_gem_stolen_smem_setup(struct drm_i915_private *i915); -struct intel_memory_region *i915_gem_stolen_lmem_setup(struct drm_i915_private *i915); +struct intel_memory_region * +i915_gem_stolen_smem_setup(struct drm_i915_private *i915, u16 type, + u16 instance); +struct intel_memory_region * +i915_gem_stolen_lmem_setup(struct drm_i915_private *i915, u16 type, + u16 instance); + struct drm_i915_gem_object * i915_gem_object_create_stolen(struct drm_i915_private *dev_priv, resource_size_t size); diff --git a/drivers/gpu/drm/i915/gt/intel_gt.c b/drivers/gpu/drm/i915/gt/intel_gt.c index 8d77dcbad059..3f88ecdee031 100644 --- a/drivers/gpu/drm/i915/gt/intel_gt.c +++ b/drivers/gpu/drm/i915/gt/intel_gt.c @@ -68,8 +68,6 @@ int intel_gt_probe_lmem(struct intel_gt *gt) id = INTEL_REGION_LMEM; mem->id = id; - mem->type = INTEL_MEMORY_LOCAL; - mem->instance = 0; intel_memory_region_set_name(mem, "local%u", mem->instance); diff --git a/drivers/gpu/drm/i915/gt/intel_region_lmem.c b/drivers/gpu/drm/i915/gt/intel_region_lmem.c index 73fceb0c25fc..f7366b054f8e 100644 --- a/drivers/gpu/drm/i915/gt/intel_region_lmem.c +++ b/drivers/gpu/drm/i915/gt/intel_region_lmem.c @@ -5,6 +5,8 @@ #include "i915_drv.h" #include "intel_memory_region.h" +#include "intel_region_lmem.h" +#include "intel_region_ttm.h" #include "gem/i915_gem_lmem.h" #include "gem/i915_gem_region.h" #include "intel_region_lmem.h" @@ -66,9 +68,9 @@ static void release_fake_lmem_bar(struct intel_memory_region *mem) static void region_lmem_release(struct intel_memory_region *mem) { - release_fake_lmem_bar(mem); + intel_region_ttm_fini(mem); io_mapping_fini(&mem->iomap); - intel_memory_region_release_buddy(mem); + release_fake_lmem_bar(mem); } static int @@ -83,12 +85,21 @@ region_lmem_init(struct intel_memory_region *mem) if (!io_mapping_init_wc(&mem->iomap, mem->io_start, - resource_size(&mem->region))) - return -EIO; + resource_size(&mem->region))) { + ret = -EIO; + goto out_no_io; + } - ret = intel_memory_region_init_buddy(mem); + ret = intel_region_ttm_init(mem); if (ret) - io_mapping_fini(&mem->iomap); + goto out_no_buddy; + + return 0; + +out_no_buddy: + io_mapping_fini(&mem->iomap); +out_no_io: + release_fake_lmem_bar(mem); return ret; } @@ -127,6 +138,8 @@ intel_gt_setup_fake_lmem(struct intel_gt *gt) mappable_end, PAGE_SIZE, io_start, + INTEL_MEMORY_LOCAL, + 0, &intel_region_lmem_ops); if (!IS_ERR(mem)) { drm_info(&i915->drm, "Intel graphics fake LMEM: %pR\n", @@ -198,6 +211,8 @@ static struct intel_memory_region *setup_lmem(struct intel_gt *gt) lmem_size, I915_GTT_PAGE_SIZE_4K, io_start, + INTEL_MEMORY_LOCAL, + 0, &intel_region_lmem_ops); if (IS_ERR(mem)) return mem; diff --git a/drivers/gpu/drm/i915/i915_buddy.c b/drivers/gpu/drm/i915/i915_buddy.c deleted file mode 100644 index 3a2f6eecb2fc..000000000000 --- a/drivers/gpu/drm/i915/i915_buddy.c +++ /dev/null @@ -1,435 +0,0 @@ -// SPDX-License-Identifier: MIT -/* - * Copyright © 2019 Intel Corporation - */ - -#include -#include - -#include "i915_buddy.h" - -#include "i915_gem.h" -#include "i915_globals.h" -#include "i915_utils.h" - -static struct i915_global_block { - struct i915_global base; - struct kmem_cache *slab_blocks; -} global; - -static void i915_global_buddy_shrink(void) -{ - kmem_cache_shrink(global.slab_blocks); -} - -static void i915_global_buddy_exit(void) -{ - kmem_cache_destroy(global.slab_blocks); -} - -static struct i915_global_block global = { { - .shrink = i915_global_buddy_shrink, - .exit = i915_global_buddy_exit, -} }; - -int __init i915_global_buddy_init(void) -{ - global.slab_blocks = KMEM_CACHE(i915_buddy_block, SLAB_HWCACHE_ALIGN); - if (!global.slab_blocks) - return -ENOMEM; - - i915_global_register(&global.base); - return 0; -} - -static struct i915_buddy_block *i915_block_alloc(struct i915_buddy_block *parent, - unsigned int order, - u64 offset) -{ - struct i915_buddy_block *block; - - GEM_BUG_ON(order > I915_BUDDY_MAX_ORDER); - - block = kmem_cache_zalloc(global.slab_blocks, GFP_KERNEL); - if (!block) - return NULL; - - block->header = offset; - block->header |= order; - block->parent = parent; - - GEM_BUG_ON(block->header & I915_BUDDY_HEADER_UNUSED); - return block; -} - -static void i915_block_free(struct i915_buddy_block *block) -{ - kmem_cache_free(global.slab_blocks, block); -} - -static void mark_allocated(struct i915_buddy_block *block) -{ - block->header &= ~I915_BUDDY_HEADER_STATE; - block->header |= I915_BUDDY_ALLOCATED; - - list_del(&block->link); -} - -static void mark_free(struct i915_buddy_mm *mm, - struct i915_buddy_block *block) -{ - block->header &= ~I915_BUDDY_HEADER_STATE; - block->header |= I915_BUDDY_FREE; - - list_add(&block->link, - &mm->free_list[i915_buddy_block_order(block)]); -} - -static void mark_split(struct i915_buddy_block *block) -{ - block->header &= ~I915_BUDDY_HEADER_STATE; - block->header |= I915_BUDDY_SPLIT; - - list_del(&block->link); -} - -int i915_buddy_init(struct i915_buddy_mm *mm, u64 size, u64 chunk_size) -{ - unsigned int i; - u64 offset; - - if (size < chunk_size) - return -EINVAL; - - if (chunk_size < PAGE_SIZE) - return -EINVAL; - - if (!is_power_of_2(chunk_size)) - return -EINVAL; - - size = round_down(size, chunk_size); - - mm->size = size; - mm->chunk_size = chunk_size; - mm->max_order = ilog2(size) - ilog2(chunk_size); - - GEM_BUG_ON(mm->max_order > I915_BUDDY_MAX_ORDER); - - mm->free_list = kmalloc_array(mm->max_order + 1, - sizeof(struct list_head), - GFP_KERNEL); - if (!mm->free_list) - return -ENOMEM; - - for (i = 0; i <= mm->max_order; ++i) - INIT_LIST_HEAD(&mm->free_list[i]); - - mm->n_roots = hweight64(size); - - mm->roots = kmalloc_array(mm->n_roots, - sizeof(struct i915_buddy_block *), - GFP_KERNEL); - if (!mm->roots) - goto out_free_list; - - offset = 0; - i = 0; - - /* - * Split into power-of-two blocks, in case we are given a size that is - * not itself a power-of-two. - */ - do { - struct i915_buddy_block *root; - unsigned int order; - u64 root_size; - - root_size = rounddown_pow_of_two(size); - order = ilog2(root_size) - ilog2(chunk_size); - - root = i915_block_alloc(NULL, order, offset); - if (!root) - goto out_free_roots; - - mark_free(mm, root); - - GEM_BUG_ON(i > mm->max_order); - GEM_BUG_ON(i915_buddy_block_size(mm, root) < chunk_size); - - mm->roots[i] = root; - - offset += root_size; - size -= root_size; - i++; - } while (size); - - return 0; - -out_free_roots: - while (i--) - i915_block_free(mm->roots[i]); - kfree(mm->roots); -out_free_list: - kfree(mm->free_list); - return -ENOMEM; -} - -void i915_buddy_fini(struct i915_buddy_mm *mm) -{ - int i; - - for (i = 0; i < mm->n_roots; ++i) { - GEM_WARN_ON(!i915_buddy_block_is_free(mm->roots[i])); - i915_block_free(mm->roots[i]); - } - - kfree(mm->roots); - kfree(mm->free_list); -} - -static int split_block(struct i915_buddy_mm *mm, - struct i915_buddy_block *block) -{ - unsigned int block_order = i915_buddy_block_order(block) - 1; - u64 offset = i915_buddy_block_offset(block); - - GEM_BUG_ON(!i915_buddy_block_is_free(block)); - GEM_BUG_ON(!i915_buddy_block_order(block)); - - block->left = i915_block_alloc(block, block_order, offset); - if (!block->left) - return -ENOMEM; - - block->right = i915_block_alloc(block, block_order, - offset + (mm->chunk_size << block_order)); - if (!block->right) { - i915_block_free(block->left); - return -ENOMEM; - } - - mark_free(mm, block->left); - mark_free(mm, block->right); - - mark_split(block); - - return 0; -} - -static struct i915_buddy_block * -get_buddy(struct i915_buddy_block *block) -{ - struct i915_buddy_block *parent; - - parent = block->parent; - if (!parent) - return NULL; - - if (parent->left == block) - return parent->right; - - return parent->left; -} - -static void __i915_buddy_free(struct i915_buddy_mm *mm, - struct i915_buddy_block *block) -{ - struct i915_buddy_block *parent; - - while ((parent = block->parent)) { - struct i915_buddy_block *buddy; - - buddy = get_buddy(block); - - if (!i915_buddy_block_is_free(buddy)) - break; - - list_del(&buddy->link); - - i915_block_free(block); - i915_block_free(buddy); - - block = parent; - } - - mark_free(mm, block); -} - -void i915_buddy_free(struct i915_buddy_mm *mm, - struct i915_buddy_block *block) -{ - GEM_BUG_ON(!i915_buddy_block_is_allocated(block)); - __i915_buddy_free(mm, block); -} - -void i915_buddy_free_list(struct i915_buddy_mm *mm, struct list_head *objects) -{ - struct i915_buddy_block *block, *on; - - list_for_each_entry_safe(block, on, objects, link) { - i915_buddy_free(mm, block); - cond_resched(); - } - INIT_LIST_HEAD(objects); -} - -/* - * Allocate power-of-two block. The order value here translates to: - * - * 0 = 2^0 * mm->chunk_size - * 1 = 2^1 * mm->chunk_size - * 2 = 2^2 * mm->chunk_size - * ... - */ -struct i915_buddy_block * -i915_buddy_alloc(struct i915_buddy_mm *mm, unsigned int order) -{ - struct i915_buddy_block *block = NULL; - unsigned int i; - int err; - - for (i = order; i <= mm->max_order; ++i) { - block = list_first_entry_or_null(&mm->free_list[i], - struct i915_buddy_block, - link); - if (block) - break; - } - - if (!block) - return ERR_PTR(-ENOSPC); - - GEM_BUG_ON(!i915_buddy_block_is_free(block)); - - while (i != order) { - err = split_block(mm, block); - if (unlikely(err)) - goto out_free; - - /* Go low */ - block = block->left; - i--; - } - - mark_allocated(block); - kmemleak_update_trace(block); - return block; - -out_free: - if (i != order) - __i915_buddy_free(mm, block); - return ERR_PTR(err); -} - -static inline bool overlaps(u64 s1, u64 e1, u64 s2, u64 e2) -{ - return s1 <= e2 && e1 >= s2; -} - -static inline bool contains(u64 s1, u64 e1, u64 s2, u64 e2) -{ - return s1 <= s2 && e1 >= e2; -} - -/* - * Allocate range. Note that it's safe to chain together multiple alloc_ranges - * with the same blocks list. - * - * Intended for pre-allocating portions of the address space, for example to - * reserve a block for the initial framebuffer or similar, hence the expectation - * here is that i915_buddy_alloc() is still the main vehicle for - * allocations, so if that's not the case then the drm_mm range allocator is - * probably a much better fit, and so you should probably go use that instead. - */ -int i915_buddy_alloc_range(struct i915_buddy_mm *mm, - struct list_head *blocks, - u64 start, u64 size) -{ - struct i915_buddy_block *block; - struct i915_buddy_block *buddy; - LIST_HEAD(allocated); - LIST_HEAD(dfs); - u64 end; - int err; - int i; - - if (size < mm->chunk_size) - return -EINVAL; - - if (!IS_ALIGNED(size | start, mm->chunk_size)) - return -EINVAL; - - if (range_overflows(start, size, mm->size)) - return -EINVAL; - - for (i = 0; i < mm->n_roots; ++i) - list_add_tail(&mm->roots[i]->tmp_link, &dfs); - - end = start + size - 1; - - do { - u64 block_start; - u64 block_end; - - block = list_first_entry_or_null(&dfs, - struct i915_buddy_block, - tmp_link); - if (!block) - break; - - list_del(&block->tmp_link); - - block_start = i915_buddy_block_offset(block); - block_end = block_start + i915_buddy_block_size(mm, block) - 1; - - if (!overlaps(start, end, block_start, block_end)) - continue; - - if (i915_buddy_block_is_allocated(block)) { - err = -ENOSPC; - goto err_free; - } - - if (contains(start, end, block_start, block_end)) { - if (!i915_buddy_block_is_free(block)) { - err = -ENOSPC; - goto err_free; - } - - mark_allocated(block); - list_add_tail(&block->link, &allocated); - continue; - } - - if (!i915_buddy_block_is_split(block)) { - err = split_block(mm, block); - if (unlikely(err)) - goto err_undo; - } - - list_add(&block->right->tmp_link, &dfs); - list_add(&block->left->tmp_link, &dfs); - } while (1); - - list_splice_tail(&allocated, blocks); - return 0; - -err_undo: - /* - * We really don't want to leave around a bunch of split blocks, since - * bigger is better, so make sure we merge everything back before we - * free the allocated blocks. - */ - buddy = get_buddy(block); - if (buddy && - (i915_buddy_block_is_free(block) && - i915_buddy_block_is_free(buddy))) - __i915_buddy_free(mm, block); - -err_free: - i915_buddy_free_list(mm, &allocated); - return err; -} - -#if IS_ENABLED(CONFIG_DRM_I915_SELFTEST) -#include "selftests/i915_buddy.c" -#endif diff --git a/drivers/gpu/drm/i915/i915_buddy.h b/drivers/gpu/drm/i915/i915_buddy.h deleted file mode 100644 index 9ce5200f4001..000000000000 --- a/drivers/gpu/drm/i915/i915_buddy.h +++ /dev/null @@ -1,131 +0,0 @@ -/* SPDX-License-Identifier: MIT */ -/* - * Copyright © 2019 Intel Corporation - */ - -#ifndef __I915_BUDDY_H__ -#define __I915_BUDDY_H__ - -#include -#include - -struct i915_buddy_block { -#define I915_BUDDY_HEADER_OFFSET GENMASK_ULL(63, 12) -#define I915_BUDDY_HEADER_STATE GENMASK_ULL(11, 10) -#define I915_BUDDY_ALLOCATED (1 << 10) -#define I915_BUDDY_FREE (2 << 10) -#define I915_BUDDY_SPLIT (3 << 10) -/* Free to be used, if needed in the future */ -#define I915_BUDDY_HEADER_UNUSED GENMASK_ULL(9, 6) -#define I915_BUDDY_HEADER_ORDER GENMASK_ULL(5, 0) - u64 header; - - struct i915_buddy_block *left; - struct i915_buddy_block *right; - struct i915_buddy_block *parent; - - void *private; /* owned by creator */ - - /* - * While the block is allocated by the user through i915_buddy_alloc*, - * the user has ownership of the link, for example to maintain within - * a list, if so desired. As soon as the block is freed with - * i915_buddy_free* ownership is given back to the mm. - */ - struct list_head link; - struct list_head tmp_link; -}; - -/* Order-zero must be at least PAGE_SIZE */ -#define I915_BUDDY_MAX_ORDER (63 - PAGE_SHIFT) - -/* - * Binary Buddy System. - * - * Locking should be handled by the user, a simple mutex around - * i915_buddy_alloc* and i915_buddy_free* should suffice. - */ -struct i915_buddy_mm { - /* Maintain a free list for each order. */ - struct list_head *free_list; - - /* - * Maintain explicit binary tree(s) to track the allocation of the - * address space. This gives us a simple way of finding a buddy block - * and performing the potentially recursive merge step when freeing a - * block. Nodes are either allocated or free, in which case they will - * also exist on the respective free list. - */ - struct i915_buddy_block **roots; - - /* - * Anything from here is public, and remains static for the lifetime of - * the mm. Everything above is considered do-not-touch. - */ - unsigned int n_roots; - unsigned int max_order; - - /* Must be at least PAGE_SIZE */ - u64 chunk_size; - u64 size; -}; - -static inline u64 -i915_buddy_block_offset(struct i915_buddy_block *block) -{ - return block->header & I915_BUDDY_HEADER_OFFSET; -} - -static inline unsigned int -i915_buddy_block_order(struct i915_buddy_block *block) -{ - return block->header & I915_BUDDY_HEADER_ORDER; -} - -static inline unsigned int -i915_buddy_block_state(struct i915_buddy_block *block) -{ - return block->header & I915_BUDDY_HEADER_STATE; -} - -static inline bool -i915_buddy_block_is_allocated(struct i915_buddy_block *block) -{ - return i915_buddy_block_state(block) == I915_BUDDY_ALLOCATED; -} - -static inline bool -i915_buddy_block_is_free(struct i915_buddy_block *block) -{ - return i915_buddy_block_state(block) == I915_BUDDY_FREE; -} - -static inline bool -i915_buddy_block_is_split(struct i915_buddy_block *block) -{ - return i915_buddy_block_state(block) == I915_BUDDY_SPLIT; -} - -static inline u64 -i915_buddy_block_size(struct i915_buddy_mm *mm, - struct i915_buddy_block *block) -{ - return mm->chunk_size << i915_buddy_block_order(block); -} - -int i915_buddy_init(struct i915_buddy_mm *mm, u64 size, u64 chunk_size); - -void i915_buddy_fini(struct i915_buddy_mm *mm); - -struct i915_buddy_block * -i915_buddy_alloc(struct i915_buddy_mm *mm, unsigned int order); - -int i915_buddy_alloc_range(struct i915_buddy_mm *mm, - struct list_head *blocks, - u64 start, u64 size); - -void i915_buddy_free(struct i915_buddy_mm *mm, struct i915_buddy_block *block); - -void i915_buddy_free_list(struct i915_buddy_mm *mm, struct list_head *objects); - -#endif diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c index 92bccc5623a8..122dd297b6af 100644 --- a/drivers/gpu/drm/i915/i915_drv.c +++ b/drivers/gpu/drm/i915/i915_drv.c @@ -84,6 +84,7 @@ #include "intel_gvt.h" #include "intel_memory_region.h" #include "intel_pm.h" +#include "intel_region_ttm.h" #include "intel_sideband.h" #include "vlv_suspend.h" @@ -335,6 +336,10 @@ static int i915_driver_early_probe(struct drm_i915_private *dev_priv) if (ret < 0) goto err_workqueues; + ret = intel_region_ttm_device_init(dev_priv); + if (ret) + goto err_ttm; + intel_wopcm_init_early(&dev_priv->wopcm); intel_gt_init_early(&dev_priv->gt, dev_priv); @@ -359,6 +364,8 @@ static int i915_driver_early_probe(struct drm_i915_private *dev_priv) err_gem: i915_gem_cleanup_early(dev_priv); intel_gt_driver_late_release(&dev_priv->gt); + intel_region_ttm_device_fini(dev_priv); +err_ttm: vlv_suspend_cleanup(dev_priv); err_workqueues: i915_workqueues_cleanup(dev_priv); @@ -376,6 +383,7 @@ static void i915_driver_late_release(struct drm_i915_private *dev_priv) intel_power_domains_cleanup(dev_priv); i915_gem_cleanup_early(dev_priv); intel_gt_driver_late_release(&dev_priv->gt); + intel_region_ttm_device_fini(dev_priv); vlv_suspend_cleanup(dev_priv); i915_workqueues_cleanup(dev_priv); diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 128198e8b4d0..1276a2f60740 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h @@ -60,6 +60,7 @@ #include #include #include +#include #include "i915_params.h" #include "i915_reg.h" @@ -1166,6 +1167,9 @@ struct drm_i915_private { /* Mutex to protect the above hdcp component related values. */ struct mutex hdcp_comp_mutex; + /* The TTM device structure. */ + struct ttm_device bdev; + I915_SELFTEST_DECLARE(struct i915_selftest_stash selftest;) /* @@ -1751,7 +1755,8 @@ void i915_gem_cleanup_userptr(struct drm_i915_private *dev_priv); void i915_gem_init_early(struct drm_i915_private *dev_priv); void i915_gem_cleanup_early(struct drm_i915_private *dev_priv); -struct intel_memory_region *i915_gem_shmem_setup(struct drm_i915_private *i915); +struct intel_memory_region *i915_gem_shmem_setup(struct drm_i915_private *i915, + u16 type, u16 instance); static inline void i915_gem_drain_freed_objects(struct drm_i915_private *i915) { diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index d0018c5f88bd..180f6e9107d4 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c @@ -1109,6 +1109,7 @@ int i915_gem_init(struct drm_i915_private *dev_priv) } i915_gem_drain_freed_objects(dev_priv); + return ret; } diff --git a/drivers/gpu/drm/i915/i915_globals.c b/drivers/gpu/drm/i915/i915_globals.c index 3aa213684293..77f1911c463b 100644 --- a/drivers/gpu/drm/i915/i915_globals.c +++ b/drivers/gpu/drm/i915/i915_globals.c @@ -87,7 +87,6 @@ static void __i915_globals_cleanup(void) static __initconst int (* const initfn[])(void) = { i915_global_active_init, - i915_global_buddy_init, i915_global_context_init, i915_global_gem_context_init, i915_global_objects_init, diff --git a/drivers/gpu/drm/i915/i915_globals.h b/drivers/gpu/drm/i915/i915_globals.h index b2f5cd9b9b1a..2d199f411a4a 100644 --- a/drivers/gpu/drm/i915/i915_globals.h +++ b/drivers/gpu/drm/i915/i915_globals.h @@ -27,7 +27,6 @@ void i915_globals_exit(void); /* constructors */ int i915_global_active_init(void); -int i915_global_buddy_init(void); int i915_global_context_init(void); int i915_global_gem_context_init(void); int i915_global_objects_init(void); diff --git a/drivers/gpu/drm/i915/i915_scatterlist.c b/drivers/gpu/drm/i915/i915_scatterlist.c index cc6b3846a8c7..69e9e6c3135e 100644 --- a/drivers/gpu/drm/i915/i915_scatterlist.c +++ b/drivers/gpu/drm/i915/i915_scatterlist.c @@ -6,6 +6,10 @@ #include "i915_scatterlist.h" +#include + +#include + bool i915_sg_trim(struct sg_table *orig_st) { struct sg_table new_st; @@ -34,6 +38,72 @@ bool i915_sg_trim(struct sg_table *orig_st) return true; } +/** + * i915_sg_from_mm_node - Create an sg_table from a struct drm_mm_node + * @node: The drm_mm_node. + * @region_start: An offset to add to the dma addresses of the sg list. + * + * Create a struct sg_table, initializing it from a struct drm_mm_node, + * taking a maximum segment length into account, splitting into segments + * if necessary. + * + * Return: A pointer to a kmalloced struct sg_table on success, negative + * error code cast to an error pointer on failure. + */ +struct sg_table *i915_sg_from_mm_node(const struct drm_mm_node *node, + u64 region_start) +{ + const u64 max_segment = SZ_1G; /* Do we have a limit on this? */ + u64 segment_pages = max_segment >> PAGE_SHIFT; + u64 block_size, offset, prev_end; + struct sg_table *st; + struct scatterlist *sg; + + st = kmalloc(sizeof(*st), GFP_KERNEL); + if (!st) + return ERR_PTR(-ENOMEM); + + if (sg_alloc_table(st, DIV_ROUND_UP(node->size, segment_pages), + GFP_KERNEL)) { + kfree(st); + return ERR_PTR(-ENOMEM); + } + + sg = st->sgl; + st->nents = 0; + prev_end = (resource_size_t)-1; + block_size = node->size << PAGE_SHIFT; + offset = node->start << PAGE_SHIFT; + + while (block_size) { + u64 len; + + if (offset != prev_end || sg->length >= max_segment) { + if (st->nents) + sg = __sg_next(sg); + + sg_dma_address(sg) = region_start + offset; + sg_dma_len(sg) = 0; + sg->length = 0; + st->nents++; + } + + len = min(block_size, max_segment - sg->length); + sg->length += len; + sg_dma_len(sg) += len; + + offset += len; + block_size -= len; + + prev_end = offset; + } + + sg_mark_end(sg); + i915_sg_trim(st); + + return st; +} + #if IS_ENABLED(CONFIG_DRM_I915_SELFTEST) #include "selftests/scatterlist.c" #endif diff --git a/drivers/gpu/drm/i915/i915_scatterlist.h b/drivers/gpu/drm/i915/i915_scatterlist.h index b96baad66a3a..5acca45ea981 100644 --- a/drivers/gpu/drm/i915/i915_scatterlist.h +++ b/drivers/gpu/drm/i915/i915_scatterlist.h @@ -13,6 +13,8 @@ #include "i915_gem.h" +struct drm_mm_node; + /* * Optimised SGL iterator for GEM objects */ @@ -141,4 +143,6 @@ static inline unsigned int i915_sg_segment_size(void) bool i915_sg_trim(struct sg_table *orig_st); +struct sg_table *i915_sg_from_mm_node(const struct drm_mm_node *node, + u64 region_start); #endif diff --git a/drivers/gpu/drm/i915/intel_memory_region.c b/drivers/gpu/drm/i915/intel_memory_region.c index d98e8b81d322..4092cc987679 100644 --- a/drivers/gpu/drm/i915/intel_memory_region.c +++ b/drivers/gpu/drm/i915/intel_memory_region.c @@ -28,6 +28,11 @@ static const struct { }, }; +struct intel_region_reserve { + struct list_head link; + void *node; +}; + struct intel_memory_region * intel_memory_region_lookup(struct drm_i915_private *i915, u16 class, u16 instance) @@ -58,146 +63,61 @@ intel_memory_region_by_type(struct drm_i915_private *i915, return NULL; } -static u64 -intel_memory_region_free_pages(struct intel_memory_region *mem, - struct list_head *blocks) +/** + * intel_memory_region_unreserve - Unreserve all previously reserved + * ranges + * @mem: The region containing the reserved ranges. + */ +void intel_memory_region_unreserve(struct intel_memory_region *mem) { - struct i915_buddy_block *block, *on; - u64 size = 0; + struct intel_region_reserve *reserve, *next; - list_for_each_entry_safe(block, on, blocks, link) { - size += i915_buddy_block_size(&mem->mm, block); - i915_buddy_free(&mem->mm, block); - } - INIT_LIST_HEAD(blocks); + if (!mem->priv_ops || !mem->priv_ops->free) + return; - return size; -} - -void -__intel_memory_region_put_pages_buddy(struct intel_memory_region *mem, - struct list_head *blocks) -{ mutex_lock(&mem->mm_lock); - mem->avail += intel_memory_region_free_pages(mem, blocks); - mutex_unlock(&mem->mm_lock); -} - -void -__intel_memory_region_put_block_buddy(struct i915_buddy_block *block) -{ - struct list_head blocks; - - INIT_LIST_HEAD(&blocks); - list_add(&block->link, &blocks); - __intel_memory_region_put_pages_buddy(block->private, &blocks); -} - -int -__intel_memory_region_get_pages_buddy(struct intel_memory_region *mem, - resource_size_t size, - unsigned int flags, - struct list_head *blocks) -{ - unsigned int min_order = 0; - unsigned long n_pages; - - GEM_BUG_ON(!IS_ALIGNED(size, mem->mm.chunk_size)); - GEM_BUG_ON(!list_empty(blocks)); - - if (flags & I915_ALLOC_MIN_PAGE_SIZE) { - min_order = ilog2(mem->min_page_size) - - ilog2(mem->mm.chunk_size); - } - - if (flags & I915_ALLOC_CONTIGUOUS) { - size = roundup_pow_of_two(size); - min_order = ilog2(size) - ilog2(mem->mm.chunk_size); + list_for_each_entry_safe(reserve, next, &mem->reserved, link) { + list_del(&reserve->link); + mem->priv_ops->free(mem, reserve->node); + kfree(reserve); } - - if (size > mem->mm.size) - return -E2BIG; - - n_pages = size >> ilog2(mem->mm.chunk_size); - - mutex_lock(&mem->mm_lock); - - do { - struct i915_buddy_block *block; - unsigned int order; - - order = fls(n_pages) - 1; - GEM_BUG_ON(order > mem->mm.max_order); - GEM_BUG_ON(order < min_order); - - do { - block = i915_buddy_alloc(&mem->mm, order); - if (!IS_ERR(block)) - break; - - if (order-- == min_order) - goto err_free_blocks; - } while (1); - - n_pages -= BIT(order); - - block->private = mem; - list_add_tail(&block->link, blocks); - - if (!n_pages) - break; - } while (1); - - mem->avail -= size; mutex_unlock(&mem->mm_lock); - return 0; - -err_free_blocks: - intel_memory_region_free_pages(mem, blocks); - mutex_unlock(&mem->mm_lock); - return -ENXIO; } -struct i915_buddy_block * -__intel_memory_region_get_block_buddy(struct intel_memory_region *mem, - resource_size_t size, - unsigned int flags) +/** + * intel_memory_region_reserve - Reserve a memory range + * @mem: The region for which we want to reserve a range. + * @offset: Start of the range to reserve. + * @size: The size of the range to reserve. + * + * Return: 0 on success, negative error code on failure. + */ +int intel_memory_region_reserve(struct intel_memory_region *mem, + resource_size_t offset, + resource_size_t size) { - struct i915_buddy_block *block; - LIST_HEAD(blocks); int ret; + struct intel_region_reserve *reserve; - ret = __intel_memory_region_get_pages_buddy(mem, size, flags, &blocks); - if (ret) - return ERR_PTR(ret); + if (!mem->priv_ops || !mem->priv_ops->reserve) + return -EINVAL; - block = list_first_entry(&blocks, typeof(*block), link); - list_del_init(&block->link); - return block; -} + reserve = kzalloc(sizeof(*reserve), GFP_KERNEL); + if (!reserve) + return -ENOMEM; -int intel_memory_region_init_buddy(struct intel_memory_region *mem) -{ - return i915_buddy_init(&mem->mm, resource_size(&mem->region), - PAGE_SIZE); -} - -void intel_memory_region_release_buddy(struct intel_memory_region *mem) -{ - i915_buddy_free_list(&mem->mm, &mem->reserved); - i915_buddy_fini(&mem->mm); -} - -int intel_memory_region_reserve(struct intel_memory_region *mem, - u64 offset, u64 size) -{ - int ret; + reserve->node = mem->priv_ops->reserve(mem, offset, size); + if (IS_ERR(reserve->node)) { + ret = PTR_ERR(reserve->node); + kfree(reserve); + return ret; + } mutex_lock(&mem->mm_lock); - ret = i915_buddy_alloc_range(&mem->mm, &mem->reserved, offset, size); + list_add_tail(&reserve->link, &mem->reserved); mutex_unlock(&mem->mm_lock); - return ret; + return 0; } struct intel_memory_region * @@ -206,6 +126,8 @@ intel_memory_region_create(struct drm_i915_private *i915, resource_size_t size, resource_size_t min_page_size, resource_size_t io_start, + u16 type, + u16 instance, const struct intel_memory_region_ops *ops) { struct intel_memory_region *mem; @@ -222,6 +144,8 @@ intel_memory_region_create(struct drm_i915_private *i915, mem->ops = ops; mem->total = size; mem->avail = mem->total; + mem->type = type; + mem->instance = instance; mutex_init(&mem->objects.lock); INIT_LIST_HEAD(&mem->objects.list); @@ -259,6 +183,7 @@ static void __intel_memory_region_destroy(struct kref *kref) struct intel_memory_region *mem = container_of(kref, typeof(*mem), kref); + intel_memory_region_unreserve(mem); if (mem->ops->release) mem->ops->release(mem); @@ -296,15 +221,15 @@ int intel_memory_regions_hw_probe(struct drm_i915_private *i915) instance = intel_region_map[i].instance; switch (type) { case INTEL_MEMORY_SYSTEM: - mem = i915_gem_shmem_setup(i915); + mem = i915_gem_shmem_setup(i915, type, instance); break; case INTEL_MEMORY_STOLEN_LOCAL: - mem = i915_gem_stolen_lmem_setup(i915); + mem = i915_gem_stolen_lmem_setup(i915, type, instance); if (!IS_ERR(mem)) i915->mm.stolen_region = mem; break; case INTEL_MEMORY_STOLEN_SYSTEM: - mem = i915_gem_stolen_smem_setup(i915); + mem = i915_gem_stolen_smem_setup(i915, type, instance); if (!IS_ERR(mem)) i915->mm.stolen_region = mem; break; @@ -321,9 +246,6 @@ int intel_memory_regions_hw_probe(struct drm_i915_private *i915) } mem->id = i; - mem->type = type; - mem->instance = instance; - i915->mm.regions[i] = mem; } diff --git a/drivers/gpu/drm/i915/intel_memory_region.h b/drivers/gpu/drm/i915/intel_memory_region.h index d24ce5a0b30b..e69cde13daf2 100644 --- a/drivers/gpu/drm/i915/intel_memory_region.h +++ b/drivers/gpu/drm/i915/intel_memory_region.h @@ -13,8 +13,6 @@ #include #include -#include "i915_buddy.h" - struct drm_i915_private; struct drm_i915_gem_object; struct intel_memory_region; @@ -25,6 +23,7 @@ enum intel_memory_type { INTEL_MEMORY_LOCAL = I915_MEMORY_CLASS_DEVICE, INTEL_MEMORY_STOLEN_SYSTEM, INTEL_MEMORY_STOLEN_LOCAL, + INTEL_MEMORY_MOCK, }; enum intel_region_id { @@ -59,10 +58,19 @@ struct intel_memory_region_ops { unsigned int flags); }; +struct intel_memory_region_private_ops { + void *(*reserve)(struct intel_memory_region *mem, + resource_size_t offset, + resource_size_t size); + void (*free)(struct intel_memory_region *mem, + void *node); +}; + struct intel_memory_region { struct drm_i915_private *i915; const struct intel_memory_region_ops *ops; + const struct intel_memory_region_private_ops *priv_ops; struct io_mapping iomap; struct resource region; @@ -70,7 +78,6 @@ struct intel_memory_region { /* For fake LMEM */ struct drm_mm_node fake_mappable; - struct i915_buddy_mm mm; struct mutex mm_lock; struct kref kref; @@ -95,36 +102,26 @@ struct intel_memory_region { struct list_head list; struct list_head purgeable; } objects; + + size_t chunk_size; + unsigned int max_order; + bool is_range_manager; + + void *region_private; }; struct intel_memory_region * intel_memory_region_lookup(struct drm_i915_private *i915, u16 class, u16 instance); -int intel_memory_region_init_buddy(struct intel_memory_region *mem); -void intel_memory_region_release_buddy(struct intel_memory_region *mem); - -int __intel_memory_region_get_pages_buddy(struct intel_memory_region *mem, - resource_size_t size, - unsigned int flags, - struct list_head *blocks); -struct i915_buddy_block * -__intel_memory_region_get_block_buddy(struct intel_memory_region *mem, - resource_size_t size, - unsigned int flags); -void __intel_memory_region_put_pages_buddy(struct intel_memory_region *mem, - struct list_head *blocks); -void __intel_memory_region_put_block_buddy(struct i915_buddy_block *block); - -int intel_memory_region_reserve(struct intel_memory_region *mem, - u64 offset, u64 size); - struct intel_memory_region * intel_memory_region_create(struct drm_i915_private *i915, resource_size_t start, resource_size_t size, resource_size_t min_page_size, resource_size_t io_start, + u16 type, + u16 instance, const struct intel_memory_region_ops *ops); struct intel_memory_region * @@ -141,4 +138,9 @@ __printf(2, 3) void intel_memory_region_set_name(struct intel_memory_region *mem, const char *fmt, ...); +void intel_memory_region_unreserve(struct intel_memory_region *mem); + +int intel_memory_region_reserve(struct intel_memory_region *mem, + resource_size_t offset, + resource_size_t size); #endif diff --git a/drivers/gpu/drm/i915/intel_region_ttm.c b/drivers/gpu/drm/i915/intel_region_ttm.c new file mode 100644 index 000000000000..69c98298326b --- /dev/null +++ b/drivers/gpu/drm/i915/intel_region_ttm.c @@ -0,0 +1,334 @@ +// SPDX-License-Identifier: MIT +/* + * Copyright © 2021 Intel Corporation + */ +#include +#include + +#include "i915_drv.h" +#include "i915_scatterlist.h" + +#include "intel_region_ttm.h" + +/** + * DOC: TTM support structure + * + * The code in this file deals with setting up memory managers for TTM + * LMEM and MOCK regions and converting the output from + * the managers to struct sg_table, Basically providing the mapping from + * i915 GEM regions to TTM memory types and resource managers. + */ + +/** + * struct intel_region_ttm_private - Private info for TTM regions + * @man: The TTM resource manager used to manage this region + * @mock_bdev: A mock zero-initialized TTM device for this region + */ +struct intel_region_ttm_private { + struct ttm_resource_manager *man; + + I915_SELFTEST_DECLARE(struct ttm_device mock_bdev); + I915_SELFTEST_DECLARE(struct drm_vma_offset_manager mock_vma); +}; + +/* A Zero-initialized driver for now. We don't have a TTM backend yet. */ +static struct ttm_device_funcs i915_ttm_bo_driver; + +static struct intel_region_ttm_private *to_ttm_private(void *data) +{ + return (struct intel_region_ttm_private *)data; +} + +/** + * intel_region_ttm_device_init - Initialize a TTM device + * @dev_priv: Pointer to an i915 device private structure. + * + * Return: 0 on success, negative error code on failure. + */ +int intel_region_ttm_device_init(struct drm_i915_private *dev_priv) +{ + struct drm_device *drm = &dev_priv->drm; + + return ttm_device_init(&dev_priv->bdev, &i915_ttm_bo_driver, + drm->dev, drm->anon_inode->i_mapping, + drm->vma_offset_manager, false, false); +} + +/** + * intel_region_ttm_device_fini - Finalize a TTM device + * @dev_priv: Pointer to an i915 device private structure. + */ +void intel_region_ttm_device_fini(struct drm_i915_private *dev_priv) +{ + ttm_device_fini(&dev_priv->bdev); +} + +/* + * Map the i915 memory regions to TTM memory types. We use the + * driver-private types for now, reserving TTM_PL_VRAM for stolen + * memory and TTM_PL_TT for GGTT use if decided to implement this. + */ +static int intel_region_to_ttm_type(struct intel_memory_region *mem) +{ + int type; + + GEM_BUG_ON(mem->type != INTEL_MEMORY_LOCAL && + mem->type != INTEL_MEMORY_MOCK); + + type = mem->instance + TTM_PL_PRIV; + GEM_BUG_ON(type >= TTM_NUM_MEM_TYPES); + + return type; +} + +static void *intel_region_ttm_node_reserve(struct intel_memory_region *mem, + resource_size_t offset, + resource_size_t size) +{ + struct ttm_resource_manager *man = + to_ttm_private(mem->region_private)->man; + struct ttm_place place = {}; + struct ttm_resource res = {}; + struct ttm_buffer_object mock_bo = {}; + int ret; + + /* + * Having to use a mock_bo is unfortunate but stems from some + * drivers having private managers that insist to know what the + * allocate memory is intended for, using it to send private + * data to the manager. Also recently the bo has been used to send + * alignment info to the manager. Assume that apart from the latter, + * none of the managers we use will ever access the buffer object + * members, hoping we can pass the alignment info in the + * struct ttm_place in the future. + */ + + place.fpfn = offset >> PAGE_SHIFT; + place.lpfn = place.fpfn + (size >> PAGE_SHIFT); + res.num_pages = size >> PAGE_SHIFT; + ret = man->func->alloc(man, &mock_bo, &place, &res); + if (ret == -ENOSPC) + ret = -ENXIO; + + return ret ? ERR_PTR(ret) : res.mm_node; +} + +/** + * intel_region_ttm_node_free - Free a node allocated from a resource manager + * @mem: The region the node was allocated from. + * @node: The opaque node representing an allocation. + */ +void intel_region_ttm_node_free(struct intel_memory_region *mem, + void *node) +{ + struct ttm_resource_manager *man = + to_ttm_private(mem->region_private)->man; + struct ttm_resource res = {}; + + res.mm_node = node; + man->func->free(man, &res); +} + +static const struct intel_memory_region_private_ops priv_ops = { + .reserve = intel_region_ttm_node_reserve, + .free = intel_region_ttm_node_free, +}; + +static int __intel_region_ttm_init(struct intel_memory_region *mem, + struct intel_region_ttm_private *priv, + struct ttm_device *bdev) +{ + int mem_type = intel_region_to_ttm_type(mem); + int ret; + + ret = ttm_range_man_init(bdev, mem_type, false, + resource_size(&mem->region) >> PAGE_SHIFT); + if (ret) + return ret; + + priv->man = ttm_manager_type(bdev, mem_type); + mem->chunk_size = PAGE_SIZE; + mem->max_order = + get_order(rounddown_pow_of_two(resource_size(&mem->region))); + mem->is_range_manager = true; + mem->priv_ops = &priv_ops; + mem->region_private = priv; + + return 0; +} + +/** + * intel_region_ttm_init - Initialize a memory region for TTM. + * @mem: The region to initialize. + * + * This function initializes a suitable TTM resource manager for the + * region, attaches it to the TTM device. + * + * Return: 0 on success, negative error code on failure. + */ +int intel_region_ttm_init(struct intel_memory_region *mem) +{ + struct intel_region_ttm_private *priv; + int ret; + + priv = kzalloc(sizeof(*priv), GFP_KERNEL); + if (!priv) + return -ENOMEM; + + ret = __intel_region_ttm_init(mem, priv, &mem->i915->bdev); + if (ret) + kfree(priv); + return ret; +} + +/** + * intel_region_ttm_fini - Finalize a TTM region. + * @mem: The memory region + * + * This functions takes down the TTM resource manager associated with the + * memory region, and if it was registered with the TTM device, + * removes that registration. + */ +void intel_region_ttm_fini(struct intel_memory_region *mem) +{ + struct intel_region_ttm_private *priv = + to_ttm_private(mem->region_private); + int ret; + + ret = ttm_range_man_fini(&mem->i915->bdev, intel_region_to_ttm_type(mem)); + GEM_WARN_ON(ret); + mem->region_private = NULL; + kfree(priv); +} + +/** + * intel_region_ttm_node_to_st - Convert an opaque TTM resource manager node + * to an sg_table. + * @mem: The memory region. + * @node: The resource manager node obtained from the TTM resource manager. + * + * The gem backends typically use sg-tables for operations on the underlying + * io_memory. So provide a way for the backends to translate the + * nodes they are handed from TTM to sg-tables. + * + * Return: A malloced sg_table on success, an error pointer on failure. + */ +struct sg_table *intel_region_ttm_node_to_st(struct intel_memory_region *mem, + void *node) +{ + return i915_sg_from_mm_node(node, mem->region.start); +} + +/** + * intel_region_ttm_node_alloc - Allocate memory resources from a region + * @mem: The memory region, + * @size: The requested size in bytes + * @flags: Allocation flags + * + * This functionality is provided only for callers that need to allocate + * memory from standalone TTM range managers, without the TTM eviction + * functionality. Don't use if you are not completely sure that's the + * case. The returned opaque node can be converted to an sg_table using + * intel_region_ttm_node_to_st(), and can be freed using + * intel_region_ttm_node_free(). + * + * Return: A valid pointer on success, an error pointer on failure. + */ +void *intel_region_ttm_node_alloc(struct intel_memory_region *mem, + resource_size_t size, + unsigned int flags) +{ + struct ttm_resource_manager *man = + to_ttm_private(mem->region_private)->man; + struct ttm_place place = {}; + struct ttm_resource res = {}; + struct ttm_buffer_object mock_bo = {}; + int ret; + + /* + * We ignore the flags for now since we're using the range + * manager and contigous and min page size would be fulfilled + * by default if size is min page size aligned. + */ + res.num_pages = size >> PAGE_SHIFT; + + if (mem->is_range_manager) { + if (size >= SZ_1G) + mock_bo.page_alignment = SZ_1G >> PAGE_SHIFT; + else if (size >= SZ_2M) + mock_bo.page_alignment = SZ_2M >> PAGE_SHIFT; + else if (size >= SZ_64K) + mock_bo.page_alignment = SZ_64K >> PAGE_SHIFT; + } + + ret = man->func->alloc(man, &mock_bo, &place, &res); + if (ret == -ENOSPC) + ret = -ENXIO; + return ret ? ERR_PTR(ret) : res.mm_node; +} + +#ifdef CONFIG_DRM_I915_SELFTEST +/** + * intel_region_ttm_init_mock - Initialize a mock memory region for TTM. + * @mem: The region to initialize. + * + * This function initializes a suitable TTM resource manager for the + * region, attaches it to the TTM device. + * This code is for mock selftests only. + * + * Return: 0 on success, negative error code on failure. + */ +int intel_region_ttm_init_mock(struct intel_memory_region *mem) +{ + struct intel_region_ttm_private *priv; + int ret; + + priv = kzalloc(sizeof(*priv), GFP_KERNEL); + if (!priv) + return -ENOMEM; + + drm_vma_offset_manager_init(&priv->mock_vma, + DRM_FILE_PAGE_OFFSET_START, + DRM_FILE_PAGE_OFFSET_SIZE); + ret = ttm_device_init(&priv->mock_bdev, &i915_ttm_bo_driver, + NULL, NULL, &priv->mock_vma, false, false); + if (ret) + goto out_device; + + ret = __intel_region_ttm_init(mem, priv, &priv->mock_bdev); + if (ret) + goto out_region; + + return 0; + +out_region: + ttm_device_fini(&priv->mock_bdev); + drm_vma_offset_manager_destroy(&priv->mock_vma); +out_device: + kfree(priv); + return ret; +} + +/** + * intel_region_ttm_fini_mock - Finalize a mock TTM region. + * @mem: The memory region + * + * This functions takes down the TTM resource manager associated with the + * memory region, and if it was registered with the TTM device, + * removes that registration. Finally destroys the mock TTM device and + * vma manager. This code is for mock selftests only. + */ +void intel_region_ttm_fini_mock(struct intel_memory_region *mem) +{ + struct intel_region_ttm_private *priv = + to_ttm_private(mem->region_private); + int ret; + + ret = ttm_range_man_fini(&priv->mock_bdev, intel_region_to_ttm_type(mem)); + GEM_WARN_ON(ret); + ttm_device_fini(&priv->mock_bdev); + drm_vma_offset_manager_destroy(&priv->mock_vma); + mem->region_private = NULL; + kfree(priv); +} +#endif diff --git a/drivers/gpu/drm/i915/intel_region_ttm.h b/drivers/gpu/drm/i915/intel_region_ttm.h new file mode 100644 index 000000000000..23c6c2d4b1cd --- /dev/null +++ b/drivers/gpu/drm/i915/intel_region_ttm.h @@ -0,0 +1,38 @@ +/* SPDX-License-Identifier: MIT */ +/* + * Copyright © 2021 Intel Corporation + */ +#ifndef _INTEL_REGION_TTM_H_ +#define _INTEL_REGION_TTM_H_ + +#include + +#include "i915_selftest.h" + +struct drm_i915_private; +struct intel_memory_region; + +int intel_region_ttm_device_init(struct drm_i915_private *dev_priv); + +void intel_region_ttm_device_fini(struct drm_i915_private *dev_priv); + +int intel_region_ttm_init(struct intel_memory_region *mem); + +void intel_region_ttm_fini(struct intel_memory_region *mem); + +struct sg_table *intel_region_ttm_node_to_st(struct intel_memory_region *mem, + void *node); + +void *intel_region_ttm_node_alloc(struct intel_memory_region *mem, + resource_size_t size, + unsigned int flags); + +void intel_region_ttm_node_free(struct intel_memory_region *mem, + void *node); + +#ifdef CONFIG_DRM_I915_SELFTEST +int intel_region_ttm_init_mock(struct intel_memory_region *mem); + +void intel_region_ttm_fini_mock(struct intel_memory_region *mem); +#endif +#endif /* _INTEL_REGION_TTM_H_ */ diff --git a/drivers/gpu/drm/i915/selftests/i915_buddy.c b/drivers/gpu/drm/i915/selftests/i915_buddy.c deleted file mode 100644 index f0f5c4df8dbc..000000000000 --- a/drivers/gpu/drm/i915/selftests/i915_buddy.c +++ /dev/null @@ -1,789 +0,0 @@ -// SPDX-License-Identifier: MIT -/* - * Copyright © 2019 Intel Corporation - */ - -#include - -#include "../i915_selftest.h" -#include "i915_random.h" - -static void __igt_dump_block(struct i915_buddy_mm *mm, - struct i915_buddy_block *block, - bool buddy) -{ - pr_err("block info: header=%llx, state=%u, order=%d, offset=%llx size=%llx root=%s buddy=%s\n", - block->header, - i915_buddy_block_state(block), - i915_buddy_block_order(block), - i915_buddy_block_offset(block), - i915_buddy_block_size(mm, block), - yesno(!block->parent), - yesno(buddy)); -} - -static void igt_dump_block(struct i915_buddy_mm *mm, - struct i915_buddy_block *block) -{ - struct i915_buddy_block *buddy; - - __igt_dump_block(mm, block, false); - - buddy = get_buddy(block); - if (buddy) - __igt_dump_block(mm, buddy, true); -} - -static int igt_check_block(struct i915_buddy_mm *mm, - struct i915_buddy_block *block) -{ - struct i915_buddy_block *buddy; - unsigned int block_state; - u64 block_size; - u64 offset; - int err = 0; - - block_state = i915_buddy_block_state(block); - - if (block_state != I915_BUDDY_ALLOCATED && - block_state != I915_BUDDY_FREE && - block_state != I915_BUDDY_SPLIT) { - pr_err("block state mismatch\n"); - err = -EINVAL; - } - - block_size = i915_buddy_block_size(mm, block); - offset = i915_buddy_block_offset(block); - - if (block_size < mm->chunk_size) { - pr_err("block size smaller than min size\n"); - err = -EINVAL; - } - - if (!is_power_of_2(block_size)) { - pr_err("block size not power of two\n"); - err = -EINVAL; - } - - if (!IS_ALIGNED(block_size, mm->chunk_size)) { - pr_err("block size not aligned to min size\n"); - err = -EINVAL; - } - - if (!IS_ALIGNED(offset, mm->chunk_size)) { - pr_err("block offset not aligned to min size\n"); - err = -EINVAL; - } - - if (!IS_ALIGNED(offset, block_size)) { - pr_err("block offset not aligned to block size\n"); - err = -EINVAL; - } - - buddy = get_buddy(block); - - if (!buddy && block->parent) { - pr_err("buddy has gone fishing\n"); - err = -EINVAL; - } - - if (buddy) { - if (i915_buddy_block_offset(buddy) != (offset ^ block_size)) { - pr_err("buddy has wrong offset\n"); - err = -EINVAL; - } - - if (i915_buddy_block_size(mm, buddy) != block_size) { - pr_err("buddy size mismatch\n"); - err = -EINVAL; - } - - if (i915_buddy_block_state(buddy) == block_state && - block_state == I915_BUDDY_FREE) { - pr_err("block and its buddy are free\n"); - err = -EINVAL; - } - } - - return err; -} - -static int igt_check_blocks(struct i915_buddy_mm *mm, - struct list_head *blocks, - u64 expected_size, - bool is_contiguous) -{ - struct i915_buddy_block *block; - struct i915_buddy_block *prev; - u64 total; - int err = 0; - - block = NULL; - prev = NULL; - total = 0; - - list_for_each_entry(block, blocks, link) { - err = igt_check_block(mm, block); - - if (!i915_buddy_block_is_allocated(block)) { - pr_err("block not allocated\n"), - err = -EINVAL; - } - - if (is_contiguous && prev) { - u64 prev_block_size; - u64 prev_offset; - u64 offset; - - prev_offset = i915_buddy_block_offset(prev); - prev_block_size = i915_buddy_block_size(mm, prev); - offset = i915_buddy_block_offset(block); - - if (offset != (prev_offset + prev_block_size)) { - pr_err("block offset mismatch\n"); - err = -EINVAL; - } - } - - if (err) - break; - - total += i915_buddy_block_size(mm, block); - prev = block; - } - - if (!err) { - if (total != expected_size) { - pr_err("size mismatch, expected=%llx, found=%llx\n", - expected_size, total); - err = -EINVAL; - } - return err; - } - - if (prev) { - pr_err("prev block, dump:\n"); - igt_dump_block(mm, prev); - } - - if (block) { - pr_err("bad block, dump:\n"); - igt_dump_block(mm, block); - } - - return err; -} - -static int igt_check_mm(struct i915_buddy_mm *mm) -{ - struct i915_buddy_block *root; - struct i915_buddy_block *prev; - unsigned int i; - u64 total; - int err = 0; - - if (!mm->n_roots) { - pr_err("n_roots is zero\n"); - return -EINVAL; - } - - if (mm->n_roots != hweight64(mm->size)) { - pr_err("n_roots mismatch, n_roots=%u, expected=%lu\n", - mm->n_roots, hweight64(mm->size)); - return -EINVAL; - } - - root = NULL; - prev = NULL; - total = 0; - - for (i = 0; i < mm->n_roots; ++i) { - struct i915_buddy_block *block; - unsigned int order; - - root = mm->roots[i]; - if (!root) { - pr_err("root(%u) is NULL\n", i); - err = -EINVAL; - break; - } - - err = igt_check_block(mm, root); - - if (!i915_buddy_block_is_free(root)) { - pr_err("root not free\n"); - err = -EINVAL; - } - - order = i915_buddy_block_order(root); - - if (!i) { - if (order != mm->max_order) { - pr_err("max order root missing\n"); - err = -EINVAL; - } - } - - if (prev) { - u64 prev_block_size; - u64 prev_offset; - u64 offset; - - prev_offset = i915_buddy_block_offset(prev); - prev_block_size = i915_buddy_block_size(mm, prev); - offset = i915_buddy_block_offset(root); - - if (offset != (prev_offset + prev_block_size)) { - pr_err("root offset mismatch\n"); - err = -EINVAL; - } - } - - block = list_first_entry_or_null(&mm->free_list[order], - struct i915_buddy_block, - link); - if (block != root) { - pr_err("root mismatch at order=%u\n", order); - err = -EINVAL; - } - - if (err) - break; - - prev = root; - total += i915_buddy_block_size(mm, root); - } - - if (!err) { - if (total != mm->size) { - pr_err("expected mm size=%llx, found=%llx\n", mm->size, - total); - err = -EINVAL; - } - return err; - } - - if (prev) { - pr_err("prev root(%u), dump:\n", i - 1); - igt_dump_block(mm, prev); - } - - if (root) { - pr_err("bad root(%u), dump:\n", i); - igt_dump_block(mm, root); - } - - return err; -} - -static void igt_mm_config(u64 *size, u64 *chunk_size) -{ - I915_RND_STATE(prng); - u32 s, ms; - - /* Nothing fancy, just try to get an interesting bit pattern */ - - prandom_seed_state(&prng, i915_selftest.random_seed); - - /* Let size be a random number of pages up to 8 GB (2M pages) */ - s = 1 + i915_prandom_u32_max_state((BIT(33 - 12)) - 1, &prng); - /* Let the chunk size be a random power of 2 less than size */ - ms = BIT(i915_prandom_u32_max_state(ilog2(s), &prng)); - /* Round size down to the chunk size */ - s &= -ms; - - /* Convert from pages to bytes */ - *chunk_size = (u64)ms << 12; - *size = (u64)s << 12; -} - -static int igt_buddy_alloc_smoke(void *arg) -{ - struct i915_buddy_mm mm; - IGT_TIMEOUT(end_time); - I915_RND_STATE(prng); - u64 chunk_size; - u64 mm_size; - int *order; - int err, i; - - igt_mm_config(&mm_size, &chunk_size); - - pr_info("buddy_init with size=%llx, chunk_size=%llx\n", mm_size, chunk_size); - - err = i915_buddy_init(&mm, mm_size, chunk_size); - if (err) { - pr_err("buddy_init failed(%d)\n", err); - return err; - } - - order = i915_random_order(mm.max_order + 1, &prng); - if (!order) - goto out_fini; - - for (i = 0; i <= mm.max_order; ++i) { - struct i915_buddy_block *block; - int max_order = order[i]; - bool timeout = false; - LIST_HEAD(blocks); - int order; - u64 total; - - err = igt_check_mm(&mm); - if (err) { - pr_err("pre-mm check failed, abort\n"); - break; - } - - pr_info("filling from max_order=%u\n", max_order); - - order = max_order; - total = 0; - - do { -retry: - block = i915_buddy_alloc(&mm, order); - if (IS_ERR(block)) { - err = PTR_ERR(block); - if (err == -ENOMEM) { - pr_info("buddy_alloc hit -ENOMEM with order=%d\n", - order); - } else { - if (order--) { - err = 0; - goto retry; - } - - pr_err("buddy_alloc with order=%d failed(%d)\n", - order, err); - } - - break; - } - - list_add_tail(&block->link, &blocks); - - if (i915_buddy_block_order(block) != order) { - pr_err("buddy_alloc order mismatch\n"); - err = -EINVAL; - break; - } - - total += i915_buddy_block_size(&mm, block); - - if (__igt_timeout(end_time, NULL)) { - timeout = true; - break; - } - } while (total < mm.size); - - if (!err) - err = igt_check_blocks(&mm, &blocks, total, false); - - i915_buddy_free_list(&mm, &blocks); - - if (!err) { - err = igt_check_mm(&mm); - if (err) - pr_err("post-mm check failed\n"); - } - - if (err || timeout) - break; - - cond_resched(); - } - - if (err == -ENOMEM) - err = 0; - - kfree(order); -out_fini: - i915_buddy_fini(&mm); - - return err; -} - -static int igt_buddy_alloc_pessimistic(void *arg) -{ - const unsigned int max_order = 16; - struct i915_buddy_block *block, *bn; - struct i915_buddy_mm mm; - unsigned int order; - LIST_HEAD(blocks); - int err; - - /* - * Create a pot-sized mm, then allocate one of each possible - * order within. This should leave the mm with exactly one - * page left. - */ - - err = i915_buddy_init(&mm, PAGE_SIZE << max_order, PAGE_SIZE); - if (err) { - pr_err("buddy_init failed(%d)\n", err); - return err; - } - GEM_BUG_ON(mm.max_order != max_order); - - for (order = 0; order < max_order; order++) { - block = i915_buddy_alloc(&mm, order); - if (IS_ERR(block)) { - pr_info("buddy_alloc hit -ENOMEM with order=%d\n", - order); - err = PTR_ERR(block); - goto err; - } - - list_add_tail(&block->link, &blocks); - } - - /* And now the last remaining block available */ - block = i915_buddy_alloc(&mm, 0); - if (IS_ERR(block)) { - pr_info("buddy_alloc hit -ENOMEM on final alloc\n"); - err = PTR_ERR(block); - goto err; - } - list_add_tail(&block->link, &blocks); - - /* Should be completely full! */ - for (order = max_order; order--; ) { - block = i915_buddy_alloc(&mm, order); - if (!IS_ERR(block)) { - pr_info("buddy_alloc unexpectedly succeeded at order %d, it should be full!", - order); - list_add_tail(&block->link, &blocks); - err = -EINVAL; - goto err; - } - } - - block = list_last_entry(&blocks, typeof(*block), link); - list_del(&block->link); - i915_buddy_free(&mm, block); - - /* As we free in increasing size, we make available larger blocks */ - order = 1; - list_for_each_entry_safe(block, bn, &blocks, link) { - list_del(&block->link); - i915_buddy_free(&mm, block); - - block = i915_buddy_alloc(&mm, order); - if (IS_ERR(block)) { - pr_info("buddy_alloc (realloc) hit -ENOMEM with order=%d\n", - order); - err = PTR_ERR(block); - goto err; - } - i915_buddy_free(&mm, block); - order++; - } - - /* To confirm, now the whole mm should be available */ - block = i915_buddy_alloc(&mm, max_order); - if (IS_ERR(block)) { - pr_info("buddy_alloc (realloc) hit -ENOMEM with order=%d\n", - max_order); - err = PTR_ERR(block); - goto err; - } - i915_buddy_free(&mm, block); - -err: - i915_buddy_free_list(&mm, &blocks); - i915_buddy_fini(&mm); - return err; -} - -static int igt_buddy_alloc_optimistic(void *arg) -{ - const int max_order = 16; - struct i915_buddy_block *block; - struct i915_buddy_mm mm; - LIST_HEAD(blocks); - int order; - int err; - - /* - * Create a mm with one block of each order available, and - * try to allocate them all. - */ - - err = i915_buddy_init(&mm, - PAGE_SIZE * ((1 << (max_order + 1)) - 1), - PAGE_SIZE); - if (err) { - pr_err("buddy_init failed(%d)\n", err); - return err; - } - GEM_BUG_ON(mm.max_order != max_order); - - for (order = 0; order <= max_order; order++) { - block = i915_buddy_alloc(&mm, order); - if (IS_ERR(block)) { - pr_info("buddy_alloc hit -ENOMEM with order=%d\n", - order); - err = PTR_ERR(block); - goto err; - } - - list_add_tail(&block->link, &blocks); - } - - /* Should be completely full! */ - block = i915_buddy_alloc(&mm, 0); - if (!IS_ERR(block)) { - pr_info("buddy_alloc unexpectedly succeeded, it should be full!"); - list_add_tail(&block->link, &blocks); - err = -EINVAL; - goto err; - } - -err: - i915_buddy_free_list(&mm, &blocks); - i915_buddy_fini(&mm); - return err; -} - -static int igt_buddy_alloc_pathological(void *arg) -{ - const int max_order = 16; - struct i915_buddy_block *block; - struct i915_buddy_mm mm; - LIST_HEAD(blocks); - LIST_HEAD(holes); - int order, top; - int err; - - /* - * Create a pot-sized mm, then allocate one of each possible - * order within. This should leave the mm with exactly one - * page left. Free the largest block, then whittle down again. - * Eventually we will have a fully 50% fragmented mm. - */ - - err = i915_buddy_init(&mm, PAGE_SIZE << max_order, PAGE_SIZE); - if (err) { - pr_err("buddy_init failed(%d)\n", err); - return err; - } - GEM_BUG_ON(mm.max_order != max_order); - - for (top = max_order; top; top--) { - /* Make room by freeing the largest allocated block */ - block = list_first_entry_or_null(&blocks, typeof(*block), link); - if (block) { - list_del(&block->link); - i915_buddy_free(&mm, block); - } - - for (order = top; order--; ) { - block = i915_buddy_alloc(&mm, order); - if (IS_ERR(block)) { - pr_info("buddy_alloc hit -ENOMEM with order=%d, top=%d\n", - order, top); - err = PTR_ERR(block); - goto err; - } - list_add_tail(&block->link, &blocks); - } - - /* There should be one final page for this sub-allocation */ - block = i915_buddy_alloc(&mm, 0); - if (IS_ERR(block)) { - pr_info("buddy_alloc hit -ENOMEM for hole\n"); - err = PTR_ERR(block); - goto err; - } - list_add_tail(&block->link, &holes); - - block = i915_buddy_alloc(&mm, top); - if (!IS_ERR(block)) { - pr_info("buddy_alloc unexpectedly succeeded at top-order %d/%d, it should be full!", - top, max_order); - list_add_tail(&block->link, &blocks); - err = -EINVAL; - goto err; - } - } - - i915_buddy_free_list(&mm, &holes); - - /* Nothing larger than blocks of chunk_size now available */ - for (order = 1; order <= max_order; order++) { - block = i915_buddy_alloc(&mm, order); - if (!IS_ERR(block)) { - pr_info("buddy_alloc unexpectedly succeeded at order %d, it should be full!", - order); - list_add_tail(&block->link, &blocks); - err = -EINVAL; - goto err; - } - } - -err: - list_splice_tail(&holes, &blocks); - i915_buddy_free_list(&mm, &blocks); - i915_buddy_fini(&mm); - return err; -} - -static int igt_buddy_alloc_range(void *arg) -{ - struct i915_buddy_mm mm; - unsigned long page_num; - LIST_HEAD(blocks); - u64 chunk_size; - u64 offset; - u64 size; - u64 rem; - int err; - - igt_mm_config(&size, &chunk_size); - - pr_info("buddy_init with size=%llx, chunk_size=%llx\n", size, chunk_size); - - err = i915_buddy_init(&mm, size, chunk_size); - if (err) { - pr_err("buddy_init failed(%d)\n", err); - return err; - } - - err = igt_check_mm(&mm); - if (err) { - pr_err("pre-mm check failed, abort, abort, abort!\n"); - goto err_fini; - } - - rem = mm.size; - offset = 0; - - for_each_prime_number_from(page_num, 1, ULONG_MAX - 1) { - struct i915_buddy_block *block; - LIST_HEAD(tmp); - - size = min(page_num * mm.chunk_size, rem); - - err = i915_buddy_alloc_range(&mm, &tmp, offset, size); - if (err) { - if (err == -ENOMEM) { - pr_info("alloc_range hit -ENOMEM with size=%llx\n", - size); - } else { - pr_err("alloc_range with offset=%llx, size=%llx failed(%d)\n", - offset, size, err); - } - - break; - } - - block = list_first_entry_or_null(&tmp, - struct i915_buddy_block, - link); - if (!block) { - pr_err("alloc_range has no blocks\n"); - err = -EINVAL; - break; - } - - if (i915_buddy_block_offset(block) != offset) { - pr_err("alloc_range start offset mismatch, found=%llx, expected=%llx\n", - i915_buddy_block_offset(block), offset); - err = -EINVAL; - } - - if (!err) - err = igt_check_blocks(&mm, &tmp, size, true); - - list_splice_tail(&tmp, &blocks); - - if (err) - break; - - offset += size; - - rem -= size; - if (!rem) - break; - - cond_resched(); - } - - if (err == -ENOMEM) - err = 0; - - i915_buddy_free_list(&mm, &blocks); - - if (!err) { - err = igt_check_mm(&mm); - if (err) - pr_err("post-mm check failed\n"); - } - -err_fini: - i915_buddy_fini(&mm); - - return err; -} - -static int igt_buddy_alloc_limit(void *arg) -{ - struct i915_buddy_block *block; - struct i915_buddy_mm mm; - const u64 size = U64_MAX; - int err; - - err = i915_buddy_init(&mm, size, PAGE_SIZE); - if (err) - return err; - - if (mm.max_order != I915_BUDDY_MAX_ORDER) { - pr_err("mm.max_order(%d) != %d\n", - mm.max_order, I915_BUDDY_MAX_ORDER); - err = -EINVAL; - goto out_fini; - } - - block = i915_buddy_alloc(&mm, mm.max_order); - if (IS_ERR(block)) { - err = PTR_ERR(block); - goto out_fini; - } - - if (i915_buddy_block_order(block) != mm.max_order) { - pr_err("block order(%d) != %d\n", - i915_buddy_block_order(block), mm.max_order); - err = -EINVAL; - goto out_free; - } - - if (i915_buddy_block_size(&mm, block) != - BIT_ULL(mm.max_order) * PAGE_SIZE) { - pr_err("block size(%llu) != %llu\n", - i915_buddy_block_size(&mm, block), - BIT_ULL(mm.max_order) * PAGE_SIZE); - err = -EINVAL; - goto out_free; - } - -out_free: - i915_buddy_free(&mm, block); -out_fini: - i915_buddy_fini(&mm); - return err; -} - -int i915_buddy_mock_selftests(void) -{ - static const struct i915_subtest tests[] = { - SUBTEST(igt_buddy_alloc_pessimistic), - SUBTEST(igt_buddy_alloc_optimistic), - SUBTEST(igt_buddy_alloc_pathological), - SUBTEST(igt_buddy_alloc_smoke), - SUBTEST(igt_buddy_alloc_range), - SUBTEST(igt_buddy_alloc_limit), - }; - - return i915_subtests(tests, NULL); -} diff --git a/drivers/gpu/drm/i915/selftests/i915_mock_selftests.h b/drivers/gpu/drm/i915/selftests/i915_mock_selftests.h index 3db34d3eea58..34e5caf38093 100644 --- a/drivers/gpu/drm/i915/selftests/i915_mock_selftests.h +++ b/drivers/gpu/drm/i915/selftests/i915_mock_selftests.h @@ -33,5 +33,4 @@ selftest(evict, i915_gem_evict_mock_selftests) selftest(gtt, i915_gem_gtt_mock_selftests) selftest(hugepages, i915_gem_huge_page_mock_selftests) selftest(contexts, i915_gem_context_mock_selftests) -selftest(buddy, i915_buddy_mock_selftests) selftest(memory_region, intel_memory_region_mock_selftests) diff --git a/drivers/gpu/drm/i915/selftests/intel_memory_region.c b/drivers/gpu/drm/i915/selftests/intel_memory_region.c index f85fd8cbfbf5..c85d516b85cd 100644 --- a/drivers/gpu/drm/i915/selftests/intel_memory_region.c +++ b/drivers/gpu/drm/i915/selftests/intel_memory_region.c @@ -57,9 +57,10 @@ static int igt_mock_fill(void *arg) LIST_HEAD(objects); int err = 0; - page_size = mem->mm.chunk_size; - max_pages = div64_u64(total, page_size); + page_size = mem->chunk_size; rem = total; +retry: + max_pages = div64_u64(rem, page_size); for_each_prime_number_from(page_num, 1, max_pages) { resource_size_t size = page_num * page_size; @@ -85,6 +86,11 @@ static int igt_mock_fill(void *arg) err = 0; if (err == -ENXIO) { if (page_num * page_size <= rem) { + if (mem->is_range_manager && max_pages > 1) { + max_pages >>= 1; + goto retry; + } + pr_err("%s failed, space still left in region\n", __func__); err = -EINVAL; @@ -199,12 +205,18 @@ static int igt_mock_reserve(void *arg) do { u32 size = i915_prandom_u32_max_state(cur_avail, &prng); +retry: size = max_t(u32, round_up(size, PAGE_SIZE), PAGE_SIZE); obj = igt_object_create(mem, &objects, size, 0); if (IS_ERR(obj)) { - if (PTR_ERR(obj) == -ENXIO) + if (PTR_ERR(obj) == -ENXIO) { + if (mem->is_range_manager && + size > mem->chunk_size) { + size >>= 1; + goto retry; + } break; - + } err = PTR_ERR(obj); goto out_close; } @@ -220,7 +232,7 @@ static int igt_mock_reserve(void *arg) out_close: kfree(order); close_objects(mem, &objects); - i915_buddy_free_list(&mem->mm, &mem->reserved); + intel_memory_region_unreserve(mem); return err; } @@ -240,7 +252,7 @@ static int igt_mock_contiguous(void *arg) total = resource_size(&mem->region); /* Min size */ - obj = igt_object_create(mem, &objects, mem->mm.chunk_size, + obj = igt_object_create(mem, &objects, mem->chunk_size, I915_BO_ALLOC_CONTIGUOUS); if (IS_ERR(obj)) return PTR_ERR(obj); @@ -321,14 +333,16 @@ static int igt_mock_contiguous(void *arg) min = target; target = total >> 1; - /* Make sure we can still allocate all the fragmented space */ - obj = igt_object_create(mem, &objects, target, 0); - if (IS_ERR(obj)) { - err = PTR_ERR(obj); - goto err_close_objects; - } + if (!mem->is_range_manager) { + /* Make sure we can still allocate all the fragmented space */ + obj = igt_object_create(mem, &objects, target, 0); + if (IS_ERR(obj)) { + err = PTR_ERR(obj); + goto err_close_objects; + } - igt_object_release(obj); + igt_object_release(obj); + } /* * Even though we have enough free space, we don't have a big enough @@ -348,7 +362,7 @@ static int igt_mock_contiguous(void *arg) } target >>= 1; - } while (target >= mem->mm.chunk_size); + } while (target >= mem->chunk_size); err_close_objects: list_splice_tail(&holes, &objects); @@ -368,7 +382,7 @@ static int igt_mock_splintered_region(void *arg) /* * Sanity check we can still allocate everything even if the - * mm.max_order != mm.size. i.e our starting address space size is not a + * max_order != mm.size. i.e our starting address space size is not a * power-of-two. */ @@ -377,17 +391,10 @@ static int igt_mock_splintered_region(void *arg) if (IS_ERR(mem)) return PTR_ERR(mem); - if (mem->mm.size != size) { - pr_err("%s size mismatch(%llu != %llu)\n", - __func__, mem->mm.size, size); - err = -EINVAL; - goto out_put; - } - expected_order = get_order(rounddown_pow_of_two(size)); - if (mem->mm.max_order != expected_order) { + if (mem->max_order != expected_order) { pr_err("%s order mismatch(%u != %u)\n", - __func__, mem->mm.max_order, expected_order); + __func__, mem->max_order, expected_order); err = -EINVAL; goto out_put; } @@ -408,12 +415,15 @@ static int igt_mock_splintered_region(void *arg) * sure that does indeed hold true. */ - obj = igt_object_create(mem, &objects, size, I915_BO_ALLOC_CONTIGUOUS); - if (!IS_ERR(obj)) { - pr_err("%s too large contiguous allocation was not rejected\n", - __func__); - err = -EINVAL; - goto out_close; + if (!mem->is_range_manager) { + obj = igt_object_create(mem, &objects, size, + I915_BO_ALLOC_CONTIGUOUS); + if (!IS_ERR(obj)) { + pr_err("%s too large contiguous allocation was not rejected\n", + __func__); + err = -EINVAL; + goto out_close; + } } obj = igt_object_create(mem, &objects, rounddown_pow_of_two(size), @@ -432,68 +442,6 @@ static int igt_mock_splintered_region(void *arg) return err; } -#ifndef SZ_8G -#define SZ_8G BIT_ULL(33) -#endif - -static int igt_mock_max_segment(void *arg) -{ - const unsigned int max_segment = i915_sg_segment_size(); - struct intel_memory_region *mem = arg; - struct drm_i915_private *i915 = mem->i915; - struct drm_i915_gem_object *obj; - struct i915_buddy_block *block; - struct scatterlist *sg; - LIST_HEAD(objects); - u64 size; - int err = 0; - - /* - * While we may create very large contiguous blocks, we may need - * to break those down for consumption elsewhere. In particular, - * dma-mapping with scatterlist elements have an implicit limit of - * UINT_MAX on each element. - */ - - size = SZ_8G; - mem = mock_region_create(i915, 0, size, PAGE_SIZE, 0); - if (IS_ERR(mem)) - return PTR_ERR(mem); - - obj = igt_object_create(mem, &objects, size, 0); - if (IS_ERR(obj)) { - err = PTR_ERR(obj); - goto out_put; - } - - size = 0; - list_for_each_entry(block, &obj->mm.blocks, link) { - if (i915_buddy_block_size(&mem->mm, block) > size) - size = i915_buddy_block_size(&mem->mm, block); - } - if (size < max_segment) { - pr_err("%s: Failed to create a huge contiguous block [> %u], largest block %lld\n", - __func__, max_segment, size); - err = -EINVAL; - goto out_close; - } - - for (sg = obj->mm.pages->sgl; sg; sg = sg_next(sg)) { - if (sg->length > max_segment) { - pr_err("%s: Created an oversized scatterlist entry, %u > %u\n", - __func__, sg->length, max_segment); - err = -EINVAL; - goto out_close; - } - } - -out_close: - close_objects(mem, &objects); -out_put: - intel_memory_region_put(mem); - return err; -} - static int igt_gpu_write_dw(struct intel_context *ce, struct i915_vma *vma, u32 dword, @@ -1098,7 +1046,6 @@ int intel_memory_region_mock_selftests(void) SUBTEST(igt_mock_fill), SUBTEST(igt_mock_contiguous), SUBTEST(igt_mock_splintered_region), - SUBTEST(igt_mock_max_segment), }; struct intel_memory_region *mem; struct drm_i915_private *i915; diff --git a/drivers/gpu/drm/i915/selftests/mock_region.c b/drivers/gpu/drm/i915/selftests/mock_region.c index 5d2d010a1e22..d61387fda945 100644 --- a/drivers/gpu/drm/i915/selftests/mock_region.c +++ b/drivers/gpu/drm/i915/selftests/mock_region.c @@ -1,17 +1,54 @@ // SPDX-License-Identifier: MIT /* - * Copyright © 2019 Intel Corporation + * Copyright © 2019-2021 Intel Corporation */ +#include + #include "gem/i915_gem_region.h" #include "intel_memory_region.h" +#include "intel_region_ttm.h" #include "mock_region.h" +static void mock_region_put_pages(struct drm_i915_gem_object *obj, + struct sg_table *pages) +{ + intel_region_ttm_node_free(obj->mm.region, obj->mm.st_mm_node); + sg_free_table(pages); + kfree(pages); +} + +static int mock_region_get_pages(struct drm_i915_gem_object *obj) +{ + unsigned int flags; + struct sg_table *pages; + + flags = I915_ALLOC_MIN_PAGE_SIZE; + if (obj->flags & I915_BO_ALLOC_CONTIGUOUS) + flags |= I915_ALLOC_CONTIGUOUS; + + obj->mm.st_mm_node = intel_region_ttm_node_alloc(obj->mm.region, + obj->base.size, + flags); + if (IS_ERR(obj->mm.st_mm_node)) + return PTR_ERR(obj->mm.st_mm_node); + + pages = intel_region_ttm_node_to_st(obj->mm.region, obj->mm.st_mm_node); + if (IS_ERR(pages)) { + intel_region_ttm_node_free(obj->mm.region, obj->mm.st_mm_node); + return PTR_ERR(pages); + } + + __i915_gem_object_set_pages(obj, pages, i915_sg_dma_sizes(pages->sgl)); + + return 0; +} + static const struct drm_i915_gem_object_ops mock_region_obj_ops = { .name = "mock-region", - .get_pages = i915_gem_object_get_pages_buddy, - .put_pages = i915_gem_object_put_pages_buddy, + .get_pages = mock_region_get_pages, + .put_pages = mock_region_put_pages, .release = i915_gem_object_release_memory_region, }; @@ -23,7 +60,7 @@ static int mock_object_init(struct intel_memory_region *mem, static struct lock_class_key lock_class; struct drm_i915_private *i915 = mem->i915; - if (size > mem->mm.size) + if (size > resource_size(&mem->region)) return -E2BIG; drm_gem_private_object_init(&i915->drm, &obj->base, size); @@ -39,8 +76,8 @@ static int mock_object_init(struct intel_memory_region *mem, } static const struct intel_memory_region_ops mock_region_ops = { - .init = intel_memory_region_init_buddy, - .release = intel_memory_region_release_buddy, + .init = intel_region_ttm_init_mock, + .release = intel_region_ttm_fini_mock, .init_object = mock_object_init, }; @@ -52,5 +89,6 @@ mock_region_create(struct drm_i915_private *i915, resource_size_t io_start) { return intel_memory_region_create(i915, start, size, min_page_size, - io_start, &mock_region_ops); + io_start, INTEL_MEMORY_MOCK, 0, + &mock_region_ops); } -- 2.31.1 From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.7 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT 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 0CE02C4707E for ; Fri, 21 May 2021 15:33:30 +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 CFA216135B for ; Fri, 21 May 2021 15:33:29 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org CFA216135B Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=linux.intel.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=intel-gfx-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 58EDA6EE11; Fri, 21 May 2021 15:33:22 +0000 (UTC) Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by gabe.freedesktop.org (Postfix) with ESMTPS id BFDD96EC56; Fri, 21 May 2021 15:33:14 +0000 (UTC) IronPort-SDR: QhhrZq/yxc7NjfpugSUVdTRjRf8oL8X+z9HFINuMlhgxAxRgW7QwmPqzWdss5eYgz/k8/Lx657 DnAa/2NFqIjQ== X-IronPort-AV: E=McAfee;i="6200,9189,9990"; a="265415704" X-IronPort-AV: E=Sophos;i="5.82,319,1613462400"; d="scan'208";a="265415704" Received: from fmsmga008.fm.intel.com ([10.253.24.58]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 21 May 2021 08:33:14 -0700 IronPort-SDR: kOIZYZ8aUE26ZiopgFSm0pto7felqxDcrzYSH1ZszazQVNjkwiMJ/zu+ZkRJmDFSt9zTf32bB4 Cbr8R1BbSlfw== X-IronPort-AV: E=Sophos;i="5.82,319,1613462400"; d="scan'208";a="441125399" Received: from imarinmo-mobl1.ger.corp.intel.com (HELO thellst-mobl1.intel.com) ([10.249.254.34]) by fmsmga008-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 21 May 2021 08:33:12 -0700 From: =?UTF-8?q?Thomas=20Hellstr=C3=B6m?= To: intel-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org Date: Fri, 21 May 2021 17:32:45 +0200 Message-Id: <20210521153253.518037-5-thomas.hellstrom@linux.intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210521153253.518037-1-thomas.hellstrom@linux.intel.com> References: <20210521153253.518037-1-thomas.hellstrom@linux.intel.com> MIME-Version: 1.0 Subject: [Intel-gfx] [PATCH v3 04/12] drm/i915/ttm Initialize the ttm device and memory managers X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: =?UTF-8?q?Thomas=20Hellstr=C3=B6m?= , Matthew Auld Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" VGVtcG9yYXJpbHkgcmVtb3ZlIHRoZSBidWRkeSBhbGxvY2F0b3IgYW5kIHJlbGF0ZWQgc2VsZnRl c3RzCmFuZCBob29rIHVwIHRoZSBUVE0gcmFuZ2UgbWFuYWdlciBmb3IgaTkxNSByZWdpb25zLgoK QWxzbyBtb2RpZnkgdGhlIG1vY2sgcmVnaW9uIHNlbGZ0ZXN0cyBzb21ld2hhdCB0byBhY2NvdW50 IGZvciBhCmZyYWdtZW50aW5nIG1hbmFnZXIuCgpTaWduZWQtb2ZmLWJ5OiBUaG9tYXMgSGVsbHN0 csO2bSA8dGhvbWFzLmhlbGxzdHJvbUBsaW51eC5pbnRlbC5jb20+ClJldmlld2VkLWJ5OiBNYXR0 aGV3IEF1bGQgPG1hdHRoZXcuYXVsZEBpbnRlbC5jb20+ICN2MgotLS0KdjI6Ci0gRml4IGFuIGVy cm9yIHVud2luZCBpbiBsbWVtX2dldF9wYWdlcygpIChSZXBvcnRlZCBieSBNYXR0aGV3IEF1bGQp Ci0gQnJlYWsgb3V0IGFuZCBtb2RpZnkgdXNhZ2Ugb2YgaTkxNV9zZ19kbWFfc2l6ZXMoKSAoUmVw b3J0ZWQgYnkgTWF0dGV3IEF1bGQpCi0gQnJlYWsgb3V0IFRUTSBjaGFuZ2VzIHRvIGEgc2VwYXJh dGUgcGF0Y2ggKFJlcG9ydGVkIGJ5IENocmlzdGlhbiBLw7ZuaWcpCnYzOgotIEZpeCB0aGUgc2Ft ZSBlcnJvciB1bndpbmQgaW4gbW9ja19yZWdpb25fZ2V0X3BhZ2VzKCkKKFJlcG9ydGVkIGJ5IE1h dHRoZXcgQXVsZCkKLSBEb24ndCByZWx5IG9uIG5ldyBUVE0gZnVuY3Rpb25hbGl0eSwgYnV0IGNy ZWF0ZSBhIG1vY2sgVFRNIGRldmljZSwKKFJlcG9ydGVkIGJ5IENocmlzdGlhbiBLw7ZuaWcpCi0t LQogZHJpdmVycy9ncHUvZHJtL2k5MTUvS2NvbmZpZyAgICAgICAgICAgICAgICAgIHwgICAxICsK IGRyaXZlcnMvZ3B1L2RybS9pOTE1L01ha2VmaWxlICAgICAgICAgICAgICAgICB8ICAgMiArLQog ZHJpdmVycy9ncHUvZHJtL2k5MTUvZ2VtL2k5MTVfZ2VtX2xtZW0uYyAgICAgIHwgIDU5ICstCiAu Li4vZ3B1L2RybS9pOTE1L2dlbS9pOTE1X2dlbV9vYmplY3RfdHlwZXMuaCAgfCAgIDYgKy0KIGRy aXZlcnMvZ3B1L2RybS9pOTE1L2dlbS9pOTE1X2dlbV9wYWdlcy5jICAgICB8ICAgMyArLQogZHJp dmVycy9ncHUvZHJtL2k5MTUvZ2VtL2k5MTVfZ2VtX3JlZ2lvbi5jICAgIHwgMTIwIC0tLQogZHJp dmVycy9ncHUvZHJtL2k5MTUvZ2VtL2k5MTVfZ2VtX3JlZ2lvbi5oICAgIHwgICA0IC0KIGRyaXZl cnMvZ3B1L2RybS9pOTE1L2dlbS9pOTE1X2dlbV9zaG1lbS5jICAgICB8ICAgNCArLQogZHJpdmVy cy9ncHUvZHJtL2k5MTUvZ2VtL2k5MTVfZ2VtX3N0b2xlbi5jICAgIHwgIDEwICstCiBkcml2ZXJz L2dwdS9kcm0vaTkxNS9nZW0vaTkxNV9nZW1fc3RvbGVuLmggICAgfCAgIDkgKy0KIGRyaXZlcnMv Z3B1L2RybS9pOTE1L2d0L2ludGVsX2d0LmMgICAgICAgICAgICB8ICAgMiAtCiBkcml2ZXJzL2dw dS9kcm0vaTkxNS9ndC9pbnRlbF9yZWdpb25fbG1lbS5jICAgfCAgMjcgKy0KIGRyaXZlcnMvZ3B1 L2RybS9pOTE1L2k5MTVfYnVkZHkuYyAgICAgICAgICAgICB8IDQzNSAtLS0tLS0tLS0tCiBkcml2 ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2J1ZGR5LmggICAgICAgICAgICAgfCAxMzEgLS0tCiBkcml2 ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5jICAgICAgICAgICAgICAgfCAgIDggKwogZHJpdmVy cy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuaCAgICAgICAgICAgICAgIHwgICA3ICstCiBkcml2ZXJz L2dwdS9kcm0vaTkxNS9pOTE1X2dlbS5jICAgICAgICAgICAgICAgfCAgIDEgKwogZHJpdmVycy9n cHUvZHJtL2k5MTUvaTkxNV9nbG9iYWxzLmMgICAgICAgICAgIHwgICAxIC0KIGRyaXZlcnMvZ3B1 L2RybS9pOTE1L2k5MTVfZ2xvYmFscy5oICAgICAgICAgICB8ICAgMSAtCiBkcml2ZXJzL2dwdS9k cm0vaTkxNS9pOTE1X3NjYXR0ZXJsaXN0LmMgICAgICAgfCAgNzAgKysKIGRyaXZlcnMvZ3B1L2Ry bS9pOTE1L2k5MTVfc2NhdHRlcmxpc3QuaCAgICAgICB8ICAgNCArCiBkcml2ZXJzL2dwdS9kcm0v aTkxNS9pbnRlbF9tZW1vcnlfcmVnaW9uLmMgICAgfCAxODAgKystLQogZHJpdmVycy9ncHUvZHJt L2k5MTUvaW50ZWxfbWVtb3J5X3JlZ2lvbi5oICAgIHwgIDQ0ICstCiBkcml2ZXJzL2dwdS9kcm0v aTkxNS9pbnRlbF9yZWdpb25fdHRtLmMgICAgICAgfCAzMzQgKysrKysrKysKIGRyaXZlcnMvZ3B1 L2RybS9pOTE1L2ludGVsX3JlZ2lvbl90dG0uaCAgICAgICB8ICAzOCArCiBkcml2ZXJzL2dwdS9k cm0vaTkxNS9zZWxmdGVzdHMvaTkxNV9idWRkeS5jICAgfCA3ODkgLS0tLS0tLS0tLS0tLS0tLS0t CiAuLi4vZHJtL2k5MTUvc2VsZnRlc3RzL2k5MTVfbW9ja19zZWxmdGVzdHMuaCAgfCAgIDEgLQog Li4uL2RybS9pOTE1L3NlbGZ0ZXN0cy9pbnRlbF9tZW1vcnlfcmVnaW9uLmMgIHwgMTMzICstLQog ZHJpdmVycy9ncHUvZHJtL2k5MTUvc2VsZnRlc3RzL21vY2tfcmVnaW9uLmMgIHwgIDUyICstCiAy OSBmaWxlcyBjaGFuZ2VkLCA3MjIgaW5zZXJ0aW9ucygrKSwgMTc1NCBkZWxldGlvbnMoLSkKIGRl bGV0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2J1ZGR5LmMKIGRlbGV0 ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2J1ZGR5LmgKIGNyZWF0ZSBt b2RlIDEwMDY0NCBkcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9yZWdpb25fdHRtLmMKIGNyZWF0 ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9yZWdpb25fdHRtLmgKIGRl bGV0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dwdS9kcm0vaTkxNS9zZWxmdGVzdHMvaTkxNV9idWRk eS5jCgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvS2NvbmZpZyBiL2RyaXZlcnMv Z3B1L2RybS9pOTE1L0tjb25maWcKaW5kZXggMWUxY2IyNDVmY2E3Li5iNjNkMzc0ZGZmMjMgMTAw NjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L0tjb25maWcKKysrIGIvZHJpdmVycy9ncHUv ZHJtL2k5MTUvS2NvbmZpZwpAQCAtMjYsNiArMjYsNyBAQCBjb25maWcgRFJNX0k5MTUKIAlzZWxl Y3QgU05EX0hEQV9JOTE1IGlmIFNORF9IREFfQ09SRQogCXNlbGVjdCBDRUNfQ09SRSBpZiBDRUNf Tk9USUZJRVIKIAlzZWxlY3QgVk1BUF9QRk4KKwlzZWxlY3QgRFJNX1RUTQogCWhlbHAKIAkgIENo b29zZSB0aGlzIG9wdGlvbiBpZiB5b3UgaGF2ZSBhIHN5c3RlbSB0aGF0IGhhcyAiSW50ZWwgR3Jh cGhpY3MKIAkgIE1lZGlhIEFjY2VsZXJhdG9yIiBvciAiSEQgR3JhcGhpY3MiIGludGVncmF0ZWQg Z3JhcGhpY3MsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9NYWtlZmlsZSBiL2Ry aXZlcnMvZ3B1L2RybS9pOTE1L01ha2VmaWxlCmluZGV4IGQwZDkzNmQ5MTM3Yi4uY2I4ODIzNTcw OTk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9NYWtlZmlsZQorKysgYi9kcml2 ZXJzL2dwdS9kcm0vaTkxNS9NYWtlZmlsZQpAQCAtNTAsNiArNTAsNyBAQCBpOTE1LXkgKz0gaTkx NV9kcnYubyBcCiAJICBpbnRlbF9tZW1vcnlfcmVnaW9uLm8gXAogCSAgaW50ZWxfcGNoLm8gXAog CSAgaW50ZWxfcG0ubyBcCisJICBpbnRlbF9yZWdpb25fdHRtLm8gXAogCSAgaW50ZWxfcnVudGlt ZV9wbS5vIFwKIAkgIGludGVsX3NpZGViYW5kLm8gXAogCSAgaW50ZWxfc3RlcC5vIFwKQEAgLTE2 MCw3ICsxNjEsNiBAQCBnZW0teSArPSBcCiBpOTE1LXkgKz0gXAogCSAgJChnZW0teSkgXAogCSAg aTkxNV9hY3RpdmUubyBcCi0JICBpOTE1X2J1ZGR5Lm8gXAogCSAgaTkxNV9jbWRfcGFyc2VyLm8g XAogCSAgaTkxNV9nZW1fZXZpY3QubyBcCiAJICBpOTE1X2dlbV9ndHQubyBcCmRpZmYgLS1naXQg YS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9nZW0vaTkxNV9nZW1fbG1lbS5jIGIvZHJpdmVycy9ncHUv ZHJtL2k5MTUvZ2VtL2k5MTVfZ2VtX2xtZW0uYwppbmRleCBmNDRiZGQwOGY3Y2IuLjNiNGFhMjhh MDc2ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ2VtL2k5MTVfZ2VtX2xtZW0u YworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9nZW0vaTkxNV9nZW1fbG1lbS5jCkBAIC00LDE2 ICs0LDcxIEBACiAgKi8KIAogI2luY2x1ZGUgImludGVsX21lbW9yeV9yZWdpb24uaCIKKyNpbmNs dWRlICJpbnRlbF9yZWdpb25fdHRtLmgiCiAjaW5jbHVkZSAiZ2VtL2k5MTVfZ2VtX3JlZ2lvbi5o IgogI2luY2x1ZGUgImdlbS9pOTE1X2dlbV9sbWVtLmgiCiAjaW5jbHVkZSAiaTkxNV9kcnYuaCIK IAorc3RhdGljIHZvaWQgbG1lbV9wdXRfcGFnZXMoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3Qg Km9iaiwKKwkJCSAgIHN0cnVjdCBzZ190YWJsZSAqcGFnZXMpCit7CisJaW50ZWxfcmVnaW9uX3R0 bV9ub2RlX2ZyZWUob2JqLT5tbS5yZWdpb24sIG9iai0+bW0uc3RfbW1fbm9kZSk7CisJb2JqLT5t bS5kaXJ0eSA9IGZhbHNlOworCXNnX2ZyZWVfdGFibGUocGFnZXMpOworCWtmcmVlKHBhZ2VzKTsK K30KKworc3RhdGljIGludCBsbWVtX2dldF9wYWdlcyhzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVj dCAqb2JqKQoreworCXVuc2lnbmVkIGludCBmbGFnczsKKwlzdHJ1Y3Qgc2dfdGFibGUgKnBhZ2Vz OworCisJZmxhZ3MgPSBJOTE1X0FMTE9DX01JTl9QQUdFX1NJWkU7CisJaWYgKG9iai0+ZmxhZ3Mg JiBJOTE1X0JPX0FMTE9DX0NPTlRJR1VPVVMpCisJCWZsYWdzIHw9IEk5MTVfQUxMT0NfQ09OVElH VU9VUzsKKworCW9iai0+bW0uc3RfbW1fbm9kZSA9IGludGVsX3JlZ2lvbl90dG1fbm9kZV9hbGxv YyhvYmotPm1tLnJlZ2lvbiwKKwkJCQkJCQkgb2JqLT5iYXNlLnNpemUsCisJCQkJCQkJIGZsYWdz KTsKKwlpZiAoSVNfRVJSKG9iai0+bW0uc3RfbW1fbm9kZSkpCisJCXJldHVybiBQVFJfRVJSKG9i ai0+bW0uc3RfbW1fbm9kZSk7CisKKwkvKiBSYW5nZSBtYW5hZ2VyIGlzIGFsd2F5cyBjb250aWdv dXMgKi8KKwlpZiAob2JqLT5tbS5yZWdpb24tPmlzX3JhbmdlX21hbmFnZXIpCisJCW9iai0+Zmxh Z3MgfD0gSTkxNV9CT19BTExPQ19DT05USUdVT1VTOworCXBhZ2VzID0gaW50ZWxfcmVnaW9uX3R0 bV9ub2RlX3RvX3N0KG9iai0+bW0ucmVnaW9uLCBvYmotPm1tLnN0X21tX25vZGUpOworCWlmIChJ U19FUlIocGFnZXMpKSB7CisJCWludGVsX3JlZ2lvbl90dG1fbm9kZV9mcmVlKG9iai0+bW0ucmVn aW9uLCBvYmotPm1tLnN0X21tX25vZGUpOworCQlyZXR1cm4gUFRSX0VSUihwYWdlcyk7CisJfQor CisJX19pOTE1X2dlbV9vYmplY3Rfc2V0X3BhZ2VzKG9iaiwgcGFnZXMsIGk5MTVfc2dfZG1hX3Np emVzKHBhZ2VzLT5zZ2wpKTsKKworCWlmIChvYmotPmZsYWdzICYgSTkxNV9CT19BTExPQ19DUFVf Q0xFQVIpIHsKKwkJdm9pZCBfX2lvbWVtICp2YWRkciA9CisJCQlpOTE1X2dlbV9vYmplY3RfbG1l bV9pb19tYXAob2JqLCAwLCBvYmotPmJhc2Uuc2l6ZSk7CisKKwkJaWYgKCF2YWRkcikgeworCQkJ c3RydWN0IHNnX3RhYmxlICpwYWdlcyA9CisJCQkJX19pOTE1X2dlbV9vYmplY3RfdW5zZXRfcGFn ZXMob2JqKTsKKworCQkJaWYgKCFJU19FUlJfT1JfTlVMTChwYWdlcykpCisJCQkJbG1lbV9wdXRf cGFnZXMob2JqLCBwYWdlcyk7CisJCX0KKworCQltZW1zZXRfaW8odmFkZHIsIDAsIG9iai0+YmFz ZS5zaXplKTsKKwkJaW9fbWFwcGluZ191bm1hcCh2YWRkcik7CisJfQorCisJcmV0dXJuIDA7Cit9 CisKIGNvbnN0IHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0X29wcyBpOTE1X2dlbV9sbWVtX29i al9vcHMgPSB7CiAJLm5hbWUgPSAiaTkxNV9nZW1fb2JqZWN0X2xtZW0iLAogCS5mbGFncyA9IEk5 MTVfR0VNX09CSkVDVF9IQVNfSU9NRU0sCiAKLQkuZ2V0X3BhZ2VzID0gaTkxNV9nZW1fb2JqZWN0 X2dldF9wYWdlc19idWRkeSwKLQkucHV0X3BhZ2VzID0gaTkxNV9nZW1fb2JqZWN0X3B1dF9wYWdl c19idWRkeSwKKwkuZ2V0X3BhZ2VzID0gbG1lbV9nZXRfcGFnZXMsCisJLnB1dF9wYWdlcyA9IGxt ZW1fcHV0X3BhZ2VzLAogCS5yZWxlYXNlID0gaTkxNV9nZW1fb2JqZWN0X3JlbGVhc2VfbWVtb3J5 X3JlZ2lvbiwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2dlbS9pOTE1 X2dlbV9vYmplY3RfdHlwZXMuaCBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2dlbS9pOTE1X2dlbV9v YmplY3RfdHlwZXMuaAppbmRleCAwNDE1Zjk5YjZiOTUuLmY1YjQ2ZDExZTZlNiAxMDA2NDQKLS0t IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ2VtL2k5MTVfZ2VtX29iamVjdF90eXBlcy5oCisrKyBi L2RyaXZlcnMvZ3B1L2RybS9pOTE1L2dlbS9pOTE1X2dlbV9vYmplY3RfdHlwZXMuaApAQCAtMjM1 LDEwICsyMzUsMTIgQEAgc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgewogCQkgKiBNZW1vcnkg cmVnaW9uIGZvciB0aGlzIG9iamVjdC4KIAkJICovCiAJCXN0cnVjdCBpbnRlbF9tZW1vcnlfcmVn aW9uICpyZWdpb247CisKIAkJLyoqCi0JCSAqIExpc3Qgb2YgbWVtb3J5IHJlZ2lvbiBibG9ja3Mg YWxsb2NhdGVkIGZvciB0aGlzIG9iamVjdC4KKwkJICogTWVtb3J5IG1hbmFnZXIgbm9kZSBhbGxv Y2F0ZWQgZm9yIHRoaXMgb2JqZWN0LgogCQkgKi8KLQkJc3RydWN0IGxpc3RfaGVhZCBibG9ja3M7 CisJCXZvaWQgKnN0X21tX25vZGU7CisKIAkJLyoqCiAJCSAqIEVsZW1lbnQgd2l0aGluIG1lbW9y eV9yZWdpb24tPm9iamVjdHMgb3IgcmVnaW9uLT5wdXJnZWFibGUKIAkJICogaWYgdGhlIG9iamVj dCBpcyBtYXJrZWQgYXMgRE9OVE5FRUQuIEFjY2VzcyBpcyBwcm90ZWN0ZWQgYnkKZGlmZiAtLWdp dCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2dlbS9pOTE1X2dlbV9wYWdlcy5jIGIvZHJpdmVycy9n cHUvZHJtL2k5MTUvZ2VtL2k5MTVfZ2VtX3BhZ2VzLmMKaW5kZXggYWVkOGEzN2NjZGM5Li42MmVl MjE4NWE0MWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2dlbS9pOTE1X2dlbV9w YWdlcy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2dlbS9pOTE1X2dlbV9wYWdlcy5jCkBA IC00NzMsNyArNDczLDggQEAgX19pOTE1X2dlbV9vYmplY3RfZ2V0X3NnKHN0cnVjdCBkcm1faTkx NV9nZW1fb2JqZWN0ICpvYmosCiAKIAltaWdodF9zbGVlcCgpOwogCUdFTV9CVUdfT04obiA+PSBv YmotPmJhc2Uuc2l6ZSA+PiBQQUdFX1NISUZUKTsKLQlHRU1fQlVHX09OKCFpOTE1X2dlbV9vYmpl Y3RfaGFzX3Bpbm5lZF9wYWdlcyhvYmopKTsKKwlpZiAoIWk5MTVfZ2VtX29iamVjdF9oYXNfcGlu bmVkX3BhZ2VzKG9iaikpCisJCWFzc2VydF9vYmplY3RfaGVsZChvYmopOwogCiAJLyogQXMgd2Ug aXRlcmF0ZSBmb3J3YXJkIHRocm91Z2ggdGhlIHNnLCB3ZSByZWNvcmQgZWFjaCBlbnRyeSBpbiBh CiAJICogcmFkaXh0cmVlIGZvciBxdWljayByZXBlYXRlZCAoYmFja3dhcmRzKSBsb29rdXBzLiBJ ZiB3ZSBoYXZlIHNlZW4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2dlbS9pOTE1 X2dlbV9yZWdpb24uYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2dlbS9pOTE1X2dlbV9yZWdpb24u YwppbmRleCBjZThmY2ZjNTQwNzkuLmYyNWU2NjQ2YzViNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9n cHUvZHJtL2k5MTUvZ2VtL2k5MTVfZ2VtX3JlZ2lvbi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9p OTE1L2dlbS9pOTE1X2dlbV9yZWdpb24uYwpAQCAtOCwxMjkgKzgsOSBAQAogI2luY2x1ZGUgImk5 MTVfZHJ2LmgiCiAjaW5jbHVkZSAiaTkxNV90cmFjZS5oIgogCi12b2lkCi1pOTE1X2dlbV9vYmpl Y3RfcHV0X3BhZ2VzX2J1ZGR5KHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosCi0JCQkJ c3RydWN0IHNnX3RhYmxlICpwYWdlcykKLXsKLQlfX2ludGVsX21lbW9yeV9yZWdpb25fcHV0X3Bh Z2VzX2J1ZGR5KG9iai0+bW0ucmVnaW9uLCAmb2JqLT5tbS5ibG9ja3MpOwotCi0Jb2JqLT5tbS5k aXJ0eSA9IGZhbHNlOwotCXNnX2ZyZWVfdGFibGUocGFnZXMpOwotCWtmcmVlKHBhZ2VzKTsKLX0K LQotaW50Ci1pOTE1X2dlbV9vYmplY3RfZ2V0X3BhZ2VzX2J1ZGR5KHN0cnVjdCBkcm1faTkxNV9n ZW1fb2JqZWN0ICpvYmopCi17Ci0JY29uc3QgdTY0IG1heF9zZWdtZW50ID0gaTkxNV9zZ19zZWdt ZW50X3NpemUoKTsKLQlzdHJ1Y3QgaW50ZWxfbWVtb3J5X3JlZ2lvbiAqbWVtID0gb2JqLT5tbS5y ZWdpb247Ci0Jc3RydWN0IGxpc3RfaGVhZCAqYmxvY2tzID0gJm9iai0+bW0uYmxvY2tzOwotCXJl c291cmNlX3NpemVfdCBzaXplID0gb2JqLT5iYXNlLnNpemU7Ci0JcmVzb3VyY2Vfc2l6ZV90IHBy ZXZfZW5kOwotCXN0cnVjdCBpOTE1X2J1ZGR5X2Jsb2NrICpibG9jazsKLQl1bnNpZ25lZCBpbnQg ZmxhZ3M7Ci0Jc3RydWN0IHNnX3RhYmxlICpzdDsKLQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOwot CXVuc2lnbmVkIGludCBzZ19wYWdlX3NpemVzOwotCWludCByZXQ7Ci0KLQlzdCA9IGttYWxsb2Mo c2l6ZW9mKCpzdCksIEdGUF9LRVJORUwpOwotCWlmICghc3QpCi0JCXJldHVybiAtRU5PTUVNOwot Ci0JaWYgKHNnX2FsbG9jX3RhYmxlKHN0LCBzaXplID4+IFBBR0VfU0hJRlQsIEdGUF9LRVJORUwp KSB7Ci0JCWtmcmVlKHN0KTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JZmxhZ3MgPSBJOTE1 X0FMTE9DX01JTl9QQUdFX1NJWkU7Ci0JaWYgKG9iai0+ZmxhZ3MgJiBJOTE1X0JPX0FMTE9DX0NP TlRJR1VPVVMpCi0JCWZsYWdzIHw9IEk5MTVfQUxMT0NfQ09OVElHVU9VUzsKLQotCXJldCA9IF9f aW50ZWxfbWVtb3J5X3JlZ2lvbl9nZXRfcGFnZXNfYnVkZHkobWVtLCBzaXplLCBmbGFncywgYmxv Y2tzKTsKLQlpZiAocmV0KQotCQlnb3RvIGVycl9mcmVlX3NnOwotCi0JR0VNX0JVR19PTihsaXN0 X2VtcHR5KGJsb2NrcykpOwotCi0Jc2cgPSBzdC0+c2dsOwotCXN0LT5uZW50cyA9IDA7Ci0Jc2df cGFnZV9zaXplcyA9IDA7Ci0JcHJldl9lbmQgPSAocmVzb3VyY2Vfc2l6ZV90KS0xOwotCi0JbGlz dF9mb3JfZWFjaF9lbnRyeShibG9jaywgYmxvY2tzLCBsaW5rKSB7Ci0JCXU2NCBibG9ja19zaXpl LCBvZmZzZXQ7Ci0KLQkJYmxvY2tfc2l6ZSA9IG1pbl90KHU2NCwgc2l6ZSwKLQkJCQkgICBpOTE1 X2J1ZGR5X2Jsb2NrX3NpemUoJm1lbS0+bW0sIGJsb2NrKSk7Ci0JCW9mZnNldCA9IGk5MTVfYnVk ZHlfYmxvY2tfb2Zmc2V0KGJsb2NrKTsKLQotCQl3aGlsZSAoYmxvY2tfc2l6ZSkgewotCQkJdTY0 IGxlbjsKLQotCQkJaWYgKG9mZnNldCAhPSBwcmV2X2VuZCB8fCBzZy0+bGVuZ3RoID49IG1heF9z ZWdtZW50KSB7Ci0JCQkJaWYgKHN0LT5uZW50cykgewotCQkJCQlzZ19wYWdlX3NpemVzIHw9IHNn LT5sZW5ndGg7Ci0JCQkJCXNnID0gX19zZ19uZXh0KHNnKTsKLQkJCQl9Ci0KLQkJCQlzZ19kbWFf YWRkcmVzcyhzZykgPSBtZW0tPnJlZ2lvbi5zdGFydCArIG9mZnNldDsKLQkJCQlzZ19kbWFfbGVu KHNnKSA9IDA7Ci0JCQkJc2ctPmxlbmd0aCA9IDA7Ci0JCQkJc3QtPm5lbnRzKys7Ci0JCQl9Ci0K LQkJCWxlbiA9IG1pbihibG9ja19zaXplLCBtYXhfc2VnbWVudCAtIHNnLT5sZW5ndGgpOwotCQkJ c2ctPmxlbmd0aCArPSBsZW47Ci0JCQlzZ19kbWFfbGVuKHNnKSArPSBsZW47Ci0KLQkJCW9mZnNl dCArPSBsZW47Ci0JCQlibG9ja19zaXplIC09IGxlbjsKLQotCQkJcHJldl9lbmQgPSBvZmZzZXQ7 Ci0JCX0KLQl9Ci0KLQlzZ19wYWdlX3NpemVzIHw9IHNnLT5sZW5ndGg7Ci0Jc2dfbWFya19lbmQo c2cpOwotCWk5MTVfc2dfdHJpbShzdCk7Ci0KLQkvKiBJbnRlbmRlZCBmb3Iga2VybmVsIGludGVy bmFsIHVzZSBvbmx5ICovCi0JaWYgKG9iai0+ZmxhZ3MgJiBJOTE1X0JPX0FMTE9DX0NQVV9DTEVB UikgewotCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOwotCQl1bnNpZ25lZCBsb25nIGk7Ci0KLQkJ Zm9yX2VhY2hfc2coc3QtPnNnbCwgc2csIHN0LT5uZW50cywgaSkgewotCQkJdW5zaWduZWQgaW50 IGxlbmd0aDsKLQkJCXZvaWQgX19pb21lbSAqdmFkZHI7Ci0JCQlkbWFfYWRkcl90IGRhZGRyOwot Ci0JCQlkYWRkciA9IHNnX2RtYV9hZGRyZXNzKHNnKTsKLQkJCWRhZGRyIC09IG1lbS0+cmVnaW9u LnN0YXJ0OwotCQkJbGVuZ3RoID0gc2dfZG1hX2xlbihzZyk7Ci0KLQkJCXZhZGRyID0gaW9fbWFw cGluZ19tYXBfd2MoJm1lbS0+aW9tYXAsIGRhZGRyLCBsZW5ndGgpOwotCQkJbWVtc2V0NjQoKHZv aWQgX19mb3JjZSAqKXZhZGRyLCAwLCBsZW5ndGggLyBzaXplb2YodTY0KSk7Ci0JCQlpb19tYXBw aW5nX3VubWFwKHZhZGRyKTsKLQkJfQotCi0JCXdtYigpOwotCX0KLQotCV9faTkxNV9nZW1fb2Jq ZWN0X3NldF9wYWdlcyhvYmosIHN0LCBzZ19wYWdlX3NpemVzKTsKLQotCXJldHVybiAwOwotCi1l cnJfZnJlZV9zZzoKLQlzZ19mcmVlX3RhYmxlKHN0KTsKLQlrZnJlZShzdCk7Ci0JcmV0dXJuIHJl dDsKLX0KLQogdm9pZCBpOTE1X2dlbV9vYmplY3RfaW5pdF9tZW1vcnlfcmVnaW9uKHN0cnVjdCBk cm1faTkxNV9nZW1fb2JqZWN0ICpvYmosCiAJCQkJCXN0cnVjdCBpbnRlbF9tZW1vcnlfcmVnaW9u ICptZW0pCiB7Ci0JSU5JVF9MSVNUX0hFQUQoJm9iai0+bW0uYmxvY2tzKTsKIAlvYmotPm1tLnJl Z2lvbiA9IGludGVsX21lbW9yeV9yZWdpb25fZ2V0KG1lbSk7CiAKIAlpZiAob2JqLT5iYXNlLnNp emUgPD0gbWVtLT5taW5fcGFnZV9zaXplKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5 MTUvZ2VtL2k5MTVfZ2VtX3JlZ2lvbi5oIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ2VtL2k5MTVf Z2VtX3JlZ2lvbi5oCmluZGV4IGViZGRjODZkNzhmNy4uODRmY2IzMjk3NDAwIDEwMDY0NAotLS0g YS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9nZW0vaTkxNV9nZW1fcmVnaW9uLmgKKysrIGIvZHJpdmVy cy9ncHUvZHJtL2k5MTUvZ2VtL2k5MTVfZ2VtX3JlZ2lvbi5oCkBAIC0xMiwxMCArMTIsNiBAQCBz dHJ1Y3QgaW50ZWxfbWVtb3J5X3JlZ2lvbjsKIHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0Owog c3RydWN0IHNnX3RhYmxlOwogCi1pbnQgaTkxNV9nZW1fb2JqZWN0X2dldF9wYWdlc19idWRkeShz dHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKTsKLXZvaWQgaTkxNV9nZW1fb2JqZWN0X3B1 dF9wYWdlc19idWRkeShzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLAotCQkJCSAgICAg c3RydWN0IHNnX3RhYmxlICpwYWdlcyk7Ci0KIHZvaWQgaTkxNV9nZW1fb2JqZWN0X2luaXRfbWVt b3J5X3JlZ2lvbihzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLAogCQkJCQlzdHJ1Y3Qg aW50ZWxfbWVtb3J5X3JlZ2lvbiAqbWVtKTsKIHZvaWQgaTkxNV9nZW1fb2JqZWN0X3JlbGVhc2Vf bWVtb3J5X3JlZ2lvbihzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKTsKZGlmZiAtLWdp dCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2dlbS9pOTE1X2dlbV9zaG1lbS5jIGIvZHJpdmVycy9n cHUvZHJtL2k5MTUvZ2VtL2k5MTVfZ2VtX3NobWVtLmMKaW5kZXggYTliZmE2NmM4ZGExLi41ZDE2 YzQ0NjJmZGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2dlbS9pOTE1X2dlbV9z aG1lbS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2dlbS9pOTE1X2dlbV9zaG1lbS5jCkBA IC02MjgsMTEgKzYyOCwxMyBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IGludGVsX21lbW9yeV9yZWdp b25fb3BzIHNobWVtX3JlZ2lvbl9vcHMgPSB7CiAJLmluaXRfb2JqZWN0ID0gc2htZW1fb2JqZWN0 X2luaXQsCiB9OwogCi1zdHJ1Y3QgaW50ZWxfbWVtb3J5X3JlZ2lvbiAqaTkxNV9nZW1fc2htZW1f c2V0dXAoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUpCitzdHJ1Y3QgaW50ZWxfbWVtb3J5 X3JlZ2lvbiAqaTkxNV9nZW1fc2htZW1fc2V0dXAoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5 MTUsCisJCQkJCQkgdTE2IHR5cGUsIHUxNiBpbnN0YW5jZSkKIHsKIAlyZXR1cm4gaW50ZWxfbWVt b3J5X3JlZ2lvbl9jcmVhdGUoaTkxNSwgMCwKIAkJCQkJICB0b3RhbHJhbV9wYWdlcygpIDw8IFBB R0VfU0hJRlQsCiAJCQkJCSAgUEFHRV9TSVpFLCAwLAorCQkJCQkgIHR5cGUsIGluc3RhbmNlLAog CQkJCQkgICZzaG1lbV9yZWdpb25fb3BzKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUv ZHJtL2k5MTUvZ2VtL2k5MTVfZ2VtX3N0b2xlbi5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ2Vt L2k5MTVfZ2VtX3N0b2xlbi5jCmluZGV4IDI5M2Y2NDBmYWEwYS4uYzQyYWJlZTIwNmRhIDEwMDY0 NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9nZW0vaTkxNV9nZW1fc3RvbGVuLmMKKysrIGIv ZHJpdmVycy9ncHUvZHJtL2k5MTUvZ2VtL2k5MTVfZ2VtX3N0b2xlbi5jCkBAIC03NzAsNyArNzcw LDggQEAgc3RhdGljIGNvbnN0IHN0cnVjdCBpbnRlbF9tZW1vcnlfcmVnaW9uX29wcyBpOTE1X3Jl Z2lvbl9zdG9sZW5fbG1lbV9vcHMgPSB7CiB9OwogCiBzdHJ1Y3QgaW50ZWxfbWVtb3J5X3JlZ2lv biAqCi1pOTE1X2dlbV9zdG9sZW5fbG1lbV9zZXR1cChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAq aTkxNSkKK2k5MTVfZ2VtX3N0b2xlbl9sbWVtX3NldHVwKHN0cnVjdCBkcm1faTkxNV9wcml2YXRl ICppOTE1LCB1MTYgdHlwZSwKKwkJCSAgIHUxNiBpbnN0YW5jZSkKIHsKIAlzdHJ1Y3QgaW50ZWxf dW5jb3JlICp1bmNvcmUgPSAmaTkxNS0+dW5jb3JlOwogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0g dG9fcGNpX2RldihpOTE1LT5kcm0uZGV2KTsKQEAgLTc4OCw2ICs3ODksNyBAQCBpOTE1X2dlbV9z dG9sZW5fbG1lbV9zZXR1cChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSkKIAogCW1lbSA9 IGludGVsX21lbW9yeV9yZWdpb25fY3JlYXRlKGk5MTUsIGxtZW1fYmFzZSwgbG1lbV9zaXplLAog CQkJCQkgSTkxNV9HVFRfUEFHRV9TSVpFXzRLLCBpb19zdGFydCwKKwkJCQkJIHR5cGUsIGluc3Rh bmNlLAogCQkJCQkgJmk5MTVfcmVnaW9uX3N0b2xlbl9sbWVtX29wcyk7CiAJaWYgKElTX0VSUiht ZW0pKQogCQlyZXR1cm4gbWVtOwpAQCAtODA5LDE0ICs4MTEsMTUgQEAgaTkxNV9nZW1fc3RvbGVu X2xtZW1fc2V0dXAoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUpCiB9CiAKIHN0cnVjdCBp bnRlbF9tZW1vcnlfcmVnaW9uKgotaTkxNV9nZW1fc3RvbGVuX3NtZW1fc2V0dXAoc3RydWN0IGRy bV9pOTE1X3ByaXZhdGUgKmk5MTUpCitpOTE1X2dlbV9zdG9sZW5fc21lbV9zZXR1cChzdHJ1Y3Qg ZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSwgdTE2IHR5cGUsCisJCQkgICB1MTYgaW5zdGFuY2UpCiB7 CiAJc3RydWN0IGludGVsX21lbW9yeV9yZWdpb24gKm1lbTsKIAogCW1lbSA9IGludGVsX21lbW9y eV9yZWdpb25fY3JlYXRlKGk5MTUsCiAJCQkJCSBpbnRlbF9ncmFwaGljc19zdG9sZW5fcmVzLnN0 YXJ0LAogCQkJCQkgcmVzb3VyY2Vfc2l6ZSgmaW50ZWxfZ3JhcGhpY3Nfc3RvbGVuX3JlcyksCi0J CQkJCSBQQUdFX1NJWkUsIDAsCisJCQkJCSBQQUdFX1NJWkUsIDAsIHR5cGUsIGluc3RhbmNlLAog CQkJCQkgJmk5MTVfcmVnaW9uX3N0b2xlbl9zbWVtX29wcyk7CiAJaWYgKElTX0VSUihtZW0pKQog CQlyZXR1cm4gbWVtOwpAQCAtODI0LDcgKzgyNyw2IEBAIGk5MTVfZ2VtX3N0b2xlbl9zbWVtX3Nl dHVwKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1KQogCWludGVsX21lbW9yeV9yZWdpb25f c2V0X25hbWUobWVtLCAic3RvbGVuLXN5c3RlbSIpOwogCiAJbWVtLT5wcml2YXRlID0gdHJ1ZTsK LQogCXJldHVybiBtZW07CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2dl bS9pOTE1X2dlbV9zdG9sZW4uaCBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2dlbS9pOTE1X2dlbV9z dG9sZW4uaAppbmRleCAyYmVjNmMzNjdiOWMuLmNjZGY3YmVmYzU3MSAxMDA2NDQKLS0tIGEvZHJp dmVycy9ncHUvZHJtL2k5MTUvZ2VtL2k5MTVfZ2VtX3N0b2xlbi5oCisrKyBiL2RyaXZlcnMvZ3B1 L2RybS9pOTE1L2dlbS9pOTE1X2dlbV9zdG9sZW4uaApAQCAtMjEsOCArMjEsMTMgQEAgaW50IGk5 MTVfZ2VtX3N0b2xlbl9pbnNlcnRfbm9kZV9pbl9yYW5nZShzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0 ZSAqZGV2X3ByaXYsCiAJCQkJCSB1NjQgZW5kKTsKIHZvaWQgaTkxNV9nZW1fc3RvbGVuX3JlbW92 ZV9ub2RlKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwKIAkJCQkgc3RydWN0IGRy bV9tbV9ub2RlICpub2RlKTsKLXN0cnVjdCBpbnRlbF9tZW1vcnlfcmVnaW9uICppOTE1X2dlbV9z dG9sZW5fc21lbV9zZXR1cChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSk7Ci1zdHJ1Y3Qg aW50ZWxfbWVtb3J5X3JlZ2lvbiAqaTkxNV9nZW1fc3RvbGVuX2xtZW1fc2V0dXAoc3RydWN0IGRy bV9pOTE1X3ByaXZhdGUgKmk5MTUpOworc3RydWN0IGludGVsX21lbW9yeV9yZWdpb24gKgoraTkx NV9nZW1fc3RvbGVuX3NtZW1fc2V0dXAoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUsIHUx NiB0eXBlLAorCQkJICAgdTE2IGluc3RhbmNlKTsKK3N0cnVjdCBpbnRlbF9tZW1vcnlfcmVnaW9u ICoKK2k5MTVfZ2VtX3N0b2xlbl9sbWVtX3NldHVwKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpp OTE1LCB1MTYgdHlwZSwKKwkJCSAgIHUxNiBpbnN0YW5jZSk7CisKIHN0cnVjdCBkcm1faTkxNV9n ZW1fb2JqZWN0ICoKIGk5MTVfZ2VtX29iamVjdF9jcmVhdGVfc3RvbGVuKHN0cnVjdCBkcm1faTkx NV9wcml2YXRlICpkZXZfcHJpdiwKIAkJCSAgICAgIHJlc291cmNlX3NpemVfdCBzaXplKTsKZGlm ZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2d0L2ludGVsX2d0LmMgYi9kcml2ZXJzL2dw dS9kcm0vaTkxNS9ndC9pbnRlbF9ndC5jCmluZGV4IDhkNzdkY2JhZDA1OS4uM2Y4OGVjZGVlMDMx IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9ndC9pbnRlbF9ndC5jCisrKyBiL2Ry aXZlcnMvZ3B1L2RybS9pOTE1L2d0L2ludGVsX2d0LmMKQEAgLTY4LDggKzY4LDYgQEAgaW50IGlu dGVsX2d0X3Byb2JlX2xtZW0oc3RydWN0IGludGVsX2d0ICpndCkKIAlpZCA9IElOVEVMX1JFR0lP Tl9MTUVNOwogCiAJbWVtLT5pZCA9IGlkOwotCW1lbS0+dHlwZSA9IElOVEVMX01FTU9SWV9MT0NB TDsKLQltZW0tPmluc3RhbmNlID0gMDsKIAogCWludGVsX21lbW9yeV9yZWdpb25fc2V0X25hbWUo bWVtLCAibG9jYWwldSIsIG1lbS0+aW5zdGFuY2UpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dw dS9kcm0vaTkxNS9ndC9pbnRlbF9yZWdpb25fbG1lbS5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUv Z3QvaW50ZWxfcmVnaW9uX2xtZW0uYwppbmRleCA3M2ZjZWIwYzI1ZmMuLmY3MzY2YjA1NGY4ZSAx MDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ3QvaW50ZWxfcmVnaW9uX2xtZW0uYwor KysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9ndC9pbnRlbF9yZWdpb25fbG1lbS5jCkBAIC01LDYg KzUsOCBAQAogCiAjaW5jbHVkZSAiaTkxNV9kcnYuaCIKICNpbmNsdWRlICJpbnRlbF9tZW1vcnlf cmVnaW9uLmgiCisjaW5jbHVkZSAiaW50ZWxfcmVnaW9uX2xtZW0uaCIKKyNpbmNsdWRlICJpbnRl bF9yZWdpb25fdHRtLmgiCiAjaW5jbHVkZSAiZ2VtL2k5MTVfZ2VtX2xtZW0uaCIKICNpbmNsdWRl ICJnZW0vaTkxNV9nZW1fcmVnaW9uLmgiCiAjaW5jbHVkZSAiaW50ZWxfcmVnaW9uX2xtZW0uaCIK QEAgLTY2LDkgKzY4LDkgQEAgc3RhdGljIHZvaWQgcmVsZWFzZV9mYWtlX2xtZW1fYmFyKHN0cnVj dCBpbnRlbF9tZW1vcnlfcmVnaW9uICptZW0pCiBzdGF0aWMgdm9pZAogcmVnaW9uX2xtZW1fcmVs ZWFzZShzdHJ1Y3QgaW50ZWxfbWVtb3J5X3JlZ2lvbiAqbWVtKQogewotCXJlbGVhc2VfZmFrZV9s bWVtX2JhcihtZW0pOworCWludGVsX3JlZ2lvbl90dG1fZmluaShtZW0pOwogCWlvX21hcHBpbmdf ZmluaSgmbWVtLT5pb21hcCk7Ci0JaW50ZWxfbWVtb3J5X3JlZ2lvbl9yZWxlYXNlX2J1ZGR5KG1l bSk7CisJcmVsZWFzZV9mYWtlX2xtZW1fYmFyKG1lbSk7CiB9CiAKIHN0YXRpYyBpbnQKQEAgLTgz LDEyICs4NSwyMSBAQCByZWdpb25fbG1lbV9pbml0KHN0cnVjdCBpbnRlbF9tZW1vcnlfcmVnaW9u ICptZW0pCiAKIAlpZiAoIWlvX21hcHBpbmdfaW5pdF93YygmbWVtLT5pb21hcCwKIAkJCQltZW0t PmlvX3N0YXJ0LAotCQkJCXJlc291cmNlX3NpemUoJm1lbS0+cmVnaW9uKSkpCi0JCXJldHVybiAt RUlPOworCQkJCXJlc291cmNlX3NpemUoJm1lbS0+cmVnaW9uKSkpIHsKKwkJcmV0ID0gLUVJTzsK KwkJZ290byBvdXRfbm9faW87CisJfQogCi0JcmV0ID0gaW50ZWxfbWVtb3J5X3JlZ2lvbl9pbml0 X2J1ZGR5KG1lbSk7CisJcmV0ID0gaW50ZWxfcmVnaW9uX3R0bV9pbml0KG1lbSk7CiAJaWYgKHJl dCkKLQkJaW9fbWFwcGluZ19maW5pKCZtZW0tPmlvbWFwKTsKKwkJZ290byBvdXRfbm9fYnVkZHk7 CisKKwlyZXR1cm4gMDsKKworb3V0X25vX2J1ZGR5OgorCWlvX21hcHBpbmdfZmluaSgmbWVtLT5p b21hcCk7CitvdXRfbm9faW86CisJcmVsZWFzZV9mYWtlX2xtZW1fYmFyKG1lbSk7CiAKIAlyZXR1 cm4gcmV0OwogfQpAQCAtMTI3LDYgKzEzOCw4IEBAIGludGVsX2d0X3NldHVwX2Zha2VfbG1lbShz dHJ1Y3QgaW50ZWxfZ3QgKmd0KQogCQkJCQkgbWFwcGFibGVfZW5kLAogCQkJCQkgUEFHRV9TSVpF LAogCQkJCQkgaW9fc3RhcnQsCisJCQkJCSBJTlRFTF9NRU1PUllfTE9DQUwsCisJCQkJCSAwLAog CQkJCQkgJmludGVsX3JlZ2lvbl9sbWVtX29wcyk7CiAJaWYgKCFJU19FUlIobWVtKSkgewogCQlk cm1faW5mbygmaTkxNS0+ZHJtLCAiSW50ZWwgZ3JhcGhpY3MgZmFrZSBMTUVNOiAlcFJcbiIsCkBA IC0xOTgsNiArMjExLDggQEAgc3RhdGljIHN0cnVjdCBpbnRlbF9tZW1vcnlfcmVnaW9uICpzZXR1 cF9sbWVtKHN0cnVjdCBpbnRlbF9ndCAqZ3QpCiAJCQkJCSBsbWVtX3NpemUsCiAJCQkJCSBJOTE1 X0dUVF9QQUdFX1NJWkVfNEssCiAJCQkJCSBpb19zdGFydCwKKwkJCQkJIElOVEVMX01FTU9SWV9M T0NBTCwKKwkJCQkJIDAsCiAJCQkJCSAmaW50ZWxfcmVnaW9uX2xtZW1fb3BzKTsKIAlpZiAoSVNf RVJSKG1lbSkpCiAJCXJldHVybiBtZW07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkx NS9pOTE1X2J1ZGR5LmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2J1ZGR5LmMKZGVsZXRl ZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhMmY2ZWVjYjJmYy4uMDAwMDAwMDAwMDAwCi0tLSBh L2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfYnVkZHkuYworKysgL2Rldi9udWxsCkBAIC0xLDQz NSArMCwwIEBACi0vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUCi0vKgotICogQ29weXJp Z2h0IMKpIDIwMTkgSW50ZWwgQ29ycG9yYXRpb24KLSAqLwotCi0jaW5jbHVkZSA8bGludXgva21l bWxlYWsuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0KLSNpbmNsdWRlICJpOTE1X2J1ZGR5 LmgiCi0KLSNpbmNsdWRlICJpOTE1X2dlbS5oIgotI2luY2x1ZGUgImk5MTVfZ2xvYmFscy5oIgot I2luY2x1ZGUgImk5MTVfdXRpbHMuaCIKLQotc3RhdGljIHN0cnVjdCBpOTE1X2dsb2JhbF9ibG9j ayB7Ci0Jc3RydWN0IGk5MTVfZ2xvYmFsIGJhc2U7Ci0Jc3RydWN0IGttZW1fY2FjaGUgKnNsYWJf YmxvY2tzOwotfSBnbG9iYWw7Ci0KLXN0YXRpYyB2b2lkIGk5MTVfZ2xvYmFsX2J1ZGR5X3Nocmlu ayh2b2lkKQotewotCWttZW1fY2FjaGVfc2hyaW5rKGdsb2JhbC5zbGFiX2Jsb2Nrcyk7Ci19Ci0K LXN0YXRpYyB2b2lkIGk5MTVfZ2xvYmFsX2J1ZGR5X2V4aXQodm9pZCkKLXsKLQlrbWVtX2NhY2hl X2Rlc3Ryb3koZ2xvYmFsLnNsYWJfYmxvY2tzKTsKLX0KLQotc3RhdGljIHN0cnVjdCBpOTE1X2ds b2JhbF9ibG9jayBnbG9iYWwgPSB7IHsKLQkuc2hyaW5rID0gaTkxNV9nbG9iYWxfYnVkZHlfc2hy aW5rLAotCS5leGl0ID0gaTkxNV9nbG9iYWxfYnVkZHlfZXhpdCwKLX0gfTsKLQotaW50IF9faW5p dCBpOTE1X2dsb2JhbF9idWRkeV9pbml0KHZvaWQpCi17Ci0JZ2xvYmFsLnNsYWJfYmxvY2tzID0g S01FTV9DQUNIRShpOTE1X2J1ZGR5X2Jsb2NrLCBTTEFCX0hXQ0FDSEVfQUxJR04pOwotCWlmICgh Z2xvYmFsLnNsYWJfYmxvY2tzKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWk5MTVfZ2xvYmFsX3Jl Z2lzdGVyKCZnbG9iYWwuYmFzZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaTkx NV9idWRkeV9ibG9jayAqaTkxNV9ibG9ja19hbGxvYyhzdHJ1Y3QgaTkxNV9idWRkeV9ibG9jayAq cGFyZW50LAotCQkJCQkJIHVuc2lnbmVkIGludCBvcmRlciwKLQkJCQkJCSB1NjQgb2Zmc2V0KQot ewotCXN0cnVjdCBpOTE1X2J1ZGR5X2Jsb2NrICpibG9jazsKLQotCUdFTV9CVUdfT04ob3JkZXIg PiBJOTE1X0JVRERZX01BWF9PUkRFUik7Ci0KLQlibG9jayA9IGttZW1fY2FjaGVfemFsbG9jKGds b2JhbC5zbGFiX2Jsb2NrcywgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFibG9jaykKLQkJcmV0dXJuIE5V TEw7Ci0KLQlibG9jay0+aGVhZGVyID0gb2Zmc2V0OwotCWJsb2NrLT5oZWFkZXIgfD0gb3JkZXI7 Ci0JYmxvY2stPnBhcmVudCA9IHBhcmVudDsKLQotCUdFTV9CVUdfT04oYmxvY2stPmhlYWRlciAm IEk5MTVfQlVERFlfSEVBREVSX1VOVVNFRCk7Ci0JcmV0dXJuIGJsb2NrOwotfQotCi1zdGF0aWMg dm9pZCBpOTE1X2Jsb2NrX2ZyZWUoc3RydWN0IGk5MTVfYnVkZHlfYmxvY2sgKmJsb2NrKQotewot CWttZW1fY2FjaGVfZnJlZShnbG9iYWwuc2xhYl9ibG9ja3MsIGJsb2NrKTsKLX0KLQotc3RhdGlj IHZvaWQgbWFya19hbGxvY2F0ZWQoc3RydWN0IGk5MTVfYnVkZHlfYmxvY2sgKmJsb2NrKQotewot CWJsb2NrLT5oZWFkZXIgJj0gfkk5MTVfQlVERFlfSEVBREVSX1NUQVRFOwotCWJsb2NrLT5oZWFk ZXIgfD0gSTkxNV9CVUREWV9BTExPQ0FURUQ7Ci0KLQlsaXN0X2RlbCgmYmxvY2stPmxpbmspOwot fQotCi1zdGF0aWMgdm9pZCBtYXJrX2ZyZWUoc3RydWN0IGk5MTVfYnVkZHlfbW0gKm1tLAotCQkg ICAgICBzdHJ1Y3QgaTkxNV9idWRkeV9ibG9jayAqYmxvY2spCi17Ci0JYmxvY2stPmhlYWRlciAm PSB+STkxNV9CVUREWV9IRUFERVJfU1RBVEU7Ci0JYmxvY2stPmhlYWRlciB8PSBJOTE1X0JVRERZ X0ZSRUU7Ci0KLQlsaXN0X2FkZCgmYmxvY2stPmxpbmssCi0JCSAmbW0tPmZyZWVfbGlzdFtpOTE1 X2J1ZGR5X2Jsb2NrX29yZGVyKGJsb2NrKV0pOwotfQotCi1zdGF0aWMgdm9pZCBtYXJrX3NwbGl0 KHN0cnVjdCBpOTE1X2J1ZGR5X2Jsb2NrICpibG9jaykKLXsKLQlibG9jay0+aGVhZGVyICY9IH5J OTE1X0JVRERZX0hFQURFUl9TVEFURTsKLQlibG9jay0+aGVhZGVyIHw9IEk5MTVfQlVERFlfU1BM SVQ7Ci0KLQlsaXN0X2RlbCgmYmxvY2stPmxpbmspOwotfQotCi1pbnQgaTkxNV9idWRkeV9pbml0 KHN0cnVjdCBpOTE1X2J1ZGR5X21tICptbSwgdTY0IHNpemUsIHU2NCBjaHVua19zaXplKQotewot CXVuc2lnbmVkIGludCBpOwotCXU2NCBvZmZzZXQ7Ci0KLQlpZiAoc2l6ZSA8IGNodW5rX3NpemUp Ci0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKGNodW5rX3NpemUgPCBQQUdFX1NJWkUpCi0JCXJl dHVybiAtRUlOVkFMOwotCi0JaWYgKCFpc19wb3dlcl9vZl8yKGNodW5rX3NpemUpKQotCQlyZXR1 cm4gLUVJTlZBTDsKLQotCXNpemUgPSByb3VuZF9kb3duKHNpemUsIGNodW5rX3NpemUpOwotCi0J bW0tPnNpemUgPSBzaXplOwotCW1tLT5jaHVua19zaXplID0gY2h1bmtfc2l6ZTsKLQltbS0+bWF4 X29yZGVyID0gaWxvZzIoc2l6ZSkgLSBpbG9nMihjaHVua19zaXplKTsKLQotCUdFTV9CVUdfT04o bW0tPm1heF9vcmRlciA+IEk5MTVfQlVERFlfTUFYX09SREVSKTsKLQotCW1tLT5mcmVlX2xpc3Qg PSBrbWFsbG9jX2FycmF5KG1tLT5tYXhfb3JkZXIgKyAxLAotCQkJCSAgICAgIHNpemVvZihzdHJ1 Y3QgbGlzdF9oZWFkKSwKLQkJCQkgICAgICBHRlBfS0VSTkVMKTsKLQlpZiAoIW1tLT5mcmVlX2xp c3QpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JZm9yIChpID0gMDsgaSA8PSBtbS0+bWF4X29yZGVy OyArK2kpCi0JCUlOSVRfTElTVF9IRUFEKCZtbS0+ZnJlZV9saXN0W2ldKTsKLQotCW1tLT5uX3Jv b3RzID0gaHdlaWdodDY0KHNpemUpOwotCi0JbW0tPnJvb3RzID0ga21hbGxvY19hcnJheShtbS0+ bl9yb290cywKLQkJCQkgIHNpemVvZihzdHJ1Y3QgaTkxNV9idWRkeV9ibG9jayAqKSwKLQkJCQkg IEdGUF9LRVJORUwpOwotCWlmICghbW0tPnJvb3RzKQotCQlnb3RvIG91dF9mcmVlX2xpc3Q7Ci0K LQlvZmZzZXQgPSAwOwotCWkgPSAwOwotCi0JLyoKLQkgKiBTcGxpdCBpbnRvIHBvd2VyLW9mLXR3 byBibG9ja3MsIGluIGNhc2Ugd2UgYXJlIGdpdmVuIGEgc2l6ZSB0aGF0IGlzCi0JICogbm90IGl0 c2VsZiBhIHBvd2VyLW9mLXR3by4KLQkgKi8KLQlkbyB7Ci0JCXN0cnVjdCBpOTE1X2J1ZGR5X2Js b2NrICpyb290OwotCQl1bnNpZ25lZCBpbnQgb3JkZXI7Ci0JCXU2NCByb290X3NpemU7Ci0KLQkJ cm9vdF9zaXplID0gcm91bmRkb3duX3Bvd19vZl90d28oc2l6ZSk7Ci0JCW9yZGVyID0gaWxvZzIo cm9vdF9zaXplKSAtIGlsb2cyKGNodW5rX3NpemUpOwotCi0JCXJvb3QgPSBpOTE1X2Jsb2NrX2Fs bG9jKE5VTEwsIG9yZGVyLCBvZmZzZXQpOwotCQlpZiAoIXJvb3QpCi0JCQlnb3RvIG91dF9mcmVl X3Jvb3RzOwotCi0JCW1hcmtfZnJlZShtbSwgcm9vdCk7Ci0KLQkJR0VNX0JVR19PTihpID4gbW0t Pm1heF9vcmRlcik7Ci0JCUdFTV9CVUdfT04oaTkxNV9idWRkeV9ibG9ja19zaXplKG1tLCByb290 KSA8IGNodW5rX3NpemUpOwotCi0JCW1tLT5yb290c1tpXSA9IHJvb3Q7Ci0KLQkJb2Zmc2V0ICs9 IHJvb3Rfc2l6ZTsKLQkJc2l6ZSAtPSByb290X3NpemU7Ci0JCWkrKzsKLQl9IHdoaWxlIChzaXpl KTsKLQotCXJldHVybiAwOwotCi1vdXRfZnJlZV9yb290czoKLQl3aGlsZSAoaS0tKQotCQlpOTE1 X2Jsb2NrX2ZyZWUobW0tPnJvb3RzW2ldKTsKLQlrZnJlZShtbS0+cm9vdHMpOwotb3V0X2ZyZWVf bGlzdDoKLQlrZnJlZShtbS0+ZnJlZV9saXN0KTsKLQlyZXR1cm4gLUVOT01FTTsKLX0KLQotdm9p ZCBpOTE1X2J1ZGR5X2Zpbmkoc3RydWN0IGk5MTVfYnVkZHlfbW0gKm1tKQotewotCWludCBpOwot Ci0JZm9yIChpID0gMDsgaSA8IG1tLT5uX3Jvb3RzOyArK2kpIHsKLQkJR0VNX1dBUk5fT04oIWk5 MTVfYnVkZHlfYmxvY2tfaXNfZnJlZShtbS0+cm9vdHNbaV0pKTsKLQkJaTkxNV9ibG9ja19mcmVl KG1tLT5yb290c1tpXSk7Ci0JfQotCi0Ja2ZyZWUobW0tPnJvb3RzKTsKLQlrZnJlZShtbS0+ZnJl ZV9saXN0KTsKLX0KLQotc3RhdGljIGludCBzcGxpdF9ibG9jayhzdHJ1Y3QgaTkxNV9idWRkeV9t bSAqbW0sCi0JCSAgICAgICBzdHJ1Y3QgaTkxNV9idWRkeV9ibG9jayAqYmxvY2spCi17Ci0JdW5z aWduZWQgaW50IGJsb2NrX29yZGVyID0gaTkxNV9idWRkeV9ibG9ja19vcmRlcihibG9jaykgLSAx OwotCXU2NCBvZmZzZXQgPSBpOTE1X2J1ZGR5X2Jsb2NrX29mZnNldChibG9jayk7Ci0KLQlHRU1f QlVHX09OKCFpOTE1X2J1ZGR5X2Jsb2NrX2lzX2ZyZWUoYmxvY2spKTsKLQlHRU1fQlVHX09OKCFp OTE1X2J1ZGR5X2Jsb2NrX29yZGVyKGJsb2NrKSk7Ci0KLQlibG9jay0+bGVmdCA9IGk5MTVfYmxv Y2tfYWxsb2MoYmxvY2ssIGJsb2NrX29yZGVyLCBvZmZzZXQpOwotCWlmICghYmxvY2stPmxlZnQp Ci0JCXJldHVybiAtRU5PTUVNOwotCi0JYmxvY2stPnJpZ2h0ID0gaTkxNV9ibG9ja19hbGxvYyhi bG9jaywgYmxvY2tfb3JkZXIsCi0JCQkJCW9mZnNldCArIChtbS0+Y2h1bmtfc2l6ZSA8PCBibG9j a19vcmRlcikpOwotCWlmICghYmxvY2stPnJpZ2h0KSB7Ci0JCWk5MTVfYmxvY2tfZnJlZShibG9j ay0+bGVmdCk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCW1hcmtfZnJlZShtbSwgYmxvY2st PmxlZnQpOwotCW1hcmtfZnJlZShtbSwgYmxvY2stPnJpZ2h0KTsKLQotCW1hcmtfc3BsaXQoYmxv Y2spOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaTkxNV9idWRkeV9ibG9jayAq Ci1nZXRfYnVkZHkoc3RydWN0IGk5MTVfYnVkZHlfYmxvY2sgKmJsb2NrKQotewotCXN0cnVjdCBp OTE1X2J1ZGR5X2Jsb2NrICpwYXJlbnQ7Ci0KLQlwYXJlbnQgPSBibG9jay0+cGFyZW50OwotCWlm ICghcGFyZW50KQotCQlyZXR1cm4gTlVMTDsKLQotCWlmIChwYXJlbnQtPmxlZnQgPT0gYmxvY2sp Ci0JCXJldHVybiBwYXJlbnQtPnJpZ2h0OwotCi0JcmV0dXJuIHBhcmVudC0+bGVmdDsKLX0KLQot c3RhdGljIHZvaWQgX19pOTE1X2J1ZGR5X2ZyZWUoc3RydWN0IGk5MTVfYnVkZHlfbW0gKm1tLAot CQkJICAgICAgc3RydWN0IGk5MTVfYnVkZHlfYmxvY2sgKmJsb2NrKQotewotCXN0cnVjdCBpOTE1 X2J1ZGR5X2Jsb2NrICpwYXJlbnQ7Ci0KLQl3aGlsZSAoKHBhcmVudCA9IGJsb2NrLT5wYXJlbnQp KSB7Ci0JCXN0cnVjdCBpOTE1X2J1ZGR5X2Jsb2NrICpidWRkeTsKLQotCQlidWRkeSA9IGdldF9i dWRkeShibG9jayk7Ci0KLQkJaWYgKCFpOTE1X2J1ZGR5X2Jsb2NrX2lzX2ZyZWUoYnVkZHkpKQot CQkJYnJlYWs7Ci0KLQkJbGlzdF9kZWwoJmJ1ZGR5LT5saW5rKTsKLQotCQlpOTE1X2Jsb2NrX2Zy ZWUoYmxvY2spOwotCQlpOTE1X2Jsb2NrX2ZyZWUoYnVkZHkpOwotCi0JCWJsb2NrID0gcGFyZW50 OwotCX0KLQotCW1hcmtfZnJlZShtbSwgYmxvY2spOwotfQotCi12b2lkIGk5MTVfYnVkZHlfZnJl ZShzdHJ1Y3QgaTkxNV9idWRkeV9tbSAqbW0sCi0JCSAgICAgc3RydWN0IGk5MTVfYnVkZHlfYmxv Y2sgKmJsb2NrKQotewotCUdFTV9CVUdfT04oIWk5MTVfYnVkZHlfYmxvY2tfaXNfYWxsb2NhdGVk KGJsb2NrKSk7Ci0JX19pOTE1X2J1ZGR5X2ZyZWUobW0sIGJsb2NrKTsKLX0KLQotdm9pZCBpOTE1 X2J1ZGR5X2ZyZWVfbGlzdChzdHJ1Y3QgaTkxNV9idWRkeV9tbSAqbW0sIHN0cnVjdCBsaXN0X2hl YWQgKm9iamVjdHMpCi17Ci0Jc3RydWN0IGk5MTVfYnVkZHlfYmxvY2sgKmJsb2NrLCAqb247Ci0K LQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYmxvY2ssIG9uLCBvYmplY3RzLCBsaW5rKSB7Ci0J CWk5MTVfYnVkZHlfZnJlZShtbSwgYmxvY2spOwotCQljb25kX3Jlc2NoZWQoKTsKLQl9Ci0JSU5J VF9MSVNUX0hFQUQob2JqZWN0cyk7Ci19Ci0KLS8qCi0gKiBBbGxvY2F0ZSBwb3dlci1vZi10d28g YmxvY2suIFRoZSBvcmRlciB2YWx1ZSBoZXJlIHRyYW5zbGF0ZXMgdG86Ci0gKgotICogICAwID0g Ml4wICogbW0tPmNodW5rX3NpemUKLSAqICAgMSA9IDJeMSAqIG1tLT5jaHVua19zaXplCi0gKiAg IDIgPSAyXjIgKiBtbS0+Y2h1bmtfc2l6ZQotICogICAuLi4KLSAqLwotc3RydWN0IGk5MTVfYnVk ZHlfYmxvY2sgKgotaTkxNV9idWRkeV9hbGxvYyhzdHJ1Y3QgaTkxNV9idWRkeV9tbSAqbW0sIHVu c2lnbmVkIGludCBvcmRlcikKLXsKLQlzdHJ1Y3QgaTkxNV9idWRkeV9ibG9jayAqYmxvY2sgPSBO VUxMOwotCXVuc2lnbmVkIGludCBpOwotCWludCBlcnI7Ci0KLQlmb3IgKGkgPSBvcmRlcjsgaSA8 PSBtbS0+bWF4X29yZGVyOyArK2kpIHsKLQkJYmxvY2sgPSBsaXN0X2ZpcnN0X2VudHJ5X29yX251 bGwoJm1tLT5mcmVlX2xpc3RbaV0sCi0JCQkJCQkgc3RydWN0IGk5MTVfYnVkZHlfYmxvY2ssCi0J CQkJCQkgbGluayk7Ci0JCWlmIChibG9jaykKLQkJCWJyZWFrOwotCX0KLQotCWlmICghYmxvY2sp Ci0JCXJldHVybiBFUlJfUFRSKC1FTk9TUEMpOwotCi0JR0VNX0JVR19PTighaTkxNV9idWRkeV9i bG9ja19pc19mcmVlKGJsb2NrKSk7Ci0KLQl3aGlsZSAoaSAhPSBvcmRlcikgewotCQllcnIgPSBz cGxpdF9ibG9jayhtbSwgYmxvY2spOwotCQlpZiAodW5saWtlbHkoZXJyKSkKLQkJCWdvdG8gb3V0 X2ZyZWU7Ci0KLQkJLyogR28gbG93ICovCi0JCWJsb2NrID0gYmxvY2stPmxlZnQ7Ci0JCWktLTsK LQl9Ci0KLQltYXJrX2FsbG9jYXRlZChibG9jayk7Ci0Ja21lbWxlYWtfdXBkYXRlX3RyYWNlKGJs b2NrKTsKLQlyZXR1cm4gYmxvY2s7Ci0KLW91dF9mcmVlOgotCWlmIChpICE9IG9yZGVyKQotCQlf X2k5MTVfYnVkZHlfZnJlZShtbSwgYmxvY2spOwotCXJldHVybiBFUlJfUFRSKGVycik7Ci19Ci0K LXN0YXRpYyBpbmxpbmUgYm9vbCBvdmVybGFwcyh1NjQgczEsIHU2NCBlMSwgdTY0IHMyLCB1NjQg ZTIpCi17Ci0JcmV0dXJuIHMxIDw9IGUyICYmIGUxID49IHMyOwotfQotCi1zdGF0aWMgaW5saW5l IGJvb2wgY29udGFpbnModTY0IHMxLCB1NjQgZTEsIHU2NCBzMiwgdTY0IGUyKQotewotCXJldHVy biBzMSA8PSBzMiAmJiBlMSA+PSBlMjsKLX0KLQotLyoKLSAqIEFsbG9jYXRlIHJhbmdlLiBOb3Rl IHRoYXQgaXQncyBzYWZlIHRvIGNoYWluIHRvZ2V0aGVyIG11bHRpcGxlIGFsbG9jX3Jhbmdlcwot ICogd2l0aCB0aGUgc2FtZSBibG9ja3MgbGlzdC4KLSAqCi0gKiBJbnRlbmRlZCBmb3IgcHJlLWFs bG9jYXRpbmcgcG9ydGlvbnMgb2YgdGhlIGFkZHJlc3Mgc3BhY2UsIGZvciBleGFtcGxlIHRvCi0g KiByZXNlcnZlIGEgYmxvY2sgZm9yIHRoZSBpbml0aWFsIGZyYW1lYnVmZmVyIG9yIHNpbWlsYXIs IGhlbmNlIHRoZSBleHBlY3RhdGlvbgotICogaGVyZSBpcyB0aGF0IGk5MTVfYnVkZHlfYWxsb2Mo KSBpcyBzdGlsbCB0aGUgbWFpbiB2ZWhpY2xlIGZvcgotICogYWxsb2NhdGlvbnMsIHNvIGlmIHRo YXQncyBub3QgdGhlIGNhc2UgdGhlbiB0aGUgZHJtX21tIHJhbmdlIGFsbG9jYXRvciBpcwotICog cHJvYmFibHkgYSBtdWNoIGJldHRlciBmaXQsIGFuZCBzbyB5b3Ugc2hvdWxkIHByb2JhYmx5IGdv IHVzZSB0aGF0IGluc3RlYWQuCi0gKi8KLWludCBpOTE1X2J1ZGR5X2FsbG9jX3JhbmdlKHN0cnVj dCBpOTE1X2J1ZGR5X21tICptbSwKLQkJCSAgIHN0cnVjdCBsaXN0X2hlYWQgKmJsb2NrcywKLQkJ CSAgIHU2NCBzdGFydCwgdTY0IHNpemUpCi17Ci0Jc3RydWN0IGk5MTVfYnVkZHlfYmxvY2sgKmJs b2NrOwotCXN0cnVjdCBpOTE1X2J1ZGR5X2Jsb2NrICpidWRkeTsKLQlMSVNUX0hFQUQoYWxsb2Nh dGVkKTsKLQlMSVNUX0hFQUQoZGZzKTsKLQl1NjQgZW5kOwotCWludCBlcnI7Ci0JaW50IGk7Ci0K LQlpZiAoc2l6ZSA8IG1tLT5jaHVua19zaXplKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmICgh SVNfQUxJR05FRChzaXplIHwgc3RhcnQsIG1tLT5jaHVua19zaXplKSkKLQkJcmV0dXJuIC1FSU5W QUw7Ci0KLQlpZiAocmFuZ2Vfb3ZlcmZsb3dzKHN0YXJ0LCBzaXplLCBtbS0+c2l6ZSkpCi0JCXJl dHVybiAtRUlOVkFMOwotCi0JZm9yIChpID0gMDsgaSA8IG1tLT5uX3Jvb3RzOyArK2kpCi0JCWxp c3RfYWRkX3RhaWwoJm1tLT5yb290c1tpXS0+dG1wX2xpbmssICZkZnMpOwotCi0JZW5kID0gc3Rh cnQgKyBzaXplIC0gMTsKLQotCWRvIHsKLQkJdTY0IGJsb2NrX3N0YXJ0OwotCQl1NjQgYmxvY2tf ZW5kOwotCi0JCWJsb2NrID0gbGlzdF9maXJzdF9lbnRyeV9vcl9udWxsKCZkZnMsCi0JCQkJCQkg c3RydWN0IGk5MTVfYnVkZHlfYmxvY2ssCi0JCQkJCQkgdG1wX2xpbmspOwotCQlpZiAoIWJsb2Nr KQotCQkJYnJlYWs7Ci0KLQkJbGlzdF9kZWwoJmJsb2NrLT50bXBfbGluayk7Ci0KLQkJYmxvY2tf c3RhcnQgPSBpOTE1X2J1ZGR5X2Jsb2NrX29mZnNldChibG9jayk7Ci0JCWJsb2NrX2VuZCA9IGJs b2NrX3N0YXJ0ICsgaTkxNV9idWRkeV9ibG9ja19zaXplKG1tLCBibG9jaykgLSAxOwotCi0JCWlm ICghb3ZlcmxhcHMoc3RhcnQsIGVuZCwgYmxvY2tfc3RhcnQsIGJsb2NrX2VuZCkpCi0JCQljb250 aW51ZTsKLQotCQlpZiAoaTkxNV9idWRkeV9ibG9ja19pc19hbGxvY2F0ZWQoYmxvY2spKSB7Ci0J CQllcnIgPSAtRU5PU1BDOwotCQkJZ290byBlcnJfZnJlZTsKLQkJfQotCi0JCWlmIChjb250YWlu cyhzdGFydCwgZW5kLCBibG9ja19zdGFydCwgYmxvY2tfZW5kKSkgewotCQkJaWYgKCFpOTE1X2J1 ZGR5X2Jsb2NrX2lzX2ZyZWUoYmxvY2spKSB7Ci0JCQkJZXJyID0gLUVOT1NQQzsKLQkJCQlnb3Rv IGVycl9mcmVlOwotCQkJfQotCi0JCQltYXJrX2FsbG9jYXRlZChibG9jayk7Ci0JCQlsaXN0X2Fk ZF90YWlsKCZibG9jay0+bGluaywgJmFsbG9jYXRlZCk7Ci0JCQljb250aW51ZTsKLQkJfQotCi0J CWlmICghaTkxNV9idWRkeV9ibG9ja19pc19zcGxpdChibG9jaykpIHsKLQkJCWVyciA9IHNwbGl0 X2Jsb2NrKG1tLCBibG9jayk7Ci0JCQlpZiAodW5saWtlbHkoZXJyKSkKLQkJCQlnb3RvIGVycl91 bmRvOwotCQl9Ci0KLQkJbGlzdF9hZGQoJmJsb2NrLT5yaWdodC0+dG1wX2xpbmssICZkZnMpOwot CQlsaXN0X2FkZCgmYmxvY2stPmxlZnQtPnRtcF9saW5rLCAmZGZzKTsKLQl9IHdoaWxlICgxKTsK LQotCWxpc3Rfc3BsaWNlX3RhaWwoJmFsbG9jYXRlZCwgYmxvY2tzKTsKLQlyZXR1cm4gMDsKLQot ZXJyX3VuZG86Ci0JLyoKLQkgKiBXZSByZWFsbHkgZG9uJ3Qgd2FudCB0byBsZWF2ZSBhcm91bmQg YSBidW5jaCBvZiBzcGxpdCBibG9ja3MsIHNpbmNlCi0JICogYmlnZ2VyIGlzIGJldHRlciwgc28g bWFrZSBzdXJlIHdlIG1lcmdlIGV2ZXJ5dGhpbmcgYmFjayBiZWZvcmUgd2UKLQkgKiBmcmVlIHRo ZSBhbGxvY2F0ZWQgYmxvY2tzLgotCSAqLwotCWJ1ZGR5ID0gZ2V0X2J1ZGR5KGJsb2NrKTsKLQlp ZiAoYnVkZHkgJiYKLQkgICAgKGk5MTVfYnVkZHlfYmxvY2tfaXNfZnJlZShibG9jaykgJiYKLQkg ICAgIGk5MTVfYnVkZHlfYmxvY2tfaXNfZnJlZShidWRkeSkpKQotCQlfX2k5MTVfYnVkZHlfZnJl ZShtbSwgYmxvY2spOwotCi1lcnJfZnJlZToKLQlpOTE1X2J1ZGR5X2ZyZWVfbGlzdChtbSwgJmFs bG9jYXRlZCk7Ci0JcmV0dXJuIGVycjsKLX0KLQotI2lmIElTX0VOQUJMRUQoQ09ORklHX0RSTV9J OTE1X1NFTEZURVNUKQotI2luY2x1ZGUgInNlbGZ0ZXN0cy9pOTE1X2J1ZGR5LmMiCi0jZW5kaWYK ZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfYnVkZHkuaCBiL2RyaXZlcnMv Z3B1L2RybS9pOTE1L2k5MTVfYnVkZHkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg OWNlNTIwMGY0MDAxLi4wMDAwMDAwMDAwMDAKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkx NV9idWRkeS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qIFNQRFgtTGljZW5z ZS1JZGVudGlmaWVyOiBNSVQgKi8KLS8qCi0gKiBDb3B5cmlnaHQgwqkgMjAxOSBJbnRlbCBDb3Jw b3JhdGlvbgotICovCi0KLSNpZm5kZWYgX19JOTE1X0JVRERZX0hfXwotI2RlZmluZSBfX0k5MTVf QlVERFlfSF9fCi0KLSNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KLSNpbmNsdWRlIDxsaW51eC9s aXN0Lmg+Ci0KLXN0cnVjdCBpOTE1X2J1ZGR5X2Jsb2NrIHsKLSNkZWZpbmUgSTkxNV9CVUREWV9I RUFERVJfT0ZGU0VUIEdFTk1BU0tfVUxMKDYzLCAxMikKLSNkZWZpbmUgSTkxNV9CVUREWV9IRUFE RVJfU1RBVEUgIEdFTk1BU0tfVUxMKDExLCAxMCkKLSNkZWZpbmUgICBJOTE1X0JVRERZX0FMTE9D QVRFRAkgICAoMSA8PCAxMCkKLSNkZWZpbmUgICBJOTE1X0JVRERZX0ZSRUUJICAgKDIgPDwgMTAp Ci0jZGVmaW5lICAgSTkxNV9CVUREWV9TUExJVAkgICAoMyA8PCAxMCkKLS8qIEZyZWUgdG8gYmUg dXNlZCwgaWYgbmVlZGVkIGluIHRoZSBmdXR1cmUgKi8KLSNkZWZpbmUgSTkxNV9CVUREWV9IRUFE RVJfVU5VU0VEIEdFTk1BU0tfVUxMKDksIDYpCi0jZGVmaW5lIEk5MTVfQlVERFlfSEVBREVSX09S REVSICBHRU5NQVNLX1VMTCg1LCAwKQotCXU2NCBoZWFkZXI7Ci0KLQlzdHJ1Y3QgaTkxNV9idWRk eV9ibG9jayAqbGVmdDsKLQlzdHJ1Y3QgaTkxNV9idWRkeV9ibG9jayAqcmlnaHQ7Ci0Jc3RydWN0 IGk5MTVfYnVkZHlfYmxvY2sgKnBhcmVudDsKLQotCXZvaWQgKnByaXZhdGU7IC8qIG93bmVkIGJ5 IGNyZWF0b3IgKi8KLQotCS8qCi0JICogV2hpbGUgdGhlIGJsb2NrIGlzIGFsbG9jYXRlZCBieSB0 aGUgdXNlciB0aHJvdWdoIGk5MTVfYnVkZHlfYWxsb2MqLAotCSAqIHRoZSB1c2VyIGhhcyBvd25l cnNoaXAgb2YgdGhlIGxpbmssIGZvciBleGFtcGxlIHRvIG1haW50YWluIHdpdGhpbgotCSAqIGEg bGlzdCwgaWYgc28gZGVzaXJlZC4gQXMgc29vbiBhcyB0aGUgYmxvY2sgaXMgZnJlZWQgd2l0aAot CSAqIGk5MTVfYnVkZHlfZnJlZSogb3duZXJzaGlwIGlzIGdpdmVuIGJhY2sgdG8gdGhlIG1tLgot CSAqLwotCXN0cnVjdCBsaXN0X2hlYWQgbGluazsKLQlzdHJ1Y3QgbGlzdF9oZWFkIHRtcF9saW5r OwotfTsKLQotLyogT3JkZXItemVybyBtdXN0IGJlIGF0IGxlYXN0IFBBR0VfU0laRSAqLwotI2Rl ZmluZSBJOTE1X0JVRERZX01BWF9PUkRFUiAoNjMgLSBQQUdFX1NISUZUKQotCi0vKgotICogQmlu YXJ5IEJ1ZGR5IFN5c3RlbS4KLSAqCi0gKiBMb2NraW5nIHNob3VsZCBiZSBoYW5kbGVkIGJ5IHRo ZSB1c2VyLCBhIHNpbXBsZSBtdXRleCBhcm91bmQKLSAqIGk5MTVfYnVkZHlfYWxsb2MqIGFuZCBp OTE1X2J1ZGR5X2ZyZWUqIHNob3VsZCBzdWZmaWNlLgotICovCi1zdHJ1Y3QgaTkxNV9idWRkeV9t bSB7Ci0JLyogTWFpbnRhaW4gYSBmcmVlIGxpc3QgZm9yIGVhY2ggb3JkZXIuICovCi0Jc3RydWN0 IGxpc3RfaGVhZCAqZnJlZV9saXN0OwotCi0JLyoKLQkgKiBNYWludGFpbiBleHBsaWNpdCBiaW5h cnkgdHJlZShzKSB0byB0cmFjayB0aGUgYWxsb2NhdGlvbiBvZiB0aGUKLQkgKiBhZGRyZXNzIHNw YWNlLiBUaGlzIGdpdmVzIHVzIGEgc2ltcGxlIHdheSBvZiBmaW5kaW5nIGEgYnVkZHkgYmxvY2sK LQkgKiBhbmQgcGVyZm9ybWluZyB0aGUgcG90ZW50aWFsbHkgcmVjdXJzaXZlIG1lcmdlIHN0ZXAg d2hlbiBmcmVlaW5nIGEKLQkgKiBibG9jay4gIE5vZGVzIGFyZSBlaXRoZXIgYWxsb2NhdGVkIG9y IGZyZWUsIGluIHdoaWNoIGNhc2UgdGhleSB3aWxsCi0JICogYWxzbyBleGlzdCBvbiB0aGUgcmVz cGVjdGl2ZSBmcmVlIGxpc3QuCi0JICovCi0Jc3RydWN0IGk5MTVfYnVkZHlfYmxvY2sgKipyb290 czsKLQotCS8qCi0JICogQW55dGhpbmcgZnJvbSBoZXJlIGlzIHB1YmxpYywgYW5kIHJlbWFpbnMg c3RhdGljIGZvciB0aGUgbGlmZXRpbWUgb2YKLQkgKiB0aGUgbW0uIEV2ZXJ5dGhpbmcgYWJvdmUg aXMgY29uc2lkZXJlZCBkby1ub3QtdG91Y2guCi0JICovCi0JdW5zaWduZWQgaW50IG5fcm9vdHM7 Ci0JdW5zaWduZWQgaW50IG1heF9vcmRlcjsKLQotCS8qIE11c3QgYmUgYXQgbGVhc3QgUEFHRV9T SVpFICovCi0JdTY0IGNodW5rX3NpemU7Ci0JdTY0IHNpemU7Ci19OwotCi1zdGF0aWMgaW5saW5l IHU2NAotaTkxNV9idWRkeV9ibG9ja19vZmZzZXQoc3RydWN0IGk5MTVfYnVkZHlfYmxvY2sgKmJs b2NrKQotewotCXJldHVybiBibG9jay0+aGVhZGVyICYgSTkxNV9CVUREWV9IRUFERVJfT0ZGU0VU OwotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludAotaTkxNV9idWRkeV9ibG9ja19vcmRl cihzdHJ1Y3QgaTkxNV9idWRkeV9ibG9jayAqYmxvY2spCi17Ci0JcmV0dXJuIGJsb2NrLT5oZWFk ZXIgJiBJOTE1X0JVRERZX0hFQURFUl9PUkRFUjsKLX0KLQotc3RhdGljIGlubGluZSB1bnNpZ25l ZCBpbnQKLWk5MTVfYnVkZHlfYmxvY2tfc3RhdGUoc3RydWN0IGk5MTVfYnVkZHlfYmxvY2sgKmJs b2NrKQotewotCXJldHVybiBibG9jay0+aGVhZGVyICYgSTkxNV9CVUREWV9IRUFERVJfU1RBVEU7 Ci19Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbAotaTkxNV9idWRkeV9ibG9ja19pc19hbGxvY2F0ZWQo c3RydWN0IGk5MTVfYnVkZHlfYmxvY2sgKmJsb2NrKQotewotCXJldHVybiBpOTE1X2J1ZGR5X2Js b2NrX3N0YXRlKGJsb2NrKSA9PSBJOTE1X0JVRERZX0FMTE9DQVRFRDsKLX0KLQotc3RhdGljIGlu bGluZSBib29sCi1pOTE1X2J1ZGR5X2Jsb2NrX2lzX2ZyZWUoc3RydWN0IGk5MTVfYnVkZHlfYmxv Y2sgKmJsb2NrKQotewotCXJldHVybiBpOTE1X2J1ZGR5X2Jsb2NrX3N0YXRlKGJsb2NrKSA9PSBJ OTE1X0JVRERZX0ZSRUU7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbAotaTkxNV9idWRkeV9ibG9j a19pc19zcGxpdChzdHJ1Y3QgaTkxNV9idWRkeV9ibG9jayAqYmxvY2spCi17Ci0JcmV0dXJuIGk5 MTVfYnVkZHlfYmxvY2tfc3RhdGUoYmxvY2spID09IEk5MTVfQlVERFlfU1BMSVQ7Ci19Ci0KLXN0 YXRpYyBpbmxpbmUgdTY0Ci1pOTE1X2J1ZGR5X2Jsb2NrX3NpemUoc3RydWN0IGk5MTVfYnVkZHlf bW0gKm1tLAotCQkgICAgICBzdHJ1Y3QgaTkxNV9idWRkeV9ibG9jayAqYmxvY2spCi17Ci0JcmV0 dXJuIG1tLT5jaHVua19zaXplIDw8IGk5MTVfYnVkZHlfYmxvY2tfb3JkZXIoYmxvY2spOwotfQot Ci1pbnQgaTkxNV9idWRkeV9pbml0KHN0cnVjdCBpOTE1X2J1ZGR5X21tICptbSwgdTY0IHNpemUs IHU2NCBjaHVua19zaXplKTsKLQotdm9pZCBpOTE1X2J1ZGR5X2Zpbmkoc3RydWN0IGk5MTVfYnVk ZHlfbW0gKm1tKTsKLQotc3RydWN0IGk5MTVfYnVkZHlfYmxvY2sgKgotaTkxNV9idWRkeV9hbGxv YyhzdHJ1Y3QgaTkxNV9idWRkeV9tbSAqbW0sIHVuc2lnbmVkIGludCBvcmRlcik7Ci0KLWludCBp OTE1X2J1ZGR5X2FsbG9jX3JhbmdlKHN0cnVjdCBpOTE1X2J1ZGR5X21tICptbSwKLQkJCSAgIHN0 cnVjdCBsaXN0X2hlYWQgKmJsb2NrcywKLQkJCSAgIHU2NCBzdGFydCwgdTY0IHNpemUpOwotCi12 b2lkIGk5MTVfYnVkZHlfZnJlZShzdHJ1Y3QgaTkxNV9idWRkeV9tbSAqbW0sIHN0cnVjdCBpOTE1 X2J1ZGR5X2Jsb2NrICpibG9jayk7Ci0KLXZvaWQgaTkxNV9idWRkeV9mcmVlX2xpc3Qoc3RydWN0 IGk5MTVfYnVkZHlfbW0gKm1tLCBzdHJ1Y3QgbGlzdF9oZWFkICpvYmplY3RzKTsKLQotI2VuZGlm CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5jIGIvZHJpdmVycy9n cHUvZHJtL2k5MTUvaTkxNV9kcnYuYwppbmRleCA5MmJjY2M1NjIzYTguLjEyMmRkMjk3YjZhZiAx MDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuYworKysgYi9kcml2ZXJz L2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5jCkBAIC04NCw2ICs4NCw3IEBACiAjaW5jbHVkZSAiaW50 ZWxfZ3Z0LmgiCiAjaW5jbHVkZSAiaW50ZWxfbWVtb3J5X3JlZ2lvbi5oIgogI2luY2x1ZGUgImlu dGVsX3BtLmgiCisjaW5jbHVkZSAiaW50ZWxfcmVnaW9uX3R0bS5oIgogI2luY2x1ZGUgImludGVs X3NpZGViYW5kLmgiCiAjaW5jbHVkZSAidmx2X3N1c3BlbmQuaCIKIApAQCAtMzM1LDYgKzMzNiwx MCBAQCBzdGF0aWMgaW50IGk5MTVfZHJpdmVyX2Vhcmx5X3Byb2JlKHN0cnVjdCBkcm1faTkxNV9w cml2YXRlICpkZXZfcHJpdikKIAlpZiAocmV0IDwgMCkKIAkJZ290byBlcnJfd29ya3F1ZXVlczsK IAorCXJldCA9IGludGVsX3JlZ2lvbl90dG1fZGV2aWNlX2luaXQoZGV2X3ByaXYpOworCWlmIChy ZXQpCisJCWdvdG8gZXJyX3R0bTsKKwogCWludGVsX3dvcGNtX2luaXRfZWFybHkoJmRldl9wcml2 LT53b3BjbSk7CiAKIAlpbnRlbF9ndF9pbml0X2Vhcmx5KCZkZXZfcHJpdi0+Z3QsIGRldl9wcml2 KTsKQEAgLTM1OSw2ICszNjQsOCBAQCBzdGF0aWMgaW50IGk5MTVfZHJpdmVyX2Vhcmx5X3Byb2Jl KHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikKIGVycl9nZW06CiAJaTkxNV9nZW1f Y2xlYW51cF9lYXJseShkZXZfcHJpdik7CiAJaW50ZWxfZ3RfZHJpdmVyX2xhdGVfcmVsZWFzZSgm ZGV2X3ByaXYtPmd0KTsKKwlpbnRlbF9yZWdpb25fdHRtX2RldmljZV9maW5pKGRldl9wcml2KTsK K2Vycl90dG06CiAJdmx2X3N1c3BlbmRfY2xlYW51cChkZXZfcHJpdik7CiBlcnJfd29ya3F1ZXVl czoKIAlpOTE1X3dvcmtxdWV1ZXNfY2xlYW51cChkZXZfcHJpdik7CkBAIC0zNzYsNiArMzgzLDcg QEAgc3RhdGljIHZvaWQgaTkxNV9kcml2ZXJfbGF0ZV9yZWxlYXNlKHN0cnVjdCBkcm1faTkxNV9w cml2YXRlICpkZXZfcHJpdikKIAlpbnRlbF9wb3dlcl9kb21haW5zX2NsZWFudXAoZGV2X3ByaXYp OwogCWk5MTVfZ2VtX2NsZWFudXBfZWFybHkoZGV2X3ByaXYpOwogCWludGVsX2d0X2RyaXZlcl9s YXRlX3JlbGVhc2UoJmRldl9wcml2LT5ndCk7CisJaW50ZWxfcmVnaW9uX3R0bV9kZXZpY2VfZmlu aShkZXZfcHJpdik7CiAJdmx2X3N1c3BlbmRfY2xlYW51cChkZXZfcHJpdik7CiAJaTkxNV93b3Jr cXVldWVzX2NsZWFudXAoZGV2X3ByaXYpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0v aTkxNS9pOTE1X2Rydi5oIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuaAppbmRleCAx MjgxOThlOGI0ZDAuLjEyNzZhMmY2MDc0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5 MTUvaTkxNV9kcnYuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5oCkBAIC02 MCw2ICs2MCw3IEBACiAjaW5jbHVkZSA8ZHJtL2RybV9hdG9taWMuaD4KICNpbmNsdWRlIDxkcm0v ZHJtX2Nvbm5lY3Rvci5oPgogI2luY2x1ZGUgPGRybS9pOTE1X21laV9oZGNwX2ludGVyZmFjZS5o PgorI2luY2x1ZGUgPGRybS90dG0vdHRtX2RldmljZS5oPgogCiAjaW5jbHVkZSAiaTkxNV9wYXJh bXMuaCIKICNpbmNsdWRlICJpOTE1X3JlZy5oIgpAQCAtMTE2Niw2ICsxMTY3LDkgQEAgc3RydWN0 IGRybV9pOTE1X3ByaXZhdGUgewogCS8qIE11dGV4IHRvIHByb3RlY3QgdGhlIGFib3ZlIGhkY3Ag Y29tcG9uZW50IHJlbGF0ZWQgdmFsdWVzLiAqLwogCXN0cnVjdCBtdXRleCBoZGNwX2NvbXBfbXV0 ZXg7CiAKKwkvKiBUaGUgVFRNIGRldmljZSBzdHJ1Y3R1cmUuICovCisJc3RydWN0IHR0bV9kZXZp Y2UgYmRldjsKKwogCUk5MTVfU0VMRlRFU1RfREVDTEFSRShzdHJ1Y3QgaTkxNV9zZWxmdGVzdF9z dGFzaCBzZWxmdGVzdDspCiAKIAkvKgpAQCAtMTc1MSw3ICsxNzU1LDggQEAgdm9pZCBpOTE1X2dl bV9jbGVhbnVwX3VzZXJwdHIoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KTsKIHZv aWQgaTkxNV9nZW1faW5pdF9lYXJseShzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYp Owogdm9pZCBpOTE1X2dlbV9jbGVhbnVwX2Vhcmx5KHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpk ZXZfcHJpdik7CiAKLXN0cnVjdCBpbnRlbF9tZW1vcnlfcmVnaW9uICppOTE1X2dlbV9zaG1lbV9z ZXR1cChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSk7CitzdHJ1Y3QgaW50ZWxfbWVtb3J5 X3JlZ2lvbiAqaTkxNV9nZW1fc2htZW1fc2V0dXAoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5 MTUsCisJCQkJCQkgdTE2IHR5cGUsIHUxNiBpbnN0YW5jZSk7CiAKIHN0YXRpYyBpbmxpbmUgdm9p ZCBpOTE1X2dlbV9kcmFpbl9mcmVlZF9vYmplY3RzKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpp OTE1KQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW0uYyBiL2Ry aXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtLmMKaW5kZXggZDAwMThjNWY4OGJkLi4xODBmNmU5 MTA3ZDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtLmMKKysrIGIv ZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW0uYwpAQCAtMTEwOSw2ICsxMTA5LDcgQEAgaW50 IGk5MTVfZ2VtX2luaXQoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQogCX0KIAog CWk5MTVfZ2VtX2RyYWluX2ZyZWVkX29iamVjdHMoZGV2X3ByaXYpOworCiAJcmV0dXJuIHJldDsK IH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nbG9iYWxzLmMgYi9k cml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dsb2JhbHMuYwppbmRleCAzYWEyMTM2ODQyOTMuLjc3 ZjE5MTFjNDYzYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nbG9iYWxz LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nbG9iYWxzLmMKQEAgLTg3LDcgKzg3 LDYgQEAgc3RhdGljIHZvaWQgX19pOTE1X2dsb2JhbHNfY2xlYW51cCh2b2lkKQogCiBzdGF0aWMg X19pbml0Y29uc3QgaW50ICgqIGNvbnN0IGluaXRmbltdKSh2b2lkKSA9IHsKIAlpOTE1X2dsb2Jh bF9hY3RpdmVfaW5pdCwKLQlpOTE1X2dsb2JhbF9idWRkeV9pbml0LAogCWk5MTVfZ2xvYmFsX2Nv bnRleHRfaW5pdCwKIAlpOTE1X2dsb2JhbF9nZW1fY29udGV4dF9pbml0LAogCWk5MTVfZ2xvYmFs X29iamVjdHNfaW5pdCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2xv YmFscy5oIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nbG9iYWxzLmgKaW5kZXggYjJmNWNk OWI5YjFhLi4yZDE5OWY0MTFhNGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5 MTVfZ2xvYmFscy5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2xvYmFscy5oCkBA IC0yNyw3ICsyNyw2IEBAIHZvaWQgaTkxNV9nbG9iYWxzX2V4aXQodm9pZCk7CiAKIC8qIGNvbnN0 cnVjdG9ycyAqLwogaW50IGk5MTVfZ2xvYmFsX2FjdGl2ZV9pbml0KHZvaWQpOwotaW50IGk5MTVf Z2xvYmFsX2J1ZGR5X2luaXQodm9pZCk7CiBpbnQgaTkxNV9nbG9iYWxfY29udGV4dF9pbml0KHZv aWQpOwogaW50IGk5MTVfZ2xvYmFsX2dlbV9jb250ZXh0X2luaXQodm9pZCk7CiBpbnQgaTkxNV9n bG9iYWxfb2JqZWN0c19pbml0KHZvaWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5 MTUvaTkxNV9zY2F0dGVybGlzdC5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9zY2F0dGVy bGlzdC5jCmluZGV4IGNjNmIzODQ2YThjNy4uNjllOWU2YzMxMzVlIDEwMDY0NAotLS0gYS9kcml2 ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3NjYXR0ZXJsaXN0LmMKKysrIGIvZHJpdmVycy9ncHUvZHJt L2k5MTUvaTkxNV9zY2F0dGVybGlzdC5jCkBAIC02LDYgKzYsMTAgQEAKIAogI2luY2x1ZGUgImk5 MTVfc2NhdHRlcmxpc3QuaCIKIAorI2luY2x1ZGUgPGRybS9kcm1fbW0uaD4KKworI2luY2x1ZGUg PGxpbnV4L3NsYWIuaD4KKwogYm9vbCBpOTE1X3NnX3RyaW0oc3RydWN0IHNnX3RhYmxlICpvcmln X3N0KQogewogCXN0cnVjdCBzZ190YWJsZSBuZXdfc3Q7CkBAIC0zNCw2ICszOCw3MiBAQCBib29s IGk5MTVfc2dfdHJpbShzdHJ1Y3Qgc2dfdGFibGUgKm9yaWdfc3QpCiAJcmV0dXJuIHRydWU7CiB9 CiAKKy8qKgorICogaTkxNV9zZ19mcm9tX21tX25vZGUgLSBDcmVhdGUgYW4gc2dfdGFibGUgZnJv bSBhIHN0cnVjdCBkcm1fbW1fbm9kZQorICogQG5vZGU6IFRoZSBkcm1fbW1fbm9kZS4KKyAqIEBy ZWdpb25fc3RhcnQ6IEFuIG9mZnNldCB0byBhZGQgdG8gdGhlIGRtYSBhZGRyZXNzZXMgb2YgdGhl IHNnIGxpc3QuCisgKgorICogQ3JlYXRlIGEgc3RydWN0IHNnX3RhYmxlLCBpbml0aWFsaXppbmcg aXQgZnJvbSBhIHN0cnVjdCBkcm1fbW1fbm9kZSwKKyAqIHRha2luZyBhIG1heGltdW0gc2VnbWVu dCBsZW5ndGggaW50byBhY2NvdW50LCBzcGxpdHRpbmcgaW50byBzZWdtZW50cworICogaWYgbmVj ZXNzYXJ5LgorICoKKyAqIFJldHVybjogQSBwb2ludGVyIHRvIGEga21hbGxvY2VkIHN0cnVjdCBz Z190YWJsZSBvbiBzdWNjZXNzLCBuZWdhdGl2ZQorICogZXJyb3IgY29kZSBjYXN0IHRvIGFuIGVy cm9yIHBvaW50ZXIgb24gZmFpbHVyZS4KKyAqLworc3RydWN0IHNnX3RhYmxlICppOTE1X3NnX2Zy b21fbW1fbm9kZShjb25zdCBzdHJ1Y3QgZHJtX21tX25vZGUgKm5vZGUsCisJCQkJICAgICAgdTY0 IHJlZ2lvbl9zdGFydCkKK3sKKwljb25zdCB1NjQgbWF4X3NlZ21lbnQgPSBTWl8xRzsgLyogRG8g d2UgaGF2ZSBhIGxpbWl0IG9uIHRoaXM/ICovCisJdTY0IHNlZ21lbnRfcGFnZXMgPSBtYXhfc2Vn bWVudCA+PiBQQUdFX1NISUZUOworCXU2NCBibG9ja19zaXplLCBvZmZzZXQsIHByZXZfZW5kOwor CXN0cnVjdCBzZ190YWJsZSAqc3Q7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKKworCXN0ID0g a21hbGxvYyhzaXplb2YoKnN0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzdCkKKwkJcmV0dXJuIEVS Ul9QVFIoLUVOT01FTSk7CisKKwlpZiAoc2dfYWxsb2NfdGFibGUoc3QsIERJVl9ST1VORF9VUChu b2RlLT5zaXplLCBzZWdtZW50X3BhZ2VzKSwKKwkJCSAgIEdGUF9LRVJORUwpKSB7CisJCWtmcmVl KHN0KTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJfQorCisJc2cgPSBzdC0+c2dsOwor CXN0LT5uZW50cyA9IDA7CisJcHJldl9lbmQgPSAocmVzb3VyY2Vfc2l6ZV90KS0xOworCWJsb2Nr X3NpemUgPSBub2RlLT5zaXplIDw8IFBBR0VfU0hJRlQ7CisJb2Zmc2V0ID0gbm9kZS0+c3RhcnQg PDwgUEFHRV9TSElGVDsKKworCXdoaWxlIChibG9ja19zaXplKSB7CisJCXU2NCBsZW47CisKKwkJ aWYgKG9mZnNldCAhPSBwcmV2X2VuZCB8fCBzZy0+bGVuZ3RoID49IG1heF9zZWdtZW50KSB7CisJ CQlpZiAoc3QtPm5lbnRzKQorCQkJCXNnID0gX19zZ19uZXh0KHNnKTsKKworCQkJc2dfZG1hX2Fk ZHJlc3Moc2cpID0gcmVnaW9uX3N0YXJ0ICsgb2Zmc2V0OworCQkJc2dfZG1hX2xlbihzZykgPSAw OworCQkJc2ctPmxlbmd0aCA9IDA7CisJCQlzdC0+bmVudHMrKzsKKwkJfQorCisJCWxlbiA9IG1p bihibG9ja19zaXplLCBtYXhfc2VnbWVudCAtIHNnLT5sZW5ndGgpOworCQlzZy0+bGVuZ3RoICs9 IGxlbjsKKwkJc2dfZG1hX2xlbihzZykgKz0gbGVuOworCisJCW9mZnNldCArPSBsZW47CisJCWJs b2NrX3NpemUgLT0gbGVuOworCisJCXByZXZfZW5kID0gb2Zmc2V0OworCX0KKworCXNnX21hcmtf ZW5kKHNnKTsKKwlpOTE1X3NnX3RyaW0oc3QpOworCisJcmV0dXJuIHN0OworfQorCiAjaWYgSVNf RU5BQkxFRChDT05GSUdfRFJNX0k5MTVfU0VMRlRFU1QpCiAjaW5jbHVkZSAic2VsZnRlc3RzL3Nj YXR0ZXJsaXN0LmMiCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5 MTVfc2NhdHRlcmxpc3QuaCBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfc2NhdHRlcmxpc3Qu aAppbmRleCBiOTZiYWFkNjZhM2EuLjVhY2NhNDVlYTk4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9n cHUvZHJtL2k5MTUvaTkxNV9zY2F0dGVybGlzdC5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1 L2k5MTVfc2NhdHRlcmxpc3QuaApAQCAtMTMsNiArMTMsOCBAQAogCiAjaW5jbHVkZSAiaTkxNV9n ZW0uaCIKIAorc3RydWN0IGRybV9tbV9ub2RlOworCiAvKgogICogT3B0aW1pc2VkIFNHTCBpdGVy YXRvciBmb3IgR0VNIG9iamVjdHMKICAqLwpAQCAtMTQxLDQgKzE0Myw2IEBAIHN0YXRpYyBpbmxp bmUgdW5zaWduZWQgaW50IGk5MTVfc2dfc2VnbWVudF9zaXplKHZvaWQpCiAKIGJvb2wgaTkxNV9z Z190cmltKHN0cnVjdCBzZ190YWJsZSAqb3JpZ19zdCk7CiAKK3N0cnVjdCBzZ190YWJsZSAqaTkx NV9zZ19mcm9tX21tX25vZGUoY29uc3Qgc3RydWN0IGRybV9tbV9ub2RlICpub2RlLAorCQkJCSAg ICAgIHU2NCByZWdpb25fc3RhcnQpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9k cm0vaTkxNS9pbnRlbF9tZW1vcnlfcmVnaW9uLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRl bF9tZW1vcnlfcmVnaW9uLmMKaW5kZXggZDk4ZThiODFkMzIyLi40MDkyY2M5ODc2NzkgMTAwNjQ0 Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX21lbW9yeV9yZWdpb24uYworKysgYi9k cml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9tZW1vcnlfcmVnaW9uLmMKQEAgLTI4LDYgKzI4LDEx IEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3QgewogCX0sCiB9OwogCitzdHJ1Y3QgaW50ZWxfcmVnaW9u X3Jlc2VydmUgeworCXN0cnVjdCBsaXN0X2hlYWQgbGluazsKKwl2b2lkICpub2RlOworfTsKKwog c3RydWN0IGludGVsX21lbW9yeV9yZWdpb24gKgogaW50ZWxfbWVtb3J5X3JlZ2lvbl9sb29rdXAo c3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUsCiAJCQkgICB1MTYgY2xhc3MsIHUxNiBpbnN0 YW5jZSkKQEAgLTU4LDE0NiArNjMsNjEgQEAgaW50ZWxfbWVtb3J5X3JlZ2lvbl9ieV90eXBlKHN0 cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1LAogCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMg dTY0Ci1pbnRlbF9tZW1vcnlfcmVnaW9uX2ZyZWVfcGFnZXMoc3RydWN0IGludGVsX21lbW9yeV9y ZWdpb24gKm1lbSwKLQkJCSAgICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpibG9ja3MpCisvKioKKyAq IGludGVsX21lbW9yeV9yZWdpb25fdW5yZXNlcnZlIC0gVW5yZXNlcnZlIGFsbCBwcmV2aW91c2x5 IHJlc2VydmVkCisgKiByYW5nZXMKKyAqIEBtZW06IFRoZSByZWdpb24gY29udGFpbmluZyB0aGUg cmVzZXJ2ZWQgcmFuZ2VzLgorICovCit2b2lkIGludGVsX21lbW9yeV9yZWdpb25fdW5yZXNlcnZl KHN0cnVjdCBpbnRlbF9tZW1vcnlfcmVnaW9uICptZW0pCiB7Ci0Jc3RydWN0IGk5MTVfYnVkZHlf YmxvY2sgKmJsb2NrLCAqb247Ci0JdTY0IHNpemUgPSAwOworCXN0cnVjdCBpbnRlbF9yZWdpb25f cmVzZXJ2ZSAqcmVzZXJ2ZSwgKm5leHQ7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYmxv Y2ssIG9uLCBibG9ja3MsIGxpbmspIHsKLQkJc2l6ZSArPSBpOTE1X2J1ZGR5X2Jsb2NrX3NpemUo Jm1lbS0+bW0sIGJsb2NrKTsKLQkJaTkxNV9idWRkeV9mcmVlKCZtZW0tPm1tLCBibG9jayk7Ci0J fQotCUlOSVRfTElTVF9IRUFEKGJsb2Nrcyk7CisJaWYgKCFtZW0tPnByaXZfb3BzIHx8ICFtZW0t PnByaXZfb3BzLT5mcmVlKQorCQlyZXR1cm47CiAKLQlyZXR1cm4gc2l6ZTsKLX0KLQotdm9pZAot X19pbnRlbF9tZW1vcnlfcmVnaW9uX3B1dF9wYWdlc19idWRkeShzdHJ1Y3QgaW50ZWxfbWVtb3J5 X3JlZ2lvbiAqbWVtLAotCQkJCSAgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmJsb2NrcykKLXsKIAlt dXRleF9sb2NrKCZtZW0tPm1tX2xvY2spOwotCW1lbS0+YXZhaWwgKz0gaW50ZWxfbWVtb3J5X3Jl Z2lvbl9mcmVlX3BhZ2VzKG1lbSwgYmxvY2tzKTsKLQltdXRleF91bmxvY2soJm1lbS0+bW1fbG9j ayk7Ci19Ci0KLXZvaWQKLV9faW50ZWxfbWVtb3J5X3JlZ2lvbl9wdXRfYmxvY2tfYnVkZHkoc3Ry dWN0IGk5MTVfYnVkZHlfYmxvY2sgKmJsb2NrKQotewotCXN0cnVjdCBsaXN0X2hlYWQgYmxvY2tz OwotCi0JSU5JVF9MSVNUX0hFQUQoJmJsb2Nrcyk7Ci0JbGlzdF9hZGQoJmJsb2NrLT5saW5rLCAm YmxvY2tzKTsKLQlfX2ludGVsX21lbW9yeV9yZWdpb25fcHV0X3BhZ2VzX2J1ZGR5KGJsb2NrLT5w cml2YXRlLCAmYmxvY2tzKTsKLX0KLQotaW50Ci1fX2ludGVsX21lbW9yeV9yZWdpb25fZ2V0X3Bh Z2VzX2J1ZGR5KHN0cnVjdCBpbnRlbF9tZW1vcnlfcmVnaW9uICptZW0sCi0JCQkJICAgICAgcmVz b3VyY2Vfc2l6ZV90IHNpemUsCi0JCQkJICAgICAgdW5zaWduZWQgaW50IGZsYWdzLAotCQkJCSAg ICAgIHN0cnVjdCBsaXN0X2hlYWQgKmJsb2NrcykKLXsKLQl1bnNpZ25lZCBpbnQgbWluX29yZGVy ID0gMDsKLQl1bnNpZ25lZCBsb25nIG5fcGFnZXM7Ci0KLQlHRU1fQlVHX09OKCFJU19BTElHTkVE KHNpemUsIG1lbS0+bW0uY2h1bmtfc2l6ZSkpOwotCUdFTV9CVUdfT04oIWxpc3RfZW1wdHkoYmxv Y2tzKSk7Ci0KLQlpZiAoZmxhZ3MgJiBJOTE1X0FMTE9DX01JTl9QQUdFX1NJWkUpIHsKLQkJbWlu X29yZGVyID0gaWxvZzIobWVtLT5taW5fcGFnZV9zaXplKSAtCi0JCQkgICAgaWxvZzIobWVtLT5t bS5jaHVua19zaXplKTsKLQl9Ci0KLQlpZiAoZmxhZ3MgJiBJOTE1X0FMTE9DX0NPTlRJR1VPVVMp IHsKLQkJc2l6ZSA9IHJvdW5kdXBfcG93X29mX3R3byhzaXplKTsKLQkJbWluX29yZGVyID0gaWxv ZzIoc2l6ZSkgLSBpbG9nMihtZW0tPm1tLmNodW5rX3NpemUpOworCWxpc3RfZm9yX2VhY2hfZW50 cnlfc2FmZShyZXNlcnZlLCBuZXh0LCAmbWVtLT5yZXNlcnZlZCwgbGluaykgeworCQlsaXN0X2Rl bCgmcmVzZXJ2ZS0+bGluayk7CisJCW1lbS0+cHJpdl9vcHMtPmZyZWUobWVtLCByZXNlcnZlLT5u b2RlKTsKKwkJa2ZyZWUocmVzZXJ2ZSk7CiAJfQotCi0JaWYgKHNpemUgPiBtZW0tPm1tLnNpemUp Ci0JCXJldHVybiAtRTJCSUc7Ci0KLQluX3BhZ2VzID0gc2l6ZSA+PiBpbG9nMihtZW0tPm1tLmNo dW5rX3NpemUpOwotCi0JbXV0ZXhfbG9jaygmbWVtLT5tbV9sb2NrKTsKLQotCWRvIHsKLQkJc3Ry dWN0IGk5MTVfYnVkZHlfYmxvY2sgKmJsb2NrOwotCQl1bnNpZ25lZCBpbnQgb3JkZXI7Ci0KLQkJ b3JkZXIgPSBmbHMobl9wYWdlcykgLSAxOwotCQlHRU1fQlVHX09OKG9yZGVyID4gbWVtLT5tbS5t YXhfb3JkZXIpOwotCQlHRU1fQlVHX09OKG9yZGVyIDwgbWluX29yZGVyKTsKLQotCQlkbyB7Ci0J CQlibG9jayA9IGk5MTVfYnVkZHlfYWxsb2MoJm1lbS0+bW0sIG9yZGVyKTsKLQkJCWlmICghSVNf RVJSKGJsb2NrKSkKLQkJCQlicmVhazsKLQotCQkJaWYgKG9yZGVyLS0gPT0gbWluX29yZGVyKQot CQkJCWdvdG8gZXJyX2ZyZWVfYmxvY2tzOwotCQl9IHdoaWxlICgxKTsKLQotCQluX3BhZ2VzIC09 IEJJVChvcmRlcik7Ci0KLQkJYmxvY2stPnByaXZhdGUgPSBtZW07Ci0JCWxpc3RfYWRkX3RhaWwo JmJsb2NrLT5saW5rLCBibG9ja3MpOwotCi0JCWlmICghbl9wYWdlcykKLQkJCWJyZWFrOwotCX0g d2hpbGUgKDEpOwotCi0JbWVtLT5hdmFpbCAtPSBzaXplOwogCW11dGV4X3VubG9jaygmbWVtLT5t bV9sb2NrKTsKLQlyZXR1cm4gMDsKLQotZXJyX2ZyZWVfYmxvY2tzOgotCWludGVsX21lbW9yeV9y ZWdpb25fZnJlZV9wYWdlcyhtZW0sIGJsb2Nrcyk7Ci0JbXV0ZXhfdW5sb2NrKCZtZW0tPm1tX2xv Y2spOwotCXJldHVybiAtRU5YSU87CiB9CiAKLXN0cnVjdCBpOTE1X2J1ZGR5X2Jsb2NrICoKLV9f aW50ZWxfbWVtb3J5X3JlZ2lvbl9nZXRfYmxvY2tfYnVkZHkoc3RydWN0IGludGVsX21lbW9yeV9y ZWdpb24gKm1lbSwKLQkJCQkgICAgICByZXNvdXJjZV9zaXplX3Qgc2l6ZSwKLQkJCQkgICAgICB1 bnNpZ25lZCBpbnQgZmxhZ3MpCisvKioKKyAqIGludGVsX21lbW9yeV9yZWdpb25fcmVzZXJ2ZSAt IFJlc2VydmUgYSBtZW1vcnkgcmFuZ2UKKyAqIEBtZW06IFRoZSByZWdpb24gZm9yIHdoaWNoIHdl IHdhbnQgdG8gcmVzZXJ2ZSBhIHJhbmdlLgorICogQG9mZnNldDogU3RhcnQgb2YgdGhlIHJhbmdl IHRvIHJlc2VydmUuCisgKiBAc2l6ZTogVGhlIHNpemUgb2YgdGhlIHJhbmdlIHRvIHJlc2VydmUu CisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFp bHVyZS4KKyAqLworaW50IGludGVsX21lbW9yeV9yZWdpb25fcmVzZXJ2ZShzdHJ1Y3QgaW50ZWxf bWVtb3J5X3JlZ2lvbiAqbWVtLAorCQkJCXJlc291cmNlX3NpemVfdCBvZmZzZXQsCisJCQkJcmVz b3VyY2Vfc2l6ZV90IHNpemUpCiB7Ci0Jc3RydWN0IGk5MTVfYnVkZHlfYmxvY2sgKmJsb2NrOwot CUxJU1RfSEVBRChibG9ja3MpOwogCWludCByZXQ7CisJc3RydWN0IGludGVsX3JlZ2lvbl9yZXNl cnZlICpyZXNlcnZlOwogCi0JcmV0ID0gX19pbnRlbF9tZW1vcnlfcmVnaW9uX2dldF9wYWdlc19i dWRkeShtZW0sIHNpemUsIGZsYWdzLCAmYmxvY2tzKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gRVJS X1BUUihyZXQpOworCWlmICghbWVtLT5wcml2X29wcyB8fCAhbWVtLT5wcml2X29wcy0+cmVzZXJ2 ZSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKLQlibG9jayA9IGxpc3RfZmlyc3RfZW50cnkoJmJsb2Nr cywgdHlwZW9mKCpibG9jayksIGxpbmspOwotCWxpc3RfZGVsX2luaXQoJmJsb2NrLT5saW5rKTsK LQlyZXR1cm4gYmxvY2s7Ci19CisJcmVzZXJ2ZSA9IGt6YWxsb2Moc2l6ZW9mKCpyZXNlcnZlKSwg R0ZQX0tFUk5FTCk7CisJaWYgKCFyZXNlcnZlKQorCQlyZXR1cm4gLUVOT01FTTsKIAotaW50IGlu dGVsX21lbW9yeV9yZWdpb25faW5pdF9idWRkeShzdHJ1Y3QgaW50ZWxfbWVtb3J5X3JlZ2lvbiAq bWVtKQotewotCXJldHVybiBpOTE1X2J1ZGR5X2luaXQoJm1lbS0+bW0sIHJlc291cmNlX3NpemUo Jm1lbS0+cmVnaW9uKSwKLQkJCSAgICAgICBQQUdFX1NJWkUpOwotfQotCi12b2lkIGludGVsX21l bW9yeV9yZWdpb25fcmVsZWFzZV9idWRkeShzdHJ1Y3QgaW50ZWxfbWVtb3J5X3JlZ2lvbiAqbWVt KQotewotCWk5MTVfYnVkZHlfZnJlZV9saXN0KCZtZW0tPm1tLCAmbWVtLT5yZXNlcnZlZCk7Ci0J aTkxNV9idWRkeV9maW5pKCZtZW0tPm1tKTsKLX0KLQotaW50IGludGVsX21lbW9yeV9yZWdpb25f cmVzZXJ2ZShzdHJ1Y3QgaW50ZWxfbWVtb3J5X3JlZ2lvbiAqbWVtLAotCQkJCXU2NCBvZmZzZXQs IHU2NCBzaXplKQotewotCWludCByZXQ7CisJcmVzZXJ2ZS0+bm9kZSA9IG1lbS0+cHJpdl9vcHMt PnJlc2VydmUobWVtLCBvZmZzZXQsIHNpemUpOworCWlmIChJU19FUlIocmVzZXJ2ZS0+bm9kZSkp IHsKKwkJcmV0ID0gUFRSX0VSUihyZXNlcnZlLT5ub2RlKTsKKwkJa2ZyZWUocmVzZXJ2ZSk7CisJ CXJldHVybiByZXQ7CisJfQogCiAJbXV0ZXhfbG9jaygmbWVtLT5tbV9sb2NrKTsKLQlyZXQgPSBp OTE1X2J1ZGR5X2FsbG9jX3JhbmdlKCZtZW0tPm1tLCAmbWVtLT5yZXNlcnZlZCwgb2Zmc2V0LCBz aXplKTsKKwlsaXN0X2FkZF90YWlsKCZyZXNlcnZlLT5saW5rLCAmbWVtLT5yZXNlcnZlZCk7CiAJ bXV0ZXhfdW5sb2NrKCZtZW0tPm1tX2xvY2spOwogCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gMDsK IH0KIAogc3RydWN0IGludGVsX21lbW9yeV9yZWdpb24gKgpAQCAtMjA2LDYgKzEyNiw4IEBAIGlu dGVsX21lbW9yeV9yZWdpb25fY3JlYXRlKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1LAog CQkJICAgcmVzb3VyY2Vfc2l6ZV90IHNpemUsCiAJCQkgICByZXNvdXJjZV9zaXplX3QgbWluX3Bh Z2Vfc2l6ZSwKIAkJCSAgIHJlc291cmNlX3NpemVfdCBpb19zdGFydCwKKwkJCSAgIHUxNiB0eXBl LAorCQkJICAgdTE2IGluc3RhbmNlLAogCQkJICAgY29uc3Qgc3RydWN0IGludGVsX21lbW9yeV9y ZWdpb25fb3BzICpvcHMpCiB7CiAJc3RydWN0IGludGVsX21lbW9yeV9yZWdpb24gKm1lbTsKQEAg LTIyMiw2ICsxNDQsOCBAQCBpbnRlbF9tZW1vcnlfcmVnaW9uX2NyZWF0ZShzdHJ1Y3QgZHJtX2k5 MTVfcHJpdmF0ZSAqaTkxNSwKIAltZW0tPm9wcyA9IG9wczsKIAltZW0tPnRvdGFsID0gc2l6ZTsK IAltZW0tPmF2YWlsID0gbWVtLT50b3RhbDsKKwltZW0tPnR5cGUgPSB0eXBlOworCW1lbS0+aW5z dGFuY2UgPSBpbnN0YW5jZTsKIAogCW11dGV4X2luaXQoJm1lbS0+b2JqZWN0cy5sb2NrKTsKIAlJ TklUX0xJU1RfSEVBRCgmbWVtLT5vYmplY3RzLmxpc3QpOwpAQCAtMjU5LDYgKzE4Myw3IEBAIHN0 YXRpYyB2b2lkIF9faW50ZWxfbWVtb3J5X3JlZ2lvbl9kZXN0cm95KHN0cnVjdCBrcmVmICprcmVm KQogCXN0cnVjdCBpbnRlbF9tZW1vcnlfcmVnaW9uICptZW0gPQogCQljb250YWluZXJfb2Yoa3Jl ZiwgdHlwZW9mKCptZW0pLCBrcmVmKTsKIAorCWludGVsX21lbW9yeV9yZWdpb25fdW5yZXNlcnZl KG1lbSk7CiAJaWYgKG1lbS0+b3BzLT5yZWxlYXNlKQogCQltZW0tPm9wcy0+cmVsZWFzZShtZW0p OwogCkBAIC0yOTYsMTUgKzIyMSwxNSBAQCBpbnQgaW50ZWxfbWVtb3J5X3JlZ2lvbnNfaHdfcHJv YmUoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUpCiAJCWluc3RhbmNlID0gaW50ZWxfcmVn aW9uX21hcFtpXS5pbnN0YW5jZTsKIAkJc3dpdGNoICh0eXBlKSB7CiAJCWNhc2UgSU5URUxfTUVN T1JZX1NZU1RFTToKLQkJCW1lbSA9IGk5MTVfZ2VtX3NobWVtX3NldHVwKGk5MTUpOworCQkJbWVt ID0gaTkxNV9nZW1fc2htZW1fc2V0dXAoaTkxNSwgdHlwZSwgaW5zdGFuY2UpOwogCQkJYnJlYWs7 CiAJCWNhc2UgSU5URUxfTUVNT1JZX1NUT0xFTl9MT0NBTDoKLQkJCW1lbSA9IGk5MTVfZ2VtX3N0 b2xlbl9sbWVtX3NldHVwKGk5MTUpOworCQkJbWVtID0gaTkxNV9nZW1fc3RvbGVuX2xtZW1fc2V0 dXAoaTkxNSwgdHlwZSwgaW5zdGFuY2UpOwogCQkJaWYgKCFJU19FUlIobWVtKSkKIAkJCQlpOTE1 LT5tbS5zdG9sZW5fcmVnaW9uID0gbWVtOwogCQkJYnJlYWs7CiAJCWNhc2UgSU5URUxfTUVNT1JZ X1NUT0xFTl9TWVNURU06Ci0JCQltZW0gPSBpOTE1X2dlbV9zdG9sZW5fc21lbV9zZXR1cChpOTE1 KTsKKwkJCW1lbSA9IGk5MTVfZ2VtX3N0b2xlbl9zbWVtX3NldHVwKGk5MTUsIHR5cGUsIGluc3Rh bmNlKTsKIAkJCWlmICghSVNfRVJSKG1lbSkpCiAJCQkJaTkxNS0+bW0uc3RvbGVuX3JlZ2lvbiA9 IG1lbTsKIAkJCWJyZWFrOwpAQCAtMzIxLDkgKzI0Niw2IEBAIGludCBpbnRlbF9tZW1vcnlfcmVn aW9uc19od19wcm9iZShzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSkKIAkJfQogCiAJCW1l bS0+aWQgPSBpOwotCQltZW0tPnR5cGUgPSB0eXBlOwotCQltZW0tPmluc3RhbmNlID0gaW5zdGFu Y2U7Ci0KIAkJaTkxNS0+bW0ucmVnaW9uc1tpXSA9IG1lbTsKIAl9CiAKZGlmZiAtLWdpdCBhL2Ry aXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX21lbW9yeV9yZWdpb24uaCBiL2RyaXZlcnMvZ3B1L2Ry bS9pOTE1L2ludGVsX21lbW9yeV9yZWdpb24uaAppbmRleCBkMjRjZTVhMGIzMGIuLmU2OWNkZTEz ZGFmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfbWVtb3J5X3JlZ2lv bi5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX21lbW9yeV9yZWdpb24uaApAQCAt MTMsOCArMTMsNiBAQAogI2luY2x1ZGUgPGRybS9kcm1fbW0uaD4KICNpbmNsdWRlIDxkcm0vaTkx NV9kcm0uaD4KIAotI2luY2x1ZGUgImk5MTVfYnVkZHkuaCIKLQogc3RydWN0IGRybV9pOTE1X3By aXZhdGU7CiBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdDsKIHN0cnVjdCBpbnRlbF9tZW1vcnlf cmVnaW9uOwpAQCAtMjUsNiArMjMsNyBAQCBlbnVtIGludGVsX21lbW9yeV90eXBlIHsKIAlJTlRF TF9NRU1PUllfTE9DQUwgPSBJOTE1X01FTU9SWV9DTEFTU19ERVZJQ0UsCiAJSU5URUxfTUVNT1JZ X1NUT0xFTl9TWVNURU0sCiAJSU5URUxfTUVNT1JZX1NUT0xFTl9MT0NBTCwKKwlJTlRFTF9NRU1P UllfTU9DSywKIH07CiAKIGVudW0gaW50ZWxfcmVnaW9uX2lkIHsKQEAgLTU5LDEwICs1OCwxOSBA QCBzdHJ1Y3QgaW50ZWxfbWVtb3J5X3JlZ2lvbl9vcHMgewogCQkJICAgdW5zaWduZWQgaW50IGZs YWdzKTsKIH07CiAKK3N0cnVjdCBpbnRlbF9tZW1vcnlfcmVnaW9uX3ByaXZhdGVfb3BzIHsKKwl2 b2lkICooKnJlc2VydmUpKHN0cnVjdCBpbnRlbF9tZW1vcnlfcmVnaW9uICptZW0sCisJCQkgcmVz b3VyY2Vfc2l6ZV90IG9mZnNldCwKKwkJCSByZXNvdXJjZV9zaXplX3Qgc2l6ZSk7CisJdm9pZCAo KmZyZWUpKHN0cnVjdCBpbnRlbF9tZW1vcnlfcmVnaW9uICptZW0sCisJCSAgICAgdm9pZCAqbm9k ZSk7Cit9OworCiBzdHJ1Y3QgaW50ZWxfbWVtb3J5X3JlZ2lvbiB7CiAJc3RydWN0IGRybV9pOTE1 X3ByaXZhdGUgKmk5MTU7CiAKIAljb25zdCBzdHJ1Y3QgaW50ZWxfbWVtb3J5X3JlZ2lvbl9vcHMg Km9wczsKKwljb25zdCBzdHJ1Y3QgaW50ZWxfbWVtb3J5X3JlZ2lvbl9wcml2YXRlX29wcyAqcHJp dl9vcHM7CiAKIAlzdHJ1Y3QgaW9fbWFwcGluZyBpb21hcDsKIAlzdHJ1Y3QgcmVzb3VyY2UgcmVn aW9uOwpAQCAtNzAsNyArNzgsNiBAQCBzdHJ1Y3QgaW50ZWxfbWVtb3J5X3JlZ2lvbiB7CiAJLyog Rm9yIGZha2UgTE1FTSAqLwogCXN0cnVjdCBkcm1fbW1fbm9kZSBmYWtlX21hcHBhYmxlOwogCi0J c3RydWN0IGk5MTVfYnVkZHlfbW0gbW07CiAJc3RydWN0IG11dGV4IG1tX2xvY2s7CiAKIAlzdHJ1 Y3Qga3JlZiBrcmVmOwpAQCAtOTUsMzYgKzEwMiwyNiBAQCBzdHJ1Y3QgaW50ZWxfbWVtb3J5X3Jl Z2lvbiB7CiAJCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIAkJc3RydWN0IGxpc3RfaGVhZCBwdXJn ZWFibGU7CiAJfSBvYmplY3RzOworCisJc2l6ZV90IGNodW5rX3NpemU7CisJdW5zaWduZWQgaW50 IG1heF9vcmRlcjsKKwlib29sIGlzX3JhbmdlX21hbmFnZXI7CisKKwl2b2lkICpyZWdpb25fcHJp dmF0ZTsKIH07CiAKIHN0cnVjdCBpbnRlbF9tZW1vcnlfcmVnaW9uICoKIGludGVsX21lbW9yeV9y ZWdpb25fbG9va3VwKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1LAogCQkJICAgdTE2IGNs YXNzLCB1MTYgaW5zdGFuY2UpOwogCi1pbnQgaW50ZWxfbWVtb3J5X3JlZ2lvbl9pbml0X2J1ZGR5 KHN0cnVjdCBpbnRlbF9tZW1vcnlfcmVnaW9uICptZW0pOwotdm9pZCBpbnRlbF9tZW1vcnlfcmVn aW9uX3JlbGVhc2VfYnVkZHkoc3RydWN0IGludGVsX21lbW9yeV9yZWdpb24gKm1lbSk7Ci0KLWlu dCBfX2ludGVsX21lbW9yeV9yZWdpb25fZ2V0X3BhZ2VzX2J1ZGR5KHN0cnVjdCBpbnRlbF9tZW1v cnlfcmVnaW9uICptZW0sCi0JCQkJCSAgcmVzb3VyY2Vfc2l6ZV90IHNpemUsCi0JCQkJCSAgdW5z aWduZWQgaW50IGZsYWdzLAotCQkJCQkgIHN0cnVjdCBsaXN0X2hlYWQgKmJsb2Nrcyk7Ci1zdHJ1 Y3QgaTkxNV9idWRkeV9ibG9jayAqCi1fX2ludGVsX21lbW9yeV9yZWdpb25fZ2V0X2Jsb2NrX2J1 ZGR5KHN0cnVjdCBpbnRlbF9tZW1vcnlfcmVnaW9uICptZW0sCi0JCQkJICAgICAgcmVzb3VyY2Vf c2l6ZV90IHNpemUsCi0JCQkJICAgICAgdW5zaWduZWQgaW50IGZsYWdzKTsKLXZvaWQgX19pbnRl bF9tZW1vcnlfcmVnaW9uX3B1dF9wYWdlc19idWRkeShzdHJ1Y3QgaW50ZWxfbWVtb3J5X3JlZ2lv biAqbWVtLAotCQkJCQkgICBzdHJ1Y3QgbGlzdF9oZWFkICpibG9ja3MpOwotdm9pZCBfX2ludGVs X21lbW9yeV9yZWdpb25fcHV0X2Jsb2NrX2J1ZGR5KHN0cnVjdCBpOTE1X2J1ZGR5X2Jsb2NrICpi bG9jayk7Ci0KLWludCBpbnRlbF9tZW1vcnlfcmVnaW9uX3Jlc2VydmUoc3RydWN0IGludGVsX21l bW9yeV9yZWdpb24gKm1lbSwKLQkJCQl1NjQgb2Zmc2V0LCB1NjQgc2l6ZSk7Ci0KIHN0cnVjdCBp bnRlbF9tZW1vcnlfcmVnaW9uICoKIGludGVsX21lbW9yeV9yZWdpb25fY3JlYXRlKHN0cnVjdCBk cm1faTkxNV9wcml2YXRlICppOTE1LAogCQkJICAgcmVzb3VyY2Vfc2l6ZV90IHN0YXJ0LAogCQkJ ICAgcmVzb3VyY2Vfc2l6ZV90IHNpemUsCiAJCQkgICByZXNvdXJjZV9zaXplX3QgbWluX3BhZ2Vf c2l6ZSwKIAkJCSAgIHJlc291cmNlX3NpemVfdCBpb19zdGFydCwKKwkJCSAgIHUxNiB0eXBlLAor CQkJICAgdTE2IGluc3RhbmNlLAogCQkJICAgY29uc3Qgc3RydWN0IGludGVsX21lbW9yeV9yZWdp b25fb3BzICpvcHMpOwogCiBzdHJ1Y3QgaW50ZWxfbWVtb3J5X3JlZ2lvbiAqCkBAIC0xNDEsNCAr MTM4LDkgQEAgX19wcmludGYoMiwgMykgdm9pZAogaW50ZWxfbWVtb3J5X3JlZ2lvbl9zZXRfbmFt ZShzdHJ1Y3QgaW50ZWxfbWVtb3J5X3JlZ2lvbiAqbWVtLAogCQkJICAgICBjb25zdCBjaGFyICpm bXQsIC4uLik7CiAKK3ZvaWQgaW50ZWxfbWVtb3J5X3JlZ2lvbl91bnJlc2VydmUoc3RydWN0IGlu dGVsX21lbW9yeV9yZWdpb24gKm1lbSk7CisKK2ludCBpbnRlbF9tZW1vcnlfcmVnaW9uX3Jlc2Vy dmUoc3RydWN0IGludGVsX21lbW9yeV9yZWdpb24gKm1lbSwKKwkJCQlyZXNvdXJjZV9zaXplX3Qg b2Zmc2V0LAorCQkJCXJlc291cmNlX3NpemVfdCBzaXplKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEv ZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfcmVnaW9uX3R0bS5jIGIvZHJpdmVycy9ncHUvZHJt L2k5MTUvaW50ZWxfcmVnaW9uX3R0bS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAw MDAwMDAwMC4uNjljOTgyOTgzMjZiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJt L2k5MTUvaW50ZWxfcmVnaW9uX3R0bS5jCkBAIC0wLDAgKzEsMzM0IEBACisvLyBTUERYLUxpY2Vu c2UtSWRlbnRpZmllcjogTUlUCisvKgorICogQ29weXJpZ2h0IMKpIDIwMjEgSW50ZWwgQ29ycG9y YXRpb24KKyAqLworI2luY2x1ZGUgPGRybS90dG0vdHRtX2JvX2RyaXZlci5oPgorI2luY2x1ZGUg PGRybS90dG0vdHRtX2RldmljZS5oPgorCisjaW5jbHVkZSAiaTkxNV9kcnYuaCIKKyNpbmNsdWRl ICJpOTE1X3NjYXR0ZXJsaXN0LmgiCisKKyNpbmNsdWRlICJpbnRlbF9yZWdpb25fdHRtLmgiCisK Ky8qKgorICogRE9DOiBUVE0gc3VwcG9ydCBzdHJ1Y3R1cmUKKyAqCisgKiBUaGUgY29kZSBpbiB0 aGlzIGZpbGUgZGVhbHMgd2l0aCBzZXR0aW5nIHVwIG1lbW9yeSBtYW5hZ2VycyBmb3IgVFRNCisg KiBMTUVNIGFuZCBNT0NLIHJlZ2lvbnMgYW5kIGNvbnZlcnRpbmcgdGhlIG91dHB1dCBmcm9tCisg KiB0aGUgbWFuYWdlcnMgdG8gc3RydWN0IHNnX3RhYmxlLCBCYXNpY2FsbHkgcHJvdmlkaW5nIHRo ZSBtYXBwaW5nIGZyb20KKyAqIGk5MTUgR0VNIHJlZ2lvbnMgdG8gVFRNIG1lbW9yeSB0eXBlcyBh bmQgcmVzb3VyY2UgbWFuYWdlcnMuCisgKi8KKworLyoqCisgKiBzdHJ1Y3QgaW50ZWxfcmVnaW9u X3R0bV9wcml2YXRlIC0gUHJpdmF0ZSBpbmZvIGZvciBUVE0gcmVnaW9ucworICogQG1hbjogVGhl IFRUTSByZXNvdXJjZSBtYW5hZ2VyIHVzZWQgdG8gbWFuYWdlIHRoaXMgcmVnaW9uCisgKiBAbW9j a19iZGV2OiBBIG1vY2sgemVyby1pbml0aWFsaXplZCBUVE0gZGV2aWNlIGZvciB0aGlzIHJlZ2lv bgorICovCitzdHJ1Y3QgaW50ZWxfcmVnaW9uX3R0bV9wcml2YXRlIHsKKwlzdHJ1Y3QgdHRtX3Jl c291cmNlX21hbmFnZXIgKm1hbjsKKworCUk5MTVfU0VMRlRFU1RfREVDTEFSRShzdHJ1Y3QgdHRt X2RldmljZSBtb2NrX2JkZXYpOworCUk5MTVfU0VMRlRFU1RfREVDTEFSRShzdHJ1Y3QgZHJtX3Zt YV9vZmZzZXRfbWFuYWdlciBtb2NrX3ZtYSk7Cit9OworCisvKiBBIFplcm8taW5pdGlhbGl6ZWQg ZHJpdmVyIGZvciBub3cuIFdlIGRvbid0IGhhdmUgYSBUVE0gYmFja2VuZCB5ZXQuICovCitzdGF0 aWMgc3RydWN0IHR0bV9kZXZpY2VfZnVuY3MgaTkxNV90dG1fYm9fZHJpdmVyOworCitzdGF0aWMg c3RydWN0IGludGVsX3JlZ2lvbl90dG1fcHJpdmF0ZSAqdG9fdHRtX3ByaXZhdGUodm9pZCAqZGF0 YSkKK3sKKwlyZXR1cm4gKHN0cnVjdCBpbnRlbF9yZWdpb25fdHRtX3ByaXZhdGUgKilkYXRhOwor fQorCisvKioKKyAqIGludGVsX3JlZ2lvbl90dG1fZGV2aWNlX2luaXQgLSBJbml0aWFsaXplIGEg VFRNIGRldmljZQorICogQGRldl9wcml2OiBQb2ludGVyIHRvIGFuIGk5MTUgZGV2aWNlIHByaXZh dGUgc3RydWN0dXJlLgorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJv ciBjb2RlIG9uIGZhaWx1cmUuCisgKi8KK2ludCBpbnRlbF9yZWdpb25fdHRtX2RldmljZV9pbml0 KHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikKK3sKKwlzdHJ1Y3QgZHJtX2Rldmlj ZSAqZHJtID0gJmRldl9wcml2LT5kcm07CisKKwlyZXR1cm4gdHRtX2RldmljZV9pbml0KCZkZXZf cHJpdi0+YmRldiwgJmk5MTVfdHRtX2JvX2RyaXZlciwKKwkJCSAgICAgICBkcm0tPmRldiwgZHJt LT5hbm9uX2lub2RlLT5pX21hcHBpbmcsCisJCQkgICAgICAgZHJtLT52bWFfb2Zmc2V0X21hbmFn ZXIsIGZhbHNlLCBmYWxzZSk7Cit9CisKKy8qKgorICogaW50ZWxfcmVnaW9uX3R0bV9kZXZpY2Vf ZmluaSAtIEZpbmFsaXplIGEgVFRNIGRldmljZQorICogQGRldl9wcml2OiBQb2ludGVyIHRvIGFu IGk5MTUgZGV2aWNlIHByaXZhdGUgc3RydWN0dXJlLgorICovCit2b2lkIGludGVsX3JlZ2lvbl90 dG1fZGV2aWNlX2Zpbmkoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQoreworCXR0 bV9kZXZpY2VfZmluaSgmZGV2X3ByaXYtPmJkZXYpOworfQorCisvKgorICogTWFwIHRoZSBpOTE1 IG1lbW9yeSByZWdpb25zIHRvIFRUTSBtZW1vcnkgdHlwZXMuIFdlIHVzZSB0aGUKKyAqIGRyaXZl ci1wcml2YXRlIHR5cGVzIGZvciBub3csIHJlc2VydmluZyBUVE1fUExfVlJBTSBmb3Igc3RvbGVu CisgKiBtZW1vcnkgYW5kIFRUTV9QTF9UVCBmb3IgR0dUVCB1c2UgaWYgZGVjaWRlZCB0byBpbXBs ZW1lbnQgdGhpcy4KKyAqLworc3RhdGljIGludCBpbnRlbF9yZWdpb25fdG9fdHRtX3R5cGUoc3Ry dWN0IGludGVsX21lbW9yeV9yZWdpb24gKm1lbSkKK3sKKwlpbnQgdHlwZTsKKworCUdFTV9CVUdf T04obWVtLT50eXBlICE9IElOVEVMX01FTU9SWV9MT0NBTCAmJgorCQkgICBtZW0tPnR5cGUgIT0g SU5URUxfTUVNT1JZX01PQ0spOworCisJdHlwZSA9IG1lbS0+aW5zdGFuY2UgKyBUVE1fUExfUFJJ VjsKKwlHRU1fQlVHX09OKHR5cGUgPj0gVFRNX05VTV9NRU1fVFlQRVMpOworCisJcmV0dXJuIHR5 cGU7Cit9CisKK3N0YXRpYyB2b2lkICppbnRlbF9yZWdpb25fdHRtX25vZGVfcmVzZXJ2ZShzdHJ1 Y3QgaW50ZWxfbWVtb3J5X3JlZ2lvbiAqbWVtLAorCQkJCQkgICByZXNvdXJjZV9zaXplX3Qgb2Zm c2V0LAorCQkJCQkgICByZXNvdXJjZV9zaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgdHRtX3Jlc291 cmNlX21hbmFnZXIgKm1hbiA9CisJCXRvX3R0bV9wcml2YXRlKG1lbS0+cmVnaW9uX3ByaXZhdGUp LT5tYW47CisJc3RydWN0IHR0bV9wbGFjZSBwbGFjZSA9IHt9OworCXN0cnVjdCB0dG1fcmVzb3Vy Y2UgcmVzID0ge307CisJc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0IG1vY2tfYm8gPSB7fTsKKwlp bnQgcmV0OworCisJLyoKKwkgKiBIYXZpbmcgdG8gdXNlIGEgbW9ja19ibyBpcyB1bmZvcnR1bmF0 ZSBidXQgc3RlbXMgZnJvbSBzb21lCisJICogZHJpdmVycyBoYXZpbmcgcHJpdmF0ZSBtYW5hZ2Vy cyB0aGF0IGluc2lzdCB0byBrbm93IHdoYXQgdGhlCisJICogYWxsb2NhdGUgbWVtb3J5IGlzIGlu dGVuZGVkIGZvciwgdXNpbmcgaXQgdG8gc2VuZCBwcml2YXRlCisJICogZGF0YSB0byB0aGUgbWFu YWdlci4gQWxzbyByZWNlbnRseSB0aGUgYm8gaGFzIGJlZW4gdXNlZCB0byBzZW5kCisJICogYWxp Z25tZW50IGluZm8gdG8gdGhlIG1hbmFnZXIuIEFzc3VtZSB0aGF0IGFwYXJ0IGZyb20gdGhlIGxh dHRlciwKKwkgKiBub25lIG9mIHRoZSBtYW5hZ2VycyB3ZSB1c2Ugd2lsbCBldmVyIGFjY2VzcyB0 aGUgYnVmZmVyIG9iamVjdAorCSAqIG1lbWJlcnMsIGhvcGluZyB3ZSBjYW4gcGFzcyB0aGUgYWxp Z25tZW50IGluZm8gaW4gdGhlCisJICogc3RydWN0IHR0bV9wbGFjZSBpbiB0aGUgZnV0dXJlLgor CSAqLworCisJcGxhY2UuZnBmbiA9IG9mZnNldCA+PiBQQUdFX1NISUZUOworCXBsYWNlLmxwZm4g PSBwbGFjZS5mcGZuICsgKHNpemUgPj4gUEFHRV9TSElGVCk7CisJcmVzLm51bV9wYWdlcyA9IHNp emUgPj4gUEFHRV9TSElGVDsKKwlyZXQgPSBtYW4tPmZ1bmMtPmFsbG9jKG1hbiwgJm1vY2tfYm8s ICZwbGFjZSwgJnJlcyk7CisJaWYgKHJldCA9PSAtRU5PU1BDKQorCQlyZXQgPSAtRU5YSU87CisK KwlyZXR1cm4gcmV0ID8gRVJSX1BUUihyZXQpIDogcmVzLm1tX25vZGU7Cit9CisKKy8qKgorICog aW50ZWxfcmVnaW9uX3R0bV9ub2RlX2ZyZWUgLSBGcmVlIGEgbm9kZSBhbGxvY2F0ZWQgZnJvbSBh IHJlc291cmNlIG1hbmFnZXIKKyAqIEBtZW06IFRoZSByZWdpb24gdGhlIG5vZGUgd2FzIGFsbG9j YXRlZCBmcm9tLgorICogQG5vZGU6IFRoZSBvcGFxdWUgbm9kZSByZXByZXNlbnRpbmcgYW4gYWxs b2NhdGlvbi4KKyAqLwordm9pZCBpbnRlbF9yZWdpb25fdHRtX25vZGVfZnJlZShzdHJ1Y3QgaW50 ZWxfbWVtb3J5X3JlZ2lvbiAqbWVtLAorCQkJCXZvaWQgKm5vZGUpCit7CisJc3RydWN0IHR0bV9y ZXNvdXJjZV9tYW5hZ2VyICptYW4gPQorCQl0b190dG1fcHJpdmF0ZShtZW0tPnJlZ2lvbl9wcml2 YXRlKS0+bWFuOworCXN0cnVjdCB0dG1fcmVzb3VyY2UgcmVzID0ge307CisKKwlyZXMubW1fbm9k ZSA9IG5vZGU7CisJbWFuLT5mdW5jLT5mcmVlKG1hbiwgJnJlcyk7Cit9CisKK3N0YXRpYyBjb25z dCBzdHJ1Y3QgaW50ZWxfbWVtb3J5X3JlZ2lvbl9wcml2YXRlX29wcyBwcml2X29wcyA9IHsKKwku cmVzZXJ2ZSA9IGludGVsX3JlZ2lvbl90dG1fbm9kZV9yZXNlcnZlLAorCS5mcmVlID0gaW50ZWxf cmVnaW9uX3R0bV9ub2RlX2ZyZWUsCit9OworCitzdGF0aWMgaW50IF9faW50ZWxfcmVnaW9uX3R0 bV9pbml0KHN0cnVjdCBpbnRlbF9tZW1vcnlfcmVnaW9uICptZW0sCisJCQkJICAgc3RydWN0IGlu dGVsX3JlZ2lvbl90dG1fcHJpdmF0ZSAqcHJpdiwKKwkJCQkgICBzdHJ1Y3QgdHRtX2RldmljZSAq YmRldikKK3sKKwlpbnQgbWVtX3R5cGUgPSBpbnRlbF9yZWdpb25fdG9fdHRtX3R5cGUobWVtKTsK KwlpbnQgcmV0OworCisJcmV0ID0gdHRtX3JhbmdlX21hbl9pbml0KGJkZXYsIG1lbV90eXBlLCBm YWxzZSwKKwkJCQkgcmVzb3VyY2Vfc2l6ZSgmbWVtLT5yZWdpb24pID4+IFBBR0VfU0hJRlQpOwor CWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlwcml2LT5tYW4gPSB0dG1fbWFuYWdlcl90eXBl KGJkZXYsIG1lbV90eXBlKTsKKwltZW0tPmNodW5rX3NpemUgPSBQQUdFX1NJWkU7CisJbWVtLT5t YXhfb3JkZXIgPQorCQlnZXRfb3JkZXIocm91bmRkb3duX3Bvd19vZl90d28ocmVzb3VyY2Vfc2l6 ZSgmbWVtLT5yZWdpb24pKSk7CisJbWVtLT5pc19yYW5nZV9tYW5hZ2VyID0gdHJ1ZTsKKwltZW0t PnByaXZfb3BzID0gJnByaXZfb3BzOworCW1lbS0+cmVnaW9uX3ByaXZhdGUgPSBwcml2OworCisJ cmV0dXJuIDA7Cit9CisKKy8qKgorICogaW50ZWxfcmVnaW9uX3R0bV9pbml0IC0gSW5pdGlhbGl6 ZSBhIG1lbW9yeSByZWdpb24gZm9yIFRUTS4KKyAqIEBtZW06IFRoZSByZWdpb24gdG8gaW5pdGlh bGl6ZS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIGEgc3VpdGFibGUgVFRNIHJl c291cmNlIG1hbmFnZXIgZm9yIHRoZQorICogcmVnaW9uLCBhdHRhY2hlcyBpdCB0byB0aGUgVFRN IGRldmljZS4KKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgbmVnYXRpdmUgZXJyb3IgY29k ZSBvbiBmYWlsdXJlLgorICovCitpbnQgaW50ZWxfcmVnaW9uX3R0bV9pbml0KHN0cnVjdCBpbnRl bF9tZW1vcnlfcmVnaW9uICptZW0pCit7CisJc3RydWN0IGludGVsX3JlZ2lvbl90dG1fcHJpdmF0 ZSAqcHJpdjsKKwlpbnQgcmV0OworCisJcHJpdiA9IGt6YWxsb2Moc2l6ZW9mKCpwcml2KSwgR0ZQ X0tFUk5FTCk7CisJaWYgKCFwcml2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldCA9IF9faW50 ZWxfcmVnaW9uX3R0bV9pbml0KG1lbSwgcHJpdiwgJm1lbS0+aTkxNS0+YmRldik7CisJaWYgKHJl dCkKKwkJa2ZyZWUocHJpdik7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBpbnRlbF9yZWdp b25fdHRtX2ZpbmkgLSBGaW5hbGl6ZSBhIFRUTSByZWdpb24uCisgKiBAbWVtOiBUaGUgbWVtb3J5 IHJlZ2lvbgorICoKKyAqIFRoaXMgZnVuY3Rpb25zIHRha2VzIGRvd24gdGhlIFRUTSByZXNvdXJj ZSBtYW5hZ2VyIGFzc29jaWF0ZWQgd2l0aCB0aGUKKyAqIG1lbW9yeSByZWdpb24sIGFuZCBpZiBp dCB3YXMgcmVnaXN0ZXJlZCB3aXRoIHRoZSBUVE0gZGV2aWNlLAorICogcmVtb3ZlcyB0aGF0IHJl Z2lzdHJhdGlvbi4KKyAqLwordm9pZCBpbnRlbF9yZWdpb25fdHRtX2Zpbmkoc3RydWN0IGludGVs X21lbW9yeV9yZWdpb24gKm1lbSkKK3sKKwlzdHJ1Y3QgaW50ZWxfcmVnaW9uX3R0bV9wcml2YXRl ICpwcml2ID0KKwkJdG9fdHRtX3ByaXZhdGUobWVtLT5yZWdpb25fcHJpdmF0ZSk7CisJaW50IHJl dDsKKworCXJldCA9IHR0bV9yYW5nZV9tYW5fZmluaSgmbWVtLT5pOTE1LT5iZGV2LCBpbnRlbF9y ZWdpb25fdG9fdHRtX3R5cGUobWVtKSk7CisJR0VNX1dBUk5fT04ocmV0KTsKKwltZW0tPnJlZ2lv bl9wcml2YXRlID0gTlVMTDsKKwlrZnJlZShwcml2KTsKK30KKworLyoqCisgKiBpbnRlbF9yZWdp b25fdHRtX25vZGVfdG9fc3QgLSBDb252ZXJ0IGFuIG9wYXF1ZSBUVE0gcmVzb3VyY2UgbWFuYWdl ciBub2RlCisgKiB0byBhbiBzZ190YWJsZS4KKyAqIEBtZW06IFRoZSBtZW1vcnkgcmVnaW9uLgor ICogQG5vZGU6IFRoZSByZXNvdXJjZSBtYW5hZ2VyIG5vZGUgb2J0YWluZWQgZnJvbSB0aGUgVFRN IHJlc291cmNlIG1hbmFnZXIuCisgKgorICogVGhlIGdlbSBiYWNrZW5kcyB0eXBpY2FsbHkgdXNl IHNnLXRhYmxlcyBmb3Igb3BlcmF0aW9ucyBvbiB0aGUgdW5kZXJseWluZworICogaW9fbWVtb3J5 LiBTbyBwcm92aWRlIGEgd2F5IGZvciB0aGUgYmFja2VuZHMgdG8gdHJhbnNsYXRlIHRoZQorICog bm9kZXMgdGhleSBhcmUgaGFuZGVkIGZyb20gVFRNIHRvIHNnLXRhYmxlcy4KKyAqCisgKiBSZXR1 cm46IEEgbWFsbG9jZWQgc2dfdGFibGUgb24gc3VjY2VzcywgYW4gZXJyb3IgcG9pbnRlciBvbiBm YWlsdXJlLgorICovCitzdHJ1Y3Qgc2dfdGFibGUgKmludGVsX3JlZ2lvbl90dG1fbm9kZV90b19z dChzdHJ1Y3QgaW50ZWxfbWVtb3J5X3JlZ2lvbiAqbWVtLAorCQkJCQkgICAgIHZvaWQgKm5vZGUp Cit7CisJcmV0dXJuIGk5MTVfc2dfZnJvbV9tbV9ub2RlKG5vZGUsIG1lbS0+cmVnaW9uLnN0YXJ0 KTsKK30KKworLyoqCisgKiBpbnRlbF9yZWdpb25fdHRtX25vZGVfYWxsb2MgLSBBbGxvY2F0ZSBt ZW1vcnkgcmVzb3VyY2VzIGZyb20gYSByZWdpb24KKyAqIEBtZW06IFRoZSBtZW1vcnkgcmVnaW9u LAorICogQHNpemU6IFRoZSByZXF1ZXN0ZWQgc2l6ZSBpbiBieXRlcworICogQGZsYWdzOiBBbGxv Y2F0aW9uIGZsYWdzCisgKgorICogVGhpcyBmdW5jdGlvbmFsaXR5IGlzIHByb3ZpZGVkIG9ubHkg Zm9yIGNhbGxlcnMgdGhhdCBuZWVkIHRvIGFsbG9jYXRlCisgKiBtZW1vcnkgZnJvbSBzdGFuZGFs b25lIFRUTSByYW5nZSBtYW5hZ2Vycywgd2l0aG91dCB0aGUgVFRNIGV2aWN0aW9uCisgKiBmdW5j dGlvbmFsaXR5LiBEb24ndCB1c2UgaWYgeW91IGFyZSBub3QgY29tcGxldGVseSBzdXJlIHRoYXQn cyB0aGUKKyAqIGNhc2UuIFRoZSByZXR1cm5lZCBvcGFxdWUgbm9kZSBjYW4gYmUgY29udmVydGVk IHRvIGFuIHNnX3RhYmxlIHVzaW5nCisgKiBpbnRlbF9yZWdpb25fdHRtX25vZGVfdG9fc3QoKSwg YW5kIGNhbiBiZSBmcmVlZCB1c2luZworICogaW50ZWxfcmVnaW9uX3R0bV9ub2RlX2ZyZWUoKS4K KyAqCisgKiBSZXR1cm46IEEgdmFsaWQgcG9pbnRlciBvbiBzdWNjZXNzLCBhbiBlcnJvciBwb2lu dGVyIG9uIGZhaWx1cmUuCisgKi8KK3ZvaWQgKmludGVsX3JlZ2lvbl90dG1fbm9kZV9hbGxvYyhz dHJ1Y3QgaW50ZWxfbWVtb3J5X3JlZ2lvbiAqbWVtLAorCQkJCSAgcmVzb3VyY2Vfc2l6ZV90IHNp emUsCisJCQkJICB1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IHR0bV9yZXNvdXJjZV9t YW5hZ2VyICptYW4gPQorCQl0b190dG1fcHJpdmF0ZShtZW0tPnJlZ2lvbl9wcml2YXRlKS0+bWFu OworCXN0cnVjdCB0dG1fcGxhY2UgcGxhY2UgPSB7fTsKKwlzdHJ1Y3QgdHRtX3Jlc291cmNlIHJl cyA9IHt9OworCXN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCBtb2NrX2JvID0ge307CisJaW50IHJl dDsKKworCS8qCisJICogV2UgaWdub3JlIHRoZSBmbGFncyBmb3Igbm93IHNpbmNlIHdlJ3JlIHVz aW5nIHRoZSByYW5nZQorCSAqIG1hbmFnZXIgYW5kIGNvbnRpZ291cyBhbmQgbWluIHBhZ2Ugc2l6 ZSB3b3VsZCBiZSBmdWxmaWxsZWQKKwkgKiBieSBkZWZhdWx0IGlmIHNpemUgaXMgbWluIHBhZ2Ug c2l6ZSBhbGlnbmVkLgorCSAqLworCXJlcy5udW1fcGFnZXMgPSBzaXplID4+IFBBR0VfU0hJRlQ7 CisKKwlpZiAobWVtLT5pc19yYW5nZV9tYW5hZ2VyKSB7CisJCWlmIChzaXplID49IFNaXzFHKQor CQkJbW9ja19iby5wYWdlX2FsaWdubWVudCA9IFNaXzFHID4+IFBBR0VfU0hJRlQ7CisJCWVsc2Ug aWYgKHNpemUgPj0gU1pfMk0pCisJCQltb2NrX2JvLnBhZ2VfYWxpZ25tZW50ID0gU1pfMk0gPj4g UEFHRV9TSElGVDsKKwkJZWxzZSBpZiAoc2l6ZSA+PSBTWl82NEspCisJCQltb2NrX2JvLnBhZ2Vf YWxpZ25tZW50ID0gU1pfNjRLID4+IFBBR0VfU0hJRlQ7CisJfQorCisJcmV0ID0gbWFuLT5mdW5j LT5hbGxvYyhtYW4sICZtb2NrX2JvLCAmcGxhY2UsICZyZXMpOworCWlmIChyZXQgPT0gLUVOT1NQ QykKKwkJcmV0ID0gLUVOWElPOworCXJldHVybiByZXQgPyBFUlJfUFRSKHJldCkgOiByZXMubW1f bm9kZTsKK30KKworI2lmZGVmIENPTkZJR19EUk1fSTkxNV9TRUxGVEVTVAorLyoqCisgKiBpbnRl bF9yZWdpb25fdHRtX2luaXRfbW9jayAtIEluaXRpYWxpemUgYSBtb2NrIG1lbW9yeSByZWdpb24g Zm9yIFRUTS4KKyAqIEBtZW06IFRoZSByZWdpb24gdG8gaW5pdGlhbGl6ZS4KKyAqCisgKiBUaGlz IGZ1bmN0aW9uIGluaXRpYWxpemVzIGEgc3VpdGFibGUgVFRNIHJlc291cmNlIG1hbmFnZXIgZm9y IHRoZQorICogcmVnaW9uLCBhdHRhY2hlcyBpdCB0byB0aGUgVFRNIGRldmljZS4KKyAqIFRoaXMg Y29kZSBpcyBmb3IgbW9jayBzZWxmdGVzdHMgb25seS4KKyAqCisgKiBSZXR1cm46IDAgb24gc3Vj Y2VzcywgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICovCitpbnQgaW50ZWxfcmVn aW9uX3R0bV9pbml0X21vY2soc3RydWN0IGludGVsX21lbW9yeV9yZWdpb24gKm1lbSkKK3sKKwlz dHJ1Y3QgaW50ZWxfcmVnaW9uX3R0bV9wcml2YXRlICpwcml2OworCWludCByZXQ7CisKKwlwcml2 ID0ga3phbGxvYyhzaXplb2YoKnByaXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXByaXYpCisJCXJl dHVybiAtRU5PTUVNOworCisJZHJtX3ZtYV9vZmZzZXRfbWFuYWdlcl9pbml0KCZwcml2LT5tb2Nr X3ZtYSwKKwkJCQkgICAgRFJNX0ZJTEVfUEFHRV9PRkZTRVRfU1RBUlQsCisJCQkJICAgIERSTV9G SUxFX1BBR0VfT0ZGU0VUX1NJWkUpOworCXJldCA9IHR0bV9kZXZpY2VfaW5pdCgmcHJpdi0+bW9j a19iZGV2LCAmaTkxNV90dG1fYm9fZHJpdmVyLAorCQkJICAgICAgTlVMTCwgTlVMTCwgJnByaXYt Pm1vY2tfdm1hLCBmYWxzZSwgZmFsc2UpOworCWlmIChyZXQpCisJCWdvdG8gb3V0X2RldmljZTsK KworCXJldCA9IF9faW50ZWxfcmVnaW9uX3R0bV9pbml0KG1lbSwgcHJpdiwgJnByaXYtPm1vY2tf YmRldik7CisJaWYgKHJldCkKKwkJZ290byBvdXRfcmVnaW9uOworCisJcmV0dXJuIDA7CisKK291 dF9yZWdpb246CisJdHRtX2RldmljZV9maW5pKCZwcml2LT5tb2NrX2JkZXYpOworCWRybV92bWFf b2Zmc2V0X21hbmFnZXJfZGVzdHJveSgmcHJpdi0+bW9ja192bWEpOworb3V0X2RldmljZToKKwlr ZnJlZShwcml2KTsKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGludGVsX3JlZ2lvbl90dG1f ZmluaV9tb2NrIC0gRmluYWxpemUgYSBtb2NrIFRUTSByZWdpb24uCisgKiBAbWVtOiBUaGUgbWVt b3J5IHJlZ2lvbgorICoKKyAqIFRoaXMgZnVuY3Rpb25zIHRha2VzIGRvd24gdGhlIFRUTSByZXNv dXJjZSBtYW5hZ2VyIGFzc29jaWF0ZWQgd2l0aCB0aGUKKyAqIG1lbW9yeSByZWdpb24sIGFuZCBp ZiBpdCB3YXMgcmVnaXN0ZXJlZCB3aXRoIHRoZSBUVE0gZGV2aWNlLAorICogcmVtb3ZlcyB0aGF0 IHJlZ2lzdHJhdGlvbi4gRmluYWxseSBkZXN0cm95cyB0aGUgbW9jayBUVE0gZGV2aWNlIGFuZAor ICogdm1hIG1hbmFnZXIuIFRoaXMgY29kZSBpcyBmb3IgbW9jayBzZWxmdGVzdHMgb25seS4KKyAq Lwordm9pZCBpbnRlbF9yZWdpb25fdHRtX2ZpbmlfbW9jayhzdHJ1Y3QgaW50ZWxfbWVtb3J5X3Jl Z2lvbiAqbWVtKQoreworCXN0cnVjdCBpbnRlbF9yZWdpb25fdHRtX3ByaXZhdGUgKnByaXYgPQor CQl0b190dG1fcHJpdmF0ZShtZW0tPnJlZ2lvbl9wcml2YXRlKTsKKwlpbnQgcmV0OworCisJcmV0 ID0gdHRtX3JhbmdlX21hbl9maW5pKCZwcml2LT5tb2NrX2JkZXYsIGludGVsX3JlZ2lvbl90b190 dG1fdHlwZShtZW0pKTsKKwlHRU1fV0FSTl9PTihyZXQpOworCXR0bV9kZXZpY2VfZmluaSgmcHJp di0+bW9ja19iZGV2KTsKKwlkcm1fdm1hX29mZnNldF9tYW5hZ2VyX2Rlc3Ryb3koJnByaXYtPm1v Y2tfdm1hKTsKKwltZW0tPnJlZ2lvbl9wcml2YXRlID0gTlVMTDsKKwlrZnJlZShwcml2KTsKK30K KyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfcmVnaW9uX3R0 bS5oIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfcmVnaW9uX3R0bS5oCm5ldyBmaWxlIG1v ZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMC4uMjNjNmMyZDRiMWNkCi0tLSAvZGV2L251bGwK KysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfcmVnaW9uX3R0bS5oCkBAIC0wLDAgKzEs MzggQEAKKy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVQgKi8KKy8qCisgKiBDb3B5cmln aHQgwqkgMjAyMSBJbnRlbCBDb3Jwb3JhdGlvbgorICovCisjaWZuZGVmIF9JTlRFTF9SRUdJT05f VFRNX0hfCisjZGVmaW5lIF9JTlRFTF9SRUdJT05fVFRNX0hfCisKKyNpbmNsdWRlIDxsaW51eC90 eXBlcy5oPgorCisjaW5jbHVkZSAiaTkxNV9zZWxmdGVzdC5oIgorCitzdHJ1Y3QgZHJtX2k5MTVf cHJpdmF0ZTsKK3N0cnVjdCBpbnRlbF9tZW1vcnlfcmVnaW9uOworCitpbnQgaW50ZWxfcmVnaW9u X3R0bV9kZXZpY2VfaW5pdChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpOworCit2 b2lkIGludGVsX3JlZ2lvbl90dG1fZGV2aWNlX2Zpbmkoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUg KmRldl9wcml2KTsKKworaW50IGludGVsX3JlZ2lvbl90dG1faW5pdChzdHJ1Y3QgaW50ZWxfbWVt b3J5X3JlZ2lvbiAqbWVtKTsKKwordm9pZCBpbnRlbF9yZWdpb25fdHRtX2Zpbmkoc3RydWN0IGlu dGVsX21lbW9yeV9yZWdpb24gKm1lbSk7CisKK3N0cnVjdCBzZ190YWJsZSAqaW50ZWxfcmVnaW9u X3R0bV9ub2RlX3RvX3N0KHN0cnVjdCBpbnRlbF9tZW1vcnlfcmVnaW9uICptZW0sCisJCQkJCSAg ICAgdm9pZCAqbm9kZSk7CisKK3ZvaWQgKmludGVsX3JlZ2lvbl90dG1fbm9kZV9hbGxvYyhzdHJ1 Y3QgaW50ZWxfbWVtb3J5X3JlZ2lvbiAqbWVtLAorCQkJCSAgcmVzb3VyY2Vfc2l6ZV90IHNpemUs CisJCQkJICB1bnNpZ25lZCBpbnQgZmxhZ3MpOworCit2b2lkIGludGVsX3JlZ2lvbl90dG1fbm9k ZV9mcmVlKHN0cnVjdCBpbnRlbF9tZW1vcnlfcmVnaW9uICptZW0sCisJCQkJdm9pZCAqbm9kZSk7 CisKKyNpZmRlZiBDT05GSUdfRFJNX0k5MTVfU0VMRlRFU1QKK2ludCBpbnRlbF9yZWdpb25fdHRt X2luaXRfbW9jayhzdHJ1Y3QgaW50ZWxfbWVtb3J5X3JlZ2lvbiAqbWVtKTsKKwordm9pZCBpbnRl bF9yZWdpb25fdHRtX2ZpbmlfbW9jayhzdHJ1Y3QgaW50ZWxfbWVtb3J5X3JlZ2lvbiAqbWVtKTsK KyNlbmRpZgorI2VuZGlmIC8qIF9JTlRFTF9SRUdJT05fVFRNX0hfICovCmRpZmYgLS1naXQgYS9k cml2ZXJzL2dwdS9kcm0vaTkxNS9zZWxmdGVzdHMvaTkxNV9idWRkeS5jIGIvZHJpdmVycy9ncHUv ZHJtL2k5MTUvc2VsZnRlc3RzL2k5MTVfYnVkZHkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQK aW5kZXggZjBmNWM0ZGY4ZGJjLi4wMDAwMDAwMDAwMDAKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5 MTUvc2VsZnRlc3RzL2k5MTVfYnVkZHkuYworKysgL2Rldi9udWxsCkBAIC0xLDc4OSArMCwwIEBA Ci0vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUCi0vKgotICogQ29weXJpZ2h0IMKpIDIw MTkgSW50ZWwgQ29ycG9yYXRpb24KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvcHJpbWVfbnVtYmVy cy5oPgotCi0jaW5jbHVkZSAiLi4vaTkxNV9zZWxmdGVzdC5oIgotI2luY2x1ZGUgImk5MTVfcmFu ZG9tLmgiCi0KLXN0YXRpYyB2b2lkIF9faWd0X2R1bXBfYmxvY2soc3RydWN0IGk5MTVfYnVkZHlf bW0gKm1tLAotCQkJICAgICBzdHJ1Y3QgaTkxNV9idWRkeV9ibG9jayAqYmxvY2ssCi0JCQkgICAg IGJvb2wgYnVkZHkpCi17Ci0JcHJfZXJyKCJibG9jayBpbmZvOiBoZWFkZXI9JWxseCwgc3RhdGU9 JXUsIG9yZGVyPSVkLCBvZmZzZXQ9JWxseCBzaXplPSVsbHggcm9vdD0lcyBidWRkeT0lc1xuIiwK LQkgICAgICAgYmxvY2stPmhlYWRlciwKLQkgICAgICAgaTkxNV9idWRkeV9ibG9ja19zdGF0ZShi bG9jayksCi0JICAgICAgIGk5MTVfYnVkZHlfYmxvY2tfb3JkZXIoYmxvY2spLAotCSAgICAgICBp OTE1X2J1ZGR5X2Jsb2NrX29mZnNldChibG9jayksCi0JICAgICAgIGk5MTVfYnVkZHlfYmxvY2tf c2l6ZShtbSwgYmxvY2spLAotCSAgICAgICB5ZXNubyghYmxvY2stPnBhcmVudCksCi0JICAgICAg IHllc25vKGJ1ZGR5KSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGlndF9kdW1wX2Jsb2NrKHN0cnVjdCBp OTE1X2J1ZGR5X21tICptbSwKLQkJCSAgIHN0cnVjdCBpOTE1X2J1ZGR5X2Jsb2NrICpibG9jaykK LXsKLQlzdHJ1Y3QgaTkxNV9idWRkeV9ibG9jayAqYnVkZHk7Ci0KLQlfX2lndF9kdW1wX2Jsb2Nr KG1tLCBibG9jaywgZmFsc2UpOwotCi0JYnVkZHkgPSBnZXRfYnVkZHkoYmxvY2spOwotCWlmIChi dWRkeSkKLQkJX19pZ3RfZHVtcF9ibG9jayhtbSwgYnVkZHksIHRydWUpOwotfQotCi1zdGF0aWMg aW50IGlndF9jaGVja19ibG9jayhzdHJ1Y3QgaTkxNV9idWRkeV9tbSAqbW0sCi0JCQkgICBzdHJ1 Y3QgaTkxNV9idWRkeV9ibG9jayAqYmxvY2spCi17Ci0Jc3RydWN0IGk5MTVfYnVkZHlfYmxvY2sg KmJ1ZGR5OwotCXVuc2lnbmVkIGludCBibG9ja19zdGF0ZTsKLQl1NjQgYmxvY2tfc2l6ZTsKLQl1 NjQgb2Zmc2V0OwotCWludCBlcnIgPSAwOwotCi0JYmxvY2tfc3RhdGUgPSBpOTE1X2J1ZGR5X2Js b2NrX3N0YXRlKGJsb2NrKTsKLQotCWlmIChibG9ja19zdGF0ZSAhPSBJOTE1X0JVRERZX0FMTE9D QVRFRCAmJgotCSAgICBibG9ja19zdGF0ZSAhPSBJOTE1X0JVRERZX0ZSRUUgJiYKLQkgICAgYmxv Y2tfc3RhdGUgIT0gSTkxNV9CVUREWV9TUExJVCkgewotCQlwcl9lcnIoImJsb2NrIHN0YXRlIG1p c21hdGNoXG4iKTsKLQkJZXJyID0gLUVJTlZBTDsKLQl9Ci0KLQlibG9ja19zaXplID0gaTkxNV9i dWRkeV9ibG9ja19zaXplKG1tLCBibG9jayk7Ci0Jb2Zmc2V0ID0gaTkxNV9idWRkeV9ibG9ja19v ZmZzZXQoYmxvY2spOwotCi0JaWYgKGJsb2NrX3NpemUgPCBtbS0+Y2h1bmtfc2l6ZSkgewotCQlw cl9lcnIoImJsb2NrIHNpemUgc21hbGxlciB0aGFuIG1pbiBzaXplXG4iKTsKLQkJZXJyID0gLUVJ TlZBTDsKLQl9Ci0KLQlpZiAoIWlzX3Bvd2VyX29mXzIoYmxvY2tfc2l6ZSkpIHsKLQkJcHJfZXJy KCJibG9jayBzaXplIG5vdCBwb3dlciBvZiB0d29cbiIpOwotCQllcnIgPSAtRUlOVkFMOwotCX0K LQotCWlmICghSVNfQUxJR05FRChibG9ja19zaXplLCBtbS0+Y2h1bmtfc2l6ZSkpIHsKLQkJcHJf ZXJyKCJibG9jayBzaXplIG5vdCBhbGlnbmVkIHRvIG1pbiBzaXplXG4iKTsKLQkJZXJyID0gLUVJ TlZBTDsKLQl9Ci0KLQlpZiAoIUlTX0FMSUdORUQob2Zmc2V0LCBtbS0+Y2h1bmtfc2l6ZSkpIHsK LQkJcHJfZXJyKCJibG9jayBvZmZzZXQgbm90IGFsaWduZWQgdG8gbWluIHNpemVcbiIpOwotCQll cnIgPSAtRUlOVkFMOwotCX0KLQotCWlmICghSVNfQUxJR05FRChvZmZzZXQsIGJsb2NrX3NpemUp KSB7Ci0JCXByX2VycigiYmxvY2sgb2Zmc2V0IG5vdCBhbGlnbmVkIHRvIGJsb2NrIHNpemVcbiIp OwotCQllcnIgPSAtRUlOVkFMOwotCX0KLQotCWJ1ZGR5ID0gZ2V0X2J1ZGR5KGJsb2NrKTsKLQot CWlmICghYnVkZHkgJiYgYmxvY2stPnBhcmVudCkgewotCQlwcl9lcnIoImJ1ZGR5IGhhcyBnb25l IGZpc2hpbmdcbiIpOwotCQllcnIgPSAtRUlOVkFMOwotCX0KLQotCWlmIChidWRkeSkgewotCQlp ZiAoaTkxNV9idWRkeV9ibG9ja19vZmZzZXQoYnVkZHkpICE9IChvZmZzZXQgXiBibG9ja19zaXpl KSkgewotCQkJcHJfZXJyKCJidWRkeSBoYXMgd3Jvbmcgb2Zmc2V0XG4iKTsKLQkJCWVyciA9IC1F SU5WQUw7Ci0JCX0KLQotCQlpZiAoaTkxNV9idWRkeV9ibG9ja19zaXplKG1tLCBidWRkeSkgIT0g YmxvY2tfc2l6ZSkgewotCQkJcHJfZXJyKCJidWRkeSBzaXplIG1pc21hdGNoXG4iKTsKLQkJCWVy ciA9IC1FSU5WQUw7Ci0JCX0KLQotCQlpZiAoaTkxNV9idWRkeV9ibG9ja19zdGF0ZShidWRkeSkg PT0gYmxvY2tfc3RhdGUgJiYKLQkJICAgIGJsb2NrX3N0YXRlID09IEk5MTVfQlVERFlfRlJFRSkg ewotCQkJcHJfZXJyKCJibG9jayBhbmQgaXRzIGJ1ZGR5IGFyZSBmcmVlXG4iKTsKLQkJCWVyciA9 IC1FSU5WQUw7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgaW50IGlndF9j aGVja19ibG9ja3Moc3RydWN0IGk5MTVfYnVkZHlfbW0gKm1tLAotCQkJICAgIHN0cnVjdCBsaXN0 X2hlYWQgKmJsb2NrcywKLQkJCSAgICB1NjQgZXhwZWN0ZWRfc2l6ZSwKLQkJCSAgICBib29sIGlz X2NvbnRpZ3VvdXMpCi17Ci0Jc3RydWN0IGk5MTVfYnVkZHlfYmxvY2sgKmJsb2NrOwotCXN0cnVj dCBpOTE1X2J1ZGR5X2Jsb2NrICpwcmV2OwotCXU2NCB0b3RhbDsKLQlpbnQgZXJyID0gMDsKLQot CWJsb2NrID0gTlVMTDsKLQlwcmV2ID0gTlVMTDsKLQl0b3RhbCA9IDA7Ci0KLQlsaXN0X2Zvcl9l YWNoX2VudHJ5KGJsb2NrLCBibG9ja3MsIGxpbmspIHsKLQkJZXJyID0gaWd0X2NoZWNrX2Jsb2Nr KG1tLCBibG9jayk7Ci0KLQkJaWYgKCFpOTE1X2J1ZGR5X2Jsb2NrX2lzX2FsbG9jYXRlZChibG9j aykpIHsKLQkJCXByX2VycigiYmxvY2sgbm90IGFsbG9jYXRlZFxuIiksCi0JCQllcnIgPSAtRUlO VkFMOwotCQl9Ci0KLQkJaWYgKGlzX2NvbnRpZ3VvdXMgJiYgcHJldikgewotCQkJdTY0IHByZXZf YmxvY2tfc2l6ZTsKLQkJCXU2NCBwcmV2X29mZnNldDsKLQkJCXU2NCBvZmZzZXQ7Ci0KLQkJCXBy ZXZfb2Zmc2V0ID0gaTkxNV9idWRkeV9ibG9ja19vZmZzZXQocHJldik7Ci0JCQlwcmV2X2Jsb2Nr X3NpemUgPSBpOTE1X2J1ZGR5X2Jsb2NrX3NpemUobW0sIHByZXYpOwotCQkJb2Zmc2V0ID0gaTkx NV9idWRkeV9ibG9ja19vZmZzZXQoYmxvY2spOwotCi0JCQlpZiAob2Zmc2V0ICE9IChwcmV2X29m ZnNldCArIHByZXZfYmxvY2tfc2l6ZSkpIHsKLQkJCQlwcl9lcnIoImJsb2NrIG9mZnNldCBtaXNt YXRjaFxuIik7Ci0JCQkJZXJyID0gLUVJTlZBTDsKLQkJCX0KLQkJfQotCi0JCWlmIChlcnIpCi0J CQlicmVhazsKLQotCQl0b3RhbCArPSBpOTE1X2J1ZGR5X2Jsb2NrX3NpemUobW0sIGJsb2NrKTsK LQkJcHJldiA9IGJsb2NrOwotCX0KLQotCWlmICghZXJyKSB7Ci0JCWlmICh0b3RhbCAhPSBleHBl Y3RlZF9zaXplKSB7Ci0JCQlwcl9lcnIoInNpemUgbWlzbWF0Y2gsIGV4cGVjdGVkPSVsbHgsIGZv dW5kPSVsbHhcbiIsCi0JCQkgICAgICAgZXhwZWN0ZWRfc2l6ZSwgdG90YWwpOwotCQkJZXJyID0g LUVJTlZBTDsKLQkJfQotCQlyZXR1cm4gZXJyOwotCX0KLQotCWlmIChwcmV2KSB7Ci0JCXByX2Vy cigicHJldiBibG9jaywgZHVtcDpcbiIpOwotCQlpZ3RfZHVtcF9ibG9jayhtbSwgcHJldik7Ci0J fQotCi0JaWYgKGJsb2NrKSB7Ci0JCXByX2VycigiYmFkIGJsb2NrLCBkdW1wOlxuIik7Ci0JCWln dF9kdW1wX2Jsb2NrKG1tLCBibG9jayk7Ci0JfQotCi0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGlj IGludCBpZ3RfY2hlY2tfbW0oc3RydWN0IGk5MTVfYnVkZHlfbW0gKm1tKQotewotCXN0cnVjdCBp OTE1X2J1ZGR5X2Jsb2NrICpyb290OwotCXN0cnVjdCBpOTE1X2J1ZGR5X2Jsb2NrICpwcmV2Owot CXVuc2lnbmVkIGludCBpOwotCXU2NCB0b3RhbDsKLQlpbnQgZXJyID0gMDsKLQotCWlmICghbW0t Pm5fcm9vdHMpIHsKLQkJcHJfZXJyKCJuX3Jvb3RzIGlzIHplcm9cbiIpOwotCQlyZXR1cm4gLUVJ TlZBTDsKLQl9Ci0KLQlpZiAobW0tPm5fcm9vdHMgIT0gaHdlaWdodDY0KG1tLT5zaXplKSkgewot CQlwcl9lcnIoIm5fcm9vdHMgbWlzbWF0Y2gsIG5fcm9vdHM9JXUsIGV4cGVjdGVkPSVsdVxuIiwK LQkJICAgICAgIG1tLT5uX3Jvb3RzLCBod2VpZ2h0NjQobW0tPnNpemUpKTsKLQkJcmV0dXJuIC1F SU5WQUw7Ci0JfQotCi0Jcm9vdCA9IE5VTEw7Ci0JcHJldiA9IE5VTEw7Ci0JdG90YWwgPSAwOwot Ci0JZm9yIChpID0gMDsgaSA8IG1tLT5uX3Jvb3RzOyArK2kpIHsKLQkJc3RydWN0IGk5MTVfYnVk ZHlfYmxvY2sgKmJsb2NrOwotCQl1bnNpZ25lZCBpbnQgb3JkZXI7Ci0KLQkJcm9vdCA9IG1tLT5y b290c1tpXTsKLQkJaWYgKCFyb290KSB7Ci0JCQlwcl9lcnIoInJvb3QoJXUpIGlzIE5VTExcbiIs IGkpOwotCQkJZXJyID0gLUVJTlZBTDsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJZXJyID0gaWd0X2No ZWNrX2Jsb2NrKG1tLCByb290KTsKLQotCQlpZiAoIWk5MTVfYnVkZHlfYmxvY2tfaXNfZnJlZShy b290KSkgewotCQkJcHJfZXJyKCJyb290IG5vdCBmcmVlXG4iKTsKLQkJCWVyciA9IC1FSU5WQUw7 Ci0JCX0KLQotCQlvcmRlciA9IGk5MTVfYnVkZHlfYmxvY2tfb3JkZXIocm9vdCk7Ci0KLQkJaWYg KCFpKSB7Ci0JCQlpZiAob3JkZXIgIT0gbW0tPm1heF9vcmRlcikgewotCQkJCXByX2VycigibWF4 IG9yZGVyIHJvb3QgbWlzc2luZ1xuIik7Ci0JCQkJZXJyID0gLUVJTlZBTDsKLQkJCX0KLQkJfQot Ci0JCWlmIChwcmV2KSB7Ci0JCQl1NjQgcHJldl9ibG9ja19zaXplOwotCQkJdTY0IHByZXZfb2Zm c2V0OwotCQkJdTY0IG9mZnNldDsKLQotCQkJcHJldl9vZmZzZXQgPSBpOTE1X2J1ZGR5X2Jsb2Nr X29mZnNldChwcmV2KTsKLQkJCXByZXZfYmxvY2tfc2l6ZSA9IGk5MTVfYnVkZHlfYmxvY2tfc2l6 ZShtbSwgcHJldik7Ci0JCQlvZmZzZXQgPSBpOTE1X2J1ZGR5X2Jsb2NrX29mZnNldChyb290KTsK LQotCQkJaWYgKG9mZnNldCAhPSAocHJldl9vZmZzZXQgKyBwcmV2X2Jsb2NrX3NpemUpKSB7Ci0J CQkJcHJfZXJyKCJyb290IG9mZnNldCBtaXNtYXRjaFxuIik7Ci0JCQkJZXJyID0gLUVJTlZBTDsK LQkJCX0KLQkJfQotCi0JCWJsb2NrID0gbGlzdF9maXJzdF9lbnRyeV9vcl9udWxsKCZtbS0+ZnJl ZV9saXN0W29yZGVyXSwKLQkJCQkJCSBzdHJ1Y3QgaTkxNV9idWRkeV9ibG9jaywKLQkJCQkJCSBs aW5rKTsKLQkJaWYgKGJsb2NrICE9IHJvb3QpIHsKLQkJCXByX2Vycigicm9vdCBtaXNtYXRjaCBh dCBvcmRlcj0ldVxuIiwgb3JkZXIpOwotCQkJZXJyID0gLUVJTlZBTDsKLQkJfQotCi0JCWlmIChl cnIpCi0JCQlicmVhazsKLQotCQlwcmV2ID0gcm9vdDsKLQkJdG90YWwgKz0gaTkxNV9idWRkeV9i bG9ja19zaXplKG1tLCByb290KTsKLQl9Ci0KLQlpZiAoIWVycikgewotCQlpZiAodG90YWwgIT0g bW0tPnNpemUpIHsKLQkJCXByX2VycigiZXhwZWN0ZWQgbW0gc2l6ZT0lbGx4LCBmb3VuZD0lbGx4 XG4iLCBtbS0+c2l6ZSwKLQkJCSAgICAgICB0b3RhbCk7Ci0JCQllcnIgPSAtRUlOVkFMOwotCQl9 Ci0JCXJldHVybiBlcnI7Ci0JfQotCi0JaWYgKHByZXYpIHsKLQkJcHJfZXJyKCJwcmV2IHJvb3Qo JXUpLCBkdW1wOlxuIiwgaSAtIDEpOwotCQlpZ3RfZHVtcF9ibG9jayhtbSwgcHJldik7Ci0JfQot Ci0JaWYgKHJvb3QpIHsKLQkJcHJfZXJyKCJiYWQgcm9vdCgldSksIGR1bXA6XG4iLCBpKTsKLQkJ aWd0X2R1bXBfYmxvY2sobW0sIHJvb3QpOwotCX0KLQotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRp YyB2b2lkIGlndF9tbV9jb25maWcodTY0ICpzaXplLCB1NjQgKmNodW5rX3NpemUpCi17Ci0JSTkx NV9STkRfU1RBVEUocHJuZyk7Ci0JdTMyIHMsIG1zOwotCi0JLyogTm90aGluZyBmYW5jeSwganVz dCB0cnkgdG8gZ2V0IGFuIGludGVyZXN0aW5nIGJpdCBwYXR0ZXJuICovCi0KLQlwcmFuZG9tX3Nl ZWRfc3RhdGUoJnBybmcsIGk5MTVfc2VsZnRlc3QucmFuZG9tX3NlZWQpOwotCi0JLyogTGV0IHNp emUgYmUgYSByYW5kb20gbnVtYmVyIG9mIHBhZ2VzIHVwIHRvIDggR0IgKDJNIHBhZ2VzKSAqLwot CXMgPSAxICsgaTkxNV9wcmFuZG9tX3UzMl9tYXhfc3RhdGUoKEJJVCgzMyAtIDEyKSkgLSAxLCAm cHJuZyk7Ci0JLyogTGV0IHRoZSBjaHVuayBzaXplIGJlIGEgcmFuZG9tIHBvd2VyIG9mIDIgbGVz cyB0aGFuIHNpemUgKi8KLQltcyA9IEJJVChpOTE1X3ByYW5kb21fdTMyX21heF9zdGF0ZShpbG9n MihzKSwgJnBybmcpKTsKLQkvKiBSb3VuZCBzaXplIGRvd24gdG8gdGhlIGNodW5rIHNpemUgKi8K LQlzICY9IC1tczsKLQotCS8qIENvbnZlcnQgZnJvbSBwYWdlcyB0byBieXRlcyAqLwotCSpjaHVu a19zaXplID0gKHU2NCltcyA8PCAxMjsKLQkqc2l6ZSA9ICh1NjQpcyA8PCAxMjsKLX0KLQotc3Rh dGljIGludCBpZ3RfYnVkZHlfYWxsb2Nfc21va2Uodm9pZCAqYXJnKQotewotCXN0cnVjdCBpOTE1 X2J1ZGR5X21tIG1tOwotCUlHVF9USU1FT1VUKGVuZF90aW1lKTsKLQlJOTE1X1JORF9TVEFURShw cm5nKTsKLQl1NjQgY2h1bmtfc2l6ZTsKLQl1NjQgbW1fc2l6ZTsKLQlpbnQgKm9yZGVyOwotCWlu dCBlcnIsIGk7Ci0KLQlpZ3RfbW1fY29uZmlnKCZtbV9zaXplLCAmY2h1bmtfc2l6ZSk7Ci0KLQlw cl9pbmZvKCJidWRkeV9pbml0IHdpdGggc2l6ZT0lbGx4LCBjaHVua19zaXplPSVsbHhcbiIsIG1t X3NpemUsIGNodW5rX3NpemUpOwotCi0JZXJyID0gaTkxNV9idWRkeV9pbml0KCZtbSwgbW1fc2l6 ZSwgY2h1bmtfc2l6ZSk7Ci0JaWYgKGVycikgewotCQlwcl9lcnIoImJ1ZGR5X2luaXQgZmFpbGVk KCVkKVxuIiwgZXJyKTsKLQkJcmV0dXJuIGVycjsKLQl9Ci0KLQlvcmRlciA9IGk5MTVfcmFuZG9t X29yZGVyKG1tLm1heF9vcmRlciArIDEsICZwcm5nKTsKLQlpZiAoIW9yZGVyKQotCQlnb3RvIG91 dF9maW5pOwotCi0JZm9yIChpID0gMDsgaSA8PSBtbS5tYXhfb3JkZXI7ICsraSkgewotCQlzdHJ1 Y3QgaTkxNV9idWRkeV9ibG9jayAqYmxvY2s7Ci0JCWludCBtYXhfb3JkZXIgPSBvcmRlcltpXTsK LQkJYm9vbCB0aW1lb3V0ID0gZmFsc2U7Ci0JCUxJU1RfSEVBRChibG9ja3MpOwotCQlpbnQgb3Jk ZXI7Ci0JCXU2NCB0b3RhbDsKLQotCQllcnIgPSBpZ3RfY2hlY2tfbW0oJm1tKTsKLQkJaWYgKGVy cikgewotCQkJcHJfZXJyKCJwcmUtbW0gY2hlY2sgZmFpbGVkLCBhYm9ydFxuIik7Ci0JCQlicmVh azsKLQkJfQotCi0JCXByX2luZm8oImZpbGxpbmcgZnJvbSBtYXhfb3JkZXI9JXVcbiIsIG1heF9v cmRlcik7Ci0KLQkJb3JkZXIgPSBtYXhfb3JkZXI7Ci0JCXRvdGFsID0gMDsKLQotCQlkbyB7Ci1y ZXRyeToKLQkJCWJsb2NrID0gaTkxNV9idWRkeV9hbGxvYygmbW0sIG9yZGVyKTsKLQkJCWlmIChJ U19FUlIoYmxvY2spKSB7Ci0JCQkJZXJyID0gUFRSX0VSUihibG9jayk7Ci0JCQkJaWYgKGVyciA9 PSAtRU5PTUVNKSB7Ci0JCQkJCXByX2luZm8oImJ1ZGR5X2FsbG9jIGhpdCAtRU5PTUVNIHdpdGgg b3JkZXI9JWRcbiIsCi0JCQkJCQlvcmRlcik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKG9yZGVy LS0pIHsKLQkJCQkJCWVyciA9IDA7Ci0JCQkJCQlnb3RvIHJldHJ5OwotCQkJCQl9Ci0KLQkJCQkJ cHJfZXJyKCJidWRkeV9hbGxvYyB3aXRoIG9yZGVyPSVkIGZhaWxlZCglZClcbiIsCi0JCQkJCSAg ICAgICBvcmRlciwgZXJyKTsKLQkJCQl9Ci0KLQkJCQlicmVhazsKLQkJCX0KLQotCQkJbGlzdF9h ZGRfdGFpbCgmYmxvY2stPmxpbmssICZibG9ja3MpOwotCi0JCQlpZiAoaTkxNV9idWRkeV9ibG9j a19vcmRlcihibG9jaykgIT0gb3JkZXIpIHsKLQkJCQlwcl9lcnIoImJ1ZGR5X2FsbG9jIG9yZGVy IG1pc21hdGNoXG4iKTsKLQkJCQllcnIgPSAtRUlOVkFMOwotCQkJCWJyZWFrOwotCQkJfQotCi0J CQl0b3RhbCArPSBpOTE1X2J1ZGR5X2Jsb2NrX3NpemUoJm1tLCBibG9jayk7Ci0KLQkJCWlmIChf X2lndF90aW1lb3V0KGVuZF90aW1lLCBOVUxMKSkgewotCQkJCXRpbWVvdXQgPSB0cnVlOwotCQkJ CWJyZWFrOwotCQkJfQotCQl9IHdoaWxlICh0b3RhbCA8IG1tLnNpemUpOwotCi0JCWlmICghZXJy KQotCQkJZXJyID0gaWd0X2NoZWNrX2Jsb2NrcygmbW0sICZibG9ja3MsIHRvdGFsLCBmYWxzZSk7 Ci0KLQkJaTkxNV9idWRkeV9mcmVlX2xpc3QoJm1tLCAmYmxvY2tzKTsKLQotCQlpZiAoIWVycikg ewotCQkJZXJyID0gaWd0X2NoZWNrX21tKCZtbSk7Ci0JCQlpZiAoZXJyKQotCQkJCXByX2Vycigi cG9zdC1tbSBjaGVjayBmYWlsZWRcbiIpOwotCQl9Ci0KLQkJaWYgKGVyciB8fCB0aW1lb3V0KQot CQkJYnJlYWs7Ci0KLQkJY29uZF9yZXNjaGVkKCk7Ci0JfQotCi0JaWYgKGVyciA9PSAtRU5PTUVN KQotCQllcnIgPSAwOwotCi0Ja2ZyZWUob3JkZXIpOwotb3V0X2Zpbmk6Ci0JaTkxNV9idWRkeV9m aW5pKCZtbSk7Ci0KLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgaW50IGlndF9idWRkeV9hbGxv Y19wZXNzaW1pc3RpYyh2b2lkICphcmcpCi17Ci0JY29uc3QgdW5zaWduZWQgaW50IG1heF9vcmRl ciA9IDE2OwotCXN0cnVjdCBpOTE1X2J1ZGR5X2Jsb2NrICpibG9jaywgKmJuOwotCXN0cnVjdCBp OTE1X2J1ZGR5X21tIG1tOwotCXVuc2lnbmVkIGludCBvcmRlcjsKLQlMSVNUX0hFQUQoYmxvY2tz KTsKLQlpbnQgZXJyOwotCi0JLyoKLQkgKiBDcmVhdGUgYSBwb3Qtc2l6ZWQgbW0sIHRoZW4gYWxs b2NhdGUgb25lIG9mIGVhY2ggcG9zc2libGUKLQkgKiBvcmRlciB3aXRoaW4uIFRoaXMgc2hvdWxk IGxlYXZlIHRoZSBtbSB3aXRoIGV4YWN0bHkgb25lCi0JICogcGFnZSBsZWZ0LgotCSAqLwotCi0J ZXJyID0gaTkxNV9idWRkeV9pbml0KCZtbSwgUEFHRV9TSVpFIDw8IG1heF9vcmRlciwgUEFHRV9T SVpFKTsKLQlpZiAoZXJyKSB7Ci0JCXByX2VycigiYnVkZHlfaW5pdCBmYWlsZWQoJWQpXG4iLCBl cnIpOwotCQlyZXR1cm4gZXJyOwotCX0KLQlHRU1fQlVHX09OKG1tLm1heF9vcmRlciAhPSBtYXhf b3JkZXIpOwotCi0JZm9yIChvcmRlciA9IDA7IG9yZGVyIDwgbWF4X29yZGVyOyBvcmRlcisrKSB7 Ci0JCWJsb2NrID0gaTkxNV9idWRkeV9hbGxvYygmbW0sIG9yZGVyKTsKLQkJaWYgKElTX0VSUihi bG9jaykpIHsKLQkJCXByX2luZm8oImJ1ZGR5X2FsbG9jIGhpdCAtRU5PTUVNIHdpdGggb3JkZXI9 JWRcbiIsCi0JCQkJb3JkZXIpOwotCQkJZXJyID0gUFRSX0VSUihibG9jayk7Ci0JCQlnb3RvIGVy cjsKLQkJfQotCi0JCWxpc3RfYWRkX3RhaWwoJmJsb2NrLT5saW5rLCAmYmxvY2tzKTsKLQl9Ci0K LQkvKiBBbmQgbm93IHRoZSBsYXN0IHJlbWFpbmluZyBibG9jayBhdmFpbGFibGUgKi8KLQlibG9j ayA9IGk5MTVfYnVkZHlfYWxsb2MoJm1tLCAwKTsKLQlpZiAoSVNfRVJSKGJsb2NrKSkgewotCQlw cl9pbmZvKCJidWRkeV9hbGxvYyBoaXQgLUVOT01FTSBvbiBmaW5hbCBhbGxvY1xuIik7Ci0JCWVy ciA9IFBUUl9FUlIoYmxvY2spOwotCQlnb3RvIGVycjsKLQl9Ci0JbGlzdF9hZGRfdGFpbCgmYmxv Y2stPmxpbmssICZibG9ja3MpOwotCi0JLyogU2hvdWxkIGJlIGNvbXBsZXRlbHkgZnVsbCEgKi8K LQlmb3IgKG9yZGVyID0gbWF4X29yZGVyOyBvcmRlci0tOyApIHsKLQkJYmxvY2sgPSBpOTE1X2J1 ZGR5X2FsbG9jKCZtbSwgb3JkZXIpOwotCQlpZiAoIUlTX0VSUihibG9jaykpIHsKLQkJCXByX2lu Zm8oImJ1ZGR5X2FsbG9jIHVuZXhwZWN0ZWRseSBzdWNjZWVkZWQgYXQgb3JkZXIgJWQsIGl0IHNo b3VsZCBiZSBmdWxsISIsCi0JCQkJb3JkZXIpOwotCQkJbGlzdF9hZGRfdGFpbCgmYmxvY2stPmxp bmssICZibG9ja3MpOwotCQkJZXJyID0gLUVJTlZBTDsKLQkJCWdvdG8gZXJyOwotCQl9Ci0JfQot Ci0JYmxvY2sgPSBsaXN0X2xhc3RfZW50cnkoJmJsb2NrcywgdHlwZW9mKCpibG9jayksIGxpbmsp OwotCWxpc3RfZGVsKCZibG9jay0+bGluayk7Ci0JaTkxNV9idWRkeV9mcmVlKCZtbSwgYmxvY2sp OwotCi0JLyogQXMgd2UgZnJlZSBpbiBpbmNyZWFzaW5nIHNpemUsIHdlIG1ha2UgYXZhaWxhYmxl IGxhcmdlciBibG9ja3MgKi8KLQlvcmRlciA9IDE7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZl KGJsb2NrLCBibiwgJmJsb2NrcywgbGluaykgewotCQlsaXN0X2RlbCgmYmxvY2stPmxpbmspOwot CQlpOTE1X2J1ZGR5X2ZyZWUoJm1tLCBibG9jayk7Ci0KLQkJYmxvY2sgPSBpOTE1X2J1ZGR5X2Fs bG9jKCZtbSwgb3JkZXIpOwotCQlpZiAoSVNfRVJSKGJsb2NrKSkgewotCQkJcHJfaW5mbygiYnVk ZHlfYWxsb2MgKHJlYWxsb2MpIGhpdCAtRU5PTUVNIHdpdGggb3JkZXI9JWRcbiIsCi0JCQkJb3Jk ZXIpOwotCQkJZXJyID0gUFRSX0VSUihibG9jayk7Ci0JCQlnb3RvIGVycjsKLQkJfQotCQlpOTE1 X2J1ZGR5X2ZyZWUoJm1tLCBibG9jayk7Ci0JCW9yZGVyKys7Ci0JfQotCi0JLyogVG8gY29uZmly bSwgbm93IHRoZSB3aG9sZSBtbSBzaG91bGQgYmUgYXZhaWxhYmxlICovCi0JYmxvY2sgPSBpOTE1 X2J1ZGR5X2FsbG9jKCZtbSwgbWF4X29yZGVyKTsKLQlpZiAoSVNfRVJSKGJsb2NrKSkgewotCQlw cl9pbmZvKCJidWRkeV9hbGxvYyAocmVhbGxvYykgaGl0IC1FTk9NRU0gd2l0aCBvcmRlcj0lZFxu IiwKLQkJCW1heF9vcmRlcik7Ci0JCWVyciA9IFBUUl9FUlIoYmxvY2spOwotCQlnb3RvIGVycjsK LQl9Ci0JaTkxNV9idWRkeV9mcmVlKCZtbSwgYmxvY2spOwotCi1lcnI6Ci0JaTkxNV9idWRkeV9m cmVlX2xpc3QoJm1tLCAmYmxvY2tzKTsKLQlpOTE1X2J1ZGR5X2ZpbmkoJm1tKTsKLQlyZXR1cm4g ZXJyOwotfQotCi1zdGF0aWMgaW50IGlndF9idWRkeV9hbGxvY19vcHRpbWlzdGljKHZvaWQgKmFy ZykKLXsKLQljb25zdCBpbnQgbWF4X29yZGVyID0gMTY7Ci0Jc3RydWN0IGk5MTVfYnVkZHlfYmxv Y2sgKmJsb2NrOwotCXN0cnVjdCBpOTE1X2J1ZGR5X21tIG1tOwotCUxJU1RfSEVBRChibG9ja3Mp OwotCWludCBvcmRlcjsKLQlpbnQgZXJyOwotCi0JLyoKLQkgKiBDcmVhdGUgYSBtbSB3aXRoIG9u ZSBibG9jayBvZiBlYWNoIG9yZGVyIGF2YWlsYWJsZSwgYW5kCi0JICogdHJ5IHRvIGFsbG9jYXRl IHRoZW0gYWxsLgotCSAqLwotCi0JZXJyID0gaTkxNV9idWRkeV9pbml0KCZtbSwKLQkJCSAgICAg IFBBR0VfU0laRSAqICgoMSA8PCAobWF4X29yZGVyICsgMSkpIC0gMSksCi0JCQkgICAgICBQQUdF X1NJWkUpOwotCWlmIChlcnIpIHsKLQkJcHJfZXJyKCJidWRkeV9pbml0IGZhaWxlZCglZClcbiIs IGVycik7Ci0JCXJldHVybiBlcnI7Ci0JfQotCUdFTV9CVUdfT04obW0ubWF4X29yZGVyICE9IG1h eF9vcmRlcik7Ci0KLQlmb3IgKG9yZGVyID0gMDsgb3JkZXIgPD0gbWF4X29yZGVyOyBvcmRlcisr KSB7Ci0JCWJsb2NrID0gaTkxNV9idWRkeV9hbGxvYygmbW0sIG9yZGVyKTsKLQkJaWYgKElTX0VS UihibG9jaykpIHsKLQkJCXByX2luZm8oImJ1ZGR5X2FsbG9jIGhpdCAtRU5PTUVNIHdpdGggb3Jk ZXI9JWRcbiIsCi0JCQkJb3JkZXIpOwotCQkJZXJyID0gUFRSX0VSUihibG9jayk7Ci0JCQlnb3Rv IGVycjsKLQkJfQotCi0JCWxpc3RfYWRkX3RhaWwoJmJsb2NrLT5saW5rLCAmYmxvY2tzKTsKLQl9 Ci0KLQkvKiBTaG91bGQgYmUgY29tcGxldGVseSBmdWxsISAqLwotCWJsb2NrID0gaTkxNV9idWRk eV9hbGxvYygmbW0sIDApOwotCWlmICghSVNfRVJSKGJsb2NrKSkgewotCQlwcl9pbmZvKCJidWRk eV9hbGxvYyB1bmV4cGVjdGVkbHkgc3VjY2VlZGVkLCBpdCBzaG91bGQgYmUgZnVsbCEiKTsKLQkJ bGlzdF9hZGRfdGFpbCgmYmxvY2stPmxpbmssICZibG9ja3MpOwotCQllcnIgPSAtRUlOVkFMOwot CQlnb3RvIGVycjsKLQl9Ci0KLWVycjoKLQlpOTE1X2J1ZGR5X2ZyZWVfbGlzdCgmbW0sICZibG9j a3MpOwotCWk5MTVfYnVkZHlfZmluaSgmbW0pOwotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyBp bnQgaWd0X2J1ZGR5X2FsbG9jX3BhdGhvbG9naWNhbCh2b2lkICphcmcpCi17Ci0JY29uc3QgaW50 IG1heF9vcmRlciA9IDE2OwotCXN0cnVjdCBpOTE1X2J1ZGR5X2Jsb2NrICpibG9jazsKLQlzdHJ1 Y3QgaTkxNV9idWRkeV9tbSBtbTsKLQlMSVNUX0hFQUQoYmxvY2tzKTsKLQlMSVNUX0hFQUQoaG9s ZXMpOwotCWludCBvcmRlciwgdG9wOwotCWludCBlcnI7Ci0KLQkvKgotCSAqIENyZWF0ZSBhIHBv dC1zaXplZCBtbSwgdGhlbiBhbGxvY2F0ZSBvbmUgb2YgZWFjaCBwb3NzaWJsZQotCSAqIG9yZGVy IHdpdGhpbi4gVGhpcyBzaG91bGQgbGVhdmUgdGhlIG1tIHdpdGggZXhhY3RseSBvbmUKLQkgKiBw YWdlIGxlZnQuIEZyZWUgdGhlIGxhcmdlc3QgYmxvY2ssIHRoZW4gd2hpdHRsZSBkb3duIGFnYWlu LgotCSAqIEV2ZW50dWFsbHkgd2Ugd2lsbCBoYXZlIGEgZnVsbHkgNTAlIGZyYWdtZW50ZWQgbW0u Ci0JICovCi0KLQllcnIgPSBpOTE1X2J1ZGR5X2luaXQoJm1tLCBQQUdFX1NJWkUgPDwgbWF4X29y ZGVyLCBQQUdFX1NJWkUpOwotCWlmIChlcnIpIHsKLQkJcHJfZXJyKCJidWRkeV9pbml0IGZhaWxl ZCglZClcbiIsIGVycik7Ci0JCXJldHVybiBlcnI7Ci0JfQotCUdFTV9CVUdfT04obW0ubWF4X29y ZGVyICE9IG1heF9vcmRlcik7Ci0KLQlmb3IgKHRvcCA9IG1heF9vcmRlcjsgdG9wOyB0b3AtLSkg ewotCQkvKiBNYWtlIHJvb20gYnkgZnJlZWluZyB0aGUgbGFyZ2VzdCBhbGxvY2F0ZWQgYmxvY2sg Ki8KLQkJYmxvY2sgPSBsaXN0X2ZpcnN0X2VudHJ5X29yX251bGwoJmJsb2NrcywgdHlwZW9mKCpi bG9jayksIGxpbmspOwotCQlpZiAoYmxvY2spIHsKLQkJCWxpc3RfZGVsKCZibG9jay0+bGluayk7 Ci0JCQlpOTE1X2J1ZGR5X2ZyZWUoJm1tLCBibG9jayk7Ci0JCX0KLQotCQlmb3IgKG9yZGVyID0g dG9wOyBvcmRlci0tOyApIHsKLQkJCWJsb2NrID0gaTkxNV9idWRkeV9hbGxvYygmbW0sIG9yZGVy KTsKLQkJCWlmIChJU19FUlIoYmxvY2spKSB7Ci0JCQkJcHJfaW5mbygiYnVkZHlfYWxsb2MgaGl0 IC1FTk9NRU0gd2l0aCBvcmRlcj0lZCwgdG9wPSVkXG4iLAotCQkJCQlvcmRlciwgdG9wKTsKLQkJ CQllcnIgPSBQVFJfRVJSKGJsb2NrKTsKLQkJCQlnb3RvIGVycjsKLQkJCX0KLQkJCWxpc3RfYWRk X3RhaWwoJmJsb2NrLT5saW5rLCAmYmxvY2tzKTsKLQkJfQotCi0JCS8qIFRoZXJlIHNob3VsZCBi ZSBvbmUgZmluYWwgcGFnZSBmb3IgdGhpcyBzdWItYWxsb2NhdGlvbiAqLwotCQlibG9jayA9IGk5 MTVfYnVkZHlfYWxsb2MoJm1tLCAwKTsKLQkJaWYgKElTX0VSUihibG9jaykpIHsKLQkJCXByX2lu Zm8oImJ1ZGR5X2FsbG9jIGhpdCAtRU5PTUVNIGZvciBob2xlXG4iKTsKLQkJCWVyciA9IFBUUl9F UlIoYmxvY2spOwotCQkJZ290byBlcnI7Ci0JCX0KLQkJbGlzdF9hZGRfdGFpbCgmYmxvY2stPmxp bmssICZob2xlcyk7Ci0KLQkJYmxvY2sgPSBpOTE1X2J1ZGR5X2FsbG9jKCZtbSwgdG9wKTsKLQkJ aWYgKCFJU19FUlIoYmxvY2spKSB7Ci0JCQlwcl9pbmZvKCJidWRkeV9hbGxvYyB1bmV4cGVjdGVk bHkgc3VjY2VlZGVkIGF0IHRvcC1vcmRlciAlZC8lZCwgaXQgc2hvdWxkIGJlIGZ1bGwhIiwKLQkJ CQl0b3AsIG1heF9vcmRlcik7Ci0JCQlsaXN0X2FkZF90YWlsKCZibG9jay0+bGluaywgJmJsb2Nr cyk7Ci0JCQllcnIgPSAtRUlOVkFMOwotCQkJZ290byBlcnI7Ci0JCX0KLQl9Ci0KLQlpOTE1X2J1 ZGR5X2ZyZWVfbGlzdCgmbW0sICZob2xlcyk7Ci0KLQkvKiBOb3RoaW5nIGxhcmdlciB0aGFuIGJs b2NrcyBvZiBjaHVua19zaXplIG5vdyBhdmFpbGFibGUgKi8KLQlmb3IgKG9yZGVyID0gMTsgb3Jk ZXIgPD0gbWF4X29yZGVyOyBvcmRlcisrKSB7Ci0JCWJsb2NrID0gaTkxNV9idWRkeV9hbGxvYygm bW0sIG9yZGVyKTsKLQkJaWYgKCFJU19FUlIoYmxvY2spKSB7Ci0JCQlwcl9pbmZvKCJidWRkeV9h bGxvYyB1bmV4cGVjdGVkbHkgc3VjY2VlZGVkIGF0IG9yZGVyICVkLCBpdCBzaG91bGQgYmUgZnVs bCEiLAotCQkJCW9yZGVyKTsKLQkJCWxpc3RfYWRkX3RhaWwoJmJsb2NrLT5saW5rLCAmYmxvY2tz KTsKLQkJCWVyciA9IC1FSU5WQUw7Ci0JCQlnb3RvIGVycjsKLQkJfQotCX0KLQotZXJyOgotCWxp c3Rfc3BsaWNlX3RhaWwoJmhvbGVzLCAmYmxvY2tzKTsKLQlpOTE1X2J1ZGR5X2ZyZWVfbGlzdCgm bW0sICZibG9ja3MpOwotCWk5MTVfYnVkZHlfZmluaSgmbW0pOwotCXJldHVybiBlcnI7Ci19Ci0K LXN0YXRpYyBpbnQgaWd0X2J1ZGR5X2FsbG9jX3JhbmdlKHZvaWQgKmFyZykKLXsKLQlzdHJ1Y3Qg aTkxNV9idWRkeV9tbSBtbTsKLQl1bnNpZ25lZCBsb25nIHBhZ2VfbnVtOwotCUxJU1RfSEVBRChi bG9ja3MpOwotCXU2NCBjaHVua19zaXplOwotCXU2NCBvZmZzZXQ7Ci0JdTY0IHNpemU7Ci0JdTY0 IHJlbTsKLQlpbnQgZXJyOwotCi0JaWd0X21tX2NvbmZpZygmc2l6ZSwgJmNodW5rX3NpemUpOwot Ci0JcHJfaW5mbygiYnVkZHlfaW5pdCB3aXRoIHNpemU9JWxseCwgY2h1bmtfc2l6ZT0lbGx4XG4i LCBzaXplLCBjaHVua19zaXplKTsKLQotCWVyciA9IGk5MTVfYnVkZHlfaW5pdCgmbW0sIHNpemUs IGNodW5rX3NpemUpOwotCWlmIChlcnIpIHsKLQkJcHJfZXJyKCJidWRkeV9pbml0IGZhaWxlZCgl ZClcbiIsIGVycik7Ci0JCXJldHVybiBlcnI7Ci0JfQotCi0JZXJyID0gaWd0X2NoZWNrX21tKCZt bSk7Ci0JaWYgKGVycikgewotCQlwcl9lcnIoInByZS1tbSBjaGVjayBmYWlsZWQsIGFib3J0LCBh Ym9ydCwgYWJvcnQhXG4iKTsKLQkJZ290byBlcnJfZmluaTsKLQl9Ci0KLQlyZW0gPSBtbS5zaXpl OwotCW9mZnNldCA9IDA7Ci0KLQlmb3JfZWFjaF9wcmltZV9udW1iZXJfZnJvbShwYWdlX251bSwg MSwgVUxPTkdfTUFYIC0gMSkgewotCQlzdHJ1Y3QgaTkxNV9idWRkeV9ibG9jayAqYmxvY2s7Ci0J CUxJU1RfSEVBRCh0bXApOwotCi0JCXNpemUgPSBtaW4ocGFnZV9udW0gKiBtbS5jaHVua19zaXpl LCByZW0pOwotCi0JCWVyciA9IGk5MTVfYnVkZHlfYWxsb2NfcmFuZ2UoJm1tLCAmdG1wLCBvZmZz ZXQsIHNpemUpOwotCQlpZiAoZXJyKSB7Ci0JCQlpZiAoZXJyID09IC1FTk9NRU0pIHsKLQkJCQlw cl9pbmZvKCJhbGxvY19yYW5nZSBoaXQgLUVOT01FTSB3aXRoIHNpemU9JWxseFxuIiwKLQkJCQkJ c2l6ZSk7Ci0JCQl9IGVsc2UgewotCQkJCXByX2VycigiYWxsb2NfcmFuZ2Ugd2l0aCBvZmZzZXQ9 JWxseCwgc2l6ZT0lbGx4IGZhaWxlZCglZClcbiIsCi0JCQkJICAgICAgIG9mZnNldCwgc2l6ZSwg ZXJyKTsKLQkJCX0KLQotCQkJYnJlYWs7Ci0JCX0KLQotCQlibG9jayA9IGxpc3RfZmlyc3RfZW50 cnlfb3JfbnVsbCgmdG1wLAotCQkJCQkJIHN0cnVjdCBpOTE1X2J1ZGR5X2Jsb2NrLAotCQkJCQkJ IGxpbmspOwotCQlpZiAoIWJsb2NrKSB7Ci0JCQlwcl9lcnIoImFsbG9jX3JhbmdlIGhhcyBubyBi bG9ja3NcbiIpOwotCQkJZXJyID0gLUVJTlZBTDsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKGk5 MTVfYnVkZHlfYmxvY2tfb2Zmc2V0KGJsb2NrKSAhPSBvZmZzZXQpIHsKLQkJCXByX2VycigiYWxs b2NfcmFuZ2Ugc3RhcnQgb2Zmc2V0IG1pc21hdGNoLCBmb3VuZD0lbGx4LCBleHBlY3RlZD0lbGx4 XG4iLAotCQkJICAgICAgIGk5MTVfYnVkZHlfYmxvY2tfb2Zmc2V0KGJsb2NrKSwgb2Zmc2V0KTsK LQkJCWVyciA9IC1FSU5WQUw7Ci0JCX0KLQotCQlpZiAoIWVycikKLQkJCWVyciA9IGlndF9jaGVj a19ibG9ja3MoJm1tLCAmdG1wLCBzaXplLCB0cnVlKTsKLQotCQlsaXN0X3NwbGljZV90YWlsKCZ0 bXAsICZibG9ja3MpOwotCi0JCWlmIChlcnIpCi0JCQlicmVhazsKLQotCQlvZmZzZXQgKz0gc2l6 ZTsKLQotCQlyZW0gLT0gc2l6ZTsKLQkJaWYgKCFyZW0pCi0JCQlicmVhazsKLQotCQljb25kX3Jl c2NoZWQoKTsKLQl9Ci0KLQlpZiAoZXJyID09IC1FTk9NRU0pCi0JCWVyciA9IDA7Ci0KLQlpOTE1 X2J1ZGR5X2ZyZWVfbGlzdCgmbW0sICZibG9ja3MpOwotCi0JaWYgKCFlcnIpIHsKLQkJZXJyID0g aWd0X2NoZWNrX21tKCZtbSk7Ci0JCWlmIChlcnIpCi0JCQlwcl9lcnIoInBvc3QtbW0gY2hlY2sg ZmFpbGVkXG4iKTsKLQl9Ci0KLWVycl9maW5pOgotCWk5MTVfYnVkZHlfZmluaSgmbW0pOwotCi0J cmV0dXJuIGVycjsKLX0KLQotc3RhdGljIGludCBpZ3RfYnVkZHlfYWxsb2NfbGltaXQodm9pZCAq YXJnKQotewotCXN0cnVjdCBpOTE1X2J1ZGR5X2Jsb2NrICpibG9jazsKLQlzdHJ1Y3QgaTkxNV9i dWRkeV9tbSBtbTsKLQljb25zdCB1NjQgc2l6ZSA9IFU2NF9NQVg7Ci0JaW50IGVycjsKLQotCWVy ciA9IGk5MTVfYnVkZHlfaW5pdCgmbW0sIHNpemUsIFBBR0VfU0laRSk7Ci0JaWYgKGVycikKLQkJ cmV0dXJuIGVycjsKLQotCWlmIChtbS5tYXhfb3JkZXIgIT0gSTkxNV9CVUREWV9NQVhfT1JERVIp IHsKLQkJcHJfZXJyKCJtbS5tYXhfb3JkZXIoJWQpICE9ICVkXG4iLAotCQkgICAgICAgbW0ubWF4 X29yZGVyLCBJOTE1X0JVRERZX01BWF9PUkRFUik7Ci0JCWVyciA9IC1FSU5WQUw7Ci0JCWdvdG8g b3V0X2Zpbmk7Ci0JfQotCi0JYmxvY2sgPSBpOTE1X2J1ZGR5X2FsbG9jKCZtbSwgbW0ubWF4X29y ZGVyKTsKLQlpZiAoSVNfRVJSKGJsb2NrKSkgewotCQllcnIgPSBQVFJfRVJSKGJsb2NrKTsKLQkJ Z290byBvdXRfZmluaTsKLQl9Ci0KLQlpZiAoaTkxNV9idWRkeV9ibG9ja19vcmRlcihibG9jaykg IT0gbW0ubWF4X29yZGVyKSB7Ci0JCXByX2VycigiYmxvY2sgb3JkZXIoJWQpICE9ICVkXG4iLAot CQkgICAgICAgaTkxNV9idWRkeV9ibG9ja19vcmRlcihibG9jayksIG1tLm1heF9vcmRlcik7Ci0J CWVyciA9IC1FSU5WQUw7Ci0JCWdvdG8gb3V0X2ZyZWU7Ci0JfQotCi0JaWYgKGk5MTVfYnVkZHlf YmxvY2tfc2l6ZSgmbW0sIGJsb2NrKSAhPQotCSAgICBCSVRfVUxMKG1tLm1heF9vcmRlcikgKiBQ QUdFX1NJWkUpIHsKLQkJcHJfZXJyKCJibG9jayBzaXplKCVsbHUpICE9ICVsbHVcbiIsCi0JCSAg ICAgICBpOTE1X2J1ZGR5X2Jsb2NrX3NpemUoJm1tLCBibG9jayksCi0JCSAgICAgICBCSVRfVUxM KG1tLm1heF9vcmRlcikgKiBQQUdFX1NJWkUpOwotCQllcnIgPSAtRUlOVkFMOwotCQlnb3RvIG91 dF9mcmVlOwotCX0KLQotb3V0X2ZyZWU6Ci0JaTkxNV9idWRkeV9mcmVlKCZtbSwgYmxvY2spOwot b3V0X2Zpbmk6Ci0JaTkxNV9idWRkeV9maW5pKCZtbSk7Ci0JcmV0dXJuIGVycjsKLX0KLQotaW50 IGk5MTVfYnVkZHlfbW9ja19zZWxmdGVzdHModm9pZCkKLXsKLQlzdGF0aWMgY29uc3Qgc3RydWN0 IGk5MTVfc3VidGVzdCB0ZXN0c1tdID0gewotCQlTVUJURVNUKGlndF9idWRkeV9hbGxvY19wZXNz aW1pc3RpYyksCi0JCVNVQlRFU1QoaWd0X2J1ZGR5X2FsbG9jX29wdGltaXN0aWMpLAotCQlTVUJU RVNUKGlndF9idWRkeV9hbGxvY19wYXRob2xvZ2ljYWwpLAotCQlTVUJURVNUKGlndF9idWRkeV9h bGxvY19zbW9rZSksCi0JCVNVQlRFU1QoaWd0X2J1ZGR5X2FsbG9jX3JhbmdlKSwKLQkJU1VCVEVT VChpZ3RfYnVkZHlfYWxsb2NfbGltaXQpLAotCX07Ci0KLQlyZXR1cm4gaTkxNV9zdWJ0ZXN0cyh0 ZXN0cywgTlVMTCk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9zZWxmdGVz dHMvaTkxNV9tb2NrX3NlbGZ0ZXN0cy5oIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvc2VsZnRlc3Rz L2k5MTVfbW9ja19zZWxmdGVzdHMuaAppbmRleCAzZGIzNGQzZWVhNTguLjM0ZTVjYWYzODA5MyAx MDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvc2VsZnRlc3RzL2k5MTVfbW9ja19zZWxm dGVzdHMuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9zZWxmdGVzdHMvaTkxNV9tb2NrX3Nl bGZ0ZXN0cy5oCkBAIC0zMyw1ICszMyw0IEBAIHNlbGZ0ZXN0KGV2aWN0LCBpOTE1X2dlbV9ldmlj dF9tb2NrX3NlbGZ0ZXN0cykKIHNlbGZ0ZXN0KGd0dCwgaTkxNV9nZW1fZ3R0X21vY2tfc2VsZnRl c3RzKQogc2VsZnRlc3QoaHVnZXBhZ2VzLCBpOTE1X2dlbV9odWdlX3BhZ2VfbW9ja19zZWxmdGVz dHMpCiBzZWxmdGVzdChjb250ZXh0cywgaTkxNV9nZW1fY29udGV4dF9tb2NrX3NlbGZ0ZXN0cykK LXNlbGZ0ZXN0KGJ1ZGR5LCBpOTE1X2J1ZGR5X21vY2tfc2VsZnRlc3RzKQogc2VsZnRlc3QobWVt b3J5X3JlZ2lvbiwgaW50ZWxfbWVtb3J5X3JlZ2lvbl9tb2NrX3NlbGZ0ZXN0cykKZGlmZiAtLWdp dCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L3NlbGZ0ZXN0cy9pbnRlbF9tZW1vcnlfcmVnaW9uLmMg Yi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9zZWxmdGVzdHMvaW50ZWxfbWVtb3J5X3JlZ2lvbi5jCmlu ZGV4IGY4NWZkOGNiZmJmNS4uYzg1ZDUxNmI4NWNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9k cm0vaTkxNS9zZWxmdGVzdHMvaW50ZWxfbWVtb3J5X3JlZ2lvbi5jCisrKyBiL2RyaXZlcnMvZ3B1 L2RybS9pOTE1L3NlbGZ0ZXN0cy9pbnRlbF9tZW1vcnlfcmVnaW9uLmMKQEAgLTU3LDkgKzU3LDEw IEBAIHN0YXRpYyBpbnQgaWd0X21vY2tfZmlsbCh2b2lkICphcmcpCiAJTElTVF9IRUFEKG9iamVj dHMpOwogCWludCBlcnIgPSAwOwogCi0JcGFnZV9zaXplID0gbWVtLT5tbS5jaHVua19zaXplOwot CW1heF9wYWdlcyA9IGRpdjY0X3U2NCh0b3RhbCwgcGFnZV9zaXplKTsKKwlwYWdlX3NpemUgPSBt ZW0tPmNodW5rX3NpemU7CiAJcmVtID0gdG90YWw7CityZXRyeToKKwltYXhfcGFnZXMgPSBkaXY2 NF91NjQocmVtLCBwYWdlX3NpemUpOwogCiAJZm9yX2VhY2hfcHJpbWVfbnVtYmVyX2Zyb20ocGFn ZV9udW0sIDEsIG1heF9wYWdlcykgewogCQlyZXNvdXJjZV9zaXplX3Qgc2l6ZSA9IHBhZ2VfbnVt ICogcGFnZV9zaXplOwpAQCAtODUsNiArODYsMTEgQEAgc3RhdGljIGludCBpZ3RfbW9ja19maWxs KHZvaWQgKmFyZykKIAkJZXJyID0gMDsKIAlpZiAoZXJyID09IC1FTlhJTykgewogCQlpZiAocGFn ZV9udW0gKiBwYWdlX3NpemUgPD0gcmVtKSB7CisJCQlpZiAobWVtLT5pc19yYW5nZV9tYW5hZ2Vy ICYmIG1heF9wYWdlcyA+IDEpIHsKKwkJCQltYXhfcGFnZXMgPj49IDE7CisJCQkJZ290byByZXRy eTsKKwkJCX0KKwogCQkJcHJfZXJyKCIlcyBmYWlsZWQsIHNwYWNlIHN0aWxsIGxlZnQgaW4gcmVn aW9uXG4iLAogCQkJICAgICAgIF9fZnVuY19fKTsKIAkJCWVyciA9IC1FSU5WQUw7CkBAIC0xOTks MTIgKzIwNSwxOCBAQCBzdGF0aWMgaW50IGlndF9tb2NrX3Jlc2VydmUodm9pZCAqYXJnKQogCWRv IHsKIAkJdTMyIHNpemUgPSBpOTE1X3ByYW5kb21fdTMyX21heF9zdGF0ZShjdXJfYXZhaWwsICZw cm5nKTsKIAorcmV0cnk6CiAJCXNpemUgPSBtYXhfdCh1MzIsIHJvdW5kX3VwKHNpemUsIFBBR0Vf U0laRSksIFBBR0VfU0laRSk7CiAJCW9iaiA9IGlndF9vYmplY3RfY3JlYXRlKG1lbSwgJm9iamVj dHMsIHNpemUsIDApOwogCQlpZiAoSVNfRVJSKG9iaikpIHsKLQkJCWlmIChQVFJfRVJSKG9iaikg PT0gLUVOWElPKQorCQkJaWYgKFBUUl9FUlIob2JqKSA9PSAtRU5YSU8pIHsKKwkJCQlpZiAobWVt LT5pc19yYW5nZV9tYW5hZ2VyICYmCisJCQkJICAgIHNpemUgPiBtZW0tPmNodW5rX3NpemUpIHsK KwkJCQkJc2l6ZSA+Pj0gMTsKKwkJCQkJZ290byByZXRyeTsKKwkJCQl9CiAJCQkJYnJlYWs7Ci0K KwkJCX0KIAkJCWVyciA9IFBUUl9FUlIob2JqKTsKIAkJCWdvdG8gb3V0X2Nsb3NlOwogCQl9CkBA IC0yMjAsNyArMjMyLDcgQEAgc3RhdGljIGludCBpZ3RfbW9ja19yZXNlcnZlKHZvaWQgKmFyZykK IG91dF9jbG9zZToKIAlrZnJlZShvcmRlcik7CiAJY2xvc2Vfb2JqZWN0cyhtZW0sICZvYmplY3Rz KTsKLQlpOTE1X2J1ZGR5X2ZyZWVfbGlzdCgmbWVtLT5tbSwgJm1lbS0+cmVzZXJ2ZWQpOworCWlu dGVsX21lbW9yeV9yZWdpb25fdW5yZXNlcnZlKG1lbSk7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAt MjQwLDcgKzI1Miw3IEBAIHN0YXRpYyBpbnQgaWd0X21vY2tfY29udGlndW91cyh2b2lkICphcmcp CiAJdG90YWwgPSByZXNvdXJjZV9zaXplKCZtZW0tPnJlZ2lvbik7CiAKIAkvKiBNaW4gc2l6ZSAq LwotCW9iaiA9IGlndF9vYmplY3RfY3JlYXRlKG1lbSwgJm9iamVjdHMsIG1lbS0+bW0uY2h1bmtf c2l6ZSwKKwlvYmogPSBpZ3Rfb2JqZWN0X2NyZWF0ZShtZW0sICZvYmplY3RzLCBtZW0tPmNodW5r X3NpemUsCiAJCQkJSTkxNV9CT19BTExPQ19DT05USUdVT1VTKTsKIAlpZiAoSVNfRVJSKG9iaikp CiAJCXJldHVybiBQVFJfRVJSKG9iaik7CkBAIC0zMjEsMTQgKzMzMywxNiBAQCBzdGF0aWMgaW50 IGlndF9tb2NrX2NvbnRpZ3VvdXModm9pZCAqYXJnKQogCW1pbiA9IHRhcmdldDsKIAl0YXJnZXQg PSB0b3RhbCA+PiAxOwogCi0JLyogTWFrZSBzdXJlIHdlIGNhbiBzdGlsbCBhbGxvY2F0ZSBhbGwg dGhlIGZyYWdtZW50ZWQgc3BhY2UgKi8KLQlvYmogPSBpZ3Rfb2JqZWN0X2NyZWF0ZShtZW0sICZv YmplY3RzLCB0YXJnZXQsIDApOwotCWlmIChJU19FUlIob2JqKSkgewotCQllcnIgPSBQVFJfRVJS KG9iaik7Ci0JCWdvdG8gZXJyX2Nsb3NlX29iamVjdHM7Ci0JfQorCWlmICghbWVtLT5pc19yYW5n ZV9tYW5hZ2VyKSB7CisJCS8qIE1ha2Ugc3VyZSB3ZSBjYW4gc3RpbGwgYWxsb2NhdGUgYWxsIHRo ZSBmcmFnbWVudGVkIHNwYWNlICovCisJCW9iaiA9IGlndF9vYmplY3RfY3JlYXRlKG1lbSwgJm9i amVjdHMsIHRhcmdldCwgMCk7CisJCWlmIChJU19FUlIob2JqKSkgeworCQkJZXJyID0gUFRSX0VS UihvYmopOworCQkJZ290byBlcnJfY2xvc2Vfb2JqZWN0czsKKwkJfQogCi0JaWd0X29iamVjdF9y ZWxlYXNlKG9iaik7CisJCWlndF9vYmplY3RfcmVsZWFzZShvYmopOworCX0KIAogCS8qCiAJICog RXZlbiB0aG91Z2ggd2UgaGF2ZSBlbm91Z2ggZnJlZSBzcGFjZSwgd2UgZG9uJ3QgaGF2ZSBhIGJp ZyBlbm91Z2gKQEAgLTM0OCw3ICszNjIsNyBAQCBzdGF0aWMgaW50IGlndF9tb2NrX2NvbnRpZ3Vv dXModm9pZCAqYXJnKQogCQl9CiAKIAkJdGFyZ2V0ID4+PSAxOwotCX0gd2hpbGUgKHRhcmdldCA+ PSBtZW0tPm1tLmNodW5rX3NpemUpOworCX0gd2hpbGUgKHRhcmdldCA+PSBtZW0tPmNodW5rX3Np emUpOwogCiBlcnJfY2xvc2Vfb2JqZWN0czoKIAlsaXN0X3NwbGljZV90YWlsKCZob2xlcywgJm9i amVjdHMpOwpAQCAtMzY4LDcgKzM4Miw3IEBAIHN0YXRpYyBpbnQgaWd0X21vY2tfc3BsaW50ZXJl ZF9yZWdpb24odm9pZCAqYXJnKQogCiAJLyoKIAkgKiBTYW5pdHkgY2hlY2sgd2UgY2FuIHN0aWxs IGFsbG9jYXRlIGV2ZXJ5dGhpbmcgZXZlbiBpZiB0aGUKLQkgKiBtbS5tYXhfb3JkZXIgIT0gbW0u c2l6ZS4gaS5lIG91ciBzdGFydGluZyBhZGRyZXNzIHNwYWNlIHNpemUgaXMgbm90IGEKKwkgKiBt YXhfb3JkZXIgIT0gbW0uc2l6ZS4gaS5lIG91ciBzdGFydGluZyBhZGRyZXNzIHNwYWNlIHNpemUg aXMgbm90IGEKIAkgKiBwb3dlci1vZi10d28uCiAJICovCiAKQEAgLTM3NywxNyArMzkxLDEwIEBA IHN0YXRpYyBpbnQgaWd0X21vY2tfc3BsaW50ZXJlZF9yZWdpb24odm9pZCAqYXJnKQogCWlmIChJ U19FUlIobWVtKSkKIAkJcmV0dXJuIFBUUl9FUlIobWVtKTsKIAotCWlmIChtZW0tPm1tLnNpemUg IT0gc2l6ZSkgewotCQlwcl9lcnIoIiVzIHNpemUgbWlzbWF0Y2goJWxsdSAhPSAlbGx1KVxuIiwK LQkJICAgICAgIF9fZnVuY19fLCBtZW0tPm1tLnNpemUsIHNpemUpOwotCQllcnIgPSAtRUlOVkFM OwotCQlnb3RvIG91dF9wdXQ7Ci0JfQotCiAJZXhwZWN0ZWRfb3JkZXIgPSBnZXRfb3JkZXIocm91 bmRkb3duX3Bvd19vZl90d28oc2l6ZSkpOwotCWlmIChtZW0tPm1tLm1heF9vcmRlciAhPSBleHBl Y3RlZF9vcmRlcikgeworCWlmIChtZW0tPm1heF9vcmRlciAhPSBleHBlY3RlZF9vcmRlcikgewog CQlwcl9lcnIoIiVzIG9yZGVyIG1pc21hdGNoKCV1ICE9ICV1KVxuIiwKLQkJICAgICAgIF9fZnVu Y19fLCBtZW0tPm1tLm1heF9vcmRlciwgZXhwZWN0ZWRfb3JkZXIpOworCQkgICAgICAgX19mdW5j X18sIG1lbS0+bWF4X29yZGVyLCBleHBlY3RlZF9vcmRlcik7CiAJCWVyciA9IC1FSU5WQUw7CiAJ CWdvdG8gb3V0X3B1dDsKIAl9CkBAIC00MDgsMTIgKzQxNSwxNSBAQCBzdGF0aWMgaW50IGlndF9t b2NrX3NwbGludGVyZWRfcmVnaW9uKHZvaWQgKmFyZykKIAkgKiBzdXJlIHRoYXQgZG9lcyBpbmRl ZWQgaG9sZCB0cnVlLgogCSAqLwogCi0Jb2JqID0gaWd0X29iamVjdF9jcmVhdGUobWVtLCAmb2Jq ZWN0cywgc2l6ZSwgSTkxNV9CT19BTExPQ19DT05USUdVT1VTKTsKLQlpZiAoIUlTX0VSUihvYmop KSB7Ci0JCXByX2VycigiJXMgdG9vIGxhcmdlIGNvbnRpZ3VvdXMgYWxsb2NhdGlvbiB3YXMgbm90 IHJlamVjdGVkXG4iLAotCQkgICAgICAgX19mdW5jX18pOwotCQllcnIgPSAtRUlOVkFMOwotCQln b3RvIG91dF9jbG9zZTsKKwlpZiAoIW1lbS0+aXNfcmFuZ2VfbWFuYWdlcikgeworCQlvYmogPSBp Z3Rfb2JqZWN0X2NyZWF0ZShtZW0sICZvYmplY3RzLCBzaXplLAorCQkJCQlJOTE1X0JPX0FMTE9D X0NPTlRJR1VPVVMpOworCQlpZiAoIUlTX0VSUihvYmopKSB7CisJCQlwcl9lcnIoIiVzIHRvbyBs YXJnZSBjb250aWd1b3VzIGFsbG9jYXRpb24gd2FzIG5vdCByZWplY3RlZFxuIiwKKwkJCSAgICAg ICBfX2Z1bmNfXyk7CisJCQllcnIgPSAtRUlOVkFMOworCQkJZ290byBvdXRfY2xvc2U7CisJCX0K IAl9CiAKIAlvYmogPSBpZ3Rfb2JqZWN0X2NyZWF0ZShtZW0sICZvYmplY3RzLCByb3VuZGRvd25f cG93X29mX3R3byhzaXplKSwKQEAgLTQzMiw2OCArNDQyLDYgQEAgc3RhdGljIGludCBpZ3RfbW9j a19zcGxpbnRlcmVkX3JlZ2lvbih2b2lkICphcmcpCiAJcmV0dXJuIGVycjsKIH0KIAotI2lmbmRl ZiBTWl84RwotI2RlZmluZSBTWl84RyBCSVRfVUxMKDMzKQotI2VuZGlmCi0KLXN0YXRpYyBpbnQg aWd0X21vY2tfbWF4X3NlZ21lbnQodm9pZCAqYXJnKQotewotCWNvbnN0IHVuc2lnbmVkIGludCBt YXhfc2VnbWVudCA9IGk5MTVfc2dfc2VnbWVudF9zaXplKCk7Ci0Jc3RydWN0IGludGVsX21lbW9y eV9yZWdpb24gKm1lbSA9IGFyZzsKLQlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSA9IG1l bS0+aTkxNTsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOwotCXN0cnVjdCBpOTE1 X2J1ZGR5X2Jsb2NrICpibG9jazsKLQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOwotCUxJU1RfSEVB RChvYmplY3RzKTsKLQl1NjQgc2l6ZTsKLQlpbnQgZXJyID0gMDsKLQotCS8qCi0JICogV2hpbGUg d2UgbWF5IGNyZWF0ZSB2ZXJ5IGxhcmdlIGNvbnRpZ3VvdXMgYmxvY2tzLCB3ZSBtYXkgbmVlZAot CSAqIHRvIGJyZWFrIHRob3NlIGRvd24gZm9yIGNvbnN1bXB0aW9uIGVsc2V3aGVyZS4gSW4gcGFy dGljdWxhciwKLQkgKiBkbWEtbWFwcGluZyB3aXRoIHNjYXR0ZXJsaXN0IGVsZW1lbnRzIGhhdmUg YW4gaW1wbGljaXQgbGltaXQgb2YKLQkgKiBVSU5UX01BWCBvbiBlYWNoIGVsZW1lbnQuCi0JICov Ci0KLQlzaXplID0gU1pfOEc7Ci0JbWVtID0gbW9ja19yZWdpb25fY3JlYXRlKGk5MTUsIDAsIHNp emUsIFBBR0VfU0laRSwgMCk7Ci0JaWYgKElTX0VSUihtZW0pKQotCQlyZXR1cm4gUFRSX0VSUiht ZW0pOwotCi0Jb2JqID0gaWd0X29iamVjdF9jcmVhdGUobWVtLCAmb2JqZWN0cywgc2l6ZSwgMCk7 Ci0JaWYgKElTX0VSUihvYmopKSB7Ci0JCWVyciA9IFBUUl9FUlIob2JqKTsKLQkJZ290byBvdXRf cHV0OwotCX0KLQotCXNpemUgPSAwOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoYmxvY2ssICZvYmot Pm1tLmJsb2NrcywgbGluaykgewotCQlpZiAoaTkxNV9idWRkeV9ibG9ja19zaXplKCZtZW0tPm1t LCBibG9jaykgPiBzaXplKQotCQkJc2l6ZSA9IGk5MTVfYnVkZHlfYmxvY2tfc2l6ZSgmbWVtLT5t bSwgYmxvY2spOwotCX0KLQlpZiAoc2l6ZSA8IG1heF9zZWdtZW50KSB7Ci0JCXByX2VycigiJXM6 IEZhaWxlZCB0byBjcmVhdGUgYSBodWdlIGNvbnRpZ3VvdXMgYmxvY2sgWz4gJXVdLCBsYXJnZXN0 IGJsb2NrICVsbGRcbiIsCi0JCSAgICAgICBfX2Z1bmNfXywgbWF4X3NlZ21lbnQsIHNpemUpOwot CQllcnIgPSAtRUlOVkFMOwotCQlnb3RvIG91dF9jbG9zZTsKLQl9Ci0KLQlmb3IgKHNnID0gb2Jq LT5tbS5wYWdlcy0+c2dsOyBzZzsgc2cgPSBzZ19uZXh0KHNnKSkgewotCQlpZiAoc2ctPmxlbmd0 aCA+IG1heF9zZWdtZW50KSB7Ci0JCQlwcl9lcnIoIiVzOiBDcmVhdGVkIGFuIG92ZXJzaXplZCBz Y2F0dGVybGlzdCBlbnRyeSwgJXUgPiAldVxuIiwKLQkJCSAgICAgICBfX2Z1bmNfXywgc2ctPmxl bmd0aCwgbWF4X3NlZ21lbnQpOwotCQkJZXJyID0gLUVJTlZBTDsKLQkJCWdvdG8gb3V0X2Nsb3Nl OwotCQl9Ci0JfQotCi1vdXRfY2xvc2U6Ci0JY2xvc2Vfb2JqZWN0cyhtZW0sICZvYmplY3RzKTsK LW91dF9wdXQ6Ci0JaW50ZWxfbWVtb3J5X3JlZ2lvbl9wdXQobWVtKTsKLQlyZXR1cm4gZXJyOwot fQotCiBzdGF0aWMgaW50IGlndF9ncHVfd3JpdGVfZHcoc3RydWN0IGludGVsX2NvbnRleHQgKmNl LAogCQkJICAgIHN0cnVjdCBpOTE1X3ZtYSAqdm1hLAogCQkJICAgIHUzMiBkd29yZCwKQEAgLTEw OTgsNyArMTA0Niw2IEBAIGludCBpbnRlbF9tZW1vcnlfcmVnaW9uX21vY2tfc2VsZnRlc3RzKHZv aWQpCiAJCVNVQlRFU1QoaWd0X21vY2tfZmlsbCksCiAJCVNVQlRFU1QoaWd0X21vY2tfY29udGln dW91cyksCiAJCVNVQlRFU1QoaWd0X21vY2tfc3BsaW50ZXJlZF9yZWdpb24pLAotCQlTVUJURVNU KGlndF9tb2NrX21heF9zZWdtZW50KSwKIAl9OwogCXN0cnVjdCBpbnRlbF9tZW1vcnlfcmVnaW9u ICptZW07CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTU7CmRpZmYgLS1naXQgYS9kcml2 ZXJzL2dwdS9kcm0vaTkxNS9zZWxmdGVzdHMvbW9ja19yZWdpb24uYyBiL2RyaXZlcnMvZ3B1L2Ry bS9pOTE1L3NlbGZ0ZXN0cy9tb2NrX3JlZ2lvbi5jCmluZGV4IDVkMmQwMTBhMWUyMi4uZDYxMzg3 ZmRhOTQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9zZWxmdGVzdHMvbW9ja19y ZWdpb24uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9zZWxmdGVzdHMvbW9ja19yZWdpb24u YwpAQCAtMSwxNyArMSw1NCBAQAogLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVAogLyoK LSAqIENvcHlyaWdodCDCqSAyMDE5IEludGVsIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgwqkg MjAxOS0yMDIxIEludGVsIENvcnBvcmF0aW9uCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L3NjYXR0 ZXJsaXN0Lmg+CisKICNpbmNsdWRlICJnZW0vaTkxNV9nZW1fcmVnaW9uLmgiCiAjaW5jbHVkZSAi aW50ZWxfbWVtb3J5X3JlZ2lvbi5oIgorI2luY2x1ZGUgImludGVsX3JlZ2lvbl90dG0uaCIKIAog I2luY2x1ZGUgIm1vY2tfcmVnaW9uLmgiCiAKK3N0YXRpYyB2b2lkIG1vY2tfcmVnaW9uX3B1dF9w YWdlcyhzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLAorCQkJCSAgc3RydWN0IHNnX3Rh YmxlICpwYWdlcykKK3sKKwlpbnRlbF9yZWdpb25fdHRtX25vZGVfZnJlZShvYmotPm1tLnJlZ2lv biwgb2JqLT5tbS5zdF9tbV9ub2RlKTsKKwlzZ19mcmVlX3RhYmxlKHBhZ2VzKTsKKwlrZnJlZShw YWdlcyk7Cit9CisKK3N0YXRpYyBpbnQgbW9ja19yZWdpb25fZ2V0X3BhZ2VzKHN0cnVjdCBkcm1f aTkxNV9nZW1fb2JqZWN0ICpvYmopCit7CisJdW5zaWduZWQgaW50IGZsYWdzOworCXN0cnVjdCBz Z190YWJsZSAqcGFnZXM7CisKKwlmbGFncyA9IEk5MTVfQUxMT0NfTUlOX1BBR0VfU0laRTsKKwlp ZiAob2JqLT5mbGFncyAmIEk5MTVfQk9fQUxMT0NfQ09OVElHVU9VUykKKwkJZmxhZ3MgfD0gSTkx NV9BTExPQ19DT05USUdVT1VTOworCisJb2JqLT5tbS5zdF9tbV9ub2RlID0gaW50ZWxfcmVnaW9u X3R0bV9ub2RlX2FsbG9jKG9iai0+bW0ucmVnaW9uLAorCQkJCQkJCSBvYmotPmJhc2Uuc2l6ZSwK KwkJCQkJCQkgZmxhZ3MpOworCWlmIChJU19FUlIob2JqLT5tbS5zdF9tbV9ub2RlKSkKKwkJcmV0 dXJuIFBUUl9FUlIob2JqLT5tbS5zdF9tbV9ub2RlKTsKKworCXBhZ2VzID0gaW50ZWxfcmVnaW9u X3R0bV9ub2RlX3RvX3N0KG9iai0+bW0ucmVnaW9uLCBvYmotPm1tLnN0X21tX25vZGUpOworCWlm IChJU19FUlIocGFnZXMpKSB7CisJCWludGVsX3JlZ2lvbl90dG1fbm9kZV9mcmVlKG9iai0+bW0u cmVnaW9uLCBvYmotPm1tLnN0X21tX25vZGUpOworCQlyZXR1cm4gUFRSX0VSUihwYWdlcyk7CisJ fQorCisJX19pOTE1X2dlbV9vYmplY3Rfc2V0X3BhZ2VzKG9iaiwgcGFnZXMsIGk5MTVfc2dfZG1h X3NpemVzKHBhZ2VzLT5zZ2wpKTsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgY29uc3Qgc3Ry dWN0IGRybV9pOTE1X2dlbV9vYmplY3Rfb3BzIG1vY2tfcmVnaW9uX29ial9vcHMgPSB7CiAJLm5h bWUgPSAibW9jay1yZWdpb24iLAotCS5nZXRfcGFnZXMgPSBpOTE1X2dlbV9vYmplY3RfZ2V0X3Bh Z2VzX2J1ZGR5LAotCS5wdXRfcGFnZXMgPSBpOTE1X2dlbV9vYmplY3RfcHV0X3BhZ2VzX2J1ZGR5 LAorCS5nZXRfcGFnZXMgPSBtb2NrX3JlZ2lvbl9nZXRfcGFnZXMsCisJLnB1dF9wYWdlcyA9IG1v Y2tfcmVnaW9uX3B1dF9wYWdlcywKIAkucmVsZWFzZSA9IGk5MTVfZ2VtX29iamVjdF9yZWxlYXNl X21lbW9yeV9yZWdpb24sCiB9OwogCkBAIC0yMyw3ICs2MCw3IEBAIHN0YXRpYyBpbnQgbW9ja19v YmplY3RfaW5pdChzdHJ1Y3QgaW50ZWxfbWVtb3J5X3JlZ2lvbiAqbWVtLAogCXN0YXRpYyBzdHJ1 Y3QgbG9ja19jbGFzc19rZXkgbG9ja19jbGFzczsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAq aTkxNSA9IG1lbS0+aTkxNTsKIAotCWlmIChzaXplID4gbWVtLT5tbS5zaXplKQorCWlmIChzaXpl ID4gcmVzb3VyY2Vfc2l6ZSgmbWVtLT5yZWdpb24pKQogCQlyZXR1cm4gLUUyQklHOwogCiAJZHJt X2dlbV9wcml2YXRlX29iamVjdF9pbml0KCZpOTE1LT5kcm0sICZvYmotPmJhc2UsIHNpemUpOwpA QCAtMzksOCArNzYsOCBAQCBzdGF0aWMgaW50IG1vY2tfb2JqZWN0X2luaXQoc3RydWN0IGludGVs X21lbW9yeV9yZWdpb24gKm1lbSwKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpbnRlbF9tZW1v cnlfcmVnaW9uX29wcyBtb2NrX3JlZ2lvbl9vcHMgPSB7Ci0JLmluaXQgPSBpbnRlbF9tZW1vcnlf cmVnaW9uX2luaXRfYnVkZHksCi0JLnJlbGVhc2UgPSBpbnRlbF9tZW1vcnlfcmVnaW9uX3JlbGVh c2VfYnVkZHksCisJLmluaXQgPSBpbnRlbF9yZWdpb25fdHRtX2luaXRfbW9jaywKKwkucmVsZWFz ZSA9IGludGVsX3JlZ2lvbl90dG1fZmluaV9tb2NrLAogCS5pbml0X29iamVjdCA9IG1vY2tfb2Jq ZWN0X2luaXQsCiB9OwogCkBAIC01Miw1ICs4OSw2IEBAIG1vY2tfcmVnaW9uX2NyZWF0ZShzdHJ1 Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSwKIAkJICAgcmVzb3VyY2Vfc2l6ZV90IGlvX3N0YXJ0 KQogewogCXJldHVybiBpbnRlbF9tZW1vcnlfcmVnaW9uX2NyZWF0ZShpOTE1LCBzdGFydCwgc2l6 ZSwgbWluX3BhZ2Vfc2l6ZSwKLQkJCQkJICBpb19zdGFydCwgJm1vY2tfcmVnaW9uX29wcyk7CisJ CQkJCSAgaW9fc3RhcnQsIElOVEVMX01FTU9SWV9NT0NLLCAwLAorCQkJCQkgICZtb2NrX3JlZ2lv bl9vcHMpOwogfQotLSAKMi4zMS4xCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fXwpJbnRlbC1nZnggbWFpbGluZyBsaXN0CkludGVsLWdmeEBsaXN0cy5mcmVl ZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5m by9pbnRlbC1nZngK