From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([209.51.188.92]:47366) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gj2lm-0007BC-1g for qemu-devel@nongnu.org; Mon, 14 Jan 2019 08:59:20 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gj2lj-0004tW-TQ for qemu-devel@nongnu.org; Mon, 14 Jan 2019 08:59:13 -0500 Received: from smtp03.citrix.com ([162.221.156.55]:1370) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1gj2lh-0004ll-Q8 for qemu-devel@nongnu.org; Mon, 14 Jan 2019 08:59:11 -0500 From: Anthony PERARD Date: Mon, 14 Jan 2019 13:51:40 +0000 Message-ID: <20190114135154.16826-12-anthony.perard@citrix.com> In-Reply-To: <20190114135154.16826-1-anthony.perard@citrix.com> References: <20190114135154.16826-1-anthony.perard@citrix.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain Subject: [Qemu-devel] [PULL 11/25] xen: remove unnecessary code from dataplane/xen-block.c List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: xen-devel@lists.xenproject.org, Peter Maydell , Anthony PERARD From: Paul Durrant Not all of the code duplicated from xen_disk.c is required as the basis for the new dataplane implementation so this patch removes extraneous code, along with the legacy #includes and calls to the legacy xen_pv_printf() function. Error messages are changed to be reported using error_report(). NOTE: The code is still not yet built. Further transformations will be required to make it correctly interface to the new XenBus/XenDevice framework. They will be delivered in a subsequent patch. Signed-off-by: Paul Durrant Acked-by: Anthony Perard Signed-off-by: Anthony PERARD --- hw/block/dataplane/xen-block.c | 429 ++------------------------------- 1 file changed, 23 insertions(+), 406 deletions(-) diff --git a/hw/block/dataplane/xen-block.c b/hw/block/dataplane/xen-block.c index 9fae50534e..228472320a 100644 --- a/hw/block/dataplane/xen-block.c +++ b/hw/block/dataplane/xen-block.c @@ -1,45 +1,23 @@ /* - * xen paravirt block device backend + * Copyright (c) 2018 Citrix Systems Inc. + * (c) Gerd Hoffmann * - * (c) Gerd Hoffmann + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; under version 2 of the License. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; under version 2 of the License. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License along + * with this program; if not, see . * - * You should have received a copy of the GNU General Public License along - * with this program; if not, see . - * - * Contributions after 2012-01-13 are licensed under the terms of the - * GNU GPL, version 2 or (at your option) any later version. + * Contributions after 2012-01-13 are licensed under the terms of the + * GNU GPL, version 2 or (at your option) any later version. */ -#include "qemu/osdep.h" -#include "qemu/units.h" -#include -#include - -#include "hw/hw.h" -#include "hw/xen/xen_backend.h" -#include "xen_blkif.h" -#include "sysemu/blockdev.h" -#include "sysemu/iothread.h" -#include "sysemu/block-backend.h" -#include "qapi/error.h" -#include "qapi/qmp/qdict.h" -#include "qapi/qmp/qstring.h" -#include "trace.h" - -/* ------------------------------------------------------------- */ - -#define BLOCK_SIZE 512 -#define IOCB_COUNT (BLKIF_MAX_SEGMENTS_PER_REQUEST + 2) - struct ioreq { blkif_request_t req; int16_t status; @@ -101,8 +79,6 @@ struct XenBlkDev { AioContext *ctx; }; -/* ------------------------------------------------------------- */ - static void ioreq_reset(struct ioreq *ioreq) { memset(&ioreq->req, 0, sizeof(ioreq->req)); @@ -183,11 +159,6 @@ static int ioreq_parse(struct ioreq *ioreq) size_t len; int i; - xen_pv_printf( - xendev, 3, - "op %d, nr %d, handle %d, id %" PRId64 ", sector %" PRId64 "\n", - ioreq->req.operation, ioreq->req.nr_segments, - ioreq->req.handle, ioreq->req.id, ioreq->req.sector_number); switch (ioreq->req.operation) { case BLKIF_OP_READ: break; @@ -202,28 +173,27 @@ static int ioreq_parse(struct ioreq *ioreq) case BLKIF_OP_DISCARD: return 0; default: - xen_pv_printf(xendev, 0, "error: unknown operation (%d)\n", - ioreq->req.operation); + error_report("error: unknown operation (%d)", ioreq->req.operation); goto err; }; if (ioreq->req.operation != BLKIF_OP_READ && blkdev->mode[0] != 'w') { - xen_pv_printf(xendev, 0, "error: write req for ro device\n"); + error_report("error: write req for ro device"); goto err; } ioreq->start = ioreq->req.sector_number * blkdev->file_blk; for (i = 0; i < ioreq->req.nr_segments; i++) { if (i == BLKIF_MAX_SEGMENTS_PER_REQUEST) { - xen_pv_printf(xendev, 0, "error: nr_segments too big\n"); + error_report("error: nr_segments too big"); goto err; } if (ioreq->req.seg[i].first_sect > ioreq->req.seg[i].last_sect) { - xen_pv_printf(xendev, 0, "error: first > last sector\n"); + error_report("error: first > last sector"); goto err; } if (ioreq->req.seg[i].last_sect * BLOCK_SIZE >= XC_PAGE_SIZE) { - xen_pv_printf(xendev, 0, "error: page crossing\n"); + error_report("error: page crossing"); goto err; } @@ -232,7 +202,7 @@ static int ioreq_parse(struct ioreq *ioreq) ioreq->size += len; } if (ioreq->start + ioreq->size > blkdev->file_size) { - xen_pv_printf(xendev, 0, "error: access beyond end of file\n"); + error_report("error: access beyond end of file"); goto err; } return 0; @@ -278,8 +248,7 @@ static int ioreq_grant_copy(struct ioreq *ioreq) rc = xen_be_copy_grant_refs(xendev, to_domain, segs, count); if (rc) { - xen_pv_printf(xendev, 0, - "failed to copy data %d\n", rc); + error_report("failed to copy data %d", rc); ioreq->aio_errors++; return -1; } @@ -298,8 +267,9 @@ static void qemu_aio_complete(void *opaque, int ret) aio_context_acquire(blkdev->ctx); if (ret != 0) { - xen_pv_printf(xendev, 0, "%s I/O error\n", - ioreq->req.operation == BLKIF_OP_READ ? "read" : "write"); + error_report("%s I/O error", + ioreq->req.operation == BLKIF_OP_READ ? + "read" : "write"); ioreq->aio_errors++; } @@ -605,8 +575,6 @@ static void blk_handle_requests(struct XenBlkDev *blkdev) } } -/* ------------------------------------------------------------- */ - static void blk_bh(void *opaque) { struct XenBlkDev *blkdev = opaque; @@ -634,346 +602,6 @@ static void blk_alloc(struct XenLegacyDevice *xendev) blkdev->bh = aio_bh_new(blkdev->ctx, blk_bh, blkdev); } -static void blk_parse_discard(struct XenBlkDev *blkdev) -{ - struct XenLegacyDevice *xendev = &blkdev->xendev; - int enable; - - blkdev->feature_discard = true; - - if (xenstore_read_be_int(xendev, "discard-enable", &enable) == 0) { - blkdev->feature_discard = !!enable; - } - - if (blkdev->feature_discard) { - xenstore_write_be_int(xendev, "feature-discard", 1); - } -} - -static int blk_init(struct XenLegacyDevice *xendev) -{ - struct XenBlkDev *blkdev = container_of(xendev, struct XenBlkDev, xendev); - int info = 0; - char *directiosafe = NULL; - - trace_xen_disk_init(xendev->name); - - /* read xenstore entries */ - if (blkdev->params == NULL) { - char *h = NULL; - blkdev->params = xenstore_read_be_str(xendev, "params"); - if (blkdev->params != NULL) { - h = strchr(blkdev->params, ':'); - } - if (h != NULL) { - blkdev->fileproto = blkdev->params; - blkdev->filename = h + 1; - *h = 0; - } else { - blkdev->fileproto = ""; - blkdev->filename = blkdev->params; - } - } - if (!strcmp("aio", blkdev->fileproto)) { - blkdev->fileproto = "raw"; - } - if (!strcmp("vhd", blkdev->fileproto)) { - blkdev->fileproto = "vpc"; - } - if (blkdev->mode == NULL) { - blkdev->mode = xenstore_read_be_str(xendev, "mode"); - } - if (blkdev->type == NULL) { - blkdev->type = xenstore_read_be_str(xendev, "type"); - } - if (blkdev->dev == NULL) { - blkdev->dev = xenstore_read_be_str(xendev, "dev"); - } - if (blkdev->devtype == NULL) { - blkdev->devtype = xenstore_read_be_str(xendev, "device-type"); - } - directiosafe = xenstore_read_be_str(xendev, "direct-io-safe"); - blkdev->directiosafe = (directiosafe && atoi(directiosafe)); - - /* do we have all we need? */ - if (blkdev->params == NULL || - blkdev->mode == NULL || - blkdev->type == NULL || - blkdev->dev == NULL) { - goto out_error; - } - - /* read-only ? */ - if (strcmp(blkdev->mode, "w")) { - info |= VDISK_READONLY; - } - - /* cdrom ? */ - if (blkdev->devtype && !strcmp(blkdev->devtype, "cdrom")) { - info |= VDISK_CDROM; - } - - blkdev->file_blk = BLOCK_SIZE; - - /* fill info - * blk_connect supplies sector-size and sectors - */ - xenstore_write_be_int(xendev, "feature-flush-cache", 1); - xenstore_write_be_int(xendev, "info", info); - - xenstore_write_be_int(xendev, "max-ring-page-order", - MAX_RING_PAGE_ORDER); - - blk_parse_discard(blkdev); - - g_free(directiosafe); - return 0; - -out_error: - g_free(blkdev->params); - blkdev->params = NULL; - g_free(blkdev->mode); - blkdev->mode = NULL; - g_free(blkdev->type); - blkdev->type = NULL; - g_free(blkdev->dev); - blkdev->dev = NULL; - g_free(blkdev->devtype); - blkdev->devtype = NULL; - g_free(directiosafe); - blkdev->directiosafe = false; - return -1; -} - -static int blk_connect(struct XenLegacyDevice *xendev) -{ - struct XenBlkDev *blkdev = container_of(xendev, struct XenBlkDev, xendev); - int index, qflags; - bool readonly = true; - bool writethrough = true; - int order, ring_ref; - unsigned int ring_size, max_grants; - unsigned int i; - - trace_xen_disk_connect(xendev->name); - - /* read-only ? */ - if (blkdev->directiosafe) { - qflags = BDRV_O_NOCACHE | BDRV_O_NATIVE_AIO; - } else { - qflags = 0; - writethrough = false; - } - if (strcmp(blkdev->mode, "w") == 0) { - qflags |= BDRV_O_RDWR; - readonly = false; - } - if (blkdev->feature_discard) { - qflags |= BDRV_O_UNMAP; - } - - /* init qemu block driver */ - index = (xendev->dev - 202 * 256) / 16; - blkdev->dinfo = drive_get(IF_XEN, 0, index); - if (!blkdev->dinfo) { - Error *local_err = NULL; - QDict *options = NULL; - - if (strcmp(blkdev->fileproto, "")) { - options = qdict_new(); - qdict_put_str(options, "driver", blkdev->fileproto); - } - - /* setup via xenbus -> create new block driver instance */ - xen_pv_printf(xendev, 2, "create new bdrv (xenbus setup)\n"); - blkdev->blk = blk_new_open(blkdev->filename, NULL, options, - qflags, &local_err); - if (!blkdev->blk) { - xen_pv_printf(xendev, 0, "error: %s\n", - error_get_pretty(local_err)); - error_free(local_err); - return -1; - } - blk_set_enable_write_cache(blkdev->blk, !writethrough); - } else { - /* setup via qemu cmdline -> already setup for us */ - xen_pv_printf(xendev, 2, - "get configured bdrv (cmdline setup)\n"); - blkdev->blk = blk_by_legacy_dinfo(blkdev->dinfo); - if (blk_is_read_only(blkdev->blk) && !readonly) { - xen_pv_printf(xendev, 0, "Unexpected read-only drive"); - blkdev->blk = NULL; - return -1; - } - /* blkdev->blk is not create by us, we get a reference - * so we can blk_unref() unconditionally */ - blk_ref(blkdev->blk); - } - blk_attach_dev_legacy(blkdev->blk, blkdev); - blkdev->file_size = blk_getlength(blkdev->blk); - if (blkdev->file_size < 0) { - BlockDriverState *bs = blk_bs(blkdev->blk); - const char *drv_name = bs ? bdrv_get_format_name(bs) : NULL; - xen_pv_printf(xendev, 1, "blk_getlength: %d (%s) | drv %s\n", - (int)blkdev->file_size, strerror(-blkdev->file_size), - drv_name ?: "-"); - blkdev->file_size = 0; - } - - xen_pv_printf(xendev, 1, "type \"%s\", fileproto \"%s\", filename \"%s\"," - " size %" PRId64 " (%" PRId64 " MB)\n", - blkdev->type, blkdev->fileproto, blkdev->filename, - blkdev->file_size, blkdev->file_size / MiB); - - /* Fill in number of sector size and number of sectors */ - xenstore_write_be_int(xendev, "sector-size", blkdev->file_blk); - xenstore_write_be_int64(xendev, "sectors", - blkdev->file_size / blkdev->file_blk); - - if (xenstore_read_fe_int(xendev, "ring-page-order", - &order) == -1) { - blkdev->nr_ring_ref = 1; - - if (xenstore_read_fe_int(xendev, "ring-ref", - &ring_ref) == -1) { - return -1; - } - blkdev->ring_ref[0] = ring_ref; - - } else if (order >= 0 && order <= MAX_RING_PAGE_ORDER) { - blkdev->nr_ring_ref = 1 << order; - - for (i = 0; i < blkdev->nr_ring_ref; i++) { - char *key; - - key = g_strdup_printf("ring-ref%u", i); - if (!key) { - return -1; - } - - if (xenstore_read_fe_int(xendev, key, - &ring_ref) == -1) { - g_free(key); - return -1; - } - blkdev->ring_ref[i] = ring_ref; - - g_free(key); - } - } else { - xen_pv_printf(xendev, 0, "invalid ring-page-order: %d\n", - order); - return -1; - } - - if (xenstore_read_fe_int(xendev, "event-channel", - &xendev->remote_port) == -1) { - return -1; - } - - if (!xendev->protocol) { - blkdev->protocol = BLKIF_PROTOCOL_NATIVE; - } else if (strcmp(xendev->protocol, XEN_IO_PROTO_ABI_NATIVE) == 0) { - blkdev->protocol = BLKIF_PROTOCOL_NATIVE; - } else if (strcmp(xendev->protocol, XEN_IO_PROTO_ABI_X86_32) == 0) { - blkdev->protocol = BLKIF_PROTOCOL_X86_32; - } else if (strcmp(xendev->protocol, XEN_IO_PROTO_ABI_X86_64) == 0) { - blkdev->protocol = BLKIF_PROTOCOL_X86_64; - } else { - blkdev->protocol = BLKIF_PROTOCOL_NATIVE; - } - - ring_size = XC_PAGE_SIZE * blkdev->nr_ring_ref; - switch (blkdev->protocol) { - case BLKIF_PROTOCOL_NATIVE: - { - blkdev->max_requests = __CONST_RING_SIZE(blkif, ring_size); - break; - } - case BLKIF_PROTOCOL_X86_32: - { - blkdev->max_requests = __CONST_RING_SIZE(blkif_x86_32, ring_size); - break; - } - case BLKIF_PROTOCOL_X86_64: - { - blkdev->max_requests = __CONST_RING_SIZE(blkif_x86_64, ring_size); - break; - } - default: - return -1; - } - - /* Add on the number needed for the ring pages */ - max_grants = blkdev->nr_ring_ref; - - xen_be_set_max_grant_refs(xendev, max_grants); - blkdev->sring = xen_be_map_grant_refs(xendev, blkdev->ring_ref, - blkdev->nr_ring_ref, - PROT_READ | PROT_WRITE); - if (!blkdev->sring) { - return -1; - } - - switch (blkdev->protocol) { - case BLKIF_PROTOCOL_NATIVE: - { - blkif_sring_t *sring_native = blkdev->sring; - BACK_RING_INIT(&blkdev->rings.native, sring_native, ring_size); - break; - } - case BLKIF_PROTOCOL_X86_32: - { - blkif_x86_32_sring_t *sring_x86_32 = blkdev->sring; - - BACK_RING_INIT(&blkdev->rings.x86_32_part, sring_x86_32, ring_size); - break; - } - case BLKIF_PROTOCOL_X86_64: - { - blkif_x86_64_sring_t *sring_x86_64 = blkdev->sring; - - BACK_RING_INIT(&blkdev->rings.x86_64_part, sring_x86_64, ring_size); - break; - } - } - - blk_set_aio_context(blkdev->blk, blkdev->ctx); - - xen_be_bind_evtchn(xendev); - - xen_pv_printf(xendev, 1, "ok: proto %s, nr-ring-ref %u, " - "remote port %d, local port %d\n", - xendev->protocol, blkdev->nr_ring_ref, - xendev->remote_port, xendev->local_port); - return 0; -} - -static void blk_disconnect(struct XenLegacyDevice *xendev) -{ - struct XenBlkDev *blkdev = container_of(xendev, struct XenBlkDev, xendev); - - trace_xen_disk_disconnect(xendev->name); - - aio_context_acquire(blkdev->ctx); - - if (blkdev->blk) { - blk_set_aio_context(blkdev->blk, qemu_get_aio_context()); - blk_detach_dev(blkdev->blk, blkdev); - blk_unref(blkdev->blk); - blkdev->blk = NULL; - } - xen_pv_unbind_evtchn(xendev); - - aio_context_release(blkdev->ctx); - - if (blkdev->sring) { - xen_be_unmap_grant_refs(xendev, blkdev->sring, - blkdev->nr_ring_ref); - blkdev->sring = NULL; - } -} - static int blk_free(struct XenLegacyDevice *xendev) { struct XenBlkDev *blkdev = container_of(xendev, struct XenBlkDev, xendev); @@ -1006,14 +634,3 @@ static void blk_event(struct XenLegacyDevice *xendev) qemu_bh_schedule(blkdev->bh); } - -struct XenDevOps xen_blkdev_ops = { - .flags = DEVOPS_FLAG_NEED_GNTDEV, - .size = sizeof(struct XenBlkDev), - .alloc = blk_alloc, - .init = blk_init, - .initialise = blk_connect, - .disconnect = blk_disconnect, - .event = blk_event, - .free = blk_free, -}; -- Anthony PERARD From mboxrd@z Thu Jan 1 00:00:00 1970 From: Anthony PERARD Subject: [PULL 11/25] xen: remove unnecessary code from dataplane/xen-block.c Date: Mon, 14 Jan 2019 13:51:40 +0000 Message-ID: <20190114135154.16826-12-anthony.perard@citrix.com> References: <20190114135154.16826-1-anthony.perard@citrix.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from us1-rack-dfw2.inumbo.com ([104.130.134.6]) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1gj2mE-0000Ur-AB for xen-devel@lists.xenproject.org; Mon, 14 Jan 2019 13:59:42 +0000 In-Reply-To: <20190114135154.16826-1-anthony.perard@citrix.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" To: qemu-devel@nongnu.org Cc: Anthony PERARD , xen-devel@lists.xenproject.org, Peter Maydell List-Id: xen-devel@lists.xenproject.org RnJvbTogUGF1bCBEdXJyYW50IDxwYXVsLmR1cnJhbnRAY2l0cml4LmNvbT4KCk5vdCBhbGwgb2Yg dGhlIGNvZGUgZHVwbGljYXRlZCBmcm9tIHhlbl9kaXNrLmMgaXMgcmVxdWlyZWQgYXMgdGhlIGJh c2lzIGZvcgp0aGUgbmV3IGRhdGFwbGFuZSBpbXBsZW1lbnRhdGlvbiBzbyB0aGlzIHBhdGNoIHJl bW92ZXMgZXh0cmFuZW91cyBjb2RlLAphbG9uZyB3aXRoIHRoZSBsZWdhY3kgI2luY2x1ZGVzIGFu ZCBjYWxscyB0byB0aGUgbGVnYWN5IHhlbl9wdl9wcmludGYoKQpmdW5jdGlvbi4gRXJyb3IgbWVz c2FnZXMgYXJlIGNoYW5nZWQgdG8gYmUgcmVwb3J0ZWQgdXNpbmcgZXJyb3JfcmVwb3J0KCkuCgpO T1RFOiBUaGUgY29kZSBpcyBzdGlsbCBub3QgeWV0IGJ1aWx0LiBGdXJ0aGVyIHRyYW5zZm9ybWF0 aW9ucyB3aWxsIGJlCiAgICAgIHJlcXVpcmVkIHRvIG1ha2UgaXQgY29ycmVjdGx5IGludGVyZmFj ZSB0byB0aGUgbmV3IFhlbkJ1cy9YZW5EZXZpY2UKICAgICAgZnJhbWV3b3JrLiBUaGV5IHdpbGwg YmUgZGVsaXZlcmVkIGluIGEgc3Vic2VxdWVudCBwYXRjaC4KClNpZ25lZC1vZmYtYnk6IFBhdWwg RHVycmFudCA8cGF1bC5kdXJyYW50QGNpdHJpeC5jb20+CkFja2VkLWJ5OiBBbnRob255IFBlcmFy ZCA8YW50aG9ueS5wZXJhcmRAY2l0cml4LmNvbT4KU2lnbmVkLW9mZi1ieTogQW50aG9ueSBQRVJB UkQgPGFudGhvbnkucGVyYXJkQGNpdHJpeC5jb20+Ci0tLQogaHcvYmxvY2svZGF0YXBsYW5lL3hl bi1ibG9jay5jIHwgNDI5ICsrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogMSBmaWxl IGNoYW5nZWQsIDIzIGluc2VydGlvbnMoKyksIDQwNiBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQg YS9ody9ibG9jay9kYXRhcGxhbmUveGVuLWJsb2NrLmMgYi9ody9ibG9jay9kYXRhcGxhbmUveGVu LWJsb2NrLmMKaW5kZXggOWZhZTUwNTM0ZS4uMjI4NDcyMzIwYSAxMDA2NDQKLS0tIGEvaHcvYmxv Y2svZGF0YXBsYW5lL3hlbi1ibG9jay5jCisrKyBiL2h3L2Jsb2NrL2RhdGFwbGFuZS94ZW4tYmxv Y2suYwpAQCAtMSw0NSArMSwyMyBAQAogLyoKLSAqICB4ZW4gcGFyYXZpcnQgYmxvY2sgZGV2aWNl IGJhY2tlbmQKKyAqIENvcHlyaWdodCAoYykgMjAxOCAgQ2l0cml4IFN5c3RlbXMgSW5jLgorICog KGMpIEdlcmQgSG9mZm1hbm4gPGtyYXhlbEByZWRoYXQuY29tPgogICoKLSAqICAoYykgR2VyZCBI b2ZmbWFubiA8a3JheGVsQHJlZGhhdC5jb20+CisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0 d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIg dGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQg YnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHVuZGVyIHZlcnNpb24gMiBvZiB0 aGUgTGljZW5zZS4KICAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBj YW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqICBpdCB1bmRlciB0aGUgdGVybXMg b2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogIHRo ZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHVuZGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5z ZS4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdp bGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4g dGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZP UiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBM aWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgotICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmli dXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogIGJ1dCBXSVRIT1VU IEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAg TUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2Vl IHRoZQotICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisg KiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJs aWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRw Oi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KICAqCi0gKiAgWW91IHNob3VsZCBoYXZlIHJlY2Vp dmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqICB3 aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNl cy8+LgotICoKLSAqICBDb250cmlidXRpb25zIGFmdGVyIDIwMTItMDEtMTMgYXJlIGxpY2Vuc2Vk IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLSAqICBHTlUgR1BMLCB2ZXJzaW9uIDIgb3IgKGF0IHlv dXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIENvbnRyaWJ1dGlvbnMgYWZ0ZXIgMjAx Mi0wMS0xMyBhcmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdQTCwg dmVyc2lvbiAyIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKi8KIAot I2luY2x1ZGUgInFlbXUvb3NkZXAuaCIKLSNpbmNsdWRlICJxZW11L3VuaXRzLmgiCi0jaW5jbHVk ZSA8c3lzL2lvY3RsLmg+Ci0jaW5jbHVkZSA8c3lzL3Vpby5oPgotCi0jaW5jbHVkZSAiaHcvaHcu aCIKLSNpbmNsdWRlICJody94ZW4veGVuX2JhY2tlbmQuaCIKLSNpbmNsdWRlICJ4ZW5fYmxraWYu aCIKLSNpbmNsdWRlICJzeXNlbXUvYmxvY2tkZXYuaCIKLSNpbmNsdWRlICJzeXNlbXUvaW90aHJl YWQuaCIKLSNpbmNsdWRlICJzeXNlbXUvYmxvY2stYmFja2VuZC5oIgotI2luY2x1ZGUgInFhcGkv ZXJyb3IuaCIKLSNpbmNsdWRlICJxYXBpL3FtcC9xZGljdC5oIgotI2luY2x1ZGUgInFhcGkvcW1w L3FzdHJpbmcuaCIKLSNpbmNsdWRlICJ0cmFjZS5oIgotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLSNkZWZpbmUg QkxPQ0tfU0laRSAgNTEyCi0jZGVmaW5lIElPQ0JfQ09VTlQgIChCTEtJRl9NQVhfU0VHTUVOVFNf UEVSX1JFUVVFU1QgKyAyKQotCiBzdHJ1Y3QgaW9yZXEgewogICAgIGJsa2lmX3JlcXVlc3RfdCAg ICAgcmVxOwogICAgIGludDE2X3QgICAgICAgICAgICAgc3RhdHVzOwpAQCAtMTAxLDggKzc5LDYg QEAgc3RydWN0IFhlbkJsa0RldiB7CiAgICAgQWlvQ29udGV4dCAgICAgICAgICAqY3R4OwogfTsK IAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLSAqLwotCiBzdGF0aWMgdm9pZCBpb3JlcV9yZXNldChzdHJ1Y3QgaW9yZXEgKmlv cmVxKQogewogICAgIG1lbXNldCgmaW9yZXEtPnJlcSwgMCwgc2l6ZW9mKGlvcmVxLT5yZXEpKTsK QEAgLTE4MywxMSArMTU5LDYgQEAgc3RhdGljIGludCBpb3JlcV9wYXJzZShzdHJ1Y3QgaW9yZXEg KmlvcmVxKQogICAgIHNpemVfdCBsZW47CiAgICAgaW50IGk7CiAKLSAgICB4ZW5fcHZfcHJpbnRm KAotICAgICAgICB4ZW5kZXYsIDMsCi0gICAgICAgICJvcCAlZCwgbnIgJWQsIGhhbmRsZSAlZCwg aWQgJSIgUFJJZDY0ICIsIHNlY3RvciAlIiBQUklkNjQgIlxuIiwKLSAgICAgICAgaW9yZXEtPnJl cS5vcGVyYXRpb24sIGlvcmVxLT5yZXEubnJfc2VnbWVudHMsCi0gICAgICAgIGlvcmVxLT5yZXEu aGFuZGxlLCBpb3JlcS0+cmVxLmlkLCBpb3JlcS0+cmVxLnNlY3Rvcl9udW1iZXIpOwogICAgIHN3 aXRjaCAoaW9yZXEtPnJlcS5vcGVyYXRpb24pIHsKICAgICBjYXNlIEJMS0lGX09QX1JFQUQ6CiAg ICAgICAgIGJyZWFrOwpAQCAtMjAyLDI4ICsxNzMsMjcgQEAgc3RhdGljIGludCBpb3JlcV9wYXJz ZShzdHJ1Y3QgaW9yZXEgKmlvcmVxKQogICAgIGNhc2UgQkxLSUZfT1BfRElTQ0FSRDoKICAgICAg ICAgcmV0dXJuIDA7CiAgICAgZGVmYXVsdDoKLSAgICAgICAgeGVuX3B2X3ByaW50Zih4ZW5kZXYs IDAsICJlcnJvcjogdW5rbm93biBvcGVyYXRpb24gKCVkKVxuIiwKLSAgICAgICAgICAgICAgICAg ICAgICBpb3JlcS0+cmVxLm9wZXJhdGlvbik7CisgICAgICAgIGVycm9yX3JlcG9ydCgiZXJyb3I6 IHVua25vd24gb3BlcmF0aW9uICglZCkiLCBpb3JlcS0+cmVxLm9wZXJhdGlvbik7CiAgICAgICAg IGdvdG8gZXJyOwogICAgIH07CiAKICAgICBpZiAoaW9yZXEtPnJlcS5vcGVyYXRpb24gIT0gQkxL SUZfT1BfUkVBRCAmJiBibGtkZXYtPm1vZGVbMF0gIT0gJ3cnKSB7Ci0gICAgICAgIHhlbl9wdl9w cmludGYoeGVuZGV2LCAwLCAiZXJyb3I6IHdyaXRlIHJlcSBmb3Igcm8gZGV2aWNlXG4iKTsKKyAg ICAgICAgZXJyb3JfcmVwb3J0KCJlcnJvcjogd3JpdGUgcmVxIGZvciBybyBkZXZpY2UiKTsKICAg ICAgICAgZ290byBlcnI7CiAgICAgfQogCiAgICAgaW9yZXEtPnN0YXJ0ID0gaW9yZXEtPnJlcS5z ZWN0b3JfbnVtYmVyICogYmxrZGV2LT5maWxlX2JsazsKICAgICBmb3IgKGkgPSAwOyBpIDwgaW9y ZXEtPnJlcS5ucl9zZWdtZW50czsgaSsrKSB7CiAgICAgICAgIGlmIChpID09IEJMS0lGX01BWF9T RUdNRU5UU19QRVJfUkVRVUVTVCkgewotICAgICAgICAgICAgeGVuX3B2X3ByaW50Zih4ZW5kZXYs IDAsICJlcnJvcjogbnJfc2VnbWVudHMgdG9vIGJpZ1xuIik7CisgICAgICAgICAgICBlcnJvcl9y ZXBvcnQoImVycm9yOiBucl9zZWdtZW50cyB0b28gYmlnIik7CiAgICAgICAgICAgICBnb3RvIGVy cjsKICAgICAgICAgfQogICAgICAgICBpZiAoaW9yZXEtPnJlcS5zZWdbaV0uZmlyc3Rfc2VjdCA+ IGlvcmVxLT5yZXEuc2VnW2ldLmxhc3Rfc2VjdCkgewotICAgICAgICAgICAgeGVuX3B2X3ByaW50 Zih4ZW5kZXYsIDAsICJlcnJvcjogZmlyc3QgPiBsYXN0IHNlY3RvclxuIik7CisgICAgICAgICAg ICBlcnJvcl9yZXBvcnQoImVycm9yOiBmaXJzdCA+IGxhc3Qgc2VjdG9yIik7CiAgICAgICAgICAg ICBnb3RvIGVycjsKICAgICAgICAgfQogICAgICAgICBpZiAoaW9yZXEtPnJlcS5zZWdbaV0ubGFz dF9zZWN0ICogQkxPQ0tfU0laRSA+PSBYQ19QQUdFX1NJWkUpIHsKLSAgICAgICAgICAgIHhlbl9w dl9wcmludGYoeGVuZGV2LCAwLCAiZXJyb3I6IHBhZ2UgY3Jvc3NpbmdcbiIpOworICAgICAgICAg ICAgZXJyb3JfcmVwb3J0KCJlcnJvcjogcGFnZSBjcm9zc2luZyIpOwogICAgICAgICAgICAgZ290 byBlcnI7CiAgICAgICAgIH0KIApAQCAtMjMyLDcgKzIwMiw3IEBAIHN0YXRpYyBpbnQgaW9yZXFf cGFyc2Uoc3RydWN0IGlvcmVxICppb3JlcSkKICAgICAgICAgaW9yZXEtPnNpemUgKz0gbGVuOwog ICAgIH0KICAgICBpZiAoaW9yZXEtPnN0YXJ0ICsgaW9yZXEtPnNpemUgPiBibGtkZXYtPmZpbGVf c2l6ZSkgewotICAgICAgICB4ZW5fcHZfcHJpbnRmKHhlbmRldiwgMCwgImVycm9yOiBhY2Nlc3Mg YmV5b25kIGVuZCBvZiBmaWxlXG4iKTsKKyAgICAgICAgZXJyb3JfcmVwb3J0KCJlcnJvcjogYWNj ZXNzIGJleW9uZCBlbmQgb2YgZmlsZSIpOwogICAgICAgICBnb3RvIGVycjsKICAgICB9CiAgICAg cmV0dXJuIDA7CkBAIC0yNzgsOCArMjQ4LDcgQEAgc3RhdGljIGludCBpb3JlcV9ncmFudF9jb3B5 KHN0cnVjdCBpb3JlcSAqaW9yZXEpCiAgICAgcmMgPSB4ZW5fYmVfY29weV9ncmFudF9yZWZzKHhl bmRldiwgdG9fZG9tYWluLCBzZWdzLCBjb3VudCk7CiAKICAgICBpZiAocmMpIHsKLSAgICAgICAg eGVuX3B2X3ByaW50Zih4ZW5kZXYsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgImZhaWxlZCB0 byBjb3B5IGRhdGEgJWRcbiIsIHJjKTsKKyAgICAgICAgZXJyb3JfcmVwb3J0KCJmYWlsZWQgdG8g Y29weSBkYXRhICVkIiwgcmMpOwogICAgICAgICBpb3JlcS0+YWlvX2Vycm9ycysrOwogICAgICAg ICByZXR1cm4gLTE7CiAgICAgfQpAQCAtMjk4LDggKzI2Nyw5IEBAIHN0YXRpYyB2b2lkIHFlbXVf YWlvX2NvbXBsZXRlKHZvaWQgKm9wYXF1ZSwgaW50IHJldCkKICAgICBhaW9fY29udGV4dF9hY3F1 aXJlKGJsa2Rldi0+Y3R4KTsKIAogICAgIGlmIChyZXQgIT0gMCkgewotICAgICAgICB4ZW5fcHZf cHJpbnRmKHhlbmRldiwgMCwgIiVzIEkvTyBlcnJvclxuIiwKLSAgICAgICAgICAgICAgICAgICAg ICBpb3JlcS0+cmVxLm9wZXJhdGlvbiA9PSBCTEtJRl9PUF9SRUFEID8gInJlYWQiIDogIndyaXRl Iik7CisgICAgICAgIGVycm9yX3JlcG9ydCgiJXMgSS9PIGVycm9yIiwKKyAgICAgICAgICAgICAg ICAgICAgIGlvcmVxLT5yZXEub3BlcmF0aW9uID09IEJMS0lGX09QX1JFQUQgPworICAgICAgICAg ICAgICAgICAgICAgInJlYWQiIDogIndyaXRlIik7CiAgICAgICAgIGlvcmVxLT5haW9fZXJyb3Jz Kys7CiAgICAgfQogCkBAIC02MDUsOCArNTc1LDYgQEAgc3RhdGljIHZvaWQgYmxrX2hhbmRsZV9y ZXF1ZXN0cyhzdHJ1Y3QgWGVuQmxrRGV2ICpibGtkZXYpCiAgICAgfQogfQogCi0vKiAtLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICov Ci0KIHN0YXRpYyB2b2lkIGJsa19iaCh2b2lkICpvcGFxdWUpCiB7CiAgICAgc3RydWN0IFhlbkJs a0RldiAqYmxrZGV2ID0gb3BhcXVlOwpAQCAtNjM0LDM0NiArNjAyLDYgQEAgc3RhdGljIHZvaWQg YmxrX2FsbG9jKHN0cnVjdCBYZW5MZWdhY3lEZXZpY2UgKnhlbmRldikKICAgICBibGtkZXYtPmJo ID0gYWlvX2JoX25ldyhibGtkZXYtPmN0eCwgYmxrX2JoLCBibGtkZXYpOwogfQogCi1zdGF0aWMg dm9pZCBibGtfcGFyc2VfZGlzY2FyZChzdHJ1Y3QgWGVuQmxrRGV2ICpibGtkZXYpCi17Ci0gICAg c3RydWN0IFhlbkxlZ2FjeURldmljZSAqeGVuZGV2ID0gJmJsa2Rldi0+eGVuZGV2OwotICAgIGlu dCBlbmFibGU7Ci0KLSAgICBibGtkZXYtPmZlYXR1cmVfZGlzY2FyZCA9IHRydWU7Ci0KLSAgICBp ZiAoeGVuc3RvcmVfcmVhZF9iZV9pbnQoeGVuZGV2LCAiZGlzY2FyZC1lbmFibGUiLCAmZW5hYmxl KSA9PSAwKSB7Ci0gICAgICAgIGJsa2Rldi0+ZmVhdHVyZV9kaXNjYXJkID0gISFlbmFibGU7Ci0g ICAgfQotCi0gICAgaWYgKGJsa2Rldi0+ZmVhdHVyZV9kaXNjYXJkKSB7Ci0gICAgICAgIHhlbnN0 b3JlX3dyaXRlX2JlX2ludCh4ZW5kZXYsICJmZWF0dXJlLWRpc2NhcmQiLCAxKTsKLSAgICB9Ci19 Ci0KLXN0YXRpYyBpbnQgYmxrX2luaXQoc3RydWN0IFhlbkxlZ2FjeURldmljZSAqeGVuZGV2KQot ewotICAgIHN0cnVjdCBYZW5CbGtEZXYgKmJsa2RldiA9IGNvbnRhaW5lcl9vZih4ZW5kZXYsIHN0 cnVjdCBYZW5CbGtEZXYsIHhlbmRldik7Ci0gICAgaW50IGluZm8gPSAwOwotICAgIGNoYXIgKmRp cmVjdGlvc2FmZSA9IE5VTEw7Ci0KLSAgICB0cmFjZV94ZW5fZGlza19pbml0KHhlbmRldi0+bmFt ZSk7Ci0KLSAgICAvKiByZWFkIHhlbnN0b3JlIGVudHJpZXMgKi8KLSAgICBpZiAoYmxrZGV2LT5w YXJhbXMgPT0gTlVMTCkgewotICAgICAgICBjaGFyICpoID0gTlVMTDsKLSAgICAgICAgYmxrZGV2 LT5wYXJhbXMgPSB4ZW5zdG9yZV9yZWFkX2JlX3N0cih4ZW5kZXYsICJwYXJhbXMiKTsKLSAgICAg ICAgaWYgKGJsa2Rldi0+cGFyYW1zICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGggPSBzdHJjaHIo YmxrZGV2LT5wYXJhbXMsICc6Jyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGggIT0gTlVMTCkg ewotICAgICAgICAgICAgYmxrZGV2LT5maWxlcHJvdG8gPSBibGtkZXYtPnBhcmFtczsKLSAgICAg ICAgICAgIGJsa2Rldi0+ZmlsZW5hbWUgID0gaCArIDE7Ci0gICAgICAgICAgICAqaCA9IDA7Ci0g ICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBibGtkZXYtPmZpbGVwcm90byA9ICI8dW5zZXQ+ IjsKLSAgICAgICAgICAgIGJsa2Rldi0+ZmlsZW5hbWUgID0gYmxrZGV2LT5wYXJhbXM7Ci0gICAg ICAgIH0KLSAgICB9Ci0gICAgaWYgKCFzdHJjbXAoImFpbyIsIGJsa2Rldi0+ZmlsZXByb3RvKSkg ewotICAgICAgICBibGtkZXYtPmZpbGVwcm90byA9ICJyYXciOwotICAgIH0KLSAgICBpZiAoIXN0 cmNtcCgidmhkIiwgYmxrZGV2LT5maWxlcHJvdG8pKSB7Ci0gICAgICAgIGJsa2Rldi0+ZmlsZXBy b3RvID0gInZwYyI7Ci0gICAgfQotICAgIGlmIChibGtkZXYtPm1vZGUgPT0gTlVMTCkgewotICAg ICAgICBibGtkZXYtPm1vZGUgPSB4ZW5zdG9yZV9yZWFkX2JlX3N0cih4ZW5kZXYsICJtb2RlIik7 Ci0gICAgfQotICAgIGlmIChibGtkZXYtPnR5cGUgPT0gTlVMTCkgewotICAgICAgICBibGtkZXYt PnR5cGUgPSB4ZW5zdG9yZV9yZWFkX2JlX3N0cih4ZW5kZXYsICJ0eXBlIik7Ci0gICAgfQotICAg IGlmIChibGtkZXYtPmRldiA9PSBOVUxMKSB7Ci0gICAgICAgIGJsa2Rldi0+ZGV2ID0geGVuc3Rv cmVfcmVhZF9iZV9zdHIoeGVuZGV2LCAiZGV2Iik7Ci0gICAgfQotICAgIGlmIChibGtkZXYtPmRl dnR5cGUgPT0gTlVMTCkgewotICAgICAgICBibGtkZXYtPmRldnR5cGUgPSB4ZW5zdG9yZV9yZWFk X2JlX3N0cih4ZW5kZXYsICJkZXZpY2UtdHlwZSIpOwotICAgIH0KLSAgICBkaXJlY3Rpb3NhZmUg PSB4ZW5zdG9yZV9yZWFkX2JlX3N0cih4ZW5kZXYsICJkaXJlY3QtaW8tc2FmZSIpOwotICAgIGJs a2Rldi0+ZGlyZWN0aW9zYWZlID0gKGRpcmVjdGlvc2FmZSAmJiBhdG9pKGRpcmVjdGlvc2FmZSkp OwotCi0gICAgLyogZG8gd2UgaGF2ZSBhbGwgd2UgbmVlZD8gKi8KLSAgICBpZiAoYmxrZGV2LT5w YXJhbXMgPT0gTlVMTCB8fAotICAgICAgICBibGtkZXYtPm1vZGUgPT0gTlVMTCAgIHx8Ci0gICAg ICAgIGJsa2Rldi0+dHlwZSA9PSBOVUxMICAgfHwKLSAgICAgICAgYmxrZGV2LT5kZXYgPT0gTlVM TCkgewotICAgICAgICBnb3RvIG91dF9lcnJvcjsKLSAgICB9Ci0KLSAgICAvKiByZWFkLW9ubHkg PyAqLwotICAgIGlmIChzdHJjbXAoYmxrZGV2LT5tb2RlLCAidyIpKSB7Ci0gICAgICAgIGluZm8g IHw9IFZESVNLX1JFQURPTkxZOwotICAgIH0KLQotICAgIC8qIGNkcm9tID8gKi8KLSAgICBpZiAo YmxrZGV2LT5kZXZ0eXBlICYmICFzdHJjbXAoYmxrZGV2LT5kZXZ0eXBlLCAiY2Ryb20iKSkgewot ICAgICAgICBpbmZvICB8PSBWRElTS19DRFJPTTsKLSAgICB9Ci0KLSAgICBibGtkZXYtPmZpbGVf YmxrICA9IEJMT0NLX1NJWkU7Ci0KLSAgICAvKiBmaWxsIGluZm8KLSAgICAgKiBibGtfY29ubmVj dCBzdXBwbGllcyBzZWN0b3Itc2l6ZSBhbmQgc2VjdG9ycwotICAgICAqLwotICAgIHhlbnN0b3Jl X3dyaXRlX2JlX2ludCh4ZW5kZXYsICJmZWF0dXJlLWZsdXNoLWNhY2hlIiwgMSk7Ci0gICAgeGVu c3RvcmVfd3JpdGVfYmVfaW50KHhlbmRldiwgImluZm8iLCBpbmZvKTsKLQotICAgIHhlbnN0b3Jl X3dyaXRlX2JlX2ludCh4ZW5kZXYsICJtYXgtcmluZy1wYWdlLW9yZGVyIiwKLSAgICAgICAgICAg ICAgICAgICAgICAgICAgTUFYX1JJTkdfUEFHRV9PUkRFUik7Ci0KLSAgICBibGtfcGFyc2VfZGlz Y2FyZChibGtkZXYpOwotCi0gICAgZ19mcmVlKGRpcmVjdGlvc2FmZSk7Ci0gICAgcmV0dXJuIDA7 Ci0KLW91dF9lcnJvcjoKLSAgICBnX2ZyZWUoYmxrZGV2LT5wYXJhbXMpOwotICAgIGJsa2Rldi0+ cGFyYW1zID0gTlVMTDsKLSAgICBnX2ZyZWUoYmxrZGV2LT5tb2RlKTsKLSAgICBibGtkZXYtPm1v ZGUgPSBOVUxMOwotICAgIGdfZnJlZShibGtkZXYtPnR5cGUpOwotICAgIGJsa2Rldi0+dHlwZSA9 IE5VTEw7Ci0gICAgZ19mcmVlKGJsa2Rldi0+ZGV2KTsKLSAgICBibGtkZXYtPmRldiA9IE5VTEw7 Ci0gICAgZ19mcmVlKGJsa2Rldi0+ZGV2dHlwZSk7Ci0gICAgYmxrZGV2LT5kZXZ0eXBlID0gTlVM TDsKLSAgICBnX2ZyZWUoZGlyZWN0aW9zYWZlKTsKLSAgICBibGtkZXYtPmRpcmVjdGlvc2FmZSA9 IGZhbHNlOwotICAgIHJldHVybiAtMTsKLX0KLQotc3RhdGljIGludCBibGtfY29ubmVjdChzdHJ1 Y3QgWGVuTGVnYWN5RGV2aWNlICp4ZW5kZXYpCi17Ci0gICAgc3RydWN0IFhlbkJsa0RldiAqYmxr ZGV2ID0gY29udGFpbmVyX29mKHhlbmRldiwgc3RydWN0IFhlbkJsa0RldiwgeGVuZGV2KTsKLSAg ICBpbnQgaW5kZXgsIHFmbGFnczsKLSAgICBib29sIHJlYWRvbmx5ID0gdHJ1ZTsKLSAgICBib29s IHdyaXRldGhyb3VnaCA9IHRydWU7Ci0gICAgaW50IG9yZGVyLCByaW5nX3JlZjsKLSAgICB1bnNp Z25lZCBpbnQgcmluZ19zaXplLCBtYXhfZ3JhbnRzOwotICAgIHVuc2lnbmVkIGludCBpOwotCi0g ICAgdHJhY2VfeGVuX2Rpc2tfY29ubmVjdCh4ZW5kZXYtPm5hbWUpOwotCi0gICAgLyogcmVhZC1v bmx5ID8gKi8KLSAgICBpZiAoYmxrZGV2LT5kaXJlY3Rpb3NhZmUpIHsKLSAgICAgICAgcWZsYWdz ID0gQkRSVl9PX05PQ0FDSEUgfCBCRFJWX09fTkFUSVZFX0FJTzsKLSAgICB9IGVsc2UgewotICAg ICAgICBxZmxhZ3MgPSAwOwotICAgICAgICB3cml0ZXRocm91Z2ggPSBmYWxzZTsKLSAgICB9Ci0g ICAgaWYgKHN0cmNtcChibGtkZXYtPm1vZGUsICJ3IikgPT0gMCkgewotICAgICAgICBxZmxhZ3Mg fD0gQkRSVl9PX1JEV1I7Ci0gICAgICAgIHJlYWRvbmx5ID0gZmFsc2U7Ci0gICAgfQotICAgIGlm IChibGtkZXYtPmZlYXR1cmVfZGlzY2FyZCkgewotICAgICAgICBxZmxhZ3MgfD0gQkRSVl9PX1VO TUFQOwotICAgIH0KLQotICAgIC8qIGluaXQgcWVtdSBibG9jayBkcml2ZXIgKi8KLSAgICBpbmRl eCA9ICh4ZW5kZXYtPmRldiAtIDIwMiAqIDI1NikgLyAxNjsKLSAgICBibGtkZXYtPmRpbmZvID0g ZHJpdmVfZ2V0KElGX1hFTiwgMCwgaW5kZXgpOwotICAgIGlmICghYmxrZGV2LT5kaW5mbykgewot ICAgICAgICBFcnJvciAqbG9jYWxfZXJyID0gTlVMTDsKLSAgICAgICAgUURpY3QgKm9wdGlvbnMg PSBOVUxMOwotCi0gICAgICAgIGlmIChzdHJjbXAoYmxrZGV2LT5maWxlcHJvdG8sICI8dW5zZXQ+ IikpIHsKLSAgICAgICAgICAgIG9wdGlvbnMgPSBxZGljdF9uZXcoKTsKLSAgICAgICAgICAgIHFk aWN0X3B1dF9zdHIob3B0aW9ucywgImRyaXZlciIsIGJsa2Rldi0+ZmlsZXByb3RvKTsKLSAgICAg ICAgfQotCi0gICAgICAgIC8qIHNldHVwIHZpYSB4ZW5idXMgLT4gY3JlYXRlIG5ldyBibG9jayBk cml2ZXIgaW5zdGFuY2UgKi8KLSAgICAgICAgeGVuX3B2X3ByaW50Zih4ZW5kZXYsIDIsICJjcmVh dGUgbmV3IGJkcnYgKHhlbmJ1cyBzZXR1cClcbiIpOwotICAgICAgICBibGtkZXYtPmJsayA9IGJs a19uZXdfb3BlbihibGtkZXYtPmZpbGVuYW1lLCBOVUxMLCBvcHRpb25zLAotICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBxZmxhZ3MsICZsb2NhbF9lcnIpOwotICAgICAgICBpZiAo IWJsa2Rldi0+YmxrKSB7Ci0gICAgICAgICAgICB4ZW5fcHZfcHJpbnRmKHhlbmRldiwgMCwgImVy cm9yOiAlc1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfZ2V0X3ByZXR0eShs b2NhbF9lcnIpKTsKLSAgICAgICAgICAgIGVycm9yX2ZyZWUobG9jYWxfZXJyKTsKLSAgICAgICAg ICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBibGtfc2V0X2VuYWJsZV93cml0ZV9j YWNoZShibGtkZXYtPmJsaywgIXdyaXRldGhyb3VnaCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAg Lyogc2V0dXAgdmlhIHFlbXUgY21kbGluZSAtPiBhbHJlYWR5IHNldHVwIGZvciB1cyAqLwotICAg ICAgICB4ZW5fcHZfcHJpbnRmKHhlbmRldiwgMiwKLSAgICAgICAgICAgICAgICAgICAgICAiZ2V0 IGNvbmZpZ3VyZWQgYmRydiAoY21kbGluZSBzZXR1cClcbiIpOwotICAgICAgICBibGtkZXYtPmJs ayA9IGJsa19ieV9sZWdhY3lfZGluZm8oYmxrZGV2LT5kaW5mbyk7Ci0gICAgICAgIGlmIChibGtf aXNfcmVhZF9vbmx5KGJsa2Rldi0+YmxrKSAmJiAhcmVhZG9ubHkpIHsKLSAgICAgICAgICAgIHhl bl9wdl9wcmludGYoeGVuZGV2LCAwLCAiVW5leHBlY3RlZCByZWFkLW9ubHkgZHJpdmUiKTsKLSAg ICAgICAgICAgIGJsa2Rldi0+YmxrID0gTlVMTDsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAg ICAgICAgfQotICAgICAgICAvKiBibGtkZXYtPmJsayBpcyBub3QgY3JlYXRlIGJ5IHVzLCB3ZSBn ZXQgYSByZWZlcmVuY2UKLSAgICAgICAgICogc28gd2UgY2FuIGJsa191bnJlZigpIHVuY29uZGl0 aW9uYWxseSAqLwotICAgICAgICBibGtfcmVmKGJsa2Rldi0+YmxrKTsKLSAgICB9Ci0gICAgYmxr X2F0dGFjaF9kZXZfbGVnYWN5KGJsa2Rldi0+YmxrLCBibGtkZXYpOwotICAgIGJsa2Rldi0+Zmls ZV9zaXplID0gYmxrX2dldGxlbmd0aChibGtkZXYtPmJsayk7Ci0gICAgaWYgKGJsa2Rldi0+Zmls ZV9zaXplIDwgMCkgewotICAgICAgICBCbG9ja0RyaXZlclN0YXRlICpicyA9IGJsa19icyhibGtk ZXYtPmJsayk7Ci0gICAgICAgIGNvbnN0IGNoYXIgKmRydl9uYW1lID0gYnMgPyBiZHJ2X2dldF9m b3JtYXRfbmFtZShicykgOiBOVUxMOwotICAgICAgICB4ZW5fcHZfcHJpbnRmKHhlbmRldiwgMSwg ImJsa19nZXRsZW5ndGg6ICVkICglcykgfCBkcnYgJXNcbiIsCi0gICAgICAgICAgICAgICAgICAg ICAgKGludClibGtkZXYtPmZpbGVfc2l6ZSwgc3RyZXJyb3IoLWJsa2Rldi0+ZmlsZV9zaXplKSwK LSAgICAgICAgICAgICAgICAgICAgICBkcnZfbmFtZSA/OiAiLSIpOwotICAgICAgICBibGtkZXYt PmZpbGVfc2l6ZSA9IDA7Ci0gICAgfQotCi0gICAgeGVuX3B2X3ByaW50Zih4ZW5kZXYsIDEsICJ0 eXBlIFwiJXNcIiwgZmlsZXByb3RvIFwiJXNcIiwgZmlsZW5hbWUgXCIlc1wiLCIKLSAgICAgICAg ICAgICAgICAgICIgc2l6ZSAlIiBQUklkNjQgIiAoJSIgUFJJZDY0ICIgTUIpXG4iLAotICAgICAg ICAgICAgICAgICAgYmxrZGV2LT50eXBlLCBibGtkZXYtPmZpbGVwcm90bywgYmxrZGV2LT5maWxl bmFtZSwKLSAgICAgICAgICAgICAgICAgIGJsa2Rldi0+ZmlsZV9zaXplLCBibGtkZXYtPmZpbGVf c2l6ZSAvIE1pQik7Ci0KLSAgICAvKiBGaWxsIGluIG51bWJlciBvZiBzZWN0b3Igc2l6ZSBhbmQg bnVtYmVyIG9mIHNlY3RvcnMgKi8KLSAgICB4ZW5zdG9yZV93cml0ZV9iZV9pbnQoeGVuZGV2LCAi c2VjdG9yLXNpemUiLCBibGtkZXYtPmZpbGVfYmxrKTsKLSAgICB4ZW5zdG9yZV93cml0ZV9iZV9p bnQ2NCh4ZW5kZXYsICJzZWN0b3JzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGtk ZXYtPmZpbGVfc2l6ZSAvIGJsa2Rldi0+ZmlsZV9ibGspOwotCi0gICAgaWYgKHhlbnN0b3JlX3Jl YWRfZmVfaW50KHhlbmRldiwgInJpbmctcGFnZS1vcmRlciIsCi0gICAgICAgICAgICAgICAgICAg ICAgICAgICAgICZvcmRlcikgPT0gLTEpIHsKLSAgICAgICAgYmxrZGV2LT5ucl9yaW5nX3JlZiA9 IDE7Ci0KLSAgICAgICAgaWYgKHhlbnN0b3JlX3JlYWRfZmVfaW50KHhlbmRldiwgInJpbmctcmVm IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyaW5nX3JlZikgPT0gLTEpIHsK LSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBibGtkZXYtPnJpbmdf cmVmWzBdID0gcmluZ19yZWY7Ci0KLSAgICB9IGVsc2UgaWYgKG9yZGVyID49IDAgJiYgb3JkZXIg PD0gTUFYX1JJTkdfUEFHRV9PUkRFUikgewotICAgICAgICBibGtkZXYtPm5yX3JpbmdfcmVmID0g MSA8PCBvcmRlcjsKLQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYmxrZGV2LT5ucl9yaW5nX3Jl ZjsgaSsrKSB7Ci0gICAgICAgICAgICBjaGFyICprZXk7Ci0KLSAgICAgICAgICAgIGtleSA9IGdf c3RyZHVwX3ByaW50ZigicmluZy1yZWYldSIsIGkpOwotICAgICAgICAgICAgaWYgKCFrZXkpIHsK LSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAg IGlmICh4ZW5zdG9yZV9yZWFkX2ZlX2ludCh4ZW5kZXYsIGtleSwKLSAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAmcmluZ19yZWYpID09IC0xKSB7Ci0gICAgICAgICAgICAgICAg Z19mcmVlKGtleSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfQot ICAgICAgICAgICAgYmxrZGV2LT5yaW5nX3JlZltpXSA9IHJpbmdfcmVmOwotCi0gICAgICAgICAg ICBnX2ZyZWUoa2V5KTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIHhlbl9wdl9w cmludGYoeGVuZGV2LCAwLCAiaW52YWxpZCByaW5nLXBhZ2Utb3JkZXI6ICVkXG4iLAotICAgICAg ICAgICAgICAgICAgICAgIG9yZGVyKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAg IGlmICh4ZW5zdG9yZV9yZWFkX2ZlX2ludCh4ZW5kZXYsICJldmVudC1jaGFubmVsIiwKLSAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgJnhlbmRldi0+cmVtb3RlX3BvcnQpID09IC0xKSB7Ci0g ICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBpZiAoIXhlbmRldi0+cHJvdG9jb2wpIHsK LSAgICAgICAgYmxrZGV2LT5wcm90b2NvbCA9IEJMS0lGX1BST1RPQ09MX05BVElWRTsKLSAgICB9 IGVsc2UgaWYgKHN0cmNtcCh4ZW5kZXYtPnByb3RvY29sLCBYRU5fSU9fUFJPVE9fQUJJX05BVElW RSkgPT0gMCkgewotICAgICAgICBibGtkZXYtPnByb3RvY29sID0gQkxLSUZfUFJPVE9DT0xfTkFU SVZFOwotICAgIH0gZWxzZSBpZiAoc3RyY21wKHhlbmRldi0+cHJvdG9jb2wsIFhFTl9JT19QUk9U T19BQklfWDg2XzMyKSA9PSAwKSB7Ci0gICAgICAgIGJsa2Rldi0+cHJvdG9jb2wgPSBCTEtJRl9Q Uk9UT0NPTF9YODZfMzI7Ci0gICAgfSBlbHNlIGlmIChzdHJjbXAoeGVuZGV2LT5wcm90b2NvbCwg WEVOX0lPX1BST1RPX0FCSV9YODZfNjQpID09IDApIHsKLSAgICAgICAgYmxrZGV2LT5wcm90b2Nv bCA9IEJMS0lGX1BST1RPQ09MX1g4Nl82NDsKLSAgICB9IGVsc2UgewotICAgICAgICBibGtkZXYt PnByb3RvY29sID0gQkxLSUZfUFJPVE9DT0xfTkFUSVZFOwotICAgIH0KLQotICAgIHJpbmdfc2l6 ZSA9IFhDX1BBR0VfU0laRSAqIGJsa2Rldi0+bnJfcmluZ19yZWY7Ci0gICAgc3dpdGNoIChibGtk ZXYtPnByb3RvY29sKSB7Ci0gICAgY2FzZSBCTEtJRl9QUk9UT0NPTF9OQVRJVkU6Ci0gICAgewot ICAgICAgICBibGtkZXYtPm1heF9yZXF1ZXN0cyA9IF9fQ09OU1RfUklOR19TSVpFKGJsa2lmLCBy aW5nX3NpemUpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBCTEtJRl9QUk9UT0NP TF9YODZfMzI6Ci0gICAgewotICAgICAgICBibGtkZXYtPm1heF9yZXF1ZXN0cyA9IF9fQ09OU1Rf UklOR19TSVpFKGJsa2lmX3g4Nl8zMiwgcmluZ19zaXplKTsKLSAgICAgICAgYnJlYWs7Ci0gICAg fQotICAgIGNhc2UgQkxLSUZfUFJPVE9DT0xfWDg2XzY0OgotICAgIHsKLSAgICAgICAgYmxrZGV2 LT5tYXhfcmVxdWVzdHMgPSBfX0NPTlNUX1JJTkdfU0laRShibGtpZl94ODZfNjQsIHJpbmdfc2l6 ZSk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4g LTE7Ci0gICAgfQotCi0gICAgLyogQWRkIG9uIHRoZSBudW1iZXIgbmVlZGVkIGZvciB0aGUgcmlu ZyBwYWdlcyAqLwotICAgIG1heF9ncmFudHMgPSBibGtkZXYtPm5yX3JpbmdfcmVmOwotCi0gICAg eGVuX2JlX3NldF9tYXhfZ3JhbnRfcmVmcyh4ZW5kZXYsIG1heF9ncmFudHMpOwotICAgIGJsa2Rl di0+c3JpbmcgPSB4ZW5fYmVfbWFwX2dyYW50X3JlZnMoeGVuZGV2LCBibGtkZXYtPnJpbmdfcmVm LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxrZGV2LT5ucl9y aW5nX3JlZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST1Rf UkVBRCB8IFBST1RfV1JJVEUpOwotICAgIGlmICghYmxrZGV2LT5zcmluZykgewotICAgICAgICBy ZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgc3dpdGNoIChibGtkZXYtPnByb3RvY29sKSB7Ci0gICAg Y2FzZSBCTEtJRl9QUk9UT0NPTF9OQVRJVkU6Ci0gICAgewotICAgICAgICBibGtpZl9zcmluZ190 ICpzcmluZ19uYXRpdmUgPSBibGtkZXYtPnNyaW5nOwotICAgICAgICBCQUNLX1JJTkdfSU5JVCgm YmxrZGV2LT5yaW5ncy5uYXRpdmUsIHNyaW5nX25hdGl2ZSwgcmluZ19zaXplKTsKLSAgICAgICAg YnJlYWs7Ci0gICAgfQotICAgIGNhc2UgQkxLSUZfUFJPVE9DT0xfWDg2XzMyOgotICAgIHsKLSAg ICAgICAgYmxraWZfeDg2XzMyX3NyaW5nX3QgKnNyaW5nX3g4Nl8zMiA9IGJsa2Rldi0+c3Jpbmc7 Ci0KLSAgICAgICAgQkFDS19SSU5HX0lOSVQoJmJsa2Rldi0+cmluZ3MueDg2XzMyX3BhcnQsIHNy aW5nX3g4Nl8zMiwgcmluZ19zaXplKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2Ug QkxLSUZfUFJPVE9DT0xfWDg2XzY0OgotICAgIHsKLSAgICAgICAgYmxraWZfeDg2XzY0X3NyaW5n X3QgKnNyaW5nX3g4Nl82NCA9IGJsa2Rldi0+c3Jpbmc7Ci0KLSAgICAgICAgQkFDS19SSU5HX0lO SVQoJmJsa2Rldi0+cmluZ3MueDg2XzY0X3BhcnQsIHNyaW5nX3g4Nl82NCwgcmluZ19zaXplKTsK LSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIH0KLQotICAgIGJsa19zZXRfYWlvX2NvbnRleHQo YmxrZGV2LT5ibGssIGJsa2Rldi0+Y3R4KTsKLQotICAgIHhlbl9iZV9iaW5kX2V2dGNobih4ZW5k ZXYpOwotCi0gICAgeGVuX3B2X3ByaW50Zih4ZW5kZXYsIDEsICJvazogcHJvdG8gJXMsIG5yLXJp bmctcmVmICV1LCAiCi0gICAgICAgICAgICAgICAgICAicmVtb3RlIHBvcnQgJWQsIGxvY2FsIHBv cnQgJWRcbiIsCi0gICAgICAgICAgICAgICAgICB4ZW5kZXYtPnByb3RvY29sLCBibGtkZXYtPm5y X3JpbmdfcmVmLAotICAgICAgICAgICAgICAgICAgeGVuZGV2LT5yZW1vdGVfcG9ydCwgeGVuZGV2 LT5sb2NhbF9wb3J0KTsKLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgYmxrX2Rpc2Nv bm5lY3Qoc3RydWN0IFhlbkxlZ2FjeURldmljZSAqeGVuZGV2KQotewotICAgIHN0cnVjdCBYZW5C bGtEZXYgKmJsa2RldiA9IGNvbnRhaW5lcl9vZih4ZW5kZXYsIHN0cnVjdCBYZW5CbGtEZXYsIHhl bmRldik7Ci0KLSAgICB0cmFjZV94ZW5fZGlza19kaXNjb25uZWN0KHhlbmRldi0+bmFtZSk7Ci0K LSAgICBhaW9fY29udGV4dF9hY3F1aXJlKGJsa2Rldi0+Y3R4KTsKLQotICAgIGlmIChibGtkZXYt PmJsaykgewotICAgICAgICBibGtfc2V0X2Fpb19jb250ZXh0KGJsa2Rldi0+YmxrLCBxZW11X2dl dF9haW9fY29udGV4dCgpKTsKLSAgICAgICAgYmxrX2RldGFjaF9kZXYoYmxrZGV2LT5ibGssIGJs a2Rldik7Ci0gICAgICAgIGJsa191bnJlZihibGtkZXYtPmJsayk7Ci0gICAgICAgIGJsa2Rldi0+ YmxrID0gTlVMTDsKLSAgICB9Ci0gICAgeGVuX3B2X3VuYmluZF9ldnRjaG4oeGVuZGV2KTsKLQot ICAgIGFpb19jb250ZXh0X3JlbGVhc2UoYmxrZGV2LT5jdHgpOwotCi0gICAgaWYgKGJsa2Rldi0+ c3JpbmcpIHsKLSAgICAgICAgeGVuX2JlX3VubWFwX2dyYW50X3JlZnMoeGVuZGV2LCBibGtkZXYt PnNyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGtkZXYtPm5yX3Jpbmdf cmVmKTsKLSAgICAgICAgYmxrZGV2LT5zcmluZyA9IE5VTEw7Ci0gICAgfQotfQotCiBzdGF0aWMg aW50IGJsa19mcmVlKHN0cnVjdCBYZW5MZWdhY3lEZXZpY2UgKnhlbmRldikKIHsKICAgICBzdHJ1 Y3QgWGVuQmxrRGV2ICpibGtkZXYgPSBjb250YWluZXJfb2YoeGVuZGV2LCBzdHJ1Y3QgWGVuQmxr RGV2LCB4ZW5kZXYpOwpAQCAtMTAwNiwxNCArNjM0LDMgQEAgc3RhdGljIHZvaWQgYmxrX2V2ZW50 KHN0cnVjdCBYZW5MZWdhY3lEZXZpY2UgKnhlbmRldikKIAogICAgIHFlbXVfYmhfc2NoZWR1bGUo YmxrZGV2LT5iaCk7CiB9Ci0KLXN0cnVjdCBYZW5EZXZPcHMgeGVuX2Jsa2Rldl9vcHMgPSB7Ci0g ICAgLmZsYWdzICAgICAgPSBERVZPUFNfRkxBR19ORUVEX0dOVERFViwKLSAgICAuc2l6ZSAgICAg ICA9IHNpemVvZihzdHJ1Y3QgWGVuQmxrRGV2KSwKLSAgICAuYWxsb2MgICAgICA9IGJsa19hbGxv YywKLSAgICAuaW5pdCAgICAgICA9IGJsa19pbml0LAotICAgIC5pbml0aWFsaXNlID0gYmxrX2Nv bm5lY3QsCi0gICAgLmRpc2Nvbm5lY3QgPSBibGtfZGlzY29ubmVjdCwKLSAgICAuZXZlbnQgICAg ICA9IGJsa19ldmVudCwKLSAgICAuZnJlZSAgICAgICA9IGJsa19mcmVlLAotfTsKLS0gCkFudGhv bnkgUEVSQVJECgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X18KWGVuLWRldmVsIG1haWxpbmcgbGlzdApYZW4tZGV2ZWxAbGlzdHMueGVucHJvamVjdC5vcmcK aHR0cHM6Ly9saXN0cy54ZW5wcm9qZWN0Lm9yZy9tYWlsbWFuL2xpc3RpbmZvL3hlbi1kZXZlbA==