From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S966264AbeE2SWf (ORCPT ); Tue, 29 May 2018 14:22:35 -0400 Received: from mail-lf0-f66.google.com ([209.85.215.66]:43190 "EHLO mail-lf0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S965971AbeE2SWa (ORCPT ); Tue, 29 May 2018 14:22:30 -0400 X-Google-Smtp-Source: ADUXVKI5FkAC1YxlGat7Np60vY+LS/4XnnUJE7gJYx3B1dPPze2L9saIfQtgjL/aY9RudNyV7LYPAw== Subject: Re: [PATCH 2/8] xen/balloon: Move common memory reservation routines to a module To: Boris Ostrovsky , xen-devel@lists.xenproject.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-media@vger.kernel.org, jgross@suse.com, konrad.wilk@oracle.com Cc: daniel.vetter@intel.com, dongwon.kim@intel.com, matthew.d.roper@intel.com, Oleksandr Andrushchenko References: <20180525153331.31188-1-andr2000@gmail.com> <20180525153331.31188-3-andr2000@gmail.com> <59ab73b0-967b-a82f-3b0d-95f1b0dc40a5@oracle.com> From: Oleksandr Andrushchenko Message-ID: <89de7bdb-8759-419f-63bf-8ed0d57650f0@gmail.com> Date: Tue, 29 May 2018 21:22:25 +0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.7.0 MIME-Version: 1.0 In-Reply-To: <59ab73b0-967b-a82f-3b0d-95f1b0dc40a5@oracle.com> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Content-Language: en-US Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 05/29/2018 09:04 PM, Boris Ostrovsky wrote: > On 05/25/2018 11:33 AM, Oleksandr Andrushchenko wrote: >> From: Oleksandr Andrushchenko >> >> Memory {increase|decrease}_reservation and VA mappings update/reset >> code used in balloon driver can be made common, so other drivers can >> also re-use the same functionality without open-coding. >> Create a dedicated module > IIUIC this is not really a module, it's a common file. Sure, will put "file" here > >> for the shared code and export corresponding >> symbols for other kernel modules. >> >> Signed-off-by: Oleksandr Andrushchenko >> --- >> drivers/xen/Makefile | 1 + >> drivers/xen/balloon.c | 71 ++---------------- >> drivers/xen/mem-reservation.c | 134 ++++++++++++++++++++++++++++++++++ >> include/xen/mem_reservation.h | 29 ++++++++ >> 4 files changed, 170 insertions(+), 65 deletions(-) >> create mode 100644 drivers/xen/mem-reservation.c >> create mode 100644 include/xen/mem_reservation.h >> >> diff --git a/drivers/xen/Makefile b/drivers/xen/Makefile >> index 451e833f5931..3c87b0c3aca6 100644 >> --- a/drivers/xen/Makefile >> +++ b/drivers/xen/Makefile >> @@ -2,6 +2,7 @@ >> obj-$(CONFIG_HOTPLUG_CPU) += cpu_hotplug.o >> obj-$(CONFIG_X86) += fallback.o >> obj-y += grant-table.o features.o balloon.o manage.o preempt.o time.o >> +obj-y += mem-reservation.o >> obj-y += events/ >> obj-y += xenbus/ >> >> diff --git a/drivers/xen/balloon.c b/drivers/xen/balloon.c >> index 065f0b607373..57b482d67a3a 100644 >> --- a/drivers/xen/balloon.c >> +++ b/drivers/xen/balloon.c >> @@ -71,6 +71,7 @@ >> #include >> #include >> #include >> +#include >> >> static int xen_hotplug_unpopulated; >> >> @@ -157,13 +158,6 @@ static DECLARE_DELAYED_WORK(balloon_worker, balloon_process); >> #define GFP_BALLOON \ >> (GFP_HIGHUSER | __GFP_NOWARN | __GFP_NORETRY | __GFP_NOMEMALLOC) >> >> -static void scrub_page(struct page *page) >> -{ >> -#ifdef CONFIG_XEN_SCRUB_PAGES >> - clear_highpage(page); >> -#endif >> -} >> - >> /* balloon_append: add the given page to the balloon. */ >> static void __balloon_append(struct page *page) >> { >> @@ -463,11 +457,6 @@ static enum bp_state increase_reservation(unsigned long nr_pages) >> int rc; >> unsigned long i; >> struct page *page; >> - struct xen_memory_reservation reservation = { >> - .address_bits = 0, >> - .extent_order = EXTENT_ORDER, >> - .domid = DOMID_SELF >> - }; >> >> if (nr_pages > ARRAY_SIZE(frame_list)) >> nr_pages = ARRAY_SIZE(frame_list); >> @@ -486,9 +475,7 @@ static enum bp_state increase_reservation(unsigned long nr_pages) >> page = balloon_next_page(page); >> } >> >> - set_xen_guest_handle(reservation.extent_start, frame_list); >> - reservation.nr_extents = nr_pages; >> - rc = HYPERVISOR_memory_op(XENMEM_populate_physmap, &reservation); >> + rc = xenmem_reservation_increase(nr_pages, frame_list); >> if (rc <= 0) >> return BP_EAGAIN; >> >> @@ -496,29 +483,7 @@ static enum bp_state increase_reservation(unsigned long nr_pages) >> page = balloon_retrieve(false); >> BUG_ON(page == NULL); >> >> -#ifdef CONFIG_XEN_HAVE_PVMMU >> - /* >> - * We don't support PV MMU when Linux and Xen is using >> - * different page granularity. >> - */ >> - BUILD_BUG_ON(XEN_PAGE_SIZE != PAGE_SIZE); >> - >> - if (!xen_feature(XENFEAT_auto_translated_physmap)) { >> - unsigned long pfn = page_to_pfn(page); >> - >> - set_phys_to_machine(pfn, frame_list[i]); >> - >> - /* Link back into the page tables if not highmem. */ >> - if (!PageHighMem(page)) { >> - int ret; >> - ret = HYPERVISOR_update_va_mapping( >> - (unsigned long)__va(pfn << PAGE_SHIFT), >> - mfn_pte(frame_list[i], PAGE_KERNEL), >> - 0); >> - BUG_ON(ret); >> - } >> - } >> -#endif >> + xenmem_reservation_va_mapping_update(1, &page, &frame_list[i]); > > Can you make a single call to xenmem_reservation_va_mapping_update(rc, > ...)? You need to keep track of pages but presumable they can be put > into an array (or a list). In fact, perhaps we can have > balloon_retrieve() return a set of pages. This is actually how it is used later on for dma-buf, but I just didn't want to alter original balloon code too much, but this can be done, in order of simplicity: 1. Similar to frame_list, e.g. static array of struct page* of size ARRAY_SIZE(frame_list): more static memory is used, but no allocations 2. Allocated at run-time with kcalloc: allocation can fail 3. Make balloon_retrieve() return a set of pages: will require list/array allocation and handling, allocation may fail, balloon_retrieve prototype change Could you please tell which of the above will fit better? > > > >> >> /* Relinquish the page back to the allocator. */ >> free_reserved_page(page); >> @@ -535,11 +500,6 @@ static enum bp_state decrease_reservation(unsigned long nr_pages, gfp_t gfp) >> unsigned long i; >> struct page *page, *tmp; >> int ret; >> - struct xen_memory_reservation reservation = { >> - .address_bits = 0, >> - .extent_order = EXTENT_ORDER, >> - .domid = DOMID_SELF >> - }; >> LIST_HEAD(pages); >> >> if (nr_pages > ARRAY_SIZE(frame_list)) >> @@ -553,7 +513,7 @@ static enum bp_state decrease_reservation(unsigned long nr_pages, gfp_t gfp) >> break; >> } >> adjust_managed_page_count(page, -1); >> - scrub_page(page); >> + xenmem_reservation_scrub_page(page); >> list_add(&page->lru, &pages); >> } >> >> @@ -575,25 +535,8 @@ static enum bp_state decrease_reservation(unsigned long nr_pages, gfp_t gfp) >> /* XENMEM_decrease_reservation requires a GFN */ >> frame_list[i++] = xen_page_to_gfn(page); >> >> -#ifdef CONFIG_XEN_HAVE_PVMMU >> - /* >> - * We don't support PV MMU when Linux and Xen is using >> - * different page granularity. >> - */ >> - BUILD_BUG_ON(XEN_PAGE_SIZE != PAGE_SIZE); >> - >> - if (!xen_feature(XENFEAT_auto_translated_physmap)) { >> - unsigned long pfn = page_to_pfn(page); >> + xenmem_reservation_va_mapping_reset(1, &page); > > and here too. see above > >> >> - if (!PageHighMem(page)) { >> - ret = HYPERVISOR_update_va_mapping( >> - (unsigned long)__va(pfn << PAGE_SHIFT), >> - __pte_ma(0), 0); >> - BUG_ON(ret); >> - } >> - __set_phys_to_machine(pfn, INVALID_P2M_ENTRY); >> - } >> -#endif >> list_del(&page->lru); >> >> balloon_append(page); >> @@ -601,9 +544,7 @@ static enum bp_state decrease_reservation(unsigned long nr_pages, gfp_t gfp) >> >> flush_tlb_all(); >> >> - set_xen_guest_handle(reservation.extent_start, frame_list); >> - reservation.nr_extents = nr_pages; >> - ret = HYPERVISOR_memory_op(XENMEM_decrease_reservation, &reservation); >> + ret = xenmem_reservation_decrease(nr_pages, frame_list); >> BUG_ON(ret != nr_pages); >> >> balloon_stats.current_pages -= nr_pages; >> diff --git a/drivers/xen/mem-reservation.c b/drivers/xen/mem-reservation.c >> new file mode 100644 >> index 000000000000..29882e4324f5 >> --- /dev/null >> +++ b/drivers/xen/mem-reservation.c >> @@ -0,0 +1,134 @@ >> +// SPDX-License-Identifier: GPL-2.0 OR MIT > > Why is this "OR MIT"? The original file was licensed GPLv2 only. Will fix - I was not sure about the license to be used here, thanks > >> + >> +/****************************************************************************** >> + * Xen memory reservation utilities. >> + * >> + * Copyright (c) 2003, B Dragovic >> + * Copyright (c) 2003-2004, M Williamson, K Fraser >> + * Copyright (c) 2005 Dan M. Smith, IBM Corporation >> + * Copyright (c) 2010 Daniel Kiper >> + * Copyright (c) 2018, Oleksandr Andrushchenko, EPAM Systems Inc. >> + */ >> + >> +#include >> +#include >> + >> +#include >> +#include >> + >> +#include >> +#include >> + >> +/* >> + * Use one extent per PAGE_SIZE to avoid to break down the page into >> + * multiple frame. >> + */ >> +#define EXTENT_ORDER (fls(XEN_PFN_PER_PAGE) - 1) >> + >> +void xenmem_reservation_scrub_page(struct page *page) >> +{ >> +#ifdef CONFIG_XEN_SCRUB_PAGES >> + clear_highpage(page); >> +#endif >> +} >> +EXPORT_SYMBOL(xenmem_reservation_scrub_page); >> + >> +void xenmem_reservation_va_mapping_update(unsigned long count, >> + struct page **pages, >> + xen_pfn_t *frames) >> +{ >> +#ifdef CONFIG_XEN_HAVE_PVMMU >> + int i; >> + >> + for (i = 0; i < count; i++) { >> + struct page *page; >> + >> + page = pages[i]; >> + BUG_ON(page == NULL); >> + >> + /* >> + * We don't support PV MMU when Linux and Xen is using >> + * different page granularity. >> + */ >> + BUILD_BUG_ON(XEN_PAGE_SIZE != PAGE_SIZE); >> + >> + if (!xen_feature(XENFEAT_auto_translated_physmap)) { >> + unsigned long pfn = page_to_pfn(page); >> + >> + set_phys_to_machine(pfn, frames[i]); >> + >> + /* Link back into the page tables if not highmem. */ >> + if (!PageHighMem(page)) { >> + int ret; >> + >> + ret = HYPERVISOR_update_va_mapping( >> + (unsigned long)__va(pfn << PAGE_SHIFT), >> + mfn_pte(frames[i], PAGE_KERNEL), >> + 0); >> + BUG_ON(ret); >> + } >> + } >> + } >> +#endif >> +} >> +EXPORT_SYMBOL(xenmem_reservation_va_mapping_update); >> + >> +void xenmem_reservation_va_mapping_reset(unsigned long count, >> + struct page **pages) >> +{ >> +#ifdef CONFIG_XEN_HAVE_PVMMU >> + int i; >> + >> + for (i = 0; i < count; i++) { >> + /* >> + * We don't support PV MMU when Linux and Xen is using >> + * different page granularity. >> + */ >> + BUILD_BUG_ON(XEN_PAGE_SIZE != PAGE_SIZE); >> + >> + if (!xen_feature(XENFEAT_auto_translated_physmap)) { >> + struct page *page = pages[i]; >> + unsigned long pfn = page_to_pfn(page); >> + >> + if (!PageHighMem(page)) { >> + int ret; >> + >> + ret = HYPERVISOR_update_va_mapping( >> + (unsigned long)__va(pfn << PAGE_SHIFT), >> + __pte_ma(0), 0); >> + BUG_ON(ret); >> + } >> + __set_phys_to_machine(pfn, INVALID_P2M_ENTRY); >> + } >> + } >> +#endif >> +} >> +EXPORT_SYMBOL(xenmem_reservation_va_mapping_reset); >> + >> +int xenmem_reservation_increase(int count, xen_pfn_t *frames) >> +{ >> + struct xen_memory_reservation reservation = { >> + .address_bits = 0, >> + .extent_order = EXTENT_ORDER, >> + .domid = DOMID_SELF >> + }; >> + >> + set_xen_guest_handle(reservation.extent_start, frames); >> + reservation.nr_extents = count; >> + return HYPERVISOR_memory_op(XENMEM_populate_physmap, &reservation); >> +} >> +EXPORT_SYMBOL(xenmem_reservation_increase); >> + >> +int xenmem_reservation_decrease(int count, xen_pfn_t *frames) >> +{ >> + struct xen_memory_reservation reservation = { >> + .address_bits = 0, >> + .extent_order = EXTENT_ORDER, >> + .domid = DOMID_SELF >> + }; >> + >> + set_xen_guest_handle(reservation.extent_start, frames); >> + reservation.nr_extents = count; >> + return HYPERVISOR_memory_op(XENMEM_decrease_reservation, &reservation); >> +} >> +EXPORT_SYMBOL(xenmem_reservation_decrease); >> diff --git a/include/xen/mem_reservation.h b/include/xen/mem_reservation.h >> new file mode 100644 >> index 000000000000..9306d9b8743c >> --- /dev/null >> +++ b/include/xen/mem_reservation.h >> @@ -0,0 +1,29 @@ >> +/* SPDX-License-Identifier: GPL-2.0 OR MIT */ > and here too. will fix > > -boris > Thank you, Oleksandr >> + >> +/* >> + * Xen memory reservation utilities. >> + * >> + * Copyright (c) 2003, B Dragovic >> + * Copyright (c) 2003-2004, M Williamson, K Fraser >> + * Copyright (c) 2005 Dan M. Smith, IBM Corporation >> + * Copyright (c) 2010 Daniel Kiper >> + * Copyright (c) 2018, Oleksandr Andrushchenko, EPAM Systems Inc. >> + */ >> + >> +#ifndef _XENMEM_RESERVATION_H >> +#define _XENMEM_RESERVATION_H >> + >> +void xenmem_reservation_scrub_page(struct page *page); >> + >> +void xenmem_reservation_va_mapping_update(unsigned long count, >> + struct page **pages, >> + xen_pfn_t *frames); >> + >> +void xenmem_reservation_va_mapping_reset(unsigned long count, >> + struct page **pages); >> + >> +int xenmem_reservation_increase(int count, xen_pfn_t *frames); >> + >> +int xenmem_reservation_decrease(int count, xen_pfn_t *frames); >> + >> +#endif From mboxrd@z Thu Jan 1 00:00:00 1970 From: Oleksandr Andrushchenko Subject: Re: [PATCH 2/8] xen/balloon: Move common memory reservation routines to a module Date: Tue, 29 May 2018 21:22:25 +0300 Message-ID: <89de7bdb-8759-419f-63bf-8ed0d57650f0@gmail.com> References: <20180525153331.31188-1-andr2000@gmail.com> <20180525153331.31188-3-andr2000@gmail.com> <59ab73b0-967b-a82f-3b0d-95f1b0dc40a5@oracle.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8"; Format="flowed" Content-Transfer-Encoding: base64 Return-path: Received: from mail-lf0-x242.google.com (mail-lf0-x242.google.com [IPv6:2a00:1450:4010:c07::242]) by gabe.freedesktop.org (Postfix) with ESMTPS id B59A56E406 for ; Tue, 29 May 2018 18:22:30 +0000 (UTC) Received: by mail-lf0-x242.google.com with SMTP id v135-v6so224718lfa.9 for ; Tue, 29 May 2018 11:22:30 -0700 (PDT) In-Reply-To: <59ab73b0-967b-a82f-3b0d-95f1b0dc40a5@oracle.com> Content-Language: en-US List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Boris Ostrovsky , xen-devel@lists.xenproject.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-media@vger.kernel.org, jgross@suse.com, konrad.wilk@oracle.com Cc: daniel.vetter@intel.com, dongwon.kim@intel.com, Oleksandr Andrushchenko List-Id: dri-devel@lists.freedesktop.org T24gMDUvMjkvMjAxOCAwOTowNCBQTSwgQm9yaXMgT3N0cm92c2t5IHdyb3RlOgo+IE9uIDA1LzI1 LzIwMTggMTE6MzMgQU0sIE9sZWtzYW5kciBBbmRydXNoY2hlbmtvIHdyb3RlOgo+PiBGcm9tOiBP bGVrc2FuZHIgQW5kcnVzaGNoZW5rbyA8b2xla3NhbmRyX2FuZHJ1c2hjaGVua29AZXBhbS5jb20+ Cj4+Cj4+IE1lbW9yeSB7aW5jcmVhc2V8ZGVjcmVhc2V9X3Jlc2VydmF0aW9uIGFuZCBWQSBtYXBw aW5ncyB1cGRhdGUvcmVzZXQKPj4gY29kZSB1c2VkIGluIGJhbGxvb24gZHJpdmVyIGNhbiBiZSBt YWRlIGNvbW1vbiwgc28gb3RoZXIgZHJpdmVycyBjYW4KPj4gYWxzbyByZS11c2UgdGhlIHNhbWUg ZnVuY3Rpb25hbGl0eSB3aXRob3V0IG9wZW4tY29kaW5nLgo+PiBDcmVhdGUgYSBkZWRpY2F0ZWQg bW9kdWxlCj4gSUlVSUMgdGhpcyBpcyBub3QgcmVhbGx5IGEgbW9kdWxlLCBpdCdzIGEgY29tbW9u IGZpbGUuClN1cmUsIHdpbGwgcHV0ICJmaWxlIiBoZXJlCj4KPj4gZm9yIHRoZSBzaGFyZWQgY29k ZSBhbmQgZXhwb3J0IGNvcnJlc3BvbmRpbmcKPj4gc3ltYm9scyBmb3Igb3RoZXIga2VybmVsIG1v ZHVsZXMuCj4+Cj4+IFNpZ25lZC1vZmYtYnk6IE9sZWtzYW5kciBBbmRydXNoY2hlbmtvIDxvbGVr c2FuZHJfYW5kcnVzaGNoZW5rb0BlcGFtLmNvbT4KPj4gLS0tCj4+ICAgZHJpdmVycy94ZW4vTWFr ZWZpbGUgICAgICAgICAgfCAgIDEgKwo+PiAgIGRyaXZlcnMveGVuL2JhbGxvb24uYyAgICAgICAg IHwgIDcxICsrLS0tLS0tLS0tLS0tLS0tLQo+PiAgIGRyaXZlcnMveGVuL21lbS1yZXNlcnZhdGlv bi5jIHwgMTM0ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKPj4gICBpbmNsdWRl L3hlbi9tZW1fcmVzZXJ2YXRpb24uaCB8ICAyOSArKysrKysrKwo+PiAgIDQgZmlsZXMgY2hhbmdl ZCwgMTcwIGluc2VydGlvbnMoKyksIDY1IGRlbGV0aW9ucygtKQo+PiAgIGNyZWF0ZSBtb2RlIDEw MDY0NCBkcml2ZXJzL3hlbi9tZW0tcmVzZXJ2YXRpb24uYwo+PiAgIGNyZWF0ZSBtb2RlIDEwMDY0 NCBpbmNsdWRlL3hlbi9tZW1fcmVzZXJ2YXRpb24uaAo+Pgo+PiBkaWZmIC0tZ2l0IGEvZHJpdmVy cy94ZW4vTWFrZWZpbGUgYi9kcml2ZXJzL3hlbi9NYWtlZmlsZQo+PiBpbmRleCA0NTFlODMzZjU5 MzEuLjNjODdiMGMzYWNhNiAxMDA2NDQKPj4gLS0tIGEvZHJpdmVycy94ZW4vTWFrZWZpbGUKPj4g KysrIGIvZHJpdmVycy94ZW4vTWFrZWZpbGUKPj4gQEAgLTIsNiArMiw3IEBACj4+ICAgb2JqLSQo Q09ORklHX0hPVFBMVUdfQ1BVKQkJKz0gY3B1X2hvdHBsdWcubwo+PiAgIG9iai0kKENPTkZJR19Y ODYpCQkJKz0gZmFsbGJhY2subwo+PiAgIG9iai15CSs9IGdyYW50LXRhYmxlLm8gZmVhdHVyZXMu byBiYWxsb29uLm8gbWFuYWdlLm8gcHJlZW1wdC5vIHRpbWUubwo+PiArb2JqLXkJKz0gbWVtLXJl c2VydmF0aW9uLm8KPj4gICBvYmoteQkrPSBldmVudHMvCj4+ICAgb2JqLXkJKz0geGVuYnVzLwo+ PiAgIAo+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy94ZW4vYmFsbG9vbi5jIGIvZHJpdmVycy94ZW4v YmFsbG9vbi5jCj4+IGluZGV4IDA2NWYwYjYwNzM3My4uNTdiNDgyZDY3YTNhIDEwMDY0NAo+PiAt LS0gYS9kcml2ZXJzL3hlbi9iYWxsb29uLmMKPj4gKysrIGIvZHJpdmVycy94ZW4vYmFsbG9vbi5j Cj4+IEBAIC03MSw2ICs3MSw3IEBACj4+ICAgI2luY2x1ZGUgPHhlbi9iYWxsb29uLmg+Cj4+ICAg I2luY2x1ZGUgPHhlbi9mZWF0dXJlcy5oPgo+PiAgICNpbmNsdWRlIDx4ZW4vcGFnZS5oPgo+PiAr I2luY2x1ZGUgPHhlbi9tZW1fcmVzZXJ2YXRpb24uaD4KPj4gICAKPj4gICBzdGF0aWMgaW50IHhl bl9ob3RwbHVnX3VucG9wdWxhdGVkOwo+PiAgIAo+PiBAQCAtMTU3LDEzICsxNTgsNiBAQCBzdGF0 aWMgREVDTEFSRV9ERUxBWUVEX1dPUksoYmFsbG9vbl93b3JrZXIsIGJhbGxvb25fcHJvY2Vzcyk7 Cj4+ICAgI2RlZmluZSBHRlBfQkFMTE9PTiBcCj4+ICAgCShHRlBfSElHSFVTRVIgfCBfX0dGUF9O T1dBUk4gfCBfX0dGUF9OT1JFVFJZIHwgX19HRlBfTk9NRU1BTExPQykKPj4gICAKPj4gLXN0YXRp YyB2b2lkIHNjcnViX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpCj4+IC17Cj4+IC0jaWZkZWYgQ09O RklHX1hFTl9TQ1JVQl9QQUdFUwo+PiAtCWNsZWFyX2hpZ2hwYWdlKHBhZ2UpOwo+PiAtI2VuZGlm Cj4+IC19Cj4+IC0KPj4gICAvKiBiYWxsb29uX2FwcGVuZDogYWRkIHRoZSBnaXZlbiBwYWdlIHRv IHRoZSBiYWxsb29uLiAqLwo+PiAgIHN0YXRpYyB2b2lkIF9fYmFsbG9vbl9hcHBlbmQoc3RydWN0 IHBhZ2UgKnBhZ2UpCj4+ICAgewo+PiBAQCAtNDYzLDExICs0NTcsNiBAQCBzdGF0aWMgZW51bSBi cF9zdGF0ZSBpbmNyZWFzZV9yZXNlcnZhdGlvbih1bnNpZ25lZCBsb25nIG5yX3BhZ2VzKQo+PiAg IAlpbnQgcmM7Cj4+ICAgCXVuc2lnbmVkIGxvbmcgaTsKPj4gICAJc3RydWN0IHBhZ2UgICAqcGFn ZTsKPj4gLQlzdHJ1Y3QgeGVuX21lbW9yeV9yZXNlcnZhdGlvbiByZXNlcnZhdGlvbiA9IHsKPj4g LQkJLmFkZHJlc3NfYml0cyA9IDAsCj4+IC0JCS5leHRlbnRfb3JkZXIgPSBFWFRFTlRfT1JERVIs Cj4+IC0JCS5kb21pZCAgICAgICAgPSBET01JRF9TRUxGCj4+IC0JfTsKPj4gICAKPj4gICAJaWYg KG5yX3BhZ2VzID4gQVJSQVlfU0laRShmcmFtZV9saXN0KSkKPj4gICAJCW5yX3BhZ2VzID0gQVJS QVlfU0laRShmcmFtZV9saXN0KTsKPj4gQEAgLTQ4Niw5ICs0NzUsNyBAQCBzdGF0aWMgZW51bSBi cF9zdGF0ZSBpbmNyZWFzZV9yZXNlcnZhdGlvbih1bnNpZ25lZCBsb25nIG5yX3BhZ2VzKQo+PiAg IAkJcGFnZSA9IGJhbGxvb25fbmV4dF9wYWdlKHBhZ2UpOwo+PiAgIAl9Cj4+ICAgCj4+IC0Jc2V0 X3hlbl9ndWVzdF9oYW5kbGUocmVzZXJ2YXRpb24uZXh0ZW50X3N0YXJ0LCBmcmFtZV9saXN0KTsK Pj4gLQlyZXNlcnZhdGlvbi5ucl9leHRlbnRzID0gbnJfcGFnZXM7Cj4+IC0JcmMgPSBIWVBFUlZJ U09SX21lbW9yeV9vcChYRU5NRU1fcG9wdWxhdGVfcGh5c21hcCwgJnJlc2VydmF0aW9uKTsKPj4g KwlyYyA9IHhlbm1lbV9yZXNlcnZhdGlvbl9pbmNyZWFzZShucl9wYWdlcywgZnJhbWVfbGlzdCk7 Cj4+ICAgCWlmIChyYyA8PSAwKQo+PiAgIAkJcmV0dXJuIEJQX0VBR0FJTjsKPj4gICAKPj4gQEAg LTQ5NiwyOSArNDgzLDcgQEAgc3RhdGljIGVudW0gYnBfc3RhdGUgaW5jcmVhc2VfcmVzZXJ2YXRp b24odW5zaWduZWQgbG9uZyBucl9wYWdlcykKPj4gICAJCXBhZ2UgPSBiYWxsb29uX3JldHJpZXZl KGZhbHNlKTsKPj4gICAJCUJVR19PTihwYWdlID09IE5VTEwpOwo+PiAgIAo+PiAtI2lmZGVmIENP TkZJR19YRU5fSEFWRV9QVk1NVQo+PiAtCQkvKgo+PiAtCQkgKiBXZSBkb24ndCBzdXBwb3J0IFBW IE1NVSB3aGVuIExpbnV4IGFuZCBYZW4gaXMgdXNpbmcKPj4gLQkJICogZGlmZmVyZW50IHBhZ2Ug Z3JhbnVsYXJpdHkuCj4+IC0JCSAqLwo+PiAtCQlCVUlMRF9CVUdfT04oWEVOX1BBR0VfU0laRSAh PSBQQUdFX1NJWkUpOwo+PiAtCj4+IC0JCWlmICgheGVuX2ZlYXR1cmUoWEVORkVBVF9hdXRvX3Ry YW5zbGF0ZWRfcGh5c21hcCkpIHsKPj4gLQkJCXVuc2lnbmVkIGxvbmcgcGZuID0gcGFnZV90b19w Zm4ocGFnZSk7Cj4+IC0KPj4gLQkJCXNldF9waHlzX3RvX21hY2hpbmUocGZuLCBmcmFtZV9saXN0 W2ldKTsKPj4gLQo+PiAtCQkJLyogTGluayBiYWNrIGludG8gdGhlIHBhZ2UgdGFibGVzIGlmIG5v dCBoaWdobWVtLiAqLwo+PiAtCQkJaWYgKCFQYWdlSGlnaE1lbShwYWdlKSkgewo+PiAtCQkJCWlu dCByZXQ7Cj4+IC0JCQkJcmV0ID0gSFlQRVJWSVNPUl91cGRhdGVfdmFfbWFwcGluZygKPj4gLQkJ CQkJCSh1bnNpZ25lZCBsb25nKV9fdmEocGZuIDw8IFBBR0VfU0hJRlQpLAo+PiAtCQkJCQkJbWZu X3B0ZShmcmFtZV9saXN0W2ldLCBQQUdFX0tFUk5FTCksCj4+IC0JCQkJCQkwKTsKPj4gLQkJCQlC VUdfT04ocmV0KTsKPj4gLQkJCX0KPj4gLQkJfQo+PiAtI2VuZGlmCj4+ICsJCXhlbm1lbV9yZXNl cnZhdGlvbl92YV9tYXBwaW5nX3VwZGF0ZSgxLCAmcGFnZSwgJmZyYW1lX2xpc3RbaV0pOwo+Cj4g Q2FuIHlvdSBtYWtlIGEgc2luZ2xlIGNhbGwgdG8geGVubWVtX3Jlc2VydmF0aW9uX3ZhX21hcHBp bmdfdXBkYXRlKHJjLAo+IC4uLik/IFlvdSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgcGFnZXMgYnV0 IHByZXN1bWFibGUgdGhleSBjYW4gYmUgcHV0Cj4gaW50byBhbiBhcnJheSAob3IgYSBsaXN0KS4g SW4gZmFjdCwgcGVyaGFwcyB3ZSBjYW4gaGF2ZQo+IGJhbGxvb25fcmV0cmlldmUoKSByZXR1cm4g YSBzZXQgb2YgcGFnZXMuClRoaXMgaXMgYWN0dWFsbHkgaG93IGl0IGlzIHVzZWQgbGF0ZXIgb24g Zm9yIGRtYS1idWYsIGJ1dCBJIGp1c3QgZGlkbid0IHdhbnQKdG8gYWx0ZXIgb3JpZ2luYWwgYmFs bG9vbiBjb2RlIHRvbyBtdWNoLCBidXQgdGhpcyBjYW4gYmUgZG9uZSwgaW4gb3JkZXIgCm9mIHNp bXBsaWNpdHk6CgoxLiBTaW1pbGFyIHRvIGZyYW1lX2xpc3QsIGUuZy4gc3RhdGljIGFycmF5IG9m IHN0cnVjdCBwYWdlKiBvZiBzaXplIApBUlJBWV9TSVpFKGZyYW1lX2xpc3QpOgptb3JlIHN0YXRp YyBtZW1vcnkgaXMgdXNlZCwgYnV0IG5vIGFsbG9jYXRpb25zCgoyLiBBbGxvY2F0ZWQgYXQgcnVu LXRpbWUgd2l0aCBrY2FsbG9jOiBhbGxvY2F0aW9uIGNhbiBmYWlsCgozLiBNYWtlIGJhbGxvb25f cmV0cmlldmUoKSByZXR1cm4gYSBzZXQgb2YgcGFnZXM6IHdpbGwgcmVxdWlyZSAKbGlzdC9hcnJh eSBhbGxvY2F0aW9uCmFuZCBoYW5kbGluZywgYWxsb2NhdGlvbiBtYXkgZmFpbCwgYmFsbG9vbl9y ZXRyaWV2ZSBwcm90b3R5cGUgY2hhbmdlCgpDb3VsZCB5b3UgcGxlYXNlIHRlbGwgd2hpY2ggb2Yg dGhlIGFib3ZlIHdpbGwgZml0IGJldHRlcj8KCj4KPgo+Cj4+ICAgCj4+ICAgCQkvKiBSZWxpbnF1 aXNoIHRoZSBwYWdlIGJhY2sgdG8gdGhlIGFsbG9jYXRvci4gKi8KPj4gICAJCWZyZWVfcmVzZXJ2 ZWRfcGFnZShwYWdlKTsKPj4gQEAgLTUzNSwxMSArNTAwLDYgQEAgc3RhdGljIGVudW0gYnBfc3Rh dGUgZGVjcmVhc2VfcmVzZXJ2YXRpb24odW5zaWduZWQgbG9uZyBucl9wYWdlcywgZ2ZwX3QgZ2Zw KQo+PiAgIAl1bnNpZ25lZCBsb25nIGk7Cj4+ICAgCXN0cnVjdCBwYWdlICpwYWdlLCAqdG1wOwo+ PiAgIAlpbnQgcmV0Owo+PiAtCXN0cnVjdCB4ZW5fbWVtb3J5X3Jlc2VydmF0aW9uIHJlc2VydmF0 aW9uID0gewo+PiAtCQkuYWRkcmVzc19iaXRzID0gMCwKPj4gLQkJLmV4dGVudF9vcmRlciA9IEVY VEVOVF9PUkRFUiwKPj4gLQkJLmRvbWlkICAgICAgICA9IERPTUlEX1NFTEYKPj4gLQl9Owo+PiAg IAlMSVNUX0hFQUQocGFnZXMpOwo+PiAgIAo+PiAgIAlpZiAobnJfcGFnZXMgPiBBUlJBWV9TSVpF KGZyYW1lX2xpc3QpKQo+PiBAQCAtNTUzLDcgKzUxMyw3IEBAIHN0YXRpYyBlbnVtIGJwX3N0YXRl IGRlY3JlYXNlX3Jlc2VydmF0aW9uKHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsIGdmcF90IGdmcCkK Pj4gICAJCQlicmVhazsKPj4gICAJCX0KPj4gICAJCWFkanVzdF9tYW5hZ2VkX3BhZ2VfY291bnQo cGFnZSwgLTEpOwo+PiAtCQlzY3J1Yl9wYWdlKHBhZ2UpOwo+PiArCQl4ZW5tZW1fcmVzZXJ2YXRp b25fc2NydWJfcGFnZShwYWdlKTsKPj4gICAJCWxpc3RfYWRkKCZwYWdlLT5scnUsICZwYWdlcyk7 Cj4+ICAgCX0KPj4gICAKPj4gQEAgLTU3NSwyNSArNTM1LDggQEAgc3RhdGljIGVudW0gYnBfc3Rh dGUgZGVjcmVhc2VfcmVzZXJ2YXRpb24odW5zaWduZWQgbG9uZyBucl9wYWdlcywgZ2ZwX3QgZ2Zw KQo+PiAgIAkJLyogWEVOTUVNX2RlY3JlYXNlX3Jlc2VydmF0aW9uIHJlcXVpcmVzIGEgR0ZOICov Cj4+ICAgCQlmcmFtZV9saXN0W2krK10gPSB4ZW5fcGFnZV90b19nZm4ocGFnZSk7Cj4+ICAgCj4+ IC0jaWZkZWYgQ09ORklHX1hFTl9IQVZFX1BWTU1VCj4+IC0JCS8qCj4+IC0JCSAqIFdlIGRvbid0 IHN1cHBvcnQgUFYgTU1VIHdoZW4gTGludXggYW5kIFhlbiBpcyB1c2luZwo+PiAtCQkgKiBkaWZm ZXJlbnQgcGFnZSBncmFudWxhcml0eS4KPj4gLQkJICovCj4+IC0JCUJVSUxEX0JVR19PTihYRU5f UEFHRV9TSVpFICE9IFBBR0VfU0laRSk7Cj4+IC0KPj4gLQkJaWYgKCF4ZW5fZmVhdHVyZShYRU5G RUFUX2F1dG9fdHJhbnNsYXRlZF9waHlzbWFwKSkgewo+PiAtCQkJdW5zaWduZWQgbG9uZyBwZm4g PSBwYWdlX3RvX3BmbihwYWdlKTsKPj4gKwkJeGVubWVtX3Jlc2VydmF0aW9uX3ZhX21hcHBpbmdf cmVzZXQoMSwgJnBhZ2UpOwo+Cj4gYW5kIGhlcmUgdG9vLgpzZWUgYWJvdmUKPgo+PiAgIAo+PiAt CQkJaWYgKCFQYWdlSGlnaE1lbShwYWdlKSkgewo+PiAtCQkJCXJldCA9IEhZUEVSVklTT1JfdXBk YXRlX3ZhX21hcHBpbmcoCj4+IC0JCQkJCQkodW5zaWduZWQgbG9uZylfX3ZhKHBmbiA8PCBQQUdF X1NISUZUKSwKPj4gLQkJCQkJCV9fcHRlX21hKDApLCAwKTsKPj4gLQkJCQlCVUdfT04ocmV0KTsK Pj4gLQkJCX0KPj4gLQkJCV9fc2V0X3BoeXNfdG9fbWFjaGluZShwZm4sIElOVkFMSURfUDJNX0VO VFJZKTsKPj4gLQkJfQo+PiAtI2VuZGlmCj4+ICAgCQlsaXN0X2RlbCgmcGFnZS0+bHJ1KTsKPj4g ICAKPj4gICAJCWJhbGxvb25fYXBwZW5kKHBhZ2UpOwo+PiBAQCAtNjAxLDkgKzU0NCw3IEBAIHN0 YXRpYyBlbnVtIGJwX3N0YXRlIGRlY3JlYXNlX3Jlc2VydmF0aW9uKHVuc2lnbmVkIGxvbmcgbnJf cGFnZXMsIGdmcF90IGdmcCkKPj4gICAKPj4gICAJZmx1c2hfdGxiX2FsbCgpOwo+PiAgIAo+PiAt CXNldF94ZW5fZ3Vlc3RfaGFuZGxlKHJlc2VydmF0aW9uLmV4dGVudF9zdGFydCwgZnJhbWVfbGlz dCk7Cj4+IC0JcmVzZXJ2YXRpb24ubnJfZXh0ZW50cyAgID0gbnJfcGFnZXM7Cj4+IC0JcmV0ID0g SFlQRVJWSVNPUl9tZW1vcnlfb3AoWEVOTUVNX2RlY3JlYXNlX3Jlc2VydmF0aW9uLCAmcmVzZXJ2 YXRpb24pOwo+PiArCXJldCA9IHhlbm1lbV9yZXNlcnZhdGlvbl9kZWNyZWFzZShucl9wYWdlcywg ZnJhbWVfbGlzdCk7Cj4+ICAgCUJVR19PTihyZXQgIT0gbnJfcGFnZXMpOwo+PiAgIAo+PiAgIAli YWxsb29uX3N0YXRzLmN1cnJlbnRfcGFnZXMgLT0gbnJfcGFnZXM7Cj4+IGRpZmYgLS1naXQgYS9k cml2ZXJzL3hlbi9tZW0tcmVzZXJ2YXRpb24uYyBiL2RyaXZlcnMveGVuL21lbS1yZXNlcnZhdGlv bi5jCj4+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4+IGluZGV4IDAwMDAwMDAwMDAwMC4uMjk4ODJl NDMyNGY1Cj4+IC0tLSAvZGV2L251bGwKPj4gKysrIGIvZHJpdmVycy94ZW4vbWVtLXJlc2VydmF0 aW9uLmMKPj4gQEAgLTAsMCArMSwxMzQgQEAKPj4gKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVy OiBHUEwtMi4wIE9SIE1JVAo+Cj4gV2h5IGlzIHRoaXMgIk9SIE1JVCI/IFRoZSBvcmlnaW5hbCBm aWxlIHdhcyBsaWNlbnNlZCBHUEx2MiBvbmx5LgpXaWxsIGZpeCAtIEkgd2FzIG5vdCBzdXJlIGFi b3V0IHRoZSBsaWNlbnNlIHRvIGJlIHVzZWQgaGVyZSwgdGhhbmtzCj4KPj4gKwo+PiArLyoqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKgo+PiArICogWGVuIG1lbW9yeSByZXNlcnZhdGlvbiB1dGlsaXRpZXMu Cj4+ICsgKgo+PiArICogQ29weXJpZ2h0IChjKSAyMDAzLCBCIERyYWdvdmljCj4+ICsgKiBDb3B5 cmlnaHQgKGMpIDIwMDMtMjAwNCwgTSBXaWxsaWFtc29uLCBLIEZyYXNlcgo+PiArICogQ29weXJp Z2h0IChjKSAyMDA1IERhbiBNLiBTbWl0aCwgSUJNIENvcnBvcmF0aW9uCj4+ICsgKiBDb3B5cmln aHQgKGMpIDIwMTAgRGFuaWVsIEtpcGVyCj4+ICsgKiBDb3B5cmlnaHQgKGMpIDIwMTgsIE9sZWtz YW5kciBBbmRydXNoY2hlbmtvLCBFUEFNIFN5c3RlbXMgSW5jLgo+PiArICovCj4+ICsKPj4gKyNp bmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KPj4gKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Cj4+ICsK Pj4gKyNpbmNsdWRlIDxhc20vdGxiLmg+Cj4+ICsjaW5jbHVkZSA8YXNtL3hlbi9oeXBlcmNhbGwu aD4KPj4gKwo+PiArI2luY2x1ZGUgPHhlbi9pbnRlcmZhY2UvbWVtb3J5Lmg+Cj4+ICsjaW5jbHVk ZSA8eGVuL3BhZ2UuaD4KPj4gKwo+PiArLyoKPj4gKyAqIFVzZSBvbmUgZXh0ZW50IHBlciBQQUdF X1NJWkUgdG8gYXZvaWQgdG8gYnJlYWsgZG93biB0aGUgcGFnZSBpbnRvCj4+ICsgKiBtdWx0aXBs ZSBmcmFtZS4KPj4gKyAqLwo+PiArI2RlZmluZSBFWFRFTlRfT1JERVIgKGZscyhYRU5fUEZOX1BF Ul9QQUdFKSAtIDEpCj4+ICsKPj4gK3ZvaWQgeGVubWVtX3Jlc2VydmF0aW9uX3NjcnViX3BhZ2Uo c3RydWN0IHBhZ2UgKnBhZ2UpCj4+ICt7Cj4+ICsjaWZkZWYgQ09ORklHX1hFTl9TQ1JVQl9QQUdF Uwo+PiArCWNsZWFyX2hpZ2hwYWdlKHBhZ2UpOwo+PiArI2VuZGlmCj4+ICt9Cj4+ICtFWFBPUlRf U1lNQk9MKHhlbm1lbV9yZXNlcnZhdGlvbl9zY3J1Yl9wYWdlKTsKPj4gKwo+PiArdm9pZCB4ZW5t ZW1fcmVzZXJ2YXRpb25fdmFfbWFwcGluZ191cGRhdGUodW5zaWduZWQgbG9uZyBjb3VudCwKPj4g KwkJCQkJICBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLAo+PiArCQkJCQkgIHhlbl9wZm5fdCAqZnJhbWVz KQo+PiArewo+PiArI2lmZGVmIENPTkZJR19YRU5fSEFWRV9QVk1NVQo+PiArCWludCBpOwo+PiAr Cj4+ICsJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKPj4gKwkJc3RydWN0IHBhZ2UgKnBh Z2U7Cj4+ICsKPj4gKwkJcGFnZSA9IHBhZ2VzW2ldOwo+PiArCQlCVUdfT04ocGFnZSA9PSBOVUxM KTsKPj4gKwo+PiArCQkvKgo+PiArCQkgKiBXZSBkb24ndCBzdXBwb3J0IFBWIE1NVSB3aGVuIExp bnV4IGFuZCBYZW4gaXMgdXNpbmcKPj4gKwkJICogZGlmZmVyZW50IHBhZ2UgZ3JhbnVsYXJpdHku Cj4+ICsJCSAqLwo+PiArCQlCVUlMRF9CVUdfT04oWEVOX1BBR0VfU0laRSAhPSBQQUdFX1NJWkUp Owo+PiArCj4+ICsJCWlmICgheGVuX2ZlYXR1cmUoWEVORkVBVF9hdXRvX3RyYW5zbGF0ZWRfcGh5 c21hcCkpIHsKPj4gKwkJCXVuc2lnbmVkIGxvbmcgcGZuID0gcGFnZV90b19wZm4ocGFnZSk7Cj4+ ICsKPj4gKwkJCXNldF9waHlzX3RvX21hY2hpbmUocGZuLCBmcmFtZXNbaV0pOwo+PiArCj4+ICsJ CQkvKiBMaW5rIGJhY2sgaW50byB0aGUgcGFnZSB0YWJsZXMgaWYgbm90IGhpZ2htZW0uICovCj4+ ICsJCQlpZiAoIVBhZ2VIaWdoTWVtKHBhZ2UpKSB7Cj4+ICsJCQkJaW50IHJldDsKPj4gKwo+PiAr CQkJCXJldCA9IEhZUEVSVklTT1JfdXBkYXRlX3ZhX21hcHBpbmcoCj4+ICsJCQkJCQkodW5zaWdu ZWQgbG9uZylfX3ZhKHBmbiA8PCBQQUdFX1NISUZUKSwKPj4gKwkJCQkJCW1mbl9wdGUoZnJhbWVz W2ldLCBQQUdFX0tFUk5FTCksCj4+ICsJCQkJCQkwKTsKPj4gKwkJCQlCVUdfT04ocmV0KTsKPj4g KwkJCX0KPj4gKwkJfQo+PiArCX0KPj4gKyNlbmRpZgo+PiArfQo+PiArRVhQT1JUX1NZTUJPTCh4 ZW5tZW1fcmVzZXJ2YXRpb25fdmFfbWFwcGluZ191cGRhdGUpOwo+PiArCj4+ICt2b2lkIHhlbm1l bV9yZXNlcnZhdGlvbl92YV9tYXBwaW5nX3Jlc2V0KHVuc2lnbmVkIGxvbmcgY291bnQsCj4+ICsJ CQkJCSBzdHJ1Y3QgcGFnZSAqKnBhZ2VzKQo+PiArewo+PiArI2lmZGVmIENPTkZJR19YRU5fSEFW RV9QVk1NVQo+PiArCWludCBpOwo+PiArCj4+ICsJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKysp IHsKPj4gKwkJLyoKPj4gKwkJICogV2UgZG9uJ3Qgc3VwcG9ydCBQViBNTVUgd2hlbiBMaW51eCBh bmQgWGVuIGlzIHVzaW5nCj4+ICsJCSAqIGRpZmZlcmVudCBwYWdlIGdyYW51bGFyaXR5Lgo+PiAr CQkgKi8KPj4gKwkJQlVJTERfQlVHX09OKFhFTl9QQUdFX1NJWkUgIT0gUEFHRV9TSVpFKTsKPj4g Kwo+PiArCQlpZiAoIXhlbl9mZWF0dXJlKFhFTkZFQVRfYXV0b190cmFuc2xhdGVkX3BoeXNtYXAp KSB7Cj4+ICsJCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHBhZ2VzW2ldOwo+PiArCQkJdW5zaWduZWQg bG9uZyBwZm4gPSBwYWdlX3RvX3BmbihwYWdlKTsKPj4gKwo+PiArCQkJaWYgKCFQYWdlSGlnaE1l bShwYWdlKSkgewo+PiArCQkJCWludCByZXQ7Cj4+ICsKPj4gKwkJCQlyZXQgPSBIWVBFUlZJU09S X3VwZGF0ZV92YV9tYXBwaW5nKAo+PiArCQkJCQkJKHVuc2lnbmVkIGxvbmcpX192YShwZm4gPDwg UEFHRV9TSElGVCksCj4+ICsJCQkJCQlfX3B0ZV9tYSgwKSwgMCk7Cj4+ICsJCQkJQlVHX09OKHJl dCk7Cj4+ICsJCQl9Cj4+ICsJCQlfX3NldF9waHlzX3RvX21hY2hpbmUocGZuLCBJTlZBTElEX1Ay TV9FTlRSWSk7Cj4+ICsJCX0KPj4gKwl9Cj4+ICsjZW5kaWYKPj4gK30KPj4gK0VYUE9SVF9TWU1C T0woeGVubWVtX3Jlc2VydmF0aW9uX3ZhX21hcHBpbmdfcmVzZXQpOwo+PiArCj4+ICtpbnQgeGVu bWVtX3Jlc2VydmF0aW9uX2luY3JlYXNlKGludCBjb3VudCwgeGVuX3Bmbl90ICpmcmFtZXMpCj4+ ICt7Cj4+ICsJc3RydWN0IHhlbl9tZW1vcnlfcmVzZXJ2YXRpb24gcmVzZXJ2YXRpb24gPSB7Cj4+ ICsJCS5hZGRyZXNzX2JpdHMgPSAwLAo+PiArCQkuZXh0ZW50X29yZGVyID0gRVhURU5UX09SREVS LAo+PiArCQkuZG9taWQgICAgICAgID0gRE9NSURfU0VMRgo+PiArCX07Cj4+ICsKPj4gKwlzZXRf eGVuX2d1ZXN0X2hhbmRsZShyZXNlcnZhdGlvbi5leHRlbnRfc3RhcnQsIGZyYW1lcyk7Cj4+ICsJ cmVzZXJ2YXRpb24ubnJfZXh0ZW50cyA9IGNvdW50Owo+PiArCXJldHVybiBIWVBFUlZJU09SX21l bW9yeV9vcChYRU5NRU1fcG9wdWxhdGVfcGh5c21hcCwgJnJlc2VydmF0aW9uKTsKPj4gK30KPj4g K0VYUE9SVF9TWU1CT0woeGVubWVtX3Jlc2VydmF0aW9uX2luY3JlYXNlKTsKPj4gKwo+PiAraW50 IHhlbm1lbV9yZXNlcnZhdGlvbl9kZWNyZWFzZShpbnQgY291bnQsIHhlbl9wZm5fdCAqZnJhbWVz KQo+PiArewo+PiArCXN0cnVjdCB4ZW5fbWVtb3J5X3Jlc2VydmF0aW9uIHJlc2VydmF0aW9uID0g ewo+PiArCQkuYWRkcmVzc19iaXRzID0gMCwKPj4gKwkJLmV4dGVudF9vcmRlciA9IEVYVEVOVF9P UkRFUiwKPj4gKwkJLmRvbWlkICAgICAgICA9IERPTUlEX1NFTEYKPj4gKwl9Owo+PiArCj4+ICsJ c2V0X3hlbl9ndWVzdF9oYW5kbGUocmVzZXJ2YXRpb24uZXh0ZW50X3N0YXJ0LCBmcmFtZXMpOwo+ PiArCXJlc2VydmF0aW9uLm5yX2V4dGVudHMgPSBjb3VudDsKPj4gKwlyZXR1cm4gSFlQRVJWSVNP Ul9tZW1vcnlfb3AoWEVOTUVNX2RlY3JlYXNlX3Jlc2VydmF0aW9uLCAmcmVzZXJ2YXRpb24pOwo+ PiArfQo+PiArRVhQT1JUX1NZTUJPTCh4ZW5tZW1fcmVzZXJ2YXRpb25fZGVjcmVhc2UpOwo+PiBk aWZmIC0tZ2l0IGEvaW5jbHVkZS94ZW4vbWVtX3Jlc2VydmF0aW9uLmggYi9pbmNsdWRlL3hlbi9t ZW1fcmVzZXJ2YXRpb24uaAo+PiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+PiBpbmRleCAwMDAwMDAw MDAwMDAuLjkzMDZkOWI4NzQzYwo+PiAtLS0gL2Rldi9udWxsCj4+ICsrKyBiL2luY2x1ZGUveGVu L21lbV9yZXNlcnZhdGlvbi5oCj4+IEBAIC0wLDAgKzEsMjkgQEAKPj4gKy8qIFNQRFgtTGljZW5z ZS1JZGVudGlmaWVyOiBHUEwtMi4wIE9SIE1JVCAqLwo+IGFuZCBoZXJlIHRvby4Kd2lsbCBmaXgK Pgo+IC1ib3Jpcwo+ClRoYW5rIHlvdSwKT2xla3NhbmRyCj4+ICsKPj4gKy8qCj4+ICsgKiBYZW4g bWVtb3J5IHJlc2VydmF0aW9uIHV0aWxpdGllcy4KPj4gKyAqCj4+ICsgKiBDb3B5cmlnaHQgKGMp IDIwMDMsIEIgRHJhZ292aWMKPj4gKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA0LCBNIFdpbGxp YW1zb24sIEsgRnJhc2VyCj4+ICsgKiBDb3B5cmlnaHQgKGMpIDIwMDUgRGFuIE0uIFNtaXRoLCBJ Qk0gQ29ycG9yYXRpb24KPj4gKyAqIENvcHlyaWdodCAoYykgMjAxMCBEYW5pZWwgS2lwZXIKPj4g KyAqIENvcHlyaWdodCAoYykgMjAxOCwgT2xla3NhbmRyIEFuZHJ1c2hjaGVua28sIEVQQU0gU3lz dGVtcyBJbmMuCj4+ICsgKi8KPj4gKwo+PiArI2lmbmRlZiBfWEVOTUVNX1JFU0VSVkFUSU9OX0gK Pj4gKyNkZWZpbmUgX1hFTk1FTV9SRVNFUlZBVElPTl9ICj4+ICsKPj4gK3ZvaWQgeGVubWVtX3Jl c2VydmF0aW9uX3NjcnViX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpOwo+PiArCj4+ICt2b2lkIHhl bm1lbV9yZXNlcnZhdGlvbl92YV9tYXBwaW5nX3VwZGF0ZSh1bnNpZ25lZCBsb25nIGNvdW50LAo+ PiArCQkJCQkgIHN0cnVjdCBwYWdlICoqcGFnZXMsCj4+ICsJCQkJCSAgeGVuX3Bmbl90ICpmcmFt ZXMpOwo+PiArCj4+ICt2b2lkIHhlbm1lbV9yZXNlcnZhdGlvbl92YV9tYXBwaW5nX3Jlc2V0KHVu c2lnbmVkIGxvbmcgY291bnQsCj4+ICsJCQkJCSBzdHJ1Y3QgcGFnZSAqKnBhZ2VzKTsKPj4gKwo+ PiAraW50IHhlbm1lbV9yZXNlcnZhdGlvbl9pbmNyZWFzZShpbnQgY291bnQsIHhlbl9wZm5fdCAq ZnJhbWVzKTsKPj4gKwo+PiAraW50IHhlbm1lbV9yZXNlcnZhdGlvbl9kZWNyZWFzZShpbnQgY291 bnQsIHhlbl9wZm5fdCAqZnJhbWVzKTsKPj4gKwo+PiArI2VuZGlmCgpfX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpkcmktZGV2ZWwgbWFpbGluZyBsaXN0CmRy aS1kZXZlbEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5v cmcvbWFpbG1hbi9saXN0aW5mby9kcmktZGV2ZWwK