From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:49081) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fD80U-0005IQ-Hd for qemu-devel@nongnu.org; Mon, 30 Apr 2018 08:34:16 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fD80S-0000kj-UJ for qemu-devel@nongnu.org; Mon, 30 Apr 2018 08:34:14 -0400 From: Paul Durrant Date: Mon, 30 Apr 2018 13:01:36 +0100 Message-ID: <1525089699-13411-2-git-send-email-paul.durrant@citrix.com> In-Reply-To: <1525089699-13411-1-git-send-email-paul.durrant@citrix.com> References: <1525089699-13411-1-git-send-email-paul.durrant@citrix.com> MIME-Version: 1.0 Content-Type: text/plain Subject: [Qemu-devel] [PATCH 1/4] block/xen_disk: remove persistent grant code List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: xen-devel@lists.xenproject.org, qemu-block@nongnu.org, qemu-devel@nongnu.org Cc: Paul Durrant , Stefano Stabellini , Anthony Perard , Kevin Wolf , Max Reitz The grant copy operation was added to libxengnttab in Xen 4.8.0. If grant copy is available then persistent grants will not be used. The xen_disk source can be siginificantly simplified by removing this now redundant code. Signed-off-by: Paul Durrant --- Cc: Stefano Stabellini Cc: Anthony Perard Cc: Kevin Wolf Cc: Max Reitz --- hw/block/xen_disk.c | 237 +++++----------------------------------------------- 1 file changed, 21 insertions(+), 216 deletions(-) diff --git a/hw/block/xen_disk.c b/hw/block/xen_disk.c index f74fcd4..b33611a 100644 --- a/hw/block/xen_disk.c +++ b/hw/block/xen_disk.c @@ -43,20 +43,6 @@ static int batch_maps = 0; #define BLOCK_SIZE 512 #define IOCB_COUNT (BLKIF_MAX_SEGMENTS_PER_REQUEST + 2) -struct PersistentGrant { - void *page; - struct XenBlkDev *blkdev; -}; - -typedef struct PersistentGrant PersistentGrant; - -struct PersistentRegion { - void *addr; - int num; -}; - -typedef struct PersistentRegion PersistentRegion; - struct ioreq { blkif_request_t req; int16_t status; @@ -73,7 +59,6 @@ struct ioreq { int prot; void *page[BLKIF_MAX_SEGMENTS_PER_REQUEST]; void *pages; - int num_unmap; /* aio status */ int aio_inflight; @@ -115,13 +100,7 @@ struct XenBlkDev { int requests_finished; unsigned int max_requests; - /* Persistent grants extension */ gboolean feature_discard; - gboolean feature_persistent; - GTree *persistent_gnts; - GSList *persistent_regions; - unsigned int persistent_gnt_count; - unsigned int max_grants; /* qemu block driver */ DriveInfo *dinfo; @@ -158,46 +137,6 @@ static void ioreq_reset(struct ioreq *ioreq) qemu_iovec_reset(&ioreq->v); } -static gint int_cmp(gconstpointer a, gconstpointer b, gpointer user_data) -{ - uint ua = GPOINTER_TO_UINT(a); - uint ub = GPOINTER_TO_UINT(b); - return (ua > ub) - (ua < ub); -} - -static void destroy_grant(gpointer pgnt) -{ - PersistentGrant *grant = pgnt; - xengnttab_handle *gnt = grant->blkdev->xendev.gnttabdev; - - if (xengnttab_unmap(gnt, grant->page, 1) != 0) { - xen_pv_printf(&grant->blkdev->xendev, 0, - "xengnttab_unmap failed: %s\n", - strerror(errno)); - } - grant->blkdev->persistent_gnt_count--; - xen_pv_printf(&grant->blkdev->xendev, 3, - "unmapped grant %p\n", grant->page); - g_free(grant); -} - -static void remove_persistent_region(gpointer data, gpointer dev) -{ - PersistentRegion *region = data; - struct XenBlkDev *blkdev = dev; - xengnttab_handle *gnt = blkdev->xendev.gnttabdev; - - if (xengnttab_unmap(gnt, region->addr, region->num) != 0) { - xen_pv_printf(&blkdev->xendev, 0, - "xengnttab_unmap region %p failed: %s\n", - region->addr, strerror(errno)); - } - xen_pv_printf(&blkdev->xendev, 3, - "unmapped grant region %p with %d pages\n", - region->addr, region->num); - g_free(region); -} - static struct ioreq *ioreq_start(struct XenBlkDev *blkdev) { struct ioreq *ioreq = NULL; @@ -327,22 +266,22 @@ static void ioreq_unmap(struct ioreq *ioreq) xengnttab_handle *gnt = ioreq->blkdev->xendev.gnttabdev; int i; - if (ioreq->num_unmap == 0 || ioreq->mapped == 0) { + if (ioreq->v.niov == 0 || ioreq->mapped == 0) { return; } if (batch_maps) { if (!ioreq->pages) { return; } - if (xengnttab_unmap(gnt, ioreq->pages, ioreq->num_unmap) != 0) { + if (xengnttab_unmap(gnt, ioreq->pages, ioreq->v.niov) != 0) { xen_pv_printf(&ioreq->blkdev->xendev, 0, "xengnttab_unmap failed: %s\n", strerror(errno)); } - ioreq->blkdev->cnt_map -= ioreq->num_unmap; + ioreq->blkdev->cnt_map -= ioreq->v.niov; ioreq->pages = NULL; } else { - for (i = 0; i < ioreq->num_unmap; i++) { + for (i = 0; i < ioreq->v.niov; i++) { if (!ioreq->page[i]) { continue; } @@ -361,138 +300,44 @@ static void ioreq_unmap(struct ioreq *ioreq) static int ioreq_map(struct ioreq *ioreq) { xengnttab_handle *gnt = ioreq->blkdev->xendev.gnttabdev; - uint32_t domids[BLKIF_MAX_SEGMENTS_PER_REQUEST]; - uint32_t refs[BLKIF_MAX_SEGMENTS_PER_REQUEST]; - void *page[BLKIF_MAX_SEGMENTS_PER_REQUEST]; - int i, j, new_maps = 0; - PersistentGrant *grant; - PersistentRegion *region; - /* domids and refs variables will contain the information necessary - * to map the grants that are needed to fulfill this request. - * - * After mapping the needed grants, the page array will contain the - * memory address of each granted page in the order specified in ioreq - * (disregarding if it's a persistent grant or not). - */ + int i; if (ioreq->v.niov == 0 || ioreq->mapped == 1) { return 0; } - if (ioreq->blkdev->feature_persistent) { - for (i = 0; i < ioreq->v.niov; i++) { - grant = g_tree_lookup(ioreq->blkdev->persistent_gnts, - GUINT_TO_POINTER(ioreq->refs[i])); - - if (grant != NULL) { - page[i] = grant->page; - xen_pv_printf(&ioreq->blkdev->xendev, 3, - "using persistent-grant %" PRIu32 "\n", - ioreq->refs[i]); - } else { - /* Add the grant to the list of grants that - * should be mapped - */ - domids[new_maps] = ioreq->domids[i]; - refs[new_maps] = ioreq->refs[i]; - page[i] = NULL; - new_maps++; - } - } - /* Set the protection to RW, since grants may be reused later - * with a different protection than the one needed for this request - */ - ioreq->prot = PROT_WRITE | PROT_READ; - } else { - /* All grants in the request should be mapped */ - memcpy(refs, ioreq->refs, sizeof(refs)); - memcpy(domids, ioreq->domids, sizeof(domids)); - memset(page, 0, sizeof(page)); - new_maps = ioreq->v.niov; - } - - if (batch_maps && new_maps) { + if (batch_maps) { ioreq->pages = xengnttab_map_grant_refs - (gnt, new_maps, domids, refs, ioreq->prot); + (gnt, ioreq->v.niov, ioreq->domids, ioreq->refs, ioreq->prot); if (ioreq->pages == NULL) { xen_pv_printf(&ioreq->blkdev->xendev, 0, "can't map %d grant refs (%s, %d maps)\n", - new_maps, strerror(errno), ioreq->blkdev->cnt_map); + ioreq->v.niov, strerror(errno), + ioreq->blkdev->cnt_map); return -1; } - for (i = 0, j = 0; i < ioreq->v.niov; i++) { - if (page[i] == NULL) { - page[i] = ioreq->pages + (j++) * XC_PAGE_SIZE; - } + for (i = 0; i < ioreq->v.niov; i++) { + ioreq->v.iov[i].iov_base = ioreq->pages + i * XC_PAGE_SIZE + + (uintptr_t)ioreq->v.iov[i].iov_base; } - ioreq->blkdev->cnt_map += new_maps; - } else if (new_maps) { - for (i = 0; i < new_maps; i++) { + ioreq->blkdev->cnt_map += ioreq->v.niov; + } else { + for (i = 0; i < ioreq->v.niov; i++) { ioreq->page[i] = xengnttab_map_grant_ref - (gnt, domids[i], refs[i], ioreq->prot); + (gnt, ioreq->domids[i], ioreq->refs[i], ioreq->prot); if (ioreq->page[i] == NULL) { xen_pv_printf(&ioreq->blkdev->xendev, 0, "can't map grant ref %d (%s, %d maps)\n", - refs[i], strerror(errno), ioreq->blkdev->cnt_map); + ioreq->refs[i], strerror(errno), + ioreq->blkdev->cnt_map); ioreq->mapped = 1; ioreq_unmap(ioreq); return -1; } - ioreq->blkdev->cnt_map++; - } - for (i = 0, j = 0; i < ioreq->v.niov; i++) { - if (page[i] == NULL) { - page[i] = ioreq->page[j++]; - } + ioreq->v.iov[i].iov_base = ioreq->page[i] + + (uintptr_t)ioreq->v.iov[i].iov_base; } } - if (ioreq->blkdev->feature_persistent && new_maps != 0 && - (!batch_maps || (ioreq->blkdev->persistent_gnt_count + new_maps <= - ioreq->blkdev->max_grants))) { - /* - * If we are using persistent grants and batch mappings only - * add the new maps to the list of persistent grants if the whole - * area can be persistently mapped. - */ - if (batch_maps) { - region = g_malloc0(sizeof(*region)); - region->addr = ioreq->pages; - region->num = new_maps; - ioreq->blkdev->persistent_regions = g_slist_append( - ioreq->blkdev->persistent_regions, - region); - } - while ((ioreq->blkdev->persistent_gnt_count < ioreq->blkdev->max_grants) - && new_maps) { - /* Go through the list of newly mapped grants and add as many - * as possible to the list of persistently mapped grants. - * - * Since we start at the end of ioreq->page(s), we only need - * to decrease new_maps to prevent this granted pages from - * being unmapped in ioreq_unmap. - */ - grant = g_malloc0(sizeof(*grant)); - new_maps--; - if (batch_maps) { - grant->page = ioreq->pages + (new_maps) * XC_PAGE_SIZE; - } else { - grant->page = ioreq->page[new_maps]; - } - grant->blkdev = ioreq->blkdev; - xen_pv_printf(&ioreq->blkdev->xendev, 3, - "adding grant %" PRIu32 " page: %p\n", - refs[new_maps], grant->page); - g_tree_insert(ioreq->blkdev->persistent_gnts, - GUINT_TO_POINTER(refs[new_maps]), - grant); - ioreq->blkdev->persistent_gnt_count++; - } - assert(!batch_maps || new_maps == 0); - } - for (i = 0; i < ioreq->v.niov; i++) { - ioreq->v.iov[i].iov_base += (uintptr_t)page[i]; - } ioreq->mapped = 1; - ioreq->num_unmap = new_maps; return 0; } @@ -1039,8 +884,6 @@ static int blk_init(struct XenDevice *xendev) * blk_connect supplies sector-size and sectors */ xenstore_write_be_int(&blkdev->xendev, "feature-flush-cache", 1); - xenstore_write_be_int(&blkdev->xendev, "feature-persistent", - !xen_feature_grant_copy); xenstore_write_be_int(&blkdev->xendev, "info", info); xenstore_write_be_int(&blkdev->xendev, "max-ring-page-order", @@ -1079,7 +922,7 @@ out_error: static int blk_connect(struct XenDevice *xendev) { struct XenBlkDev *blkdev = container_of(xendev, struct XenBlkDev, xendev); - int pers, index, qflags; + int index, qflags; bool readonly = true; bool writethrough = true; int order, ring_ref; @@ -1202,11 +1045,6 @@ static int blk_connect(struct XenDevice *xendev) &blkdev->xendev.remote_port) == -1) { return -1; } - if (xenstore_read_fe_int(&blkdev->xendev, "feature-persistent", &pers)) { - blkdev->feature_persistent = FALSE; - } else { - blkdev->feature_persistent = !!pers; - } if (!blkdev->xendev.protocol) { blkdev->protocol = BLKIF_PROTOCOL_NATIVE; @@ -1301,19 +1139,6 @@ static int blk_connect(struct XenDevice *xendev) } } - if (blkdev->feature_persistent) { - /* Init persistent grants */ - blkdev->max_grants = blkdev->max_requests * - BLKIF_MAX_SEGMENTS_PER_REQUEST; - blkdev->persistent_gnts = g_tree_new_full((GCompareDataFunc)int_cmp, - NULL, NULL, - batch_maps ? - (GDestroyNotify)g_free : - (GDestroyNotify)destroy_grant); - blkdev->persistent_regions = NULL; - blkdev->persistent_gnt_count = 0; - } - blk_set_aio_context(blkdev->blk, blkdev->ctx); xen_be_bind_evtchn(&blkdev->xendev); @@ -1350,26 +1175,6 @@ static void blk_disconnect(struct XenDevice *xendev) blkdev->sring = NULL; } - /* - * Unmap persistent grants before switching to the closed state - * so the frontend can free them. - * - * In the !batch_maps case g_tree_destroy will take care of unmapping - * the grant, but in the batch_maps case we need to iterate over every - * region in persistent_regions and unmap it. - */ - if (blkdev->feature_persistent) { - g_tree_destroy(blkdev->persistent_gnts); - assert(batch_maps || blkdev->persistent_gnt_count == 0); - if (batch_maps) { - blkdev->persistent_gnt_count = 0; - g_slist_foreach(blkdev->persistent_regions, - (GFunc)remove_persistent_region, blkdev); - g_slist_free(blkdev->persistent_regions); - } - blkdev->feature_persistent = false; - } - if (blkdev->xendev.gnttabdev) { xengnttab_close(blkdev->xendev.gnttabdev); blkdev->xendev.gnttabdev = NULL; -- 2.1.4 From mboxrd@z Thu Jan 1 00:00:00 1970 From: Paul Durrant Subject: [PATCH 1/4] block/xen_disk: remove persistent grant code Date: Mon, 30 Apr 2018 13:01:36 +0100 Message-ID: <1525089699-13411-2-git-send-email-paul.durrant@citrix.com> References: <1525089699-13411-1-git-send-email-paul.durrant@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 1fD7V2-00041O-Rg for xen-devel@lists.xenproject.org; Mon, 30 Apr 2018 12:01:44 +0000 In-Reply-To: <1525089699-13411-1-git-send-email-paul.durrant@citrix.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" To: xen-devel@lists.xenproject.org, qemu-block@nongnu.org, qemu-devel@nongnu.org Cc: Anthony Perard , Kevin Wolf , Paul Durrant , Stefano Stabellini , Max Reitz List-Id: xen-devel@lists.xenproject.org VGhlIGdyYW50IGNvcHkgb3BlcmF0aW9uIHdhcyBhZGRlZCB0byBsaWJ4ZW5nbnR0YWIgaW4gWGVu IDQuOC4wLiBJZiBncmFudApjb3B5IGlzIGF2YWlsYWJsZSB0aGVuIHBlcnNpc3RlbnQgZ3JhbnRz IHdpbGwgbm90IGJlIHVzZWQuClRoZSB4ZW5fZGlzayBzb3VyY2UgY2FuIGJlIHNpZ2luaWZpY2Fu dGx5IHNpbXBsaWZpZWQgYnkgcmVtb3ZpbmcgdGhpcyBub3cKcmVkdW5kYW50IGNvZGUuCgpTaWdu ZWQtb2ZmLWJ5OiBQYXVsIER1cnJhbnQgPHBhdWwuZHVycmFudEBjaXRyaXguY29tPgotLS0KQ2M6 IFN0ZWZhbm8gU3RhYmVsbGluaSA8c3N0YWJlbGxpbmlAa2VybmVsLm9yZz4KQ2M6IEFudGhvbnkg UGVyYXJkIDxhbnRob255LnBlcmFyZEBjaXRyaXguY29tPgpDYzogS2V2aW4gV29sZiA8a3dvbGZA cmVkaGF0LmNvbT4KQ2M6IE1heCBSZWl0eiA8bXJlaXR6QHJlZGhhdC5jb20+Ci0tLQogaHcvYmxv Y2sveGVuX2Rpc2suYyB8IDIzNyArKysrKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tCiAxIGZpbGUgY2hhbmdlZCwgMjEgaW5zZXJ0aW9ucygrKSwgMjE2IGRl bGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL2h3L2Jsb2NrL3hlbl9kaXNrLmMgYi9ody9ibG9jay94 ZW5fZGlzay5jCmluZGV4IGY3NGZjZDQuLmIzMzYxMWEgMTAwNjQ0Ci0tLSBhL2h3L2Jsb2NrL3hl bl9kaXNrLmMKKysrIGIvaHcvYmxvY2sveGVuX2Rpc2suYwpAQCAtNDMsMjAgKzQzLDYgQEAgc3Rh dGljIGludCBiYXRjaF9tYXBzICAgPSAwOwogI2RlZmluZSBCTE9DS19TSVpFICA1MTIKICNkZWZp bmUgSU9DQl9DT1VOVCAgKEJMS0lGX01BWF9TRUdNRU5UU19QRVJfUkVRVUVTVCArIDIpCiAKLXN0 cnVjdCBQZXJzaXN0ZW50R3JhbnQgewotICAgIHZvaWQgKnBhZ2U7Ci0gICAgc3RydWN0IFhlbkJs a0RldiAqYmxrZGV2OwotfTsKLQotdHlwZWRlZiBzdHJ1Y3QgUGVyc2lzdGVudEdyYW50IFBlcnNp c3RlbnRHcmFudDsKLQotc3RydWN0IFBlcnNpc3RlbnRSZWdpb24gewotICAgIHZvaWQgKmFkZHI7 Ci0gICAgaW50IG51bTsKLX07Ci0KLXR5cGVkZWYgc3RydWN0IFBlcnNpc3RlbnRSZWdpb24gUGVy c2lzdGVudFJlZ2lvbjsKLQogc3RydWN0IGlvcmVxIHsKICAgICBibGtpZl9yZXF1ZXN0X3QgICAg IHJlcTsKICAgICBpbnQxNl90ICAgICAgICAgICAgIHN0YXR1czsKQEAgLTczLDcgKzU5LDYgQEAg c3RydWN0IGlvcmVxIHsKICAgICBpbnQgICAgICAgICAgICAgICAgIHByb3Q7CiAgICAgdm9pZCAg ICAgICAgICAgICAgICAqcGFnZVtCTEtJRl9NQVhfU0VHTUVOVFNfUEVSX1JFUVVFU1RdOwogICAg IHZvaWQgICAgICAgICAgICAgICAgKnBhZ2VzOwotICAgIGludCAgICAgICAgICAgICAgICAgbnVt X3VubWFwOwogCiAgICAgLyogYWlvIHN0YXR1cyAqLwogICAgIGludCAgICAgICAgICAgICAgICAg YWlvX2luZmxpZ2h0OwpAQCAtMTE1LDEzICsxMDAsNyBAQCBzdHJ1Y3QgWGVuQmxrRGV2IHsKICAg ICBpbnQgICAgICAgICAgICAgICAgIHJlcXVlc3RzX2ZpbmlzaGVkOwogICAgIHVuc2lnbmVkIGlu dCAgICAgICAgbWF4X3JlcXVlc3RzOwogCi0gICAgLyogUGVyc2lzdGVudCBncmFudHMgZXh0ZW5z aW9uICovCiAgICAgZ2Jvb2xlYW4gICAgICAgICAgICBmZWF0dXJlX2Rpc2NhcmQ7Ci0gICAgZ2Jv b2xlYW4gICAgICAgICAgICBmZWF0dXJlX3BlcnNpc3RlbnQ7Ci0gICAgR1RyZWUgICAgICAgICAg ICAgICAqcGVyc2lzdGVudF9nbnRzOwotICAgIEdTTGlzdCAgICAgICAgICAgICAgKnBlcnNpc3Rl bnRfcmVnaW9uczsKLSAgICB1bnNpZ25lZCBpbnQgICAgICAgIHBlcnNpc3RlbnRfZ250X2NvdW50 OwotICAgIHVuc2lnbmVkIGludCAgICAgICAgbWF4X2dyYW50czsKIAogICAgIC8qIHFlbXUgYmxv Y2sgZHJpdmVyICovCiAgICAgRHJpdmVJbmZvICAgICAgICAgICAqZGluZm87CkBAIC0xNTgsNDYg KzEzNyw2IEBAIHN0YXRpYyB2b2lkIGlvcmVxX3Jlc2V0KHN0cnVjdCBpb3JlcSAqaW9yZXEpCiAg ICAgcWVtdV9pb3ZlY19yZXNldCgmaW9yZXEtPnYpOwogfQogCi1zdGF0aWMgZ2ludCBpbnRfY21w KGdjb25zdHBvaW50ZXIgYSwgZ2NvbnN0cG9pbnRlciBiLCBncG9pbnRlciB1c2VyX2RhdGEpCi17 Ci0gICAgdWludCB1YSA9IEdQT0lOVEVSX1RPX1VJTlQoYSk7Ci0gICAgdWludCB1YiA9IEdQT0lO VEVSX1RPX1VJTlQoYik7Ci0gICAgcmV0dXJuICh1YSA+IHViKSAtICh1YSA8IHViKTsKLX0KLQot c3RhdGljIHZvaWQgZGVzdHJveV9ncmFudChncG9pbnRlciBwZ250KQotewotICAgIFBlcnNpc3Rl bnRHcmFudCAqZ3JhbnQgPSBwZ250OwotICAgIHhlbmdudHRhYl9oYW5kbGUgKmdudCA9IGdyYW50 LT5ibGtkZXYtPnhlbmRldi5nbnR0YWJkZXY7Ci0KLSAgICBpZiAoeGVuZ250dGFiX3VubWFwKGdu dCwgZ3JhbnQtPnBhZ2UsIDEpICE9IDApIHsKLSAgICAgICAgeGVuX3B2X3ByaW50ZigmZ3JhbnQt PmJsa2Rldi0+eGVuZGV2LCAwLAotICAgICAgICAgICAgICAgICAgICAgICJ4ZW5nbnR0YWJfdW5t YXAgZmFpbGVkOiAlc1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcihlcnJubykp OwotICAgIH0KLSAgICBncmFudC0+YmxrZGV2LT5wZXJzaXN0ZW50X2dudF9jb3VudC0tOwotICAg IHhlbl9wdl9wcmludGYoJmdyYW50LT5ibGtkZXYtPnhlbmRldiwgMywKLSAgICAgICAgICAgICAg ICAgICJ1bm1hcHBlZCBncmFudCAlcFxuIiwgZ3JhbnQtPnBhZ2UpOwotICAgIGdfZnJlZShncmFu dCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHJlbW92ZV9wZXJzaXN0ZW50X3JlZ2lvbihncG9pbnRlciBk YXRhLCBncG9pbnRlciBkZXYpCi17Ci0gICAgUGVyc2lzdGVudFJlZ2lvbiAqcmVnaW9uID0gZGF0 YTsKLSAgICBzdHJ1Y3QgWGVuQmxrRGV2ICpibGtkZXYgPSBkZXY7Ci0gICAgeGVuZ250dGFiX2hh bmRsZSAqZ250ID0gYmxrZGV2LT54ZW5kZXYuZ250dGFiZGV2OwotCi0gICAgaWYgKHhlbmdudHRh Yl91bm1hcChnbnQsIHJlZ2lvbi0+YWRkciwgcmVnaW9uLT5udW0pICE9IDApIHsKLSAgICAgICAg eGVuX3B2X3ByaW50ZigmYmxrZGV2LT54ZW5kZXYsIDAsCi0gICAgICAgICAgICAgICAgICAgICAg InhlbmdudHRhYl91bm1hcCByZWdpb24gJXAgZmFpbGVkOiAlc1xuIiwKLSAgICAgICAgICAgICAg ICAgICAgICByZWdpb24tPmFkZHIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgfQotICAgIHhlbl9w dl9wcmludGYoJmJsa2Rldi0+eGVuZGV2LCAzLAotICAgICAgICAgICAgICAgICAgInVubWFwcGVk IGdyYW50IHJlZ2lvbiAlcCB3aXRoICVkIHBhZ2VzXG4iLAotICAgICAgICAgICAgICAgICAgcmVn aW9uLT5hZGRyLCByZWdpb24tPm51bSk7Ci0gICAgZ19mcmVlKHJlZ2lvbik7Ci19Ci0KIHN0YXRp YyBzdHJ1Y3QgaW9yZXEgKmlvcmVxX3N0YXJ0KHN0cnVjdCBYZW5CbGtEZXYgKmJsa2RldikKIHsK ICAgICBzdHJ1Y3QgaW9yZXEgKmlvcmVxID0gTlVMTDsKQEAgLTMyNywyMiArMjY2LDIyIEBAIHN0 YXRpYyB2b2lkIGlvcmVxX3VubWFwKHN0cnVjdCBpb3JlcSAqaW9yZXEpCiAgICAgeGVuZ250dGFi X2hhbmRsZSAqZ250ID0gaW9yZXEtPmJsa2Rldi0+eGVuZGV2LmdudHRhYmRldjsKICAgICBpbnQg aTsKIAotICAgIGlmIChpb3JlcS0+bnVtX3VubWFwID09IDAgfHwgaW9yZXEtPm1hcHBlZCA9PSAw KSB7CisgICAgaWYgKGlvcmVxLT52Lm5pb3YgPT0gMCB8fCBpb3JlcS0+bWFwcGVkID09IDApIHsK ICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBpZiAoYmF0Y2hfbWFwcykgewogICAgICAgICBp ZiAoIWlvcmVxLT5wYWdlcykgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAg ICAgIGlmICh4ZW5nbnR0YWJfdW5tYXAoZ250LCBpb3JlcS0+cGFnZXMsIGlvcmVxLT5udW1fdW5t YXApICE9IDApIHsKKyAgICAgICAgaWYgKHhlbmdudHRhYl91bm1hcChnbnQsIGlvcmVxLT5wYWdl cywgaW9yZXEtPnYubmlvdikgIT0gMCkgewogICAgICAgICAgICAgeGVuX3B2X3ByaW50ZigmaW9y ZXEtPmJsa2Rldi0+eGVuZGV2LCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAieGVuZ250 dGFiX3VubWFwIGZhaWxlZDogJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVy cm9yKGVycm5vKSk7CiAgICAgICAgIH0KLSAgICAgICAgaW9yZXEtPmJsa2Rldi0+Y250X21hcCAt PSBpb3JlcS0+bnVtX3VubWFwOworICAgICAgICBpb3JlcS0+YmxrZGV2LT5jbnRfbWFwIC09IGlv cmVxLT52Lm5pb3Y7CiAgICAgICAgIGlvcmVxLT5wYWdlcyA9IE5VTEw7CiAgICAgfSBlbHNlIHsK LSAgICAgICAgZm9yIChpID0gMDsgaSA8IGlvcmVxLT5udW1fdW5tYXA7IGkrKykgeworICAgICAg ICBmb3IgKGkgPSAwOyBpIDwgaW9yZXEtPnYubmlvdjsgaSsrKSB7CiAgICAgICAgICAgICBpZiAo IWlvcmVxLT5wYWdlW2ldKSB7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAg ICB9CkBAIC0zNjEsMTM4ICszMDAsNDQgQEAgc3RhdGljIHZvaWQgaW9yZXFfdW5tYXAoc3RydWN0 IGlvcmVxICppb3JlcSkKIHN0YXRpYyBpbnQgaW9yZXFfbWFwKHN0cnVjdCBpb3JlcSAqaW9yZXEp CiB7CiAgICAgeGVuZ250dGFiX2hhbmRsZSAqZ250ID0gaW9yZXEtPmJsa2Rldi0+eGVuZGV2Lmdu dHRhYmRldjsKLSAgICB1aW50MzJfdCBkb21pZHNbQkxLSUZfTUFYX1NFR01FTlRTX1BFUl9SRVFV RVNUXTsKLSAgICB1aW50MzJfdCByZWZzW0JMS0lGX01BWF9TRUdNRU5UU19QRVJfUkVRVUVTVF07 Ci0gICAgdm9pZCAqcGFnZVtCTEtJRl9NQVhfU0VHTUVOVFNfUEVSX1JFUVVFU1RdOwotICAgIGlu dCBpLCBqLCBuZXdfbWFwcyA9IDA7Ci0gICAgUGVyc2lzdGVudEdyYW50ICpncmFudDsKLSAgICBQ ZXJzaXN0ZW50UmVnaW9uICpyZWdpb247Ci0gICAgLyogZG9taWRzIGFuZCByZWZzIHZhcmlhYmxl cyB3aWxsIGNvbnRhaW4gdGhlIGluZm9ybWF0aW9uIG5lY2Vzc2FyeQotICAgICAqIHRvIG1hcCB0 aGUgZ3JhbnRzIHRoYXQgYXJlIG5lZWRlZCB0byBmdWxmaWxsIHRoaXMgcmVxdWVzdC4KLSAgICAg KgotICAgICAqIEFmdGVyIG1hcHBpbmcgdGhlIG5lZWRlZCBncmFudHMsIHRoZSBwYWdlIGFycmF5 IHdpbGwgY29udGFpbiB0aGUKLSAgICAgKiBtZW1vcnkgYWRkcmVzcyBvZiBlYWNoIGdyYW50ZWQg cGFnZSBpbiB0aGUgb3JkZXIgc3BlY2lmaWVkIGluIGlvcmVxCi0gICAgICogKGRpc3JlZ2FyZGlu ZyBpZiBpdCdzIGEgcGVyc2lzdGVudCBncmFudCBvciBub3QpLgotICAgICAqLworICAgIGludCBp OwogCiAgICAgaWYgKGlvcmVxLT52Lm5pb3YgPT0gMCB8fCBpb3JlcS0+bWFwcGVkID09IDEpIHsK ICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQotICAgIGlmIChpb3JlcS0+YmxrZGV2LT5mZWF0dXJl X3BlcnNpc3RlbnQpIHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGlvcmVxLT52Lm5pb3Y7IGkr KykgewotICAgICAgICAgICAgZ3JhbnQgPSBnX3RyZWVfbG9va3VwKGlvcmVxLT5ibGtkZXYtPnBl cnNpc3RlbnRfZ250cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdVSU5U X1RPX1BPSU5URVIoaW9yZXEtPnJlZnNbaV0pKTsKLQotICAgICAgICAgICAgaWYgKGdyYW50ICE9 IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBwYWdlW2ldID0gZ3JhbnQtPnBhZ2U7Ci0gICAgICAg ICAgICAgICAgeGVuX3B2X3ByaW50ZigmaW9yZXEtPmJsa2Rldi0+eGVuZGV2LCAzLAotICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nIHBlcnNpc3RlbnQtZ3JhbnQgJSIgUFJJdTMy ICJcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3JlcS0+cmVmc1tpXSk7Ci0g ICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvKiBBZGQgdGhlIGdyYW50 IHRvIHRoZSBsaXN0IG9mIGdyYW50cyB0aGF0Ci0gICAgICAgICAgICAgICAgICAgICAqIHNob3Vs ZCBiZSBtYXBwZWQKLSAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAg IGRvbWlkc1tuZXdfbWFwc10gPSBpb3JlcS0+ZG9taWRzW2ldOwotICAgICAgICAgICAgICAgICAg ICByZWZzW25ld19tYXBzXSA9IGlvcmVxLT5yZWZzW2ldOwotICAgICAgICAgICAgICAgICAgICBw YWdlW2ldID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgbmV3X21hcHMrKzsKLSAgICAgICAg ICAgIH0KLSAgICAgICAgfQotICAgICAgICAvKiBTZXQgdGhlIHByb3RlY3Rpb24gdG8gUlcsIHNp bmNlIGdyYW50cyBtYXkgYmUgcmV1c2VkIGxhdGVyCi0gICAgICAgICAqIHdpdGggYSBkaWZmZXJl bnQgcHJvdGVjdGlvbiB0aGFuIHRoZSBvbmUgbmVlZGVkIGZvciB0aGlzIHJlcXVlc3QKLSAgICAg ICAgICovCi0gICAgICAgIGlvcmVxLT5wcm90ID0gUFJPVF9XUklURSB8IFBST1RfUkVBRDsKLSAg ICB9IGVsc2UgewotICAgICAgICAvKiBBbGwgZ3JhbnRzIGluIHRoZSByZXF1ZXN0IHNob3VsZCBi ZSBtYXBwZWQgKi8KLSAgICAgICAgbWVtY3B5KHJlZnMsIGlvcmVxLT5yZWZzLCBzaXplb2YocmVm cykpOwotICAgICAgICBtZW1jcHkoZG9taWRzLCBpb3JlcS0+ZG9taWRzLCBzaXplb2YoZG9taWRz KSk7Ci0gICAgICAgIG1lbXNldChwYWdlLCAwLCBzaXplb2YocGFnZSkpOwotICAgICAgICBuZXdf bWFwcyA9IGlvcmVxLT52Lm5pb3Y7Ci0gICAgfQotCi0gICAgaWYgKGJhdGNoX21hcHMgJiYgbmV3 X21hcHMpIHsKKyAgICBpZiAoYmF0Y2hfbWFwcykgewogICAgICAgICBpb3JlcS0+cGFnZXMgPSB4 ZW5nbnR0YWJfbWFwX2dyYW50X3JlZnMKLSAgICAgICAgICAgIChnbnQsIG5ld19tYXBzLCBkb21p ZHMsIHJlZnMsIGlvcmVxLT5wcm90KTsKKyAgICAgICAgICAgIChnbnQsIGlvcmVxLT52Lm5pb3Ys IGlvcmVxLT5kb21pZHMsIGlvcmVxLT5yZWZzLCBpb3JlcS0+cHJvdCk7CiAgICAgICAgIGlmIChp b3JlcS0+cGFnZXMgPT0gTlVMTCkgewogICAgICAgICAgICAgeGVuX3B2X3ByaW50ZigmaW9yZXEt PmJsa2Rldi0+eGVuZGV2LCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiY2FuJ3QgbWFw ICVkIGdyYW50IHJlZnMgKCVzLCAlZCBtYXBzKVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAg ICAgbmV3X21hcHMsIHN0cmVycm9yKGVycm5vKSwgaW9yZXEtPmJsa2Rldi0+Y250X21hcCk7Cisg ICAgICAgICAgICAgICAgICAgICAgICAgIGlvcmVxLT52Lm5pb3YsIHN0cmVycm9yKGVycm5vKSwK KyAgICAgICAgICAgICAgICAgICAgICAgICAgaW9yZXEtPmJsa2Rldi0+Y250X21hcCk7CiAgICAg ICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KLSAgICAgICAgZm9yIChpID0gMCwgaiA9IDA7 IGkgPCBpb3JlcS0+di5uaW92OyBpKyspIHsKLSAgICAgICAgICAgIGlmIChwYWdlW2ldID09IE5V TEwpIHsKLSAgICAgICAgICAgICAgICBwYWdlW2ldID0gaW9yZXEtPnBhZ2VzICsgKGorKykgKiBY Q19QQUdFX1NJWkU7Ci0gICAgICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBpb3Jl cS0+di5uaW92OyBpKyspIHsKKyAgICAgICAgICAgIGlvcmVxLT52LmlvdltpXS5pb3ZfYmFzZSA9 IGlvcmVxLT5wYWdlcyArIGkgKiBYQ19QQUdFX1NJWkUgKworICAgICAgICAgICAgICAgICh1aW50 cHRyX3QpaW9yZXEtPnYuaW92W2ldLmlvdl9iYXNlOwogICAgICAgICB9Ci0gICAgICAgIGlvcmVx LT5ibGtkZXYtPmNudF9tYXAgKz0gbmV3X21hcHM7Ci0gICAgfSBlbHNlIGlmIChuZXdfbWFwcykg IHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG5ld19tYXBzOyBpKyspIHsKKyAgICAgICAgaW9y ZXEtPmJsa2Rldi0+Y250X21hcCArPSBpb3JlcS0+di5uaW92OworICAgIH0gZWxzZSAgeworICAg ICAgICBmb3IgKGkgPSAwOyBpIDwgaW9yZXEtPnYubmlvdjsgaSsrKSB7CiAgICAgICAgICAgICBp b3JlcS0+cGFnZVtpXSA9IHhlbmdudHRhYl9tYXBfZ3JhbnRfcmVmCi0gICAgICAgICAgICAgICAg KGdudCwgZG9taWRzW2ldLCByZWZzW2ldLCBpb3JlcS0+cHJvdCk7CisgICAgICAgICAgICAgICAg KGdudCwgaW9yZXEtPmRvbWlkc1tpXSwgaW9yZXEtPnJlZnNbaV0sIGlvcmVxLT5wcm90KTsKICAg ICAgICAgICAgIGlmIChpb3JlcS0+cGFnZVtpXSA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAg eGVuX3B2X3ByaW50ZigmaW9yZXEtPmJsa2Rldi0+eGVuZGV2LCAwLAogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgImNhbid0IG1hcCBncmFudCByZWYgJWQgKCVzLCAlZCBtYXBzKVxuIiwK LSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZnNbaV0sIHN0cmVycm9yKGVycm5vKSwg aW9yZXEtPmJsa2Rldi0+Y250X21hcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBp b3JlcS0+cmVmc1tpXSwgc3RyZXJyb3IoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgaW9yZXEtPmJsa2Rldi0+Y250X21hcCk7CiAgICAgICAgICAgICAgICAgaW9yZXEtPm1h cHBlZCA9IDE7CiAgICAgICAgICAgICAgICAgaW9yZXFfdW5tYXAoaW9yZXEpOwogICAgICAgICAg ICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlvcmVxLT5ibGtk ZXYtPmNudF9tYXArKzsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGkgPSAwLCBqID0gMDsgaSA8 IGlvcmVxLT52Lm5pb3Y7IGkrKykgewotICAgICAgICAgICAgaWYgKHBhZ2VbaV0gPT0gTlVMTCkg ewotICAgICAgICAgICAgICAgIHBhZ2VbaV0gPSBpb3JlcS0+cGFnZVtqKytdOwotICAgICAgICAg ICAgfQorICAgICAgICAgICAgaW9yZXEtPnYuaW92W2ldLmlvdl9iYXNlID0gaW9yZXEtPnBhZ2Vb aV0gKworICAgICAgICAgICAgICAgICh1aW50cHRyX3QpaW9yZXEtPnYuaW92W2ldLmlvdl9iYXNl OwogICAgICAgICB9CiAgICAgfQotICAgIGlmIChpb3JlcS0+YmxrZGV2LT5mZWF0dXJlX3BlcnNp c3RlbnQgJiYgbmV3X21hcHMgIT0gMCAmJgotICAgICAgICAoIWJhdGNoX21hcHMgfHwgKGlvcmVx LT5ibGtkZXYtPnBlcnNpc3RlbnRfZ250X2NvdW50ICsgbmV3X21hcHMgPD0KLSAgICAgICAgaW9y ZXEtPmJsa2Rldi0+bWF4X2dyYW50cykpKSB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIElmIHdl IGFyZSB1c2luZyBwZXJzaXN0ZW50IGdyYW50cyBhbmQgYmF0Y2ggbWFwcGluZ3Mgb25seQotICAg ICAgICAgKiBhZGQgdGhlIG5ldyBtYXBzIHRvIHRoZSBsaXN0IG9mIHBlcnNpc3RlbnQgZ3JhbnRz IGlmIHRoZSB3aG9sZQotICAgICAgICAgKiBhcmVhIGNhbiBiZSBwZXJzaXN0ZW50bHkgbWFwcGVk LgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKGJhdGNoX21hcHMpIHsKLSAgICAgICAgICAgIHJl Z2lvbiA9IGdfbWFsbG9jMChzaXplb2YoKnJlZ2lvbikpOwotICAgICAgICAgICAgcmVnaW9uLT5h ZGRyID0gaW9yZXEtPnBhZ2VzOwotICAgICAgICAgICAgcmVnaW9uLT5udW0gPSBuZXdfbWFwczsK LSAgICAgICAgICAgIGlvcmVxLT5ibGtkZXYtPnBlcnNpc3RlbnRfcmVnaW9ucyA9IGdfc2xpc3Rf YXBwZW5kKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3Jl cS0+YmxrZGV2LT5wZXJzaXN0ZW50X3JlZ2lvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHJlZ2lvbik7Ci0gICAgICAgIH0KLSAgICAgICAgd2hpbGUgKChp b3JlcS0+YmxrZGV2LT5wZXJzaXN0ZW50X2dudF9jb3VudCA8IGlvcmVxLT5ibGtkZXYtPm1heF9n cmFudHMpCi0gICAgICAgICAgICAgICYmIG5ld19tYXBzKSB7Ci0gICAgICAgICAgICAvKiBHbyB0 aHJvdWdoIHRoZSBsaXN0IG9mIG5ld2x5IG1hcHBlZCBncmFudHMgYW5kIGFkZCBhcyBtYW55Ci0g ICAgICAgICAgICAgKiBhcyBwb3NzaWJsZSB0byB0aGUgbGlzdCBvZiBwZXJzaXN0ZW50bHkgbWFw cGVkIGdyYW50cy4KLSAgICAgICAgICAgICAqCi0gICAgICAgICAgICAgKiBTaW5jZSB3ZSBzdGFy dCBhdCB0aGUgZW5kIG9mIGlvcmVxLT5wYWdlKHMpLCB3ZSBvbmx5IG5lZWQKLSAgICAgICAgICAg ICAqIHRvIGRlY3JlYXNlIG5ld19tYXBzIHRvIHByZXZlbnQgdGhpcyBncmFudGVkIHBhZ2VzIGZy b20KLSAgICAgICAgICAgICAqIGJlaW5nIHVubWFwcGVkIGluIGlvcmVxX3VubWFwLgotICAgICAg ICAgICAgICovCi0gICAgICAgICAgICBncmFudCA9IGdfbWFsbG9jMChzaXplb2YoKmdyYW50KSk7 Ci0gICAgICAgICAgICBuZXdfbWFwcy0tOwotICAgICAgICAgICAgaWYgKGJhdGNoX21hcHMpIHsK LSAgICAgICAgICAgICAgICBncmFudC0+cGFnZSA9IGlvcmVxLT5wYWdlcyArIChuZXdfbWFwcykg KiBYQ19QQUdFX1NJWkU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGdy YW50LT5wYWdlID0gaW9yZXEtPnBhZ2VbbmV3X21hcHNdOwotICAgICAgICAgICAgfQotICAgICAg ICAgICAgZ3JhbnQtPmJsa2RldiA9IGlvcmVxLT5ibGtkZXY7Ci0gICAgICAgICAgICB4ZW5fcHZf cHJpbnRmKCZpb3JlcS0+YmxrZGV2LT54ZW5kZXYsIDMsCi0gICAgICAgICAgICAgICAgICAgICAg ICAgICJhZGRpbmcgZ3JhbnQgJSIgUFJJdTMyICIgcGFnZTogJXBcbiIsCi0gICAgICAgICAgICAg ICAgICAgICAgICAgIHJlZnNbbmV3X21hcHNdLCBncmFudC0+cGFnZSk7Ci0gICAgICAgICAgICBn X3RyZWVfaW5zZXJ0KGlvcmVxLT5ibGtkZXYtPnBlcnNpc3RlbnRfZ250cywKLSAgICAgICAgICAg ICAgICAgICAgICAgICAgR1VJTlRfVE9fUE9JTlRFUihyZWZzW25ld19tYXBzXSksCi0gICAgICAg ICAgICAgICAgICAgICAgICAgIGdyYW50KTsKLSAgICAgICAgICAgIGlvcmVxLT5ibGtkZXYtPnBl cnNpc3RlbnRfZ250X2NvdW50Kys7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0KCFiYXRjaF9t YXBzIHx8IG5ld19tYXBzID09IDApOwotICAgIH0KLSAgICBmb3IgKGkgPSAwOyBpIDwgaW9yZXEt PnYubmlvdjsgaSsrKSB7Ci0gICAgICAgIGlvcmVxLT52LmlvdltpXS5pb3ZfYmFzZSArPSAodWlu dHB0cl90KXBhZ2VbaV07Ci0gICAgfQogICAgIGlvcmVxLT5tYXBwZWQgPSAxOwotICAgIGlvcmVx LT5udW1fdW5tYXAgPSBuZXdfbWFwczsKICAgICByZXR1cm4gMDsKIH0KIApAQCAtMTAzOSw4ICs4 ODQsNiBAQCBzdGF0aWMgaW50IGJsa19pbml0KHN0cnVjdCBYZW5EZXZpY2UgKnhlbmRldikKICAg ICAgKiBibGtfY29ubmVjdCBzdXBwbGllcyBzZWN0b3Itc2l6ZSBhbmQgc2VjdG9ycwogICAgICAq LwogICAgIHhlbnN0b3JlX3dyaXRlX2JlX2ludCgmYmxrZGV2LT54ZW5kZXYsICJmZWF0dXJlLWZs dXNoLWNhY2hlIiwgMSk7Ci0gICAgeGVuc3RvcmVfd3JpdGVfYmVfaW50KCZibGtkZXYtPnhlbmRl diwgImZlYXR1cmUtcGVyc2lzdGVudCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICF4ZW5f ZmVhdHVyZV9ncmFudF9jb3B5KTsKICAgICB4ZW5zdG9yZV93cml0ZV9iZV9pbnQoJmJsa2Rldi0+ eGVuZGV2LCAiaW5mbyIsIGluZm8pOwogCiAgICAgeGVuc3RvcmVfd3JpdGVfYmVfaW50KCZibGtk ZXYtPnhlbmRldiwgIm1heC1yaW5nLXBhZ2Utb3JkZXIiLApAQCAtMTA3OSw3ICs5MjIsNyBAQCBv dXRfZXJyb3I6CiBzdGF0aWMgaW50IGJsa19jb25uZWN0KHN0cnVjdCBYZW5EZXZpY2UgKnhlbmRl dikKIHsKICAgICBzdHJ1Y3QgWGVuQmxrRGV2ICpibGtkZXYgPSBjb250YWluZXJfb2YoeGVuZGV2 LCBzdHJ1Y3QgWGVuQmxrRGV2LCB4ZW5kZXYpOwotICAgIGludCBwZXJzLCBpbmRleCwgcWZsYWdz OworICAgIGludCBpbmRleCwgcWZsYWdzOwogICAgIGJvb2wgcmVhZG9ubHkgPSB0cnVlOwogICAg IGJvb2wgd3JpdGV0aHJvdWdoID0gdHJ1ZTsKICAgICBpbnQgb3JkZXIsIHJpbmdfcmVmOwpAQCAt MTIwMiwxMSArMTA0NSw2IEBAIHN0YXRpYyBpbnQgYmxrX2Nvbm5lY3Qoc3RydWN0IFhlbkRldmlj ZSAqeGVuZGV2KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmxrZGV2LT54ZW5kZXYu cmVtb3RlX3BvcnQpID09IC0xKSB7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9Ci0gICAgaWYg KHhlbnN0b3JlX3JlYWRfZmVfaW50KCZibGtkZXYtPnhlbmRldiwgImZlYXR1cmUtcGVyc2lzdGVu dCIsICZwZXJzKSkgewotICAgICAgICBibGtkZXYtPmZlYXR1cmVfcGVyc2lzdGVudCA9IEZBTFNF OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGJsa2Rldi0+ZmVhdHVyZV9wZXJzaXN0ZW50ID0gISFw ZXJzOwotICAgIH0KIAogICAgIGlmICghYmxrZGV2LT54ZW5kZXYucHJvdG9jb2wpIHsKICAgICAg ICAgYmxrZGV2LT5wcm90b2NvbCA9IEJMS0lGX1BST1RPQ09MX05BVElWRTsKQEAgLTEzMDEsMTkg KzExMzksNiBAQCBzdGF0aWMgaW50IGJsa19jb25uZWN0KHN0cnVjdCBYZW5EZXZpY2UgKnhlbmRl dikKICAgICB9CiAgICAgfQogCi0gICAgaWYgKGJsa2Rldi0+ZmVhdHVyZV9wZXJzaXN0ZW50KSB7 Ci0gICAgICAgIC8qIEluaXQgcGVyc2lzdGVudCBncmFudHMgKi8KLSAgICAgICAgYmxrZGV2LT5t YXhfZ3JhbnRzID0gYmxrZGV2LT5tYXhfcmVxdWVzdHMgKgotICAgICAgICAgICAgQkxLSUZfTUFY X1NFR01FTlRTX1BFUl9SRVFVRVNUOwotICAgICAgICBibGtkZXYtPnBlcnNpc3RlbnRfZ250cyA9 IGdfdHJlZV9uZXdfZnVsbCgoR0NvbXBhcmVEYXRhRnVuYylpbnRfY21wLAotICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwKLSAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhdGNoX21hcHMgPwotICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEdEZXN0cm95Tm90aWZ5KWdfZnJl ZSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoR0Rlc3Ry b3lOb3RpZnkpZGVzdHJveV9ncmFudCk7Ci0gICAgICAgIGJsa2Rldi0+cGVyc2lzdGVudF9yZWdp b25zID0gTlVMTDsKLSAgICAgICAgYmxrZGV2LT5wZXJzaXN0ZW50X2dudF9jb3VudCA9IDA7Ci0g ICAgfQotCiAgICAgYmxrX3NldF9haW9fY29udGV4dChibGtkZXYtPmJsaywgYmxrZGV2LT5jdHgp OwogCiAgICAgeGVuX2JlX2JpbmRfZXZ0Y2huKCZibGtkZXYtPnhlbmRldik7CkBAIC0xMzUwLDI2 ICsxMTc1LDYgQEAgc3RhdGljIHZvaWQgYmxrX2Rpc2Nvbm5lY3Qoc3RydWN0IFhlbkRldmljZSAq eGVuZGV2KQogICAgICAgICBibGtkZXYtPnNyaW5nID0gTlVMTDsKICAgICB9CiAKLSAgICAvKgot ICAgICAqIFVubWFwIHBlcnNpc3RlbnQgZ3JhbnRzIGJlZm9yZSBzd2l0Y2hpbmcgdG8gdGhlIGNs b3NlZCBzdGF0ZQotICAgICAqIHNvIHRoZSBmcm9udGVuZCBjYW4gZnJlZSB0aGVtLgotICAgICAq Ci0gICAgICogSW4gdGhlICFiYXRjaF9tYXBzIGNhc2UgZ190cmVlX2Rlc3Ryb3kgd2lsbCB0YWtl IGNhcmUgb2YgdW5tYXBwaW5nCi0gICAgICogdGhlIGdyYW50LCBidXQgaW4gdGhlIGJhdGNoX21h cHMgY2FzZSB3ZSBuZWVkIHRvIGl0ZXJhdGUgb3ZlciBldmVyeQotICAgICAqIHJlZ2lvbiBpbiBw ZXJzaXN0ZW50X3JlZ2lvbnMgYW5kIHVubWFwIGl0LgotICAgICAqLwotICAgIGlmIChibGtkZXYt PmZlYXR1cmVfcGVyc2lzdGVudCkgewotICAgICAgICBnX3RyZWVfZGVzdHJveShibGtkZXYtPnBl cnNpc3RlbnRfZ250cyk7Ci0gICAgICAgIGFzc2VydChiYXRjaF9tYXBzIHx8IGJsa2Rldi0+cGVy c2lzdGVudF9nbnRfY291bnQgPT0gMCk7Ci0gICAgICAgIGlmIChiYXRjaF9tYXBzKSB7Ci0gICAg ICAgICAgICBibGtkZXYtPnBlcnNpc3RlbnRfZ250X2NvdW50ID0gMDsKLSAgICAgICAgICAgIGdf c2xpc3RfZm9yZWFjaChibGtkZXYtPnBlcnNpc3RlbnRfcmVnaW9ucywKLSAgICAgICAgICAgICAg ICAgICAgICAgICAgICAoR0Z1bmMpcmVtb3ZlX3BlcnNpc3RlbnRfcmVnaW9uLCBibGtkZXYpOwot ICAgICAgICAgICAgZ19zbGlzdF9mcmVlKGJsa2Rldi0+cGVyc2lzdGVudF9yZWdpb25zKTsKLSAg ICAgICAgfQotICAgICAgICBibGtkZXYtPmZlYXR1cmVfcGVyc2lzdGVudCA9IGZhbHNlOwotICAg IH0KLQogICAgIGlmIChibGtkZXYtPnhlbmRldi5nbnR0YWJkZXYpIHsKICAgICAgICAgeGVuZ250 dGFiX2Nsb3NlKGJsa2Rldi0+eGVuZGV2LmdudHRhYmRldik7CiAgICAgICAgIGJsa2Rldi0+eGVu ZGV2LmdudHRhYmRldiA9IE5VTEw7Ci0tIAoyLjEuNAoKCl9fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fClhlbi1kZXZlbCBtYWlsaW5nIGxpc3QKWGVuLWRldmVs QGxpc3RzLnhlbnByb2plY3Qub3JnCmh0dHBzOi8vbGlzdHMueGVucHJvamVjdC5vcmcvbWFpbG1h bi9saXN0aW5mby94ZW4tZGV2ZWw=