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=-15.3 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,NICE_REPLY_A,SPF_HELO_NONE,SPF_PASS,USER_AGENT_SANE_1 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 76107C47082 for ; Wed, 26 May 2021 17:41:02 +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 2DA2C613B5 for ; Wed, 26 May 2021 17:41:02 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 2DA2C613B5 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 EA8426E42F; Wed, 26 May 2021 17:41:00 +0000 (UTC) Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by gabe.freedesktop.org (Postfix) with ESMTPS id 5A3686E42F; Wed, 26 May 2021 17:41:00 +0000 (UTC) IronPort-SDR: nf1VGfoqJLmeSwOxQDv0NW5Xa6QhGogyUFSBQVQ4shLyqNIVPsEoMeoTBN/mpAWvNXG6MnsQ3g oQ0e455BGEwA== X-IronPort-AV: E=McAfee;i="6200,9189,9996"; a="223715535" X-IronPort-AV: E=Sophos;i="5.82,331,1613462400"; d="scan'208";a="223715535" Received: from orsmga001.jf.intel.com ([10.7.209.18]) by fmsmga101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 26 May 2021 10:40:59 -0700 IronPort-SDR: bEMoRt9BEHMZg89Pi+SKSs4htJH87Eyp58b3jChaFkcz2ft4PZkfIOyCZtvMhiN3FQhqwhuc5C OrCoYCiwXFcg== X-IronPort-AV: E=Sophos;i="5.82,331,1613462400"; d="scan'208";a="477051785" Received: from pegilssx-mobl.ger.corp.intel.com (HELO [10.249.254.205]) ([10.249.254.205]) by orsmga001-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 26 May 2021 10:40:57 -0700 Subject: Re: [PATCH v4 15/15] drm/i915: Use ttm mmap handling for ttm bo's. From: =?UTF-8?Q?Thomas_Hellstr=c3=b6m?= To: intel-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org, Maarten Lankhorst References: <20210526113259.1661914-1-thomas.hellstrom@linux.intel.com> <20210526113259.1661914-16-thomas.hellstrom@linux.intel.com> Message-ID: <75e1d09a-95f6-6de0-7fee-4a11cf383ce5@linux.intel.com> Date: Wed, 26 May 2021 19:40:55 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.10.1 MIME-Version: 1.0 In-Reply-To: <20210526113259.1661914-16-thomas.hellstrom@linux.intel.com> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit Content-Language: en-US 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: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" On 5/26/21 1:32 PM, Thomas Hellström wrote: > From: Maarten Lankhorst > > Use the ttm handlers for servicing page faults, and vm_access. > > We do our own validation of read-only access, otherwise use the > ttm handlers as much as possible. > > Because the ttm handlers expect the vma_node at vma->base, we slightly > need to massage the mmap handlers to look at vma_node->driver_private > to fetch the bo, if it's NULL, we assume i915's normal mmap_offset uapi > is used. > > This is the easiest way to achieve compatibility without changing ttm's > semantics. > > Signed-off-by: Maarten Lankhorst > --- > drivers/gpu/drm/i915/gem/i915_gem_mman.c | 78 +++++++---- > drivers/gpu/drm/i915/gem/i915_gem_object.h | 6 +- > .../gpu/drm/i915/gem/i915_gem_object_types.h | 3 + > drivers/gpu/drm/i915/gem/i915_gem_pages.c | 3 +- > drivers/gpu/drm/i915/gem/i915_gem_ttm.c | 122 +++++++++++++++++- > .../drm/i915/gem/selftests/i915_gem_mman.c | 90 +++++++------ > drivers/gpu/drm/i915/selftests/igt_mmap.c | 25 +++- > drivers/gpu/drm/i915/selftests/igt_mmap.h | 12 +- > 8 files changed, 247 insertions(+), 92 deletions(-) There are a couple of checkpatch.pl --strict warnings/checks with this patch. > > diff --git a/drivers/gpu/drm/i915/gem/i915_gem_mman.c b/drivers/gpu/drm/i915/gem/i915_gem_mman.c > index fd1c9714f8d8..af04ea593091 100644 > --- a/drivers/gpu/drm/i915/gem/i915_gem_mman.c > +++ b/drivers/gpu/drm/i915/gem/i915_gem_mman.c > @@ -19,6 +19,7 @@ > #include "i915_gem_mman.h" > #include "i915_trace.h" > #include "i915_user_extensions.h" > +#include "i915_gem_ttm.h" > #include "i915_vma.h" > > static inline bool > @@ -622,6 +623,8 @@ mmap_offset_attach(struct drm_i915_gem_object *obj, > struct i915_mmap_offset *mmo; > int err; > > + GEM_BUG_ON(obj->ops->mmap_offset || obj->ops->mmap_ops); > + > mmo = lookup_mmo(obj, mmap_type); > if (mmo) > goto out; > @@ -664,40 +667,47 @@ mmap_offset_attach(struct drm_i915_gem_object *obj, > } > > static int > -__assign_mmap_offset(struct drm_file *file, > - u32 handle, > +__assign_mmap_offset(struct drm_i915_gem_object *obj, > enum i915_mmap_type mmap_type, > - u64 *offset) > + u64 *offset, struct drm_file *file) > { > - struct drm_i915_gem_object *obj; > struct i915_mmap_offset *mmo; > - int err; > > - obj = i915_gem_object_lookup(file, handle); > - if (!obj) > - return -ENOENT; > + if (i915_gem_object_never_mmap(obj)) > + return -ENODEV; > > - if (i915_gem_object_never_mmap(obj)) { > - err = -ENODEV; > - goto out; > + if (obj->ops->mmap_offset) { > + *offset = obj->ops->mmap_offset(obj); > + return 0; > } > > if (mmap_type != I915_MMAP_TYPE_GTT && > !i915_gem_object_has_struct_page(obj) && > - !i915_gem_object_type_has(obj, I915_GEM_OBJECT_HAS_IOMEM)) { > - err = -ENODEV; > - goto out; > - } > + !i915_gem_object_type_has(obj, I915_GEM_OBJECT_HAS_IOMEM)) > + return -ENODEV; > > mmo = mmap_offset_attach(obj, mmap_type, file); > - if (IS_ERR(mmo)) { > - err = PTR_ERR(mmo); > - goto out; > - } > + if (IS_ERR(mmo)) > + return PTR_ERR(mmo); > > *offset = drm_vma_node_offset_addr(&mmo->vma_node); > - err = 0; > -out: > + return 0; > +} > + > +static int > +__assign_mmap_offset_handle(struct drm_file *file, > + u32 handle, > + enum i915_mmap_type mmap_type, > + u64 *offset) > +{ > + struct drm_i915_gem_object *obj; > + int err; > + > + obj = i915_gem_object_lookup(file, handle); > + if (!obj) > + return -ENOENT; > + > + err = __assign_mmap_offset(obj, mmap_type, offset, file); > i915_gem_object_put(obj); > return err; > } > @@ -717,7 +727,7 @@ i915_gem_dumb_mmap_offset(struct drm_file *file, > else > mmap_type = I915_MMAP_TYPE_GTT; > > - return __assign_mmap_offset(file, handle, mmap_type, offset); > + return __assign_mmap_offset_handle(file, handle, mmap_type, offset); > } > > /** > @@ -785,7 +795,7 @@ i915_gem_mmap_offset_ioctl(struct drm_device *dev, void *data, > return -EINVAL; > } > > - return __assign_mmap_offset(file, args->handle, type, &args->offset); > + return __assign_mmap_offset_handle(file, args->handle, type, &args->offset); > } > > static void vm_open(struct vm_area_struct *vma) > @@ -889,8 +899,16 @@ int i915_gem_mmap(struct file *filp, struct vm_area_struct *vma) > * destroyed and will be invalid when the vma manager lock > * is released. > */ > - mmo = container_of(node, struct i915_mmap_offset, vma_node); > - obj = i915_gem_object_get_rcu(mmo->obj); > + if (!node->driver_private) { > + mmo = container_of(node, struct i915_mmap_offset, vma_node); > + obj = i915_gem_object_get_rcu(mmo->obj); > + > + GEM_BUG_ON(obj && obj->ops->mmap_ops); > + } else { > + obj = i915_gem_object_get_rcu(container_of(node, struct drm_i915_gem_object, base.vma_node)); > + > + GEM_BUG_ON(obj && !obj->ops->mmap_ops); > + } > } > drm_vma_offset_unlock_lookup(dev->vma_offset_manager); > rcu_read_unlock(); > @@ -912,7 +930,6 @@ int i915_gem_mmap(struct file *filp, struct vm_area_struct *vma) > } > > vma->vm_flags |= VM_PFNMAP | VM_DONTEXPAND | VM_DONTDUMP; > - vma->vm_private_data = mmo; > > /* > * We keep the ref on mmo->obj, not vm_file, but we require > @@ -926,6 +943,15 @@ int i915_gem_mmap(struct file *filp, struct vm_area_struct *vma) > /* Drop the initial creation reference, the vma is now holding one. */ > fput(anon); > > + if (obj->ops->mmap_ops) { > + vma->vm_page_prot = pgprot_decrypted(vm_get_page_prot(vma->vm_flags)); > + vma->vm_ops = obj->ops->mmap_ops; > + vma->vm_private_data = node->driver_private; > + return 0; > + } > + > + vma->vm_private_data = mmo; > + > switch (mmo->mmap_type) { > case I915_MMAP_TYPE_WC: > vma->vm_page_prot = > diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object.h b/drivers/gpu/drm/i915/gem/i915_gem_object.h > index a3ad8cf4eefd..ff59e6c640e6 100644 > --- a/drivers/gpu/drm/i915/gem/i915_gem_object.h > +++ b/drivers/gpu/drm/i915/gem/i915_gem_object.h > @@ -342,14 +342,14 @@ struct scatterlist * > __i915_gem_object_get_sg(struct drm_i915_gem_object *obj, > struct i915_gem_object_page_iter *iter, > unsigned int n, > - unsigned int *offset, bool allow_alloc); > + unsigned int *offset, bool allow_alloc, bool dma); > > static inline struct scatterlist * > i915_gem_object_get_sg(struct drm_i915_gem_object *obj, > unsigned int n, > unsigned int *offset, bool allow_alloc) > { > - return __i915_gem_object_get_sg(obj, &obj->mm.get_page, n, offset, allow_alloc); > + return __i915_gem_object_get_sg(obj, &obj->mm.get_page, n, offset, allow_alloc, false); > } > > static inline struct scatterlist * > @@ -357,7 +357,7 @@ i915_gem_object_get_sg_dma(struct drm_i915_gem_object *obj, > unsigned int n, > unsigned int *offset, bool allow_alloc) > { > - return __i915_gem_object_get_sg(obj, &obj->mm.get_dma_page, n, offset, allow_alloc); > + return __i915_gem_object_get_sg(obj, &obj->mm.get_dma_page, n, offset, allow_alloc, true); > } > > struct page * > 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 68313474e6a6..2a23b77424b3 100644 > --- a/drivers/gpu/drm/i915/gem/i915_gem_object_types.h > +++ b/drivers/gpu/drm/i915/gem/i915_gem_object_types.h > @@ -61,6 +61,7 @@ struct drm_i915_gem_object_ops { > const struct drm_i915_gem_pread *arg); > int (*pwrite)(struct drm_i915_gem_object *obj, > const struct drm_i915_gem_pwrite *arg); > + u64 (*mmap_offset)(struct drm_i915_gem_object *obj); > > int (*dmabuf_export)(struct drm_i915_gem_object *obj); > > @@ -79,6 +80,7 @@ struct drm_i915_gem_object_ops { > void (*delayed_free)(struct drm_i915_gem_object *obj); > void (*release)(struct drm_i915_gem_object *obj); > > + const struct vm_operations_struct *mmap_ops; > const char *name; /* friendly name for debug, e.g. lockdep classes */ > }; > > @@ -328,6 +330,7 @@ struct drm_i915_gem_object { > > struct { > struct sg_table *cached_io_st; > + struct i915_gem_object_page_iter get_io_page; > bool created:1; > } ttm; > > diff --git a/drivers/gpu/drm/i915/gem/i915_gem_pages.c b/drivers/gpu/drm/i915/gem/i915_gem_pages.c > index 6444e097016d..086005c1c7ea 100644 > --- a/drivers/gpu/drm/i915/gem/i915_gem_pages.c > +++ b/drivers/gpu/drm/i915/gem/i915_gem_pages.c > @@ -467,9 +467,8 @@ __i915_gem_object_get_sg(struct drm_i915_gem_object *obj, > struct i915_gem_object_page_iter *iter, > unsigned int n, > unsigned int *offset, > - bool allow_alloc) > + bool allow_alloc, bool dma) > { > - const bool dma = iter == &obj->mm.get_dma_page; > struct scatterlist *sg; > unsigned int idx, count; > > diff --git a/drivers/gpu/drm/i915/gem/i915_gem_ttm.c b/drivers/gpu/drm/i915/gem/i915_gem_ttm.c > index 17598930a99e..d0be957326e0 100644 > --- a/drivers/gpu/drm/i915/gem/i915_gem_ttm.c > +++ b/drivers/gpu/drm/i915/gem/i915_gem_ttm.c > @@ -13,6 +13,7 @@ > #include "gem/i915_gem_object.h" > #include "gem/i915_gem_region.h" > #include "gem/i915_gem_ttm.h" > +#include "gem/i915_gem_mman.h" > > #define I915_PL_LMEM0 TTM_PL_PRIV > #define I915_PL_SYSTEM TTM_PL_SYSTEM > @@ -158,11 +159,20 @@ static int i915_ttm_move_notify(struct ttm_buffer_object *bo) > > static void i915_ttm_free_cached_io_st(struct drm_i915_gem_object *obj) > { > - if (obj->ttm.cached_io_st) { > - sg_free_table(obj->ttm.cached_io_st); > - kfree(obj->ttm.cached_io_st); > - obj->ttm.cached_io_st = NULL; > - } > + struct radix_tree_iter iter; > + void __rcu **slot; > + > + if (!obj->ttm.cached_io_st) > + return; > + > + rcu_read_lock(); > + radix_tree_for_each_slot(slot, &obj->ttm.get_io_page.radix, &iter, 0) > + radix_tree_delete(&obj->ttm.get_io_page.radix, iter.index); > + rcu_read_unlock(); > + > + sg_free_table(obj->ttm.cached_io_st); > + kfree(obj->ttm.cached_io_st); > + obj->ttm.cached_io_st = NULL; > } > > static void i915_ttm_purge(struct drm_i915_gem_object *obj) > @@ -338,12 +348,42 @@ static int i915_ttm_move(struct ttm_buffer_object *bo, bool evict, > ttm_bo_move_sync_cleanup(bo, dst_mem); > i915_ttm_free_cached_io_st(obj); > > - if (!dst_man->use_tt) > + if (!dst_man->use_tt) { > obj->ttm.cached_io_st = dst_st; > + obj->ttm.get_io_page.sg_pos = dst_st->sgl; > + obj->ttm.get_io_page.sg_idx = 0; > + } > > return 0; > } > > +static int i915_ttm_io_mem_reserve(struct ttm_device *bdev, struct ttm_resource *mem) > +{ > + if (mem->mem_type < I915_PL_LMEM0) > + return 0; > + > + /* We may need to revisit this later, but this allows all caching to be used in mmap */ > + mem->bus.caching = ttm_cached; Since we're now using the TTM bo offsets, we might as well just make this ttm_write_combined now. > + mem->bus.is_iomem = true; > + > + return 0; > +} > + > +static unsigned long i915_ttm_io_mem_pfn(struct ttm_buffer_object *bo, > + unsigned long page_offset) > +{ > + struct drm_i915_gem_object *obj = i915_ttm_to_gem(bo); > + unsigned long base = obj->mm.region->iomap.base - obj->mm.region->region.start; > + struct scatterlist *sg; > + unsigned int ofs; > + > + GEM_WARN_ON(bo->ttm); > + > + sg = __i915_gem_object_get_sg(obj, &obj->ttm.get_io_page, page_offset, &ofs, true, true); > + > + return ((base + sg_dma_address(sg)) >> PAGE_SHIFT) + ofs; > +} > + > static struct ttm_device_funcs i915_ttm_bo_driver = { > .ttm_tt_create = i915_ttm_tt_create, > .ttm_tt_unpopulate = i915_ttm_tt_unpopulate, > @@ -354,6 +394,8 @@ static struct ttm_device_funcs i915_ttm_bo_driver = { > .verify_access = NULL, > .swap_notify = i915_ttm_swap_notify, > .delete_mem_notify = i915_ttm_delete_mem_notify, > + .io_mem_reserve = i915_ttm_io_mem_reserve, > + .io_mem_pfn = i915_ttm_io_mem_pfn, > }; > > /** > @@ -461,7 +503,68 @@ static void i915_ttm_delayed_free(struct drm_i915_gem_object *obj) > } > } > > -static const struct drm_i915_gem_object_ops i915_gem_ttm_obj_ops = { > +static vm_fault_t vm_fault_ttm(struct vm_fault *vmf) > +{ > + struct vm_area_struct *area = vmf->vma; > + struct drm_i915_gem_object *obj = > + i915_ttm_to_gem(area->vm_private_data); > + > + /* Sanity check that we allow writing into this object */ > + if (unlikely(i915_gem_object_is_readonly(obj) && > + area->vm_flags & VM_WRITE)) > + return VM_FAULT_SIGBUS; > + > + return ttm_bo_vm_fault(vmf); > +} > + > +static int > +vm_access_ttm(struct vm_area_struct *area, unsigned long addr, > + void *buf, int len, int write) > +{ > + struct drm_i915_gem_object *obj = > + i915_ttm_to_gem(area->vm_private_data); > + > + if (i915_gem_object_is_readonly(obj) && write) > + return -EACCES; > + > + return ttm_bo_vm_access(area, addr, buf, len, write); > +} > + > +static void ttm_vm_open(struct vm_area_struct *vma) > +{ > + struct drm_i915_gem_object *obj = > + i915_ttm_to_gem(vma->vm_private_data); > + > + GEM_BUG_ON(!obj); > + i915_gem_object_get(obj); > +} > + > +static void ttm_vm_close(struct vm_area_struct *vma) > +{ > + struct drm_i915_gem_object *obj = > + i915_ttm_to_gem(vma->vm_private_data); > + > + GEM_BUG_ON(!obj); > + i915_gem_object_put(obj); > +} > + > + > +static const struct vm_operations_struct vm_ops_ttm = { > + .fault = vm_fault_ttm, > + .access = vm_access_ttm, > + .open = ttm_vm_open, > + .close = ttm_vm_close, > +}; > + > +static u64 i915_ttm_mmap_offset(struct drm_i915_gem_object *obj) > +{ > + /* The ttm_bo must be allocated with I915_BO_ALLOC_USER */ > + GEM_BUG_ON(!drm_mm_node_allocated(&obj->base.vma_node.vm_node)); > + > + return drm_vma_node_offset_addr(&obj->base.vma_node); > +} > + > +const struct drm_i915_gem_object_ops i915_gem_ttm_obj_ops = { > .name = "i915_gem_object_ttm", > .flags = I915_GEM_OBJECT_HAS_IOMEM, > > @@ -470,6 +573,8 @@ static const struct drm_i915_gem_object_ops i915_gem_ttm_obj_ops = { > .truncate = i915_ttm_purge, > .adjust_lru = i915_ttm_adjust_lru, > .delayed_free = i915_ttm_delayed_free, > + .mmap_offset = i915_ttm_mmap_offset, > + .mmap_ops = &vm_ops_ttm, > }; > > void i915_ttm_bo_destroy(struct ttm_buffer_object *bo) Put a mutex_destroy(&obj->ttm.get_io_page.lock) here? > @@ -518,6 +623,8 @@ int __i915_gem_ttm_object_init(struct intel_memory_region *mem, > i915_gem_object_make_unshrinkable(obj); > obj->read_domains = I915_GEM_DOMAIN_WC | I915_GEM_DOMAIN_GTT; > i915_gem_object_set_cache_coherency(obj, I915_CACHE_NONE); > + INIT_RADIX_TREE(&obj->ttm.get_io_page.radix, GFP_KERNEL | __GFP_NOWARN); > + mutex_init(&obj->ttm.get_io_page.lock); > > bo_type = (obj->flags & I915_BO_ALLOC_USER) ? ttm_bo_type_device : > ttm_bo_type_kernel; > @@ -529,6 +636,7 @@ int __i915_gem_ttm_object_init(struct intel_memory_region *mem, > * Similarly, in delayed_destroy, we can't call ttm_bo_put() > * until successful initialization. > */ > + obj->base.vma_node.driver_private = i915_gem_to_ttm(obj); > ret = ttm_bo_init(&i915->bdev, i915_gem_to_ttm(obj), size, > bo_type, &i915_sys_placement, alignment, > true, NULL, NULL, i915_ttm_bo_destroy); > diff --git a/drivers/gpu/drm/i915/gem/selftests/i915_gem_mman.c b/drivers/gpu/drm/i915/gem/selftests/i915_gem_mman.c > index 05a3b29f545e..ca69a29b7f2a 100644 > --- a/drivers/gpu/drm/i915/gem/selftests/i915_gem_mman.c > +++ b/drivers/gpu/drm/i915/gem/selftests/i915_gem_mman.c > @@ -578,16 +578,17 @@ static bool assert_mmap_offset(struct drm_i915_private *i915, > int expected) > { > struct drm_i915_gem_object *obj; > - struct i915_mmap_offset *mmo; > + u64 offset; > + int ret; > > obj = i915_gem_object_create_internal(i915, size); > if (IS_ERR(obj)) > - return false; > + return expected && expected == PTR_ERR(obj); > > - mmo = mmap_offset_attach(obj, I915_MMAP_OFFSET_GTT, NULL); > + ret = __assign_mmap_offset(obj, I915_MMAP_TYPE_GTT, &offset, NULL); > i915_gem_object_put(obj); > > - return PTR_ERR_OR_ZERO(mmo) == expected; > + return ret == expected; > } > > static void disable_retire_worker(struct drm_i915_private *i915) > @@ -622,8 +623,8 @@ static int igt_mmap_offset_exhaustion(void *arg) > struct drm_mm *mm = &i915->drm.vma_offset_manager->vm_addr_space_mm; > struct drm_i915_gem_object *obj; > struct drm_mm_node *hole, *next; > - struct i915_mmap_offset *mmo; > int loop, err = 0; > + u64 offset; > > /* Disable background reaper */ > disable_retire_worker(i915); > @@ -684,13 +685,13 @@ static int igt_mmap_offset_exhaustion(void *arg) > obj = i915_gem_object_create_internal(i915, PAGE_SIZE); > if (IS_ERR(obj)) { > err = PTR_ERR(obj); > + pr_err("Unable to create object for reclaimed hole\n"); > goto out; > } > > - mmo = mmap_offset_attach(obj, I915_MMAP_OFFSET_GTT, NULL); > - if (IS_ERR(mmo)) { > + err = __assign_mmap_offset(obj, I915_MMAP_TYPE_GTT, &offset, NULL); > + if (err) { > pr_err("Unable to insert object into reclaimed hole\n"); > - err = PTR_ERR(mmo); > goto err_obj; > } > > @@ -865,10 +866,10 @@ static int __igt_mmap(struct drm_i915_private *i915, > struct drm_i915_gem_object *obj, > enum i915_mmap_type type) > { > - struct i915_mmap_offset *mmo; > struct vm_area_struct *area; > unsigned long addr; > int err, i; > + u64 offset; > > if (!can_mmap(obj, type)) > return 0; > @@ -879,11 +880,11 @@ static int __igt_mmap(struct drm_i915_private *i915, > if (err) > return err; > > - mmo = mmap_offset_attach(obj, type, NULL); > - if (IS_ERR(mmo)) > - return PTR_ERR(mmo); > + err = __assign_mmap_offset(obj, type, &offset, NULL); > + if (err) > + return err; > > - addr = igt_mmap_node(i915, &mmo->vma_node, 0, PROT_WRITE, MAP_SHARED); > + addr = igt_mmap_offset(i915, offset, obj->base.size, PROT_WRITE, MAP_SHARED); > if (IS_ERR_VALUE(addr)) > return addr; > > @@ -897,13 +898,6 @@ static int __igt_mmap(struct drm_i915_private *i915, > goto out_unmap; > } > > - if (area->vm_private_data != mmo) { > - pr_err("%s: vm_area_struct did not point back to our mmap_offset object!\n", > - obj->mm.region->name); > - err = -EINVAL; > - goto out_unmap; > - } > - > for (i = 0; i < obj->base.size / sizeof(u32); i++) { > u32 __user *ux = u64_to_user_ptr((u64)(addr + i * sizeof(*ux))); > u32 x; > @@ -961,7 +955,7 @@ static int igt_mmap(void *arg) > struct drm_i915_gem_object *obj; > int err; > > - obj = i915_gem_object_create_region(mr, sizes[i], 0); > + obj = i915_gem_object_create_region(mr, sizes[i], I915_BO_ALLOC_USER); > if (obj == ERR_PTR(-ENODEV)) > continue; > > @@ -1004,12 +998,12 @@ static int __igt_mmap_access(struct drm_i915_private *i915, > struct drm_i915_gem_object *obj, > enum i915_mmap_type type) > { > - struct i915_mmap_offset *mmo; > unsigned long __user *ptr; > unsigned long A, B; > unsigned long x, y; > unsigned long addr; > int err; > + u64 offset; > > memset(&A, 0xAA, sizeof(A)); > memset(&B, 0xBB, sizeof(B)); > @@ -1017,11 +1011,11 @@ static int __igt_mmap_access(struct drm_i915_private *i915, > if (!can_mmap(obj, type) || !can_access(obj)) > return 0; > > - mmo = mmap_offset_attach(obj, type, NULL); > - if (IS_ERR(mmo)) > - return PTR_ERR(mmo); > + err = __assign_mmap_offset(obj, type, &offset, NULL); > + if (err) > + return err; > > - addr = igt_mmap_node(i915, &mmo->vma_node, 0, PROT_WRITE, MAP_SHARED); > + addr = igt_mmap_offset(i915, offset, obj->base.size, PROT_WRITE, MAP_SHARED); > if (IS_ERR_VALUE(addr)) > return addr; > ptr = (unsigned long __user *)addr; > @@ -1081,7 +1075,7 @@ static int igt_mmap_access(void *arg) > struct drm_i915_gem_object *obj; > int err; > > - obj = i915_gem_object_create_region(mr, PAGE_SIZE, 0); > + obj = i915_gem_object_create_region(mr, PAGE_SIZE, I915_BO_ALLOC_USER); > if (obj == ERR_PTR(-ENODEV)) > continue; > > @@ -1111,11 +1105,11 @@ static int __igt_mmap_gpu(struct drm_i915_private *i915, > enum i915_mmap_type type) > { > struct intel_engine_cs *engine; > - struct i915_mmap_offset *mmo; > unsigned long addr; > u32 __user *ux; > u32 bbe; > int err; > + u64 offset; > > /* > * Verify that the mmap access into the backing store aligns with > @@ -1132,11 +1126,11 @@ static int __igt_mmap_gpu(struct drm_i915_private *i915, > if (err) > return err; > > - mmo = mmap_offset_attach(obj, type, NULL); > - if (IS_ERR(mmo)) > - return PTR_ERR(mmo); > + err = __assign_mmap_offset(obj, type, &offset, NULL); > + if (err) > + return err; > > - addr = igt_mmap_node(i915, &mmo->vma_node, 0, PROT_WRITE, MAP_SHARED); > + addr = igt_mmap_offset(i915, offset, obj->base.size, PROT_WRITE, MAP_SHARED); > if (IS_ERR_VALUE(addr)) > return addr; > > @@ -1226,7 +1220,7 @@ static int igt_mmap_gpu(void *arg) > struct drm_i915_gem_object *obj; > int err; > > - obj = i915_gem_object_create_region(mr, PAGE_SIZE, 0); > + obj = i915_gem_object_create_region(mr, PAGE_SIZE, I915_BO_ALLOC_USER); > if (obj == ERR_PTR(-ENODEV)) > continue; > > @@ -1303,18 +1297,18 @@ static int __igt_mmap_revoke(struct drm_i915_private *i915, > struct drm_i915_gem_object *obj, > enum i915_mmap_type type) > { > - struct i915_mmap_offset *mmo; > unsigned long addr; > int err; > + u64 offset; > > if (!can_mmap(obj, type)) > return 0; > > - mmo = mmap_offset_attach(obj, type, NULL); > - if (IS_ERR(mmo)) > - return PTR_ERR(mmo); > + err = __assign_mmap_offset(obj, type, &offset, NULL); > + if (err) > + return err; > > - addr = igt_mmap_node(i915, &mmo->vma_node, 0, PROT_WRITE, MAP_SHARED); > + addr = igt_mmap_offset(i915, offset, obj->base.size, PROT_WRITE, MAP_SHARED); > if (IS_ERR_VALUE(addr)) > return addr; > > @@ -1350,10 +1344,20 @@ static int __igt_mmap_revoke(struct drm_i915_private *i915, > } > } > > - err = check_absent(addr, obj->base.size); > - if (err) { > - pr_err("%s: was not absent\n", obj->mm.region->name); > - goto out_unmap; > + if (!obj->ops->mmap_ops) { > + err = check_absent(addr, obj->base.size); > + if (err) { > + pr_err("%s: was not absent\n", obj->mm.region->name); > + goto out_unmap; > + } > + } else { > + /* ttm allows access to evicted regions by design */ > + > + err = check_present(addr, obj->base.size); > + if (err) { > + pr_err("%s: was not present\n", obj->mm.region->name); > + goto out_unmap; > + } > } > > out_unmap: > @@ -1371,7 +1375,7 @@ static int igt_mmap_revoke(void *arg) > struct drm_i915_gem_object *obj; > int err; > > - obj = i915_gem_object_create_region(mr, PAGE_SIZE, 0); > + obj = i915_gem_object_create_region(mr, PAGE_SIZE, I915_BO_ALLOC_USER); > if (obj == ERR_PTR(-ENODEV)) > continue; > > diff --git a/drivers/gpu/drm/i915/selftests/igt_mmap.c b/drivers/gpu/drm/i915/selftests/igt_mmap.c > index 583a4ff8b8c9..e8286c28de91 100644 > --- a/drivers/gpu/drm/i915/selftests/igt_mmap.c > +++ b/drivers/gpu/drm/i915/selftests/igt_mmap.c > @@ -9,15 +9,28 @@ > #include "i915_drv.h" > #include "igt_mmap.h" > > -unsigned long igt_mmap_node(struct drm_i915_private *i915, > - struct drm_vma_offset_node *node, > - unsigned long addr, > - unsigned long prot, > - unsigned long flags) > +unsigned long igt_mmap_offset(struct drm_i915_private *i915, > + u64 offset, > + unsigned long size, > + unsigned long prot, > + unsigned long flags) > { > + struct drm_vma_offset_node *node; > struct file *file; > + unsigned long addr; > int err; > > + /* no need to refcount, we own this object */ > + drm_vma_offset_lock_lookup(i915->drm.vma_offset_manager); > + node = drm_vma_offset_exact_lookup_locked(i915->drm.vma_offset_manager, > + offset / PAGE_SIZE, size / PAGE_SIZE); > + drm_vma_offset_unlock_lookup(i915->drm.vma_offset_manager); > + > + if (GEM_WARN_ON(!node)) { > + pr_info("Failed to lookup %Lx\n", offset); Checkpatch warning here iirc. > + return -ENOENT; > + } > + > /* Pretend to open("/dev/dri/card0") */ > file = mock_drm_getfile(i915->drm.primary, O_RDWR); > if (IS_ERR(file)) > @@ -29,7 +42,7 @@ unsigned long igt_mmap_node(struct drm_i915_private *i915, > goto out_file; > } > > - addr = vm_mmap(file, addr, drm_vma_node_size(node) << PAGE_SHIFT, > + addr = vm_mmap(file, 0, drm_vma_node_size(node) << PAGE_SHIFT, > prot, flags, drm_vma_node_offset_addr(node)); > > drm_vma_node_revoke(node, file->private_data); > diff --git a/drivers/gpu/drm/i915/selftests/igt_mmap.h b/drivers/gpu/drm/i915/selftests/igt_mmap.h > index 6e716cb59d7e..acbe34d81a6d 100644 > --- a/drivers/gpu/drm/i915/selftests/igt_mmap.h > +++ b/drivers/gpu/drm/i915/selftests/igt_mmap.h > @@ -7,13 +7,15 @@ > #ifndef IGT_MMAP_H > #define IGT_MMAP_H > > +#include > + > struct drm_i915_private; > struct drm_vma_offset_node; > > -unsigned long igt_mmap_node(struct drm_i915_private *i915, > - struct drm_vma_offset_node *node, > - unsigned long addr, > - unsigned long prot, > - unsigned long flags); > +unsigned long igt_mmap_offset(struct drm_i915_private *i915, > + u64 offset, > + unsigned long size, > + unsigned long prot, > + unsigned long flags); > > #endif /* IGT_MMAP_H */ /Thomas 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=-15.3 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,NICE_REPLY_A,SPF_HELO_NONE,SPF_PASS,USER_AGENT_SANE_1 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 5F572C47082 for ; Wed, 26 May 2021 17:41:07 +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 1C25A613C7 for ; Wed, 26 May 2021 17:41:07 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 1C25A613C7 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 36C8D6EC4D; Wed, 26 May 2021 17:41:01 +0000 (UTC) Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by gabe.freedesktop.org (Postfix) with ESMTPS id 5A3686E42F; Wed, 26 May 2021 17:41:00 +0000 (UTC) IronPort-SDR: nf1VGfoqJLmeSwOxQDv0NW5Xa6QhGogyUFSBQVQ4shLyqNIVPsEoMeoTBN/mpAWvNXG6MnsQ3g oQ0e455BGEwA== X-IronPort-AV: E=McAfee;i="6200,9189,9996"; a="223715535" X-IronPort-AV: E=Sophos;i="5.82,331,1613462400"; d="scan'208";a="223715535" Received: from orsmga001.jf.intel.com ([10.7.209.18]) by fmsmga101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 26 May 2021 10:40:59 -0700 IronPort-SDR: bEMoRt9BEHMZg89Pi+SKSs4htJH87Eyp58b3jChaFkcz2ft4PZkfIOyCZtvMhiN3FQhqwhuc5C OrCoYCiwXFcg== X-IronPort-AV: E=Sophos;i="5.82,331,1613462400"; d="scan'208";a="477051785" Received: from pegilssx-mobl.ger.corp.intel.com (HELO [10.249.254.205]) ([10.249.254.205]) by orsmga001-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 26 May 2021 10:40:57 -0700 From: =?UTF-8?Q?Thomas_Hellstr=c3=b6m?= To: intel-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org, Maarten Lankhorst References: <20210526113259.1661914-1-thomas.hellstrom@linux.intel.com> <20210526113259.1661914-16-thomas.hellstrom@linux.intel.com> Message-ID: <75e1d09a-95f6-6de0-7fee-4a11cf383ce5@linux.intel.com> Date: Wed, 26 May 2021 19:40:55 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.10.1 MIME-Version: 1.0 In-Reply-To: <20210526113259.1661914-16-thomas.hellstrom@linux.intel.com> Content-Language: en-US Subject: Re: [Intel-gfx] [PATCH v4 15/15] drm/i915: Use ttm mmap handling for ttm bo's. 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: , Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" Ck9uIDUvMjYvMjEgMTozMiBQTSwgVGhvbWFzIEhlbGxzdHLDtm0gd3JvdGU6Cj4gRnJvbTogTWFh cnRlbiBMYW5raG9yc3QgPG1hYXJ0ZW4ubGFua2hvcnN0QGxpbnV4LmludGVsLmNvbT4KPgo+IFVz ZSB0aGUgdHRtIGhhbmRsZXJzIGZvciBzZXJ2aWNpbmcgcGFnZSBmYXVsdHMsIGFuZCB2bV9hY2Nl c3MuCj4KPiBXZSBkbyBvdXIgb3duIHZhbGlkYXRpb24gb2YgcmVhZC1vbmx5IGFjY2Vzcywgb3Ro ZXJ3aXNlIHVzZSB0aGUKPiB0dG0gaGFuZGxlcnMgYXMgbXVjaCBhcyBwb3NzaWJsZS4KPgo+IEJl Y2F1c2UgdGhlIHR0bSBoYW5kbGVycyBleHBlY3QgdGhlIHZtYV9ub2RlIGF0IHZtYS0+YmFzZSwg d2Ugc2xpZ2h0bHkKPiBuZWVkIHRvIG1hc3NhZ2UgdGhlIG1tYXAgaGFuZGxlcnMgdG8gbG9vayBh dCB2bWFfbm9kZS0+ZHJpdmVyX3ByaXZhdGUKPiB0byBmZXRjaCB0aGUgYm8sIGlmIGl0J3MgTlVM TCwgd2UgYXNzdW1lIGk5MTUncyBub3JtYWwgbW1hcF9vZmZzZXQgdWFwaQo+IGlzIHVzZWQuCj4K PiBUaGlzIGlzIHRoZSBlYXNpZXN0IHdheSB0byBhY2hpZXZlIGNvbXBhdGliaWxpdHkgd2l0aG91 dCBjaGFuZ2luZyB0dG0ncwo+IHNlbWFudGljcy4KPgo+IFNpZ25lZC1vZmYtYnk6IE1hYXJ0ZW4g TGFua2hvcnN0IDxtYWFydGVuLmxhbmtob3JzdEBsaW51eC5pbnRlbC5jb20+Cj4gLS0tCj4gICBk cml2ZXJzL2dwdS9kcm0vaTkxNS9nZW0vaTkxNV9nZW1fbW1hbi5jICAgICAgfCAgNzggKysrKysr Ky0tLS0KPiAgIGRyaXZlcnMvZ3B1L2RybS9pOTE1L2dlbS9pOTE1X2dlbV9vYmplY3QuaCAgICB8 ICAgNiArLQo+ICAgLi4uL2dwdS9kcm0vaTkxNS9nZW0vaTkxNV9nZW1fb2JqZWN0X3R5cGVzLmgg IHwgICAzICsKPiAgIGRyaXZlcnMvZ3B1L2RybS9pOTE1L2dlbS9pOTE1X2dlbV9wYWdlcy5jICAg ICB8ICAgMyArLQo+ICAgZHJpdmVycy9ncHUvZHJtL2k5MTUvZ2VtL2k5MTVfZ2VtX3R0bS5jICAg ICAgIHwgMTIyICsrKysrKysrKysrKysrKysrLQo+ICAgLi4uL2RybS9pOTE1L2dlbS9zZWxmdGVz dHMvaTkxNV9nZW1fbW1hbi5jICAgIHwgIDkwICsrKysrKystLS0tLS0KPiAgIGRyaXZlcnMvZ3B1 L2RybS9pOTE1L3NlbGZ0ZXN0cy9pZ3RfbW1hcC5jICAgICB8ICAyNSArKystCj4gICBkcml2ZXJz L2dwdS9kcm0vaTkxNS9zZWxmdGVzdHMvaWd0X21tYXAuaCAgICAgfCAgMTIgKy0KPiAgIDggZmls ZXMgY2hhbmdlZCwgMjQ3IGluc2VydGlvbnMoKyksIDkyIGRlbGV0aW9ucygtKQoKVGhlcmUgYXJl IGEgY291cGxlIG9mIGNoZWNrcGF0Y2gucGwgLS1zdHJpY3Qgd2FybmluZ3MvY2hlY2tzIHdpdGgg dGhpcyAKcGF0Y2guCgoKPgo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9nZW0v aTkxNV9nZW1fbW1hbi5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ2VtL2k5MTVfZ2VtX21tYW4u Ywo+IGluZGV4IGZkMWM5NzE0ZjhkOC4uYWYwNGVhNTkzMDkxIDEwMDY0NAo+IC0tLSBhL2RyaXZl cnMvZ3B1L2RybS9pOTE1L2dlbS9pOTE1X2dlbV9tbWFuLmMKPiArKysgYi9kcml2ZXJzL2dwdS9k cm0vaTkxNS9nZW0vaTkxNV9nZW1fbW1hbi5jCj4gQEAgLTE5LDYgKzE5LDcgQEAKPiAgICNpbmNs dWRlICJpOTE1X2dlbV9tbWFuLmgiCj4gICAjaW5jbHVkZSAiaTkxNV90cmFjZS5oIgo+ICAgI2lu Y2x1ZGUgImk5MTVfdXNlcl9leHRlbnNpb25zLmgiCj4gKyNpbmNsdWRlICJpOTE1X2dlbV90dG0u aCIKPiAgICNpbmNsdWRlICJpOTE1X3ZtYS5oIgo+ICAgCj4gICBzdGF0aWMgaW5saW5lIGJvb2wK PiBAQCAtNjIyLDYgKzYyMyw4IEBAIG1tYXBfb2Zmc2V0X2F0dGFjaChzdHJ1Y3QgZHJtX2k5MTVf Z2VtX29iamVjdCAqb2JqLAo+ICAgCXN0cnVjdCBpOTE1X21tYXBfb2Zmc2V0ICptbW87Cj4gICAJ aW50IGVycjsKPiAgIAo+ICsJR0VNX0JVR19PTihvYmotPm9wcy0+bW1hcF9vZmZzZXQgfHwgb2Jq LT5vcHMtPm1tYXBfb3BzKTsKPiArCj4gICAJbW1vID0gbG9va3VwX21tbyhvYmosIG1tYXBfdHlw ZSk7Cj4gICAJaWYgKG1tbykKPiAgIAkJZ290byBvdXQ7Cj4gQEAgLTY2NCw0MCArNjY3LDQ3IEBA IG1tYXBfb2Zmc2V0X2F0dGFjaChzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLAo+ICAg fQo+ICAgCj4gICBzdGF0aWMgaW50Cj4gLV9fYXNzaWduX21tYXBfb2Zmc2V0KHN0cnVjdCBkcm1f ZmlsZSAqZmlsZSwKPiAtCQkgICAgIHUzMiBoYW5kbGUsCj4gK19fYXNzaWduX21tYXBfb2Zmc2V0 KHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosCj4gICAJCSAgICAgZW51bSBpOTE1X21t YXBfdHlwZSBtbWFwX3R5cGUsCj4gLQkJICAgICB1NjQgKm9mZnNldCkKPiArCQkgICAgIHU2NCAq b2Zmc2V0LCBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGUpCj4gICB7Cj4gLQlzdHJ1Y3QgZHJtX2k5MTVf Z2VtX29iamVjdCAqb2JqOwo+ICAgCXN0cnVjdCBpOTE1X21tYXBfb2Zmc2V0ICptbW87Cj4gLQlp bnQgZXJyOwo+ICAgCj4gLQlvYmogPSBpOTE1X2dlbV9vYmplY3RfbG9va3VwKGZpbGUsIGhhbmRs ZSk7Cj4gLQlpZiAoIW9iaikKPiAtCQlyZXR1cm4gLUVOT0VOVDsKPiArCWlmIChpOTE1X2dlbV9v YmplY3RfbmV2ZXJfbW1hcChvYmopKQo+ICsJCXJldHVybiAtRU5PREVWOwo+ICAgCj4gLQlpZiAo aTkxNV9nZW1fb2JqZWN0X25ldmVyX21tYXAob2JqKSkgewo+IC0JCWVyciA9IC1FTk9ERVY7Cj4g LQkJZ290byBvdXQ7Cj4gKwlpZiAob2JqLT5vcHMtPm1tYXBfb2Zmc2V0KSAgewo+ICsJCSpvZmZz ZXQgPSBvYmotPm9wcy0+bW1hcF9vZmZzZXQob2JqKTsKPiArCQlyZXR1cm4gMDsKPiAgIAl9Cj4g ICAKPiAgIAlpZiAobW1hcF90eXBlICE9IEk5MTVfTU1BUF9UWVBFX0dUVCAmJgo+ICAgCSAgICAh aTkxNV9nZW1fb2JqZWN0X2hhc19zdHJ1Y3RfcGFnZShvYmopICYmCj4gLQkgICAgIWk5MTVfZ2Vt X29iamVjdF90eXBlX2hhcyhvYmosIEk5MTVfR0VNX09CSkVDVF9IQVNfSU9NRU0pKSB7Cj4gLQkJ ZXJyID0gLUVOT0RFVjsKPiAtCQlnb3RvIG91dDsKPiAtCX0KPiArCSAgICAhaTkxNV9nZW1fb2Jq ZWN0X3R5cGVfaGFzKG9iaiwgSTkxNV9HRU1fT0JKRUNUX0hBU19JT01FTSkpCj4gKwkJcmV0dXJu IC1FTk9ERVY7Cj4gICAKPiAgIAltbW8gPSBtbWFwX29mZnNldF9hdHRhY2gob2JqLCBtbWFwX3R5 cGUsIGZpbGUpOwo+IC0JaWYgKElTX0VSUihtbW8pKSB7Cj4gLQkJZXJyID0gUFRSX0VSUihtbW8p Owo+IC0JCWdvdG8gb3V0Owo+IC0JfQo+ICsJaWYgKElTX0VSUihtbW8pKQo+ICsJCXJldHVybiBQ VFJfRVJSKG1tbyk7Cj4gICAKPiAgIAkqb2Zmc2V0ID0gZHJtX3ZtYV9ub2RlX29mZnNldF9hZGRy KCZtbW8tPnZtYV9ub2RlKTsKPiAtCWVyciA9IDA7Cj4gLW91dDoKPiArCXJldHVybiAwOwo+ICt9 Cj4gKwo+ICtzdGF0aWMgaW50Cj4gK19fYXNzaWduX21tYXBfb2Zmc2V0X2hhbmRsZShzdHJ1Y3Qg ZHJtX2ZpbGUgKmZpbGUsCj4gKwkJCSAgICB1MzIgaGFuZGxlLAo+ICsJCQkgICAgZW51bSBpOTE1 X21tYXBfdHlwZSBtbWFwX3R5cGUsCj4gKwkJCSAgICB1NjQgKm9mZnNldCkKPiArewo+ICsJc3Ry dWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKPiArCWludCBlcnI7Cj4gKwo+ICsJb2JqID0g aTkxNV9nZW1fb2JqZWN0X2xvb2t1cChmaWxlLCBoYW5kbGUpOwo+ICsJaWYgKCFvYmopCj4gKwkJ cmV0dXJuIC1FTk9FTlQ7Cj4gKwo+ICsJZXJyID0gX19hc3NpZ25fbW1hcF9vZmZzZXQob2JqLCBt bWFwX3R5cGUsIG9mZnNldCwgZmlsZSk7Cj4gICAJaTkxNV9nZW1fb2JqZWN0X3B1dChvYmopOwo+ ICAgCXJldHVybiBlcnI7Cj4gICB9Cj4gQEAgLTcxNyw3ICs3MjcsNyBAQCBpOTE1X2dlbV9kdW1i X21tYXBfb2Zmc2V0KHN0cnVjdCBkcm1fZmlsZSAqZmlsZSwKPiAgIAllbHNlCj4gICAJCW1tYXBf dHlwZSA9IEk5MTVfTU1BUF9UWVBFX0dUVDsKPiAgIAo+IC0JcmV0dXJuIF9fYXNzaWduX21tYXBf b2Zmc2V0KGZpbGUsIGhhbmRsZSwgbW1hcF90eXBlLCBvZmZzZXQpOwo+ICsJcmV0dXJuIF9fYXNz aWduX21tYXBfb2Zmc2V0X2hhbmRsZShmaWxlLCBoYW5kbGUsIG1tYXBfdHlwZSwgb2Zmc2V0KTsK PiAgIH0KPiAgIAo+ICAgLyoqCj4gQEAgLTc4NSw3ICs3OTUsNyBAQCBpOTE1X2dlbV9tbWFwX29m ZnNldF9pb2N0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAo+ICAgCQlyZXR1 cm4gLUVJTlZBTDsKPiAgIAl9Cj4gICAKPiAtCXJldHVybiBfX2Fzc2lnbl9tbWFwX29mZnNldChm aWxlLCBhcmdzLT5oYW5kbGUsIHR5cGUsICZhcmdzLT5vZmZzZXQpOwo+ICsJcmV0dXJuIF9fYXNz aWduX21tYXBfb2Zmc2V0X2hhbmRsZShmaWxlLCBhcmdzLT5oYW5kbGUsIHR5cGUsICZhcmdzLT5v ZmZzZXQpOwo+ICAgfQo+ICAgCj4gICBzdGF0aWMgdm9pZCB2bV9vcGVuKHN0cnVjdCB2bV9hcmVh X3N0cnVjdCAqdm1hKQo+IEBAIC04ODksOCArODk5LDE2IEBAIGludCBpOTE1X2dlbV9tbWFwKHN0 cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKPiAgIAkJICogZGVz dHJveWVkIGFuZCB3aWxsIGJlIGludmFsaWQgd2hlbiB0aGUgdm1hIG1hbmFnZXIgbG9jawo+ICAg CQkgKiBpcyByZWxlYXNlZC4KPiAgIAkJICovCj4gLQkJbW1vID0gY29udGFpbmVyX29mKG5vZGUs IHN0cnVjdCBpOTE1X21tYXBfb2Zmc2V0LCB2bWFfbm9kZSk7Cj4gLQkJb2JqID0gaTkxNV9nZW1f b2JqZWN0X2dldF9yY3UobW1vLT5vYmopOwo+ICsJCWlmICghbm9kZS0+ZHJpdmVyX3ByaXZhdGUp IHsKPiArCQkJbW1vID0gY29udGFpbmVyX29mKG5vZGUsIHN0cnVjdCBpOTE1X21tYXBfb2Zmc2V0 LCB2bWFfbm9kZSk7Cj4gKwkJCW9iaiA9IGk5MTVfZ2VtX29iamVjdF9nZXRfcmN1KG1tby0+b2Jq KTsKPiArCj4gKwkJCUdFTV9CVUdfT04ob2JqICYmIG9iai0+b3BzLT5tbWFwX29wcyk7Cj4gKwkJ fSBlbHNlIHsKPiArCQkJb2JqID0gaTkxNV9nZW1fb2JqZWN0X2dldF9yY3UoY29udGFpbmVyX29m KG5vZGUsIHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0LCBiYXNlLnZtYV9ub2RlKSk7Cj4gKwo+ ICsJCQlHRU1fQlVHX09OKG9iaiAmJiAhb2JqLT5vcHMtPm1tYXBfb3BzKTsKPiArCQl9Cj4gICAJ fQo+ICAgCWRybV92bWFfb2Zmc2V0X3VubG9ja19sb29rdXAoZGV2LT52bWFfb2Zmc2V0X21hbmFn ZXIpOwo+ICAgCXJjdV9yZWFkX3VubG9jaygpOwo+IEBAIC05MTIsNyArOTMwLDYgQEAgaW50IGk5 MTVfZ2VtX21tYXAoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1h KQo+ICAgCX0KPiAgIAo+ICAgCXZtYS0+dm1fZmxhZ3MgfD0gVk1fUEZOTUFQIHwgVk1fRE9OVEVY UEFORCB8IFZNX0RPTlREVU1QOwo+IC0Jdm1hLT52bV9wcml2YXRlX2RhdGEgPSBtbW87Cj4gICAK PiAgIAkvKgo+ICAgCSAqIFdlIGtlZXAgdGhlIHJlZiBvbiBtbW8tPm9iaiwgbm90IHZtX2ZpbGUs IGJ1dCB3ZSByZXF1aXJlCj4gQEAgLTkyNiw2ICs5NDMsMTUgQEAgaW50IGk5MTVfZ2VtX21tYXAo c3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQo+ICAgCS8qIERy b3AgdGhlIGluaXRpYWwgY3JlYXRpb24gcmVmZXJlbmNlLCB0aGUgdm1hIGlzIG5vdyBob2xkaW5n IG9uZS4gKi8KPiAgIAlmcHV0KGFub24pOwo+ICAgCj4gKwlpZiAob2JqLT5vcHMtPm1tYXBfb3Bz KSB7Cj4gKwkJdm1hLT52bV9wYWdlX3Byb3QgPSBwZ3Byb3RfZGVjcnlwdGVkKHZtX2dldF9wYWdl X3Byb3Qodm1hLT52bV9mbGFncykpOwo+ICsJCXZtYS0+dm1fb3BzID0gb2JqLT5vcHMtPm1tYXBf b3BzOwo+ICsJCXZtYS0+dm1fcHJpdmF0ZV9kYXRhID0gbm9kZS0+ZHJpdmVyX3ByaXZhdGU7Cj4g KwkJcmV0dXJuIDA7Cj4gKwl9Cj4gKwo+ICsJdm1hLT52bV9wcml2YXRlX2RhdGEgPSBtbW87Cj4g Kwo+ICAgCXN3aXRjaCAobW1vLT5tbWFwX3R5cGUpIHsKPiAgIAljYXNlIEk5MTVfTU1BUF9UWVBF X1dDOgo+ICAgCQl2bWEtPnZtX3BhZ2VfcHJvdCA9Cj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1 L2RybS9pOTE1L2dlbS9pOTE1X2dlbV9vYmplY3QuaCBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2dl bS9pOTE1X2dlbV9vYmplY3QuaAo+IGluZGV4IGEzYWQ4Y2Y0ZWVmZC4uZmY1OWU2YzY0MGU2IDEw MDY0NAo+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2dlbS9pOTE1X2dlbV9vYmplY3QuaAo+ ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2dlbS9pOTE1X2dlbV9vYmplY3QuaAo+IEBAIC0z NDIsMTQgKzM0MiwxNCBAQCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKgo+ICAgX19pOTE1X2dlbV9vYmpl Y3RfZ2V0X3NnKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosCj4gICAJCQkgc3RydWN0 IGk5MTVfZ2VtX29iamVjdF9wYWdlX2l0ZXIgKml0ZXIsCj4gICAJCQkgdW5zaWduZWQgaW50IG4s Cj4gLQkJCSB1bnNpZ25lZCBpbnQgKm9mZnNldCwgYm9vbCBhbGxvd19hbGxvYyk7Cj4gKwkJCSB1 bnNpZ25lZCBpbnQgKm9mZnNldCwgYm9vbCBhbGxvd19hbGxvYywgYm9vbCBkbWEpOwo+ICAgCj4g ICBzdGF0aWMgaW5saW5lIHN0cnVjdCBzY2F0dGVybGlzdCAqCj4gICBpOTE1X2dlbV9vYmplY3Rf Z2V0X3NnKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosCj4gICAJCSAgICAgICB1bnNp Z25lZCBpbnQgbiwKPiAgIAkJICAgICAgIHVuc2lnbmVkIGludCAqb2Zmc2V0LCBib29sIGFsbG93 X2FsbG9jKQo+ICAgewo+IC0JcmV0dXJuIF9faTkxNV9nZW1fb2JqZWN0X2dldF9zZyhvYmosICZv YmotPm1tLmdldF9wYWdlLCBuLCBvZmZzZXQsIGFsbG93X2FsbG9jKTsKPiArCXJldHVybiBfX2k5 MTVfZ2VtX29iamVjdF9nZXRfc2cob2JqLCAmb2JqLT5tbS5nZXRfcGFnZSwgbiwgb2Zmc2V0LCBh bGxvd19hbGxvYywgZmFsc2UpOwo+ICAgfQo+ICAgCj4gICBzdGF0aWMgaW5saW5lIHN0cnVjdCBz Y2F0dGVybGlzdCAqCj4gQEAgLTM1Nyw3ICszNTcsNyBAQCBpOTE1X2dlbV9vYmplY3RfZ2V0X3Nn X2RtYShzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLAo+ICAgCQkJICAgdW5zaWduZWQg aW50IG4sCj4gICAJCQkgICB1bnNpZ25lZCBpbnQgKm9mZnNldCwgYm9vbCBhbGxvd19hbGxvYykK PiAgIHsKPiAtCXJldHVybiBfX2k5MTVfZ2VtX29iamVjdF9nZXRfc2cob2JqLCAmb2JqLT5tbS5n ZXRfZG1hX3BhZ2UsIG4sIG9mZnNldCwgYWxsb3dfYWxsb2MpOwo+ICsJcmV0dXJuIF9faTkxNV9n ZW1fb2JqZWN0X2dldF9zZyhvYmosICZvYmotPm1tLmdldF9kbWFfcGFnZSwgbiwgb2Zmc2V0LCBh bGxvd19hbGxvYywgdHJ1ZSk7Cj4gICB9Cj4gICAKPiAgIHN0cnVjdCBwYWdlICoKPiBkaWZmIC0t Z2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ2VtL2k5MTVfZ2VtX29iamVjdF90eXBlcy5oIGIv ZHJpdmVycy9ncHUvZHJtL2k5MTUvZ2VtL2k5MTVfZ2VtX29iamVjdF90eXBlcy5oCj4gaW5kZXgg NjgzMTM0NzRlNmE2Li4yYTIzYjc3NDI0YjMgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9ncHUvZHJt L2k5MTUvZ2VtL2k5MTVfZ2VtX29iamVjdF90eXBlcy5oCj4gKysrIGIvZHJpdmVycy9ncHUvZHJt L2k5MTUvZ2VtL2k5MTVfZ2VtX29iamVjdF90eXBlcy5oCj4gQEAgLTYxLDYgKzYxLDcgQEAgc3Ry dWN0IGRybV9pOTE1X2dlbV9vYmplY3Rfb3BzIHsKPiAgIAkJICAgICBjb25zdCBzdHJ1Y3QgZHJt X2k5MTVfZ2VtX3ByZWFkICphcmcpOwo+ICAgCWludCAoKnB3cml0ZSkoc3RydWN0IGRybV9pOTE1 X2dlbV9vYmplY3QgKm9iaiwKPiAgIAkJICAgICAgY29uc3Qgc3RydWN0IGRybV9pOTE1X2dlbV9w d3JpdGUgKmFyZyk7Cj4gKwl1NjQgKCptbWFwX29mZnNldCkoc3RydWN0IGRybV9pOTE1X2dlbV9v YmplY3QgKm9iaik7Cj4gICAKPiAgIAlpbnQgKCpkbWFidWZfZXhwb3J0KShzdHJ1Y3QgZHJtX2k5 MTVfZ2VtX29iamVjdCAqb2JqKTsKPiAgIAo+IEBAIC03OSw2ICs4MCw3IEBAIHN0cnVjdCBkcm1f aTkxNV9nZW1fb2JqZWN0X29wcyB7Cj4gICAJdm9pZCAoKmRlbGF5ZWRfZnJlZSkoc3RydWN0IGRy bV9pOTE1X2dlbV9vYmplY3QgKm9iaik7Cj4gICAJdm9pZCAoKnJlbGVhc2UpKHN0cnVjdCBkcm1f aTkxNV9nZW1fb2JqZWN0ICpvYmopOwo+ICAgCj4gKwljb25zdCBzdHJ1Y3Qgdm1fb3BlcmF0aW9u c19zdHJ1Y3QgKm1tYXBfb3BzOwo+ICAgCWNvbnN0IGNoYXIgKm5hbWU7IC8qIGZyaWVuZGx5IG5h bWUgZm9yIGRlYnVnLCBlLmcuIGxvY2tkZXAgY2xhc3NlcyAqLwo+ICAgfTsKPiAgIAo+IEBAIC0z MjgsNiArMzMwLDcgQEAgc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3Qgewo+ICAgCj4gICAJc3Ry dWN0IHsKPiAgIAkJc3RydWN0IHNnX3RhYmxlICpjYWNoZWRfaW9fc3Q7Cj4gKwkJc3RydWN0IGk5 MTVfZ2VtX29iamVjdF9wYWdlX2l0ZXIgZ2V0X2lvX3BhZ2U7Cj4gICAJCWJvb2wgY3JlYXRlZDox Owo+ICAgCX0gdHRtOwo+ICAgCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2dl bS9pOTE1X2dlbV9wYWdlcy5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ2VtL2k5MTVfZ2VtX3Bh Z2VzLmMKPiBpbmRleCA2NDQ0ZTA5NzAxNmQuLjA4NjAwNWMxYzdlYSAxMDA2NDQKPiAtLS0gYS9k cml2ZXJzL2dwdS9kcm0vaTkxNS9nZW0vaTkxNV9nZW1fcGFnZXMuYwo+ICsrKyBiL2RyaXZlcnMv Z3B1L2RybS9pOTE1L2dlbS9pOTE1X2dlbV9wYWdlcy5jCj4gQEAgLTQ2Nyw5ICs0NjcsOCBAQCBf X2k5MTVfZ2VtX29iamVjdF9nZXRfc2coc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwK PiAgIAkJCSBzdHJ1Y3QgaTkxNV9nZW1fb2JqZWN0X3BhZ2VfaXRlciAqaXRlciwKPiAgIAkJCSB1 bnNpZ25lZCBpbnQgbiwKPiAgIAkJCSB1bnNpZ25lZCBpbnQgKm9mZnNldCwKPiAtCQkJIGJvb2wg YWxsb3dfYWxsb2MpCj4gKwkJCSBib29sIGFsbG93X2FsbG9jLCBib29sIGRtYSkKPiAgIHsKPiAt CWNvbnN0IGJvb2wgZG1hID0gaXRlciA9PSAmb2JqLT5tbS5nZXRfZG1hX3BhZ2U7Cj4gICAJc3Ry dWN0IHNjYXR0ZXJsaXN0ICpzZzsKPiAgIAl1bnNpZ25lZCBpbnQgaWR4LCBjb3VudDsKPiAgIAo+ IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9nZW0vaTkxNV9nZW1fdHRtLmMgYi9k cml2ZXJzL2dwdS9kcm0vaTkxNS9nZW0vaTkxNV9nZW1fdHRtLmMKPiBpbmRleCAxNzU5ODkzMGE5 OWUuLmQwYmU5NTczMjZlMCAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9nZW0v aTkxNV9nZW1fdHRtLmMKPiArKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9nZW0vaTkxNV9nZW1f dHRtLmMKPiBAQCAtMTMsNiArMTMsNyBAQAo+ICAgI2luY2x1ZGUgImdlbS9pOTE1X2dlbV9vYmpl Y3QuaCIKPiAgICNpbmNsdWRlICJnZW0vaTkxNV9nZW1fcmVnaW9uLmgiCj4gICAjaW5jbHVkZSAi Z2VtL2k5MTVfZ2VtX3R0bS5oIgo+ICsjaW5jbHVkZSAiZ2VtL2k5MTVfZ2VtX21tYW4uaCIKPiAg IAo+ICAgI2RlZmluZSBJOTE1X1BMX0xNRU0wIFRUTV9QTF9QUklWCj4gICAjZGVmaW5lIEk5MTVf UExfU1lTVEVNIFRUTV9QTF9TWVNURU0KPiBAQCAtMTU4LDExICsxNTksMjAgQEAgc3RhdGljIGlu dCBpOTE1X3R0bV9tb3ZlX25vdGlmeShzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvKQo+ICAg Cj4gICBzdGF0aWMgdm9pZCBpOTE1X3R0bV9mcmVlX2NhY2hlZF9pb19zdChzdHJ1Y3QgZHJtX2k5 MTVfZ2VtX29iamVjdCAqb2JqKQo+ICAgewo+IC0JaWYgKG9iai0+dHRtLmNhY2hlZF9pb19zdCkg ewo+IC0JCXNnX2ZyZWVfdGFibGUob2JqLT50dG0uY2FjaGVkX2lvX3N0KTsKPiAtCQlrZnJlZShv YmotPnR0bS5jYWNoZWRfaW9fc3QpOwo+IC0JCW9iai0+dHRtLmNhY2hlZF9pb19zdCA9IE5VTEw7 Cj4gLQl9Cj4gKwlzdHJ1Y3QgcmFkaXhfdHJlZV9pdGVyIGl0ZXI7Cj4gKwl2b2lkIF9fcmN1ICoq c2xvdDsKPiArCj4gKwlpZiAoIW9iai0+dHRtLmNhY2hlZF9pb19zdCkKPiArCQlyZXR1cm47Cj4g Kwo+ICsJcmN1X3JlYWRfbG9jaygpOwo+ICsJcmFkaXhfdHJlZV9mb3JfZWFjaF9zbG90KHNsb3Qs ICZvYmotPnR0bS5nZXRfaW9fcGFnZS5yYWRpeCwgJml0ZXIsIDApCj4gKwkJcmFkaXhfdHJlZV9k ZWxldGUoJm9iai0+dHRtLmdldF9pb19wYWdlLnJhZGl4LCBpdGVyLmluZGV4KTsKPiArCXJjdV9y ZWFkX3VubG9jaygpOwo+ICsKPiArCXNnX2ZyZWVfdGFibGUob2JqLT50dG0uY2FjaGVkX2lvX3N0 KTsKPiArCWtmcmVlKG9iai0+dHRtLmNhY2hlZF9pb19zdCk7Cj4gKwlvYmotPnR0bS5jYWNoZWRf aW9fc3QgPSBOVUxMOwo+ICAgfQo+ICAgCj4gICBzdGF0aWMgdm9pZCBpOTE1X3R0bV9wdXJnZShz dHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKQo+IEBAIC0zMzgsMTIgKzM0OCw0MiBAQCBz dGF0aWMgaW50IGk5MTVfdHRtX21vdmUoc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibywgYm9v bCBldmljdCwKPiAgIAl0dG1fYm9fbW92ZV9zeW5jX2NsZWFudXAoYm8sIGRzdF9tZW0pOwo+ICAg CWk5MTVfdHRtX2ZyZWVfY2FjaGVkX2lvX3N0KG9iaik7Cj4gICAKPiAtCWlmICghZHN0X21hbi0+ dXNlX3R0KQo+ICsJaWYgKCFkc3RfbWFuLT51c2VfdHQpIHsKPiAgIAkJb2JqLT50dG0uY2FjaGVk X2lvX3N0ID0gZHN0X3N0Owo+ICsJCW9iai0+dHRtLmdldF9pb19wYWdlLnNnX3BvcyA9IGRzdF9z dC0+c2dsOwo+ICsJCW9iai0+dHRtLmdldF9pb19wYWdlLnNnX2lkeCA9IDA7Cj4gKwl9Cj4gICAK PiAgIAlyZXR1cm4gMDsKPiAgIH0KPiAgIAo+ICtzdGF0aWMgaW50IGk5MTVfdHRtX2lvX21lbV9y ZXNlcnZlKHN0cnVjdCB0dG1fZGV2aWNlICpiZGV2LCBzdHJ1Y3QgdHRtX3Jlc291cmNlICptZW0p Cj4gK3sKPiArCWlmIChtZW0tPm1lbV90eXBlIDwgSTkxNV9QTF9MTUVNMCkKPiArCQlyZXR1cm4g MDsKPiArCj4gKwkvKiBXZSBtYXkgbmVlZCB0byByZXZpc2l0IHRoaXMgbGF0ZXIsIGJ1dCB0aGlz IGFsbG93cyBhbGwgY2FjaGluZyB0byBiZSB1c2VkIGluIG1tYXAgKi8KPiArCW1lbS0+YnVzLmNh Y2hpbmcgPSB0dG1fY2FjaGVkOwoKU2luY2Ugd2UncmUgbm93IHVzaW5nIHRoZSBUVE0gYm8gb2Zm c2V0cywgd2UgbWlnaHQgYXMgd2VsbCBqdXN0IG1ha2UgCnRoaXMgdHRtX3dyaXRlX2NvbWJpbmVk IG5vdy4KCgo+ICsJbWVtLT5idXMuaXNfaW9tZW0gPSB0cnVlOwo+ICsKPiArCXJldHVybiAwOwo+ ICt9Cj4gKwo+ICtzdGF0aWMgdW5zaWduZWQgbG9uZyBpOTE1X3R0bV9pb19tZW1fcGZuKHN0cnVj dCB0dG1fYnVmZmVyX29iamVjdCAqYm8sCj4gKwkJCQkJIHVuc2lnbmVkIGxvbmcgcGFnZV9vZmZz ZXQpCj4gK3sKPiArCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmogPSBpOTE1X3R0bV90 b19nZW0oYm8pOwo+ICsJdW5zaWduZWQgbG9uZyBiYXNlID0gb2JqLT5tbS5yZWdpb24tPmlvbWFw LmJhc2UgLSBvYmotPm1tLnJlZ2lvbi0+cmVnaW9uLnN0YXJ0Owo+ICsJc3RydWN0IHNjYXR0ZXJs aXN0ICpzZzsKPiArCXVuc2lnbmVkIGludCBvZnM7Cj4gKwo+ICsJR0VNX1dBUk5fT04oYm8tPnR0 bSk7Cj4gKwo+ICsJc2cgPSBfX2k5MTVfZ2VtX29iamVjdF9nZXRfc2cob2JqLCAmb2JqLT50dG0u Z2V0X2lvX3BhZ2UsIHBhZ2Vfb2Zmc2V0LCAmb2ZzLCB0cnVlLCB0cnVlKTsKPiArCj4gKwlyZXR1 cm4gKChiYXNlICsgc2dfZG1hX2FkZHJlc3Moc2cpKSA+PiBQQUdFX1NISUZUKSArIG9mczsKPiAr fQo+ICsKPiAgIHN0YXRpYyBzdHJ1Y3QgdHRtX2RldmljZV9mdW5jcyBpOTE1X3R0bV9ib19kcml2 ZXIgPSB7Cj4gICAJLnR0bV90dF9jcmVhdGUgPSBpOTE1X3R0bV90dF9jcmVhdGUsCj4gICAJLnR0 bV90dF91bnBvcHVsYXRlID0gaTkxNV90dG1fdHRfdW5wb3B1bGF0ZSwKPiBAQCAtMzU0LDYgKzM5 NCw4IEBAIHN0YXRpYyBzdHJ1Y3QgdHRtX2RldmljZV9mdW5jcyBpOTE1X3R0bV9ib19kcml2ZXIg PSB7Cj4gICAJLnZlcmlmeV9hY2Nlc3MgPSBOVUxMLAo+ICAgCS5zd2FwX25vdGlmeSA9IGk5MTVf dHRtX3N3YXBfbm90aWZ5LAo+ICAgCS5kZWxldGVfbWVtX25vdGlmeSA9IGk5MTVfdHRtX2RlbGV0 ZV9tZW1fbm90aWZ5LAo+ICsJLmlvX21lbV9yZXNlcnZlID0gaTkxNV90dG1faW9fbWVtX3Jlc2Vy dmUsCj4gKwkuaW9fbWVtX3BmbiA9IGk5MTVfdHRtX2lvX21lbV9wZm4sCj4gICB9Owo+ICAgCj4g ICAvKioKPiBAQCAtNDYxLDcgKzUwMyw2OCBAQCBzdGF0aWMgdm9pZCBpOTE1X3R0bV9kZWxheWVk X2ZyZWUoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKPiAgIAl9Cj4gICB9Cj4gICAK PiAtc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0X29wcyBpOTE1X2dlbV90 dG1fb2JqX29wcyA9IHsKPiArc3RhdGljIHZtX2ZhdWx0X3Qgdm1fZmF1bHRfdHRtKHN0cnVjdCB2 bV9mYXVsdCAqdm1mKQo+ICt7Cj4gKwlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKmFyZWEgPSB2bWYt PnZtYTsKPiArCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmogPQo+ICsJCWk5MTVfdHRt X3RvX2dlbShhcmVhLT52bV9wcml2YXRlX2RhdGEpOwo+ICsKPiArCS8qIFNhbml0eSBjaGVjayB0 aGF0IHdlIGFsbG93IHdyaXRpbmcgaW50byB0aGlzIG9iamVjdCAqLwo+ICsJaWYgKHVubGlrZWx5 KGk5MTVfZ2VtX29iamVjdF9pc19yZWFkb25seShvYmopICYmCj4gKwkJICAgICBhcmVhLT52bV9m bGFncyAmIFZNX1dSSVRFKSkKPiArCQlyZXR1cm4gVk1fRkFVTFRfU0lHQlVTOwo+ICsKPiArCXJl dHVybiB0dG1fYm9fdm1fZmF1bHQodm1mKTsKPiArfQo+ICsKPiArc3RhdGljIGludAo+ICt2bV9h Y2Nlc3NfdHRtKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqYXJlYSwgdW5zaWduZWQgbG9uZyBhZGRy LAo+ICsJICB2b2lkICpidWYsIGludCBsZW4sIGludCB3cml0ZSkKPiArewo+ICsJc3RydWN0IGRy bV9pOTE1X2dlbV9vYmplY3QgKm9iaiA9Cj4gKwkJaTkxNV90dG1fdG9fZ2VtKGFyZWEtPnZtX3By aXZhdGVfZGF0YSk7Cj4gKwo+ICsJaWYgKGk5MTVfZ2VtX29iamVjdF9pc19yZWFkb25seShvYmop ICYmIHdyaXRlKQo+ICsJCXJldHVybiAtRUFDQ0VTOwo+ICsKPiArCXJldHVybiB0dG1fYm9fdm1f YWNjZXNzKGFyZWEsIGFkZHIsIGJ1ZiwgbGVuLCB3cml0ZSk7Cj4gK30KPiArCj4gK3N0YXRpYyB2 b2lkIHR0bV92bV9vcGVuKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQo+ICt7Cj4gKwlzdHJ1 Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqID0KPiArCQlpOTE1X3R0bV90b19nZW0odm1hLT52 bV9wcml2YXRlX2RhdGEpOwo+ICsKPiArCUdFTV9CVUdfT04oIW9iaik7Cj4gKwlpOTE1X2dlbV9v YmplY3RfZ2V0KG9iaik7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIHR0bV92bV9jbG9zZShzdHJ1 Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKPiArewo+ICsJc3RydWN0IGRybV9pOTE1X2dlbV9vYmpl Y3QgKm9iaiA9Cj4gKwkJaTkxNV90dG1fdG9fZ2VtKHZtYS0+dm1fcHJpdmF0ZV9kYXRhKTsKPiAr Cj4gKwlHRU1fQlVHX09OKCFvYmopOwo+ICsJaTkxNV9nZW1fb2JqZWN0X3B1dChvYmopOwo+ICt9 Cj4gKwo+ICsKPiArc3RhdGljIGNvbnN0IHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCB2bV9v cHNfdHRtID0gewo+ICsJLmZhdWx0ID0gdm1fZmF1bHRfdHRtLAo+ICsJLmFjY2VzcyA9IHZtX2Fj Y2Vzc190dG0sCj4gKwkub3BlbiA9IHR0bV92bV9vcGVuLAo+ICsJLmNsb3NlID0gdHRtX3ZtX2Ns b3NlLAo+ICt9Owo+ICsKPiArc3RhdGljIHU2NCBpOTE1X3R0bV9tbWFwX29mZnNldChzdHJ1Y3Qg ZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKQo+ICt7Cj4gKwkvKiBUaGUgdHRtX2JvIG11c3QgYmUg YWxsb2NhdGVkIHdpdGggSTkxNV9CT19BTExPQ19VU0VSICovCj4gKwlHRU1fQlVHX09OKCFkcm1f bW1fbm9kZV9hbGxvY2F0ZWQoJm9iai0+YmFzZS52bWFfbm9kZS52bV9ub2RlKSk7Cj4gKwo+ICsJ cmV0dXJuIGRybV92bWFfbm9kZV9vZmZzZXRfYWRkcigmb2JqLT5iYXNlLnZtYV9ub2RlKTsKPiAr fQo+ICsKPiArY29uc3Qgc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3Rfb3BzIGk5MTVfZ2VtX3R0 bV9vYmpfb3BzID0gewo+ICAgCS5uYW1lID0gImk5MTVfZ2VtX29iamVjdF90dG0iLAo+ICAgCS5m bGFncyA9IEk5MTVfR0VNX09CSkVDVF9IQVNfSU9NRU0sCj4gICAKPiBAQCAtNDcwLDYgKzU3Myw4 IEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdF9vcHMgaTkxNV9nZW1f dHRtX29ial9vcHMgPSB7Cj4gICAJLnRydW5jYXRlID0gaTkxNV90dG1fcHVyZ2UsCj4gICAJLmFk anVzdF9scnUgPSBpOTE1X3R0bV9hZGp1c3RfbHJ1LAo+ICAgCS5kZWxheWVkX2ZyZWUgPSBpOTE1 X3R0bV9kZWxheWVkX2ZyZWUsCj4gKwkubW1hcF9vZmZzZXQgPSBpOTE1X3R0bV9tbWFwX29mZnNl dCwKPiArCS5tbWFwX29wcyA9ICZ2bV9vcHNfdHRtLAo+ICAgfTsKPiAgIAo+ICAgdm9pZCBpOTE1 X3R0bV9ib19kZXN0cm95KHN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8pClB1dCBhIG11dGV4 X2Rlc3Ryb3koJm9iai0+dHRtLmdldF9pb19wYWdlLmxvY2spIGhlcmU/Cj4gQEAgLTUxOCw2ICs2 MjMsOCBAQCBpbnQgX19pOTE1X2dlbV90dG1fb2JqZWN0X2luaXQoc3RydWN0IGludGVsX21lbW9y eV9yZWdpb24gKm1lbSwKPiAgIAlpOTE1X2dlbV9vYmplY3RfbWFrZV91bnNocmlua2FibGUob2Jq KTsKPiAgIAlvYmotPnJlYWRfZG9tYWlucyA9IEk5MTVfR0VNX0RPTUFJTl9XQyB8IEk5MTVfR0VN X0RPTUFJTl9HVFQ7Cj4gICAJaTkxNV9nZW1fb2JqZWN0X3NldF9jYWNoZV9jb2hlcmVuY3kob2Jq LCBJOTE1X0NBQ0hFX05PTkUpOwo+ICsJSU5JVF9SQURJWF9UUkVFKCZvYmotPnR0bS5nZXRfaW9f cGFnZS5yYWRpeCwgR0ZQX0tFUk5FTCB8IF9fR0ZQX05PV0FSTik7Cj4gKwltdXRleF9pbml0KCZv YmotPnR0bS5nZXRfaW9fcGFnZS5sb2NrKTsKPiAgIAo+ICAgCWJvX3R5cGUgPSAob2JqLT5mbGFn cyAmIEk5MTVfQk9fQUxMT0NfVVNFUikgPyB0dG1fYm9fdHlwZV9kZXZpY2UgOgo+ICAgCQl0dG1f Ym9fdHlwZV9rZXJuZWw7Cj4gQEAgLTUyOSw2ICs2MzYsNyBAQCBpbnQgX19pOTE1X2dlbV90dG1f b2JqZWN0X2luaXQoc3RydWN0IGludGVsX21lbW9yeV9yZWdpb24gKm1lbSwKPiAgIAkgKiBTaW1p bGFybHksIGluIGRlbGF5ZWRfZGVzdHJveSwgd2UgY2FuJ3QgY2FsbCB0dG1fYm9fcHV0KCkKPiAg IAkgKiB1bnRpbCBzdWNjZXNzZnVsIGluaXRpYWxpemF0aW9uLgo+ICAgCSAqLwo+ICsJb2JqLT5i YXNlLnZtYV9ub2RlLmRyaXZlcl9wcml2YXRlID0gaTkxNV9nZW1fdG9fdHRtKG9iaik7Cj4gICAJ cmV0ID0gdHRtX2JvX2luaXQoJmk5MTUtPmJkZXYsIGk5MTVfZ2VtX3RvX3R0bShvYmopLCBzaXpl LAo+ICAgCQkJICBib190eXBlLCAmaTkxNV9zeXNfcGxhY2VtZW50LCBhbGlnbm1lbnQsCj4gICAJ CQkgIHRydWUsIE5VTEwsIE5VTEwsIGk5MTVfdHRtX2JvX2Rlc3Ryb3kpOwo+IGRpZmYgLS1naXQg YS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9nZW0vc2VsZnRlc3RzL2k5MTVfZ2VtX21tYW4uYyBiL2Ry aXZlcnMvZ3B1L2RybS9pOTE1L2dlbS9zZWxmdGVzdHMvaTkxNV9nZW1fbW1hbi5jCj4gaW5kZXgg MDVhM2IyOWY1NDVlLi5jYTY5YTI5YjdmMmEgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9ncHUvZHJt L2k5MTUvZ2VtL3NlbGZ0ZXN0cy9pOTE1X2dlbV9tbWFuLmMKPiArKysgYi9kcml2ZXJzL2dwdS9k cm0vaTkxNS9nZW0vc2VsZnRlc3RzL2k5MTVfZ2VtX21tYW4uYwo+IEBAIC01NzgsMTYgKzU3OCwx NyBAQCBzdGF0aWMgYm9vbCBhc3NlcnRfbW1hcF9vZmZzZXQoc3RydWN0IGRybV9pOTE1X3ByaXZh dGUgKmk5MTUsCj4gICAJCQkgICAgICAgaW50IGV4cGVjdGVkKQo+ICAgewo+ICAgCXN0cnVjdCBk cm1faTkxNV9nZW1fb2JqZWN0ICpvYmo7Cj4gLQlzdHJ1Y3QgaTkxNV9tbWFwX29mZnNldCAqbW1v Owo+ICsJdTY0IG9mZnNldDsKPiArCWludCByZXQ7Cj4gICAKPiAgIAlvYmogPSBpOTE1X2dlbV9v YmplY3RfY3JlYXRlX2ludGVybmFsKGk5MTUsIHNpemUpOwo+ICAgCWlmIChJU19FUlIob2JqKSkK PiAtCQlyZXR1cm4gZmFsc2U7Cj4gKwkJcmV0dXJuIGV4cGVjdGVkICYmIGV4cGVjdGVkID09IFBU Ul9FUlIob2JqKTsKPiAgIAo+IC0JbW1vID0gbW1hcF9vZmZzZXRfYXR0YWNoKG9iaiwgSTkxNV9N TUFQX09GRlNFVF9HVFQsIE5VTEwpOwo+ICsJcmV0ID0gX19hc3NpZ25fbW1hcF9vZmZzZXQob2Jq LCBJOTE1X01NQVBfVFlQRV9HVFQsICZvZmZzZXQsIE5VTEwpOwo+ICAgCWk5MTVfZ2VtX29iamVj dF9wdXQob2JqKTsKPiAgIAo+IC0JcmV0dXJuIFBUUl9FUlJfT1JfWkVSTyhtbW8pID09IGV4cGVj dGVkOwo+ICsJcmV0dXJuIHJldCA9PSBleHBlY3RlZDsKPiAgIH0KPiAgIAo+ICAgc3RhdGljIHZv aWQgZGlzYWJsZV9yZXRpcmVfd29ya2VyKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1KQo+ IEBAIC02MjIsOCArNjIzLDggQEAgc3RhdGljIGludCBpZ3RfbW1hcF9vZmZzZXRfZXhoYXVzdGlv bih2b2lkICphcmcpCj4gICAJc3RydWN0IGRybV9tbSAqbW0gPSAmaTkxNS0+ZHJtLnZtYV9vZmZz ZXRfbWFuYWdlci0+dm1fYWRkcl9zcGFjZV9tbTsKPiAgIAlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29i amVjdCAqb2JqOwo+ICAgCXN0cnVjdCBkcm1fbW1fbm9kZSAqaG9sZSwgKm5leHQ7Cj4gLQlzdHJ1 Y3QgaTkxNV9tbWFwX29mZnNldCAqbW1vOwo+ICAgCWludCBsb29wLCBlcnIgPSAwOwo+ICsJdTY0 IG9mZnNldDsKPiAgIAo+ICAgCS8qIERpc2FibGUgYmFja2dyb3VuZCByZWFwZXIgKi8KPiAgIAlk aXNhYmxlX3JldGlyZV93b3JrZXIoaTkxNSk7Cj4gQEAgLTY4NCwxMyArNjg1LDEzIEBAIHN0YXRp YyBpbnQgaWd0X21tYXBfb2Zmc2V0X2V4aGF1c3Rpb24odm9pZCAqYXJnKQo+ICAgCW9iaiA9IGk5 MTVfZ2VtX29iamVjdF9jcmVhdGVfaW50ZXJuYWwoaTkxNSwgUEFHRV9TSVpFKTsKPiAgIAlpZiAo SVNfRVJSKG9iaikpIHsKPiAgIAkJZXJyID0gUFRSX0VSUihvYmopOwo+ICsJCXByX2VycigiVW5h YmxlIHRvIGNyZWF0ZSBvYmplY3QgZm9yIHJlY2xhaW1lZCBob2xlXG4iKTsKPiAgIAkJZ290byBv dXQ7Cj4gICAJfQo+ICAgCj4gLQltbW8gPSBtbWFwX29mZnNldF9hdHRhY2gob2JqLCBJOTE1X01N QVBfT0ZGU0VUX0dUVCwgTlVMTCk7Cj4gLQlpZiAoSVNfRVJSKG1tbykpIHsKPiArCWVyciA9IF9f YXNzaWduX21tYXBfb2Zmc2V0KG9iaiwgSTkxNV9NTUFQX1RZUEVfR1RULCAmb2Zmc2V0LCBOVUxM KTsKPiArCWlmIChlcnIpIHsKPiAgIAkJcHJfZXJyKCJVbmFibGUgdG8gaW5zZXJ0IG9iamVjdCBp bnRvIHJlY2xhaW1lZCBob2xlXG4iKTsKPiAtCQllcnIgPSBQVFJfRVJSKG1tbyk7Cj4gICAJCWdv dG8gZXJyX29iajsKPiAgIAl9Cj4gICAKPiBAQCAtODY1LDEwICs4NjYsMTAgQEAgc3RhdGljIGlu dCBfX2lndF9tbWFwKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1LAo+ICAgCQkgICAgICBz dHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLAo+ICAgCQkgICAgICBlbnVtIGk5MTVfbW1h cF90eXBlIHR5cGUpCj4gICB7Cj4gLQlzdHJ1Y3QgaTkxNV9tbWFwX29mZnNldCAqbW1vOwo+ICAg CXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqYXJlYTsKPiAgIAl1bnNpZ25lZCBsb25nIGFkZHI7Cj4g ICAJaW50IGVyciwgaTsKPiArCXU2NCBvZmZzZXQ7Cj4gICAKPiAgIAlpZiAoIWNhbl9tbWFwKG9i aiwgdHlwZSkpCj4gICAJCXJldHVybiAwOwo+IEBAIC04NzksMTEgKzg4MCwxMSBAQCBzdGF0aWMg aW50IF9faWd0X21tYXAoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUsCj4gICAJaWYgKGVy cikKPiAgIAkJcmV0dXJuIGVycjsKPiAgIAo+IC0JbW1vID0gbW1hcF9vZmZzZXRfYXR0YWNoKG9i aiwgdHlwZSwgTlVMTCk7Cj4gLQlpZiAoSVNfRVJSKG1tbykpCj4gLQkJcmV0dXJuIFBUUl9FUlIo bW1vKTsKPiArCWVyciA9IF9fYXNzaWduX21tYXBfb2Zmc2V0KG9iaiwgdHlwZSwgJm9mZnNldCwg TlVMTCk7Cj4gKwlpZiAoZXJyKQo+ICsJCXJldHVybiBlcnI7Cj4gICAKPiAtCWFkZHIgPSBpZ3Rf bW1hcF9ub2RlKGk5MTUsICZtbW8tPnZtYV9ub2RlLCAwLCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVE KTsKPiArCWFkZHIgPSBpZ3RfbW1hcF9vZmZzZXQoaTkxNSwgb2Zmc2V0LCBvYmotPmJhc2Uuc2l6 ZSwgUFJPVF9XUklURSwgTUFQX1NIQVJFRCk7Cj4gICAJaWYgKElTX0VSUl9WQUxVRShhZGRyKSkK PiAgIAkJcmV0dXJuIGFkZHI7Cj4gICAKPiBAQCAtODk3LDEzICs4OTgsNiBAQCBzdGF0aWMgaW50 IF9faWd0X21tYXAoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUsCj4gICAJCWdvdG8gb3V0 X3VubWFwOwo+ICAgCX0KPiAgIAo+IC0JaWYgKGFyZWEtPnZtX3ByaXZhdGVfZGF0YSAhPSBtbW8p IHsKPiAtCQlwcl9lcnIoIiVzOiB2bV9hcmVhX3N0cnVjdCBkaWQgbm90IHBvaW50IGJhY2sgdG8g b3VyIG1tYXBfb2Zmc2V0IG9iamVjdCFcbiIsCj4gLQkJICAgICAgIG9iai0+bW0ucmVnaW9uLT5u YW1lKTsKPiAtCQllcnIgPSAtRUlOVkFMOwo+IC0JCWdvdG8gb3V0X3VubWFwOwo+IC0JfQo+IC0K PiAgIAlmb3IgKGkgPSAwOyBpIDwgb2JqLT5iYXNlLnNpemUgLyBzaXplb2YodTMyKTsgaSsrKSB7 Cj4gICAJCXUzMiBfX3VzZXIgKnV4ID0gdTY0X3RvX3VzZXJfcHRyKCh1NjQpKGFkZHIgKyBpICog c2l6ZW9mKCp1eCkpKTsKPiAgIAkJdTMyIHg7Cj4gQEAgLTk2MSw3ICs5NTUsNyBAQCBzdGF0aWMg aW50IGlndF9tbWFwKHZvaWQgKmFyZykKPiAgIAkJCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0 ICpvYmo7Cj4gICAJCQlpbnQgZXJyOwo+ICAgCj4gLQkJCW9iaiA9IGk5MTVfZ2VtX29iamVjdF9j cmVhdGVfcmVnaW9uKG1yLCBzaXplc1tpXSwgMCk7Cj4gKwkJCW9iaiA9IGk5MTVfZ2VtX29iamVj dF9jcmVhdGVfcmVnaW9uKG1yLCBzaXplc1tpXSwgSTkxNV9CT19BTExPQ19VU0VSKTsKPiAgIAkJ CWlmIChvYmogPT0gRVJSX1BUUigtRU5PREVWKSkKPiAgIAkJCQljb250aW51ZTsKPiAgIAo+IEBA IC0xMDA0LDEyICs5OTgsMTIgQEAgc3RhdGljIGludCBfX2lndF9tbWFwX2FjY2VzcyhzdHJ1Y3Qg ZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSwKPiAgIAkJCSAgICAgc3RydWN0IGRybV9pOTE1X2dlbV9v YmplY3QgKm9iaiwKPiAgIAkJCSAgICAgZW51bSBpOTE1X21tYXBfdHlwZSB0eXBlKQo+ICAgewo+ IC0Jc3RydWN0IGk5MTVfbW1hcF9vZmZzZXQgKm1tbzsKPiAgIAl1bnNpZ25lZCBsb25nIF9fdXNl ciAqcHRyOwo+ICAgCXVuc2lnbmVkIGxvbmcgQSwgQjsKPiAgIAl1bnNpZ25lZCBsb25nIHgsIHk7 Cj4gICAJdW5zaWduZWQgbG9uZyBhZGRyOwo+ICAgCWludCBlcnI7Cj4gKwl1NjQgb2Zmc2V0Owo+ ICAgCj4gICAJbWVtc2V0KCZBLCAweEFBLCBzaXplb2YoQSkpOwo+ICAgCW1lbXNldCgmQiwgMHhC Qiwgc2l6ZW9mKEIpKTsKPiBAQCAtMTAxNywxMSArMTAxMSwxMSBAQCBzdGF0aWMgaW50IF9faWd0 X21tYXBfYWNjZXNzKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1LAo+ICAgCWlmICghY2Fu X21tYXAob2JqLCB0eXBlKSB8fCAhY2FuX2FjY2VzcyhvYmopKQo+ICAgCQlyZXR1cm4gMDsKPiAg IAo+IC0JbW1vID0gbW1hcF9vZmZzZXRfYXR0YWNoKG9iaiwgdHlwZSwgTlVMTCk7Cj4gLQlpZiAo SVNfRVJSKG1tbykpCj4gLQkJcmV0dXJuIFBUUl9FUlIobW1vKTsKPiArCWVyciA9IF9fYXNzaWdu X21tYXBfb2Zmc2V0KG9iaiwgdHlwZSwgJm9mZnNldCwgTlVMTCk7Cj4gKwlpZiAoZXJyKQo+ICsJ CXJldHVybiBlcnI7Cj4gICAKPiAtCWFkZHIgPSBpZ3RfbW1hcF9ub2RlKGk5MTUsICZtbW8tPnZt YV9ub2RlLCAwLCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVEKTsKPiArCWFkZHIgPSBpZ3RfbW1hcF9v ZmZzZXQoaTkxNSwgb2Zmc2V0LCBvYmotPmJhc2Uuc2l6ZSwgUFJPVF9XUklURSwgTUFQX1NIQVJF RCk7Cj4gICAJaWYgKElTX0VSUl9WQUxVRShhZGRyKSkKPiAgIAkJcmV0dXJuIGFkZHI7Cj4gICAJ cHRyID0gKHVuc2lnbmVkIGxvbmcgX191c2VyICopYWRkcjsKPiBAQCAtMTA4MSw3ICsxMDc1LDcg QEAgc3RhdGljIGludCBpZ3RfbW1hcF9hY2Nlc3Modm9pZCAqYXJnKQo+ICAgCQlzdHJ1Y3QgZHJt X2k5MTVfZ2VtX29iamVjdCAqb2JqOwo+ICAgCQlpbnQgZXJyOwo+ICAgCj4gLQkJb2JqID0gaTkx NV9nZW1fb2JqZWN0X2NyZWF0ZV9yZWdpb24obXIsIFBBR0VfU0laRSwgMCk7Cj4gKwkJb2JqID0g aTkxNV9nZW1fb2JqZWN0X2NyZWF0ZV9yZWdpb24obXIsIFBBR0VfU0laRSwgSTkxNV9CT19BTExP Q19VU0VSKTsKPiAgIAkJaWYgKG9iaiA9PSBFUlJfUFRSKC1FTk9ERVYpKQo+ICAgCQkJY29udGlu dWU7Cj4gICAKPiBAQCAtMTExMSwxMSArMTEwNSwxMSBAQCBzdGF0aWMgaW50IF9faWd0X21tYXBf Z3B1KHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1LAo+ICAgCQkJICBlbnVtIGk5MTVfbW1h cF90eXBlIHR5cGUpCj4gICB7Cj4gICAJc3RydWN0IGludGVsX2VuZ2luZV9jcyAqZW5naW5lOwo+ IC0Jc3RydWN0IGk5MTVfbW1hcF9vZmZzZXQgKm1tbzsKPiAgIAl1bnNpZ25lZCBsb25nIGFkZHI7 Cj4gICAJdTMyIF9fdXNlciAqdXg7Cj4gICAJdTMyIGJiZTsKPiAgIAlpbnQgZXJyOwo+ICsJdTY0 IG9mZnNldDsKPiAgIAo+ICAgCS8qCj4gICAJICogVmVyaWZ5IHRoYXQgdGhlIG1tYXAgYWNjZXNz IGludG8gdGhlIGJhY2tpbmcgc3RvcmUgYWxpZ25zIHdpdGgKPiBAQCAtMTEzMiwxMSArMTEyNiwx MSBAQCBzdGF0aWMgaW50IF9faWd0X21tYXBfZ3B1KHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpp OTE1LAo+ICAgCWlmIChlcnIpCj4gICAJCXJldHVybiBlcnI7Cj4gICAKPiAtCW1tbyA9IG1tYXBf b2Zmc2V0X2F0dGFjaChvYmosIHR5cGUsIE5VTEwpOwo+IC0JaWYgKElTX0VSUihtbW8pKQo+IC0J CXJldHVybiBQVFJfRVJSKG1tbyk7Cj4gKwllcnIgPSBfX2Fzc2lnbl9tbWFwX29mZnNldChvYmos IHR5cGUsICZvZmZzZXQsIE5VTEwpOwo+ICsJaWYgKGVycikKPiArCQlyZXR1cm4gZXJyOwo+ICAg Cj4gLQlhZGRyID0gaWd0X21tYXBfbm9kZShpOTE1LCAmbW1vLT52bWFfbm9kZSwgMCwgUFJPVF9X UklURSwgTUFQX1NIQVJFRCk7Cj4gKwlhZGRyID0gaWd0X21tYXBfb2Zmc2V0KGk5MTUsIG9mZnNl dCwgb2JqLT5iYXNlLnNpemUsIFBST1RfV1JJVEUsIE1BUF9TSEFSRUQpOwo+ICAgCWlmIChJU19F UlJfVkFMVUUoYWRkcikpCj4gICAJCXJldHVybiBhZGRyOwo+ICAgCj4gQEAgLTEyMjYsNyArMTIy MCw3IEBAIHN0YXRpYyBpbnQgaWd0X21tYXBfZ3B1KHZvaWQgKmFyZykKPiAgIAkJc3RydWN0IGRy bV9pOTE1X2dlbV9vYmplY3QgKm9iajsKPiAgIAkJaW50IGVycjsKPiAgIAo+IC0JCW9iaiA9IGk5 MTVfZ2VtX29iamVjdF9jcmVhdGVfcmVnaW9uKG1yLCBQQUdFX1NJWkUsIDApOwo+ICsJCW9iaiA9 IGk5MTVfZ2VtX29iamVjdF9jcmVhdGVfcmVnaW9uKG1yLCBQQUdFX1NJWkUsIEk5MTVfQk9fQUxM T0NfVVNFUik7Cj4gICAJCWlmIChvYmogPT0gRVJSX1BUUigtRU5PREVWKSkKPiAgIAkJCWNvbnRp bnVlOwo+ICAgCj4gQEAgLTEzMDMsMTggKzEyOTcsMTggQEAgc3RhdGljIGludCBfX2lndF9tbWFw X3Jldm9rZShzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSwKPiAgIAkJCSAgICAgc3RydWN0 IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwKPiAgIAkJCSAgICAgZW51bSBpOTE1X21tYXBfdHlw ZSB0eXBlKQo+ICAgewo+IC0Jc3RydWN0IGk5MTVfbW1hcF9vZmZzZXQgKm1tbzsKPiAgIAl1bnNp Z25lZCBsb25nIGFkZHI7Cj4gICAJaW50IGVycjsKPiArCXU2NCBvZmZzZXQ7Cj4gICAKPiAgIAlp ZiAoIWNhbl9tbWFwKG9iaiwgdHlwZSkpCj4gICAJCXJldHVybiAwOwo+ICAgCj4gLQltbW8gPSBt bWFwX29mZnNldF9hdHRhY2gob2JqLCB0eXBlLCBOVUxMKTsKPiAtCWlmIChJU19FUlIobW1vKSkK PiAtCQlyZXR1cm4gUFRSX0VSUihtbW8pOwo+ICsJZXJyID0gX19hc3NpZ25fbW1hcF9vZmZzZXQo b2JqLCB0eXBlLCAmb2Zmc2V0LCBOVUxMKTsKPiArCWlmIChlcnIpCj4gKwkJcmV0dXJuIGVycjsK PiAgIAo+IC0JYWRkciA9IGlndF9tbWFwX25vZGUoaTkxNSwgJm1tby0+dm1hX25vZGUsIDAsIFBS T1RfV1JJVEUsIE1BUF9TSEFSRUQpOwo+ICsJYWRkciA9IGlndF9tbWFwX29mZnNldChpOTE1LCBv ZmZzZXQsIG9iai0+YmFzZS5zaXplLCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVEKTsKPiAgIAlpZiAo SVNfRVJSX1ZBTFVFKGFkZHIpKQo+ICAgCQlyZXR1cm4gYWRkcjsKPiAgIAo+IEBAIC0xMzUwLDEw ICsxMzQ0LDIwIEBAIHN0YXRpYyBpbnQgX19pZ3RfbW1hcF9yZXZva2Uoc3RydWN0IGRybV9pOTE1 X3ByaXZhdGUgKmk5MTUsCj4gICAJCX0KPiAgIAl9Cj4gICAKPiAtCWVyciA9IGNoZWNrX2Fic2Vu dChhZGRyLCBvYmotPmJhc2Uuc2l6ZSk7Cj4gLQlpZiAoZXJyKSB7Cj4gLQkJcHJfZXJyKCIlczog d2FzIG5vdCBhYnNlbnRcbiIsIG9iai0+bW0ucmVnaW9uLT5uYW1lKTsKPiAtCQlnb3RvIG91dF91 bm1hcDsKPiArCWlmICghb2JqLT5vcHMtPm1tYXBfb3BzKSB7Cj4gKwkJZXJyID0gY2hlY2tfYWJz ZW50KGFkZHIsIG9iai0+YmFzZS5zaXplKTsKPiArCQlpZiAoZXJyKSB7Cj4gKwkJCXByX2Vycigi JXM6IHdhcyBub3QgYWJzZW50XG4iLCBvYmotPm1tLnJlZ2lvbi0+bmFtZSk7Cj4gKwkJCWdvdG8g b3V0X3VubWFwOwo+ICsJCX0KPiArCX0gZWxzZSB7Cj4gKwkJLyogdHRtIGFsbG93cyBhY2Nlc3Mg dG8gZXZpY3RlZCByZWdpb25zIGJ5IGRlc2lnbiAqLwo+ICsKPiArCQllcnIgPSBjaGVja19wcmVz ZW50KGFkZHIsIG9iai0+YmFzZS5zaXplKTsKPiArCQlpZiAoZXJyKSB7Cj4gKwkJCXByX2Vycigi JXM6IHdhcyBub3QgcHJlc2VudFxuIiwgb2JqLT5tbS5yZWdpb24tPm5hbWUpOwo+ICsJCQlnb3Rv IG91dF91bm1hcDsKPiArCQl9Cj4gICAJfQo+ICAgCj4gICBvdXRfdW5tYXA6Cj4gQEAgLTEzNzEs NyArMTM3NSw3IEBAIHN0YXRpYyBpbnQgaWd0X21tYXBfcmV2b2tlKHZvaWQgKmFyZykKPiAgIAkJ c3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKPiAgIAkJaW50IGVycjsKPiAgIAo+IC0J CW9iaiA9IGk5MTVfZ2VtX29iamVjdF9jcmVhdGVfcmVnaW9uKG1yLCBQQUdFX1NJWkUsIDApOwo+ ICsJCW9iaiA9IGk5MTVfZ2VtX29iamVjdF9jcmVhdGVfcmVnaW9uKG1yLCBQQUdFX1NJWkUsIEk5 MTVfQk9fQUxMT0NfVVNFUik7Cj4gICAJCWlmIChvYmogPT0gRVJSX1BUUigtRU5PREVWKSkKPiAg IAkJCWNvbnRpbnVlOwo+ICAgCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L3Nl bGZ0ZXN0cy9pZ3RfbW1hcC5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvc2VsZnRlc3RzL2lndF9t bWFwLmMKPiBpbmRleCA1ODNhNGZmOGI4YzkuLmU4Mjg2YzI4ZGU5MSAxMDA2NDQKPiAtLS0gYS9k cml2ZXJzL2dwdS9kcm0vaTkxNS9zZWxmdGVzdHMvaWd0X21tYXAuYwo+ICsrKyBiL2RyaXZlcnMv Z3B1L2RybS9pOTE1L3NlbGZ0ZXN0cy9pZ3RfbW1hcC5jCj4gQEAgLTksMTUgKzksMjggQEAKPiAg ICNpbmNsdWRlICJpOTE1X2Rydi5oIgo+ICAgI2luY2x1ZGUgImlndF9tbWFwLmgiCj4gICAKPiAt dW5zaWduZWQgbG9uZyBpZ3RfbW1hcF9ub2RlKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1 LAo+IC0JCQkgICAgc3RydWN0IGRybV92bWFfb2Zmc2V0X25vZGUgKm5vZGUsCj4gLQkJCSAgICB1 bnNpZ25lZCBsb25nIGFkZHIsCj4gLQkJCSAgICB1bnNpZ25lZCBsb25nIHByb3QsCj4gLQkJCSAg ICB1bnNpZ25lZCBsb25nIGZsYWdzKQo+ICt1bnNpZ25lZCBsb25nIGlndF9tbWFwX29mZnNldChz dHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSwKPiArCQkJICAgICAgdTY0IG9mZnNldCwKPiAr CQkJICAgICAgdW5zaWduZWQgbG9uZyBzaXplLAo+ICsJCQkgICAgICB1bnNpZ25lZCBsb25nIHBy b3QsCj4gKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCj4gICB7Cj4gKwlzdHJ1Y3QgZHJt X3ZtYV9vZmZzZXRfbm9kZSAqbm9kZTsKPiAgIAlzdHJ1Y3QgZmlsZSAqZmlsZTsKPiArCXVuc2ln bmVkIGxvbmcgYWRkcjsKPiAgIAlpbnQgZXJyOwo+ICAgCj4gKwkvKiBubyBuZWVkIHRvIHJlZmNv dW50LCB3ZSBvd24gdGhpcyBvYmplY3QgKi8KPiArCWRybV92bWFfb2Zmc2V0X2xvY2tfbG9va3Vw KGk5MTUtPmRybS52bWFfb2Zmc2V0X21hbmFnZXIpOwo+ICsJbm9kZSA9IGRybV92bWFfb2Zmc2V0 X2V4YWN0X2xvb2t1cF9sb2NrZWQoaTkxNS0+ZHJtLnZtYV9vZmZzZXRfbWFuYWdlciwKPiArCQkJ CQkJICBvZmZzZXQgLyBQQUdFX1NJWkUsIHNpemUgLyBQQUdFX1NJWkUpOwo+ICsJZHJtX3ZtYV9v ZmZzZXRfdW5sb2NrX2xvb2t1cChpOTE1LT5kcm0udm1hX29mZnNldF9tYW5hZ2VyKTsKPiArCj4g KwlpZiAoR0VNX1dBUk5fT04oIW5vZGUpKSB7Cj4gKwkJcHJfaW5mbygiRmFpbGVkIHRvIGxvb2t1 cCAlTHhcbiIsIG9mZnNldCk7CkNoZWNrcGF0Y2ggd2FybmluZyBoZXJlIGlpcmMuCj4gKwkJcmV0 dXJuIC1FTk9FTlQ7Cj4gKwl9Cj4gKwo+ICAgCS8qIFByZXRlbmQgdG8gb3BlbigiL2Rldi9kcmkv Y2FyZDAiKSAqLwo+ICAgCWZpbGUgPSBtb2NrX2RybV9nZXRmaWxlKGk5MTUtPmRybS5wcmltYXJ5 LCBPX1JEV1IpOwo+ICAgCWlmIChJU19FUlIoZmlsZSkpCj4gQEAgLTI5LDcgKzQyLDcgQEAgdW5z aWduZWQgbG9uZyBpZ3RfbW1hcF9ub2RlKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1LAo+ ICAgCQlnb3RvIG91dF9maWxlOwo+ICAgCX0KPiAgIAo+IC0JYWRkciA9IHZtX21tYXAoZmlsZSwg YWRkciwgZHJtX3ZtYV9ub2RlX3NpemUobm9kZSkgPDwgUEFHRV9TSElGVCwKPiArCWFkZHIgPSB2 bV9tbWFwKGZpbGUsIDAsIGRybV92bWFfbm9kZV9zaXplKG5vZGUpIDw8IFBBR0VfU0hJRlQsCj4g ICAJCSAgICAgICBwcm90LCBmbGFncywgZHJtX3ZtYV9ub2RlX29mZnNldF9hZGRyKG5vZGUpKTsK PiAgIAo+ICAgCWRybV92bWFfbm9kZV9yZXZva2Uobm9kZSwgZmlsZS0+cHJpdmF0ZV9kYXRhKTsK PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvc2VsZnRlc3RzL2lndF9tbWFwLmgg Yi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9zZWxmdGVzdHMvaWd0X21tYXAuaAo+IGluZGV4IDZlNzE2 Y2I1OWQ3ZS4uYWNiZTM0ZDgxYTZkIDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1 L3NlbGZ0ZXN0cy9pZ3RfbW1hcC5oCj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvc2VsZnRl c3RzL2lndF9tbWFwLmgKPiBAQCAtNywxMyArNywxNSBAQAo+ICAgI2lmbmRlZiBJR1RfTU1BUF9I Cj4gICAjZGVmaW5lIElHVF9NTUFQX0gKPiAgIAo+ICsjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4K PiArCj4gICBzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZTsKPiAgIHN0cnVjdCBkcm1fdm1hX29mZnNl dF9ub2RlOwo+ICAgCj4gLXVuc2lnbmVkIGxvbmcgaWd0X21tYXBfbm9kZShzdHJ1Y3QgZHJtX2k5 MTVfcHJpdmF0ZSAqaTkxNSwKPiAtCQkJICAgIHN0cnVjdCBkcm1fdm1hX29mZnNldF9ub2RlICpu b2RlLAo+IC0JCQkgICAgdW5zaWduZWQgbG9uZyBhZGRyLAo+IC0JCQkgICAgdW5zaWduZWQgbG9u ZyBwcm90LAo+IC0JCQkgICAgdW5zaWduZWQgbG9uZyBmbGFncyk7Cj4gK3Vuc2lnbmVkIGxvbmcg aWd0X21tYXBfb2Zmc2V0KHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1LAo+ICsJCQkgICAg ICB1NjQgb2Zmc2V0LAo+ICsJCQkgICAgICB1bnNpZ25lZCBsb25nIHNpemUsCj4gKwkJCSAgICAg IHVuc2lnbmVkIGxvbmcgcHJvdCwKPiArCQkJICAgICAgdW5zaWduZWQgbG9uZyBmbGFncyk7Cj4g ICAKPiAgICNlbmRpZiAvKiBJR1RfTU1BUF9IICovCgovVGhvbWFzCgoKX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KSW50ZWwtZ2Z4IG1haWxpbmcgbGlzdApJ bnRlbC1nZnhAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Au b3JnL21haWxtYW4vbGlzdGluZm8vaW50ZWwtZ2Z4Cg==