From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from esa4.mentor.iphmx.com (esa4.mentor.iphmx.com [68.232.137.252]) by sourceware.org (Postfix) with ESMTPS id 92E67385142A for ; Fri, 26 Aug 2022 09:07:39 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 92E67385142A Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=codesourcery.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=mentor.com X-IronPort-AV: E=Sophos;i="5.93,264,1654588800"; d="diff'?scan'208,217";a="81990010" Received: from orw-gwy-01-in.mentorg.com ([192.94.38.165]) by esa4.mentor.iphmx.com with ESMTP; 26 Aug 2022 01:07:37 -0800 IronPort-SDR: gIWhXNg9xsCvqmCG0ghD6B4WgGold5WRd3sxKtWNXQ6yvRig6lQZUHrXJ+JvZpnkvsR1/Gti02 e4zHJOs9mf3WPc6nXvTz2XDeoRBpmoCAbYCTxQi+Pm4CmwVJdNtsZHkGe1rOkdy9s9Soj/QcoL iKeNhiLSfaYsBSMOgPK8Jyw4wqeoDWghZWGjHshZxQjOun/1neSvGgmB7LRu0fZbewFY388Wty lPFOHkIx2nzN0/XqS6EyKzJEw3cqp/72a06fUZ/fLr0AC8/VUQs9v0W7utazB5Z1tzO2SjETYW pfI= Content-Type: multipart/mixed; boundary="------------KQw6xnbzVBDT0ypNmD0e5TD8" Message-ID: <57b3ae5e-8f15-8bea-fa09-39bccbaa2414@codesourcery.com> Date: Fri, 26 Aug 2022 11:07:28 +0200 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.2.0 Content-Language: en-US From: Tobias Burnus To: Jakub Jelinek , Tom de Vries , gcc-patches CC: Alexander Monakov Subject: [Patch] libgomp/nvptx: Prepare for reverse-offload callback handling X-Originating-IP: [137.202.0.90] X-ClientProxiedBy: svr-ies-mbx-11.mgc.mentorg.com (139.181.222.11) To svr-ies-mbx-12.mgc.mentorg.com (139.181.222.12) X-Spam-Status: No, score=-11.4 required=5.0 tests=BAYES_00, GIT_PATCH_0, HEADER_FROM_DIFFERENT_DOMAINS, HTML_MESSAGE, KAM_DMARC_STATUS, KAM_SHORT, SPF_HELO_PASS, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-Content-Filtered-By: Mailman/MimeDel 2.1.29 X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 26 Aug 2022 09:07:44 -0000 --------------KQw6xnbzVBDT0ypNmD0e5TD8 Content-Type: text/plain; charset="utf-8"; format=flowed Content-Transfer-Encoding: quoted-printable @Tom and Alexander: Better suggestions are welcome for the busy loop in libgomp/plugin/plugin-nvptx.c regarding the variable placement and checking its value. PRE-REMARK As nvptx (and all other plugins) returns <=3D 0 for GOMP_OFFLOAD_get_num_devices if GOMP_REQUIRES_REVERSE_OFFLOAD is set. This patch is currently still a no op. The patch is almost stand alone, except that it either needs a void *rev_fn_table =3D NULL; in GOMP_OFFLOAD_load_image or the following patch: [Patch][2/3] nvptx: libgomp+mkoffload.cc: Prepare for reverse offload fn = lookup https://gcc.gnu.org/pipermail/gcc-patches/2022-August/600348.html (which in turn needs the '[1/3]' patch). Not required to be compilable, but the patch is based on the ideas/code fro= m the reverse-offload ME patch; the latter adds calls to GOMP_target_ext (omp_initial_device, which is for host fallback code processed by the normal target_ext and for device code by the target_ext of this patch. =E2=86=92 "[Patch] OpenMP: Support reverse offload (middle end part)" https://gcc.gnu.org/pipermail/gcc-patches/2022-July/598662.html * * * This patch adds initial offloading support for nvptx. When the nvptx's device GOMP_target_ext is called - it creates a lock, fills a struct with the argument pointers (addr, kinds, sizes), its device number and the set the function pointer address. On the host side, the last address is checked - if fn_addr !=3D NULL, it passes all arguments on to the generic (target.c) gomp_target_rev to do the actual offloading. CUDA does lockup when trying to copy data from the currently running stream; hence, a new stream is generated to do the memory copying. Just having managed memory is not enough - it needs to be concurrently accessible - otherwise, it will segfault on the host when migrated to the device. OK for mainline? * * * Future work for nvptx: * Adjust 'sleep', possibly using different values with and without USM and to do shorter sleeps than usleep(1)? * Set a flag whether there is any offload function at all, avoiding to run the more expensive check if there is 'requires reverse_offload' without actual reverse-offloading functions present. (Recall that the '2/3' patch, mentioned above, only has fn !=3D NULL for reverse-offload functions.) * Document =E2=86=92 libgomp.texi that reverse offload may cause some perfo= rmance overhead for all target regions. + That reverse offload is run serialized= . And obviously: submitting the missing bits to get reverse offload working, but that's mostly not an nvptx topic. Tobias ----------------- Siemens Electronic Design Automation GmbH; Anschrift: Arnulfstra=C3=9Fe 201= , 80634 M=C3=BCnchen; Gesellschaft mit beschr=C3=A4nkter Haftung; Gesch=C3= =A4ftsf=C3=BChrer: Thomas Heurung, Frank Th=C3=BCrauf; Sitz der Gesellschaf= t: M=C3=BCnchen; Registergericht M=C3=BCnchen, HRB 106955 --------------KQw6xnbzVBDT0ypNmD0e5TD8 Content-Type: text/x-patch; charset="UTF-8"; name="rev-offload-run-nvptx.diff" Content-Disposition: attachment; filename="rev-offload-run-nvptx.diff" Content-Transfer-Encoding: base64 bGliZ29tcC9udnB0eDogUHJlcGFyZSBmb3IgcmV2ZXJzZS1vZmZsb2FkIGNhbGxiYWNrIGhh bmRsaW5nCgpUaGlzIHBhdGNoIGFkZHMgYSBzdHViICdnb21wX3RhcmdldF9yZXYnIGluIHRo ZSBob3N0J3MgdGFyZ2V0LmMsIHdoaWNoIHdpbGwKbGF0ZXIgaGFuZGxlIHRoZSByZXZlcnNl IG9mZmxvYWQuCkZvciBudnB0eCwgaXQgYWRkcyBzdXBwb3J0IGZvciBmb3J3YXJkaW5nIHRo ZSBvZmZsb2FkIGdvbXBfdGFyZ2V0X2V4dCBjYWxsCnRvIHRoZSBob3N0IGJ5IHNldHRpbmcg dmFsdWVzIGluIGEgc3RydWN0IG9uIHRoZSBkZXZpY2UgYW5kIHF1ZXJ5aW5nIGl0IG9uCnRo ZSBob3N0IC0gaW52b2tpbmcgZ29tcF90YXJnZXRfcmV2IG9uIHRoZSByZXN1bHQuCgppbmNs dWRlL0NoYW5nZUxvZzoKCgkqIGN1ZGEvY3VkYS5oIChlbnVtIENVZGV2aWNlX2F0dHJpYnV0 ZSk6IEFkZAoJQ1VfREVWSUNFX0FUVFJJQlVURV9DT05DVVJSRU5UX01BTkFHRURfQUNDRVNT LgoJKGVudW0gQ1VtZW1BdHRhY2hfZmxhZ3MpOiBOZXcgc3R1YiB3aXRoIG9ubHkgbWVtYmVy CglDVV9NRU1fQVRUQUNIX0dMT0JBTC4KCShjdU1lbUFsbG9jTWFuYWdlZCk6IEFkZCBwcm90 b3R5cGUuCgpsaWJnb21wL0NoYW5nZUxvZzoKCgkqIGNvbmZpZy9udnB0eC9pY3YtZGV2aWNl LmMgKEdPTVBfREVWSUNFX05VTV9WQVIpOiBSZW1vdmUKCSdzdGF0aWMnIGZvciB0aGlzIHZh cmlhYmxlLgoJKiBjb25maWcvbnZwdHgvdGFyZ2V0LmMgKEdPTVBfUkVWX09GRkxPQURfVkFS KTogI2RlZmluZSBhcwoJdmFyaWFibGUtbmFtZSBzdHJpbmcgYW5kIHVzZSBpdCB0byBkZWZp bmUgdGhlIHZhcmlhYmxlLgoJKEdPTVBfREVWSUNFX05VTV9WQVIpOiBEZWNsYXJlIHRoaXMg ZXh0ZXJuIGdsb2JhbCB2YXIuCgkoc3RydWN0IHJldl9vZmZsb2FkKTogRGVmaW5lLgoJKEdP TVBfdGFyZ2V0X2V4dCk6IEhhbmRsZSByZXZlcnNlIG9mZmxvYWQuCgkqIGxpYmdvbXAtcGx1 Z2luLmggKEdPTVBfUExVR0lOX3RhcmdldF9yZXYpOiBOZXcgcHJvdG90eXBlLgoJKiBsaWJn b21wLXBsdWdpbi5jIChHT01QX1BMVUdJTl90YXJnZXRfcmV2KTogTmV3LCBjYWxsIC4uLgoJ KiB0YXJnZXQuYyAoZ29tcF90YXJnZXRfcmV2KTogLi4uIHRoaXMgbmV3IHN0dWIgZnVuY3Rp b24uCgkqIGxpYmdvbXAuaCAoZ29tcF90YXJnZXRfcmV2KTogRGVjbGFyZS4KCSogbGliZ29t cC5tYXAgKEdPTVBfUExVR0lOXzEuNCk6IE5ldzsgYWRkIEdPTVBfUExVR0lOX3RhcmdldF9y ZXYuCgkqIHBsdWdpbi9jdWRhLWxpYi5kZWYgKGN1TWVtQWxsb2NNYW5hZ2VkKTogQWRkLgoJ KiBwbHVnaW4vcGx1Z2luLW52cHR4LmMgKEdPTVBfUkVWX09GRkxPQURfVkFSKTogI2RlZmlu ZSB2YXIgc3RyaW5nLgoJKHN0cnVjdCByZXZfb2ZmbG9hZCk6IE5ldy4KCShzdHJ1Y3QgcHR4 X2RldmljZSk6IEFkZCBjb25jdXJyX21hbmFnZWRfYWNjZXNzLCByZXZfZGF0YQoJYW5kIHJl dl9kYXRhX2Rldi4KCShudnB0eF9vcGVuX2RldmljZSk6IFNldCBwdHhfZGV2aWNlJ3MgY29u Y3Vycl9tYW5hZ2VkX2FjY2VzczsKCScjaWYgMCcgdW51c2VkIGFzeW5jX2VuZ2luZXMuCgko R09NUF9PRkZMT0FEX2xvYWRfaW1hZ2UpOiBBbGxvY2F0ZSByZXZfZGF0YSB2YXJpYWJsZS4K CShyZXZfb2ZmX2Rldl90b19ob3N0X2NweSwgcmV2X29mZl9ob3N0X3RvX2Rldl9jcHkpOiBO ZXcuCgkoR09NUF9PRkZMT0FEX3J1bik6IEhhbmRsZSByZXZlcnNlIG9mZmxvYWRpbmcuCgog aW5jbHVkZS9jdWRhL2N1ZGEuaCAgICAgICAgICAgICAgIHwgICA4ICsrLQogbGliZ29tcC9j b25maWcvbnZwdHgvaWN2LWRldmljZS5jIHwgICAyICstCiBsaWJnb21wL2NvbmZpZy9udnB0 eC90YXJnZXQuYyAgICAgfCAgNTIgKysrKysrKysrKysrLS0KIGxpYmdvbXAvbGliZ29tcC1w bHVnaW4uYyAgICAgICAgICB8ICAxMiArKysrCiBsaWJnb21wL2xpYmdvbXAtcGx1Z2luLmgg ICAgICAgICAgfCAgIDcgKysKIGxpYmdvbXAvbGliZ29tcC5oICAgICAgICAgICAgICAgICB8 ICAgNSArKwogbGliZ29tcC9saWJnb21wLm1hcCAgICAgICAgICAgICAgIHwgICA1ICsrCiBs aWJnb21wL3BsdWdpbi9jdWRhLWxpYi5kZWYgICAgICAgfCAgIDEgKwogbGliZ29tcC9wbHVn aW4vcGx1Z2luLW52cHR4LmMgICAgIHwgMTQ4ICsrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKystCiBsaWJnb21wL3RhcmdldC5jICAgICAgICAgICAgICAgICAgfCAgMTgg KysrKysKIDEwIGZpbGVzIGNoYW5nZWQsIDI0NiBpbnNlcnRpb25zKCspLCAxMiBkZWxldGlv bnMoLSkKCmRpZmYgLS1naXQgYS9pbmNsdWRlL2N1ZGEvY3VkYS5oIGIvaW5jbHVkZS9jdWRh L2N1ZGEuaAppbmRleCAzOTM4ZDA1ZDE1MC4uMDhlNDk2YTJlOTggMTAwNjQ0Ci0tLSBhL2lu Y2x1ZGUvY3VkYS9jdWRhLmgKKysrIGIvaW5jbHVkZS9jdWRhL2N1ZGEuaApAQCAtNzcsOSAr NzcsMTQgQEAgdHlwZWRlZiBlbnVtIHsKICAgQ1VfREVWSUNFX0FUVFJJQlVURV9DT05DVVJS RU5UX0tFUk5FTFMgPSAzMSwKICAgQ1VfREVWSUNFX0FUVFJJQlVURV9NQVhfVEhSRUFEU19Q RVJfTVVMVElQUk9DRVNTT1IgPSAzOSwKICAgQ1VfREVWSUNFX0FUVFJJQlVURV9BU1lOQ19F TkdJTkVfQ09VTlQgPSA0MCwKLSAgQ1VfREVWSUNFX0FUVFJJQlVURV9NQVhfUkVHSVNURVJT X1BFUl9NVUxUSVBST0NFU1NPUiA9IDgyCisgIENVX0RFVklDRV9BVFRSSUJVVEVfTUFYX1JF R0lTVEVSU19QRVJfTVVMVElQUk9DRVNTT1IgPSA4MiwKKyAgQ1VfREVWSUNFX0FUVFJJQlVU RV9DT05DVVJSRU5UX01BTkFHRURfQUNDRVNTID0gODkKIH0gQ1VkZXZpY2VfYXR0cmlidXRl OwogCit0eXBlZGVmIGVudW0geworICBDVV9NRU1fQVRUQUNIX0dMT0JBTCA9IDB4MQorfSBD VW1lbUF0dGFjaF9mbGFnczsKKwogZW51bSB7CiAgIENVX0VWRU5UX0RFRkFVTFQgPSAwLAog ICBDVV9FVkVOVF9ESVNBQkxFX1RJTUlORyA9IDIKQEAgLTE2OSw2ICsxNzQsNyBAQCBDVXJl c3VsdCBjdU1lbUdldEluZm8gKHNpemVfdCAqLCBzaXplX3QgKik7CiBDVXJlc3VsdCBjdU1l bUFsbG9jIChDVWRldmljZXB0ciAqLCBzaXplX3QpOwogI2RlZmluZSBjdU1lbUFsbG9jSG9z dCBjdU1lbUFsbG9jSG9zdF92MgogQ1VyZXN1bHQgY3VNZW1BbGxvY0hvc3QgKHZvaWQgKios IHNpemVfdCk7CitDVXJlc3VsdCBjdU1lbUFsbG9jTWFuYWdlZCAoQ1VkZXZpY2VwdHIgKiwg c2l6ZV90LCB1bnNpZ25lZCBpbnQpOwogQ1VyZXN1bHQgY3VNZW1jcHkgKENVZGV2aWNlcHRy LCBDVWRldmljZXB0ciwgc2l6ZV90KTsKICNkZWZpbmUgY3VNZW1jcHlEdG9EQXN5bmMgY3VN ZW1jcHlEdG9EQXN5bmNfdjIKIENVcmVzdWx0IGN1TWVtY3B5RHRvREFzeW5jIChDVWRldmlj ZXB0ciwgQ1VkZXZpY2VwdHIsIHNpemVfdCwgQ1VzdHJlYW0pOwpkaWZmIC0tZ2l0IGEvbGli Z29tcC9jb25maWcvbnZwdHgvaWN2LWRldmljZS5jIGIvbGliZ29tcC9jb25maWcvbnZwdHgv aWN2LWRldmljZS5jCmluZGV4IGZhZjkwZjk5NDdjLi5mNGYxOGNkYWM1ZSAxMDA2NDQKLS0t IGEvbGliZ29tcC9jb25maWcvbnZwdHgvaWN2LWRldmljZS5jCisrKyBiL2xpYmdvbXAvY29u ZmlnL252cHR4L2ljdi1kZXZpY2UuYwpAQCAtNjAsNyArNjAsNyBAQCBvbXBfaXNfaW5pdGlh bF9kZXZpY2UgKHZvaWQpCiAKIC8qIFRoaXMgaXMgc2V0IHRvIHRoZSBkZXZpY2UgbnVtYmVy IG9mIGN1cnJlbnQgR1BVIGR1cmluZyBkZXZpY2UgaW5pdGlhbGl6YXRpb24sCiAgICB3aGVu IHRoZSBvZmZsb2FkIGltYWdlIGNvbnRhaW5pbmcgdGhpcyBsaWJnb21wIHBvcnRpb24gaXMg bG9hZGVkLiAgKi8KLXN0YXRpYyB2b2xhdGlsZSBpbnQgR09NUF9ERVZJQ0VfTlVNX1ZBUjsK K3ZvbGF0aWxlIGludCBHT01QX0RFVklDRV9OVU1fVkFSOwogCiBpbnQKIG9tcF9nZXRfZGV2 aWNlX251bSAodm9pZCkKZGlmZiAtLWdpdCBhL2xpYmdvbXAvY29uZmlnL252cHR4L3Rhcmdl dC5jIGIvbGliZ29tcC9jb25maWcvbnZwdHgvdGFyZ2V0LmMKaW5kZXggMTExMDhkMjBlMTUu LjA2ZjZjZDhiNjExIDEwMDY0NAotLS0gYS9saWJnb21wL2NvbmZpZy9udnB0eC90YXJnZXQu YworKysgYi9saWJnb21wL2NvbmZpZy9udnB0eC90YXJnZXQuYwpAQCAtMjYsNyArMjYsMjkg QEAKICNpbmNsdWRlICJsaWJnb21wLmgiCiAjaW5jbHVkZSA8bGltaXRzLmg+CiAKKyNkZWZp bmUgR09NUF9SRVZfT0ZGTE9BRF9WQVIgX19nb21wX3Jldl9vZmZsb2FkX3ZhcgorCisvKiBS ZXZlcnNlIG9mZmxvYWQuIE11c3QgbWF0Y2ggdmVyc2lvbiB1c2VkIGluIHBsdWdpbi9wbHVn aW4tbnZwdHguYy4gKi8KK3N0cnVjdCByZXZfb2ZmbG9hZCB7CisgIHVpbnQ2NF90IGZuOwor ICB1aW50NjRfdCBtYXBudW07CisgIHVpbnQ2NF90IGFkZHJzOworICB1aW50NjRfdCBzaXpl czsKKyAgdWludDY0X3Qga2luZHM7CisgIGludDMyX3QgZGV2X251bTsKKyAgdWludDMyX3Qg bG9jazsKK307CisKKyNpZiAoX19TSVpFT0ZfU0hPUlRfXyAhPSAyIFwKKyAgICAgfHwgX19T SVpFT0ZfU0laRV9UX18gIT0gOCBcCisgICAgIHx8IF9fU0laRU9GX1BPSU5URVJfXyAhPSA4 KQorI2Vycm9yICJEYXRhLXR5cGUgY29udmVyc2lvbiByZXF1aXJlZCBmb3IgcmV2X29mZmxv YWQiCisjZW5kaWYKKworCiBleHRlcm4gaW50IF9fZ29tcF90ZWFtX251bSBfX2F0dHJpYnV0 ZV9fKChzaGFyZWQpKTsKK2V4dGVybiB2b2xhdGlsZSBpbnQgR09NUF9ERVZJQ0VfTlVNX1ZB UjsKK3ZvbGF0aWxlIHN0cnVjdCByZXZfb2ZmbG9hZCAqR09NUF9SRVZfT0ZGTE9BRF9WQVI7 CiAKIGJvb2wKIEdPTVBfdGVhbXM0ICh1bnNpZ25lZCBpbnQgbnVtX3RlYW1zX2xvd2VyLCB1 bnNpZ25lZCBpbnQgbnVtX3RlYW1zX3VwcGVyLApAQCAtODgsMTYgKzExMCwzMiBAQCBHT01Q X3RhcmdldF9leHQgKGludCBkZXZpY2UsIHZvaWQgKCpmbikgKHZvaWQgKiksIHNpemVfdCBt YXBudW0sCiAJCSB2b2lkICoqaG9zdGFkZHJzLCBzaXplX3QgKnNpemVzLCB1bnNpZ25lZCBz aG9ydCAqa2luZHMsCiAJCSB1bnNpZ25lZCBpbnQgZmxhZ3MsIHZvaWQgKipkZXBlbmQsIHZv aWQgKiphcmdzKQogewotICAodm9pZCkgZGV2aWNlOwotICAodm9pZCkgZm47Ci0gICh2b2lk KSBtYXBudW07Ci0gICh2b2lkKSBob3N0YWRkcnM7Ci0gICh2b2lkKSBzaXplczsKLSAgKHZv aWQpIGtpbmRzOwogICAodm9pZCkgZmxhZ3M7CiAgICh2b2lkKSBkZXBlbmQ7CiAgICh2b2lk KSBhcmdzOwotICBfX2J1aWx0aW5fdW5yZWFjaGFibGUgKCk7CisKKyAgaWYgKGRldmljZSAh PSBHT01QX0RFVklDRV9IT1NUX0ZBTExCQUNLCisgICAgICB8fCBmbiA9PSBOVUxMCisgICAg ICB8fCBHT01QX1JFVl9PRkZMT0FEX1ZBUiA9PSBOVUxMKQorICAgIHJldHVybjsKKworICB3 aGlsZSAoX19zeW5jX2xvY2tfdGVzdF9hbmRfc2V0ICgmR09NUF9SRVZfT0ZGTE9BRF9WQVIt PmxvY2ssICh1aW50OF90KSAxKSkKKyAgICA7ICAvKiBzcGluICAqLworCisgIF9fYXRvbWlj X3N0b3JlX24gKCZHT01QX1JFVl9PRkZMT0FEX1ZBUi0+bWFwbnVtLCBtYXBudW0sIF9fQVRP TUlDX1NFUV9DU1QpOworICBfX2F0b21pY19zdG9yZV9uICgmR09NUF9SRVZfT0ZGTE9BRF9W QVItPmFkZHJzLCBob3N0YWRkcnMsIF9fQVRPTUlDX1NFUV9DU1QpOworICBfX2F0b21pY19z dG9yZV9uICgmR09NUF9SRVZfT0ZGTE9BRF9WQVItPnNpemVzLCBzaXplcywgX19BVE9NSUNf U0VRX0NTVCk7CisgIF9fYXRvbWljX3N0b3JlX24gKCZHT01QX1JFVl9PRkZMT0FEX1ZBUi0+ a2luZHMsIGtpbmRzLCBfX0FUT01JQ19TRVFfQ1NUKTsKKyAgX19hdG9taWNfc3RvcmVfbiAo JkdPTVBfUkVWX09GRkxPQURfVkFSLT5kZXZfbnVtLCBHT01QX0RFVklDRV9OVU1fVkFSLAor CQkgICAgX19BVE9NSUNfU0VRX0NTVCk7CisKKyAgLyogJ2ZuJyBtdXN0IGJlIGxhc3QuICAq LworICBfX2F0b21pY19zdG9yZV9uICgmR09NUF9SRVZfT0ZGTE9BRF9WQVItPmZuLCBmbiwg X19BVE9NSUNfU0VRX0NTVCk7CisKKyAgLyogUHJvY2Vzc2VkIG9uIHRoZSBob3N0IC0gd2hl biBkb25lLCBmbiBpcyBzZXQgdG8gTlVMTC4gICovCisgIHdoaWxlIChfX2F0b21pY19sb2Fk X24gKCZHT01QX1JFVl9PRkZMT0FEX1ZBUi0+Zm4sIF9fQVRPTUlDX1NFUV9DU1QpICE9IDAp CisgICAgOyAgLyogc3BpbiAgKi8KKyAgX19zeW5jX2xvY2tfcmVsZWFzZSAoJkdPTVBfUkVW X09GRkxPQURfVkFSLT5sb2NrKTsKIH0KIAogdm9pZApkaWZmIC0tZ2l0IGEvbGliZ29tcC9s aWJnb21wLXBsdWdpbi5jIGIvbGliZ29tcC9saWJnb21wLXBsdWdpbi5jCmluZGV4IDlkNGNj NjIzYTEwLi4zMTZkZTc0OWY2OSAxMDA2NDQKLS0tIGEvbGliZ29tcC9saWJnb21wLXBsdWdp bi5jCisrKyBiL2xpYmdvbXAvbGliZ29tcC1wbHVnaW4uYwpAQCAtNzgsMyArNzgsMTUgQEAg R09NUF9QTFVHSU5fZmF0YWwgKGNvbnN0IGNoYXIgKm1zZywgLi4uKQogICBnb21wX3ZmYXRh bCAobXNnLCBhcCk7CiAgIHZhX2VuZCAoYXApOwogfQorCit2b2lkCitHT01QX1BMVUdJTl90 YXJnZXRfcmV2ICh1aW50NjRfdCBmbl9wdHIsIHVpbnQ2NF90IG1hcG51bSwgdWludDY0X3Qg ZGV2YWRkcnNfcHRyLAorCQkJdWludDY0X3Qgc2l6ZXNfcHRyLCB1aW50NjRfdCBraW5kc19w dHIsIGludCBkZXZfbnVtLAorCQkJdm9pZCAoKmRldl90b19ob3N0X2NweSkgKHZvaWQgKiwg Y29uc3Qgdm9pZCAqLCBzaXplX3QsCisJCQkJCQkgdm9pZCAqKSwKKwkJCXZvaWQgKCpob3N0 X3RvX2Rldl9jcHkpICh2b2lkICosIGNvbnN0IHZvaWQgKiwgc2l6ZV90LAorCQkJCQkJIHZv aWQgKiksIHZvaWQgKnRva2VuKQoreworICBnb21wX3RhcmdldF9yZXYgKGZuX3B0ciwgbWFw bnVtLCBkZXZhZGRyc19wdHIsIHNpemVzX3B0ciwga2luZHNfcHRyLCBkZXZfbnVtLAorCQkg ICBkZXZfdG9faG9zdF9jcHksIGhvc3RfdG9fZGV2X2NweSwgdG9rZW4pOworfQpkaWZmIC0t Z2l0IGEvbGliZ29tcC9saWJnb21wLXBsdWdpbi5oIGIvbGliZ29tcC9saWJnb21wLXBsdWdp bi5oCmluZGV4IGFiM2VkNjM4NDc1Li40MGRmYjUyZTQ0ZSAxMDA2NDQKLS0tIGEvbGliZ29t cC9saWJnb21wLXBsdWdpbi5oCisrKyBiL2xpYmdvbXAvbGliZ29tcC1wbHVnaW4uaApAQCAt MTIxLDYgKzEyMSwxMyBAQCBleHRlcm4gdm9pZCBHT01QX1BMVUdJTl9lcnJvciAoY29uc3Qg Y2hhciAqLCAuLi4pCiBleHRlcm4gdm9pZCBHT01QX1BMVUdJTl9mYXRhbCAoY29uc3QgY2hh ciAqLCAuLi4pCiAJX19hdHRyaWJ1dGVfXyAoKG5vcmV0dXJuLCBmb3JtYXQgKHByaW50Ziwg MSwgMikpKTsKIAorZXh0ZXJuIHZvaWQgR09NUF9QTFVHSU5fdGFyZ2V0X3JldiAodWludDY0 X3QsIHVpbnQ2NF90LCB1aW50NjRfdCwgdWludDY0X3QsCisJCQkJICAgIHVpbnQ2NF90LCBp bnQsCisJCQkJICAgIHZvaWQgKCopICh2b2lkICosIGNvbnN0IHZvaWQgKiwgc2l6ZV90LAor CQkJCQkgICAgICB2b2lkICopLAorCQkJCSAgICB2b2lkICgqKSAodm9pZCAqLCBjb25zdCB2 b2lkICosIHNpemVfdCwKKwkJCQkJICAgICAgdm9pZCAqKSwgdm9pZCAqKTsKKwogLyogUHJv dG90eXBlcyBmb3IgZnVuY3Rpb25zIGltcGxlbWVudGVkIGJ5IGxpYmdvbXAgcGx1Z2lucy4g ICovCiBleHRlcm4gY29uc3QgY2hhciAqR09NUF9PRkZMT0FEX2dldF9uYW1lICh2b2lkKTsK IGV4dGVybiB1bnNpZ25lZCBpbnQgR09NUF9PRkZMT0FEX2dldF9jYXBzICh2b2lkKTsKZGlm ZiAtLWdpdCBhL2xpYmdvbXAvbGliZ29tcC5oIGIvbGliZ29tcC9saWJnb21wLmgKaW5kZXgg YzI0M2M0ZDZjZjQuLmJiYWI1YjRiMGFmIDEwMDY0NAotLS0gYS9saWJnb21wL2xpYmdvbXAu aAorKysgYi9saWJnb21wL2xpYmdvbXAuaApAQCAtMTAxNCw2ICsxMDE0LDExIEBAIGV4dGVy biBpbnQgZ29tcF9wYXVzZV9ob3N0ICh2b2lkKTsKIGV4dGVybiB2b2lkIGdvbXBfaW5pdF90 YXJnZXRzX29uY2UgKHZvaWQpOwogZXh0ZXJuIGludCBnb21wX2dldF9udW1fZGV2aWNlcyAo dm9pZCk7CiBleHRlcm4gYm9vbCBnb21wX3RhcmdldF90YXNrX2ZuICh2b2lkICopOworZXh0 ZXJuIHZvaWQgZ29tcF90YXJnZXRfcmV2ICh1aW50NjRfdCwgdWludDY0X3QsIHVpbnQ2NF90 LCB1aW50NjRfdCwgdWludDY0X3QsCisJCQkgICAgIGludCwKKwkJCSAgICAgdm9pZCAoKikg KHZvaWQgKiwgY29uc3Qgdm9pZCAqLCBzaXplX3QsIHZvaWQgKiksCisJCQkgICAgIHZvaWQg KCopICh2b2lkICosIGNvbnN0IHZvaWQgKiwgc2l6ZV90LCB2b2lkICopLAorCQkJICAgICB2 b2lkICopOwogCiAvKiBTcGxheSB0cmVlIGRlZmluaXRpb25zLiAgKi8KIHR5cGVkZWYgc3Ry dWN0IHNwbGF5X3RyZWVfbm9kZV9zICpzcGxheV90cmVlX25vZGU7CmRpZmYgLS1naXQgYS9s aWJnb21wL2xpYmdvbXAubWFwIGIvbGliZ29tcC9saWJnb21wLm1hcAppbmRleCA0NmQ1ZjEw ZjNlMS4uMTJmNzZmN2U0OGYgMTAwNjQ0Ci0tLSBhL2xpYmdvbXAvbGliZ29tcC5tYXAKKysr IGIvbGliZ29tcC9saWJnb21wLm1hcApAQCAtNjIyLDMgKzYyMiw4IEBAIEdPTVBfUExVR0lO XzEuMyB7CiAJR09NUF9QTFVHSU5fZ29hY2NfcHJvZmlsaW5nX2Rpc3BhdGNoOwogCUdPTVBf UExVR0lOX2dvYWNjX3RocmVhZDsKIH0gR09NUF9QTFVHSU5fMS4yOworCitHT01QX1BMVUdJ Tl8xLjQgeworICBnbG9iYWw6CisJR09NUF9QTFVHSU5fdGFyZ2V0X3JldjsKK30gR09NUF9Q TFVHSU5fMS4zOwpkaWZmIC0tZ2l0IGEvbGliZ29tcC9wbHVnaW4vY3VkYS1saWIuZGVmIGIv bGliZ29tcC9wbHVnaW4vY3VkYS1saWIuZGVmCmluZGV4IGNkOTFiMzliMWQyLi42MTM1OWM3 ZTc0ZSAxMDA2NDQKLS0tIGEvbGliZ29tcC9wbHVnaW4vY3VkYS1saWIuZGVmCisrKyBiL2xp YmdvbXAvcGx1Z2luL2N1ZGEtbGliLmRlZgpAQCAtMjksNiArMjksNyBAQCBDVURBX09ORV9D QUxMX01BWUJFX05VTEwgKGN1TGlua0NyZWF0ZV92MikKIENVREFfT05FX0NBTEwgKGN1TGlu a0Rlc3Ryb3kpCiBDVURBX09ORV9DQUxMIChjdU1lbUFsbG9jKQogQ1VEQV9PTkVfQ0FMTCAo Y3VNZW1BbGxvY0hvc3QpCitDVURBX09ORV9DQUxMIChjdU1lbUFsbG9jTWFuYWdlZCkKIENV REFfT05FX0NBTEwgKGN1TWVtY3B5KQogQ1VEQV9PTkVfQ0FMTCAoY3VNZW1jcHlEdG9EQXN5 bmMpCiBDVURBX09ORV9DQUxMIChjdU1lbWNweUR0b0gpCmRpZmYgLS1naXQgYS9saWJnb21w L3BsdWdpbi9wbHVnaW4tbnZwdHguYyBiL2xpYmdvbXAvcGx1Z2luL3BsdWdpbi1udnB0eC5j CmluZGV4IGJjNjNlMjc0Y2RmLi43YWI5NDIxYjA2MCAxMDA2NDQKLS0tIGEvbGliZ29tcC9w bHVnaW4vcGx1Z2luLW52cHR4LmMKKysrIGIvbGliZ29tcC9wbHVnaW4vcGx1Z2luLW52cHR4 LmMKQEAgLTU0LDYgKzU0LDggQEAKICNpbmNsdWRlIDxhc3NlcnQuaD4KICNpbmNsdWRlIDxl cnJuby5oPgogCisjZGVmaW5lIEdPTVBfUkVWX09GRkxPQURfVkFSIF9fZ29tcF9yZXZfb2Zm bG9hZF92YXIKKwogLyogQW4gYXJiaXRyYXJ5IGZpeGVkIGxpbWl0ICgxMjhNQikgZm9yIHRo ZSBzaXplIG9mIHRoZSBPcGVuTVAgc29mdCBzdGFja3MKICAgIGJsb2NrIHRvIGNhY2hlIGJl dHdlZW4ga2VybmVsIGludm9jYXRpb25zLiAgRm9yIHNvZnQtc3RhY2tzIGJsb2NrcyBiaWdn ZXIKICAgIHRoYW4gdGhpcywgd2Ugd2lsbCBmcmVlIHRoZSBibG9jayBiZWZvcmUgYXR0ZW1w dGluZyBhbm90aGVyIEdQVSBtZW1vcnkKQEAgLTI3NCw2ICsyNzYsMTcgQEAgc3RydWN0IHRh cmdfZm5fZGVzY3JpcHRvcgogICBpbnQgbWF4X3RocmVhZHNfcGVyX2Jsb2NrOwogfTsKIAor LyogUmV2ZXJzZSBvZmZsb2FkLiBNdXN0IG1hdGNoIHZlcnNpb24gdXNlZCBpbiBjb25maWcv bnZwdHgvdGFyZ2V0LmMuICovCitzdHJ1Y3QgcmV2X29mZmxvYWQgeworICB1aW50NjRfdCBm bjsKKyAgdWludDY0X3QgbWFwbnVtOworICB1aW50NjRfdCBhZGRyczsKKyAgdWludDY0X3Qg c2l6ZXM7CisgIHVpbnQ2NF90IGtpbmRzOworICBpbnQzMl90IGRldl9udW07CisgIHVpbnQz Ml90IGxvY2s7Cit9OworCiAvKiBBIGxvYWRlZCBQVFggaW1hZ2UuICAqLwogc3RydWN0IHB0 eF9pbWFnZV9kYXRhCiB7CkBAIC0zMDIsNiArMzE1LDcgQEAgc3RydWN0IHB0eF9kZXZpY2UK ICAgYm9vbCBtYXA7CiAgIGJvb2wgY29uY3VyOwogICBib29sIG1rZXJuOworICBib29sIGNv bmN1cnJfbWFuYWdlZF9hY2Nlc3M7CiAgIGludCBtb2RlOwogICBpbnQgY2xvY2tfa2h6Owog ICBpbnQgbnVtX3NtczsKQEAgLTMyOSw2ICszNDMsOSBAQCBzdHJ1Y3QgcHR4X2RldmljZQog ICAgICAgcHRocmVhZF9tdXRleF90IGxvY2s7CiAgICAgfSBvbXBfc3RhY2tzOwogCisgIHN0 cnVjdCByZXZfb2ZmbG9hZCAqcmV2X2RhdGE7CisgIENVZGV2aWNlcHRyIHJldl9kYXRhX2Rl djsKKwogICBzdHJ1Y3QgcHR4X2RldmljZSAqbmV4dDsKIH07CiAKQEAgLTQyMyw3ICs0NDAs NyBAQCBudnB0eF9vcGVuX2RldmljZSAoaW50IG4pCiAgIHN0cnVjdCBwdHhfZGV2aWNlICpw dHhfZGV2OwogICBDVWRldmljZSBkZXYsIGN0eF9kZXY7CiAgIENVcmVzdWx0IHI7Ci0gIGlu dCBhc3luY19lbmdpbmVzLCBwaTsKKyAgaW50IHBpOwogCiAgIENVREFfQ0FMTF9FUkVUIChO VUxMLCBjdURldmljZUdldCwgJmRldiwgbik7CiAKQEAgLTUxOSwxMSArNTM2LDE3IEBAIG52 cHR4X29wZW5fZGV2aWNlIChpbnQgbikKIAkJICBDVV9ERVZJQ0VfQVRUUklCVVRFX01BWF9U SFJFQURTX1BFUl9NVUxUSVBST0NFU1NPUiwgZGV2KTsKICAgcHR4X2Rldi0+bWF4X3RocmVh ZHNfcGVyX211bHRpcHJvY2Vzc29yID0gcGk7CiAKKyNpZiAwCisgIGludCBhc3luY19lbmdp bmVzOwogICByID0gQ1VEQV9DQUxMX05PQ0hFQ0sgKGN1RGV2aWNlR2V0QXR0cmlidXRlLCAm YXN5bmNfZW5naW5lcywKIAkJCSBDVV9ERVZJQ0VfQVRUUklCVVRFX0FTWU5DX0VOR0lORV9D T1VOVCwgZGV2KTsKICAgaWYgKHIgIT0gQ1VEQV9TVUNDRVNTKQogICAgIGFzeW5jX2VuZ2lu ZXMgPSAxOworI2VuZGlmCiAKKyAgciA9IENVREFfQ0FMTF9OT0NIRUNLIChjdURldmljZUdl dEF0dHJpYnV0ZSwgJnBpLAorCQkJIENVX0RFVklDRV9BVFRSSUJVVEVfQ09OQ1VSUkVOVF9N QU5BR0VEX0FDQ0VTUywgZGV2KTsKKyAgcHR4X2Rldi0+Y29uY3Vycl9tYW5hZ2VkX2FjY2Vz cyA9IHIgPT0gQ1VEQV9TVUNDRVNTID8gcGkgOiBmYWxzZTsKICAgZm9yIChpbnQgaSA9IDA7 IGkgIT0gR09NUF9ESU1fTUFYOyBpKyspCiAgICAgcHR4X2Rldi0+ZGVmYXVsdF9kaW1zW2ld ID0gMDsKIApAQCAtMTMxMyw2ICsxMzM2LDM4IEBAIEdPTVBfT0ZGTE9BRF9sb2FkX2ltYWdl IChpbnQgb3JkLCB1bnNpZ25lZCB2ZXJzaW9uLCBjb25zdCB2b2lkICp0YXJnZXRfZGF0YSwK ICAgdGFyZ19mbnMgPSBHT01QX1BMVUdJTl9tYWxsb2MgKHNpemVvZiAoc3RydWN0IHRhcmdf Zm5fZGVzY3JpcHRvcikKIAkJCQkgKiBmbl9lbnRyaWVzKTsKIAorICBpZiAocmV2X2ZuX3Rh YmxlICYmIGRldi0+cmV2X2RhdGEgPT0gTlVMTCkKKyAgICB7CisgICAgICBDVWRldmljZXB0 ciBkcCA9IDA7CisgICAgICBpZiAoZGV2LT5jb25jdXJyX21hbmFnZWRfYWNjZXNzICYmIENV REFfQ0FMTF9FWElTVFMgKGN1TWVtQWxsb2NNYW5hZ2VkKSkKKwl7CisJICBDVURBX0NBTExf QVNTRVJUIChjdU1lbUFsbG9jTWFuYWdlZCwgKHZvaWQgKikgJmRldi0+cmV2X2RhdGEsCisJ CQkgICAgc2l6ZW9mICgqZGV2LT5yZXZfZGF0YSksIENVX01FTV9BVFRBQ0hfR0xPQkFMKTsK KwkgIGRwID0gKENVZGV2aWNlcHRyKSBkZXYtPnJldl9kYXRhOworCX0KKyAgICAgIGVsc2UK Kwl7CisJICBDVURBX0NBTExfQVNTRVJUIChjdU1lbUFsbG9jSG9zdCwgKHZvaWQgKiopICZk ZXYtPnJldl9kYXRhLAorCQkJICAgIHNpemVvZiAoKmRldi0+cmV2X2RhdGEpKTsKKwkgIG1l bXNldCAoZGV2LT5yZXZfZGF0YSwgJ1wwJywgc2l6ZW9mICgqZGV2LT5yZXZfZGF0YSkpOwor CSAgQ1VEQV9DQUxMX0FTU0VSVCAoY3VNZW1BbGxvYywgJmRldi0+cmV2X2RhdGFfZGV2LAor CQkJICAgIHNpemVvZiAoKmRldi0+cmV2X2RhdGEpKTsKKwkgIGRwID0gZGV2LT5yZXZfZGF0 YV9kZXY7CisJfQorICAgICAgQ1VkZXZpY2VwdHIgZGV2aWNlX3Jldl9vZmZsb2FkX3ZhcjsK KyAgICAgIHNpemVfdCBkZXZpY2VfcmV2X29mZmxvYWRfc2l6ZTsKKyAgICAgIENVcmVzdWx0 IHIgPSBDVURBX0NBTExfTk9DSEVDSyAoY3VNb2R1bGVHZXRHbG9iYWwsCisJCQkJICAgICAg JmRldmljZV9yZXZfb2ZmbG9hZF92YXIsCisJCQkJICAgICAgJmRldmljZV9yZXZfb2ZmbG9h ZF9zaXplLCBtb2R1bGUsCisJCQkJICAgICAgWFNUUklORyAoR09NUF9SRVZfT0ZGTE9BRF9W QVIpKTsKKyAgICAgIGlmIChyICE9IENVREFfU1VDQ0VTUykKKwlHT01QX1BMVUdJTl9mYXRh bCAoImN1TW9kdWxlR2V0R2xvYmFsIGVycm9yOiAlcyIsIGN1ZGFfZXJyb3IgKHIpKTsKKyAg ICAgIHIgPSBDVURBX0NBTExfTk9DSEVDSyAoY3VNZW1jcHlIdG9ELCBkZXZpY2VfcmV2X29m ZmxvYWRfdmFyLCAmZHAsCisJCQkgICAgIHNpemVvZiAoZHApKTsKKyAgICAgIGlmIChyICE9 IENVREFfU1VDQ0VTUykKKwlHT01QX1BMVUdJTl9mYXRhbCAoImN1TWVtY3B5SHRvRCBlcnJv cjogJXMiLCBjdWRhX2Vycm9yIChyKSk7CisgICAgfQorCiAgICp0YXJnZXRfdGFibGUgPSB0 YXJnX3RibDsKIAogICBuZXdfaW1hZ2UgPSBHT01QX1BMVUdJTl9tYWxsb2MgKHNpemVvZiAo c3RydWN0IHB0eF9pbWFnZV9kYXRhKSk7CkBAIC0xMzczLDYgKzE0MjgsMjIgQEAgR09NUF9P RkZMT0FEX2xvYWRfaW1hZ2UgKGludCBvcmQsIHVuc2lnbmVkIHZlcnNpb24sIGNvbnN0IHZv aWQgKnRhcmdldF9kYXRhLAogICAgIHRhcmdfdGJsLT5zdGFydCA9IHRhcmdfdGJsLT5lbmQg PSAwOwogICB0YXJnX3RibCsrOwogCisgIGlmIChyZXZfZm5fdGFibGUpCisgICAgeworICAg ICAgQ1VkZXZpY2VwdHIgdmFyOworICAgICAgc2l6ZV90IGJ5dGVzOworICAgICAgciA9IENV REFfQ0FMTF9OT0NIRUNLIChjdU1vZHVsZUdldEdsb2JhbCwgJnZhciwgJmJ5dGVzLCBtb2R1 bGUsCisJCQkgICAgICIkb2ZmbG9hZF9mdW5jX3RhYmxlIik7CisgICAgICBpZiAociAhPSBD VURBX1NVQ0NFU1MpCisJR09NUF9QTFVHSU5fZmF0YWwgKCJjdU1vZHVsZUdldEdsb2JhbCBl cnJvcjogJXMiLCBjdWRhX2Vycm9yIChyKSk7CisgICAgICBhc3NlcnQgKGJ5dGVzID09IHNp emVvZiAodWludDY0X3QpICogZm5fZW50cmllcyk7CisgICAgICAqcmV2X2ZuX3RhYmxlID0g R09NUF9QTFVHSU5fbWFsbG9jIChzaXplb2YgKHVpbnQ2NF90KSAqIGZuX2VudHJpZXMpOwor ICAgICAgciA9IENVREFfQ0FMTF9OT0NIRUNLIChjdU1lbWNweUR0b0gsICpyZXZfZm5fdGFi bGUsIHZhciwgYnl0ZXMpOworICAgICAgaWYgKHIgIT0gQ1VEQV9TVUNDRVNTKQorCUdPTVBf UExVR0lOX2ZhdGFsICgiY3VNZW1jcHlEdG9IIGVycm9yOiAlcyIsIGN1ZGFfZXJyb3IgKHIp KTsKKyAgICB9CisKKwogICBudnB0eF9zZXRfY2xvY2t0aWNrIChtb2R1bGUsIGRldik7CiAK ICAgcmV0dXJuIGZuX2VudHJpZXMgKyB2YXJfZW50cmllcyArIG90aGVyX2VudHJpZXM7CkBA IC0xOTgyLDYgKzIwNTMsMjMgQEAgbnZwdHhfc3RhY2tzX2FjcXVpcmUgKHN0cnVjdCBwdHhf ZGV2aWNlICpwdHhfZGV2LCBzaXplX3Qgc2l6ZSwgaW50IG51bSkKICAgcmV0dXJuICh2b2lk ICopIHB0eF9kZXYtPm9tcF9zdGFja3MucHRyOwogfQogCisKK3ZvaWQKK3Jldl9vZmZfZGV2 X3RvX2hvc3RfY3B5ICh2b2lkICpkZXN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBzaXpl LAorCQkJIENVc3RyZWFtIHN0cmVhbSkKK3sKKyAgQ1VEQV9DQUxMX0FTU0VSVCAoY3VNZW1j cHlEdG9IQXN5bmMsIGRlc3QsIChDVWRldmljZXB0cikgc3JjLCBzaXplLCBzdHJlYW0pOwor ICBDVURBX0NBTExfQVNTRVJUIChjdVN0cmVhbVN5bmNocm9uaXplLCBzdHJlYW0pOworfQor Cit2b2lkCityZXZfb2ZmX2hvc3RfdG9fZGV2X2NweSAodm9pZCAqZGVzdCwgY29uc3Qgdm9p ZCAqc3JjLCBzaXplX3Qgc2l6ZSwKKwkJCSBDVXN0cmVhbSBzdHJlYW0pCit7CisgIENVREFf Q0FMTF9BU1NFUlQgKGN1TWVtY3B5SHRvREFzeW5jLCAoQ1VkZXZpY2VwdHIpIGRlc3QsIHNy Yywgc2l6ZSwgc3RyZWFtKTsKKyAgQ1VEQV9DQUxMX0FTU0VSVCAoY3VTdHJlYW1TeW5jaHJv bml6ZSwgc3RyZWFtKTsKK30KKwogdm9pZAogR09NUF9PRkZMT0FEX3J1biAoaW50IG9yZCwg dm9pZCAqdGd0X2ZuLCB2b2lkICp0Z3RfdmFycywgdm9pZCAqKmFyZ3MpCiB7CkBAIC0yMDE2 LDYgKzIxMDQsMTAgQEAgR09NUF9PRkZMT0FEX3J1biAoaW50IG9yZCwgdm9pZCAqdGd0X2Zu LCB2b2lkICp0Z3RfdmFycywgdm9pZCAqKmFyZ3MpCiAgIG52cHR4X2FkanVzdF9sYXVuY2hf Ym91bmRzICh0Z3RfZm4sIHB0eF9kZXYsICZ0ZWFtcywgJnRocmVhZHMpOwogCiAgIHNpemVf dCBzdGFja19zaXplID0gbnZwdHhfc3RhY2tzX3NpemUgKCk7CisgIGJvb2wgcmV2ZXJzZV9v ZmYgPSBwdHhfZGV2LT5yZXZfZGF0YSAhPSBOVUxMOworICBib29sIGhhc191c20gPSAocHR4 X2Rldi0+Y29uY3Vycl9tYW5hZ2VkX2FjY2VzcworCQkgICYmIENVREFfQ0FMTF9FWElTVFMg KGN1TWVtQWxsb2NNYW5hZ2VkKSk7CisgIENVc3RyZWFtIGNvcHlfc3RyZWFtID0gTlVMTDsK IAogICBwdGhyZWFkX211dGV4X2xvY2sgKCZwdHhfZGV2LT5vbXBfc3RhY2tzLmxvY2spOwog ICB2b2lkICpzdGFja3MgPSBudnB0eF9zdGFja3NfYWNxdWlyZSAocHR4X2Rldiwgc3RhY2tf c2l6ZSwgdGVhbXMgKiB0aHJlYWRzKTsKQEAgLTIwMjksMTIgKzIxMjEsNjIgQEAgR09NUF9P RkZMT0FEX3J1biAoaW50IG9yZCwgdm9pZCAqdGd0X2ZuLCB2b2lkICp0Z3RfdmFycywgdm9p ZCAqKmFyZ3MpCiAgIEdPTVBfUExVR0lOX2RlYnVnICgwLCAiICAlczoga2VybmVsICVzOiBs YXVuY2giCiAJCSAgICAgIiBbKHRlYW1zOiAldSksIDEsIDFdIFsobGFuZXM6IDMyKSwgKHRo cmVhZHM6ICV1KSwgMV1cbiIsCiAJCSAgICAgX19GVU5DVElPTl9fLCBmbl9uYW1lLCB0ZWFt cywgdGhyZWFkcyk7CisgIGlmIChyZXZlcnNlX29mZikKKyAgICBDVURBX0NBTExfQVNTRVJU IChjdVN0cmVhbUNyZWF0ZSwgJmNvcHlfc3RyZWFtLCBDVV9TVFJFQU1fTk9OX0JMT0NLSU5H KTsKICAgciA9IENVREFfQ0FMTF9OT0NIRUNLIChjdUxhdW5jaEtlcm5lbCwgZnVuY3Rpb24s IHRlYW1zLCAxLCAxLAogCQkJIDMyLCB0aHJlYWRzLCAxLCAwLCBOVUxMLCBOVUxMLCBjb25m aWcpOwogICBpZiAociAhPSBDVURBX1NVQ0NFU1MpCiAgICAgR09NUF9QTFVHSU5fZmF0YWwg KCJjdUxhdW5jaEtlcm5lbCBlcnJvcjogJXMiLCBjdWRhX2Vycm9yIChyKSk7Ci0KLSAgciA9 IENVREFfQ0FMTF9OT0NIRUNLIChjdUN0eFN5bmNocm9uaXplLCApOworICBpZiAocmV2ZXJz ZV9vZmYpCisgICAgd2hpbGUgKHRydWUpCisgICAgICB7CisJciA9IENVREFfQ0FMTF9OT0NI RUNLIChjdVN0cmVhbVF1ZXJ5LCBOVUxMKTsKKwlpZiAociA9PSBDVURBX1NVQ0NFU1MpCisJ ICBicmVhazsKKwlpZiAociA9PSBDVURBX0VSUk9SX0xBVU5DSF9GQUlMRUQpCisJICBHT01Q X1BMVUdJTl9mYXRhbCAoImN1U3RyZWFtUXVlcnkgZXJyb3I6ICVzICVzXG4iLCBjdWRhX2Vy cm9yIChyKSwKKwkJCSAgICAgbWF5YmVfYWJvcnRfbXNnKTsKKwllbHNlIGlmIChyICE9IENV REFfRVJST1JfTk9UX1JFQURZKQorCSAgR09NUF9QTFVHSU5fZmF0YWwgKCJjdVN0cmVhbVF1 ZXJ5IGVycm9yOiAlcyIsIGN1ZGFfZXJyb3IgKHIpKTsKKwlpZiAoIWhhc191c20pCisJICB7 CisJICAgIENVREFfQ0FMTF9BU1NFUlQgKGN1TWVtY3B5RHRvSEFzeW5jLCBwdHhfZGV2LT5y ZXZfZGF0YSwKKwkJCSAgICAgIHB0eF9kZXYtPnJldl9kYXRhX2RldiwKKwkJCSAgICAgIHNp emVvZiAoKnB0eF9kZXYtPnJldl9kYXRhKSwgY29weV9zdHJlYW0pOworCSAgICBDVURBX0NB TExfQVNTRVJUIChjdVN0cmVhbVN5bmNocm9uaXplLCBjb3B5X3N0cmVhbSk7CisJICB9CisJ aWYgKHB0eF9kZXYtPnJldl9kYXRhLT5mbiAhPSAwKQorCSAgeworCSAgICBzdHJ1Y3QgcmV2 X29mZmxvYWQgKnJldl9kYXRhID0gcHR4X2Rldi0+cmV2X2RhdGE7CisJICAgIHVpbnQ2NF90 IGZuX3B0ciA9IHJldl9kYXRhLT5mbjsKKwkgICAgdWludDY0X3QgbWFwbnVtID0gcmV2X2Rh dGEtPm1hcG51bTsKKwkgICAgdWludDY0X3QgYWRkcl9wdHIgPSByZXZfZGF0YS0+YWRkcnM7 CisJICAgIHVpbnQ2NF90IHNpemVzX3B0ciA9IHJldl9kYXRhLT5zaXplczsKKwkgICAgdWlu dDY0X3Qga2luZHNfcHRyID0gcmV2X2RhdGEtPmtpbmRzOworCSAgICBpbnQgZGV2X251bSA9 IChpbnQpIHJldl9kYXRhLT5kZXZfbnVtOworCSAgICBHT01QX1BMVUdJTl90YXJnZXRfcmV2 IChmbl9wdHIsIG1hcG51bSwgYWRkcl9wdHIsIHNpemVzX3B0ciwKKwkJCQkgICAga2luZHNf cHRyLCBkZXZfbnVtLCByZXZfb2ZmX2Rldl90b19ob3N0X2NweSwKKwkJCQkgICAgcmV2X29m Zl9ob3N0X3RvX2Rldl9jcHksIGNvcHlfc3RyZWFtKTsKKwkgICAgcmV2X2RhdGEtPmZuID0g MDsKKwkgICAgaWYgKCFoYXNfdXNtKQorCSAgICAgIHsKKwkJLyogZm4gaXMgdGhlIGZpcnN0 IGVsZW1lbnQuICovCisJCXIgPSBDVURBX0NBTExfTk9DSEVDSyAoY3VNZW1jcHlIdG9EQXN5 bmMsCisJCQkJICAgICAgIHB0eF9kZXYtPnJldl9kYXRhX2RldiwKKwkJCQkgICAgICAgcHR4 X2Rldi0+cmV2X2RhdGEsCisJCQkJICAgICAgIHNpemVvZiAocHR4X2Rldi0+cmV2X2RhdGEt PmZuKSwKKwkJCQkgICAgICAgY29weV9zdHJlYW0pOworCQlpZiAociAhPSBDVURBX1NVQ0NF U1MpCisJCSAgR09NUF9QTFVHSU5fZmF0YWwgKCJjdU1lbWNweUh0b0QgZXJyb3I6ICVzIiwg Y3VkYV9lcnJvciAocikpOworCQlDVURBX0NBTExfQVNTRVJUIChjdVN0cmVhbVN5bmNocm9u aXplLCBjb3B5X3N0cmVhbSk7CisJICAgICAgfQorCSAgfQorCXVzbGVlcCAoMSk7CisgICAg ICB9CisgIGVsc2UKKyAgICByID0gQ1VEQV9DQUxMX05PQ0hFQ0sgKGN1Q3R4U3luY2hyb25p emUsICk7CisgIGlmIChyZXZlcnNlX29mZikKKyAgICBDVURBX0NBTExfQVNTRVJUIChjdVN0 cmVhbURlc3Ryb3ksIGNvcHlfc3RyZWFtKTsKICAgaWYgKHIgPT0gQ1VEQV9FUlJPUl9MQVVO Q0hfRkFJTEVEKQogICAgIEdPTVBfUExVR0lOX2ZhdGFsICgiY3VDdHhTeW5jaHJvbml6ZSBl cnJvcjogJXMgJXNcbiIsIGN1ZGFfZXJyb3IgKHIpLAogCQkgICAgICAgbWF5YmVfYWJvcnRf bXNnKTsKZGlmZiAtLWdpdCBhL2xpYmdvbXAvdGFyZ2V0LmMgYi9saWJnb21wL3RhcmdldC5j CmluZGV4IDEzNWRiMWQ4OGFiLi4wYzZmYWQ2OTBmMSAxMDA2NDQKLS0tIGEvbGliZ29tcC90 YXJnZXQuYworKysgYi9saWJnb21wL3RhcmdldC5jCkBAIC0yODU2LDYgKzI4NTYsMjQgQEAg R09NUF90YXJnZXRfZXh0IChpbnQgZGV2aWNlLCB2b2lkICgqZm4pICh2b2lkICopLCBzaXpl X3QgbWFwbnVtLAogICAgIGh0YWJfZnJlZSAocmVmY291bnRfc2V0KTsKIH0KIAorLyogSGFu ZGxlIHJldmVyc2Ugb2ZmbG9hZC4gVGhpcyBpcyBub3QgY2FsbGVkIGZvciB0aGUgaG9zdC4g Ki8KKwordm9pZAorZ29tcF90YXJnZXRfcmV2ICh1aW50NjRfdCBmbl9wdHIgX19hdHRyaWJ1 dGVfXyAoKHVudXNlZCkpLAorCQkgdWludDY0X3QgbWFwbnVtIF9fYXR0cmlidXRlX18gKCh1 bnVzZWQpKSwKKwkJIHVpbnQ2NF90IGRldmFkZHJzX3B0ciBfX2F0dHJpYnV0ZV9fICgodW51 c2VkKSksCisJCSB1aW50NjRfdCBzaXplc19wdHIgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkp LAorCQkgdWludDY0X3Qga2luZHNfcHRyIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKKwkJ IGludCBkZXZfbnVtIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKKwkJIHZvaWQgKCpkZXZf dG9faG9zdF9jcHkpICh2b2lkICosIGNvbnN0IHZvaWQgKiwgc2l6ZV90LAorCQkJCQkgIHZv aWQgKikgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAorCQkgdm9pZCAoKmhvc3RfdG9fZGV2 X2NweSkgKHZvaWQgKiwgY29uc3Qgdm9pZCAqLCBzaXplX3QsCisJCQkJCSAgdm9pZCAqKSBf X2F0dHJpYnV0ZV9fICgodW51c2VkKSksCisJCSB2b2lkICp0b2tlbiBfX2F0dHJpYnV0ZV9f ICgodW51c2VkKSkpCit7CisgIF9fYnVpbHRpbl91bnJlYWNoYWJsZSAoKTsKK30KKwogLyog SG9zdCBmYWxsYmFjayBmb3IgR09NUF90YXJnZXRfZGF0YXssX2V4dH0gcm91dGluZXMuICAq LwogCiBzdGF0aWMgdm9pZAo= --------------KQw6xnbzVBDT0ypNmD0e5TD8-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from esa4.mentor.iphmx.com (esa4.mentor.iphmx.com [68.232.137.252]) by sourceware.org (Postfix) with ESMTPS id 92E67385142A for ; Fri, 26 Aug 2022 09:07:39 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 92E67385142A Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=codesourcery.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=mentor.com X-IronPort-AV: E=Sophos;i="5.93,264,1654588800"; d="diff'?scan'208,217";a="81990010" Received: from orw-gwy-01-in.mentorg.com ([192.94.38.165]) by esa4.mentor.iphmx.com with ESMTP; 26 Aug 2022 01:07:37 -0800 IronPort-SDR: gIWhXNg9xsCvqmCG0ghD6B4WgGold5WRd3sxKtWNXQ6yvRig6lQZUHrXJ+JvZpnkvsR1/Gti02 e4zHJOs9mf3WPc6nXvTz2XDeoRBpmoCAbYCTxQi+Pm4CmwVJdNtsZHkGe1rOkdy9s9Soj/QcoL iKeNhiLSfaYsBSMOgPK8Jyw4wqeoDWghZWGjHshZxQjOun/1neSvGgmB7LRu0fZbewFY388Wty lPFOHkIx2nzN0/XqS6EyKzJEw3cqp/72a06fUZ/fLr0AC8/VUQs9v0W7utazB5Z1tzO2SjETYW pfI= Content-Type: multipart/mixed; boundary="------------KQw6xnbzVBDT0ypNmD0e5TD8" Message-ID: <57b3ae5e-8f15-8bea-fa09-39bccbaa2414@codesourcery.com> Date: Fri, 26 Aug 2022 11:07:28 +0200 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.2.0 Content-Language: en-US From: Tobias Burnus To: Jakub Jelinek , Tom de Vries , gcc-patches CC: Alexander Monakov Subject: [Patch] libgomp/nvptx: Prepare for reverse-offload callback handling X-Originating-IP: [137.202.0.90] X-ClientProxiedBy: svr-ies-mbx-11.mgc.mentorg.com (139.181.222.11) To svr-ies-mbx-12.mgc.mentorg.com (139.181.222.12) X-Spam-Status: No, score=-11.4 required=5.0 tests=BAYES_00,GIT_PATCH_0,HEADER_FROM_DIFFERENT_DOMAINS,HTML_MESSAGE,KAM_DMARC_STATUS,KAM_SHORT,SPF_HELO_PASS,SPF_PASS,TXREP,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: Message-ID: <20220826090728.bl6YugMOjViZTzay3lO9j9C66QjKs-bIGcHhgS3qbZ0@z> --------------KQw6xnbzVBDT0ypNmD0e5TD8 Content-Type: multipart/alternative; boundary="------------b6FEzRUMprHe28PtyulUNtg1" --------------b6FEzRUMprHe28PtyulUNtg1 Content-Type: text/plain; charset="utf-8"; format=flowed Content-Transfer-Encoding: quoted-printable @Tom and Alexander: Better suggestions are welcome for the busy loop in libgomp/plugin/plugin-nvptx.c regarding the variable placement and checking its value. PRE-REMARK As nvptx (and all other plugins) returns <=3D 0 for GOMP_OFFLOAD_get_num_devices if GOMP_REQUIRES_REVERSE_OFFLOAD is set. This patch is currently still a no op. The patch is almost stand alone, except that it either needs a void *rev_fn_table =3D NULL; in GOMP_OFFLOAD_load_image or the following patch: [Patch][2/3] nvptx: libgomp+mkoffload.cc: Prepare for reverse offload fn = lookup https://gcc.gnu.org/pipermail/gcc-patches/2022-August/600348.html (which in turn needs the '[1/3]' patch). Not required to be compilable, but the patch is based on the ideas/code from the reverse-offload ME patch; the latter adds calls to GOMP_target_ext (omp_initial_device, which is for host fallback code processed by the normal target_ext and for device code by the target_ext of this patch. =E2=86=92 "[Patch] OpenMP: Support reverse offload (middle end part)" https://gcc.gnu.org/pipermail/gcc-patches/2022-July/598662.html * * * This patch adds initial offloading support for nvptx. When the nvptx's device GOMP_target_ext is called - it creates a lock, fills a struct with the argument pointers (addr, kinds, sizes), its device number and the set the function pointer address. On the host side, the last address is checked - if fn_addr !=3D NULL, it passes all arguments on to the generic (target.c) gomp_target_rev to do the actual offloading. CUDA does lockup when trying to copy data from the currently running stream; hence, a new stream is generated to do the memory copying. Just having managed memory is not enough - it needs to be concurrently accessible - otherwise, it will segfault on the host when migrated to the device. OK for mainline? * * * Future work for nvptx: * Adjust 'sleep', possibly using different values with and without USM and to do shorter sleeps than usleep(1)? * Set a flag whether there is any offload function at all, avoiding to run the more expensive check if there is 'requires reverse_offload' without actual reverse-offloading functions present. (Recall that the '2/3' patch, mentioned above, only has fn !=3D NULL for reverse-offload functions.) * Document =E2=86=92 libgomp.texi that reverse offload may cause some perfo= rmance overhead for all target regions. + That reverse offload is run serialized. And obviously: submitting the missing bits to get reverse offload working, but that's mostly not an nvptx topic. Tobias ----------------- Siemens Electronic Design Automation GmbH; Anschrift: Arnulfstra=C3=9Fe 201= , 80634 M=C3=BCnchen; Gesellschaft mit beschr=C3=A4nkter Haftung; Gesch=C3= =A4ftsf=C3=BChrer: Thomas Heurung, Frank Th=C3=BCrauf; Sitz der Gesellschaf= t: M=C3=BCnchen; Registergericht M=C3=BCnchen, HRB 106955 --------------b6FEzRUMprHe28PtyulUNtg1-- --------------KQw6xnbzVBDT0ypNmD0e5TD8 Content-Type: text/x-patch; charset="UTF-8"; name="rev-offload-run-nvptx.diff" Content-Disposition: attachment; filename="rev-offload-run-nvptx.diff" Content-Transfer-Encoding: base64 bGliZ29tcC9udnB0eDogUHJlcGFyZSBmb3IgcmV2ZXJzZS1vZmZsb2FkIGNh bGxiYWNrIGhhbmRsaW5nCgpUaGlzIHBhdGNoIGFkZHMgYSBzdHViICdnb21w X3RhcmdldF9yZXYnIGluIHRoZSBob3N0J3MgdGFyZ2V0LmMsIHdoaWNoIHdp bGwKbGF0ZXIgaGFuZGxlIHRoZSByZXZlcnNlIG9mZmxvYWQuCkZvciBudnB0 eCwgaXQgYWRkcyBzdXBwb3J0IGZvciBmb3J3YXJkaW5nIHRoZSBvZmZsb2Fk IGdvbXBfdGFyZ2V0X2V4dCBjYWxsCnRvIHRoZSBob3N0IGJ5IHNldHRpbmcg dmFsdWVzIGluIGEgc3RydWN0IG9uIHRoZSBkZXZpY2UgYW5kIHF1ZXJ5aW5n IGl0IG9uCnRoZSBob3N0IC0gaW52b2tpbmcgZ29tcF90YXJnZXRfcmV2IG9u IHRoZSByZXN1bHQuCgppbmNsdWRlL0NoYW5nZUxvZzoKCgkqIGN1ZGEvY3Vk YS5oIChlbnVtIENVZGV2aWNlX2F0dHJpYnV0ZSk6IEFkZAoJQ1VfREVWSUNF X0FUVFJJQlVURV9DT05DVVJSRU5UX01BTkFHRURfQUNDRVNTLgoJKGVudW0g Q1VtZW1BdHRhY2hfZmxhZ3MpOiBOZXcgc3R1YiB3aXRoIG9ubHkgbWVtYmVy CglDVV9NRU1fQVRUQUNIX0dMT0JBTC4KCShjdU1lbUFsbG9jTWFuYWdlZCk6 IEFkZCBwcm90b3R5cGUuCgpsaWJnb21wL0NoYW5nZUxvZzoKCgkqIGNvbmZp Zy9udnB0eC9pY3YtZGV2aWNlLmMgKEdPTVBfREVWSUNFX05VTV9WQVIpOiBS ZW1vdmUKCSdzdGF0aWMnIGZvciB0aGlzIHZhcmlhYmxlLgoJKiBjb25maWcv bnZwdHgvdGFyZ2V0LmMgKEdPTVBfUkVWX09GRkxPQURfVkFSKTogI2RlZmlu ZSBhcwoJdmFyaWFibGUtbmFtZSBzdHJpbmcgYW5kIHVzZSBpdCB0byBkZWZp bmUgdGhlIHZhcmlhYmxlLgoJKEdPTVBfREVWSUNFX05VTV9WQVIpOiBEZWNs YXJlIHRoaXMgZXh0ZXJuIGdsb2JhbCB2YXIuCgkoc3RydWN0IHJldl9vZmZs b2FkKTogRGVmaW5lLgoJKEdPTVBfdGFyZ2V0X2V4dCk6IEhhbmRsZSByZXZl cnNlIG9mZmxvYWQuCgkqIGxpYmdvbXAtcGx1Z2luLmggKEdPTVBfUExVR0lO X3RhcmdldF9yZXYpOiBOZXcgcHJvdG90eXBlLgoJKiBsaWJnb21wLXBsdWdp bi5jIChHT01QX1BMVUdJTl90YXJnZXRfcmV2KTogTmV3LCBjYWxsIC4uLgoJ KiB0YXJnZXQuYyAoZ29tcF90YXJnZXRfcmV2KTogLi4uIHRoaXMgbmV3IHN0 dWIgZnVuY3Rpb24uCgkqIGxpYmdvbXAuaCAoZ29tcF90YXJnZXRfcmV2KTog RGVjbGFyZS4KCSogbGliZ29tcC5tYXAgKEdPTVBfUExVR0lOXzEuNCk6IE5l dzsgYWRkIEdPTVBfUExVR0lOX3RhcmdldF9yZXYuCgkqIHBsdWdpbi9jdWRh LWxpYi5kZWYgKGN1TWVtQWxsb2NNYW5hZ2VkKTogQWRkLgoJKiBwbHVnaW4v cGx1Z2luLW52cHR4LmMgKEdPTVBfUkVWX09GRkxPQURfVkFSKTogI2RlZmlu ZSB2YXIgc3RyaW5nLgoJKHN0cnVjdCByZXZfb2ZmbG9hZCk6IE5ldy4KCShz dHJ1Y3QgcHR4X2RldmljZSk6IEFkZCBjb25jdXJyX21hbmFnZWRfYWNjZXNz LCByZXZfZGF0YQoJYW5kIHJldl9kYXRhX2Rldi4KCShudnB0eF9vcGVuX2Rl dmljZSk6IFNldCBwdHhfZGV2aWNlJ3MgY29uY3Vycl9tYW5hZ2VkX2FjY2Vz czsKCScjaWYgMCcgdW51c2VkIGFzeW5jX2VuZ2luZXMuCgkoR09NUF9PRkZM T0FEX2xvYWRfaW1hZ2UpOiBBbGxvY2F0ZSByZXZfZGF0YSB2YXJpYWJsZS4K CShyZXZfb2ZmX2Rldl90b19ob3N0X2NweSwgcmV2X29mZl9ob3N0X3RvX2Rl dl9jcHkpOiBOZXcuCgkoR09NUF9PRkZMT0FEX3J1bik6IEhhbmRsZSByZXZl cnNlIG9mZmxvYWRpbmcuCgogaW5jbHVkZS9jdWRhL2N1ZGEuaCAgICAgICAg ICAgICAgIHwgICA4ICsrLQogbGliZ29tcC9jb25maWcvbnZwdHgvaWN2LWRl dmljZS5jIHwgICAyICstCiBsaWJnb21wL2NvbmZpZy9udnB0eC90YXJnZXQu YyAgICAgfCAgNTIgKysrKysrKysrKysrLS0KIGxpYmdvbXAvbGliZ29tcC1w bHVnaW4uYyAgICAgICAgICB8ICAxMiArKysrCiBsaWJnb21wL2xpYmdvbXAt cGx1Z2luLmggICAgICAgICAgfCAgIDcgKysKIGxpYmdvbXAvbGliZ29tcC5o ICAgICAgICAgICAgICAgICB8ICAgNSArKwogbGliZ29tcC9saWJnb21wLm1h cCAgICAgICAgICAgICAgIHwgICA1ICsrCiBsaWJnb21wL3BsdWdpbi9jdWRh LWxpYi5kZWYgICAgICAgfCAgIDEgKwogbGliZ29tcC9wbHVnaW4vcGx1Z2lu LW52cHR4LmMgICAgIHwgMTQ4ICsrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKystCiBsaWJnb21wL3RhcmdldC5jICAgICAgICAgICAgICAg ICAgfCAgMTggKysrKysKIDEwIGZpbGVzIGNoYW5nZWQsIDI0NiBpbnNlcnRp b25zKCspLCAxMiBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9pbmNsdWRl L2N1ZGEvY3VkYS5oIGIvaW5jbHVkZS9jdWRhL2N1ZGEuaAppbmRleCAzOTM4 ZDA1ZDE1MC4uMDhlNDk2YTJlOTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY3Vk YS9jdWRhLmgKKysrIGIvaW5jbHVkZS9jdWRhL2N1ZGEuaApAQCAtNzcsOSAr NzcsMTQgQEAgdHlwZWRlZiBlbnVtIHsKICAgQ1VfREVWSUNFX0FUVFJJQlVU RV9DT05DVVJSRU5UX0tFUk5FTFMgPSAzMSwKICAgQ1VfREVWSUNFX0FUVFJJ QlVURV9NQVhfVEhSRUFEU19QRVJfTVVMVElQUk9DRVNTT1IgPSAzOSwKICAg Q1VfREVWSUNFX0FUVFJJQlVURV9BU1lOQ19FTkdJTkVfQ09VTlQgPSA0MCwK LSAgQ1VfREVWSUNFX0FUVFJJQlVURV9NQVhfUkVHSVNURVJTX1BFUl9NVUxU SVBST0NFU1NPUiA9IDgyCisgIENVX0RFVklDRV9BVFRSSUJVVEVfTUFYX1JF R0lTVEVSU19QRVJfTVVMVElQUk9DRVNTT1IgPSA4MiwKKyAgQ1VfREVWSUNF X0FUVFJJQlVURV9DT05DVVJSRU5UX01BTkFHRURfQUNDRVNTID0gODkKIH0g Q1VkZXZpY2VfYXR0cmlidXRlOwogCit0eXBlZGVmIGVudW0geworICBDVV9N RU1fQVRUQUNIX0dMT0JBTCA9IDB4MQorfSBDVW1lbUF0dGFjaF9mbGFnczsK KwogZW51bSB7CiAgIENVX0VWRU5UX0RFRkFVTFQgPSAwLAogICBDVV9FVkVO VF9ESVNBQkxFX1RJTUlORyA9IDIKQEAgLTE2OSw2ICsxNzQsNyBAQCBDVXJl c3VsdCBjdU1lbUdldEluZm8gKHNpemVfdCAqLCBzaXplX3QgKik7CiBDVXJl c3VsdCBjdU1lbUFsbG9jIChDVWRldmljZXB0ciAqLCBzaXplX3QpOwogI2Rl ZmluZSBjdU1lbUFsbG9jSG9zdCBjdU1lbUFsbG9jSG9zdF92MgogQ1VyZXN1 bHQgY3VNZW1BbGxvY0hvc3QgKHZvaWQgKiosIHNpemVfdCk7CitDVXJlc3Vs dCBjdU1lbUFsbG9jTWFuYWdlZCAoQ1VkZXZpY2VwdHIgKiwgc2l6ZV90LCB1 bnNpZ25lZCBpbnQpOwogQ1VyZXN1bHQgY3VNZW1jcHkgKENVZGV2aWNlcHRy LCBDVWRldmljZXB0ciwgc2l6ZV90KTsKICNkZWZpbmUgY3VNZW1jcHlEdG9E QXN5bmMgY3VNZW1jcHlEdG9EQXN5bmNfdjIKIENVcmVzdWx0IGN1TWVtY3B5 RHRvREFzeW5jIChDVWRldmljZXB0ciwgQ1VkZXZpY2VwdHIsIHNpemVfdCwg Q1VzdHJlYW0pOwpkaWZmIC0tZ2l0IGEvbGliZ29tcC9jb25maWcvbnZwdHgv aWN2LWRldmljZS5jIGIvbGliZ29tcC9jb25maWcvbnZwdHgvaWN2LWRldmlj ZS5jCmluZGV4IGZhZjkwZjk5NDdjLi5mNGYxOGNkYWM1ZSAxMDA2NDQKLS0t IGEvbGliZ29tcC9jb25maWcvbnZwdHgvaWN2LWRldmljZS5jCisrKyBiL2xp YmdvbXAvY29uZmlnL252cHR4L2ljdi1kZXZpY2UuYwpAQCAtNjAsNyArNjAs NyBAQCBvbXBfaXNfaW5pdGlhbF9kZXZpY2UgKHZvaWQpCiAKIC8qIFRoaXMg aXMgc2V0IHRvIHRoZSBkZXZpY2UgbnVtYmVyIG9mIGN1cnJlbnQgR1BVIGR1 cmluZyBkZXZpY2UgaW5pdGlhbGl6YXRpb24sCiAgICB3aGVuIHRoZSBvZmZs b2FkIGltYWdlIGNvbnRhaW5pbmcgdGhpcyBsaWJnb21wIHBvcnRpb24gaXMg bG9hZGVkLiAgKi8KLXN0YXRpYyB2b2xhdGlsZSBpbnQgR09NUF9ERVZJQ0Vf TlVNX1ZBUjsKK3ZvbGF0aWxlIGludCBHT01QX0RFVklDRV9OVU1fVkFSOwog CiBpbnQKIG9tcF9nZXRfZGV2aWNlX251bSAodm9pZCkKZGlmZiAtLWdpdCBh L2xpYmdvbXAvY29uZmlnL252cHR4L3RhcmdldC5jIGIvbGliZ29tcC9jb25m aWcvbnZwdHgvdGFyZ2V0LmMKaW5kZXggMTExMDhkMjBlMTUuLjA2ZjZjZDhi NjExIDEwMDY0NAotLS0gYS9saWJnb21wL2NvbmZpZy9udnB0eC90YXJnZXQu YworKysgYi9saWJnb21wL2NvbmZpZy9udnB0eC90YXJnZXQuYwpAQCAtMjYs NyArMjYsMjkgQEAKICNpbmNsdWRlICJsaWJnb21wLmgiCiAjaW5jbHVkZSA8 bGltaXRzLmg+CiAKKyNkZWZpbmUgR09NUF9SRVZfT0ZGTE9BRF9WQVIgX19n b21wX3Jldl9vZmZsb2FkX3ZhcgorCisvKiBSZXZlcnNlIG9mZmxvYWQuIE11 c3QgbWF0Y2ggdmVyc2lvbiB1c2VkIGluIHBsdWdpbi9wbHVnaW4tbnZwdHgu Yy4gKi8KK3N0cnVjdCByZXZfb2ZmbG9hZCB7CisgIHVpbnQ2NF90IGZuOwor ICB1aW50NjRfdCBtYXBudW07CisgIHVpbnQ2NF90IGFkZHJzOworICB1aW50 NjRfdCBzaXplczsKKyAgdWludDY0X3Qga2luZHM7CisgIGludDMyX3QgZGV2 X251bTsKKyAgdWludDMyX3QgbG9jazsKK307CisKKyNpZiAoX19TSVpFT0Zf U0hPUlRfXyAhPSAyIFwKKyAgICAgfHwgX19TSVpFT0ZfU0laRV9UX18gIT0g OCBcCisgICAgIHx8IF9fU0laRU9GX1BPSU5URVJfXyAhPSA4KQorI2Vycm9y ICJEYXRhLXR5cGUgY29udmVyc2lvbiByZXF1aXJlZCBmb3IgcmV2X29mZmxv YWQiCisjZW5kaWYKKworCiBleHRlcm4gaW50IF9fZ29tcF90ZWFtX251bSBf X2F0dHJpYnV0ZV9fKChzaGFyZWQpKTsKK2V4dGVybiB2b2xhdGlsZSBpbnQg R09NUF9ERVZJQ0VfTlVNX1ZBUjsKK3ZvbGF0aWxlIHN0cnVjdCByZXZfb2Zm bG9hZCAqR09NUF9SRVZfT0ZGTE9BRF9WQVI7CiAKIGJvb2wKIEdPTVBfdGVh bXM0ICh1bnNpZ25lZCBpbnQgbnVtX3RlYW1zX2xvd2VyLCB1bnNpZ25lZCBp bnQgbnVtX3RlYW1zX3VwcGVyLApAQCAtODgsMTYgKzExMCwzMiBAQCBHT01Q X3RhcmdldF9leHQgKGludCBkZXZpY2UsIHZvaWQgKCpmbikgKHZvaWQgKiks IHNpemVfdCBtYXBudW0sCiAJCSB2b2lkICoqaG9zdGFkZHJzLCBzaXplX3Qg KnNpemVzLCB1bnNpZ25lZCBzaG9ydCAqa2luZHMsCiAJCSB1bnNpZ25lZCBp bnQgZmxhZ3MsIHZvaWQgKipkZXBlbmQsIHZvaWQgKiphcmdzKQogewotICAo dm9pZCkgZGV2aWNlOwotICAodm9pZCkgZm47Ci0gICh2b2lkKSBtYXBudW07 Ci0gICh2b2lkKSBob3N0YWRkcnM7Ci0gICh2b2lkKSBzaXplczsKLSAgKHZv aWQpIGtpbmRzOwogICAodm9pZCkgZmxhZ3M7CiAgICh2b2lkKSBkZXBlbmQ7 CiAgICh2b2lkKSBhcmdzOwotICBfX2J1aWx0aW5fdW5yZWFjaGFibGUgKCk7 CisKKyAgaWYgKGRldmljZSAhPSBHT01QX0RFVklDRV9IT1NUX0ZBTExCQUNL CisgICAgICB8fCBmbiA9PSBOVUxMCisgICAgICB8fCBHT01QX1JFVl9PRkZM T0FEX1ZBUiA9PSBOVUxMKQorICAgIHJldHVybjsKKworICB3aGlsZSAoX19z eW5jX2xvY2tfdGVzdF9hbmRfc2V0ICgmR09NUF9SRVZfT0ZGTE9BRF9WQVIt PmxvY2ssICh1aW50OF90KSAxKSkKKyAgICA7ICAvKiBzcGluICAqLworCisg IF9fYXRvbWljX3N0b3JlX24gKCZHT01QX1JFVl9PRkZMT0FEX1ZBUi0+bWFw bnVtLCBtYXBudW0sIF9fQVRPTUlDX1NFUV9DU1QpOworICBfX2F0b21pY19z dG9yZV9uICgmR09NUF9SRVZfT0ZGTE9BRF9WQVItPmFkZHJzLCBob3N0YWRk cnMsIF9fQVRPTUlDX1NFUV9DU1QpOworICBfX2F0b21pY19zdG9yZV9uICgm R09NUF9SRVZfT0ZGTE9BRF9WQVItPnNpemVzLCBzaXplcywgX19BVE9NSUNf U0VRX0NTVCk7CisgIF9fYXRvbWljX3N0b3JlX24gKCZHT01QX1JFVl9PRkZM T0FEX1ZBUi0+a2luZHMsIGtpbmRzLCBfX0FUT01JQ19TRVFfQ1NUKTsKKyAg X19hdG9taWNfc3RvcmVfbiAoJkdPTVBfUkVWX09GRkxPQURfVkFSLT5kZXZf bnVtLCBHT01QX0RFVklDRV9OVU1fVkFSLAorCQkgICAgX19BVE9NSUNfU0VR X0NTVCk7CisKKyAgLyogJ2ZuJyBtdXN0IGJlIGxhc3QuICAqLworICBfX2F0 b21pY19zdG9yZV9uICgmR09NUF9SRVZfT0ZGTE9BRF9WQVItPmZuLCBmbiwg X19BVE9NSUNfU0VRX0NTVCk7CisKKyAgLyogUHJvY2Vzc2VkIG9uIHRoZSBo b3N0IC0gd2hlbiBkb25lLCBmbiBpcyBzZXQgdG8gTlVMTC4gICovCisgIHdo aWxlIChfX2F0b21pY19sb2FkX24gKCZHT01QX1JFVl9PRkZMT0FEX1ZBUi0+ Zm4sIF9fQVRPTUlDX1NFUV9DU1QpICE9IDApCisgICAgOyAgLyogc3BpbiAg Ki8KKyAgX19zeW5jX2xvY2tfcmVsZWFzZSAoJkdPTVBfUkVWX09GRkxPQURf VkFSLT5sb2NrKTsKIH0KIAogdm9pZApkaWZmIC0tZ2l0IGEvbGliZ29tcC9s aWJnb21wLXBsdWdpbi5jIGIvbGliZ29tcC9saWJnb21wLXBsdWdpbi5jCmlu ZGV4IDlkNGNjNjIzYTEwLi4zMTZkZTc0OWY2OSAxMDA2NDQKLS0tIGEvbGli Z29tcC9saWJnb21wLXBsdWdpbi5jCisrKyBiL2xpYmdvbXAvbGliZ29tcC1w bHVnaW4uYwpAQCAtNzgsMyArNzgsMTUgQEAgR09NUF9QTFVHSU5fZmF0YWwg KGNvbnN0IGNoYXIgKm1zZywgLi4uKQogICBnb21wX3ZmYXRhbCAobXNnLCBh cCk7CiAgIHZhX2VuZCAoYXApOwogfQorCit2b2lkCitHT01QX1BMVUdJTl90 YXJnZXRfcmV2ICh1aW50NjRfdCBmbl9wdHIsIHVpbnQ2NF90IG1hcG51bSwg dWludDY0X3QgZGV2YWRkcnNfcHRyLAorCQkJdWludDY0X3Qgc2l6ZXNfcHRy LCB1aW50NjRfdCBraW5kc19wdHIsIGludCBkZXZfbnVtLAorCQkJdm9pZCAo KmRldl90b19ob3N0X2NweSkgKHZvaWQgKiwgY29uc3Qgdm9pZCAqLCBzaXpl X3QsCisJCQkJCQkgdm9pZCAqKSwKKwkJCXZvaWQgKCpob3N0X3RvX2Rldl9j cHkpICh2b2lkICosIGNvbnN0IHZvaWQgKiwgc2l6ZV90LAorCQkJCQkJIHZv aWQgKiksIHZvaWQgKnRva2VuKQoreworICBnb21wX3RhcmdldF9yZXYgKGZu X3B0ciwgbWFwbnVtLCBkZXZhZGRyc19wdHIsIHNpemVzX3B0ciwga2luZHNf cHRyLCBkZXZfbnVtLAorCQkgICBkZXZfdG9faG9zdF9jcHksIGhvc3RfdG9f ZGV2X2NweSwgdG9rZW4pOworfQpkaWZmIC0tZ2l0IGEvbGliZ29tcC9saWJn b21wLXBsdWdpbi5oIGIvbGliZ29tcC9saWJnb21wLXBsdWdpbi5oCmluZGV4 IGFiM2VkNjM4NDc1Li40MGRmYjUyZTQ0ZSAxMDA2NDQKLS0tIGEvbGliZ29t cC9saWJnb21wLXBsdWdpbi5oCisrKyBiL2xpYmdvbXAvbGliZ29tcC1wbHVn aW4uaApAQCAtMTIxLDYgKzEyMSwxMyBAQCBleHRlcm4gdm9pZCBHT01QX1BM VUdJTl9lcnJvciAoY29uc3QgY2hhciAqLCAuLi4pCiBleHRlcm4gdm9pZCBH T01QX1BMVUdJTl9mYXRhbCAoY29uc3QgY2hhciAqLCAuLi4pCiAJX19hdHRy aWJ1dGVfXyAoKG5vcmV0dXJuLCBmb3JtYXQgKHByaW50ZiwgMSwgMikpKTsK IAorZXh0ZXJuIHZvaWQgR09NUF9QTFVHSU5fdGFyZ2V0X3JldiAodWludDY0 X3QsIHVpbnQ2NF90LCB1aW50NjRfdCwgdWludDY0X3QsCisJCQkJICAgIHVp bnQ2NF90LCBpbnQsCisJCQkJICAgIHZvaWQgKCopICh2b2lkICosIGNvbnN0 IHZvaWQgKiwgc2l6ZV90LAorCQkJCQkgICAgICB2b2lkICopLAorCQkJCSAg ICB2b2lkICgqKSAodm9pZCAqLCBjb25zdCB2b2lkICosIHNpemVfdCwKKwkJ CQkJICAgICAgdm9pZCAqKSwgdm9pZCAqKTsKKwogLyogUHJvdG90eXBlcyBm b3IgZnVuY3Rpb25zIGltcGxlbWVudGVkIGJ5IGxpYmdvbXAgcGx1Z2lucy4g ICovCiBleHRlcm4gY29uc3QgY2hhciAqR09NUF9PRkZMT0FEX2dldF9uYW1l ICh2b2lkKTsKIGV4dGVybiB1bnNpZ25lZCBpbnQgR09NUF9PRkZMT0FEX2dl dF9jYXBzICh2b2lkKTsKZGlmZiAtLWdpdCBhL2xpYmdvbXAvbGliZ29tcC5o IGIvbGliZ29tcC9saWJnb21wLmgKaW5kZXggYzI0M2M0ZDZjZjQuLmJiYWI1 YjRiMGFmIDEwMDY0NAotLS0gYS9saWJnb21wL2xpYmdvbXAuaAorKysgYi9s aWJnb21wL2xpYmdvbXAuaApAQCAtMTAxNCw2ICsxMDE0LDExIEBAIGV4dGVy biBpbnQgZ29tcF9wYXVzZV9ob3N0ICh2b2lkKTsKIGV4dGVybiB2b2lkIGdv bXBfaW5pdF90YXJnZXRzX29uY2UgKHZvaWQpOwogZXh0ZXJuIGludCBnb21w X2dldF9udW1fZGV2aWNlcyAodm9pZCk7CiBleHRlcm4gYm9vbCBnb21wX3Rh cmdldF90YXNrX2ZuICh2b2lkICopOworZXh0ZXJuIHZvaWQgZ29tcF90YXJn ZXRfcmV2ICh1aW50NjRfdCwgdWludDY0X3QsIHVpbnQ2NF90LCB1aW50NjRf dCwgdWludDY0X3QsCisJCQkgICAgIGludCwKKwkJCSAgICAgdm9pZCAoKikg KHZvaWQgKiwgY29uc3Qgdm9pZCAqLCBzaXplX3QsIHZvaWQgKiksCisJCQkg ICAgIHZvaWQgKCopICh2b2lkICosIGNvbnN0IHZvaWQgKiwgc2l6ZV90LCB2 b2lkICopLAorCQkJICAgICB2b2lkICopOwogCiAvKiBTcGxheSB0cmVlIGRl ZmluaXRpb25zLiAgKi8KIHR5cGVkZWYgc3RydWN0IHNwbGF5X3RyZWVfbm9k ZV9zICpzcGxheV90cmVlX25vZGU7CmRpZmYgLS1naXQgYS9saWJnb21wL2xp YmdvbXAubWFwIGIvbGliZ29tcC9saWJnb21wLm1hcAppbmRleCA0NmQ1ZjEw ZjNlMS4uMTJmNzZmN2U0OGYgMTAwNjQ0Ci0tLSBhL2xpYmdvbXAvbGliZ29t cC5tYXAKKysrIGIvbGliZ29tcC9saWJnb21wLm1hcApAQCAtNjIyLDMgKzYy Miw4IEBAIEdPTVBfUExVR0lOXzEuMyB7CiAJR09NUF9QTFVHSU5fZ29hY2Nf cHJvZmlsaW5nX2Rpc3BhdGNoOwogCUdPTVBfUExVR0lOX2dvYWNjX3RocmVh ZDsKIH0gR09NUF9QTFVHSU5fMS4yOworCitHT01QX1BMVUdJTl8xLjQgewor ICBnbG9iYWw6CisJR09NUF9QTFVHSU5fdGFyZ2V0X3JldjsKK30gR09NUF9Q TFVHSU5fMS4zOwpkaWZmIC0tZ2l0IGEvbGliZ29tcC9wbHVnaW4vY3VkYS1s aWIuZGVmIGIvbGliZ29tcC9wbHVnaW4vY3VkYS1saWIuZGVmCmluZGV4IGNk OTFiMzliMWQyLi42MTM1OWM3ZTc0ZSAxMDA2NDQKLS0tIGEvbGliZ29tcC9w bHVnaW4vY3VkYS1saWIuZGVmCisrKyBiL2xpYmdvbXAvcGx1Z2luL2N1ZGEt bGliLmRlZgpAQCAtMjksNiArMjksNyBAQCBDVURBX09ORV9DQUxMX01BWUJF X05VTEwgKGN1TGlua0NyZWF0ZV92MikKIENVREFfT05FX0NBTEwgKGN1TGlu a0Rlc3Ryb3kpCiBDVURBX09ORV9DQUxMIChjdU1lbUFsbG9jKQogQ1VEQV9P TkVfQ0FMTCAoY3VNZW1BbGxvY0hvc3QpCitDVURBX09ORV9DQUxMIChjdU1l bUFsbG9jTWFuYWdlZCkKIENVREFfT05FX0NBTEwgKGN1TWVtY3B5KQogQ1VE QV9PTkVfQ0FMTCAoY3VNZW1jcHlEdG9EQXN5bmMpCiBDVURBX09ORV9DQUxM IChjdU1lbWNweUR0b0gpCmRpZmYgLS1naXQgYS9saWJnb21wL3BsdWdpbi9w bHVnaW4tbnZwdHguYyBiL2xpYmdvbXAvcGx1Z2luL3BsdWdpbi1udnB0eC5j CmluZGV4IGJjNjNlMjc0Y2RmLi43YWI5NDIxYjA2MCAxMDA2NDQKLS0tIGEv bGliZ29tcC9wbHVnaW4vcGx1Z2luLW52cHR4LmMKKysrIGIvbGliZ29tcC9w bHVnaW4vcGx1Z2luLW52cHR4LmMKQEAgLTU0LDYgKzU0LDggQEAKICNpbmNs dWRlIDxhc3NlcnQuaD4KICNpbmNsdWRlIDxlcnJuby5oPgogCisjZGVmaW5l IEdPTVBfUkVWX09GRkxPQURfVkFSIF9fZ29tcF9yZXZfb2ZmbG9hZF92YXIK KwogLyogQW4gYXJiaXRyYXJ5IGZpeGVkIGxpbWl0ICgxMjhNQikgZm9yIHRo ZSBzaXplIG9mIHRoZSBPcGVuTVAgc29mdCBzdGFja3MKICAgIGJsb2NrIHRv IGNhY2hlIGJldHdlZW4ga2VybmVsIGludm9jYXRpb25zLiAgRm9yIHNvZnQt c3RhY2tzIGJsb2NrcyBiaWdnZXIKICAgIHRoYW4gdGhpcywgd2Ugd2lsbCBm cmVlIHRoZSBibG9jayBiZWZvcmUgYXR0ZW1wdGluZyBhbm90aGVyIEdQVSBt ZW1vcnkKQEAgLTI3NCw2ICsyNzYsMTcgQEAgc3RydWN0IHRhcmdfZm5fZGVz Y3JpcHRvcgogICBpbnQgbWF4X3RocmVhZHNfcGVyX2Jsb2NrOwogfTsKIAor LyogUmV2ZXJzZSBvZmZsb2FkLiBNdXN0IG1hdGNoIHZlcnNpb24gdXNlZCBp biBjb25maWcvbnZwdHgvdGFyZ2V0LmMuICovCitzdHJ1Y3QgcmV2X29mZmxv YWQgeworICB1aW50NjRfdCBmbjsKKyAgdWludDY0X3QgbWFwbnVtOworICB1 aW50NjRfdCBhZGRyczsKKyAgdWludDY0X3Qgc2l6ZXM7CisgIHVpbnQ2NF90 IGtpbmRzOworICBpbnQzMl90IGRldl9udW07CisgIHVpbnQzMl90IGxvY2s7 Cit9OworCiAvKiBBIGxvYWRlZCBQVFggaW1hZ2UuICAqLwogc3RydWN0IHB0 eF9pbWFnZV9kYXRhCiB7CkBAIC0zMDIsNiArMzE1LDcgQEAgc3RydWN0IHB0 eF9kZXZpY2UKICAgYm9vbCBtYXA7CiAgIGJvb2wgY29uY3VyOwogICBib29s IG1rZXJuOworICBib29sIGNvbmN1cnJfbWFuYWdlZF9hY2Nlc3M7CiAgIGlu dCBtb2RlOwogICBpbnQgY2xvY2tfa2h6OwogICBpbnQgbnVtX3NtczsKQEAg LTMyOSw2ICszNDMsOSBAQCBzdHJ1Y3QgcHR4X2RldmljZQogICAgICAgcHRo cmVhZF9tdXRleF90IGxvY2s7CiAgICAgfSBvbXBfc3RhY2tzOwogCisgIHN0 cnVjdCByZXZfb2ZmbG9hZCAqcmV2X2RhdGE7CisgIENVZGV2aWNlcHRyIHJl dl9kYXRhX2RldjsKKwogICBzdHJ1Y3QgcHR4X2RldmljZSAqbmV4dDsKIH07 CiAKQEAgLTQyMyw3ICs0NDAsNyBAQCBudnB0eF9vcGVuX2RldmljZSAoaW50 IG4pCiAgIHN0cnVjdCBwdHhfZGV2aWNlICpwdHhfZGV2OwogICBDVWRldmlj ZSBkZXYsIGN0eF9kZXY7CiAgIENVcmVzdWx0IHI7Ci0gIGludCBhc3luY19l bmdpbmVzLCBwaTsKKyAgaW50IHBpOwogCiAgIENVREFfQ0FMTF9FUkVUIChO VUxMLCBjdURldmljZUdldCwgJmRldiwgbik7CiAKQEAgLTUxOSwxMSArNTM2 LDE3IEBAIG52cHR4X29wZW5fZGV2aWNlIChpbnQgbikKIAkJICBDVV9ERVZJ Q0VfQVRUUklCVVRFX01BWF9USFJFQURTX1BFUl9NVUxUSVBST0NFU1NPUiwg ZGV2KTsKICAgcHR4X2Rldi0+bWF4X3RocmVhZHNfcGVyX211bHRpcHJvY2Vz c29yID0gcGk7CiAKKyNpZiAwCisgIGludCBhc3luY19lbmdpbmVzOwogICBy ID0gQ1VEQV9DQUxMX05PQ0hFQ0sgKGN1RGV2aWNlR2V0QXR0cmlidXRlLCAm YXN5bmNfZW5naW5lcywKIAkJCSBDVV9ERVZJQ0VfQVRUUklCVVRFX0FTWU5D X0VOR0lORV9DT1VOVCwgZGV2KTsKICAgaWYgKHIgIT0gQ1VEQV9TVUNDRVNT KQogICAgIGFzeW5jX2VuZ2luZXMgPSAxOworI2VuZGlmCiAKKyAgciA9IENV REFfQ0FMTF9OT0NIRUNLIChjdURldmljZUdldEF0dHJpYnV0ZSwgJnBpLAor CQkJIENVX0RFVklDRV9BVFRSSUJVVEVfQ09OQ1VSUkVOVF9NQU5BR0VEX0FD Q0VTUywgZGV2KTsKKyAgcHR4X2Rldi0+Y29uY3Vycl9tYW5hZ2VkX2FjY2Vz cyA9IHIgPT0gQ1VEQV9TVUNDRVNTID8gcGkgOiBmYWxzZTsKICAgZm9yIChp bnQgaSA9IDA7IGkgIT0gR09NUF9ESU1fTUFYOyBpKyspCiAgICAgcHR4X2Rl di0+ZGVmYXVsdF9kaW1zW2ldID0gMDsKIApAQCAtMTMxMyw2ICsxMzM2LDM4 IEBAIEdPTVBfT0ZGTE9BRF9sb2FkX2ltYWdlIChpbnQgb3JkLCB1bnNpZ25l ZCB2ZXJzaW9uLCBjb25zdCB2b2lkICp0YXJnZXRfZGF0YSwKICAgdGFyZ19m bnMgPSBHT01QX1BMVUdJTl9tYWxsb2MgKHNpemVvZiAoc3RydWN0IHRhcmdf Zm5fZGVzY3JpcHRvcikKIAkJCQkgKiBmbl9lbnRyaWVzKTsKIAorICBpZiAo cmV2X2ZuX3RhYmxlICYmIGRldi0+cmV2X2RhdGEgPT0gTlVMTCkKKyAgICB7 CisgICAgICBDVWRldmljZXB0ciBkcCA9IDA7CisgICAgICBpZiAoZGV2LT5j b25jdXJyX21hbmFnZWRfYWNjZXNzICYmIENVREFfQ0FMTF9FWElTVFMgKGN1 TWVtQWxsb2NNYW5hZ2VkKSkKKwl7CisJICBDVURBX0NBTExfQVNTRVJUIChj dU1lbUFsbG9jTWFuYWdlZCwgKHZvaWQgKikgJmRldi0+cmV2X2RhdGEsCisJ CQkgICAgc2l6ZW9mICgqZGV2LT5yZXZfZGF0YSksIENVX01FTV9BVFRBQ0hf R0xPQkFMKTsKKwkgIGRwID0gKENVZGV2aWNlcHRyKSBkZXYtPnJldl9kYXRh OworCX0KKyAgICAgIGVsc2UKKwl7CisJICBDVURBX0NBTExfQVNTRVJUIChj dU1lbUFsbG9jSG9zdCwgKHZvaWQgKiopICZkZXYtPnJldl9kYXRhLAorCQkJ ICAgIHNpemVvZiAoKmRldi0+cmV2X2RhdGEpKTsKKwkgIG1lbXNldCAoZGV2 LT5yZXZfZGF0YSwgJ1wwJywgc2l6ZW9mICgqZGV2LT5yZXZfZGF0YSkpOwor CSAgQ1VEQV9DQUxMX0FTU0VSVCAoY3VNZW1BbGxvYywgJmRldi0+cmV2X2Rh dGFfZGV2LAorCQkJICAgIHNpemVvZiAoKmRldi0+cmV2X2RhdGEpKTsKKwkg IGRwID0gZGV2LT5yZXZfZGF0YV9kZXY7CisJfQorICAgICAgQ1VkZXZpY2Vw dHIgZGV2aWNlX3Jldl9vZmZsb2FkX3ZhcjsKKyAgICAgIHNpemVfdCBkZXZp Y2VfcmV2X29mZmxvYWRfc2l6ZTsKKyAgICAgIENVcmVzdWx0IHIgPSBDVURB X0NBTExfTk9DSEVDSyAoY3VNb2R1bGVHZXRHbG9iYWwsCisJCQkJICAgICAg JmRldmljZV9yZXZfb2ZmbG9hZF92YXIsCisJCQkJICAgICAgJmRldmljZV9y ZXZfb2ZmbG9hZF9zaXplLCBtb2R1bGUsCisJCQkJICAgICAgWFNUUklORyAo R09NUF9SRVZfT0ZGTE9BRF9WQVIpKTsKKyAgICAgIGlmIChyICE9IENVREFf U1VDQ0VTUykKKwlHT01QX1BMVUdJTl9mYXRhbCAoImN1TW9kdWxlR2V0R2xv YmFsIGVycm9yOiAlcyIsIGN1ZGFfZXJyb3IgKHIpKTsKKyAgICAgIHIgPSBD VURBX0NBTExfTk9DSEVDSyAoY3VNZW1jcHlIdG9ELCBkZXZpY2VfcmV2X29m ZmxvYWRfdmFyLCAmZHAsCisJCQkgICAgIHNpemVvZiAoZHApKTsKKyAgICAg IGlmIChyICE9IENVREFfU1VDQ0VTUykKKwlHT01QX1BMVUdJTl9mYXRhbCAo ImN1TWVtY3B5SHRvRCBlcnJvcjogJXMiLCBjdWRhX2Vycm9yIChyKSk7Cisg ICAgfQorCiAgICp0YXJnZXRfdGFibGUgPSB0YXJnX3RibDsKIAogICBuZXdf aW1hZ2UgPSBHT01QX1BMVUdJTl9tYWxsb2MgKHNpemVvZiAoc3RydWN0IHB0 eF9pbWFnZV9kYXRhKSk7CkBAIC0xMzczLDYgKzE0MjgsMjIgQEAgR09NUF9P RkZMT0FEX2xvYWRfaW1hZ2UgKGludCBvcmQsIHVuc2lnbmVkIHZlcnNpb24s IGNvbnN0IHZvaWQgKnRhcmdldF9kYXRhLAogICAgIHRhcmdfdGJsLT5zdGFy dCA9IHRhcmdfdGJsLT5lbmQgPSAwOwogICB0YXJnX3RibCsrOwogCisgIGlm IChyZXZfZm5fdGFibGUpCisgICAgeworICAgICAgQ1VkZXZpY2VwdHIgdmFy OworICAgICAgc2l6ZV90IGJ5dGVzOworICAgICAgciA9IENVREFfQ0FMTF9O T0NIRUNLIChjdU1vZHVsZUdldEdsb2JhbCwgJnZhciwgJmJ5dGVzLCBtb2R1 bGUsCisJCQkgICAgICIkb2ZmbG9hZF9mdW5jX3RhYmxlIik7CisgICAgICBp ZiAociAhPSBDVURBX1NVQ0NFU1MpCisJR09NUF9QTFVHSU5fZmF0YWwgKCJj dU1vZHVsZUdldEdsb2JhbCBlcnJvcjogJXMiLCBjdWRhX2Vycm9yIChyKSk7 CisgICAgICBhc3NlcnQgKGJ5dGVzID09IHNpemVvZiAodWludDY0X3QpICog Zm5fZW50cmllcyk7CisgICAgICAqcmV2X2ZuX3RhYmxlID0gR09NUF9QTFVH SU5fbWFsbG9jIChzaXplb2YgKHVpbnQ2NF90KSAqIGZuX2VudHJpZXMpOwor ICAgICAgciA9IENVREFfQ0FMTF9OT0NIRUNLIChjdU1lbWNweUR0b0gsICpy ZXZfZm5fdGFibGUsIHZhciwgYnl0ZXMpOworICAgICAgaWYgKHIgIT0gQ1VE QV9TVUNDRVNTKQorCUdPTVBfUExVR0lOX2ZhdGFsICgiY3VNZW1jcHlEdG9I IGVycm9yOiAlcyIsIGN1ZGFfZXJyb3IgKHIpKTsKKyAgICB9CisKKwogICBu dnB0eF9zZXRfY2xvY2t0aWNrIChtb2R1bGUsIGRldik7CiAKICAgcmV0dXJu IGZuX2VudHJpZXMgKyB2YXJfZW50cmllcyArIG90aGVyX2VudHJpZXM7CkBA IC0xOTgyLDYgKzIwNTMsMjMgQEAgbnZwdHhfc3RhY2tzX2FjcXVpcmUgKHN0 cnVjdCBwdHhfZGV2aWNlICpwdHhfZGV2LCBzaXplX3Qgc2l6ZSwgaW50IG51 bSkKICAgcmV0dXJuICh2b2lkICopIHB0eF9kZXYtPm9tcF9zdGFja3MucHRy OwogfQogCisKK3ZvaWQKK3Jldl9vZmZfZGV2X3RvX2hvc3RfY3B5ICh2b2lk ICpkZXN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBzaXplLAorCQkJIENV c3RyZWFtIHN0cmVhbSkKK3sKKyAgQ1VEQV9DQUxMX0FTU0VSVCAoY3VNZW1j cHlEdG9IQXN5bmMsIGRlc3QsIChDVWRldmljZXB0cikgc3JjLCBzaXplLCBz dHJlYW0pOworICBDVURBX0NBTExfQVNTRVJUIChjdVN0cmVhbVN5bmNocm9u aXplLCBzdHJlYW0pOworfQorCit2b2lkCityZXZfb2ZmX2hvc3RfdG9fZGV2 X2NweSAodm9pZCAqZGVzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3Qgc2l6 ZSwKKwkJCSBDVXN0cmVhbSBzdHJlYW0pCit7CisgIENVREFfQ0FMTF9BU1NF UlQgKGN1TWVtY3B5SHRvREFzeW5jLCAoQ1VkZXZpY2VwdHIpIGRlc3QsIHNy Yywgc2l6ZSwgc3RyZWFtKTsKKyAgQ1VEQV9DQUxMX0FTU0VSVCAoY3VTdHJl YW1TeW5jaHJvbml6ZSwgc3RyZWFtKTsKK30KKwogdm9pZAogR09NUF9PRkZM T0FEX3J1biAoaW50IG9yZCwgdm9pZCAqdGd0X2ZuLCB2b2lkICp0Z3RfdmFy cywgdm9pZCAqKmFyZ3MpCiB7CkBAIC0yMDE2LDYgKzIxMDQsMTAgQEAgR09N UF9PRkZMT0FEX3J1biAoaW50IG9yZCwgdm9pZCAqdGd0X2ZuLCB2b2lkICp0 Z3RfdmFycywgdm9pZCAqKmFyZ3MpCiAgIG52cHR4X2FkanVzdF9sYXVuY2hf Ym91bmRzICh0Z3RfZm4sIHB0eF9kZXYsICZ0ZWFtcywgJnRocmVhZHMpOwog CiAgIHNpemVfdCBzdGFja19zaXplID0gbnZwdHhfc3RhY2tzX3NpemUgKCk7 CisgIGJvb2wgcmV2ZXJzZV9vZmYgPSBwdHhfZGV2LT5yZXZfZGF0YSAhPSBO VUxMOworICBib29sIGhhc191c20gPSAocHR4X2Rldi0+Y29uY3Vycl9tYW5h Z2VkX2FjY2VzcworCQkgICYmIENVREFfQ0FMTF9FWElTVFMgKGN1TWVtQWxs b2NNYW5hZ2VkKSk7CisgIENVc3RyZWFtIGNvcHlfc3RyZWFtID0gTlVMTDsK IAogICBwdGhyZWFkX211dGV4X2xvY2sgKCZwdHhfZGV2LT5vbXBfc3RhY2tz LmxvY2spOwogICB2b2lkICpzdGFja3MgPSBudnB0eF9zdGFja3NfYWNxdWly ZSAocHR4X2Rldiwgc3RhY2tfc2l6ZSwgdGVhbXMgKiB0aHJlYWRzKTsKQEAg LTIwMjksMTIgKzIxMjEsNjIgQEAgR09NUF9PRkZMT0FEX3J1biAoaW50IG9y ZCwgdm9pZCAqdGd0X2ZuLCB2b2lkICp0Z3RfdmFycywgdm9pZCAqKmFyZ3Mp CiAgIEdPTVBfUExVR0lOX2RlYnVnICgwLCAiICAlczoga2VybmVsICVzOiBs YXVuY2giCiAJCSAgICAgIiBbKHRlYW1zOiAldSksIDEsIDFdIFsobGFuZXM6 IDMyKSwgKHRocmVhZHM6ICV1KSwgMV1cbiIsCiAJCSAgICAgX19GVU5DVElP Tl9fLCBmbl9uYW1lLCB0ZWFtcywgdGhyZWFkcyk7CisgIGlmIChyZXZlcnNl X29mZikKKyAgICBDVURBX0NBTExfQVNTRVJUIChjdVN0cmVhbUNyZWF0ZSwg JmNvcHlfc3RyZWFtLCBDVV9TVFJFQU1fTk9OX0JMT0NLSU5HKTsKICAgciA9 IENVREFfQ0FMTF9OT0NIRUNLIChjdUxhdW5jaEtlcm5lbCwgZnVuY3Rpb24s IHRlYW1zLCAxLCAxLAogCQkJIDMyLCB0aHJlYWRzLCAxLCAwLCBOVUxMLCBO VUxMLCBjb25maWcpOwogICBpZiAociAhPSBDVURBX1NVQ0NFU1MpCiAgICAg R09NUF9QTFVHSU5fZmF0YWwgKCJjdUxhdW5jaEtlcm5lbCBlcnJvcjogJXMi LCBjdWRhX2Vycm9yIChyKSk7Ci0KLSAgciA9IENVREFfQ0FMTF9OT0NIRUNL IChjdUN0eFN5bmNocm9uaXplLCApOworICBpZiAocmV2ZXJzZV9vZmYpCisg ICAgd2hpbGUgKHRydWUpCisgICAgICB7CisJciA9IENVREFfQ0FMTF9OT0NI RUNLIChjdVN0cmVhbVF1ZXJ5LCBOVUxMKTsKKwlpZiAociA9PSBDVURBX1NV Q0NFU1MpCisJICBicmVhazsKKwlpZiAociA9PSBDVURBX0VSUk9SX0xBVU5D SF9GQUlMRUQpCisJICBHT01QX1BMVUdJTl9mYXRhbCAoImN1U3RyZWFtUXVl cnkgZXJyb3I6ICVzICVzXG4iLCBjdWRhX2Vycm9yIChyKSwKKwkJCSAgICAg bWF5YmVfYWJvcnRfbXNnKTsKKwllbHNlIGlmIChyICE9IENVREFfRVJST1Jf Tk9UX1JFQURZKQorCSAgR09NUF9QTFVHSU5fZmF0YWwgKCJjdVN0cmVhbVF1 ZXJ5IGVycm9yOiAlcyIsIGN1ZGFfZXJyb3IgKHIpKTsKKwlpZiAoIWhhc191 c20pCisJICB7CisJICAgIENVREFfQ0FMTF9BU1NFUlQgKGN1TWVtY3B5RHRv SEFzeW5jLCBwdHhfZGV2LT5yZXZfZGF0YSwKKwkJCSAgICAgIHB0eF9kZXYt PnJldl9kYXRhX2RldiwKKwkJCSAgICAgIHNpemVvZiAoKnB0eF9kZXYtPnJl dl9kYXRhKSwgY29weV9zdHJlYW0pOworCSAgICBDVURBX0NBTExfQVNTRVJU IChjdVN0cmVhbVN5bmNocm9uaXplLCBjb3B5X3N0cmVhbSk7CisJICB9CisJ aWYgKHB0eF9kZXYtPnJldl9kYXRhLT5mbiAhPSAwKQorCSAgeworCSAgICBz dHJ1Y3QgcmV2X29mZmxvYWQgKnJldl9kYXRhID0gcHR4X2Rldi0+cmV2X2Rh dGE7CisJICAgIHVpbnQ2NF90IGZuX3B0ciA9IHJldl9kYXRhLT5mbjsKKwkg ICAgdWludDY0X3QgbWFwbnVtID0gcmV2X2RhdGEtPm1hcG51bTsKKwkgICAg dWludDY0X3QgYWRkcl9wdHIgPSByZXZfZGF0YS0+YWRkcnM7CisJICAgIHVp bnQ2NF90IHNpemVzX3B0ciA9IHJldl9kYXRhLT5zaXplczsKKwkgICAgdWlu dDY0X3Qga2luZHNfcHRyID0gcmV2X2RhdGEtPmtpbmRzOworCSAgICBpbnQg ZGV2X251bSA9IChpbnQpIHJldl9kYXRhLT5kZXZfbnVtOworCSAgICBHT01Q X1BMVUdJTl90YXJnZXRfcmV2IChmbl9wdHIsIG1hcG51bSwgYWRkcl9wdHIs IHNpemVzX3B0ciwKKwkJCQkgICAga2luZHNfcHRyLCBkZXZfbnVtLCByZXZf b2ZmX2Rldl90b19ob3N0X2NweSwKKwkJCQkgICAgcmV2X29mZl9ob3N0X3Rv X2Rldl9jcHksIGNvcHlfc3RyZWFtKTsKKwkgICAgcmV2X2RhdGEtPmZuID0g MDsKKwkgICAgaWYgKCFoYXNfdXNtKQorCSAgICAgIHsKKwkJLyogZm4gaXMg dGhlIGZpcnN0IGVsZW1lbnQuICovCisJCXIgPSBDVURBX0NBTExfTk9DSEVD SyAoY3VNZW1jcHlIdG9EQXN5bmMsCisJCQkJICAgICAgIHB0eF9kZXYtPnJl dl9kYXRhX2RldiwKKwkJCQkgICAgICAgcHR4X2Rldi0+cmV2X2RhdGEsCisJ CQkJICAgICAgIHNpemVvZiAocHR4X2Rldi0+cmV2X2RhdGEtPmZuKSwKKwkJ CQkgICAgICAgY29weV9zdHJlYW0pOworCQlpZiAociAhPSBDVURBX1NVQ0NF U1MpCisJCSAgR09NUF9QTFVHSU5fZmF0YWwgKCJjdU1lbWNweUh0b0QgZXJy b3I6ICVzIiwgY3VkYV9lcnJvciAocikpOworCQlDVURBX0NBTExfQVNTRVJU IChjdVN0cmVhbVN5bmNocm9uaXplLCBjb3B5X3N0cmVhbSk7CisJICAgICAg fQorCSAgfQorCXVzbGVlcCAoMSk7CisgICAgICB9CisgIGVsc2UKKyAgICBy ID0gQ1VEQV9DQUxMX05PQ0hFQ0sgKGN1Q3R4U3luY2hyb25pemUsICk7Cisg IGlmIChyZXZlcnNlX29mZikKKyAgICBDVURBX0NBTExfQVNTRVJUIChjdVN0 cmVhbURlc3Ryb3ksIGNvcHlfc3RyZWFtKTsKICAgaWYgKHIgPT0gQ1VEQV9F UlJPUl9MQVVOQ0hfRkFJTEVEKQogICAgIEdPTVBfUExVR0lOX2ZhdGFsICgi Y3VDdHhTeW5jaHJvbml6ZSBlcnJvcjogJXMgJXNcbiIsIGN1ZGFfZXJyb3Ig KHIpLAogCQkgICAgICAgbWF5YmVfYWJvcnRfbXNnKTsKZGlmZiAtLWdpdCBh L2xpYmdvbXAvdGFyZ2V0LmMgYi9saWJnb21wL3RhcmdldC5jCmluZGV4IDEz NWRiMWQ4OGFiLi4wYzZmYWQ2OTBmMSAxMDA2NDQKLS0tIGEvbGliZ29tcC90 YXJnZXQuYworKysgYi9saWJnb21wL3RhcmdldC5jCkBAIC0yODU2LDYgKzI4 NTYsMjQgQEAgR09NUF90YXJnZXRfZXh0IChpbnQgZGV2aWNlLCB2b2lkICgq Zm4pICh2b2lkICopLCBzaXplX3QgbWFwbnVtLAogICAgIGh0YWJfZnJlZSAo cmVmY291bnRfc2V0KTsKIH0KIAorLyogSGFuZGxlIHJldmVyc2Ugb2ZmbG9h ZC4gVGhpcyBpcyBub3QgY2FsbGVkIGZvciB0aGUgaG9zdC4gKi8KKwordm9p ZAorZ29tcF90YXJnZXRfcmV2ICh1aW50NjRfdCBmbl9wdHIgX19hdHRyaWJ1 dGVfXyAoKHVudXNlZCkpLAorCQkgdWludDY0X3QgbWFwbnVtIF9fYXR0cmli dXRlX18gKCh1bnVzZWQpKSwKKwkJIHVpbnQ2NF90IGRldmFkZHJzX3B0ciBf X2F0dHJpYnV0ZV9fICgodW51c2VkKSksCisJCSB1aW50NjRfdCBzaXplc19w dHIgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAorCQkgdWludDY0X3Qga2lu ZHNfcHRyIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKKwkJIGludCBkZXZf bnVtIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKKwkJIHZvaWQgKCpkZXZf dG9faG9zdF9jcHkpICh2b2lkICosIGNvbnN0IHZvaWQgKiwgc2l6ZV90LAor CQkJCQkgIHZvaWQgKikgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAorCQkg dm9pZCAoKmhvc3RfdG9fZGV2X2NweSkgKHZvaWQgKiwgY29uc3Qgdm9pZCAq LCBzaXplX3QsCisJCQkJCSAgdm9pZCAqKSBfX2F0dHJpYnV0ZV9fICgodW51 c2VkKSksCisJCSB2b2lkICp0b2tlbiBfX2F0dHJpYnV0ZV9fICgodW51c2Vk KSkpCit7CisgIF9fYnVpbHRpbl91bnJlYWNoYWJsZSAoKTsKK30KKwogLyog SG9zdCBmYWxsYmFjayBmb3IgR09NUF90YXJnZXRfZGF0YXssX2V4dH0gcm91 dGluZXMuICAqLwogCiBzdGF0aWMgdm9pZAo= --------------KQw6xnbzVBDT0ypNmD0e5TD8--