From mboxrd@z Thu Jan 1 00:00:00 1970 From: Tvrtko Ursulin Subject: [PATCH i-g-t v7 7/9] tests/perf_pmu: Tests for i915 PMU API Date: Wed, 11 Oct 2017 13:54:18 +0100 Message-ID: <20171011125418.1279-1-tvrtko.ursulin@linux.intel.com> References: <150765359403.797.4409401551282797094@mail.alporthouse.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail-wm0-x235.google.com (mail-wm0-x235.google.com [IPv6:2a00:1450:400c:c09::235]) by gabe.freedesktop.org (Postfix) with ESMTPS id 92DC76E673 for ; Wed, 11 Oct 2017 12:54:29 +0000 (UTC) Received: by mail-wm0-x235.google.com with SMTP id f4so4563956wme.0 for ; Wed, 11 Oct 2017 05:54:29 -0700 (PDT) In-Reply-To: <150765359403.797.4409401551282797094@mail.alporthouse.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: Intel-gfx@lists.freedesktop.org List-Id: intel-gfx@lists.freedesktop.org RnJvbTogVHZydGtvIFVyc3VsaW4gPHR2cnRrby51cnN1bGluQGludGVsLmNvbT4KCkEgYnVuY2gg b2YgdGVzdHMgZm9yIHRoZSBuZXcgaTkxNSBQTVUgZmVhdHVyZS4KClBhcnRzIG9mIHRoZSBjb2Rl IHdlcmUgaW5pdGlhbHkgc2tldGNoZWQgYnkgRG1pdHJ5IFJvZ296aGtpbi4KCnYyOiAoTW9zdCBz dWdnZXN0aW9ucyBieSBDaHJpcyBXaWxzb24pCiAqIEFkZCBuZXcgY2xhc3MvaW5zdGFuY2UgYmFz ZWQgZW5naW5lIGxpc3QuCiAqIEFkZCBnZW1faGFzX2VuZ2luZS9nZW1fcmVxdWlyZV9lbmdpbmUg dG8gd29yayB3aXRoIGNsYXNzL2luc3RhbmNlLgogKiBVc2UgdGhlIGFib3ZlIHR3byB0aHJvdWdo b3V0IHRoZSB0ZXN0LgogKiBTaG9ydGVuIHRlc3RzIHRvIDEwMG1zIGJ1c3kgYmF0Y2hlcywgc2Vl bXMgZW5vdWdoLgogKiBBZGQgcXVldWVkIGNvdW50ZXIgc2FuaXR5IGNoZWNrcy4KICogVXNlIGln dF9uc2VjX2VsYXBzZWQuCiAqIFNraXAgb24gcGVyZiAtRU5PREVWIGluIHNvbWUgdGVzdHMgaW5z dGVhZCBvZiBlbWJlZGRpbmcga25vd2xlZGdlIGxvY2FsbHkuCiAqIEZpeCBtdWx0aSBvcmRlcmlu ZyBmb3IgYnVzeSBhY2NvdW50aW5nLgogKiBVc2UgbmV3IGd1cmFudGVlZF91c2xlZXAgd2hlbiBz bGVlcCB0aW1lIGlzIGFzc2VydGVkIG9uLgogKiBDaGVjayBmb3Igbm8gcXVldWVkIHdoZW4gaWRs ZS9idXN5LgogKiBBZGQgcXVldWVkIGNvdW50ZXIgaW5pdCB0ZXN0LgogKiBBZGQgcXVldWVkIHRl c3RzLgogKiBDb25zb2xpZGF0ZSBhbmQgaW5jcmVhc2UgbXVsdGlwbGUgYnVzeSBlbmdpbmVzIHRl c3RzIHRvIG1vc3QtYnVzeSBhbmQKICAgYWxsLWJ1c3kgdGVzdHMuCiAqIEd1YXJhbnR0ZSBpbnRl cnJ1cHRzIGJ5IHVzaW5nIGZlbmNlcy4KICogVGVzdCBSQzYgdmlhIGZvcmNld2FrZS4KCnYzOgog KiBUd2VhayBhc3NlcnQgaW4gaW50ZXJydXB0cyBzdWJ0ZXN0LgogKiBTcHJpbmtsZSBvZiBjb21t ZW50cy4KICogRml4IG11bHRpLWNsaWVudCB0ZXN0IHdoaWNoIGdvdCBicm9rZW4gaW4gdjIuCgp2 NDoKICogTWVhc3VyZWQgaW5zdGVhZCBvZiBndWFyYW50ZWVkIHNsZWVwLgogKiBNaXNzaW5nIHN5 bmMgaW4gbm9fc2VtYS4KICogTG9nIGJ1c3luZXNzIGJlZm9yZSBhc3NlcnRzIGZvciBkZWJ1Zy4K ICogYWNjZXNzKDIpIGluc3RlYWQgb2Ygb3BlbigyKSB0byBkZXRlcm1pbmUgaWYgY3B1MCBpcyBo b3RwbHVnZ2FibGUuCiAqIFRlc3QgZnJlcXVlbmN5IHJlcG9ydGluZyB2aWEgbWluL21heCBzZXR0 aW5nIGluc3RlYWQgYXNzdW1pbmcuCiAgIF5eIEFsbCBhYm92ZSBzdWdnZXN0ZWQgYnkgQ2hyaXMg V2lsc29uLiBeXgogKiBEcm9wIHF1ZXVlZCBzdWJ0ZXN0cyB0byBtYXRjaCBpOTE1LgogKiBVc2Ug bG9uZyBiYXRjaGVzIHdpdGggZmVuY2VzIHRvIGVuc3VyZSBpbnRlcnJ1cHRzLgogKiBUZXN0IHJl bmRlciBub2RlIGFzIHdlbGwuCgp2NToKICogQWRkIHRvIG1lc29uIGJ1aWxkLiAoUGV0cmkgTGF0 dmFsYSkKICogVXNlIDFlTiBjb25zdGFudHMuIChDaHJpcyBXaWxzb24pCiAqIEFkZCB0ZXN0cyBm b3Igc2VtYXBob3JlIGFuZCBldmVudCB3YWl0aW5nLgoKdjY6CiAqIEZpeCBpbnRlcnJ1cHRzIHN1 YnRlc3QgYnkgcG9sbGluZyB0aGUgZmVuY2UgZnJvbSB0aGUgIm91dHNpZGUiLgogICAoQ2hyaXMg V2lsc29uKQoKdjc6CiAqIEFzc2VydCBudW1iZXIgb2YgaW5pdGlhbGl6ZWQgZW5naW5lcyBtYXRj aGVzIHRoZSBleHBlY3RhdGlvbi4KICAgKENocmlzIFdpbHNvbikKICogV2FybiBpbnN0ZWFkIG9m IHNraXBwaW5nIGlmIHdlIGNvdWxkbid0IHJlc3RvcmUgdGhlIGluaXRpYWwKICAgZnJlcXVlbmN5 LiAoQ2hyaXMgV2lsc29uKQogKiBNb3ZlIGFsbCBhc3NlcnRzIHRvIGFmdGVyIHRoZSB0ZXN0IGNs ZWFudXAgKGp1c3QgYSB0aWR5KS4KICogTW9yZSAxZU4gbm90YXRpb24gZm9yIHRpbWVvdXRzLgog KiBCdW1wIHRoZSB0b2xlcmFuY2UgdG8gNSUgc2luY2UgSSBzYXcgYSBmZXcgbm9pc3kgcnVucyB3 aXRoCiAgIHNhbXBsaW5nIGNvdW50ZXJzLgogKiBBbHdheXMgc3RhcnQgdGhlIFBNVSBiZWZvcmUg c3VibWl0dGluZyBiYXRjaGVzIHRvIGxvd2VyCiAgIHJlbGlhbmNlIG9uIGk5MTUgZG9pbmcgdGhl IGRlbGF5ZWQgZW5naW5lIGJ1c3kgc3RhdHMgZGlzYWJsZS4KClNpZ25lZC1vZmYtYnk6IFR2cnRr byBVcnN1bGluIDx0dnJ0a28udXJzdWxpbkBpbnRlbC5jb20+CkNjOiBDaHJpcyBXaWxzb24gPGNo cmlzQGNocmlzLXdpbHNvbi5jby51az4KQ2M6IERtaXRyeSBSb2dvemhraW4gPGRtaXRyeS52LnJv Z296aGtpbkBpbnRlbC5jb20+ClJldmlld2VkLWJ5OiBDaHJpcyBXaWxzb24gPGNocmlzQGNocmlz LXdpbHNvbi5jby51az4gKHY2KQotLS0KIGxpYi9pZ3RfZ3QuYyAgICAgICAgICAgfCAgIDUwICsr CiBsaWIvaWd0X2d0LmggICAgICAgICAgIHwgICAzOCArKwogbGliL2lndF9wZXJmLmggICAgICAg ICB8ICAgIDkgKy0KIHRlc3RzL01ha2VmaWxlLmFtICAgICAgfCAgICAxICsKIHRlc3RzL01ha2Vm aWxlLnNvdXJjZXMgfCAgICAxICsKIHRlc3RzL21lc29uLmJ1aWxkICAgICAgfCAgICAxICsKIHRl c3RzL3BlcmZfcG11LmMgICAgICAgfCAxMjQyICsrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKwogNyBmaWxlcyBjaGFuZ2VkLCAxMzM0IGluc2VydGlvbnMoKyks IDggZGVsZXRpb25zKC0pCiBjcmVhdGUgbW9kZSAxMDA2NDQgdGVzdHMvcGVyZl9wbXUuYwoKZGlm ZiAtLWdpdCBhL2xpYi9pZ3RfZ3QuYyBiL2xpYi9pZ3RfZ3QuYwppbmRleCBiM2YzYjM4MDllZWUu LjRjNzU4MTFmYjFiMyAxMDA2NDQKLS0tIGEvbGliL2lndF9ndC5jCisrKyBiL2xpYi9pZ3RfZ3Qu YwpAQCAtNTY4LDMgKzU2OCw1MyBAQCBib29sIGdlbV9jYW5fc3RvcmVfZHdvcmQoaW50IGZkLCB1 bnNpZ25lZCBpbnQgZW5naW5lKQogCiAJcmV0dXJuIHRydWU7CiB9CisKK2NvbnN0IHN0cnVjdCBp bnRlbF9leGVjdXRpb25fZW5naW5lMiBpbnRlbF9leGVjdXRpb25fZW5naW5lczJbXSA9IHsKKwl7 ICJyY3MwIiwgSTkxNV9FTkdJTkVfQ0xBU1NfUkVOREVSLCAwIH0sCisJeyAiYmNzMCIsIEk5MTVf RU5HSU5FX0NMQVNTX0NPUFksIDAgfSwKKwl7ICJ2Y3MwIiwgSTkxNV9FTkdJTkVfQ0xBU1NfVklE RU8sIDAgfSwKKwl7ICJ2Y3MxIiwgSTkxNV9FTkdJTkVfQ0xBU1NfVklERU8sIDEgfSwKKwl7ICJ2 ZWNzMCIsIEk5MTVfRU5HSU5FX0NMQVNTX1ZJREVPX0VOSEFOQ0UsIDAgfSwKK307CisKK3Vuc2ln bmVkIGludAorZ2VtX2NsYXNzX2luc3RhbmNlX3RvX2ViX2ZsYWdzKGludCBnZW1fZmQsCisJCQkg ICAgICAgZW51bSBkcm1faTkxNV9nZW1fZW5naW5lX2NsYXNzIGNsYXNzLAorCQkJICAgICAgIHVu c2lnbmVkIGludCBpbnN0YW5jZSkKK3sKKwlpZiAoY2xhc3MgIT0gSTkxNV9FTkdJTkVfQ0xBU1Nf VklERU8pCisJCWlndF9hc3NlcnQoaW5zdGFuY2UgPT0gMCk7CisJZWxzZQorCQlpZ3RfYXNzZXJ0 KGluc3RhbmNlID49IDAgJiYgaW5zdGFuY2UgPD0gMSk7CisKKwlzd2l0Y2ggKGNsYXNzKSB7CisJ Y2FzZSBJOTE1X0VOR0lORV9DTEFTU19SRU5ERVI6CisJCXJldHVybiBJOTE1X0VYRUNfUkVOREVS OworCWNhc2UgSTkxNV9FTkdJTkVfQ0xBU1NfQ09QWToKKwkJcmV0dXJuIEk5MTVfRVhFQ19CTFQ7 CisJY2FzZSBJOTE1X0VOR0lORV9DTEFTU19WSURFTzoKKwkJaWYgKGluc3RhbmNlID09IDApIHsK KwkJCWlmIChnZW1faGFzX2JzZDIoZ2VtX2ZkKSkKKwkJCQlyZXR1cm4gSTkxNV9FWEVDX0JTRCB8 IEk5MTVfRVhFQ19CU0RfUklORzE7CisJCQllbHNlCisJCQkJcmV0dXJuIEk5MTVfRVhFQ19CU0Q7 CisKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBJOTE1X0VYRUNfQlNEIHwgSTkxNV9FWEVDX0JTRF9S SU5HMjsKKwkJfQorCWNhc2UgSTkxNV9FTkdJTkVfQ0xBU1NfVklERU9fRU5IQU5DRToKKwkJcmV0 dXJuIEk5MTVfRVhFQ19WRUJPWDsKKwljYXNlIEk5MTVfRU5HSU5FX0NMQVNTX09USEVSOgorCWRl ZmF1bHQ6CisJCWlndF9hc3NlcnQoMCk7CisJfTsKK30KKworYm9vbCBnZW1faGFzX2VuZ2luZShp bnQgZ2VtX2ZkLAorCQkgICAgZW51bSBkcm1faTkxNV9nZW1fZW5naW5lX2NsYXNzIGNsYXNzLAor CQkgICAgdW5zaWduZWQgaW50IGluc3RhbmNlKQoreworCXJldHVybiBnZW1faGFzX3JpbmcoZ2Vt X2ZkLAorCQkJICAgIGdlbV9jbGFzc19pbnN0YW5jZV90b19lYl9mbGFncyhnZW1fZmQsIGNsYXNz LAorCQkJCQkJCSAgIGluc3RhbmNlKSk7Cit9CmRpZmYgLS1naXQgYS9saWIvaWd0X2d0LmggYi9s aWIvaWd0X2d0LmgKaW5kZXggMjU3OWNiZDM3YmU3Li5mYjY3YWUxYTdkMWYgMTAwNjQ0Ci0tLSBh L2xpYi9pZ3RfZ3QuaAorKysgYi9saWIvaWd0X2d0LmgKQEAgLTI1LDYgKzI1LDcgQEAKICNkZWZp bmUgSUdUX0dUX0gKIAogI2luY2x1ZGUgImlndF9kZWJ1Z2ZzLmgiCisjaW5jbHVkZSAiaWd0X2Nv cmUuaCIKIAogdm9pZCBpZ3RfcmVxdWlyZV9oYW5nX3JpbmcoaW50IGZkLCBpbnQgcmluZyk7CiAK QEAgLTgwLDQgKzgxLDQxIEBAIGV4dGVybiBjb25zdCBzdHJ1Y3QgaW50ZWxfZXhlY3V0aW9uX2Vu Z2luZSB7CiAKIGJvb2wgZ2VtX2Nhbl9zdG9yZV9kd29yZChpbnQgZmQsIHVuc2lnbmVkIGludCBl bmdpbmUpOwogCitleHRlcm4gY29uc3Qgc3RydWN0IGludGVsX2V4ZWN1dGlvbl9lbmdpbmUyIHsK Kwljb25zdCBjaGFyICpuYW1lOworCWludCBjbGFzczsKKwlpbnQgaW5zdGFuY2U7Cit9IGludGVs X2V4ZWN1dGlvbl9lbmdpbmVzMltdOworCisjZGVmaW5lIGZvcl9lYWNoX2VuZ2luZV9jbGFzc19p bnN0YW5jZShmZF9fLCBlX18pIFwKKwlmb3IgKChlX18pID0gaW50ZWxfZXhlY3V0aW9uX2VuZ2lu ZXMyO1wKKwkgICAgIChlX18pLT5uYW1lOyBcCisJICAgICAoZV9fKSsrKQorCitlbnVtIGRybV9p OTE1X2dlbV9lbmdpbmVfY2xhc3MgeworCUk5MTVfRU5HSU5FX0NMQVNTX09USEVSID0gMCwKKwlJ OTE1X0VOR0lORV9DTEFTU19SRU5ERVIgPSAxLAorCUk5MTVfRU5HSU5FX0NMQVNTX0NPUFkgPSAy LAorCUk5MTVfRU5HSU5FX0NMQVNTX1ZJREVPID0gMywKKwlJOTE1X0VOR0lORV9DTEFTU19WSURF T19FTkhBTkNFID0gNCwKKwlJOTE1X0VOR0lORV9DTEFTU19NQVggLyogbm9uLUFCSSAqLworfTsK KwordW5zaWduZWQgaW50CitnZW1fY2xhc3NfaW5zdGFuY2VfdG9fZWJfZmxhZ3MoaW50IGdlbV9m ZCwKKwkJCSAgICAgICBlbnVtIGRybV9pOTE1X2dlbV9lbmdpbmVfY2xhc3MgY2xhc3MsCisJCQkg ICAgICAgdW5zaWduZWQgaW50IGluc3RhbmNlKTsKKworYm9vbCBnZW1faGFzX2VuZ2luZShpbnQg Z2VtX2ZkLAorCQkgICAgZW51bSBkcm1faTkxNV9nZW1fZW5naW5lX2NsYXNzIGNsYXNzLAorCQkg ICAgdW5zaWduZWQgaW50IGluc3RhbmNlKTsKKworc3RhdGljIGlubGluZQordm9pZCBnZW1fcmVx dWlyZV9lbmdpbmUoaW50IGdlbV9mZCwKKwkJCWVudW0gZHJtX2k5MTVfZ2VtX2VuZ2luZV9jbGFz cyBjbGFzcywKKwkJCXVuc2lnbmVkIGludCBpbnN0YW5jZSkKK3sKKwlpZ3RfcmVxdWlyZShnZW1f aGFzX2VuZ2luZShnZW1fZmQsIGNsYXNzLCBpbnN0YW5jZSkpOworfQorCiAjZW5kaWYgLyogSUdU X0dUX0ggKi8KZGlmZiAtLWdpdCBhL2xpYi9pZ3RfcGVyZi5oIGIvbGliL2lndF9wZXJmLmgKaW5k ZXggYjFmNTI1NzM5YzY5Li41NDI4ZmViMGM3NDYgMTAwNjQ0Ci0tLSBhL2xpYi9pZ3RfcGVyZi5o CisrKyBiL2xpYi9pZ3RfcGVyZi5oCkBAIC0yOSwxNCArMjksNyBAQAogCiAjaW5jbHVkZSA8bGlu dXgvcGVyZl9ldmVudC5oPgogCi1lbnVtIGRybV9pOTE1X2dlbV9lbmdpbmVfY2xhc3MgewotCUk5 MTVfRU5HSU5FX0NMQVNTX09USEVSID0gMCwKLQlJOTE1X0VOR0lORV9DTEFTU19SRU5ERVIgPSAx LAotCUk5MTVfRU5HSU5FX0NMQVNTX0NPUFkgPSAyLAotCUk5MTVfRU5HSU5FX0NMQVNTX1ZJREVP ID0gMywKLQlJOTE1X0VOR0lORV9DTEFTU19WSURFT19FTkhBTkNFID0gNCwKLQlJOTE1X0VOR0lO RV9DTEFTU19NQVggLyogbm9uLUFCSSAqLwotfTsKKyNpbmNsdWRlICJpZ3RfZ3QuaCIKIAogZW51 bSBkcm1faTkxNV9wbXVfZW5naW5lX3NhbXBsZSB7CiAJSTkxNV9TQU1QTEVfQlVTWSA9IDAsCmRp ZmYgLS1naXQgYS90ZXN0cy9NYWtlZmlsZS5hbSBiL3Rlc3RzL01ha2VmaWxlLmFtCmluZGV4IDg5 YTk3MDE1Mzk5Mi4uMTdlZTFiZTA4ZDhhIDEwMDY0NAotLS0gYS90ZXN0cy9NYWtlZmlsZS5hbQor KysgYi90ZXN0cy9NYWtlZmlsZS5hbQpAQCAtMTMxLDYgKzEzMSw3IEBAIGdlbjdfZm9yY2V3YWtl X210X0NGTEFHUyA9ICQoQU1fQ0ZMQUdTKSAkKFRIUkVBRF9DRkxBR1MpCiBnZW43X2ZvcmNld2Fr ZV9tdF9MREFERCA9ICQoTERBREQpIC1scHRocmVhZAogZ2VtX3VzZXJwdHJfYmxpdHNfQ0ZMQUdT ID0gJChBTV9DRkxBR1MpICQoVEhSRUFEX0NGTEFHUykKIGdlbV91c2VycHRyX2JsaXRzX0xEQURE ID0gJChMREFERCkgLWxwdGhyZWFkCitwZXJmX3BtdV9MREFERCA9ICQoTERBREQpICQodG9wX2J1 aWxkZGlyKS9saWIvbGliaWd0X3BlcmYubGEKIAogZ2VtX3dhaXRfTERBREQgPSAkKExEQUREKSAt bHJ0CiBrbXNfZmxpcF9MREFERCA9ICQoTERBREQpIC1scnQgLWxwdGhyZWFkCmRpZmYgLS1naXQg YS90ZXN0cy9NYWtlZmlsZS5zb3VyY2VzIGIvdGVzdHMvTWFrZWZpbGUuc291cmNlcwppbmRleCBi YjY2NTJlMmZhM2IuLjk4MzA0NzJjYmJiYSAxMDA2NDQKLS0tIGEvdGVzdHMvTWFrZWZpbGUuc291 cmNlcworKysgYi90ZXN0cy9NYWtlZmlsZS5zb3VyY2VzCkBAIC0yMTcsNiArMjE3LDcgQEAgVEVT VFNfcHJvZ3MgPSBcCiAJa21zX3ZibGFuayBcCiAJbWV0YV90ZXN0IFwKIAlwZXJmIFwKKwlwZXJm X3BtdSBcCiAJcG1fYmFja2xpZ2h0IFwKIAlwbV9scHNwIFwKIAlwbV9yYzZfcmVzaWRlbmN5IFwK ZGlmZiAtLWdpdCBhL3Rlc3RzL21lc29uLmJ1aWxkIGIvdGVzdHMvbWVzb24uYnVpbGQKaW5kZXgg NmNiMzU4NGE0ZGQ5Li4xMmQ1NzA2ZmFhZWIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL21lc29uLmJ1aWxk CisrKyBiL3Rlc3RzL21lc29uLmJ1aWxkCkBAIC0xOTcsNiArMTk3LDcgQEAgdGVzdF9wcm9ncyA9 IFsKIAkna21zX3ZibGFuaycsCiAJJ21ldGFfdGVzdCcsCiAJJ3BlcmYnLAorCSdwZXJmX3BtdScs CiAJJ3BtX2JhY2tsaWdodCcsCiAJJ3BtX2xwc3AnLAogCSdwbV9yYzZfcmVzaWRlbmN5JywKZGlm ZiAtLWdpdCBhL3Rlc3RzL3BlcmZfcG11LmMgYi90ZXN0cy9wZXJmX3BtdS5jCm5ldyBmaWxlIG1v ZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMC4uODU4NWVkN2JjZWU4Ci0tLSAvZGV2L251bGwK KysrIGIvdGVzdHMvcGVyZl9wbXUuYwpAQCAtMCwwICsxLDEyNDIgQEAKKy8qCisgKiBDb3B5cmln aHQgwqkgMjAxNyBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5 IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBj b3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAo dGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0 cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1 c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2Us CisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBl cnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3Vi amVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHly aWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4 dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0 YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJF IElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJF U1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJB TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBV UlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVU SE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdF UyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFD VCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05O RUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MKKyAq IElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1 ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNp bmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3lzL3N0 YXQuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy90aW1lcy5oPgorI2lu Y2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPHRpbWUu aD4KKyNpbmNsdWRlIDxwb2xsLmg+CisKKyNpbmNsdWRlICJpZ3QuaCIKKyNpbmNsdWRlICJpZ3Rf Y29yZS5oIgorI2luY2x1ZGUgImlndF9wZXJmLmgiCisjaW5jbHVkZSAiaWd0X3N5c2ZzLmgiCisK K0lHVF9URVNUX0RFU0NSSVBUSU9OKCJUZXN0IHRoZSBpOTE1IHBtdSBwZXJmIGludGVyZmFjZSIp OworCitjb25zdCBkb3VibGUgdG9sZXJhbmNlID0gMC4wNWY7Citjb25zdCB1bnNpZ25lZCBsb25n IGJhdGNoX2R1cmF0aW9uX25zID0gMTAwZTY7CisKK3N0YXRpYyBpbnQgb3Blbl9wbXUodWludDY0 X3QgY29uZmlnKQoreworCWludCBmZDsKKworCWZkID0gcGVyZl9pOTE1X29wZW4oY29uZmlnKTsK KwlpZ3RfcmVxdWlyZShmZCA+PSAwIHx8IChmZCA8IDAgJiYgZXJybm8gIT0gRU5PREVWKSk7CisJ aWd0X2Fzc2VydChmZCA+PSAwKTsKKworCXJldHVybiBmZDsKK30KKworc3RhdGljIGludCBvcGVu X2dyb3VwKHVpbnQ2NF90IGNvbmZpZywgaW50IGdyb3VwKQoreworCWludCBmZDsKKworCWZkID0g cGVyZl9pOTE1X29wZW5fZ3JvdXAoY29uZmlnLCBncm91cCk7CisJaWd0X3JlcXVpcmUoZmQgPj0g MCB8fCAoZmQgPCAwICYmIGVycm5vICE9IEVOT0RFVikpOworCWlndF9hc3NlcnQoZmQgPj0gMCk7 CisKKwlyZXR1cm4gZmQ7Cit9CisKK3N0YXRpYyB2b2lkCitpbml0KGludCBnZW1fZmQsIGNvbnN0 IHN0cnVjdCBpbnRlbF9leGVjdXRpb25fZW5naW5lMiAqZSwgdWludDhfdCBzYW1wbGUpCit7CisJ aW50IGZkOworCisJZmQgPSBvcGVuX3BtdShfX0k5MTVfUE1VX0VOR0lORShlLT5jbGFzcywgZS0+ aW5zdGFuY2UsIHNhbXBsZSkpOworCisJY2xvc2UoZmQpOworfQorCitzdGF0aWMgdWludDY0X3Qg cG11X3JlYWRfc2luZ2xlKGludCBmZCkKK3sKKwl1aW50NjRfdCBkYXRhWzJdOworCisJaWd0X2Fz c2VydF9lcShyZWFkKGZkLCBkYXRhLCBzaXplb2YoZGF0YSkpLCBzaXplb2YoZGF0YSkpOworCisJ cmV0dXJuIGRhdGFbMF07Cit9CisKK3N0YXRpYyB2b2lkIHBtdV9yZWFkX211bHRpKGludCBmZCwg dW5zaWduZWQgaW50IG51bSwgdWludDY0X3QgKnZhbCkKK3sKKwl1aW50NjRfdCBidWZbMiArIG51 bV07CisJdW5zaWduZWQgaW50IGk7CisKKwlpZ3RfYXNzZXJ0X2VxKHJlYWQoZmQsIGJ1Ziwgc2l6 ZW9mKGJ1ZikpLCBzaXplb2YoYnVmKSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspCisJ CXZhbFtpXSA9IGJ1ZlsyICsgaV07Cit9CisKKyNkZWZpbmUgYXNzZXJ0X3dpdGhpbl9lcHNpbG9u KHgsIHJlZiwgdG9sZXJhbmNlKSBcCisJaWd0X2Fzc2VydF9mKChkb3VibGUpKHgpIDw9ICgxLjAg KyB0b2xlcmFuY2UpICogKGRvdWJsZSlyZWYgJiYgXAorCQkgICAgIChkb3VibGUpKHgpID49ICgx LjAgLSB0b2xlcmFuY2UpICogKGRvdWJsZSlyZWYsIFwKKwkJICAgICAiJyVzJyAhPSAnJXMnICgl ZiBub3Qgd2l0aGluICVmJSUgdG9sZXJhbmNlIG9mICVmKVxuIixcCisJCSAgICAgI3gsICNyZWYs IChkb3VibGUpeCwgdG9sZXJhbmNlICogMTAwLjAsIChkb3VibGUpcmVmKQorCisvKgorICogSGVs cGVyIGZvciBjYXNlcyB3aGVyZSB3ZSBhc3NlcnQgb24gdGltZSBzcGVudCBzbGVlcGluZyAoZGly ZWN0bHkgb3IKKyAqIGluZGlyZWN0bHkpLCBzbyBtYWtlIGl0IG1vcmUgcm9idXN0IGJ5IGVuc3Vy aW5nIHRoZSBzeXN0ZW0gc2xlZXAgdGltZQorICogaXMgd2l0aGluIHRlc3QgdG9sZXJhbmNlIHRv IHN0YXJ0IHdpdGguCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgbWVhc3VyZWRfdXNsZWVwKHVu c2lnbmVkIGludCB1c2VjKQoreworCXVpbnQ2NF90IHNsZXB0ID0gMDsKKworCXdoaWxlICh1c2Vj ID4gMCkgeworCQlzdHJ1Y3QgdGltZXNwZWMgc3RhcnQgPSB7IH07CisJCXVpbnQ2NF90IHRoaXNf c2xlZXA7CisKKwkJaWd0X25zZWNfZWxhcHNlZCgmc3RhcnQpOworCQl1c2xlZXAodXNlYyk7CisJ CXRoaXNfc2xlZXAgPSBpZ3RfbnNlY19lbGFwc2VkKCZzdGFydCk7CisJCXNsZXB0ICs9IHRoaXNf c2xlZXA7CisJCWlmICh0aGlzX3NsZWVwID4gdXNlYyAqIDEwMDApCisJCQlicmVhazsKKwkJdXNl YyAtPSB0aGlzX3NsZWVwOworCX0KKworCXJldHVybiBzbGVwdDsKK30KKworc3RhdGljIHVuc2ln bmVkIGludCBlMnJpbmcoaW50IGdlbV9mZCwgY29uc3Qgc3RydWN0IGludGVsX2V4ZWN1dGlvbl9l bmdpbmUyICplKQoreworCXJldHVybiBnZW1fY2xhc3NfaW5zdGFuY2VfdG9fZWJfZmxhZ3MoZ2Vt X2ZkLCBlLT5jbGFzcywgZS0+aW5zdGFuY2UpOworfQorCitzdGF0aWMgdm9pZAorc2luZ2xlKGlu dCBnZW1fZmQsIGNvbnN0IHN0cnVjdCBpbnRlbF9leGVjdXRpb25fZW5naW5lMiAqZSwgYm9vbCBi dXN5KQoreworCWRvdWJsZSByZWYgPSBidXN5ID8gYmF0Y2hfZHVyYXRpb25fbnMgOiAwLjBmOwor CWlndF9zcGluX3QgKnNwaW47CisJdWludDY0X3QgdmFsOworCWludCBmZDsKKworCWZkID0gb3Bl bl9wbXUoSTkxNV9QTVVfRU5HSU5FX0JVU1koZS0+Y2xhc3MsIGUtPmluc3RhbmNlKSk7CisKKwlp ZiAoYnVzeSkgeworCQlzcGluID0gaWd0X3NwaW5fYmF0Y2hfbmV3KGdlbV9mZCwgMCwgZTJyaW5n KGdlbV9mZCwgZSksIDApOworCQlpZ3Rfc3Bpbl9iYXRjaF9zZXRfdGltZW91dChzcGluLCBiYXRj aF9kdXJhdGlvbl9ucyk7CisJfSBlbHNlIHsKKwkJdXNsZWVwKGJhdGNoX2R1cmF0aW9uX25zIC8g MTAwMCk7CisJfQorCisJaWYgKGJ1c3kpCisJCWdlbV9zeW5jKGdlbV9mZCwgc3Bpbi0+aGFuZGxl KTsKKworCXZhbCA9IHBtdV9yZWFkX3NpbmdsZShmZCk7CisKKwlpZiAoYnVzeSkKKwkJaWd0X3Nw aW5fYmF0Y2hfZnJlZShnZW1fZmQsIHNwaW4pOworCWNsb3NlKGZkKTsKKworCWFzc2VydF93aXRo aW5fZXBzaWxvbih2YWwsIHJlZiwgdG9sZXJhbmNlKTsKK30KKworc3RhdGljIHZvaWQgbG9nX2J1 c3koaW50IGZkLCB1bnNpZ25lZCBpbnQgbnVtX2VuZ2luZXMsIHVpbnQ2NF90ICp2YWwpCit7CisJ Y2hhciBidWZbMTAyNF07CisJaW50IHJlbSA9IHNpemVvZihidWYpOworCXVuc2lnbmVkIGludCBp OworCWNoYXIgKnAgPSBidWY7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2VuZ2luZXM7IGkrKykg eworCQlpbnQgbGVuOworCisJCWxlbiA9IHNucHJpbnRmKHAsIHJlbSwgIiV1PSUiIFBSSXU2NCAi XG4iLCAgaSwgdmFsW2ldKTsKKwkJaWd0X2Fzc2VydChsZW4gPiAwKTsKKwkJcmVtIC09IGxlbjsK KwkJcCArPSBsZW47CisJfQorCisJaWd0X2luZm8oIiVzIiwgYnVmKTsKK30KKworc3RhdGljIHZv aWQKK2J1c3lfY2hlY2tfYWxsKGludCBnZW1fZmQsIGNvbnN0IHN0cnVjdCBpbnRlbF9leGVjdXRp b25fZW5naW5lMiAqZSwKKwkgICAgICAgY29uc3QgdW5zaWduZWQgaW50IG51bV9lbmdpbmVzKQor eworCWNvbnN0IHN0cnVjdCBpbnRlbF9leGVjdXRpb25fZW5naW5lMiAqZV87CisJdWludDY0X3Qg dmFsW251bV9lbmdpbmVzXTsKKwlpbnQgZmRbbnVtX2VuZ2luZXNdOworCWlndF9zcGluX3QgKnNw aW47CisJdW5zaWduZWQgaW50IGJ1c3lfaWR4LCBpOworCisJaSA9IDA7CisJZmRbMF0gPSAtMTsK Kwlmb3JfZWFjaF9lbmdpbmVfY2xhc3NfaW5zdGFuY2UoZmQsIGVfKSB7CisJCWlmICghZ2VtX2hh c19lbmdpbmUoZ2VtX2ZkLCBlXy0+Y2xhc3MsIGVfLT5pbnN0YW5jZSkpCisJCQljb250aW51ZTsK KwkJZWxzZSBpZiAoZSA9PSBlXykKKwkJCWJ1c3lfaWR4ID0gaTsKKworCQlmZFtpKytdID0gb3Bl bl9ncm91cChJOTE1X1BNVV9FTkdJTkVfQlVTWShlXy0+Y2xhc3MsCisJCQkJCQkJICBlXy0+aW5z dGFuY2UpLAorCQkJCSAgICAgZmRbMF0pOworCX0KKworCWlndF9hc3NlcnRfZXEoaSwgbnVtX2Vu Z2luZXMpOworCisJc3BpbiA9IGlndF9zcGluX2JhdGNoX25ldyhnZW1fZmQsIDAsIGUycmluZyhn ZW1fZmQsIGUpLCAwKTsKKwlpZ3Rfc3Bpbl9iYXRjaF9zZXRfdGltZW91dChzcGluLCBiYXRjaF9k dXJhdGlvbl9ucyk7CisKKwlnZW1fc3luYyhnZW1fZmQsIHNwaW4tPmhhbmRsZSk7CisKKwlwbXVf cmVhZF9tdWx0aShmZFswXSwgbnVtX2VuZ2luZXMsIHZhbCk7CisJbG9nX2J1c3koZmRbMF0sIG51 bV9lbmdpbmVzLCB2YWwpOworCisJaWd0X3NwaW5fYmF0Y2hfZnJlZShnZW1fZmQsIHNwaW4pOwor CWNsb3NlKGZkWzBdKTsKKworCWFzc2VydF93aXRoaW5fZXBzaWxvbih2YWxbYnVzeV9pZHhdLCBi YXRjaF9kdXJhdGlvbl9ucywgdG9sZXJhbmNlKTsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2VuZ2lu ZXM7IGkrKykgeworCQlpZiAoaSA9PSBidXN5X2lkeCkKKwkJCWNvbnRpbnVlOworCQlhc3NlcnRf d2l0aGluX2Vwc2lsb24odmFsW2ldLCAwLjBmLCB0b2xlcmFuY2UpOworCX0KKworfQorCitzdGF0 aWMgdm9pZAorbW9zdF9idXN5X2NoZWNrX2FsbChpbnQgZ2VtX2ZkLCBjb25zdCBzdHJ1Y3QgaW50 ZWxfZXhlY3V0aW9uX2VuZ2luZTIgKmUsCisJCSAgICBjb25zdCB1bnNpZ25lZCBpbnQgbnVtX2Vu Z2luZXMpCit7CisJY29uc3Qgc3RydWN0IGludGVsX2V4ZWN1dGlvbl9lbmdpbmUyICplXzsKKwl1 aW50NjRfdCB2YWxbbnVtX2VuZ2luZXNdOworCWludCBmZFtudW1fZW5naW5lc107CisJaWd0X3Nw aW5fdCAqc3BpbltudW1fZW5naW5lc107CisJdW5zaWduZWQgaW50IGlkbGVfaWR4LCBpOworCisJ Z2VtX3JlcXVpcmVfZW5naW5lKGdlbV9mZCwgZS0+Y2xhc3MsIGUtPmluc3RhbmNlKTsKKworCWkg PSAwOworCWZkWzBdID0gLTE7CisJZm9yX2VhY2hfZW5naW5lX2NsYXNzX2luc3RhbmNlKGZkLCBl XykgeworCQlpZiAoIWdlbV9oYXNfZW5naW5lKGdlbV9mZCwgZV8tPmNsYXNzLCBlXy0+aW5zdGFu Y2UpKQorCQkJY29udGludWU7CisKKwkJZmRbaV0gPSBvcGVuX2dyb3VwKEk5MTVfUE1VX0VOR0lO RV9CVVNZKGVfLT5jbGFzcywKKwkJCQkJCQllXy0+aW5zdGFuY2UpLAorCQkJCSAgIGZkWzBdKTsK KworCQlpZiAoZSA9PSBlXykgeworCQkJaWRsZV9pZHggPSBpOworCQl9IGVsc2UgeworCQkJc3Bp bltpXSA9IGlndF9zcGluX2JhdGNoX25ldyhnZW1fZmQsIDAsCisJCQkJCQkgICAgIGUycmluZyhn ZW1fZmQsIGVfKSwgMCk7CisJCQlpZ3Rfc3Bpbl9iYXRjaF9zZXRfdGltZW91dChzcGluW2ldLCBi YXRjaF9kdXJhdGlvbl9ucyk7CisJCX0KKworCQlpKys7CisJfQorCisJZm9yIChpID0gMDsgaSA8 IG51bV9lbmdpbmVzOyBpKyspIHsKKwkJaWYgKGkgIT0gaWRsZV9pZHgpCisJCQlnZW1fc3luYyhn ZW1fZmQsIHNwaW5baV0tPmhhbmRsZSk7CisJfQorCisJcG11X3JlYWRfbXVsdGkoZmRbMF0sIG51 bV9lbmdpbmVzLCB2YWwpOworCWxvZ19idXN5KGZkWzBdLCBudW1fZW5naW5lcywgdmFsKTsKKwor CWZvciAoaSA9IDA7IGkgPCBudW1fZW5naW5lczsgaSsrKSB7CisJCWlmIChpICE9IGlkbGVfaWR4 KQorCQkJaWd0X3NwaW5fYmF0Y2hfZnJlZShnZW1fZmQsIHNwaW5baV0pOworCX0KKwljbG9zZShm ZFswXSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2VuZ2luZXM7IGkrKykgeworCQlpZiAoaSA9 PSBpZGxlX2lkeCkKKwkJCWFzc2VydF93aXRoaW5fZXBzaWxvbih2YWxbaV0sIDAuMGYsIHRvbGVy YW5jZSk7CisJCWVsc2UKKwkJCWFzc2VydF93aXRoaW5fZXBzaWxvbih2YWxbaV0sIGJhdGNoX2R1 cmF0aW9uX25zLAorCQkJCQkgICAgICB0b2xlcmFuY2UpOworCX0KK30KKworc3RhdGljIHZvaWQK K2FsbF9idXN5X2NoZWNrX2FsbChpbnQgZ2VtX2ZkLCBjb25zdCB1bnNpZ25lZCBpbnQgbnVtX2Vu Z2luZXMpCit7CisJY29uc3Qgc3RydWN0IGludGVsX2V4ZWN1dGlvbl9lbmdpbmUyICplOworCXVp bnQ2NF90IHZhbFtudW1fZW5naW5lc107CisJaW50IGZkW251bV9lbmdpbmVzXTsKKwlpZ3Rfc3Bp bl90ICpzcGluW251bV9lbmdpbmVzXTsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWkgPSAwOworCWZk WzBdID0gLTE7CisJZm9yX2VhY2hfZW5naW5lX2NsYXNzX2luc3RhbmNlKGZkLCBlKSB7CisJCWlm ICghZ2VtX2hhc19lbmdpbmUoZ2VtX2ZkLCBlLT5jbGFzcywgZS0+aW5zdGFuY2UpKQorCQkJY29u dGludWU7CisKKwkJZmRbaV0gPSBvcGVuX2dyb3VwKEk5MTVfUE1VX0VOR0lORV9CVVNZKGUtPmNs YXNzLCBlLT5pbnN0YW5jZSksCisJCQkJICAgZmRbMF0pOworCisJCXNwaW5baV0gPSBpZ3Rfc3Bp bl9iYXRjaF9uZXcoZ2VtX2ZkLCAwLCBlMnJpbmcoZ2VtX2ZkLCBlKSwgMCk7CisJCWlndF9zcGlu X2JhdGNoX3NldF90aW1lb3V0KHNwaW5baV0sIGJhdGNoX2R1cmF0aW9uX25zKTsKKworCQlpKys7 CisJfQorCisJZm9yIChpID0gMDsgaSA8IG51bV9lbmdpbmVzOyBpKyspCisJCWdlbV9zeW5jKGdl bV9mZCwgc3BpbltpXS0+aGFuZGxlKTsKKworCXBtdV9yZWFkX211bHRpKGZkWzBdLCBudW1fZW5n aW5lcywgdmFsKTsKKwlsb2dfYnVzeShmZFswXSwgbnVtX2VuZ2luZXMsIHZhbCk7CisKKwlmb3Ig KGkgPSAwOyBpIDwgbnVtX2VuZ2luZXM7IGkrKykKKwkJaWd0X3NwaW5fYmF0Y2hfZnJlZShnZW1f ZmQsIHNwaW5baV0pOworCWNsb3NlKGZkWzBdKTsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fZW5n aW5lczsgaSsrKQorCQlhc3NlcnRfd2l0aGluX2Vwc2lsb24odmFsW2ldLCBiYXRjaF9kdXJhdGlv bl9ucywgdG9sZXJhbmNlKTsKK30KKworc3RhdGljIHZvaWQKK25vX3NlbWEoaW50IGdlbV9mZCwg Y29uc3Qgc3RydWN0IGludGVsX2V4ZWN1dGlvbl9lbmdpbmUyICplLCBib29sIGJ1c3kpCit7CisJ aWd0X3NwaW5fdCAqc3BpbjsKKwl1aW50NjRfdCB2YWxbMl07CisJaW50IGZkOworCisJZmQgPSBv cGVuX2dyb3VwKEk5MTVfUE1VX0VOR0lORV9TRU1BKGUtPmNsYXNzLCBlLT5pbnN0YW5jZSksIC0x KTsKKwlvcGVuX2dyb3VwKEk5MTVfUE1VX0VOR0lORV9XQUlUKGUtPmNsYXNzLCBlLT5pbnN0YW5j ZSksIGZkKTsKKworCWlmIChidXN5KSB7CisJCXNwaW4gPSBpZ3Rfc3Bpbl9iYXRjaF9uZXcoZ2Vt X2ZkLCAwLCBlMnJpbmcoZ2VtX2ZkLCBlKSwgMCk7CisJCWlndF9zcGluX2JhdGNoX3NldF90aW1l b3V0KHNwaW4sIGJhdGNoX2R1cmF0aW9uX25zKTsKKwl9IGVsc2UgeworCQl1c2xlZXAoYmF0Y2hf ZHVyYXRpb25fbnMgLyAxMDAwKTsKKwl9CisKKwlpZiAoYnVzeSkKKwkJZ2VtX3N5bmMoZ2VtX2Zk LCBzcGluLT5oYW5kbGUpOworCisJcG11X3JlYWRfbXVsdGkoZmQsIDIsIHZhbCk7CisKKwlpZiAo YnVzeSkKKwkJaWd0X3NwaW5fYmF0Y2hfZnJlZShnZW1fZmQsIHNwaW4pOworCWNsb3NlKGZkKTsK KworCWFzc2VydF93aXRoaW5fZXBzaWxvbih2YWxbMF0sIDAuMGYsIHRvbGVyYW5jZSk7CisJYXNz ZXJ0X3dpdGhpbl9lcHNpbG9uKHZhbFsxXSwgMC4wZiwgdG9sZXJhbmNlKTsKK30KKworI2RlZmlu ZSBNSV9JTlNUUihvcGNvZGUsIGZsYWdzKSAoKChvcGNvZGUpIDw8IDIzKSB8IChmbGFncykpCisj ZGVmaW5lIE1JX1NFTUFQSE9SRV9XQUlUCU1JX0lOU1RSKDB4MWMsIDIpIC8qIEdFTjgrICovCisj ZGVmaW5lICAgTUlfU0VNQVBIT1JFX1BPTEwJCSgxPDwxNSkKKyNkZWZpbmUgICBNSV9TRU1BUEhP UkVfU0FEX0dURV9TREQJKDE8PDEyKQorCitzdGF0aWMgdm9pZAorc2VtYV93YWl0KGludCBnZW1f ZmQsIGNvbnN0IHN0cnVjdCBpbnRlbF9leGVjdXRpb25fZW5naW5lMiAqZSkKK3sKKwlzdHJ1Y3Qg ZHJtX2k5MTVfZ2VtX3JlbG9jYXRpb25fZW50cnkgcmVsb2MgPSB7IH07CisJc3RydWN0IGRybV9p OTE1X2dlbV9leGVjYnVmZmVyMiBlYiA9IHsgfTsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNf b2JqZWN0MiBvYmpbMl07CisJdWludDMyX3QgYmJfaGFuZGxlLCBvYmpfaGFuZGxlOworCXVuc2ln bmVkIGxvbmcgc2xlcHQ7CisJdWludDMyX3QgKm9ial9wdHI7CisJdWludDMyX3QgYmF0Y2hbNl07 CisJdWludDY0X3QgdmFsWzJdOworCWludCBmZDsKKworCWlndF9yZXF1aXJlKGludGVsX2dlbihp bnRlbF9nZXRfZHJtX2RldmlkKGdlbV9mZCkpID49IDgpOworCisJLyoqCisJICogU2V0dXAgdXAg YSBiYXRjaGJ1ZmZlciB3aXRoIGEgcG9sbGluZyBzZW1hcGhvcmUgd2FpdCBjb21tYW5kIHdoaWNo CisJICogd2lsbCB3YWl0IG9uIGFuIHZhbHVlIGluIGEgc2hhcmVkIGJvIHRvIGNoYW5nZS4gVGhp cyB3YXkgd2UgYXJlIGFibGUKKwkgKiB0byBjb250cm9sIGhvdyBtdWNoIHRpbWUgd2Ugd2lsbCBz cGVuZCBpbiB0aGlzIGJiLgorCSAqLworCisJYmJfaGFuZGxlID0gZ2VtX2NyZWF0ZShnZW1fZmQs IDQwOTYpOworCW9ial9oYW5kbGUgPSBnZW1fY3JlYXRlKGdlbV9mZCwgNDA5Nik7CisKKwlvYmpf cHRyID0gZ2VtX21tYXBfX3djKGdlbV9mZCwgb2JqX2hhbmRsZSwgMCwgNDA5NiwgUFJPVF9XUklU RSk7CisKKwliYXRjaFswXSA9IE1JX1NFTUFQSE9SRV9XQUlUIHwKKwkJICAgTUlfU0VNQVBIT1JF X1BPTEwgfAorCQkgICBNSV9TRU1BUEhPUkVfU0FEX0dURV9TREQ7CisJYmF0Y2hbMV0gPSAxOwor CWJhdGNoWzJdID0gMHgwOworCWJhdGNoWzNdID0gMHgwOworCWJhdGNoWzRdID0gTUlfTk9PUDsK KwliYXRjaFs1XSA9IE1JX0JBVENIX0JVRkZFUl9FTkQ7CisKKwlnZW1fd3JpdGUoZ2VtX2ZkLCBi Yl9oYW5kbGUsIDAsIGJhdGNoLCBzaXplb2YoYmF0Y2gpKTsKKworCXJlbG9jLnRhcmdldF9oYW5k bGUgPSBvYmpfaGFuZGxlOworCXJlbG9jLm9mZnNldCA9IDIgKiBzaXplb2YodWludDMyX3QpOwor CXJlbG9jLnJlYWRfZG9tYWlucyA9IEk5MTVfR0VNX0RPTUFJTl9SRU5ERVI7CisKKwltZW1zZXQo b2JqLCAwLCBzaXplb2Yob2JqKSk7CisKKwlvYmpbMF0uaGFuZGxlID0gb2JqX2hhbmRsZTsKKwor CW9ialsxXS5oYW5kbGUgPSBiYl9oYW5kbGU7CisJb2JqWzFdLnJlbG9jYXRpb25fY291bnQgPSAx OworCW9ialsxXS5yZWxvY3NfcHRyID0gdG9fdXNlcl9wb2ludGVyKCZyZWxvYyk7CisKKwllYi5i dWZmZXJfY291bnQgPSAyOworCWViLmJ1ZmZlcnNfcHRyID0gdG9fdXNlcl9wb2ludGVyKG9iaik7 CisJZWIuZmxhZ3MgPSBlMnJpbmcoZ2VtX2ZkLCBlKTsKKworCS8qKgorCSAqIFN0YXJ0IHRoZSBz ZW1hcGhvcmUgd2FpdCBQTVUgYW5kIGFmdGVyIHNvbWUga25vd24gdGltZSBsZXQgdGhlIGFib3Zl CisJICogc2VtYXBob3JlIHdhaXQgY29tbWFuZCBmaW5pc2guIFRoZW4gY2hlY2sgdGhhdCB0aGUg UE1VIGlzIHJlcG9ydGluZworCSAqIHRvIGV4cGVjdGVkIHRpbWUgc3BlbnQgaW4gc2VtYXBob3Jl IHdhaXQgc3RhdGUuCisJICovCisKKwlmZCA9IG9wZW5fcG11KEk5MTVfUE1VX0VOR0lORV9TRU1B KGUtPmNsYXNzLCBlLT5pbnN0YW5jZSkpOworCisJdmFsWzBdID0gcG11X3JlYWRfc2luZ2xlKGZk KTsKKworCWdlbV9leGVjYnVmKGdlbV9mZCwgJmViKTsKKworCXNsZXB0ID0gbWVhc3VyZWRfdXNs ZWVwKDEwMGUzKTsKKworCSpvYmpfcHRyID0gMTsKKworCWdlbV9zeW5jKGdlbV9mZCwgYmJfaGFu ZGxlKTsKKworCXZhbFsxXSA9IHBtdV9yZWFkX3NpbmdsZShmZCk7CisKKwltdW5tYXAob2JqX3B0 ciwgNDA5Nik7CisJZ2VtX2Nsb3NlKGdlbV9mZCwgb2JqX2hhbmRsZSk7CisJZ2VtX2Nsb3NlKGdl bV9mZCwgYmJfaGFuZGxlKTsKKwljbG9zZShmZCk7CisKKwlhc3NlcnRfd2l0aGluX2Vwc2lsb24o dmFsWzFdIC0gdmFsWzBdLCBzbGVwdCwgdG9sZXJhbmNlKTsKK30KKworI2RlZmluZSAgIE1JX1dB SVRfRk9SX1BJUEVfQ19WQkxBTksgKDE8PDIxKQorI2RlZmluZSAgIE1JX1dBSVRfRk9SX1BJUEVf Ql9WQkxBTksgKDE8PDExKQorI2RlZmluZSAgIE1JX1dBSVRfRk9SX1BJUEVfQV9WQkxBTksgKDE8 PDMpCisKK3R5cGVkZWYgc3RydWN0IHsKKwlpZ3RfZGlzcGxheV90IGRpc3BsYXk7CisJc3RydWN0 IGlndF9mYiBwcmltYXJ5X2ZiOworCWlndF9vdXRwdXRfdCAqb3V0cHV0OworCWVudW0gcGlwZSBw aXBlOworfSBkYXRhX3Q7CisKK3N0YXRpYyB2b2lkIHByZXBhcmVfY3J0YyhkYXRhX3QgKmRhdGEs IGludCBmZCwgaWd0X291dHB1dF90ICpvdXRwdXQpCit7CisJZHJtTW9kZU1vZGVJbmZvICptb2Rl OworCWlndF9kaXNwbGF5X3QgKmRpc3BsYXkgPSAmZGF0YS0+ZGlzcGxheTsKKwlpZ3RfcGxhbmVf dCAqcHJpbWFyeTsKKworCS8qIHNlbGVjdCB0aGUgcGlwZSB3ZSB3YW50IHRvIHVzZSAqLworCWln dF9vdXRwdXRfc2V0X3BpcGUob3V0cHV0LCBkYXRhLT5waXBlKTsKKworCS8qIGNyZWF0ZSBhbmQg c2V0IHRoZSBwcmltYXJ5IHBsYW5lIGZiICovCisJbW9kZSA9IGlndF9vdXRwdXRfZ2V0X21vZGUo b3V0cHV0KTsKKwlpZ3RfY3JlYXRlX2NvbG9yX2ZiKGZkLCBtb2RlLT5oZGlzcGxheSwgbW9kZS0+ dmRpc3BsYXksCisJCQkgICAgRFJNX0ZPUk1BVF9YUkdCODg4OCwKKwkJCSAgICBMT0NBTF9EUk1f Rk9STUFUX01PRF9OT05FLAorCQkJICAgIDAuMCwgMC4wLCAwLjAsCisJCQkgICAgJmRhdGEtPnBy aW1hcnlfZmIpOworCisJcHJpbWFyeSA9IGlndF9vdXRwdXRfZ2V0X3BsYW5lX3R5cGUob3V0cHV0 LCBEUk1fUExBTkVfVFlQRV9QUklNQVJZKTsKKwlpZ3RfcGxhbmVfc2V0X2ZiKHByaW1hcnksICZk YXRhLT5wcmltYXJ5X2ZiKTsKKworCWlndF9kaXNwbGF5X2NvbW1pdChkaXNwbGF5KTsKKworCWln dF93YWl0X2Zvcl92YmxhbmsoZmQsIGRhdGEtPnBpcGUpOworfQorCitzdGF0aWMgdm9pZCBjbGVh bnVwX2NydGMoZGF0YV90ICpkYXRhLCBpbnQgZmQsIGlndF9vdXRwdXRfdCAqb3V0cHV0KQorewor CWlndF9kaXNwbGF5X3QgKmRpc3BsYXkgPSAmZGF0YS0+ZGlzcGxheTsKKwlpZ3RfcGxhbmVfdCAq cHJpbWFyeTsKKworCWlndF9yZW1vdmVfZmIoZmQsICZkYXRhLT5wcmltYXJ5X2ZiKTsKKworCXBy aW1hcnkgPSBpZ3Rfb3V0cHV0X2dldF9wbGFuZV90eXBlKG91dHB1dCwgRFJNX1BMQU5FX1RZUEVf UFJJTUFSWSk7CisJaWd0X3BsYW5lX3NldF9mYihwcmltYXJ5LCBOVUxMKTsKKworCWlndF9vdXRw dXRfc2V0X3BpcGUob3V0cHV0LCBQSVBFX0FOWSk7CisJaWd0X2Rpc3BsYXlfY29tbWl0KGRpc3Bs YXkpOworfQorCitzdGF0aWMgaW50IHdhaXRfdmJsYW5rKGludCBmZCwgdW5pb24gZHJtX3dhaXRf dmJsYW5rICp2YmwpCit7CisJaW50IGVycjsKKworCWVyciA9IDA7CisJaWYgKGlndF9pb2N0bChm ZCwgRFJNX0lPQ1RMX1dBSVRfVkJMQU5LLCB2YmwpKQorCQllcnIgPSAtZXJybm87CisKKwlyZXR1 cm4gZXJyOworfQorCitzdGF0aWMgdm9pZAorZXZlbnRfd2FpdChpbnQgZ2VtX2ZkLCBjb25zdCBz dHJ1Y3QgaW50ZWxfZXhlY3V0aW9uX2VuZ2luZTIgKmUpCit7CisJc3RydWN0IGRybV9pOTE1X2dl bV9leGVjX29iamVjdDIgb2JqID0geyB9OworCXN0cnVjdCBkcm1faTkxNV9nZW1fZXhlY2J1ZmZl cjIgZWIgPSB7IH07CisJZGF0YV90IGRhdGE7CisJaWd0X2Rpc3BsYXlfdCAqZGlzcGxheSA9ICZk YXRhLmRpc3BsYXk7CisJY29uc3QgdWludDMyX3QgREVSUk1SID0gMHg0NDA1MDsKKwl1bnNpZ25l ZCBpbnQgdmFsaWRfdGVzdHMgPSAwOworCXVpbnQzMl90IGJhdGNoWzhdLCAqYjsKKwlpZ3Rfb3V0 cHV0X3QgKm91dHB1dDsKKwl1aW50MzJfdCBiYl9oYW5kbGU7CisJdWludDMyX3QgcmVnOworCWVu dW0gcGlwZSBwOworCWludCBmZDsKKworCWlndF9yZXF1aXJlKGludGVsX2dlbihpbnRlbF9nZXRf ZHJtX2RldmlkKGdlbV9mZCkpID49IDYpOworCWlndF9yZXF1aXJlKGludGVsX3JlZ2lzdGVyX2Fj Y2Vzc19pbml0KGludGVsX2dldF9wY2lfZGV2aWNlKCksCisJCQkJCSAgICAgICBmYWxzZSwgZ2Vt X2ZkKSA9PSAwKTsKKworCS8qKgorCSAqIFdlIHdpbGwgdXNlIHRoZSBkaXNwbGF5IHRvIHJlbmRl ciBldmVudCBmb3J3YXJpbmQgc28gbmVlZCB0bworCSAqIHByb2dyYW0gdGhlIERFUlJNUiByZWdp c3RlciBhbmQgcmVzdG9yZSBpdCBhdCBleGl0LgorCSAqCisJICogV2Ugd2lsbCBlbWl0IGEgTUlf V0FJVF9GT1JfRVZFTlQgbGlzdGVuaW5nIGZvciB2YmxhbmsgZXZlbnRzLAorCSAqIGhhdmUgYSBi YWNrZ3JvdW5kIGhlbHBlciB0byBpbmRpcmVjdGx5IGVuYWJsZSB2YmxhbmsgaXJxcywgYW5kCisJ ICogbGlzdGVuIHRvIHRoZSByZWNvcmRlZCB0aW1lIHNwZW50IGluIGVuZ2luZSB3YWl0IHN0YXRl IGFzIHJlcG9ydGVkCisJICogYnkgdGhlIFBNVS4KKwkgKi8KKwlyZWcgPSBpbnRlbF9yZWdpc3Rl cl9yZWFkKERFUlJNUik7CisKKwlrbXN0ZXN0X3NldF92dF9ncmFwaGljc19tb2RlKCk7CisJaWd0 X2Rpc3BsYXlfaW5pdCgmZGF0YS5kaXNwbGF5LCBnZW1fZmQpOworCisJYmJfaGFuZGxlID0gZ2Vt X2NyZWF0ZShnZW1fZmQsIDQwOTYpOworCisJYiA9IGJhdGNoOworCSpiKysgPSBNSV9MT0FEX1JF R0lTVEVSX0lNTTsKKwkqYisrID0gREVSUk1SOworCSpiKysgPSByZWcgJiB+KCgxIDw8IDMpIHwg KDEgPDwgMTEpIHwgKDEgPDwgMjEpKTsKKwkqYisrID0gTUlfV0FJVF9GT1JfRVZFTlQgfCBNSV9X QUlUX0ZPUl9QSVBFX0FfVkJMQU5LOworCSpiKysgPSBNSV9MT0FEX1JFR0lTVEVSX0lNTTsKKwkq YisrID0gREVSUk1SOworCSpiKysgPSByZWc7CisJKmIrKyA9IE1JX0JBVENIX0JVRkZFUl9FTkQ7 CisKKwlvYmouaGFuZGxlID0gYmJfaGFuZGxlOworCisJZWIuYnVmZmVyX2NvdW50ID0gMTsKKwll Yi5idWZmZXJzX3B0ciA9IHRvX3VzZXJfcG9pbnRlcigmb2JqKTsKKwllYi5mbGFncyA9IGUycmlu ZyhnZW1fZmQsIGUpIHwgSTkxNV9FWEVDX1NFQ1VSRTsKKworCWZvcl9lYWNoX3BpcGVfd2l0aF92 YWxpZF9vdXRwdXQoZGlzcGxheSwgcCwgb3V0cHV0KSB7CisJCXN0cnVjdCBpZ3RfaGVscGVyX3By b2Nlc3Mgd2FpdGVyID0geyB9OworCQljb25zdCB1bnNpZ25lZCBpbnQgZnJhbWVzID0gMzsKKwkJ dW5zaWduZWQgaW50IGZyYW1lOworCQl1aW50NjRfdCB2YWxbMl07CisKKwkJYmF0Y2hbM10gPSBN SV9XQUlUX0ZPUl9FVkVOVDsKKwkJc3dpdGNoIChwKSB7CisJCWNhc2UgUElQRV9BOgorCQkJYmF0 Y2hbM10gfD0gTUlfV0FJVF9GT1JfUElQRV9BX1ZCTEFOSzsKKwkJCWJyZWFrOworCQljYXNlIFBJ UEVfQjoKKwkJCWJhdGNoWzNdIHw9IE1JX1dBSVRfRk9SX1BJUEVfQl9WQkxBTks7CisJCQlicmVh azsKKwkJY2FzZSBQSVBFX0M6CisJCQliYXRjaFszXSB8PSBNSV9XQUlUX0ZPUl9QSVBFX0NfVkJM QU5LOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQljb250aW51ZTsKKwkJfQorCisJCWdlbV93 cml0ZShnZW1fZmQsIGJiX2hhbmRsZSwgMCwgYmF0Y2gsIHNpemVvZihiYXRjaCkpOworCisJCWRh dGEucGlwZSA9IHA7CisJCXByZXBhcmVfY3J0YygmZGF0YSwgZ2VtX2ZkLCBvdXRwdXQpOworCisJ CWZkID0gb3Blbl9wbXUoSTkxNV9QTVVfRU5HSU5FX1dBSVQoZS0+Y2xhc3MsIGUtPmluc3RhbmNl KSk7CisKKwkJdmFsWzBdID0gcG11X3JlYWRfc2luZ2xlKGZkKTsKKworCQlpZ3RfZm9ya19oZWxw ZXIoJndhaXRlcikgeworCQkJY29uc3QgdWludDMyX3QgcGlwZV9pZF9mbGFnID0KKwkJCQkJa21z dGVzdF9nZXRfdmJsX2ZsYWcoZGF0YS5waXBlKTsKKworCQkJZm9yICg7OykgeworCQkJCXVuaW9u IGRybV93YWl0X3ZibGFuayB2YmwgPSB7IH07CisKKwkJCQl2YmwucmVxdWVzdC50eXBlID0gRFJN X1ZCTEFOS19SRUxBVElWRTsKKwkJCQl2YmwucmVxdWVzdC50eXBlIHw9IHBpcGVfaWRfZmxhZzsK KwkJCQl2YmwucmVxdWVzdC5zZXF1ZW5jZSA9IDE7CisJCQkJaWd0X2Fzc2VydF9lcSh3YWl0X3Zi bGFuayhnZW1fZmQsICZ2YmwpLCAwKTsKKwkJCX0KKwkJfQorCisJCWZvciAoZnJhbWUgPSAwOyBm cmFtZSA8IGZyYW1lczsgZnJhbWUrKykgeworCQkJZ2VtX2V4ZWNidWYoZ2VtX2ZkLCAmZWIpOwor CQkJZ2VtX3N5bmMoZ2VtX2ZkLCBiYl9oYW5kbGUpOworCQl9CisKKwkJaWd0X3N0b3BfaGVscGVy KCZ3YWl0ZXIpOworCisJCXZhbFsxXSA9IHBtdV9yZWFkX3NpbmdsZShmZCk7CisKKwkJY2xvc2Uo ZmQpOworCisJCWNsZWFudXBfY3J0YygmZGF0YSwgZ2VtX2ZkLCBvdXRwdXQpOworCQl2YWxpZF90 ZXN0cysrOworCisJCWlndF9hc3NlcnQodmFsWzFdIC0gdmFsWzBdID4gMCk7CisJfQorCisJZ2Vt X2Nsb3NlKGdlbV9mZCwgYmJfaGFuZGxlKTsKKworCWludGVsX3JlZ2lzdGVyX2FjY2Vzc19maW5p KCk7CisKKwlpZ3RfcmVxdWlyZV9mKHZhbGlkX3Rlc3RzLAorCQkgICAgICAibm8gdmFsaWQgY3J0 Yy9jb25uZWN0b3IgY29tYmluYXRpb25zIGZvdW5kXG4iKTsKK30KKworc3RhdGljIHZvaWQKK211 bHRpX2NsaWVudChpbnQgZ2VtX2ZkLCBjb25zdCBzdHJ1Y3QgaW50ZWxfZXhlY3V0aW9uX2VuZ2lu ZTIgKmUpCit7CisJdWludDY0X3QgY29uZmlnID0gSTkxNV9QTVVfRU5HSU5FX0JVU1koZS0+Y2xh c3MsIGUtPmluc3RhbmNlKTsKKwl1bnNpZ25lZCBpbnQgc2xlcHQ7CisJaWd0X3NwaW5fdCAqc3Bp bjsKKwl1aW50NjRfdCB2YWxbMl07CisJaW50IGZkWzJdOworCisJZmRbMF0gPSBvcGVuX3BtdShj b25maWcpOworCisJLyoKKwkgKiBTZWNvbmQgUE1VIGNsaWVudCB3aGljaCBpcyBpbml0aWFsaXpl ZCBhZnRlciB0aGUgZmlyc3Qgb25lLAorCSAqIGFuZCBleGlzdHMgYmVmb3JlIGl0LCBzaG91bGQg bm90IGFmZmVjdCBhY2NvdW50aW5nIGFzIHJlcG9ydGVkCisJICogaW4gdGhlIGZpcnN0IGNsaWVu dC4KKwkgKi8KKwlmZFsxXSA9IG9wZW5fcG11KGNvbmZpZyk7CisKKwlzcGluID0gaWd0X3NwaW5f YmF0Y2hfbmV3KGdlbV9mZCwgMCwgZTJyaW5nKGdlbV9mZCwgZSksIDApOworCWlndF9zcGluX2Jh dGNoX3NldF90aW1lb3V0KHNwaW4sIGJhdGNoX2R1cmF0aW9uX25zKTsKKworCXNsZXB0ID0gbWVh c3VyZWRfdXNsZWVwKGJhdGNoX2R1cmF0aW9uX25zIC8gMzAwMCk7CisJdmFsWzFdID0gcG11X3Jl YWRfc2luZ2xlKGZkWzFdKTsKKwljbG9zZShmZFsxXSk7CisKKwlnZW1fc3luYyhnZW1fZmQsIHNw aW4tPmhhbmRsZSk7CisKKwl2YWxbMF0gPSBwbXVfcmVhZF9zaW5nbGUoZmRbMF0pOworCisJaWd0 X3NwaW5fYmF0Y2hfZnJlZShnZW1fZmQsIHNwaW4pOworCWNsb3NlKGZkWzBdKTsKKworCWFzc2Vy dF93aXRoaW5fZXBzaWxvbih2YWxbMF0sIGJhdGNoX2R1cmF0aW9uX25zLCB0b2xlcmFuY2UpOwor CWFzc2VydF93aXRoaW5fZXBzaWxvbih2YWxbMV0sIHNsZXB0LCB0b2xlcmFuY2UpOworfQorCisv KioKKyAqIFRlc3RzIHRoYXQgaTkxNSBQTVUgY29yZWN0bHkgZXJyb3JzIG91dCBpbiBpbnZhbGlk IGluaXRpYWxpemF0aW9uLgorICogaTkxNSBQTVUgaXMgdW5jb3JlIFBNVSwgdGh1czoKKyAqICAt IHNhbXBsaW5nIHBlcmlvZCBpcyBub3Qgc3VwcG9ydGVkCisgKiAgLSBwaWQgPiAwIGlzIG5vdCBz dXBwb3J0ZWQgc2luY2Ugd2UgY2FuJ3QgY291bnQgcGVyLXByb2Nlc3MgKHdlIGNvdW50CisgKiAg ICBwZXIgd2hvbGUgc3lzdGVtKQorICogIC0gY3B1ICE9IDAgaXMgbm90IHN1cHBvcnRlZCBzaW5j ZSBpOTE1IFBNVSBleHBvc2VzIGNwdW1hc2sgZm9yIENQVTAKKyAqLworc3RhdGljIHZvaWQgaW52 YWxpZF9pbml0KHZvaWQpCit7CisJc3RydWN0IHBlcmZfZXZlbnRfYXR0ciBhdHRyOworCWludCBw aWQsIGNwdTsKKworI2RlZmluZSBBVFRSX0lOSVQoKSBcCitkbyB7IFwKKwltZW1zZXQoJmF0dHIs IDAsIHNpemVvZiAoYXR0cikpOyBcCisJYXR0ci5jb25maWcgPSBJOTE1X1BNVV9FTkdJTkVfQlVT WShJOTE1X0VOR0lORV9DTEFTU19SRU5ERVIsIDApOyBcCisJYXR0ci50eXBlID0gaTkxNV90eXBl X2lkKCk7IFwKKwlpZ3RfYXNzZXJ0KGF0dHIudHlwZSAhPSAwKTsgXAorfSB3aGlsZSgwKQorCisJ QVRUUl9JTklUKCk7CisJYXR0ci5zYW1wbGVfcGVyaW9kID0gMTAwOworCXBpZCA9IC0xOworCWNw dSA9IDA7CisJaWd0X2Fzc2VydF9lcShwZXJmX2V2ZW50X29wZW4oJmF0dHIsIHBpZCwgY3B1LCAt MSwgMCksIC0xKTsKKwlpZ3RfYXNzZXJ0X2VxKGVycm5vLCBFSU5WQUwpOworCisJQVRUUl9JTklU KCk7CisJcGlkID0gMDsKKwljcHUgPSAwOworCWlndF9hc3NlcnRfZXEocGVyZl9ldmVudF9vcGVu KCZhdHRyLCBwaWQsIGNwdSwgLTEsIDApLCAtMSk7CisJaWd0X2Fzc2VydF9lcShlcnJubywgRUlO VkFMKTsKKworCUFUVFJfSU5JVCgpOworCXBpZCA9IC0xOworCWNwdSA9IDE7CisJaWd0X2Fzc2Vy dF9lcShwZXJmX2V2ZW50X29wZW4oJmF0dHIsIHBpZCwgY3B1LCAtMSwgMCksIC0xKTsKKwlpZ3Rf YXNzZXJ0X2VxKGVycm5vLCBFTk9ERVYpOworfQorCitzdGF0aWMgdm9pZCBpbml0X290aGVyKHVu c2lnbmVkIGludCBpLCBib29sIHZhbGlkKQoreworCWludCBmZDsKKworCWZkID0gcGVyZl9pOTE1 X29wZW4oX19JOTE1X1BNVV9PVEhFUihpKSk7CisJaWd0X3JlcXVpcmUoIShmZCA8IDAgJiYgZXJy bm8gPT0gRU5PREVWKSk7CisJaWYgKHZhbGlkKSB7CisJCWlndF9hc3NlcnQoZmQgPj0gMCk7CisJ fSBlbHNlIHsKKwkJaWd0X2Fzc2VydChmZCA8IDApOworCQlyZXR1cm47CisJfQorCisJY2xvc2Uo ZmQpOworfQorCitzdGF0aWMgdm9pZCByZWFkX290aGVyKHVuc2lnbmVkIGludCBpLCBib29sIHZh bGlkKQoreworCWludCBmZDsKKworCWZkID0gcGVyZl9pOTE1X29wZW4oX19JOTE1X1BNVV9PVEhF UihpKSk7CisJaWd0X3JlcXVpcmUoIShmZCA8IDAgJiYgZXJybm8gPT0gRU5PREVWKSk7CisJaWYg KHZhbGlkKSB7CisJCWlndF9hc3NlcnQoZmQgPj0gMCk7CisJfSBlbHNlIHsKKwkJaWd0X2Fzc2Vy dChmZCA8IDApOworCQlyZXR1cm47CisJfQorCisJKHZvaWQpcG11X3JlYWRfc2luZ2xlKGZkKTsK KworCWNsb3NlKGZkKTsKK30KKworc3RhdGljIGJvb2wgY3B1MF9ob3RwbHVnX3N1cHBvcnQodm9p ZCkKK3sKKwlyZXR1cm4gYWNjZXNzKCIvc3lzL2RldmljZXMvc3lzdGVtL2NwdS9jcHUwL29ubGlu ZSIsIFdfT0spID09IDA7Cit9CisKK3N0YXRpYyB2b2lkIGNwdV9ob3RwbHVnKGludCBnZW1fZmQp Cit7CisJc3RydWN0IHRpbWVzcGVjIHN0YXJ0ID0geyB9OworCWlndF9zcGluX3QgKnNwaW47CisJ dWludDY0X3QgdmFsLCByZWY7CisJaW50IGZkOworCisJaWd0X3JlcXVpcmUoY3B1MF9ob3RwbHVn X3N1cHBvcnQoKSk7CisKKwlmZCA9IHBlcmZfaTkxNV9vcGVuKEk5MTVfUE1VX0VOR0lORV9CVVNZ KEk5MTVfRU5HSU5FX0NMQVNTX1JFTkRFUiwgMCkpOworCWlndF9hc3NlcnQoZmQgPj0gMCk7CisK KwlzcGluID0gaWd0X3NwaW5fYmF0Y2hfbmV3KGdlbV9mZCwgMCwgSTkxNV9FWEVDX1JFTkRFUiwg MCk7CisKKwlpZ3RfbnNlY19lbGFwc2VkKCZzdGFydCk7CisKKwkvKgorCSAqIFRvZ2dsZSBvbmxp bmUgc3RhdHVzIG9mIGFsbCB0aGUgQ1BVcyBpbiBhIGNoaWxkIHByb2Nlc3MgYW5kIGVuc3VyZQor CSAqIHRoaXMgaGFzIG5vdCBhZmZlY3RlZCBidXN5bmVzcyBzdGF0cyBpbiB0aGUgcGFyZW50Lgor CSAqLworCWlndF9mb3JrKGNoaWxkLCAxKSB7CisJCWludCBjcHUgPSAwOworCisJCWZvciAoOzsp IHsKKwkJCWNoYXIgbmFtZVsxMjhdOworCQkJaW50IGNwdWZkOworCisJCQlzcHJpbnRmKG5hbWUs ICIvc3lzL2RldmljZXMvc3lzdGVtL2NwdS9jcHUlZC9vbmxpbmUiLAorCQkJCWNwdSk7CisJCQlj cHVmZCA9IG9wZW4obmFtZSwgT19XUk9OTFkpOworCQkJaWYgKGNwdWZkID09IC0xKSB7CisJCQkJ aWd0X2Fzc2VydChjcHUgPiAwKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlndF9hc3NlcnRfZXEo d3JpdGUoY3B1ZmQsICIwIiwgMiksIDIpOworCisJCQl1c2xlZXAoMWU2KTsKKworCQkJaWd0X2Fz c2VydF9lcSh3cml0ZShjcHVmZCwgIjEiLCAyKSwgMik7CisKKwkJCWNsb3NlKGNwdWZkKTsKKwkJ CWNwdSsrOworCQl9CisJfQorCisJaWd0X3dhaXRjaGlsZHJlbigpOworCisJaWd0X3NwaW5fYmF0 Y2hfZW5kKHNwaW4pOworCWdlbV9zeW5jKGdlbV9mZCwgc3Bpbi0+aGFuZGxlKTsKKworCXJlZiA9 IGlndF9uc2VjX2VsYXBzZWQoJnN0YXJ0KTsKKwl2YWwgPSBwbXVfcmVhZF9zaW5nbGUoZmQpOwor CisJaWd0X3NwaW5fYmF0Y2hfZnJlZShnZW1fZmQsIHNwaW4pOworCWNsb3NlKGZkKTsKKworCWFz c2VydF93aXRoaW5fZXBzaWxvbih2YWwsIHJlZiwgdG9sZXJhbmNlKTsKK30KKworc3RhdGljIHVu c2lnbmVkIGxvbmcgY2FsaWJyYXRlX25vcChpbnQgZmQsIGNvbnN0IHVuc2lnbmVkIGludCBjYWxp YnJhdGlvbl91cykKK3sKKwljb25zdCB1bnNpZ25lZCBpbnQgY2FsX21pbl91cyA9IGNhbGlicmF0 aW9uX3VzICogMzsKKwljb25zdCB1bnNpZ25lZCBpbnQgdG9sZXJhbmNlX3BjdCA9IDEwOworCWNv bnN0IHVpbnQzMl90IGJiZSA9IE1JX0JBVENIX0JVRkZFUl9FTkQ7CisJY29uc3QgdW5zaWduZWQg aW50IGxvb3BzID0gMTc7CisJc3RydWN0IGRybV9pOTE1X2dlbV9leGVjX29iamVjdDIgb2JqID0g e307CisJc3RydWN0IGRybV9pOTE1X2dlbV9leGVjYnVmZmVyMiBlYiA9CisJCXsgLmJ1ZmZlcl9j b3VudCA9IDEsIC5idWZmZXJzX3B0ciA9ICh1aW50cHRyX3QpJm9ian07CisJc3RydWN0IHRpbWVz cGVjIHRfYmVnaW4gPSB7IH07CisJbG9uZyBzaXplLCBsYXN0X3NpemU7CisJdW5zaWduZWQgbG9u ZyBuczsKKworCWlndF9uc2VjX2VsYXBzZWQoJnRfYmVnaW4pOworCisJc2l6ZSA9IDI1NiAqIDEw MjQ7CisJZG8geworCQlzdHJ1Y3QgdGltZXNwZWMgdF9zdGFydCA9IHsgfTsKKworCQlvYmouaGFu ZGxlID0gZ2VtX2NyZWF0ZShmZCwgc2l6ZSk7CisJCWdlbV93cml0ZShmZCwgb2JqLmhhbmRsZSwg c2l6ZSAtIHNpemVvZihiYmUpLCAmYmJlLAorCQkJICBzaXplb2YoYmJlKSk7CisJCWdlbV9leGVj YnVmKGZkLCAmZWIpOworCQlnZW1fc3luYyhmZCwgb2JqLmhhbmRsZSk7CisKKwkJaWd0X25zZWNf ZWxhcHNlZCgmdF9zdGFydCk7CisKKwkJZm9yIChpbnQgbG9vcCA9IDA7IGxvb3AgPCBsb29wczsg bG9vcCsrKQorCQkJZ2VtX2V4ZWNidWYoZmQsICZlYik7CisJCWdlbV9zeW5jKGZkLCBvYmouaGFu ZGxlKTsKKworCQlucyA9IGlndF9uc2VjX2VsYXBzZWQoJnRfc3RhcnQpOworCisJCWdlbV9jbG9z ZShmZCwgb2JqLmhhbmRsZSk7CisKKwkJbGFzdF9zaXplID0gc2l6ZTsKKwkJc2l6ZSA9IGNhbGli cmF0aW9uX3VzICogMTAwMCAqIHNpemUgKiBsb29wcyAvIG5zOworCQlzaXplID0gQUxJR04oc2l6 ZSwgc2l6ZW9mKHVpbnQzMl90KSk7CisJfSB3aGlsZSAoaWd0X25zZWNfZWxhcHNlZCgmdF9iZWdp bikgLyAxMDAwIDwgY2FsX21pbl91cyB8fAorCQkgYWJzKHNpemUgLSBsYXN0X3NpemUpID4gKHNp emUgKiB0b2xlcmFuY2VfcGN0IC8gMTAwKSk7CisKKwlyZXR1cm4gc2l6ZSAvIHNpemVvZih1aW50 MzJfdCk7Cit9CisKK3N0YXRpYyB2b2lkIGV4ZWNfbm9wKGludCBnZW1fZmQsIHVuc2lnbmVkIGxv bmcgc3opCit7CisJc3RydWN0IGRybV9pOTE1X2dlbV9leGVjX29iamVjdDIgb2JqID0ge307CisJ c3RydWN0IGRybV9pOTE1X2dlbV9leGVjYnVmZmVyMiBlYiA9CisJCXsgLmJ1ZmZlcl9jb3VudCA9 IDEsIC5idWZmZXJzX3B0ciA9ICh1aW50cHRyX3QpJm9ian07CisJY29uc3QgdWludDMyX3QgYmJl ID0gTUlfQkFUQ0hfQlVGRkVSX0VORDsKKwlzdHJ1Y3QgcG9sbGZkIHBmZDsKKwlpbnQgZmVuY2U7 CisKKwlzeiA9IEFMSUdOKHN6LCBzaXplb2YodWludDMyX3QpKTsKKworCW9iai5oYW5kbGUgPSBn ZW1fY3JlYXRlKGdlbV9mZCwgc3opOworCWdlbV93cml0ZShnZW1fZmQsIG9iai5oYW5kbGUsIHN6 IC0gc2l6ZW9mKGJiZSksICZiYmUsIHNpemVvZihiYmUpKTsKKworCWViLmZsYWdzID0gSTkxNV9F WEVDX1JFTkRFUiB8IEk5MTVfRVhFQ19GRU5DRV9PVVQ7CisKKwlnZW1fZXhlY2J1Zl93cihnZW1f ZmQsICZlYik7CisJZmVuY2UgPSBlYi5yc3ZkMiA+PiAzMjsKKworCS8qCisJICogUG9sbCBvbiB0 aGUgb3V0cHV0IGZlbmNlIHRvIGVuc3VyZSB1c2VyIGludGVycnVwdHMgd2lsbCBiZQorCSAqIGdl bmVyYXRlZCBhbmQgbGlzdGVuZWQgdG8uCisJICovCisJcGZkLmZkID0gZmVuY2U7CisJcGZkLmV2 ZW50cyA9IFBPTExJTjsKKwlpZ3RfYXNzZXJ0X2VxKHBvbGwoJnBmZCwgMSwgLTEpLCAxKTsKKwor CWNsb3NlKGZlbmNlKTsKKwlnZW1fY2xvc2UoZ2VtX2ZkLCBvYmouaGFuZGxlKTsKK30KKworc3Rh dGljIHZvaWQKK3Rlc3RfaW50ZXJydXB0cyhpbnQgZ2VtX2ZkKQoreworCWNvbnN0IHVuc2lnbmVk IGludCBjYWxpYnJhdGlvbl91cyA9IDI1MDAwMDsKKwljb25zdCB1bnNpZ25lZCBpbnQgYmF0Y2hf bGVuX3VzID0gMTAwMDAwOworCWNvbnN0IHVuc2lnbmVkIGludCBiYXRjaF9jb3VudCA9IDNlNiAv IGJhdGNoX2xlbl91czsKKwl1aW50NjRfdCBpZGxlLCBidXN5LCBwcmV2OworCXVuc2lnbmVkIGxv bmcgY2FsLCBzejsKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgZmQ7CisKKwljYWwgPSBjYWxpYnJh dGVfbm9wKGdlbV9mZCwgY2FsaWJyYXRpb25fdXMpOworCXN6ID0gYmF0Y2hfbGVuX3VzICogY2Fs IC8gY2FsaWJyYXRpb25fdXM7CisKKwlmZCA9IG9wZW5fcG11KEk5MTVfUE1VX0lOVEVSUlVQVFMp OworCisJZ2VtX3F1aWVzY2VudF9ncHUoZ2VtX2ZkKTsKKworCS8qIFdhaXQgZm9yIGlkbGUgc3Rh dGUuICovCisJcHJldiA9IHBtdV9yZWFkX3NpbmdsZShmZCk7CisJaWRsZSA9IHByZXYgKyAxOwor CXdoaWxlIChpZGxlICE9IHByZXYpIHsKKwkJdXNsZWVwKDFlNik7CisJCXByZXYgPSBpZGxlOwor CQlpZGxlID0gcG11X3JlYWRfc2luZ2xlKGZkKTsKKwl9CisKKwlpZ3RfYXNzZXJ0X2VxKGlkbGUg LSBwcmV2LCAwKTsKKworCS8qCisJICogU2VuZCBzb21lIG5vLW9wIGJhdGNoZXMgd2FpdGluZyBv biBvdXRwdXQgZmVuY2VzIHRvCisJICogZW5zdXJlIGludGVycnVwdHMuCisJICovCisJZm9yIChp ID0gMDsgaSA8IGJhdGNoX2NvdW50OyBpKyspCisJCWV4ZWNfbm9wKGdlbV9mZCwgc3opOworCisJ LyogQ2hlY2sgYXQgbGVhc3QgYXMgbWFueSBpbnRlcnJ1cHRzIGhhcyBiZWVuIGdlbmVyYXRlZC4g Ki8KKwlidXN5ID0gcG11X3JlYWRfc2luZ2xlKGZkKSAtIGlkbGU7CisJY2xvc2UoZmQpOworCisJ aWd0X2Fzc2VydChidXN5ID49IGJhdGNoX2NvdW50KTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3Rf ZnJlcXVlbmN5KGludCBnZW1fZmQpCit7CisJY29uc3QgdWludDY0X3QgZHVyYXRpb25fbnMgPSAy ZTk7CisJdWludDMyX3QgbWluX2ZyZXEsIG1heF9mcmVxLCBib29zdF9mcmVxOworCXVpbnQ2NF90 IG1pblsyXSwgbWF4WzJdLCBzdGFydFsyXTsKKwlpZ3Rfc3Bpbl90ICpzcGluOworCWludCBmZCwg c3lzZnM7CisKKwlzeXNmcyA9IGlndF9zeXNmc19vcGVuKGdlbV9mZCwgTlVMTCk7CisJaWd0X3Jl cXVpcmUoc3lzZnMgPj0gMCk7CisKKwltaW5fZnJlcSA9IGlndF9zeXNmc19nZXRfdTMyKHN5c2Zz LCAiZ3RfUlBuX2ZyZXFfbWh6Iik7CisJbWF4X2ZyZXEgPSBpZ3Rfc3lzZnNfZ2V0X3UzMihzeXNm cywgImd0X1JQMF9mcmVxX21oeiIpOworCWJvb3N0X2ZyZXEgPSBpZ3Rfc3lzZnNfZ2V0X3UzMihz eXNmcywgImd0X2Jvb3N0X2ZyZXFfbWh6Iik7CisJaWd0X3JlcXVpcmUobWluX2ZyZXEgPiAwICYm IG1heF9mcmVxID4gMCAmJiBib29zdF9mcmVxID4gMCk7CisJaWd0X3JlcXVpcmUobWF4X2ZyZXEg PiBtaW5fZnJlcSk7CisJaWd0X3JlcXVpcmUoYm9vc3RfZnJlcSA+IG1pbl9mcmVxKTsKKworCWZk ID0gb3Blbl9ncm91cChJOTE1X1BNVV9SRVFVRVNURURfRlJFUVVFTkNZLCAtMSk7CisJb3Blbl9n cm91cChJOTE1X1BNVV9BQ1RVQUxfRlJFUVVFTkNZLCBmZCk7CisKKwkvKgorCSAqIFNldCBHUFUg dG8gbWluIGZyZXF1ZW5jeSBhbmQgcmVhZCBQTVUgY291bnRlcnMuCisJICovCisJaWd0X3JlcXVp cmUoaWd0X3N5c2ZzX3NldF91MzIoc3lzZnMsICJndF9tYXhfZnJlcV9taHoiLCBtaW5fZnJlcSkp OworCWlndF9yZXF1aXJlKGlndF9zeXNmc19nZXRfdTMyKHN5c2ZzLCAiZ3RfbWF4X2ZyZXFfbWh6 IikgPT0gbWluX2ZyZXEpOworCWlndF9yZXF1aXJlKGlndF9zeXNmc19zZXRfdTMyKHN5c2ZzLCAi Z3RfYm9vc3RfZnJlcV9taHoiLCBtaW5fZnJlcSkpOworCWlndF9yZXF1aXJlKGlndF9zeXNmc19n ZXRfdTMyKHN5c2ZzLCAiZ3RfYm9vc3RfZnJlcV9taHoiKSA9PSBtaW5fZnJlcSk7CisKKwlwbXVf cmVhZF9tdWx0aShmZCwgMiwgc3RhcnQpOworCisJc3BpbiA9IGlndF9zcGluX2JhdGNoX25ldyhn ZW1fZmQsIDAsIEk5MTVfRVhFQ19SRU5ERVIsIDApOworCWlndF9zcGluX2JhdGNoX3NldF90aW1l b3V0KHNwaW4sIGR1cmF0aW9uX25zKTsKKwlnZW1fc3luYyhnZW1fZmQsIHNwaW4tPmhhbmRsZSk7 CisKKwlwbXVfcmVhZF9tdWx0aShmZCwgMiwgbWluKTsKKwltaW5bMF0gLT0gc3RhcnRbMF07CisJ bWluWzFdIC09IHN0YXJ0WzFdOworCisJaWd0X3NwaW5fYmF0Y2hfZnJlZShnZW1fZmQsIHNwaW4p OworCisJdXNsZWVwKDFlNik7CisKKwkvKgorCSAqIFNldCBHUFUgdG8gbWF4IGZyZXF1ZW5jeSBh bmQgcmVhZCBQTVUgY291bnRlcnMuCisJICovCisJaWd0X3JlcXVpcmUoaWd0X3N5c2ZzX3NldF91 MzIoc3lzZnMsICJndF9tYXhfZnJlcV9taHoiLCBtYXhfZnJlcSkpOworCWlndF9yZXF1aXJlKGln dF9zeXNmc19nZXRfdTMyKHN5c2ZzLCAiZ3RfbWF4X2ZyZXFfbWh6IikgPT0gbWF4X2ZyZXEpOwor CWlndF9yZXF1aXJlKGlndF9zeXNmc19zZXRfdTMyKHN5c2ZzLCAiZ3RfYm9vc3RfZnJlcV9taHoi LCBib29zdF9mcmVxKSk7CisJaWd0X3JlcXVpcmUoaWd0X3N5c2ZzX2dldF91MzIoc3lzZnMsICJn dF9ib29zdF9mcmVxX21oeiIpID09IGJvb3N0X2ZyZXEpOworCisJaWd0X3JlcXVpcmUoaWd0X3N5 c2ZzX3NldF91MzIoc3lzZnMsICJndF9taW5fZnJlcV9taHoiLCBtYXhfZnJlcSkpOworCWlndF9y ZXF1aXJlKGlndF9zeXNmc19nZXRfdTMyKHN5c2ZzLCAiZ3RfbWluX2ZyZXFfbWh6IikgPT0gbWF4 X2ZyZXEpOworCisJcG11X3JlYWRfbXVsdGkoZmQsIDIsIHN0YXJ0KTsKKworCXNwaW4gPSBpZ3Rf c3Bpbl9iYXRjaF9uZXcoZ2VtX2ZkLCAwLCBJOTE1X0VYRUNfUkVOREVSLCAwKTsKKwlpZ3Rfc3Bp bl9iYXRjaF9zZXRfdGltZW91dChzcGluLCBkdXJhdGlvbl9ucyk7CisJZ2VtX3N5bmMoZ2VtX2Zk LCBzcGluLT5oYW5kbGUpOworCisJcG11X3JlYWRfbXVsdGkoZmQsIDIsIG1heCk7CisJbWF4WzBd IC09IHN0YXJ0WzBdOworCW1heFsxXSAtPSBzdGFydFsxXTsKKworCWlndF9zcGluX2JhdGNoX2Zy ZWUoZ2VtX2ZkLCBzcGluKTsKKworCS8qCisJICogUmVzdG9yZSBtaW4vbWF4LgorCSAqLworCWln dF9zeXNmc19zZXRfdTMyKHN5c2ZzLCAiZ3RfbWluX2ZyZXFfbWh6IiwgbWluX2ZyZXEpOworCWlm IChpZ3Rfc3lzZnNfZ2V0X3UzMihzeXNmcywgImd0X21pbl9mcmVxX21oeiIpICE9IG1pbl9mcmVx KQorCQlpZ3Rfd2FybigiVW5hYmxlIHRvIHJlc3RvcmUgbWluIGZyZXF1ZW5jeSB0byBzYXZlZCB2 YWx1ZSBbJXUgTUh6XSwgbm93ICV1IE1IelxuIiwKKwkJCSBtaW5fZnJlcSwgaWd0X3N5c2ZzX2dl dF91MzIoc3lzZnMsICJndF9taW5fZnJlcV9taHoiKSk7CisJY2xvc2UoZmQpOworCisJaWd0X2Fz c2VydChtaW5bMF0gPCBtYXhbMF0pOworCWlndF9hc3NlcnQobWluWzFdIDwgbWF4WzFdKTsKK30K Kworc3RhdGljIHZvaWQKK3Rlc3RfcmM2KGludCBnZW1fZmQpCit7CisJaW50NjRfdCBkdXJhdGlv bl9ucyA9IDJlOTsKKwl1aW50NjRfdCBpZGxlLCBidXN5LCBwcmV2OworCXVuc2lnbmVkIGludCBz bGVwdDsKKwlpbnQgZmQsIGZ3OworCisJZmQgPSBvcGVuX3BtdShJOTE1X1BNVV9SQzZfUkVTSURF TkNZKTsKKworCWdlbV9xdWllc2NlbnRfZ3B1KGdlbV9mZCk7CisJdXNsZWVwKDFlNik7CisKKwkv KiBHbyBpZGxlIGFuZCBjaGVjayBmdWxsIFJDNi4gKi8KKwlwcmV2ID0gcG11X3JlYWRfc2luZ2xl KGZkKTsKKwlzbGVwdCA9IG1lYXN1cmVkX3VzbGVlcChkdXJhdGlvbl9ucyAvIDEwMDApOworCWlk bGUgPSBwbXVfcmVhZF9zaW5nbGUoZmQpOworCisJYXNzZXJ0X3dpdGhpbl9lcHNpbG9uKGlkbGUg LSBwcmV2LCBzbGVwdCwgdG9sZXJhbmNlKTsKKworCS8qIFdha2UgdXAgZGV2aWNlIGFuZCBjaGVj ayBubyBSQzYuICovCisJZncgPSBpZ3Rfb3Blbl9mb3JjZXdha2VfaGFuZGxlKGdlbV9mZCk7CisJ aWd0X2Fzc2VydChmdyA+PSAwKTsKKworCXByZXYgPSBwbXVfcmVhZF9zaW5nbGUoZmQpOworCXVz bGVlcChkdXJhdGlvbl9ucyAvIDEwMDApOworCWJ1c3kgPSBwbXVfcmVhZF9zaW5nbGUoZmQpOwor CisJY2xvc2UoZncpOworCWNsb3NlKGZkKTsKKworCWFzc2VydF93aXRoaW5fZXBzaWxvbihidXN5 IC0gcHJldiwgMC4wLCB0b2xlcmFuY2UpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9yYzZwKGlu dCBnZW1fZmQpCit7CisJaW50NjRfdCBkdXJhdGlvbl9ucyA9IDJlOTsKKwl1bnNpZ25lZCBpbnQg bnVtX3BtdSA9IDE7CisJdWludDY0X3QgaWRsZVszXSwgYnVzeVszXSwgcHJldlszXTsKKwl1bnNp Z25lZCBpbnQgc2xlcHQsIGk7CisJaW50IGZkLCByZXQsIGZ3OworCisJZmQgPSBvcGVuX2dyb3Vw KEk5MTVfUE1VX1JDNl9SRVNJREVOQ1ksIC0xKTsKKwlyZXQgPSBwZXJmX2k5MTVfb3Blbl9ncm91 cChJOTE1X1BNVV9SQzZwX1JFU0lERU5DWSwgZmQpOworCWlmIChyZXQgPiAwKSB7CisJCW51bV9w bXUrKzsKKwkJcmV0ID0gcGVyZl9pOTE1X29wZW5fZ3JvdXAoSTkxNV9QTVVfUkM2cHBfUkVTSURF TkNZLCBmZCk7CisJCWlmIChyZXQgPiAwKQorCQkJbnVtX3BtdSsrOworCX0KKworCWlndF9yZXF1 aXJlKG51bV9wbXUgPT0gMyk7CisKKwlnZW1fcXVpZXNjZW50X2dwdShnZW1fZmQpOworCXVzbGVl cCgxZTYpOworCisJLyogR28gaWRsZSBhbmQgY2hlY2sgZnVsbCBSQzYuICovCisJcG11X3JlYWRf bXVsdGkoZmQsIG51bV9wbXUsIHByZXYpOworCXNsZXB0ID0gbWVhc3VyZWRfdXNsZWVwKGR1cmF0 aW9uX25zIC8gMTAwMCk7CisJcG11X3JlYWRfbXVsdGkoZmQsIG51bV9wbXUsIGlkbGUpOworCisJ Zm9yIChpID0gMDsgaSA8IG51bV9wbXU7IGkrKykKKwkJYXNzZXJ0X3dpdGhpbl9lcHNpbG9uKGlk bGVbaV0gLSBwcmV2W2ldLCBzbGVwdCwgdG9sZXJhbmNlKTsKKworCS8qIFdha2UgdXAgZGV2aWNl IGFuZCBjaGVjayBubyBSQzYuICovCisJZncgPSBpZ3Rfb3Blbl9mb3JjZXdha2VfaGFuZGxlKGdl bV9mZCk7CisJaWd0X2Fzc2VydChmdyA+PSAwKTsKKworCXBtdV9yZWFkX211bHRpKGZkLCBudW1f cG11LCBwcmV2KTsKKwl1c2xlZXAoZHVyYXRpb25fbnMgLyAxMDAwKTsKKwlwbXVfcmVhZF9tdWx0 aShmZCwgbnVtX3BtdSwgYnVzeSk7CisKKwljbG9zZShmdyk7CisJY2xvc2UoZmQpOworCisJZm9y IChpID0gMDsgaSA8IG51bV9wbXU7IGkrKykKKwkJYXNzZXJ0X3dpdGhpbl9lcHNpbG9uKGJ1c3lb aV0gLSBwcmV2W2ldLCAwLjAsIHRvbGVyYW5jZSk7Cit9CisKK2lndF9tYWluCit7CisJY29uc3Qg dW5zaWduZWQgaW50IG51bV9vdGhlcl9tZXRyaWNzID0KKwkJCQlJOTE1X1BNVV9MQVNUIC0gX19J OTE1X1BNVV9PVEhFUigwKSArIDE7CisJdW5zaWduZWQgaW50IG51bV9lbmdpbmVzID0gMDsKKwlp bnQgZmQgPSAtMTsKKwljb25zdCBzdHJ1Y3QgaW50ZWxfZXhlY3V0aW9uX2VuZ2luZTIgKmU7CisJ dW5zaWduZWQgaW50IGk7CisKKwlpZ3RfZml4dHVyZSB7CisJCWZkID0gZHJtX29wZW5fZHJpdmVy X21hc3RlcihEUklWRVJfSU5URUwpOworCisJCWlndF9yZXF1aXJlX2dlbShmZCk7CisJCWlndF9y ZXF1aXJlKGk5MTVfdHlwZV9pZCgpID4gMCk7CisKKwkJZm9yX2VhY2hfZW5naW5lX2NsYXNzX2lu c3RhbmNlKGZkLCBlKSB7CisJCQlpZiAoZ2VtX2hhc19lbmdpbmUoZmQsIGUtPmNsYXNzLCBlLT5p bnN0YW5jZSkpCisJCQkJbnVtX2VuZ2luZXMrKzsKKwkJfQorCX0KKworCS8qKgorCSAqIFRlc3Qg aW52YWxpZCBhY2Nlc3MgdmlhIHBlcmYgQVBJIGlzIHJlamVjdGVkLgorCSAqLworCWlndF9zdWJ0 ZXN0KCJpbnZhbGlkLWluaXQiKQorCQlpbnZhbGlkX2luaXQoKTsKKworCWZvcl9lYWNoX2VuZ2lu ZV9jbGFzc19pbnN0YW5jZShmZCwgZSkgeworCQkvKioKKwkJICogVGVzdCB0aGF0IGEgc2luZ2xl IGVuZ2luZSBtZXRyaWMgY2FuIGJlIGluaXRpYWxpemVkLgorCQkgKi8KKwkJaWd0X3N1YnRlc3Rf ZigiaW5pdC1idXN5LSVzIiwgZS0+bmFtZSkKKwkJCWluaXQoZmQsIGUsIEk5MTVfU0FNUExFX0JV U1kpOworCisJCWlndF9zdWJ0ZXN0X2YoImluaXQtd2FpdC0lcyIsIGUtPm5hbWUpCisJCQlpbml0 KGZkLCBlLCBJOTE1X1NBTVBMRV9XQUlUKTsKKworCQlpZ3Rfc3VidGVzdF9mKCJpbml0LXNlbWEt JXMiLCBlLT5uYW1lKQorCQkJaW5pdChmZCwgZSwgSTkxNV9TQU1QTEVfU0VNQSk7CisKKwkJLyoq CisJCSAqIFRlc3QgdGhhdCBlbmdpbmVzIHNob3cgbm8gbG9hZCB3aGVuIGlkbGUuCisJCSAqLwor CQlpZ3Rfc3VidGVzdF9mKCJpZGxlLSVzIiwgZS0+bmFtZSkKKwkJCXNpbmdsZShmZCwgZSwgZmFs c2UpOworCisJCS8qKgorCQkgKiBUZXN0IHRoYXQgYSBzaW5nbGUgZW5naW5lIHJlcG9ydHMgbG9h ZCBjb3JyZWN0bHkuCisJCSAqLworCQlpZ3Rfc3VidGVzdF9mKCJidXN5LSVzIiwgZS0+bmFtZSkK KwkJCXNpbmdsZShmZCwgZSwgdHJ1ZSk7CisKKwkJLyoqCisJCSAqIFRlc3QgdGhhdCB3aGVuIG9u ZSBlbmdpbmUgaXMgbG9hZGVkIG90aGVyIHJlcG9ydCBubyBsb2FkLgorCQkgKi8KKwkJaWd0X3N1 YnRlc3RfZigiYnVzeS1jaGVjay1hbGwtJXMiLCBlLT5uYW1lKQorCQkJYnVzeV9jaGVja19hbGwo ZmQsIGUsIG51bV9lbmdpbmVzKTsKKworCQkvKioKKwkJICogVGVzdCB0aGF0IHdoZW4gYWxsIGV4 Y2VwdCBvbmUgZW5naW5lIGFyZSBsb2FkZWQgYWxsIGxvYWRzCisJCSAqIGFyZSBjb3JyZWN0bHkg cmVwb3J0ZWQuCisJCSAqLworCQlpZ3Rfc3VidGVzdF9mKCJtb3N0LWJ1c3ktY2hlY2stYWxsLSVz IiwgZS0+bmFtZSkKKwkJCW1vc3RfYnVzeV9jaGVja19hbGwoZmQsIGUsIG51bV9lbmdpbmVzKTsK KworCQkvKioKKwkJICogVGVzdCB0aGF0IHNlbXBob3JlIGNvdW50ZXJzIHJlcG9ydCBubyBhY3Rp dml0eSBvbiBpZGxlCisJCSAqIG9yIGJ1c3kgZW5naW5lcy4KKwkJICovCisJCWlndF9zdWJ0ZXN0 X2YoImlkbGUtbm8tc2VtYXBob3Jlcy0lcyIsIGUtPm5hbWUpCisJCQlub19zZW1hKGZkLCBlLCBm YWxzZSk7CisKKwkJaWd0X3N1YnRlc3RfZigiYnVzeS1uby1zZW1hcGhvcmVzLSVzIiwgZS0+bmFt ZSkKKwkJCW5vX3NlbWEoZmQsIGUsIHRydWUpOworCisJCS8qKgorCQkgKiBUZXN0IHRoYXQgc2Vt YXBob3JlIHdhaXRzIGFyZSBjb3JyZWN0bHkgcmVwb3J0ZWQuCisJCSAqLworCQlpZ3Rfc3VidGVz dF9mKCJzZW1hcGhvcmUtd2FpdC0lcyIsIGUtPm5hbWUpCisJCQlzZW1hX3dhaXQoZmQsIGUpOwor CisJCS8qKgorCQkgKiBUZXN0IHRoYXQgZXZlbnQgd2FpdHMgYXJlIGNvcnJlY3RseSByZXBvcnRl ZC4KKwkJICovCisJCWlmIChlLT5jbGFzcyA9PSBJOTE1X0VOR0lORV9DTEFTU19SRU5ERVIpCisJ CQlpZ3Rfc3VidGVzdF9mKCJldmVudC13YWl0LSVzIiwgZS0+bmFtZSkKKwkJCQlldmVudF93YWl0 KGZkLCBlKTsKKworCQkvKioKKwkJICogQ2hlY2sgdGhhdCB0d28gcGVyZiBjbGllbnRzIGRvIG5v dCBpbmZsdWVuY2UgZWFjaCBvdGhlcnMKKwkJICogb2JzZXJ2YXRpb25zLgorCQkgKi8KKwkJaWd0 X3N1YnRlc3RfZigibXVsdGktY2xpZW50LSVzIiwgZS0+bmFtZSkKKwkJCW11bHRpX2NsaWVudChm ZCwgZSk7CisJfQorCisJLyoqCisJICogVGVzdCB0aGF0IHdoZW4gYWxsIGVuZ2luZXMgYXJlIGxv YWRlZCBhbGwgbG9hZHMgYXJlCisJICogY29ycmVjdGx5IHJlcG9ydGVkLgorCSAqLworCWlndF9z dWJ0ZXN0KCJhbGwtYnVzeS1jaGVjay1hbGwiKQorCQlhbGxfYnVzeV9jaGVja19hbGwoZmQsIG51 bV9lbmdpbmVzKTsKKworCS8qKgorCSAqIFRlc3QgdGhhdCBub24tZW5naW5lIGNvdW50ZXJzIGNh biBiZSBpbml0aWFsaXplZCBhbmQgcmVhZC4gQXBhcnQKKwkgKiBmcm9tIHRoZSBpbnZhbGlkIG1l dHJpYyB3aGljaCBzaG91bGQgZmFpbC4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnVtX290aGVy X21ldHJpY3MgKyAxOyBpKyspIHsKKwkJaWd0X3N1YnRlc3RfZigib3RoZXItaW5pdC0ldSIsIGkp CisJCQlpbml0X290aGVyKGksIGkgPCBudW1fb3RoZXJfbWV0cmljcyk7CisKKwkJaWd0X3N1YnRl c3RfZigib3RoZXItcmVhZC0ldSIsIGkpCisJCQlyZWFkX290aGVyKGksIGkgPCBudW1fb3RoZXJf bWV0cmljcyk7CisJfQorCisJLyoqCisJICogVGVzdCBjb3VudGVycyBhcmUgbm90IGFmZmVjdGVk IGJ5IENQVSBvZmZsaW5lL29ubGluZSBldmVudHMuCisJICovCisJaWd0X3N1YnRlc3QoImNwdS1o b3RwbHVnIikKKwkJY3B1X2hvdHBsdWcoZmQpOworCisJLyoqCisJICogVGVzdCBHUFUgZnJlcXVl bmN5LgorCSAqLworCWlndF9zdWJ0ZXN0KCJmcmVxdWVuY3kiKQorCQl0ZXN0X2ZyZXF1ZW5jeShm ZCk7CisKKwkvKioKKwkgKiBUZXN0IGludGVycnVwdCBjb3VudCByZXBvcnRpbmcuCisJICovCisJ aWd0X3N1YnRlc3QoImludGVycnVwdHMiKQorCQl0ZXN0X2ludGVycnVwdHMoZmQpOworCisJLyoq CisJICogVGVzdCBSQzYgcmVzaWRlbmN5IHJlcG9ydGluZy4KKwkgKi8KKwlpZ3Rfc3VidGVzdCgi cmM2IikKKwkJdGVzdF9yYzYoZmQpOworCisJLyoqCisJICogVGVzdCBSQzZwIHJlc2lkZW5jeSBy ZXBvcnRpbmcuCisJICovCisJaWd0X3N1YnRlc3QoInJjNnAiKQorCQl0ZXN0X3JjNnAoZmQpOwor CisJLyoqCisJICogQ2hlY2sgcmVuZGVyIG5vZGVzIGFyZSBjb3VudGVkLgorCSAqLworCWlndF9z dWJ0ZXN0X2dyb3VwIHsKKwkJaW50IHJlbmRlcl9mZDsKKworCQlpZ3RfZml4dHVyZSB7CisJCQly ZW5kZXJfZmQgPSBkcm1fb3Blbl9kcml2ZXJfcmVuZGVyKERSSVZFUl9JTlRFTCk7CisJCQlpZ3Rf cmVxdWlyZV9nZW0ocmVuZGVyX2ZkKTsKKworCQkJZ2VtX3F1aWVzY2VudF9ncHUoZmQpOworCQl9 CisKKwkJZm9yX2VhY2hfZW5naW5lX2NsYXNzX2luc3RhbmNlKGZkLCBlKSB7CisJCQlpZ3Rfc3Vi dGVzdF9mKCJyZW5kZXItbm9kZS1idXN5LSVzIiwgZS0+bmFtZSkKKwkJCQlzaW5nbGUoZmQsIGUs IHRydWUpOworCQl9CisKKwkJaWd0X2ZpeHR1cmUgeworCQkJY2xvc2UocmVuZGVyX2ZkKTsKKwkJ fQorCX0KK30KLS0gCjIuOS41CgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fXwpJbnRlbC1nZnggbWFpbGluZyBsaXN0CkludGVsLWdmeEBsaXN0cy5mcmVlZGVz a3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9p bnRlbC1nZngK