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,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id B5504C4338F for ; Fri, 23 Jul 2021 17:22:12 +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 8B29460E8F for ; Fri, 23 Jul 2021 17:22:12 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org 8B29460E8F Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=jlekstrand.net Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 3EF736FB03; Fri, 23 Jul 2021 17:22:07 +0000 (UTC) Received: from mail-pj1-x1033.google.com (mail-pj1-x1033.google.com [IPv6:2607:f8b0:4864:20::1033]) by gabe.freedesktop.org (Postfix) with ESMTPS id 988726FA73 for ; Fri, 23 Jul 2021 17:21:55 +0000 (UTC) Received: by mail-pj1-x1033.google.com with SMTP id j17-20020a17090aeb11b029017613554465so4614195pjz.4 for ; Fri, 23 Jul 2021 10:21:55 -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=MjHoGQL1aOqb5a0md93WeS7KwmfUam7OWmoSKBBWUlA=; b=B65WpO1Q9woxCGXjcVIn3foOKueOragjWQiDKx68wASlk4FUNeIrxWwy02zY8q0x3E BI0lIDz2c7XV7GkOumblzPvUCQLzEgl4xEQVDxi+uTEQheSt0OFOc9+FATQJfmPQ9tPO C/Tr3ztuO/Sy6uXMCOHYRIcC1aRRwjOmyVALbtdydJsTA1K0151TgpDzWvBFvkwQQ3jR 0xvJXJoFZ5PE8ngkmCwJhTBMxCcE7eVFwzjQGyqihRdhvfsdVamq3iOkOn+7okBv+tET GmDTRtXRiMt/IDX6lZOTQ5nqRjqJz8dFqdjAsU2nD9IQDtqLsE0ZFazuq5OsruEwvJih pYiw== 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=MjHoGQL1aOqb5a0md93WeS7KwmfUam7OWmoSKBBWUlA=; b=cziVgukG+WAMbNlsciLaJJ8OkShq4762+4eLcl8g+tLBS5A5ilguxIJVtgpeK8XI+e CXQG/gx7RPbvSoOUEk0dyRUGfrytr5ChABIlaJ0P2y8zZLYlbqKnAkSkdhi3x5wiiFcl o4lfnuZNCPUC50lu+5E9oozkp23S2B/OGvQWZ0CgNg58Xl7h+Ohvm9sAFHf9CBBXpGb8 zmwcLgSS82q56qRKQWxMkIWiBaWJaINZekYAacTZMfw7d+115mBShEjvFcg8luq8wIAl GLLL4hKuupC9Efv0g7FD4JW+EoMTcMPt1ZVEAMJ4eCZbUH0IyezlK1u2E3CLdC3ixCQU JN4g== X-Gm-Message-State: AOAM533ARVr2NALfaeeh/9C178tZlHed1eWoTYUXlUIcRLZtvxeQv7zu zMaB0Iy4uiYpDNZ7WbbvkrcWWw== X-Google-Smtp-Source: ABdhPJyZRF3yjHvJ0rFAWDVXAbqqwxa5RuGL0oZ+wM5T8kYBbiGolGGkDTGXSjv1nQKl1YOhBZ8XxA== X-Received: by 2002:a17:90a:af90:: with SMTP id w16mr14885596pjq.129.1627060915165; Fri, 23 Jul 2021 10:21:55 -0700 (PDT) Received: from omlet.lan ([134.134.137.86]) by smtp.gmail.com with ESMTPSA id s36sm24288648pgl.8.2021.07.23.10.21.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 23 Jul 2021 10:21:54 -0700 (PDT) From: Jason Ekstrand To: intel-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org Subject: [PATCH 7/8] drm/i915/gem: Correct the locking and pin pattern for dma-buf (v8) Date: Fri, 23 Jul 2021 12:21:41 -0500 Message-Id: <20210723172142.3273510-8-jason@jlekstrand.net> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210723172142.3273510-1-jason@jlekstrand.net> References: <20210723172142.3273510-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 v7: (mauld) - Use __i915_gem_object_get_pages (2 __underscores) instead of the 4 ____underscore version in the selftests v8: (mauld) - Drop the kernel doc from the static i915_gem_dmabuf_attach function - Add missing "err = PTR_ERR()" to a bunch of selftest error cases 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 | 37 ++++-- .../drm/i915/gem/selftests/i915_gem_dmabuf.c | 109 +++++++++++++++++- 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..59dc56ae14d6b 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,25 @@ static int i915_gem_end_cpu_access(struct dma_buf *dma_buf, enum dma_data_direct return err; } +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 +214,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 +253,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..d4ce01e6ee854 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,118 @@ 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)) { + err = PTR_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=%ld\n", + 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=%ld\n", + 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)) { + err = PTR_ERR(import_attach); + goto out_import; + } + + st = dma_buf_map_attachment(import_attach, DMA_BIDIRECTIONAL); + if (IS_ERR(st)) { + err = PTR_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 +390,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,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id F1C17C43216 for ; Fri, 23 Jul 2021 17:22:06 +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 C722D60EB5 for ; Fri, 23 Jul 2021 17:22:06 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org C722D60EB5 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=jlekstrand.net Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 13D1C6FA55; Fri, 23 Jul 2021 17:21:57 +0000 (UTC) Received: from mail-pj1-x1030.google.com (mail-pj1-x1030.google.com [IPv6:2607:f8b0:4864:20::1030]) by gabe.freedesktop.org (Postfix) with ESMTPS id DE2DE6FABE for ; Fri, 23 Jul 2021 17:21:55 +0000 (UTC) Received: by mail-pj1-x1030.google.com with SMTP id a9so3162733pjw.5 for ; Fri, 23 Jul 2021 10:21:55 -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=MjHoGQL1aOqb5a0md93WeS7KwmfUam7OWmoSKBBWUlA=; b=B65WpO1Q9woxCGXjcVIn3foOKueOragjWQiDKx68wASlk4FUNeIrxWwy02zY8q0x3E BI0lIDz2c7XV7GkOumblzPvUCQLzEgl4xEQVDxi+uTEQheSt0OFOc9+FATQJfmPQ9tPO C/Tr3ztuO/Sy6uXMCOHYRIcC1aRRwjOmyVALbtdydJsTA1K0151TgpDzWvBFvkwQQ3jR 0xvJXJoFZ5PE8ngkmCwJhTBMxCcE7eVFwzjQGyqihRdhvfsdVamq3iOkOn+7okBv+tET GmDTRtXRiMt/IDX6lZOTQ5nqRjqJz8dFqdjAsU2nD9IQDtqLsE0ZFazuq5OsruEwvJih pYiw== 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=MjHoGQL1aOqb5a0md93WeS7KwmfUam7OWmoSKBBWUlA=; b=iatyBbzGmUJvDO9tF5bHemQuNoJRIHfMnCiYIIp9RrVmAIKjm2SVYlAHKGTiUmpAoz 6+HL8PkL2hHu2ea95JQIB35fSp+fAEfgAcdQ9+CFL1yLV0KbZ9sIcCYU1Ayry0uGkh0D F7/nVhWkJtZ3ndOtop72h9/eGmbXqBCUbSxQv9rytPb15VeqpVN30JWy1cf8sR2704DB htRkdR/DMocBTihXYQoaRf2VFPK8pBISXMD9TPFc1UCs244/7uFTOj8JyhxtNTRgogdi 18XHChLkUcVz9B4x2lwl/LEhBvdkZ+El1Iy4L/ilcfEfED6rva+S+1J/FPSzoGeNBGVH LqHQ== X-Gm-Message-State: AOAM532Yb9Bs6KRVE4hpnKOepfFYuGbHxeS76RExfDdl4qJBBQIb8elJ l15xrfpgE1TzrLq0xlUqTRbwiZqIvUzq1A== X-Google-Smtp-Source: ABdhPJyZRF3yjHvJ0rFAWDVXAbqqwxa5RuGL0oZ+wM5T8kYBbiGolGGkDTGXSjv1nQKl1YOhBZ8XxA== X-Received: by 2002:a17:90a:af90:: with SMTP id w16mr14885596pjq.129.1627060915165; Fri, 23 Jul 2021 10:21:55 -0700 (PDT) Received: from omlet.lan ([134.134.137.86]) by smtp.gmail.com with ESMTPSA id s36sm24288648pgl.8.2021.07.23.10.21.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 23 Jul 2021 10:21:54 -0700 (PDT) From: Jason Ekstrand To: intel-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org Date: Fri, 23 Jul 2021 12:21:41 -0500 Message-Id: <20210723172142.3273510-8-jason@jlekstrand.net> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210723172142.3273510-1-jason@jlekstrand.net> References: <20210723172142.3273510-1-jason@jlekstrand.net> MIME-Version: 1.0 Subject: [Intel-gfx] [PATCH 7/8] drm/i915/gem: Correct the locking and pin pattern for dma-buf (v8) 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 dGhlIHNlbGZ0ZXN0cwp2NzogKG1hdWxkKQotIFVzZSBfX2k5MTVfZ2VtX29iamVjdF9nZXRfcGFn ZXMgKDIgX191bmRlcnNjb3JlcykgaW5zdGVhZCBvZiB0aGUKICA0IF9fX191bmRlcnNjb3JlIHZl cnNpb24gaW4gdGhlIHNlbGZ0ZXN0cwp2ODogKG1hdWxkKQotIERyb3AgdGhlIGtlcm5lbCBkb2Mg ZnJvbSB0aGUgc3RhdGljIGk5MTVfZ2VtX2RtYWJ1Zl9hdHRhY2ggZnVuY3Rpb24KLSBBZGQgbWlz c2luZyAiZXJyID0gUFRSX0VSUigpIiB0byBhIGJ1bmNoIG9mIHNlbGZ0ZXN0IGVycm9yIGNhc2Vz CgpSZXBvcnRlZC1ieTogTWljaGFlbCBKLiBSdWhsIDxtaWNoYWVsLmoucnVobEBpbnRlbC5jb20+ ClNpZ25lZC1vZmYtYnk6IFRob21hcyBIZWxsc3Ryw7ZtIDx0aG9tYXMuaGVsbHN0cm9tQGxpbnV4 LmludGVsLmNvbT4KU2lnbmVkLW9mZi1ieTogTWljaGFlbCBKLiBSdWhsIDxtaWNoYWVsLmoucnVo bEBpbnRlbC5jb20+ClNpZ25lZC1vZmYtYnk6IEphc29uIEVrc3RyYW5kIDxqYXNvbkBqbGVrc3Ry YW5kLm5ldD4KUmV2aWV3ZWQtYnk6IEphc29uIEVrc3RyYW5kIDxqYXNvbkBqbGVrc3RyYW5kLm5l dD4KLS0tCiBkcml2ZXJzL2dwdS9kcm0vaTkxNS9nZW0vaTkxNV9nZW1fZG1hYnVmLmMgICAgfCAg MzcgKysrKy0tCiAuLi4vZHJtL2k5MTUvZ2VtL3NlbGZ0ZXN0cy9pOTE1X2dlbV9kbWFidWYuYyAg fCAxMDkgKysrKysrKysrKysrKysrKystCiAyIGZpbGVzIGNoYW5nZWQsIDEzMiBpbnNlcnRpb25z KCspLCAxNCBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9n ZW0vaTkxNV9nZW1fZG1hYnVmLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9nZW0vaTkxNV9nZW1f ZG1hYnVmLmMKaW5kZXggNjE2YzNhMmYxYmFmMC4uNTlkYzU2YWUxNGQ2YiAxMDA2NDQKLS0tIGEv ZHJpdmVycy9ncHUvZHJtL2k5MTUvZ2VtL2k5MTVfZ2VtX2RtYWJ1Zi5jCisrKyBiL2RyaXZlcnMv Z3B1L2RybS9pOTE1L2dlbS9pOTE1X2dlbV9kbWFidWYuYwpAQCAtMTIsNiArMTIsOCBAQAogI2lu Y2x1ZGUgImk5MTVfZ2VtX29iamVjdC5oIgogI2luY2x1ZGUgImk5MTVfc2NhdHRlcmxpc3QuaCIK IAorSTkxNV9TRUxGVEVTVF9ERUNMQVJFKHN0YXRpYyBib29sIGZvcmNlX2RpZmZlcmVudF9kZXZp Y2VzOykKKwogc3RhdGljIHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpkbWFfYnVmX3RvX29i aihzdHJ1Y3QgZG1hX2J1ZiAqYnVmKQogewogCXJldHVybiB0b19pbnRlbF9ibyhidWYtPnByaXYp OwpAQCAtMjUsMTUgKzI3LDExIEBAIHN0YXRpYyBzdHJ1Y3Qgc2dfdGFibGUgKmk5MTVfZ2VtX21h cF9kbWFfYnVmKHN0cnVjdCBkbWFfYnVmX2F0dGFjaG1lbnQgKmF0dGFjaG1lCiAJc3RydWN0IHNj YXR0ZXJsaXN0ICpzcmMsICpkc3Q7CiAJaW50IHJldCwgaTsKIAotCXJldCA9IGk5MTVfZ2VtX29i amVjdF9waW5fcGFnZXNfdW5sb2NrZWQob2JqKTsKLQlpZiAocmV0KQotCQlnb3RvIGVycjsKLQog CS8qIENvcHkgc2cgc28gdGhhdCB3ZSBtYWtlIGFuIGluZGVwZW5kZW50IG1hcHBpbmcgKi8KIAlz dCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzZ190YWJsZSksIEdGUF9LRVJORUwpOwogCWlmIChz dCA9PSBOVUxMKSB7CiAJCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyX3VucGluX3BhZ2VzOwor CQlnb3RvIGVycjsKIAl9CiAKIAlyZXQgPSBzZ19hbGxvY190YWJsZShzdCwgb2JqLT5tbS5wYWdl cy0+bmVudHMsIEdGUF9LRVJORUwpOwpAQCAtNTgsOCArNTYsNiBAQCBzdGF0aWMgc3RydWN0IHNn X3RhYmxlICppOTE1X2dlbV9tYXBfZG1hX2J1ZihzdHJ1Y3QgZG1hX2J1Zl9hdHRhY2htZW50ICph dHRhY2htZQogCXNnX2ZyZWVfdGFibGUoc3QpOwogZXJyX2ZyZWU6CiAJa2ZyZWUoc3QpOwotZXJy X3VucGluX3BhZ2VzOgotCWk5MTVfZ2VtX29iamVjdF91bnBpbl9wYWdlcyhvYmopOwogZXJyOgog CXJldHVybiBFUlJfUFRSKHJldCk7CiB9CkBAIC02OCwxMyArNjQsOSBAQCBzdGF0aWMgdm9pZCBp OTE1X2dlbV91bm1hcF9kbWFfYnVmKHN0cnVjdCBkbWFfYnVmX2F0dGFjaG1lbnQgKmF0dGFjaG1l bnQsCiAJCQkJICAgc3RydWN0IHNnX3RhYmxlICpzZywKIAkJCQkgICBlbnVtIGRtYV9kYXRhX2Rp cmVjdGlvbiBkaXIpCiB7Ci0Jc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiA9IGRtYV9i dWZfdG9fb2JqKGF0dGFjaG1lbnQtPmRtYWJ1Zik7Ci0KIAlkbWFfdW5tYXBfc2d0YWJsZShhdHRh Y2htZW50LT5kZXYsIHNnLCBkaXIsIERNQV9BVFRSX1NLSVBfQ1BVX1NZTkMpOwogCXNnX2ZyZWVf dGFibGUoc2cpOwogCWtmcmVlKHNnKTsKLQotCWk5MTVfZ2VtX29iamVjdF91bnBpbl9wYWdlcyhv YmopOwogfQogCiBzdGF0aWMgaW50IGk5MTVfZ2VtX2RtYWJ1Zl92bWFwKHN0cnVjdCBkbWFfYnVm ICpkbWFfYnVmLCBzdHJ1Y3QgZG1hX2J1Zl9tYXAgKm1hcCkKQEAgLTE2OCw3ICsxNjAsMjUgQEAg c3RhdGljIGludCBpOTE1X2dlbV9lbmRfY3B1X2FjY2VzcyhzdHJ1Y3QgZG1hX2J1ZiAqZG1hX2J1 ZiwgZW51bSBkbWFfZGF0YV9kaXJlY3QKIAlyZXR1cm4gZXJyOwogfQogCitzdGF0aWMgaW50IGk5 MTVfZ2VtX2RtYWJ1Zl9hdHRhY2goc3RydWN0IGRtYV9idWYgKmRtYWJ1ZiwKKwkJCQkgIHN0cnVj dCBkbWFfYnVmX2F0dGFjaG1lbnQgKmF0dGFjaCkKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29i amVjdCAqb2JqID0gZG1hX2J1Zl90b19vYmooZG1hYnVmKTsKKworCXJldHVybiBpOTE1X2dlbV9v YmplY3RfcGluX3BhZ2VzX3VubG9ja2VkKG9iaik7Cit9CisKK3N0YXRpYyB2b2lkIGk5MTVfZ2Vt X2RtYWJ1Zl9kZXRhY2goc3RydWN0IGRtYV9idWYgKmRtYWJ1ZiwKKwkJCQkgICBzdHJ1Y3QgZG1h X2J1Zl9hdHRhY2htZW50ICphdHRhY2gpCit7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3Qg Km9iaiA9IGRtYV9idWZfdG9fb2JqKGRtYWJ1Zik7CisKKwlpOTE1X2dlbV9vYmplY3RfdW5waW5f cGFnZXMob2JqKTsKK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCBkbWFfYnVmX29wcyBpOTE1X2Rt YWJ1Zl9vcHMgPSAgeworCS5hdHRhY2ggPSBpOTE1X2dlbV9kbWFidWZfYXR0YWNoLAorCS5kZXRh Y2ggPSBpOTE1X2dlbV9kbWFidWZfZGV0YWNoLAogCS5tYXBfZG1hX2J1ZiA9IGk5MTVfZ2VtX21h cF9kbWFfYnVmLAogCS51bm1hcF9kbWFfYnVmID0gaTkxNV9nZW1fdW5tYXBfZG1hX2J1ZiwKIAku cmVsZWFzZSA9IGRybV9nZW1fZG1hYnVmX3JlbGVhc2UsCkBAIC0yMDQsNiArMjE0LDggQEAgc3Rh dGljIGludCBpOTE1X2dlbV9vYmplY3RfZ2V0X3BhZ2VzX2RtYWJ1ZihzdHJ1Y3QgZHJtX2k5MTVf Z2VtX29iamVjdCAqb2JqKQogCXN0cnVjdCBzZ190YWJsZSAqcGFnZXM7CiAJdW5zaWduZWQgaW50 IHNnX3BhZ2Vfc2l6ZXM7CiAKKwlhc3NlcnRfb2JqZWN0X2hlbGQob2JqKTsKKwogCXBhZ2VzID0g ZG1hX2J1Zl9tYXBfYXR0YWNobWVudChvYmotPmJhc2UuaW1wb3J0X2F0dGFjaCwKIAkJCQkgICAg ICAgRE1BX0JJRElSRUNUSU9OQUwpOwogCWlmIChJU19FUlIocGFnZXMpKQpAQCAtMjQxLDcgKzI1 Myw4IEBAIHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqaTkxNV9nZW1fcHJpbWVfaW1wb3J0KHN0cnVj dCBkcm1fZGV2aWNlICpkZXYsCiAJaWYgKGRtYV9idWYtPm9wcyA9PSAmaTkxNV9kbWFidWZfb3Bz KSB7CiAJCW9iaiA9IGRtYV9idWZfdG9fb2JqKGRtYV9idWYpOwogCQkvKiBpcyBpdCBmcm9tIG91 ciBkZXZpY2U/ICovCi0JCWlmIChvYmotPmJhc2UuZGV2ID09IGRldikgeworCQlpZiAob2JqLT5i YXNlLmRldiA9PSBkZXYgJiYKKwkJICAgICFJOTE1X1NFTEZURVNUX09OTFkoZm9yY2VfZGlmZmVy ZW50X2RldmljZXMpKSB7CiAJCQkvKgogCQkJICogSW1wb3J0aW5nIGRtYWJ1ZiBleHBvcnRlZCBm cm9tIG91dCBvd24gZ2VtIGluY3JlYXNlcwogCQkJICogcmVmY291bnQgb24gZ2VtIGl0c2VsZiBp bnN0ZWFkIG9mIGZfY291bnQgb2YgZG1hYnVmLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJt L2k5MTUvZ2VtL3NlbGZ0ZXN0cy9pOTE1X2dlbV9kbWFidWYuYyBiL2RyaXZlcnMvZ3B1L2RybS9p OTE1L2dlbS9zZWxmdGVzdHMvaTkxNV9nZW1fZG1hYnVmLmMKaW5kZXggZGQ3NGJjMDllYzg4ZC4u ZDRjZTAxZTZlZTg1NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ2VtL3NlbGZ0 ZXN0cy9pOTE1X2dlbV9kbWFidWYuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9nZW0vc2Vs ZnRlc3RzL2k5MTVfZ2VtX2RtYWJ1Zi5jCkBAIC0zNSw3ICszNSw3IEBAIHN0YXRpYyBpbnQgaWd0 X2RtYWJ1Zl9leHBvcnQodm9pZCAqYXJnKQogc3RhdGljIGludCBpZ3RfZG1hYnVmX2ltcG9ydF9z ZWxmKHZvaWQgKmFyZykKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSA9IGFyZzsK LQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOworCXN0cnVjdCBkcm1faTkxNV9nZW1f b2JqZWN0ICpvYmosICppbXBvcnRfb2JqOwogCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqaW1wb3J0 OwogCXN0cnVjdCBkbWFfYnVmICpkbWFidWY7CiAJaW50IGVycjsKQEAgLTY1LDE0ICs2NSwxMTgg QEAgc3RhdGljIGludCBpZ3RfZG1hYnVmX2ltcG9ydF9zZWxmKHZvaWQgKmFyZykKIAkJZXJyID0g LUVJTlZBTDsKIAkJZ290byBvdXRfaW1wb3J0OwogCX0KKwlpbXBvcnRfb2JqID0gdG9faW50ZWxf Ym8oaW1wb3J0KTsKKworCWk5MTVfZ2VtX29iamVjdF9sb2NrKGltcG9ydF9vYmosIE5VTEwpOwor CWVyciA9IF9faTkxNV9nZW1fb2JqZWN0X2dldF9wYWdlcyhpbXBvcnRfb2JqKTsKKwlpOTE1X2dl bV9vYmplY3RfdW5sb2NrKGltcG9ydF9vYmopOworCWlmIChlcnIpIHsKKwkJcHJfZXJyKCJTYW1l IG9iamVjdCBkbWEtYnVmIGdldF9wYWdlcyBmYWlsZWQhXG4iKTsKKwkJZ290byBvdXRfaW1wb3J0 OworCX0KIAogCWVyciA9IDA7CiBvdXRfaW1wb3J0OgotCWk5MTVfZ2VtX29iamVjdF9wdXQodG9f aW50ZWxfYm8oaW1wb3J0KSk7CisJaTkxNV9nZW1fb2JqZWN0X3B1dChpbXBvcnRfb2JqKTsKK291 dF9kbWFidWY6CisJZG1hX2J1Zl9wdXQoZG1hYnVmKTsKK291dDoKKwlpOTE1X2dlbV9vYmplY3Rf cHV0KG9iaik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBpZ3RfZG1hYnVmX2ltcG9y dF9zYW1lX2RyaXZlcih2b2lkICphcmcpCit7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5 MTUgPSBhcmc7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwgKmltcG9ydF9vYmo7 CisJc3RydWN0IGRybV9nZW1fb2JqZWN0ICppbXBvcnQ7CisJc3RydWN0IGRtYV9idWYgKmRtYWJ1 ZjsKKwlzdHJ1Y3QgZG1hX2J1Zl9hdHRhY2htZW50ICppbXBvcnRfYXR0YWNoOworCXN0cnVjdCBz Z190YWJsZSAqc3Q7CisJbG9uZyB0aW1lb3V0OworCWludCBlcnI7CisKKwlmb3JjZV9kaWZmZXJl bnRfZGV2aWNlcyA9IHRydWU7CisJb2JqID0gaTkxNV9nZW1fb2JqZWN0X2NyZWF0ZV9zaG1lbShp OTE1LCBQQUdFX1NJWkUpOworCWlmIChJU19FUlIob2JqKSkgeworCQllcnIgPSBQVFJfRVJSKG9i aik7CisJCWdvdG8gb3V0X3JldDsKKwl9CisKKwlkbWFidWYgPSBpOTE1X2dlbV9wcmltZV9leHBv cnQoJm9iai0+YmFzZSwgMCk7CisJaWYgKElTX0VSUihkbWFidWYpKSB7CisJCXByX2VycigiaTkx NV9nZW1fcHJpbWVfZXhwb3J0IGZhaWxlZCB3aXRoIGVycj0lbGRcbiIsCisJCSAgICAgICBQVFJf RVJSKGRtYWJ1ZikpOworCQllcnIgPSBQVFJfRVJSKGRtYWJ1Zik7CisJCWdvdG8gb3V0OworCX0K KworCWltcG9ydCA9IGk5MTVfZ2VtX3ByaW1lX2ltcG9ydCgmaTkxNS0+ZHJtLCBkbWFidWYpOwor CWlmIChJU19FUlIoaW1wb3J0KSkgeworCQlwcl9lcnIoImk5MTVfZ2VtX3ByaW1lX2ltcG9ydCBm YWlsZWQgd2l0aCBlcnI9JWxkXG4iLAorCQkgICAgICAgUFRSX0VSUihpbXBvcnQpKTsKKwkJZXJy ID0gUFRSX0VSUihpbXBvcnQpOworCQlnb3RvIG91dF9kbWFidWY7CisJfQorCisJaWYgKGltcG9y dCA9PSAmb2JqLT5iYXNlKSB7CisJCXByX2VycigiaTkxNV9nZW1fcHJpbWVfaW1wb3J0IHJldXNl ZCBnZW0gb2JqZWN0IVxuIik7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X2ltcG9ydDsK Kwl9CisKKwlpbXBvcnRfb2JqID0gdG9faW50ZWxfYm8oaW1wb3J0KTsKKworCWk5MTVfZ2VtX29i amVjdF9sb2NrKGltcG9ydF9vYmosIE5VTEwpOworCWVyciA9IF9faTkxNV9nZW1fb2JqZWN0X2dl dF9wYWdlcyhpbXBvcnRfb2JqKTsKKwlpZiAoZXJyKSB7CisJCXByX2VycigiRGlmZmVyZW50IG9i amVjdHMgZG1hLWJ1ZiBnZXRfcGFnZXMgZmFpbGVkIVxuIik7CisJCWk5MTVfZ2VtX29iamVjdF91 bmxvY2soaW1wb3J0X29iaik7CisJCWdvdG8gb3V0X2ltcG9ydDsKKwl9CisKKwkvKgorCSAqIElm IHRoZSBleHBvcnRlZCBvYmplY3QgaXMgbm90IGluIHN5c3RlbSBtZW1vcnksIHNvbWV0aGluZwor CSAqIHdlaXJkIGlzIGdvaW5nIG9uLiBUT0RPOiBXaGVuIHAycCBpcyBzdXBwb3J0ZWQsIHRoaXMg aXMgbm8KKwkgKiBsb25nZXIgY29uc2lkZXJlZCB3ZWlyZC4KKwkgKi8KKwlpZiAob2JqLT5tbS5y ZWdpb24gIT0gaTkxNS0+bW0ucmVnaW9uc1tJTlRFTF9SRUdJT05fU01FTV0pIHsKKwkJcHJfZXJy KCJFeHBvcnRlZCBkbWEtYnVmIGlzIG5vdCBpbiBzeXN0ZW0gbWVtb3J5XG4iKTsKKwkJZXJyID0g LUVJTlZBTDsKKwl9CisKKwlpOTE1X2dlbV9vYmplY3RfdW5sb2NrKGltcG9ydF9vYmopOworCisJ LyogTm93IHRyeSBhIGZha2UgYW4gaW1wb3J0ZXIgKi8KKwlpbXBvcnRfYXR0YWNoID0gZG1hX2J1 Zl9hdHRhY2goZG1hYnVmLCBvYmotPmJhc2UuZGV2LT5kZXYpOworCWlmIChJU19FUlIoaW1wb3J0 X2F0dGFjaCkpIHsKKwkJZXJyID0gUFRSX0VSUihpbXBvcnRfYXR0YWNoKTsKKwkJZ290byBvdXRf aW1wb3J0OworCX0KKworCXN0ID0gZG1hX2J1Zl9tYXBfYXR0YWNobWVudChpbXBvcnRfYXR0YWNo LCBETUFfQklESVJFQ1RJT05BTCk7CisJaWYgKElTX0VSUihzdCkpIHsKKwkJZXJyID0gUFRSX0VS UihzdCk7CisJCWdvdG8gb3V0X2RldGFjaDsKKwl9CisKKwl0aW1lb3V0ID0gZG1hX3Jlc3Zfd2Fp dF90aW1lb3V0KGRtYWJ1Zi0+cmVzdiwgZmFsc2UsIHRydWUsIDUgKiBIWik7CisJaWYgKCF0aW1l b3V0KSB7CisJCXByX2VycigiZG1hYnVmIHdhaXQgZm9yIGV4Y2x1c2l2ZSBmZW5jZSB0aW1lZCBv dXQuXG4iKTsKKwkJdGltZW91dCA9IC1FVElNRTsKKwl9CisJZXJyID0gdGltZW91dCA+IDAgPyAw IDogdGltZW91dDsKKwlkbWFfYnVmX3VubWFwX2F0dGFjaG1lbnQoaW1wb3J0X2F0dGFjaCwgc3Qs IERNQV9CSURJUkVDVElPTkFMKTsKK291dF9kZXRhY2g6CisJZG1hX2J1Zl9kZXRhY2goZG1hYnVm LCBpbXBvcnRfYXR0YWNoKTsKK291dF9pbXBvcnQ6CisJaTkxNV9nZW1fb2JqZWN0X3B1dChpbXBv cnRfb2JqKTsKIG91dF9kbWFidWY6CiAJZG1hX2J1Zl9wdXQoZG1hYnVmKTsKIG91dDoKIAlpOTE1 X2dlbV9vYmplY3RfcHV0KG9iaik7CitvdXRfcmV0OgorCWZvcmNlX2RpZmZlcmVudF9kZXZpY2Vz ID0gZmFsc2U7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtMjg2LDYgKzM5MCw3IEBAIGludCBpOTE1 X2dlbV9kbWFidWZfbGl2ZV9zZWxmdGVzdHMoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUp CiB7CiAJc3RhdGljIGNvbnN0IHN0cnVjdCBpOTE1X3N1YnRlc3QgdGVzdHNbXSA9IHsKIAkJU1VC VEVTVChpZ3RfZG1hYnVmX2V4cG9ydCksCisJCVNVQlRFU1QoaWd0X2RtYWJ1Zl9pbXBvcnRfc2Ft ZV9kcml2ZXIpLAogCX07CiAKIAlyZXR1cm4gaTkxNV9zdWJ0ZXN0cyh0ZXN0cywgaTkxNSk7Ci0t IAoyLjMxLjEKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f CkludGVsLWdmeCBtYWlsaW5nIGxpc3QKSW50ZWwtZ2Z4QGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpo dHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2ludGVsLWdmeAo=