From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 125804 invoked by alias); 25 Sep 2018 13:12:13 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Received: (qmail 125784 invoked by uid 89); 25 Sep 2018 13:12:12 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-24.9 required=5.0 tests=AWL,BAYES_00,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=claimed, initiated, **h, teams X-HELO: relay1.mentorg.com Received: from relay1.mentorg.com (HELO relay1.mentorg.com) (192.94.38.131) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Tue, 25 Sep 2018 13:12:07 +0000 Received: from svr-orw-mbx-02.mgc.mentorg.com ([147.34.90.202]) by relay1.mentorg.com with esmtps (TLSv1.2:ECDHE-RSA-AES256-SHA384:256) id 1g4n8H-0004Nj-2e from ChungLin_Tang@mentor.com ; Tue, 25 Sep 2018 06:12:05 -0700 Received: from [0.0.0.0] (147.34.91.1) by svr-orw-mbx-02.mgc.mentorg.com (147.34.90.202) with Microsoft SMTP Server (TLS) id 15.0.1320.4; Tue, 25 Sep 2018 06:12:01 -0700 Reply-To: From: Chung-Lin Tang Subject: [PATCH 6/6, OpenACC, libgomp] Async re-work, nvptx changes To: , Tom de Vries Message-ID: <9523b49a-0454-e0a9-826d-5eeec2a8c973@mentor.com> Date: Tue, 25 Sep 2018 13:13:00 -0000 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:52.0) Gecko/20100101 Thunderbird/52.9.1 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------03A2365BE34B62732FCAE587" X-SW-Source: 2018-09/txt/msg01431.txt.bz2 --------------03A2365BE34B62732FCAE587 Content-Type: text/plain; charset="utf-8"; format=flowed Content-Transfer-Encoding: 7bit Content-length: 3304 Hi Tom, this patch removes large portions of plugin/plugin-nvptx.c, since a lot of it is now in oacc-async.c now. The new code is essentially a NVPTX/CUDA-specific implementation of the new-style goacc_asyncqueues. Also, some needed functions in cuda-lib.def are added. The cuda.h function has also been updated to build independently without a CUDA installation. Thanks, Chung-Lin * plugin/plugin-nvptx.c (struct cuda_map): Remove. (struct ptx_stream): Remove. (struct nvptx_thread): Remove current_stream field. (cuda_map_create): Remove. (cuda_map_destroy): Remove. (map_init): Remove. (map_fini): Remove. (map_pop): Remove. (map_push): Remove. (struct goacc_asyncqueue): Define. (struct nvptx_callback): Define. (struct ptx_free_block): Define. (struct ptx_device): Remove null_stream, active_streams, async_streams, stream_lock, and next fields. (enum ptx_event_type): Remove. (struct ptx_event): Remove. (ptx_event_lock): Remove. (ptx_events): Remove. (init_streams_for_device): Remove. (fini_streams_for_device): Remove. (select_stream_for_async): Remove. (nvptx_init): Remove ptx_events and ptx_event_lock references. (nvptx_attach_host_thread_to_device): Remove CUDA_ERROR_NOT_PERMITTED case. (nvptx_open_device): Add free_blocks initialization, remove init_streams_for_device call. (nvptx_close_device): Remove fini_streams_for_device call, add free_blocks destruct code. (event_gc): Remove. (event_add): Remove. (nvptx_exec): Adjust parameters and code. (nvptx_free): Likewise. (nvptx_host2dev): Remove. (nvptx_dev2host): Remove. (nvptx_set_async): Remove. (nvptx_async_test): Remove. (nvptx_async_test_all): Remove. (nvptx_wait): Remove. (nvptx_wait_async): Remove. (nvptx_wait_all): Remove. (nvptx_wait_all_async): Remove. (nvptx_get_cuda_stream): Remove. (nvptx_set_cuda_stream): Remove. (GOMP_OFFLOAD_alloc): Adjust code. (GOMP_OFFLOAD_free): Likewise. (GOMP_OFFLOAD_openacc_register_async_cleanup): Remove. (GOMP_OFFLOAD_openacc_exec): Adjust parameters and code. (GOMP_OFFLOAD_openacc_async_test_all): Remove. (GOMP_OFFLOAD_openacc_async_wait): Remove. (GOMP_OFFLOAD_openacc_async_wait_async): Remove. (GOMP_OFFLOAD_openacc_async_wait_all): Remove. (GOMP_OFFLOAD_openacc_async_wait_all_async): Remove. (GOMP_OFFLOAD_openacc_async_set_async): Remove. (cuda_free_argmem): New function. (GOMP_OFFLOAD_openacc_async_exec): New plugin hook function. (GOMP_OFFLOAD_openacc_create_thread_data): Adjust code. (GOMP_OFFLOAD_openacc_cuda_get_stream): Adjust code. (GOMP_OFFLOAD_openacc_cuda_set_stream): Adjust code. (GOMP_OFFLOAD_openacc_async_construct): New plugin hook function. (GOMP_OFFLOAD_openacc_async_destruct): New plugin hook function. (GOMP_OFFLOAD_openacc_async_test): Remove and re-implement. (GOMP_OFFLOAD_openacc_async_synchronize): New plugin hook function. (GOMP_OFFLOAD_openacc_async_serialize): New plugin hook function. (GOMP_OFFLOAD_openacc_async_queue_callback): New plugin hook function. (cuda_callback_wrapper): New function. (cuda_memcpy_sanity_check): New function. (GOMP_OFFLOAD_host2dev): Remove and re-implement. (GOMP_OFFLOAD_dev2host): Remove and re-implement. (GOMP_OFFLOAD_openacc_async_host2dev): New plugin hook function. (GOMP_OFFLOAD_openacc_async_dev2host): New plugin hook function. --------------03A2365BE34B62732FCAE587 Content-Type: text/plain; charset="UTF-8"; x-mac-type=0; x-mac-creator=0; name="async-06.nvptx.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="async-06.nvptx.patch" Content-length: 57877 ZGlmZiAtLWdpdCBhL2xpYmdvbXAvcGx1Z2luL2N1ZGEtbGliLmRlZiBiL2xp YmdvbXAvcGx1Z2luL2N1ZGEtbGliLmRlZgppbmRleCBiMmE0YzIxLi5hMTZi YWRjIDEwMDY0NAotLS0gYS9saWJnb21wL3BsdWdpbi9jdWRhLWxpYi5kZWYK KysrIGIvbGliZ29tcC9wbHVnaW4vY3VkYS1saWIuZGVmCkBAIC00Miw2ICs0 Miw3IEBAIENVREFfT05FX0NBTEwgKGN1TW9kdWxlTG9hZCkKIENVREFfT05F X0NBTEwgKGN1TW9kdWxlTG9hZERhdGEpCiBDVURBX09ORV9DQUxMIChjdU1v ZHVsZVVubG9hZCkKIENVREFfT05FX0NBTExfTUFZQkVfTlVMTCAoY3VPY2N1 cGFuY3lNYXhQb3RlbnRpYWxCbG9ja1NpemUpCitDVURBX09ORV9DQUxMIChj dVN0cmVhbUFkZENhbGxiYWNrKQogQ1VEQV9PTkVfQ0FMTCAoY3VTdHJlYW1D cmVhdGUpCiBDVURBX09ORV9DQUxMIChjdVN0cmVhbURlc3Ryb3kpCiBDVURB X09ORV9DQUxMIChjdVN0cmVhbVF1ZXJ5KQpkaWZmIC0tZ2l0IGEvbGliZ29t cC9wbHVnaW4vY3VkYS9jdWRhLmggYi9saWJnb21wL3BsdWdpbi9jdWRhL2N1 ZGEuaAppbmRleCBiNGMxYjI5Li4zMjZkYjU0IDEwMDY0NAotLS0gYS9saWJn b21wL3BsdWdpbi9jdWRhL2N1ZGEuaAorKysgYi9saWJnb21wL3BsdWdpbi9j dWRhL2N1ZGEuaApAQCAtNTQsNyArNTQsMTEgQEAgdHlwZWRlZiBlbnVtIHsK ICAgQ1VEQV9FUlJPUl9JTlZBTElEX0NPTlRFWFQgPSAyMDEsCiAgIENVREFf RVJST1JfTk9UX0ZPVU5EID0gNTAwLAogICBDVURBX0VSUk9SX05PVF9SRUFE WSA9IDYwMCwKLSAgQ1VEQV9FUlJPUl9MQVVOQ0hfRkFJTEVEID0gNzE5Cisg IENVREFfRVJST1JfTEFVTkNIX0ZBSUxFRCA9IDcxOSwKKyAgQ1VEQV9FUlJP Ul9DT09QRVJBVElWRV9MQVVOQ0hfVE9PX0xBUkdFID0gNzIwLAorICBDVURB X0VSUk9SX05PVF9QRVJNSVRURUQgPSA4MDAsCisgIENVREFfRVJST1JfTk9U X1NVUFBPUlRFRCA9IDgwMSwKKyAgQ1VEQV9FUlJPUl9VTktOT1dOID0gOTk5 CiB9IENVcmVzdWx0OwogCiB0eXBlZGVmIGVudW0gewpAQCAtMTczLDYgKzE3 Nyw4IEBAIENVcmVzdWx0IGN1TW9kdWxlTG9hZERhdGEgKENVbW9kdWxlICos IGNvbnN0IHZvaWQgKik7CiBDVXJlc3VsdCBjdU1vZHVsZVVubG9hZCAoQ1Vt b2R1bGUpOwogQ1VyZXN1bHQgY3VPY2N1cGFuY3lNYXhQb3RlbnRpYWxCbG9j a1NpemUoaW50ICosIGludCAqLCBDVWZ1bmN0aW9uLAogCQkJCQkgIENVb2Nj dXBhbmN5QjJEU2l6ZSwgc2l6ZV90LCBpbnQpOwordHlwZWRlZiB2b2lkICgq Q1VzdHJlYW1DYWxsYmFjaykoQ1VzdHJlYW0sIENVcmVzdWx0LCB2b2lkICop OworQ1VyZXN1bHQgY3VTdHJlYW1BZGRDYWxsYmFjayhDVXN0cmVhbSwgQ1Vz dHJlYW1DYWxsYmFjaywgdm9pZCAqLCB1bnNpZ25lZCBpbnQpOwogQ1VyZXN1 bHQgY3VTdHJlYW1DcmVhdGUgKENVc3RyZWFtICosIHVuc2lnbmVkKTsKICNk ZWZpbmUgY3VTdHJlYW1EZXN0cm95IGN1U3RyZWFtRGVzdHJveV92MgogQ1Vy ZXN1bHQgY3VTdHJlYW1EZXN0cm95IChDVXN0cmVhbSk7CmRpZmYgLS1naXQg YS9saWJnb21wL3BsdWdpbi9wbHVnaW4tbnZwdHguYyBiL2xpYmdvbXAvcGx1 Z2luL3BsdWdpbi1udnB0eC5jCmluZGV4IGJhZTFiMDUuLjI5NTlkZjIgMTAw NjQ0Ci0tLSBhL2xpYmdvbXAvcGx1Z2luL3BsdWdpbi1udnB0eC5jCisrKyBi L2xpYmdvbXAvcGx1Z2luL3BsdWdpbi1udnB0eC5jCkBAIC0xOTIsMTI4ICsx OTIsMzAgQEAgY3VkYV9lcnJvciAoQ1VyZXN1bHQgcikKIHN0YXRpYyB1bnNp Z25lZCBpbnQgaW5zdGFudGlhdGVkX2RldmljZXMgPSAwOwogc3RhdGljIHB0 aHJlYWRfbXV0ZXhfdCBwdHhfZGV2X2xvY2sgPSBQVEhSRUFEX01VVEVYX0lO SVRJQUxJWkVSOwogCi1zdHJ1Y3QgcHR4X3N0cmVhbQorLyogTlZQVFgvQ1VE QSBzcGVjaWZpYyBkZWZpbml0aW9uIG9mIGFzeW5jaHJvbm91cyBxdWV1ZXMu ICAqLworc3RydWN0IGdvYWNjX2FzeW5jcXVldWUKIHsKLSAgQ1VzdHJlYW0g c3RyZWFtOwotICBwdGhyZWFkX3QgaG9zdF90aHJlYWQ7Ci0gIGJvb2wgbXVs dGl0aHJlYWRlZDsKKyAgQ1VzdHJlYW0gY3VkYV9zdHJlYW07Cit9OwogCi0g IENVZGV2aWNlcHRyIGQ7Ci0gIHZvaWQgKmg7Ci0gIHZvaWQgKmhfYmVnaW47 Ci0gIHZvaWQgKmhfZW5kOwotICB2b2lkICpoX25leHQ7Ci0gIHZvaWQgKmhf cHJldjsKLSAgdm9pZCAqaF90YWlsOwotCi0gIHN0cnVjdCBwdHhfc3RyZWFt ICpuZXh0Oworc3RydWN0IG52cHR4X2NhbGxiYWNrCit7CisgIHZvaWQgKCpm bikgKHZvaWQgKik7CisgIHZvaWQgKnB0cjsKKyAgc3RydWN0IGdvYWNjX2Fz eW5jcXVldWUgKmFxOworICBzdHJ1Y3QgbnZwdHhfY2FsbGJhY2sgKm5leHQ7 CiB9OwogCiAvKiBUaHJlYWQtc3BlY2lmaWMgZGF0YSBmb3IgUFRYLiAgKi8K IAogc3RydWN0IG52cHR4X3RocmVhZAogewotICBzdHJ1Y3QgcHR4X3N0cmVh bSAqY3VycmVudF9zdHJlYW07CisgIC8qIFdlIGN1cnJlbnRseSBoYXZlIHRo aXMgZW1iZWRkZWQgaW5zaWRlIHRoZSBwbHVnaW4gYmVjYXVzZSBsaWJnb21w IG1hbmFnZXMKKyAgICAgZGV2aWNlcyB0aHJvdWdoIGludGVnZXIgdGFyZ2V0 X2lkcy4gIFRoaXMgbWlnaHQgYmUgYmV0dGVyIGlmIHVzaW5nIGFuCisgICAg IG9wYXF1ZSB0YXJnZXQtc3BlY2lmaWMgcG9pbnRlciBkaXJlY3RseSBmcm9t IGdvbXBfZGV2aWNlX2Rlc2NyLiAgKi8KICAgc3RydWN0IHB0eF9kZXZpY2Ug KnB0eF9kZXY7CiB9OwogCi1zdGF0aWMgYm9vbAotbWFwX2luaXQgKHN0cnVj dCBwdHhfc3RyZWFtICpzKQotewotICBpbnQgc2l6ZSA9IGdldHBhZ2VzaXpl ICgpOwotCi0gIGFzc2VydCAocyk7Ci0gIGFzc2VydCAoIXMtPmQpOwotICBh c3NlcnQgKCFzLT5oKTsKLQotICBDVURBX0NBTEwgKGN1TWVtQWxsb2NIb3N0 LCAmcy0+aCwgc2l6ZSk7Ci0gIENVREFfQ0FMTCAoY3VNZW1Ib3N0R2V0RGV2 aWNlUG9pbnRlciwgJnMtPmQsIHMtPmgsIDApOwotCi0gIGFzc2VydCAocy0+ aCk7Ci0KLSAgcy0+aF9iZWdpbiA9IHMtPmg7Ci0gIHMtPmhfZW5kID0gcy0+ aF9iZWdpbiArIHNpemU7Ci0gIHMtPmhfbmV4dCA9IHMtPmhfcHJldiA9IHMt PmhfdGFpbCA9IHMtPmhfYmVnaW47Ci0KLSAgYXNzZXJ0IChzLT5oX25leHQp OwotICBhc3NlcnQgKHMtPmhfZW5kKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0K LXN0YXRpYyBib29sCi1tYXBfZmluaSAoc3RydWN0IHB0eF9zdHJlYW0gKnMp Ci17Ci0gIENVREFfQ0FMTCAoY3VNZW1GcmVlSG9zdCwgcy0+aCk7Ci0gIHJl dHVybiB0cnVlOwotfQotCi1zdGF0aWMgdm9pZAotbWFwX3BvcCAoc3RydWN0 IHB0eF9zdHJlYW0gKnMpCi17Ci0gIGFzc2VydCAocyAhPSBOVUxMKTsKLSAg YXNzZXJ0IChzLT5oX25leHQpOwotICBhc3NlcnQgKHMtPmhfcHJldik7Ci0g IGFzc2VydCAocy0+aF90YWlsKTsKLQotICBzLT5oX3RhaWwgPSBzLT5oX25l eHQ7Ci0KLSAgaWYgKHMtPmhfdGFpbCA+PSBzLT5oX2VuZCkKLSAgICBzLT5o X3RhaWwgPSBzLT5oX2JlZ2luICsgKGludCkgKHMtPmhfdGFpbCAtIHMtPmhf ZW5kKTsKLQotICBpZiAocy0+aF9uZXh0ID09IHMtPmhfdGFpbCkKLSAgICBz LT5oX3ByZXYgPSBzLT5oX25leHQ7Ci0KLSAgYXNzZXJ0IChzLT5oX25leHQg Pj0gcy0+aF9iZWdpbik7Ci0gIGFzc2VydCAocy0+aF90YWlsID49IHMtPmhf YmVnaW4pOwotICBhc3NlcnQgKHMtPmhfcHJldiA+PSBzLT5oX2JlZ2luKTsK LQotICBhc3NlcnQgKHMtPmhfbmV4dCA8PSBzLT5oX2VuZCk7Ci0gIGFzc2Vy dCAocy0+aF90YWlsIDw9IHMtPmhfZW5kKTsKLSAgYXNzZXJ0IChzLT5oX3By ZXYgPD0gcy0+aF9lbmQpOwotfQotCi1zdGF0aWMgdm9pZAotbWFwX3B1c2gg KHN0cnVjdCBwdHhfc3RyZWFtICpzLCBzaXplX3Qgc2l6ZSwgdm9pZCAqKmgs IHZvaWQgKipkKQotewotICBpbnQgbGVmdDsKLSAgaW50IG9mZnNldDsKLQot ICBhc3NlcnQgKHMgIT0gTlVMTCk7Ci0KLSAgbGVmdCA9IHMtPmhfZW5kIC0g cy0+aF9uZXh0OwotCi0gIGFzc2VydCAocy0+aF9wcmV2KTsKLSAgYXNzZXJ0 IChzLT5oX25leHQpOwotCi0gIGlmIChzaXplID49IGxlZnQpCi0gICAgewot ICAgICAgYXNzZXJ0IChzLT5oX25leHQgPT0gcy0+aF9wcmV2KTsKLSAgICAg IHMtPmhfbmV4dCA9IHMtPmhfcHJldiA9IHMtPmhfdGFpbCA9IHMtPmhfYmVn aW47Ci0gICAgfQotCi0gIGFzc2VydCAocy0+aF9uZXh0KTsKLQotICBvZmZz ZXQgPSBzLT5oX25leHQgLSBzLT5oOwotCi0gICpkID0gKHZvaWQgKikocy0+ ZCArIG9mZnNldCk7Ci0gICpoID0gKHZvaWQgKikocy0+aCArIG9mZnNldCk7 Ci0KLSAgcy0+aF9wcmV2ID0gcy0+aF9uZXh0OwotICBzLT5oX25leHQgKz0g c2l6ZTsKLQotICBhc3NlcnQgKHMtPmhfcHJldik7Ci0gIGFzc2VydCAocy0+ aF9uZXh0KTsKLQotICBhc3NlcnQgKHMtPmhfbmV4dCA+PSBzLT5oX2JlZ2lu KTsKLSAgYXNzZXJ0IChzLT5oX3RhaWwgPj0gcy0+aF9iZWdpbik7Ci0gIGFz c2VydCAocy0+aF9wcmV2ID49IHMtPmhfYmVnaW4pOwotICBhc3NlcnQgKHMt PmhfbmV4dCA8PSBzLT5oX2VuZCk7Ci0gIGFzc2VydCAocy0+aF90YWlsIDw9 IHMtPmhfZW5kKTsKLSAgYXNzZXJ0IChzLT5oX3ByZXYgPD0gcy0+aF9lbmQp OwotCi0gIHJldHVybjsKLX0KLQogLyogVGFyZ2V0IGRhdGEgZnVuY3Rpb24g bGF1bmNoIGluZm9ybWF0aW9uLiAgKi8KIAogc3RydWN0IHRhcmdfZm5fbGF1 bmNoCkBAIC0zNjUsMjIgKzI2NywxOCBAQCBzdHJ1Y3QgcHR4X2ltYWdlX2Rh dGEKICAgc3RydWN0IHB0eF9pbWFnZV9kYXRhICpuZXh0OwogfTsKIAorc3Ry dWN0IHB0eF9mcmVlX2Jsb2NrCit7CisgIHZvaWQgKnB0cjsKKyAgc3RydWN0 IHB0eF9mcmVlX2Jsb2NrICpuZXh0OworfTsKKwogc3RydWN0IHB0eF9kZXZp Y2UKIHsKICAgQ1Vjb250ZXh0IGN0eDsKICAgYm9vbCBjdHhfc2hhcmVkOwog ICBDVWRldmljZSBkZXY7Ci0gIHN0cnVjdCBwdHhfc3RyZWFtICpudWxsX3N0 cmVhbTsKLSAgLyogQWxsIG5vbi1udWxsIHN0cmVhbXMgYXNzb2NpYXRlZCB3 aXRoIHRoaXMgZGV2aWNlIChhY3R1YWxseSBjb250ZXh0KSwKLSAgICAgZWl0 aGVyIGNyZWF0ZWQgaW1wbGljaXRseSBvciBwYXNzZWQgaW4gZnJvbSB0aGUg dXNlciAodmlhCi0gICAgIGFjY19zZXRfY3VkYV9zdHJlYW0pLiAgKi8KLSAg c3RydWN0IHB0eF9zdHJlYW0gKmFjdGl2ZV9zdHJlYW1zOwotICBzdHJ1Y3Qg ewotICAgIHN0cnVjdCBwdHhfc3RyZWFtICoqYXJyOwotICAgIGludCBzaXpl OwotICB9IGFzeW5jX3N0cmVhbXM7Ci0gIC8qIEEgbG9jayBmb3IgdXNlIHdo ZW4gbWFuaXB1bGF0aW5nIHRoZSBhYm92ZSBzdHJlYW0gbGlzdCBhbmQgYXJy YXkuICAqLwotICBwdGhyZWFkX211dGV4X3Qgc3RyZWFtX2xvY2s7CisKICAg aW50IG9yZDsKICAgYm9vbCBvdmVybGFwOwogICBib29sIG1hcDsKQEAgLTM5 OCwzMiArMjk2LDEzIEBAIHN0cnVjdCBwdHhfZGV2aWNlCiAKICAgc3RydWN0 IHB0eF9pbWFnZV9kYXRhICppbWFnZXM7ICAvKiBJbWFnZXMgbG9hZGVkIG9u IGRldmljZS4gICovCiAgIHB0aHJlYWRfbXV0ZXhfdCBpbWFnZV9sb2NrOyAg ICAgLyogTG9jayBmb3IgYWJvdmUgbGlzdC4gICovCi0gIAotICBzdHJ1Y3Qg cHR4X2RldmljZSAqbmV4dDsKLX07Ci0KLWVudW0gcHR4X2V2ZW50X3R5cGUK LXsKLSAgUFRYX0VWVF9NRU0sCi0gIFBUWF9FVlRfS05MLAotICBQVFhfRVZU X1NZTkMsCi0gIFBUWF9FVlRfQVNZTkNfQ0xFQU5VUAotfTsKIAotc3RydWN0 IHB0eF9ldmVudAotewotICBDVWV2ZW50ICpldnQ7Ci0gIGludCB0eXBlOwot ICB2b2lkICphZGRyOwotICBpbnQgb3JkOwotICBpbnQgdmFsOworICBzdHJ1 Y3QgcHR4X2ZyZWVfYmxvY2sgKmZyZWVfYmxvY2tzOworICBwdGhyZWFkX211 dGV4X3QgZnJlZV9ibG9ja3NfbG9jazsKIAotICBzdHJ1Y3QgcHR4X2V2ZW50 ICpuZXh0OworICBzdHJ1Y3QgcHR4X2RldmljZSAqbmV4dDsKIH07CiAKLXN0 YXRpYyBwdGhyZWFkX211dGV4X3QgcHR4X2V2ZW50X2xvY2s7Ci1zdGF0aWMg c3RydWN0IHB0eF9ldmVudCAqcHR4X2V2ZW50czsKLQogc3RhdGljIHN0cnVj dCBwdHhfZGV2aWNlICoqcHR4X2RldmljZXM7CiAKIHN0YXRpYyBpbmxpbmUg c3RydWN0IG52cHR4X3RocmVhZCAqCkBAIC00MzIsMTk3ICszMTEsNiBAQCBu dnB0eF90aHJlYWQgKHZvaWQpCiAgIHJldHVybiAoc3RydWN0IG52cHR4X3Ro cmVhZCAqKSBHT01QX1BMVUdJTl9hY2NfdGhyZWFkICgpOwogfQogCi1zdGF0 aWMgYm9vbAotaW5pdF9zdHJlYW1zX2Zvcl9kZXZpY2UgKHN0cnVjdCBwdHhf ZGV2aWNlICpwdHhfZGV2LCBpbnQgY29uY3VycmVuY3kpCi17Ci0gIGludCBp OwotICBzdHJ1Y3QgcHR4X3N0cmVhbSAqbnVsbF9zdHJlYW0KLSAgICA9IEdP TVBfUExVR0lOX21hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgcHR4X3N0cmVhbSkp OwotCi0gIG51bGxfc3RyZWFtLT5zdHJlYW0gPSBOVUxMOwotICBudWxsX3N0 cmVhbS0+aG9zdF90aHJlYWQgPSBwdGhyZWFkX3NlbGYgKCk7Ci0gIG51bGxf c3RyZWFtLT5tdWx0aXRocmVhZGVkID0gdHJ1ZTsKLSAgbnVsbF9zdHJlYW0t PmQgPSAoQ1VkZXZpY2VwdHIpIE5VTEw7Ci0gIG51bGxfc3RyZWFtLT5oID0g TlVMTDsKLSAgaWYgKCFtYXBfaW5pdCAobnVsbF9zdHJlYW0pKQotICAgIHJl dHVybiBmYWxzZTsKLQotICBwdHhfZGV2LT5udWxsX3N0cmVhbSA9IG51bGxf c3RyZWFtOwotICBwdHhfZGV2LT5hY3RpdmVfc3RyZWFtcyA9IE5VTEw7Ci0g IHB0aHJlYWRfbXV0ZXhfaW5pdCAoJnB0eF9kZXYtPnN0cmVhbV9sb2NrLCBO VUxMKTsKLQotICBpZiAoY29uY3VycmVuY3kgPCAxKQotICAgIGNvbmN1cnJl bmN5ID0gMTsKLQotICAvKiBUaGlzIGlzIGp1c3QgYSBndWVzcyAtLSBtYWtl IHNwYWNlIGZvciBhcyBtYW55IGFzeW5jIHN0cmVhbXMgYXMgdGhlCi0gICAg IGN1cnJlbnQgZGV2aWNlIGlzIGNhcGFibGUgb2YgY29uY3VycmVudGx5IGV4 ZWN1dGluZy4gIFRoaXMgY2FuIGdyb3cKLSAgICAgbGF0ZXIgYXMgbmVjZXNz YXJ5LiAgTm8gc3RyZWFtcyBhcmUgY3JlYXRlZCB5ZXQuICAqLwotICBwdHhf ZGV2LT5hc3luY19zdHJlYW1zLmFycgotICAgID0gR09NUF9QTFVHSU5fbWFs bG9jIChjb25jdXJyZW5jeSAqIHNpemVvZiAoc3RydWN0IHB0eF9zdHJlYW0g KikpOwotICBwdHhfZGV2LT5hc3luY19zdHJlYW1zLnNpemUgPSBjb25jdXJy ZW5jeTsKLQotICBmb3IgKGkgPSAwOyBpIDwgY29uY3VycmVuY3k7IGkrKykK LSAgICBwdHhfZGV2LT5hc3luY19zdHJlYW1zLmFycltpXSA9IE5VTEw7Ci0K LSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sCi1maW5pX3N0cmVh bXNfZm9yX2RldmljZSAoc3RydWN0IHB0eF9kZXZpY2UgKnB0eF9kZXYpCi17 Ci0gIGZyZWUgKHB0eF9kZXYtPmFzeW5jX3N0cmVhbXMuYXJyKTsKLQotICBi b29sIHJldCA9IHRydWU7Ci0gIHdoaWxlIChwdHhfZGV2LT5hY3RpdmVfc3Ry ZWFtcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN0cnVjdCBwdHhfc3RyZWFt ICpzID0gcHR4X2Rldi0+YWN0aXZlX3N0cmVhbXM7Ci0gICAgICBwdHhfZGV2 LT5hY3RpdmVfc3RyZWFtcyA9IHB0eF9kZXYtPmFjdGl2ZV9zdHJlYW1zLT5u ZXh0OwotCi0gICAgICByZXQgJj0gbWFwX2ZpbmkgKHMpOwotCi0gICAgICBD VXJlc3VsdCByID0gQ1VEQV9DQUxMX05PQ0hFQ0sgKGN1U3RyZWFtRGVzdHJv eSwgcy0+c3RyZWFtKTsKLSAgICAgIGlmIChyICE9IENVREFfU1VDQ0VTUykK LQl7Ci0JICBHT01QX1BMVUdJTl9lcnJvciAoImN1U3RyZWFtRGVzdHJveSBl cnJvcjogJXMiLCBjdWRhX2Vycm9yIChyKSk7Ci0JICByZXQgPSBmYWxzZTsK LQl9Ci0gICAgICBmcmVlIChzKTsKLSAgICB9Ci0KLSAgcmV0ICY9IG1hcF9m aW5pIChwdHhfZGV2LT5udWxsX3N0cmVhbSk7Ci0gIGZyZWUgKHB0eF9kZXYt Pm51bGxfc3RyZWFtKTsKLSAgcmV0dXJuIHJldDsKLX0KLQotLyogU2VsZWN0 IGEgc3RyZWFtIGZvciAoT3BlbkFDQy1zZW1hbnRpY3MpIEFTWU5DIGFyZ3Vt ZW50IGZvciB0aGUgY3VycmVudAotICAgdGhyZWFkIFRIUkVBRCAoYW5kIGFs c28gY3VycmVudCBkZXZpY2UvY29udGV4dCkuICBJZiBDUkVBVEUgaXMgdHJ1 ZSwgY3JlYXRlCi0gICB0aGUgc3RyZWFtIGlmIGl0IGRvZXMgbm90IGV4aXN0 IChvciB1c2UgRVhJU1RJTkcgaWYgaXQgaXMgbm9uLU5VTEwpLCBhbmQKLSAg IGFzc29jaWF0ZSB0aGUgc3RyZWFtIHdpdGggdGhlIHNhbWUgdGhyZWFkIGFy Z3VtZW50LiAgUmV0dXJucyBzdHJlYW0gdG8gdXNlCi0gICBhcyByZXN1bHQu ICAqLwotCi1zdGF0aWMgc3RydWN0IHB0eF9zdHJlYW0gKgotc2VsZWN0X3N0 cmVhbV9mb3JfYXN5bmMgKGludCBhc3luYywgcHRocmVhZF90IHRocmVhZCwg Ym9vbCBjcmVhdGUsCi0JCQkgQ1VzdHJlYW0gZXhpc3RpbmcpCi17Ci0gIHN0 cnVjdCBudnB0eF90aHJlYWQgKm52dGhkID0gbnZwdHhfdGhyZWFkICgpOwot ICAvKiBMb2NhbCBjb3B5IG9mIFRMUyB2YXJpYWJsZS4gICovCi0gIHN0cnVj dCBwdHhfZGV2aWNlICpwdHhfZGV2ID0gbnZ0aGQtPnB0eF9kZXY7Ci0gIHN0 cnVjdCBwdHhfc3RyZWFtICpzdHJlYW0gPSBOVUxMOwotICBpbnQgb3JpZ19h c3luYyA9IGFzeW5jOwotCi0gIC8qIFRoZSBzcGVjaWFsIHZhbHVlIGFjY19h c3luY19ub3ZhbCAoLTEpIG1hcHMgKGZvciBub3cpIHRvIGFuCi0gICAgIGlt cGxpY2l0bHktY3JlYXRlZCBzdHJlYW0sIHdoaWNoIGlzIHRoZW4gaGFuZGxl ZCB0aGUgc2FtZSBhcyBhbnkgb3RoZXIKLSAgICAgbnVtYmVyZWQgYXN5bmMg c3RyZWFtLiAgT3RoZXIgb3B0aW9ucyBhcmUgYXZhaWxhYmxlLCBlLmcuIHVz aW5nIHRoZSBudWxsCi0gICAgIHN0cmVhbSBmb3IgYW5vbnltb3VzIGFzeW5j IG9wZXJhdGlvbnMsIG9yIGNob29zaW5nIGFuIGlkbGUgc3RyZWFtIGZyb20g YW4KLSAgICAgYWN0aXZlIHNldC4gIEJ1dCwgc3RpY2sgd2l0aCB0aGlzIGZv ciBub3cuICAqLwotICBpZiAoYXN5bmMgPiBhY2NfYXN5bmNfc3luYykKLSAg ICBhc3luYysrOwotCi0gIGlmIChjcmVhdGUpCi0gICAgcHRocmVhZF9tdXRl eF9sb2NrICgmcHR4X2Rldi0+c3RyZWFtX2xvY2spOwotCi0gIC8qIE5PVEU6 IEFGQUlDVCB0aGVyZSdzIG5vIHBhcnRpY3VsYXIgbmVlZCBmb3IgYWNjX2Fz eW5jX3N5bmMgdG8gbWFwIHRvIHRoZQotICAgICBudWxsIHN0cmVhbSwgYW5k IGluIGZhY3QgYmV0dGVyIHBlcmZvcm1hbmNlIG1heSBiZSBvYnRhaW5hYmxl IGlmIGl0IGRvZXNuJ3QKLSAgICAgKGJlY2F1c2UgdGhlIG51bGwgc3RyZWFt IGVuZm9yY2VzIG92ZXJseS1zdHJpY3Qgc3luY2hyb25pc2F0aW9uIHdpdGgK LSAgICAgcmVzcGVjdCB0byBvdGhlciBzdHJlYW1zIGZvciBsZWdhY3kgcmVh c29ucywgYW5kIHRoYXQncyBwcm9iYWJseSBub3QKLSAgICAgbmVlZGVkIHdp dGggT3BlbkFDQykuICBNYXliZSBpbnZlc3RpZ2F0ZSBsYXRlci4gICovCi0g IGlmIChhc3luYyA9PSBhY2NfYXN5bmNfc3luYykKLSAgICBzdHJlYW0gPSBw dHhfZGV2LT5udWxsX3N0cmVhbTsKLSAgZWxzZSBpZiAoYXN5bmMgPj0gMCAm JiBhc3luYyA8IHB0eF9kZXYtPmFzeW5jX3N0cmVhbXMuc2l6ZQotCSAgICYm IHB0eF9kZXYtPmFzeW5jX3N0cmVhbXMuYXJyW2FzeW5jXSAmJiAhKGNyZWF0 ZSAmJiBleGlzdGluZykpCi0gICAgc3RyZWFtID0gcHR4X2Rldi0+YXN5bmNf c3RyZWFtcy5hcnJbYXN5bmNdOwotICBlbHNlIGlmIChhc3luYyA+PSAwICYm IGNyZWF0ZSkKLSAgICB7Ci0gICAgICBpZiAoYXN5bmMgPj0gcHR4X2Rldi0+ YXN5bmNfc3RyZWFtcy5zaXplKQotCXsKLQkgIGludCBpLCBuZXdzaXplID0g cHR4X2Rldi0+YXN5bmNfc3RyZWFtcy5zaXplICogMjsKLQotCSAgaWYgKGFz eW5jID49IG5ld3NpemUpCi0JICAgIG5ld3NpemUgPSBhc3luYyArIDE7Ci0K LQkgIHB0eF9kZXYtPmFzeW5jX3N0cmVhbXMuYXJyCi0JICAgID0gR09NUF9Q TFVHSU5fcmVhbGxvYyAocHR4X2Rldi0+YXN5bmNfc3RyZWFtcy5hcnIsCi0J CQkJICAgbmV3c2l6ZSAqIHNpemVvZiAoc3RydWN0IHB0eF9zdHJlYW0gKikp OwotCi0JICBmb3IgKGkgPSBwdHhfZGV2LT5hc3luY19zdHJlYW1zLnNpemU7 IGkgPCBuZXdzaXplOyBpKyspCi0JICAgIHB0eF9kZXYtPmFzeW5jX3N0cmVh bXMuYXJyW2ldID0gTlVMTDsKLQotCSAgcHR4X2Rldi0+YXN5bmNfc3RyZWFt cy5zaXplID0gbmV3c2l6ZTsKLQl9Ci0KLSAgICAgIC8qIENyZWF0ZSBhIG5l dyBzdHJlYW0gb24tZGVtYW5kIGlmIHRoZXJlIGlzbid0IG9uZSBhbHJlYWR5 LCBvciBpZiB3ZSdyZQotCSBzZXR0aW5nIGEgcGFydGljdWxhciBhc3luYyB2 YWx1ZSB0byBhbiBleGlzdGluZyAoZXh0ZXJuYWxseS1wcm92aWRlZCkKLQkg c3RyZWFtLiAgKi8KLSAgICAgIGlmICghcHR4X2Rldi0+YXN5bmNfc3RyZWFt cy5hcnJbYXN5bmNdIHx8IGV4aXN0aW5nKQotICAgICAgICB7Ci0JICBDVXJl c3VsdCByOwotCSAgc3RydWN0IHB0eF9zdHJlYW0gKnMKLQkgICAgPSBHT01Q X1BMVUdJTl9tYWxsb2MgKHNpemVvZiAoc3RydWN0IHB0eF9zdHJlYW0pKTsK LQotCSAgaWYgKGV4aXN0aW5nKQotCSAgICBzLT5zdHJlYW0gPSBleGlzdGlu ZzsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHIgPSBDVURBX0NBTExfTk9D SEVDSyAoY3VTdHJlYW1DcmVhdGUsICZzLT5zdHJlYW0sCi0JCQkJICAgICBD VV9TVFJFQU1fREVGQVVMVCk7Ci0JICAgICAgaWYgKHIgIT0gQ1VEQV9TVUND RVNTKQotCQl7Ci0JCSAgcHRocmVhZF9tdXRleF91bmxvY2sgKCZwdHhfZGV2 LT5zdHJlYW1fbG9jayk7Ci0JCSAgR09NUF9QTFVHSU5fZmF0YWwgKCJjdVN0 cmVhbUNyZWF0ZSBlcnJvcjogJXMiLAotCQkJCSAgICAgY3VkYV9lcnJvciAo cikpOwotCQl9Ci0JICAgIH0KLQotCSAgLyogSWYgQ1JFQVRFIGlzIHRydWUs IHdlJ3JlIGdvaW5nIHRvIGJlIHF1ZXVlaW5nIHNvbWUgd29yayBvbiB0aGlz Ci0JICAgICBzdHJlYW0uICBBc3NvY2lhdGUgaXQgd2l0aCB0aGUgY3VycmVu dCBob3N0IHRocmVhZC4gICovCi0JICBzLT5ob3N0X3RocmVhZCA9IHRocmVh ZDsKLQkgIHMtPm11bHRpdGhyZWFkZWQgPSBmYWxzZTsKLQotCSAgcy0+ZCA9 IChDVWRldmljZXB0cikgTlVMTDsKLQkgIHMtPmggPSBOVUxMOwotCSAgaWYg KCFtYXBfaW5pdCAocykpCi0JICAgIHsKLQkgICAgICBwdGhyZWFkX211dGV4 X3VubG9jayAoJnB0eF9kZXYtPnN0cmVhbV9sb2NrKTsKLQkgICAgICBHT01Q X1BMVUdJTl9mYXRhbCAoIm1hcF9pbml0IGZhaWwiKTsKLQkgICAgfQotCi0J ICBzLT5uZXh0ID0gcHR4X2Rldi0+YWN0aXZlX3N0cmVhbXM7Ci0JICBwdHhf ZGV2LT5hY3RpdmVfc3RyZWFtcyA9IHM7Ci0JICBwdHhfZGV2LT5hc3luY19z dHJlYW1zLmFyclthc3luY10gPSBzOwotCX0KLQotICAgICAgc3RyZWFtID0g cHR4X2Rldi0+YXN5bmNfc3RyZWFtcy5hcnJbYXN5bmNdOwotICAgIH0KLSAg ZWxzZSBpZiAoYXN5bmMgPCAwKQotICAgIHsKLSAgICAgIGlmIChjcmVhdGUp Ci0JcHRocmVhZF9tdXRleF91bmxvY2sgKCZwdHhfZGV2LT5zdHJlYW1fbG9j ayk7Ci0gICAgICBHT01QX1BMVUdJTl9mYXRhbCAoImJhZCBhc3luYyAlZCIs IGFzeW5jKTsKLSAgICB9Ci0KLSAgaWYgKGNyZWF0ZSkKLSAgICB7Ci0gICAg ICBhc3NlcnQgKHN0cmVhbSAhPSBOVUxMKTsKLQotICAgICAgLyogSWYgd2Un cmUgdHJ5aW5nIHRvIHVzZSB0aGUgc2FtZSBzdHJlYW0gZnJvbSBkaWZmZXJl bnQgdGhyZWFkcwotCSBzaW11bHRhbmVvdXNseSwgc2V0IHN0cmVhbS0+bXVs dGl0aHJlYWRlZCB0byB0cnVlLiAgVGhpcyBhZmZlY3RzIHRoZQotCSBiZWhh dmlvdXIgb2YgYWNjX2FzeW5jX3Rlc3RfYWxsIGFuZCBhY2Nfd2FpdF9hbGws IHdoaWNoIGFyZSBzdXBwb3NlZCB0bwotCSBvbmx5IHdhaXQgZm9yIGFzeW5j aHJvbm91cyBsYXVuY2hlcyBmcm9tIHRoZSBzYW1lIGhvc3QgdGhyZWFkIHRo ZXkgYXJlCi0JIGludm9rZWQgb24uICBJZiBtdWx0aXBsZSB0aHJlYWRzIHVz ZSB0aGUgc2FtZSBhc3luYyB2YWx1ZSwgd2UgbWFrZSBub3RlCi0JIG9mIHRo YXQgaGVyZSBhbmQgZmFsbCBiYWNrIHRvIHRlc3Rpbmcvd2FpdGluZyBmb3Ig YWxsIHRocmVhZHMgaW4gdGhvc2UKLQkgZnVuY3Rpb25zLiAgKi8KLSAgICAg IGlmICh0aHJlYWQgIT0gc3RyZWFtLT5ob3N0X3RocmVhZCkKLSAgICAgICAg c3RyZWFtLT5tdWx0aXRocmVhZGVkID0gdHJ1ZTsKLQotICAgICAgcHRocmVh ZF9tdXRleF91bmxvY2sgKCZwdHhfZGV2LT5zdHJlYW1fbG9jayk7Ci0gICAg fQotICBlbHNlIGlmIChzdHJlYW0gJiYgIXN0cmVhbS0+bXVsdGl0aHJlYWRl ZAotCSAgICYmICFwdGhyZWFkX2VxdWFsIChzdHJlYW0tPmhvc3RfdGhyZWFk LCB0aHJlYWQpKQotICAgIEdPTVBfUExVR0lOX2ZhdGFsICgiYXN5bmMgJWQg dXNlZCBvbiB3cm9uZyB0aHJlYWQiLCBvcmlnX2FzeW5jKTsKLQotICByZXR1 cm4gc3RyZWFtOwotfQotCiAvKiBJbml0aWFsaXplIHRoZSBkZXZpY2UuICBS ZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBlbHNlIEZBTFNFLiAgUFRYX0RFVl9M T0NLCiAgICBzaG91bGQgYmUgbG9ja2VkIG9uIGVudHJ5IGFuZCByZW1haW5z IGxvY2tlZCBvbiBleGl0LiAgKi8KIApAQCAtNjM0LDkgKzMyMiw2IEBAIG52 cHR4X2luaXQgKHZvaWQpCiAgIGlmIChpbnN0YW50aWF0ZWRfZGV2aWNlcyAh PSAwKQogICAgIHJldHVybiB0cnVlOwogCi0gIHB0eF9ldmVudHMgPSBOVUxM OwotICBwdGhyZWFkX211dGV4X2luaXQgKCZwdHhfZXZlbnRfbG9jaywgTlVM TCk7Ci0KICAgaWYgKCFpbml0X2N1ZGFfbGliICgpKQogICAgIHJldHVybiBm YWxzZTsKIApAQCAtNjYwLDYgKzM0NSwxMSBAQCBudnB0eF9hdHRhY2hfaG9z dF90aHJlYWRfdG9fZGV2aWNlIChpbnQgbikKICAgQ1Vjb250ZXh0IHRoZF9j dHg7CiAKICAgciA9IENVREFfQ0FMTF9OT0NIRUNLIChjdUN0eEdldERldmlj ZSwgJmRldik7CisgIGlmIChyID09IENVREFfRVJST1JfTk9UX1BFUk1JVFRF RCkKKyAgICB7CisgICAgICAvKiBBc3N1bWUgd2UncmUgaW4gYSBDVURBIGNh bGxiYWNrLCBqdXN0IHJldHVybiB0cnVlLiAgKi8KKyAgICAgIHJldHVybiB0 cnVlOworICAgIH0KICAgaWYgKHIgIT0gQ1VEQV9TVUNDRVNTICYmIHIgIT0g Q1VEQV9FUlJPUl9JTlZBTElEX0NPTlRFWFQpCiAgICAgewogICAgICAgR09N UF9QTFVHSU5fZXJyb3IgKCJjdUN0eEdldERldmljZSBlcnJvcjogJXMiLCBj dWRhX2Vycm9yIChyKSk7CkBAIC04MDQsOCArNDk0LDggQEAgbnZwdHhfb3Bl bl9kZXZpY2UgKGludCBuKQogICBwdHhfZGV2LT5pbWFnZXMgPSBOVUxMOwog ICBwdGhyZWFkX211dGV4X2luaXQgKCZwdHhfZGV2LT5pbWFnZV9sb2NrLCBO VUxMKTsKIAotICBpZiAoIWluaXRfc3RyZWFtc19mb3JfZGV2aWNlIChwdHhf ZGV2LCBhc3luY19lbmdpbmVzKSkKLSAgICByZXR1cm4gTlVMTDsKKyAgcHR4 X2Rldi0+ZnJlZV9ibG9ja3MgPSBOVUxMOworICBwdGhyZWFkX211dGV4X2lu aXQgKCZwdHhfZGV2LT5mcmVlX2Jsb2Nrc19sb2NrLCBOVUxMKTsKIAogICBy ZXR1cm4gcHR4X2RldjsKIH0KQEAgLTgxNiw5ICs1MDYsMTUgQEAgbnZwdHhf Y2xvc2VfZGV2aWNlIChzdHJ1Y3QgcHR4X2RldmljZSAqcHR4X2RldikKICAg aWYgKCFwdHhfZGV2KQogICAgIHJldHVybiB0cnVlOwogCi0gIGlmICghZmlu aV9zdHJlYW1zX2Zvcl9kZXZpY2UgKHB0eF9kZXYpKQotICAgIHJldHVybiBm YWxzZTsKLSAgCisgIGZvciAoc3RydWN0IHB0eF9mcmVlX2Jsb2NrICpiID0g cHR4X2Rldi0+ZnJlZV9ibG9ja3M7IGI7KQorICAgIHsKKyAgICAgIHN0cnVj dCBwdHhfZnJlZV9ibG9jayAqYl9uZXh0ID0gYi0+bmV4dDsKKyAgICAgIENV REFfQ0FMTCAoY3VNZW1GcmVlLCAoQ1VkZXZpY2VwdHIpIGItPnB0cik7Cisg ICAgICBmcmVlIChiKTsKKyAgICAgIGIgPSBiX25leHQ7CisgICAgfQorCisg IHB0aHJlYWRfbXV0ZXhfZGVzdHJveSAoJnB0eF9kZXYtPmZyZWVfYmxvY2tz X2xvY2spOwogICBwdGhyZWFkX211dGV4X2Rlc3Ryb3kgKCZwdHhfZGV2LT5p bWFnZV9sb2NrKTsKIAogICBpZiAoIXB0eF9kZXYtPmN0eF9zaGFyZWQpCkBA IC05OTgsMTM4ICs2OTQsMTkgQEAgbGlua19wdHggKENVbW9kdWxlICptb2R1 bGUsIGNvbnN0IHN0cnVjdCB0YXJnX3B0eF9vYmogKnB0eF9vYmpzLAogfQog CiBzdGF0aWMgdm9pZAotZXZlbnRfZ2MgKGJvb2wgbWVtbWFwX2xvY2thYmxl KQotewotICBzdHJ1Y3QgcHR4X2V2ZW50ICpwdHhfZXZlbnQgPSBwdHhfZXZl bnRzOwotICBzdHJ1Y3QgcHR4X2V2ZW50ICphc3luY19jbGVhbnVwcyA9IE5V TEw7Ci0gIHN0cnVjdCBudnB0eF90aHJlYWQgKm52dGhkID0gbnZwdHhfdGhy ZWFkICgpOwotCi0gIHB0aHJlYWRfbXV0ZXhfbG9jayAoJnB0eF9ldmVudF9s b2NrKTsKLQotICB3aGlsZSAocHR4X2V2ZW50ICE9IE5VTEwpCi0gICAgewot ICAgICAgQ1VyZXN1bHQgcjsKLSAgICAgIHN0cnVjdCBwdHhfZXZlbnQgKmUg PSBwdHhfZXZlbnQ7Ci0KLSAgICAgIHB0eF9ldmVudCA9IHB0eF9ldmVudC0+ bmV4dDsKLQotICAgICAgaWYgKGUtPm9yZCAhPSBudnRoZC0+cHR4X2Rldi0+ b3JkKQotCWNvbnRpbnVlOwotCi0gICAgICByID0gQ1VEQV9DQUxMX05PQ0hF Q0sgKGN1RXZlbnRRdWVyeSwgKmUtPmV2dCk7Ci0gICAgICBpZiAociA9PSBD VURBX1NVQ0NFU1MpCi0JewotCSAgYm9vbCBhcHBlbmRfYXN5bmMgPSBmYWxz ZTsKLQkgIENVZXZlbnQgKnRlOwotCi0JICB0ZSA9IGUtPmV2dDsKLQotCSAg c3dpdGNoIChlLT50eXBlKQotCSAgICB7Ci0JICAgIGNhc2UgUFRYX0VWVF9N RU06Ci0JICAgIGNhc2UgUFRYX0VWVF9TWU5DOgotCSAgICAgIGJyZWFrOwot Ci0JICAgIGNhc2UgUFRYX0VWVF9LTkw6Ci0JICAgICAgbWFwX3BvcCAoZS0+ YWRkcik7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBQVFhfRVZUX0FT WU5DX0NMRUFOVVA6Ci0JICAgICAgewotCQkvKiBUaGUgZnVuY3Rpb24gZ29t cF9wbHVnaW5fYXN5bmNfdW5tYXBfdmFycyBuZWVkcyB0byBjbGFpbSB0aGUK LQkJICAgbWVtb3J5LW1hcCBzcGxheSB0cmVlIGxvY2sgZm9yIHRoZSBjdXJy ZW50IGRldmljZSwgc28gd2UKLQkJICAgY2FuJ3QgY2FsbCBpdCB3aGVuIG9u ZSBvZiBvdXIgY2FsbGVycyBoYXMgYWxyZWFkeSBjbGFpbWVkCi0JCSAgIHRo ZSBsb2NrLiAgSW4gdGhhdCBjYXNlLCBqdXN0IGRlbGF5IHRoZSBHQyBmb3Ig dGhpcyBldmVudAotCQkgICB1bnRpbCBsYXRlci4gICovCi0JCWlmICghbWVt bWFwX2xvY2thYmxlKQotCQkgIGNvbnRpbnVlOwotCi0JCWFwcGVuZF9hc3lu YyA9IHRydWU7Ci0JICAgICAgfQotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0K LQkgIENVREFfQ0FMTF9OT0NIRUNLIChjdUV2ZW50RGVzdHJveSwgKnRlKTsK LQkgIGZyZWUgKCh2b2lkICopdGUpOwotCi0JICAvKiBVbmxpbmsgJ2UnIGZy b20gcHR4X2V2ZW50cyBsaXN0LiAgKi8KLQkgIGlmIChwdHhfZXZlbnRzID09 IGUpCi0JICAgIHB0eF9ldmVudHMgPSBwdHhfZXZlbnRzLT5uZXh0OwotCSAg ZWxzZQotCSAgICB7Ci0JICAgICAgc3RydWN0IHB0eF9ldmVudCAqZV8gPSBw dHhfZXZlbnRzOwotCSAgICAgIHdoaWxlIChlXy0+bmV4dCAhPSBlKQotCQll XyA9IGVfLT5uZXh0OwotCSAgICAgIGVfLT5uZXh0ID0gZV8tPm5leHQtPm5l eHQ7Ci0JICAgIH0KLQotCSAgaWYgKGFwcGVuZF9hc3luYykKLQkgICAgewot CSAgICAgIGUtPm5leHQgPSBhc3luY19jbGVhbnVwczsKLQkgICAgICBhc3lu Y19jbGVhbnVwcyA9IGU7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgZnJlZSAo ZSk7Ci0JfQotICAgIH0KLQotICBwdGhyZWFkX211dGV4X3VubG9jayAoJnB0 eF9ldmVudF9sb2NrKTsKLQotICAvKiBXZSBoYXZlIHRvIGRvIHRoZXNlIGhl cmUsIGFmdGVyIHB0eF9ldmVudF9sb2NrIGlzIHJlbGVhc2VkLiAgKi8KLSAg d2hpbGUgKGFzeW5jX2NsZWFudXBzKQotICAgIHsKLSAgICAgIHN0cnVjdCBw dHhfZXZlbnQgKmUgPSBhc3luY19jbGVhbnVwczsKLSAgICAgIGFzeW5jX2Ns ZWFudXBzID0gYXN5bmNfY2xlYW51cHMtPm5leHQ7Ci0KLSAgICAgIEdPTVBf UExVR0lOX2FzeW5jX3VubWFwX3ZhcnMgKGUtPmFkZHIsIGUtPnZhbCk7Ci0g ICAgICBmcmVlIChlKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1ldmVu dF9hZGQgKGVudW0gcHR4X2V2ZW50X3R5cGUgdHlwZSwgQ1VldmVudCAqZSwg dm9pZCAqaCwgaW50IHZhbCkKLXsKLSAgc3RydWN0IHB0eF9ldmVudCAqcHR4 X2V2ZW50OwotICBzdHJ1Y3QgbnZwdHhfdGhyZWFkICpudnRoZCA9IG52cHR4 X3RocmVhZCAoKTsKLQotICBhc3NlcnQgKHR5cGUgPT0gUFRYX0VWVF9NRU0g fHwgdHlwZSA9PSBQVFhfRVZUX0tOTCB8fCB0eXBlID09IFBUWF9FVlRfU1lO QwotCSAgfHwgdHlwZSA9PSBQVFhfRVZUX0FTWU5DX0NMRUFOVVApOwotCi0g IHB0eF9ldmVudCA9IEdPTVBfUExVR0lOX21hbGxvYyAoc2l6ZW9mIChzdHJ1 Y3QgcHR4X2V2ZW50KSk7Ci0gIHB0eF9ldmVudC0+dHlwZSA9IHR5cGU7Ci0g IHB0eF9ldmVudC0+ZXZ0ID0gZTsKLSAgcHR4X2V2ZW50LT5hZGRyID0gaDsK LSAgcHR4X2V2ZW50LT5vcmQgPSBudnRoZC0+cHR4X2Rldi0+b3JkOwotICBw dHhfZXZlbnQtPnZhbCA9IHZhbDsKLQotICBwdGhyZWFkX211dGV4X2xvY2sg KCZwdHhfZXZlbnRfbG9jayk7Ci0KLSAgcHR4X2V2ZW50LT5uZXh0ID0gcHR4 X2V2ZW50czsKLSAgcHR4X2V2ZW50cyA9IHB0eF9ldmVudDsKLQotICBwdGhy ZWFkX211dGV4X3VubG9jayAoJnB0eF9ldmVudF9sb2NrKTsKLX0KLQotc3Rh dGljIHZvaWQKIG52cHR4X2V4ZWMgKHZvaWQgKCpmbiksIHNpemVfdCBtYXBu dW0sIHZvaWQgKipob3N0YWRkcnMsIHZvaWQgKipkZXZhZGRycywKLQkgICAg aW50IGFzeW5jLCB1bnNpZ25lZCAqZGltcywgdm9pZCAqdGFyZ19tZW1fZGVz YykKKwkgICAgdW5zaWduZWQgKmRpbXMsIHZvaWQgKnRhcmdfbWVtX2Rlc2Ms CisJICAgIENVZGV2aWNlcHRyIGRwLCBDVXN0cmVhbSBzdHJlYW0pCiB7CiAg IHN0cnVjdCB0YXJnX2ZuX2Rlc2NyaXB0b3IgKnRhcmdfZm4gPSAoc3RydWN0 IHRhcmdfZm5fZGVzY3JpcHRvciAqKSBmbjsKICAgQ1VmdW5jdGlvbiBmdW5j dGlvbjsKLSAgQ1VyZXN1bHQgcjsKICAgaW50IGk7Ci0gIHN0cnVjdCBwdHhf c3RyZWFtICpkZXZfc3RyOwogICB2b2lkICprYXJnc1sxXTsKLSAgdm9pZCAq aHAsICpkcDsKICAgc3RydWN0IG52cHR4X3RocmVhZCAqbnZ0aGQgPSBudnB0 eF90aHJlYWQgKCk7CiAgIGludCB3YXJwX3NpemUgPSBudnRoZC0+cHR4X2Rl di0+d2FycF9zaXplOwotICBjb25zdCBjaGFyICptYXliZV9hYm9ydF9tc2cg PSAiKHBlcmhhcHMgYWJvcnQgd2FzIGNhbGxlZCkiOwogCiAgIGZ1bmN0aW9u ID0gdGFyZ19mbi0+Zm47CiAKLSAgZGV2X3N0ciA9IHNlbGVjdF9zdHJlYW1f Zm9yX2FzeW5jIChhc3luYywgcHRocmVhZF9zZWxmICgpLCBmYWxzZSwgTlVM TCk7Ci0gIGFzc2VydCAoZGV2X3N0ciA9PSBudnRoZC0+Y3VycmVudF9zdHJl YW0pOwotCiAgIC8qIEluaXRpYWxpemUgdGhlIGxhdW5jaCBkaW1lbnNpb25z LiAgVHlwaWNhbGx5IHRoaXMgaXMgY29uc3RhbnQsCiAgICAgIHByb3ZpZGVk IGJ5IHRoZSBkZXZpY2UgY29tcGlsZXIsIGJ1dCB3ZSBtdXN0IHBlcm1pdCBy dW50aW1lCiAgICAgIHZhbHVlcy4gICovCkBAIC0xMjkyLDIxICs4NjksNiBA QCBudnB0eF9leGVjICh2b2lkICgqZm4pLCBzaXplX3QgbWFwbnVtLCB2b2lk ICoqaG9zdGFkZHJzLCB2b2lkICoqZGV2YWRkcnMsCiAJCQkgc3VnZ2VzdF93 b3JrZXJzLCBzdWdnZXN0X3dvcmtlcnMpOwogICAgIH0KIAotICAvKiBUaGlz IHJlc2VydmVzIGEgY2h1bmsgb2YgYSBwcmUtYWxsb2NhdGVkIHBhZ2Ugb2Yg bWVtb3J5IG1hcHBlZCBvbiBib3RoCi0gICAgIHRoZSBob3N0IGFuZCB0aGUg ZGV2aWNlLiBIUCBpcyBhIGhvc3QgcG9pbnRlciB0byB0aGUgbmV3IGNodW5r LCBhbmQgRFAgaXMKLSAgICAgdGhlIGNvcnJlc3BvbmRpbmcgZGV2aWNlIHBv aW50ZXIuICAqLwotICBtYXBfcHVzaCAoZGV2X3N0ciwgbWFwbnVtICogc2l6 ZW9mICh2b2lkICopLCAmaHAsICZkcCk7Ci0KLSAgR09NUF9QTFVHSU5fZGVi dWcgKDAsICIgICVzOiBwcmVwYXJlIG1hcHBpbmdzXG4iLCBfX0ZVTkNUSU9O X18pOwotCi0gIC8qIENvcHkgdGhlIGFycmF5IG9mIGFyZ3VtZW50cyB0byB0 aGUgbWFwcGVkIHBhZ2UuICAqLwotICBmb3IgKGkgPSAwOyBpIDwgbWFwbnVt OyBpKyspCi0gICAgKCh2b2lkICoqKSBocClbaV0gPSBkZXZhZGRyc1tpXTsK LQotICAvKiBDb3B5IHRoZSAoZGV2aWNlKSBwb2ludGVycyB0byBhcmd1bWVu dHMgdG8gdGhlIGRldmljZSAoZHAgYW5kIGhwIG1pZ2h0IGluCi0gICAgIGZh Y3QgaGF2ZSB0aGUgc2FtZSB2YWx1ZSBvbiBhIHVuaWZpZWQtbWVtb3J5IHN5 c3RlbSkuICAqLwotICBDVURBX0NBTExfQVNTRVJUIChjdU1lbWNweSwgKENV ZGV2aWNlcHRyKSBkcCwgKENVZGV2aWNlcHRyKSBocCwKLQkJICAgIG1hcG51 bSAqIHNpemVvZiAodm9pZCAqKSk7CiAgIEdPTVBfUExVR0lOX2RlYnVnICgw LCAiICAlczoga2VybmVsICVzOiBsYXVuY2giCiAJCSAgICAgIiBnYW5ncz0l dSwgd29ya2Vycz0ldSwgdmVjdG9ycz0ldVxuIiwKIAkJICAgICBfX0ZVTkNU SU9OX18sIHRhcmdfZm4tPmxhdW5jaC0+Zm4sIGRpbXNbR09NUF9ESU1fR0FO R10sCkBAIC0xMzE3LDU4ICs4NzksMTQgQEAgbnZwdHhfZXhlYyAodm9pZCAo KmZuKSwgc2l6ZV90IG1hcG51bSwgdm9pZCAqKmhvc3RhZGRycywgdm9pZCAq KmRldmFkZHJzLAogICAvLyBudW1fZ2FuZ3MJCW5jdGFpZC54CiAgIC8vIG51 bV93b3JrZXJzCW50aWQueQogICAvLyB2ZWN0b3IgbGVuZ3RoCW50aWQueAot CiAgIGthcmdzWzBdID0gJmRwOwogICBDVURBX0NBTExfQVNTRVJUIChjdUxh dW5jaEtlcm5lbCwgZnVuY3Rpb24sCiAJCSAgICBkaW1zW0dPTVBfRElNX0dB TkddLCAxLCAxLAogCQkgICAgZGltc1tHT01QX0RJTV9WRUNUT1JdLCBkaW1z W0dPTVBfRElNX1dPUktFUl0sIDEsCi0JCSAgICAwLCBkZXZfc3RyLT5zdHJl YW0sIGthcmdzLCAwKTsKLQotI2lmbmRlZiBESVNBQkxFX0FTWU5DCi0gIGlm IChhc3luYyA8IGFjY19hc3luY19ub3ZhbCkKLSAgICB7Ci0gICAgICByID0g Q1VEQV9DQUxMX05PQ0hFQ0sgKGN1U3RyZWFtU3luY2hyb25pemUsIGRldl9z dHItPnN0cmVhbSk7Ci0gICAgICBpZiAociA9PSBDVURBX0VSUk9SX0xBVU5D SF9GQUlMRUQpCi0JR09NUF9QTFVHSU5fZmF0YWwgKCJjdVN0cmVhbVN5bmNo cm9uaXplIGVycm9yOiAlcyAlc1xuIiwgY3VkYV9lcnJvciAociksCi0JCQkg ICBtYXliZV9hYm9ydF9tc2cpOwotICAgICAgZWxzZSBpZiAociAhPSBDVURB X1NVQ0NFU1MpCi0gICAgICAgIEdPTVBfUExVR0lOX2ZhdGFsICgiY3VTdHJl YW1TeW5jaHJvbml6ZSBlcnJvcjogJXMiLCBjdWRhX2Vycm9yIChyKSk7Ci0g ICAgfQotICBlbHNlCi0gICAgewotICAgICAgQ1VldmVudCAqZTsKLQotICAg ICAgZSA9IChDVWV2ZW50ICopR09NUF9QTFVHSU5fbWFsbG9jIChzaXplb2Yg KENVZXZlbnQpKTsKLQotICAgICAgciA9IENVREFfQ0FMTF9OT0NIRUNLIChj dUV2ZW50Q3JlYXRlLCBlLCBDVV9FVkVOVF9ESVNBQkxFX1RJTUlORyk7Ci0g ICAgICBpZiAociA9PSBDVURBX0VSUk9SX0xBVU5DSF9GQUlMRUQpCi0JR09N UF9QTFVHSU5fZmF0YWwgKCJjdUV2ZW50Q3JlYXRlIGVycm9yOiAlcyAlc1xu IiwgY3VkYV9lcnJvciAociksCi0JCQkgICBtYXliZV9hYm9ydF9tc2cpOwot ICAgICAgZWxzZSBpZiAociAhPSBDVURBX1NVQ0NFU1MpCi0gICAgICAgIEdP TVBfUExVR0lOX2ZhdGFsICgiY3VFdmVudENyZWF0ZSBlcnJvcjogJXMiLCBj dWRhX2Vycm9yIChyKSk7Ci0KLSAgICAgIGV2ZW50X2djICh0cnVlKTsKLQot ICAgICAgQ1VEQV9DQUxMX0FTU0VSVCAoY3VFdmVudFJlY29yZCwgKmUsIGRl dl9zdHItPnN0cmVhbSk7Ci0KLSAgICAgIGV2ZW50X2FkZCAoUFRYX0VWVF9L TkwsIGUsICh2b2lkICopZGV2X3N0ciwgMCk7Ci0gICAgfQotI2Vsc2UKLSAg ciA9IENVREFfQ0FMTF9OT0NIRUNLIChjdUN0eFN5bmNocm9uaXplLCApOwot ICBpZiAociA9PSBDVURBX0VSUk9SX0xBVU5DSF9GQUlMRUQpCi0gICAgR09N UF9QTFVHSU5fZmF0YWwgKCJjdUN0eFN5bmNocm9uaXplIGVycm9yOiAlcyAl c1xuIiwgY3VkYV9lcnJvciAociksCi0JCSAgICAgICBtYXliZV9hYm9ydF9t c2cpOwotICBlbHNlIGlmIChyICE9IENVREFfU1VDQ0VTUykKLSAgICBHT01Q X1BMVUdJTl9mYXRhbCAoImN1Q3R4U3luY2hyb25pemUgZXJyb3I6ICVzIiwg Y3VkYV9lcnJvciAocikpOwotI2VuZGlmCisJCSAgICAwLCBzdHJlYW0sIGth cmdzLCAwKTsKIAogICBHT01QX1BMVUdJTl9kZWJ1ZyAoMCwgIiAgJXM6IGtl cm5lbCAlczogZmluaXNoZWRcbiIsIF9fRlVOQ1RJT05fXywKIAkJICAgICB0 YXJnX2ZuLT5sYXVuY2gtPmZuKTsKLQotI2lmbmRlZiBESVNBQkxFX0FTWU5D Ci0gIGlmIChhc3luYyA8IGFjY19hc3luY19ub3ZhbCkKLSNlbmRpZgotICAg IG1hcF9wb3AgKGRldl9zdHIpOwogfQogCiB2b2lkICogb3BlbmFjY19nZXRf Y3VycmVudF9jdWRhX2NvbnRleHQgKHZvaWQpOwpAQCAtMTM4Myw4ICs5MDEs MjEgQEAgbnZwdHhfYWxsb2MgKHNpemVfdCBzKQogfQogCiBzdGF0aWMgYm9v bAotbnZwdHhfZnJlZSAodm9pZCAqcCkKK252cHR4X2ZyZWUgKHZvaWQgKnAs IHN0cnVjdCBwdHhfZGV2aWNlICpwdHhfZGV2KQogeworICAvKiBBc3N1bWUg Y2FsbGJhY2sgY29udGV4dCBpZiB0aGlzIGlzIG51bGwuICAqLworICBpZiAo R09NUF9QTFVHSU5fYWNjX3RocmVhZCAoKSA9PSBOVUxMKQorICAgIHsKKyAg ICAgIHN0cnVjdCBwdHhfZnJlZV9ibG9jayAqbgorCT0gR09NUF9QTFVHSU5f bWFsbG9jIChzaXplb2YgKHN0cnVjdCBwdHhfZnJlZV9ibG9jaykpOworICAg ICAgbi0+cHRyID0gcDsKKyAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jayAoJnB0 eF9kZXYtPmZyZWVfYmxvY2tzX2xvY2spOworICAgICAgbi0+bmV4dCA9IHB0 eF9kZXYtPmZyZWVfYmxvY2tzOworICAgICAgcHR4X2Rldi0+ZnJlZV9ibG9j a3MgPSBuOworICAgICAgcHRocmVhZF9tdXRleF91bmxvY2sgKCZwdHhfZGV2 LT5mcmVlX2Jsb2Nrc19sb2NrKTsKKyAgICAgIHJldHVybiB0cnVlOworICAg IH0KKwogICBDVWRldmljZXB0ciBwYjsKICAgc2l6ZV90IHBzOwogCkBAIC0x Mzk5LDM4OSArOTMwLDI3IEBAIG52cHR4X2ZyZWUgKHZvaWQgKnApCiAgIHJl dHVybiB0cnVlOwogfQogCi0KLXN0YXRpYyBib29sCi1udnB0eF9ob3N0MmRl diAodm9pZCAqZCwgY29uc3Qgdm9pZCAqaCwgc2l6ZV90IHMpCitzdGF0aWMg dm9pZCAqCitudnB0eF9nZXRfY3VycmVudF9jdWRhX2RldmljZSAodm9pZCkK IHsKLSAgQ1VkZXZpY2VwdHIgcGI7Ci0gIHNpemVfdCBwczsKICAgc3RydWN0 IG52cHR4X3RocmVhZCAqbnZ0aGQgPSBudnB0eF90aHJlYWQgKCk7CiAKLSAg aWYgKCFzKQotICAgIHJldHVybiB0cnVlOwotICBpZiAoIWQpCi0gICAgewot ICAgICAgR09NUF9QTFVHSU5fZXJyb3IgKCJpbnZhbGlkIGRldmljZSBhZGRy ZXNzIik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIENVREFf Q0FMTCAoY3VNZW1HZXRBZGRyZXNzUmFuZ2UsICZwYiwgJnBzLCAoQ1VkZXZp Y2VwdHIpIGQpOwotCi0gIGlmICghcGIpCi0gICAgewotICAgICAgR09NUF9Q TFVHSU5fZXJyb3IgKCJpbnZhbGlkIGRldmljZSBhZGRyZXNzIik7Ci0gICAg ICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICBpZiAoIWgpCi0gICAgewotICAg ICAgR09NUF9QTFVHSU5fZXJyb3IgKCJpbnZhbGlkIGhvc3QgYWRkcmVzcyIp OwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgaWYgKGQgPT0gaCkK LSAgICB7Ci0gICAgICBHT01QX1BMVUdJTl9lcnJvciAoImludmFsaWQgaG9z dCBvciBkZXZpY2UgYWRkcmVzcyIpOwotICAgICAgcmV0dXJuIGZhbHNlOwot ICAgIH0KLSAgaWYgKCh2b2lkICopKGQgKyBzKSA+ICh2b2lkICopKHBiICsg cHMpKQotICAgIHsKLSAgICAgIEdPTVBfUExVR0lOX2Vycm9yICgiaW52YWxp ZCBzaXplIik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0jaWZu ZGVmIERJU0FCTEVfQVNZTkMKLSAgaWYgKG52dGhkICYmIG52dGhkLT5jdXJy ZW50X3N0cmVhbSAhPSBudnRoZC0+cHR4X2Rldi0+bnVsbF9zdHJlYW0pCi0g ICAgewotICAgICAgQ1VldmVudCAqZSA9IChDVWV2ZW50ICopR09NUF9QTFVH SU5fbWFsbG9jIChzaXplb2YgKENVZXZlbnQpKTsKLSAgICAgIENVREFfQ0FM TCAoY3VFdmVudENyZWF0ZSwgZSwgQ1VfRVZFTlRfRElTQUJMRV9USU1JTkcp OwotICAgICAgZXZlbnRfZ2MgKGZhbHNlKTsKLSAgICAgIENVREFfQ0FMTCAo Y3VNZW1jcHlIdG9EQXN5bmMsCi0JCSAoQ1VkZXZpY2VwdHIpIGQsIGgsIHMs IG52dGhkLT5jdXJyZW50X3N0cmVhbS0+c3RyZWFtKTsKLSAgICAgIENVREFf Q0FMTCAoY3VFdmVudFJlY29yZCwgKmUsIG52dGhkLT5jdXJyZW50X3N0cmVh bS0+c3RyZWFtKTsKLSAgICAgIGV2ZW50X2FkZCAoUFRYX0VWVF9NRU0sIGUs ICh2b2lkICopaCwgMCk7Ci0gICAgfQotICBlbHNlCi0jZW5kaWYKLSAgICBD VURBX0NBTEwgKGN1TWVtY3B5SHRvRCwgKENVZGV2aWNlcHRyKSBkLCBoLCBz KTsKKyAgaWYgKCFudnRoZCB8fCAhbnZ0aGQtPnB0eF9kZXYpCisgICAgcmV0 dXJuIE5VTEw7CiAKLSAgcmV0dXJuIHRydWU7CisgIHJldHVybiAmbnZ0aGQt PnB0eF9kZXYtPmRldjsKIH0KIAotc3RhdGljIGJvb2wKLW52cHR4X2RldjJo b3N0ICh2b2lkICpoLCBjb25zdCB2b2lkICpkLCBzaXplX3QgcykKK3N0YXRp YyB2b2lkICoKK252cHR4X2dldF9jdXJyZW50X2N1ZGFfY29udGV4dCAodm9p ZCkKIHsKLSAgQ1VkZXZpY2VwdHIgcGI7Ci0gIHNpemVfdCBwczsKICAgc3Ry dWN0IG52cHR4X3RocmVhZCAqbnZ0aGQgPSBudnB0eF90aHJlYWQgKCk7CiAK LSAgaWYgKCFzKQotICAgIHJldHVybiB0cnVlOwotICBpZiAoIWQpCi0gICAg ewotICAgICAgR09NUF9QTFVHSU5fZXJyb3IgKCJpbnZhbGlkIGRldmljZSBh ZGRyZXNzIik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQorICBpZiAo IW52dGhkIHx8ICFudnRoZC0+cHR4X2RldikKKyAgICByZXR1cm4gTlVMTDsK IAotICBDVURBX0NBTEwgKGN1TWVtR2V0QWRkcmVzc1JhbmdlLCAmcGIsICZw cywgKENVZGV2aWNlcHRyKSBkKTsKLQotICBpZiAoIXBiKQotICAgIHsKLSAg ICAgIEdPTVBfUExVR0lOX2Vycm9yICgiaW52YWxpZCBkZXZpY2UgYWRkcmVz cyIpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgaWYgKCFoKQot ICAgIHsKLSAgICAgIEdPTVBfUExVR0lOX2Vycm9yICgiaW52YWxpZCBob3N0 IGFkZHJlc3MiKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGlm IChkID09IGgpCi0gICAgewotICAgICAgR09NUF9QTFVHSU5fZXJyb3IgKCJp bnZhbGlkIGhvc3Qgb3IgZGV2aWNlIGFkZHJlc3MiKTsKLSAgICAgIHJldHVy biBmYWxzZTsKLSAgICB9Ci0gIGlmICgodm9pZCAqKShkICsgcykgPiAodm9p ZCAqKShwYiArIHBzKSkKLSAgICB7Ci0gICAgICBHT01QX1BMVUdJTl9lcnJv ciAoImludmFsaWQgc2l6ZSIpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAg IH0KLQotI2lmbmRlZiBESVNBQkxFX0FTWU5DCi0gIGlmIChudnRoZCAmJiBu dnRoZC0+Y3VycmVudF9zdHJlYW0gIT0gbnZ0aGQtPnB0eF9kZXYtPm51bGxf c3RyZWFtKQotICAgIHsKLSAgICAgIENVZXZlbnQgKmUgPSAoQ1VldmVudCAq KSBHT01QX1BMVUdJTl9tYWxsb2MgKHNpemVvZiAoQ1VldmVudCkpOwotICAg ICAgQ1VEQV9DQUxMIChjdUV2ZW50Q3JlYXRlLCBlLCBDVV9FVkVOVF9ESVNB QkxFX1RJTUlORyk7Ci0gICAgICBldmVudF9nYyAoZmFsc2UpOwotICAgICAg Q1VEQV9DQUxMIChjdU1lbWNweUR0b0hBc3luYywKLQkJIGgsIChDVWRldmlj ZXB0cikgZCwgcywgbnZ0aGQtPmN1cnJlbnRfc3RyZWFtLT5zdHJlYW0pOwot ICAgICAgQ1VEQV9DQUxMIChjdUV2ZW50UmVjb3JkLCAqZSwgbnZ0aGQtPmN1 cnJlbnRfc3RyZWFtLT5zdHJlYW0pOwotICAgICAgZXZlbnRfYWRkIChQVFhf RVZUX01FTSwgZSwgKHZvaWQgKiloLCAwKTsKLSAgICB9Ci0gIGVsc2UKLSNl bmRpZgotICAgIENVREFfQ0FMTCAoY3VNZW1jcHlEdG9ILCBoLCAoQ1VkZXZp Y2VwdHIpIGQsIHMpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMg dm9pZAotbnZwdHhfc2V0X2FzeW5jIChpbnQgYXN5bmMpCi17Ci0gIHN0cnVj dCBudnB0eF90aHJlYWQgKm52dGhkID0gbnZwdHhfdGhyZWFkICgpOwotICBu dnRoZC0+Y3VycmVudF9zdHJlYW0KLSAgICA9IHNlbGVjdF9zdHJlYW1fZm9y X2FzeW5jIChhc3luYywgcHRocmVhZF9zZWxmICgpLCB0cnVlLCBOVUxMKTsK LX0KLQotc3RhdGljIGludAotbnZwdHhfYXN5bmNfdGVzdCAoaW50IGFzeW5j KQotewotICBDVXJlc3VsdCByOwotICBzdHJ1Y3QgcHR4X3N0cmVhbSAqczsK LQotICBzID0gc2VsZWN0X3N0cmVhbV9mb3JfYXN5bmMgKGFzeW5jLCBwdGhy ZWFkX3NlbGYgKCksIGZhbHNlLCBOVUxMKTsKLQotICBpZiAoIXMpCi0gICAg R09NUF9QTFVHSU5fZmF0YWwgKCJ1bmtub3duIGFzeW5jICVkIiwgYXN5bmMp OwotCi0gIHIgPSBDVURBX0NBTExfTk9DSEVDSyAoY3VTdHJlYW1RdWVyeSwg cy0+c3RyZWFtKTsKLSAgaWYgKHIgPT0gQ1VEQV9TVUNDRVNTKQotICAgIHsK LSAgICAgIC8qIFRoZSBvYWNjLXBhcmFsbGVsLmM6Z29hY2Nfd2FpdCBmdW5j dGlvbiBjYWxscyB0aGlzIGhvb2sgdG8gZGV0ZXJtaW5lCi0JIHdoZXRoZXIg YWxsIHdvcmsgaGFzIGNvbXBsZXRlZCBvbiB0aGlzIHN0cmVhbSwgYW5kIGlm IHNvIG9taXRzIHRoZSBjYWxsCi0JIHRvIHRoZSB3YWl0IGhvb2suICBJZiB0 aGF0IGhhcHBlbnMsIGV2ZW50X2djIG1pZ2h0IG5vdCBnZXQgY2FsbGVkCi0J ICh3aGljaCBwcmV2ZW50cyB2YXJpYWJsZXMgZnJvbSBnZXR0aW5nIHVubWFw cGVkIGFuZCB0aGVpciBhc3NvY2lhdGVkCi0JIGRldmljZSBzdG9yYWdlIGZy ZWVkKSwgc28gY2FsbCBpdCBoZXJlLiAgKi8KLSAgICAgIGV2ZW50X2djICh0 cnVlKTsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgZWxzZSBpZiAociA9 PSBDVURBX0VSUk9SX05PVF9SRUFEWSkKLSAgICByZXR1cm4gMDsKLQotICBH T01QX1BMVUdJTl9mYXRhbCAoImN1U3RyZWFtUXVlcnkgZXJyb3I6ICVzIiwg Y3VkYV9lcnJvciAocikpOwotCi0gIHJldHVybiAwOwotfQotCi1zdGF0aWMg aW50Ci1udnB0eF9hc3luY190ZXN0X2FsbCAodm9pZCkKLXsKLSAgc3RydWN0 IHB0eF9zdHJlYW0gKnM7Ci0gIHB0aHJlYWRfdCBzZWxmID0gcHRocmVhZF9z ZWxmICgpOwotICBzdHJ1Y3QgbnZwdHhfdGhyZWFkICpudnRoZCA9IG52cHR4 X3RocmVhZCAoKTsKLQotICBwdGhyZWFkX211dGV4X2xvY2sgKCZudnRoZC0+ cHR4X2Rldi0+c3RyZWFtX2xvY2spOwotCi0gIGZvciAocyA9IG52dGhkLT5w dHhfZGV2LT5hY3RpdmVfc3RyZWFtczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4 dCkKLSAgICB7Ci0gICAgICBpZiAoKHMtPm11bHRpdGhyZWFkZWQgfHwgcHRo cmVhZF9lcXVhbCAocy0+aG9zdF90aHJlYWQsIHNlbGYpKQotCSAgJiYgQ1VE QV9DQUxMX05PQ0hFQ0sgKGN1U3RyZWFtUXVlcnksCi0JCQkJcy0+c3RyZWFt KSA9PSBDVURBX0VSUk9SX05PVF9SRUFEWSkKLQl7Ci0JICBwdGhyZWFkX211 dGV4X3VubG9jayAoJm52dGhkLT5wdHhfZGV2LT5zdHJlYW1fbG9jayk7Ci0J ICByZXR1cm4gMDsKLQl9Ci0gICAgfQotCi0gIHB0aHJlYWRfbXV0ZXhfdW5s b2NrICgmbnZ0aGQtPnB0eF9kZXYtPnN0cmVhbV9sb2NrKTsKLQotICBldmVu dF9nYyAodHJ1ZSk7Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB2b2lk Ci1udnB0eF93YWl0IChpbnQgYXN5bmMpCi17Ci0gIHN0cnVjdCBwdHhfc3Ry ZWFtICpzOwotCi0gIHMgPSBzZWxlY3Rfc3RyZWFtX2Zvcl9hc3luYyAoYXN5 bmMsIHB0aHJlYWRfc2VsZiAoKSwgZmFsc2UsIE5VTEwpOwotICBpZiAoIXMp Ci0gICAgR09NUF9QTFVHSU5fZmF0YWwgKCJ1bmtub3duIGFzeW5jICVkIiwg YXN5bmMpOwotCi0gIENVREFfQ0FMTF9BU1NFUlQgKGN1U3RyZWFtU3luY2hy b25pemUsIHMtPnN0cmVhbSk7Ci0KLSAgZXZlbnRfZ2MgKHRydWUpOwotfQot Ci1zdGF0aWMgdm9pZAotbnZwdHhfd2FpdF9hc3luYyAoaW50IGFzeW5jMSwg aW50IGFzeW5jMikKLXsKLSAgQ1VldmVudCAqZTsKLSAgc3RydWN0IHB0eF9z dHJlYW0gKnMxLCAqczI7Ci0gIHB0aHJlYWRfdCBzZWxmID0gcHRocmVhZF9z ZWxmICgpOwotCi0gIC8qIFRoZSBzdHJlYW0gdGhhdCBpcyB3YWl0aW5nIChy YXRoZXIgdGhhbiBiZWluZyB3YWl0ZWQgZm9yKSBkb2Vzbid0Ci0gICAgIG5l Y2Vzc2FyaWx5IGhhdmUgdG8gZXhpc3QgYWxyZWFkeS4gICovCi0gIHMyID0g c2VsZWN0X3N0cmVhbV9mb3JfYXN5bmMgKGFzeW5jMiwgc2VsZiwgdHJ1ZSwg TlVMTCk7Ci0KLSAgczEgPSBzZWxlY3Rfc3RyZWFtX2Zvcl9hc3luYyAoYXN5 bmMxLCBzZWxmLCBmYWxzZSwgTlVMTCk7Ci0gIGlmICghczEpCi0gICAgR09N UF9QTFVHSU5fZmF0YWwgKCJpbnZhbGlkIGFzeW5jIDFcbiIpOwotCi0gIGlm IChzMSA9PSBzMikKLSAgICBHT01QX1BMVUdJTl9mYXRhbCAoImlkZW50aWNh bCBwYXJhbWV0ZXJzIik7Ci0KLSAgZSA9IChDVWV2ZW50ICopIEdPTVBfUExV R0lOX21hbGxvYyAoc2l6ZW9mIChDVWV2ZW50KSk7Ci0KLSAgQ1VEQV9DQUxM X0FTU0VSVCAoY3VFdmVudENyZWF0ZSwgZSwgQ1VfRVZFTlRfRElTQUJMRV9U SU1JTkcpOwotCi0gIGV2ZW50X2djICh0cnVlKTsKLQotICBDVURBX0NBTExf QVNTRVJUIChjdUV2ZW50UmVjb3JkLCAqZSwgczEtPnN0cmVhbSk7Ci0KLSAg ZXZlbnRfYWRkIChQVFhfRVZUX1NZTkMsIGUsIE5VTEwsIDApOwotCi0gIENV REFfQ0FMTF9BU1NFUlQgKGN1U3RyZWFtV2FpdEV2ZW50LCBzMi0+c3RyZWFt LCAqZSwgMCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1udnB0eF93YWl0X2FsbCAo dm9pZCkKLXsKLSAgQ1VyZXN1bHQgcjsKLSAgc3RydWN0IHB0eF9zdHJlYW0g KnM7Ci0gIHB0aHJlYWRfdCBzZWxmID0gcHRocmVhZF9zZWxmICgpOwotICBz dHJ1Y3QgbnZwdHhfdGhyZWFkICpudnRoZCA9IG52cHR4X3RocmVhZCAoKTsK LQotICBwdGhyZWFkX211dGV4X2xvY2sgKCZudnRoZC0+cHR4X2Rldi0+c3Ry ZWFtX2xvY2spOwotCi0gIC8qIFdhaXQgZm9yIGFjdGl2ZSBzdHJlYW1zIGlu aXRpYXRlZCBieSB0aGlzIHRocmVhZCAob3IgYnkgbXVsdGlwbGUgdGhyZWFk cykKLSAgICAgdG8gY29tcGxldGUuICAqLwotICBmb3IgKHMgPSBudnRoZC0+ cHR4X2Rldi0+YWN0aXZlX3N0cmVhbXM7IHMgIT0gTlVMTDsgcyA9IHMtPm5l eHQpCi0gICAgewotICAgICAgaWYgKHMtPm11bHRpdGhyZWFkZWQgfHwgcHRo cmVhZF9lcXVhbCAocy0+aG9zdF90aHJlYWQsIHNlbGYpKQotCXsKLQkgIHIg PSBDVURBX0NBTExfTk9DSEVDSyAoY3VTdHJlYW1RdWVyeSwgcy0+c3RyZWFt KTsKLQkgIGlmIChyID09IENVREFfU1VDQ0VTUykKLQkgICAgY29udGludWU7 Ci0JICBlbHNlIGlmIChyICE9IENVREFfRVJST1JfTk9UX1JFQURZKQotCSAg ICBHT01QX1BMVUdJTl9mYXRhbCAoImN1U3RyZWFtUXVlcnkgZXJyb3I6ICVz IiwgY3VkYV9lcnJvciAocikpOwotCi0JICBDVURBX0NBTExfQVNTRVJUIChj dVN0cmVhbVN5bmNocm9uaXplLCBzLT5zdHJlYW0pOwotCX0KLSAgICB9Ci0K LSAgcHRocmVhZF9tdXRleF91bmxvY2sgKCZudnRoZC0+cHR4X2Rldi0+c3Ry ZWFtX2xvY2spOwotCi0gIGV2ZW50X2djICh0cnVlKTsKLX0KLQotc3RhdGlj IHZvaWQKLW52cHR4X3dhaXRfYWxsX2FzeW5jIChpbnQgYXN5bmMpCi17Ci0g IHN0cnVjdCBwdHhfc3RyZWFtICp3YWl0aW5nX3N0cmVhbSwgKm90aGVyX3N0 cmVhbTsKLSAgQ1VldmVudCAqZTsKLSAgc3RydWN0IG52cHR4X3RocmVhZCAq bnZ0aGQgPSBudnB0eF90aHJlYWQgKCk7Ci0gIHB0aHJlYWRfdCBzZWxmID0g cHRocmVhZF9zZWxmICgpOwotCi0gIC8qIFRoZSBzdHJlYW0gZG9pbmcgdGhl IHdhaXRpbmcuICBUaGlzIGNvdWxkIGJlIHRoZSBmaXJzdCBtZW50aW9uIG9m IHRoZQotICAgICBzdHJlYW0sIHNvIGNyZWF0ZSBpdCBpZiBuZWNlc3Nhcnku ICAqLwotICB3YWl0aW5nX3N0cmVhbQotICAgID0gc2VsZWN0X3N0cmVhbV9m b3JfYXN5bmMgKGFzeW5jLCBwdGhyZWFkX3NlbGYgKCksIHRydWUsIE5VTEwp OwotCi0gIC8qIExhdW5jaGVzIG9uIHRoZSBudWxsIHN0cmVhbSBhbHJlYWR5 IGJsb2NrIG9uIG90aGVyIHN0cmVhbXMgaW4gdGhlCi0gICAgIGNvbnRleHQu ICAqLwotICBpZiAoIXdhaXRpbmdfc3RyZWFtIHx8IHdhaXRpbmdfc3RyZWFt ID09IG52dGhkLT5wdHhfZGV2LT5udWxsX3N0cmVhbSkKLSAgICByZXR1cm47 Ci0KLSAgZXZlbnRfZ2MgKHRydWUpOwotCi0gIHB0aHJlYWRfbXV0ZXhfbG9j ayAoJm52dGhkLT5wdHhfZGV2LT5zdHJlYW1fbG9jayk7Ci0KLSAgZm9yIChv dGhlcl9zdHJlYW0gPSBudnRoZC0+cHR4X2Rldi0+YWN0aXZlX3N0cmVhbXM7 Ci0gICAgICAgb3RoZXJfc3RyZWFtICE9IE5VTEw7Ci0gICAgICAgb3RoZXJf c3RyZWFtID0gb3RoZXJfc3RyZWFtLT5uZXh0KQotICAgIHsKLSAgICAgIGlm ICghb3RoZXJfc3RyZWFtLT5tdWx0aXRocmVhZGVkCi0JICAmJiAhcHRocmVh ZF9lcXVhbCAob3RoZXJfc3RyZWFtLT5ob3N0X3RocmVhZCwgc2VsZikpCi0J Y29udGludWU7Ci0KLSAgICAgIGUgPSAoQ1VldmVudCAqKSBHT01QX1BMVUdJ Tl9tYWxsb2MgKHNpemVvZiAoQ1VldmVudCkpOwotCi0gICAgICBDVURBX0NB TExfQVNTRVJUIChjdUV2ZW50Q3JlYXRlLCBlLCBDVV9FVkVOVF9ESVNBQkxF X1RJTUlORyk7Ci0KLSAgICAgIC8qIFJlY29yZCBhbiBldmVudCBvbiB0aGUg d2FpdGVkLWZvciBzdHJlYW0uICAqLwotICAgICAgQ1VEQV9DQUxMX0FTU0VS VCAoY3VFdmVudFJlY29yZCwgKmUsIG90aGVyX3N0cmVhbS0+c3RyZWFtKTsK LQotICAgICAgZXZlbnRfYWRkIChQVFhfRVZUX1NZTkMsIGUsIE5VTEwsIDAp OwotCi0gICAgICBDVURBX0NBTExfQVNTRVJUIChjdVN0cmVhbVdhaXRFdmVu dCwgd2FpdGluZ19zdHJlYW0tPnN0cmVhbSwgKmUsIDApOwotICAgfQotCi0g IHB0aHJlYWRfbXV0ZXhfdW5sb2NrICgmbnZ0aGQtPnB0eF9kZXYtPnN0cmVh bV9sb2NrKTsKLX0KLQotc3RhdGljIHZvaWQgKgotbnZwdHhfZ2V0X2N1cnJl bnRfY3VkYV9kZXZpY2UgKHZvaWQpCi17Ci0gIHN0cnVjdCBudnB0eF90aHJl YWQgKm52dGhkID0gbnZwdHhfdGhyZWFkICgpOwotCi0gIGlmICghbnZ0aGQg fHwgIW52dGhkLT5wdHhfZGV2KQotICAgIHJldHVybiBOVUxMOwotCi0gIHJl dHVybiAmbnZ0aGQtPnB0eF9kZXYtPmRldjsKLX0KLQotc3RhdGljIHZvaWQg KgotbnZwdHhfZ2V0X2N1cnJlbnRfY3VkYV9jb250ZXh0ICh2b2lkKQotewot ICBzdHJ1Y3QgbnZwdHhfdGhyZWFkICpudnRoZCA9IG52cHR4X3RocmVhZCAo KTsKLQotICBpZiAoIW52dGhkIHx8ICFudnRoZC0+cHR4X2RldikKLSAgICBy ZXR1cm4gTlVMTDsKLQotICByZXR1cm4gbnZ0aGQtPnB0eF9kZXYtPmN0eDsK LX0KLQotc3RhdGljIHZvaWQgKgotbnZwdHhfZ2V0X2N1ZGFfc3RyZWFtIChp bnQgYXN5bmMpCi17Ci0gIHN0cnVjdCBwdHhfc3RyZWFtICpzOwotICBzdHJ1 Y3QgbnZwdHhfdGhyZWFkICpudnRoZCA9IG52cHR4X3RocmVhZCAoKTsKLQot ICBpZiAoIW52dGhkIHx8ICFudnRoZC0+cHR4X2RldikKLSAgICByZXR1cm4g TlVMTDsKLQotICBzID0gc2VsZWN0X3N0cmVhbV9mb3JfYXN5bmMgKGFzeW5j LCBwdGhyZWFkX3NlbGYgKCksIGZhbHNlLCBOVUxMKTsKLQotICByZXR1cm4g cyA/IHMtPnN0cmVhbSA6IE5VTEw7Ci19Ci0KLXN0YXRpYyBpbnQKLW52cHR4 X3NldF9jdWRhX3N0cmVhbSAoaW50IGFzeW5jLCB2b2lkICpzdHJlYW0pCi17 Ci0gIHN0cnVjdCBwdHhfc3RyZWFtICpvbGRzdHJlYW07Ci0gIHB0aHJlYWRf dCBzZWxmID0gcHRocmVhZF9zZWxmICgpOwotICBzdHJ1Y3QgbnZwdHhfdGhy ZWFkICpudnRoZCA9IG52cHR4X3RocmVhZCAoKTsKLQotICBpZiAoYXN5bmMg PCAwKQotICAgIEdPTVBfUExVR0lOX2ZhdGFsICgiYmFkIGFzeW5jICVkIiwg YXN5bmMpOwotCi0gIHB0aHJlYWRfbXV0ZXhfbG9jayAoJm52dGhkLT5wdHhf ZGV2LT5zdHJlYW1fbG9jayk7Ci0KLSAgLyogV2UgaGF2ZSBhIGxpc3Qgb2Yg YWN0aXZlIHN0cmVhbXMgYW5kIGFuIGFycmF5IG1hcHBpbmcgYXN5bmMgdmFs dWVzIHRvCi0gICAgIGVudHJpZXMgb2YgdGhhdCBsaXN0LiAgV2UgbmVlZCB0 byB0YWtlICJvd25lcnNoaXAiIG9mIHRoZSBwYXNzZWQtaW4gc3RyZWFtLAot ICAgICBhbmQgYWRkIGl0IHRvIG91ciBsaXN0LCByZW1vdmluZyB0aGUgcHJl dmlvdXMgZW50cnkgYWxzbyAoaWYgdGhlcmUgd2FzIG9uZSkKLSAgICAgaW4g b3JkZXIgdG8gcHJldmVudCByZXNvdXJjZSBsZWFrcy4gIE5vdGUgdGhlIHBv dGVudGlhbCBmb3Igc3VycHJpc2UKLSAgICAgaGVyZTogbWF5YmUgd2Ugc2hv dWxkIGtlZXAgdHJhY2sgb2YgcGFzc2VkLWluIHN0cmVhbXMgYW5kIGxlYXZl IGl0IHVwIHRvCi0gICAgIHRoZSB1c2VyIHRvIHRpZHkgdGhvc2UgdXAsIGJ1 dCB0aGF0IGRvZXNuJ3Qgd29yayBmb3Igc3RyZWFtIGhhbmRsZXMKLSAgICAg cmV0dXJuZWQgZnJvbSBhY2NfZ2V0X2N1ZGFfc3RyZWFtIGFib3ZlLi4uICAq LwotCi0gIG9sZHN0cmVhbSA9IHNlbGVjdF9zdHJlYW1fZm9yX2FzeW5jIChh c3luYywgc2VsZiwgZmFsc2UsIE5VTEwpOwotCi0gIGlmIChvbGRzdHJlYW0p Ci0gICAgewotICAgICAgaWYgKG52dGhkLT5wdHhfZGV2LT5hY3RpdmVfc3Ry ZWFtcyA9PSBvbGRzdHJlYW0pCi0JbnZ0aGQtPnB0eF9kZXYtPmFjdGl2ZV9z dHJlYW1zID0gbnZ0aGQtPnB0eF9kZXYtPmFjdGl2ZV9zdHJlYW1zLT5uZXh0 OwotICAgICAgZWxzZQotCXsKLQkgIHN0cnVjdCBwdHhfc3RyZWFtICpzID0g bnZ0aGQtPnB0eF9kZXYtPmFjdGl2ZV9zdHJlYW1zOwotCSAgd2hpbGUgKHMt Pm5leHQgIT0gb2xkc3RyZWFtKQotCSAgICBzID0gcy0+bmV4dDsKLQkgIHMt Pm5leHQgPSBzLT5uZXh0LT5uZXh0OwotCX0KLQotICAgICAgQ1VEQV9DQUxM X0FTU0VSVCAoY3VTdHJlYW1EZXN0cm95LCBvbGRzdHJlYW0tPnN0cmVhbSk7 Ci0KLSAgICAgIGlmICghbWFwX2ZpbmkgKG9sZHN0cmVhbSkpCi0JR09NUF9Q TFVHSU5fZmF0YWwgKCJlcnJvciB3aGVuIGZyZWVpbmcgaG9zdCBtZW1vcnki KTsKLQotICAgICAgZnJlZSAob2xkc3RyZWFtKTsKLSAgICB9Ci0KLSAgcHRo cmVhZF9tdXRleF91bmxvY2sgKCZudnRoZC0+cHR4X2Rldi0+c3RyZWFtX2xv Y2spOwotCi0gICh2b2lkKSBzZWxlY3Rfc3RyZWFtX2Zvcl9hc3luYyAoYXN5 bmMsIHNlbGYsIHRydWUsIChDVXN0cmVhbSkgc3RyZWFtKTsKLQotICByZXR1 cm4gMTsKLX0KKyAgcmV0dXJuIG52dGhkLT5wdHhfZGV2LT5jdHg7Cit9CiAK IC8qIFBsdWdpbiBlbnRyeSBwb2ludHMuICAqLwogCkBAIC0yMDE2LDEwMCAr MTE4NSwxMTYgQEAgR09NUF9PRkZMT0FEX2FsbG9jIChpbnQgb3JkLCBzaXpl X3Qgc2l6ZSkKIHsKICAgaWYgKCFudnB0eF9hdHRhY2hfaG9zdF90aHJlYWRf dG9fZGV2aWNlIChvcmQpKQogICAgIHJldHVybiBOVUxMOwotICByZXR1cm4g bnZwdHhfYWxsb2MgKHNpemUpOwotfQogCi1ib29sCi1HT01QX09GRkxPQURf ZnJlZSAoaW50IG9yZCwgdm9pZCAqcHRyKQotewotICByZXR1cm4gKG52cHR4 X2F0dGFjaF9ob3N0X3RocmVhZF90b19kZXZpY2UgKG9yZCkKLQkgICYmIG52 cHR4X2ZyZWUgKHB0cikpOwotfQorICBzdHJ1Y3QgcHR4X2RldmljZSAqcHR4 X2RldiA9IHB0eF9kZXZpY2VzW29yZF07CisgIHN0cnVjdCBwdHhfZnJlZV9i bG9jayAqYmxvY2tzLCAqdG1wOwogCi1ib29sCi1HT01QX09GRkxPQURfZGV2 Mmhvc3QgKGludCBvcmQsIHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCBz aXplX3QgbikKLXsKLSAgcmV0dXJuIChudnB0eF9hdHRhY2hfaG9zdF90aHJl YWRfdG9fZGV2aWNlIChvcmQpCi0JICAmJiBudnB0eF9kZXYyaG9zdCAoZHN0 LCBzcmMsIG4pKTsKLX0KKyAgcHRocmVhZF9tdXRleF9sb2NrICgmcHR4X2Rl di0+ZnJlZV9ibG9ja3NfbG9jayk7CisgIGJsb2NrcyA9IHB0eF9kZXYtPmZy ZWVfYmxvY2tzOworICBwdHhfZGV2LT5mcmVlX2Jsb2NrcyA9IE5VTEw7Cisg IHB0aHJlYWRfbXV0ZXhfdW5sb2NrICgmcHR4X2Rldi0+ZnJlZV9ibG9ja3Nf bG9jayk7CiAKLWJvb2wKLUdPTVBfT0ZGTE9BRF9ob3N0MmRldiAoaW50IG9y ZCwgdm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBuKQotewot ICByZXR1cm4gKG52cHR4X2F0dGFjaF9ob3N0X3RocmVhZF90b19kZXZpY2Ug KG9yZCkKLQkgICYmIG52cHR4X2hvc3QyZGV2IChkc3QsIHNyYywgbikpOwor ICB3aGlsZSAoYmxvY2tzKQorICAgIHsKKyAgICAgIHRtcCA9IGJsb2Nrcy0+ bmV4dDsKKyAgICAgIG52cHR4X2ZyZWUgKGJsb2Nrcy0+cHRyLCBwdHhfZGV2 KTsKKyAgICAgIGZyZWUgKGJsb2Nrcyk7CisgICAgICBibG9ja3MgPSB0bXA7 CisgICAgfQorCisgIHJldHVybiBudnB0eF9hbGxvYyAoc2l6ZSk7CiB9CiAK IGJvb2wKLUdPTVBfT0ZGTE9BRF9kZXYyZGV2IChpbnQgb3JkLCB2b2lkICpk c3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IG4pCitHT01QX09GRkxPQURf ZnJlZSAoaW50IG9yZCwgdm9pZCAqcHRyKQogewotICBzdHJ1Y3QgcHR4X2Rl dmljZSAqcHR4X2RldiA9IHB0eF9kZXZpY2VzW29yZF07Ci0gIENVREFfQ0FM TCAoY3VNZW1jcHlEdG9EQXN5bmMsIChDVWRldmljZXB0cikgZHN0LCAoQ1Vk ZXZpY2VwdHIpIHNyYywgbiwKLQkJCQlwdHhfZGV2LT5udWxsX3N0cmVhbS0+ c3RyZWFtKTsKLSAgcmV0dXJuIHRydWU7CisgIHJldHVybiAobnZwdHhfYXR0 YWNoX2hvc3RfdGhyZWFkX3RvX2RldmljZSAob3JkKQorCSAgJiYgbnZwdHhf ZnJlZSAocHRyLCBwdHhfZGV2aWNlc1tvcmRdKSk7CiB9CiAKLXZvaWQgKCpk ZXZpY2VfcnVuKSAoaW50IG4sIHZvaWQgKmZuX3B0ciwgdm9pZCAqdmFycykg PSBOVUxMOwotCiB2b2lkCiBHT01QX09GRkxPQURfb3BlbmFjY19leGVjICh2 b2lkICgqZm4pICh2b2lkICopLCBzaXplX3QgbWFwbnVtLAogCQkJICAgdm9p ZCAqKmhvc3RhZGRycywgdm9pZCAqKmRldmFkZHJzLAotCQkJICAgaW50IGFz eW5jLCB1bnNpZ25lZCAqZGltcywgdm9pZCAqdGFyZ19tZW1fZGVzYykKKwkJ CSAgIHVuc2lnbmVkICpkaW1zLCB2b2lkICp0YXJnX21lbV9kZXNjKQogewot ICBudnB0eF9leGVjIChmbiwgbWFwbnVtLCBob3N0YWRkcnMsIGRldmFkZHJz LCBhc3luYywgZGltcywgdGFyZ19tZW1fZGVzYyk7Ci19CisgIEdPTVBfUExV R0lOX2RlYnVnICgwLCAiICAlczogcHJlcGFyZSBtYXBwaW5nc1xuIiwgX19G VU5DVElPTl9fKTsKIAotdm9pZAotR09NUF9PRkZMT0FEX29wZW5hY2NfcmVn aXN0ZXJfYXN5bmNfY2xlYW51cCAodm9pZCAqdGFyZ19tZW1fZGVzYywgaW50 IGFzeW5jKQotewotICBzdHJ1Y3QgbnZwdHhfdGhyZWFkICpudnRoZCA9IG52 cHR4X3RocmVhZCAoKTsKLSAgQ1VldmVudCAqZSA9IChDVWV2ZW50ICopIEdP TVBfUExVR0lOX21hbGxvYyAoc2l6ZW9mIChDVWV2ZW50KSk7CisgIHZvaWQg KipocCA9IE5VTEw7CisgIENVZGV2aWNlcHRyIGRwID0gMDsKIAotICBDVURB X0NBTExfQVNTRVJUIChjdUV2ZW50Q3JlYXRlLCBlLCBDVV9FVkVOVF9ESVNB QkxFX1RJTUlORyk7Ci0gIENVREFfQ0FMTF9BU1NFUlQgKGN1RXZlbnRSZWNv cmQsICplLCBudnRoZC0+Y3VycmVudF9zdHJlYW0tPnN0cmVhbSk7Ci0gIGV2 ZW50X2FkZCAoUFRYX0VWVF9BU1lOQ19DTEVBTlVQLCBlLCB0YXJnX21lbV9k ZXNjLCBhc3luYyk7Ci19CisgIGlmIChtYXBudW0gPiAwKQorICAgIHsKKyAg ICAgIGhwID0gYWxsb2NhIChtYXBudW0gKiBzaXplb2YgKHZvaWQgKikpOwor ICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXBudW07IGkrKykKKwlocFtp XSA9IChkZXZhZGRyc1tpXSA/IGRldmFkZHJzW2ldIDogaG9zdGFkZHJzW2ld KTsKKyAgICAgIENVREFfQ0FMTF9BU1NFUlQgKGN1TWVtQWxsb2MsICZkcCwg bWFwbnVtICogc2l6ZW9mICh2b2lkICopKTsKKyAgICB9CiAKLWludAotR09N UF9PRkZMT0FEX29wZW5hY2NfYXN5bmNfdGVzdCAoaW50IGFzeW5jKQotewot ICByZXR1cm4gbnZwdHhfYXN5bmNfdGVzdCAoYXN5bmMpOwotfQorICAvKiBD b3B5IHRoZSAoZGV2aWNlKSBwb2ludGVycyB0byBhcmd1bWVudHMgdG8gdGhl IGRldmljZSAoZHAgYW5kIGhwIG1pZ2h0IGluCisgICAgIGZhY3QgaGF2ZSB0 aGUgc2FtZSB2YWx1ZSBvbiBhIHVuaWZpZWQtbWVtb3J5IHN5c3RlbSkuICAq LworICBpZiAobWFwbnVtID4gMCkKKyAgICBDVURBX0NBTExfQVNTRVJUIChj dU1lbWNweUh0b0QsIGRwLCAodm9pZCAqKSBocCwKKwkJICAgICAgbWFwbnVt ICogc2l6ZW9mICh2b2lkICopKTsKIAotaW50Ci1HT01QX09GRkxPQURfb3Bl bmFjY19hc3luY190ZXN0X2FsbCAodm9pZCkKLXsKLSAgcmV0dXJuIG52cHR4 X2FzeW5jX3Rlc3RfYWxsICgpOwotfQorICBudnB0eF9leGVjIChmbiwgbWFw bnVtLCBob3N0YWRkcnMsIGRldmFkZHJzLCBkaW1zLCB0YXJnX21lbV9kZXNj LAorCSAgICAgIGRwLCBOVUxMKTsKIAotdm9pZAotR09NUF9PRkZMT0FEX29w ZW5hY2NfYXN5bmNfd2FpdCAoaW50IGFzeW5jKQotewotICBudnB0eF93YWl0 IChhc3luYyk7CisgIENVcmVzdWx0IHIgPSBDVURBX0NBTExfTk9DSEVDSyAo Y3VTdHJlYW1TeW5jaHJvbml6ZSwgTlVMTCk7CisgIGNvbnN0IGNoYXIgKm1h eWJlX2Fib3J0X21zZyA9ICIocGVyaGFwcyBhYm9ydCB3YXMgY2FsbGVkKSI7 CisgIGlmIChyID09IENVREFfRVJST1JfTEFVTkNIX0ZBSUxFRCkKKyAgICBH T01QX1BMVUdJTl9mYXRhbCAoImN1U3RyZWFtU3luY2hyb25pemUgZXJyb3I6 ICVzICVzXG4iLCBjdWRhX2Vycm9yIChyKSwKKwkJICAgICAgIG1heWJlX2Fi b3J0X21zZyk7CisgIGVsc2UgaWYgKHIgIT0gQ1VEQV9TVUNDRVNTKQorICAg IEdPTVBfUExVR0lOX2ZhdGFsICgiY3VTdHJlYW1TeW5jaHJvbml6ZSBlcnJv cjogJXMiLCBjdWRhX2Vycm9yIChyKSk7CisgIENVREFfQ0FMTF9BU1NFUlQg KGN1TWVtRnJlZSwgZHApOwogfQogCi12b2lkCi1HT01QX09GRkxPQURfb3Bl bmFjY19hc3luY193YWl0X2FzeW5jIChpbnQgYXN5bmMxLCBpbnQgYXN5bmMy KQorc3RhdGljIHZvaWQKK2N1ZGFfZnJlZV9hcmdtZW0gKHZvaWQgKnB0cikK IHsKLSAgbnZwdHhfd2FpdF9hc3luYyAoYXN5bmMxLCBhc3luYzIpOworICB2 b2lkICoqYmxvY2sgPSAodm9pZCAqKikgcHRyOworICBudnB0eF9mcmVlIChi bG9ja1swXSwgKHN0cnVjdCBwdHhfZGV2aWNlICopIGJsb2NrWzFdKTsKKyAg ZnJlZSAoYmxvY2spOwogfQogCiB2b2lkCi1HT01QX09GRkxPQURfb3BlbmFj Y19hc3luY193YWl0X2FsbCAodm9pZCkKK0dPTVBfT0ZGTE9BRF9vcGVuYWNj X2FzeW5jX2V4ZWMgKHZvaWQgKCpmbikgKHZvaWQgKiksIHNpemVfdCBtYXBu dW0sCisJCQkJIHZvaWQgKipob3N0YWRkcnMsIHZvaWQgKipkZXZhZGRycywK KwkJCQkgdW5zaWduZWQgKmRpbXMsIHZvaWQgKnRhcmdfbWVtX2Rlc2MsCisJ CQkJIHN0cnVjdCBnb2FjY19hc3luY3F1ZXVlICphcSkKIHsKLSAgbnZwdHhf d2FpdF9hbGwgKCk7Ci19CisgIEdPTVBfUExVR0lOX2RlYnVnICgwLCAiICAl czogcHJlcGFyZSBtYXBwaW5nc1xuIiwgX19GVU5DVElPTl9fKTsKIAotdm9p ZAotR09NUF9PRkZMT0FEX29wZW5hY2NfYXN5bmNfd2FpdF9hbGxfYXN5bmMg KGludCBhc3luYykKLXsKLSAgbnZwdHhfd2FpdF9hbGxfYXN5bmMgKGFzeW5j KTsKLX0KKyAgdm9pZCAqKmhwID0gTlVMTDsKKyAgQ1VkZXZpY2VwdHIgZHAg PSAwOworICB2b2lkICoqYmxvY2sgPSBOVUxMOwogCi12b2lkCi1HT01QX09G RkxPQURfb3BlbmFjY19hc3luY19zZXRfYXN5bmMgKGludCBhc3luYykKLXsK LSAgbnZwdHhfc2V0X2FzeW5jIChhc3luYyk7CisgIGlmIChtYXBudW0gPiAw KQorICAgIHsKKyAgICAgIGJsb2NrID0gKHZvaWQgKiopIEdPTVBfUExVR0lO X21hbGxvYyAoKG1hcG51bSArIDIpICogc2l6ZW9mICh2b2lkICopKTsKKyAg ICAgIGhwID0gYmxvY2sgKyAyOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkg PCBtYXBudW07IGkrKykKKwlocFtpXSA9IChkZXZhZGRyc1tpXSA/IGRldmFk ZHJzW2ldIDogaG9zdGFkZHJzW2ldKTsKKyAgICAgIENVREFfQ0FMTF9BU1NF UlQgKGN1TWVtQWxsb2MsICZkcCwgbWFwbnVtICogc2l6ZW9mICh2b2lkICop KTsKKyAgICB9CisKKyAgLyogQ29weSB0aGUgKGRldmljZSkgcG9pbnRlcnMg dG8gYXJndW1lbnRzIHRvIHRoZSBkZXZpY2UgKGRwIGFuZCBocCBtaWdodCBp bgorICAgICBmYWN0IGhhdmUgdGhlIHNhbWUgdmFsdWUgb24gYSB1bmlmaWVk LW1lbW9yeSBzeXN0ZW0pLiAgKi8KKyAgaWYgKG1hcG51bSA+IDApCisgICAg eworICAgICAgQ1VEQV9DQUxMX0FTU0VSVCAoY3VNZW1jcHlIdG9EQXN5bmMs IGRwLCAodm9pZCAqKSBocCwKKwkJCW1hcG51bSAqIHNpemVvZiAodm9pZCAq KSwgYXEtPmN1ZGFfc3RyZWFtKTsKKyAgICAgIGJsb2NrWzBdID0gKHZvaWQg KikgZHA7CisKKyAgICAgIHN0cnVjdCBudnB0eF90aHJlYWQgKm52dGhkID0K Kwkoc3RydWN0IG52cHR4X3RocmVhZCAqKSBHT01QX1BMVUdJTl9hY2NfdGhy ZWFkICgpOworICAgICAgYmxvY2tbMV0gPSAodm9pZCAqKSBudnRoZC0+cHR4 X2RldjsKKyAgICB9CisgIG52cHR4X2V4ZWMgKGZuLCBtYXBudW0sIGhvc3Rh ZGRycywgZGV2YWRkcnMsIGRpbXMsIHRhcmdfbWVtX2Rlc2MsCisJICAgICAg ZHAsIGFxLT5jdWRhX3N0cmVhbSk7CisKKyAgaWYgKG1hcG51bSA+IDApCisg ICAgR09NUF9PRkZMT0FEX29wZW5hY2NfYXN5bmNfcXVldWVfY2FsbGJhY2sg KGFxLCBjdWRhX2ZyZWVfYXJnbWVtLCBibG9jayk7CiB9CiAKIHZvaWQgKgpA QCAtMjEzMSw3ICsxMzE2LDYgQEAgR09NUF9PRkZMT0FEX29wZW5hY2NfY3Jl YXRlX3RocmVhZF9kYXRhIChpbnQgb3JkKQogICBpZiAoIXRoZF9jdHgpCiAg ICAgQ1VEQV9DQUxMX0FTU0VSVCAoY3VDdHhQdXNoQ3VycmVudCwgcHR4X2Rl di0+Y3R4KTsKIAotICBudnRoZC0+Y3VycmVudF9zdHJlYW0gPSBwdHhfZGV2 LT5udWxsX3N0cmVhbTsKICAgbnZ0aGQtPnB0eF9kZXYgPSBwdHhfZGV2Owog CiAgIHJldHVybiAodm9pZCAqKSBudnRoZDsKQEAgLTIxNTYsMTkgKzEzNDAs MTg1IEBAIEdPTVBfT0ZGTE9BRF9vcGVuYWNjX2N1ZGFfZ2V0X2N1cnJlbnRf Y29udGV4dCAodm9pZCkKIH0KIAogLyogTk9URTogVGhpcyByZXR1cm5zIGEg Q1VzdHJlYW0sIG5vdCBhIHB0eF9zdHJlYW0gcG9pbnRlci4gICovCi0KIHZv aWQgKgotR09NUF9PRkZMT0FEX29wZW5hY2NfY3VkYV9nZXRfc3RyZWFtIChp bnQgYXN5bmMpCitHT01QX09GRkxPQURfb3BlbmFjY19jdWRhX2dldF9zdHJl YW0gKHN0cnVjdCBnb2FjY19hc3luY3F1ZXVlICphcSkKIHsKLSAgcmV0dXJu IG52cHR4X2dldF9jdWRhX3N0cmVhbSAoYXN5bmMpOworICByZXR1cm4gKHZv aWQgKikgYXEtPmN1ZGFfc3RyZWFtOwogfQogCiAvKiBOT1RFOiBUaGlzIHRh a2VzIGEgQ1VzdHJlYW0sIG5vdCBhIHB0eF9zdHJlYW0gcG9pbnRlci4gICov CitpbnQKK0dPTVBfT0ZGTE9BRF9vcGVuYWNjX2N1ZGFfc2V0X3N0cmVhbSAo c3RydWN0IGdvYWNjX2FzeW5jcXVldWUgKmFxLCB2b2lkICpzdHJlYW0pCit7 CisgIGlmIChhcS0+Y3VkYV9zdHJlYW0pCisgICAgeworICAgICAgQ1VEQV9D QUxMX0FTU0VSVCAoY3VTdHJlYW1TeW5jaHJvbml6ZSwgYXEtPmN1ZGFfc3Ry ZWFtKTsKKyAgICAgIENVREFfQ0FMTF9BU1NFUlQgKGN1U3RyZWFtRGVzdHJv eSwgYXEtPmN1ZGFfc3RyZWFtKTsKKyAgICB9CisKKyAgYXEtPmN1ZGFfc3Ry ZWFtID0gKENVc3RyZWFtKSBzdHJlYW07CisgIHJldHVybiAxOworfQorCitz dHJ1Y3QgZ29hY2NfYXN5bmNxdWV1ZSAqCitHT01QX09GRkxPQURfb3BlbmFj Y19hc3luY19jb25zdHJ1Y3QgKHZvaWQpCit7CisgIHN0cnVjdCBnb2FjY19h c3luY3F1ZXVlICphcQorICAgID0gR09NUF9QTFVHSU5fbWFsbG9jIChzaXpl b2YgKHN0cnVjdCBnb2FjY19hc3luY3F1ZXVlKSk7CisgIGFxLT5jdWRhX3N0 cmVhbSA9IE5VTEw7CisgIENVREFfQ0FMTF9BU1NFUlQgKGN1U3RyZWFtQ3Jl YXRlLCAmYXEtPmN1ZGFfc3RyZWFtLCBDVV9TVFJFQU1fREVGQVVMVCk7Cisg IGlmIChhcS0+Y3VkYV9zdHJlYW0gPT0gTlVMTCkKKyAgICBHT01QX1BMVUdJ Tl9mYXRhbCAoIkNVREEgc3RyZWFtIGNyZWF0ZSBOVUxMXG4iKTsKKworICBD VURBX0NBTExfQVNTRVJUIChjdVN0cmVhbVN5bmNocm9uaXplLCBhcS0+Y3Vk YV9zdHJlYW0pOworCisKKyAgcmV0dXJuIGFxOworfQorCitib29sCitHT01Q X09GRkxPQURfb3BlbmFjY19hc3luY19kZXN0cnVjdCAoc3RydWN0IGdvYWNj X2FzeW5jcXVldWUgKmFxKQoreworICBDVURBX0NBTExfRVJFVCAoZmFsc2Us IGN1U3RyZWFtRGVzdHJveSwgYXEtPmN1ZGFfc3RyZWFtKTsKKyAgZnJlZSAo YXEpOworICByZXR1cm4gdHJ1ZTsKK30KIAogaW50Ci1HT01QX09GRkxPQURf b3BlbmFjY19jdWRhX3NldF9zdHJlYW0gKGludCBhc3luYywgdm9pZCAqc3Ry ZWFtKQorR09NUF9PRkZMT0FEX29wZW5hY2NfYXN5bmNfdGVzdCAoc3RydWN0 IGdvYWNjX2FzeW5jcXVldWUgKmFxKQogewotICByZXR1cm4gbnZwdHhfc2V0 X2N1ZGFfc3RyZWFtIChhc3luYywgc3RyZWFtKTsKKyAgQ1VyZXN1bHQgciA9 IENVREFfQ0FMTF9OT0NIRUNLIChjdVN0cmVhbVF1ZXJ5LCBhcS0+Y3VkYV9z dHJlYW0pOworICBpZiAociA9PSBDVURBX1NVQ0NFU1MpCisgICAgcmV0dXJu IDE7CisgIGlmIChyID09IENVREFfRVJST1JfTk9UX1JFQURZKQorICAgIHJl dHVybiAwOworCisgIEdPTVBfUExVR0lOX2Vycm9yICgiY3VTdHJlYW1RdWVy eSBlcnJvcjogJXMiLCBjdWRhX2Vycm9yIChyKSk7CisgIHJldHVybiAtMTsK K30KKwordm9pZAorR09NUF9PRkZMT0FEX29wZW5hY2NfYXN5bmNfc3luY2hy b25pemUgKHN0cnVjdCBnb2FjY19hc3luY3F1ZXVlICphcSkKK3sKKyAgQ1VE QV9DQUxMX0FTU0VSVCAoY3VTdHJlYW1TeW5jaHJvbml6ZSwgYXEtPmN1ZGFf c3RyZWFtKTsKK30KKwordm9pZAorR09NUF9PRkZMT0FEX29wZW5hY2NfYXN5 bmNfc2VyaWFsaXplIChzdHJ1Y3QgZ29hY2NfYXN5bmNxdWV1ZSAqYXExLAor CQkJCSAgICAgIHN0cnVjdCBnb2FjY19hc3luY3F1ZXVlICphcTIpCit7Cisg IENVZXZlbnQgZTsKKyAgQ1VEQV9DQUxMX0FTU0VSVCAoY3VFdmVudENyZWF0 ZSwgJmUsIENVX0VWRU5UX0RJU0FCTEVfVElNSU5HKTsKKyAgQ1VEQV9DQUxM X0FTU0VSVCAoY3VFdmVudFJlY29yZCwgZSwgYXExLT5jdWRhX3N0cmVhbSk7 CisgIENVREFfQ0FMTF9BU1NFUlQgKGN1U3RyZWFtV2FpdEV2ZW50LCBhcTIt PmN1ZGFfc3RyZWFtLCBlLCAwKTsKK30KKworc3RhdGljIHZvaWQKK2N1ZGFf Y2FsbGJhY2tfd3JhcHBlciAoQ1VzdHJlYW0gc3RyZWFtLCBDVXJlc3VsdCBy ZXMsIHZvaWQgKnB0cikKK3sKKyAgaWYgKHJlcyAhPSBDVURBX1NVQ0NFU1Mp CisgICAgR09NUF9QTFVHSU5fZmF0YWwgKCIlcyBlcnJvcjogJXMiLCBfX0ZV TkNUSU9OX18sIGN1ZGFfZXJyb3IgKHJlcykpOworICBzdHJ1Y3QgbnZwdHhf Y2FsbGJhY2sgKmNiID0gKHN0cnVjdCBudnB0eF9jYWxsYmFjayAqKSBwdHI7 CisgIGNiLT5mbiAoY2ItPnB0cik7CisgIGZyZWUgKHB0cik7Cit9CisKK3Zv aWQKK0dPTVBfT0ZGTE9BRF9vcGVuYWNjX2FzeW5jX3F1ZXVlX2NhbGxiYWNr IChzdHJ1Y3QgZ29hY2NfYXN5bmNxdWV1ZSAqYXEsCisJCQkJCSAgIHZvaWQg KCpjYWxsYmFja19mbikodm9pZCAqKSwKKwkJCQkJICAgdm9pZCAqdXNlcnB0 cikKK3sKKyAgc3RydWN0IG52cHR4X2NhbGxiYWNrICpiID0gR09NUF9QTFVH SU5fbWFsbG9jIChzaXplb2YgKCpiKSk7CisgIGItPmZuID0gY2FsbGJhY2tf Zm47CisgIGItPnB0ciA9IHVzZXJwdHI7CisgIGItPmFxID0gYXE7CisgIENV REFfQ0FMTF9BU1NFUlQgKGN1U3RyZWFtQWRkQ2FsbGJhY2ssIGFxLT5jdWRh X3N0cmVhbSwKKwkJICAgIGN1ZGFfY2FsbGJhY2tfd3JhcHBlciwgKHZvaWQg KikgYiwgMCk7Cit9CisKK3N0YXRpYyBib29sCitjdWRhX21lbWNweV9zYW5p dHlfY2hlY2sgKGNvbnN0IHZvaWQgKmgsIGNvbnN0IHZvaWQgKmQsIHNpemVf dCBzKQoreworICBDVWRldmljZXB0ciBwYjsKKyAgc2l6ZV90IHBzOworICBp ZiAoIXMpCisgICAgcmV0dXJuIHRydWU7CisgIGlmICghZCkKKyAgICB7Cisg ICAgICBHT01QX1BMVUdJTl9lcnJvciAoImludmFsaWQgZGV2aWNlIGFkZHJl c3MiKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIENVREFfQ0FM TCAoY3VNZW1HZXRBZGRyZXNzUmFuZ2UsICZwYiwgJnBzLCAoQ1VkZXZpY2Vw dHIpIGQpOworICBpZiAoIXBiKQorICAgIHsKKyAgICAgIEdPTVBfUExVR0lO X2Vycm9yICgiaW52YWxpZCBkZXZpY2UgYWRkcmVzcyIpOworICAgICAgcmV0 dXJuIGZhbHNlOworICAgIH0KKyAgaWYgKCFoKQorICAgIHsKKyAgICAgIEdP TVBfUExVR0lOX2Vycm9yICgiaW52YWxpZCBob3N0IGFkZHJlc3MiKTsKKyAg ICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIGlmIChkID09IGgpCisgICAg eworICAgICAgR09NUF9QTFVHSU5fZXJyb3IgKCJpbnZhbGlkIGhvc3Qgb3Ig ZGV2aWNlIGFkZHJlc3MiKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9 CisgIGlmICgodm9pZCAqKShkICsgcykgPiAodm9pZCAqKShwYiArIHBzKSkK KyAgICB7CisgICAgICBHT01QX1BMVUdJTl9lcnJvciAoImludmFsaWQgc2l6 ZSIpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgcmV0dXJuIHRy dWU7Cit9CisKK2Jvb2wKK0dPTVBfT0ZGTE9BRF9ob3N0MmRldiAoaW50IG9y ZCwgdm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBuKQorewor ICBpZiAoIW52cHR4X2F0dGFjaF9ob3N0X3RocmVhZF90b19kZXZpY2UgKG9y ZCkKKyAgICAgIHx8ICFjdWRhX21lbWNweV9zYW5pdHlfY2hlY2sgKHNyYywg ZHN0LCBuKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIENVREFfQ0FMTCAoY3VN ZW1jcHlIdG9ELCAoQ1VkZXZpY2VwdHIpIGRzdCwgc3JjLCBuKTsKKyAgcmV0 dXJuIHRydWU7Cit9CisKK2Jvb2wKK0dPTVBfT0ZGTE9BRF9kZXYyaG9zdCAo aW50IG9yZCwgdm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBu KQoreworICBpZiAoIW52cHR4X2F0dGFjaF9ob3N0X3RocmVhZF90b19kZXZp Y2UgKG9yZCkKKyAgICAgIHx8ICFjdWRhX21lbWNweV9zYW5pdHlfY2hlY2sg KGRzdCwgc3JjLCBuKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIENVREFfQ0FM TCAoY3VNZW1jcHlEdG9ILCBkc3QsIChDVWRldmljZXB0cikgc3JjLCBuKTsK KyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wKK0dPTVBfT0ZGTE9BRF9kZXYy ZGV2IChpbnQgb3JkLCB2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6 ZV90IG4pCit7CisgIENVREFfQ0FMTCAoY3VNZW1jcHlEdG9EQXN5bmMsIChD VWRldmljZXB0cikgZHN0LCAoQ1VkZXZpY2VwdHIpIHNyYywgbiwgTlVMTCk7 CisgIHJldHVybiB0cnVlOworfQorCitib29sCitHT01QX09GRkxPQURfb3Bl bmFjY19hc3luY19ob3N0MmRldiAoaW50IG9yZCwgdm9pZCAqZHN0LCBjb25z dCB2b2lkICpzcmMsCisJCQkJICAgICBzaXplX3Qgbiwgc3RydWN0IGdvYWNj X2FzeW5jcXVldWUgKmFxKQoreworICBpZiAoIW52cHR4X2F0dGFjaF9ob3N0 X3RocmVhZF90b19kZXZpY2UgKG9yZCkKKyAgICAgIHx8ICFjdWRhX21lbWNw eV9zYW5pdHlfY2hlY2sgKHNyYywgZHN0LCBuKSkKKyAgICByZXR1cm4gZmFs c2U7CisgIENVREFfQ0FMTCAoY3VNZW1jcHlIdG9EQXN5bmMsIChDVWRldmlj ZXB0cikgZHN0LCBzcmMsIG4sIGFxLT5jdWRhX3N0cmVhbSk7CisgIHJldHVy biB0cnVlOworfQorCitib29sCitHT01QX09GRkxPQURfb3BlbmFjY19hc3lu Y19kZXYyaG9zdCAoaW50IG9yZCwgdm9pZCAqZHN0LCBjb25zdCB2b2lkICpz cmMsCisJCQkJICAgICBzaXplX3Qgbiwgc3RydWN0IGdvYWNjX2FzeW5jcXVl dWUgKmFxKQoreworICBpZiAoIW52cHR4X2F0dGFjaF9ob3N0X3RocmVhZF90 b19kZXZpY2UgKG9yZCkKKyAgICAgIHx8ICFjdWRhX21lbWNweV9zYW5pdHlf Y2hlY2sgKGRzdCwgc3JjLCBuKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIENV REFfQ0FMTCAoY3VNZW1jcHlEdG9IQXN5bmMsIGRzdCwgKENVZGV2aWNlcHRy KSBzcmMsIG4sIGFxLT5jdWRhX3N0cmVhbSk7CisgIHJldHVybiB0cnVlOwog fQogCiAvKiBBZGp1c3QgbGF1bmNoIGRpbWVuc2lvbnM6IHBpY2sgZ29vZCB2 YWx1ZXMgZm9yIG51bWJlciBvZiBibG9ja3MgYW5kIHdhcnBzCkBAIC0yMjY5 LDggKzE2MTksNyBAQCBHT01QX09GRkxPQURfcnVuIChpbnQgb3JkLCB2b2lk ICp0Z3RfZm4sIHZvaWQgKnRndF92YXJzLCB2b2lkICoqYXJncykKICAgICBD VV9MQVVOQ0hfUEFSQU1fRU5ECiAgIH07CiAgIHIgPSBDVURBX0NBTExfTk9D SEVDSyAoY3VMYXVuY2hLZXJuZWwsIGZ1bmN0aW9uLCB0ZWFtcywgMSwgMSwK LQkJCSAzMiwgdGhyZWFkcywgMSwgMCwgcHR4X2Rldi0+bnVsbF9zdHJlYW0t PnN0cmVhbSwKLQkJCSBOVUxMLCBjb25maWcpOworCQkJIDMyLCB0aHJlYWRz LCAxLCAwLCBOVUxMLCBOVUxMLCBjb25maWcpOwogICBpZiAociAhPSBDVURB X1NVQ0NFU1MpCiAgICAgR09NUF9QTFVHSU5fZmF0YWwgKCJjdUxhdW5jaEtl cm5lbCBlcnJvcjogJXMiLCBjdWRhX2Vycm9yIChyKSk7CiAK --------------03A2365BE34B62732FCAE587--