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 7B824C636C9 for ; Thu, 15 Jul 2021 22:39:27 +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 4C418611AC for ; Thu, 15 Jul 2021 22:39:27 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 4C418611AC 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 94A6B6E8C3; Thu, 15 Jul 2021 22:39:20 +0000 (UTC) Received: from mail-pg1-x52d.google.com (mail-pg1-x52d.google.com [IPv6:2607:f8b0:4864:20::52d]) by gabe.freedesktop.org (Postfix) with ESMTPS id F282F6E8C2 for ; Thu, 15 Jul 2021 22:39:18 +0000 (UTC) Received: by mail-pg1-x52d.google.com with SMTP id y4so8023564pgl.10 for ; Thu, 15 Jul 2021 15:39:18 -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=iyozTSomnY57D+e+B5ZX9prvxFTQugp7z+hR/eTorww=; b=fsIHp9qJxKQCYTxYSygRbtrVdskVdQpwPhqRmenzAggXpqTfWpSOYPuWU4dZqgeAWG VMEp1XkQODBah750DFVcFKcObHVrRO57f03WJD7egh59VIdqtryyDEj6zb1OnfogCjq/ Zs23oe/Z+q7LSzrG0qSj1FNmXRHzVd7gZjvo+BQINDK6FTqkBMdKhxi2g2HKDiWDWa9b kxZJX6gbq744sCeNyUtkSh835TIG29Ifn8ywMkIzA73od3/QvhzrHtF/T+gr7Vp1qGO6 iAICpn2ZoxVGzQXkWaBWrzPt7aVgY/kTuLtbVg9ckF7o1pd7WI+a2cRrolitlN9vhnK+ najA== 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=iyozTSomnY57D+e+B5ZX9prvxFTQugp7z+hR/eTorww=; b=UZeA8Sy8ZK4rNsFZTXTM4Bs4rPlFjziOqNGtNZ1xIXo625f/0TjR5ZOGsu82dwA1Nu xYBw7CMPDHSJyRBg+oXF9NGTOl7qAliHhBVVzKgdOHFDJDkVSynHtH+sKPtre1dhRxH4 WbRYH/AFxcZgEdVdsC7NzKfZuMcinjxwTR7LUy6CUtM+uqqMJMwzOFNAI4YewCgzl4D+ HpDoBBMPaX6C4jfyWqibBvsd/rTTDqptV/g8vNS0TTEJw6GceFuG94E0CdrK9MBvMyAy yNTniPdFMvUUg4hTiNirsKSSr2L4brssX+Sk74EGjQh9DwHVJQj2nLdXIEH5pZyHsmDR IutA== X-Gm-Message-State: AOAM530rP2NVYhBGGHqkb0olD0H6tgItzethsKxqrLRVlmWCmwSGI/DM b2mHK++j7+6Sna0NxCOB6a/rGA== X-Google-Smtp-Source: ABdhPJzYSaPU+NPZ30UE5b17SAlXEWyCx2wEdozswkNTiUkviFPP1WjAWB1Krwz9f844/0/dmn7/QQ== X-Received: by 2002:a05:6a00:16c6:b029:32d:e190:9dd0 with SMTP id l6-20020a056a0016c6b029032de1909dd0mr6960538pfc.70.1626388758467; Thu, 15 Jul 2021 15:39:18 -0700 (PDT) Received: from omlet.com ([134.134.137.87]) by smtp.gmail.com with ESMTPSA id ft7sm9959459pjb.32.2021.07.15.15.39.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 15 Jul 2021 15:39:18 -0700 (PDT) From: Jason Ekstrand To: intel-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org Subject: [PATCH 6/7] drm/i915/gem: Correct the locking and pin pattern for dma-buf (v6) Date: Thu, 15 Jul 2021 17:38:59 -0500 Message-Id: <20210715223900.1840576-7-jason@jlekstrand.net> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210715223900.1840576-1-jason@jlekstrand.net> References: <20210715223900.1840576-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: =?UTF-8?q?Thomas=20Hellstr=C3=B6m?= , Jason Ekstrand , "Michael J . Ruhl" Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" From: Thomas Hellström If our exported dma-bufs are imported by another instance of our driver, that instance will typically have the imported dma-bufs locked during dma_buf_map_attachment(). But the exporter also locks the same reservation object in the map_dma_buf() callback, which leads to recursive locking. So taking the lock inside _pin_pages_unlocked() is incorrect. Additionally, the current pinning code path is contrary to the defined way that pinning should occur. Remove the explicit pin/unpin from the map/umap functions and move them to the attach/detach allowing correct locking to occur, and to match the static dma-buf drm_prime pattern. Add a live selftest to exercise both dynamic and non-dynamic exports. v2: - Extend the selftest with a fake dynamic importer. - Provide real pin and unpin callbacks to not abuse the interface. v3: (ruhl) - Remove the dynamic export support and move the pinning into the attach/detach path. v4: (ruhl) - Put pages does not need to assert on the dma-resv v5: (jason) - Lock around dma_buf_unmap_attachment() when emulating a dynamic importer in the subtests. - Use pin_pages_unlocked v6: (jason) - Use dma_buf_attach instead of dma_buf_attach_dynamic in the selftests Reported-by: Michael J. Ruhl Signed-off-by: Thomas Hellström Signed-off-by: Michael J. Ruhl Signed-off-by: Jason Ekstrand Reviewed-by: Jason Ekstrand --- drivers/gpu/drm/i915/gem/i915_gem_dmabuf.c | 43 ++++++-- .../drm/i915/gem/selftests/i915_gem_dmabuf.c | 103 +++++++++++++++++- 2 files changed, 132 insertions(+), 14 deletions(-) diff --git a/drivers/gpu/drm/i915/gem/i915_gem_dmabuf.c b/drivers/gpu/drm/i915/gem/i915_gem_dmabuf.c index 616c3a2f1baf0..9a655f69a0671 100644 --- a/drivers/gpu/drm/i915/gem/i915_gem_dmabuf.c +++ b/drivers/gpu/drm/i915/gem/i915_gem_dmabuf.c @@ -12,6 +12,8 @@ #include "i915_gem_object.h" #include "i915_scatterlist.h" +I915_SELFTEST_DECLARE(static bool force_different_devices;) + static struct drm_i915_gem_object *dma_buf_to_obj(struct dma_buf *buf) { return to_intel_bo(buf->priv); @@ -25,15 +27,11 @@ static struct sg_table *i915_gem_map_dma_buf(struct dma_buf_attachment *attachme struct scatterlist *src, *dst; int ret, i; - ret = i915_gem_object_pin_pages_unlocked(obj); - if (ret) - goto err; - /* Copy sg so that we make an independent mapping */ st = kmalloc(sizeof(struct sg_table), GFP_KERNEL); if (st == NULL) { ret = -ENOMEM; - goto err_unpin_pages; + goto err; } ret = sg_alloc_table(st, obj->mm.pages->nents, GFP_KERNEL); @@ -58,8 +56,6 @@ static struct sg_table *i915_gem_map_dma_buf(struct dma_buf_attachment *attachme sg_free_table(st); err_free: kfree(st); -err_unpin_pages: - i915_gem_object_unpin_pages(obj); err: return ERR_PTR(ret); } @@ -68,13 +64,9 @@ static void i915_gem_unmap_dma_buf(struct dma_buf_attachment *attachment, struct sg_table *sg, enum dma_data_direction dir) { - struct drm_i915_gem_object *obj = dma_buf_to_obj(attachment->dmabuf); - dma_unmap_sgtable(attachment->dev, sg, dir, DMA_ATTR_SKIP_CPU_SYNC); sg_free_table(sg); kfree(sg); - - i915_gem_object_unpin_pages(obj); } static int i915_gem_dmabuf_vmap(struct dma_buf *dma_buf, struct dma_buf_map *map) @@ -168,7 +160,31 @@ static int i915_gem_end_cpu_access(struct dma_buf *dma_buf, enum dma_data_direct return err; } +/** + * i915_gem_dmabuf_attach - Do any extra attach work necessary + * @dmabuf: imported dma-buf + * @attach: new attach to do work on + * + */ +static int i915_gem_dmabuf_attach(struct dma_buf *dmabuf, + struct dma_buf_attachment *attach) +{ + struct drm_i915_gem_object *obj = dma_buf_to_obj(dmabuf); + + return i915_gem_object_pin_pages_unlocked(obj); +} + +static void i915_gem_dmabuf_detach(struct dma_buf *dmabuf, + struct dma_buf_attachment *attach) +{ + struct drm_i915_gem_object *obj = dma_buf_to_obj(dmabuf); + + i915_gem_object_unpin_pages(obj); +} + static const struct dma_buf_ops i915_dmabuf_ops = { + .attach = i915_gem_dmabuf_attach, + .detach = i915_gem_dmabuf_detach, .map_dma_buf = i915_gem_map_dma_buf, .unmap_dma_buf = i915_gem_unmap_dma_buf, .release = drm_gem_dmabuf_release, @@ -204,6 +220,8 @@ static int i915_gem_object_get_pages_dmabuf(struct drm_i915_gem_object *obj) struct sg_table *pages; unsigned int sg_page_sizes; + assert_object_held(obj); + pages = dma_buf_map_attachment(obj->base.import_attach, DMA_BIDIRECTIONAL); if (IS_ERR(pages)) @@ -241,7 +259,8 @@ struct drm_gem_object *i915_gem_prime_import(struct drm_device *dev, if (dma_buf->ops == &i915_dmabuf_ops) { obj = dma_buf_to_obj(dma_buf); /* is it from our device? */ - if (obj->base.dev == dev) { + if (obj->base.dev == dev && + !I915_SELFTEST_ONLY(force_different_devices)) { /* * Importing dmabuf exported from out own gem increases * refcount on gem itself instead of f_count of dmabuf. diff --git a/drivers/gpu/drm/i915/gem/selftests/i915_gem_dmabuf.c b/drivers/gpu/drm/i915/gem/selftests/i915_gem_dmabuf.c index dd74bc09ec88d..4451bbb4917e4 100644 --- a/drivers/gpu/drm/i915/gem/selftests/i915_gem_dmabuf.c +++ b/drivers/gpu/drm/i915/gem/selftests/i915_gem_dmabuf.c @@ -35,7 +35,7 @@ static int igt_dmabuf_export(void *arg) static int igt_dmabuf_import_self(void *arg) { struct drm_i915_private *i915 = arg; - struct drm_i915_gem_object *obj; + struct drm_i915_gem_object *obj, *import_obj; struct drm_gem_object *import; struct dma_buf *dmabuf; int err; @@ -65,14 +65,112 @@ static int igt_dmabuf_import_self(void *arg) err = -EINVAL; goto out_import; } + import_obj = to_intel_bo(import); + + i915_gem_object_lock(import_obj, NULL); + err = ____i915_gem_object_get_pages(import_obj); + i915_gem_object_unlock(import_obj); + if (err) { + pr_err("Same object dma-buf get_pages failed!\n"); + goto out_import; + } err = 0; out_import: - i915_gem_object_put(to_intel_bo(import)); + i915_gem_object_put(import_obj); +out_dmabuf: + dma_buf_put(dmabuf); +out: + i915_gem_object_put(obj); + return err; +} + +static int igt_dmabuf_import_same_driver(void *arg) +{ + struct drm_i915_private *i915 = arg; + struct drm_i915_gem_object *obj, *import_obj; + struct drm_gem_object *import; + struct dma_buf *dmabuf; + struct dma_buf_attachment *import_attach; + struct sg_table *st; + long timeout; + int err; + + force_different_devices = true; + obj = i915_gem_object_create_shmem(i915, PAGE_SIZE); + if (IS_ERR(obj)) + goto out_ret; + + dmabuf = i915_gem_prime_export(&obj->base, 0); + if (IS_ERR(dmabuf)) { + pr_err("i915_gem_prime_export failed with err=%d\n", + (int)PTR_ERR(dmabuf)); + err = PTR_ERR(dmabuf); + goto out; + } + + import = i915_gem_prime_import(&i915->drm, dmabuf); + if (IS_ERR(import)) { + pr_err("i915_gem_prime_import failed with err=%d\n", + (int)PTR_ERR(import)); + err = PTR_ERR(import); + goto out_dmabuf; + } + + if (import == &obj->base) { + pr_err("i915_gem_prime_import reused gem object!\n"); + err = -EINVAL; + goto out_import; + } + + import_obj = to_intel_bo(import); + + i915_gem_object_lock(import_obj, NULL); + err = ____i915_gem_object_get_pages(import_obj); + if (err) { + pr_err("Different objects dma-buf get_pages failed!\n"); + i915_gem_object_unlock(import_obj); + goto out_import; + } + + /* + * If the exported object is not in system memory, something + * weird is going on. TODO: When p2p is supported, this is no + * longer considered weird. + */ + if (obj->mm.region != i915->mm.regions[INTEL_REGION_SMEM]) { + pr_err("Exported dma-buf is not in system memory\n"); + err = -EINVAL; + } + + i915_gem_object_unlock(import_obj); + + /* Now try a fake an importer */ + import_attach = dma_buf_attach(dmabuf, obj->base.dev->dev); + if (IS_ERR(import_attach)) + goto out_import; + + st = dma_buf_map_attachment(import_attach, DMA_BIDIRECTIONAL); + if (IS_ERR(st)) + goto out_detach; + + timeout = dma_resv_wait_timeout(dmabuf->resv, false, true, 5 * HZ); + if (!timeout) { + pr_err("dmabuf wait for exclusive fence timed out.\n"); + timeout = -ETIME; + } + err = timeout > 0 ? 0 : timeout; + dma_buf_unmap_attachment(import_attach, st, DMA_BIDIRECTIONAL); +out_detach: + dma_buf_detach(dmabuf, import_attach); +out_import: + i915_gem_object_put(import_obj); out_dmabuf: dma_buf_put(dmabuf); out: i915_gem_object_put(obj); +out_ret: + force_different_devices = false; return err; } @@ -286,6 +384,7 @@ int i915_gem_dmabuf_live_selftests(struct drm_i915_private *i915) { static const struct i915_subtest tests[] = { SUBTEST(igt_dmabuf_export), + SUBTEST(igt_dmabuf_import_same_driver), }; return i915_subtests(tests, i915); -- 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 91DCEC636CB for ; Thu, 15 Jul 2021 22:39:29 +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 61EB0611AC for ; Thu, 15 Jul 2021 22:39:29 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 61EB0611AC 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 A65856E8C8; Thu, 15 Jul 2021 22:39:22 +0000 (UTC) Received: from mail-pf1-x431.google.com (mail-pf1-x431.google.com [IPv6:2607:f8b0:4864:20::431]) by gabe.freedesktop.org (Postfix) with ESMTPS id 28E4C6E8C1 for ; Thu, 15 Jul 2021 22:39:19 +0000 (UTC) Received: by mail-pf1-x431.google.com with SMTP id y4so6991778pfi.9 for ; Thu, 15 Jul 2021 15:39:19 -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=iyozTSomnY57D+e+B5ZX9prvxFTQugp7z+hR/eTorww=; b=fsIHp9qJxKQCYTxYSygRbtrVdskVdQpwPhqRmenzAggXpqTfWpSOYPuWU4dZqgeAWG VMEp1XkQODBah750DFVcFKcObHVrRO57f03WJD7egh59VIdqtryyDEj6zb1OnfogCjq/ Zs23oe/Z+q7LSzrG0qSj1FNmXRHzVd7gZjvo+BQINDK6FTqkBMdKhxi2g2HKDiWDWa9b kxZJX6gbq744sCeNyUtkSh835TIG29Ifn8ywMkIzA73od3/QvhzrHtF/T+gr7Vp1qGO6 iAICpn2ZoxVGzQXkWaBWrzPt7aVgY/kTuLtbVg9ckF7o1pd7WI+a2cRrolitlN9vhnK+ najA== 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=iyozTSomnY57D+e+B5ZX9prvxFTQugp7z+hR/eTorww=; b=EJF528NQiGEfYuKk6IRCLQ9Kf3mVQw6ds8rg+JF1lc5O7jbqXgIAKUTLaTqo7bxRao wA2Tn1PkwLvIkufysMD42P6LggXJ70Qvhz2ZflOE2obnyi5UHZqUc7+0eKuV0irTvT6U HEK5OeSPQ7NvxM+sKAWpwt2YviKj3nJAaf18p1emvWol8RB3s+1JnOJJ4aYAl/dHwJJe A+4UqQtQvlHmNhVTgMWvf/Oce6a6qDNvxcqIWQWLQnnoXSVRstj3ZaRgTuRW74v3ibZc JAJF6rBbacUmpPWEk7dhhbdaW8FSyXKpW5eJhbrmC4nINJ6nU87Q7k/GeSYsPDEy5DNb z9KA== X-Gm-Message-State: AOAM530IymvcnG0SQhnMAAiv0UZez/1KCjrx/GpJ6dQ7OS9d8tyUTI5G Hmj8zcN4ba1dwbubgnXgAAuZdTD7MN6Y7Q== X-Google-Smtp-Source: ABdhPJzYSaPU+NPZ30UE5b17SAlXEWyCx2wEdozswkNTiUkviFPP1WjAWB1Krwz9f844/0/dmn7/QQ== X-Received: by 2002:a05:6a00:16c6:b029:32d:e190:9dd0 with SMTP id l6-20020a056a0016c6b029032de1909dd0mr6960538pfc.70.1626388758467; Thu, 15 Jul 2021 15:39:18 -0700 (PDT) Received: from omlet.com ([134.134.137.87]) by smtp.gmail.com with ESMTPSA id ft7sm9959459pjb.32.2021.07.15.15.39.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 15 Jul 2021 15:39:18 -0700 (PDT) From: Jason Ekstrand To: intel-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org Date: Thu, 15 Jul 2021 17:38:59 -0500 Message-Id: <20210715223900.1840576-7-jason@jlekstrand.net> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210715223900.1840576-1-jason@jlekstrand.net> References: <20210715223900.1840576-1-jason@jlekstrand.net> MIME-Version: 1.0 Subject: [Intel-gfx] [PATCH 6/7] drm/i915/gem: Correct the locking and pin pattern for dma-buf (v6) X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: =?UTF-8?q?Thomas=20Hellstr=C3=B6m?= Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" RnJvbTogVGhvbWFzIEhlbGxzdHLDtm0gPHRob21hcy5oZWxsc3Ryb21AbGludXguaW50ZWwuY29t PgoKSWYgb3VyIGV4cG9ydGVkIGRtYS1idWZzIGFyZSBpbXBvcnRlZCBieSBhbm90aGVyIGluc3Rh bmNlIG9mIG91ciBkcml2ZXIsCnRoYXQgaW5zdGFuY2Ugd2lsbCB0eXBpY2FsbHkgaGF2ZSB0aGUg aW1wb3J0ZWQgZG1hLWJ1ZnMgbG9ja2VkIGR1cmluZwpkbWFfYnVmX21hcF9hdHRhY2htZW50KCku IEJ1dCB0aGUgZXhwb3J0ZXIgYWxzbyBsb2NrcyB0aGUgc2FtZSByZXNlcnZhdGlvbgpvYmplY3Qg aW4gdGhlIG1hcF9kbWFfYnVmKCkgY2FsbGJhY2ssIHdoaWNoIGxlYWRzIHRvIHJlY3Vyc2l2ZSBs b2NraW5nLgoKU28gdGFraW5nIHRoZSBsb2NrIGluc2lkZSBfcGluX3BhZ2VzX3VubG9ja2VkKCkg aXMgaW5jb3JyZWN0LgoKQWRkaXRpb25hbGx5LCB0aGUgY3VycmVudCBwaW5uaW5nIGNvZGUgcGF0 aCBpcyBjb250cmFyeSB0byB0aGUgZGVmaW5lZAp3YXkgdGhhdCBwaW5uaW5nIHNob3VsZCBvY2N1 ci4KClJlbW92ZSB0aGUgZXhwbGljaXQgcGluL3VucGluIGZyb20gdGhlIG1hcC91bWFwIGZ1bmN0 aW9ucyBhbmQgbW92ZSB0aGVtCnRvIHRoZSBhdHRhY2gvZGV0YWNoIGFsbG93aW5nIGNvcnJlY3Qg bG9ja2luZyB0byBvY2N1ciwgYW5kIHRvIG1hdGNoCnRoZSBzdGF0aWMgZG1hLWJ1ZiBkcm1fcHJp bWUgcGF0dGVybi4KCkFkZCBhIGxpdmUgc2VsZnRlc3QgdG8gZXhlcmNpc2UgYm90aCBkeW5hbWlj IGFuZCBub24tZHluYW1pYwpleHBvcnRzLgoKdjI6Ci0gRXh0ZW5kIHRoZSBzZWxmdGVzdCB3aXRo IGEgZmFrZSBkeW5hbWljIGltcG9ydGVyLgotIFByb3ZpZGUgcmVhbCBwaW4gYW5kIHVucGluIGNh bGxiYWNrcyB0byBub3QgYWJ1c2UgdGhlIGludGVyZmFjZS4KdjM6IChydWhsKQotIFJlbW92ZSB0 aGUgZHluYW1pYyBleHBvcnQgc3VwcG9ydCBhbmQgbW92ZSB0aGUgcGlubmluZyBpbnRvIHRoZQog IGF0dGFjaC9kZXRhY2ggcGF0aC4KdjQ6IChydWhsKQotIFB1dCBwYWdlcyBkb2VzIG5vdCBuZWVk IHRvIGFzc2VydCBvbiB0aGUgZG1hLXJlc3YKdjU6IChqYXNvbikKLSBMb2NrIGFyb3VuZCBkbWFf YnVmX3VubWFwX2F0dGFjaG1lbnQoKSB3aGVuIGVtdWxhdGluZyBhIGR5bmFtaWMKICBpbXBvcnRl ciBpbiB0aGUgc3VidGVzdHMuCi0gVXNlIHBpbl9wYWdlc191bmxvY2tlZAp2NjogKGphc29uKQot IFVzZSBkbWFfYnVmX2F0dGFjaCBpbnN0ZWFkIG9mIGRtYV9idWZfYXR0YWNoX2R5bmFtaWMgaW4g dGhlIHNlbGZ0ZXN0cwoKUmVwb3J0ZWQtYnk6IE1pY2hhZWwgSi4gUnVobCA8bWljaGFlbC5qLnJ1 aGxAaW50ZWwuY29tPgpTaWduZWQtb2ZmLWJ5OiBUaG9tYXMgSGVsbHN0csO2bSA8dGhvbWFzLmhl bGxzdHJvbUBsaW51eC5pbnRlbC5jb20+ClNpZ25lZC1vZmYtYnk6IE1pY2hhZWwgSi4gUnVobCA8 bWljaGFlbC5qLnJ1aGxAaW50ZWwuY29tPgpTaWduZWQtb2ZmLWJ5OiBKYXNvbiBFa3N0cmFuZCA8 amFzb25Aamxla3N0cmFuZC5uZXQ+ClJldmlld2VkLWJ5OiBKYXNvbiBFa3N0cmFuZCA8amFzb25A amxla3N0cmFuZC5uZXQ+Ci0tLQogZHJpdmVycy9ncHUvZHJtL2k5MTUvZ2VtL2k5MTVfZ2VtX2Rt YWJ1Zi5jICAgIHwgIDQzICsrKysrKy0tCiAuLi4vZHJtL2k5MTUvZ2VtL3NlbGZ0ZXN0cy9pOTE1 X2dlbV9kbWFidWYuYyAgfCAxMDMgKysrKysrKysrKysrKysrKystCiAyIGZpbGVzIGNoYW5nZWQs IDEzMiBpbnNlcnRpb25zKCspLCAxNCBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9kcml2ZXJz L2dwdS9kcm0vaTkxNS9nZW0vaTkxNV9nZW1fZG1hYnVmLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkx NS9nZW0vaTkxNV9nZW1fZG1hYnVmLmMKaW5kZXggNjE2YzNhMmYxYmFmMC4uOWE2NTVmNjlhMDY3 MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ2VtL2k5MTVfZ2VtX2RtYWJ1Zi5j CisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2dlbS9pOTE1X2dlbV9kbWFidWYuYwpAQCAtMTIs NiArMTIsOCBAQAogI2luY2x1ZGUgImk5MTVfZ2VtX29iamVjdC5oIgogI2luY2x1ZGUgImk5MTVf c2NhdHRlcmxpc3QuaCIKIAorSTkxNV9TRUxGVEVTVF9ERUNMQVJFKHN0YXRpYyBib29sIGZvcmNl X2RpZmZlcmVudF9kZXZpY2VzOykKKwogc3RhdGljIHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0 ICpkbWFfYnVmX3RvX29iaihzdHJ1Y3QgZG1hX2J1ZiAqYnVmKQogewogCXJldHVybiB0b19pbnRl bF9ibyhidWYtPnByaXYpOwpAQCAtMjUsMTUgKzI3LDExIEBAIHN0YXRpYyBzdHJ1Y3Qgc2dfdGFi bGUgKmk5MTVfZ2VtX21hcF9kbWFfYnVmKHN0cnVjdCBkbWFfYnVmX2F0dGFjaG1lbnQgKmF0dGFj aG1lCiAJc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsICpkc3Q7CiAJaW50IHJldCwgaTsKIAotCXJl dCA9IGk5MTVfZ2VtX29iamVjdF9waW5fcGFnZXNfdW5sb2NrZWQob2JqKTsKLQlpZiAocmV0KQot CQlnb3RvIGVycjsKLQogCS8qIENvcHkgc2cgc28gdGhhdCB3ZSBtYWtlIGFuIGluZGVwZW5kZW50 IG1hcHBpbmcgKi8KIAlzdCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzZ190YWJsZSksIEdGUF9L RVJORUwpOwogCWlmIChzdCA9PSBOVUxMKSB7CiAJCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZXJy X3VucGluX3BhZ2VzOworCQlnb3RvIGVycjsKIAl9CiAKIAlyZXQgPSBzZ19hbGxvY190YWJsZShz dCwgb2JqLT5tbS5wYWdlcy0+bmVudHMsIEdGUF9LRVJORUwpOwpAQCAtNTgsOCArNTYsNiBAQCBz dGF0aWMgc3RydWN0IHNnX3RhYmxlICppOTE1X2dlbV9tYXBfZG1hX2J1ZihzdHJ1Y3QgZG1hX2J1 Zl9hdHRhY2htZW50ICphdHRhY2htZQogCXNnX2ZyZWVfdGFibGUoc3QpOwogZXJyX2ZyZWU6CiAJ a2ZyZWUoc3QpOwotZXJyX3VucGluX3BhZ2VzOgotCWk5MTVfZ2VtX29iamVjdF91bnBpbl9wYWdl cyhvYmopOwogZXJyOgogCXJldHVybiBFUlJfUFRSKHJldCk7CiB9CkBAIC02OCwxMyArNjQsOSBA QCBzdGF0aWMgdm9pZCBpOTE1X2dlbV91bm1hcF9kbWFfYnVmKHN0cnVjdCBkbWFfYnVmX2F0dGFj aG1lbnQgKmF0dGFjaG1lbnQsCiAJCQkJICAgc3RydWN0IHNnX3RhYmxlICpzZywKIAkJCQkgICBl bnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCiB7Ci0Jc3RydWN0IGRybV9pOTE1X2dlbV9vYmpl Y3QgKm9iaiA9IGRtYV9idWZfdG9fb2JqKGF0dGFjaG1lbnQtPmRtYWJ1Zik7Ci0KIAlkbWFfdW5t YXBfc2d0YWJsZShhdHRhY2htZW50LT5kZXYsIHNnLCBkaXIsIERNQV9BVFRSX1NLSVBfQ1BVX1NZ TkMpOwogCXNnX2ZyZWVfdGFibGUoc2cpOwogCWtmcmVlKHNnKTsKLQotCWk5MTVfZ2VtX29iamVj dF91bnBpbl9wYWdlcyhvYmopOwogfQogCiBzdGF0aWMgaW50IGk5MTVfZ2VtX2RtYWJ1Zl92bWFw KHN0cnVjdCBkbWFfYnVmICpkbWFfYnVmLCBzdHJ1Y3QgZG1hX2J1Zl9tYXAgKm1hcCkKQEAgLTE2 OCw3ICsxNjAsMzEgQEAgc3RhdGljIGludCBpOTE1X2dlbV9lbmRfY3B1X2FjY2VzcyhzdHJ1Y3Qg ZG1hX2J1ZiAqZG1hX2J1ZiwgZW51bSBkbWFfZGF0YV9kaXJlY3QKIAlyZXR1cm4gZXJyOwogfQog CisvKioKKyAqIGk5MTVfZ2VtX2RtYWJ1Zl9hdHRhY2ggLSBEbyBhbnkgZXh0cmEgYXR0YWNoIHdv cmsgbmVjZXNzYXJ5CisgKiBAZG1hYnVmOiBpbXBvcnRlZCBkbWEtYnVmCisgKiBAYXR0YWNoOiBu ZXcgYXR0YWNoIHRvIGRvIHdvcmsgb24KKyAqCisgKi8KK3N0YXRpYyBpbnQgaTkxNV9nZW1fZG1h YnVmX2F0dGFjaChzdHJ1Y3QgZG1hX2J1ZiAqZG1hYnVmLAorCQkJCSAgc3RydWN0IGRtYV9idWZf YXR0YWNobWVudCAqYXR0YWNoKQoreworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmog PSBkbWFfYnVmX3RvX29iaihkbWFidWYpOworCisJcmV0dXJuIGk5MTVfZ2VtX29iamVjdF9waW5f cGFnZXNfdW5sb2NrZWQob2JqKTsKK30KKworc3RhdGljIHZvaWQgaTkxNV9nZW1fZG1hYnVmX2Rl dGFjaChzdHJ1Y3QgZG1hX2J1ZiAqZG1hYnVmLAorCQkJCSAgIHN0cnVjdCBkbWFfYnVmX2F0dGFj aG1lbnQgKmF0dGFjaCkKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqID0gZG1h X2J1Zl90b19vYmooZG1hYnVmKTsKKworCWk5MTVfZ2VtX29iamVjdF91bnBpbl9wYWdlcyhvYmop OworfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IGRtYV9idWZfb3BzIGk5MTVfZG1hYnVmX29wcyA9 ICB7CisJLmF0dGFjaCA9IGk5MTVfZ2VtX2RtYWJ1Zl9hdHRhY2gsCisJLmRldGFjaCA9IGk5MTVf Z2VtX2RtYWJ1Zl9kZXRhY2gsCiAJLm1hcF9kbWFfYnVmID0gaTkxNV9nZW1fbWFwX2RtYV9idWYs CiAJLnVubWFwX2RtYV9idWYgPSBpOTE1X2dlbV91bm1hcF9kbWFfYnVmLAogCS5yZWxlYXNlID0g ZHJtX2dlbV9kbWFidWZfcmVsZWFzZSwKQEAgLTIwNCw2ICsyMjAsOCBAQCBzdGF0aWMgaW50IGk5 MTVfZ2VtX29iamVjdF9nZXRfcGFnZXNfZG1hYnVmKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0 ICpvYmopCiAJc3RydWN0IHNnX3RhYmxlICpwYWdlczsKIAl1bnNpZ25lZCBpbnQgc2dfcGFnZV9z aXplczsKIAorCWFzc2VydF9vYmplY3RfaGVsZChvYmopOworCiAJcGFnZXMgPSBkbWFfYnVmX21h cF9hdHRhY2htZW50KG9iai0+YmFzZS5pbXBvcnRfYXR0YWNoLAogCQkJCSAgICAgICBETUFfQklE SVJFQ1RJT05BTCk7CiAJaWYgKElTX0VSUihwYWdlcykpCkBAIC0yNDEsNyArMjU5LDggQEAgc3Ry dWN0IGRybV9nZW1fb2JqZWN0ICppOTE1X2dlbV9wcmltZV9pbXBvcnQoc3RydWN0IGRybV9kZXZp Y2UgKmRldiwKIAlpZiAoZG1hX2J1Zi0+b3BzID09ICZpOTE1X2RtYWJ1Zl9vcHMpIHsKIAkJb2Jq ID0gZG1hX2J1Zl90b19vYmooZG1hX2J1Zik7CiAJCS8qIGlzIGl0IGZyb20gb3VyIGRldmljZT8g Ki8KLQkJaWYgKG9iai0+YmFzZS5kZXYgPT0gZGV2KSB7CisJCWlmIChvYmotPmJhc2UuZGV2ID09 IGRldiAmJgorCQkgICAgIUk5MTVfU0VMRlRFU1RfT05MWShmb3JjZV9kaWZmZXJlbnRfZGV2aWNl cykpIHsKIAkJCS8qCiAJCQkgKiBJbXBvcnRpbmcgZG1hYnVmIGV4cG9ydGVkIGZyb20gb3V0IG93 biBnZW0gaW5jcmVhc2VzCiAJCQkgKiByZWZjb3VudCBvbiBnZW0gaXRzZWxmIGluc3RlYWQgb2Yg Zl9jb3VudCBvZiBkbWFidWYuCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9nZW0v c2VsZnRlc3RzL2k5MTVfZ2VtX2RtYWJ1Zi5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ2VtL3Nl bGZ0ZXN0cy9pOTE1X2dlbV9kbWFidWYuYwppbmRleCBkZDc0YmMwOWVjODhkLi40NDUxYmJiNDkx N2U0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9nZW0vc2VsZnRlc3RzL2k5MTVf Z2VtX2RtYWJ1Zi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2dlbS9zZWxmdGVzdHMvaTkx NV9nZW1fZG1hYnVmLmMKQEAgLTM1LDcgKzM1LDcgQEAgc3RhdGljIGludCBpZ3RfZG1hYnVmX2V4 cG9ydCh2b2lkICphcmcpCiBzdGF0aWMgaW50IGlndF9kbWFidWZfaW1wb3J0X3NlbGYodm9pZCAq YXJnKQogewogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1ID0gYXJnOwotCXN0cnVjdCBk cm1faTkxNV9nZW1fb2JqZWN0ICpvYmo7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9i aiwgKmltcG9ydF9vYmo7CiAJc3RydWN0IGRybV9nZW1fb2JqZWN0ICppbXBvcnQ7CiAJc3RydWN0 IGRtYV9idWYgKmRtYWJ1ZjsKIAlpbnQgZXJyOwpAQCAtNjUsMTQgKzY1LDExMiBAQCBzdGF0aWMg aW50IGlndF9kbWFidWZfaW1wb3J0X3NlbGYodm9pZCAqYXJnKQogCQllcnIgPSAtRUlOVkFMOwog CQlnb3RvIG91dF9pbXBvcnQ7CiAJfQorCWltcG9ydF9vYmogPSB0b19pbnRlbF9ibyhpbXBvcnQp OworCisJaTkxNV9nZW1fb2JqZWN0X2xvY2soaW1wb3J0X29iaiwgTlVMTCk7CisJZXJyID0gX19f X2k5MTVfZ2VtX29iamVjdF9nZXRfcGFnZXMoaW1wb3J0X29iaik7CisJaTkxNV9nZW1fb2JqZWN0 X3VubG9jayhpbXBvcnRfb2JqKTsKKwlpZiAoZXJyKSB7CisJCXByX2VycigiU2FtZSBvYmplY3Qg ZG1hLWJ1ZiBnZXRfcGFnZXMgZmFpbGVkIVxuIik7CisJCWdvdG8gb3V0X2ltcG9ydDsKKwl9CiAK IAllcnIgPSAwOwogb3V0X2ltcG9ydDoKLQlpOTE1X2dlbV9vYmplY3RfcHV0KHRvX2ludGVsX2Jv KGltcG9ydCkpOworCWk5MTVfZ2VtX29iamVjdF9wdXQoaW1wb3J0X29iaik7CitvdXRfZG1hYnVm OgorCWRtYV9idWZfcHV0KGRtYWJ1Zik7CitvdXQ6CisJaTkxNV9nZW1fb2JqZWN0X3B1dChvYmop OworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgaWd0X2RtYWJ1Zl9pbXBvcnRfc2FtZV9k cml2ZXIodm9pZCAqYXJnKQoreworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1ID0gYXJn OworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosICppbXBvcnRfb2JqOworCXN0cnVj dCBkcm1fZ2VtX29iamVjdCAqaW1wb3J0OworCXN0cnVjdCBkbWFfYnVmICpkbWFidWY7CisJc3Ry dWN0IGRtYV9idWZfYXR0YWNobWVudCAqaW1wb3J0X2F0dGFjaDsKKwlzdHJ1Y3Qgc2dfdGFibGUg KnN0OworCWxvbmcgdGltZW91dDsKKwlpbnQgZXJyOworCisJZm9yY2VfZGlmZmVyZW50X2Rldmlj ZXMgPSB0cnVlOworCW9iaiA9IGk5MTVfZ2VtX29iamVjdF9jcmVhdGVfc2htZW0oaTkxNSwgUEFH RV9TSVpFKTsKKwlpZiAoSVNfRVJSKG9iaikpCisJCWdvdG8gb3V0X3JldDsKKworCWRtYWJ1ZiA9 IGk5MTVfZ2VtX3ByaW1lX2V4cG9ydCgmb2JqLT5iYXNlLCAwKTsKKwlpZiAoSVNfRVJSKGRtYWJ1 ZikpIHsKKwkJcHJfZXJyKCJpOTE1X2dlbV9wcmltZV9leHBvcnQgZmFpbGVkIHdpdGggZXJyPSVk XG4iLAorCQkgICAgICAgKGludClQVFJfRVJSKGRtYWJ1ZikpOworCQllcnIgPSBQVFJfRVJSKGRt YWJ1Zik7CisJCWdvdG8gb3V0OworCX0KKworCWltcG9ydCA9IGk5MTVfZ2VtX3ByaW1lX2ltcG9y dCgmaTkxNS0+ZHJtLCBkbWFidWYpOworCWlmIChJU19FUlIoaW1wb3J0KSkgeworCQlwcl9lcnIo Imk5MTVfZ2VtX3ByaW1lX2ltcG9ydCBmYWlsZWQgd2l0aCBlcnI9JWRcbiIsCisJCSAgICAgICAo aW50KVBUUl9FUlIoaW1wb3J0KSk7CisJCWVyciA9IFBUUl9FUlIoaW1wb3J0KTsKKwkJZ290byBv dXRfZG1hYnVmOworCX0KKworCWlmIChpbXBvcnQgPT0gJm9iai0+YmFzZSkgeworCQlwcl9lcnIo Imk5MTVfZ2VtX3ByaW1lX2ltcG9ydCByZXVzZWQgZ2VtIG9iamVjdCFcbiIpOworCQllcnIgPSAt RUlOVkFMOworCQlnb3RvIG91dF9pbXBvcnQ7CisJfQorCisJaW1wb3J0X29iaiA9IHRvX2ludGVs X2JvKGltcG9ydCk7CisKKwlpOTE1X2dlbV9vYmplY3RfbG9jayhpbXBvcnRfb2JqLCBOVUxMKTsK KwllcnIgPSBfX19faTkxNV9nZW1fb2JqZWN0X2dldF9wYWdlcyhpbXBvcnRfb2JqKTsKKwlpZiAo ZXJyKSB7CisJCXByX2VycigiRGlmZmVyZW50IG9iamVjdHMgZG1hLWJ1ZiBnZXRfcGFnZXMgZmFp bGVkIVxuIik7CisJCWk5MTVfZ2VtX29iamVjdF91bmxvY2soaW1wb3J0X29iaik7CisJCWdvdG8g b3V0X2ltcG9ydDsKKwl9CisKKwkvKgorCSAqIElmIHRoZSBleHBvcnRlZCBvYmplY3QgaXMgbm90 IGluIHN5c3RlbSBtZW1vcnksIHNvbWV0aGluZworCSAqIHdlaXJkIGlzIGdvaW5nIG9uLiBUT0RP OiBXaGVuIHAycCBpcyBzdXBwb3J0ZWQsIHRoaXMgaXMgbm8KKwkgKiBsb25nZXIgY29uc2lkZXJl ZCB3ZWlyZC4KKwkgKi8KKwlpZiAob2JqLT5tbS5yZWdpb24gIT0gaTkxNS0+bW0ucmVnaW9uc1tJ TlRFTF9SRUdJT05fU01FTV0pIHsKKwkJcHJfZXJyKCJFeHBvcnRlZCBkbWEtYnVmIGlzIG5vdCBp biBzeXN0ZW0gbWVtb3J5XG4iKTsKKwkJZXJyID0gLUVJTlZBTDsKKwl9CisKKwlpOTE1X2dlbV9v YmplY3RfdW5sb2NrKGltcG9ydF9vYmopOworCisJLyogTm93IHRyeSBhIGZha2UgYW4gaW1wb3J0 ZXIgKi8KKwlpbXBvcnRfYXR0YWNoID0gZG1hX2J1Zl9hdHRhY2goZG1hYnVmLCBvYmotPmJhc2Uu ZGV2LT5kZXYpOworCWlmIChJU19FUlIoaW1wb3J0X2F0dGFjaCkpCisJCWdvdG8gb3V0X2ltcG9y dDsKKworCXN0ID0gZG1hX2J1Zl9tYXBfYXR0YWNobWVudChpbXBvcnRfYXR0YWNoLCBETUFfQklE SVJFQ1RJT05BTCk7CisJaWYgKElTX0VSUihzdCkpCisJCWdvdG8gb3V0X2RldGFjaDsKKworCXRp bWVvdXQgPSBkbWFfcmVzdl93YWl0X3RpbWVvdXQoZG1hYnVmLT5yZXN2LCBmYWxzZSwgdHJ1ZSwg NSAqIEhaKTsKKwlpZiAoIXRpbWVvdXQpIHsKKwkJcHJfZXJyKCJkbWFidWYgd2FpdCBmb3IgZXhj bHVzaXZlIGZlbmNlIHRpbWVkIG91dC5cbiIpOworCQl0aW1lb3V0ID0gLUVUSU1FOworCX0KKwll cnIgPSB0aW1lb3V0ID4gMCA/IDAgOiB0aW1lb3V0OworCWRtYV9idWZfdW5tYXBfYXR0YWNobWVu dChpbXBvcnRfYXR0YWNoLCBzdCwgRE1BX0JJRElSRUNUSU9OQUwpOworb3V0X2RldGFjaDoKKwlk bWFfYnVmX2RldGFjaChkbWFidWYsIGltcG9ydF9hdHRhY2gpOworb3V0X2ltcG9ydDoKKwlpOTE1 X2dlbV9vYmplY3RfcHV0KGltcG9ydF9vYmopOwogb3V0X2RtYWJ1ZjoKIAlkbWFfYnVmX3B1dChk bWFidWYpOwogb3V0OgogCWk5MTVfZ2VtX29iamVjdF9wdXQob2JqKTsKK291dF9yZXQ6CisJZm9y Y2VfZGlmZmVyZW50X2RldmljZXMgPSBmYWxzZTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC0yODYs NiArMzg0LDcgQEAgaW50IGk5MTVfZ2VtX2RtYWJ1Zl9saXZlX3NlbGZ0ZXN0cyhzdHJ1Y3QgZHJt X2k5MTVfcHJpdmF0ZSAqaTkxNSkKIHsKIAlzdGF0aWMgY29uc3Qgc3RydWN0IGk5MTVfc3VidGVz dCB0ZXN0c1tdID0gewogCQlTVUJURVNUKGlndF9kbWFidWZfZXhwb3J0KSwKKwkJU1VCVEVTVChp Z3RfZG1hYnVmX2ltcG9ydF9zYW1lX2RyaXZlciksCiAJfTsKIAogCXJldHVybiBpOTE1X3N1YnRl c3RzKHRlc3RzLCBpOTE1KTsKLS0gCjIuMzEuMQoKX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX18KSW50ZWwtZ2Z4IG1haWxpbmcgbGlzdApJbnRlbC1nZnhAbGlz dHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4v bGlzdGluZm8vaW50ZWwtZ2Z4Cg==