From mboxrd@z Thu Jan 1 00:00:00 1970 From: Dave Gordon Subject: [PATCH 10/15] drm/i915: Implementation of GuC client Date: Fri, 3 Jul 2015 13:30:32 +0100 Message-ID: <1435926637-30892-11-git-send-email-david.s.gordon@intel.com> References: <1435926637-30892-1-git-send-email-david.s.gordon@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) by gabe.freedesktop.org (Postfix) with ESMTP id EE1454A0A2 for ; Fri, 3 Jul 2015 05:31:06 -0700 (PDT) In-Reply-To: <1435926637-30892-1-git-send-email-david.s.gordon@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 QSBHdUMgY2xpZW50IGhhcyBpdHMgb3duIGRvb3JiZWxsIGFuZCB3b3JrcXVldWUuIEl0IG1haW50 YWlucyB0aGUKZG9vcmJlbGwgY2FjaGUgbGluZSwgcHJvY2VzcyBkZXNjcmlwdGlvbiBvYmplY3Qg YW5kIHdvcmsgcXVldWUgaXRlbS4KCkEgZGVmYXVsdCBndWNfY2xpZW50IGlzIGNyZWF0ZWQgZm9y IHRoZSBpOTE1IGRyaXZlciB0byB1c2UgZm9yCm5vcm1hbC1wcmlvcml0eSBpbi1vcmRlciBzdWJt aXNzaW9uLgoKTm90ZSB0aGF0IHRoZSBjcmVhdGVkIGNsaWVudCBpcyBub3QgeWV0IHJlYWR5IGZv ciB1c2U7IGRvb3JiZWxsCmFsbG9jYXRpb24gd2lsbCBmYWlsIGFzIHdlIGhhdmVuJ3QgeWV0IGxp bmtlZCB0aGUgR3VDJ3MgY29udGV4dApkZXNjcmlwdG9yIHRvIHRoZSBkZWZhdWx0IGNvbnRleHRz IGZvciBlYWNoIHJpbmcgKHNlZSBsYXRlciBwYXRjaCkuCkhvd2V2ZXIgdGhlIGRyaXZlciB3aWxs IHN0aWxsIGJlIHVzYWJsZSwgYXV0b21hdGljYWxseSBmYWxsaW5nCmJhY2sgdG8gZXhlY2xpc3Qg bW9kZS4KCnYyOgogICAgRGVmZXIgYWRkaW5nIHN0cnVjdHVyZSBtZW1iZXJzIHVudGlsIG5lZWRl ZCBbQ2hyaXMgV2lsc29uXQogICAgUmF0aW9uYWxpc2UgdHlwZSBkZWNsYXJhdGlvbnMgW0Nocmlz IFdpbHNvbl0KCklzc3VlOiBWSVotNDg4NApTaWduZWQtb2ZmLWJ5OiBBbGV4IERhaSA8eXUuZGFp QGludGVsLmNvbT4KU2lnbmVkLW9mZi1ieTogRGF2ZSBHb3Jkb24gPGRhdmlkLnMuZ29yZG9uQGlu dGVsLmNvbT4KLS0tCiBkcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2d1Y19zdWJtaXNzaW9uLmMg fCA2NjEgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKIGRyaXZlcnMvZ3B1L2RybS9pOTE1 L2ludGVsX2d1Yy5oICAgICAgICAgICB8ICA0MyArKwogZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50 ZWxfZ3VjX2xvYWRlci5jICAgIHwgIDEwICsKIDMgZmlsZXMgY2hhbmdlZCwgNzE0IGluc2VydGlv bnMoKykKCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2d1Y19zdWJtaXNz aW9uLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2d1Y19zdWJtaXNzaW9uLmMKaW5kZXgg ZTlkNDZkNi4uM2MyOGM4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9n dWNfc3VibWlzc2lvbi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ3VjX3N1Ym1p c3Npb24uYwpAQCAtMjcsNiArMjcsNTI0IEBACiAjaW5jbHVkZSAiaW50ZWxfZ3VjLmgiCiAKIC8q KgorICogRE9DOiBHdUMgQ2xpZW50CisgKgorICogaTkxNV9ndWNfY2xpZW50OgorICogV2UgdXNl IHRoZSB0ZXJtIGNsaWVudCB0byBhdm9pZCBjb25mdXNpb24gd2l0aCBjb250ZXh0cy4gQSBpOTE1 X2d1Y19jbGllbnQgaXMKKyAqIGVxdWl2YWxlbnQgdG8gR3VDIG9iamVjdCBndWNfY29udGV4dF9k ZXNjLiBUaGlzIGNvbnRleHQgZGVzY3JpcHRvciBpcworICogYWxsb2NhdGVkIGZyb20gYSBwb29s IG9mIDEwMjQgZW50cmllcy4gS2VybmVsIGRyaXZlciB3aWxsIGFsbG9jYXRlIGRvb3JiZWxsCisg KiBhbmQgd29ya3F1ZXVlIGZvciBpdC4gQWxzbyB0aGUgcHJvY2VzcyBkZXNjcmlwdG9yIChndWNf cHJvY2Vzc19kZXNjKSwgd2hpY2gKKyAqIGlzIG1hcHBlZCB0byBjbGllbnQgc3BhY2UuIFNvIHRo ZSBjbGllbnQgY2FuIHdyaXRlIFdvcmsgSXRlbSB0aGVuIHJpbmcgdGhlCisgKiBkb29yYmVsbC4K KyAqCisgKiBUbyBzaW1wbGlmeSB0aGUgaW1wbGVtZW50YXRpb24sIHdlIGFsbG9jYXRlIG9uZSBn ZW0gb2JqZWN0IHRoYXQgY29udGFpbnMgYWxsCisgKiBwYWdlcyBmb3IgZG9vcmJlbGwsIHByb2Nl c3MgZGVzY3JpcHRvciBhbmQgd29ya3F1ZXVlLgorICoKKyAqIFRoZSBTY3JhdGNoIHJlZ2lzdGVy czoKKyAqIFRoZXJlIGFyZSAxNiBNTUlPLWJhc2VkIHJlZ2lzdGVycyBzdGFydCBmcm9tIDB4QzE4 MC4gVGhlIGtlcm5lbCBkcml2ZXIgd3JpdGVzCisgKiBhIHZhbHVlIHRvIHRoZSBhY3Rpb24gcmVn aXN0ZXIgKFNPRlRfU0NSQVRDSF8wKSBhbG9uZyB3aXRoIGFueSBkYXRhLiBJdCB0aGVuCisgKiB0 cmlnZ2VycyBhbiBpbnRlcnJ1cHQgb24gdGhlIEd1QyB2aWEgYW5vdGhlciByZWdpc3RlciB3cml0 ZSAoMHhDNEM4KS4KKyAqIEZpcm13YXJlIHdyaXRlcyBhIHN1Y2Nlc3MvZmFpbCBjb2RlIGJhY2sg dG8gdGhlIGFjdGlvbiByZWdpc3RlciBhZnRlcgorICogcHJvY2Vzc2VzIHRoZSByZXF1ZXN0LiBU aGUga2VybmVsIGRyaXZlciBwb2xscyB3YWl0aW5nIGZvciB0aGlzIHVwZGF0ZSBhbmQKKyAqIHRo ZW4gcHJvY2VlZHMuCisgKiBTZWUgaG9zdDJndWNfYWN0aW9uKCkKKyAqCisgKiBEb29yYmVsbHM6 CisgKiBEb29yYmVsbHMgYXJlIGludGVycnVwdHMgdG8gdUtlcm5lbC4gQSBkb29yYmVsbCBpcyBh IHNpbmdsZSBjYWNoZSBsaW5lIChRVykKKyAqIG1hcHBlZCBpbnRvIHByb2Nlc3Mgc3BhY2UuCisg KgorICogV29yayBJdGVtczoKKyAqIFRoZXJlIGFyZSBzZXZlcmFsIHR5cGVzIG9mIHdvcmsgaXRl bXMgdGhhdCB0aGUgaG9zdCBtYXkgcGxhY2UgaW50byBhCisgKiB3b3JrcXVldWUsIGVhY2ggd2l0 aCBpdHMgb3duIHJlcXVpcmVtZW50cyBhbmQgbGltaXRhdGlvbnMuIEN1cnJlbnRseSBvbmx5Cisg KiBXUV9UWVBFX0lOT1JERVIgaXMgbmVlZGVkIHRvIHN1cHBvcnQgbGVnYWN5IHN1Ym1pc3Npb24g dmlhIEd1Qywgd2hpY2gKKyAqIHJlcHJlc2VudHMgaW4tb3JkZXIgcXVldWUuIFRoZSBrZXJuZWwg ZHJpdmVyIHBhY2tzIHJpbmcgdGFpbCBwb2ludGVyIGFuZCBhbgorICogRUxTUCBjb250ZXh0IGRl c2NyaXB0b3IgZHdvcmQgaW50byBXb3JrIEl0ZW0uCisgKiBTZWUgZ3VjX2FkZF93b3JrcXVldWVf aXRlbSgpCisgKgorICovCisKKy8qCisgKiBSZWFkIEd1QyBjb21tYW5kL3N0YXR1cyByZWdpc3Rl ciAoU09GVF9TQ1JBVENIXzApCisgKiBSZXR1cm4gdHJ1ZSBpZiBpdCBjb250YWlucyBhIHJlc3Bv bnNlIHJhdGhlciB0aGFuIGEgY29tbWFuZAorICovCitzdGF0aWMgaW5saW5lIGJvb2wgaG9zdDJn dWNfYWN0aW9uX3Jlc3BvbnNlKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwKKwkJ CQkJICAgIHUzMiAqc3RhdHVzKQoreworCXUzMiB2YWwgPSBJOTE1X1JFQUQoU09GVF9TQ1JBVENI KDApKTsKKwkqc3RhdHVzID0gdmFsOworCXJldHVybiBHVUMySE9TVF9JU19SRVNQT05TRSh2YWwp OworfQorCitzdGF0aWMgaW50IGhvc3QyZ3VjX2FjdGlvbihzdHJ1Y3QgaW50ZWxfZ3VjICpndWMs IHUzMiAqZGF0YSwgdTMyIGxlbikKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3By aXYgPSBndWNfdG9faTkxNShndWMpOworCXUzMiBzdGF0dXM7CisJaW50IGk7CisJaW50IHJldDsK KworCWlmIChXQVJOX09OKGxlbiA8IDEgfHwgbGVuID4gMTUpKQorCQlyZXR1cm4gLUVJTlZBTDsK KworCXNwaW5fbG9jaygmZGV2X3ByaXYtPmd1Yy5ob3N0Mmd1Y19sb2NrKTsKKworCWRldl9wcml2 LT5ndWMuYWN0aW9uX2NvdW50ICs9IDE7CisJZGV2X3ByaXYtPmd1Yy5hY3Rpb25fY21kID0gZGF0 YVswXTsKKworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKwkJSTkxNV9XUklURShTT0ZUX1ND UkFUQ0goaSksIGRhdGFbaV0pOworCisJUE9TVElOR19SRUFEKFNPRlRfU0NSQVRDSChpIC0gMSkp OworCisJSTkxNV9XUklURShIT1NUMkdVQ19JTlRFUlJVUFQsIEhPU1QyR1VDX1RSSUdHRVIpOwor CisJcmV0ID0gd2FpdF9mb3JfYXRvbWljKGhvc3QyZ3VjX2FjdGlvbl9yZXNwb25zZShkZXZfcHJp diwgJnN0YXR1cyksIDEwKTsKKwlpZiAoc3RhdHVzICE9IEdVQzJIT1NUX1NUQVRVU19TVUNDRVNT KSB7CisJCS8qIGVpdGhlciBHdUMgZG9lc24ndCByZXNwb25kLCB3aGljaCBpcyBhIFRJTUVPVVQs CisJCSAqIG9yIGEgZmFpbHVyZSBjb2RlIGlzIHJldHVybmVkLiAqLworCQlpZiAocmV0ICE9IC1F VElNRURPVVQpCisJCQlyZXQgPSAtRUlPOworCisJCURSTV9FUlJPUigiR1VDOiBob3N0Mmd1YyBh Y3Rpb24gMHglWCBmYWlsZWQuIHJldD0lZCAiCisJCQkJInN0YXR1cz0weCUwOFggcmVzcG9uc2U9 MHglMDhYXG4iLAorCQkJCWRhdGFbMF0sIHJldCwgc3RhdHVzLAorCQkJCUk5MTVfUkVBRChTT0ZU X1NDUkFUQ0goMTUpKSk7CisKKwkJZGV2X3ByaXYtPmd1Yy5hY3Rpb25fZmFpbCArPSAxOworCQlk ZXZfcHJpdi0+Z3VjLmFjdGlvbl9lcnIgPSByZXQ7CisJfQorCWRldl9wcml2LT5ndWMuYWN0aW9u X3N0YXR1cyA9IHN0YXR1czsKKworCXNwaW5fdW5sb2NrKCZkZXZfcHJpdi0+Z3VjLmhvc3QyZ3Vj X2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFRlbGwgdGhlIEd1QyB0byBhbGxv Y2F0ZSBvciBkZWFsbG9jYXRlIGEgc3BlY2lmaWMgZG9vcmJlbGwKKyAqLworCitzdGF0aWMgaW50 IGhvc3QyZ3VjX2FsbG9jYXRlX2Rvb3JiZWxsKHN0cnVjdCBpbnRlbF9ndWMgKmd1YywKKwkJCQkg ICAgICBzdHJ1Y3QgaTkxNV9ndWNfY2xpZW50ICpjbGllbnQpCit7CisJdTMyIGRhdGFbMl07CisK KwlkYXRhWzBdID0gSE9TVDJHVUNfQUNUSU9OX0FMTE9DQVRFX0RPT1JCRUxMOworCWRhdGFbMV0g PSBjbGllbnQtPmN0eF9pbmRleDsKKworCXJldHVybiBob3N0Mmd1Y19hY3Rpb24oZ3VjLCBkYXRh LCAyKTsKK30KKworc3RhdGljIGludCBob3N0Mmd1Y19yZWxlYXNlX2Rvb3JiZWxsKHN0cnVjdCBp bnRlbF9ndWMgKmd1YywKKwkJCQkgICAgIHN0cnVjdCBpOTE1X2d1Y19jbGllbnQgKmNsaWVudCkK K3sKKwl1MzIgZGF0YVsyXTsKKworCWRhdGFbMF0gPSBIT1NUMkdVQ19BQ1RJT05fREVBTExPQ0FU RV9ET09SQkVMTDsKKwlkYXRhWzFdID0gY2xpZW50LT5jdHhfaW5kZXg7CisKKwlyZXR1cm4gaG9z dDJndWNfYWN0aW9uKGd1YywgZGF0YSwgMik7Cit9CisKKy8qCisgKiBJbml0aWFsaXNlLCB1cGRh dGUsIG9yIGNsZWFyIGRvb3JiZWxsIGRhdGEgc2hhcmVkIHdpdGggdGhlIEd1QworICoKKyAqIFRo ZXNlIGZ1bmN0aW9ucyBtb2RpZnkgc2hhcmVkIGRhdGEgYW5kIHNvIG5lZWQgYWNjZXNzIHRvIHRo ZSBtYXBwZWQKKyAqIGNsaWVudCBvYmplY3Qgd2hpY2ggY29udGFpbnMgdGhlIHBhZ2UgYmVpbmcg dXNlZCBmb3IgdGhlIGRvb3JiZWxsCisgKi8KKworc3RhdGljIHZvaWQgZ3VjX2luaXRfZG9vcmJl bGwoc3RydWN0IGludGVsX2d1YyAqZ3VjLAorCQkJICAgICAgc3RydWN0IGk5MTVfZ3VjX2NsaWVu dCAqY2xpZW50KQoreworCXN0cnVjdCBndWNfZG9vcmJlbGxfaW5mbyAqZG9vcmJlbGw7CisJdm9p ZCAqYmFzZTsKKworCWJhc2UgPSBrbWFwX2F0b21pYyhpOTE1X2dlbV9vYmplY3RfZ2V0X3BhZ2Uo Y2xpZW50LT5jbGllbnRfb2JqLCAwKSk7CisJZG9vcmJlbGwgPSBiYXNlICsgY2xpZW50LT5kb29y YmVsbF9vZmZzZXQ7CisKKwlkb29yYmVsbC0+ZGJfc3RhdHVzID0gMTsKKwlkb29yYmVsbC0+Y29v a2llID0gMDsKKworCWt1bm1hcF9hdG9taWMoYmFzZSk7Cit9CisKK3N0YXRpYyBpbnQgZ3VjX3Jp bmdfZG9vcmJlbGwoc3RydWN0IGk5MTVfZ3VjX2NsaWVudCAqZ2MpCit7CisJc3RydWN0IGd1Y19w cm9jZXNzX2Rlc2MgKmRlc2M7CisJdW5pb24gZ3VjX2Rvb3JiZWxsX3F3IGRiX2NtcCwgZGJfZXhj LCBkYl9yZXQ7CisJdW5pb24gZ3VjX2Rvb3JiZWxsX3F3ICpkYjsKKwl2b2lkICpiYXNlOworCWlu dCBhdHRlbXB0ID0gMiwgcmV0ID0gLUVBR0FJTjsKKworCWJhc2UgPSBrbWFwX2F0b21pYyhpOTE1 X2dlbV9vYmplY3RfZ2V0X3BhZ2UoZ2MtPmNsaWVudF9vYmosIDApKTsKKwlkZXNjID0gYmFzZSAr IGdjLT5wcm9jX2Rlc2Nfb2Zmc2V0OworCisJLyogVXBkYXRlIHRoZSB0YWlsIHNvIGl0IGlzIHZp c2libGUgdG8gR3VDICovCisJZGVzYy0+dGFpbCA9IGdjLT53cV90YWlsOworCisJLyogY3VycmVu dCBjb29raWUgKi8KKwlkYl9jbXAuZGJfc3RhdHVzID0gR1VDX0RPT1JCRUxMX0VOQUJMRUQ7CisJ ZGJfY21wLmNvb2tpZSA9IGdjLT5jb29raWU7CisKKwkvKiBjb29raWUgdG8gYmUgdXBkYXRlZCAq LworCWRiX2V4Yy5kYl9zdGF0dXMgPSBHVUNfRE9PUkJFTExfRU5BQkxFRDsKKwlkYl9leGMuY29v a2llID0gZ2MtPmNvb2tpZSArIDE7CisJaWYgKGRiX2V4Yy5jb29raWUgPT0gMCkKKwkJZGJfZXhj LmNvb2tpZSA9IDE7CisKKwkvKiBwb2ludGVyIG9mIGN1cnJlbnQgZG9vcmJlbGwgY2FjaGVsaW5l ICovCisJZGIgPSBiYXNlICsgZ2MtPmRvb3JiZWxsX29mZnNldDsKKworCXdoaWxlIChhdHRlbXB0 LS0pIHsKKwkJLyogbGV0cyByaW5nIHRoZSBkb29yYmVsbCAqLworCQlkYl9yZXQudmFsdWVfcXcg PSBhdG9taWM2NF9jbXB4Y2hnKChhdG9taWM2NF90ICopZGIsCisJCQlkYl9jbXAudmFsdWVfcXcs IGRiX2V4Yy52YWx1ZV9xdyk7CisKKwkJLyogaWYgdGhlIGV4Y2hhbmdlIHdhcyBzdWNjZXNzZnVs bHkgZXhlY3V0ZWQgKi8KKwkJaWYgKGRiX3JldC52YWx1ZV9xdyA9PSBkYl9jbXAudmFsdWVfcXcp IHsKKwkJCS8qIGRiIHdhcyBzdWNjZXNzZnVsbHkgcnVuZyAqLworCQkJZ2MtPmNvb2tpZSA9IGRi X2V4Yy5jb29raWU7CisJCQlyZXQgPSAwOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBYWFg6IGRv b3JiZWxsIHdhcyBsb3N0IGFuZCBuZWVkIHRvIGFjcXVpcmUgaXQgYWdhaW4gKi8KKwkJaWYgKGRi X3JldC5kYl9zdGF0dXMgPT0gR1VDX0RPT1JCRUxMX0RJU0FCTEVEKQorCQkJYnJlYWs7CisKKwkJ RFJNX0VSUk9SKCJDb29raWUgbWlzbWF0Y2guIEV4cGVjdGVkICVkLCByZXR1cm5lZCAlZFxuIiwK KwkJCSAgZGJfY21wLmNvb2tpZSwgZGJfcmV0LmNvb2tpZSk7CisKKwkJLyogdXBkYXRlIHRoZSBj b29raWUgdG8gbmV3bHkgcmVhZCBjb29raWUgZnJvbSBHdUMgKi8KKwkJZGJfY21wLmNvb2tpZSA9 IGRiX3JldC5jb29raWU7CisJCWRiX2V4Yy5jb29raWUgPSBkYl9yZXQuY29va2llICsgMTsKKwkJ aWYgKGRiX2V4Yy5jb29raWUgPT0gMCkKKwkJCWRiX2V4Yy5jb29raWUgPSAxOworCX0KKworCWt1 bm1hcF9hdG9taWMoYmFzZSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgZ3VjX2Rp c2FibGVfZG9vcmJlbGwoc3RydWN0IGludGVsX2d1YyAqZ3VjLAorCQkJCSBzdHJ1Y3QgaTkxNV9n dWNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2 ID0gZ3VjX3RvX2k5MTUoZ3VjKTsKKwlzdHJ1Y3QgZ3VjX2Rvb3JiZWxsX2luZm8gKmRvb3JiZWxs OworCXZvaWQgKmJhc2U7CisJaW50IGRyYnJlZyA9IEdFTjhfRFJCUkVHTChjbGllbnQtPmRvb3Ji ZWxsX2lkKTsKKwlpbnQgdmFsdWU7CisKKwliYXNlID0ga21hcF9hdG9taWMoaTkxNV9nZW1fb2Jq ZWN0X2dldF9wYWdlKGNsaWVudC0+Y2xpZW50X29iaiwgMCkpOworCWRvb3JiZWxsID0gYmFzZSAr IGNsaWVudC0+ZG9vcmJlbGxfb2Zmc2V0OworCisJZG9vcmJlbGwtPmRiX3N0YXR1cyA9IDA7CisK KwlrdW5tYXBfYXRvbWljKGJhc2UpOworCisJSTkxNV9XUklURShkcmJyZWcsIEk5MTVfUkVBRChk cmJyZWcpICYgfkdFTjhfRFJCX1ZBTElEKTsKKworCXZhbHVlID0gSTkxNV9SRUFEKGRyYnJlZyk7 CisJV0FSTl9PTigodmFsdWUgJiBHRU44X0RSQl9WQUxJRCkgIT0gMCk7CisKKwlJOTE1X1dSSVRF KEdFTjhfRFJCUkVHVShjbGllbnQtPmRvb3JiZWxsX2lkKSwgMCk7CisJSTkxNV9XUklURShkcmJy ZWcsIDApOworCisJLyogWFhYOiB3YWl0IGZvciBhbnkgaW50ZXJydXB0cyAqLworCS8qIFhYWDog d2FpdCBmb3Igd29ya3F1ZXVlIHRvIGRyYWluICovCit9CisKKy8qCisgKiBTZWxlY3QsIGFzc2ln biBhbmQgcmVsYXNlIGRvb3JiZWxsIGNhY2hlbGluZXMKKyAqCisgKiBUaGVzZSBmdW5jdGlvbnMg dHJhY2sgd2hpY2ggZG9vcmJlbGwgY2FjaGVsaW5lcyBhcmUgaW4gdXNlLgorICogVGhlIGRhdGEg dGhleSBtYW5pcHVsYXRlIGlzIHByb3RlY3RlZCBieSB0aGUgaG9zdDJndWMgbG9jay4KKyAqLwor CitzdGF0aWMgdWludDMyX3Qgc2VsZWN0X2Rvb3JiZWxsX2NhY2hlbGluZShzdHJ1Y3QgaW50ZWxf Z3VjICpndWMpCit7CisJY29uc3QgdWludDMyX3QgY2FjaGVsaW5lX3NpemUgPSBib290X2NwdV9k YXRhLng4Nl9jbGZsdXNoX3NpemU7CisJdWludDMyX3Qgb2Zmc2V0OworCisJc3Bpbl9sb2NrKCZn dWMtPmhvc3QyZ3VjX2xvY2spOworCisJLyogRG9vcmJlbGwgdXNlcyBhIHNpbmdsZSBjYWNoZSBs aW5lIHdpdGhpbiBhIHBhZ2UgKi8KKwlvZmZzZXQgPSBndWMtPmRiX2NhY2hlbGluZSAmIFBBR0Vf TUFTSzsKKworCS8qIE1vdmluZyB0byBuZXh0IGNhY2hlIGxpbmUgdG8gcmVkdWNlIGNvbnRlbnRp b24gKi8KKwlndWMtPmRiX2NhY2hlbGluZSArPSBjYWNoZWxpbmVfc2l6ZTsKKworCXNwaW5fdW5s b2NrKCZndWMtPmhvc3QyZ3VjX2xvY2spOworCisJcmV0dXJuIG9mZnNldDsKK30KKworc3RhdGlj IHVpbnQxNl90IGFzc2lnbl9kb29yYmVsbChzdHJ1Y3QgaW50ZWxfZ3VjICpndWMsIHVpbnQzMl90 IHByaW9yaXR5KQoreworCS8qIFRoZSBiaXRtYXAgaXMgc3BsaXQgaW50byB0d28gaGFsdmVzIC0g aGlnaCBhbmQgbm9ybWFsIHByaW9yaXR5LiAqLworCWNvbnN0IHVpbnQxNl90IGhhbGYgPSBHVUNf TUFYX0RPT1JCRUxMUyAvIDI7CisJY29uc3QgdWludDE2X3Qgc3RhcnQgPSAocHJpb3JpdHkgPD0g R1VDX0NUWF9QUklPUklUWV9ISUdIKSA/IGhhbGYgOiAwOworCWNvbnN0IHVpbnQxNl90IGVuZCA9 IHN0YXJ0ICsgaGFsZjsKKwl1aW50MTZfdCBpZDsKKworCXNwaW5fbG9jaygmZ3VjLT5ob3N0Mmd1 Y19sb2NrKTsKKwlpZCA9IGZpbmRfbmV4dF96ZXJvX2JpdChndWMtPmRvb3JiZWxsX2JpdG1hcCwg ZW5kLCBzdGFydCk7CisJaWYgKGlkID09IGVuZCkKKwkJaWQgPSBHVUNfSU5WQUxJRF9ET09SQkVM TF9JRDsKKwllbHNlCisJCWJpdG1hcF9zZXQoZ3VjLT5kb29yYmVsbF9iaXRtYXAsIGlkLCAxKTsK KwlzcGluX3VubG9jaygmZ3VjLT5ob3N0Mmd1Y19sb2NrKTsKKworCXJldHVybiBpZDsKK30KKwor c3RhdGljIHZvaWQgcmVsZWFzZV9kb29yYmVsbChzdHJ1Y3QgaW50ZWxfZ3VjICpndWMsIHVpbnQx Nl90IGlkKQoreworCXNwaW5fbG9jaygmZ3VjLT5ob3N0Mmd1Y19sb2NrKTsKKwliaXRtYXBfY2xl YXIoZ3VjLT5kb29yYmVsbF9iaXRtYXAsIGlkLCAxKTsKKwlzcGluX3VubG9jaygmZ3VjLT5ob3N0 Mmd1Y19sb2NrKTsKK30KKworLyoKKyAqIEluaXRpYWxpc2UgdGhlIHByb2Nlc3MgZGVzY3JpcHRv ciBzaGFyZWQgd2l0aCB0aGUgR3VDIGZpcm13YXJlLgorICovCitzdGF0aWMgdm9pZCBndWNfaW5p dF9wcm9jX2Rlc2Moc3RydWN0IGludGVsX2d1YyAqZ3VjLAorCQkJICAgICAgIHN0cnVjdCBpOTE1 X2d1Y19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgZ3VjX3Byb2Nlc3NfZGVzYyAqZGVzYzsK Kwl2b2lkICpiYXNlOworCisJYmFzZSA9IGttYXBfYXRvbWljKGk5MTVfZ2VtX29iamVjdF9nZXRf cGFnZShjbGllbnQtPmNsaWVudF9vYmosIDApKTsKKwlkZXNjID0gYmFzZSArIGNsaWVudC0+cHJv Y19kZXNjX29mZnNldDsKKworCW1lbXNldChkZXNjLCAwLCBzaXplb2YoKmRlc2MpKTsKKworCS8q CisJICogWFhYOiBwRG9vcmJlbGwgYW5kIFdRVkJhc2VBZGRyZXNzIGFyZSBwb2ludGVycyBpbiBw cm9jZXNzIGFkZHJlc3MKKwkgKiBzcGFjZSBmb3IgcmluZzMgY2xpZW50cyAoc2V0IHRoZW0gYXMg aW4gbW1hcF9pb2N0bCkgb3Iga2VybmVsCisJICogc3BhY2UgZm9yIGtlcm5lbCBjbGllbnRzICht YXAgb24gZGVtYW5kIGluc3RlYWQ/IE1heSBtYWtlIGRlYnVnCisJICogZWFzaWVyIHRvIGhhdmUg aXQgbWFwcGVkKS4KKwkgKi8KKwlkZXNjLT53cV9iYXNlX2FkZHIgPSAwOworCWRlc2MtPmRiX2Jh c2VfYWRkciA9IDA7CisKKwlkZXNjLT5jb250ZXh0X2lkID0gY2xpZW50LT5jdHhfaW5kZXg7CisJ ZGVzYy0+d3Ffc2l6ZV9ieXRlcyA9IGNsaWVudC0+d3Ffc2l6ZTsKKwlkZXNjLT53cV9zdGF0dXMg PSBXUV9TVEFUVVNfQUNUSVZFOworCWRlc2MtPnByaW9yaXR5ID0gY2xpZW50LT5wcmlvcml0eTsK KworCWt1bm1hcF9hdG9taWMoYmFzZSk7Cit9CisKKy8qCisgKiBJbml0aWFsaXNlL2NsZWFyIHRo ZSBjb250ZXh0IGRlc2NyaXB0b3Igc2hhcmVkIHdpdGggdGhlIEd1QyBmaXJtd2FyZS4KKyAqCisg KiBUaGlzIGRlc2NyaXB0b3IgdGVsbHMgdGhlIEd1QyB3aGVyZSAoaW4gR0dUVCBzcGFjZSkgdG8g ZmluZCB0aGUgaW1wb3J0YW50CisgKiBkYXRhIHN0cnVjdHVyZXMgcmVsYXRpbmcgdG8gdGhpcyBj bGllbnQgKGRvb3JiZWxsLCBwcm9jZXNzIGRlc2NyaXB0b3IsCisgKiB3cml0ZSBxdWV1ZSwgZXRj KS4KKyAqLworCitzdGF0aWMgdm9pZCBndWNfaW5pdF9jdHhfZGVzYyhzdHJ1Y3QgaW50ZWxfZ3Vj ICpndWMsCisJCQkgICAgICBzdHJ1Y3QgaTkxNV9ndWNfY2xpZW50ICpjbGllbnQpCit7CisJc3Ry dWN0IGd1Y19jb250ZXh0X2Rlc2MgZGVzYzsKKwlzdHJ1Y3Qgc2dfdGFibGUgKnNnOworCisJbWVt c2V0KCZkZXNjLCAwLCBzaXplb2YoZGVzYykpOworCisJZGVzYy5hdHRyaWJ1dGUgPSBHVUNfQ1RY X0RFU0NfQVRUUl9BQ1RJVkUgfCBHVUNfQ1RYX0RFU0NfQVRUUl9LRVJORUw7CisJZGVzYy5jb250 ZXh0X2lkID0gY2xpZW50LT5jdHhfaW5kZXg7CisJZGVzYy5wcmlvcml0eSA9IGNsaWVudC0+cHJp b3JpdHk7CisJZGVzYy5lbmdpbmVzX3VzZWQgPSAoMSA8PCBSQ1MpIHwgKDEgPDwgVkNTKSB8ICgx IDw8IEJDUykgfAorCQkJICAgICgxIDw8IFZFQ1MpIHwgKDEgPDwgVkNTMik7IC8qIGFsbCBlbmdp bmVzICovCisJZGVzYy5kYl9pZCA9IGNsaWVudC0+ZG9vcmJlbGxfaWQ7CisKKwkvKgorCSAqIFRo ZSBDUFUgYWRkcmVzcyBpcyBvbmx5IG5lZWRlZCBhdCBjZXJ0YWluIHBvaW50cywgc28ga21hcF9h dG9taWMgb24KKwkgKiBkZW1hbmQgaW5zdGVhZCBvZiBzdG9yaW5nIGl0IGluIHRoZSBjdHggZGVz Y3JpcHRvci4KKwkgKiBYWFg6IE1heSBtYWtlIGRlYnVnIGVhc2llciB0byBoYXZlIGl0IG1hcHBl ZAorCSAqLworCWRlc2MuZGJfdHJpZ2dlcl9jcHUgPSAwOworCWRlc2MuZGJfdHJpZ2dlcl91ayA9 IGNsaWVudC0+ZG9vcmJlbGxfb2Zmc2V0ICsKKwkJaTkxNV9nZW1fb2JqX2dndHRfb2Zmc2V0KGNs aWVudC0+Y2xpZW50X29iaik7CisJZGVzYy5kYl90cmlnZ2VyX3BoeSA9IGNsaWVudC0+ZG9vcmJl bGxfb2Zmc2V0ICsKKwkJc2dfZG1hX2FkZHJlc3MoY2xpZW50LT5jbGllbnRfb2JqLT5wYWdlcy0+ c2dsKTsKKworCWRlc2MucHJvY2Vzc19kZXNjID0gY2xpZW50LT5wcm9jX2Rlc2Nfb2Zmc2V0ICsK KwkJaTkxNV9nZW1fb2JqX2dndHRfb2Zmc2V0KGNsaWVudC0+Y2xpZW50X29iaik7CisKKwlkZXNj LndxX2FkZHIgPSBjbGllbnQtPndxX29mZnNldCArCisJCWk5MTVfZ2VtX29ial9nZ3R0X29mZnNl dChjbGllbnQtPmNsaWVudF9vYmopOworCisJZGVzYy53cV9zaXplID0gY2xpZW50LT53cV9zaXpl OworCisJLyoKKwkgKiBYWFg6IFRha2UgTFJDcyBmcm9tIGFuIGV4aXN0aW5nIGludGVsX2NvbnRl eHQgaWYgdGhpcyBpcyBub3QgYW4KKwkgKiBJc0tNRENyZWF0ZWRDb250ZXh0IGNsaWVudAorCSAq LworCWRlc2MuZGVzY19wcml2YXRlID0gKHVpbnRwdHJfdCljbGllbnQ7CisKKwkvKiBQb29sIGNv bnRleHQgaXMgcGlubmVkIGFscmVhZHkgKi8KKwlzZyA9IGd1Yy0+Y3R4X3Bvb2xfb2JqLT5wYWdl czsKKwlzZ19wY29weV9mcm9tX2J1ZmZlcihzZy0+c2dsLCBzZy0+bmVudHMsICZkZXNjLCBzaXpl b2YoZGVzYyksCisJCQkgICAgIHNpemVvZihkZXNjKSAqIGNsaWVudC0+Y3R4X2luZGV4KTsKK30K Kworc3RhdGljIHZvaWQgZ3VjX2ZpbmlfY3R4X2Rlc2Moc3RydWN0IGludGVsX2d1YyAqZ3VjLAor CQkJICAgICAgc3RydWN0IGk5MTVfZ3VjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBndWNf Y29udGV4dF9kZXNjIGRlc2M7CisJc3RydWN0IHNnX3RhYmxlICpzZzsKKworCW1lbXNldCgmZGVz YywgMCwgc2l6ZW9mKGRlc2MpKTsKKworCXNnID0gZ3VjLT5jdHhfcG9vbF9vYmotPnBhZ2VzOwor CXNnX3Bjb3B5X2Zyb21fYnVmZmVyKHNnLT5zZ2wsIHNnLT5uZW50cywgJmRlc2MsIHNpemVvZihk ZXNjKSwKKwkJCSAgICAgc2l6ZW9mKGRlc2MpICogY2xpZW50LT5jdHhfaW5kZXgpOworfQorCisv KiBHZXQgdmFsaWQgd29ya3F1ZXVlIGl0ZW0gYW5kIHJldHVybiBpdCBiYWNrIHRvIG9mZnNldCAq Lworc3RhdGljIGludCBndWNfZ2V0X3dvcmtxdWV1ZV9zcGFjZShzdHJ1Y3QgaTkxNV9ndWNfY2xp ZW50ICpnYywgdTMyICpvZmZzZXQpCit7CisJc3RydWN0IGd1Y19wcm9jZXNzX2Rlc2MgKmRlc2M7 CisJdm9pZCAqYmFzZTsKKwl1MzIgc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZ3VjX3dxX2l0ZW0pOwor CWludCByZXQgPSAwLCB0aW1lb3V0X2NvdW50ZXIgPSAyMDA7CisJdW5zaWduZWQgbG9uZyBmbGFn czsKKworCWJhc2UgPSBrbWFwX2F0b21pYyhpOTE1X2dlbV9vYmplY3RfZ2V0X3BhZ2UoZ2MtPmNs aWVudF9vYmosIDApKTsKKwlkZXNjID0gYmFzZSArIGdjLT5wcm9jX2Rlc2Nfb2Zmc2V0OworCisJ d2hpbGUgKHRpbWVvdXRfY291bnRlci0tID4gMCkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZ2Mt PndxX2xvY2ssIGZsYWdzKTsKKworCQlyZXQgPSB3YWl0X2Zvcl9hdG9taWMoQ0lSQ19TUEFDRShn Yy0+d3FfdGFpbCwgZGVzYy0+aGVhZCwKKwkJCQlnYy0+d3Ffc2l6ZSkgPj0gc2l6ZSwgMSk7CisK KwkJaWYgKCFyZXQpIHsKKwkJCSpvZmZzZXQgPSBnYy0+d3FfdGFpbDsKKworCQkJLyogYWR2YW5j ZSB0aGUgdGFpbCBmb3IgbmV4dCB3b3JrcXVldWUgaXRlbSAqLworCQkJZ2MtPndxX3RhaWwgKz0g c2l6ZTsKKwkJCWdjLT53cV90YWlsICY9IGdjLT53cV9zaXplIC0gMTsKKworCQkJLyogdGhpcyB3 aWxsIGJyZWFrIHRoZSBsb29wICovCisJCQl0aW1lb3V0X2NvdW50ZXIgPSAwOworCQl9CisKKwkJ c3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ2MtPndxX2xvY2ssIGZsYWdzKTsKKwl9OworCisJa3Vu bWFwX2F0b21pYyhiYXNlKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZ3VjX2Fk ZF93b3JrcXVldWVfaXRlbShzdHJ1Y3QgaTkxNV9ndWNfY2xpZW50ICpnYywKKwkJCQkgIHN0cnVj dCBpbnRlbF9jb250ZXh0ICpjdHgsCisJCQkJICBzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5n KQoreworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpjdHhfb2JqID0gY3R4LT5lbmdpbmVb cmluZy0+aWRdLnN0YXRlOworCXN0cnVjdCBpbnRlbF9yaW5nYnVmZmVyICpyaW5nYnVmID0gY3R4 LT5lbmdpbmVbcmluZy0+aWRdLnJpbmdidWY7CisJc3RydWN0IGd1Y193cV9pdGVtICp3cWk7CisJ dm9pZCAqYmFzZTsKKwl1MzIgdGFpbCwgd3FfbGVuLCB3cV9vZmYgPSAwOworCWludCByZXQ7CisK KwlyZXQgPSBndWNfZ2V0X3dvcmtxdWV1ZV9zcGFjZShnYywgJndxX29mZik7CisJaWYgKHJldCkK KwkJcmV0dXJuIHJldDsKKworCS8qIEZvciBub3cgd29ya3F1ZXVlIGl0ZW0gaXMgNCBEV3M7IHdv cmtxdWV1ZSBidWZmZXIgaXMgMiBwYWdlcy4gU28gd2UKKwkgKiBzaG91bGQgbm90IGhhdmUgdGhl IGNhc2Ugd2hlcmUgc3RydWN0dXJlIHdxaSBpcyBhY3Jvc3MgcGFnZSwgbmVpdGhlcgorCSAqIHdy YXBwZWQgdG8gdGhlIGJlZ2lubmluZy4gVGhpcyBzaW1wbGlmaWVzIHRoZSBpbXBsZW1lbnRhdGlv biBiZWxvdy4KKwkgKgorCSAqIFhYWDogaWYgbm90IHRoZSBjYXNlLCB3ZSBuZWVkIHNhdmUgZGF0 YSB0byBhIHRlbXAgd3FpIGFuZCBjb3B5IGl0IHRvCisJICogd29ya3F1ZXVlIGJ1ZmZlciBkdyBi eSBkdy4KKwkgKi8KKwlXQVJOX09OKHNpemVvZihzdHJ1Y3QgZ3VjX3dxX2l0ZW0pICE9IDE2KTsK KwlXQVJOX09OKHdxX29mZiAmIDMpOworCisJLyogd3Egc3RhcnRzIGZyb20gdGhlIHBhZ2UgYWZ0 ZXIgZG9vcmJlbGwgLyBwcm9jZXNzX2Rlc2MgKi8KKwliYXNlID0ga21hcF9hdG9taWMoaTkxNV9n ZW1fb2JqZWN0X2dldF9wYWdlKGdjLT5jbGllbnRfb2JqLAorCQkJKHdxX29mZiArIEdVQ19EQl9T SVpFKSA+PiBQQUdFX1NISUZUKSk7CisJd3Ffb2ZmICY9IFBBR0VfU0laRSAtIDE7CisJd3FpID0g KHN0cnVjdCBndWNfd3FfaXRlbSAqKSgoY2hhciAqKWJhc2UgKyB3cV9vZmYpOworCisJLyogbGVu IGRvZXMgbm90IGluY2x1ZGUgdGhlIGhlYWRlciAqLworCXdxX2xlbiA9IHNpemVvZihzdHJ1Y3Qg Z3VjX3dxX2l0ZW0pIC8gc2l6ZW9mKHUzMikgLSAxOworCXdxaS0+aGVhZGVyID0gV1FfVFlQRV9J Tk9SREVSIHwKKwkJCSh3cV9sZW4gPDwgV1FfTEVOX1NISUZUKSB8CisJCQkocmluZy0+aWQgPDwg V1FfVEFSR0VUX1NISUZUKSB8CisJCQlXUV9OT19XQ0ZMVVNIX1dBSVQ7CisKKwkvKiBUaGUgR3VD IHdhbnRzIG9ubHkgdGhlIGxvdy1vcmRlciB3b3JkIG9mIHRoZSBjb250ZXh0IGRlc2NyaXB0b3Ig Ki8KKwl3cWktPmNvbnRleHRfZGVzYyA9ICh1MzIpaW50ZWxfbHJfY29udGV4dF9kZXNjcmlwdG9y KHJpbmcsIGN0eF9vYmopOworCisJLyogVGhlIEd1QyBmaXJtd2FyZSB3YW50cyB0aGUgdGFpbCBp bmRleCBpbiBRV29yZHMsIG5vdCBieXRlcyAqLworCXRhaWwgPSByaW5nYnVmLT50YWlsID4+IDM7 CisJd3FpLT5yaW5nX3RhaWwgPSB0YWlsIDw8IFdRX1JJTkdfVEFJTF9TSElGVDsKKwl3cWktPmZl bmNlX2lkID0gMDsgLypYWFg6IHdoYXQgZmVuY2UgdG8gYmUgaGVyZSAqLworCisJa3VubWFwX2F0 b21pYyhiYXNlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB1cGRhdGVfY29udGV4 dF9pbWFnZShzdHJ1Y3QgaW50ZWxfY29udGV4dCAqY3R4LAorCQkJCSBzdHJ1Y3QgaW50ZWxfZW5n aW5lX2NzICpyaW5nKQoreworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpjdHhfb2JqID0g Y3R4LT5lbmdpbmVbcmluZy0+aWRdLnN0YXRlOworCXN0cnVjdCBpbnRlbF9yaW5nYnVmZmVyICpy aW5nYnVmID0gY3R4LT5lbmdpbmVbcmluZy0+aWRdLnJpbmdidWY7CisKKwlpbnRlbF9scl9jb250 ZXh0X3VwZGF0ZShjdHhfb2JqLCByaW5nYnVmLT5vYmosIH4wdSk7Cit9CisKKy8qKgorICogaTkx NV9ndWNfc3VibWl0KCkgLSBTdWJtaXQgY29tbWFuZHMgdGhyb3VnaCBHdUMKKyAqIEBjbGllbnQ6 CXRoZSBndWMgY2xpZW50IHdoZXJlIGNvbW1hbmRzIHdpbGwgZ28gdGhyb3VnaAorICogQGN0eDoJ TFJDIHdoZXJlIGNvbW1hbmRzIGNvbWUgZnJvbQorICogQHJpbmc6CUhXIGVuZ2luZSB0aGF0IHdp bGwgZXhjdXRlIHRoZSBjb21tYW5kcworICoKKyAqIFJldHVybjoJMCBpZiBzdWNjZWVkCisgKi8K K2ludCBpOTE1X2d1Y19zdWJtaXQoc3RydWN0IGk5MTVfZ3VjX2NsaWVudCAqY2xpZW50LAorCQkg ICAgc3RydWN0IGludGVsX2NvbnRleHQgKmN0eCwKKwkJICAgIHN0cnVjdCBpbnRlbF9lbmdpbmVf Y3MgKnJpbmcpCit7CisJaW50IHFfcmV0LCBiX3JldDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwor CisJLyogTmVlZCB0aGlzIGJlY2F1c2Ugb2YgdGhlIGRlZmVycmVkIHBpbiBjdHggYW5kIHJpbmcg Ki8KKwkvKiBTaGFsbCB3ZSBtb3ZlIHRoaXMgcmlnaHQgYWZ0ZXIgcmluZyBpcyBwaW5uZWQ/ICov CisJdXBkYXRlX2NvbnRleHRfaW1hZ2UoY3R4LCByaW5nKTsKKworCXFfcmV0ID0gZ3VjX2FkZF93 b3JrcXVldWVfaXRlbShjbGllbnQsIGN0eCwgcmluZyk7CisJaWYgKHFfcmV0ID09IDApCisJCWJf cmV0ID0gZ3VjX3JpbmdfZG9vcmJlbGwoY2xpZW50KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZj bGllbnQtPndxX2xvY2ssIGZsYWdzKTsKKwljbGllbnQtPnN1Ym1pc3Npb25zICs9IDE7CisJaWYg KHFfcmV0KSB7CisJCWNsaWVudC0+cV9mYWlsICs9IDE7CisJCWNsaWVudC0+cmV0Y29kZSA9IHFf cmV0OworCX0gZWxzZSBpZiAoYl9yZXQpIHsKKwkJY2xpZW50LT5iX2ZhaWwgKz0gMTsKKwkJY2xp ZW50LT5yZXRjb2RlID0gcV9yZXQgPSBiX3JldDsKKwl9IGVsc2UgeworCQljbGllbnQtPnJldGNv ZGUgPSAwOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbGllbnQtPndxX2xvY2ssIGZs YWdzKTsKKworCXJldHVybiBxX3JldDsKK30KKworLyoKKyAqIEV2ZXJ5dGhpbmcgYmVsb3cgaGVy ZSBpcyBjb25jZXJuZWQgd2l0aCBzZXR1cCAmIHRlYXJkb3duLCBhbmQgaXMKKyAqIHRoZXJlZm9y ZSBub3QgcGFydCBvZiB0aGUgc29tZXdoYXQgdGltZS1jcml0aWNhbCBiYXRjaC1zdWJtaXNzaW9u CisgKiBwYXRoIG9mIGk5MTVfZ3VjX3N1Ym1pdCgpIGFib3ZlLgorICovCisKKy8qKgogICogZ2Vt X2FsbG9jYXRlX2d1Y19vYmooKSAtIEFsbG9jYXRlIGdlbSBvYmplY3QgZm9yIEd1QyB1c2FnZQog ICogQGRldjoJZHJtIGRldmljZQogICogQHNpemU6CXNpemUgb2Ygb2JqZWN0CkBAIC03NSw2ICs1 OTMsMTIxIEBAIHN0YXRpYyB2b2lkIGdlbV9yZWxlYXNlX2d1Y19vYmooc3RydWN0IGRybV9pOTE1 X2dlbV9vYmplY3QgKm9iaikKIAlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZSgmb2JqLT5iYXNl KTsKIH0KIAorc3RhdGljIHZvaWQgZ3VjX2NsaWVudF9mcmVlKHN0cnVjdCBkcm1fZGV2aWNlICpk ZXYsCisJCQkgICAgc3RydWN0IGk5MTVfZ3VjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBk cm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGlu dGVsX2d1YyAqZ3VjID0gJmRldl9wcml2LT5ndWM7CisKKwlpZiAoIWNsaWVudCkKKwkJcmV0dXJu OworCisJaWYgKGNsaWVudC0+ZG9vcmJlbGxfaWQgIT0gR1VDX0lOVkFMSURfRE9PUkJFTExfSUQp IHsKKwkJLyoKKwkJICogRmlyc3QgZGlzYWJsZSB0aGUgZG9vcmJlbGwsIHRoZW4gdGVsbCB0aGUg R3VDIHdlJ3ZlCisJCSAqIGZpbmlzaGVkIHdpdGggaXQsIGZpbmFsbHkgZGVhbGxvY2F0ZSBpdCBp biBvdXIgYml0bWFwCisJCSAqLworCQlndWNfZGlzYWJsZV9kb29yYmVsbChndWMsIGNsaWVudCk7 CisJCWhvc3QyZ3VjX3JlbGVhc2VfZG9vcmJlbGwoZ3VjLCBjbGllbnQpOworCQlyZWxlYXNlX2Rv b3JiZWxsKGd1YywgY2xpZW50LT5kb29yYmVsbF9pZCk7CisJfQorCisJLyoKKwkgKiBYWFg6IHdh aXQgZm9yIGFueSBvdXRzdGFuZGluZyBzdWJtaXNzaW9ucyBiZWZvcmUgZnJlZWluZyBtZW1vcnku CisJICogQmUgc3VyZSB0byBkcm9wIGFueSBsb2NrcworCSAqLworCisJZ2VtX3JlbGVhc2VfZ3Vj X29iaihjbGllbnQtPmNsaWVudF9vYmopOworCisJaWYgKGNsaWVudC0+Y3R4X2luZGV4ICE9IEdV Q19JTlZBTElEX0NUWF9JRCkgeworCQlndWNfZmluaV9jdHhfZGVzYyhndWMsIGNsaWVudCk7CisJ CWlkYV9zaW1wbGVfcmVtb3ZlKCZndWMtPmN0eF9pZHMsIGNsaWVudC0+Y3R4X2luZGV4KTsKKwl9 CisKKwlrZnJlZShjbGllbnQpOworfQorCisvKioKKyAqIGd1Y19jbGllbnRfYWxsb2MoKSAtIEFs bG9jYXRlIGFuIGk5MTVfZ3VjX2NsaWVudAorICogQGRldjoJZHJtIGRldmljZQorICogQHByaW9y aXR5Oglmb3VyIGxldmVscyBwcmlvcml0eSBfQ1JJVElDQUwsIF9ISUdILCBfTk9STUFMIGFuZCBf TE9XCisgKiAJCVRoZSBrZXJuZWwgY2xpZW50IHRvIHJlcGxhY2UgRXhlY0xpc3Qgc3VibWlzc2lv biBpcyBjcmVhdGVkIHdpdGgKKyAqIAkJTk9STUFMIHByaW9yaXR5LiBQcmlvcml0eSBvZiBhIGNs aWVudCBmb3Igc2NoZWR1bGVyIGNhbiBiZSBISUdILAorICogCQl3aGlsZSBhIHByZWVtcHRpb24g Y29udGV4dCBjYW4gdXNlIENSSVRJQ0FMLgorICoKKyAqIFJldHVybjoJQW4gaTkxNV9ndWNfY2xp ZW50IG9iamVjdCBpZiBzdWNjZXNzLgorICovCitzdGF0aWMgc3RydWN0IGk5MTVfZ3VjX2NsaWVu dCAqZ3VjX2NsaWVudF9hbGxvYyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJCQkJdWludDMy X3QgcHJpb3JpdHkpCit7CisJc3RydWN0IGk5MTVfZ3VjX2NsaWVudCAqY2xpZW50OworCXN0cnVj dCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0 IGludGVsX2d1YyAqZ3VjID0gJmRldl9wcml2LT5ndWM7CisJc3RydWN0IGRybV9pOTE1X2dlbV9v YmplY3QgKm9iajsKKworCWNsaWVudCA9IGt6YWxsb2Moc2l6ZW9mKCpjbGllbnQpLCBHRlBfS0VS TkVMKTsKKwlpZiAoIWNsaWVudCkKKwkJcmV0dXJuIE5VTEw7CisKKwljbGllbnQtPmRvb3JiZWxs X2lkID0gR1VDX0lOVkFMSURfRE9PUkJFTExfSUQ7CisJY2xpZW50LT5wcmlvcml0eSA9IHByaW9y aXR5OworCisJY2xpZW50LT5jdHhfaW5kZXggPSAodWludDMyX3QpaWRhX3NpbXBsZV9nZXQoJmd1 Yy0+Y3R4X2lkcywgMCwKKwkJCUdVQ19NQVhfR1BVX0NPTlRFWFRTLCBHRlBfS0VSTkVMKTsKKwlp ZiAoY2xpZW50LT5jdHhfaW5kZXggPj0gR1VDX01BWF9HUFVfQ09OVEVYVFMpIHsKKwkJY2xpZW50 LT5jdHhfaW5kZXggPSBHVUNfSU5WQUxJRF9DVFhfSUQ7CisJCWdvdG8gZXJyOworCX0KKworCS8q IFRoZSBmaXJzdCBwYWdlIGlzIGRvb3JiZWxsL3Byb2NfZGVzYy4gVHdvIGZvbGxvd2VkIHBhZ2Vz IGFyZSB3cS4gKi8KKwlvYmogPSBnZW1fYWxsb2NhdGVfZ3VjX29iaihkZXYsIEdVQ19EQl9TSVpF ICsgR1VDX1dRX1NJWkUpOworCWlmICghb2JqKQorCQlnb3RvIGVycjsKKworCWNsaWVudC0+Y2xp ZW50X29iaiA9IG9iajsKKwljbGllbnQtPndxX29mZnNldCA9IEdVQ19EQl9TSVpFOworCWNsaWVu dC0+d3Ffc2l6ZSA9IEdVQ19XUV9TSVpFOworCXNwaW5fbG9ja19pbml0KCZjbGllbnQtPndxX2xv Y2spOworCisJY2xpZW50LT5kb29yYmVsbF9vZmZzZXQgPSBzZWxlY3RfZG9vcmJlbGxfY2FjaGVs aW5lKGd1Yyk7CisKKwkvKgorCSAqIFNpbmNlIHRoZSBkb29yYmVsbCBvbmx5IHJlcXVpcmVzIGEg c2luZ2xlIGNhY2hlbGluZSwgd2UgY2FuIHNhdmUKKwkgKiBzcGFjZSBieSBwdXR0aW5nIHRoZSBh cHBsaWNhdGlvbiBwcm9jZXNzIGRlc2NyaXB0b3IgaW4gdGhlIHNhbWUKKwkgKiBwYWdlLiBVc2Ug dGhlIGhhbGYgb2YgdGhlIHBhZ2UgdGhhdCBkb2Vzbid0IGluY2x1ZGUgdGhlIGRvb3JiZWxsLgor CSAqLworCWlmIChjbGllbnQtPmRvb3JiZWxsX29mZnNldCA+PSAoR1VDX0RCX1NJWkUgLyAyKSkK KwkJY2xpZW50LT5wcm9jX2Rlc2Nfb2Zmc2V0ID0gMDsKKwllbHNlCisJCWNsaWVudC0+cHJvY19k ZXNjX29mZnNldCA9IChHVUNfREJfU0laRSAvIDIpOworCisJY2xpZW50LT5kb29yYmVsbF9pZCA9 IGFzc2lnbl9kb29yYmVsbChndWMsIGNsaWVudC0+cHJpb3JpdHkpOworCWlmIChjbGllbnQtPmRv b3JiZWxsX2lkID09IEdVQ19JTlZBTElEX0RPT1JCRUxMX0lEKQorCQkvKiBYWFg6IGV2aWN0IGEg ZG9vcmJlbGwgaW5zdGVhZCAqLworCQlnb3RvIGVycjsKKworCWd1Y19pbml0X3Byb2NfZGVzYyhn dWMsIGNsaWVudCk7CisJZ3VjX2luaXRfY3R4X2Rlc2MoZ3VjLCBjbGllbnQpOworCWd1Y19pbml0 X2Rvb3JiZWxsKGd1YywgY2xpZW50KTsKKworCS8qIEludmFsaWRhdGUgR3VDIFRMQiB0byBsZXQg R3VDIHRha2UgdGhlIGxhdGVzdCB1cGRhdGVzIHRvIEdUVC4gKi8KKwlJOTE1X1dSSVRFKEdFTjhf R1RDUiwgR0VOOF9HVENSX0lOVkFMSURBVEUpOworCisJLyogWFhYOiBBbnkgY2FjaGUgZmx1c2hl cyBuZWVkZWQ/IEdlbmVyYWwgZG9tYWluIG1nbXQgY2FsbHM/ICovCisKKwlpZiAoaG9zdDJndWNf YWxsb2NhdGVfZG9vcmJlbGwoZ3VjLCBjbGllbnQpKQorCQlnb3RvIGVycjsKKworCURSTV9ERUJV R19EUklWRVIoIm5ldyBwcmlvcml0eSAldSBjbGllbnQgJXA6IGN0eF9pbmRleCAldSBkYl9pZCAl dVxuIiwKKwkJcHJpb3JpdHksIGNsaWVudCwgY2xpZW50LT5jdHhfaW5kZXgsIGNsaWVudC0+ZG9v cmJlbGxfaWQpOworCisJcmV0dXJuIGNsaWVudDsKKworZXJyOgorCWd1Y19jbGllbnRfZnJlZShk ZXYsIGNsaWVudCk7CisJcmV0dXJuIE5VTEw7Cit9CisKIHN0YXRpYyB2b2lkIGd1Y19jcmVhdGVf bG9nKHN0cnVjdCBpbnRlbF9ndWMgKmd1YykKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAq ZGV2X3ByaXYgPSBndWNfdG9faTkxNShndWMpOwpAQCAtMTM4LDYgKzc3MSw4IEBAIGludCBpOTE1 X2d1Y19zdWJtaXNzaW9uX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIAlpZiAoIWd1Yy0+ Y3R4X3Bvb2xfb2JqKQogCQlyZXR1cm4gLUVOT01FTTsKIAorCXNwaW5fbG9ja19pbml0KCZkZXZf cHJpdi0+Z3VjLmhvc3QyZ3VjX2xvY2spOworCiAJaWRhX2luaXQoJmd1Yy0+Y3R4X2lkcyk7CiAK IAlndWNfY3JlYXRlX2xvZyhndWMpOwpAQCAtMTQ1LDYgKzc4MCwzMiBAQCBpbnQgaTkxNV9ndWNf c3VibWlzc2lvbl9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiAJcmV0dXJuIDA7CiB9CiAK K2ludCBpOTE1X2d1Y19zdWJtaXNzaW9uX2VuYWJsZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQor eworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7 CisJc3RydWN0IGludGVsX2d1YyAqZ3VjID0gJmRldl9wcml2LT5ndWM7CisJc3RydWN0IGk5MTVf Z3VjX2NsaWVudCAqY2xpZW50OworCisJLyogY2xpZW50IGZvciBleGVjYnVmIHN1Ym1pc3Npb24g Ki8KKwljbGllbnQgPSBndWNfY2xpZW50X2FsbG9jKGRldiwgR1VDX0NUWF9QUklPUklUWV9OT1JN QUwpOworCWlmICghY2xpZW50KSB7CisJCURSTV9FUlJPUigiRmFpbGVkIHRvIGNyZWF0ZSBleGVj YnVmIGd1Y19jbGllbnRcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlndWMtPmV4ZWNi dWZfY2xpZW50ID0gY2xpZW50OworCXJldHVybiAwOworfQorCit2b2lkIGk5MTVfZ3VjX3N1Ym1p c3Npb25fZGlzYWJsZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1faTkx NV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGludGVsX2d1 YyAqZ3VjID0gJmRldl9wcml2LT5ndWM7CisKKwlndWNfY2xpZW50X2ZyZWUoZGV2LCBndWMtPmV4 ZWNidWZfY2xpZW50KTsKKwlndWMtPmV4ZWNidWZfY2xpZW50ID0gTlVMTDsKK30KKwogdm9pZCBp OTE1X2d1Y19zdWJtaXNzaW9uX2Zpbmkoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1 Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwpkaWZmIC0t Z2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZ3VjLmggYi9kcml2ZXJzL2dwdS9kcm0v aTkxNS9pbnRlbF9ndWMuaAppbmRleCAzZGU5MDk2Li41YmVkNTI5IDEwMDY0NAotLS0gYS9kcml2 ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9ndWMuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9p bnRlbF9ndWMuaApAQCAtMjgsNiArMjgsMzAgQEAKICNpbmNsdWRlICJpbnRlbF9ndWNfZndpZi5o IgogI2luY2x1ZGUgImk5MTVfZ3VjX3JlZy5oIgogCitzdHJ1Y3QgaTkxNV9ndWNfY2xpZW50IHsK KwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqY2xpZW50X29iajsKKwl1aW50MzJfdCBwcmlv cml0eTsKKwl1aW50MzJfdCBjdHhfaW5kZXg7CisKKwl1aW50MzJfdCBwcm9jX2Rlc2Nfb2Zmc2V0 OworCXVpbnQzMl90IGRvb3JiZWxsX29mZnNldDsKKwl1aW50MzJfdCBjb29raWU7CisJdWludDE2 X3QgZG9vcmJlbGxfaWQ7CisJdWludDE2X3QgcGFkZGluZzsJCS8qIE1haW50YWluIGFsaWdubWVu dAkJKi8KKworCXVpbnQzMl90IHdxX29mZnNldDsKKwl1aW50MzJfdCB3cV9zaXplOworCisJc3Bp bmxvY2tfdCB3cV9sb2NrOwkJLyogUHJvdGVjdHMgYWxsIGRhdGEgYmVsb3cJKi8KKwl1aW50MzJf dCB3cV90YWlsOworCisJLyogR3VDIHN1Ym1pc3Npb24gc3RhdGlzdGljcyAmIHN0YXR1cyAqLwor CXVpbnQ2NF90IHN1Ym1pc3Npb25zOworCXVpbnQzMl90IHFfZmFpbDsKKwl1aW50MzJfdCBiX2Zh aWw7CisJaW50IHJldGNvZGU7Cit9OworCiBzdHJ1Y3QgaW50ZWxfZ3VjIHsKIAkvKiBHZW5lcmlj IHVDIGZpcm13YXJlIG1hbmFnZW1lbnQgKi8KIAlzdHJ1Y3QgaW50ZWxfdWNfZncgZ3VjX2Z3OwpA QCAtNDMsNiArNjcsMjAgQEAgc3RydWN0IGludGVsX2d1YyB7CiAKIAlzdHJ1Y3QgZHJtX2k5MTVf Z2VtX29iamVjdCAqY3R4X3Bvb2xfb2JqOwogCXN0cnVjdCBpZGEgY3R4X2lkczsKKworCXN0cnVj dCBpOTE1X2d1Y19jbGllbnQgKmV4ZWNidWZfY2xpZW50OworCisJc3BpbmxvY2tfdCBob3N0Mmd1 Y19sb2NrOwkvKiBQcm90ZWN0cyBhbGwgZGF0YSBiZWxvdwkqLworCisJREVDTEFSRV9CSVRNQVAo ZG9vcmJlbGxfYml0bWFwLCBHVUNfTUFYX0RPT1JCRUxMUyk7CisJaW50IGRiX2NhY2hlbGluZTsK KworCS8qIEFjdGlvbiBzdGF0dXMgJiBzdGF0aXN0aWNzICovCisJdWludDY0X3QgYWN0aW9uX2Nv dW50OwkJLyogVG90YWwgY29tbWFuZHMgaXNzdWVkCSovCisJdWludDMyX3QgYWN0aW9uX2NtZDsJ CS8qIExhc3QgY29tbWFuZCB3b3JkCQkqLworCXVpbnQzMl90IGFjdGlvbl9zdGF0dXM7CQkvKiBM YXN0IHJldHVybiBzdGF0dXMJCSovCisJdWludDMyX3QgYWN0aW9uX2ZhaWw7CQkvKiBUb3RhbCBu dW1iZXIgb2YgZmFpbHVyZXMJKi8KKwlpbnQzMl90IGFjdGlvbl9lcnI7CQkvKiBMYXN0IGVycm9y IGNvZGUJCSovCiB9OwogCiAvKiBpbnRlbF9ndWNfbG9hZGVyLmMgKi8KQEAgLTUyLDYgKzkwLDEx IEBAIGV4dGVybiB2b2lkIGludGVsX2d1Y191Y29kZV9maW5pKHN0cnVjdCBkcm1fZGV2aWNlICpk ZXYpOwogCiAvKiBpOTE1X2d1Y19zdWJtaXNzaW9uLmMgKi8KIGludCBpOTE1X2d1Y19zdWJtaXNz aW9uX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CitpbnQgaTkxNV9ndWNfc3VibWlzc2lv bl9lbmFibGUoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CitpbnQgaTkxNV9ndWNfc3VibWl0KHN0 cnVjdCBpOTE1X2d1Y19jbGllbnQgKmNsaWVudCwKKwkJICAgIHN0cnVjdCBpbnRlbF9jb250ZXh0 ICpjdHgsCisJCSAgICBzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5nKTsKK3ZvaWQgaTkxNV9n dWNfc3VibWlzc2lvbl9kaXNhYmxlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogdm9pZCBpOTE1 X2d1Y19zdWJtaXNzaW9uX2Zpbmkoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiAKICNlbmRpZgpk aWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZ3VjX2xvYWRlci5jIGIvZHJp dmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZ3VjX2xvYWRlci5jCmluZGV4IGRlZWFhMjAuLmViNzZj MzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2d1Y19sb2FkZXIuYwor KysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9ndWNfbG9hZGVyLmMKQEAgLTQxNyw2ICs0 MTcsOCBAQCBpbnQgaW50ZWxfZ3VjX3Vjb2RlX2xvYWQoc3RydWN0IGRybV9kZXZpY2UgKmRldikK IAkJaW50ZWxfdWNfZndfc3RhdHVzX3JlcHIoZ3VjX2Z3LT51Y19md19mZXRjaF9zdGF0dXMpLAog CQlpbnRlbF91Y19md19zdGF0dXNfcmVwcihndWNfZnctPnVjX2Z3X2xvYWRfc3RhdHVzKSk7CiAK KwlpOTE1X2d1Y19zdWJtaXNzaW9uX2Rpc2FibGUoZGV2KTsKKwogCWlmIChndWNfZnctPnVjX2Z3 X2ZldGNoX3N0YXR1cyA9PSBJTlRFTF9VQ19GSVJNV0FSRV9OT05FKQogCQlyZXR1cm4gMDsKIApA QCAtNDQ0LDEyICs0NDYsMjAgQEAgaW50IGludGVsX2d1Y191Y29kZV9sb2FkKHN0cnVjdCBkcm1f ZGV2aWNlICpkZXYpCiAJCWludGVsX3VjX2Z3X3N0YXR1c19yZXByKGd1Y19mdy0+dWNfZndfZmV0 Y2hfc3RhdHVzKSwKIAkJaW50ZWxfdWNfZndfc3RhdHVzX3JlcHIoZ3VjX2Z3LT51Y19md19sb2Fk X3N0YXR1cykpOwogCisJaWYgKGk5MTUuZW5hYmxlX2d1Y19zdWJtaXNzaW9uKSB7CisJCWVyciA9 IGk5MTVfZ3VjX3N1Ym1pc3Npb25fZW5hYmxlKGRldik7CisJCWlmIChlcnIpCisJCQlnb3RvIGZh aWw7CisJfQorCiAJcmV0dXJuIDA7CiAKIGZhaWw6CiAJaWYgKGd1Y19mdy0+dWNfZndfbG9hZF9z dGF0dXMgPT0gSU5URUxfVUNfRklSTVdBUkVfUEVORElORykKIAkJZ3VjX2Z3LT51Y19md19sb2Fk X3N0YXR1cyA9IElOVEVMX1VDX0ZJUk1XQVJFX0ZBSUw7CiAKKwlpOTE1X2d1Y19zdWJtaXNzaW9u X2Rpc2FibGUoZGV2KTsKKwogCURSTV9FUlJPUigiRmFpbGVkIHRvIGluaXRpYWxpemUgR3VDLCBl cnJvciAlZFxuIiwgZXJyKTsKIAogCXJldHVybiBlcnI7Ci0tIAoxLjkuMQoKX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KSW50ZWwtZ2Z4IG1haWxpbmcgbGlz dApJbnRlbC1nZnhAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHA6Ly9saXN0cy5mcmVlZGVza3Rv cC5vcmcvbWFpbG1hbi9saXN0aW5mby9pbnRlbC1nZngK