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=-17.5 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,NICE_REPLY_A, SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_SANE_1 autolearn=unavailable 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 4149FC2B9F4 for ; Tue, 22 Jun 2021 05:07:09 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 15AFA611BF for ; Tue, 22 Jun 2021 05:07:09 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229775AbhFVFJT (ORCPT ); Tue, 22 Jun 2021 01:09:19 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]:52748 "EHLO us-smtp-delivery-124.mimecast.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229831AbhFVFJR (ORCPT ); Tue, 22 Jun 2021 01:09:17 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1624338421; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=2ZRIfQ1z1aTm2SnHKEOxbV1hbgwf/o+AvND1awWYHYY=; b=ZTzfOpQwMiLb8S4qTVmBXn4Qjam6reytn9Gh6S10R1JtQaX6qr+tjYnwQ8PintMmp8hZTN xdch5DyakJ/90Wm//nVT8VBoAaQ5nZMVKqPH7VcrVgt+Q7cF6Vo8CMmxIRA2vdRLafBPw3 nDqJFNgDcC0XWqbsl8btA3XW/UEXjCs= Received: from mail-pf1-f197.google.com (mail-pf1-f197.google.com [209.85.210.197]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-264-rRcnJ9bMNFGKpMk0O2iZrg-1; Tue, 22 Jun 2021 01:06:59 -0400 X-MC-Unique: rRcnJ9bMNFGKpMk0O2iZrg-1 Received: by mail-pf1-f197.google.com with SMTP id s13-20020a056a00194db02902ed97b465c2so838138pfk.17 for ; Mon, 21 Jun 2021 22:06:59 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:to:cc:references:from:message-id:date :user-agent:mime-version:in-reply-to:content-transfer-encoding :content-language; bh=2ZRIfQ1z1aTm2SnHKEOxbV1hbgwf/o+AvND1awWYHYY=; b=IrJIJmO8iS/OQ02qsJVhZ5pU5isSmG3pgQURQq7Nk6pDLu3inPqJnY2MTp2MPk9b0m blHAlJW/10Ehlxaz1Yw62X9zz5NDlZL57RQZlQW9Mriqf/F/fhkxsZfMcaHG0jMba49+ vVNf88ERrkADk4vCKRjv9NbJSBk70zDb0PtGZcjVEm4jKyCoyFMGR/ii7PTfndURhtGJ pRAL6GTEg/IVc2MxQ+uIgUxfx8Vi3FQPpSfNTkvxK7dVv9fOqM20YjiJJkHgNbbBHj21 DIFWSIYBRyOzYm62dLrniegDEP9h2SaWddzYT+jY8Eagcx6w+eDQ8TdEteuq+op57xEk 4WSg== X-Gm-Message-State: AOAM532+KU4VxHF6xxSO8xLtjyUSe9GVV3hBJyfluzc3lBibFxbquddH ZVPdE9iV8FJ+rs82xI60Cgct1aC+PqgjoRFzCXSde5e/tTjuQOZgdIYyVsZvyk31IuN2Ct+7uc2 TalB/M+k61kACqiNgYS7IqF7QyHWdeLzEmlDWxS/9uuM3l5k6+faJH71TLWkEkz8DBqFu131USG zx X-Received: by 2002:a17:90a:1e82:: with SMTP id x2mr2029057pjx.11.1624338417793; Mon, 21 Jun 2021 22:06:57 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxWu7VJ1i8Hm/0dONPfTSH47PWWl51Y2auxRuPrZ3RZO7RXMkuwV8jx9BpjNZsql8zLcMnEfA== X-Received: by 2002:a17:90a:1e82:: with SMTP id x2mr2028995pjx.11.1624338417189; Mon, 21 Jun 2021 22:06:57 -0700 (PDT) Received: from wangxiaodeMacBook-Air.local ([209.132.188.80]) by smtp.gmail.com with ESMTPSA id q24sm18650112pgk.32.2021.06.21.22.06.49 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Mon, 21 Jun 2021 22:06:56 -0700 (PDT) Subject: Re: [PATCH v8 09/10] vduse: Introduce VDUSE - vDPA Device in Userspace To: Yongji Xie Cc: "Michael S. Tsirkin" , Stefan Hajnoczi , Stefano Garzarella , Parav Pandit , Christoph Hellwig , Christian Brauner , Randy Dunlap , Matthew Wilcox , Al Viro , Jens Axboe , bcrl@kvack.org, Jonathan Corbet , =?UTF-8?Q?Mika_Penttil=c3=a4?= , Dan Carpenter , joro@8bytes.org, Greg KH , songmuchun@bytedance.com, virtualization , netdev@vger.kernel.org, kvm , linux-fsdevel@vger.kernel.org, iommu@lists.linux-foundation.org, linux-kernel References: <20210615141331.407-1-xieyongji@bytedance.com> <20210615141331.407-10-xieyongji@bytedance.com> From: Jason Wang Message-ID: <1bba439f-ffc8-c20e-e8a4-ac73e890c592@redhat.com> Date: Tue, 22 Jun 2021 13:06:42 +0800 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:78.0) Gecko/20100101 Thunderbird/78.11.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit Content-Language: en-US Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 在 2021/6/21 下午6:41, Yongji Xie 写道: > On Mon, Jun 21, 2021 at 5:14 PM Jason Wang wrote: >> >> 在 2021/6/15 下午10:13, Xie Yongji 写道: >>> This VDUSE driver enables implementing vDPA devices in userspace. >>> The vDPA device's control path is handled in kernel and the data >>> path is handled in userspace. >>> >>> A message mechnism is used by VDUSE driver to forward some control >>> messages such as starting/stopping datapath to userspace. Userspace >>> can use read()/write() to receive/reply those control messages. >>> >>> And some ioctls are introduced to help userspace to implement the >>> data path. VDUSE_IOTLB_GET_FD ioctl can be used to get the file >>> descriptors referring to vDPA device's iova regions. Then userspace >>> can use mmap() to access those iova regions. VDUSE_DEV_GET_FEATURES >>> and VDUSE_VQ_GET_INFO ioctls are used to get the negotiated features >>> and metadata of virtqueues. VDUSE_INJECT_VQ_IRQ and VDUSE_VQ_SETUP_KICKFD >>> ioctls can be used to inject interrupt and setup the kickfd for >>> virtqueues. VDUSE_DEV_UPDATE_CONFIG ioctl is used to update the >>> configuration space and inject a config interrupt. >>> >>> Signed-off-by: Xie Yongji >>> --- >>> Documentation/userspace-api/ioctl/ioctl-number.rst | 1 + >>> drivers/vdpa/Kconfig | 10 + >>> drivers/vdpa/Makefile | 1 + >>> drivers/vdpa/vdpa_user/Makefile | 5 + >>> drivers/vdpa/vdpa_user/vduse_dev.c | 1453 ++++++++++++++++++++ >>> include/uapi/linux/vduse.h | 143 ++ >>> 6 files changed, 1613 insertions(+) >>> create mode 100644 drivers/vdpa/vdpa_user/Makefile >>> create mode 100644 drivers/vdpa/vdpa_user/vduse_dev.c >>> create mode 100644 include/uapi/linux/vduse.h >>> >>> diff --git a/Documentation/userspace-api/ioctl/ioctl-number.rst b/Documentation/userspace-api/ioctl/ioctl-number.rst >>> index 9bfc2b510c64..acd95e9dcfe7 100644 >>> --- a/Documentation/userspace-api/ioctl/ioctl-number.rst >>> +++ b/Documentation/userspace-api/ioctl/ioctl-number.rst >>> @@ -300,6 +300,7 @@ Code Seq# Include File Comments >>> 'z' 10-4F drivers/s390/crypto/zcrypt_api.h conflict! >>> '|' 00-7F linux/media.h >>> 0x80 00-1F linux/fb.h >>> +0x81 00-1F linux/vduse.h >>> 0x89 00-06 arch/x86/include/asm/sockios.h >>> 0x89 0B-DF linux/sockios.h >>> 0x89 E0-EF linux/sockios.h SIOCPROTOPRIVATE range >>> diff --git a/drivers/vdpa/Kconfig b/drivers/vdpa/Kconfig >>> index a503c1b2bfd9..6e23bce6433a 100644 >>> --- a/drivers/vdpa/Kconfig >>> +++ b/drivers/vdpa/Kconfig >>> @@ -33,6 +33,16 @@ config VDPA_SIM_BLOCK >>> vDPA block device simulator which terminates IO request in a >>> memory buffer. >>> >>> +config VDPA_USER >>> + tristate "VDUSE (vDPA Device in Userspace) support" >>> + depends on EVENTFD && MMU && HAS_DMA >>> + select DMA_OPS >>> + select VHOST_IOTLB >>> + select IOMMU_IOVA >>> + help >>> + With VDUSE it is possible to emulate a vDPA Device >>> + in a userspace program. >>> + >>> config IFCVF >>> tristate "Intel IFC VF vDPA driver" >>> depends on PCI_MSI >>> diff --git a/drivers/vdpa/Makefile b/drivers/vdpa/Makefile >>> index 67fe7f3d6943..f02ebed33f19 100644 >>> --- a/drivers/vdpa/Makefile >>> +++ b/drivers/vdpa/Makefile >>> @@ -1,6 +1,7 @@ >>> # SPDX-License-Identifier: GPL-2.0 >>> obj-$(CONFIG_VDPA) += vdpa.o >>> obj-$(CONFIG_VDPA_SIM) += vdpa_sim/ >>> +obj-$(CONFIG_VDPA_USER) += vdpa_user/ >>> obj-$(CONFIG_IFCVF) += ifcvf/ >>> obj-$(CONFIG_MLX5_VDPA) += mlx5/ >>> obj-$(CONFIG_VP_VDPA) += virtio_pci/ >>> diff --git a/drivers/vdpa/vdpa_user/Makefile b/drivers/vdpa/vdpa_user/Makefile >>> new file mode 100644 >>> index 000000000000..260e0b26af99 >>> --- /dev/null >>> +++ b/drivers/vdpa/vdpa_user/Makefile >>> @@ -0,0 +1,5 @@ >>> +# SPDX-License-Identifier: GPL-2.0 >>> + >>> +vduse-y := vduse_dev.o iova_domain.o >>> + >>> +obj-$(CONFIG_VDPA_USER) += vduse.o >>> diff --git a/drivers/vdpa/vdpa_user/vduse_dev.c b/drivers/vdpa/vdpa_user/vduse_dev.c >>> new file mode 100644 >>> index 000000000000..5271cbd15e28 >>> --- /dev/null >>> +++ b/drivers/vdpa/vdpa_user/vduse_dev.c >>> @@ -0,0 +1,1453 @@ >>> +// SPDX-License-Identifier: GPL-2.0-only >>> +/* >>> + * VDUSE: vDPA Device in Userspace >>> + * >>> + * Copyright (C) 2020-2021 Bytedance Inc. and/or its affiliates. All rights reserved. >>> + * >>> + * Author: Xie Yongji >>> + * >>> + */ >>> + >>> +#include >>> +#include >>> +#include >>> +#include >>> +#include >>> +#include >>> +#include >>> +#include >>> +#include >>> +#include >>> +#include >>> +#include >>> +#include >>> +#include >>> +#include >>> +#include >>> +#include >>> +#include >>> +#include >>> + >>> +#include "iova_domain.h" >>> + >>> +#define DRV_AUTHOR "Yongji Xie " >>> +#define DRV_DESC "vDPA Device in Userspace" >>> +#define DRV_LICENSE "GPL v2" >>> + >>> +#define VDUSE_DEV_MAX (1U << MINORBITS) >>> +#define VDUSE_MAX_BOUNCE_SIZE (64 * 1024 * 1024) >>> +#define VDUSE_IOVA_SIZE (128 * 1024 * 1024) >>> +#define VDUSE_REQUEST_TIMEOUT 30 >>> + >>> +struct vduse_virtqueue { >>> + u16 index; >>> + u32 num; >>> + u32 avail_idx; >>> + u64 desc_addr; >>> + u64 driver_addr; >>> + u64 device_addr; >>> + bool ready; >>> + bool kicked; >>> + spinlock_t kick_lock; >>> + spinlock_t irq_lock; >>> + struct eventfd_ctx *kickfd; >>> + struct vdpa_callback cb; >>> + struct work_struct inject; >>> +}; >>> + >>> +struct vduse_dev; >>> + >>> +struct vduse_vdpa { >>> + struct vdpa_device vdpa; >>> + struct vduse_dev *dev; >>> +}; >>> + >>> +struct vduse_dev { >>> + struct vduse_vdpa *vdev; >>> + struct device *dev; >>> + struct vduse_virtqueue *vqs; >>> + struct vduse_iova_domain *domain; >>> + char *name; >>> + struct mutex lock; >>> + spinlock_t msg_lock; >>> + u64 msg_unique; >>> + wait_queue_head_t waitq; >>> + struct list_head send_list; >>> + struct list_head recv_list; >>> + struct vdpa_callback config_cb; >>> + struct work_struct inject; >>> + spinlock_t irq_lock; >>> + int minor; >>> + bool connected; >>> + bool started; >>> + u64 api_version; >>> + u64 user_features; >> >> Let's use device_features. >> > OK. > >>> + u64 features; >> >> And driver features. >> > OK. > >>> + u32 device_id; >>> + u32 vendor_id; >>> + u32 generation; >>> + u32 config_size; >>> + void *config; >>> + u8 status; >>> + u16 vq_size_max; >>> + u32 vq_num; >>> + u32 vq_align; >>> +}; >>> + >>> +struct vduse_dev_msg { >>> + struct vduse_dev_request req; >>> + struct vduse_dev_response resp; >>> + struct list_head list; >>> + wait_queue_head_t waitq; >>> + bool completed; >>> +}; >>> + >>> +struct vduse_control { >>> + u64 api_version; >>> +}; >>> + >>> +static DEFINE_MUTEX(vduse_lock); >>> +static DEFINE_IDR(vduse_idr); >>> + >>> +static dev_t vduse_major; >>> +static struct class *vduse_class; >>> +static struct cdev vduse_ctrl_cdev; >>> +static struct cdev vduse_cdev; >>> +static struct workqueue_struct *vduse_irq_wq; >>> + >>> +static u32 allowed_device_id[] = { >>> + VIRTIO_ID_BLOCK, >>> +}; >>> + >>> +static inline struct vduse_dev *vdpa_to_vduse(struct vdpa_device *vdpa) >>> +{ >>> + struct vduse_vdpa *vdev = container_of(vdpa, struct vduse_vdpa, vdpa); >>> + >>> + return vdev->dev; >>> +} >>> + >>> +static inline struct vduse_dev *dev_to_vduse(struct device *dev) >>> +{ >>> + struct vdpa_device *vdpa = dev_to_vdpa(dev); >>> + >>> + return vdpa_to_vduse(vdpa); >>> +} >>> + >>> +static struct vduse_dev_msg *vduse_find_msg(struct list_head *head, >>> + uint32_t request_id) >>> +{ >>> + struct vduse_dev_msg *msg; >>> + >>> + list_for_each_entry(msg, head, list) { >>> + if (msg->req.request_id == request_id) { >>> + list_del(&msg->list); >>> + return msg; >>> + } >>> + } >>> + >>> + return NULL; >>> +} >>> + >>> +static struct vduse_dev_msg *vduse_dequeue_msg(struct list_head *head) >>> +{ >>> + struct vduse_dev_msg *msg = NULL; >>> + >>> + if (!list_empty(head)) { >>> + msg = list_first_entry(head, struct vduse_dev_msg, list); >>> + list_del(&msg->list); >>> + } >>> + >>> + return msg; >>> +} >>> + >>> +static void vduse_enqueue_msg(struct list_head *head, >>> + struct vduse_dev_msg *msg) >>> +{ >>> + list_add_tail(&msg->list, head); >>> +} >>> + >>> +static int vduse_dev_msg_send(struct vduse_dev *dev, >>> + struct vduse_dev_msg *msg, bool no_reply) >>> +{ >> >> It looks to me the only user for no_reply=true is the dataplane start. I >> wonder no_reply is really needed consider we have switched to use >> wait_event_killable_timeout(). >> > Do we need to handle the error in this case if we remove the no_reply > flag. Print a warning message? See below. > >> In another way, no_reply is false for vq state synchronization and IOTLB >> updating. I wonder if we can simply use no_reply = true for them. >> > Looks like we can't, e.g. we need to get a reply from userspace for vq state. Right. > >>> + init_waitqueue_head(&msg->waitq); >>> + spin_lock(&dev->msg_lock); >>> + msg->req.request_id = dev->msg_unique++; >>> + vduse_enqueue_msg(&dev->send_list, msg); >>> + wake_up(&dev->waitq); >>> + spin_unlock(&dev->msg_lock); >>> + if (no_reply) >>> + return 0; >>> + >>> + wait_event_killable_timeout(msg->waitq, msg->completed, >>> + VDUSE_REQUEST_TIMEOUT * HZ); >>> + spin_lock(&dev->msg_lock); >>> + if (!msg->completed) { >>> + list_del(&msg->list); >>> + msg->resp.result = VDUSE_REQ_RESULT_FAILED; >>> + } >>> + spin_unlock(&dev->msg_lock); >>> + >>> + return (msg->resp.result == VDUSE_REQ_RESULT_OK) ? 0 : -EIO; >> >> Do we need to serialize the check by protecting it with the spinlock above? >> > Good point. > >>> +} >>> + >>> +static void vduse_dev_msg_cleanup(struct vduse_dev *dev) >>> +{ >>> + struct vduse_dev_msg *msg; >>> + >>> + spin_lock(&dev->msg_lock); >>> + while ((msg = vduse_dequeue_msg(&dev->send_list))) { >>> + if (msg->req.flags & VDUSE_REQ_FLAGS_NO_REPLY) >>> + kfree(msg); >>> + else >>> + vduse_enqueue_msg(&dev->recv_list, msg); >>> + } >>> + while ((msg = vduse_dequeue_msg(&dev->recv_list))) { >>> + msg->resp.result = VDUSE_REQ_RESULT_FAILED; >>> + msg->completed = 1; >>> + wake_up(&msg->waitq); >>> + } >>> + spin_unlock(&dev->msg_lock); >>> +} >>> + >>> +static void vduse_dev_start_dataplane(struct vduse_dev *dev) >>> +{ >>> + struct vduse_dev_msg *msg = kzalloc(sizeof(*msg), >>> + GFP_KERNEL | __GFP_NOFAIL); >>> + >>> + msg->req.type = VDUSE_START_DATAPLANE; >>> + msg->req.flags |= VDUSE_REQ_FLAGS_NO_REPLY; >>> + vduse_dev_msg_send(dev, msg, true); >>> +} >>> + >>> +static void vduse_dev_stop_dataplane(struct vduse_dev *dev) >>> +{ >>> + struct vduse_dev_msg *msg = kzalloc(sizeof(*msg), >>> + GFP_KERNEL | __GFP_NOFAIL); >>> + >>> + msg->req.type = VDUSE_STOP_DATAPLANE; >>> + msg->req.flags |= VDUSE_REQ_FLAGS_NO_REPLY; >> >> Can we simply use this flag instead of introducing a new parameter >> (no_reply) in vduse_dev_msg_send()? >> > Looks good to me. > >>> + vduse_dev_msg_send(dev, msg, true); >>> +} >>> + >>> +static int vduse_dev_get_vq_state(struct vduse_dev *dev, >>> + struct vduse_virtqueue *vq, >>> + struct vdpa_vq_state *state) >>> +{ >>> + struct vduse_dev_msg msg = { 0 }; >>> + int ret; >> >> Note that I post a series that implement the packed virtqueue support: >> >> https://lists.linuxfoundation.org/pipermail/virtualization/2021-June/054501.html >> >> So this patch needs to be updated as well. >> > Will do it. > >>> + >>> + msg.req.type = VDUSE_GET_VQ_STATE; >>> + msg.req.vq_state.index = vq->index; >>> + >>> + ret = vduse_dev_msg_send(dev, &msg, false); >>> + if (ret) >>> + return ret; >>> + >>> + state->avail_index = msg.resp.vq_state.avail_idx; >>> + return 0; >>> +} >>> + >>> +static int vduse_dev_update_iotlb(struct vduse_dev *dev, >>> + u64 start, u64 last) >>> +{ >>> + struct vduse_dev_msg msg = { 0 }; >>> + >>> + if (last < start) >>> + return -EINVAL; >>> + >>> + msg.req.type = VDUSE_UPDATE_IOTLB; >>> + msg.req.iova.start = start; >>> + msg.req.iova.last = last; >>> + >>> + return vduse_dev_msg_send(dev, &msg, false); >>> +} >>> + >>> +static ssize_t vduse_dev_read_iter(struct kiocb *iocb, struct iov_iter *to) >>> +{ >>> + struct file *file = iocb->ki_filp; >>> + struct vduse_dev *dev = file->private_data; >>> + struct vduse_dev_msg *msg; >>> + int size = sizeof(struct vduse_dev_request); >>> + ssize_t ret; >>> + >>> + if (iov_iter_count(to) < size) >>> + return -EINVAL; >>> + >>> + spin_lock(&dev->msg_lock); >>> + while (1) { >>> + msg = vduse_dequeue_msg(&dev->send_list); >>> + if (msg) >>> + break; >>> + >>> + ret = -EAGAIN; >>> + if (file->f_flags & O_NONBLOCK) >>> + goto unlock; >>> + >>> + spin_unlock(&dev->msg_lock); >>> + ret = wait_event_interruptible_exclusive(dev->waitq, >>> + !list_empty(&dev->send_list)); >>> + if (ret) >>> + return ret; >>> + >>> + spin_lock(&dev->msg_lock); >>> + } >>> + spin_unlock(&dev->msg_lock); >>> + ret = copy_to_iter(&msg->req, size, to); >>> + spin_lock(&dev->msg_lock); >>> + if (ret != size) { >>> + ret = -EFAULT; >>> + vduse_enqueue_msg(&dev->send_list, msg); >>> + goto unlock; >>> + } >>> + if (msg->req.flags & VDUSE_REQ_FLAGS_NO_REPLY) >>> + kfree(msg); >>> + else >>> + vduse_enqueue_msg(&dev->recv_list, msg); >>> +unlock: >>> + spin_unlock(&dev->msg_lock); >>> + >>> + return ret; >>> +} >>> + >>> +static ssize_t vduse_dev_write_iter(struct kiocb *iocb, struct iov_iter *from) >>> +{ >>> + struct file *file = iocb->ki_filp; >>> + struct vduse_dev *dev = file->private_data; >>> + struct vduse_dev_response resp; >>> + struct vduse_dev_msg *msg; >>> + size_t ret; >>> + >>> + ret = copy_from_iter(&resp, sizeof(resp), from); >>> + if (ret != sizeof(resp)) >>> + return -EINVAL; >>> + >>> + spin_lock(&dev->msg_lock); >>> + msg = vduse_find_msg(&dev->recv_list, resp.request_id); >>> + if (!msg) { >>> + ret = -ENOENT; >>> + goto unlock; >>> + } >>> + >>> + memcpy(&msg->resp, &resp, sizeof(resp)); >>> + msg->completed = 1; >>> + wake_up(&msg->waitq); >>> +unlock: >>> + spin_unlock(&dev->msg_lock); >>> + >>> + return ret; >>> +} >>> + >>> +static __poll_t vduse_dev_poll(struct file *file, poll_table *wait) >>> +{ >>> + struct vduse_dev *dev = file->private_data; >>> + __poll_t mask = 0; >>> + >>> + poll_wait(file, &dev->waitq, wait); >>> + >>> + if (!list_empty(&dev->send_list)) >>> + mask |= EPOLLIN | EPOLLRDNORM; >>> + if (!list_empty(&dev->recv_list)) >>> + mask |= EPOLLOUT | EPOLLWRNORM; >>> + >>> + return mask; >>> +} >>> + >>> +static void vduse_dev_reset(struct vduse_dev *dev) >>> +{ >>> + int i; >>> + struct vduse_iova_domain *domain = dev->domain; >>> + >>> + /* The coherent mappings are handled in vduse_dev_free_coherent() */ >>> + if (domain->bounce_map) >>> + vduse_domain_reset_bounce_map(domain); >>> + >>> + dev->features = 0; >>> + dev->generation++; >>> + spin_lock(&dev->irq_lock); >>> + dev->config_cb.callback = NULL; >>> + dev->config_cb.private = NULL; >>> + spin_unlock(&dev->irq_lock); >>> + >>> + for (i = 0; i < dev->vq_num; i++) { >>> + struct vduse_virtqueue *vq = &dev->vqs[i]; >>> + >>> + vq->ready = false; >>> + vq->desc_addr = 0; >>> + vq->driver_addr = 0; >>> + vq->device_addr = 0; >>> + vq->avail_idx = 0; >>> + vq->num = 0; >>> + >>> + spin_lock(&vq->kick_lock); >>> + vq->kicked = false; >>> + if (vq->kickfd) >>> + eventfd_ctx_put(vq->kickfd); >>> + vq->kickfd = NULL; >>> + spin_unlock(&vq->kick_lock); >>> + >>> + spin_lock(&vq->irq_lock); >>> + vq->cb.callback = NULL; >>> + vq->cb.private = NULL; >>> + spin_unlock(&vq->irq_lock); >>> + } >>> +} >>> + >>> +static int vduse_vdpa_set_vq_address(struct vdpa_device *vdpa, u16 idx, >>> + u64 desc_area, u64 driver_area, >>> + u64 device_area) >>> +{ >>> + struct vduse_dev *dev = vdpa_to_vduse(vdpa); >>> + struct vduse_virtqueue *vq = &dev->vqs[idx]; >>> + >>> + vq->desc_addr = desc_area; >>> + vq->driver_addr = driver_area; >>> + vq->device_addr = device_area; >>> + >>> + return 0; >>> +} >>> + >>> +static void vduse_vdpa_kick_vq(struct vdpa_device *vdpa, u16 idx) >>> +{ >>> + struct vduse_dev *dev = vdpa_to_vduse(vdpa); >>> + struct vduse_virtqueue *vq = &dev->vqs[idx]; >>> + >>> + spin_lock(&vq->kick_lock); >>> + if (!vq->ready) >>> + goto unlock; >>> + >>> + if (vq->kickfd) >>> + eventfd_signal(vq->kickfd, 1); >>> + else >>> + vq->kicked = true; >>> +unlock: >>> + spin_unlock(&vq->kick_lock); >>> +} >>> + >>> +static void vduse_vdpa_set_vq_cb(struct vdpa_device *vdpa, u16 idx, >>> + struct vdpa_callback *cb) >>> +{ >>> + struct vduse_dev *dev = vdpa_to_vduse(vdpa); >>> + struct vduse_virtqueue *vq = &dev->vqs[idx]; >>> + >>> + spin_lock(&vq->irq_lock); >>> + vq->cb.callback = cb->callback; >>> + vq->cb.private = cb->private; >>> + spin_unlock(&vq->irq_lock); >>> +} >>> + >>> +static void vduse_vdpa_set_vq_num(struct vdpa_device *vdpa, u16 idx, u32 num) >>> +{ >>> + struct vduse_dev *dev = vdpa_to_vduse(vdpa); >>> + struct vduse_virtqueue *vq = &dev->vqs[idx]; >>> + >>> + vq->num = num; >>> +} >>> + >>> +static void vduse_vdpa_set_vq_ready(struct vdpa_device *vdpa, >>> + u16 idx, bool ready) >>> +{ >>> + struct vduse_dev *dev = vdpa_to_vduse(vdpa); >>> + struct vduse_virtqueue *vq = &dev->vqs[idx]; >>> + >>> + vq->ready = ready; >>> +} >>> + >>> +static bool vduse_vdpa_get_vq_ready(struct vdpa_device *vdpa, u16 idx) >>> +{ >>> + struct vduse_dev *dev = vdpa_to_vduse(vdpa); >>> + struct vduse_virtqueue *vq = &dev->vqs[idx]; >>> + >>> + return vq->ready; >>> +} >>> + >>> +static int vduse_vdpa_set_vq_state(struct vdpa_device *vdpa, u16 idx, >>> + const struct vdpa_vq_state *state) >>> +{ >>> + struct vduse_dev *dev = vdpa_to_vduse(vdpa); >>> + struct vduse_virtqueue *vq = &dev->vqs[idx]; >>> + >>> + vq->avail_idx = state->avail_index; >>> + return 0; >>> +} >>> + >>> +static int vduse_vdpa_get_vq_state(struct vdpa_device *vdpa, u16 idx, >>> + struct vdpa_vq_state *state) >>> +{ >>> + struct vduse_dev *dev = vdpa_to_vduse(vdpa); >>> + struct vduse_virtqueue *vq = &dev->vqs[idx]; >>> + >>> + return vduse_dev_get_vq_state(dev, vq, state); >>> +} >>> + >>> +static u32 vduse_vdpa_get_vq_align(struct vdpa_device *vdpa) >>> +{ >>> + struct vduse_dev *dev = vdpa_to_vduse(vdpa); >>> + >>> + return dev->vq_align; >>> +} >>> + >>> +static u64 vduse_vdpa_get_features(struct vdpa_device *vdpa) >>> +{ >>> + struct vduse_dev *dev = vdpa_to_vduse(vdpa); >>> + >>> + return dev->user_features; >>> +} >>> + >>> +static int vduse_vdpa_set_features(struct vdpa_device *vdpa, u64 features) >>> +{ >>> + struct vduse_dev *dev = vdpa_to_vduse(vdpa); >>> + >>> + dev->features = features; >>> + return 0; >>> +} >>> + >>> +static void vduse_vdpa_set_config_cb(struct vdpa_device *vdpa, >>> + struct vdpa_callback *cb) >>> +{ >>> + struct vduse_dev *dev = vdpa_to_vduse(vdpa); >>> + >>> + spin_lock(&dev->irq_lock); >>> + dev->config_cb.callback = cb->callback; >>> + dev->config_cb.private = cb->private; >>> + spin_unlock(&dev->irq_lock); >>> +} >>> + >>> +static u16 vduse_vdpa_get_vq_num_max(struct vdpa_device *vdpa) >>> +{ >>> + struct vduse_dev *dev = vdpa_to_vduse(vdpa); >>> + >>> + return dev->vq_size_max; >>> +} >>> + >>> +static u32 vduse_vdpa_get_device_id(struct vdpa_device *vdpa) >>> +{ >>> + struct vduse_dev *dev = vdpa_to_vduse(vdpa); >>> + >>> + return dev->device_id; >>> +} >>> + >>> +static u32 vduse_vdpa_get_vendor_id(struct vdpa_device *vdpa) >>> +{ >>> + struct vduse_dev *dev = vdpa_to_vduse(vdpa); >>> + >>> + return dev->vendor_id; >>> +} >>> + >>> +static u8 vduse_vdpa_get_status(struct vdpa_device *vdpa) >>> +{ >>> + struct vduse_dev *dev = vdpa_to_vduse(vdpa); >>> + >>> + return dev->status; >>> +} >>> + >>> +static void vduse_vdpa_set_status(struct vdpa_device *vdpa, u8 status) >>> +{ >>> + struct vduse_dev *dev = vdpa_to_vduse(vdpa); >>> + bool started = !!(status & VIRTIO_CONFIG_S_DRIVER_OK); >>> + >>> + dev->status = status; >>> + >>> + if (dev->started == started) >>> + return; >> >> If we check dev->status == status, (or only check the DRIVER_OK bit) >> then there's no need to introduce an extra dev->started. >> > Will do it. > >>> + >>> + dev->started = started; >>> + if (dev->started) { >>> + vduse_dev_start_dataplane(dev); >>> + } else { >>> + vduse_dev_reset(dev); >>> + vduse_dev_stop_dataplane(dev); >> >> I wonder if no_reply work for the case of vhost-vdpa. For virtio-vDPA, >> we have bouncing buffers so it's harmless if usersapce dataplane keeps >> performing read/write. For vhost-vDPA we don't have such stuffs. >> > OK. So it still needs to be synchronized here. If so, how to handle > the error? Looks like printing a warning message should be enough. We need fix a way to propagate the error to the userspace. E.g if we want to stop the deivce, we will delay the status reset until we get respose from the userspace? > >>> + } >>> +} >>> + >>> +static size_t vduse_vdpa_get_config_size(struct vdpa_device *vdpa) >>> +{ >>> + struct vduse_dev *dev = vdpa_to_vduse(vdpa); >>> + >>> + return dev->config_size; >>> +} >>> + >>> +static void vduse_vdpa_get_config(struct vdpa_device *vdpa, unsigned int offset, >>> + void *buf, unsigned int len) >>> +{ >>> + struct vduse_dev *dev = vdpa_to_vduse(vdpa); >>> + >>> + memcpy(buf, dev->config + offset, len); >>> +} >>> + >>> +static void vduse_vdpa_set_config(struct vdpa_device *vdpa, unsigned int offset, >>> + const void *buf, unsigned int len) >>> +{ >>> + /* Now we only support read-only configuration space */ >>> +} >>> + >>> +static u32 vduse_vdpa_get_generation(struct vdpa_device *vdpa) >>> +{ >>> + struct vduse_dev *dev = vdpa_to_vduse(vdpa); >>> + >>> + return dev->generation; >>> +} >>> + >>> +static int vduse_vdpa_set_map(struct vdpa_device *vdpa, >>> + struct vhost_iotlb *iotlb) >>> +{ >>> + struct vduse_dev *dev = vdpa_to_vduse(vdpa); >>> + int ret; >>> + >>> + ret = vduse_domain_set_map(dev->domain, iotlb); >>> + if (ret) >>> + return ret; >>> + >>> + ret = vduse_dev_update_iotlb(dev, 0ULL, ULLONG_MAX); >>> + if (ret) { >>> + vduse_domain_clear_map(dev->domain, iotlb); >>> + return ret; >>> + } >>> + >>> + return 0; >>> +} >>> + >>> +static void vduse_vdpa_free(struct vdpa_device *vdpa) >>> +{ >>> + struct vduse_dev *dev = vdpa_to_vduse(vdpa); >>> + >>> + dev->vdev = NULL; >>> +} >>> + >>> +static const struct vdpa_config_ops vduse_vdpa_config_ops = { >>> + .set_vq_address = vduse_vdpa_set_vq_address, >>> + .kick_vq = vduse_vdpa_kick_vq, >>> + .set_vq_cb = vduse_vdpa_set_vq_cb, >>> + .set_vq_num = vduse_vdpa_set_vq_num, >>> + .set_vq_ready = vduse_vdpa_set_vq_ready, >>> + .get_vq_ready = vduse_vdpa_get_vq_ready, >>> + .set_vq_state = vduse_vdpa_set_vq_state, >>> + .get_vq_state = vduse_vdpa_get_vq_state, >>> + .get_vq_align = vduse_vdpa_get_vq_align, >>> + .get_features = vduse_vdpa_get_features, >>> + .set_features = vduse_vdpa_set_features, >>> + .set_config_cb = vduse_vdpa_set_config_cb, >>> + .get_vq_num_max = vduse_vdpa_get_vq_num_max, >>> + .get_device_id = vduse_vdpa_get_device_id, >>> + .get_vendor_id = vduse_vdpa_get_vendor_id, >>> + .get_status = vduse_vdpa_get_status, >>> + .set_status = vduse_vdpa_set_status, >>> + .get_config_size = vduse_vdpa_get_config_size, >>> + .get_config = vduse_vdpa_get_config, >>> + .set_config = vduse_vdpa_set_config, >>> + .get_generation = vduse_vdpa_get_generation, >>> + .set_map = vduse_vdpa_set_map, >>> + .free = vduse_vdpa_free, >>> +}; >>> + >>> +static dma_addr_t vduse_dev_map_page(struct device *dev, struct page *page, >>> + unsigned long offset, size_t size, >>> + enum dma_data_direction dir, >>> + unsigned long attrs) >>> +{ >>> + struct vduse_dev *vdev = dev_to_vduse(dev); >>> + struct vduse_iova_domain *domain = vdev->domain; >>> + >>> + return vduse_domain_map_page(domain, page, offset, size, dir, attrs); >>> +} >>> + >>> +static void vduse_dev_unmap_page(struct device *dev, dma_addr_t dma_addr, >>> + size_t size, enum dma_data_direction dir, >>> + unsigned long attrs) >>> +{ >>> + struct vduse_dev *vdev = dev_to_vduse(dev); >>> + struct vduse_iova_domain *domain = vdev->domain; >>> + >>> + return vduse_domain_unmap_page(domain, dma_addr, size, dir, attrs); >>> +} >>> + >>> +static void *vduse_dev_alloc_coherent(struct device *dev, size_t size, >>> + dma_addr_t *dma_addr, gfp_t flag, >>> + unsigned long attrs) >>> +{ >>> + struct vduse_dev *vdev = dev_to_vduse(dev); >>> + struct vduse_iova_domain *domain = vdev->domain; >>> + unsigned long iova; >>> + void *addr; >>> + >>> + *dma_addr = DMA_MAPPING_ERROR; >>> + addr = vduse_domain_alloc_coherent(domain, size, >>> + (dma_addr_t *)&iova, flag, attrs); >>> + if (!addr) >>> + return NULL; >>> + >>> + *dma_addr = (dma_addr_t)iova; >>> + >>> + return addr; >>> +} >>> + >>> +static void vduse_dev_free_coherent(struct device *dev, size_t size, >>> + void *vaddr, dma_addr_t dma_addr, >>> + unsigned long attrs) >>> +{ >>> + struct vduse_dev *vdev = dev_to_vduse(dev); >>> + struct vduse_iova_domain *domain = vdev->domain; >>> + >>> + vduse_domain_free_coherent(domain, size, vaddr, dma_addr, attrs); >>> +} >>> + >>> +static size_t vduse_dev_max_mapping_size(struct device *dev) >>> +{ >>> + struct vduse_dev *vdev = dev_to_vduse(dev); >>> + struct vduse_iova_domain *domain = vdev->domain; >>> + >>> + return domain->bounce_size; >>> +} >>> + >>> +static const struct dma_map_ops vduse_dev_dma_ops = { >>> + .map_page = vduse_dev_map_page, >>> + .unmap_page = vduse_dev_unmap_page, >>> + .alloc = vduse_dev_alloc_coherent, >>> + .free = vduse_dev_free_coherent, >>> + .max_mapping_size = vduse_dev_max_mapping_size, >>> +}; >>> + >>> +static unsigned int perm_to_file_flags(u8 perm) >>> +{ >>> + unsigned int flags = 0; >>> + >>> + switch (perm) { >>> + case VDUSE_ACCESS_WO: >>> + flags |= O_WRONLY; >>> + break; >>> + case VDUSE_ACCESS_RO: >>> + flags |= O_RDONLY; >>> + break; >>> + case VDUSE_ACCESS_RW: >>> + flags |= O_RDWR; >>> + break; >>> + default: >>> + WARN(1, "invalidate vhost IOTLB permission\n"); >>> + break; >>> + } >>> + >>> + return flags; >>> +} >>> + >>> +static int vduse_kickfd_setup(struct vduse_dev *dev, >>> + struct vduse_vq_eventfd *eventfd) >>> +{ >>> + struct eventfd_ctx *ctx = NULL; >>> + struct vduse_virtqueue *vq; >>> + u32 index; >>> + >>> + if (eventfd->index >= dev->vq_num) >>> + return -EINVAL; >>> + >>> + index = array_index_nospec(eventfd->index, dev->vq_num); >>> + vq = &dev->vqs[index]; >>> + if (eventfd->fd >= 0) { >>> + ctx = eventfd_ctx_fdget(eventfd->fd); >>> + if (IS_ERR(ctx)) >>> + return PTR_ERR(ctx); >>> + } else if (eventfd->fd != VDUSE_EVENTFD_DEASSIGN) >>> + return 0; >>> + >>> + spin_lock(&vq->kick_lock); >>> + if (vq->kickfd) >>> + eventfd_ctx_put(vq->kickfd); >>> + vq->kickfd = ctx; >>> + if (vq->ready && vq->kicked && vq->kickfd) { >>> + eventfd_signal(vq->kickfd, 1); >>> + vq->kicked = false; >>> + } >>> + spin_unlock(&vq->kick_lock); >>> + >>> + return 0; >>> +} >>> + >>> +static void vduse_dev_irq_inject(struct work_struct *work) >>> +{ >>> + struct vduse_dev *dev = container_of(work, struct vduse_dev, inject); >>> + >>> + spin_lock_irq(&dev->irq_lock); >>> + if (dev->config_cb.callback) >>> + dev->config_cb.callback(dev->config_cb.private); >>> + spin_unlock_irq(&dev->irq_lock); >>> +} >>> + >>> +static void vduse_vq_irq_inject(struct work_struct *work) >>> +{ >>> + struct vduse_virtqueue *vq = container_of(work, >>> + struct vduse_virtqueue, inject); >>> + >>> + spin_lock_irq(&vq->irq_lock); >>> + if (vq->ready && vq->cb.callback) >>> + vq->cb.callback(vq->cb.private); >>> + spin_unlock_irq(&vq->irq_lock); >>> +} >>> + >>> +static long vduse_dev_ioctl(struct file *file, unsigned int cmd, >>> + unsigned long arg) >>> +{ >>> + struct vduse_dev *dev = file->private_data; >>> + void __user *argp = (void __user *)arg; >>> + int ret; >>> + >>> + switch (cmd) { >>> + case VDUSE_IOTLB_GET_FD: { >>> + struct vduse_iotlb_entry entry; >>> + struct vhost_iotlb_map *map; >>> + struct vdpa_map_file *map_file; >>> + struct vduse_iova_domain *domain = dev->domain; >>> + struct file *f = NULL; >>> + >>> + ret = -EFAULT; >>> + if (copy_from_user(&entry, argp, sizeof(entry))) >>> + break; >>> + >>> + ret = -EINVAL; >>> + if (entry.start > entry.last) >>> + break; >>> + >>> + spin_lock(&domain->iotlb_lock); >>> + map = vhost_iotlb_itree_first(domain->iotlb, >>> + entry.start, entry.last); >>> + if (map) { >>> + map_file = (struct vdpa_map_file *)map->opaque; >>> + f = get_file(map_file->file); >>> + entry.offset = map_file->offset; >>> + entry.start = map->start; >>> + entry.last = map->last; >>> + entry.perm = map->perm; >>> + } >>> + spin_unlock(&domain->iotlb_lock); >>> + ret = -EINVAL; >>> + if (!f) >>> + break; >>> + >>> + ret = -EFAULT; >>> + if (copy_to_user(argp, &entry, sizeof(entry))) { >>> + fput(f); >>> + break; >>> + } >>> + ret = receive_fd(f, perm_to_file_flags(entry.perm)); >>> + fput(f); >>> + break; >>> + } >>> + case VDUSE_DEV_GET_FEATURES: >>> + ret = put_user(dev->features, (u64 __user *)argp); >>> + break; >>> + case VDUSE_DEV_UPDATE_CONFIG: { >>> + struct vduse_config_update config; >>> + unsigned long size = offsetof(struct vduse_config_update, >>> + buffer); >>> + >>> + ret = -EFAULT; >>> + if (copy_from_user(&config, argp, size)) >>> + break; >>> + >>> + ret = -EINVAL; >>> + if (config.length == 0 || >>> + config.length > dev->config_size - config.offset) >>> + break; >>> + >>> + ret = -EFAULT; >>> + if (copy_from_user(dev->config + config.offset, argp + size, >>> + config.length)) >>> + break; >>> + >>> + ret = 0; >>> + queue_work(vduse_irq_wq, &dev->inject); >> >> I wonder if it's better to separate config interrupt out of config >> update or we need document this. >> > I have documented it in the docs. Looks like a config update should be > always followed by a config interrupt. I didn't find a case that uses > them separately. The uAPI doesn't prevent us from the following scenario: update_config(mac[0], ..); update_config(max[1], ..); So it looks to me it's better to separate the config interrupt from the config updating. > >>> + break; >>> + } >>> + case VDUSE_VQ_GET_INFO: { >> >> Do we need to limit this only when DRIVER_OK is set? >> > Any reason to add this limitation? Otherwise the vq is not fully initialized, e.g the desc_addr might not be correct. > >>> + struct vduse_vq_info vq_info; >>> + u32 vq_index; >>> + >>> + ret = -EFAULT; >>> + if (copy_from_user(&vq_info, argp, sizeof(vq_info))) >>> + break; >>> + >>> + ret = -EINVAL; >>> + if (vq_info.index >= dev->vq_num) >>> + break; >>> + >>> + vq_index = array_index_nospec(vq_info.index, dev->vq_num); >>> + vq_info.desc_addr = dev->vqs[vq_index].desc_addr; >>> + vq_info.driver_addr = dev->vqs[vq_index].driver_addr; >>> + vq_info.device_addr = dev->vqs[vq_index].device_addr; >>> + vq_info.num = dev->vqs[vq_index].num; >>> + vq_info.avail_idx = dev->vqs[vq_index].avail_idx; >>> + vq_info.ready = dev->vqs[vq_index].ready; >>> + >>> + ret = -EFAULT; >>> + if (copy_to_user(argp, &vq_info, sizeof(vq_info))) >>> + break; >>> + >>> + ret = 0; >>> + break; >>> + } >>> + case VDUSE_VQ_SETUP_KICKFD: { >>> + struct vduse_vq_eventfd eventfd; >>> + >>> + ret = -EFAULT; >>> + if (copy_from_user(&eventfd, argp, sizeof(eventfd))) >>> + break; >>> + >>> + ret = vduse_kickfd_setup(dev, &eventfd); >>> + break; >>> + } >>> + case VDUSE_VQ_INJECT_IRQ: { >>> + u32 vq_index; >>> + >>> + ret = -EFAULT; >>> + if (get_user(vq_index, (u32 __user *)argp)) >>> + break; >>> + >>> + ret = -EINVAL; >>> + if (vq_index >= dev->vq_num) >>> + break; >>> + >>> + ret = 0; >>> + vq_index = array_index_nospec(vq_index, dev->vq_num); >>> + queue_work(vduse_irq_wq, &dev->vqs[vq_index].inject); >>> + break; >>> + } >>> + default: >>> + ret = -ENOIOCTLCMD; >>> + break; >>> + } >>> + >>> + return ret; >>> +} >>> + >>> +static int vduse_dev_release(struct inode *inode, struct file *file) >>> +{ >>> + struct vduse_dev *dev = file->private_data; >>> + >>> + spin_lock(&dev->msg_lock); >>> + /* Make sure the inflight messages can processed after reconncection */ >>> + list_splice_init(&dev->recv_list, &dev->send_list); >>> + spin_unlock(&dev->msg_lock); >>> + dev->connected = false; >>> + >>> + return 0; >>> +} >>> + >>> +static struct vduse_dev *vduse_dev_get_from_minor(int minor) >>> +{ >>> + struct vduse_dev *dev; >>> + >>> + mutex_lock(&vduse_lock); >>> + dev = idr_find(&vduse_idr, minor); >>> + mutex_unlock(&vduse_lock); >>> + >>> + return dev; >>> +} >>> + >>> +static int vduse_dev_open(struct inode *inode, struct file *file) >>> +{ >>> + int ret; >>> + struct vduse_dev *dev = vduse_dev_get_from_minor(iminor(inode)); >>> + >>> + if (!dev) >>> + return -ENODEV; >>> + >>> + ret = -EBUSY; >>> + mutex_lock(&dev->lock); >>> + if (dev->connected) >>> + goto unlock; >>> + >>> + ret = 0; >>> + dev->connected = true; >>> + file->private_data = dev; >>> +unlock: >>> + mutex_unlock(&dev->lock); >>> + >>> + return ret; >>> +} >>> + >>> +static const struct file_operations vduse_dev_fops = { >>> + .owner = THIS_MODULE, >>> + .open = vduse_dev_open, >>> + .release = vduse_dev_release, >>> + .read_iter = vduse_dev_read_iter, >>> + .write_iter = vduse_dev_write_iter, >>> + .poll = vduse_dev_poll, >>> + .unlocked_ioctl = vduse_dev_ioctl, >>> + .compat_ioctl = compat_ptr_ioctl, >>> + .llseek = noop_llseek, >>> +}; >>> + >>> +static struct vduse_dev *vduse_dev_create(void) >>> +{ >>> + struct vduse_dev *dev = kzalloc(sizeof(*dev), GFP_KERNEL); >>> + >>> + if (!dev) >>> + return NULL; >>> + >>> + mutex_init(&dev->lock); >>> + spin_lock_init(&dev->msg_lock); >>> + INIT_LIST_HEAD(&dev->send_list); >>> + INIT_LIST_HEAD(&dev->recv_list); >>> + spin_lock_init(&dev->irq_lock); >>> + >>> + INIT_WORK(&dev->inject, vduse_dev_irq_inject); >>> + init_waitqueue_head(&dev->waitq); >>> + >>> + return dev; >>> +} >>> + >>> +static void vduse_dev_destroy(struct vduse_dev *dev) >>> +{ >>> + kfree(dev); >>> +} >>> + >>> +static struct vduse_dev *vduse_find_dev(const char *name) >>> +{ >>> + struct vduse_dev *dev; >>> + int id; >>> + >>> + idr_for_each_entry(&vduse_idr, dev, id) >>> + if (!strcmp(dev->name, name)) >>> + return dev; >>> + >>> + return NULL; >>> +} >>> + >>> +static int vduse_destroy_dev(char *name) >>> +{ >>> + struct vduse_dev *dev = vduse_find_dev(name); >>> + >>> + if (!dev) >>> + return -EINVAL; >>> + >>> + mutex_lock(&dev->lock); >>> + if (dev->vdev || dev->connected) { >>> + mutex_unlock(&dev->lock); >>> + return -EBUSY; >>> + } >>> + dev->connected = true; >>> + mutex_unlock(&dev->lock); >>> + >>> + vduse_dev_msg_cleanup(dev); >>> + device_destroy(vduse_class, MKDEV(MAJOR(vduse_major), dev->minor)); >>> + idr_remove(&vduse_idr, dev->minor); >>> + kvfree(dev->config); >>> + kfree(dev->vqs); >>> + vduse_domain_destroy(dev->domain); >>> + kfree(dev->name); >>> + vduse_dev_destroy(dev); >>> + module_put(THIS_MODULE); >>> + >>> + return 0; >>> +} >>> + >>> +static bool device_is_allowed(u32 device_id) >>> +{ >>> + int i; >>> + >>> + for (i = 0; i < ARRAY_SIZE(allowed_device_id); i++) >>> + if (allowed_device_id[i] == device_id) >>> + return true; >>> + >>> + return false; >>> +} >>> + >>> +static bool features_is_valid(u64 features) >>> +{ >>> + if (!(features & (1ULL << VIRTIO_F_ACCESS_PLATFORM))) >>> + return false; >>> + >>> + /* Now we only support read-only configuration space */ >>> + if (features & (1ULL << VIRTIO_BLK_F_CONFIG_WCE)) >>> + return false; >>> + >>> + return true; >>> +} >>> + >>> +static bool vduse_validate_config(struct vduse_dev_config *config) >>> +{ >>> + if (config->bounce_size > VDUSE_MAX_BOUNCE_SIZE) >>> + return false; >>> + >>> + if (config->vq_align > PAGE_SIZE) >>> + return false; >>> + >>> + if (config->config_size > PAGE_SIZE) >>> + return false; >>> + >>> + if (!device_is_allowed(config->device_id)) >>> + return false; >>> + >>> + if (!features_is_valid(config->features)) >>> + return false; >> >> Do we need to validate whether or not config_size is too small otherwise >> we may have OOB access in get_config()? >> > How about adding validation in get_config()? It seems to be hard to > define the lower bound. It should work. Thanks > >>> + >>> + return true; >>> +} >>> + >>> +static int vduse_create_dev(struct vduse_dev_config *config, >>> + void *config_buf, u64 api_version) >>> +{ >>> + int i, ret; >>> + struct vduse_dev *dev; >>> + >>> + ret = -EEXIST; >>> + if (vduse_find_dev(config->name)) >>> + goto err; >>> + >>> + ret = -ENOMEM; >>> + dev = vduse_dev_create(); >>> + if (!dev) >>> + goto err; >>> + >>> + dev->api_version = api_version; >>> + dev->user_features = config->features; >>> + dev->device_id = config->device_id; >>> + dev->vendor_id = config->vendor_id; >>> + dev->name = kstrdup(config->name, GFP_KERNEL); >>> + if (!dev->name) >>> + goto err_str; >>> + >>> + dev->domain = vduse_domain_create(VDUSE_IOVA_SIZE - 1, >>> + config->bounce_size); >>> + if (!dev->domain) >>> + goto err_domain; >>> + >>> + dev->config = config_buf; >>> + dev->config_size = config->config_size; >>> + dev->vq_align = config->vq_align; >>> + dev->vq_size_max = config->vq_size_max; >>> + dev->vq_num = config->vq_num; >>> + dev->vqs = kcalloc(dev->vq_num, sizeof(*dev->vqs), GFP_KERNEL); >>> + if (!dev->vqs) >>> + goto err_vqs; >>> + >>> + for (i = 0; i < dev->vq_num; i++) { >>> + dev->vqs[i].index = i; >>> + INIT_WORK(&dev->vqs[i].inject, vduse_vq_irq_inject); >>> + spin_lock_init(&dev->vqs[i].kick_lock); >>> + spin_lock_init(&dev->vqs[i].irq_lock); >>> + } >>> + >>> + ret = idr_alloc(&vduse_idr, dev, 1, VDUSE_DEV_MAX, GFP_KERNEL); >>> + if (ret < 0) >>> + goto err_idr; >>> + >>> + dev->minor = ret; >>> + dev->dev = device_create(vduse_class, NULL, >>> + MKDEV(MAJOR(vduse_major), dev->minor), >>> + NULL, "%s", config->name); >>> + if (IS_ERR(dev->dev)) { >>> + ret = PTR_ERR(dev->dev); >>> + goto err_dev; >>> + } >>> + __module_get(THIS_MODULE); >>> + >>> + return 0; >>> +err_dev: >>> + idr_remove(&vduse_idr, dev->minor); >>> +err_idr: >>> + kfree(dev->vqs); >>> +err_vqs: >>> + vduse_domain_destroy(dev->domain); >>> +err_domain: >>> + kfree(dev->name); >>> +err_str: >>> + vduse_dev_destroy(dev); >>> +err: >>> + kvfree(config_buf); >>> + return ret; >>> +} >>> + >>> +static long vduse_ioctl(struct file *file, unsigned int cmd, >>> + unsigned long arg) >>> +{ >>> + int ret; >>> + void __user *argp = (void __user *)arg; >>> + struct vduse_control *control = file->private_data; >>> + >>> + mutex_lock(&vduse_lock); >>> + switch (cmd) { >>> + case VDUSE_GET_API_VERSION: >>> + ret = put_user(control->api_version, (u64 __user *)argp); >>> + break; >>> + case VDUSE_SET_API_VERSION: { >>> + u64 api_version; >>> + >>> + ret = -EFAULT; >>> + if (get_user(api_version, (u64 __user *)argp)) >>> + break; >>> + >>> + ret = -EINVAL; >>> + if (api_version > VDUSE_API_VERSION) >>> + break; >>> + >>> + ret = 0; >>> + control->api_version = api_version; >>> + break; >>> + } >>> + case VDUSE_CREATE_DEV: { >>> + struct vduse_dev_config config; >>> + unsigned long size = offsetof(struct vduse_dev_config, config); >>> + void *buf; >>> + >>> + ret = -EFAULT; >>> + if (copy_from_user(&config, argp, size)) >>> + break; >>> + >>> + ret = -EINVAL; >>> + if (vduse_validate_config(&config) == false) >>> + break; >>> + >>> + buf = vmemdup_user(argp + size, config.config_size); >>> + if (IS_ERR(buf)) { >>> + ret = PTR_ERR(buf); >>> + break; >>> + } >>> + ret = vduse_create_dev(&config, buf, control->api_version); >>> + break; >>> + } >>> + case VDUSE_DESTROY_DEV: { >>> + char name[VDUSE_NAME_MAX]; >>> + >>> + ret = -EFAULT; >>> + if (copy_from_user(name, argp, VDUSE_NAME_MAX)) >>> + break; >>> + >>> + ret = vduse_destroy_dev(name); >>> + break; >>> + } >>> + default: >>> + ret = -EINVAL; >>> + break; >>> + } >>> + mutex_unlock(&vduse_lock); >>> + >>> + return ret; >>> +} >>> + >>> +static int vduse_release(struct inode *inode, struct file *file) >>> +{ >>> + struct vduse_control *control = file->private_data; >>> + >>> + kfree(control); >>> + return 0; >>> +} >>> + >>> +static int vduse_open(struct inode *inode, struct file *file) >>> +{ >>> + struct vduse_control *control; >>> + >>> + control = kmalloc(sizeof(struct vduse_control), GFP_KERNEL); >>> + if (!control) >>> + return -ENOMEM; >>> + >>> + control->api_version = VDUSE_API_VERSION; >>> + file->private_data = control; >>> + >>> + return 0; >>> +} >>> + >>> +static const struct file_operations vduse_ctrl_fops = { >>> + .owner = THIS_MODULE, >>> + .open = vduse_open, >>> + .release = vduse_release, >>> + .unlocked_ioctl = vduse_ioctl, >>> + .compat_ioctl = compat_ptr_ioctl, >>> + .llseek = noop_llseek, >>> +}; >>> + >>> +static char *vduse_devnode(struct device *dev, umode_t *mode) >>> +{ >>> + return kasprintf(GFP_KERNEL, "vduse/%s", dev_name(dev)); >>> +} >>> + >>> +static void vduse_mgmtdev_release(struct device *dev) >>> +{ >>> +} >>> + >>> +static struct device vduse_mgmtdev = { >>> + .init_name = "vduse", >>> + .release = vduse_mgmtdev_release, >>> +}; >>> + >>> +static struct vdpa_mgmt_dev mgmt_dev; >>> + >>> +static int vduse_dev_init_vdpa(struct vduse_dev *dev, const char *name) >>> +{ >>> + struct vduse_vdpa *vdev; >>> + int ret; >>> + >>> + if (dev->vdev) >>> + return -EEXIST; >>> + >>> + vdev = vdpa_alloc_device(struct vduse_vdpa, vdpa, dev->dev, >>> + &vduse_vdpa_config_ops, name, true); >>> + if (!vdev) >>> + return -ENOMEM; >>> + >>> + dev->vdev = vdev; >>> + vdev->dev = dev; >>> + vdev->vdpa.dev.dma_mask = &vdev->vdpa.dev.coherent_dma_mask; >>> + ret = dma_set_mask_and_coherent(&vdev->vdpa.dev, DMA_BIT_MASK(64)); >>> + if (ret) { >>> + put_device(&vdev->vdpa.dev); >>> + return ret; >>> + } >>> + set_dma_ops(&vdev->vdpa.dev, &vduse_dev_dma_ops); >>> + vdev->vdpa.dma_dev = &vdev->vdpa.dev; >>> + vdev->vdpa.mdev = &mgmt_dev; >>> + >>> + return 0; >>> +} >>> + >>> +static int vdpa_dev_add(struct vdpa_mgmt_dev *mdev, const char *name) >>> +{ >>> + struct vduse_dev *dev; >>> + int ret; >>> + >>> + mutex_lock(&vduse_lock); >>> + dev = vduse_find_dev(name); >>> + if (!dev) { >>> + mutex_unlock(&vduse_lock); >>> + return -EINVAL; >>> + } >>> + ret = vduse_dev_init_vdpa(dev, name); >>> + mutex_unlock(&vduse_lock); >>> + if (ret) >>> + return ret; >>> + >>> + ret = _vdpa_register_device(&dev->vdev->vdpa, dev->vq_num); >>> + if (ret) { >>> + put_device(&dev->vdev->vdpa.dev); >>> + return ret; >>> + } >>> + >>> + return 0; >>> +} >>> + >>> +static void vdpa_dev_del(struct vdpa_mgmt_dev *mdev, struct vdpa_device *dev) >>> +{ >>> + _vdpa_unregister_device(dev); >>> +} >>> + >>> +static const struct vdpa_mgmtdev_ops vdpa_dev_mgmtdev_ops = { >>> + .dev_add = vdpa_dev_add, >>> + .dev_del = vdpa_dev_del, >>> +}; >>> + >>> +static struct virtio_device_id id_table[] = { >>> + { VIRTIO_ID_BLOCK, VIRTIO_DEV_ANY_ID }, >>> + { 0 }, >>> +}; >>> + >>> +static struct vdpa_mgmt_dev mgmt_dev = { >>> + .device = &vduse_mgmtdev, >>> + .id_table = id_table, >>> + .ops = &vdpa_dev_mgmtdev_ops, >>> +}; >>> + >>> +static int vduse_mgmtdev_init(void) >>> +{ >>> + int ret; >>> + >>> + ret = device_register(&vduse_mgmtdev); >>> + if (ret) >>> + return ret; >>> + >>> + ret = vdpa_mgmtdev_register(&mgmt_dev); >>> + if (ret) >>> + goto err; >>> + >>> + return 0; >>> +err: >>> + device_unregister(&vduse_mgmtdev); >>> + return ret; >>> +} >>> + >>> +static void vduse_mgmtdev_exit(void) >>> +{ >>> + vdpa_mgmtdev_unregister(&mgmt_dev); >>> + device_unregister(&vduse_mgmtdev); >>> +} >>> + >>> +static int vduse_init(void) >>> +{ >>> + int ret; >>> + struct device *dev; >>> + >>> + vduse_class = class_create(THIS_MODULE, "vduse"); >>> + if (IS_ERR(vduse_class)) >>> + return PTR_ERR(vduse_class); >>> + >>> + vduse_class->devnode = vduse_devnode; >>> + >>> + ret = alloc_chrdev_region(&vduse_major, 0, VDUSE_DEV_MAX, "vduse"); >>> + if (ret) >>> + goto err_chardev_region; >>> + >>> + /* /dev/vduse/control */ >>> + cdev_init(&vduse_ctrl_cdev, &vduse_ctrl_fops); >>> + vduse_ctrl_cdev.owner = THIS_MODULE; >>> + ret = cdev_add(&vduse_ctrl_cdev, vduse_major, 1); >>> + if (ret) >>> + goto err_ctrl_cdev; >>> + >>> + dev = device_create(vduse_class, NULL, vduse_major, NULL, "control"); >>> + if (IS_ERR(dev)) { >>> + ret = PTR_ERR(dev); >>> + goto err_device; >>> + } >>> + >>> + /* /dev/vduse/$DEVICE */ >>> + cdev_init(&vduse_cdev, &vduse_dev_fops); >>> + vduse_cdev.owner = THIS_MODULE; >>> + ret = cdev_add(&vduse_cdev, MKDEV(MAJOR(vduse_major), 1), >>> + VDUSE_DEV_MAX - 1); >>> + if (ret) >>> + goto err_cdev; >>> + >>> + vduse_irq_wq = alloc_workqueue("vduse-irq", >>> + WQ_HIGHPRI | WQ_SYSFS | WQ_UNBOUND, 0); >>> + if (!vduse_irq_wq) >>> + goto err_wq; >>> + >>> + ret = vduse_domain_init(); >>> + if (ret) >>> + goto err_domain; >>> + >>> + ret = vduse_mgmtdev_init(); >>> + if (ret) >>> + goto err_mgmtdev; >>> + >>> + return 0; >>> +err_mgmtdev: >>> + vduse_domain_exit(); >>> +err_domain: >>> + destroy_workqueue(vduse_irq_wq); >>> +err_wq: >>> + cdev_del(&vduse_cdev); >>> +err_cdev: >>> + device_destroy(vduse_class, vduse_major); >>> +err_device: >>> + cdev_del(&vduse_ctrl_cdev); >>> +err_ctrl_cdev: >>> + unregister_chrdev_region(vduse_major, VDUSE_DEV_MAX); >>> +err_chardev_region: >>> + class_destroy(vduse_class); >>> + return ret; >>> +} >>> +module_init(vduse_init); >>> + >>> +static void vduse_exit(void) >>> +{ >>> + vduse_mgmtdev_exit(); >>> + vduse_domain_exit(); >>> + destroy_workqueue(vduse_irq_wq); >>> + cdev_del(&vduse_cdev); >>> + device_destroy(vduse_class, vduse_major); >>> + cdev_del(&vduse_ctrl_cdev); >>> + unregister_chrdev_region(vduse_major, VDUSE_DEV_MAX); >>> + class_destroy(vduse_class); >>> +} >>> +module_exit(vduse_exit); >>> + >>> +MODULE_LICENSE(DRV_LICENSE); >>> +MODULE_AUTHOR(DRV_AUTHOR); >>> +MODULE_DESCRIPTION(DRV_DESC); >>> diff --git a/include/uapi/linux/vduse.h b/include/uapi/linux/vduse.h >>> new file mode 100644 >>> index 000000000000..f21b2e51b5c8 >>> --- /dev/null >>> +++ b/include/uapi/linux/vduse.h >>> @@ -0,0 +1,143 @@ >>> +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ >>> +#ifndef _UAPI_VDUSE_H_ >>> +#define _UAPI_VDUSE_H_ >>> + >>> +#include >>> + >>> +#define VDUSE_API_VERSION 0 >>> + >>> +#define VDUSE_NAME_MAX 256 >>> + >>> +/* the control messages definition for read/write */ >>> + >>> +enum vduse_req_type { >>> + /* Get the state for virtqueue from userspace */ >>> + VDUSE_GET_VQ_STATE, >>> + /* Notify userspace to start the dataplane, no reply */ >>> + VDUSE_START_DATAPLANE, >>> + /* Notify userspace to stop the dataplane, no reply */ >>> + VDUSE_STOP_DATAPLANE, >>> + /* Notify userspace to update the memory mapping in device IOTLB */ >>> + VDUSE_UPDATE_IOTLB, >>> +}; >>> + >>> +struct vduse_vq_state { >>> + __u32 index; /* virtqueue index */ >>> + __u32 avail_idx; /* virtqueue state (last_avail_idx) */ >>> +}; >> >> This needs some tweaks to support packed virtqueue. >> > OK. > > Thanks, > Yongji > From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-15.1 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,NICE_REPLY_A,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_SANE_1 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 5BA19C48BE5 for ; Tue, 22 Jun 2021 05:07:11 +0000 (UTC) Received: from smtp2.osuosl.org (smtp2.osuosl.org [140.211.166.133]) (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 F15B060FDB for ; Tue, 22 Jun 2021 05:07:10 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org F15B060FDB Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=iommu-bounces@lists.linux-foundation.org Received: from localhost (localhost [127.0.0.1]) by smtp2.osuosl.org (Postfix) with ESMTP id 9A1E44029E; Tue, 22 Jun 2021 05:07:10 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from smtp2.osuosl.org ([127.0.0.1]) by localhost (smtp2.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id fvydhEc284FZ; Tue, 22 Jun 2021 05:07:08 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by smtp2.osuosl.org (Postfix) with ESMTPS id 2517F4017C; Tue, 22 Jun 2021 05:07:08 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id CAACDC0010; Tue, 22 Jun 2021 05:07:07 +0000 (UTC) Received: from smtp3.osuosl.org (smtp3.osuosl.org [IPv6:2605:bc80:3010::136]) by lists.linuxfoundation.org (Postfix) with ESMTP id BD1C8C000E for ; Tue, 22 Jun 2021 05:07:05 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by smtp3.osuosl.org (Postfix) with ESMTP id 99AF96059B for ; Tue, 22 Jun 2021 05:07:05 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Authentication-Results: smtp3.osuosl.org (amavisd-new); dkim=pass (1024-bit key) header.d=redhat.com Received: from smtp3.osuosl.org ([127.0.0.1]) by localhost (smtp3.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id hc3t0WBj5iCW for ; Tue, 22 Jun 2021 05:07:03 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.8.0 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by smtp3.osuosl.org (Postfix) with ESMTPS id ADC33600D4 for ; Tue, 22 Jun 2021 05:07:02 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1624338421; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=2ZRIfQ1z1aTm2SnHKEOxbV1hbgwf/o+AvND1awWYHYY=; b=ZTzfOpQwMiLb8S4qTVmBXn4Qjam6reytn9Gh6S10R1JtQaX6qr+tjYnwQ8PintMmp8hZTN xdch5DyakJ/90Wm//nVT8VBoAaQ5nZMVKqPH7VcrVgt+Q7cF6Vo8CMmxIRA2vdRLafBPw3 nDqJFNgDcC0XWqbsl8btA3XW/UEXjCs= Received: from mail-pl1-f197.google.com (mail-pl1-f197.google.com [209.85.214.197]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-4-YsZ3cvYcNiaZQLa8c1TG4A-1; Tue, 22 Jun 2021 01:06:59 -0400 X-MC-Unique: YsZ3cvYcNiaZQLa8c1TG4A-1 Received: by mail-pl1-f197.google.com with SMTP id 2-20020a1709020202b02900eecb50c2deso5845043plc.0 for ; Mon, 21 Jun 2021 22:06:58 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:to:cc:references:from:message-id:date :user-agent:mime-version:in-reply-to:content-transfer-encoding :content-language; bh=2ZRIfQ1z1aTm2SnHKEOxbV1hbgwf/o+AvND1awWYHYY=; b=TCKwfxefSs1KCrAkleBTW2VVfsCKWJmr64vdz/pjVZmK9/4h/+RWySneB/qXROenzw 2S6KvK6+MoITXjYTLaJi3TrYe86nlpq8SBaC1jAF0UxfADh0zNln4YWOQLQMJ8voecPt WcyuS/U+0Y/LAkdLJKPRT+ZtZNExKXb+OEhL0AbacVG0U42O9J0if5/nL06spnGlyWYL OqIe23BEMkwURlqBqGKnv2D2K+9KAnuSp09HDGKZqOdS24aSQ8x780Z4bmdqJS/+G4qk kjwnabVWF1GU9rlaqcZTadCUZ/GmUjpq5WHifGtJh0rHlbakCzyKynTdpCaJXBAJYkJp DPnA== X-Gm-Message-State: AOAM5338N6R3tit2qh7qvoIh5gsNWtBSeiM9+ES8ihOd+SeRbT6PwFz6 FtsAijSVXiLWhXnbKX76+1Q7pdd92fbOKkYIf2xeZyPwahpfUKBWChGcRDOD/phh/4kbjBrc7nT h3OjYTWMJDnlmUiKLIXh6GrsED+AGqQ== X-Received: by 2002:a17:90a:1e82:: with SMTP id x2mr2029079pjx.11.1624338417967; Mon, 21 Jun 2021 22:06:57 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxWu7VJ1i8Hm/0dONPfTSH47PWWl51Y2auxRuPrZ3RZO7RXMkuwV8jx9BpjNZsql8zLcMnEfA== X-Received: by 2002:a17:90a:1e82:: with SMTP id x2mr2028995pjx.11.1624338417189; Mon, 21 Jun 2021 22:06:57 -0700 (PDT) Received: from wangxiaodeMacBook-Air.local ([209.132.188.80]) by smtp.gmail.com with ESMTPSA id q24sm18650112pgk.32.2021.06.21.22.06.49 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Mon, 21 Jun 2021 22:06:56 -0700 (PDT) Subject: Re: [PATCH v8 09/10] vduse: Introduce VDUSE - vDPA Device in Userspace To: Yongji Xie References: <20210615141331.407-1-xieyongji@bytedance.com> <20210615141331.407-10-xieyongji@bytedance.com> From: Jason Wang Message-ID: <1bba439f-ffc8-c20e-e8a4-ac73e890c592@redhat.com> Date: Tue, 22 Jun 2021 13:06:42 +0800 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:78.0) Gecko/20100101 Thunderbird/78.11.0 MIME-Version: 1.0 In-Reply-To: Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=jasowang@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Language: en-US Cc: kvm , "Michael S. Tsirkin" , virtualization , Christian Brauner , Jonathan Corbet , Matthew Wilcox , Christoph Hellwig , Dan Carpenter , Stefano Garzarella , Al Viro , Stefan Hajnoczi , songmuchun@bytedance.com, Jens Axboe , Greg KH , Randy Dunlap , linux-kernel , iommu@lists.linux-foundation.org, bcrl@kvack.org, netdev@vger.kernel.org, linux-fsdevel@vger.kernel.org, =?UTF-8?Q?Mika_Penttil=c3=a4?= X-BeenThere: iommu@lists.linux-foundation.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: Development issues for Linux IOMMU support List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Errors-To: iommu-bounces@lists.linux-foundation.org Sender: "iommu" CuWcqCAyMDIxLzYvMjEg5LiL5Y2INjo0MSwgWW9uZ2ppIFhpZSDlhpnpgZM6Cj4gT24gTW9uLCBK dW4gMjEsIDIwMjEgYXQgNToxNCBQTSBKYXNvbiBXYW5nIDxqYXNvd2FuZ0ByZWRoYXQuY29tPiB3 cm90ZToKPj4KPj4g5ZyoIDIwMjEvNi8xNSDkuIvljYgxMDoxMywgWGllIFlvbmdqaSDlhpnpgZM6 Cj4+PiBUaGlzIFZEVVNFIGRyaXZlciBlbmFibGVzIGltcGxlbWVudGluZyB2RFBBIGRldmljZXMg aW4gdXNlcnNwYWNlLgo+Pj4gVGhlIHZEUEEgZGV2aWNlJ3MgY29udHJvbCBwYXRoIGlzIGhhbmRs ZWQgaW4ga2VybmVsIGFuZCB0aGUgZGF0YQo+Pj4gcGF0aCBpcyBoYW5kbGVkIGluIHVzZXJzcGFj ZS4KPj4+Cj4+PiBBIG1lc3NhZ2UgbWVjaG5pc20gaXMgdXNlZCBieSBWRFVTRSBkcml2ZXIgdG8g Zm9yd2FyZCBzb21lIGNvbnRyb2wKPj4+IG1lc3NhZ2VzIHN1Y2ggYXMgc3RhcnRpbmcvc3RvcHBp bmcgZGF0YXBhdGggdG8gdXNlcnNwYWNlLiBVc2Vyc3BhY2UKPj4+IGNhbiB1c2UgcmVhZCgpL3dy aXRlKCkgdG8gcmVjZWl2ZS9yZXBseSB0aG9zZSBjb250cm9sIG1lc3NhZ2VzLgo+Pj4KPj4+IEFu ZCBzb21lIGlvY3RscyBhcmUgaW50cm9kdWNlZCB0byBoZWxwIHVzZXJzcGFjZSB0byBpbXBsZW1l bnQgdGhlCj4+PiBkYXRhIHBhdGguIFZEVVNFX0lPVExCX0dFVF9GRCBpb2N0bCBjYW4gYmUgdXNl ZCB0byBnZXQgdGhlIGZpbGUKPj4+IGRlc2NyaXB0b3JzIHJlZmVycmluZyB0byB2RFBBIGRldmlj ZSdzIGlvdmEgcmVnaW9ucy4gVGhlbiB1c2Vyc3BhY2UKPj4+IGNhbiB1c2UgbW1hcCgpIHRvIGFj Y2VzcyB0aG9zZSBpb3ZhIHJlZ2lvbnMuIFZEVVNFX0RFVl9HRVRfRkVBVFVSRVMKPj4+IGFuZCBW RFVTRV9WUV9HRVRfSU5GTyBpb2N0bHMgYXJlIHVzZWQgdG8gZ2V0IHRoZSBuZWdvdGlhdGVkIGZl YXR1cmVzCj4+PiBhbmQgbWV0YWRhdGEgb2YgdmlydHF1ZXVlcy4gVkRVU0VfSU5KRUNUX1ZRX0lS USBhbmQgVkRVU0VfVlFfU0VUVVBfS0lDS0ZECj4+PiBpb2N0bHMgY2FuIGJlIHVzZWQgdG8gaW5q ZWN0IGludGVycnVwdCBhbmQgc2V0dXAgdGhlIGtpY2tmZCBmb3IKPj4+IHZpcnRxdWV1ZXMuIFZE VVNFX0RFVl9VUERBVEVfQ09ORklHIGlvY3RsIGlzIHVzZWQgdG8gdXBkYXRlIHRoZQo+Pj4gY29u ZmlndXJhdGlvbiBzcGFjZSBhbmQgaW5qZWN0IGEgY29uZmlnIGludGVycnVwdC4KPj4+Cj4+PiBT aWduZWQtb2ZmLWJ5OiBYaWUgWW9uZ2ppIDx4aWV5b25namlAYnl0ZWRhbmNlLmNvbT4KPj4+IC0t LQo+Pj4gICAgRG9jdW1lbnRhdGlvbi91c2Vyc3BhY2UtYXBpL2lvY3RsL2lvY3RsLW51bWJlci5y c3QgfCAgICAxICsKPj4+ICAgIGRyaXZlcnMvdmRwYS9LY29uZmlnICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwgICAxMCArCj4+PiAgICBkcml2ZXJzL3ZkcGEvTWFrZWZpbGUgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICB8ICAgIDEgKwo+Pj4gICAgZHJpdmVycy92ZHBhL3ZkcGFf dXNlci9NYWtlZmlsZSAgICAgICAgICAgICAgICAgICAgfCAgICA1ICsKPj4+ICAgIGRyaXZlcnMv dmRwYS92ZHBhX3VzZXIvdmR1c2VfZGV2LmMgICAgICAgICAgICAgICAgIHwgMTQ1MyArKysrKysr KysrKysrKysrKysrKwo+Pj4gICAgaW5jbHVkZS91YXBpL2xpbnV4L3ZkdXNlLmggICAgICAgICAg ICAgICAgICAgICAgICAgfCAgMTQzICsrCj4+PiAgICA2IGZpbGVzIGNoYW5nZWQsIDE2MTMgaW5z ZXJ0aW9ucygrKQo+Pj4gICAgY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvdmRwYS92ZHBhX3Vz ZXIvTWFrZWZpbGUKPj4+ICAgIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL3ZkcGEvdmRwYV91 c2VyL3ZkdXNlX2Rldi5jCj4+PiAgICBjcmVhdGUgbW9kZSAxMDA2NDQgaW5jbHVkZS91YXBpL2xp bnV4L3ZkdXNlLmgKPj4+Cj4+PiBkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi91c2Vyc3BhY2Ut YXBpL2lvY3RsL2lvY3RsLW51bWJlci5yc3QgYi9Eb2N1bWVudGF0aW9uL3VzZXJzcGFjZS1hcGkv aW9jdGwvaW9jdGwtbnVtYmVyLnJzdAo+Pj4gaW5kZXggOWJmYzJiNTEwYzY0Li5hY2Q5NWU5ZGNm ZTcgMTAwNjQ0Cj4+PiAtLS0gYS9Eb2N1bWVudGF0aW9uL3VzZXJzcGFjZS1hcGkvaW9jdGwvaW9j dGwtbnVtYmVyLnJzdAo+Pj4gKysrIGIvRG9jdW1lbnRhdGlvbi91c2Vyc3BhY2UtYXBpL2lvY3Rs L2lvY3RsLW51bWJlci5yc3QKPj4+IEBAIC0zMDAsNiArMzAwLDcgQEAgQ29kZSAgU2VxIyAgICBJ bmNsdWRlIEZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29t bWVudHMKPj4+ICAgICd6JyAgIDEwLTRGICBkcml2ZXJzL3MzOTAvY3J5cHRvL3pjcnlwdF9hcGku aCAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZsaWN0IQo+Pj4gICAgJ3wnICAgMDAtN0YgIGxp bnV4L21lZGlhLmgKPj4+ICAgIDB4ODAgIDAwLTFGICBsaW51eC9mYi5oCj4+PiArMHg4MSAgMDAt MUYgIGxpbnV4L3ZkdXNlLmgKPj4+ICAgIDB4ODkgIDAwLTA2ICBhcmNoL3g4Ni9pbmNsdWRlL2Fz bS9zb2NraW9zLmgKPj4+ICAgIDB4ODkgIDBCLURGICBsaW51eC9zb2NraW9zLmgKPj4+ICAgIDB4 ODkgIEUwLUVGICBsaW51eC9zb2NraW9zLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIFNJT0NQUk9UT1BSSVZBVEUgcmFuZ2UKPj4+IGRpZmYgLS1naXQgYS9kcml2ZXJz L3ZkcGEvS2NvbmZpZyBiL2RyaXZlcnMvdmRwYS9LY29uZmlnCj4+PiBpbmRleCBhNTAzYzFiMmJm ZDkuLjZlMjNiY2U2NDMzYSAxMDA2NDQKPj4+IC0tLSBhL2RyaXZlcnMvdmRwYS9LY29uZmlnCj4+ PiArKysgYi9kcml2ZXJzL3ZkcGEvS2NvbmZpZwo+Pj4gQEAgLTMzLDYgKzMzLDE2IEBAIGNvbmZp ZyBWRFBBX1NJTV9CTE9DSwo+Pj4gICAgICAgICAgdkRQQSBibG9jayBkZXZpY2Ugc2ltdWxhdG9y IHdoaWNoIHRlcm1pbmF0ZXMgSU8gcmVxdWVzdCBpbiBhCj4+PiAgICAgICAgICBtZW1vcnkgYnVm ZmVyLgo+Pj4KPj4+ICtjb25maWcgVkRQQV9VU0VSCj4+PiArICAgICB0cmlzdGF0ZSAiVkRVU0Ug KHZEUEEgRGV2aWNlIGluIFVzZXJzcGFjZSkgc3VwcG9ydCIKPj4+ICsgICAgIGRlcGVuZHMgb24g RVZFTlRGRCAmJiBNTVUgJiYgSEFTX0RNQQo+Pj4gKyAgICAgc2VsZWN0IERNQV9PUFMKPj4+ICsg ICAgIHNlbGVjdCBWSE9TVF9JT1RMQgo+Pj4gKyAgICAgc2VsZWN0IElPTU1VX0lPVkEKPj4+ICsg ICAgIGhlbHAKPj4+ICsgICAgICAgV2l0aCBWRFVTRSBpdCBpcyBwb3NzaWJsZSB0byBlbXVsYXRl IGEgdkRQQSBEZXZpY2UKPj4+ICsgICAgICAgaW4gYSB1c2Vyc3BhY2UgcHJvZ3JhbS4KPj4+ICsK Pj4+ICAgIGNvbmZpZyBJRkNWRgo+Pj4gICAgICAgIHRyaXN0YXRlICJJbnRlbCBJRkMgVkYgdkRQ QSBkcml2ZXIiCj4+PiAgICAgICAgZGVwZW5kcyBvbiBQQ0lfTVNJCj4+PiBkaWZmIC0tZ2l0IGEv ZHJpdmVycy92ZHBhL01ha2VmaWxlIGIvZHJpdmVycy92ZHBhL01ha2VmaWxlCj4+PiBpbmRleCA2 N2ZlN2YzZDY5NDMuLmYwMmViZWQzM2YxOSAxMDA2NDQKPj4+IC0tLSBhL2RyaXZlcnMvdmRwYS9N YWtlZmlsZQo+Pj4gKysrIGIvZHJpdmVycy92ZHBhL01ha2VmaWxlCj4+PiBAQCAtMSw2ICsxLDcg QEAKPj4+ICAgICMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKPj4+ICAgIG9iai0k KENPTkZJR19WRFBBKSArPSB2ZHBhLm8KPj4+ICAgIG9iai0kKENPTkZJR19WRFBBX1NJTSkgKz0g dmRwYV9zaW0vCj4+PiArb2JqLSQoQ09ORklHX1ZEUEFfVVNFUikgKz0gdmRwYV91c2VyLwo+Pj4g ICAgb2JqLSQoQ09ORklHX0lGQ1ZGKSAgICArPSBpZmN2Zi8KPj4+ICAgIG9iai0kKENPTkZJR19N TFg1X1ZEUEEpICs9IG1seDUvCj4+PiAgICBvYmotJChDT05GSUdfVlBfVkRQQSkgICAgKz0gdmly dGlvX3BjaS8KPj4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL3ZkcGEvdmRwYV91c2VyL01ha2VmaWxl IGIvZHJpdmVycy92ZHBhL3ZkcGFfdXNlci9NYWtlZmlsZQo+Pj4gbmV3IGZpbGUgbW9kZSAxMDA2 NDQKPj4+IGluZGV4IDAwMDAwMDAwMDAwMC4uMjYwZTBiMjZhZjk5Cj4+PiAtLS0gL2Rldi9udWxs Cj4+PiArKysgYi9kcml2ZXJzL3ZkcGEvdmRwYV91c2VyL01ha2VmaWxlCj4+PiBAQCAtMCwwICsx LDUgQEAKPj4+ICsjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCj4+PiArCj4+PiAr dmR1c2UteSA6PSB2ZHVzZV9kZXYubyBpb3ZhX2RvbWFpbi5vCj4+PiArCj4+PiArb2JqLSQoQ09O RklHX1ZEUEFfVVNFUikgKz0gdmR1c2Uubwo+Pj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmRwYS92 ZHBhX3VzZXIvdmR1c2VfZGV2LmMgYi9kcml2ZXJzL3ZkcGEvdmRwYV91c2VyL3ZkdXNlX2Rldi5j Cj4+PiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+Pj4gaW5kZXggMDAwMDAwMDAwMDAwLi41MjcxY2Jk MTVlMjgKPj4+IC0tLSAvZGV2L251bGwKPj4+ICsrKyBiL2RyaXZlcnMvdmRwYS92ZHBhX3VzZXIv dmR1c2VfZGV2LmMKPj4+IEBAIC0wLDAgKzEsMTQ1MyBAQAo+Pj4gKy8vIFNQRFgtTGljZW5zZS1J ZGVudGlmaWVyOiBHUEwtMi4wLW9ubHkKPj4+ICsvKgo+Pj4gKyAqIFZEVVNFOiB2RFBBIERldmlj ZSBpbiBVc2Vyc3BhY2UKPj4+ICsgKgo+Pj4gKyAqIENvcHlyaWdodCAoQykgMjAyMC0yMDIxIEJ5 dGVkYW5jZSBJbmMuIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K Pj4+ICsgKgo+Pj4gKyAqIEF1dGhvcjogWGllIFlvbmdqaSA8eGlleW9uZ2ppQGJ5dGVkYW5jZS5j b20+Cj4+PiArICoKPj4+ICsgKi8KPj4+ICsKPj4+ICsjaW5jbHVkZSA8bGludXgvaW5pdC5oPgo+ Pj4gKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KPj4+ICsjaW5jbHVkZSA8bGludXgvY2Rldi5o Pgo+Pj4gKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KPj4+ICsjaW5jbHVkZSA8bGludXgvZXZl bnRmZC5oPgo+Pj4gKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Cj4+PiArI2luY2x1ZGUgPGxpbnV4 L3dhaXQuaD4KPj4+ICsjaW5jbHVkZSA8bGludXgvZG1hLW1hcC1vcHMuaD4KPj4+ICsjaW5jbHVk ZSA8bGludXgvcG9sbC5oPgo+Pj4gKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+Cj4+PiArI2luY2x1 ZGUgPGxpbnV4L3Vpby5oPgo+Pj4gKyNpbmNsdWRlIDxsaW51eC92ZHBhLmg+Cj4+PiArI2luY2x1 ZGUgPGxpbnV4L25vc3BlYy5oPgo+Pj4gKyNpbmNsdWRlIDx1YXBpL2xpbnV4L3ZkdXNlLmg+Cj4+ PiArI2luY2x1ZGUgPHVhcGkvbGludXgvdmRwYS5oPgo+Pj4gKyNpbmNsdWRlIDx1YXBpL2xpbnV4 L3ZpcnRpb19jb25maWcuaD4KPj4+ICsjaW5jbHVkZSA8dWFwaS9saW51eC92aXJ0aW9faWRzLmg+ Cj4+PiArI2luY2x1ZGUgPHVhcGkvbGludXgvdmlydGlvX2Jsay5oPgo+Pj4gKyNpbmNsdWRlIDxs aW51eC9tb2RfZGV2aWNldGFibGUuaD4KPj4+ICsKPj4+ICsjaW5jbHVkZSAiaW92YV9kb21haW4u aCIKPj4+ICsKPj4+ICsjZGVmaW5lIERSVl9BVVRIT1IgICAiWW9uZ2ppIFhpZSA8eGlleW9uZ2pp QGJ5dGVkYW5jZS5jb20+Igo+Pj4gKyNkZWZpbmUgRFJWX0RFU0MgICAgICJ2RFBBIERldmljZSBp biBVc2Vyc3BhY2UiCj4+PiArI2RlZmluZSBEUlZfTElDRU5TRSAgIkdQTCB2MiIKPj4+ICsKPj4+ ICsjZGVmaW5lIFZEVVNFX0RFVl9NQVggKDFVIDw8IE1JTk9SQklUUykKPj4+ICsjZGVmaW5lIFZE VVNFX01BWF9CT1VOQ0VfU0laRSAoNjQgKiAxMDI0ICogMTAyNCkKPj4+ICsjZGVmaW5lIFZEVVNF X0lPVkFfU0laRSAoMTI4ICogMTAyNCAqIDEwMjQpCj4+PiArI2RlZmluZSBWRFVTRV9SRVFVRVNU X1RJTUVPVVQgMzAKPj4+ICsKPj4+ICtzdHJ1Y3QgdmR1c2VfdmlydHF1ZXVlIHsKPj4+ICsgICAg IHUxNiBpbmRleDsKPj4+ICsgICAgIHUzMiBudW07Cj4+PiArICAgICB1MzIgYXZhaWxfaWR4Owo+ Pj4gKyAgICAgdTY0IGRlc2NfYWRkcjsKPj4+ICsgICAgIHU2NCBkcml2ZXJfYWRkcjsKPj4+ICsg ICAgIHU2NCBkZXZpY2VfYWRkcjsKPj4+ICsgICAgIGJvb2wgcmVhZHk7Cj4+PiArICAgICBib29s IGtpY2tlZDsKPj4+ICsgICAgIHNwaW5sb2NrX3Qga2lja19sb2NrOwo+Pj4gKyAgICAgc3Bpbmxv Y2tfdCBpcnFfbG9jazsKPj4+ICsgICAgIHN0cnVjdCBldmVudGZkX2N0eCAqa2lja2ZkOwo+Pj4g KyAgICAgc3RydWN0IHZkcGFfY2FsbGJhY2sgY2I7Cj4+PiArICAgICBzdHJ1Y3Qgd29ya19zdHJ1 Y3QgaW5qZWN0Owo+Pj4gK307Cj4+PiArCj4+PiArc3RydWN0IHZkdXNlX2RldjsKPj4+ICsKPj4+ ICtzdHJ1Y3QgdmR1c2VfdmRwYSB7Cj4+PiArICAgICBzdHJ1Y3QgdmRwYV9kZXZpY2UgdmRwYTsK Pj4+ICsgICAgIHN0cnVjdCB2ZHVzZV9kZXYgKmRldjsKPj4+ICt9Owo+Pj4gKwo+Pj4gK3N0cnVj dCB2ZHVzZV9kZXYgewo+Pj4gKyAgICAgc3RydWN0IHZkdXNlX3ZkcGEgKnZkZXY7Cj4+PiArICAg ICBzdHJ1Y3QgZGV2aWNlICpkZXY7Cj4+PiArICAgICBzdHJ1Y3QgdmR1c2VfdmlydHF1ZXVlICp2 cXM7Cj4+PiArICAgICBzdHJ1Y3QgdmR1c2VfaW92YV9kb21haW4gKmRvbWFpbjsKPj4+ICsgICAg IGNoYXIgKm5hbWU7Cj4+PiArICAgICBzdHJ1Y3QgbXV0ZXggbG9jazsKPj4+ICsgICAgIHNwaW5s b2NrX3QgbXNnX2xvY2s7Cj4+PiArICAgICB1NjQgbXNnX3VuaXF1ZTsKPj4+ICsgICAgIHdhaXRf cXVldWVfaGVhZF90IHdhaXRxOwo+Pj4gKyAgICAgc3RydWN0IGxpc3RfaGVhZCBzZW5kX2xpc3Q7 Cj4+PiArICAgICBzdHJ1Y3QgbGlzdF9oZWFkIHJlY3ZfbGlzdDsKPj4+ICsgICAgIHN0cnVjdCB2 ZHBhX2NhbGxiYWNrIGNvbmZpZ19jYjsKPj4+ICsgICAgIHN0cnVjdCB3b3JrX3N0cnVjdCBpbmpl Y3Q7Cj4+PiArICAgICBzcGlubG9ja190IGlycV9sb2NrOwo+Pj4gKyAgICAgaW50IG1pbm9yOwo+ Pj4gKyAgICAgYm9vbCBjb25uZWN0ZWQ7Cj4+PiArICAgICBib29sIHN0YXJ0ZWQ7Cj4+PiArICAg ICB1NjQgYXBpX3ZlcnNpb247Cj4+PiArICAgICB1NjQgdXNlcl9mZWF0dXJlczsKPj4KPj4gTGV0 J3MgdXNlIGRldmljZV9mZWF0dXJlcy4KPj4KPiBPSy4KPgo+Pj4gKyAgICAgdTY0IGZlYXR1cmVz Owo+Pgo+PiBBbmQgZHJpdmVyIGZlYXR1cmVzLgo+Pgo+IE9LLgo+Cj4+PiArICAgICB1MzIgZGV2 aWNlX2lkOwo+Pj4gKyAgICAgdTMyIHZlbmRvcl9pZDsKPj4+ICsgICAgIHUzMiBnZW5lcmF0aW9u Owo+Pj4gKyAgICAgdTMyIGNvbmZpZ19zaXplOwo+Pj4gKyAgICAgdm9pZCAqY29uZmlnOwo+Pj4g KyAgICAgdTggc3RhdHVzOwo+Pj4gKyAgICAgdTE2IHZxX3NpemVfbWF4Owo+Pj4gKyAgICAgdTMy IHZxX251bTsKPj4+ICsgICAgIHUzMiB2cV9hbGlnbjsKPj4+ICt9Owo+Pj4gKwo+Pj4gK3N0cnVj dCB2ZHVzZV9kZXZfbXNnIHsKPj4+ICsgICAgIHN0cnVjdCB2ZHVzZV9kZXZfcmVxdWVzdCByZXE7 Cj4+PiArICAgICBzdHJ1Y3QgdmR1c2VfZGV2X3Jlc3BvbnNlIHJlc3A7Cj4+PiArICAgICBzdHJ1 Y3QgbGlzdF9oZWFkIGxpc3Q7Cj4+PiArICAgICB3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0cTsKPj4+ ICsgICAgIGJvb2wgY29tcGxldGVkOwo+Pj4gK307Cj4+PiArCj4+PiArc3RydWN0IHZkdXNlX2Nv bnRyb2wgewo+Pj4gKyAgICAgdTY0IGFwaV92ZXJzaW9uOwo+Pj4gK307Cj4+PiArCj4+PiArc3Rh dGljIERFRklORV9NVVRFWCh2ZHVzZV9sb2NrKTsKPj4+ICtzdGF0aWMgREVGSU5FX0lEUih2ZHVz ZV9pZHIpOwo+Pj4gKwo+Pj4gK3N0YXRpYyBkZXZfdCB2ZHVzZV9tYWpvcjsKPj4+ICtzdGF0aWMg c3RydWN0IGNsYXNzICp2ZHVzZV9jbGFzczsKPj4+ICtzdGF0aWMgc3RydWN0IGNkZXYgdmR1c2Vf Y3RybF9jZGV2Owo+Pj4gK3N0YXRpYyBzdHJ1Y3QgY2RldiB2ZHVzZV9jZGV2Owo+Pj4gK3N0YXRp YyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqdmR1c2VfaXJxX3dxOwo+Pj4gKwo+Pj4gK3N0YXRp YyB1MzIgYWxsb3dlZF9kZXZpY2VfaWRbXSA9IHsKPj4+ICsgICAgIFZJUlRJT19JRF9CTE9DSywK Pj4+ICt9Owo+Pj4gKwo+Pj4gK3N0YXRpYyBpbmxpbmUgc3RydWN0IHZkdXNlX2RldiAqdmRwYV90 b192ZHVzZShzdHJ1Y3QgdmRwYV9kZXZpY2UgKnZkcGEpCj4+PiArewo+Pj4gKyAgICAgc3RydWN0 IHZkdXNlX3ZkcGEgKnZkZXYgPSBjb250YWluZXJfb2YodmRwYSwgc3RydWN0IHZkdXNlX3ZkcGEs IHZkcGEpOwo+Pj4gKwo+Pj4gKyAgICAgcmV0dXJuIHZkZXYtPmRldjsKPj4+ICt9Cj4+PiArCj4+ PiArc3RhdGljIGlubGluZSBzdHJ1Y3QgdmR1c2VfZGV2ICpkZXZfdG9fdmR1c2Uoc3RydWN0IGRl dmljZSAqZGV2KQo+Pj4gK3sKPj4+ICsgICAgIHN0cnVjdCB2ZHBhX2RldmljZSAqdmRwYSA9IGRl dl90b192ZHBhKGRldik7Cj4+PiArCj4+PiArICAgICByZXR1cm4gdmRwYV90b192ZHVzZSh2ZHBh KTsKPj4+ICt9Cj4+PiArCj4+PiArc3RhdGljIHN0cnVjdCB2ZHVzZV9kZXZfbXNnICp2ZHVzZV9m aW5kX21zZyhzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkLAo+Pj4gKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmVxdWVzdF9pZCkKPj4+ICt7Cj4+PiArICAg ICBzdHJ1Y3QgdmR1c2VfZGV2X21zZyAqbXNnOwo+Pj4gKwo+Pj4gKyAgICAgbGlzdF9mb3JfZWFj aF9lbnRyeShtc2csIGhlYWQsIGxpc3QpIHsKPj4+ICsgICAgICAgICAgICAgaWYgKG1zZy0+cmVx LnJlcXVlc3RfaWQgPT0gcmVxdWVzdF9pZCkgewo+Pj4gKyAgICAgICAgICAgICAgICAgICAgIGxp c3RfZGVsKCZtc2ctPmxpc3QpOwo+Pj4gKyAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtc2c7 Cj4+PiArICAgICAgICAgICAgIH0KPj4+ICsgICAgIH0KPj4+ICsKPj4+ICsgICAgIHJldHVybiBO VUxMOwo+Pj4gK30KPj4+ICsKPj4+ICtzdGF0aWMgc3RydWN0IHZkdXNlX2Rldl9tc2cgKnZkdXNl X2RlcXVldWVfbXNnKHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCj4+PiArewo+Pj4gKyAgICAgc3Ry dWN0IHZkdXNlX2Rldl9tc2cgKm1zZyA9IE5VTEw7Cj4+PiArCj4+PiArICAgICBpZiAoIWxpc3Rf ZW1wdHkoaGVhZCkpIHsKPj4+ICsgICAgICAgICAgICAgbXNnID0gbGlzdF9maXJzdF9lbnRyeSho ZWFkLCBzdHJ1Y3QgdmR1c2VfZGV2X21zZywgbGlzdCk7Cj4+PiArICAgICAgICAgICAgIGxpc3Rf ZGVsKCZtc2ctPmxpc3QpOwo+Pj4gKyAgICAgfQo+Pj4gKwo+Pj4gKyAgICAgcmV0dXJuIG1zZzsK Pj4+ICt9Cj4+PiArCj4+PiArc3RhdGljIHZvaWQgdmR1c2VfZW5xdWV1ZV9tc2coc3RydWN0IGxp c3RfaGVhZCAqaGVhZCwKPj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdmR1 c2VfZGV2X21zZyAqbXNnKQo+Pj4gK3sKPj4+ICsgICAgIGxpc3RfYWRkX3RhaWwoJm1zZy0+bGlz dCwgaGVhZCk7Cj4+PiArfQo+Pj4gKwo+Pj4gK3N0YXRpYyBpbnQgdmR1c2VfZGV2X21zZ19zZW5k KHN0cnVjdCB2ZHVzZV9kZXYgKmRldiwKPj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICBz dHJ1Y3QgdmR1c2VfZGV2X21zZyAqbXNnLCBib29sIG5vX3JlcGx5KQo+Pj4gK3sKPj4KPj4gSXQg bG9va3MgdG8gbWUgdGhlIG9ubHkgdXNlciBmb3Igbm9fcmVwbHk9dHJ1ZSBpcyB0aGUgZGF0YXBs YW5lIHN0YXJ0LiBJCj4+IHdvbmRlciBub19yZXBseSBpcyByZWFsbHkgbmVlZGVkIGNvbnNpZGVy IHdlIGhhdmUgc3dpdGNoZWQgdG8gdXNlCj4+IHdhaXRfZXZlbnRfa2lsbGFibGVfdGltZW91dCgp Lgo+Pgo+IERvIHdlIG5lZWQgdG8gaGFuZGxlIHRoZSBlcnJvciBpbiB0aGlzIGNhc2UgaWYgd2Ug cmVtb3ZlIHRoZSBub19yZXBseQo+IGZsYWcuIFByaW50IGEgd2FybmluZyBtZXNzYWdlPwoKClNl ZSBiZWxvdy4KCgo+Cj4+IEluIGFub3RoZXIgd2F5LCBub19yZXBseSBpcyBmYWxzZSBmb3IgdnEg c3RhdGUgc3luY2hyb25pemF0aW9uIGFuZCBJT1RMQgo+PiB1cGRhdGluZy4gSSB3b25kZXIgaWYg d2UgY2FuIHNpbXBseSB1c2Ugbm9fcmVwbHkgPSB0cnVlIGZvciB0aGVtLgo+Pgo+IExvb2tzIGxp a2Ugd2UgY2FuJ3QsIGUuZy4gd2UgbmVlZCB0byBnZXQgYSByZXBseSBmcm9tIHVzZXJzcGFjZSBm b3IgdnEgc3RhdGUuCgoKUmlnaHQuCgoKPgo+Pj4gKyAgICAgaW5pdF93YWl0cXVldWVfaGVhZCgm bXNnLT53YWl0cSk7Cj4+PiArICAgICBzcGluX2xvY2soJmRldi0+bXNnX2xvY2spOwo+Pj4gKyAg ICAgbXNnLT5yZXEucmVxdWVzdF9pZCA9IGRldi0+bXNnX3VuaXF1ZSsrOwo+Pj4gKyAgICAgdmR1 c2VfZW5xdWV1ZV9tc2coJmRldi0+c2VuZF9saXN0LCBtc2cpOwo+Pj4gKyAgICAgd2FrZV91cCgm ZGV2LT53YWl0cSk7Cj4+PiArICAgICBzcGluX3VubG9jaygmZGV2LT5tc2dfbG9jayk7Cj4+PiAr ICAgICBpZiAobm9fcmVwbHkpCj4+PiArICAgICAgICAgICAgIHJldHVybiAwOwo+Pj4gKwo+Pj4g KyAgICAgd2FpdF9ldmVudF9raWxsYWJsZV90aW1lb3V0KG1zZy0+d2FpdHEsIG1zZy0+Y29tcGxl dGVkLAo+Pj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZEVVNFX1JFUVVFU1Rf VElNRU9VVCAqIEhaKTsKPj4+ICsgICAgIHNwaW5fbG9jaygmZGV2LT5tc2dfbG9jayk7Cj4+PiAr ICAgICBpZiAoIW1zZy0+Y29tcGxldGVkKSB7Cj4+PiArICAgICAgICAgICAgIGxpc3RfZGVsKCZt c2ctPmxpc3QpOwo+Pj4gKyAgICAgICAgICAgICBtc2ctPnJlc3AucmVzdWx0ID0gVkRVU0VfUkVR X1JFU1VMVF9GQUlMRUQ7Cj4+PiArICAgICB9Cj4+PiArICAgICBzcGluX3VubG9jaygmZGV2LT5t c2dfbG9jayk7Cj4+PiArCj4+PiArICAgICByZXR1cm4gKG1zZy0+cmVzcC5yZXN1bHQgPT0gVkRV U0VfUkVRX1JFU1VMVF9PSykgPyAwIDogLUVJTzsKPj4KPj4gRG8gd2UgbmVlZCB0byBzZXJpYWxp emUgdGhlIGNoZWNrIGJ5IHByb3RlY3RpbmcgaXQgd2l0aCB0aGUgc3BpbmxvY2sgYWJvdmU/Cj4+ Cj4gR29vZCBwb2ludC4KPgo+Pj4gK30KPj4+ICsKPj4+ICtzdGF0aWMgdm9pZCB2ZHVzZV9kZXZf bXNnX2NsZWFudXAoc3RydWN0IHZkdXNlX2RldiAqZGV2KQo+Pj4gK3sKPj4+ICsgICAgIHN0cnVj dCB2ZHVzZV9kZXZfbXNnICptc2c7Cj4+PiArCj4+PiArICAgICBzcGluX2xvY2soJmRldi0+bXNn X2xvY2spOwo+Pj4gKyAgICAgd2hpbGUgKChtc2cgPSB2ZHVzZV9kZXF1ZXVlX21zZygmZGV2LT5z ZW5kX2xpc3QpKSkgewo+Pj4gKyAgICAgICAgICAgICBpZiAobXNnLT5yZXEuZmxhZ3MgJiBWRFVT RV9SRVFfRkxBR1NfTk9fUkVQTFkpCj4+PiArICAgICAgICAgICAgICAgICAgICAga2ZyZWUobXNn KTsKPj4+ICsgICAgICAgICAgICAgZWxzZQo+Pj4gKyAgICAgICAgICAgICAgICAgICAgIHZkdXNl X2VucXVldWVfbXNnKCZkZXYtPnJlY3ZfbGlzdCwgbXNnKTsKPj4+ICsgICAgIH0KPj4+ICsgICAg IHdoaWxlICgobXNnID0gdmR1c2VfZGVxdWV1ZV9tc2coJmRldi0+cmVjdl9saXN0KSkpIHsKPj4+ ICsgICAgICAgICAgICAgbXNnLT5yZXNwLnJlc3VsdCA9IFZEVVNFX1JFUV9SRVNVTFRfRkFJTEVE Owo+Pj4gKyAgICAgICAgICAgICBtc2ctPmNvbXBsZXRlZCA9IDE7Cj4+PiArICAgICAgICAgICAg IHdha2VfdXAoJm1zZy0+d2FpdHEpOwo+Pj4gKyAgICAgfQo+Pj4gKyAgICAgc3Bpbl91bmxvY2so JmRldi0+bXNnX2xvY2spOwo+Pj4gK30KPj4+ICsKPj4+ICtzdGF0aWMgdm9pZCB2ZHVzZV9kZXZf c3RhcnRfZGF0YXBsYW5lKHN0cnVjdCB2ZHVzZV9kZXYgKmRldikKPj4+ICt7Cj4+PiArICAgICBz dHJ1Y3QgdmR1c2VfZGV2X21zZyAqbXNnID0ga3phbGxvYyhzaXplb2YoKm1zZyksCj4+PiArICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRlBfS0VSTkVMIHwgX19HRlBf Tk9GQUlMKTsKPj4+ICsKPj4+ICsgICAgIG1zZy0+cmVxLnR5cGUgPSBWRFVTRV9TVEFSVF9EQVRB UExBTkU7Cj4+PiArICAgICBtc2ctPnJlcS5mbGFncyB8PSBWRFVTRV9SRVFfRkxBR1NfTk9fUkVQ TFk7Cj4+PiArICAgICB2ZHVzZV9kZXZfbXNnX3NlbmQoZGV2LCBtc2csIHRydWUpOwo+Pj4gK30K Pj4+ICsKPj4+ICtzdGF0aWMgdm9pZCB2ZHVzZV9kZXZfc3RvcF9kYXRhcGxhbmUoc3RydWN0IHZk dXNlX2RldiAqZGV2KQo+Pj4gK3sKPj4+ICsgICAgIHN0cnVjdCB2ZHVzZV9kZXZfbXNnICptc2cg PSBremFsbG9jKHNpemVvZigqbXNnKSwKPj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIEdGUF9LRVJORUwgfCBfX0dGUF9OT0ZBSUwpOwo+Pj4gKwo+Pj4gKyAgICAg bXNnLT5yZXEudHlwZSA9IFZEVVNFX1NUT1BfREFUQVBMQU5FOwo+Pj4gKyAgICAgbXNnLT5yZXEu ZmxhZ3MgfD0gVkRVU0VfUkVRX0ZMQUdTX05PX1JFUExZOwo+Pgo+PiBDYW4gd2Ugc2ltcGx5IHVz ZSB0aGlzIGZsYWcgaW5zdGVhZCBvZiBpbnRyb2R1Y2luZyBhIG5ldyBwYXJhbWV0ZXIKPj4gKG5v X3JlcGx5KSBpbiB2ZHVzZV9kZXZfbXNnX3NlbmQoKT8KPj4KPiBMb29rcyBnb29kIHRvIG1lLgo+ Cj4+PiArICAgICB2ZHVzZV9kZXZfbXNnX3NlbmQoZGV2LCBtc2csIHRydWUpOwo+Pj4gK30KPj4+ ICsKPj4+ICtzdGF0aWMgaW50IHZkdXNlX2Rldl9nZXRfdnFfc3RhdGUoc3RydWN0IHZkdXNlX2Rl diAqZGV2LAo+Pj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdmR1c2Vf dmlydHF1ZXVlICp2cSwKPj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0 IHZkcGFfdnFfc3RhdGUgKnN0YXRlKQo+Pj4gK3sKPj4+ICsgICAgIHN0cnVjdCB2ZHVzZV9kZXZf bXNnIG1zZyA9IHsgMCB9Owo+Pj4gKyAgICAgaW50IHJldDsKPj4KPj4gTm90ZSB0aGF0IEkgcG9z dCBhIHNlcmllcyB0aGF0IGltcGxlbWVudCB0aGUgcGFja2VkIHZpcnRxdWV1ZSBzdXBwb3J0Ogo+ Pgo+PiBodHRwczovL2xpc3RzLmxpbnV4Zm91bmRhdGlvbi5vcmcvcGlwZXJtYWlsL3ZpcnR1YWxp emF0aW9uLzIwMjEtSnVuZS8wNTQ1MDEuaHRtbAo+Pgo+PiBTbyB0aGlzIHBhdGNoIG5lZWRzIHRv IGJlIHVwZGF0ZWQgYXMgd2VsbC4KPj4KPiBXaWxsIGRvIGl0Lgo+Cj4+PiArCj4+PiArICAgICBt c2cucmVxLnR5cGUgPSBWRFVTRV9HRVRfVlFfU1RBVEU7Cj4+PiArICAgICBtc2cucmVxLnZxX3N0 YXRlLmluZGV4ID0gdnEtPmluZGV4Owo+Pj4gKwo+Pj4gKyAgICAgcmV0ID0gdmR1c2VfZGV2X21z Z19zZW5kKGRldiwgJm1zZywgZmFsc2UpOwo+Pj4gKyAgICAgaWYgKHJldCkKPj4+ICsgICAgICAg ICAgICAgcmV0dXJuIHJldDsKPj4+ICsKPj4+ICsgICAgIHN0YXRlLT5hdmFpbF9pbmRleCA9IG1z Zy5yZXNwLnZxX3N0YXRlLmF2YWlsX2lkeDsKPj4+ICsgICAgIHJldHVybiAwOwo+Pj4gK30KPj4+ ICsKPj4+ICtzdGF0aWMgaW50IHZkdXNlX2Rldl91cGRhdGVfaW90bGIoc3RydWN0IHZkdXNlX2Rl diAqZGV2LAo+Pj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTY0IHN0YXJ0LCB1NjQg bGFzdCkKPj4+ICt7Cj4+PiArICAgICBzdHJ1Y3QgdmR1c2VfZGV2X21zZyBtc2cgPSB7IDAgfTsK Pj4+ICsKPj4+ICsgICAgIGlmIChsYXN0IDwgc3RhcnQpCj4+PiArICAgICAgICAgICAgIHJldHVy biAtRUlOVkFMOwo+Pj4gKwo+Pj4gKyAgICAgbXNnLnJlcS50eXBlID0gVkRVU0VfVVBEQVRFX0lP VExCOwo+Pj4gKyAgICAgbXNnLnJlcS5pb3ZhLnN0YXJ0ID0gc3RhcnQ7Cj4+PiArICAgICBtc2cu cmVxLmlvdmEubGFzdCA9IGxhc3Q7Cj4+PiArCj4+PiArICAgICByZXR1cm4gdmR1c2VfZGV2X21z Z19zZW5kKGRldiwgJm1zZywgZmFsc2UpOwo+Pj4gK30KPj4+ICsKPj4+ICtzdGF0aWMgc3NpemVf dCB2ZHVzZV9kZXZfcmVhZF9pdGVyKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IGlvdl9pdGVy ICp0bykKPj4+ICt7Cj4+PiArICAgICBzdHJ1Y3QgZmlsZSAqZmlsZSA9IGlvY2ItPmtpX2ZpbHA7 Cj4+PiArICAgICBzdHJ1Y3QgdmR1c2VfZGV2ICpkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7Cj4+ PiArICAgICBzdHJ1Y3QgdmR1c2VfZGV2X21zZyAqbXNnOwo+Pj4gKyAgICAgaW50IHNpemUgPSBz aXplb2Yoc3RydWN0IHZkdXNlX2Rldl9yZXF1ZXN0KTsKPj4+ICsgICAgIHNzaXplX3QgcmV0Owo+ Pj4gKwo+Pj4gKyAgICAgaWYgKGlvdl9pdGVyX2NvdW50KHRvKSA8IHNpemUpCj4+PiArICAgICAg ICAgICAgIHJldHVybiAtRUlOVkFMOwo+Pj4gKwo+Pj4gKyAgICAgc3Bpbl9sb2NrKCZkZXYtPm1z Z19sb2NrKTsKPj4+ICsgICAgIHdoaWxlICgxKSB7Cj4+PiArICAgICAgICAgICAgIG1zZyA9IHZk dXNlX2RlcXVldWVfbXNnKCZkZXYtPnNlbmRfbGlzdCk7Cj4+PiArICAgICAgICAgICAgIGlmICht c2cpCj4+PiArICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Cj4+PiArCj4+PiArICAgICAgICAg ICAgIHJldCA9IC1FQUdBSU47Cj4+PiArICAgICAgICAgICAgIGlmIChmaWxlLT5mX2ZsYWdzICYg T19OT05CTE9DSykKPj4+ICsgICAgICAgICAgICAgICAgICAgICBnb3RvIHVubG9jazsKPj4+ICsK Pj4+ICsgICAgICAgICAgICAgc3Bpbl91bmxvY2soJmRldi0+bXNnX2xvY2spOwo+Pj4gKyAgICAg ICAgICAgICByZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfZXhjbHVzaXZlKGRldi0+d2Fp dHEsCj4+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFsaXN0X2VtcHR5 KCZkZXYtPnNlbmRfbGlzdCkpOwo+Pj4gKyAgICAgICAgICAgICBpZiAocmV0KQo+Pj4gKyAgICAg ICAgICAgICAgICAgICAgIHJldHVybiByZXQ7Cj4+PiArCj4+PiArICAgICAgICAgICAgIHNwaW5f bG9jaygmZGV2LT5tc2dfbG9jayk7Cj4+PiArICAgICB9Cj4+PiArICAgICBzcGluX3VubG9jaygm ZGV2LT5tc2dfbG9jayk7Cj4+PiArICAgICByZXQgPSBjb3B5X3RvX2l0ZXIoJm1zZy0+cmVxLCBz aXplLCB0byk7Cj4+PiArICAgICBzcGluX2xvY2soJmRldi0+bXNnX2xvY2spOwo+Pj4gKyAgICAg aWYgKHJldCAhPSBzaXplKSB7Cj4+PiArICAgICAgICAgICAgIHJldCA9IC1FRkFVTFQ7Cj4+PiAr ICAgICAgICAgICAgIHZkdXNlX2VucXVldWVfbXNnKCZkZXYtPnNlbmRfbGlzdCwgbXNnKTsKPj4+ ICsgICAgICAgICAgICAgZ290byB1bmxvY2s7Cj4+PiArICAgICB9Cj4+PiArICAgICBpZiAobXNn LT5yZXEuZmxhZ3MgJiBWRFVTRV9SRVFfRkxBR1NfTk9fUkVQTFkpCj4+PiArICAgICAgICAgICAg IGtmcmVlKG1zZyk7Cj4+PiArICAgICBlbHNlCj4+PiArICAgICAgICAgICAgIHZkdXNlX2VucXVl dWVfbXNnKCZkZXYtPnJlY3ZfbGlzdCwgbXNnKTsKPj4+ICt1bmxvY2s6Cj4+PiArICAgICBzcGlu X3VubG9jaygmZGV2LT5tc2dfbG9jayk7Cj4+PiArCj4+PiArICAgICByZXR1cm4gcmV0Owo+Pj4g K30KPj4+ICsKPj4+ICtzdGF0aWMgc3NpemVfdCB2ZHVzZV9kZXZfd3JpdGVfaXRlcihzdHJ1Y3Qg a2lvY2IgKmlvY2IsIHN0cnVjdCBpb3ZfaXRlciAqZnJvbSkKPj4+ICt7Cj4+PiArICAgICBzdHJ1 Y3QgZmlsZSAqZmlsZSA9IGlvY2ItPmtpX2ZpbHA7Cj4+PiArICAgICBzdHJ1Y3QgdmR1c2VfZGV2 ICpkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7Cj4+PiArICAgICBzdHJ1Y3QgdmR1c2VfZGV2X3Jl c3BvbnNlIHJlc3A7Cj4+PiArICAgICBzdHJ1Y3QgdmR1c2VfZGV2X21zZyAqbXNnOwo+Pj4gKyAg ICAgc2l6ZV90IHJldDsKPj4+ICsKPj4+ICsgICAgIHJldCA9IGNvcHlfZnJvbV9pdGVyKCZyZXNw LCBzaXplb2YocmVzcCksIGZyb20pOwo+Pj4gKyAgICAgaWYgKHJldCAhPSBzaXplb2YocmVzcCkp Cj4+PiArICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwo+Pj4gKwo+Pj4gKyAgICAgc3Bpbl9s b2NrKCZkZXYtPm1zZ19sb2NrKTsKPj4+ICsgICAgIG1zZyA9IHZkdXNlX2ZpbmRfbXNnKCZkZXYt PnJlY3ZfbGlzdCwgcmVzcC5yZXF1ZXN0X2lkKTsKPj4+ICsgICAgIGlmICghbXNnKSB7Cj4+PiAr ICAgICAgICAgICAgIHJldCA9IC1FTk9FTlQ7Cj4+PiArICAgICAgICAgICAgIGdvdG8gdW5sb2Nr Owo+Pj4gKyAgICAgfQo+Pj4gKwo+Pj4gKyAgICAgbWVtY3B5KCZtc2ctPnJlc3AsICZyZXNwLCBz aXplb2YocmVzcCkpOwo+Pj4gKyAgICAgbXNnLT5jb21wbGV0ZWQgPSAxOwo+Pj4gKyAgICAgd2Fr ZV91cCgmbXNnLT53YWl0cSk7Cj4+PiArdW5sb2NrOgo+Pj4gKyAgICAgc3Bpbl91bmxvY2soJmRl di0+bXNnX2xvY2spOwo+Pj4gKwo+Pj4gKyAgICAgcmV0dXJuIHJldDsKPj4+ICt9Cj4+PiArCj4+ PiArc3RhdGljIF9fcG9sbF90IHZkdXNlX2Rldl9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xs X3RhYmxlICp3YWl0KQo+Pj4gK3sKPj4+ICsgICAgIHN0cnVjdCB2ZHVzZV9kZXYgKmRldiA9IGZp bGUtPnByaXZhdGVfZGF0YTsKPj4+ICsgICAgIF9fcG9sbF90IG1hc2sgPSAwOwo+Pj4gKwo+Pj4g KyAgICAgcG9sbF93YWl0KGZpbGUsICZkZXYtPndhaXRxLCB3YWl0KTsKPj4+ICsKPj4+ICsgICAg IGlmICghbGlzdF9lbXB0eSgmZGV2LT5zZW5kX2xpc3QpKQo+Pj4gKyAgICAgICAgICAgICBtYXNr IHw9IEVQT0xMSU4gfCBFUE9MTFJETk9STTsKPj4+ICsgICAgIGlmICghbGlzdF9lbXB0eSgmZGV2 LT5yZWN2X2xpc3QpKQo+Pj4gKyAgICAgICAgICAgICBtYXNrIHw9IEVQT0xMT1VUIHwgRVBPTExX Uk5PUk07Cj4+PiArCj4+PiArICAgICByZXR1cm4gbWFzazsKPj4+ICt9Cj4+PiArCj4+PiArc3Rh dGljIHZvaWQgdmR1c2VfZGV2X3Jlc2V0KHN0cnVjdCB2ZHVzZV9kZXYgKmRldikKPj4+ICt7Cj4+ PiArICAgICBpbnQgaTsKPj4+ICsgICAgIHN0cnVjdCB2ZHVzZV9pb3ZhX2RvbWFpbiAqZG9tYWlu ID0gZGV2LT5kb21haW47Cj4+PiArCj4+PiArICAgICAvKiBUaGUgY29oZXJlbnQgbWFwcGluZ3Mg YXJlIGhhbmRsZWQgaW4gdmR1c2VfZGV2X2ZyZWVfY29oZXJlbnQoKSAqLwo+Pj4gKyAgICAgaWYg KGRvbWFpbi0+Ym91bmNlX21hcCkKPj4+ICsgICAgICAgICAgICAgdmR1c2VfZG9tYWluX3Jlc2V0 X2JvdW5jZV9tYXAoZG9tYWluKTsKPj4+ICsKPj4+ICsgICAgIGRldi0+ZmVhdHVyZXMgPSAwOwo+ Pj4gKyAgICAgZGV2LT5nZW5lcmF0aW9uKys7Cj4+PiArICAgICBzcGluX2xvY2soJmRldi0+aXJx X2xvY2spOwo+Pj4gKyAgICAgZGV2LT5jb25maWdfY2IuY2FsbGJhY2sgPSBOVUxMOwo+Pj4gKyAg ICAgZGV2LT5jb25maWdfY2IucHJpdmF0ZSA9IE5VTEw7Cj4+PiArICAgICBzcGluX3VubG9jaygm ZGV2LT5pcnFfbG9jayk7Cj4+PiArCj4+PiArICAgICBmb3IgKGkgPSAwOyBpIDwgZGV2LT52cV9u dW07IGkrKykgewo+Pj4gKyAgICAgICAgICAgICBzdHJ1Y3QgdmR1c2VfdmlydHF1ZXVlICp2cSA9 ICZkZXYtPnZxc1tpXTsKPj4+ICsKPj4+ICsgICAgICAgICAgICAgdnEtPnJlYWR5ID0gZmFsc2U7 Cj4+PiArICAgICAgICAgICAgIHZxLT5kZXNjX2FkZHIgPSAwOwo+Pj4gKyAgICAgICAgICAgICB2 cS0+ZHJpdmVyX2FkZHIgPSAwOwo+Pj4gKyAgICAgICAgICAgICB2cS0+ZGV2aWNlX2FkZHIgPSAw Owo+Pj4gKyAgICAgICAgICAgICB2cS0+YXZhaWxfaWR4ID0gMDsKPj4+ICsgICAgICAgICAgICAg dnEtPm51bSA9IDA7Cj4+PiArCj4+PiArICAgICAgICAgICAgIHNwaW5fbG9jaygmdnEtPmtpY2tf bG9jayk7Cj4+PiArICAgICAgICAgICAgIHZxLT5raWNrZWQgPSBmYWxzZTsKPj4+ICsgICAgICAg ICAgICAgaWYgKHZxLT5raWNrZmQpCj4+PiArICAgICAgICAgICAgICAgICAgICAgZXZlbnRmZF9j dHhfcHV0KHZxLT5raWNrZmQpOwo+Pj4gKyAgICAgICAgICAgICB2cS0+a2lja2ZkID0gTlVMTDsK Pj4+ICsgICAgICAgICAgICAgc3Bpbl91bmxvY2soJnZxLT5raWNrX2xvY2spOwo+Pj4gKwo+Pj4g KyAgICAgICAgICAgICBzcGluX2xvY2soJnZxLT5pcnFfbG9jayk7Cj4+PiArICAgICAgICAgICAg IHZxLT5jYi5jYWxsYmFjayA9IE5VTEw7Cj4+PiArICAgICAgICAgICAgIHZxLT5jYi5wcml2YXRl ID0gTlVMTDsKPj4+ICsgICAgICAgICAgICAgc3Bpbl91bmxvY2soJnZxLT5pcnFfbG9jayk7Cj4+ PiArICAgICB9Cj4+PiArfQo+Pj4gKwo+Pj4gK3N0YXRpYyBpbnQgdmR1c2VfdmRwYV9zZXRfdnFf YWRkcmVzcyhzdHJ1Y3QgdmRwYV9kZXZpY2UgKnZkcGEsIHUxNiBpZHgsCj4+PiArICAgICAgICAg ICAgICAgICAgICAgICAgICAgICB1NjQgZGVzY19hcmVhLCB1NjQgZHJpdmVyX2FyZWEsCj4+PiAr ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1NjQgZGV2aWNlX2FyZWEpCj4+PiArewo+Pj4g KyAgICAgc3RydWN0IHZkdXNlX2RldiAqZGV2ID0gdmRwYV90b192ZHVzZSh2ZHBhKTsKPj4+ICsg ICAgIHN0cnVjdCB2ZHVzZV92aXJ0cXVldWUgKnZxID0gJmRldi0+dnFzW2lkeF07Cj4+PiArCj4+ PiArICAgICB2cS0+ZGVzY19hZGRyID0gZGVzY19hcmVhOwo+Pj4gKyAgICAgdnEtPmRyaXZlcl9h ZGRyID0gZHJpdmVyX2FyZWE7Cj4+PiArICAgICB2cS0+ZGV2aWNlX2FkZHIgPSBkZXZpY2VfYXJl YTsKPj4+ICsKPj4+ICsgICAgIHJldHVybiAwOwo+Pj4gK30KPj4+ICsKPj4+ICtzdGF0aWMgdm9p ZCB2ZHVzZV92ZHBhX2tpY2tfdnEoc3RydWN0IHZkcGFfZGV2aWNlICp2ZHBhLCB1MTYgaWR4KQo+ Pj4gK3sKPj4+ICsgICAgIHN0cnVjdCB2ZHVzZV9kZXYgKmRldiA9IHZkcGFfdG9fdmR1c2UodmRw YSk7Cj4+PiArICAgICBzdHJ1Y3QgdmR1c2VfdmlydHF1ZXVlICp2cSA9ICZkZXYtPnZxc1tpZHhd Owo+Pj4gKwo+Pj4gKyAgICAgc3Bpbl9sb2NrKCZ2cS0+a2lja19sb2NrKTsKPj4+ICsgICAgIGlm ICghdnEtPnJlYWR5KQo+Pj4gKyAgICAgICAgICAgICBnb3RvIHVubG9jazsKPj4+ICsKPj4+ICsg ICAgIGlmICh2cS0+a2lja2ZkKQo+Pj4gKyAgICAgICAgICAgICBldmVudGZkX3NpZ25hbCh2cS0+ a2lja2ZkLCAxKTsKPj4+ICsgICAgIGVsc2UKPj4+ICsgICAgICAgICAgICAgdnEtPmtpY2tlZCA9 IHRydWU7Cj4+PiArdW5sb2NrOgo+Pj4gKyAgICAgc3Bpbl91bmxvY2soJnZxLT5raWNrX2xvY2sp Owo+Pj4gK30KPj4+ICsKPj4+ICtzdGF0aWMgdm9pZCB2ZHVzZV92ZHBhX3NldF92cV9jYihzdHJ1 Y3QgdmRwYV9kZXZpY2UgKnZkcGEsIHUxNiBpZHgsCj4+PiArICAgICAgICAgICAgICAgICAgICAg ICAgICAgc3RydWN0IHZkcGFfY2FsbGJhY2sgKmNiKQo+Pj4gK3sKPj4+ICsgICAgIHN0cnVjdCB2 ZHVzZV9kZXYgKmRldiA9IHZkcGFfdG9fdmR1c2UodmRwYSk7Cj4+PiArICAgICBzdHJ1Y3QgdmR1 c2VfdmlydHF1ZXVlICp2cSA9ICZkZXYtPnZxc1tpZHhdOwo+Pj4gKwo+Pj4gKyAgICAgc3Bpbl9s b2NrKCZ2cS0+aXJxX2xvY2spOwo+Pj4gKyAgICAgdnEtPmNiLmNhbGxiYWNrID0gY2ItPmNhbGxi YWNrOwo+Pj4gKyAgICAgdnEtPmNiLnByaXZhdGUgPSBjYi0+cHJpdmF0ZTsKPj4+ICsgICAgIHNw aW5fdW5sb2NrKCZ2cS0+aXJxX2xvY2spOwo+Pj4gK30KPj4+ICsKPj4+ICtzdGF0aWMgdm9pZCB2 ZHVzZV92ZHBhX3NldF92cV9udW0oc3RydWN0IHZkcGFfZGV2aWNlICp2ZHBhLCB1MTYgaWR4LCB1 MzIgbnVtKQo+Pj4gK3sKPj4+ICsgICAgIHN0cnVjdCB2ZHVzZV9kZXYgKmRldiA9IHZkcGFfdG9f dmR1c2UodmRwYSk7Cj4+PiArICAgICBzdHJ1Y3QgdmR1c2VfdmlydHF1ZXVlICp2cSA9ICZkZXYt PnZxc1tpZHhdOwo+Pj4gKwo+Pj4gKyAgICAgdnEtPm51bSA9IG51bTsKPj4+ICt9Cj4+PiArCj4+ PiArc3RhdGljIHZvaWQgdmR1c2VfdmRwYV9zZXRfdnFfcmVhZHkoc3RydWN0IHZkcGFfZGV2aWNl ICp2ZHBhLAo+Pj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTYgaWR4 LCBib29sIHJlYWR5KQo+Pj4gK3sKPj4+ICsgICAgIHN0cnVjdCB2ZHVzZV9kZXYgKmRldiA9IHZk cGFfdG9fdmR1c2UodmRwYSk7Cj4+PiArICAgICBzdHJ1Y3QgdmR1c2VfdmlydHF1ZXVlICp2cSA9 ICZkZXYtPnZxc1tpZHhdOwo+Pj4gKwo+Pj4gKyAgICAgdnEtPnJlYWR5ID0gcmVhZHk7Cj4+PiAr fQo+Pj4gKwo+Pj4gK3N0YXRpYyBib29sIHZkdXNlX3ZkcGFfZ2V0X3ZxX3JlYWR5KHN0cnVjdCB2 ZHBhX2RldmljZSAqdmRwYSwgdTE2IGlkeCkKPj4+ICt7Cj4+PiArICAgICBzdHJ1Y3QgdmR1c2Vf ZGV2ICpkZXYgPSB2ZHBhX3RvX3ZkdXNlKHZkcGEpOwo+Pj4gKyAgICAgc3RydWN0IHZkdXNlX3Zp cnRxdWV1ZSAqdnEgPSAmZGV2LT52cXNbaWR4XTsKPj4+ICsKPj4+ICsgICAgIHJldHVybiB2cS0+ cmVhZHk7Cj4+PiArfQo+Pj4gKwo+Pj4gK3N0YXRpYyBpbnQgdmR1c2VfdmRwYV9zZXRfdnFfc3Rh dGUoc3RydWN0IHZkcGFfZGV2aWNlICp2ZHBhLCB1MTYgaWR4LAo+Pj4gKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHZkcGFfdnFfc3RhdGUgKnN0YXRlKQo+Pj4gK3sK Pj4+ICsgICAgIHN0cnVjdCB2ZHVzZV9kZXYgKmRldiA9IHZkcGFfdG9fdmR1c2UodmRwYSk7Cj4+ PiArICAgICBzdHJ1Y3QgdmR1c2VfdmlydHF1ZXVlICp2cSA9ICZkZXYtPnZxc1tpZHhdOwo+Pj4g Kwo+Pj4gKyAgICAgdnEtPmF2YWlsX2lkeCA9IHN0YXRlLT5hdmFpbF9pbmRleDsKPj4+ICsgICAg IHJldHVybiAwOwo+Pj4gK30KPj4+ICsKPj4+ICtzdGF0aWMgaW50IHZkdXNlX3ZkcGFfZ2V0X3Zx X3N0YXRlKHN0cnVjdCB2ZHBhX2RldmljZSAqdmRwYSwgdTE2IGlkeCwKPj4+ICsgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHN0cnVjdCB2ZHBhX3ZxX3N0YXRlICpzdGF0ZSkKPj4+ICt7Cj4+ PiArICAgICBzdHJ1Y3QgdmR1c2VfZGV2ICpkZXYgPSB2ZHBhX3RvX3ZkdXNlKHZkcGEpOwo+Pj4g KyAgICAgc3RydWN0IHZkdXNlX3ZpcnRxdWV1ZSAqdnEgPSAmZGV2LT52cXNbaWR4XTsKPj4+ICsK Pj4+ICsgICAgIHJldHVybiB2ZHVzZV9kZXZfZ2V0X3ZxX3N0YXRlKGRldiwgdnEsIHN0YXRlKTsK Pj4+ICt9Cj4+PiArCj4+PiArc3RhdGljIHUzMiB2ZHVzZV92ZHBhX2dldF92cV9hbGlnbihzdHJ1 Y3QgdmRwYV9kZXZpY2UgKnZkcGEpCj4+PiArewo+Pj4gKyAgICAgc3RydWN0IHZkdXNlX2RldiAq ZGV2ID0gdmRwYV90b192ZHVzZSh2ZHBhKTsKPj4+ICsKPj4+ICsgICAgIHJldHVybiBkZXYtPnZx X2FsaWduOwo+Pj4gK30KPj4+ICsKPj4+ICtzdGF0aWMgdTY0IHZkdXNlX3ZkcGFfZ2V0X2ZlYXR1 cmVzKHN0cnVjdCB2ZHBhX2RldmljZSAqdmRwYSkKPj4+ICt7Cj4+PiArICAgICBzdHJ1Y3QgdmR1 c2VfZGV2ICpkZXYgPSB2ZHBhX3RvX3ZkdXNlKHZkcGEpOwo+Pj4gKwo+Pj4gKyAgICAgcmV0dXJu IGRldi0+dXNlcl9mZWF0dXJlczsKPj4+ICt9Cj4+PiArCj4+PiArc3RhdGljIGludCB2ZHVzZV92 ZHBhX3NldF9mZWF0dXJlcyhzdHJ1Y3QgdmRwYV9kZXZpY2UgKnZkcGEsIHU2NCBmZWF0dXJlcykK Pj4+ICt7Cj4+PiArICAgICBzdHJ1Y3QgdmR1c2VfZGV2ICpkZXYgPSB2ZHBhX3RvX3ZkdXNlKHZk cGEpOwo+Pj4gKwo+Pj4gKyAgICAgZGV2LT5mZWF0dXJlcyA9IGZlYXR1cmVzOwo+Pj4gKyAgICAg cmV0dXJuIDA7Cj4+PiArfQo+Pj4gKwo+Pj4gK3N0YXRpYyB2b2lkIHZkdXNlX3ZkcGFfc2V0X2Nv bmZpZ19jYihzdHJ1Y3QgdmRwYV9kZXZpY2UgKnZkcGEsCj4+PiArICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHN0cnVjdCB2ZHBhX2NhbGxiYWNrICpjYikKPj4+ICt7Cj4+PiArICAgICBz dHJ1Y3QgdmR1c2VfZGV2ICpkZXYgPSB2ZHBhX3RvX3ZkdXNlKHZkcGEpOwo+Pj4gKwo+Pj4gKyAg ICAgc3Bpbl9sb2NrKCZkZXYtPmlycV9sb2NrKTsKPj4+ICsgICAgIGRldi0+Y29uZmlnX2NiLmNh bGxiYWNrID0gY2ItPmNhbGxiYWNrOwo+Pj4gKyAgICAgZGV2LT5jb25maWdfY2IucHJpdmF0ZSA9 IGNiLT5wcml2YXRlOwo+Pj4gKyAgICAgc3Bpbl91bmxvY2soJmRldi0+aXJxX2xvY2spOwo+Pj4g K30KPj4+ICsKPj4+ICtzdGF0aWMgdTE2IHZkdXNlX3ZkcGFfZ2V0X3ZxX251bV9tYXgoc3RydWN0 IHZkcGFfZGV2aWNlICp2ZHBhKQo+Pj4gK3sKPj4+ICsgICAgIHN0cnVjdCB2ZHVzZV9kZXYgKmRl diA9IHZkcGFfdG9fdmR1c2UodmRwYSk7Cj4+PiArCj4+PiArICAgICByZXR1cm4gZGV2LT52cV9z aXplX21heDsKPj4+ICt9Cj4+PiArCj4+PiArc3RhdGljIHUzMiB2ZHVzZV92ZHBhX2dldF9kZXZp Y2VfaWQoc3RydWN0IHZkcGFfZGV2aWNlICp2ZHBhKQo+Pj4gK3sKPj4+ICsgICAgIHN0cnVjdCB2 ZHVzZV9kZXYgKmRldiA9IHZkcGFfdG9fdmR1c2UodmRwYSk7Cj4+PiArCj4+PiArICAgICByZXR1 cm4gZGV2LT5kZXZpY2VfaWQ7Cj4+PiArfQo+Pj4gKwo+Pj4gK3N0YXRpYyB1MzIgdmR1c2VfdmRw YV9nZXRfdmVuZG9yX2lkKHN0cnVjdCB2ZHBhX2RldmljZSAqdmRwYSkKPj4+ICt7Cj4+PiArICAg ICBzdHJ1Y3QgdmR1c2VfZGV2ICpkZXYgPSB2ZHBhX3RvX3ZkdXNlKHZkcGEpOwo+Pj4gKwo+Pj4g KyAgICAgcmV0dXJuIGRldi0+dmVuZG9yX2lkOwo+Pj4gK30KPj4+ICsKPj4+ICtzdGF0aWMgdTgg dmR1c2VfdmRwYV9nZXRfc3RhdHVzKHN0cnVjdCB2ZHBhX2RldmljZSAqdmRwYSkKPj4+ICt7Cj4+ PiArICAgICBzdHJ1Y3QgdmR1c2VfZGV2ICpkZXYgPSB2ZHBhX3RvX3ZkdXNlKHZkcGEpOwo+Pj4g Kwo+Pj4gKyAgICAgcmV0dXJuIGRldi0+c3RhdHVzOwo+Pj4gK30KPj4+ICsKPj4+ICtzdGF0aWMg dm9pZCB2ZHVzZV92ZHBhX3NldF9zdGF0dXMoc3RydWN0IHZkcGFfZGV2aWNlICp2ZHBhLCB1OCBz dGF0dXMpCj4+PiArewo+Pj4gKyAgICAgc3RydWN0IHZkdXNlX2RldiAqZGV2ID0gdmRwYV90b192 ZHVzZSh2ZHBhKTsKPj4+ICsgICAgIGJvb2wgc3RhcnRlZCA9ICEhKHN0YXR1cyAmIFZJUlRJT19D T05GSUdfU19EUklWRVJfT0spOwo+Pj4gKwo+Pj4gKyAgICAgZGV2LT5zdGF0dXMgPSBzdGF0dXM7 Cj4+PiArCj4+PiArICAgICBpZiAoZGV2LT5zdGFydGVkID09IHN0YXJ0ZWQpCj4+PiArICAgICAg ICAgICAgIHJldHVybjsKPj4KPj4gSWYgd2UgY2hlY2sgZGV2LT5zdGF0dXMgPT0gc3RhdHVzLCAo b3Igb25seSBjaGVjayB0aGUgRFJJVkVSX09LIGJpdCkKPj4gdGhlbiB0aGVyZSdzIG5vIG5lZWQg dG8gaW50cm9kdWNlIGFuIGV4dHJhIGRldi0+c3RhcnRlZC4KPj4KPiBXaWxsIGRvIGl0Lgo+Cj4+ PiArCj4+PiArICAgICBkZXYtPnN0YXJ0ZWQgPSBzdGFydGVkOwo+Pj4gKyAgICAgaWYgKGRldi0+ c3RhcnRlZCkgewo+Pj4gKyAgICAgICAgICAgICB2ZHVzZV9kZXZfc3RhcnRfZGF0YXBsYW5lKGRl dik7Cj4+PiArICAgICB9IGVsc2Ugewo+Pj4gKyAgICAgICAgICAgICB2ZHVzZV9kZXZfcmVzZXQo ZGV2KTsKPj4+ICsgICAgICAgICAgICAgdmR1c2VfZGV2X3N0b3BfZGF0YXBsYW5lKGRldik7Cj4+ Cj4+IEkgd29uZGVyIGlmIG5vX3JlcGx5IHdvcmsgZm9yIHRoZSBjYXNlIG9mIHZob3N0LXZkcGEu IEZvciB2aXJ0aW8tdkRQQSwKPj4gd2UgaGF2ZSBib3VuY2luZyBidWZmZXJzIHNvIGl0J3MgaGFy bWxlc3MgaWYgdXNlcnNhcGNlIGRhdGFwbGFuZSBrZWVwcwo+PiBwZXJmb3JtaW5nIHJlYWQvd3Jp dGUuIEZvciB2aG9zdC12RFBBIHdlIGRvbid0IGhhdmUgc3VjaCBzdHVmZnMuCj4+Cj4gT0suIFNv IGl0IHN0aWxsIG5lZWRzIHRvIGJlIHN5bmNocm9uaXplZCBoZXJlLiBJZiBzbywgaG93IHRvIGhh bmRsZQo+IHRoZSBlcnJvcj8gTG9va3MgbGlrZSBwcmludGluZyBhIHdhcm5pbmcgbWVzc2FnZSBz aG91bGQgYmUgZW5vdWdoLgoKCldlIG5lZWQgZml4IGEgd2F5IHRvIHByb3BhZ2F0ZSB0aGUgZXJy b3IgdG8gdGhlIHVzZXJzcGFjZS4KCkUuZyBpZiB3ZSB3YW50IHRvIHN0b3AgdGhlIGRlaXZjZSwg d2Ugd2lsbCBkZWxheSB0aGUgc3RhdHVzIHJlc2V0IHVudGlsIAp3ZSBnZXQgcmVzcG9zZSBmcm9t IHRoZSB1c2Vyc3BhY2U/CgoKPgo+Pj4gKyAgICAgfQo+Pj4gK30KPj4+ICsKPj4+ICtzdGF0aWMg c2l6ZV90IHZkdXNlX3ZkcGFfZ2V0X2NvbmZpZ19zaXplKHN0cnVjdCB2ZHBhX2RldmljZSAqdmRw YSkKPj4+ICt7Cj4+PiArICAgICBzdHJ1Y3QgdmR1c2VfZGV2ICpkZXYgPSB2ZHBhX3RvX3ZkdXNl KHZkcGEpOwo+Pj4gKwo+Pj4gKyAgICAgcmV0dXJuIGRldi0+Y29uZmlnX3NpemU7Cj4+PiArfQo+ Pj4gKwo+Pj4gK3N0YXRpYyB2b2lkIHZkdXNlX3ZkcGFfZ2V0X2NvbmZpZyhzdHJ1Y3QgdmRwYV9k ZXZpY2UgKnZkcGEsIHVuc2lnbmVkIGludCBvZmZzZXQsCj4+PiArICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHZvaWQgKmJ1ZiwgdW5zaWduZWQgaW50IGxlbikKPj4+ICt7Cj4+PiArICAg ICBzdHJ1Y3QgdmR1c2VfZGV2ICpkZXYgPSB2ZHBhX3RvX3ZkdXNlKHZkcGEpOwo+Pj4gKwo+Pj4g KyAgICAgbWVtY3B5KGJ1ZiwgZGV2LT5jb25maWcgKyBvZmZzZXQsIGxlbik7Cj4+PiArfQo+Pj4g Kwo+Pj4gK3N0YXRpYyB2b2lkIHZkdXNlX3ZkcGFfc2V0X2NvbmZpZyhzdHJ1Y3QgdmRwYV9kZXZp Y2UgKnZkcGEsIHVuc2lnbmVkIGludCBvZmZzZXQsCj4+PiArICAgICAgICAgICAgICAgICAgICAg Y29uc3Qgdm9pZCAqYnVmLCB1bnNpZ25lZCBpbnQgbGVuKQo+Pj4gK3sKPj4+ICsgICAgIC8qIE5v dyB3ZSBvbmx5IHN1cHBvcnQgcmVhZC1vbmx5IGNvbmZpZ3VyYXRpb24gc3BhY2UgKi8KPj4+ICt9 Cj4+PiArCj4+PiArc3RhdGljIHUzMiB2ZHVzZV92ZHBhX2dldF9nZW5lcmF0aW9uKHN0cnVjdCB2 ZHBhX2RldmljZSAqdmRwYSkKPj4+ICt7Cj4+PiArICAgICBzdHJ1Y3QgdmR1c2VfZGV2ICpkZXYg PSB2ZHBhX3RvX3ZkdXNlKHZkcGEpOwo+Pj4gKwo+Pj4gKyAgICAgcmV0dXJuIGRldi0+Z2VuZXJh dGlvbjsKPj4+ICt9Cj4+PiArCj4+PiArc3RhdGljIGludCB2ZHVzZV92ZHBhX3NldF9tYXAoc3Ry dWN0IHZkcGFfZGV2aWNlICp2ZHBhLAo+Pj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg c3RydWN0IHZob3N0X2lvdGxiICppb3RsYikKPj4+ICt7Cj4+PiArICAgICBzdHJ1Y3QgdmR1c2Vf ZGV2ICpkZXYgPSB2ZHBhX3RvX3ZkdXNlKHZkcGEpOwo+Pj4gKyAgICAgaW50IHJldDsKPj4+ICsK Pj4+ICsgICAgIHJldCA9IHZkdXNlX2RvbWFpbl9zZXRfbWFwKGRldi0+ZG9tYWluLCBpb3RsYik7 Cj4+PiArICAgICBpZiAocmV0KQo+Pj4gKyAgICAgICAgICAgICByZXR1cm4gcmV0Owo+Pj4gKwo+ Pj4gKyAgICAgcmV0ID0gdmR1c2VfZGV2X3VwZGF0ZV9pb3RsYihkZXYsIDBVTEwsIFVMTE9OR19N QVgpOwo+Pj4gKyAgICAgaWYgKHJldCkgewo+Pj4gKyAgICAgICAgICAgICB2ZHVzZV9kb21haW5f Y2xlYXJfbWFwKGRldi0+ZG9tYWluLCBpb3RsYik7Cj4+PiArICAgICAgICAgICAgIHJldHVybiBy ZXQ7Cj4+PiArICAgICB9Cj4+PiArCj4+PiArICAgICByZXR1cm4gMDsKPj4+ICt9Cj4+PiArCj4+ PiArc3RhdGljIHZvaWQgdmR1c2VfdmRwYV9mcmVlKHN0cnVjdCB2ZHBhX2RldmljZSAqdmRwYSkK Pj4+ICt7Cj4+PiArICAgICBzdHJ1Y3QgdmR1c2VfZGV2ICpkZXYgPSB2ZHBhX3RvX3ZkdXNlKHZk cGEpOwo+Pj4gKwo+Pj4gKyAgICAgZGV2LT52ZGV2ID0gTlVMTDsKPj4+ICt9Cj4+PiArCj4+PiAr c3RhdGljIGNvbnN0IHN0cnVjdCB2ZHBhX2NvbmZpZ19vcHMgdmR1c2VfdmRwYV9jb25maWdfb3Bz ID0gewo+Pj4gKyAgICAgLnNldF92cV9hZGRyZXNzICAgICAgICAgPSB2ZHVzZV92ZHBhX3NldF92 cV9hZGRyZXNzLAo+Pj4gKyAgICAgLmtpY2tfdnEgICAgICAgICAgICAgICAgPSB2ZHVzZV92ZHBh X2tpY2tfdnEsCj4+PiArICAgICAuc2V0X3ZxX2NiICAgICAgICAgICAgICA9IHZkdXNlX3ZkcGFf c2V0X3ZxX2NiLAo+Pj4gKyAgICAgLnNldF92cV9udW0gICAgICAgICAgICAgPSB2ZHVzZV92ZHBh X3NldF92cV9udW0sCj4+PiArICAgICAuc2V0X3ZxX3JlYWR5ICAgICAgICAgICA9IHZkdXNlX3Zk cGFfc2V0X3ZxX3JlYWR5LAo+Pj4gKyAgICAgLmdldF92cV9yZWFkeSAgICAgICAgICAgPSB2ZHVz ZV92ZHBhX2dldF92cV9yZWFkeSwKPj4+ICsgICAgIC5zZXRfdnFfc3RhdGUgICAgICAgICAgID0g dmR1c2VfdmRwYV9zZXRfdnFfc3RhdGUsCj4+PiArICAgICAuZ2V0X3ZxX3N0YXRlICAgICAgICAg ICA9IHZkdXNlX3ZkcGFfZ2V0X3ZxX3N0YXRlLAo+Pj4gKyAgICAgLmdldF92cV9hbGlnbiAgICAg ICAgICAgPSB2ZHVzZV92ZHBhX2dldF92cV9hbGlnbiwKPj4+ICsgICAgIC5nZXRfZmVhdHVyZXMg ICAgICAgICAgID0gdmR1c2VfdmRwYV9nZXRfZmVhdHVyZXMsCj4+PiArICAgICAuc2V0X2ZlYXR1 cmVzICAgICAgICAgICA9IHZkdXNlX3ZkcGFfc2V0X2ZlYXR1cmVzLAo+Pj4gKyAgICAgLnNldF9j b25maWdfY2IgICAgICAgICAgPSB2ZHVzZV92ZHBhX3NldF9jb25maWdfY2IsCj4+PiArICAgICAu Z2V0X3ZxX251bV9tYXggICAgICAgICA9IHZkdXNlX3ZkcGFfZ2V0X3ZxX251bV9tYXgsCj4+PiAr ICAgICAuZ2V0X2RldmljZV9pZCAgICAgICAgICA9IHZkdXNlX3ZkcGFfZ2V0X2RldmljZV9pZCwK Pj4+ICsgICAgIC5nZXRfdmVuZG9yX2lkICAgICAgICAgID0gdmR1c2VfdmRwYV9nZXRfdmVuZG9y X2lkLAo+Pj4gKyAgICAgLmdldF9zdGF0dXMgICAgICAgICAgICAgPSB2ZHVzZV92ZHBhX2dldF9z dGF0dXMsCj4+PiArICAgICAuc2V0X3N0YXR1cyAgICAgICAgICAgICA9IHZkdXNlX3ZkcGFfc2V0 X3N0YXR1cywKPj4+ICsgICAgIC5nZXRfY29uZmlnX3NpemUgICAgICAgID0gdmR1c2VfdmRwYV9n ZXRfY29uZmlnX3NpemUsCj4+PiArICAgICAuZ2V0X2NvbmZpZyAgICAgICAgICAgICA9IHZkdXNl X3ZkcGFfZ2V0X2NvbmZpZywKPj4+ICsgICAgIC5zZXRfY29uZmlnICAgICAgICAgICAgID0gdmR1 c2VfdmRwYV9zZXRfY29uZmlnLAo+Pj4gKyAgICAgLmdldF9nZW5lcmF0aW9uICAgICAgICAgPSB2 ZHVzZV92ZHBhX2dldF9nZW5lcmF0aW9uLAo+Pj4gKyAgICAgLnNldF9tYXAgICAgICAgICAgICAg ICAgPSB2ZHVzZV92ZHBhX3NldF9tYXAsCj4+PiArICAgICAuZnJlZSAgICAgICAgICAgICAgICAg ICA9IHZkdXNlX3ZkcGFfZnJlZSwKPj4+ICt9Owo+Pj4gKwo+Pj4gK3N0YXRpYyBkbWFfYWRkcl90 IHZkdXNlX2Rldl9tYXBfcGFnZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBwYWdlICpwYWdl LAo+Pj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIG9m ZnNldCwgc2l6ZV90IHNpemUsCj4+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpciwKPj4+ICsgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBhdHRycykKPj4+ICt7Cj4+PiArICAgICBzdHJ1Y3Qg dmR1c2VfZGV2ICp2ZGV2ID0gZGV2X3RvX3ZkdXNlKGRldik7Cj4+PiArICAgICBzdHJ1Y3QgdmR1 c2VfaW92YV9kb21haW4gKmRvbWFpbiA9IHZkZXYtPmRvbWFpbjsKPj4+ICsKPj4+ICsgICAgIHJl dHVybiB2ZHVzZV9kb21haW5fbWFwX3BhZ2UoZG9tYWluLCBwYWdlLCBvZmZzZXQsIHNpemUsIGRp ciwgYXR0cnMpOwo+Pj4gK30KPj4+ICsKPj4+ICtzdGF0aWMgdm9pZCB2ZHVzZV9kZXZfdW5tYXBf cGFnZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgZG1hX2FkZHIsCj4+PiArICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSwgZW51bSBkbWFfZGF0YV9kaXJlY3Rp b24gZGlyLAo+Pj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBh dHRycykKPj4+ICt7Cj4+PiArICAgICBzdHJ1Y3QgdmR1c2VfZGV2ICp2ZGV2ID0gZGV2X3RvX3Zk dXNlKGRldik7Cj4+PiArICAgICBzdHJ1Y3QgdmR1c2VfaW92YV9kb21haW4gKmRvbWFpbiA9IHZk ZXYtPmRvbWFpbjsKPj4+ICsKPj4+ICsgICAgIHJldHVybiB2ZHVzZV9kb21haW5fdW5tYXBfcGFn ZShkb21haW4sIGRtYV9hZGRyLCBzaXplLCBkaXIsIGF0dHJzKTsKPj4+ICt9Cj4+PiArCj4+PiAr c3RhdGljIHZvaWQgKnZkdXNlX2Rldl9hbGxvY19jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYs IHNpemVfdCBzaXplLAo+Pj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBk bWFfYWRkcl90ICpkbWFfYWRkciwgZ2ZwX3QgZmxhZywKPj4+ICsgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBhdHRycykKPj4+ICt7Cj4+PiArICAgICBz dHJ1Y3QgdmR1c2VfZGV2ICp2ZGV2ID0gZGV2X3RvX3ZkdXNlKGRldik7Cj4+PiArICAgICBzdHJ1 Y3QgdmR1c2VfaW92YV9kb21haW4gKmRvbWFpbiA9IHZkZXYtPmRvbWFpbjsKPj4+ICsgICAgIHVu c2lnbmVkIGxvbmcgaW92YTsKPj4+ICsgICAgIHZvaWQgKmFkZHI7Cj4+PiArCj4+PiArICAgICAq ZG1hX2FkZHIgPSBETUFfTUFQUElOR19FUlJPUjsKPj4+ICsgICAgIGFkZHIgPSB2ZHVzZV9kb21h aW5fYWxsb2NfY29oZXJlbnQoZG9tYWluLCBzaXplLAo+Pj4gKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgKGRtYV9hZGRyX3QgKikmaW92YSwgZmxhZywgYXR0cnMpOwo+Pj4gKyAgICAgaWYg KCFhZGRyKQo+Pj4gKyAgICAgICAgICAgICByZXR1cm4gTlVMTDsKPj4+ICsKPj4+ICsgICAgICpk bWFfYWRkciA9IChkbWFfYWRkcl90KWlvdmE7Cj4+PiArCj4+PiArICAgICByZXR1cm4gYWRkcjsK Pj4+ICt9Cj4+PiArCj4+PiArc3RhdGljIHZvaWQgdmR1c2VfZGV2X2ZyZWVfY29oZXJlbnQoc3Ry dWN0IGRldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwKPj4+ICsgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgdm9pZCAqdmFkZHIsIGRtYV9hZGRyX3QgZG1hX2FkZHIsCj4+PiArICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgYXR0cnMpCj4+ PiArewo+Pj4gKyAgICAgc3RydWN0IHZkdXNlX2RldiAqdmRldiA9IGRldl90b192ZHVzZShkZXYp Owo+Pj4gKyAgICAgc3RydWN0IHZkdXNlX2lvdmFfZG9tYWluICpkb21haW4gPSB2ZGV2LT5kb21h aW47Cj4+PiArCj4+PiArICAgICB2ZHVzZV9kb21haW5fZnJlZV9jb2hlcmVudChkb21haW4sIHNp emUsIHZhZGRyLCBkbWFfYWRkciwgYXR0cnMpOwo+Pj4gK30KPj4+ICsKPj4+ICtzdGF0aWMgc2l6 ZV90IHZkdXNlX2Rldl9tYXhfbWFwcGluZ19zaXplKHN0cnVjdCBkZXZpY2UgKmRldikKPj4+ICt7 Cj4+PiArICAgICBzdHJ1Y3QgdmR1c2VfZGV2ICp2ZGV2ID0gZGV2X3RvX3ZkdXNlKGRldik7Cj4+ PiArICAgICBzdHJ1Y3QgdmR1c2VfaW92YV9kb21haW4gKmRvbWFpbiA9IHZkZXYtPmRvbWFpbjsK Pj4+ICsKPj4+ICsgICAgIHJldHVybiBkb21haW4tPmJvdW5jZV9zaXplOwo+Pj4gK30KPj4+ICsK Pj4+ICtzdGF0aWMgY29uc3Qgc3RydWN0IGRtYV9tYXBfb3BzIHZkdXNlX2Rldl9kbWFfb3BzID0g ewo+Pj4gKyAgICAgLm1hcF9wYWdlID0gdmR1c2VfZGV2X21hcF9wYWdlLAo+Pj4gKyAgICAgLnVu bWFwX3BhZ2UgPSB2ZHVzZV9kZXZfdW5tYXBfcGFnZSwKPj4+ICsgICAgIC5hbGxvYyA9IHZkdXNl X2Rldl9hbGxvY19jb2hlcmVudCwKPj4+ICsgICAgIC5mcmVlID0gdmR1c2VfZGV2X2ZyZWVfY29o ZXJlbnQsCj4+PiArICAgICAubWF4X21hcHBpbmdfc2l6ZSA9IHZkdXNlX2Rldl9tYXhfbWFwcGlu Z19zaXplLAo+Pj4gK307Cj4+PiArCj4+PiArc3RhdGljIHVuc2lnbmVkIGludCBwZXJtX3RvX2Zp bGVfZmxhZ3ModTggcGVybSkKPj4+ICt7Cj4+PiArICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MgPSAw Owo+Pj4gKwo+Pj4gKyAgICAgc3dpdGNoIChwZXJtKSB7Cj4+PiArICAgICBjYXNlIFZEVVNFX0FD Q0VTU19XTzoKPj4+ICsgICAgICAgICAgICAgZmxhZ3MgfD0gT19XUk9OTFk7Cj4+PiArICAgICAg ICAgICAgIGJyZWFrOwo+Pj4gKyAgICAgY2FzZSBWRFVTRV9BQ0NFU1NfUk86Cj4+PiArICAgICAg ICAgICAgIGZsYWdzIHw9IE9fUkRPTkxZOwo+Pj4gKyAgICAgICAgICAgICBicmVhazsKPj4+ICsg ICAgIGNhc2UgVkRVU0VfQUNDRVNTX1JXOgo+Pj4gKyAgICAgICAgICAgICBmbGFncyB8PSBPX1JE V1I7Cj4+PiArICAgICAgICAgICAgIGJyZWFrOwo+Pj4gKyAgICAgZGVmYXVsdDoKPj4+ICsgICAg ICAgICAgICAgV0FSTigxLCAiaW52YWxpZGF0ZSB2aG9zdCBJT1RMQiBwZXJtaXNzaW9uXG4iKTsK Pj4+ICsgICAgICAgICAgICAgYnJlYWs7Cj4+PiArICAgICB9Cj4+PiArCj4+PiArICAgICByZXR1 cm4gZmxhZ3M7Cj4+PiArfQo+Pj4gKwo+Pj4gK3N0YXRpYyBpbnQgdmR1c2Vfa2lja2ZkX3NldHVw KHN0cnVjdCB2ZHVzZV9kZXYgKmRldiwKPj4+ICsgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qg dmR1c2VfdnFfZXZlbnRmZCAqZXZlbnRmZCkKPj4+ICt7Cj4+PiArICAgICBzdHJ1Y3QgZXZlbnRm ZF9jdHggKmN0eCA9IE5VTEw7Cj4+PiArICAgICBzdHJ1Y3QgdmR1c2VfdmlydHF1ZXVlICp2cTsK Pj4+ICsgICAgIHUzMiBpbmRleDsKPj4+ICsKPj4+ICsgICAgIGlmIChldmVudGZkLT5pbmRleCA+ PSBkZXYtPnZxX251bSkKPj4+ICsgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Cj4+PiArCj4+ PiArICAgICBpbmRleCA9IGFycmF5X2luZGV4X25vc3BlYyhldmVudGZkLT5pbmRleCwgZGV2LT52 cV9udW0pOwo+Pj4gKyAgICAgdnEgPSAmZGV2LT52cXNbaW5kZXhdOwo+Pj4gKyAgICAgaWYgKGV2 ZW50ZmQtPmZkID49IDApIHsKPj4+ICsgICAgICAgICAgICAgY3R4ID0gZXZlbnRmZF9jdHhfZmRn ZXQoZXZlbnRmZC0+ZmQpOwo+Pj4gKyAgICAgICAgICAgICBpZiAoSVNfRVJSKGN0eCkpCj4+PiAr ICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBUUl9FUlIoY3R4KTsKPj4+ICsgICAgIH0gZWxz ZSBpZiAoZXZlbnRmZC0+ZmQgIT0gVkRVU0VfRVZFTlRGRF9ERUFTU0lHTikKPj4+ICsgICAgICAg ICAgICAgcmV0dXJuIDA7Cj4+PiArCj4+PiArICAgICBzcGluX2xvY2soJnZxLT5raWNrX2xvY2sp Owo+Pj4gKyAgICAgaWYgKHZxLT5raWNrZmQpCj4+PiArICAgICAgICAgICAgIGV2ZW50ZmRfY3R4 X3B1dCh2cS0+a2lja2ZkKTsKPj4+ICsgICAgIHZxLT5raWNrZmQgPSBjdHg7Cj4+PiArICAgICBp ZiAodnEtPnJlYWR5ICYmIHZxLT5raWNrZWQgJiYgdnEtPmtpY2tmZCkgewo+Pj4gKyAgICAgICAg ICAgICBldmVudGZkX3NpZ25hbCh2cS0+a2lja2ZkLCAxKTsKPj4+ICsgICAgICAgICAgICAgdnEt PmtpY2tlZCA9IGZhbHNlOwo+Pj4gKyAgICAgfQo+Pj4gKyAgICAgc3Bpbl91bmxvY2soJnZxLT5r aWNrX2xvY2spOwo+Pj4gKwo+Pj4gKyAgICAgcmV0dXJuIDA7Cj4+PiArfQo+Pj4gKwo+Pj4gK3N0 YXRpYyB2b2lkIHZkdXNlX2Rldl9pcnFfaW5qZWN0KHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykK Pj4+ICt7Cj4+PiArICAgICBzdHJ1Y3QgdmR1c2VfZGV2ICpkZXYgPSBjb250YWluZXJfb2Yod29y aywgc3RydWN0IHZkdXNlX2RldiwgaW5qZWN0KTsKPj4+ICsKPj4+ICsgICAgIHNwaW5fbG9ja19p cnEoJmRldi0+aXJxX2xvY2spOwo+Pj4gKyAgICAgaWYgKGRldi0+Y29uZmlnX2NiLmNhbGxiYWNr KQo+Pj4gKyAgICAgICAgICAgICBkZXYtPmNvbmZpZ19jYi5jYWxsYmFjayhkZXYtPmNvbmZpZ19j Yi5wcml2YXRlKTsKPj4+ICsgICAgIHNwaW5fdW5sb2NrX2lycSgmZGV2LT5pcnFfbG9jayk7Cj4+ PiArfQo+Pj4gKwo+Pj4gK3N0YXRpYyB2b2lkIHZkdXNlX3ZxX2lycV9pbmplY3Qoc3RydWN0IHdv cmtfc3RydWN0ICp3b3JrKQo+Pj4gK3sKPj4+ICsgICAgIHN0cnVjdCB2ZHVzZV92aXJ0cXVldWUg KnZxID0gY29udGFpbmVyX29mKHdvcmssCj4+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHN0cnVjdCB2ZHVzZV92aXJ0cXVldWUsIGluamVjdCk7Cj4+PiArCj4+PiArICAg ICBzcGluX2xvY2tfaXJxKCZ2cS0+aXJxX2xvY2spOwo+Pj4gKyAgICAgaWYgKHZxLT5yZWFkeSAm JiB2cS0+Y2IuY2FsbGJhY2spCj4+PiArICAgICAgICAgICAgIHZxLT5jYi5jYWxsYmFjayh2cS0+ Y2IucHJpdmF0ZSk7Cj4+PiArICAgICBzcGluX3VubG9ja19pcnEoJnZxLT5pcnFfbG9jayk7Cj4+ PiArfQo+Pj4gKwo+Pj4gK3N0YXRpYyBsb25nIHZkdXNlX2Rldl9pb2N0bChzdHJ1Y3QgZmlsZSAq ZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKPj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgdW5z aWduZWQgbG9uZyBhcmcpCj4+PiArewo+Pj4gKyAgICAgc3RydWN0IHZkdXNlX2RldiAqZGV2ID0g ZmlsZS0+cHJpdmF0ZV9kYXRhOwo+Pj4gKyAgICAgdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBf X3VzZXIgKilhcmc7Cj4+PiArICAgICBpbnQgcmV0Owo+Pj4gKwo+Pj4gKyAgICAgc3dpdGNoIChj bWQpIHsKPj4+ICsgICAgIGNhc2UgVkRVU0VfSU9UTEJfR0VUX0ZEOiB7Cj4+PiArICAgICAgICAg ICAgIHN0cnVjdCB2ZHVzZV9pb3RsYl9lbnRyeSBlbnRyeTsKPj4+ICsgICAgICAgICAgICAgc3Ry dWN0IHZob3N0X2lvdGxiX21hcCAqbWFwOwo+Pj4gKyAgICAgICAgICAgICBzdHJ1Y3QgdmRwYV9t YXBfZmlsZSAqbWFwX2ZpbGU7Cj4+PiArICAgICAgICAgICAgIHN0cnVjdCB2ZHVzZV9pb3ZhX2Rv bWFpbiAqZG9tYWluID0gZGV2LT5kb21haW47Cj4+PiArICAgICAgICAgICAgIHN0cnVjdCBmaWxl ICpmID0gTlVMTDsKPj4+ICsKPj4+ICsgICAgICAgICAgICAgcmV0ID0gLUVGQVVMVDsKPj4+ICsg ICAgICAgICAgICAgaWYgKGNvcHlfZnJvbV91c2VyKCZlbnRyeSwgYXJncCwgc2l6ZW9mKGVudHJ5 KSkpCj4+PiArICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Cj4+PiArCj4+PiArICAgICAgICAg ICAgIHJldCA9IC1FSU5WQUw7Cj4+PiArICAgICAgICAgICAgIGlmIChlbnRyeS5zdGFydCA+IGVu dHJ5Lmxhc3QpCj4+PiArICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Cj4+PiArCj4+PiArICAg ICAgICAgICAgIHNwaW5fbG9jaygmZG9tYWluLT5pb3RsYl9sb2NrKTsKPj4+ICsgICAgICAgICAg ICAgbWFwID0gdmhvc3RfaW90bGJfaXRyZWVfZmlyc3QoZG9tYWluLT5pb3RsYiwKPj4+ICsgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuc3RhcnQsIGVudHJ5 Lmxhc3QpOwo+Pj4gKyAgICAgICAgICAgICBpZiAobWFwKSB7Cj4+PiArICAgICAgICAgICAgICAg ICAgICAgbWFwX2ZpbGUgPSAoc3RydWN0IHZkcGFfbWFwX2ZpbGUgKiltYXAtPm9wYXF1ZTsKPj4+ ICsgICAgICAgICAgICAgICAgICAgICBmID0gZ2V0X2ZpbGUobWFwX2ZpbGUtPmZpbGUpOwo+Pj4g KyAgICAgICAgICAgICAgICAgICAgIGVudHJ5Lm9mZnNldCA9IG1hcF9maWxlLT5vZmZzZXQ7Cj4+ PiArICAgICAgICAgICAgICAgICAgICAgZW50cnkuc3RhcnQgPSBtYXAtPnN0YXJ0Owo+Pj4gKyAg ICAgICAgICAgICAgICAgICAgIGVudHJ5Lmxhc3QgPSBtYXAtPmxhc3Q7Cj4+PiArICAgICAgICAg ICAgICAgICAgICAgZW50cnkucGVybSA9IG1hcC0+cGVybTsKPj4+ICsgICAgICAgICAgICAgfQo+ Pj4gKyAgICAgICAgICAgICBzcGluX3VubG9jaygmZG9tYWluLT5pb3RsYl9sb2NrKTsKPj4+ICsg ICAgICAgICAgICAgcmV0ID0gLUVJTlZBTDsKPj4+ICsgICAgICAgICAgICAgaWYgKCFmKQo+Pj4g KyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwo+Pj4gKwo+Pj4gKyAgICAgICAgICAgICByZXQg PSAtRUZBVUxUOwo+Pj4gKyAgICAgICAgICAgICBpZiAoY29weV90b191c2VyKGFyZ3AsICZlbnRy eSwgc2l6ZW9mKGVudHJ5KSkpIHsKPj4+ICsgICAgICAgICAgICAgICAgICAgICBmcHV0KGYpOwo+ Pj4gKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwo+Pj4gKyAgICAgICAgICAgICB9Cj4+PiAr ICAgICAgICAgICAgIHJldCA9IHJlY2VpdmVfZmQoZiwgcGVybV90b19maWxlX2ZsYWdzKGVudHJ5 LnBlcm0pKTsKPj4+ICsgICAgICAgICAgICAgZnB1dChmKTsKPj4+ICsgICAgICAgICAgICAgYnJl YWs7Cj4+PiArICAgICB9Cj4+PiArICAgICBjYXNlIFZEVVNFX0RFVl9HRVRfRkVBVFVSRVM6Cj4+ PiArICAgICAgICAgICAgIHJldCA9IHB1dF91c2VyKGRldi0+ZmVhdHVyZXMsICh1NjQgX191c2Vy ICopYXJncCk7Cj4+PiArICAgICAgICAgICAgIGJyZWFrOwo+Pj4gKyAgICAgY2FzZSBWRFVTRV9E RVZfVVBEQVRFX0NPTkZJRzogewo+Pj4gKyAgICAgICAgICAgICBzdHJ1Y3QgdmR1c2VfY29uZmln X3VwZGF0ZSBjb25maWc7Cj4+PiArICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSA9IG9m ZnNldG9mKHN0cnVjdCB2ZHVzZV9jb25maWdfdXBkYXRlLAo+Pj4gKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIpOwo+Pj4gKwo+Pj4gKyAgICAgICAgICAg ICByZXQgPSAtRUZBVUxUOwo+Pj4gKyAgICAgICAgICAgICBpZiAoY29weV9mcm9tX3VzZXIoJmNv bmZpZywgYXJncCwgc2l6ZSkpCj4+PiArICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Cj4+PiAr Cj4+PiArICAgICAgICAgICAgIHJldCA9IC1FSU5WQUw7Cj4+PiArICAgICAgICAgICAgIGlmIChj b25maWcubGVuZ3RoID09IDAgfHwKPj4+ICsgICAgICAgICAgICAgICAgIGNvbmZpZy5sZW5ndGgg PiBkZXYtPmNvbmZpZ19zaXplIC0gY29uZmlnLm9mZnNldCkKPj4+ICsgICAgICAgICAgICAgICAg ICAgICBicmVhazsKPj4+ICsKPj4+ICsgICAgICAgICAgICAgcmV0ID0gLUVGQVVMVDsKPj4+ICsg ICAgICAgICAgICAgaWYgKGNvcHlfZnJvbV91c2VyKGRldi0+Y29uZmlnICsgY29uZmlnLm9mZnNl dCwgYXJncCArIHNpemUsCj4+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25m aWcubGVuZ3RoKSkKPj4+ICsgICAgICAgICAgICAgICAgICAgICBicmVhazsKPj4+ICsKPj4+ICsg ICAgICAgICAgICAgcmV0ID0gMDsKPj4+ICsgICAgICAgICAgICAgcXVldWVfd29yayh2ZHVzZV9p cnFfd3EsICZkZXYtPmluamVjdCk7Cj4+Cj4+IEkgd29uZGVyIGlmIGl0J3MgYmV0dGVyIHRvIHNl cGFyYXRlIGNvbmZpZyBpbnRlcnJ1cHQgb3V0IG9mIGNvbmZpZwo+PiB1cGRhdGUgb3Igd2UgbmVl ZCBkb2N1bWVudCB0aGlzLgo+Pgo+IEkgaGF2ZSBkb2N1bWVudGVkIGl0IGluIHRoZSBkb2NzLiBM b29rcyBsaWtlIGEgY29uZmlnIHVwZGF0ZSBzaG91bGQgYmUKPiBhbHdheXMgZm9sbG93ZWQgYnkg YSBjb25maWcgaW50ZXJydXB0LiBJIGRpZG4ndCBmaW5kIGEgY2FzZSB0aGF0IHVzZXMKPiB0aGVt IHNlcGFyYXRlbHkuCgoKVGhlIHVBUEkgZG9lc24ndCBwcmV2ZW50IHVzIGZyb20gdGhlIGZvbGxv d2luZyBzY2VuYXJpbzoKCnVwZGF0ZV9jb25maWcobWFjWzBdLCAuLik7CnVwZGF0ZV9jb25maWco bWF4WzFdLCAuLik7CgpTbyBpdCBsb29rcyB0byBtZSBpdCdzIGJldHRlciB0byBzZXBhcmF0ZSB0 aGUgY29uZmlnIGludGVycnVwdCBmcm9tIHRoZSAKY29uZmlnIHVwZGF0aW5nLgoKCj4KPj4+ICsg ICAgICAgICAgICAgYnJlYWs7Cj4+PiArICAgICB9Cj4+PiArICAgICBjYXNlIFZEVVNFX1ZRX0dF VF9JTkZPOiB7Cj4+Cj4+IERvIHdlIG5lZWQgdG8gbGltaXQgdGhpcyBvbmx5IHdoZW4gRFJJVkVS X09LIGlzIHNldD8KPj4KPiBBbnkgcmVhc29uIHRvIGFkZCB0aGlzIGxpbWl0YXRpb24/CgoKT3Ro ZXJ3aXNlIHRoZSB2cSBpcyBub3QgZnVsbHkgaW5pdGlhbGl6ZWQsIGUuZyB0aGUgZGVzY19hZGRy IG1pZ2h0IG5vdCAKYmUgY29ycmVjdC4KCgo+Cj4+PiArICAgICAgICAgICAgIHN0cnVjdCB2ZHVz ZV92cV9pbmZvIHZxX2luZm87Cj4+PiArICAgICAgICAgICAgIHUzMiB2cV9pbmRleDsKPj4+ICsK Pj4+ICsgICAgICAgICAgICAgcmV0ID0gLUVGQVVMVDsKPj4+ICsgICAgICAgICAgICAgaWYgKGNv cHlfZnJvbV91c2VyKCZ2cV9pbmZvLCBhcmdwLCBzaXplb2YodnFfaW5mbykpKQo+Pj4gKyAgICAg ICAgICAgICAgICAgICAgIGJyZWFrOwo+Pj4gKwo+Pj4gKyAgICAgICAgICAgICByZXQgPSAtRUlO VkFMOwo+Pj4gKyAgICAgICAgICAgICBpZiAodnFfaW5mby5pbmRleCA+PSBkZXYtPnZxX251bSkK Pj4+ICsgICAgICAgICAgICAgICAgICAgICBicmVhazsKPj4+ICsKPj4+ICsgICAgICAgICAgICAg dnFfaW5kZXggPSBhcnJheV9pbmRleF9ub3NwZWModnFfaW5mby5pbmRleCwgZGV2LT52cV9udW0p Owo+Pj4gKyAgICAgICAgICAgICB2cV9pbmZvLmRlc2NfYWRkciA9IGRldi0+dnFzW3ZxX2luZGV4 XS5kZXNjX2FkZHI7Cj4+PiArICAgICAgICAgICAgIHZxX2luZm8uZHJpdmVyX2FkZHIgPSBkZXYt PnZxc1t2cV9pbmRleF0uZHJpdmVyX2FkZHI7Cj4+PiArICAgICAgICAgICAgIHZxX2luZm8uZGV2 aWNlX2FkZHIgPSBkZXYtPnZxc1t2cV9pbmRleF0uZGV2aWNlX2FkZHI7Cj4+PiArICAgICAgICAg ICAgIHZxX2luZm8ubnVtID0gZGV2LT52cXNbdnFfaW5kZXhdLm51bTsKPj4+ICsgICAgICAgICAg ICAgdnFfaW5mby5hdmFpbF9pZHggPSBkZXYtPnZxc1t2cV9pbmRleF0uYXZhaWxfaWR4Owo+Pj4g KyAgICAgICAgICAgICB2cV9pbmZvLnJlYWR5ID0gZGV2LT52cXNbdnFfaW5kZXhdLnJlYWR5Owo+ Pj4gKwo+Pj4gKyAgICAgICAgICAgICByZXQgPSAtRUZBVUxUOwo+Pj4gKyAgICAgICAgICAgICBp ZiAoY29weV90b191c2VyKGFyZ3AsICZ2cV9pbmZvLCBzaXplb2YodnFfaW5mbykpKQo+Pj4gKyAg ICAgICAgICAgICAgICAgICAgIGJyZWFrOwo+Pj4gKwo+Pj4gKyAgICAgICAgICAgICByZXQgPSAw Owo+Pj4gKyAgICAgICAgICAgICBicmVhazsKPj4+ICsgICAgIH0KPj4+ICsgICAgIGNhc2UgVkRV U0VfVlFfU0VUVVBfS0lDS0ZEOiB7Cj4+PiArICAgICAgICAgICAgIHN0cnVjdCB2ZHVzZV92cV9l dmVudGZkIGV2ZW50ZmQ7Cj4+PiArCj4+PiArICAgICAgICAgICAgIHJldCA9IC1FRkFVTFQ7Cj4+ PiArICAgICAgICAgICAgIGlmIChjb3B5X2Zyb21fdXNlcigmZXZlbnRmZCwgYXJncCwgc2l6ZW9m KGV2ZW50ZmQpKSkKPj4+ICsgICAgICAgICAgICAgICAgICAgICBicmVhazsKPj4+ICsKPj4+ICsg ICAgICAgICAgICAgcmV0ID0gdmR1c2Vfa2lja2ZkX3NldHVwKGRldiwgJmV2ZW50ZmQpOwo+Pj4g KyAgICAgICAgICAgICBicmVhazsKPj4+ICsgICAgIH0KPj4+ICsgICAgIGNhc2UgVkRVU0VfVlFf SU5KRUNUX0lSUTogewo+Pj4gKyAgICAgICAgICAgICB1MzIgdnFfaW5kZXg7Cj4+PiArCj4+PiAr ICAgICAgICAgICAgIHJldCA9IC1FRkFVTFQ7Cj4+PiArICAgICAgICAgICAgIGlmIChnZXRfdXNl cih2cV9pbmRleCwgKHUzMiBfX3VzZXIgKilhcmdwKSkKPj4+ICsgICAgICAgICAgICAgICAgICAg ICBicmVhazsKPj4+ICsKPj4+ICsgICAgICAgICAgICAgcmV0ID0gLUVJTlZBTDsKPj4+ICsgICAg ICAgICAgICAgaWYgKHZxX2luZGV4ID49IGRldi0+dnFfbnVtKQo+Pj4gKyAgICAgICAgICAgICAg ICAgICAgIGJyZWFrOwo+Pj4gKwo+Pj4gKyAgICAgICAgICAgICByZXQgPSAwOwo+Pj4gKyAgICAg ICAgICAgICB2cV9pbmRleCA9IGFycmF5X2luZGV4X25vc3BlYyh2cV9pbmRleCwgZGV2LT52cV9u dW0pOwo+Pj4gKyAgICAgICAgICAgICBxdWV1ZV93b3JrKHZkdXNlX2lycV93cSwgJmRldi0+dnFz W3ZxX2luZGV4XS5pbmplY3QpOwo+Pj4gKyAgICAgICAgICAgICBicmVhazsKPj4+ICsgICAgIH0K Pj4+ICsgICAgIGRlZmF1bHQ6Cj4+PiArICAgICAgICAgICAgIHJldCA9IC1FTk9JT0NUTENNRDsK Pj4+ICsgICAgICAgICAgICAgYnJlYWs7Cj4+PiArICAgICB9Cj4+PiArCj4+PiArICAgICByZXR1 cm4gcmV0Owo+Pj4gK30KPj4+ICsKPj4+ICtzdGF0aWMgaW50IHZkdXNlX2Rldl9yZWxlYXNlKHN0 cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQo+Pj4gK3sKPj4+ICsgICAgIHN0 cnVjdCB2ZHVzZV9kZXYgKmRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKPj4+ICsKPj4+ICsgICAg IHNwaW5fbG9jaygmZGV2LT5tc2dfbG9jayk7Cj4+PiArICAgICAvKiBNYWtlIHN1cmUgdGhlIGlu ZmxpZ2h0IG1lc3NhZ2VzIGNhbiBwcm9jZXNzZWQgYWZ0ZXIgcmVjb25uY2VjdGlvbiAqLwo+Pj4g KyAgICAgbGlzdF9zcGxpY2VfaW5pdCgmZGV2LT5yZWN2X2xpc3QsICZkZXYtPnNlbmRfbGlzdCk7 Cj4+PiArICAgICBzcGluX3VubG9jaygmZGV2LT5tc2dfbG9jayk7Cj4+PiArICAgICBkZXYtPmNv bm5lY3RlZCA9IGZhbHNlOwo+Pj4gKwo+Pj4gKyAgICAgcmV0dXJuIDA7Cj4+PiArfQo+Pj4gKwo+ Pj4gK3N0YXRpYyBzdHJ1Y3QgdmR1c2VfZGV2ICp2ZHVzZV9kZXZfZ2V0X2Zyb21fbWlub3IoaW50 IG1pbm9yKQo+Pj4gK3sKPj4+ICsgICAgIHN0cnVjdCB2ZHVzZV9kZXYgKmRldjsKPj4+ICsKPj4+ ICsgICAgIG11dGV4X2xvY2soJnZkdXNlX2xvY2spOwo+Pj4gKyAgICAgZGV2ID0gaWRyX2ZpbmQo JnZkdXNlX2lkciwgbWlub3IpOwo+Pj4gKyAgICAgbXV0ZXhfdW5sb2NrKCZ2ZHVzZV9sb2NrKTsK Pj4+ICsKPj4+ICsgICAgIHJldHVybiBkZXY7Cj4+PiArfQo+Pj4gKwo+Pj4gK3N0YXRpYyBpbnQg dmR1c2VfZGV2X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCj4+ PiArewo+Pj4gKyAgICAgaW50IHJldDsKPj4+ICsgICAgIHN0cnVjdCB2ZHVzZV9kZXYgKmRldiA9 IHZkdXNlX2Rldl9nZXRfZnJvbV9taW5vcihpbWlub3IoaW5vZGUpKTsKPj4+ICsKPj4+ICsgICAg IGlmICghZGV2KQo+Pj4gKyAgICAgICAgICAgICByZXR1cm4gLUVOT0RFVjsKPj4+ICsKPj4+ICsg ICAgIHJldCA9IC1FQlVTWTsKPj4+ICsgICAgIG11dGV4X2xvY2soJmRldi0+bG9jayk7Cj4+PiAr ICAgICBpZiAoZGV2LT5jb25uZWN0ZWQpCj4+PiArICAgICAgICAgICAgIGdvdG8gdW5sb2NrOwo+ Pj4gKwo+Pj4gKyAgICAgcmV0ID0gMDsKPj4+ICsgICAgIGRldi0+Y29ubmVjdGVkID0gdHJ1ZTsK Pj4+ICsgICAgIGZpbGUtPnByaXZhdGVfZGF0YSA9IGRldjsKPj4+ICt1bmxvY2s6Cj4+PiArICAg ICBtdXRleF91bmxvY2soJmRldi0+bG9jayk7Cj4+PiArCj4+PiArICAgICByZXR1cm4gcmV0Owo+ Pj4gK30KPj4+ICsKPj4+ICtzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB2ZHVz ZV9kZXZfZm9wcyA9IHsKPj4+ICsgICAgIC5vd25lciAgICAgICAgICA9IFRISVNfTU9EVUxFLAo+ Pj4gKyAgICAgLm9wZW4gICAgICAgICAgID0gdmR1c2VfZGV2X29wZW4sCj4+PiArICAgICAucmVs ZWFzZSAgICAgICAgPSB2ZHVzZV9kZXZfcmVsZWFzZSwKPj4+ICsgICAgIC5yZWFkX2l0ZXIgICAg ICA9IHZkdXNlX2Rldl9yZWFkX2l0ZXIsCj4+PiArICAgICAud3JpdGVfaXRlciAgICAgPSB2ZHVz ZV9kZXZfd3JpdGVfaXRlciwKPj4+ICsgICAgIC5wb2xsICAgICAgICAgICA9IHZkdXNlX2Rldl9w b2xsLAo+Pj4gKyAgICAgLnVubG9ja2VkX2lvY3RsID0gdmR1c2VfZGV2X2lvY3RsLAo+Pj4gKyAg ICAgLmNvbXBhdF9pb2N0bCAgID0gY29tcGF0X3B0cl9pb2N0bCwKPj4+ICsgICAgIC5sbHNlZWsg ICAgICAgICA9IG5vb3BfbGxzZWVrLAo+Pj4gK307Cj4+PiArCj4+PiArc3RhdGljIHN0cnVjdCB2 ZHVzZV9kZXYgKnZkdXNlX2Rldl9jcmVhdGUodm9pZCkKPj4+ICt7Cj4+PiArICAgICBzdHJ1Y3Qg dmR1c2VfZGV2ICpkZXYgPSBremFsbG9jKHNpemVvZigqZGV2KSwgR0ZQX0tFUk5FTCk7Cj4+PiAr Cj4+PiArICAgICBpZiAoIWRldikKPj4+ICsgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Cj4+PiAr Cj4+PiArICAgICBtdXRleF9pbml0KCZkZXYtPmxvY2spOwo+Pj4gKyAgICAgc3Bpbl9sb2NrX2lu aXQoJmRldi0+bXNnX2xvY2spOwo+Pj4gKyAgICAgSU5JVF9MSVNUX0hFQUQoJmRldi0+c2VuZF9s aXN0KTsKPj4+ICsgICAgIElOSVRfTElTVF9IRUFEKCZkZXYtPnJlY3ZfbGlzdCk7Cj4+PiArICAg ICBzcGluX2xvY2tfaW5pdCgmZGV2LT5pcnFfbG9jayk7Cj4+PiArCj4+PiArICAgICBJTklUX1dP UksoJmRldi0+aW5qZWN0LCB2ZHVzZV9kZXZfaXJxX2luamVjdCk7Cj4+PiArICAgICBpbml0X3dh aXRxdWV1ZV9oZWFkKCZkZXYtPndhaXRxKTsKPj4+ICsKPj4+ICsgICAgIHJldHVybiBkZXY7Cj4+ PiArfQo+Pj4gKwo+Pj4gK3N0YXRpYyB2b2lkIHZkdXNlX2Rldl9kZXN0cm95KHN0cnVjdCB2ZHVz ZV9kZXYgKmRldikKPj4+ICt7Cj4+PiArICAgICBrZnJlZShkZXYpOwo+Pj4gK30KPj4+ICsKPj4+ ICtzdGF0aWMgc3RydWN0IHZkdXNlX2RldiAqdmR1c2VfZmluZF9kZXYoY29uc3QgY2hhciAqbmFt ZSkKPj4+ICt7Cj4+PiArICAgICBzdHJ1Y3QgdmR1c2VfZGV2ICpkZXY7Cj4+PiArICAgICBpbnQg aWQ7Cj4+PiArCj4+PiArICAgICBpZHJfZm9yX2VhY2hfZW50cnkoJnZkdXNlX2lkciwgZGV2LCBp ZCkKPj4+ICsgICAgICAgICAgICAgaWYgKCFzdHJjbXAoZGV2LT5uYW1lLCBuYW1lKSkKPj4+ICsg ICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGV2Owo+Pj4gKwo+Pj4gKyAgICAgcmV0dXJuIE5V TEw7Cj4+PiArfQo+Pj4gKwo+Pj4gK3N0YXRpYyBpbnQgdmR1c2VfZGVzdHJveV9kZXYoY2hhciAq bmFtZSkKPj4+ICt7Cj4+PiArICAgICBzdHJ1Y3QgdmR1c2VfZGV2ICpkZXYgPSB2ZHVzZV9maW5k X2RldihuYW1lKTsKPj4+ICsKPj4+ICsgICAgIGlmICghZGV2KQo+Pj4gKyAgICAgICAgICAgICBy ZXR1cm4gLUVJTlZBTDsKPj4+ICsKPj4+ICsgICAgIG11dGV4X2xvY2soJmRldi0+bG9jayk7Cj4+ PiArICAgICBpZiAoZGV2LT52ZGV2IHx8IGRldi0+Y29ubmVjdGVkKSB7Cj4+PiArICAgICAgICAg ICAgIG11dGV4X3VubG9jaygmZGV2LT5sb2NrKTsKPj4+ICsgICAgICAgICAgICAgcmV0dXJuIC1F QlVTWTsKPj4+ICsgICAgIH0KPj4+ICsgICAgIGRldi0+Y29ubmVjdGVkID0gdHJ1ZTsKPj4+ICsg ICAgIG11dGV4X3VubG9jaygmZGV2LT5sb2NrKTsKPj4+ICsKPj4+ICsgICAgIHZkdXNlX2Rldl9t c2dfY2xlYW51cChkZXYpOwo+Pj4gKyAgICAgZGV2aWNlX2Rlc3Ryb3kodmR1c2VfY2xhc3MsIE1L REVWKE1BSk9SKHZkdXNlX21ham9yKSwgZGV2LT5taW5vcikpOwo+Pj4gKyAgICAgaWRyX3JlbW92 ZSgmdmR1c2VfaWRyLCBkZXYtPm1pbm9yKTsKPj4+ICsgICAgIGt2ZnJlZShkZXYtPmNvbmZpZyk7 Cj4+PiArICAgICBrZnJlZShkZXYtPnZxcyk7Cj4+PiArICAgICB2ZHVzZV9kb21haW5fZGVzdHJv eShkZXYtPmRvbWFpbik7Cj4+PiArICAgICBrZnJlZShkZXYtPm5hbWUpOwo+Pj4gKyAgICAgdmR1 c2VfZGV2X2Rlc3Ryb3koZGV2KTsKPj4+ICsgICAgIG1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOwo+ Pj4gKwo+Pj4gKyAgICAgcmV0dXJuIDA7Cj4+PiArfQo+Pj4gKwo+Pj4gK3N0YXRpYyBib29sIGRl dmljZV9pc19hbGxvd2VkKHUzMiBkZXZpY2VfaWQpCj4+PiArewo+Pj4gKyAgICAgaW50IGk7Cj4+ PiArCj4+PiArICAgICBmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhbGxvd2VkX2RldmljZV9p ZCk7IGkrKykKPj4+ICsgICAgICAgICAgICAgaWYgKGFsbG93ZWRfZGV2aWNlX2lkW2ldID09IGRl dmljZV9pZCkKPj4+ICsgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKPj4+ICsKPj4+ ICsgICAgIHJldHVybiBmYWxzZTsKPj4+ICt9Cj4+PiArCj4+PiArc3RhdGljIGJvb2wgZmVhdHVy ZXNfaXNfdmFsaWQodTY0IGZlYXR1cmVzKQo+Pj4gK3sKPj4+ICsgICAgIGlmICghKGZlYXR1cmVz ICYgKDFVTEwgPDwgVklSVElPX0ZfQUNDRVNTX1BMQVRGT1JNKSkpCj4+PiArICAgICAgICAgICAg IHJldHVybiBmYWxzZTsKPj4+ICsKPj4+ICsgICAgIC8qIE5vdyB3ZSBvbmx5IHN1cHBvcnQgcmVh ZC1vbmx5IGNvbmZpZ3VyYXRpb24gc3BhY2UgKi8KPj4+ICsgICAgIGlmIChmZWF0dXJlcyAmICgx VUxMIDw8IFZJUlRJT19CTEtfRl9DT05GSUdfV0NFKSkKPj4+ICsgICAgICAgICAgICAgcmV0dXJu IGZhbHNlOwo+Pj4gKwo+Pj4gKyAgICAgcmV0dXJuIHRydWU7Cj4+PiArfQo+Pj4gKwo+Pj4gK3N0 YXRpYyBib29sIHZkdXNlX3ZhbGlkYXRlX2NvbmZpZyhzdHJ1Y3QgdmR1c2VfZGV2X2NvbmZpZyAq Y29uZmlnKQo+Pj4gK3sKPj4+ICsgICAgIGlmIChjb25maWctPmJvdW5jZV9zaXplID4gVkRVU0Vf TUFYX0JPVU5DRV9TSVpFKQo+Pj4gKyAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Cj4+PiArCj4+ PiArICAgICBpZiAoY29uZmlnLT52cV9hbGlnbiA+IFBBR0VfU0laRSkKPj4+ICsgICAgICAgICAg ICAgcmV0dXJuIGZhbHNlOwo+Pj4gKwo+Pj4gKyAgICAgaWYgKGNvbmZpZy0+Y29uZmlnX3NpemUg PiBQQUdFX1NJWkUpCj4+PiArICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKPj4+ICsKPj4+ICsg ICAgIGlmICghZGV2aWNlX2lzX2FsbG93ZWQoY29uZmlnLT5kZXZpY2VfaWQpKQo+Pj4gKyAgICAg ICAgICAgICByZXR1cm4gZmFsc2U7Cj4+PiArCj4+PiArICAgICBpZiAoIWZlYXR1cmVzX2lzX3Zh bGlkKGNvbmZpZy0+ZmVhdHVyZXMpKQo+Pj4gKyAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Cj4+ Cj4+IERvIHdlIG5lZWQgdG8gdmFsaWRhdGUgd2hldGhlciBvciBub3QgY29uZmlnX3NpemUgaXMg dG9vIHNtYWxsIG90aGVyd2lzZQo+PiB3ZSBtYXkgaGF2ZSBPT0IgYWNjZXNzIGluIGdldF9jb25m aWcoKT8KPj4KPiBIb3cgYWJvdXQgYWRkaW5nIHZhbGlkYXRpb24gaW4gZ2V0X2NvbmZpZygpPyBJ dCBzZWVtcyB0byBiZSBoYXJkIHRvCj4gZGVmaW5lIHRoZSBsb3dlciBib3VuZC4KCgpJdCBzaG91 bGQgd29yay4KClRoYW5rcwoKCj4KPj4+ICsKPj4+ICsgICAgIHJldHVybiB0cnVlOwo+Pj4gK30K Pj4+ICsKPj4+ICtzdGF0aWMgaW50IHZkdXNlX2NyZWF0ZV9kZXYoc3RydWN0IHZkdXNlX2Rldl9j b25maWcgKmNvbmZpZywKPj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY29uZmln X2J1ZiwgdTY0IGFwaV92ZXJzaW9uKQo+Pj4gK3sKPj4+ICsgICAgIGludCBpLCByZXQ7Cj4+PiAr ICAgICBzdHJ1Y3QgdmR1c2VfZGV2ICpkZXY7Cj4+PiArCj4+PiArICAgICByZXQgPSAtRUVYSVNU Owo+Pj4gKyAgICAgaWYgKHZkdXNlX2ZpbmRfZGV2KGNvbmZpZy0+bmFtZSkpCj4+PiArICAgICAg ICAgICAgIGdvdG8gZXJyOwo+Pj4gKwo+Pj4gKyAgICAgcmV0ID0gLUVOT01FTTsKPj4+ICsgICAg IGRldiA9IHZkdXNlX2Rldl9jcmVhdGUoKTsKPj4+ICsgICAgIGlmICghZGV2KQo+Pj4gKyAgICAg ICAgICAgICBnb3RvIGVycjsKPj4+ICsKPj4+ICsgICAgIGRldi0+YXBpX3ZlcnNpb24gPSBhcGlf dmVyc2lvbjsKPj4+ICsgICAgIGRldi0+dXNlcl9mZWF0dXJlcyA9IGNvbmZpZy0+ZmVhdHVyZXM7 Cj4+PiArICAgICBkZXYtPmRldmljZV9pZCA9IGNvbmZpZy0+ZGV2aWNlX2lkOwo+Pj4gKyAgICAg ZGV2LT52ZW5kb3JfaWQgPSBjb25maWctPnZlbmRvcl9pZDsKPj4+ICsgICAgIGRldi0+bmFtZSA9 IGtzdHJkdXAoY29uZmlnLT5uYW1lLCBHRlBfS0VSTkVMKTsKPj4+ICsgICAgIGlmICghZGV2LT5u YW1lKQo+Pj4gKyAgICAgICAgICAgICBnb3RvIGVycl9zdHI7Cj4+PiArCj4+PiArICAgICBkZXYt PmRvbWFpbiA9IHZkdXNlX2RvbWFpbl9jcmVhdGUoVkRVU0VfSU9WQV9TSVpFIC0gMSwKPj4+ICsg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPmJvdW5jZV9zaXpl KTsKPj4+ICsgICAgIGlmICghZGV2LT5kb21haW4pCj4+PiArICAgICAgICAgICAgIGdvdG8gZXJy X2RvbWFpbjsKPj4+ICsKPj4+ICsgICAgIGRldi0+Y29uZmlnID0gY29uZmlnX2J1ZjsKPj4+ICsg ICAgIGRldi0+Y29uZmlnX3NpemUgPSBjb25maWctPmNvbmZpZ19zaXplOwo+Pj4gKyAgICAgZGV2 LT52cV9hbGlnbiA9IGNvbmZpZy0+dnFfYWxpZ247Cj4+PiArICAgICBkZXYtPnZxX3NpemVfbWF4 ID0gY29uZmlnLT52cV9zaXplX21heDsKPj4+ICsgICAgIGRldi0+dnFfbnVtID0gY29uZmlnLT52 cV9udW07Cj4+PiArICAgICBkZXYtPnZxcyA9IGtjYWxsb2MoZGV2LT52cV9udW0sIHNpemVvZigq ZGV2LT52cXMpLCBHRlBfS0VSTkVMKTsKPj4+ICsgICAgIGlmICghZGV2LT52cXMpCj4+PiArICAg ICAgICAgICAgIGdvdG8gZXJyX3ZxczsKPj4+ICsKPj4+ICsgICAgIGZvciAoaSA9IDA7IGkgPCBk ZXYtPnZxX251bTsgaSsrKSB7Cj4+PiArICAgICAgICAgICAgIGRldi0+dnFzW2ldLmluZGV4ID0g aTsKPj4+ICsgICAgICAgICAgICAgSU5JVF9XT1JLKCZkZXYtPnZxc1tpXS5pbmplY3QsIHZkdXNl X3ZxX2lycV9pbmplY3QpOwo+Pj4gKyAgICAgICAgICAgICBzcGluX2xvY2tfaW5pdCgmZGV2LT52 cXNbaV0ua2lja19sb2NrKTsKPj4+ICsgICAgICAgICAgICAgc3Bpbl9sb2NrX2luaXQoJmRldi0+ dnFzW2ldLmlycV9sb2NrKTsKPj4+ICsgICAgIH0KPj4+ICsKPj4+ICsgICAgIHJldCA9IGlkcl9h bGxvYygmdmR1c2VfaWRyLCBkZXYsIDEsIFZEVVNFX0RFVl9NQVgsIEdGUF9LRVJORUwpOwo+Pj4g KyAgICAgaWYgKHJldCA8IDApCj4+PiArICAgICAgICAgICAgIGdvdG8gZXJyX2lkcjsKPj4+ICsK Pj4+ICsgICAgIGRldi0+bWlub3IgPSByZXQ7Cj4+PiArICAgICBkZXYtPmRldiA9IGRldmljZV9j cmVhdGUodmR1c2VfY2xhc3MsIE5VTEwsCj4+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgTUtERVYoTUFKT1IodmR1c2VfbWFqb3IpLCBkZXYtPm1pbm9yKSwKPj4+ICsgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBOVUxMLCAiJXMiLCBjb25maWctPm5hbWUpOwo+Pj4gKyAgICAg aWYgKElTX0VSUihkZXYtPmRldikpIHsKPj4+ICsgICAgICAgICAgICAgcmV0ID0gUFRSX0VSUihk ZXYtPmRldik7Cj4+PiArICAgICAgICAgICAgIGdvdG8gZXJyX2RldjsKPj4+ICsgICAgIH0KPj4+ ICsgICAgIF9fbW9kdWxlX2dldChUSElTX01PRFVMRSk7Cj4+PiArCj4+PiArICAgICByZXR1cm4g MDsKPj4+ICtlcnJfZGV2Ogo+Pj4gKyAgICAgaWRyX3JlbW92ZSgmdmR1c2VfaWRyLCBkZXYtPm1p bm9yKTsKPj4+ICtlcnJfaWRyOgo+Pj4gKyAgICAga2ZyZWUoZGV2LT52cXMpOwo+Pj4gK2Vycl92 cXM6Cj4+PiArICAgICB2ZHVzZV9kb21haW5fZGVzdHJveShkZXYtPmRvbWFpbik7Cj4+PiArZXJy X2RvbWFpbjoKPj4+ICsgICAgIGtmcmVlKGRldi0+bmFtZSk7Cj4+PiArZXJyX3N0cjoKPj4+ICsg ICAgIHZkdXNlX2Rldl9kZXN0cm95KGRldik7Cj4+PiArZXJyOgo+Pj4gKyAgICAga3ZmcmVlKGNv bmZpZ19idWYpOwo+Pj4gKyAgICAgcmV0dXJuIHJldDsKPj4+ICt9Cj4+PiArCj4+PiArc3RhdGlj IGxvbmcgdmR1c2VfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCj4+ PiArICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBhcmcpCj4+PiArewo+Pj4gKyAg ICAgaW50IHJldDsKPj4+ICsgICAgIHZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICop YXJnOwo+Pj4gKyAgICAgc3RydWN0IHZkdXNlX2NvbnRyb2wgKmNvbnRyb2wgPSBmaWxlLT5wcml2 YXRlX2RhdGE7Cj4+PiArCj4+PiArICAgICBtdXRleF9sb2NrKCZ2ZHVzZV9sb2NrKTsKPj4+ICsg ICAgIHN3aXRjaCAoY21kKSB7Cj4+PiArICAgICBjYXNlIFZEVVNFX0dFVF9BUElfVkVSU0lPTjoK Pj4+ICsgICAgICAgICAgICAgcmV0ID0gcHV0X3VzZXIoY29udHJvbC0+YXBpX3ZlcnNpb24sICh1 NjQgX191c2VyICopYXJncCk7Cj4+PiArICAgICAgICAgICAgIGJyZWFrOwo+Pj4gKyAgICAgY2Fz ZSBWRFVTRV9TRVRfQVBJX1ZFUlNJT046IHsKPj4+ICsgICAgICAgICAgICAgdTY0IGFwaV92ZXJz aW9uOwo+Pj4gKwo+Pj4gKyAgICAgICAgICAgICByZXQgPSAtRUZBVUxUOwo+Pj4gKyAgICAgICAg ICAgICBpZiAoZ2V0X3VzZXIoYXBpX3ZlcnNpb24sICh1NjQgX191c2VyICopYXJncCkpCj4+PiAr ICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Cj4+PiArCj4+PiArICAgICAgICAgICAgIHJldCA9 IC1FSU5WQUw7Cj4+PiArICAgICAgICAgICAgIGlmIChhcGlfdmVyc2lvbiA+IFZEVVNFX0FQSV9W RVJTSU9OKQo+Pj4gKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwo+Pj4gKwo+Pj4gKyAgICAg ICAgICAgICByZXQgPSAwOwo+Pj4gKyAgICAgICAgICAgICBjb250cm9sLT5hcGlfdmVyc2lvbiA9 IGFwaV92ZXJzaW9uOwo+Pj4gKyAgICAgICAgICAgICBicmVhazsKPj4+ICsgICAgIH0KPj4+ICsg ICAgIGNhc2UgVkRVU0VfQ1JFQVRFX0RFVjogewo+Pj4gKyAgICAgICAgICAgICBzdHJ1Y3QgdmR1 c2VfZGV2X2NvbmZpZyBjb25maWc7Cj4+PiArICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgc2l6 ZSA9IG9mZnNldG9mKHN0cnVjdCB2ZHVzZV9kZXZfY29uZmlnLCBjb25maWcpOwo+Pj4gKyAgICAg ICAgICAgICB2b2lkICpidWY7Cj4+PiArCj4+PiArICAgICAgICAgICAgIHJldCA9IC1FRkFVTFQ7 Cj4+PiArICAgICAgICAgICAgIGlmIChjb3B5X2Zyb21fdXNlcigmY29uZmlnLCBhcmdwLCBzaXpl KSkKPj4+ICsgICAgICAgICAgICAgICAgICAgICBicmVhazsKPj4+ICsKPj4+ICsgICAgICAgICAg ICAgcmV0ID0gLUVJTlZBTDsKPj4+ICsgICAgICAgICAgICAgaWYgKHZkdXNlX3ZhbGlkYXRlX2Nv bmZpZygmY29uZmlnKSA9PSBmYWxzZSkKPj4+ICsgICAgICAgICAgICAgICAgICAgICBicmVhazsK Pj4+ICsKPj4+ICsgICAgICAgICAgICAgYnVmID0gdm1lbWR1cF91c2VyKGFyZ3AgKyBzaXplLCBj b25maWcuY29uZmlnX3NpemUpOwo+Pj4gKyAgICAgICAgICAgICBpZiAoSVNfRVJSKGJ1ZikpIHsK Pj4+ICsgICAgICAgICAgICAgICAgICAgICByZXQgPSBQVFJfRVJSKGJ1Zik7Cj4+PiArICAgICAg ICAgICAgICAgICAgICAgYnJlYWs7Cj4+PiArICAgICAgICAgICAgIH0KPj4+ICsgICAgICAgICAg ICAgcmV0ID0gdmR1c2VfY3JlYXRlX2RldigmY29uZmlnLCBidWYsIGNvbnRyb2wtPmFwaV92ZXJz aW9uKTsKPj4+ICsgICAgICAgICAgICAgYnJlYWs7Cj4+PiArICAgICB9Cj4+PiArICAgICBjYXNl IFZEVVNFX0RFU1RST1lfREVWOiB7Cj4+PiArICAgICAgICAgICAgIGNoYXIgbmFtZVtWRFVTRV9O QU1FX01BWF07Cj4+PiArCj4+PiArICAgICAgICAgICAgIHJldCA9IC1FRkFVTFQ7Cj4+PiArICAg ICAgICAgICAgIGlmIChjb3B5X2Zyb21fdXNlcihuYW1lLCBhcmdwLCBWRFVTRV9OQU1FX01BWCkp Cj4+PiArICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Cj4+PiArCj4+PiArICAgICAgICAgICAg IHJldCA9IHZkdXNlX2Rlc3Ryb3lfZGV2KG5hbWUpOwo+Pj4gKyAgICAgICAgICAgICBicmVhazsK Pj4+ICsgICAgIH0KPj4+ICsgICAgIGRlZmF1bHQ6Cj4+PiArICAgICAgICAgICAgIHJldCA9IC1F SU5WQUw7Cj4+PiArICAgICAgICAgICAgIGJyZWFrOwo+Pj4gKyAgICAgfQo+Pj4gKyAgICAgbXV0 ZXhfdW5sb2NrKCZ2ZHVzZV9sb2NrKTsKPj4+ICsKPj4+ICsgICAgIHJldHVybiByZXQ7Cj4+PiAr fQo+Pj4gKwo+Pj4gK3N0YXRpYyBpbnQgdmR1c2VfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2Rl LCBzdHJ1Y3QgZmlsZSAqZmlsZSkKPj4+ICt7Cj4+PiArICAgICBzdHJ1Y3QgdmR1c2VfY29udHJv bCAqY29udHJvbCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKPj4+ICsKPj4+ICsgICAgIGtmcmVlKGNv bnRyb2wpOwo+Pj4gKyAgICAgcmV0dXJuIDA7Cj4+PiArfQo+Pj4gKwo+Pj4gK3N0YXRpYyBpbnQg dmR1c2Vfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKPj4+ICt7 Cj4+PiArICAgICBzdHJ1Y3QgdmR1c2VfY29udHJvbCAqY29udHJvbDsKPj4+ICsKPj4+ICsgICAg IGNvbnRyb2wgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdmR1c2VfY29udHJvbCksIEdGUF9LRVJO RUwpOwo+Pj4gKyAgICAgaWYgKCFjb250cm9sKQo+Pj4gKyAgICAgICAgICAgICByZXR1cm4gLUVO T01FTTsKPj4+ICsKPj4+ICsgICAgIGNvbnRyb2wtPmFwaV92ZXJzaW9uID0gVkRVU0VfQVBJX1ZF UlNJT047Cj4+PiArICAgICBmaWxlLT5wcml2YXRlX2RhdGEgPSBjb250cm9sOwo+Pj4gKwo+Pj4g KyAgICAgcmV0dXJuIDA7Cj4+PiArfQo+Pj4gKwo+Pj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmls ZV9vcGVyYXRpb25zIHZkdXNlX2N0cmxfZm9wcyA9IHsKPj4+ICsgICAgIC5vd25lciAgICAgICAg ICA9IFRISVNfTU9EVUxFLAo+Pj4gKyAgICAgLm9wZW4gICAgICAgICAgID0gdmR1c2Vfb3BlbiwK Pj4+ICsgICAgIC5yZWxlYXNlICAgICAgICA9IHZkdXNlX3JlbGVhc2UsCj4+PiArICAgICAudW5s b2NrZWRfaW9jdGwgPSB2ZHVzZV9pb2N0bCwKPj4+ICsgICAgIC5jb21wYXRfaW9jdGwgICA9IGNv bXBhdF9wdHJfaW9jdGwsCj4+PiArICAgICAubGxzZWVrICAgICAgICAgPSBub29wX2xsc2VlaywK Pj4+ICt9Owo+Pj4gKwo+Pj4gK3N0YXRpYyBjaGFyICp2ZHVzZV9kZXZub2RlKHN0cnVjdCBkZXZp Y2UgKmRldiwgdW1vZGVfdCAqbW9kZSkKPj4+ICt7Cj4+PiArICAgICByZXR1cm4ga2FzcHJpbnRm KEdGUF9LRVJORUwsICJ2ZHVzZS8lcyIsIGRldl9uYW1lKGRldikpOwo+Pj4gK30KPj4+ICsKPj4+ ICtzdGF0aWMgdm9pZCB2ZHVzZV9tZ210ZGV2X3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQo+ Pj4gK3sKPj4+ICt9Cj4+PiArCj4+PiArc3RhdGljIHN0cnVjdCBkZXZpY2UgdmR1c2VfbWdtdGRl diA9IHsKPj4+ICsgICAgIC5pbml0X25hbWUgPSAidmR1c2UiLAo+Pj4gKyAgICAgLnJlbGVhc2Ug PSB2ZHVzZV9tZ210ZGV2X3JlbGVhc2UsCj4+PiArfTsKPj4+ICsKPj4+ICtzdGF0aWMgc3RydWN0 IHZkcGFfbWdtdF9kZXYgbWdtdF9kZXY7Cj4+PiArCj4+PiArc3RhdGljIGludCB2ZHVzZV9kZXZf aW5pdF92ZHBhKHN0cnVjdCB2ZHVzZV9kZXYgKmRldiwgY29uc3QgY2hhciAqbmFtZSkKPj4+ICt7 Cj4+PiArICAgICBzdHJ1Y3QgdmR1c2VfdmRwYSAqdmRldjsKPj4+ICsgICAgIGludCByZXQ7Cj4+ PiArCj4+PiArICAgICBpZiAoZGV2LT52ZGV2KQo+Pj4gKyAgICAgICAgICAgICByZXR1cm4gLUVF WElTVDsKPj4+ICsKPj4+ICsgICAgIHZkZXYgPSB2ZHBhX2FsbG9jX2RldmljZShzdHJ1Y3QgdmR1 c2VfdmRwYSwgdmRwYSwgZGV2LT5kZXYsCj4+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgJnZkdXNlX3ZkcGFfY29uZmlnX29wcywgbmFtZSwgdHJ1ZSk7Cj4+PiArICAgICBpZiAoIXZk ZXYpCj4+PiArICAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOwo+Pj4gKwo+Pj4gKyAgICAgZGV2 LT52ZGV2ID0gdmRldjsKPj4+ICsgICAgIHZkZXYtPmRldiA9IGRldjsKPj4+ICsgICAgIHZkZXYt PnZkcGEuZGV2LmRtYV9tYXNrID0gJnZkZXYtPnZkcGEuZGV2LmNvaGVyZW50X2RtYV9tYXNrOwo+ Pj4gKyAgICAgcmV0ID0gZG1hX3NldF9tYXNrX2FuZF9jb2hlcmVudCgmdmRldi0+dmRwYS5kZXYs IERNQV9CSVRfTUFTSyg2NCkpOwo+Pj4gKyAgICAgaWYgKHJldCkgewo+Pj4gKyAgICAgICAgICAg ICBwdXRfZGV2aWNlKCZ2ZGV2LT52ZHBhLmRldik7Cj4+PiArICAgICAgICAgICAgIHJldHVybiBy ZXQ7Cj4+PiArICAgICB9Cj4+PiArICAgICBzZXRfZG1hX29wcygmdmRldi0+dmRwYS5kZXYsICZ2 ZHVzZV9kZXZfZG1hX29wcyk7Cj4+PiArICAgICB2ZGV2LT52ZHBhLmRtYV9kZXYgPSAmdmRldi0+ dmRwYS5kZXY7Cj4+PiArICAgICB2ZGV2LT52ZHBhLm1kZXYgPSAmbWdtdF9kZXY7Cj4+PiArCj4+ PiArICAgICByZXR1cm4gMDsKPj4+ICt9Cj4+PiArCj4+PiArc3RhdGljIGludCB2ZHBhX2Rldl9h ZGQoc3RydWN0IHZkcGFfbWdtdF9kZXYgKm1kZXYsIGNvbnN0IGNoYXIgKm5hbWUpCj4+PiArewo+ Pj4gKyAgICAgc3RydWN0IHZkdXNlX2RldiAqZGV2Owo+Pj4gKyAgICAgaW50IHJldDsKPj4+ICsK Pj4+ICsgICAgIG11dGV4X2xvY2soJnZkdXNlX2xvY2spOwo+Pj4gKyAgICAgZGV2ID0gdmR1c2Vf ZmluZF9kZXYobmFtZSk7Cj4+PiArICAgICBpZiAoIWRldikgewo+Pj4gKyAgICAgICAgICAgICBt dXRleF91bmxvY2soJnZkdXNlX2xvY2spOwo+Pj4gKyAgICAgICAgICAgICByZXR1cm4gLUVJTlZB TDsKPj4+ICsgICAgIH0KPj4+ICsgICAgIHJldCA9IHZkdXNlX2Rldl9pbml0X3ZkcGEoZGV2LCBu YW1lKTsKPj4+ICsgICAgIG11dGV4X3VubG9jaygmdmR1c2VfbG9jayk7Cj4+PiArICAgICBpZiAo cmV0KQo+Pj4gKyAgICAgICAgICAgICByZXR1cm4gcmV0Owo+Pj4gKwo+Pj4gKyAgICAgcmV0ID0g X3ZkcGFfcmVnaXN0ZXJfZGV2aWNlKCZkZXYtPnZkZXYtPnZkcGEsIGRldi0+dnFfbnVtKTsKPj4+ ICsgICAgIGlmIChyZXQpIHsKPj4+ICsgICAgICAgICAgICAgcHV0X2RldmljZSgmZGV2LT52ZGV2 LT52ZHBhLmRldik7Cj4+PiArICAgICAgICAgICAgIHJldHVybiByZXQ7Cj4+PiArICAgICB9Cj4+ PiArCj4+PiArICAgICByZXR1cm4gMDsKPj4+ICt9Cj4+PiArCj4+PiArc3RhdGljIHZvaWQgdmRw YV9kZXZfZGVsKHN0cnVjdCB2ZHBhX21nbXRfZGV2ICptZGV2LCBzdHJ1Y3QgdmRwYV9kZXZpY2Ug KmRldikKPj4+ICt7Cj4+PiArICAgICBfdmRwYV91bnJlZ2lzdGVyX2RldmljZShkZXYpOwo+Pj4g K30KPj4+ICsKPj4+ICtzdGF0aWMgY29uc3Qgc3RydWN0IHZkcGFfbWdtdGRldl9vcHMgdmRwYV9k ZXZfbWdtdGRldl9vcHMgPSB7Cj4+PiArICAgICAuZGV2X2FkZCA9IHZkcGFfZGV2X2FkZCwKPj4+ ICsgICAgIC5kZXZfZGVsID0gdmRwYV9kZXZfZGVsLAo+Pj4gK307Cj4+PiArCj4+PiArc3RhdGlj IHN0cnVjdCB2aXJ0aW9fZGV2aWNlX2lkIGlkX3RhYmxlW10gPSB7Cj4+PiArICAgICB7IFZJUlRJ T19JRF9CTE9DSywgVklSVElPX0RFVl9BTllfSUQgfSwKPj4+ICsgICAgIHsgMCB9LAo+Pj4gK307 Cj4+PiArCj4+PiArc3RhdGljIHN0cnVjdCB2ZHBhX21nbXRfZGV2IG1nbXRfZGV2ID0gewo+Pj4g KyAgICAgLmRldmljZSA9ICZ2ZHVzZV9tZ210ZGV2LAo+Pj4gKyAgICAgLmlkX3RhYmxlID0gaWRf dGFibGUsCj4+PiArICAgICAub3BzID0gJnZkcGFfZGV2X21nbXRkZXZfb3BzLAo+Pj4gK307Cj4+ PiArCj4+PiArc3RhdGljIGludCB2ZHVzZV9tZ210ZGV2X2luaXQodm9pZCkKPj4+ICt7Cj4+PiAr ICAgICBpbnQgcmV0Owo+Pj4gKwo+Pj4gKyAgICAgcmV0ID0gZGV2aWNlX3JlZ2lzdGVyKCZ2ZHVz ZV9tZ210ZGV2KTsKPj4+ICsgICAgIGlmIChyZXQpCj4+PiArICAgICAgICAgICAgIHJldHVybiBy ZXQ7Cj4+PiArCj4+PiArICAgICByZXQgPSB2ZHBhX21nbXRkZXZfcmVnaXN0ZXIoJm1nbXRfZGV2 KTsKPj4+ICsgICAgIGlmIChyZXQpCj4+PiArICAgICAgICAgICAgIGdvdG8gZXJyOwo+Pj4gKwo+ Pj4gKyAgICAgcmV0dXJuIDA7Cj4+PiArZXJyOgo+Pj4gKyAgICAgZGV2aWNlX3VucmVnaXN0ZXIo JnZkdXNlX21nbXRkZXYpOwo+Pj4gKyAgICAgcmV0dXJuIHJldDsKPj4+ICt9Cj4+PiArCj4+PiAr c3RhdGljIHZvaWQgdmR1c2VfbWdtdGRldl9leGl0KHZvaWQpCj4+PiArewo+Pj4gKyAgICAgdmRw YV9tZ210ZGV2X3VucmVnaXN0ZXIoJm1nbXRfZGV2KTsKPj4+ICsgICAgIGRldmljZV91bnJlZ2lz dGVyKCZ2ZHVzZV9tZ210ZGV2KTsKPj4+ICt9Cj4+PiArCj4+PiArc3RhdGljIGludCB2ZHVzZV9p bml0KHZvaWQpCj4+PiArewo+Pj4gKyAgICAgaW50IHJldDsKPj4+ICsgICAgIHN0cnVjdCBkZXZp Y2UgKmRldjsKPj4+ICsKPj4+ICsgICAgIHZkdXNlX2NsYXNzID0gY2xhc3NfY3JlYXRlKFRISVNf TU9EVUxFLCAidmR1c2UiKTsKPj4+ICsgICAgIGlmIChJU19FUlIodmR1c2VfY2xhc3MpKQo+Pj4g KyAgICAgICAgICAgICByZXR1cm4gUFRSX0VSUih2ZHVzZV9jbGFzcyk7Cj4+PiArCj4+PiArICAg ICB2ZHVzZV9jbGFzcy0+ZGV2bm9kZSA9IHZkdXNlX2Rldm5vZGU7Cj4+PiArCj4+PiArICAgICBy ZXQgPSBhbGxvY19jaHJkZXZfcmVnaW9uKCZ2ZHVzZV9tYWpvciwgMCwgVkRVU0VfREVWX01BWCwg InZkdXNlIik7Cj4+PiArICAgICBpZiAocmV0KQo+Pj4gKyAgICAgICAgICAgICBnb3RvIGVycl9j aGFyZGV2X3JlZ2lvbjsKPj4+ICsKPj4+ICsgICAgIC8qIC9kZXYvdmR1c2UvY29udHJvbCAqLwo+ Pj4gKyAgICAgY2Rldl9pbml0KCZ2ZHVzZV9jdHJsX2NkZXYsICZ2ZHVzZV9jdHJsX2ZvcHMpOwo+ Pj4gKyAgICAgdmR1c2VfY3RybF9jZGV2Lm93bmVyID0gVEhJU19NT0RVTEU7Cj4+PiArICAgICBy ZXQgPSBjZGV2X2FkZCgmdmR1c2VfY3RybF9jZGV2LCB2ZHVzZV9tYWpvciwgMSk7Cj4+PiArICAg ICBpZiAocmV0KQo+Pj4gKyAgICAgICAgICAgICBnb3RvIGVycl9jdHJsX2NkZXY7Cj4+PiArCj4+ PiArICAgICBkZXYgPSBkZXZpY2VfY3JlYXRlKHZkdXNlX2NsYXNzLCBOVUxMLCB2ZHVzZV9tYWpv ciwgTlVMTCwgImNvbnRyb2wiKTsKPj4+ICsgICAgIGlmIChJU19FUlIoZGV2KSkgewo+Pj4gKyAg ICAgICAgICAgICByZXQgPSBQVFJfRVJSKGRldik7Cj4+PiArICAgICAgICAgICAgIGdvdG8gZXJy X2RldmljZTsKPj4+ICsgICAgIH0KPj4+ICsKPj4+ICsgICAgIC8qIC9kZXYvdmR1c2UvJERFVklD RSAqLwo+Pj4gKyAgICAgY2Rldl9pbml0KCZ2ZHVzZV9jZGV2LCAmdmR1c2VfZGV2X2ZvcHMpOwo+ Pj4gKyAgICAgdmR1c2VfY2Rldi5vd25lciA9IFRISVNfTU9EVUxFOwo+Pj4gKyAgICAgcmV0ID0g Y2Rldl9hZGQoJnZkdXNlX2NkZXYsIE1LREVWKE1BSk9SKHZkdXNlX21ham9yKSwgMSksCj4+PiAr ICAgICAgICAgICAgICAgICAgICBWRFVTRV9ERVZfTUFYIC0gMSk7Cj4+PiArICAgICBpZiAocmV0 KQo+Pj4gKyAgICAgICAgICAgICBnb3RvIGVycl9jZGV2Owo+Pj4gKwo+Pj4gKyAgICAgdmR1c2Vf aXJxX3dxID0gYWxsb2Nfd29ya3F1ZXVlKCJ2ZHVzZS1pcnEiLAo+Pj4gKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgV1FfSElHSFBSSSB8IFdRX1NZU0ZTIHwgV1FfVU5CT1VORCwgMCk7Cj4+ PiArICAgICBpZiAoIXZkdXNlX2lycV93cSkKPj4+ICsgICAgICAgICAgICAgZ290byBlcnJfd3E7 Cj4+PiArCj4+PiArICAgICByZXQgPSB2ZHVzZV9kb21haW5faW5pdCgpOwo+Pj4gKyAgICAgaWYg KHJldCkKPj4+ICsgICAgICAgICAgICAgZ290byBlcnJfZG9tYWluOwo+Pj4gKwo+Pj4gKyAgICAg cmV0ID0gdmR1c2VfbWdtdGRldl9pbml0KCk7Cj4+PiArICAgICBpZiAocmV0KQo+Pj4gKyAgICAg ICAgICAgICBnb3RvIGVycl9tZ210ZGV2Owo+Pj4gKwo+Pj4gKyAgICAgcmV0dXJuIDA7Cj4+PiAr ZXJyX21nbXRkZXY6Cj4+PiArICAgICB2ZHVzZV9kb21haW5fZXhpdCgpOwo+Pj4gK2Vycl9kb21h aW46Cj4+PiArICAgICBkZXN0cm95X3dvcmtxdWV1ZSh2ZHVzZV9pcnFfd3EpOwo+Pj4gK2Vycl93 cToKPj4+ICsgICAgIGNkZXZfZGVsKCZ2ZHVzZV9jZGV2KTsKPj4+ICtlcnJfY2RldjoKPj4+ICsg ICAgIGRldmljZV9kZXN0cm95KHZkdXNlX2NsYXNzLCB2ZHVzZV9tYWpvcik7Cj4+PiArZXJyX2Rl dmljZToKPj4+ICsgICAgIGNkZXZfZGVsKCZ2ZHVzZV9jdHJsX2NkZXYpOwo+Pj4gK2Vycl9jdHJs X2NkZXY6Cj4+PiArICAgICB1bnJlZ2lzdGVyX2NocmRldl9yZWdpb24odmR1c2VfbWFqb3IsIFZE VVNFX0RFVl9NQVgpOwo+Pj4gK2Vycl9jaGFyZGV2X3JlZ2lvbjoKPj4+ICsgICAgIGNsYXNzX2Rl c3Ryb3kodmR1c2VfY2xhc3MpOwo+Pj4gKyAgICAgcmV0dXJuIHJldDsKPj4+ICt9Cj4+PiArbW9k dWxlX2luaXQodmR1c2VfaW5pdCk7Cj4+PiArCj4+PiArc3RhdGljIHZvaWQgdmR1c2VfZXhpdCh2 b2lkKQo+Pj4gK3sKPj4+ICsgICAgIHZkdXNlX21nbXRkZXZfZXhpdCgpOwo+Pj4gKyAgICAgdmR1 c2VfZG9tYWluX2V4aXQoKTsKPj4+ICsgICAgIGRlc3Ryb3lfd29ya3F1ZXVlKHZkdXNlX2lycV93 cSk7Cj4+PiArICAgICBjZGV2X2RlbCgmdmR1c2VfY2Rldik7Cj4+PiArICAgICBkZXZpY2VfZGVz dHJveSh2ZHVzZV9jbGFzcywgdmR1c2VfbWFqb3IpOwo+Pj4gKyAgICAgY2Rldl9kZWwoJnZkdXNl X2N0cmxfY2Rldik7Cj4+PiArICAgICB1bnJlZ2lzdGVyX2NocmRldl9yZWdpb24odmR1c2VfbWFq b3IsIFZEVVNFX0RFVl9NQVgpOwo+Pj4gKyAgICAgY2xhc3NfZGVzdHJveSh2ZHVzZV9jbGFzcyk7 Cj4+PiArfQo+Pj4gK21vZHVsZV9leGl0KHZkdXNlX2V4aXQpOwo+Pj4gKwo+Pj4gK01PRFVMRV9M SUNFTlNFKERSVl9MSUNFTlNFKTsKPj4+ICtNT0RVTEVfQVVUSE9SKERSVl9BVVRIT1IpOwo+Pj4g K01PRFVMRV9ERVNDUklQVElPTihEUlZfREVTQyk7Cj4+PiBkaWZmIC0tZ2l0IGEvaW5jbHVkZS91 YXBpL2xpbnV4L3ZkdXNlLmggYi9pbmNsdWRlL3VhcGkvbGludXgvdmR1c2UuaAo+Pj4gbmV3IGZp bGUgbW9kZSAxMDA2NDQKPj4+IGluZGV4IDAwMDAwMDAwMDAwMC4uZjIxYjJlNTFiNWM4Cj4+PiAt LS0gL2Rldi9udWxsCj4+PiArKysgYi9pbmNsdWRlL3VhcGkvbGludXgvdmR1c2UuaAo+Pj4gQEAg LTAsMCArMSwxNDMgQEAKPj4+ICsvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCBX SVRIIExpbnV4LXN5c2NhbGwtbm90ZSAqLwo+Pj4gKyNpZm5kZWYgX1VBUElfVkRVU0VfSF8KPj4+ ICsjZGVmaW5lIF9VQVBJX1ZEVVNFX0hfCj4+PiArCj4+PiArI2luY2x1ZGUgPGxpbnV4L3R5cGVz Lmg+Cj4+PiArCj4+PiArI2RlZmluZSBWRFVTRV9BUElfVkVSU0lPTiAgICAwCj4+PiArCj4+PiAr I2RlZmluZSBWRFVTRV9OQU1FX01BWCAgICAgICAyNTYKPj4+ICsKPj4+ICsvKiB0aGUgY29udHJv bCBtZXNzYWdlcyBkZWZpbml0aW9uIGZvciByZWFkL3dyaXRlICovCj4+PiArCj4+PiArZW51bSB2 ZHVzZV9yZXFfdHlwZSB7Cj4+PiArICAgICAvKiBHZXQgdGhlIHN0YXRlIGZvciB2aXJ0cXVldWUg ZnJvbSB1c2Vyc3BhY2UgKi8KPj4+ICsgICAgIFZEVVNFX0dFVF9WUV9TVEFURSwKPj4+ICsgICAg IC8qIE5vdGlmeSB1c2Vyc3BhY2UgdG8gc3RhcnQgdGhlIGRhdGFwbGFuZSwgbm8gcmVwbHkgKi8K Pj4+ICsgICAgIFZEVVNFX1NUQVJUX0RBVEFQTEFORSwKPj4+ICsgICAgIC8qIE5vdGlmeSB1c2Vy c3BhY2UgdG8gc3RvcCB0aGUgZGF0YXBsYW5lLCBubyByZXBseSAqLwo+Pj4gKyAgICAgVkRVU0Vf U1RPUF9EQVRBUExBTkUsCj4+PiArICAgICAvKiBOb3RpZnkgdXNlcnNwYWNlIHRvIHVwZGF0ZSB0 aGUgbWVtb3J5IG1hcHBpbmcgaW4gZGV2aWNlIElPVExCICovCj4+PiArICAgICBWRFVTRV9VUERB VEVfSU9UTEIsCj4+PiArfTsKPj4+ICsKPj4+ICtzdHJ1Y3QgdmR1c2VfdnFfc3RhdGUgewo+Pj4g KyAgICAgX191MzIgaW5kZXg7IC8qIHZpcnRxdWV1ZSBpbmRleCAqLwo+Pj4gKyAgICAgX191MzIg YXZhaWxfaWR4OyAvKiB2aXJ0cXVldWUgc3RhdGUgKGxhc3RfYXZhaWxfaWR4KSAqLwo+Pj4gK307 Cj4+Cj4+IFRoaXMgbmVlZHMgc29tZSB0d2Vha3MgdG8gc3VwcG9ydCBwYWNrZWQgdmlydHF1ZXVl Lgo+Pgo+IE9LLgo+Cj4gVGhhbmtzLAo+IFlvbmdqaQo+CgpfX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fXwppb21tdSBtYWlsaW5nIGxpc3QKaW9tbXVAbGlzdHMu bGludXgtZm91bmRhdGlvbi5vcmcKaHR0cHM6Ly9saXN0cy5saW51eGZvdW5kYXRpb24ub3JnL21h aWxtYW4vbGlzdGluZm8vaW9tbXU= From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-15.1 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,NICE_REPLY_A,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_SANE_1 autolearn=unavailable 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 0E23EC49EA4 for ; Tue, 22 Jun 2021 05:07:12 +0000 (UTC) Received: from smtp3.osuosl.org (smtp3.osuosl.org [140.211.166.136]) (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 BC24860FDB for ; Tue, 22 Jun 2021 05:07:11 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org BC24860FDB Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=virtualization-bounces@lists.linux-foundation.org Received: from localhost (localhost [127.0.0.1]) by smtp3.osuosl.org (Postfix) with ESMTP id 88839605A3; Tue, 22 Jun 2021 05:07:11 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from smtp3.osuosl.org ([127.0.0.1]) by localhost (smtp3.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id bycZtdBgKOzI; Tue, 22 Jun 2021 05:07:09 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [IPv6:2605:bc80:3010:104::8cd3:938]) by smtp3.osuosl.org (Postfix) with ESMTPS id A3571600D4; Tue, 22 Jun 2021 05:07:08 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 5050BC0023; Tue, 22 Jun 2021 05:07:08 +0000 (UTC) Received: from smtp4.osuosl.org (smtp4.osuosl.org [140.211.166.137]) by lists.linuxfoundation.org (Postfix) with ESMTP id 86919C000E for ; Tue, 22 Jun 2021 05:07:06 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by smtp4.osuosl.org (Postfix) with ESMTP id 5C9744032C for ; Tue, 22 Jun 2021 05:07:06 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Authentication-Results: smtp4.osuosl.org (amavisd-new); dkim=pass (1024-bit key) header.d=redhat.com Received: from smtp4.osuosl.org ([127.0.0.1]) by localhost (smtp4.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id Vurw24MdPLGk for ; Tue, 22 Jun 2021 05:07:03 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.8.0 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [216.205.24.124]) by smtp4.osuosl.org (Postfix) with ESMTPS id D812C40325 for ; Tue, 22 Jun 2021 05:07:02 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1624338421; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=2ZRIfQ1z1aTm2SnHKEOxbV1hbgwf/o+AvND1awWYHYY=; b=ZTzfOpQwMiLb8S4qTVmBXn4Qjam6reytn9Gh6S10R1JtQaX6qr+tjYnwQ8PintMmp8hZTN xdch5DyakJ/90Wm//nVT8VBoAaQ5nZMVKqPH7VcrVgt+Q7cF6Vo8CMmxIRA2vdRLafBPw3 nDqJFNgDcC0XWqbsl8btA3XW/UEXjCs= Received: from mail-pf1-f200.google.com (mail-pf1-f200.google.com [209.85.210.200]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-371-O-ceU4HDOD2Z_TMeSJ5Vow-1; Tue, 22 Jun 2021 01:06:58 -0400 X-MC-Unique: O-ceU4HDOD2Z_TMeSJ5Vow-1 Received: by mail-pf1-f200.google.com with SMTP id f65-20020a6251440000b02902fe9dc6c80aso8111508pfb.2 for ; Mon, 21 Jun 2021 22:06:58 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:to:cc:references:from:message-id:date :user-agent:mime-version:in-reply-to:content-transfer-encoding :content-language; bh=2ZRIfQ1z1aTm2SnHKEOxbV1hbgwf/o+AvND1awWYHYY=; b=beOLyMBdoIVPIUX5eQHRmaGnEQmkGiT4zWPt7v+xxs8SVpjWg8L3kEh1t7SijEOdhx bCok3ANoNjsDKOqlS0sFq5Y/EnSEPREP6RnwlPEXojYSmAgr1yQZN0BpRfCDicKdurdQ tFIt3lJwYZnaSG9Qo7wRr6pV8M/eZTzNReHIChgNadTpiy5J6dD0eHM6q5Nu8ppnnkXN TBZvN+tMhTnOlLl7SLKrHkONtWeXZFX+i0ZvG4i9BYR4DgWSlirPGq4GeSx7Zhj3tRBe fj//N26wflL3S1i0bXn+M/+ViGhe3UL0dob0Ilvkrtl4W8vzXx6dEYeY8oDxwjWHK6Sb mbbQ== X-Gm-Message-State: AOAM530Tmtt16wl4k69yY9WeVguXfj0LnBB3gi5zjBf7G1T10AiRx6Kz E5wfqawCOr5tZYB/fIyeJ2PzF69I6EKK/mYk9bHwvV5j68QPtNLZ5aegdjRJibxaexXJulBzIT7 k3EjoiHeHFHNSjlueIQYEEajbZYJScmumn4eWa+LtgA== X-Received: by 2002:a17:90a:1e82:: with SMTP id x2mr2029055pjx.11.1624338417786; Mon, 21 Jun 2021 22:06:57 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxWu7VJ1i8Hm/0dONPfTSH47PWWl51Y2auxRuPrZ3RZO7RXMkuwV8jx9BpjNZsql8zLcMnEfA== X-Received: by 2002:a17:90a:1e82:: with SMTP id x2mr2028995pjx.11.1624338417189; Mon, 21 Jun 2021 22:06:57 -0700 (PDT) Received: from wangxiaodeMacBook-Air.local ([209.132.188.80]) by smtp.gmail.com with ESMTPSA id q24sm18650112pgk.32.2021.06.21.22.06.49 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Mon, 21 Jun 2021 22:06:56 -0700 (PDT) Subject: Re: [PATCH v8 09/10] vduse: Introduce VDUSE - vDPA Device in Userspace To: Yongji Xie References: <20210615141331.407-1-xieyongji@bytedance.com> <20210615141331.407-10-xieyongji@bytedance.com> From: Jason Wang Message-ID: <1bba439f-ffc8-c20e-e8a4-ac73e890c592@redhat.com> Date: Tue, 22 Jun 2021 13:06:42 +0800 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:78.0) Gecko/20100101 Thunderbird/78.11.0 MIME-Version: 1.0 In-Reply-To: Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=jasowang@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Language: en-US Cc: kvm , "Michael S. Tsirkin" , virtualization , Christian Brauner , Jonathan Corbet , joro@8bytes.org, Matthew Wilcox , Christoph Hellwig , Dan Carpenter , Al Viro , Stefan Hajnoczi , songmuchun@bytedance.com, Jens Axboe , Greg KH , Randy Dunlap , linux-kernel , iommu@lists.linux-foundation.org, bcrl@kvack.org, netdev@vger.kernel.org, linux-fsdevel@vger.kernel.org, =?UTF-8?Q?Mika_Penttil=c3=a4?= X-BeenThere: virtualization@lists.linux-foundation.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: Linux virtualization List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Errors-To: virtualization-bounces@lists.linux-foundation.org Sender: "Virtualization" CuWcqCAyMDIxLzYvMjEg5LiL5Y2INjo0MSwgWW9uZ2ppIFhpZSDlhpnpgZM6Cj4gT24gTW9uLCBK dW4gMjEsIDIwMjEgYXQgNToxNCBQTSBKYXNvbiBXYW5nIDxqYXNvd2FuZ0ByZWRoYXQuY29tPiB3 cm90ZToKPj4KPj4g5ZyoIDIwMjEvNi8xNSDkuIvljYgxMDoxMywgWGllIFlvbmdqaSDlhpnpgZM6 Cj4+PiBUaGlzIFZEVVNFIGRyaXZlciBlbmFibGVzIGltcGxlbWVudGluZyB2RFBBIGRldmljZXMg aW4gdXNlcnNwYWNlLgo+Pj4gVGhlIHZEUEEgZGV2aWNlJ3MgY29udHJvbCBwYXRoIGlzIGhhbmRs ZWQgaW4ga2VybmVsIGFuZCB0aGUgZGF0YQo+Pj4gcGF0aCBpcyBoYW5kbGVkIGluIHVzZXJzcGFj ZS4KPj4+Cj4+PiBBIG1lc3NhZ2UgbWVjaG5pc20gaXMgdXNlZCBieSBWRFVTRSBkcml2ZXIgdG8g Zm9yd2FyZCBzb21lIGNvbnRyb2wKPj4+IG1lc3NhZ2VzIHN1Y2ggYXMgc3RhcnRpbmcvc3RvcHBp bmcgZGF0YXBhdGggdG8gdXNlcnNwYWNlLiBVc2Vyc3BhY2UKPj4+IGNhbiB1c2UgcmVhZCgpL3dy aXRlKCkgdG8gcmVjZWl2ZS9yZXBseSB0aG9zZSBjb250cm9sIG1lc3NhZ2VzLgo+Pj4KPj4+IEFu ZCBzb21lIGlvY3RscyBhcmUgaW50cm9kdWNlZCB0byBoZWxwIHVzZXJzcGFjZSB0byBpbXBsZW1l bnQgdGhlCj4+PiBkYXRhIHBhdGguIFZEVVNFX0lPVExCX0dFVF9GRCBpb2N0bCBjYW4gYmUgdXNl ZCB0byBnZXQgdGhlIGZpbGUKPj4+IGRlc2NyaXB0b3JzIHJlZmVycmluZyB0byB2RFBBIGRldmlj ZSdzIGlvdmEgcmVnaW9ucy4gVGhlbiB1c2Vyc3BhY2UKPj4+IGNhbiB1c2UgbW1hcCgpIHRvIGFj Y2VzcyB0aG9zZSBpb3ZhIHJlZ2lvbnMuIFZEVVNFX0RFVl9HRVRfRkVBVFVSRVMKPj4+IGFuZCBW RFVTRV9WUV9HRVRfSU5GTyBpb2N0bHMgYXJlIHVzZWQgdG8gZ2V0IHRoZSBuZWdvdGlhdGVkIGZl YXR1cmVzCj4+PiBhbmQgbWV0YWRhdGEgb2YgdmlydHF1ZXVlcy4gVkRVU0VfSU5KRUNUX1ZRX0lS USBhbmQgVkRVU0VfVlFfU0VUVVBfS0lDS0ZECj4+PiBpb2N0bHMgY2FuIGJlIHVzZWQgdG8gaW5q ZWN0IGludGVycnVwdCBhbmQgc2V0dXAgdGhlIGtpY2tmZCBmb3IKPj4+IHZpcnRxdWV1ZXMuIFZE VVNFX0RFVl9VUERBVEVfQ09ORklHIGlvY3RsIGlzIHVzZWQgdG8gdXBkYXRlIHRoZQo+Pj4gY29u ZmlndXJhdGlvbiBzcGFjZSBhbmQgaW5qZWN0IGEgY29uZmlnIGludGVycnVwdC4KPj4+Cj4+PiBT aWduZWQtb2ZmLWJ5OiBYaWUgWW9uZ2ppIDx4aWV5b25namlAYnl0ZWRhbmNlLmNvbT4KPj4+IC0t LQo+Pj4gICAgRG9jdW1lbnRhdGlvbi91c2Vyc3BhY2UtYXBpL2lvY3RsL2lvY3RsLW51bWJlci5y c3QgfCAgICAxICsKPj4+ICAgIGRyaXZlcnMvdmRwYS9LY29uZmlnICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwgICAxMCArCj4+PiAgICBkcml2ZXJzL3ZkcGEvTWFrZWZpbGUgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICB8ICAgIDEgKwo+Pj4gICAgZHJpdmVycy92ZHBhL3ZkcGFf dXNlci9NYWtlZmlsZSAgICAgICAgICAgICAgICAgICAgfCAgICA1ICsKPj4+ICAgIGRyaXZlcnMv dmRwYS92ZHBhX3VzZXIvdmR1c2VfZGV2LmMgICAgICAgICAgICAgICAgIHwgMTQ1MyArKysrKysr KysrKysrKysrKysrKwo+Pj4gICAgaW5jbHVkZS91YXBpL2xpbnV4L3ZkdXNlLmggICAgICAgICAg ICAgICAgICAgICAgICAgfCAgMTQzICsrCj4+PiAgICA2IGZpbGVzIGNoYW5nZWQsIDE2MTMgaW5z ZXJ0aW9ucygrKQo+Pj4gICAgY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvdmRwYS92ZHBhX3Vz ZXIvTWFrZWZpbGUKPj4+ICAgIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL3ZkcGEvdmRwYV91 c2VyL3ZkdXNlX2Rldi5jCj4+PiAgICBjcmVhdGUgbW9kZSAxMDA2NDQgaW5jbHVkZS91YXBpL2xp bnV4L3ZkdXNlLmgKPj4+Cj4+PiBkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi91c2Vyc3BhY2Ut YXBpL2lvY3RsL2lvY3RsLW51bWJlci5yc3QgYi9Eb2N1bWVudGF0aW9uL3VzZXJzcGFjZS1hcGkv aW9jdGwvaW9jdGwtbnVtYmVyLnJzdAo+Pj4gaW5kZXggOWJmYzJiNTEwYzY0Li5hY2Q5NWU5ZGNm ZTcgMTAwNjQ0Cj4+PiAtLS0gYS9Eb2N1bWVudGF0aW9uL3VzZXJzcGFjZS1hcGkvaW9jdGwvaW9j dGwtbnVtYmVyLnJzdAo+Pj4gKysrIGIvRG9jdW1lbnRhdGlvbi91c2Vyc3BhY2UtYXBpL2lvY3Rs L2lvY3RsLW51bWJlci5yc3QKPj4+IEBAIC0zMDAsNiArMzAwLDcgQEAgQ29kZSAgU2VxIyAgICBJ bmNsdWRlIEZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29t bWVudHMKPj4+ICAgICd6JyAgIDEwLTRGICBkcml2ZXJzL3MzOTAvY3J5cHRvL3pjcnlwdF9hcGku aCAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZsaWN0IQo+Pj4gICAgJ3wnICAgMDAtN0YgIGxp bnV4L21lZGlhLmgKPj4+ICAgIDB4ODAgIDAwLTFGICBsaW51eC9mYi5oCj4+PiArMHg4MSAgMDAt MUYgIGxpbnV4L3ZkdXNlLmgKPj4+ICAgIDB4ODkgIDAwLTA2ICBhcmNoL3g4Ni9pbmNsdWRlL2Fz bS9zb2NraW9zLmgKPj4+ICAgIDB4ODkgIDBCLURGICBsaW51eC9zb2NraW9zLmgKPj4+ICAgIDB4 ODkgIEUwLUVGICBsaW51eC9zb2NraW9zLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIFNJT0NQUk9UT1BSSVZBVEUgcmFuZ2UKPj4+IGRpZmYgLS1naXQgYS9kcml2ZXJz L3ZkcGEvS2NvbmZpZyBiL2RyaXZlcnMvdmRwYS9LY29uZmlnCj4+PiBpbmRleCBhNTAzYzFiMmJm ZDkuLjZlMjNiY2U2NDMzYSAxMDA2NDQKPj4+IC0tLSBhL2RyaXZlcnMvdmRwYS9LY29uZmlnCj4+ PiArKysgYi9kcml2ZXJzL3ZkcGEvS2NvbmZpZwo+Pj4gQEAgLTMzLDYgKzMzLDE2IEBAIGNvbmZp ZyBWRFBBX1NJTV9CTE9DSwo+Pj4gICAgICAgICAgdkRQQSBibG9jayBkZXZpY2Ugc2ltdWxhdG9y IHdoaWNoIHRlcm1pbmF0ZXMgSU8gcmVxdWVzdCBpbiBhCj4+PiAgICAgICAgICBtZW1vcnkgYnVm ZmVyLgo+Pj4KPj4+ICtjb25maWcgVkRQQV9VU0VSCj4+PiArICAgICB0cmlzdGF0ZSAiVkRVU0Ug KHZEUEEgRGV2aWNlIGluIFVzZXJzcGFjZSkgc3VwcG9ydCIKPj4+ICsgICAgIGRlcGVuZHMgb24g RVZFTlRGRCAmJiBNTVUgJiYgSEFTX0RNQQo+Pj4gKyAgICAgc2VsZWN0IERNQV9PUFMKPj4+ICsg ICAgIHNlbGVjdCBWSE9TVF9JT1RMQgo+Pj4gKyAgICAgc2VsZWN0IElPTU1VX0lPVkEKPj4+ICsg ICAgIGhlbHAKPj4+ICsgICAgICAgV2l0aCBWRFVTRSBpdCBpcyBwb3NzaWJsZSB0byBlbXVsYXRl IGEgdkRQQSBEZXZpY2UKPj4+ICsgICAgICAgaW4gYSB1c2Vyc3BhY2UgcHJvZ3JhbS4KPj4+ICsK Pj4+ICAgIGNvbmZpZyBJRkNWRgo+Pj4gICAgICAgIHRyaXN0YXRlICJJbnRlbCBJRkMgVkYgdkRQ QSBkcml2ZXIiCj4+PiAgICAgICAgZGVwZW5kcyBvbiBQQ0lfTVNJCj4+PiBkaWZmIC0tZ2l0IGEv ZHJpdmVycy92ZHBhL01ha2VmaWxlIGIvZHJpdmVycy92ZHBhL01ha2VmaWxlCj4+PiBpbmRleCA2 N2ZlN2YzZDY5NDMuLmYwMmViZWQzM2YxOSAxMDA2NDQKPj4+IC0tLSBhL2RyaXZlcnMvdmRwYS9N YWtlZmlsZQo+Pj4gKysrIGIvZHJpdmVycy92ZHBhL01ha2VmaWxlCj4+PiBAQCAtMSw2ICsxLDcg QEAKPj4+ICAgICMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKPj4+ICAgIG9iai0k KENPTkZJR19WRFBBKSArPSB2ZHBhLm8KPj4+ICAgIG9iai0kKENPTkZJR19WRFBBX1NJTSkgKz0g dmRwYV9zaW0vCj4+PiArb2JqLSQoQ09ORklHX1ZEUEFfVVNFUikgKz0gdmRwYV91c2VyLwo+Pj4g ICAgb2JqLSQoQ09ORklHX0lGQ1ZGKSAgICArPSBpZmN2Zi8KPj4+ICAgIG9iai0kKENPTkZJR19N TFg1X1ZEUEEpICs9IG1seDUvCj4+PiAgICBvYmotJChDT05GSUdfVlBfVkRQQSkgICAgKz0gdmly dGlvX3BjaS8KPj4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL3ZkcGEvdmRwYV91c2VyL01ha2VmaWxl IGIvZHJpdmVycy92ZHBhL3ZkcGFfdXNlci9NYWtlZmlsZQo+Pj4gbmV3IGZpbGUgbW9kZSAxMDA2 NDQKPj4+IGluZGV4IDAwMDAwMDAwMDAwMC4uMjYwZTBiMjZhZjk5Cj4+PiAtLS0gL2Rldi9udWxs Cj4+PiArKysgYi9kcml2ZXJzL3ZkcGEvdmRwYV91c2VyL01ha2VmaWxlCj4+PiBAQCAtMCwwICsx LDUgQEAKPj4+ICsjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCj4+PiArCj4+PiAr dmR1c2UteSA6PSB2ZHVzZV9kZXYubyBpb3ZhX2RvbWFpbi5vCj4+PiArCj4+PiArb2JqLSQoQ09O RklHX1ZEUEFfVVNFUikgKz0gdmR1c2Uubwo+Pj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmRwYS92 ZHBhX3VzZXIvdmR1c2VfZGV2LmMgYi9kcml2ZXJzL3ZkcGEvdmRwYV91c2VyL3ZkdXNlX2Rldi5j Cj4+PiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+Pj4gaW5kZXggMDAwMDAwMDAwMDAwLi41MjcxY2Jk MTVlMjgKPj4+IC0tLSAvZGV2L251bGwKPj4+ICsrKyBiL2RyaXZlcnMvdmRwYS92ZHBhX3VzZXIv dmR1c2VfZGV2LmMKPj4+IEBAIC0wLDAgKzEsMTQ1MyBAQAo+Pj4gKy8vIFNQRFgtTGljZW5zZS1J ZGVudGlmaWVyOiBHUEwtMi4wLW9ubHkKPj4+ICsvKgo+Pj4gKyAqIFZEVVNFOiB2RFBBIERldmlj ZSBpbiBVc2Vyc3BhY2UKPj4+ICsgKgo+Pj4gKyAqIENvcHlyaWdodCAoQykgMjAyMC0yMDIxIEJ5 dGVkYW5jZSBJbmMuIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K Pj4+ICsgKgo+Pj4gKyAqIEF1dGhvcjogWGllIFlvbmdqaSA8eGlleW9uZ2ppQGJ5dGVkYW5jZS5j b20+Cj4+PiArICoKPj4+ICsgKi8KPj4+ICsKPj4+ICsjaW5jbHVkZSA8bGludXgvaW5pdC5oPgo+ Pj4gKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KPj4+ICsjaW5jbHVkZSA8bGludXgvY2Rldi5o Pgo+Pj4gKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KPj4+ICsjaW5jbHVkZSA8bGludXgvZXZl bnRmZC5oPgo+Pj4gKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Cj4+PiArI2luY2x1ZGUgPGxpbnV4 L3dhaXQuaD4KPj4+ICsjaW5jbHVkZSA8bGludXgvZG1hLW1hcC1vcHMuaD4KPj4+ICsjaW5jbHVk ZSA8bGludXgvcG9sbC5oPgo+Pj4gKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+Cj4+PiArI2luY2x1 ZGUgPGxpbnV4L3Vpby5oPgo+Pj4gKyNpbmNsdWRlIDxsaW51eC92ZHBhLmg+Cj4+PiArI2luY2x1 ZGUgPGxpbnV4L25vc3BlYy5oPgo+Pj4gKyNpbmNsdWRlIDx1YXBpL2xpbnV4L3ZkdXNlLmg+Cj4+ PiArI2luY2x1ZGUgPHVhcGkvbGludXgvdmRwYS5oPgo+Pj4gKyNpbmNsdWRlIDx1YXBpL2xpbnV4 L3ZpcnRpb19jb25maWcuaD4KPj4+ICsjaW5jbHVkZSA8dWFwaS9saW51eC92aXJ0aW9faWRzLmg+ Cj4+PiArI2luY2x1ZGUgPHVhcGkvbGludXgvdmlydGlvX2Jsay5oPgo+Pj4gKyNpbmNsdWRlIDxs aW51eC9tb2RfZGV2aWNldGFibGUuaD4KPj4+ICsKPj4+ICsjaW5jbHVkZSAiaW92YV9kb21haW4u aCIKPj4+ICsKPj4+ICsjZGVmaW5lIERSVl9BVVRIT1IgICAiWW9uZ2ppIFhpZSA8eGlleW9uZ2pp QGJ5dGVkYW5jZS5jb20+Igo+Pj4gKyNkZWZpbmUgRFJWX0RFU0MgICAgICJ2RFBBIERldmljZSBp biBVc2Vyc3BhY2UiCj4+PiArI2RlZmluZSBEUlZfTElDRU5TRSAgIkdQTCB2MiIKPj4+ICsKPj4+ ICsjZGVmaW5lIFZEVVNFX0RFVl9NQVggKDFVIDw8IE1JTk9SQklUUykKPj4+ICsjZGVmaW5lIFZE VVNFX01BWF9CT1VOQ0VfU0laRSAoNjQgKiAxMDI0ICogMTAyNCkKPj4+ICsjZGVmaW5lIFZEVVNF X0lPVkFfU0laRSAoMTI4ICogMTAyNCAqIDEwMjQpCj4+PiArI2RlZmluZSBWRFVTRV9SRVFVRVNU X1RJTUVPVVQgMzAKPj4+ICsKPj4+ICtzdHJ1Y3QgdmR1c2VfdmlydHF1ZXVlIHsKPj4+ICsgICAg IHUxNiBpbmRleDsKPj4+ICsgICAgIHUzMiBudW07Cj4+PiArICAgICB1MzIgYXZhaWxfaWR4Owo+ Pj4gKyAgICAgdTY0IGRlc2NfYWRkcjsKPj4+ICsgICAgIHU2NCBkcml2ZXJfYWRkcjsKPj4+ICsg ICAgIHU2NCBkZXZpY2VfYWRkcjsKPj4+ICsgICAgIGJvb2wgcmVhZHk7Cj4+PiArICAgICBib29s IGtpY2tlZDsKPj4+ICsgICAgIHNwaW5sb2NrX3Qga2lja19sb2NrOwo+Pj4gKyAgICAgc3Bpbmxv Y2tfdCBpcnFfbG9jazsKPj4+ICsgICAgIHN0cnVjdCBldmVudGZkX2N0eCAqa2lja2ZkOwo+Pj4g KyAgICAgc3RydWN0IHZkcGFfY2FsbGJhY2sgY2I7Cj4+PiArICAgICBzdHJ1Y3Qgd29ya19zdHJ1 Y3QgaW5qZWN0Owo+Pj4gK307Cj4+PiArCj4+PiArc3RydWN0IHZkdXNlX2RldjsKPj4+ICsKPj4+ ICtzdHJ1Y3QgdmR1c2VfdmRwYSB7Cj4+PiArICAgICBzdHJ1Y3QgdmRwYV9kZXZpY2UgdmRwYTsK Pj4+ICsgICAgIHN0cnVjdCB2ZHVzZV9kZXYgKmRldjsKPj4+ICt9Owo+Pj4gKwo+Pj4gK3N0cnVj dCB2ZHVzZV9kZXYgewo+Pj4gKyAgICAgc3RydWN0IHZkdXNlX3ZkcGEgKnZkZXY7Cj4+PiArICAg ICBzdHJ1Y3QgZGV2aWNlICpkZXY7Cj4+PiArICAgICBzdHJ1Y3QgdmR1c2VfdmlydHF1ZXVlICp2 cXM7Cj4+PiArICAgICBzdHJ1Y3QgdmR1c2VfaW92YV9kb21haW4gKmRvbWFpbjsKPj4+ICsgICAg IGNoYXIgKm5hbWU7Cj4+PiArICAgICBzdHJ1Y3QgbXV0ZXggbG9jazsKPj4+ICsgICAgIHNwaW5s b2NrX3QgbXNnX2xvY2s7Cj4+PiArICAgICB1NjQgbXNnX3VuaXF1ZTsKPj4+ICsgICAgIHdhaXRf cXVldWVfaGVhZF90IHdhaXRxOwo+Pj4gKyAgICAgc3RydWN0IGxpc3RfaGVhZCBzZW5kX2xpc3Q7 Cj4+PiArICAgICBzdHJ1Y3QgbGlzdF9oZWFkIHJlY3ZfbGlzdDsKPj4+ICsgICAgIHN0cnVjdCB2 ZHBhX2NhbGxiYWNrIGNvbmZpZ19jYjsKPj4+ICsgICAgIHN0cnVjdCB3b3JrX3N0cnVjdCBpbmpl Y3Q7Cj4+PiArICAgICBzcGlubG9ja190IGlycV9sb2NrOwo+Pj4gKyAgICAgaW50IG1pbm9yOwo+ Pj4gKyAgICAgYm9vbCBjb25uZWN0ZWQ7Cj4+PiArICAgICBib29sIHN0YXJ0ZWQ7Cj4+PiArICAg ICB1NjQgYXBpX3ZlcnNpb247Cj4+PiArICAgICB1NjQgdXNlcl9mZWF0dXJlczsKPj4KPj4gTGV0 J3MgdXNlIGRldmljZV9mZWF0dXJlcy4KPj4KPiBPSy4KPgo+Pj4gKyAgICAgdTY0IGZlYXR1cmVz Owo+Pgo+PiBBbmQgZHJpdmVyIGZlYXR1cmVzLgo+Pgo+IE9LLgo+Cj4+PiArICAgICB1MzIgZGV2 aWNlX2lkOwo+Pj4gKyAgICAgdTMyIHZlbmRvcl9pZDsKPj4+ICsgICAgIHUzMiBnZW5lcmF0aW9u Owo+Pj4gKyAgICAgdTMyIGNvbmZpZ19zaXplOwo+Pj4gKyAgICAgdm9pZCAqY29uZmlnOwo+Pj4g KyAgICAgdTggc3RhdHVzOwo+Pj4gKyAgICAgdTE2IHZxX3NpemVfbWF4Owo+Pj4gKyAgICAgdTMy IHZxX251bTsKPj4+ICsgICAgIHUzMiB2cV9hbGlnbjsKPj4+ICt9Owo+Pj4gKwo+Pj4gK3N0cnVj dCB2ZHVzZV9kZXZfbXNnIHsKPj4+ICsgICAgIHN0cnVjdCB2ZHVzZV9kZXZfcmVxdWVzdCByZXE7 Cj4+PiArICAgICBzdHJ1Y3QgdmR1c2VfZGV2X3Jlc3BvbnNlIHJlc3A7Cj4+PiArICAgICBzdHJ1 Y3QgbGlzdF9oZWFkIGxpc3Q7Cj4+PiArICAgICB3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0cTsKPj4+ ICsgICAgIGJvb2wgY29tcGxldGVkOwo+Pj4gK307Cj4+PiArCj4+PiArc3RydWN0IHZkdXNlX2Nv bnRyb2wgewo+Pj4gKyAgICAgdTY0IGFwaV92ZXJzaW9uOwo+Pj4gK307Cj4+PiArCj4+PiArc3Rh dGljIERFRklORV9NVVRFWCh2ZHVzZV9sb2NrKTsKPj4+ICtzdGF0aWMgREVGSU5FX0lEUih2ZHVz ZV9pZHIpOwo+Pj4gKwo+Pj4gK3N0YXRpYyBkZXZfdCB2ZHVzZV9tYWpvcjsKPj4+ICtzdGF0aWMg c3RydWN0IGNsYXNzICp2ZHVzZV9jbGFzczsKPj4+ICtzdGF0aWMgc3RydWN0IGNkZXYgdmR1c2Vf Y3RybF9jZGV2Owo+Pj4gK3N0YXRpYyBzdHJ1Y3QgY2RldiB2ZHVzZV9jZGV2Owo+Pj4gK3N0YXRp YyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqdmR1c2VfaXJxX3dxOwo+Pj4gKwo+Pj4gK3N0YXRp YyB1MzIgYWxsb3dlZF9kZXZpY2VfaWRbXSA9IHsKPj4+ICsgICAgIFZJUlRJT19JRF9CTE9DSywK Pj4+ICt9Owo+Pj4gKwo+Pj4gK3N0YXRpYyBpbmxpbmUgc3RydWN0IHZkdXNlX2RldiAqdmRwYV90 b192ZHVzZShzdHJ1Y3QgdmRwYV9kZXZpY2UgKnZkcGEpCj4+PiArewo+Pj4gKyAgICAgc3RydWN0 IHZkdXNlX3ZkcGEgKnZkZXYgPSBjb250YWluZXJfb2YodmRwYSwgc3RydWN0IHZkdXNlX3ZkcGEs IHZkcGEpOwo+Pj4gKwo+Pj4gKyAgICAgcmV0dXJuIHZkZXYtPmRldjsKPj4+ICt9Cj4+PiArCj4+ PiArc3RhdGljIGlubGluZSBzdHJ1Y3QgdmR1c2VfZGV2ICpkZXZfdG9fdmR1c2Uoc3RydWN0IGRl dmljZSAqZGV2KQo+Pj4gK3sKPj4+ICsgICAgIHN0cnVjdCB2ZHBhX2RldmljZSAqdmRwYSA9IGRl dl90b192ZHBhKGRldik7Cj4+PiArCj4+PiArICAgICByZXR1cm4gdmRwYV90b192ZHVzZSh2ZHBh KTsKPj4+ICt9Cj4+PiArCj4+PiArc3RhdGljIHN0cnVjdCB2ZHVzZV9kZXZfbXNnICp2ZHVzZV9m aW5kX21zZyhzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkLAo+Pj4gKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmVxdWVzdF9pZCkKPj4+ICt7Cj4+PiArICAg ICBzdHJ1Y3QgdmR1c2VfZGV2X21zZyAqbXNnOwo+Pj4gKwo+Pj4gKyAgICAgbGlzdF9mb3JfZWFj aF9lbnRyeShtc2csIGhlYWQsIGxpc3QpIHsKPj4+ICsgICAgICAgICAgICAgaWYgKG1zZy0+cmVx LnJlcXVlc3RfaWQgPT0gcmVxdWVzdF9pZCkgewo+Pj4gKyAgICAgICAgICAgICAgICAgICAgIGxp c3RfZGVsKCZtc2ctPmxpc3QpOwo+Pj4gKyAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtc2c7 Cj4+PiArICAgICAgICAgICAgIH0KPj4+ICsgICAgIH0KPj4+ICsKPj4+ICsgICAgIHJldHVybiBO VUxMOwo+Pj4gK30KPj4+ICsKPj4+ICtzdGF0aWMgc3RydWN0IHZkdXNlX2Rldl9tc2cgKnZkdXNl X2RlcXVldWVfbXNnKHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCj4+PiArewo+Pj4gKyAgICAgc3Ry dWN0IHZkdXNlX2Rldl9tc2cgKm1zZyA9IE5VTEw7Cj4+PiArCj4+PiArICAgICBpZiAoIWxpc3Rf ZW1wdHkoaGVhZCkpIHsKPj4+ICsgICAgICAgICAgICAgbXNnID0gbGlzdF9maXJzdF9lbnRyeSho ZWFkLCBzdHJ1Y3QgdmR1c2VfZGV2X21zZywgbGlzdCk7Cj4+PiArICAgICAgICAgICAgIGxpc3Rf ZGVsKCZtc2ctPmxpc3QpOwo+Pj4gKyAgICAgfQo+Pj4gKwo+Pj4gKyAgICAgcmV0dXJuIG1zZzsK Pj4+ICt9Cj4+PiArCj4+PiArc3RhdGljIHZvaWQgdmR1c2VfZW5xdWV1ZV9tc2coc3RydWN0IGxp c3RfaGVhZCAqaGVhZCwKPj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdmR1 c2VfZGV2X21zZyAqbXNnKQo+Pj4gK3sKPj4+ICsgICAgIGxpc3RfYWRkX3RhaWwoJm1zZy0+bGlz dCwgaGVhZCk7Cj4+PiArfQo+Pj4gKwo+Pj4gK3N0YXRpYyBpbnQgdmR1c2VfZGV2X21zZ19zZW5k KHN0cnVjdCB2ZHVzZV9kZXYgKmRldiwKPj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICBz dHJ1Y3QgdmR1c2VfZGV2X21zZyAqbXNnLCBib29sIG5vX3JlcGx5KQo+Pj4gK3sKPj4KPj4gSXQg bG9va3MgdG8gbWUgdGhlIG9ubHkgdXNlciBmb3Igbm9fcmVwbHk9dHJ1ZSBpcyB0aGUgZGF0YXBs YW5lIHN0YXJ0LiBJCj4+IHdvbmRlciBub19yZXBseSBpcyByZWFsbHkgbmVlZGVkIGNvbnNpZGVy IHdlIGhhdmUgc3dpdGNoZWQgdG8gdXNlCj4+IHdhaXRfZXZlbnRfa2lsbGFibGVfdGltZW91dCgp Lgo+Pgo+IERvIHdlIG5lZWQgdG8gaGFuZGxlIHRoZSBlcnJvciBpbiB0aGlzIGNhc2UgaWYgd2Ug cmVtb3ZlIHRoZSBub19yZXBseQo+IGZsYWcuIFByaW50IGEgd2FybmluZyBtZXNzYWdlPwoKClNl ZSBiZWxvdy4KCgo+Cj4+IEluIGFub3RoZXIgd2F5LCBub19yZXBseSBpcyBmYWxzZSBmb3IgdnEg c3RhdGUgc3luY2hyb25pemF0aW9uIGFuZCBJT1RMQgo+PiB1cGRhdGluZy4gSSB3b25kZXIgaWYg d2UgY2FuIHNpbXBseSB1c2Ugbm9fcmVwbHkgPSB0cnVlIGZvciB0aGVtLgo+Pgo+IExvb2tzIGxp a2Ugd2UgY2FuJ3QsIGUuZy4gd2UgbmVlZCB0byBnZXQgYSByZXBseSBmcm9tIHVzZXJzcGFjZSBm b3IgdnEgc3RhdGUuCgoKUmlnaHQuCgoKPgo+Pj4gKyAgICAgaW5pdF93YWl0cXVldWVfaGVhZCgm bXNnLT53YWl0cSk7Cj4+PiArICAgICBzcGluX2xvY2soJmRldi0+bXNnX2xvY2spOwo+Pj4gKyAg ICAgbXNnLT5yZXEucmVxdWVzdF9pZCA9IGRldi0+bXNnX3VuaXF1ZSsrOwo+Pj4gKyAgICAgdmR1 c2VfZW5xdWV1ZV9tc2coJmRldi0+c2VuZF9saXN0LCBtc2cpOwo+Pj4gKyAgICAgd2FrZV91cCgm ZGV2LT53YWl0cSk7Cj4+PiArICAgICBzcGluX3VubG9jaygmZGV2LT5tc2dfbG9jayk7Cj4+PiAr ICAgICBpZiAobm9fcmVwbHkpCj4+PiArICAgICAgICAgICAgIHJldHVybiAwOwo+Pj4gKwo+Pj4g KyAgICAgd2FpdF9ldmVudF9raWxsYWJsZV90aW1lb3V0KG1zZy0+d2FpdHEsIG1zZy0+Y29tcGxl dGVkLAo+Pj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZEVVNFX1JFUVVFU1Rf VElNRU9VVCAqIEhaKTsKPj4+ICsgICAgIHNwaW5fbG9jaygmZGV2LT5tc2dfbG9jayk7Cj4+PiAr ICAgICBpZiAoIW1zZy0+Y29tcGxldGVkKSB7Cj4+PiArICAgICAgICAgICAgIGxpc3RfZGVsKCZt c2ctPmxpc3QpOwo+Pj4gKyAgICAgICAgICAgICBtc2ctPnJlc3AucmVzdWx0ID0gVkRVU0VfUkVR X1JFU1VMVF9GQUlMRUQ7Cj4+PiArICAgICB9Cj4+PiArICAgICBzcGluX3VubG9jaygmZGV2LT5t c2dfbG9jayk7Cj4+PiArCj4+PiArICAgICByZXR1cm4gKG1zZy0+cmVzcC5yZXN1bHQgPT0gVkRV U0VfUkVRX1JFU1VMVF9PSykgPyAwIDogLUVJTzsKPj4KPj4gRG8gd2UgbmVlZCB0byBzZXJpYWxp emUgdGhlIGNoZWNrIGJ5IHByb3RlY3RpbmcgaXQgd2l0aCB0aGUgc3BpbmxvY2sgYWJvdmU/Cj4+ Cj4gR29vZCBwb2ludC4KPgo+Pj4gK30KPj4+ICsKPj4+ICtzdGF0aWMgdm9pZCB2ZHVzZV9kZXZf bXNnX2NsZWFudXAoc3RydWN0IHZkdXNlX2RldiAqZGV2KQo+Pj4gK3sKPj4+ICsgICAgIHN0cnVj dCB2ZHVzZV9kZXZfbXNnICptc2c7Cj4+PiArCj4+PiArICAgICBzcGluX2xvY2soJmRldi0+bXNn X2xvY2spOwo+Pj4gKyAgICAgd2hpbGUgKChtc2cgPSB2ZHVzZV9kZXF1ZXVlX21zZygmZGV2LT5z ZW5kX2xpc3QpKSkgewo+Pj4gKyAgICAgICAgICAgICBpZiAobXNnLT5yZXEuZmxhZ3MgJiBWRFVT RV9SRVFfRkxBR1NfTk9fUkVQTFkpCj4+PiArICAgICAgICAgICAgICAgICAgICAga2ZyZWUobXNn KTsKPj4+ICsgICAgICAgICAgICAgZWxzZQo+Pj4gKyAgICAgICAgICAgICAgICAgICAgIHZkdXNl X2VucXVldWVfbXNnKCZkZXYtPnJlY3ZfbGlzdCwgbXNnKTsKPj4+ICsgICAgIH0KPj4+ICsgICAg IHdoaWxlICgobXNnID0gdmR1c2VfZGVxdWV1ZV9tc2coJmRldi0+cmVjdl9saXN0KSkpIHsKPj4+ ICsgICAgICAgICAgICAgbXNnLT5yZXNwLnJlc3VsdCA9IFZEVVNFX1JFUV9SRVNVTFRfRkFJTEVE Owo+Pj4gKyAgICAgICAgICAgICBtc2ctPmNvbXBsZXRlZCA9IDE7Cj4+PiArICAgICAgICAgICAg IHdha2VfdXAoJm1zZy0+d2FpdHEpOwo+Pj4gKyAgICAgfQo+Pj4gKyAgICAgc3Bpbl91bmxvY2so JmRldi0+bXNnX2xvY2spOwo+Pj4gK30KPj4+ICsKPj4+ICtzdGF0aWMgdm9pZCB2ZHVzZV9kZXZf c3RhcnRfZGF0YXBsYW5lKHN0cnVjdCB2ZHVzZV9kZXYgKmRldikKPj4+ICt7Cj4+PiArICAgICBz dHJ1Y3QgdmR1c2VfZGV2X21zZyAqbXNnID0ga3phbGxvYyhzaXplb2YoKm1zZyksCj4+PiArICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRlBfS0VSTkVMIHwgX19HRlBf Tk9GQUlMKTsKPj4+ICsKPj4+ICsgICAgIG1zZy0+cmVxLnR5cGUgPSBWRFVTRV9TVEFSVF9EQVRB UExBTkU7Cj4+PiArICAgICBtc2ctPnJlcS5mbGFncyB8PSBWRFVTRV9SRVFfRkxBR1NfTk9fUkVQ TFk7Cj4+PiArICAgICB2ZHVzZV9kZXZfbXNnX3NlbmQoZGV2LCBtc2csIHRydWUpOwo+Pj4gK30K Pj4+ICsKPj4+ICtzdGF0aWMgdm9pZCB2ZHVzZV9kZXZfc3RvcF9kYXRhcGxhbmUoc3RydWN0IHZk dXNlX2RldiAqZGV2KQo+Pj4gK3sKPj4+ICsgICAgIHN0cnVjdCB2ZHVzZV9kZXZfbXNnICptc2cg PSBremFsbG9jKHNpemVvZigqbXNnKSwKPj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIEdGUF9LRVJORUwgfCBfX0dGUF9OT0ZBSUwpOwo+Pj4gKwo+Pj4gKyAgICAg bXNnLT5yZXEudHlwZSA9IFZEVVNFX1NUT1BfREFUQVBMQU5FOwo+Pj4gKyAgICAgbXNnLT5yZXEu ZmxhZ3MgfD0gVkRVU0VfUkVRX0ZMQUdTX05PX1JFUExZOwo+Pgo+PiBDYW4gd2Ugc2ltcGx5IHVz ZSB0aGlzIGZsYWcgaW5zdGVhZCBvZiBpbnRyb2R1Y2luZyBhIG5ldyBwYXJhbWV0ZXIKPj4gKG5v X3JlcGx5KSBpbiB2ZHVzZV9kZXZfbXNnX3NlbmQoKT8KPj4KPiBMb29rcyBnb29kIHRvIG1lLgo+ Cj4+PiArICAgICB2ZHVzZV9kZXZfbXNnX3NlbmQoZGV2LCBtc2csIHRydWUpOwo+Pj4gK30KPj4+ ICsKPj4+ICtzdGF0aWMgaW50IHZkdXNlX2Rldl9nZXRfdnFfc3RhdGUoc3RydWN0IHZkdXNlX2Rl diAqZGV2LAo+Pj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdmR1c2Vf dmlydHF1ZXVlICp2cSwKPj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0 IHZkcGFfdnFfc3RhdGUgKnN0YXRlKQo+Pj4gK3sKPj4+ICsgICAgIHN0cnVjdCB2ZHVzZV9kZXZf bXNnIG1zZyA9IHsgMCB9Owo+Pj4gKyAgICAgaW50IHJldDsKPj4KPj4gTm90ZSB0aGF0IEkgcG9z dCBhIHNlcmllcyB0aGF0IGltcGxlbWVudCB0aGUgcGFja2VkIHZpcnRxdWV1ZSBzdXBwb3J0Ogo+ Pgo+PiBodHRwczovL2xpc3RzLmxpbnV4Zm91bmRhdGlvbi5vcmcvcGlwZXJtYWlsL3ZpcnR1YWxp emF0aW9uLzIwMjEtSnVuZS8wNTQ1MDEuaHRtbAo+Pgo+PiBTbyB0aGlzIHBhdGNoIG5lZWRzIHRv IGJlIHVwZGF0ZWQgYXMgd2VsbC4KPj4KPiBXaWxsIGRvIGl0Lgo+Cj4+PiArCj4+PiArICAgICBt c2cucmVxLnR5cGUgPSBWRFVTRV9HRVRfVlFfU1RBVEU7Cj4+PiArICAgICBtc2cucmVxLnZxX3N0 YXRlLmluZGV4ID0gdnEtPmluZGV4Owo+Pj4gKwo+Pj4gKyAgICAgcmV0ID0gdmR1c2VfZGV2X21z Z19zZW5kKGRldiwgJm1zZywgZmFsc2UpOwo+Pj4gKyAgICAgaWYgKHJldCkKPj4+ICsgICAgICAg ICAgICAgcmV0dXJuIHJldDsKPj4+ICsKPj4+ICsgICAgIHN0YXRlLT5hdmFpbF9pbmRleCA9IG1z Zy5yZXNwLnZxX3N0YXRlLmF2YWlsX2lkeDsKPj4+ICsgICAgIHJldHVybiAwOwo+Pj4gK30KPj4+ ICsKPj4+ICtzdGF0aWMgaW50IHZkdXNlX2Rldl91cGRhdGVfaW90bGIoc3RydWN0IHZkdXNlX2Rl diAqZGV2LAo+Pj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTY0IHN0YXJ0LCB1NjQg bGFzdCkKPj4+ICt7Cj4+PiArICAgICBzdHJ1Y3QgdmR1c2VfZGV2X21zZyBtc2cgPSB7IDAgfTsK Pj4+ICsKPj4+ICsgICAgIGlmIChsYXN0IDwgc3RhcnQpCj4+PiArICAgICAgICAgICAgIHJldHVy biAtRUlOVkFMOwo+Pj4gKwo+Pj4gKyAgICAgbXNnLnJlcS50eXBlID0gVkRVU0VfVVBEQVRFX0lP VExCOwo+Pj4gKyAgICAgbXNnLnJlcS5pb3ZhLnN0YXJ0ID0gc3RhcnQ7Cj4+PiArICAgICBtc2cu cmVxLmlvdmEubGFzdCA9IGxhc3Q7Cj4+PiArCj4+PiArICAgICByZXR1cm4gdmR1c2VfZGV2X21z Z19zZW5kKGRldiwgJm1zZywgZmFsc2UpOwo+Pj4gK30KPj4+ICsKPj4+ICtzdGF0aWMgc3NpemVf dCB2ZHVzZV9kZXZfcmVhZF9pdGVyKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IGlvdl9pdGVy ICp0bykKPj4+ICt7Cj4+PiArICAgICBzdHJ1Y3QgZmlsZSAqZmlsZSA9IGlvY2ItPmtpX2ZpbHA7 Cj4+PiArICAgICBzdHJ1Y3QgdmR1c2VfZGV2ICpkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7Cj4+ PiArICAgICBzdHJ1Y3QgdmR1c2VfZGV2X21zZyAqbXNnOwo+Pj4gKyAgICAgaW50IHNpemUgPSBz aXplb2Yoc3RydWN0IHZkdXNlX2Rldl9yZXF1ZXN0KTsKPj4+ICsgICAgIHNzaXplX3QgcmV0Owo+ Pj4gKwo+Pj4gKyAgICAgaWYgKGlvdl9pdGVyX2NvdW50KHRvKSA8IHNpemUpCj4+PiArICAgICAg ICAgICAgIHJldHVybiAtRUlOVkFMOwo+Pj4gKwo+Pj4gKyAgICAgc3Bpbl9sb2NrKCZkZXYtPm1z Z19sb2NrKTsKPj4+ICsgICAgIHdoaWxlICgxKSB7Cj4+PiArICAgICAgICAgICAgIG1zZyA9IHZk dXNlX2RlcXVldWVfbXNnKCZkZXYtPnNlbmRfbGlzdCk7Cj4+PiArICAgICAgICAgICAgIGlmICht c2cpCj4+PiArICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Cj4+PiArCj4+PiArICAgICAgICAg ICAgIHJldCA9IC1FQUdBSU47Cj4+PiArICAgICAgICAgICAgIGlmIChmaWxlLT5mX2ZsYWdzICYg T19OT05CTE9DSykKPj4+ICsgICAgICAgICAgICAgICAgICAgICBnb3RvIHVubG9jazsKPj4+ICsK Pj4+ICsgICAgICAgICAgICAgc3Bpbl91bmxvY2soJmRldi0+bXNnX2xvY2spOwo+Pj4gKyAgICAg ICAgICAgICByZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfZXhjbHVzaXZlKGRldi0+d2Fp dHEsCj4+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFsaXN0X2VtcHR5 KCZkZXYtPnNlbmRfbGlzdCkpOwo+Pj4gKyAgICAgICAgICAgICBpZiAocmV0KQo+Pj4gKyAgICAg ICAgICAgICAgICAgICAgIHJldHVybiByZXQ7Cj4+PiArCj4+PiArICAgICAgICAgICAgIHNwaW5f bG9jaygmZGV2LT5tc2dfbG9jayk7Cj4+PiArICAgICB9Cj4+PiArICAgICBzcGluX3VubG9jaygm ZGV2LT5tc2dfbG9jayk7Cj4+PiArICAgICByZXQgPSBjb3B5X3RvX2l0ZXIoJm1zZy0+cmVxLCBz aXplLCB0byk7Cj4+PiArICAgICBzcGluX2xvY2soJmRldi0+bXNnX2xvY2spOwo+Pj4gKyAgICAg aWYgKHJldCAhPSBzaXplKSB7Cj4+PiArICAgICAgICAgICAgIHJldCA9IC1FRkFVTFQ7Cj4+PiAr ICAgICAgICAgICAgIHZkdXNlX2VucXVldWVfbXNnKCZkZXYtPnNlbmRfbGlzdCwgbXNnKTsKPj4+ ICsgICAgICAgICAgICAgZ290byB1bmxvY2s7Cj4+PiArICAgICB9Cj4+PiArICAgICBpZiAobXNn LT5yZXEuZmxhZ3MgJiBWRFVTRV9SRVFfRkxBR1NfTk9fUkVQTFkpCj4+PiArICAgICAgICAgICAg IGtmcmVlKG1zZyk7Cj4+PiArICAgICBlbHNlCj4+PiArICAgICAgICAgICAgIHZkdXNlX2VucXVl dWVfbXNnKCZkZXYtPnJlY3ZfbGlzdCwgbXNnKTsKPj4+ICt1bmxvY2s6Cj4+PiArICAgICBzcGlu X3VubG9jaygmZGV2LT5tc2dfbG9jayk7Cj4+PiArCj4+PiArICAgICByZXR1cm4gcmV0Owo+Pj4g K30KPj4+ICsKPj4+ICtzdGF0aWMgc3NpemVfdCB2ZHVzZV9kZXZfd3JpdGVfaXRlcihzdHJ1Y3Qg a2lvY2IgKmlvY2IsIHN0cnVjdCBpb3ZfaXRlciAqZnJvbSkKPj4+ICt7Cj4+PiArICAgICBzdHJ1 Y3QgZmlsZSAqZmlsZSA9IGlvY2ItPmtpX2ZpbHA7Cj4+PiArICAgICBzdHJ1Y3QgdmR1c2VfZGV2 ICpkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7Cj4+PiArICAgICBzdHJ1Y3QgdmR1c2VfZGV2X3Jl c3BvbnNlIHJlc3A7Cj4+PiArICAgICBzdHJ1Y3QgdmR1c2VfZGV2X21zZyAqbXNnOwo+Pj4gKyAg ICAgc2l6ZV90IHJldDsKPj4+ICsKPj4+ICsgICAgIHJldCA9IGNvcHlfZnJvbV9pdGVyKCZyZXNw LCBzaXplb2YocmVzcCksIGZyb20pOwo+Pj4gKyAgICAgaWYgKHJldCAhPSBzaXplb2YocmVzcCkp Cj4+PiArICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwo+Pj4gKwo+Pj4gKyAgICAgc3Bpbl9s b2NrKCZkZXYtPm1zZ19sb2NrKTsKPj4+ICsgICAgIG1zZyA9IHZkdXNlX2ZpbmRfbXNnKCZkZXYt PnJlY3ZfbGlzdCwgcmVzcC5yZXF1ZXN0X2lkKTsKPj4+ICsgICAgIGlmICghbXNnKSB7Cj4+PiAr ICAgICAgICAgICAgIHJldCA9IC1FTk9FTlQ7Cj4+PiArICAgICAgICAgICAgIGdvdG8gdW5sb2Nr Owo+Pj4gKyAgICAgfQo+Pj4gKwo+Pj4gKyAgICAgbWVtY3B5KCZtc2ctPnJlc3AsICZyZXNwLCBz aXplb2YocmVzcCkpOwo+Pj4gKyAgICAgbXNnLT5jb21wbGV0ZWQgPSAxOwo+Pj4gKyAgICAgd2Fr ZV91cCgmbXNnLT53YWl0cSk7Cj4+PiArdW5sb2NrOgo+Pj4gKyAgICAgc3Bpbl91bmxvY2soJmRl di0+bXNnX2xvY2spOwo+Pj4gKwo+Pj4gKyAgICAgcmV0dXJuIHJldDsKPj4+ICt9Cj4+PiArCj4+ PiArc3RhdGljIF9fcG9sbF90IHZkdXNlX2Rldl9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xs X3RhYmxlICp3YWl0KQo+Pj4gK3sKPj4+ICsgICAgIHN0cnVjdCB2ZHVzZV9kZXYgKmRldiA9IGZp bGUtPnByaXZhdGVfZGF0YTsKPj4+ICsgICAgIF9fcG9sbF90IG1hc2sgPSAwOwo+Pj4gKwo+Pj4g KyAgICAgcG9sbF93YWl0KGZpbGUsICZkZXYtPndhaXRxLCB3YWl0KTsKPj4+ICsKPj4+ICsgICAg IGlmICghbGlzdF9lbXB0eSgmZGV2LT5zZW5kX2xpc3QpKQo+Pj4gKyAgICAgICAgICAgICBtYXNr IHw9IEVQT0xMSU4gfCBFUE9MTFJETk9STTsKPj4+ICsgICAgIGlmICghbGlzdF9lbXB0eSgmZGV2 LT5yZWN2X2xpc3QpKQo+Pj4gKyAgICAgICAgICAgICBtYXNrIHw9IEVQT0xMT1VUIHwgRVBPTExX Uk5PUk07Cj4+PiArCj4+PiArICAgICByZXR1cm4gbWFzazsKPj4+ICt9Cj4+PiArCj4+PiArc3Rh dGljIHZvaWQgdmR1c2VfZGV2X3Jlc2V0KHN0cnVjdCB2ZHVzZV9kZXYgKmRldikKPj4+ICt7Cj4+ PiArICAgICBpbnQgaTsKPj4+ICsgICAgIHN0cnVjdCB2ZHVzZV9pb3ZhX2RvbWFpbiAqZG9tYWlu ID0gZGV2LT5kb21haW47Cj4+PiArCj4+PiArICAgICAvKiBUaGUgY29oZXJlbnQgbWFwcGluZ3Mg YXJlIGhhbmRsZWQgaW4gdmR1c2VfZGV2X2ZyZWVfY29oZXJlbnQoKSAqLwo+Pj4gKyAgICAgaWYg KGRvbWFpbi0+Ym91bmNlX21hcCkKPj4+ICsgICAgICAgICAgICAgdmR1c2VfZG9tYWluX3Jlc2V0 X2JvdW5jZV9tYXAoZG9tYWluKTsKPj4+ICsKPj4+ICsgICAgIGRldi0+ZmVhdHVyZXMgPSAwOwo+ Pj4gKyAgICAgZGV2LT5nZW5lcmF0aW9uKys7Cj4+PiArICAgICBzcGluX2xvY2soJmRldi0+aXJx X2xvY2spOwo+Pj4gKyAgICAgZGV2LT5jb25maWdfY2IuY2FsbGJhY2sgPSBOVUxMOwo+Pj4gKyAg ICAgZGV2LT5jb25maWdfY2IucHJpdmF0ZSA9IE5VTEw7Cj4+PiArICAgICBzcGluX3VubG9jaygm ZGV2LT5pcnFfbG9jayk7Cj4+PiArCj4+PiArICAgICBmb3IgKGkgPSAwOyBpIDwgZGV2LT52cV9u dW07IGkrKykgewo+Pj4gKyAgICAgICAgICAgICBzdHJ1Y3QgdmR1c2VfdmlydHF1ZXVlICp2cSA9 ICZkZXYtPnZxc1tpXTsKPj4+ICsKPj4+ICsgICAgICAgICAgICAgdnEtPnJlYWR5ID0gZmFsc2U7 Cj4+PiArICAgICAgICAgICAgIHZxLT5kZXNjX2FkZHIgPSAwOwo+Pj4gKyAgICAgICAgICAgICB2 cS0+ZHJpdmVyX2FkZHIgPSAwOwo+Pj4gKyAgICAgICAgICAgICB2cS0+ZGV2aWNlX2FkZHIgPSAw Owo+Pj4gKyAgICAgICAgICAgICB2cS0+YXZhaWxfaWR4ID0gMDsKPj4+ICsgICAgICAgICAgICAg dnEtPm51bSA9IDA7Cj4+PiArCj4+PiArICAgICAgICAgICAgIHNwaW5fbG9jaygmdnEtPmtpY2tf bG9jayk7Cj4+PiArICAgICAgICAgICAgIHZxLT5raWNrZWQgPSBmYWxzZTsKPj4+ICsgICAgICAg ICAgICAgaWYgKHZxLT5raWNrZmQpCj4+PiArICAgICAgICAgICAgICAgICAgICAgZXZlbnRmZF9j dHhfcHV0KHZxLT5raWNrZmQpOwo+Pj4gKyAgICAgICAgICAgICB2cS0+a2lja2ZkID0gTlVMTDsK Pj4+ICsgICAgICAgICAgICAgc3Bpbl91bmxvY2soJnZxLT5raWNrX2xvY2spOwo+Pj4gKwo+Pj4g KyAgICAgICAgICAgICBzcGluX2xvY2soJnZxLT5pcnFfbG9jayk7Cj4+PiArICAgICAgICAgICAg IHZxLT5jYi5jYWxsYmFjayA9IE5VTEw7Cj4+PiArICAgICAgICAgICAgIHZxLT5jYi5wcml2YXRl ID0gTlVMTDsKPj4+ICsgICAgICAgICAgICAgc3Bpbl91bmxvY2soJnZxLT5pcnFfbG9jayk7Cj4+ PiArICAgICB9Cj4+PiArfQo+Pj4gKwo+Pj4gK3N0YXRpYyBpbnQgdmR1c2VfdmRwYV9zZXRfdnFf YWRkcmVzcyhzdHJ1Y3QgdmRwYV9kZXZpY2UgKnZkcGEsIHUxNiBpZHgsCj4+PiArICAgICAgICAg ICAgICAgICAgICAgICAgICAgICB1NjQgZGVzY19hcmVhLCB1NjQgZHJpdmVyX2FyZWEsCj4+PiAr ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1NjQgZGV2aWNlX2FyZWEpCj4+PiArewo+Pj4g KyAgICAgc3RydWN0IHZkdXNlX2RldiAqZGV2ID0gdmRwYV90b192ZHVzZSh2ZHBhKTsKPj4+ICsg ICAgIHN0cnVjdCB2ZHVzZV92aXJ0cXVldWUgKnZxID0gJmRldi0+dnFzW2lkeF07Cj4+PiArCj4+ PiArICAgICB2cS0+ZGVzY19hZGRyID0gZGVzY19hcmVhOwo+Pj4gKyAgICAgdnEtPmRyaXZlcl9h ZGRyID0gZHJpdmVyX2FyZWE7Cj4+PiArICAgICB2cS0+ZGV2aWNlX2FkZHIgPSBkZXZpY2VfYXJl YTsKPj4+ICsKPj4+ICsgICAgIHJldHVybiAwOwo+Pj4gK30KPj4+ICsKPj4+ICtzdGF0aWMgdm9p ZCB2ZHVzZV92ZHBhX2tpY2tfdnEoc3RydWN0IHZkcGFfZGV2aWNlICp2ZHBhLCB1MTYgaWR4KQo+ Pj4gK3sKPj4+ICsgICAgIHN0cnVjdCB2ZHVzZV9kZXYgKmRldiA9IHZkcGFfdG9fdmR1c2UodmRw YSk7Cj4+PiArICAgICBzdHJ1Y3QgdmR1c2VfdmlydHF1ZXVlICp2cSA9ICZkZXYtPnZxc1tpZHhd Owo+Pj4gKwo+Pj4gKyAgICAgc3Bpbl9sb2NrKCZ2cS0+a2lja19sb2NrKTsKPj4+ICsgICAgIGlm ICghdnEtPnJlYWR5KQo+Pj4gKyAgICAgICAgICAgICBnb3RvIHVubG9jazsKPj4+ICsKPj4+ICsg ICAgIGlmICh2cS0+a2lja2ZkKQo+Pj4gKyAgICAgICAgICAgICBldmVudGZkX3NpZ25hbCh2cS0+ a2lja2ZkLCAxKTsKPj4+ICsgICAgIGVsc2UKPj4+ICsgICAgICAgICAgICAgdnEtPmtpY2tlZCA9 IHRydWU7Cj4+PiArdW5sb2NrOgo+Pj4gKyAgICAgc3Bpbl91bmxvY2soJnZxLT5raWNrX2xvY2sp Owo+Pj4gK30KPj4+ICsKPj4+ICtzdGF0aWMgdm9pZCB2ZHVzZV92ZHBhX3NldF92cV9jYihzdHJ1 Y3QgdmRwYV9kZXZpY2UgKnZkcGEsIHUxNiBpZHgsCj4+PiArICAgICAgICAgICAgICAgICAgICAg ICAgICAgc3RydWN0IHZkcGFfY2FsbGJhY2sgKmNiKQo+Pj4gK3sKPj4+ICsgICAgIHN0cnVjdCB2 ZHVzZV9kZXYgKmRldiA9IHZkcGFfdG9fdmR1c2UodmRwYSk7Cj4+PiArICAgICBzdHJ1Y3QgdmR1 c2VfdmlydHF1ZXVlICp2cSA9ICZkZXYtPnZxc1tpZHhdOwo+Pj4gKwo+Pj4gKyAgICAgc3Bpbl9s b2NrKCZ2cS0+aXJxX2xvY2spOwo+Pj4gKyAgICAgdnEtPmNiLmNhbGxiYWNrID0gY2ItPmNhbGxi YWNrOwo+Pj4gKyAgICAgdnEtPmNiLnByaXZhdGUgPSBjYi0+cHJpdmF0ZTsKPj4+ICsgICAgIHNw aW5fdW5sb2NrKCZ2cS0+aXJxX2xvY2spOwo+Pj4gK30KPj4+ICsKPj4+ICtzdGF0aWMgdm9pZCB2 ZHVzZV92ZHBhX3NldF92cV9udW0oc3RydWN0IHZkcGFfZGV2aWNlICp2ZHBhLCB1MTYgaWR4LCB1 MzIgbnVtKQo+Pj4gK3sKPj4+ICsgICAgIHN0cnVjdCB2ZHVzZV9kZXYgKmRldiA9IHZkcGFfdG9f dmR1c2UodmRwYSk7Cj4+PiArICAgICBzdHJ1Y3QgdmR1c2VfdmlydHF1ZXVlICp2cSA9ICZkZXYt PnZxc1tpZHhdOwo+Pj4gKwo+Pj4gKyAgICAgdnEtPm51bSA9IG51bTsKPj4+ICt9Cj4+PiArCj4+ PiArc3RhdGljIHZvaWQgdmR1c2VfdmRwYV9zZXRfdnFfcmVhZHkoc3RydWN0IHZkcGFfZGV2aWNl ICp2ZHBhLAo+Pj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTYgaWR4 LCBib29sIHJlYWR5KQo+Pj4gK3sKPj4+ICsgICAgIHN0cnVjdCB2ZHVzZV9kZXYgKmRldiA9IHZk cGFfdG9fdmR1c2UodmRwYSk7Cj4+PiArICAgICBzdHJ1Y3QgdmR1c2VfdmlydHF1ZXVlICp2cSA9 ICZkZXYtPnZxc1tpZHhdOwo+Pj4gKwo+Pj4gKyAgICAgdnEtPnJlYWR5ID0gcmVhZHk7Cj4+PiAr fQo+Pj4gKwo+Pj4gK3N0YXRpYyBib29sIHZkdXNlX3ZkcGFfZ2V0X3ZxX3JlYWR5KHN0cnVjdCB2 ZHBhX2RldmljZSAqdmRwYSwgdTE2IGlkeCkKPj4+ICt7Cj4+PiArICAgICBzdHJ1Y3QgdmR1c2Vf ZGV2ICpkZXYgPSB2ZHBhX3RvX3ZkdXNlKHZkcGEpOwo+Pj4gKyAgICAgc3RydWN0IHZkdXNlX3Zp cnRxdWV1ZSAqdnEgPSAmZGV2LT52cXNbaWR4XTsKPj4+ICsKPj4+ICsgICAgIHJldHVybiB2cS0+ cmVhZHk7Cj4+PiArfQo+Pj4gKwo+Pj4gK3N0YXRpYyBpbnQgdmR1c2VfdmRwYV9zZXRfdnFfc3Rh dGUoc3RydWN0IHZkcGFfZGV2aWNlICp2ZHBhLCB1MTYgaWR4LAo+Pj4gKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHZkcGFfdnFfc3RhdGUgKnN0YXRlKQo+Pj4gK3sK Pj4+ICsgICAgIHN0cnVjdCB2ZHVzZV9kZXYgKmRldiA9IHZkcGFfdG9fdmR1c2UodmRwYSk7Cj4+ PiArICAgICBzdHJ1Y3QgdmR1c2VfdmlydHF1ZXVlICp2cSA9ICZkZXYtPnZxc1tpZHhdOwo+Pj4g Kwo+Pj4gKyAgICAgdnEtPmF2YWlsX2lkeCA9IHN0YXRlLT5hdmFpbF9pbmRleDsKPj4+ICsgICAg IHJldHVybiAwOwo+Pj4gK30KPj4+ICsKPj4+ICtzdGF0aWMgaW50IHZkdXNlX3ZkcGFfZ2V0X3Zx X3N0YXRlKHN0cnVjdCB2ZHBhX2RldmljZSAqdmRwYSwgdTE2IGlkeCwKPj4+ICsgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHN0cnVjdCB2ZHBhX3ZxX3N0YXRlICpzdGF0ZSkKPj4+ICt7Cj4+ PiArICAgICBzdHJ1Y3QgdmR1c2VfZGV2ICpkZXYgPSB2ZHBhX3RvX3ZkdXNlKHZkcGEpOwo+Pj4g KyAgICAgc3RydWN0IHZkdXNlX3ZpcnRxdWV1ZSAqdnEgPSAmZGV2LT52cXNbaWR4XTsKPj4+ICsK Pj4+ICsgICAgIHJldHVybiB2ZHVzZV9kZXZfZ2V0X3ZxX3N0YXRlKGRldiwgdnEsIHN0YXRlKTsK Pj4+ICt9Cj4+PiArCj4+PiArc3RhdGljIHUzMiB2ZHVzZV92ZHBhX2dldF92cV9hbGlnbihzdHJ1 Y3QgdmRwYV9kZXZpY2UgKnZkcGEpCj4+PiArewo+Pj4gKyAgICAgc3RydWN0IHZkdXNlX2RldiAq ZGV2ID0gdmRwYV90b192ZHVzZSh2ZHBhKTsKPj4+ICsKPj4+ICsgICAgIHJldHVybiBkZXYtPnZx X2FsaWduOwo+Pj4gK30KPj4+ICsKPj4+ICtzdGF0aWMgdTY0IHZkdXNlX3ZkcGFfZ2V0X2ZlYXR1 cmVzKHN0cnVjdCB2ZHBhX2RldmljZSAqdmRwYSkKPj4+ICt7Cj4+PiArICAgICBzdHJ1Y3QgdmR1 c2VfZGV2ICpkZXYgPSB2ZHBhX3RvX3ZkdXNlKHZkcGEpOwo+Pj4gKwo+Pj4gKyAgICAgcmV0dXJu IGRldi0+dXNlcl9mZWF0dXJlczsKPj4+ICt9Cj4+PiArCj4+PiArc3RhdGljIGludCB2ZHVzZV92 ZHBhX3NldF9mZWF0dXJlcyhzdHJ1Y3QgdmRwYV9kZXZpY2UgKnZkcGEsIHU2NCBmZWF0dXJlcykK Pj4+ICt7Cj4+PiArICAgICBzdHJ1Y3QgdmR1c2VfZGV2ICpkZXYgPSB2ZHBhX3RvX3ZkdXNlKHZk cGEpOwo+Pj4gKwo+Pj4gKyAgICAgZGV2LT5mZWF0dXJlcyA9IGZlYXR1cmVzOwo+Pj4gKyAgICAg cmV0dXJuIDA7Cj4+PiArfQo+Pj4gKwo+Pj4gK3N0YXRpYyB2b2lkIHZkdXNlX3ZkcGFfc2V0X2Nv bmZpZ19jYihzdHJ1Y3QgdmRwYV9kZXZpY2UgKnZkcGEsCj4+PiArICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHN0cnVjdCB2ZHBhX2NhbGxiYWNrICpjYikKPj4+ICt7Cj4+PiArICAgICBz dHJ1Y3QgdmR1c2VfZGV2ICpkZXYgPSB2ZHBhX3RvX3ZkdXNlKHZkcGEpOwo+Pj4gKwo+Pj4gKyAg ICAgc3Bpbl9sb2NrKCZkZXYtPmlycV9sb2NrKTsKPj4+ICsgICAgIGRldi0+Y29uZmlnX2NiLmNh bGxiYWNrID0gY2ItPmNhbGxiYWNrOwo+Pj4gKyAgICAgZGV2LT5jb25maWdfY2IucHJpdmF0ZSA9 IGNiLT5wcml2YXRlOwo+Pj4gKyAgICAgc3Bpbl91bmxvY2soJmRldi0+aXJxX2xvY2spOwo+Pj4g K30KPj4+ICsKPj4+ICtzdGF0aWMgdTE2IHZkdXNlX3ZkcGFfZ2V0X3ZxX251bV9tYXgoc3RydWN0 IHZkcGFfZGV2aWNlICp2ZHBhKQo+Pj4gK3sKPj4+ICsgICAgIHN0cnVjdCB2ZHVzZV9kZXYgKmRl diA9IHZkcGFfdG9fdmR1c2UodmRwYSk7Cj4+PiArCj4+PiArICAgICByZXR1cm4gZGV2LT52cV9z aXplX21heDsKPj4+ICt9Cj4+PiArCj4+PiArc3RhdGljIHUzMiB2ZHVzZV92ZHBhX2dldF9kZXZp Y2VfaWQoc3RydWN0IHZkcGFfZGV2aWNlICp2ZHBhKQo+Pj4gK3sKPj4+ICsgICAgIHN0cnVjdCB2 ZHVzZV9kZXYgKmRldiA9IHZkcGFfdG9fdmR1c2UodmRwYSk7Cj4+PiArCj4+PiArICAgICByZXR1 cm4gZGV2LT5kZXZpY2VfaWQ7Cj4+PiArfQo+Pj4gKwo+Pj4gK3N0YXRpYyB1MzIgdmR1c2VfdmRw YV9nZXRfdmVuZG9yX2lkKHN0cnVjdCB2ZHBhX2RldmljZSAqdmRwYSkKPj4+ICt7Cj4+PiArICAg ICBzdHJ1Y3QgdmR1c2VfZGV2ICpkZXYgPSB2ZHBhX3RvX3ZkdXNlKHZkcGEpOwo+Pj4gKwo+Pj4g KyAgICAgcmV0dXJuIGRldi0+dmVuZG9yX2lkOwo+Pj4gK30KPj4+ICsKPj4+ICtzdGF0aWMgdTgg dmR1c2VfdmRwYV9nZXRfc3RhdHVzKHN0cnVjdCB2ZHBhX2RldmljZSAqdmRwYSkKPj4+ICt7Cj4+ PiArICAgICBzdHJ1Y3QgdmR1c2VfZGV2ICpkZXYgPSB2ZHBhX3RvX3ZkdXNlKHZkcGEpOwo+Pj4g Kwo+Pj4gKyAgICAgcmV0dXJuIGRldi0+c3RhdHVzOwo+Pj4gK30KPj4+ICsKPj4+ICtzdGF0aWMg dm9pZCB2ZHVzZV92ZHBhX3NldF9zdGF0dXMoc3RydWN0IHZkcGFfZGV2aWNlICp2ZHBhLCB1OCBz dGF0dXMpCj4+PiArewo+Pj4gKyAgICAgc3RydWN0IHZkdXNlX2RldiAqZGV2ID0gdmRwYV90b192 ZHVzZSh2ZHBhKTsKPj4+ICsgICAgIGJvb2wgc3RhcnRlZCA9ICEhKHN0YXR1cyAmIFZJUlRJT19D T05GSUdfU19EUklWRVJfT0spOwo+Pj4gKwo+Pj4gKyAgICAgZGV2LT5zdGF0dXMgPSBzdGF0dXM7 Cj4+PiArCj4+PiArICAgICBpZiAoZGV2LT5zdGFydGVkID09IHN0YXJ0ZWQpCj4+PiArICAgICAg ICAgICAgIHJldHVybjsKPj4KPj4gSWYgd2UgY2hlY2sgZGV2LT5zdGF0dXMgPT0gc3RhdHVzLCAo b3Igb25seSBjaGVjayB0aGUgRFJJVkVSX09LIGJpdCkKPj4gdGhlbiB0aGVyZSdzIG5vIG5lZWQg dG8gaW50cm9kdWNlIGFuIGV4dHJhIGRldi0+c3RhcnRlZC4KPj4KPiBXaWxsIGRvIGl0Lgo+Cj4+ PiArCj4+PiArICAgICBkZXYtPnN0YXJ0ZWQgPSBzdGFydGVkOwo+Pj4gKyAgICAgaWYgKGRldi0+ c3RhcnRlZCkgewo+Pj4gKyAgICAgICAgICAgICB2ZHVzZV9kZXZfc3RhcnRfZGF0YXBsYW5lKGRl dik7Cj4+PiArICAgICB9IGVsc2Ugewo+Pj4gKyAgICAgICAgICAgICB2ZHVzZV9kZXZfcmVzZXQo ZGV2KTsKPj4+ICsgICAgICAgICAgICAgdmR1c2VfZGV2X3N0b3BfZGF0YXBsYW5lKGRldik7Cj4+ Cj4+IEkgd29uZGVyIGlmIG5vX3JlcGx5IHdvcmsgZm9yIHRoZSBjYXNlIG9mIHZob3N0LXZkcGEu IEZvciB2aXJ0aW8tdkRQQSwKPj4gd2UgaGF2ZSBib3VuY2luZyBidWZmZXJzIHNvIGl0J3MgaGFy bWxlc3MgaWYgdXNlcnNhcGNlIGRhdGFwbGFuZSBrZWVwcwo+PiBwZXJmb3JtaW5nIHJlYWQvd3Jp dGUuIEZvciB2aG9zdC12RFBBIHdlIGRvbid0IGhhdmUgc3VjaCBzdHVmZnMuCj4+Cj4gT0suIFNv IGl0IHN0aWxsIG5lZWRzIHRvIGJlIHN5bmNocm9uaXplZCBoZXJlLiBJZiBzbywgaG93IHRvIGhh bmRsZQo+IHRoZSBlcnJvcj8gTG9va3MgbGlrZSBwcmludGluZyBhIHdhcm5pbmcgbWVzc2FnZSBz aG91bGQgYmUgZW5vdWdoLgoKCldlIG5lZWQgZml4IGEgd2F5IHRvIHByb3BhZ2F0ZSB0aGUgZXJy b3IgdG8gdGhlIHVzZXJzcGFjZS4KCkUuZyBpZiB3ZSB3YW50IHRvIHN0b3AgdGhlIGRlaXZjZSwg d2Ugd2lsbCBkZWxheSB0aGUgc3RhdHVzIHJlc2V0IHVudGlsIAp3ZSBnZXQgcmVzcG9zZSBmcm9t IHRoZSB1c2Vyc3BhY2U/CgoKPgo+Pj4gKyAgICAgfQo+Pj4gK30KPj4+ICsKPj4+ICtzdGF0aWMg c2l6ZV90IHZkdXNlX3ZkcGFfZ2V0X2NvbmZpZ19zaXplKHN0cnVjdCB2ZHBhX2RldmljZSAqdmRw YSkKPj4+ICt7Cj4+PiArICAgICBzdHJ1Y3QgdmR1c2VfZGV2ICpkZXYgPSB2ZHBhX3RvX3ZkdXNl KHZkcGEpOwo+Pj4gKwo+Pj4gKyAgICAgcmV0dXJuIGRldi0+Y29uZmlnX3NpemU7Cj4+PiArfQo+ Pj4gKwo+Pj4gK3N0YXRpYyB2b2lkIHZkdXNlX3ZkcGFfZ2V0X2NvbmZpZyhzdHJ1Y3QgdmRwYV9k ZXZpY2UgKnZkcGEsIHVuc2lnbmVkIGludCBvZmZzZXQsCj4+PiArICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHZvaWQgKmJ1ZiwgdW5zaWduZWQgaW50IGxlbikKPj4+ICt7Cj4+PiArICAg ICBzdHJ1Y3QgdmR1c2VfZGV2ICpkZXYgPSB2ZHBhX3RvX3ZkdXNlKHZkcGEpOwo+Pj4gKwo+Pj4g KyAgICAgbWVtY3B5KGJ1ZiwgZGV2LT5jb25maWcgKyBvZmZzZXQsIGxlbik7Cj4+PiArfQo+Pj4g Kwo+Pj4gK3N0YXRpYyB2b2lkIHZkdXNlX3ZkcGFfc2V0X2NvbmZpZyhzdHJ1Y3QgdmRwYV9kZXZp Y2UgKnZkcGEsIHVuc2lnbmVkIGludCBvZmZzZXQsCj4+PiArICAgICAgICAgICAgICAgICAgICAg Y29uc3Qgdm9pZCAqYnVmLCB1bnNpZ25lZCBpbnQgbGVuKQo+Pj4gK3sKPj4+ICsgICAgIC8qIE5v dyB3ZSBvbmx5IHN1cHBvcnQgcmVhZC1vbmx5IGNvbmZpZ3VyYXRpb24gc3BhY2UgKi8KPj4+ICt9 Cj4+PiArCj4+PiArc3RhdGljIHUzMiB2ZHVzZV92ZHBhX2dldF9nZW5lcmF0aW9uKHN0cnVjdCB2 ZHBhX2RldmljZSAqdmRwYSkKPj4+ICt7Cj4+PiArICAgICBzdHJ1Y3QgdmR1c2VfZGV2ICpkZXYg PSB2ZHBhX3RvX3ZkdXNlKHZkcGEpOwo+Pj4gKwo+Pj4gKyAgICAgcmV0dXJuIGRldi0+Z2VuZXJh dGlvbjsKPj4+ICt9Cj4+PiArCj4+PiArc3RhdGljIGludCB2ZHVzZV92ZHBhX3NldF9tYXAoc3Ry dWN0IHZkcGFfZGV2aWNlICp2ZHBhLAo+Pj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg c3RydWN0IHZob3N0X2lvdGxiICppb3RsYikKPj4+ICt7Cj4+PiArICAgICBzdHJ1Y3QgdmR1c2Vf ZGV2ICpkZXYgPSB2ZHBhX3RvX3ZkdXNlKHZkcGEpOwo+Pj4gKyAgICAgaW50IHJldDsKPj4+ICsK Pj4+ICsgICAgIHJldCA9IHZkdXNlX2RvbWFpbl9zZXRfbWFwKGRldi0+ZG9tYWluLCBpb3RsYik7 Cj4+PiArICAgICBpZiAocmV0KQo+Pj4gKyAgICAgICAgICAgICByZXR1cm4gcmV0Owo+Pj4gKwo+ Pj4gKyAgICAgcmV0ID0gdmR1c2VfZGV2X3VwZGF0ZV9pb3RsYihkZXYsIDBVTEwsIFVMTE9OR19N QVgpOwo+Pj4gKyAgICAgaWYgKHJldCkgewo+Pj4gKyAgICAgICAgICAgICB2ZHVzZV9kb21haW5f Y2xlYXJfbWFwKGRldi0+ZG9tYWluLCBpb3RsYik7Cj4+PiArICAgICAgICAgICAgIHJldHVybiBy ZXQ7Cj4+PiArICAgICB9Cj4+PiArCj4+PiArICAgICByZXR1cm4gMDsKPj4+ICt9Cj4+PiArCj4+ PiArc3RhdGljIHZvaWQgdmR1c2VfdmRwYV9mcmVlKHN0cnVjdCB2ZHBhX2RldmljZSAqdmRwYSkK Pj4+ICt7Cj4+PiArICAgICBzdHJ1Y3QgdmR1c2VfZGV2ICpkZXYgPSB2ZHBhX3RvX3ZkdXNlKHZk cGEpOwo+Pj4gKwo+Pj4gKyAgICAgZGV2LT52ZGV2ID0gTlVMTDsKPj4+ICt9Cj4+PiArCj4+PiAr c3RhdGljIGNvbnN0IHN0cnVjdCB2ZHBhX2NvbmZpZ19vcHMgdmR1c2VfdmRwYV9jb25maWdfb3Bz ID0gewo+Pj4gKyAgICAgLnNldF92cV9hZGRyZXNzICAgICAgICAgPSB2ZHVzZV92ZHBhX3NldF92 cV9hZGRyZXNzLAo+Pj4gKyAgICAgLmtpY2tfdnEgICAgICAgICAgICAgICAgPSB2ZHVzZV92ZHBh X2tpY2tfdnEsCj4+PiArICAgICAuc2V0X3ZxX2NiICAgICAgICAgICAgICA9IHZkdXNlX3ZkcGFf c2V0X3ZxX2NiLAo+Pj4gKyAgICAgLnNldF92cV9udW0gICAgICAgICAgICAgPSB2ZHVzZV92ZHBh X3NldF92cV9udW0sCj4+PiArICAgICAuc2V0X3ZxX3JlYWR5ICAgICAgICAgICA9IHZkdXNlX3Zk cGFfc2V0X3ZxX3JlYWR5LAo+Pj4gKyAgICAgLmdldF92cV9yZWFkeSAgICAgICAgICAgPSB2ZHVz ZV92ZHBhX2dldF92cV9yZWFkeSwKPj4+ICsgICAgIC5zZXRfdnFfc3RhdGUgICAgICAgICAgID0g dmR1c2VfdmRwYV9zZXRfdnFfc3RhdGUsCj4+PiArICAgICAuZ2V0X3ZxX3N0YXRlICAgICAgICAg ICA9IHZkdXNlX3ZkcGFfZ2V0X3ZxX3N0YXRlLAo+Pj4gKyAgICAgLmdldF92cV9hbGlnbiAgICAg ICAgICAgPSB2ZHVzZV92ZHBhX2dldF92cV9hbGlnbiwKPj4+ICsgICAgIC5nZXRfZmVhdHVyZXMg ICAgICAgICAgID0gdmR1c2VfdmRwYV9nZXRfZmVhdHVyZXMsCj4+PiArICAgICAuc2V0X2ZlYXR1 cmVzICAgICAgICAgICA9IHZkdXNlX3ZkcGFfc2V0X2ZlYXR1cmVzLAo+Pj4gKyAgICAgLnNldF9j b25maWdfY2IgICAgICAgICAgPSB2ZHVzZV92ZHBhX3NldF9jb25maWdfY2IsCj4+PiArICAgICAu Z2V0X3ZxX251bV9tYXggICAgICAgICA9IHZkdXNlX3ZkcGFfZ2V0X3ZxX251bV9tYXgsCj4+PiAr ICAgICAuZ2V0X2RldmljZV9pZCAgICAgICAgICA9IHZkdXNlX3ZkcGFfZ2V0X2RldmljZV9pZCwK Pj4+ICsgICAgIC5nZXRfdmVuZG9yX2lkICAgICAgICAgID0gdmR1c2VfdmRwYV9nZXRfdmVuZG9y X2lkLAo+Pj4gKyAgICAgLmdldF9zdGF0dXMgICAgICAgICAgICAgPSB2ZHVzZV92ZHBhX2dldF9z dGF0dXMsCj4+PiArICAgICAuc2V0X3N0YXR1cyAgICAgICAgICAgICA9IHZkdXNlX3ZkcGFfc2V0 X3N0YXR1cywKPj4+ICsgICAgIC5nZXRfY29uZmlnX3NpemUgICAgICAgID0gdmR1c2VfdmRwYV9n ZXRfY29uZmlnX3NpemUsCj4+PiArICAgICAuZ2V0X2NvbmZpZyAgICAgICAgICAgICA9IHZkdXNl X3ZkcGFfZ2V0X2NvbmZpZywKPj4+ICsgICAgIC5zZXRfY29uZmlnICAgICAgICAgICAgID0gdmR1 c2VfdmRwYV9zZXRfY29uZmlnLAo+Pj4gKyAgICAgLmdldF9nZW5lcmF0aW9uICAgICAgICAgPSB2 ZHVzZV92ZHBhX2dldF9nZW5lcmF0aW9uLAo+Pj4gKyAgICAgLnNldF9tYXAgICAgICAgICAgICAg ICAgPSB2ZHVzZV92ZHBhX3NldF9tYXAsCj4+PiArICAgICAuZnJlZSAgICAgICAgICAgICAgICAg ICA9IHZkdXNlX3ZkcGFfZnJlZSwKPj4+ICt9Owo+Pj4gKwo+Pj4gK3N0YXRpYyBkbWFfYWRkcl90 IHZkdXNlX2Rldl9tYXBfcGFnZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBwYWdlICpwYWdl LAo+Pj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIG9m ZnNldCwgc2l6ZV90IHNpemUsCj4+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpciwKPj4+ICsgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBhdHRycykKPj4+ICt7Cj4+PiArICAgICBzdHJ1Y3Qg dmR1c2VfZGV2ICp2ZGV2ID0gZGV2X3RvX3ZkdXNlKGRldik7Cj4+PiArICAgICBzdHJ1Y3QgdmR1 c2VfaW92YV9kb21haW4gKmRvbWFpbiA9IHZkZXYtPmRvbWFpbjsKPj4+ICsKPj4+ICsgICAgIHJl dHVybiB2ZHVzZV9kb21haW5fbWFwX3BhZ2UoZG9tYWluLCBwYWdlLCBvZmZzZXQsIHNpemUsIGRp ciwgYXR0cnMpOwo+Pj4gK30KPj4+ICsKPj4+ICtzdGF0aWMgdm9pZCB2ZHVzZV9kZXZfdW5tYXBf cGFnZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgZG1hX2FkZHIsCj4+PiArICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSwgZW51bSBkbWFfZGF0YV9kaXJlY3Rp b24gZGlyLAo+Pj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBh dHRycykKPj4+ICt7Cj4+PiArICAgICBzdHJ1Y3QgdmR1c2VfZGV2ICp2ZGV2ID0gZGV2X3RvX3Zk dXNlKGRldik7Cj4+PiArICAgICBzdHJ1Y3QgdmR1c2VfaW92YV9kb21haW4gKmRvbWFpbiA9IHZk ZXYtPmRvbWFpbjsKPj4+ICsKPj4+ICsgICAgIHJldHVybiB2ZHVzZV9kb21haW5fdW5tYXBfcGFn ZShkb21haW4sIGRtYV9hZGRyLCBzaXplLCBkaXIsIGF0dHJzKTsKPj4+ICt9Cj4+PiArCj4+PiAr c3RhdGljIHZvaWQgKnZkdXNlX2Rldl9hbGxvY19jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYs IHNpemVfdCBzaXplLAo+Pj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBk bWFfYWRkcl90ICpkbWFfYWRkciwgZ2ZwX3QgZmxhZywKPj4+ICsgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBhdHRycykKPj4+ICt7Cj4+PiArICAgICBz dHJ1Y3QgdmR1c2VfZGV2ICp2ZGV2ID0gZGV2X3RvX3ZkdXNlKGRldik7Cj4+PiArICAgICBzdHJ1 Y3QgdmR1c2VfaW92YV9kb21haW4gKmRvbWFpbiA9IHZkZXYtPmRvbWFpbjsKPj4+ICsgICAgIHVu c2lnbmVkIGxvbmcgaW92YTsKPj4+ICsgICAgIHZvaWQgKmFkZHI7Cj4+PiArCj4+PiArICAgICAq ZG1hX2FkZHIgPSBETUFfTUFQUElOR19FUlJPUjsKPj4+ICsgICAgIGFkZHIgPSB2ZHVzZV9kb21h aW5fYWxsb2NfY29oZXJlbnQoZG9tYWluLCBzaXplLAo+Pj4gKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgKGRtYV9hZGRyX3QgKikmaW92YSwgZmxhZywgYXR0cnMpOwo+Pj4gKyAgICAgaWYg KCFhZGRyKQo+Pj4gKyAgICAgICAgICAgICByZXR1cm4gTlVMTDsKPj4+ICsKPj4+ICsgICAgICpk bWFfYWRkciA9IChkbWFfYWRkcl90KWlvdmE7Cj4+PiArCj4+PiArICAgICByZXR1cm4gYWRkcjsK Pj4+ICt9Cj4+PiArCj4+PiArc3RhdGljIHZvaWQgdmR1c2VfZGV2X2ZyZWVfY29oZXJlbnQoc3Ry dWN0IGRldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwKPj4+ICsgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgdm9pZCAqdmFkZHIsIGRtYV9hZGRyX3QgZG1hX2FkZHIsCj4+PiArICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgYXR0cnMpCj4+ PiArewo+Pj4gKyAgICAgc3RydWN0IHZkdXNlX2RldiAqdmRldiA9IGRldl90b192ZHVzZShkZXYp Owo+Pj4gKyAgICAgc3RydWN0IHZkdXNlX2lvdmFfZG9tYWluICpkb21haW4gPSB2ZGV2LT5kb21h aW47Cj4+PiArCj4+PiArICAgICB2ZHVzZV9kb21haW5fZnJlZV9jb2hlcmVudChkb21haW4sIHNp emUsIHZhZGRyLCBkbWFfYWRkciwgYXR0cnMpOwo+Pj4gK30KPj4+ICsKPj4+ICtzdGF0aWMgc2l6 ZV90IHZkdXNlX2Rldl9tYXhfbWFwcGluZ19zaXplKHN0cnVjdCBkZXZpY2UgKmRldikKPj4+ICt7 Cj4+PiArICAgICBzdHJ1Y3QgdmR1c2VfZGV2ICp2ZGV2ID0gZGV2X3RvX3ZkdXNlKGRldik7Cj4+ PiArICAgICBzdHJ1Y3QgdmR1c2VfaW92YV9kb21haW4gKmRvbWFpbiA9IHZkZXYtPmRvbWFpbjsK Pj4+ICsKPj4+ICsgICAgIHJldHVybiBkb21haW4tPmJvdW5jZV9zaXplOwo+Pj4gK30KPj4+ICsK Pj4+ICtzdGF0aWMgY29uc3Qgc3RydWN0IGRtYV9tYXBfb3BzIHZkdXNlX2Rldl9kbWFfb3BzID0g ewo+Pj4gKyAgICAgLm1hcF9wYWdlID0gdmR1c2VfZGV2X21hcF9wYWdlLAo+Pj4gKyAgICAgLnVu bWFwX3BhZ2UgPSB2ZHVzZV9kZXZfdW5tYXBfcGFnZSwKPj4+ICsgICAgIC5hbGxvYyA9IHZkdXNl X2Rldl9hbGxvY19jb2hlcmVudCwKPj4+ICsgICAgIC5mcmVlID0gdmR1c2VfZGV2X2ZyZWVfY29o ZXJlbnQsCj4+PiArICAgICAubWF4X21hcHBpbmdfc2l6ZSA9IHZkdXNlX2Rldl9tYXhfbWFwcGlu Z19zaXplLAo+Pj4gK307Cj4+PiArCj4+PiArc3RhdGljIHVuc2lnbmVkIGludCBwZXJtX3RvX2Zp bGVfZmxhZ3ModTggcGVybSkKPj4+ICt7Cj4+PiArICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MgPSAw Owo+Pj4gKwo+Pj4gKyAgICAgc3dpdGNoIChwZXJtKSB7Cj4+PiArICAgICBjYXNlIFZEVVNFX0FD Q0VTU19XTzoKPj4+ICsgICAgICAgICAgICAgZmxhZ3MgfD0gT19XUk9OTFk7Cj4+PiArICAgICAg ICAgICAgIGJyZWFrOwo+Pj4gKyAgICAgY2FzZSBWRFVTRV9BQ0NFU1NfUk86Cj4+PiArICAgICAg ICAgICAgIGZsYWdzIHw9IE9fUkRPTkxZOwo+Pj4gKyAgICAgICAgICAgICBicmVhazsKPj4+ICsg ICAgIGNhc2UgVkRVU0VfQUNDRVNTX1JXOgo+Pj4gKyAgICAgICAgICAgICBmbGFncyB8PSBPX1JE V1I7Cj4+PiArICAgICAgICAgICAgIGJyZWFrOwo+Pj4gKyAgICAgZGVmYXVsdDoKPj4+ICsgICAg ICAgICAgICAgV0FSTigxLCAiaW52YWxpZGF0ZSB2aG9zdCBJT1RMQiBwZXJtaXNzaW9uXG4iKTsK Pj4+ICsgICAgICAgICAgICAgYnJlYWs7Cj4+PiArICAgICB9Cj4+PiArCj4+PiArICAgICByZXR1 cm4gZmxhZ3M7Cj4+PiArfQo+Pj4gKwo+Pj4gK3N0YXRpYyBpbnQgdmR1c2Vfa2lja2ZkX3NldHVw KHN0cnVjdCB2ZHVzZV9kZXYgKmRldiwKPj4+ICsgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qg dmR1c2VfdnFfZXZlbnRmZCAqZXZlbnRmZCkKPj4+ICt7Cj4+PiArICAgICBzdHJ1Y3QgZXZlbnRm ZF9jdHggKmN0eCA9IE5VTEw7Cj4+PiArICAgICBzdHJ1Y3QgdmR1c2VfdmlydHF1ZXVlICp2cTsK Pj4+ICsgICAgIHUzMiBpbmRleDsKPj4+ICsKPj4+ICsgICAgIGlmIChldmVudGZkLT5pbmRleCA+ PSBkZXYtPnZxX251bSkKPj4+ICsgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Cj4+PiArCj4+ PiArICAgICBpbmRleCA9IGFycmF5X2luZGV4X25vc3BlYyhldmVudGZkLT5pbmRleCwgZGV2LT52 cV9udW0pOwo+Pj4gKyAgICAgdnEgPSAmZGV2LT52cXNbaW5kZXhdOwo+Pj4gKyAgICAgaWYgKGV2 ZW50ZmQtPmZkID49IDApIHsKPj4+ICsgICAgICAgICAgICAgY3R4ID0gZXZlbnRmZF9jdHhfZmRn ZXQoZXZlbnRmZC0+ZmQpOwo+Pj4gKyAgICAgICAgICAgICBpZiAoSVNfRVJSKGN0eCkpCj4+PiAr ICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBUUl9FUlIoY3R4KTsKPj4+ICsgICAgIH0gZWxz ZSBpZiAoZXZlbnRmZC0+ZmQgIT0gVkRVU0VfRVZFTlRGRF9ERUFTU0lHTikKPj4+ICsgICAgICAg ICAgICAgcmV0dXJuIDA7Cj4+PiArCj4+PiArICAgICBzcGluX2xvY2soJnZxLT5raWNrX2xvY2sp Owo+Pj4gKyAgICAgaWYgKHZxLT5raWNrZmQpCj4+PiArICAgICAgICAgICAgIGV2ZW50ZmRfY3R4 X3B1dCh2cS0+a2lja2ZkKTsKPj4+ICsgICAgIHZxLT5raWNrZmQgPSBjdHg7Cj4+PiArICAgICBp ZiAodnEtPnJlYWR5ICYmIHZxLT5raWNrZWQgJiYgdnEtPmtpY2tmZCkgewo+Pj4gKyAgICAgICAg ICAgICBldmVudGZkX3NpZ25hbCh2cS0+a2lja2ZkLCAxKTsKPj4+ICsgICAgICAgICAgICAgdnEt PmtpY2tlZCA9IGZhbHNlOwo+Pj4gKyAgICAgfQo+Pj4gKyAgICAgc3Bpbl91bmxvY2soJnZxLT5r aWNrX2xvY2spOwo+Pj4gKwo+Pj4gKyAgICAgcmV0dXJuIDA7Cj4+PiArfQo+Pj4gKwo+Pj4gK3N0 YXRpYyB2b2lkIHZkdXNlX2Rldl9pcnFfaW5qZWN0KHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykK Pj4+ICt7Cj4+PiArICAgICBzdHJ1Y3QgdmR1c2VfZGV2ICpkZXYgPSBjb250YWluZXJfb2Yod29y aywgc3RydWN0IHZkdXNlX2RldiwgaW5qZWN0KTsKPj4+ICsKPj4+ICsgICAgIHNwaW5fbG9ja19p cnEoJmRldi0+aXJxX2xvY2spOwo+Pj4gKyAgICAgaWYgKGRldi0+Y29uZmlnX2NiLmNhbGxiYWNr KQo+Pj4gKyAgICAgICAgICAgICBkZXYtPmNvbmZpZ19jYi5jYWxsYmFjayhkZXYtPmNvbmZpZ19j Yi5wcml2YXRlKTsKPj4+ICsgICAgIHNwaW5fdW5sb2NrX2lycSgmZGV2LT5pcnFfbG9jayk7Cj4+ PiArfQo+Pj4gKwo+Pj4gK3N0YXRpYyB2b2lkIHZkdXNlX3ZxX2lycV9pbmplY3Qoc3RydWN0IHdv cmtfc3RydWN0ICp3b3JrKQo+Pj4gK3sKPj4+ICsgICAgIHN0cnVjdCB2ZHVzZV92aXJ0cXVldWUg KnZxID0gY29udGFpbmVyX29mKHdvcmssCj4+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHN0cnVjdCB2ZHVzZV92aXJ0cXVldWUsIGluamVjdCk7Cj4+PiArCj4+PiArICAg ICBzcGluX2xvY2tfaXJxKCZ2cS0+aXJxX2xvY2spOwo+Pj4gKyAgICAgaWYgKHZxLT5yZWFkeSAm JiB2cS0+Y2IuY2FsbGJhY2spCj4+PiArICAgICAgICAgICAgIHZxLT5jYi5jYWxsYmFjayh2cS0+ Y2IucHJpdmF0ZSk7Cj4+PiArICAgICBzcGluX3VubG9ja19pcnEoJnZxLT5pcnFfbG9jayk7Cj4+ PiArfQo+Pj4gKwo+Pj4gK3N0YXRpYyBsb25nIHZkdXNlX2Rldl9pb2N0bChzdHJ1Y3QgZmlsZSAq ZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKPj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgdW5z aWduZWQgbG9uZyBhcmcpCj4+PiArewo+Pj4gKyAgICAgc3RydWN0IHZkdXNlX2RldiAqZGV2ID0g ZmlsZS0+cHJpdmF0ZV9kYXRhOwo+Pj4gKyAgICAgdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBf X3VzZXIgKilhcmc7Cj4+PiArICAgICBpbnQgcmV0Owo+Pj4gKwo+Pj4gKyAgICAgc3dpdGNoIChj bWQpIHsKPj4+ICsgICAgIGNhc2UgVkRVU0VfSU9UTEJfR0VUX0ZEOiB7Cj4+PiArICAgICAgICAg ICAgIHN0cnVjdCB2ZHVzZV9pb3RsYl9lbnRyeSBlbnRyeTsKPj4+ICsgICAgICAgICAgICAgc3Ry dWN0IHZob3N0X2lvdGxiX21hcCAqbWFwOwo+Pj4gKyAgICAgICAgICAgICBzdHJ1Y3QgdmRwYV9t YXBfZmlsZSAqbWFwX2ZpbGU7Cj4+PiArICAgICAgICAgICAgIHN0cnVjdCB2ZHVzZV9pb3ZhX2Rv bWFpbiAqZG9tYWluID0gZGV2LT5kb21haW47Cj4+PiArICAgICAgICAgICAgIHN0cnVjdCBmaWxl ICpmID0gTlVMTDsKPj4+ICsKPj4+ICsgICAgICAgICAgICAgcmV0ID0gLUVGQVVMVDsKPj4+ICsg ICAgICAgICAgICAgaWYgKGNvcHlfZnJvbV91c2VyKCZlbnRyeSwgYXJncCwgc2l6ZW9mKGVudHJ5 KSkpCj4+PiArICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Cj4+PiArCj4+PiArICAgICAgICAg ICAgIHJldCA9IC1FSU5WQUw7Cj4+PiArICAgICAgICAgICAgIGlmIChlbnRyeS5zdGFydCA+IGVu dHJ5Lmxhc3QpCj4+PiArICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Cj4+PiArCj4+PiArICAg ICAgICAgICAgIHNwaW5fbG9jaygmZG9tYWluLT5pb3RsYl9sb2NrKTsKPj4+ICsgICAgICAgICAg ICAgbWFwID0gdmhvc3RfaW90bGJfaXRyZWVfZmlyc3QoZG9tYWluLT5pb3RsYiwKPj4+ICsgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuc3RhcnQsIGVudHJ5 Lmxhc3QpOwo+Pj4gKyAgICAgICAgICAgICBpZiAobWFwKSB7Cj4+PiArICAgICAgICAgICAgICAg ICAgICAgbWFwX2ZpbGUgPSAoc3RydWN0IHZkcGFfbWFwX2ZpbGUgKiltYXAtPm9wYXF1ZTsKPj4+ ICsgICAgICAgICAgICAgICAgICAgICBmID0gZ2V0X2ZpbGUobWFwX2ZpbGUtPmZpbGUpOwo+Pj4g KyAgICAgICAgICAgICAgICAgICAgIGVudHJ5Lm9mZnNldCA9IG1hcF9maWxlLT5vZmZzZXQ7Cj4+ PiArICAgICAgICAgICAgICAgICAgICAgZW50cnkuc3RhcnQgPSBtYXAtPnN0YXJ0Owo+Pj4gKyAg ICAgICAgICAgICAgICAgICAgIGVudHJ5Lmxhc3QgPSBtYXAtPmxhc3Q7Cj4+PiArICAgICAgICAg ICAgICAgICAgICAgZW50cnkucGVybSA9IG1hcC0+cGVybTsKPj4+ICsgICAgICAgICAgICAgfQo+ Pj4gKyAgICAgICAgICAgICBzcGluX3VubG9jaygmZG9tYWluLT5pb3RsYl9sb2NrKTsKPj4+ICsg ICAgICAgICAgICAgcmV0ID0gLUVJTlZBTDsKPj4+ICsgICAgICAgICAgICAgaWYgKCFmKQo+Pj4g KyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwo+Pj4gKwo+Pj4gKyAgICAgICAgICAgICByZXQg PSAtRUZBVUxUOwo+Pj4gKyAgICAgICAgICAgICBpZiAoY29weV90b191c2VyKGFyZ3AsICZlbnRy eSwgc2l6ZW9mKGVudHJ5KSkpIHsKPj4+ICsgICAgICAgICAgICAgICAgICAgICBmcHV0KGYpOwo+ Pj4gKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwo+Pj4gKyAgICAgICAgICAgICB9Cj4+PiAr ICAgICAgICAgICAgIHJldCA9IHJlY2VpdmVfZmQoZiwgcGVybV90b19maWxlX2ZsYWdzKGVudHJ5 LnBlcm0pKTsKPj4+ICsgICAgICAgICAgICAgZnB1dChmKTsKPj4+ICsgICAgICAgICAgICAgYnJl YWs7Cj4+PiArICAgICB9Cj4+PiArICAgICBjYXNlIFZEVVNFX0RFVl9HRVRfRkVBVFVSRVM6Cj4+ PiArICAgICAgICAgICAgIHJldCA9IHB1dF91c2VyKGRldi0+ZmVhdHVyZXMsICh1NjQgX191c2Vy ICopYXJncCk7Cj4+PiArICAgICAgICAgICAgIGJyZWFrOwo+Pj4gKyAgICAgY2FzZSBWRFVTRV9E RVZfVVBEQVRFX0NPTkZJRzogewo+Pj4gKyAgICAgICAgICAgICBzdHJ1Y3QgdmR1c2VfY29uZmln X3VwZGF0ZSBjb25maWc7Cj4+PiArICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSA9IG9m ZnNldG9mKHN0cnVjdCB2ZHVzZV9jb25maWdfdXBkYXRlLAo+Pj4gKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIpOwo+Pj4gKwo+Pj4gKyAgICAgICAgICAg ICByZXQgPSAtRUZBVUxUOwo+Pj4gKyAgICAgICAgICAgICBpZiAoY29weV9mcm9tX3VzZXIoJmNv bmZpZywgYXJncCwgc2l6ZSkpCj4+PiArICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Cj4+PiAr Cj4+PiArICAgICAgICAgICAgIHJldCA9IC1FSU5WQUw7Cj4+PiArICAgICAgICAgICAgIGlmIChj b25maWcubGVuZ3RoID09IDAgfHwKPj4+ICsgICAgICAgICAgICAgICAgIGNvbmZpZy5sZW5ndGgg PiBkZXYtPmNvbmZpZ19zaXplIC0gY29uZmlnLm9mZnNldCkKPj4+ICsgICAgICAgICAgICAgICAg ICAgICBicmVhazsKPj4+ICsKPj4+ICsgICAgICAgICAgICAgcmV0ID0gLUVGQVVMVDsKPj4+ICsg ICAgICAgICAgICAgaWYgKGNvcHlfZnJvbV91c2VyKGRldi0+Y29uZmlnICsgY29uZmlnLm9mZnNl dCwgYXJncCArIHNpemUsCj4+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25m aWcubGVuZ3RoKSkKPj4+ICsgICAgICAgICAgICAgICAgICAgICBicmVhazsKPj4+ICsKPj4+ICsg ICAgICAgICAgICAgcmV0ID0gMDsKPj4+ICsgICAgICAgICAgICAgcXVldWVfd29yayh2ZHVzZV9p cnFfd3EsICZkZXYtPmluamVjdCk7Cj4+Cj4+IEkgd29uZGVyIGlmIGl0J3MgYmV0dGVyIHRvIHNl cGFyYXRlIGNvbmZpZyBpbnRlcnJ1cHQgb3V0IG9mIGNvbmZpZwo+PiB1cGRhdGUgb3Igd2UgbmVl ZCBkb2N1bWVudCB0aGlzLgo+Pgo+IEkgaGF2ZSBkb2N1bWVudGVkIGl0IGluIHRoZSBkb2NzLiBM b29rcyBsaWtlIGEgY29uZmlnIHVwZGF0ZSBzaG91bGQgYmUKPiBhbHdheXMgZm9sbG93ZWQgYnkg YSBjb25maWcgaW50ZXJydXB0LiBJIGRpZG4ndCBmaW5kIGEgY2FzZSB0aGF0IHVzZXMKPiB0aGVt IHNlcGFyYXRlbHkuCgoKVGhlIHVBUEkgZG9lc24ndCBwcmV2ZW50IHVzIGZyb20gdGhlIGZvbGxv d2luZyBzY2VuYXJpbzoKCnVwZGF0ZV9jb25maWcobWFjWzBdLCAuLik7CnVwZGF0ZV9jb25maWco bWF4WzFdLCAuLik7CgpTbyBpdCBsb29rcyB0byBtZSBpdCdzIGJldHRlciB0byBzZXBhcmF0ZSB0 aGUgY29uZmlnIGludGVycnVwdCBmcm9tIHRoZSAKY29uZmlnIHVwZGF0aW5nLgoKCj4KPj4+ICsg ICAgICAgICAgICAgYnJlYWs7Cj4+PiArICAgICB9Cj4+PiArICAgICBjYXNlIFZEVVNFX1ZRX0dF VF9JTkZPOiB7Cj4+Cj4+IERvIHdlIG5lZWQgdG8gbGltaXQgdGhpcyBvbmx5IHdoZW4gRFJJVkVS X09LIGlzIHNldD8KPj4KPiBBbnkgcmVhc29uIHRvIGFkZCB0aGlzIGxpbWl0YXRpb24/CgoKT3Ro ZXJ3aXNlIHRoZSB2cSBpcyBub3QgZnVsbHkgaW5pdGlhbGl6ZWQsIGUuZyB0aGUgZGVzY19hZGRy IG1pZ2h0IG5vdCAKYmUgY29ycmVjdC4KCgo+Cj4+PiArICAgICAgICAgICAgIHN0cnVjdCB2ZHVz ZV92cV9pbmZvIHZxX2luZm87Cj4+PiArICAgICAgICAgICAgIHUzMiB2cV9pbmRleDsKPj4+ICsK Pj4+ICsgICAgICAgICAgICAgcmV0ID0gLUVGQVVMVDsKPj4+ICsgICAgICAgICAgICAgaWYgKGNv cHlfZnJvbV91c2VyKCZ2cV9pbmZvLCBhcmdwLCBzaXplb2YodnFfaW5mbykpKQo+Pj4gKyAgICAg ICAgICAgICAgICAgICAgIGJyZWFrOwo+Pj4gKwo+Pj4gKyAgICAgICAgICAgICByZXQgPSAtRUlO VkFMOwo+Pj4gKyAgICAgICAgICAgICBpZiAodnFfaW5mby5pbmRleCA+PSBkZXYtPnZxX251bSkK Pj4+ICsgICAgICAgICAgICAgICAgICAgICBicmVhazsKPj4+ICsKPj4+ICsgICAgICAgICAgICAg dnFfaW5kZXggPSBhcnJheV9pbmRleF9ub3NwZWModnFfaW5mby5pbmRleCwgZGV2LT52cV9udW0p Owo+Pj4gKyAgICAgICAgICAgICB2cV9pbmZvLmRlc2NfYWRkciA9IGRldi0+dnFzW3ZxX2luZGV4 XS5kZXNjX2FkZHI7Cj4+PiArICAgICAgICAgICAgIHZxX2luZm8uZHJpdmVyX2FkZHIgPSBkZXYt PnZxc1t2cV9pbmRleF0uZHJpdmVyX2FkZHI7Cj4+PiArICAgICAgICAgICAgIHZxX2luZm8uZGV2 aWNlX2FkZHIgPSBkZXYtPnZxc1t2cV9pbmRleF0uZGV2aWNlX2FkZHI7Cj4+PiArICAgICAgICAg ICAgIHZxX2luZm8ubnVtID0gZGV2LT52cXNbdnFfaW5kZXhdLm51bTsKPj4+ICsgICAgICAgICAg ICAgdnFfaW5mby5hdmFpbF9pZHggPSBkZXYtPnZxc1t2cV9pbmRleF0uYXZhaWxfaWR4Owo+Pj4g KyAgICAgICAgICAgICB2cV9pbmZvLnJlYWR5ID0gZGV2LT52cXNbdnFfaW5kZXhdLnJlYWR5Owo+ Pj4gKwo+Pj4gKyAgICAgICAgICAgICByZXQgPSAtRUZBVUxUOwo+Pj4gKyAgICAgICAgICAgICBp ZiAoY29weV90b191c2VyKGFyZ3AsICZ2cV9pbmZvLCBzaXplb2YodnFfaW5mbykpKQo+Pj4gKyAg ICAgICAgICAgICAgICAgICAgIGJyZWFrOwo+Pj4gKwo+Pj4gKyAgICAgICAgICAgICByZXQgPSAw Owo+Pj4gKyAgICAgICAgICAgICBicmVhazsKPj4+ICsgICAgIH0KPj4+ICsgICAgIGNhc2UgVkRV U0VfVlFfU0VUVVBfS0lDS0ZEOiB7Cj4+PiArICAgICAgICAgICAgIHN0cnVjdCB2ZHVzZV92cV9l dmVudGZkIGV2ZW50ZmQ7Cj4+PiArCj4+PiArICAgICAgICAgICAgIHJldCA9IC1FRkFVTFQ7Cj4+ PiArICAgICAgICAgICAgIGlmIChjb3B5X2Zyb21fdXNlcigmZXZlbnRmZCwgYXJncCwgc2l6ZW9m KGV2ZW50ZmQpKSkKPj4+ICsgICAgICAgICAgICAgICAgICAgICBicmVhazsKPj4+ICsKPj4+ICsg ICAgICAgICAgICAgcmV0ID0gdmR1c2Vfa2lja2ZkX3NldHVwKGRldiwgJmV2ZW50ZmQpOwo+Pj4g KyAgICAgICAgICAgICBicmVhazsKPj4+ICsgICAgIH0KPj4+ICsgICAgIGNhc2UgVkRVU0VfVlFf SU5KRUNUX0lSUTogewo+Pj4gKyAgICAgICAgICAgICB1MzIgdnFfaW5kZXg7Cj4+PiArCj4+PiAr ICAgICAgICAgICAgIHJldCA9IC1FRkFVTFQ7Cj4+PiArICAgICAgICAgICAgIGlmIChnZXRfdXNl cih2cV9pbmRleCwgKHUzMiBfX3VzZXIgKilhcmdwKSkKPj4+ICsgICAgICAgICAgICAgICAgICAg ICBicmVhazsKPj4+ICsKPj4+ICsgICAgICAgICAgICAgcmV0ID0gLUVJTlZBTDsKPj4+ICsgICAg ICAgICAgICAgaWYgKHZxX2luZGV4ID49IGRldi0+dnFfbnVtKQo+Pj4gKyAgICAgICAgICAgICAg ICAgICAgIGJyZWFrOwo+Pj4gKwo+Pj4gKyAgICAgICAgICAgICByZXQgPSAwOwo+Pj4gKyAgICAg ICAgICAgICB2cV9pbmRleCA9IGFycmF5X2luZGV4X25vc3BlYyh2cV9pbmRleCwgZGV2LT52cV9u dW0pOwo+Pj4gKyAgICAgICAgICAgICBxdWV1ZV93b3JrKHZkdXNlX2lycV93cSwgJmRldi0+dnFz W3ZxX2luZGV4XS5pbmplY3QpOwo+Pj4gKyAgICAgICAgICAgICBicmVhazsKPj4+ICsgICAgIH0K Pj4+ICsgICAgIGRlZmF1bHQ6Cj4+PiArICAgICAgICAgICAgIHJldCA9IC1FTk9JT0NUTENNRDsK Pj4+ICsgICAgICAgICAgICAgYnJlYWs7Cj4+PiArICAgICB9Cj4+PiArCj4+PiArICAgICByZXR1 cm4gcmV0Owo+Pj4gK30KPj4+ICsKPj4+ICtzdGF0aWMgaW50IHZkdXNlX2Rldl9yZWxlYXNlKHN0 cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQo+Pj4gK3sKPj4+ICsgICAgIHN0 cnVjdCB2ZHVzZV9kZXYgKmRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKPj4+ICsKPj4+ICsgICAg IHNwaW5fbG9jaygmZGV2LT5tc2dfbG9jayk7Cj4+PiArICAgICAvKiBNYWtlIHN1cmUgdGhlIGlu ZmxpZ2h0IG1lc3NhZ2VzIGNhbiBwcm9jZXNzZWQgYWZ0ZXIgcmVjb25uY2VjdGlvbiAqLwo+Pj4g KyAgICAgbGlzdF9zcGxpY2VfaW5pdCgmZGV2LT5yZWN2X2xpc3QsICZkZXYtPnNlbmRfbGlzdCk7 Cj4+PiArICAgICBzcGluX3VubG9jaygmZGV2LT5tc2dfbG9jayk7Cj4+PiArICAgICBkZXYtPmNv bm5lY3RlZCA9IGZhbHNlOwo+Pj4gKwo+Pj4gKyAgICAgcmV0dXJuIDA7Cj4+PiArfQo+Pj4gKwo+ Pj4gK3N0YXRpYyBzdHJ1Y3QgdmR1c2VfZGV2ICp2ZHVzZV9kZXZfZ2V0X2Zyb21fbWlub3IoaW50 IG1pbm9yKQo+Pj4gK3sKPj4+ICsgICAgIHN0cnVjdCB2ZHVzZV9kZXYgKmRldjsKPj4+ICsKPj4+ ICsgICAgIG11dGV4X2xvY2soJnZkdXNlX2xvY2spOwo+Pj4gKyAgICAgZGV2ID0gaWRyX2ZpbmQo JnZkdXNlX2lkciwgbWlub3IpOwo+Pj4gKyAgICAgbXV0ZXhfdW5sb2NrKCZ2ZHVzZV9sb2NrKTsK Pj4+ICsKPj4+ICsgICAgIHJldHVybiBkZXY7Cj4+PiArfQo+Pj4gKwo+Pj4gK3N0YXRpYyBpbnQg dmR1c2VfZGV2X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCj4+ PiArewo+Pj4gKyAgICAgaW50IHJldDsKPj4+ICsgICAgIHN0cnVjdCB2ZHVzZV9kZXYgKmRldiA9 IHZkdXNlX2Rldl9nZXRfZnJvbV9taW5vcihpbWlub3IoaW5vZGUpKTsKPj4+ICsKPj4+ICsgICAg IGlmICghZGV2KQo+Pj4gKyAgICAgICAgICAgICByZXR1cm4gLUVOT0RFVjsKPj4+ICsKPj4+ICsg ICAgIHJldCA9IC1FQlVTWTsKPj4+ICsgICAgIG11dGV4X2xvY2soJmRldi0+bG9jayk7Cj4+PiAr ICAgICBpZiAoZGV2LT5jb25uZWN0ZWQpCj4+PiArICAgICAgICAgICAgIGdvdG8gdW5sb2NrOwo+ Pj4gKwo+Pj4gKyAgICAgcmV0ID0gMDsKPj4+ICsgICAgIGRldi0+Y29ubmVjdGVkID0gdHJ1ZTsK Pj4+ICsgICAgIGZpbGUtPnByaXZhdGVfZGF0YSA9IGRldjsKPj4+ICt1bmxvY2s6Cj4+PiArICAg ICBtdXRleF91bmxvY2soJmRldi0+bG9jayk7Cj4+PiArCj4+PiArICAgICByZXR1cm4gcmV0Owo+ Pj4gK30KPj4+ICsKPj4+ICtzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB2ZHVz ZV9kZXZfZm9wcyA9IHsKPj4+ICsgICAgIC5vd25lciAgICAgICAgICA9IFRISVNfTU9EVUxFLAo+ Pj4gKyAgICAgLm9wZW4gICAgICAgICAgID0gdmR1c2VfZGV2X29wZW4sCj4+PiArICAgICAucmVs ZWFzZSAgICAgICAgPSB2ZHVzZV9kZXZfcmVsZWFzZSwKPj4+ICsgICAgIC5yZWFkX2l0ZXIgICAg ICA9IHZkdXNlX2Rldl9yZWFkX2l0ZXIsCj4+PiArICAgICAud3JpdGVfaXRlciAgICAgPSB2ZHVz ZV9kZXZfd3JpdGVfaXRlciwKPj4+ICsgICAgIC5wb2xsICAgICAgICAgICA9IHZkdXNlX2Rldl9w b2xsLAo+Pj4gKyAgICAgLnVubG9ja2VkX2lvY3RsID0gdmR1c2VfZGV2X2lvY3RsLAo+Pj4gKyAg ICAgLmNvbXBhdF9pb2N0bCAgID0gY29tcGF0X3B0cl9pb2N0bCwKPj4+ICsgICAgIC5sbHNlZWsg ICAgICAgICA9IG5vb3BfbGxzZWVrLAo+Pj4gK307Cj4+PiArCj4+PiArc3RhdGljIHN0cnVjdCB2 ZHVzZV9kZXYgKnZkdXNlX2Rldl9jcmVhdGUodm9pZCkKPj4+ICt7Cj4+PiArICAgICBzdHJ1Y3Qg dmR1c2VfZGV2ICpkZXYgPSBremFsbG9jKHNpemVvZigqZGV2KSwgR0ZQX0tFUk5FTCk7Cj4+PiAr Cj4+PiArICAgICBpZiAoIWRldikKPj4+ICsgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Cj4+PiAr Cj4+PiArICAgICBtdXRleF9pbml0KCZkZXYtPmxvY2spOwo+Pj4gKyAgICAgc3Bpbl9sb2NrX2lu aXQoJmRldi0+bXNnX2xvY2spOwo+Pj4gKyAgICAgSU5JVF9MSVNUX0hFQUQoJmRldi0+c2VuZF9s aXN0KTsKPj4+ICsgICAgIElOSVRfTElTVF9IRUFEKCZkZXYtPnJlY3ZfbGlzdCk7Cj4+PiArICAg ICBzcGluX2xvY2tfaW5pdCgmZGV2LT5pcnFfbG9jayk7Cj4+PiArCj4+PiArICAgICBJTklUX1dP UksoJmRldi0+aW5qZWN0LCB2ZHVzZV9kZXZfaXJxX2luamVjdCk7Cj4+PiArICAgICBpbml0X3dh aXRxdWV1ZV9oZWFkKCZkZXYtPndhaXRxKTsKPj4+ICsKPj4+ICsgICAgIHJldHVybiBkZXY7Cj4+ PiArfQo+Pj4gKwo+Pj4gK3N0YXRpYyB2b2lkIHZkdXNlX2Rldl9kZXN0cm95KHN0cnVjdCB2ZHVz ZV9kZXYgKmRldikKPj4+ICt7Cj4+PiArICAgICBrZnJlZShkZXYpOwo+Pj4gK30KPj4+ICsKPj4+ ICtzdGF0aWMgc3RydWN0IHZkdXNlX2RldiAqdmR1c2VfZmluZF9kZXYoY29uc3QgY2hhciAqbmFt ZSkKPj4+ICt7Cj4+PiArICAgICBzdHJ1Y3QgdmR1c2VfZGV2ICpkZXY7Cj4+PiArICAgICBpbnQg aWQ7Cj4+PiArCj4+PiArICAgICBpZHJfZm9yX2VhY2hfZW50cnkoJnZkdXNlX2lkciwgZGV2LCBp ZCkKPj4+ICsgICAgICAgICAgICAgaWYgKCFzdHJjbXAoZGV2LT5uYW1lLCBuYW1lKSkKPj4+ICsg ICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGV2Owo+Pj4gKwo+Pj4gKyAgICAgcmV0dXJuIE5V TEw7Cj4+PiArfQo+Pj4gKwo+Pj4gK3N0YXRpYyBpbnQgdmR1c2VfZGVzdHJveV9kZXYoY2hhciAq bmFtZSkKPj4+ICt7Cj4+PiArICAgICBzdHJ1Y3QgdmR1c2VfZGV2ICpkZXYgPSB2ZHVzZV9maW5k X2RldihuYW1lKTsKPj4+ICsKPj4+ICsgICAgIGlmICghZGV2KQo+Pj4gKyAgICAgICAgICAgICBy ZXR1cm4gLUVJTlZBTDsKPj4+ICsKPj4+ICsgICAgIG11dGV4X2xvY2soJmRldi0+bG9jayk7Cj4+ PiArICAgICBpZiAoZGV2LT52ZGV2IHx8IGRldi0+Y29ubmVjdGVkKSB7Cj4+PiArICAgICAgICAg ICAgIG11dGV4X3VubG9jaygmZGV2LT5sb2NrKTsKPj4+ICsgICAgICAgICAgICAgcmV0dXJuIC1F QlVTWTsKPj4+ICsgICAgIH0KPj4+ICsgICAgIGRldi0+Y29ubmVjdGVkID0gdHJ1ZTsKPj4+ICsg ICAgIG11dGV4X3VubG9jaygmZGV2LT5sb2NrKTsKPj4+ICsKPj4+ICsgICAgIHZkdXNlX2Rldl9t c2dfY2xlYW51cChkZXYpOwo+Pj4gKyAgICAgZGV2aWNlX2Rlc3Ryb3kodmR1c2VfY2xhc3MsIE1L REVWKE1BSk9SKHZkdXNlX21ham9yKSwgZGV2LT5taW5vcikpOwo+Pj4gKyAgICAgaWRyX3JlbW92 ZSgmdmR1c2VfaWRyLCBkZXYtPm1pbm9yKTsKPj4+ICsgICAgIGt2ZnJlZShkZXYtPmNvbmZpZyk7 Cj4+PiArICAgICBrZnJlZShkZXYtPnZxcyk7Cj4+PiArICAgICB2ZHVzZV9kb21haW5fZGVzdHJv eShkZXYtPmRvbWFpbik7Cj4+PiArICAgICBrZnJlZShkZXYtPm5hbWUpOwo+Pj4gKyAgICAgdmR1 c2VfZGV2X2Rlc3Ryb3koZGV2KTsKPj4+ICsgICAgIG1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOwo+ Pj4gKwo+Pj4gKyAgICAgcmV0dXJuIDA7Cj4+PiArfQo+Pj4gKwo+Pj4gK3N0YXRpYyBib29sIGRl dmljZV9pc19hbGxvd2VkKHUzMiBkZXZpY2VfaWQpCj4+PiArewo+Pj4gKyAgICAgaW50IGk7Cj4+ PiArCj4+PiArICAgICBmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhbGxvd2VkX2RldmljZV9p ZCk7IGkrKykKPj4+ICsgICAgICAgICAgICAgaWYgKGFsbG93ZWRfZGV2aWNlX2lkW2ldID09IGRl dmljZV9pZCkKPj4+ICsgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKPj4+ICsKPj4+ ICsgICAgIHJldHVybiBmYWxzZTsKPj4+ICt9Cj4+PiArCj4+PiArc3RhdGljIGJvb2wgZmVhdHVy ZXNfaXNfdmFsaWQodTY0IGZlYXR1cmVzKQo+Pj4gK3sKPj4+ICsgICAgIGlmICghKGZlYXR1cmVz ICYgKDFVTEwgPDwgVklSVElPX0ZfQUNDRVNTX1BMQVRGT1JNKSkpCj4+PiArICAgICAgICAgICAg IHJldHVybiBmYWxzZTsKPj4+ICsKPj4+ICsgICAgIC8qIE5vdyB3ZSBvbmx5IHN1cHBvcnQgcmVh ZC1vbmx5IGNvbmZpZ3VyYXRpb24gc3BhY2UgKi8KPj4+ICsgICAgIGlmIChmZWF0dXJlcyAmICgx VUxMIDw8IFZJUlRJT19CTEtfRl9DT05GSUdfV0NFKSkKPj4+ICsgICAgICAgICAgICAgcmV0dXJu IGZhbHNlOwo+Pj4gKwo+Pj4gKyAgICAgcmV0dXJuIHRydWU7Cj4+PiArfQo+Pj4gKwo+Pj4gK3N0 YXRpYyBib29sIHZkdXNlX3ZhbGlkYXRlX2NvbmZpZyhzdHJ1Y3QgdmR1c2VfZGV2X2NvbmZpZyAq Y29uZmlnKQo+Pj4gK3sKPj4+ICsgICAgIGlmIChjb25maWctPmJvdW5jZV9zaXplID4gVkRVU0Vf TUFYX0JPVU5DRV9TSVpFKQo+Pj4gKyAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Cj4+PiArCj4+ PiArICAgICBpZiAoY29uZmlnLT52cV9hbGlnbiA+IFBBR0VfU0laRSkKPj4+ICsgICAgICAgICAg ICAgcmV0dXJuIGZhbHNlOwo+Pj4gKwo+Pj4gKyAgICAgaWYgKGNvbmZpZy0+Y29uZmlnX3NpemUg PiBQQUdFX1NJWkUpCj4+PiArICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKPj4+ICsKPj4+ICsg ICAgIGlmICghZGV2aWNlX2lzX2FsbG93ZWQoY29uZmlnLT5kZXZpY2VfaWQpKQo+Pj4gKyAgICAg ICAgICAgICByZXR1cm4gZmFsc2U7Cj4+PiArCj4+PiArICAgICBpZiAoIWZlYXR1cmVzX2lzX3Zh bGlkKGNvbmZpZy0+ZmVhdHVyZXMpKQo+Pj4gKyAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Cj4+ Cj4+IERvIHdlIG5lZWQgdG8gdmFsaWRhdGUgd2hldGhlciBvciBub3QgY29uZmlnX3NpemUgaXMg dG9vIHNtYWxsIG90aGVyd2lzZQo+PiB3ZSBtYXkgaGF2ZSBPT0IgYWNjZXNzIGluIGdldF9jb25m aWcoKT8KPj4KPiBIb3cgYWJvdXQgYWRkaW5nIHZhbGlkYXRpb24gaW4gZ2V0X2NvbmZpZygpPyBJ dCBzZWVtcyB0byBiZSBoYXJkIHRvCj4gZGVmaW5lIHRoZSBsb3dlciBib3VuZC4KCgpJdCBzaG91 bGQgd29yay4KClRoYW5rcwoKCj4KPj4+ICsKPj4+ICsgICAgIHJldHVybiB0cnVlOwo+Pj4gK30K Pj4+ICsKPj4+ICtzdGF0aWMgaW50IHZkdXNlX2NyZWF0ZV9kZXYoc3RydWN0IHZkdXNlX2Rldl9j b25maWcgKmNvbmZpZywKPj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY29uZmln X2J1ZiwgdTY0IGFwaV92ZXJzaW9uKQo+Pj4gK3sKPj4+ICsgICAgIGludCBpLCByZXQ7Cj4+PiAr ICAgICBzdHJ1Y3QgdmR1c2VfZGV2ICpkZXY7Cj4+PiArCj4+PiArICAgICByZXQgPSAtRUVYSVNU Owo+Pj4gKyAgICAgaWYgKHZkdXNlX2ZpbmRfZGV2KGNvbmZpZy0+bmFtZSkpCj4+PiArICAgICAg ICAgICAgIGdvdG8gZXJyOwo+Pj4gKwo+Pj4gKyAgICAgcmV0ID0gLUVOT01FTTsKPj4+ICsgICAg IGRldiA9IHZkdXNlX2Rldl9jcmVhdGUoKTsKPj4+ICsgICAgIGlmICghZGV2KQo+Pj4gKyAgICAg ICAgICAgICBnb3RvIGVycjsKPj4+ICsKPj4+ICsgICAgIGRldi0+YXBpX3ZlcnNpb24gPSBhcGlf dmVyc2lvbjsKPj4+ICsgICAgIGRldi0+dXNlcl9mZWF0dXJlcyA9IGNvbmZpZy0+ZmVhdHVyZXM7 Cj4+PiArICAgICBkZXYtPmRldmljZV9pZCA9IGNvbmZpZy0+ZGV2aWNlX2lkOwo+Pj4gKyAgICAg ZGV2LT52ZW5kb3JfaWQgPSBjb25maWctPnZlbmRvcl9pZDsKPj4+ICsgICAgIGRldi0+bmFtZSA9 IGtzdHJkdXAoY29uZmlnLT5uYW1lLCBHRlBfS0VSTkVMKTsKPj4+ICsgICAgIGlmICghZGV2LT5u YW1lKQo+Pj4gKyAgICAgICAgICAgICBnb3RvIGVycl9zdHI7Cj4+PiArCj4+PiArICAgICBkZXYt PmRvbWFpbiA9IHZkdXNlX2RvbWFpbl9jcmVhdGUoVkRVU0VfSU9WQV9TSVpFIC0gMSwKPj4+ICsg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPmJvdW5jZV9zaXpl KTsKPj4+ICsgICAgIGlmICghZGV2LT5kb21haW4pCj4+PiArICAgICAgICAgICAgIGdvdG8gZXJy X2RvbWFpbjsKPj4+ICsKPj4+ICsgICAgIGRldi0+Y29uZmlnID0gY29uZmlnX2J1ZjsKPj4+ICsg ICAgIGRldi0+Y29uZmlnX3NpemUgPSBjb25maWctPmNvbmZpZ19zaXplOwo+Pj4gKyAgICAgZGV2 LT52cV9hbGlnbiA9IGNvbmZpZy0+dnFfYWxpZ247Cj4+PiArICAgICBkZXYtPnZxX3NpemVfbWF4 ID0gY29uZmlnLT52cV9zaXplX21heDsKPj4+ICsgICAgIGRldi0+dnFfbnVtID0gY29uZmlnLT52 cV9udW07Cj4+PiArICAgICBkZXYtPnZxcyA9IGtjYWxsb2MoZGV2LT52cV9udW0sIHNpemVvZigq ZGV2LT52cXMpLCBHRlBfS0VSTkVMKTsKPj4+ICsgICAgIGlmICghZGV2LT52cXMpCj4+PiArICAg ICAgICAgICAgIGdvdG8gZXJyX3ZxczsKPj4+ICsKPj4+ICsgICAgIGZvciAoaSA9IDA7IGkgPCBk ZXYtPnZxX251bTsgaSsrKSB7Cj4+PiArICAgICAgICAgICAgIGRldi0+dnFzW2ldLmluZGV4ID0g aTsKPj4+ICsgICAgICAgICAgICAgSU5JVF9XT1JLKCZkZXYtPnZxc1tpXS5pbmplY3QsIHZkdXNl X3ZxX2lycV9pbmplY3QpOwo+Pj4gKyAgICAgICAgICAgICBzcGluX2xvY2tfaW5pdCgmZGV2LT52 cXNbaV0ua2lja19sb2NrKTsKPj4+ICsgICAgICAgICAgICAgc3Bpbl9sb2NrX2luaXQoJmRldi0+ dnFzW2ldLmlycV9sb2NrKTsKPj4+ICsgICAgIH0KPj4+ICsKPj4+ICsgICAgIHJldCA9IGlkcl9h bGxvYygmdmR1c2VfaWRyLCBkZXYsIDEsIFZEVVNFX0RFVl9NQVgsIEdGUF9LRVJORUwpOwo+Pj4g KyAgICAgaWYgKHJldCA8IDApCj4+PiArICAgICAgICAgICAgIGdvdG8gZXJyX2lkcjsKPj4+ICsK Pj4+ICsgICAgIGRldi0+bWlub3IgPSByZXQ7Cj4+PiArICAgICBkZXYtPmRldiA9IGRldmljZV9j cmVhdGUodmR1c2VfY2xhc3MsIE5VTEwsCj4+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgTUtERVYoTUFKT1IodmR1c2VfbWFqb3IpLCBkZXYtPm1pbm9yKSwKPj4+ICsgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBOVUxMLCAiJXMiLCBjb25maWctPm5hbWUpOwo+Pj4gKyAgICAg aWYgKElTX0VSUihkZXYtPmRldikpIHsKPj4+ICsgICAgICAgICAgICAgcmV0ID0gUFRSX0VSUihk ZXYtPmRldik7Cj4+PiArICAgICAgICAgICAgIGdvdG8gZXJyX2RldjsKPj4+ICsgICAgIH0KPj4+ ICsgICAgIF9fbW9kdWxlX2dldChUSElTX01PRFVMRSk7Cj4+PiArCj4+PiArICAgICByZXR1cm4g MDsKPj4+ICtlcnJfZGV2Ogo+Pj4gKyAgICAgaWRyX3JlbW92ZSgmdmR1c2VfaWRyLCBkZXYtPm1p bm9yKTsKPj4+ICtlcnJfaWRyOgo+Pj4gKyAgICAga2ZyZWUoZGV2LT52cXMpOwo+Pj4gK2Vycl92 cXM6Cj4+PiArICAgICB2ZHVzZV9kb21haW5fZGVzdHJveShkZXYtPmRvbWFpbik7Cj4+PiArZXJy X2RvbWFpbjoKPj4+ICsgICAgIGtmcmVlKGRldi0+bmFtZSk7Cj4+PiArZXJyX3N0cjoKPj4+ICsg ICAgIHZkdXNlX2Rldl9kZXN0cm95KGRldik7Cj4+PiArZXJyOgo+Pj4gKyAgICAga3ZmcmVlKGNv bmZpZ19idWYpOwo+Pj4gKyAgICAgcmV0dXJuIHJldDsKPj4+ICt9Cj4+PiArCj4+PiArc3RhdGlj IGxvbmcgdmR1c2VfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCj4+ PiArICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBhcmcpCj4+PiArewo+Pj4gKyAg ICAgaW50IHJldDsKPj4+ICsgICAgIHZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICop YXJnOwo+Pj4gKyAgICAgc3RydWN0IHZkdXNlX2NvbnRyb2wgKmNvbnRyb2wgPSBmaWxlLT5wcml2 YXRlX2RhdGE7Cj4+PiArCj4+PiArICAgICBtdXRleF9sb2NrKCZ2ZHVzZV9sb2NrKTsKPj4+ICsg ICAgIHN3aXRjaCAoY21kKSB7Cj4+PiArICAgICBjYXNlIFZEVVNFX0dFVF9BUElfVkVSU0lPTjoK Pj4+ICsgICAgICAgICAgICAgcmV0ID0gcHV0X3VzZXIoY29udHJvbC0+YXBpX3ZlcnNpb24sICh1 NjQgX191c2VyICopYXJncCk7Cj4+PiArICAgICAgICAgICAgIGJyZWFrOwo+Pj4gKyAgICAgY2Fz ZSBWRFVTRV9TRVRfQVBJX1ZFUlNJT046IHsKPj4+ICsgICAgICAgICAgICAgdTY0IGFwaV92ZXJz aW9uOwo+Pj4gKwo+Pj4gKyAgICAgICAgICAgICByZXQgPSAtRUZBVUxUOwo+Pj4gKyAgICAgICAg ICAgICBpZiAoZ2V0X3VzZXIoYXBpX3ZlcnNpb24sICh1NjQgX191c2VyICopYXJncCkpCj4+PiAr ICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Cj4+PiArCj4+PiArICAgICAgICAgICAgIHJldCA9 IC1FSU5WQUw7Cj4+PiArICAgICAgICAgICAgIGlmIChhcGlfdmVyc2lvbiA+IFZEVVNFX0FQSV9W RVJTSU9OKQo+Pj4gKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwo+Pj4gKwo+Pj4gKyAgICAg ICAgICAgICByZXQgPSAwOwo+Pj4gKyAgICAgICAgICAgICBjb250cm9sLT5hcGlfdmVyc2lvbiA9 IGFwaV92ZXJzaW9uOwo+Pj4gKyAgICAgICAgICAgICBicmVhazsKPj4+ICsgICAgIH0KPj4+ICsg ICAgIGNhc2UgVkRVU0VfQ1JFQVRFX0RFVjogewo+Pj4gKyAgICAgICAgICAgICBzdHJ1Y3QgdmR1 c2VfZGV2X2NvbmZpZyBjb25maWc7Cj4+PiArICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgc2l6 ZSA9IG9mZnNldG9mKHN0cnVjdCB2ZHVzZV9kZXZfY29uZmlnLCBjb25maWcpOwo+Pj4gKyAgICAg ICAgICAgICB2b2lkICpidWY7Cj4+PiArCj4+PiArICAgICAgICAgICAgIHJldCA9IC1FRkFVTFQ7 Cj4+PiArICAgICAgICAgICAgIGlmIChjb3B5X2Zyb21fdXNlcigmY29uZmlnLCBhcmdwLCBzaXpl KSkKPj4+ICsgICAgICAgICAgICAgICAgICAgICBicmVhazsKPj4+ICsKPj4+ICsgICAgICAgICAg ICAgcmV0ID0gLUVJTlZBTDsKPj4+ICsgICAgICAgICAgICAgaWYgKHZkdXNlX3ZhbGlkYXRlX2Nv bmZpZygmY29uZmlnKSA9PSBmYWxzZSkKPj4+ICsgICAgICAgICAgICAgICAgICAgICBicmVhazsK Pj4+ICsKPj4+ICsgICAgICAgICAgICAgYnVmID0gdm1lbWR1cF91c2VyKGFyZ3AgKyBzaXplLCBj b25maWcuY29uZmlnX3NpemUpOwo+Pj4gKyAgICAgICAgICAgICBpZiAoSVNfRVJSKGJ1ZikpIHsK Pj4+ICsgICAgICAgICAgICAgICAgICAgICByZXQgPSBQVFJfRVJSKGJ1Zik7Cj4+PiArICAgICAg ICAgICAgICAgICAgICAgYnJlYWs7Cj4+PiArICAgICAgICAgICAgIH0KPj4+ICsgICAgICAgICAg ICAgcmV0ID0gdmR1c2VfY3JlYXRlX2RldigmY29uZmlnLCBidWYsIGNvbnRyb2wtPmFwaV92ZXJz aW9uKTsKPj4+ICsgICAgICAgICAgICAgYnJlYWs7Cj4+PiArICAgICB9Cj4+PiArICAgICBjYXNl IFZEVVNFX0RFU1RST1lfREVWOiB7Cj4+PiArICAgICAgICAgICAgIGNoYXIgbmFtZVtWRFVTRV9O QU1FX01BWF07Cj4+PiArCj4+PiArICAgICAgICAgICAgIHJldCA9IC1FRkFVTFQ7Cj4+PiArICAg ICAgICAgICAgIGlmIChjb3B5X2Zyb21fdXNlcihuYW1lLCBhcmdwLCBWRFVTRV9OQU1FX01BWCkp Cj4+PiArICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Cj4+PiArCj4+PiArICAgICAgICAgICAg IHJldCA9IHZkdXNlX2Rlc3Ryb3lfZGV2KG5hbWUpOwo+Pj4gKyAgICAgICAgICAgICBicmVhazsK Pj4+ICsgICAgIH0KPj4+ICsgICAgIGRlZmF1bHQ6Cj4+PiArICAgICAgICAgICAgIHJldCA9IC1F SU5WQUw7Cj4+PiArICAgICAgICAgICAgIGJyZWFrOwo+Pj4gKyAgICAgfQo+Pj4gKyAgICAgbXV0 ZXhfdW5sb2NrKCZ2ZHVzZV9sb2NrKTsKPj4+ICsKPj4+ICsgICAgIHJldHVybiByZXQ7Cj4+PiAr fQo+Pj4gKwo+Pj4gK3N0YXRpYyBpbnQgdmR1c2VfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2Rl LCBzdHJ1Y3QgZmlsZSAqZmlsZSkKPj4+ICt7Cj4+PiArICAgICBzdHJ1Y3QgdmR1c2VfY29udHJv bCAqY29udHJvbCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKPj4+ICsKPj4+ICsgICAgIGtmcmVlKGNv bnRyb2wpOwo+Pj4gKyAgICAgcmV0dXJuIDA7Cj4+PiArfQo+Pj4gKwo+Pj4gK3N0YXRpYyBpbnQg dmR1c2Vfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKPj4+ICt7 Cj4+PiArICAgICBzdHJ1Y3QgdmR1c2VfY29udHJvbCAqY29udHJvbDsKPj4+ICsKPj4+ICsgICAg IGNvbnRyb2wgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdmR1c2VfY29udHJvbCksIEdGUF9LRVJO RUwpOwo+Pj4gKyAgICAgaWYgKCFjb250cm9sKQo+Pj4gKyAgICAgICAgICAgICByZXR1cm4gLUVO T01FTTsKPj4+ICsKPj4+ICsgICAgIGNvbnRyb2wtPmFwaV92ZXJzaW9uID0gVkRVU0VfQVBJX1ZF UlNJT047Cj4+PiArICAgICBmaWxlLT5wcml2YXRlX2RhdGEgPSBjb250cm9sOwo+Pj4gKwo+Pj4g KyAgICAgcmV0dXJuIDA7Cj4+PiArfQo+Pj4gKwo+Pj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmls ZV9vcGVyYXRpb25zIHZkdXNlX2N0cmxfZm9wcyA9IHsKPj4+ICsgICAgIC5vd25lciAgICAgICAg ICA9IFRISVNfTU9EVUxFLAo+Pj4gKyAgICAgLm9wZW4gICAgICAgICAgID0gdmR1c2Vfb3BlbiwK Pj4+ICsgICAgIC5yZWxlYXNlICAgICAgICA9IHZkdXNlX3JlbGVhc2UsCj4+PiArICAgICAudW5s b2NrZWRfaW9jdGwgPSB2ZHVzZV9pb2N0bCwKPj4+ICsgICAgIC5jb21wYXRfaW9jdGwgICA9IGNv bXBhdF9wdHJfaW9jdGwsCj4+PiArICAgICAubGxzZWVrICAgICAgICAgPSBub29wX2xsc2VlaywK Pj4+ICt9Owo+Pj4gKwo+Pj4gK3N0YXRpYyBjaGFyICp2ZHVzZV9kZXZub2RlKHN0cnVjdCBkZXZp Y2UgKmRldiwgdW1vZGVfdCAqbW9kZSkKPj4+ICt7Cj4+PiArICAgICByZXR1cm4ga2FzcHJpbnRm KEdGUF9LRVJORUwsICJ2ZHVzZS8lcyIsIGRldl9uYW1lKGRldikpOwo+Pj4gK30KPj4+ICsKPj4+ ICtzdGF0aWMgdm9pZCB2ZHVzZV9tZ210ZGV2X3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQo+ Pj4gK3sKPj4+ICt9Cj4+PiArCj4+PiArc3RhdGljIHN0cnVjdCBkZXZpY2UgdmR1c2VfbWdtdGRl diA9IHsKPj4+ICsgICAgIC5pbml0X25hbWUgPSAidmR1c2UiLAo+Pj4gKyAgICAgLnJlbGVhc2Ug PSB2ZHVzZV9tZ210ZGV2X3JlbGVhc2UsCj4+PiArfTsKPj4+ICsKPj4+ICtzdGF0aWMgc3RydWN0 IHZkcGFfbWdtdF9kZXYgbWdtdF9kZXY7Cj4+PiArCj4+PiArc3RhdGljIGludCB2ZHVzZV9kZXZf aW5pdF92ZHBhKHN0cnVjdCB2ZHVzZV9kZXYgKmRldiwgY29uc3QgY2hhciAqbmFtZSkKPj4+ICt7 Cj4+PiArICAgICBzdHJ1Y3QgdmR1c2VfdmRwYSAqdmRldjsKPj4+ICsgICAgIGludCByZXQ7Cj4+ PiArCj4+PiArICAgICBpZiAoZGV2LT52ZGV2KQo+Pj4gKyAgICAgICAgICAgICByZXR1cm4gLUVF WElTVDsKPj4+ICsKPj4+ICsgICAgIHZkZXYgPSB2ZHBhX2FsbG9jX2RldmljZShzdHJ1Y3QgdmR1 c2VfdmRwYSwgdmRwYSwgZGV2LT5kZXYsCj4+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgJnZkdXNlX3ZkcGFfY29uZmlnX29wcywgbmFtZSwgdHJ1ZSk7Cj4+PiArICAgICBpZiAoIXZk ZXYpCj4+PiArICAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOwo+Pj4gKwo+Pj4gKyAgICAgZGV2 LT52ZGV2ID0gdmRldjsKPj4+ICsgICAgIHZkZXYtPmRldiA9IGRldjsKPj4+ICsgICAgIHZkZXYt PnZkcGEuZGV2LmRtYV9tYXNrID0gJnZkZXYtPnZkcGEuZGV2LmNvaGVyZW50X2RtYV9tYXNrOwo+ Pj4gKyAgICAgcmV0ID0gZG1hX3NldF9tYXNrX2FuZF9jb2hlcmVudCgmdmRldi0+dmRwYS5kZXYs IERNQV9CSVRfTUFTSyg2NCkpOwo+Pj4gKyAgICAgaWYgKHJldCkgewo+Pj4gKyAgICAgICAgICAg ICBwdXRfZGV2aWNlKCZ2ZGV2LT52ZHBhLmRldik7Cj4+PiArICAgICAgICAgICAgIHJldHVybiBy ZXQ7Cj4+PiArICAgICB9Cj4+PiArICAgICBzZXRfZG1hX29wcygmdmRldi0+dmRwYS5kZXYsICZ2 ZHVzZV9kZXZfZG1hX29wcyk7Cj4+PiArICAgICB2ZGV2LT52ZHBhLmRtYV9kZXYgPSAmdmRldi0+ dmRwYS5kZXY7Cj4+PiArICAgICB2ZGV2LT52ZHBhLm1kZXYgPSAmbWdtdF9kZXY7Cj4+PiArCj4+ PiArICAgICByZXR1cm4gMDsKPj4+ICt9Cj4+PiArCj4+PiArc3RhdGljIGludCB2ZHBhX2Rldl9h ZGQoc3RydWN0IHZkcGFfbWdtdF9kZXYgKm1kZXYsIGNvbnN0IGNoYXIgKm5hbWUpCj4+PiArewo+ Pj4gKyAgICAgc3RydWN0IHZkdXNlX2RldiAqZGV2Owo+Pj4gKyAgICAgaW50IHJldDsKPj4+ICsK Pj4+ICsgICAgIG11dGV4X2xvY2soJnZkdXNlX2xvY2spOwo+Pj4gKyAgICAgZGV2ID0gdmR1c2Vf ZmluZF9kZXYobmFtZSk7Cj4+PiArICAgICBpZiAoIWRldikgewo+Pj4gKyAgICAgICAgICAgICBt dXRleF91bmxvY2soJnZkdXNlX2xvY2spOwo+Pj4gKyAgICAgICAgICAgICByZXR1cm4gLUVJTlZB TDsKPj4+ICsgICAgIH0KPj4+ICsgICAgIHJldCA9IHZkdXNlX2Rldl9pbml0X3ZkcGEoZGV2LCBu YW1lKTsKPj4+ICsgICAgIG11dGV4X3VubG9jaygmdmR1c2VfbG9jayk7Cj4+PiArICAgICBpZiAo cmV0KQo+Pj4gKyAgICAgICAgICAgICByZXR1cm4gcmV0Owo+Pj4gKwo+Pj4gKyAgICAgcmV0ID0g X3ZkcGFfcmVnaXN0ZXJfZGV2aWNlKCZkZXYtPnZkZXYtPnZkcGEsIGRldi0+dnFfbnVtKTsKPj4+ ICsgICAgIGlmIChyZXQpIHsKPj4+ICsgICAgICAgICAgICAgcHV0X2RldmljZSgmZGV2LT52ZGV2 LT52ZHBhLmRldik7Cj4+PiArICAgICAgICAgICAgIHJldHVybiByZXQ7Cj4+PiArICAgICB9Cj4+ PiArCj4+PiArICAgICByZXR1cm4gMDsKPj4+ICt9Cj4+PiArCj4+PiArc3RhdGljIHZvaWQgdmRw YV9kZXZfZGVsKHN0cnVjdCB2ZHBhX21nbXRfZGV2ICptZGV2LCBzdHJ1Y3QgdmRwYV9kZXZpY2Ug KmRldikKPj4+ICt7Cj4+PiArICAgICBfdmRwYV91bnJlZ2lzdGVyX2RldmljZShkZXYpOwo+Pj4g K30KPj4+ICsKPj4+ICtzdGF0aWMgY29uc3Qgc3RydWN0IHZkcGFfbWdtdGRldl9vcHMgdmRwYV9k ZXZfbWdtdGRldl9vcHMgPSB7Cj4+PiArICAgICAuZGV2X2FkZCA9IHZkcGFfZGV2X2FkZCwKPj4+ ICsgICAgIC5kZXZfZGVsID0gdmRwYV9kZXZfZGVsLAo+Pj4gK307Cj4+PiArCj4+PiArc3RhdGlj IHN0cnVjdCB2aXJ0aW9fZGV2aWNlX2lkIGlkX3RhYmxlW10gPSB7Cj4+PiArICAgICB7IFZJUlRJ T19JRF9CTE9DSywgVklSVElPX0RFVl9BTllfSUQgfSwKPj4+ICsgICAgIHsgMCB9LAo+Pj4gK307 Cj4+PiArCj4+PiArc3RhdGljIHN0cnVjdCB2ZHBhX21nbXRfZGV2IG1nbXRfZGV2ID0gewo+Pj4g KyAgICAgLmRldmljZSA9ICZ2ZHVzZV9tZ210ZGV2LAo+Pj4gKyAgICAgLmlkX3RhYmxlID0gaWRf dGFibGUsCj4+PiArICAgICAub3BzID0gJnZkcGFfZGV2X21nbXRkZXZfb3BzLAo+Pj4gK307Cj4+ PiArCj4+PiArc3RhdGljIGludCB2ZHVzZV9tZ210ZGV2X2luaXQodm9pZCkKPj4+ICt7Cj4+PiAr ICAgICBpbnQgcmV0Owo+Pj4gKwo+Pj4gKyAgICAgcmV0ID0gZGV2aWNlX3JlZ2lzdGVyKCZ2ZHVz ZV9tZ210ZGV2KTsKPj4+ICsgICAgIGlmIChyZXQpCj4+PiArICAgICAgICAgICAgIHJldHVybiBy ZXQ7Cj4+PiArCj4+PiArICAgICByZXQgPSB2ZHBhX21nbXRkZXZfcmVnaXN0ZXIoJm1nbXRfZGV2 KTsKPj4+ICsgICAgIGlmIChyZXQpCj4+PiArICAgICAgICAgICAgIGdvdG8gZXJyOwo+Pj4gKwo+ Pj4gKyAgICAgcmV0dXJuIDA7Cj4+PiArZXJyOgo+Pj4gKyAgICAgZGV2aWNlX3VucmVnaXN0ZXIo JnZkdXNlX21nbXRkZXYpOwo+Pj4gKyAgICAgcmV0dXJuIHJldDsKPj4+ICt9Cj4+PiArCj4+PiAr c3RhdGljIHZvaWQgdmR1c2VfbWdtdGRldl9leGl0KHZvaWQpCj4+PiArewo+Pj4gKyAgICAgdmRw YV9tZ210ZGV2X3VucmVnaXN0ZXIoJm1nbXRfZGV2KTsKPj4+ICsgICAgIGRldmljZV91bnJlZ2lz dGVyKCZ2ZHVzZV9tZ210ZGV2KTsKPj4+ICt9Cj4+PiArCj4+PiArc3RhdGljIGludCB2ZHVzZV9p bml0KHZvaWQpCj4+PiArewo+Pj4gKyAgICAgaW50IHJldDsKPj4+ICsgICAgIHN0cnVjdCBkZXZp Y2UgKmRldjsKPj4+ICsKPj4+ICsgICAgIHZkdXNlX2NsYXNzID0gY2xhc3NfY3JlYXRlKFRISVNf TU9EVUxFLCAidmR1c2UiKTsKPj4+ICsgICAgIGlmIChJU19FUlIodmR1c2VfY2xhc3MpKQo+Pj4g KyAgICAgICAgICAgICByZXR1cm4gUFRSX0VSUih2ZHVzZV9jbGFzcyk7Cj4+PiArCj4+PiArICAg ICB2ZHVzZV9jbGFzcy0+ZGV2bm9kZSA9IHZkdXNlX2Rldm5vZGU7Cj4+PiArCj4+PiArICAgICBy ZXQgPSBhbGxvY19jaHJkZXZfcmVnaW9uKCZ2ZHVzZV9tYWpvciwgMCwgVkRVU0VfREVWX01BWCwg InZkdXNlIik7Cj4+PiArICAgICBpZiAocmV0KQo+Pj4gKyAgICAgICAgICAgICBnb3RvIGVycl9j aGFyZGV2X3JlZ2lvbjsKPj4+ICsKPj4+ICsgICAgIC8qIC9kZXYvdmR1c2UvY29udHJvbCAqLwo+ Pj4gKyAgICAgY2Rldl9pbml0KCZ2ZHVzZV9jdHJsX2NkZXYsICZ2ZHVzZV9jdHJsX2ZvcHMpOwo+ Pj4gKyAgICAgdmR1c2VfY3RybF9jZGV2Lm93bmVyID0gVEhJU19NT0RVTEU7Cj4+PiArICAgICBy ZXQgPSBjZGV2X2FkZCgmdmR1c2VfY3RybF9jZGV2LCB2ZHVzZV9tYWpvciwgMSk7Cj4+PiArICAg ICBpZiAocmV0KQo+Pj4gKyAgICAgICAgICAgICBnb3RvIGVycl9jdHJsX2NkZXY7Cj4+PiArCj4+ PiArICAgICBkZXYgPSBkZXZpY2VfY3JlYXRlKHZkdXNlX2NsYXNzLCBOVUxMLCB2ZHVzZV9tYWpv ciwgTlVMTCwgImNvbnRyb2wiKTsKPj4+ICsgICAgIGlmIChJU19FUlIoZGV2KSkgewo+Pj4gKyAg ICAgICAgICAgICByZXQgPSBQVFJfRVJSKGRldik7Cj4+PiArICAgICAgICAgICAgIGdvdG8gZXJy X2RldmljZTsKPj4+ICsgICAgIH0KPj4+ICsKPj4+ICsgICAgIC8qIC9kZXYvdmR1c2UvJERFVklD RSAqLwo+Pj4gKyAgICAgY2Rldl9pbml0KCZ2ZHVzZV9jZGV2LCAmdmR1c2VfZGV2X2ZvcHMpOwo+ Pj4gKyAgICAgdmR1c2VfY2Rldi5vd25lciA9IFRISVNfTU9EVUxFOwo+Pj4gKyAgICAgcmV0ID0g Y2Rldl9hZGQoJnZkdXNlX2NkZXYsIE1LREVWKE1BSk9SKHZkdXNlX21ham9yKSwgMSksCj4+PiAr ICAgICAgICAgICAgICAgICAgICBWRFVTRV9ERVZfTUFYIC0gMSk7Cj4+PiArICAgICBpZiAocmV0 KQo+Pj4gKyAgICAgICAgICAgICBnb3RvIGVycl9jZGV2Owo+Pj4gKwo+Pj4gKyAgICAgdmR1c2Vf aXJxX3dxID0gYWxsb2Nfd29ya3F1ZXVlKCJ2ZHVzZS1pcnEiLAo+Pj4gKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgV1FfSElHSFBSSSB8IFdRX1NZU0ZTIHwgV1FfVU5CT1VORCwgMCk7Cj4+ PiArICAgICBpZiAoIXZkdXNlX2lycV93cSkKPj4+ICsgICAgICAgICAgICAgZ290byBlcnJfd3E7 Cj4+PiArCj4+PiArICAgICByZXQgPSB2ZHVzZV9kb21haW5faW5pdCgpOwo+Pj4gKyAgICAgaWYg KHJldCkKPj4+ICsgICAgICAgICAgICAgZ290byBlcnJfZG9tYWluOwo+Pj4gKwo+Pj4gKyAgICAg cmV0ID0gdmR1c2VfbWdtdGRldl9pbml0KCk7Cj4+PiArICAgICBpZiAocmV0KQo+Pj4gKyAgICAg ICAgICAgICBnb3RvIGVycl9tZ210ZGV2Owo+Pj4gKwo+Pj4gKyAgICAgcmV0dXJuIDA7Cj4+PiAr ZXJyX21nbXRkZXY6Cj4+PiArICAgICB2ZHVzZV9kb21haW5fZXhpdCgpOwo+Pj4gK2Vycl9kb21h aW46Cj4+PiArICAgICBkZXN0cm95X3dvcmtxdWV1ZSh2ZHVzZV9pcnFfd3EpOwo+Pj4gK2Vycl93 cToKPj4+ICsgICAgIGNkZXZfZGVsKCZ2ZHVzZV9jZGV2KTsKPj4+ICtlcnJfY2RldjoKPj4+ICsg ICAgIGRldmljZV9kZXN0cm95KHZkdXNlX2NsYXNzLCB2ZHVzZV9tYWpvcik7Cj4+PiArZXJyX2Rl dmljZToKPj4+ICsgICAgIGNkZXZfZGVsKCZ2ZHVzZV9jdHJsX2NkZXYpOwo+Pj4gK2Vycl9jdHJs X2NkZXY6Cj4+PiArICAgICB1bnJlZ2lzdGVyX2NocmRldl9yZWdpb24odmR1c2VfbWFqb3IsIFZE VVNFX0RFVl9NQVgpOwo+Pj4gK2Vycl9jaGFyZGV2X3JlZ2lvbjoKPj4+ICsgICAgIGNsYXNzX2Rl c3Ryb3kodmR1c2VfY2xhc3MpOwo+Pj4gKyAgICAgcmV0dXJuIHJldDsKPj4+ICt9Cj4+PiArbW9k dWxlX2luaXQodmR1c2VfaW5pdCk7Cj4+PiArCj4+PiArc3RhdGljIHZvaWQgdmR1c2VfZXhpdCh2 b2lkKQo+Pj4gK3sKPj4+ICsgICAgIHZkdXNlX21nbXRkZXZfZXhpdCgpOwo+Pj4gKyAgICAgdmR1 c2VfZG9tYWluX2V4aXQoKTsKPj4+ICsgICAgIGRlc3Ryb3lfd29ya3F1ZXVlKHZkdXNlX2lycV93 cSk7Cj4+PiArICAgICBjZGV2X2RlbCgmdmR1c2VfY2Rldik7Cj4+PiArICAgICBkZXZpY2VfZGVz dHJveSh2ZHVzZV9jbGFzcywgdmR1c2VfbWFqb3IpOwo+Pj4gKyAgICAgY2Rldl9kZWwoJnZkdXNl X2N0cmxfY2Rldik7Cj4+PiArICAgICB1bnJlZ2lzdGVyX2NocmRldl9yZWdpb24odmR1c2VfbWFq b3IsIFZEVVNFX0RFVl9NQVgpOwo+Pj4gKyAgICAgY2xhc3NfZGVzdHJveSh2ZHVzZV9jbGFzcyk7 Cj4+PiArfQo+Pj4gK21vZHVsZV9leGl0KHZkdXNlX2V4aXQpOwo+Pj4gKwo+Pj4gK01PRFVMRV9M SUNFTlNFKERSVl9MSUNFTlNFKTsKPj4+ICtNT0RVTEVfQVVUSE9SKERSVl9BVVRIT1IpOwo+Pj4g K01PRFVMRV9ERVNDUklQVElPTihEUlZfREVTQyk7Cj4+PiBkaWZmIC0tZ2l0IGEvaW5jbHVkZS91 YXBpL2xpbnV4L3ZkdXNlLmggYi9pbmNsdWRlL3VhcGkvbGludXgvdmR1c2UuaAo+Pj4gbmV3IGZp bGUgbW9kZSAxMDA2NDQKPj4+IGluZGV4IDAwMDAwMDAwMDAwMC4uZjIxYjJlNTFiNWM4Cj4+PiAt LS0gL2Rldi9udWxsCj4+PiArKysgYi9pbmNsdWRlL3VhcGkvbGludXgvdmR1c2UuaAo+Pj4gQEAg LTAsMCArMSwxNDMgQEAKPj4+ICsvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCBX SVRIIExpbnV4LXN5c2NhbGwtbm90ZSAqLwo+Pj4gKyNpZm5kZWYgX1VBUElfVkRVU0VfSF8KPj4+ ICsjZGVmaW5lIF9VQVBJX1ZEVVNFX0hfCj4+PiArCj4+PiArI2luY2x1ZGUgPGxpbnV4L3R5cGVz Lmg+Cj4+PiArCj4+PiArI2RlZmluZSBWRFVTRV9BUElfVkVSU0lPTiAgICAwCj4+PiArCj4+PiAr I2RlZmluZSBWRFVTRV9OQU1FX01BWCAgICAgICAyNTYKPj4+ICsKPj4+ICsvKiB0aGUgY29udHJv bCBtZXNzYWdlcyBkZWZpbml0aW9uIGZvciByZWFkL3dyaXRlICovCj4+PiArCj4+PiArZW51bSB2 ZHVzZV9yZXFfdHlwZSB7Cj4+PiArICAgICAvKiBHZXQgdGhlIHN0YXRlIGZvciB2aXJ0cXVldWUg ZnJvbSB1c2Vyc3BhY2UgKi8KPj4+ICsgICAgIFZEVVNFX0dFVF9WUV9TVEFURSwKPj4+ICsgICAg IC8qIE5vdGlmeSB1c2Vyc3BhY2UgdG8gc3RhcnQgdGhlIGRhdGFwbGFuZSwgbm8gcmVwbHkgKi8K Pj4+ICsgICAgIFZEVVNFX1NUQVJUX0RBVEFQTEFORSwKPj4+ICsgICAgIC8qIE5vdGlmeSB1c2Vy c3BhY2UgdG8gc3RvcCB0aGUgZGF0YXBsYW5lLCBubyByZXBseSAqLwo+Pj4gKyAgICAgVkRVU0Vf U1RPUF9EQVRBUExBTkUsCj4+PiArICAgICAvKiBOb3RpZnkgdXNlcnNwYWNlIHRvIHVwZGF0ZSB0 aGUgbWVtb3J5IG1hcHBpbmcgaW4gZGV2aWNlIElPVExCICovCj4+PiArICAgICBWRFVTRV9VUERB VEVfSU9UTEIsCj4+PiArfTsKPj4+ICsKPj4+ICtzdHJ1Y3QgdmR1c2VfdnFfc3RhdGUgewo+Pj4g KyAgICAgX191MzIgaW5kZXg7IC8qIHZpcnRxdWV1ZSBpbmRleCAqLwo+Pj4gKyAgICAgX191MzIg YXZhaWxfaWR4OyAvKiB2aXJ0cXVldWUgc3RhdGUgKGxhc3RfYXZhaWxfaWR4KSAqLwo+Pj4gK307 Cj4+Cj4+IFRoaXMgbmVlZHMgc29tZSB0d2Vha3MgdG8gc3VwcG9ydCBwYWNrZWQgdmlydHF1ZXVl Lgo+Pgo+IE9LLgo+Cj4gVGhhbmtzLAo+IFlvbmdqaQo+CgpfX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fXwpWaXJ0dWFsaXphdGlvbiBtYWlsaW5nIGxpc3QKVmly dHVhbGl6YXRpb25AbGlzdHMubGludXgtZm91bmRhdGlvbi5vcmcKaHR0cHM6Ly9saXN0cy5saW51 eGZvdW5kYXRpb24ub3JnL21haWxtYW4vbGlzdGluZm8vdmlydHVhbGl6YXRpb24=