From mboxrd@z Thu Jan 1 00:00:00 1970 From: Tvrtko Ursulin Subject: [PATCH i-g-t 5/7] tests/perf_pmu: Tests for i915 PMU API Date: Fri, 29 Sep 2017 13:39:37 +0100 Message-ID: <20170929123939.3312-6-tvrtko.ursulin@linux.intel.com> References: <20170929123939.3312-1-tvrtko.ursulin@linux.intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail-wr0-x244.google.com (mail-wr0-x244.google.com [IPv6:2a00:1450:400c:c0c::244]) by gabe.freedesktop.org (Postfix) with ESMTPS id 073586EB01 for ; Fri, 29 Sep 2017 12:39:53 +0000 (UTC) Received: by mail-wr0-x244.google.com with SMTP id k10so1204919wrk.3 for ; Fri, 29 Sep 2017 05:39:52 -0700 (PDT) In-Reply-To: <20170929123939.3312-1-tvrtko.ursulin@linux.intel.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 bmRlciBub2RlIGFzIHdlbGwuCgpTaWduZWQtb2ZmLWJ5OiBUdnJ0a28gVXJzdWxpbiA8dHZydGtv LnVyc3VsaW5AaW50ZWwuY29tPgpDYzogQ2hyaXMgV2lsc29uIDxjaHJpc0BjaHJpcy13aWxzb24u Y28udWs+CkNjOiBEbWl0cnkgUm9nb3poa2luIDxkbWl0cnkudi5yb2dvemhraW5AaW50ZWwuY29t PgotLS0KIGxpYi9pZ3RfZ3QuYyAgICAgICAgICAgfCAgNTAgKysrCiBsaWIvaWd0X2d0LmggICAg ICAgICAgIHwgIDM4ICsrCiBsaWIvaWd0X3BlcmYuaCAgICAgICAgIHwgICA5ICstCiB0ZXN0cy9N YWtlZmlsZS5hbSAgICAgIHwgICAxICsKIHRlc3RzL01ha2VmaWxlLnNvdXJjZXMgfCAgIDEgKwog dGVzdHMvcGVyZl9wbXUuYyAgICAgICB8IDk1NyArKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrCiA2IGZpbGVzIGNoYW5nZWQsIDEwNDggaW5zZXJ0aW9ucygr KSwgOCBkZWxldGlvbnMoLSkKIGNyZWF0ZSBtb2RlIDEwMDY0NCB0ZXN0cy9wZXJmX3BtdS5jCgpk aWZmIC0tZ2l0IGEvbGliL2lndF9ndC5jIGIvbGliL2lndF9ndC5jCmluZGV4IGIzZjNiMzgwOWVl ZS4uNGM3NTgxMWZiMWIzIDEwMDY0NAotLS0gYS9saWIvaWd0X2d0LmMKKysrIGIvbGliL2lndF9n dC5jCkBAIC01NjgsMyArNTY4LDUzIEBAIGJvb2wgZ2VtX2Nhbl9zdG9yZV9kd29yZChpbnQgZmQs IHVuc2lnbmVkIGludCBlbmdpbmUpCiAKIAlyZXR1cm4gdHJ1ZTsKIH0KKworY29uc3Qgc3RydWN0 IGludGVsX2V4ZWN1dGlvbl9lbmdpbmUyIGludGVsX2V4ZWN1dGlvbl9lbmdpbmVzMltdID0gewor CXsgInJjczAiLCBJOTE1X0VOR0lORV9DTEFTU19SRU5ERVIsIDAgfSwKKwl7ICJiY3MwIiwgSTkx NV9FTkdJTkVfQ0xBU1NfQ09QWSwgMCB9LAorCXsgInZjczAiLCBJOTE1X0VOR0lORV9DTEFTU19W SURFTywgMCB9LAorCXsgInZjczEiLCBJOTE1X0VOR0lORV9DTEFTU19WSURFTywgMSB9LAorCXsg InZlY3MwIiwgSTkxNV9FTkdJTkVfQ0xBU1NfVklERU9fRU5IQU5DRSwgMCB9LAorfTsKKwordW5z aWduZWQgaW50CitnZW1fY2xhc3NfaW5zdGFuY2VfdG9fZWJfZmxhZ3MoaW50IGdlbV9mZCwKKwkJ CSAgICAgICBlbnVtIGRybV9pOTE1X2dlbV9lbmdpbmVfY2xhc3MgY2xhc3MsCisJCQkgICAgICAg dW5zaWduZWQgaW50IGluc3RhbmNlKQoreworCWlmIChjbGFzcyAhPSBJOTE1X0VOR0lORV9DTEFT U19WSURFTykKKwkJaWd0X2Fzc2VydChpbnN0YW5jZSA9PSAwKTsKKwllbHNlCisJCWlndF9hc3Nl cnQoaW5zdGFuY2UgPj0gMCAmJiBpbnN0YW5jZSA8PSAxKTsKKworCXN3aXRjaCAoY2xhc3MpIHsK KwljYXNlIEk5MTVfRU5HSU5FX0NMQVNTX1JFTkRFUjoKKwkJcmV0dXJuIEk5MTVfRVhFQ19SRU5E RVI7CisJY2FzZSBJOTE1X0VOR0lORV9DTEFTU19DT1BZOgorCQlyZXR1cm4gSTkxNV9FWEVDX0JM VDsKKwljYXNlIEk5MTVfRU5HSU5FX0NMQVNTX1ZJREVPOgorCQlpZiAoaW5zdGFuY2UgPT0gMCkg eworCQkJaWYgKGdlbV9oYXNfYnNkMihnZW1fZmQpKQorCQkJCXJldHVybiBJOTE1X0VYRUNfQlNE IHwgSTkxNV9FWEVDX0JTRF9SSU5HMTsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gSTkxNV9FWEVDX0JT RDsKKworCQl9IGVsc2UgeworCQkJcmV0dXJuIEk5MTVfRVhFQ19CU0QgfCBJOTE1X0VYRUNfQlNE X1JJTkcyOworCQl9CisJY2FzZSBJOTE1X0VOR0lORV9DTEFTU19WSURFT19FTkhBTkNFOgorCQly ZXR1cm4gSTkxNV9FWEVDX1ZFQk9YOworCWNhc2UgSTkxNV9FTkdJTkVfQ0xBU1NfT1RIRVI6CisJ ZGVmYXVsdDoKKwkJaWd0X2Fzc2VydCgwKTsKKwl9OworfQorCitib29sIGdlbV9oYXNfZW5naW5l KGludCBnZW1fZmQsCisJCSAgICBlbnVtIGRybV9pOTE1X2dlbV9lbmdpbmVfY2xhc3MgY2xhc3Ms CisJCSAgICB1bnNpZ25lZCBpbnQgaW5zdGFuY2UpCit7CisJcmV0dXJuIGdlbV9oYXNfcmluZyhn ZW1fZmQsCisJCQkgICAgZ2VtX2NsYXNzX2luc3RhbmNlX3RvX2ViX2ZsYWdzKGdlbV9mZCwgY2xh c3MsCisJCQkJCQkJICAgaW5zdGFuY2UpKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9pZ3RfZ3QuaCBi L2xpYi9pZ3RfZ3QuaAppbmRleCAyNTc5Y2JkMzdiZTcuLmZiNjdhZTFhN2QxZiAxMDA2NDQKLS0t IGEvbGliL2lndF9ndC5oCisrKyBiL2xpYi9pZ3RfZ3QuaApAQCAtMjUsNiArMjUsNyBAQAogI2Rl ZmluZSBJR1RfR1RfSAogCiAjaW5jbHVkZSAiaWd0X2RlYnVnZnMuaCIKKyNpbmNsdWRlICJpZ3Rf Y29yZS5oIgogCiB2b2lkIGlndF9yZXF1aXJlX2hhbmdfcmluZyhpbnQgZmQsIGludCByaW5nKTsK IApAQCAtODAsNCArODEsNDEgQEAgZXh0ZXJuIGNvbnN0IHN0cnVjdCBpbnRlbF9leGVjdXRpb25f ZW5naW5lIHsKIAogYm9vbCBnZW1fY2FuX3N0b3JlX2R3b3JkKGludCBmZCwgdW5zaWduZWQgaW50 IGVuZ2luZSk7CiAKK2V4dGVybiBjb25zdCBzdHJ1Y3QgaW50ZWxfZXhlY3V0aW9uX2VuZ2luZTIg eworCWNvbnN0IGNoYXIgKm5hbWU7CisJaW50IGNsYXNzOworCWludCBpbnN0YW5jZTsKK30gaW50 ZWxfZXhlY3V0aW9uX2VuZ2luZXMyW107CisKKyNkZWZpbmUgZm9yX2VhY2hfZW5naW5lX2NsYXNz X2luc3RhbmNlKGZkX18sIGVfXykgXAorCWZvciAoKGVfXykgPSBpbnRlbF9leGVjdXRpb25fZW5n aW5lczI7XAorCSAgICAgKGVfXyktPm5hbWU7IFwKKwkgICAgIChlX18pKyspCisKK2VudW0gZHJt X2k5MTVfZ2VtX2VuZ2luZV9jbGFzcyB7CisJSTkxNV9FTkdJTkVfQ0xBU1NfT1RIRVIgPSAwLAor CUk5MTVfRU5HSU5FX0NMQVNTX1JFTkRFUiA9IDEsCisJSTkxNV9FTkdJTkVfQ0xBU1NfQ09QWSA9 IDIsCisJSTkxNV9FTkdJTkVfQ0xBU1NfVklERU8gPSAzLAorCUk5MTVfRU5HSU5FX0NMQVNTX1ZJ REVPX0VOSEFOQ0UgPSA0LAorCUk5MTVfRU5HSU5FX0NMQVNTX01BWCAvKiBub24tQUJJICovCit9 OworCit1bnNpZ25lZCBpbnQKK2dlbV9jbGFzc19pbnN0YW5jZV90b19lYl9mbGFncyhpbnQgZ2Vt X2ZkLAorCQkJICAgICAgIGVudW0gZHJtX2k5MTVfZ2VtX2VuZ2luZV9jbGFzcyBjbGFzcywKKwkJ CSAgICAgICB1bnNpZ25lZCBpbnQgaW5zdGFuY2UpOworCitib29sIGdlbV9oYXNfZW5naW5lKGlu dCBnZW1fZmQsCisJCSAgICBlbnVtIGRybV9pOTE1X2dlbV9lbmdpbmVfY2xhc3MgY2xhc3MsCisJ CSAgICB1bnNpZ25lZCBpbnQgaW5zdGFuY2UpOworCitzdGF0aWMgaW5saW5lCit2b2lkIGdlbV9y ZXF1aXJlX2VuZ2luZShpbnQgZ2VtX2ZkLAorCQkJZW51bSBkcm1faTkxNV9nZW1fZW5naW5lX2Ns YXNzIGNsYXNzLAorCQkJdW5zaWduZWQgaW50IGluc3RhbmNlKQoreworCWlndF9yZXF1aXJlKGdl bV9oYXNfZW5naW5lKGdlbV9mZCwgY2xhc3MsIGluc3RhbmNlKSk7Cit9CisKICNlbmRpZiAvKiBJ R1RfR1RfSCAqLwpkaWZmIC0tZ2l0IGEvbGliL2lndF9wZXJmLmggYi9saWIvaWd0X3BlcmYuaApp bmRleCBlMzgxNzFkYTUyNjEuLmRjNGRmNzYwZjUzMSAxMDA2NDQKLS0tIGEvbGliL2lndF9wZXJm LmgKKysrIGIvbGliL2lndF9wZXJmLmgKQEAgLTI5LDE0ICsyOSw3IEBACiAKICNpbmNsdWRlIDxs aW51eC9wZXJmX2V2ZW50Lmg+CiAKLWVudW0gZHJtX2k5MTVfZ2VtX2VuZ2luZV9jbGFzcyB7Ci0J STkxNV9FTkdJTkVfQ0xBU1NfT1RIRVIgPSAwLAotCUk5MTVfRU5HSU5FX0NMQVNTX1JFTkRFUiA9 IDEsCi0JSTkxNV9FTkdJTkVfQ0xBU1NfQ09QWSA9IDIsCi0JSTkxNV9FTkdJTkVfQ0xBU1NfVklE RU8gPSAzLAotCUk5MTVfRU5HSU5FX0NMQVNTX1ZJREVPX0VOSEFOQ0UgPSA0LAotCUk5MTVfRU5H SU5FX0NMQVNTX01BWCAvKiBub24tQUJJICovCi19OworI2luY2x1ZGUgImlndF9ndC5oIgogCiBl bnVtIGRybV9pOTE1X3BtdV9lbmdpbmVfc2FtcGxlIHsKIAlJOTE1X1NBTVBMRV9CVVNZID0gMCwK ZGlmZiAtLWdpdCBhL3Rlc3RzL01ha2VmaWxlLmFtIGIvdGVzdHMvTWFrZWZpbGUuYW0KaW5kZXgg MWNlYTQwMzZkMDBmLi4yODE5ZGYzODFkZjcgMTAwNjQ0Ci0tLSBhL3Rlc3RzL01ha2VmaWxlLmFt CisrKyBiL3Rlc3RzL01ha2VmaWxlLmFtCkBAIC0xMjYsNiArMTI2LDcgQEAgZ2VuN19mb3JjZXdh a2VfbXRfQ0ZMQUdTID0gJChBTV9DRkxBR1MpICQoVEhSRUFEX0NGTEFHUykKIGdlbjdfZm9yY2V3 YWtlX210X0xEQUREID0gJChMREFERCkgLWxwdGhyZWFkCiBnZW1fdXNlcnB0cl9ibGl0c19DRkxB R1MgPSAkKEFNX0NGTEFHUykgJChUSFJFQURfQ0ZMQUdTKQogZ2VtX3VzZXJwdHJfYmxpdHNfTERB REQgPSAkKExEQUREKSAtbHB0aHJlYWQKK3BlcmZfcG11X0xEQUREID0gJChMREFERCkgJCh0b3Bf YnVpbGRkaXIpL2xpYi9saWJpZ3RfcGVyZi5sYQogCiBnZW1fd2FpdF9MREFERCA9ICQoTERBREQp IC1scnQKIGttc19mbGlwX0xEQUREID0gJChMREFERCkgLWxydCAtbHB0aHJlYWQKZGlmZiAtLWdp dCBhL3Rlc3RzL01ha2VmaWxlLnNvdXJjZXMgYi90ZXN0cy9NYWtlZmlsZS5zb3VyY2VzCmluZGV4 IDBhZGMyOGEwMTRkMi4uN2QxZmRmMTY4OTJkIDEwMDY0NAotLS0gYS90ZXN0cy9NYWtlZmlsZS5z b3VyY2VzCisrKyBiL3Rlc3RzL01ha2VmaWxlLnNvdXJjZXMKQEAgLTIxNyw2ICsyMTcsNyBAQCBU RVNUU19wcm9ncyA9IFwKIAlrbXNfdmJsYW5rIFwKIAltZXRhX3Rlc3QgXAogCXBlcmYgXAorCXBl cmZfcG11IFwKIAlwbV9iYWNrbGlnaHQgXAogCXBtX2xwc3AgXAogCXBtX3JjNl9yZXNpZGVuY3kg XApkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZl9wbXUuYyBiL3Rlc3RzL3BlcmZfcG11LmMKbmV3IGZp bGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwLi43MGQ0MzVlOTUzZWEKLS0tIC9kZXYv bnVsbAorKysgYi90ZXN0cy9wZXJmX3BtdS5jCkBAIC0wLDAgKzEsOTU3IEBACisvKgorICogQ29w eXJpZ2h0IMKpIDIwMTcgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhl cmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQor ICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmls ZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQg cmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMg dG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNl bnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1p dCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28s IHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBj b3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhl IG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBz dWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZU V0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBF WFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBX QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB UiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhF IEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERB TUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09O VFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4g Q09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdT CisgKiBJTiBUSEUgU09GVFdBUkUuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNp bmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+ CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN5 cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzeXMvdGltZXMuaD4K KyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDx0 aW1lLmg+CisjaW5jbHVkZSA8cG9sbC5oPgorCisjaW5jbHVkZSAiaWd0LmgiCisjaW5jbHVkZSAi aWd0X2NvcmUuaCIKKyNpbmNsdWRlICJpZ3RfcGVyZi5oIgorI2luY2x1ZGUgImlndF9zeXNmcy5o IgorCitJR1RfVEVTVF9ERVNDUklQVElPTigiVGVzdCB0aGUgaTkxNSBwbXUgcGVyZiBpbnRlcmZh Y2UiKTsKKworY29uc3QgZG91YmxlIHRvbGVyYW5jZSA9IDAuMDJmOworY29uc3QgdW5zaWduZWQg bG9uZyBiYXRjaF9kdXJhdGlvbl9ucyA9IDEwMCAqIDEwMDAgKiAxMDAwOworCitzdGF0aWMgaW50 IG9wZW5fcG11KHVpbnQ2NF90IGNvbmZpZykKK3sKKwlpbnQgZmQ7CisKKwlmZCA9IHBlcmZfaTkx NV9vcGVuKGNvbmZpZyk7CisJaWd0X3JlcXVpcmUoZmQgPj0gMCB8fCAoZmQgPCAwICYmIGVycm5v ICE9IEVOT0RFVikpOworCWlndF9hc3NlcnQoZmQgPj0gMCk7CisKKwlyZXR1cm4gZmQ7Cit9CisK K3N0YXRpYyBpbnQgb3Blbl9ncm91cCh1aW50NjRfdCBjb25maWcsIGludCBncm91cCkKK3sKKwlp bnQgZmQ7CisKKwlmZCA9IHBlcmZfaTkxNV9vcGVuX2dyb3VwKGNvbmZpZywgZ3JvdXApOworCWln dF9yZXF1aXJlKGZkID49IDAgfHwgKGZkIDwgMCAmJiBlcnJubyAhPSBFTk9ERVYpKTsKKwlpZ3Rf YXNzZXJ0KGZkID49IDApOworCisJcmV0dXJuIGZkOworfQorCitzdGF0aWMgdm9pZAoraW5pdChp bnQgZ2VtX2ZkLCBjb25zdCBzdHJ1Y3QgaW50ZWxfZXhlY3V0aW9uX2VuZ2luZTIgKmUsIHVpbnQ4 X3Qgc2FtcGxlKQoreworCWludCBmZDsKKworCWZkID0gb3Blbl9wbXUoX19JOTE1X1BNVV9FTkdJ TkUoZS0+Y2xhc3MsIGUtPmluc3RhbmNlLCBzYW1wbGUpKTsKKworCWNsb3NlKGZkKTsKK30KKwor c3RhdGljIHVpbnQ2NF90IHBtdV9yZWFkX3NpbmdsZShpbnQgZmQpCit7CisJdWludDY0X3QgZGF0 YVsyXTsKKworCWlndF9hc3NlcnRfZXEocmVhZChmZCwgZGF0YSwgc2l6ZW9mKGRhdGEpKSwgc2l6 ZW9mKGRhdGEpKTsKKworCXJldHVybiBkYXRhWzBdOworfQorCitzdGF0aWMgdm9pZCBwbXVfcmVh ZF9tdWx0aShpbnQgZmQsIHVuc2lnbmVkIGludCBudW0sIHVpbnQ2NF90ICp2YWwpCit7CisJdWlu dDY0X3QgYnVmWzIgKyBudW1dOworCXVuc2lnbmVkIGludCBpOworCisJaWd0X2Fzc2VydF9lcShy ZWFkKGZkLCBidWYsIHNpemVvZihidWYpKSwgc2l6ZW9mKGJ1ZikpOworCisJZm9yIChpID0gMDsg aSA8IG51bTsgaSsrKQorCQl2YWxbaV0gPSBidWZbMiArIGldOworfQorCisjZGVmaW5lIGFzc2Vy dF93aXRoaW5fZXBzaWxvbih4LCByZWYsIHRvbGVyYW5jZSkgXAorCWlndF9hc3NlcnRfZigoZG91 YmxlKSh4KSA8PSAoMS4wICsgdG9sZXJhbmNlKSAqIChkb3VibGUpcmVmICYmIFwKKwkJICAgICAo ZG91YmxlKSh4KSA+PSAoMS4wIC0gdG9sZXJhbmNlKSAqIChkb3VibGUpcmVmLCBcCisJCSAgICAg IiclcycgIT0gJyVzJyAoJWYgbm90IHdpdGhpbiAlZiUlIHRvbGVyYW5jZSBvZiAlZilcbiIsXAor CQkgICAgICN4LCAjcmVmLCAoZG91YmxlKXgsIHRvbGVyYW5jZSAqIDEwMC4wLCAoZG91YmxlKXJl ZikKKworLyoKKyAqIEhlbHBlciBmb3IgY2FzZXMgd2hlcmUgd2UgYXNzZXJ0IG9uIHRpbWUgc3Bl bnQgc2xlZXBpbmcgKGRpcmVjdGx5IG9yCisgKiBpbmRpcmVjdGx5KSwgc28gbWFrZSBpdCBtb3Jl IHJvYnVzdCBieSBlbnN1cmluZyB0aGUgc3lzdGVtIHNsZWVwIHRpbWUKKyAqIGlzIHdpdGhpbiB0 ZXN0IHRvbGVyYW5jZSB0byBzdGFydCB3aXRoLgorICovCitzdGF0aWMgdW5zaWduZWQgaW50IG1l YXN1cmVkX3VzbGVlcCh1bnNpZ25lZCBpbnQgdXNlYykKK3sKKwl1aW50NjRfdCBzbGVwdCA9IDA7 CisKKwl3aGlsZSAodXNlYyA+IDApIHsKKwkJc3RydWN0IHRpbWVzcGVjIHN0YXJ0ID0geyB9Owor CQl1aW50NjRfdCB0aGlzX3NsZWVwOworCisJCWlndF9uc2VjX2VsYXBzZWQoJnN0YXJ0KTsKKwkJ dXNsZWVwKHVzZWMpOworCQl0aGlzX3NsZWVwID0gaWd0X25zZWNfZWxhcHNlZCgmc3RhcnQpOwor CQlzbGVwdCArPSB0aGlzX3NsZWVwOworCQlpZiAodGhpc19zbGVlcCA+IHVzZWMgKiAxMDAwKQor CQkJYnJlYWs7CisJCXVzZWMgLT0gdGhpc19zbGVlcDsKKwl9CisKKwlyZXR1cm4gc2xlcHQ7Cit9 CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZTJyaW5nKGludCBnZW1fZmQsIGNvbnN0IHN0cnVjdCBp bnRlbF9leGVjdXRpb25fZW5naW5lMiAqZSkKK3sKKwlyZXR1cm4gZ2VtX2NsYXNzX2luc3RhbmNl X3RvX2ViX2ZsYWdzKGdlbV9mZCwgZS0+Y2xhc3MsIGUtPmluc3RhbmNlKTsKK30KKworc3RhdGlj IHZvaWQKK3NpbmdsZShpbnQgZ2VtX2ZkLCBjb25zdCBzdHJ1Y3QgaW50ZWxfZXhlY3V0aW9uX2Vu Z2luZTIgKmUsIGJvb2wgYnVzeSkKK3sKKwlkb3VibGUgcmVmID0gYnVzeSA/IGJhdGNoX2R1cmF0 aW9uX25zIDogMC4wZjsKKwlpZ3Rfc3Bpbl90ICpzcGluOworCXVpbnQ2NF90IHZhbDsKKwlpbnQg ZmQ7CisKKwlmZCA9IG9wZW5fcG11KEk5MTVfUE1VX0VOR0lORV9CVVNZKGUtPmNsYXNzLCBlLT5p bnN0YW5jZSkpOworCisJaWYgKGJ1c3kpIHsKKwkJc3BpbiA9IGlndF9zcGluX2JhdGNoX25ldyhn ZW1fZmQsIDAsIGUycmluZyhnZW1fZmQsIGUpLCAwKTsKKwkJaWd0X3NwaW5fYmF0Y2hfc2V0X3Rp bWVvdXQoc3BpbiwgYmF0Y2hfZHVyYXRpb25fbnMpOworCX0gZWxzZSB7CisJCXVzbGVlcChiYXRj aF9kdXJhdGlvbl9ucyAvIDEwMDApOworCX0KKworCWlmIChidXN5KQorCQlnZW1fc3luYyhnZW1f ZmQsIHNwaW4tPmhhbmRsZSk7CisKKwl2YWwgPSBwbXVfcmVhZF9zaW5nbGUoZmQpOworCisJYXNz ZXJ0X3dpdGhpbl9lcHNpbG9uKHZhbCwgcmVmLCB0b2xlcmFuY2UpOworCisJaWYgKGJ1c3kpCisJ CWlndF9zcGluX2JhdGNoX2ZyZWUoZ2VtX2ZkLCBzcGluKTsKKwljbG9zZShmZCk7Cit9CisKK3N0 YXRpYyB2b2lkIGxvZ19idXN5KGludCBmZCwgdW5zaWduZWQgaW50IG51bV9lbmdpbmVzLCB1aW50 NjRfdCAqdmFsKQoreworCWNoYXIgYnVmWzEwMjRdOworCWludCByZW0gPSBzaXplb2YoYnVmKTsK Kwl1bnNpZ25lZCBpbnQgaTsKKwljaGFyICpwID0gYnVmOworCisJZm9yIChpID0gMDsgaSA8IG51 bV9lbmdpbmVzOyBpKyspIHsKKwkJaW50IGxlbjsKKworCQlsZW4gPSBzbnByaW50ZihwLCByZW0s ICIldT0lIiBQUkl1NjQgIlxuIiwgIGksIHZhbFtpXSk7CisJCWlndF9hc3NlcnQobGVuID4gMCk7 CisJCXJlbSAtPSBsZW47CisJCXAgKz0gbGVuOworCX0KKworCWlndF9pbmZvKCIlcyIsIGJ1Zik7 Cit9CisKK3N0YXRpYyB2b2lkCitidXN5X2NoZWNrX2FsbChpbnQgZ2VtX2ZkLCBjb25zdCBzdHJ1 Y3QgaW50ZWxfZXhlY3V0aW9uX2VuZ2luZTIgKmUsCisJICAgICAgIGNvbnN0IHVuc2lnbmVkIGlu dCBudW1fZW5naW5lcykKK3sKKwljb25zdCBzdHJ1Y3QgaW50ZWxfZXhlY3V0aW9uX2VuZ2luZTIg KmVfOworCXVpbnQ2NF90IHZhbFtudW1fZW5naW5lc107CisJaW50IGZkW251bV9lbmdpbmVzXTsK KwlpZ3Rfc3Bpbl90ICpzcGluOworCXVuc2lnbmVkIGludCBidXN5X2lkeCwgaTsKKworCWkgPSAw OworCWZkWzBdID0gLTE7CisJZm9yX2VhY2hfZW5naW5lX2NsYXNzX2luc3RhbmNlKGZkLCBlXykg eworCQlpZiAoIWdlbV9oYXNfZW5naW5lKGdlbV9mZCwgZV8tPmNsYXNzLCBlXy0+aW5zdGFuY2Up KQorCQkJY29udGludWU7CisJCWVsc2UgaWYgKGUgPT0gZV8pCisJCQlidXN5X2lkeCA9IGk7CisK KwkJZmRbaSsrXSA9IG9wZW5fZ3JvdXAoSTkxNV9QTVVfRU5HSU5FX0JVU1koZV8tPmNsYXNzLAor CQkJCQkJCSAgZV8tPmluc3RhbmNlKSwKKwkJCQkgICAgIGZkWzBdKTsKKwl9CisKKwlzcGluID0g aWd0X3NwaW5fYmF0Y2hfbmV3KGdlbV9mZCwgMCwgZTJyaW5nKGdlbV9mZCwgZSksIDApOworCWln dF9zcGluX2JhdGNoX3NldF90aW1lb3V0KHNwaW4sIGJhdGNoX2R1cmF0aW9uX25zKTsKKworCWdl bV9zeW5jKGdlbV9mZCwgc3Bpbi0+aGFuZGxlKTsKKworCXBtdV9yZWFkX211bHRpKGZkWzBdLCBu dW1fZW5naW5lcywgdmFsKTsKKwlsb2dfYnVzeShmZFswXSwgbnVtX2VuZ2luZXMsIHZhbCk7CisK Kwlhc3NlcnRfd2l0aGluX2Vwc2lsb24odmFsW2J1c3lfaWR4XSwgYmF0Y2hfZHVyYXRpb25fbnMs IHRvbGVyYW5jZSk7CisJZm9yIChpID0gMDsgaSA8IG51bV9lbmdpbmVzOyBpKyspIHsKKwkJaWYg KGkgPT0gYnVzeV9pZHgpCisJCQljb250aW51ZTsKKwkJYXNzZXJ0X3dpdGhpbl9lcHNpbG9uKHZh bFtpXSwgMC4wZiwgdG9sZXJhbmNlKTsKKwl9CisKKwlpZ3Rfc3Bpbl9iYXRjaF9mcmVlKGdlbV9m ZCwgc3Bpbik7CisJY2xvc2UoZmRbMF0pOworfQorCitzdGF0aWMgdm9pZAorbW9zdF9idXN5X2No ZWNrX2FsbChpbnQgZ2VtX2ZkLCBjb25zdCBzdHJ1Y3QgaW50ZWxfZXhlY3V0aW9uX2VuZ2luZTIg KmUsCisJCSAgICBjb25zdCB1bnNpZ25lZCBpbnQgbnVtX2VuZ2luZXMpCit7CisJY29uc3Qgc3Ry dWN0IGludGVsX2V4ZWN1dGlvbl9lbmdpbmUyICplXzsKKwl1aW50NjRfdCB2YWxbbnVtX2VuZ2lu ZXNdOworCWludCBmZFtudW1fZW5naW5lc107CisJaWd0X3NwaW5fdCAqc3BpbltudW1fZW5naW5l c107CisJdW5zaWduZWQgaW50IGlkbGVfaWR4LCBpOworCisJZ2VtX3JlcXVpcmVfZW5naW5lKGdl bV9mZCwgZS0+Y2xhc3MsIGUtPmluc3RhbmNlKTsKKworCWkgPSAwOworCWZkWzBdID0gLTE7CisJ Zm9yX2VhY2hfZW5naW5lX2NsYXNzX2luc3RhbmNlKGZkLCBlXykgeworCQlpZiAoIWdlbV9oYXNf ZW5naW5lKGdlbV9mZCwgZV8tPmNsYXNzLCBlXy0+aW5zdGFuY2UpKQorCQkJY29udGludWU7CisK KwkJZmRbaV0gPSBvcGVuX2dyb3VwKEk5MTVfUE1VX0VOR0lORV9CVVNZKGVfLT5jbGFzcywKKwkJ CQkJCQllXy0+aW5zdGFuY2UpLAorCQkJCSAgIGZkWzBdKTsKKworCQlpZiAoZSA9PSBlXykgewor CQkJaWRsZV9pZHggPSBpOworCQl9IGVsc2UgeworCQkJc3BpbltpXSA9IGlndF9zcGluX2JhdGNo X25ldyhnZW1fZmQsIDAsCisJCQkJCQkgICAgIGUycmluZyhnZW1fZmQsIGVfKSwgMCk7CisJCQlp Z3Rfc3Bpbl9iYXRjaF9zZXRfdGltZW91dChzcGluW2ldLCBiYXRjaF9kdXJhdGlvbl9ucyk7CisJ CX0KKworCQlpKys7CisJfQorCisJZm9yIChpID0gMDsgaSA8IG51bV9lbmdpbmVzOyBpKyspIHsK KwkJaWYgKGkgIT0gaWRsZV9pZHgpCisJCQlnZW1fc3luYyhnZW1fZmQsIHNwaW5baV0tPmhhbmRs ZSk7CisJfQorCisJcG11X3JlYWRfbXVsdGkoZmRbMF0sIG51bV9lbmdpbmVzLCB2YWwpOworCWxv Z19idXN5KGZkWzBdLCBudW1fZW5naW5lcywgdmFsKTsKKworCWZvciAoaSA9IDA7IGkgPCBudW1f ZW5naW5lczsgaSsrKSB7CisJCWlmIChpID09IGlkbGVfaWR4KQorCQkJYXNzZXJ0X3dpdGhpbl9l cHNpbG9uKHZhbFtpXSwgMC4wZiwgdG9sZXJhbmNlKTsKKwkJZWxzZQorCQkJYXNzZXJ0X3dpdGhp bl9lcHNpbG9uKHZhbFtpXSwgYmF0Y2hfZHVyYXRpb25fbnMsCisJCQkJCSAgICAgIHRvbGVyYW5j ZSk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IG51bV9lbmdpbmVzOyBpKyspIHsKKwkJaWYgKGkg IT0gaWRsZV9pZHgpCisJCQlpZ3Rfc3Bpbl9iYXRjaF9mcmVlKGdlbV9mZCwgc3BpbltpXSk7CisJ fQorCWNsb3NlKGZkWzBdKTsKK30KKworc3RhdGljIHZvaWQKK2FsbF9idXN5X2NoZWNrX2FsbChp bnQgZ2VtX2ZkLCBjb25zdCB1bnNpZ25lZCBpbnQgbnVtX2VuZ2luZXMpCit7CisJY29uc3Qgc3Ry dWN0IGludGVsX2V4ZWN1dGlvbl9lbmdpbmUyICplOworCXVpbnQ2NF90IHZhbFtudW1fZW5naW5l c107CisJaW50IGZkW251bV9lbmdpbmVzXTsKKwlpZ3Rfc3Bpbl90ICpzcGluW251bV9lbmdpbmVz XTsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWkgPSAwOworCWZkWzBdID0gLTE7CisJZm9yX2VhY2hf ZW5naW5lX2NsYXNzX2luc3RhbmNlKGZkLCBlKSB7CisJCWlmICghZ2VtX2hhc19lbmdpbmUoZ2Vt X2ZkLCBlLT5jbGFzcywgZS0+aW5zdGFuY2UpKQorCQkJY29udGludWU7CisKKwkJZmRbaV0gPSBv cGVuX2dyb3VwKEk5MTVfUE1VX0VOR0lORV9CVVNZKGUtPmNsYXNzLCBlLT5pbnN0YW5jZSksCisJ CQkJICAgZmRbMF0pOworCisJCXNwaW5baV0gPSBpZ3Rfc3Bpbl9iYXRjaF9uZXcoZ2VtX2ZkLCAw LCBlMnJpbmcoZ2VtX2ZkLCBlKSwgMCk7CisJCWlndF9zcGluX2JhdGNoX3NldF90aW1lb3V0KHNw aW5baV0sIGJhdGNoX2R1cmF0aW9uX25zKTsKKworCQlpKys7CisJfQorCisJZm9yIChpID0gMDsg aSA8IG51bV9lbmdpbmVzOyBpKyspCisJCWdlbV9zeW5jKGdlbV9mZCwgc3BpbltpXS0+aGFuZGxl KTsKKworCXBtdV9yZWFkX211bHRpKGZkWzBdLCBudW1fZW5naW5lcywgdmFsKTsKKwlsb2dfYnVz eShmZFswXSwgbnVtX2VuZ2luZXMsIHZhbCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2VuZ2lu ZXM7IGkrKykKKwkJYXNzZXJ0X3dpdGhpbl9lcHNpbG9uKHZhbFtpXSwgYmF0Y2hfZHVyYXRpb25f bnMsIHRvbGVyYW5jZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2VuZ2luZXM7IGkrKykKKwkJ aWd0X3NwaW5fYmF0Y2hfZnJlZShnZW1fZmQsIHNwaW5baV0pOworCWNsb3NlKGZkWzBdKTsKK30K Kworc3RhdGljIHZvaWQKK25vX3NlbWEoaW50IGdlbV9mZCwgY29uc3Qgc3RydWN0IGludGVsX2V4 ZWN1dGlvbl9lbmdpbmUyICplLCBib29sIGJ1c3kpCit7CisJaWd0X3NwaW5fdCAqc3BpbjsKKwl1 aW50NjRfdCB2YWxbMl07CisJaW50IGZkOworCisJZmQgPSBvcGVuX2dyb3VwKEk5MTVfUE1VX0VO R0lORV9TRU1BKGUtPmNsYXNzLCBlLT5pbnN0YW5jZSksIC0xKTsKKwlvcGVuX2dyb3VwKEk5MTVf UE1VX0VOR0lORV9XQUlUKGUtPmNsYXNzLCBlLT5pbnN0YW5jZSksIGZkKTsKKworCWlmIChidXN5 KSB7CisJCXNwaW4gPSBpZ3Rfc3Bpbl9iYXRjaF9uZXcoZ2VtX2ZkLCAwLCBlMnJpbmcoZ2VtX2Zk LCBlKSwgMCk7CisJCWlndF9zcGluX2JhdGNoX3NldF90aW1lb3V0KHNwaW4sIGJhdGNoX2R1cmF0 aW9uX25zKTsKKwl9IGVsc2UgeworCQl1c2xlZXAoYmF0Y2hfZHVyYXRpb25fbnMgLyAxMDAwKTsK Kwl9CisKKwlpZiAoYnVzeSkKKwkJZ2VtX3N5bmMoZ2VtX2ZkLCBzcGluLT5oYW5kbGUpOworCisJ cG11X3JlYWRfbXVsdGkoZmQsIDIsIHZhbCk7CisKKwlhc3NlcnRfd2l0aGluX2Vwc2lsb24odmFs WzBdLCAwLjBmLCB0b2xlcmFuY2UpOworCWFzc2VydF93aXRoaW5fZXBzaWxvbih2YWxbMV0sIDAu MGYsIHRvbGVyYW5jZSk7CisKKwlpZiAoYnVzeSkKKwkJaWd0X3NwaW5fYmF0Y2hfZnJlZShnZW1f ZmQsIHNwaW4pOworCWNsb3NlKGZkKTsKK30KKworc3RhdGljIHZvaWQKK211bHRpX2NsaWVudChp bnQgZ2VtX2ZkLCBjb25zdCBzdHJ1Y3QgaW50ZWxfZXhlY3V0aW9uX2VuZ2luZTIgKmUpCit7CisJ dWludDY0X3QgY29uZmlnID0gSTkxNV9QTVVfRU5HSU5FX0JVU1koZS0+Y2xhc3MsIGUtPmluc3Rh bmNlKTsKKwl1bnNpZ25lZCBpbnQgc2xlcHQ7CisJaWd0X3NwaW5fdCAqc3BpbjsKKwl1aW50NjRf dCB2YWxbMl07CisJaW50IGZkWzJdOworCisJZmRbMF0gPSBvcGVuX3BtdShjb25maWcpOworCisJ c3BpbiA9IGlndF9zcGluX2JhdGNoX25ldyhnZW1fZmQsIDAsIGUycmluZyhnZW1fZmQsIGUpLCAw KTsKKwlpZ3Rfc3Bpbl9iYXRjaF9zZXRfdGltZW91dChzcGluLCBiYXRjaF9kdXJhdGlvbl9ucyk7 CisKKwl1c2xlZXAoYmF0Y2hfZHVyYXRpb25fbnMgLyAzMDAwKTsKKworCS8qCisJICogU2Vjb25k IFBNVSBjbGllbnQgd2hpY2ggaXMgaW5pdGlhbGl6ZWQgYWZ0ZXIgdGhlIGZpcnN0IG9uZSwKKwkg KiBhbmQgZXhpc3RzIGJlZm9yZSBpdCwgc2hvdWxkIG5vdCBhZmZlY3QgYWNjb3VudGluZyBhcyBy ZXBvcnRlZAorCSAqIGluIHRoZSBmaXJzdCBjbGllbnQuCisJICovCisJZmRbMV0gPSBvcGVuX3Bt dShjb25maWcpOworCXNsZXB0ID0gbWVhc3VyZWRfdXNsZWVwKGJhdGNoX2R1cmF0aW9uX25zIC8g MzAwMCk7CisJdmFsWzFdID0gcG11X3JlYWRfc2luZ2xlKGZkWzFdKTsKKwljbG9zZShmZFsxXSk7 CisKKwlnZW1fc3luYyhnZW1fZmQsIHNwaW4tPmhhbmRsZSk7CisKKwl2YWxbMF0gPSBwbXVfcmVh ZF9zaW5nbGUoZmRbMF0pOworCisJYXNzZXJ0X3dpdGhpbl9lcHNpbG9uKHZhbFswXSwgYmF0Y2hf ZHVyYXRpb25fbnMsIHRvbGVyYW5jZSk7CisJYXNzZXJ0X3dpdGhpbl9lcHNpbG9uKHZhbFsxXSwg c2xlcHQsIHRvbGVyYW5jZSk7CisKKwlpZ3Rfc3Bpbl9iYXRjaF9mcmVlKGdlbV9mZCwgc3Bpbik7 CisJY2xvc2UoZmRbMF0pOworfQorCisvKioKKyAqIFRlc3RzIHRoYXQgaTkxNSBQTVUgY29yZWN0 bHkgZXJyb3JzIG91dCBpbiBpbnZhbGlkIGluaXRpYWxpemF0aW9uLgorICogaTkxNSBQTVUgaXMg dW5jb3JlIFBNVSwgdGh1czoKKyAqICAtIHNhbXBsaW5nIHBlcmlvZCBpcyBub3Qgc3VwcG9ydGVk CisgKiAgLSBwaWQgPiAwIGlzIG5vdCBzdXBwb3J0ZWQgc2luY2Ugd2UgY2FuJ3QgY291bnQgcGVy LXByb2Nlc3MgKHdlIGNvdW50CisgKiAgICBwZXIgd2hvbGUgc3lzdGVtKQorICogIC0gY3B1ICE9 IDAgaXMgbm90IHN1cHBvcnRlZCBzaW5jZSBpOTE1IFBNVSBleHBvc2VzIGNwdW1hc2sgZm9yIENQ VTAKKyAqLworc3RhdGljIHZvaWQgaW52YWxpZF9pbml0KHZvaWQpCit7CisJc3RydWN0IHBlcmZf ZXZlbnRfYXR0ciBhdHRyOworCWludCBwaWQsIGNwdTsKKworI2RlZmluZSBBVFRSX0lOSVQoKSBc CitkbyB7IFwKKwltZW1zZXQoJmF0dHIsIDAsIHNpemVvZiAoYXR0cikpOyBcCisJYXR0ci5jb25m aWcgPSBJOTE1X1BNVV9FTkdJTkVfQlVTWShJOTE1X0VOR0lORV9DTEFTU19SRU5ERVIsIDApOyBc CisJYXR0ci50eXBlID0gaTkxNV90eXBlX2lkKCk7IFwKKwlpZ3RfYXNzZXJ0KGF0dHIudHlwZSAh PSAwKTsgXAorfSB3aGlsZSgwKQorCisJQVRUUl9JTklUKCk7CisJYXR0ci5zYW1wbGVfcGVyaW9k ID0gMTAwOworCXBpZCA9IC0xOworCWNwdSA9IDA7CisJaWd0X2Fzc2VydF9lcShwZXJmX2V2ZW50 X29wZW4oJmF0dHIsIHBpZCwgY3B1LCAtMSwgMCksIC0xKTsKKwlpZ3RfYXNzZXJ0X2VxKGVycm5v LCBFSU5WQUwpOworCisJQVRUUl9JTklUKCk7CisJcGlkID0gMDsKKwljcHUgPSAwOworCWlndF9h c3NlcnRfZXEocGVyZl9ldmVudF9vcGVuKCZhdHRyLCBwaWQsIGNwdSwgLTEsIDApLCAtMSk7CisJ aWd0X2Fzc2VydF9lcShlcnJubywgRUlOVkFMKTsKKworCUFUVFJfSU5JVCgpOworCXBpZCA9IC0x OworCWNwdSA9IDE7CisJaWd0X2Fzc2VydF9lcShwZXJmX2V2ZW50X29wZW4oJmF0dHIsIHBpZCwg Y3B1LCAtMSwgMCksIC0xKTsKKwlpZ3RfYXNzZXJ0X2VxKGVycm5vLCBFTk9ERVYpOworfQorCitz dGF0aWMgdm9pZCBpbml0X290aGVyKHVuc2lnbmVkIGludCBpLCBib29sIHZhbGlkKQoreworCWlu dCBmZDsKKworCWZkID0gcGVyZl9pOTE1X29wZW4oX19JOTE1X1BNVV9PVEhFUihpKSk7CisJaWd0 X3JlcXVpcmUoIShmZCA8IDAgJiYgZXJybm8gPT0gRU5PREVWKSk7CisJaWYgKHZhbGlkKSB7CisJ CWlndF9hc3NlcnQoZmQgPj0gMCk7CisJfSBlbHNlIHsKKwkJaWd0X2Fzc2VydChmZCA8IDApOwor CQlyZXR1cm47CisJfQorCisJY2xvc2UoZmQpOworfQorCitzdGF0aWMgdm9pZCByZWFkX290aGVy KHVuc2lnbmVkIGludCBpLCBib29sIHZhbGlkKQoreworCWludCBmZDsKKworCWZkID0gcGVyZl9p OTE1X29wZW4oX19JOTE1X1BNVV9PVEhFUihpKSk7CisJaWd0X3JlcXVpcmUoIShmZCA8IDAgJiYg ZXJybm8gPT0gRU5PREVWKSk7CisJaWYgKHZhbGlkKSB7CisJCWlndF9hc3NlcnQoZmQgPj0gMCk7 CisJfSBlbHNlIHsKKwkJaWd0X2Fzc2VydChmZCA8IDApOworCQlyZXR1cm47CisJfQorCisJKHZv aWQpcG11X3JlYWRfc2luZ2xlKGZkKTsKKworCWNsb3NlKGZkKTsKK30KKworc3RhdGljIGJvb2wg Y3B1MF9ob3RwbHVnX3N1cHBvcnQodm9pZCkKK3sKKwlyZXR1cm4gYWNjZXNzKCIvc3lzL2Rldmlj ZXMvc3lzdGVtL2NwdS9jcHUwL29ubGluZSIsIFdfT0spID09IDA7Cit9CisKK3N0YXRpYyB2b2lk IGNwdV9ob3RwbHVnKGludCBnZW1fZmQpCit7CisJc3RydWN0IHRpbWVzcGVjIHN0YXJ0ID0geyB9 OworCWlndF9zcGluX3QgKnNwaW47CisJdWludDY0X3QgdmFsLCByZWY7CisJaW50IGZkOworCisJ aWd0X3JlcXVpcmUoY3B1MF9ob3RwbHVnX3N1cHBvcnQoKSk7CisKKwlzcGluID0gaWd0X3NwaW5f YmF0Y2hfbmV3KGdlbV9mZCwgMCwgSTkxNV9FWEVDX1JFTkRFUiwgMCk7CisJZmQgPSBwZXJmX2k5 MTVfb3BlbihJOTE1X1BNVV9FTkdJTkVfQlVTWShJOTE1X0VOR0lORV9DTEFTU19SRU5ERVIsIDAp KTsKKwlpZ3RfYXNzZXJ0KGZkID49IDApOworCisJaWd0X25zZWNfZWxhcHNlZCgmc3RhcnQpOwor CisJLyoKKwkgKiBUb2dnbGUgb25saW5lIHN0YXR1cyBvZiBhbGwgdGhlIENQVXMgaW4gYSBjaGls ZCBwcm9jZXNzIGFuZCBlbnN1cmUKKwkgKiB0aGlzIGhhcyBub3QgYWZmZWN0ZWQgYnVzeW5lc3Mg c3RhdHMgaW4gdGhlIHBhcmVudC4KKwkgKi8KKwlpZ3RfZm9yayhjaGlsZCwgMSkgeworCQlpbnQg Y3B1ID0gMDsKKworCQlmb3IgKDs7KSB7CisJCQljaGFyIG5hbWVbMTI4XTsKKwkJCWludCBjcHVm ZDsKKworCQkJc3ByaW50ZihuYW1lLCAiL3N5cy9kZXZpY2VzL3N5c3RlbS9jcHUvY3B1JWQvb25s aW5lIiwKKwkJCQljcHUpOworCQkJY3B1ZmQgPSBvcGVuKG5hbWUsIE9fV1JPTkxZKTsKKwkJCWlm IChjcHVmZCA9PSAtMSkgeworCQkJCWlndF9hc3NlcnQoY3B1ID4gMCk7CisJCQkJYnJlYWs7CisJ CQl9CisJCQlpZ3RfYXNzZXJ0X2VxKHdyaXRlKGNwdWZkLCAiMCIsIDIpLCAyKTsKKworCQkJdXNs ZWVwKDEwMDAgKiAxMDAwKTsKKworCQkJaWd0X2Fzc2VydF9lcSh3cml0ZShjcHVmZCwgIjEiLCAy KSwgMik7CisKKwkJCWNsb3NlKGNwdWZkKTsKKwkJCWNwdSsrOworCQl9CisJfQorCisJaWd0X3dh aXRjaGlsZHJlbigpOworCisJaWd0X3NwaW5fYmF0Y2hfZW5kKHNwaW4pOworCWdlbV9zeW5jKGdl bV9mZCwgc3Bpbi0+aGFuZGxlKTsKKworCXJlZiA9IGlndF9uc2VjX2VsYXBzZWQoJnN0YXJ0KTsK Kwl2YWwgPSBwbXVfcmVhZF9zaW5nbGUoZmQpOworCisJYXNzZXJ0X3dpdGhpbl9lcHNpbG9uKHZh bCwgcmVmLCB0b2xlcmFuY2UpOworCisJaWd0X3NwaW5fYmF0Y2hfZnJlZShnZW1fZmQsIHNwaW4p OworCWNsb3NlKGZkKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgY2FsaWJyYXRlX25vcChp bnQgZmQsIGNvbnN0IHVuc2lnbmVkIGludCBjYWxpYnJhdGlvbl91cykKK3sKKwljb25zdCB1bnNp Z25lZCBpbnQgY2FsX21pbl91cyA9IGNhbGlicmF0aW9uX3VzICogMzsKKwljb25zdCB1bnNpZ25l ZCBpbnQgdG9sZXJhbmNlX3BjdCA9IDEwOworCWNvbnN0IHVpbnQzMl90IGJiZSA9IDB4YSA8PCAy MzsKKwljb25zdCB1bnNpZ25lZCBpbnQgbG9vcHMgPSAxNzsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2Vt X2V4ZWNfb2JqZWN0MiBvYmogPSB7fTsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNidWZmZXIy IGViID0KKwkJeyAuYnVmZmVyX2NvdW50ID0gMSwgLmJ1ZmZlcnNfcHRyID0gKHVpbnRwdHJfdCkm b2JqfTsKKwlzdHJ1Y3QgdGltZXNwZWMgdF9iZWdpbiA9IHsgfTsKKwlsb25nIHNpemUsIGxhc3Rf c2l6ZTsKKwl1bnNpZ25lZCBsb25nIG5zOworCisJaWd0X25zZWNfZWxhcHNlZCgmdF9iZWdpbik7 CisKKwlzaXplID0gMjU2ICogMTAyNDsKKwlkbyB7CisJCXN0cnVjdCB0aW1lc3BlYyB0X3N0YXJ0 ID0geyB9OworCisJCW9iai5oYW5kbGUgPSBnZW1fY3JlYXRlKGZkLCBzaXplKTsKKwkJZ2VtX3dy aXRlKGZkLCBvYmouaGFuZGxlLCBzaXplIC0gc2l6ZW9mKGJiZSksICZiYmUsCisJCQkgIHNpemVv ZihiYmUpKTsKKwkJZ2VtX2V4ZWNidWYoZmQsICZlYik7CisJCWdlbV9zeW5jKGZkLCBvYmouaGFu ZGxlKTsKKworCQlpZ3RfbnNlY19lbGFwc2VkKCZ0X3N0YXJ0KTsKKworCQlmb3IgKGludCBsb29w ID0gMDsgbG9vcCA8IGxvb3BzOyBsb29wKyspCisJCQlnZW1fZXhlY2J1ZihmZCwgJmViKTsKKwkJ Z2VtX3N5bmMoZmQsIG9iai5oYW5kbGUpOworCisJCW5zID0gaWd0X25zZWNfZWxhcHNlZCgmdF9z dGFydCk7CisKKwkJZ2VtX2Nsb3NlKGZkLCBvYmouaGFuZGxlKTsKKworCQlsYXN0X3NpemUgPSBz aXplOworCQlzaXplID0gY2FsaWJyYXRpb25fdXMgKiAxMDAwICogc2l6ZSAqIGxvb3BzIC8gbnM7 CisJCXNpemUgPSBBTElHTihzaXplLCBzaXplb2YodWludDMyX3QpKTsKKwl9IHdoaWxlIChpZ3Rf bnNlY19lbGFwc2VkKCZ0X2JlZ2luKSAvIDEwMDAgPCBjYWxfbWluX3VzIHx8CisJCSBhYnMoc2l6 ZSAtIGxhc3Rfc2l6ZSkgPiAoc2l6ZSAqIHRvbGVyYW5jZV9wY3QgLyAxMDApKTsKKworCXJldHVy biBzaXplIC8gc2l6ZW9mKHVpbnQzMl90KTsKK30KKworc3RhdGljIGludCBjaGFpbl9ub3AoaW50 IGdlbV9mZCwgdW5zaWduZWQgbG9uZyBzeiwgaW50IGluX2ZlbmNlLCBib29sIHN5bmMpCit7CisJ c3RydWN0IGRybV9pOTE1X2dlbV9leGVjX29iamVjdDIgb2JqID0ge307CisJc3RydWN0IGRybV9p OTE1X2dlbV9leGVjYnVmZmVyMiBlYiA9CisJCXsgLmJ1ZmZlcl9jb3VudCA9IDEsIC5idWZmZXJz X3B0ciA9ICh1aW50cHRyX3QpJm9ian07CisJY29uc3QgdWludDMyX3QgYmJlID0gMHhhIDw8IDIz OworCisJc3ogPSBBTElHTihzeiwgc2l6ZW9mKHVpbnQzMl90KSk7CisKKwlvYmouaGFuZGxlID0g Z2VtX2NyZWF0ZShnZW1fZmQsIHN6KTsKKwlnZW1fd3JpdGUoZ2VtX2ZkLCBvYmouaGFuZGxlLCBz eiAtIHNpemVvZihiYmUpLCAmYmJlLCBzaXplb2YoYmJlKSk7CisKKwllYi5mbGFncyA9IEk5MTVf RVhFQ19SRU5ERVIgfCBJOTE1X0VYRUNfRkVOQ0VfT1VUOworCisJaWYgKGluX2ZlbmNlID49IDAp IHsKKwkJZWIuZmxhZ3MgfD0gSTkxNV9FWEVDX0ZFTkNFX0lOOworCQllYi5yc3ZkMiA9IGluX2Zl bmNlOworCX0KKworCWdlbV9leGVjYnVmX3dyKGdlbV9mZCwgJmViKTsKKworCWlmIChzeW5jKQor CQlnZW1fc3luYyhnZW1fZmQsIG9iai5oYW5kbGUpOworCisJZ2VtX2Nsb3NlKGdlbV9mZCwgb2Jq LmhhbmRsZSk7CisJaWYgKGluX2ZlbmNlID49IDApCisJCWNsb3NlKGluX2ZlbmNlKTsKKworCXJl dHVybiBlYi5yc3ZkMiA+PiAzMjsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfaW50ZXJydXB0cyhp bnQgZ2VtX2ZkKQoreworCWNvbnN0IHVuc2lnbmVkIGludCBjYWxpYnJhdGlvbl91cyA9IDI1MDAw MDsKKwljb25zdCB1bnNpZ25lZCBpbnQgYmF0Y2hfbGVuX3VzID0gMTAwMDAwOworCWNvbnN0IHVu c2lnbmVkIGludCBiYXRjaF9jb3VudCA9IDMwMDAwMDAgLyBiYXRjaF9sZW5fdXM7CisJdWludDY0 X3QgaWRsZSwgYnVzeSwgcHJldjsKKwl1bnNpZ25lZCBsb25nIGNhbCwgc3o7CisJaW50IGZkLCBm ZW5jZSA9IC0xOworCXVuc2lnbmVkIGludCBpOworCisJY2FsID0gY2FsaWJyYXRlX25vcChnZW1f ZmQsIGNhbGlicmF0aW9uX3VzKTsKKwlzeiA9IGJhdGNoX2xlbl91cyAqIGNhbCAvIGNhbGlicmF0 aW9uX3VzOworCisJZmQgPSBvcGVuX3BtdShJOTE1X1BNVV9JTlRFUlJVUFRTKTsKKworCWdlbV9x dWllc2NlbnRfZ3B1KGdlbV9mZCk7CisKKwkvKiBXYWl0IGZvciBpZGxlIHN0YXRlLiAqLworCXBy ZXYgPSBwbXVfcmVhZF9zaW5nbGUoZmQpOworCWlkbGUgPSBwcmV2ICsgMTsKKwl3aGlsZSAoaWRs ZSAhPSBwcmV2KSB7CisJCXVzbGVlcCgxMDAwMDApOworCQlwcmV2ID0gaWRsZTsKKwkJaWRsZSA9 IHBtdV9yZWFkX3NpbmdsZShmZCk7CisJfQorCisJaWd0X2Fzc2VydF9lcShpZGxlIC0gcHJldiwg MCk7CisKKwkvKiBTZW5kIHNvbWUgbm8tb3AgYmF0Y2hlcyB3aXRoIGNoYWluZWQgZmVuY2VzIHRv IGVuc3VyZSBpbnRlcnJ1cHRzLiAqLworCWZvciAoaSA9IDE7IGkgPD0gYmF0Y2hfY291bnQ7IGkr KykKKwkJZmVuY2UgPSBjaGFpbl9ub3AoZ2VtX2ZkLCBzeiwgZmVuY2UsCisJCQkJICBpIDwgYmF0 Y2hfY291bnQgPyBmYWxzZSA6IHRydWUpOworCisJY2xvc2UoZmVuY2UpOworCisJLyogQ2hlY2sg YXQgbGVhc3QgYXMgbWFueSBpbnRlcnJ1cHRzIGhhcyBiZWVuIGdlbmVyYXRlZC4gKi8KKwlidXN5 ID0gcG11X3JlYWRfc2luZ2xlKGZkKTsKKwlpZ3RfYXNzZXJ0KGJ1c3kgPj0gYmF0Y2hfY291bnQp OworCisJY2xvc2UoZmQpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9mcmVxdWVuY3koaW50IGdl bV9mZCkKK3sKKwljb25zdCB1aW50NjRfdCBkdXJhdGlvbl9ucyA9IDIwMDAwMDAwMDA7CisJdWlu dDMyX3QgbWluX2ZyZXEsIG1heF9mcmVxLCBib29zdF9mcmVxOworCXVpbnQ2NF90IG1pblsyXSwg bWF4WzJdLCBzdGFydFsyXTsKKwlpZ3Rfc3Bpbl90ICpzcGluOworCWludCBmZCwgc3lzZnM7CisK KwlzeXNmcyA9IGlndF9zeXNmc19vcGVuKGdlbV9mZCwgTlVMTCk7CisJaWd0X3JlcXVpcmUoc3lz ZnMgPj0gMCk7CisKKwltaW5fZnJlcSA9IGlndF9zeXNmc19nZXRfdTMyKHN5c2ZzLCAiZ3RfUlBu X2ZyZXFfbWh6Iik7CisJbWF4X2ZyZXEgPSBpZ3Rfc3lzZnNfZ2V0X3UzMihzeXNmcywgImd0X1JQ MF9mcmVxX21oeiIpOworCWJvb3N0X2ZyZXEgPSBpZ3Rfc3lzZnNfZ2V0X3UzMihzeXNmcywgImd0 X2Jvb3N0X2ZyZXFfbWh6Iik7CisJaWd0X3JlcXVpcmUobWluX2ZyZXEgPiAwICYmIG1heF9mcmVx ID4gMCAmJiBib29zdF9mcmVxID4gMCk7CisJaWd0X3JlcXVpcmUobWF4X2ZyZXEgPiBtaW5fZnJl cSk7CisJaWd0X3JlcXVpcmUoYm9vc3RfZnJlcSA+IG1pbl9mcmVxKTsKKworCWZkID0gb3Blbl9n cm91cChJOTE1X1BNVV9SRVFVRVNURURfRlJFUVVFTkNZLCAtMSk7CisJb3Blbl9ncm91cChJOTE1 X1BNVV9BQ1RVQUxfRlJFUVVFTkNZLCBmZCk7CisKKwkvKgorCSAqIFNldCBHUFUgdG8gbWluIGZy ZXF1ZW5jeSBhbmQgcmVhZCBQTVUgY291bnRlcnMuCisJICovCisJaWd0X3JlcXVpcmUoaWd0X3N5 c2ZzX3NldF91MzIoc3lzZnMsICJndF9tYXhfZnJlcV9taHoiLCBtaW5fZnJlcSkpOworCWlndF9y ZXF1aXJlKGlndF9zeXNmc19nZXRfdTMyKHN5c2ZzLCAiZ3RfbWF4X2ZyZXFfbWh6IikgPT0gbWlu X2ZyZXEpOworCWlndF9yZXF1aXJlKGlndF9zeXNmc19zZXRfdTMyKHN5c2ZzLCAiZ3RfYm9vc3Rf ZnJlcV9taHoiLCBtaW5fZnJlcSkpOworCWlndF9yZXF1aXJlKGlndF9zeXNmc19nZXRfdTMyKHN5 c2ZzLCAiZ3RfYm9vc3RfZnJlcV9taHoiKSA9PSBtaW5fZnJlcSk7CisKKwlwbXVfcmVhZF9tdWx0 aShmZCwgMiwgc3RhcnQpOworCisJc3BpbiA9IGlndF9zcGluX2JhdGNoX25ldyhnZW1fZmQsIDAs IEk5MTVfRVhFQ19SRU5ERVIsIDApOworCWlndF9zcGluX2JhdGNoX3NldF90aW1lb3V0KHNwaW4s IGR1cmF0aW9uX25zKTsKKwlnZW1fc3luYyhnZW1fZmQsIHNwaW4tPmhhbmRsZSk7CisKKwlwbXVf cmVhZF9tdWx0aShmZCwgMiwgbWluKTsKKwltaW5bMF0gLT0gc3RhcnRbMF07CisJbWluWzFdIC09 IHN0YXJ0WzFdOworCisJaWd0X3NwaW5fYmF0Y2hfZnJlZShnZW1fZmQsIHNwaW4pOworCisJdXNs ZWVwKDEwMDAwMDApOworCisJLyoKKwkgKiBTZXQgR1BVIHRvIG1heCBmcmVxdWVuY3kgYW5kIHJl YWQgUE1VIGNvdW50ZXJzLgorCSAqLworCWlndF9yZXF1aXJlKGlndF9zeXNmc19zZXRfdTMyKHN5 c2ZzLCAiZ3RfbWF4X2ZyZXFfbWh6IiwgbWF4X2ZyZXEpKTsKKwlpZ3RfcmVxdWlyZShpZ3Rfc3lz ZnNfZ2V0X3UzMihzeXNmcywgImd0X21heF9mcmVxX21oeiIpID09IG1heF9mcmVxKTsKKwlpZ3Rf cmVxdWlyZShpZ3Rfc3lzZnNfc2V0X3UzMihzeXNmcywgImd0X2Jvb3N0X2ZyZXFfbWh6IiwgYm9v c3RfZnJlcSkpOworCWlndF9yZXF1aXJlKGlndF9zeXNmc19nZXRfdTMyKHN5c2ZzLCAiZ3RfYm9v c3RfZnJlcV9taHoiKSA9PSBib29zdF9mcmVxKTsKKworCWlndF9yZXF1aXJlKGlndF9zeXNmc19z ZXRfdTMyKHN5c2ZzLCAiZ3RfbWluX2ZyZXFfbWh6IiwgbWF4X2ZyZXEpKTsKKwlpZ3RfcmVxdWly ZShpZ3Rfc3lzZnNfZ2V0X3UzMihzeXNmcywgImd0X21pbl9mcmVxX21oeiIpID09IG1heF9mcmVx KTsKKworCXBtdV9yZWFkX211bHRpKGZkLCAyLCBzdGFydCk7CisKKwlzcGluID0gaWd0X3NwaW5f YmF0Y2hfbmV3KGdlbV9mZCwgMCwgSTkxNV9FWEVDX1JFTkRFUiwgMCk7CisJaWd0X3NwaW5fYmF0 Y2hfc2V0X3RpbWVvdXQoc3BpbiwgZHVyYXRpb25fbnMpOworCWdlbV9zeW5jKGdlbV9mZCwgc3Bp bi0+aGFuZGxlKTsKKworCXBtdV9yZWFkX211bHRpKGZkLCAyLCBtYXgpOworCW1heFswXSAtPSBz dGFydFswXTsKKwltYXhbMV0gLT0gc3RhcnRbMV07CisKKwlpZ3Rfc3Bpbl9iYXRjaF9mcmVlKGdl bV9mZCwgc3Bpbik7CisKKwkvKgorCSAqIFJlc3RvcmUgbWluL21heC4KKwkgKi8KKwlpZ3RfcmVx dWlyZShpZ3Rfc3lzZnNfc2V0X3UzMihzeXNmcywgImd0X21pbl9mcmVxX21oeiIsIG1pbl9mcmVx KSk7CisJaWd0X3JlcXVpcmUoaWd0X3N5c2ZzX2dldF91MzIoc3lzZnMsICJndF9taW5fZnJlcV9t aHoiKSA9PSBtaW5fZnJlcSk7CisKKwljbG9zZShmZCk7CisKKwlpZ3RfYXNzZXJ0KG1pblswXSA8 IG1heFswXSk7CisJaWd0X2Fzc2VydChtaW5bMV0gPCBtYXhbMV0pOworfQorCitzdGF0aWMgdm9p ZAordGVzdF9yYzYoaW50IGdlbV9mZCkKK3sKKwlpbnQ2NF90IGR1cmF0aW9uX25zID0gMiAqIDEw MDAgKiAxMDAwICogMTAwMDsKKwl1aW50NjRfdCBpZGxlLCBidXN5LCBwcmV2OworCXVuc2lnbmVk IGludCBzbGVwdDsKKwlpbnQgZmQsIGZ3OworCisJZmQgPSBvcGVuX3BtdShJOTE1X1BNVV9SQzZf UkVTSURFTkNZKTsKKworCWdlbV9xdWllc2NlbnRfZ3B1KGdlbV9mZCk7CisJdXNsZWVwKDEwMDAw MDApOworCisJLyogR28gaWRsZSBhbmQgY2hlY2sgZnVsbCBSQzYuICovCisJcHJldiA9IHBtdV9y ZWFkX3NpbmdsZShmZCk7CisJc2xlcHQgPSBtZWFzdXJlZF91c2xlZXAoZHVyYXRpb25fbnMgLyAx MDAwKTsKKwlpZGxlID0gcG11X3JlYWRfc2luZ2xlKGZkKTsKKworCWFzc2VydF93aXRoaW5fZXBz aWxvbihpZGxlIC0gcHJldiwgc2xlcHQsIHRvbGVyYW5jZSk7CisKKwkvKiBXYWtlIHVwIGRldmlj ZSBhbmQgY2hlY2sgbm8gUkM2LiAqLworCWZ3ID0gaWd0X29wZW5fZm9yY2V3YWtlX2hhbmRsZShn ZW1fZmQpOworCWlndF9hc3NlcnQoZncgPj0gMCk7CisKKwlwcmV2ID0gcG11X3JlYWRfc2luZ2xl KGZkKTsKKwl1c2xlZXAoZHVyYXRpb25fbnMgLyAxMDAwKTsKKwlidXN5ID0gcG11X3JlYWRfc2lu Z2xlKGZkKTsKKworCWFzc2VydF93aXRoaW5fZXBzaWxvbihidXN5IC0gcHJldiwgMC4wLCB0b2xl cmFuY2UpOworCisJY2xvc2UoZncpOworCWNsb3NlKGZkKTsKK30KKworc3RhdGljIHZvaWQKK3Rl c3RfcmM2cChpbnQgZ2VtX2ZkKQoreworCWludDY0X3QgZHVyYXRpb25fbnMgPSAyICogMTAwMCAq IDEwMDAgKiAxMDAwOworCXVuc2lnbmVkIGludCBudW1fcG11ID0gMTsKKwl1aW50NjRfdCBpZGxl WzNdLCBidXN5WzNdLCBwcmV2WzNdOworCXVuc2lnbmVkIGludCBzbGVwdCwgaTsKKwlpbnQgZmQs IHJldCwgZnc7CisKKwlmZCA9IG9wZW5fZ3JvdXAoSTkxNV9QTVVfUkM2X1JFU0lERU5DWSwgLTEp OworCXJldCA9IHBlcmZfaTkxNV9vcGVuX2dyb3VwKEk5MTVfUE1VX1JDNnBfUkVTSURFTkNZLCBm ZCk7CisJaWYgKHJldCA+IDApIHsKKwkJbnVtX3BtdSsrOworCQlyZXQgPSBwZXJmX2k5MTVfb3Bl bl9ncm91cChJOTE1X1BNVV9SQzZwcF9SRVNJREVOQ1ksIGZkKTsKKwkJaWYgKHJldCA+IDApCisJ CQludW1fcG11Kys7CisJfQorCisJaWd0X3JlcXVpcmUobnVtX3BtdSA9PSAzKTsKKworCWdlbV9x dWllc2NlbnRfZ3B1KGdlbV9mZCk7CisJdXNsZWVwKDEwMDAwMDApOworCisJLyogR28gaWRsZSBh bmQgY2hlY2sgZnVsbCBSQzYuICovCisJcG11X3JlYWRfbXVsdGkoZmQsIG51bV9wbXUsIHByZXYp OworCXNsZXB0ID0gbWVhc3VyZWRfdXNsZWVwKGR1cmF0aW9uX25zIC8gMTAwMCk7CisJcG11X3Jl YWRfbXVsdGkoZmQsIG51bV9wbXUsIGlkbGUpOworCisJZm9yIChpID0gMDsgaSA8IG51bV9wbXU7 IGkrKykKKwkJYXNzZXJ0X3dpdGhpbl9lcHNpbG9uKGlkbGVbaV0gLSBwcmV2W2ldLCBzbGVwdCwg dG9sZXJhbmNlKTsKKworCS8qIFdha2UgdXAgZGV2aWNlIGFuZCBjaGVjayBubyBSQzYuICovCisJ ZncgPSBpZ3Rfb3Blbl9mb3JjZXdha2VfaGFuZGxlKGdlbV9mZCk7CisJaWd0X2Fzc2VydChmdyA+ PSAwKTsKKworCXBtdV9yZWFkX211bHRpKGZkLCBudW1fcG11LCBwcmV2KTsKKwl1c2xlZXAoZHVy YXRpb25fbnMgLyAxMDAwKTsKKwlwbXVfcmVhZF9tdWx0aShmZCwgbnVtX3BtdSwgYnVzeSk7CisK Kwlmb3IgKGkgPSAwOyBpIDwgbnVtX3BtdTsgaSsrKQorCQlhc3NlcnRfd2l0aGluX2Vwc2lsb24o YnVzeVtpXSAtIHByZXZbaV0sIDAuMCwgdG9sZXJhbmNlKTsKKworCWNsb3NlKGZ3KTsKKwljbG9z ZShmZCk7Cit9CisKK2lndF9tYWluCit7CisJY29uc3QgdW5zaWduZWQgaW50IG51bV9vdGhlcl9t ZXRyaWNzID0KKwkJCQlJOTE1X1BNVV9MQVNUIC0gX19JOTE1X1BNVV9PVEhFUigwKSArIDE7CisJ dW5zaWduZWQgaW50IG51bV9lbmdpbmVzID0gMDsKKwlpbnQgZmQgPSAtMTsKKwljb25zdCBzdHJ1 Y3QgaW50ZWxfZXhlY3V0aW9uX2VuZ2luZTIgKmU7CisJdW5zaWduZWQgaW50IGk7CisKKwlpZ3Rf Zml4dHVyZSB7CisJCWZkID0gZHJtX29wZW5fZHJpdmVyX21hc3RlcihEUklWRVJfSU5URUwpOwor CisJCWlndF9yZXF1aXJlX2dlbShmZCk7CisJCWlndF9yZXF1aXJlKGk5MTVfdHlwZV9pZCgpID4g MCk7CisKKwkJZm9yX2VhY2hfZW5naW5lX2NsYXNzX2luc3RhbmNlKGZkLCBlKSB7CisJCQlpZiAo Z2VtX2hhc19lbmdpbmUoZmQsIGUtPmNsYXNzLCBlLT5pbnN0YW5jZSkpCisJCQkJbnVtX2VuZ2lu ZXMrKzsKKwkJfQorCX0KKworCS8qKgorCSAqIFRlc3QgaW52YWxpZCBhY2Nlc3MgdmlhIHBlcmYg QVBJIGlzIHJlamVjdGVkLgorCSAqLworCWlndF9zdWJ0ZXN0KCJpbnZhbGlkLWluaXQiKQorCQlp bnZhbGlkX2luaXQoKTsKKworCWZvcl9lYWNoX2VuZ2luZV9jbGFzc19pbnN0YW5jZShmZCwgZSkg eworCQkvKioKKwkJICogVGVzdCB0aGF0IGEgc2luZ2xlIGVuZ2luZSBtZXRyaWMgY2FuIGJlIGlu aXRpYWxpemVkLgorCQkgKi8KKwkJaWd0X3N1YnRlc3RfZigiaW5pdC1idXN5LSVzIiwgZS0+bmFt ZSkKKwkJCWluaXQoZmQsIGUsIEk5MTVfU0FNUExFX0JVU1kpOworCisJCWlndF9zdWJ0ZXN0X2Yo ImluaXQtd2FpdC0lcyIsIGUtPm5hbWUpCisJCQlpbml0KGZkLCBlLCBJOTE1X1NBTVBMRV9XQUlU KTsKKworCQlpZ3Rfc3VidGVzdF9mKCJpbml0LXNlbWEtJXMiLCBlLT5uYW1lKQorCQkJaW5pdChm ZCwgZSwgSTkxNV9TQU1QTEVfU0VNQSk7CisKKwkJLyoqCisJCSAqIFRlc3QgdGhhdCBlbmdpbmVz IHNob3cgbm8gbG9hZCB3aGVuIGlkbGUuCisJCSAqLworCQlpZ3Rfc3VidGVzdF9mKCJpZGxlLSVz IiwgZS0+bmFtZSkKKwkJCXNpbmdsZShmZCwgZSwgZmFsc2UpOworCisJCS8qKgorCQkgKiBUZXN0 IHRoYXQgYSBzaW5nbGUgZW5naW5lIHJlcG9ydHMgbG9hZCBjb3JyZWN0bHkuCisJCSAqLworCQlp Z3Rfc3VidGVzdF9mKCJidXN5LSVzIiwgZS0+bmFtZSkKKwkJCXNpbmdsZShmZCwgZSwgdHJ1ZSk7 CisKKwkJLyoqCisJCSAqIFRlc3QgdGhhdCB3aGVuIG9uZSBlbmdpbmUgaXMgbG9hZGVkIG90aGVy IHJlcG9ydCBubyBsb2FkLgorCQkgKi8KKwkJaWd0X3N1YnRlc3RfZigiYnVzeS1jaGVjay1hbGwt JXMiLCBlLT5uYW1lKQorCQkJYnVzeV9jaGVja19hbGwoZmQsIGUsIG51bV9lbmdpbmVzKTsKKwor CQkvKioKKwkJICogVGVzdCB0aGF0IHdoZW4gYWxsIGV4Y2VwdCBvbmUgZW5naW5lIGFyZSBsb2Fk ZWQgYWxsIGxvYWRzCisJCSAqIGFyZSBjb3JyZWN0bHkgcmVwb3J0ZWQuCisJCSAqLworCQlpZ3Rf c3VidGVzdF9mKCJtb3N0LWJ1c3ktY2hlY2stYWxsLSVzIiwgZS0+bmFtZSkKKwkJCW1vc3RfYnVz eV9jaGVja19hbGwoZmQsIGUsIG51bV9lbmdpbmVzKTsKKworCQkvKioKKwkJICogVGVzdCB0aGF0 IHNlbXBob3JlIGNvdW50ZXJzIHJlcG9ydCBubyBhY3Rpdml0eSBvbiBpZGxlCisJCSAqIG9yIGJ1 c3kgZW5naW5lcy4KKwkJICovCisJCWlndF9zdWJ0ZXN0X2YoImlkbGUtbm8tc2VtYXBob3Jlcy0l cyIsIGUtPm5hbWUpCisJCQlub19zZW1hKGZkLCBlLCBmYWxzZSk7CisKKwkJaWd0X3N1YnRlc3Rf ZigiYnVzeS1uby1zZW1hcGhvcmVzLSVzIiwgZS0+bmFtZSkKKwkJCW5vX3NlbWEoZmQsIGUsIHRy dWUpOworCisJCS8qKgorCQkgKiBDaGVjayB0aGF0IHR3byBwZXJmIGNsaWVudHMgZG8gbm90IGlu Zmx1ZW5jZSBlYWNoIG90aGVycworCQkgKiBvYnNlcnZhdGlvbnMuCisJCSAqLworCQlpZ3Rfc3Vi dGVzdF9mKCJtdWx0aS1jbGllbnQtJXMiLCBlLT5uYW1lKQorCQkJbXVsdGlfY2xpZW50KGZkLCBl KTsKKwl9CisKKwkvKioKKwkgKiBUZXN0IHRoYXQgd2hlbiBhbGwgZW5naW5lcyBhcmUgbG9hZGVk IGFsbCBsb2FkcyBhcmUKKwkgKiBjb3JyZWN0bHkgcmVwb3J0ZWQuCisJICovCisJaWd0X3N1YnRl c3QoImFsbC1idXN5LWNoZWNrLWFsbCIpCisJCWFsbF9idXN5X2NoZWNrX2FsbChmZCwgbnVtX2Vu Z2luZXMpOworCisJLyoqCisJICogVGVzdCB0aGF0IG5vbi1lbmdpbmUgY291bnRlcnMgY2FuIGJl IGluaXRpYWxpemVkIGFuZCByZWFkLiBBcGFydAorCSAqIGZyb20gdGhlIGludmFsaWQgbWV0cmlj IHdoaWNoIHNob3VsZCBmYWlsLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBudW1fb3RoZXJfbWV0 cmljcyArIDE7IGkrKykgeworCQlpZ3Rfc3VidGVzdF9mKCJvdGhlci1pbml0LSV1IiwgaSkKKwkJ CWluaXRfb3RoZXIoaSwgaSA8IG51bV9vdGhlcl9tZXRyaWNzKTsKKworCQlpZ3Rfc3VidGVzdF9m KCJvdGhlci1yZWFkLSV1IiwgaSkKKwkJCXJlYWRfb3RoZXIoaSwgaSA8IG51bV9vdGhlcl9tZXRy aWNzKTsKKwl9CisKKwkvKioKKwkgKiBUZXN0IGNvdW50ZXJzIGFyZSBub3QgYWZmZWN0ZWQgYnkg Q1BVIG9mZmxpbmUvb25saW5lIGV2ZW50cy4KKwkgKi8KKwlpZ3Rfc3VidGVzdCgiY3B1LWhvdHBs dWciKQorCQljcHVfaG90cGx1ZyhmZCk7CisKKwkvKioKKwkgKiBUZXN0IEdQVSBmcmVxdWVuY3ku CisJICovCisJaWd0X3N1YnRlc3QoImZyZXF1ZW5jeSIpCisJCXRlc3RfZnJlcXVlbmN5KGZkKTsK KworCS8qKgorCSAqIFRlc3QgaW50ZXJydXB0IGNvdW50IHJlcG9ydGluZy4KKwkgKi8KKwlpZ3Rf c3VidGVzdCgiaW50ZXJydXB0cyIpCisJCXRlc3RfaW50ZXJydXB0cyhmZCk7CisKKwkvKioKKwkg KiBUZXN0IFJDNiByZXNpZGVuY3kgcmVwb3J0aW5nLgorCSAqLworCWlndF9zdWJ0ZXN0KCJyYzYi KQorCQl0ZXN0X3JjNihmZCk7CisKKwkvKioKKwkgKiBUZXN0IFJDNnAgcmVzaWRlbmN5IHJlcG9y dGluZy4KKwkgKi8KKwlpZ3Rfc3VidGVzdCgicmM2cCIpCisJCXRlc3RfcmM2cChmZCk7CisKKwkv KioKKwkgKiBDaGVjayByZW5kZXIgbm9kZXMgYXJlIGNvdW50ZWQuCisJICovCisJaWd0X3N1YnRl c3RfZ3JvdXAgeworCQlpbnQgcmVuZGVyX2ZkOworCisJCWlndF9maXh0dXJlIHsKKwkJCXJlbmRl cl9mZCA9IGRybV9vcGVuX2RyaXZlcl9yZW5kZXIoRFJJVkVSX0lOVEVMKTsKKwkJCWlndF9yZXF1 aXJlX2dlbShyZW5kZXJfZmQpOworCisJCQlnZW1fcXVpZXNjZW50X2dwdShmZCk7CisJCX0KKwor CQlmb3JfZWFjaF9lbmdpbmVfY2xhc3NfaW5zdGFuY2UoZmQsIGUpIHsKKwkJCWlndF9zdWJ0ZXN0 X2YoInJlbmRlci1ub2RlLWJ1c3ktJXMiLCBlLT5uYW1lKQorCQkJCXNpbmdsZShmZCwgZSwgdHJ1 ZSk7CisJCX0KKworCQlpZ3RfZml4dHVyZSB7CisJCQljbG9zZShyZW5kZXJfZmQpOworCQl9CisJ fQorfQotLSAKMi45LjUKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fCkludGVsLWdmeCBtYWlsaW5nIGxpc3QKSW50ZWwtZ2Z4QGxpc3RzLmZyZWVkZXNrdG9w Lm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2ludGVs LWdmeAo=