From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.6 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 2E6BEC47095 for ; Wed, 9 Jun 2021 04:36:28 +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 EB8AA6124B for ; Wed, 9 Jun 2021 04:36:27 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org EB8AA6124B Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=jlekstrand.net 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 3088E6ECA1; Wed, 9 Jun 2021 04:36:22 +0000 (UTC) Received: from mail-pg1-x52b.google.com (mail-pg1-x52b.google.com [IPv6:2607:f8b0:4864:20::52b]) by gabe.freedesktop.org (Postfix) with ESMTPS id BF1696ECA1 for ; Wed, 9 Jun 2021 04:36:21 +0000 (UTC) Received: by mail-pg1-x52b.google.com with SMTP id l184so2851263pgd.8 for ; Tue, 08 Jun 2021 21:36:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=jlekstrand-net.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=YY2xfj/muBCPnRrbUysqp81YKOJx+xN58hZknSXzX+A=; b=devlMEZbxZpkHLhj5yfif5mcRNoS6hEJjJpZCaI/mj/Lc0hoT8sTZ5UYhUj6ulhB9S EoBdizdmxg8FgmWHKHbEDtP2Wm75ian53x9NOizir6DBu1K9U1Bg5RXsPyMssE5rc/zA 8E6qMdIb5jOPqRQv0LX62zaIYh8kUHgThugKWqLK50qQgIK5JS8e5uhPGPuLPsS4hmoJ qqoIxmDCX7Sy8AjFjwEbhVhbnbyIG5hAKsTrdCuarZRLFgQ+D29TcMmiNA6DHRMalSFW 8kchet925fINs8CJi3ztobeOiYRC+P9UDG4InqWurrUqPgExhtdTl9YzoVL+K+5sEK+b uliQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=YY2xfj/muBCPnRrbUysqp81YKOJx+xN58hZknSXzX+A=; b=TRCOz2QyQxnLXLlYLzyN7wNr8GgWqFmJFaF+EhhgAihUD36hlLPhDhK57vDx0HCzlw flocXSSV6/GT+mltI+r/0NaTS1q16knaJNxN1OdkbDKhD7BOyOX2Qz2Xgp/mXQGnSTjn bT3Qk6e0gBfd6+cHJjc9lC5l/7nzI981XwnXdkEWvW9o1I2214izWPHNiM/pliQQDZMB UrGoK7Frdw4BsO0VENHZjzagLUDGR5pBatwTE5ovIJilora1TTOY8HKt6eFd1JThjpTy VBuJX2PrOrNX+k15NaxDp1YbIJ1zIiGTAjGTkkfTVrVzRAItS72fraLQNYUBfOxJztwF Swrw== X-Gm-Message-State: AOAM531X3JKxT8+vTIGhJn12AJTDdrpJ0RMIvHukMqI+qkaKKp5Jzb6e etBZpfVtatSqbD1y+2wwhKlnRTLSHyVMqw== X-Google-Smtp-Source: ABdhPJyExtgycQ3aMN1OF0tyCMcx1x6e+qEbvP0gJ/iapg6wY+mHYrcQ314psOB4OS85IOfSHXItdw== X-Received: by 2002:a05:6a00:10c1:b029:2f1:72d8:4ac4 with SMTP id d1-20020a056a0010c1b02902f172d84ac4mr3401402pfu.24.1623213380952; Tue, 08 Jun 2021 21:36:20 -0700 (PDT) Received: from omlet.com (jfdmzpr06-ext.jf.intel.com. [134.134.137.75]) by smtp.gmail.com with ESMTPSA id t5sm11991612pfe.116.2021.06.08.21.36.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 08 Jun 2021 21:36:20 -0700 (PDT) From: Jason Ekstrand To: dri-devel@lists.freedesktop.org, intel-gfx@lists.freedesktop.org Subject: [PATCH 01/31] drm/i915: Drop I915_CONTEXT_PARAM_RINGSIZE Date: Tue, 8 Jun 2021 23:35:43 -0500 Message-Id: <20210609043613.102962-2-jason@jlekstrand.net> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210609043613.102962-1-jason@jlekstrand.net> References: <20210609043613.102962-1-jason@jlekstrand.net> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Daniel Vetter , Jason Ekstrand Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" This reverts commit 88be76cdafc7 ("drm/i915: Allow userspace to specify ringsize on construction"). This API was originally added for OpenCL but the compute-runtime PR has sat open for a year without action so we can still pull it out if we want. I argue we should drop it for three reasons: 1. If the compute-runtime PR has sat open for a year, this clearly isn't that important. 2. It's a very leaky API. Ring size is an implementation detail of the current execlist scheduler and really only makes sense there. It can't apply to the older ring-buffer scheduler on pre-execlist hardware because that's shared across all contexts and it won't apply to the GuC scheduler that's in the pipeline. 3. Having userspace set a ring size in bytes is a bad solution to the problem of having too small a ring. There is no way that userspace has the information to know how to properly set the ring size so it's just going to detect the feature and always set it to the maximum of 512K. This is what the compute-runtime PR does. The scheduler in i915, on the other hand, does have the information to make an informed choice. It could detect if the ring size is a problem and grow it itself. Or, if that's too hard, we could just increase the default size from 16K to 32K or even 64K instead of relying on userspace to do it. Let's drop this API for now and, if someone decides they really care about solving this problem, they can do it properly. Signed-off-by: Jason Ekstrand Reviewed-by: Daniel Vetter --- drivers/gpu/drm/i915/Makefile | 1 - drivers/gpu/drm/i915/gem/i915_gem_context.c | 85 +------------------ drivers/gpu/drm/i915/gt/intel_context_param.c | 63 -------------- drivers/gpu/drm/i915/gt/intel_context_param.h | 3 - include/uapi/drm/i915_drm.h | 20 +---- 5 files changed, 4 insertions(+), 168 deletions(-) delete mode 100644 drivers/gpu/drm/i915/gt/intel_context_param.c diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile index 4f22cac1c49be..0a3e8c85da9f2 100644 --- a/drivers/gpu/drm/i915/Makefile +++ b/drivers/gpu/drm/i915/Makefile @@ -89,7 +89,6 @@ gt-y += \ gt/gen8_ppgtt.o \ gt/intel_breadcrumbs.o \ gt/intel_context.o \ - gt/intel_context_param.o \ gt/intel_context_sseu.o \ gt/intel_engine_cs.o \ gt/intel_engine_heartbeat.o \ diff --git a/drivers/gpu/drm/i915/gem/i915_gem_context.c b/drivers/gpu/drm/i915/gem/i915_gem_context.c index 7720b8c22c816..ddc3cc3f8f092 100644 --- a/drivers/gpu/drm/i915/gem/i915_gem_context.c +++ b/drivers/gpu/drm/i915/gem/i915_gem_context.c @@ -1334,63 +1334,6 @@ static int set_ppgtt(struct drm_i915_file_private *file_priv, return err; } -static int __apply_ringsize(struct intel_context *ce, void *sz) -{ - return intel_context_set_ring_size(ce, (unsigned long)sz); -} - -static int set_ringsize(struct i915_gem_context *ctx, - struct drm_i915_gem_context_param *args) -{ - if (!HAS_LOGICAL_RING_CONTEXTS(ctx->i915)) - return -ENODEV; - - if (args->size) - return -EINVAL; - - if (!IS_ALIGNED(args->value, I915_GTT_PAGE_SIZE)) - return -EINVAL; - - if (args->value < I915_GTT_PAGE_SIZE) - return -EINVAL; - - if (args->value > 128 * I915_GTT_PAGE_SIZE) - return -EINVAL; - - return context_apply_all(ctx, - __apply_ringsize, - __intel_context_ring_size(args->value)); -} - -static int __get_ringsize(struct intel_context *ce, void *arg) -{ - long sz; - - sz = intel_context_get_ring_size(ce); - GEM_BUG_ON(sz > INT_MAX); - - return sz; /* stop on first engine */ -} - -static int get_ringsize(struct i915_gem_context *ctx, - struct drm_i915_gem_context_param *args) -{ - int sz; - - if (!HAS_LOGICAL_RING_CONTEXTS(ctx->i915)) - return -ENODEV; - - if (args->size) - return -EINVAL; - - sz = context_apply_all(ctx, __get_ringsize, NULL); - if (sz < 0) - return sz; - - args->value = sz; - return 0; -} - int i915_gem_user_to_context_sseu(struct intel_gt *gt, const struct drm_i915_gem_context_param_sseu *user, @@ -2036,11 +1979,8 @@ static int ctx_setparam(struct drm_i915_file_private *fpriv, ret = set_persistence(ctx, args); break; - case I915_CONTEXT_PARAM_RINGSIZE: - ret = set_ringsize(ctx, args); - break; - case I915_CONTEXT_PARAM_BAN_PERIOD: + case I915_CONTEXT_PARAM_RINGSIZE: default: ret = -EINVAL; break; @@ -2068,18 +2008,6 @@ static int create_setparam(struct i915_user_extension __user *ext, void *data) return ctx_setparam(arg->fpriv, arg->ctx, &local.param); } -static int copy_ring_size(struct intel_context *dst, - struct intel_context *src) -{ - long sz; - - sz = intel_context_get_ring_size(src); - if (sz < 0) - return sz; - - return intel_context_set_ring_size(dst, sz); -} - static int clone_engines(struct i915_gem_context *dst, struct i915_gem_context *src) { @@ -2124,12 +2052,6 @@ static int clone_engines(struct i915_gem_context *dst, } intel_context_set_gem(clone->engines[n], dst); - - /* Copy across the preferred ringsize */ - if (copy_ring_size(clone->engines[n], e->engines[n])) { - __free_engines(clone, n + 1); - goto err_unlock; - } } clone->num_engines = n; i915_sw_fence_complete(&e->fence); @@ -2489,11 +2411,8 @@ int i915_gem_context_getparam_ioctl(struct drm_device *dev, void *data, args->value = i915_gem_context_is_persistent(ctx); break; - case I915_CONTEXT_PARAM_RINGSIZE: - ret = get_ringsize(ctx, args); - break; - case I915_CONTEXT_PARAM_BAN_PERIOD: + case I915_CONTEXT_PARAM_RINGSIZE: default: ret = -EINVAL; break; diff --git a/drivers/gpu/drm/i915/gt/intel_context_param.c b/drivers/gpu/drm/i915/gt/intel_context_param.c deleted file mode 100644 index 65dcd090245d6..0000000000000 --- a/drivers/gpu/drm/i915/gt/intel_context_param.c +++ /dev/null @@ -1,63 +0,0 @@ -// SPDX-License-Identifier: MIT -/* - * Copyright © 2019 Intel Corporation - */ - -#include "i915_active.h" -#include "intel_context.h" -#include "intel_context_param.h" -#include "intel_ring.h" - -int intel_context_set_ring_size(struct intel_context *ce, long sz) -{ - int err; - - if (intel_context_lock_pinned(ce)) - return -EINTR; - - err = i915_active_wait(&ce->active); - if (err < 0) - goto unlock; - - if (intel_context_is_pinned(ce)) { - err = -EBUSY; /* In active use, come back later! */ - goto unlock; - } - - if (test_bit(CONTEXT_ALLOC_BIT, &ce->flags)) { - struct intel_ring *ring; - - /* Replace the existing ringbuffer */ - ring = intel_engine_create_ring(ce->engine, sz); - if (IS_ERR(ring)) { - err = PTR_ERR(ring); - goto unlock; - } - - intel_ring_put(ce->ring); - ce->ring = ring; - - /* Context image will be updated on next pin */ - } else { - ce->ring = __intel_context_ring_size(sz); - } - -unlock: - intel_context_unlock_pinned(ce); - return err; -} - -long intel_context_get_ring_size(struct intel_context *ce) -{ - long sz = (unsigned long)READ_ONCE(ce->ring); - - if (test_bit(CONTEXT_ALLOC_BIT, &ce->flags)) { - if (intel_context_lock_pinned(ce)) - return -EINTR; - - sz = ce->ring->size; - intel_context_unlock_pinned(ce); - } - - return sz; -} diff --git a/drivers/gpu/drm/i915/gt/intel_context_param.h b/drivers/gpu/drm/i915/gt/intel_context_param.h index 3ecacc675f414..dffedd983693d 100644 --- a/drivers/gpu/drm/i915/gt/intel_context_param.h +++ b/drivers/gpu/drm/i915/gt/intel_context_param.h @@ -10,9 +10,6 @@ #include "intel_context.h" -int intel_context_set_ring_size(struct intel_context *ce, long sz); -long intel_context_get_ring_size(struct intel_context *ce); - static inline int intel_context_set_watchdog_us(struct intel_context *ce, u64 timeout_us) { diff --git a/include/uapi/drm/i915_drm.h b/include/uapi/drm/i915_drm.h index c2c7759b7d2ee..ad8f1a0f587f6 100644 --- a/include/uapi/drm/i915_drm.h +++ b/include/uapi/drm/i915_drm.h @@ -1723,24 +1723,8 @@ struct drm_i915_gem_context_param { */ #define I915_CONTEXT_PARAM_PERSISTENCE 0xb -/* - * I915_CONTEXT_PARAM_RINGSIZE: - * - * Sets the size of the CS ringbuffer to use for logical ring contexts. This - * applies a limit of how many batches can be queued to HW before the caller - * is blocked due to lack of space for more commands. - * - * Only reliably possible to be set prior to first use, i.e. during - * construction. At any later point, the current execution must be flushed as - * the ring can only be changed while the context is idle. Note, the ringsize - * can be specified as a constructor property, see - * I915_CONTEXT_CREATE_EXT_SETPARAM, but can also be set later if required. - * - * Only applies to the current set of engine and lost when those engines - * are replaced by a new mapping (see I915_CONTEXT_PARAM_ENGINES). - * - * Must be between 4 - 512 KiB, in intervals of page size [4 KiB]. - * Default is 16 KiB. +/* This API has been removed. On the off chance someone somewhere has + * attempted to use it, never re-use this context param number. */ #define I915_CONTEXT_PARAM_RINGSIZE 0xc /* Must be kept compact -- no holes and well documented */ -- 2.31.1 From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.6 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 729D1C47095 for ; Wed, 9 Jun 2021 04:36:31 +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 402166124B for ; Wed, 9 Jun 2021 04:36:31 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 402166124B Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=jlekstrand.net 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 44C226EC86; Wed, 9 Jun 2021 04:36:24 +0000 (UTC) Received: from mail-pf1-x435.google.com (mail-pf1-x435.google.com [IPv6:2607:f8b0:4864:20::435]) by gabe.freedesktop.org (Postfix) with ESMTPS id 4C3436EC86 for ; Wed, 9 Jun 2021 04:36:21 +0000 (UTC) Received: by mail-pf1-x435.google.com with SMTP id h12so14608863pfe.2 for ; Tue, 08 Jun 2021 21:36:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=jlekstrand-net.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=YY2xfj/muBCPnRrbUysqp81YKOJx+xN58hZknSXzX+A=; b=devlMEZbxZpkHLhj5yfif5mcRNoS6hEJjJpZCaI/mj/Lc0hoT8sTZ5UYhUj6ulhB9S EoBdizdmxg8FgmWHKHbEDtP2Wm75ian53x9NOizir6DBu1K9U1Bg5RXsPyMssE5rc/zA 8E6qMdIb5jOPqRQv0LX62zaIYh8kUHgThugKWqLK50qQgIK5JS8e5uhPGPuLPsS4hmoJ qqoIxmDCX7Sy8AjFjwEbhVhbnbyIG5hAKsTrdCuarZRLFgQ+D29TcMmiNA6DHRMalSFW 8kchet925fINs8CJi3ztobeOiYRC+P9UDG4InqWurrUqPgExhtdTl9YzoVL+K+5sEK+b uliQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=YY2xfj/muBCPnRrbUysqp81YKOJx+xN58hZknSXzX+A=; b=AadMsstNt0r8pHUjka+Yxd+gfMwOVD82gzvanqTJP+lcyjJYVw87kPTf0BXm66MJbX 2b6yHf/y6+zj03zrMo1mNDYwPQJhha2aJ2CTzm8L1QJQCueqLhK3GCvC9xkTxEx3Igfe h0tHNeAYSu+7+OtZsNuIgeV7RB7it3Gjo3kpuHpNQFw6jDzmgZsgJybw/7FYbSc1IpVM dLBywme1v0CbYl+1WZKGdf/0rdp1wxOdZ9enDO6xNJ0VgvsnXjiCHj2dn3F3n1XNLOvM s0xm12nfRpHSpPADuaJPAQ+nhCdE3Oa3ytqJEelF3XHJuuZYANCjy4p7P8YZj9UkRBtW 6NZw== X-Gm-Message-State: AOAM532/bCzWs++o5oEEm0C4o3cHW5YokdvM5Jo0pFBQDMzKwvAq8LAq DOf8Y+QfhtV90R5A5uTMs5l6og== X-Google-Smtp-Source: ABdhPJyExtgycQ3aMN1OF0tyCMcx1x6e+qEbvP0gJ/iapg6wY+mHYrcQ314psOB4OS85IOfSHXItdw== X-Received: by 2002:a05:6a00:10c1:b029:2f1:72d8:4ac4 with SMTP id d1-20020a056a0010c1b02902f172d84ac4mr3401402pfu.24.1623213380952; Tue, 08 Jun 2021 21:36:20 -0700 (PDT) Received: from omlet.com (jfdmzpr06-ext.jf.intel.com. [134.134.137.75]) by smtp.gmail.com with ESMTPSA id t5sm11991612pfe.116.2021.06.08.21.36.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 08 Jun 2021 21:36:20 -0700 (PDT) From: Jason Ekstrand To: dri-devel@lists.freedesktop.org, intel-gfx@lists.freedesktop.org Date: Tue, 8 Jun 2021 23:35:43 -0500 Message-Id: <20210609043613.102962-2-jason@jlekstrand.net> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210609043613.102962-1-jason@jlekstrand.net> References: <20210609043613.102962-1-jason@jlekstrand.net> MIME-Version: 1.0 Subject: [Intel-gfx] [PATCH 01/31] drm/i915: Drop I915_CONTEXT_PARAM_RINGSIZE X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Daniel Vetter Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" VGhpcyByZXZlcnRzIGNvbW1pdCA4OGJlNzZjZGFmYzcgKCJkcm0vaTkxNTogQWxsb3cgdXNlcnNw YWNlIHRvIHNwZWNpZnkKcmluZ3NpemUgb24gY29uc3RydWN0aW9uIikuICBUaGlzIEFQSSB3YXMg b3JpZ2luYWxseSBhZGRlZCBmb3IgT3BlbkNMCmJ1dCB0aGUgY29tcHV0ZS1ydW50aW1lIFBSIGhh cyBzYXQgb3BlbiBmb3IgYSB5ZWFyIHdpdGhvdXQgYWN0aW9uIHNvIHdlCmNhbiBzdGlsbCBwdWxs IGl0IG91dCBpZiB3ZSB3YW50LiAgSSBhcmd1ZSB3ZSBzaG91bGQgZHJvcCBpdCBmb3IgdGhyZWUK cmVhc29uczoKCiAxLiBJZiB0aGUgY29tcHV0ZS1ydW50aW1lIFBSIGhhcyBzYXQgb3BlbiBmb3Ig YSB5ZWFyLCB0aGlzIGNsZWFybHkKICAgIGlzbid0IHRoYXQgaW1wb3J0YW50LgoKIDIuIEl0J3Mg YSB2ZXJ5IGxlYWt5IEFQSS4gIFJpbmcgc2l6ZSBpcyBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwg b2YgdGhlCiAgICBjdXJyZW50IGV4ZWNsaXN0IHNjaGVkdWxlciBhbmQgcmVhbGx5IG9ubHkgbWFr ZXMgc2Vuc2UgdGhlcmUuICBJdAogICAgY2FuJ3QgYXBwbHkgdG8gdGhlIG9sZGVyIHJpbmctYnVm ZmVyIHNjaGVkdWxlciBvbiBwcmUtZXhlY2xpc3QKICAgIGhhcmR3YXJlIGJlY2F1c2UgdGhhdCdz IHNoYXJlZCBhY3Jvc3MgYWxsIGNvbnRleHRzIGFuZCBpdCB3b24ndAogICAgYXBwbHkgdG8gdGhl IEd1QyBzY2hlZHVsZXIgdGhhdCdzIGluIHRoZSBwaXBlbGluZS4KCiAzLiBIYXZpbmcgdXNlcnNw YWNlIHNldCBhIHJpbmcgc2l6ZSBpbiBieXRlcyBpcyBhIGJhZCBzb2x1dGlvbiB0byB0aGUKICAg IHByb2JsZW0gb2YgaGF2aW5nIHRvbyBzbWFsbCBhIHJpbmcuICBUaGVyZSBpcyBubyB3YXkgdGhh dCB1c2Vyc3BhY2UKICAgIGhhcyB0aGUgaW5mb3JtYXRpb24gdG8ga25vdyBob3cgdG8gcHJvcGVy bHkgc2V0IHRoZSByaW5nIHNpemUgc28KICAgIGl0J3MganVzdCBnb2luZyB0byBkZXRlY3QgdGhl IGZlYXR1cmUgYW5kIGFsd2F5cyBzZXQgaXQgdG8gdGhlCiAgICBtYXhpbXVtIG9mIDUxMksuICBU aGlzIGlzIHdoYXQgdGhlIGNvbXB1dGUtcnVudGltZSBQUiBkb2VzLiAgVGhlCiAgICBzY2hlZHVs ZXIgaW4gaTkxNSwgb24gdGhlIG90aGVyIGhhbmQsIGRvZXMgaGF2ZSB0aGUgaW5mb3JtYXRpb24g dG8KICAgIG1ha2UgYW4gaW5mb3JtZWQgY2hvaWNlLiAgSXQgY291bGQgZGV0ZWN0IGlmIHRoZSBy aW5nIHNpemUgaXMgYQogICAgcHJvYmxlbSBhbmQgZ3JvdyBpdCBpdHNlbGYuICBPciwgaWYgdGhh dCdzIHRvbyBoYXJkLCB3ZSBjb3VsZCBqdXN0CiAgICBpbmNyZWFzZSB0aGUgZGVmYXVsdCBzaXpl IGZyb20gMTZLIHRvIDMySyBvciBldmVuIDY0SyBpbnN0ZWFkIG9mCiAgICByZWx5aW5nIG9uIHVz ZXJzcGFjZSB0byBkbyBpdC4KCkxldCdzIGRyb3AgdGhpcyBBUEkgZm9yIG5vdyBhbmQsIGlmIHNv bWVvbmUgZGVjaWRlcyB0aGV5IHJlYWxseSBjYXJlCmFib3V0IHNvbHZpbmcgdGhpcyBwcm9ibGVt LCB0aGV5IGNhbiBkbyBpdCBwcm9wZXJseS4KClNpZ25lZC1vZmYtYnk6IEphc29uIEVrc3RyYW5k IDxqYXNvbkBqbGVrc3RyYW5kLm5ldD4KUmV2aWV3ZWQtYnk6IERhbmllbCBWZXR0ZXIgPGRhbmll bC52ZXR0ZXJAZmZ3bGwuY2g+Ci0tLQogZHJpdmVycy9ncHUvZHJtL2k5MTUvTWFrZWZpbGUgICAg ICAgICAgICAgICAgIHwgIDEgLQogZHJpdmVycy9ncHUvZHJtL2k5MTUvZ2VtL2k5MTVfZ2VtX2Nv bnRleHQuYyAgIHwgODUgKy0tLS0tLS0tLS0tLS0tLS0tLQogZHJpdmVycy9ncHUvZHJtL2k5MTUv Z3QvaW50ZWxfY29udGV4dF9wYXJhbS5jIHwgNjMgLS0tLS0tLS0tLS0tLS0KIGRyaXZlcnMvZ3B1 L2RybS9pOTE1L2d0L2ludGVsX2NvbnRleHRfcGFyYW0uaCB8ICAzIC0KIGluY2x1ZGUvdWFwaS9k cm0vaTkxNV9kcm0uaCAgICAgICAgICAgICAgICAgICB8IDIwICstLS0tCiA1IGZpbGVzIGNoYW5n ZWQsIDQgaW5zZXJ0aW9ucygrKSwgMTY4IGRlbGV0aW9ucygtKQogZGVsZXRlIG1vZGUgMTAwNjQ0 IGRyaXZlcnMvZ3B1L2RybS9pOTE1L2d0L2ludGVsX2NvbnRleHRfcGFyYW0uYwoKZGlmZiAtLWdp dCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L01ha2VmaWxlIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUv TWFrZWZpbGUKaW5kZXggNGYyMmNhYzFjNDliZS4uMGEzZThjODVkYTlmMiAxMDA2NDQKLS0tIGEv ZHJpdmVycy9ncHUvZHJtL2k5MTUvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUv TWFrZWZpbGUKQEAgLTg5LDcgKzg5LDYgQEAgZ3QteSArPSBcCiAJZ3QvZ2VuOF9wcGd0dC5vIFwK IAlndC9pbnRlbF9icmVhZGNydW1icy5vIFwKIAlndC9pbnRlbF9jb250ZXh0Lm8gXAotCWd0L2lu dGVsX2NvbnRleHRfcGFyYW0ubyBcCiAJZ3QvaW50ZWxfY29udGV4dF9zc2V1Lm8gXAogCWd0L2lu dGVsX2VuZ2luZV9jcy5vIFwKIAlndC9pbnRlbF9lbmdpbmVfaGVhcnRiZWF0Lm8gXApkaWZmIC0t Z2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ2VtL2k5MTVfZ2VtX2NvbnRleHQuYyBiL2RyaXZl cnMvZ3B1L2RybS9pOTE1L2dlbS9pOTE1X2dlbV9jb250ZXh0LmMKaW5kZXggNzcyMGI4YzIyYzgx Ni4uZGRjM2NjM2Y4ZjA5MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ2VtL2k5 MTVfZ2VtX2NvbnRleHQuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9nZW0vaTkxNV9nZW1f Y29udGV4dC5jCkBAIC0xMzM0LDYzICsxMzM0LDYgQEAgc3RhdGljIGludCBzZXRfcHBndHQoc3Ry dWN0IGRybV9pOTE1X2ZpbGVfcHJpdmF0ZSAqZmlsZV9wcml2LAogCXJldHVybiBlcnI7CiB9CiAK LXN0YXRpYyBpbnQgX19hcHBseV9yaW5nc2l6ZShzdHJ1Y3QgaW50ZWxfY29udGV4dCAqY2UsIHZv aWQgKnN6KQotewotCXJldHVybiBpbnRlbF9jb250ZXh0X3NldF9yaW5nX3NpemUoY2UsICh1bnNp Z25lZCBsb25nKXN6KTsKLX0KLQotc3RhdGljIGludCBzZXRfcmluZ3NpemUoc3RydWN0IGk5MTVf Z2VtX2NvbnRleHQgKmN0eCwKLQkJCXN0cnVjdCBkcm1faTkxNV9nZW1fY29udGV4dF9wYXJhbSAq YXJncykKLXsKLQlpZiAoIUhBU19MT0dJQ0FMX1JJTkdfQ09OVEVYVFMoY3R4LT5pOTE1KSkKLQkJ cmV0dXJuIC1FTk9ERVY7Ci0KLQlpZiAoYXJncy0+c2l6ZSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0K LQlpZiAoIUlTX0FMSUdORUQoYXJncy0+dmFsdWUsIEk5MTVfR1RUX1BBR0VfU0laRSkpCi0JCXJl dHVybiAtRUlOVkFMOwotCi0JaWYgKGFyZ3MtPnZhbHVlIDwgSTkxNV9HVFRfUEFHRV9TSVpFKQot CQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChhcmdzLT52YWx1ZSA+IDEyOCAqIEk5MTVfR1RUX1BB R0VfU0laRSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlyZXR1cm4gY29udGV4dF9hcHBseV9hbGwo Y3R4LAotCQkJCSBfX2FwcGx5X3JpbmdzaXplLAotCQkJCSBfX2ludGVsX2NvbnRleHRfcmluZ19z aXplKGFyZ3MtPnZhbHVlKSk7Ci19Ci0KLXN0YXRpYyBpbnQgX19nZXRfcmluZ3NpemUoc3RydWN0 IGludGVsX2NvbnRleHQgKmNlLCB2b2lkICphcmcpCi17Ci0JbG9uZyBzejsKLQotCXN6ID0gaW50 ZWxfY29udGV4dF9nZXRfcmluZ19zaXplKGNlKTsKLQlHRU1fQlVHX09OKHN6ID4gSU5UX01BWCk7 Ci0KLQlyZXR1cm4gc3o7IC8qIHN0b3Agb24gZmlyc3QgZW5naW5lICovCi19Ci0KLXN0YXRpYyBp bnQgZ2V0X3JpbmdzaXplKHN0cnVjdCBpOTE1X2dlbV9jb250ZXh0ICpjdHgsCi0JCQlzdHJ1Y3Qg ZHJtX2k5MTVfZ2VtX2NvbnRleHRfcGFyYW0gKmFyZ3MpCi17Ci0JaW50IHN6OwotCi0JaWYgKCFI QVNfTE9HSUNBTF9SSU5HX0NPTlRFWFRTKGN0eC0+aTkxNSkpCi0JCXJldHVybiAtRU5PREVWOwot Ci0JaWYgKGFyZ3MtPnNpemUpCi0JCXJldHVybiAtRUlOVkFMOwotCi0Jc3ogPSBjb250ZXh0X2Fw cGx5X2FsbChjdHgsIF9fZ2V0X3JpbmdzaXplLCBOVUxMKTsKLQlpZiAoc3ogPCAwKQotCQlyZXR1 cm4gc3o7Ci0KLQlhcmdzLT52YWx1ZSA9IHN6OwotCXJldHVybiAwOwotfQotCiBpbnQKIGk5MTVf Z2VtX3VzZXJfdG9fY29udGV4dF9zc2V1KHN0cnVjdCBpbnRlbF9ndCAqZ3QsCiAJCQkgICAgICBj b25zdCBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2NvbnRleHRfcGFyYW1fc3NldSAqdXNlciwKQEAgLTIw MzYsMTEgKzE5NzksOCBAQCBzdGF0aWMgaW50IGN0eF9zZXRwYXJhbShzdHJ1Y3QgZHJtX2k5MTVf ZmlsZV9wcml2YXRlICpmcHJpdiwKIAkJcmV0ID0gc2V0X3BlcnNpc3RlbmNlKGN0eCwgYXJncyk7 CiAJCWJyZWFrOwogCi0JY2FzZSBJOTE1X0NPTlRFWFRfUEFSQU1fUklOR1NJWkU6Ci0JCXJldCA9 IHNldF9yaW5nc2l6ZShjdHgsIGFyZ3MpOwotCQlicmVhazsKLQogCWNhc2UgSTkxNV9DT05URVhU X1BBUkFNX0JBTl9QRVJJT0Q6CisJY2FzZSBJOTE1X0NPTlRFWFRfUEFSQU1fUklOR1NJWkU6CiAJ ZGVmYXVsdDoKIAkJcmV0ID0gLUVJTlZBTDsKIAkJYnJlYWs7CkBAIC0yMDY4LDE4ICsyMDA4LDYg QEAgc3RhdGljIGludCBjcmVhdGVfc2V0cGFyYW0oc3RydWN0IGk5MTVfdXNlcl9leHRlbnNpb24g X191c2VyICpleHQsIHZvaWQgKmRhdGEpCiAJcmV0dXJuIGN0eF9zZXRwYXJhbShhcmctPmZwcml2 LCBhcmctPmN0eCwgJmxvY2FsLnBhcmFtKTsKIH0KIAotc3RhdGljIGludCBjb3B5X3Jpbmdfc2l6 ZShzdHJ1Y3QgaW50ZWxfY29udGV4dCAqZHN0LAotCQkJICBzdHJ1Y3QgaW50ZWxfY29udGV4dCAq c3JjKQotewotCWxvbmcgc3o7Ci0KLQlzeiA9IGludGVsX2NvbnRleHRfZ2V0X3Jpbmdfc2l6ZShz cmMpOwotCWlmIChzeiA8IDApCi0JCXJldHVybiBzejsKLQotCXJldHVybiBpbnRlbF9jb250ZXh0 X3NldF9yaW5nX3NpemUoZHN0LCBzeik7Ci19Ci0KIHN0YXRpYyBpbnQgY2xvbmVfZW5naW5lcyhz dHJ1Y3QgaTkxNV9nZW1fY29udGV4dCAqZHN0LAogCQkJIHN0cnVjdCBpOTE1X2dlbV9jb250ZXh0 ICpzcmMpCiB7CkBAIC0yMTI0LDEyICsyMDUyLDYgQEAgc3RhdGljIGludCBjbG9uZV9lbmdpbmVz KHN0cnVjdCBpOTE1X2dlbV9jb250ZXh0ICpkc3QsCiAJCX0KIAogCQlpbnRlbF9jb250ZXh0X3Nl dF9nZW0oY2xvbmUtPmVuZ2luZXNbbl0sIGRzdCk7Ci0KLQkJLyogQ29weSBhY3Jvc3MgdGhlIHBy ZWZlcnJlZCByaW5nc2l6ZSAqLwotCQlpZiAoY29weV9yaW5nX3NpemUoY2xvbmUtPmVuZ2luZXNb bl0sIGUtPmVuZ2luZXNbbl0pKSB7Ci0JCQlfX2ZyZWVfZW5naW5lcyhjbG9uZSwgbiArIDEpOwot CQkJZ290byBlcnJfdW5sb2NrOwotCQl9CiAJfQogCWNsb25lLT5udW1fZW5naW5lcyA9IG47CiAJ aTkxNV9zd19mZW5jZV9jb21wbGV0ZSgmZS0+ZmVuY2UpOwpAQCAtMjQ4OSwxMSArMjQxMSw4IEBA IGludCBpOTE1X2dlbV9jb250ZXh0X2dldHBhcmFtX2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpk ZXYsIHZvaWQgKmRhdGEsCiAJCWFyZ3MtPnZhbHVlID0gaTkxNV9nZW1fY29udGV4dF9pc19wZXJz aXN0ZW50KGN0eCk7CiAJCWJyZWFrOwogCi0JY2FzZSBJOTE1X0NPTlRFWFRfUEFSQU1fUklOR1NJ WkU6Ci0JCXJldCA9IGdldF9yaW5nc2l6ZShjdHgsIGFyZ3MpOwotCQlicmVhazsKLQogCWNhc2Ug STkxNV9DT05URVhUX1BBUkFNX0JBTl9QRVJJT0Q6CisJY2FzZSBJOTE1X0NPTlRFWFRfUEFSQU1f UklOR1NJWkU6CiAJZGVmYXVsdDoKIAkJcmV0ID0gLUVJTlZBTDsKIAkJYnJlYWs7CmRpZmYgLS1n aXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9ndC9pbnRlbF9jb250ZXh0X3BhcmFtLmMgYi9kcml2 ZXJzL2dwdS9kcm0vaTkxNS9ndC9pbnRlbF9jb250ZXh0X3BhcmFtLmMKZGVsZXRlZCBmaWxlIG1v ZGUgMTAwNjQ0CmluZGV4IDY1ZGNkMDkwMjQ1ZDYuLjAwMDAwMDAwMDAwMDAKLS0tIGEvZHJpdmVy cy9ncHUvZHJtL2k5MTUvZ3QvaW50ZWxfY29udGV4dF9wYXJhbS5jCisrKyAvZGV2L251bGwKQEAg LTEsNjMgKzAsMCBAQAotLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVAotLyoKLSAqIENv cHlyaWdodCDCqSAyMDE5IEludGVsIENvcnBvcmF0aW9uCi0gKi8KLQotI2luY2x1ZGUgImk5MTVf YWN0aXZlLmgiCi0jaW5jbHVkZSAiaW50ZWxfY29udGV4dC5oIgotI2luY2x1ZGUgImludGVsX2Nv bnRleHRfcGFyYW0uaCIKLSNpbmNsdWRlICJpbnRlbF9yaW5nLmgiCi0KLWludCBpbnRlbF9jb250 ZXh0X3NldF9yaW5nX3NpemUoc3RydWN0IGludGVsX2NvbnRleHQgKmNlLCBsb25nIHN6KQotewot CWludCBlcnI7Ci0KLQlpZiAoaW50ZWxfY29udGV4dF9sb2NrX3Bpbm5lZChjZSkpCi0JCXJldHVy biAtRUlOVFI7Ci0KLQllcnIgPSBpOTE1X2FjdGl2ZV93YWl0KCZjZS0+YWN0aXZlKTsKLQlpZiAo ZXJyIDwgMCkKLQkJZ290byB1bmxvY2s7Ci0KLQlpZiAoaW50ZWxfY29udGV4dF9pc19waW5uZWQo Y2UpKSB7Ci0JCWVyciA9IC1FQlVTWTsgLyogSW4gYWN0aXZlIHVzZSwgY29tZSBiYWNrIGxhdGVy ISAqLwotCQlnb3RvIHVubG9jazsKLQl9Ci0KLQlpZiAodGVzdF9iaXQoQ09OVEVYVF9BTExPQ19C SVQsICZjZS0+ZmxhZ3MpKSB7Ci0JCXN0cnVjdCBpbnRlbF9yaW5nICpyaW5nOwotCi0JCS8qIFJl cGxhY2UgdGhlIGV4aXN0aW5nIHJpbmdidWZmZXIgKi8KLQkJcmluZyA9IGludGVsX2VuZ2luZV9j cmVhdGVfcmluZyhjZS0+ZW5naW5lLCBzeik7Ci0JCWlmIChJU19FUlIocmluZykpIHsKLQkJCWVy ciA9IFBUUl9FUlIocmluZyk7Ci0JCQlnb3RvIHVubG9jazsKLQkJfQotCi0JCWludGVsX3Jpbmdf cHV0KGNlLT5yaW5nKTsKLQkJY2UtPnJpbmcgPSByaW5nOwotCi0JCS8qIENvbnRleHQgaW1hZ2Ug d2lsbCBiZSB1cGRhdGVkIG9uIG5leHQgcGluICovCi0JfSBlbHNlIHsKLQkJY2UtPnJpbmcgPSBf X2ludGVsX2NvbnRleHRfcmluZ19zaXplKHN6KTsKLQl9Ci0KLXVubG9jazoKLQlpbnRlbF9jb250 ZXh0X3VubG9ja19waW5uZWQoY2UpOwotCXJldHVybiBlcnI7Ci19Ci0KLWxvbmcgaW50ZWxfY29u dGV4dF9nZXRfcmluZ19zaXplKHN0cnVjdCBpbnRlbF9jb250ZXh0ICpjZSkKLXsKLQlsb25nIHN6 ID0gKHVuc2lnbmVkIGxvbmcpUkVBRF9PTkNFKGNlLT5yaW5nKTsKLQotCWlmICh0ZXN0X2JpdChD T05URVhUX0FMTE9DX0JJVCwgJmNlLT5mbGFncykpIHsKLQkJaWYgKGludGVsX2NvbnRleHRfbG9j a19waW5uZWQoY2UpKQotCQkJcmV0dXJuIC1FSU5UUjsKLQotCQlzeiA9IGNlLT5yaW5nLT5zaXpl OwotCQlpbnRlbF9jb250ZXh0X3VubG9ja19waW5uZWQoY2UpOwotCX0KLQotCXJldHVybiBzejsK LX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2d0L2ludGVsX2NvbnRleHRfcGFy YW0uaCBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2d0L2ludGVsX2NvbnRleHRfcGFyYW0uaAppbmRl eCAzZWNhY2M2NzVmNDE0Li5kZmZlZGQ5ODM2OTNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9k cm0vaTkxNS9ndC9pbnRlbF9jb250ZXh0X3BhcmFtLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5 MTUvZ3QvaW50ZWxfY29udGV4dF9wYXJhbS5oCkBAIC0xMCw5ICsxMCw2IEBACiAKICNpbmNsdWRl ICJpbnRlbF9jb250ZXh0LmgiCiAKLWludCBpbnRlbF9jb250ZXh0X3NldF9yaW5nX3NpemUoc3Ry dWN0IGludGVsX2NvbnRleHQgKmNlLCBsb25nIHN6KTsKLWxvbmcgaW50ZWxfY29udGV4dF9nZXRf cmluZ19zaXplKHN0cnVjdCBpbnRlbF9jb250ZXh0ICpjZSk7Ci0KIHN0YXRpYyBpbmxpbmUgaW50 CiBpbnRlbF9jb250ZXh0X3NldF93YXRjaGRvZ191cyhzdHJ1Y3QgaW50ZWxfY29udGV4dCAqY2Us IHU2NCB0aW1lb3V0X3VzKQogewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2RybS9pOTE1X2Ry bS5oIGIvaW5jbHVkZS91YXBpL2RybS9pOTE1X2RybS5oCmluZGV4IGMyYzc3NTliN2QyZWUuLmFk OGYxYTBmNTg3ZjYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWFwaS9kcm0vaTkxNV9kcm0uaAorKysg Yi9pbmNsdWRlL3VhcGkvZHJtL2k5MTVfZHJtLmgKQEAgLTE3MjMsMjQgKzE3MjMsOCBAQCBzdHJ1 Y3QgZHJtX2k5MTVfZ2VtX2NvbnRleHRfcGFyYW0gewogICovCiAjZGVmaW5lIEk5MTVfQ09OVEVY VF9QQVJBTV9QRVJTSVNURU5DRQkweGIKIAotLyoKLSAqIEk5MTVfQ09OVEVYVF9QQVJBTV9SSU5H U0laRToKLSAqCi0gKiBTZXRzIHRoZSBzaXplIG9mIHRoZSBDUyByaW5nYnVmZmVyIHRvIHVzZSBm b3IgbG9naWNhbCByaW5nIGNvbnRleHRzLiBUaGlzCi0gKiBhcHBsaWVzIGEgbGltaXQgb2YgaG93 IG1hbnkgYmF0Y2hlcyBjYW4gYmUgcXVldWVkIHRvIEhXIGJlZm9yZSB0aGUgY2FsbGVyCi0gKiBp cyBibG9ja2VkIGR1ZSB0byBsYWNrIG9mIHNwYWNlIGZvciBtb3JlIGNvbW1hbmRzLgotICoKLSAq IE9ubHkgcmVsaWFibHkgcG9zc2libGUgdG8gYmUgc2V0IHByaW9yIHRvIGZpcnN0IHVzZSwgaS5l LiBkdXJpbmcKLSAqIGNvbnN0cnVjdGlvbi4gQXQgYW55IGxhdGVyIHBvaW50LCB0aGUgY3VycmVu dCBleGVjdXRpb24gbXVzdCBiZSBmbHVzaGVkIGFzCi0gKiB0aGUgcmluZyBjYW4gb25seSBiZSBj aGFuZ2VkIHdoaWxlIHRoZSBjb250ZXh0IGlzIGlkbGUuIE5vdGUsIHRoZSByaW5nc2l6ZQotICog Y2FuIGJlIHNwZWNpZmllZCBhcyBhIGNvbnN0cnVjdG9yIHByb3BlcnR5LCBzZWUKLSAqIEk5MTVf Q09OVEVYVF9DUkVBVEVfRVhUX1NFVFBBUkFNLCBidXQgY2FuIGFsc28gYmUgc2V0IGxhdGVyIGlm IHJlcXVpcmVkLgotICoKLSAqIE9ubHkgYXBwbGllcyB0byB0aGUgY3VycmVudCBzZXQgb2YgZW5n aW5lIGFuZCBsb3N0IHdoZW4gdGhvc2UgZW5naW5lcwotICogYXJlIHJlcGxhY2VkIGJ5IGEgbmV3 IG1hcHBpbmcgKHNlZSBJOTE1X0NPTlRFWFRfUEFSQU1fRU5HSU5FUykuCi0gKgotICogTXVzdCBi ZSBiZXR3ZWVuIDQgLSA1MTIgS2lCLCBpbiBpbnRlcnZhbHMgb2YgcGFnZSBzaXplIFs0IEtpQl0u Ci0gKiBEZWZhdWx0IGlzIDE2IEtpQi4KKy8qIFRoaXMgQVBJIGhhcyBiZWVuIHJlbW92ZWQuICBP biB0aGUgb2ZmIGNoYW5jZSBzb21lb25lIHNvbWV3aGVyZSBoYXMKKyAqIGF0dGVtcHRlZCB0byB1 c2UgaXQsIG5ldmVyIHJlLXVzZSB0aGlzIGNvbnRleHQgcGFyYW0gbnVtYmVyLgogICovCiAjZGVm aW5lIEk5MTVfQ09OVEVYVF9QQVJBTV9SSU5HU0laRQkweGMKIC8qIE11c3QgYmUga2VwdCBjb21w YWN0IC0tIG5vIGhvbGVzIGFuZCB3ZWxsIGRvY3VtZW50ZWQgKi8KLS0gCjIuMzEuMQoKX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KSW50ZWwtZ2Z4IG1haWxp bmcgbGlzdApJbnRlbC1nZnhAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJl ZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vaW50ZWwtZ2Z4Cg==