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=-6.8 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS 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 1C422C17440 for ; Fri, 8 Nov 2019 23:03:52 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id D3BEE20865 for ; Fri, 8 Nov 2019 23:03:51 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729981AbfKHXDu (ORCPT ); Fri, 8 Nov 2019 18:03:50 -0500 Received: from metis.ext.pengutronix.de ([85.220.165.71]:51675 "EHLO metis.ext.pengutronix.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726121AbfKHXDu (ORCPT ); Fri, 8 Nov 2019 18:03:50 -0500 Received: from gallifrey.ext.pengutronix.de ([2001:67c:670:201:5054:ff:fe8d:eefb] helo=localhost) by metis.ext.pengutronix.de with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1iTDIA-0002Ia-C0; Sat, 09 Nov 2019 00:03:46 +0100 Message-ID: <3a0cfce79620152facfe31b442a735db1dcda436.camel@pengutronix.de> Subject: Re: [PATCH 15/16] drm/etnaviv: use ktime_t for timeouts From: Lucas Stach To: Arnd Bergmann , y2038@lists.linaro.org, David Airlie , Daniel Vetter Cc: Guido =?ISO-8859-1?Q?G=FCnther?= , linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, etnaviv@lists.freedesktop.org, Russell King , Sam Ravnborg , Christian =?ISO-8859-1?Q?K=F6nig?= , Emil Velikov Date: Sat, 09 Nov 2019 00:03:41 +0100 In-Reply-To: <20191108213257.3097633-16-arnd@arndb.de> References: <20191108213257.3097633-1-arnd@arndb.de> <20191108213257.3097633-16-arnd@arndb.de> Content-Type: text/plain; charset="UTF-8" User-Agent: Evolution 3.34.1 (3.34.1-1.fc31) MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-SA-Exim-Connect-IP: 2001:67c:670:201:5054:ff:fe8d:eefb X-SA-Exim-Mail-From: l.stach@pengutronix.de X-SA-Exim-Scanned: No (on metis.ext.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-kernel@vger.kernel.org Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Am Freitag, den 08.11.2019, 22:32 +0100 schrieb Arnd Bergmann: > struct timespec is being removed from the kernel because it often leads > to code that is not y2038-safe. > > In the etnaviv driver, monotonic timestamps are used, which do not suffer > from overflow, but using ktime_t still leads to better code overall. > > The conversion is straightforward for the most part, except for > etnaviv_timeout_to_jiffies(), which needs to handle arguments larger > than MAX_JIFFY_OFFSET on 32-bit architectures. > > Signed-off-by: Arnd Bergmann > --- > drivers/gpu/drm/etnaviv/etnaviv_drv.c | 19 +++++++++---------- > drivers/gpu/drm/etnaviv/etnaviv_drv.h | 21 +++++++++------------ > drivers/gpu/drm/etnaviv/etnaviv_gem.c | 5 ++--- > drivers/gpu/drm/etnaviv/etnaviv_gem.h | 2 +- > drivers/gpu/drm/etnaviv/etnaviv_gpu.c | 4 ++-- > drivers/gpu/drm/etnaviv/etnaviv_gpu.h | 4 ++-- > 6 files changed, 25 insertions(+), 30 deletions(-) > > diff --git a/drivers/gpu/drm/etnaviv/etnaviv_drv.c b/drivers/gpu/drm/etnaviv/etnaviv_drv.c > index 1f9c01be40d7..1250c5e06329 100644 > --- a/drivers/gpu/drm/etnaviv/etnaviv_drv.c > +++ b/drivers/gpu/drm/etnaviv/etnaviv_drv.c > @@ -282,16 +282,13 @@ static int etnaviv_ioctl_gem_new(struct drm_device *dev, void *data, > args->flags, &args->handle); > } > > -#define TS(t) ((struct timespec){ \ > - .tv_sec = (t).tv_sec, \ > - .tv_nsec = (t).tv_nsec \ > -}) > - > static int etnaviv_ioctl_gem_cpu_prep(struct drm_device *dev, void *data, > struct drm_file *file) > { > struct drm_etnaviv_gem_cpu_prep *args = data; > struct drm_gem_object *obj; > + ktime_t timeout = ktime_set(args->timeout.tv_sec, > + args->timeout.tv_nsec); > int ret; > > if (args->op & ~(ETNA_PREP_READ | ETNA_PREP_WRITE | ETNA_PREP_NOSYNC)) > @@ -301,7 +298,7 @@ static int etnaviv_ioctl_gem_cpu_prep(struct drm_device *dev, void *data, > if (!obj) > return -ENOENT; > > - ret = etnaviv_gem_cpu_prep(obj, args->op, &TS(args->timeout)); > + ret = etnaviv_gem_cpu_prep(obj, args->op, timeout); > > drm_gem_object_put_unlocked(obj); > > @@ -354,7 +351,8 @@ static int etnaviv_ioctl_wait_fence(struct drm_device *dev, void *data, > { > struct drm_etnaviv_wait_fence *args = data; > struct etnaviv_drm_private *priv = dev->dev_private; > - struct timespec *timeout = &TS(args->timeout); > + ktime_t timeout = ktime_set(args->timeout.tv_sec, > + args->timeout.tv_nsec); > struct etnaviv_gpu *gpu; > > if (args->flags & ~(ETNA_WAIT_NONBLOCK)) > @@ -368,7 +366,7 @@ static int etnaviv_ioctl_wait_fence(struct drm_device *dev, void *data, > return -ENXIO; > > if (args->flags & ETNA_WAIT_NONBLOCK) > - timeout = NULL; > + timeout = ktime_set(0, 0); This is a change in behavior, as far as I can see. After this change the called internal function is not able to differentiate between a NONBLOCK call and a blocking call with 0 timeout. The difference being that on a busy object the NONBLOCK call will return -EBUSY, while a blocking call will return -ETIMEDOUT. But then CLOCK_MONOTONIC starts at 0 and should not never wrap, right? If that's the case then we should never encounter a genuine 0 timeout and this change would be okay. Regards, Lucas > > return etnaviv_gpu_wait_fence_interruptible(gpu, args->fence, > timeout); > @@ -403,7 +401,8 @@ static int etnaviv_ioctl_gem_wait(struct drm_device *dev, void *data, > { > struct etnaviv_drm_private *priv = dev->dev_private; > struct drm_etnaviv_gem_wait *args = data; > - struct timespec *timeout = &TS(args->timeout); > + ktime_t timeout = ktime_set(args->timeout.tv_sec, > + args->timeout.tv_nsec); > struct drm_gem_object *obj; > struct etnaviv_gpu *gpu; > int ret; > @@ -423,7 +422,7 @@ static int etnaviv_ioctl_gem_wait(struct drm_device *dev, void *data, > return -ENOENT; > > if (args->flags & ETNA_WAIT_NONBLOCK) > - timeout = NULL; > + timeout = ktime_set(0, 0); > > ret = etnaviv_gem_wait_bo(gpu, obj, timeout); > > diff --git a/drivers/gpu/drm/etnaviv/etnaviv_drv.h b/drivers/gpu/drm/etnaviv/etnaviv_drv.h > index 32cfa5a48d42..57a4e247bbcf 100644 > --- a/drivers/gpu/drm/etnaviv/etnaviv_drv.h > +++ b/drivers/gpu/drm/etnaviv/etnaviv_drv.h > @@ -60,8 +60,7 @@ struct drm_gem_object *etnaviv_gem_prime_import_sg_table(struct drm_device *dev, > int etnaviv_gem_prime_pin(struct drm_gem_object *obj); > void etnaviv_gem_prime_unpin(struct drm_gem_object *obj); > void *etnaviv_gem_vmap(struct drm_gem_object *obj); > -int etnaviv_gem_cpu_prep(struct drm_gem_object *obj, u32 op, > - struct timespec *timeout); > +int etnaviv_gem_cpu_prep(struct drm_gem_object *obj, u32 op, ktime_t timeout); > int etnaviv_gem_cpu_fini(struct drm_gem_object *obj); > void etnaviv_gem_free_object(struct drm_gem_object *obj); > int etnaviv_gem_new_handle(struct drm_device *dev, struct drm_file *file, > @@ -106,22 +105,20 @@ static inline size_t size_vstruct(size_t nelem, size_t elem_size, size_t base) > * We need to calculate the timeout in terms of number of jiffies > * between the specified timeout and the current CLOCK_MONOTONIC time. > */ > -static inline unsigned long etnaviv_timeout_to_jiffies( > - const struct timespec *timeout) > +static inline unsigned long etnaviv_timeout_to_jiffies(ktime_t timeout) > { > - struct timespec64 ts, to; > - > - to = timespec_to_timespec64(*timeout); > - > - ktime_get_ts64(&ts); > + s64 remain = ktime_to_ns(ktime_sub(timeout, ktime_get())); > > /* timeouts before "now" have already expired */ > - if (timespec64_compare(&to, &ts) <= 0) > + if (remain < 0) > return 0; > > - ts = timespec64_sub(to, ts); > +#ifndef CONFIG_64BIT > + if (remain > ((s64)MAX_JIFFY_OFFSET * NSEC_PER_SEC / HZ)) > + return MAX_JIFFY_OFFSET; > +#endif > > - return timespec64_to_jiffies(&ts); > + return nsecs_to_jiffies(remain); > } > > #endif /* __ETNAVIV_DRV_H__ */ > diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem.c b/drivers/gpu/drm/etnaviv/etnaviv_gem.c > index cb1faaac380a..febe5196788e 100644 > --- a/drivers/gpu/drm/etnaviv/etnaviv_gem.c > +++ b/drivers/gpu/drm/etnaviv/etnaviv_gem.c > @@ -372,8 +372,7 @@ static inline enum dma_data_direction etnaviv_op_to_dma_dir(u32 op) > return DMA_BIDIRECTIONAL; > } > > -int etnaviv_gem_cpu_prep(struct drm_gem_object *obj, u32 op, > - struct timespec *timeout) > +int etnaviv_gem_cpu_prep(struct drm_gem_object *obj, u32 op, ktime_t timeout) > { > struct etnaviv_gem_object *etnaviv_obj = to_etnaviv_bo(obj); > struct drm_device *dev = obj->dev; > @@ -431,7 +430,7 @@ int etnaviv_gem_cpu_fini(struct drm_gem_object *obj) > } > > int etnaviv_gem_wait_bo(struct etnaviv_gpu *gpu, struct drm_gem_object *obj, > - struct timespec *timeout) > + ktime_t timeout) > { > struct etnaviv_gem_object *etnaviv_obj = to_etnaviv_bo(obj); > > diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem.h b/drivers/gpu/drm/etnaviv/etnaviv_gem.h > index d6270acce619..a3461a554a6c 100644 > --- a/drivers/gpu/drm/etnaviv/etnaviv_gem.h > +++ b/drivers/gpu/drm/etnaviv/etnaviv_gem.h > @@ -112,7 +112,7 @@ struct etnaviv_gem_submit { > void etnaviv_submit_put(struct etnaviv_gem_submit * submit); > > int etnaviv_gem_wait_bo(struct etnaviv_gpu *gpu, struct drm_gem_object *obj, > - struct timespec *timeout); > + ktime_t timeout); > int etnaviv_gem_new_private(struct drm_device *dev, size_t size, u32 flags, > const struct etnaviv_gem_ops *ops, struct etnaviv_gem_object **res); > void etnaviv_gem_obj_add(struct drm_device *dev, struct drm_gem_object *obj); > diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gpu.c b/drivers/gpu/drm/etnaviv/etnaviv_gpu.c > index d47d1a8e0219..e42b1c4d902c 100644 > --- a/drivers/gpu/drm/etnaviv/etnaviv_gpu.c > +++ b/drivers/gpu/drm/etnaviv/etnaviv_gpu.c > @@ -1132,7 +1132,7 @@ static void event_free(struct etnaviv_gpu *gpu, unsigned int event) > * Cmdstream submission/retirement: > */ > int etnaviv_gpu_wait_fence_interruptible(struct etnaviv_gpu *gpu, > - u32 id, struct timespec *timeout) > + u32 id, ktime_t timeout) > { > struct dma_fence *fence; > int ret; > @@ -1179,7 +1179,7 @@ int etnaviv_gpu_wait_fence_interruptible(struct etnaviv_gpu *gpu, > * that lock in this function while waiting. > */ > int etnaviv_gpu_wait_obj_inactive(struct etnaviv_gpu *gpu, > - struct etnaviv_gem_object *etnaviv_obj, struct timespec *timeout) > + struct etnaviv_gem_object *etnaviv_obj, ktime_t timeout) > { > unsigned long remaining; > long ret; > diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gpu.h b/drivers/gpu/drm/etnaviv/etnaviv_gpu.h > index 8f9bd4edc96a..6d352a435427 100644 > --- a/drivers/gpu/drm/etnaviv/etnaviv_gpu.h > +++ b/drivers/gpu/drm/etnaviv/etnaviv_gpu.h > @@ -169,9 +169,9 @@ int etnaviv_gpu_debugfs(struct etnaviv_gpu *gpu, struct seq_file *m); > void etnaviv_gpu_recover_hang(struct etnaviv_gpu *gpu); > void etnaviv_gpu_retire(struct etnaviv_gpu *gpu); > int etnaviv_gpu_wait_fence_interruptible(struct etnaviv_gpu *gpu, > - u32 fence, struct timespec *timeout); > + u32 fence, ktime_t timeout); > int etnaviv_gpu_wait_obj_inactive(struct etnaviv_gpu *gpu, > - struct etnaviv_gem_object *etnaviv_obj, struct timespec *timeout); > + struct etnaviv_gem_object *etnaviv_obj, ktime_t timeout); > struct dma_fence *etnaviv_gpu_submit(struct etnaviv_gem_submit *submit); > int etnaviv_gpu_pm_get_sync(struct etnaviv_gpu *gpu); > void etnaviv_gpu_pm_put(struct etnaviv_gpu *gpu); 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=-6.8 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS 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 C11E3C17441 for ; Fri, 8 Nov 2019 23:03:52 +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 9547220865 for ; Fri, 8 Nov 2019 23:03:52 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 9547220865 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de 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 CDD986E0FE; Fri, 8 Nov 2019 23:03:51 +0000 (UTC) Received: from metis.ext.pengutronix.de (metis.ext.pengutronix.de [IPv6:2001:67c:670:201:290:27ff:fe1d:cc33]) by gabe.freedesktop.org (Postfix) with ESMTPS id CCCD26E0FE for ; Fri, 8 Nov 2019 23:03:50 +0000 (UTC) Received: from gallifrey.ext.pengutronix.de ([2001:67c:670:201:5054:ff:fe8d:eefb] helo=localhost) by metis.ext.pengutronix.de with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1iTDIA-0002Ia-C0; Sat, 09 Nov 2019 00:03:46 +0100 Message-ID: <3a0cfce79620152facfe31b442a735db1dcda436.camel@pengutronix.de> Subject: Re: [PATCH 15/16] drm/etnaviv: use ktime_t for timeouts From: Lucas Stach To: Arnd Bergmann , y2038@lists.linaro.org, David Airlie , Daniel Vetter Date: Sat, 09 Nov 2019 00:03:41 +0100 In-Reply-To: <20191108213257.3097633-16-arnd@arndb.de> References: <20191108213257.3097633-1-arnd@arndb.de> <20191108213257.3097633-16-arnd@arndb.de> User-Agent: Evolution 3.34.1 (3.34.1-1.fc31) MIME-Version: 1.0 X-SA-Exim-Connect-IP: 2001:67c:670:201:5054:ff:fe8d:eefb X-SA-Exim-Mail-From: l.stach@pengutronix.de X-SA-Exim-Scanned: No (on metis.ext.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: dri-devel@lists.freedesktop.org X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Guido =?ISO-8859-1?Q?G=FCnther?= , linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, etnaviv@lists.freedesktop.org, Russell King , Sam Ravnborg , Christian =?ISO-8859-1?Q?K=F6nig?= , Emil Velikov Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" Message-ID: <20191108230341.wkA2-u52F315gGOc0Syqt2iF85e32RPK2sQ8RuPWtxY@z> QW0gRnJlaXRhZywgZGVuIDA4LjExLjIwMTksIDIyOjMyICswMTAwIHNjaHJpZWIgQXJuZCBCZXJn bWFubjoKPiBzdHJ1Y3QgdGltZXNwZWMgaXMgYmVpbmcgcmVtb3ZlZCBmcm9tIHRoZSBrZXJuZWwg YmVjYXVzZSBpdCBvZnRlbiBsZWFkcwo+IHRvIGNvZGUgdGhhdCBpcyBub3QgeTIwMzgtc2FmZS4K PiAKPiBJbiB0aGUgZXRuYXZpdiBkcml2ZXIsIG1vbm90b25pYyB0aW1lc3RhbXBzIGFyZSB1c2Vk LCB3aGljaCBkbyBub3Qgc3VmZmVyCj4gZnJvbSBvdmVyZmxvdywgYnV0IHVzaW5nIGt0aW1lX3Qg c3RpbGwgbGVhZHMgdG8gYmV0dGVyIGNvZGUgb3ZlcmFsbC4KPiAKPiBUaGUgY29udmVyc2lvbiBp cyBzdHJhaWdodGZvcndhcmQgZm9yIHRoZSBtb3N0IHBhcnQsIGV4Y2VwdCBmb3IKPiBldG5hdml2 X3RpbWVvdXRfdG9famlmZmllcygpLCB3aGljaCBuZWVkcyB0byBoYW5kbGUgYXJndW1lbnRzIGxh cmdlcgo+IHRoYW4gTUFYX0pJRkZZX09GRlNFVCBvbiAzMi1iaXQgYXJjaGl0ZWN0dXJlcy4KPiAK PiBTaWduZWQtb2ZmLWJ5OiBBcm5kIEJlcmdtYW5uIDxhcm5kQGFybmRiLmRlPgo+IC0tLQo+ICBk cml2ZXJzL2dwdS9kcm0vZXRuYXZpdi9ldG5hdml2X2Rydi5jIHwgMTkgKysrKysrKysrLS0tLS0t LS0tLQo+ICBkcml2ZXJzL2dwdS9kcm0vZXRuYXZpdi9ldG5hdml2X2Rydi5oIHwgMjEgKysrKysr KysrLS0tLS0tLS0tLS0tCj4gIGRyaXZlcnMvZ3B1L2RybS9ldG5hdml2L2V0bmF2aXZfZ2VtLmMg fCAgNSArKy0tLQo+ICBkcml2ZXJzL2dwdS9kcm0vZXRuYXZpdi9ldG5hdml2X2dlbS5oIHwgIDIg Ky0KPiAgZHJpdmVycy9ncHUvZHJtL2V0bmF2aXYvZXRuYXZpdl9ncHUuYyB8ICA0ICsrLS0KPiAg ZHJpdmVycy9ncHUvZHJtL2V0bmF2aXYvZXRuYXZpdl9ncHUuaCB8ICA0ICsrLS0KPiAgNiBmaWxl cyBjaGFuZ2VkLCAyNSBpbnNlcnRpb25zKCspLCAzMCBkZWxldGlvbnMoLSkKPiAKPiBkaWZmIC0t Z2l0IGEvZHJpdmVycy9ncHUvZHJtL2V0bmF2aXYvZXRuYXZpdl9kcnYuYyBiL2RyaXZlcnMvZ3B1 L2RybS9ldG5hdml2L2V0bmF2aXZfZHJ2LmMKPiBpbmRleCAxZjljMDFiZTQwZDcuLjEyNTBjNWUw NjMyOSAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vZXRuYXZpdi9ldG5hdml2X2Rydi5j Cj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2V0bmF2aXYvZXRuYXZpdl9kcnYuYwo+IEBAIC0yODIs MTYgKzI4MiwxMyBAQCBzdGF0aWMgaW50IGV0bmF2aXZfaW9jdGxfZ2VtX25ldyhzdHJ1Y3QgZHJt X2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAo+ICAJCQlhcmdzLT5mbGFncywgJmFyZ3MtPmhhbmRs ZSk7Cj4gIH0KPiAgCj4gLSNkZWZpbmUgVFModCkgKChzdHJ1Y3QgdGltZXNwZWMpeyBcCj4gLQku dHZfc2VjID0gKHQpLnR2X3NlYywgXAo+IC0JLnR2X25zZWMgPSAodCkudHZfbnNlYyBcCj4gLX0p Cj4gLQo+ICBzdGF0aWMgaW50IGV0bmF2aXZfaW9jdGxfZ2VtX2NwdV9wcmVwKHN0cnVjdCBkcm1f ZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCj4gIAkJc3RydWN0IGRybV9maWxlICpmaWxlKQo+ICB7 Cj4gIAlzdHJ1Y3QgZHJtX2V0bmF2aXZfZ2VtX2NwdV9wcmVwICphcmdzID0gZGF0YTsKPiAgCXN0 cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqOwo+ICsJa3RpbWVfdCB0aW1lb3V0ID0ga3RpbWVfc2V0 KGFyZ3MtPnRpbWVvdXQudHZfc2VjLAo+ICsJCQkJICAgIGFyZ3MtPnRpbWVvdXQudHZfbnNlYyk7 Cj4gIAlpbnQgcmV0Owo+ICAKPiAgCWlmIChhcmdzLT5vcCAmIH4oRVROQV9QUkVQX1JFQUQgfCBF VE5BX1BSRVBfV1JJVEUgfCBFVE5BX1BSRVBfTk9TWU5DKSkKPiBAQCAtMzAxLDcgKzI5OCw3IEBA IHN0YXRpYyBpbnQgZXRuYXZpdl9pb2N0bF9nZW1fY3B1X3ByZXAoc3RydWN0IGRybV9kZXZpY2Ug KmRldiwgdm9pZCAqZGF0YSwKPiAgCWlmICghb2JqKQo+ICAJCXJldHVybiAtRU5PRU5UOwo+ICAK PiAtCXJldCA9IGV0bmF2aXZfZ2VtX2NwdV9wcmVwKG9iaiwgYXJncy0+b3AsICZUUyhhcmdzLT50 aW1lb3V0KSk7Cj4gKwlyZXQgPSBldG5hdml2X2dlbV9jcHVfcHJlcChvYmosIGFyZ3MtPm9wLCB0 aW1lb3V0KTsKPiAgCj4gIAlkcm1fZ2VtX29iamVjdF9wdXRfdW5sb2NrZWQob2JqKTsKPiAgCj4g QEAgLTM1NCw3ICszNTEsOCBAQCBzdGF0aWMgaW50IGV0bmF2aXZfaW9jdGxfd2FpdF9mZW5jZShz dHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAo+ICB7Cj4gIAlzdHJ1Y3QgZHJtX2V0 bmF2aXZfd2FpdF9mZW5jZSAqYXJncyA9IGRhdGE7Cj4gIAlzdHJ1Y3QgZXRuYXZpdl9kcm1fcHJp dmF0ZSAqcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Cj4gLQlzdHJ1Y3QgdGltZXNwZWMgKnRpbWVv dXQgPSAmVFMoYXJncy0+dGltZW91dCk7Cj4gKwlrdGltZV90IHRpbWVvdXQgPSBrdGltZV9zZXQo YXJncy0+dGltZW91dC50dl9zZWMsCj4gKwkJCQkgICAgYXJncy0+dGltZW91dC50dl9uc2VjKTsK PiAgCXN0cnVjdCBldG5hdml2X2dwdSAqZ3B1Owo+ICAKPiAgCWlmIChhcmdzLT5mbGFncyAmIH4o RVROQV9XQUlUX05PTkJMT0NLKSkKPiBAQCAtMzY4LDcgKzM2Niw3IEBAIHN0YXRpYyBpbnQgZXRu YXZpdl9pb2N0bF93YWl0X2ZlbmNlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEs Cj4gIAkJcmV0dXJuIC1FTlhJTzsKPiAgCj4gIAlpZiAoYXJncy0+ZmxhZ3MgJiBFVE5BX1dBSVRf Tk9OQkxPQ0spCj4gLQkJdGltZW91dCA9IE5VTEw7Cj4gKwkJdGltZW91dCA9IGt0aW1lX3NldCgw LCAwKTsKClRoaXMgaXMgYSBjaGFuZ2UgaW4gYmVoYXZpb3IsIGFzIGZhciBhcyBJIGNhbiBzZWUu IEFmdGVyIHRoaXMgY2hhbmdlCnRoZSBjYWxsZWQgaW50ZXJuYWwgZnVuY3Rpb24gaXMgbm90IGFi bGUgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGEKTk9OQkxPQ0sgY2FsbCBhbmQgYSBibG9ja2lu ZyBjYWxsIHdpdGggMCB0aW1lb3V0LiBUaGUgZGlmZmVyZW5jZSBiZWluZwp0aGF0IG9uIGEgYnVz eSBvYmplY3QgdGhlIE5PTkJMT0NLIGNhbGwgd2lsbCByZXR1cm4gLUVCVVNZLCB3aGlsZSBhCmJs b2NraW5nIGNhbGwgd2lsbCByZXR1cm4gLUVUSU1FRE9VVC4KCkJ1dCB0aGVuIENMT0NLX01PTk9U T05JQyBzdGFydHMgYXQgMCBhbmQgc2hvdWxkIG5vdCBuZXZlciB3cmFwLCByaWdodD8KSWYgdGhh dCdzIHRoZSBjYXNlIHRoZW4gd2Ugc2hvdWxkIG5ldmVyIGVuY291bnRlciBhIGdlbnVpbmUgMCB0 aW1lb3V0CmFuZCB0aGlzIGNoYW5nZSB3b3VsZCBiZSBva2F5LgoKUmVnYXJkcywKTHVjYXMKPiAg Cj4gIAlyZXR1cm4gZXRuYXZpdl9ncHVfd2FpdF9mZW5jZV9pbnRlcnJ1cHRpYmxlKGdwdSwgYXJn cy0+ZmVuY2UsCj4gIAkJCQkJCSAgICB0aW1lb3V0KTsKPiBAQCAtNDAzLDcgKzQwMSw4IEBAIHN0 YXRpYyBpbnQgZXRuYXZpdl9pb2N0bF9nZW1fd2FpdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2 b2lkICpkYXRhLAo+ICB7Cj4gIAlzdHJ1Y3QgZXRuYXZpdl9kcm1fcHJpdmF0ZSAqcHJpdiA9IGRl di0+ZGV2X3ByaXZhdGU7Cj4gIAlzdHJ1Y3QgZHJtX2V0bmF2aXZfZ2VtX3dhaXQgKmFyZ3MgPSBk YXRhOwo+IC0Jc3RydWN0IHRpbWVzcGVjICp0aW1lb3V0ID0gJlRTKGFyZ3MtPnRpbWVvdXQpOwo+ ICsJa3RpbWVfdCB0aW1lb3V0ID0ga3RpbWVfc2V0KGFyZ3MtPnRpbWVvdXQudHZfc2VjLAo+ICsJ CQkJICAgIGFyZ3MtPnRpbWVvdXQudHZfbnNlYyk7Cj4gIAlzdHJ1Y3QgZHJtX2dlbV9vYmplY3Qg Km9iajsKPiAgCXN0cnVjdCBldG5hdml2X2dwdSAqZ3B1Owo+ICAJaW50IHJldDsKPiBAQCAtNDIz LDcgKzQyMiw3IEBAIHN0YXRpYyBpbnQgZXRuYXZpdl9pb2N0bF9nZW1fd2FpdChzdHJ1Y3QgZHJt X2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAo+ICAJCXJldHVybiAtRU5PRU5UOwo+ICAKPiAgCWlm IChhcmdzLT5mbGFncyAmIEVUTkFfV0FJVF9OT05CTE9DSykKPiAtCQl0aW1lb3V0ID0gTlVMTDsK PiArCQl0aW1lb3V0ID0ga3RpbWVfc2V0KDAsIDApOwo+ICAKPiAgCXJldCA9IGV0bmF2aXZfZ2Vt X3dhaXRfYm8oZ3B1LCBvYmosIHRpbWVvdXQpOwo+ICAKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9n cHUvZHJtL2V0bmF2aXYvZXRuYXZpdl9kcnYuaCBiL2RyaXZlcnMvZ3B1L2RybS9ldG5hdml2L2V0 bmF2aXZfZHJ2LmgKPiBpbmRleCAzMmNmYTVhNDhkNDIuLjU3YTRlMjQ3YmJjZiAxMDA2NDQKPiAt LS0gYS9kcml2ZXJzL2dwdS9kcm0vZXRuYXZpdi9ldG5hdml2X2Rydi5oCj4gKysrIGIvZHJpdmVy cy9ncHUvZHJtL2V0bmF2aXYvZXRuYXZpdl9kcnYuaAo+IEBAIC02MCw4ICs2MCw3IEBAIHN0cnVj dCBkcm1fZ2VtX29iamVjdCAqZXRuYXZpdl9nZW1fcHJpbWVfaW1wb3J0X3NnX3RhYmxlKHN0cnVj dCBkcm1fZGV2aWNlICpkZXYsCj4gIGludCBldG5hdml2X2dlbV9wcmltZV9waW4oc3RydWN0IGRy bV9nZW1fb2JqZWN0ICpvYmopOwo+ICB2b2lkIGV0bmF2aXZfZ2VtX3ByaW1lX3VucGluKHN0cnVj dCBkcm1fZ2VtX29iamVjdCAqb2JqKTsKPiAgdm9pZCAqZXRuYXZpdl9nZW1fdm1hcChzdHJ1Y3Qg ZHJtX2dlbV9vYmplY3QgKm9iaik7Cj4gLWludCBldG5hdml2X2dlbV9jcHVfcHJlcChzdHJ1Y3Qg ZHJtX2dlbV9vYmplY3QgKm9iaiwgdTMyIG9wLAo+IC0JCXN0cnVjdCB0aW1lc3BlYyAqdGltZW91 dCk7Cj4gK2ludCBldG5hdml2X2dlbV9jcHVfcHJlcChzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9i aiwgdTMyIG9wLCBrdGltZV90IHRpbWVvdXQpOwo+ICBpbnQgZXRuYXZpdl9nZW1fY3B1X2Zpbmko c3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopOwo+ICB2b2lkIGV0bmF2aXZfZ2VtX2ZyZWVfb2Jq ZWN0KHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqKTsKPiAgaW50IGV0bmF2aXZfZ2VtX25ld19o YW5kbGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9maWxlICpmaWxlLAo+IEBA IC0xMDYsMjIgKzEwNSwyMCBAQCBzdGF0aWMgaW5saW5lIHNpemVfdCBzaXplX3ZzdHJ1Y3Qoc2l6 ZV90IG5lbGVtLCBzaXplX3QgZWxlbV9zaXplLCBzaXplX3QgYmFzZSkKPiAgICogV2UgbmVlZCB0 byBjYWxjdWxhdGUgdGhlIHRpbWVvdXQgaW4gdGVybXMgb2YgbnVtYmVyIG9mIGppZmZpZXMKPiAg ICogYmV0d2VlbiB0aGUgc3BlY2lmaWVkIHRpbWVvdXQgYW5kIHRoZSBjdXJyZW50IENMT0NLX01P Tk9UT05JQyB0aW1lLgo+ICAgKi8KPiAtc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGV0bmF2 aXZfdGltZW91dF90b19qaWZmaWVzKAo+IC0JY29uc3Qgc3RydWN0IHRpbWVzcGVjICp0aW1lb3V0 KQo+ICtzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZXRuYXZpdl90aW1lb3V0X3RvX2ppZmZp ZXMoa3RpbWVfdCB0aW1lb3V0KQo+ICB7Cj4gLQlzdHJ1Y3QgdGltZXNwZWM2NCB0cywgdG87Cj4g LQo+IC0JdG8gPSB0aW1lc3BlY190b190aW1lc3BlYzY0KCp0aW1lb3V0KTsKPiAtCj4gLQlrdGlt ZV9nZXRfdHM2NCgmdHMpOwo+ICsJczY0IHJlbWFpbiA9IGt0aW1lX3RvX25zKGt0aW1lX3N1Yih0 aW1lb3V0LCBrdGltZV9nZXQoKSkpOwo+ICAKPiAgCS8qIHRpbWVvdXRzIGJlZm9yZSAibm93IiBo YXZlIGFscmVhZHkgZXhwaXJlZCAqLwo+IC0JaWYgKHRpbWVzcGVjNjRfY29tcGFyZSgmdG8sICZ0 cykgPD0gMCkKPiArCWlmIChyZW1haW4gPCAwKQo+ICAJCXJldHVybiAwOwo+ICAKPiAtCXRzID0g dGltZXNwZWM2NF9zdWIodG8sIHRzKTsKPiArI2lmbmRlZiBDT05GSUdfNjRCSVQKPiArCWlmIChy ZW1haW4gPiAoKHM2NClNQVhfSklGRllfT0ZGU0VUICogTlNFQ19QRVJfU0VDIC8gSFopKQo+ICsJ CXJldHVybiBNQVhfSklGRllfT0ZGU0VUOwo+ICsjZW5kaWYKPiAgCj4gLQlyZXR1cm4gdGltZXNw ZWM2NF90b19qaWZmaWVzKCZ0cyk7Cj4gKwlyZXR1cm4gbnNlY3NfdG9famlmZmllcyhyZW1haW4p Owo+ICB9Cj4gIAo+ICAjZW5kaWYgLyogX19FVE5BVklWX0RSVl9IX18gKi8KPiBkaWZmIC0tZ2l0 IGEvZHJpdmVycy9ncHUvZHJtL2V0bmF2aXYvZXRuYXZpdl9nZW0uYyBiL2RyaXZlcnMvZ3B1L2Ry bS9ldG5hdml2L2V0bmF2aXZfZ2VtLmMKPiBpbmRleCBjYjFmYWFhYzM4MGEuLmZlYmU1MTk2Nzg4 ZSAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vZXRuYXZpdi9ldG5hdml2X2dlbS5jCj4g KysrIGIvZHJpdmVycy9ncHUvZHJtL2V0bmF2aXYvZXRuYXZpdl9nZW0uYwo+IEBAIC0zNzIsOCAr MzcyLDcgQEAgc3RhdGljIGlubGluZSBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBldG5hdml2X29w X3RvX2RtYV9kaXIodTMyIG9wKQo+ICAJCXJldHVybiBETUFfQklESVJFQ1RJT05BTDsKPiAgfQo+ ICAKPiAtaW50IGV0bmF2aXZfZ2VtX2NwdV9wcmVwKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2Jq LCB1MzIgb3AsCj4gLQkJc3RydWN0IHRpbWVzcGVjICp0aW1lb3V0KQo+ICtpbnQgZXRuYXZpdl9n ZW1fY3B1X3ByZXAoc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmosIHUzMiBvcCwga3RpbWVfdCB0 aW1lb3V0KQo+ICB7Cj4gIAlzdHJ1Y3QgZXRuYXZpdl9nZW1fb2JqZWN0ICpldG5hdml2X29iaiA9 IHRvX2V0bmF2aXZfYm8ob2JqKTsKPiAgCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBvYmotPmRl djsKPiBAQCAtNDMxLDcgKzQzMCw3IEBAIGludCBldG5hdml2X2dlbV9jcHVfZmluaShzdHJ1Y3Qg ZHJtX2dlbV9vYmplY3QgKm9iaikKPiAgfQo+ICAKPiAgaW50IGV0bmF2aXZfZ2VtX3dhaXRfYm8o c3RydWN0IGV0bmF2aXZfZ3B1ICpncHUsIHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqLAo+IC0J c3RydWN0IHRpbWVzcGVjICp0aW1lb3V0KQo+ICsJCQlrdGltZV90IHRpbWVvdXQpCj4gIHsKPiAg CXN0cnVjdCBldG5hdml2X2dlbV9vYmplY3QgKmV0bmF2aXZfb2JqID0gdG9fZXRuYXZpdl9ibyhv YmopOwo+ICAKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2V0bmF2aXYvZXRuYXZpdl9n ZW0uaCBiL2RyaXZlcnMvZ3B1L2RybS9ldG5hdml2L2V0bmF2aXZfZ2VtLmgKPiBpbmRleCBkNjI3 MGFjY2U2MTkuLmEzNDYxYTU1NGE2YyAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vZXRu YXZpdi9ldG5hdml2X2dlbS5oCj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2V0bmF2aXYvZXRuYXZp dl9nZW0uaAo+IEBAIC0xMTIsNyArMTEyLDcgQEAgc3RydWN0IGV0bmF2aXZfZ2VtX3N1Ym1pdCB7 Cj4gIHZvaWQgZXRuYXZpdl9zdWJtaXRfcHV0KHN0cnVjdCBldG5hdml2X2dlbV9zdWJtaXQgKiBz dWJtaXQpOwo+ICAKPiAgaW50IGV0bmF2aXZfZ2VtX3dhaXRfYm8oc3RydWN0IGV0bmF2aXZfZ3B1 ICpncHUsIHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqLAo+IC0Jc3RydWN0IHRpbWVzcGVjICp0 aW1lb3V0KTsKPiArCWt0aW1lX3QgdGltZW91dCk7Cj4gIGludCBldG5hdml2X2dlbV9uZXdfcHJp dmF0ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwgdTMyIGZsYWdzLAo+ICAJ Y29uc3Qgc3RydWN0IGV0bmF2aXZfZ2VtX29wcyAqb3BzLCBzdHJ1Y3QgZXRuYXZpdl9nZW1fb2Jq ZWN0ICoqcmVzKTsKPiAgdm9pZCBldG5hdml2X2dlbV9vYmpfYWRkKHN0cnVjdCBkcm1fZGV2aWNl ICpkZXYsIHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqKTsKPiBkaWZmIC0tZ2l0IGEvZHJpdmVy cy9ncHUvZHJtL2V0bmF2aXYvZXRuYXZpdl9ncHUuYyBiL2RyaXZlcnMvZ3B1L2RybS9ldG5hdml2 L2V0bmF2aXZfZ3B1LmMKPiBpbmRleCBkNDdkMWE4ZTAyMTkuLmU0MmIxYzRkOTAyYyAxMDA2NDQK PiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vZXRuYXZpdi9ldG5hdml2X2dwdS5jCj4gKysrIGIvZHJp dmVycy9ncHUvZHJtL2V0bmF2aXYvZXRuYXZpdl9ncHUuYwo+IEBAIC0xMTMyLDcgKzExMzIsNyBA QCBzdGF0aWMgdm9pZCBldmVudF9mcmVlKHN0cnVjdCBldG5hdml2X2dwdSAqZ3B1LCB1bnNpZ25l ZCBpbnQgZXZlbnQpCj4gICAqIENtZHN0cmVhbSBzdWJtaXNzaW9uL3JldGlyZW1lbnQ6Cj4gICAq Lwo+ICBpbnQgZXRuYXZpdl9ncHVfd2FpdF9mZW5jZV9pbnRlcnJ1cHRpYmxlKHN0cnVjdCBldG5h dml2X2dwdSAqZ3B1LAo+IC0JdTMyIGlkLCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVvdXQpCj4gKwl1 MzIgaWQsIGt0aW1lX3QgdGltZW91dCkKPiAgewo+ICAJc3RydWN0IGRtYV9mZW5jZSAqZmVuY2U7 Cj4gIAlpbnQgcmV0Owo+IEBAIC0xMTc5LDcgKzExNzksNyBAQCBpbnQgZXRuYXZpdl9ncHVfd2Fp dF9mZW5jZV9pbnRlcnJ1cHRpYmxlKHN0cnVjdCBldG5hdml2X2dwdSAqZ3B1LAo+ICAgKiB0aGF0 IGxvY2sgaW4gdGhpcyBmdW5jdGlvbiB3aGlsZSB3YWl0aW5nLgo+ICAgKi8KPiAgaW50IGV0bmF2 aXZfZ3B1X3dhaXRfb2JqX2luYWN0aXZlKHN0cnVjdCBldG5hdml2X2dwdSAqZ3B1LAo+IC0Jc3Ry dWN0IGV0bmF2aXZfZ2VtX29iamVjdCAqZXRuYXZpdl9vYmosIHN0cnVjdCB0aW1lc3BlYyAqdGlt ZW91dCkKPiArCXN0cnVjdCBldG5hdml2X2dlbV9vYmplY3QgKmV0bmF2aXZfb2JqLCBrdGltZV90 IHRpbWVvdXQpCj4gIHsKPiAgCXVuc2lnbmVkIGxvbmcgcmVtYWluaW5nOwo+ICAJbG9uZyByZXQ7 Cj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ldG5hdml2L2V0bmF2aXZfZ3B1LmggYi9k cml2ZXJzL2dwdS9kcm0vZXRuYXZpdi9ldG5hdml2X2dwdS5oCj4gaW5kZXggOGY5YmQ0ZWRjOTZh Li42ZDM1MmE0MzU0MjcgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL2V0bmF2aXYvZXRu YXZpdl9ncHUuaAo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9ldG5hdml2L2V0bmF2aXZfZ3B1LmgK PiBAQCAtMTY5LDkgKzE2OSw5IEBAIGludCBldG5hdml2X2dwdV9kZWJ1Z2ZzKHN0cnVjdCBldG5h dml2X2dwdSAqZ3B1LCBzdHJ1Y3Qgc2VxX2ZpbGUgKm0pOwo+ICB2b2lkIGV0bmF2aXZfZ3B1X3Jl Y292ZXJfaGFuZyhzdHJ1Y3QgZXRuYXZpdl9ncHUgKmdwdSk7Cj4gIHZvaWQgZXRuYXZpdl9ncHVf cmV0aXJlKHN0cnVjdCBldG5hdml2X2dwdSAqZ3B1KTsKPiAgaW50IGV0bmF2aXZfZ3B1X3dhaXRf ZmVuY2VfaW50ZXJydXB0aWJsZShzdHJ1Y3QgZXRuYXZpdl9ncHUgKmdwdSwKPiAtCXUzMiBmZW5j ZSwgc3RydWN0IHRpbWVzcGVjICp0aW1lb3V0KTsKPiArCXUzMiBmZW5jZSwga3RpbWVfdCB0aW1l b3V0KTsKPiAgaW50IGV0bmF2aXZfZ3B1X3dhaXRfb2JqX2luYWN0aXZlKHN0cnVjdCBldG5hdml2 X2dwdSAqZ3B1LAo+IC0Jc3RydWN0IGV0bmF2aXZfZ2VtX29iamVjdCAqZXRuYXZpdl9vYmosIHN0 cnVjdCB0aW1lc3BlYyAqdGltZW91dCk7Cj4gKwlzdHJ1Y3QgZXRuYXZpdl9nZW1fb2JqZWN0ICpl dG5hdml2X29iaiwga3RpbWVfdCB0aW1lb3V0KTsKPiAgc3RydWN0IGRtYV9mZW5jZSAqZXRuYXZp dl9ncHVfc3VibWl0KHN0cnVjdCBldG5hdml2X2dlbV9zdWJtaXQgKnN1Ym1pdCk7Cj4gIGludCBl dG5hdml2X2dwdV9wbV9nZXRfc3luYyhzdHJ1Y3QgZXRuYXZpdl9ncHUgKmdwdSk7Cj4gIHZvaWQg ZXRuYXZpdl9ncHVfcG1fcHV0KHN0cnVjdCBldG5hdml2X2dwdSAqZ3B1KTsKCl9fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmRyaS1kZXZlbCBtYWlsaW5nIGxp c3QKZHJpLWRldmVsQGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNr dG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2RyaS1kZXZlbA==