From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 82955 invoked by alias); 12 Oct 2017 14:13:20 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Received: (qmail 82941 invoked by uid 89); 12 Oct 2017 14:13:19 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-25.1 required=5.0 tests=AWL,BAYES_00,FREEMAIL_FROM,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,RCVD_IN_DNSWL_NONE,RCVD_IN_SORBS_SPAM,SPF_PASS autolearn=ham version=3.3.2 spammy=belonging, dist, distributing X-HELO: mail-io0-f194.google.com Received: from mail-io0-f194.google.com (HELO mail-io0-f194.google.com) (209.85.223.194) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 12 Oct 2017 14:13:15 +0000 Received: by mail-io0-f194.google.com with SMTP id 134so1414747ioo.0 for ; Thu, 12 Oct 2017 07:13:15 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=PX2OaiDYLr9lFCKdWCDo2AONG/2y8y65HqRaYeHC1qE=; b=Zp9F+72PVrfeUwpQd0RxdiwXMZr/ag93a2ZCLRghTMD21J2wSrU0J0mgvkR57lW7eb CeI+gbzZ3CO1dv4D+tQub7s+QL4zf7LsDxC1yOc73/7ZNqxm4u1Z2r09KHZVHpR3r3/t OkjR3sP4Ythi1t6PL+cAUeq5vtFJfwsqyGZZEToRcmDYWBii2EwASLSPkWan1NIgAr6/ K6dWsHkZMiwxiswYxLO8HyyLwhZpqCeCrqvDOVol3tRf7tMimkRtPbR6/+V3s/HGlYEl t6Rp+hwSyB8Mn94MbW5hYZ64SlAJddGW56RkEw1HJG2sB8uWx+TmLMZ9WA+daFJABpUI NxXA== X-Gm-Message-State: AMCzsaWa9YUEtBcy8ar132DKVgFAvtsr27+z3P3X9fKytpXtF1G50XHQ 9XtQfDVdNDPCoLOR03D0Jjkf33xKkwA2aGI85n0= X-Google-Smtp-Source: AOwi7QD+BXhzUJZjDJZv+W3Cq9I2sLmgOvAha54GyLONAmB0d5bsUTvyjuS3oK7sWMUcyTO3dy56w+O7xfrNmgHIk+E= X-Received: by 10.107.88.19 with SMTP id m19mr3599983iob.166.1507817593529; Thu, 12 Oct 2017 07:13:13 -0700 (PDT) MIME-Version: 1.0 Received: by 10.2.86.86 with HTTP; Thu, 12 Oct 2017 07:13:12 -0700 (PDT) In-Reply-To: References: From: "Bin.Cheng" Date: Thu, 12 Oct 2017 14:29:00 -0000 Message-ID: Subject: Re: [PATCH GCC][6/7]Support loop nest distribution for builtin partition To: Richard Biener Cc: "gcc-patches@gcc.gnu.org" Content-Type: multipart/mixed; boundary="f403043cd1700c8c86055b5a2414" X-IsSubscribed: yes X-SW-Source: 2017-10/txt/msg00759.txt.bz2 --f403043cd1700c8c86055b5a2414 Content-Type: text/plain; charset="UTF-8" Content-length: 2480 On Thu, Oct 12, 2017 at 2:32 PM, Richard Biener wrote: > On Thu, Oct 5, 2017 at 3:17 PM, Bin Cheng wrote: >> Hi, >> This patch rewrites classification part of builtin partition so that nested >> builtin partitions are supported. With this extension, below loop nest: >> void >> foo (void) >> { >> for (unsigned i = 0; i < M; ++i) >> for (unsigned j = 0; j < N; ++j) >> arr[i][j] = 0; >> >> will be distributed into a single memset, rather than a loop of memset. >> Bootstrap and test in patch set on x86_64 and AArch64, is it OK? > > + tree access_size = fold_convert (sizetype, TYPE_SIZE_UNIT (TREE_TYPE (ref))); > + > > TYPE_SIZE_UNIT should be always sizetype. Done. > > + /* Classify the builtin kind. */ > + if (single_ld == NULL) > + classify_builtin_1 (loop, partition, single_st); > + else > + classify_builtin_2 (loop, rdg, partition, single_st, single_ld); > > maybe name those helpers classify_builtin_st and classify_builtin_ldst? Done. Patch updated in attachment, Will apply it later. Thanks, bin 2017-10-12 Bin Cheng * tree-loop-distribution.c (struct builtin_info): New struct. (struct partition): Refactor fields into struct builtin_info. (partition_free): Free struct builtin_info. (build_size_arg_loc, build_addr_arg_loc): Delete. (generate_memset_builtin, generate_memcpy_builtin): Get memory range information from struct builtin_info. (find_single_drs): New function refactored from classify_partition. Also moved builtin validity checks to this function. (compute_access_range, alloc_builtin): New functions. (classify_builtin_st, classify_builtin_ldst): New functions. (classify_partition): Refactor code into functions find_single_drs, classify_builtin_st and classify_builtin_ldst. (distribute_loop): Don't do runtime alias check when distributing loop nest. (find_seed_stmts_for_distribution): New function. (pass_loop_distribution::execute): Refactor code finding seed stmts into above function. Support distribution for the innermost two-level loop nest. Adjust dump information. gcc/testsuite/ChangeLog 2017-10-12 Bin Cheng * gcc.dg/tree-ssa/ldist-28.c: New test. * gcc.dg/tree-ssa/ldist-29.c: New test. * gcc.dg/tree-ssa/ldist-30.c: New test. * gcc.dg/tree-ssa/ldist-31.c: New test. > > Ok with those changes. > > Thanks, > Richard. > --f403043cd1700c8c86055b5a2414 Content-Type: text/x-patch; charset="US-ASCII"; name="0006-loop_nest-builtin-pattern-20171012.txt.patch" Content-Disposition: attachment; filename="0006-loop_nest-builtin-pattern-20171012.txt.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_j8ojm59r0 Content-length: 35006 RnJvbSA4MjcxY2UwODUxYTYwYjM4MjI2ZTkyNTU4YmNhMjM0Nzc0ZTU1MDNl IE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBCaW4gQ2hlbmcgPGJp bmNoZTAxQGUxMDg0NTEtbGluLmNhbWJyaWRnZS5hcm0uY29tPgpEYXRlOiBX ZWQsIDI3IFNlcCAyMDE3IDEzOjAwOjU5ICswMTAwClN1YmplY3Q6IFtQQVRD SCA2LzddIGxvb3BfbmVzdC1idWlsdGluLXBhdHRlcm4tMjAxNzEwMTIudHh0 CgotLS0KIGdjYy90ZXN0c3VpdGUvZ2NjLmRnL3RyZWUtc3NhL2xkaXN0LTI4 LmMgfCAgMTYgKwogZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvdHJlZS1zc2EvbGRp c3QtMjkuYyB8ICAxNyArKwogZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvdHJlZS1z c2EvbGRpc3QtMzAuYyB8ICAxNiArCiBnY2MvdGVzdHN1aXRlL2djYy5kZy90 cmVlLXNzYS9sZGlzdC0zMS5jIHwgIDE5ICsrCiBnY2MvdHJlZS1sb29wLWRp c3RyaWJ1dGlvbi5jICAgICAgICAgICAgIHwgNTA3ICsrKysrKysrKysrKysr KysrKystLS0tLS0tLS0tLS0KIDUgZmlsZXMgY2hhbmdlZCwgMzc3IGluc2Vy dGlvbnMoKyksIDE5OCBkZWxldGlvbnMoLSkKIGNyZWF0ZSBtb2RlIDEwMDY0 NCBnY2MvdGVzdHN1aXRlL2djYy5kZy90cmVlLXNzYS9sZGlzdC0yOC5jCiBj cmVhdGUgbW9kZSAxMDA2NDQgZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvdHJlZS1z c2EvbGRpc3QtMjkuYwogY3JlYXRlIG1vZGUgMTAwNjQ0IGdjYy90ZXN0c3Vp dGUvZ2NjLmRnL3RyZWUtc3NhL2xkaXN0LTMwLmMKIGNyZWF0ZSBtb2RlIDEw MDY0NCBnY2MvdGVzdHN1aXRlL2djYy5kZy90cmVlLXNzYS9sZGlzdC0zMS5j CgpkaWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvdHJlZS1zc2Ev bGRpc3QtMjguYyBiL2djYy90ZXN0c3VpdGUvZ2NjLmRnL3RyZWUtc3NhL2xk aXN0LTI4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4u NDQyMDEzOQotLS0gL2Rldi9udWxsCisrKyBiL2djYy90ZXN0c3VpdGUvZ2Nj LmRnL3RyZWUtc3NhL2xkaXN0LTI4LmMKQEAgLTAsMCArMSwxNiBAQAorLyog eyBkZy1kbyBjb21waWxlIH0gKi8KKy8qIHsgZGctb3B0aW9ucyAiLU8yIC1m dHJlZS1sb29wLWRpc3RyaWJ1dGlvbiAtZnRyZWUtbG9vcC1kaXN0cmlidXRl LXBhdHRlcm5zIC1mZHVtcC10cmVlLWxkaXN0LWRldGFpbHMiIH0gKi8KKwor I2RlZmluZSBNICgyNTYpCisjZGVmaW5lIE4gKDEwMjQpCitpbnQgYXJyW01d W05dOworCit2b2lkCitmb28gKHZvaWQpCit7CisgIGZvciAodW5zaWduZWQg aSA9IDA7IGkgPCBNOyArK2kpCisgICAgZm9yICh1bnNpZ25lZCBqID0gMDsg aiA8IE47ICsraikKKyAgICAgIGFycltpXVtqXSA9IDA7Cit9CisKKy8qIHsg ZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcCAiTG9vcCBuZXN0IC4gZGlzdHJp YnV0ZWQ6IHNwbGl0IHRvIDAgbG9vcHMgYW5kIDEgbGlicmFyeSIgImxkaXN0 IiB9IH0gKi8KZGlmZiAtLWdpdCBhL2djYy90ZXN0c3VpdGUvZ2NjLmRnL3Ry ZWUtc3NhL2xkaXN0LTI5LmMgYi9nY2MvdGVzdHN1aXRlL2djYy5kZy90cmVl LXNzYS9sZGlzdC0yOS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAw MDAwMDAuLjljZTkzZTgKLS0tIC9kZXYvbnVsbAorKysgYi9nY2MvdGVzdHN1 aXRlL2djYy5kZy90cmVlLXNzYS9sZGlzdC0yOS5jCkBAIC0wLDAgKzEsMTcg QEAKKy8qIHsgZGctZG8gY29tcGlsZSB9ICovCisvKiB7IGRnLW9wdGlvbnMg Ii1PMiAtZnRyZWUtbG9vcC1kaXN0cmlidXRpb24gLWZ0cmVlLWxvb3AtZGlz dHJpYnV0ZS1wYXR0ZXJucyAtZmR1bXAtdHJlZS1sZGlzdC1kZXRhaWxzIiB9 ICovCisKKyNkZWZpbmUgTSAoMjU2KQorI2RlZmluZSBOICg1MTIpCitpbnQg YXJyW01dW05dOworCit2b2lkCitmb28gKHZvaWQpCit7CisgIGZvciAodW5z aWduZWQgaSA9IDA7IGkgPCBNOyArK2kpCisgICAgZm9yICh1bnNpZ25lZCBq ID0gMDsgaiA8IE4gLSAxOyArK2opCisgICAgICBhcnJbaV1bal0gPSAwOwor fQorCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAtbm90ICJMb29w IG5lc3QgLiBkaXN0cmlidXRlZDogc3BsaXQgdG8iICJsZGlzdCIgfSB9ICov CisvKiB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAtdGltZXMgIkxvb3Ag LiBkaXN0cmlidXRlZDogc3BsaXQgdG8gMCBsb29wcyBhbmQgMSBsaWJyYXJ5 IiAxICJsZGlzdCIgfSB9ICovCmRpZmYgLS1naXQgYS9nY2MvdGVzdHN1aXRl L2djYy5kZy90cmVlLXNzYS9sZGlzdC0zMC5jIGIvZ2NjL3Rlc3RzdWl0ZS9n Y2MuZGcvdHJlZS1zc2EvbGRpc3QtMzAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0 NAppbmRleCAwMDAwMDAwLi5mMzE4NjBhCi0tLSAvZGV2L251bGwKKysrIGIv Z2NjL3Rlc3RzdWl0ZS9nY2MuZGcvdHJlZS1zc2EvbGRpc3QtMzAuYwpAQCAt MCwwICsxLDE2IEBACisvKiB7IGRnLWRvIGNvbXBpbGUgfSAqLworLyogeyBk Zy1vcHRpb25zICItTzIgLWZ0cmVlLWxvb3AtZGlzdHJpYnV0aW9uIC1mdHJl ZS1sb29wLWRpc3RyaWJ1dGUtcGF0dGVybnMgLWZkdW1wLXRyZWUtbGRpc3Qt ZGV0YWlscyIgfSAqLworCisjZGVmaW5lIE0gKDI1NikKKyNkZWZpbmUgTiAo NTEyKQoraW50IGFbTV1bTl0sIGJbTV1bTl07CisKK3ZvaWQKK2ZvbyAodm9p ZCkKK3sKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IE07ICsraSkKKyAg ICBmb3IgKHVuc2lnbmVkIGogPSBOOyBqID4gMDsgLS1qKQorICAgICAgYVtp XVtqIC0gMV0gPSBiW2ldW2ogLSAxXTsKK30KKworLyogeyBkZy1maW5hbCB7 IHNjYW4tdHJlZS1kdW1wLXRpbWVzICJMb29wIG5lc3QgLiBkaXN0cmlidXRl ZDogc3BsaXQgdG8iIDEgImxkaXN0IiB9IH0gKi8KZGlmZiAtLWdpdCBhL2dj Yy90ZXN0c3VpdGUvZ2NjLmRnL3RyZWUtc3NhL2xkaXN0LTMxLmMgYi9nY2Mv dGVzdHN1aXRlL2djYy5kZy90cmVlLXNzYS9sZGlzdC0zMS5jCm5ldyBmaWxl IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwYTlmNzQKLS0tIC9kZXYv bnVsbAorKysgYi9nY2MvdGVzdHN1aXRlL2djYy5kZy90cmVlLXNzYS9sZGlz dC0zMS5jCkBAIC0wLDAgKzEsMTkgQEAKKy8qIHsgZGctZG8gY29tcGlsZSB9 ICovCisvKiB7IGRnLW9wdGlvbnMgIi1PMiAtZnRyZWUtbG9vcC1kaXN0cmli dXRpb24gLWZ0cmVlLWxvb3AtZGlzdHJpYnV0ZS1wYXR0ZXJucyAtZmR1bXAt dHJlZS1sZGlzdC1kZXRhaWxzIiB9ICovCisKKyNkZWZpbmUgTSAoMjU2KQor I2RlZmluZSBOICg1MTIpCitpbnQgYVtNXVtOXSwgYltNXVtOXSwgY1tNXTsK Kwordm9pZAorZm9vICh2b2lkKQoreworICBmb3IgKGludCBpID0gTSAtIDE7 IGkgPj0gMDsgLS1pKQorICAgIHsKKyAgICAgIGNbaV0gPSAwOworICAgICAg Zm9yICh1bnNpZ25lZCBqID0gTjsgaiA+IDA7IC0taikKKwlhW2ldW2ogLSAx XSA9IGJbaV1baiAtIDFdOworICAgIH0KK30KKworLyogeyBkZy1maW5hbCB7 IHNjYW4tdHJlZS1kdW1wLXRpbWVzICJMb29wIG5lc3QgLiBkaXN0cmlidXRl ZDogc3BsaXQgdG8gMCBsb29wcyBhbmQgMiBsaWJyYXJ5IiAxICJsZGlzdCIg fSB9ICovCmRpZmYgLS1naXQgYS9nY2MvdHJlZS1sb29wLWRpc3RyaWJ1dGlv bi5jIGIvZ2NjL3RyZWUtbG9vcC1kaXN0cmlidXRpb24uYwppbmRleCA3MDQw NjY5Li5hODNjMDczIDEwMDY0NAotLS0gYS9nY2MvdHJlZS1sb29wLWRpc3Ry aWJ1dGlvbi5jCisrKyBiL2djYy90cmVlLWxvb3AtZGlzdHJpYnV0aW9uLmMK QEAgLTU5Myw2ICs1OTMsMTkgQEAgZW51bSBwYXJ0aXRpb25fdHlwZSB7CiAg ICAgUFRZUEVfU0VRVUVOVElBTAogfTsKIAorLyogQnVpbHRpbiBpbmZvIGZv ciBsb29wIGRpc3RyaWJ1dGlvbi4gICovCitzdHJ1Y3QgYnVpbHRpbl9pbmZv Cit7CisgIC8qIGRhdGEtcmVmZXJlbmNlcyBhIGtpbmQgIT0gUEtJTkRfTk9S TUFMIHBhcnRpdGlvbiBpcyBhYm91dC4gICovCisgIGRhdGFfcmVmZXJlbmNl X3AgZHN0X2RyOworICBkYXRhX3JlZmVyZW5jZV9wIHNyY19kcjsKKyAgLyog QmFzZSBhZGRyZXNzIGFuZCBzaXplIG9mIG1lbW9yeSBvYmplY3RzIG9wZXJh dGVkIGJ5IHRoZSBidWlsdGluLiAgTm90ZQorICAgICBib3RoIGRlc3QgYW5k IHNvdXJjZSBtZW1vcnkgb2JqZWN0cyBtdXN0IGhhdmUgdGhlIHNhbWUgc2l6 ZS4gICovCisgIHRyZWUgZHN0X2Jhc2U7CisgIHRyZWUgc3JjX2Jhc2U7Cisg IHRyZWUgc2l6ZTsKK307CisKIC8qIFBhcnRpdGlvbiBmb3IgbG9vcCBkaXN0 cmlidXRpb24uICAqLwogc3RydWN0IHBhcnRpdGlvbgogewpAQCAtNjAwLDE4 ICs2MTMsMTIgQEAgc3RydWN0IHBhcnRpdGlvbgogICBiaXRtYXAgc3RtdHM7 CiAgIC8qIFRydWUgaWYgdGhlIHBhcnRpdGlvbiBkZWZpbmVzIHZhcmlhYmxl IHdoaWNoIGlzIHVzZWQgb3V0c2lkZSBvZiBsb29wLiAgKi8KICAgYm9vbCBy ZWR1Y3Rpb25fcDsKLSAgLyogRm9yIGJ1aWx0aW4gcGFydGl0aW9uLCB0cnVl IGlmIGl0IGV4ZWN1dGVzIG9uZSBpdGVyYXRpb24gbW9yZSB0aGFuCi0gICAg IG51bWJlciBvZiBsb29wIChsYXRjaCkgaXRlcmF0aW9ucy4gICovCi0gIGJv b2wgcGx1c19vbmU7CiAgIGVudW0gcGFydGl0aW9uX2tpbmQga2luZDsKICAg ZW51bSBwYXJ0aXRpb25fdHlwZSB0eXBlOwotICAvKiBkYXRhLXJlZmVyZW5j ZXMgYSBraW5kICE9IFBLSU5EX05PUk1BTCBwYXJ0aXRpb24gaXMgYWJvdXQu ICAqLwotICBkYXRhX3JlZmVyZW5jZV9wIG1haW5fZHI7Ci0gIGRhdGFfcmVm ZXJlbmNlX3Agc2Vjb25kYXJ5X2RyOwotICAvKiBOdW1iZXIgb2YgbG9vcCAo bGF0Y2gpIGl0ZXJhdGlvbnMuICAqLwotICB0cmVlIG5pdGVyOwogICAvKiBE YXRhIHJlZmVyZW5jZXMgaW4gdGhlIHBhcnRpdGlvbi4gICovCiAgIGJpdG1h cCBkYXRhcmVmczsKKyAgLyogSW5mb3JtYXRpb24gb2YgYnVpbHRpbiBwYXJp dGlvbi4gICovCisgIHN0cnVjdCBidWlsdGluX2luZm8gKmJ1aWx0aW47CiB9 OwogCiAKQEAgLTYzNSw2ICs2NDIsOSBAQCBwYXJ0aXRpb25fZnJlZSAocGFy dGl0aW9uICpwYXJ0aXRpb24pCiB7CiAgIEJJVE1BUF9GUkVFIChwYXJ0aXRp b24tPnN0bXRzKTsKICAgQklUTUFQX0ZSRUUgKHBhcnRpdGlvbi0+ZGF0YXJl ZnMpOworICBpZiAocGFydGl0aW9uLT5idWlsdGluKQorICAgIGZyZWUgKHBh cnRpdGlvbi0+YnVpbHRpbik7CisKICAgZnJlZSAocGFydGl0aW9uKTsKIH0K IApAQCAtODk0LDQzICs5MDQsNiBAQCBnZW5lcmF0ZV9sb29wc19mb3JfcGFy dGl0aW9uIChzdHJ1Y3QgbG9vcCAqbG9vcCwgcGFydGl0aW9uICpwYXJ0aXRp b24sCiAgIGZyZWUgKGJicyk7CiB9CiAKLS8qIEJ1aWxkIHRoZSBzaXplIGFy Z3VtZW50IGZvciBhIG1lbW9yeSBvcGVyYXRpb24gY2FsbC4gICovCi0KLXN0 YXRpYyB0cmVlCi1idWlsZF9zaXplX2FyZ19sb2MgKGxvY2F0aW9uX3QgbG9j LCBkYXRhX3JlZmVyZW5jZV9wIGRyLCB0cmVlIG5iX2l0ZXIsCi0JCSAgICBi b29sIHBsdXNfb25lKQotewotICB0cmVlIHNpemUgPSBmb2xkX2NvbnZlcnRf bG9jIChsb2MsIHNpemV0eXBlLCBuYl9pdGVyKTsKLSAgaWYgKHBsdXNfb25l KQotICAgIHNpemUgPSBzaXplX2Jpbm9wIChQTFVTX0VYUFIsIHNpemUsIHNp emVfb25lX25vZGUpOwotICBzaXplID0gZm9sZF9idWlsZDJfbG9jIChsb2Ms IE1VTFRfRVhQUiwgc2l6ZXR5cGUsIHNpemUsCi0JCQkgIFRZUEVfU0laRV9V TklUIChUUkVFX1RZUEUgKERSX1JFRiAoZHIpKSkpOwotICBzaXplID0gZm9s ZF9jb252ZXJ0X2xvYyAobG9jLCBzaXplX3R5cGVfbm9kZSwgc2l6ZSk7Ci0g IHJldHVybiBzaXplOwotfQotCi0vKiBCdWlsZCBhbiBhZGRyZXNzIGFyZ3Vt ZW50IGZvciBhIG1lbW9yeSBvcGVyYXRpb24gY2FsbC4gICovCi0KLXN0YXRp YyB0cmVlCi1idWlsZF9hZGRyX2FyZ19sb2MgKGxvY2F0aW9uX3QgbG9jLCBk YXRhX3JlZmVyZW5jZV9wIGRyLCB0cmVlIG5iX2J5dGVzKQotewotICB0cmVl IGFkZHJfYmFzZTsKLQotICBhZGRyX2Jhc2UgPSBzaXplX2Jpbm9wX2xvYyAo bG9jLCBQTFVTX0VYUFIsIERSX09GRlNFVCAoZHIpLCBEUl9JTklUIChkcikp OwotICBhZGRyX2Jhc2UgPSBmb2xkX2NvbnZlcnRfbG9jIChsb2MsIHNpemV0 eXBlLCBhZGRyX2Jhc2UpOwotCi0gIC8qIFRlc3QgZm9yIGEgbmVnYXRpdmUg c3RyaWRlLCBpdGVyYXRpbmcgb3ZlciBldmVyeSBlbGVtZW50LiAgKi8KLSAg aWYgKHRyZWVfaW50X2NzdF9zZ24gKERSX1NURVAgKGRyKSkgPT0gLTEpCi0g ICAgewotICAgICAgYWRkcl9iYXNlID0gc2l6ZV9iaW5vcF9sb2MgKGxvYywg TUlOVVNfRVhQUiwgYWRkcl9iYXNlLAotCQkJCSAgZm9sZF9jb252ZXJ0X2xv YyAobG9jLCBzaXpldHlwZSwgbmJfYnl0ZXMpKTsKLSAgICAgIGFkZHJfYmFz ZSA9IHNpemVfYmlub3BfbG9jIChsb2MsIFBMVVNfRVhQUiwgYWRkcl9iYXNl LAotCQkJCSAgVFlQRV9TSVpFX1VOSVQgKFRSRUVfVFlQRSAoRFJfUkVGIChk cikpKSk7Ci0gICAgfQotCi0gIHJldHVybiBmb2xkX2J1aWxkX3BvaW50ZXJf cGx1c19sb2MgKGxvYywgRFJfQkFTRV9BRERSRVNTIChkciksIGFkZHJfYmFz ZSk7Ci19Ci0KIC8qIElmIFZBTCBtZW1vcnkgcmVwcmVzZW50YXRpb24gY29u dGFpbnMgdGhlIHNhbWUgdmFsdWUgaW4gYWxsIGJ5dGVzLAogICAgcmV0dXJu IHRoYXQgdmFsdWUsIG90aGVyd2lzZSByZXR1cm4gLTEuCiAgICBFLmcuIGZv ciAweDI0MjQyNDI0IHJldHVybiAweDI0LCBmb3IgSUVFRSBkb3VibGUKQEAg LTk5NSwyNyArOTY4LDIzIEBAIHN0YXRpYyB2b2lkCiBnZW5lcmF0ZV9tZW1z ZXRfYnVpbHRpbiAoc3RydWN0IGxvb3AgKmxvb3AsIHBhcnRpdGlvbiAqcGFy dGl0aW9uKQogewogICBnaW1wbGVfc3RtdF9pdGVyYXRvciBnc2k7Ci0gIGdp bXBsZSAqc3RtdCwgKmZuX2NhbGw7CiAgIHRyZWUgbWVtLCBmbiwgbmJfYnl0 ZXM7Ci0gIGxvY2F0aW9uX3QgbG9jOwogICB0cmVlIHZhbDsKLQotICBzdG10 ID0gRFJfU1RNVCAocGFydGl0aW9uLT5tYWluX2RyKTsKLSAgbG9jID0gZ2lt cGxlX2xvY2F0aW9uIChzdG10KTsKKyAgc3RydWN0IGJ1aWx0aW5faW5mbyAq YnVpbHRpbiA9IHBhcnRpdGlvbi0+YnVpbHRpbjsKKyAgZ2ltcGxlICpmbl9j YWxsOwogCiAgIC8qIFRoZSBuZXcgc3RhdGVtZW50cyB3aWxsIGJlIHBsYWNl ZCBiZWZvcmUgTE9PUC4gICovCiAgIGdzaSA9IGdzaV9sYXN0X2JiIChsb29w X3ByZWhlYWRlcl9lZGdlIChsb29wKS0+c3JjKTsKIAotICBuYl9ieXRlcyA9 IGJ1aWxkX3NpemVfYXJnX2xvYyAobG9jLCBwYXJ0aXRpb24tPm1haW5fZHIs IHBhcnRpdGlvbi0+bml0ZXIsCi0JCQkJIHBhcnRpdGlvbi0+cGx1c19vbmUp OworICBuYl9ieXRlcyA9IGJ1aWx0aW4tPnNpemU7CiAgIG5iX2J5dGVzID0g Zm9yY2VfZ2ltcGxlX29wZXJhbmRfZ3NpICgmZ3NpLCBuYl9ieXRlcywgdHJ1 ZSwgTlVMTF9UUkVFLAogCQkJCSAgICAgICBmYWxzZSwgR1NJX0NPTlRJTlVF X0xJTktJTkcpOwotICBtZW0gPSBidWlsZF9hZGRyX2FyZ19sb2MgKGxvYywg cGFydGl0aW9uLT5tYWluX2RyLCBuYl9ieXRlcyk7CisgIG1lbSA9IGJ1aWx0 aW4tPmRzdF9iYXNlOwogICBtZW0gPSBmb3JjZV9naW1wbGVfb3BlcmFuZF9n c2kgKCZnc2ksIG1lbSwgdHJ1ZSwgTlVMTF9UUkVFLAogCQkJCSAgZmFsc2Us IEdTSV9DT05USU5VRV9MSU5LSU5HKTsKIAogICAvKiBUaGlzIGV4YWN0bHkg bWF0Y2hlcyB0aGUgcGF0dGVybiByZWNvZ25pdGlvbiBpbiBjbGFzc2lmeV9w YXJ0aXRpb24uICAqLwotICB2YWwgPSBnaW1wbGVfYXNzaWduX3JoczEgKHN0 bXQpOworICB2YWwgPSBnaW1wbGVfYXNzaWduX3JoczEgKERSX1NUTVQgKGJ1 aWx0aW4tPmRzdF9kcikpOwogICAvKiBIYW5kbGUgY29uc3RhbnRzIGxpa2Ug MHgxNTE1MTUxNSBhbmQgc2ltaWxhcmx5CiAgICAgIGZsb2F0aW5nIHBvaW50 IGNvbnN0YW50cyBldGMuIHdoZXJlIGFsbCBieXRlcyBhcmUgdGhlIHNhbWUu ICAqLwogICBpbnQgYnl0ZXYgPSBjb25zdF93aXRoX2FsbF9ieXRlc19zYW1l ICh2YWwpOwpAQCAtMTA1MSwyMyArMTAyMCwxOSBAQCBzdGF0aWMgdm9pZAog Z2VuZXJhdGVfbWVtY3B5X2J1aWx0aW4gKHN0cnVjdCBsb29wICpsb29wLCBw YXJ0aXRpb24gKnBhcnRpdGlvbikKIHsKICAgZ2ltcGxlX3N0bXRfaXRlcmF0 b3IgZ3NpOwotICBnaW1wbGUgKnN0bXQsICpmbl9jYWxsOworICBnaW1wbGUg KmZuX2NhbGw7CiAgIHRyZWUgZGVzdCwgc3JjLCBmbiwgbmJfYnl0ZXM7Ci0g IGxvY2F0aW9uX3QgbG9jOwogICBlbnVtIGJ1aWx0X2luX2Z1bmN0aW9uIGtp bmQ7Ci0KLSAgc3RtdCA9IERSX1NUTVQgKHBhcnRpdGlvbi0+bWFpbl9kcik7 Ci0gIGxvYyA9IGdpbXBsZV9sb2NhdGlvbiAoc3RtdCk7CisgIHN0cnVjdCBi dWlsdGluX2luZm8gKmJ1aWx0aW4gPSBwYXJ0aXRpb24tPmJ1aWx0aW47CiAK ICAgLyogVGhlIG5ldyBzdGF0ZW1lbnRzIHdpbGwgYmUgcGxhY2VkIGJlZm9y ZSBMT09QLiAgKi8KICAgZ3NpID0gZ3NpX2xhc3RfYmIgKGxvb3BfcHJlaGVh ZGVyX2VkZ2UgKGxvb3ApLT5zcmMpOwogCi0gIG5iX2J5dGVzID0gYnVpbGRf c2l6ZV9hcmdfbG9jIChsb2MsIHBhcnRpdGlvbi0+bWFpbl9kciwgcGFydGl0 aW9uLT5uaXRlciwKLQkJCQkgcGFydGl0aW9uLT5wbHVzX29uZSk7CisgIG5i X2J5dGVzID0gYnVpbHRpbi0+c2l6ZTsKICAgbmJfYnl0ZXMgPSBmb3JjZV9n aW1wbGVfb3BlcmFuZF9nc2kgKCZnc2ksIG5iX2J5dGVzLCB0cnVlLCBOVUxM X1RSRUUsCiAJCQkJICAgICAgIGZhbHNlLCBHU0lfQ09OVElOVUVfTElOS0lO Ryk7Ci0gIGRlc3QgPSBidWlsZF9hZGRyX2FyZ19sb2MgKGxvYywgcGFydGl0 aW9uLT5tYWluX2RyLCBuYl9ieXRlcyk7Ci0gIHNyYyA9IGJ1aWxkX2FkZHJf YXJnX2xvYyAobG9jLCBwYXJ0aXRpb24tPnNlY29uZGFyeV9kciwgbmJfYnl0 ZXMpOworICBkZXN0ID0gYnVpbHRpbi0+ZHN0X2Jhc2U7CisgIHNyYyA9IGJ1 aWx0aW4tPnNyY19iYXNlOwogICBpZiAocGFydGl0aW9uLT5raW5kID09IFBL SU5EX01FTUNQWQogICAgICAgfHwgISBwdHJfZGVyZWZzX21heV9hbGlhc19w IChkZXN0LCBzcmMpKQogICAgIGtpbmQgPSBCVUlMVF9JTl9NRU1DUFk7CkBA IC0xMzE4LDY5ICsxMjgzLDIyIEBAIGJ1aWxkX3JkZ19wYXJ0aXRpb25fZm9y X3ZlcnRleCAoc3RydWN0IGdyYXBoICpyZGcsIGludCB2KQogICByZXR1cm4g cGFydGl0aW9uOwogfQogCi0vKiBDbGFzc2lmaWVzIHRoZSBidWlsdGluIGtp bmQgd2UgY2FuIGdlbmVyYXRlIGZvciBQQVJUSVRJT04gb2YgUkRHIGFuZCBM T09QLgotICAgRm9yIHRoZSBtb21lbnQgd2UgZGV0ZWN0IG1lbXNldCwgbWVt Y3B5IGFuZCBtZW1tb3ZlIHBhdHRlcm5zLiAgQml0bWFwCi0gICBTVE1UX0lO X0FMTF9QQVJUSVRJT05TIGNvbnRhaW5zIHN0YXRlbWVudHMgYmVsb25naW5n IHRvIGFsbCBwYXJ0aXRpb25zLiAgKi8KKy8qIEdpdmVuIFBBUlRJVElPTiBv ZiBSREcsIHJlY29yZCBzaW5nbGUgbG9hZC9zdG9yZSBkYXRhIHJlZmVyZW5j ZXMgZm9yCisgICBidWlsdGluIHBhcnRpdGlvbiBpbiBTUkNfRFIvRFNUX0RS LCByZXR1cm4gZmFsc2UgaWYgdGhlcmUgaXMgbm8gc3VjaAorICAgZGF0YSBy ZWZlcmVuY2VzLiAgKi8KIAotc3RhdGljIHZvaWQKLWNsYXNzaWZ5X3BhcnRp dGlvbiAobG9vcF9wIGxvb3AsIHN0cnVjdCBncmFwaCAqcmRnLCBwYXJ0aXRp b24gKnBhcnRpdGlvbiwKLQkJICAgIGJpdG1hcCBzdG10X2luX2FsbF9wYXJ0 aXRpb25zKQorc3RhdGljIGJvb2wKK2ZpbmRfc2luZ2xlX2RycyAoc3RydWN0 IGdyYXBoICpyZGcsIHBhcnRpdGlvbiAqcGFydGl0aW9uLAorCQkgZGF0YV9y ZWZlcmVuY2VfcCAqZHN0X2RyLCBkYXRhX3JlZmVyZW5jZV9wICpzcmNfZHIp CiB7Ci0gIGJpdG1hcF9pdGVyYXRvciBiaTsKICAgdW5zaWduZWQgaTsKLSAg dHJlZSBuYl9pdGVyOwotICBkYXRhX3JlZmVyZW5jZV9wIHNpbmdsZV9sb2Fk LCBzaW5nbGVfc3RvcmU7Ci0gIGJvb2wgdm9sYXRpbGVzX3AgPSBmYWxzZSwg cGx1c19vbmUgPSBmYWxzZSwgaGFzX3JlZHVjdGlvbiA9IGZhbHNlOwotCi0g IHBhcnRpdGlvbi0+a2luZCA9IFBLSU5EX05PUk1BTDsKLSAgcGFydGl0aW9u LT5tYWluX2RyID0gTlVMTDsKLSAgcGFydGl0aW9uLT5zZWNvbmRhcnlfZHIg PSBOVUxMOwotICBwYXJ0aXRpb24tPm5pdGVyID0gTlVMTF9UUkVFOwotICBw YXJ0aXRpb24tPnBsdXNfb25lID0gZmFsc2U7Ci0KLSAgRVhFQ1VURV9JRl9T RVRfSU5fQklUTUFQIChwYXJ0aXRpb24tPnN0bXRzLCAwLCBpLCBiaSkKLSAg ICB7Ci0gICAgICBnaW1wbGUgKnN0bXQgPSBSREdfU1RNVCAocmRnLCBpKTsK LQotICAgICAgaWYgKGdpbXBsZV9oYXNfdm9sYXRpbGVfb3BzIChzdG10KSkK LQl2b2xhdGlsZXNfcCA9IHRydWU7Ci0KLSAgICAgIC8qIElmIHRoZSBzdG10 IGlzIG5vdCBpbmNsdWRlZCBieSBhbGwgcGFydGl0aW9ucyBhbmQgdGhlcmUg aXMgdXNlcwotCSBvdXRzaWRlIG9mIHRoZSBsb29wLCB0aGVuIG1hcmsgdGhl IHBhcnRpdGlvbiBhcyByZWR1Y3Rpb24uICAqLwotICAgICAgaWYgKHN0bXRf aGFzX3NjYWxhcl9kZXBlbmRlbmNlc19vdXRzaWRlX2xvb3AgKGxvb3AsIHN0 bXQpKQotCXsKLQkgIC8qIER1ZSB0byBsaW1pdGF0aW9uIGluIHRoZSB0cmFu c2Zvcm0gcGhhc2Ugd2UgaGF2ZSB0byBmdXNlIGFsbAotCSAgICAgcmVkdWN0 aW9uIHBhcnRpdGlvbnMuICBBcyBhIHJlc3VsdCwgdGhpcyBjb3VsZCBjYW5j ZWwgdmFsaWQKLQkgICAgIGxvb3AgZGlzdHJpYnV0aW9uIGVzcGVjaWFsbHkg Zm9yIGxvb3AgdGhhdCBpbmR1Y3Rpb24gdmFyaWFibGUKLQkgICAgIGlzIHVz ZWQgb3V0c2lkZSBvZiBsb29wLiAgVG8gd29ya2Fyb3VuZCB0aGlzIGlzc3Vl LCB3ZSBza2lwCi0JICAgICBtYXJraW5nIHBhcnRpdGlvbiBhcyByZXVkY3Rp b24gaWYgdGhlIHJlZHVjdGlvbiBzdG10IGJlbG9uZ3MKLQkgICAgIHRvIGFs bCBwYXJ0aXRpb25zLiAgSW4gc3VjaCBjYXNlLCByZWR1Y3Rpb24gd2lsbCBi ZSBjb21wdXRlZAotCSAgICAgY29ycmVjdGx5IG5vIG1hdHRlciBob3cgcGFy dGl0aW9ucyBhcmUgZnVzZWQvZGlzdHJpYnV0ZWQuICAqLwotCSAgaWYgKCFi aXRtYXBfYml0X3AgKHN0bXRfaW5fYWxsX3BhcnRpdGlvbnMsIGkpKQotCSAg ICB7Ci0JICAgICAgcGFydGl0aW9uLT5yZWR1Y3Rpb25fcCA9IHRydWU7Ci0J ICAgICAgcmV0dXJuOwotCSAgICB9Ci0JICBoYXNfcmVkdWN0aW9uID0gdHJ1 ZTsKLQl9Ci0gICAgfQotCi0gIC8qIFBlcmZvcm0gZ2VuZXJhbCBwYXJ0aXRp b24gZGlzcXVhbGlmaWNhdGlvbiBmb3IgYnVpbHRpbnMuICAqLwotICBpZiAo dm9sYXRpbGVzX3AKLSAgICAgIC8qIFNpbXBsZSB3b3JrYXJvdW5kIHRvIHBy ZXZlbnQgY2xhc3NpZnlpbmcgdGhlIHBhcnRpdGlvbiBhcyBidWlsdGluCi0J IGlmIGl0IGNvbnRhaW5zIGFueSB1c2Ugb3V0c2lkZSBvZiBsb29wLiAgKi8K LSAgICAgIHx8IGhhc19yZWR1Y3Rpb24KLSAgICAgIHx8ICFmbGFnX3RyZWVf bG9vcF9kaXN0cmlidXRlX3BhdHRlcm5zKQotICAgIHJldHVybjsKKyAgZGF0 YV9yZWZlcmVuY2VfcCBzaW5nbGVfbGQgPSBOVUxMLCBzaW5nbGVfc3QgPSBO VUxMOworICBiaXRtYXBfaXRlcmF0b3IgYmk7CiAKLSAgLyogRGV0ZWN0IG1l bXNldCBhbmQgbWVtY3B5LiAgKi8KLSAgc2luZ2xlX2xvYWQgPSBOVUxMOwot ICBzaW5nbGVfc3RvcmUgPSBOVUxMOwogICBFWEVDVVRFX0lGX1NFVF9JTl9C SVRNQVAgKHBhcnRpdGlvbi0+c3RtdHMsIDAsIGksIGJpKQogICAgIHsKICAg ICAgIGdpbXBsZSAqc3RtdCA9IFJER19TVE1UIChyZGcsIGkpOwogICAgICAg ZGF0YV9yZWZlcmVuY2VfcCBkcjsKLSAgICAgIHVuc2lnbmVkIGo7CiAKICAg ICAgIGlmIChnaW1wbGVfY29kZSAoc3RtdCkgPT0gR0lNUExFX1BISSkKIAlj b250aW51ZTsKQEAgLTEzOTEsMTIzICsxMzA5LDMxNiBAQCBjbGFzc2lmeV9w YXJ0aXRpb24gKGxvb3BfcCBsb29wLCBzdHJ1Y3QgZ3JhcGggKnJkZywgcGFy dGl0aW9uICpwYXJ0aXRpb24sCiAKICAgICAgIC8qIE90aGVyd2lzZSBqdXN0 IHJlZ3VsYXIgbG9hZHMvc3RvcmVzLiAgKi8KICAgICAgIGlmICghZ2ltcGxl X2Fzc2lnbl9zaW5nbGVfcCAoc3RtdCkpCi0JcmV0dXJuOworCXJldHVybiBm YWxzZTsKIAogICAgICAgLyogQnV0IGV4YWN0bHkgb25lIHN0b3JlIGFuZC9v ciBsb2FkLiAgKi8KLSAgICAgIGZvciAoaiA9IDA7IFJER19EQVRBUkVGUyAo cmRnLCBpKS5pdGVyYXRlIChqLCAmZHIpOyArK2opCisgICAgICBmb3IgKHVu c2lnbmVkIGogPSAwOyBSREdfREFUQVJFRlMgKHJkZywgaSkuaXRlcmF0ZSAo aiwgJmRyKTsgKytqKQogCXsKIAkgIHRyZWUgdHlwZSA9IFRSRUVfVFlQRSAo RFJfUkVGIChkcikpOwogCiAJICAvKiBUaGUgbWVtc2V0LCBtZW1jcHkgYW5k IG1lbW1vdmUgbGlicmFyeSBjYWxscyBhcmUgb25seQogCSAgICAgYWJsZSB0 byBkZWFsIHdpdGggZ2VuZXJpYyBhZGRyZXNzIHNwYWNlLiAgKi8KIAkgIGlm ICghQUREUl9TUEFDRV9HRU5FUklDX1AgKFRZUEVfQUREUl9TUEFDRSAodHlw ZSkpKQotCSAgICByZXR1cm47CisJICAgIHJldHVybiBmYWxzZTsKIAogCSAg aWYgKERSX0lTX1JFQUQgKGRyKSkKIAkgICAgewotCSAgICAgIGlmIChzaW5n bGVfbG9hZCAhPSBOVUxMKQotCQlyZXR1cm47Ci0JICAgICAgc2luZ2xlX2xv YWQgPSBkcjsKKwkgICAgICBpZiAoc2luZ2xlX2xkICE9IE5VTEwpCisJCXJl dHVybiBmYWxzZTsKKwkgICAgICBzaW5nbGVfbGQgPSBkcjsKIAkgICAgfQog CSAgZWxzZQogCSAgICB7Ci0JICAgICAgaWYgKHNpbmdsZV9zdG9yZSAhPSBO VUxMKQotCQlyZXR1cm47Ci0JICAgICAgc2luZ2xlX3N0b3JlID0gZHI7CisJ ICAgICAgaWYgKHNpbmdsZV9zdCAhPSBOVUxMKQorCQlyZXR1cm4gZmFsc2U7 CisJICAgICAgc2luZ2xlX3N0ID0gZHI7CiAJICAgIH0KIAl9CiAgICAgfQog Ci0gIGlmICghc2luZ2xlX3N0b3JlKQotICAgIHJldHVybjsKKyAgaWYgKCFz aW5nbGVfc3QpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8qIEJhaWwgb3V0 IGlmIHRoaXMgaXMgYSBiaXRmaWVsZCBtZW1vcnkgcmVmZXJlbmNlLiAgKi8K KyAgaWYgKFRSRUVfQ09ERSAoRFJfUkVGIChzaW5nbGVfc3QpKSA9PSBDT01Q T05FTlRfUkVGCisgICAgICAmJiBERUNMX0JJVF9GSUVMRCAoVFJFRV9PUEVS QU5EIChEUl9SRUYgKHNpbmdsZV9zdCksIDEpKSkKKyAgICByZXR1cm4gZmFs c2U7CiAKLSAgLyogVE9ETzogV2UgZG9uJ3Qgc3VwcG9ydCBtZW1zZXQvbWVt Y3B5IGRpc3RyaWJ1dGlvbiBmb3IgbG9vcCBuZXN0IHlldC4gICovCi0gIGlm IChsb29wLT5pbm5lcikKKyAgLyogRGF0YSByZWZlcmVuY2UgbXVzdCBiZSBl eGVjdXRlZCBleGFjdGx5IG9uY2UgcGVyIGl0ZXJhdGlvbi4gICovCisgIGJh c2ljX2Jsb2NrIGJiX3N0ID0gZ2ltcGxlX2JiIChEUl9TVE1UIChzaW5nbGVf c3QpKTsKKyAgc3RydWN0IGxvb3AgKmlubmVyID0gYmJfc3QtPmxvb3BfZmF0 aGVyOworICBpZiAoIWRvbWluYXRlZF9ieV9wIChDRElfRE9NSU5BVE9SUywg aW5uZXItPmxhdGNoLCBiYl9zdCkpCisgICAgcmV0dXJuIGZhbHNlOworCisg IGlmIChzaW5nbGVfbGQpCiAgICAgewotICAgICAgYmFzaWNfYmxvY2sgYmIg PSBnaW1wbGVfYmIgKERSX1NUTVQgKHNpbmdsZV9zdG9yZSkpOworICAgICAg Z2ltcGxlICpzdG9yZSA9IERSX1NUTVQgKHNpbmdsZV9zdCksICpsb2FkID0g RFJfU1RNVCAoc2luZ2xlX2xkKTsKKyAgICAgIC8qIERpcmVjdCBhZ2dyZWdh dGUgY29weSBvciB2aWEgYW4gU1NBIG5hbWUgdGVtcG9yYXJ5LiAgKi8KKyAg ICAgIGlmIChsb2FkICE9IHN0b3JlCisJICAmJiBnaW1wbGVfYXNzaWduX2xo cyAobG9hZCkgIT0gZ2ltcGxlX2Fzc2lnbl9yaHMxIChzdG9yZSkpCisJcmV0 dXJuIGZhbHNlOwogCi0gICAgICBpZiAoYmItPmxvb3BfZmF0aGVyICE9IGxv b3ApCi0JcmV0dXJuOworICAgICAgLyogQmFpbCBvdXQgaWYgdGhpcyBpcyBh IGJpdGZpZWxkIG1lbW9yeSByZWZlcmVuY2UuICAqLworICAgICAgaWYgKFRS RUVfQ09ERSAoRFJfUkVGIChzaW5nbGVfbGQpKSA9PSBDT01QT05FTlRfUkVG CisJICAmJiBERUNMX0JJVF9GSUVMRCAoVFJFRV9PUEVSQU5EIChEUl9SRUYg KHNpbmdsZV9sZCksIDEpKSkKKwlyZXR1cm4gZmFsc2U7CisKKyAgICAgIC8q IExvYWQgYW5kIHN0b3JlIG11c3QgYmUgaW4gdGhlIHNhbWUgbG9vcCBuZXN0 LiAgKi8KKyAgICAgIGJhc2ljX2Jsb2NrIGJiX2xkID0gZ2ltcGxlX2JiIChE Ul9TVE1UIChzaW5nbGVfbGQpKTsKKyAgICAgIGlmIChpbm5lciAhPSBiYl9s ZC0+bG9vcF9mYXRoZXIpCisJcmV0dXJuIGZhbHNlOworCisgICAgICAvKiBE YXRhIHJlZmVyZW5jZSBtdXN0IGJlIGV4ZWN1dGVkIGV4YWN0bHkgb25jZSBw ZXIgaXRlcmF0aW9uLiAgKi8KKyAgICAgIGlmICghZG9taW5hdGVkX2J5X3Ag KENESV9ET01JTkFUT1JTLCBpbm5lci0+bGF0Y2gsIGJiX2xkKSkKKwlyZXR1 cm4gZmFsc2U7CiAKLSAgICAgIGlmIChzaW5nbGVfbG9hZCkKKyAgICAgIGVk Z2UgZSA9IHNpbmdsZV9leGl0IChpbm5lcik7CisgICAgICBib29sIGRvbV9s ZCA9IGRvbWluYXRlZF9ieV9wIChDRElfRE9NSU5BVE9SUywgZS0+c3JjLCBi Yl9sZCk7CisgICAgICBib29sIGRvbV9zdCA9IGRvbWluYXRlZF9ieV9wIChD RElfRE9NSU5BVE9SUywgZS0+c3JjLCBiYl9zdCk7CisgICAgICBpZiAoZG9t X2xkICE9IGRvbV9zdCkKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorCisgICpz cmNfZHIgPSBzaW5nbGVfbGQ7CisgICpkc3RfZHIgPSBzaW5nbGVfc3Q7Cisg IHJldHVybiB0cnVlOworfQorCisvKiBHaXZlbiBkYXRhIHJlZmVyZW5jZSBE UiBpbiBMT09QX05FU1QsIHRoaXMgZnVuY3Rpb24gY2hlY2tzIHRoZSBlbmNs b3NpbmcKKyAgIGxvb3BzIGZyb20gaW5uZXIgdG8gb3V0ZXIgdG8gc2VlIGlm IGxvb3AncyBzdGVwIGVxdWFscyB0byBhY2Nlc3Mgc2l6ZSBhdAorICAgZWFj aCBsZXZlbCBvZiBsb29wLiAgUmV0dXJuIHRydWUgaWYgeWVzOyByZWNvcmQg YWNjZXNzIGJhc2UgYW5kIHNpemUgaW4KKyAgIEJBU0UgYW5kIFNJWkU7IHNh dmUgbG9vcCdzIHN0ZXAgYXQgZWFjaCBsZXZlbCBvZiBsb29wIGluIFNURVBT IGlmIGl0IGlzCisgICBub3QgbnVsbC4gIEZvciBleGFtcGxlOgorCisgICAg IGludCBhcnJbMTAwXVsxMDBdWzEwMF07CisgICAgIGZvciAoaSA9IDA7IGkg PCAxMDA7IGkrKykgICAgICAgO3N0ZXBzWzJdID0gNDAwMDAKKyAgICAgICBm b3IgKGogPSAxMDA7IGogPiAwOyBqLS0pICAgICA7c3RlcHNbMV0gPSAtNDAw CisJIGZvciAoayA9IDA7IGsgPCAxMDA7IGsrKykgICA7c3RlcHNbMF0gPSA0 CisJICAgYXJyW2ldW2ogLSAxXVtrXSA9IDA7ICAgICA7YmFzZSA9ICZhcnIs IHNpemUgPSA0MDAwMDAwLiAgKi8KKworc3RhdGljIGJvb2wKK2NvbXB1dGVf YWNjZXNzX3JhbmdlIChsb29wX3AgbG9vcF9uZXN0LCBkYXRhX3JlZmVyZW5j ZV9wIGRyLCB0cmVlICpiYXNlLAorCQkgICAgICB0cmVlICpzaXplLCB2ZWM8 dHJlZT4gKnN0ZXBzID0gTlVMTCkKK3sKKyAgbG9jYXRpb25fdCBsb2MgPSBn aW1wbGVfbG9jYXRpb24gKERSX1NUTVQgKGRyKSk7CisgIGJhc2ljX2Jsb2Nr IGJiID0gZ2ltcGxlX2JiIChEUl9TVE1UIChkcikpOworICBzdHJ1Y3QgbG9v cCAqbG9vcCA9IGJiLT5sb29wX2ZhdGhlcjsKKyAgdHJlZSByZWYgPSBEUl9S RUYgKGRyKTsKKyAgdHJlZSBhY2Nlc3NfYmFzZSA9IGJ1aWxkX2ZvbGRfYWRk cl9leHByIChyZWYpOworICB0cmVlIGFjY2Vzc19zaXplID0gVFlQRV9TSVpF X1VOSVQgKFRSRUVfVFlQRSAocmVmKSk7CisKKyAgZG8geworICAgICAgdHJl ZSBzY2V2X2ZuID0gYW5hbHl6ZV9zY2FsYXJfZXZvbHV0aW9uIChsb29wLCBh Y2Nlc3NfYmFzZSk7CisgICAgICBpZiAoVFJFRV9DT0RFIChzY2V2X2ZuKSAh PSBQT0xZTk9NSUFMX0NIUkVDKQorCXJldHVybiBmYWxzZTsKKworICAgICAg YWNjZXNzX2Jhc2UgPSBDSFJFQ19MRUZUIChzY2V2X2ZuKTsKKyAgICAgIGlm ICh0cmVlX2NvbnRhaW5zX2NocmVjcyAoYWNjZXNzX2Jhc2UsIE5VTEwpKQor CXJldHVybiBmYWxzZTsKKworICAgICAgdHJlZSBzY2V2X3N0ZXAgPSBDSFJF Q19SSUdIVCAoc2Nldl9mbik7CisgICAgICAvKiBPbmx5IHN1cHBvcnQgY29u c3RhbnQgc3RlcHMuICAqLworICAgICAgaWYgKFRSRUVfQ09ERSAoc2Nldl9z dGVwKSAhPSBJTlRFR0VSX0NTVCkKKwlyZXR1cm4gZmFsc2U7CisKKyAgICAg IGVudW0gZXZfZGlyZWN0aW9uIGFjY2Vzc19kaXIgPSBzY2V2X2RpcmVjdGlv biAoc2Nldl9mbik7CisgICAgICBpZiAoYWNjZXNzX2RpciA9PSBFVl9ESVJf VU5LTk9XTikKKwlyZXR1cm4gZmFsc2U7CisKKyAgICAgIGlmIChzdGVwcyAh PSBOVUxMKQorCXN0ZXBzLT5zYWZlX3B1c2ggKHNjZXZfc3RlcCk7CisKKyAg ICAgIHNjZXZfc3RlcCA9IGZvbGRfY29udmVydF9sb2MgKGxvYywgc2l6ZXR5 cGUsIHNjZXZfc3RlcCk7CisgICAgICAvKiBDb21wdXRlIGFic29sdXRlIHZh bHVlIG9mIHNjZXYgc3RlcC4gICovCisgICAgICBpZiAoYWNjZXNzX2RpciA9 PSBFVl9ESVJfREVDUkVBU0VTKQorCXNjZXZfc3RlcCA9IGZvbGRfYnVpbGQx X2xvYyAobG9jLCBORUdBVEVfRVhQUiwgc2l6ZXR5cGUsIHNjZXZfc3RlcCk7 CisKKyAgICAgIC8qIEF0IGVhY2ggbGV2ZWwgb2YgbG9vcCwgc2NldiBzdGVw IG11c3QgZXF1YWwgdG8gYWNjZXNzIHNpemUuICBJbiBvdGhlcgorCSB3b3Jk cywgRFIgbXVzdCBhY2Nlc3MgY29uc2VjdXRpdmUgbWVtb3J5IGJldHdlZW4g bG9vcCBpdGVyYXRpb25zLiAgKi8KKyAgICAgIGlmICghb3BlcmFuZF9lcXVh bF9wIChzY2V2X3N0ZXAsIGFjY2Vzc19zaXplLCAwKSkKKwlyZXR1cm4gZmFs c2U7CisKKyAgICAgIC8qIENvbXB1dGUgRFIncyBleGVjdXRpb24gdGltZXMg aW4gbG9vcC4gICovCisgICAgICB0cmVlIG5pdGVycyA9IG51bWJlcl9vZl9s YXRjaF9leGVjdXRpb25zIChsb29wKTsKKyAgICAgIG5pdGVycyA9IGZvbGRf Y29udmVydF9sb2MgKGxvYywgc2l6ZXR5cGUsIG5pdGVycyk7CisgICAgICBp ZiAoZG9taW5hdGVkX2J5X3AgKENESV9ET01JTkFUT1JTLCBzaW5nbGVfZXhp dCAobG9vcCktPnNyYywgYmIpKQorCW5pdGVycyA9IHNpemVfYmlub3BfbG9j IChsb2MsIFBMVVNfRVhQUiwgbml0ZXJzLCBzaXplX29uZV9ub2RlKTsKKwor ICAgICAgLyogQ29tcHV0ZSBEUidzIG92ZXJhbGwgYWNjZXNzIHNpemUgaW4g bG9vcC4gICovCisgICAgICBhY2Nlc3Nfc2l6ZSA9IGZvbGRfYnVpbGQyX2xv YyAobG9jLCBNVUxUX0VYUFIsIHNpemV0eXBlLAorCQkJCSAgICAgbml0ZXJz LCBzY2V2X3N0ZXApOworICAgICAgLyogQWRqdXN0IGJhc2UgYWRkcmVzcyBp biBjYXNlIG9mIG5lZ2F0aXZlIHN0ZXAuICAqLworICAgICAgaWYgKGFjY2Vz c19kaXIgPT0gRVZfRElSX0RFQ1JFQVNFUykKIAl7Ci0JICBiYiA9IGdpbXBs ZV9iYiAoRFJfU1RNVCAoc2luZ2xlX2xvYWQpKTsKLQkgIGlmIChiYi0+bG9v cF9mYXRoZXIgIT0gbG9vcCkKLQkgICAgcmV0dXJuOworCSAgdHJlZSBhZGog PSBmb2xkX2J1aWxkMl9sb2MgKGxvYywgTUlOVVNfRVhQUiwgc2l6ZXR5cGUs CisJCQkJICAgICAgc2Nldl9zdGVwLCBhY2Nlc3Nfc2l6ZSk7CisJICBhY2Nl c3NfYmFzZSA9IGZvbGRfYnVpbGRfcG9pbnRlcl9wbHVzX2xvYyAobG9jLCBh Y2Nlc3NfYmFzZSwgYWRqKTsKIAl9CisgIH0gd2hpbGUgKGxvb3AgIT0gbG9v cF9uZXN0ICYmIChsb29wID0gbG9vcF9vdXRlciAobG9vcCkpICE9IE5VTEwp OworCisgICpiYXNlID0gYWNjZXNzX2Jhc2U7CisgICpzaXplID0gYWNjZXNz X3NpemU7CisgIHJldHVybiB0cnVlOworfQorCisvKiBBbGxvY2F0ZSBhbmQg cmV0dXJuIGJ1aWx0aW4gc3RydWN0LiAgUmVjb3JkIGluZm9ybWF0aW9uIGxp a2UgRFNUX0RSLAorICAgU1JDX0RSLCBEU1RfQkFTRSwgU1JDX0JBU0UgYW5k IFNJWkUgaW4gdGhlIGFsbG9jYXRlZCBzdHJ1Y3QuICAqLworCitzdGF0aWMg c3RydWN0IGJ1aWx0aW5faW5mbyAqCithbGxvY19idWlsdGluIChkYXRhX3Jl ZmVyZW5jZV9wIGRzdF9kciwgZGF0YV9yZWZlcmVuY2VfcCBzcmNfZHIsCisJ ICAgICAgIHRyZWUgZHN0X2Jhc2UsIHRyZWUgc3JjX2Jhc2UsIHRyZWUgc2l6 ZSkKK3sKKyAgc3RydWN0IGJ1aWx0aW5faW5mbyAqYnVpbHRpbiA9IFhORVcg KHN0cnVjdCBidWlsdGluX2luZm8pOworICBidWlsdGluLT5kc3RfZHIgPSBk c3RfZHI7CisgIGJ1aWx0aW4tPnNyY19kciA9IHNyY19kcjsKKyAgYnVpbHRp bi0+ZHN0X2Jhc2UgPSBkc3RfYmFzZTsKKyAgYnVpbHRpbi0+c3JjX2Jhc2Ug PSBzcmNfYmFzZTsKKyAgYnVpbHRpbi0+c2l6ZSA9IHNpemU7CisgIHJldHVy biBidWlsdGluOworfQorCisvKiBHaXZlbiBkYXRhIHJlZmVyZW5jZSBEUiBp biBsb29wIG5lc3QgTE9PUCwgY2xhc3NpZnkgaWYgaXQgZm9ybXMgYnVpbHRp bgorICAgbWVtc2V0IGNhbGwuICAqLworCitzdGF0aWMgdm9pZAorY2xhc3Np ZnlfYnVpbHRpbl9zdCAobG9vcF9wIGxvb3AsIHBhcnRpdGlvbiAqcGFydGl0 aW9uLCBkYXRhX3JlZmVyZW5jZV9wIGRyKQoreworICBnaW1wbGUgKnN0bXQg PSBEUl9TVE1UIChkcik7CisgIHRyZWUgYmFzZSwgc2l6ZSwgcmhzID0gZ2lt cGxlX2Fzc2lnbl9yaHMxIChzdG10KTsKKworICBpZiAoY29uc3Rfd2l0aF9h bGxfYnl0ZXNfc2FtZSAocmhzKSA9PSAtMQorICAgICAgJiYgKCFJTlRFR1JB TF9UWVBFX1AgKFRSRUVfVFlQRSAocmhzKSkKKwkgIHx8IChUWVBFX01PREUg KFRSRUVfVFlQRSAocmhzKSkKKwkgICAgICAhPSBUWVBFX01PREUgKHVuc2ln bmVkX2NoYXJfdHlwZV9ub2RlKSkpKQorICAgIHJldHVybjsKKworICBpZiAo VFJFRV9DT0RFIChyaHMpID09IFNTQV9OQU1FCisgICAgICAmJiAhU1NBX05B TUVfSVNfREVGQVVMVF9ERUYgKHJocykKKyAgICAgICYmIGZsb3dfYmJfaW5z aWRlX2xvb3BfcCAobG9vcCwgZ2ltcGxlX2JiIChTU0FfTkFNRV9ERUZfU1RN VCAocmhzKSkpKQorICAgIHJldHVybjsKKworICBpZiAoIWNvbXB1dGVfYWNj ZXNzX3JhbmdlIChsb29wLCBkciwgJmJhc2UsICZzaXplKSkKKyAgICByZXR1 cm47CisKKyAgcGFydGl0aW9uLT5idWlsdGluID0gYWxsb2NfYnVpbHRpbiAo ZHIsIE5VTEwsIGJhc2UsIE5VTExfVFJFRSwgc2l6ZSk7CisgIHBhcnRpdGlv bi0+a2luZCA9IFBLSU5EX01FTVNFVDsKK30KKworLyogR2l2ZW4gZGF0YSBy ZWZlcmVuY2VzIERTVF9EUiBhbmQgU1JDX0RSIGluIGxvb3AgbmVzdCBMT09Q IGFuZCBSREcsIGNsYXNzaWZ5CisgICBpZiBpdCBmb3JtcyBidWlsdGluIG1l bWNweSBvciBtZW1tb3ZlIGNhbGwuICAqLworCitzdGF0aWMgdm9pZAorY2xh c3NpZnlfYnVpbHRpbl9sZHN0IChsb29wX3AgbG9vcCwgc3RydWN0IGdyYXBo ICpyZGcsIHBhcnRpdGlvbiAqcGFydGl0aW9uLAorCQkgICAgICAgZGF0YV9y ZWZlcmVuY2VfcCBkc3RfZHIsIGRhdGFfcmVmZXJlbmNlX3Agc3JjX2RyKQor eworICB0cmVlIGJhc2UsIHNpemUsIHNyY19iYXNlLCBzcmNfc2l6ZTsKKyAg YXV0b192ZWM8dHJlZT4gZHN0X3N0ZXBzLCBzcmNfc3RlcHM7CisKKyAgLyog Q29tcHV0ZSBhY2Nlc3MgcmFuZ2Ugb2YgYm90aCBsb2FkIGFuZCBzdG9yZS4g IFRoZXkgbXVjaCBoYXZlIHRoZSBzYW1lCisgICAgIGFjY2VzcyBzaXplLiAg Ki8KKyAgaWYgKCFjb21wdXRlX2FjY2Vzc19yYW5nZSAobG9vcCwgZHN0X2Ry LCAmYmFzZSwgJnNpemUsICZkc3Rfc3RlcHMpCisgICAgICB8fCAhY29tcHV0 ZV9hY2Nlc3NfcmFuZ2UgKGxvb3AsIHNyY19kciwgJnNyY19iYXNlLCAmc3Jj X3NpemUsICZzcmNfc3RlcHMpCisgICAgICB8fCAhb3BlcmFuZF9lcXVhbF9w IChzaXplLCBzcmNfc2l6ZSwgMCkpCisgICAgcmV0dXJuOworCisgIC8qIExv YWQgYW5kIHN0b3JlIGluIGxvb3AgbmVzdCBtdXN0IGFjY2VzcyBtZW1vcnkg aW4gdGhlIHNhbWUgd2F5LCBpLmUsCisgICAgIHRoZWlyIG11c3QgaGF2ZSB0 aGUgc2FtZSBzdGVwcyBpbiBlYWNoIGxvb3Agb2YgdGhlIG5lc3QuICAqLwor ICBpZiAoZHN0X3N0ZXBzLmxlbmd0aCAoKSAhPSBzcmNfc3RlcHMubGVuZ3Ro ICgpKQorICAgIHJldHVybjsKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8 IGRzdF9zdGVwcy5sZW5ndGggKCk7ICsraSkKKyAgICBpZiAoIW9wZXJhbmRf ZXF1YWxfcCAoZHN0X3N0ZXBzW2ldLCBzcmNfc3RlcHNbaV0sIDApKQorICAg ICAgcmV0dXJuOworCisgIC8qIE5vdyBjaGVjayB0aGF0IGlmIHRoZXJlIGlz IGEgZGVwZW5kZW5jZS4gICovCisgIGRkcl9wIGRkciA9IGdldF9kYXRhX2Rl cGVuZGVuY2UgKHJkZywgc3JjX2RyLCBkc3RfZHIpOworCisgIC8qIENsYXNz aWZ5IGFzIG1lbWNweSBpZiBubyBkZXBlbmRlbmNlIGJldHdlZW4gbG9hZCBh bmQgc3RvcmUuICAqLworICBpZiAoRERSX0FSRV9ERVBFTkRFTlQgKGRkcikg PT0gY2hyZWNfa25vd24pCisgICAgeworICAgICAgcGFydGl0aW9uLT5idWls dGluID0gYWxsb2NfYnVpbHRpbiAoZHN0X2RyLCBzcmNfZHIsIGJhc2UsIHNy Y19iYXNlLCBzaXplKTsKKyAgICAgIHBhcnRpdGlvbi0+a2luZCA9IFBLSU5E X01FTUNQWTsKKyAgICAgIHJldHVybjsKICAgICB9CiAKLSAgbmJfaXRlciA9 IG51bWJlcl9vZl9sYXRjaF9leGVjdXRpb25zIChsb29wKTsKLSAgZ2NjX2Fz c2VydCAobmJfaXRlciAmJiBuYl9pdGVyICE9IGNocmVjX2RvbnRfa25vdyk7 Ci0gIGlmIChkb21pbmF0ZWRfYnlfcCAoQ0RJX0RPTUlOQVRPUlMsIHNpbmds ZV9leGl0IChsb29wKS0+c3JjLAotCQkgICAgICBnaW1wbGVfYmIgKERSX1NU TVQgKHNpbmdsZV9zdG9yZSkpKSkKLSAgICBwbHVzX29uZSA9IHRydWU7Cisg IC8qIENhbid0IGRvIG1lbW1vdmUgaW4gY2FzZSBvZiB1bmtub3duIGRlcGVu ZGVuY2Ugb3IgZGVwZW5kZW5jZSB3aXRob3V0CisgICAgIGNsYXNzaWNhbCBk aXN0YW5jZSB2ZWN0b3IuICAqLworICBpZiAoRERSX0FSRV9ERVBFTkRFTlQg KGRkcikgPT0gY2hyZWNfZG9udF9rbm93CisgICAgICB8fCBERFJfTlVNX0RJ U1RfVkVDVFMgKGRkcikgPT0gMCkKKyAgICByZXR1cm47CiAKLSAgaWYgKHNp bmdsZV9zdG9yZSAmJiAhc2luZ2xlX2xvYWQpCisgIHVuc2lnbmVkIGk7Cisg IGxhbWJkYV92ZWN0b3IgZGlzdF92OworICBpbnQgbnVtX2xldiA9IChERFJf TE9PUF9ORVNUIChkZHIpKS5sZW5ndGggKCk7CisgIEZPUl9FQUNIX1ZFQ19F TFQgKEREUl9ESVNUX1ZFQ1RTIChkZHIpLCBpLCBkaXN0X3YpCiAgICAgewot ICAgICAgZ2ltcGxlICpzdG10ID0gRFJfU1RNVCAoc2luZ2xlX3N0b3JlKTsK LSAgICAgIHRyZWUgcmhzID0gZ2ltcGxlX2Fzc2lnbl9yaHMxIChzdG10KTsK LSAgICAgIGlmIChjb25zdF93aXRoX2FsbF9ieXRlc19zYW1lIChyaHMpID09 IC0xCi0JICAmJiAoIUlOVEVHUkFMX1RZUEVfUCAoVFJFRV9UWVBFIChyaHMp KQotCSAgICAgIHx8IChUWVBFX01PREUgKFRSRUVfVFlQRSAocmhzKSkKLQkJ ICAhPSBUWVBFX01PREUgKHVuc2lnbmVkX2NoYXJfdHlwZV9ub2RlKSkpKQor ICAgICAgdW5zaWduZWQgZGVwX2xldiA9IGRlcGVuZGVuY2VfbGV2ZWwgKGRp c3RfdiwgbnVtX2xldik7CisgICAgICAvKiBDYW4ndCBkbyBtZW1tb3ZlIGlm IGxvYWQgZGVwZW5kcyBvbiBzdG9yZS4gICovCisgICAgICBpZiAoZGVwX2xl diA+IDAgJiYgZGlzdF92W2RlcF9sZXYgLSAxXSA+IDAgJiYgIUREUl9SRVZF UlNFRF9QIChkZHIpKQogCXJldHVybjsKLSAgICAgIGlmIChUUkVFX0NPREUg KHJocykgPT0gU1NBX05BTUUKLQkgICYmICFTU0FfTkFNRV9JU19ERUZBVUxU X0RFRiAocmhzKQotCSAgJiYgZmxvd19iYl9pbnNpZGVfbG9vcF9wIChsb29w LCBnaW1wbGVfYmIgKFNTQV9OQU1FX0RFRl9TVE1UIChyaHMpKSkpCi0JcmV0 dXJuOwotICAgICAgaWYgKCFhZGphY2VudF9kcl9wIChzaW5nbGVfc3RvcmUp Ci0JICB8fCAhZG9taW5hdGVkX2J5X3AgKENESV9ET01JTkFUT1JTLAotCQkJ ICAgICAgbG9vcC0+bGF0Y2gsIGdpbXBsZV9iYiAoc3RtdCkpKQotCXJldHVy bjsKLSAgICAgIHBhcnRpdGlvbi0+a2luZCA9IFBLSU5EX01FTVNFVDsKLSAg ICAgIHBhcnRpdGlvbi0+bWFpbl9kciA9IHNpbmdsZV9zdG9yZTsKLSAgICAg IHBhcnRpdGlvbi0+bml0ZXIgPSBuYl9pdGVyOwotICAgICAgcGFydGl0aW9u LT5wbHVzX29uZSA9IHBsdXNfb25lOwogICAgIH0KLSAgZWxzZSBpZiAoc2lu Z2xlX3N0b3JlICYmIHNpbmdsZV9sb2FkKQorCisgIHBhcnRpdGlvbi0+YnVp bHRpbiA9IGFsbG9jX2J1aWx0aW4gKGRzdF9kciwgc3JjX2RyLCBiYXNlLCBz cmNfYmFzZSwgc2l6ZSk7CisgIHBhcnRpdGlvbi0+a2luZCA9IFBLSU5EX01F TU1PVkU7CisgIHJldHVybjsKK30KKworLyogQ2xhc3NpZmllcyB0aGUgYnVp bHRpbiBraW5kIHdlIGNhbiBnZW5lcmF0ZSBmb3IgUEFSVElUSU9OIG9mIFJE RyBhbmQgTE9PUC4KKyAgIEZvciB0aGUgbW9tZW50IHdlIGRldGVjdCBtZW1z ZXQsIG1lbWNweSBhbmQgbWVtbW92ZSBwYXR0ZXJucy4gIEJpdG1hcAorICAg U1RNVF9JTl9BTExfUEFSVElUSU9OUyBjb250YWlucyBzdGF0ZW1lbnRzIGJl bG9uZ2luZyB0byBhbGwgcGFydGl0aW9ucy4gICovCisKK3N0YXRpYyB2b2lk CitjbGFzc2lmeV9wYXJ0aXRpb24gKGxvb3BfcCBsb29wLCBzdHJ1Y3QgZ3Jh cGggKnJkZywgcGFydGl0aW9uICpwYXJ0aXRpb24sCisJCSAgICBiaXRtYXAg c3RtdF9pbl9hbGxfcGFydGl0aW9ucykKK3sKKyAgYml0bWFwX2l0ZXJhdG9y IGJpOworICB1bnNpZ25lZCBpOworICBkYXRhX3JlZmVyZW5jZV9wIHNpbmds ZV9sZCA9IE5VTEwsIHNpbmdsZV9zdCA9IE5VTEw7CisgIGJvb2wgdm9sYXRp bGVzX3AgPSBmYWxzZSwgaGFzX3JlZHVjdGlvbiA9IGZhbHNlOworCisgIEVY RUNVVEVfSUZfU0VUX0lOX0JJVE1BUCAocGFydGl0aW9uLT5zdG10cywgMCwg aSwgYmkpCiAgICAgewotICAgICAgZ2ltcGxlICpzdG9yZSA9IERSX1NUTVQg KHNpbmdsZV9zdG9yZSk7Ci0gICAgICBnaW1wbGUgKmxvYWQgPSBEUl9TVE1U IChzaW5nbGVfbG9hZCk7Ci0gICAgICAvKiBEaXJlY3QgYWdncmVnYXRlIGNv cHkgb3IgdmlhIGFuIFNTQSBuYW1lIHRlbXBvcmFyeS4gICovCi0gICAgICBp ZiAobG9hZCAhPSBzdG9yZQotCSAgJiYgZ2ltcGxlX2Fzc2lnbl9saHMgKGxv YWQpICE9IGdpbXBsZV9hc3NpZ25fcmhzMSAoc3RvcmUpKQotCXJldHVybjsK LSAgICAgIGlmICghYWRqYWNlbnRfZHJfcCAoc2luZ2xlX3N0b3JlKQotCSAg fHwgIWFkamFjZW50X2RyX3AgKHNpbmdsZV9sb2FkKQotCSAgfHwgIW9wZXJh bmRfZXF1YWxfcCAoRFJfU1RFUCAoc2luZ2xlX3N0b3JlKSwKLQkJCSAgICAg ICBEUl9TVEVQIChzaW5nbGVfbG9hZCksIDApCi0JICB8fCAhZG9taW5hdGVk X2J5X3AgKENESV9ET01JTkFUT1JTLAotCQkJICAgICAgbG9vcC0+bGF0Y2gs IGdpbXBsZV9iYiAoc3RvcmUpKSkKLQlyZXR1cm47Ci0gICAgICAvKiBOb3cg Y2hlY2sgdGhhdCBpZiB0aGVyZSBpcyBhIGRlcGVuZGVuY2UgdGhpcyBkZXBl bmRlbmNlIGlzCi0gICAgICAgICBvZiBhIHN1aXRhYmxlIGZvcm0gZm9yIG1l bW1vdmUuICAqLwotICAgICAgZGRyX3AgZGRyID0gZ2V0X2RhdGFfZGVwZW5k ZW5jZSAocmRnLCBzaW5nbGVfbG9hZCwgc2luZ2xlX3N0b3JlKTsKLSAgICAg IGlmIChERFJfQVJFX0RFUEVOREVOVCAoZGRyKSA9PSBjaHJlY19kb250X2tu b3cpCi0JcmV0dXJuOworICAgICAgZ2ltcGxlICpzdG10ID0gUkRHX1NUTVQg KHJkZywgaSk7CiAKLSAgICAgIGlmIChERFJfQVJFX0RFUEVOREVOVCAoZGRy KSAhPSBjaHJlY19rbm93bikKLQl7Ci0JICBpZiAoRERSX05VTV9ESVNUX1ZF Q1RTIChkZHIpID09IDApCi0JICAgIHJldHVybjsKKyAgICAgIGlmIChnaW1w bGVfaGFzX3ZvbGF0aWxlX29wcyAoc3RtdCkpCisJdm9sYXRpbGVzX3AgPSB0 cnVlOwogCi0JICBsYW1iZGFfdmVjdG9yIGRpc3RfdjsKLQkgIEZPUl9FQUNI X1ZFQ19FTFQgKEREUl9ESVNUX1ZFQ1RTIChkZHIpLCBpLCBkaXN0X3YpCisg ICAgICAvKiBJZiB0aGUgc3RtdCBpcyBub3QgaW5jbHVkZWQgYnkgYWxsIHBh cnRpdGlvbnMgYW5kIHRoZXJlIGlzIHVzZXMKKwkgb3V0c2lkZSBvZiB0aGUg bG9vcCwgdGhlbiBtYXJrIHRoZSBwYXJ0aXRpb24gYXMgcmVkdWN0aW9uLiAg Ki8KKyAgICAgIGlmIChzdG10X2hhc19zY2FsYXJfZGVwZW5kZW5jZXNfb3V0 c2lkZV9sb29wIChsb29wLCBzdG10KSkKKwl7CisJICAvKiBEdWUgdG8gbGlt aXRhdGlvbiBpbiB0aGUgdHJhbnNmb3JtIHBoYXNlIHdlIGhhdmUgdG8gZnVz ZSBhbGwKKwkgICAgIHJlZHVjdGlvbiBwYXJ0aXRpb25zLiAgQXMgYSByZXN1 bHQsIHRoaXMgY291bGQgY2FuY2VsIHZhbGlkCisJICAgICBsb29wIGRpc3Ry aWJ1dGlvbiBlc3BlY2lhbGx5IGZvciBsb29wIHRoYXQgaW5kdWN0aW9uIHZh cmlhYmxlCisJICAgICBpcyB1c2VkIG91dHNpZGUgb2YgbG9vcC4gIFRvIHdv cmthcm91bmQgdGhpcyBpc3N1ZSwgd2Ugc2tpcAorCSAgICAgbWFya2luZyBw YXJ0aXRpb24gYXMgcmV1ZGN0aW9uIGlmIHRoZSByZWR1Y3Rpb24gc3RtdCBi ZWxvbmdzCisJICAgICB0byBhbGwgcGFydGl0aW9ucy4gIEluIHN1Y2ggY2Fz ZSwgcmVkdWN0aW9uIHdpbGwgYmUgY29tcHV0ZWQKKwkgICAgIGNvcnJlY3Rs eSBubyBtYXR0ZXIgaG93IHBhcnRpdGlvbnMgYXJlIGZ1c2VkL2Rpc3RyaWJ1 dGVkLiAgKi8KKwkgIGlmICghYml0bWFwX2JpdF9wIChzdG10X2luX2FsbF9w YXJ0aXRpb25zLCBpKSkKIAkgICAgewotCSAgICAgIGludCBkaXN0ID0gZGlz dF92W2luZGV4X2luX2xvb3BfbmVzdCAobG9vcC0+bnVtLAotCQkJCQkJICAg IEREUl9MT09QX05FU1QgKGRkcikpXTsKLQkgICAgICBpZiAoZGlzdCA+IDAg JiYgIUREUl9SRVZFUlNFRF9QIChkZHIpKQotCQlyZXR1cm47CisJICAgICAg cGFydGl0aW9uLT5yZWR1Y3Rpb25fcCA9IHRydWU7CisJICAgICAgcmV0dXJu OwogCSAgICB9Ci0JICBwYXJ0aXRpb24tPmtpbmQgPSBQS0lORF9NRU1NT1ZF OworCSAgaGFzX3JlZHVjdGlvbiA9IHRydWU7CiAJfQotICAgICAgZWxzZQot CXBhcnRpdGlvbi0+a2luZCA9IFBLSU5EX01FTUNQWTsKLSAgICAgIHBhcnRp dGlvbi0+bWFpbl9kciA9IHNpbmdsZV9zdG9yZTsKLSAgICAgIHBhcnRpdGlv bi0+c2Vjb25kYXJ5X2RyID0gc2luZ2xlX2xvYWQ7Ci0gICAgICBwYXJ0aXRp b24tPm5pdGVyID0gbmJfaXRlcjsKLSAgICAgIHBhcnRpdGlvbi0+cGx1c19v bmUgPSBwbHVzX29uZTsKICAgICB9CisKKyAgLyogUGVyZm9ybSBnZW5lcmFs IHBhcnRpdGlvbiBkaXNxdWFsaWZpY2F0aW9uIGZvciBidWlsdGlucy4gICov CisgIGlmICh2b2xhdGlsZXNfcAorICAgICAgLyogU2ltcGxlIHdvcmthcm91 bmQgdG8gcHJldmVudCBjbGFzc2lmeWluZyB0aGUgcGFydGl0aW9uIGFzIGJ1 aWx0aW4KKwkgaWYgaXQgY29udGFpbnMgYW55IHVzZSBvdXRzaWRlIG9mIGxv b3AuICAqLworICAgICAgfHwgaGFzX3JlZHVjdGlvbgorICAgICAgfHwgIWZs YWdfdHJlZV9sb29wX2Rpc3RyaWJ1dGVfcGF0dGVybnMpCisgICAgcmV0dXJu OworCisgIC8qIEZpbmQgc2luZ2xlIGxvYWQvc3RvcmUgZGF0YSByZWZlcmVu Y2VzIGZvciBidWlsdGluIHBhcnRpdGlvbi4gICovCisgIGlmICghZmluZF9z aW5nbGVfZHJzIChyZGcsIHBhcnRpdGlvbiwgJnNpbmdsZV9zdCwgJnNpbmds ZV9sZCkpCisgICAgcmV0dXJuOworCisgIC8qIENsYXNzaWZ5IHRoZSBidWls dGluIGtpbmQuICAqLworICBpZiAoc2luZ2xlX2xkID09IE5VTEwpCisgICAg Y2xhc3NpZnlfYnVpbHRpbl9zdCAobG9vcCwgcGFydGl0aW9uLCBzaW5nbGVf c3QpOworICBlbHNlCisgICAgY2xhc3NpZnlfYnVpbHRpbl9sZHN0IChsb29w LCByZGcsIHBhcnRpdGlvbiwgc2luZ2xlX3N0LCBzaW5nbGVfbGQpOwogfQog CiAvKiBSZXR1cm5zIHRydWUgd2hlbiBQQVJUSVRJT04xIGFuZCBQQVJUSVRJ T04yIGFjY2VzcyB0aGUgc2FtZSBtZW1vcnkKLS0gCjEuOS4xCgo= --f403043cd1700c8c86055b5a2414--