From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 48604 invoked by alias); 30 Sep 2015 10:46:20 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Received: (qmail 48525 invoked by uid 89); 30 Sep 2015 10:46:18 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00,FREEMAIL_FROM,RCVD_IN_DNSWL_LOW,SPF_PASS autolearn=ham version=3.3.2 X-HELO: mail-oi0-f50.google.com Received: from mail-oi0-f50.google.com (HELO mail-oi0-f50.google.com) (209.85.218.50) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-GCM-SHA256 encrypted) ESMTPS; Wed, 30 Sep 2015 10:46:16 +0000 Received: by oiww128 with SMTP id w128so19768769oiw.2 for ; Wed, 30 Sep 2015 03:46:14 -0700 (PDT) MIME-Version: 1.0 X-Received: by 10.202.206.22 with SMTP id e22mr1747209oig.132.1443609973866; Wed, 30 Sep 2015 03:46:13 -0700 (PDT) Received: by 10.202.191.6 with HTTP; Wed, 30 Sep 2015 03:46:13 -0700 (PDT) In-Reply-To: References: Date: Wed, 30 Sep 2015 11:40:00 -0000 Message-ID: Subject: Re: [PATCH] Unswitching outer loops. From: Yuri Rumyantsev To: Richard Biener , gcc-patches , Igor Zamyatin Content-Type: multipart/mixed; boundary=001a113adee6b022f50520f4a3d9 X-SW-Source: 2015-09/txt/msg02319.txt.bz2 --001a113adee6b022f50520f4a3d9 Content-Type: text/plain; charset=UTF-8 Content-length: 10321 Hi Richard, I re-designed outer loop unswitching using basic idea of 23855 patch - hoist invariant guard if loop is empty without guard. Note that this was added to loop unswitching pass with simple modifications - using another loop iterator etc. Bootstrap and regression testing did not show any new failures. What is your opinion? Thanks. ChangeLog: 2015-09-30 Yuri Rumyantsev * tree-ssa-loop-unswitch.c: Include "gimple-iterator.h" and "cfghooks.h", add prototypes for introduced new functions. (tree_ssa_unswitch_loops): Use from innermost loop iterator, move all checks on ability of loop unswitching to tree_unswitch_single_loop; invoke tree_unswitch_single_loop or tree_unswitch_outer_loop depending on innermost loop check. (tree_unswitch_single_loop): Add all required checks on ability of loop unswitching under zero recursive level guard. (tree_unswitch_outer_loop): New function. (find_loop_guard): Likewise. (empty_bb_without_guard_p): Likewise. (used_outside_loop_p): Likewise. (hoist_guard): Likewise. (check_exit_phi): Likewise. gcc/testsuite/ChangeLog: * gcc.dg/loop-unswitch-2.c: New test. 2015-09-16 11:26 GMT+03:00 Richard Biener : > Yeah, as said, the patch wasn't fully ready and it also felt odd to do > this hoisting in loop header copying. Integrating it > with LIM would be a better fit eventually. > > Note that we did agree to go forward with your original patch just > making it more "generically" perform outer loop > unswitching. Did you explore that idea further? > > > > On Tue, Sep 15, 2015 at 6:00 PM, Yuri Rumyantsev wrote: >> Thanks Richard. >> >> I found one more issue that could not be fixed simply. In 23855 you >> consider the following test-case: >> void foo(int *ie, int *je, double *x) >> { >> int i, j; >> for (j=0; j<*je; ++j) >> for (i=0; i<*ie; ++i) >> x[i+j] = 0.0; >> } >> and proposed to hoist up a check on *ie out of loop. It requires >> memref alias analysis since in general x and ie can alias (if their >> types are compatible - int *ie & int * x). Such analysis is performed >> by pre or lim passes. Without such analysis we can not hoist a test on >> non-zero for *ie out of loop using 238565 patch. >> The second concern is that proposed copy header algorithm changes >> loop structure significantly and it is not accepted by vectorizer >> since latch is not empty (such transformation assumes loop peeling for >> one iteration. So I can propose to implement simple guard hoisting >> without copying header and tail blocks (if it is possible). >> >> I will appreciate you for any advice or help since without such >> hoisting we are not able to perform outer loop vectorization for >> important benchmark. >> and >> >> 2015-09-15 14:22 GMT+03:00 Richard Biener : >>> On Thu, Sep 3, 2015 at 6:32 PM, Yuri Rumyantsev wrote: >>>> Hi Richard, >>>> >>>> I started learning, tuning and debugging patch proposed in 23855 and >>>> discovered thta it does not work properly. >>>> So I wonder is it tested patch and it should work? >>> >>> I don't remember, but as it wasn't committed it certainly wasn't ready. >>> >>>> Should it accept for hoisting the following loop nest >>>> for (i=0; i>>> s = 0; >>>> for (j=0; j>>> s += a[i] * b[j]; >>>> c[i] = s; >>>> } >>>> Note that i-loop will nit be empty if m is equal to 0. >>> >>> if m is equal to 0 then we still have the c[i] = s store, no? Of course >>> we could unswitch the outer loop on m == 0 but simple hoisting wouldn't work. >>> >>> Richard. >>> >>>> 2015-08-03 10:27 GMT+03:00 Richard Biener : >>>>> On Fri, Jul 31, 2015 at 1:17 PM, Yuri Rumyantsev wrote: >>>>>> Hi Richard, >>>>>> >>>>>> I learned your updated patch for 23825 and it is more general in >>>>>> comparison with my. >>>>>> I'd like to propose you a compromise - let's consider my patch only >>>>>> for force-vectorize outer loop only to allow outer-loop >>>>>> vecctorization. >>>>> >>>>> I don't see why we should special-case that if the approach in 23825 >>>>> is sensible. >>>>> >>>>>> Note that your approach will not hoist invariant >>>>>> guards if loops contains something else except for inner-loop, i.e. it >>>>>> won't be empty for taken branch. >>>>> >>>>> Yes, it does not perform unswitching but guard hoisting. Note that this >>>>> is originally Zdenek Dvoraks patch. >>>>> >>>>>> I also would like to answer on your last question - CFG cleanup is >>>>>> invoked to perform deletion of single-argument phi nodes from tail >>>>>> block through substitution - such phi's prevent outer-loop >>>>>> vectorization. But it is clear that such transformation can be done >>>>>> other pass. >>>>> >>>>> Hmm, I wonder why the copy_prop pass after unswitching does not >>>>> get rid of them? >>>>> >>>>>> What is your opinion? >>>>> >>>>> My opinion is that if we want to enhance unswitching to catch this >>>>> (or similar) cases then we should make it a lot more general than >>>>> your pattern-matching approach. I see nothing that should prevent >>>>> us from considering unswitching non-innermost loops in general. >>>>> It should be only a cost consideration to not do non-innermost loop >>>>> unswitching (in addition to maybe a --param specifying the maximum >>>>> depth of a loop nest to unswitch). >>>>> >>>>> So my first thought when seeing your patch still holds - the patch >>>>> looks very much too specific. >>>>> >>>>> Richard. >>>>> >>>>>> Yuri. >>>>>> >>>>>> 2015-07-28 13:50 GMT+03:00 Richard Biener : >>>>>>> On Thu, Jul 23, 2015 at 4:45 PM, Yuri Rumyantsev wrote: >>>>>>>> Hi Richard, >>>>>>>> >>>>>>>> I checked that both test-cases from 23855 are sucessfully unswitched >>>>>>>> by proposed patch. I understand that it does not catch deeper loop >>>>>>>> nest as >>>>>>>> for (i=0; i<10; i++) >>>>>>>> for (j=0;j>>>>>>> for (k=0;k<20;k++) >>>>>>>> ... >>>>>>>> but duplication of middle-loop does not look reasonable. >>>>>>>> >>>>>>>> Here is dump for your second test-case: >>>>>>>> >>>>>>>> void foo(int *ie, int *je, double *x) >>>>>>>> { >>>>>>>> int i, j; >>>>>>>> for (j=0; j<*je; ++j) >>>>>>>> for (i=0; i<*ie; ++i) >>>>>>>> x[i+j] = 0.0; >>>>>>>> } >>>>>>>> grep -i unswitch t6.c.119t.unswitch >>>>>>>> ;; Unswitching outer loop >>>>>>> >>>>>>> I was saying that why go with a limited approach when a patch (in >>>>>>> unknown state...) >>>>>>> is available that does it more generally? Also unswitching is quite >>>>>>> expensive compared >>>>>>> to "moving" the invariant condition. >>>>>>> >>>>>>> In your patch: >>>>>>> >>>>>>> + if (!nloop->force_vectorize) >>>>>>> + nloop->force_vectorize = true; >>>>>>> + if (loop->safelen != 0) >>>>>>> + nloop->safelen = loop->safelen; >>>>>>> >>>>>>> I see no guard on force_vectorize so = true looks bogus here. Please just use >>>>>>> copy_loop_info. >>>>>>> >>>>>>> + if (integer_nonzerop (cond_new)) >>>>>>> + gimple_cond_set_condition_from_tree (cond_stmt, boolean_true_node); >>>>>>> + else if (integer_zerop (cond_new)) >>>>>>> + gimple_cond_set_condition_from_tree (cond_stmt, boolean_false_node); >>>>>>> >>>>>>> gimple_cond_make_true/false (cond_stmt); >>>>>>> >>>>>>> btw, seems odd that we have to recompute which loop is the true / false variant >>>>>>> when we just fed a guard condition to loop_version. Can't we statically >>>>>>> determine whether loop or nloop has the in-loop condition true or false? >>>>>>> >>>>>>> + /* Clean-up cfg to remove useless one-argument phi in exit block of >>>>>>> + outer-loop. */ >>>>>>> + cleanup_tree_cfg (); >>>>>>> >>>>>>> I know unswitching is already O(number-of-unswitched-loops * size-of-function) >>>>>>> because it updates SSA form after each individual unswitching (and it does that >>>>>>> because it invokes itself recursively on unswitched loops). But do you really >>>>>>> need to invoke CFG cleanup here? >>>>>>> >>>>>>> Richard. >>>>>>> >>>>>>>> Yuri. >>>>>>>> >>>>>>>> 2015-07-14 14:06 GMT+03:00 Richard Biener : >>>>>>>>> On Fri, Jul 10, 2015 at 12:02 PM, Yuri Rumyantsev wrote: >>>>>>>>>> Hi All, >>>>>>>>>> >>>>>>>>>> Here is presented simple transformation which tries to hoist out of >>>>>>>>>> outer-loop a check on zero trip count for inner-loop. This is very >>>>>>>>>> restricted transformation since it accepts outer-loops with very >>>>>>>>>> simple cfg, as for example: >>>>>>>>>> acc = 0; >>>>>>>>>> for (i = 1; i <= m; i++) { >>>>>>>>>> for (j = 0; j < n; j++) >>>>>>>>>> if (l[j] == i) { v[j] = acc; acc++; }; >>>>>>>>>> acc <<= 1; >>>>>>>>>> } >>>>>>>>>> >>>>>>>>>> Note that degenerative outer loop (without inner loop) will be >>>>>>>>>> completely deleted as dead code. >>>>>>>>>> The main goal of this transformation was to convert outer-loop to form >>>>>>>>>> accepted by outer-loop vectorization (such test-case is also included >>>>>>>>>> to patch). >>>>>>>>>> >>>>>>>>>> Bootstrap and regression testing did not show any new failures. >>>>>>>>>> >>>>>>>>>> Is it OK for trunk? >>>>>>>>> >>>>>>>>> I think this is >>>>>>>>> >>>>>>>>> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=23855 >>>>>>>>> >>>>>>>>> as well. It has a patch adding a invariant loop guard hoisting >>>>>>>>> phase to loop-header copying. Yeah, it needs updating to >>>>>>>>> trunk again I suppose. It's always non-stage1 when I come >>>>>>>>> back to that patch. >>>>>>>>> >>>>>>>>> Your patch seems to be very specific and only handles outer >>>>>>>>> loops of innermost loops. >>>>>>>>> >>>>>>>>> Richard. >>>>>>>>> >>>>>>>>>> ChangeLog: >>>>>>>>>> 2015-07-10 Yuri Rumyantsev >>>>>>>>>> >>>>>>>>>> * tree-ssa-loop-unswitch.c: Include "tree-cfgcleanup.h" and >>>>>>>>>> "gimple-iterator.h", add prototype for tree_unswitch_outer_loop. >>>>>>>>>> (tree_ssa_unswitch_loops): Add invoke of tree_unswitch_outer_loop. >>>>>>>>>> (tree_unswitch_outer_loop): New function. >>>>>>>>>> >>>>>>>>>> gcc/testsuite/ChangeLog: >>>>>>>>>> * gcc.dg/tree-ssa/unswitch-outer-loop-1.c: New test. >>>>>>>>>> * gcc.dg/vect/vect-outer-simd-3.c: New test. --001a113adee6b022f50520f4a3d9 Content-Type: application/octet-stream; name="patch.new" Content-Disposition: attachment; filename="patch.new" Content-Transfer-Encoding: base64 X-Attachment-Id: f_if6o34nw0 Content-length: 20200 ZGlmZiAtLWdpdCBhL2djYy90ZXN0c3VpdGUvZ2NjLmRnL2xvb3AtdW5zd2l0 Y2gtMi5jIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvbG9vcC11bnN3aXRjaC0y LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDEyYzA3 YgotLS0gL2Rldi9udWxsCisrKyBiL2djYy90ZXN0c3VpdGUvZ2NjLmRnL2xv b3AtdW5zd2l0Y2gtMi5jCkBAIC0wLDAgKzEsMTYgQEAKKy8qIHsgZGctZG8g Y29tcGlsZSB9ICovDQorLyogeyBkZy1vcHRpb25zICItTzIgLWZ1bnN3aXRj aC1sb29wcyAtZmR1bXAtdHJlZS11bnN3aXRjaC1kZXRhaWxzIiB9ICovDQor DQordm9pZCBmb28gKGZsb2F0ICoqYSwgZmxvYXQgKipiLCBmbG9hdCAqYywg aW50IG4sIGludCBtLCBpbnQgbCkNCit7DQorICBpbnQgaSxqLGs7DQorICBm bG9hdCBzOw0KKyAgZm9yIChpPTA7IGk8bDsgaSsrKQ0KKyAgICB7DQorICAg ICAgZm9yIChqPTA7IGo8bjsgaisrKQ0KKwlmb3IgKGs9MDsgazxtOyBrKysp DQorCSAgY1tpXSArPSBhW2ldW2tdICogYltrXVtqXTsNCisgICAgfQ0KK30N CisNCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAtdGltZXMgImd1 YXJkIGhvaXN0ZWQiIDIgInVuc3dpdGNoIiB9IH0gKi8gCmRpZmYgLS1naXQg YS9nY2MvdHJlZS1zc2EtbG9vcC11bnN3aXRjaC5jIGIvZ2NjL3RyZWUtc3Nh LWxvb3AtdW5zd2l0Y2guYwppbmRleCBhMjczNjM4Li45Mzg1NTAzIDEwMDY0 NAotLS0gYS9nY2MvdHJlZS1zc2EtbG9vcC11bnN3aXRjaC5jCisrKyBiL2dj Yy90cmVlLXNzYS1sb29wLXVuc3dpdGNoLmMKQEAgLTM5LDYgKzM5LDggQEAg YWxvbmcgd2l0aCBHQ0M7IHNlZSB0aGUgZmlsZSBDT1BZSU5HMy4gIElmIG5v dCBzZWUKICNpbmNsdWRlICJwYXJhbXMuaCIKICNpbmNsdWRlICJ0cmVlLXBh c3MuaCIKICNpbmNsdWRlICJ0cmVlLWlubGluZS5oIgorI2luY2x1ZGUgImdp bXBsZS1pdGVyYXRvci5oIgorI2luY2x1ZGUgImNmZ2hvb2tzLmgiCiAKIC8q IFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBsb29wIHVuc3dpdGNoaW5nLCBp LmUuIHRyYW5zZm9ybWF0aW9uIG9mIGxvb3BzIGxpa2UKIApAQCAtNzksNiAr ODEsMTIgQEAgYWxvbmcgd2l0aCBHQ0M7IHNlZSB0aGUgZmlsZSBDT1BZSU5H My4gIElmIG5vdCBzZWUKIHN0YXRpYyBzdHJ1Y3QgbG9vcCAqdHJlZV91bnN3 aXRjaF9sb29wIChzdHJ1Y3QgbG9vcCAqLCBiYXNpY19ibG9jaywgdHJlZSk7 CiBzdGF0aWMgYm9vbCB0cmVlX3Vuc3dpdGNoX3NpbmdsZV9sb29wIChzdHJ1 Y3QgbG9vcCAqLCBpbnQpOwogc3RhdGljIHRyZWUgdHJlZV9tYXlfdW5zd2l0 Y2hfb24gKGJhc2ljX2Jsb2NrLCBzdHJ1Y3QgbG9vcCAqKTsKK3N0YXRpYyBi b29sIHRyZWVfdW5zd2l0Y2hfb3V0ZXJfbG9vcCAoc3RydWN0IGxvb3AgKik7 CitzdGF0aWMgZWRnZSBmaW5kX2xvb3BfZ3VhcmQgKHN0cnVjdCBsb29wICop Oworc3RhdGljIGJvb2wgZW1wdHlfYmJfd2l0aG91dF9ndWFyZF9wIChzdHJ1 Y3QgbG9vcCAqLCBiYXNpY19ibG9jayk7CitzdGF0aWMgYm9vbCB1c2VkX291 dHNpZGVfbG9vcF9wIChzdHJ1Y3QgbG9vcCAqLCB0cmVlKTsKK3N0YXRpYyB2 b2lkIGhvaXN0X2d1YXJkIChzdHJ1Y3QgbG9vcCAqLCBlZGdlKTsKK3N0YXRp YyBib29sIGNoZWNrX2V4aXRfcGhpIChzdHJ1Y3QgbG9vcCAqKTsKIAogLyog TWFpbiBlbnRyeSBwb2ludC4gIFBlcmZvcm0gbG9vcCB1bnN3aXRjaGluZyBv biBhbGwgc3VpdGFibGUgbG9vcHMuICAqLwogCkBAIC04Nyw0MiArOTUsMTUg QEAgdHJlZV9zc2FfdW5zd2l0Y2hfbG9vcHMgKHZvaWQpCiB7CiAgIHN0cnVj dCBsb29wICpsb29wOwogICBib29sIGNoYW5nZWQgPSBmYWxzZTsKLSAgSE9T VF9XSURFX0lOVCBpdGVyYXRpb25zOwogCi0gIC8qIEdvIHRocm91Z2ggaW5u ZXIgbG9vcHMgKG9ubHkgb3JpZ2luYWwgb25lcykuICAqLwotICBGT1JfRUFD SF9MT09QIChsb29wLCBMSV9PTkxZX0lOTkVSTU9TVCkKKyAgLyogR28gdGhy b3VnaCBhbGwgbG9vcHMgc3RhcnRpbmcgZnJvbSBpbm5lcm1vc3QuICAqLwor ICBGT1JfRUFDSF9MT09QIChsb29wLCBMSV9GUk9NX0lOTkVSTU9TVCkKICAg ICB7Ci0gICAgICBpZiAoZHVtcF9maWxlICYmIChkdW1wX2ZsYWdzICYgVERG X0RFVEFJTFMpKQotICAgICAgICBmcHJpbnRmIChkdW1wX2ZpbGUsICI7OyBD b25zaWRlcmluZyBsb29wICVkXG4iLCBsb29wLT5udW0pOwotCi0gICAgICAv KiBEbyBub3QgdW5zd2l0Y2ggaW4gY29sZCByZWdpb25zLiAqLwotICAgICAg aWYgKG9wdGltaXplX2xvb3BfZm9yX3NpemVfcCAobG9vcCkpCi0gICAgICAg IHsKLSAgICAgICAgICBpZiAoZHVtcF9maWxlICYmIChkdW1wX2ZsYWdzICYg VERGX0RFVEFJTFMpKQotICAgICAgICAgICAgZnByaW50ZiAoZHVtcF9maWxl LCAiOzsgTm90IHVuc3dpdGNoaW5nIGNvbGQgbG9vcHNcbiIpOwotICAgICAg ICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgIC8qIFRoZSBsb29w IHNob3VsZCBub3QgYmUgdG9vIGxhcmdlLCB0byBsaW1pdCBjb2RlIGdyb3d0 aC4gKi8KLSAgICAgIGlmICh0cmVlX251bV9sb29wX2luc25zIChsb29wLCAm ZW5pX3NpemVfd2VpZ2h0cykKLSAgICAgICAgICA+ICh1bnNpZ25lZCkgUEFS QU1fVkFMVUUgKFBBUkFNX01BWF9VTlNXSVRDSF9JTlNOUykpCi0gICAgICAg IHsKLSAgICAgICAgICBpZiAoZHVtcF9maWxlICYmIChkdW1wX2ZsYWdzICYg VERGX0RFVEFJTFMpKQotICAgICAgICAgICAgZnByaW50ZiAoZHVtcF9maWxl LCAiOzsgTm90IHVuc3dpdGNoaW5nLCBsb29wIHRvbyBiaWdcbiIpOwotICAg ICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgIC8qIElmIHRo ZSBsb29wIGlzIG5vdCBleHBlY3RlZCB0byBpdGVyYXRlLCB0aGVyZSBpcyBu byBuZWVkCi0JIGZvciB1bnN3aXRjaGluZy4gICovCi0gICAgICBpdGVyYXRp b25zID0gZXN0aW1hdGVkX2xvb3BfaXRlcmF0aW9uc19pbnQgKGxvb3ApOwot ICAgICAgaWYgKGl0ZXJhdGlvbnMgPj0gMCAmJiBpdGVyYXRpb25zIDw9IDEp Ci0JewotICAgICAgICAgIGlmIChkdW1wX2ZpbGUgJiYgKGR1bXBfZmxhZ3Mg JiBUREZfREVUQUlMUykpCi0gICAgICAgICAgICBmcHJpbnRmIChkdW1wX2Zp bGUsICI7OyBOb3QgdW5zd2l0Y2hpbmcsIGxvb3AgaXMgbm90IGV4cGVjdGVk IHRvIGl0ZXJhdGVcbiIpOwotICAgICAgICAgIGNvbnRpbnVlOwotCX0KLQot ICAgICAgY2hhbmdlZCB8PSB0cmVlX3Vuc3dpdGNoX3NpbmdsZV9sb29wIChs b29wLCAwKTsKKyAgICAgIGlmICghbG9vcC0+aW5uZXIpCisJLyogVW5zd2l0 Y2ggaW5uZXJtb3N0IGxvb3AuICAqLworCWNoYW5nZWQgfD0gdHJlZV91bnN3 aXRjaF9zaW5nbGVfbG9vcCAobG9vcCwgMCk7CisgICAgICBlbHNlCisJY2hh bmdlZCB8PSB0cmVlX3Vuc3dpdGNoX291dGVyX2xvb3AgKGxvb3ApOwogICAg IH0KIAogICBpZiAoY2hhbmdlZCkKQEAgLTIxNiw2ICsxOTcsMzkgQEAgdHJl ZV91bnN3aXRjaF9zaW5nbGVfbG9vcCAoc3RydWN0IGxvb3AgKmxvb3AsIGlu dCBudW0pCiAgIHRyZWUgY29uZCA9IE5VTExfVFJFRTsKICAgZ2ltcGxlIHN0 bXQ7CiAgIGJvb2wgY2hhbmdlZCA9IGZhbHNlOworICBIT1NUX1dJREVfSU5U IGl0ZXJhdGlvbnM7CisKKyAgLyogUGVyZm9ybSBpbml0aWFsIHRlc3RzIGlm IHVuc3dpdGNoIGlzIGVsaWdpYmxlLiAgKi8KKyAgaWYgKG51bSA9PSAwKQor ICAgIHsKKyAgICAgIC8qIERvIG5vdCB1bnN3aXRjaCBpbiBjb2xkIHJlZ2lv bnMuICovCisgICAgICBpZiAob3B0aW1pemVfbG9vcF9mb3Jfc2l6ZV9wIChs b29wKSkKKwl7CisJICBpZiAoZHVtcF9maWxlICYmIChkdW1wX2ZsYWdzICYg VERGX0RFVEFJTFMpKQorCSAgICBmcHJpbnRmIChkdW1wX2ZpbGUsICI7OyBO b3QgdW5zd2l0Y2hpbmcgY29sZCBsb29wc1xuIik7CisJICByZXR1cm4gZmFs c2U7CisJfQorCisgICAgICAvKiBUaGUgbG9vcCBzaG91bGQgbm90IGJlIHRv byBsYXJnZSwgdG8gbGltaXQgY29kZSBncm93dGguICovCisgICAgICBpZiAo dHJlZV9udW1fbG9vcF9pbnNucyAobG9vcCwgJmVuaV9zaXplX3dlaWdodHMp CisJICA+ICh1bnNpZ25lZCkgUEFSQU1fVkFMVUUgKFBBUkFNX01BWF9VTlNX SVRDSF9JTlNOUykpCisJeworCSAgaWYgKGR1bXBfZmlsZSAmJiAoZHVtcF9m bGFncyAmIFRERl9ERVRBSUxTKSkKKwkgICAgZnByaW50ZiAoZHVtcF9maWxl LCAiOzsgTm90IHVuc3dpdGNoaW5nLCBsb29wIHRvbyBiaWdcbiIpOworCSAg cmV0dXJuIGZhbHNlOworCX0KKworICAgICAgLyogSWYgdGhlIGxvb3AgaXMg bm90IGV4cGVjdGVkIHRvIGl0ZXJhdGUsIHRoZXJlIGlzIG5vIG5lZWQKKwkg Zm9yIHVuc3dpdGNoaW5nLiAgKi8KKyAgICAgIGl0ZXJhdGlvbnMgPSBlc3Rp bWF0ZWRfbG9vcF9pdGVyYXRpb25zX2ludCAobG9vcCk7CisgICAgICBpZiAo aXRlcmF0aW9ucyA+PSAwICYmIGl0ZXJhdGlvbnMgPD0gMSkKKwl7CisJICBp ZiAoZHVtcF9maWxlICYmIChkdW1wX2ZsYWdzICYgVERGX0RFVEFJTFMpKQor CSAgICBmcHJpbnRmIChkdW1wX2ZpbGUsICI7OyBOb3QgdW5zd2l0Y2hpbmcs IGxvb3AgaXMgbm90IGV4cGVjdGVkIgorCQkgICAgICIgdG8gaXRlcmF0ZVxu Iik7CisJICByZXR1cm4gZmFsc2U7CisJfQorICAgIH0KIAogICBpID0gMDsK ICAgYmJzID0gZ2V0X2xvb3BfYm9keSAobG9vcCk7CkBAIC00MDMsNiArNDE3 LDM1OSBAQCB0cmVlX3Vuc3dpdGNoX2xvb3AgKHN0cnVjdCBsb29wICpsb29w LAogCQkgICAgICAgUkVHX0JSX1BST0JfQkFTRSAtIHByb2JfdHJ1ZSwgZmFs c2UpOwogfQogCisvKiBVbnN3aXRjaCBvdXRlciBsb29wcyBieSBob2lzdGlu ZyBpbnZhcmlhbnQgZ3VhcmQgb24KKyAgIGlubmVyIGxvb3Agd2l0aG91dCBj b2RlIGR1cGxpY2F0aW9uLiAgKi8KK3N0YXRpYyBib29sCit0cmVlX3Vuc3dp dGNoX291dGVyX2xvb3AgKHN0cnVjdCBsb29wICpsb29wKQoreworICBlZGdl IGV4aXQsIGd1YXJkOworCisgIGdjY19hc3NlcnQgKGxvb3AtPmlubmVyKTsK KyAgaWYgKGxvb3AtPmlubmVyLT5uZXh0KQorICAgIHJldHVybiBmYWxzZTsK KyAgLyogQWNjZXB0IGxvb3BzIHdpdGggc2luZ2xlIGV4aXQgb25seS4gICov CisgIGV4aXQgPSBzaW5nbGVfZXhpdCAobG9vcCk7CisgIGlmICghZXhpdCkK KyAgICByZXR1cm4gZmFsc2U7CisgIC8qIENoZWNrIHRoYXQgcGhpIGFyZ3Vt ZW50IG9mIGV4aXQgZWRnZSBpcyBub3QgZGVmaW5lZCBpbnNpZGUgbG9vcC4g ICovCisgIGlmICghY2hlY2tfZXhpdF9waGkgKGxvb3ApKQorICAgIHJldHVy biBmYWxzZTsKKyAgLyogTG9vcCBtdXN0IG5vdCBiZSBpbmZpbml0ZS4gICov CisgIGlmICghZmluaXRlX2xvb3BfcCAobG9vcCkpCisgICAgcmV0dXJuIGZh bHNlOworICBndWFyZCA9IGZpbmRfbG9vcF9ndWFyZCAobG9vcCk7CisgIGlm IChndWFyZCkKKyAgICB7CisgICAgICBob2lzdF9ndWFyZCAobG9vcCwgZ3Vh cmQpOworICAgICAgdXBkYXRlX3NzYSAoVE9ET191cGRhdGVfc3NhKTsKKyAg ICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgcmV0dXJuIGZhbHNlOworfQor CisvKiBDaGVja3MgaWYgdGhlIGJvZHkgb2YgdGhlIExPT1AgaXMgd2l0aGlu IGFuIGludmFyaWFudCBndWFyZC4gIElmIHRoaXMKKyAgIGlzIHRoZSBjYXNl LCByZXR1cm5zIHRoZSBlZGdlIHRoYXQganVtcHMgb3ZlciB0aGUgcmVhbCBi b2R5IG9mIHRoZSBsb29wLAorICAgb3RoZXJ3aXNlIHJldHVybnMgTlVMTC4g ICovCisKK3N0YXRpYyBlZGdlCitmaW5kX2xvb3BfZ3VhcmQgKHN0cnVjdCBs b29wICpsb29wKQoreworICBiYXNpY19ibG9jayBoZWFkZXIgPSBsb29wLT5o ZWFkZXI7CisgIGVkZ2UgZ3VhcmRfZWRnZSwgdGUsIGZlOworICAvKiBiaXRt YXAgcHJvY2Vzc2VkLCBrbm93bl9pbnZhcmlhbnRzOyovCisgIGJhc2ljX2Js b2NrICpib2R5ID0gTlVMTDsKKyAgdW5zaWduZWQgaTsKKyAgdHJlZSB1c2U7 CisgIHNzYV9vcF9pdGVyIGl0ZXI7CisKKyAgLyogV2UgY2hlY2sgZm9yIHRo ZSBmb2xsb3dpbmcgc2l0dWF0aW9uOgorCisgICAgIHdoaWxlICgxKQorICAg ICAgIHsKKwkgW2hlYWRlcl1dCisgICAgICAgICBsb29wX3BoaV9ub2RlczsK Kwkgc29tZXRoaW5nMTsKKwkgaWYgKGNvbmQxKQorCSAgIGJvZHk7CisJIG52 YXIgPSBwaGkob3JpZywgYnZhcikgLi4uIGZvciBhbGwgdmFyaWFibGVzIGNo YW5nZWQgaW4gYm9keTsKKwkgW2d1YXJkX2VuZF0KKwkgc29tZXRoaW5nMjsK KwkgaWYgKGNvbmQyKQorCSAgIGJyZWFrOworCSBzb21ldGhpbmczOworICAg ICAgIH0KKworICAgICB3aGVyZToKKworICAgICAxKSBjb25kMSBpcyBsb29w IGludmFyaWFudAorICAgICAyKSBJZiBjb25kMSBpcyBmYWxzZSwgdGhlbiB0 aGUgbG9vcCBpcyBlc3NlbnRpYWxseSBlbXB0eTsgaS5lLiwKKwlhKSBub3Ro aW5nIGluIHNvbWV0aGluZzEsIHNvbWV0aGluZzIgYW5kIHNvbWV0aGluZzMg aGFzIHNpZGUKKwkgICBlZmZlY3RzCisJYikgYW55dGhpbmcgZGVmaW5lZCBp biBzb21ldGhpbmcxLCBzb21ldGhpbmcyIGFuZCBzb21ldGhpbmczCisJICAg aXMgbm90IHVzZWQgb3V0c2lkZSBvZiB0aGUgbG9vcC4gICovCisKKyAgd2hp bGUgKHNpbmdsZV9zdWNjX3AgKGhlYWRlcikpCisgICAgaGVhZGVyID0gc2lu Z2xlX3N1Y2MgKGhlYWRlcik7CisgIGlmICghbGFzdF9zdG10IChoZWFkZXIp CisgICAgICB8fCBnaW1wbGVfY29kZSAobGFzdF9zdG10IChoZWFkZXIpKSAh PSBHSU1QTEVfQ09ORCkKKyAgICByZXR1cm4gTlVMTDsKKworICBleHRyYWN0 X3RydWVfZmFsc2VfZWRnZXNfZnJvbV9ibG9jayAoaGVhZGVyLCAmdGUsICZm ZSk7CisgIGlmICghZmxvd19iYl9pbnNpZGVfbG9vcF9wIChsb29wLCB0ZS0+ ZGVzdCkKKyAgICAgIHx8ICFmbG93X2JiX2luc2lkZV9sb29wX3AgKGxvb3As IGZlLT5kZXN0KSkKKyAgICByZXR1cm4gTlVMTDsKKworICBpZiAoanVzdF9v bmNlX2VhY2hfaXRlcmF0aW9uX3AgKGxvb3AsIHRlLT5kZXN0KQorICAgICAg fHwgKHNpbmdsZV9zdWNjX3AgKHRlLT5kZXN0KQorCSAgJiYganVzdF9vbmNl X2VhY2hfaXRlcmF0aW9uX3AgKGxvb3AsIHNpbmdsZV9zdWNjICh0ZS0+ZGVz dCkpKSkKKyAgICB7CisgICAgICBpZiAoanVzdF9vbmNlX2VhY2hfaXRlcmF0 aW9uX3AgKGxvb3AsIGZlLT5kZXN0KSkKKwlyZXR1cm4gTlVMTDsKKyAgICAg IGd1YXJkX2VkZ2UgPSB0ZTsKKyAgICB9CisgIGVsc2UgaWYgKGp1c3Rfb25j ZV9lYWNoX2l0ZXJhdGlvbl9wIChsb29wLCBmZS0+ZGVzdCkKKwkgICB8fCAo c2luZ2xlX3N1Y2NfcCAoZmUtPmRlc3QpCisJICAgICAgICYmIGp1c3Rfb25j ZV9lYWNoX2l0ZXJhdGlvbl9wIChsb29wLCBzaW5nbGVfc3VjYyAoZmUtPmRl c3QpKSkpCisgICAgZ3VhcmRfZWRnZSA9IGZlOworICBlbHNlCisgICAgcmV0 dXJuIE5VTEw7CisKKyAgaWYgKGR1bXBfZmlsZSAmJiAoZHVtcF9mbGFncyAm IFRERl9ERVRBSUxTKSkKKyAgICBmcHJpbnRmIChkdW1wX2ZpbGUsCisJICAg ICAiQ29uc2lkZXJpbmcgZ3VhcmQgJWQgLT4gJWQgaW4gbG9vcCAlZFxuIiwK KwkgICAgIGd1YXJkX2VkZ2UtPnNyYy0+aW5kZXgsIGd1YXJkX2VkZ2UtPmRl c3QtPmluZGV4LCBsb29wLT5udW0pOworICAvKiBDaGVjayBpZiBjb25kaXRp b24gb3BlcmFuZHMgZG8gbm90IGhhdmUgZGVmaW5pdGlvbnMgaW5zaWRlIGxv b3Agc2luY2UKKyAgICAgYW55IGJiIGNvcHlpbmcgaXMgbm90IHBlcmZvcm1l ZC4gICovCisgIEZPUl9FQUNIX1NTQV9UUkVFX09QRVJBTkQgKHVzZSwgbGFz dF9zdG10IChoZWFkZXIpLCBpdGVyLCBTU0FfT1BfVVNFKQorICAgIHsKKyAg ICAgIGdpbXBsZSBkZWYgPSBTU0FfTkFNRV9ERUZfU1RNVCAodXNlKTsKKyAg ICAgIGJhc2ljX2Jsb2NrIGRlZl9iYiA9IGdpbXBsZV9iYiAoZGVmKTsKKyAg ICAgIGlmIChkZWZfYmIKKyAgICAgICAgICAmJiBmbG93X2JiX2luc2lkZV9s b29wX3AgKGxvb3AsIGRlZl9iYikpCisJeworCSAgaWYgKGR1bXBfZmlsZSAm JiAoZHVtcF9mbGFncyAmIFRERl9ERVRBSUxTKSkKKwkgICAgZnByaW50ZiAo ZHVtcF9maWxlLCAiICBndWFyZCBvcGVyYW5kcyBoYXZlIGRlZmluaXRpb25z IgorCQkJCSIgaW5zaWRlIGxvb3BcbiIpOworCSAgcmV0dXJuIE5VTEw7CisJ fQorICAgIH0KKworICBib2R5ID0gZ2V0X2xvb3BfYm9keV9pbl9kb21fb3Jk ZXIgKGxvb3ApOworICBmb3IgKGkgPSAwOyBpIDwgbG9vcC0+bnVtX25vZGVz OyBpKyspCisgICAgeworICAgICAgaWYgKGJvZHlbaV0tPmxvb3BfZmF0aGVy ICE9IGxvb3ApCisJY29udGludWU7CisgICAgICBpZiAoIWVtcHR5X2JiX3dp dGhvdXRfZ3VhcmRfcCAobG9vcCwgYm9keVtpXSkpCisJeworCSAgaWYgKGR1 bXBfZmlsZSAmJiAoZHVtcF9mbGFncyAmIFRERl9ERVRBSUxTKSkKKwkgICAg ZnByaW50ZiAoZHVtcF9maWxlLCAiICBibG9jayAlZCBoYXMgc2lkZSBlZmZl Y3RzXG4iLCBib2R5W2ldLT5pbmRleCk7CisJICBndWFyZF9lZGdlID0gTlVM TDsKKwkgIGdvdG8gZW5kOworCX0KKyAgICB9CisKKyAgaWYgKGR1bXBfZmls ZSAmJiAoZHVtcF9mbGFncyAmIFRERl9ERVRBSUxTKSkKKyAgICBmcHJpbnRm IChkdW1wX2ZpbGUsICIgIHN1aXRhYmxlIHRvIGhvaXN0XG4iKTsKK2VuZDoK KyAgaWYgKGJvZHkpCisgICAgZnJlZSAoYm9keSk7CisgIHJldHVybiBndWFy ZF9lZGdlOworfQorCisvKiBSZXR1cm5zIHRydWUgaWYKKyAgIDEpIG5vIHN0 YXRlbWVudCBpbiBCQiBoYXMgc2lkZSBlZmZlY3RzCisgICAyKSBhc3N1bWlu ZyB0aGF0IGVkZ2UgR1VBUkQgaXMgYWx3YXlzIHRha2VuLCBhbGwgZGVmaW5p dGlvbnMgaW4gQkIKKyAgICAgIGFyZSBub3kgdXNlZCBvdXRzaWRlIG9mIHRo ZSBsb29wLgorICAgS05PV05fSU5WQVJJQU5UUyBpcyBhIHNldCBvZiBzc2Eg bmFtZXMgd2Uga25vdyB0byBiZSBpbnZhcmlhbnQsIGFuZAorICAgUFJPQ0VT U0VEIGlzIGEgc2V0IG9mIHNzYSBuYW1lcyBmb3IgdGhhdCB3ZSBhbHJlYWR5 IHRlc3RlZCB3aGV0aGVyIHRoZXkKKyAgIGFyZSBpbnZhcmlhbnQgb3Igbm90 LiAgKi8KKworc3RhdGljIGJvb2wKK2VtcHR5X2JiX3dpdGhvdXRfZ3VhcmRf cCAoc3RydWN0IGxvb3AgKmxvb3AsIGJhc2ljX2Jsb2NrIGJiKQoreworICBi YXNpY19ibG9jayBleGl0X2JiID0gc2luZ2xlX2V4aXQgKGxvb3ApLT5zcmM7 CisgIGJvb2wgbWF5X2JlX3VzZWRfb3V0c2lkZSA9IChiYiA9PSBleGl0X2Ji CisJCQkgICAgICB8fCAhZG9taW5hdGVkX2J5X3AgKENESV9ET01JTkFUT1JT LCBiYiwgZXhpdF9iYikpOworICB0cmVlIG5hbWU7CisgIHNzYV9vcF9pdGVy IG9wX2l0ZXI7CisKKyAgLyogUGhpIG5vZGVzIGRvIG5vdCBoYXZlIHNpZGUg ZWZmZWN0cywgYnV0IHRoZWlyIHJlc3VsdHMgbWlnaHQgYmUgdXNlZAorICAg ICBvdXRzaWRlIG9mIHRoZSBsb29wLiAgKi8KKyAgaWYgKG1heV9iZV91c2Vk X291dHNpZGUpCisgICAgeworICAgICAgZm9yIChncGhpX2l0ZXJhdG9yIGdz aSA9IGdzaV9zdGFydF9waGlzIChiYik7CisJICAgIWdzaV9lbmRfcCAoZ3Np KTsgZ3NpX25leHQgKCZnc2kpKQorCXsKKwkgIGdwaGkgKnBoaSA9IGdzaS5w aGkgKCk7CisJICBuYW1lID0gUEhJX1JFU1VMVCAocGhpKTsKKwkgIGlmICh2 aXJ0dWFsX29wZXJhbmRfcCAobmFtZSkpCisJICAgIGNvbnRpbnVlOworCisJ ICBpZiAodXNlZF9vdXRzaWRlX2xvb3BfcCAobG9vcCwgbmFtZSkpCisJICAg IHJldHVybiBmYWxzZTsKKwl9CisgICAgfQorCisgIGZvciAoZ2ltcGxlX3N0 bXRfaXRlcmF0b3IgZ3NpID0gZ3NpX3N0YXJ0X2JiIChiYik7CisgICAgICAg IWdzaV9lbmRfcCAoZ3NpKTsgZ3NpX25leHQgKCZnc2kpKQorICAgIHsKKyAg ICAgIGdpbXBsZSBzdG10ID0gZ3NpX3N0bXQgKGdzaSk7CisgICAgICBpZiAo Z2ltcGxlX2hhc19zaWRlX2VmZmVjdHMgKHN0bXQpKQorCXJldHVybiBmYWxz ZTsKKworICAgICAgaWYgKGdpbXBsZV92ZGVmKHN0bXQpKQorCXJldHVybiBm YWxzZTsKKworICAgICAgRk9SX0VBQ0hfU1NBX1RSRUVfT1BFUkFORCAobmFt ZSwgc3RtdCwgb3BfaXRlciwgU1NBX09QX0RFRikKKwl7CisJICBpZiAobWF5 X2JlX3VzZWRfb3V0c2lkZQorCSAgICAgICYmIHVzZWRfb3V0c2lkZV9sb29w X3AgKGxvb3AsIG5hbWUpKQorCSAgICByZXR1cm4gZmFsc2U7CisJfQorICAg IH0KKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFJldHVybiB0cnVlIGlmIE5B TUUgaXMgdXNlZCBvdXRzaWRlIG9mIExPT1AuICAqLworCitzdGF0aWMgYm9v bAordXNlZF9vdXRzaWRlX2xvb3BfcCAoc3RydWN0IGxvb3AgKmxvb3AsIHRy ZWUgbmFtZSkKK3sKKyAgaW1tX3VzZV9pdGVyYXRvciBpdDsKKyAgdXNlX29w ZXJhbmRfcCB1c2U7CisKKyAgRk9SX0VBQ0hfSU1NX1VTRV9GQVNUICh1c2Us IGl0LCBuYW1lKQorICAgIHsKKyAgICAgIGdpbXBsZSBzdG10ID0gVVNFX1NU TVQgKHVzZSk7CisgICAgICBpZiAoIWZsb3dfYmJfaW5zaWRlX2xvb3BfcCAo bG9vcCwgZ2ltcGxlX2JiIChzdG10KSkpCisJcmV0dXJuIHRydWU7CisgICAg fQorCisgIHJldHVybiBmYWxzZTsKK30KKworLyogTW92ZXMgdGhlIGNoZWNr IG9mIEdVQVJEIG91dHNpZGUgb2YgTE9PUC4gICovCisKK3N0YXRpYyB2b2lk Citob2lzdF9ndWFyZCAoc3RydWN0IGxvb3AgKmxvb3AsIGVkZ2UgZ3VhcmQp Cit7CisgIGVkZ2UgZXhpdCA9IHNpbmdsZV9leGl0IChsb29wKTsKKyAgZWRn ZSBwcmVoID0gbG9vcF9wcmVoZWFkZXJfZWRnZSAobG9vcCk7CisgIGJhc2lj X2Jsb2NrIHByZV9oZWFkZXIgPSBwcmVoLT5zcmM7CisgIGJhc2ljX2Jsb2Nr IGJiOworICBlZGdlIHRlLCBmZSwgZSwgdG1wZSwgbmV3X2VkZ2U7CisgIGdp bXBsZSBzdG10OworICBiYXNpY19ibG9jayBndWFyZF9iYiA9IGd1YXJkLT5z cmM7CisgIGdpbXBsZV9zdG10X2l0ZXJhdG9yIGdzaTsKKyAgaW50IGZsYWdz ID0gMDsKKyAgYm9vbCBmaXhfZG9tX29mX2V4aXQ7CisKKyAgZ2NjX2Fzc2Vy dCAoc2luZ2xlX3N1Y2NfcCAocHJlX2hlYWRlcikpOworICBiYiA9IGdldF9p bW1lZGlhdGVfZG9taW5hdG9yIChDRElfRE9NSU5BVE9SUywgZXhpdC0+ZGVz dCk7CisgIGZpeF9kb21fb2ZfZXhpdCA9IGZsb3dfYmJfaW5zaWRlX2xvb3Bf cCAobG9vcCwgYmIpOworICAvKiBIb2lzdCBHVUFSRCBvdXQgb2YgbG9vcC4g ICovCisgIGdzaSA9IGdzaV9sYXN0X2JiIChndWFyZF9iYik7CisgIHN0bXQg PSBnc2lfc3RtdCAoZ3NpKTsKKyAgZ2NjX2Fzc2VydCAoZ2ltcGxlX2NvZGUg KHN0bXQpID09IEdJTVBMRV9DT05EKTsKKyAgZXh0cmFjdF90cnVlX2ZhbHNl X2VkZ2VzX2Zyb21fYmxvY2sgKGd1YXJkX2JiLCAmdGUsICZmZSk7CisgIHRt cGUgPSAoZ3VhcmQgPT0gdGUpID8gZmUgOiB0ZTsKKyAgdG1wZS0+ZmxhZ3Mg Jj1+IChFREdFX1RSVUVfVkFMVUUgfCBFREdFX0ZBTFNFX1ZBTFVFKTsKKyAg ZmxhZ3MgPSB0bXBlLT5mbGFnczsKKyAgdG1wZS0+ZmxhZ3MgfD0gRURHRV9G QUxMVEhSVTsKKyAgZ3NpX3JlbW92ZSAoJmdzaSwgZmFsc2UpOworICBiYiA9 IGd1YXJkLT5kZXN0OworICByZW1vdmVfZWRnZSAoZ3VhcmQpOworICAvKiBV cGRhdGUgZG9taW5hbmNlIGZvciBkZXN0aW5hdGlvbiBvZiBHVUFSRC4gICov CisgIGlmIChFREdFX0NPVU5UIChiYi0+cHJlZHMpID09IDApCisgICAgewor ICAgICAgYmFzaWNfYmxvY2sgc19iYjsKKyAgICAgIGdjY19hc3NlcnQgKHNp bmdsZV9zdWNjX3AgKGJiKSk7CisgICAgICBzX2JiID0gc2luZ2xlX3N1Y2Mg KGJiKTsKKyAgICAgIGRlbGV0ZV9iYXNpY19ibG9jayAoYmIpOworICAgICAg aWYgKHNpbmdsZV9wcmVkX3AgKHNfYmIpKQorCXNldF9pbW1lZGlhdGVfZG9t aW5hdG9yIChDRElfRE9NSU5BVE9SUywgc19iYiwgc2luZ2xlX3ByZWQgKHNf YmIpKTsKKyAgICAgIGVsc2UKKwl7CisJICBiYXNpY19ibG9jayBkb21fYmIg PSByZWNvbXB1dGVfZG9taW5hdG9yIChDRElfRE9NSU5BVE9SUywgc19iYik7 CisJICBnY2NfYXNzZXJ0IChkb21fYmIpOworCSAgc2V0X2ltbWVkaWF0ZV9k b21pbmF0b3IgKENESV9ET01JTkFUT1JTLCBzX2JiLCBkb21fYmIpOworCX0K KyAgICB9CisgIGVsc2UgaWYgKHNpbmdsZV9wcmVkX3AgKGJiKSkKKyAgICBz ZXRfaW1tZWRpYXRlX2RvbWluYXRvciAoQ0RJX0RPTUlOQVRPUlMsIGJiLCBz aW5nbGVfcHJlZCAoYmIpKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIGJhc2lj X2Jsb2NrIGRvbV9iYiA9IHJlY29tcHV0ZV9kb21pbmF0b3IgKENESV9ET01J TkFUT1JTLCBiYik7OworICAgICAgZ2NjX2Fzc2VydCAoZG9tX2JiKTsKKyAg ICAgIHNldF9pbW1lZGlhdGVfZG9taW5hdG9yIChDRElfRE9NSU5BVE9SUywg YmIsIGRvbV9iYik7CisgICAgfQorICAvKiBJbnNlcnQgZ3VhcmQgdG8gUFJF X0hFQURFUi4gICovCisgIGlmICghZW1wdHlfYmxvY2tfcCAocHJlX2hlYWRl cikpCisgICAgZ3NpID0gZ3NpX2xhc3RfYmIgKHByZV9oZWFkZXIpOworICBl bHNlCisgICAgZ3NpID0gZ3NpX3N0YXJ0X2JiIChwcmVfaGVhZGVyKTsKKyAg Z3NpX2luc2VydF9hZnRlciAoJmdzaSwgc3RtdCwgR1NJX05FV19TVE1UKTsK KyAgLyogQ3JlYXRlIG5ldyBsb29wIHByZS1oZWFkZXIuICAqLworICBlID0g c3BsaXRfYmxvY2sgKHByZV9oZWFkZXIsIGxhc3Rfc3RtdCAocHJlX2hlYWRl cikpOworICBnY2NfYXNzZXJ0IChsb29wX3ByZWhlYWRlcl9lZGdlIChsb29w KS0+c3JjID09IGUtPmRlc3QpOworICBpZiAoZ3VhcmQgPT0gZmUpCisgICAg eworICAgICAgZS0+ZmxhZ3MgPSBFREdFX1RSVUVfVkFMVUU7CisgICAgICBm bGFncyB8PSBFREdFX0ZBTFNFX1ZBTFVFOworICAgIH0KKyAgZWxzZQorICAg IHsKKyAgICAgIGUtPmZsYWdzID0gRURHRV9GQUxTRV9WQUxVRTsKKyAgICAg IGZsYWdzIHw9IEVER0VfVFJVRV9WQUxVRTsKKyAgICB9CisgIG5ld19lZGdl ID0gbWFrZV9lZGdlIChwcmVfaGVhZGVyLCBleGl0LT5kZXN0LCBmbGFncyk7 CisgIGlmIChmaXhfZG9tX29mX2V4aXQpCisgICAgc2V0X2ltbWVkaWF0ZV9k b21pbmF0b3IgKENESV9ET01JTkFUT1JTLCBleGl0LT5kZXN0LCBwcmVfaGVh ZGVyKTsKKyAgdXBkYXRlX3N0bXQgKGdzaV9zdG10IChnc2kpKTsKKyAgLyog QWRkIE5FV19BREdFIGFyZ3VtZW50IGZvciBhbGwgcGhpIGluIHBvc3QtaGVh ZGVyIGJsb2NrLiAgKi8KKyAgYmIgPSBleGl0LT5kZXN0OworICBmb3IgKGdw aGlfaXRlcmF0b3IgZ3NpID0gZ3NpX3N0YXJ0X3BoaXMgKGJiKTsKKyAgICAg ICAhZ3NpX2VuZF9wIChnc2kpOyBnc2lfbmV4dCAoJmdzaSkpCisgICAgewor ICAgICAgZ3BoaSAqcGhpID0gZ3NpLnBoaSAoKTsKKyAgICAgIC8qIGVkZ2Vf aXRlcmF0b3IgZWk7ICovCisgICAgICB0cmVlIGFyZzsKKyAgICAgIGlmICh2 aXJ0dWFsX29wZXJhbmRfcCAoZ2ltcGxlX3BoaV9yZXN1bHQgKHBoaSkpKQor CXsKKwkgIGFyZyA9IFBISV9BUkdfREVGX0ZST01fRURHRSAocGhpLCBsb29w X3ByZWhlYWRlcl9lZGdlIChsb29wKSk7CisJICBhZGRfcGhpX2FyZyAocGhp LCBhcmcsIG5ld19lZGdlLCBVTktOT1dOX0xPQ0FUSU9OKTsKKwl9CisgICAg ICBlbHNlCisJeworCSAgLyogVXNlIGV4aXQgZWRnZSBhcmd1bWVudC4gICov CisJICBhcmcgPSBQSElfQVJHX0RFRl9GUk9NX0VER0UgKHBoaSwgZXhpdCk7 CisJICBhZGRfcGhpX2FyZyAocGhpLCBhcmcsIG5ld19lZGdlLCBVTktOT1dO X0xPQ0FUSU9OKTsKKwl9CisgICAgfQorCisgIG1hcmtfdmlydHVhbF9vcGVy YW5kc19mb3JfcmVuYW1pbmcgKGNmdW4pOworICB1cGRhdGVfc3NhIChUT0RP X3VwZGF0ZV9zc2EpOworICBpZiAoZHVtcF9maWxlICYmIChkdW1wX2ZsYWdz ICYgVERGX0RFVEFJTFMpKQorICAgIGZwcmludGYgKGR1bXBfZmlsZSwgIiAg Z3VhcmQgaG9pc3RlZC5cbiIpOworfQorCisvKiBSZXR1cm4gdHJ1ZSBpZiBw aGkgYXJndW1lbnQgZm9yIGV4aXQgZWRnZSBjYW4gYmUgdXNlZAorICAgZm9y IGVkZ2UgYXJvdW5kIGxvb3AuICAqLworCitzdGF0aWMgYm9vbAorY2hlY2tf ZXhpdF9waGkgKHN0cnVjdCBsb29wICpsb29wKQoreworICBlZGdlIGV4aXQg PSBzaW5nbGVfZXhpdCAobG9vcCk7CisgIGJhc2ljX2Jsb2NrIHByZV9oZWFk ZXIgPSBsb29wX3ByZWhlYWRlcl9lZGdlIChsb29wKS0+c3JjOworCisgIGZv ciAoZ3BoaV9pdGVyYXRvciBnc2kgPSBnc2lfc3RhcnRfcGhpcyAoZXhpdC0+ ZGVzdCk7CisgICAgICAgIWdzaV9lbmRfcCAoZ3NpKTsgZ3NpX25leHQgKCZn c2kpKQorICAgIHsKKyAgICAgIGdwaGkgKnBoaSA9IGdzaS5waGkgKCk7Cisg ICAgICB0cmVlIGFyZzsKKyAgICAgIGdpbXBsZSBkZWY7CisgICAgICBiYXNp Y19ibG9jayBkZWZfYmI7CisgICAgICBpZiAodmlydHVhbF9vcGVyYW5kX3Ag KGdpbXBsZV9waGlfcmVzdWx0IChwaGkpKSkKKwljb250aW51ZTsKKyAgICAg IGFyZyA9IFBISV9BUkdfREVGX0ZST01fRURHRSAocGhpLCBleGl0KTsKKyAg ICAgIGlmIChUUkVFX0NPREUgKGFyZykgIT0gU1NBX05BTUUpCisJY29udGlu dWU7CisgICAgICBkZWYgPSBTU0FfTkFNRV9ERUZfU1RNVCAoYXJnKTsKKyAg ICAgIGlmICghZGVmKQorCWNvbnRpbnVlOworICAgICAgZGVmX2JiID0gZ2lt cGxlX2JiIChkZWYpOworICAgICAgaWYgKCFkZWZfYmIpCisJY29udGludWU7 CisgICAgICBpZiAoIWRvbWluYXRlZF9ieV9wIChDRElfRE9NSU5BVE9SUywg cHJlX2hlYWRlciwgZGVmX2JiKSkKKwkvKiBEZWZpbml0aW9uIGluc2lkZSBs b29wISAgKi8KKwlyZXR1cm4gZmFsc2U7CisgICAgICAvKiBDaGVjayBsb29w IGNsb3NlZCBwaGkgaW52YXJpYW50LiAgKi8KKyAgICAgIGlmICghZmxvd19i Yl9pbnNpZGVfbG9vcF9wIChkZWZfYmItPmxvb3BfZmF0aGVyLCBwcmVfaGVh ZGVyKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorICByZXR1cm4gdHJ1ZTsK K30KKwogLyogTG9vcCB1bnN3aXRjaGluZyBwYXNzLiAgKi8KIAogbmFtZXNw YWNlIHsK --001a113adee6b022f50520f4a3d9--