From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 63334 invoked by alias); 24 May 2016 11:22:35 -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 63237 invoked by uid 89); 24 May 2016 11:22:34 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.9 required=5.0 tests=AWL,BAYES_00,RCVD_IN_DNSWL_NONE autolearn=ham version=3.3.2 spammy=gathering, transfer X-HELO: mail-it0-f48.google.com Received: from mail-it0-f48.google.com (HELO mail-it0-f48.google.com) (209.85.214.48) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-GCM-SHA256 encrypted) ESMTPS; Tue, 24 May 2016 11:21:42 +0000 Received: by mail-it0-f48.google.com with SMTP id l63so9810860ita.1 for ; Tue, 24 May 2016 04:21:41 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc; bh=27E7BbNL2zs4y5FGfHJBQUEb6/0tBYV4kbi1V6bq+Rk=; b=J7hizPtmUnw2Odl2/JZB+MwnlsJ3NtWVf9kyRZ2mT+PBfn+jPkM7iY60dxyZ+UkgzQ OwtK8ru9Zc2dL+C6knec3x0JFhzTB9CBI0kfABuEov6lzOUgFjnLFPw0JFb8LA4FAoOk tByrtdE4dmKvJBrous7uBKadj5PJEBuwlhc1BwHWw9tixDUC1Tg32rDvNX7+9Ih9/iKt iszTiDLFMtTsnc5q7BW0sHJLOnSNRZjEjMesKWack8BNAiAKv9Fg9kUtq3RuVvK4vXn8 sk5YVGH4djYzfaPCYPfCovNEHnMVKzbB0dhR8zj3bl4iIKM+uWkEmzluLoYJ5ENWcanI +X4g== X-Gm-Message-State: ALyK8tIK8Ed2jeRkcCvhtkFT6coOz4ZsACR5ulsU5nL2QxPceijxf5EhqBwwP72jHi5gh2Z04fIbLBlkhlHdG3bk MIME-Version: 1.0 X-Received: by 10.36.160.5 with SMTP id o5mr9292397ite.31.1464088897189; Tue, 24 May 2016 04:21:37 -0700 (PDT) Received: by 10.36.236.5 with HTTP; Tue, 24 May 2016 04:21:37 -0700 (PDT) In-Reply-To: References: Date: Tue, 24 May 2016 12:08:00 -0000 Message-ID: Subject: Re: RFC [1/2] divmod transform From: Prathamesh Kulkarni To: Richard Biener Cc: gcc Patches , Richard Biener , Ramana Radhakrishnan , Kugan Vivekanandarajah , Jim Wilson Content-Type: multipart/mixed; boundary=94eb2c03caaca34dd0053394c2a1 X-IsSubscribed: yes X-SW-Source: 2016-05/txt/msg01889.txt.bz2 --94eb2c03caaca34dd0053394c2a1 Content-Type: text/plain; charset=UTF-8 Content-length: 5716 On 23 May 2016 at 17:35, Richard Biener wrote: > On Mon, May 23, 2016 at 10:58 AM, Prathamesh Kulkarni > wrote: >> Hi, >> I have updated my patch for divmod (attached), which was originally >> based on Kugan's patch. >> The patch transforms stmts with code TRUNC_DIV_EXPR and TRUNC_MOD_EXPR >> having same operands to divmod representation, so we can cse computation of mod. >> >> t1 = a TRUNC_DIV_EXPR b; >> t2 = a TRUNC_MOD_EXPR b >> is transformed to: >> complex_tmp = DIVMOD (a, b); >> t1 = REALPART_EXPR (complex_tmp); >> t2 = IMAGPART_EXPR (complex_tmp); >> >> * New hook divmod_expand_libfunc >> The rationale for introducing the hook is that different targets have >> incompatible calling conventions for divmod libfunc. >> Currently three ports define divmod libfunc: c6x, spu and arm. >> c6x and spu follow the convention of libgcc2.c:__udivmoddi4: >> return quotient and store remainder in argument passed as pointer, >> while the arm version takes two arguments and returns both >> quotient and remainder having mode double the size of the operand mode. >> The port should hence override the hook expand_divmod_libfunc >> to generate call to target-specific divmod. >> Ports should define this hook if: >> a) The port does not have divmod or div insn for the given mode. >> b) The port defines divmod libfunc for the given mode. >> The default hook default_expand_divmod_libfunc() generates call >> to libgcc2.c:__udivmoddi4 provided the operands are unsigned and >> are of DImode. >> >> Patch passes bootstrap+test on x86_64-unknown-linux-gnu and >> cross-tested on arm*-*-*. >> Bootstrap+test in progress on arm-linux-gnueabihf. >> Does this patch look OK ? > > diff --git a/gcc/targhooks.c b/gcc/targhooks.c > index 6b4601b..e4a021a 100644 > --- a/gcc/targhooks.c > +++ b/gcc/targhooks.c > @@ -1965,4 +1965,31 @@ default_optab_supported_p (int, machine_mode, > machine_mode, optimization_type) > return true; > } > > +void > +default_expand_divmod_libfunc (bool unsignedp, machine_mode mode, > + rtx op0, rtx op1, > + rtx *quot_p, rtx *rem_p) > > functions need a comment. > > ISTR it was suggested that ARM change to libgcc2.c__udivmoddi4 style? In that > case we could avoid the target hook. Well I would prefer adding the hook because that's more easier -;) Would it be ok for now to go with the hook ? > > + /* If target overrides expand_divmod_libfunc hook > + then perform divmod by generating call to the target-specifc divmod > libfunc. */ > + if (targetm.expand_divmod_libfunc != default_expand_divmod_libfunc) > + return true; > + > + /* Fall back to using libgcc2.c:__udivmoddi4. */ > + return (mode == DImode && unsignedp); > > I don't understand this - we know optab_libfunc returns non-NULL for 'mode' > but still restrict this to DImode && unsigned? Also if > targetm.expand_divmod_libfunc > is not the default we expect the target to handle all modes? Ah indeed, the check for DImode is unnecessary. However I suppose the check for unsignedp should be there, since we want to generate call to __udivmoddi4 only if operand is unsigned ? > > That said - I expected the above piece to be simply a 'return true;' ;) > > Usually we use some can_expand_XXX helper in optabs.c to query if the target > supports a specific operation (for example SImode divmod would use DImode > divmod by means of widening operands - for the unsigned case of course). Thanks for pointing out. So if a target does not support divmod libfunc for a mode but for a wider mode, then we could zero-extend operands to the wider-mode, perform divmod on the wider-mode, and then cast result back to the original mode. I haven't done that in this patch, would it be OK to do that as a follow up ? > > + /* Disable the transform if either is a constant, since > division-by-constant > + may have specialized expansion. */ > + if (TREE_CONSTANT (op1) || TREE_CONSTANT (op2)) > + return false; > > please use CONSTANT_CLASS_P (op1) || CONSTANT_CLASS_P (op2) > > + if (TYPE_OVERFLOW_TRAPS (type)) > + return false; > > why's that? Generally please first test cheap things (trapping, constant-ness) > before checking expensive stuff (target_supports_divmod_p). I added TYPE_OVERFLOW_TRAPS (type) based on your suggestion in: https://www.mail-archive.com/gcc@gcc.gnu.org/msg78534.html "When looking at TRUNC_DIV_EXPR you should also exclude the case where TYPE_OVERFLOW_TRAPS (type) as that should expand using the [su]divv optabs (no trapping overflow divmod optab exists)." > > +static bool > +convert_to_divmod (gassign *stmt) > +{ > + if (!divmod_candidate_p (stmt)) > + return false; > + > + tree op1 = gimple_assign_rhs1 (stmt); > + tree op2 = gimple_assign_rhs2 (stmt); > + > + vec stmts = vNULL; > > use an auto_vec - you currently leak it in at least one place. > > + if (maybe_clean_or_replace_eh_stmt (use_stmt, use_stmt)) > + cfg_changed = true; > > note that this suggests you should check whether any of the stmts may throw > internally as you don't update / transfer EH info correctly. So for 'stmt' and > all 'use_stmt' check stmt_can_throw_internal and if so do not add it to > the list of stmts to modify. > > Btw, I think you should not add 'stmt' immediately but when iterating over > all uses also gather uses in TRUNC_MOD_EXPR. > > Otherwise looks ok. Done changes in this version. I am gathering mod uses same time as div uses, so this imposes a constraint that mod dominates mod. I am not sure if that's desirable. Thanks, Prathamesh > > Thanks, > Richard. > >> Thanks, >> Prathamesh --94eb2c03caaca34dd0053394c2a1 Content-Type: text/plain; charset=US-ASCII; name="divmod-part1_2.diff" Content-Disposition: attachment; filename="divmod-part1_2.diff" Content-Transfer-Encoding: base64 X-Attachment-Id: f_iolcnjqo0 Content-length: 19000 ZGlmZiAtLWdpdCBhL2djYy9kb2MvdG0udGV4aSBiL2djYy9kb2MvdG0udGV4 aQppbmRleCA4YzdmMmExLi4xMTFmMTlmIDEwMDY0NAotLS0gYS9nY2MvZG9j L3RtLnRleGkKKysrIGIvZ2NjL2RvYy90bS50ZXhpCkBAIC02OTYzLDYgKzY5 NjMsMTIgQEAgVGhpcyBpcyBmaXJzdGx5IGludHJvZHVjZWQgb24gQVJNL0FB cmNoNjQgdGFyZ2V0cywgcGxlYXNlIHJlZmVyIHRvCiB0aGUgaG9vayBpbXBs ZW1lbnRhdGlvbiBmb3IgaG93IGRpZmZlcmVudCBmdXNpb24gdHlwZXMgYXJl IHN1cHBvcnRlZC4KIEBlbmQgZGVmdHlwZWZuCiAKK0BkZWZ0eXBlZm4ge1Rh cmdldCBIb29rfSB2b2lkIFRBUkdFVF9FWFBBTkRfRElWTU9EX0xJQkZVTkMg KGJvb2wgQHZhcnt1bnNpZ25lZHB9LCBtYWNoaW5lX21vZGUgQHZhcnttb2Rl fSwgQHZhcntydHh9LCBAdmFye3J0eH0sIHJ0eCAqQHZhcntxdW90fSwgcnR4 ICpAdmFye3JlbX0pCitEZWZpbmUgdGhpcyBob29rIGlmIHRoZSBwb3J0IGRv ZXMgbm90IGhhdmUgaGFyZHdhcmUgZGl2IGFuZCBkaXZtb2QgaW5zbiBmb3IK K3RoZSBnaXZlbiBtb2RlIGJ1dCBoYXMgZGl2bW9kIGxpYmZ1bmMsIHdoaWNo IGlzIGluY29tcGF0aWJsZQord2l0aCBsaWJnY2MyLmM6X191ZGl2bW9kZGk0 CitAZW5kIGRlZnR5cGVmbgorCiBAbm9kZSBTZWN0aW9ucwogQHNlY3Rpb24g RGl2aWRpbmcgdGhlIE91dHB1dCBpbnRvIFNlY3Rpb25zIChUZXh0cywgRGF0 YSwgQGRvdHN7fSkKIEBjIHRoZSBhYm92ZSBzZWN0aW9uIHRpdGxlIGlzIFdB WSB0b28gbG9uZy4gIG1heWJlIGN1dCB0aGUgcGFydCBiZXR3ZWVuCmRpZmYg LS1naXQgYS9nY2MvZG9jL3RtLnRleGkuaW4gYi9nY2MvZG9jL3RtLnRleGku aW4KaW5kZXggZjk2M2E1OC4uMmM5YTgwMCAxMDA2NDQKLS0tIGEvZ2NjL2Rv Yy90bS50ZXhpLmluCisrKyBiL2djYy9kb2MvdG0udGV4aS5pbgpAQCAtNDg0 OCw2ICs0ODQ4LDggQEAgdGhlbTogdHJ5IHRoZSBmaXJzdCBvbmVzIGluIHRo aXMgbGlzdCBmaXJzdC4KIAogQGhvb2sgVEFSR0VUX1NDSEVEX0ZVU0lPTl9Q UklPUklUWQogCitAaG9vayBUQVJHRVRfRVhQQU5EX0RJVk1PRF9MSUJGVU5D CisKIEBub2RlIFNlY3Rpb25zCiBAc2VjdGlvbiBEaXZpZGluZyB0aGUgT3V0 cHV0IGludG8gU2VjdGlvbnMgKFRleHRzLCBEYXRhLCBAZG90c3t9KQogQGMg dGhlIGFib3ZlIHNlY3Rpb24gdGl0bGUgaXMgV0FZIHRvbyBsb25nLiAgbWF5 YmUgY3V0IHRoZSBwYXJ0IGJldHdlZW4KZGlmZiAtLWdpdCBhL2djYy9pbnRl cm5hbC1mbi5jIGIvZ2NjL2ludGVybmFsLWZuLmMKaW5kZXggYzg2N2RkYy4u MGNiNTlmNyAxMDA2NDQKLS0tIGEvZ2NjL2ludGVybmFsLWZuLmMKKysrIGIv Z2NjL2ludGVybmFsLWZuLmMKQEAgLTIyNzYsNiArMjI3Niw0OCBAQCBtdWx0 aV92ZWN0b3Jfb3B0YWJfc3VwcG9ydGVkX3AgKGNvbnZlcnRfb3B0YWIgb3B0 YWIsIHRyZWVfcGFpciB0eXBlcywKICNkZWZpbmUgZGlyZWN0X21hc2tfc3Rv cmVfb3B0YWJfc3VwcG9ydGVkX3AgZGlyZWN0X29wdGFiX3N1cHBvcnRlZF9w CiAjZGVmaW5lIGRpcmVjdF9zdG9yZV9sYW5lc19vcHRhYl9zdXBwb3J0ZWRf cCBtdWx0aV92ZWN0b3Jfb3B0YWJfc3VwcG9ydGVkX3AKIAorLyogRXhwYW5k IERJVk1PRCgpIHVzaW5nOgorIGEpIG9wdGFiIGhhbmRsZXIgZm9yIHVkaXZt b2Qvc2Rpdm1vZCBpZiBpdCBpcyBhdmFpbGFibGUuCisgYikgSWYgb3B0YWJf aGFuZGxlciBkb2Vzbid0IGV4aXN0LCBHZW5lcmF0ZSBjYWxsIHRvCisgICAg b3B0YWJfbGliZnVuYyBmb3IgdWRpdm1vZC9zZGl2bW9kLiAgKi8KKworc3Rh dGljIHZvaWQgCitleHBhbmRfRElWTU9EIChpbnRlcm5hbF9mbiwgZ2NhbGwg KnN0bXQpCit7CisgIHRyZWUgbGhzID0gZ2ltcGxlX2NhbGxfbGhzIChzdG10 KTsKKyAgdHJlZSBhcmcwID0gZ2ltcGxlX2NhbGxfYXJnIChzdG10LCAwKTsK KyAgdHJlZSBhcmcxID0gZ2ltcGxlX2NhbGxfYXJnIChzdG10LCAxKTsKKwor ICBnY2NfYXNzZXJ0IChUUkVFX0NPREUgKFRSRUVfVFlQRSAobGhzKSkgPT0g Q09NUExFWF9UWVBFKTsKKyAgdHJlZSB0eXBlID0gVFJFRV9UWVBFIChUUkVF X1RZUEUgKGxocykpOworICBtYWNoaW5lX21vZGUgbW9kZSA9IFRZUEVfTU9E RSAodHlwZSk7CisgIGJvb2wgdW5zaWduZWRwID0gVFlQRV9VTlNJR05FRCAo dHlwZSk7CisgIG9wdGFiIHRhYiA9ICh1bnNpZ25lZHApID8gdWRpdm1vZF9v cHRhYiA6IHNkaXZtb2Rfb3B0YWI7CisKKyAgcnR4IG9wMCA9IGV4cGFuZF9u b3JtYWwgKGFyZzApOworICBydHggb3AxID0gZXhwYW5kX25vcm1hbCAoYXJn MSk7CisgIHJ0eCB0YXJnZXQgPSBleHBhbmRfZXhwciAobGhzLCBOVUxMX1JU WCwgVk9JRG1vZGUsIEVYUEFORF9XUklURSk7CisKKyAgcnR4IHF1b3RpZW50 LCByZW1haW5kZXI7CisKKyAgLyogQ2hlY2sgaWYgb3B0YWIgaGFuZGxlciBl eGlzdHMgZm9yIFt1XWRpdm1vZC4gICovCisgIGlmIChvcHRhYl9oYW5kbGVy ICh0YWIsIG1vZGUpICE9IENPREVfRk9SX25vdGhpbmcpCisgICAgeworICAg ICAgcXVvdGllbnQgPSBnZW5fcmVnX3J0eCAobW9kZSk7CisgICAgICByZW1h aW5kZXIgPSBnZW5fcmVnX3J0eCAobW9kZSk7CisgICAgICBleHBhbmRfdHdv dmFsX2Jpbm9wICh0YWIsIG9wMCwgb3AxLCBxdW90aWVudCwgcmVtYWluZGVy LCB1bnNpZ25lZHApOworICAgIH0KKyAgZWxzZQorICAgIHRhcmdldG0uZXhw YW5kX2Rpdm1vZF9saWJmdW5jICh1bnNpZ25lZHAsIG1vZGUsIG9wMCwgb3Ax LAorCQkJCSAgICZxdW90aWVudCwgJnJlbWFpbmRlcik7CisKKyAgLyogV3Jh cCB0aGUgcmV0dXJuIHZhbHVlIChxdW90aWVudCwgcmVtYWluZGVyKSB3aXRo aW4gQ09NUExFWF9FWFBSLiAgKi8KKyAgZXhwYW5kX2V4cHIgKGJ1aWxkMiAo Q09NUExFWF9FWFBSLCBUUkVFX1RZUEUgKGxocyksCisJCSAgICAgICBtYWtl X3RyZWUgKFRSRUVfVFlQRSAoYXJnMCksIHF1b3RpZW50KSwKKwkJICAgICAg IG1ha2VfdHJlZSAoVFJFRV9UWVBFIChhcmcxKSwgcmVtYWluZGVyKSksCisJ ICAgICAgIHRhcmdldCwgVk9JRG1vZGUsIEVYUEFORF9OT1JNQUwpOworfQor CiAvKiBSZXR1cm4gdHJ1ZSBpZiBGTiBpcyBzdXBwb3J0ZWQgZm9yIHRoZSB0 eXBlcyBpbiBUWVBFUyB3aGVuIHRoZQogICAgb3B0aW1pemF0aW9uIHR5cGUg aXMgT1BUX1RZUEUuICBUaGUgdHlwZXMgYXJlIHRob3NlIGFzc29jaWF0ZWQg d2l0aAogICAgdGhlICJ0eXBlMCIgYW5kICJ0eXBlMSIgZmllbGRzIG9mIEZO J3MgZGlyZWN0X2ludGVybmFsX2ZuX2luZm8KZGlmZiAtLWdpdCBhL2djYy9p bnRlcm5hbC1mbi5kZWYgYi9nY2MvaW50ZXJuYWwtZm4uZGVmCmluZGV4IGU3 MjlkODUuLjU2YTgwZjEgMTAwNjQ0Ci0tLSBhL2djYy9pbnRlcm5hbC1mbi5k ZWYKKysrIGIvZ2NjL2ludGVybmFsLWZuLmRlZgpAQCAtMTk0LDYgKzE5NCw5 IEBAIERFRl9JTlRFUk5BTF9GTiAoQVRPTUlDX0JJVF9URVNUX0FORF9TRVQs IEVDRl9MRUFGIHwgRUNGX05PVEhST1csIE5VTEwpCiBERUZfSU5URVJOQUxf Rk4gKEFUT01JQ19CSVRfVEVTVF9BTkRfQ09NUExFTUVOVCwgRUNGX0xFQUYg fCBFQ0ZfTk9USFJPVywgTlVMTCkKIERFRl9JTlRFUk5BTF9GTiAoQVRPTUlD X0JJVF9URVNUX0FORF9SRVNFVCwgRUNGX0xFQUYgfCBFQ0ZfTk9USFJPVywg TlVMTCkKIAorLyogRGl2bW9kIGZ1bmN0aW9uLiAgKi8KK0RFRl9JTlRFUk5B TF9GTiAoRElWTU9ELCBFQ0ZfQ09OU1QgfCBFQ0ZfTEVBRiwgTlVMTCkKKwog I3VuZGVmIERFRl9JTlRFUk5BTF9JTlRfRk4KICN1bmRlZiBERUZfSU5URVJO QUxfRkxUX0ZOCiAjdW5kZWYgREVGX0lOVEVSTkFMX09QVEFCX0ZOCmRpZmYg LS1naXQgYS9nY2MvdGFyZ2V0LmRlZiBiL2djYy90YXJnZXQuZGVmCmluZGV4 IDYzOTJlNzMuLjQ0OTZmOWEgMTAwNjQ0Ci0tLSBhL2djYy90YXJnZXQuZGVm CisrKyBiL2djYy90YXJnZXQuZGVmCkBAIC00OTQ4LDYgKzQ5NDgsMTYgQEAg Tm9ybWFsbHksIHRoaXMgaXMgbm90IG5lZWRlZC4iLAogIGJvb2wsIChjb25z dF90cmVlIGZpZWxkLCBtYWNoaW5lX21vZGUgbW9kZSksCiAgZGVmYXVsdF9t ZW1iZXJfdHlwZV9mb3JjZXNfYmxrKQogCisvKiBTZWUgdHJlZS1zc2EtbWF0 aC1vcHRzLmM6ZGl2bW9kX2NhbmRpZGF0ZV9wIGZvciBjb25kaXRpb25zIHRo YXQgZ2F0ZQorICAgdGhlIGRpdm1vZCB0cmFuc2Zvcm0uICAqLworREVGSE9P SworKGV4cGFuZF9kaXZtb2RfbGliZnVuYywKKyAiRGVmaW5lIHRoaXMgaG9v ayBpZiB0aGUgcG9ydCBkb2VzIG5vdCBoYXZlIGhhcmR3YXJlIGRpdiBhbmQg ZGl2bW9kIGluc24gZm9yXG5cCit0aGUgZ2l2ZW4gbW9kZSBidXQgaGFzIGRp dm1vZCBsaWJmdW5jLCB3aGljaCBpcyBpbmNvbXBhdGlibGVcblwKK3dpdGgg bGliZ2NjMi5jOl9fdWRpdm1vZGRpNCIsCisgdm9pZCwgKGJvb2wgdW5zaWdu ZWRwLCBtYWNoaW5lX21vZGUgbW9kZSwgcnR4LCBydHgsIHJ0eCAqcXVvdCwg cnR4ICpyZW0pLAorIGRlZmF1bHRfZXhwYW5kX2Rpdm1vZF9saWJmdW5jKQor CiAvKiBSZXR1cm4gdGhlIGNsYXNzIGZvciBhIHNlY29uZGFyeSByZWxvYWQs IGFuZCBmaWxsIGluIGV4dHJhIGluZm9ybWF0aW9uLiAgKi8KIERFRkhPT0sK IChzZWNvbmRhcnlfcmVsb2FkLApkaWZmIC0tZ2l0IGEvZ2NjL3Rhcmdob29r cy5jIGIvZ2NjL3Rhcmdob29rcy5jCmluZGV4IDZiNDYwMWIuLjIwMzI3YTYg MTAwNjQ0Ci0tLSBhL2djYy90YXJnaG9va3MuYworKysgYi9nY2MvdGFyZ2hv b2tzLmMKQEAgLTE5NjUsNCArMTk2NSwzMSBAQCBkZWZhdWx0X29wdGFiX3N1 cHBvcnRlZF9wIChpbnQsIG1hY2hpbmVfbW9kZSwgbWFjaGluZV9tb2RlLCBv cHRpbWl6YXRpb25fdHlwZSkKICAgcmV0dXJuIHRydWU7CiB9CiAKKy8qIEdl bmVyYXRlIGNhbGwgdG8KKyAgIERJbW9kZSBfX3VkaXZtb2RkaTQgKERJbW9k ZSBvcDAsIERJbW9kZSBvcDEsIERJbW9kZSAqcmVtKS4gICovCisKK3ZvaWQK K2RlZmF1bHRfZXhwYW5kX2Rpdm1vZF9saWJmdW5jIChib29sIHVuc2lnbmVk cCwgbWFjaGluZV9tb2RlIG1vZGUsCisJCQkgICAgICAgcnR4IG9wMCwgcnR4 IG9wMSwKKwkJCSAgICAgICBydHggKnF1b3RfcCwgcnR4ICpyZW1fcCkKK3sK KyAgZ2NjX2Fzc2VydCAobW9kZSA9PSBESW1vZGUpOworICBnY2NfYXNzZXJ0 ICh1bnNpZ25lZHApOworCisgIHJ0eCBsaWJmdW5jID0gb3B0YWJfbGliZnVu YyAodWRpdm1vZF9vcHRhYiwgREltb2RlKTsKKyAgZ2NjX2Fzc2VydCAobGli ZnVuYyk7CisKKyAgcnR4IHJlbWFpbmRlciA9IGFzc2lnbl9zdGFja190ZW1w IChESW1vZGUsIEdFVF9NT0RFX1NJWkUgKERJbW9kZSkpOworICBydHggYWRk cmVzcyA9IFhFWFAgKHJlbWFpbmRlciwgMCk7CisKKyAgcnR4IHF1b3RpZW50 ID0gZW1pdF9saWJyYXJ5X2NhbGxfdmFsdWUgKGxpYmZ1bmMsIE5VTExfUlRY LCBMQ1RfQ09OU1QsCisJCQkJCSAgREltb2RlLCAzLAorCQkJCQkgIG9wMCwg R0VUX01PREUgKG9wMCksCisJCQkJCSAgb3AxLCBHRVRfTU9ERSAob3AxKSwK KwkJCQkJICBhZGRyZXNzLCBHRVRfTU9ERSAoYWRkcmVzcykpOworCisgICpx dW90X3AgPSBxdW90aWVudDsKKyAgKnJlbV9wID0gcmVtYWluZGVyOworfQor CiAjaW5jbHVkZSAiZ3QtdGFyZ2hvb2tzLmgiCmRpZmYgLS1naXQgYS9nY2Mv dGFyZ2hvb2tzLmggYi9nY2MvdGFyZ2hvb2tzLmgKaW5kZXggNzY4N2MzOS4u ZGM1ZThlNyAxMDA2NDQKLS0tIGEvZ2NjL3Rhcmdob29rcy5oCisrKyBiL2dj Yy90YXJnaG9va3MuaApAQCAtMjU0LDQgKzI1NCw3IEBAIGV4dGVybiB2b2lk IGRlZmF1bHRfc2V0dXBfaW5jb21pbmdfdmFyYXJnX2JvdW5kcyAoY3VtdWxh dGl2ZV9hcmdzX3QgY2EgQVRUUklCVVRFCiBleHRlcm4gYm9vbCBkZWZhdWx0 X29wdGFiX3N1cHBvcnRlZF9wIChpbnQsIG1hY2hpbmVfbW9kZSwgbWFjaGlu ZV9tb2RlLAogCQkJCSAgICAgICBvcHRpbWl6YXRpb25fdHlwZSk7CiAKK2V4 dGVybiB2b2lkIGRlZmF1bHRfZXhwYW5kX2Rpdm1vZF9saWJmdW5jIChib29s LCBtYWNoaW5lX21vZGUsCisJCQkJCSAgIHJ0eCwgcnR4LCBydHggKiwgcnR4 ICopOworCiAjZW5kaWYgLyogR0NDX1RBUkdIT09LU19IICovCmRpZmYgLS1n aXQgYS9nY2MvdHJlZS1zc2EtbWF0aC1vcHRzLmMgYi9nY2MvdHJlZS1zc2Et bWF0aC1vcHRzLmMKaW5kZXggODE2ODhjZC4uYjE1ZGE2YSAxMDA2NDQKLS0t IGEvZ2NjL3RyZWUtc3NhLW1hdGgtb3B0cy5jCisrKyBiL2djYy90cmVlLXNz YS1tYXRoLW9wdHMuYwpAQCAtMTEyLDYgKzExMiw5IEBAIGFsb25nIHdpdGgg R0NDOyBzZWUgdGhlIGZpbGUgQ09QWUlORzMuICBJZiBub3Qgc2VlCiAjaW5j bHVkZSAicGFyYW1zLmgiCiAjaW5jbHVkZSAiaW50ZXJuYWwtZm4uaCIKICNp bmNsdWRlICJjYXNlLWNmbi1tYWNyb3MuaCIKKyNpbmNsdWRlICJvcHRhYnMt bGliZnVuY3MuaCIKKyNpbmNsdWRlICJ0cmVlLWVoLmgiCisjaW5jbHVkZSAi dGFyZ2hvb2tzLmgiCiAKIC8qIFRoaXMgc3RydWN0dXJlIHJlcHJlc2VudHMg b25lIGJhc2ljIGJsb2NrIHRoYXQgZWl0aGVyIGNvbXB1dGVzIGEKICAgIGRp dmlzaW9uLCBvciBpcyBhIGNvbW1vbiBkb21pbmF0b3IgZm9yIGJhc2ljIGJs b2NrIHRoYXQgY29tcHV0ZSBhCkBAIC0xODQsNiArMTg3LDkgQEAgc3RhdGlj IHN0cnVjdAogCiAgIC8qIE51bWJlciBvZiBmcCBmdXNlZCBtdWx0aXBseS1h ZGQgb3BzIGluc2VydGVkLiAgKi8KICAgaW50IGZtYXNfaW5zZXJ0ZWQ7CisK KyAgLyogTnVtYmVyIG9mIGRpdm1vZCBjYWxscyBpbnNlcnRlZC4gICovCisg IGludCBkaXZtb2RfY2FsbHNfaW5zZXJ0ZWQ7CiB9IHdpZGVuX211bF9zdGF0 czsKIAogLyogVGhlIGluc3RhbmNlIG9mICJzdHJ1Y3Qgb2NjdXJyZW5jZSIg cmVwcmVzZW50aW5nIHRoZSBoaWdoZXN0CkBAIC0zNzg0LDYgKzM3OTAsMjAy IEBAIG1hdGNoX3VhZGRzdWJfb3ZlcmZsb3cgKGdpbXBsZV9zdG10X2l0ZXJh dG9yICpnc2ksIGdpbXBsZSAqc3RtdCwKICAgcmV0dXJuIHRydWU7CiB9CiAK Ky8qIFJldHVybiB0cnVlIGlmIHRhcmdldCBoYXMgc3VwcG9ydCBmb3IgZGl2 bW9kLiAgKi8KKworc3RhdGljIGJvb2wKK3RhcmdldF9zdXBwb3J0c19kaXZt b2RfcCAob3B0YWIgZGl2bW9kX29wdGFiLCBvcHRhYiBkaXZfb3B0YWIsIG1h Y2hpbmVfbW9kZSBtb2RlLCBib29sIHVuc2lnbmVkcCkKK3sKKyAgLyogSWYg dGFyZ2V0IHN1cHBvcnRzIGhhcmR3YXJlIGRpdm1vZCBpbnNuLCB1c2UgaXQg Zm9yIGRpdm1vZC4gICovCisgIGlmIChvcHRhYl9oYW5kbGVyIChkaXZtb2Rf b3B0YWIsIG1vZGUpICE9IENPREVfRk9SX25vdGhpbmcpCisgICAgcmV0dXJu IHRydWU7CisKKyAgLyogQ2hlY2sgaWYgbGliZnVuYyBmb3IgZGl2bW9kIGlz IGF2YWlsYWJsZS4gICovCisgIGlmIChvcHRhYl9saWJmdW5jIChkaXZtb2Rf b3B0YWIsIG1vZGUpICE9IE5VTExfUlRYKSAKKyAgICB7CisgICAgICAvKiBJ ZiB0YXJnZXQgc3VwcG9ydHMgaGFyZHdhcmUgaW5zbiwgdGhlbiB3ZSBkb24n dAorCSB3YW50IHRvIHVzZSBkaXZtb2QgbGliZnVuYy4gICovCisgICAgICBp ZiAob3B0YWJfaGFuZGxlciAoZGl2X29wdGFiLCBtb2RlKSAhPSBDT0RFX0ZP Ul9ub3RoaW5nKQorCXJldHVybiBmYWxzZTsKKworICAgICAgLyogSWYgdGFy Z2V0IG92ZXJyaWRlcyBleHBhbmRfZGl2bW9kX2xpYmZ1bmMgaG9vaworCSB0 aGVuIHBlcmZvcm0gZGl2bW9kIGJ5IGdlbmVyYXRpbmcgY2FsbCB0byB0aGUg dGFyZ2V0LXNwZWNpZmMgZGl2bW9kIGxpYmZ1bmMuICAqLworICAgICAgaWYg KHRhcmdldG0uZXhwYW5kX2Rpdm1vZF9saWJmdW5jICE9IGRlZmF1bHRfZXhw YW5kX2Rpdm1vZF9saWJmdW5jKQorCXJldHVybiB0cnVlOworCisgICAgICAv KiBTaW5jZSB0YXJnZXRtLmV4cGFuZF9kaXZtb2RfbGliZnVuYyA9PSBkZWZh dWx0X2V4cGFuZF9kaXZtb2RfbGliZnVuYyAKKwkgbW9kZSBpcyBndWFyYW50 ZWVkIHRvIGJlIERJbW9kZS4KKwkgRmFsbCBiYWNrIHRvIHVzaW5nIGxpYmdj YzIuYzpfX3VkaXZtb2RkaTQgaWYgdW5zaWduZWRwIGlzIHRydWUuICAqLwor ICAgICAgcmV0dXJuIHVuc2lnbmVkcDsKKyAgICB9CisKKyAgcmV0dXJuIGZh bHNlOworfQorCisvKiBDaGVjayBpZiBzdG10IGlzIGNhbmRpZGF0ZSBmb3Ig ZGl2bW9kIHRyYW5zZm9ybS4gICovCisKK3N0YXRpYyBib29sCitkaXZtb2Rf Y2FuZGlkYXRlX3AgKGdhc3NpZ24gKnN0bXQpCit7CisgIHRyZWUgdHlwZSA9 IFRSRUVfVFlQRSAoZ2ltcGxlX2Fzc2lnbl9saHMgKHN0bXQpKTsKKyAgZW51 bSBtYWNoaW5lX21vZGUgbW9kZSA9IFRZUEVfTU9ERSAodHlwZSk7CisgIG9w dGFiIGRpdm1vZF9vcHRhYiwgZGl2X29wdGFiOworCisgIGlmIChUWVBFX1VO U0lHTkVEICh0eXBlKSkKKyAgICB7CisgICAgICBkaXZtb2Rfb3B0YWIgPSB1 ZGl2bW9kX29wdGFiOworICAgICAgZGl2X29wdGFiID0gdWRpdl9vcHRhYjsK KyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBkaXZtb2Rfb3B0YWIgPSBz ZGl2bW9kX29wdGFiOworICAgICAgZGl2X29wdGFiID0gc2Rpdl9vcHRhYjsK KyAgICB9CisKKyAgdHJlZSBvcDEgPSBnaW1wbGVfYXNzaWduX3JoczEgKHN0 bXQpOworICB0cmVlIG9wMiA9IGdpbXBsZV9hc3NpZ25fcmhzMiAoc3RtdCk7 CisKKyAgLyogRGlzYWJsZSB0aGUgdHJhbnNmb3JtIGlmIGVpdGhlciBpcyBh IGNvbnN0YW50LCBzaW5jZSBkaXZpc2lvbi1ieS1jb25zdGFudAorICAgICBt YXkgaGF2ZSBzcGVjaWFsaXplZCBleHBhbnNpb24uICAqLworICBpZiAoQ09O U1RBTlRfQ0xBU1NfUCAob3AxKSB8fCBDT05TVEFOVF9DTEFTU19QIChvcDIp KQorICAgIHJldHVybiBmYWxzZTsKKworICAvKiBFeGNsdWRlIHRoZSBjYXNl IHdoZXJlIFRZUEVfT1ZFUkZMT1dfVFJBUFMgKHR5cGUpIGFzIHRoYXQgc2hv dWxkCisgICAgIGV4cGFuZCB1c2luZyB0aGUgW3N1XWRpdnYgb3B0YWJzLiAg Ki8KKyAgaWYgKFRZUEVfT1ZFUkZMT1dfVFJBUFMgKHR5cGUpKQorICAgIHJl dHVybiBmYWxzZTsKKyAgCisgIGlmICghdGFyZ2V0X3N1cHBvcnRzX2Rpdm1v ZF9wIChkaXZtb2Rfb3B0YWIsIGRpdl9vcHRhYiwKKwkJCQkgbW9kZSwgVFlQ RV9VTlNJR05FRCAodHlwZSkpKQorICAgIHJldHVybiBmYWxzZTsKKworICBy ZXR1cm4gdHJ1ZTsKK30KKworLyogVGhpcyBmdW5jdGlvbiBsb29rcyBmb3I6 CisgICB0MSA9IGEgVFJVTkNfRElWX0VYUFIgYjsKKyAgIHQyID0gYSBUUlVO Q19NT0RfRVhQUiBiOworICAgYW5kIHRyYW5zZm9ybXMgaXQgdG8gdGhlIGZv bGxvd2luZyBzZXF1ZW5jZToKKyAgIGNvbXBsZXhfdG1wID0gRElWTU9EIChh LCBiKTsKKyAgIHQxID0gUkVBTFBBUlRfRVhQUihhKTsKKyAgIHQyID0gSU1B R1BBUlRfRVhQUihiKTsKKyAgIEZvciBjb25kaXRpb25zIGVuYWJsaW5nIHRo ZSB0cmFuc2Zvcm0gc2VlIGRpdm1vZF9jYW5kaWRhdGVfcCgpLgorCisgICBU aGUgcGFzcyB3b3JrcyBpbiB0d28gcGhhc2VzOgorICAgMSkgV2FsayB0aHJv dWdoIGFsbCBpbW1lZGlhdGUgdXNlcyBvZiBzdG10J3Mgb3BlcmFuZCBhbmQg ZmluZCBhCisgICAgICBUUlVOQ19ESVZfRVhQUiB3aXRoIG1hdGNoaW5nIG9w ZXJhbmRzIGFuZCBpZiBzdWNoIGEgc3RtdCBpcyBmb3VuZCBhZGQKKyAgICAg IGl0IHRvIHN0bXRzIHZlY3Rvci4KKyAgIDIpIEluc2VydCBESVZNT0QgY2Fs bCBiZWZvcmUgZmlyc3QgZGl2L21vZCBzdG10IGluIHRvcF9iYiAoYmFzaWMg YmxvY2sgdGhhdAorICAgICAgZG9taW5hdGVzIG90aGVyIGRpdi9tb2Qgc3Rt dHMgd2l0aCBzYW1lIG9wZXJhbmRzKSBhbmQgdXBkYXRlIGVudHJpZXMgaW4K KyAgICAgIHN0bXRzIHZlY3RvciB0byB1c2UgcmV0dXJuIHZhbHVlIG9mIERJ TU9WRCAoUkVBTEVYUFJfUEFSVCBmb3IgZGl2LAorICAgICAgSU1BR1BBUlRf RVhQUiBmb3IgbW9kKS4gICovCisKK3N0YXRpYyBib29sCitjb252ZXJ0X3Rv X2Rpdm1vZCAoZ2Fzc2lnbiAqc3RtdCkKK3sKKyAgaWYgKCFkaXZtb2RfY2Fu ZGlkYXRlX3AgKHN0bXQpKQorICAgIHJldHVybiBmYWxzZTsKKworICBhdXRv X3ZlYzxnaW1wbGUgKj4gc3RtdHM7IAorICB0cmVlIG9wMSA9IGdpbXBsZV9h c3NpZ25fcmhzMSAoc3RtdCk7CisgIHRyZWUgb3AyID0gZ2ltcGxlX2Fzc2ln bl9yaHMyIChzdG10KTsKKyAgaW1tX3VzZV9pdGVyYXRvciB1c2VfaXRlcjsK KyAgZ2ltcGxlICp1c2Vfc3RtdDsKKyAgZ2ltcGxlICp0b3Bfc3RtdCA9IE5V TEw7CisgIGJvb2wgZGl2X3NlZW4gPSBmYWxzZTsKKyAgCisgIEZPUl9FQUNI X0lNTV9VU0VfU1RNVCAodXNlX3N0bXQsIHVzZV9pdGVyLCBvcDEpCisgICAg eworICAgICAgLyogQ2hlY2sgaWYgdXNlX3N0bXQgaXMgVFJVTkNfRElWX0VY UFIgd2l0aCBzYW1lIG9wZXJhbmRzIGFzIHN0bXQuICAqLworICAgICAgaWYg KGlzX2dpbXBsZV9hc3NpZ24gKHVzZV9zdG10KQorCSAgJiYgKGdpbXBsZV9h c3NpZ25fcmhzX2NvZGUgKHVzZV9zdG10KSA9PSBUUlVOQ19ESVZfRVhQUgor CSAgICAgIHx8IGdpbXBsZV9hc3NpZ25fcmhzX2NvZGUgKHVzZV9zdG10KSA9 PSBUUlVOQ19NT0RfRVhQUikKKwkgICYmIG9wZXJhbmRfZXF1YWxfcCAob3Ax LCBnaW1wbGVfYXNzaWduX3JoczEgKHVzZV9zdG10KSwgMCkKKwkgICYmIG9w ZXJhbmRfZXF1YWxfcCAob3AyLCBnaW1wbGVfYXNzaWduX3JoczIgKHVzZV9z dG10KSwgMCkpCisJeworCSAgaWYgKHN0bXRfY2FuX3Rocm93X2ludGVybmFs ICh1c2Vfc3RtdCkpCisJICAgIGNvbnRpbnVlOworCisJICBiYXNpY19ibG9j ayBiYiA9IGdpbXBsZV9iYiAodXNlX3N0bXQpOworCSAgYmFzaWNfYmxvY2sg dG9wX2JiID0gdG9wX3N0bXQgPyBnaW1wbGVfYmIgKHRvcF9zdG10KSA6IE5V TEw7CisKKwkgIGlmICh0b3BfYmIgPT0gTlVMTCkKKwkgICAgeworCSAgICAg IHRvcF9zdG10ID0gdXNlX3N0bXQ7CisJICAgICAgc3RtdHMuc2FmZV9wdXNo ICh0b3Bfc3RtdCk7CisJICAgIH0KKwkgIGVsc2UgaWYgKHRvcF9iYiA9PSBi YikKKwkgICAgeworCSAgICAgIHN0bXRzLnNhZmVfcHVzaCAodXNlX3N0bXQp OworCSAgICAgIGlmIChnaW1wbGVfdWlkICh1c2Vfc3RtdCkgPCBnaW1wbGVf dWlkICh0b3Bfc3RtdCkpCisJCXRvcF9zdG10ID0gdXNlX3N0bXQ7CisJICAg IH0KKwkgIGVsc2UgaWYgKGRvbWluYXRlZF9ieV9wIChDRElfRE9NSU5BVE9S UywgdG9wX2JiLCBiYikpCisJICAgIHsKKwkgICAgICBzdG10cy5zYWZlX3B1 c2ggKHVzZV9zdG10KTsKKwkgICAgICB0b3Bfc3RtdCA9IHVzZV9zdG10Owor CSAgICB9CisJICBlbHNlIGlmIChkb21pbmF0ZWRfYnlfcCAoQ0RJX0RPTUlO QVRPUlMsIGJiLCB0b3BfYmIpKQorCSAgICBzdG10cy5zYWZlX3B1c2ggKHVz ZV9zdG10KTsKKwkgIGVsc2UKKwkgICAgY29udGludWU7CisKKwkgIGlmIChn aW1wbGVfYXNzaWduX3Joc19jb2RlICh1c2Vfc3RtdCkgPT0gVFJVTkNfRElW X0VYUFIpCisJICAgIGRpdl9zZWVuID0gdHJ1ZTsKKwl9CisgICAgfQorCisg IGlmICghZGl2X3NlZW4pIAorICAgIHJldHVybiBmYWxzZTsKKworICAvKiBD cmVhdGUgbGliY2FsbCB0byBpbnRlcm5hbCBmbiBESVZNT0Q6CisgICAgIGRp dm1vZF90bXAgPSBESVZNT0QgKG9wMSwgb3AyKS4gICovCisKKyAgZ2NhbGwg KmNhbGxfc3RtdCA9IGdpbXBsZV9idWlsZF9jYWxsX2ludGVybmFsIChJRk5f RElWTU9ELCAyLCBvcDEsIG9wMik7CisgIHRyZWUgcmVzID0gbWFrZV90ZW1w X3NzYV9uYW1lICgKKwkJYnVpbGRfY29tcGxleF90eXBlIChUUkVFX1RZUEUg KG9wMSkpLAorCQljYWxsX3N0bXQsICJkaXZtb2RfdG1wIik7CisgIGdpbXBs ZV9jYWxsX3NldF9saHMgKGNhbGxfc3RtdCwgcmVzKTsKKworICAvKiBJbnNl cnQgdGhlIGNhbGwgYmVmb3JlIHRvcF9zdG10LiAgKi8KKyAgZ2ltcGxlX3N0 bXRfaXRlcmF0b3IgdG9wX3N0bXRfZ3NpID0gZ3NpX2Zvcl9zdG10ICh0b3Bf c3RtdCk7CisgIGdzaV9pbnNlcnRfYmVmb3JlICgmdG9wX3N0bXRfZ3NpLCBj YWxsX3N0bXQsIEdTSV9TQU1FX1NUTVQpOworCisgIHdpZGVuX211bF9zdGF0 cy5kaXZtb2RfY2FsbHNfaW5zZXJ0ZWQrKzsJCQorCisgIC8qIFVwZGF0ZSBh bGwgc3RhdGVtZW50cyBpbiBzdG10cy4KKyAgICAgaWYgc3RtdCBpcyBsaHMg PSBvcDEgVFJVTkNfRElWX0VYUFIgb3AyLCBjaGFuZ2UgdG8gbGhzID0gUkVB TFBBUlRfRVhQUjxkaXZtb2RfdG1wPgorICAgICBpZiBzdG10IGlzIGxocyA9 IG9wMSBUUlVOQ19NT0RfRVhQUiBvcDIsIGNoYW5nZSB0byBsaHMgPSBJTUFH UEFSVF9FWFBSPGRpdm1vZF90bXA+LiAgKi8KKworICBib29sIGNmZ19jaGFu Z2VkID0gZmFsc2U7CisgIGZvciAodW5zaWduZWQgaSA9IDA7IHN0bXRzLml0 ZXJhdGUgKGksICZ1c2Vfc3RtdCk7ICsraSkKKyAgICB7CisgICAgICB0cmVl IG5ld19yaHM7CisKKyAgICAgIHN3aXRjaCAoZ2ltcGxlX2Fzc2lnbl9yaHNf Y29kZSAodXNlX3N0bXQpKQorCXsKKwkgIGNhc2UgVFJVTkNfRElWX0VYUFI6 CisJICAgIG5ld19yaHMgPSBmb2xkX2J1aWxkMSAoUkVBTFBBUlRfRVhQUiwg VFJFRV9UWVBFIChvcDEpLCByZXMpOworCSAgICBicmVhazsKKworCSAgY2Fz ZSBUUlVOQ19NT0RfRVhQUjoKKwkgICAgbmV3X3JocyA9IGZvbGRfYnVpbGQx IChJTUFHUEFSVF9FWFBSLCBUUkVFX1RZUEUgKG9wMiksIHJlcyk7CisJICAg IGJyZWFrOworCisJICBkZWZhdWx0OgorCSAgICBnY2NfdW5yZWFjaGFibGUg KCk7CisJfQorCisgICAgICBnaW1wbGVfc3RtdF9pdGVyYXRvciBnc2kgPSBn c2lfZm9yX3N0bXQgKHVzZV9zdG10KTsKKyAgICAgIGdpbXBsZV9hc3NpZ25f c2V0X3Joc19mcm9tX3RyZWUgKCZnc2ksIG5ld19yaHMpOworICAgICAgdXBk YXRlX3N0bXQgKHVzZV9zdG10KTsKKworICAgICAgaWYgKG1heWJlX2NsZWFu X29yX3JlcGxhY2VfZWhfc3RtdCAodXNlX3N0bXQsIHVzZV9zdG10KSkKKwlj ZmdfY2hhbmdlZCA9IHRydWU7CisgICAgfQorCisgIHN0bXRzLnJlbGVhc2Ug KCk7CisgIHJldHVybiBjZmdfY2hhbmdlZDsKK30gICAgCiAKIC8qIEZpbmQg aW50ZWdlciBtdWx0aXBsaWNhdGlvbnMgd2hlcmUgdGhlIG9wZXJhbmRzIGFy ZSBleHRlbmRlZCBmcm9tCiAgICBzbWFsbGVyIHR5cGVzLCBhbmQgcmVwbGFj ZSB0aGUgTVVMVF9FWFBSIHdpdGggYSBXSURFTl9NVUxUX0VYUFIKQEAgLTM4 MjgsNiArNDAzMCw4IEBAIHBhc3Nfb3B0aW1pemVfd2lkZW5pbmdfbXVsOjpl eGVjdXRlIChmdW5jdGlvbiAqZnVuKQogICBib29sIGNmZ19jaGFuZ2VkID0g ZmFsc2U7CiAKICAgbWVtc2V0ICgmd2lkZW5fbXVsX3N0YXRzLCAwLCBzaXpl b2YgKHdpZGVuX211bF9zdGF0cykpOworICBjYWxjdWxhdGVfZG9taW5hbmNl X2luZm8gKENESV9ET01JTkFUT1JTKTsKKyAgcmVudW1iZXJfZ2ltcGxlX3N0 bXRfdWlkcyAoKTsKIAogICBGT1JfRUFDSF9CQl9GTiAoYmIsIGZ1bikKICAg ICB7CkBAIC0zODYxLDYgKzQwNjUsMTAgQEAgcGFzc19vcHRpbWl6ZV93aWRl bmluZ19tdWw6OmV4ZWN1dGUgKGZ1bmN0aW9uICpmdW4pCiAJCSAgICBtYXRj aF91YWRkc3ViX292ZXJmbG93ICgmZ3NpLCBzdG10LCBjb2RlKTsKIAkJICBi cmVhazsKIAorCQljYXNlIFRSVU5DX01PRF9FWFBSOgorCQkgIGNmZ19jaGFu Z2VkID0gY29udmVydF90b19kaXZtb2QgKGFzX2E8Z2Fzc2lnbiAqPiAoc3Rt dCkpOworCQkgIGJyZWFrOworCiAJCWRlZmF1bHQ6OwogCQl9CiAJICAgIH0K QEAgLTM5MDcsNiArNDExNSw4IEBAIHBhc3Nfb3B0aW1pemVfd2lkZW5pbmdf bXVsOjpleGVjdXRlIChmdW5jdGlvbiAqZnVuKQogCQkJICAgIHdpZGVuX211 bF9zdGF0cy5tYWNjc19pbnNlcnRlZCk7CiAgIHN0YXRpc3RpY3NfY291bnRl cl9ldmVudCAoZnVuLCAiZnVzZWQgbXVsdGlwbHktYWRkcyBpbnNlcnRlZCIs CiAJCQkgICAgd2lkZW5fbXVsX3N0YXRzLmZtYXNfaW5zZXJ0ZWQpOworICBz dGF0aXN0aWNzX2NvdW50ZXJfZXZlbnQgKGZ1biwgImRpdm1vZCBjYWxscyBp bnNlcnRlZCIsCisJCQkgICAgd2lkZW5fbXVsX3N0YXRzLmRpdm1vZF9jYWxs c19pbnNlcnRlZCk7CiAKICAgcmV0dXJuIGNmZ19jaGFuZ2VkID8gVE9ET19j bGVhbnVwX2NmZyA6IDA7CiB9Cg== --94eb2c03caaca34dd0053394c2a1--