From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 107428 invoked by alias); 20 Jun 2017 09:22:54 -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 106540 invoked by uid 89); 20 Jun 2017 09:22:52 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-24.8 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,SPF_PASS autolearn=ham version=3.3.2 spammy= X-HELO: mail-ua0-f179.google.com Received: from mail-ua0-f179.google.com (HELO mail-ua0-f179.google.com) (209.85.217.179) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Tue, 20 Jun 2017 09:22:47 +0000 Received: by mail-ua0-f179.google.com with SMTP id j53so61521438uaa.2 for ; Tue, 20 Jun 2017 02:22:47 -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; bh=3qOUkcvZb6WtrQUzzZpdhYzaZ36ly2P5UZtS+rBgpZA=; b=lkpBG1UG/szgi37BpDvWYPttug784eddkQP5o9ZhURwYJDA2cLghiBdoRwPstLMMBA 5B7NXx4tISfWsSawd7b/3bGEzgTnvKNMOw66U4Gcih0WcBKWbRNaDXboVADX1JlRPSW8 SaFTQX6EsNsNIE9bJPZUGke2V3ZwHVKeBf0nPA2C2/CeA/CYFO8miquB4WLtbn5PsA7s 4dcgWOWISQYKaFsCiVX+Q/Hc75VM7YzrnNYpCpTTZ1Y9LWTPsiajLkY3YUFrAFSXLolp rkGs9XtZv6eXTadhAqQP8nA2SU9xpnBrP8NYDeJ/9K7sHxs8dRHtNfiXsfotAH0+o0z8 5fgw== X-Gm-Message-State: AKS2vOwnNvlOrSbZt6C7iccBf3zPH49/2CqRQHxxWB5d7JnXDByHTFZs AI7yeg3PBe85gMfGczzRP6+CuY2pYOa6 X-Received: by 10.159.37.145 with SMTP id 17mr17965546uaf.112.1497950565417; Tue, 20 Jun 2017 02:22:45 -0700 (PDT) MIME-Version: 1.0 Received: by 10.103.49.142 with HTTP; Tue, 20 Jun 2017 02:22:44 -0700 (PDT) In-Reply-To: References: From: "Bin.Cheng" Date: Tue, 20 Jun 2017 09:22:00 -0000 Message-ID: Subject: Re: [PATCH GCC][13/13]Distribute loop with loop versioning under runtime alias check To: "gcc-patches@gcc.gnu.org" , Richard Guenther Content-Type: multipart/mixed; boundary="001a11391216580a29055260cb5e" X-IsSubscribed: yes X-SW-Source: 2017-06/txt/msg01412.txt.bz2 --001a11391216580a29055260cb5e Content-Type: text/plain; charset="UTF-8" Content-length: 4847 On Mon, Jun 12, 2017 at 6:03 PM, Bin Cheng wrote: > Hi, > This is the main patch rewriting loop distribution in order to handle hmmer. > It improves loop distribution by versioning loop under runtime alias check conditions. > As described in comments, the patch basically implements distribution in the following > steps: > > 1) Seed partitions with specific type statements. For now we support > two types seed statements: statement defining variable used outside > of loop; statement storing to memory. > 2) Build reduced dependence graph (RDG) for loop to be distributed. > The vertices (RDG:V) model all statements in the loop and the edges > (RDG:E) model flow and control dependencies between statements. > 3) Apart from RDG, compute data dependencies between memory references. > 4) Starting from seed statement, build up partition by adding depended > statements according to RDG's dependence information. Partition is > classified as parallel type if it can be executed paralleled; or as > sequential type if it can't. Parallel type partition is further > classified as different builtin kinds if it can be implemented as > builtin function calls. > 5) Build partition dependence graph (PG) based on data dependencies. > The vertices (PG:V) model all partitions and the edges (PG:E) model > all data dependencies between every partitions pair. In general, > data dependence is either compilation time known or unknown. In C > family languages, there exists quite amount compilation time unknown > dependencies because of possible alias relation of data references. > We categorize PG's edge to two types: "true" edge that represents > compilation time known data dependencies; "alias" edge for all other > data dependencies. > 6) Traverse subgraph of PG as if all "alias" edges don't exist. Merge > partitions in each strong connected component (SCC) correspondingly. > Build new PG for merged partitions. > 7) Traverse PG again and this time with both "true" and "alias" edges > included. We try to break SCCs by removing some edges. Because > SCCs by "true" edges are all fused in step 6), we can break SCCs > by removing some "alias" edges. It's NP-hard to choose optimal > edge set, fortunately simple approximation is good enough for us > given the small problem scale. > 8) Collect all data dependencies of the removed "alias" edges. Create > runtime alias checks for collected data dependencies. > 9) Version loop under the condition of runtime alias checks. Given > loop distribution generally introduces additional overhead, it is > only useful if vectorization is achieved in distributed loop. We > version loop with internal function call IFN_LOOP_DIST_ALIAS. If > no distributed loop can be vectorized, we simply remove distributed > loops and recover to the original one. > > Also, there are some more to improve in the future (which isn't difficult I think): > TODO: > 1) We only distribute innermost loops now. This pass should handle loop > nests in the future. > 2) We only fuse partitions in SCC now. A better fusion algorithm is > desired to minimize loop overhead, maximize parallelism and maximize > > Bootstrap and test on x86_64 and AArch64. Is it OK? > Trivial updated due to changes in previous patches. Also fixed issues mentioned by Kugan. Thanks, bin 2017-06-17 Bin Cheng * tree-loop-distribution.c: Add general explanantion on the pass. (pg_add_dependence_edges): New parameter. handle alias data dependence specially and record it in the parameter if asked. (struct pg_vdata, pg_edata, pg_edge_callback_data): New structs. (init_partition_graph_vertices, add_partition_graph_edge): New. (pg_skip_alias_edge, free_partition_graph_edata_cb): New. (free_partition_graph_vdata, build_partition_graph): New. (sort_partitions_by_post_order, merge_dep_scc_partitions): New. (pg_collect_alias_ddrs, break_alias_scc_partitions): New. (data_ref_segment_size, latch_dominated_by_data_ref): New. (compute_alias_check_pairs, version_loop_by_alias_check): New. (version_for_distribution_p, finalize_partitions): New. (distribute_loop): Handle alias data dependence specially. Factor out loop fusion code as functions and call these functions. gcc/testsuite/ChangeLog 2017-06-17 Bin Cheng * gcc.dg/tree-ssa/ldist-4.c: Adjust test string. * gcc.dg/tree-ssa/ldist-12.c: Ditto. * gcc.dg/tree-ssa/ldist-13.c: Ditto. * gcc.dg/tree-ssa/ldist-14.c: Ditto. --001a11391216580a29055260cb5e Content-Type: text/x-patch; charset="US-ASCII"; name="0012-loop-distribution-20170608.txt.patch" Content-Disposition: attachment; filename="0012-loop-distribution-20170608.txt.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_j45d2re01 Content-length: 48369 RnJvbSA5YTAzZDNiNDIzZGY3MWZkNTlmMzU3NDg1ZmJjZWJjMDM0YjdkZDRi IE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBCaW4gQ2hlbmcgPGJp bmNoZTAxQGUxMDg0NTEtbGluLmNhbWJyaWRnZS5hcm0uY29tPgpEYXRlOiBG cmksIDkgSnVuIDIwMTcgMTQ6MjQ6NTIgKzAxMDAKU3ViamVjdDogW1BBVENI IDEyLzEzXSBsb29wLWRpc3RyaWJ1dGlvbi0yMDE3MDYwOC50eHQKCi0tLQog Z2NjL3Rlc3RzdWl0ZS9nY2MuZGcvdHJlZS1zc2EvbGRpc3QtMTIuYyB8ICAg MyArLQogZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvdHJlZS1zc2EvbGRpc3QtMTMu YyB8ICAgNSArLQogZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvdHJlZS1zc2EvbGRp c3QtMTQuYyB8ICAgNSArLQogZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvdHJlZS1z c2EvbGRpc3QtNC5jICB8ICAgNCArLQogZ2NjL3RyZWUtbG9vcC1kaXN0cmli dXRpb24uYyAgICAgICAgICAgICB8IDgyNyArKysrKysrKysrKysrKysrKysr KysrKysrKystLS0tCiA1IGZpbGVzIGNoYW5nZWQsIDczNiBpbnNlcnRpb25z KCspLCAxMDggZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvZ2NjL3Rlc3Rz dWl0ZS9nY2MuZGcvdHJlZS1zc2EvbGRpc3QtMTIuYyBiL2djYy90ZXN0c3Vp dGUvZ2NjLmRnL3RyZWUtc3NhL2xkaXN0LTEyLmMKaW5kZXggNTM1NTFjYS4u NjI1ZGQ5MiAxMDA2NDQKLS0tIGEvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvdHJl ZS1zc2EvbGRpc3QtMTIuYworKysgYi9nY2MvdGVzdHN1aXRlL2djYy5kZy90 cmVlLXNzYS9sZGlzdC0xMi5jCkBAIC0xOCw0ICsxOCw1IEBAIGludCBmb28g KGludCAqIF9fcmVzdHJpY3RfXyBpYSwKICAgcmV0dXJuIG95YVsyMl0gKyBv eWJbMjFdOwogfQogCi0vKiB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAt dGltZXMgImRpc3RyaWJ1dGVkOiBzcGxpdCB0byAyIGxvb3BzIiAxICJsZGlz dCIgfSB9ICovCisvKiBEaXN0cmlidXRpbmcgdGhlIGxvb3AgZG9lc24ndCBl eHBvc2UgbW9yZSBwYXJhbGxlbGlzbS4gICovCisvKiB7IGRnLWZpbmFsIHsg c2Nhbi10cmVlLWR1bXAtdGltZXMgImRpc3RyaWJ1dGVkOiBzcGxpdCB0byAy IGxvb3BzIiAwICJsZGlzdCIgfSB9ICovCmRpZmYgLS1naXQgYS9nY2MvdGVz dHN1aXRlL2djYy5kZy90cmVlLXNzYS9sZGlzdC0xMy5jIGIvZ2NjL3Rlc3Rz dWl0ZS9nY2MuZGcvdHJlZS1zc2EvbGRpc3QtMTMuYwppbmRleCBiYTM5ZDRk Li44YzlmZDU2IDEwMDY0NAotLS0gYS9nY2MvdGVzdHN1aXRlL2djYy5kZy90 cmVlLXNzYS9sZGlzdC0xMy5jCisrKyBiL2djYy90ZXN0c3VpdGUvZ2NjLmRn L3RyZWUtc3NhL2xkaXN0LTEzLmMKQEAgLTE2LDYgKzE2LDUgQEAgZmxvYXQg Zm9vIChpbnQgbikKICAgcmV0dXJuIHRtcDsKIH0KIAotLyogV2Ugc2hvdWxk IGFwcGx5IGxvb3AgZGlzdHJpYnV0aW9uLiAgKi8KLQotLyogeyBkZy1maW5h bCB7IHNjYW4tdHJlZS1kdW1wICJMb29wIDEgZGlzdHJpYnV0ZWQ6IHNwbGl0 IHRvIDIgbG9vcHMiICJsZGlzdCIgfSB9ICovCisvKiBEaXN0cmlidXRpbmcg dGhlIGxvb3AgZG9lc24ndCBleHBvc2UgbW9yZSBwYXJhbGxlbGlzbS4gICov CisvKiB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAtbm90ICJMb29wIDEg ZGlzdHJpYnV0ZWQ6IHNwbGl0IHRvIDIgbG9vcHMiICJsZGlzdCIgfSB9ICov CmRpZmYgLS1naXQgYS9nY2MvdGVzdHN1aXRlL2djYy5kZy90cmVlLXNzYS9s ZGlzdC0xNC5jIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvdHJlZS1zc2EvbGRp c3QtMTQuYwppbmRleCA0OGMxMDQwLi5mYTRkMWE4IDEwMDY0NAotLS0gYS9n Y2MvdGVzdHN1aXRlL2djYy5kZy90cmVlLXNzYS9sZGlzdC0xNC5jCisrKyBi L2djYy90ZXN0c3VpdGUvZ2NjLmRnL3RyZWUtc3NhL2xkaXN0LTE0LmMKQEAg LTIxLDYgKzIxLDUgQEAgZmxvYXQgZm9vIChpbnQgbikKICAgcmV0dXJuIHRt cDsKIH0KIAotLyogV2Ugc2hvdWxkIGFwcGx5IGxvb3AgZGlzdHJpYnV0aW9u LiAgKi8KLQotLyogeyBkZy1maW5hbCB7IHNjYW4tdHJlZS1kdW1wICJMb29w IDEgZGlzdHJpYnV0ZWQ6IHNwbGl0IHRvIDIgbG9vcHMiICJsZGlzdCIgfSB9 ICovCisvKiBEaXN0cmlidXRpbmcgdGhlIGxvb3AgZG9lc24ndCBleHBvc2Ug bW9yZSBwYXJhbGxlbGlzbS4gICovCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi10 cmVlLWR1bXAtbm90ICJMb29wIDEgZGlzdHJpYnV0ZWQ6IHNwbGl0IHRvIDIg bG9vcHMiICJsZGlzdCIgfSB9ICovCmRpZmYgLS1naXQgYS9nY2MvdGVzdHN1 aXRlL2djYy5kZy90cmVlLXNzYS9sZGlzdC00LmMgYi9nY2MvdGVzdHN1aXRl L2djYy5kZy90cmVlLXNzYS9sZGlzdC00LmMKaW5kZXggYzM2ZGFmMDcxLi40 ZGVmOWI0IDEwMDY0NAotLS0gYS9nY2MvdGVzdHN1aXRlL2djYy5kZy90cmVl LXNzYS9sZGlzdC00LmMKKysrIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvdHJl ZS1zc2EvbGRpc3QtNC5jCkBAIC0yMCw3ICsyMCw1IEBAIGludCBsb29wMSAo aW50IGspCiAgIHJldHVybiBiWzEwMC0xXVsxXTsKIH0KIAotLyogVGhlIGN1 cnJlbnQgY29zdCBtb2RlbCBmdXNlcyB0aGUgdHdvIHBhcnRpdGlvbnMgYmVj YXVzZSB0aGV5IGhhdmUKLSAgIHNpbWlsYXIgbWVtb3J5IGFjY2Vzc2VzLiAg Ki8KLS8qIHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcCAic2ltaWxhciBt ZW1vcnkgYWNjZXNzZXMiICJsZGlzdCIgfSB9ICovCisvKiBEaXN0cmlidXRp bmcgaW5uZXIgbG9vcCBkb2Vzbid0IGV4cG9zZSBtb3JlIHBhcmFsbGVsaXNt LiAgKi8KIC8qIHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcC10aW1lcyAi ZGlzdHJpYnV0ZWQ6IHNwbGl0IHRvIDIgbG9vcHMiIDAgImxkaXN0IiB9IH0g Ki8KZGlmZiAtLWdpdCBhL2djYy90cmVlLWxvb3AtZGlzdHJpYnV0aW9uLmMg Yi9nY2MvdHJlZS1sb29wLWRpc3RyaWJ1dGlvbi5jCmluZGV4IDFiNGUyMzgu LjI5YThjMjAgMTAwNjQ0Ci0tLSBhL2djYy90cmVlLWxvb3AtZGlzdHJpYnV0 aW9uLmMKKysrIGIvZ2NjL3RyZWUtbG9vcC1kaXN0cmlidXRpb24uYwpAQCAt MzYsMTAgKzM2LDU4IEBAIGFsb25nIHdpdGggR0NDOyBzZWUgdGhlIGZpbGUg Q09QWUlORzMuICBJZiBub3Qgc2VlCiAgICB8ICAgRChJKSA9IEEoSS0xKSpF CiAgICB8RU5ERE8KIAotICAgVGhpcyBwYXNzIHVzZXMgYW4gUkRHLCBSZWR1 Y2VkIERlcGVuZGVuY2UgR3JhcGggYnVpbHQgb24gdG9wIG9mIHRoZQotICAg ZGF0YSBkZXBlbmRlbmNlIHJlbGF0aW9ucy4gIFRoZSBSREcgaXMgdGhlbiB0 b3BvbG9naWNhbGx5IHNvcnRlZCB0bwotICAgb2J0YWluIGEgbWFwIG9mIGlu Zm9ybWF0aW9uIHByb2R1Y2Vycy9jb25zdW1lcnMgYmFzZWQgb24gd2hpY2gg aXQKLSAgIGdlbmVyYXRlcyB0aGUgbmV3IGxvb3BzLiAgKi8KKyAgIExvb3Ag ZGlzdHJpYnV0aW9uIGlzIHRoZSBkdWFsIG9mIGxvb3AgZnVzaW9uLiAgSXQg c2VwYXJhdGVzIHN0YXRlbWVudHMKKyAgIG9mIGEgbG9vcCAob3IgbG9vcCBu ZXN0KSBpbnRvIG11bHRpcGxlIGxvb3BzIChvciBsb29wIG5lc3RzKSB3aXRo IHRoZQorICAgc2FtZSBsb29wIGhlYWRlci4gIFRoZSBtYWpvciBnb2FsIGlz IHRvIHNlcGFyYXRlIHN0YXRlbWVudHMgd2hpY2ggbWF5CisgICBiZSB2ZWN0 b3JpemVkIGZyb20gdGhvc2UgdGhhdCBjYW4ndC4gIFRoaXMgcGFzcyBpbXBs ZW1lbnRzIGRpc3RyaWJ1dGlvbgorICAgaW4gdGhlIGZvbGxvd2luZyBzdGVw czoKKworICAgICAxKSBTZWVkIHBhcnRpdGlvbnMgd2l0aCBzcGVjaWZpYyB0 eXBlIHN0YXRlbWVudHMuICBGb3Igbm93IHdlIHN1cHBvcnQKKwl0d28gdHlw ZXMgc2VlZCBzdGF0ZW1lbnRzOiBzdGF0ZW1lbnQgZGVmaW5pbmcgdmFyaWFi bGUgdXNlZCBvdXRzaWRlCisJb2YgbG9vcDsgc3RhdGVtZW50IHN0b3Jpbmcg dG8gbWVtb3J5LgorICAgICAyKSBCdWlsZCByZWR1Y2VkIGRlcGVuZGVuY2Ug Z3JhcGggKFJERykgZm9yIGxvb3AgdG8gYmUgZGlzdHJpYnV0ZWQuCisJVGhl IHZlcnRpY2VzIChSREc6VikgbW9kZWwgYWxsIHN0YXRlbWVudHMgaW4gdGhl IGxvb3AgYW5kIHRoZSBlZGdlcworCShSREc6RSkgbW9kZWwgZmxvdyBhbmQg Y29udHJvbCBkZXBlbmRlbmNpZXMgYmV0d2VlbiBzdGF0ZW1lbnRzLgorICAg ICAzKSBBcGFydCBmcm9tIFJERywgY29tcHV0ZSBkYXRhIGRlcGVuZGVuY2ll cyBiZXR3ZWVuIG1lbW9yeSByZWZlcmVuY2VzLgorICAgICA0KSBTdGFydGlu ZyBmcm9tIHNlZWQgc3RhdGVtZW50LCBidWlsZCB1cCBwYXJ0aXRpb24gYnkg YWRkaW5nIGRlcGVuZGVkCisJc3RhdGVtZW50cyBhY2NvcmRpbmcgdG8gUkRH J3MgZGVwZW5kZW5jZSBpbmZvcm1hdGlvbi4gIFBhcnRpdGlvbiBpcworCWNs YXNzaWZpZWQgYXMgcGFyYWxsZWwgdHlwZSBpZiBpdCBjYW4gYmUgZXhlY3V0 ZWQgcGFyYWxsZWxlZDsgb3IgYXMKKwlzZXF1ZW50aWFsIHR5cGUgaWYgaXQg Y2FuJ3QuICBQYXJhbGxlbCB0eXBlIHBhcnRpdGlvbiBpcyBmdXJ0aGVyCisJ Y2xhc3NpZmllZCBhcyBkaWZmZXJlbnQgYnVpbHRpbiBraW5kcyBpZiBpdCBj YW4gYmUgaW1wbGVtZW50ZWQgYXMKKwlidWlsdGluIGZ1bmN0aW9uIGNhbGxz LgorICAgICA1KSBCdWlsZCBwYXJ0aXRpb24gZGVwZW5kZW5jZSBncmFwaCAo UEcpIGJhc2VkIG9uIGRhdGEgZGVwZW5kZW5jaWVzLgorCVRoZSB2ZXJ0aWNl cyAoUEc6VikgbW9kZWwgYWxsIHBhcnRpdGlvbnMgYW5kIHRoZSBlZGdlcyAo UEc6RSkgbW9kZWwKKwlhbGwgZGF0YSBkZXBlbmRlbmNpZXMgYmV0d2VlbiBl dmVyeSBwYXJ0aXRpb25zIHBhaXIuICBJbiBnZW5lcmFsLAorCWRhdGEgZGVw ZW5kZW5jZSBpcyBlaXRoZXIgY29tcGlsYXRpb24gdGltZSBrbm93biBvciB1 bmtub3duLiAgSW4gQworCWZhbWlseSBsYW5ndWFnZXMsIHRoZXJlIGV4aXN0 cyBxdWl0ZSBhbW91bnQgY29tcGlsYXRpb24gdGltZSB1bmtub3duCisJZGVw ZW5kZW5jaWVzIGJlY2F1c2Ugb2YgcG9zc2libGUgYWxpYXMgcmVsYXRpb24g b2YgZGF0YSByZWZlcmVuY2VzLgorCVdlIGNhdGVnb3JpemUgUEcncyBlZGdl IHRvIHR3byB0eXBlczogInRydWUiIGVkZ2UgdGhhdCByZXByZXNlbnRzCisJ Y29tcGlsYXRpb24gdGltZSBrbm93biBkYXRhIGRlcGVuZGVuY2llczsgImFs aWFzIiBlZGdlIGZvciBhbGwgb3RoZXIKKwlkYXRhIGRlcGVuZGVuY2llcy4K KyAgICAgNikgVHJhdmVyc2Ugc3ViZ3JhcGggb2YgUEcgYXMgaWYgYWxsICJh bGlhcyIgZWRnZXMgZG9uJ3QgZXhpc3QuICBNZXJnZQorCXBhcnRpdGlvbnMg aW4gZWFjaCBzdHJvbmcgY29ubmVjdGVkIGNvbXBvbmVudCAoU0NDKSBjb3Jy ZXNwb25kaW5nbHkuCisJQnVpbGQgbmV3IFBHIGZvciBtZXJnZWQgcGFydGl0 aW9ucy4KKyAgICAgNykgVHJhdmVyc2UgUEcgYWdhaW4gYW5kIHRoaXMgdGlt ZSB3aXRoIGJvdGggInRydWUiIGFuZCAiYWxpYXMiIGVkZ2VzCisJaW5jbHVk ZWQuICBXZSB0cnkgdG8gYnJlYWsgU0NDcyBieSByZW1vdmluZyBzb21lIGVk Z2VzLiAgQmVjYXVzZQorCVNDQ3MgYnkgInRydWUiIGVkZ2VzIGFyZSBhbGwg ZnVzZWQgaW4gc3RlcCA2KSwgd2UgY2FuIGJyZWFrIFNDQ3MKKwlieSByZW1v dmluZyBzb21lICJhbGlhcyIgZWRnZXMuICBJdCdzIE5QLWhhcmQgdG8gY2hv b3NlIG9wdGltYWwKKwllZGdlIHNldCwgZm9ydHVuYXRlbHkgc2ltcGxlIGFw cHJveGltYXRpb24gaXMgZ29vZCBlbm91Z2ggZm9yIHVzCisJZ2l2ZW4gdGhl IHNtYWxsIHByb2JsZW0gc2NhbGUuCisgICAgIDgpIENvbGxlY3QgYWxsIGRh dGEgZGVwZW5kZW5jaWVzIG9mIHRoZSByZW1vdmVkICJhbGlhcyIgZWRnZXMu ICBDcmVhdGUKKwlydW50aW1lIGFsaWFzIGNoZWNrcyBmb3IgY29sbGVjdGVk IGRhdGEgZGVwZW5kZW5jaWVzLgorICAgICA5KSBWZXJzaW9uIGxvb3AgdW5k ZXIgdGhlIGNvbmRpdGlvbiBvZiBydW50aW1lIGFsaWFzIGNoZWNrcy4gIEdp dmVuCisJbG9vcCBkaXN0cmlidXRpb24gZ2VuZXJhbGx5IGludHJvZHVjZXMg YWRkaXRpb25hbCBvdmVyaGVhZCwgaXQgaXMKKwlvbmx5IHVzZWZ1bCBpZiB2 ZWN0b3JpemF0aW9uIGlzIGFjaGlldmVkIGluIGRpc3RyaWJ1dGVkIGxvb3Au ICBXZQorCXZlcnNpb24gbG9vcCB3aXRoIGludGVybmFsIGZ1bmN0aW9uIGNh bGwgSUZOX0xPT1BfRElTVF9BTElBUy4gIElmCisJbm8gZGlzdHJpYnV0ZWQg bG9vcCBjYW4gYmUgdmVjdG9yaXplZCwgd2Ugc2ltcGx5IHJlbW92ZSBkaXN0 cmlidXRlZAorCWxvb3BzIGFuZCByZWNvdmVyIHRvIHRoZSBvcmlnaW5hbCBv bmUuCisKKyAgIFRPRE86CisgICAgIDEpIFdlIG9ubHkgZGlzdHJpYnV0ZSBp bm5lcm1vc3QgbG9vcHMgbm93LiAgVGhpcyBwYXNzIHNob3VsZCBoYW5kbGUg bG9vcAorCW5lc3RzIGluIHRoZSBmdXR1cmUuCisgICAgIDIpIFdlIG9ubHkg ZnVzZSBwYXJ0aXRpb25zIGluIFNDQyBub3cuICBBIGJldHRlciBmdXNpb24g YWxnb3JpdGhtIGlzCisJZGVzaXJlZCB0byBtaW5pbWl6ZSBsb29wIG92ZXJo ZWFkLCBtYXhpbWl6ZSBwYXJhbGxlbGlzbSBhbmQgbWF4aW1pemUKKwlkYXRh IHJldXNlLiAgKi8KIAogI2luY2x1ZGUgImNvbmZpZy5oIgogI2luY2x1ZGUg InN5c3RlbS5oIgpAQCAtMTU3NSwxMSArMTYyMywxNCBAQCBwYXJ0aXRpb25f Y29udGFpbnNfYWxsX3J3IChzdHJ1Y3QgZ3JhcGggKnJkZywKIH0KIAogLyog Q29tcHV0ZSBwYXJ0aXRpb24gZGVwZW5kZW5jZSBjcmVhdGVkIGJ5IHRoZSBk YXRhIHJlZmVyZW5jZXMgaW4gRFJTMQotICAgYW5kIERSUzIgYW5kIG1vZGlm eSBhbmQgcmV0dXJuIERJUiBhY2NvcmRpbmcgdG8gdGhhdC4gICovCisgICBh bmQgRFJTMiwgbW9kaWZ5IGFuZCByZXR1cm4gRElSIGFjY29yZGluZyB0byB0 aGF0LiAgSUYgQUxJQVNfRERSIGlzCisgICBub3QgTlVMTCwgd2UgcmVjb3Jk IGRlcGVuZGVuY2UgaW50cm9kdWNlZCBieSBwb3NzaWJsZSBhbGlhcyBiZXR3 ZWVuCisgICB0d28gZGF0YSByZWZlcmVuY2VzIGluIEFMSUFTX0REUlM7IG90 aGVyd2lzZSwgd2Ugc2ltcGx5IGlnbm9yZSBzdWNoCisgICBkZXBlbmRlbmNl IGFzIGlmIGl0IGRvZXNuJ3QgZXhpc3QgYXQgYWxsLiAgKi8KIAogc3RhdGlj IGludAogcGdfYWRkX2RlcGVuZGVuY2VfZWRnZXMgKHN0cnVjdCBncmFwaCAq cmRnLCBpbnQgZGlyLAotCQkJIGJpdG1hcCBkcnMxLCBiaXRtYXAgZHJzMikK KwkJCSBiaXRtYXAgZHJzMSwgYml0bWFwIGRyczIsIHZlYzxkZHJfcD4gKmFs aWFzX2RkcnMpCiB7CiAgIHVuc2lnbmVkIGksIGo7CiAgIGJpdG1hcF9pdGVy YXRvciBiaSwgYmo7CkBAIC0xNTkzLDYgKzE2NDQsOSBAQCBwZ19hZGRfZGVw ZW5kZW5jZV9lZGdlcyAoc3RydWN0IGdyYXBoICpyZGcsIGludCBkaXIsCiAK ICAgICAgIEVYRUNVVEVfSUZfU0VUX0lOX0JJVE1BUCAoZHJzMiwgMCwgaiwg YmopCiAJeworCSAgaW50IHJlcywgdGhpc19kaXIgPSAxOworCSAgZGRyX3Ag ZGRyOworCiAJICBkcjIgPSBkYXRhcmVmc192ZWNbal07CiAKIAkgIC8qIFNr aXAgYWxsIDxyZWFkLCByZWFkPiBkYXRhIGRlcGVuZGVuY2UuICAqLwpAQCAt MTYwMCw5ICsxNjU0LDcgQEAgcGdfYWRkX2RlcGVuZGVuY2VfZWRnZXMgKHN0 cnVjdCBncmFwaCAqcmRnLCBpbnQgZGlyLAogCSAgICBjb250aW51ZTsKIAog CSAgc2F2ZWRfZHIxID0gZHIxOwotCSAgaW50IHRoaXNfZGlyID0gMTsKLQkg IGRkcl9wIGRkcjsKLQkgIC8qIFJlLXNodWZmbGUgZGF0YS1yZWZzIHRvIGJl IGluIGRvbWluYXRvciBvcmRlci4gICovCisJICAvKiBSZS1zaHVmZmxlIGRh dGEtcmVmcyB0byBiZSBpbiB0b3BvbG9naWNhbCBvcmRlci4gICovCiAJICBp ZiAocmRnX3ZlcnRleF9mb3Jfc3RtdCAocmRnLCBEUl9TVE1UIChkcjEpKQog CSAgICAgID4gcmRnX3ZlcnRleF9mb3Jfc3RtdCAocmRnLCBEUl9TVE1UIChk cjIpKSkKIAkgICAgewpAQCAtMTYxMSwxNCArMTY2MywzMyBAQCBwZ19hZGRf ZGVwZW5kZW5jZV9lZGdlcyAoc3RydWN0IGdyYXBoICpyZGcsIGludCBkaXIs CiAJICAgIH0KIAkgIGRkciA9IGdldF9kYXRhX2RlcGVuZGVuY2UgKHJkZywg ZHIxLCBkcjIpOwogCSAgaWYgKEREUl9BUkVfREVQRU5ERU5UIChkZHIpID09 IGNocmVjX2RvbnRfa25vdykKLQkgICAgdGhpc19kaXIgPSAyOworCSAgICB7 CisJICAgICAgdGhpc19kaXIgPSAwOworCSAgICAgIHJlcyA9IGRhdGFfcmVm X2NvbXBhcmVfdHJlZSAoRFJfQkFTRV9BRERSRVNTIChkcjEpLAorCQkJCQkg ICBEUl9CQVNFX0FERFJFU1MgKGRyMikpOworCSAgICAgIC8qIEJlIGNvbnNl cnZhdGl2ZS4gIElmIGRhdGEgcmVmZXJlbmNlcyBhcmUgbm90IHdlbGwgYW5h bHl6ZWQsCisJCSBvciB0aGUgdHdvIGRhdGEgcmVmZXJlbmNlcyBoYXZlIHRo ZSBzYW1lIGJhc2UgYWRkcmVzcyBhbmQKKwkJIG9mZnNldCwgYWRkIGRlcGVu ZGVuY2UgYW5kIGNvbnNpZGVyIGl0IGFsaWFzIHRvIGVhY2ggb3RoZXIuCisJ CSBJbiBvdGhlciB3b3JkcywgdGhlIGRlcGVuZGVuY2UgY2FuIG5vdCBiZSBy ZXNvbHZlZCBieQorCQkgcnVudGltZSBhbGlhcyBjaGVjay4gICovCisJICAg ICAgaWYgKCFEUl9CQVNFX0FERFJFU1MgKGRyMSkgfHwgIURSX0JBU0VfQURE UkVTUyAoZHIyKQorCQkgIHx8ICFEUl9PRkZTRVQgKGRyMSkgfHwgIURSX09G RlNFVCAoZHIyKQorCQkgIHx8ICFEUl9JTklUIChkcjEpIHx8ICFEUl9JTklU IChkcjIpCisJCSAgfHwgIURSX1NURVAgKGRyMSkgfHwgIXRyZWVfZml0c191 aHdpX3AgKERSX1NURVAgKGRyMSkpCisJCSAgfHwgIURSX1NURVAgKGRyMikg fHwgIXRyZWVfZml0c191aHdpX3AgKERSX1NURVAgKGRyMikpCisJCSAgfHwg cmVzID09IDApCisJCXRoaXNfZGlyID0gMjsKKwkgICAgICAvKiBEYXRhIGRl cGVuZGVuY2UgY291bGQgYmUgcmVzb2x2ZWQgYnkgcnVudGltZSBhbGlhcyBj aGVjaywKKwkJIHJlY29yZCBpdCBpbiBBTElBU19ERFJTLiAgKi8KKwkgICAg ICBlbHNlIGlmIChhbGlhc19kZHJzICE9IE5VTEwpCisJCWFsaWFzX2RkcnMt PnNhZmVfcHVzaCAoZGRyKTsKKwkgICAgICAvKiBPciBzaW1wbHkgaWdub3Jl IGl0LiAgKi8KKwkgICAgfQogCSAgZWxzZSBpZiAoRERSX0FSRV9ERVBFTkRF TlQgKGRkcikgPT0gTlVMTF9UUkVFKQogCSAgICB7CiAJICAgICAgaWYgKERE Ul9SRVZFUlNFRF9QIChkZHIpKQotCQl7Ci0JCSAgc3RkOjpzd2FwIChkcjEs IGRyMik7Ci0JCSAgdGhpc19kaXIgPSAtdGhpc19kaXI7Ci0JCX0KKwkJdGhp c19kaXIgPSAtdGhpc19kaXI7CisKIAkgICAgICAvKiBLbm93biBkZXBlbmRl bmNlcyBjYW4gc3RpbGwgYmUgdW5vcmRlcmVkIHRocm91Z291dCB0aGUKIAkJ IGl0ZXJhdGlvbiBzcGFjZSwgc2VlIGdjYy5kZy90cmVlLXNzYS9sZGlzdC0x Ni5jLiAgKi8KIAkgICAgICBpZiAoRERSX05VTV9ESVNUX1ZFQ1RTIChkZHIp ICE9IDEpCkBAIC0xNjI2LDEyICsxNjk3LDEwIEBAIHBnX2FkZF9kZXBlbmRl bmNlX2VkZ2VzIChzdHJ1Y3QgZ3JhcGggKnJkZywgaW50IGRpciwKIAkgICAg ICAvKiBJZiB0aGUgb3ZlcmxhcCBpcyBleGFjdCBwcmVzZXJ2ZSBzdG10IG9y ZGVyLiAgKi8KIAkgICAgICBlbHNlIGlmIChsYW1iZGFfdmVjdG9yX3plcm9w IChERFJfRElTVF9WRUNUIChkZHIsIDApLCAxKSkKIAkJOworCSAgICAgIC8q IEVsc2UgYXMgdGhlIGRpc3RhbmNlIHZlY3RvciBpcyBsZXhpY29ncmFwaGlj IHBvc2l0aXZlIHN3YXAKKwkJIHRoZSBkZXBlbmRlbmNlIGRpcmVjdGlvbi4g ICovCiAJICAgICAgZWxzZQotCQl7Ci0JCSAgLyogRWxzZSBhcyB0aGUgZGlz dGFuY2UgdmVjdG9yIGlzIGxleGljb2dyYXBoaWMgcG9zaXRpdmUKLQkJICAg ICBzd2FwIHRoZSBkZXBlbmRlbmNlIGRpcmVjdGlvbi4gICovCi0JCSAgdGhp c19kaXIgPSAtdGhpc19kaXI7Ci0JCX0KKwkJdGhpc19kaXIgPSAtdGhpc19k aXI7CiAJICAgIH0KIAkgIGVsc2UKIAkgICAgdGhpc19kaXIgPSAwOwpAQCAt MTY1OCwxMSArMTcyNyw2MjggQEAgcGdjbXAgKGNvbnN0IHZvaWQgKnYxXywg Y29uc3Qgdm9pZCAqdjJfKQogICByZXR1cm4gdjItPnBvc3QgLSB2MS0+cG9z dDsKIH0KIAotLyogRGlzdHJpYnV0ZXMgdGhlIGNvZGUgZnJvbSBMT09QIGlu IHN1Y2ggYSB3YXkgdGhhdCBwcm9kdWNlcgotICAgc3RhdGVtZW50cyBhcmUg cGxhY2VkIGJlZm9yZSBjb25zdW1lciBzdGF0ZW1lbnRzLiAgVHJpZXMgdG8g c2VwYXJhdGUKLSAgIG9ubHkgdGhlIHN0YXRlbWVudHMgZnJvbSBTVE1UUyBp bnRvIHNlcGFyYXRlIGxvb3BzLgotICAgUmV0dXJucyB0aGUgbnVtYmVyIG9m IGRpc3RyaWJ1dGVkIGxvb3BzLiAgU2V0ICpERVNUUk9ZX1AgdG8gd2hldGhl cgotICAgTE9PUCBuZWVkcyB0byBiZSBkZXN0cm95ZWQuICAqLworLyogRGF0 YSBhdHRhY2hlZCB0byB2ZXJ0aWNlcyBvZiBwYXJ0aXRpb24gZGVwZW5kZW5j ZSBncmFwaC4gICovCitzdHJ1Y3QgcGdfdmRhdGEKK3sKKyAgLyogSUQgb2Yg dGhlIGNvcnJlc3BvbmRpbmcgcGFydGl0aW9uLiAgKi8KKyAgaW50IGlkOwor ICAvKiBUaGUgcGFydGl0aW9uLiAgKi8KKyAgc3RydWN0IHBhcnRpdGlvbiAq cGFydGl0aW9uOworfTsKKworLyogRGF0YSBhdHRhY2hlZCB0byBlZGdlcyBv ZiBwYXJ0aXRpb24gZGVwZW5kZW5jZSBncmFwaC4gICovCitzdHJ1Y3QgcGdf ZWRhdGEKK3sKKyAgLyogSWYgdGhlIGRlcGVuZGVuY2UgZWRnZSBjYW4gYmUg cmVzb2x2ZWQgYnkgcnVudGltZSBhbGlhcyBjaGVjaywKKyAgICAgdGhpcyB2 ZWN0b3IgY29udGFpbnMgZGF0YSBkZXBlbmRlbmNlIHJlbGF0aW9ucyBmb3Ig cnVudGltZSBhbGlhcworICAgICBjaGVjay4gIE9uIHRoZSBvdGhlciBoYW5k LCBpZiB0aGUgZGVwZW5kZW5jZSBlZGdlIGlzIGludHJvZHVjZWQKKyAgICAg YmVjYXVzZSBvZiBjb21waWxhdGlvbiB0aW1lIGtub3duIGRhdGEgZGVwZW5k ZW5jZSwgdGhpcyB2ZWN0b3IKKyAgICAgY29udGFpbnMgbm90aGluZy4gICov CisgIHZlYzxkZHJfcD4gYWxpYXNfZGRyczsKK307CisKKy8qIENhbGxiYWNr IGRhdGEgZm9yIHRyYXZlcnNpbmcgZWRnZXMgaW4gZ3JhcGguICAqLworc3Ry dWN0IHBnX2VkZ2VfY2FsbGJhY2tfZGF0YQoreworICAvKiBCaXRtYXAgY29u dGFpbnMgc3Ryb25nIGNvbm5lY3RlZCBjb21wb25lbnRzIHNob3VsZCBiZSBt ZXJnZWQuICAqLworICBiaXRtYXAgc2Njc190b19tZXJnZTsKKyAgLyogQXJy YXkgY29uc3RhaW5zIGNvbXBvbmVudCBpbmZvcm1hdGlvbiBmb3IgYWxsIHZl cnRpY2VzLiAgKi8KKyAgaW50ICp2ZXJ0aWNlc19jb21wb25lbnQ7CisgIC8q IFZlY3RvciB0byByZWNvcmQgYWxsIGRhdGEgZGVwZW5kZW5jZSByZWxhdGlv bnMgd2hpY2ggYXJlIG5lZWRlZAorICAgICB0byBicmVhayBzdHJvbmcgY29u bmVjdGVkIGNvbXBvbmVudHMgYnkgcnVudGltZSBhbGlhcyBjaGVja3MuICAq LworICB2ZWM8ZGRyX3A+ICphbGlhc19kZHJzOworfTsKKworLyogSW5pdGlh bGl6ZSB2ZXJ0aWNlJ3MgZGF0YSBmb3IgcGFydGl0aW9uIGRlcGVuZGVuY2Ug Z3JhcGggUEcgd2l0aAorICAgUEFSVElUSU9OUy4gICovCisKK3N0YXRpYyB2 b2lkCitpbml0X3BhcnRpdGlvbl9ncmFwaF92ZXJ0aWNlcyAoc3RydWN0IGdy YXBoICpwZywKKwkJCSAgICAgICB2ZWM8c3RydWN0IHBhcnRpdGlvbiAqPiAq cGFydGl0aW9ucykKK3sKKyAgaW50IGk7CisgIHBhcnRpdGlvbiAqcGFydGl0 aW9uOworICBzdHJ1Y3QgcGdfdmRhdGEgKmRhdGE7CisKKyAgZm9yIChpID0g MDsgcGFydGl0aW9ucy0+aXRlcmF0ZSAoaSwgJnBhcnRpdGlvbik7ICsraSkK KyAgICB7CisgICAgICBkYXRhID0gbmV3IHBnX3ZkYXRhOworICAgICAgcGct PnZlcnRpY2VzW2ldLmRhdGEgPSBkYXRhOworICAgICAgZGF0YS0+aWQgPSBp OworICAgICAgZGF0YS0+cGFydGl0aW9uID0gcGFydGl0aW9uOworICAgIH0K K30KKworLyogQWRkIGVkZ2UgPEksIEo+IHRvIHBhcnRpdGlvbiBkZXBlbmRl bmNlIGdyYXBoIFBHLiAgQXR0YWNoIHZlY3RvciBvZiBkYXRhCisgICBkZXBl bmRlbmNlIHJlbGF0aW9ucyB0byB0aGUgRURHRSBpZiBERFJTIGlzbid0IE5V TEwuICAqLworCitzdGF0aWMgdm9pZAorYWRkX3BhcnRpdGlvbl9ncmFwaF9l ZGdlIChzdHJ1Y3QgZ3JhcGggKnBnLCBpbnQgaSwgaW50IGosIHZlYzxkZHJf cD4gKmRkcnMpCit7CisgIHN0cnVjdCBncmFwaF9lZGdlICplID0gYWRkX2Vk Z2UgKHBnLCBpLCBqKTsKKworICAvKiBJZiB0aGUgZWRnZSBpcyBhdHRhY2hl ZCB3aXRoIGRhdGEgZGVwZW5kZW5jZSByZWxhdGlvbnMsIGl0IG1lYW5zIHRo aXMKKyAgICAgZGVwZW5kZW5jZSBlZGdlIGNhbiBiZSByZXNvbHZlZCBieSBy dW50aW1lIGFsaWFzIGNoZWNrcy4gICovCisgIGlmIChkZHJzICE9IE5VTEwp CisgICAgeworICAgICAgc3RydWN0IHBnX2VkYXRhICpkYXRhID0gbmV3IHBn X2VkYXRhOworCisgICAgICBnY2NfYXNzZXJ0IChkZHJzLT5sZW5ndGggKCkg PiAwKTsKKyAgICAgIGUtPmRhdGEgPSBkYXRhOworICAgICAgZGF0YS0+YWxp YXNfZGRycyA9IHZOVUxMOworICAgICAgZGF0YS0+YWxpYXNfZGRycy5zYWZl X3NwbGljZSAoKmRkcnMpOworICAgIH0KK30KKworLyogQ2FsbGJhY2sgZnVu Y3Rpb24gZm9yIGdyYXBoIHRyYXZlc2FsIGFsZ29yaXRobS4gIEl0IHJldHVy bnMgdHJ1ZQorICAgaWYgZWRnZSBFIHNob3VsZCBza2lwcGVkIHdoZW4gdHJh dmVyc2luZyB0aGUgZ3JhcGguICAqLworCitzdGF0aWMgYm9vbAorcGdfc2tp cF9hbGlhc19lZGdlIChzdHJ1Y3QgZ3JhcGhfZWRnZSAqZSkKK3sKKyAgc3Ry dWN0IHBnX2VkYXRhICpkYXRhID0gKHN0cnVjdCBwZ19lZGF0YSAqKWUtPmRh dGE7CisgIHJldHVybiAoZGF0YSAhPSBOVUxMICYmIGRhdGEtPmFsaWFzX2Rk cnMubGVuZ3RoICgpID4gMCk7Cit9CisKKy8qIENhbGxiYWNrIGZ1bmN0aW9u IGZyZWVpbmcgZGF0YSBhdHRhY2hlZCB0byBlZGdlIEUgb2YgZ3JhcGguICAq LworCitzdGF0aWMgdm9pZAorZnJlZV9wYXJ0aXRpb25fZ3JhcGhfZWRhdGFf Y2IgKHN0cnVjdCBncmFwaCAqLCBzdHJ1Y3QgZ3JhcGhfZWRnZSAqZSwgdm9p ZCAqKQoreworICBpZiAoZS0+ZGF0YSAhPSBOVUxMKQorICAgIHsKKyAgICAg IHN0cnVjdCBwZ19lZGF0YSAqZGF0YSA9IChzdHJ1Y3QgcGdfZWRhdGEgKill LT5kYXRhOworICAgICAgZGF0YS0+YWxpYXNfZGRycy5yZWxlYXNlICgpOwor ICAgICAgZGVsZXRlIGRhdGE7CisgICAgfQorfQorCisvKiBGcmVlIGRhdGEg YXR0YWNoZWQgdG8gdmVydGljZSBvZiBwYXJ0aXRpb24gZGVwZW5kZW5jZSBn cmFwaCBQRy4gICovCisKK3N0YXRpYyB2b2lkCitmcmVlX3BhcnRpdGlvbl9n cmFwaF92ZGF0YSAoc3RydWN0IGdyYXBoICpwZykKK3sKKyAgaW50IGk7Cisg IHN0cnVjdCBwZ192ZGF0YSAqZGF0YTsKKworICBmb3IgKGkgPSAwOyBpIDwg cGctPm5fdmVydGljZXM7ICsraSkKKyAgICB7CisgICAgICBkYXRhID0gKHN0 cnVjdCBwZ192ZGF0YSAqKXBnLT52ZXJ0aWNlc1tpXS5kYXRhOworICAgICAg ZGVsZXRlIGRhdGE7CisgICAgfQorfQorCisvKiBCdWlsZCBhbmQgcmV0dXJu IHBhcnRpdGlvbiBkZXBlbmRlbmNlIGdyYXBoIGZvciBQQVJUSVRJT05TLiAg UkRHIGlzCisgICByZWR1Y2VkIGRlcGVuZGVuY2UgZ3JhcGggZm9yIHRoZSBs b29wIHRvIGJlIGRpc3RyaWJ1dGVkLiAgSWYgSUdOT1JFX0FMSUFTX1AKKyAg IGlzIHRydWUsIGRhdGEgZGVwZW5kZW5jZSBjYXVzZWQgYnkgcG9zc2libGUg YWxpYXMgYmV0d2VlbiByZWZlcmVuY2VzCisgICBpcyBpZ25vcmVkLCBhcyBp ZiBpdCBkb2Vzbid0IGV4aXN0IGF0IGFsbDsgb3RoZXJ3aXNlIGFsbCBkZXBk ZW5kZW5jZXMKKyAgIGFyZSBjb25zaWRlcmVkLiAgKi8KKworc3RhdGljIHN0 cnVjdCBncmFwaCAqCitidWlsZF9wYXJ0aXRpb25fZ3JhcGggKHN0cnVjdCBn cmFwaCAqcmRnLAorCQkgICAgICAgdmVjPHN0cnVjdCBwYXJ0aXRpb24gKj4g KnBhcnRpdGlvbnMsCisJCSAgICAgICBib29sIGlnbm9yZV9hbGlhc19wKQor eworICBpbnQgaSwgajsKKyAgc3RydWN0IHBhcnRpdGlvbiAqcGFydGl0aW9u MSwgKnBhcnRpdGlvbjI7CisgIGdyYXBoICpwZyA9IG5ld19ncmFwaCAocGFy dGl0aW9ucy0+bGVuZ3RoICgpKTsKKyAgYXV0b192ZWM8ZGRyX3A+IGFsaWFz X2RkcnMsICphbGlhc19kZHJzX3A7CisKKyAgYWxpYXNfZGRyc19wID0gaWdu b3JlX2FsaWFzX3AgPyBOVUxMIDogJmFsaWFzX2RkcnM7CisKKyAgaW5pdF9w YXJ0aXRpb25fZ3JhcGhfdmVydGljZXMgKHBnLCBwYXJ0aXRpb25zKTsKKwor ICBmb3IgKGkgPSAwOyBwYXJ0aXRpb25zLT5pdGVyYXRlIChpLCAmcGFydGl0 aW9uMSk7ICsraSkKKyAgICB7CisgICAgICBmb3IgKGogPSBpICsgMTsgcGFy dGl0aW9ucy0+aXRlcmF0ZSAoaiwgJnBhcnRpdGlvbjIpOyArK2opCisJewor CSAgLyogZGVwZW5kZW5jZSBkaXJlY3Rpb24gLSAwIGlzIG5vIGRlcGVuZGVu Y2UsIC0xIGlzIGJhY2ssCisJICAgICAxIGlzIGZvcnRoLCAyIGlzIGJvdGgg KHdlIGNhbiBzdG9wIHRoZW4sIG1lcmdpbmcgd2lsbCBvY2N1cikuICAqLwor CSAgaW50IGRpciA9IDA7CisKKwkgIC8qIElmIHRoZSBmaXJzdCBwYXJ0aXRp b24gaGFzIHJlZHVjdGlvbiwgYWRkIGJhY2sgZWRnZTsgaWYgdGhlCisJICAg ICBzZWNvbmQgcGFydGl0aW9uIGhhcyByZWR1Y3Rpb24sIGFkZCBmb3J0aCBl ZGdlLiAgVGhpcyBtYWtlcworCSAgICAgc3VyZSB0aGF0IHJlZHVjdGlvbiBw YXJ0aXRpb24gd2lsbCBiZSBzb3J0ZWQgYXMgdGhlIGxhc3Qgb25lLiAgKi8K KwkgIGlmIChwYXJ0aXRpb25fcmVkdWN0aW9uX3AgKHBhcnRpdGlvbjEpKQor CSAgICBkaXIgPSAtMTsKKwkgIGVsc2UgaWYgKHBhcnRpdGlvbl9yZWR1Y3Rp b25fcCAocGFydGl0aW9uMikpCisJICAgIGRpciA9IDE7CisKKwkgIC8qIENs ZWFudXAgdGhlIHRlbXBvcmFyeSB2ZWN0b3IuICAqLworCSAgYWxpYXNfZGRy cy50cnVuY2F0ZSAoMCk7CisKKwkgIGRpciA9IHBnX2FkZF9kZXBlbmRlbmNl X2VkZ2VzIChyZGcsIGRpciwgcGFydGl0aW9uMS0+ZGF0YXJlZnMsCisJCQkJ CSBwYXJ0aXRpb24yLT5kYXRhcmVmcywgYWxpYXNfZGRyc19wKTsKKworCSAg LyogQWRkIGVkZ2UgdG8gcGFydGl0aW9uIGdyYXBoIGlmIHRoZXJlIGV4aXN0 cyBkZXBlbmRlbmNlLiAgVGhlcmUKKwkgICAgIGFyZSB0d28gdHlwZXMgb2Yg ZWRnZXMuICBPbmUgdHlwZSBlZGdlIGlzIGNhdXNlZCBieSBjb21waWxhdGlv bgorCSAgICAgdGltZSBrbm93biBkZXBlbmRlbmNlLCB0aGlzIHR5cGUgY2Fu IG5vdCBiZSByZXNvbHZlZCBieSBydW50aW1lCisJICAgICBhbGlhcyBjaGVj ay4gIFRoZSBvdGhlciB0eXBlIGNhbiBiZSByZXNvbHZlZCBieSBydW50aW1l IGFsaWFzCisJICAgICBjaGVjay4gICovCisJICBpZiAoZGlyID09IDEgfHwg ZGlyID09IDIKKwkgICAgICB8fCBhbGlhc19kZHJzLmxlbmd0aCAoKSA+IDAp CisJICAgIHsKKwkgICAgICAvKiBBdHRhY2ggZGF0YSBkZXBlbmRlbmNlIHJl bGF0aW9ucyB0byBlZGdlIHRoYXQgY2FuIGJlIHJlc29sdmVkCisJCSBieSBy dW50aW1lIGFsaWFzIGNoZWNrLiAgKi8KKwkgICAgICBib29sIGFsaWFzX2Vk Z2VfcCA9IChkaXIgIT0gMSAmJiBkaXIgIT0gMik7CisJICAgICAgYWRkX3Bh cnRpdGlvbl9ncmFwaF9lZGdlIChwZywgaSwgaiwKKwkJCQkJKGFsaWFzX2Vk Z2VfcCkgPyAmYWxpYXNfZGRycyA6IE5VTEwpOworCSAgICB9CisJICBpZiAo ZGlyID09IC0xIHx8IGRpciA9PSAyCisJICAgICAgfHwgYWxpYXNfZGRycy5s ZW5ndGggKCkgPiAwKQorCSAgICB7CisJICAgICAgLyogQXR0YWNoIGRhdGEg ZGVwZW5kZW5jZSByZWxhdGlvbnMgdG8gZWRnZSB0aGF0IGNhbiBiZSByZXNv bHZlZAorCQkgYnkgcnVudGltZSBhbGlhcyBjaGVjay4gICovCisJICAgICAg Ym9vbCBhbGlhc19lZGdlX3AgPSAoZGlyICE9IC0xICYmIGRpciAhPSAyKTsK KwkgICAgICBhZGRfcGFydGl0aW9uX2dyYXBoX2VkZ2UgKHBnLCBqLCBpLAor CQkJCQkoYWxpYXNfZWRnZV9wKSA/ICZhbGlhc19kZHJzIDogTlVMTCk7CisJ ICAgIH0KKwl9CisgICAgfQorICByZXR1cm4gcGc7Cit9CisKKy8qIFNvcnQg cGFydGl0aW9ucyBpbiBQRyBieSBwb3N0IG9yZGVyIGFuZCBzdG9yZSB0aGVt IGluIFBBUlRJVElPTlMuICAqLworCitzdGF0aWMgdm9pZAorc29ydF9wYXJ0 aXRpb25zX2J5X3Bvc3Rfb3JkZXIgKHN0cnVjdCBncmFwaCAqcGcsCisJCQkg ICAgICAgdmVjPHN0cnVjdCBwYXJ0aXRpb24gKj4gKnBhcnRpdGlvbnMpCit7 CisgIGludCBpOworICBzdHJ1Y3QgcGdfdmRhdGEgKmRhdGE7CisKKyAgLyog Tm93IG9yZGVyIHRoZSByZW1haW5pbmcgbm9kZXMgaW4gcG9zdG9yZGVyLiAg Ki8KKyAgcXNvcnQgKHBnLT52ZXJ0aWNlcywgcGctPm5fdmVydGljZXMsIHNp emVvZiAodmVydGV4KSwgcGdjbXApOworICBwYXJ0aXRpb25zLT50cnVuY2F0 ZSAoMCk7CisgIGZvciAoaSA9IDA7IGkgPCBwZy0+bl92ZXJ0aWNlczsgKytp KQorICAgIHsKKyAgICAgIGRhdGEgPSAoc3RydWN0IHBnX3ZkYXRhICopcGct PnZlcnRpY2VzW2ldLmRhdGE7CisgICAgICBpZiAoZGF0YS0+cGFydGl0aW9u KQorCXBhcnRpdGlvbnMtPnNhZmVfcHVzaCAoZGF0YS0+cGFydGl0aW9uKTsK KyAgICB9Cit9CisKKy8qIEdpdmVuIHJlZHVjZWQgZGVwZW5kZW5jZSBncmFw aCBSREcgbWVyZ2Ugc3Ryb25nIGNvbm5lY3RlZCBjb21wb25lbnRzCisgICBv ZiBQQVJUSVRJT05TLiAgSWYgSUdOT1JFX0FMSUFTX1AgaXMgdHJ1ZSwgZGF0 YSBkZXBlbmRlbmNlIGNhdXNlZCBieQorICAgcG9zc2libGUgYWxpYXMgYmV0 d2VlbiByZWZlcmVuY2VzIGlzIGlnbm9yZWQsIGFzIGlmIGl0IGRvZXNuJ3Qg ZXhpc3QKKyAgIGF0IGFsbDsgb3RoZXJ3aXNlIGFsbCBkZXBkZW5kZW5jZXMg YXJlIGNvbnNpZGVyZWQuICAqLworCitzdGF0aWMgdm9pZAorbWVyZ2VfZGVw X3NjY19wYXJ0aXRpb25zIChzdHJ1Y3QgZ3JhcGggKnJkZywKKwkJCSAgdmVj PHN0cnVjdCBwYXJ0aXRpb24gKj4gKnBhcnRpdGlvbnMsCisJCQkgIGJvb2wg aWdub3JlX2FsaWFzX3ApCit7CisgIHN0cnVjdCBwYXJ0aXRpb24gKnBhcnRp dGlvbjEsICpwYXJ0aXRpb24yOworICBzdHJ1Y3QgcGdfdmRhdGEgKmRhdGE7 CisgIGdyYXBoICpwZyA9IGJ1aWxkX3BhcnRpdGlvbl9ncmFwaCAocmRnLCBw YXJ0aXRpb25zLCBpZ25vcmVfYWxpYXNfcCk7CisgIGludCBpLCBqLCBudW1f c2NjcyA9IGdyYXBoZHNfc2NjIChwZywgTlVMTCk7CisKKyAgLyogU3Ryb25n IGNvbm5lY3RlZCBjb21wb2VuZW50IG1lYW5zIGRlcGVuZGVuY2UgY3ljbGUs IHdlIGNhbm5vdCBkaXN0cmlidXRlCisgICAgIHRoZW0uICBTbyBmdXNlIHRo ZW0gdG9nZXRoZXIuICAqLworICBpZiAoKHVuc2lnbmVkKSBudW1fc2NjcyA8 IHBhcnRpdGlvbnMtPmxlbmd0aCAoKSkKKyAgICB7CisgICAgICBmb3IgKGkg PSAwOyBpIDwgbnVtX3NjY3M7ICsraSkKKwl7CisJICBmb3IgKGogPSAwOyBw YXJ0aXRpb25zLT5pdGVyYXRlIChqLCAmcGFydGl0aW9uMSk7ICsraikKKwkg ICAgaWYgKHBnLT52ZXJ0aWNlc1tqXS5jb21wb25lbnQgPT0gaSkKKwkgICAg ICBicmVhazsKKwkgIGZvciAoaiA9IGogKyAxOyBwYXJ0aXRpb25zLT5pdGVy YXRlIChqLCAmcGFydGl0aW9uMik7ICsraikKKwkgICAgaWYgKHBnLT52ZXJ0 aWNlc1tqXS5jb21wb25lbnQgPT0gaSkKKwkgICAgICB7CisJCXBhcnRpdGlv bl9tZXJnZV9pbnRvIChwYXJ0aXRpb24xLCBwYXJ0aXRpb24yLCBGVVNFX1NB TUVfU0NDKTsKKwkJKCpwYXJ0aXRpb25zKVtqXSA9IE5VTEw7CisJCXBhcnRp dGlvbl9mcmVlIChwYXJ0aXRpb24yKTsKKwkJZGF0YSA9IChzdHJ1Y3QgcGdf dmRhdGEgKilwZy0+dmVydGljZXNbal0uZGF0YTsKKwkJZGF0YS0+cGFydGl0 aW9uID0gTlVMTDsKKwkgICAgICB9CisJfQorICAgICAgc29ydF9wYXJ0aXRp b25zX2J5X3Bvc3Rfb3JkZXIgKHBnLCBwYXJ0aXRpb25zKTsKKyAgICB9Cisg IGdjY19hc3NlcnQgKHBhcnRpdGlvbnMtPmxlbmd0aCAoKSA9PSAodW5zaWdu ZWQpbnVtX3NjY3MpOworICBmcmVlX3BhcnRpdGlvbl9ncmFwaF92ZGF0YSAo cGcpOworICBmcmVlX2dyYXBoIChwZyk7Cit9CisKKy8qIENhbGxiYWNrIGZ1 bmN0aW9uIGZvciB0cmF2ZXJzaW5nIGVkZ2UgRSBpbiBncmFwaCBHLiAgREFU QSBpcyBwcml2YXRlCisgICBjYWxsYmFjayBkYXRhLiAgKi8KKworc3RhdGlj IHZvaWQKK3BnX2NvbGxlY3RfYWxpYXNfZGRycyAoc3RydWN0IGdyYXBoICpn LCBzdHJ1Y3QgZ3JhcGhfZWRnZSAqZSwgdm9pZCAqZGF0YSkKK3sKKyAgaW50 IGksIGosIGNvbXBvbmVudDsKKyAgc3RydWN0IHBnX2VkZ2VfY2FsbGJhY2tf ZGF0YSAqY2JkYXRhOworICBzdHJ1Y3QgcGdfZWRhdGEgKmVkYXRhID0gKHN0 cnVjdCBwZ19lZGF0YSAqKSBlLT5kYXRhOworCisgIC8qIElmIHRoZSBlZGdl IGRvZXNuJ3QgaGF2ZSBhdHRhY2hlZCBkYXRhIGRlcGVuZGVuY2UsIGl0IHJl cHJlc2VudHMKKyAgICAgY29tcGlsYXRpb24gdGltZSBrbm93biBkZXBlbmRl bmNlcy4gIFRoaXMgdHlwZSBkZXBlbmRlbmNlIGNhbm5vdAorICAgICBiZSBy ZXNvbHZlZCBieSBydW50aW1lIGFsaWFzIGNoZWNrLiAgKi8KKyAgaWYgKGVk YXRhID09IE5VTEwgfHwgZWRhdGEtPmFsaWFzX2RkcnMubGVuZ3RoICgpID09 IDApCisgICAgcmV0dXJuOworCisgIGNiZGF0YSA9IChzdHJ1Y3QgcGdfZWRn ZV9jYWxsYmFja19kYXRhICopIGRhdGE7CisgIGkgPSBlLT5zcmM7CisgIGog PSBlLT5kZXN0OworICBjb21wb25lbnQgPSBjYmRhdGEtPnZlcnRpY2VzX2Nv bXBvbmVudFtpXTsKKyAgLyogVmVydGljZXMgYXJlIHRvcG9sb2dpY2FsbHkg c29ydGVkIGFjY29yZGluZyB0byBjb21waWxhdGlvbiB0aW1lCisgICAgIGtu b3duIGRlcGVuZGVuY2VzLCBzbyB3ZSBjYW4gYnJlYWsgc3Ryb25nIGNvbm5l Y3RlZCBjb21wb25lbnRzCisgICAgIGJ5IHJlbW92aW5nIGVkZ2VzIG9mIHRo ZSBvcHBvc2l0ZSBkaXJlY3Rpb24sIGkuZSwgZWRnZXMgcG9pbnRpbmcKKyAg ICAgZnJvbSB2ZXJ0aWNlIHdpdGggc21hbGxlciBwb3N0IG51bWJlciB0byB2 ZXJ0aWNlIHdpdGggYmlnZ2VyIHBvc3QKKyAgICAgbnVtYmVyLiAgKi8KKyAg aWYgKGctPnZlcnRpY2VzW2ldLnBvc3QgPCBnLT52ZXJ0aWNlc1tqXS5wb3N0 CisgICAgICAvKiBXZSBvbmx5IG5lZWQgdG8gcmVtb3ZlIGVkZ2VzIGNvbm5l Y3RpbmcgdmVydGljZXMgaW4gdGhlIHNhbWUKKwkgc3Ryb25nIGNvbm5lY3Rl ZCBjb21wb25lbnQgdG8gYnJlYWsgaXQuICAqLworICAgICAgJiYgY29tcG9u ZW50ID09IGNiZGF0YS0+dmVydGljZXNfY29tcG9uZW50W2pdCisgICAgICAv KiBDaGVjayBpZiB3ZSB3YW50IHRvIGJyZWFrIHRoZSBzdHJvbmcgY29ubmVj dGVkIGNvbXBvbmVudCBvciBub3QuICAqLworICAgICAgJiYgIWJpdG1hcF9i aXRfcCAoY2JkYXRhLT5zY2NzX3RvX21lcmdlLCBjb21wb25lbnQpKQorICAg IGNiZGF0YS0+YWxpYXNfZGRycy0+c2FmZV9zcGxpY2UgKGVkYXRhLT5hbGlh c19kZHJzKTsKK30KKworLyogVGhpcyBpcyB0aGUgbWFpbiBmdW5jdGlvbiBi cmVha2luZyBzdHJvbmcgY29uZWN0ZWQgY29tcG9uZW50cyBpbgorICAgUEFS VElUSU9OUyBnaXZpbmcgcmVkdWNlZCBkZXBkZW5kZW5jZSBncmFwaCBSREcu ICBTdG9yZSBkYXRhIGRlcGVuZGVuY2UKKyAgIHJlbGF0aW9ucyBmb3IgcnVu dGltZSBhbGlhcyBjaGVjayBpbiBBTElBU19ERFJTLiAgKi8KKworc3RhdGlj IHZvaWQKK2JyZWFrX2FsaWFzX3NjY19wYXJ0aXRpb25zIChzdHJ1Y3QgZ3Jh cGggKnJkZywKKwkJCSAgICB2ZWM8c3RydWN0IHBhcnRpdGlvbiAqPiAqcGFy dGl0aW9ucywKKwkJCSAgICB2ZWM8ZGRyX3A+ICphbGlhc19kZHJzKQorewor ICBpbnQgaSwgaiwgbnVtX3NjY3MsIG51bV9zY2NzX25vX2FsaWFzOworICAv KiBCdWlsZCBwYXJ0aXRpb24gZGVwZW5kZW5jZSBncmFwaC4gICovCisgIGdy YXBoICpwZyA9IGJ1aWxkX3BhcnRpdGlvbl9ncmFwaCAocmRnLCBwYXJ0aXRp b25zLCBmYWxzZSk7CisKKyAgYWxpYXNfZGRycy0+dHJ1bmNhdGUgKDApOwor ICAvKiBGaW5kIHN0cm9uZyBjb25uZWN0ZWQgY29tcG9uZW50cyBpbiB0aGUg Z3JhcGgsIHdpdGggYWxsIGRlcGVuZGVuY2UgZWRnZXMKKyAgICAgY29uc2lk ZXJlZC4gICovCisgIG51bV9zY2NzID0gZ3JhcGhkc19zY2MgKHBnLCBOVUxM KTsKKyAgLyogQWxsIFNDQ3Mgbm93IGNhbiBiZSBicm9rZW4gYnkgcnVudGlt ZSBhbGlhcyBjaGVja3MgYmVjYXVzZSBTQ0NzIGNhdXNlZCBieQorICAgICBj b21waWxhdGlvbiB0aW1lIGtub3duIGRlcGVuZGVuY2VzIGFyZSBtZXJnZWQg YmVmb3JlIHRoaXMgZnVuY3Rpb24uICAqLworICBpZiAoKHVuc2lnbmVkKSBu dW1fc2NjcyA8IHBhcnRpdGlvbnMtPmxlbmd0aCAoKSkKKyAgICB7CisgICAg ICBzdHJ1Y3QgcGdfZWRnZV9jYWxsYmFja19kYXRhIGNiZGF0YTsKKyAgICAg IGF1dG9fYml0bWFwIHNjY3NfdG9fbWVyZ2U7CisgICAgICBhdXRvX3ZlYzxl bnVtIHBhcnRpdGlvbl90eXBlPiBzY2NfdHlwZXM7CisgICAgICBzdHJ1Y3Qg cGFydGl0aW9uICpwYXJ0aXRpb24sICpmaXJzdDsKKworICAgICAgLyogSWYg YWxsIHBhcml0aW9ucyBpbiBhIFNDQyBoYXMgdGhlIHNhbWUgdHlwZSwgd2Ug Y2FuIHNpbXBseSBtZXJnZSB0aGUKKwkgU0NDLiAgVGhpcyBsb29wIGZpbmRz IG91dCBzdWNoIFNDQ1MgYW5kIHJlY29yZCB0aGVtIGluIGJpdG1hcC4gICov CisgICAgICBiaXRtYXBfc2V0X3JhbmdlIChzY2NzX3RvX21lcmdlLCAwLCAo dW5zaWduZWQpIG51bV9zY2NzKTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBu dW1fc2NjczsgKytpKQorCXsKKwkgIGZvciAoaiA9IDA7IHBhcnRpdGlvbnMt Pml0ZXJhdGUgKGosICZmaXJzdCk7ICsraikKKwkgICAgaWYgKHBnLT52ZXJ0 aWNlc1tqXS5jb21wb25lbnQgPT0gaSkKKwkgICAgICBicmVhazsKKwkgIGZv ciAoKytqOyBwYXJ0aXRpb25zLT5pdGVyYXRlIChqLCAmcGFydGl0aW9uKTsg KytqKQorCSAgICB7CisJICAgICAgaWYgKHBnLT52ZXJ0aWNlc1tqXS5jb21w b25lbnQgIT0gaSkKKwkJY29udGludWU7CisKKwkgICAgICBpZiAoZmlyc3Qt PnR5cGUgIT0gcGFydGl0aW9uLT50eXBlKQorCQl7CisJCSAgYml0bWFwX2Ns ZWFyX2JpdCAoc2Njc190b19tZXJnZSwgaSk7CisJCSAgYnJlYWs7CisJCX0K KwkgICAgfQorCX0KKworICAgICAgLyogSW5pdGlhbGl6ZSBjYWxsYmFjayBk YXRhIGZvciB0cmF2ZXJzaW5nLiAgKi8KKyAgICAgIGNiZGF0YS5zY2NzX3Rv X21lcmdlID0gc2Njc190b19tZXJnZTsKKyAgICAgIGNiZGF0YS5hbGlhc19k ZHJzID0gYWxpYXNfZGRyczsKKyAgICAgIGNiZGF0YS52ZXJ0aWNlc19jb21w b25lbnQgPSBYTkVXVkVDIChpbnQsIHBnLT5uX3ZlcnRpY2VzKTsKKyAgICAg IC8qIFJlY29yZCB0aGUgY29tcG9uZW50IGluZm9ybWF0aW9uIHdoaWNoIHdp bGwgYmUgY29ycnVwdGVkIGJ5IG5leHQKKwkgZ3JhcGggc2NjIGZpbmRpbmcg Y2FsbC4gICovCisgICAgICBmb3IgKGkgPSAwOyBpIDwgcGctPm5fdmVydGlj ZXM7ICsraSkKKwljYmRhdGEudmVydGljZXNfY29tcG9uZW50W2ldID0gcGct PnZlcnRpY2VzW2ldLmNvbXBvbmVudDsKKworICAgICAgLyogQ29sbGVjdCBk YXRhIGRlcGVuZGVuY2VzIGZvciBydW50aW1lIGFsaWFzIGNoZWNrcyB0byBi cmVhayBTQ0NzLiAgKi8KKyAgICAgIGlmIChiaXRtYXBfY291bnRfYml0cyAo c2Njc190b19tZXJnZSkgIT0gKHVuc2lnbmVkKSBudW1fc2NjcykKKwl7CisJ ICAvKiBSdW4gU0NDIGZpbmRpbmcgYWxnb3JpdGhtIGFnYWluLCB3aXRoIGFs aWFzIGRlcGVuZGVuY2UgZWRnZXMKKwkgICAgIHNraXBwZWQuICBUaGlzIGlz IHRvIHRvcG9sb2dpY2FsbHkgc29ydCBwYXJpdGlvbnMgYWNjb3JkaW5nIHRv CisJICAgICBjb21waWxhdGlvbiB0aW1lIGtub3duIGRlcGVuZGVuY2UuICBO b3RlIHRoZSB0b3BvbG9naWNhbCBvcmRlcgorCSAgICAgaXMgc3RvcmVkIGlu IHRoZSBmb3JtIG9mIHBnJ3MgcG9zdCBvcmRlciBudW1iZXIuICAqLworCSAg bnVtX3NjY3Nfbm9fYWxpYXMgPSBncmFwaGRzX3NjYyAocGcsIE5VTEwsIHBn X3NraXBfYWxpYXNfZWRnZSk7CisJICBnY2NfYXNzZXJ0IChwYXJ0aXRpb25z LT5sZW5ndGggKCkgPT0gKHVuc2lnbmVkKSBudW1fc2Njc19ub19hbGlhcyk7 CisJICAvKiBXaXRoIHRvcG9sb2dpY2FsIG9yZGVyLCB3ZSBjYW4gY29uc3Ry dWN0IHR3byBzdWJncmFwaHMgTCBhbmQgUi4KKwkgICAgIEwgY29udGFpbnMg ZWRnZSA8eCwgeT4gd2hlcmUgeCA8IHkgaW4gdGVybXMgb2YgcG9zdCBvcmRl ciwgd2hpbGUKKwkgICAgIFIgY29udGFpbnMgZWRnZSA8eCwgeT4gd2hlcmUg eCA+IHkuICBFZGdlcyBmb3IgY29tcGlsYXRpb24gdGltZQorCSAgICAga25v d24gZGVwZW5kZW5jZSBhbGwgZmFsbCBpbiBSLCBzbyB3ZSBicmVhayBTQ0Nz IGJ5IHJlbW92aW5nIGFsbAorCSAgICAgKGFsaWFzKSBlZGdlcyBvZiBpbiBz dWJncmFwaCBMLiAgKi8KKwkgIGZvcl9lYWNoX2VkZ2UgKHBnLCBwZ19jb2xs ZWN0X2FsaWFzX2RkcnMsICZjYmRhdGEpOworCX0KKworICAgICAgLyogRm9y IFNDQyB0aGF0IGRvZXNuJ3QgbmVlZCB0byBiZSBicm9rZW4sIG1lcmdlIGl0 LiAgKi8KKyAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fc2NjczsgKytpKQor CXsKKwkgIGlmICghYml0bWFwX2JpdF9wIChzY2NzX3RvX21lcmdlLCBpKSkK KwkgICAgY29udGludWU7CisKKwkgIGZvciAoaiA9IDA7IHBhcnRpdGlvbnMt Pml0ZXJhdGUgKGosICZmaXJzdCk7ICsraikKKwkgICAgaWYgKGNiZGF0YS52 ZXJ0aWNlc19jb21wb25lbnRbal0gPT0gaSkKKwkgICAgICBicmVhazsKKwkg IGZvciAoKytqOyBwYXJ0aXRpb25zLT5pdGVyYXRlIChqLCAmcGFydGl0aW9u KTsgKytqKQorCSAgICB7CisJICAgICAgc3RydWN0IHBnX3ZkYXRhICpkYXRh OworCisJICAgICAgaWYgKGNiZGF0YS52ZXJ0aWNlc19jb21wb25lbnRbal0g IT0gaSkKKwkJY29udGludWU7CisKKwkgICAgICBwYXJ0aXRpb25fbWVyZ2Vf aW50byAoZmlyc3QsIHBhcnRpdGlvbiwgRlVTRV9TQU1FX1NDQyk7CisJICAg ICAgKCpwYXJ0aXRpb25zKVtqXSA9IE5VTEw7CisJICAgICAgcGFydGl0aW9u X2ZyZWUgKHBhcnRpdGlvbik7CisJICAgICAgZGF0YSA9IChzdHJ1Y3QgcGdf dmRhdGEgKilwZy0+dmVydGljZXNbal0uZGF0YTsKKwkgICAgICBnY2NfYXNz ZXJ0IChkYXRhLT5pZCA9PSBqKTsKKwkgICAgICBkYXRhLT5wYXJ0aXRpb24g PSBOVUxMOworCSAgICB9CisJfQorICAgIH0KKworICBzb3J0X3BhcnRpdGlv bnNfYnlfcG9zdF9vcmRlciAocGcsIHBhcnRpdGlvbnMpOworICBmcmVlX3Bh cnRpdGlvbl9ncmFwaF92ZGF0YSAocGcpOworICBmb3JfZWFjaF9lZGdlIChw ZywgZnJlZV9wYXJ0aXRpb25fZ3JhcGhfZWRhdGFfY2IsIE5VTEwpOworICBm cmVlX2dyYXBoIChwZyk7CisKKyAgaWYgKGR1bXBfZmlsZSAmJiAoZHVtcF9m bGFncyAmIFRERl9ERVRBSUxTKSkKKyAgICB7CisgICAgICBmcHJpbnRmIChk dW1wX2ZpbGUsICJQb3NzaWJsZSBhbGlhcyBkYXRhIGRlcGVuZGVuY2UgdG8g YnJlYWs6XG4iKTsKKyAgICAgIGR1bXBfZGF0YV9kZXBlbmRlbmNlX3JlbGF0 aW9ucyAoZHVtcF9maWxlLCAqYWxpYXNfZGRycyk7CisgICAgfQorfQorCisv KiBDb21wdXRlIGFuZCByZXR1cm4gYW4gZXhwcmVzc2lvbiB3aG9zZSB2YWx1 ZSBpcyB0aGUgc2VnbWVudCBsZW5ndGggd2hpY2gKKyAgIHdpbGwgYmUgYWNj ZXNzZWQgYnkgRFIgaW4gTklURVJTIGl0ZXJhdGlvbnMuICAqLworCitzdGF0 aWMgdHJlZQorZGF0YV9yZWZfc2VnbWVudF9zaXplIChzdHJ1Y3QgZGF0YV9y ZWZlcmVuY2UgKmRyLCB0cmVlIG5pdGVycykKK3sKKyAgdHJlZSBzZWdtZW50 X2xlbmd0aDsKKworICBpZiAoaW50ZWdlcl96ZXJvcCAoRFJfU1RFUCAoZHIp KSkKKyAgICBzZWdtZW50X2xlbmd0aCA9IFRZUEVfU0laRV9VTklUIChUUkVF X1RZUEUgKERSX1JFRiAoZHIpKSk7CisgIGVsc2UKKyAgICBzZWdtZW50X2xl bmd0aCA9IHNpemVfYmlub3AgKE1VTFRfRVhQUiwKKwkJCQkgZm9sZF9jb252 ZXJ0IChzaXpldHlwZSwgRFJfU1RFUCAoZHIpKSwKKwkJCQkgZm9sZF9jb252 ZXJ0IChzaXpldHlwZSwgbml0ZXJzKSk7CisKKyAgcmV0dXJuIHNlZ21lbnRf bGVuZ3RoOworfQorCisvKiBSZXR1cm4gdHJ1ZSBpZiBMT09QJ3MgbGF0Y2gg aXMgZG9taW5hdGVkIGJ5IHN0YXRlbWVudCBmb3IgZGF0YSByZWZlcmVuY2UK KyAgIERSLiAgKi8KKworc3RhdGljIGlubGluZSBib29sCitsYXRjaF9kb21p bmF0ZWRfYnlfZGF0YV9yZWYgKHN0cnVjdCBsb29wICpsb29wLCBkYXRhX3Jl ZmVyZW5jZSAqZHIpCit7CisgIHJldHVybiBkb21pbmF0ZWRfYnlfcCAoQ0RJ X0RPTUlOQVRPUlMsIHNpbmdsZV9leGl0IChsb29wKS0+c3JjLAorCQkJIGdp bXBsZV9iYiAoRFJfU1RNVCAoZHIpKSk7Cit9CisKKy8qIENvbXB1dGUgYWxp YXMgY2hlY2sgcGFpcnMgYW5kIHN0b3JlIHRoZW0gaW4gQ09NUF9BTElBU19Q QUlSUyBmb3IgTE9PUCdzCisgICBkYXRhIGRlcGVuZGVuY2UgcmVsYXRpb25z IEFMSUFTX0REUlMuICAqLworCitzdGF0aWMgdm9pZAorY29tcHV0ZV9hbGlh c19jaGVja19wYWlycyAoc3RydWN0IGxvb3AgKmxvb3AsIHZlYzxkZHJfcD4g KmFsaWFzX2RkcnMsCisJCQkgICB2ZWM8ZHJfd2l0aF9zZWdfbGVuX3BhaXJf dD4gKmNvbXBfYWxpYXNfcGFpcnMpCit7CisgIHVuc2lnbmVkIGludCBpOwor ICB1bnNpZ25lZCBIT1NUX1dJREVfSU5UIGZhY3RvciA9IDE7CisgIHRyZWUg bml0ZXJzX3BsdXNfb25lLCBuaXRlcnMgPSBudW1iZXJfb2ZfbGF0Y2hfZXhl Y3V0aW9ucyAobG9vcCk7CisKKyAgZ2NjX2Fzc2VydCAobml0ZXJzICE9IE5V TExfVFJFRSAmJiBuaXRlcnMgIT0gY2hyZWNfZG9udF9rbm93KTsKKyAgbml0 ZXJzID0gZm9sZF9jb252ZXJ0IChzaXpldHlwZSwgbml0ZXJzKTsKKyAgbml0 ZXJzX3BsdXNfb25lID0gc2l6ZV9iaW5vcCAoUExVU19FWFBSLCBuaXRlcnMs IHNpemVfb25lX25vZGUpOworCisgIGlmIChkdW1wX2ZpbGUgJiYgKGR1bXBf ZmxhZ3MgJiBUREZfREVUQUlMUykpCisgICAgZnByaW50ZiAoZHVtcF9maWxl LCAiQ3JlYXRpbmcgYWxpYXMgY2hlY2sgcGFpcnM6XG4iKTsKKworICAvKiBJ dGVyYXRlIGFsbCBkYXRhIGRlcGVuZGVuY2UgcmVsYXRpb25zIGFuZCBjb21w dXRlIGFsaWFzIGNoZWNrIHBhaXJzLiAgKi8KKyAgZm9yIChpID0gMDsgaSA8 IGFsaWFzX2RkcnMtPmxlbmd0aCAoKTsgaSsrKQorICAgIHsKKyAgICAgIGRk cl9wIGRkciA9ICgqYWxpYXNfZGRycylbaV07CisgICAgICBzdHJ1Y3QgZGF0 YV9yZWZlcmVuY2UgKmRyX2EgPSBERFJfQSAoZGRyKTsKKyAgICAgIHN0cnVj dCBkYXRhX3JlZmVyZW5jZSAqZHJfYiA9IEREUl9CIChkZHIpOworICAgICAg dHJlZSBzZWdfbGVuZ3RoX2EsIHNlZ19sZW5ndGhfYjsKKyAgICAgIGludCBj b21wX3JlcyA9IGRhdGFfcmVmX2NvbXBhcmVfdHJlZSAoRFJfQkFTRV9BRERS RVNTIChkcl9hKSwKKwkJCQkJICAgIERSX0JBU0VfQUREUkVTUyAoZHJfYikp OworCisgICAgICBpZiAoY29tcF9yZXMgPT0gMCkKKwljb21wX3JlcyA9IGRh dGFfcmVmX2NvbXBhcmVfdHJlZSAoRFJfT0ZGU0VUIChkcl9hKSwgRFJfT0ZG U0VUIChkcl9iKSk7CisgICAgICBnY2NfYXNzZXJ0IChjb21wX3JlcyAhPSAw KTsKKworICAgICAgaWYgKGxhdGNoX2RvbWluYXRlZF9ieV9kYXRhX3JlZiAo bG9vcCwgZHJfYSkpCisJc2VnX2xlbmd0aF9hID0gZGF0YV9yZWZfc2VnbWVu dF9zaXplIChkcl9hLCBuaXRlcnNfcGx1c19vbmUpOworICAgICAgZWxzZQor CXNlZ19sZW5ndGhfYSA9IGRhdGFfcmVmX3NlZ21lbnRfc2l6ZSAoZHJfYSwg bml0ZXJzKTsKKworICAgICAgaWYgKGxhdGNoX2RvbWluYXRlZF9ieV9kYXRh X3JlZiAobG9vcCwgZHJfYikpCisJc2VnX2xlbmd0aF9iID0gZGF0YV9yZWZf c2VnbWVudF9zaXplIChkcl9iLCBuaXRlcnNfcGx1c19vbmUpOworICAgICAg ZWxzZQorCXNlZ19sZW5ndGhfYiA9IGRhdGFfcmVmX3NlZ21lbnRfc2l6ZSAo ZHJfYiwgbml0ZXJzKTsKKworICAgICAgZHJfd2l0aF9zZWdfbGVuX3BhaXJf dCBkcl93aXRoX3NlZ19sZW5fcGFpcgorCSAgKGRyX3dpdGhfc2VnX2xlbiAo ZHJfYSwgc2VnX2xlbmd0aF9hKSwKKwkgICBkcl93aXRoX3NlZ19sZW4gKGRy X2IsIHNlZ19sZW5ndGhfYikpOworCisgICAgICAvKiBDYW5vbmljYWxpemUg cGFpcnMgYnkgc29ydGluZyB0aGUgdHdvIERSIG1lbWJlcnMuICAqLworICAg ICAgaWYgKGNvbXBfcmVzID4gMCkKKwlzdGQ6OnN3YXAgKGRyX3dpdGhfc2Vn X2xlbl9wYWlyLmZpcnN0LCBkcl93aXRoX3NlZ19sZW5fcGFpci5zZWNvbmQp OworCisgICAgICBjb21wX2FsaWFzX3BhaXJzLT5zYWZlX3B1c2ggKGRyX3dp dGhfc2VnX2xlbl9wYWlyKTsKKyAgICB9CisKKyAgaWYgKHRyZWVfZml0c191 aHdpX3AgKG5pdGVycykpCisgICAgZmFjdG9yID0gdHJlZV90b191aHdpIChu aXRlcnMpOworCisgIC8qIFBydW5lIGFsaWFzIGNoZWNrIHBhaXJzLiAgKi8K KyAgcHJ1bmVfcnVudGltZV9hbGlhc190ZXN0X2xpc3QgKGNvbXBfYWxpYXNf cGFpcnMsIGZhY3Rvcik7CisgIGlmIChkdW1wX2ZpbGUgJiYgKGR1bXBfZmxh Z3MgJiBUREZfREVUQUlMUykpCisgICAgZnByaW50ZiAoZHVtcF9maWxlLAor CSAgICAgIkltcHJvdmVkIG51bWJlciBvZiBhbGlhcyBjaGVja3MgZnJvbSAl ZCB0byAlZFxuIiwKKwkgICAgIGFsaWFzX2RkcnMtPmxlbmd0aCAoKSwgY29t cF9hbGlhc19wYWlycy0+bGVuZ3RoICgpKTsKK30KKworLyogR2l2ZW4gZGF0 YSBkZXBlbmRlbmNlIHJlbGF0aW9ucyBpbiBBTElBU19ERFJTLCBnZW5lcmF0 ZSBydW50aW1lIGFsaWFzCisgICBjaGVja3MgYW5kIHZlcnNpb24gTE9PUCB1 bmRlciBjb25kaXRpb24gb2YgdGhlc2UgcnVudGltZSBhbGlhcyBjaGVja3Mu ICAqLworCitzdGF0aWMgdm9pZAordmVyc2lvbl9sb29wX2J5X2FsaWFzX2No ZWNrIChzdHJ1Y3QgbG9vcCAqbG9vcCwgdmVjPGRkcl9wPiAqYWxpYXNfZGRy cykKK3sKKyAgdW5zaWduZWQgdGhlbl9wcm9iLCBlbHNlX3Byb2IsIHRoZW5f c2NhbGUsIGVsc2Vfc2NhbGU7CisgIGJhc2ljX2Jsb2NrIGNvbmRfYmI7Cisg IHN0cnVjdCBsb29wICpubG9vcDsKKyAgdHJlZSBsaHMsIGFyZzAsIGNvbmRf ZXhwciA9IE5VTExfVFJFRTsKKyAgZ2ltcGxlX3NlcSBjb25kX3N0bXRzID0g TlVMTDsKKyAgZ2ltcGxlICpzdG10OworICBhdXRvX3ZlYzxkcl93aXRoX3Nl Z19sZW5fcGFpcl90PiBjb21wX2FsaWFzX3BhaXJzOworCisgIC8qIEdlbmVy YXRlIGNvZGUgZm9yIHJ1bnRpbWUgYWxpYXMgY2hlY2tzIGlmIG5lY2Vzc2Fy eS4gICovCisgIGlmIChhbGlhc19kZHJzLT5sZW5ndGggKCkgPiAwKQorICAg IHsKKyAgICAgIGNvbXB1dGVfYWxpYXNfY2hlY2tfcGFpcnMgKGxvb3AsIGFs aWFzX2RkcnMsICZjb21wX2FsaWFzX3BhaXJzKTsKKyAgICAgIGNyZWF0ZV9y dW50aW1lX2FsaWFzX2NoZWNrcyAobG9vcCwgJmNvbXBfYWxpYXNfcGFpcnMs ICZjb25kX2V4cHIpOworICAgICAgY29uZF9leHByID0gZm9yY2VfZ2ltcGxl X29wZXJhbmRfMSAoY29uZF9leHByLCAmY29uZF9zdG10cywKKwkJCQkJICBp c19naW1wbGVfY29uZGV4cHIsIE5VTExfVFJFRSk7CisgICAgICB0aGVuX3By b2IgPSA5ICogUkVHX0JSX1BST0JfQkFTRSAvIDEwOworICAgICAgZWxzZV9w cm9iID0gUkVHX0JSX1BST0JfQkFTRSAtIHRoZW5fcHJvYjsKKyAgICAgIHRo ZW5fc2NhbGUgPSA5ICogUkVHX0JSX1BST0JfQkFTRSAvIDEwOworICAgICAg ZWxzZV9zY2FsZSA9IFJFR19CUl9QUk9CX0JBU0UgLSB0aGVuX3NjYWxlOwor ICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGNvbmRfZXhwciA9IGJvb2xl YW5fdHJ1ZV9ub2RlOworICAgICAgLyogVXNlIFJFR19CUl9QUk9CX0JBU0Ug Zm9yIGJvdGggYnJhbmNoZXMgc2luY2Ugb25seSBvbmUgYnJhbmNoCisJIHdp bGwgYmUga2VwdCBpbiB0aGUgZW5kLiAgKi8KKyAgICAgIHRoZW5fcHJvYiA9 IFJFR19CUl9QUk9CX0JBU0U7CisgICAgICBlbHNlX3Byb2IgPSBSRUdfQlJf UFJPQl9CQVNFOworICAgICAgdGhlbl9zY2FsZSA9IFJFR19CUl9QUk9CX0JB U0U7CisgICAgICBlbHNlX3NjYWxlID0gUkVHX0JSX1BST0JfQkFTRTsKKyAg ICB9CisKKyAgLyogRGVwZW5kIG9uIHZlY3Rvcml6ZXIgdG8gZm9sZCBJRk5f TE9PUF9ESVNUX0FMSUFTLiAgKi8KKyAgaWYgKGZsYWdfdHJlZV9sb29wX3Zl Y3Rvcml6ZSkKKyAgICB7CisgICAgICAvKiBHZW5lcmF0ZSBpbnRlcm5hbCBm dW5jdGlvbiBjYWxsIGZvciBsb29wIGRpc3RyaWJ1dGlvbiBhbGlhcyBjaGVj ay4gICovCisgICAgICBhcmcwID0gYnVpbGRfaW50X2NzdCAoaW50ZWdlcl90 eXBlX25vZGUsIGxvb3AtPm51bSk7CisgICAgICBzdG10ID0gZ2ltcGxlX2J1 aWxkX2NhbGxfaW50ZXJuYWwgKElGTl9MT09QX0RJU1RfQUxJQVMsCisJCQkJ CSAyLCBhcmcwLCBjb25kX2V4cHIpOworICAgICAgbGhzID0gbWFrZV9zc2Ff bmFtZSAoYm9vbGVhbl90eXBlX25vZGUpOworICAgICAgZ2ltcGxlX2NhbGxf c2V0X2xocyAoc3RtdCwgbGhzKTsKKyAgICAgIGdpbXBsZV9zZXFfYWRkX3N0 bXQgKCZjb25kX3N0bXRzLCBzdG10KTsKKyAgICB9CisgIGVsc2UKKyAgICBs aHMgPSBjb25kX2V4cHI7CisKKyAgaWYgKGR1bXBfZmlsZSAmJiAoZHVtcF9m bGFncyAmIFRERl9ERVRBSUxTKSkKKyAgICBmcHJpbnRmIChkdW1wX2ZpbGUs CisJICAgICAiVmVyc2lvbiBsb29wIDwlZD4gd2l0aCBydW50aW1lIGFsaWFz IGNoZWNrXG4iLCBsb29wLT5udW0pOworCisgIGluaXRpYWxpemVfb3JpZ2lu YWxfY29weV90YWJsZXMgKCk7CisgIG5sb29wID0gbG9vcF92ZXJzaW9uIChs b29wLCBsaHMsICZjb25kX2JiLCB0aGVuX3Byb2IsCisJCQllbHNlX3Byb2Is IHRoZW5fc2NhbGUsIGVsc2Vfc2NhbGUsIHRydWUpOworICBmcmVlX29yaWdp bmFsX2NvcHlfdGFibGVzICgpOworICAvKiBSZWNvcmQgdGhlIG9yaWdpbmFs IGxvb3AgbnVtYmVyIGluIG5ld2x5IGdlbmVyYXRlZCBsb29wcy4gICovCisg IG5sb29wLT5sZGlzdF9hbGlhc19pZCA9IGxvb3AtPm51bTsKKyAgbmxvb3At PmRvbnRfdmVjdG9yaXplID0gdHJ1ZTsKKyAgbmxvb3AtPmZvcmNlX3ZlY3Rv cml6ZSA9IGZhbHNlOworCisgIGlmIChjb25kX3N0bXRzKQorICAgIHsKKyAg ICAgIGdpbXBsZV9zdG10X2l0ZXJhdG9yIGNvbmRfZ3NpID0gZ3NpX2xhc3Rf YmIgKGNvbmRfYmIpOworICAgICAgZ3NpX2luc2VydF9zZXFfYmVmb3JlICgm Y29uZF9nc2ksIGNvbmRfc3RtdHMsIEdTSV9TQU1FX1NUTVQpOworICAgIH0K KyAgdXBkYXRlX3NzYSAoVE9ET191cGRhdGVfc3NhKTsKK30KKworLyogUmV0 dXJuIHRydWUgaWYgbG9vcCB2ZXJzaW9uaW5nIGlzIG5lZWRlZCB0byBkaXN0 cnVidXRlIFBBUlRJVElPTlMuCisgICBBTElBU19ERFJTIGFyZSBkYXRhIGRl cGVuZGVuY2UgcmVsYXRpb25zIGZvciBydW50aW1lIGFsaWFzIGNoZWNrLiAg Ki8KKworc3RhdGljIGlubGluZSBib29sCit2ZXJzaW9uX2Zvcl9kaXN0cmli dXRpb25fcCAodmVjPHN0cnVjdCBwYXJ0aXRpb24gKj4gKnBhcnRpdGlvbnMs CisJCQkgICAgdmVjPGRkcl9wPiAqYWxpYXNfZGRycykKK3sKKyAgdW5zaWdu ZWQgaTsKKyAgc3RydWN0IHBhcnRpdGlvbiAqcGFydGl0aW9uOworCisgIC8q IE5vIG5lZWQgdG8gdmVyc2lvbiBsb29wIGlmIHdlIGhhdmUgb25seSBvbmUg cGFydGl0aW9uLiAgKi8KKyAgaWYgKHBhcnRpdGlvbnMtPmxlbmd0aCAoKSA9 PSAxKQorICAgIHJldHVybiBmYWxzZTsKKworICAvKiBOZWVkIHRvIHZlcnNp b24gbG9vcCBpZiBydW50aW1lIGFsaWFzIGNoZWNrIGlzIG5lY2Vzc2FyeS4g ICovCisgIGlmIChhbGlhc19kZHJzLT5sZW5ndGggKCkgPiAwKQorICAgIHJl dHVybiB0cnVlOworCisgIC8qIERvbid0IHZlcnNpb24gdGhlIGxvb3Agd2l0 aCBjYWxsIHRvIElGTl9MT09QX0RJU1RfQUxJQVMgaWYKKyAgICAgdmVjdG9y aXplciBpcyBub3QgZW5hYmxlIGJlY2F1c2Ugbm8gb3RoZXIgcGFzcyBjYW4g Zm9sZCBpdC4gICovCisgIGlmICghZmxhZ190cmVlX2xvb3BfdmVjdG9yaXpl KQorICAgIHJldHVybiBmYWxzZTsKKworICAvKiBEb24ndCB2ZXJzaW9uIGxv b3AgaWYgYW55IHBhcnRpdGlvbiBpcyBidWlsdGluLiAgKi8KKyAgZm9yIChp ID0gMDsgcGFydGl0aW9ucy0+aXRlcmF0ZSAoaSwgJnBhcnRpdGlvbik7ICsr aSkKKyAgICB7CisgICAgICBpZiAocGFydGl0aW9uLT5raW5kICE9IFBLSU5E X05PUk1BTCkKKwlicmVhazsKKyAgICB9CisgIHJldHVybiAoaSA9PSBwYXJ0 aXRpb25zLT5sZW5ndGggKCkpOworfQorCisvKiBGdXNlIGFsbCBwYXJ0aXRp b25zIGlmIG5lY2Vzc2FyeSBiZWZvcmUgZmluYWxpemluZyBkaXN0cmlidXRp b24uICAqLworCitzdGF0aWMgdm9pZAorZmluYWxpemVfcGFydGl0aW9ucyAo dmVjPHN0cnVjdCBwYXJ0aXRpb24gKj4gKnBhcnRpdGlvbnMsCisJCSAgICAg dmVjPGRkcl9wPiAqYWxpYXNfZGRycykKK3sKKyAgdW5zaWduZWQgaTsKKyAg c3RydWN0IHBhcnRpdGlvbiAqYSwgKnBhcnRpdGlvbjsKKworICBpZiAocGFy dGl0aW9ucy0+bGVuZ3RoICgpID09IDEKKyAgICAgIHx8IGFsaWFzX2RkcnMt Pmxlbmd0aCAoKSA+IDApCisgICAgcmV0dXJuOworCisgIGEgPSAoKnBhcnRp dGlvbnMpWzBdOworICBpZiAoYS0+a2luZCAhPSBQS0lORF9OT1JNQUwpCisg ICAgcmV0dXJuOworCisgIGZvciAoaSA9IDE7IHBhcnRpdGlvbnMtPml0ZXJh dGUgKGksICZwYXJ0aXRpb24pOyArK2kpCisgICAgeworICAgICAgLyogRG9u J3QgZnVzZSBpZiBwYXJ0aXRpb24gaGFzIGRpZmZlcmVudCB0eXBlIG9yIGl0 IGlzIGEgYnVpbHRpbi4gICovCisgICAgICBpZiAocGFydGl0aW9uLT50eXBl ICE9IGEtPnR5cGUKKwkgIHx8IHBhcnRpdGlvbi0+a2luZCAhPSBQS0lORF9O T1JNQUwpCisJcmV0dXJuOworICAgIH0KKworICAvKiBGdXNlIGFsbCBwYXJ0 aXRpb25zLiAgKi8KKyAgZm9yIChpID0gMTsgcGFydGl0aW9ucy0+aXRlcmF0 ZSAoaSwgJnBhcnRpdGlvbik7ICsraSkKKyAgICB7CisgICAgICBwYXJ0aXRp b25fbWVyZ2VfaW50byAoYSwgcGFydGl0aW9uLCBGVVNFX0ZJTkFMSVpFKTsK KyAgICAgIHBhcnRpdGlvbl9mcmVlIChwYXJ0aXRpb24pOworICAgIH0KKyAg cGFydGl0aW9ucy0+dHJ1bmNhdGUgKDEpOworfQorCisvKiBEaXN0cmlidXRl cyB0aGUgY29kZSBmcm9tIExPT1AgaW4gc3VjaCBhIHdheSB0aGF0IHByb2R1 Y2VyIHN0YXRlbWVudHMKKyAgIGFyZSBwbGFjZWQgYmVmb3JlIGNvbnN1bWVy IHN0YXRlbWVudHMuICBUcmllcyB0byBzZXBhcmF0ZSBvbmx5IHRoZQorICAg c3RhdGVtZW50cyBmcm9tIFNUTVRTIGludG8gc2VwYXJhdGUgbG9vcHMuICBS ZXR1cm5zIHRoZSBudW1iZXIgb2YKKyAgIGRpc3RyaWJ1dGVkIGxvb3BzLiAg U2V0IE5CX0NBTExTIHRvIG51bWJlciBvZiBnZW5lcmF0ZWQgYnVpbHRpbiBj YWxscy4KKyAgIFNldCAqREVTVFJPWV9QIHRvIHdoZXRoZXIgTE9PUCBuZWVk cyB0byBiZSBkZXN0cm95ZWQuICAqLwogCiBzdGF0aWMgaW50CiBkaXN0cmli dXRlX2xvb3AgKHN0cnVjdCBsb29wICpsb29wLCB2ZWM8Z2ltcGxlICo+IHN0 bXRzLApAQCAtMTY3Miw4ICsyMzU4LDYgQEAgZGlzdHJpYnV0ZV9sb29wIChz dHJ1Y3QgbG9vcCAqbG9vcCwgdmVjPGdpbXBsZSAqPiBzdG10cywKICAgcGFy dGl0aW9uICpwYXJ0aXRpb247CiAgIGJvb2wgYW55X2J1aWx0aW47CiAgIGlu dCBpLCBuYnA7Ci0gIGdyYXBoICpwZyA9IE5VTEw7Ci0gIGludCBudW1fc2Nj cyA9IDE7CiAKICAgKmRlc3Ryb3lfcCA9IGZhbHNlOwogICAqbmJfY2FsbHMg PSAwOwpAQCAtMTcyMSw2ICsyNDA1LDExIEBAIGRpc3RyaWJ1dGVfbG9vcCAo c3RydWN0IGxvb3AgKmxvb3AsIHZlYzxnaW1wbGUgKj4gc3RtdHMsCiAgIGF1 dG9fdmVjPHN0cnVjdCBwYXJ0aXRpb24gKiwgMz4gcGFydGl0aW9uczsKICAg cmRnX2J1aWxkX3BhcnRpdGlvbnMgKHJkZywgc3RtdHMsICZwYXJ0aXRpb25z KTsKIAorICAvKiBDYW4ndCBkbyBydW50aW1lIGFsaWFzIGNoZWNrIGlmIGxv b3Agbml0ZXIgaXMgdW5rbm93bi4gICovCisgIHRyZWUgbml0ZXJzID0gbnVt YmVyX29mX2xhdGNoX2V4ZWN1dGlvbnMgKGxvb3ApOworICBib29sIHJ0X2Fs aWFzX2NoZWNrX3AgPSAobml0ZXJzICE9IE5VTExfVFJFRSAmJiBuaXRlcnMg IT0gY2hyZWNfZG9udF9rbm93KTsKKyAgYXV0b192ZWM8ZGRyX3A+IGFsaWFz X2RkcnM7CisKICAgYXV0b19iaXRtYXAgc3RtdF9pbl9hbGxfcGFydGl0aW9u czsKICAgYml0bWFwX2NvcHkgKHN0bXRfaW5fYWxsX3BhcnRpdGlvbnMsIHBh cnRpdGlvbnNbMF0tPnN0bXRzKTsKICAgZm9yIChpID0gMTsgcGFydGl0aW9u cy5pdGVyYXRlIChpLCAmcGFydGl0aW9uKTsgKytpKQpAQCAtMTgwNyw3OSAr MjQ5NiwxNCBAQCBkaXN0cmlidXRlX2xvb3AgKHN0cnVjdCBsb29wICpsb29w LCB2ZWM8Z2ltcGxlICo+IHN0bXRzLAogICAvKiBCdWlsZCB0aGUgcGFydGl0 aW9uIGRlcGVuZGVuY3kgZ3JhcGguICAqLwogICBpZiAocGFydGl0aW9ucy5s ZW5ndGggKCkgPiAxKQogICAgIHsKLSAgICAgIHBnID0gbmV3X2dyYXBoIChw YXJ0aXRpb25zLmxlbmd0aCAoKSk7Ci0gICAgICBzdHJ1Y3QgcGdkYXRhIHsK LQkgIHN0cnVjdCBwYXJ0aXRpb24gKnBhcnRpdGlvbjsKLSAgICAgIH07Ci0j ZGVmaW5lIFBHREFUQShpKSAoKHBnZGF0YSAqKShwZy0+dmVydGljZXNbaV0u ZGF0YSkpCi0gICAgICBmb3IgKGkgPSAwOyBwYXJ0aXRpb25zLml0ZXJhdGUg KGksICZwYXJ0aXRpb24pOyArK2kpCi0JewotCSAgdmVydGV4ICp2ID0gJnBn LT52ZXJ0aWNlc1tpXTsKLQkgIHBnZGF0YSAqZGF0YSA9IG5ldyBwZ2RhdGE7 Ci0JICAvKiBGSVhNRSAtIGxlYWtzLiAgKi8KLQkgIHYtPmRhdGEgPSBkYXRh OwotCSAgZGF0YS0+cGFydGl0aW9uID0gcGFydGl0aW9uOwotCX0KLSAgICAg IHN0cnVjdCBwYXJ0aXRpb24gKnBhcnRpdGlvbjEsICpwYXJ0aXRpb24yOwot ICAgICAgZm9yIChpID0gMDsgcGFydGl0aW9ucy5pdGVyYXRlIChpLCAmcGFy dGl0aW9uMSk7ICsraSkKLQlmb3IgKGludCBqID0gaSArIDE7IHBhcnRpdGlv bnMuaXRlcmF0ZSAoaiwgJnBhcnRpdGlvbjIpOyArK2opCi0JICB7Ci0JICAg IC8qIGRlcGVuZGVuY2UgZGlyZWN0aW9uIC0gMCBpcyBubyBkZXBlbmRlbmNl LCAtMSBpcyBiYWNrLAotCSAgICAgICAxIGlzIGZvcnRoLCAyIGlzIGJvdGgg KHdlIGNhbiBzdG9wIHRoZW4sIG1lcmdpbmcgd2lsbCBvY2N1cikuICAqLwot CSAgICBpbnQgZGlyID0gcGdfYWRkX2RlcGVuZGVuY2VfZWRnZXMgKHJkZywg ZGlyLAotCQkJCQkgICAgICAgcGFydGl0aW9uMS0+ZGF0YXJlZnMsCi0JCQkJ CSAgICAgICBwYXJ0aXRpb24yLT5kYXRhcmVmcyk7Ci0JICAgIGlmIChkaXIg PT0gMSB8fCBkaXIgPT0gMikKLQkgICAgICBhZGRfZWRnZSAocGcsIGksIGop OwotCSAgICBpZiAoZGlyID09IC0xIHx8IGRpciA9PSAyKQotCSAgICAgIGFk ZF9lZGdlIChwZywgaiwgaSk7Ci0JICB9Ci0KLSAgICAgIC8qIEFkZCBlZGdl cyB0byB0aGUgcmVkdWN0aW9uIHBhcnRpdGlvbiAoaWYgYW55KSB0byBmb3Jj ZSBpdCBsYXN0LiAgKi8KLSAgICAgIHVuc2lnbmVkIGo7Ci0gICAgICBmb3Ig KGogPSAwOyBwYXJ0aXRpb25zLml0ZXJhdGUgKGosICZwYXJ0aXRpb24pOyAr K2opCi0JaWYgKHBhcnRpdGlvbl9yZWR1Y3Rpb25fcCAocGFydGl0aW9uKSkK LQkgIGJyZWFrOwotICAgICAgaWYgKGogPCBwYXJ0aXRpb25zLmxlbmd0aCAo KSkKLQl7Ci0JICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBwYXJ0aXRpb25zLml0 ZXJhdGUgKGksICZwYXJ0aXRpb24pOyArK2kpCi0JICAgIGlmIChpICE9IGop Ci0JICAgICAgYWRkX2VkZ2UgKHBnLCBpLCBqKTsKLQl9Ci0KLSAgICAgIC8q IENvbXB1dGUgcGFydGl0aW9ucyB3ZSBjYW5ub3Qgc2VwYXJhdGUgYW5kIGZ1 c2UgdGhlbS4gICovCi0gICAgICBudW1fc2NjcyA9IGdyYXBoZHNfc2NjIChw ZywgTlVMTCk7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3NjY3M7ICsr aSkKLQl7Ci0JICBzdHJ1Y3QgcGFydGl0aW9uICpmaXJzdDsKLQkgIGludCBq OwotCSAgZm9yIChqID0gMDsgcGFydGl0aW9ucy5pdGVyYXRlIChqLCAmZmly c3QpOyArK2opCi0JICAgIGlmIChwZy0+dmVydGljZXNbal0uY29tcG9uZW50 ID09IGkpCi0JICAgICAgYnJlYWs7Ci0JICBmb3IgKGogPSBqICsgMTsgcGFy dGl0aW9ucy5pdGVyYXRlIChqLCAmcGFydGl0aW9uKTsgKytqKQotCSAgICBp ZiAocGctPnZlcnRpY2VzW2pdLmNvbXBvbmVudCA9PSBpKQotCSAgICAgIHsK LQkJcGFydGl0aW9uX21lcmdlX2ludG8gKGZpcnN0LCBwYXJ0aXRpb24sIEZV U0VfU0FNRV9TQ0MpOwotCQlwYXJ0aXRpb25zW2pdID0gTlVMTDsKLQkJcGFy dGl0aW9uX2ZyZWUgKHBhcnRpdGlvbik7Ci0JCVBHREFUQSAoaiktPnBhcnRp dGlvbiA9IE5VTEw7Ci0JICAgICAgfQotCX0KLQotICAgICAgLyogTm93IG9y ZGVyIHRoZSByZW1haW5pbmcgbm9kZXMgaW4gcG9zdG9yZGVyLiAgKi8KLSAg ICAgIHFzb3J0IChwZy0+dmVydGljZXMsIHBnLT5uX3ZlcnRpY2VzLCBzaXpl b2YgKHZlcnRleCksIHBnY21wKTsKLSAgICAgIHBhcnRpdGlvbnMudHJ1bmNh dGUgKDApOwotICAgICAgZm9yIChpID0gMDsgaSA8IHBnLT5uX3ZlcnRpY2Vz OyArK2kpCi0JewotCSAgcGdkYXRhICpkYXRhID0gUEdEQVRBIChpKTsKLQkg IGlmIChkYXRhLT5wYXJ0aXRpb24pCi0JICAgIHBhcnRpdGlvbnMuc2FmZV9w dXNoIChkYXRhLT5wYXJ0aXRpb24pOwotCSAgZGVsZXRlIGRhdGE7Ci0JfQot ICAgICAgZ2NjX2Fzc2VydCAocGFydGl0aW9ucy5sZW5ndGggKCkgPT0gKHVu c2lnbmVkKW51bV9zY2NzKTsKLSAgICAgIGZyZWVfZ3JhcGggKHBnKTsKKyAg ICAgIG1lcmdlX2RlcF9zY2NfcGFydGl0aW9ucyAocmRnLCAmcGFydGl0aW9u cywgcnRfYWxpYXNfY2hlY2tfcCk7CisgICAgICBhbGlhc19kZHJzLnRydW5j YXRlICgwKTsKKyAgICAgIGlmIChydF9hbGlhc19jaGVja19wICYmIHBhcnRp dGlvbnMubGVuZ3RoICgpID4gMSkKKwlicmVha19hbGlhc19zY2NfcGFydGl0 aW9ucyAocmRnLCAmcGFydGl0aW9ucywgJmFsaWFzX2RkcnMpOwogICAgIH0K IAorICBmaW5hbGl6ZV9wYXJ0aXRpb25zICgmcGFydGl0aW9ucywgJmFsaWFz X2RkcnMpOworCiAgIG5icCA9IHBhcnRpdGlvbnMubGVuZ3RoICgpOwogICBp ZiAobmJwID09IDAKICAgICAgIHx8IChuYnAgPT0gMSAmJiAhcGFydGl0aW9u X2J1aWx0aW5fcCAocGFydGl0aW9uc1swXSkpCkBAIC0xODg5LDggKzI1MTMs MTUgQEAgZGlzdHJpYnV0ZV9sb29wIChzdHJ1Y3QgbG9vcCAqbG9vcCwgdmVj PGdpbXBsZSAqPiBzdG10cywKICAgICAgIGdvdG8gbGRpc3RfZG9uZTsKICAg ICB9CiAKKyAgaWYgKHZlcnNpb25fZm9yX2Rpc3RyaWJ1dGlvbl9wICgmcGFy dGl0aW9ucywgJmFsaWFzX2RkcnMpKQorICAgIHZlcnNpb25fbG9vcF9ieV9h bGlhc19jaGVjayAobG9vcCwgJmFsaWFzX2RkcnMpOworCiAgIGlmIChkdW1w X2ZpbGUgJiYgKGR1bXBfZmxhZ3MgJiBUREZfREVUQUlMUykpCi0gICAgZHVt cF9yZGdfcGFydGl0aW9ucyAoZHVtcF9maWxlLCBwYXJ0aXRpb25zKTsKKyAg ICB7CisgICAgICBmcHJpbnRmIChkdW1wX2ZpbGUsCisJICAgICAgICJkaXN0 cmlidXRlIGxvb3AgPCVkPiBpbnRvIHBhcnRpdGlvbnM6XG4iLCBsb29wLT5u dW0pOworICAgICAgZHVtcF9yZGdfcGFydGl0aW9ucyAoZHVtcF9maWxlLCBw YXJ0aXRpb25zKTsKKyAgICB9CiAKICAgRk9SX0VBQ0hfVkVDX0VMVCAocGFy dGl0aW9ucywgaSwgcGFydGl0aW9uKQogICAgIHsKLS0gCjEuOS4xCgo= --001a11391216580a29055260cb5e--