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.7 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,NICE_REPLY_A,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_SANE_1 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id E1FFCC4743C for ; Mon, 14 Jun 2021 16:43:41 +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 A4A23610A2 for ; Mon, 14 Jun 2021 16:43:41 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org A4A23610A2 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=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 1D2DE89A16; Mon, 14 Jun 2021 16:43:39 +0000 (UTC) Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) by gabe.freedesktop.org (Postfix) with ESMTPS id 2553A8999A; Mon, 14 Jun 2021 16:43:37 +0000 (UTC) IronPort-SDR: gffuSVJ5wlrD44CmpLsCNreciqLPBjCguAVkBoib1CFDQDQMeacAd/xC1kiD3ty0R9okV0iUV5 9aLH5jp7D04Q== X-IronPort-AV: E=McAfee;i="6200,9189,10015"; a="266990582" X-IronPort-AV: E=Sophos;i="5.83,273,1616482800"; d="scan'208";a="266990582" Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by orsmga104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 14 Jun 2021 09:43:32 -0700 IronPort-SDR: ZAQK9s1fsFDhYjg1IIS6BgTot2YFm6s2pVNa3KbUPnopQST4/ZRaFPd0eACiKCthNWB+T7i+Yu 8Ao95GuoWHYw== X-IronPort-AV: E=Sophos;i="5.83,273,1616482800"; d="scan'208";a="554165852" Received: from chanily-mobl.ger.corp.intel.com (HELO [10.252.31.39]) ([10.252.31.39]) by fmsmga001-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 14 Jun 2021 09:43:31 -0700 Subject: Re: [PATCH v3 12/12] drm/i915/gem: Zap the i915_gem_object_blt code To: =?UTF-8?Q?Thomas_Hellstr=c3=b6m?= , intel-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org References: <20210614162612.294869-1-thomas.hellstrom@linux.intel.com> <20210614162612.294869-13-thomas.hellstrom@linux.intel.com> From: Matthew Auld Message-ID: <39a3730e-ca93-aaaf-5475-9b19f5c50d42@intel.com> Date: Mon, 14 Jun 2021 17:43:29 +0100 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: <20210614162612.294869-13-thomas.hellstrom@linux.intel.com> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-GB 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: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" On 14/06/2021 17:26, Thomas Hellström wrote: > It's unused with the exception of selftest. Replace a call in the > memory_region live selftest with a call into a corresponding > function in the new migrate code. I guess we do lose some coverage around blitting massively sized GEM objects using the huge_gem_object tricks. Reviewed-by: Matthew Auld > > Signed-off-by: Thomas Hellström > --- > drivers/gpu/drm/i915/Makefile | 1 - > .../gpu/drm/i915/gem/i915_gem_object_blt.c | 461 -------------- > .../gpu/drm/i915/gem/i915_gem_object_blt.h | 39 -- > .../i915/gem/selftests/i915_gem_object_blt.c | 597 ------------------ > .../drm/i915/selftests/i915_live_selftests.h | 1 - > .../drm/i915/selftests/i915_perf_selftests.h | 1 - > .../drm/i915/selftests/intel_memory_region.c | 21 +- > 7 files changed, 14 insertions(+), 1107 deletions(-) > delete mode 100644 drivers/gpu/drm/i915/gem/i915_gem_object_blt.c > delete mode 100644 drivers/gpu/drm/i915/gem/i915_gem_object_blt.h > delete mode 100644 drivers/gpu/drm/i915/gem/selftests/i915_gem_object_blt.c > > diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile > index ca07474ec2df..13085ac78c63 100644 > --- a/drivers/gpu/drm/i915/Makefile > +++ b/drivers/gpu/drm/i915/Makefile > @@ -143,7 +143,6 @@ gem-y += \ > gem/i915_gem_execbuffer.o \ > gem/i915_gem_internal.o \ > gem/i915_gem_object.o \ > - gem/i915_gem_object_blt.o \ > gem/i915_gem_lmem.o \ > gem/i915_gem_mman.o \ > gem/i915_gem_pages.o \ > diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object_blt.c b/drivers/gpu/drm/i915/gem/i915_gem_object_blt.c > deleted file mode 100644 > index 3e28c68fda3e..000000000000 > --- a/drivers/gpu/drm/i915/gem/i915_gem_object_blt.c > +++ /dev/null > @@ -1,461 +0,0 @@ > -// SPDX-License-Identifier: MIT > -/* > - * Copyright © 2019 Intel Corporation > - */ > - > -#include "i915_drv.h" > -#include "gt/intel_context.h" > -#include "gt/intel_engine_pm.h" > -#include "gt/intel_gpu_commands.h" > -#include "gt/intel_gt.h" > -#include "gt/intel_gt_buffer_pool.h" > -#include "gt/intel_ring.h" > -#include "i915_gem_clflush.h" > -#include "i915_gem_object_blt.h" > - > -struct i915_vma *intel_emit_vma_fill_blt(struct intel_context *ce, > - struct i915_vma *vma, > - struct i915_gem_ww_ctx *ww, > - u32 value) > -{ > - struct drm_i915_private *i915 = ce->vm->i915; > - const u32 block_size = SZ_8M; /* ~1ms at 8GiB/s preemption delay */ > - struct intel_gt_buffer_pool_node *pool; > - struct i915_vma *batch; > - u64 offset; > - u64 count; > - u64 rem; > - u32 size; > - u32 *cmd; > - int err; > - > - GEM_BUG_ON(intel_engine_is_virtual(ce->engine)); > - intel_engine_pm_get(ce->engine); > - > - count = div_u64(round_up(vma->size, block_size), block_size); > - size = (1 + 8 * count) * sizeof(u32); > - size = round_up(size, PAGE_SIZE); > - pool = intel_gt_get_buffer_pool(ce->engine->gt, size, I915_MAP_WC); > - if (IS_ERR(pool)) { > - err = PTR_ERR(pool); > - goto out_pm; > - } > - > - err = i915_gem_object_lock(pool->obj, ww); > - if (err) > - goto out_put; > - > - batch = i915_vma_instance(pool->obj, ce->vm, NULL); > - if (IS_ERR(batch)) { > - err = PTR_ERR(batch); > - goto out_put; > - } > - > - err = i915_vma_pin_ww(batch, ww, 0, 0, PIN_USER); > - if (unlikely(err)) > - goto out_put; > - > - /* we pinned the pool, mark it as such */ > - intel_gt_buffer_pool_mark_used(pool); > - > - cmd = i915_gem_object_pin_map(pool->obj, pool->type); > - if (IS_ERR(cmd)) { > - err = PTR_ERR(cmd); > - goto out_unpin; > - } > - > - rem = vma->size; > - offset = vma->node.start; > - > - do { > - u32 size = min_t(u64, rem, block_size); > - > - GEM_BUG_ON(size >> PAGE_SHIFT > S16_MAX); > - > - if (GRAPHICS_VER(i915) >= 8) { > - *cmd++ = XY_COLOR_BLT_CMD | BLT_WRITE_RGBA | (7 - 2); > - *cmd++ = BLT_DEPTH_32 | BLT_ROP_COLOR_COPY | PAGE_SIZE; > - *cmd++ = 0; > - *cmd++ = size >> PAGE_SHIFT << 16 | PAGE_SIZE / 4; > - *cmd++ = lower_32_bits(offset); > - *cmd++ = upper_32_bits(offset); > - *cmd++ = value; > - } else { > - *cmd++ = XY_COLOR_BLT_CMD | BLT_WRITE_RGBA | (6 - 2); > - *cmd++ = BLT_DEPTH_32 | BLT_ROP_COLOR_COPY | PAGE_SIZE; > - *cmd++ = 0; > - *cmd++ = size >> PAGE_SHIFT << 16 | PAGE_SIZE / 4; > - *cmd++ = offset; > - *cmd++ = value; > - } > - > - /* Allow ourselves to be preempted in between blocks. */ > - *cmd++ = MI_ARB_CHECK; > - > - offset += size; > - rem -= size; > - } while (rem); > - > - *cmd = MI_BATCH_BUFFER_END; > - > - i915_gem_object_flush_map(pool->obj); > - i915_gem_object_unpin_map(pool->obj); > - > - intel_gt_chipset_flush(ce->vm->gt); > - > - batch->private = pool; > - return batch; > - > -out_unpin: > - i915_vma_unpin(batch); > -out_put: > - intel_gt_buffer_pool_put(pool); > -out_pm: > - intel_engine_pm_put(ce->engine); > - return ERR_PTR(err); > -} > - > -int intel_emit_vma_mark_active(struct i915_vma *vma, struct i915_request *rq) > -{ > - int err; > - > - err = i915_request_await_object(rq, vma->obj, false); > - if (err == 0) > - err = i915_vma_move_to_active(vma, rq, 0); > - if (unlikely(err)) > - return err; > - > - return intel_gt_buffer_pool_mark_active(vma->private, rq); > -} > - > -void intel_emit_vma_release(struct intel_context *ce, struct i915_vma *vma) > -{ > - i915_vma_unpin(vma); > - intel_gt_buffer_pool_put(vma->private); > - intel_engine_pm_put(ce->engine); > -} > - > -static int > -move_obj_to_gpu(struct drm_i915_gem_object *obj, > - struct i915_request *rq, > - bool write) > -{ > - if (obj->cache_dirty & ~obj->cache_coherent) > - i915_gem_clflush_object(obj, 0); > - > - return i915_request_await_object(rq, obj, write); > -} > - > -int i915_gem_object_fill_blt(struct drm_i915_gem_object *obj, > - struct intel_context *ce, > - u32 value) > -{ > - struct i915_gem_ww_ctx ww; > - struct i915_request *rq; > - struct i915_vma *batch; > - struct i915_vma *vma; > - int err; > - > - vma = i915_vma_instance(obj, ce->vm, NULL); > - if (IS_ERR(vma)) > - return PTR_ERR(vma); > - > - i915_gem_ww_ctx_init(&ww, true); > - intel_engine_pm_get(ce->engine); > -retry: > - err = i915_gem_object_lock(obj, &ww); > - if (err) > - goto out; > - > - err = intel_context_pin_ww(ce, &ww); > - if (err) > - goto out; > - > - err = i915_vma_pin_ww(vma, &ww, 0, 0, PIN_USER); > - if (err) > - goto out_ctx; > - > - batch = intel_emit_vma_fill_blt(ce, vma, &ww, value); > - if (IS_ERR(batch)) { > - err = PTR_ERR(batch); > - goto out_vma; > - } > - > - rq = i915_request_create(ce); > - if (IS_ERR(rq)) { > - err = PTR_ERR(rq); > - goto out_batch; > - } > - > - err = intel_emit_vma_mark_active(batch, rq); > - if (unlikely(err)) > - goto out_request; > - > - err = move_obj_to_gpu(vma->obj, rq, true); > - if (err == 0) > - err = i915_vma_move_to_active(vma, rq, EXEC_OBJECT_WRITE); > - if (unlikely(err)) > - goto out_request; > - > - if (ce->engine->emit_init_breadcrumb) > - err = ce->engine->emit_init_breadcrumb(rq); > - > - if (likely(!err)) > - err = ce->engine->emit_bb_start(rq, > - batch->node.start, > - batch->node.size, > - 0); > -out_request: > - if (unlikely(err)) > - i915_request_set_error_once(rq, err); > - > - i915_request_add(rq); > -out_batch: > - intel_emit_vma_release(ce, batch); > -out_vma: > - i915_vma_unpin(vma); > -out_ctx: > - intel_context_unpin(ce); > -out: > - if (err == -EDEADLK) { > - err = i915_gem_ww_ctx_backoff(&ww); > - if (!err) > - goto retry; > - } > - i915_gem_ww_ctx_fini(&ww); > - intel_engine_pm_put(ce->engine); > - return err; > -} > - > -/* Wa_1209644611:icl,ehl */ > -static bool wa_1209644611_applies(struct drm_i915_private *i915, u32 size) > -{ > - u32 height = size >> PAGE_SHIFT; > - > - if (GRAPHICS_VER(i915) != 11) > - return false; > - > - return height % 4 == 3 && height <= 8; > -} > - > -struct i915_vma *intel_emit_vma_copy_blt(struct intel_context *ce, > - struct i915_gem_ww_ctx *ww, > - struct i915_vma *src, > - struct i915_vma *dst) > -{ > - struct drm_i915_private *i915 = ce->vm->i915; > - const u32 block_size = SZ_8M; /* ~1ms at 8GiB/s preemption delay */ > - struct intel_gt_buffer_pool_node *pool; > - struct i915_vma *batch; > - u64 src_offset, dst_offset; > - u64 count, rem; > - u32 size, *cmd; > - int err; > - > - GEM_BUG_ON(src->size != dst->size); > - > - GEM_BUG_ON(intel_engine_is_virtual(ce->engine)); > - intel_engine_pm_get(ce->engine); > - > - count = div_u64(round_up(dst->size, block_size), block_size); > - size = (1 + 11 * count) * sizeof(u32); > - size = round_up(size, PAGE_SIZE); > - pool = intel_gt_get_buffer_pool(ce->engine->gt, size, I915_MAP_WC); > - if (IS_ERR(pool)) { > - err = PTR_ERR(pool); > - goto out_pm; > - } > - > - err = i915_gem_object_lock(pool->obj, ww); > - if (err) > - goto out_put; > - > - batch = i915_vma_instance(pool->obj, ce->vm, NULL); > - if (IS_ERR(batch)) { > - err = PTR_ERR(batch); > - goto out_put; > - } > - > - err = i915_vma_pin_ww(batch, ww, 0, 0, PIN_USER); > - if (unlikely(err)) > - goto out_put; > - > - /* we pinned the pool, mark it as such */ > - intel_gt_buffer_pool_mark_used(pool); > - > - cmd = i915_gem_object_pin_map(pool->obj, pool->type); > - if (IS_ERR(cmd)) { > - err = PTR_ERR(cmd); > - goto out_unpin; > - } > - > - rem = src->size; > - src_offset = src->node.start; > - dst_offset = dst->node.start; > - > - do { > - size = min_t(u64, rem, block_size); > - GEM_BUG_ON(size >> PAGE_SHIFT > S16_MAX); > - > - if (GRAPHICS_VER(i915) >= 9 && > - !wa_1209644611_applies(i915, size)) { > - *cmd++ = GEN9_XY_FAST_COPY_BLT_CMD | (10 - 2); > - *cmd++ = BLT_DEPTH_32 | PAGE_SIZE; > - *cmd++ = 0; > - *cmd++ = size >> PAGE_SHIFT << 16 | PAGE_SIZE / 4; > - *cmd++ = lower_32_bits(dst_offset); > - *cmd++ = upper_32_bits(dst_offset); > - *cmd++ = 0; > - *cmd++ = PAGE_SIZE; > - *cmd++ = lower_32_bits(src_offset); > - *cmd++ = upper_32_bits(src_offset); > - } else if (GRAPHICS_VER(i915) >= 8) { > - *cmd++ = XY_SRC_COPY_BLT_CMD | BLT_WRITE_RGBA | (10 - 2); > - *cmd++ = BLT_DEPTH_32 | BLT_ROP_SRC_COPY | PAGE_SIZE; > - *cmd++ = 0; > - *cmd++ = size >> PAGE_SHIFT << 16 | PAGE_SIZE / 4; > - *cmd++ = lower_32_bits(dst_offset); > - *cmd++ = upper_32_bits(dst_offset); > - *cmd++ = 0; > - *cmd++ = PAGE_SIZE; > - *cmd++ = lower_32_bits(src_offset); > - *cmd++ = upper_32_bits(src_offset); > - } else { > - *cmd++ = SRC_COPY_BLT_CMD | BLT_WRITE_RGBA | (6 - 2); > - *cmd++ = BLT_DEPTH_32 | BLT_ROP_SRC_COPY | PAGE_SIZE; > - *cmd++ = size >> PAGE_SHIFT << 16 | PAGE_SIZE; > - *cmd++ = dst_offset; > - *cmd++ = PAGE_SIZE; > - *cmd++ = src_offset; > - } > - > - /* Allow ourselves to be preempted in between blocks. */ > - *cmd++ = MI_ARB_CHECK; > - > - src_offset += size; > - dst_offset += size; > - rem -= size; > - } while (rem); > - > - *cmd = MI_BATCH_BUFFER_END; > - > - i915_gem_object_flush_map(pool->obj); > - i915_gem_object_unpin_map(pool->obj); > - > - intel_gt_chipset_flush(ce->vm->gt); > - batch->private = pool; > - return batch; > - > -out_unpin: > - i915_vma_unpin(batch); > -out_put: > - intel_gt_buffer_pool_put(pool); > -out_pm: > - intel_engine_pm_put(ce->engine); > - return ERR_PTR(err); > -} > - > -int i915_gem_object_copy_blt(struct drm_i915_gem_object *src, > - struct drm_i915_gem_object *dst, > - struct intel_context *ce) > -{ > - struct i915_address_space *vm = ce->vm; > - struct i915_vma *vma[2], *batch; > - struct i915_gem_ww_ctx ww; > - struct i915_request *rq; > - int err, i; > - > - vma[0] = i915_vma_instance(src, vm, NULL); > - if (IS_ERR(vma[0])) > - return PTR_ERR(vma[0]); > - > - vma[1] = i915_vma_instance(dst, vm, NULL); > - if (IS_ERR(vma[1])) > - return PTR_ERR(vma[1]); > - > - i915_gem_ww_ctx_init(&ww, true); > - intel_engine_pm_get(ce->engine); > -retry: > - err = i915_gem_object_lock(src, &ww); > - if (!err) > - err = i915_gem_object_lock(dst, &ww); > - if (!err) > - err = intel_context_pin_ww(ce, &ww); > - if (err) > - goto out; > - > - err = i915_vma_pin_ww(vma[0], &ww, 0, 0, PIN_USER); > - if (err) > - goto out_ctx; > - > - err = i915_vma_pin_ww(vma[1], &ww, 0, 0, PIN_USER); > - if (unlikely(err)) > - goto out_unpin_src; > - > - batch = intel_emit_vma_copy_blt(ce, &ww, vma[0], vma[1]); > - if (IS_ERR(batch)) { > - err = PTR_ERR(batch); > - goto out_unpin_dst; > - } > - > - rq = i915_request_create(ce); > - if (IS_ERR(rq)) { > - err = PTR_ERR(rq); > - goto out_batch; > - } > - > - err = intel_emit_vma_mark_active(batch, rq); > - if (unlikely(err)) > - goto out_request; > - > - for (i = 0; i < ARRAY_SIZE(vma); i++) { > - err = move_obj_to_gpu(vma[i]->obj, rq, i); > - if (unlikely(err)) > - goto out_request; > - } > - > - for (i = 0; i < ARRAY_SIZE(vma); i++) { > - unsigned int flags = i ? EXEC_OBJECT_WRITE : 0; > - > - err = i915_vma_move_to_active(vma[i], rq, flags); > - if (unlikely(err)) > - goto out_request; > - } > - > - if (rq->engine->emit_init_breadcrumb) { > - err = rq->engine->emit_init_breadcrumb(rq); > - if (unlikely(err)) > - goto out_request; > - } > - > - err = rq->engine->emit_bb_start(rq, > - batch->node.start, batch->node.size, > - 0); > - > -out_request: > - if (unlikely(err)) > - i915_request_set_error_once(rq, err); > - > - i915_request_add(rq); > -out_batch: > - intel_emit_vma_release(ce, batch); > -out_unpin_dst: > - i915_vma_unpin(vma[1]); > -out_unpin_src: > - i915_vma_unpin(vma[0]); > -out_ctx: > - intel_context_unpin(ce); > -out: > - if (err == -EDEADLK) { > - err = i915_gem_ww_ctx_backoff(&ww); > - if (!err) > - goto retry; > - } > - i915_gem_ww_ctx_fini(&ww); > - intel_engine_pm_put(ce->engine); > - return err; > -} > - > -#if IS_ENABLED(CONFIG_DRM_I915_SELFTEST) > -#include "selftests/i915_gem_object_blt.c" > -#endif > diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object_blt.h b/drivers/gpu/drm/i915/gem/i915_gem_object_blt.h > deleted file mode 100644 > index 2409fdcccf0e..000000000000 > --- a/drivers/gpu/drm/i915/gem/i915_gem_object_blt.h > +++ /dev/null > @@ -1,39 +0,0 @@ > -/* SPDX-License-Identifier: MIT */ > -/* > - * Copyright © 2019 Intel Corporation > - */ > - > -#ifndef __I915_GEM_OBJECT_BLT_H__ > -#define __I915_GEM_OBJECT_BLT_H__ > - > -#include > - > -#include "gt/intel_context.h" > -#include "gt/intel_engine_pm.h" > -#include "i915_vma.h" > - > -struct drm_i915_gem_object; > -struct i915_gem_ww_ctx; > - > -struct i915_vma *intel_emit_vma_fill_blt(struct intel_context *ce, > - struct i915_vma *vma, > - struct i915_gem_ww_ctx *ww, > - u32 value); > - > -struct i915_vma *intel_emit_vma_copy_blt(struct intel_context *ce, > - struct i915_gem_ww_ctx *ww, > - struct i915_vma *src, > - struct i915_vma *dst); > - > -int intel_emit_vma_mark_active(struct i915_vma *vma, struct i915_request *rq); > -void intel_emit_vma_release(struct intel_context *ce, struct i915_vma *vma); > - > -int i915_gem_object_fill_blt(struct drm_i915_gem_object *obj, > - struct intel_context *ce, > - u32 value); > - > -int i915_gem_object_copy_blt(struct drm_i915_gem_object *src, > - struct drm_i915_gem_object *dst, > - struct intel_context *ce); > - > -#endif > diff --git a/drivers/gpu/drm/i915/gem/selftests/i915_gem_object_blt.c b/drivers/gpu/drm/i915/gem/selftests/i915_gem_object_blt.c > deleted file mode 100644 > index 8c335d1a8406..000000000000 > --- a/drivers/gpu/drm/i915/gem/selftests/i915_gem_object_blt.c > +++ /dev/null > @@ -1,597 +0,0 @@ > -// SPDX-License-Identifier: MIT > -/* > - * Copyright © 2019 Intel Corporation > - */ > - > -#include > - > -#include "gt/intel_gt.h" > -#include "gt/intel_engine_user.h" > - > -#include "i915_selftest.h" > - > -#include "gem/i915_gem_context.h" > -#include "selftests/igt_flush_test.h" > -#include "selftests/i915_random.h" > -#include "selftests/mock_drm.h" > -#include "huge_gem_object.h" > -#include "mock_context.h" > - > -static int wrap_ktime_compare(const void *A, const void *B) > -{ > - const ktime_t *a = A, *b = B; > - > - return ktime_compare(*a, *b); > -} > - > -static int __perf_fill_blt(struct drm_i915_gem_object *obj) > -{ > - struct drm_i915_private *i915 = to_i915(obj->base.dev); > - int inst = 0; > - > - do { > - struct intel_engine_cs *engine; > - ktime_t t[5]; > - int pass; > - int err; > - > - engine = intel_engine_lookup_user(i915, > - I915_ENGINE_CLASS_COPY, > - inst++); > - if (!engine) > - return 0; > - > - intel_engine_pm_get(engine); > - for (pass = 0; pass < ARRAY_SIZE(t); pass++) { > - struct intel_context *ce = engine->kernel_context; > - ktime_t t0, t1; > - > - t0 = ktime_get(); > - > - err = i915_gem_object_fill_blt(obj, ce, 0); > - if (err) > - break; > - > - err = i915_gem_object_wait(obj, > - I915_WAIT_ALL, > - MAX_SCHEDULE_TIMEOUT); > - if (err) > - break; > - > - t1 = ktime_get(); > - t[pass] = ktime_sub(t1, t0); > - } > - intel_engine_pm_put(engine); > - if (err) > - return err; > - > - sort(t, ARRAY_SIZE(t), sizeof(*t), wrap_ktime_compare, NULL); > - pr_info("%s: blt %zd KiB fill: %lld MiB/s\n", > - engine->name, > - obj->base.size >> 10, > - div64_u64(mul_u32_u32(4 * obj->base.size, > - 1000 * 1000 * 1000), > - t[1] + 2 * t[2] + t[3]) >> 20); > - } while (1); > -} > - > -static int perf_fill_blt(void *arg) > -{ > - struct drm_i915_private *i915 = arg; > - static const unsigned long sizes[] = { > - SZ_4K, > - SZ_64K, > - SZ_2M, > - SZ_64M > - }; > - int i; > - > - for (i = 0; i < ARRAY_SIZE(sizes); i++) { > - struct drm_i915_gem_object *obj; > - int err; > - > - obj = i915_gem_object_create_internal(i915, sizes[i]); > - if (IS_ERR(obj)) > - return PTR_ERR(obj); > - > - err = __perf_fill_blt(obj); > - i915_gem_object_put(obj); > - if (err) > - return err; > - } > - > - return 0; > -} > - > -static int __perf_copy_blt(struct drm_i915_gem_object *src, > - struct drm_i915_gem_object *dst) > -{ > - struct drm_i915_private *i915 = to_i915(src->base.dev); > - int inst = 0; > - > - do { > - struct intel_engine_cs *engine; > - ktime_t t[5]; > - int pass; > - int err = 0; > - > - engine = intel_engine_lookup_user(i915, > - I915_ENGINE_CLASS_COPY, > - inst++); > - if (!engine) > - return 0; > - > - intel_engine_pm_get(engine); > - for (pass = 0; pass < ARRAY_SIZE(t); pass++) { > - struct intel_context *ce = engine->kernel_context; > - ktime_t t0, t1; > - > - t0 = ktime_get(); > - > - err = i915_gem_object_copy_blt(src, dst, ce); > - if (err) > - break; > - > - err = i915_gem_object_wait(dst, > - I915_WAIT_ALL, > - MAX_SCHEDULE_TIMEOUT); > - if (err) > - break; > - > - t1 = ktime_get(); > - t[pass] = ktime_sub(t1, t0); > - } > - intel_engine_pm_put(engine); > - if (err) > - return err; > - > - sort(t, ARRAY_SIZE(t), sizeof(*t), wrap_ktime_compare, NULL); > - pr_info("%s: blt %zd KiB copy: %lld MiB/s\n", > - engine->name, > - src->base.size >> 10, > - div64_u64(mul_u32_u32(4 * src->base.size, > - 1000 * 1000 * 1000), > - t[1] + 2 * t[2] + t[3]) >> 20); > - } while (1); > -} > - > -static int perf_copy_blt(void *arg) > -{ > - struct drm_i915_private *i915 = arg; > - static const unsigned long sizes[] = { > - SZ_4K, > - SZ_64K, > - SZ_2M, > - SZ_64M > - }; > - int i; > - > - for (i = 0; i < ARRAY_SIZE(sizes); i++) { > - struct drm_i915_gem_object *src, *dst; > - int err; > - > - src = i915_gem_object_create_internal(i915, sizes[i]); > - if (IS_ERR(src)) > - return PTR_ERR(src); > - > - dst = i915_gem_object_create_internal(i915, sizes[i]); > - if (IS_ERR(dst)) { > - err = PTR_ERR(dst); > - goto err_src; > - } > - > - err = __perf_copy_blt(src, dst); > - > - i915_gem_object_put(dst); > -err_src: > - i915_gem_object_put(src); > - if (err) > - return err; > - } > - > - return 0; > -} > - > -struct igt_thread_arg { > - struct intel_engine_cs *engine; > - struct i915_gem_context *ctx; > - struct file *file; > - struct rnd_state prng; > - unsigned int n_cpus; > -}; > - > -static int igt_fill_blt_thread(void *arg) > -{ > - struct igt_thread_arg *thread = arg; > - struct intel_engine_cs *engine = thread->engine; > - struct rnd_state *prng = &thread->prng; > - struct drm_i915_gem_object *obj; > - struct i915_gem_context *ctx; > - struct intel_context *ce; > - unsigned int prio; > - IGT_TIMEOUT(end); > - u64 total, max; > - int err; > - > - ctx = thread->ctx; > - if (!ctx) { > - ctx = live_context_for_engine(engine, thread->file); > - if (IS_ERR(ctx)) > - return PTR_ERR(ctx); > - > - prio = i915_prandom_u32_max_state(I915_PRIORITY_MAX, prng); > - ctx->sched.priority = prio; > - } > - > - ce = i915_gem_context_get_engine(ctx, 0); > - GEM_BUG_ON(IS_ERR(ce)); > - > - /* > - * If we have a tiny shared address space, like for the GGTT > - * then we can't be too greedy. > - */ > - max = ce->vm->total; > - if (i915_is_ggtt(ce->vm) || thread->ctx) > - max = div_u64(max, thread->n_cpus); > - max >>= 4; > - > - total = PAGE_SIZE; > - do { > - /* Aim to keep the runtime under reasonable bounds! */ > - const u32 max_phys_size = SZ_64K; > - u32 val = prandom_u32_state(prng); > - u32 phys_sz; > - u32 sz; > - u32 *vaddr; > - u32 i; > - > - total = min(total, max); > - sz = i915_prandom_u32_max_state(total, prng) + 1; > - phys_sz = sz % max_phys_size + 1; > - > - sz = round_up(sz, PAGE_SIZE); > - phys_sz = round_up(phys_sz, PAGE_SIZE); > - phys_sz = min(phys_sz, sz); > - > - pr_debug("%s with phys_sz= %x, sz=%x, val=%x\n", __func__, > - phys_sz, sz, val); > - > - obj = huge_gem_object(engine->i915, phys_sz, sz); > - if (IS_ERR(obj)) { > - err = PTR_ERR(obj); > - goto err_flush; > - } > - > - vaddr = i915_gem_object_pin_map_unlocked(obj, I915_MAP_WB); > - if (IS_ERR(vaddr)) { > - err = PTR_ERR(vaddr); > - goto err_put; > - } > - > - /* > - * Make sure the potentially async clflush does its job, if > - * required. > - */ > - memset32(vaddr, val ^ 0xdeadbeaf, > - huge_gem_object_phys_size(obj) / sizeof(u32)); > - > - if (!(obj->cache_coherent & I915_BO_CACHE_COHERENT_FOR_WRITE)) > - obj->cache_dirty = true; > - > - err = i915_gem_object_fill_blt(obj, ce, val); > - if (err) > - goto err_unpin; > - > - err = i915_gem_object_wait(obj, 0, MAX_SCHEDULE_TIMEOUT); > - if (err) > - goto err_unpin; > - > - for (i = 0; i < huge_gem_object_phys_size(obj) / sizeof(u32); i += 17) { > - if (!(obj->cache_coherent & I915_BO_CACHE_COHERENT_FOR_READ)) > - drm_clflush_virt_range(&vaddr[i], sizeof(vaddr[i])); > - > - if (vaddr[i] != val) { > - pr_err("vaddr[%u]=%x, expected=%x\n", i, > - vaddr[i], val); > - err = -EINVAL; > - goto err_unpin; > - } > - } > - > - i915_gem_object_unpin_map(obj); > - i915_gem_object_put(obj); > - > - total <<= 1; > - } while (!time_after(jiffies, end)); > - > - goto err_flush; > - > -err_unpin: > - i915_gem_object_unpin_map(obj); > -err_put: > - i915_gem_object_put(obj); > -err_flush: > - if (err == -ENOMEM) > - err = 0; > - > - intel_context_put(ce); > - return err; > -} > - > -static int igt_copy_blt_thread(void *arg) > -{ > - struct igt_thread_arg *thread = arg; > - struct intel_engine_cs *engine = thread->engine; > - struct rnd_state *prng = &thread->prng; > - struct drm_i915_gem_object *src, *dst; > - struct i915_gem_context *ctx; > - struct intel_context *ce; > - unsigned int prio; > - IGT_TIMEOUT(end); > - u64 total, max; > - int err; > - > - ctx = thread->ctx; > - if (!ctx) { > - ctx = live_context_for_engine(engine, thread->file); > - if (IS_ERR(ctx)) > - return PTR_ERR(ctx); > - > - prio = i915_prandom_u32_max_state(I915_PRIORITY_MAX, prng); > - ctx->sched.priority = prio; > - } > - > - ce = i915_gem_context_get_engine(ctx, 0); > - GEM_BUG_ON(IS_ERR(ce)); > - > - /* > - * If we have a tiny shared address space, like for the GGTT > - * then we can't be too greedy. > - */ > - max = ce->vm->total; > - if (i915_is_ggtt(ce->vm) || thread->ctx) > - max = div_u64(max, thread->n_cpus); > - max >>= 4; > - > - total = PAGE_SIZE; > - do { > - /* Aim to keep the runtime under reasonable bounds! */ > - const u32 max_phys_size = SZ_64K; > - u32 val = prandom_u32_state(prng); > - u32 phys_sz; > - u32 sz; > - u32 *vaddr; > - u32 i; > - > - total = min(total, max); > - sz = i915_prandom_u32_max_state(total, prng) + 1; > - phys_sz = sz % max_phys_size + 1; > - > - sz = round_up(sz, PAGE_SIZE); > - phys_sz = round_up(phys_sz, PAGE_SIZE); > - phys_sz = min(phys_sz, sz); > - > - pr_debug("%s with phys_sz= %x, sz=%x, val=%x\n", __func__, > - phys_sz, sz, val); > - > - src = huge_gem_object(engine->i915, phys_sz, sz); > - if (IS_ERR(src)) { > - err = PTR_ERR(src); > - goto err_flush; > - } > - > - vaddr = i915_gem_object_pin_map_unlocked(src, I915_MAP_WB); > - if (IS_ERR(vaddr)) { > - err = PTR_ERR(vaddr); > - goto err_put_src; > - } > - > - memset32(vaddr, val, > - huge_gem_object_phys_size(src) / sizeof(u32)); > - > - i915_gem_object_unpin_map(src); > - > - if (!(src->cache_coherent & I915_BO_CACHE_COHERENT_FOR_READ)) > - src->cache_dirty = true; > - > - dst = huge_gem_object(engine->i915, phys_sz, sz); > - if (IS_ERR(dst)) { > - err = PTR_ERR(dst); > - goto err_put_src; > - } > - > - vaddr = i915_gem_object_pin_map_unlocked(dst, I915_MAP_WB); > - if (IS_ERR(vaddr)) { > - err = PTR_ERR(vaddr); > - goto err_put_dst; > - } > - > - memset32(vaddr, val ^ 0xdeadbeaf, > - huge_gem_object_phys_size(dst) / sizeof(u32)); > - > - if (!(dst->cache_coherent & I915_BO_CACHE_COHERENT_FOR_WRITE)) > - dst->cache_dirty = true; > - > - err = i915_gem_object_copy_blt(src, dst, ce); > - if (err) > - goto err_unpin; > - > - err = i915_gem_object_wait(dst, 0, MAX_SCHEDULE_TIMEOUT); > - if (err) > - goto err_unpin; > - > - for (i = 0; i < huge_gem_object_phys_size(dst) / sizeof(u32); i += 17) { > - if (!(dst->cache_coherent & I915_BO_CACHE_COHERENT_FOR_READ)) > - drm_clflush_virt_range(&vaddr[i], sizeof(vaddr[i])); > - > - if (vaddr[i] != val) { > - pr_err("vaddr[%u]=%x, expected=%x\n", i, > - vaddr[i], val); > - err = -EINVAL; > - goto err_unpin; > - } > - } > - > - i915_gem_object_unpin_map(dst); > - > - i915_gem_object_put(src); > - i915_gem_object_put(dst); > - > - total <<= 1; > - } while (!time_after(jiffies, end)); > - > - goto err_flush; > - > -err_unpin: > - i915_gem_object_unpin_map(dst); > -err_put_dst: > - i915_gem_object_put(dst); > -err_put_src: > - i915_gem_object_put(src); > -err_flush: > - if (err == -ENOMEM) > - err = 0; > - > - intel_context_put(ce); > - return err; > -} > - > -static int igt_threaded_blt(struct intel_engine_cs *engine, > - int (*blt_fn)(void *arg), > - unsigned int flags) > -#define SINGLE_CTX BIT(0) > -{ > - struct igt_thread_arg *thread; > - struct task_struct **tsk; > - unsigned int n_cpus, i; > - I915_RND_STATE(prng); > - int err = 0; > - > - n_cpus = num_online_cpus() + 1; > - > - tsk = kcalloc(n_cpus, sizeof(struct task_struct *), GFP_KERNEL); > - if (!tsk) > - return 0; > - > - thread = kcalloc(n_cpus, sizeof(struct igt_thread_arg), GFP_KERNEL); > - if (!thread) > - goto out_tsk; > - > - thread[0].file = mock_file(engine->i915); > - if (IS_ERR(thread[0].file)) { > - err = PTR_ERR(thread[0].file); > - goto out_thread; > - } > - > - if (flags & SINGLE_CTX) { > - thread[0].ctx = live_context_for_engine(engine, thread[0].file); > - if (IS_ERR(thread[0].ctx)) { > - err = PTR_ERR(thread[0].ctx); > - goto out_file; > - } > - } > - > - for (i = 0; i < n_cpus; ++i) { > - thread[i].engine = engine; > - thread[i].file = thread[0].file; > - thread[i].ctx = thread[0].ctx; > - thread[i].n_cpus = n_cpus; > - thread[i].prng = > - I915_RND_STATE_INITIALIZER(prandom_u32_state(&prng)); > - > - tsk[i] = kthread_run(blt_fn, &thread[i], "igt/blt-%d", i); > - if (IS_ERR(tsk[i])) { > - err = PTR_ERR(tsk[i]); > - break; > - } > - > - get_task_struct(tsk[i]); > - } > - > - yield(); /* start all threads before we kthread_stop() */ > - > - for (i = 0; i < n_cpus; ++i) { > - int status; > - > - if (IS_ERR_OR_NULL(tsk[i])) > - continue; > - > - status = kthread_stop(tsk[i]); > - if (status && !err) > - err = status; > - > - put_task_struct(tsk[i]); > - } > - > -out_file: > - fput(thread[0].file); > -out_thread: > - kfree(thread); > -out_tsk: > - kfree(tsk); > - return err; > -} > - > -static int test_copy_engines(struct drm_i915_private *i915, > - int (*fn)(void *arg), > - unsigned int flags) > -{ > - struct intel_engine_cs *engine; > - int ret; > - > - for_each_uabi_class_engine(engine, I915_ENGINE_CLASS_COPY, i915) { > - ret = igt_threaded_blt(engine, fn, flags); > - if (ret) > - return ret; > - } > - > - return 0; > -} > - > -static int igt_fill_blt(void *arg) > -{ > - return test_copy_engines(arg, igt_fill_blt_thread, 0); > -} > - > -static int igt_fill_blt_ctx0(void *arg) > -{ > - return test_copy_engines(arg, igt_fill_blt_thread, SINGLE_CTX); > -} > - > -static int igt_copy_blt(void *arg) > -{ > - return test_copy_engines(arg, igt_copy_blt_thread, 0); > -} > - > -static int igt_copy_blt_ctx0(void *arg) > -{ > - return test_copy_engines(arg, igt_copy_blt_thread, SINGLE_CTX); > -} > - > -int i915_gem_object_blt_live_selftests(struct drm_i915_private *i915) > -{ > - static const struct i915_subtest tests[] = { > - SUBTEST(igt_fill_blt), > - SUBTEST(igt_fill_blt_ctx0), > - SUBTEST(igt_copy_blt), > - SUBTEST(igt_copy_blt_ctx0), > - }; > - > - if (intel_gt_is_wedged(&i915->gt)) > - return 0; > - > - return i915_live_subtests(tests, i915); > -} > - > -int i915_gem_object_blt_perf_selftests(struct drm_i915_private *i915) > -{ > - static const struct i915_subtest tests[] = { > - SUBTEST(perf_fill_blt), > - SUBTEST(perf_copy_blt), > - }; > - > - if (intel_gt_is_wedged(&i915->gt)) > - return 0; > - > - return i915_live_subtests(tests, i915); > -} > diff --git a/drivers/gpu/drm/i915/selftests/i915_live_selftests.h b/drivers/gpu/drm/i915/selftests/i915_live_selftests.h > index 6f5893ecd549..1ae3f8039d68 100644 > --- a/drivers/gpu/drm/i915/selftests/i915_live_selftests.h > +++ b/drivers/gpu/drm/i915/selftests/i915_live_selftests.h > @@ -39,7 +39,6 @@ selftest(evict, i915_gem_evict_live_selftests) > selftest(hugepages, i915_gem_huge_page_live_selftests) > selftest(gem_contexts, i915_gem_context_live_selftests) > selftest(gem_execbuf, i915_gem_execbuffer_live_selftests) > -selftest(blt, i915_gem_object_blt_live_selftests) > selftest(reset, intel_reset_live_selftests) > selftest(memory_region, intel_memory_region_live_selftests) > selftest(hangcheck, intel_hangcheck_live_selftests) > diff --git a/drivers/gpu/drm/i915/selftests/i915_perf_selftests.h b/drivers/gpu/drm/i915/selftests/i915_perf_selftests.h > index 5077dc3c3b8c..058450d351f7 100644 > --- a/drivers/gpu/drm/i915/selftests/i915_perf_selftests.h > +++ b/drivers/gpu/drm/i915/selftests/i915_perf_selftests.h > @@ -18,5 +18,4 @@ > selftest(engine_cs, intel_engine_cs_perf_selftests) > selftest(request, i915_request_perf_selftests) > selftest(migrate, intel_migrate_perf_selftests) > -selftest(blt, i915_gem_object_blt_perf_selftests) > selftest(region, intel_memory_region_perf_selftests) > diff --git a/drivers/gpu/drm/i915/selftests/intel_memory_region.c b/drivers/gpu/drm/i915/selftests/intel_memory_region.c > index c85d516b85cd..2e18f3a3d538 100644 > --- a/drivers/gpu/drm/i915/selftests/intel_memory_region.c > +++ b/drivers/gpu/drm/i915/selftests/intel_memory_region.c > @@ -15,11 +15,12 @@ > #include "gem/i915_gem_context.h" > #include "gem/i915_gem_lmem.h" > #include "gem/i915_gem_region.h" > -#include "gem/i915_gem_object_blt.h" > #include "gem/selftests/igt_gem_utils.h" > #include "gem/selftests/mock_context.h" > +#include "gt/intel_engine_pm.h" > #include "gt/intel_engine_user.h" > #include "gt/intel_gt.h" > +#include "gt/intel_migrate.h" > #include "i915_memcpy.h" > #include "selftests/igt_flush_test.h" > #include "selftests/i915_random.h" > @@ -741,6 +742,7 @@ static int igt_lmem_write_cpu(void *arg) > PAGE_SIZE - 64, > }; > struct intel_engine_cs *engine; > + struct i915_request *rq; > u32 *vaddr; > u32 sz; > u32 i; > @@ -767,15 +769,20 @@ static int igt_lmem_write_cpu(void *arg) > goto out_put; > } > > + i915_gem_object_lock(obj, NULL); > /* Put the pages into a known state -- from the gpu for added fun */ > intel_engine_pm_get(engine); > - err = i915_gem_object_fill_blt(obj, engine->kernel_context, 0xdeadbeaf); > - intel_engine_pm_put(engine); > - if (err) > - goto out_unpin; > + err = intel_context_migrate_clear(engine->gt->migrate.context, NULL, > + obj->mm.pages->sgl, I915_CACHE_NONE, > + true, 0xdeadbeaf, &rq); > + if (rq) { > + dma_resv_add_excl_fence(obj->base.resv, &rq->fence); > + i915_request_put(rq); > + } > > - i915_gem_object_lock(obj, NULL); > - err = i915_gem_object_set_to_wc_domain(obj, true); > + intel_engine_pm_put(engine); > + if (!err) > + err = i915_gem_object_set_to_wc_domain(obj, true); > i915_gem_object_unlock(obj); > if (err) > goto out_unpin; > 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.7 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,NICE_REPLY_A,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_SANE_1 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 5997FC2B9F4 for ; Mon, 14 Jun 2021 16:43:39 +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 20DE36108E for ; Mon, 14 Jun 2021 16:43:39 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 20DE36108E Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=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 B87068999A; Mon, 14 Jun 2021 16:43:38 +0000 (UTC) Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) by gabe.freedesktop.org (Postfix) with ESMTPS id 2553A8999A; Mon, 14 Jun 2021 16:43:37 +0000 (UTC) IronPort-SDR: gffuSVJ5wlrD44CmpLsCNreciqLPBjCguAVkBoib1CFDQDQMeacAd/xC1kiD3ty0R9okV0iUV5 9aLH5jp7D04Q== X-IronPort-AV: E=McAfee;i="6200,9189,10015"; a="266990582" X-IronPort-AV: E=Sophos;i="5.83,273,1616482800"; d="scan'208";a="266990582" Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by orsmga104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 14 Jun 2021 09:43:32 -0700 IronPort-SDR: ZAQK9s1fsFDhYjg1IIS6BgTot2YFm6s2pVNa3KbUPnopQST4/ZRaFPd0eACiKCthNWB+T7i+Yu 8Ao95GuoWHYw== X-IronPort-AV: E=Sophos;i="5.83,273,1616482800"; d="scan'208";a="554165852" Received: from chanily-mobl.ger.corp.intel.com (HELO [10.252.31.39]) ([10.252.31.39]) by fmsmga001-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 14 Jun 2021 09:43:31 -0700 To: =?UTF-8?Q?Thomas_Hellstr=c3=b6m?= , intel-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org References: <20210614162612.294869-1-thomas.hellstrom@linux.intel.com> <20210614162612.294869-13-thomas.hellstrom@linux.intel.com> From: Matthew Auld Message-ID: <39a3730e-ca93-aaaf-5475-9b19f5c50d42@intel.com> Date: Mon, 14 Jun 2021 17:43:29 +0100 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: <20210614162612.294869-13-thomas.hellstrom@linux.intel.com> Content-Language: en-GB Subject: Re: [Intel-gfx] [PATCH v3 12/12] drm/i915/gem: Zap the i915_gem_object_blt code 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" T24gMTQvMDYvMjAyMSAxNzoyNiwgVGhvbWFzIEhlbGxzdHLDtm0gd3JvdGU6Cj4gSXQncyB1bnVz ZWQgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIHNlbGZ0ZXN0LiBSZXBsYWNlIGEgY2FsbCBpbiB0aGUK PiBtZW1vcnlfcmVnaW9uIGxpdmUgc2VsZnRlc3Qgd2l0aCBhIGNhbGwgaW50byBhIGNvcnJlc3Bv bmRpbmcKPiBmdW5jdGlvbiBpbiB0aGUgbmV3IG1pZ3JhdGUgY29kZS4KCkkgZ3Vlc3Mgd2UgZG8g bG9zZSBzb21lIGNvdmVyYWdlIGFyb3VuZCBibGl0dGluZyBtYXNzaXZlbHkgc2l6ZWQgR0VNIApv YmplY3RzIHVzaW5nIHRoZSBodWdlX2dlbV9vYmplY3QgdHJpY2tzLgoKUmV2aWV3ZWQtYnk6IE1h dHRoZXcgQXVsZCA8bWF0dGhldy5hdWxkQGludGVsLmNvbT4KCj4gCj4gU2lnbmVkLW9mZi1ieTog VGhvbWFzIEhlbGxzdHLDtm0gPHRob21hcy5oZWxsc3Ryb21AbGludXguaW50ZWwuY29tPgo+IC0t LQo+ICAgZHJpdmVycy9ncHUvZHJtL2k5MTUvTWFrZWZpbGUgICAgICAgICAgICAgICAgIHwgICAx IC0KPiAgIC4uLi9ncHUvZHJtL2k5MTUvZ2VtL2k5MTVfZ2VtX29iamVjdF9ibHQuYyAgICB8IDQ2 MSAtLS0tLS0tLS0tLS0tLQo+ICAgLi4uL2dwdS9kcm0vaTkxNS9nZW0vaTkxNV9nZW1fb2JqZWN0 X2JsdC5oICAgIHwgIDM5IC0tCj4gICAuLi4vaTkxNS9nZW0vc2VsZnRlc3RzL2k5MTVfZ2VtX29i amVjdF9ibHQuYyAgfCA1OTcgLS0tLS0tLS0tLS0tLS0tLS0tCj4gICAuLi4vZHJtL2k5MTUvc2Vs ZnRlc3RzL2k5MTVfbGl2ZV9zZWxmdGVzdHMuaCAgfCAgIDEgLQo+ICAgLi4uL2RybS9pOTE1L3Nl bGZ0ZXN0cy9pOTE1X3BlcmZfc2VsZnRlc3RzLmggIHwgICAxIC0KPiAgIC4uLi9kcm0vaTkxNS9z ZWxmdGVzdHMvaW50ZWxfbWVtb3J5X3JlZ2lvbi5jICB8ICAyMSArLQo+ICAgNyBmaWxlcyBjaGFu Z2VkLCAxNCBpbnNlcnRpb25zKCspLCAxMTA3IGRlbGV0aW9ucygtKQo+ICAgZGVsZXRlIG1vZGUg MTAwNjQ0IGRyaXZlcnMvZ3B1L2RybS9pOTE1L2dlbS9pOTE1X2dlbV9vYmplY3RfYmx0LmMKPiAg IGRlbGV0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dwdS9kcm0vaTkxNS9nZW0vaTkxNV9nZW1fb2Jq ZWN0X2JsdC5oCj4gICBkZWxldGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL2k5MTUvZ2Vt L3NlbGZ0ZXN0cy9pOTE1X2dlbV9vYmplY3RfYmx0LmMKPiAKPiBkaWZmIC0tZ2l0IGEvZHJpdmVy cy9ncHUvZHJtL2k5MTUvTWFrZWZpbGUgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9NYWtlZmlsZQo+ IGluZGV4IGNhMDc0NzRlYzJkZi4uMTMwODVhYzc4YzYzIDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMv Z3B1L2RybS9pOTE1L01ha2VmaWxlCj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvTWFrZWZp bGUKPiBAQCAtMTQzLDcgKzE0Myw2IEBAIGdlbS15ICs9IFwKPiAgIAlnZW0vaTkxNV9nZW1fZXhl Y2J1ZmZlci5vIFwKPiAgIAlnZW0vaTkxNV9nZW1faW50ZXJuYWwubyBcCj4gICAJZ2VtL2k5MTVf Z2VtX29iamVjdC5vIFwKPiAtCWdlbS9pOTE1X2dlbV9vYmplY3RfYmx0Lm8gXAo+ICAgCWdlbS9p OTE1X2dlbV9sbWVtLm8gXAo+ICAgCWdlbS9pOTE1X2dlbV9tbWFuLm8gXAo+ICAgCWdlbS9pOTE1 X2dlbV9wYWdlcy5vIFwKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ2VtL2k5 MTVfZ2VtX29iamVjdF9ibHQuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2dlbS9pOTE1X2dlbV9v YmplY3RfYmx0LmMKPiBkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKPiBpbmRleCAzZTI4YzY4ZmRh M2UuLjAwMDAwMDAwMDAwMAo+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2dlbS9pOTE1X2dl bV9vYmplY3RfYmx0LmMKPiArKysgL2Rldi9udWxsCj4gQEAgLTEsNDYxICswLDAgQEAKPiAtLy8g U1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVAo+IC0vKgo+IC0gKiBDb3B5cmlnaHQgwqkgMjAx OSBJbnRlbCBDb3Jwb3JhdGlvbgo+IC0gKi8KPiAtCj4gLSNpbmNsdWRlICJpOTE1X2Rydi5oIgo+ IC0jaW5jbHVkZSAiZ3QvaW50ZWxfY29udGV4dC5oIgo+IC0jaW5jbHVkZSAiZ3QvaW50ZWxfZW5n aW5lX3BtLmgiCj4gLSNpbmNsdWRlICJndC9pbnRlbF9ncHVfY29tbWFuZHMuaCIKPiAtI2luY2x1 ZGUgImd0L2ludGVsX2d0LmgiCj4gLSNpbmNsdWRlICJndC9pbnRlbF9ndF9idWZmZXJfcG9vbC5o Igo+IC0jaW5jbHVkZSAiZ3QvaW50ZWxfcmluZy5oIgo+IC0jaW5jbHVkZSAiaTkxNV9nZW1fY2xm bHVzaC5oIgo+IC0jaW5jbHVkZSAiaTkxNV9nZW1fb2JqZWN0X2JsdC5oIgo+IC0KPiAtc3RydWN0 IGk5MTVfdm1hICppbnRlbF9lbWl0X3ZtYV9maWxsX2JsdChzdHJ1Y3QgaW50ZWxfY29udGV4dCAq Y2UsCj4gLQkJCQkJIHN0cnVjdCBpOTE1X3ZtYSAqdm1hLAo+IC0JCQkJCSBzdHJ1Y3QgaTkxNV9n ZW1fd3dfY3R4ICp3dywKPiAtCQkJCQkgdTMyIHZhbHVlKQo+IC17Cj4gLQlzdHJ1Y3QgZHJtX2k5 MTVfcHJpdmF0ZSAqaTkxNSA9IGNlLT52bS0+aTkxNTsKPiAtCWNvbnN0IHUzMiBibG9ja19zaXpl ID0gU1pfOE07IC8qIH4xbXMgYXQgOEdpQi9zIHByZWVtcHRpb24gZGVsYXkgKi8KPiAtCXN0cnVj dCBpbnRlbF9ndF9idWZmZXJfcG9vbF9ub2RlICpwb29sOwo+IC0Jc3RydWN0IGk5MTVfdm1hICpi YXRjaDsKPiAtCXU2NCBvZmZzZXQ7Cj4gLQl1NjQgY291bnQ7Cj4gLQl1NjQgcmVtOwo+IC0JdTMy IHNpemU7Cj4gLQl1MzIgKmNtZDsKPiAtCWludCBlcnI7Cj4gLQo+IC0JR0VNX0JVR19PTihpbnRl bF9lbmdpbmVfaXNfdmlydHVhbChjZS0+ZW5naW5lKSk7Cj4gLQlpbnRlbF9lbmdpbmVfcG1fZ2V0 KGNlLT5lbmdpbmUpOwo+IC0KPiAtCWNvdW50ID0gZGl2X3U2NChyb3VuZF91cCh2bWEtPnNpemUs IGJsb2NrX3NpemUpLCBibG9ja19zaXplKTsKPiAtCXNpemUgPSAoMSArIDggKiBjb3VudCkgKiBz aXplb2YodTMyKTsKPiAtCXNpemUgPSByb3VuZF91cChzaXplLCBQQUdFX1NJWkUpOwo+IC0JcG9v bCA9IGludGVsX2d0X2dldF9idWZmZXJfcG9vbChjZS0+ZW5naW5lLT5ndCwgc2l6ZSwgSTkxNV9N QVBfV0MpOwo+IC0JaWYgKElTX0VSUihwb29sKSkgewo+IC0JCWVyciA9IFBUUl9FUlIocG9vbCk7 Cj4gLQkJZ290byBvdXRfcG07Cj4gLQl9Cj4gLQo+IC0JZXJyID0gaTkxNV9nZW1fb2JqZWN0X2xv Y2socG9vbC0+b2JqLCB3dyk7Cj4gLQlpZiAoZXJyKQo+IC0JCWdvdG8gb3V0X3B1dDsKPiAtCj4g LQliYXRjaCA9IGk5MTVfdm1hX2luc3RhbmNlKHBvb2wtPm9iaiwgY2UtPnZtLCBOVUxMKTsKPiAt CWlmIChJU19FUlIoYmF0Y2gpKSB7Cj4gLQkJZXJyID0gUFRSX0VSUihiYXRjaCk7Cj4gLQkJZ290 byBvdXRfcHV0Owo+IC0JfQo+IC0KPiAtCWVyciA9IGk5MTVfdm1hX3Bpbl93dyhiYXRjaCwgd3cs IDAsIDAsIFBJTl9VU0VSKTsKPiAtCWlmICh1bmxpa2VseShlcnIpKQo+IC0JCWdvdG8gb3V0X3B1 dDsKPiAtCj4gLQkvKiB3ZSBwaW5uZWQgdGhlIHBvb2wsIG1hcmsgaXQgYXMgc3VjaCAqLwo+IC0J aW50ZWxfZ3RfYnVmZmVyX3Bvb2xfbWFya191c2VkKHBvb2wpOwo+IC0KPiAtCWNtZCA9IGk5MTVf Z2VtX29iamVjdF9waW5fbWFwKHBvb2wtPm9iaiwgcG9vbC0+dHlwZSk7Cj4gLQlpZiAoSVNfRVJS KGNtZCkpIHsKPiAtCQllcnIgPSBQVFJfRVJSKGNtZCk7Cj4gLQkJZ290byBvdXRfdW5waW47Cj4g LQl9Cj4gLQo+IC0JcmVtID0gdm1hLT5zaXplOwo+IC0Jb2Zmc2V0ID0gdm1hLT5ub2RlLnN0YXJ0 Owo+IC0KPiAtCWRvIHsKPiAtCQl1MzIgc2l6ZSA9IG1pbl90KHU2NCwgcmVtLCBibG9ja19zaXpl KTsKPiAtCj4gLQkJR0VNX0JVR19PTihzaXplID4+IFBBR0VfU0hJRlQgPiBTMTZfTUFYKTsKPiAt Cj4gLQkJaWYgKEdSQVBISUNTX1ZFUihpOTE1KSA+PSA4KSB7Cj4gLQkJCSpjbWQrKyA9IFhZX0NP TE9SX0JMVF9DTUQgfCBCTFRfV1JJVEVfUkdCQSB8ICg3IC0gMik7Cj4gLQkJCSpjbWQrKyA9IEJM VF9ERVBUSF8zMiB8IEJMVF9ST1BfQ09MT1JfQ09QWSB8IFBBR0VfU0laRTsKPiAtCQkJKmNtZCsr ID0gMDsKPiAtCQkJKmNtZCsrID0gc2l6ZSA+PiBQQUdFX1NISUZUIDw8IDE2IHwgUEFHRV9TSVpF IC8gNDsKPiAtCQkJKmNtZCsrID0gbG93ZXJfMzJfYml0cyhvZmZzZXQpOwo+IC0JCQkqY21kKysg PSB1cHBlcl8zMl9iaXRzKG9mZnNldCk7Cj4gLQkJCSpjbWQrKyA9IHZhbHVlOwo+IC0JCX0gZWxz ZSB7Cj4gLQkJCSpjbWQrKyA9IFhZX0NPTE9SX0JMVF9DTUQgfCBCTFRfV1JJVEVfUkdCQSB8ICg2 IC0gMik7Cj4gLQkJCSpjbWQrKyA9IEJMVF9ERVBUSF8zMiB8IEJMVF9ST1BfQ09MT1JfQ09QWSB8 IFBBR0VfU0laRTsKPiAtCQkJKmNtZCsrID0gMDsKPiAtCQkJKmNtZCsrID0gc2l6ZSA+PiBQQUdF X1NISUZUIDw8IDE2IHwgUEFHRV9TSVpFIC8gNDsKPiAtCQkJKmNtZCsrID0gb2Zmc2V0Owo+IC0J CQkqY21kKysgPSB2YWx1ZTsKPiAtCQl9Cj4gLQo+IC0JCS8qIEFsbG93IG91cnNlbHZlcyB0byBi ZSBwcmVlbXB0ZWQgaW4gYmV0d2VlbiBibG9ja3MuICovCj4gLQkJKmNtZCsrID0gTUlfQVJCX0NI RUNLOwo+IC0KPiAtCQlvZmZzZXQgKz0gc2l6ZTsKPiAtCQlyZW0gLT0gc2l6ZTsKPiAtCX0gd2hp bGUgKHJlbSk7Cj4gLQo+IC0JKmNtZCA9IE1JX0JBVENIX0JVRkZFUl9FTkQ7Cj4gLQo+IC0JaTkx NV9nZW1fb2JqZWN0X2ZsdXNoX21hcChwb29sLT5vYmopOwo+IC0JaTkxNV9nZW1fb2JqZWN0X3Vu cGluX21hcChwb29sLT5vYmopOwo+IC0KPiAtCWludGVsX2d0X2NoaXBzZXRfZmx1c2goY2UtPnZt LT5ndCk7Cj4gLQo+IC0JYmF0Y2gtPnByaXZhdGUgPSBwb29sOwo+IC0JcmV0dXJuIGJhdGNoOwo+ IC0KPiAtb3V0X3VucGluOgo+IC0JaTkxNV92bWFfdW5waW4oYmF0Y2gpOwo+IC1vdXRfcHV0Ogo+ IC0JaW50ZWxfZ3RfYnVmZmVyX3Bvb2xfcHV0KHBvb2wpOwo+IC1vdXRfcG06Cj4gLQlpbnRlbF9l bmdpbmVfcG1fcHV0KGNlLT5lbmdpbmUpOwo+IC0JcmV0dXJuIEVSUl9QVFIoZXJyKTsKPiAtfQo+ IC0KPiAtaW50IGludGVsX2VtaXRfdm1hX21hcmtfYWN0aXZlKHN0cnVjdCBpOTE1X3ZtYSAqdm1h LCBzdHJ1Y3QgaTkxNV9yZXF1ZXN0ICpycSkKPiAtewo+IC0JaW50IGVycjsKPiAtCj4gLQllcnIg PSBpOTE1X3JlcXVlc3RfYXdhaXRfb2JqZWN0KHJxLCB2bWEtPm9iaiwgZmFsc2UpOwo+IC0JaWYg KGVyciA9PSAwKQo+IC0JCWVyciA9IGk5MTVfdm1hX21vdmVfdG9fYWN0aXZlKHZtYSwgcnEsIDAp Owo+IC0JaWYgKHVubGlrZWx5KGVycikpCj4gLQkJcmV0dXJuIGVycjsKPiAtCj4gLQlyZXR1cm4g aW50ZWxfZ3RfYnVmZmVyX3Bvb2xfbWFya19hY3RpdmUodm1hLT5wcml2YXRlLCBycSk7Cj4gLX0K PiAtCj4gLXZvaWQgaW50ZWxfZW1pdF92bWFfcmVsZWFzZShzdHJ1Y3QgaW50ZWxfY29udGV4dCAq Y2UsIHN0cnVjdCBpOTE1X3ZtYSAqdm1hKQo+IC17Cj4gLQlpOTE1X3ZtYV91bnBpbih2bWEpOwo+ IC0JaW50ZWxfZ3RfYnVmZmVyX3Bvb2xfcHV0KHZtYS0+cHJpdmF0ZSk7Cj4gLQlpbnRlbF9lbmdp bmVfcG1fcHV0KGNlLT5lbmdpbmUpOwo+IC19Cj4gLQo+IC1zdGF0aWMgaW50Cj4gLW1vdmVfb2Jq X3RvX2dwdShzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLAo+IC0JCXN0cnVjdCBpOTE1 X3JlcXVlc3QgKnJxLAo+IC0JCWJvb2wgd3JpdGUpCj4gLXsKPiAtCWlmIChvYmotPmNhY2hlX2Rp cnR5ICYgfm9iai0+Y2FjaGVfY29oZXJlbnQpCj4gLQkJaTkxNV9nZW1fY2xmbHVzaF9vYmplY3Qo b2JqLCAwKTsKPiAtCj4gLQlyZXR1cm4gaTkxNV9yZXF1ZXN0X2F3YWl0X29iamVjdChycSwgb2Jq LCB3cml0ZSk7Cj4gLX0KPiAtCj4gLWludCBpOTE1X2dlbV9vYmplY3RfZmlsbF9ibHQoc3RydWN0 IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwKPiAtCQkJICAgICBzdHJ1Y3QgaW50ZWxfY29udGV4 dCAqY2UsCj4gLQkJCSAgICAgdTMyIHZhbHVlKQo+IC17Cj4gLQlzdHJ1Y3QgaTkxNV9nZW1fd3df Y3R4IHd3Owo+IC0Jc3RydWN0IGk5MTVfcmVxdWVzdCAqcnE7Cj4gLQlzdHJ1Y3QgaTkxNV92bWEg KmJhdGNoOwo+IC0Jc3RydWN0IGk5MTVfdm1hICp2bWE7Cj4gLQlpbnQgZXJyOwo+IC0KPiAtCXZt YSA9IGk5MTVfdm1hX2luc3RhbmNlKG9iaiwgY2UtPnZtLCBOVUxMKTsKPiAtCWlmIChJU19FUlIo dm1hKSkKPiAtCQlyZXR1cm4gUFRSX0VSUih2bWEpOwo+IC0KPiAtCWk5MTVfZ2VtX3d3X2N0eF9p bml0KCZ3dywgdHJ1ZSk7Cj4gLQlpbnRlbF9lbmdpbmVfcG1fZ2V0KGNlLT5lbmdpbmUpOwo+IC1y ZXRyeToKPiAtCWVyciA9IGk5MTVfZ2VtX29iamVjdF9sb2NrKG9iaiwgJnd3KTsKPiAtCWlmIChl cnIpCj4gLQkJZ290byBvdXQ7Cj4gLQo+IC0JZXJyID0gaW50ZWxfY29udGV4dF9waW5fd3coY2Us ICZ3dyk7Cj4gLQlpZiAoZXJyKQo+IC0JCWdvdG8gb3V0Owo+IC0KPiAtCWVyciA9IGk5MTVfdm1h X3Bpbl93dyh2bWEsICZ3dywgMCwgMCwgUElOX1VTRVIpOwo+IC0JaWYgKGVycikKPiAtCQlnb3Rv IG91dF9jdHg7Cj4gLQo+IC0JYmF0Y2ggPSBpbnRlbF9lbWl0X3ZtYV9maWxsX2JsdChjZSwgdm1h LCAmd3csIHZhbHVlKTsKPiAtCWlmIChJU19FUlIoYmF0Y2gpKSB7Cj4gLQkJZXJyID0gUFRSX0VS UihiYXRjaCk7Cj4gLQkJZ290byBvdXRfdm1hOwo+IC0JfQo+IC0KPiAtCXJxID0gaTkxNV9yZXF1 ZXN0X2NyZWF0ZShjZSk7Cj4gLQlpZiAoSVNfRVJSKHJxKSkgewo+IC0JCWVyciA9IFBUUl9FUlIo cnEpOwo+IC0JCWdvdG8gb3V0X2JhdGNoOwo+IC0JfQo+IC0KPiAtCWVyciA9IGludGVsX2VtaXRf dm1hX21hcmtfYWN0aXZlKGJhdGNoLCBycSk7Cj4gLQlpZiAodW5saWtlbHkoZXJyKSkKPiAtCQln b3RvIG91dF9yZXF1ZXN0Owo+IC0KPiAtCWVyciA9IG1vdmVfb2JqX3RvX2dwdSh2bWEtPm9iaiwg cnEsIHRydWUpOwo+IC0JaWYgKGVyciA9PSAwKQo+IC0JCWVyciA9IGk5MTVfdm1hX21vdmVfdG9f YWN0aXZlKHZtYSwgcnEsIEVYRUNfT0JKRUNUX1dSSVRFKTsKPiAtCWlmICh1bmxpa2VseShlcnIp KQo+IC0JCWdvdG8gb3V0X3JlcXVlc3Q7Cj4gLQo+IC0JaWYgKGNlLT5lbmdpbmUtPmVtaXRfaW5p dF9icmVhZGNydW1iKQo+IC0JCWVyciA9IGNlLT5lbmdpbmUtPmVtaXRfaW5pdF9icmVhZGNydW1i KHJxKTsKPiAtCj4gLQlpZiAobGlrZWx5KCFlcnIpKQo+IC0JCWVyciA9IGNlLT5lbmdpbmUtPmVt aXRfYmJfc3RhcnQocnEsCj4gLQkJCQkJCWJhdGNoLT5ub2RlLnN0YXJ0LAo+IC0JCQkJCQliYXRj aC0+bm9kZS5zaXplLAo+IC0JCQkJCQkwKTsKPiAtb3V0X3JlcXVlc3Q6Cj4gLQlpZiAodW5saWtl bHkoZXJyKSkKPiAtCQlpOTE1X3JlcXVlc3Rfc2V0X2Vycm9yX29uY2UocnEsIGVycik7Cj4gLQo+ IC0JaTkxNV9yZXF1ZXN0X2FkZChycSk7Cj4gLW91dF9iYXRjaDoKPiAtCWludGVsX2VtaXRfdm1h X3JlbGVhc2UoY2UsIGJhdGNoKTsKPiAtb3V0X3ZtYToKPiAtCWk5MTVfdm1hX3VucGluKHZtYSk7 Cj4gLW91dF9jdHg6Cj4gLQlpbnRlbF9jb250ZXh0X3VucGluKGNlKTsKPiAtb3V0Ogo+IC0JaWYg KGVyciA9PSAtRURFQURMSykgewo+IC0JCWVyciA9IGk5MTVfZ2VtX3d3X2N0eF9iYWNrb2ZmKCZ3 dyk7Cj4gLQkJaWYgKCFlcnIpCj4gLQkJCWdvdG8gcmV0cnk7Cj4gLQl9Cj4gLQlpOTE1X2dlbV93 d19jdHhfZmluaSgmd3cpOwo+IC0JaW50ZWxfZW5naW5lX3BtX3B1dChjZS0+ZW5naW5lKTsKPiAt CXJldHVybiBlcnI7Cj4gLX0KPiAtCj4gLS8qIFdhXzEyMDk2NDQ2MTE6aWNsLGVobCAqLwo+IC1z dGF0aWMgYm9vbCB3YV8xMjA5NjQ0NjExX2FwcGxpZXMoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUg Kmk5MTUsIHUzMiBzaXplKQo+IC17Cj4gLQl1MzIgaGVpZ2h0ID0gc2l6ZSA+PiBQQUdFX1NISUZU Owo+IC0KPiAtCWlmIChHUkFQSElDU19WRVIoaTkxNSkgIT0gMTEpCj4gLQkJcmV0dXJuIGZhbHNl Owo+IC0KPiAtCXJldHVybiBoZWlnaHQgJSA0ID09IDMgJiYgaGVpZ2h0IDw9IDg7Cj4gLX0KPiAt Cj4gLXN0cnVjdCBpOTE1X3ZtYSAqaW50ZWxfZW1pdF92bWFfY29weV9ibHQoc3RydWN0IGludGVs X2NvbnRleHQgKmNlLAo+IC0JCQkJCSBzdHJ1Y3QgaTkxNV9nZW1fd3dfY3R4ICp3dywKPiAtCQkJ CQkgc3RydWN0IGk5MTVfdm1hICpzcmMsCj4gLQkJCQkJIHN0cnVjdCBpOTE1X3ZtYSAqZHN0KQo+ IC17Cj4gLQlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSA9IGNlLT52bS0+aTkxNTsKPiAt CWNvbnN0IHUzMiBibG9ja19zaXplID0gU1pfOE07IC8qIH4xbXMgYXQgOEdpQi9zIHByZWVtcHRp b24gZGVsYXkgKi8KPiAtCXN0cnVjdCBpbnRlbF9ndF9idWZmZXJfcG9vbF9ub2RlICpwb29sOwo+ IC0Jc3RydWN0IGk5MTVfdm1hICpiYXRjaDsKPiAtCXU2NCBzcmNfb2Zmc2V0LCBkc3Rfb2Zmc2V0 Owo+IC0JdTY0IGNvdW50LCByZW07Cj4gLQl1MzIgc2l6ZSwgKmNtZDsKPiAtCWludCBlcnI7Cj4g LQo+IC0JR0VNX0JVR19PTihzcmMtPnNpemUgIT0gZHN0LT5zaXplKTsKPiAtCj4gLQlHRU1fQlVH X09OKGludGVsX2VuZ2luZV9pc192aXJ0dWFsKGNlLT5lbmdpbmUpKTsKPiAtCWludGVsX2VuZ2lu ZV9wbV9nZXQoY2UtPmVuZ2luZSk7Cj4gLQo+IC0JY291bnQgPSBkaXZfdTY0KHJvdW5kX3VwKGRz dC0+c2l6ZSwgYmxvY2tfc2l6ZSksIGJsb2NrX3NpemUpOwo+IC0Jc2l6ZSA9ICgxICsgMTEgKiBj b3VudCkgKiBzaXplb2YodTMyKTsKPiAtCXNpemUgPSByb3VuZF91cChzaXplLCBQQUdFX1NJWkUp Owo+IC0JcG9vbCA9IGludGVsX2d0X2dldF9idWZmZXJfcG9vbChjZS0+ZW5naW5lLT5ndCwgc2l6 ZSwgSTkxNV9NQVBfV0MpOwo+IC0JaWYgKElTX0VSUihwb29sKSkgewo+IC0JCWVyciA9IFBUUl9F UlIocG9vbCk7Cj4gLQkJZ290byBvdXRfcG07Cj4gLQl9Cj4gLQo+IC0JZXJyID0gaTkxNV9nZW1f b2JqZWN0X2xvY2socG9vbC0+b2JqLCB3dyk7Cj4gLQlpZiAoZXJyKQo+IC0JCWdvdG8gb3V0X3B1 dDsKPiAtCj4gLQliYXRjaCA9IGk5MTVfdm1hX2luc3RhbmNlKHBvb2wtPm9iaiwgY2UtPnZtLCBO VUxMKTsKPiAtCWlmIChJU19FUlIoYmF0Y2gpKSB7Cj4gLQkJZXJyID0gUFRSX0VSUihiYXRjaCk7 Cj4gLQkJZ290byBvdXRfcHV0Owo+IC0JfQo+IC0KPiAtCWVyciA9IGk5MTVfdm1hX3Bpbl93dyhi YXRjaCwgd3csIDAsIDAsIFBJTl9VU0VSKTsKPiAtCWlmICh1bmxpa2VseShlcnIpKQo+IC0JCWdv dG8gb3V0X3B1dDsKPiAtCj4gLQkvKiB3ZSBwaW5uZWQgdGhlIHBvb2wsIG1hcmsgaXQgYXMgc3Vj aCAqLwo+IC0JaW50ZWxfZ3RfYnVmZmVyX3Bvb2xfbWFya191c2VkKHBvb2wpOwo+IC0KPiAtCWNt ZCA9IGk5MTVfZ2VtX29iamVjdF9waW5fbWFwKHBvb2wtPm9iaiwgcG9vbC0+dHlwZSk7Cj4gLQlp ZiAoSVNfRVJSKGNtZCkpIHsKPiAtCQllcnIgPSBQVFJfRVJSKGNtZCk7Cj4gLQkJZ290byBvdXRf dW5waW47Cj4gLQl9Cj4gLQo+IC0JcmVtID0gc3JjLT5zaXplOwo+IC0Jc3JjX29mZnNldCA9IHNy Yy0+bm9kZS5zdGFydDsKPiAtCWRzdF9vZmZzZXQgPSBkc3QtPm5vZGUuc3RhcnQ7Cj4gLQo+IC0J ZG8gewo+IC0JCXNpemUgPSBtaW5fdCh1NjQsIHJlbSwgYmxvY2tfc2l6ZSk7Cj4gLQkJR0VNX0JV R19PTihzaXplID4+IFBBR0VfU0hJRlQgPiBTMTZfTUFYKTsKPiAtCj4gLQkJaWYgKEdSQVBISUNT X1ZFUihpOTE1KSA+PSA5ICYmCj4gLQkJICAgICF3YV8xMjA5NjQ0NjExX2FwcGxpZXMoaTkxNSwg c2l6ZSkpIHsKPiAtCQkJKmNtZCsrID0gR0VOOV9YWV9GQVNUX0NPUFlfQkxUX0NNRCB8ICgxMCAt IDIpOwo+IC0JCQkqY21kKysgPSBCTFRfREVQVEhfMzIgfCBQQUdFX1NJWkU7Cj4gLQkJCSpjbWQr KyA9IDA7Cj4gLQkJCSpjbWQrKyA9IHNpemUgPj4gUEFHRV9TSElGVCA8PCAxNiB8IFBBR0VfU0la RSAvIDQ7Cj4gLQkJCSpjbWQrKyA9IGxvd2VyXzMyX2JpdHMoZHN0X29mZnNldCk7Cj4gLQkJCSpj bWQrKyA9IHVwcGVyXzMyX2JpdHMoZHN0X29mZnNldCk7Cj4gLQkJCSpjbWQrKyA9IDA7Cj4gLQkJ CSpjbWQrKyA9IFBBR0VfU0laRTsKPiAtCQkJKmNtZCsrID0gbG93ZXJfMzJfYml0cyhzcmNfb2Zm c2V0KTsKPiAtCQkJKmNtZCsrID0gdXBwZXJfMzJfYml0cyhzcmNfb2Zmc2V0KTsKPiAtCQl9IGVs c2UgaWYgKEdSQVBISUNTX1ZFUihpOTE1KSA+PSA4KSB7Cj4gLQkJCSpjbWQrKyA9IFhZX1NSQ19D T1BZX0JMVF9DTUQgfCBCTFRfV1JJVEVfUkdCQSB8ICgxMCAtIDIpOwo+IC0JCQkqY21kKysgPSBC TFRfREVQVEhfMzIgfCBCTFRfUk9QX1NSQ19DT1BZIHwgUEFHRV9TSVpFOwo+IC0JCQkqY21kKysg PSAwOwo+IC0JCQkqY21kKysgPSBzaXplID4+IFBBR0VfU0hJRlQgPDwgMTYgfCBQQUdFX1NJWkUg LyA0Owo+IC0JCQkqY21kKysgPSBsb3dlcl8zMl9iaXRzKGRzdF9vZmZzZXQpOwo+IC0JCQkqY21k KysgPSB1cHBlcl8zMl9iaXRzKGRzdF9vZmZzZXQpOwo+IC0JCQkqY21kKysgPSAwOwo+IC0JCQkq Y21kKysgPSBQQUdFX1NJWkU7Cj4gLQkJCSpjbWQrKyA9IGxvd2VyXzMyX2JpdHMoc3JjX29mZnNl dCk7Cj4gLQkJCSpjbWQrKyA9IHVwcGVyXzMyX2JpdHMoc3JjX29mZnNldCk7Cj4gLQkJfSBlbHNl IHsKPiAtCQkJKmNtZCsrID0gU1JDX0NPUFlfQkxUX0NNRCB8IEJMVF9XUklURV9SR0JBIHwgKDYg LSAyKTsKPiAtCQkJKmNtZCsrID0gQkxUX0RFUFRIXzMyIHwgQkxUX1JPUF9TUkNfQ09QWSB8IFBB R0VfU0laRTsKPiAtCQkJKmNtZCsrID0gc2l6ZSA+PiBQQUdFX1NISUZUIDw8IDE2IHwgUEFHRV9T SVpFOwo+IC0JCQkqY21kKysgPSBkc3Rfb2Zmc2V0Owo+IC0JCQkqY21kKysgPSBQQUdFX1NJWkU7 Cj4gLQkJCSpjbWQrKyA9IHNyY19vZmZzZXQ7Cj4gLQkJfQo+IC0KPiAtCQkvKiBBbGxvdyBvdXJz ZWx2ZXMgdG8gYmUgcHJlZW1wdGVkIGluIGJldHdlZW4gYmxvY2tzLiAqLwo+IC0JCSpjbWQrKyA9 IE1JX0FSQl9DSEVDSzsKPiAtCj4gLQkJc3JjX29mZnNldCArPSBzaXplOwo+IC0JCWRzdF9vZmZz ZXQgKz0gc2l6ZTsKPiAtCQlyZW0gLT0gc2l6ZTsKPiAtCX0gd2hpbGUgKHJlbSk7Cj4gLQo+IC0J KmNtZCA9IE1JX0JBVENIX0JVRkZFUl9FTkQ7Cj4gLQo+IC0JaTkxNV9nZW1fb2JqZWN0X2ZsdXNo X21hcChwb29sLT5vYmopOwo+IC0JaTkxNV9nZW1fb2JqZWN0X3VucGluX21hcChwb29sLT5vYmop Owo+IC0KPiAtCWludGVsX2d0X2NoaXBzZXRfZmx1c2goY2UtPnZtLT5ndCk7Cj4gLQliYXRjaC0+ cHJpdmF0ZSA9IHBvb2w7Cj4gLQlyZXR1cm4gYmF0Y2g7Cj4gLQo+IC1vdXRfdW5waW46Cj4gLQlp OTE1X3ZtYV91bnBpbihiYXRjaCk7Cj4gLW91dF9wdXQ6Cj4gLQlpbnRlbF9ndF9idWZmZXJfcG9v bF9wdXQocG9vbCk7Cj4gLW91dF9wbToKPiAtCWludGVsX2VuZ2luZV9wbV9wdXQoY2UtPmVuZ2lu ZSk7Cj4gLQlyZXR1cm4gRVJSX1BUUihlcnIpOwo+IC19Cj4gLQo+IC1pbnQgaTkxNV9nZW1fb2Jq ZWN0X2NvcHlfYmx0KHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpzcmMsCj4gLQkJCSAgICAg c3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKmRzdCwKPiAtCQkJICAgICBzdHJ1Y3QgaW50ZWxf Y29udGV4dCAqY2UpCj4gLXsKPiAtCXN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZtID0gY2Ut PnZtOwo+IC0Jc3RydWN0IGk5MTVfdm1hICp2bWFbMl0sICpiYXRjaDsKPiAtCXN0cnVjdCBpOTE1 X2dlbV93d19jdHggd3c7Cj4gLQlzdHJ1Y3QgaTkxNV9yZXF1ZXN0ICpycTsKPiAtCWludCBlcnIs IGk7Cj4gLQo+IC0Jdm1hWzBdID0gaTkxNV92bWFfaW5zdGFuY2Uoc3JjLCB2bSwgTlVMTCk7Cj4g LQlpZiAoSVNfRVJSKHZtYVswXSkpCj4gLQkJcmV0dXJuIFBUUl9FUlIodm1hWzBdKTsKPiAtCj4g LQl2bWFbMV0gPSBpOTE1X3ZtYV9pbnN0YW5jZShkc3QsIHZtLCBOVUxMKTsKPiAtCWlmIChJU19F UlIodm1hWzFdKSkKPiAtCQlyZXR1cm4gUFRSX0VSUih2bWFbMV0pOwo+IC0KPiAtCWk5MTVfZ2Vt X3d3X2N0eF9pbml0KCZ3dywgdHJ1ZSk7Cj4gLQlpbnRlbF9lbmdpbmVfcG1fZ2V0KGNlLT5lbmdp bmUpOwo+IC1yZXRyeToKPiAtCWVyciA9IGk5MTVfZ2VtX29iamVjdF9sb2NrKHNyYywgJnd3KTsK PiAtCWlmICghZXJyKQo+IC0JCWVyciA9IGk5MTVfZ2VtX29iamVjdF9sb2NrKGRzdCwgJnd3KTsK PiAtCWlmICghZXJyKQo+IC0JCWVyciA9IGludGVsX2NvbnRleHRfcGluX3d3KGNlLCAmd3cpOwo+ IC0JaWYgKGVycikKPiAtCQlnb3RvIG91dDsKPiAtCj4gLQllcnIgPSBpOTE1X3ZtYV9waW5fd3co dm1hWzBdLCAmd3csIDAsIDAsIFBJTl9VU0VSKTsKPiAtCWlmIChlcnIpCj4gLQkJZ290byBvdXRf Y3R4Owo+IC0KPiAtCWVyciA9IGk5MTVfdm1hX3Bpbl93dyh2bWFbMV0sICZ3dywgMCwgMCwgUElO X1VTRVIpOwo+IC0JaWYgKHVubGlrZWx5KGVycikpCj4gLQkJZ290byBvdXRfdW5waW5fc3JjOwo+ IC0KPiAtCWJhdGNoID0gaW50ZWxfZW1pdF92bWFfY29weV9ibHQoY2UsICZ3dywgdm1hWzBdLCB2 bWFbMV0pOwo+IC0JaWYgKElTX0VSUihiYXRjaCkpIHsKPiAtCQllcnIgPSBQVFJfRVJSKGJhdGNo KTsKPiAtCQlnb3RvIG91dF91bnBpbl9kc3Q7Cj4gLQl9Cj4gLQo+IC0JcnEgPSBpOTE1X3JlcXVl c3RfY3JlYXRlKGNlKTsKPiAtCWlmIChJU19FUlIocnEpKSB7Cj4gLQkJZXJyID0gUFRSX0VSUihy cSk7Cj4gLQkJZ290byBvdXRfYmF0Y2g7Cj4gLQl9Cj4gLQo+IC0JZXJyID0gaW50ZWxfZW1pdF92 bWFfbWFya19hY3RpdmUoYmF0Y2gsIHJxKTsKPiAtCWlmICh1bmxpa2VseShlcnIpKQo+IC0JCWdv dG8gb3V0X3JlcXVlc3Q7Cj4gLQo+IC0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodm1hKTsg aSsrKSB7Cj4gLQkJZXJyID0gbW92ZV9vYmpfdG9fZ3B1KHZtYVtpXS0+b2JqLCBycSwgaSk7Cj4g LQkJaWYgKHVubGlrZWx5KGVycikpCj4gLQkJCWdvdG8gb3V0X3JlcXVlc3Q7Cj4gLQl9Cj4gLQo+ IC0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodm1hKTsgaSsrKSB7Cj4gLQkJdW5zaWduZWQg aW50IGZsYWdzID0gaSA/IEVYRUNfT0JKRUNUX1dSSVRFIDogMDsKPiAtCj4gLQkJZXJyID0gaTkx NV92bWFfbW92ZV90b19hY3RpdmUodm1hW2ldLCBycSwgZmxhZ3MpOwo+IC0JCWlmICh1bmxpa2Vs eShlcnIpKQo+IC0JCQlnb3RvIG91dF9yZXF1ZXN0Owo+IC0JfQo+IC0KPiAtCWlmIChycS0+ZW5n aW5lLT5lbWl0X2luaXRfYnJlYWRjcnVtYikgewo+IC0JCWVyciA9IHJxLT5lbmdpbmUtPmVtaXRf aW5pdF9icmVhZGNydW1iKHJxKTsKPiAtCQlpZiAodW5saWtlbHkoZXJyKSkKPiAtCQkJZ290byBv dXRfcmVxdWVzdDsKPiAtCX0KPiAtCj4gLQllcnIgPSBycS0+ZW5naW5lLT5lbWl0X2JiX3N0YXJ0 KHJxLAo+IC0JCQkJCWJhdGNoLT5ub2RlLnN0YXJ0LCBiYXRjaC0+bm9kZS5zaXplLAo+IC0JCQkJ CTApOwo+IC0KPiAtb3V0X3JlcXVlc3Q6Cj4gLQlpZiAodW5saWtlbHkoZXJyKSkKPiAtCQlpOTE1 X3JlcXVlc3Rfc2V0X2Vycm9yX29uY2UocnEsIGVycik7Cj4gLQo+IC0JaTkxNV9yZXF1ZXN0X2Fk ZChycSk7Cj4gLW91dF9iYXRjaDoKPiAtCWludGVsX2VtaXRfdm1hX3JlbGVhc2UoY2UsIGJhdGNo KTsKPiAtb3V0X3VucGluX2RzdDoKPiAtCWk5MTVfdm1hX3VucGluKHZtYVsxXSk7Cj4gLW91dF91 bnBpbl9zcmM6Cj4gLQlpOTE1X3ZtYV91bnBpbih2bWFbMF0pOwo+IC1vdXRfY3R4Ogo+IC0JaW50 ZWxfY29udGV4dF91bnBpbihjZSk7Cj4gLW91dDoKPiAtCWlmIChlcnIgPT0gLUVERUFETEspIHsK PiAtCQllcnIgPSBpOTE1X2dlbV93d19jdHhfYmFja29mZigmd3cpOwo+IC0JCWlmICghZXJyKQo+ IC0JCQlnb3RvIHJldHJ5Owo+IC0JfQo+IC0JaTkxNV9nZW1fd3dfY3R4X2ZpbmkoJnd3KTsKPiAt CWludGVsX2VuZ2luZV9wbV9wdXQoY2UtPmVuZ2luZSk7Cj4gLQlyZXR1cm4gZXJyOwo+IC19Cj4g LQo+IC0jaWYgSVNfRU5BQkxFRChDT05GSUdfRFJNX0k5MTVfU0VMRlRFU1QpCj4gLSNpbmNsdWRl ICJzZWxmdGVzdHMvaTkxNV9nZW1fb2JqZWN0X2JsdC5jIgo+IC0jZW5kaWYKPiBkaWZmIC0tZ2l0 IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ2VtL2k5MTVfZ2VtX29iamVjdF9ibHQuaCBiL2RyaXZl cnMvZ3B1L2RybS9pOTE1L2dlbS9pOTE1X2dlbV9vYmplY3RfYmx0LmgKPiBkZWxldGVkIGZpbGUg bW9kZSAxMDA2NDQKPiBpbmRleCAyNDA5ZmRjY2NmMGUuLjAwMDAwMDAwMDAwMAo+IC0tLSBhL2Ry aXZlcnMvZ3B1L2RybS9pOTE1L2dlbS9pOTE1X2dlbV9vYmplY3RfYmx0LmgKPiArKysgL2Rldi9u dWxsCj4gQEAgLTEsMzkgKzAsMCBAQAo+IC0vKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlU ICovCj4gLS8qCj4gLSAqIENvcHlyaWdodCDCqSAyMDE5IEludGVsIENvcnBvcmF0aW9uCj4gLSAq Lwo+IC0KPiAtI2lmbmRlZiBfX0k5MTVfR0VNX09CSkVDVF9CTFRfSF9fCj4gLSNkZWZpbmUgX19J OTE1X0dFTV9PQkpFQ1RfQkxUX0hfXwo+IC0KPiAtI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Cj4g LQo+IC0jaW5jbHVkZSAiZ3QvaW50ZWxfY29udGV4dC5oIgo+IC0jaW5jbHVkZSAiZ3QvaW50ZWxf ZW5naW5lX3BtLmgiCj4gLSNpbmNsdWRlICJpOTE1X3ZtYS5oIgo+IC0KPiAtc3RydWN0IGRybV9p OTE1X2dlbV9vYmplY3Q7Cj4gLXN0cnVjdCBpOTE1X2dlbV93d19jdHg7Cj4gLQo+IC1zdHJ1Y3Qg aTkxNV92bWEgKmludGVsX2VtaXRfdm1hX2ZpbGxfYmx0KHN0cnVjdCBpbnRlbF9jb250ZXh0ICpj ZSwKPiAtCQkJCQkgc3RydWN0IGk5MTVfdm1hICp2bWEsCj4gLQkJCQkJIHN0cnVjdCBpOTE1X2dl bV93d19jdHggKnd3LAo+IC0JCQkJCSB1MzIgdmFsdWUpOwo+IC0KPiAtc3RydWN0IGk5MTVfdm1h ICppbnRlbF9lbWl0X3ZtYV9jb3B5X2JsdChzdHJ1Y3QgaW50ZWxfY29udGV4dCAqY2UsCj4gLQkJ CQkJIHN0cnVjdCBpOTE1X2dlbV93d19jdHggKnd3LAo+IC0JCQkJCSBzdHJ1Y3QgaTkxNV92bWEg KnNyYywKPiAtCQkJCQkgc3RydWN0IGk5MTVfdm1hICpkc3QpOwo+IC0KPiAtaW50IGludGVsX2Vt aXRfdm1hX21hcmtfYWN0aXZlKHN0cnVjdCBpOTE1X3ZtYSAqdm1hLCBzdHJ1Y3QgaTkxNV9yZXF1 ZXN0ICpycSk7Cj4gLXZvaWQgaW50ZWxfZW1pdF92bWFfcmVsZWFzZShzdHJ1Y3QgaW50ZWxfY29u dGV4dCAqY2UsIHN0cnVjdCBpOTE1X3ZtYSAqdm1hKTsKPiAtCj4gLWludCBpOTE1X2dlbV9vYmpl Y3RfZmlsbF9ibHQoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwKPiAtCQkJICAgICBz dHJ1Y3QgaW50ZWxfY29udGV4dCAqY2UsCj4gLQkJCSAgICAgdTMyIHZhbHVlKTsKPiAtCj4gLWlu dCBpOTE1X2dlbV9vYmplY3RfY29weV9ibHQoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKnNy YywKPiAtCQkJICAgICBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqZHN0LAo+IC0JCQkgICAg IHN0cnVjdCBpbnRlbF9jb250ZXh0ICpjZSk7Cj4gLQo+IC0jZW5kaWYKPiBkaWZmIC0tZ2l0IGEv ZHJpdmVycy9ncHUvZHJtL2k5MTUvZ2VtL3NlbGZ0ZXN0cy9pOTE1X2dlbV9vYmplY3RfYmx0LmMg Yi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9nZW0vc2VsZnRlc3RzL2k5MTVfZ2VtX29iamVjdF9ibHQu Ywo+IGRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAo+IGluZGV4IDhjMzM1ZDFhODQwNi4uMDAwMDAw MDAwMDAwCj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ2VtL3NlbGZ0ZXN0cy9pOTE1X2dl bV9vYmplY3RfYmx0LmMKPiArKysgL2Rldi9udWxsCj4gQEAgLTEsNTk3ICswLDAgQEAKPiAtLy8g U1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVAo+IC0vKgo+IC0gKiBDb3B5cmlnaHQgwqkgMjAx OSBJbnRlbCBDb3Jwb3JhdGlvbgo+IC0gKi8KPiAtCj4gLSNpbmNsdWRlIDxsaW51eC9zb3J0Lmg+ Cj4gLQo+IC0jaW5jbHVkZSAiZ3QvaW50ZWxfZ3QuaCIKPiAtI2luY2x1ZGUgImd0L2ludGVsX2Vu Z2luZV91c2VyLmgiCj4gLQo+IC0jaW5jbHVkZSAiaTkxNV9zZWxmdGVzdC5oIgo+IC0KPiAtI2lu Y2x1ZGUgImdlbS9pOTE1X2dlbV9jb250ZXh0LmgiCj4gLSNpbmNsdWRlICJzZWxmdGVzdHMvaWd0 X2ZsdXNoX3Rlc3QuaCIKPiAtI2luY2x1ZGUgInNlbGZ0ZXN0cy9pOTE1X3JhbmRvbS5oIgo+IC0j aW5jbHVkZSAic2VsZnRlc3RzL21vY2tfZHJtLmgiCj4gLSNpbmNsdWRlICJodWdlX2dlbV9vYmpl Y3QuaCIKPiAtI2luY2x1ZGUgIm1vY2tfY29udGV4dC5oIgo+IC0KPiAtc3RhdGljIGludCB3cmFw X2t0aW1lX2NvbXBhcmUoY29uc3Qgdm9pZCAqQSwgY29uc3Qgdm9pZCAqQikKPiAtewo+IC0JY29u c3Qga3RpbWVfdCAqYSA9IEEsICpiID0gQjsKPiAtCj4gLQlyZXR1cm4ga3RpbWVfY29tcGFyZSgq YSwgKmIpOwo+IC19Cj4gLQo+IC1zdGF0aWMgaW50IF9fcGVyZl9maWxsX2JsdChzdHJ1Y3QgZHJt X2k5MTVfZ2VtX29iamVjdCAqb2JqKQo+IC17Cj4gLQlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAq aTkxNSA9IHRvX2k5MTUob2JqLT5iYXNlLmRldik7Cj4gLQlpbnQgaW5zdCA9IDA7Cj4gLQo+IC0J ZG8gewo+IC0JCXN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2luZTsKPiAtCQlrdGltZV90IHRb NV07Cj4gLQkJaW50IHBhc3M7Cj4gLQkJaW50IGVycjsKPiAtCj4gLQkJZW5naW5lID0gaW50ZWxf ZW5naW5lX2xvb2t1cF91c2VyKGk5MTUsCj4gLQkJCQkJCSAgSTkxNV9FTkdJTkVfQ0xBU1NfQ09Q WSwKPiAtCQkJCQkJICBpbnN0KyspOwo+IC0JCWlmICghZW5naW5lKQo+IC0JCQlyZXR1cm4gMDsK PiAtCj4gLQkJaW50ZWxfZW5naW5lX3BtX2dldChlbmdpbmUpOwo+IC0JCWZvciAocGFzcyA9IDA7 IHBhc3MgPCBBUlJBWV9TSVpFKHQpOyBwYXNzKyspIHsKPiAtCQkJc3RydWN0IGludGVsX2NvbnRl eHQgKmNlID0gZW5naW5lLT5rZXJuZWxfY29udGV4dDsKPiAtCQkJa3RpbWVfdCB0MCwgdDE7Cj4g LQo+IC0JCQl0MCA9IGt0aW1lX2dldCgpOwo+IC0KPiAtCQkJZXJyID0gaTkxNV9nZW1fb2JqZWN0 X2ZpbGxfYmx0KG9iaiwgY2UsIDApOwo+IC0JCQlpZiAoZXJyKQo+IC0JCQkJYnJlYWs7Cj4gLQo+ IC0JCQllcnIgPSBpOTE1X2dlbV9vYmplY3Rfd2FpdChvYmosCj4gLQkJCQkJCSAgIEk5MTVfV0FJ VF9BTEwsCj4gLQkJCQkJCSAgIE1BWF9TQ0hFRFVMRV9USU1FT1VUKTsKPiAtCQkJaWYgKGVycikK PiAtCQkJCWJyZWFrOwo+IC0KPiAtCQkJdDEgPSBrdGltZV9nZXQoKTsKPiAtCQkJdFtwYXNzXSA9 IGt0aW1lX3N1Yih0MSwgdDApOwo+IC0JCX0KPiAtCQlpbnRlbF9lbmdpbmVfcG1fcHV0KGVuZ2lu ZSk7Cj4gLQkJaWYgKGVycikKPiAtCQkJcmV0dXJuIGVycjsKPiAtCj4gLQkJc29ydCh0LCBBUlJB WV9TSVpFKHQpLCBzaXplb2YoKnQpLCB3cmFwX2t0aW1lX2NvbXBhcmUsIE5VTEwpOwo+IC0JCXBy X2luZm8oIiVzOiBibHQgJXpkIEtpQiBmaWxsOiAlbGxkIE1pQi9zXG4iLAo+IC0JCQllbmdpbmUt Pm5hbWUsCj4gLQkJCW9iai0+YmFzZS5zaXplID4+IDEwLAo+IC0JCQlkaXY2NF91NjQobXVsX3Uz Ml91MzIoNCAqIG9iai0+YmFzZS5zaXplLAo+IC0JCQkJCSAgICAgIDEwMDAgKiAxMDAwICogMTAw MCksCj4gLQkJCQkgIHRbMV0gKyAyICogdFsyXSArIHRbM10pID4+IDIwKTsKPiAtCX0gd2hpbGUg KDEpOwo+IC19Cj4gLQo+IC1zdGF0aWMgaW50IHBlcmZfZmlsbF9ibHQodm9pZCAqYXJnKQo+IC17 Cj4gLQlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSA9IGFyZzsKPiAtCXN0YXRpYyBjb25z dCB1bnNpZ25lZCBsb25nIHNpemVzW10gPSB7Cj4gLQkJU1pfNEssCj4gLQkJU1pfNjRLLAo+IC0J CVNaXzJNLAo+IC0JCVNaXzY0TQo+IC0JfTsKPiAtCWludCBpOwo+IC0KPiAtCWZvciAoaSA9IDA7 IGkgPCBBUlJBWV9TSVpFKHNpemVzKTsgaSsrKSB7Cj4gLQkJc3RydWN0IGRybV9pOTE1X2dlbV9v YmplY3QgKm9iajsKPiAtCQlpbnQgZXJyOwo+IC0KPiAtCQlvYmogPSBpOTE1X2dlbV9vYmplY3Rf Y3JlYXRlX2ludGVybmFsKGk5MTUsIHNpemVzW2ldKTsKPiAtCQlpZiAoSVNfRVJSKG9iaikpCj4g LQkJCXJldHVybiBQVFJfRVJSKG9iaik7Cj4gLQo+IC0JCWVyciA9IF9fcGVyZl9maWxsX2JsdChv YmopOwo+IC0JCWk5MTVfZ2VtX29iamVjdF9wdXQob2JqKTsKPiAtCQlpZiAoZXJyKQo+IC0JCQly ZXR1cm4gZXJyOwo+IC0JfQo+IC0KPiAtCXJldHVybiAwOwo+IC19Cj4gLQo+IC1zdGF0aWMgaW50 IF9fcGVyZl9jb3B5X2JsdChzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqc3JjLAo+IC0JCQkg ICBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqZHN0KQo+IC17Cj4gLQlzdHJ1Y3QgZHJtX2k5 MTVfcHJpdmF0ZSAqaTkxNSA9IHRvX2k5MTUoc3JjLT5iYXNlLmRldik7Cj4gLQlpbnQgaW5zdCA9 IDA7Cj4gLQo+IC0JZG8gewo+IC0JCXN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2luZTsKPiAt CQlrdGltZV90IHRbNV07Cj4gLQkJaW50IHBhc3M7Cj4gLQkJaW50IGVyciA9IDA7Cj4gLQo+IC0J CWVuZ2luZSA9IGludGVsX2VuZ2luZV9sb29rdXBfdXNlcihpOTE1LAo+IC0JCQkJCQkgIEk5MTVf RU5HSU5FX0NMQVNTX0NPUFksCj4gLQkJCQkJCSAgaW5zdCsrKTsKPiAtCQlpZiAoIWVuZ2luZSkK PiAtCQkJcmV0dXJuIDA7Cj4gLQo+IC0JCWludGVsX2VuZ2luZV9wbV9nZXQoZW5naW5lKTsKPiAt CQlmb3IgKHBhc3MgPSAwOyBwYXNzIDwgQVJSQVlfU0laRSh0KTsgcGFzcysrKSB7Cj4gLQkJCXN0 cnVjdCBpbnRlbF9jb250ZXh0ICpjZSA9IGVuZ2luZS0+a2VybmVsX2NvbnRleHQ7Cj4gLQkJCWt0 aW1lX3QgdDAsIHQxOwo+IC0KPiAtCQkJdDAgPSBrdGltZV9nZXQoKTsKPiAtCj4gLQkJCWVyciA9 IGk5MTVfZ2VtX29iamVjdF9jb3B5X2JsdChzcmMsIGRzdCwgY2UpOwo+IC0JCQlpZiAoZXJyKQo+ IC0JCQkJYnJlYWs7Cj4gLQo+IC0JCQllcnIgPSBpOTE1X2dlbV9vYmplY3Rfd2FpdChkc3QsCj4g LQkJCQkJCSAgIEk5MTVfV0FJVF9BTEwsCj4gLQkJCQkJCSAgIE1BWF9TQ0hFRFVMRV9USU1FT1VU KTsKPiAtCQkJaWYgKGVycikKPiAtCQkJCWJyZWFrOwo+IC0KPiAtCQkJdDEgPSBrdGltZV9nZXQo KTsKPiAtCQkJdFtwYXNzXSA9IGt0aW1lX3N1Yih0MSwgdDApOwo+IC0JCX0KPiAtCQlpbnRlbF9l bmdpbmVfcG1fcHV0KGVuZ2luZSk7Cj4gLQkJaWYgKGVycikKPiAtCQkJcmV0dXJuIGVycjsKPiAt Cj4gLQkJc29ydCh0LCBBUlJBWV9TSVpFKHQpLCBzaXplb2YoKnQpLCB3cmFwX2t0aW1lX2NvbXBh cmUsIE5VTEwpOwo+IC0JCXByX2luZm8oIiVzOiBibHQgJXpkIEtpQiBjb3B5OiAlbGxkIE1pQi9z XG4iLAo+IC0JCQllbmdpbmUtPm5hbWUsCj4gLQkJCXNyYy0+YmFzZS5zaXplID4+IDEwLAo+IC0J CQlkaXY2NF91NjQobXVsX3UzMl91MzIoNCAqIHNyYy0+YmFzZS5zaXplLAo+IC0JCQkJCSAgICAg IDEwMDAgKiAxMDAwICogMTAwMCksCj4gLQkJCQkgIHRbMV0gKyAyICogdFsyXSArIHRbM10pID4+ IDIwKTsKPiAtCX0gd2hpbGUgKDEpOwo+IC19Cj4gLQo+IC1zdGF0aWMgaW50IHBlcmZfY29weV9i bHQodm9pZCAqYXJnKQo+IC17Cj4gLQlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSA9IGFy ZzsKPiAtCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIHNpemVzW10gPSB7Cj4gLQkJU1pfNEss Cj4gLQkJU1pfNjRLLAo+IC0JCVNaXzJNLAo+IC0JCVNaXzY0TQo+IC0JfTsKPiAtCWludCBpOwo+ IC0KPiAtCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHNpemVzKTsgaSsrKSB7Cj4gLQkJc3Ry dWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKnNyYywgKmRzdDsKPiAtCQlpbnQgZXJyOwo+IC0KPiAt CQlzcmMgPSBpOTE1X2dlbV9vYmplY3RfY3JlYXRlX2ludGVybmFsKGk5MTUsIHNpemVzW2ldKTsK PiAtCQlpZiAoSVNfRVJSKHNyYykpCj4gLQkJCXJldHVybiBQVFJfRVJSKHNyYyk7Cj4gLQo+IC0J CWRzdCA9IGk5MTVfZ2VtX29iamVjdF9jcmVhdGVfaW50ZXJuYWwoaTkxNSwgc2l6ZXNbaV0pOwo+ IC0JCWlmIChJU19FUlIoZHN0KSkgewo+IC0JCQllcnIgPSBQVFJfRVJSKGRzdCk7Cj4gLQkJCWdv dG8gZXJyX3NyYzsKPiAtCQl9Cj4gLQo+IC0JCWVyciA9IF9fcGVyZl9jb3B5X2JsdChzcmMsIGRz dCk7Cj4gLQo+IC0JCWk5MTVfZ2VtX29iamVjdF9wdXQoZHN0KTsKPiAtZXJyX3NyYzoKPiAtCQlp OTE1X2dlbV9vYmplY3RfcHV0KHNyYyk7Cj4gLQkJaWYgKGVycikKPiAtCQkJcmV0dXJuIGVycjsK PiAtCX0KPiAtCj4gLQlyZXR1cm4gMDsKPiAtfQo+IC0KPiAtc3RydWN0IGlndF90aHJlYWRfYXJn IHsKPiAtCXN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2luZTsKPiAtCXN0cnVjdCBpOTE1X2dl bV9jb250ZXh0ICpjdHg7Cj4gLQlzdHJ1Y3QgZmlsZSAqZmlsZTsKPiAtCXN0cnVjdCBybmRfc3Rh dGUgcHJuZzsKPiAtCXVuc2lnbmVkIGludCBuX2NwdXM7Cj4gLX07Cj4gLQo+IC1zdGF0aWMgaW50 IGlndF9maWxsX2JsdF90aHJlYWQodm9pZCAqYXJnKQo+IC17Cj4gLQlzdHJ1Y3QgaWd0X3RocmVh ZF9hcmcgKnRocmVhZCA9IGFyZzsKPiAtCXN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2luZSA9 IHRocmVhZC0+ZW5naW5lOwo+IC0Jc3RydWN0IHJuZF9zdGF0ZSAqcHJuZyA9ICZ0aHJlYWQtPnBy bmc7Cj4gLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOwo+IC0Jc3RydWN0IGk5MTVf Z2VtX2NvbnRleHQgKmN0eDsKPiAtCXN0cnVjdCBpbnRlbF9jb250ZXh0ICpjZTsKPiAtCXVuc2ln bmVkIGludCBwcmlvOwo+IC0JSUdUX1RJTUVPVVQoZW5kKTsKPiAtCXU2NCB0b3RhbCwgbWF4Owo+ IC0JaW50IGVycjsKPiAtCj4gLQljdHggPSB0aHJlYWQtPmN0eDsKPiAtCWlmICghY3R4KSB7Cj4g LQkJY3R4ID0gbGl2ZV9jb250ZXh0X2Zvcl9lbmdpbmUoZW5naW5lLCB0aHJlYWQtPmZpbGUpOwo+ IC0JCWlmIChJU19FUlIoY3R4KSkKPiAtCQkJcmV0dXJuIFBUUl9FUlIoY3R4KTsKPiAtCj4gLQkJ cHJpbyA9IGk5MTVfcHJhbmRvbV91MzJfbWF4X3N0YXRlKEk5MTVfUFJJT1JJVFlfTUFYLCBwcm5n KTsKPiAtCQljdHgtPnNjaGVkLnByaW9yaXR5ID0gcHJpbzsKPiAtCX0KPiAtCj4gLQljZSA9IGk5 MTVfZ2VtX2NvbnRleHRfZ2V0X2VuZ2luZShjdHgsIDApOwo+IC0JR0VNX0JVR19PTihJU19FUlIo Y2UpKTsKPiAtCj4gLQkvKgo+IC0JICogSWYgd2UgaGF2ZSBhIHRpbnkgc2hhcmVkIGFkZHJlc3Mg c3BhY2UsIGxpa2UgZm9yIHRoZSBHR1RUCj4gLQkgKiB0aGVuIHdlIGNhbid0IGJlIHRvbyBncmVl ZHkuCj4gLQkgKi8KPiAtCW1heCA9IGNlLT52bS0+dG90YWw7Cj4gLQlpZiAoaTkxNV9pc19nZ3R0 KGNlLT52bSkgfHwgdGhyZWFkLT5jdHgpCj4gLQkJbWF4ID0gZGl2X3U2NChtYXgsIHRocmVhZC0+ bl9jcHVzKTsKPiAtCW1heCA+Pj0gNDsKPiAtCj4gLQl0b3RhbCA9IFBBR0VfU0laRTsKPiAtCWRv IHsKPiAtCQkvKiBBaW0gdG8ga2VlcCB0aGUgcnVudGltZSB1bmRlciByZWFzb25hYmxlIGJvdW5k cyEgKi8KPiAtCQljb25zdCB1MzIgbWF4X3BoeXNfc2l6ZSA9IFNaXzY0SzsKPiAtCQl1MzIgdmFs ID0gcHJhbmRvbV91MzJfc3RhdGUocHJuZyk7Cj4gLQkJdTMyIHBoeXNfc3o7Cj4gLQkJdTMyIHN6 Owo+IC0JCXUzMiAqdmFkZHI7Cj4gLQkJdTMyIGk7Cj4gLQo+IC0JCXRvdGFsID0gbWluKHRvdGFs LCBtYXgpOwo+IC0JCXN6ID0gaTkxNV9wcmFuZG9tX3UzMl9tYXhfc3RhdGUodG90YWwsIHBybmcp ICsgMTsKPiAtCQlwaHlzX3N6ID0gc3ogJSBtYXhfcGh5c19zaXplICsgMTsKPiAtCj4gLQkJc3og PSByb3VuZF91cChzeiwgUEFHRV9TSVpFKTsKPiAtCQlwaHlzX3N6ID0gcm91bmRfdXAocGh5c19z eiwgUEFHRV9TSVpFKTsKPiAtCQlwaHlzX3N6ID0gbWluKHBoeXNfc3osIHN6KTsKPiAtCj4gLQkJ cHJfZGVidWcoIiVzIHdpdGggcGh5c19zej0gJXgsIHN6PSV4LCB2YWw9JXhcbiIsIF9fZnVuY19f LAo+IC0JCQkgcGh5c19zeiwgc3osIHZhbCk7Cj4gLQo+IC0JCW9iaiA9IGh1Z2VfZ2VtX29iamVj dChlbmdpbmUtPmk5MTUsIHBoeXNfc3osIHN6KTsKPiAtCQlpZiAoSVNfRVJSKG9iaikpIHsKPiAt CQkJZXJyID0gUFRSX0VSUihvYmopOwo+IC0JCQlnb3RvIGVycl9mbHVzaDsKPiAtCQl9Cj4gLQo+ IC0JCXZhZGRyID0gaTkxNV9nZW1fb2JqZWN0X3Bpbl9tYXBfdW5sb2NrZWQob2JqLCBJOTE1X01B UF9XQik7Cj4gLQkJaWYgKElTX0VSUih2YWRkcikpIHsKPiAtCQkJZXJyID0gUFRSX0VSUih2YWRk cik7Cj4gLQkJCWdvdG8gZXJyX3B1dDsKPiAtCQl9Cj4gLQo+IC0JCS8qCj4gLQkJICogTWFrZSBz dXJlIHRoZSBwb3RlbnRpYWxseSBhc3luYyBjbGZsdXNoIGRvZXMgaXRzIGpvYiwgaWYKPiAtCQkg KiByZXF1aXJlZC4KPiAtCQkgKi8KPiAtCQltZW1zZXQzMih2YWRkciwgdmFsIF4gMHhkZWFkYmVh ZiwKPiAtCQkJIGh1Z2VfZ2VtX29iamVjdF9waHlzX3NpemUob2JqKSAvIHNpemVvZih1MzIpKTsK PiAtCj4gLQkJaWYgKCEob2JqLT5jYWNoZV9jb2hlcmVudCAmIEk5MTVfQk9fQ0FDSEVfQ09IRVJF TlRfRk9SX1dSSVRFKSkKPiAtCQkJb2JqLT5jYWNoZV9kaXJ0eSA9IHRydWU7Cj4gLQo+IC0JCWVy ciA9IGk5MTVfZ2VtX29iamVjdF9maWxsX2JsdChvYmosIGNlLCB2YWwpOwo+IC0JCWlmIChlcnIp Cj4gLQkJCWdvdG8gZXJyX3VucGluOwo+IC0KPiAtCQllcnIgPSBpOTE1X2dlbV9vYmplY3Rfd2Fp dChvYmosIDAsIE1BWF9TQ0hFRFVMRV9USU1FT1VUKTsKPiAtCQlpZiAoZXJyKQo+IC0JCQlnb3Rv IGVycl91bnBpbjsKPiAtCj4gLQkJZm9yIChpID0gMDsgaSA8IGh1Z2VfZ2VtX29iamVjdF9waHlz X3NpemUob2JqKSAvIHNpemVvZih1MzIpOyBpICs9IDE3KSB7Cj4gLQkJCWlmICghKG9iai0+Y2Fj aGVfY29oZXJlbnQgJiBJOTE1X0JPX0NBQ0hFX0NPSEVSRU5UX0ZPUl9SRUFEKSkKPiAtCQkJCWRy bV9jbGZsdXNoX3ZpcnRfcmFuZ2UoJnZhZGRyW2ldLCBzaXplb2YodmFkZHJbaV0pKTsKPiAtCj4g LQkJCWlmICh2YWRkcltpXSAhPSB2YWwpIHsKPiAtCQkJCXByX2VycigidmFkZHJbJXVdPSV4LCBl eHBlY3RlZD0leFxuIiwgaSwKPiAtCQkJCSAgICAgICB2YWRkcltpXSwgdmFsKTsKPiAtCQkJCWVy ciA9IC1FSU5WQUw7Cj4gLQkJCQlnb3RvIGVycl91bnBpbjsKPiAtCQkJfQo+IC0JCX0KPiAtCj4g LQkJaTkxNV9nZW1fb2JqZWN0X3VucGluX21hcChvYmopOwo+IC0JCWk5MTVfZ2VtX29iamVjdF9w dXQob2JqKTsKPiAtCj4gLQkJdG90YWwgPDw9IDE7Cj4gLQl9IHdoaWxlICghdGltZV9hZnRlcihq aWZmaWVzLCBlbmQpKTsKPiAtCj4gLQlnb3RvIGVycl9mbHVzaDsKPiAtCj4gLWVycl91bnBpbjoK PiAtCWk5MTVfZ2VtX29iamVjdF91bnBpbl9tYXAob2JqKTsKPiAtZXJyX3B1dDoKPiAtCWk5MTVf Z2VtX29iamVjdF9wdXQob2JqKTsKPiAtZXJyX2ZsdXNoOgo+IC0JaWYgKGVyciA9PSAtRU5PTUVN KQo+IC0JCWVyciA9IDA7Cj4gLQo+IC0JaW50ZWxfY29udGV4dF9wdXQoY2UpOwo+IC0JcmV0dXJu IGVycjsKPiAtfQo+IC0KPiAtc3RhdGljIGludCBpZ3RfY29weV9ibHRfdGhyZWFkKHZvaWQgKmFy ZykKPiAtewo+IC0Jc3RydWN0IGlndF90aHJlYWRfYXJnICp0aHJlYWQgPSBhcmc7Cj4gLQlzdHJ1 Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmUgPSB0aHJlYWQtPmVuZ2luZTsKPiAtCXN0cnVjdCBy bmRfc3RhdGUgKnBybmcgPSAmdGhyZWFkLT5wcm5nOwo+IC0Jc3RydWN0IGRybV9pOTE1X2dlbV9v YmplY3QgKnNyYywgKmRzdDsKPiAtCXN0cnVjdCBpOTE1X2dlbV9jb250ZXh0ICpjdHg7Cj4gLQlz dHJ1Y3QgaW50ZWxfY29udGV4dCAqY2U7Cj4gLQl1bnNpZ25lZCBpbnQgcHJpbzsKPiAtCUlHVF9U SU1FT1VUKGVuZCk7Cj4gLQl1NjQgdG90YWwsIG1heDsKPiAtCWludCBlcnI7Cj4gLQo+IC0JY3R4 ID0gdGhyZWFkLT5jdHg7Cj4gLQlpZiAoIWN0eCkgewo+IC0JCWN0eCA9IGxpdmVfY29udGV4dF9m b3JfZW5naW5lKGVuZ2luZSwgdGhyZWFkLT5maWxlKTsKPiAtCQlpZiAoSVNfRVJSKGN0eCkpCj4g LQkJCXJldHVybiBQVFJfRVJSKGN0eCk7Cj4gLQo+IC0JCXByaW8gPSBpOTE1X3ByYW5kb21fdTMy X21heF9zdGF0ZShJOTE1X1BSSU9SSVRZX01BWCwgcHJuZyk7Cj4gLQkJY3R4LT5zY2hlZC5wcmlv cml0eSA9IHByaW87Cj4gLQl9Cj4gLQo+IC0JY2UgPSBpOTE1X2dlbV9jb250ZXh0X2dldF9lbmdp bmUoY3R4LCAwKTsKPiAtCUdFTV9CVUdfT04oSVNfRVJSKGNlKSk7Cj4gLQo+IC0JLyoKPiAtCSAq IElmIHdlIGhhdmUgYSB0aW55IHNoYXJlZCBhZGRyZXNzIHNwYWNlLCBsaWtlIGZvciB0aGUgR0dU VAo+IC0JICogdGhlbiB3ZSBjYW4ndCBiZSB0b28gZ3JlZWR5Lgo+IC0JICovCj4gLQltYXggPSBj ZS0+dm0tPnRvdGFsOwo+IC0JaWYgKGk5MTVfaXNfZ2d0dChjZS0+dm0pIHx8IHRocmVhZC0+Y3R4 KQo+IC0JCW1heCA9IGRpdl91NjQobWF4LCB0aHJlYWQtPm5fY3B1cyk7Cj4gLQltYXggPj49IDQ7 Cj4gLQo+IC0JdG90YWwgPSBQQUdFX1NJWkU7Cj4gLQlkbyB7Cj4gLQkJLyogQWltIHRvIGtlZXAg dGhlIHJ1bnRpbWUgdW5kZXIgcmVhc29uYWJsZSBib3VuZHMhICovCj4gLQkJY29uc3QgdTMyIG1h eF9waHlzX3NpemUgPSBTWl82NEs7Cj4gLQkJdTMyIHZhbCA9IHByYW5kb21fdTMyX3N0YXRlKHBy bmcpOwo+IC0JCXUzMiBwaHlzX3N6Owo+IC0JCXUzMiBzejsKPiAtCQl1MzIgKnZhZGRyOwo+IC0J CXUzMiBpOwo+IC0KPiAtCQl0b3RhbCA9IG1pbih0b3RhbCwgbWF4KTsKPiAtCQlzeiA9IGk5MTVf cHJhbmRvbV91MzJfbWF4X3N0YXRlKHRvdGFsLCBwcm5nKSArIDE7Cj4gLQkJcGh5c19zeiA9IHN6 ICUgbWF4X3BoeXNfc2l6ZSArIDE7Cj4gLQo+IC0JCXN6ID0gcm91bmRfdXAoc3osIFBBR0VfU0la RSk7Cj4gLQkJcGh5c19zeiA9IHJvdW5kX3VwKHBoeXNfc3osIFBBR0VfU0laRSk7Cj4gLQkJcGh5 c19zeiA9IG1pbihwaHlzX3N6LCBzeik7Cj4gLQo+IC0JCXByX2RlYnVnKCIlcyB3aXRoIHBoeXNf c3o9ICV4LCBzej0leCwgdmFsPSV4XG4iLCBfX2Z1bmNfXywKPiAtCQkJIHBoeXNfc3osIHN6LCB2 YWwpOwo+IC0KPiAtCQlzcmMgPSBodWdlX2dlbV9vYmplY3QoZW5naW5lLT5pOTE1LCBwaHlzX3N6 LCBzeik7Cj4gLQkJaWYgKElTX0VSUihzcmMpKSB7Cj4gLQkJCWVyciA9IFBUUl9FUlIoc3JjKTsK PiAtCQkJZ290byBlcnJfZmx1c2g7Cj4gLQkJfQo+IC0KPiAtCQl2YWRkciA9IGk5MTVfZ2VtX29i amVjdF9waW5fbWFwX3VubG9ja2VkKHNyYywgSTkxNV9NQVBfV0IpOwo+IC0JCWlmIChJU19FUlIo dmFkZHIpKSB7Cj4gLQkJCWVyciA9IFBUUl9FUlIodmFkZHIpOwo+IC0JCQlnb3RvIGVycl9wdXRf c3JjOwo+IC0JCX0KPiAtCj4gLQkJbWVtc2V0MzIodmFkZHIsIHZhbCwKPiAtCQkJIGh1Z2VfZ2Vt X29iamVjdF9waHlzX3NpemUoc3JjKSAvIHNpemVvZih1MzIpKTsKPiAtCj4gLQkJaTkxNV9nZW1f b2JqZWN0X3VucGluX21hcChzcmMpOwo+IC0KPiAtCQlpZiAoIShzcmMtPmNhY2hlX2NvaGVyZW50 ICYgSTkxNV9CT19DQUNIRV9DT0hFUkVOVF9GT1JfUkVBRCkpCj4gLQkJCXNyYy0+Y2FjaGVfZGly dHkgPSB0cnVlOwo+IC0KPiAtCQlkc3QgPSBodWdlX2dlbV9vYmplY3QoZW5naW5lLT5pOTE1LCBw aHlzX3N6LCBzeik7Cj4gLQkJaWYgKElTX0VSUihkc3QpKSB7Cj4gLQkJCWVyciA9IFBUUl9FUlIo ZHN0KTsKPiAtCQkJZ290byBlcnJfcHV0X3NyYzsKPiAtCQl9Cj4gLQo+IC0JCXZhZGRyID0gaTkx NV9nZW1fb2JqZWN0X3Bpbl9tYXBfdW5sb2NrZWQoZHN0LCBJOTE1X01BUF9XQik7Cj4gLQkJaWYg KElTX0VSUih2YWRkcikpIHsKPiAtCQkJZXJyID0gUFRSX0VSUih2YWRkcik7Cj4gLQkJCWdvdG8g ZXJyX3B1dF9kc3Q7Cj4gLQkJfQo+IC0KPiAtCQltZW1zZXQzMih2YWRkciwgdmFsIF4gMHhkZWFk YmVhZiwKPiAtCQkJIGh1Z2VfZ2VtX29iamVjdF9waHlzX3NpemUoZHN0KSAvIHNpemVvZih1MzIp KTsKPiAtCj4gLQkJaWYgKCEoZHN0LT5jYWNoZV9jb2hlcmVudCAmIEk5MTVfQk9fQ0FDSEVfQ09I RVJFTlRfRk9SX1dSSVRFKSkKPiAtCQkJZHN0LT5jYWNoZV9kaXJ0eSA9IHRydWU7Cj4gLQo+IC0J CWVyciA9IGk5MTVfZ2VtX29iamVjdF9jb3B5X2JsdChzcmMsIGRzdCwgY2UpOwo+IC0JCWlmIChl cnIpCj4gLQkJCWdvdG8gZXJyX3VucGluOwo+IC0KPiAtCQllcnIgPSBpOTE1X2dlbV9vYmplY3Rf d2FpdChkc3QsIDAsIE1BWF9TQ0hFRFVMRV9USU1FT1VUKTsKPiAtCQlpZiAoZXJyKQo+IC0JCQln b3RvIGVycl91bnBpbjsKPiAtCj4gLQkJZm9yIChpID0gMDsgaSA8IGh1Z2VfZ2VtX29iamVjdF9w aHlzX3NpemUoZHN0KSAvIHNpemVvZih1MzIpOyBpICs9IDE3KSB7Cj4gLQkJCWlmICghKGRzdC0+ Y2FjaGVfY29oZXJlbnQgJiBJOTE1X0JPX0NBQ0hFX0NPSEVSRU5UX0ZPUl9SRUFEKSkKPiAtCQkJ CWRybV9jbGZsdXNoX3ZpcnRfcmFuZ2UoJnZhZGRyW2ldLCBzaXplb2YodmFkZHJbaV0pKTsKPiAt Cj4gLQkJCWlmICh2YWRkcltpXSAhPSB2YWwpIHsKPiAtCQkJCXByX2VycigidmFkZHJbJXVdPSV4 LCBleHBlY3RlZD0leFxuIiwgaSwKPiAtCQkJCSAgICAgICB2YWRkcltpXSwgdmFsKTsKPiAtCQkJ CWVyciA9IC1FSU5WQUw7Cj4gLQkJCQlnb3RvIGVycl91bnBpbjsKPiAtCQkJfQo+IC0JCX0KPiAt Cj4gLQkJaTkxNV9nZW1fb2JqZWN0X3VucGluX21hcChkc3QpOwo+IC0KPiAtCQlpOTE1X2dlbV9v YmplY3RfcHV0KHNyYyk7Cj4gLQkJaTkxNV9nZW1fb2JqZWN0X3B1dChkc3QpOwo+IC0KPiAtCQl0 b3RhbCA8PD0gMTsKPiAtCX0gd2hpbGUgKCF0aW1lX2FmdGVyKGppZmZpZXMsIGVuZCkpOwo+IC0K PiAtCWdvdG8gZXJyX2ZsdXNoOwo+IC0KPiAtZXJyX3VucGluOgo+IC0JaTkxNV9nZW1fb2JqZWN0 X3VucGluX21hcChkc3QpOwo+IC1lcnJfcHV0X2RzdDoKPiAtCWk5MTVfZ2VtX29iamVjdF9wdXQo ZHN0KTsKPiAtZXJyX3B1dF9zcmM6Cj4gLQlpOTE1X2dlbV9vYmplY3RfcHV0KHNyYyk7Cj4gLWVy cl9mbHVzaDoKPiAtCWlmIChlcnIgPT0gLUVOT01FTSkKPiAtCQllcnIgPSAwOwo+IC0KPiAtCWlu dGVsX2NvbnRleHRfcHV0KGNlKTsKPiAtCXJldHVybiBlcnI7Cj4gLX0KPiAtCj4gLXN0YXRpYyBp bnQgaWd0X3RocmVhZGVkX2JsdChzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmUsCj4gLQkJ CSAgICBpbnQgKCpibHRfZm4pKHZvaWQgKmFyZyksCj4gLQkJCSAgICB1bnNpZ25lZCBpbnQgZmxh Z3MpCj4gLSNkZWZpbmUgU0lOR0xFX0NUWCBCSVQoMCkKPiAtewo+IC0Jc3RydWN0IGlndF90aHJl YWRfYXJnICp0aHJlYWQ7Cj4gLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKip0c2s7Cj4gLQl1bnNpZ25l ZCBpbnQgbl9jcHVzLCBpOwo+IC0JSTkxNV9STkRfU1RBVEUocHJuZyk7Cj4gLQlpbnQgZXJyID0g MDsKPiAtCj4gLQluX2NwdXMgPSBudW1fb25saW5lX2NwdXMoKSArIDE7Cj4gLQo+IC0JdHNrID0g a2NhbGxvYyhuX2NwdXMsIHNpemVvZihzdHJ1Y3QgdGFza19zdHJ1Y3QgKiksIEdGUF9LRVJORUwp Owo+IC0JaWYgKCF0c2spCj4gLQkJcmV0dXJuIDA7Cj4gLQo+IC0JdGhyZWFkID0ga2NhbGxvYyhu X2NwdXMsIHNpemVvZihzdHJ1Y3QgaWd0X3RocmVhZF9hcmcpLCBHRlBfS0VSTkVMKTsKPiAtCWlm ICghdGhyZWFkKQo+IC0JCWdvdG8gb3V0X3RzazsKPiAtCj4gLQl0aHJlYWRbMF0uZmlsZSA9IG1v Y2tfZmlsZShlbmdpbmUtPmk5MTUpOwo+IC0JaWYgKElTX0VSUih0aHJlYWRbMF0uZmlsZSkpIHsK PiAtCQllcnIgPSBQVFJfRVJSKHRocmVhZFswXS5maWxlKTsKPiAtCQlnb3RvIG91dF90aHJlYWQ7 Cj4gLQl9Cj4gLQo+IC0JaWYgKGZsYWdzICYgU0lOR0xFX0NUWCkgewo+IC0JCXRocmVhZFswXS5j dHggPSBsaXZlX2NvbnRleHRfZm9yX2VuZ2luZShlbmdpbmUsIHRocmVhZFswXS5maWxlKTsKPiAt CQlpZiAoSVNfRVJSKHRocmVhZFswXS5jdHgpKSB7Cj4gLQkJCWVyciA9IFBUUl9FUlIodGhyZWFk WzBdLmN0eCk7Cj4gLQkJCWdvdG8gb3V0X2ZpbGU7Cj4gLQkJfQo+IC0JfQo+IC0KPiAtCWZvciAo aSA9IDA7IGkgPCBuX2NwdXM7ICsraSkgewo+IC0JCXRocmVhZFtpXS5lbmdpbmUgPSBlbmdpbmU7 Cj4gLQkJdGhyZWFkW2ldLmZpbGUgPSB0aHJlYWRbMF0uZmlsZTsKPiAtCQl0aHJlYWRbaV0uY3R4 ID0gdGhyZWFkWzBdLmN0eDsKPiAtCQl0aHJlYWRbaV0ubl9jcHVzID0gbl9jcHVzOwo+IC0JCXRo cmVhZFtpXS5wcm5nID0KPiAtCQkJSTkxNV9STkRfU1RBVEVfSU5JVElBTElaRVIocHJhbmRvbV91 MzJfc3RhdGUoJnBybmcpKTsKPiAtCj4gLQkJdHNrW2ldID0ga3RocmVhZF9ydW4oYmx0X2ZuLCAm dGhyZWFkW2ldLCAiaWd0L2JsdC0lZCIsIGkpOwo+IC0JCWlmIChJU19FUlIodHNrW2ldKSkgewo+ IC0JCQllcnIgPSBQVFJfRVJSKHRza1tpXSk7Cj4gLQkJCWJyZWFrOwo+IC0JCX0KPiAtCj4gLQkJ Z2V0X3Rhc2tfc3RydWN0KHRza1tpXSk7Cj4gLQl9Cj4gLQo+IC0JeWllbGQoKTsgLyogc3RhcnQg YWxsIHRocmVhZHMgYmVmb3JlIHdlIGt0aHJlYWRfc3RvcCgpICovCj4gLQo+IC0JZm9yIChpID0g MDsgaSA8IG5fY3B1czsgKytpKSB7Cj4gLQkJaW50IHN0YXR1czsKPiAtCj4gLQkJaWYgKElTX0VS Ul9PUl9OVUxMKHRza1tpXSkpCj4gLQkJCWNvbnRpbnVlOwo+IC0KPiAtCQlzdGF0dXMgPSBrdGhy ZWFkX3N0b3AodHNrW2ldKTsKPiAtCQlpZiAoc3RhdHVzICYmICFlcnIpCj4gLQkJCWVyciA9IHN0 YXR1czsKPiAtCj4gLQkJcHV0X3Rhc2tfc3RydWN0KHRza1tpXSk7Cj4gLQl9Cj4gLQo+IC1vdXRf ZmlsZToKPiAtCWZwdXQodGhyZWFkWzBdLmZpbGUpOwo+IC1vdXRfdGhyZWFkOgo+IC0Ja2ZyZWUo dGhyZWFkKTsKPiAtb3V0X3RzazoKPiAtCWtmcmVlKHRzayk7Cj4gLQlyZXR1cm4gZXJyOwo+IC19 Cj4gLQo+IC1zdGF0aWMgaW50IHRlc3RfY29weV9lbmdpbmVzKHN0cnVjdCBkcm1faTkxNV9wcml2 YXRlICppOTE1LAo+IC0JCQkgICAgIGludCAoKmZuKSh2b2lkICphcmcpLAo+IC0JCQkgICAgIHVu c2lnbmVkIGludCBmbGFncykKPiAtewo+IC0Jc3RydWN0IGludGVsX2VuZ2luZV9jcyAqZW5naW5l Owo+IC0JaW50IHJldDsKPiAtCj4gLQlmb3JfZWFjaF91YWJpX2NsYXNzX2VuZ2luZShlbmdpbmUs IEk5MTVfRU5HSU5FX0NMQVNTX0NPUFksIGk5MTUpIHsKPiAtCQlyZXQgPSBpZ3RfdGhyZWFkZWRf Ymx0KGVuZ2luZSwgZm4sIGZsYWdzKTsKPiAtCQlpZiAocmV0KQo+IC0JCQlyZXR1cm4gcmV0Owo+ IC0JfQo+IC0KPiAtCXJldHVybiAwOwo+IC19Cj4gLQo+IC1zdGF0aWMgaW50IGlndF9maWxsX2Js dCh2b2lkICphcmcpCj4gLXsKPiAtCXJldHVybiB0ZXN0X2NvcHlfZW5naW5lcyhhcmcsIGlndF9m aWxsX2JsdF90aHJlYWQsIDApOwo+IC19Cj4gLQo+IC1zdGF0aWMgaW50IGlndF9maWxsX2JsdF9j dHgwKHZvaWQgKmFyZykKPiAtewo+IC0JcmV0dXJuIHRlc3RfY29weV9lbmdpbmVzKGFyZywgaWd0 X2ZpbGxfYmx0X3RocmVhZCwgU0lOR0xFX0NUWCk7Cj4gLX0KPiAtCj4gLXN0YXRpYyBpbnQgaWd0 X2NvcHlfYmx0KHZvaWQgKmFyZykKPiAtewo+IC0JcmV0dXJuIHRlc3RfY29weV9lbmdpbmVzKGFy ZywgaWd0X2NvcHlfYmx0X3RocmVhZCwgMCk7Cj4gLX0KPiAtCj4gLXN0YXRpYyBpbnQgaWd0X2Nv cHlfYmx0X2N0eDAodm9pZCAqYXJnKQo+IC17Cj4gLQlyZXR1cm4gdGVzdF9jb3B5X2VuZ2luZXMo YXJnLCBpZ3RfY29weV9ibHRfdGhyZWFkLCBTSU5HTEVfQ1RYKTsKPiAtfQo+IC0KPiAtaW50IGk5 MTVfZ2VtX29iamVjdF9ibHRfbGl2ZV9zZWxmdGVzdHMoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUg Kmk5MTUpCj4gLXsKPiAtCXN0YXRpYyBjb25zdCBzdHJ1Y3QgaTkxNV9zdWJ0ZXN0IHRlc3RzW10g PSB7Cj4gLQkJU1VCVEVTVChpZ3RfZmlsbF9ibHQpLAo+IC0JCVNVQlRFU1QoaWd0X2ZpbGxfYmx0 X2N0eDApLAo+IC0JCVNVQlRFU1QoaWd0X2NvcHlfYmx0KSwKPiAtCQlTVUJURVNUKGlndF9jb3B5 X2JsdF9jdHgwKSwKPiAtCX07Cj4gLQo+IC0JaWYgKGludGVsX2d0X2lzX3dlZGdlZCgmaTkxNS0+ Z3QpKQo+IC0JCXJldHVybiAwOwo+IC0KPiAtCXJldHVybiBpOTE1X2xpdmVfc3VidGVzdHModGVz dHMsIGk5MTUpOwo+IC19Cj4gLQo+IC1pbnQgaTkxNV9nZW1fb2JqZWN0X2JsdF9wZXJmX3NlbGZ0 ZXN0cyhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSkKPiAtewo+IC0Jc3RhdGljIGNvbnN0 IHN0cnVjdCBpOTE1X3N1YnRlc3QgdGVzdHNbXSA9IHsKPiAtCQlTVUJURVNUKHBlcmZfZmlsbF9i bHQpLAo+IC0JCVNVQlRFU1QocGVyZl9jb3B5X2JsdCksCj4gLQl9Owo+IC0KPiAtCWlmIChpbnRl bF9ndF9pc193ZWRnZWQoJmk5MTUtPmd0KSkKPiAtCQlyZXR1cm4gMDsKPiAtCj4gLQlyZXR1cm4g aTkxNV9saXZlX3N1YnRlc3RzKHRlc3RzLCBpOTE1KTsKPiAtfQo+IGRpZmYgLS1naXQgYS9kcml2 ZXJzL2dwdS9kcm0vaTkxNS9zZWxmdGVzdHMvaTkxNV9saXZlX3NlbGZ0ZXN0cy5oIGIvZHJpdmVy cy9ncHUvZHJtL2k5MTUvc2VsZnRlc3RzL2k5MTVfbGl2ZV9zZWxmdGVzdHMuaAo+IGluZGV4IDZm NTg5M2VjZDU0OS4uMWFlM2Y4MDM5ZDY4IDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9p OTE1L3NlbGZ0ZXN0cy9pOTE1X2xpdmVfc2VsZnRlc3RzLmgKPiArKysgYi9kcml2ZXJzL2dwdS9k cm0vaTkxNS9zZWxmdGVzdHMvaTkxNV9saXZlX3NlbGZ0ZXN0cy5oCj4gQEAgLTM5LDcgKzM5LDYg QEAgc2VsZnRlc3QoZXZpY3QsIGk5MTVfZ2VtX2V2aWN0X2xpdmVfc2VsZnRlc3RzKQo+ICAgc2Vs ZnRlc3QoaHVnZXBhZ2VzLCBpOTE1X2dlbV9odWdlX3BhZ2VfbGl2ZV9zZWxmdGVzdHMpCj4gICBz ZWxmdGVzdChnZW1fY29udGV4dHMsIGk5MTVfZ2VtX2NvbnRleHRfbGl2ZV9zZWxmdGVzdHMpCj4g ICBzZWxmdGVzdChnZW1fZXhlY2J1ZiwgaTkxNV9nZW1fZXhlY2J1ZmZlcl9saXZlX3NlbGZ0ZXN0 cykKPiAtc2VsZnRlc3QoYmx0LCBpOTE1X2dlbV9vYmplY3RfYmx0X2xpdmVfc2VsZnRlc3RzKQo+ ICAgc2VsZnRlc3QocmVzZXQsIGludGVsX3Jlc2V0X2xpdmVfc2VsZnRlc3RzKQo+ICAgc2VsZnRl c3QobWVtb3J5X3JlZ2lvbiwgaW50ZWxfbWVtb3J5X3JlZ2lvbl9saXZlX3NlbGZ0ZXN0cykKPiAg IHNlbGZ0ZXN0KGhhbmdjaGVjaywgaW50ZWxfaGFuZ2NoZWNrX2xpdmVfc2VsZnRlc3RzKQo+IGRp ZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9zZWxmdGVzdHMvaTkxNV9wZXJmX3NlbGZ0 ZXN0cy5oIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvc2VsZnRlc3RzL2k5MTVfcGVyZl9zZWxmdGVz dHMuaAo+IGluZGV4IDUwNzdkYzNjM2I4Yy4uMDU4NDUwZDM1MWY3IDEwMDY0NAo+IC0tLSBhL2Ry aXZlcnMvZ3B1L2RybS9pOTE1L3NlbGZ0ZXN0cy9pOTE1X3BlcmZfc2VsZnRlc3RzLmgKPiArKysg Yi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9zZWxmdGVzdHMvaTkxNV9wZXJmX3NlbGZ0ZXN0cy5oCj4g QEAgLTE4LDUgKzE4LDQgQEAKPiAgIHNlbGZ0ZXN0KGVuZ2luZV9jcywgaW50ZWxfZW5naW5lX2Nz X3BlcmZfc2VsZnRlc3RzKQo+ICAgc2VsZnRlc3QocmVxdWVzdCwgaTkxNV9yZXF1ZXN0X3BlcmZf c2VsZnRlc3RzKQo+ICAgc2VsZnRlc3QobWlncmF0ZSwgaW50ZWxfbWlncmF0ZV9wZXJmX3NlbGZ0 ZXN0cykKPiAtc2VsZnRlc3QoYmx0LCBpOTE1X2dlbV9vYmplY3RfYmx0X3BlcmZfc2VsZnRlc3Rz KQo+ICAgc2VsZnRlc3QocmVnaW9uLCBpbnRlbF9tZW1vcnlfcmVnaW9uX3BlcmZfc2VsZnRlc3Rz KQo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9zZWxmdGVzdHMvaW50ZWxfbWVt b3J5X3JlZ2lvbi5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvc2VsZnRlc3RzL2ludGVsX21lbW9y eV9yZWdpb24uYwo+IGluZGV4IGM4NWQ1MTZiODVjZC4uMmUxOGYzYTNkNTM4IDEwMDY0NAo+IC0t LSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L3NlbGZ0ZXN0cy9pbnRlbF9tZW1vcnlfcmVnaW9uLmMK PiArKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9zZWxmdGVzdHMvaW50ZWxfbWVtb3J5X3JlZ2lv bi5jCj4gQEAgLTE1LDExICsxNSwxMiBAQAo+ICAgI2luY2x1ZGUgImdlbS9pOTE1X2dlbV9jb250 ZXh0LmgiCj4gICAjaW5jbHVkZSAiZ2VtL2k5MTVfZ2VtX2xtZW0uaCIKPiAgICNpbmNsdWRlICJn ZW0vaTkxNV9nZW1fcmVnaW9uLmgiCj4gLSNpbmNsdWRlICJnZW0vaTkxNV9nZW1fb2JqZWN0X2Js dC5oIgo+ICAgI2luY2x1ZGUgImdlbS9zZWxmdGVzdHMvaWd0X2dlbV91dGlscy5oIgo+ICAgI2lu Y2x1ZGUgImdlbS9zZWxmdGVzdHMvbW9ja19jb250ZXh0LmgiCj4gKyNpbmNsdWRlICJndC9pbnRl bF9lbmdpbmVfcG0uaCIKPiAgICNpbmNsdWRlICJndC9pbnRlbF9lbmdpbmVfdXNlci5oIgo+ICAg I2luY2x1ZGUgImd0L2ludGVsX2d0LmgiCj4gKyNpbmNsdWRlICJndC9pbnRlbF9taWdyYXRlLmgi Cj4gICAjaW5jbHVkZSAiaTkxNV9tZW1jcHkuaCIKPiAgICNpbmNsdWRlICJzZWxmdGVzdHMvaWd0 X2ZsdXNoX3Rlc3QuaCIKPiAgICNpbmNsdWRlICJzZWxmdGVzdHMvaTkxNV9yYW5kb20uaCIKPiBA QCAtNzQxLDYgKzc0Miw3IEBAIHN0YXRpYyBpbnQgaWd0X2xtZW1fd3JpdGVfY3B1KHZvaWQgKmFy ZykKPiAgIAkJUEFHRV9TSVpFIC0gNjQsCj4gICAJfTsKPiAgIAlzdHJ1Y3QgaW50ZWxfZW5naW5l X2NzICplbmdpbmU7Cj4gKwlzdHJ1Y3QgaTkxNV9yZXF1ZXN0ICpycTsKPiAgIAl1MzIgKnZhZGRy Owo+ICAgCXUzMiBzejsKPiAgIAl1MzIgaTsKPiBAQCAtNzY3LDE1ICs3NjksMjAgQEAgc3RhdGlj IGludCBpZ3RfbG1lbV93cml0ZV9jcHUodm9pZCAqYXJnKQo+ICAgCQlnb3RvIG91dF9wdXQ7Cj4g ICAJfQo+ICAgCj4gKwlpOTE1X2dlbV9vYmplY3RfbG9jayhvYmosIE5VTEwpOwo+ICAgCS8qIFB1 dCB0aGUgcGFnZXMgaW50byBhIGtub3duIHN0YXRlIC0tIGZyb20gdGhlIGdwdSBmb3IgYWRkZWQg ZnVuICovCj4gICAJaW50ZWxfZW5naW5lX3BtX2dldChlbmdpbmUpOwo+IC0JZXJyID0gaTkxNV9n ZW1fb2JqZWN0X2ZpbGxfYmx0KG9iaiwgZW5naW5lLT5rZXJuZWxfY29udGV4dCwgMHhkZWFkYmVh Zik7Cj4gLQlpbnRlbF9lbmdpbmVfcG1fcHV0KGVuZ2luZSk7Cj4gLQlpZiAoZXJyKQo+IC0JCWdv dG8gb3V0X3VucGluOwo+ICsJZXJyID0gaW50ZWxfY29udGV4dF9taWdyYXRlX2NsZWFyKGVuZ2lu ZS0+Z3QtPm1pZ3JhdGUuY29udGV4dCwgTlVMTCwKPiArCQkJCQkgIG9iai0+bW0ucGFnZXMtPnNn bCwgSTkxNV9DQUNIRV9OT05FLAo+ICsJCQkJCSAgdHJ1ZSwgMHhkZWFkYmVhZiwgJnJxKTsKPiAr CWlmIChycSkgewo+ICsJCWRtYV9yZXN2X2FkZF9leGNsX2ZlbmNlKG9iai0+YmFzZS5yZXN2LCAm cnEtPmZlbmNlKTsKPiArCQlpOTE1X3JlcXVlc3RfcHV0KHJxKTsKPiArCX0KPiAgIAo+IC0JaTkx NV9nZW1fb2JqZWN0X2xvY2sob2JqLCBOVUxMKTsKPiAtCWVyciA9IGk5MTVfZ2VtX29iamVjdF9z ZXRfdG9fd2NfZG9tYWluKG9iaiwgdHJ1ZSk7Cj4gKwlpbnRlbF9lbmdpbmVfcG1fcHV0KGVuZ2lu ZSk7Cj4gKwlpZiAoIWVycikKPiArCQllcnIgPSBpOTE1X2dlbV9vYmplY3Rfc2V0X3RvX3djX2Rv bWFpbihvYmosIHRydWUpOwo+ICAgCWk5MTVfZ2VtX29iamVjdF91bmxvY2sob2JqKTsKPiAgIAlp ZiAoZXJyKQo+ICAgCQlnb3RvIG91dF91bnBpbjsKPiAKX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX18KSW50ZWwtZ2Z4IG1haWxpbmcgbGlzdApJbnRlbC1nZnhA bGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxt YW4vbGlzdGluZm8vaW50ZWwtZ2Z4Cg==