From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([209.51.188.92]:47492) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gj2mG-0007cI-8L for qemu-devel@nongnu.org; Mon, 14 Jan 2019 08:59:47 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gj2mD-00052R-8U for qemu-devel@nongnu.org; Mon, 14 Jan 2019 08:59:44 -0500 Received: from smtp03.citrix.com ([162.221.156.55]:1427) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1gj2mC-00050B-RR for qemu-devel@nongnu.org; Mon, 14 Jan 2019 08:59:41 -0500 From: Anthony PERARD Date: Mon, 14 Jan 2019 13:51:49 +0000 Message-ID: <20190114135154.16826-21-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 20/25] xen: remove the legacy 'xen_disk' backend 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 This backend has now been replaced by the 'xen-qdisk' XenDevice. Signed-off-by: Paul Durrant Acked-by: Anthony Perard Signed-off-by: Anthony PERARD --- hw/block/Makefile.objs | 1 - hw/block/xen_disk.c | 1011 ---------------------------------------- 2 files changed, 1012 deletions(-) delete mode 100644 hw/block/xen_disk.c diff --git a/hw/block/Makefile.objs b/hw/block/Makefile.objs index f34813a377..e206b8e712 100644 --- a/hw/block/Makefile.objs +++ b/hw/block/Makefile.objs @@ -5,7 +5,6 @@ common-obj-$(CONFIG_NAND) += nand.o common-obj-$(CONFIG_PFLASH_CFI01) += pflash_cfi01.o common-obj-$(CONFIG_PFLASH_CFI02) += pflash_cfi02.o common-obj-$(CONFIG_XEN) += xen-block.o -common-obj-$(CONFIG_XEN) += xen_disk.o common-obj-$(CONFIG_ECC) += ecc.o common-obj-$(CONFIG_ONENAND) += onenand.o common-obj-$(CONFIG_NVME_PCI) += nvme.o diff --git a/hw/block/xen_disk.c b/hw/block/xen_disk.c deleted file mode 100644 index 477dfcca9f..0000000000 --- a/hw/block/xen_disk.c +++ /dev/null @@ -1,1011 +0,0 @@ -/* - * xen paravirt block device backend - * - * (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 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 . - * - * 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-legacy-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; - - /* parsed request */ - off_t start; - QEMUIOVector v; - void *buf; - size_t size; - int presync; - - /* aio status */ - int aio_inflight; - int aio_errors; - - struct XenBlkDev *blkdev; - QLIST_ENTRY(ioreq) list; - BlockAcctCookie acct; -}; - -#define MAX_RING_PAGE_ORDER 4 - -struct XenBlkDev { - struct XenLegacyDevice xendev; /* must be first */ - char *params; - char *mode; - char *type; - char *dev; - char *devtype; - bool directiosafe; - const char *fileproto; - const char *filename; - unsigned int ring_ref[1 << MAX_RING_PAGE_ORDER]; - unsigned int nr_ring_ref; - void *sring; - int64_t file_blk; - int64_t file_size; - int protocol; - blkif_back_rings_t rings; - int more_work; - - /* request lists */ - QLIST_HEAD(, ioreq) inflight; - QLIST_HEAD(, ioreq) finished; - QLIST_HEAD(, ioreq) freelist; - int requests_total; - int requests_inflight; - int requests_finished; - unsigned int max_requests; - - gboolean feature_discard; - - /* qemu block driver */ - DriveInfo *dinfo; - BlockBackend *blk; - QEMUBH *bh; - - IOThread *iothread; - AioContext *ctx; -}; - -/* ------------------------------------------------------------- */ - -static void ioreq_reset(struct ioreq *ioreq) -{ - memset(&ioreq->req, 0, sizeof(ioreq->req)); - ioreq->status = 0; - ioreq->start = 0; - ioreq->buf = NULL; - ioreq->size = 0; - ioreq->presync = 0; - - ioreq->aio_inflight = 0; - ioreq->aio_errors = 0; - - ioreq->blkdev = NULL; - memset(&ioreq->list, 0, sizeof(ioreq->list)); - memset(&ioreq->acct, 0, sizeof(ioreq->acct)); - - qemu_iovec_reset(&ioreq->v); -} - -static struct ioreq *ioreq_start(struct XenBlkDev *blkdev) -{ - struct ioreq *ioreq = NULL; - - if (QLIST_EMPTY(&blkdev->freelist)) { - if (blkdev->requests_total >= blkdev->max_requests) { - goto out; - } - /* allocate new struct */ - ioreq = g_malloc0(sizeof(*ioreq)); - ioreq->blkdev = blkdev; - blkdev->requests_total++; - qemu_iovec_init(&ioreq->v, 1); - } else { - /* get one from freelist */ - ioreq = QLIST_FIRST(&blkdev->freelist); - QLIST_REMOVE(ioreq, list); - } - QLIST_INSERT_HEAD(&blkdev->inflight, ioreq, list); - blkdev->requests_inflight++; - -out: - return ioreq; -} - -static void ioreq_finish(struct ioreq *ioreq) -{ - struct XenBlkDev *blkdev = ioreq->blkdev; - - QLIST_REMOVE(ioreq, list); - QLIST_INSERT_HEAD(&blkdev->finished, ioreq, list); - blkdev->requests_inflight--; - blkdev->requests_finished++; -} - -static void ioreq_release(struct ioreq *ioreq, bool finish) -{ - struct XenBlkDev *blkdev = ioreq->blkdev; - - QLIST_REMOVE(ioreq, list); - ioreq_reset(ioreq); - ioreq->blkdev = blkdev; - QLIST_INSERT_HEAD(&blkdev->freelist, ioreq, list); - if (finish) { - blkdev->requests_finished--; - } else { - blkdev->requests_inflight--; - } -} - -/* - * translate request into iovec + start offset - * do sanity checks along the way - */ -static int ioreq_parse(struct ioreq *ioreq) -{ - struct XenBlkDev *blkdev = ioreq->blkdev; - struct XenLegacyDevice *xendev = &blkdev->xendev; - 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; - case BLKIF_OP_FLUSH_DISKCACHE: - ioreq->presync = 1; - if (!ioreq->req.nr_segments) { - return 0; - } - /* fall through */ - case BLKIF_OP_WRITE: - break; - case BLKIF_OP_DISCARD: - return 0; - default: - xen_pv_printf(xendev, 0, "error: unknown operation (%d)\n", - 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"); - 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"); - 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"); - goto err; - } - if (ioreq->req.seg[i].last_sect * BLOCK_SIZE >= XC_PAGE_SIZE) { - xen_pv_printf(xendev, 0, "error: page crossing\n"); - goto err; - } - - len = (ioreq->req.seg[i].last_sect - ioreq->req.seg[i].first_sect + 1) * blkdev->file_blk; - ioreq->size += len; - } - if (ioreq->start + ioreq->size > blkdev->file_size) { - xen_pv_printf(xendev, 0, "error: access beyond end of file\n"); - goto err; - } - return 0; - -err: - ioreq->status = BLKIF_RSP_ERROR; - return -1; -} - -static int ioreq_grant_copy(struct ioreq *ioreq) -{ - struct XenBlkDev *blkdev = ioreq->blkdev; - struct XenLegacyDevice *xendev = &blkdev->xendev; - XenGrantCopySegment segs[BLKIF_MAX_SEGMENTS_PER_REQUEST]; - int i, count, rc; - int64_t file_blk = blkdev->file_blk; - bool to_domain = (ioreq->req.operation == BLKIF_OP_READ); - void *virt = ioreq->buf; - - if (ioreq->req.nr_segments == 0) { - return 0; - } - - count = ioreq->req.nr_segments; - - for (i = 0; i < count; i++) { - if (to_domain) { - segs[i].dest.foreign.ref = ioreq->req.seg[i].gref; - segs[i].dest.foreign.offset = ioreq->req.seg[i].first_sect * file_blk; - segs[i].source.virt = virt; - } else { - segs[i].source.foreign.ref = ioreq->req.seg[i].gref; - segs[i].source.foreign.offset = ioreq->req.seg[i].first_sect * file_blk; - segs[i].dest.virt = virt; - } - segs[i].len = (ioreq->req.seg[i].last_sect - - ioreq->req.seg[i].first_sect + 1) * file_blk; - virt += segs[i].len; - } - - 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); - ioreq->aio_errors++; - return -1; - } - - return rc; -} - -static int ioreq_runio_qemu_aio(struct ioreq *ioreq); - -static void qemu_aio_complete(void *opaque, int ret) -{ - struct ioreq *ioreq = opaque; - struct XenBlkDev *blkdev = ioreq->blkdev; - struct XenLegacyDevice *xendev = &blkdev->xendev; - - 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"); - ioreq->aio_errors++; - } - - ioreq->aio_inflight--; - if (ioreq->presync) { - ioreq->presync = 0; - ioreq_runio_qemu_aio(ioreq); - goto done; - } - if (ioreq->aio_inflight > 0) { - goto done; - } - - switch (ioreq->req.operation) { - case BLKIF_OP_READ: - /* in case of failure ioreq->aio_errors is increased */ - if (ret == 0) { - ioreq_grant_copy(ioreq); - } - qemu_vfree(ioreq->buf); - break; - case BLKIF_OP_WRITE: - case BLKIF_OP_FLUSH_DISKCACHE: - if (!ioreq->req.nr_segments) { - break; - } - qemu_vfree(ioreq->buf); - break; - default: - break; - } - - ioreq->status = ioreq->aio_errors ? BLKIF_RSP_ERROR : BLKIF_RSP_OKAY; - ioreq_finish(ioreq); - - switch (ioreq->req.operation) { - case BLKIF_OP_WRITE: - case BLKIF_OP_FLUSH_DISKCACHE: - if (!ioreq->req.nr_segments) { - break; - } - case BLKIF_OP_READ: - if (ioreq->status == BLKIF_RSP_OKAY) { - block_acct_done(blk_get_stats(blkdev->blk), &ioreq->acct); - } else { - block_acct_failed(blk_get_stats(blkdev->blk), &ioreq->acct); - } - break; - case BLKIF_OP_DISCARD: - default: - break; - } - qemu_bh_schedule(blkdev->bh); - -done: - aio_context_release(blkdev->ctx); -} - -static bool blk_split_discard(struct ioreq *ioreq, blkif_sector_t sector_number, - uint64_t nr_sectors) -{ - struct XenBlkDev *blkdev = ioreq->blkdev; - int64_t byte_offset; - int byte_chunk; - uint64_t byte_remaining, limit; - uint64_t sec_start = sector_number; - uint64_t sec_count = nr_sectors; - - /* Wrap around, or overflowing byte limit? */ - if (sec_start + sec_count < sec_count || - sec_start + sec_count > INT64_MAX >> BDRV_SECTOR_BITS) { - return false; - } - - limit = BDRV_REQUEST_MAX_SECTORS << BDRV_SECTOR_BITS; - byte_offset = sec_start << BDRV_SECTOR_BITS; - byte_remaining = sec_count << BDRV_SECTOR_BITS; - - do { - byte_chunk = byte_remaining > limit ? limit : byte_remaining; - ioreq->aio_inflight++; - blk_aio_pdiscard(blkdev->blk, byte_offset, byte_chunk, - qemu_aio_complete, ioreq); - byte_remaining -= byte_chunk; - byte_offset += byte_chunk; - } while (byte_remaining > 0); - - return true; -} - -static int ioreq_runio_qemu_aio(struct ioreq *ioreq) -{ - struct XenBlkDev *blkdev = ioreq->blkdev; - - ioreq->buf = qemu_memalign(XC_PAGE_SIZE, ioreq->size); - if (ioreq->req.nr_segments && - (ioreq->req.operation == BLKIF_OP_WRITE || - ioreq->req.operation == BLKIF_OP_FLUSH_DISKCACHE) && - ioreq_grant_copy(ioreq)) { - qemu_vfree(ioreq->buf); - goto err; - } - - ioreq->aio_inflight++; - if (ioreq->presync) { - blk_aio_flush(ioreq->blkdev->blk, qemu_aio_complete, ioreq); - return 0; - } - - switch (ioreq->req.operation) { - case BLKIF_OP_READ: - qemu_iovec_add(&ioreq->v, ioreq->buf, ioreq->size); - block_acct_start(blk_get_stats(blkdev->blk), &ioreq->acct, - ioreq->v.size, BLOCK_ACCT_READ); - ioreq->aio_inflight++; - blk_aio_preadv(blkdev->blk, ioreq->start, &ioreq->v, 0, - qemu_aio_complete, ioreq); - break; - case BLKIF_OP_WRITE: - case BLKIF_OP_FLUSH_DISKCACHE: - if (!ioreq->req.nr_segments) { - break; - } - - qemu_iovec_add(&ioreq->v, ioreq->buf, ioreq->size); - block_acct_start(blk_get_stats(blkdev->blk), &ioreq->acct, - ioreq->v.size, - ioreq->req.operation == BLKIF_OP_WRITE ? - BLOCK_ACCT_WRITE : BLOCK_ACCT_FLUSH); - ioreq->aio_inflight++; - blk_aio_pwritev(blkdev->blk, ioreq->start, &ioreq->v, 0, - qemu_aio_complete, ioreq); - break; - case BLKIF_OP_DISCARD: - { - struct blkif_request_discard *req = (void *)&ioreq->req; - if (!blk_split_discard(ioreq, req->sector_number, req->nr_sectors)) { - goto err; - } - break; - } - default: - /* unknown operation (shouldn't happen -- parse catches this) */ - goto err; - } - - qemu_aio_complete(ioreq, 0); - - return 0; - -err: - ioreq_finish(ioreq); - ioreq->status = BLKIF_RSP_ERROR; - return -1; -} - -static int blk_send_response_one(struct ioreq *ioreq) -{ - struct XenBlkDev *blkdev = ioreq->blkdev; - int send_notify = 0; - int have_requests = 0; - blkif_response_t *resp; - - /* Place on the response ring for the relevant domain. */ - switch (blkdev->protocol) { - case BLKIF_PROTOCOL_NATIVE: - resp = (blkif_response_t *) RING_GET_RESPONSE(&blkdev->rings.native, - blkdev->rings.native.rsp_prod_pvt); - break; - case BLKIF_PROTOCOL_X86_32: - resp = (blkif_response_t *) RING_GET_RESPONSE(&blkdev->rings.x86_32_part, - blkdev->rings.x86_32_part.rsp_prod_pvt); - break; - case BLKIF_PROTOCOL_X86_64: - resp = (blkif_response_t *) RING_GET_RESPONSE(&blkdev->rings.x86_64_part, - blkdev->rings.x86_64_part.rsp_prod_pvt); - break; - default: - return 0; - } - - resp->id = ioreq->req.id; - resp->operation = ioreq->req.operation; - resp->status = ioreq->status; - - blkdev->rings.common.rsp_prod_pvt++; - - RING_PUSH_RESPONSES_AND_CHECK_NOTIFY(&blkdev->rings.common, send_notify); - if (blkdev->rings.common.rsp_prod_pvt == blkdev->rings.common.req_cons) { - /* - * Tail check for pending requests. Allows frontend to avoid - * notifications if requests are already in flight (lower - * overheads and promotes batching). - */ - RING_FINAL_CHECK_FOR_REQUESTS(&blkdev->rings.common, have_requests); - } else if (RING_HAS_UNCONSUMED_REQUESTS(&blkdev->rings.common)) { - have_requests = 1; - } - - if (have_requests) { - blkdev->more_work++; - } - return send_notify; -} - -/* walk finished list, send outstanding responses, free requests */ -static void blk_send_response_all(struct XenBlkDev *blkdev) -{ - struct ioreq *ioreq; - int send_notify = 0; - - while (!QLIST_EMPTY(&blkdev->finished)) { - ioreq = QLIST_FIRST(&blkdev->finished); - send_notify += blk_send_response_one(ioreq); - ioreq_release(ioreq, true); - } - if (send_notify) { - xen_pv_send_notify(&blkdev->xendev); - } -} - -static int blk_get_request(struct XenBlkDev *blkdev, struct ioreq *ioreq, RING_IDX rc) -{ - switch (blkdev->protocol) { - case BLKIF_PROTOCOL_NATIVE: - memcpy(&ioreq->req, RING_GET_REQUEST(&blkdev->rings.native, rc), - sizeof(ioreq->req)); - break; - case BLKIF_PROTOCOL_X86_32: - blkif_get_x86_32_req(&ioreq->req, - RING_GET_REQUEST(&blkdev->rings.x86_32_part, rc)); - break; - case BLKIF_PROTOCOL_X86_64: - blkif_get_x86_64_req(&ioreq->req, - RING_GET_REQUEST(&blkdev->rings.x86_64_part, rc)); - break; - } - /* Prevent the compiler from accessing the on-ring fields instead. */ - barrier(); - return 0; -} - -static void blk_handle_requests(struct XenBlkDev *blkdev) -{ - RING_IDX rc, rp; - struct ioreq *ioreq; - - blkdev->more_work = 0; - - rc = blkdev->rings.common.req_cons; - rp = blkdev->rings.common.sring->req_prod; - xen_rmb(); /* Ensure we see queued requests up to 'rp'. */ - - blk_send_response_all(blkdev); - while (rc != rp) { - /* pull request from ring */ - if (RING_REQUEST_CONS_OVERFLOW(&blkdev->rings.common, rc)) { - break; - } - ioreq = ioreq_start(blkdev); - if (ioreq == NULL) { - blkdev->more_work++; - break; - } - blk_get_request(blkdev, ioreq, rc); - blkdev->rings.common.req_cons = ++rc; - - /* parse them */ - if (ioreq_parse(ioreq) != 0) { - - switch (ioreq->req.operation) { - case BLKIF_OP_READ: - block_acct_invalid(blk_get_stats(blkdev->blk), - BLOCK_ACCT_READ); - break; - case BLKIF_OP_WRITE: - block_acct_invalid(blk_get_stats(blkdev->blk), - BLOCK_ACCT_WRITE); - break; - case BLKIF_OP_FLUSH_DISKCACHE: - block_acct_invalid(blk_get_stats(blkdev->blk), - BLOCK_ACCT_FLUSH); - default: - break; - }; - - if (blk_send_response_one(ioreq)) { - xen_pv_send_notify(&blkdev->xendev); - } - ioreq_release(ioreq, false); - continue; - } - - ioreq_runio_qemu_aio(ioreq); - } - - if (blkdev->more_work && blkdev->requests_inflight < blkdev->max_requests) { - qemu_bh_schedule(blkdev->bh); - } -} - -/* ------------------------------------------------------------- */ - -static void blk_bh(void *opaque) -{ - struct XenBlkDev *blkdev = opaque; - - aio_context_acquire(blkdev->ctx); - blk_handle_requests(blkdev); - aio_context_release(blkdev->ctx); -} - -static void blk_alloc(struct XenLegacyDevice *xendev) -{ - struct XenBlkDev *blkdev = container_of(xendev, struct XenBlkDev, xendev); - Error *err = NULL; - - trace_xen_disk_alloc(xendev->name); - - QLIST_INIT(&blkdev->inflight); - QLIST_INIT(&blkdev->finished); - QLIST_INIT(&blkdev->freelist); - - blkdev->iothread = iothread_create(xendev->name, &err); - assert(!err); - - blkdev->ctx = iothread_get_aio_context(blkdev->iothread); - 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); - struct ioreq *ioreq; - - trace_xen_disk_free(xendev->name); - - blk_disconnect(xendev); - - while (!QLIST_EMPTY(&blkdev->freelist)) { - ioreq = QLIST_FIRST(&blkdev->freelist); - QLIST_REMOVE(ioreq, list); - qemu_iovec_destroy(&ioreq->v); - g_free(ioreq); - } - - g_free(blkdev->params); - g_free(blkdev->mode); - g_free(blkdev->type); - g_free(blkdev->dev); - g_free(blkdev->devtype); - qemu_bh_delete(blkdev->bh); - iothread_destroy(blkdev->iothread); - return 0; -} - -static void blk_event(struct XenLegacyDevice *xendev) -{ - struct XenBlkDev *blkdev = container_of(xendev, struct XenBlkDev, 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 20/25] xen: remove the legacy 'xen_disk' backend Date: Mon, 14 Jan 2019 13:51:49 +0000 Message-ID: <20190114135154.16826-21-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 1gj2mN-0000fQ-KY for xen-devel@lists.xenproject.org; Mon, 14 Jan 2019 13:59:51 +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 RnJvbTogUGF1bCBEdXJyYW50IDxwYXVsLmR1cnJhbnRAY2l0cml4LmNvbT4KClRoaXMgYmFja2Vu ZCBoYXMgbm93IGJlZW4gcmVwbGFjZWQgYnkgdGhlICd4ZW4tcWRpc2snIFhlbkRldmljZS4KClNp Z25lZC1vZmYtYnk6IFBhdWwgRHVycmFudCA8cGF1bC5kdXJyYW50QGNpdHJpeC5jb20+CkFja2Vk LWJ5OiBBbnRob255IFBlcmFyZCA8YW50aG9ueS5wZXJhcmRAY2l0cml4LmNvbT4KU2lnbmVkLW9m Zi1ieTogQW50aG9ueSBQRVJBUkQgPGFudGhvbnkucGVyYXJkQGNpdHJpeC5jb20+Ci0tLQogaHcv YmxvY2svTWFrZWZpbGUub2JqcyB8ICAgIDEgLQogaHcvYmxvY2sveGVuX2Rpc2suYyAgICB8IDEw MTEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogMiBmaWxlcyBjaGFu Z2VkLCAxMDEyIGRlbGV0aW9ucygtKQogZGVsZXRlIG1vZGUgMTAwNjQ0IGh3L2Jsb2NrL3hlbl9k aXNrLmMKCmRpZmYgLS1naXQgYS9ody9ibG9jay9NYWtlZmlsZS5vYmpzIGIvaHcvYmxvY2svTWFr ZWZpbGUub2JqcwppbmRleCBmMzQ4MTNhMzc3Li5lMjA2YjhlNzEyIDEwMDY0NAotLS0gYS9ody9i bG9jay9NYWtlZmlsZS5vYmpzCisrKyBiL2h3L2Jsb2NrL01ha2VmaWxlLm9ianMKQEAgLTUsNyAr NSw2IEBAIGNvbW1vbi1vYmotJChDT05GSUdfTkFORCkgKz0gbmFuZC5vCiBjb21tb24tb2JqLSQo Q09ORklHX1BGTEFTSF9DRkkwMSkgKz0gcGZsYXNoX2NmaTAxLm8KIGNvbW1vbi1vYmotJChDT05G SUdfUEZMQVNIX0NGSTAyKSArPSBwZmxhc2hfY2ZpMDIubwogY29tbW9uLW9iai0kKENPTkZJR19Y RU4pICs9IHhlbi1ibG9jay5vCi1jb21tb24tb2JqLSQoQ09ORklHX1hFTikgKz0geGVuX2Rpc2su bwogY29tbW9uLW9iai0kKENPTkZJR19FQ0MpICs9IGVjYy5vCiBjb21tb24tb2JqLSQoQ09ORklH X09ORU5BTkQpICs9IG9uZW5hbmQubwogY29tbW9uLW9iai0kKENPTkZJR19OVk1FX1BDSSkgKz0g bnZtZS5vCmRpZmYgLS1naXQgYS9ody9ibG9jay94ZW5fZGlzay5jIGIvaHcvYmxvY2sveGVuX2Rp c2suYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc3ZGZjY2E5Zi4uMDAwMDAwMDAw MAotLS0gYS9ody9ibG9jay94ZW5fZGlzay5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAxMSArMCww IEBACi0vKgotICogIHhlbiBwYXJhdmlydCBibG9jayBkZXZpY2UgYmFja2VuZAotICoKLSAqICAo YykgR2VyZCBIb2ZmbWFubiA8a3JheGVsQHJlZGhhdC5jb20+Ci0gKgotICogIFRoaXMgcHJvZ3Jh bSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5 Ci0gKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5z ZSBhcyBwdWJsaXNoZWQgYnkKLSAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB1bmRl ciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCi0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0 cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogIGJ1dCBXSVRI T1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0g KiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAg U2VlIHRoZQotICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMu Ci0gKgotICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5l cmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwg c2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLSAqCi0gKiAgQ29udHJpYnV0aW9u cyBhZnRlciAyMDEyLTAxLTEzIGFyZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCi0g KiAgR05VIEdQTCwgdmVyc2lvbiAyIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNp b24uCi0gKi8KLQotI2luY2x1ZGUgInFlbXUvb3NkZXAuaCIKLSNpbmNsdWRlICJxZW11L3VuaXRz LmgiCi0jaW5jbHVkZSA8c3lzL2lvY3RsLmg+Ci0jaW5jbHVkZSA8c3lzL3Vpby5oPgotCi0jaW5j bHVkZSAiaHcvaHcuaCIKLSNpbmNsdWRlICJody94ZW4veGVuLWxlZ2FjeS1iYWNrZW5kLmgiCi0j aW5jbHVkZSAieGVuX2Jsa2lmLmgiCi0jaW5jbHVkZSAic3lzZW11L2Jsb2NrZGV2LmgiCi0jaW5j bHVkZSAic3lzZW11L2lvdGhyZWFkLmgiCi0jaW5jbHVkZSAic3lzZW11L2Jsb2NrLWJhY2tlbmQu aCIKLSNpbmNsdWRlICJxYXBpL2Vycm9yLmgiCi0jaW5jbHVkZSAicWFwaS9xbXAvcWRpY3QuaCIK LSNpbmNsdWRlICJxYXBpL3FtcC9xc3RyaW5nLmgiCi0jaW5jbHVkZSAidHJhY2UuaCIKLQotLyog LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLSAqLwotCi0jZGVmaW5lIEJMT0NLX1NJWkUgIDUxMgotI2RlZmluZSBJT0NCX0NPVU5UICAo QkxLSUZfTUFYX1NFR01FTlRTX1BFUl9SRVFVRVNUICsgMikKLQotc3RydWN0IGlvcmVxIHsKLSAg ICBibGtpZl9yZXF1ZXN0X3QgICAgIHJlcTsKLSAgICBpbnQxNl90ICAgICAgICAgICAgIHN0YXR1 czsKLQotICAgIC8qIHBhcnNlZCByZXF1ZXN0ICovCi0gICAgb2ZmX3QgICAgICAgICAgICAgICBz dGFydDsKLSAgICBRRU1VSU9WZWN0b3IgICAgICAgIHY7Ci0gICAgdm9pZCAgICAgICAgICAgICAg ICAqYnVmOwotICAgIHNpemVfdCAgICAgICAgICAgICAgc2l6ZTsKLSAgICBpbnQgICAgICAgICAg ICAgICAgIHByZXN5bmM7Ci0KLSAgICAvKiBhaW8gc3RhdHVzICovCi0gICAgaW50ICAgICAgICAg ICAgICAgICBhaW9faW5mbGlnaHQ7Ci0gICAgaW50ICAgICAgICAgICAgICAgICBhaW9fZXJyb3Jz OwotCi0gICAgc3RydWN0IFhlbkJsa0RldiAgICAqYmxrZGV2OwotICAgIFFMSVNUX0VOVFJZKGlv cmVxKSAgIGxpc3Q7Ci0gICAgQmxvY2tBY2N0Q29va2llICAgICBhY2N0OwotfTsKLQotI2RlZmlu ZSBNQVhfUklOR19QQUdFX09SREVSIDQKLQotc3RydWN0IFhlbkJsa0RldiB7Ci0gICAgc3RydWN0 IFhlbkxlZ2FjeURldmljZSAgICB4ZW5kZXY7ICAvKiBtdXN0IGJlIGZpcnN0ICovCi0gICAgY2hh ciAgICAgICAgICAgICAgICAqcGFyYW1zOwotICAgIGNoYXIgICAgICAgICAgICAgICAgKm1vZGU7 Ci0gICAgY2hhciAgICAgICAgICAgICAgICAqdHlwZTsKLSAgICBjaGFyICAgICAgICAgICAgICAg ICpkZXY7Ci0gICAgY2hhciAgICAgICAgICAgICAgICAqZGV2dHlwZTsKLSAgICBib29sICAgICAg ICAgICAgICAgIGRpcmVjdGlvc2FmZTsKLSAgICBjb25zdCBjaGFyICAgICAgICAgICpmaWxlcHJv dG87Ci0gICAgY29uc3QgY2hhciAgICAgICAgICAqZmlsZW5hbWU7Ci0gICAgdW5zaWduZWQgaW50 ICAgICAgICByaW5nX3JlZlsxIDw8IE1BWF9SSU5HX1BBR0VfT1JERVJdOwotICAgIHVuc2lnbmVk IGludCAgICAgICAgbnJfcmluZ19yZWY7Ci0gICAgdm9pZCAgICAgICAgICAgICAgICAqc3Jpbmc7 Ci0gICAgaW50NjRfdCAgICAgICAgICAgICBmaWxlX2JsazsKLSAgICBpbnQ2NF90ICAgICAgICAg ICAgIGZpbGVfc2l6ZTsKLSAgICBpbnQgICAgICAgICAgICAgICAgIHByb3RvY29sOwotICAgIGJs a2lmX2JhY2tfcmluZ3NfdCAgcmluZ3M7Ci0gICAgaW50ICAgICAgICAgICAgICAgICBtb3JlX3dv cms7Ci0KLSAgICAvKiByZXF1ZXN0IGxpc3RzICovCi0gICAgUUxJU1RfSEVBRCgsIGlvcmVxKSBp bmZsaWdodDsKLSAgICBRTElTVF9IRUFEKCwgaW9yZXEpIGZpbmlzaGVkOwotICAgIFFMSVNUX0hF QUQoLCBpb3JlcSkgZnJlZWxpc3Q7Ci0gICAgaW50ICAgICAgICAgICAgICAgICByZXF1ZXN0c190 b3RhbDsKLSAgICBpbnQgICAgICAgICAgICAgICAgIHJlcXVlc3RzX2luZmxpZ2h0OwotICAgIGlu dCAgICAgICAgICAgICAgICAgcmVxdWVzdHNfZmluaXNoZWQ7Ci0gICAgdW5zaWduZWQgaW50ICAg ICAgICBtYXhfcmVxdWVzdHM7Ci0KLSAgICBnYm9vbGVhbiAgICAgICAgICAgIGZlYXR1cmVfZGlz Y2FyZDsKLQotICAgIC8qIHFlbXUgYmxvY2sgZHJpdmVyICovCi0gICAgRHJpdmVJbmZvICAgICAg ICAgICAqZGluZm87Ci0gICAgQmxvY2tCYWNrZW5kICAgICAgICAqYmxrOwotICAgIFFFTVVCSCAg ICAgICAgICAgICAgKmJoOwotCi0gICAgSU9UaHJlYWQgICAgICAgICAgICAqaW90aHJlYWQ7Ci0g ICAgQWlvQ29udGV4dCAgICAgICAgICAqY3R4OwotfTsKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi1zdGF0aWMg dm9pZCBpb3JlcV9yZXNldChzdHJ1Y3QgaW9yZXEgKmlvcmVxKQotewotICAgIG1lbXNldCgmaW9y ZXEtPnJlcSwgMCwgc2l6ZW9mKGlvcmVxLT5yZXEpKTsKLSAgICBpb3JlcS0+c3RhdHVzID0gMDsK LSAgICBpb3JlcS0+c3RhcnQgPSAwOwotICAgIGlvcmVxLT5idWYgPSBOVUxMOwotICAgIGlvcmVx LT5zaXplID0gMDsKLSAgICBpb3JlcS0+cHJlc3luYyA9IDA7Ci0KLSAgICBpb3JlcS0+YWlvX2lu ZmxpZ2h0ID0gMDsKLSAgICBpb3JlcS0+YWlvX2Vycm9ycyA9IDA7Ci0KLSAgICBpb3JlcS0+Ymxr ZGV2ID0gTlVMTDsKLSAgICBtZW1zZXQoJmlvcmVxLT5saXN0LCAwLCBzaXplb2YoaW9yZXEtPmxp c3QpKTsKLSAgICBtZW1zZXQoJmlvcmVxLT5hY2N0LCAwLCBzaXplb2YoaW9yZXEtPmFjY3QpKTsK LQotICAgIHFlbXVfaW92ZWNfcmVzZXQoJmlvcmVxLT52KTsKLX0KLQotc3RhdGljIHN0cnVjdCBp b3JlcSAqaW9yZXFfc3RhcnQoc3RydWN0IFhlbkJsa0RldiAqYmxrZGV2KQotewotICAgIHN0cnVj dCBpb3JlcSAqaW9yZXEgPSBOVUxMOwotCi0gICAgaWYgKFFMSVNUX0VNUFRZKCZibGtkZXYtPmZy ZWVsaXN0KSkgewotICAgICAgICBpZiAoYmxrZGV2LT5yZXF1ZXN0c190b3RhbCA+PSBibGtkZXYt Pm1heF9yZXF1ZXN0cykgewotICAgICAgICAgICAgZ290byBvdXQ7Ci0gICAgICAgIH0KLSAgICAg ICAgLyogYWxsb2NhdGUgbmV3IHN0cnVjdCAqLwotICAgICAgICBpb3JlcSA9IGdfbWFsbG9jMChz aXplb2YoKmlvcmVxKSk7Ci0gICAgICAgIGlvcmVxLT5ibGtkZXYgPSBibGtkZXY7Ci0gICAgICAg IGJsa2Rldi0+cmVxdWVzdHNfdG90YWwrKzsKLSAgICAgICAgcWVtdV9pb3ZlY19pbml0KCZpb3Jl cS0+diwgMSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLyogZ2V0IG9uZSBmcm9tIGZyZWVsaXN0 ICovCi0gICAgICAgIGlvcmVxID0gUUxJU1RfRklSU1QoJmJsa2Rldi0+ZnJlZWxpc3QpOwotICAg ICAgICBRTElTVF9SRU1PVkUoaW9yZXEsIGxpc3QpOwotICAgIH0KLSAgICBRTElTVF9JTlNFUlRf SEVBRCgmYmxrZGV2LT5pbmZsaWdodCwgaW9yZXEsIGxpc3QpOwotICAgIGJsa2Rldi0+cmVxdWVz dHNfaW5mbGlnaHQrKzsKLQotb3V0OgotICAgIHJldHVybiBpb3JlcTsKLX0KLQotc3RhdGljIHZv aWQgaW9yZXFfZmluaXNoKHN0cnVjdCBpb3JlcSAqaW9yZXEpCi17Ci0gICAgc3RydWN0IFhlbkJs a0RldiAqYmxrZGV2ID0gaW9yZXEtPmJsa2RldjsKLQotICAgIFFMSVNUX1JFTU9WRShpb3JlcSwg bGlzdCk7Ci0gICAgUUxJU1RfSU5TRVJUX0hFQUQoJmJsa2Rldi0+ZmluaXNoZWQsIGlvcmVxLCBs aXN0KTsKLSAgICBibGtkZXYtPnJlcXVlc3RzX2luZmxpZ2h0LS07Ci0gICAgYmxrZGV2LT5yZXF1 ZXN0c19maW5pc2hlZCsrOwotfQotCi1zdGF0aWMgdm9pZCBpb3JlcV9yZWxlYXNlKHN0cnVjdCBp b3JlcSAqaW9yZXEsIGJvb2wgZmluaXNoKQotewotICAgIHN0cnVjdCBYZW5CbGtEZXYgKmJsa2Rl diA9IGlvcmVxLT5ibGtkZXY7Ci0KLSAgICBRTElTVF9SRU1PVkUoaW9yZXEsIGxpc3QpOwotICAg IGlvcmVxX3Jlc2V0KGlvcmVxKTsKLSAgICBpb3JlcS0+YmxrZGV2ID0gYmxrZGV2OwotICAgIFFM SVNUX0lOU0VSVF9IRUFEKCZibGtkZXYtPmZyZWVsaXN0LCBpb3JlcSwgbGlzdCk7Ci0gICAgaWYg KGZpbmlzaCkgewotICAgICAgICBibGtkZXYtPnJlcXVlc3RzX2ZpbmlzaGVkLS07Ci0gICAgfSBl bHNlIHsKLSAgICAgICAgYmxrZGV2LT5yZXF1ZXN0c19pbmZsaWdodC0tOwotICAgIH0KLX0KLQot LyoKLSAqIHRyYW5zbGF0ZSByZXF1ZXN0IGludG8gaW92ZWMgKyBzdGFydCBvZmZzZXQKLSAqIGRv IHNhbml0eSBjaGVja3MgYWxvbmcgdGhlIHdheQotICovCi1zdGF0aWMgaW50IGlvcmVxX3BhcnNl KHN0cnVjdCBpb3JlcSAqaW9yZXEpCi17Ci0gICAgc3RydWN0IFhlbkJsa0RldiAqYmxrZGV2ID0g aW9yZXEtPmJsa2RldjsKLSAgICBzdHJ1Y3QgWGVuTGVnYWN5RGV2aWNlICp4ZW5kZXYgPSAmYmxr ZGV2LT54ZW5kZXY7Ci0gICAgc2l6ZV90IGxlbjsKLSAgICBpbnQgaTsKLQotICAgIHhlbl9wdl9w cmludGYoeGVuZGV2LCAzLAotICAgICAgICAgICAgICAgICAgIm9wICVkLCBuciAlZCwgaGFuZGxl ICVkLCBpZCAlIiBQUklkNjQgIiwgc2VjdG9yICUiIFBSSWQ2NCAiXG4iLAotICAgICAgICAgICAg ICAgICAgaW9yZXEtPnJlcS5vcGVyYXRpb24sIGlvcmVxLT5yZXEubnJfc2VnbWVudHMsCi0gICAg ICAgICAgICAgICAgICBpb3JlcS0+cmVxLmhhbmRsZSwgaW9yZXEtPnJlcS5pZCwgaW9yZXEtPnJl cS5zZWN0b3JfbnVtYmVyKTsKLSAgICBzd2l0Y2ggKGlvcmVxLT5yZXEub3BlcmF0aW9uKSB7Ci0g ICAgY2FzZSBCTEtJRl9PUF9SRUFEOgotICAgICAgICBicmVhazsKLSAgICBjYXNlIEJMS0lGX09Q X0ZMVVNIX0RJU0tDQUNIRToKLSAgICAgICAgaW9yZXEtPnByZXN5bmMgPSAxOwotICAgICAgICBp ZiAoIWlvcmVxLT5yZXEubnJfc2VnbWVudHMpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAg ICAgICB9Ci0gICAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLwotICAgIGNhc2UgQkxLSUZfT1BfV1JJ VEU6Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQkxLSUZfT1BfRElTQ0FSRDoKLSAgICAgICAg cmV0dXJuIDA7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgeGVuX3B2X3ByaW50Zih4ZW5kZXYsIDAs ICJlcnJvcjogdW5rbm93biBvcGVyYXRpb24gKCVkKVxuIiwKLSAgICAgICAgICAgICAgICAgICAg ICBpb3JlcS0+cmVxLm9wZXJhdGlvbik7Ci0gICAgICAgIGdvdG8gZXJyOwotICAgIH07Ci0KLSAg ICBpZiAoaW9yZXEtPnJlcS5vcGVyYXRpb24gIT0gQkxLSUZfT1BfUkVBRCAmJiBibGtkZXYtPm1v ZGVbMF0gIT0gJ3cnKSB7Ci0gICAgICAgIHhlbl9wdl9wcmludGYoeGVuZGV2LCAwLCAiZXJyb3I6 IHdyaXRlIHJlcSBmb3Igcm8gZGV2aWNlXG4iKTsKLSAgICAgICAgZ290byBlcnI7Ci0gICAgfQot Ci0gICAgaW9yZXEtPnN0YXJ0ID0gaW9yZXEtPnJlcS5zZWN0b3JfbnVtYmVyICogYmxrZGV2LT5m aWxlX2JsazsKLSAgICBmb3IgKGkgPSAwOyBpIDwgaW9yZXEtPnJlcS5ucl9zZWdtZW50czsgaSsr KSB7Ci0gICAgICAgIGlmIChpID09IEJMS0lGX01BWF9TRUdNRU5UU19QRVJfUkVRVUVTVCkgewot ICAgICAgICAgICAgeGVuX3B2X3ByaW50Zih4ZW5kZXYsIDAsICJlcnJvcjogbnJfc2VnbWVudHMg dG9vIGJpZ1xuIik7Ci0gICAgICAgICAgICBnb3RvIGVycjsKLSAgICAgICAgfQotICAgICAgICBp ZiAoaW9yZXEtPnJlcS5zZWdbaV0uZmlyc3Rfc2VjdCA+IGlvcmVxLT5yZXEuc2VnW2ldLmxhc3Rf c2VjdCkgewotICAgICAgICAgICAgeGVuX3B2X3ByaW50Zih4ZW5kZXYsIDAsICJlcnJvcjogZmly c3QgPiBsYXN0IHNlY3RvclxuIik7Ci0gICAgICAgICAgICBnb3RvIGVycjsKLSAgICAgICAgfQot ICAgICAgICBpZiAoaW9yZXEtPnJlcS5zZWdbaV0ubGFzdF9zZWN0ICogQkxPQ0tfU0laRSA+PSBY Q19QQUdFX1NJWkUpIHsKLSAgICAgICAgICAgIHhlbl9wdl9wcmludGYoeGVuZGV2LCAwLCAiZXJy b3I6IHBhZ2UgY3Jvc3NpbmdcbiIpOwotICAgICAgICAgICAgZ290byBlcnI7Ci0gICAgICAgIH0K LQotICAgICAgICBsZW4gPSAoaW9yZXEtPnJlcS5zZWdbaV0ubGFzdF9zZWN0IC0gaW9yZXEtPnJl cS5zZWdbaV0uZmlyc3Rfc2VjdCArIDEpICogYmxrZGV2LT5maWxlX2JsazsKLSAgICAgICAgaW9y ZXEtPnNpemUgKz0gbGVuOwotICAgIH0KLSAgICBpZiAoaW9yZXEtPnN0YXJ0ICsgaW9yZXEtPnNp emUgPiBibGtkZXYtPmZpbGVfc2l6ZSkgewotICAgICAgICB4ZW5fcHZfcHJpbnRmKHhlbmRldiwg MCwgImVycm9yOiBhY2Nlc3MgYmV5b25kIGVuZCBvZiBmaWxlXG4iKTsKLSAgICAgICAgZ290byBl cnI7Ci0gICAgfQotICAgIHJldHVybiAwOwotCi1lcnI6Ci0gICAgaW9yZXEtPnN0YXR1cyA9IEJM S0lGX1JTUF9FUlJPUjsKLSAgICByZXR1cm4gLTE7Ci19Ci0KLXN0YXRpYyBpbnQgaW9yZXFfZ3Jh bnRfY29weShzdHJ1Y3QgaW9yZXEgKmlvcmVxKQotewotICAgIHN0cnVjdCBYZW5CbGtEZXYgKmJs a2RldiA9IGlvcmVxLT5ibGtkZXY7Ci0gICAgc3RydWN0IFhlbkxlZ2FjeURldmljZSAqeGVuZGV2 ID0gJmJsa2Rldi0+eGVuZGV2OwotICAgIFhlbkdyYW50Q29weVNlZ21lbnQgc2Vnc1tCTEtJRl9N QVhfU0VHTUVOVFNfUEVSX1JFUVVFU1RdOwotICAgIGludCBpLCBjb3VudCwgcmM7Ci0gICAgaW50 NjRfdCBmaWxlX2JsayA9IGJsa2Rldi0+ZmlsZV9ibGs7Ci0gICAgYm9vbCB0b19kb21haW4gPSAo aW9yZXEtPnJlcS5vcGVyYXRpb24gPT0gQkxLSUZfT1BfUkVBRCk7Ci0gICAgdm9pZCAqdmlydCA9 IGlvcmVxLT5idWY7Ci0KLSAgICBpZiAoaW9yZXEtPnJlcS5ucl9zZWdtZW50cyA9PSAwKSB7Ci0g ICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIGNvdW50ID0gaW9yZXEtPnJlcS5ucl9zZWdt ZW50czsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgIGlmICh0 b19kb21haW4pIHsKLSAgICAgICAgICAgIHNlZ3NbaV0uZGVzdC5mb3JlaWduLnJlZiA9IGlvcmVx LT5yZXEuc2VnW2ldLmdyZWY7Ci0gICAgICAgICAgICBzZWdzW2ldLmRlc3QuZm9yZWlnbi5vZmZz ZXQgPSBpb3JlcS0+cmVxLnNlZ1tpXS5maXJzdF9zZWN0ICogZmlsZV9ibGs7Ci0gICAgICAgICAg ICBzZWdzW2ldLnNvdXJjZS52aXJ0ID0gdmlydDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAg ICAgIHNlZ3NbaV0uc291cmNlLmZvcmVpZ24ucmVmID0gaW9yZXEtPnJlcS5zZWdbaV0uZ3JlZjsK LSAgICAgICAgICAgIHNlZ3NbaV0uc291cmNlLmZvcmVpZ24ub2Zmc2V0ID0gaW9yZXEtPnJlcS5z ZWdbaV0uZmlyc3Rfc2VjdCAqIGZpbGVfYmxrOwotICAgICAgICAgICAgc2Vnc1tpXS5kZXN0LnZp cnQgPSB2aXJ0OwotICAgICAgICB9Ci0gICAgICAgIHNlZ3NbaV0ubGVuID0gKGlvcmVxLT5yZXEu c2VnW2ldLmxhc3Rfc2VjdAotICAgICAgICAgICAgICAgICAgICAgICAtIGlvcmVxLT5yZXEuc2Vn W2ldLmZpcnN0X3NlY3QgKyAxKSAqIGZpbGVfYmxrOwotICAgICAgICB2aXJ0ICs9IHNlZ3NbaV0u bGVuOwotICAgIH0KLQotICAgIHJjID0geGVuX2JlX2NvcHlfZ3JhbnRfcmVmcyh4ZW5kZXYsIHRv X2RvbWFpbiwgc2VncywgY291bnQpOwotCi0gICAgaWYgKHJjKSB7Ci0gICAgICAgIHhlbl9wdl9w cmludGYoeGVuZGV2LCAwLAotICAgICAgICAgICAgICAgICAgICAgICJmYWlsZWQgdG8gY29weSBk YXRhICVkXG4iLCByYyk7Ci0gICAgICAgIGlvcmVxLT5haW9fZXJyb3JzKys7Ci0gICAgICAgIHJl dHVybiAtMTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgaW9yZXFf cnVuaW9fcWVtdV9haW8oc3RydWN0IGlvcmVxICppb3JlcSk7Ci0KLXN0YXRpYyB2b2lkIHFlbXVf YWlvX2NvbXBsZXRlKHZvaWQgKm9wYXF1ZSwgaW50IHJldCkKLXsKLSAgICBzdHJ1Y3QgaW9yZXEg KmlvcmVxID0gb3BhcXVlOwotICAgIHN0cnVjdCBYZW5CbGtEZXYgKmJsa2RldiA9IGlvcmVxLT5i bGtkZXY7Ci0gICAgc3RydWN0IFhlbkxlZ2FjeURldmljZSAqeGVuZGV2ID0gJmJsa2Rldi0+eGVu ZGV2OwotCi0gICAgYWlvX2NvbnRleHRfYWNxdWlyZShibGtkZXYtPmN0eCk7Ci0KLSAgICBpZiAo cmV0ICE9IDApIHsKLSAgICAgICAgeGVuX3B2X3ByaW50Zih4ZW5kZXYsIDAsICIlcyBJL08gZXJy b3JcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgaW9yZXEtPnJlcS5vcGVyYXRpb24gPT0gQkxL SUZfT1BfUkVBRCA/ICJyZWFkIiA6ICJ3cml0ZSIpOwotICAgICAgICBpb3JlcS0+YWlvX2Vycm9y cysrOwotICAgIH0KLQotICAgIGlvcmVxLT5haW9faW5mbGlnaHQtLTsKLSAgICBpZiAoaW9yZXEt PnByZXN5bmMpIHsKLSAgICAgICAgaW9yZXEtPnByZXN5bmMgPSAwOwotICAgICAgICBpb3JlcV9y dW5pb19xZW11X2Fpbyhpb3JlcSk7Ci0gICAgICAgIGdvdG8gZG9uZTsKLSAgICB9Ci0gICAgaWYg KGlvcmVxLT5haW9faW5mbGlnaHQgPiAwKSB7Ci0gICAgICAgIGdvdG8gZG9uZTsKLSAgICB9Ci0K LSAgICBzd2l0Y2ggKGlvcmVxLT5yZXEub3BlcmF0aW9uKSB7Ci0gICAgY2FzZSBCTEtJRl9PUF9S RUFEOgotICAgICAgICAvKiBpbiBjYXNlIG9mIGZhaWx1cmUgaW9yZXEtPmFpb19lcnJvcnMgaXMg aW5jcmVhc2VkICovCi0gICAgICAgIGlmIChyZXQgPT0gMCkgewotICAgICAgICAgICAgaW9yZXFf Z3JhbnRfY29weShpb3JlcSk7Ci0gICAgICAgIH0KLSAgICAgICAgcWVtdV92ZnJlZShpb3JlcS0+ YnVmKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCTEtJRl9PUF9XUklURToKLSAgICBjYXNl IEJMS0lGX09QX0ZMVVNIX0RJU0tDQUNIRToKLSAgICAgICAgaWYgKCFpb3JlcS0+cmVxLm5yX3Nl Z21lbnRzKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBxZW11X3Zm cmVlKGlvcmVxLT5idWYpOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBi cmVhazsKLSAgICB9Ci0KLSAgICBpb3JlcS0+c3RhdHVzID0gaW9yZXEtPmFpb19lcnJvcnMgPyBC TEtJRl9SU1BfRVJST1IgOiBCTEtJRl9SU1BfT0tBWTsKLSAgICBpb3JlcV9maW5pc2goaW9yZXEp OwotCi0gICAgc3dpdGNoIChpb3JlcS0+cmVxLm9wZXJhdGlvbikgewotICAgIGNhc2UgQkxLSUZf T1BfV1JJVEU6Ci0gICAgY2FzZSBCTEtJRl9PUF9GTFVTSF9ESVNLQ0FDSEU6Ci0gICAgICAgIGlm ICghaW9yZXEtPnJlcS5ucl9zZWdtZW50cykgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAg IH0KLSAgICBjYXNlIEJMS0lGX09QX1JFQUQ6Ci0gICAgICAgIGlmIChpb3JlcS0+c3RhdHVzID09 IEJMS0lGX1JTUF9PS0FZKSB7Ci0gICAgICAgICAgICBibG9ja19hY2N0X2RvbmUoYmxrX2dldF9z dGF0cyhibGtkZXYtPmJsayksICZpb3JlcS0+YWNjdCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAg ICAgICAgICBibG9ja19hY2N0X2ZhaWxlZChibGtfZ2V0X3N0YXRzKGJsa2Rldi0+YmxrKSwgJmlv cmVxLT5hY2N0KTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBjYXNlIEJMS0lGX09Q X0RJU0NBUkQ6Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHFlbXVf Ymhfc2NoZWR1bGUoYmxrZGV2LT5iaCk7Ci0KLWRvbmU6Ci0gICAgYWlvX2NvbnRleHRfcmVsZWFz ZShibGtkZXYtPmN0eCk7Ci19Ci0KLXN0YXRpYyBib29sIGJsa19zcGxpdF9kaXNjYXJkKHN0cnVj dCBpb3JlcSAqaW9yZXEsIGJsa2lmX3NlY3Rvcl90IHNlY3Rvcl9udW1iZXIsCi0gICAgICAgICAg ICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBucl9zZWN0b3JzKQotewotICAgIHN0cnVjdCBY ZW5CbGtEZXYgKmJsa2RldiA9IGlvcmVxLT5ibGtkZXY7Ci0gICAgaW50NjRfdCBieXRlX29mZnNl dDsKLSAgICBpbnQgYnl0ZV9jaHVuazsKLSAgICB1aW50NjRfdCBieXRlX3JlbWFpbmluZywgbGlt aXQ7Ci0gICAgdWludDY0X3Qgc2VjX3N0YXJ0ID0gc2VjdG9yX251bWJlcjsKLSAgICB1aW50NjRf dCBzZWNfY291bnQgPSBucl9zZWN0b3JzOwotCi0gICAgLyogV3JhcCBhcm91bmQsIG9yIG92ZXJm bG93aW5nIGJ5dGUgbGltaXQ/ICovCi0gICAgaWYgKHNlY19zdGFydCArIHNlY19jb3VudCA8IHNl Y19jb3VudCB8fAotICAgICAgICBzZWNfc3RhcnQgKyBzZWNfY291bnQgPiBJTlQ2NF9NQVggPj4g QkRSVl9TRUNUT1JfQklUUykgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAg bGltaXQgPSBCRFJWX1JFUVVFU1RfTUFYX1NFQ1RPUlMgPDwgQkRSVl9TRUNUT1JfQklUUzsKLSAg ICBieXRlX29mZnNldCA9IHNlY19zdGFydCA8PCBCRFJWX1NFQ1RPUl9CSVRTOwotICAgIGJ5dGVf cmVtYWluaW5nID0gc2VjX2NvdW50IDw8IEJEUlZfU0VDVE9SX0JJVFM7Ci0KLSAgICBkbyB7Ci0g ICAgICAgIGJ5dGVfY2h1bmsgPSBieXRlX3JlbWFpbmluZyA+IGxpbWl0ID8gbGltaXQgOiBieXRl X3JlbWFpbmluZzsKLSAgICAgICAgaW9yZXEtPmFpb19pbmZsaWdodCsrOwotICAgICAgICBibGtf YWlvX3BkaXNjYXJkKGJsa2Rldi0+YmxrLCBieXRlX29mZnNldCwgYnl0ZV9jaHVuaywKLSAgICAg ICAgICAgICAgICAgICAgICAgICBxZW11X2Fpb19jb21wbGV0ZSwgaW9yZXEpOwotICAgICAgICBi eXRlX3JlbWFpbmluZyAtPSBieXRlX2NodW5rOwotICAgICAgICBieXRlX29mZnNldCArPSBieXRl X2NodW5rOwotICAgIH0gd2hpbGUgKGJ5dGVfcmVtYWluaW5nID4gMCk7Ci0KLSAgICByZXR1cm4g dHJ1ZTsKLX0KLQotc3RhdGljIGludCBpb3JlcV9ydW5pb19xZW11X2FpbyhzdHJ1Y3QgaW9yZXEg KmlvcmVxKQotewotICAgIHN0cnVjdCBYZW5CbGtEZXYgKmJsa2RldiA9IGlvcmVxLT5ibGtkZXY7 Ci0KLSAgICBpb3JlcS0+YnVmID0gcWVtdV9tZW1hbGlnbihYQ19QQUdFX1NJWkUsIGlvcmVxLT5z aXplKTsKLSAgICBpZiAoaW9yZXEtPnJlcS5ucl9zZWdtZW50cyAmJgotICAgICAgICAoaW9yZXEt PnJlcS5vcGVyYXRpb24gPT0gQkxLSUZfT1BfV1JJVEUgfHwKLSAgICAgICAgIGlvcmVxLT5yZXEu b3BlcmF0aW9uID09IEJMS0lGX09QX0ZMVVNIX0RJU0tDQUNIRSkgJiYKLSAgICAgICAgaW9yZXFf Z3JhbnRfY29weShpb3JlcSkpIHsKLSAgICAgICAgcWVtdV92ZnJlZShpb3JlcS0+YnVmKTsKLSAg ICAgICAgZ290byBlcnI7Ci0gICAgfQotCi0gICAgaW9yZXEtPmFpb19pbmZsaWdodCsrOwotICAg IGlmIChpb3JlcS0+cHJlc3luYykgewotICAgICAgICBibGtfYWlvX2ZsdXNoKGlvcmVxLT5ibGtk ZXYtPmJsaywgcWVtdV9haW9fY29tcGxldGUsIGlvcmVxKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0g ICAgfQotCi0gICAgc3dpdGNoIChpb3JlcS0+cmVxLm9wZXJhdGlvbikgewotICAgIGNhc2UgQkxL SUZfT1BfUkVBRDoKLSAgICAgICAgcWVtdV9pb3ZlY19hZGQoJmlvcmVxLT52LCBpb3JlcS0+YnVm LCBpb3JlcS0+c2l6ZSk7Ci0gICAgICAgIGJsb2NrX2FjY3Rfc3RhcnQoYmxrX2dldF9zdGF0cyhi bGtkZXYtPmJsayksICZpb3JlcS0+YWNjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpb3Jl cS0+di5zaXplLCBCTE9DS19BQ0NUX1JFQUQpOwotICAgICAgICBpb3JlcS0+YWlvX2luZmxpZ2h0 Kys7Ci0gICAgICAgIGJsa19haW9fcHJlYWR2KGJsa2Rldi0+YmxrLCBpb3JlcS0+c3RhcnQsICZp b3JlcS0+diwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgcWVtdV9haW9fY29tcGxldGUsIGlv cmVxKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCTEtJRl9PUF9XUklURToKLSAgICBjYXNl IEJMS0lGX09QX0ZMVVNIX0RJU0tDQUNIRToKLSAgICAgICAgaWYgKCFpb3JlcS0+cmVxLm5yX3Nl Z21lbnRzKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIHFlbXVf aW92ZWNfYWRkKCZpb3JlcS0+diwgaW9yZXEtPmJ1ZiwgaW9yZXEtPnNpemUpOwotICAgICAgICBi bG9ja19hY2N0X3N0YXJ0KGJsa19nZXRfc3RhdHMoYmxrZGV2LT5ibGspLCAmaW9yZXEtPmFjY3Qs Ci0gICAgICAgICAgICAgICAgICAgICAgICAgaW9yZXEtPnYuc2l6ZSwKLSAgICAgICAgICAgICAg ICAgICAgICAgICBpb3JlcS0+cmVxLm9wZXJhdGlvbiA9PSBCTEtJRl9PUF9XUklURSA/Ci0gICAg ICAgICAgICAgICAgICAgICAgICAgQkxPQ0tfQUNDVF9XUklURSA6IEJMT0NLX0FDQ1RfRkxVU0gp OwotICAgICAgICBpb3JlcS0+YWlvX2luZmxpZ2h0Kys7Ci0gICAgICAgIGJsa19haW9fcHdyaXRl dihibGtkZXYtPmJsaywgaW9yZXEtPnN0YXJ0LCAmaW9yZXEtPnYsIDAsCi0gICAgICAgICAgICAg ICAgICAgICAgICBxZW11X2Fpb19jb21wbGV0ZSwgaW9yZXEpOwotICAgICAgICBicmVhazsKLSAg ICBjYXNlIEJMS0lGX09QX0RJU0NBUkQ6Ci0gICAgewotICAgICAgICBzdHJ1Y3QgYmxraWZfcmVx dWVzdF9kaXNjYXJkICpyZXEgPSAodm9pZCAqKSZpb3JlcS0+cmVxOwotICAgICAgICBpZiAoIWJs a19zcGxpdF9kaXNjYXJkKGlvcmVxLCByZXEtPnNlY3Rvcl9udW1iZXIsIHJlcS0+bnJfc2VjdG9y cykpIHsKLSAgICAgICAgICAgIGdvdG8gZXJyOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwot ICAgIH0KLSAgICBkZWZhdWx0OgotICAgICAgICAvKiB1bmtub3duIG9wZXJhdGlvbiAoc2hvdWxk bid0IGhhcHBlbiAtLSBwYXJzZSBjYXRjaGVzIHRoaXMpICovCi0gICAgICAgIGdvdG8gZXJyOwot ICAgIH0KLQotICAgIHFlbXVfYWlvX2NvbXBsZXRlKGlvcmVxLCAwKTsKLQotICAgIHJldHVybiAw OwotCi1lcnI6Ci0gICAgaW9yZXFfZmluaXNoKGlvcmVxKTsKLSAgICBpb3JlcS0+c3RhdHVzID0g QkxLSUZfUlNQX0VSUk9SOwotICAgIHJldHVybiAtMTsKLX0KLQotc3RhdGljIGludCBibGtfc2Vu ZF9yZXNwb25zZV9vbmUoc3RydWN0IGlvcmVxICppb3JlcSkKLXsKLSAgICBzdHJ1Y3QgWGVuQmxr RGV2ICAqYmxrZGV2ID0gaW9yZXEtPmJsa2RldjsKLSAgICBpbnQgICAgICAgICAgICAgICBzZW5k X25vdGlmeSAgID0gMDsKLSAgICBpbnQgICAgICAgICAgICAgICBoYXZlX3JlcXVlc3RzID0gMDsK LSAgICBibGtpZl9yZXNwb25zZV90ICAqcmVzcDsKLQotICAgIC8qIFBsYWNlIG9uIHRoZSByZXNw b25zZSByaW5nIGZvciB0aGUgcmVsZXZhbnQgZG9tYWluLiAqLwotICAgIHN3aXRjaCAoYmxrZGV2 LT5wcm90b2NvbCkgewotICAgIGNhc2UgQkxLSUZfUFJPVE9DT0xfTkFUSVZFOgotICAgICAgICBy ZXNwID0gKGJsa2lmX3Jlc3BvbnNlX3QgKikgUklOR19HRVRfUkVTUE9OU0UoJmJsa2Rldi0+cmlu Z3MubmF0aXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxrZGV2LT5yaW5n cy5uYXRpdmUucnNwX3Byb2RfcHZ0KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCTEtJRl9Q Uk9UT0NPTF9YODZfMzI6Ci0gICAgICAgIHJlc3AgPSAoYmxraWZfcmVzcG9uc2VfdCAqKSBSSU5H X0dFVF9SRVNQT05TRSgmYmxrZGV2LT5yaW5ncy54ODZfMzJfcGFydCwKLSAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIGJsa2Rldi0+cmluZ3MueDg2XzMyX3BhcnQucnNwX3Byb2RfcHZ0 KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCTEtJRl9QUk9UT0NPTF9YODZfNjQ6Ci0gICAg ICAgIHJlc3AgPSAoYmxraWZfcmVzcG9uc2VfdCAqKSBSSU5HX0dFVF9SRVNQT05TRSgmYmxrZGV2 LT5yaW5ncy54ODZfNjRfcGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJs a2Rldi0+cmluZ3MueDg2XzY0X3BhcnQucnNwX3Byb2RfcHZ0KTsKLSAgICAgICAgYnJlYWs7Ci0g ICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcmVzcC0+aWQgICAg ICAgID0gaW9yZXEtPnJlcS5pZDsKLSAgICByZXNwLT5vcGVyYXRpb24gPSBpb3JlcS0+cmVxLm9w ZXJhdGlvbjsKLSAgICByZXNwLT5zdGF0dXMgICAgPSBpb3JlcS0+c3RhdHVzOwotCi0gICAgYmxr ZGV2LT5yaW5ncy5jb21tb24ucnNwX3Byb2RfcHZ0Kys7Ci0KLSAgICBSSU5HX1BVU0hfUkVTUE9O U0VTX0FORF9DSEVDS19OT1RJRlkoJmJsa2Rldi0+cmluZ3MuY29tbW9uLCBzZW5kX25vdGlmeSk7 Ci0gICAgaWYgKGJsa2Rldi0+cmluZ3MuY29tbW9uLnJzcF9wcm9kX3B2dCA9PSBibGtkZXYtPnJp bmdzLmNvbW1vbi5yZXFfY29ucykgewotICAgICAgICAvKgotICAgICAgICAgKiBUYWlsIGNoZWNr IGZvciBwZW5kaW5nIHJlcXVlc3RzLiBBbGxvd3MgZnJvbnRlbmQgdG8gYXZvaWQKLSAgICAgICAg ICogbm90aWZpY2F0aW9ucyBpZiByZXF1ZXN0cyBhcmUgYWxyZWFkeSBpbiBmbGlnaHQgKGxvd2Vy Ci0gICAgICAgICAqIG92ZXJoZWFkcyBhbmQgcHJvbW90ZXMgYmF0Y2hpbmcpLgotICAgICAgICAg Ki8KLSAgICAgICAgUklOR19GSU5BTF9DSEVDS19GT1JfUkVRVUVTVFMoJmJsa2Rldi0+cmluZ3Mu Y29tbW9uLCBoYXZlX3JlcXVlc3RzKTsKLSAgICB9IGVsc2UgaWYgKFJJTkdfSEFTX1VOQ09OU1VN RURfUkVRVUVTVFMoJmJsa2Rldi0+cmluZ3MuY29tbW9uKSkgewotICAgICAgICBoYXZlX3JlcXVl c3RzID0gMTsKLSAgICB9Ci0KLSAgICBpZiAoaGF2ZV9yZXF1ZXN0cykgewotICAgICAgICBibGtk ZXYtPm1vcmVfd29yaysrOwotICAgIH0KLSAgICByZXR1cm4gc2VuZF9ub3RpZnk7Ci19Ci0KLS8q IHdhbGsgZmluaXNoZWQgbGlzdCwgc2VuZCBvdXRzdGFuZGluZyByZXNwb25zZXMsIGZyZWUgcmVx dWVzdHMgKi8KLXN0YXRpYyB2b2lkIGJsa19zZW5kX3Jlc3BvbnNlX2FsbChzdHJ1Y3QgWGVuQmxr RGV2ICpibGtkZXYpCi17Ci0gICAgc3RydWN0IGlvcmVxICppb3JlcTsKLSAgICBpbnQgc2VuZF9u b3RpZnkgPSAwOwotCi0gICAgd2hpbGUgKCFRTElTVF9FTVBUWSgmYmxrZGV2LT5maW5pc2hlZCkp IHsKLSAgICAgICAgaW9yZXEgPSBRTElTVF9GSVJTVCgmYmxrZGV2LT5maW5pc2hlZCk7Ci0gICAg ICAgIHNlbmRfbm90aWZ5ICs9IGJsa19zZW5kX3Jlc3BvbnNlX29uZShpb3JlcSk7Ci0gICAgICAg IGlvcmVxX3JlbGVhc2UoaW9yZXEsIHRydWUpOwotICAgIH0KLSAgICBpZiAoc2VuZF9ub3RpZnkp IHsKLSAgICAgICAgeGVuX3B2X3NlbmRfbm90aWZ5KCZibGtkZXYtPnhlbmRldik7Ci0gICAgfQot fQotCi1zdGF0aWMgaW50IGJsa19nZXRfcmVxdWVzdChzdHJ1Y3QgWGVuQmxrRGV2ICpibGtkZXYs IHN0cnVjdCBpb3JlcSAqaW9yZXEsIFJJTkdfSURYIHJjKQotewotICAgIHN3aXRjaCAoYmxrZGV2 LT5wcm90b2NvbCkgewotICAgIGNhc2UgQkxLSUZfUFJPVE9DT0xfTkFUSVZFOgotICAgICAgICBt ZW1jcHkoJmlvcmVxLT5yZXEsIFJJTkdfR0VUX1JFUVVFU1QoJmJsa2Rldi0+cmluZ3MubmF0aXZl LCByYyksCi0gICAgICAgICAgICAgICBzaXplb2YoaW9yZXEtPnJlcSkpOwotICAgICAgICBicmVh azsKLSAgICBjYXNlIEJMS0lGX1BST1RPQ09MX1g4Nl8zMjoKLSAgICAgICAgYmxraWZfZ2V0X3g4 Nl8zMl9yZXEoJmlvcmVxLT5yZXEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJJTkdf R0VUX1JFUVVFU1QoJmJsa2Rldi0+cmluZ3MueDg2XzMyX3BhcnQsIHJjKSk7Ci0gICAgICAgIGJy ZWFrOwotICAgIGNhc2UgQkxLSUZfUFJPVE9DT0xfWDg2XzY0OgotICAgICAgICBibGtpZl9nZXRf eDg2XzY0X3JlcSgmaW9yZXEtPnJlcSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUklO R19HRVRfUkVRVUVTVCgmYmxrZGV2LT5yaW5ncy54ODZfNjRfcGFydCwgcmMpKTsKLSAgICAgICAg YnJlYWs7Ci0gICAgfQotICAgIC8qIFByZXZlbnQgdGhlIGNvbXBpbGVyIGZyb20gYWNjZXNzaW5n IHRoZSBvbi1yaW5nIGZpZWxkcyBpbnN0ZWFkLiAqLwotICAgIGJhcnJpZXIoKTsKLSAgICByZXR1 cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgYmxrX2hhbmRsZV9yZXF1ZXN0cyhzdHJ1Y3QgWGVuQmxr RGV2ICpibGtkZXYpCi17Ci0gICAgUklOR19JRFggcmMsIHJwOwotICAgIHN0cnVjdCBpb3JlcSAq aW9yZXE7Ci0KLSAgICBibGtkZXYtPm1vcmVfd29yayA9IDA7Ci0KLSAgICByYyA9IGJsa2Rldi0+ cmluZ3MuY29tbW9uLnJlcV9jb25zOwotICAgIHJwID0gYmxrZGV2LT5yaW5ncy5jb21tb24uc3Jp bmctPnJlcV9wcm9kOwotICAgIHhlbl9ybWIoKTsgLyogRW5zdXJlIHdlIHNlZSBxdWV1ZWQgcmVx dWVzdHMgdXAgdG8gJ3JwJy4gKi8KLQotICAgIGJsa19zZW5kX3Jlc3BvbnNlX2FsbChibGtkZXYp OwotICAgIHdoaWxlIChyYyAhPSBycCkgewotICAgICAgICAvKiBwdWxsIHJlcXVlc3QgZnJvbSBy aW5nICovCi0gICAgICAgIGlmIChSSU5HX1JFUVVFU1RfQ09OU19PVkVSRkxPVygmYmxrZGV2LT5y aW5ncy5jb21tb24sIHJjKSkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAg ICAgaW9yZXEgPSBpb3JlcV9zdGFydChibGtkZXYpOwotICAgICAgICBpZiAoaW9yZXEgPT0gTlVM TCkgewotICAgICAgICAgICAgYmxrZGV2LT5tb3JlX3dvcmsrKzsKLSAgICAgICAgICAgIGJyZWFr OwotICAgICAgICB9Ci0gICAgICAgIGJsa19nZXRfcmVxdWVzdChibGtkZXYsIGlvcmVxLCByYyk7 Ci0gICAgICAgIGJsa2Rldi0+cmluZ3MuY29tbW9uLnJlcV9jb25zID0gKytyYzsKLQotICAgICAg ICAvKiBwYXJzZSB0aGVtICovCi0gICAgICAgIGlmIChpb3JlcV9wYXJzZShpb3JlcSkgIT0gMCkg ewotCi0gICAgICAgICAgICBzd2l0Y2ggKGlvcmVxLT5yZXEub3BlcmF0aW9uKSB7Ci0gICAgICAg ICAgICBjYXNlIEJMS0lGX09QX1JFQUQ6Ci0gICAgICAgICAgICAgICAgYmxvY2tfYWNjdF9pbnZh bGlkKGJsa19nZXRfc3RhdHMoYmxrZGV2LT5ibGspLAotICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBCTE9DS19BQ0NUX1JFQUQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAg ICAgICAgICAgY2FzZSBCTEtJRl9PUF9XUklURToKLSAgICAgICAgICAgICAgICBibG9ja19hY2N0 X2ludmFsaWQoYmxrX2dldF9zdGF0cyhibGtkZXYtPmJsayksCi0gICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIEJMT0NLX0FDQ1RfV1JJVEUpOwotICAgICAgICAgICAgICAgIGJyZWFr OwotICAgICAgICAgICAgY2FzZSBCTEtJRl9PUF9GTFVTSF9ESVNLQ0FDSEU6Ci0gICAgICAgICAg ICAgICAgYmxvY2tfYWNjdF9pbnZhbGlkKGJsa19nZXRfc3RhdHMoYmxrZGV2LT5ibGspLAotICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCTE9DS19BQ0NUX0ZMVVNIKTsKLSAgICAg ICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Owot Ci0gICAgICAgICAgICBpZiAoYmxrX3NlbmRfcmVzcG9uc2Vfb25lKGlvcmVxKSkgewotICAgICAg ICAgICAgICAgIHhlbl9wdl9zZW5kX25vdGlmeSgmYmxrZGV2LT54ZW5kZXYpOwotICAgICAgICAg ICAgfQotICAgICAgICAgICAgaW9yZXFfcmVsZWFzZShpb3JlcSwgZmFsc2UpOwotICAgICAgICAg ICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpb3JlcV9ydW5pb19xZW11X2Fpbyhp b3JlcSk7Ci0gICAgfQotCi0gICAgaWYgKGJsa2Rldi0+bW9yZV93b3JrICYmIGJsa2Rldi0+cmVx dWVzdHNfaW5mbGlnaHQgPCBibGtkZXYtPm1heF9yZXF1ZXN0cykgewotICAgICAgICBxZW11X2Jo X3NjaGVkdWxlKGJsa2Rldi0+YmgpOwotICAgIH0KLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi1zdGF0aWMg dm9pZCBibGtfYmgodm9pZCAqb3BhcXVlKQotewotICAgIHN0cnVjdCBYZW5CbGtEZXYgKmJsa2Rl diA9IG9wYXF1ZTsKLQotICAgIGFpb19jb250ZXh0X2FjcXVpcmUoYmxrZGV2LT5jdHgpOwotICAg IGJsa19oYW5kbGVfcmVxdWVzdHMoYmxrZGV2KTsKLSAgICBhaW9fY29udGV4dF9yZWxlYXNlKGJs a2Rldi0+Y3R4KTsKLX0KLQotc3RhdGljIHZvaWQgYmxrX2FsbG9jKHN0cnVjdCBYZW5MZWdhY3lE ZXZpY2UgKnhlbmRldikKLXsKLSAgICBzdHJ1Y3QgWGVuQmxrRGV2ICpibGtkZXYgPSBjb250YWlu ZXJfb2YoeGVuZGV2LCBzdHJ1Y3QgWGVuQmxrRGV2LCB4ZW5kZXYpOwotICAgIEVycm9yICplcnIg PSBOVUxMOwotCi0gICAgdHJhY2VfeGVuX2Rpc2tfYWxsb2MoeGVuZGV2LT5uYW1lKTsKLQotICAg IFFMSVNUX0lOSVQoJmJsa2Rldi0+aW5mbGlnaHQpOwotICAgIFFMSVNUX0lOSVQoJmJsa2Rldi0+ ZmluaXNoZWQpOwotICAgIFFMSVNUX0lOSVQoJmJsa2Rldi0+ZnJlZWxpc3QpOwotCi0gICAgYmxr ZGV2LT5pb3RocmVhZCA9IGlvdGhyZWFkX2NyZWF0ZSh4ZW5kZXYtPm5hbWUsICZlcnIpOwotICAg IGFzc2VydCghZXJyKTsKLQotICAgIGJsa2Rldi0+Y3R4ID0gaW90aHJlYWRfZ2V0X2Fpb19jb250 ZXh0KGJsa2Rldi0+aW90aHJlYWQpOwotICAgIGJsa2Rldi0+YmggPSBhaW9fYmhfbmV3KGJsa2Rl di0+Y3R4LCBibGtfYmgsIGJsa2Rldik7Ci19Ci0KLXN0YXRpYyB2b2lkIGJsa19wYXJzZV9kaXNj YXJkKHN0cnVjdCBYZW5CbGtEZXYgKmJsa2RldikKLXsKLSAgICBzdHJ1Y3QgWGVuTGVnYWN5RGV2 aWNlICp4ZW5kZXYgPSAmYmxrZGV2LT54ZW5kZXY7Ci0gICAgaW50IGVuYWJsZTsKLQotICAgIGJs a2Rldi0+ZmVhdHVyZV9kaXNjYXJkID0gdHJ1ZTsKLQotICAgIGlmICh4ZW5zdG9yZV9yZWFkX2Jl X2ludCh4ZW5kZXYsICJkaXNjYXJkLWVuYWJsZSIsICZlbmFibGUpID09IDApIHsKLSAgICAgICAg YmxrZGV2LT5mZWF0dXJlX2Rpc2NhcmQgPSAhIWVuYWJsZTsKLSAgICB9Ci0KLSAgICBpZiAoYmxr ZGV2LT5mZWF0dXJlX2Rpc2NhcmQpIHsKLSAgICAgICAgeGVuc3RvcmVfd3JpdGVfYmVfaW50KHhl bmRldiwgImZlYXR1cmUtZGlzY2FyZCIsIDEpOwotICAgIH0KLX0KLQotc3RhdGljIGludCBibGtf aW5pdChzdHJ1Y3QgWGVuTGVnYWN5RGV2aWNlICp4ZW5kZXYpCi17Ci0gICAgc3RydWN0IFhlbkJs a0RldiAqYmxrZGV2ID0gY29udGFpbmVyX29mKHhlbmRldiwgc3RydWN0IFhlbkJsa0RldiwgeGVu ZGV2KTsKLSAgICBpbnQgaW5mbyA9IDA7Ci0gICAgY2hhciAqZGlyZWN0aW9zYWZlID0gTlVMTDsK LQotICAgIHRyYWNlX3hlbl9kaXNrX2luaXQoeGVuZGV2LT5uYW1lKTsKLQotICAgIC8qIHJlYWQg eGVuc3RvcmUgZW50cmllcyAqLwotICAgIGlmIChibGtkZXYtPnBhcmFtcyA9PSBOVUxMKSB7Ci0g ICAgICAgIGNoYXIgKmggPSBOVUxMOwotICAgICAgICBibGtkZXYtPnBhcmFtcyA9IHhlbnN0b3Jl X3JlYWRfYmVfc3RyKHhlbmRldiwgInBhcmFtcyIpOwotICAgICAgICBpZiAoYmxrZGV2LT5wYXJh bXMgIT0gTlVMTCkgewotICAgICAgICAgICAgaCA9IHN0cmNocihibGtkZXYtPnBhcmFtcywgJzon KTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBibGtk ZXYtPmZpbGVwcm90byA9IGJsa2Rldi0+cGFyYW1zOwotICAgICAgICAgICAgYmxrZGV2LT5maWxl bmFtZSAgPSBoKzE7Ci0gICAgICAgICAgICAqaCA9IDA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAg ICAgICAgICBibGtkZXYtPmZpbGVwcm90byA9ICI8dW5zZXQ+IjsKLSAgICAgICAgICAgIGJsa2Rl di0+ZmlsZW5hbWUgID0gYmxrZGV2LT5wYXJhbXM7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYg KCFzdHJjbXAoImFpbyIsIGJsa2Rldi0+ZmlsZXByb3RvKSkgewotICAgICAgICBibGtkZXYtPmZp bGVwcm90byA9ICJyYXciOwotICAgIH0KLSAgICBpZiAoIXN0cmNtcCgidmhkIiwgYmxrZGV2LT5m aWxlcHJvdG8pKSB7Ci0gICAgICAgIGJsa2Rldi0+ZmlsZXByb3RvID0gInZwYyI7Ci0gICAgfQot ICAgIGlmIChibGtkZXYtPm1vZGUgPT0gTlVMTCkgewotICAgICAgICBibGtkZXYtPm1vZGUgPSB4 ZW5zdG9yZV9yZWFkX2JlX3N0cih4ZW5kZXYsICJtb2RlIik7Ci0gICAgfQotICAgIGlmIChibGtk ZXYtPnR5cGUgPT0gTlVMTCkgewotICAgICAgICBibGtkZXYtPnR5cGUgPSB4ZW5zdG9yZV9yZWFk X2JlX3N0cih4ZW5kZXYsICJ0eXBlIik7Ci0gICAgfQotICAgIGlmIChibGtkZXYtPmRldiA9PSBO VUxMKSB7Ci0gICAgICAgIGJsa2Rldi0+ZGV2ID0geGVuc3RvcmVfcmVhZF9iZV9zdHIoeGVuZGV2 LCAiZGV2Iik7Ci0gICAgfQotICAgIGlmIChibGtkZXYtPmRldnR5cGUgPT0gTlVMTCkgewotICAg ICAgICBibGtkZXYtPmRldnR5cGUgPSB4ZW5zdG9yZV9yZWFkX2JlX3N0cih4ZW5kZXYsICJkZXZp Y2UtdHlwZSIpOwotICAgIH0KLSAgICBkaXJlY3Rpb3NhZmUgPSB4ZW5zdG9yZV9yZWFkX2JlX3N0 cih4ZW5kZXYsICJkaXJlY3QtaW8tc2FmZSIpOwotICAgIGJsa2Rldi0+ZGlyZWN0aW9zYWZlID0g KGRpcmVjdGlvc2FmZSAmJiBhdG9pKGRpcmVjdGlvc2FmZSkpOwotCi0gICAgLyogZG8gd2UgaGF2 ZSBhbGwgd2UgbmVlZD8gKi8KLSAgICBpZiAoYmxrZGV2LT5wYXJhbXMgPT0gTlVMTCB8fAotICAg ICAgICBibGtkZXYtPm1vZGUgPT0gTlVMTCAgIHx8Ci0gICAgICAgIGJsa2Rldi0+dHlwZSA9PSBO VUxMICAgfHwKLSAgICAgICAgYmxrZGV2LT5kZXYgPT0gTlVMTCkgewotICAgICAgICBnb3RvIG91 dF9lcnJvcjsKLSAgICB9Ci0KLSAgICAvKiByZWFkLW9ubHkgPyAqLwotICAgIGlmIChzdHJjbXAo YmxrZGV2LT5tb2RlLCAidyIpKSB7Ci0gICAgICAgIGluZm8gIHw9IFZESVNLX1JFQURPTkxZOwot ICAgIH0KLQotICAgIC8qIGNkcm9tID8gKi8KLSAgICBpZiAoYmxrZGV2LT5kZXZ0eXBlICYmICFz dHJjbXAoYmxrZGV2LT5kZXZ0eXBlLCAiY2Ryb20iKSkgewotICAgICAgICBpbmZvICB8PSBWRElT S19DRFJPTTsKLSAgICB9Ci0KLSAgICBibGtkZXYtPmZpbGVfYmxrICA9IEJMT0NLX1NJWkU7Ci0K LSAgICAvKiBmaWxsIGluZm8KLSAgICAgKiBibGtfY29ubmVjdCBzdXBwbGllcyBzZWN0b3Itc2l6 ZSBhbmQgc2VjdG9ycwotICAgICAqLwotICAgIHhlbnN0b3JlX3dyaXRlX2JlX2ludCh4ZW5kZXYs ICJmZWF0dXJlLWZsdXNoLWNhY2hlIiwgMSk7Ci0gICAgeGVuc3RvcmVfd3JpdGVfYmVfaW50KHhl bmRldiwgImluZm8iLCBpbmZvKTsKLQotICAgIHhlbnN0b3JlX3dyaXRlX2JlX2ludCh4ZW5kZXYs ICJtYXgtcmluZy1wYWdlLW9yZGVyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTUFYX1JJ TkdfUEFHRV9PUkRFUik7Ci0KLSAgICBibGtfcGFyc2VfZGlzY2FyZChibGtkZXYpOwotCi0gICAg Z19mcmVlKGRpcmVjdGlvc2FmZSk7Ci0gICAgcmV0dXJuIDA7Ci0KLW91dF9lcnJvcjoKLSAgICBn X2ZyZWUoYmxrZGV2LT5wYXJhbXMpOwotICAgIGJsa2Rldi0+cGFyYW1zID0gTlVMTDsKLSAgICBn X2ZyZWUoYmxrZGV2LT5tb2RlKTsKLSAgICBibGtkZXYtPm1vZGUgPSBOVUxMOwotICAgIGdfZnJl ZShibGtkZXYtPnR5cGUpOwotICAgIGJsa2Rldi0+dHlwZSA9IE5VTEw7Ci0gICAgZ19mcmVlKGJs a2Rldi0+ZGV2KTsKLSAgICBibGtkZXYtPmRldiA9IE5VTEw7Ci0gICAgZ19mcmVlKGJsa2Rldi0+ ZGV2dHlwZSk7Ci0gICAgYmxrZGV2LT5kZXZ0eXBlID0gTlVMTDsKLSAgICBnX2ZyZWUoZGlyZWN0 aW9zYWZlKTsKLSAgICBibGtkZXYtPmRpcmVjdGlvc2FmZSA9IGZhbHNlOwotICAgIHJldHVybiAt MTsKLX0KLQotc3RhdGljIGludCBibGtfY29ubmVjdChzdHJ1Y3QgWGVuTGVnYWN5RGV2aWNlICp4 ZW5kZXYpCi17Ci0gICAgc3RydWN0IFhlbkJsa0RldiAqYmxrZGV2ID0gY29udGFpbmVyX29mKHhl bmRldiwgc3RydWN0IFhlbkJsa0RldiwgeGVuZGV2KTsKLSAgICBpbnQgaW5kZXgsIHFmbGFnczsK LSAgICBib29sIHJlYWRvbmx5ID0gdHJ1ZTsKLSAgICBib29sIHdyaXRldGhyb3VnaCA9IHRydWU7 Ci0gICAgaW50IG9yZGVyLCByaW5nX3JlZjsKLSAgICB1bnNpZ25lZCBpbnQgcmluZ19zaXplLCBt YXhfZ3JhbnRzOwotICAgIHVuc2lnbmVkIGludCBpOwotCi0gICAgdHJhY2VfeGVuX2Rpc2tfY29u bmVjdCh4ZW5kZXYtPm5hbWUpOwotCi0gICAgLyogcmVhZC1vbmx5ID8gKi8KLSAgICBpZiAoYmxr ZGV2LT5kaXJlY3Rpb3NhZmUpIHsKLSAgICAgICAgcWZsYWdzID0gQkRSVl9PX05PQ0FDSEUgfCBC RFJWX09fTkFUSVZFX0FJTzsKLSAgICB9IGVsc2UgewotICAgICAgICBxZmxhZ3MgPSAwOwotICAg ICAgICB3cml0ZXRocm91Z2ggPSBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKHN0cmNtcChibGtkZXYt Pm1vZGUsICJ3IikgPT0gMCkgewotICAgICAgICBxZmxhZ3MgfD0gQkRSVl9PX1JEV1I7Ci0gICAg ICAgIHJlYWRvbmx5ID0gZmFsc2U7Ci0gICAgfQotICAgIGlmIChibGtkZXYtPmZlYXR1cmVfZGlz Y2FyZCkgewotICAgICAgICBxZmxhZ3MgfD0gQkRSVl9PX1VOTUFQOwotICAgIH0KLQotICAgIC8q IGluaXQgcWVtdSBibG9jayBkcml2ZXIgKi8KLSAgICBpbmRleCA9ICh4ZW5kZXYtPmRldiAtIDIw MiAqIDI1NikgLyAxNjsKLSAgICBibGtkZXYtPmRpbmZvID0gZHJpdmVfZ2V0KElGX1hFTiwgMCwg aW5kZXgpOwotICAgIGlmICghYmxrZGV2LT5kaW5mbykgewotICAgICAgICBFcnJvciAqbG9jYWxf ZXJyID0gTlVMTDsKLSAgICAgICAgUURpY3QgKm9wdGlvbnMgPSBOVUxMOwotCi0gICAgICAgIGlm IChzdHJjbXAoYmxrZGV2LT5maWxlcHJvdG8sICI8dW5zZXQ+IikpIHsKLSAgICAgICAgICAgIG9w dGlvbnMgPSBxZGljdF9uZXcoKTsKLSAgICAgICAgICAgIHFkaWN0X3B1dF9zdHIob3B0aW9ucywg ImRyaXZlciIsIGJsa2Rldi0+ZmlsZXByb3RvKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIHNl dHVwIHZpYSB4ZW5idXMgLT4gY3JlYXRlIG5ldyBibG9jayBkcml2ZXIgaW5zdGFuY2UgKi8KLSAg ICAgICAgeGVuX3B2X3ByaW50Zih4ZW5kZXYsIDIsICJjcmVhdGUgbmV3IGJkcnYgKHhlbmJ1cyBz ZXR1cClcbiIpOwotICAgICAgICBibGtkZXYtPmJsayA9IGJsa19uZXdfb3BlbihibGtkZXYtPmZp bGVuYW1lLCBOVUxMLCBvcHRpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBxZmxhZ3MsICZsb2NhbF9lcnIpOwotICAgICAgICBpZiAoIWJsa2Rldi0+YmxrKSB7Ci0gICAg ICAgICAgICB4ZW5fcHZfcHJpbnRmKHhlbmRldiwgMCwgImVycm9yOiAlc1xuIiwKLSAgICAgICAg ICAgICAgICAgICAgICAgICAgZXJyb3JfZ2V0X3ByZXR0eShsb2NhbF9lcnIpKTsKLSAgICAgICAg ICAgIGVycm9yX2ZyZWUobG9jYWxfZXJyKTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAg ICAgfQotICAgICAgICBibGtfc2V0X2VuYWJsZV93cml0ZV9jYWNoZShibGtkZXYtPmJsaywgIXdy aXRldGhyb3VnaCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLyogc2V0dXAgdmlhIHFlbXUgY21k bGluZSAtPiBhbHJlYWR5IHNldHVwIGZvciB1cyAqLwotICAgICAgICB4ZW5fcHZfcHJpbnRmKHhl bmRldiwgMiwKLSAgICAgICAgICAgICAgICAgICAgICAiZ2V0IGNvbmZpZ3VyZWQgYmRydiAoY21k bGluZSBzZXR1cClcbiIpOwotICAgICAgICBibGtkZXYtPmJsayA9IGJsa19ieV9sZWdhY3lfZGlu Zm8oYmxrZGV2LT5kaW5mbyk7Ci0gICAgICAgIGlmIChibGtfaXNfcmVhZF9vbmx5KGJsa2Rldi0+ YmxrKSAmJiAhcmVhZG9ubHkpIHsKLSAgICAgICAgICAgIHhlbl9wdl9wcmludGYoeGVuZGV2LCAw LCAiVW5leHBlY3RlZCByZWFkLW9ubHkgZHJpdmUiKTsKLSAgICAgICAgICAgIGJsa2Rldi0+Ymxr ID0gTlVMTDsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICAvKiBi bGtkZXYtPmJsayBpcyBub3QgY3JlYXRlIGJ5IHVzLCB3ZSBnZXQgYSByZWZlcmVuY2UKLSAgICAg ICAgICogc28gd2UgY2FuIGJsa191bnJlZigpIHVuY29uZGl0aW9uYWxseSAqLwotICAgICAgICBi bGtfcmVmKGJsa2Rldi0+YmxrKTsKLSAgICB9Ci0gICAgYmxrX2F0dGFjaF9kZXZfbGVnYWN5KGJs a2Rldi0+YmxrLCBibGtkZXYpOwotICAgIGJsa2Rldi0+ZmlsZV9zaXplID0gYmxrX2dldGxlbmd0 aChibGtkZXYtPmJsayk7Ci0gICAgaWYgKGJsa2Rldi0+ZmlsZV9zaXplIDwgMCkgewotICAgICAg ICBCbG9ja0RyaXZlclN0YXRlICpicyA9IGJsa19icyhibGtkZXYtPmJsayk7Ci0gICAgICAgIGNv bnN0IGNoYXIgKmRydl9uYW1lID0gYnMgPyBiZHJ2X2dldF9mb3JtYXRfbmFtZShicykgOiBOVUxM OwotICAgICAgICB4ZW5fcHZfcHJpbnRmKHhlbmRldiwgMSwgImJsa19nZXRsZW5ndGg6ICVkICgl cykgfCBkcnYgJXNcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgKGludClibGtkZXYtPmZpbGVf c2l6ZSwgc3RyZXJyb3IoLWJsa2Rldi0+ZmlsZV9zaXplKSwKLSAgICAgICAgICAgICAgICAgICAg ICBkcnZfbmFtZSA/OiAiLSIpOwotICAgICAgICBibGtkZXYtPmZpbGVfc2l6ZSA9IDA7Ci0gICAg fQotCi0gICAgeGVuX3B2X3ByaW50Zih4ZW5kZXYsIDEsICJ0eXBlIFwiJXNcIiwgZmlsZXByb3Rv IFwiJXNcIiwgZmlsZW5hbWUgXCIlc1wiLCIKLSAgICAgICAgICAgICAgICAgICIgc2l6ZSAlIiBQ UklkNjQgIiAoJSIgUFJJZDY0ICIgTUIpXG4iLAotICAgICAgICAgICAgICAgICAgYmxrZGV2LT50 eXBlLCBibGtkZXYtPmZpbGVwcm90bywgYmxrZGV2LT5maWxlbmFtZSwKLSAgICAgICAgICAgICAg ICAgIGJsa2Rldi0+ZmlsZV9zaXplLCBibGtkZXYtPmZpbGVfc2l6ZSAvIE1pQik7Ci0KLSAgICAv KiBGaWxsIGluIG51bWJlciBvZiBzZWN0b3Igc2l6ZSBhbmQgbnVtYmVyIG9mIHNlY3RvcnMgKi8K LSAgICB4ZW5zdG9yZV93cml0ZV9iZV9pbnQoeGVuZGV2LCAic2VjdG9yLXNpemUiLCBibGtkZXYt PmZpbGVfYmxrKTsKLSAgICB4ZW5zdG9yZV93cml0ZV9iZV9pbnQ2NCh4ZW5kZXYsICJzZWN0b3Jz IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGtkZXYtPmZpbGVfc2l6ZSAvIGJsa2Rl di0+ZmlsZV9ibGspOwotCi0gICAgaWYgKHhlbnN0b3JlX3JlYWRfZmVfaW50KHhlbmRldiwgInJp bmctcGFnZS1vcmRlciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvcmRlcikgPT0g LTEpIHsKLSAgICAgICAgYmxrZGV2LT5ucl9yaW5nX3JlZiA9IDE7Ci0KLSAgICAgICAgaWYgKHhl bnN0b3JlX3JlYWRfZmVfaW50KHhlbmRldiwgInJpbmctcmVmIiwKLSAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICZyaW5nX3JlZikgPT0gLTEpIHsKLSAgICAgICAgICAgIHJldHVybiAt MTsKLSAgICAgICAgfQotICAgICAgICBibGtkZXYtPnJpbmdfcmVmWzBdID0gcmluZ19yZWY7Ci0K LSAgICB9IGVsc2UgaWYgKG9yZGVyID49IDAgJiYgb3JkZXIgPD0gTUFYX1JJTkdfUEFHRV9PUkRF UikgewotICAgICAgICBibGtkZXYtPm5yX3JpbmdfcmVmID0gMSA8PCBvcmRlcjsKLQotICAgICAg ICBmb3IgKGkgPSAwOyBpIDwgYmxrZGV2LT5ucl9yaW5nX3JlZjsgaSsrKSB7Ci0gICAgICAgICAg ICBjaGFyICprZXk7Ci0KLSAgICAgICAgICAgIGtleSA9IGdfc3RyZHVwX3ByaW50ZigicmluZy1y ZWYldSIsIGkpOwotICAgICAgICAgICAgaWYgKCFrZXkpIHsKLSAgICAgICAgICAgICAgICByZXR1 cm4gLTE7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh4ZW5zdG9yZV9yZWFkX2Zl X2ludCh4ZW5kZXYsIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAm cmluZ19yZWYpID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgZ19mcmVlKGtleSk7Ci0gICAgICAg ICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYmxrZGV2LT5y aW5nX3JlZltpXSA9IHJpbmdfcmVmOwotCi0gICAgICAgICAgICBnX2ZyZWUoa2V5KTsKLSAgICAg ICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIHhlbl9wdl9wcmludGYoeGVuZGV2LCAwLCAiaW52 YWxpZCByaW5nLXBhZ2Utb3JkZXI6ICVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgIG9yZGVy KTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIGlmICh4ZW5zdG9yZV9yZWFkX2Zl X2ludCh4ZW5kZXYsICJldmVudC1jaGFubmVsIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgJnhlbmRldi0+cmVtb3RlX3BvcnQpID09IC0xKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAg ICB9Ci0KLSAgICBpZiAoIXhlbmRldi0+cHJvdG9jb2wpIHsKLSAgICAgICAgYmxrZGV2LT5wcm90 b2NvbCA9IEJMS0lGX1BST1RPQ09MX05BVElWRTsKLSAgICB9IGVsc2UgaWYgKHN0cmNtcCh4ZW5k ZXYtPnByb3RvY29sLCBYRU5fSU9fUFJPVE9fQUJJX05BVElWRSkgPT0gMCkgewotICAgICAgICBi bGtkZXYtPnByb3RvY29sID0gQkxLSUZfUFJPVE9DT0xfTkFUSVZFOwotICAgIH0gZWxzZSBpZiAo c3RyY21wKHhlbmRldi0+cHJvdG9jb2wsIFhFTl9JT19QUk9UT19BQklfWDg2XzMyKSA9PSAwKSB7 Ci0gICAgICAgIGJsa2Rldi0+cHJvdG9jb2wgPSBCTEtJRl9QUk9UT0NPTF9YODZfMzI7Ci0gICAg fSBlbHNlIGlmIChzdHJjbXAoeGVuZGV2LT5wcm90b2NvbCwgWEVOX0lPX1BST1RPX0FCSV9YODZf NjQpID09IDApIHsKLSAgICAgICAgYmxrZGV2LT5wcm90b2NvbCA9IEJMS0lGX1BST1RPQ09MX1g4 Nl82NDsKLSAgICB9IGVsc2UgewotICAgICAgICBibGtkZXYtPnByb3RvY29sID0gQkxLSUZfUFJP VE9DT0xfTkFUSVZFOwotICAgIH0KLQotICAgIHJpbmdfc2l6ZSA9IFhDX1BBR0VfU0laRSAqIGJs a2Rldi0+bnJfcmluZ19yZWY7Ci0gICAgc3dpdGNoIChibGtkZXYtPnByb3RvY29sKSB7Ci0gICAg Y2FzZSBCTEtJRl9QUk9UT0NPTF9OQVRJVkU6Ci0gICAgewotICAgICAgICBibGtkZXYtPm1heF9y ZXF1ZXN0cyA9IF9fQ09OU1RfUklOR19TSVpFKGJsa2lmLCByaW5nX3NpemUpOwotICAgICAgICBi cmVhazsKLSAgICB9Ci0gICAgY2FzZSBCTEtJRl9QUk9UT0NPTF9YODZfMzI6Ci0gICAgewotICAg ICAgICBibGtkZXYtPm1heF9yZXF1ZXN0cyA9IF9fQ09OU1RfUklOR19TSVpFKGJsa2lmX3g4Nl8z MiwgcmluZ19zaXplKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgQkxLSUZfUFJP VE9DT0xfWDg2XzY0OgotICAgIHsKLSAgICAgICAgYmxrZGV2LT5tYXhfcmVxdWVzdHMgPSBfX0NP TlNUX1JJTkdfU0laRShibGtpZl94ODZfNjQsIHJpbmdfc2l6ZSk7Ci0gICAgICAgIGJyZWFrOwot ICAgIH0KLSAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgLyog QWRkIG9uIHRoZSBudW1iZXIgbmVlZGVkIGZvciB0aGUgcmluZyBwYWdlcyAqLwotICAgIG1heF9n cmFudHMgPSBibGtkZXYtPm5yX3JpbmdfcmVmOwotCi0gICAgeGVuX2JlX3NldF9tYXhfZ3JhbnRf cmVmcyh4ZW5kZXYsIG1heF9ncmFudHMpOwotICAgIGJsa2Rldi0+c3JpbmcgPSB4ZW5fYmVfbWFw X2dyYW50X3JlZnMoeGVuZGV2LCBibGtkZXYtPnJpbmdfcmVmLAotICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgYmxrZGV2LT5ucl9yaW5nX3JlZiwKLSAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST1RfUkVBRCB8IFBST1RfV1JJVEUpOwot ICAgIGlmICghYmxrZGV2LT5zcmluZykgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0g ICAgc3dpdGNoIChibGtkZXYtPnByb3RvY29sKSB7Ci0gICAgY2FzZSBCTEtJRl9QUk9UT0NPTF9O QVRJVkU6Ci0gICAgewotICAgICAgICBibGtpZl9zcmluZ190ICpzcmluZ19uYXRpdmUgPSBibGtk ZXYtPnNyaW5nOwotICAgICAgICBCQUNLX1JJTkdfSU5JVCgmYmxrZGV2LT5yaW5ncy5uYXRpdmUs IHNyaW5nX25hdGl2ZSwgcmluZ19zaXplKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNh c2UgQkxLSUZfUFJPVE9DT0xfWDg2XzMyOgotICAgIHsKLSAgICAgICAgYmxraWZfeDg2XzMyX3Ny aW5nX3QgKnNyaW5nX3g4Nl8zMiA9IGJsa2Rldi0+c3Jpbmc7Ci0KLSAgICAgICAgQkFDS19SSU5H X0lOSVQoJmJsa2Rldi0+cmluZ3MueDg2XzMyX3BhcnQsIHNyaW5nX3g4Nl8zMiwgcmluZ19zaXpl KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgQkxLSUZfUFJPVE9DT0xfWDg2XzY0 OgotICAgIHsKLSAgICAgICAgYmxraWZfeDg2XzY0X3NyaW5nX3QgKnNyaW5nX3g4Nl82NCA9IGJs a2Rldi0+c3Jpbmc7Ci0KLSAgICAgICAgQkFDS19SSU5HX0lOSVQoJmJsa2Rldi0+cmluZ3MueDg2 XzY0X3BhcnQsIHNyaW5nX3g4Nl82NCwgcmluZ19zaXplKTsKLSAgICAgICAgYnJlYWs7Ci0gICAg fQotICAgIH0KLQotICAgIGJsa19zZXRfYWlvX2NvbnRleHQoYmxrZGV2LT5ibGssIGJsa2Rldi0+ Y3R4KTsKLQotICAgIHhlbl9iZV9iaW5kX2V2dGNobih4ZW5kZXYpOwotCi0gICAgeGVuX3B2X3By aW50Zih4ZW5kZXYsIDEsICJvazogcHJvdG8gJXMsIG5yLXJpbmctcmVmICV1LCAiCi0gICAgICAg ICAgICAgICAgICAicmVtb3RlIHBvcnQgJWQsIGxvY2FsIHBvcnQgJWRcbiIsCi0gICAgICAgICAg ICAgICAgICB4ZW5kZXYtPnByb3RvY29sLCBibGtkZXYtPm5yX3JpbmdfcmVmLAotICAgICAgICAg ICAgICAgICAgeGVuZGV2LT5yZW1vdGVfcG9ydCwgeGVuZGV2LT5sb2NhbF9wb3J0KTsKLSAgICBy ZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgYmxrX2Rpc2Nvbm5lY3Qoc3RydWN0IFhlbkxlZ2Fj eURldmljZSAqeGVuZGV2KQotewotICAgIHN0cnVjdCBYZW5CbGtEZXYgKmJsa2RldiA9IGNvbnRh aW5lcl9vZih4ZW5kZXYsIHN0cnVjdCBYZW5CbGtEZXYsIHhlbmRldik7Ci0KLSAgICB0cmFjZV94 ZW5fZGlza19kaXNjb25uZWN0KHhlbmRldi0+bmFtZSk7Ci0KLSAgICBhaW9fY29udGV4dF9hY3F1 aXJlKGJsa2Rldi0+Y3R4KTsKLQotICAgIGlmIChibGtkZXYtPmJsaykgewotICAgICAgICBibGtf c2V0X2Fpb19jb250ZXh0KGJsa2Rldi0+YmxrLCBxZW11X2dldF9haW9fY29udGV4dCgpKTsKLSAg ICAgICAgYmxrX2RldGFjaF9kZXYoYmxrZGV2LT5ibGssIGJsa2Rldik7Ci0gICAgICAgIGJsa191 bnJlZihibGtkZXYtPmJsayk7Ci0gICAgICAgIGJsa2Rldi0+YmxrID0gTlVMTDsKLSAgICB9Ci0g ICAgeGVuX3B2X3VuYmluZF9ldnRjaG4oeGVuZGV2KTsKLQotICAgIGFpb19jb250ZXh0X3JlbGVh c2UoYmxrZGV2LT5jdHgpOwotCi0gICAgaWYgKGJsa2Rldi0+c3JpbmcpIHsKLSAgICAgICAgeGVu X2JlX3VubWFwX2dyYW50X3JlZnMoeGVuZGV2LCBibGtkZXYtPnNyaW5nLAotICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBibGtkZXYtPm5yX3JpbmdfcmVmKTsKLSAgICAgICAgYmxrZGV2 LT5zcmluZyA9IE5VTEw7Ci0gICAgfQotfQotCi1zdGF0aWMgaW50IGJsa19mcmVlKHN0cnVjdCBY ZW5MZWdhY3lEZXZpY2UgKnhlbmRldikKLXsKLSAgICBzdHJ1Y3QgWGVuQmxrRGV2ICpibGtkZXYg PSBjb250YWluZXJfb2YoeGVuZGV2LCBzdHJ1Y3QgWGVuQmxrRGV2LCB4ZW5kZXYpOwotICAgIHN0 cnVjdCBpb3JlcSAqaW9yZXE7Ci0KLSAgICB0cmFjZV94ZW5fZGlza19mcmVlKHhlbmRldi0+bmFt ZSk7Ci0KLSAgICBibGtfZGlzY29ubmVjdCh4ZW5kZXYpOwotCi0gICAgd2hpbGUgKCFRTElTVF9F TVBUWSgmYmxrZGV2LT5mcmVlbGlzdCkpIHsKLSAgICAgICAgaW9yZXEgPSBRTElTVF9GSVJTVCgm YmxrZGV2LT5mcmVlbGlzdCk7Ci0gICAgICAgIFFMSVNUX1JFTU9WRShpb3JlcSwgbGlzdCk7Ci0g ICAgICAgIHFlbXVfaW92ZWNfZGVzdHJveSgmaW9yZXEtPnYpOwotICAgICAgICBnX2ZyZWUoaW9y ZXEpOwotICAgIH0KLQotICAgIGdfZnJlZShibGtkZXYtPnBhcmFtcyk7Ci0gICAgZ19mcmVlKGJs a2Rldi0+bW9kZSk7Ci0gICAgZ19mcmVlKGJsa2Rldi0+dHlwZSk7Ci0gICAgZ19mcmVlKGJsa2Rl di0+ZGV2KTsKLSAgICBnX2ZyZWUoYmxrZGV2LT5kZXZ0eXBlKTsKLSAgICBxZW11X2JoX2RlbGV0 ZShibGtkZXYtPmJoKTsKLSAgICBpb3RocmVhZF9kZXN0cm95KGJsa2Rldi0+aW90aHJlYWQpOwot ICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBibGtfZXZlbnQoc3RydWN0IFhlbkxlZ2Fj eURldmljZSAqeGVuZGV2KQotewotICAgIHN0cnVjdCBYZW5CbGtEZXYgKmJsa2RldiA9IGNvbnRh aW5lcl9vZih4ZW5kZXYsIHN0cnVjdCBYZW5CbGtEZXYsIHhlbmRldik7Ci0KLSAgICBxZW11X2Jo X3NjaGVkdWxlKGJsa2Rldi0+YmgpOwotfQotCi1zdHJ1Y3QgWGVuRGV2T3BzIHhlbl9ibGtkZXZf b3BzID0gewotICAgIC5mbGFncyAgICAgID0gREVWT1BTX0ZMQUdfTkVFRF9HTlRERVYsCi0gICAg LnNpemUgICAgICAgPSBzaXplb2Yoc3RydWN0IFhlbkJsa0RldiksCi0gICAgLmFsbG9jICAgICAg PSBibGtfYWxsb2MsCi0gICAgLmluaXQgICAgICAgPSBibGtfaW5pdCwKLSAgICAuaW5pdGlhbGlz ZSA9IGJsa19jb25uZWN0LAotICAgIC5kaXNjb25uZWN0ID0gYmxrX2Rpc2Nvbm5lY3QsCi0gICAg LmV2ZW50ICAgICAgPSBibGtfZXZlbnQsCi0gICAgLmZyZWUgICAgICAgPSBibGtfZnJlZSwKLX07 Ci0tIApBbnRob255IFBFUkFSRAoKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fClhlbi1kZXZlbCBtYWlsaW5nIGxpc3QKWGVuLWRldmVsQGxpc3RzLnhlbnBy b2plY3Qub3JnCmh0dHBzOi8vbGlzdHMueGVucHJvamVjdC5vcmcvbWFpbG1hbi9saXN0aW5mby94 ZW4tZGV2ZWw=