From mboxrd@z Thu Jan 1 00:00:00 1970 From: Tvrtko Ursulin Subject: [PATCH i-g-t 5/5] tests/perf_pmu: Tests for i915 PMU API Date: Mon, 18 Sep 2017 12:38:40 +0100 Message-ID: <20170918113840.2684-6-tvrtko.ursulin@linux.intel.com> References: <20170918113840.2684-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 1065C6E362 for ; Mon, 18 Sep 2017 11:38:53 +0000 (UTC) Received: by mail-wr0-x244.google.com with SMTP id b9so166670wra.0 for ; Mon, 18 Sep 2017 04:38:52 -0700 (PDT) In-Reply-To: <20170918113840.2684-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 IHdlcmUgaW5pdGlhbHkgc2tldGNoZWQgYnkgRG1pdHJ5IFJvZ296aGtpbi4KClNpZ25lZC1vZmYt Ynk6IFR2cnRrbyBVcnN1bGluIDx0dnJ0a28udXJzdWxpbkBpbnRlbC5jb20+CkNjOiBDaHJpcyBX aWxzb24gPGNocmlzQGNocmlzLXdpbHNvbi5jby51az4KQ2M6IERtaXRyeSBSb2dvemhraW4gPGRt aXRyeS52LnJvZ296aGtpbkBpbnRlbC5jb20+Ci0tLQogbGliL2lndF9ndC5jICAgICAgICAgICB8 ICAyMyArLQogbGliL2lndF9ndC5oICAgICAgICAgICB8ICAgOCArCiB0ZXN0cy9NYWtlZmlsZS5z b3VyY2VzIHwgICAxICsKIHRlc3RzL3BlcmZfcG11LmMgICAgICAgfCA3MTMgKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwogNCBmaWxlcyBjaGFuZ2VkLCA3 MzggaW5zZXJ0aW9ucygrKSwgNyBkZWxldGlvbnMoLSkKIGNyZWF0ZSBtb2RlIDEwMDY0NCB0ZXN0 cy9wZXJmX3BtdS5jCgpkaWZmIC0tZ2l0IGEvbGliL2lndF9ndC5jIGIvbGliL2lndF9ndC5jCmlu ZGV4IGIzZjNiMzgwOWVlZS4uMTAyY2MyODQxZmViIDEwMDY0NAotLS0gYS9saWIvaWd0X2d0LmMK KysrIGIvbGliL2lndF9ndC5jCkBAIC01MzcsMTQgKzUzNywyMyBAQCB1bnNpZ25lZCBpbnRlbF9k ZXRlY3RfYW5kX2NsZWFyX21pc3NlZF9pbnRlcnJ1cHRzKGludCBmZCkKIAlyZXR1cm4gbWlzc2Vk OwogfQogCitlbnVtIGRybV9pOTE1X2dlbV9lbmdpbmVfY2xhc3MgeworCUk5MTVfRU5HSU5FX0NM QVNTX09USEVSID0gMCwKKwlJOTE1X0VOR0lORV9DTEFTU19SRU5ERVIgPSAxLAorCUk5MTVfRU5H SU5FX0NMQVNTX0NPUFkgPSAyLAorCUk5MTVfRU5HSU5FX0NMQVNTX1ZJREVPID0gMywKKwlJOTE1 X0VOR0lORV9DTEFTU19WSURFT19FTkhBTkNFID0gNCwKKwlJOTE1X0VOR0lORV9DTEFTU19NQVgg Lyogbm9uLUFCSSAqLworfTsKKwogY29uc3Qgc3RydWN0IGludGVsX2V4ZWN1dGlvbl9lbmdpbmUg aW50ZWxfZXhlY3V0aW9uX2VuZ2luZXNbXSA9IHsKLQl7ICJkZWZhdWx0IiwgTlVMTCwgMCwgMCB9 LAotCXsgInJlbmRlciIsICJyY3MwIiwgSTkxNV9FWEVDX1JFTkRFUiwgMCB9LAotCXsgImJzZCIs ICJ2Y3MwIiwgSTkxNV9FWEVDX0JTRCwgMCB9LAotCXsgImJzZDEiLCAidmNzMCIsIEk5MTVfRVhF Q19CU0QsIDE8PDEzIC8qSTkxNV9FWEVDX0JTRF9SSU5HMSovIH0sCi0JeyAiYnNkMiIsICJ2Y3Mx IiwgSTkxNV9FWEVDX0JTRCwgMjw8MTMgLypJOTE1X0VYRUNfQlNEX1JJTkcyKi8gfSwKLQl7ICJi bHQiLCAiYmNzMCIsIEk5MTVfRVhFQ19CTFQsIDAgfSwKLQl7ICJ2ZWJveCIsICJ2ZWNzMCIsIEk5 MTVfRVhFQ19WRUJPWCwgMCB9LAorCXsgImRlZmF1bHQiLCBOVUxMLCAtMSwgLTEsIDAsIDAgfSwK Kwl7ICJyZW5kZXIiLCAicmNzMCIsIEk5MTVfRU5HSU5FX0NMQVNTX1JFTkRFUiwgMCwgSTkxNV9F WEVDX1JFTkRFUiwgMCB9LAorCXsgImJzZCIsICJ2Y3MwIiwgSTkxNV9FTkdJTkVfQ0xBU1NfVklE RU8sIDAsIEk5MTVfRVhFQ19CU0QsIDAgfSwKKwl7ICJic2QxIiwgInZjczAiLCBJOTE1X0VOR0lO RV9DTEFTU19WSURFTywgMCwgSTkxNV9FWEVDX0JTRCwgMTw8MTMgLypJOTE1X0VYRUNfQlNEX1JJ TkcxKi8gfSwKKwl7ICJic2QyIiwgInZjczEiLCBJOTE1X0VOR0lORV9DTEFTU19WSURFTywgMSwg STkxNV9FWEVDX0JTRCwgMjw8MTMgLypJOTE1X0VYRUNfQlNEX1JJTkcyKi8gfSwKKwl7ICJibHQi LCAiYmNzMCIsIEk5MTVfRU5HSU5FX0NMQVNTX0NPUFksIDAsIEk5MTVfRVhFQ19CTFQsIDAgfSwK Kwl7ICJ2ZWJveCIsICJ2ZWNzMCIsIEk5MTVfRU5HSU5FX0NMQVNTX1ZJREVPX0VOSEFOQ0UsIDAs IEk5MTVfRVhFQ19WRUJPWCwgMCB9LAogCXsgTlVMTCwgMCwgMCB9CiB9OwogCmRpZmYgLS1naXQg YS9saWIvaWd0X2d0LmggYi9saWIvaWd0X2d0LmgKaW5kZXggMjU3OWNiZDM3YmU3Li40MzYwNDFj ZTljYzAgMTAwNjQ0Ci0tLSBhL2xpYi9pZ3RfZ3QuaAorKysgYi9saWIvaWd0X2d0LmgKQEAgLTY2 LDYgKzY2LDggQEAgdW5zaWduZWQgaW50ZWxfZGV0ZWN0X2FuZF9jbGVhcl9taXNzZWRfaW50ZXJy dXB0cyhpbnQgZmQpOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBpbnRlbF9leGVjdXRpb25fZW5naW5l IHsKIAljb25zdCBjaGFyICpuYW1lOwogCWNvbnN0IGNoYXIgKmZ1bGxfbmFtZTsKKwlpbnQgY2xh c3M7CisJaW50IGluc3RhbmNlOwogCXVuc2lnbmVkIGV4ZWNfaWQ7CiAJdW5zaWduZWQgZmxhZ3M7 CiB9IGludGVsX2V4ZWN1dGlvbl9lbmdpbmVzW107CkBAIC03OCw2ICs4MCwxMiBAQCBleHRlcm4g Y29uc3Qgc3RydWN0IGludGVsX2V4ZWN1dGlvbl9lbmdpbmUgewogCSAgICAgZV9fKyspIFwKIAkJ Zm9yX2lmIChnZW1faGFzX3JpbmcoZmRfXywgZmxhZ3NfXyA9IGVfXy0+ZXhlY19pZCB8IGVfXy0+ ZmxhZ3MpKQogCisjZGVmaW5lIGZvcl9lYWNoX2VuZ2luZV9jbGFzc19pbnN0YW5jZShmZF9fLCBl X18pIFwKKwlmb3IgKChlX18pID0gaW50ZWxfZXhlY3V0aW9uX2VuZ2luZXM7XAorCSAgICAgKGVf XyktPm5hbWU7IFwKKwkgICAgIChlX18pKyspIFwKKwkJZm9yX2lmICgoZV9fKS0+Y2xhc3MgPiAw KQorCiBib29sIGdlbV9jYW5fc3RvcmVfZHdvcmQoaW50IGZkLCB1bnNpZ25lZCBpbnQgZW5naW5l KTsKIAogI2VuZGlmIC8qIElHVF9HVF9IICovCmRpZmYgLS1naXQgYS90ZXN0cy9NYWtlZmlsZS5z b3VyY2VzIGIvdGVzdHMvTWFrZWZpbGUuc291cmNlcwppbmRleCBjZjU0MmRmMTgxYTguLjRiYWI2 MjQ3MTUxYyAxMDA2NDQKLS0tIGEvdGVzdHMvTWFrZWZpbGUuc291cmNlcworKysgYi90ZXN0cy9N YWtlZmlsZS5zb3VyY2VzCkBAIC0yMTcsNiArMjE3LDcgQEAgVEVTVFNfcHJvZ3MgPSBcCiAJa21z X3ZibGFuayBcCiAJbWV0YV90ZXN0IFwKIAlwZXJmIFwKKwlwZXJmX3BtdSBcCiAJcG1fYmFja2xp Z2h0IFwKIAlwbV9scHNwIFwKIAlwbV9yYzZfcmVzaWRlbmN5IFwKZGlmZiAtLWdpdCBhL3Rlc3Rz L3BlcmZfcG11LmMgYi90ZXN0cy9wZXJmX3BtdS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4 IDAwMDAwMDAwMDAwMC4uMmRiZWU1ODZkYWNjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVy Zl9wbXUuYwpAQCAtMCwwICsxLDcxMyBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDE3IEludGVs IENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBv ZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0 d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiks CisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRp bmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5 LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxs IGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRo ZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xs b3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQg dGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgp IHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMg b2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFT IElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElF RCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFO VEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5G UklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdI VCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBM SUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVS V0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUg U09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUworICogSU4gVEhFIFNPRlRXQVJF LgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNp bmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGludHR5cGVz Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUg PHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL3RpbWVzLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVz Lmg+CisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHBv bGwuaD4KKworI2luY2x1ZGUgImlndC5oIgorI2luY2x1ZGUgImlndF9wZXJmLmgiCisKK0lHVF9U RVNUX0RFU0NSSVBUSU9OKCJUZXN0IHRoZSBpOTE1IHBtdSBwZXJmIGludGVyZmFjZSIpOworCitj b25zdCBkb3VibGUgdG9sZXJhbmNlID0gMC4wMmY7Citjb25zdCB1bnNpZ25lZCBsb25nIGJhdGNo X2R1cmF0aW9uX25zID0gMTAwMCAqIDEwMDAgKiAxMDAwIC8gMjsKKworc3RhdGljIHZvaWQKK2lu aXQoaW50IGdlbV9mZCwgY29uc3Qgc3RydWN0IGludGVsX2V4ZWN1dGlvbl9lbmdpbmUgKmUsIHVp bnQ4X3Qgc2FtcGxlKQoreworCXVpbnQ2NF90IGNvbmZpZyA9IF9fSTkxNV9QTVVfRU5HSU5FKGUt PmNsYXNzLCBlLT5pbnN0YW5jZSwgc2FtcGxlKTsKKwlpbnQgZmQ7CisKKwlpZ3RfcmVxdWlyZShn ZW1faGFzX3JpbmcoZ2VtX2ZkLCBlLT5leGVjX2lkIHwgZS0+ZmxhZ3MpKTsKKworCWZkID0gcGVy Zl9pOTE1X29wZW4oY29uZmlnKTsKKwlpZ3RfYXNzZXJ0KGZkID49IDApOworCisJY2xvc2UoZmQp OworfQorCitzdGF0aWMgdWludDY0X3QgcG11X3JlYWRfc2luZ2xlKGludCBmZCkKK3sKKwl1aW50 NjRfdCBkYXRhWzJdOworCXNzaXplX3QgbGVuOworCisJbGVuID0gcmVhZChmZCwgZGF0YSwgc2l6 ZW9mKGRhdGEpKTsKKwlpZ3RfYXNzZXJ0X2VxKGxlbiwgc2l6ZW9mKGRhdGEpKTsKKworCXJldHVy biBkYXRhWzBdOworfQorCitzdGF0aWMgdm9pZCBwbXVfcmVhZF9tdWx0aShpbnQgZmQsIHVuc2ln bmVkIGludCBudW0sIHVpbnQ2NF90ICp2YWwpCit7CisJdWludDY0X3QgYnVmWzIgKyBudW1dOwor CXVuc2lnbmVkIGludCBpOworCXNzaXplX3QgbGVuOworCisJbGVuID0gcmVhZChmZCwgYnVmLCBz aXplb2YoYnVmKSk7CisJaWd0X2Fzc2VydF9lcShsZW4sIHNpemVvZihidWYpKTsKKwlmb3IgKGkg PSAwOyBpIDwgbnVtOyBpKyspCisJCXZhbFtpXSA9IGJ1ZlsyICsgaV07Cit9CisKKyNkZWZpbmUg YXNzZXJ0X3dpdGhpbl9lcHNpbG9uKHgsIHJlZiwgdG9sZXJhbmNlKSBcCisJaWd0X2Fzc2VydF9m KChkb3VibGUpKHgpIDw9ICgxLjAgKyB0b2xlcmFuY2UpICogKGRvdWJsZSlyZWYgJiYgXAorCQkg ICAgIChkb3VibGUpKHgpID49ICgxLjAgLSB0b2xlcmFuY2UpICogKGRvdWJsZSlyZWYsIFwKKwkJ ICAgICAiJyVzJyAhPSAnJXMnICglZiBub3Qgd2l0aGluICVmJSUgdG9sZXJhbmNlIG9mICVmKVxu IixcCisJCSAgICAgI3gsICNyZWYsIChkb3VibGUpeCwgdG9sZXJhbmNlICogMTAwLjAsIChkb3Vi bGUpcmVmKQorCitzdGF0aWMgdm9pZAorc2luZ2xlKGludCBnZW1fZmQsIGNvbnN0IHN0cnVjdCBp bnRlbF9leGVjdXRpb25fZW5naW5lICplLCBib29sIGJ1c3kpCit7CisJdWludDY0X3QgY29uZmln ID0gSTkxNV9QTVVfRU5HSU5FX0JVU1koZS0+Y2xhc3MsIGUtPmluc3RhbmNlKTsKKwlkb3VibGUg cmVmID0gYnVzeSA/IGJhdGNoX2R1cmF0aW9uX25zIDogMC4wZjsKKwlpZ3Rfc3Bpbl90ICpzcGlu OworCXVpbnQ2NF90IHZhbDsKKwlpbnQgZmQ7CisKKwlpZ3RfcmVxdWlyZShnZW1faGFzX3Jpbmco Z2VtX2ZkLCBlLT5leGVjX2lkIHwgZS0+ZmxhZ3MpKTsKKworCWlmIChidXN5KSB7CisJCXNwaW4g PSBpZ3Rfc3Bpbl9iYXRjaF9uZXcoZ2VtX2ZkLCAwLCBlLT5leGVjX2lkIHwgZS0+ZmxhZ3MsIDAp OworCQlpZ3Rfc3Bpbl9iYXRjaF9zZXRfdGltZW91dChzcGluLCBiYXRjaF9kdXJhdGlvbl9ucyk7 CisJfSBlbHNlIHsKKwkJdXNsZWVwKGJhdGNoX2R1cmF0aW9uX25zIC8gMTAwMCk7CisJfQorCisJ ZmQgPSBwZXJmX2k5MTVfb3Blbihjb25maWcpOworCWlndF9hc3NlcnQoZmQgPj0gMCk7CisKKwlp ZiAoYnVzeSkKKwkJZ2VtX3N5bmMoZ2VtX2ZkLCBzcGluLT5oYW5kbGUpOworCisJdmFsID0gcG11 X3JlYWRfc2luZ2xlKGZkKTsKKworCWFzc2VydF93aXRoaW5fZXBzaWxvbih2YWwsIHJlZiwgdG9s ZXJhbmNlKTsKKworCWlmIChidXN5KQorCQlpZ3Rfc3Bpbl9iYXRjaF9mcmVlKGdlbV9mZCwgc3Bp bik7CisJY2xvc2UoZmQpOworfQorCitzdGF0aWMgdm9pZAorYnVzeV9jaGVja19hbGwoaW50IGdl bV9mZCwgY29uc3Qgc3RydWN0IGludGVsX2V4ZWN1dGlvbl9lbmdpbmUgKmUsCisJICAgICAgIGNv bnN0IHVuc2lnbmVkIGludCBudW1fZW5naW5lcykKK3sKKwljb25zdCBzdHJ1Y3QgaW50ZWxfZXhl Y3V0aW9uX2VuZ2luZSAqZV87CisJdWludDY0X3QgdmFsW251bV9lbmdpbmVzXTsKKwlpbnQgZmRb Ml07CisJaWd0X3NwaW5fdCAqc3BpbjsKKwl1bnNpZ25lZCBpbnQgYnVzeV9pZHgsIGk7CisKKwlp Z3RfcmVxdWlyZShnZW1faGFzX3JpbmcoZ2VtX2ZkLCBlLT5leGVjX2lkIHwgZS0+ZmxhZ3MpKTsK KworCXNwaW4gPSBpZ3Rfc3Bpbl9iYXRjaF9uZXcoZ2VtX2ZkLCAwLCBlLT5leGVjX2lkIHwgZS0+ ZmxhZ3MsIDApOworCWlndF9zcGluX2JhdGNoX3NldF90aW1lb3V0KHNwaW4sIGJhdGNoX2R1cmF0 aW9uX25zKTsKKworCWkgPSAwOworCWZkWzBdID0gLTE7CisJZm9yX2VhY2hfZW5naW5lX2NsYXNz X2luc3RhbmNlKGZkLCBlXykgeworCQlpZiAoIWdlbV9oYXNfcmluZyhnZW1fZmQsIGVfLT5leGVj X2lkIHwgZV8tPmZsYWdzKSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChlID09IGVfKQorCQkJYnVz eV9pZHggPSBpOworCisJCWZkW2kgPT0gMCA/IDAgOiAxXSA9CisJCQlwZXJmX2k5MTVfb3Blbl9n cm91cChJOTE1X1BNVV9FTkdJTkVfQlVTWShlXy0+Y2xhc3MsCisJCQkJCQkJCSAgZV8tPmluc3Rh bmNlKSwKKwkJCQkJICAgICBmZFswXSk7CisJCWlndF9hc3NlcnQoZmRbMF0gPiAwKTsKKwkJaWd0 X2Fzc2VydChpID09IDAgfHwgZmRbMV0gPiAwKTsKKwkJaSsrOworCX0KKworCWdlbV9zeW5jKGdl bV9mZCwgc3Bpbi0+aGFuZGxlKTsKKworCXBtdV9yZWFkX211bHRpKGZkWzBdLCBudW1fZW5naW5l cywgdmFsKTsKKworCWFzc2VydF93aXRoaW5fZXBzaWxvbih2YWxbYnVzeV9pZHhdLCBiYXRjaF9k dXJhdGlvbl9ucywgdG9sZXJhbmNlKTsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2VuZ2luZXM7IGkr KykgeworCQlpZiAoaSA9PSBidXN5X2lkeCkKKwkJCWNvbnRpbnVlOworCQlhc3NlcnRfd2l0aGlu X2Vwc2lsb24odmFsW2ldLCAwLjBmLCB0b2xlcmFuY2UpOworCX0KKworCWlndF9zcGluX2JhdGNo X2ZyZWUoZ2VtX2ZkLCBzcGluKTsKKwljbG9zZShmZFswXSk7Cit9CisKK3N0YXRpYyB2b2lkCit0 d29fYnVzeV9jaGVja19hbGwoaW50IGdlbV9mZCwgY29uc3Qgc3RydWN0IGludGVsX2V4ZWN1dGlv bl9lbmdpbmUgKmUsCisJCSAgIGNvbnN0IHVuc2lnbmVkIGludCBudW1fZW5naW5lcykKK3sKKwlj b25zdCBzdHJ1Y3QgaW50ZWxfZXhlY3V0aW9uX2VuZ2luZSAqZV87CisJdWludDY0X3QgdmFsW251 bV9lbmdpbmVzXTsKKwlpbnQgZmRbMl07CisJaWd0X3NwaW5fdCAqc3BpblsyXTsKKwl1bnNpZ25l ZCBpbnQgYnVzeV9pZHhbMl0sIGk7CisKKwlpZ3RfcmVxdWlyZShnZW1faGFzX3JpbmcoZ2VtX2Zk LCBlLT5leGVjX2lkIHwgZS0+ZmxhZ3MpKTsKKwlpZ3RfYXNzZXJ0KGUtPmV4ZWNfaWQgIT0gMCAm JiBlLT5leGVjX2lkICE9IEk5MTVfRVhFQ19SRU5ERVIpOworCisJc3BpblswXSA9IGlndF9zcGlu X2JhdGNoX25ldyhnZW1fZmQsIDAsIGUtPmV4ZWNfaWQgfCBlLT5mbGFncywgMCk7CisJaWd0X3Nw aW5fYmF0Y2hfc2V0X3RpbWVvdXQoc3BpblswXSwgYmF0Y2hfZHVyYXRpb25fbnMpOworCisJc3Bp blsxXSA9IGlndF9zcGluX2JhdGNoX25ldyhnZW1fZmQsIDAsIEk5MTVfRVhFQ19SRU5ERVIsIDAp OworCWlndF9zcGluX2JhdGNoX3NldF90aW1lb3V0KHNwaW5bMV0sIGJhdGNoX2R1cmF0aW9uX25z KTsKKworCWkgPSAwOworCWZkWzBdID0gLTE7CisJZm9yX2VhY2hfZW5naW5lX2NsYXNzX2luc3Rh bmNlKGZkLCBlXykgeworCQl1bnNpZ25lZCBpbnQgaWR4ID0gaSA9PSAwID8gMCA6IDE7CisKKwkJ aWYgKCFnZW1faGFzX3JpbmcoZ2VtX2ZkLCBlXy0+ZXhlY19pZCB8IGVfLT5mbGFncykpCisJCQlj b250aW51ZTsKKworCQlpZiAoZV8tPmNsYXNzID09IEk5MTVfRU5HSU5FX0NMQVNTX1JFTkRFUiAm JiBlXy0+aW5zdGFuY2UgPT0gMCkKKwkJCWJ1c3lfaWR4WzBdID0gaTsKKwkJZWxzZSBpZiAoZSA9 PSBlXykKKwkJCWJ1c3lfaWR4WzFdID0gaTsKKworCQlmZFtpZHhdID0KKwkJCXBlcmZfaTkxNV9v cGVuX2dyb3VwKEk5MTVfUE1VX0VOR0lORV9CVVNZKGVfLT5jbGFzcywKKwkJCQkJCQkJICBlXy0+ aW5zdGFuY2UpLAorCQkJCQkgICAgIGZkWzBdKTsKKwkJaWd0X2Fzc2VydChmZFtpZHhdID4gMCk7 CisJCWkrKzsKKwl9CisKKwlnZW1fc3luYyhnZW1fZmQsIHNwaW5bMF0tPmhhbmRsZSk7CisJZ2Vt X3N5bmMoZ2VtX2ZkLCBzcGluWzFdLT5oYW5kbGUpOworCisJcG11X3JlYWRfbXVsdGkoZmRbMF0s IG51bV9lbmdpbmVzLCB2YWwpOworCisJZm9yIChpID0gMDsgaSA8IG51bV9lbmdpbmVzOyBpKysp IHsKKwkJaWYgKGkgPT0gYnVzeV9pZHhbMF0gfHwgaSA9PSBidXN5X2lkeFsxXSkKKwkJCWFzc2Vy dF93aXRoaW5fZXBzaWxvbih2YWxbaV0sIGJhdGNoX2R1cmF0aW9uX25zLAorCQkJCQkgICAgICB0 b2xlcmFuY2UpOworCQllbHNlCisJCQlhc3NlcnRfd2l0aGluX2Vwc2lsb24odmFsW2ldLCAwLjBm LCB0b2xlcmFuY2UpOworCX0KKworCWlndF9zcGluX2JhdGNoX2ZyZWUoZ2VtX2ZkLCBzcGluWzBd KTsKKwlpZ3Rfc3Bpbl9iYXRjaF9mcmVlKGdlbV9mZCwgc3BpblsxXSk7CisJY2xvc2UoZmRbMF0p OworfQorCitzdGF0aWMgdm9pZAorbm9fc2VtYShpbnQgZ2VtX2ZkLCBjb25zdCBzdHJ1Y3QgaW50 ZWxfZXhlY3V0aW9uX2VuZ2luZSAqZSwgYm9vbCBidXN5KQoreworCWlndF9zcGluX3QgKnNwaW47 CisJdWludDY0X3QgdmFsWzJdOworCWludCBmZCwgZmQyOworCisJaWd0X3JlcXVpcmUoZ2VtX2hh c19yaW5nKGdlbV9mZCwgZS0+ZXhlY19pZCB8IGUtPmZsYWdzKSk7CisKKwlpZiAoYnVzeSkgewor CQlzcGluID0gaWd0X3NwaW5fYmF0Y2hfbmV3KGdlbV9mZCwgMCwgZS0+ZXhlY19pZCB8IGUtPmZs YWdzLCAwKTsKKwkJaWd0X3NwaW5fYmF0Y2hfc2V0X3RpbWVvdXQoc3BpbiwgYmF0Y2hfZHVyYXRp b25fbnMpOworCX0gZWxzZSB7CisJCXVzbGVlcChiYXRjaF9kdXJhdGlvbl9ucyAvIDEwMDApOwor CX0KKworCWZkID0gcGVyZl9pOTE1X29wZW5fZ3JvdXAoSTkxNV9QTVVfRU5HSU5FX1NFTUEoZS0+ Y2xhc3MsIGUtPmluc3RhbmNlKSwKKwkJCQkgIC0xKTsKKwlpZ3RfYXNzZXJ0KGZkID49IDApOwor CWZkMiA9IHBlcmZfaTkxNV9vcGVuX2dyb3VwKEk5MTVfUE1VX0VOR0lORV9XQUlUKGUtPmNsYXNz LCBlLT5pbnN0YW5jZSksCisJCQkJICBmZCk7CisKKwlwbXVfcmVhZF9tdWx0aShmZCwgMiwgdmFs KTsKKworCWFzc2VydF93aXRoaW5fZXBzaWxvbih2YWxbMF0sIDAuMGYsIHRvbGVyYW5jZSk7CisJ YXNzZXJ0X3dpdGhpbl9lcHNpbG9uKHZhbFsxXSwgMC4wZiwgdG9sZXJhbmNlKTsKKworCWlmIChi dXN5KQorCQlpZ3Rfc3Bpbl9iYXRjaF9mcmVlKGdlbV9mZCwgc3Bpbik7CisJY2xvc2UoZmQyKTsK KwljbG9zZShmZCk7Cit9CisKK3N0YXRpYyB2b2lkCittdWx0aV9jbGllbnQoaW50IGdlbV9mZCwg Y29uc3Qgc3RydWN0IGludGVsX2V4ZWN1dGlvbl9lbmdpbmUgKmUpCit7CisJdWludDY0X3QgY29u ZmlnID0gSTkxNV9QTVVfRU5HSU5FX0JVU1koZS0+Y2xhc3MsIGUtPmluc3RhbmNlKTsKKwlpZ3Rf c3Bpbl90ICpzcGluOworCXVpbnQ2NF90IHZhbFsyXTsKKwlpbnQgZmRbMl07CisKKwlpZ3RfcmVx dWlyZShnZW1faGFzX3JpbmcoZ2VtX2ZkLCBlLT5leGVjX2lkIHwgZS0+ZmxhZ3MpKTsKKworCXNw aW4gPSBpZ3Rfc3Bpbl9iYXRjaF9uZXcoZ2VtX2ZkLCAwLCBlLT5leGVjX2lkIHwgZS0+ZmxhZ3Ms IDApOworCWlndF9zcGluX2JhdGNoX3NldF90aW1lb3V0KHNwaW4sIGJhdGNoX2R1cmF0aW9uX25z KTsKKworCWZkWzBdID0gcGVyZl9pOTE1X29wZW4oY29uZmlnKTsKKwlpZ3RfYXNzZXJ0KGZkWzBd ID49IDApOworCisJdXNsZWVwKGJhdGNoX2R1cmF0aW9uX25zIC8gNDAwMCk7CisKKwlmZFsxXSA9 IHBlcmZfaTkxNV9vcGVuKGNvbmZpZyk7CisJaWd0X2Fzc2VydChmZFsxXSA+PSAwKTsKKworCXVz bGVlcChiYXRjaF9kdXJhdGlvbl9ucyAvIDMwMDApOworCisJdmFsWzFdID0gcG11X3JlYWRfc2lu Z2xlKGZkWzFdKTsKKwljbG9zZShmZFsxXSk7CisKKwlnZW1fc3luYyhnZW1fZmQsIHNwaW4tPmhh bmRsZSk7CisKKwl2YWxbMF0gPSBwbXVfcmVhZF9zaW5nbGUoZmRbMF0pOworCisJYXNzZXJ0X3dp dGhpbl9lcHNpbG9uKHZhbFswXSwgYmF0Y2hfZHVyYXRpb25fbnMsIHRvbGVyYW5jZSk7CisJYXNz ZXJ0X3dpdGhpbl9lcHNpbG9uKHZhbFsxXSwgYmF0Y2hfZHVyYXRpb25fbnMgLyAzLCB0b2xlcmFu Y2UpOworCisJaWd0X3NwaW5fYmF0Y2hfZnJlZShnZW1fZmQsIHNwaW4pOworCWNsb3NlKGZkWzBd KTsKK30KKworLyoqCisgKiBUZXN0cyB0aGF0IGk5MTUgUE1VIGNvcmVjdGx5IGVycm9yIG91dCBp biBpbnZhbGlkIGluaXRpYWxpemF0aW9uLgorICogaTkxNSBQTVUgaXMgdW5jb3JlIFBNVSwgdGh1 czoKKyAqICAtIHNhbXBsaW5nIHBlcmlvZCBpcyBub3Qgc3VwcG9ydGVkCisgKiAgLSBwaWQgPiAw IGlzIG5vdCBzdXBwb3J0ZWQgc2luY2Ugd2UgY2FuJ3QgY291bnQgcGVyLXByb2Nlc3MgKHdlIGNv dW50CisgKiAgICBwZXIgd2hvbGUgc3lzdGVtKAorICogIC0gY3B1ICE9IDAgaXMgbm90IHN1cHBv cnRlZCBzaW5jZSBpOTE1IFBNVSBleHBvc2VzIGNwdW1hc2sgZm9yIENQVTAKKyAqLworc3RhdGlj IHZvaWQgaW52YWxpZF9pbml0KHZvaWQpCit7CisJc3RydWN0IHBlcmZfZXZlbnRfYXR0ciBhdHRy OworCWludCBwaWQsIGNwdTsKKworI2RlZmluZSBBVFRSX0lOSVQoKSBcCitkbyB7IFwKKwltZW1z ZXQoJmF0dHIsIDAsIHNpemVvZiAoYXR0cikpOyBcCisJYXR0ci5jb25maWcgPSBJOTE1X1BNVV9F TkdJTkVfQlVTWShJOTE1X0VOR0lORV9DTEFTU19SRU5ERVIsIDApOyBcCisJYXR0ci50eXBlID0g aTkxNV90eXBlX2lkKCk7IFwKKwlpZ3RfYXNzZXJ0KGF0dHIudHlwZSAhPSAwKTsgXAorfSB3aGls ZSgwKQorCisJQVRUUl9JTklUKCk7CisJYXR0ci5zYW1wbGVfcGVyaW9kID0gMTAwOworCXBpZCA9 IC0xOworCWNwdSA9IDA7CisJaWd0X2Fzc2VydF9lcShwZXJmX2V2ZW50X29wZW4oJmF0dHIsIHBp ZCwgY3B1LCAtMSwgMCksIC0xKTsKKwlpZ3RfYXNzZXJ0X2VxKGVycm5vLCBFSU5WQUwpOworCisJ QVRUUl9JTklUKCk7CisJcGlkID0gMDsKKwljcHUgPSAwOworCWlndF9hc3NlcnRfZXEocGVyZl9l dmVudF9vcGVuKCZhdHRyLCBwaWQsIGNwdSwgLTEsIDApLCAtMSk7CisJaWd0X2Fzc2VydF9lcShl cnJubywgRUlOVkFMKTsKKworCUFUVFJfSU5JVCgpOworCXBpZCA9IC0xOworCWNwdSA9IDE7CisJ aWd0X2Fzc2VydF9lcShwZXJmX2V2ZW50X29wZW4oJmF0dHIsIHBpZCwgY3B1LCAtMSwgMCksIC0x KTsKKwlpZ3RfYXNzZXJ0X2VxKGVycm5vLCBFTk9ERVYpOworfQorCitzdGF0aWMgdm9pZCBpbml0 X290aGVyKHVuc2lnbmVkIGludCBpLCBib29sIHZhbGlkKQoreworCWludCBmZDsKKworCWZkID0g cGVyZl9pOTE1X29wZW4oX19JOTE1X1BNVV9PVEhFUihpKSk7CisJaWd0X3JlcXVpcmUoIShmZCA8 IDAgJiYgZXJybm8gPT0gRU5PREVWKSk7CisJaWYgKHZhbGlkKSB7CisJCWlndF9hc3NlcnQoZmQg Pj0gMCk7CisJfSBlbHNlIHsKKwkJaWd0X2Fzc2VydChmZCA8IDApOworCQlyZXR1cm47CisJfQor CisJY2xvc2UoZmQpOworfQorCitzdGF0aWMgdm9pZCByZWFkX290aGVyKHVuc2lnbmVkIGludCBp LCBib29sIHZhbGlkKQoreworCWludCBmZDsKKworCWZkID0gcGVyZl9pOTE1X29wZW4oX19JOTE1 X1BNVV9PVEhFUihpKSk7CisJaWd0X3JlcXVpcmUoIShmZCA8IDAgJiYgZXJybm8gPT0gRU5PREVW KSk7CisJaWYgKHZhbGlkKSB7CisJCWlndF9hc3NlcnQoZmQgPj0gMCk7CisJfSBlbHNlIHsKKwkJ aWd0X2Fzc2VydChmZCA8IDApOworCQlyZXR1cm47CisJfQorCisJKHZvaWQpcG11X3JlYWRfc2lu Z2xlKGZkKTsKKworCWNsb3NlKGZkKTsKK30KKworc3RhdGljIGJvb2wgY3B1MF9ob3RwbHVnX3N1 cHBvcnQodm9pZCkKK3sKKwlpbnQgZmQgPSBvcGVuKCIvc3lzL2RldmljZXMvc3lzdGVtL2NwdS9j cHUwL29ubGluZSIsIE9fV1JPTkxZKTsKKworCWNsb3NlKGZkKTsKKworCXJldHVybiBmZCA+IDA7 Cit9CisKK3N0YXRpYyB1aW50NjRfdAorZWxhcHNlZF9ucyhjb25zdCBzdHJ1Y3QgdGltZXNwZWMg KnN0YXJ0LCBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKmVuZCkKK3sKKwlyZXR1cm4gKChlbmQtPnR2 X3NlYyAtIHN0YXJ0LT50dl9zZWMpICogMWU5ICsKKwkJKGVuZC0+dHZfbnNlYyAtIHN0YXJ0LT50 dl9uc2VjKSk7Cit9CisKK3N0YXRpYyB2b2lkIGNwdV9ob3RwbHVnKGludCBnZW1fZmQpCit7CisJ c3RydWN0IHRpbWVzcGVjIHN0YXJ0LCBub3c7CisJaWd0X3NwaW5fdCAqc3BpbjsKKwl1aW50NjRf dCB2YWwsIHJlZjsKKwlpbnQgZmQ7CisKKwlpZ3RfcmVxdWlyZShjcHUwX2hvdHBsdWdfc3VwcG9y dCgpKTsKKworCXNwaW4gPSBpZ3Rfc3Bpbl9iYXRjaF9uZXcoZ2VtX2ZkLCAwLCBJOTE1X0VYRUNf UkVOREVSLCAwKTsKKwlmZCA9IHBlcmZfaTkxNV9vcGVuKEk5MTVfUE1VX0VOR0lORV9CVVNZKEk5 MTVfRU5HSU5FX0NMQVNTX1JFTkRFUiwgMCkpOworCWlndF9hc3NlcnQoZmQgPj0gMCk7CisKKwlj bG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJnN0YXJ0KTsKKworCWlndF9mb3JrKGNoaWxk LCAxKSB7CisJCWludCBjcHUgPSAwOworCisJCWZvciAoOzspIHsKKwkJCWNoYXIgbmFtZVsxMjhd OworCQkJaW50IGNwdWZkOworCisJCQlzcHJpbnRmKG5hbWUsICIvc3lzL2RldmljZXMvc3lzdGVt L2NwdS9jcHUlZC9vbmxpbmUiLAorCQkJCWNwdSk7CisJCQljcHVmZCA9IG9wZW4obmFtZSwgT19X Uk9OTFkpOworCQkJaWYgKGNwdWZkID09IC0xKSB7CisJCQkJaWd0X2Fzc2VydChjcHUgPiAwKTsK KwkJCQlicmVhazsKKwkJCX0KKwkJCWlndF9hc3NlcnRfZXEod3JpdGUoY3B1ZmQsICIwIiwgMiks IDIpOworCisJCQl1c2xlZXAoMTAwMCAqIDEwMDApOworCisJCQlpZ3RfYXNzZXJ0X2VxKHdyaXRl KGNwdWZkLCAiMSIsIDIpLCAyKTsKKworCQkJY2xvc2UoY3B1ZmQpOworCQkJY3B1Kys7CisJCX0K Kwl9CisKKwlpZ3Rfd2FpdGNoaWxkcmVuKCk7CisKKwlpZ3Rfc3Bpbl9iYXRjaF9lbmQoc3Bpbik7 CisJZ2VtX3N5bmMoZ2VtX2ZkLCBzcGluLT5oYW5kbGUpOworCisJY2xvY2tfZ2V0dGltZShDTE9D S19NT05PVE9OSUMsICZub3cpOworCXZhbCA9IHBtdV9yZWFkX3NpbmdsZShmZCk7CisKKwlyZWYg PSBlbGFwc2VkX25zKCZzdGFydCwgJm5vdyk7CisKKwlhc3NlcnRfd2l0aGluX2Vwc2lsb24odmFs LCByZWYsIHRvbGVyYW5jZSk7CisKKwlpZ3Rfc3Bpbl9iYXRjaF9mcmVlKGdlbV9mZCwgc3Bpbik7 CisJY2xvc2UoZmQpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9pbnRlcnJ1cHRzKGludCBnZW1f ZmQpCit7CisJaWd0X3NwaW5fdCAqc3BpbjsKKwl1aW50NjRfdCBpZGxlLCBidXN5LCBwcmV2Owor CWludCBmZDsKKworCWZkID0gcGVyZl9pOTE1X29wZW4oSTkxNV9QTVVfSU5URVJSVVBUUyk7CisJ aWd0X2Fzc2VydChmZCA+PSAwKTsKKworCWdlbV9xdWllc2NlbnRfZ3B1KGdlbV9mZCk7CisJc2xl ZXAoMik7CisJcHJldiA9IHBtdV9yZWFkX3NpbmdsZShmZCk7CisJdXNsZWVwKGJhdGNoX2R1cmF0 aW9uX25zIC8gMTAwMCk7CisJaWRsZSA9IHBtdV9yZWFkX3NpbmdsZShmZCk7CisKKwlpZ3RfYXNz ZXJ0X2VxKGlkbGUgLSBwcmV2LCAwKTsKKworCXNwaW4gPSBpZ3Rfc3Bpbl9iYXRjaF9uZXcoZ2Vt X2ZkLCAwLCBJOTE1X0VYRUNfUkVOREVSLCAwKTsKKwlpZ3Rfc3Bpbl9iYXRjaF9zZXRfdGltZW91 dChzcGluLCBiYXRjaF9kdXJhdGlvbl9ucyk7CisJZ2VtX3N5bmMoZ2VtX2ZkLCBzcGluLT5oYW5k bGUpOworCisJYnVzeSA9IHBtdV9yZWFkX3NpbmdsZShmZCk7CisJaWd0X2Fzc2VydChidXN5ID4g aWRsZSk7CisKKwlpZ3Rfc3Bpbl9iYXRjaF9mcmVlKGdlbV9mZCwgc3Bpbik7CisJY2xvc2UoZmQp OworfQorCitzdGF0aWMgdm9pZAordGVzdF9mcmVxdWVuY3koaW50IGdlbV9mZCkKK3sKKwlpZ3Rf c3Bpbl90ICpzcGluOworCXVpbnQ2NF90IGlkbGVbMl0sIGJ1c3lbMl07CisJaW50IGZkOworCisJ ZmQgPSBwZXJmX2k5MTVfb3Blbl9ncm91cChJOTE1X1BNVV9SRVFVRVNURURfRlJFUVVFTkNZLCAt MSk7CisJaWd0X2Fzc2VydChmZCA+PSAwKTsKKwlpZ3RfYXNzZXJ0KHBlcmZfaTkxNV9vcGVuX2dy b3VwKEk5MTVfUE1VX0FDVFVBTF9GUkVRVUVOQ1ksIGZkKSA+PSAwKTsKKworCWdlbV9xdWllc2Nl bnRfZ3B1KGdlbV9mZCk7CisJdXNsZWVwKGJhdGNoX2R1cmF0aW9uX25zIC8gMTAwMCk7CisKKwlw bXVfcmVhZF9tdWx0aShmZCwgMiwgaWRsZSk7CisKKwlzcGluID0gaWd0X3NwaW5fYmF0Y2hfbmV3 KGdlbV9mZCwgMCwgSTkxNV9FWEVDX1JFTkRFUiwgMCk7CisJaWd0X3NwaW5fYmF0Y2hfc2V0X3Rp bWVvdXQoc3BpbiwgYmF0Y2hfZHVyYXRpb25fbnMpOworCWdlbV9zeW5jKGdlbV9mZCwgc3Bpbi0+ aGFuZGxlKTsKKworCXBtdV9yZWFkX211bHRpKGZkLCAyLCBidXN5KTsKKworCWlndF9hc3NlcnQo YnVzeVswXSA+IGlkbGVbMF0pOworCWlndF9hc3NlcnQoYnVzeVsxXSA+IGlkbGVbMV0pOworCisJ aWd0X3NwaW5fYmF0Y2hfZnJlZShnZW1fZmQsIHNwaW4pOworCWNsb3NlKGZkKTsKK30KKworc3Rh dGljIHZvaWQKK3Rlc3RfcmM2KGludCBnZW1fZmQpCit7CisJaW50NjRfdCBkdXJhdGlvbl9ucyA9 IDUwMCAqIDEwMDAgKiAxMDAwOworCWlndF9zcGluX3QgKnNwaW47CisJdWludDY0X3QgaWRsZSwg YnVzeSwgcHJldjsKKwlpbnQgZmQ7CisKKwlmZCA9IHBlcmZfaTkxNV9vcGVuKEk5MTVfUE1VX1JD Nl9SRVNJREVOQ1kpOworCWlndF9hc3NlcnQoZmQgPj0gMCk7CisKKwlnZW1fcXVpZXNjZW50X2dw dShnZW1fZmQpOworCXNsZWVwKDIpOworCisJcHJldiA9IHBtdV9yZWFkX3NpbmdsZShmZCk7CisJ dXNsZWVwKGR1cmF0aW9uX25zIC8gMTAwMCk7CisJaWRsZSA9IHBtdV9yZWFkX3NpbmdsZShmZCk7 CisKKwlhc3NlcnRfd2l0aGluX2Vwc2lsb24oaWRsZSAtIHByZXYsIGR1cmF0aW9uX25zLCB0b2xl cmFuY2UpOworCisJc3BpbiA9IGlndF9zcGluX2JhdGNoX25ldyhnZW1fZmQsIDAsIEk5MTVfRVhF Q19SRU5ERVIsIDApOworCWlndF9zcGluX2JhdGNoX3NldF90aW1lb3V0KHNwaW4sIGR1cmF0aW9u X25zKTsKKworCXByZXYgPSBwbXVfcmVhZF9zaW5nbGUoZmQpOworCisJZ2VtX3N5bmMoZ2VtX2Zk LCBzcGluLT5oYW5kbGUpOworCisJYnVzeSA9IHBtdV9yZWFkX3NpbmdsZShmZCk7CisJYXNzZXJ0 X3dpdGhpbl9lcHNpbG9uKGJ1c3kgLSBwcmV2LCAwLjAsIHRvbGVyYW5jZSk7CisKKwlpZ3Rfc3Bp bl9iYXRjaF9mcmVlKGdlbV9mZCwgc3Bpbik7CisJY2xvc2UoZmQpOworfQorCitzdGF0aWMgdm9p ZAordGVzdF9yYzZwKGludCBnZW1fZmQpCit7CisJY29uc3QgdW5zaWduZWQgaW50IGRldmlkID0g aW50ZWxfZ2V0X2RybV9kZXZpZChnZW1fZmQpOworCWludDY0X3QgZHVyYXRpb25fbnMgPSAyICog MTAwMCAqIDEwMDAgKiAxMDAwOworCXVuc2lnbmVkIGludCBudW1fcG11ID0gMTsKKwlpZ3Rfc3Bp bl90ICpzcGluOworCXVpbnQ2NF90IGlkbGVbM10sIGJ1c3lbM10sIHByZXZbM107CisJdW5zaWdu ZWQgaW50IGk7CisJaW50IGZkLCByZXQ7CisKKwlpZ3RfcmVxdWlyZShpbnRlbF9nZW4oZGV2aWQp IDwgOCAmJiAhSVNfSEFTV0VMTChkZXZpZCkpOworCisJZmQgPSBwZXJmX2k5MTVfb3Blbl9ncm91 cChJOTE1X1BNVV9SQzZfUkVTSURFTkNZLCAtMSk7CisJaWd0X2Fzc2VydChmZCA+PSAwKTsKKwor CXJldCA9IHBlcmZfaTkxNV9vcGVuX2dyb3VwKEk5MTVfUE1VX1JDNnBfUkVTSURFTkNZLCBmZCk7 CisJaWYgKHJldCA+IDApIHsKKwkJbnVtX3BtdSsrOworCQlyZXQgPSBwZXJmX2k5MTVfb3Blbl9n cm91cChJOTE1X1BNVV9SQzZwX1JFU0lERU5DWSwgZmQpOworCQlpZiAocmV0ID4gMCkKKwkJCW51 bV9wbXUrKzsKKwl9CisKKwlnZW1fcXVpZXNjZW50X2dwdShnZW1fZmQpOworCXNsZWVwKDIpOwor CisJcG11X3JlYWRfbXVsdGkoZmQsIG51bV9wbXUsIHByZXYpOworCXVzbGVlcChkdXJhdGlvbl9u cyAvIDEwMDApOworCXBtdV9yZWFkX211bHRpKGZkLCBudW1fcG11LCBpZGxlKTsKKworCWZvciAo aSA9IDA7IGkgPCBudW1fcG11OyBpKyspCisJCWFzc2VydF93aXRoaW5fZXBzaWxvbihpZGxlW2ld IC0gcHJldltpXSwgZHVyYXRpb25fbnMsCisJCQkJICAgICAgdG9sZXJhbmNlKTsKKworCXNwaW4g PSBpZ3Rfc3Bpbl9iYXRjaF9uZXcoZ2VtX2ZkLCAwLCBJOTE1X0VYRUNfUkVOREVSLCAwKTsKKwlp Z3Rfc3Bpbl9iYXRjaF9zZXRfdGltZW91dChzcGluLCBkdXJhdGlvbl9ucyk7CisKKwlwbXVfcmVh ZF9tdWx0aShmZCwgbnVtX3BtdSwgcHJldik7CisKKwlnZW1fc3luYyhnZW1fZmQsIHNwaW4tPmhh bmRsZSk7CisKKwlwbXVfcmVhZF9tdWx0aShmZCwgbnVtX3BtdSwgYnVzeSk7CisKKwlmb3IgKGkg PSAwOyBpIDwgbnVtX3BtdTsgaSsrKQorCQlhc3NlcnRfd2l0aGluX2Vwc2lsb24oYnVzeVtpXSAt IHByZXZbaV0sIDAuMCwgdG9sZXJhbmNlKTsKKworCWlndF9zcGluX2JhdGNoX2ZyZWUoZ2VtX2Zk LCBzcGluKTsKKwljbG9zZShmZCk7Cit9CisKK2lndF9tYWluCit7CisJY29uc3QgdW5zaWduZWQg aW50IG51bV9vdGhlcl9tZXRyaWNzID0KKwkJCQlJOTE1X1BNVV9MQVNUIC0gX19JOTE1X1BNVV9P VEhFUigwKSArIDE7CisJdW5zaWduZWQgaW50IG51bV9lbmdpbmVzID0gMDsKKwlpbnQgZmQgPSAt MTsKKwljb25zdCBzdHJ1Y3QgaW50ZWxfZXhlY3V0aW9uX2VuZ2luZSAqZTsKKwl1bnNpZ25lZCBp bnQgaTsKKworCWlndF9maXh0dXJlIHsKKwkJZmQgPSBkcm1fb3Blbl9kcml2ZXJfbWFzdGVyKERS SVZFUl9JTlRFTCk7CisKKwkJaWd0X3JlcXVpcmVfZ2VtKGZkKTsKKwkJaWd0X3JlcXVpcmUoaTkx NV90eXBlX2lkKCkgPiAwKTsKKworCQlmb3JfZWFjaF9lbmdpbmVfY2xhc3NfaW5zdGFuY2UoZmQs IGUpIHsKKwkJCWlmIChnZW1faGFzX3JpbmcoZmQsIGUtPmV4ZWNfaWQgfCBlLT5mbGFncykpCisJ CQkJbnVtX2VuZ2luZXMrKzsKKwkJfQorCX0KKworCS8qKgorCSAqIFRlc3QgaW52YWxpZCBhY2Nl c3MgdmlhIHBlcmYgQVBJIGlzIHJlamVjdGVkLgorCSAqLworCWlndF9zdWJ0ZXN0KCJpbnZhbGlk LWluaXQiKQorCQlpbnZhbGlkX2luaXQoKTsKKworCWZvcl9lYWNoX2VuZ2luZV9jbGFzc19pbnN0 YW5jZShmZCwgZSkgeworCQkvKioKKwkJICogVGVzdCB0aGF0IGEgc2luZ2xlIGVuZ2luZSBtZXRy aWMgY2FuIGJlIGluaXRpYWxpemVkLgorCQkgKi8KKwkJaWd0X3N1YnRlc3RfZigiaW5pdC1idXN5 LSVzIiwgZS0+bmFtZSkKKwkJCWluaXQoZmQsIGUsIEk5MTVfU0FNUExFX0JVU1kpOworCisJCWln dF9zdWJ0ZXN0X2YoImluaXQtd2FpdC0lcyIsIGUtPm5hbWUpCisJCQlpbml0KGZkLCBlLCBJOTE1 X1NBTVBMRV9XQUlUKTsKKworCQlpZ3Rfc3VidGVzdF9mKCJpbml0LXNlbWEtJXMiLCBlLT5uYW1l KQorCQkJaW5pdChmZCwgZSwgSTkxNV9TQU1QTEVfU0VNQSk7CisKKwkJLyoqCisJCSAqIFRlc3Qg dGhhdCBlbmdpbmVzIHNob3cgbm8gbG9hZCB3aGVuIGlkbGUuCisJCSAqLworCQlpZ3Rfc3VidGVz dF9mKCJpZGxlLSVzIiwgZS0+bmFtZSkKKwkJCXNpbmdsZShmZCwgZSwgZmFsc2UpOworCisJCS8q KgorCQkgKiBUZXN0IHRoYXQgYSBzaW5nbGUgZW5naW5lIHJlcG9ydHMgbG9hZCBjb3JyZWN0bHku CisJCSAqLworCQlpZ3Rfc3VidGVzdF9mKCJidXN5LSVzIiwgZS0+bmFtZSkKKwkJCXNpbmdsZShm ZCwgZSwgdHJ1ZSk7CisKKwkJLyoqCisJCSAqIFRlc3QgdGhhdCB3aGVuIG9uZSBlbmdpbmUgaXMg bG9hZGVkIG90aGVyIHJlcG9ydCBubyBsb2FkLgorCQkgKi8KKwkJaWd0X3N1YnRlc3RfZigiYnVz eS1jaGVjay1hbGwtJXMiLCBlLT5uYW1lKQorCQkJYnVzeV9jaGVja19hbGwoZmQsIGUsIG51bV9l bmdpbmVzKTsKKworCQkvKioKKwkJICogVGVzdCB0aGF0IHdoZW4gdHdvIGVuZ2luZXMgYXJlIGxv YWRlZCBvdGhlciByZXBvcnQgbm8gbG9hZC4KKwkJICovCisJCWlmICghKGUtPmNsYXNzID09IEk5 MTVfRU5HSU5FX0NMQVNTX1JFTkRFUiAmJiBlLT5pbnN0YW5jZSA9PSAwKSkKKwkJCWlndF9zdWJ0 ZXN0X2YoInR3by1idXN5LWNoZWNrLWFsbC0lcyIsIGUtPm5hbWUpCisJCQkJdHdvX2J1c3lfY2hl Y2tfYWxsKGZkLCBlLCBudW1fZW5naW5lcyk7CisKKwkJLyoqCisJCSAqIFRlc3QgdGhhdCBzZW1w aG9yZSBjb3VudGVycyByZXBvcnQgbm8gYWN0aXZpdHkgb24gaWRsZQorCQkgKiBlbmdpbmVzLgor CQkgKi8KKwkJaWd0X3N1YnRlc3RfZigiaWRsZS1uby1zZW1hcGhvcmVzLSVzIiwgZS0+bmFtZSkK KwkJCW5vX3NlbWEoZmQsIGUsIGZhbHNlKTsKKworCQlpZ3Rfc3VidGVzdF9mKCJidXN5LW5vLXNl bWFwaG9yZXMtJXMiLCBlLT5uYW1lKQorCQkJbm9fc2VtYShmZCwgZSwgdHJ1ZSk7CisKKwkJLyoq CisJCSAqIENoZWNrIHRoYXQgdHdvIHBlcmYgY2xpZW50cyBkbyBub3QgaW5mbHVlbmNlIGVhY2gg b3RoZXJzCisJCSAqIG9ic2VydmF0aW9ucy4KKwkJICovCisJCWlndF9zdWJ0ZXN0X2YoIm11bHRp LWNsaWVudC0lcyIsIGUtPm5hbWUpCisJCQltdWx0aV9jbGllbnQoZmQsIGUpOworCX0KKworCS8q KgorCSAqIFRlc3QgdGhhdCBub24tZW5naW5lIGNvdW50ZXJzIGNhbiBiZSBpbml0aWFsaXplZCBh bmQgcmVhZC4gQXBhcnQKKwkgKiBmcm9tIHRoZSBpbnZhbGlkIG1ldHJpYyB3aGljaCBzaG91bGQg ZmFpbC4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnVtX290aGVyX21ldHJpY3MgKyAxOyBpKysp IHsKKwkJaWd0X3N1YnRlc3RfZigib3RoZXItaW5pdC0ldSIsIGkpCisJCQlpbml0X290aGVyKGks IGkgPCBudW1fb3RoZXJfbWV0cmljcyk7CisKKwkJaWd0X3N1YnRlc3RfZigib3RoZXItcmVhZC0l dSIsIGkpCisJCQlyZWFkX290aGVyKGksIGkgPCBudW1fb3RoZXJfbWV0cmljcyk7CisJfQorCisJ LyoqCisJICogVGVzdCBjb3VudGVycyBhcmUgbm90IGFmZmVjdGVkIGJ5IENQVSBvZmZsaW5lL29u bGluZSBldmVudHMuCisJICovCisJaWd0X3N1YnRlc3QoImNwdS1ob3RwbHVnIikKKwkJY3B1X2hv dHBsdWcoZmQpOworCisJLyoqCisJICogVGVzdCBHUFUgZnJlcXVlbmN5LgorCSAqLworCWlndF9z dWJ0ZXN0KCJmcmVxdWVuY3kiKQorCQl0ZXN0X2ZyZXF1ZW5jeShmZCk7CisKKwkvKioKKwkgKiBU ZXN0IGludGVycnVwdCBjb3VudCByZXBvcnRpbmcuCisJICovCisJaWd0X3N1YnRlc3QoImludGVy cnVwdHMiKQorCQl0ZXN0X2ludGVycnVwdHMoZmQpOworCisJLyoqCisJICogVGVzdCBSQzYgcmVz aWRlbmN5IHJlcG9ydGluZy4KKwkgKi8KKwlpZ3Rfc3VidGVzdCgicmM2IikKKwkJdGVzdF9yYzYo ZmQpOworCisJLyoqCisJICogVGVzdCBSQzZwIHJlc2lkZW5jeSByZXBvcnRpbmcuCisJICovCisJ aWd0X3N1YnRlc3QoInJjNnAiKQorCQl0ZXN0X3JjNnAoZmQpOworfQotLSAKMi45LjUKCl9fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCkludGVsLWdmeCBtYWls aW5nIGxpc3QKSW50ZWwtZ2Z4QGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZy ZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2ludGVsLWdmeAo=