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=-18.7 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,WEIRD_QUOTING 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 8DBFDC433FE for ; Fri, 4 Dec 2020 03:37:39 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 26D3222515 for ; Fri, 4 Dec 2020 03:37:38 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727463AbgLDDhX (ORCPT ); Thu, 3 Dec 2020 22:37:23 -0500 Received: from us-smtp-delivery-124.mimecast.com ([63.128.21.124]:53507 "EHLO us-smtp-delivery-124.mimecast.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726080AbgLDDhX (ORCPT ); Thu, 3 Dec 2020 22:37:23 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1607052954; 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=+SHlFygzZY7YSv6BaslP2KSyFm5bOqMAODf6huuujZE=; b=aYl4407OE50w8i/Ci21KMrV+CWNx6p/7TpwiCOt8f5lTszd7f6rc5tXGRr6QnH6j5aMfGb booerGd53a4Av3yXLTiZiOkAjt23ju6ySzlNqac1OkK52dsfBfhFPEOSAk3DUSJZh8Z2E5 4L5PYhKl4rfgWy+YVDNcGnRJfo1fKDs= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-64-7ik0mQkaPTSTUuwXXojHGw-1; Thu, 03 Dec 2020 22:35:52 -0500 X-MC-Unique: 7ik0mQkaPTSTUuwXXojHGw-1 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id E5569180A087; Fri, 4 Dec 2020 03:35:50 +0000 (UTC) Received: from [10.72.12.116] (ovpn-12-116.pek2.redhat.com [10.72.12.116]) by smtp.corp.redhat.com (Postfix) with ESMTP id 554DE5D9CA; Fri, 4 Dec 2020 03:35:43 +0000 (UTC) Subject: Re: [PATCH v2 2/2] drivers: gpio: add virtio-gpio guest driver To: "Enrico Weigelt, metux IT consult" , linux-kernel@vger.kernel.org Cc: corbet@lwn.net, linus.walleij@linaro.org, bgolaszewski@baylibre.com, mst@redhat.com, linux-doc@vger.kernel.org, linux-gpio@vger.kernel.org, virtualization@lists.linux-foundation.org, linux-riscv@lists.infradead.org References: <20201203191135.21576-1-info@metux.net> <20201203191135.21576-2-info@metux.net> From: Jason Wang Message-ID: <8209ce55-a4aa-f256-b9b9-f7eb3cac877b@redhat.com> Date: Fri, 4 Dec 2020 11:35:40 +0800 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.10.0 MIME-Version: 1.0 In-Reply-To: <20201203191135.21576-2-info@metux.net> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit Content-Language: en-US X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 Precedence: bulk List-ID: X-Mailing-List: linux-gpio@vger.kernel.org On 2020/12/4 上午3:11, Enrico Weigelt, metux IT consult wrote: > Introducing new gpio driver for virtual GPIO devices via virtio. > > The driver allows routing gpio control into VM guests, eg. brigding > virtual gpios to specific host gpios, or attaching simulators for > automatic application testing. > > Changes v2: > * fixed uapi header license > * sorted include's > * fixed formatting > * fixed unneeded devm allocation - plain kzalloc/kfree is enough > * fixed missing devm_kzalloc fail check > * use devm_kcalloc() for array allocation > * added virtio-gpio protocol specification > > Signed-off-by: Enrico Weigelt, metux IT consult > --- > Documentation/gpio/virtio-gpio.rst | 176 ++++++++++++++++++++ > MAINTAINERS | 6 + > drivers/gpio/Kconfig | 9 + > drivers/gpio/Makefile | 1 + > drivers/gpio/gpio-virtio.c | 332 +++++++++++++++++++++++++++++++++++++ > include/uapi/linux/virtio_gpio.h | 39 +++++ > include/uapi/linux/virtio_ids.h | 1 + > 7 files changed, 564 insertions(+) > create mode 100644 Documentation/gpio/virtio-gpio.rst > create mode 100644 drivers/gpio/gpio-virtio.c > create mode 100644 include/uapi/linux/virtio_gpio.h > > diff --git a/Documentation/gpio/virtio-gpio.rst b/Documentation/gpio/virtio-gpio.rst > new file mode 100644 > index 000000000000..04642be07b96 > --- /dev/null > +++ b/Documentation/gpio/virtio-gpio.rst > @@ -0,0 +1,176 @@ > +""""""""""""""""" > +Virtio-GPIO protocol specification > +""""""""""""""""" > +........... > +Specification for virtio-based virtiual GPIO devices > +........... > + Is the plan to keep this doc synced with the one in the virtio specification? > ++------------ > ++Version_ 1.0 > ++------------ > + > +=================== > +General > +=================== > + > +The virtio-gpio protocol provides access to general purpose IO devices > +to virtual machine guests. These virtualized GPIOs could be either provided > +by some simulator (eg. virtual HIL), routed to some external device or > +routed to real GPIOs on the host (eg. virtualized embedded applications). > + > +Instead of simulating some existing real GPIO chip within an VMM, this > +protocol provides an hardware independent interface between host and guest > +that solely relies on an active virtio connection (no matter which transport > +actually used), no other buses or additional platform driver logic required. > + > +=================== > +Protocol layout > +=================== > + > +---------------------- > +Configuration space > +---------------------- > + > ++--------+----------+-------------------------------+ > +| Offset | Type | Description | > ++========+==========+===============================+ > +| 0x00 | uint8 | version | > ++--------+----------+-------------------------------+ > +| 0x02 | uint16 | number of GPIO lines | > ++--------+----------+-------------------------------+ > +| 0x04 | uint32 | size of gpio name block | > ++--------+----------+-------------------------------+ > +| 0x20 | char[32] | device name (0-terminated) | > ++--------+----------+-------------------------------+ > +| 0x40 | char[] | line names block | > ++--------+----------+-------------------------------+ > + I think it's better to use u8 ot uint8_t here.Git grep told me the former is more popular under Documentation/. > +- for version field currently only value 1 supported. > +- the line names block holds a stream of zero-terminated strings, > + holding the individual line names. I'm not sure but does this mean we don't have a fixed length of config space? Need to check whether it can bring any trouble to migration(compatibility). > +- unspecified fields are reserved for future use and should be zero. > + > +------------------------ > +Virtqueues and messages: > +------------------------ > + > +- Queue #0: transmission from host to guest > +- Queue #1: transmission from guest to host Virtio became more a popular in the area without virtualization. So I think it's better to use "device/driver" instead of "host/guest" here. > + > +The queues transport messages of the struct virtio_gpio_event: > + > +Message format: > +--------------- > + > ++--------+----------+---------------+ > +| Offset | Type | Description | > ++========+==========+===============+ > +| 0x00 | uint16 | event type | > ++--------+----------+---------------+ > +| 0x02 | uint16 | line id | > ++--------+----------+---------------+ > +| 0x04 | uint32 | value | > ++--------+----------+---------------+ Not a native speaker but event sounds like something driver read from device. Looking at the below lists, most of them except for VIRTIO_GPIO_EV_HOST_LEVEL looks more like a command. Another question is, what's the benefit of unifying the message format of the two queues. E.g VIRTIO_GPIO_EV_HOST_LEVEL can only works fro rxq. > + > +Message types: > +-------------- > + > ++-------+---------------------------------------+-----------------------------+ > +| Code | Symbol | | > ++=======+=======================================+=============================+ > +| 0x01 | VIRTIO_GPIO_EV_GUEST_REQUEST | request gpio line | > ++-------+---------------------------------------+-----------------------------+ > +| 0x02 | VIRTIO_GPIO_EV_GUEST_DIRECTION_INPUT | set direction to input | > ++-------+---------------------------------------+-----------------------------+ > +| 0x03 | VIRTIO_GPIO_EV_GUEST_DIRECTION_OUTPUT | set direction to output | > ++-------+---------------------------------------+-----------------------------+ > +| 0x04 | VIRTIO_GPIO_EV_GUEST_GET_DIRECTION | read current direction | > ++-------+---------------------------------------+-----------------------------+ > +| 0x05 | VIRTIO_GPIO_EV_GUEST_GET_VALUE | read current level | > ++-------+---------------------------------------+-----------------------------+ > +| 0x06 | VIRTIO_GPIO_EV_GUEST_SET_VALUE | set current (out) level | > ++-------+---------------------------------------+-----------------------------+ > +| 0x11 | VIRTIO_GPIO_EV_HOST_LEVEL | state changed (host->guest) | > ++-------+---------------------------------------+-----------------------------+ > + Not familiar with GPIO but I wonder the value of a standalone VIRTIO_GPIO_EV_GUEST_DIRECTION_INPUT/OUTPUT. Can we simply imply them in SET/GET_VALUE? > +---------------------- > +Data flow: > +---------------------- > + > +- all operations, except ``VIRTIO_GPIO_EV_HOST_LEVEL``, are guest-initiated > +- host replies ``VIRTIO_GPIO_EV_HOST_LEVEL`` OR'ed to the ``type`` field > +- ``VIRTIO_GPIO_EV_HOST_LEVEL`` is only sent asynchronically from host to guest > +- in replies, a negative ``value`` field denotes an unix-style errno code Virtio is in a different scope, so we need to define the error code on our own. E.g for virtio-net we define: #define VIRTIO_NET_OK     0 #define VIRTIO_NET_ERR    1 > +- valid direction values are: > + * 0 = output > + * 1 = input > +- valid line state values are: > + * 0 = inactive > + * 1 = active > + > +VIRTIO_GPIO_EV_GUEST_REQUEST > +---------------------------- > + > +- notify the host that given line# is going to be used > +- request: > + * ``line`` field: line number > + * ``value`` field: unused > +- reply: > + * ``value`` field: errno code (0 = success) > + > +VIRTIO_GPIO_EV_GUEST_DIRECTION_INPUT > +------------------------------------ > + > +- set line line direction to input > +- request: > + * ``line`` field: line number > + * ``value`` field: unused > +- reply: value field holds errno > + * ``value`` field: errno code (0 = success) > + > +VIRTIO_GPIO_EV_GUEST_DIRECTION_OUTPUT > +------------------------------------- > + > +- set line direction to output and given line state > +- request: > + * ``line`` field: line number > + * ``value`` field: output state (0=inactive, 1=active) > +- reply: > + * ``value`` field: holds errno > + > +VIRTIO_GPIO_EV_GUEST_GET_DIRECTION > +---------------------------------- > + > +- retrieve line direction > +- request: > + * ``line`` field: line number > + * ``value`` field: unused > +- reply: > + * ``value`` field: direction (0=output, 1=input) or errno code > + > +VIRTIO_GPIO_EV_GUEST_GET_VALUE > +------------------------------ > + > +- retrieve line state value > +- request: > + * ``line`` field: line number > + * ``value`` field: unused > +- reply: > + * ``value`` field: line state (0=inactive, 1=active) or errno code > + > +VIRTIO_GPIO_EV_GUEST_SET_VALUE > +------------------------------ > + > +- set line state value (output only) > +- request: > + * ``line`` field: line number > + * ``value`` field: line state (0=inactive, 1=active) > +- reply: > + * ``value`` field: new line state or errno code > + > +VIRTIO_GPIO_EV_HOST_LEVEL > +------------------------- > + > +- async notification from host to gues: line state changed > +- ``line`` field: line number > +- ``value`` field: new line state (0=inactive, 1=active) > diff --git a/MAINTAINERS b/MAINTAINERS > index 2daa6ee673f7..2b74e39275b3 100644 > --- a/MAINTAINERS > +++ b/MAINTAINERS > @@ -18592,6 +18592,12 @@ F: Documentation/filesystems/virtiofs.rst > F: fs/fuse/virtio_fs.c > F: include/uapi/linux/virtio_fs.h > > +VIRTIO GPIO DRIVER > +M: Enrico Weigelt, metux IT consult > +S: Maintained > +F: drivers/gpio/gpio-virtio.c > +F: include/uapi/linux/virtio_gpio.h > + > VIRTIO GPU DRIVER > M: David Airlie > M: Gerd Hoffmann > diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig > index 01619eb58396..7a33aa347dfb 100644 > --- a/drivers/gpio/Kconfig > +++ b/drivers/gpio/Kconfig > @@ -1615,6 +1615,15 @@ config GPIO_MOCKUP > tools/testing/selftests/gpio/gpio-mockup.sh. Reference the usage in > it. > > +config GPIO_VIRTIO > + tristate "VirtIO GPIO support" > + depends on VIRTIO Let's use select, since there's no prompt for VIRTIO and it doesn't have any dependencies. > + help > + Say Y here to enable guest support for virtio-based GPIOs. > + > + These virtual GPIOs can be routed to real GPIOs or attached to > + simulators on the host (qemu). It's better to avoid talking host and qemu here for new virtio devices. > + > endmenu > > endif > diff --git a/drivers/gpio/Makefile b/drivers/gpio/Makefile > index 09dada80ac34..2b12e75af123 100644 > --- a/drivers/gpio/Makefile > +++ b/drivers/gpio/Makefile > @@ -160,6 +160,7 @@ obj-$(CONFIG_GPIO_TWL4030) += gpio-twl4030.o > obj-$(CONFIG_GPIO_TWL6040) += gpio-twl6040.o > obj-$(CONFIG_GPIO_UCB1400) += gpio-ucb1400.o > obj-$(CONFIG_GPIO_UNIPHIER) += gpio-uniphier.o > +obj-$(CONFIG_GPIO_VIRTIO) += gpio-virtio.o > obj-$(CONFIG_GPIO_VF610) += gpio-vf610.o > obj-$(CONFIG_GPIO_VIPERBOARD) += gpio-viperboard.o > obj-$(CONFIG_GPIO_VR41XX) += gpio-vr41xx.o > diff --git a/drivers/gpio/gpio-virtio.c b/drivers/gpio/gpio-virtio.c > new file mode 100644 > index 000000000000..f1ac47da26b6 > --- /dev/null > +++ b/drivers/gpio/gpio-virtio.c > @@ -0,0 +1,332 @@ > +// SPDX-License-Identifier: GPL-2.0+ > + > +/* > + * GPIO driver for virtio-based virtual GPIOs > + * > + * Copyright (C) 2018 metux IT consult > + * Author: Enrico Weigelt, metux IT consult > + * > + */ > + > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > +struct virtio_gpio_priv { > + struct gpio_chip gc; > + spinlock_t vq_lock; > + spinlock_t op_lock; > + struct virtio_device *vdev; > + int num_gpios; > + char *name; > + struct virtqueue *vq_rx; > + struct virtqueue *vq_tx; > + struct virtio_gpio_event rcv_buf; > + struct virtio_gpio_event last; > + int irq_base; > + wait_queue_head_t waitq; > + unsigned long reply_wait; > +}; > + > +static void virtio_gpio_prepare_inbuf(struct virtio_gpio_priv *priv) > +{ > + struct scatterlist rcv_sg; > + > + sg_init_one(&rcv_sg, &priv->rcv_buf, sizeof(priv->rcv_buf)); > + virtqueue_add_inbuf(priv->vq_rx, &rcv_sg, 1, &priv->rcv_buf, > + GFP_KERNEL); > + virtqueue_kick(priv->vq_rx); > +} > + > +static int virtio_gpio_xmit(struct virtio_gpio_priv *priv, int type, > + int pin, int value, struct virtio_gpio_event *ev) > +{ > + struct scatterlist sg[1]; > + int ret; > + unsigned long flags; > + > + WARN_ON(!ev); > + > + ev->type = type; > + ev->pin = pin; > + ev->value = value; > + > + sg_init_table(sg, 1); > + sg_set_buf(&sg[0], ev, sizeof(struct virtio_gpio_event)); > + > + spin_lock_irqsave(&priv->vq_lock, flags); > + ret = virtqueue_add_outbuf(priv->vq_tx, sg, ARRAY_SIZE(sg), > + priv, GFP_KERNEL); > + if (ret < 0) { > + dev_err(&priv->vdev->dev, > + "virtqueue_add_outbuf() failed: %d\n", ret); > + goto out; So except for the error log, the failure is silently ignored by the caller. Is this intended? > + } > + virtqueue_kick(priv->vq_tx); > + > +out: > + spin_unlock_irqrestore(&priv->vq_lock, flags); > + return 0; > +} > + > +static inline void wakeup_event(struct virtio_gpio_priv *priv, int id) > +{ > + set_bit(id, &priv->reply_wait); > +} > + > +static inline int check_event(struct virtio_gpio_priv *priv, int id) > +{ > + return test_bit(id, &priv->reply_wait); > +} > + > +static inline void clear_event(struct virtio_gpio_priv *priv, int id) > +{ > + clear_bit(id, &priv->reply_wait); > +} > + > +static int virtio_gpio_req(struct virtio_gpio_priv *priv, int type, > + int pin, int value) > +{ > + struct virtio_gpio_event *ev > + = kzalloc(&priv->vdev->dev, sizeof(struct virtio_gpio_event), > + GFP_KERNEL); > + > + if (!ev) > + return -ENOMEM; > + > + clear_event(priv, type); > + virtio_gpio_xmit(priv, type, pin, value, ev); > + wait_event_interruptible(priv->waitq, check_event(priv, type)); If I read the code correctly, this expects there will be at most a single type of event that can be processed at the same time. E.g can upper layer want to read from different lines in parallel? If yes, we need to deal with that. > + > + kfree(&priv->vdev->dev, ev); > + > + return priv->last.value; > +} > + > +static int virtio_gpio_direction_input(struct gpio_chip *gc, > + unsigned int pin) > +{ > + return virtio_gpio_req(gpiochip_get_data(gc), > + VIRTIO_GPIO_EV_GUEST_DIRECTION_INPUT, > + pin, 0); > +} > + > +static int virtio_gpio_direction_output(struct gpio_chip *gc, > + unsigned int pin, int value) > +{ > + return virtio_gpio_req(gpiochip_get_data(gc), > + VIRTIO_GPIO_EV_GUEST_DIRECTION_OUTPUT, > + pin, value); > +} > + > +static int virtio_gpio_get_direction(struct gpio_chip *gc, unsigned int pin) > +{ > + return virtio_gpio_req(gpiochip_get_data(gc), > + VIRTIO_GPIO_EV_GUEST_GET_DIRECTION, > + pin, 0); > +} > + > +static void virtio_gpio_set(struct gpio_chip *gc, > + unsigned int pin, int value) > +{ > + virtio_gpio_req(gpiochip_get_data(gc), > + VIRTIO_GPIO_EV_GUEST_SET_VALUE, pin, value); > +} > + > +static int virtio_gpio_get(struct gpio_chip *gc, > + unsigned int pin) > +{ > + return virtio_gpio_req(gpiochip_get_data(gc), > + VIRTIO_GPIO_EV_GUEST_GET_VALUE, pin, 0); > +} > + > +static int virtio_gpio_request(struct gpio_chip *gc, > + unsigned int pin) > +{ > + return virtio_gpio_req(gpiochip_get_data(gc), > + VIRTIO_GPIO_EV_GUEST_REQUEST, pin, 0); > +} > + > +static void virtio_gpio_signal(struct virtio_gpio_priv *priv, int event, > + int pin, int value) > +{ > + if (pin < priv->num_gpios) > + generic_handle_irq(priv->irq_base + pin); > +} > + > +static void virtio_gpio_data_rx(struct virtqueue *vq) > +{ > + struct virtio_gpio_priv *priv = vq->vdev->priv; > + void *data; > + unsigned int len; > + struct virtio_gpio_event *ev; > + > + data = virtqueue_get_buf(priv->vq_rx, &len); > + if (!data || !len) { > + dev_warn(&vq->vdev->dev, "RX received no data ! %d\n", len); > + return; > + } > + > + ev = data; > + WARN_ON(data != &priv->rcv_buf); > + > + memcpy(&priv->last, &priv->rcv_buf, sizeof(struct virtio_gpio_event)); > + > + switch (ev->type) { > + case VIRTIO_GPIO_EV_HOST_LEVEL: > + virtio_gpio_signal(priv, ev->type, ev->pin, ev->value); > + break; > + default: > + wakeup_event(priv, ev->type & ~VIRTIO_GPIO_EV_REPLY); This looks suspicious, it looks to me what is done here is, consider we want to do VIRTIO_GPIO_EV_GUEST_SET_VALUE 1) put the event in txq, wait 2) the result is returned from rxq, wakeup It looks to me this is racy since the device should be able to process a batch of descriptors and there's no guarantee that the descriptor is processed in order from the virtio level. I wonder why not introduce two virtqueues: 1) command vq 2) event vq All commands were sent via command vq and then device can write back to the command buffer as other virtio device did. Then there's no worries of batching or out of order completion. > + break; > + } > + virtio_gpio_prepare_inbuf(priv); This assumes at most one event could be generated, is this how GPIO device expect to behave? I think level could change several times. > + wake_up_all(&priv->waitq); > +} > + > +static int virtio_gpio_alloc_vq(struct virtio_gpio_priv *priv) > +{ > + struct virtqueue *vqs[2]; > + vq_callback_t *cbs[] = { > + NULL, > + virtio_gpio_data_rx, > + }; > + static const char * const names[] = { "in", "out", }; > + int ret; > + > + ret = virtio_find_vqs(priv->vdev, 2, vqs, cbs, names, NULL); > + if (ret) { > + dev_err(&priv->vdev->dev, "failed to alloc vqs: %d\n", ret); > + return ret; > + } > + > + priv->vq_rx = vqs[0]; > + priv->vq_tx = vqs[1]; > + > + virtio_gpio_prepare_inbuf(priv); > + > + virtio_config_enable(priv->vdev); > + virtqueue_enable_cb(priv->vq_rx); > + virtio_device_ready(priv->vdev); > + > + return 0; > +} > + > +static int virtio_gpio_probe(struct virtio_device *vdev) > +{ > + struct virtio_gpio_priv *priv; > + struct virtio_gpio_config cf = {}; > + char *name_buffer; > + const char **gpio_names = NULL; > + struct device *dev = &vdev->dev; > + > + priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); > + if (!priv) > + return -ENOMEM; Is devres guaranteed to be enabled here? Thanks From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.7 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,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,WEIRD_QUOTING 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 23E4EC4361A for ; Fri, 4 Dec 2020 03:36:16 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (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 8EE9E22513 for ; Fri, 4 Dec 2020 03:36:15 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 8EE9E22513 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-riscv-bounces+linux-riscv=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Type: Content-Transfer-Encoding:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:Date:Message-ID:From: References:To:Subject:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=sx/TBtI1f8KHgTsUQK65s590lLI02dkEsziwwhZHMDg=; b=2KpmbpMYMhSgIRqY7tCTa4m6g wkzdmoRoMNJrvLaaz3k2UVZGRlRfqI4KeAz6Nhfj3Ay2MbklZ1Hqcbs6miCfNWVgnCc1LCdXmE2rb AtEC8BJUGs/Jjax6fXDHf7qiB2vFazIFgFWlty/U0aG21b0zPyooXPTtda8Pca/kB99auOh0h8O72 CotfJNV25QRzM9z8XEujqps4JhBAv+3fHGbZ5YW+GPAY5GDVb6oC6O/SPjtv0W+ltOKltf4ptUVvO A3f/ujEnDl5HCl71BMcZ3ORwYGFyKm6u/Ja9jQlXtCccUx5xsKvBuXA70F55kvE5hEP3lheeaWpis YnHpyF+kA==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1kl1t3-0004ng-MG; Fri, 04 Dec 2020 03:36:01 +0000 Received: from us-smtp-delivery-124.mimecast.com ([63.128.21.124]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1kl1t0-0004nM-VP for linux-riscv@lists.infradead.org; Fri, 04 Dec 2020 03:36:00 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1607052957; 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=+SHlFygzZY7YSv6BaslP2KSyFm5bOqMAODf6huuujZE=; b=KuOKolxfhzFPA66/m7waw05ExnrcAK60b+Z7qy9qMdW6Sk1+skQOU/B9XzbVR5ApOylKnF LWIrr/tTt9NAJceRKmm8GUSDoh9cdZcipxORlV4ZXTOZ/MHHSvNT62KMHzrVnC/px8GDZn j9ZkXyzh1KXsH5u6wTtkZEY4bRVUqkU= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-64-7ik0mQkaPTSTUuwXXojHGw-1; Thu, 03 Dec 2020 22:35:52 -0500 X-MC-Unique: 7ik0mQkaPTSTUuwXXojHGw-1 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id E5569180A087; Fri, 4 Dec 2020 03:35:50 +0000 (UTC) Received: from [10.72.12.116] (ovpn-12-116.pek2.redhat.com [10.72.12.116]) by smtp.corp.redhat.com (Postfix) with ESMTP id 554DE5D9CA; Fri, 4 Dec 2020 03:35:43 +0000 (UTC) Subject: Re: [PATCH v2 2/2] drivers: gpio: add virtio-gpio guest driver To: "Enrico Weigelt, metux IT consult" , linux-kernel@vger.kernel.org References: <20201203191135.21576-1-info@metux.net> <20201203191135.21576-2-info@metux.net> From: Jason Wang Message-ID: <8209ce55-a4aa-f256-b9b9-f7eb3cac877b@redhat.com> Date: Fri, 4 Dec 2020 11:35:40 +0800 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.10.0 MIME-Version: 1.0 In-Reply-To: <20201203191135.21576-2-info@metux.net> Content-Language: en-US X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20201203_223559_103907_6941ED2D X-CRM114-Status: GOOD ( 40.11 ) X-BeenThere: linux-riscv@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: corbet@lwn.net, mst@redhat.com, linus.walleij@linaro.org, linux-doc@vger.kernel.org, virtualization@lists.linux-foundation.org, bgolaszewski@baylibre.com, linux-gpio@vger.kernel.org, linux-riscv@lists.infradead.org Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Sender: "linux-riscv" Errors-To: linux-riscv-bounces+linux-riscv=archiver.kernel.org@lists.infradead.org Ck9uIDIwMjAvMTIvNCDkuIrljYgzOjExLCBFbnJpY28gV2VpZ2VsdCwgbWV0dXggSVQgY29uc3Vs dCB3cm90ZToKPiBJbnRyb2R1Y2luZyBuZXcgZ3BpbyBkcml2ZXIgZm9yIHZpcnR1YWwgR1BJTyBk ZXZpY2VzIHZpYSB2aXJ0aW8uCj4KPiBUaGUgZHJpdmVyIGFsbG93cyByb3V0aW5nIGdwaW8gY29u dHJvbCBpbnRvIFZNIGd1ZXN0cywgZWcuIGJyaWdkaW5nCj4gdmlydHVhbCBncGlvcyB0byBzcGVj aWZpYyBob3N0IGdwaW9zLCBvciBhdHRhY2hpbmcgc2ltdWxhdG9ycyBmb3IKPiBhdXRvbWF0aWMg YXBwbGljYXRpb24gdGVzdGluZy4KPgo+IENoYW5nZXMgdjI6Cj4gICAgICAqIGZpeGVkIHVhcGkg aGVhZGVyIGxpY2Vuc2UKPiAgICAgICogc29ydGVkIGluY2x1ZGUncwo+ICAgICAgKiBmaXhlZCBm b3JtYXR0aW5nCj4gICAgICAqIGZpeGVkIHVubmVlZGVkIGRldm0gYWxsb2NhdGlvbiAtIHBsYWlu IGt6YWxsb2Mva2ZyZWUgaXMgZW5vdWdoCj4gICAgICAqIGZpeGVkIG1pc3NpbmcgZGV2bV9remFs bG9jIGZhaWwgY2hlY2sKPiAgICAgICogdXNlIGRldm1fa2NhbGxvYygpIGZvciBhcnJheSBhbGxv Y2F0aW9uCj4gICAgICAqIGFkZGVkIHZpcnRpby1ncGlvIHByb3RvY29sIHNwZWNpZmljYXRpb24K Pgo+IFNpZ25lZC1vZmYtYnk6IEVucmljbyBXZWlnZWx0LCBtZXR1eCBJVCBjb25zdWx0IDxpbmZv QG1ldHV4Lm5ldD4KPiAtLS0KPiAgIERvY3VtZW50YXRpb24vZ3Bpby92aXJ0aW8tZ3Bpby5yc3Qg fCAxNzYgKysrKysrKysrKysrKysrKysrKysKPiAgIE1BSU5UQUlORVJTICAgICAgICAgICAgICAg ICAgICAgICAgfCAgIDYgKwo+ICAgZHJpdmVycy9ncGlvL0tjb25maWcgICAgICAgICAgICAgICB8 ICAgOSArCj4gICBkcml2ZXJzL2dwaW8vTWFrZWZpbGUgICAgICAgICAgICAgIHwgICAxICsKPiAg IGRyaXZlcnMvZ3Bpby9ncGlvLXZpcnRpby5jICAgICAgICAgfCAzMzIgKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKwo+ICAgaW5jbHVkZS91YXBpL2xpbnV4L3ZpcnRpb19ncGlv LmggICB8ICAzOSArKysrKwo+ICAgaW5jbHVkZS91YXBpL2xpbnV4L3ZpcnRpb19pZHMuaCAgICB8 ICAgMSArCj4gICA3IGZpbGVzIGNoYW5nZWQsIDU2NCBpbnNlcnRpb25zKCspCj4gICBjcmVhdGUg bW9kZSAxMDA2NDQgRG9jdW1lbnRhdGlvbi9ncGlvL3ZpcnRpby1ncGlvLnJzdAo+ICAgY3JlYXRl IG1vZGUgMTAwNjQ0IGRyaXZlcnMvZ3Bpby9ncGlvLXZpcnRpby5jCj4gICBjcmVhdGUgbW9kZSAx MDA2NDQgaW5jbHVkZS91YXBpL2xpbnV4L3ZpcnRpb19ncGlvLmgKPgo+IGRpZmYgLS1naXQgYS9E b2N1bWVudGF0aW9uL2dwaW8vdmlydGlvLWdwaW8ucnN0IGIvRG9jdW1lbnRhdGlvbi9ncGlvL3Zp cnRpby1ncGlvLnJzdAo+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gaW5kZXggMDAwMDAwMDAwMDAw Li4wNDY0MmJlMDdiOTYKPiAtLS0gL2Rldi9udWxsCj4gKysrIGIvRG9jdW1lbnRhdGlvbi9ncGlv L3ZpcnRpby1ncGlvLnJzdAo+IEBAIC0wLDAgKzEsMTc2IEBACj4gKyIiIiIiIiIiIiIiIiIiIiIi Cj4gK1ZpcnRpby1HUElPIHByb3RvY29sIHNwZWNpZmljYXRpb24KPiArIiIiIiIiIiIiIiIiIiIi IiIKPiArLi4uLi4uLi4uLi4KPiArU3BlY2lmaWNhdGlvbiBmb3IgdmlydGlvLWJhc2VkIHZpcnRp dWFsIEdQSU8gZGV2aWNlcwo+ICsuLi4uLi4uLi4uLgo+ICsKCgpJcyB0aGUgcGxhbiB0byBrZWVw IHRoaXMgZG9jIHN5bmNlZCB3aXRoIHRoZSBvbmUgaW4gdGhlIHZpcnRpbyAKc3BlY2lmaWNhdGlv bj8KCgo+ICsrLS0tLS0tLS0tLS0tCj4gKytWZXJzaW9uXyAxLjAKPiArKy0tLS0tLS0tLS0tLQo+ ICsKPiArPT09PT09PT09PT09PT09PT09PQo+ICtHZW5lcmFsCj4gKz09PT09PT09PT09PT09PT09 PT0KPiArCj4gK1RoZSB2aXJ0aW8tZ3BpbyBwcm90b2NvbCBwcm92aWRlcyBhY2Nlc3MgdG8gZ2Vu ZXJhbCBwdXJwb3NlIElPIGRldmljZXMKPiArdG8gdmlydHVhbCBtYWNoaW5lIGd1ZXN0cy4gVGhl c2UgdmlydHVhbGl6ZWQgR1BJT3MgY291bGQgYmUgZWl0aGVyIHByb3ZpZGVkCj4gK2J5IHNvbWUg c2ltdWxhdG9yIChlZy4gdmlydHVhbCBISUwpLCByb3V0ZWQgdG8gc29tZSBleHRlcm5hbCBkZXZp Y2Ugb3IKPiArcm91dGVkIHRvIHJlYWwgR1BJT3Mgb24gdGhlIGhvc3QgKGVnLiB2aXJ0dWFsaXpl ZCBlbWJlZGRlZCBhcHBsaWNhdGlvbnMpLgo+ICsKPiArSW5zdGVhZCBvZiBzaW11bGF0aW5nIHNv bWUgZXhpc3RpbmcgcmVhbCBHUElPIGNoaXAgd2l0aGluIGFuIFZNTSwgdGhpcwo+ICtwcm90b2Nv bCBwcm92aWRlcyBhbiBoYXJkd2FyZSBpbmRlcGVuZGVudCBpbnRlcmZhY2UgYmV0d2VlbiBob3N0 IGFuZCBndWVzdAo+ICt0aGF0IHNvbGVseSByZWxpZXMgb24gYW4gYWN0aXZlIHZpcnRpbyBjb25u ZWN0aW9uIChubyBtYXR0ZXIgd2hpY2ggdHJhbnNwb3J0Cj4gK2FjdHVhbGx5IHVzZWQpLCBubyBv dGhlciBidXNlcyBvciBhZGRpdGlvbmFsIHBsYXRmb3JtIGRyaXZlciBsb2dpYyByZXF1aXJlZC4K PiArCj4gKz09PT09PT09PT09PT09PT09PT0KPiArUHJvdG9jb2wgbGF5b3V0Cj4gKz09PT09PT09 PT09PT09PT09PT0KPiArCj4gKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KPiArQ29uZmlndXJhdGlv biBzcGFjZQo+ICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tCj4gKwo+ICsrLS0tLS0tLS0rLS0tLS0t LS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwo+ICt8IE9mZnNldCB8IFR5cGUg ICAgIHwgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgfAo+ICsrPT09PT09PT0rPT09PT09 PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kwo+ICt8IDB4MDAgICB8IHVpbnQ4 ICAgIHwgdmVyc2lvbiAgICAgICAgICAgICAgICAgICAgICAgfAo+ICsrLS0tLS0tLS0rLS0tLS0t LS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwo+ICt8IDB4MDIgICB8IHVpbnQx NiAgIHwgbnVtYmVyIG9mIEdQSU8gbGluZXMgICAgICAgICAgfAo+ICsrLS0tLS0tLS0rLS0tLS0t LS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwo+ICt8IDB4MDQgICB8IHVpbnQz MiAgIHwgc2l6ZSBvZiBncGlvIG5hbWUgYmxvY2sgICAgICAgfAo+ICsrLS0tLS0tLS0rLS0tLS0t LS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwo+ICt8IDB4MjAgICB8IGNoYXJb MzJdIHwgZGV2aWNlIG5hbWUgKDAtdGVybWluYXRlZCkgICAgfAo+ICsrLS0tLS0tLS0rLS0tLS0t LS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwo+ICt8IDB4NDAgICB8IGNoYXJb XSAgIHwgbGluZSBuYW1lcyBibG9jayAgICAgICAgICAgICAgfAo+ICsrLS0tLS0tLS0rLS0tLS0t LS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwo+ICsKCgpJIHRoaW5rIGl0J3Mg YmV0dGVyIHRvIHVzZSB1OCBvdCB1aW50OF90IGhlcmUuR2l0IGdyZXAgdG9sZCBtZSB0aGUgCmZv cm1lciBpcyBtb3JlIHBvcHVsYXIgdW5kZXIgRG9jdW1lbnRhdGlvbi8uCgoKPiArLSBmb3IgdmVy c2lvbiBmaWVsZCBjdXJyZW50bHkgb25seSB2YWx1ZSAxIHN1cHBvcnRlZC4KPiArLSB0aGUgbGlu ZSBuYW1lcyBibG9jayBob2xkcyBhIHN0cmVhbSBvZiB6ZXJvLXRlcm1pbmF0ZWQgc3RyaW5ncywK PiArICBob2xkaW5nIHRoZSBpbmRpdmlkdWFsIGxpbmUgbmFtZXMuCgoKSSdtIG5vdCBzdXJlIGJ1 dCBkb2VzIHRoaXMgbWVhbiB3ZSBkb24ndCBoYXZlIGEgZml4ZWQgbGVuZ3RoIG9mIGNvbmZpZyAK c3BhY2U/IE5lZWQgdG8gY2hlY2sgd2hldGhlciBpdCBjYW4gYnJpbmcgYW55IHRyb3VibGUgdG8g Cm1pZ3JhdGlvbihjb21wYXRpYmlsaXR5KS4KCgo+ICstIHVuc3BlY2lmaWVkIGZpZWxkcyBhcmUg cmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgYW5kIHNob3VsZCBiZSB6ZXJvLgo+ICsKPiArLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tCj4gK1ZpcnRxdWV1ZXMgYW5kIG1lc3NhZ2VzOgo+ICstLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0KPiArCj4gKy0gUXVldWUgIzA6IHRyYW5zbWlzc2lvbiBmcm9tIGhv c3QgdG8gZ3Vlc3QKPiArLSBRdWV1ZSAjMTogdHJhbnNtaXNzaW9uIGZyb20gZ3Vlc3QgdG8gaG9z dAoKClZpcnRpbyBiZWNhbWUgbW9yZSBhIHBvcHVsYXIgaW4gdGhlIGFyZWEgd2l0aG91dCB2aXJ0 dWFsaXphdGlvbi4gU28gSSAKdGhpbmsgaXQncyBiZXR0ZXIgdG8gdXNlICJkZXZpY2UvZHJpdmVy IiBpbnN0ZWFkIG9mICJob3N0L2d1ZXN0IiBoZXJlLgoKCj4gKwo+ICtUaGUgcXVldWVzIHRyYW5z cG9ydCBtZXNzYWdlcyBvZiB0aGUgc3RydWN0IHZpcnRpb19ncGlvX2V2ZW50Ogo+ICsKPiArTWVz c2FnZSBmb3JtYXQ6Cj4gKy0tLS0tLS0tLS0tLS0tLQo+ICsKPiArKy0tLS0tLS0tKy0tLS0tLS0t LS0rLS0tLS0tLS0tLS0tLS0tKwo+ICt8IE9mZnNldCB8IFR5cGUgICAgIHwgRGVzY3JpcHRpb24g ICB8Cj4gKys9PT09PT09PSs9PT09PT09PT09Kz09PT09PT09PT09PT09PSsKPiArfCAweDAwICAg fCB1aW50MTYgICB8IGV2ZW50IHR5cGUgICAgfAo+ICsrLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0t LS0tLS0tLS0tLS0rCj4gK3wgMHgwMiAgIHwgdWludDE2ICAgfCBsaW5lIGlkICAgICAgIHwKPiAr Ky0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tKwo+ICt8IDB4MDQgICB8IHVpbnQz MiAgIHwgdmFsdWUgICAgICAgICB8Cj4gKystLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0t LS0tLSsKCgpOb3QgYSBuYXRpdmUgc3BlYWtlciBidXQgZXZlbnQgc291bmRzIGxpa2Ugc29tZXRo aW5nIGRyaXZlciByZWFkIGZyb20gCmRldmljZS4gTG9va2luZyBhdCB0aGUgYmVsb3cgbGlzdHMs IG1vc3Qgb2YgdGhlbSBleGNlcHQgZm9yIApWSVJUSU9fR1BJT19FVl9IT1NUX0xFVkVMIGxvb2tz IG1vcmUgbGlrZSBhIGNvbW1hbmQuCgpBbm90aGVyIHF1ZXN0aW9uIGlzLCB3aGF0J3MgdGhlIGJl bmVmaXQgb2YgdW5pZnlpbmcgdGhlIG1lc3NhZ2UgZm9ybWF0IApvZiB0aGUgdHdvIHF1ZXVlcy4g RS5nIFZJUlRJT19HUElPX0VWX0hPU1RfTEVWRUwgY2FuIG9ubHkgd29ya3MgZnJvIHJ4cS4KCgo+ ICsKPiArTWVzc2FnZSB0eXBlczoKPiArLS0tLS0tLS0tLS0tLS0KPiArCj4gKystLS0tLS0tKy0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLSsKPiArfCBDb2RlICB8IFN5bWJvbCAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAo+ICsrPT09PT09PSs9PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09 PT09PT0rCj4gK3wgMHgwMSAgfCBWSVJUSU9fR1BJT19FVl9HVUVTVF9SRVFVRVNUICAgICAgICAg IHwgcmVxdWVzdCBncGlvIGxpbmUgICAgICAgICAgIHwKPiArKy0tLS0tLS0rLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t Kwo+ICt8IDB4MDIgIHwgVklSVElPX0dQSU9fRVZfR1VFU1RfRElSRUNUSU9OX0lOUFVUICB8IHNl dCBkaXJlY3Rpb24gdG8gaW5wdXQgICAgICB8Cj4gKystLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKPiAr fCAweDAzICB8IFZJUlRJT19HUElPX0VWX0dVRVNUX0RJUkVDVElPTl9PVVRQVVQgfCBzZXQgZGly ZWN0aW9uIHRvIG91dHB1dCAgICAgfAo+ICsrLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCj4gK3wgMHgw NCAgfCBWSVJUSU9fR1BJT19FVl9HVUVTVF9HRVRfRElSRUNUSU9OICAgIHwgcmVhZCBjdXJyZW50 IGRpcmVjdGlvbiAgICAgIHwKPiArKy0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwo+ICt8IDB4MDUgIHwg VklSVElPX0dQSU9fRVZfR1VFU1RfR0VUX1ZBTFVFICAgICAgICB8IHJlYWQgY3VycmVudCBsZXZl bCAgICAgICAgICB8Cj4gKystLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKPiArfCAweDA2ICB8IFZJUlRJ T19HUElPX0VWX0dVRVNUX1NFVF9WQUxVRSAgICAgICAgfCBzZXQgY3VycmVudCAob3V0KSBsZXZl bCAgICAgfAo+ICsrLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCj4gK3wgMHgxMSAgfCBWSVJUSU9fR1BJ T19FVl9IT1NUX0xFVkVMICAgICAgICAgICAgIHwgc3RhdGUgY2hhbmdlZCAoaG9zdC0+Z3Vlc3Qp IHwKPiArKy0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwo+ICsKCgpOb3QgZmFtaWxpYXIgd2l0aCBHUElP IGJ1dCBJIHdvbmRlciB0aGUgdmFsdWUgb2YgYSBzdGFuZGFsb25lIApWSVJUSU9fR1BJT19FVl9H VUVTVF9ESVJFQ1RJT05fSU5QVVQvT1VUUFVULiBDYW4gd2Ugc2ltcGx5IGltcGx5IHRoZW0gaW4g ClNFVC9HRVRfVkFMVUU/CgoKPiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQo+ICtEYXRhIGZsb3c6 Cj4gKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KPiArCj4gKy0gYWxsIG9wZXJhdGlvbnMsIGV4Y2Vw dCBgYFZJUlRJT19HUElPX0VWX0hPU1RfTEVWRUxgYCwgYXJlIGd1ZXN0LWluaXRpYXRlZAo+ICst IGhvc3QgcmVwbGllcyBgYFZJUlRJT19HUElPX0VWX0hPU1RfTEVWRUxgYCBPUidlZCB0byB0aGUg YGB0eXBlYGAgZmllbGQKPiArLSBgYFZJUlRJT19HUElPX0VWX0hPU1RfTEVWRUxgYCBpcyBvbmx5 IHNlbnQgYXN5bmNocm9uaWNhbGx5IGZyb20gaG9zdCB0byBndWVzdAo+ICstIGluIHJlcGxpZXMs IGEgbmVnYXRpdmUgYGB2YWx1ZWBgIGZpZWxkIGRlbm90ZXMgYW4gdW5peC1zdHlsZSBlcnJubyBj b2RlCgoKVmlydGlvIGlzIGluIGEgZGlmZmVyZW50IHNjb3BlLCBzbyB3ZSBuZWVkIHRvIGRlZmlu ZSB0aGUgZXJyb3IgY29kZSBvbiAKb3VyIG93bi4KCkUuZyBmb3IgdmlydGlvLW5ldCB3ZSBkZWZp bmU6CgoKI2RlZmluZSBWSVJUSU9fTkVUX09LwqDCoMKgwqAgMAojZGVmaW5lIFZJUlRJT19ORVRf RVJSwqDCoMKgIDEKCgo+ICstIHZhbGlkIGRpcmVjdGlvbiB2YWx1ZXMgYXJlOgo+ICsgICogMCA9 IG91dHB1dAo+ICsgICogMSA9IGlucHV0Cj4gKy0gdmFsaWQgbGluZSBzdGF0ZSB2YWx1ZXMgYXJl Ogo+ICsgICogMCA9IGluYWN0aXZlCj4gKyAgKiAxID0gYWN0aXZlCj4gKwo+ICtWSVJUSU9fR1BJ T19FVl9HVUVTVF9SRVFVRVNUCj4gKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KPiArCj4g Ky0gbm90aWZ5IHRoZSBob3N0IHRoYXQgZ2l2ZW4gbGluZSMgaXMgZ29pbmcgdG8gYmUgdXNlZAo+ ICstIHJlcXVlc3Q6Cj4gKyAgKiBgYGxpbmVgYCBmaWVsZDogbGluZSBudW1iZXIKPiArICAqIGBg dmFsdWVgYCBmaWVsZDogdW51c2VkCj4gKy0gcmVwbHk6Cj4gKyAgKiBgYHZhbHVlYGAgZmllbGQ6 IGVycm5vIGNvZGUgKDAgPSBzdWNjZXNzKQo+ICsKPiArVklSVElPX0dQSU9fRVZfR1VFU1RfRElS RUNUSU9OX0lOUFVUCj4gKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQo+ICsK PiArLSBzZXQgbGluZSBsaW5lIGRpcmVjdGlvbiB0byBpbnB1dAo+ICstIHJlcXVlc3Q6Cj4gKyAg KiBgYGxpbmVgYCBmaWVsZDogbGluZSBudW1iZXIKPiArICAqIGBgdmFsdWVgYCBmaWVsZDogdW51 c2VkCj4gKy0gcmVwbHk6IHZhbHVlIGZpZWxkIGhvbGRzIGVycm5vCj4gKyAgKiBgYHZhbHVlYGAg ZmllbGQ6IGVycm5vIGNvZGUgKDAgPSBzdWNjZXNzKQo+ICsKPiArVklSVElPX0dQSU9fRVZfR1VF U1RfRElSRUNUSU9OX09VVFBVVAo+ICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tCj4gKwo+ICstIHNldCBsaW5lIGRpcmVjdGlvbiB0byBvdXRwdXQgYW5kIGdpdmVuIGxpbmUg c3RhdGUKPiArLSByZXF1ZXN0Ogo+ICsgICogYGBsaW5lYGAgZmllbGQ6IGxpbmUgbnVtYmVyCj4g KyAgKiBgYHZhbHVlYGAgZmllbGQ6IG91dHB1dCBzdGF0ZSAoMD1pbmFjdGl2ZSwgMT1hY3RpdmUp Cj4gKy0gcmVwbHk6Cj4gKyAgKiBgYHZhbHVlYGAgZmllbGQ6IGhvbGRzIGVycm5vCj4gKwo+ICtW SVJUSU9fR1BJT19FVl9HVUVTVF9HRVRfRElSRUNUSU9OCj4gKy0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0KPiArCj4gKy0gcmV0cmlldmUgbGluZSBkaXJlY3Rpb24KPiArLSByZXF1 ZXN0Ogo+ICsgICogYGBsaW5lYGAgZmllbGQ6IGxpbmUgbnVtYmVyCj4gKyAgKiBgYHZhbHVlYGAg ZmllbGQ6IHVudXNlZAo+ICstIHJlcGx5Ogo+ICsgICogYGB2YWx1ZWBgIGZpZWxkOiBkaXJlY3Rp b24gKDA9b3V0cHV0LCAxPWlucHV0KSBvciBlcnJubyBjb2RlCj4gKwo+ICtWSVJUSU9fR1BJT19F Vl9HVUVTVF9HRVRfVkFMVUUKPiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCj4gKwo+ ICstIHJldHJpZXZlIGxpbmUgc3RhdGUgdmFsdWUKPiArLSByZXF1ZXN0Ogo+ICsgICogYGBsaW5l YGAgZmllbGQ6IGxpbmUgbnVtYmVyCj4gKyAgKiBgYHZhbHVlYGAgZmllbGQ6IHVudXNlZAo+ICst IHJlcGx5Ogo+ICsgICogYGB2YWx1ZWBgIGZpZWxkOiBsaW5lIHN0YXRlICgwPWluYWN0aXZlLCAx PWFjdGl2ZSkgb3IgZXJybm8gY29kZQo+ICsKPiArVklSVElPX0dQSU9fRVZfR1VFU1RfU0VUX1ZB TFVFCj4gKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQo+ICsKPiArLSBzZXQgbGluZSBz dGF0ZSB2YWx1ZSAob3V0cHV0IG9ubHkpCj4gKy0gcmVxdWVzdDoKPiArICAqIGBgbGluZWBgIGZp ZWxkOiBsaW5lIG51bWJlcgo+ICsgICogYGB2YWx1ZWBgIGZpZWxkOiBsaW5lIHN0YXRlICgwPWlu YWN0aXZlLCAxPWFjdGl2ZSkKPiArLSByZXBseToKPiArICAqIGBgdmFsdWVgYCBmaWVsZDogbmV3 IGxpbmUgc3RhdGUgb3IgZXJybm8gY29kZQo+ICsKPiArVklSVElPX0dQSU9fRVZfSE9TVF9MRVZF TAo+ICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCj4gKwo+ICstIGFzeW5jIG5vdGlmaWNhdGlv biBmcm9tIGhvc3QgdG8gZ3VlczogbGluZSBzdGF0ZSBjaGFuZ2VkCj4gKy0gYGBsaW5lYGAgZmll bGQ6IGxpbmUgbnVtYmVyCj4gKy0gYGB2YWx1ZWBgIGZpZWxkOiBuZXcgbGluZSBzdGF0ZSAoMD1p bmFjdGl2ZSwgMT1hY3RpdmUpCj4gZGlmZiAtLWdpdCBhL01BSU5UQUlORVJTIGIvTUFJTlRBSU5F UlMKPiBpbmRleCAyZGFhNmVlNjczZjcuLjJiNzRlMzkyNzViMyAxMDA2NDQKPiAtLS0gYS9NQUlO VEFJTkVSUwo+ICsrKyBiL01BSU5UQUlORVJTCj4gQEAgLTE4NTkyLDYgKzE4NTkyLDEyIEBAIEY6 CURvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvdmlydGlvZnMucnN0Cj4gICBGOglmcy9mdXNlL3Zp cnRpb19mcy5jCj4gICBGOglpbmNsdWRlL3VhcGkvbGludXgvdmlydGlvX2ZzLmgKPiAgIAo+ICtW SVJUSU8gR1BJTyBEUklWRVIKPiArTToJRW5yaWNvIFdlaWdlbHQsIG1ldHV4IElUIGNvbnN1bHQg PGluZm9AbWV0dXgubmV0Pgo+ICtTOglNYWludGFpbmVkCj4gK0Y6CWRyaXZlcnMvZ3Bpby9ncGlv LXZpcnRpby5jCj4gK0Y6CWluY2x1ZGUvdWFwaS9saW51eC92aXJ0aW9fZ3Bpby5oCj4gKwo+ICAg VklSVElPIEdQVSBEUklWRVIKPiAgIE06CURhdmlkIEFpcmxpZSA8YWlybGllZEBsaW51eC5pZT4K PiAgIE06CUdlcmQgSG9mZm1hbm4gPGtyYXhlbEByZWRoYXQuY29tPgo+IGRpZmYgLS1naXQgYS9k cml2ZXJzL2dwaW8vS2NvbmZpZyBiL2RyaXZlcnMvZ3Bpby9LY29uZmlnCj4gaW5kZXggMDE2MTll YjU4Mzk2Li43YTMzYWEzNDdkZmIgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9ncGlvL0tjb25maWcK PiArKysgYi9kcml2ZXJzL2dwaW8vS2NvbmZpZwo+IEBAIC0xNjE1LDYgKzE2MTUsMTUgQEAgY29u ZmlnIEdQSU9fTU9DS1VQCj4gICAJICB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9ncGlvL2dwaW8t bW9ja3VwLnNoLiBSZWZlcmVuY2UgdGhlIHVzYWdlIGluCj4gICAJICBpdC4KPiAgIAo+ICtjb25m aWcgR1BJT19WSVJUSU8KPiArCXRyaXN0YXRlICJWaXJ0SU8gR1BJTyBzdXBwb3J0Igo+ICsJZGVw ZW5kcyBvbiBWSVJUSU8KCgpMZXQncyB1c2Ugc2VsZWN0LCBzaW5jZSB0aGVyZSdzIG5vIHByb21w dCBmb3IgVklSVElPIGFuZCBpdCBkb2Vzbid0IGhhdmUgCmFueSBkZXBlbmRlbmNpZXMuCgoKPiAr CWhlbHAKPiArCSAgU2F5IFkgaGVyZSB0byBlbmFibGUgZ3Vlc3Qgc3VwcG9ydCBmb3IgdmlydGlv LWJhc2VkIEdQSU9zLgo+ICsKPiArCSAgVGhlc2UgdmlydHVhbCBHUElPcyBjYW4gYmUgcm91dGVk IHRvIHJlYWwgR1BJT3Mgb3IgYXR0YWNoZWQgdG8KPiArCSAgc2ltdWxhdG9ycyBvbiB0aGUgaG9z dCAocWVtdSkuCgoKSXQncyBiZXR0ZXIgdG8gYXZvaWQgdGFsa2luZyBob3N0IGFuZCBxZW11IGhl cmUgZm9yIG5ldyB2aXJ0aW8gZGV2aWNlcy4KCgo+ICsKPiAgIGVuZG1lbnUKPiAgIAo+ICAgZW5k aWYKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL01ha2VmaWxlIGIvZHJpdmVycy9ncGlvL01h a2VmaWxlCj4gaW5kZXggMDlkYWRhODBhYzM0Li4yYjEyZTc1YWYxMjMgMTAwNjQ0Cj4gLS0tIGEv ZHJpdmVycy9ncGlvL01ha2VmaWxlCj4gKysrIGIvZHJpdmVycy9ncGlvL01ha2VmaWxlCj4gQEAg LTE2MCw2ICsxNjAsNyBAQCBvYmotJChDT05GSUdfR1BJT19UV0w0MDMwKQkJKz0gZ3Bpby10d2w0 MDMwLm8KPiAgIG9iai0kKENPTkZJR19HUElPX1RXTDYwNDApCQkrPSBncGlvLXR3bDYwNDAubwo+ ICAgb2JqLSQoQ09ORklHX0dQSU9fVUNCMTQwMCkJCSs9IGdwaW8tdWNiMTQwMC5vCj4gICBvYmot JChDT05GSUdfR1BJT19VTklQSElFUikJCSs9IGdwaW8tdW5pcGhpZXIubwo+ICtvYmotJChDT05G SUdfR1BJT19WSVJUSU8pCQkrPSBncGlvLXZpcnRpby5vCj4gICBvYmotJChDT05GSUdfR1BJT19W RjYxMCkJCSs9IGdwaW8tdmY2MTAubwo+ICAgb2JqLSQoQ09ORklHX0dQSU9fVklQRVJCT0FSRCkJ CSs9IGdwaW8tdmlwZXJib2FyZC5vCj4gICBvYmotJChDT05GSUdfR1BJT19WUjQxWFgpCQkrPSBn cGlvLXZyNDF4eC5vCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLXZpcnRpby5jIGIv ZHJpdmVycy9ncGlvL2dwaW8tdmlydGlvLmMKPiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+IGluZGV4 IDAwMDAwMDAwMDAwMC4uZjFhYzQ3ZGEyNmI2Cj4gLS0tIC9kZXYvbnVsbAo+ICsrKyBiL2RyaXZl cnMvZ3Bpby9ncGlvLXZpcnRpby5jCj4gQEAgLTAsMCArMSwzMzIgQEAKPiArLy8gU1BEWC1MaWNl bnNlLUlkZW50aWZpZXI6IEdQTC0yLjArCj4gKwo+ICsvKgo+ICsgKiBHUElPIGRyaXZlciBmb3Ig dmlydGlvLWJhc2VkIHZpcnR1YWwgR1BJT3MKPiArICoKPiArICogQ29weXJpZ2h0IChDKSAyMDE4 IG1ldHV4IElUIGNvbnN1bHQKPiArICogQXV0aG9yOiBFbnJpY28gV2VpZ2VsdCwgbWV0dXggSVQg Y29uc3VsdCA8aW5mb0BtZXR1eC5uZXQ+Cj4gKyAqCj4gKyAqLwo+ICsKPiArI2luY2x1ZGUgPGxp bnV4L2Vyci5oPgo+ICsjaW5jbHVkZSA8bGludXgvZ3Bpby9kcml2ZXIuaD4KPiArI2luY2x1ZGUg PGxpbnV4L2lvLmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KPiArI2luY2x1ZGUgPGxp bnV4L21vZHVsZS5oPgo+ICsjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KPiArI2luY2x1ZGUg PGxpbnV4L3ZpcnRpb19jb25maWcuaD4KPiArI2luY2x1ZGUgPHVhcGkvbGludXgvdmlydGlvX2lk cy5oPgo+ICsjaW5jbHVkZSA8dWFwaS9saW51eC92aXJ0aW9fZ3Bpby5oPgo+ICsKPiArc3RydWN0 IHZpcnRpb19ncGlvX3ByaXYgewo+ICsJc3RydWN0IGdwaW9fY2hpcCBnYzsKPiArCXNwaW5sb2Nr X3QgdnFfbG9jazsKPiArCXNwaW5sb2NrX3Qgb3BfbG9jazsKPiArCXN0cnVjdCB2aXJ0aW9fZGV2 aWNlICp2ZGV2Owo+ICsJaW50IG51bV9ncGlvczsKPiArCWNoYXIgKm5hbWU7Cj4gKwlzdHJ1Y3Qg dmlydHF1ZXVlICp2cV9yeDsKPiArCXN0cnVjdCB2aXJ0cXVldWUgKnZxX3R4Owo+ICsJc3RydWN0 IHZpcnRpb19ncGlvX2V2ZW50IHJjdl9idWY7Cj4gKwlzdHJ1Y3QgdmlydGlvX2dwaW9fZXZlbnQg bGFzdDsKPiArCWludCBpcnFfYmFzZTsKPiArCXdhaXRfcXVldWVfaGVhZF90IHdhaXRxOwo+ICsJ dW5zaWduZWQgbG9uZyByZXBseV93YWl0Owo+ICt9Owo+ICsKPiArc3RhdGljIHZvaWQgdmlydGlv X2dwaW9fcHJlcGFyZV9pbmJ1ZihzdHJ1Y3QgdmlydGlvX2dwaW9fcHJpdiAqcHJpdikKPiArewo+ ICsJc3RydWN0IHNjYXR0ZXJsaXN0IHJjdl9zZzsKPiArCj4gKwlzZ19pbml0X29uZSgmcmN2X3Nn LCAmcHJpdi0+cmN2X2J1Ziwgc2l6ZW9mKHByaXYtPnJjdl9idWYpKTsKPiArCXZpcnRxdWV1ZV9h ZGRfaW5idWYocHJpdi0+dnFfcngsICZyY3Zfc2csIDEsICZwcml2LT5yY3ZfYnVmLAo+ICsJCQkg ICAgR0ZQX0tFUk5FTCk7Cj4gKwl2aXJ0cXVldWVfa2ljayhwcml2LT52cV9yeCk7Cj4gK30KPiAr Cj4gK3N0YXRpYyBpbnQgdmlydGlvX2dwaW9feG1pdChzdHJ1Y3QgdmlydGlvX2dwaW9fcHJpdiAq cHJpdiwgaW50IHR5cGUsCj4gKwkJCSAgICBpbnQgcGluLCBpbnQgdmFsdWUsIHN0cnVjdCB2aXJ0 aW9fZ3Bpb19ldmVudCAqZXYpCj4gK3sKPiArCXN0cnVjdCBzY2F0dGVybGlzdCBzZ1sxXTsKPiAr CWludCByZXQ7Cj4gKwl1bnNpZ25lZCBsb25nIGZsYWdzOwo+ICsKPiArCVdBUk5fT04oIWV2KTsK PiArCj4gKwlldi0+dHlwZSA9IHR5cGU7Cj4gKwlldi0+cGluID0gcGluOwo+ICsJZXYtPnZhbHVl ID0gdmFsdWU7Cj4gKwo+ICsJc2dfaW5pdF90YWJsZShzZywgMSk7Cj4gKwlzZ19zZXRfYnVmKCZz Z1swXSwgZXYsIHNpemVvZihzdHJ1Y3QgdmlydGlvX2dwaW9fZXZlbnQpKTsKPiArCj4gKwlzcGlu X2xvY2tfaXJxc2F2ZSgmcHJpdi0+dnFfbG9jaywgZmxhZ3MpOwo+ICsJcmV0ID0gdmlydHF1ZXVl X2FkZF9vdXRidWYocHJpdi0+dnFfdHgsIHNnLCBBUlJBWV9TSVpFKHNnKSwKPiArCQkJCSAgIHBy aXYsIEdGUF9LRVJORUwpOwo+ICsJaWYgKHJldCA8IDApIHsKPiArCQlkZXZfZXJyKCZwcml2LT52 ZGV2LT5kZXYsCj4gKwkJCSJ2aXJ0cXVldWVfYWRkX291dGJ1ZigpIGZhaWxlZDogJWRcbiIsIHJl dCk7Cj4gKwkJZ290byBvdXQ7CgoKU28gZXhjZXB0IGZvciB0aGUgZXJyb3IgbG9nLCB0aGUgZmFp bHVyZSBpcyBzaWxlbnRseSBpZ25vcmVkIGJ5IHRoZSAKY2FsbGVyLiBJcyB0aGlzIGludGVuZGVk PwoKCj4gKwl9Cj4gKwl2aXJ0cXVldWVfa2ljayhwcml2LT52cV90eCk7Cj4gKwo+ICtvdXQ6Cj4g KwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT52cV9sb2NrLCBmbGFncyk7Cj4gKwlyZXR1 cm4gMDsKPiArfQo+ICsKPiArc3RhdGljIGlubGluZSB2b2lkIHdha2V1cF9ldmVudChzdHJ1Y3Qg dmlydGlvX2dwaW9fcHJpdiAqcHJpdiwgaW50IGlkKQo+ICt7Cj4gKwlzZXRfYml0KGlkLCAmcHJp di0+cmVwbHlfd2FpdCk7Cj4gK30KPiArCj4gK3N0YXRpYyBpbmxpbmUgaW50IGNoZWNrX2V2ZW50 KHN0cnVjdCB2aXJ0aW9fZ3Bpb19wcml2ICpwcml2LCBpbnQgaWQpCj4gK3sKPiArCXJldHVybiB0 ZXN0X2JpdChpZCwgJnByaXYtPnJlcGx5X3dhaXQpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW5saW5l IHZvaWQgY2xlYXJfZXZlbnQoc3RydWN0IHZpcnRpb19ncGlvX3ByaXYgKnByaXYsIGludCBpZCkK PiArewo+ICsJY2xlYXJfYml0KGlkLCAmcHJpdi0+cmVwbHlfd2FpdCk7Cj4gK30KPiArCj4gK3N0 YXRpYyBpbnQgdmlydGlvX2dwaW9fcmVxKHN0cnVjdCB2aXJ0aW9fZ3Bpb19wcml2ICpwcml2LCBp bnQgdHlwZSwKPiArCQkJICAgaW50IHBpbiwgaW50IHZhbHVlKQo+ICt7Cj4gKwlzdHJ1Y3Qgdmly dGlvX2dwaW9fZXZlbnQgKmV2Cj4gKwkJPSBremFsbG9jKCZwcml2LT52ZGV2LT5kZXYsIHNpemVv ZihzdHJ1Y3QgdmlydGlvX2dwaW9fZXZlbnQpLAo+ICsJCQkgIEdGUF9LRVJORUwpOwo+ICsKPiAr CWlmICghZXYpCj4gKwkJcmV0dXJuIC1FTk9NRU07Cj4gKwo+ICsJY2xlYXJfZXZlbnQocHJpdiwg dHlwZSk7Cj4gKwl2aXJ0aW9fZ3Bpb194bWl0KHByaXYsIHR5cGUsIHBpbiwgdmFsdWUsIGV2KTsK PiArCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShwcml2LT53YWl0cSwgY2hlY2tfZXZlbnQocHJp diwgdHlwZSkpOwoKCklmIEkgcmVhZCB0aGUgY29kZSBjb3JyZWN0bHksIHRoaXMgZXhwZWN0cyB0 aGVyZSB3aWxsIGJlIGF0IG1vc3QgYSAKc2luZ2xlIHR5cGUgb2YgZXZlbnQgdGhhdCBjYW4gYmUg cHJvY2Vzc2VkIGF0IHRoZSBzYW1lIHRpbWUuIEUuZyBjYW4gCnVwcGVyIGxheWVyIHdhbnQgdG8g cmVhZCBmcm9tIGRpZmZlcmVudCBsaW5lcyBpbiBwYXJhbGxlbD8gSWYgeWVzLCB3ZSAKbmVlZCB0 byBkZWFsIHdpdGggdGhhdC4KCgo+ICsKPiArCWtmcmVlKCZwcml2LT52ZGV2LT5kZXYsIGV2KTsK PiArCj4gKwlyZXR1cm4gcHJpdi0+bGFzdC52YWx1ZTsKPiArfQo+ICsKPiArc3RhdGljIGludCB2 aXJ0aW9fZ3Bpb19kaXJlY3Rpb25faW5wdXQoc3RydWN0IGdwaW9fY2hpcCAqZ2MsCj4gKwkJCQkg ICAgICAgdW5zaWduZWQgaW50IHBpbikKPiArewo+ICsJcmV0dXJuIHZpcnRpb19ncGlvX3JlcShn cGlvY2hpcF9nZXRfZGF0YShnYyksCj4gKwkJCSAgICAgICBWSVJUSU9fR1BJT19FVl9HVUVTVF9E SVJFQ1RJT05fSU5QVVQsCj4gKwkJCSAgICAgICBwaW4sIDApOwo+ICt9Cj4gKwo+ICtzdGF0aWMg aW50IHZpcnRpb19ncGlvX2RpcmVjdGlvbl9vdXRwdXQoc3RydWN0IGdwaW9fY2hpcCAqZ2MsCj4g KwkJCQkJdW5zaWduZWQgaW50IHBpbiwgaW50IHZhbHVlKQo+ICt7Cj4gKwlyZXR1cm4gdmlydGlv X2dwaW9fcmVxKGdwaW9jaGlwX2dldF9kYXRhKGdjKSwKPiArCQkJICAgICAgIFZJUlRJT19HUElP X0VWX0dVRVNUX0RJUkVDVElPTl9PVVRQVVQsCj4gKwkJCSAgICAgICBwaW4sIHZhbHVlKTsKPiAr fQo+ICsKPiArc3RhdGljIGludCB2aXJ0aW9fZ3Bpb19nZXRfZGlyZWN0aW9uKHN0cnVjdCBncGlv X2NoaXAgKmdjLCB1bnNpZ25lZCBpbnQgcGluKQo+ICt7Cj4gKwlyZXR1cm4gdmlydGlvX2dwaW9f cmVxKGdwaW9jaGlwX2dldF9kYXRhKGdjKSwKPiArCQkJICAgICAgIFZJUlRJT19HUElPX0VWX0dV RVNUX0dFVF9ESVJFQ1RJT04sCj4gKwkJCSAgICAgICBwaW4sIDApOwo+ICt9Cj4gKwo+ICtzdGF0 aWMgdm9pZCB2aXJ0aW9fZ3Bpb19zZXQoc3RydWN0IGdwaW9fY2hpcCAqZ2MsCj4gKwkJCSAgICB1 bnNpZ25lZCBpbnQgcGluLCBpbnQgdmFsdWUpCj4gK3sKPiArCXZpcnRpb19ncGlvX3JlcShncGlv Y2hpcF9nZXRfZGF0YShnYyksCj4gKwkJCVZJUlRJT19HUElPX0VWX0dVRVNUX1NFVF9WQUxVRSwg cGluLCB2YWx1ZSk7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgdmlydGlvX2dwaW9fZ2V0KHN0cnVj dCBncGlvX2NoaXAgKmdjLAo+ICsJCQkgICB1bnNpZ25lZCBpbnQgcGluKQo+ICt7Cj4gKwlyZXR1 cm4gdmlydGlvX2dwaW9fcmVxKGdwaW9jaGlwX2dldF9kYXRhKGdjKSwKPiArCQkJICAgICAgIFZJ UlRJT19HUElPX0VWX0dVRVNUX0dFVF9WQUxVRSwgcGluLCAwKTsKPiArfQo+ICsKPiArc3RhdGlj IGludCB2aXJ0aW9fZ3Bpb19yZXF1ZXN0KHN0cnVjdCBncGlvX2NoaXAgKmdjLAo+ICsJCQkgICAg ICAgdW5zaWduZWQgaW50IHBpbikKPiArewo+ICsJcmV0dXJuIHZpcnRpb19ncGlvX3JlcShncGlv Y2hpcF9nZXRfZGF0YShnYyksCj4gKwkJCSAgICAgICBWSVJUSU9fR1BJT19FVl9HVUVTVF9SRVFV RVNULCBwaW4sIDApOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCB2aXJ0aW9fZ3Bpb19zaWduYWwo c3RydWN0IHZpcnRpb19ncGlvX3ByaXYgKnByaXYsIGludCBldmVudCwKPiArCQkJICAgICAgaW50 IHBpbiwgaW50IHZhbHVlKQo+ICt7Cj4gKwlpZiAocGluIDwgcHJpdi0+bnVtX2dwaW9zKQo+ICsJ CWdlbmVyaWNfaGFuZGxlX2lycShwcml2LT5pcnFfYmFzZSArIHBpbik7Cj4gK30KPiArCj4gK3N0 YXRpYyB2b2lkIHZpcnRpb19ncGlvX2RhdGFfcngoc3RydWN0IHZpcnRxdWV1ZSAqdnEpCj4gK3sK PiArCXN0cnVjdCB2aXJ0aW9fZ3Bpb19wcml2ICpwcml2ID0gdnEtPnZkZXYtPnByaXY7Cj4gKwl2 b2lkICpkYXRhOwo+ICsJdW5zaWduZWQgaW50IGxlbjsKPiArCXN0cnVjdCB2aXJ0aW9fZ3Bpb19l dmVudCAqZXY7Cj4gKwo+ICsJZGF0YSA9IHZpcnRxdWV1ZV9nZXRfYnVmKHByaXYtPnZxX3J4LCAm bGVuKTsKPiArCWlmICghZGF0YSB8fCAhbGVuKSB7Cj4gKwkJZGV2X3dhcm4oJnZxLT52ZGV2LT5k ZXYsICJSWCByZWNlaXZlZCBubyBkYXRhICEgJWRcbiIsIGxlbik7Cj4gKwkJcmV0dXJuOwo+ICsJ fQo+ICsKPiArCWV2ID0gZGF0YTsKPiArCVdBUk5fT04oZGF0YSAhPSAmcHJpdi0+cmN2X2J1Zik7 Cj4gKwo+ICsJbWVtY3B5KCZwcml2LT5sYXN0LCAmcHJpdi0+cmN2X2J1Ziwgc2l6ZW9mKHN0cnVj dCB2aXJ0aW9fZ3Bpb19ldmVudCkpOwo+ICsKPiArCXN3aXRjaCAoZXYtPnR5cGUpIHsKPiArCWNh c2UgVklSVElPX0dQSU9fRVZfSE9TVF9MRVZFTDoKPiArCQl2aXJ0aW9fZ3Bpb19zaWduYWwocHJp diwgZXYtPnR5cGUsIGV2LT5waW4sIGV2LT52YWx1ZSk7Cj4gKwkJYnJlYWs7Cj4gKwlkZWZhdWx0 Ogo+ICsJCXdha2V1cF9ldmVudChwcml2LCBldi0+dHlwZSAmIH5WSVJUSU9fR1BJT19FVl9SRVBM WSk7CgoKVGhpcyBsb29rcyBzdXNwaWNpb3VzLCBpdCBsb29rcyB0byBtZSB3aGF0IGlzIGRvbmUg aGVyZSBpcywgY29uc2lkZXIgd2UgCndhbnQgdG8gZG8gVklSVElPX0dQSU9fRVZfR1VFU1RfU0VU X1ZBTFVFCgoxKSBwdXQgdGhlIGV2ZW50IGluIHR4cSwgd2FpdAoyKSB0aGUgcmVzdWx0IGlzIHJl dHVybmVkIGZyb20gcnhxLCB3YWtldXAKCkl0IGxvb2tzIHRvIG1lIHRoaXMgaXMgcmFjeSBzaW5j ZSB0aGUgZGV2aWNlIHNob3VsZCBiZSBhYmxlIHRvIHByb2Nlc3MgYSAKYmF0Y2ggb2YgZGVzY3Jp cHRvcnMgYW5kIHRoZXJlJ3Mgbm8gZ3VhcmFudGVlIHRoYXQgdGhlIGRlc2NyaXB0b3IgaXMgCnBy b2Nlc3NlZCBpbiBvcmRlciBmcm9tIHRoZSB2aXJ0aW8gbGV2ZWwuCgpJIHdvbmRlciB3aHkgbm90 IGludHJvZHVjZSB0d28gdmlydHF1ZXVlczoKCjEpIGNvbW1hbmQgdnEKMikgZXZlbnQgdnEKCkFs bCBjb21tYW5kcyB3ZXJlIHNlbnQgdmlhIGNvbW1hbmQgdnEgYW5kIHRoZW4gZGV2aWNlIGNhbiB3 cml0ZSBiYWNrIHRvIAp0aGUgY29tbWFuZCBidWZmZXIgYXMgb3RoZXIgdmlydGlvIGRldmljZSBk aWQuIFRoZW4gdGhlcmUncyBubyB3b3JyaWVzIApvZiBiYXRjaGluZyBvciBvdXQgb2Ygb3JkZXIg Y29tcGxldGlvbi4KCgo+ICsJCWJyZWFrOwo+ICsJfQo+ICsJdmlydGlvX2dwaW9fcHJlcGFyZV9p bmJ1Zihwcml2KTsKCgpUaGlzIGFzc3VtZXMgYXQgbW9zdCBvbmUgZXZlbnQgY291bGQgYmUgZ2Vu ZXJhdGVkLCBpcyB0aGlzIGhvdyBHUElPIApkZXZpY2UgZXhwZWN0IHRvIGJlaGF2ZT8gSSB0aGlu ayBsZXZlbCBjb3VsZCBjaGFuZ2Ugc2V2ZXJhbCB0aW1lcy4KCgo+ICsJd2FrZV91cF9hbGwoJnBy aXYtPndhaXRxKTsKPiArfQo+ICsKPiArc3RhdGljIGludCB2aXJ0aW9fZ3Bpb19hbGxvY192cShz dHJ1Y3QgdmlydGlvX2dwaW9fcHJpdiAqcHJpdikKPiArewo+ICsJc3RydWN0IHZpcnRxdWV1ZSAq dnFzWzJdOwo+ICsJdnFfY2FsbGJhY2tfdCAqY2JzW10gPSB7Cj4gKwkJTlVMTCwKPiArCQl2aXJ0 aW9fZ3Bpb19kYXRhX3J4LAo+ICsJfTsKPiArCXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbmFt ZXNbXSA9IHsgImluIiwgIm91dCIsIH07Cj4gKwlpbnQgcmV0Owo+ICsKPiArCXJldCA9IHZpcnRp b19maW5kX3Zxcyhwcml2LT52ZGV2LCAyLCB2cXMsIGNicywgbmFtZXMsIE5VTEwpOwo+ICsJaWYg KHJldCkgewo+ICsJCWRldl9lcnIoJnByaXYtPnZkZXYtPmRldiwgImZhaWxlZCB0byBhbGxvYyB2 cXM6ICVkXG4iLCByZXQpOwo+ICsJCXJldHVybiByZXQ7Cj4gKwl9Cj4gKwo+ICsJcHJpdi0+dnFf cnggPSB2cXNbMF07Cj4gKwlwcml2LT52cV90eCA9IHZxc1sxXTsKPiArCj4gKwl2aXJ0aW9fZ3Bp b19wcmVwYXJlX2luYnVmKHByaXYpOwo+ICsKPiArCXZpcnRpb19jb25maWdfZW5hYmxlKHByaXYt PnZkZXYpOwo+ICsJdmlydHF1ZXVlX2VuYWJsZV9jYihwcml2LT52cV9yeCk7Cj4gKwl2aXJ0aW9f ZGV2aWNlX3JlYWR5KHByaXYtPnZkZXYpOwo+ICsKPiArCXJldHVybiAwOwo+ICt9Cj4gKwo+ICtz dGF0aWMgaW50IHZpcnRpb19ncGlvX3Byb2JlKHN0cnVjdCB2aXJ0aW9fZGV2aWNlICp2ZGV2KQo+ ICt7Cj4gKwlzdHJ1Y3QgdmlydGlvX2dwaW9fcHJpdiAqcHJpdjsKPiArCXN0cnVjdCB2aXJ0aW9f Z3Bpb19jb25maWcgY2YgPSB7fTsKPiArCWNoYXIgKm5hbWVfYnVmZmVyOwo+ICsJY29uc3QgY2hh ciAqKmdwaW9fbmFtZXMgPSBOVUxMOwo+ICsJc3RydWN0IGRldmljZSAqZGV2ID0gJnZkZXYtPmRl djsKPiArCj4gKwlwcml2ID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpwcml2KSwgR0ZQX0tF Uk5FTCk7Cj4gKwlpZiAoIXByaXYpCj4gKwkJcmV0dXJuIC1FTk9NRU07CgoKSXMgZGV2cmVzIGd1 YXJhbnRlZWQgdG8gYmUgZW5hYmxlZCBoZXJlPwoKVGhhbmtzCgoKX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX18KbGludXgtcmlzY3YgbWFpbGluZyBsaXN0Cmxp bnV4LXJpc2N2QGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcv bWFpbG1hbi9saXN0aW5mby9saW51eC1yaXNjdgo= 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.0 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,WEIRD_QUOTING 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 6E54CC433FE for ; Fri, 4 Dec 2020 03:36:03 +0000 (UTC) Received: from fraxinus.osuosl.org (smtp4.osuosl.org [140.211.166.137]) (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 8BAFB22513 for ; Fri, 4 Dec 2020 03:36:02 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 8BAFB22513 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 fraxinus.osuosl.org (Postfix) with ESMTP id DE2FF8777A; Fri, 4 Dec 2020 03:36:01 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from fraxinus.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id yMXvQUIH2LEI; Fri, 4 Dec 2020 03:35:59 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by fraxinus.osuosl.org (Postfix) with ESMTP id EF49C876CB; Fri, 4 Dec 2020 03:35:58 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id D3AE5C163C; Fri, 4 Dec 2020 03:35:58 +0000 (UTC) Received: from hemlock.osuosl.org (smtp2.osuosl.org [140.211.166.133]) by lists.linuxfoundation.org (Postfix) with ESMTP id C2841C0FA7 for ; Fri, 4 Dec 2020 03:35:57 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by hemlock.osuosl.org (Postfix) with ESMTP id B0A9487B8A for ; Fri, 4 Dec 2020 03:35:57 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from hemlock.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id ibvuhb21ardK for ; Fri, 4 Dec 2020 03:35:56 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [63.128.21.124]) by hemlock.osuosl.org (Postfix) with ESMTPS id C0D5587B88 for ; Fri, 4 Dec 2020 03:35:55 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1607052954; 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=+SHlFygzZY7YSv6BaslP2KSyFm5bOqMAODf6huuujZE=; b=aYl4407OE50w8i/Ci21KMrV+CWNx6p/7TpwiCOt8f5lTszd7f6rc5tXGRr6QnH6j5aMfGb booerGd53a4Av3yXLTiZiOkAjt23ju6ySzlNqac1OkK52dsfBfhFPEOSAk3DUSJZh8Z2E5 4L5PYhKl4rfgWy+YVDNcGnRJfo1fKDs= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-64-7ik0mQkaPTSTUuwXXojHGw-1; Thu, 03 Dec 2020 22:35:52 -0500 X-MC-Unique: 7ik0mQkaPTSTUuwXXojHGw-1 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id E5569180A087; Fri, 4 Dec 2020 03:35:50 +0000 (UTC) Received: from [10.72.12.116] (ovpn-12-116.pek2.redhat.com [10.72.12.116]) by smtp.corp.redhat.com (Postfix) with ESMTP id 554DE5D9CA; Fri, 4 Dec 2020 03:35:43 +0000 (UTC) Subject: Re: [PATCH v2 2/2] drivers: gpio: add virtio-gpio guest driver To: "Enrico Weigelt, metux IT consult" , linux-kernel@vger.kernel.org References: <20201203191135.21576-1-info@metux.net> <20201203191135.21576-2-info@metux.net> From: Jason Wang Message-ID: <8209ce55-a4aa-f256-b9b9-f7eb3cac877b@redhat.com> Date: Fri, 4 Dec 2020 11:35:40 +0800 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.10.0 MIME-Version: 1.0 In-Reply-To: <20201203191135.21576-2-info@metux.net> Content-Language: en-US X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 Cc: corbet@lwn.net, mst@redhat.com, linus.walleij@linaro.org, linux-doc@vger.kernel.org, virtualization@lists.linux-foundation.org, bgolaszewski@baylibre.com, linux-gpio@vger.kernel.org, linux-riscv@lists.infradead.org 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" Ck9uIDIwMjAvMTIvNCDkuIrljYgzOjExLCBFbnJpY28gV2VpZ2VsdCwgbWV0dXggSVQgY29uc3Vs dCB3cm90ZToKPiBJbnRyb2R1Y2luZyBuZXcgZ3BpbyBkcml2ZXIgZm9yIHZpcnR1YWwgR1BJTyBk ZXZpY2VzIHZpYSB2aXJ0aW8uCj4KPiBUaGUgZHJpdmVyIGFsbG93cyByb3V0aW5nIGdwaW8gY29u dHJvbCBpbnRvIFZNIGd1ZXN0cywgZWcuIGJyaWdkaW5nCj4gdmlydHVhbCBncGlvcyB0byBzcGVj aWZpYyBob3N0IGdwaW9zLCBvciBhdHRhY2hpbmcgc2ltdWxhdG9ycyBmb3IKPiBhdXRvbWF0aWMg YXBwbGljYXRpb24gdGVzdGluZy4KPgo+IENoYW5nZXMgdjI6Cj4gICAgICAqIGZpeGVkIHVhcGkg aGVhZGVyIGxpY2Vuc2UKPiAgICAgICogc29ydGVkIGluY2x1ZGUncwo+ICAgICAgKiBmaXhlZCBm b3JtYXR0aW5nCj4gICAgICAqIGZpeGVkIHVubmVlZGVkIGRldm0gYWxsb2NhdGlvbiAtIHBsYWlu IGt6YWxsb2Mva2ZyZWUgaXMgZW5vdWdoCj4gICAgICAqIGZpeGVkIG1pc3NpbmcgZGV2bV9remFs bG9jIGZhaWwgY2hlY2sKPiAgICAgICogdXNlIGRldm1fa2NhbGxvYygpIGZvciBhcnJheSBhbGxv Y2F0aW9uCj4gICAgICAqIGFkZGVkIHZpcnRpby1ncGlvIHByb3RvY29sIHNwZWNpZmljYXRpb24K Pgo+IFNpZ25lZC1vZmYtYnk6IEVucmljbyBXZWlnZWx0LCBtZXR1eCBJVCBjb25zdWx0IDxpbmZv QG1ldHV4Lm5ldD4KPiAtLS0KPiAgIERvY3VtZW50YXRpb24vZ3Bpby92aXJ0aW8tZ3Bpby5yc3Qg fCAxNzYgKysrKysrKysrKysrKysrKysrKysKPiAgIE1BSU5UQUlORVJTICAgICAgICAgICAgICAg ICAgICAgICAgfCAgIDYgKwo+ICAgZHJpdmVycy9ncGlvL0tjb25maWcgICAgICAgICAgICAgICB8 ICAgOSArCj4gICBkcml2ZXJzL2dwaW8vTWFrZWZpbGUgICAgICAgICAgICAgIHwgICAxICsKPiAg IGRyaXZlcnMvZ3Bpby9ncGlvLXZpcnRpby5jICAgICAgICAgfCAzMzIgKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKwo+ICAgaW5jbHVkZS91YXBpL2xpbnV4L3ZpcnRpb19ncGlv LmggICB8ICAzOSArKysrKwo+ICAgaW5jbHVkZS91YXBpL2xpbnV4L3ZpcnRpb19pZHMuaCAgICB8 ICAgMSArCj4gICA3IGZpbGVzIGNoYW5nZWQsIDU2NCBpbnNlcnRpb25zKCspCj4gICBjcmVhdGUg bW9kZSAxMDA2NDQgRG9jdW1lbnRhdGlvbi9ncGlvL3ZpcnRpby1ncGlvLnJzdAo+ICAgY3JlYXRl IG1vZGUgMTAwNjQ0IGRyaXZlcnMvZ3Bpby9ncGlvLXZpcnRpby5jCj4gICBjcmVhdGUgbW9kZSAx MDA2NDQgaW5jbHVkZS91YXBpL2xpbnV4L3ZpcnRpb19ncGlvLmgKPgo+IGRpZmYgLS1naXQgYS9E b2N1bWVudGF0aW9uL2dwaW8vdmlydGlvLWdwaW8ucnN0IGIvRG9jdW1lbnRhdGlvbi9ncGlvL3Zp cnRpby1ncGlvLnJzdAo+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gaW5kZXggMDAwMDAwMDAwMDAw Li4wNDY0MmJlMDdiOTYKPiAtLS0gL2Rldi9udWxsCj4gKysrIGIvRG9jdW1lbnRhdGlvbi9ncGlv L3ZpcnRpby1ncGlvLnJzdAo+IEBAIC0wLDAgKzEsMTc2IEBACj4gKyIiIiIiIiIiIiIiIiIiIiIi Cj4gK1ZpcnRpby1HUElPIHByb3RvY29sIHNwZWNpZmljYXRpb24KPiArIiIiIiIiIiIiIiIiIiIi IiIKPiArLi4uLi4uLi4uLi4KPiArU3BlY2lmaWNhdGlvbiBmb3IgdmlydGlvLWJhc2VkIHZpcnRp dWFsIEdQSU8gZGV2aWNlcwo+ICsuLi4uLi4uLi4uLgo+ICsKCgpJcyB0aGUgcGxhbiB0byBrZWVw IHRoaXMgZG9jIHN5bmNlZCB3aXRoIHRoZSBvbmUgaW4gdGhlIHZpcnRpbyAKc3BlY2lmaWNhdGlv bj8KCgo+ICsrLS0tLS0tLS0tLS0tCj4gKytWZXJzaW9uXyAxLjAKPiArKy0tLS0tLS0tLS0tLQo+ ICsKPiArPT09PT09PT09PT09PT09PT09PQo+ICtHZW5lcmFsCj4gKz09PT09PT09PT09PT09PT09 PT0KPiArCj4gK1RoZSB2aXJ0aW8tZ3BpbyBwcm90b2NvbCBwcm92aWRlcyBhY2Nlc3MgdG8gZ2Vu ZXJhbCBwdXJwb3NlIElPIGRldmljZXMKPiArdG8gdmlydHVhbCBtYWNoaW5lIGd1ZXN0cy4gVGhl c2UgdmlydHVhbGl6ZWQgR1BJT3MgY291bGQgYmUgZWl0aGVyIHByb3ZpZGVkCj4gK2J5IHNvbWUg c2ltdWxhdG9yIChlZy4gdmlydHVhbCBISUwpLCByb3V0ZWQgdG8gc29tZSBleHRlcm5hbCBkZXZp Y2Ugb3IKPiArcm91dGVkIHRvIHJlYWwgR1BJT3Mgb24gdGhlIGhvc3QgKGVnLiB2aXJ0dWFsaXpl ZCBlbWJlZGRlZCBhcHBsaWNhdGlvbnMpLgo+ICsKPiArSW5zdGVhZCBvZiBzaW11bGF0aW5nIHNv bWUgZXhpc3RpbmcgcmVhbCBHUElPIGNoaXAgd2l0aGluIGFuIFZNTSwgdGhpcwo+ICtwcm90b2Nv bCBwcm92aWRlcyBhbiBoYXJkd2FyZSBpbmRlcGVuZGVudCBpbnRlcmZhY2UgYmV0d2VlbiBob3N0 IGFuZCBndWVzdAo+ICt0aGF0IHNvbGVseSByZWxpZXMgb24gYW4gYWN0aXZlIHZpcnRpbyBjb25u ZWN0aW9uIChubyBtYXR0ZXIgd2hpY2ggdHJhbnNwb3J0Cj4gK2FjdHVhbGx5IHVzZWQpLCBubyBv dGhlciBidXNlcyBvciBhZGRpdGlvbmFsIHBsYXRmb3JtIGRyaXZlciBsb2dpYyByZXF1aXJlZC4K PiArCj4gKz09PT09PT09PT09PT09PT09PT0KPiArUHJvdG9jb2wgbGF5b3V0Cj4gKz09PT09PT09 PT09PT09PT09PT0KPiArCj4gKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KPiArQ29uZmlndXJhdGlv biBzcGFjZQo+ICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tCj4gKwo+ICsrLS0tLS0tLS0rLS0tLS0t LS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwo+ICt8IE9mZnNldCB8IFR5cGUg ICAgIHwgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgfAo+ICsrPT09PT09PT0rPT09PT09 PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kwo+ICt8IDB4MDAgICB8IHVpbnQ4 ICAgIHwgdmVyc2lvbiAgICAgICAgICAgICAgICAgICAgICAgfAo+ICsrLS0tLS0tLS0rLS0tLS0t LS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwo+ICt8IDB4MDIgICB8IHVpbnQx NiAgIHwgbnVtYmVyIG9mIEdQSU8gbGluZXMgICAgICAgICAgfAo+ICsrLS0tLS0tLS0rLS0tLS0t LS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwo+ICt8IDB4MDQgICB8IHVpbnQz MiAgIHwgc2l6ZSBvZiBncGlvIG5hbWUgYmxvY2sgICAgICAgfAo+ICsrLS0tLS0tLS0rLS0tLS0t LS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwo+ICt8IDB4MjAgICB8IGNoYXJb MzJdIHwgZGV2aWNlIG5hbWUgKDAtdGVybWluYXRlZCkgICAgfAo+ICsrLS0tLS0tLS0rLS0tLS0t LS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwo+ICt8IDB4NDAgICB8IGNoYXJb XSAgIHwgbGluZSBuYW1lcyBibG9jayAgICAgICAgICAgICAgfAo+ICsrLS0tLS0tLS0rLS0tLS0t LS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwo+ICsKCgpJIHRoaW5rIGl0J3Mg YmV0dGVyIHRvIHVzZSB1OCBvdCB1aW50OF90IGhlcmUuR2l0IGdyZXAgdG9sZCBtZSB0aGUgCmZv cm1lciBpcyBtb3JlIHBvcHVsYXIgdW5kZXIgRG9jdW1lbnRhdGlvbi8uCgoKPiArLSBmb3IgdmVy c2lvbiBmaWVsZCBjdXJyZW50bHkgb25seSB2YWx1ZSAxIHN1cHBvcnRlZC4KPiArLSB0aGUgbGlu ZSBuYW1lcyBibG9jayBob2xkcyBhIHN0cmVhbSBvZiB6ZXJvLXRlcm1pbmF0ZWQgc3RyaW5ncywK PiArICBob2xkaW5nIHRoZSBpbmRpdmlkdWFsIGxpbmUgbmFtZXMuCgoKSSdtIG5vdCBzdXJlIGJ1 dCBkb2VzIHRoaXMgbWVhbiB3ZSBkb24ndCBoYXZlIGEgZml4ZWQgbGVuZ3RoIG9mIGNvbmZpZyAK c3BhY2U/IE5lZWQgdG8gY2hlY2sgd2hldGhlciBpdCBjYW4gYnJpbmcgYW55IHRyb3VibGUgdG8g Cm1pZ3JhdGlvbihjb21wYXRpYmlsaXR5KS4KCgo+ICstIHVuc3BlY2lmaWVkIGZpZWxkcyBhcmUg cmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgYW5kIHNob3VsZCBiZSB6ZXJvLgo+ICsKPiArLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tCj4gK1ZpcnRxdWV1ZXMgYW5kIG1lc3NhZ2VzOgo+ICstLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0KPiArCj4gKy0gUXVldWUgIzA6IHRyYW5zbWlzc2lvbiBmcm9tIGhv c3QgdG8gZ3Vlc3QKPiArLSBRdWV1ZSAjMTogdHJhbnNtaXNzaW9uIGZyb20gZ3Vlc3QgdG8gaG9z dAoKClZpcnRpbyBiZWNhbWUgbW9yZSBhIHBvcHVsYXIgaW4gdGhlIGFyZWEgd2l0aG91dCB2aXJ0 dWFsaXphdGlvbi4gU28gSSAKdGhpbmsgaXQncyBiZXR0ZXIgdG8gdXNlICJkZXZpY2UvZHJpdmVy IiBpbnN0ZWFkIG9mICJob3N0L2d1ZXN0IiBoZXJlLgoKCj4gKwo+ICtUaGUgcXVldWVzIHRyYW5z cG9ydCBtZXNzYWdlcyBvZiB0aGUgc3RydWN0IHZpcnRpb19ncGlvX2V2ZW50Ogo+ICsKPiArTWVz c2FnZSBmb3JtYXQ6Cj4gKy0tLS0tLS0tLS0tLS0tLQo+ICsKPiArKy0tLS0tLS0tKy0tLS0tLS0t LS0rLS0tLS0tLS0tLS0tLS0tKwo+ICt8IE9mZnNldCB8IFR5cGUgICAgIHwgRGVzY3JpcHRpb24g ICB8Cj4gKys9PT09PT09PSs9PT09PT09PT09Kz09PT09PT09PT09PT09PSsKPiArfCAweDAwICAg fCB1aW50MTYgICB8IGV2ZW50IHR5cGUgICAgfAo+ICsrLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0t LS0tLS0tLS0tLS0rCj4gK3wgMHgwMiAgIHwgdWludDE2ICAgfCBsaW5lIGlkICAgICAgIHwKPiAr Ky0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tKwo+ICt8IDB4MDQgICB8IHVpbnQz MiAgIHwgdmFsdWUgICAgICAgICB8Cj4gKystLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0t LS0tLSsKCgpOb3QgYSBuYXRpdmUgc3BlYWtlciBidXQgZXZlbnQgc291bmRzIGxpa2Ugc29tZXRo aW5nIGRyaXZlciByZWFkIGZyb20gCmRldmljZS4gTG9va2luZyBhdCB0aGUgYmVsb3cgbGlzdHMs IG1vc3Qgb2YgdGhlbSBleGNlcHQgZm9yIApWSVJUSU9fR1BJT19FVl9IT1NUX0xFVkVMIGxvb2tz IG1vcmUgbGlrZSBhIGNvbW1hbmQuCgpBbm90aGVyIHF1ZXN0aW9uIGlzLCB3aGF0J3MgdGhlIGJl bmVmaXQgb2YgdW5pZnlpbmcgdGhlIG1lc3NhZ2UgZm9ybWF0IApvZiB0aGUgdHdvIHF1ZXVlcy4g RS5nIFZJUlRJT19HUElPX0VWX0hPU1RfTEVWRUwgY2FuIG9ubHkgd29ya3MgZnJvIHJ4cS4KCgo+ ICsKPiArTWVzc2FnZSB0eXBlczoKPiArLS0tLS0tLS0tLS0tLS0KPiArCj4gKystLS0tLS0tKy0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLSsKPiArfCBDb2RlICB8IFN5bWJvbCAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAo+ICsrPT09PT09PSs9PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09 PT09PT0rCj4gK3wgMHgwMSAgfCBWSVJUSU9fR1BJT19FVl9HVUVTVF9SRVFVRVNUICAgICAgICAg IHwgcmVxdWVzdCBncGlvIGxpbmUgICAgICAgICAgIHwKPiArKy0tLS0tLS0rLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t Kwo+ICt8IDB4MDIgIHwgVklSVElPX0dQSU9fRVZfR1VFU1RfRElSRUNUSU9OX0lOUFVUICB8IHNl dCBkaXJlY3Rpb24gdG8gaW5wdXQgICAgICB8Cj4gKystLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKPiAr fCAweDAzICB8IFZJUlRJT19HUElPX0VWX0dVRVNUX0RJUkVDVElPTl9PVVRQVVQgfCBzZXQgZGly ZWN0aW9uIHRvIG91dHB1dCAgICAgfAo+ICsrLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCj4gK3wgMHgw NCAgfCBWSVJUSU9fR1BJT19FVl9HVUVTVF9HRVRfRElSRUNUSU9OICAgIHwgcmVhZCBjdXJyZW50 IGRpcmVjdGlvbiAgICAgIHwKPiArKy0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwo+ICt8IDB4MDUgIHwg VklSVElPX0dQSU9fRVZfR1VFU1RfR0VUX1ZBTFVFICAgICAgICB8IHJlYWQgY3VycmVudCBsZXZl bCAgICAgICAgICB8Cj4gKystLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKPiArfCAweDA2ICB8IFZJUlRJ T19HUElPX0VWX0dVRVNUX1NFVF9WQUxVRSAgICAgICAgfCBzZXQgY3VycmVudCAob3V0KSBsZXZl bCAgICAgfAo+ICsrLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCj4gK3wgMHgxMSAgfCBWSVJUSU9fR1BJ T19FVl9IT1NUX0xFVkVMICAgICAgICAgICAgIHwgc3RhdGUgY2hhbmdlZCAoaG9zdC0+Z3Vlc3Qp IHwKPiArKy0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwo+ICsKCgpOb3QgZmFtaWxpYXIgd2l0aCBHUElP IGJ1dCBJIHdvbmRlciB0aGUgdmFsdWUgb2YgYSBzdGFuZGFsb25lIApWSVJUSU9fR1BJT19FVl9H VUVTVF9ESVJFQ1RJT05fSU5QVVQvT1VUUFVULiBDYW4gd2Ugc2ltcGx5IGltcGx5IHRoZW0gaW4g ClNFVC9HRVRfVkFMVUU/CgoKPiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQo+ICtEYXRhIGZsb3c6 Cj4gKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KPiArCj4gKy0gYWxsIG9wZXJhdGlvbnMsIGV4Y2Vw dCBgYFZJUlRJT19HUElPX0VWX0hPU1RfTEVWRUxgYCwgYXJlIGd1ZXN0LWluaXRpYXRlZAo+ICst IGhvc3QgcmVwbGllcyBgYFZJUlRJT19HUElPX0VWX0hPU1RfTEVWRUxgYCBPUidlZCB0byB0aGUg YGB0eXBlYGAgZmllbGQKPiArLSBgYFZJUlRJT19HUElPX0VWX0hPU1RfTEVWRUxgYCBpcyBvbmx5 IHNlbnQgYXN5bmNocm9uaWNhbGx5IGZyb20gaG9zdCB0byBndWVzdAo+ICstIGluIHJlcGxpZXMs IGEgbmVnYXRpdmUgYGB2YWx1ZWBgIGZpZWxkIGRlbm90ZXMgYW4gdW5peC1zdHlsZSBlcnJubyBj b2RlCgoKVmlydGlvIGlzIGluIGEgZGlmZmVyZW50IHNjb3BlLCBzbyB3ZSBuZWVkIHRvIGRlZmlu ZSB0aGUgZXJyb3IgY29kZSBvbiAKb3VyIG93bi4KCkUuZyBmb3IgdmlydGlvLW5ldCB3ZSBkZWZp bmU6CgoKI2RlZmluZSBWSVJUSU9fTkVUX09LwqDCoMKgwqAgMAojZGVmaW5lIFZJUlRJT19ORVRf RVJSwqDCoMKgIDEKCgo+ICstIHZhbGlkIGRpcmVjdGlvbiB2YWx1ZXMgYXJlOgo+ICsgICogMCA9 IG91dHB1dAo+ICsgICogMSA9IGlucHV0Cj4gKy0gdmFsaWQgbGluZSBzdGF0ZSB2YWx1ZXMgYXJl Ogo+ICsgICogMCA9IGluYWN0aXZlCj4gKyAgKiAxID0gYWN0aXZlCj4gKwo+ICtWSVJUSU9fR1BJ T19FVl9HVUVTVF9SRVFVRVNUCj4gKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KPiArCj4g Ky0gbm90aWZ5IHRoZSBob3N0IHRoYXQgZ2l2ZW4gbGluZSMgaXMgZ29pbmcgdG8gYmUgdXNlZAo+ ICstIHJlcXVlc3Q6Cj4gKyAgKiBgYGxpbmVgYCBmaWVsZDogbGluZSBudW1iZXIKPiArICAqIGBg dmFsdWVgYCBmaWVsZDogdW51c2VkCj4gKy0gcmVwbHk6Cj4gKyAgKiBgYHZhbHVlYGAgZmllbGQ6 IGVycm5vIGNvZGUgKDAgPSBzdWNjZXNzKQo+ICsKPiArVklSVElPX0dQSU9fRVZfR1VFU1RfRElS RUNUSU9OX0lOUFVUCj4gKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQo+ICsK PiArLSBzZXQgbGluZSBsaW5lIGRpcmVjdGlvbiB0byBpbnB1dAo+ICstIHJlcXVlc3Q6Cj4gKyAg KiBgYGxpbmVgYCBmaWVsZDogbGluZSBudW1iZXIKPiArICAqIGBgdmFsdWVgYCBmaWVsZDogdW51 c2VkCj4gKy0gcmVwbHk6IHZhbHVlIGZpZWxkIGhvbGRzIGVycm5vCj4gKyAgKiBgYHZhbHVlYGAg ZmllbGQ6IGVycm5vIGNvZGUgKDAgPSBzdWNjZXNzKQo+ICsKPiArVklSVElPX0dQSU9fRVZfR1VF U1RfRElSRUNUSU9OX09VVFBVVAo+ICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tCj4gKwo+ICstIHNldCBsaW5lIGRpcmVjdGlvbiB0byBvdXRwdXQgYW5kIGdpdmVuIGxpbmUg c3RhdGUKPiArLSByZXF1ZXN0Ogo+ICsgICogYGBsaW5lYGAgZmllbGQ6IGxpbmUgbnVtYmVyCj4g KyAgKiBgYHZhbHVlYGAgZmllbGQ6IG91dHB1dCBzdGF0ZSAoMD1pbmFjdGl2ZSwgMT1hY3RpdmUp Cj4gKy0gcmVwbHk6Cj4gKyAgKiBgYHZhbHVlYGAgZmllbGQ6IGhvbGRzIGVycm5vCj4gKwo+ICtW SVJUSU9fR1BJT19FVl9HVUVTVF9HRVRfRElSRUNUSU9OCj4gKy0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0KPiArCj4gKy0gcmV0cmlldmUgbGluZSBkaXJlY3Rpb24KPiArLSByZXF1 ZXN0Ogo+ICsgICogYGBsaW5lYGAgZmllbGQ6IGxpbmUgbnVtYmVyCj4gKyAgKiBgYHZhbHVlYGAg ZmllbGQ6IHVudXNlZAo+ICstIHJlcGx5Ogo+ICsgICogYGB2YWx1ZWBgIGZpZWxkOiBkaXJlY3Rp b24gKDA9b3V0cHV0LCAxPWlucHV0KSBvciBlcnJubyBjb2RlCj4gKwo+ICtWSVJUSU9fR1BJT19F Vl9HVUVTVF9HRVRfVkFMVUUKPiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCj4gKwo+ ICstIHJldHJpZXZlIGxpbmUgc3RhdGUgdmFsdWUKPiArLSByZXF1ZXN0Ogo+ICsgICogYGBsaW5l YGAgZmllbGQ6IGxpbmUgbnVtYmVyCj4gKyAgKiBgYHZhbHVlYGAgZmllbGQ6IHVudXNlZAo+ICst IHJlcGx5Ogo+ICsgICogYGB2YWx1ZWBgIGZpZWxkOiBsaW5lIHN0YXRlICgwPWluYWN0aXZlLCAx PWFjdGl2ZSkgb3IgZXJybm8gY29kZQo+ICsKPiArVklSVElPX0dQSU9fRVZfR1VFU1RfU0VUX1ZB TFVFCj4gKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQo+ICsKPiArLSBzZXQgbGluZSBz dGF0ZSB2YWx1ZSAob3V0cHV0IG9ubHkpCj4gKy0gcmVxdWVzdDoKPiArICAqIGBgbGluZWBgIGZp ZWxkOiBsaW5lIG51bWJlcgo+ICsgICogYGB2YWx1ZWBgIGZpZWxkOiBsaW5lIHN0YXRlICgwPWlu YWN0aXZlLCAxPWFjdGl2ZSkKPiArLSByZXBseToKPiArICAqIGBgdmFsdWVgYCBmaWVsZDogbmV3 IGxpbmUgc3RhdGUgb3IgZXJybm8gY29kZQo+ICsKPiArVklSVElPX0dQSU9fRVZfSE9TVF9MRVZF TAo+ICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCj4gKwo+ICstIGFzeW5jIG5vdGlmaWNhdGlv biBmcm9tIGhvc3QgdG8gZ3VlczogbGluZSBzdGF0ZSBjaGFuZ2VkCj4gKy0gYGBsaW5lYGAgZmll bGQ6IGxpbmUgbnVtYmVyCj4gKy0gYGB2YWx1ZWBgIGZpZWxkOiBuZXcgbGluZSBzdGF0ZSAoMD1p bmFjdGl2ZSwgMT1hY3RpdmUpCj4gZGlmZiAtLWdpdCBhL01BSU5UQUlORVJTIGIvTUFJTlRBSU5F UlMKPiBpbmRleCAyZGFhNmVlNjczZjcuLjJiNzRlMzkyNzViMyAxMDA2NDQKPiAtLS0gYS9NQUlO VEFJTkVSUwo+ICsrKyBiL01BSU5UQUlORVJTCj4gQEAgLTE4NTkyLDYgKzE4NTkyLDEyIEBAIEY6 CURvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvdmlydGlvZnMucnN0Cj4gICBGOglmcy9mdXNlL3Zp cnRpb19mcy5jCj4gICBGOglpbmNsdWRlL3VhcGkvbGludXgvdmlydGlvX2ZzLmgKPiAgIAo+ICtW SVJUSU8gR1BJTyBEUklWRVIKPiArTToJRW5yaWNvIFdlaWdlbHQsIG1ldHV4IElUIGNvbnN1bHQg PGluZm9AbWV0dXgubmV0Pgo+ICtTOglNYWludGFpbmVkCj4gK0Y6CWRyaXZlcnMvZ3Bpby9ncGlv LXZpcnRpby5jCj4gK0Y6CWluY2x1ZGUvdWFwaS9saW51eC92aXJ0aW9fZ3Bpby5oCj4gKwo+ICAg VklSVElPIEdQVSBEUklWRVIKPiAgIE06CURhdmlkIEFpcmxpZSA8YWlybGllZEBsaW51eC5pZT4K PiAgIE06CUdlcmQgSG9mZm1hbm4gPGtyYXhlbEByZWRoYXQuY29tPgo+IGRpZmYgLS1naXQgYS9k cml2ZXJzL2dwaW8vS2NvbmZpZyBiL2RyaXZlcnMvZ3Bpby9LY29uZmlnCj4gaW5kZXggMDE2MTll YjU4Mzk2Li43YTMzYWEzNDdkZmIgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9ncGlvL0tjb25maWcK PiArKysgYi9kcml2ZXJzL2dwaW8vS2NvbmZpZwo+IEBAIC0xNjE1LDYgKzE2MTUsMTUgQEAgY29u ZmlnIEdQSU9fTU9DS1VQCj4gICAJICB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9ncGlvL2dwaW8t bW9ja3VwLnNoLiBSZWZlcmVuY2UgdGhlIHVzYWdlIGluCj4gICAJICBpdC4KPiAgIAo+ICtjb25m aWcgR1BJT19WSVJUSU8KPiArCXRyaXN0YXRlICJWaXJ0SU8gR1BJTyBzdXBwb3J0Igo+ICsJZGVw ZW5kcyBvbiBWSVJUSU8KCgpMZXQncyB1c2Ugc2VsZWN0LCBzaW5jZSB0aGVyZSdzIG5vIHByb21w dCBmb3IgVklSVElPIGFuZCBpdCBkb2Vzbid0IGhhdmUgCmFueSBkZXBlbmRlbmNpZXMuCgoKPiAr CWhlbHAKPiArCSAgU2F5IFkgaGVyZSB0byBlbmFibGUgZ3Vlc3Qgc3VwcG9ydCBmb3IgdmlydGlv LWJhc2VkIEdQSU9zLgo+ICsKPiArCSAgVGhlc2UgdmlydHVhbCBHUElPcyBjYW4gYmUgcm91dGVk IHRvIHJlYWwgR1BJT3Mgb3IgYXR0YWNoZWQgdG8KPiArCSAgc2ltdWxhdG9ycyBvbiB0aGUgaG9z dCAocWVtdSkuCgoKSXQncyBiZXR0ZXIgdG8gYXZvaWQgdGFsa2luZyBob3N0IGFuZCBxZW11IGhl cmUgZm9yIG5ldyB2aXJ0aW8gZGV2aWNlcy4KCgo+ICsKPiAgIGVuZG1lbnUKPiAgIAo+ICAgZW5k aWYKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL01ha2VmaWxlIGIvZHJpdmVycy9ncGlvL01h a2VmaWxlCj4gaW5kZXggMDlkYWRhODBhYzM0Li4yYjEyZTc1YWYxMjMgMTAwNjQ0Cj4gLS0tIGEv ZHJpdmVycy9ncGlvL01ha2VmaWxlCj4gKysrIGIvZHJpdmVycy9ncGlvL01ha2VmaWxlCj4gQEAg LTE2MCw2ICsxNjAsNyBAQCBvYmotJChDT05GSUdfR1BJT19UV0w0MDMwKQkJKz0gZ3Bpby10d2w0 MDMwLm8KPiAgIG9iai0kKENPTkZJR19HUElPX1RXTDYwNDApCQkrPSBncGlvLXR3bDYwNDAubwo+ ICAgb2JqLSQoQ09ORklHX0dQSU9fVUNCMTQwMCkJCSs9IGdwaW8tdWNiMTQwMC5vCj4gICBvYmot JChDT05GSUdfR1BJT19VTklQSElFUikJCSs9IGdwaW8tdW5pcGhpZXIubwo+ICtvYmotJChDT05G SUdfR1BJT19WSVJUSU8pCQkrPSBncGlvLXZpcnRpby5vCj4gICBvYmotJChDT05GSUdfR1BJT19W RjYxMCkJCSs9IGdwaW8tdmY2MTAubwo+ICAgb2JqLSQoQ09ORklHX0dQSU9fVklQRVJCT0FSRCkJ CSs9IGdwaW8tdmlwZXJib2FyZC5vCj4gICBvYmotJChDT05GSUdfR1BJT19WUjQxWFgpCQkrPSBn cGlvLXZyNDF4eC5vCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLXZpcnRpby5jIGIv ZHJpdmVycy9ncGlvL2dwaW8tdmlydGlvLmMKPiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+IGluZGV4 IDAwMDAwMDAwMDAwMC4uZjFhYzQ3ZGEyNmI2Cj4gLS0tIC9kZXYvbnVsbAo+ICsrKyBiL2RyaXZl cnMvZ3Bpby9ncGlvLXZpcnRpby5jCj4gQEAgLTAsMCArMSwzMzIgQEAKPiArLy8gU1BEWC1MaWNl bnNlLUlkZW50aWZpZXI6IEdQTC0yLjArCj4gKwo+ICsvKgo+ICsgKiBHUElPIGRyaXZlciBmb3Ig dmlydGlvLWJhc2VkIHZpcnR1YWwgR1BJT3MKPiArICoKPiArICogQ29weXJpZ2h0IChDKSAyMDE4 IG1ldHV4IElUIGNvbnN1bHQKPiArICogQXV0aG9yOiBFbnJpY28gV2VpZ2VsdCwgbWV0dXggSVQg Y29uc3VsdCA8aW5mb0BtZXR1eC5uZXQ+Cj4gKyAqCj4gKyAqLwo+ICsKPiArI2luY2x1ZGUgPGxp bnV4L2Vyci5oPgo+ICsjaW5jbHVkZSA8bGludXgvZ3Bpby9kcml2ZXIuaD4KPiArI2luY2x1ZGUg PGxpbnV4L2lvLmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KPiArI2luY2x1ZGUgPGxp bnV4L21vZHVsZS5oPgo+ICsjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KPiArI2luY2x1ZGUg PGxpbnV4L3ZpcnRpb19jb25maWcuaD4KPiArI2luY2x1ZGUgPHVhcGkvbGludXgvdmlydGlvX2lk cy5oPgo+ICsjaW5jbHVkZSA8dWFwaS9saW51eC92aXJ0aW9fZ3Bpby5oPgo+ICsKPiArc3RydWN0 IHZpcnRpb19ncGlvX3ByaXYgewo+ICsJc3RydWN0IGdwaW9fY2hpcCBnYzsKPiArCXNwaW5sb2Nr X3QgdnFfbG9jazsKPiArCXNwaW5sb2NrX3Qgb3BfbG9jazsKPiArCXN0cnVjdCB2aXJ0aW9fZGV2 aWNlICp2ZGV2Owo+ICsJaW50IG51bV9ncGlvczsKPiArCWNoYXIgKm5hbWU7Cj4gKwlzdHJ1Y3Qg dmlydHF1ZXVlICp2cV9yeDsKPiArCXN0cnVjdCB2aXJ0cXVldWUgKnZxX3R4Owo+ICsJc3RydWN0 IHZpcnRpb19ncGlvX2V2ZW50IHJjdl9idWY7Cj4gKwlzdHJ1Y3QgdmlydGlvX2dwaW9fZXZlbnQg bGFzdDsKPiArCWludCBpcnFfYmFzZTsKPiArCXdhaXRfcXVldWVfaGVhZF90IHdhaXRxOwo+ICsJ dW5zaWduZWQgbG9uZyByZXBseV93YWl0Owo+ICt9Owo+ICsKPiArc3RhdGljIHZvaWQgdmlydGlv X2dwaW9fcHJlcGFyZV9pbmJ1ZihzdHJ1Y3QgdmlydGlvX2dwaW9fcHJpdiAqcHJpdikKPiArewo+ ICsJc3RydWN0IHNjYXR0ZXJsaXN0IHJjdl9zZzsKPiArCj4gKwlzZ19pbml0X29uZSgmcmN2X3Nn LCAmcHJpdi0+cmN2X2J1Ziwgc2l6ZW9mKHByaXYtPnJjdl9idWYpKTsKPiArCXZpcnRxdWV1ZV9h ZGRfaW5idWYocHJpdi0+dnFfcngsICZyY3Zfc2csIDEsICZwcml2LT5yY3ZfYnVmLAo+ICsJCQkg ICAgR0ZQX0tFUk5FTCk7Cj4gKwl2aXJ0cXVldWVfa2ljayhwcml2LT52cV9yeCk7Cj4gK30KPiAr Cj4gK3N0YXRpYyBpbnQgdmlydGlvX2dwaW9feG1pdChzdHJ1Y3QgdmlydGlvX2dwaW9fcHJpdiAq cHJpdiwgaW50IHR5cGUsCj4gKwkJCSAgICBpbnQgcGluLCBpbnQgdmFsdWUsIHN0cnVjdCB2aXJ0 aW9fZ3Bpb19ldmVudCAqZXYpCj4gK3sKPiArCXN0cnVjdCBzY2F0dGVybGlzdCBzZ1sxXTsKPiAr CWludCByZXQ7Cj4gKwl1bnNpZ25lZCBsb25nIGZsYWdzOwo+ICsKPiArCVdBUk5fT04oIWV2KTsK PiArCj4gKwlldi0+dHlwZSA9IHR5cGU7Cj4gKwlldi0+cGluID0gcGluOwo+ICsJZXYtPnZhbHVl ID0gdmFsdWU7Cj4gKwo+ICsJc2dfaW5pdF90YWJsZShzZywgMSk7Cj4gKwlzZ19zZXRfYnVmKCZz Z1swXSwgZXYsIHNpemVvZihzdHJ1Y3QgdmlydGlvX2dwaW9fZXZlbnQpKTsKPiArCj4gKwlzcGlu X2xvY2tfaXJxc2F2ZSgmcHJpdi0+dnFfbG9jaywgZmxhZ3MpOwo+ICsJcmV0ID0gdmlydHF1ZXVl X2FkZF9vdXRidWYocHJpdi0+dnFfdHgsIHNnLCBBUlJBWV9TSVpFKHNnKSwKPiArCQkJCSAgIHBy aXYsIEdGUF9LRVJORUwpOwo+ICsJaWYgKHJldCA8IDApIHsKPiArCQlkZXZfZXJyKCZwcml2LT52 ZGV2LT5kZXYsCj4gKwkJCSJ2aXJ0cXVldWVfYWRkX291dGJ1ZigpIGZhaWxlZDogJWRcbiIsIHJl dCk7Cj4gKwkJZ290byBvdXQ7CgoKU28gZXhjZXB0IGZvciB0aGUgZXJyb3IgbG9nLCB0aGUgZmFp bHVyZSBpcyBzaWxlbnRseSBpZ25vcmVkIGJ5IHRoZSAKY2FsbGVyLiBJcyB0aGlzIGludGVuZGVk PwoKCj4gKwl9Cj4gKwl2aXJ0cXVldWVfa2ljayhwcml2LT52cV90eCk7Cj4gKwo+ICtvdXQ6Cj4g KwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT52cV9sb2NrLCBmbGFncyk7Cj4gKwlyZXR1 cm4gMDsKPiArfQo+ICsKPiArc3RhdGljIGlubGluZSB2b2lkIHdha2V1cF9ldmVudChzdHJ1Y3Qg dmlydGlvX2dwaW9fcHJpdiAqcHJpdiwgaW50IGlkKQo+ICt7Cj4gKwlzZXRfYml0KGlkLCAmcHJp di0+cmVwbHlfd2FpdCk7Cj4gK30KPiArCj4gK3N0YXRpYyBpbmxpbmUgaW50IGNoZWNrX2V2ZW50 KHN0cnVjdCB2aXJ0aW9fZ3Bpb19wcml2ICpwcml2LCBpbnQgaWQpCj4gK3sKPiArCXJldHVybiB0 ZXN0X2JpdChpZCwgJnByaXYtPnJlcGx5X3dhaXQpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW5saW5l IHZvaWQgY2xlYXJfZXZlbnQoc3RydWN0IHZpcnRpb19ncGlvX3ByaXYgKnByaXYsIGludCBpZCkK PiArewo+ICsJY2xlYXJfYml0KGlkLCAmcHJpdi0+cmVwbHlfd2FpdCk7Cj4gK30KPiArCj4gK3N0 YXRpYyBpbnQgdmlydGlvX2dwaW9fcmVxKHN0cnVjdCB2aXJ0aW9fZ3Bpb19wcml2ICpwcml2LCBp bnQgdHlwZSwKPiArCQkJICAgaW50IHBpbiwgaW50IHZhbHVlKQo+ICt7Cj4gKwlzdHJ1Y3Qgdmly dGlvX2dwaW9fZXZlbnQgKmV2Cj4gKwkJPSBremFsbG9jKCZwcml2LT52ZGV2LT5kZXYsIHNpemVv ZihzdHJ1Y3QgdmlydGlvX2dwaW9fZXZlbnQpLAo+ICsJCQkgIEdGUF9LRVJORUwpOwo+ICsKPiAr CWlmICghZXYpCj4gKwkJcmV0dXJuIC1FTk9NRU07Cj4gKwo+ICsJY2xlYXJfZXZlbnQocHJpdiwg dHlwZSk7Cj4gKwl2aXJ0aW9fZ3Bpb194bWl0KHByaXYsIHR5cGUsIHBpbiwgdmFsdWUsIGV2KTsK PiArCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShwcml2LT53YWl0cSwgY2hlY2tfZXZlbnQocHJp diwgdHlwZSkpOwoKCklmIEkgcmVhZCB0aGUgY29kZSBjb3JyZWN0bHksIHRoaXMgZXhwZWN0cyB0 aGVyZSB3aWxsIGJlIGF0IG1vc3QgYSAKc2luZ2xlIHR5cGUgb2YgZXZlbnQgdGhhdCBjYW4gYmUg cHJvY2Vzc2VkIGF0IHRoZSBzYW1lIHRpbWUuIEUuZyBjYW4gCnVwcGVyIGxheWVyIHdhbnQgdG8g cmVhZCBmcm9tIGRpZmZlcmVudCBsaW5lcyBpbiBwYXJhbGxlbD8gSWYgeWVzLCB3ZSAKbmVlZCB0 byBkZWFsIHdpdGggdGhhdC4KCgo+ICsKPiArCWtmcmVlKCZwcml2LT52ZGV2LT5kZXYsIGV2KTsK PiArCj4gKwlyZXR1cm4gcHJpdi0+bGFzdC52YWx1ZTsKPiArfQo+ICsKPiArc3RhdGljIGludCB2 aXJ0aW9fZ3Bpb19kaXJlY3Rpb25faW5wdXQoc3RydWN0IGdwaW9fY2hpcCAqZ2MsCj4gKwkJCQkg ICAgICAgdW5zaWduZWQgaW50IHBpbikKPiArewo+ICsJcmV0dXJuIHZpcnRpb19ncGlvX3JlcShn cGlvY2hpcF9nZXRfZGF0YShnYyksCj4gKwkJCSAgICAgICBWSVJUSU9fR1BJT19FVl9HVUVTVF9E SVJFQ1RJT05fSU5QVVQsCj4gKwkJCSAgICAgICBwaW4sIDApOwo+ICt9Cj4gKwo+ICtzdGF0aWMg aW50IHZpcnRpb19ncGlvX2RpcmVjdGlvbl9vdXRwdXQoc3RydWN0IGdwaW9fY2hpcCAqZ2MsCj4g KwkJCQkJdW5zaWduZWQgaW50IHBpbiwgaW50IHZhbHVlKQo+ICt7Cj4gKwlyZXR1cm4gdmlydGlv X2dwaW9fcmVxKGdwaW9jaGlwX2dldF9kYXRhKGdjKSwKPiArCQkJICAgICAgIFZJUlRJT19HUElP X0VWX0dVRVNUX0RJUkVDVElPTl9PVVRQVVQsCj4gKwkJCSAgICAgICBwaW4sIHZhbHVlKTsKPiAr fQo+ICsKPiArc3RhdGljIGludCB2aXJ0aW9fZ3Bpb19nZXRfZGlyZWN0aW9uKHN0cnVjdCBncGlv X2NoaXAgKmdjLCB1bnNpZ25lZCBpbnQgcGluKQo+ICt7Cj4gKwlyZXR1cm4gdmlydGlvX2dwaW9f cmVxKGdwaW9jaGlwX2dldF9kYXRhKGdjKSwKPiArCQkJICAgICAgIFZJUlRJT19HUElPX0VWX0dV RVNUX0dFVF9ESVJFQ1RJT04sCj4gKwkJCSAgICAgICBwaW4sIDApOwo+ICt9Cj4gKwo+ICtzdGF0 aWMgdm9pZCB2aXJ0aW9fZ3Bpb19zZXQoc3RydWN0IGdwaW9fY2hpcCAqZ2MsCj4gKwkJCSAgICB1 bnNpZ25lZCBpbnQgcGluLCBpbnQgdmFsdWUpCj4gK3sKPiArCXZpcnRpb19ncGlvX3JlcShncGlv Y2hpcF9nZXRfZGF0YShnYyksCj4gKwkJCVZJUlRJT19HUElPX0VWX0dVRVNUX1NFVF9WQUxVRSwg cGluLCB2YWx1ZSk7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgdmlydGlvX2dwaW9fZ2V0KHN0cnVj dCBncGlvX2NoaXAgKmdjLAo+ICsJCQkgICB1bnNpZ25lZCBpbnQgcGluKQo+ICt7Cj4gKwlyZXR1 cm4gdmlydGlvX2dwaW9fcmVxKGdwaW9jaGlwX2dldF9kYXRhKGdjKSwKPiArCQkJICAgICAgIFZJ UlRJT19HUElPX0VWX0dVRVNUX0dFVF9WQUxVRSwgcGluLCAwKTsKPiArfQo+ICsKPiArc3RhdGlj IGludCB2aXJ0aW9fZ3Bpb19yZXF1ZXN0KHN0cnVjdCBncGlvX2NoaXAgKmdjLAo+ICsJCQkgICAg ICAgdW5zaWduZWQgaW50IHBpbikKPiArewo+ICsJcmV0dXJuIHZpcnRpb19ncGlvX3JlcShncGlv Y2hpcF9nZXRfZGF0YShnYyksCj4gKwkJCSAgICAgICBWSVJUSU9fR1BJT19FVl9HVUVTVF9SRVFV RVNULCBwaW4sIDApOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCB2aXJ0aW9fZ3Bpb19zaWduYWwo c3RydWN0IHZpcnRpb19ncGlvX3ByaXYgKnByaXYsIGludCBldmVudCwKPiArCQkJICAgICAgaW50 IHBpbiwgaW50IHZhbHVlKQo+ICt7Cj4gKwlpZiAocGluIDwgcHJpdi0+bnVtX2dwaW9zKQo+ICsJ CWdlbmVyaWNfaGFuZGxlX2lycShwcml2LT5pcnFfYmFzZSArIHBpbik7Cj4gK30KPiArCj4gK3N0 YXRpYyB2b2lkIHZpcnRpb19ncGlvX2RhdGFfcngoc3RydWN0IHZpcnRxdWV1ZSAqdnEpCj4gK3sK PiArCXN0cnVjdCB2aXJ0aW9fZ3Bpb19wcml2ICpwcml2ID0gdnEtPnZkZXYtPnByaXY7Cj4gKwl2 b2lkICpkYXRhOwo+ICsJdW5zaWduZWQgaW50IGxlbjsKPiArCXN0cnVjdCB2aXJ0aW9fZ3Bpb19l dmVudCAqZXY7Cj4gKwo+ICsJZGF0YSA9IHZpcnRxdWV1ZV9nZXRfYnVmKHByaXYtPnZxX3J4LCAm bGVuKTsKPiArCWlmICghZGF0YSB8fCAhbGVuKSB7Cj4gKwkJZGV2X3dhcm4oJnZxLT52ZGV2LT5k ZXYsICJSWCByZWNlaXZlZCBubyBkYXRhICEgJWRcbiIsIGxlbik7Cj4gKwkJcmV0dXJuOwo+ICsJ fQo+ICsKPiArCWV2ID0gZGF0YTsKPiArCVdBUk5fT04oZGF0YSAhPSAmcHJpdi0+cmN2X2J1Zik7 Cj4gKwo+ICsJbWVtY3B5KCZwcml2LT5sYXN0LCAmcHJpdi0+cmN2X2J1Ziwgc2l6ZW9mKHN0cnVj dCB2aXJ0aW9fZ3Bpb19ldmVudCkpOwo+ICsKPiArCXN3aXRjaCAoZXYtPnR5cGUpIHsKPiArCWNh c2UgVklSVElPX0dQSU9fRVZfSE9TVF9MRVZFTDoKPiArCQl2aXJ0aW9fZ3Bpb19zaWduYWwocHJp diwgZXYtPnR5cGUsIGV2LT5waW4sIGV2LT52YWx1ZSk7Cj4gKwkJYnJlYWs7Cj4gKwlkZWZhdWx0 Ogo+ICsJCXdha2V1cF9ldmVudChwcml2LCBldi0+dHlwZSAmIH5WSVJUSU9fR1BJT19FVl9SRVBM WSk7CgoKVGhpcyBsb29rcyBzdXNwaWNpb3VzLCBpdCBsb29rcyB0byBtZSB3aGF0IGlzIGRvbmUg aGVyZSBpcywgY29uc2lkZXIgd2UgCndhbnQgdG8gZG8gVklSVElPX0dQSU9fRVZfR1VFU1RfU0VU X1ZBTFVFCgoxKSBwdXQgdGhlIGV2ZW50IGluIHR4cSwgd2FpdAoyKSB0aGUgcmVzdWx0IGlzIHJl dHVybmVkIGZyb20gcnhxLCB3YWtldXAKCkl0IGxvb2tzIHRvIG1lIHRoaXMgaXMgcmFjeSBzaW5j ZSB0aGUgZGV2aWNlIHNob3VsZCBiZSBhYmxlIHRvIHByb2Nlc3MgYSAKYmF0Y2ggb2YgZGVzY3Jp cHRvcnMgYW5kIHRoZXJlJ3Mgbm8gZ3VhcmFudGVlIHRoYXQgdGhlIGRlc2NyaXB0b3IgaXMgCnBy b2Nlc3NlZCBpbiBvcmRlciBmcm9tIHRoZSB2aXJ0aW8gbGV2ZWwuCgpJIHdvbmRlciB3aHkgbm90 IGludHJvZHVjZSB0d28gdmlydHF1ZXVlczoKCjEpIGNvbW1hbmQgdnEKMikgZXZlbnQgdnEKCkFs bCBjb21tYW5kcyB3ZXJlIHNlbnQgdmlhIGNvbW1hbmQgdnEgYW5kIHRoZW4gZGV2aWNlIGNhbiB3 cml0ZSBiYWNrIHRvIAp0aGUgY29tbWFuZCBidWZmZXIgYXMgb3RoZXIgdmlydGlvIGRldmljZSBk aWQuIFRoZW4gdGhlcmUncyBubyB3b3JyaWVzIApvZiBiYXRjaGluZyBvciBvdXQgb2Ygb3JkZXIg Y29tcGxldGlvbi4KCgo+ICsJCWJyZWFrOwo+ICsJfQo+ICsJdmlydGlvX2dwaW9fcHJlcGFyZV9p bmJ1Zihwcml2KTsKCgpUaGlzIGFzc3VtZXMgYXQgbW9zdCBvbmUgZXZlbnQgY291bGQgYmUgZ2Vu ZXJhdGVkLCBpcyB0aGlzIGhvdyBHUElPIApkZXZpY2UgZXhwZWN0IHRvIGJlaGF2ZT8gSSB0aGlu ayBsZXZlbCBjb3VsZCBjaGFuZ2Ugc2V2ZXJhbCB0aW1lcy4KCgo+ICsJd2FrZV91cF9hbGwoJnBy aXYtPndhaXRxKTsKPiArfQo+ICsKPiArc3RhdGljIGludCB2aXJ0aW9fZ3Bpb19hbGxvY192cShz dHJ1Y3QgdmlydGlvX2dwaW9fcHJpdiAqcHJpdikKPiArewo+ICsJc3RydWN0IHZpcnRxdWV1ZSAq dnFzWzJdOwo+ICsJdnFfY2FsbGJhY2tfdCAqY2JzW10gPSB7Cj4gKwkJTlVMTCwKPiArCQl2aXJ0 aW9fZ3Bpb19kYXRhX3J4LAo+ICsJfTsKPiArCXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbmFt ZXNbXSA9IHsgImluIiwgIm91dCIsIH07Cj4gKwlpbnQgcmV0Owo+ICsKPiArCXJldCA9IHZpcnRp b19maW5kX3Zxcyhwcml2LT52ZGV2LCAyLCB2cXMsIGNicywgbmFtZXMsIE5VTEwpOwo+ICsJaWYg KHJldCkgewo+ICsJCWRldl9lcnIoJnByaXYtPnZkZXYtPmRldiwgImZhaWxlZCB0byBhbGxvYyB2 cXM6ICVkXG4iLCByZXQpOwo+ICsJCXJldHVybiByZXQ7Cj4gKwl9Cj4gKwo+ICsJcHJpdi0+dnFf cnggPSB2cXNbMF07Cj4gKwlwcml2LT52cV90eCA9IHZxc1sxXTsKPiArCj4gKwl2aXJ0aW9fZ3Bp b19wcmVwYXJlX2luYnVmKHByaXYpOwo+ICsKPiArCXZpcnRpb19jb25maWdfZW5hYmxlKHByaXYt PnZkZXYpOwo+ICsJdmlydHF1ZXVlX2VuYWJsZV9jYihwcml2LT52cV9yeCk7Cj4gKwl2aXJ0aW9f ZGV2aWNlX3JlYWR5KHByaXYtPnZkZXYpOwo+ICsKPiArCXJldHVybiAwOwo+ICt9Cj4gKwo+ICtz dGF0aWMgaW50IHZpcnRpb19ncGlvX3Byb2JlKHN0cnVjdCB2aXJ0aW9fZGV2aWNlICp2ZGV2KQo+ ICt7Cj4gKwlzdHJ1Y3QgdmlydGlvX2dwaW9fcHJpdiAqcHJpdjsKPiArCXN0cnVjdCB2aXJ0aW9f Z3Bpb19jb25maWcgY2YgPSB7fTsKPiArCWNoYXIgKm5hbWVfYnVmZmVyOwo+ICsJY29uc3QgY2hh ciAqKmdwaW9fbmFtZXMgPSBOVUxMOwo+ICsJc3RydWN0IGRldmljZSAqZGV2ID0gJnZkZXYtPmRl djsKPiArCj4gKwlwcml2ID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpwcml2KSwgR0ZQX0tF Uk5FTCk7Cj4gKwlpZiAoIXByaXYpCj4gKwkJcmV0dXJuIC1FTk9NRU07CgoKSXMgZGV2cmVzIGd1 YXJhbnRlZWQgdG8gYmUgZW5hYmxlZCBoZXJlPwoKVGhhbmtzCgpfX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fXwpWaXJ0dWFsaXphdGlvbiBtYWlsaW5nIGxpc3QK VmlydHVhbGl6YXRpb25AbGlzdHMubGludXgtZm91bmRhdGlvbi5vcmcKaHR0cHM6Ly9saXN0cy5s aW51eGZvdW5kYXRpb24ub3JnL21haWxtYW4vbGlzdGluZm8vdmlydHVhbGl6YXRpb24=