From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by sourceware.org (Postfix) with ESMTP id EEB583858C39 for ; Thu, 30 Sep 2021 08:52:16 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org EEB583858C39 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 89996D6E; Thu, 30 Sep 2021 01:52:16 -0700 (PDT) Received: from [10.1.32.150] (E121495.Arm.com [10.1.32.150]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id E89E63F793; Thu, 30 Sep 2021 01:52:15 -0700 (PDT) Subject: Re: [PATCH 1v2/3][vect] Add main vectorized loop unrolling To: Richard Biener Cc: "gcc-patches@gcc.gnu.org" , Richard Sandiford References: <4a2e6dde-cc5c-97fe-7a43-bd59d542c2ce@arm.com> <27777876-4201-5e86-bf9a-063143d38641@arm.com> From: "Andre Vieira (lists)" Message-ID: Date: Thu, 30 Sep 2021 09:52:10 +0100 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Thunderbird/78.14.0 MIME-Version: 1.0 In-Reply-To: Content-Type: multipart/mixed; boundary="------------6DE33A6AECC9F1DCFD01FF33" Content-Language: en-US X-Spam-Status: No, score=-11.8 required=5.0 tests=BAYES_00, BODY_8BITS, GIT_PATCH_0, KAM_DMARC_STATUS, KAM_LOTSOFHASH, NICE_REPLY_A, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 30 Sep 2021 08:52:19 -0000 This is a multi-part message in MIME format. --------------6DE33A6AECC9F1DCFD01FF33 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit Hi, >> That just forces trying the vector modes we've tried before. Though I might >> need to revisit this now I think about it. I'm afraid it might be possible for >> this to generate an epilogue with a vf that is not lower than that of the main >> loop, but I'd need to think about this again. >> >> Either way I don't think this changes the vector modes used for the epilogue. >> But maybe I'm just missing your point here. > Yes, I was refering to the above which suggests that when we vectorize > the main loop with V4SF but unroll then we try vectorizing the > epilogue with V4SF as well (but not unrolled). I think that's > premature (not sure if you try V8SF if the main loop was V4SF but > unrolled 4 times). My main motivation for this was because I had a SVE loop that vectorized with both VNx8HI, then V8HI which beat VNx8HI on cost, then it decided to unroll V8HI by two and skipped using VNx8HI as a predicated epilogue which would've been the best choice. So that is why I decided to just 'reset' the vector_mode selection. In a scenario where you only have the traditional vector modes it might make less sense. Just realized I still didn't add any check to make sure the epilogue has a lower VF than the previous loop, though I'm still not sure that could happen. I'll go look at where to add that if you agree with this. >> I can move it there, it would indeed remove the need for the change to >> vect_update_vf_for_slp, the change to >> vect_determine_partial_vectors_and_peeling would still be required I think. It >> is meant to disable using partial vectors in an unrolled loop. > Why would we disable the use of partial vectors in an unrolled loop? The motivation behind that is that the overhead caused by generating predicates for each iteration will likely be too much for it to be profitable to unroll. On top of that, when dealing with low iteration count loops, if executing one predicated iteration would be enough we now still need to execute all other unrolled predicated iterations, whereas if we keep them unrolled we skip the unrolled loops. > Sure but I'm suggesting you keep the not unrolled body as one way of > costed vectorization but then if the target says "try unrolling" > re-do the analysis with the same mode but a larger VF. Just like > we iterate over vector modes you'll now iterate over pairs of > vector mode + VF (unroll factor). It's not about re-using the costing > it's about using costing that is actually relevant and also to avoid > targets inventing two distinct separate costings - a target (powerpc) > might already compute load/store density and other stuff for the main > costing so it should have an idea whether doubling or triplicating is OK. > > Richard. Sounds good! I changed the patch to determine the unrolling factor later, after all analysis has been done and retry analysis if an unrolling factor larger than 1 has been chosen for this loop and vector_mode. gcc/ChangeLog:         * doc/tm.texi: Document TARGET_VECTORIZE_UNROLL_FACTOR.         * doc/tm.texi.in: Add entries for TARGET_VECTORIZE_UNROLL_FACTOR.         * params.opt: Add vect-unroll and vect-unroll-reductions parameters.         * target.def: Define hook TARGET_VECTORIZE_UNROLL_FACTOR.         * targhooks.c (default_unroll_factor): New.         * targhooks.h (default_unroll_factor): Likewise.         * tree-vect-loop.c (_loop_vec_info::_loop_vec_info): Initialize         par_unrolling_factor.         (vect_determine_partial_vectors_and_peeling): Account for unrolling.         (vect_determine_unroll_factor): New.         (vect_try_unrolling): New.         (vect_reanalyze_as_main_loop): Call vect_try_unrolling when         retrying a loop_vinfo as a main loop.         (vect_analyze_loop): Call vect_try_unrolling when vectorizing main loops.         (vect_analyze_loop): Allow for epilogue vectorization when unrolling         and rewalk vector_mode warray for the epilogues.         (vectorizable_reduction): Disable single_defuse_cycle when unrolling.         * tree-vectorizer.h (vect_unroll_value): Declare par_unrolling_factor         as a member of loop_vec_info. --------------6DE33A6AECC9F1DCFD01FF33 Content-Type: text/plain; charset=UTF-8; name="vect_unroll2.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="vect_unroll2.patch" ZGlmZiAtLWdpdCBhL2djYy9kb2MvdG0udGV4aSBiL2djYy9kb2MvdG0udGV4aQppbmRleCBi ZTgxNDg1ODNkODU3MWIwZDAzNWIxOTM4ZGI5ZDA1NmJmZDIxM2E4Li43MWVlMzNhMjAwZmNi ZDM3Y2NkNTM4MDMyMWRmNTA3YWUxZTg5NjFmIDEwMDY0NAotLS0gYS9nY2MvZG9jL3RtLnRl eGkKKysrIGIvZ2NjL2RvYy90bS50ZXhpCkBAIC02Mjg5LDYgKzYyODksMTIgQEAgYWxsb2Nh dGVkIGJ5IFRBUkdFVF9WRUNUT1JJWkVfSU5JVF9DT1NULiAgVGhlIGRlZmF1bHQgcmVsZWFz ZXMgdGhlCiBhY2N1bXVsYXRvci4KIEBlbmQgZGVmdHlwZWZuCiAKK0BkZWZ0eXBlZm4ge1Rh cmdldCBIb29rfSB1bnNpZ25lZCBUQVJHRVRfVkVDVE9SSVpFX1VOUk9MTF9GQUNUT1IgKGNs YXNzIHZlY19pbmZvICpAdmFye3ZpbmZvfSkKK1RoaXMgaG9vayBzaG91bGQgcmV0dXJuIHRo ZSBkZXNpcmVkIHZlY3RvciB1bnJvbGxpbmcgZmFjdG9yIGZvciBhIGxvb3Agd2l0aAorQHZh cnt2aW5mb30uIFRoZSBkZWZhdWx0IHJldHVybnMgb25lLCB3aGljaCBtZWFucyBubyB1bnJv bGxpbmcgd2lsbCBiZQorcGVyZm9ybWVkLgorQGVuZCBkZWZ0eXBlZm4KKwogQGRlZnR5cGVm biB7VGFyZ2V0IEhvb2t9IHRyZWUgVEFSR0VUX1ZFQ1RPUklaRV9CVUlMVElOX0dBVEhFUiAo Y29uc3RfdHJlZSBAdmFye21lbV92ZWN0eXBlfSwgY29uc3RfdHJlZSBAdmFye2luZGV4X3R5 cGV9LCBpbnQgQHZhcntzY2FsZX0pCiBUYXJnZXQgYnVpbHRpbiB0aGF0IGltcGxlbWVudHMg dmVjdG9yIGdhdGhlciBvcGVyYXRpb24uICBAdmFye21lbV92ZWN0eXBlfQogaXMgdGhlIHZl Y3RvciB0eXBlIG9mIHRoZSBsb2FkIGFuZCBAdmFye2luZGV4X3R5cGV9IGlzIHNjYWxhciB0 eXBlIG9mCmRpZmYgLS1naXQgYS9nY2MvZG9jL3RtLnRleGkuaW4gYi9nY2MvZG9jL3RtLnRl eGkuaW4KaW5kZXggZDA4OGVlZTRhZmVjZGJiNTU3NWIwZjRmNzk2YWMzNDRlNDQ0OTE1NS4u M2IzMDUxZjU2NWNjYmY4OGIwN2VlNGY5ZjI4ZTUzY2Y2MDQ4ZDJlMCAxMDA2NDQKLS0tIGEv Z2NjL2RvYy90bS50ZXhpLmluCisrKyBiL2djYy9kb2MvdG0udGV4aS5pbgpAQCAtNDE5OCw2 ICs0MTk4LDggQEAgYWRkcmVzczsgIGJ1dCBvZnRlbiBhIG1hY2hpbmUtZGVwZW5kZW50IHN0 cmF0ZWd5IGNhbiBnZW5lcmF0ZSBiZXR0ZXIgY29kZS4KIAogQGhvb2sgVEFSR0VUX1ZFQ1RP UklaRV9ERVNUUk9ZX0NPU1RfREFUQQogCitAaG9vayBUQVJHRVRfVkVDVE9SSVpFX1VOUk9M TF9GQUNUT1IKKwogQGhvb2sgVEFSR0VUX1ZFQ1RPUklaRV9CVUlMVElOX0dBVEhFUgogCiBA aG9vayBUQVJHRVRfVkVDVE9SSVpFX0JVSUxUSU5fU0NBVFRFUgpkaWZmIC0tZ2l0IGEvZ2Nj L3BhcmFtcy5vcHQgYi9nY2MvcGFyYW1zLm9wdAppbmRleCA2NThjYTAyODg1MTllNWY4MTg1 ZGE2NzUzNWRjNDI1MTdjMjRkMjFjLi5kNmM2MjVjMGE3OGUzYWEyMTgzN2M5NmE2NzU3YTU3 MzM3Y2NlMjJmIDEwMDY0NAotLS0gYS9nY2MvcGFyYW1zLm9wdAorKysgYi9nY2MvcGFyYW1z Lm9wdApAQCAtMTEzNyw0ICsxMTM3LDEyIEBAIENvbnRyb2xzIGhvdyBsb29wIHZlY3Rvcml6 ZXIgdXNlcyBwYXJ0aWFsIHZlY3RvcnMuICAwIG1lYW5zIG5ldmVyLCAxIG1lYW5zIG9ubHkK IENvbW1vbiBKb2luZWQgVUludGVnZXIgVmFyKHBhcmFtX3ZlY3RfaW5uZXJfbG9vcF9jb3N0 X2ZhY3RvcikgSW5pdCg1MCkgSW50ZWdlclJhbmdlKDEsIDEwMDAwKSBQYXJhbSBPcHRpbWl6 YXRpb24KIFRoZSBtYXhpbXVtIGZhY3RvciB3aGljaCB0aGUgbG9vcCB2ZWN0b3JpemVyIGFw cGxpZXMgdG8gdGhlIGNvc3Qgb2Ygc3RhdGVtZW50cyBpbiBhbiBpbm5lciBsb29wIHJlbGF0 aXZlIHRvIHRoZSBsb29wIGJlaW5nIHZlY3Rvcml6ZWQuCiAKKy1wYXJhbT12ZWN0LXVucm9s bD0KK0NvbW1vbiBKb2luZWQgVUludGVnZXIgVmFyKHBhcmFtX3ZlY3RfdW5yb2xsKSBJbml0 KDApIEludGVnZXJSYW5nZSgwLCAzMikgUGFyYW0gT3B0aW1pemF0aW9uCitDb250cm9scyBo b3cgbWFueSB0aW1lcyB0aGUgdmVjdG9yaXplciB0cmllcyB0byB1bnJvbGwgbG9vcHMuICBB bHNvIHNlZSB2ZWN0LXVucm9sbC1yZWR1Y3Rpb25zLgorCistcGFyYW09dmVjdC11bnJvbGwt cmVkdWN0aW9ucz0KK0NvbW1vbiBKb2luZWQgVUludGVnZXIgVmFyKHBhcmFtX3ZlY3RfdW5y b2xsX3JlZHVjdGlvbnMpIEluaXQoMCkgSW50ZWdlclJhbmdlKDAsIDMyKSBQYXJhbSBPcHRp bWl6YXRpb24KK0NvbnRyb2xzIGhvdyBtYW55IHRpbWVzIHRoZSB2ZWN0b3JpemVyIHRyaWVz IHRvIHVucm9sbCBsb29wcyB0aGF0IGNvbnRhaW4gYXNzb2NpYXRpdmUgcmVkdWN0aW9ucy4g IDAgbWVhbnMgdGhhdCBzdWNoIGxvb3BzIHNob3VsZCBiZSB1bnJvbGxlZCB2ZWN0LXVucm9s bCB0aW1lcy4KKwogOyBUaGlzIGNvbW1lbnQgaXMgdG8gZW5zdXJlIHdlIHJldGFpbiB0aGUg YmxhbmsgbGluZSBhYm92ZS4KZGlmZiAtLWdpdCBhL2djYy90YXJnZXQuZGVmIGIvZ2NjL3Rh cmdldC5kZWYKaW5kZXggYmZhODE5NjA5YzIxYmQ3MWMwY2M1ODVjMDFkYmE0MjUzNDQ1M2Y0 Ny4uOGY0OGE0NTNmM2ZmODg2MzgxMTE5MjkxNDEzNTE0ZmFlMGU2NjZlYyAxMDA2NDQKLS0t IGEvZ2NjL3RhcmdldC5kZWYKKysrIGIvZ2NjL3RhcmdldC5kZWYKQEAgLTIwOTUsNiArMjA5 NSwxNiBAQCBhY2N1bXVsYXRvci4iLAogICh2b2lkICpkYXRhKSwKICBkZWZhdWx0X2Rlc3Ry b3lfY29zdF9kYXRhKQogCisvKiBGdW5jdGlvbiB0byBkZXRlcm1pbmUgdW5yb2xsIGZhY3Rv ciBmb3IgdmVjdG9yaXphdGlvbi4gICovCitERUZIT09LCisodW5yb2xsX2ZhY3RvciwKKyAi VGhpcyBob29rIHNob3VsZCByZXR1cm4gdGhlIGRlc2lyZWQgdmVjdG9yIHVucm9sbGluZyBm YWN0b3IgZm9yIGEgbG9vcCB3aXRoXG5cCitAdmFye3ZpbmZvfS4gVGhlIGRlZmF1bHQgcmV0 dXJucyBvbmUsIHdoaWNoIG1lYW5zIG5vIHVucm9sbGluZyB3aWxsIGJlXG5cCitwZXJmb3Jt ZWQuIiwKKyB1bnNpZ25lZCwKKyAoY2xhc3MgdmVjX2luZm8gKnZpbmZvKSwKKyBkZWZhdWx0 X3Vucm9sbF9mYWN0b3IpCisKIEhPT0tfVkVDVE9SX0VORCAodmVjdG9yaXplKQogCiAjdW5k ZWYgSE9PS19QUkVGSVgKZGlmZiAtLWdpdCBhL2djYy90YXJnaG9va3MuaCBiL2djYy90YXJn aG9va3MuaAppbmRleCA5MmQ1MTk5MmU2MjVjMjQ5N2FhODQ5NmIxZTJlM2Q5MTZlNTcwNmZk Li4yMzdkN2Y1MmI3ZjllYzkwM2ZiYzI2NWM5OGIxNTNjYzE3NGI3NDU3IDEwMDY0NAotLS0g YS9nY2MvdGFyZ2hvb2tzLmgKKysrIGIvZ2NjL3Rhcmdob29rcy5oCkBAIC0xMjUsNiArMTI1 LDcgQEAgZXh0ZXJuIHVuc2lnbmVkIGRlZmF1bHRfYWRkX3N0bXRfY29zdCAoY2xhc3MgdmVj X2luZm8gKiwgdm9pZCAqLCBpbnQsCiAJCQkJICAgICAgIGVudW0gdmVjdF9jb3N0X21vZGVs X2xvY2F0aW9uKTsKIGV4dGVybiB2b2lkIGRlZmF1bHRfZmluaXNoX2Nvc3QgKHZvaWQgKiwg dW5zaWduZWQgKiwgdW5zaWduZWQgKiwgdW5zaWduZWQgKik7CiBleHRlcm4gdm9pZCBkZWZh dWx0X2Rlc3Ryb3lfY29zdF9kYXRhICh2b2lkICopOworZXh0ZXJuIHVuc2lnbmVkIGRlZmF1 bHRfdW5yb2xsX2ZhY3RvciAoY2xhc3MgdmVjX2luZm8gKik7CiAKIC8qIE9wZW5BQ0MgaG9v a3MuICAqLwogZXh0ZXJuIGJvb2wgZGVmYXVsdF9nb2FjY192YWxpZGF0ZV9kaW1zICh0cmVl LCBpbnQgW10sIGludCwgdW5zaWduZWQpOwpkaWZmIC0tZ2l0IGEvZ2NjL3Rhcmdob29rcy5j IGIvZ2NjL3Rhcmdob29rcy5jCmluZGV4IGM5YjUyMDg4NTNkYmMxNTcwNmE2NWQxZWIzMzVl MjhlMDU2NDMyNWUuLjgyNmNiZTZhYmI3OWM2YjE3ZjUzMWNmYjgzMzIyMjFjMzYyZGM1MDAg MTAwNjQ0Ci0tLSBhL2djYy90YXJnaG9va3MuYworKysgYi9nY2MvdGFyZ2hvb2tzLmMKQEAg LTE1MzUsNiArMTUzNSwxNCBAQCBkZWZhdWx0X2Rlc3Ryb3lfY29zdF9kYXRhICh2b2lkICpk YXRhKQogICBmcmVlIChkYXRhKTsKIH0KIAorLyogQnkgZGVmYXVsdCwgcmV0dXJuIGEgdmVj dG9yIHVucm9sbCBmYWN0b3Igb2Ygb25lLCBtZWFuaW5nIG5vIHVucm9sbGluZyB3aWxsCisg ICBiZSBwZXJmb3JtZWQuICAqLwordW5zaWduZWQKK2RlZmF1bHRfdW5yb2xsX2ZhY3RvciAo Y2xhc3MgdmVjX2luZm8gKnZpbmZvIEFUVFJJQlVURV9VTlVTRUQpCit7CisgIHJldHVybiAx OworfQorCiAvKiBEZXRlcm1pbmUgd2hldGhlciBvciBub3QgYSBwb2ludGVyIG1vZGUgaXMg dmFsaWQuIEFzc3VtZSBkZWZhdWx0cwogICAgb2YgcHRyX21vZGUgb3IgUG1vZGUgLSBjYW4g YmUgb3ZlcnJpZGRlbi4gICovCiBib29sCmRpZmYgLS1naXQgYS9nY2MvdHJlZS12ZWN0LWxv b3AuYyBiL2djYy90cmVlLXZlY3QtbG9vcC5jCmluZGV4IDVhNWI4ZGEyZTc3MWExZGQyMDRm MjJhNjQ0N2ViYTk2YmIzYjM1MmMuLjM5YjUwMDEwZTA4MWRkM2YwM2NiMzdjOWE1NWIyYmJh NDk5ODFlYzggMTAwNjQ0Ci0tLSBhL2djYy90cmVlLXZlY3QtbG9vcC5jCisrKyBiL2djYy90 cmVlLXZlY3QtbG9vcC5jCkBAIC0zNjUsNiArMzY1LDI0IEBAIHZlY3RfZGV0ZXJtaW5lX3Zl Y3Rvcml6YXRpb25fZmFjdG9yIChsb29wX3ZlY19pbmZvIGxvb3BfdmluZm8pCiAgIGlmIChr bm93bl9sZSAodmVjdG9yaXphdGlvbl9mYWN0b3IsIDFVKSkKICAgICByZXR1cm4gb3B0X3Jl c3VsdDo6ZmFpbHVyZV9hdCAodmVjdF9sb2NhdGlvbiwKIAkJCQkgICAibm90IHZlY3Rvcml6 ZWQ6IHVuc3VwcG9ydGVkIGRhdGEtdHlwZVxuIik7CisgIC8qIEFwcGx5IHVucm9sbGluZyBm YWN0b3IsIHRoaXMgd2FzIGRldGVybWluZWQgYnkKKyAgICAgdmVjdF9kZXRlcm1pbmVfdW5y b2xsX2ZhY3RvciB0aGUgZmlyc3QgdGltZSB3ZSByYW4gdGhlIGFuYWx5c2lzIGZvciB0aGlz CisgICAgIHZlY3RvciBtb2RlLiAgKi8KKyAgaWYgKGxvb3BfdmluZm8tPnBhcl91bnJvbGxp bmdfZmFjdG9yID4gMSkKKyAgICB7CisgICAgICB1bnNpZ25lZCB1bnJvbGxpbmdfZmFjdG9y ID0gbG9vcF92aW5mby0+cGFyX3Vucm9sbGluZ19mYWN0b3I7CisgICAgICB3aGlsZSAodW5y b2xsaW5nX2ZhY3RvciA+IDEpCisJeworCSAgcG9seV91aW50NjQgY2FuZGlkYXRlX2ZhY3Rv ciA9IHZlY3Rvcml6YXRpb25fZmFjdG9yICogdW5yb2xsaW5nX2ZhY3RvcjsKKwkgIGlmIChl c3RpbWF0ZWRfcG9seV92YWx1ZSAoY2FuZGlkYXRlX2ZhY3RvciwgUE9MWV9WQUxVRV9NQVgp CisJICAgICAgPD0gKEhPU1RfV0lERV9JTlQpIExPT1BfVklORk9fTUFYX1ZFQ1RfRkFDVE9S IChsb29wX3ZpbmZvKSkKKwkgICAgeworCSAgICAgIHZlY3Rvcml6YXRpb25fZmFjdG9yID0g Y2FuZGlkYXRlX2ZhY3RvcjsKKwkgICAgICBicmVhazsKKwkgICAgfQorCSAgdW5yb2xsaW5n X2ZhY3RvciAvPSAyOworCX0KKyAgICB9CiAgIExPT1BfVklORk9fVkVDVF9GQUNUT1IgKGxv b3BfdmluZm8pID0gdmVjdG9yaXphdGlvbl9mYWN0b3I7CiAgIHJldHVybiBvcHRfcmVzdWx0 OjpzdWNjZXNzICgpOwogfQpAQCAtODI4LDYgKzg0Niw3IEBAIF9sb29wX3ZlY19pbmZvOjpf bG9vcF92ZWNfaW5mbyAoY2xhc3MgbG9vcCAqbG9vcF9pbiwgdmVjX2luZm9fc2hhcmVkICpz aGFyZWQpCiAgICAgc2tpcF9tYWluX2xvb3BfZWRnZSAobnVsbHB0ciksCiAgICAgc2tpcF90 aGlzX2xvb3BfZWRnZSAobnVsbHB0ciksCiAgICAgcmV1c2FibGVfYWNjdW11bGF0b3JzICgp LAorICAgIHBhcl91bnJvbGxpbmdfZmFjdG9yICgxKSwKICAgICBtYXhfdmVjdG9yaXphdGlv bl9mYWN0b3IgKDApLAogICAgIG1hc2tfc2tpcF9uaXRlcnMgKE5VTExfVFJFRSksCiAgICAg cmdyb3VwX2NvbXBhcmVfdHlwZSAoTlVMTF9UUkVFKSwKQEAgLTIxMjgsMTAgKzIxNDcsMTYg QEAgdmVjdF9kZXRlcm1pbmVfcGFydGlhbF92ZWN0b3JzX2FuZF9wZWVsaW5nIChsb29wX3Zl Y19pbmZvIGxvb3BfdmluZm8sCiAJIHZlY3RvcnMgdG8gdGhlIGVwaWxvZ3VlLCB3aXRoIHRo ZSBtYWluIGxvb3AgY29udGludWluZyB0byBvcGVyYXRlCiAJIG9uIGZ1bGwgdmVjdG9ycy4K IAorCSBJZiB3ZSBhcmUgdW5yb2xsaW5nIHdlIGFsc28gZG8gbm90IHdhbnQgdG8gdXNlIHBh cnRpYWwgdmVjdG9ycy4gVGhpcworCSBpcyB0byBhdm9pZCB0aGUgb3ZlcmhlYWQgb2YgZ2Vu ZXJhdGluZyBtdWx0aXBsZSBtYXNrcyBhbmQgYWxzbyB0bworCSBhdm9pZCBoYXZpbmcgdG8g ZXhlY3V0ZSBlbnRpcmUgaXRlcmF0aW9ucyBvZiBGQUxTRSBtYXNrZWQgaW5zdHJ1Y3Rpb25z CisJIHdoZW4gZGVhbGluZyB3aXRoIG9uZSBvciBsZXNzIGZ1bGwgaXRlcmF0aW9ucy4KKwog CSA/Pz8gV2UgY291bGQgdGhlbiBlbmQgdXAgZmFpbGluZyB0byB1c2UgcGFydGlhbCB2ZWN0 b3JzIGlmIHdlCiAJIGRlY2lkZSB0byBwZWVsIGl0ZXJhdGlvbnMgaW50byBhIHByb2xvZ3Vl LCBhbmQgaWYgdGhlIG1haW4gbG9vcAogCSB0aGVuIGVuZHMgdXAgcHJvY2Vzc2luZyBmZXdl ciB0aGFuIFZGIGl0ZXJhdGlvbnMuICAqLwotICAgICAgaWYgKHBhcmFtX3ZlY3RfcGFydGlh bF92ZWN0b3JfdXNhZ2UgPT0gMQorICAgICAgaWYgKChwYXJhbV92ZWN0X3BhcnRpYWxfdmVj dG9yX3VzYWdlID09IDEKKwkgICB8fCBsb29wX3ZpbmZvLT5wYXJfdW5yb2xsaW5nX2ZhY3Rv ciA+IDEpCiAJICAmJiAhTE9PUF9WSU5GT19FUElMT0dVRV9QIChsb29wX3ZpbmZvKQogCSAg JiYgIXZlY3Rfa25vd25fbml0ZXJzX3NtYWxsZXJfdGhhbl92ZiAobG9vcF92aW5mbykpCiAJ TE9PUF9WSU5GT19FUElMX1VTSU5HX1BBUlRJQUxfVkVDVE9SU19QIChsb29wX3ZpbmZvKSA9 IHRydWU7CkBAIC0yODc5LDYgKzI5MDQsMTE2IEBAIHZlY3Rfam91c3RfbG9vcF92aW5mb3Mg KGxvb3BfdmVjX2luZm8gbmV3X2xvb3BfdmluZm8sCiAgIHJldHVybiB0cnVlOwogfQogCisv KiBEZXRlcm1pbmUgd2hldGhlciB3ZSBzaG91bGQgdW5yb2xsIHRoaXMgbG9vcCBhbmQgYXNr IHRhcmdldCBob3cgbXVjaCB0bworICAgdW5yb2xsIGJ5LiAgKi8KKworc3RhdGljIG9wdF9s b29wX3ZlY19pbmZvCit2ZWN0X2RldGVybWluZV91bnJvbGxfZmFjdG9yIChsb29wX3ZlY19p bmZvIGxvb3BfdmluZm8pCit7CisgIHN0bXRfdmVjX2luZm8gc3RtdF9pbmZvOworICB1bnNp Z25lZCBpOworICBib29sIHNlZW5fcmVkdWN0aW9uX3AgPSBmYWxzZTsKKyAgcG9seV91aW50 NjQgdmVjdG9yaXphdGlvbl9mYWN0b3IgPSBMT09QX1ZJTkZPX1ZFQ1RfRkFDVE9SIChsb29w X3ZpbmZvKTsKKworICBGT1JfRUFDSF9WRUNfRUxUIChsb29wX3ZpbmZvLT5zdG10X3ZlY19p bmZvcywgaSwgc3RtdF9pbmZvKQorICAgIHsKKyAgICAgIGlmIChTVE1UX1ZJTkZPX0lOX1BB VFRFUk5fUCAoc3RtdF9pbmZvKQorCSAgfHwgIVNUTVRfVklORk9fUkVMRVZBTlRfUCAoc3Rt dF9pbmZvKQorCSAgfHwgc3RtdF9pbmZvLT52ZWN0eXBlID09IE5VTExfVFJFRSkKKwljb250 aW51ZTsKKyAgICAgIC8qIERvIG5vdCB1bnJvbGwgbG9vcHMgd2l0aCBuZWdhdGl2ZSBzdGVw cyBhcyBpdCBpcyB1bmxpa2VseSB0aGF0CisJIHZlY3Rvcml6YXRpb24gd2lsbCBzdWNjZWVk IGR1ZSB0byB0aGUgd2F5IHdlIGRlYWwgd2l0aCBuZWdhdGl2ZSBzdGVwcworCSBpbiBsb2Fk cyBhbmQgc3RvcmVzIGluICdnZXRfbG9hZF9zdG9yZV90eXBlJy4gICovCisgICAgICBpZiAo c3RtdF9pbmZvLT5kcl9hdXguZHIKKwkgICYmICFTVE1UX1ZJTkZPX0dBVEhFUl9TQ0FUVEVS X1AgKHN0bXRfaW5mbykpCisJeworCSAgZHJfdmVjX2luZm8gKmRyX2luZm8gPSBTVE1UX1ZJ TkZPX0RSX0lORk8gKHN0bXRfaW5mbyk7CisJICB0cmVlIHN0ZXAgPSB2ZWN0X2RyX2JlaGF2 aW9yIChsb29wX3ZpbmZvLCBkcl9pbmZvKS0+c3RlcDsKKwkgIGlmIChUUkVFX0NPREUgKHN0 ZXApID09IElOVEVHRVJfQ1NUCisJICAgICAgJiYgdHJlZV9pbnRfY3N0X2NvbXBhcmUgKHN0 ZXAsIHNpemVfemVyb19ub2RlKSA8IDApCisJICAgIHsKKwkgICAgICByZXR1cm4gb3B0X2xv b3BfdmVjX2luZm86OmZhaWx1cmVfYXQKKwkJKHZlY3RfbG9jYXRpb24sICJjb3VsZCBub3Qg dW5yb2xsIGR1ZSB0byBuZWdhdGl2ZSBzdGVwXG4iKTsKKwkgICAgfQorCX0KKworICAgICAg aWYgKFNUTVRfVklORk9fREVGX1RZUEUgKHN0bXRfaW5mbykgPT0gdmVjdF9yZWR1Y3Rpb25f ZGVmKQorCXsKKwkgIGF1dG8gcmVkX2luZm8gPSBpbmZvX2Zvcl9yZWR1Y3Rpb24gKGxvb3Bf dmluZm8sIHN0bXRfaW5mbyk7CisJICBpZiAoU1RNVF9WSU5GT19SRURVQ19UWVBFIChyZWRf aW5mbykgPT0gVFJFRV9DT0RFX1JFRFVDVElPTikKKwkgICAgc2Vlbl9yZWR1Y3Rpb25fcCA9 IHRydWU7CisJICBlbHNlCisJICAgIHsKKwkgICAgICByZXR1cm4gb3B0X2xvb3BfdmVjX2lu Zm86OmZhaWx1cmVfYXQKKwkJKHZlY3RfbG9jYXRpb24sICJjb3VsZCBub3QgdW5yb2xsIGxv b3Agd2l0aCByZWR1Y3Rpb24gZHVlIHRvICIKKwkJCQkibm9uIFRSRUVfQ09ERV9SRURVQ1RJ T05cbiIpOworCSAgICB9CisJfQorICAgIH0KKworICB1bnNpZ25lZCBpbnQgdW5yb2xsaW5n X2ZhY3RvciA9IDE7CisgIGlmIChtYXliZV9ndCAodmVjdG9yaXphdGlvbl9mYWN0b3IsIDFV KSkKKyAgICB1bnJvbGxpbmdfZmFjdG9yID0gdmVjdF91bnJvbGxfdmFsdWUgKGxvb3Bfdmlu Zm8sIHNlZW5fcmVkdWN0aW9uX3ApOworCisgIG9wdF9sb29wX3ZlY19pbmZvIHVucm9sbGVk X3ZpbmZvCisgICAgPSBvcHRfbG9vcF92ZWNfaW5mbzo6c3VjY2VzcyAodmVjdF9hbmFseXpl X2xvb3BfZm9ybSAobG9vcF92aW5mby0+bG9vcCwKKwkJCQkJCQkgIGxvb3BfdmluZm8tPnNo YXJlZCkpOworICB1bnJvbGxlZF92aW5mby0+dmVjdG9yX21vZGUgPSBsb29wX3ZpbmZvLT52 ZWN0b3JfbW9kZTsKKyAgdW5yb2xsZWRfdmluZm8tPnBhcl91bnJvbGxpbmdfZmFjdG9yID0g dW5yb2xsaW5nX2ZhY3RvcjsKKyAgcmV0dXJuIHVucm9sbGVkX3ZpbmZvOworfQorCisKKy8q IFRyeSB0byB1bnJvbGwgdGhlIGN1cnJlbnQgbG9vcC4gIEZpcnN0IGRldGVybWluZSB0aGUg dW5yb2xsaW5nIGZhY3RvciB1c2luZworICAgdGhlIGFuYWx5c2lzIGRvbmUgZm9yIHRoZSBj dXJyZW50IHZlY3RvciBtb2RlLiAgVGhlbiByZS1hbmFseXplIHRoZSBsb29wIGZvcgorICAg dGhlIGdpdmVuIHVucm9sbGluZyBmYWN0b3IgYW5kIHRoZSBjdXJyZW50IHZlY3RvciBtb2Rl LiAgKi8KKworc3RhdGljIG9wdF9sb29wX3ZlY19pbmZvCit2ZWN0X3RyeV91bnJvbGxpbmcg KG9wdF9sb29wX3ZlY19pbmZvIGxvb3BfdmluZm8sIHVuc2lnbmVkICpuX3N0bXRzKQorewor ICBEVU1QX1ZFQ1RfU0NPUEUgKCJ2ZWN0X3RyeV91bnJvbGxpbmciKTsKKworICBvcHRfbG9v cF92ZWNfaW5mbyB1bnJvbGxlZF92aW5mbyA9IHZlY3RfZGV0ZXJtaW5lX3Vucm9sbF9mYWN0 b3IgKGxvb3BfdmluZm8pOworICBpZiAodW5yb2xsZWRfdmluZm8pCisgICAgeworICAgICAg aWYgKHVucm9sbGVkX3ZpbmZvLT5wYXJfdW5yb2xsaW5nX2ZhY3RvciA+IDEpCisJeworCSAg aWYgKGR1bXBfZW5hYmxlZF9wICgpKQorCSAgICBkdW1wX3ByaW50Zl9sb2MgKE1TR19OT1RF LCB2ZWN0X2xvY2F0aW9uLAorCQkJICAgICAiKioqKiogdW5yb2xsaW5nIGZhY3RvciAlZCBj aG9zZW4gZm9yIHZlY3RvciBtb2RlICVzLCIKKwkJCSAgICAgInJlLXRyeWluZyBhbmFseXNp cy4uLlxuIiwKKwkJCSAgICAgdW5yb2xsZWRfdmluZm8tPnBhcl91bnJvbGxpbmdfZmFjdG9y LAorCQkJICAgICBHRVRfTU9ERV9OQU1FICh1bnJvbGxlZF92aW5mby0+dmVjdG9yX21vZGUp KTsKKwkgIGJvb2wgdW5yb2xsaW5nX2ZhdGFsID0gZmFsc2U7CisJICBpZiAodmVjdF9hbmFs eXplX2xvb3BfMiAodW5yb2xsZWRfdmluZm8sIHVucm9sbGluZ19mYXRhbCwgbl9zdG10cykK KwkgICAgICAmJiBrbm93bl9uZSAobG9vcF92aW5mby0+dmVjdG9yaXphdGlvbl9mYWN0b3Is CisJCQkgICB1bnJvbGxlZF92aW5mby0+dmVjdG9yaXphdGlvbl9mYWN0b3IpKQorCSAgICB7 CisKKwkgICAgICBsb29wX3ZpbmZvID0gdW5yb2xsZWRfdmluZm87CisJICAgICAgaWYgKGR1 bXBfZW5hYmxlZF9wICgpKQorCQlkdW1wX3ByaW50Zl9sb2MgKE1TR19OT1RFLCB2ZWN0X2xv Y2F0aW9uLAorCQkJCSAidW5yb2xsaW5nIHN1Y2NlZWRlZCB3aXRoIGZhY3RvciA9ICVkXG4i LAorCQkJCSBsb29wX3ZpbmZvLT5wYXJfdW5yb2xsaW5nX2ZhY3Rvcik7CisKKwkgICAgfQor CSAgZWxzZQorCSAgICB7CisJICAgICAgaWYgKGR1bXBfZW5hYmxlZF9wICgpKQorCQlkdW1w X3ByaW50Zl9sb2MgKE1TR19OT1RFLCB2ZWN0X2xvY2F0aW9uLAorCQkJCSAidW5yb2xsaW5n IGZhaWxlZCB3aXRoIGZhY3RvciA9ICVkXG4iLAorCQkJCSB1bnJvbGxlZF92aW5mby0+cGFy X3Vucm9sbGluZ19mYWN0b3IpOworCSAgICB9CisJfQorICAgICAgZWxzZQorCWlmIChkdW1w X2VuYWJsZWRfcCAoKSkKKwkgIGR1bXBfcHJpbnRmX2xvYyAoTVNHX05PVEUsIHZlY3RfbG9j YXRpb24sCisJCQkgICAidGFyZ2V0IGRldGVybWluZWQgdW5yb2xsaW5nIGlzIG5vdCBwcm9m aXRhYmxlLlxuIik7CisgICAgfQorICBsb29wX3ZpbmZvLT5sb29wLT5hdXggPSBOVUxMOwor ICByZXR1cm4gbG9vcF92aW5mbzsKK30KKwogLyogSWYgTE9PUF9WSU5GTyBpcyBhbHJlYWR5 IGEgbWFpbiBsb29wLCByZXR1cm4gaXQgdW5tb2RpZmllZC4gIE90aGVyd2lzZQogICAgdHJ5 IHRvIHJlYW5hbHl6ZSBpdCBhcyBhIG1haW4gbG9vcC4gIFJldHVybiB0aGUgbG9vcF92aW5m byBvbiBzdWNjZXNzCiAgICBhbmQgbnVsbCBvbiBmYWlsdXJlLiAgKi8KQEAgLTI5MDQsNiAr MzAzOSw4IEBAIHZlY3RfcmVhbmFseXplX2FzX21haW5fbG9vcCAobG9vcF92ZWNfaW5mbyBs b29wX3ZpbmZvLCB1bnNpZ25lZCBpbnQgKm5fc3RtdHMpCiAgIGJvb2wgZmF0YWwgPSBmYWxz ZTsKICAgYm9vbCByZXMgPSB2ZWN0X2FuYWx5emVfbG9vcF8yIChtYWluX2xvb3BfdmluZm8s IGZhdGFsLCBuX3N0bXRzKTsKICAgbG9vcC0+YXV4ID0gTlVMTDsKKyAgbWFpbl9sb29wX3Zp bmZvID0gdmVjdF90cnlfdW5yb2xsaW5nIChtYWluX2xvb3BfdmluZm8sIG5fc3RtdHMpOwor CiAgIGlmICghcmVzKQogICAgIHsKICAgICAgIGlmIChkdW1wX2VuYWJsZWRfcCAoKSkKQEAg LTMwMzgsNiArMzE3NSwxMCBAQCB2ZWN0X2FuYWx5emVfbG9vcCAoY2xhc3MgbG9vcCAqbG9v cCwgdmVjX2luZm9fc2hhcmVkICpzaGFyZWQpCiAKICAgICAgIGlmIChyZXMpCiAJeworCSAg LyogT25seSB0cnkgdW5yb2xsaW5nIG1haW4gbG9vcHMuICAqLworCSAgaWYgKCFMT09QX1ZJ TkZPX09SSUdfTE9PUF9JTkZPIChsb29wX3ZpbmZvKSkKKwkgICAgbG9vcF92aW5mbyA9IHZl Y3RfdHJ5X3Vucm9sbGluZyAobG9vcF92aW5mbywgJm5fc3RtdHMpOworCiAJICBMT09QX1ZJ TkZPX1ZFQ1RPUklaQUJMRV9QIChsb29wX3ZpbmZvKSA9IDE7CiAJICB2ZWN0b3JpemVkX2xv b3BzKys7CiAKQEAgLTMwNjIsNyArMzIwMywxNCBAQCB2ZWN0X2FuYWx5emVfbG9vcCAoY2xh c3MgbG9vcCAqbG9vcCwgdmVjX2luZm9fc2hhcmVkICpzaGFyZWQpCiAJCSAgZ2NjX2Fzc2Vy dCAodmVjdF9lcGlsb2d1ZXMpOwogCQkgIGRlbGV0ZSB2aW5mb3MucG9wICgpOwogCQl9CisJ ICAgICAgLyogQ2hlY2sgaWYgd2UgbWF5IHdhbnQgdG8gcmVwbGFjZSB0aGUgY3VycmVudCBm aXJzdF9sb29wX3ZpbmZvCisJCSB3aXRoIHRoZSBuZXcgbG9vcCwgYnV0IG9ubHkgaWYgdGhl eSBoYXZlIGRpZmZlcmVudCB2ZWN0b3IKKwkJIG1vZGVzLiAgSWYgdGhleSBoYXZlIHRoZSBz YW1lIHZlY3RvciBtb2RlIHRoaXMgbWVhbnMgdGhlIG1haW4KKwkJIGxvb3AgaXMgYW4gdW5y b2xsZWQgbG9vcCBhbmQgd2UgYXJlIHRyeWluZyB0byB2ZWN0b3JpemUgdGhlCisJCSBlcGls b2d1ZSB1c2luZyB0aGUgc2FtZSB2ZWN0b3IgbW9kZSBidXQgd2l0aCBhIGxvd2VyCisJCSB2 ZWN0b3JpemF0aW9uIGZhY3Rvci4gICovCiAJICAgICAgaWYgKHZpbmZvcy5pc19lbXB0eSAo KQorCQkgICYmIGxvb3BfdmluZm8tPnZlY3Rvcl9tb2RlICE9IGZpcnN0X2xvb3BfdmluZm8t PnZlY3Rvcl9tb2RlCiAJCSAgJiYgdmVjdF9qb3VzdF9sb29wX3ZpbmZvcyAobG9vcF92aW5m bywgZmlyc3RfbG9vcF92aW5mbykpCiAJCXsKIAkJICBsb29wX3ZlY19pbmZvIG1haW5fbG9v cF92aW5mbwpAQCAtMzE1MywxMyArMzMwMSwzMiBAQCB2ZWN0X2FuYWx5emVfbG9vcCAoY2xh c3MgbG9vcCAqbG9vcCwgdmVjX2luZm9fc2hhcmVkICpzaGFyZWQpCiAKICAgICAgIC8qIEhh bmRsZSB0aGUgY2FzZSB0aGF0IHRoZSBvcmlnaW5hbCBsb29wIGNhbiB1c2UgcGFydGlhbAog CSB2ZWN0b3JpemF0aW9uLCBidXQgd2FudCB0byBvbmx5IGFkb3B0IGl0IGZvciB0aGUgZXBp bG9ndWUuCi0JIFRoZSByZXRyeSBzaG91bGQgYmUgaW4gdGhlIHNhbWUgbW9kZSBhcyBvcmln aW5hbC4gICovCisJIFRoZSByZXRyeSBzaG91bGQgYmUgaW4gdGhlIHNhbWUgbW9kZSBhcyBv cmlnaW5hbC4KKwkgQWxzbyBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgd2UgaGF2ZSB1bnJvbGxl ZCB0aGUgbWFpbiBsb29wIGFuZCB3YW50IHRvCisJIHJldHJ5IGFsbCB2ZWN0b3IgbW9kZXMg YWdhaW4gZm9yIHRoZSBlcGlsb2d1ZXMsIHNpbmNlIHRoZSBWRiBpcyBub3cKKwkgYXQgbGVh c3QgdHdpY2UgYXMgaGlnaCBhcyB0aGUgY3VycmVudCB2ZWN0b3IgbW9kZS4gICovCiAgICAg ICBpZiAodmVjdF9lcGlsb2d1ZXMKIAkgICYmIGxvb3BfdmluZm8KLQkgICYmIExPT1BfVklO Rk9fRVBJTF9VU0lOR19QQVJUSUFMX1ZFQ1RPUlNfUCAobG9vcF92aW5mbykpCisJICAmJiAo TE9PUF9WSU5GT19FUElMX1VTSU5HX1BBUlRJQUxfVkVDVE9SU19QIChsb29wX3ZpbmZvKQor CSAgICAgIHx8IGxvb3BfdmluZm8tPnBhcl91bnJvbGxpbmdfZmFjdG9yID4gMSkpCiAJewot CSAgZ2NjX2Fzc2VydCAoTE9PUF9WSU5GT19DQU5fVVNFX1BBUlRJQUxfVkVDVE9SU19QIChs b29wX3ZpbmZvKQorCSAgZ2NjX2Fzc2VydCAoKExPT1BfVklORk9fQ0FOX1VTRV9QQVJUSUFM X1ZFQ1RPUlNfUCAobG9vcF92aW5mbykKKwkJICAgICAgIHx8IGxvb3BfdmluZm8tPnBhcl91 bnJvbGxpbmdfZmFjdG9yID4gMSkKIAkJICAgICAgJiYgIUxPT1BfVklORk9fVVNJTkdfUEFS VElBTF9WRUNUT1JTX1AgKGxvb3BfdmluZm8pKTsKKwkgIC8qIElmIHdlIGFyZSB1bnJvbGxp bmcsIHRyeSBhbGwgVkVDVE9SX01PREVTIGZvciB0aGUgZXBpbG9ndWUuICAqLworCSAgaWYg KGxvb3BfdmluZm8tPnBhcl91bnJvbGxpbmdfZmFjdG9yID4gMSkKKwkgICAgeworCSAgICAg IG5leHRfdmVjdG9yX21vZGUgPSB2ZWN0b3JfbW9kZXNbMF07CisJICAgICAgbW9kZV9pID0g MTsKKworCSAgICAgIGlmIChkdW1wX2VuYWJsZWRfcCAoKSkKKwkJZHVtcF9wcmludGZfbG9j IChNU0dfTk9URSwgdmVjdF9sb2NhdGlvbiwKKwkJCQkgIioqKioqIFJlLXRyeWluZyBhbmFs eXNpcyB3aXRoIHZlY3RvciBtb2RlIgorCQkJCSAiICVzIGZvciBlcGlsb2d1ZXMgYWZ0ZXIg dW5yb2xsaW5nLlxuIiwKKwkJCQkgR0VUX01PREVfTkFNRSAobmV4dF92ZWN0b3JfbW9kZSkp OworCSAgICAgIGNvbnRpbnVlOworCSAgICB9CisKIAkgIGlmIChkdW1wX2VuYWJsZWRfcCAo KSkKIAkgICAgZHVtcF9wcmludGZfbG9jIChNU0dfTk9URSwgdmVjdF9sb2NhdGlvbiwKIAkJ CSAgICAgIioqKioqIFJlLXRyeWluZyBhbmFseXNpcyB3aXRoIHNhbWUgdmVjdG9yIG1vZGUi CkBAIC03MjEyLDcgKzczNzksOCBAQCB2ZWN0b3JpemFibGVfcmVkdWN0aW9uIChsb29wX3Zl Y19pbmZvIGxvb3BfdmluZm8sCiAgICBwYXJ0aWNpcGF0aW5nLiAgKi8KICAgaWYgKG5jb3Bp ZXMgPiAxCiAgICAgICAmJiAoU1RNVF9WSU5GT19SRUxFVkFOVCAoc3RtdF9pbmZvKSA8PSB2 ZWN0X3VzZWRfb25seV9saXZlKQotICAgICAgJiYgcmVkdWNfY2hhaW5fbGVuZ3RoID09IDEp CisgICAgICAmJiByZWR1Y19jaGFpbl9sZW5ndGggPT0gMQorICAgICAgJiYgbG9vcF92aW5m by0+cGFyX3Vucm9sbGluZ19mYWN0b3IgPT0gMSkKICAgICBzaW5nbGVfZGVmdXNlX2N5Y2xl ID0gdHJ1ZTsKIAogICBpZiAoc2luZ2xlX2RlZnVzZV9jeWNsZSB8fCBsYW5lX3JlZHVjX2Nv ZGVfcCkKZGlmZiAtLWdpdCBhL2djYy90cmVlLXZlY3Rvcml6ZXIuaCBiL2djYy90cmVlLXZl Y3Rvcml6ZXIuaAppbmRleCBjNGM1Njc4ZTdmMWFiYWZjMjVjNDY1MzE5ZGJhY2YzZWY1MGYw YWU5Li42YThiNjMxNWE4ZDMzMzdiMmY3YzhlMTdmZGZlYzgyNTY1YmZhYWI3IDEwMDY0NAot LS0gYS9nY2MvdHJlZS12ZWN0b3JpemVyLmgKKysrIGIvZ2NjL3RyZWUtdmVjdG9yaXplci5o CkBAIC02MjEsNiArNjIxLDExIEBAIHB1YmxpYzoKICAgICAgYWJvdXQgdGhlIHJlZHVjdGlv bnMgdGhhdCBnZW5lcmF0ZWQgdGhlbS4gICovCiAgIGhhc2hfbWFwPHRyZWUsIHZlY3RfcmV1 c2FibGVfYWNjdW11bGF0b3I+IHJldXNhYmxlX2FjY3VtdWxhdG9yczsKIAorICAvKiBUaGUg bnVtYmVyIG9mIHRpbWVzIHRoYXQgd2UndmUgdW5yb2xsZWQgdGhlIHZlY3RvciBsb29wIGlu IG9yZGVyCisgICAgIHRvIHByb21vdGUgbW9yZSBJTFAuICBUaGlzIHZhbHVlIGlzIGZvbGRl ZCBpbnRvIHZlY3Rvcml6YXRpb25fZmFjdG9yCisgICAgIChhbmQgdGhlcmVmb3JlIGV4YWN0 bHkgZGl2aWRlcyB2ZWN0b3JpemF0aW9uX2ZhY3RvcikuICAqLworICB1bnNpZ25lZCBpbnQg cGFyX3Vucm9sbGluZ19mYWN0b3I7CisKICAgLyogTWF4aW11bSBydW50aW1lIHZlY3Rvcml6 YXRpb24gZmFjdG9yLCBvciBNQVhfVkVDVE9SSVpBVElPTl9GQUNUT1IKICAgICAgaWYgdGhl cmUgaXMgbm8gcGFydGljdWxhciBsaW1pdC4gICovCiAgIHVuc2lnbmVkIEhPU1RfV0lERV9J TlQgbWF4X3ZlY3Rvcml6YXRpb25fZmFjdG9yOwpAQCAtMTgyMiw2ICsxODI3LDIwIEBAIHZl Y3RfYXBwbHlfcnVudGltZV9wcm9maXRhYmlsaXR5X2NoZWNrX3AgKGxvb3BfdmVjX2luZm8g bG9vcF92aW5mbykKIAkgICYmIHRoID49IHZlY3RfdmZfZm9yX2Nvc3QgKGxvb3BfdmluZm8p KTsKIH0KIAorLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgdGltZXMgdGhhdCB3ZSBzaG91bGQg dW5yb2xsIGdlbmVyYWwKKyAgIHJlZHVjdGlvbi1mcmVlIGxvb3BzLiAgKi8KKworaW5saW5l IHVuc2lnbmVkIGludAordmVjdF91bnJvbGxfdmFsdWUgKGxvb3BfdmVjX2luZm8gbG9vcF92 aW5mbywgYm9vbCBzZWVuX3JlZHVjdGlvbl9wKQoreworICBpZiAoc2Vlbl9yZWR1Y3Rpb25f cCAmJiBwYXJhbV92ZWN0X3Vucm9sbF9yZWR1Y3Rpb25zID49IDEpCisgICAgcmV0dXJuIHBh cmFtX3ZlY3RfdW5yb2xsX3JlZHVjdGlvbnM7CisgIGlmIChwYXJhbV92ZWN0X3Vucm9sbCA+ PSAxKQorICAgIHJldHVybiBwYXJhbV92ZWN0X3Vucm9sbDsKKyAgZWxzZQorICAgIHJldHVy biB0YXJnZXRtLnZlY3Rvcml6ZS51bnJvbGxfZmFjdG9yIChsb29wX3ZpbmZvKTsKK30KKwog LyogU291cmNlIGxvY2F0aW9uICsgaG90bmVzcyBpbmZvcm1hdGlvbi4gKi8KIGV4dGVybiBk dW1wX3VzZXJfbG9jYXRpb25fdCB2ZWN0X2xvY2F0aW9uOwogCg== --------------6DE33A6AECC9F1DCFD01FF33--