From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 17331 invoked by alias); 18 Dec 2014 13:45:13 -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 17302 invoked by uid 89); 18 Dec 2014 13:45:09 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.5 required=5.0 tests=AWL,BAYES_00,FREEMAIL_FROM,RCVD_IN_DNSWL_LOW,SPF_PASS autolearn=ham version=3.3.2 X-HELO: mail-wg0-f51.google.com Received: from mail-wg0-f51.google.com (HELO mail-wg0-f51.google.com) (74.125.82.51) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-SHA encrypted) ESMTPS; Thu, 18 Dec 2014 13:45:05 +0000 Received: by mail-wg0-f51.google.com with SMTP id x12so1665982wgg.10 for ; Thu, 18 Dec 2014 05:45:02 -0800 (PST) MIME-Version: 1.0 X-Received: by 10.194.188.39 with SMTP id fx7mr4260821wjc.113.1418910301841; Thu, 18 Dec 2014 05:45:01 -0800 (PST) Received: by 10.216.77.73 with HTTP; Thu, 18 Dec 2014 05:45:01 -0800 (PST) In-Reply-To: References: Date: Thu, 18 Dec 2014 13:48:00 -0000 Message-ID: Subject: Re: [PATCH 2/3] Extended if-conversion From: Yuri Rumyantsev To: Richard Biener Cc: gcc-patches , Igor Zamyatin Content-Type: multipart/mixed; boundary=047d7bb0400282936e050a7dcc97 X-SW-Source: 2014-12/txt/msg01532.txt.bz2 --047d7bb0400282936e050a7dcc97 Content-Type: text/plain; charset=UTF-8 Content-length: 27795 Richard, I am sending you full patch (~1000 lines) but if you need only patch.1 and patch.2 will let me know and i'll send you reduced patch. Below are few comments regarding your remarks for patch.3. 1. I deleted sub-phase ifcvt_local_dce since I did not find test-case when dead code elimination is required to vectorize loop, i.e. dead statement is marked as relevant. 2. You wrote: > The "retry" code also looks odd - why do you walk the BB multiple > times instead of just doing sth like > > while (!has_single_use (lhs)) > { > gimple copy = ifcvt_split_def_stmt (def_stmt); > ifcvt_walk_pattern_tree (copy); > } > > thus returning the copy you create and re-process it (the copy should > now have a single-use). The problem is that not only top SSA_NAME (lhs) may have multiple uses but some intermediate variables too. For example, for the following test-case float a[1000]; int c[1000]; int foo() { int i, res = 0; #pragma omp simd safelen(8) for (i=0; i<512; i++) { float t = a[i]; if (t > 0.0f & t < 1.0e+17f) if (c[i] != 0) res += 1; } return res; } After combine_blocks we have the following bb: : # res_15 = PHI # i_16 = PHI # ivtmp_14 = PHI t_5 = a[i_16]; _6 = t_5 > 0.0; _7 = t_5 < 9.9999998430674944e+16; _8 = _6 & _7; _10 = &c[i_16]; _ifc__32 = _8 ? 4294967295 : 0; _9 = MASK_LOAD (_10, 0B, _ifc__32); _28 = _8; _29 = _9 != 0; _30 = _28 & _29; _ifc__31 = _30 ? 1 : 0; res_1 = res_15 + _ifc__31; i_11 = i_16 + 1; ivtmp_13 = ivtmp_14 - 1; if (ivtmp_13 != 0) goto ; else goto ; and we can see that _8 has multiple uses. Also note that after splitting of _8 = _6 & _7 we also get multiple uses for definition of _6 and _7. So I used this iterative algorithm as the simplest one. I think it would be nice to re-use some utility from tree-vect-patterns.c for stmt_is_root_of_bool_pattern. I assume that function stmt_is_root_of_bool_pattern can be simplified to check on COND_EXPR only since PHI predication and memory access predication produced only such statements,i.e. it can look like static bool stmt_is_root_of_bool_pattern (gimple stmt, tree *var) { enum tree_code code; tree lhs, rhs; code = gimple_assign_rhs_code (stmt); if (code == COND_EXPR) { rhs = gimple_assign_rhs1 (stmt); if (TREE_CODE (rhs) != SSA_NAME) return false; *var = rhs; return true; } return false; } I also did few minor changes in patch.2. 3. You can also notice that I inserted code in tree_if_conversion to do loop version if explicit option "-ftree-loop-if-convert" was not passed to compiler, i.e. we perform if-conversion for loop vectorization only and if it does not take place, we should delete if-converted version of loop. What is your opinion? Thanks. Yuri. 2014-12-17 18:41 GMT+03:00 Richard Biener : > On Tue, Dec 16, 2014 at 4:15 PM, Yuri Rumyantsev wrote: >> Hi Richard, >> >> Here is updated patch which includes >> (1) split critical edges for aggressive if conversion. >> (2) delete all stuff related to support of critical edge predication. >> (3) only one function - predicate_scalar_phi performs predication. >> (4) function find_phi_replacement_condition was deleted since it was >> included in predicate_scalar_phi for phi with two arguments. >> >> I checked that patch works in stress testing mode, i.e. with >> aggressive if conversion by default. >> >> What is your opinion? > > Looks ok overall, but please simply do > > FOR_EACH_EDGE (e, ei, bb->succs) > if (EDGE_CRITICAL_P (e) && e->dest->loop_father == loop) > split_edge (e); > > for all blocks apart from the latch. > > Can you please send a combined patch up to this one? Looking at > the incremental diff is somewhat hard. Thus a patch including all > patches from patch1 to this one. > > Thanks, > Richard. > >> >> Thanks. >> Yuri. >> >> 2014-12-11 11:59 GMT+03:00 Richard Biener : >>> On Wed, Dec 10, 2014 at 4:22 PM, Yuri Rumyantsev wrote: >>>> Richard, >>>> >>>> Thanks for your reply! >>>> >>>> I didn't understand your point: >>>> >>>> Well, I don't mind splitting all critical edges unconditionally >>>> >>>> but you do it unconditionally in proposed patch. >>> >>> I don't mind means I am fine with it. >>> >>>> Also I assume that >>>> call of split_critical_edges() can break ssa. For example, we can >>>> split headers of loops, loop exit blocks etc. >>> >>> How does that "break SSA"? You mean loop-closed SSA? I'd >>> be surprised if so but that may be possible. >>> >>>> I prefer to do something >>>> more loop-specialized, e.g. call edge_split() for critical edges >>>> outgoing from bb ending with GIMPLE_COND stmt (assuming that edge >>>> destination bb belongs to loop). >>> >>> That works for me as well but it is more complicated to implement. >>> Ideally you'd only split one edge if you find a block with only critical >>> predecessors (where we'd currently give up). But note that this >>> requires re-computation of ifc_bbs in if_convertible_loop_p_1 and it >>> will change loop->num_nodes so we have to be more careful in >>> constructing the loop calling if_convertible_bb_p. >>> >>> Richard. >>> >>>> >>>> 2014-12-10 17:31 GMT+03:00 Richard Biener : >>>>> On Wed, Dec 10, 2014 at 11:54 AM, Yuri Rumyantsev wrote: >>>>>> Richard, >>>>>> >>>>>> Sorry that I forgot to delete debug dump from my fix. >>>>>> I have few questions about your comments. >>>>>> >>>>>> 1. You wrote : >>>>>>> You also still have two functions for PHI predication. And the >>>>>>> new extended variant doesn't commonize the 2-args and general >>>>>>> path >>>>>> Did you mean that I must combine predicate_scalar_phi and >>>>>> predicate_extended scalar phi to one function? >>>>>> Please note that if additional flag was not set up (i.e. >>>>>> aggressive_if_conv is false) extended predication is required more >>>>>> compile time since it builds hash_map. >>>>> >>>>> It's compile-time complexity is reasonable enough even for >>>>> non-aggressive if-conversion. >>>>> >>>>>> 2. About critical edge splitting. >>>>>> >>>>>> Did you mean that we should perform it (1) under aggressive_if_conv >>>>>> option only; (2) should we split all critical edges. >>>>>> Note that this leads to recomputing of topological order. >>>>> >>>>> Well, I don't mind splitting all critical edges unconditionally, thus >>>>> do something like >>>>> >>>>> Index: gcc/tree-if-conv.c >>>>> =================================================================== >>>>> --- gcc/tree-if-conv.c (revision 218515) >>>>> +++ gcc/tree-if-conv.c (working copy) >>>>> @@ -2235,12 +2235,21 @@ pass_if_conversion::execute (function *f >>>>> if (number_of_loops (fun) <= 1) >>>>> return 0; >>>>> >>>>> + bool critical_edges_split_p = false; >>>>> FOR_EACH_LOOP (loop, 0) >>>>> if (flag_tree_loop_if_convert == 1 >>>>> || flag_tree_loop_if_convert_stores == 1 >>>>> || ((flag_tree_loop_vectorize || loop->force_vectorize) >>>>> && !loop->dont_vectorize)) >>>>> - todo |= tree_if_conversion (loop); >>>>> + { >>>>> + if (!critical_edges_split_p) >>>>> + { >>>>> + split_critical_edges (); >>>>> + critical_edges_split_p = true; >>>>> + todo |= TODO_cleanup_cfg; >>>>> + } >>>>> + todo |= tree_if_conversion (loop); >>>>> + } >>>>> >>>>> #ifdef ENABLE_CHECKING >>>>> { >>>>> >>>>>> It is worth noting that in current implementation bb's with 2 >>>>>> predecessors and both are on critical edges are accepted without >>>>>> additional option. >>>>> >>>>> Yes, I know. >>>>> >>>>> tree-if-conv.c is a mess right now and if we can avoid adding more >>>>> to it and even fix the critical edge missed optimization with splitting >>>>> critical edges then I am all for that solution. >>>>> >>>>> Richard. >>>>> >>>>>> Thanks ahead. >>>>>> Yuri. >>>>>> 2014-12-09 18:20 GMT+03:00 Richard Biener : >>>>>>> On Tue, Dec 9, 2014 at 2:11 PM, Yuri Rumyantsev wrote: >>>>>>>> Richard, >>>>>>>> >>>>>>>> Here is updated patch2 with the following changes: >>>>>>>> 1. Delete functions phi_has_two_different_args and find_insertion_point. >>>>>>>> 2. Use only one function for extended predication - >>>>>>>> predicate_extended_scalar_phi. >>>>>>>> 3. Save gsi before insertion of predicate computations for basic >>>>>>>> blocks if it has 2 predecessors and >>>>>>>> both incoming edges are critical or it gas more than 2 predecessors >>>>>>>> and at least one incoming edge >>>>>>>> is critical. This saved iterator can be used by extended phi predication. >>>>>>>> >>>>>>>> Here is motivated test-case which explains this point. >>>>>>>> Test-case is attached (t5.c) and it must be compiled with -O2 >>>>>>>> -ftree-loop-vectorize -fopenmp options. >>>>>>>> The problem phi is in bb-7: >>>>>>>> >>>>>>>> bb_5 (preds = {bb_4 }, succs = {bb_7 bb_9 }) >>>>>>>> { >>>>>>>> : >>>>>>>> xmax_edge_18 = xmax_edge_36 + 1; >>>>>>>> if (xmax_17 == xmax_27) >>>>>>>> goto ; >>>>>>>> else >>>>>>>> goto ; >>>>>>>> >>>>>>>> } >>>>>>>> bb_6 (preds = {bb_4 }, succs = {bb_7 bb_8 }) >>>>>>>> { >>>>>>>> : >>>>>>>> if (xmax_17 == xmax_27) >>>>>>>> goto ; >>>>>>>> else >>>>>>>> goto ; >>>>>>>> >>>>>>>> } >>>>>>>> bb_7 (preds = {bb_6 bb_5 }, succs = {bb_11 }) >>>>>>>> { >>>>>>>> : >>>>>>>> # xmax_edge_30 = PHI >>>>>>>> xmax_edge_19 = xmax_edge_39 + 1; >>>>>>>> goto ; >>>>>>>> >>>>>>>> } >>>>>>>> >>>>>>>> Note that both incoming edges to bb_7 are critical. If we comment out >>>>>>>> restoring gsi in predicate_all_scalar_phi: >>>>>>>> #if 0 >>>>>>>> if ((EDGE_COUNT (bb->preds) == 2 && all_preds_critical_p (bb)) >>>>>>>> || (EDGE_COUNT (bb->preds) > 2 && has_pred_critical_p (bb))) >>>>>>>> gsi = bb_insert_point (bb); >>>>>>>> else >>>>>>>> #endif >>>>>>>> gsi = gsi_after_labels (bb); >>>>>>>> >>>>>>>> we will get ICE: >>>>>>>> t5.c: In function 'foo': >>>>>>>> t5.c:9:6: error: definition in block 4 follows the use >>>>>>>> void foo (int n) >>>>>>>> ^ >>>>>>>> for SSA_NAME: _1 in statement: >>>>>>>> _52 = _1 & _3; >>>>>>>> t5.c:9:6: internal compiler error: verify_ssa failed >>>>>>>> >>>>>>>> smce predicate computations were inserted in bb_7. >>>>>>> >>>>>>> The issue is obviously that the predicates have already been emitted >>>>>>> in the target BB - that's of course the wrong place. This is done >>>>>>> by insert_gimplified_predicates. >>>>>>> >>>>>>> This just shows how edge predicate handling is broken - we don't >>>>>>> seem to have a sequence of gimplified stmts for edge predicates >>>>>>> but push those to e->dest which makes this really messy. >>>>>>> >>>>>>> Rather than having a separate phase where we insert all >>>>>>> gimplified bb predicates we should do that on-demand when >>>>>>> predicating a PHI. >>>>>>> >>>>>>> Your patch writes to stderr - that's bad - use dump_file and guard >>>>>>> the printfs properly. >>>>>>> >>>>>>> You also still have two functions for PHI predication. And the >>>>>>> new extended variant doesn't commonize the 2-args and general >>>>>>> paths. >>>>>>> >>>>>>> I'm not at all happy with this code. It may be existing if-conv codes >>>>>>> fault but making it even worse is not an option. >>>>>>> >>>>>>> Again - what's wrong with simply splitting critical edges if >>>>>>> aggressive_if_conv? I think that would very much simplify >>>>>>> things here. Or alternatively use gsi_insert_on_edge and >>>>>>> commit edge insertions before merging the blocks. >>>>>>> >>>>>>> Thanks, >>>>>>> Richard. >>>>>>> >>>>>>>> ChangeLog is >>>>>>>> >>>>>>>> 2014-12-09 Yuri Rumyantsev >>>>>>>> >>>>>>>> * tree-if-conv.c : Include hash-map.h. >>>>>>>> (struct bb_predicate_s): Add new field to save copy of gimple >>>>>>>> statement iterator. >>>>>>>> (bb_insert_point): New function. >>>>>>>> (set_bb_insert_point): New function. >>>>>>>> (has_pred_critical_p): New function. >>>>>>>> (if_convertible_bb_p): Allow bb has more than 2 predecessors if >>>>>>>> AGGRESSIVE_IF_CONV is true. >>>>>>>> (if_convertible_bb_p): Delete check that bb has at least one >>>>>>>> non-critical incoming edge. >>>>>>>> (is_cond_scalar_reduction): Add arguments ARG_0, ARG_1 and EXTENDED. >>>>>>>> Allow interchange PHI arguments if EXTENDED is false. >>>>>>>> Change check that block containing reduction statement candidate >>>>>>>> is predecessor of phi-block since phi may have more than two arguments. >>>>>>>> (predicate_scalar_phi): Add new arguments for call of >>>>>>>> is_cond_scalar_reduction. >>>>>>>> (get_predicate_for_edge): New function. >>>>>>>> (struct phi_args_hash_traits): New type. >>>>>>>> (phi_args_hash_traits::hash): New function. >>>>>>>> (phi_args_hash_traits::equal_keys): New function. >>>>>>>> (gen_phi_arg_condition): New function. >>>>>>>> (predicate_extended_scalar_phi): New function. >>>>>>>> (predicate_all_scalar_phis): Add boolean variable EXTENDED and set it >>>>>>>> to true if BB containing phi has more than 2 predecessors or both >>>>>>>> incoming edges are critical. Invoke find_phi_replacement_condition and >>>>>>>> predicate_scalar_phi if EXTENDED is false. Use saved gsi if BB >>>>>>>> has 2 predecessors and both incoming edges are critical or it has more >>>>>>>> than 2 predecessors and atleast one incoming edge is critical. >>>>>>>> Use standard gsi_after_labels otherwise. >>>>>>>> Invoke predicate_extended_scalar_phi if EXTENDED is true. >>>>>>>> (insert_gimplified_predicates): Add bool variable EXTENDED_PREDICATION >>>>>>>> to save gsi before insertion of predicate computations. SEt-up it to >>>>>>>> true for BB with 2 predecessors and critical incoming edges either >>>>>>>> number of predecessors is geater 2 and at least one incoming edge is >>>>>>>> critical. >>>>>>>> Add check that non-predicated block may have statements to insert. >>>>>>>> Insert predicate computation of BB just after label if >>>>>>>> EXTENDED_PREDICATION is true. >>>>>>>> (tree_if_conversion): Add initialization of AGGRESSIVE_IF_CONV which >>>>>>>> is copy of inner or outer loop force_vectorize field. >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> 2014-12-04 16:37 GMT+03:00 Richard Biener : >>>>>>>>> On Thu, Dec 4, 2014 at 2:15 PM, Yuri Rumyantsev wrote: >>>>>>>>>> Richard, >>>>>>>>>> >>>>>>>>>> I did simple change by saving gsi iterator for each bb that has >>>>>>>>>> critical edges by adding additional field to bb_predicate_s: >>>>>>>>>> >>>>>>>>>> typedef struct bb_predicate_s { >>>>>>>>>> >>>>>>>>>> /* The condition under which this basic block is executed. */ >>>>>>>>>> tree predicate; >>>>>>>>>> >>>>>>>>>> /* PREDICATE is gimplified, and the sequence of statements is >>>>>>>>>> recorded here, in order to avoid the duplication of computations >>>>>>>>>> that occur in previous conditions. See PR44483. */ >>>>>>>>>> gimple_seq predicate_gimplified_stmts; >>>>>>>>>> >>>>>>>>>> /* Insertion point for blocks having incoming critical edges. */ >>>>>>>>>> gimple_stmt_iterator gsi; >>>>>>>>>> } *bb_predicate_p; >>>>>>>>>> >>>>>>>>>> and this iterator is saved in insert_gimplified_predicates before >>>>>>>>>> insertion code for predicate computation. I checked that this fix >>>>>>>>>> works. >>>>>>>>> >>>>>>>>> Huh? I still wonder what the issue is with inserting everything >>>>>>>>> after the PHI we predicate. >>>>>>>>> >>>>>>>>> Well, your updated patch will come with testcases for the testsuite >>>>>>>>> that will hopefully fail if doing that. >>>>>>>>> >>>>>>>>> Richard. >>>>>>>>> >>>>>>>>>> >>>>>>>>>> Now I am implementing merging of predicate_extended.. and >>>>>>>>>> predicate_arbitrary.. functions as you proposed. >>>>>>>>>> >>>>>>>>>> Best regards. >>>>>>>>>> Yuri. >>>>>>>>>> >>>>>>>>>> 2014-12-04 15:41 GMT+03:00 Richard Biener : >>>>>>>>>>> On Tue, Dec 2, 2014 at 4:28 PM, Yuri Rumyantsev wrote: >>>>>>>>>>>> Thanks Richard for your quick reply! >>>>>>>>>>>> >>>>>>>>>>>> 1. I agree that we can combine predicate_extended_ and >>>>>>>>>>>> predicate_arbitrary_ to one function as you proposed. >>>>>>>>>>>> 2. What is your opinion about using more simple decision about >>>>>>>>>>>> insertion point - if bb has use of phi result insert phi predication >>>>>>>>>>>> before it and at the bb end otherwise. I assume that critical edge >>>>>>>>>>>> splitting is not a good decision. >>>>>>>>>>> >>>>>>>>>>> Why not always insert before the use? Which would be after labels, >>>>>>>>>>> what we do for two-arg PHIs. That is, how can it be that you predicate >>>>>>>>>>> a PHI in BB1 and then for an edge predicate on one of its incoming >>>>>>>>>>> edges you get SSA uses with defs that are in BB1 itself? That >>>>>>>>>>> can only happen for backedges but those you can't remove in any case. >>>>>>>>>>> >>>>>>>>>>> Richard. >>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> Best regards. >>>>>>>>>>>> Yuri. >>>>>>>>>>>> >>>>>>>>>>>> 2014-12-02 16:28 GMT+03:00 Richard Biener : >>>>>>>>>>>>> On Mon, Dec 1, 2014 at 4:53 PM, Yuri Rumyantsev wrote: >>>>>>>>>>>>>> Hi Richard, >>>>>>>>>>>>>> >>>>>>>>>>>>>> I resend you patch1 and patch2 with minor changes: >>>>>>>>>>>>>> 1. I renamed flag_force_vectorize to aggressive_if_conv. >>>>>>>>>>>>>> 2. Use static cast for the first argument of gimple_phi_arg_edge. >>>>>>>>>>>>>> I also very sorry that I sent you bad patch. >>>>>>>>>>>>>> >>>>>>>>>>>>>> Now let me answer on your questions related to second patch. >>>>>>>>>>>>>> 1. Why we need both predicate_extended_scalar_phi and >>>>>>>>>>>>>> predicate_arbitrary_scalar_phi? >>>>>>>>>>>>>> >>>>>>>>>>>>>> Let's consider the following simple test-case: >>>>>>>>>>>>>> >>>>>>>>>>>>>> #pragma omp simd safelen(8) >>>>>>>>>>>>>> for (i=0; i<512; i++) >>>>>>>>>>>>>> { >>>>>>>>>>>>>> float t = a[i]; >>>>>>>>>>>>>> if (t > 0.0f & t < 1.0e+17f) >>>>>>>>>>>>>> if (c[i] != 0) /* c is integer array. */ >>>>>>>>>>>>>> res += 1; >>>>>>>>>>>>>> } >>>>>>>>>>>>>> >>>>>>>>>>>>>> we can see the following phi node correspondent to res: >>>>>>>>>>>>>> >>>>>>>>>>>>>> # res_1 = PHI >>>>>>>>>>>>>> >>>>>>>>>>>>>> It is clear that we can optimize it to phi node with 2 arguments only >>>>>>>>>>>>>> and only one check can be used for phi predication (for reduction in >>>>>>>>>>>>>> our case), namely predicate of bb_5. In general case we can't do it >>>>>>>>>>>>>> even if we sort all phi argument values since we still have to produce >>>>>>>>>>>>>> a chain of cond expressions to perform phi predication (see comments >>>>>>>>>>>>>> for predicate_arbitrary_scalar_phi). >>>>>>>>>>>>> >>>>>>>>>>>>> How so? We can always use !(condition) for the "last" value, thus >>>>>>>>>>>>> treat it as an 'else' case. That even works for >>>>>>>>>>>>> >>>>>>>>>>>>> # res_1 = PHI >>>>>>>>>>>>> >>>>>>>>>>>>> where the condition for edges 5 and 7 can be computed as >>>>>>>>>>>>> ! (condition for 3 || condition for 4). >>>>>>>>>>>>> >>>>>>>>>>>>> Of course it is worthwhile to also sort single-occurances first >>>>>>>>>>>>> so your case gets just the condiiton for edge 5 and its inversion >>>>>>>>>>>>> used for edges 3 and 4 combined. >>>>>>>>>>>>> >>>>>>>>>>>>>> 2. Why we need to introduce find_insertion_point? >>>>>>>>>>>>>> Let's consider another test-case extracted from 175.vpr ( t5.c is >>>>>>>>>>>>>> attached) and we can see that bb_7 and bb_9 containig phi nodes has >>>>>>>>>>>>>> only critical incoming edges and both contain code computing edge >>>>>>>>>>>>>> predicates, e.g. >>>>>>>>>>>>>> >>>>>>>>>>>>>> : >>>>>>>>>>>>>> # xmax_edge_30 = PHI >>>>>>>>>>>>>> _46 = xmax_17 == xmax_37; >>>>>>>>>>>>>> _47 = xmax_17 == xmax_27; >>>>>>>>>>>>>> _48 = _46 & _47; >>>>>>>>>>>>>> _53 = xmax_17 == xmax_37; >>>>>>>>>>>>>> _54 = ~_53; >>>>>>>>>>>>>> _55 = xmax_17 == xmax_27; >>>>>>>>>>>>>> _56 = _54 & _55; >>>>>>>>>>>>>> _57 = _48 | _56; >>>>>>>>>>>>>> xmax_edge_19 = xmax_edge_39 + 1; >>>>>>>>>>>>>> goto ; >>>>>>>>>>>>>> >>>>>>>>>>>>>> It is evident that we can not put phi predication at the block >>>>>>>>>>>>>> beginning but need to put it after predicate computations. >>>>>>>>>>>>>> Note also that if there are no critical edges for phi arguments >>>>>>>>>>>>>> insertion point will be "after labels" Note also that phi result can >>>>>>>>>>>>>> have use in this block too, so we can't put predication code to the >>>>>>>>>>>>>> block end. >>>>>>>>>>>>> >>>>>>>>>>>>> So the issue is that predicate insertion for edge predicates does >>>>>>>>>>>>> not happen on the edge but somewhere else (generally impossible >>>>>>>>>>>>> for critical edges unless you split them). >>>>>>>>>>>>> >>>>>>>>>>>>> I think I've told you before that I prefer simple solutions to such issues, >>>>>>>>>>>>> like splitting the edge! Certainly not involving a function walking >>>>>>>>>>>>> GENERIC expressions. >>>>>>>>>>>>> >>>>>>>>>>>>> Thanks, >>>>>>>>>>>>> Richard. >>>>>>>>>>>>> >>>>>>>>>>>>>> Let me know if you still have any questions. >>>>>>>>>>>>>> >>>>>>>>>>>>>> Best regards. >>>>>>>>>>>>>> Yuri. >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> 2014-11-28 15:43 GMT+03:00 Richard Biener : >>>>>>>>>>>>>>> On Wed, Nov 12, 2014 at 2:35 PM, Yuri Rumyantsev wrote: >>>>>>>>>>>>>>>> Hi All, >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> Here is the second patch related to extended predication. >>>>>>>>>>>>>>>> Few comments which explain a main goal of design. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> 1. I don't want to insert any critical edge splitting since it may >>>>>>>>>>>>>>>> lead to less efficient binaries. >>>>>>>>>>>>>>>> 2. One special case of extended PHI node predication was introduced >>>>>>>>>>>>>>>> when #arguments is more than 2 but only two arguments are different >>>>>>>>>>>>>>>> and one argument has the only occurrence. For such PHI conditional >>>>>>>>>>>>>>>> scalar reduction is applied. >>>>>>>>>>>>>>>> This is correspondent to the following statement: >>>>>>>>>>>>>>>> if (q1 && q2 && q3) var++ >>>>>>>>>>>>>>>> New function phi_has_two_different_args was introduced to detect such phi. >>>>>>>>>>>>>>>> 3. Original algorithm for PHI predication used assumption that at >>>>>>>>>>>>>>>> least one incoming edge for blocks containing PHI is not critical - it >>>>>>>>>>>>>>>> guarantees that all computations related to predicate of normal edge >>>>>>>>>>>>>>>> are already inserted above this block and >>>>>>>>>>>>>>>> code related to PHI predication can be inserted at the beginning of >>>>>>>>>>>>>>>> block. But this is not true for critical edges for which predicate >>>>>>>>>>>>>>>> computations are in the block where code for phi predication must be >>>>>>>>>>>>>>>> inserted. So new function find_insertion_point is introduced which is >>>>>>>>>>>>>>>> simply found out the last statement in block defining predicates >>>>>>>>>>>>>>>> correspondent to all incoming edges and insert phi predication code >>>>>>>>>>>>>>>> after it (with some minor exceptions). >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> Unfortunately the patch doesn't apply for me - I get >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> patch: **** malformed patch at line 505: @@ -1720,6 +2075,8 @@ >>>>>>>>>>>>>>> predicate_all_scalar_phis (struct loop *loop) >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> a few remarks nevertheless. I don't see how we need both >>>>>>>>>>>>>>> predicate_extended_scalar_phi and predicate_arbitrary_scalar_phi. >>>>>>>>>>>>>>> Couldn't we simply sort an array of (edge, value) pairs after value >>>>>>>>>>>>>>> and handle equal values specially in predicate_extended_scalar_phi? >>>>>>>>>>>>>>> That would even make PHI more optimal. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> I don't understand the need for find_insertion_point. All SSA names >>>>>>>>>>>>>>> required for the predicates are defined upward - and the complex CFG >>>>>>>>>>>>>>> is squashed to a single basic-block, thus the defs will dominate the >>>>>>>>>>>>>>> inserted code if you insert after labels just like for the other case. >>>>>>>>>>>>>>> Or what am I missing? ("flattening" of the basic-blocks of course needs >>>>>>>>>>>>>>> to happen in dominator order - but I guess that happens already?) >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> I'd like the extended PHI handling to be enablable by a flag even >>>>>>>>>>>>>>> for !force-vectorization - I've seen cases with 3 PHI args multiple >>>>>>>>>>>>>>> times that would have been nice to vectorize. I suggest to >>>>>>>>>>>>>>> add -ftree-loop-if-convert-aggressive for this. We can do this as >>>>>>>>>>>>>>> followup, but please rename the local flag_force_vectorize flag >>>>>>>>>>>>>>> to something less looking like a flag, like simply 'aggressive'. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> Otherwise patch 2 looks ok to me. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> Richard. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> ChangeLog: >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> 2014-10-24 Yuri Rumyantsev >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> * tree-if-conv.c (ifcvt_can_use_mask_load_store): Use >>>>>>>>>>>>>>>> FLAG_FORCE_VECTORIZE instead of loop flag. >>>>>>>>>>>>>>>> (if_convertible_bb_p): Allow bb has more than 2 predecessors if >>>>>>>>>>>>>>>> FLAG_FORCE_VECTORIZE is true. >>>>>>>>>>>>>>>> (if_convertible_bb_p): Delete check that bb has at least one >>>>>>>>>>>>>>>> non-critical incoming edge. >>>>>>>>>>>>>>>> (phi_has_two_different_args): New function. >>>>>>>>>>>>>>>> (is_cond_scalar_reduction): Add argument EXTENDED to choose access >>>>>>>>>>>>>>>> to phi arguments. Invoke phi_has_two_different_args to get phi >>>>>>>>>>>>>>>> arguments if EXTENDED is true. Change check that block >>>>>>>>>>>>>>>> containing reduction statement candidate is predecessor >>>>>>>>>>>>>>>> of phi-block since phi may have more than two arguments. >>>>>>>>>>>>>>>> (convert_scalar_cond_reduction): Add argument BEFORE to insert >>>>>>>>>>>>>>>> statement before/after gsi point. >>>>>>>>>>>>>>>> (predicate_scalar_phi): Add argument false (which means non-extended >>>>>>>>>>>>>>>> predication) to call of is_cond_scalar_reduction. Add argument >>>>>>>>>>>>>>>> true (which correspondent to argument BEFORE) to call of >>>>>>>>>>>>>>>> convert_scalar_cond_reduction. >>>>>>>>>>>>>>>> (get_predicate_for_edge): New function. >>>>>>>>>>>>>>>> (predicate_arbitrary_scalar_phi): New function. >>>>>>>>>>>>>>>> (predicate_extended_scalar_phi): New function. >>>>>>>>>>>>>>>> (find_insertion_point): New function. >>>>>>>>>>>>>>>> (predicate_all_scalar_phis): Add two boolean variables EXTENDED and >>>>>>>>>>>>>>>> BEFORE. Initialize EXTENDED to true if BB containing phi has more >>>>>>>>>>>>>>>> than 2 predecessors or both incoming edges are critical. Invoke >>>>>>>>>>>>>>>> find_phi_replacement_condition and predicate_scalar_phi or >>>>>>>>>>>>>>>> find_insertion_point and predicate_extended_scalar_phi depending on >>>>>>>>>>>>>>>> EXTENDED value. >>>>>>>>>>>>>>>> (insert_gimplified_predicates): Add check that non-predicated block >>>>>>>>>>>>>>>> may have statements to insert. Insert predicate of BB just after label >>>>>>>>>>>>>>>> if FLAG_FORCE_VECTORIZE is true. >>>>>>>>>>>>>>>> (tree_if_conversion): Add initialization of FLAG_FORCE_VECTORIZE which >>>>>>>>>>>>>>>> is copy of inner or outer loop field force_vectorize. --047d7bb0400282936e050a7dcc97 Content-Type: application/octet-stream; name="patch.20141218" Content-Disposition: attachment; filename="patch.20141218" Content-Transfer-Encoding: base64 X-Attachment-Id: f_i3u6jso30 Content-length: 42721 ZGlmZiAtLWdpdCBhL2djYy90cmVlLWlmLWNvbnYuYyBiL2djYy90cmVlLWlm LWNvbnYuYwppbmRleCBmN2JlZmFjLi4xNGIxY2I5IDEwMDY0NAotLS0gYS9n Y2MvdHJlZS1pZi1jb252LmMKKysrIGIvZ2NjL3RyZWUtaWYtY29udi5jCkBA IC0xMjcsMTAgKzEyNywxNCBAQCBhbG9uZyB3aXRoIEdDQzsgc2VlIHRoZSBm aWxlIENPUFlJTkczLiAgSWYgbm90IHNlZQogI2luY2x1ZGUgImV4cHIuaCIK ICNpbmNsdWRlICJpbnNuLWNvZGVzLmgiCiAjaW5jbHVkZSAib3B0YWJzLmgi CisjaW5jbHVkZSAiaGFzaC1tYXAuaCIKIAogLyogTGlzdCBvZiBiYXNpYyBi bG9ja3MgaW4gaWYtY29udmVyc2lvbi1zdWl0YWJsZSBvcmRlci4gICovCiBz dGF0aWMgYmFzaWNfYmxvY2sgKmlmY19iYnM7CiAKKy8qIEFwcGx5IG1vcmUg YWdncmVzc2l2ZSAoZXh0ZW5kZWQpIGlmLWNvbnZlcnNpb24gaWYgdHJ1ZS4g ICovCitzdGF0aWMgYm9vbCBhZ2dyZXNzaXZlX2lmX2NvbnY7CisKIC8qIFN0 cnVjdHVyZSB1c2VkIHRvIHByZWRpY2F0ZSBiYXNpYyBibG9ja3MuICBUaGlz IGlzIGF0dGFjaGVkIHRvIHRoZQogICAgLT5hdXggZmllbGQgb2YgdGhlIEJC cyBpbiB0aGUgbG9vcCB0byBiZSBpZi1jb252ZXJ0ZWQuICAqLwogdHlwZWRl ZiBzdHJ1Y3QgYmJfcHJlZGljYXRlX3MgewpAQCAtMzczLDYgKzM3NywyMiBA QCBzdGF0aWMgdHJlZQogZm9sZF9idWlsZF9jb25kX2V4cHIgKHRyZWUgdHlw ZSwgdHJlZSBjb25kLCB0cmVlIHJocywgdHJlZSBsaHMpCiB7CiAgIHRyZWUg cmhzMSwgbGhzMSwgY29uZF9leHByOworCisgIC8qIElmIENPTkQgaXMgY29t cGFyaXNvbiByICE9IDAgYW5kIHIgaGFzIGJvb2xlYW4gdHlwZSwgY29udmVy dCBDT05ECisgICAgIHRvIFNTQV9OQU1FIHRvIGFjY2VwdCBieSB2ZWN0IGJv b2wgcGF0dGVybi4gICovCisgIGlmIChUUkVFX0NPREUgKGNvbmQpID09IE5F X0VYUFIpCisgICAgeworICAgICAgdHJlZSBvcDAgPSBUUkVFX09QRVJBTkQg KGNvbmQsIDApOworICAgICAgdHJlZSBvcDEgPSBUUkVFX09QRVJBTkQgKGNv bmQsIDEpOworICAgICAgaWYgKFRSRUVfQ09ERSAob3AwKSA9PSBTU0FfTkFN RQorCSAgJiYgVFJFRV9DT0RFIChUUkVFX1RZUEUgKG9wMCkpID09IEJPT0xF QU5fVFlQRQorCSAgJiYgKGludGVnZXJfemVyb3AgKG9wMSkpKQorCWNvbmQg PSBvcDA7CisgICAgICBlbHNlIGlmIChUUkVFX0NPREUgKG9wMSkgPT0gU1NB X05BTUUKKwkgICAgICAgJiYgVFJFRV9DT0RFIChUUkVFX1RZUEUgKG9wMSkp ID09IEJPT0xFQU5fVFlQRQorCSAgICAgICAmJiAoaW50ZWdlcl96ZXJvcCAo b3AwKSkpCisJY29uZCA9IG9wMTsKKyAgICB9CiAgIGNvbmRfZXhwciA9IGZv bGRfdGVybmFyeSAoQ09ORF9FWFBSLCB0eXBlLCBjb25kLAogCQkJICAgIHJo cywgbGhzKTsKIApAQCAtNDg1LDEwICs1MDUsMTEgQEAgYWRkX3RvX2RzdF9w cmVkaWNhdGVfbGlzdCAoc3RydWN0IGxvb3AgKmxvb3AsIGVkZ2UgZSwKICAg ICBjb25kID0gZm9sZF9idWlsZDIgKFRSVVRIX0FORF9FWFBSLCBib29sZWFu X3R5cGVfbm9kZSwKIAkJCXByZXZfY29uZCwgY29uZCk7CiAKLSAgYWRkX3Rv X3ByZWRpY2F0ZV9saXN0IChsb29wLCBlLT5kZXN0LCBjb25kKTsKKyAgaWYg KCFkb21pbmF0ZWRfYnlfcCAoQ0RJX0RPTUlOQVRPUlMsIGxvb3AtPmxhdGNo LCBlLT5kZXN0KSkKKyAgICBhZGRfdG9fcHJlZGljYXRlX2xpc3QgKGxvb3As IGUtPmRlc3QsIGNvbmQpOwogfQogCi0vKiBSZXR1cm4gdHJ1ZSBpZiBvbmUg b2YgdGhlIHN1Y2Nlc3NvciBlZGdlcyBvZiBCQiBleGl0cyBMT09QLiAgKi8K Ky8qIFJldHVybnMgdHJ1ZSBpZiBvbmUgb2YgdGhlIHN1Y2Nlc3NvciBlZGdl cyBvZiBCQiBleGl0cyBMT09QLiAgKi8KIAogc3RhdGljIGJvb2wKIGJiX3dp dGhfZXhpdF9lZGdlX3AgKHN0cnVjdCBsb29wICpsb29wLCBiYXNpY19ibG9j ayBiYikKQEAgLTUxMiw3ICs1MzMsOSBAQCBiYl93aXRoX2V4aXRfZWRnZV9w IChzdHJ1Y3QgbG9vcCAqbG9vcCwgYmFzaWNfYmxvY2sgYmIpCiAgICBXaGVu IHRoZSBmbGFnX3RyZWVfbG9vcF9pZl9jb252ZXJ0X3N0b3JlcyBpcyBub3Qg c2V0LCBQSEkgaXMgbm90CiAgICBpZi1jb252ZXJ0aWJsZSBpZjoKICAgIC0g YSB2aXJ0dWFsIFBISSBpcyBpbW1lZGlhdGVseSB1c2VkIGluIGFub3RoZXIg UEhJIG5vZGUsCi0gICAtIHRoZXJlIGlzIGEgdmlydHVhbCBQSEkgaW4gYSBC QiBvdGhlciB0aGFuIHRoZSBsb29wLT5oZWFkZXIuICAqLworICAgLSB0aGVy ZSBpcyBhIHZpcnR1YWwgUEhJIGluIGEgQkIgb3RoZXIgdGhhbiB0aGUgbG9v cC0+aGVhZGVyLgorICAgV2hlbiB0aGUgYWdncmVzc2l2ZV9pZl9jb252IGlz IHNldCwgUEhJIGNhbiBoYXZlIG1vcmUgdGhhbgorICAgdHdvIGFyZ3VtZW50 cy4gICovCiAKIHN0YXRpYyBib29sCiBpZl9jb252ZXJ0aWJsZV9waGlfcCAo c3RydWN0IGxvb3AgKmxvb3AsIGJhc2ljX2Jsb2NrIGJiLCBncGhpICpwaGks CkBAIC01MjQsMTEgKzU0NywxNyBAQCBpZl9jb252ZXJ0aWJsZV9waGlfcCAo c3RydWN0IGxvb3AgKmxvb3AsIGJhc2ljX2Jsb2NrIGJiLCBncGhpICpwaGks CiAgICAgICBwcmludF9naW1wbGVfc3RtdCAoZHVtcF9maWxlLCBwaGksIDAs IFRERl9TTElNKTsKICAgICB9CiAKLSAgaWYgKGJiICE9IGxvb3AtPmhlYWRl ciAmJiBnaW1wbGVfcGhpX251bV9hcmdzIChwaGkpICE9IDIpCisgIGlmIChi YiAhPSBsb29wLT5oZWFkZXIpCiAgICAgewotICAgICAgaWYgKGR1bXBfZmls ZSAmJiAoZHVtcF9mbGFncyAmIFRERl9ERVRBSUxTKSkKLQlmcHJpbnRmIChk dW1wX2ZpbGUsICJNb3JlIHRoYW4gdHdvIHBoaSBub2RlIGFyZ3MuXG4iKTsK LSAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGlmIChnaW1wbGVfcGhpX251 bV9hcmdzIChwaGkpICE9IDIpCisJeworCSAgaWYgKCFhZ2dyZXNzaXZlX2lm X2NvbnYpCisJICAgIHsKKwkgICAgICBpZiAoZHVtcF9maWxlICYmIChkdW1w X2ZsYWdzICYgVERGX0RFVEFJTFMpKQorCQlmcHJpbnRmIChkdW1wX2ZpbGUs ICJNb3JlIHRoYW4gdHdvIHBoaSBub2RlIGFyZ3MuXG4iKTsKKwkgICAgICBy ZXR1cm4gZmFsc2U7CisJICAgIH0KKyAgICAgICAgfQogICAgIH0KIAogICBp ZiAoZmxhZ190cmVlX2xvb3BfaWZfY29udmVydF9zdG9yZXMgfHwgYW55X21h c2tfbG9hZF9zdG9yZSkKQEAgLTg5NSw3ICs5MjQsOCBAQCBpZl9jb252ZXJ0 aWJsZV9naW1wbGVfYXNzaWduX3N0bXRfcCAoZ2ltcGxlIHN0bXQsCiAKICAg IEEgc3RhdGVtZW50IGlzIGlmLWNvbnZlcnRpYmxlIGlmOgogICAgLSBpdCBp cyBhbiBpZi1jb252ZXJ0aWJsZSBHSU1QTEVfQVNTSUdOLAotICAgLSBpdCBp cyBhIEdJTVBMRV9MQUJFTCBvciBhIEdJTVBMRV9DT05ELiAgKi8KKyAgIC0g aXQgaXMgYSBHSU1QTEVfTEFCRUwgb3IgYSBHSU1QTEVfQ09ORCwKKyAgIC0g aXQgaXMgYnVpbHRpbnMgY2FsbC4gICovCiAKIHN0YXRpYyBib29sCiBpZl9j b252ZXJ0aWJsZV9zdG10X3AgKGdpbXBsZSBzdG10LCB2ZWM8ZGF0YV9yZWZl cmVuY2VfcD4gcmVmcywKQEAgLTk0Miw2ICs5NzIsMzUgQEAgaWZfY29udmVy dGlibGVfc3RtdF9wIChnaW1wbGUgc3RtdCwgdmVjPGRhdGFfcmVmZXJlbmNl X3A+IHJlZnMsCiAgIHJldHVybiB0cnVlOwogfQogCisvKiBBc3N1bWVzIHRo YXQgQkIgaGFzIG1vcmUgdGhhbiAxIHByZWRlY2Vzc29ycy4KKyAgIFJldHVy bnMgZmFsc2UgaWYgYXQgbGVhc3Qgb25lIHN1Y2Nlc3NvciBpcyBub3Qgb24g Y3JpdGljYWwgZWRnZQorICAgYW5kIHRydWUgb3RoZXJ3aXNlLiAgKi8KKwor c3RhdGljIGlubGluZSBib29sCithbGxfcHJlZHNfY3JpdGljYWxfcCAoYmFz aWNfYmxvY2sgYmIpCit7CisgIGVkZ2UgZTsKKyAgZWRnZV9pdGVyYXRvciBl aTsKKworICBGT1JfRUFDSF9FREdFIChlLCBlaSwgYmItPnByZWRzKQorICAg IGlmIChFREdFX0NPVU5UIChlLT5zcmMtPnN1Y2NzKSA9PSAxKQorICAgICAg cmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKworLyogUmV0dXJu cyB0cnVlIGlmIGF0IGxlYXN0IG9uZSBzdWNjZXNzb3IgaW4gb24gY3JpdGlj YWwgZWRnZS4gICovCitzdGF0aWMgaW5saW5lIGJvb2wKK2hhc19wcmVkX2Ny aXRpY2FsX3AgKGJhc2ljX2Jsb2NrIGJiKQoreworICBlZGdlIGU7CisgIGVk Z2VfaXRlcmF0b3IgZWk7CisKKyAgRk9SX0VBQ0hfRURHRSAoZSwgZWksIGJi LT5wcmVkcykKKyAgICBpZiAoRURHRV9DT1VOVCAoZS0+c3JjLT5zdWNjcykg PiAxKQorICAgICAgcmV0dXJuIHRydWU7CisgIHJldHVybiBmYWxzZTsKK30K KwogLyogUmV0dXJuIHRydWUgd2hlbiBCQiBpcyBpZi1jb252ZXJ0aWJsZS4g IFRoaXMgcm91dGluZSBkb2VzIG5vdCBjaGVjawogICAgYmFzaWMgYmxvY2sn cyBzdGF0ZW1lbnRzIGFuZCBwaGlzLgogCkBAIC05NTAsNiArMTAwOSw5IEBA IGlmX2NvbnZlcnRpYmxlX3N0bXRfcCAoZ2ltcGxlIHN0bXQsIHZlYzxkYXRh X3JlZmVyZW5jZV9wPiByZWZzLAogICAgLSBpdCBpcyBhZnRlciB0aGUgZXhp dCBibG9jayBidXQgYmVmb3JlIHRoZSBsYXRjaCwKICAgIC0gaXRzIGVkZ2Vz IGFyZSBub3Qgbm9ybWFsLgogCisgICBMYXN0IHJlc3RyaWN0aW9uIHdpbGwg YmUgZGVsZXRlZCBhZnRlciBhZGRpbmcgc3VwcG9ydCBmb3IgZXh0ZW5kZWQK KyAgIHByZWRpY2F0aW9uLgorCiAgICBFWElUX0JCIGlzIHRoZSBiYXNpYyBi bG9jayBjb250YWluaW5nIHRoZSBleGl0IG9mIHRoZSBMT09QLiAgQkIgaXMK ICAgIGluc2lkZSBMT09QLiAgKi8KIApAQCAtOTYyLDEwICsxMDI0LDE1IEBA IGlmX2NvbnZlcnRpYmxlX2JiX3AgKHN0cnVjdCBsb29wICpsb29wLCBiYXNp Y19ibG9jayBiYiwgYmFzaWNfYmxvY2sgZXhpdF9iYikKICAgaWYgKGR1bXBf ZmlsZSAmJiAoZHVtcF9mbGFncyAmIFRERl9ERVRBSUxTKSkKICAgICBmcHJp bnRmIChkdW1wX2ZpbGUsICItLS0tLS0tLS0tWyVkXS0tLS0tLS0tLS0tLS1c biIsIGJiLT5pbmRleCk7CiAKLSAgaWYgKEVER0VfQ09VTlQgKGJiLT5wcmVk cykgPiAyCi0gICAgICB8fCBFREdFX0NPVU5UIChiYi0+c3VjY3MpID4gMikK KyAgaWYgKEVER0VfQ09VTlQgKGJiLT5zdWNjcykgPiAyKQogICAgIHJldHVy biBmYWxzZTsKIAorICBpZiAoRURHRV9DT1VOVCAoYmItPnByZWRzKSA+IDIp CisgICAgeworICAgICAgaWYgKCFhZ2dyZXNzaXZlX2lmX2NvbnYpCisJcmV0 dXJuIGZhbHNlOworICAgIH0KKwogICBpZiAoZXhpdF9iYikKICAgICB7CiAg ICAgICBpZiAoYmIgIT0gbG9vcC0+bGF0Y2gpCkBAIC0xMDAxLDIwICsxMDY4 LDE1IEBAIGlmX2NvbnZlcnRpYmxlX2JiX3AgKHN0cnVjdCBsb29wICpsb29w LCBiYXNpY19ibG9jayBiYiwgYmFzaWNfYmxvY2sgZXhpdF9iYikKIAogICAv KiBBdCBsZWFzdCBvbmUgaW5jb21pbmcgZWRnZSBoYXMgdG8gYmUgbm9uLWNy aXRpY2FsIGFzIG90aGVyd2lzZSBlZGdlCiAgICAgIHByZWRpY2F0ZXMgYXJl IG5vdCBlcXVhbCB0byBiYXNpYy1ibG9jayBwcmVkaWNhdGVzIG9mIHRoZSBl ZGdlCi0gICAgIHNvdXJjZS4gICovCi0gIGlmIChFREdFX0NPVU5UIChiYi0+ cHJlZHMpID4gMQotICAgICAgJiYgYmIgIT0gbG9vcC0+aGVhZGVyKQotICAg IHsKLSAgICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKLSAgICAgIEZPUl9FQUNI X0VER0UgKGUsIGVpLCBiYi0+cHJlZHMpCi0JaWYgKEVER0VfQ09VTlQgKGUt PnNyYy0+c3VjY3MpID09IDEpCi0JICBmb3VuZCA9IHRydWU7Ci0gICAgICBp ZiAoIWZvdW5kKQotCXsKLQkgIGlmIChkdW1wX2ZpbGUgJiYgKGR1bXBfZmxh Z3MgJiBUREZfREVUQUlMUykpCi0JICAgIGZwcmludGYgKGR1bXBfZmlsZSwg Im9ubHkgY3JpdGljYWwgcHJlZGVjZXNzb3JzXG4iKTsKLQkgIHJldHVybiBm YWxzZTsKLQl9CisgICAgIHNvdXJjZS4gVGhpcyBjaGVjayBpcyBza2lwcGVk IGlmIGFnZ3Jlc3NpdmVfaWZfY29udiBpcyB0cnVlLiAgKi8KKyAgaWYgKCFh Z2dyZXNzaXZlX2lmX2NvbnYKKyAgICAgICYmIEVER0VfQ09VTlQgKGJiLT5w cmVkcykgPiAxCisgICAgICAmJiBiYiAhPSBsb29wLT5oZWFkZXIKKyAgICAg ICYmIGFsbF9wcmVkc19jcml0aWNhbF9wIChiYikpCisgICAgeworICAgICAg aWYgKGR1bXBfZmlsZSAmJiAoZHVtcF9mbGFncyAmIFRERl9ERVRBSUxTKSkK KwlmcHJpbnRmIChkdW1wX2ZpbGUsICJvbmx5IGNyaXRpY2FsIHByZWRlY2Vz c29yc1xuIik7CisJcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICByZXR1cm4g dHJ1ZTsKQEAgLTExMjYsMTEgKzExODgsMTIgQEAgcHJlZGljYXRlX2JicyAo bG9vcF9wIGxvb3ApCiAgICAgICB0cmVlIGNvbmQ7CiAgICAgICBnaW1wbGUg c3RtdDsKIAotICAgICAgLyogVGhlIGxvb3AgbGF0Y2ggaXMgYWx3YXlzIGV4 ZWN1dGVkIGFuZCBoYXMgbm8gZXh0cmEgY29uZGl0aW9ucwotCSB0byBiZSBw cm9jZXNzZWQ6IHNraXAgaXQuICAqLwotICAgICAgaWYgKGJiID09IGxvb3At PmxhdGNoKQorICAgICAgLyogVGhlIGxvb3AgbGF0Y2ggYW5kIGxvb3AgZXhp dCBibG9jayBhcmUgYWx3YXlzIGV4ZWN1dGVkIGFuZAorCSBoYXZlIG5vIGV4 dHJhIGNvbmRpdGlvbnMgdG8gYmUgcHJvY2Vzc2VkOiBza2lwIHRoZW0uICAq LworICAgICAgaWYgKGJiID09IGxvb3AtPmxhdGNoCisJICB8fCBiYl93aXRo X2V4aXRfZWRnZV9wIChsb29wLCBiYikpCiAJewotCSAgcmVzZXRfYmJfcHJl ZGljYXRlIChsb29wLT5sYXRjaCk7CisJICByZXNldF9iYl9wcmVkaWNhdGUg KGJiKTsKIAkgIGNvbnRpbnVlOwogCX0KIApAQCAtMTE0MSw3ICsxMjA0LDcg QEAgcHJlZGljYXRlX2JicyAobG9vcF9wIGxvb3ApCiAJICB0cmVlIGMyOwog CSAgZWRnZSB0cnVlX2VkZ2UsIGZhbHNlX2VkZ2U7CiAJICBsb2NhdGlvbl90 IGxvYyA9IGdpbXBsZV9sb2NhdGlvbiAoc3RtdCk7Ci0JICB0cmVlIGMgPSBm b2xkX2J1aWxkMl9sb2MgKGxvYywgZ2ltcGxlX2NvbmRfY29kZSAoc3RtdCks CisJICB0cmVlIGMgPSBidWlsZDJfbG9jIChsb2MsIGdpbXBsZV9jb25kX2Nv ZGUgKHN0bXQpLAogCQkJCSAgICBib29sZWFuX3R5cGVfbm9kZSwKIAkJCQkg ICAgZ2ltcGxlX2NvbmRfbGhzIChzdG10KSwKIAkJCQkgICAgZ2ltcGxlX2Nv bmRfcmhzIChzdG10KSk7CkBAIC0xMjkxLDcgKzEzNTQsNyBAQCBpZl9jb252 ZXJ0aWJsZV9sb29wX3BfMSAoc3RydWN0IGxvb3AgKmxvb3AsCiAgICAgfQog CiAgIGlmIChkdW1wX2ZpbGUpCi0gICAgZnByaW50ZiAoZHVtcF9maWxlLCAi QXBwbHlpbmcgaWYtY29udmVyc2lvblxuIik7CisgICAgZnByaW50ZiAoZHVt cF9maWxlLCAiQXBwbHlpbmcgaWYtY29udmVyc2lvbiBmb3IgbG9vcC0+aGVh ZGVyIyVkIGluICVzXG4iLCBsb29wLT5oZWFkZXItPmluZGV4LCBjdXJyZW50 X2Z1bmN0aW9uX25hbWUoKSk7CiAKICAgcmV0dXJuIHRydWU7CiB9CkBAIC0x MzYzLDYwICsxNDI2LDYgQEAgaWZfY29udmVydGlibGVfbG9vcF9wIChzdHJ1 Y3QgbG9vcCAqbG9vcCwgYm9vbCAqYW55X21hc2tfbG9hZF9zdG9yZSkKICAg cmV0dXJuIHJlczsKIH0KIAotLyogQmFzaWMgYmxvY2sgQkIgaGFzIHR3byBw cmVkZWNlc3NvcnMuICBVc2luZyBwcmVkZWNlc3NvcidzIGJiCi0gICBwcmVk aWNhdGUsIHNldCBhbiBhcHByb3ByaWF0ZSBjb25kaXRpb24gQ09ORCBmb3Ig dGhlIFBISSBub2RlCi0gICByZXBsYWNlbWVudC4gIFJldHVybiB0aGUgdHJ1 ZSBibG9jayB3aG9zZSBwaGkgYXJndW1lbnRzIGFyZQotICAgc2VsZWN0ZWQg d2hlbiBjb25kIGlzIHRydWUuICBMT09QIGlzIHRoZSBsb29wIGNvbnRhaW5p bmcgdGhlCi0gICBpZi1jb252ZXJ0ZWQgcmVnaW9uLCBHU0kgaXMgdGhlIHBs YWNlIHRvIGluc2VydCB0aGUgY29kZSBmb3IgdGhlCi0gICBpZi1jb252ZXJz aW9uLiAgKi8KLQotc3RhdGljIGJhc2ljX2Jsb2NrCi1maW5kX3BoaV9yZXBs YWNlbWVudF9jb25kaXRpb24gKGJhc2ljX2Jsb2NrIGJiLCB0cmVlICpjb25k LAotCQkJCWdpbXBsZV9zdG10X2l0ZXJhdG9yICpnc2kpCi17Ci0gIGVkZ2Ug Zmlyc3RfZWRnZSwgc2Vjb25kX2VkZ2U7Ci0gIHRyZWUgdG1wX2NvbmQ7Ci0K LSAgZ2NjX2Fzc2VydCAoRURHRV9DT1VOVCAoYmItPnByZWRzKSA9PSAyKTsK LSAgZmlyc3RfZWRnZSA9IEVER0VfUFJFRCAoYmIsIDApOwotICBzZWNvbmRf ZWRnZSA9IEVER0VfUFJFRCAoYmIsIDEpOwotCi0gIC8qIFByZWZlciBhbiBl ZGdlIHdpdGggYSBub3QgbmVnYXRlZCBwcmVkaWNhdGUuCi0gICAgID8/PyAg VGhhdCdzIGEgdmVyeSB3ZWFrIGNvc3QgbW9kZWwuICAqLwotICB0bXBfY29u ZCA9IGJiX3ByZWRpY2F0ZSAoZmlyc3RfZWRnZS0+c3JjKTsKLSAgZ2NjX2Fz c2VydCAodG1wX2NvbmQpOwotICBpZiAoVFJFRV9DT0RFICh0bXBfY29uZCkg PT0gVFJVVEhfTk9UX0VYUFIpCi0gICAgewotICAgICAgZWRnZSB0bXBfZWRn ZTsKLQotICAgICAgdG1wX2VkZ2UgPSBmaXJzdF9lZGdlOwotICAgICAgZmly c3RfZWRnZSA9IHNlY29uZF9lZGdlOwotICAgICAgc2Vjb25kX2VkZ2UgPSB0 bXBfZWRnZTsKLSAgICB9Ci0KLSAgLyogQ2hlY2sgaWYgdGhlIGVkZ2Ugd2Ug dGFrZSB0aGUgY29uZGl0aW9uIGZyb20gaXMgbm90IGNyaXRpY2FsLgotICAg ICBXZSBrbm93IHRoYXQgYXQgbGVhc3Qgb25lIG5vbi1jcml0aWNhbCBlZGdl IGV4aXN0cy4gICovCi0gIGlmIChFREdFX0NPVU5UIChmaXJzdF9lZGdlLT5z cmMtPnN1Y2NzKSA+IDEpCi0gICAgewotICAgICAgKmNvbmQgPSBiYl9wcmVk aWNhdGUgKHNlY29uZF9lZGdlLT5zcmMpOwotCi0gICAgICBpZiAoVFJFRV9D T0RFICgqY29uZCkgPT0gVFJVVEhfTk9UX0VYUFIpCi0JKmNvbmQgPSBUUkVF X09QRVJBTkQgKCpjb25kLCAwKTsKLSAgICAgIGVsc2UKLQkvKiBTZWxlY3Qg bm9uIGxvb3AgaGVhZGVyIGJiLiAgKi8KLQlmaXJzdF9lZGdlID0gc2Vjb25k X2VkZ2U7Ci0gICAgfQotICBlbHNlCi0gICAgKmNvbmQgPSBiYl9wcmVkaWNh dGUgKGZpcnN0X2VkZ2UtPnNyYyk7Ci0KLSAgLyogR2ltcGxpZnkgdGhlIGNv bmRpdGlvbiB0byBhIHZhbGlkIGNvbmQtZXhwciBjb25kaXRvbmFsIG9wZXJh bmQuICAqLwotICAqY29uZCA9IGZvcmNlX2dpbXBsZV9vcGVyYW5kX2dzaV8x IChnc2ksIHVuc2hhcmVfZXhwciAoKmNvbmQpLAotCQkJCSAgICAgIGlzX2dp bXBsZV9jb25kZXhwciwgTlVMTF9UUkVFLAotCQkJCSAgICAgIHRydWUsIEdT SV9TQU1FX1NUTVQpOwotCi0gIHJldHVybiBmaXJzdF9lZGdlLT5zcmM7Ci19 Ci0KIC8qIFJldHVybnMgdHJ1ZSBpZiBkZWYtc3RtdCBmb3IgcGhpIGFyZ3Vt ZW50IEFSRyBpcyBzaW1wbGUgaW5jcmVtZW50L2RlY3JlbWVudAogICAgd2hp Y2ggaXMgaW4gcHJlZGljYXRlZCBiYXNpYyBibG9jay4KICAgIEluIGZhY3Qs IHRoZSBmb2xsb3dpbmcgUEhJIHBhdHRlcm4gaXMgc2VhcmNoaW5nOgpAQCAt MTQyNywxNCArMTQzNiwxNSBAQCBmaW5kX3BoaV9yZXBsYWNlbWVudF9jb25k aXRpb24gKGJhc2ljX2Jsb2NrIGJiLCB0cmVlICpjb25kLAogCSAgcmVkdWNf MyA9IC4uLgogCXJlZHVjXzIgPSBQSEkgPHJlZHVjXzEsIHJlZHVjXzM+CiAK LSAgIFJFRFVDLCBPUDAgYW5kIE9QMSBjb250YWluIHJlZHVjdGlvbiBzdG10 IGFuZCBpdHMgb3BlcmFuZHMuICAqLworICAgQVJHXzAgYW5kIEFSR18xIGFy ZSBjb3JyZXNwb25kZW50IFBISSBhcmd1bWVudHMuCisgICBSRURVQywgT1Aw IGFuZCBPUDEgY29udGFpbiByZWR1Y3Rpb24gc3RtdCBhbmQgaXRzIG9wZXJh bmRzLgorICAgRVhURU5ERUQgaXMgdHJ1ZSBpZiBQSEkgaGFzID4gMiBhcmd1 bWVudHMuICAqLwogCiBzdGF0aWMgYm9vbAotaXNfY29uZF9zY2FsYXJfcmVk dWN0aW9uIChnaW1wbGUgcGhpLCBnaW1wbGUgKnJlZHVjLAotCQkJICB0cmVl ICpvcDAsIHRyZWUgKm9wMSkKK2lzX2NvbmRfc2NhbGFyX3JlZHVjdGlvbiAo Z2ltcGxlIHBoaSwgZ2ltcGxlICpyZWR1YywgdHJlZSBhcmdfMCwgdHJlZSBh cmdfMSwKKwkJCSAgdHJlZSAqb3AwLCB0cmVlICpvcDEsIGJvb2wgZXh0ZW5k ZWQpCiB7CiAgIHRyZWUgbGhzLCByX29wMSwgcl9vcDI7Ci0gIHRyZWUgYXJn XzAsIGFyZ18xOwogICBnaW1wbGUgc3RtdDsKICAgZ2ltcGxlIGhlYWRlcl9w aGkgPSBOVUxMOwogICBlbnVtIHRyZWVfY29kZSByZWR1Y3Rpb25fb3A7CkBA IC0xNDQzLDEzICsxNDUzLDEzIEBAIGlzX2NvbmRfc2NhbGFyX3JlZHVjdGlv biAoZ2ltcGxlIHBoaSwgZ2ltcGxlICpyZWR1YywKICAgZWRnZSBsYXRjaF9l ID0gbG9vcF9sYXRjaF9lZGdlIChsb29wKTsKICAgaW1tX3VzZV9pdGVyYXRv ciBpbW1faXRlcjsKICAgdXNlX29wZXJhbmRfcCB1c2VfcDsKLQotICBhcmdf MCA9IFBISV9BUkdfREVGIChwaGksIDApOwotICBhcmdfMSA9IFBISV9BUkdf REVGIChwaGksIDEpOworICBlZGdlIGU7CisgIGVkZ2VfaXRlcmF0b3IgZWk7 CisgIGJvb2wgcmVzdWx0ID0gZmFsc2U7CiAgIGlmIChUUkVFX0NPREUgKGFy Z18wKSAhPSBTU0FfTkFNRSB8fCBUUkVFX0NPREUgKGFyZ18xKSAhPSBTU0Ff TkFNRSkKICAgICByZXR1cm4gZmFsc2U7CiAKLSAgaWYgKGdpbXBsZV9jb2Rl IChTU0FfTkFNRV9ERUZfU1RNVCAoYXJnXzApKSA9PSBHSU1QTEVfUEhJKQor ICBpZiAoIWV4dGVuZGVkICYmIGdpbXBsZV9jb2RlIChTU0FfTkFNRV9ERUZf U1RNVCAoYXJnXzApKSA9PSBHSU1QTEVfUEhJKQogICAgIHsKICAgICAgIGxo cyA9IGFyZ18xOwogICAgICAgaGVhZGVyX3BoaSA9IFNTQV9OQU1FX0RFRl9T VE1UIChhcmdfMCk7CkBAIC0xNDgwLDggKzE0OTAsMTMgQEAgaXNfY29uZF9z Y2FsYXJfcmVkdWN0aW9uIChnaW1wbGUgcGhpLCBnaW1wbGUgKnJlZHVjLAog ICAgIHJldHVybiBmYWxzZTsKIAogICAvKiBDaGVjayB0aGF0IHN0bXQtYmxv Y2sgaXMgcHJlZGVjZXNzb3Igb2YgcGhpLWJsb2NrLiAgKi8KLSAgaWYgKEVE R0VfUFJFRCAoYmIsIDApLT5zcmMgIT0gZ2ltcGxlX2JiIChzdG10KQotICAg ICAgJiYgRURHRV9QUkVEIChiYiwgMSktPnNyYyAhPSBnaW1wbGVfYmIgKHN0 bXQpKQorICBGT1JfRUFDSF9FREdFIChlLCBlaSwgZ2ltcGxlX2JiIChzdG10 KS0+c3VjY3MpCisgICAgaWYgKGUtPmRlc3QgPT0gYmIpCisgICAgICB7CisJ cmVzdWx0ID0gdHJ1ZTsKKwlicmVhazsKKyAgICAgIH0KKyAgaWYgKCFyZXN1 bHQpCiAgICAgcmV0dXJuIGZhbHNlOwogCiAgIGlmICghaGFzX3NpbmdsZV91 c2UgKGxocykpCkBAIC0xNTc4LDkgKzE1OTMsNjYgQEAgY29udmVydF9zY2Fs YXJfY29uZF9yZWR1Y3Rpb24gKGdpbXBsZSByZWR1YywgZ2ltcGxlX3N0bXRf aXRlcmF0b3IgKmdzaSwKICAgcmV0dXJuIHJoczsKIH0KIAorLyogSGVscGVy cyBmb3IgUEhJIGFyZ3VtZW50cyBoYXNodGFibGUgbWFwLiAgKi8KKworc3Ry dWN0IHBoaV9hcmdzX2hhc2hfdHJhaXRzIDogZGVmYXVsdF9oYXNobWFwX3Ry YWl0cworeworICBzdGF0aWMgaW5saW5lIGhhc2h2YWxfdCBoYXNoICh0cmVl KTsKKyAgc3RhdGljIGlubGluZSBib29sIGVxdWFsX2tleXMgKHRyZWUsIHRy ZWUpOworfTsKKworaW5saW5lIGhhc2h2YWxfdAorcGhpX2FyZ3NfaGFzaF90 cmFpdHM6Omhhc2ggKHRyZWUgdmFsdWUpCit7CisgIHJldHVybiBpdGVyYXRp dmVfaGFzaF9leHByICh2YWx1ZSwgMCk7Cit9CisKK2lubGluZSBib29sCitw aGlfYXJnc19oYXNoX3RyYWl0czo6ZXF1YWxfa2V5cyAodHJlZSB2YWx1ZTEs IHRyZWUgdmFsdWUyKQoreworICByZXR1cm4gb3BlcmFuZF9lcXVhbF9wICh2 YWx1ZTEsIHZhbHVlMiwgMCk7Cit9CisKKyAgLyogUHJvZHVjZSBjb25kaXRp b24gZm9yIGFsbCBvY2N1cnJlbmNlcyBvZiBBUkcgaW4gUEhJIG5vZGUuICAq LworCitzdGF0aWMgdHJlZQorZ2VuX3BoaV9hcmdfY29uZGl0aW9uIChncGhp ICpwaGksIHZlYzxpbnQ+ICpvY2N1ciwKKwkJICAgICAgIGdpbXBsZV9zdG10 X2l0ZXJhdG9yICpnc2kpCit7CisgIGludCBsZW47CisgIGludCBpOworICB0 cmVlIGNvbmQgPSBOVUxMX1RSRUU7CisgIHRyZWUgYzsKKyAgZWRnZSBlOwor CisgIGxlbiA9IG9jY3VyLT5sZW5ndGggKCk7CisgIGdjY19hc3NlcnQgKGxl biA+IDApOworICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisgICAgewor ICAgICAgZSA9IGdpbXBsZV9waGlfYXJnX2VkZ2UgKHBoaSwgKCpvY2N1cilb aV0pOworICAgICAgYyA9IGJiX3ByZWRpY2F0ZSAoZS0+c3JjKTsKKyAgICAg IGlmIChpc190cnVlX3ByZWRpY2F0ZSAoYykpCisJY29udGludWU7CisgICAg ICBjID0gZm9yY2VfZ2ltcGxlX29wZXJhbmRfZ3NpXzEgKGdzaSwgdW5zaGFy ZV9leHByIChjKSwKKwkJCQkgICAgICBpc19naW1wbGVfY29uZGV4cHIsIE5V TExfVFJFRSwKKwkJCQkgICAgICB0cnVlLCBHU0lfU0FNRV9TVE1UKTsKKyAg ICAgIGlmIChjb25kICE9IE5VTExfVFJFRSkKKwl7CisJICAvKiBNdXN0IGJ1 aWxkIE9SIGV4cHJlc3Npb24uICAqLworCSAgY29uZCA9IGZvbGRfb3JfcHJl ZGljYXRlcyAoRVhQUl9MT0NBVElPTiAoYyksIGMsIGNvbmQpOworCSAgY29u ZCA9IGZvcmNlX2dpbXBsZV9vcGVyYW5kX2dzaV8xIChnc2ksIHVuc2hhcmVf ZXhwciAoY29uZCksCisJCQkJCSAgICAgaXNfZ2ltcGxlX2NvbmRleHByLCBO VUxMX1RSRUUsCisJCQkJCSAgICAgdHJ1ZSwgR1NJX1NBTUVfU1RNVCk7CisJ fQorICAgICAgZWxzZQorCWNvbmQgPSBjOworICAgIH0KKyAgZ2NjX2Fzc2Vy dCAoY29uZCAhPSBOVUxMX1RSRUUpOworICByZXR1cm4gY29uZDsKK30KKwog LyogUmVwbGFjZSBhIHNjYWxhciBQSEkgbm9kZSB3aXRoIGEgQ09ORF9FWFBS IHVzaW5nIENPTkQgYXMgY29uZGl0aW9uLgotICAgVGhpcyByb3V0aW5lIGRv ZXMgbm90IGhhbmRsZSBQSEkgbm9kZXMgd2l0aCBtb3JlIHRoYW4gdHdvCi0g ICBhcmd1bWVudHMuCisgICBUaGlzIHJvdXRpbmUgY2FuIGhhbmRsZSBQSEkg bm9kZXMgd2l0aCBtb3JlIHRoYW4gdHdvIGFyZ3VtZW50cy4KIAogICAgRm9y IGV4YW1wbGUsCiAgICAgIFMxOiBBID0gUEhJIDx4MSgxKSwgeDIoNSk+CkBA IC0xNTg4LDY5ICsxNjYwLDIwOSBAQCBjb252ZXJ0X3NjYWxhcl9jb25kX3Jl ZHVjdGlvbiAoZ2ltcGxlIHJlZHVjLCBnaW1wbGVfc3RtdF9pdGVyYXRvciAq Z3NpLAogICAgICBTMjogQSA9IGNvbmQgPyB4MSA6IHgyOwogCiAgICBUaGUg Z2VuZXJhdGVkIGNvZGUgaXMgaW5zZXJ0ZWQgYXQgR1NJIHRoYXQgcG9pbnRz IHRvIHRoZSB0b3Agb2YKLSAgIGJhc2ljIGJsb2NrJ3Mgc3RhdGVtZW50IGxp c3QuICBXaGVuIENPTkQgaXMgdHJ1ZSwgcGhpIGFyZyBmcm9tCi0gICBUUlVF X0JCIGlzIHNlbGVjdGVkLiAgKi8KKyAgIGJhc2ljIGJsb2NrJ3Mgc3RhdGVt ZW50IGxpc3QuCisgICBJZiBQSEkgbm9kZSBoYXMgbW9yZSB0aGFuIHR3byBh cmd1bWVudHMgYSBjaGFpbiBvZiBjb25kaXRpb25hbAorICAgZXhwcmVzc2lv biBpcyBwcm9kdWNlZC4gICovCisKIAogc3RhdGljIHZvaWQKLXByZWRpY2F0 ZV9zY2FsYXJfcGhpIChncGhpICpwaGksIHRyZWUgY29uZCwKLQkJICAgICAg YmFzaWNfYmxvY2sgdHJ1ZV9iYiwKLQkJICAgICAgZ2ltcGxlX3N0bXRfaXRl cmF0b3IgKmdzaSkKK3ByZWRpY2F0ZV9zY2FsYXJfcGhpIChncGhpICpwaGks IGdpbXBsZV9zdG10X2l0ZXJhdG9yICpnc2kpCiB7Ci0gIGdpbXBsZSBuZXdf c3RtdDsKKyAgZ2ltcGxlIG5ld19zdG10ID0gTlVMTCwgcmVkdWM7CisgIHRy ZWUgcmhzLCByZXMsIGFyZzAsIGFyZzEsIG9wMCwgb3AxLCBzY2V2OworICB0 cmVlIGNvbmQ7CisgIHVuc2lnbmVkIGludCBpbmRleDA7CisgIHVuc2lnbmVk IGludCBtYXgsIGFyZ3NfbGVuOworICBlZGdlIGU7CiAgIGJhc2ljX2Jsb2Nr IGJiOwotICB0cmVlIHJocywgcmVzLCBhcmcsIHNjZXY7Ci0KLSAgZ2NjX2Fz c2VydCAoZ2ltcGxlX2NvZGUgKHBoaSkgPT0gR0lNUExFX1BISQotCSAgICAg ICYmIGdpbXBsZV9waGlfbnVtX2FyZ3MgKHBoaSkgPT0gMik7CisgIHVuc2ln bmVkIGludCBpOwogCiAgIHJlcyA9IGdpbXBsZV9waGlfcmVzdWx0IChwaGkp OwotICAvKiBEbyBub3QgaGFuZGxlIHZpcnR1YWwgcGhpIG5vZGVzLiAgKi8K ICAgaWYgKHZpcnR1YWxfb3BlcmFuZF9wIChyZXMpKQogICAgIHJldHVybjsK IAotICBiYiA9IGdpbXBsZV9iYiAocGhpKTsKLQotICBpZiAoKGFyZyA9IGRl Z2VuZXJhdGVfcGhpX3Jlc3VsdCAocGhpKSkKKyAgaWYgKChyaHMgPSBkZWdl bmVyYXRlX3BoaV9yZXN1bHQgKHBoaSkpCiAgICAgICB8fCAoKHNjZXYgPSBh bmFseXplX3NjYWxhcl9ldm9sdXRpb24gKGdpbXBsZV9iYiAocGhpKS0+bG9v cF9mYXRoZXIsCiAJCQkJCSAgICByZXMpKQogCSAgJiYgIWNocmVjX2NvbnRh aW5zX3VuZGV0ZXJtaW5lZCAoc2NldikKIAkgICYmIHNjZXYgIT0gcmVzCi0J ICAmJiAoYXJnID0gZ2ltcGxlX3BoaV9hcmdfZGVmIChwaGksIDApKSkpCi0g ICAgcmhzID0gYXJnOwotICBlbHNlCi0gICAgewotICAgICAgdHJlZSBhcmdf MCwgYXJnXzE7Ci0gICAgICB0cmVlIG9wMCwgb3AxOwotICAgICAgZ2ltcGxl IHJlZHVjOworCSAgJiYgKHJocyA9IGdpbXBsZV9waGlfYXJnX2RlZiAocGhp LCAwKSkpKSB7CisgICAgaWYgKGR1bXBfZmlsZSAmJiAoZHVtcF9mbGFncyAm IFRERl9ERVRBSUxTKSkKKyAgICAgIHsKKwlmcHJpbnRmIChkdW1wX2ZpbGUs ICJEZWdlbmVyYXRlIHBoaSFcbiIpOworCXByaW50X2dpbXBsZV9zdG10IChk dW1wX2ZpbGUsIHBoaSwgMCwgVERGX1NMSU0pOworICAgICAgfQorICAgIG5l d19zdG10ID0gZ2ltcGxlX2J1aWxkX2Fzc2lnbiAocmVzLCByaHMpOworICAg IGdzaV9pbnNlcnRfYmVmb3JlIChnc2ksIG5ld19zdG10LCBHU0lfU0FNRV9T VE1UKTsKKyAgICB1cGRhdGVfc3RtdCAobmV3X3N0bXQpOworICAgIHJldHVy bjsKKyAgfQogCi0gICAgICAvKiBVc2UgY29uZGl0aW9uIHRoYXQgaXMgbm90 IFRSVVRIX05PVF9FWFBSIGluIGNvbmRpdGlvbmFsIG1vZGlmeSBleHByLiAg Ki8KKyAgYmIgPSBnaW1wbGVfYmIgKHBoaSk7CisgIGlmIChFREdFX0NPVU5U IChiYi0+cHJlZHMpID09IDIpCisgICAgeworICAgICAgLyogUHJlZGljYXRl IG9yZGluYXJ5IFBISSBub2RlIHdpdGggMiBhcmd1bWVudHMuICAqLworICAg ICAgZWRnZSBmaXJzdF9lZGdlLCBzZWNvbmRfZWRnZTsKKyAgICAgIGJhc2lj X2Jsb2NrIHRydWVfYmI7CisgICAgICBmaXJzdF9lZGdlID0gRURHRV9QUkVE IChiYiwgMCk7CisgICAgICBzZWNvbmRfZWRnZSA9IEVER0VfUFJFRCAoYmIs IDEpOworICAgICAgY29uZCA9IGJiX3ByZWRpY2F0ZSAoZmlyc3RfZWRnZS0+ c3JjKTsKKyAgICAgIGlmIChUUkVFX0NPREUgKGNvbmQpID09IFRSVVRIX05P VF9FWFBSKQorCXsKKwkgIGVkZ2UgdG1wX2VkZ2UgPSBmaXJzdF9lZGdlOwor CSAgZmlyc3RfZWRnZSA9IHNlY29uZF9lZGdlOworCSAgc2Vjb25kX2VkZ2Ug PSB0bXBfZWRnZTsKKwl9CisgICAgICBpZiAoRURHRV9DT1VOVCAoZmlyc3Rf ZWRnZS0+c3JjLT5zdWNjcykgPiAxKQorCXsKKwkgIGNvbmQgPSBiYl9wcmVk aWNhdGUgKHNlY29uZF9lZGdlLT5zcmMpOworCSAgaWYgKFRSRUVfQ09ERSAo Y29uZCkgPT0gVFJVVEhfTk9UX0VYUFIpCisJICAgIGNvbmQgPSBUUkVFX09Q RVJBTkQgKGNvbmQsIDApOworCSAgZWxzZQorCSAgICBmaXJzdF9lZGdlID0g c2Vjb25kX2VkZ2U7CisJfQorICAgICAgZWxzZQorCWNvbmQgPSBiYl9wcmVk aWNhdGUgKGZpcnN0X2VkZ2UtPnNyYyk7CisgICAgICAvKiBHaW1wbGlmeSB0 aGUgY29uZGl0aW9uIHRvIGEgdmFsaWQgY29uZC1leHByIGNvbmRpdG9uYWwg b3BlcmFuZC4gICovCisgICAgICBjb25kID0gZm9yY2VfZ2ltcGxlX29wZXJh bmRfZ3NpXzEgKGdzaSwgdW5zaGFyZV9leHByIChjb25kKSwKKwkJCQkJIGlz X2dpbXBsZV9jb25kZXhwciwgTlVMTF9UUkVFLAorCQkJCQkgdHJ1ZSwgR1NJ X1NBTUVfU1RNVCk7CisgICAgICB0cnVlX2JiID0gZmlyc3RfZWRnZS0+c3Jj OwogICAgICAgaWYgKEVER0VfUFJFRCAoYmIsIDEpLT5zcmMgPT0gdHJ1ZV9i YikKIAl7Ci0JICBhcmdfMCA9IGdpbXBsZV9waGlfYXJnX2RlZiAocGhpLCAx KTsKLQkgIGFyZ18xID0gZ2ltcGxlX3BoaV9hcmdfZGVmIChwaGksIDApOwor CSAgYXJnMCA9IGdpbXBsZV9waGlfYXJnX2RlZiAocGhpLCAxKTsKKwkgIGFy ZzEgPSBnaW1wbGVfcGhpX2FyZ19kZWYgKHBoaSwgMCk7CiAJfQogICAgICAg ZWxzZQogCXsKLQkgIGFyZ18wID0gZ2ltcGxlX3BoaV9hcmdfZGVmIChwaGks IDApOwotCSAgYXJnXzEgPSBnaW1wbGVfcGhpX2FyZ19kZWYgKHBoaSwgMSk7 CisJICBhcmcwID0gZ2ltcGxlX3BoaV9hcmdfZGVmIChwaGksIDApOworCSAg YXJnMSA9IGdpbXBsZV9waGlfYXJnX2RlZiAocGhpLCAxKTsKIAl9Ci0gICAg ICBpZiAoaXNfY29uZF9zY2FsYXJfcmVkdWN0aW9uIChwaGksICZyZWR1Yywg Jm9wMCwgJm9wMSkpCisgICAgICBpZiAoaXNfY29uZF9zY2FsYXJfcmVkdWN0 aW9uIChwaGksICZyZWR1YywgYXJnMCwgYXJnMSwKKwkJCQkgICAgJm9wMCwg Jm9wMSwgZmFsc2UpKQogCS8qIENvbnZlcnQgcmVkdWN0aW9uIHN0bXQgaW50 byB2ZWN0b3JpemFibGUgZm9ybS4gICovCiAJcmhzID0gY29udmVydF9zY2Fs YXJfY29uZF9yZWR1Y3Rpb24gKHJlZHVjLCBnc2ksIGNvbmQsIG9wMCwgb3Ax LAogCQkJCQkgICAgIHRydWVfYmIgIT0gZ2ltcGxlX2JiIChyZWR1YykpOwog ICAgICAgZWxzZQogCS8qIEJ1aWxkIG5ldyBSSFMgdXNpbmcgc2VsZWN0ZWQg Y29uZGl0aW9uIGFuZCBhcmd1bWVudHMuICAqLwogCXJocyA9IGZvbGRfYnVp bGRfY29uZF9leHByIChUUkVFX1RZUEUgKHJlcyksIHVuc2hhcmVfZXhwciAo Y29uZCksCi0JCQkJICAgIGFyZ18wLCBhcmdfMSk7CisJCQkJICAgIGFyZzAs IGFyZzEpOworICAgICAgbmV3X3N0bXQgPSBnaW1wbGVfYnVpbGRfYXNzaWdu IChyZXMsIHJocyk7CisgICAgICBnc2lfaW5zZXJ0X2JlZm9yZSAoZ3NpLCBu ZXdfc3RtdCwgR1NJX1NBTUVfU1RNVCk7CisgICAgICB1cGRhdGVfc3RtdCAo bmV3X3N0bXQpOworCisgICAgICBpZiAoZHVtcF9maWxlICYmIChkdW1wX2Zs YWdzICYgVERGX0RFVEFJTFMpKQorCXsKKwkgIGZwcmludGYgKGR1bXBfZmls ZSwgIm5ldyBwaGkgcmVwbGFjZW1lbnQgc3RtdFxuIik7CisJICBwcmludF9n aW1wbGVfc3RtdCAoZHVtcF9maWxlLCBuZXdfc3RtdCwgMCwgVERGX1NMSU0p OworCX0KKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgLyogQ3JlYXRlIGhh c2htYXAgZm9yIFBISSBub2RlIHdoaWNoIGNvbnRhaW4gdmVjdG9yIG9mIGFy Z3VtZW50IGluZGV4ZXMKKyAgICAgaGF2aW5nIHRoZSBzYW1lIHZhbHVlLiAg Ki8KKyAgYm9vbCBzd2FwID0gZmFsc2U7CisgIGhhc2hfbWFwPHRyZWUsIGF1 dG9fdmVjPGludD4sIHBoaV9hcmdzX2hhc2hfdHJhaXRzPiBwaGlfYXJnX21h cDsKKyAgdW5zaWduZWQgaW50IG51bV9hcmdzID0gZ2ltcGxlX3BoaV9udW1f YXJncyAocGhpKTsKKyAgaW50IG1heF9pbmQgPSAtMTsKKyAgLyogVmVjdG9y IG9mIGRpZmZlcmVudCBQSEkgYXJndW1lbnQgdmFsdWVzLiAgKi8KKyAgYXV0 b192ZWM8dHJlZT4gYXJncyAobnVtX2FyZ3MpOworCisgIC8qIENvbXB1dGUg cGhpX2FyZ19tYXAuICAqLworICBmb3IgKGkgPSAwOyBpIDwgbnVtX2FyZ3M7 IGkrKykKKyAgICB7CisgICAgICB0cmVlIGFyZzsKKworICAgICAgYXJnID0g Z2ltcGxlX3BoaV9hcmdfZGVmIChwaGksIGkpOworICAgICAgaWYgKCFwaGlf YXJnX21hcC5nZXQgKGFyZykpCisJYXJncy5xdWlja19wdXNoIChhcmcpOwor ICAgICAgcGhpX2FyZ19tYXAuZ2V0X29yX2luc2VydCAoYXJnKS5zYWZlX3B1 c2ggKGkpOworICAgIH0KKworICAvKiBEZXRlcm1pbmUgZWxlbWVudCB3aXRo IG1heCBudW1iZXIgb2Ygb2NjdXJyZW5jZXMuICAqLworICBtYXhfaW5kID0g LTE7CisgIG1heCA9IDE7CisgIGFyZ3NfbGVuID0gYXJncy5sZW5ndGggKCk7 CisgIGZvciAoaSA9IDA7IGkgPCBhcmdzX2xlbjsgaSsrKQorICAgIHsKKyAg ICAgIHVuc2lnbmVkIGludCBsZW47CisgICAgICBpZiAoKGxlbiA9IHBoaV9h cmdfbWFwLmdldCAoYXJnc1tpXSktPmxlbmd0aCAoKSkgPiBtYXgpCisJewor CSAgbWF4X2luZCA9IChpbnQpIGk7CisJICBtYXggPSBsZW47CisJfQorICAg IH0KKworICAvKiBQdXQgZWxlbWVudCB3aXRoIG1heCBudW1iZXIgb2Ygb2Nj dXJlbmNlcyB0byB0aGUgZW5kIG9mIEFSR1MuICAqLworICBpZiAobWF4X2lu ZCAhPSAtMSAmJiBtYXhfaW5kICsxICE9IChpbnQpIGFyZ3NfbGVuKQorICAg IHsKKyAgICAgIHRyZWUgdG1wID0gYXJnc1thcmdzX2xlbiAtIDFdOworICAg ICAgYXJnc1thcmdzX2xlbiAtIDFdID0gYXJnc1ttYXhfaW5kXTsKKyAgICAg IGFyZ3NbbWF4X2luZF0gPSB0bXA7CiAgICAgfQogCi0gIG5ld19zdG10ID0g Z2ltcGxlX2J1aWxkX2Fzc2lnbiAocmVzLCByaHMpOwotICBnc2lfaW5zZXJ0 X2JlZm9yZSAoZ3NpLCBuZXdfc3RtdCwgR1NJX1NBTUVfU1RNVCk7Ci0gIHVw ZGF0ZV9zdG10IChuZXdfc3RtdCk7CisgIC8qIEhhbmRsZSBvbmUgc3BlY2lh bCBjYXNlIHdoZW4gbnVtYmVyIG9mIGFyZ3VtZW50cyB3aXRoIGRpZmZlcmVu dCB2YWx1ZXMKKyAgICAgaXMgZXF1YWwgMiBhbmQgb25lIGFyZ3VtZW50IGhh cyB0aGUgb25seSBvY2N1cnJlbmNlLiBTdWNoIFBISSBjYW4gYmUKKyAgICAg aGFuZGxlZCBhcyBpZiB3b3VsZCBoYXZlIG9ubHkgMiBhcmd1bWVudHMuICAq LworICBpZiAoYXJnc19sZW4gPT0gMiAmJiBwaGlfYXJnX21hcC5nZXQgKGFy Z3NbMF0pLT5sZW5ndGggKCkgPT0gMSkKKyAgICB7CisgICAgICB2ZWM8aW50 PiAqaW5kZXhlczsKKyAgICAgIGluZGV4ZXMgPSBwaGlfYXJnX21hcC5nZXQg KGFyZ3NbMF0pOworICAgICAgaW5kZXgwID0gKCppbmRleGVzKVswXTsKKyAg ICAgIGFyZzAgPSBhcmdzWzBdOworICAgICAgYXJnMSA9IGFyZ3NbMV07Cisg ICAgICBlID0gZ2ltcGxlX3BoaV9hcmdfZWRnZSAocGhpLCBpbmRleDApOwor ICAgICAgY29uZCA9IGJiX3ByZWRpY2F0ZSAoZS0+c3JjKTsKKyAgICAgIGlm IChUUkVFX0NPREUgKGNvbmQpID09IFRSVVRIX05PVF9FWFBSKQorCXsKKwkg IHN3YXAgPSB0cnVlOworCSAgY29uZCA9IFRSRUVfT1BFUkFORCAoY29uZCwg MCk7CisJfQorICAgICAgLyogR2ltcGxpZnkgdGhlIGNvbmRpdGlvbiB0byBh IHZhbGlkIGNvbmQtZXhwciBjb25kaXRvbmFsIG9wZXJhbmQuICAqLworICAg ICAgY29uZCA9IGZvcmNlX2dpbXBsZV9vcGVyYW5kX2dzaV8xIChnc2ksIHVu c2hhcmVfZXhwciAoY29uZCksCisJCQkJCSBpc19naW1wbGVfY29uZGV4cHIs IE5VTExfVFJFRSwKKwkJCQkJIHRydWUsIEdTSV9TQU1FX1NUTVQpOworICAg ICAgaWYgKCEoaXNfY29uZF9zY2FsYXJfcmVkdWN0aW9uIChwaGksICZyZWR1 YywgYXJnMCAsIGFyZzEsCisJCQkJICAgICAgJm9wMCwgJm9wMSwgdHJ1ZSkp KQorCXJocyA9IGZvbGRfYnVpbGRfY29uZF9leHByIChUUkVFX1RZUEUgKHJl cyksIHVuc2hhcmVfZXhwciAoY29uZCksCisJCQkJICAgIHN3YXA/IGFyZzEg OiBhcmcwLAorCQkJCSAgICBzd2FwPyBhcmcwIDogYXJnMSk7CisgICAgICBl bHNlCisJLyogQ29udmVydCByZWR1Y3Rpb24gc3RtdCBpbnRvIHZlY3Rvcml6 YWJsZSBmb3JtLiAgKi8KKwlyaHMgPSBjb252ZXJ0X3NjYWxhcl9jb25kX3Jl ZHVjdGlvbiAocmVkdWMsIGdzaSwgY29uZCwgb3AwLCBvcDEsCisJCQkJCSAg ICAgc3dhcCk7CisgICAgICBuZXdfc3RtdCA9IGdpbXBsZV9idWlsZF9hc3Np Z24gKHJlcywgcmhzKTsKKyAgICAgIGdzaV9pbnNlcnRfYmVmb3JlIChnc2ks IG5ld19zdG10LCBHU0lfU0FNRV9TVE1UKTsKKyAgICAgIHVwZGF0ZV9zdG10 IChuZXdfc3RtdCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyog Q29tbW9uIGNhc2UuICAqLworICAgICAgdmVjPGludD4gKmluZGV4ZXM7Cisg ICAgICB0cmVlIHR5cGUgPSBUUkVFX1RZUEUgKGdpbXBsZV9waGlfcmVzdWx0 IChwaGkpKTsKKyAgICAgIHRyZWUgbGhzOworICAgICAgYXJnMSA9IGFyZ3Nb MV07CisgICAgICBmb3IgKGkgPSAwOyBpIDwgYXJnc19sZW47IGkrKykKKwl7 CisJICBhcmcwID0gYXJnc1tpXTsKKwkgIGluZGV4ZXMgPSBwaGlfYXJnX21h cC5nZXQgKGFyZ3NbaV0pOworCSAgaWYgKGkgIT0gYXJnc19sZW4gLSAxKQor CSAgICBsaHMgPSBtYWtlX3RlbXBfc3NhX25hbWUgKHR5cGUsIE5VTEwsICJf aWZjXyIpOworCSAgZWxzZQorCSAgICBsaHMgPSByZXM7CisJICBjb25kID0g Z2VuX3BoaV9hcmdfY29uZGl0aW9uIChwaGksIGluZGV4ZXMsIGdzaSk7CisJ ICByaHMgPSBmb2xkX2J1aWxkX2NvbmRfZXhwciAodHlwZSwgdW5zaGFyZV9l eHByIChjb25kKSwKKwkJCQkgICAgICBhcmcwLCBhcmcxKTsKKwkgIG5ld19z dG10ID0gZ2ltcGxlX2J1aWxkX2Fzc2lnbiAobGhzLCByaHMpOworCSAgZ3Np X2luc2VydF9iZWZvcmUgKGdzaSwgbmV3X3N0bXQsIEdTSV9TQU1FX1NUTVQp OworCSAgdXBkYXRlX3N0bXQgKG5ld19zdG10KTsKKwkgIGFyZzEgPSBsaHM7 CisJfQorICAgIH0KIAogICBpZiAoZHVtcF9maWxlICYmIChkdW1wX2ZsYWdz ICYgVERGX0RFVEFJTFMpKQogICAgIHsKLSAgICAgIGZwcmludGYgKGR1bXBf ZmlsZSwgIm5ldyBwaGkgcmVwbGFjZW1lbnQgc3RtdFxuIik7CisgICAgICBm cHJpbnRmIChkdW1wX2ZpbGUsICJuZXcgZXh0ZW5kZWQgcGhpIHJlcGxhY2Vt ZW50IHN0bXRcbiIpOwogICAgICAgcHJpbnRfZ2ltcGxlX3N0bXQgKGR1bXBf ZmlsZSwgbmV3X3N0bXQsIDAsIFRERl9TTElNKTsKICAgICB9CiB9CkBAIC0x NjY4LDI4ICsxODgwLDI1IEBAIHByZWRpY2F0ZV9hbGxfc2NhbGFyX3BoaXMg KHN0cnVjdCBsb29wICpsb29wKQogICBmb3IgKGkgPSAxOyBpIDwgb3JpZ19s b29wX251bV9ub2RlczsgaSsrKQogICAgIHsKICAgICAgIGdwaGkgKnBoaTsK LSAgICAgIHRyZWUgY29uZCA9IE5VTExfVFJFRTsKICAgICAgIGdpbXBsZV9z dG10X2l0ZXJhdG9yIGdzaTsKICAgICAgIGdwaGlfaXRlcmF0b3IgcGhpX2dz aTsKLSAgICAgIGJhc2ljX2Jsb2NrIHRydWVfYmIgPSBOVUxMOwogICAgICAg YmIgPSBpZmNfYmJzW2ldOwogCiAgICAgICBpZiAoYmIgPT0gbG9vcC0+aGVh ZGVyKQogCWNvbnRpbnVlOwogCisgICAgICBpZiAoRURHRV9DT1VOVCAoYmIt PnByZWRzKSA9PSAxKQorCWNvbnRpbnVlOworCiAgICAgICBwaGlfZ3NpID0g Z3NpX3N0YXJ0X3BoaXMgKGJiKTsKICAgICAgIGlmIChnc2lfZW5kX3AgKHBo aV9nc2kpKQogCWNvbnRpbnVlOwogCi0gICAgICAvKiBCQiBoYXMgdHdvIHBy ZWRlY2Vzc29ycy4gIFVzaW5nIHByZWRlY2Vzc29yJ3MgYXV4IGZpZWxkLCBz ZXQKLQkgYXBwcm9wcmlhdGUgY29uZGl0aW9uIGZvciB0aGUgUEhJIG5vZGUg cmVwbGFjZW1lbnQuICAqLwogICAgICAgZ3NpID0gZ3NpX2FmdGVyX2xhYmVs cyAoYmIpOwotICAgICAgdHJ1ZV9iYiA9IGZpbmRfcGhpX3JlcGxhY2VtZW50 X2NvbmRpdGlvbiAoYmIsICZjb25kLCAmZ3NpKTsKLQogICAgICAgd2hpbGUg KCFnc2lfZW5kX3AgKHBoaV9nc2kpKQogCXsKIAkgIHBoaSA9IHBoaV9nc2ku cGhpICgpOwotCSAgcHJlZGljYXRlX3NjYWxhcl9waGkgKHBoaSwgY29uZCwg dHJ1ZV9iYiwgJmdzaSk7CisJICBwcmVkaWNhdGVfc2NhbGFyX3BoaSAocGhp LCAmZ3NpKTsKIAkgIHJlbGVhc2VfcGhpX25vZGUgKHBoaSk7CiAJICBnc2lf bmV4dCAoJnBoaV9nc2kpOwogCX0KQEAgLTE3MTAsNyArMTkxOSw4IEBAIGlu c2VydF9naW1wbGlmaWVkX3ByZWRpY2F0ZXMgKGxvb3BfcCBsb29wLCBib29s IGFueV9tYXNrX2xvYWRfc3RvcmUpCiAgICAgewogICAgICAgYmFzaWNfYmxv Y2sgYmIgPSBpZmNfYmJzW2ldOwogICAgICAgZ2ltcGxlX3NlcSBzdG10czsK LQorICAgICAgaWYgKCFpc19wcmVkaWNhdGVkIChiYikpCisJZ2NjX2Fzc2Vy dCAoYmJfcHJlZGljYXRlX2dpbXBsaWZpZWRfc3RtdHMgKGJiKSA9PSBOVUxM KTsKICAgICAgIGlmICghaXNfcHJlZGljYXRlZCAoYmIpKQogCXsKIAkgIC8q IERvIG5vdCBpbnNlcnQgc3RhdGVtZW50cyBmb3IgYSBiYXNpYyBibG9jayB0 aGF0IGlzIG5vdApAQCAtMTg2Miw3ICsyMDcyLDggQEAgaW5zZXJ0X2dpbXBs aWZpZWRfcHJlZGljYXRlcyAobG9vcF9wIGxvb3AsIGJvb2wgYW55X21hc2tf bG9hZF9zdG9yZSkKIHN0YXRpYyB2b2lkCiBwcmVkaWNhdGVfbWVtX3dyaXRl cyAobG9vcF9wIGxvb3ApCiB7Ci0gIHVuc2lnbmVkIGludCBpLCBvcmlnX2xv b3BfbnVtX25vZGVzID0gbG9vcC0+bnVtX25vZGVzOworICB1bnNpZ25lZCBp bnQgaSwgaiwgb3JpZ19sb29wX251bV9ub2RlcyA9IGxvb3AtPm51bV9ub2Rl czsKKyAgdHJlZSBtYXNrX3ZlY1sxMF07CiAKICAgZm9yIChpID0gMTsgaSA8 IG9yaWdfbG9vcF9udW1fbm9kZXM7IGkrKykKICAgICB7CkBAIC0xODgyLDYg KzIwOTMsOSBAQCBwcmVkaWNhdGVfbWVtX3dyaXRlcyAobG9vcF9wIGxvb3Ap CiAJICBjb25kID0gVFJFRV9PUEVSQU5EIChjb25kLCAwKTsKIAl9CiAKKyAg ICAgIGZvciAoaj0wOyBqPDEwOyBqKyspCisJbWFza192ZWNbal0gPSBOVUxM X1RSRUU7CisKICAgICAgIGZvciAoZ3NpID0gZ3NpX3N0YXJ0X2JiIChiYik7 ICFnc2lfZW5kX3AgKGdzaSk7IGdzaV9uZXh0ICgmZ3NpKSkKIAlpZiAoIWdp bXBsZV9hc3NpZ25fc2luZ2xlX3AgKHN0bXQgPSBnc2lfc3RtdCAoZ3NpKSkp CiAJICBjb250aW51ZTsKQEAgLTE4OTIsMjEgKzIxMDYsMjYgQEAgcHJlZGlj YXRlX21lbV93cml0ZXMgKGxvb3BfcCBsb29wKQogCSAgICB0cmVlIHJlZiwg YWRkciwgcHRyLCBtYXNrdHlwZSwgbWFza19vcDAsIG1hc2tfb3AxLCBtYXNr OwogCSAgICBnaW1wbGUgbmV3X3N0bXQ7CiAJICAgIGludCBiaXRzaXplID0g R0VUX01PREVfQklUU0laRSAoVFlQRV9NT0RFIChUUkVFX1RZUEUgKGxocykp KTsKLQotCSAgICBtYXNrdHlwZSA9IGJ1aWxkX25vbnN0YW5kYXJkX2ludGVn ZXJfdHlwZSAoYml0c2l6ZSwgMSk7Ci0JICAgIG1hc2tfb3AwID0gYnVpbGRf aW50X2NzdCAobWFza3R5cGUsIHN3YXAgPyAwIDogLTEpOwotCSAgICBtYXNr X29wMSA9IGJ1aWxkX2ludF9jc3QgKG1hc2t0eXBlLCBzd2FwID8gLTEgOiAw KTsKIAkgICAgcmVmID0gVFJFRV9DT0RFIChsaHMpID09IFNTQV9OQU1FID8g cmhzIDogbGhzOwogCSAgICBtYXJrX2FkZHJlc3NhYmxlIChyZWYpOwogCSAg ICBhZGRyID0gZm9yY2VfZ2ltcGxlX29wZXJhbmRfZ3NpICgmZ3NpLCBidWls ZF9mb2xkX2FkZHJfZXhwciAocmVmKSwKIAkJCQkJICAgICB0cnVlLCBOVUxM X1RSRUUsIHRydWUsCiAJCQkJCSAgICAgR1NJX1NBTUVfU1RNVCk7Ci0JICAg IGNvbmQgPSBmb3JjZV9naW1wbGVfb3BlcmFuZF9nc2lfMSAoJmdzaSwgdW5z aGFyZV9leHByIChjb25kKSwKLQkJCQkJICAgICAgIGlzX2dpbXBsZV9jb25k ZXhwciwgTlVMTF9UUkVFLAotCQkJCQkgICAgICAgdHJ1ZSwgR1NJX1NBTUVf U1RNVCk7Ci0JICAgIG1hc2sgPSBmb2xkX2J1aWxkX2NvbmRfZXhwciAobWFz a3R5cGUsIHVuc2hhcmVfZXhwciAoY29uZCksCi0JCQkJCSBtYXNrX29wMCwg bWFza19vcDEpOwotCSAgICBtYXNrID0gaWZjX3RlbXBfdmFyIChtYXNrdHlw ZSwgbWFzaywgJmdzaSk7CisJICAgIGdjY19hc3NlcnQgKGV4YWN0X2xvZzIg KGJpdHNpemUpICE9IC0xKTsKKwkgICAgaWYgKChtYXNrID0gbWFza192ZWNb ZXhhY3RfbG9nMiAoYml0c2l6ZSldKSA9PSBOVUxMX1RSRUUpCisJICAgICAg eworCQltYXNrdHlwZSA9IGJ1aWxkX25vbnN0YW5kYXJkX2ludGVnZXJfdHlw ZSAoYml0c2l6ZSwgMSk7CisJCW1hc2tfb3AwID0gYnVpbGRfaW50X2NzdCAo bWFza3R5cGUsIHN3YXAgPyAwIDogLTEpOworCQltYXNrX29wMSA9IGJ1aWxk X2ludF9jc3QgKG1hc2t0eXBlLCBzd2FwID8gLTEgOiAwKTsKKwkJY29uZCA9 IGZvcmNlX2dpbXBsZV9vcGVyYW5kX2dzaV8xICgmZ3NpLCB1bnNoYXJlX2V4 cHIgKGNvbmQpLAorCQkJCQkgICAgICAgICAgIGlzX2dpbXBsZV9jb25kZXhw ciwKKwkJCQkJCSAgIE5VTExfVFJFRSwKKwkJCQkJICAgICAgICAgICB0cnVl LCBHU0lfU0FNRV9TVE1UKTsKKwkJbWFzayA9IGZvbGRfYnVpbGRfY29uZF9l eHByIChtYXNrdHlwZSwgdW5zaGFyZV9leHByIChjb25kKSwKKwkJCQkJICAg ICBtYXNrX29wMCwgbWFza19vcDEpOworCQltYXNrID0gaWZjX3RlbXBfdmFy IChtYXNrdHlwZSwgbWFzaywgJmdzaSk7CisJCW1hc2tfdmVjW2V4YWN0X2xv ZzIgKGJpdHNpemUpXSA9IG1hc2s7CisJICAgICAgfQogCSAgICBwdHIgPSBi dWlsZF9pbnRfY3N0IChyZWZlcmVuY2VfYWxpYXNfcHRyX3R5cGUgKHJlZiks IDApOwogCSAgICAvKiBDb3B5IHBvaW50cy10byBpbmZvIGlmIHBvc3NpYmxl LiAgKi8KIAkgICAgaWYgKFRSRUVfQ09ERSAoYWRkcikgPT0gU1NBX05BTUUg JiYgIVNTQV9OQU1FX1BUUl9JTkZPIChhZGRyKSkKQEAgLTIxMzQsNiArMjM1 MywxOTcgQEAgdmVyc2lvbl9sb29wX2Zvcl9pZl9jb252ZXJzaW9uIChzdHJ1 Y3QgbG9vcCAqbG9vcCkKICAgcmV0dXJuIHRydWU7CiB9CiAKKy8qIFBlcmZv cm1zIHNwbGl0dGluZyBvZiBjcml0aWNhbCBlZGdlcyBpZiBhZ2dyZXNzaXZl X2lmX2NvbnYgaXMgdHJ1ZS4KKyAgIFJldHVybnMgZmFsc2UgaWYgbG9vcCB3 b24ndCBiZSBpZiBjb252ZXJ0ZWQgYW5kIHRydWUgb3RoZXJ3aXNlLiAgKi8K Kworc3RhdGljIGJvb2wKK2lmY3Z0X3NwbGl0X2NyaXRpY2FsX2VkZ2VzIChz dHJ1Y3QgbG9vcCAqbG9vcCkKK3sKKyAgYmFzaWNfYmxvY2sgKmJvZHk7Cisg IGJhc2ljX2Jsb2NrIGJiOworICB1bnNpZ25lZCBpbnQgbnVtID0gbG9vcC0+ bnVtX25vZGVzOworICB1bnNpZ25lZCBpbnQgaTsKKyAgZ2ltcGxlIHN0bXQ7 CisgIGVkZ2UgZTsKKyAgZWRnZV9pdGVyYXRvciBlaTsKKworICBpZiAobnVt IDw9IDIpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAobG9vcC0+aW5uZXIp CisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoIXNpbmdsZV9leGl0IChsb29w KSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgYm9keSA9IGdldF9sb29wX2Jv ZHkgKGxvb3ApOworICBmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspCisgICAg eworICAgICAgYmIgPSBib2R5W2ldOworICAgICAgaWYgKGJiID09IGxvb3At PmxhdGNoCisJICB8fCBiYl93aXRoX2V4aXRfZWRnZV9wIChsb29wLCBiYikp CisJY29udGludWU7CisgICAgICBzdG10ID0gbGFzdF9zdG10IChiYik7Cisg ICAgICAvKiBTa2lwIGJhc2ljIGJsb2NrcyBub3QgZW5kaW5nIHdpdGggY29u ZGl0aW9uYWwgYnJhbmNoLiAgKi8KKyAgICAgIGlmICghKHN0bXQgJiYgZ2lt cGxlX2NvZGUgKHN0bXQpID09IEdJTVBMRV9DT05EKSkKKwljb250aW51ZTsK KyAgICAgIEZPUl9FQUNIX0VER0UgKGUsIGVpLCBiYi0+c3VjY3MpCisJaWYg KEVER0VfQ1JJVElDQUxfUCAoZSkgJiYgZS0+ZGVzdC0+bG9vcF9mYXRoZXIg PT0gbG9vcCkKKwkgIHNwbGl0X2VkZ2UgKGUpOworICAgIH0KKyAgZnJlZSAo Ym9keSk7CisgIHJldHVybiB0cnVlOworfQorCisvKiBBc3N1bWVzIHRoYXQg bGhzIG9mIERFRl9TVE1UIGhhdmUgbXVsdGlwbGUgdXNlcy4KKyAgIERlbGV0 ZSBvbmUgdXNlIGJ5ICgxKSBjcmVhdGlvbiBvZiBjb3B5IERFRl9TVE1UIHdp dGgKKyAgIHVuaXF1ZSBsaHM7ICgyKSBjaGFuZ2Ugb3JpZ2luYWwgdXNlIG9m IGxocyBpbiBvbmUKKyAgIHVzZSBzdGF0ZW1lbnQgd2l0aCBuZXdseSBjcmVh dGVkIGxocy4gICovCisKK3N0YXRpYyB2b2lkCitpZmN2dF9zcGxpdF9kZWZf c3RtdCAoZ2ltcGxlIGRlZl9zdG10KQoreworICB0cmVlIHZhcjsKKyAgdHJl ZSBsaHM7CisgIGdpbXBsZSBjb3B5X3N0bXQ7CisgIGdpbXBsZV9zdG10X2l0 ZXJhdG9yIGdzaTsKKyAgdXNlX29wZXJhbmRfcCB1c2VfcDsKKyAgaW1tX3Vz ZV9pdGVyYXRvciBpbW1faXRlcjsKKworICB2YXIgPSBnaW1wbGVfYXNzaWdu X2xocyAoZGVmX3N0bXQpOworICBjb3B5X3N0bXQgPSBnaW1wbGVfY29weSAo ZGVmX3N0bXQpOworICBsaHMgPSBtYWtlX3RlbXBfc3NhX25hbWUgKFRSRUVf VFlQRSAodmFyKSwgTlVMTCwgIl9pZmNfIik7CisgIGdpbXBsZV9hc3NpZ25f c2V0X2xocyAoY29weV9zdG10LCBsaHMpOworICBTU0FfTkFNRV9ERUZfU1RN VCAobGhzKSA9IGNvcHlfc3RtdDsKKyAgLyogSW5zZXJ0IGNvcHkgb2YgREVG X1NUTVQuICAqLworICBnc2kgPSBnc2lfZm9yX3N0bXQgKGRlZl9zdG10KTsK KyAgZ3NpX2luc2VydF9hZnRlciAoJmdzaSwgY29weV9zdG10LCBHU0lfU0FN RV9TVE1UKTsKKyAgLyogQ2hhbmdlIG9uZSB1c2Ugb2YgdmFyIHRvIGxocy4g ICovCisgIEZPUl9FQUNIX0lNTV9VU0VfRkFTVCAodXNlX3AsIGltbV9pdGVy LCB2YXIpCisgICAgeworICAgICAgU0VUX1VTRSAodXNlX3AsIGxocyk7Cisg ICAgICBicmVhazsKKyAgICB9Cit9CisKKy8qIFRyYXZlcnNlIGJvb2wgcGF0 dGVybiByZWN1cnNpdmVseSBzdGFydGluZyBmcm9tIHZhci4KKyAgIFJldHVy bnMgdHJ1ZSBpZiB0cmVlIGNhbiBiZSBjb25zaWRlcmVkIGFzIGJvb2wgcGF0 dGVybi4KKyAgIFJldHJ5IGlzIHRydWUgaWYgYWRkaXRpb25hbCB0cmF2ZXJz YWwgaXMgcmVxdWlyZWQuICAqLworCitzdGF0aWMgYm9vbAoraWZjdnRfd2Fs a19wYXR0ZXJuX3RyZWUgKHRyZWUgdmFyLCBib29sICpyZXRyeSkKK3sKKyAg dHJlZSByaHMxOworICBlbnVtIHRyZWVfY29kZSBjb2RlOworICBnaW1wbGUg ZGVmX3N0bXQ7CisgIHRyZWUgbGhzOworCisgIGRlZl9zdG10ID0gU1NBX05B TUVfREVGX1NUTVQgKHZhcik7CisgIGlmIChnaW1wbGVfY29kZSAoZGVmX3N0 bXQpICE9IEdJTVBMRV9BU1NJR04pCisgICAgcmV0dXJuIGZhbHNlOworICBs aHMgPSBnaW1wbGVfYXNzaWduX2xocyAoZGVmX3N0bXQpOworICBpZiAoIWhh c19zaW5nbGVfdXNlIChsaHMpKQorICAgIHsKKyAgICAgICpyZXRyeSA9IHRy dWU7CisgICAgICBpZiAoZHVtcF9maWxlICYmIChkdW1wX2ZsYWdzICYgVERG X0RFVEFJTFMpKQorCXsKKwkgIGZwcmludGYgKGR1bXBfZmlsZSwgIk11bHRp cGxlIHVzZXMgaW4gc3RtdDogIik7CisJICBwcmludF9nZW5lcmljX2V4cHIg KGR1bXBfZmlsZSwgbGhzLCAwKTsKKwkgIGZwcmludGYgKGR1bXBfZmlsZSwg IlxuIik7CisJICBwcmludF9naW1wbGVfc3RtdCAoZHVtcF9maWxlLCBkZWZf c3RtdCwgMCwgVERGX1NMSU0pOworCX0KKyAgICAgIGlmY3Z0X3NwbGl0X2Rl Zl9zdG10IChkZWZfc3RtdCk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9 CisgIHJoczEgPSBnaW1wbGVfYXNzaWduX3JoczEgKGRlZl9zdG10KTsKKyAg Y29kZSA9IGdpbXBsZV9hc3NpZ25fcmhzX2NvZGUgKGRlZl9zdG10KTsKKyAg c3dpdGNoIChjb2RlKQorICAgIHsKKyAgICBjYXNlIFNTQV9OQU1FOgorICAg ICAgcmV0dXJuIGlmY3Z0X3dhbGtfcGF0dGVybl90cmVlIChyaHMxLCByZXRy eSk7CisgICAgQ0FTRV9DT05WRVJUOgorICAgICAgaWYgKChUWVBFX1BSRUNJ U0lPTiAoVFJFRV9UWVBFIChyaHMxKSkgIT0gMQorCSAgIHx8ICFUWVBFX1VO U0lHTkVEIChUUkVFX1RZUEUgKHJoczEpKSkKKwkgICYmIFRSRUVfQ09ERSAo VFJFRV9UWVBFIChyaHMxKSkgIT0gQk9PTEVBTl9UWVBFKQorCXJldHVybiBm YWxzZTsKKyAgICAgIHJldHVybiBpZmN2dF93YWxrX3BhdHRlcm5fdHJlZSAo cmhzMSwgcmV0cnkpOworICAgIGNhc2UgQklUX05PVF9FWFBSOgorICAgICAg cmV0dXJuIGlmY3Z0X3dhbGtfcGF0dGVybl90cmVlIChyaHMxLCByZXRyeSk7 CisgICAgY2FzZSBCSVRfQU5EX0VYUFI6CisgICAgY2FzZSBCSVRfSU9SX0VY UFI6CisgICAgY2FzZSBCSVRfWE9SX0VYUFI6CisgICAgICBpZiAoIWlmY3Z0 X3dhbGtfcGF0dGVybl90cmVlIChyaHMxLCByZXRyeSkpCisJcmV0dXJuIGZh bHNlOworICAgICAgcmV0dXJuIGlmY3Z0X3dhbGtfcGF0dGVybl90cmVlIChn aW1wbGVfYXNzaWduX3JoczIgKGRlZl9zdG10KSwgcmV0cnkpOworICAgIGRl ZmF1bHQ6CisgICAgICBpZiAoVFJFRV9DT0RFX0NMQVNTIChjb2RlKSA9PSB0 Y2NfY29tcGFyaXNvbikKKwlyZXR1cm4gdHJ1ZTsKKyAgICB9CisgIHJldHVy biBmYWxzZTsKK30KKworLyogUmV0dXJucyB0cnVlIGlmIFNUTVQgY2FuIGJl IGEgcm9vdCBvZiBib29sIHBhdHRlcm4gYXBsbGllZAorICAgYnkgdmVjdG9y aXplci4gVkFSIGNvbnRhaW5zIFNTQV9OQU1FIHdoaWNoIHN0YXJ0cyBwYXR0 ZXJuLiAgKi8KKworc3RhdGljIGJvb2wKK3N0bXRfaXNfcm9vdF9vZl9ib29s X3BhdHRlcm4gKGdpbXBsZSBzdG10LCB0cmVlICp2YXIpCit7CisgIGVudW0g dHJlZV9jb2RlIGNvZGU7CisgIHRyZWUgbGhzLCByaHM7CisKKyAgY29kZSA9 IGdpbXBsZV9hc3NpZ25fcmhzX2NvZGUgKHN0bXQpOworICBpZiAoQ09OVkVS VF9FWFBSX0NPREVfUCAoY29kZSkpCisgICAgeworICAgICAgbGhzID0gZ2lt cGxlX2Fzc2lnbl9saHMgKHN0bXQpOworICAgICAgcmhzID0gZ2ltcGxlX2Fz c2lnbl9yaHMxIChzdG10KTsKKyAgICAgIGlmIChUUkVFX0NPREUgKFRSRUVf VFlQRSAocmhzKSkgIT0gQk9PTEVBTl9UWVBFKQorCXJldHVybiBmYWxzZTsK KyAgICAgIGlmIChUUkVFX0NPREUgKFRSRUVfVFlQRSAobGhzKSkgPT0gQk9P TEVBTl9UWVBFKQorCXJldHVybiBmYWxzZTsKKyAgICAgICp2YXIgPSByaHM7 CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIGVsc2UgaWYgKGNvZGUg PT0gQ09ORF9FWFBSKQorICAgIHsKKyAgICAgIHJocyA9IGdpbXBsZV9hc3Np Z25fcmhzMSAoc3RtdCk7CisgICAgICBpZiAoVFJFRV9DT0RFIChyaHMpICE9 IFNTQV9OQU1FKQorCXJldHVybiBmYWxzZTsKKyAgICAgICp2YXIgPSByaHM7 CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIHJldHVybiBmYWxzZTsK K30KKworLyogIFRyYXZlcnNlIGFsbCBzdGF0ZW1lbnRzIGluIEJCIHdoaWNo IGNvcnJlc3BvbmRlbnQgdG8gbG9vcCBoZWFkZXIgdG8KKyAgICBmaW5kIG91 dCBhbGwgc3RhdGVtZW50cyB3aGljaCBjYW4gc3RhcnQgYm9vbCBwYXR0ZXJu IGFwcGxpZWQgYnkKKyAgICB2ZWN0b3JpemVyIGFuZCBjb252ZXJ0IG11bHRp cGxlIHVzZXMgaW4gaXQgdG8gY29uZm9ybSBwYXR0ZXJuCisgICAgcmVzdHJp Y3Rpb25zLiBTdWNoIGNhc2UgY2FuIG9jY3VyIGlmIHRoZSBzYW1lIHByZWRp Y2F0ZSBpcyB1c2VkIGJvdGgKKyAgICBmb3IgcGhpIG5vZGUgY29udmVyc2lv biBhbmQgbG9hZC9zdG9yZSBtYXNrLiAgKi8KKworc3RhdGljIHZvaWQKK2lm Y3Z0X3JlcGFpcl9ib29sX3BhdHRlcm4gKGJhc2ljX2Jsb2NrIGJiKQorewor ICB0cmVlIHJoczsKKyAgYm9vbCByZXRyeTsKKyAgZ2ltcGxlIHN0bXQ7Cisg IGdpbXBsZV9zdG10X2l0ZXJhdG9yIGdzaTsKKworICBmb3IgKGdzaSA9IGdz aV9zdGFydF9iYiAoYmIpOyAhZ3NpX2VuZF9wIChnc2kpOyBnc2lfbmV4dCAo JmdzaSkpCisgICAgeworICAgICAgc3RtdCA9IGdzaV9zdG10IChnc2kpOwor ICAgICAgaWYgKCBnaW1wbGVfY29kZSAoc3RtdCkgIT0gR0lNUExFX0FTU0lH TikKKwljb250aW51ZTsKKyAgICAgIGlmICghc3RtdF9pc19yb290X29mX2Jv b2xfcGF0dGVybiAoc3RtdCwgJnJocykpCisJY29udGludWU7CisgICAgICB3 aGlsZSAodHJ1ZSkKKwl7CisJICByZXRyeSA9IGZhbHNlOworCSAgaWYgKCFp ZmN2dF93YWxrX3BhdHRlcm5fdHJlZSAocmhzLCAmcmV0cnkpKQorCSAgICBy ZXR1cm47CisJICBpZiAoIXJldHJ5KQorCSAgICBicmVhazsKKwl9CisgICAg fQorfQorCiAvKiBJZi1jb252ZXJ0IExPT1Agd2hlbiBpdCBpcyBsZWdhbC4g IEZvciB0aGUgbW9tZW50IHRoaXMgcGFzcyBoYXMgbm8KICAgIHByb2ZpdGFi aWxpdHkgYW5hbHlzaXMuICBSZXR1cm5zIG5vbi16ZXJvIHRvZG8gZmxhZ3Mg d2hlbiBzb21ldGhpbmcKICAgIGNoYW5nZWQuICAqLwpAQCAtMjE0NSw2ICsy NTU1LDIwIEBAIHRyZWVfaWZfY29udmVyc2lvbiAoc3RydWN0IGxvb3AgKmxv b3ApCiAgIGlmY19iYnMgPSBOVUxMOwogICBib29sIGFueV9tYXNrX2xvYWRf c3RvcmUgPSBmYWxzZTsKIAorICAvKiBTZXQtdXAgYWdncmVzc2l2ZSBpZi1j b252ZXJzaW9uIGZvciBsb29wcyBtYXJrZWQgd2l0aCBzaW1kIHByYWdtYS4g ICovCisgIGFnZ3Jlc3NpdmVfaWZfY29udiA9IGxvb3AtPmZvcmNlX3ZlY3Rv cml6ZTsKKyAgLyogQ2hlY2sgZWl0aGVyIG91dGVyIGxvb3Agd2FzIG1hcmtl ZCB3aXRoIHNpbWQgcHJhZ21hLiAgKi8KKyAgaWYgKCFhZ2dyZXNzaXZlX2lm X2NvbnYpCisgICAgeworICAgICAgc3RydWN0IGxvb3AgKm91dGVyX2xvb3Ag PSBsb29wX291dGVyIChsb29wKTsKKyAgICAgIGlmIChvdXRlcl9sb29wICYm IG91dGVyX2xvb3AtPmZvcmNlX3ZlY3Rvcml6ZSkKKwlhZ2dyZXNzaXZlX2lm X2NvbnYgPSB0cnVlOworICAgIH0KKworICBpZiAoYWdncmVzc2l2ZV9pZl9j b252KQorICAgIGlmICghaWZjdnRfc3BsaXRfY3JpdGljYWxfZWRnZXMgKGxv b3ApKQorICAgICAgZ290byBjbGVhbnVwOworCiAgIGlmICghaWZfY29udmVy dGlibGVfbG9vcF9wIChsb29wLCAmYW55X21hc2tfbG9hZF9zdG9yZSkKICAg ICAgIHx8ICFkYmdfY250IChpZl9jb252ZXJzaW9uX3RyZWUpKQogICAgIGdv dG8gY2xlYW51cDsKQEAgLTIxNTQsNyArMjU3OCw5IEBAIHRyZWVfaWZfY29u dmVyc2lvbiAoc3RydWN0IGxvb3AgKmxvb3ApCiAJICB8fCBsb29wLT5kb250 X3ZlY3Rvcml6ZSkpCiAgICAgZ290byBjbGVhbnVwOwogCi0gIGlmIChhbnlf bWFza19sb2FkX3N0b3JlICYmICF2ZXJzaW9uX2xvb3BfZm9yX2lmX2NvbnZl cnNpb24gKGxvb3ApKQorICBpZiAoKGFueV9tYXNrX2xvYWRfc3RvcmUKKyAg ICAgICB8fCBmbGFnX3RyZWVfbG9vcF9pZl9jb252ZXJ0ICE9IDEpCisgICAg ICAmJiAhdmVyc2lvbl9sb29wX2Zvcl9pZl9jb252ZXJzaW9uIChsb29wKSkK ICAgICBnb3RvIGNsZWFudXA7CiAKICAgLyogTm93IGFsbCBzdGF0ZW1lbnRz IGFyZSBpZi1jb252ZXJ0aWJsZS4gIENvbWJpbmUgYWxsIHRoZSBiYXNpYwpA QCAtMjE2Miw2ICsyNTg4LDExIEBAIHRyZWVfaWZfY29udmVyc2lvbiAoc3Ry dWN0IGxvb3AgKmxvb3ApCiAgICAgIG9uLXRoZS1mbHkuICAqLwogICBjb21i aW5lX2Jsb2NrcyAobG9vcCwgYW55X21hc2tfbG9hZF9zdG9yZSk7CiAKKyAg LyogUmVwYWlyIHRyZWUgY29ycmVzcG9uZGVudCB0byBib29sIHBhdHRlcm4g dG8gZGVsZXRlIG11bHRpcGxlIHVzZXMgb2YKKyAgICAgcHJlaWRjYXRlcy4g ICovCisgIGlmIChhZ2dyZXNzaXZlX2lmX2NvbnYpCisgICAgaWZjdnRfcmVw YWlyX2Jvb2xfcGF0dGVybiAobG9vcC0+aGVhZGVyKTsKKwogICB0b2RvIHw9 IFRPRE9fY2xlYW51cF9jZmc7CiAgIGlmIChmbGFnX3RyZWVfbG9vcF9pZl9j b252ZXJ0X3N0b3JlcyB8fCBhbnlfbWFza19sb2FkX3N0b3JlKQogICAgIHsK QEAgLTIxNzUsNyArMjYwNiwxMCBAQCB0cmVlX2lmX2NvbnZlcnNpb24gKHN0 cnVjdCBsb29wICpsb29wKQogICAgICAgdW5zaWduZWQgaW50IGk7CiAKICAg ICAgIGZvciAoaSA9IDA7IGkgPCBsb29wLT5udW1fbm9kZXM7IGkrKykKLQlm cmVlX2JiX3ByZWRpY2F0ZSAoaWZjX2Jic1tpXSk7CisJeworCSAgYmFzaWNf YmxvY2sgYmIgPSBpZmNfYmJzW2ldOworCSAgZnJlZV9iYl9wcmVkaWNhdGUg KGJiKTsKKwl9CiAKICAgICAgIGZyZWUgKGlmY19iYnMpOwogICAgICAgaWZj X2JicyA9IE5VTEw7Cg== --047d7bb0400282936e050a7dcc97--