From mboxrd@z Thu Jan 1 00:00:00 1970 From: Tvrtko Ursulin Subject: [PATCH i-g-t v6 7/9] tests/perf_pmu: Tests for i915 PMU API Date: Tue, 10 Oct 2017 15:17:54 +0100 Message-ID: <20171010141754.14769-1-tvrtko.ursulin@linux.intel.com> References: <150764318334.797.2760966613400602408@mail.alporthouse.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail-wm0-x230.google.com (mail-wm0-x230.google.com [IPv6:2a00:1450:400c:c09::230]) by gabe.freedesktop.org (Postfix) with ESMTPS id 229066E043 for ; Tue, 10 Oct 2017 14:18:01 +0000 (UTC) Received: by mail-wm0-x230.google.com with SMTP id u138so5825685wmu.4 for ; Tue, 10 Oct 2017 07:18:01 -0700 (PDT) In-Reply-To: <150764318334.797.2760966613400602408@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 V2lsc29uKQoKU2lnbmVkLW9mZi1ieTogVHZydGtvIFVyc3VsaW4gPHR2cnRrby51cnN1bGluQGlu dGVsLmNvbT4KQ2M6IENocmlzIFdpbHNvbiA8Y2hyaXNAY2hyaXMtd2lsc29uLmNvLnVrPgpDYzog RG1pdHJ5IFJvZ296aGtpbiA8ZG1pdHJ5LnYucm9nb3poa2luQGludGVsLmNvbT4KLS0tCiBsaWIv aWd0X2d0LmMgICAgICAgICAgIHwgICA1MCArKwogbGliL2lndF9ndC5oICAgICAgICAgICB8ICAg MzggKysKIGxpYi9pZ3RfcGVyZi5oICAgICAgICAgfCAgICA5ICstCiB0ZXN0cy9NYWtlZmlsZS5h bSAgICAgIHwgICAgMSArCiB0ZXN0cy9NYWtlZmlsZS5zb3VyY2VzIHwgICAgMSArCiB0ZXN0cy9t ZXNvbi5idWlsZCAgICAgIHwgICAgMSArCiB0ZXN0cy9wZXJmX3BtdS5jICAgICAgIHwgMTIzOCAr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKIDcgZmlsZXMg Y2hhbmdlZCwgMTMzMCBpbnNlcnRpb25zKCspLCA4IGRlbGV0aW9ucygtKQogY3JlYXRlIG1vZGUg MTAwNjQ0IHRlc3RzL3BlcmZfcG11LmMKCmRpZmYgLS1naXQgYS9saWIvaWd0X2d0LmMgYi9saWIv aWd0X2d0LmMKaW5kZXggYjNmM2IzODA5ZWVlLi40Yzc1ODExZmIxYjMgMTAwNjQ0Ci0tLSBhL2xp Yi9pZ3RfZ3QuYworKysgYi9saWIvaWd0X2d0LmMKQEAgLTU2OCwzICs1NjgsNTMgQEAgYm9vbCBn ZW1fY2FuX3N0b3JlX2R3b3JkKGludCBmZCwgdW5zaWduZWQgaW50IGVuZ2luZSkKIAogCXJldHVy biB0cnVlOwogfQorCitjb25zdCBzdHJ1Y3QgaW50ZWxfZXhlY3V0aW9uX2VuZ2luZTIgaW50ZWxf ZXhlY3V0aW9uX2VuZ2luZXMyW10gPSB7CisJeyAicmNzMCIsIEk5MTVfRU5HSU5FX0NMQVNTX1JF TkRFUiwgMCB9LAorCXsgImJjczAiLCBJOTE1X0VOR0lORV9DTEFTU19DT1BZLCAwIH0sCisJeyAi dmNzMCIsIEk5MTVfRU5HSU5FX0NMQVNTX1ZJREVPLCAwIH0sCisJeyAidmNzMSIsIEk5MTVfRU5H SU5FX0NMQVNTX1ZJREVPLCAxIH0sCisJeyAidmVjczAiLCBJOTE1X0VOR0lORV9DTEFTU19WSURF T19FTkhBTkNFLCAwIH0sCit9OworCit1bnNpZ25lZCBpbnQKK2dlbV9jbGFzc19pbnN0YW5jZV90 b19lYl9mbGFncyhpbnQgZ2VtX2ZkLAorCQkJICAgICAgIGVudW0gZHJtX2k5MTVfZ2VtX2VuZ2lu ZV9jbGFzcyBjbGFzcywKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgaW5zdGFuY2UpCit7CisJaWYg KGNsYXNzICE9IEk5MTVfRU5HSU5FX0NMQVNTX1ZJREVPKQorCQlpZ3RfYXNzZXJ0KGluc3RhbmNl ID09IDApOworCWVsc2UKKwkJaWd0X2Fzc2VydChpbnN0YW5jZSA+PSAwICYmIGluc3RhbmNlIDw9 IDEpOworCisJc3dpdGNoIChjbGFzcykgeworCWNhc2UgSTkxNV9FTkdJTkVfQ0xBU1NfUkVOREVS OgorCQlyZXR1cm4gSTkxNV9FWEVDX1JFTkRFUjsKKwljYXNlIEk5MTVfRU5HSU5FX0NMQVNTX0NP UFk6CisJCXJldHVybiBJOTE1X0VYRUNfQkxUOworCWNhc2UgSTkxNV9FTkdJTkVfQ0xBU1NfVklE RU86CisJCWlmIChpbnN0YW5jZSA9PSAwKSB7CisJCQlpZiAoZ2VtX2hhc19ic2QyKGdlbV9mZCkp CisJCQkJcmV0dXJuIEk5MTVfRVhFQ19CU0QgfCBJOTE1X0VYRUNfQlNEX1JJTkcxOworCQkJZWxz ZQorCQkJCXJldHVybiBJOTE1X0VYRUNfQlNEOworCisJCX0gZWxzZSB7CisJCQlyZXR1cm4gSTkx NV9FWEVDX0JTRCB8IEk5MTVfRVhFQ19CU0RfUklORzI7CisJCX0KKwljYXNlIEk5MTVfRU5HSU5F X0NMQVNTX1ZJREVPX0VOSEFOQ0U6CisJCXJldHVybiBJOTE1X0VYRUNfVkVCT1g7CisJY2FzZSBJ OTE1X0VOR0lORV9DTEFTU19PVEhFUjoKKwlkZWZhdWx0OgorCQlpZ3RfYXNzZXJ0KDApOworCX07 Cit9CisKK2Jvb2wgZ2VtX2hhc19lbmdpbmUoaW50IGdlbV9mZCwKKwkJICAgIGVudW0gZHJtX2k5 MTVfZ2VtX2VuZ2luZV9jbGFzcyBjbGFzcywKKwkJICAgIHVuc2lnbmVkIGludCBpbnN0YW5jZSkK K3sKKwlyZXR1cm4gZ2VtX2hhc19yaW5nKGdlbV9mZCwKKwkJCSAgICBnZW1fY2xhc3NfaW5zdGFu Y2VfdG9fZWJfZmxhZ3MoZ2VtX2ZkLCBjbGFzcywKKwkJCQkJCQkgICBpbnN0YW5jZSkpOworfQpk aWZmIC0tZ2l0IGEvbGliL2lndF9ndC5oIGIvbGliL2lndF9ndC5oCmluZGV4IDI1NzljYmQzN2Jl Ny4uZmI2N2FlMWE3ZDFmIDEwMDY0NAotLS0gYS9saWIvaWd0X2d0LmgKKysrIGIvbGliL2lndF9n dC5oCkBAIC0yNSw2ICsyNSw3IEBACiAjZGVmaW5lIElHVF9HVF9ICiAKICNpbmNsdWRlICJpZ3Rf ZGVidWdmcy5oIgorI2luY2x1ZGUgImlndF9jb3JlLmgiCiAKIHZvaWQgaWd0X3JlcXVpcmVfaGFu Z19yaW5nKGludCBmZCwgaW50IHJpbmcpOwogCkBAIC04MCw0ICs4MSw0MSBAQCBleHRlcm4gY29u c3Qgc3RydWN0IGludGVsX2V4ZWN1dGlvbl9lbmdpbmUgewogCiBib29sIGdlbV9jYW5fc3RvcmVf ZHdvcmQoaW50IGZkLCB1bnNpZ25lZCBpbnQgZW5naW5lKTsKIAorZXh0ZXJuIGNvbnN0IHN0cnVj dCBpbnRlbF9leGVjdXRpb25fZW5naW5lMiB7CisJY29uc3QgY2hhciAqbmFtZTsKKwlpbnQgY2xh c3M7CisJaW50IGluc3RhbmNlOworfSBpbnRlbF9leGVjdXRpb25fZW5naW5lczJbXTsKKworI2Rl ZmluZSBmb3JfZWFjaF9lbmdpbmVfY2xhc3NfaW5zdGFuY2UoZmRfXywgZV9fKSBcCisJZm9yICgo ZV9fKSA9IGludGVsX2V4ZWN1dGlvbl9lbmdpbmVzMjtcCisJICAgICAoZV9fKS0+bmFtZTsgXAor CSAgICAgKGVfXykrKykKKworZW51bSBkcm1faTkxNV9nZW1fZW5naW5lX2NsYXNzIHsKKwlJOTE1 X0VOR0lORV9DTEFTU19PVEhFUiA9IDAsCisJSTkxNV9FTkdJTkVfQ0xBU1NfUkVOREVSID0gMSwK KwlJOTE1X0VOR0lORV9DTEFTU19DT1BZID0gMiwKKwlJOTE1X0VOR0lORV9DTEFTU19WSURFTyA9 IDMsCisJSTkxNV9FTkdJTkVfQ0xBU1NfVklERU9fRU5IQU5DRSA9IDQsCisJSTkxNV9FTkdJTkVf Q0xBU1NfTUFYIC8qIG5vbi1BQkkgKi8KK307CisKK3Vuc2lnbmVkIGludAorZ2VtX2NsYXNzX2lu c3RhbmNlX3RvX2ViX2ZsYWdzKGludCBnZW1fZmQsCisJCQkgICAgICAgZW51bSBkcm1faTkxNV9n ZW1fZW5naW5lX2NsYXNzIGNsYXNzLAorCQkJICAgICAgIHVuc2lnbmVkIGludCBpbnN0YW5jZSk7 CisKK2Jvb2wgZ2VtX2hhc19lbmdpbmUoaW50IGdlbV9mZCwKKwkJICAgIGVudW0gZHJtX2k5MTVf Z2VtX2VuZ2luZV9jbGFzcyBjbGFzcywKKwkJICAgIHVuc2lnbmVkIGludCBpbnN0YW5jZSk7CisK K3N0YXRpYyBpbmxpbmUKK3ZvaWQgZ2VtX3JlcXVpcmVfZW5naW5lKGludCBnZW1fZmQsCisJCQll bnVtIGRybV9pOTE1X2dlbV9lbmdpbmVfY2xhc3MgY2xhc3MsCisJCQl1bnNpZ25lZCBpbnQgaW5z dGFuY2UpCit7CisJaWd0X3JlcXVpcmUoZ2VtX2hhc19lbmdpbmUoZ2VtX2ZkLCBjbGFzcywgaW5z dGFuY2UpKTsKK30KKwogI2VuZGlmIC8qIElHVF9HVF9IICovCmRpZmYgLS1naXQgYS9saWIvaWd0 X3BlcmYuaCBiL2xpYi9pZ3RfcGVyZi5oCmluZGV4IGIxZjUyNTczOWM2OS4uNTQyOGZlYjBjNzQ2 IDEwMDY0NAotLS0gYS9saWIvaWd0X3BlcmYuaAorKysgYi9saWIvaWd0X3BlcmYuaApAQCAtMjks MTQgKzI5LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3BlcmZfZXZlbnQuaD4KIAotZW51bSBkcm1f aTkxNV9nZW1fZW5naW5lX2NsYXNzIHsKLQlJOTE1X0VOR0lORV9DTEFTU19PVEhFUiA9IDAsCi0J STkxNV9FTkdJTkVfQ0xBU1NfUkVOREVSID0gMSwKLQlJOTE1X0VOR0lORV9DTEFTU19DT1BZID0g MiwKLQlJOTE1X0VOR0lORV9DTEFTU19WSURFTyA9IDMsCi0JSTkxNV9FTkdJTkVfQ0xBU1NfVklE RU9fRU5IQU5DRSA9IDQsCi0JSTkxNV9FTkdJTkVfQ0xBU1NfTUFYIC8qIG5vbi1BQkkgKi8KLX07 CisjaW5jbHVkZSAiaWd0X2d0LmgiCiAKIGVudW0gZHJtX2k5MTVfcG11X2VuZ2luZV9zYW1wbGUg ewogCUk5MTVfU0FNUExFX0JVU1kgPSAwLApkaWZmIC0tZ2l0IGEvdGVzdHMvTWFrZWZpbGUuYW0g Yi90ZXN0cy9NYWtlZmlsZS5hbQppbmRleCA4OWE5NzAxNTM5OTIuLjE3ZWUxYmUwOGQ4YSAxMDA2 NDQKLS0tIGEvdGVzdHMvTWFrZWZpbGUuYW0KKysrIGIvdGVzdHMvTWFrZWZpbGUuYW0KQEAgLTEz MSw2ICsxMzEsNyBAQCBnZW43X2ZvcmNld2FrZV9tdF9DRkxBR1MgPSAkKEFNX0NGTEFHUykgJChU SFJFQURfQ0ZMQUdTKQogZ2VuN19mb3JjZXdha2VfbXRfTERBREQgPSAkKExEQUREKSAtbHB0aHJl YWQKIGdlbV91c2VycHRyX2JsaXRzX0NGTEFHUyA9ICQoQU1fQ0ZMQUdTKSAkKFRIUkVBRF9DRkxB R1MpCiBnZW1fdXNlcnB0cl9ibGl0c19MREFERCA9ICQoTERBREQpIC1scHRocmVhZAorcGVyZl9w bXVfTERBREQgPSAkKExEQUREKSAkKHRvcF9idWlsZGRpcikvbGliL2xpYmlndF9wZXJmLmxhCiAK IGdlbV93YWl0X0xEQUREID0gJChMREFERCkgLWxydAoga21zX2ZsaXBfTERBREQgPSAkKExEQURE KSAtbHJ0IC1scHRocmVhZApkaWZmIC0tZ2l0IGEvdGVzdHMvTWFrZWZpbGUuc291cmNlcyBiL3Rl c3RzL01ha2VmaWxlLnNvdXJjZXMKaW5kZXggYzRkMzIwZWJjNjFiLi43NDRlZWVhYjllZjQgMTAw NjQ0Ci0tLSBhL3Rlc3RzL01ha2VmaWxlLnNvdXJjZXMKKysrIGIvdGVzdHMvTWFrZWZpbGUuc291 cmNlcwpAQCAtMjE3LDYgKzIxNyw3IEBAIFRFU1RTX3Byb2dzID0gXAogCWttc192YmxhbmsgXAog CW1ldGFfdGVzdCBcCiAJcGVyZiBcCisJcGVyZl9wbXUgXAogCXBtX2JhY2tsaWdodCBcCiAJcG1f bHBzcCBcCiAJcG1fcmM2X3Jlc2lkZW5jeSBcCmRpZmYgLS1naXQgYS90ZXN0cy9tZXNvbi5idWls ZCBiL3Rlc3RzL21lc29uLmJ1aWxkCmluZGV4IDZjYjM1ODRhNGRkOS4uMTJkNTcwNmZhYWViIDEw MDY0NAotLS0gYS90ZXN0cy9tZXNvbi5idWlsZAorKysgYi90ZXN0cy9tZXNvbi5idWlsZApAQCAt MTk3LDYgKzE5Nyw3IEBAIHRlc3RfcHJvZ3MgPSBbCiAJJ2ttc192YmxhbmsnLAogCSdtZXRhX3Rl c3QnLAogCSdwZXJmJywKKwkncGVyZl9wbXUnLAogCSdwbV9iYWNrbGlnaHQnLAogCSdwbV9scHNw JywKIAkncG1fcmM2X3Jlc2lkZW5jeScsCmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmX3BtdS5jIGIv dGVzdHMvcGVyZl9wbXUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAu LmYyNjQ1YmZkMmE4ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZfcG11LmMKQEAgLTAs MCArMSwxMjM4IEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMTcgSW50ZWwgQ29ycG9yYXRpb24K KyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8g YW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3Nv Y2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwg aW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxp bWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJs aXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRo ZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2Fy ZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRp b25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Np b24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5j bHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNv ZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VU IFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcg QlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAq IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJ TiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUg TElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hF VEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5H CisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBU SEUgVVNFIE9SIE9USEVSIERFQUxJTkdTCisgKiBJTiBUSEUgU09GVFdBUkUuCisgKgorICovCisK KyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmlu Zy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRl IDxlcnJuby5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4K KyNpbmNsdWRlIDxzeXMvdGltZXMuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRl IDxkaXJlbnQuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8cG9sbC5oPgorCisjaW5j bHVkZSAiaWd0LmgiCisjaW5jbHVkZSAiaWd0X2NvcmUuaCIKKyNpbmNsdWRlICJpZ3RfcGVyZi5o IgorI2luY2x1ZGUgImlndF9zeXNmcy5oIgorCitJR1RfVEVTVF9ERVNDUklQVElPTigiVGVzdCB0 aGUgaTkxNSBwbXUgcGVyZiBpbnRlcmZhY2UiKTsKKworY29uc3QgZG91YmxlIHRvbGVyYW5jZSA9 IDAuMDNmOworY29uc3QgdW5zaWduZWQgbG9uZyBiYXRjaF9kdXJhdGlvbl9ucyA9IDEwMCAqIDEw MDAgKiAxMDAwOworCitzdGF0aWMgaW50IG9wZW5fcG11KHVpbnQ2NF90IGNvbmZpZykKK3sKKwlp bnQgZmQ7CisKKwlmZCA9IHBlcmZfaTkxNV9vcGVuKGNvbmZpZyk7CisJaWd0X3JlcXVpcmUoZmQg Pj0gMCB8fCAoZmQgPCAwICYmIGVycm5vICE9IEVOT0RFVikpOworCWlndF9hc3NlcnQoZmQgPj0g MCk7CisKKwlyZXR1cm4gZmQ7Cit9CisKK3N0YXRpYyBpbnQgb3Blbl9ncm91cCh1aW50NjRfdCBj b25maWcsIGludCBncm91cCkKK3sKKwlpbnQgZmQ7CisKKwlmZCA9IHBlcmZfaTkxNV9vcGVuX2dy b3VwKGNvbmZpZywgZ3JvdXApOworCWlndF9yZXF1aXJlKGZkID49IDAgfHwgKGZkIDwgMCAmJiBl cnJubyAhPSBFTk9ERVYpKTsKKwlpZ3RfYXNzZXJ0KGZkID49IDApOworCisJcmV0dXJuIGZkOwor fQorCitzdGF0aWMgdm9pZAoraW5pdChpbnQgZ2VtX2ZkLCBjb25zdCBzdHJ1Y3QgaW50ZWxfZXhl Y3V0aW9uX2VuZ2luZTIgKmUsIHVpbnQ4X3Qgc2FtcGxlKQoreworCWludCBmZDsKKworCWZkID0g b3Blbl9wbXUoX19JOTE1X1BNVV9FTkdJTkUoZS0+Y2xhc3MsIGUtPmluc3RhbmNlLCBzYW1wbGUp KTsKKworCWNsb3NlKGZkKTsKK30KKworc3RhdGljIHVpbnQ2NF90IHBtdV9yZWFkX3NpbmdsZShp bnQgZmQpCit7CisJdWludDY0X3QgZGF0YVsyXTsKKworCWlndF9hc3NlcnRfZXEocmVhZChmZCwg ZGF0YSwgc2l6ZW9mKGRhdGEpKSwgc2l6ZW9mKGRhdGEpKTsKKworCXJldHVybiBkYXRhWzBdOwor fQorCitzdGF0aWMgdm9pZCBwbXVfcmVhZF9tdWx0aShpbnQgZmQsIHVuc2lnbmVkIGludCBudW0s IHVpbnQ2NF90ICp2YWwpCit7CisJdWludDY0X3QgYnVmWzIgKyBudW1dOworCXVuc2lnbmVkIGlu dCBpOworCisJaWd0X2Fzc2VydF9lcShyZWFkKGZkLCBidWYsIHNpemVvZihidWYpKSwgc2l6ZW9m KGJ1ZikpOworCisJZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKQorCQl2YWxbaV0gPSBidWZbMiAr IGldOworfQorCisjZGVmaW5lIGFzc2VydF93aXRoaW5fZXBzaWxvbih4LCByZWYsIHRvbGVyYW5j ZSkgXAorCWlndF9hc3NlcnRfZigoZG91YmxlKSh4KSA8PSAoMS4wICsgdG9sZXJhbmNlKSAqIChk b3VibGUpcmVmICYmIFwKKwkJICAgICAoZG91YmxlKSh4KSA+PSAoMS4wIC0gdG9sZXJhbmNlKSAq IChkb3VibGUpcmVmLCBcCisJCSAgICAgIiclcycgIT0gJyVzJyAoJWYgbm90IHdpdGhpbiAlZiUl IHRvbGVyYW5jZSBvZiAlZilcbiIsXAorCQkgICAgICN4LCAjcmVmLCAoZG91YmxlKXgsIHRvbGVy YW5jZSAqIDEwMC4wLCAoZG91YmxlKXJlZikKKworLyoKKyAqIEhlbHBlciBmb3IgY2FzZXMgd2hl cmUgd2UgYXNzZXJ0IG9uIHRpbWUgc3BlbnQgc2xlZXBpbmcgKGRpcmVjdGx5IG9yCisgKiBpbmRp cmVjdGx5KSwgc28gbWFrZSBpdCBtb3JlIHJvYnVzdCBieSBlbnN1cmluZyB0aGUgc3lzdGVtIHNs ZWVwIHRpbWUKKyAqIGlzIHdpdGhpbiB0ZXN0IHRvbGVyYW5jZSB0byBzdGFydCB3aXRoLgorICov CitzdGF0aWMgdW5zaWduZWQgaW50IG1lYXN1cmVkX3VzbGVlcCh1bnNpZ25lZCBpbnQgdXNlYykK K3sKKwl1aW50NjRfdCBzbGVwdCA9IDA7CisKKwl3aGlsZSAodXNlYyA+IDApIHsKKwkJc3RydWN0 IHRpbWVzcGVjIHN0YXJ0ID0geyB9OworCQl1aW50NjRfdCB0aGlzX3NsZWVwOworCisJCWlndF9u c2VjX2VsYXBzZWQoJnN0YXJ0KTsKKwkJdXNsZWVwKHVzZWMpOworCQl0aGlzX3NsZWVwID0gaWd0 X25zZWNfZWxhcHNlZCgmc3RhcnQpOworCQlzbGVwdCArPSB0aGlzX3NsZWVwOworCQlpZiAodGhp c19zbGVlcCA+IHVzZWMgKiAxMDAwKQorCQkJYnJlYWs7CisJCXVzZWMgLT0gdGhpc19zbGVlcDsK Kwl9CisKKwlyZXR1cm4gc2xlcHQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZTJyaW5nKGlu dCBnZW1fZmQsIGNvbnN0IHN0cnVjdCBpbnRlbF9leGVjdXRpb25fZW5naW5lMiAqZSkKK3sKKwly ZXR1cm4gZ2VtX2NsYXNzX2luc3RhbmNlX3RvX2ViX2ZsYWdzKGdlbV9mZCwgZS0+Y2xhc3MsIGUt Pmluc3RhbmNlKTsKK30KKworc3RhdGljIHZvaWQKK3NpbmdsZShpbnQgZ2VtX2ZkLCBjb25zdCBz dHJ1Y3QgaW50ZWxfZXhlY3V0aW9uX2VuZ2luZTIgKmUsIGJvb2wgYnVzeSkKK3sKKwlkb3VibGUg cmVmID0gYnVzeSA/IGJhdGNoX2R1cmF0aW9uX25zIDogMC4wZjsKKwlpZ3Rfc3Bpbl90ICpzcGlu OworCXVpbnQ2NF90IHZhbDsKKwlpbnQgZmQ7CisKKwlmZCA9IG9wZW5fcG11KEk5MTVfUE1VX0VO R0lORV9CVVNZKGUtPmNsYXNzLCBlLT5pbnN0YW5jZSkpOworCisJaWYgKGJ1c3kpIHsKKwkJc3Bp biA9IGlndF9zcGluX2JhdGNoX25ldyhnZW1fZmQsIDAsIGUycmluZyhnZW1fZmQsIGUpLCAwKTsK KwkJaWd0X3NwaW5fYmF0Y2hfc2V0X3RpbWVvdXQoc3BpbiwgYmF0Y2hfZHVyYXRpb25fbnMpOwor CX0gZWxzZSB7CisJCXVzbGVlcChiYXRjaF9kdXJhdGlvbl9ucyAvIDEwMDApOworCX0KKworCWlm IChidXN5KQorCQlnZW1fc3luYyhnZW1fZmQsIHNwaW4tPmhhbmRsZSk7CisKKwl2YWwgPSBwbXVf cmVhZF9zaW5nbGUoZmQpOworCisJYXNzZXJ0X3dpdGhpbl9lcHNpbG9uKHZhbCwgcmVmLCB0b2xl cmFuY2UpOworCisJaWYgKGJ1c3kpCisJCWlndF9zcGluX2JhdGNoX2ZyZWUoZ2VtX2ZkLCBzcGlu KTsKKwljbG9zZShmZCk7Cit9CisKK3N0YXRpYyB2b2lkIGxvZ19idXN5KGludCBmZCwgdW5zaWdu ZWQgaW50IG51bV9lbmdpbmVzLCB1aW50NjRfdCAqdmFsKQoreworCWNoYXIgYnVmWzEwMjRdOwor CWludCByZW0gPSBzaXplb2YoYnVmKTsKKwl1bnNpZ25lZCBpbnQgaTsKKwljaGFyICpwID0gYnVm OworCisJZm9yIChpID0gMDsgaSA8IG51bV9lbmdpbmVzOyBpKyspIHsKKwkJaW50IGxlbjsKKwor CQlsZW4gPSBzbnByaW50ZihwLCByZW0sICIldT0lIiBQUkl1NjQgIlxuIiwgIGksIHZhbFtpXSk7 CisJCWlndF9hc3NlcnQobGVuID4gMCk7CisJCXJlbSAtPSBsZW47CisJCXAgKz0gbGVuOworCX0K KworCWlndF9pbmZvKCIlcyIsIGJ1Zik7Cit9CisKK3N0YXRpYyB2b2lkCitidXN5X2NoZWNrX2Fs bChpbnQgZ2VtX2ZkLCBjb25zdCBzdHJ1Y3QgaW50ZWxfZXhlY3V0aW9uX2VuZ2luZTIgKmUsCisJ ICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBudW1fZW5naW5lcykKK3sKKwljb25zdCBzdHJ1Y3Qg aW50ZWxfZXhlY3V0aW9uX2VuZ2luZTIgKmVfOworCXVpbnQ2NF90IHZhbFtudW1fZW5naW5lc107 CisJaW50IGZkW251bV9lbmdpbmVzXTsKKwlpZ3Rfc3Bpbl90ICpzcGluOworCXVuc2lnbmVkIGlu dCBidXN5X2lkeCwgaTsKKworCWkgPSAwOworCWZkWzBdID0gLTE7CisJZm9yX2VhY2hfZW5naW5l X2NsYXNzX2luc3RhbmNlKGZkLCBlXykgeworCQlpZiAoIWdlbV9oYXNfZW5naW5lKGdlbV9mZCwg ZV8tPmNsYXNzLCBlXy0+aW5zdGFuY2UpKQorCQkJY29udGludWU7CisJCWVsc2UgaWYgKGUgPT0g ZV8pCisJCQlidXN5X2lkeCA9IGk7CisKKwkJZmRbaSsrXSA9IG9wZW5fZ3JvdXAoSTkxNV9QTVVf RU5HSU5FX0JVU1koZV8tPmNsYXNzLAorCQkJCQkJCSAgZV8tPmluc3RhbmNlKSwKKwkJCQkgICAg IGZkWzBdKTsKKwl9CisKKwlzcGluID0gaWd0X3NwaW5fYmF0Y2hfbmV3KGdlbV9mZCwgMCwgZTJy aW5nKGdlbV9mZCwgZSksIDApOworCWlndF9zcGluX2JhdGNoX3NldF90aW1lb3V0KHNwaW4sIGJh dGNoX2R1cmF0aW9uX25zKTsKKworCWdlbV9zeW5jKGdlbV9mZCwgc3Bpbi0+aGFuZGxlKTsKKwor CXBtdV9yZWFkX211bHRpKGZkWzBdLCBudW1fZW5naW5lcywgdmFsKTsKKwlsb2dfYnVzeShmZFsw XSwgbnVtX2VuZ2luZXMsIHZhbCk7CisKKwlhc3NlcnRfd2l0aGluX2Vwc2lsb24odmFsW2J1c3lf aWR4XSwgYmF0Y2hfZHVyYXRpb25fbnMsIHRvbGVyYW5jZSk7CisJZm9yIChpID0gMDsgaSA8IG51 bV9lbmdpbmVzOyBpKyspIHsKKwkJaWYgKGkgPT0gYnVzeV9pZHgpCisJCQljb250aW51ZTsKKwkJ YXNzZXJ0X3dpdGhpbl9lcHNpbG9uKHZhbFtpXSwgMC4wZiwgdG9sZXJhbmNlKTsKKwl9CisKKwlp Z3Rfc3Bpbl9iYXRjaF9mcmVlKGdlbV9mZCwgc3Bpbik7CisJY2xvc2UoZmRbMF0pOworfQorCitz dGF0aWMgdm9pZAorbW9zdF9idXN5X2NoZWNrX2FsbChpbnQgZ2VtX2ZkLCBjb25zdCBzdHJ1Y3Qg aW50ZWxfZXhlY3V0aW9uX2VuZ2luZTIgKmUsCisJCSAgICBjb25zdCB1bnNpZ25lZCBpbnQgbnVt X2VuZ2luZXMpCit7CisJY29uc3Qgc3RydWN0IGludGVsX2V4ZWN1dGlvbl9lbmdpbmUyICplXzsK Kwl1aW50NjRfdCB2YWxbbnVtX2VuZ2luZXNdOworCWludCBmZFtudW1fZW5naW5lc107CisJaWd0 X3NwaW5fdCAqc3BpbltudW1fZW5naW5lc107CisJdW5zaWduZWQgaW50IGlkbGVfaWR4LCBpOwor CisJZ2VtX3JlcXVpcmVfZW5naW5lKGdlbV9mZCwgZS0+Y2xhc3MsIGUtPmluc3RhbmNlKTsKKwor CWkgPSAwOworCWZkWzBdID0gLTE7CisJZm9yX2VhY2hfZW5naW5lX2NsYXNzX2luc3RhbmNlKGZk LCBlXykgeworCQlpZiAoIWdlbV9oYXNfZW5naW5lKGdlbV9mZCwgZV8tPmNsYXNzLCBlXy0+aW5z dGFuY2UpKQorCQkJY29udGludWU7CisKKwkJZmRbaV0gPSBvcGVuX2dyb3VwKEk5MTVfUE1VX0VO R0lORV9CVVNZKGVfLT5jbGFzcywKKwkJCQkJCQllXy0+aW5zdGFuY2UpLAorCQkJCSAgIGZkWzBd KTsKKworCQlpZiAoZSA9PSBlXykgeworCQkJaWRsZV9pZHggPSBpOworCQl9IGVsc2UgeworCQkJ c3BpbltpXSA9IGlndF9zcGluX2JhdGNoX25ldyhnZW1fZmQsIDAsCisJCQkJCQkgICAgIGUycmlu ZyhnZW1fZmQsIGVfKSwgMCk7CisJCQlpZ3Rfc3Bpbl9iYXRjaF9zZXRfdGltZW91dChzcGluW2ld LCBiYXRjaF9kdXJhdGlvbl9ucyk7CisJCX0KKworCQlpKys7CisJfQorCisJZm9yIChpID0gMDsg aSA8IG51bV9lbmdpbmVzOyBpKyspIHsKKwkJaWYgKGkgIT0gaWRsZV9pZHgpCisJCQlnZW1fc3lu YyhnZW1fZmQsIHNwaW5baV0tPmhhbmRsZSk7CisJfQorCisJcG11X3JlYWRfbXVsdGkoZmRbMF0s IG51bV9lbmdpbmVzLCB2YWwpOworCWxvZ19idXN5KGZkWzBdLCBudW1fZW5naW5lcywgdmFsKTsK KworCWZvciAoaSA9IDA7IGkgPCBudW1fZW5naW5lczsgaSsrKSB7CisJCWlmIChpID09IGlkbGVf aWR4KQorCQkJYXNzZXJ0X3dpdGhpbl9lcHNpbG9uKHZhbFtpXSwgMC4wZiwgdG9sZXJhbmNlKTsK KwkJZWxzZQorCQkJYXNzZXJ0X3dpdGhpbl9lcHNpbG9uKHZhbFtpXSwgYmF0Y2hfZHVyYXRpb25f bnMsCisJCQkJCSAgICAgIHRvbGVyYW5jZSk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IG51bV9l bmdpbmVzOyBpKyspIHsKKwkJaWYgKGkgIT0gaWRsZV9pZHgpCisJCQlpZ3Rfc3Bpbl9iYXRjaF9m cmVlKGdlbV9mZCwgc3BpbltpXSk7CisJfQorCWNsb3NlKGZkWzBdKTsKK30KKworc3RhdGljIHZv aWQKK2FsbF9idXN5X2NoZWNrX2FsbChpbnQgZ2VtX2ZkLCBjb25zdCB1bnNpZ25lZCBpbnQgbnVt X2VuZ2luZXMpCit7CisJY29uc3Qgc3RydWN0IGludGVsX2V4ZWN1dGlvbl9lbmdpbmUyICplOwor CXVpbnQ2NF90IHZhbFtudW1fZW5naW5lc107CisJaW50IGZkW251bV9lbmdpbmVzXTsKKwlpZ3Rf c3Bpbl90ICpzcGluW251bV9lbmdpbmVzXTsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWkgPSAwOwor CWZkWzBdID0gLTE7CisJZm9yX2VhY2hfZW5naW5lX2NsYXNzX2luc3RhbmNlKGZkLCBlKSB7CisJ CWlmICghZ2VtX2hhc19lbmdpbmUoZ2VtX2ZkLCBlLT5jbGFzcywgZS0+aW5zdGFuY2UpKQorCQkJ Y29udGludWU7CisKKwkJZmRbaV0gPSBvcGVuX2dyb3VwKEk5MTVfUE1VX0VOR0lORV9CVVNZKGUt PmNsYXNzLCBlLT5pbnN0YW5jZSksCisJCQkJICAgZmRbMF0pOworCisJCXNwaW5baV0gPSBpZ3Rf c3Bpbl9iYXRjaF9uZXcoZ2VtX2ZkLCAwLCBlMnJpbmcoZ2VtX2ZkLCBlKSwgMCk7CisJCWlndF9z cGluX2JhdGNoX3NldF90aW1lb3V0KHNwaW5baV0sIGJhdGNoX2R1cmF0aW9uX25zKTsKKworCQlp Kys7CisJfQorCisJZm9yIChpID0gMDsgaSA8IG51bV9lbmdpbmVzOyBpKyspCisJCWdlbV9zeW5j KGdlbV9mZCwgc3BpbltpXS0+aGFuZGxlKTsKKworCXBtdV9yZWFkX211bHRpKGZkWzBdLCBudW1f ZW5naW5lcywgdmFsKTsKKwlsb2dfYnVzeShmZFswXSwgbnVtX2VuZ2luZXMsIHZhbCk7CisKKwlm b3IgKGkgPSAwOyBpIDwgbnVtX2VuZ2luZXM7IGkrKykKKwkJYXNzZXJ0X3dpdGhpbl9lcHNpbG9u KHZhbFtpXSwgYmF0Y2hfZHVyYXRpb25fbnMsIHRvbGVyYW5jZSk7CisKKwlmb3IgKGkgPSAwOyBp IDwgbnVtX2VuZ2luZXM7IGkrKykKKwkJaWd0X3NwaW5fYmF0Y2hfZnJlZShnZW1fZmQsIHNwaW5b aV0pOworCWNsb3NlKGZkWzBdKTsKK30KKworc3RhdGljIHZvaWQKK25vX3NlbWEoaW50IGdlbV9m ZCwgY29uc3Qgc3RydWN0IGludGVsX2V4ZWN1dGlvbl9lbmdpbmUyICplLCBib29sIGJ1c3kpCit7 CisJaWd0X3NwaW5fdCAqc3BpbjsKKwl1aW50NjRfdCB2YWxbMl07CisJaW50IGZkOworCisJZmQg PSBvcGVuX2dyb3VwKEk5MTVfUE1VX0VOR0lORV9TRU1BKGUtPmNsYXNzLCBlLT5pbnN0YW5jZSks IC0xKTsKKwlvcGVuX2dyb3VwKEk5MTVfUE1VX0VOR0lORV9XQUlUKGUtPmNsYXNzLCBlLT5pbnN0 YW5jZSksIGZkKTsKKworCWlmIChidXN5KSB7CisJCXNwaW4gPSBpZ3Rfc3Bpbl9iYXRjaF9uZXco Z2VtX2ZkLCAwLCBlMnJpbmcoZ2VtX2ZkLCBlKSwgMCk7CisJCWlndF9zcGluX2JhdGNoX3NldF90 aW1lb3V0KHNwaW4sIGJhdGNoX2R1cmF0aW9uX25zKTsKKwl9IGVsc2UgeworCQl1c2xlZXAoYmF0 Y2hfZHVyYXRpb25fbnMgLyAxMDAwKTsKKwl9CisKKwlpZiAoYnVzeSkKKwkJZ2VtX3N5bmMoZ2Vt X2ZkLCBzcGluLT5oYW5kbGUpOworCisJcG11X3JlYWRfbXVsdGkoZmQsIDIsIHZhbCk7CisKKwlh c3NlcnRfd2l0aGluX2Vwc2lsb24odmFsWzBdLCAwLjBmLCB0b2xlcmFuY2UpOworCWFzc2VydF93 aXRoaW5fZXBzaWxvbih2YWxbMV0sIDAuMGYsIHRvbGVyYW5jZSk7CisKKwlpZiAoYnVzeSkKKwkJ aWd0X3NwaW5fYmF0Y2hfZnJlZShnZW1fZmQsIHNwaW4pOworCWNsb3NlKGZkKTsKK30KKworI2Rl ZmluZSBNSV9JTlNUUihvcGNvZGUsIGZsYWdzKSAoKChvcGNvZGUpIDw8IDIzKSB8IChmbGFncykp CisjZGVmaW5lIE1JX1NFTUFQSE9SRV9XQUlUCU1JX0lOU1RSKDB4MWMsIDIpIC8qIEdFTjgrICov CisjZGVmaW5lICAgTUlfU0VNQVBIT1JFX1BPTEwJCSgxPDwxNSkKKyNkZWZpbmUgICBNSV9TRU1B UEhPUkVfU0FEX0dURV9TREQJKDE8PDEyKQorCitzdGF0aWMgdm9pZAorc2VtYV93YWl0KGludCBn ZW1fZmQsIGNvbnN0IHN0cnVjdCBpbnRlbF9leGVjdXRpb25fZW5naW5lMiAqZSkKK3sKKwlzdHJ1 Y3QgZHJtX2k5MTVfZ2VtX3JlbG9jYXRpb25fZW50cnkgcmVsb2MgPSB7IH07CisJc3RydWN0IGRy bV9pOTE1X2dlbV9leGVjYnVmZmVyMiBlYiA9IHsgfTsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2V4 ZWNfb2JqZWN0MiBvYmpbMl07CisJdWludDMyX3QgYmJfaGFuZGxlLCBvYmpfaGFuZGxlOworCXVu c2lnbmVkIGxvbmcgc2xlcHQ7CisJdWludDMyX3QgKm9ial9wdHI7CisJdWludDMyX3QgYmF0Y2hb Nl07CisJdWludDY0X3QgdmFsWzJdOworCWludCBmZDsKKworCWlndF9yZXF1aXJlKGludGVsX2dl bihpbnRlbF9nZXRfZHJtX2RldmlkKGdlbV9mZCkpID49IDgpOworCisJLyoqCisJICogU2V0dXAg dXAgYSBiYXRjaGJ1ZmZlciB3aXRoIGEgcG9sbGluZyBzZW1hcGhvcmUgd2FpdCBjb21tYW5kIHdo aWNoCisJICogd2lsbCB3YWl0IG9uIGFuIHZhbHVlIGluIGEgc2hhcmVkIGJvIHRvIGNoYW5nZS4g VGhpcyB3YXkgd2UgYXJlIGFibGUKKwkgKiB0byBjb250cm9sIGhvdyBtdWNoIHRpbWUgd2Ugd2ls bCBzcGVuZCBpbiB0aGlzIGJiLgorCSAqLworCisJYmJfaGFuZGxlID0gZ2VtX2NyZWF0ZShnZW1f ZmQsIDQwOTYpOworCW9ial9oYW5kbGUgPSBnZW1fY3JlYXRlKGdlbV9mZCwgNDA5Nik7CisKKwlv YmpfcHRyID0gZ2VtX21tYXBfX3djKGdlbV9mZCwgb2JqX2hhbmRsZSwgMCwgNDA5NiwgUFJPVF9X UklURSk7CisKKwliYXRjaFswXSA9IE1JX1NFTUFQSE9SRV9XQUlUIHwKKwkJICAgTUlfU0VNQVBI T1JFX1BPTEwgfAorCQkgICBNSV9TRU1BUEhPUkVfU0FEX0dURV9TREQ7CisJYmF0Y2hbMV0gPSAx OworCWJhdGNoWzJdID0gMHgwOworCWJhdGNoWzNdID0gMHgwOworCWJhdGNoWzRdID0gTUlfTk9P UDsKKwliYXRjaFs1XSA9IE1JX0JBVENIX0JVRkZFUl9FTkQ7CisKKwlnZW1fd3JpdGUoZ2VtX2Zk LCBiYl9oYW5kbGUsIDAsIGJhdGNoLCBzaXplb2YoYmF0Y2gpKTsKKworCXJlbG9jLnRhcmdldF9o YW5kbGUgPSBvYmpfaGFuZGxlOworCXJlbG9jLm9mZnNldCA9IDIgKiBzaXplb2YodWludDMyX3Qp OworCXJlbG9jLnJlYWRfZG9tYWlucyA9IEk5MTVfR0VNX0RPTUFJTl9SRU5ERVI7CisKKwltZW1z ZXQob2JqLCAwLCBzaXplb2Yob2JqKSk7CisKKwlvYmpbMF0uaGFuZGxlID0gb2JqX2hhbmRsZTsK KworCW9ialsxXS5oYW5kbGUgPSBiYl9oYW5kbGU7CisJb2JqWzFdLnJlbG9jYXRpb25fY291bnQg PSAxOworCW9ialsxXS5yZWxvY3NfcHRyID0gdG9fdXNlcl9wb2ludGVyKCZyZWxvYyk7CisKKwll Yi5idWZmZXJfY291bnQgPSAyOworCWViLmJ1ZmZlcnNfcHRyID0gdG9fdXNlcl9wb2ludGVyKG9i aik7CisJZWIuZmxhZ3MgPSBlMnJpbmcoZ2VtX2ZkLCBlKTsKKworCS8qKgorCSAqIFN0YXJ0IHRo ZSBzZW1hcGhvcmUgd2FpdCBQTVUgYW5kIGFmdGVyIHNvbWUga25vd24gdGltZSBsZXQgdGhlIGFi b3ZlCisJICogc2VtYXBob3JlIHdhaXQgY29tbWFuZCBmaW5pc2guIFRoZW4gY2hlY2sgdGhhdCB0 aGUgUE1VIGlzIHJlcG9ydGluZworCSAqIHRvIGV4cGVjdGVkIHRpbWUgc3BlbnQgaW4gc2VtYXBo b3JlIHdhaXQgc3RhdGUuCisJICovCisKKwlmZCA9IG9wZW5fcG11KEk5MTVfUE1VX0VOR0lORV9T RU1BKGUtPmNsYXNzLCBlLT5pbnN0YW5jZSkpOworCisJdmFsWzBdID0gcG11X3JlYWRfc2luZ2xl KGZkKTsKKworCWdlbV9leGVjYnVmKGdlbV9mZCwgJmViKTsKKworCXNsZXB0ID0gbWVhc3VyZWRf dXNsZWVwKDFlNSk7CisKKwkqb2JqX3B0ciA9IDE7CisKKwlnZW1fc3luYyhnZW1fZmQsIGJiX2hh bmRsZSk7CisKKwl2YWxbMV0gPSBwbXVfcmVhZF9zaW5nbGUoZmQpOworCisJbXVubWFwKG9ial9w dHIsIDQwOTYpOworCWdlbV9jbG9zZShnZW1fZmQsIG9ial9oYW5kbGUpOworCWdlbV9jbG9zZShn ZW1fZmQsIGJiX2hhbmRsZSk7CisJY2xvc2UoZmQpOworCisJYXNzZXJ0X3dpdGhpbl9lcHNpbG9u KHZhbFsxXSAtIHZhbFswXSwgc2xlcHQsIHRvbGVyYW5jZSk7Cit9CisKKyNkZWZpbmUgICBNSV9X QUlUX0ZPUl9QSVBFX0NfVkJMQU5LICgxPDwyMSkKKyNkZWZpbmUgICBNSV9XQUlUX0ZPUl9QSVBF X0JfVkJMQU5LICgxPDwxMSkKKyNkZWZpbmUgICBNSV9XQUlUX0ZPUl9QSVBFX0FfVkJMQU5LICgx PDwzKQorCit0eXBlZGVmIHN0cnVjdCB7CisJaWd0X2Rpc3BsYXlfdCBkaXNwbGF5OworCXN0cnVj dCBpZ3RfZmIgcHJpbWFyeV9mYjsKKwlpZ3Rfb3V0cHV0X3QgKm91dHB1dDsKKwllbnVtIHBpcGUg cGlwZTsKK30gZGF0YV90OworCitzdGF0aWMgdm9pZCBwcmVwYXJlX2NydGMoZGF0YV90ICpkYXRh LCBpbnQgZmQsIGlndF9vdXRwdXRfdCAqb3V0cHV0KQoreworCWRybU1vZGVNb2RlSW5mbyAqbW9k ZTsKKwlpZ3RfZGlzcGxheV90ICpkaXNwbGF5ID0gJmRhdGEtPmRpc3BsYXk7CisJaWd0X3BsYW5l X3QgKnByaW1hcnk7CisKKwkvKiBzZWxlY3QgdGhlIHBpcGUgd2Ugd2FudCB0byB1c2UgKi8KKwlp Z3Rfb3V0cHV0X3NldF9waXBlKG91dHB1dCwgZGF0YS0+cGlwZSk7CisKKwkvKiBjcmVhdGUgYW5k IHNldCB0aGUgcHJpbWFyeSBwbGFuZSBmYiAqLworCW1vZGUgPSBpZ3Rfb3V0cHV0X2dldF9tb2Rl KG91dHB1dCk7CisJaWd0X2NyZWF0ZV9jb2xvcl9mYihmZCwgbW9kZS0+aGRpc3BsYXksIG1vZGUt PnZkaXNwbGF5LAorCQkJICAgIERSTV9GT1JNQVRfWFJHQjg4ODgsCisJCQkgICAgTE9DQUxfRFJN X0ZPUk1BVF9NT0RfTk9ORSwKKwkJCSAgICAwLjAsIDAuMCwgMC4wLAorCQkJICAgICZkYXRhLT5w cmltYXJ5X2ZiKTsKKworCXByaW1hcnkgPSBpZ3Rfb3V0cHV0X2dldF9wbGFuZV90eXBlKG91dHB1 dCwgRFJNX1BMQU5FX1RZUEVfUFJJTUFSWSk7CisJaWd0X3BsYW5lX3NldF9mYihwcmltYXJ5LCAm ZGF0YS0+cHJpbWFyeV9mYik7CisKKwlpZ3RfZGlzcGxheV9jb21taXQoZGlzcGxheSk7CisKKwlp Z3Rfd2FpdF9mb3JfdmJsYW5rKGZkLCBkYXRhLT5waXBlKTsKK30KKworc3RhdGljIHZvaWQgY2xl YW51cF9jcnRjKGRhdGFfdCAqZGF0YSwgaW50IGZkLCBpZ3Rfb3V0cHV0X3QgKm91dHB1dCkKK3sK KwlpZ3RfZGlzcGxheV90ICpkaXNwbGF5ID0gJmRhdGEtPmRpc3BsYXk7CisJaWd0X3BsYW5lX3Qg KnByaW1hcnk7CisKKwlpZ3RfcmVtb3ZlX2ZiKGZkLCAmZGF0YS0+cHJpbWFyeV9mYik7CisKKwlw cmltYXJ5ID0gaWd0X291dHB1dF9nZXRfcGxhbmVfdHlwZShvdXRwdXQsIERSTV9QTEFORV9UWVBF X1BSSU1BUlkpOworCWlndF9wbGFuZV9zZXRfZmIocHJpbWFyeSwgTlVMTCk7CisKKwlpZ3Rfb3V0 cHV0X3NldF9waXBlKG91dHB1dCwgUElQRV9BTlkpOworCWlndF9kaXNwbGF5X2NvbW1pdChkaXNw bGF5KTsKK30KKworc3RhdGljIGludCB3YWl0X3ZibGFuayhpbnQgZmQsIHVuaW9uIGRybV93YWl0 X3ZibGFuayAqdmJsKQoreworCWludCBlcnI7CisKKwllcnIgPSAwOworCWlmIChpZ3RfaW9jdGwo ZmQsIERSTV9JT0NUTF9XQUlUX1ZCTEFOSywgdmJsKSkKKwkJZXJyID0gLWVycm5vOworCisJcmV0 dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQKK2V2ZW50X3dhaXQoaW50IGdlbV9mZCwgY29uc3Qg c3RydWN0IGludGVsX2V4ZWN1dGlvbl9lbmdpbmUyICplKQoreworCXN0cnVjdCBkcm1faTkxNV9n ZW1fZXhlY19vYmplY3QyIG9iaiA9IHsgfTsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNidWZm ZXIyIGViID0geyB9OworCWRhdGFfdCBkYXRhOworCWlndF9kaXNwbGF5X3QgKmRpc3BsYXkgPSAm ZGF0YS5kaXNwbGF5OworCWNvbnN0IHVpbnQzMl90IERFUlJNUiA9IDB4NDQwNTA7CisJdW5zaWdu ZWQgaW50IHZhbGlkX3Rlc3RzID0gMDsKKwl1aW50MzJfdCBiYXRjaFs4XSwgKmI7CisJaWd0X291 dHB1dF90ICpvdXRwdXQ7CisJdWludDMyX3QgYmJfaGFuZGxlOworCXVpbnQzMl90IHJlZzsKKwll bnVtIHBpcGUgcDsKKwlpbnQgZmQ7CisKKwlpZ3RfcmVxdWlyZShpbnRlbF9nZW4oaW50ZWxfZ2V0 X2RybV9kZXZpZChnZW1fZmQpKSA+PSA2KTsKKwlpZ3RfcmVxdWlyZShpbnRlbF9yZWdpc3Rlcl9h Y2Nlc3NfaW5pdChpbnRlbF9nZXRfcGNpX2RldmljZSgpLAorCQkJCQkgICAgICAgZmFsc2UsIGdl bV9mZCkgPT0gMCk7CisKKwkvKioKKwkgKiBXZSB3aWxsIHVzZSB0aGUgZGlzcGxheSB0byByZW5k ZXIgZXZlbnQgZm9yd2FyaW5kIHNvIG5lZWQgdG8KKwkgKiBwcm9ncmFtIHRoZSBERVJSTVIgcmVn aXN0ZXIgYW5kIHJlc3RvcmUgaXQgYXQgZXhpdC4KKwkgKgorCSAqIFdlIHdpbGwgZW1pdCBhIE1J X1dBSVRfRk9SX0VWRU5UIGxpc3RlbmluZyBmb3IgdmJsYW5rIGV2ZW50cywKKwkgKiBoYXZlIGEg YmFja2dyb3VuZCBoZWxwZXIgdG8gaW5kaXJlY3RseSBlbmFibGUgdmJsYW5rIGlycXMsIGFuZAor CSAqIGxpc3RlbiB0byB0aGUgcmVjb3JkZWQgdGltZSBzcGVudCBpbiBlbmdpbmUgd2FpdCBzdGF0 ZSBhcyByZXBvcnRlZAorCSAqIGJ5IHRoZSBQTVUuCisJICovCisJcmVnID0gaW50ZWxfcmVnaXN0 ZXJfcmVhZChERVJSTVIpOworCisJa21zdGVzdF9zZXRfdnRfZ3JhcGhpY3NfbW9kZSgpOworCWln dF9kaXNwbGF5X2luaXQoJmRhdGEuZGlzcGxheSwgZ2VtX2ZkKTsKKworCWJiX2hhbmRsZSA9IGdl bV9jcmVhdGUoZ2VtX2ZkLCA0MDk2KTsKKworCWIgPSBiYXRjaDsKKwkqYisrID0gTUlfTE9BRF9S RUdJU1RFUl9JTU07CisJKmIrKyA9IERFUlJNUjsKKwkqYisrID0gcmVnICYgfigoMSA8PCAzKSB8 ICgxIDw8IDExKSB8ICgxIDw8IDIxKSk7CisJKmIrKyA9IE1JX1dBSVRfRk9SX0VWRU5UIHwgTUlf V0FJVF9GT1JfUElQRV9BX1ZCTEFOSzsKKwkqYisrID0gTUlfTE9BRF9SRUdJU1RFUl9JTU07CisJ KmIrKyA9IERFUlJNUjsKKwkqYisrID0gcmVnOworCSpiKysgPSBNSV9CQVRDSF9CVUZGRVJfRU5E OworCisJb2JqLmhhbmRsZSA9IGJiX2hhbmRsZTsKKworCWViLmJ1ZmZlcl9jb3VudCA9IDE7CisJ ZWIuYnVmZmVyc19wdHIgPSB0b191c2VyX3BvaW50ZXIoJm9iaik7CisJZWIuZmxhZ3MgPSBlMnJp bmcoZ2VtX2ZkLCBlKSB8IEk5MTVfRVhFQ19TRUNVUkU7CisKKwlmb3JfZWFjaF9waXBlX3dpdGhf dmFsaWRfb3V0cHV0KGRpc3BsYXksIHAsIG91dHB1dCkgeworCQlzdHJ1Y3QgaWd0X2hlbHBlcl9w cm9jZXNzIHdhaXRlciA9IHsgfTsKKwkJY29uc3QgdW5zaWduZWQgaW50IGZyYW1lcyA9IDM7CisJ CXVuc2lnbmVkIGludCBmcmFtZTsKKwkJdWludDY0X3QgdmFsWzJdOworCisJCWJhdGNoWzNdID0g TUlfV0FJVF9GT1JfRVZFTlQ7CisJCXN3aXRjaCAocCkgeworCQljYXNlIFBJUEVfQToKKwkJCWJh dGNoWzNdIHw9IE1JX1dBSVRfRk9SX1BJUEVfQV9WQkxBTks7CisJCQlicmVhazsKKwkJY2FzZSBQ SVBFX0I6CisJCQliYXRjaFszXSB8PSBNSV9XQUlUX0ZPUl9QSVBFX0JfVkJMQU5LOworCQkJYnJl YWs7CisJCWNhc2UgUElQRV9DOgorCQkJYmF0Y2hbM10gfD0gTUlfV0FJVF9GT1JfUElQRV9DX1ZC TEFOSzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJY29udGludWU7CisJCX0KKworCQlnZW1f d3JpdGUoZ2VtX2ZkLCBiYl9oYW5kbGUsIDAsIGJhdGNoLCBzaXplb2YoYmF0Y2gpKTsKKworCQlk YXRhLnBpcGUgPSBwOworCQlwcmVwYXJlX2NydGMoJmRhdGEsIGdlbV9mZCwgb3V0cHV0KTsKKwor CQlmZCA9IG9wZW5fcG11KEk5MTVfUE1VX0VOR0lORV9XQUlUKGUtPmNsYXNzLCBlLT5pbnN0YW5j ZSkpOworCisJCXZhbFswXSA9IHBtdV9yZWFkX3NpbmdsZShmZCk7CisKKwkJaWd0X2ZvcmtfaGVs cGVyKCZ3YWl0ZXIpIHsKKwkJCWNvbnN0IHVpbnQzMl90IHBpcGVfaWRfZmxhZyA9CisJCQkJCWtt c3Rlc3RfZ2V0X3ZibF9mbGFnKGRhdGEucGlwZSk7CisKKwkJCWZvciAoOzspIHsKKwkJCQl1bmlv biBkcm1fd2FpdF92YmxhbmsgdmJsID0geyB9OworCisJCQkJdmJsLnJlcXVlc3QudHlwZSA9IERS TV9WQkxBTktfUkVMQVRJVkU7CisJCQkJdmJsLnJlcXVlc3QudHlwZSB8PSBwaXBlX2lkX2ZsYWc7 CisJCQkJdmJsLnJlcXVlc3Quc2VxdWVuY2UgPSAxOworCQkJCWlndF9hc3NlcnRfZXEod2FpdF92 YmxhbmsoZ2VtX2ZkLCAmdmJsKSwgMCk7CisJCQl9CisJCX0KKworCQlmb3IgKGZyYW1lID0gMDsg ZnJhbWUgPCBmcmFtZXM7IGZyYW1lKyspIHsKKwkJCWdlbV9leGVjYnVmKGdlbV9mZCwgJmViKTsK KwkJCWdlbV9zeW5jKGdlbV9mZCwgYmJfaGFuZGxlKTsKKwkJfQorCisJCWlndF9zdG9wX2hlbHBl cigmd2FpdGVyKTsKKworCQl2YWxbMV0gPSBwbXVfcmVhZF9zaW5nbGUoZmQpOworCisJCWNsb3Nl KGZkKTsKKworCQljbGVhbnVwX2NydGMoJmRhdGEsIGdlbV9mZCwgb3V0cHV0KTsKKwkJdmFsaWRf dGVzdHMrKzsKKworCQlpZ3RfYXNzZXJ0KHZhbFsxXSAtIHZhbFswXSA+IDApOworCX0KKworCWdl bV9jbG9zZShnZW1fZmQsIGJiX2hhbmRsZSk7CisKKwlpbnRlbF9yZWdpc3Rlcl9hY2Nlc3NfZmlu aSgpOworCisJaWd0X3JlcXVpcmVfZih2YWxpZF90ZXN0cywKKwkJICAgICAgIm5vIHZhbGlkIGNy dGMvY29ubmVjdG9yIGNvbWJpbmF0aW9ucyBmb3VuZFxuIik7Cit9CisKK3N0YXRpYyB2b2lkCitt dWx0aV9jbGllbnQoaW50IGdlbV9mZCwgY29uc3Qgc3RydWN0IGludGVsX2V4ZWN1dGlvbl9lbmdp bmUyICplKQoreworCXVpbnQ2NF90IGNvbmZpZyA9IEk5MTVfUE1VX0VOR0lORV9CVVNZKGUtPmNs YXNzLCBlLT5pbnN0YW5jZSk7CisJdW5zaWduZWQgaW50IHNsZXB0OworCWlndF9zcGluX3QgKnNw aW47CisJdWludDY0X3QgdmFsWzJdOworCWludCBmZFsyXTsKKworCWZkWzBdID0gb3Blbl9wbXUo Y29uZmlnKTsKKworCXNwaW4gPSBpZ3Rfc3Bpbl9iYXRjaF9uZXcoZ2VtX2ZkLCAwLCBlMnJpbmco Z2VtX2ZkLCBlKSwgMCk7CisJaWd0X3NwaW5fYmF0Y2hfc2V0X3RpbWVvdXQoc3BpbiwgYmF0Y2hf ZHVyYXRpb25fbnMpOworCisJdXNsZWVwKGJhdGNoX2R1cmF0aW9uX25zIC8gMzAwMCk7CisKKwkv KgorCSAqIFNlY29uZCBQTVUgY2xpZW50IHdoaWNoIGlzIGluaXRpYWxpemVkIGFmdGVyIHRoZSBm aXJzdCBvbmUsCisJICogYW5kIGV4aXN0cyBiZWZvcmUgaXQsIHNob3VsZCBub3QgYWZmZWN0IGFj Y291bnRpbmcgYXMgcmVwb3J0ZWQKKwkgKiBpbiB0aGUgZmlyc3QgY2xpZW50LgorCSAqLworCWZk WzFdID0gb3Blbl9wbXUoY29uZmlnKTsKKwlzbGVwdCA9IG1lYXN1cmVkX3VzbGVlcChiYXRjaF9k dXJhdGlvbl9ucyAvIDMwMDApOworCXZhbFsxXSA9IHBtdV9yZWFkX3NpbmdsZShmZFsxXSk7CisJ Y2xvc2UoZmRbMV0pOworCisJZ2VtX3N5bmMoZ2VtX2ZkLCBzcGluLT5oYW5kbGUpOworCisJdmFs WzBdID0gcG11X3JlYWRfc2luZ2xlKGZkWzBdKTsKKworCWFzc2VydF93aXRoaW5fZXBzaWxvbih2 YWxbMF0sIGJhdGNoX2R1cmF0aW9uX25zLCB0b2xlcmFuY2UpOworCWFzc2VydF93aXRoaW5fZXBz aWxvbih2YWxbMV0sIHNsZXB0LCB0b2xlcmFuY2UpOworCisJaWd0X3NwaW5fYmF0Y2hfZnJlZShn ZW1fZmQsIHNwaW4pOworCWNsb3NlKGZkWzBdKTsKK30KKworLyoqCisgKiBUZXN0cyB0aGF0IGk5 MTUgUE1VIGNvcmVjdGx5IGVycm9ycyBvdXQgaW4gaW52YWxpZCBpbml0aWFsaXphdGlvbi4KKyAq IGk5MTUgUE1VIGlzIHVuY29yZSBQTVUsIHRodXM6CisgKiAgLSBzYW1wbGluZyBwZXJpb2QgaXMg bm90IHN1cHBvcnRlZAorICogIC0gcGlkID4gMCBpcyBub3Qgc3VwcG9ydGVkIHNpbmNlIHdlIGNh bid0IGNvdW50IHBlci1wcm9jZXNzICh3ZSBjb3VudAorICogICAgcGVyIHdob2xlIHN5c3RlbSkK KyAqICAtIGNwdSAhPSAwIGlzIG5vdCBzdXBwb3J0ZWQgc2luY2UgaTkxNSBQTVUgZXhwb3NlcyBj cHVtYXNrIGZvciBDUFUwCisgKi8KK3N0YXRpYyB2b2lkIGludmFsaWRfaW5pdCh2b2lkKQorewor CXN0cnVjdCBwZXJmX2V2ZW50X2F0dHIgYXR0cjsKKwlpbnQgcGlkLCBjcHU7CisKKyNkZWZpbmUg QVRUUl9JTklUKCkgXAorZG8geyBcCisJbWVtc2V0KCZhdHRyLCAwLCBzaXplb2YgKGF0dHIpKTsg XAorCWF0dHIuY29uZmlnID0gSTkxNV9QTVVfRU5HSU5FX0JVU1koSTkxNV9FTkdJTkVfQ0xBU1Nf UkVOREVSLCAwKTsgXAorCWF0dHIudHlwZSA9IGk5MTVfdHlwZV9pZCgpOyBcCisJaWd0X2Fzc2Vy dChhdHRyLnR5cGUgIT0gMCk7IFwKK30gd2hpbGUoMCkKKworCUFUVFJfSU5JVCgpOworCWF0dHIu c2FtcGxlX3BlcmlvZCA9IDEwMDsKKwlwaWQgPSAtMTsKKwljcHUgPSAwOworCWlndF9hc3NlcnRf ZXEocGVyZl9ldmVudF9vcGVuKCZhdHRyLCBwaWQsIGNwdSwgLTEsIDApLCAtMSk7CisJaWd0X2Fz c2VydF9lcShlcnJubywgRUlOVkFMKTsKKworCUFUVFJfSU5JVCgpOworCXBpZCA9IDA7CisJY3B1 ID0gMDsKKwlpZ3RfYXNzZXJ0X2VxKHBlcmZfZXZlbnRfb3BlbigmYXR0ciwgcGlkLCBjcHUsIC0x LCAwKSwgLTEpOworCWlndF9hc3NlcnRfZXEoZXJybm8sIEVJTlZBTCk7CisKKwlBVFRSX0lOSVQo KTsKKwlwaWQgPSAtMTsKKwljcHUgPSAxOworCWlndF9hc3NlcnRfZXEocGVyZl9ldmVudF9vcGVu KCZhdHRyLCBwaWQsIGNwdSwgLTEsIDApLCAtMSk7CisJaWd0X2Fzc2VydF9lcShlcnJubywgRU5P REVWKTsKK30KKworc3RhdGljIHZvaWQgaW5pdF9vdGhlcih1bnNpZ25lZCBpbnQgaSwgYm9vbCB2 YWxpZCkKK3sKKwlpbnQgZmQ7CisKKwlmZCA9IHBlcmZfaTkxNV9vcGVuKF9fSTkxNV9QTVVfT1RI RVIoaSkpOworCWlndF9yZXF1aXJlKCEoZmQgPCAwICYmIGVycm5vID09IEVOT0RFVikpOworCWlm ICh2YWxpZCkgeworCQlpZ3RfYXNzZXJ0KGZkID49IDApOworCX0gZWxzZSB7CisJCWlndF9hc3Nl cnQoZmQgPCAwKTsKKwkJcmV0dXJuOworCX0KKworCWNsb3NlKGZkKTsKK30KKworc3RhdGljIHZv aWQgcmVhZF9vdGhlcih1bnNpZ25lZCBpbnQgaSwgYm9vbCB2YWxpZCkKK3sKKwlpbnQgZmQ7CisK KwlmZCA9IHBlcmZfaTkxNV9vcGVuKF9fSTkxNV9QTVVfT1RIRVIoaSkpOworCWlndF9yZXF1aXJl KCEoZmQgPCAwICYmIGVycm5vID09IEVOT0RFVikpOworCWlmICh2YWxpZCkgeworCQlpZ3RfYXNz ZXJ0KGZkID49IDApOworCX0gZWxzZSB7CisJCWlndF9hc3NlcnQoZmQgPCAwKTsKKwkJcmV0dXJu OworCX0KKworCSh2b2lkKXBtdV9yZWFkX3NpbmdsZShmZCk7CisKKwljbG9zZShmZCk7Cit9CisK K3N0YXRpYyBib29sIGNwdTBfaG90cGx1Z19zdXBwb3J0KHZvaWQpCit7CisJcmV0dXJuIGFjY2Vz cygiL3N5cy9kZXZpY2VzL3N5c3RlbS9jcHUvY3B1MC9vbmxpbmUiLCBXX09LKSA9PSAwOworfQor CitzdGF0aWMgdm9pZCBjcHVfaG90cGx1ZyhpbnQgZ2VtX2ZkKQoreworCXN0cnVjdCB0aW1lc3Bl YyBzdGFydCA9IHsgfTsKKwlpZ3Rfc3Bpbl90ICpzcGluOworCXVpbnQ2NF90IHZhbCwgcmVmOwor CWludCBmZDsKKworCWlndF9yZXF1aXJlKGNwdTBfaG90cGx1Z19zdXBwb3J0KCkpOworCisJc3Bp biA9IGlndF9zcGluX2JhdGNoX25ldyhnZW1fZmQsIDAsIEk5MTVfRVhFQ19SRU5ERVIsIDApOwor CWZkID0gcGVyZl9pOTE1X29wZW4oSTkxNV9QTVVfRU5HSU5FX0JVU1koSTkxNV9FTkdJTkVfQ0xB U1NfUkVOREVSLCAwKSk7CisJaWd0X2Fzc2VydChmZCA+PSAwKTsKKworCWlndF9uc2VjX2VsYXBz ZWQoJnN0YXJ0KTsKKworCS8qCisJICogVG9nZ2xlIG9ubGluZSBzdGF0dXMgb2YgYWxsIHRoZSBD UFVzIGluIGEgY2hpbGQgcHJvY2VzcyBhbmQgZW5zdXJlCisJICogdGhpcyBoYXMgbm90IGFmZmVj dGVkIGJ1c3luZXNzIHN0YXRzIGluIHRoZSBwYXJlbnQuCisJICovCisJaWd0X2ZvcmsoY2hpbGQs IDEpIHsKKwkJaW50IGNwdSA9IDA7CisKKwkJZm9yICg7OykgeworCQkJY2hhciBuYW1lWzEyOF07 CisJCQlpbnQgY3B1ZmQ7CisKKwkJCXNwcmludGYobmFtZSwgIi9zeXMvZGV2aWNlcy9zeXN0ZW0v Y3B1L2NwdSVkL29ubGluZSIsCisJCQkJY3B1KTsKKwkJCWNwdWZkID0gb3BlbihuYW1lLCBPX1dS T05MWSk7CisJCQlpZiAoY3B1ZmQgPT0gLTEpIHsKKwkJCQlpZ3RfYXNzZXJ0KGNwdSA+IDApOwor CQkJCWJyZWFrOworCQkJfQorCQkJaWd0X2Fzc2VydF9lcSh3cml0ZShjcHVmZCwgIjAiLCAyKSwg Mik7CisKKwkJCXVzbGVlcCgxMDAwICogMTAwMCk7CisKKwkJCWlndF9hc3NlcnRfZXEod3JpdGUo Y3B1ZmQsICIxIiwgMiksIDIpOworCisJCQljbG9zZShjcHVmZCk7CisJCQljcHUrKzsKKwkJfQor CX0KKworCWlndF93YWl0Y2hpbGRyZW4oKTsKKworCWlndF9zcGluX2JhdGNoX2VuZChzcGluKTsK KwlnZW1fc3luYyhnZW1fZmQsIHNwaW4tPmhhbmRsZSk7CisKKwlyZWYgPSBpZ3RfbnNlY19lbGFw c2VkKCZzdGFydCk7CisJdmFsID0gcG11X3JlYWRfc2luZ2xlKGZkKTsKKworCWFzc2VydF93aXRo aW5fZXBzaWxvbih2YWwsIHJlZiwgdG9sZXJhbmNlKTsKKworCWlndF9zcGluX2JhdGNoX2ZyZWUo Z2VtX2ZkLCBzcGluKTsKKwljbG9zZShmZCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGNh bGlicmF0ZV9ub3AoaW50IGZkLCBjb25zdCB1bnNpZ25lZCBpbnQgY2FsaWJyYXRpb25fdXMpCit7 CisJY29uc3QgdW5zaWduZWQgaW50IGNhbF9taW5fdXMgPSBjYWxpYnJhdGlvbl91cyAqIDM7CisJ Y29uc3QgdW5zaWduZWQgaW50IHRvbGVyYW5jZV9wY3QgPSAxMDsKKwljb25zdCB1aW50MzJfdCBi YmUgPSAweGEgPDwgMjM7CisJY29uc3QgdW5zaWduZWQgaW50IGxvb3BzID0gMTc7CisJc3RydWN0 IGRybV9pOTE1X2dlbV9leGVjX29iamVjdDIgb2JqID0ge307CisJc3RydWN0IGRybV9pOTE1X2dl bV9leGVjYnVmZmVyMiBlYiA9CisJCXsgLmJ1ZmZlcl9jb3VudCA9IDEsIC5idWZmZXJzX3B0ciA9 ICh1aW50cHRyX3QpJm9ian07CisJc3RydWN0IHRpbWVzcGVjIHRfYmVnaW4gPSB7IH07CisJbG9u ZyBzaXplLCBsYXN0X3NpemU7CisJdW5zaWduZWQgbG9uZyBuczsKKworCWlndF9uc2VjX2VsYXBz ZWQoJnRfYmVnaW4pOworCisJc2l6ZSA9IDI1NiAqIDEwMjQ7CisJZG8geworCQlzdHJ1Y3QgdGlt ZXNwZWMgdF9zdGFydCA9IHsgfTsKKworCQlvYmouaGFuZGxlID0gZ2VtX2NyZWF0ZShmZCwgc2l6 ZSk7CisJCWdlbV93cml0ZShmZCwgb2JqLmhhbmRsZSwgc2l6ZSAtIHNpemVvZihiYmUpLCAmYmJl LAorCQkJICBzaXplb2YoYmJlKSk7CisJCWdlbV9leGVjYnVmKGZkLCAmZWIpOworCQlnZW1fc3lu YyhmZCwgb2JqLmhhbmRsZSk7CisKKwkJaWd0X25zZWNfZWxhcHNlZCgmdF9zdGFydCk7CisKKwkJ Zm9yIChpbnQgbG9vcCA9IDA7IGxvb3AgPCBsb29wczsgbG9vcCsrKQorCQkJZ2VtX2V4ZWNidWYo ZmQsICZlYik7CisJCWdlbV9zeW5jKGZkLCBvYmouaGFuZGxlKTsKKworCQlucyA9IGlndF9uc2Vj X2VsYXBzZWQoJnRfc3RhcnQpOworCisJCWdlbV9jbG9zZShmZCwgb2JqLmhhbmRsZSk7CisKKwkJ bGFzdF9zaXplID0gc2l6ZTsKKwkJc2l6ZSA9IGNhbGlicmF0aW9uX3VzICogMTAwMCAqIHNpemUg KiBsb29wcyAvIG5zOworCQlzaXplID0gQUxJR04oc2l6ZSwgc2l6ZW9mKHVpbnQzMl90KSk7CisJ fSB3aGlsZSAoaWd0X25zZWNfZWxhcHNlZCgmdF9iZWdpbikgLyAxMDAwIDwgY2FsX21pbl91cyB8 fAorCQkgYWJzKHNpemUgLSBsYXN0X3NpemUpID4gKHNpemUgKiB0b2xlcmFuY2VfcGN0IC8gMTAw KSk7CisKKwlyZXR1cm4gc2l6ZSAvIHNpemVvZih1aW50MzJfdCk7Cit9CisKK3N0YXRpYyB2b2lk IGV4ZWNfbm9wKGludCBnZW1fZmQsIHVuc2lnbmVkIGxvbmcgc3opCit7CisJc3RydWN0IGRybV9p OTE1X2dlbV9leGVjX29iamVjdDIgb2JqID0ge307CisJc3RydWN0IGRybV9pOTE1X2dlbV9leGVj YnVmZmVyMiBlYiA9CisJCXsgLmJ1ZmZlcl9jb3VudCA9IDEsIC5idWZmZXJzX3B0ciA9ICh1aW50 cHRyX3QpJm9ian07CisJY29uc3QgdWludDMyX3QgYmJlID0gTUlfQkFUQ0hfQlVGRkVSX0VORDsK KwlzdHJ1Y3QgcG9sbGZkIHBmZDsKKwlpbnQgZmVuY2U7CisKKwlzeiA9IEFMSUdOKHN6LCBzaXpl b2YodWludDMyX3QpKTsKKworCW9iai5oYW5kbGUgPSBnZW1fY3JlYXRlKGdlbV9mZCwgc3opOwor CWdlbV93cml0ZShnZW1fZmQsIG9iai5oYW5kbGUsIHN6IC0gc2l6ZW9mKGJiZSksICZiYmUsIHNp emVvZihiYmUpKTsKKworCWViLmZsYWdzID0gSTkxNV9FWEVDX1JFTkRFUiB8IEk5MTVfRVhFQ19G RU5DRV9PVVQ7CisKKwlnZW1fZXhlY2J1Zl93cihnZW1fZmQsICZlYik7CisJZmVuY2UgPSBlYi5y c3ZkMiA+PiAzMjsKKworCS8qCisJICogUG9sbCBvbiB0aGUgb3V0cHV0IGZlbmNlIHRvIGVuc3Vy ZSB1c2VyIGludGVycnVwdHMgd2lsbCBiZQorCSAqIGdlbmVyYXRlZCBhbmQgbGlzdGVuZWQgdG8u CisJICovCisJcGZkLmZkID0gZmVuY2U7CisJcGZkLmV2ZW50cyA9IFBPTExJTjsKKwlpZ3RfYXNz ZXJ0X2VxKHBvbGwoJnBmZCwgMSwgLTEpLCAxKTsKKworCWNsb3NlKGZlbmNlKTsKKwlnZW1fY2xv c2UoZ2VtX2ZkLCBvYmouaGFuZGxlKTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfaW50ZXJydXB0 cyhpbnQgZ2VtX2ZkKQoreworCWNvbnN0IHVuc2lnbmVkIGludCBjYWxpYnJhdGlvbl91cyA9IDI1 MDAwMDsKKwljb25zdCB1bnNpZ25lZCBpbnQgYmF0Y2hfbGVuX3VzID0gMTAwMDAwOworCWNvbnN0 IHVuc2lnbmVkIGludCBiYXRjaF9jb3VudCA9IDNlNiAvIGJhdGNoX2xlbl91czsKKwl1aW50NjRf dCBpZGxlLCBidXN5LCBwcmV2OworCXVuc2lnbmVkIGxvbmcgY2FsLCBzejsKKwl1bnNpZ25lZCBp bnQgaTsKKwlpbnQgZmQ7CisKKwljYWwgPSBjYWxpYnJhdGVfbm9wKGdlbV9mZCwgY2FsaWJyYXRp b25fdXMpOworCXN6ID0gYmF0Y2hfbGVuX3VzICogY2FsIC8gY2FsaWJyYXRpb25fdXM7CisKKwlm ZCA9IG9wZW5fcG11KEk5MTVfUE1VX0lOVEVSUlVQVFMpOworCisJZ2VtX3F1aWVzY2VudF9ncHUo Z2VtX2ZkKTsKKworCS8qIFdhaXQgZm9yIGlkbGUgc3RhdGUuICovCisJcHJldiA9IHBtdV9yZWFk X3NpbmdsZShmZCk7CisJaWRsZSA9IHByZXYgKyAxOworCXdoaWxlIChpZGxlICE9IHByZXYpIHsK KwkJdXNsZWVwKDFlNik7CisJCXByZXYgPSBpZGxlOworCQlpZGxlID0gcG11X3JlYWRfc2luZ2xl KGZkKTsKKwl9CisKKwlpZ3RfYXNzZXJ0X2VxKGlkbGUgLSBwcmV2LCAwKTsKKworCS8qCisJICog U2VuZCBzb21lIG5vLW9wIGJhdGNoZXMgd2FpdGluZyBvbiBvdXRwdXQgZmVuY2VzIHRvCisJICog ZW5zdXJlIGludGVycnVwdHMuCisJICovCisJZm9yIChpID0gMDsgaSA8IGJhdGNoX2NvdW50OyBp KyspCisJCWV4ZWNfbm9wKGdlbV9mZCwgc3opOworCisJLyogQ2hlY2sgYXQgbGVhc3QgYXMgbWFu eSBpbnRlcnJ1cHRzIGhhcyBiZWVuIGdlbmVyYXRlZC4gKi8KKwlidXN5ID0gcG11X3JlYWRfc2lu Z2xlKGZkKSAtIGlkbGU7CisJaWd0X2Fzc2VydChidXN5ID49IGJhdGNoX2NvdW50KTsKKworCWNs b3NlKGZkKTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfZnJlcXVlbmN5KGludCBnZW1fZmQpCit7 CisJY29uc3QgdWludDY0X3QgZHVyYXRpb25fbnMgPSAyZTk7CisJdWludDMyX3QgbWluX2ZyZXEs IG1heF9mcmVxLCBib29zdF9mcmVxOworCXVpbnQ2NF90IG1pblsyXSwgbWF4WzJdLCBzdGFydFsy XTsKKwlpZ3Rfc3Bpbl90ICpzcGluOworCWludCBmZCwgc3lzZnM7CisKKwlzeXNmcyA9IGlndF9z eXNmc19vcGVuKGdlbV9mZCwgTlVMTCk7CisJaWd0X3JlcXVpcmUoc3lzZnMgPj0gMCk7CisKKwlt aW5fZnJlcSA9IGlndF9zeXNmc19nZXRfdTMyKHN5c2ZzLCAiZ3RfUlBuX2ZyZXFfbWh6Iik7CisJ bWF4X2ZyZXEgPSBpZ3Rfc3lzZnNfZ2V0X3UzMihzeXNmcywgImd0X1JQMF9mcmVxX21oeiIpOwor CWJvb3N0X2ZyZXEgPSBpZ3Rfc3lzZnNfZ2V0X3UzMihzeXNmcywgImd0X2Jvb3N0X2ZyZXFfbWh6 Iik7CisJaWd0X3JlcXVpcmUobWluX2ZyZXEgPiAwICYmIG1heF9mcmVxID4gMCAmJiBib29zdF9m cmVxID4gMCk7CisJaWd0X3JlcXVpcmUobWF4X2ZyZXEgPiBtaW5fZnJlcSk7CisJaWd0X3JlcXVp cmUoYm9vc3RfZnJlcSA+IG1pbl9mcmVxKTsKKworCWZkID0gb3Blbl9ncm91cChJOTE1X1BNVV9S RVFVRVNURURfRlJFUVVFTkNZLCAtMSk7CisJb3Blbl9ncm91cChJOTE1X1BNVV9BQ1RVQUxfRlJF UVVFTkNZLCBmZCk7CisKKwkvKgorCSAqIFNldCBHUFUgdG8gbWluIGZyZXF1ZW5jeSBhbmQgcmVh ZCBQTVUgY291bnRlcnMuCisJICovCisJaWd0X3JlcXVpcmUoaWd0X3N5c2ZzX3NldF91MzIoc3lz ZnMsICJndF9tYXhfZnJlcV9taHoiLCBtaW5fZnJlcSkpOworCWlndF9yZXF1aXJlKGlndF9zeXNm c19nZXRfdTMyKHN5c2ZzLCAiZ3RfbWF4X2ZyZXFfbWh6IikgPT0gbWluX2ZyZXEpOworCWlndF9y ZXF1aXJlKGlndF9zeXNmc19zZXRfdTMyKHN5c2ZzLCAiZ3RfYm9vc3RfZnJlcV9taHoiLCBtaW5f ZnJlcSkpOworCWlndF9yZXF1aXJlKGlndF9zeXNmc19nZXRfdTMyKHN5c2ZzLCAiZ3RfYm9vc3Rf ZnJlcV9taHoiKSA9PSBtaW5fZnJlcSk7CisKKwlwbXVfcmVhZF9tdWx0aShmZCwgMiwgc3RhcnQp OworCisJc3BpbiA9IGlndF9zcGluX2JhdGNoX25ldyhnZW1fZmQsIDAsIEk5MTVfRVhFQ19SRU5E RVIsIDApOworCWlndF9zcGluX2JhdGNoX3NldF90aW1lb3V0KHNwaW4sIGR1cmF0aW9uX25zKTsK KwlnZW1fc3luYyhnZW1fZmQsIHNwaW4tPmhhbmRsZSk7CisKKwlwbXVfcmVhZF9tdWx0aShmZCwg MiwgbWluKTsKKwltaW5bMF0gLT0gc3RhcnRbMF07CisJbWluWzFdIC09IHN0YXJ0WzFdOworCisJ aWd0X3NwaW5fYmF0Y2hfZnJlZShnZW1fZmQsIHNwaW4pOworCisJdXNsZWVwKDFlNik7CisKKwkv KgorCSAqIFNldCBHUFUgdG8gbWF4IGZyZXF1ZW5jeSBhbmQgcmVhZCBQTVUgY291bnRlcnMuCisJ ICovCisJaWd0X3JlcXVpcmUoaWd0X3N5c2ZzX3NldF91MzIoc3lzZnMsICJndF9tYXhfZnJlcV9t aHoiLCBtYXhfZnJlcSkpOworCWlndF9yZXF1aXJlKGlndF9zeXNmc19nZXRfdTMyKHN5c2ZzLCAi Z3RfbWF4X2ZyZXFfbWh6IikgPT0gbWF4X2ZyZXEpOworCWlndF9yZXF1aXJlKGlndF9zeXNmc19z ZXRfdTMyKHN5c2ZzLCAiZ3RfYm9vc3RfZnJlcV9taHoiLCBib29zdF9mcmVxKSk7CisJaWd0X3Jl cXVpcmUoaWd0X3N5c2ZzX2dldF91MzIoc3lzZnMsICJndF9ib29zdF9mcmVxX21oeiIpID09IGJv b3N0X2ZyZXEpOworCisJaWd0X3JlcXVpcmUoaWd0X3N5c2ZzX3NldF91MzIoc3lzZnMsICJndF9t aW5fZnJlcV9taHoiLCBtYXhfZnJlcSkpOworCWlndF9yZXF1aXJlKGlndF9zeXNmc19nZXRfdTMy KHN5c2ZzLCAiZ3RfbWluX2ZyZXFfbWh6IikgPT0gbWF4X2ZyZXEpOworCisJcG11X3JlYWRfbXVs dGkoZmQsIDIsIHN0YXJ0KTsKKworCXNwaW4gPSBpZ3Rfc3Bpbl9iYXRjaF9uZXcoZ2VtX2ZkLCAw LCBJOTE1X0VYRUNfUkVOREVSLCAwKTsKKwlpZ3Rfc3Bpbl9iYXRjaF9zZXRfdGltZW91dChzcGlu LCBkdXJhdGlvbl9ucyk7CisJZ2VtX3N5bmMoZ2VtX2ZkLCBzcGluLT5oYW5kbGUpOworCisJcG11 X3JlYWRfbXVsdGkoZmQsIDIsIG1heCk7CisJbWF4WzBdIC09IHN0YXJ0WzBdOworCW1heFsxXSAt PSBzdGFydFsxXTsKKworCWlndF9zcGluX2JhdGNoX2ZyZWUoZ2VtX2ZkLCBzcGluKTsKKworCS8q CisJICogUmVzdG9yZSBtaW4vbWF4LgorCSAqLworCWlndF9yZXF1aXJlKGlndF9zeXNmc19zZXRf dTMyKHN5c2ZzLCAiZ3RfbWluX2ZyZXFfbWh6IiwgbWluX2ZyZXEpKTsKKwlpZ3RfcmVxdWlyZShp Z3Rfc3lzZnNfZ2V0X3UzMihzeXNmcywgImd0X21pbl9mcmVxX21oeiIpID09IG1pbl9mcmVxKTsK KworCWNsb3NlKGZkKTsKKworCWlndF9hc3NlcnQobWluWzBdIDwgbWF4WzBdKTsKKwlpZ3RfYXNz ZXJ0KG1pblsxXSA8IG1heFsxXSk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3JjNihpbnQgZ2Vt X2ZkKQoreworCWludDY0X3QgZHVyYXRpb25fbnMgPSAyICogMTAwMCAqIDEwMDAgKiAxMDAwOwor CXVpbnQ2NF90IGlkbGUsIGJ1c3ksIHByZXY7CisJdW5zaWduZWQgaW50IHNsZXB0OworCWludCBm ZCwgZnc7CisKKwlmZCA9IG9wZW5fcG11KEk5MTVfUE1VX1JDNl9SRVNJREVOQ1kpOworCisJZ2Vt X3F1aWVzY2VudF9ncHUoZ2VtX2ZkKTsKKwl1c2xlZXAoMWU2KTsKKworCS8qIEdvIGlkbGUgYW5k IGNoZWNrIGZ1bGwgUkM2LiAqLworCXByZXYgPSBwbXVfcmVhZF9zaW5nbGUoZmQpOworCXNsZXB0 ID0gbWVhc3VyZWRfdXNsZWVwKGR1cmF0aW9uX25zIC8gMTAwMCk7CisJaWRsZSA9IHBtdV9yZWFk X3NpbmdsZShmZCk7CisKKwlhc3NlcnRfd2l0aGluX2Vwc2lsb24oaWRsZSAtIHByZXYsIHNsZXB0 LCB0b2xlcmFuY2UpOworCisJLyogV2FrZSB1cCBkZXZpY2UgYW5kIGNoZWNrIG5vIFJDNi4gKi8K KwlmdyA9IGlndF9vcGVuX2ZvcmNld2FrZV9oYW5kbGUoZ2VtX2ZkKTsKKwlpZ3RfYXNzZXJ0KGZ3 ID49IDApOworCisJcHJldiA9IHBtdV9yZWFkX3NpbmdsZShmZCk7CisJdXNsZWVwKGR1cmF0aW9u X25zIC8gMTAwMCk7CisJYnVzeSA9IHBtdV9yZWFkX3NpbmdsZShmZCk7CisKKwlhc3NlcnRfd2l0 aGluX2Vwc2lsb24oYnVzeSAtIHByZXYsIDAuMCwgdG9sZXJhbmNlKTsKKworCWNsb3NlKGZ3KTsK KwljbG9zZShmZCk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3JjNnAoaW50IGdlbV9mZCkKK3sK KwlpbnQ2NF90IGR1cmF0aW9uX25zID0gMiAqIDEwMDAgKiAxMDAwICogMTAwMDsKKwl1bnNpZ25l ZCBpbnQgbnVtX3BtdSA9IDE7CisJdWludDY0X3QgaWRsZVszXSwgYnVzeVszXSwgcHJldlszXTsK Kwl1bnNpZ25lZCBpbnQgc2xlcHQsIGk7CisJaW50IGZkLCByZXQsIGZ3OworCisJZmQgPSBvcGVu X2dyb3VwKEk5MTVfUE1VX1JDNl9SRVNJREVOQ1ksIC0xKTsKKwlyZXQgPSBwZXJmX2k5MTVfb3Bl bl9ncm91cChJOTE1X1BNVV9SQzZwX1JFU0lERU5DWSwgZmQpOworCWlmIChyZXQgPiAwKSB7CisJ CW51bV9wbXUrKzsKKwkJcmV0ID0gcGVyZl9pOTE1X29wZW5fZ3JvdXAoSTkxNV9QTVVfUkM2cHBf UkVTSURFTkNZLCBmZCk7CisJCWlmIChyZXQgPiAwKQorCQkJbnVtX3BtdSsrOworCX0KKworCWln dF9yZXF1aXJlKG51bV9wbXUgPT0gMyk7CisKKwlnZW1fcXVpZXNjZW50X2dwdShnZW1fZmQpOwor CXVzbGVlcCgxZTYpOworCisJLyogR28gaWRsZSBhbmQgY2hlY2sgZnVsbCBSQzYuICovCisJcG11 X3JlYWRfbXVsdGkoZmQsIG51bV9wbXUsIHByZXYpOworCXNsZXB0ID0gbWVhc3VyZWRfdXNsZWVw KGR1cmF0aW9uX25zIC8gMTAwMCk7CisJcG11X3JlYWRfbXVsdGkoZmQsIG51bV9wbXUsIGlkbGUp OworCisJZm9yIChpID0gMDsgaSA8IG51bV9wbXU7IGkrKykKKwkJYXNzZXJ0X3dpdGhpbl9lcHNp bG9uKGlkbGVbaV0gLSBwcmV2W2ldLCBzbGVwdCwgdG9sZXJhbmNlKTsKKworCS8qIFdha2UgdXAg ZGV2aWNlIGFuZCBjaGVjayBubyBSQzYuICovCisJZncgPSBpZ3Rfb3Blbl9mb3JjZXdha2VfaGFu ZGxlKGdlbV9mZCk7CisJaWd0X2Fzc2VydChmdyA+PSAwKTsKKworCXBtdV9yZWFkX211bHRpKGZk LCBudW1fcG11LCBwcmV2KTsKKwl1c2xlZXAoZHVyYXRpb25fbnMgLyAxMDAwKTsKKwlwbXVfcmVh ZF9tdWx0aShmZCwgbnVtX3BtdSwgYnVzeSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3BtdTsg aSsrKQorCQlhc3NlcnRfd2l0aGluX2Vwc2lsb24oYnVzeVtpXSAtIHByZXZbaV0sIDAuMCwgdG9s ZXJhbmNlKTsKKworCWNsb3NlKGZ3KTsKKwljbG9zZShmZCk7Cit9CisKK2lndF9tYWluCit7CisJ Y29uc3QgdW5zaWduZWQgaW50IG51bV9vdGhlcl9tZXRyaWNzID0KKwkJCQlJOTE1X1BNVV9MQVNU IC0gX19JOTE1X1BNVV9PVEhFUigwKSArIDE7CisJdW5zaWduZWQgaW50IG51bV9lbmdpbmVzID0g MDsKKwlpbnQgZmQgPSAtMTsKKwljb25zdCBzdHJ1Y3QgaW50ZWxfZXhlY3V0aW9uX2VuZ2luZTIg KmU7CisJdW5zaWduZWQgaW50IGk7CisKKwlpZ3RfZml4dHVyZSB7CisJCWZkID0gZHJtX29wZW5f ZHJpdmVyX21hc3RlcihEUklWRVJfSU5URUwpOworCisJCWlndF9yZXF1aXJlX2dlbShmZCk7CisJ CWlndF9yZXF1aXJlKGk5MTVfdHlwZV9pZCgpID4gMCk7CisKKwkJZm9yX2VhY2hfZW5naW5lX2Ns YXNzX2luc3RhbmNlKGZkLCBlKSB7CisJCQlpZiAoZ2VtX2hhc19lbmdpbmUoZmQsIGUtPmNsYXNz LCBlLT5pbnN0YW5jZSkpCisJCQkJbnVtX2VuZ2luZXMrKzsKKwkJfQorCX0KKworCS8qKgorCSAq IFRlc3QgaW52YWxpZCBhY2Nlc3MgdmlhIHBlcmYgQVBJIGlzIHJlamVjdGVkLgorCSAqLworCWln dF9zdWJ0ZXN0KCJpbnZhbGlkLWluaXQiKQorCQlpbnZhbGlkX2luaXQoKTsKKworCWZvcl9lYWNo X2VuZ2luZV9jbGFzc19pbnN0YW5jZShmZCwgZSkgeworCQkvKioKKwkJICogVGVzdCB0aGF0IGEg c2luZ2xlIGVuZ2luZSBtZXRyaWMgY2FuIGJlIGluaXRpYWxpemVkLgorCQkgKi8KKwkJaWd0X3N1 YnRlc3RfZigiaW5pdC1idXN5LSVzIiwgZS0+bmFtZSkKKwkJCWluaXQoZmQsIGUsIEk5MTVfU0FN UExFX0JVU1kpOworCisJCWlndF9zdWJ0ZXN0X2YoImluaXQtd2FpdC0lcyIsIGUtPm5hbWUpCisJ CQlpbml0KGZkLCBlLCBJOTE1X1NBTVBMRV9XQUlUKTsKKworCQlpZ3Rfc3VidGVzdF9mKCJpbml0 LXNlbWEtJXMiLCBlLT5uYW1lKQorCQkJaW5pdChmZCwgZSwgSTkxNV9TQU1QTEVfU0VNQSk7CisK KwkJLyoqCisJCSAqIFRlc3QgdGhhdCBlbmdpbmVzIHNob3cgbm8gbG9hZCB3aGVuIGlkbGUuCisJ CSAqLworCQlpZ3Rfc3VidGVzdF9mKCJpZGxlLSVzIiwgZS0+bmFtZSkKKwkJCXNpbmdsZShmZCwg ZSwgZmFsc2UpOworCisJCS8qKgorCQkgKiBUZXN0IHRoYXQgYSBzaW5nbGUgZW5naW5lIHJlcG9y dHMgbG9hZCBjb3JyZWN0bHkuCisJCSAqLworCQlpZ3Rfc3VidGVzdF9mKCJidXN5LSVzIiwgZS0+ bmFtZSkKKwkJCXNpbmdsZShmZCwgZSwgdHJ1ZSk7CisKKwkJLyoqCisJCSAqIFRlc3QgdGhhdCB3 aGVuIG9uZSBlbmdpbmUgaXMgbG9hZGVkIG90aGVyIHJlcG9ydCBubyBsb2FkLgorCQkgKi8KKwkJ aWd0X3N1YnRlc3RfZigiYnVzeS1jaGVjay1hbGwtJXMiLCBlLT5uYW1lKQorCQkJYnVzeV9jaGVj a19hbGwoZmQsIGUsIG51bV9lbmdpbmVzKTsKKworCQkvKioKKwkJICogVGVzdCB0aGF0IHdoZW4g YWxsIGV4Y2VwdCBvbmUgZW5naW5lIGFyZSBsb2FkZWQgYWxsIGxvYWRzCisJCSAqIGFyZSBjb3Jy ZWN0bHkgcmVwb3J0ZWQuCisJCSAqLworCQlpZ3Rfc3VidGVzdF9mKCJtb3N0LWJ1c3ktY2hlY2st YWxsLSVzIiwgZS0+bmFtZSkKKwkJCW1vc3RfYnVzeV9jaGVja19hbGwoZmQsIGUsIG51bV9lbmdp bmVzKTsKKworCQkvKioKKwkJICogVGVzdCB0aGF0IHNlbXBob3JlIGNvdW50ZXJzIHJlcG9ydCBu byBhY3Rpdml0eSBvbiBpZGxlCisJCSAqIG9yIGJ1c3kgZW5naW5lcy4KKwkJICovCisJCWlndF9z dWJ0ZXN0X2YoImlkbGUtbm8tc2VtYXBob3Jlcy0lcyIsIGUtPm5hbWUpCisJCQlub19zZW1hKGZk LCBlLCBmYWxzZSk7CisKKwkJaWd0X3N1YnRlc3RfZigiYnVzeS1uby1zZW1hcGhvcmVzLSVzIiwg ZS0+bmFtZSkKKwkJCW5vX3NlbWEoZmQsIGUsIHRydWUpOworCisJCS8qKgorCQkgKiBUZXN0IHRo YXQgc2VtYXBob3JlIHdhaXRzIGFyZSBjb3JyZWN0bHkgcmVwb3J0ZWQuCisJCSAqLworCQlpZ3Rf c3VidGVzdF9mKCJzZW1hcGhvcmUtd2FpdC0lcyIsIGUtPm5hbWUpCisJCQlzZW1hX3dhaXQoZmQs IGUpOworCisJCS8qKgorCQkgKiBUZXN0IHRoYXQgZXZlbnQgd2FpdHMgYXJlIGNvcnJlY3RseSBy ZXBvcnRlZC4KKwkJICovCisJCWlmIChlLT5jbGFzcyA9PSBJOTE1X0VOR0lORV9DTEFTU19SRU5E RVIpCisJCQlpZ3Rfc3VidGVzdF9mKCJldmVudC13YWl0LSVzIiwgZS0+bmFtZSkKKwkJCQlldmVu dF93YWl0KGZkLCBlKTsKKworCQkvKioKKwkJICogQ2hlY2sgdGhhdCB0d28gcGVyZiBjbGllbnRz IGRvIG5vdCBpbmZsdWVuY2UgZWFjaCBvdGhlcnMKKwkJICogb2JzZXJ2YXRpb25zLgorCQkgKi8K KwkJaWd0X3N1YnRlc3RfZigibXVsdGktY2xpZW50LSVzIiwgZS0+bmFtZSkKKwkJCW11bHRpX2Ns aWVudChmZCwgZSk7CisJfQorCisJLyoqCisJICogVGVzdCB0aGF0IHdoZW4gYWxsIGVuZ2luZXMg YXJlIGxvYWRlZCBhbGwgbG9hZHMgYXJlCisJICogY29ycmVjdGx5IHJlcG9ydGVkLgorCSAqLwor CWlndF9zdWJ0ZXN0KCJhbGwtYnVzeS1jaGVjay1hbGwiKQorCQlhbGxfYnVzeV9jaGVja19hbGwo ZmQsIG51bV9lbmdpbmVzKTsKKworCS8qKgorCSAqIFRlc3QgdGhhdCBub24tZW5naW5lIGNvdW50 ZXJzIGNhbiBiZSBpbml0aWFsaXplZCBhbmQgcmVhZC4gQXBhcnQKKwkgKiBmcm9tIHRoZSBpbnZh bGlkIG1ldHJpYyB3aGljaCBzaG91bGQgZmFpbC4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnVt X290aGVyX21ldHJpY3MgKyAxOyBpKyspIHsKKwkJaWd0X3N1YnRlc3RfZigib3RoZXItaW5pdC0l dSIsIGkpCisJCQlpbml0X290aGVyKGksIGkgPCBudW1fb3RoZXJfbWV0cmljcyk7CisKKwkJaWd0 X3N1YnRlc3RfZigib3RoZXItcmVhZC0ldSIsIGkpCisJCQlyZWFkX290aGVyKGksIGkgPCBudW1f b3RoZXJfbWV0cmljcyk7CisJfQorCisJLyoqCisJICogVGVzdCBjb3VudGVycyBhcmUgbm90IGFm ZmVjdGVkIGJ5IENQVSBvZmZsaW5lL29ubGluZSBldmVudHMuCisJICovCisJaWd0X3N1YnRlc3Qo ImNwdS1ob3RwbHVnIikKKwkJY3B1X2hvdHBsdWcoZmQpOworCisJLyoqCisJICogVGVzdCBHUFUg ZnJlcXVlbmN5LgorCSAqLworCWlndF9zdWJ0ZXN0KCJmcmVxdWVuY3kiKQorCQl0ZXN0X2ZyZXF1 ZW5jeShmZCk7CisKKwkvKioKKwkgKiBUZXN0IGludGVycnVwdCBjb3VudCByZXBvcnRpbmcuCisJ ICovCisJaWd0X3N1YnRlc3QoImludGVycnVwdHMiKQorCQl0ZXN0X2ludGVycnVwdHMoZmQpOwor CisJLyoqCisJICogVGVzdCBSQzYgcmVzaWRlbmN5IHJlcG9ydGluZy4KKwkgKi8KKwlpZ3Rfc3Vi dGVzdCgicmM2IikKKwkJdGVzdF9yYzYoZmQpOworCisJLyoqCisJICogVGVzdCBSQzZwIHJlc2lk ZW5jeSByZXBvcnRpbmcuCisJICovCisJaWd0X3N1YnRlc3QoInJjNnAiKQorCQl0ZXN0X3JjNnAo ZmQpOworCisJLyoqCisJICogQ2hlY2sgcmVuZGVyIG5vZGVzIGFyZSBjb3VudGVkLgorCSAqLwor CWlndF9zdWJ0ZXN0X2dyb3VwIHsKKwkJaW50IHJlbmRlcl9mZDsKKworCQlpZ3RfZml4dHVyZSB7 CisJCQlyZW5kZXJfZmQgPSBkcm1fb3Blbl9kcml2ZXJfcmVuZGVyKERSSVZFUl9JTlRFTCk7CisJ CQlpZ3RfcmVxdWlyZV9nZW0ocmVuZGVyX2ZkKTsKKworCQkJZ2VtX3F1aWVzY2VudF9ncHUoZmQp OworCQl9CisKKwkJZm9yX2VhY2hfZW5naW5lX2NsYXNzX2luc3RhbmNlKGZkLCBlKSB7CisJCQlp Z3Rfc3VidGVzdF9mKCJyZW5kZXItbm9kZS1idXN5LSVzIiwgZS0+bmFtZSkKKwkJCQlzaW5nbGUo ZmQsIGUsIHRydWUpOworCQl9CisKKwkJaWd0X2ZpeHR1cmUgeworCQkJY2xvc2UocmVuZGVyX2Zk KTsKKwkJfQorCX0KK30KLS0gCjIuOS41CgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fXwpJbnRlbC1nZnggbWFpbGluZyBsaXN0CkludGVsLWdmeEBsaXN0cy5m cmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0 aW5mby9pbnRlbC1nZngK