From mboxrd@z Thu Jan 1 00:00:00 1970 From: Alex Deucher Subject: [PATCH 05/17] drm/amdgpu: add display controller implementation for si v7 Date: Sat, 14 May 2016 15:26:17 -0400 Message-ID: <1463253989-28924-6-git-send-email-alexander.deucher@amd.com> References: <1463253989-28924-1-git-send-email-alexander.deucher@amd.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail-qg0-x242.google.com (mail-qg0-x242.google.com [IPv6:2607:f8b0:400d:c04::242]) by gabe.freedesktop.org (Postfix) with ESMTPS id 864646E2D9 for ; Sat, 14 May 2016 19:26:41 +0000 (UTC) Received: by mail-qg0-x242.google.com with SMTP id 90so10656932qgz.0 for ; Sat, 14 May 2016 12:26:41 -0700 (PDT) In-Reply-To: <1463253989-28924-1-git-send-email-alexander.deucher@amd.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: dri-devel@lists.freedesktop.org Cc: Alex Deucher , Ken Wang List-Id: dri-devel@lists.freedesktop.org RnJvbTogS2VuIFdhbmcgPFFpbmdxaW5nLldhbmdAYW1kLmNvbT4KCnY0OiByZWJhc2UgZml4dXBz CnY1OiBtb3JlIGZpeGVzIGJhc2VkIG9uIGRjZTggY29kZQp2Njogc3F1YXNoIGluIGRtaWYgb2Zm c2V0IGZpeAp2NzogcmViYXNlIGZpeHVwcwoKQWNrZWQtYnk6IENocmlzdGlhbiBLw7ZuaWcgPGNo cmlzdGlhbi5rb2VuaWdAYW1kLmNvbT4KU2lnbmVkLW9mZi1ieTogS2VuIFdhbmcgPFFpbmdxaW5n LldhbmdAYW1kLmNvbT4KU2lnbmVkLW9mZi1ieTogQWxleCBEZXVjaGVyIDxhbGV4YW5kZXIuZGV1 Y2hlckBhbWQuY29tPgotLS0KIGRyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2RjZV92Nl8wLmMg fCAzMjA0ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwogZHJpdmVycy9ncHUvZHJt L2FtZC9hbWRncHUvZGNlX3Y2XzAuaCB8ICAgMjkgKwogMiBmaWxlcyBjaGFuZ2VkLCAzMjMzIGlu c2VydGlvbnMoKykKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdw dS9kY2VfdjZfMC5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRn cHUvZGNlX3Y2XzAuaAoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2Rj ZV92Nl8wLmMgYi9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9kY2VfdjZfMC5jCm5ldyBmaWxl IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4ZGM1NTQKLS0tIC9kZXYvbnVsbAorKysgYi9k cml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9kY2VfdjZfMC5jCkBAIC0wLDAgKzEsMzIwNCBAQAor LyoKKyAqIENvcHlyaWdodCAyMDE1IEFkdmFuY2VkIE1pY3JvIERldmljZXMsIEluYy4KKyAqCisg KiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBl cnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVk IGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhl IFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRp b24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBk aXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0 d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBm dXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgor ICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90 aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBv cnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQg IkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1Q TElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJD SEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9O SU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBDT1BZUklHSFQgSE9MREVS KFMpIE9SIEFVVEhPUihTKSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICog T1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBP UiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJ VEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBT T0ZUV0FSRS4KKyAqCisgKi8KKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiYW1kZ3B1Lmgi CisjaW5jbHVkZSAiYW1kZ3B1X3BtLmgiCisjaW5jbHVkZSAiYW1kZ3B1X2kyYy5oIgorI2luY2x1 ZGUgImF0b20uaCIKKyNpbmNsdWRlICJhbWRncHVfYXRvbWJpb3MuaCIKKyNpbmNsdWRlICJhdG9t Ymlvc19jcnRjLmgiCisjaW5jbHVkZSAiYXRvbWJpb3NfZW5jb2RlcnMuaCIKKyNpbmNsdWRlICJh bWRncHVfcGxsLmgiCisjaW5jbHVkZSAiYW1kZ3B1X2Nvbm5lY3RvcnMuaCIKKyNpbmNsdWRlICJz aS9zaV9yZWcuaCIKKyNpbmNsdWRlICJzaS9zaWQuaCIKKworc3RhdGljIHZvaWQgZGNlX3Y2XzBf c2V0X2Rpc3BsYXlfZnVuY3Moc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYpOworc3RhdGljIHZv aWQgZGNlX3Y2XzBfc2V0X2lycV9mdW5jcyhzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldik7CisK K3N0YXRpYyBjb25zdCB1MzIgY3J0Y19vZmZzZXRzWzZdID0KK3sKKwlTSV9DUlRDMF9SRUdJU1RF Ul9PRkZTRVQsCisJU0lfQ1JUQzFfUkVHSVNURVJfT0ZGU0VULAorCVNJX0NSVEMyX1JFR0lTVEVS X09GRlNFVCwKKwlTSV9DUlRDM19SRUdJU1RFUl9PRkZTRVQsCisJU0lfQ1JUQzRfUkVHSVNURVJf T0ZGU0VULAorCVNJX0NSVEM1X1JFR0lTVEVSX09GRlNFVAorfTsKKworc3RhdGljIGNvbnN0IHVp bnQzMl90IGRpZ19vZmZzZXRzW10gPSB7CisJU0lfQ1JUQzBfUkVHSVNURVJfT0ZGU0VULAorCVNJ X0NSVEMxX1JFR0lTVEVSX09GRlNFVCwKKwlTSV9DUlRDMl9SRUdJU1RFUl9PRkZTRVQsCisJU0lf Q1JUQzNfUkVHSVNURVJfT0ZGU0VULAorCVNJX0NSVEM0X1JFR0lTVEVSX09GRlNFVCwKKwlTSV9D UlRDNV9SRUdJU1RFUl9PRkZTRVQsCisJKDB4MTM4MzAgLSAweDcwMzApID4+IDIsCit9OworCitz dGF0aWMgY29uc3Qgc3RydWN0IHsKKwl1aW50MzJfdAlyZWc7CisJdWludDMyX3QJdmJsYW5rOwor CXVpbnQzMl90CXZsaW5lOworCXVpbnQzMl90CWhwZDsKKworfSBpbnRlcnJ1cHRfc3RhdHVzX29m ZnNldHNbNl0gPSB7IHsKKwkucmVnID0gRElTUF9JTlRFUlJVUFRfU1RBVFVTLAorCS52Ymxhbmsg PSBESVNQX0lOVEVSUlVQVF9TVEFUVVNfX0xCX0QxX1ZCTEFOS19JTlRFUlJVUFRfTUFTSywKKwku dmxpbmUgPSBESVNQX0lOVEVSUlVQVF9TVEFUVVNfX0xCX0QxX1ZMSU5FX0lOVEVSUlVQVF9NQVNL LAorCS5ocGQgPSBESVNQX0lOVEVSUlVQVF9TVEFUVVNfX0RDX0hQRDFfSU5URVJSVVBUX01BU0sK K30sIHsKKwkucmVnID0gRElTUF9JTlRFUlJVUFRfU1RBVFVTX0NPTlRJTlVFLAorCS52Ymxhbmsg PSBESVNQX0lOVEVSUlVQVF9TVEFUVVNfQ09OVElOVUVfX0xCX0QyX1ZCTEFOS19JTlRFUlJVUFRf TUFTSywKKwkudmxpbmUgPSBESVNQX0lOVEVSUlVQVF9TVEFUVVNfQ09OVElOVUVfX0xCX0QyX1ZM SU5FX0lOVEVSUlVQVF9NQVNLLAorCS5ocGQgPSBESVNQX0lOVEVSUlVQVF9TVEFUVVNfQ09OVElO VUVfX0RDX0hQRDJfSU5URVJSVVBUX01BU0sKK30sIHsKKwkucmVnID0gRElTUF9JTlRFUlJVUFRf U1RBVFVTX0NPTlRJTlVFMiwKKwkudmJsYW5rID0gRElTUF9JTlRFUlJVUFRfU1RBVFVTX0NPTlRJ TlVFMl9fTEJfRDNfVkJMQU5LX0lOVEVSUlVQVF9NQVNLLAorCS52bGluZSA9IERJU1BfSU5URVJS VVBUX1NUQVRVU19DT05USU5VRTJfX0xCX0QzX1ZMSU5FX0lOVEVSUlVQVF9NQVNLLAorCS5ocGQg PSBESVNQX0lOVEVSUlVQVF9TVEFUVVNfQ09OVElOVUUyX19EQ19IUEQzX0lOVEVSUlVQVF9NQVNL Cit9LCB7CisJLnJlZyA9IERJU1BfSU5URVJSVVBUX1NUQVRVU19DT05USU5VRTMsCisJLnZibGFu ayA9IERJU1BfSU5URVJSVVBUX1NUQVRVU19DT05USU5VRTNfX0xCX0Q0X1ZCTEFOS19JTlRFUlJV UFRfTUFTSywKKwkudmxpbmUgPSBESVNQX0lOVEVSUlVQVF9TVEFUVVNfQ09OVElOVUUzX19MQl9E NF9WTElORV9JTlRFUlJVUFRfTUFTSywKKwkuaHBkID0gRElTUF9JTlRFUlJVUFRfU1RBVFVTX0NP TlRJTlVFM19fRENfSFBENF9JTlRFUlJVUFRfTUFTSworfSwgeworCS5yZWcgPSBESVNQX0lOVEVS UlVQVF9TVEFUVVNfQ09OVElOVUU0LAorCS52YmxhbmsgPSBESVNQX0lOVEVSUlVQVF9TVEFUVVNf Q09OVElOVUU0X19MQl9ENV9WQkxBTktfSU5URVJSVVBUX01BU0ssCisJLnZsaW5lID0gRElTUF9J TlRFUlJVUFRfU1RBVFVTX0NPTlRJTlVFNF9fTEJfRDVfVkxJTkVfSU5URVJSVVBUX01BU0ssCisJ LmhwZCA9IERJU1BfSU5URVJSVVBUX1NUQVRVU19DT05USU5VRTRfX0RDX0hQRDVfSU5URVJSVVBU X01BU0sKK30sIHsKKwkucmVnID0gRElTUF9JTlRFUlJVUFRfU1RBVFVTX0NPTlRJTlVFNSwKKwku dmJsYW5rID0gRElTUF9JTlRFUlJVUFRfU1RBVFVTX0NPTlRJTlVFNV9fTEJfRDZfVkJMQU5LX0lO VEVSUlVQVF9NQVNLLAorCS52bGluZSA9IERJU1BfSU5URVJSVVBUX1NUQVRVU19DT05USU5VRTVf X0xCX0Q2X1ZMSU5FX0lOVEVSUlVQVF9NQVNLLAorCS5ocGQgPSBESVNQX0lOVEVSUlVQVF9TVEFU VVNfQ09OVElOVUU1X19EQ19IUEQ2X0lOVEVSUlVQVF9NQVNLCit9IH07CisKK3N0YXRpYyBjb25z dCB1aW50MzJfdCBocGRfaW50X2NvbnRyb2xfb2Zmc2V0c1s2XSA9IHsKKwlEQ19IUEQxX0lOVF9D T05UUk9MLAorCURDX0hQRDJfSU5UX0NPTlRST0wsCisJRENfSFBEM19JTlRfQ09OVFJPTCwKKwlE Q19IUEQ0X0lOVF9DT05UUk9MLAorCURDX0hQRDVfSU5UX0NPTlRST0wsCisJRENfSFBENl9JTlRf Q09OVFJPTCwKK307CisKK3N0YXRpYyB1MzIgZGNlX3Y2XzBfYXVkaW9fZW5kcHRfcnJlZyhzdHJ1 Y3QgYW1kZ3B1X2RldmljZSAqYWRldiwKKwkJCQkgICAgIHUzMiBibG9ja19vZmZzZXQsIHUzMiBy ZWcpCit7CisJRFJNX0lORk8oInh4eHg6IGRjZV92Nl8wX2F1ZGlvX2VuZHB0X3JyZWcgLS0tLW5v IGltcGwhISEhXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZGNlX3Y2XzBfYXVk aW9fZW5kcHRfd3JlZyhzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldiwKKwkJCQkgICAgICB1MzIg YmxvY2tfb2Zmc2V0LCB1MzIgcmVnLCB1MzIgdikKK3sKKwlEUk1fSU5GTygieHh4eDogZGNlX3Y2 XzBfYXVkaW9fZW5kcHRfd3JlZyAtLS0tbm8gaW1wbCEhISFcbiIpOworfQorCitzdGF0aWMgYm9v bCBkY2VfdjZfMF9pc19pbl92Ymxhbmsoc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYsIGludCBj cnRjKQoreworCWlmIChSUkVHMzIoRVZFUkdSRUVOX0NSVENfU1RBVFVTICsgY3J0Y19vZmZzZXRz W2NydGNdKSAmIEVWRVJHUkVFTl9DUlRDX1ZfQkxBTkspCisJCXJldHVybiB0cnVlOworCWVsc2UK KwkJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgYm9vbCBkY2VfdjZfMF9pc19jb3VudGVyX21v dmluZyhzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldiwgaW50IGNydGMpCit7CisJdTMyIHBvczEs IHBvczI7CisKKwlwb3MxID0gUlJFRzMyKEVWRVJHUkVFTl9DUlRDX1NUQVRVU19QT1NJVElPTiAr IGNydGNfb2Zmc2V0c1tjcnRjXSk7CisJcG9zMiA9IFJSRUczMihFVkVSR1JFRU5fQ1JUQ19TVEFU VVNfUE9TSVRJT04gKyBjcnRjX29mZnNldHNbY3J0Y10pOworCisJaWYgKHBvczEgIT0gcG9zMikK KwkJcmV0dXJuIHRydWU7CisJZWxzZQorCQlyZXR1cm4gZmFsc2U7Cit9CisKKy8qKgorICogZGNl X3Y2XzBfd2FpdF9mb3JfdmJsYW5rIC0gdmJsYW5rIHdhaXQgYXNpYyBjYWxsYmFjay4KKyAqCisg KiBAY3J0YzogY3J0YyB0byB3YWl0IGZvciB2Ymxhbmsgb24KKyAqCisgKiBXYWl0IGZvciB2Ymxh bmsgb24gdGhlIHJlcXVlc3RlZCBjcnRjIChldmVyZ3JlZW4rKS4KKyAqLworc3RhdGljIHZvaWQg ZGNlX3Y2XzBfdmJsYW5rX3dhaXQoc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYsIGludCBjcnRj KQoreworCXVuc2lnbmVkIGkgPSAwOworCisJaWYgKGNydGMgPj0gYWRldi0+bW9kZV9pbmZvLm51 bV9jcnRjKQorCQlyZXR1cm47CisKKwlpZiAoIShSUkVHMzIoRVZFUkdSRUVOX0NSVENfQ09OVFJP TCArIGNydGNfb2Zmc2V0c1tjcnRjXSkgJiBFVkVSR1JFRU5fQ1JUQ19NQVNURVJfRU4pKQorCQly ZXR1cm47CisKKwkvKiBkZXBlbmRpbmcgb24gd2hlbiB3ZSBoaXQgdmJsYW5rLCB3ZSBtYXkgYmUg Y2xvc2UgdG8gYWN0aXZlOyBpZiBzbywKKwkgKiB3YWl0IGZvciBhbm90aGVyIGZyYW1lLgorCSAq LworCXdoaWxlIChkY2VfdjZfMF9pc19pbl92YmxhbmsoYWRldiwgY3J0YykpIHsKKwkJaWYgKGkr KyAlIDEwMCA9PSAwKSB7CisJCQlpZiAoIWRjZV92Nl8wX2lzX2NvdW50ZXJfbW92aW5nKGFkZXYs IGNydGMpKQorCQkJCWJyZWFrOworCQl9CisJfQorCisJd2hpbGUgKCFkY2VfdjZfMF9pc19pbl92 YmxhbmsoYWRldiwgY3J0YykpIHsKKwkJaWYgKGkrKyAlIDEwMCA9PSAwKSB7CisJCQlpZiAoIWRj ZV92Nl8wX2lzX2NvdW50ZXJfbW92aW5nKGFkZXYsIGNydGMpKQorCQkJCWJyZWFrOworCQl9CisJ fQorfQorCitzdGF0aWMgdTMyIGRjZV92Nl8wX3ZibGFua19nZXRfY291bnRlcihzdHJ1Y3QgYW1k Z3B1X2RldmljZSAqYWRldiwgaW50IGNydGMpCit7CisJaWYgKGNydGMgPj0gYWRldi0+bW9kZV9p bmZvLm51bV9jcnRjKQorCQlyZXR1cm4gMDsKKwllbHNlCisJCXJldHVybiBSUkVHMzIoQ1JUQ19T VEFUVVNfRlJBTUVfQ09VTlQgKyBjcnRjX29mZnNldHNbY3J0Y10pOworfQorCitzdGF0aWMgdm9p ZCBkY2VfdjZfMF9wYWdlZmxpcF9pbnRlcnJ1cHRfaW5pdChzdHJ1Y3QgYW1kZ3B1X2RldmljZSAq YWRldikKK3sKKwl1bnNpZ25lZCBpOworCisJLyogRW5hYmxlIHBmbGlwIGludGVycnVwdHMgKi8K Kwlmb3IgKGkgPSAwOyBpIDw9IGFkZXYtPm1vZGVfaW5mby5udW1fY3J0YzsgaSsrKQorCQlhbWRn cHVfaXJxX2dldChhZGV2LCAmYWRldi0+cGFnZWZsaXBfaXJxLCBpKTsKK30KKworc3RhdGljIHZv aWQgZGNlX3Y2XzBfcGFnZWZsaXBfaW50ZXJydXB0X2Zpbmkoc3RydWN0IGFtZGdwdV9kZXZpY2Ug KmFkZXYpCit7CisJdW5zaWduZWQgaTsKKworCS8qIERpc2FibGUgcGZsaXAgaW50ZXJydXB0cyAq LworCWZvciAoaSA9IDA7IGkgPD0gYWRldi0+bW9kZV9pbmZvLm51bV9jcnRjOyBpKyspCisJCWFt ZGdwdV9pcnFfcHV0KGFkZXYsICZhZGV2LT5wYWdlZmxpcF9pcnEsIGkpOworfQorCisvKioKKyAq IGRjZV92Nl8wX3BhZ2VfZmxpcCAtIHBhZ2VmbGlwIGNhbGxiYWNrLgorICoKKyAqIEBhZGV2OiBh bWRncHVfZGV2aWNlIHBvaW50ZXIKKyAqIEBjcnRjX2lkOiBjcnRjIHRvIGNsZWFudXAgcGFnZWZs aXAgb24KKyAqIEBjcnRjX2Jhc2U6IG5ldyBhZGRyZXNzIG9mIHRoZSBjcnRjIChHUFUgTUMgYWRk cmVzcykKKyAqCisgKiBEb2VzIHRoZSBhY3R1YWwgcGFnZWZsaXAgKGV2ZXJncmVlbispLgorICog RHVyaW5nIHZibGFuayB3ZSB0YWtlIHRoZSBjcnRjIGxvY2sgYW5kIHdhaXQgZm9yIHRoZSB1cGRh dGVfcGVuZGluZworICogYml0IHRvIGdvIGhpZ2gsIHdoZW4gaXQgZG9lcywgd2UgcmVsZWFzZSB0 aGUgbG9jaywgYW5kIGFsbG93IHRoZQorICogZG91YmxlIGJ1ZmZlcmVkIHVwZGF0ZSB0byB0YWtl IHBsYWNlLgorICogUmV0dXJucyB0aGUgY3VycmVudCB1cGRhdGUgcGVuZGluZyBzdGF0dXMuCisg Ki8KK3N0YXRpYyB2b2lkIGRjZV92Nl8wX3BhZ2VfZmxpcChzdHJ1Y3QgYW1kZ3B1X2RldmljZSAq YWRldiwKKwkJCSAgICAgICBpbnQgY3J0Y19pZCwgdTY0IGNydGNfYmFzZSwgYm9vbCBhc3luYykK K3sKKwlzdHJ1Y3QgYW1kZ3B1X2NydGMgKmFtZGdwdV9jcnRjID0gYWRldi0+bW9kZV9pbmZvLmNy dGNzW2NydGNfaWRdOworCisJLyogZmxpcCBhdCBoc3luYyBmb3IgYXN5bmMsIGRlZmF1bHQgaXMg dnN5bmMgKi8KKwlXUkVHMzIoRVZFUkdSRUVOX0dSUEhfRkxJUF9DT05UUk9MICsgYW1kZ3B1X2Ny dGMtPmNydGNfb2Zmc2V0LCBhc3luYyA/CisJICAgICAgIEVWRVJHUkVFTl9HUlBIX1NVUkZBQ0Vf VVBEQVRFX0hfUkVUUkFDRV9FTiA6IDApOworCS8qIHVwZGF0ZSB0aGUgc2Nhbm91dCBhZGRyZXNz ZXMgKi8KKwlXUkVHMzIoRVZFUkdSRUVOX0dSUEhfUFJJTUFSWV9TVVJGQUNFX0FERFJFU1NfSElH SCArIGFtZGdwdV9jcnRjLT5jcnRjX29mZnNldCwKKwkgICAgICAgdXBwZXJfMzJfYml0cyhjcnRj X2Jhc2UpKTsKKwlXUkVHMzIoRVZFUkdSRUVOX0dSUEhfUFJJTUFSWV9TVVJGQUNFX0FERFJFU1Mg KyBhbWRncHVfY3J0Yy0+Y3J0Y19vZmZzZXQsCisJICAgICAgICh1MzIpY3J0Y19iYXNlKTsKKwor CS8qIHBvc3QgdGhlIHdyaXRlICovCisJUlJFRzMyKEVWRVJHUkVFTl9HUlBIX1BSSU1BUllfU1VS RkFDRV9BRERSRVNTICsgYW1kZ3B1X2NydGMtPmNydGNfb2Zmc2V0KTsKK30KKworc3RhdGljIGlu dCBkY2VfdjZfMF9jcnRjX2dldF9zY2Fub3V0cG9zKHN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2 LCBpbnQgY3J0YywKKwkJCQkJdTMyICp2YmwsIHUzMiAqcG9zaXRpb24pCit7CisJaWYgKChjcnRj IDwgMCkgfHwgKGNydGMgPj0gYWRldi0+bW9kZV9pbmZvLm51bV9jcnRjKSkKKwkJcmV0dXJuIC1F SU5WQUw7CisJKnZibCA9IFJSRUczMihFVkVSR1JFRU5fQ1JUQ19WX0JMQU5LX1NUQVJUX0VORCAr IGNydGNfb2Zmc2V0c1tjcnRjXSk7CisJKnBvc2l0aW9uID0gUlJFRzMyKEVWRVJHUkVFTl9DUlRD X1NUQVRVU19QT1NJVElPTiArIGNydGNfb2Zmc2V0c1tjcnRjXSk7CisKKwlyZXR1cm4gMDsKKwor fQorCisvKioKKyAqIGRjZV92Nl8wX2hwZF9zZW5zZSAtIGhwZCBzZW5zZSBjYWxsYmFjay4KKyAq CisgKiBAYWRldjogYW1kZ3B1X2RldmljZSBwb2ludGVyCisgKiBAaHBkOiBocGQgKGhvdHBsdWcg ZGV0ZWN0KSBwaW4KKyAqCisgKiBDaGVja3MgaWYgYSBkaWdpdGFsIG1vbml0b3IgaXMgY29ubmVj dGVkIChldmVyZ3JlZW4rKS4KKyAqIFJldHVybnMgdHJ1ZSBpZiBjb25uZWN0ZWQsIGZhbHNlIGlm IG5vdCBjb25uZWN0ZWQuCisgKi8KK3N0YXRpYyBib29sIGRjZV92Nl8wX2hwZF9zZW5zZShzdHJ1 Y3QgYW1kZ3B1X2RldmljZSAqYWRldiwKKwkJCSAgICAgICBlbnVtIGFtZGdwdV9ocGRfaWQgaHBk KQoreworCWJvb2wgY29ubmVjdGVkID0gZmFsc2U7CisKKwlzd2l0Y2ggKGhwZCkgeworCWNhc2Ug QU1ER1BVX0hQRF8xOgorCQlpZiAoUlJFRzMyKERDX0hQRDFfSU5UX1NUQVRVUykgJiBEQ19IUER4 X1NFTlNFKQorCQkJY29ubmVjdGVkID0gdHJ1ZTsKKwkJYnJlYWs7CisJY2FzZSBBTURHUFVfSFBE XzI6CisJCWlmIChSUkVHMzIoRENfSFBEMl9JTlRfU1RBVFVTKSAmIERDX0hQRHhfU0VOU0UpCisJ CQljb25uZWN0ZWQgPSB0cnVlOworCQlicmVhazsKKwljYXNlIEFNREdQVV9IUERfMzoKKwkJaWYg KFJSRUczMihEQ19IUEQzX0lOVF9TVEFUVVMpICYgRENfSFBEeF9TRU5TRSkKKwkJCWNvbm5lY3Rl ZCA9IHRydWU7CisJCWJyZWFrOworCWNhc2UgQU1ER1BVX0hQRF80OgorCQlpZiAoUlJFRzMyKERD X0hQRDRfSU5UX1NUQVRVUykgJiBEQ19IUER4X1NFTlNFKQorCQkJY29ubmVjdGVkID0gdHJ1ZTsK KwkJYnJlYWs7CisJY2FzZSBBTURHUFVfSFBEXzU6CisJCWlmIChSUkVHMzIoRENfSFBENV9JTlRf U1RBVFVTKSAmIERDX0hQRHhfU0VOU0UpCisJCQljb25uZWN0ZWQgPSB0cnVlOworCQlicmVhazsK KwljYXNlIEFNREdQVV9IUERfNjoKKwkJaWYgKFJSRUczMihEQ19IUEQ2X0lOVF9TVEFUVVMpICYg RENfSFBEeF9TRU5TRSkKKwkJCWNvbm5lY3RlZCA9IHRydWU7CisJCWJyZWFrOworCWRlZmF1bHQ6 CisJCWJyZWFrOworCX0KKworCXJldHVybiBjb25uZWN0ZWQ7Cit9CisKKy8qKgorICogZGNlX3Y2 XzBfaHBkX3NldF9wb2xhcml0eSAtIGhwZCBzZXQgcG9sYXJpdHkgY2FsbGJhY2suCisgKgorICog QGFkZXY6IGFtZGdwdV9kZXZpY2UgcG9pbnRlcgorICogQGhwZDogaHBkIChob3RwbHVnIGRldGVj dCkgcGluCisgKgorICogU2V0IHRoZSBwb2xhcml0eSBvZiB0aGUgaHBkIHBpbiAoZXZlcmdyZWVu KykuCisgKi8KK3N0YXRpYyB2b2lkIGRjZV92Nl8wX2hwZF9zZXRfcG9sYXJpdHkoc3RydWN0IGFt ZGdwdV9kZXZpY2UgKmFkZXYsCisJCQkJICAgICAgZW51bSBhbWRncHVfaHBkX2lkIGhwZCkKK3sK Kwl1MzIgdG1wOworCWJvb2wgY29ubmVjdGVkID0gZGNlX3Y2XzBfaHBkX3NlbnNlKGFkZXYsIGhw ZCk7CisKKwlzd2l0Y2ggKGhwZCkgeworCWNhc2UgQU1ER1BVX0hQRF8xOgorCQl0bXAgPSBSUkVH MzIoRENfSFBEMV9JTlRfQ09OVFJPTCk7CisJCWlmIChjb25uZWN0ZWQpCisJCQl0bXAgJj0gfkRD X0hQRHhfSU5UX1BPTEFSSVRZOworCQllbHNlCisJCQl0bXAgfD0gRENfSFBEeF9JTlRfUE9MQVJJ VFk7CisJCVdSRUczMihEQ19IUEQxX0lOVF9DT05UUk9MLCB0bXApOworCQlicmVhazsKKwljYXNl IEFNREdQVV9IUERfMjoKKwkJdG1wID0gUlJFRzMyKERDX0hQRDJfSU5UX0NPTlRST0wpOworCQlp ZiAoY29ubmVjdGVkKQorCQkJdG1wICY9IH5EQ19IUER4X0lOVF9QT0xBUklUWTsKKwkJZWxzZQor CQkJdG1wIHw9IERDX0hQRHhfSU5UX1BPTEFSSVRZOworCQlXUkVHMzIoRENfSFBEMl9JTlRfQ09O VFJPTCwgdG1wKTsKKwkJYnJlYWs7CisJY2FzZSBBTURHUFVfSFBEXzM6CisJCXRtcCA9IFJSRUcz MihEQ19IUEQzX0lOVF9DT05UUk9MKTsKKwkJaWYgKGNvbm5lY3RlZCkKKwkJCXRtcCAmPSB+RENf SFBEeF9JTlRfUE9MQVJJVFk7CisJCWVsc2UKKwkJCXRtcCB8PSBEQ19IUER4X0lOVF9QT0xBUklU WTsKKwkJV1JFRzMyKERDX0hQRDNfSU5UX0NPTlRST0wsIHRtcCk7CisJCWJyZWFrOworCWNhc2Ug QU1ER1BVX0hQRF80OgorCQl0bXAgPSBSUkVHMzIoRENfSFBENF9JTlRfQ09OVFJPTCk7CisJCWlm IChjb25uZWN0ZWQpCisJCQl0bXAgJj0gfkRDX0hQRHhfSU5UX1BPTEFSSVRZOworCQllbHNlCisJ CQl0bXAgfD0gRENfSFBEeF9JTlRfUE9MQVJJVFk7CisJCVdSRUczMihEQ19IUEQ0X0lOVF9DT05U Uk9MLCB0bXApOworCQlicmVhazsKKwljYXNlIEFNREdQVV9IUERfNToKKwkJdG1wID0gUlJFRzMy KERDX0hQRDVfSU5UX0NPTlRST0wpOworCQlpZiAoY29ubmVjdGVkKQorCQkJdG1wICY9IH5EQ19I UER4X0lOVF9QT0xBUklUWTsKKwkJZWxzZQorCQkJdG1wIHw9IERDX0hQRHhfSU5UX1BPTEFSSVRZ OworCQlXUkVHMzIoRENfSFBENV9JTlRfQ09OVFJPTCwgdG1wKTsKKwkJCWJyZWFrOworCWNhc2Ug QU1ER1BVX0hQRF82OgorCQl0bXAgPSBSUkVHMzIoRENfSFBENl9JTlRfQ09OVFJPTCk7CisJCWlm IChjb25uZWN0ZWQpCisJCQl0bXAgJj0gfkRDX0hQRHhfSU5UX1BPTEFSSVRZOworCQllbHNlCisJ CQl0bXAgfD0gRENfSFBEeF9JTlRfUE9MQVJJVFk7CisJCVdSRUczMihEQ19IUEQ2X0lOVF9DT05U Uk9MLCB0bXApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Cit9CisKKy8qKgor ICogZGNlX3Y2XzBfaHBkX2luaXQgLSBocGQgc2V0dXAgY2FsbGJhY2suCisgKgorICogQGFkZXY6 IGFtZGdwdV9kZXZpY2UgcG9pbnRlcgorICoKKyAqIFNldHVwIHRoZSBocGQgcGlucyB1c2VkIGJ5 IHRoZSBjYXJkIChldmVyZ3JlZW4rKS4KKyAqIEVuYWJsZSB0aGUgcGluLCBzZXQgdGhlIHBvbGFy aXR5LCBhbmQgZW5hYmxlIHRoZSBocGQgaW50ZXJydXB0cy4KKyAqLworc3RhdGljIHZvaWQgZGNl X3Y2XzBfaHBkX2luaXQoc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYpCit7CisJc3RydWN0IGRy bV9kZXZpY2UgKmRldiA9IGFkZXYtPmRkZXY7CisJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5l Y3RvcjsKKwl1MzIgdG1wID0gRENfSFBEeF9DT05ORUNUSU9OX1RJTUVSKDB4OWM0KSB8CisJCURD X0hQRHhfUlhfSU5UX1RJTUVSKDB4ZmEpIHwgRENfSFBEeF9FTjsKKworCWxpc3RfZm9yX2VhY2hf ZW50cnkoY29ubmVjdG9yLCAmZGV2LT5tb2RlX2NvbmZpZy5jb25uZWN0b3JfbGlzdCwgaGVhZCkg eworCQlzdHJ1Y3QgYW1kZ3B1X2Nvbm5lY3RvciAqYW1kZ3B1X2Nvbm5lY3RvciA9IHRvX2FtZGdw dV9jb25uZWN0b3IoY29ubmVjdG9yKTsKKworCQlpZiAoY29ubmVjdG9yLT5jb25uZWN0b3JfdHlw ZSA9PSBEUk1fTU9ERV9DT05ORUNUT1JfZURQIHx8CisJCSAgICBjb25uZWN0b3ItPmNvbm5lY3Rv cl90eXBlID09IERSTV9NT0RFX0NPTk5FQ1RPUl9MVkRTKSB7CisJCQkvKiBkb24ndCB0cnkgdG8g ZW5hYmxlIGhwZCBvbiBlRFAgb3IgTFZEUyBhdm9pZCBicmVha2luZyB0aGUKKwkJCSAqIGF1eCBk cCBjaGFubmVsIG9uIGltYWMgYW5kIGhlbHAgKGJ1dCBub3QgY29tcGxldGVseSBmaXgpCisJCQkg KiBodHRwczovL2J1Z3ppbGxhLnJlZGhhdC5jb20vc2hvd19idWcuY2dpP2lkPTcyNjE0MworCQkJ ICogYWxzbyBhdm9pZCBpbnRlcnJ1cHQgc3Rvcm1zIGR1cmluZyBkcG1zLgorCQkJICovCisJCQlj b250aW51ZTsKKwkJfQorCQlzd2l0Y2ggKGFtZGdwdV9jb25uZWN0b3ItPmhwZC5ocGQpIHsKKwkJ Y2FzZSBBTURHUFVfSFBEXzE6CisJCQlXUkVHMzIoRENfSFBEMV9DT05UUk9MLCB0bXApOworCQkJ YnJlYWs7CisJCWNhc2UgQU1ER1BVX0hQRF8yOgorCQkJV1JFRzMyKERDX0hQRDJfQ09OVFJPTCwg dG1wKTsKKwkJCWJyZWFrOworCQljYXNlIEFNREdQVV9IUERfMzoKKwkJCVdSRUczMihEQ19IUEQz X0NPTlRST0wsIHRtcCk7CisJCQlicmVhazsKKwkJY2FzZSBBTURHUFVfSFBEXzQ6CisJCQlXUkVH MzIoRENfSFBENF9DT05UUk9MLCB0bXApOworCQkJYnJlYWs7CisJCWNhc2UgQU1ER1BVX0hQRF81 OgorCQkJV1JFRzMyKERDX0hQRDVfQ09OVFJPTCwgdG1wKTsKKwkJCWJyZWFrOworCQljYXNlIEFN REdQVV9IUERfNjoKKwkJCVdSRUczMihEQ19IUEQ2X0NPTlRST0wsIHRtcCk7CisJCQlicmVhazsK KwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJCWRjZV92Nl8wX2hwZF9zZXRfcG9sYXJpdHko YWRldiwgYW1kZ3B1X2Nvbm5lY3Rvci0+aHBkLmhwZCk7CisJCWFtZGdwdV9pcnFfZ2V0KGFkZXYs ICZhZGV2LT5ocGRfaXJxLCBhbWRncHVfY29ubmVjdG9yLT5ocGQuaHBkKTsKKwl9CisKK30KKwor LyoqCisgKiBkY2VfdjZfMF9ocGRfZmluaSAtIGhwZCB0ZWFyIGRvd24gY2FsbGJhY2suCisgKgor ICogQGFkZXY6IGFtZGdwdV9kZXZpY2UgcG9pbnRlcgorICoKKyAqIFRlYXIgZG93biB0aGUgaHBk IHBpbnMgdXNlZCBieSB0aGUgY2FyZCAoZXZlcmdyZWVuKykuCisgKiBEaXNhYmxlIHRoZSBocGQg aW50ZXJydXB0cy4KKyAqLworc3RhdGljIHZvaWQgZGNlX3Y2XzBfaHBkX2Zpbmkoc3RydWN0IGFt ZGdwdV9kZXZpY2UgKmFkZXYpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGFkZXYtPmRk ZXY7CisJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcjsKKworCWxpc3RfZm9yX2VhY2hf ZW50cnkoY29ubmVjdG9yLCAmZGV2LT5tb2RlX2NvbmZpZy5jb25uZWN0b3JfbGlzdCwgaGVhZCkg eworCQlzdHJ1Y3QgYW1kZ3B1X2Nvbm5lY3RvciAqYW1kZ3B1X2Nvbm5lY3RvciA9IHRvX2FtZGdw dV9jb25uZWN0b3IoY29ubmVjdG9yKTsKKworCQlzd2l0Y2ggKGFtZGdwdV9jb25uZWN0b3ItPmhw ZC5ocGQpIHsKKwkJY2FzZSBBTURHUFVfSFBEXzE6CisJCQlXUkVHMzIoRENfSFBEMV9DT05UUk9M LCAwKTsKKwkJCWJyZWFrOworCQljYXNlIEFNREdQVV9IUERfMjoKKwkJCVdSRUczMihEQ19IUEQy X0NPTlRST0wsIDApOworCQkJYnJlYWs7CisJCWNhc2UgQU1ER1BVX0hQRF8zOgorCQkJV1JFRzMy KERDX0hQRDNfQ09OVFJPTCwgMCk7CisJCQlicmVhazsKKwkJY2FzZSBBTURHUFVfSFBEXzQ6CisJ CQlXUkVHMzIoRENfSFBENF9DT05UUk9MLCAwKTsKKwkJCWJyZWFrOworCQljYXNlIEFNREdQVV9I UERfNToKKwkJCVdSRUczMihEQ19IUEQ1X0NPTlRST0wsIDApOworCQkJYnJlYWs7CisJCWNhc2Ug QU1ER1BVX0hQRF82OgorCQkJV1JFRzMyKERDX0hQRDZfQ09OVFJPTCwgMCk7CisJCQlicmVhazsK KwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJCWFtZGdwdV9pcnFfcHV0KGFkZXYsICZhZGV2 LT5ocGRfaXJxLCBhbWRncHVfY29ubmVjdG9yLT5ocGQuaHBkKTsKKwl9Cit9CisKK3N0YXRpYyB1 MzIgZGNlX3Y2XzBfaHBkX2dldF9ncGlvX3JlZyhzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldikK K3sKKwlyZXR1cm4gU0lfRENfR1BJT19IUERfQTsKK30KKworc3RhdGljIGJvb2wgZGNlX3Y2XzBf aXNfZGlzcGxheV9odW5nKHN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2KQoreworCURSTV9JTkZP KCJ4eHh4OiBkY2VfdjZfMF9pc19kaXNwbGF5X2h1bmcgLS0tLW5vIGltcCEhISEhXG4iKTsKKwor CXJldHVybiB0cnVlOworfQorCitzdGF0aWMgdTMyIGV2ZXJncmVlbl9nZXRfdmJsYW5rX2NvdW50 ZXIoc3RydWN0IGFtZGdwdV9kZXZpY2UqIGFkZXYsIGludCBjcnRjKQoreworCWlmIChjcnRjID49 IGFkZXYtPm1vZGVfaW5mby5udW1fY3J0YykKKwkJcmV0dXJuIDA7CisJZWxzZQorCQlyZXR1cm4g UlJFRzMyKENSVENfU1RBVFVTX0ZSQU1FX0NPVU5UICsgY3J0Y19vZmZzZXRzW2NydGNdKTsKK30K Kworc3RhdGljIHZvaWQgZGNlX3Y2XzBfc3RvcF9tY19hY2Nlc3Moc3RydWN0IGFtZGdwdV9kZXZp Y2UgKmFkZXYsCisJCQkJICAgIHN0cnVjdCBhbWRncHVfbW9kZV9tY19zYXZlICpzYXZlKQorewor CXUzMiBjcnRjX2VuYWJsZWQsIHRtcCwgZnJhbWVfY291bnQ7CisJaW50IGksIGo7CisKKwlzYXZl LT52Z2FfcmVuZGVyX2NvbnRyb2wgPSBSUkVHMzIoVkdBX1JFTkRFUl9DT05UUk9MKTsKKwlzYXZl LT52Z2FfaGRwX2NvbnRyb2wgPSBSUkVHMzIoVkdBX0hEUF9DT05UUk9MKTsKKworCS8qIGRpc2Fi bGUgVkdBIHJlbmRlciAqLworCVdSRUczMihWR0FfUkVOREVSX0NPTlRST0wsIDApOworCisJLyog YmxhbmsgdGhlIGRpc3BsYXkgY29udHJvbGxlcnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgYWRldi0+ bW9kZV9pbmZvLm51bV9jcnRjOyBpKyspIHsKKwkJY3J0Y19lbmFibGVkID0gUlJFRzMyKEVWRVJH UkVFTl9DUlRDX0NPTlRST0wgKyBjcnRjX29mZnNldHNbaV0pICYgRVZFUkdSRUVOX0NSVENfTUFT VEVSX0VOOworCQlpZiAoY3J0Y19lbmFibGVkKSB7CisJCQlzYXZlLT5jcnRjX2VuYWJsZWRbaV0g PSB0cnVlOworCQkJdG1wID0gUlJFRzMyKEVWRVJHUkVFTl9DUlRDX0JMQU5LX0NPTlRST0wgKyBj cnRjX29mZnNldHNbaV0pOworCisJCQlpZiAoISh0bXAgJiBFVkVSR1JFRU5fQ1JUQ19CTEFOS19E QVRBX0VOKSkgeworCQkJCWRjZV92Nl8wX3ZibGFua193YWl0KGFkZXYsIGkpOworCQkJCVdSRUcz MihFVkVSR1JFRU5fQ1JUQ19VUERBVEVfTE9DSyArIGNydGNfb2Zmc2V0c1tpXSwgMSk7CisJCQkJ dG1wIHw9IEVWRVJHUkVFTl9DUlRDX0JMQU5LX0RBVEFfRU47CisJCQkJV1JFRzMyKEVWRVJHUkVF Tl9DUlRDX0JMQU5LX0NPTlRST0wgKyBjcnRjX29mZnNldHNbaV0sIHRtcCk7CisJCQkJV1JFRzMy KEVWRVJHUkVFTl9DUlRDX1VQREFURV9MT0NLICsgY3J0Y19vZmZzZXRzW2ldLCAwKTsKKwkJCX0K KwkJCS8qIHdhaXQgZm9yIHRoZSBuZXh0IGZyYW1lICovCisJCQlmcmFtZV9jb3VudCA9IGV2ZXJn cmVlbl9nZXRfdmJsYW5rX2NvdW50ZXIoYWRldiwgaSk7CisJCQlmb3IgKGogPSAwOyBqIDwgYWRl di0+dXNlY190aW1lb3V0OyBqKyspIHsKKwkJCQlpZiAoZXZlcmdyZWVuX2dldF92YmxhbmtfY291 bnRlcihhZGV2LCBpKSAhPSBmcmFtZV9jb3VudCkKKwkJCQkJYnJlYWs7CisJCQkJdWRlbGF5KDEp OworCQkJfQorCisJCQkvKiBYWFggdGhpcyBpcyBhIGhhY2sgdG8gYXZvaWQgc3RyYW5nZSBiZWhh dmlvciB3aXRoIEVGSSBvbiBjZXJ0YWluIHN5c3RlbXMgKi8KKwkJCVdSRUczMihFVkVSR1JFRU5f Q1JUQ19VUERBVEVfTE9DSyArIGNydGNfb2Zmc2V0c1tpXSwgMSk7CisJCQl0bXAgPSBSUkVHMzIo RVZFUkdSRUVOX0NSVENfQ09OVFJPTCArIGNydGNfb2Zmc2V0c1tpXSk7CisJCQl0bXAgJj0gfkVW RVJHUkVFTl9DUlRDX01BU1RFUl9FTjsKKwkJCVdSRUczMihFVkVSR1JFRU5fQ1JUQ19DT05UUk9M ICsgY3J0Y19vZmZzZXRzW2ldLCB0bXApOworCQkJV1JFRzMyKEVWRVJHUkVFTl9DUlRDX1VQREFU RV9MT0NLICsgY3J0Y19vZmZzZXRzW2ldLCAwKTsKKwkJCXNhdmUtPmNydGNfZW5hYmxlZFtpXSA9 IGZhbHNlOworCQkJLyogKioqKiogKi8KKwkJfSBlbHNlIHsKKwkJCXNhdmUtPmNydGNfZW5hYmxl ZFtpXSA9IGZhbHNlOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBkY2VfdjZfMF9yZXN1bWVf bWNfYWNjZXNzKHN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2LAorCQkJCSAgICAgIHN0cnVjdCBh bWRncHVfbW9kZV9tY19zYXZlICpzYXZlKQoreworCXUzMiB0bXA7CisJaW50IGksIGo7CisKKwkv KiB1cGRhdGUgY3J0YyBiYXNlIGFkZHJlc3NlcyAqLworCWZvciAoaSA9IDA7IGkgPCBhZGV2LT5t b2RlX2luZm8ubnVtX2NydGM7IGkrKykgeworCQlXUkVHMzIoRVZFUkdSRUVOX0dSUEhfUFJJTUFS WV9TVVJGQUNFX0FERFJFU1NfSElHSCArIGNydGNfb2Zmc2V0c1tpXSwKKwkJICAgICAgIHVwcGVy XzMyX2JpdHMoYWRldi0+bWMudnJhbV9zdGFydCkpOworCQlXUkVHMzIoRVZFUkdSRUVOX0dSUEhf U0VDT05EQVJZX1NVUkZBQ0VfQUREUkVTU19ISUdIICsgY3J0Y19vZmZzZXRzW2ldLAorCQkgICAg ICAgdXBwZXJfMzJfYml0cyhhZGV2LT5tYy52cmFtX3N0YXJ0KSk7CisJCVdSRUczMihFVkVSR1JF RU5fR1JQSF9QUklNQVJZX1NVUkZBQ0VfQUREUkVTUyArIGNydGNfb2Zmc2V0c1tpXSwKKwkJICAg ICAgICh1MzIpYWRldi0+bWMudnJhbV9zdGFydCk7CisJCVdSRUczMihFVkVSR1JFRU5fR1JQSF9T RUNPTkRBUllfU1VSRkFDRV9BRERSRVNTICsgY3J0Y19vZmZzZXRzW2ldLAorCQkgICAgICAgKHUz MilhZGV2LT5tYy52cmFtX3N0YXJ0KTsKKwl9CisKKwlXUkVHMzIoRVZFUkdSRUVOX1ZHQV9NRU1P UllfQkFTRV9BRERSRVNTX0hJR0gsIHVwcGVyXzMyX2JpdHMoYWRldi0+bWMudnJhbV9zdGFydCkp OworCVdSRUczMihFVkVSR1JFRU5fVkdBX01FTU9SWV9CQVNFX0FERFJFU1MsICh1MzIpYWRldi0+ bWMudnJhbV9zdGFydCk7CisKKwkvKiB1bmxvY2sgcmVncyBhbmQgd2FpdCBmb3IgdXBkYXRlICov CisJZm9yIChpID0gMDsgaSA8IGFkZXYtPm1vZGVfaW5mby5udW1fY3J0YzsgaSsrKSB7CisJCWlm IChzYXZlLT5jcnRjX2VuYWJsZWRbaV0pIHsKKwkJCXRtcCA9IFJSRUczMihFVkVSR1JFRU5fTUFT VEVSX1VQREFURV9NT0RFICsgY3J0Y19vZmZzZXRzW2ldKTsKKwkJCWlmICgodG1wICYgMHg3KSAh PSAzKSB7CisJCQkJdG1wICY9IH4weDc7CisJCQkJdG1wIHw9IDB4MzsKKwkJCQlXUkVHMzIoRVZF UkdSRUVOX01BU1RFUl9VUERBVEVfTU9ERSArIGNydGNfb2Zmc2V0c1tpXSwgdG1wKTsKKwkJCX0K KwkJCXRtcCA9IFJSRUczMihFVkVSR1JFRU5fR1JQSF9VUERBVEUgKyBjcnRjX29mZnNldHNbaV0p OworCQkJaWYgKHRtcCAmIEVWRVJHUkVFTl9HUlBIX1VQREFURV9MT0NLKSB7CisJCQkJdG1wICY9 IH5FVkVSR1JFRU5fR1JQSF9VUERBVEVfTE9DSzsKKwkJCQlXUkVHMzIoRVZFUkdSRUVOX0dSUEhf VVBEQVRFICsgY3J0Y19vZmZzZXRzW2ldLCB0bXApOworCQkJfQorCQkJdG1wID0gUlJFRzMyKEVW RVJHUkVFTl9NQVNURVJfVVBEQVRFX0xPQ0sgKyBjcnRjX29mZnNldHNbaV0pOworCQkJaWYgKHRt cCAmIDEpIHsKKwkJCQl0bXAgJj0gfjE7CisJCQkJV1JFRzMyKEVWRVJHUkVFTl9NQVNURVJfVVBE QVRFX0xPQ0sgKyBjcnRjX29mZnNldHNbaV0sIHRtcCk7CisJCQl9CisJCQlmb3IgKGogPSAwOyBq IDwgYWRldi0+dXNlY190aW1lb3V0OyBqKyspIHsKKwkJCQl0bXAgPSBSUkVHMzIoRVZFUkdSRUVO X0dSUEhfVVBEQVRFICsgY3J0Y19vZmZzZXRzW2ldKTsKKwkJCQlpZiAoKHRtcCAmIEVWRVJHUkVF Tl9HUlBIX1NVUkZBQ0VfVVBEQVRFX1BFTkRJTkcpID09IDApCisJCQkJCWJyZWFrOworCQkJCXVk ZWxheSgxKTsKKwkJCX0KKwkJfQorCX0KKworCS8qIFVubG9jayB2Z2EgYWNjZXNzICovCisJV1JF RzMyKFZHQV9IRFBfQ09OVFJPTCwgc2F2ZS0+dmdhX2hkcF9jb250cm9sKTsKKwltZGVsYXkoMSk7 CisJV1JFRzMyKFZHQV9SRU5ERVJfQ09OVFJPTCwgc2F2ZS0+dmdhX3JlbmRlcl9jb250cm9sKTsK KworfQorCitzdGF0aWMgdm9pZCBkY2VfdjZfMF9zZXRfdmdhX3JlbmRlcl9zdGF0ZShzdHJ1Y3Qg YW1kZ3B1X2RldmljZSAqYWRldiwKKwkJCQkJICBib29sIHJlbmRlcikKK3sKKwlpZiAoIXJlbmRl cikgCisJCVdSRUczMihSXzAwMDMwMF9WR0FfUkVOREVSX0NPTlRST0wsCisJCQlSUkVHMzIoUl8w MDAzMDBfVkdBX1JFTkRFUl9DT05UUk9MKSAmIENfMDAwMzAwX1ZHQV9WU1RBVFVTX0NOVEwpOwor Cit9CisKK3N0YXRpYyB2b2lkIGRjZV92Nl8wX3Byb2dyYW1fZm10KHN0cnVjdCBkcm1fZW5jb2Rl ciAqZW5jb2RlcikKK3sKKworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7 CisJc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVj dCBhbWRncHVfZW5jb2RlciAqYW1kZ3B1X2VuY29kZXIgPSB0b19hbWRncHVfZW5jb2RlcihlbmNv ZGVyKTsKKwlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yID0gYW1kZ3B1X2dldF9jb25u ZWN0b3JfZm9yX2VuY29kZXIoZW5jb2Rlcik7CisJc3RydWN0IGFtZGdwdV9jcnRjICphbWRncHVf Y3J0YyA9IHRvX2FtZGdwdV9jcnRjKGVuY29kZXItPmNydGMpOworCWludCBicGMgPSAwOworCXUz MiB0bXAgPSAwOworCWVudW0gYW1kZ3B1X2Nvbm5lY3Rvcl9kaXRoZXIgZGl0aGVyID0gQU1ER1BV X0ZNVF9ESVRIRVJfRElTQUJMRTsKKworCWlmIChjb25uZWN0b3IpIHsKKwkJc3RydWN0IGFtZGdw dV9jb25uZWN0b3IgKmFtZGdwdV9jb25uZWN0b3IgPSB0b19hbWRncHVfY29ubmVjdG9yKGNvbm5l Y3Rvcik7CisJCWJwYyA9IGFtZGdwdV9jb25uZWN0b3JfZ2V0X21vbml0b3JfYnBjKGNvbm5lY3Rv cik7CisJCWRpdGhlciA9IGFtZGdwdV9jb25uZWN0b3ItPmRpdGhlcjsKKwl9CisKKwkvKiBMVkRT IEZNVCBpcyBzZXQgdXAgYnkgYXRvbSAqLworCWlmIChhbWRncHVfZW5jb2Rlci0+ZGV2aWNlcyAm IEFUT01fREVWSUNFX0xDRF9TVVBQT1JUKQorCQlyZXR1cm47CisKKwlpZiAoYnBjID09IDApCisJ CXJldHVybjsKKworCisJc3dpdGNoIChicGMpIHsKKwljYXNlIDY6CisJCWlmIChkaXRoZXIgPT0g QU1ER1BVX0ZNVF9ESVRIRVJfRU5BQkxFKQorCQkJLyogWFhYIHNvcnQgb3V0IG9wdGltYWwgZGl0 aGVyIHNldHRpbmdzICovCisJCQl0bXAgfD0gKEZNVF9GUkFNRV9SQU5ET01fRU5BQkxFIHwgRk1U X0hJR0hQQVNTX1JBTkRPTV9FTkFCTEUgfAorCQkJCUZNVF9TUEFUSUFMX0RJVEhFUl9FTik7CisJ CWVsc2UKKwkJCXRtcCB8PSBGTVRfVFJVTkNBVEVfRU47CisJCWJyZWFrOworCWNhc2UgODoKKwkJ aWYgKGRpdGhlciA9PSBBTURHUFVfRk1UX0RJVEhFUl9FTkFCTEUpCisJCQkvKiBYWFggc29ydCBv dXQgb3B0aW1hbCBkaXRoZXIgc2V0dGluZ3MgKi8KKwkJCXRtcCB8PSAoRk1UX0ZSQU1FX1JBTkRP TV9FTkFCTEUgfCBGTVRfSElHSFBBU1NfUkFORE9NX0VOQUJMRSB8CisJCQkJRk1UX1JHQl9SQU5E T01fRU5BQkxFIHwKKwkJCQlGTVRfU1BBVElBTF9ESVRIRVJfRU4gfCBGTVRfU1BBVElBTF9ESVRI RVJfREVQVEgpOworCQllbHNlCisJCQl0bXAgfD0gKEZNVF9UUlVOQ0FURV9FTiB8IEZNVF9UUlVO Q0FURV9ERVBUSCk7CisJCWJyZWFrOworCWNhc2UgMTA6CisJZGVmYXVsdDoKKwkJLyogbm90IG5l ZWRlZCAqLworCQlicmVhazsKKwl9CisKKwlXUkVHMzIoRk1UX0JJVF9ERVBUSF9DT05UUk9MICsg YW1kZ3B1X2NydGMtPmNydGNfb2Zmc2V0LCB0bXApOworfQorCisvKioKKyAqIGNpa19nZXRfbnVt YmVyX29mX2RyYW1fY2hhbm5lbHMgLSBnZXQgdGhlIG51bWJlciBvZiBkcmFtIGNoYW5uZWxzCisg KgorICogQGFkZXY6IGFtZGdwdV9kZXZpY2UgcG9pbnRlcgorICoKKyAqIExvb2sgdXAgdGhlIG51 bWJlciBvZiB2aWRlbyByYW0gY2hhbm5lbHMgKENJSykuCisgKiBVc2VkIGZvciBkaXNwbGF5IHdh dGVybWFyayBiYW5kd2lkdGggY2FsY3VsYXRpb25zCisgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Yg ZHJhbSBjaGFubmVscworICovCitzdGF0aWMgdTMyIHNpX2dldF9udW1iZXJfb2ZfZHJhbV9jaGFu bmVscyhzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldikKK3sKKwl1MzIgdG1wID0gUlJFRzMyKE1D X1NIQVJFRF9DSE1BUCk7CisKKwlzd2l0Y2ggKCh0bXAgJiBNQ19TSEFSRURfQ0hNQVBfX05PT0ZD SEFOX01BU0spID4+IE1DX1NIQVJFRF9DSE1BUF9fTk9PRkNIQU5fX1NISUZUKSB7CisJY2FzZSAw OgorCWRlZmF1bHQ6CisJCXJldHVybiAxOworCWNhc2UgMToKKwkJcmV0dXJuIDI7CisJY2FzZSAy OgorCQlyZXR1cm4gNDsKKwljYXNlIDM6CisJCXJldHVybiA4OworCWNhc2UgNDoKKwkJcmV0dXJu IDM7CisJY2FzZSA1OgorCQlyZXR1cm4gNjsKKwljYXNlIDY6CisJCXJldHVybiAxMDsKKwljYXNl IDc6CisJCXJldHVybiAxMjsKKwljYXNlIDg6CisJCXJldHVybiAxNjsKKwl9Cit9CisKK3N0cnVj dCBkY2U2X3dtX3BhcmFtcyB7CisJdTMyIGRyYW1fY2hhbm5lbHM7IC8qIG51bWJlciBvZiBkcmFt IGNoYW5uZWxzICovCisJdTMyIHljbGs7ICAgICAgICAgIC8qIGJhbmR3aWR0aCBwZXIgZHJhbSBk YXRhIHBpbiBpbiBrSHogKi8KKwl1MzIgc2NsazsgICAgICAgICAgLyogZW5naW5lIGNsb2NrIGlu IGtIeiAqLworCXUzMiBkaXNwX2NsazsgICAgICAvKiBkaXNwbGF5IGNsb2NrIGluIGtIeiAqLwor CXUzMiBzcmNfd2lkdGg7ICAgICAvKiB2aWV3cG9ydCB3aWR0aCAqLworCXUzMiBhY3RpdmVfdGlt ZTsgICAvKiBhY3RpdmUgZGlzcGxheSB0aW1lIGluIG5zICovCisJdTMyIGJsYW5rX3RpbWU7ICAg IC8qIGJsYW5rIHRpbWUgaW4gbnMgKi8KKwlib29sIGludGVybGFjZWQ7ICAgIC8qIG1vZGUgaXMg aW50ZXJsYWNlZCAqLworCWZpeGVkMjBfMTIgdnNjOyAgICAvKiB2ZXJ0aWNhbCBzY2FsZSByYXRp byAqLworCXUzMiBudW1faGVhZHM7ICAgICAvKiBudW1iZXIgb2YgYWN0aXZlIGNydGNzICovCisJ dTMyIGJ5dGVzX3Blcl9waXhlbDsgLyogYnl0ZXMgcGVyIHBpeGVsIGRpc3BsYXkgKyBvdmVybGF5 ICovCisJdTMyIGxiX3NpemU7ICAgICAgIC8qIGxpbmUgYnVmZmVyIGFsbG9jYXRlZCB0byBwaXBl ICovCisJdTMyIHZ0YXBzOyAgICAgICAgIC8qIHZlcnRpY2FsIHNjYWxlciB0YXBzICovCit9Owor CisvKioKKyAqIGRjZV92Nl8wX2RyYW1fYmFuZHdpZHRoIC0gZ2V0IHRoZSBkcmFtIGJhbmR3aWR0 aAorICoKKyAqIEB3bTogd2F0ZXJtYXJrIGNhbGN1bGF0aW9uIGRhdGEKKyAqCisgKiBDYWxjdWxh dGUgdGhlIHJhdyBkcmFtIGJhbmR3aWR0aCAoQ0lLKS4KKyAqIFVzZWQgZm9yIGRpc3BsYXkgd2F0 ZXJtYXJrIGJhbmR3aWR0aCBjYWxjdWxhdGlvbnMKKyAqIFJldHVybnMgdGhlIGRyYW0gYmFuZHdp ZHRoIGluIE1CeXRlcy9zCisgKi8KK3N0YXRpYyB1MzIgZGNlX3Y2XzBfZHJhbV9iYW5kd2lkdGgo c3RydWN0IGRjZTZfd21fcGFyYW1zICp3bSkKK3sKKwkvKiBDYWxjdWxhdGUgcmF3IERSQU0gQmFu ZHdpZHRoICovCisJZml4ZWQyMF8xMiBkcmFtX2VmZmljaWVuY3k7IC8qIDAuNyAqLworCWZpeGVk MjBfMTIgeWNsaywgZHJhbV9jaGFubmVscywgYmFuZHdpZHRoOworCWZpeGVkMjBfMTIgYTsKKwor CWEuZnVsbCA9IGRmaXhlZF9jb25zdCgxMDAwKTsKKwl5Y2xrLmZ1bGwgPSBkZml4ZWRfY29uc3Qo d20tPnljbGspOworCXljbGsuZnVsbCA9IGRmaXhlZF9kaXYoeWNsaywgYSk7CisJZHJhbV9jaGFu bmVscy5mdWxsID0gZGZpeGVkX2NvbnN0KHdtLT5kcmFtX2NoYW5uZWxzICogNCk7CisJYS5mdWxs ID0gZGZpeGVkX2NvbnN0KDEwKTsKKwlkcmFtX2VmZmljaWVuY3kuZnVsbCA9IGRmaXhlZF9jb25z dCg3KTsKKwlkcmFtX2VmZmljaWVuY3kuZnVsbCA9IGRmaXhlZF9kaXYoZHJhbV9lZmZpY2llbmN5 LCBhKTsKKwliYW5kd2lkdGguZnVsbCA9IGRmaXhlZF9tdWwoZHJhbV9jaGFubmVscywgeWNsayk7 CisJYmFuZHdpZHRoLmZ1bGwgPSBkZml4ZWRfbXVsKGJhbmR3aWR0aCwgZHJhbV9lZmZpY2llbmN5 KTsKKworCXJldHVybiBkZml4ZWRfdHJ1bmMoYmFuZHdpZHRoKTsKK30KKworLyoqCisgKiBkY2Vf djZfMF9kcmFtX2JhbmR3aWR0aF9mb3JfZGlzcGxheSAtIGdldCB0aGUgZHJhbSBiYW5kd2lkdGgg Zm9yIGRpc3BsYXkKKyAqCisgKiBAd206IHdhdGVybWFyayBjYWxjdWxhdGlvbiBkYXRhCisgKgor ICogQ2FsY3VsYXRlIHRoZSBkcmFtIGJhbmR3aWR0aCB1c2VkIGZvciBkaXNwbGF5IChDSUspLgor ICogVXNlZCBmb3IgZGlzcGxheSB3YXRlcm1hcmsgYmFuZHdpZHRoIGNhbGN1bGF0aW9ucworICog UmV0dXJucyB0aGUgZHJhbSBiYW5kd2lkdGggZm9yIGRpc3BsYXkgaW4gTUJ5dGVzL3MKKyAqLwor c3RhdGljIHUzMiBkY2VfdjZfMF9kcmFtX2JhbmR3aWR0aF9mb3JfZGlzcGxheShzdHJ1Y3QgZGNl Nl93bV9wYXJhbXMgKndtKQoreworCS8qIENhbGN1bGF0ZSBEUkFNIEJhbmR3aWR0aCBhbmQgdGhl IHBhcnQgYWxsb2NhdGVkIHRvIGRpc3BsYXkuICovCisJZml4ZWQyMF8xMiBkaXNwX2RyYW1fYWxs b2NhdGlvbjsgLyogMC4zIHRvIDAuNyAqLworCWZpeGVkMjBfMTIgeWNsaywgZHJhbV9jaGFubmVs cywgYmFuZHdpZHRoOworCWZpeGVkMjBfMTIgYTsKKworCWEuZnVsbCA9IGRmaXhlZF9jb25zdCgx MDAwKTsKKwl5Y2xrLmZ1bGwgPSBkZml4ZWRfY29uc3Qod20tPnljbGspOworCXljbGsuZnVsbCA9 IGRmaXhlZF9kaXYoeWNsaywgYSk7CisJZHJhbV9jaGFubmVscy5mdWxsID0gZGZpeGVkX2NvbnN0 KHdtLT5kcmFtX2NoYW5uZWxzICogNCk7CisJYS5mdWxsID0gZGZpeGVkX2NvbnN0KDEwKTsKKwlk aXNwX2RyYW1fYWxsb2NhdGlvbi5mdWxsID0gZGZpeGVkX2NvbnN0KDMpOyAvKiBYWFggd29yc2Ug Y2FzZSB2YWx1ZSAwLjMgKi8KKwlkaXNwX2RyYW1fYWxsb2NhdGlvbi5mdWxsID0gZGZpeGVkX2Rp dihkaXNwX2RyYW1fYWxsb2NhdGlvbiwgYSk7CisJYmFuZHdpZHRoLmZ1bGwgPSBkZml4ZWRfbXVs KGRyYW1fY2hhbm5lbHMsIHljbGspOworCWJhbmR3aWR0aC5mdWxsID0gZGZpeGVkX211bChiYW5k d2lkdGgsIGRpc3BfZHJhbV9hbGxvY2F0aW9uKTsKKworCXJldHVybiBkZml4ZWRfdHJ1bmMoYmFu ZHdpZHRoKTsKK30KKworLyoqCisgKiBkY2VfdjZfMF9kYXRhX3JldHVybl9iYW5kd2lkdGggLSBn ZXQgdGhlIGRhdGEgcmV0dXJuIGJhbmR3aWR0aAorICoKKyAqIEB3bTogd2F0ZXJtYXJrIGNhbGN1 bGF0aW9uIGRhdGEKKyAqCisgKiBDYWxjdWxhdGUgdGhlIGRhdGEgcmV0dXJuIGJhbmR3aWR0aCB1 c2VkIGZvciBkaXNwbGF5IChDSUspLgorICogVXNlZCBmb3IgZGlzcGxheSB3YXRlcm1hcmsgYmFu ZHdpZHRoIGNhbGN1bGF0aW9ucworICogUmV0dXJucyB0aGUgZGF0YSByZXR1cm4gYmFuZHdpZHRo IGluIE1CeXRlcy9zCisgKi8KK3N0YXRpYyB1MzIgZGNlX3Y2XzBfZGF0YV9yZXR1cm5fYmFuZHdp ZHRoKHN0cnVjdCBkY2U2X3dtX3BhcmFtcyAqd20pCit7CisJLyogQ2FsY3VsYXRlIHRoZSBkaXNw bGF5IERhdGEgcmV0dXJuIEJhbmR3aWR0aCAqLworCWZpeGVkMjBfMTIgcmV0dXJuX2VmZmljaWVu Y3k7IC8qIDAuOCAqLworCWZpeGVkMjBfMTIgc2NsaywgYmFuZHdpZHRoOworCWZpeGVkMjBfMTIg YTsKKworCWEuZnVsbCA9IGRmaXhlZF9jb25zdCgxMDAwKTsKKwlzY2xrLmZ1bGwgPSBkZml4ZWRf Y29uc3Qod20tPnNjbGspOworCXNjbGsuZnVsbCA9IGRmaXhlZF9kaXYoc2NsaywgYSk7CisJYS5m dWxsID0gZGZpeGVkX2NvbnN0KDEwKTsKKwlyZXR1cm5fZWZmaWNpZW5jeS5mdWxsID0gZGZpeGVk X2NvbnN0KDgpOworCXJldHVybl9lZmZpY2llbmN5LmZ1bGwgPSBkZml4ZWRfZGl2KHJldHVybl9l ZmZpY2llbmN5LCBhKTsKKwlhLmZ1bGwgPSBkZml4ZWRfY29uc3QoMzIpOworCWJhbmR3aWR0aC5m dWxsID0gZGZpeGVkX211bChhLCBzY2xrKTsKKwliYW5kd2lkdGguZnVsbCA9IGRmaXhlZF9tdWwo YmFuZHdpZHRoLCByZXR1cm5fZWZmaWNpZW5jeSk7CisKKwlyZXR1cm4gZGZpeGVkX3RydW5jKGJh bmR3aWR0aCk7Cit9CisKKy8qKgorICogZGNlX3Y2XzBfZG1pZl9yZXF1ZXN0X2JhbmR3aWR0aCAt IGdldCB0aGUgZG1pZiBiYW5kd2lkdGgKKyAqCisgKiBAd206IHdhdGVybWFyayBjYWxjdWxhdGlv biBkYXRhCisgKgorICogQ2FsY3VsYXRlIHRoZSBkbWlmIGJhbmR3aWR0aCB1c2VkIGZvciBkaXNw bGF5IChDSUspLgorICogVXNlZCBmb3IgZGlzcGxheSB3YXRlcm1hcmsgYmFuZHdpZHRoIGNhbGN1 bGF0aW9ucworICogUmV0dXJucyB0aGUgZG1pZiBiYW5kd2lkdGggaW4gTUJ5dGVzL3MKKyAqLwor c3RhdGljIHUzMiBkY2VfdjZfMF9kbWlmX3JlcXVlc3RfYmFuZHdpZHRoKHN0cnVjdCBkY2U2X3dt X3BhcmFtcyAqd20pCit7CisJLyogQ2FsY3VsYXRlIHRoZSBETUlGIFJlcXVlc3QgQmFuZHdpZHRo ICovCisJZml4ZWQyMF8xMiBkaXNwX2Nsa19yZXF1ZXN0X2VmZmljaWVuY3k7IC8qIDAuOCAqLwor CWZpeGVkMjBfMTIgZGlzcF9jbGssIGJhbmR3aWR0aDsKKwlmaXhlZDIwXzEyIGEsIGI7CisKKwlh LmZ1bGwgPSBkZml4ZWRfY29uc3QoMTAwMCk7CisJZGlzcF9jbGsuZnVsbCA9IGRmaXhlZF9jb25z dCh3bS0+ZGlzcF9jbGspOworCWRpc3BfY2xrLmZ1bGwgPSBkZml4ZWRfZGl2KGRpc3BfY2xrLCBh KTsKKwlhLmZ1bGwgPSBkZml4ZWRfY29uc3QoMzIpOworCWIuZnVsbCA9IGRmaXhlZF9tdWwoYSwg ZGlzcF9jbGspOworCisJYS5mdWxsID0gZGZpeGVkX2NvbnN0KDEwKTsKKwlkaXNwX2Nsa19yZXF1 ZXN0X2VmZmljaWVuY3kuZnVsbCA9IGRmaXhlZF9jb25zdCg4KTsKKwlkaXNwX2Nsa19yZXF1ZXN0 X2VmZmljaWVuY3kuZnVsbCA9IGRmaXhlZF9kaXYoZGlzcF9jbGtfcmVxdWVzdF9lZmZpY2llbmN5 LCBhKTsKKworCWJhbmR3aWR0aC5mdWxsID0gZGZpeGVkX211bChiLCBkaXNwX2Nsa19yZXF1ZXN0 X2VmZmljaWVuY3kpOworCisJcmV0dXJuIGRmaXhlZF90cnVuYyhiYW5kd2lkdGgpOworfQorCisv KioKKyAqIGRjZV92Nl8wX2F2YWlsYWJsZV9iYW5kd2lkdGggLSBnZXQgdGhlIG1pbiBhdmFpbGFi bGUgYmFuZHdpZHRoCisgKgorICogQHdtOiB3YXRlcm1hcmsgY2FsY3VsYXRpb24gZGF0YQorICoK KyAqIENhbGN1bGF0ZSB0aGUgbWluIGF2YWlsYWJsZSBiYW5kd2lkdGggdXNlZCBmb3IgZGlzcGxh eSAoQ0lLKS4KKyAqIFVzZWQgZm9yIGRpc3BsYXkgd2F0ZXJtYXJrIGJhbmR3aWR0aCBjYWxjdWxh dGlvbnMKKyAqIFJldHVybnMgdGhlIG1pbiBhdmFpbGFibGUgYmFuZHdpZHRoIGluIE1CeXRlcy9z CisgKi8KK3N0YXRpYyB1MzIgZGNlX3Y2XzBfYXZhaWxhYmxlX2JhbmR3aWR0aChzdHJ1Y3QgZGNl Nl93bV9wYXJhbXMgKndtKQoreworCS8qIENhbGN1bGF0ZSB0aGUgQXZhaWxhYmxlIGJhbmR3aWR0 aC4gRGlzcGxheSBjYW4gdXNlIHRoaXMgdGVtcG9yYXJpbHkgYnV0IG5vdCBpbiBhdmVyYWdlLiAq LworCXUzMiBkcmFtX2JhbmR3aWR0aCA9IGRjZV92Nl8wX2RyYW1fYmFuZHdpZHRoKHdtKTsKKwl1 MzIgZGF0YV9yZXR1cm5fYmFuZHdpZHRoID0gZGNlX3Y2XzBfZGF0YV9yZXR1cm5fYmFuZHdpZHRo KHdtKTsKKwl1MzIgZG1pZl9yZXFfYmFuZHdpZHRoID0gZGNlX3Y2XzBfZG1pZl9yZXF1ZXN0X2Jh bmR3aWR0aCh3bSk7CisKKwlyZXR1cm4gbWluKGRyYW1fYmFuZHdpZHRoLCBtaW4oZGF0YV9yZXR1 cm5fYmFuZHdpZHRoLCBkbWlmX3JlcV9iYW5kd2lkdGgpKTsKK30KKworLyoqCisgKiBkY2VfdjZf MF9hdmVyYWdlX2JhbmR3aWR0aCAtIGdldCB0aGUgYXZlcmFnZSBhdmFpbGFibGUgYmFuZHdpZHRo CisgKgorICogQHdtOiB3YXRlcm1hcmsgY2FsY3VsYXRpb24gZGF0YQorICoKKyAqIENhbGN1bGF0 ZSB0aGUgYXZlcmFnZSBhdmFpbGFibGUgYmFuZHdpZHRoIHVzZWQgZm9yIGRpc3BsYXkgKENJSyku CisgKiBVc2VkIGZvciBkaXNwbGF5IHdhdGVybWFyayBiYW5kd2lkdGggY2FsY3VsYXRpb25zCisg KiBSZXR1cm5zIHRoZSBhdmVyYWdlIGF2YWlsYWJsZSBiYW5kd2lkdGggaW4gTUJ5dGVzL3MKKyAq Lworc3RhdGljIHUzMiBkY2VfdjZfMF9hdmVyYWdlX2JhbmR3aWR0aChzdHJ1Y3QgZGNlNl93bV9w YXJhbXMgKndtKQoreworCS8qIENhbGN1bGF0ZSB0aGUgZGlzcGxheSBtb2RlIEF2ZXJhZ2UgQmFu ZHdpZHRoCisJICogRGlzcGxheU1vZGUgc2hvdWxkIGNvbnRhaW4gdGhlIHNvdXJjZSBhbmQgZGVz dGluYXRpb24gZGltZW5zaW9ucywKKwkgKiB0aW1pbmcsIGV0Yy4KKwkgKi8KKwlmaXhlZDIwXzEy IGJwcDsKKwlmaXhlZDIwXzEyIGxpbmVfdGltZTsKKwlmaXhlZDIwXzEyIHNyY193aWR0aDsKKwlm aXhlZDIwXzEyIGJhbmR3aWR0aDsKKwlmaXhlZDIwXzEyIGE7CisKKwlhLmZ1bGwgPSBkZml4ZWRf Y29uc3QoMTAwMCk7CisJbGluZV90aW1lLmZ1bGwgPSBkZml4ZWRfY29uc3Qod20tPmFjdGl2ZV90 aW1lICsgd20tPmJsYW5rX3RpbWUpOworCWxpbmVfdGltZS5mdWxsID0gZGZpeGVkX2RpdihsaW5l X3RpbWUsIGEpOworCWJwcC5mdWxsID0gZGZpeGVkX2NvbnN0KHdtLT5ieXRlc19wZXJfcGl4ZWwp OworCXNyY193aWR0aC5mdWxsID0gZGZpeGVkX2NvbnN0KHdtLT5zcmNfd2lkdGgpOworCWJhbmR3 aWR0aC5mdWxsID0gZGZpeGVkX211bChzcmNfd2lkdGgsIGJwcCk7CisJYmFuZHdpZHRoLmZ1bGwg PSBkZml4ZWRfbXVsKGJhbmR3aWR0aCwgd20tPnZzYyk7CisJYmFuZHdpZHRoLmZ1bGwgPSBkZml4 ZWRfZGl2KGJhbmR3aWR0aCwgbGluZV90aW1lKTsKKworCXJldHVybiBkZml4ZWRfdHJ1bmMoYmFu ZHdpZHRoKTsKK30KKworLyoqCisgKiBkY2VfdjZfMF9sYXRlbmN5X3dhdGVybWFyayAtIGdldCB0 aGUgbGF0ZW5jeSB3YXRlcm1hcmsKKyAqCisgKiBAd206IHdhdGVybWFyayBjYWxjdWxhdGlvbiBk YXRhCisgKgorICogQ2FsY3VsYXRlIHRoZSBsYXRlbmN5IHdhdGVybWFyayAoQ0lLKS4KKyAqIFVz ZWQgZm9yIGRpc3BsYXkgd2F0ZXJtYXJrIGJhbmR3aWR0aCBjYWxjdWxhdGlvbnMKKyAqIFJldHVy bnMgdGhlIGxhdGVuY3kgd2F0ZXJtYXJrIGluIG5zCisgKi8KK3N0YXRpYyB1MzIgZGNlX3Y2XzBf bGF0ZW5jeV93YXRlcm1hcmsoc3RydWN0IGRjZTZfd21fcGFyYW1zICp3bSkKK3sKKwkvKiBGaXJz dCBjYWxjdWxhdGUgdGhlIGxhdGVuY3kgaW4gbnMgKi8KKwl1MzIgbWNfbGF0ZW5jeSA9IDIwMDA7 IC8qIDIwMDAgbnMuICovCisJdTMyIGF2YWlsYWJsZV9iYW5kd2lkdGggPSBkY2VfdjZfMF9hdmFp bGFibGVfYmFuZHdpZHRoKHdtKTsKKwl1MzIgd29yc3RfY2h1bmtfcmV0dXJuX3RpbWUgPSAoNTEy ICogOCAqIDEwMDApIC8gYXZhaWxhYmxlX2JhbmR3aWR0aDsKKwl1MzIgY3Vyc29yX2xpbmVfcGFp cl9yZXR1cm5fdGltZSA9ICgxMjggKiA0ICogMTAwMCkgLyBhdmFpbGFibGVfYmFuZHdpZHRoOwor CXUzMiBkY19sYXRlbmN5ID0gNDAwMDAwMDAgLyB3bS0+ZGlzcF9jbGs7IC8qIGRjIHBpcGUgbGF0 ZW5jeSAqLworCXUzMiBvdGhlcl9oZWFkc19kYXRhX3JldHVybl90aW1lID0gKCh3bS0+bnVtX2hl YWRzICsgMSkgKiB3b3JzdF9jaHVua19yZXR1cm5fdGltZSkgKworCQkod20tPm51bV9oZWFkcyAq IGN1cnNvcl9saW5lX3BhaXJfcmV0dXJuX3RpbWUpOworCXUzMiBsYXRlbmN5ID0gbWNfbGF0ZW5j eSArIG90aGVyX2hlYWRzX2RhdGFfcmV0dXJuX3RpbWUgKyBkY19sYXRlbmN5OworCXUzMiBtYXhf c3JjX2xpbmVzX3Blcl9kc3RfbGluZSwgbGJfZmlsbF9idywgbGluZV9maWxsX3RpbWU7CisJdTMy IHRtcCwgZG1pZl9zaXplID0gMTIyODg7CisJZml4ZWQyMF8xMiBhLCBiLCBjOworCisJaWYgKHdt LT5udW1faGVhZHMgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlhLmZ1bGwgPSBkZml4ZWRfY29uc3Qo Mik7CisJYi5mdWxsID0gZGZpeGVkX2NvbnN0KDEpOworCWlmICgod20tPnZzYy5mdWxsID4gYS5m dWxsKSB8fAorCSAgICAoKHdtLT52c2MuZnVsbCA+IGIuZnVsbCkgJiYgKHdtLT52dGFwcyA+PSAz KSkgfHwKKwkgICAgKHdtLT52dGFwcyA+PSA1KSB8fAorCSAgICAoKHdtLT52c2MuZnVsbCA+PSBh LmZ1bGwpICYmIHdtLT5pbnRlcmxhY2VkKSkKKwkJbWF4X3NyY19saW5lc19wZXJfZHN0X2xpbmUg PSA0OworCWVsc2UKKwkJbWF4X3NyY19saW5lc19wZXJfZHN0X2xpbmUgPSAyOworCisJYS5mdWxs ID0gZGZpeGVkX2NvbnN0KGF2YWlsYWJsZV9iYW5kd2lkdGgpOworCWIuZnVsbCA9IGRmaXhlZF9j b25zdCh3bS0+bnVtX2hlYWRzKTsKKwlhLmZ1bGwgPSBkZml4ZWRfZGl2KGEsIGIpOworCisJYi5m dWxsID0gZGZpeGVkX2NvbnN0KG1jX2xhdGVuY3kgKyA1MTIpOworCWMuZnVsbCA9IGRmaXhlZF9j b25zdCh3bS0+ZGlzcF9jbGspOworCWIuZnVsbCA9IGRmaXhlZF9kaXYoYiwgYyk7CisKKwljLmZ1 bGwgPSBkZml4ZWRfY29uc3QoZG1pZl9zaXplKTsKKwliLmZ1bGwgPSBkZml4ZWRfZGl2KGMsIGIp OworCisJdG1wID0gbWluKGRmaXhlZF90cnVuYyhhKSwgZGZpeGVkX3RydW5jKGIpKTsKKworCWIu ZnVsbCA9IGRmaXhlZF9jb25zdCgxMDAwKTsKKwljLmZ1bGwgPSBkZml4ZWRfY29uc3Qod20tPmRp c3BfY2xrKTsKKwliLmZ1bGwgPSBkZml4ZWRfZGl2KGMsIGIpOworCWMuZnVsbCA9IGRmaXhlZF9j b25zdCh3bS0+Ynl0ZXNfcGVyX3BpeGVsKTsKKwliLmZ1bGwgPSBkZml4ZWRfbXVsKGIsIGMpOwor CisJbGJfZmlsbF9idyA9IG1pbih0bXAsIGRmaXhlZF90cnVuYyhiKSk7CisKKwlhLmZ1bGwgPSBk Zml4ZWRfY29uc3QobWF4X3NyY19saW5lc19wZXJfZHN0X2xpbmUgKiB3bS0+c3JjX3dpZHRoICog d20tPmJ5dGVzX3Blcl9waXhlbCk7CisJYi5mdWxsID0gZGZpeGVkX2NvbnN0KDEwMDApOworCWMu ZnVsbCA9IGRmaXhlZF9jb25zdChsYl9maWxsX2J3KTsKKwliLmZ1bGwgPSBkZml4ZWRfZGl2KGMs IGIpOworCWEuZnVsbCA9IGRmaXhlZF9kaXYoYSwgYik7CisJbGluZV9maWxsX3RpbWUgPSBkZml4 ZWRfdHJ1bmMoYSk7CisKKwlpZiAobGluZV9maWxsX3RpbWUgPCB3bS0+YWN0aXZlX3RpbWUpCisJ CXJldHVybiBsYXRlbmN5OworCWVsc2UKKwkJcmV0dXJuIGxhdGVuY3kgKyAobGluZV9maWxsX3Rp bWUgLSB3bS0+YWN0aXZlX3RpbWUpOworCit9CisKKy8qKgorICogZGNlX3Y2XzBfYXZlcmFnZV9i YW5kd2lkdGhfdnNfZHJhbV9iYW5kd2lkdGhfZm9yX2Rpc3BsYXkgLSBjaGVjaworICogYXZlcmFn ZSBhbmQgYXZhaWxhYmxlIGRyYW0gYmFuZHdpZHRoCisgKgorICogQHdtOiB3YXRlcm1hcmsgY2Fs Y3VsYXRpb24gZGF0YQorICoKKyAqIENoZWNrIGlmIHRoZSBkaXNwbGF5IGF2ZXJhZ2UgYmFuZHdp ZHRoIGZpdHMgaW4gdGhlIGRpc3BsYXkKKyAqIGRyYW0gYmFuZHdpZHRoIChDSUspLgorICogVXNl ZCBmb3IgZGlzcGxheSB3YXRlcm1hcmsgYmFuZHdpZHRoIGNhbGN1bGF0aW9ucworICogUmV0dXJu cyB0cnVlIGlmIHRoZSBkaXNwbGF5IGZpdHMsIGZhbHNlIGlmIG5vdC4KKyAqLworc3RhdGljIGJv b2wgZGNlX3Y2XzBfYXZlcmFnZV9iYW5kd2lkdGhfdnNfZHJhbV9iYW5kd2lkdGhfZm9yX2Rpc3Bs YXkoc3RydWN0IGRjZTZfd21fcGFyYW1zICp3bSkKK3sKKwlpZiAoZGNlX3Y2XzBfYXZlcmFnZV9i YW5kd2lkdGgod20pIDw9CisJICAgIChkY2VfdjZfMF9kcmFtX2JhbmR3aWR0aF9mb3JfZGlzcGxh eSh3bSkgLyB3bS0+bnVtX2hlYWRzKSkKKwkJcmV0dXJuIHRydWU7CisJZWxzZQorCQlyZXR1cm4g ZmFsc2U7Cit9CisKKy8qKgorICogZGNlX3Y2XzBfYXZlcmFnZV9iYW5kd2lkdGhfdnNfYXZhaWxh YmxlX2JhbmR3aWR0aCAtIGNoZWNrCisgKiBhdmVyYWdlIGFuZCBhdmFpbGFibGUgYmFuZHdpZHRo CisgKgorICogQHdtOiB3YXRlcm1hcmsgY2FsY3VsYXRpb24gZGF0YQorICoKKyAqIENoZWNrIGlm IHRoZSBkaXNwbGF5IGF2ZXJhZ2UgYmFuZHdpZHRoIGZpdHMgaW4gdGhlIGRpc3BsYXkKKyAqIGF2 YWlsYWJsZSBiYW5kd2lkdGggKENJSykuCisgKiBVc2VkIGZvciBkaXNwbGF5IHdhdGVybWFyayBi YW5kd2lkdGggY2FsY3VsYXRpb25zCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGRpc3BsYXkgZml0 cywgZmFsc2UgaWYgbm90LgorICovCitzdGF0aWMgYm9vbCBkY2VfdjZfMF9hdmVyYWdlX2JhbmR3 aWR0aF92c19hdmFpbGFibGVfYmFuZHdpZHRoKHN0cnVjdCBkY2U2X3dtX3BhcmFtcyAqd20pCit7 CisJaWYgKGRjZV92Nl8wX2F2ZXJhZ2VfYmFuZHdpZHRoKHdtKSA8PQorCSAgICAoZGNlX3Y2XzBf YXZhaWxhYmxlX2JhbmR3aWR0aCh3bSkgLyB3bS0+bnVtX2hlYWRzKSkKKwkJcmV0dXJuIHRydWU7 CisJZWxzZQorCQlyZXR1cm4gZmFsc2U7Cit9CisKKy8qKgorICogZGNlX3Y2XzBfY2hlY2tfbGF0 ZW5jeV9oaWRpbmcgLSBjaGVjayBsYXRlbmN5IGhpZGluZworICoKKyAqIEB3bTogd2F0ZXJtYXJr IGNhbGN1bGF0aW9uIGRhdGEKKyAqCisgKiBDaGVjayBsYXRlbmN5IGhpZGluZyAoQ0lLKS4KKyAq IFVzZWQgZm9yIGRpc3BsYXkgd2F0ZXJtYXJrIGJhbmR3aWR0aCBjYWxjdWxhdGlvbnMKKyAqIFJl dHVybnMgdHJ1ZSBpZiB0aGUgZGlzcGxheSBmaXRzLCBmYWxzZSBpZiBub3QuCisgKi8KK3N0YXRp YyBib29sIGRjZV92Nl8wX2NoZWNrX2xhdGVuY3lfaGlkaW5nKHN0cnVjdCBkY2U2X3dtX3BhcmFt cyAqd20pCit7CisJdTMyIGxiX3BhcnRpdGlvbnMgPSB3bS0+bGJfc2l6ZSAvIHdtLT5zcmNfd2lk dGg7CisJdTMyIGxpbmVfdGltZSA9IHdtLT5hY3RpdmVfdGltZSArIHdtLT5ibGFua190aW1lOwor CXUzMiBsYXRlbmN5X3RvbGVyYW50X2xpbmVzOworCXUzMiBsYXRlbmN5X2hpZGluZzsKKwlmaXhl ZDIwXzEyIGE7CisKKwlhLmZ1bGwgPSBkZml4ZWRfY29uc3QoMSk7CisJaWYgKHdtLT52c2MuZnVs bCA+IGEuZnVsbCkKKwkJbGF0ZW5jeV90b2xlcmFudF9saW5lcyA9IDE7CisJZWxzZSB7CisJCWlm IChsYl9wYXJ0aXRpb25zIDw9ICh3bS0+dnRhcHMgKyAxKSkKKwkJCWxhdGVuY3lfdG9sZXJhbnRf bGluZXMgPSAxOworCQllbHNlCisJCQlsYXRlbmN5X3RvbGVyYW50X2xpbmVzID0gMjsKKwl9CisK KwlsYXRlbmN5X2hpZGluZyA9IChsYXRlbmN5X3RvbGVyYW50X2xpbmVzICogbGluZV90aW1lICsg d20tPmJsYW5rX3RpbWUpOworCisJaWYgKGRjZV92Nl8wX2xhdGVuY3lfd2F0ZXJtYXJrKHdtKSA8 PSBsYXRlbmN5X2hpZGluZykKKwkJcmV0dXJuIHRydWU7CisJZWxzZQorCQlyZXR1cm4gZmFsc2U7 Cit9CisKKy8qKgorICogZGNlX3Y2XzBfcHJvZ3JhbV93YXRlcm1hcmtzIC0gcHJvZ3JhbSBkaXNw bGF5IHdhdGVybWFya3MKKyAqCisgKiBAYWRldjogYW1kZ3B1X2RldmljZSBwb2ludGVyCisgKiBA YW1kZ3B1X2NydGM6IHRoZSBzZWxlY3RlZCBkaXNwbGF5IGNvbnRyb2xsZXIKKyAqIEBsYl9zaXpl OiBsaW5lIGJ1ZmZlciBzaXplCisgKiBAbnVtX2hlYWRzOiBudW1iZXIgb2YgZGlzcGxheSBjb250 cm9sbGVycyBpbiB1c2UKKyAqCisgKiBDYWxjdWxhdGUgYW5kIHByb2dyYW0gdGhlIGRpc3BsYXkg d2F0ZXJtYXJrcyBmb3IgdGhlCisgKiBzZWxlY3RlZCBkaXNwbGF5IGNvbnRyb2xsZXIgKENJSyku CisgKi8KK3N0YXRpYyB2b2lkIGRjZV92Nl8wX3Byb2dyYW1fd2F0ZXJtYXJrcyhzdHJ1Y3QgYW1k Z3B1X2RldmljZSAqYWRldiwKKwkJCQkJc3RydWN0IGFtZGdwdV9jcnRjICphbWRncHVfY3J0YywK KwkJCQkJdTMyIGxiX3NpemUsIHUzMiBudW1faGVhZHMpCit7CisJc3RydWN0IGRybV9kaXNwbGF5 X21vZGUgKm1vZGUgPSAmYW1kZ3B1X2NydGMtPmJhc2UubW9kZTsKKwlzdHJ1Y3QgZGNlNl93bV9w YXJhbXMgd21fbG93LCB3bV9oaWdoOworCXUzMiBkcmFtX2NoYW5uZWxzOworCXUzMiBwaXhlbF9w ZXJpb2Q7CisJdTMyIGxpbmVfdGltZSA9IDA7CisJdTMyIGxhdGVuY3lfd2F0ZXJtYXJrX2EgPSAw LCBsYXRlbmN5X3dhdGVybWFya19iID0gMDsKKwl1MzIgcHJpb3JpdHlfYV9tYXJrID0gMCwgcHJp b3JpdHlfYl9tYXJrID0gMDsKKwl1MzIgcHJpb3JpdHlfYV9jbnQgPSBQUklPUklUWV9PRkY7CisJ dTMyIHByaW9yaXR5X2JfY250ID0gUFJJT1JJVFlfT0ZGOworCXUzMiB0bXAsIGFyYl9jb250cm9s MzsKKwlmaXhlZDIwXzEyIGEsIGIsIGM7CisKKwlpZiAoYW1kZ3B1X2NydGMtPmJhc2UuZW5hYmxl ZCAmJiBudW1faGVhZHMgJiYgbW9kZSkgeworCQlwaXhlbF9wZXJpb2QgPSAxMDAwMDAwIC8gKHUz Miltb2RlLT5jbG9jazsKKwkJbGluZV90aW1lID0gbWluKCh1MzIpbW9kZS0+Y3J0Y19odG90YWwg KiBwaXhlbF9wZXJpb2QsICh1MzIpNjU1MzUpOworCQlwcmlvcml0eV9hX2NudCA9IDA7CisJCXBy aW9yaXR5X2JfY250ID0gMDsKKworCQlkcmFtX2NoYW5uZWxzID0gc2lfZ2V0X251bWJlcl9vZl9k cmFtX2NoYW5uZWxzKGFkZXYpOworCisJCS8qIHdhdGVybWFyayBmb3IgaGlnaCBjbG9ja3MgKi8K KwkJaWYgKGFkZXYtPnBtLmRwbV9lbmFibGVkKSB7CisJCQl3bV9oaWdoLnljbGsgPQorCQkJCWFt ZGdwdV9kcG1fZ2V0X21jbGsoYWRldiwgZmFsc2UpICogMTA7CisJCQl3bV9oaWdoLnNjbGsgPQor CQkJCWFtZGdwdV9kcG1fZ2V0X3NjbGsoYWRldiwgZmFsc2UpICogMTA7CisJCX0gZWxzZSB7CisJ CQl3bV9oaWdoLnljbGsgPSBhZGV2LT5wbS5jdXJyZW50X21jbGsgKiAxMDsKKwkJCXdtX2hpZ2gu c2NsayA9IGFkZXYtPnBtLmN1cnJlbnRfc2NsayAqIDEwOworCQl9CisKKwkJd21faGlnaC5kaXNw X2NsayA9IG1vZGUtPmNsb2NrOworCQl3bV9oaWdoLnNyY193aWR0aCA9IG1vZGUtPmNydGNfaGRp c3BsYXk7CisJCXdtX2hpZ2guYWN0aXZlX3RpbWUgPSBtb2RlLT5jcnRjX2hkaXNwbGF5ICogcGl4 ZWxfcGVyaW9kOworCQl3bV9oaWdoLmJsYW5rX3RpbWUgPSBsaW5lX3RpbWUgLSB3bV9oaWdoLmFj dGl2ZV90aW1lOworCQl3bV9oaWdoLmludGVybGFjZWQgPSBmYWxzZTsKKwkJaWYgKG1vZGUtPmZs YWdzICYgRFJNX01PREVfRkxBR19JTlRFUkxBQ0UpCisJCQl3bV9oaWdoLmludGVybGFjZWQgPSB0 cnVlOworCQl3bV9oaWdoLnZzYyA9IGFtZGdwdV9jcnRjLT52c2M7CisJCXdtX2hpZ2gudnRhcHMg PSAxOworCQlpZiAoYW1kZ3B1X2NydGMtPnJteF90eXBlICE9IFJNWF9PRkYpCisJCQl3bV9oaWdo LnZ0YXBzID0gMjsKKwkJd21faGlnaC5ieXRlc19wZXJfcGl4ZWwgPSA0OyAvKiBYWFg6IGdldCB0 aGlzIGZyb20gZmIgY29uZmlnICovCisJCXdtX2hpZ2gubGJfc2l6ZSA9IGxiX3NpemU7CisJCXdt X2hpZ2guZHJhbV9jaGFubmVscyA9IGRyYW1fY2hhbm5lbHM7CisJCXdtX2hpZ2gubnVtX2hlYWRz ID0gbnVtX2hlYWRzOworCisJCWlmIChhZGV2LT5wbS5kcG1fZW5hYmxlZCkgeworCQkvKiB3YXRl cm1hcmsgZm9yIGxvdyBjbG9ja3MgKi8KKwkJCXdtX2xvdy55Y2xrID0KKwkJCQlhbWRncHVfZHBt X2dldF9tY2xrKGFkZXYsIHRydWUpICogMTA7CisJCQl3bV9sb3cuc2NsayA9CisJCQkJYW1kZ3B1 X2RwbV9nZXRfc2NsayhhZGV2LCB0cnVlKSAqIDEwOworCQl9IGVsc2UgeworCQkJd21fbG93Lnlj bGsgPSBhZGV2LT5wbS5jdXJyZW50X21jbGsgKiAxMDsKKwkJCXdtX2xvdy5zY2xrID0gYWRldi0+ cG0uY3VycmVudF9zY2xrICogMTA7CisJCX0KKworCQl3bV9sb3cuZGlzcF9jbGsgPSBtb2RlLT5j bG9jazsKKwkJd21fbG93LnNyY193aWR0aCA9IG1vZGUtPmNydGNfaGRpc3BsYXk7CisJCXdtX2xv dy5hY3RpdmVfdGltZSA9IG1vZGUtPmNydGNfaGRpc3BsYXkgKiBwaXhlbF9wZXJpb2Q7CisJCXdt X2xvdy5ibGFua190aW1lID0gbGluZV90aW1lIC0gd21fbG93LmFjdGl2ZV90aW1lOworCQl3bV9s b3cuaW50ZXJsYWNlZCA9IGZhbHNlOworCQlpZiAobW9kZS0+ZmxhZ3MgJiBEUk1fTU9ERV9GTEFH X0lOVEVSTEFDRSkKKwkJCXdtX2xvdy5pbnRlcmxhY2VkID0gdHJ1ZTsKKwkJd21fbG93LnZzYyA9 IGFtZGdwdV9jcnRjLT52c2M7CisJCXdtX2xvdy52dGFwcyA9IDE7CisJCWlmIChhbWRncHVfY3J0 Yy0+cm14X3R5cGUgIT0gUk1YX09GRikKKwkJCXdtX2xvdy52dGFwcyA9IDI7CisJCXdtX2xvdy5i eXRlc19wZXJfcGl4ZWwgPSA0OyAvKiBYWFg6IGdldCB0aGlzIGZyb20gZmIgY29uZmlnICovCisJ CXdtX2xvdy5sYl9zaXplID0gbGJfc2l6ZTsKKwkJd21fbG93LmRyYW1fY2hhbm5lbHMgPSBkcmFt X2NoYW5uZWxzOworCQl3bV9sb3cubnVtX2hlYWRzID0gbnVtX2hlYWRzOworCisJCS8qIHNldCBm b3IgaGlnaCBjbG9ja3MgKi8KKwkJbGF0ZW5jeV93YXRlcm1hcmtfYSA9IG1pbihkY2VfdjZfMF9s YXRlbmN5X3dhdGVybWFyaygmd21faGlnaCksICh1MzIpNjU1MzUpOworCQkvKiBzZXQgZm9yIGxv dyBjbG9ja3MgKi8KKwkJbGF0ZW5jeV93YXRlcm1hcmtfYiA9IG1pbihkY2VfdjZfMF9sYXRlbmN5 X3dhdGVybWFyaygmd21fbG93KSwgKHUzMik2NTUzNSk7CisKKwkJLyogcG9zc2libHkgZm9yY2Ug ZGlzcGxheSBwcmlvcml0eSB0byBoaWdoICovCisJCS8qIHNob3VsZCByZWFsbHkgZG8gdGhpcyBh dCBtb2RlIHZhbGlkYXRpb24gdGltZS4uLiAqLworCQlpZiAoIWRjZV92Nl8wX2F2ZXJhZ2VfYmFu ZHdpZHRoX3ZzX2RyYW1fYmFuZHdpZHRoX2Zvcl9kaXNwbGF5KCZ3bV9oaWdoKSB8fAorCQkgICAg IWRjZV92Nl8wX2F2ZXJhZ2VfYmFuZHdpZHRoX3ZzX2F2YWlsYWJsZV9iYW5kd2lkdGgoJndtX2hp Z2gpIHx8CisJCSAgICAhZGNlX3Y2XzBfY2hlY2tfbGF0ZW5jeV9oaWRpbmcoJndtX2hpZ2gpIHx8 CisJCSAgICAoYWRldi0+bW9kZV9pbmZvLmRpc3BfcHJpb3JpdHkgPT0gMikpIHsKKwkJCURSTV9E RUJVR19LTVMoImZvcmNlIHByaW9yaXR5IHRvIGhpZ2hcbiIpOworCQkJcHJpb3JpdHlfYV9jbnQg fD0gUFJJT1JJVFlfQUxXQVlTX09OOworCQkJcHJpb3JpdHlfYl9jbnQgfD0gUFJJT1JJVFlfQUxX QVlTX09OOworCQl9CisJCWlmICghZGNlX3Y2XzBfYXZlcmFnZV9iYW5kd2lkdGhfdnNfZHJhbV9i YW5kd2lkdGhfZm9yX2Rpc3BsYXkoJndtX2xvdykgfHwKKwkJICAgICFkY2VfdjZfMF9hdmVyYWdl X2JhbmR3aWR0aF92c19hdmFpbGFibGVfYmFuZHdpZHRoKCZ3bV9sb3cpIHx8CisJCSAgICAhZGNl X3Y2XzBfY2hlY2tfbGF0ZW5jeV9oaWRpbmcoJndtX2xvdykgfHwKKwkJICAgIChhZGV2LT5tb2Rl X2luZm8uZGlzcF9wcmlvcml0eSA9PSAyKSkgeworCQkJRFJNX0RFQlVHX0tNUygiZm9yY2UgcHJp b3JpdHkgdG8gaGlnaFxuIik7CisJCQlwcmlvcml0eV9hX2NudCB8PSBQUklPUklUWV9BTFdBWVNf T047CisJCQlwcmlvcml0eV9iX2NudCB8PSBQUklPUklUWV9BTFdBWVNfT047CisJCX0KKworCQlh LmZ1bGwgPSBkZml4ZWRfY29uc3QoMTAwMCk7CisJCWIuZnVsbCA9IGRmaXhlZF9jb25zdChtb2Rl LT5jbG9jayk7CisJCWIuZnVsbCA9IGRmaXhlZF9kaXYoYiwgYSk7CisJCWMuZnVsbCA9IGRmaXhl ZF9jb25zdChsYXRlbmN5X3dhdGVybWFya19hKTsKKwkJYy5mdWxsID0gZGZpeGVkX211bChjLCBi KTsKKwkJYy5mdWxsID0gZGZpeGVkX211bChjLCBhbWRncHVfY3J0Yy0+aHNjKTsKKwkJYy5mdWxs ID0gZGZpeGVkX2RpdihjLCBhKTsKKwkJYS5mdWxsID0gZGZpeGVkX2NvbnN0KDE2KTsKKwkJYy5m dWxsID0gZGZpeGVkX2RpdihjLCBhKTsKKwkJcHJpb3JpdHlfYV9tYXJrID0gZGZpeGVkX3RydW5j KGMpOworCQlwcmlvcml0eV9hX2NudCB8PSBwcmlvcml0eV9hX21hcmsgJiBQUklPUklUWV9NQVJL X01BU0s7CisKKwkJYS5mdWxsID0gZGZpeGVkX2NvbnN0KDEwMDApOworCQliLmZ1bGwgPSBkZml4 ZWRfY29uc3QobW9kZS0+Y2xvY2spOworCQliLmZ1bGwgPSBkZml4ZWRfZGl2KGIsIGEpOworCQlj LmZ1bGwgPSBkZml4ZWRfY29uc3QobGF0ZW5jeV93YXRlcm1hcmtfYik7CisJCWMuZnVsbCA9IGRm aXhlZF9tdWwoYywgYik7CisJCWMuZnVsbCA9IGRmaXhlZF9tdWwoYywgYW1kZ3B1X2NydGMtPmhz Yyk7CisJCWMuZnVsbCA9IGRmaXhlZF9kaXYoYywgYSk7CisJCWEuZnVsbCA9IGRmaXhlZF9jb25z dCgxNik7CisJCWMuZnVsbCA9IGRmaXhlZF9kaXYoYywgYSk7CisJCXByaW9yaXR5X2JfbWFyayA9 IGRmaXhlZF90cnVuYyhjKTsKKwkJcHJpb3JpdHlfYl9jbnQgfD0gcHJpb3JpdHlfYl9tYXJrICYg UFJJT1JJVFlfTUFSS19NQVNLOworCX0KKworCS8qIHNlbGVjdCB3bSBBICovCisJYXJiX2NvbnRy b2wzID0gUlJFRzMyKERQR19QSVBFX0FSQklUUkFUSU9OX0NPTlRST0wzICsgYW1kZ3B1X2NydGMt PmNydGNfb2Zmc2V0KTsKKwl0bXAgPSBhcmJfY29udHJvbDM7CisJdG1wICY9IH5MQVRFTkNZX1dB VEVSTUFSS19NQVNLKDMpOworCXRtcCB8PSBMQVRFTkNZX1dBVEVSTUFSS19NQVNLKDEpOworCVdS RUczMihEUEdfUElQRV9BUkJJVFJBVElPTl9DT05UUk9MMyArIGFtZGdwdV9jcnRjLT5jcnRjX29m ZnNldCwgdG1wKTsKKwlXUkVHMzIoRFBHX1BJUEVfTEFURU5DWV9DT05UUk9MICsgYW1kZ3B1X2Ny dGMtPmNydGNfb2Zmc2V0LAorCSAgICAgICAoTEFURU5DWV9MT1dfV0FURVJNQVJLKGxhdGVuY3lf d2F0ZXJtYXJrX2EpIHwKKwkJTEFURU5DWV9ISUdIX1dBVEVSTUFSSyhsaW5lX3RpbWUpKSk7CisJ Lyogc2VsZWN0IHdtIEIgKi8KKwl0bXAgPSBSUkVHMzIoRFBHX1BJUEVfQVJCSVRSQVRJT05fQ09O VFJPTDMgKyBhbWRncHVfY3J0Yy0+Y3J0Y19vZmZzZXQpOworCXRtcCAmPSB+TEFURU5DWV9XQVRF Uk1BUktfTUFTSygzKTsKKwl0bXAgfD0gTEFURU5DWV9XQVRFUk1BUktfTUFTSygyKTsKKwlXUkVH MzIoRFBHX1BJUEVfQVJCSVRSQVRJT05fQ09OVFJPTDMgKyBhbWRncHVfY3J0Yy0+Y3J0Y19vZmZz ZXQsIHRtcCk7CisJV1JFRzMyKERQR19QSVBFX0xBVEVOQ1lfQ09OVFJPTCArIGFtZGdwdV9jcnRj LT5jcnRjX29mZnNldCwKKwkgICAgICAgKExBVEVOQ1lfTE9XX1dBVEVSTUFSSyhsYXRlbmN5X3dh dGVybWFya19iKSB8CisJCUxBVEVOQ1lfSElHSF9XQVRFUk1BUksobGluZV90aW1lKSkpOworCS8q IHJlc3RvcmUgb3JpZ2luYWwgc2VsZWN0aW9uICovCisJV1JFRzMyKERQR19QSVBFX0FSQklUUkFU SU9OX0NPTlRST0wzICsgYW1kZ3B1X2NydGMtPmNydGNfb2Zmc2V0LCBhcmJfY29udHJvbDMpOwor CisJLyogd3JpdGUgdGhlIHByaW9yaXR5IG1hcmtzICovCisJV1JFRzMyKFBSSU9SSVRZX0FfQ05U ICsgYW1kZ3B1X2NydGMtPmNydGNfb2Zmc2V0LCBwcmlvcml0eV9hX2NudCk7CisJV1JFRzMyKFBS SU9SSVRZX0JfQ05UICsgYW1kZ3B1X2NydGMtPmNydGNfb2Zmc2V0LCBwcmlvcml0eV9iX2NudCk7 CisKKwkvKiBzYXZlIHZhbHVlcyBmb3IgRFBNICovCisJYW1kZ3B1X2NydGMtPmxpbmVfdGltZSA9 IGxpbmVfdGltZTsKKwlhbWRncHVfY3J0Yy0+d21faGlnaCA9IGxhdGVuY3lfd2F0ZXJtYXJrX2E7 Cit9CisKKy8qIHdhdGVybWFyayBzZXR1cCAqLworc3RhdGljIHUzMiBkY2VfdjZfMF9saW5lX2J1 ZmZlcl9hZGp1c3Qoc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYsCisJCQkJICAgc3RydWN0IGFt ZGdwdV9jcnRjICphbWRncHVfY3J0YywKKwkJCQkgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAq bW9kZSwKKwkJCQkgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqb3RoZXJfbW9kZSkKK3sKKwl1 MzIgdG1wLCBidWZmZXJfYWxsb2MsIGk7CisJdTMyIHBpcGVfb2Zmc2V0ID0gYW1kZ3B1X2NydGMt PmNydGNfaWQgKiAweDg7CisJLyoKKwkgKiBMaW5lIEJ1ZmZlciBTZXR1cAorCSAqIFRoZXJlIGFy ZSAzIGxpbmUgYnVmZmVycywgZWFjaCBvbmUgc2hhcmVkIGJ5IDIgZGlzcGxheSBjb250cm9sbGVy cy4KKwkgKiBEQ19MQl9NRU1PUllfU1BMSVQgY29udHJvbHMgaG93IHRoYXQgbGluZSBidWZmZXIg aXMgc2hhcmVkIGJldHdlZW4KKwkgKiB0aGUgZGlzcGxheSBjb250cm9sbGVycy4gIFRoZSBwYXJp dGlvbmluZyBpcyBkb25lIHZpYSBvbmUgb2YgZm91cgorCSAqIHByZXNldCBhbGxvY2F0aW9ucyBz cGVjaWZpZWQgaW4gYml0cyAyMToyMDoKKwkgKiAgMCAtIGhhbGYgbGIKKwkgKiAgMiAtIHdob2xl IGxiLCBvdGhlciBjcnRjIG11c3QgYmUgZGlzYWJsZWQKKwkgKi8KKwkvKiB0aGlzIGNhbiBnZXQg dHJpY2t5IGlmIHdlIGhhdmUgdHdvIGxhcmdlIGRpc3BsYXlzIG9uIGEgcGFpcmVkIGdyb3VwCisJ ICogb2YgY3J0Y3MuICBJZGVhbGx5IGZvciBtdWx0aXBsZSBsYXJnZSBkaXNwbGF5cyB3ZSdkIGFz c2lnbiB0aGVtIHRvCisJICogbm9uLWxpbmtlZCBjcnRjcyBmb3IgbWF4aW11bSBsaW5lIGJ1ZmZl ciBhbGxvY2F0aW9uLgorCSAqLworCWlmIChhbWRncHVfY3J0Yy0+YmFzZS5lbmFibGVkICYmIG1v ZGUpIHsKKwkJaWYgKG90aGVyX21vZGUpIHsKKwkJCXRtcCA9IDA7IC8qIDEvMiAqLworCQkJYnVm ZmVyX2FsbG9jID0gMTsKKwkJfSBlbHNlIHsKKwkJCXRtcCA9IDI7IC8qIHdob2xlICovCisJCQli dWZmZXJfYWxsb2MgPSAyOworCQl9CisJfSBlbHNlIHsKKwkJdG1wID0gMDsKKwkJYnVmZmVyX2Fs bG9jID0gMDsKKwl9CisKKwlXUkVHMzIoRENfTEJfTUVNT1JZX1NQTElUICsgYW1kZ3B1X2NydGMt PmNydGNfb2Zmc2V0LAorCSAgICAgICBEQ19MQl9NRU1PUllfQ09ORklHKHRtcCkpOworCisJV1JF RzMyKFBJUEUwX0RNSUZfQlVGRkVSX0NPTlRST0wgKyBwaXBlX29mZnNldCwKKwkgICAgICAgRE1J Rl9CVUZGRVJTX0FMTE9DQVRFRChidWZmZXJfYWxsb2MpKTsKKwlmb3IgKGkgPSAwOyBpIDwgYWRl di0+dXNlY190aW1lb3V0OyBpKyspIHsKKwkJaWYgKFJSRUczMihQSVBFMF9ETUlGX0JVRkZFUl9D T05UUk9MICsgcGlwZV9vZmZzZXQpICYKKwkJICAgIERNSUZfQlVGRkVSU19BTExPQ0FURURfQ09N UExFVEVEKQorCQkJYnJlYWs7CisJCXVkZWxheSgxKTsKKwl9CisKKwlpZiAoYW1kZ3B1X2NydGMt PmJhc2UuZW5hYmxlZCAmJiBtb2RlKSB7CisJCXN3aXRjaCAodG1wKSB7CisJCWNhc2UgMDoKKwkJ ZGVmYXVsdDoKKwkJCXJldHVybiA0MDk2ICogMjsKKwkJY2FzZSAyOgorCQkJcmV0dXJuIDgxOTIg KiAyOworCQl9CisJfQorCisJLyogY29udHJvbGxlciBub3QgZW5hYmxlZCwgc28gbm8gbGIgdXNl ZCAqLworCXJldHVybiAwOworfQorCisKKy8qKgorICoKKyAqIGRjZV92Nl8wX2JhbmR3aWR0aF91 cGRhdGUgLSBwcm9ncmFtIGRpc3BsYXkgd2F0ZXJtYXJrcworICoKKyAqIEBhZGV2OiBhbWRncHVf ZGV2aWNlIHBvaW50ZXIKKyAqCisgKiBDYWxjdWxhdGUgYW5kIHByb2dyYW0gdGhlIGRpc3BsYXkg d2F0ZXJtYXJrcyBhbmQgbGluZQorICogYnVmZmVyIGFsbG9jYXRpb24gKENJSykuCisgKi8KK3N0 YXRpYyB2b2lkIGRjZV92Nl8wX2JhbmR3aWR0aF91cGRhdGUoc3RydWN0IGFtZGdwdV9kZXZpY2Ug KmFkZXYpCit7CisJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUwID0gTlVMTDsKKwlzdHJ1 Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZTEgPSBOVUxMOworCXUzMiBudW1faGVhZHMgPSAwLCBs Yl9zaXplOworCWludCBpOworCisJaWYgKCFhZGV2LT5tb2RlX2luZm8ubW9kZV9jb25maWdfaW5p dGlhbGl6ZWQpCisJCXJldHVybjsKKworCWFtZGdwdV91cGRhdGVfZGlzcGxheV9wcmlvcml0eShh ZGV2KTsKKworCWZvciAoaSA9IDA7IGkgPCBhZGV2LT5tb2RlX2luZm8ubnVtX2NydGM7IGkrKykg eworCQlpZiAoYWRldi0+bW9kZV9pbmZvLmNydGNzW2ldLT5iYXNlLmVuYWJsZWQpCisJCQludW1f aGVhZHMrKzsKKwl9CisJZm9yIChpID0gMDsgaSA8IGFkZXYtPm1vZGVfaW5mby5udW1fY3J0Yzsg aSArPSAyKSB7CisJCW1vZGUwID0gJmFkZXYtPm1vZGVfaW5mby5jcnRjc1tpXS0+YmFzZS5tb2Rl OworCQltb2RlMSA9ICZhZGV2LT5tb2RlX2luZm8uY3J0Y3NbaSsxXS0+YmFzZS5tb2RlOworCQls Yl9zaXplID0gZGNlX3Y2XzBfbGluZV9idWZmZXJfYWRqdXN0KGFkZXYsIGFkZXYtPm1vZGVfaW5m by5jcnRjc1tpXSwgbW9kZTAsIG1vZGUxKTsKKwkJZGNlX3Y2XzBfcHJvZ3JhbV93YXRlcm1hcmtz KGFkZXYsIGFkZXYtPm1vZGVfaW5mby5jcnRjc1tpXSwgbGJfc2l6ZSwgbnVtX2hlYWRzKTsKKwkJ bGJfc2l6ZSA9IGRjZV92Nl8wX2xpbmVfYnVmZmVyX2FkanVzdChhZGV2LCBhZGV2LT5tb2RlX2lu Zm8uY3J0Y3NbaSsxXSwgbW9kZTEsIG1vZGUwKTsKKwkJZGNlX3Y2XzBfcHJvZ3JhbV93YXRlcm1h cmtzKGFkZXYsIGFkZXYtPm1vZGVfaW5mby5jcnRjc1tpKzFdLCBsYl9zaXplLCBudW1faGVhZHMp OworCX0KK30KKy8qCitzdGF0aWMgdm9pZCBkY2VfdjZfMF9hdWRpb19nZXRfY29ubmVjdGVkX3Bp bnMoc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYpCit7CisJaW50IGk7CisJdTMyIG9mZnNldCwg dG1wOworCisJZm9yIChpID0gMDsgaSA8IGFkZXYtPm1vZGVfaW5mby5hdWRpby5udW1fcGluczsg aSsrKSB7CisJCW9mZnNldCA9IGFkZXYtPm1vZGVfaW5mby5hdWRpby5waW5baV0ub2Zmc2V0Owor CQl0bXAgPSBSUkVHMzJfQVVESU9fRU5EUFQob2Zmc2V0LAorCQkJCSAgICAgIEFaX0YwX0NPREVD X1BJTl9DT05UUk9MX1JFU1BPTlNFX0NPTkZJR1VSQVRJT05fREVGQVVMVCk7CisJCWlmICgoKHRt cCAmIFBPUlRfQ09OTkVDVElWSVRZX01BU0spID4+IFBPUlRfQ09OTkVDVElWSVRZX1NISUZUKSA9 PSAxKQorCQkJYWRldi0+bW9kZV9pbmZvLmF1ZGlvLnBpbltpXS5jb25uZWN0ZWQgPSBmYWxzZTsK KwkJZWxzZQorCQkJYWRldi0+bW9kZV9pbmZvLmF1ZGlvLnBpbltpXS5jb25uZWN0ZWQgPSB0cnVl OworCX0KKworfQorCitzdGF0aWMgc3RydWN0IGFtZGdwdV9hdWRpb19waW4gKmRjZV92Nl8wX2F1 ZGlvX2dldF9waW4oc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYpCit7CisJaW50IGk7CisKKwlk Y2VfdjZfMF9hdWRpb19nZXRfY29ubmVjdGVkX3BpbnMoYWRldik7CisKKwlmb3IgKGkgPSAwOyBp IDwgYWRldi0+bW9kZV9pbmZvLmF1ZGlvLm51bV9waW5zOyBpKyspIHsKKwkJaWYgKGFkZXYtPm1v ZGVfaW5mby5hdWRpby5waW5baV0uY29ubmVjdGVkKQorCQkJcmV0dXJuICZhZGV2LT5tb2RlX2lu Zm8uYXVkaW8ucGluW2ldOworCX0KKwlEUk1fRVJST1IoIk5vIGNvbm5lY3RlZCBhdWRpbyBwaW5z IGZvdW5kIVxuIik7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIGRjZV92Nl8wX2Fm bXRfYXVkaW9fc2VsZWN0X3BpbihzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCit7CisJc3Ry dWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYgPSBlbmNvZGVyLT5kZXYtPmRldl9wcml2YXRlOworCXN0 cnVjdCBhbWRncHVfZW5jb2RlciAqYW1kZ3B1X2VuY29kZXIgPSB0b19hbWRncHVfZW5jb2Rlcihl bmNvZGVyKTsKKwlzdHJ1Y3QgYW1kZ3B1X2VuY29kZXJfYXRvbV9kaWcgKmRpZyA9IGFtZGdwdV9l bmNvZGVyLT5lbmNfcHJpdjsKKwl1MzIgb2Zmc2V0OworCisJaWYgKCFkaWcgfHwgIWRpZy0+YWZt dCB8fCAhZGlnLT5hZm10LT5waW4pCisJCXJldHVybjsKKworCW9mZnNldCA9IGRpZy0+YWZtdC0+ b2Zmc2V0OworCisJV1JFRzMyKEFGTVRfQVVESU9fU1JDX0NPTlRST0wgKyBvZmZzZXQsCisJICAg ICAgIEFGTVRfQVVESU9fU1JDX1NFTEVDVChkaWctPmFmbXQtPnBpbi0+aWQpKTsKKworfQorCitz dGF0aWMgdm9pZCBkY2VfdjZfMF9hdWRpb193cml0ZV9sYXRlbmN5X2ZpZWxkcyhzdHJ1Y3QgZHJt X2VuY29kZXIgKmVuY29kZXIsCisJCQkJCQlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSkK K3sKKwlEUk1fSU5GTygieHh4eDogZGNlX3Y2XzBfYXVkaW9fd3JpdGVfbGF0ZW5jeV9maWVsZHMt LS1ubyBpbXAhISEhIVxuIik7Cit9CisKK3N0YXRpYyB2b2lkIGRjZV92Nl8wX2F1ZGlvX3dyaXRl X3NwZWFrZXJfYWxsb2NhdGlvbihzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCit7CisJRFJN X0lORk8oInh4eHg6IGRjZV92Nl8wX2F1ZGlvX3dyaXRlX3NwZWFrZXJfYWxsb2NhdGlvbi0tLW5v IGltcCEhISEhXG4iKTsKK30KKworc3RhdGljIHZvaWQgZGNlX3Y2XzBfYXVkaW9fd3JpdGVfc2Fk X3JlZ3Moc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQoreworCURSTV9JTkZPKCJ4eHh4OiBk Y2VfdjZfMF9hdWRpb193cml0ZV9zYWRfcmVncy0tLW5vIGltcCEhISEhXG4iKTsKKworfQorKi8K K3N0YXRpYyB2b2lkIGRjZV92Nl8wX2F1ZGlvX2VuYWJsZShzdHJ1Y3QgYW1kZ3B1X2RldmljZSAq YWRldiwKKwkJCQkgIHN0cnVjdCBhbWRncHVfYXVkaW9fcGluICpwaW4sCisJCQkJICBib29sIGVu YWJsZSkKK3sKKwlEUk1fSU5GTygieHh4eDogZGNlX3Y2XzBfYXVkaW9fZW5hYmxlLS0tbm8gaW1w ISEhISFcbiIpOworfQorCitzdGF0aWMgY29uc3QgdTMyIHBpbl9vZmZzZXRzWzddID0KK3sKKwko MHgxNzgwIC0gMHgxNzgwKSwKKwkoMHgxNzg2IC0gMHgxNzgwKSwKKwkoMHgxNzhjIC0gMHgxNzgw KSwKKwkoMHgxNzkyIC0gMHgxNzgwKSwKKwkoMHgxNzk4IC0gMHgxNzgwKSwKKwkoMHgxNzlkIC0g MHgxNzgwKSwKKwkoMHgxN2E0IC0gMHgxNzgwKSwKK307CisKK3N0YXRpYyBpbnQgZGNlX3Y2XzBf YXVkaW9faW5pdChzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldikKK3sKKworCURSTV9JTkZPKCJ4 eHh4OiBkY2VfdjZfMF9hdWRpb19pbml0LS0tbm8gaW1wISEhISFcbiIpOworCisJcmV0dXJuIDA7 Cit9CisKK3N0YXRpYyB2b2lkIGRjZV92Nl8wX2F1ZGlvX2Zpbmkoc3RydWN0IGFtZGdwdV9kZXZp Y2UgKmFkZXYpCit7CisJRFJNX0lORk8oInh4eHg6IGRjZV92Nl8wX2F1ZGlvX2ZpbmktLS1ubyBp bXAhISEhIVxuIik7Cit9CisKKy8qCitzdGF0aWMgdm9pZCBkY2VfdjZfMF9hZm10X3VwZGF0ZV9B Q1Ioc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCB1aW50MzJfdCBjbG9jaykKK3sKKwlEUk1f SU5GTygieHh4eDogZGNlX3Y2XzBfYWZtdF91cGRhdGVfQUNSLS0tbm8gaW1wISEhISFcbiIpOwor fQorKi8KKy8qCisgKiBidWlsZCBhIEhETUkgVmlkZW8gSW5mbyBGcmFtZQorICovCisvKgorc3Rh dGljIHZvaWQgZGNlX3Y2XzBfYWZtdF91cGRhdGVfYXZpX2luZm9mcmFtZShzdHJ1Y3QgZHJtX2Vu Y29kZXIgKmVuY29kZXIsCisJCQkJCSAgICAgICB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplKQor eworCURSTV9JTkZPKCJ4eHh4OiBkY2VfdjZfMF9hZm10X3VwZGF0ZV9hdmlfaW5mb2ZyYW1lLS0t bm8gaW1wISEhISFcbiIpOworfQorCitzdGF0aWMgdm9pZCBkY2VfdjZfMF9hdWRpb19zZXRfZHRv KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwgdTMyIGNsb2NrKQoreworCURSTV9JTkZPKCJ4 eHh4OiBkY2VfdjZfMF9hdWRpb19zZXRfZHRvLS0tbm8gaW1wISEhISFcbiIpOworfQorKi8KKy8q CisgKiB1cGRhdGUgdGhlIGluZm8gZnJhbWVzIHdpdGggdGhlIGRhdGEgZnJvbSB0aGUgY3VycmVu dCBkaXNwbGF5IG1vZGUKKyAqLworc3RhdGljIHZvaWQgZGNlX3Y2XzBfYWZtdF9zZXRtb2RlKHN0 cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwKKwkJCQkgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2Rl ICptb2RlKQoreworCURSTV9JTkZPKCJ4eHh4OiBkY2VfdjZfMF9hZm10X3NldG1vZGUgLS0tLW5v IGltcGwgISEhISEhISFcbiIpOworfQorCitzdGF0aWMgdm9pZCBkY2VfdjZfMF9hZm10X2VuYWJs ZShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsIGJvb2wgZW5hYmxlKQoreworCXN0cnVjdCBk cm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7CisJc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFk ZXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBhbWRncHVfZW5jb2RlciAqYW1kZ3B1X2Vu Y29kZXIgPSB0b19hbWRncHVfZW5jb2RlcihlbmNvZGVyKTsKKwlzdHJ1Y3QgYW1kZ3B1X2VuY29k ZXJfYXRvbV9kaWcgKmRpZyA9IGFtZGdwdV9lbmNvZGVyLT5lbmNfcHJpdjsKKworCWlmICghZGln IHx8ICFkaWctPmFmbXQpCisJCXJldHVybjsKKworCS8qIFNpbGVudCwgcjYwMF9oZG1pX2VuYWJs ZSB3aWxsIHJhaXNlIFdBUk4gZm9yIHVzICovCisJaWYgKGVuYWJsZSAmJiBkaWctPmFmbXQtPmVu YWJsZWQpCisJCXJldHVybjsKKwlpZiAoIWVuYWJsZSAmJiAhZGlnLT5hZm10LT5lbmFibGVkKQor CQlyZXR1cm47CisKKwlpZiAoIWVuYWJsZSAmJiBkaWctPmFmbXQtPnBpbikgeworCQlkY2VfdjZf MF9hdWRpb19lbmFibGUoYWRldiwgZGlnLT5hZm10LT5waW4sIGZhbHNlKTsKKwkJZGlnLT5hZm10 LT5waW4gPSBOVUxMOworCX0KKworCWRpZy0+YWZtdC0+ZW5hYmxlZCA9IGVuYWJsZTsKKworCURS TV9ERUJVRygiJXNhYmxpbmcgQUZNVCBpbnRlcmZhY2UgQCAweCUwNFggZm9yIGVuY29kZXIgMHgl eFxuIiwKKwkJICBlbmFibGUgPyAiRW4iIDogIkRpcyIsIGRpZy0+YWZtdC0+b2Zmc2V0LCBhbWRn cHVfZW5jb2Rlci0+ZW5jb2Rlcl9pZCk7Cit9CisKK3N0YXRpYyB2b2lkIGRjZV92Nl8wX2FmbXRf aW5pdChzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9 IDA7IGkgPCBhZGV2LT5tb2RlX2luZm8ubnVtX2RpZzsgaSsrKQorCQlhZGV2LT5tb2RlX2luZm8u YWZtdFtpXSA9IE5VTEw7CisKKwkvKiBEQ0U4IGhhcyBhdWRpbyBibG9ja3MgdGllZCB0byBESUcg ZW5jb2RlcnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgYWRldi0+bW9kZV9pbmZvLm51bV9kaWc7IGkr KykgeworCQlhZGV2LT5tb2RlX2luZm8uYWZtdFtpXSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBh bWRncHVfYWZtdCksIEdGUF9LRVJORUwpOworCQlpZiAoYWRldi0+bW9kZV9pbmZvLmFmbXRbaV0p IHsKKwkJCWFkZXYtPm1vZGVfaW5mby5hZm10W2ldLT5vZmZzZXQgPSBkaWdfb2Zmc2V0c1tpXTsK KwkJCWFkZXYtPm1vZGVfaW5mby5hZm10W2ldLT5pZCA9IGk7CisJCX0KKwl9Cit9CisKK3N0YXRp YyB2b2lkIGRjZV92Nl8wX2FmbXRfZmluaShzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldikKK3sK KwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBhZGV2LT5tb2RlX2luZm8ubnVtX2RpZzsgaSsr KSB7CisJCWtmcmVlKGFkZXYtPm1vZGVfaW5mby5hZm10W2ldKTsKKwkJYWRldi0+bW9kZV9pbmZv LmFmbXRbaV0gPSBOVUxMOworCX0KK30KKworc3RhdGljIGNvbnN0IHUzMiB2Z2FfY29udHJvbF9y ZWdzWzZdID0KK3sKKwlBVklWT19EMVZHQV9DT05UUk9MLAorCUFWSVZPX0QyVkdBX0NPTlRST0ws CisJRVZFUkdSRUVOX0QzVkdBX0NPTlRST0wsCisJRVZFUkdSRUVOX0Q0VkdBX0NPTlRST0wsCisJ RVZFUkdSRUVOX0Q1VkdBX0NPTlRST0wsCisJRVZFUkdSRUVOX0Q2VkdBX0NPTlRST0wsCit9Owor CitzdGF0aWMgdm9pZCBkY2VfdjZfMF92Z2FfZW5hYmxlKHN0cnVjdCBkcm1fY3J0YyAqY3J0Yywg Ym9vbCBlbmFibGUpCit7CisJc3RydWN0IGFtZGdwdV9jcnRjICphbWRncHVfY3J0YyA9IHRvX2Ft ZGdwdV9jcnRjKGNydGMpOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjcnRjLT5kZXY7CisJ c3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYgPSBkZXYtPmRldl9wcml2YXRlOworCXUzMiB2Z2Ff Y29udHJvbDsKKworCXZnYV9jb250cm9sID0gUlJFRzMyKHZnYV9jb250cm9sX3JlZ3NbYW1kZ3B1 X2NydGMtPmNydGNfaWRdKSAmIH4xOworCWlmIChlbmFibGUpCisJCVdSRUczMih2Z2FfY29udHJv bF9yZWdzW2FtZGdwdV9jcnRjLT5jcnRjX2lkXSwgdmdhX2NvbnRyb2wgfCAxKTsKKwllbHNlCisJ CVdSRUczMih2Z2FfY29udHJvbF9yZWdzW2FtZGdwdV9jcnRjLT5jcnRjX2lkXSwgdmdhX2NvbnRy b2wpOworfQorCitzdGF0aWMgdm9pZCBkY2VfdjZfMF9ncnBoX2VuYWJsZShzdHJ1Y3QgZHJtX2Ny dGMgKmNydGMsIGJvb2wgZW5hYmxlKQoreworCXN0cnVjdCBhbWRncHVfY3J0YyAqYW1kZ3B1X2Ny dGMgPSB0b19hbWRncHVfY3J0YyhjcnRjKTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY3J0 Yy0+ZGV2OworCXN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2ID0gZGV2LT5kZXZfcHJpdmF0ZTsK KworCWlmIChlbmFibGUpCisJCVdSRUczMihFVkVSR1JFRU5fR1JQSF9FTkFCTEUgKyBhbWRncHVf Y3J0Yy0+Y3J0Y19vZmZzZXQsIDEpOworCWVsc2UKKwkJV1JFRzMyKEVWRVJHUkVFTl9HUlBIX0VO QUJMRSArIGFtZGdwdV9jcnRjLT5jcnRjX29mZnNldCwgMCk7Cit9CisKKworc3RhdGljIHZvaWQg ZXZlcmdyZWVuX3RpbGluZ19maWVsZHModW5zaWduZWQgdGlsaW5nX2ZsYWdzLCB1bnNpZ25lZCAq YmFua3csCisJCQkgICAgIHVuc2lnbmVkICpiYW5raCwgdW5zaWduZWQgKm10YXNwZWN0LAorCQkJ ICAgICB1bnNpZ25lZCAqdGlsZV9zcGxpdCkKK3sKKwkqYmFua3cgPSAodGlsaW5nX2ZsYWdzID4+ IFJBREVPTl9USUxJTkdfRUdfQkFOS1dfU0hJRlQpICYgUkFERU9OX1RJTElOR19FR19CQU5LV19N QVNLOworCSpiYW5raCA9ICh0aWxpbmdfZmxhZ3MgPj4gUkFERU9OX1RJTElOR19FR19CQU5LSF9T SElGVCkgJiBSQURFT05fVElMSU5HX0VHX0JBTktIX01BU0s7CisJKm10YXNwZWN0ID0gKHRpbGlu Z19mbGFncyA+PiBSQURFT05fVElMSU5HX0VHX01BQ1JPX1RJTEVfQVNQRUNUX1NISUZUKSAmIFJB REVPTl9USUxJTkdfRUdfTUFDUk9fVElMRV9BU1BFQ1RfTUFTSzsKKwkqdGlsZV9zcGxpdCA9ICh0 aWxpbmdfZmxhZ3MgPj4gUkFERU9OX1RJTElOR19FR19USUxFX1NQTElUX1NISUZUKSAmIFJBREVP Tl9USUxJTkdfRUdfVElMRV9TUExJVF9NQVNLOworCXN3aXRjaCAoKmJhbmt3KSB7CisJZGVmYXVs dDoKKwljYXNlIDE6ICpiYW5rdyA9IEVWRVJHUkVFTl9BRERSX1NVUkZfQkFOS19XSURUSF8xOyBi cmVhazsKKwljYXNlIDI6ICpiYW5rdyA9IEVWRVJHUkVFTl9BRERSX1NVUkZfQkFOS19XSURUSF8y OyBicmVhazsKKwljYXNlIDQ6ICpiYW5rdyA9IEVWRVJHUkVFTl9BRERSX1NVUkZfQkFOS19XSURU SF80OyBicmVhazsKKwljYXNlIDg6ICpiYW5rdyA9IEVWRVJHUkVFTl9BRERSX1NVUkZfQkFOS19X SURUSF84OyBicmVhazsKKwl9CisJc3dpdGNoICgqYmFua2gpIHsKKwlkZWZhdWx0OgorCWNhc2Ug MTogKmJhbmtoID0gRVZFUkdSRUVOX0FERFJfU1VSRl9CQU5LX0hFSUdIVF8xOyBicmVhazsKKwlj YXNlIDI6ICpiYW5raCA9IEVWRVJHUkVFTl9BRERSX1NVUkZfQkFOS19IRUlHSFRfMjsgYnJlYWs7 CisJY2FzZSA0OiAqYmFua2ggPSBFVkVSR1JFRU5fQUREUl9TVVJGX0JBTktfSEVJR0hUXzQ7IGJy ZWFrOworCWNhc2UgODogKmJhbmtoID0gRVZFUkdSRUVOX0FERFJfU1VSRl9CQU5LX0hFSUdIVF84 OyBicmVhazsKKwl9CisJc3dpdGNoICgqbXRhc3BlY3QpIHsKKwlkZWZhdWx0OgorCWNhc2UgMTog Km10YXNwZWN0ID0gRVZFUkdSRUVOX0FERFJfU1VSRl9NQUNST19USUxFX0FTUEVDVF8xOyBicmVh azsKKwljYXNlIDI6ICptdGFzcGVjdCA9IEVWRVJHUkVFTl9BRERSX1NVUkZfTUFDUk9fVElMRV9B U1BFQ1RfMjsgYnJlYWs7CisJY2FzZSA0OiAqbXRhc3BlY3QgPSBFVkVSR1JFRU5fQUREUl9TVVJG X01BQ1JPX1RJTEVfQVNQRUNUXzQ7IGJyZWFrOworCWNhc2UgODogKm10YXNwZWN0ID0gRVZFUkdS RUVOX0FERFJfU1VSRl9NQUNST19USUxFX0FTUEVDVF84OyBicmVhazsKKwl9Cit9CisKK3N0YXRp YyBpbnQgZGNlX3Y2XzBfY3J0Y19kb19zZXRfYmFzZShzdHJ1Y3QgZHJtX2NydGMgKmNydGMsCisJ CQkJICAgICBzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYiwKKwkJCQkgICAgIGludCB4LCBpbnQg eSwgaW50IGF0b21pYykKK3sKKwlzdHJ1Y3QgYW1kZ3B1X2NydGMgKmFtZGdwdV9jcnRjID0gdG9f YW1kZ3B1X2NydGMoY3J0Yyk7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNydGMtPmRldjsK KwlzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0 IGFtZGdwdV9mcmFtZWJ1ZmZlciAqYW1kZ3B1X2ZiOworCXN0cnVjdCBkcm1fZnJhbWVidWZmZXIg KnRhcmdldF9mYjsKKwlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iajsKKwlzdHJ1Y3QgYW1kZ3B1 X2JvICpyYm87CisJdWludDY0X3QgZmJfbG9jYXRpb24sIHRpbGluZ19mbGFnczsKKwl1aW50MzJf dCBmYl9mb3JtYXQsIGZiX3BpdGNoX3BpeGVsczsKKwl1bnNpZ25lZCBiYW5rdywgYmFua2gsIG10 YXNwZWN0LCB0aWxlX3NwbGl0OworCXUzMiBmYl9zd2FwID0gRVZFUkdSRUVOX0dSUEhfRU5ESUFO X1NXQVAoRVZFUkdSRUVOX0dSUEhfRU5ESUFOX05PTkUpOworCXUzMiB2aWV3cG9ydF93LCB2aWV3 cG9ydF9oOworCWludCByOworCWJvb2wgYnlwYXNzX2x1dCA9IGZhbHNlOworCisJLyogbm8gZmIg Ym91bmQgKi8KKwlpZiAoIWF0b21pYyAmJiAhY3J0Yy0+cHJpbWFyeS0+ZmIpIHsKKwkJRFJNX0RF QlVHX0tNUygiTm8gRkIgYm91bmRcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoYXRvbWlj KSB7CisJCWFtZGdwdV9mYiA9IHRvX2FtZGdwdV9mcmFtZWJ1ZmZlcihmYik7CisJCXRhcmdldF9m YiA9IGZiOworCX0KKwllbHNlIHsKKwkJYW1kZ3B1X2ZiID0gdG9fYW1kZ3B1X2ZyYW1lYnVmZmVy KGNydGMtPnByaW1hcnktPmZiKTsKKwkJdGFyZ2V0X2ZiID0gY3J0Yy0+cHJpbWFyeS0+ZmI7CisJ fQorCisJLyogSWYgYXRvbWljLCBhc3N1bWUgZmIgb2JqZWN0IGlzIHBpbm5lZCAmIGlkbGUgJiBm ZW5jZWQgYW5kCisJICoganVzdCB1cGRhdGUgYmFzZSBwb2ludGVycworCSAqLworCW9iaiA9IGFt ZGdwdV9mYi0+b2JqOworCXJibyA9IGdlbV90b19hbWRncHVfYm8ob2JqKTsKKwlyID0gYW1kZ3B1 X2JvX3Jlc2VydmUocmJvLCBmYWxzZSk7CisJaWYgKHVubGlrZWx5KHIgIT0gMCkpCisJCXJldHVy biByOworCisJaWYgKGF0b21pYykKKwkJZmJfbG9jYXRpb24gPSBhbWRncHVfYm9fZ3B1X29mZnNl dChyYm8pOworCWVsc2UgeworCQlyID0gYW1kZ3B1X2JvX3BpbihyYm8sIEFNREdQVV9HRU1fRE9N QUlOX1ZSQU0sICZmYl9sb2NhdGlvbik7CisJCWlmICh1bmxpa2VseShyICE9IDApKSB7CisJCQlh bWRncHVfYm9fdW5yZXNlcnZlKHJibyk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKwor CWFtZGdwdV9ib19nZXRfdGlsaW5nX2ZsYWdzKHJibywgJnRpbGluZ19mbGFncyk7CisJYW1kZ3B1 X2JvX3VucmVzZXJ2ZShyYm8pOworCisJc3dpdGNoICh0YXJnZXRfZmItPnBpeGVsX2Zvcm1hdCkg eworCWNhc2UgRFJNX0ZPUk1BVF9DODoKKwkJZmJfZm9ybWF0ID0gKEVWRVJHUkVFTl9HUlBIX0RF UFRIKEVWRVJHUkVFTl9HUlBIX0RFUFRIXzhCUFApIHwKKwkJCSAgICAgRVZFUkdSRUVOX0dSUEhf Rk9STUFUKEVWRVJHUkVFTl9HUlBIX0ZPUk1BVF9JTkRFWEVEKSk7CisJCWJyZWFrOworCWNhc2Ug RFJNX0ZPUk1BVF9YUkdCNDQ0NDoKKwljYXNlIERSTV9GT1JNQVRfQVJHQjQ0NDQ6CisJCWZiX2Zv cm1hdCA9IChFVkVSR1JFRU5fR1JQSF9ERVBUSChFVkVSR1JFRU5fR1JQSF9ERVBUSF8xNkJQUCkg fAorCQkJICAgICBFVkVSR1JFRU5fR1JQSF9GT1JNQVQoRVZFUkdSRUVOX0dSUEhfRk9STUFUX0FS R0I0NDQ0KSk7CisjaWZkZWYgX19CSUdfRU5ESUFOCisJCWZiX3N3YXAgPSBFVkVSR1JFRU5fR1JQ SF9FTkRJQU5fU1dBUChFVkVSR1JFRU5fR1JQSF9FTkRJQU5fOElOMTYpOworI2VuZGlmCisJCWJy ZWFrOworCWNhc2UgRFJNX0ZPUk1BVF9YUkdCMTU1NToKKwljYXNlIERSTV9GT1JNQVRfQVJHQjE1 NTU6CisJCWZiX2Zvcm1hdCA9IChFVkVSR1JFRU5fR1JQSF9ERVBUSChFVkVSR1JFRU5fR1JQSF9E RVBUSF8xNkJQUCkgfAorCQkJICAgICBFVkVSR1JFRU5fR1JQSF9GT1JNQVQoRVZFUkdSRUVOX0dS UEhfRk9STUFUX0FSR0IxNTU1KSk7CisjaWZkZWYgX19CSUdfRU5ESUFOCisJCWZiX3N3YXAgPSBF VkVSR1JFRU5fR1JQSF9FTkRJQU5fU1dBUChFVkVSR1JFRU5fR1JQSF9FTkRJQU5fOElOMTYpOwor I2VuZGlmCisJCWJyZWFrOworCWNhc2UgRFJNX0ZPUk1BVF9CR1JYNTU1MToKKwljYXNlIERSTV9G T1JNQVRfQkdSQTU1NTE6CisJCWZiX2Zvcm1hdCA9IChFVkVSR1JFRU5fR1JQSF9ERVBUSChFVkVS R1JFRU5fR1JQSF9ERVBUSF8xNkJQUCkgfAorCQkJICAgICBFVkVSR1JFRU5fR1JQSF9GT1JNQVQo RVZFUkdSRUVOX0dSUEhfRk9STUFUX0JHUkE1NTUxKSk7CisjaWZkZWYgX19CSUdfRU5ESUFOCisJ CWZiX3N3YXAgPSBFVkVSR1JFRU5fR1JQSF9FTkRJQU5fU1dBUChFVkVSR1JFRU5fR1JQSF9FTkRJ QU5fOElOMTYpOworI2VuZGlmCisJCWJyZWFrOworCWNhc2UgRFJNX0ZPUk1BVF9SR0I1NjU6CisJ CWZiX2Zvcm1hdCA9IChFVkVSR1JFRU5fR1JQSF9ERVBUSChFVkVSR1JFRU5fR1JQSF9ERVBUSF8x NkJQUCkgfAorCQkJICAgICBFVkVSR1JFRU5fR1JQSF9GT1JNQVQoRVZFUkdSRUVOX0dSUEhfRk9S TUFUX0FSR0I1NjUpKTsKKyNpZmRlZiBfX0JJR19FTkRJQU4KKwkJZmJfc3dhcCA9IEVWRVJHUkVF Tl9HUlBIX0VORElBTl9TV0FQKEVWRVJHUkVFTl9HUlBIX0VORElBTl84SU4xNik7CisjZW5kaWYK KwkJYnJlYWs7CisJY2FzZSBEUk1fRk9STUFUX1hSR0I4ODg4OgorCWNhc2UgRFJNX0ZPUk1BVF9B UkdCODg4ODoKKwkJZmJfZm9ybWF0ID0gKEVWRVJHUkVFTl9HUlBIX0RFUFRIKEVWRVJHUkVFTl9H UlBIX0RFUFRIXzMyQlBQKSB8CisJCQkgICAgIEVWRVJHUkVFTl9HUlBIX0ZPUk1BVChFVkVSR1JF RU5fR1JQSF9GT1JNQVRfQVJHQjg4ODgpKTsKKyNpZmRlZiBfX0JJR19FTkRJQU4KKwkJZmJfc3dh cCA9IEVWRVJHUkVFTl9HUlBIX0VORElBTl9TV0FQKEVWRVJHUkVFTl9HUlBIX0VORElBTl84SU4z Mik7CisjZW5kaWYKKwkJYnJlYWs7CisJY2FzZSBEUk1fRk9STUFUX1hSR0IyMTAxMDEwOgorCWNh c2UgRFJNX0ZPUk1BVF9BUkdCMjEwMTAxMDoKKwkJZmJfZm9ybWF0ID0gKEVWRVJHUkVFTl9HUlBI X0RFUFRIKEVWRVJHUkVFTl9HUlBIX0RFUFRIXzMyQlBQKSB8CisJCQkgICAgIEVWRVJHUkVFTl9H UlBIX0ZPUk1BVChFVkVSR1JFRU5fR1JQSF9GT1JNQVRfQVJHQjIxMDEwMTApKTsKKyNpZmRlZiBf X0JJR19FTkRJQU4KKwkJZmJfc3dhcCA9IEVWRVJHUkVFTl9HUlBIX0VORElBTl9TV0FQKEVWRVJH UkVFTl9HUlBIX0VORElBTl84SU4zMik7CisjZW5kaWYKKwkJLyogR3JlYXRlciA4IGJwYyBmYiBu ZWVkcyB0byBieXBhc3MgaHctbHV0IHRvIHJldGFpbiBwcmVjaXNpb24gKi8KKwkJYnlwYXNzX2x1 dCA9IHRydWU7CisJCWJyZWFrOworCWNhc2UgRFJNX0ZPUk1BVF9CR1JYMTAxMDEwMjoKKwljYXNl IERSTV9GT1JNQVRfQkdSQTEwMTAxMDI6CisJCWZiX2Zvcm1hdCA9IChFVkVSR1JFRU5fR1JQSF9E RVBUSChFVkVSR1JFRU5fR1JQSF9ERVBUSF8zMkJQUCkgfAorCQkJICAgICBFVkVSR1JFRU5fR1JQ SF9GT1JNQVQoRVZFUkdSRUVOX0dSUEhfRk9STUFUX0JHUkExMDEwMTAyKSk7CisjaWZkZWYgX19C SUdfRU5ESUFOCisJCWZiX3N3YXAgPSBFVkVSR1JFRU5fR1JQSF9FTkRJQU5fU1dBUChFVkVSR1JF RU5fR1JQSF9FTkRJQU5fOElOMzIpOworI2VuZGlmCisJCS8qIEdyZWF0ZXIgOCBicGMgZmIgbmVl ZHMgdG8gYnlwYXNzIGh3LWx1dCB0byByZXRhaW4gcHJlY2lzaW9uICovCisJCWJ5cGFzc19sdXQg PSB0cnVlOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlEUk1fRVJST1IoIlVuc3VwcG9ydGVkIHNj cmVlbiBmb3JtYXQgJXNcbiIsCisJCQkgIGRybV9nZXRfZm9ybWF0X25hbWUodGFyZ2V0X2ZiLT5w aXhlbF9mb3JtYXQpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHRpbGluZ19mbGFn cyAmIEFNREdQVV9USUxJTkdfTUFDUk8pIHsKKworCQl1bnNpZ25lZCBpbmRleCwgbnVtX2Jhbmtz OworCQlldmVyZ3JlZW5fdGlsaW5nX2ZpZWxkcyh0aWxpbmdfZmxhZ3MsICZiYW5rdywgJmJhbmto LCAmbXRhc3BlY3QsICZ0aWxlX3NwbGl0KTsKKworCQkvKiBTZXQgTlVNX0JBTktTLiAqLworCisJ CXN3aXRjaCAodGFyZ2V0X2ZiLT5iaXRzX3Blcl9waXhlbCkgeworCQljYXNlIDg6CisJCQlpbmRl eCA9IDEwOworCQkJYnJlYWs7CisJCWNhc2UgMTY6CisJCQlpbmRleCA9IFNJX1RJTEVfTU9ERV9D T0xPUl8yRF9TQ0FOT1VUXzE2QlBQOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCWNhc2UgMzI6 CisJCQlpbmRleCA9IFNJX1RJTEVfTU9ERV9DT0xPUl8yRF9TQ0FOT1VUXzMyQlBQOworCQkJYnJl YWs7CisJCX0KKworCQludW1fYmFua3MgPSAoYWRldi0+Z2Z4LmNvbmZpZy50aWxlX21vZGVfYXJy YXlbaW5kZXhdID4+IDIwKSAmIDB4MzsKKworCQlmYl9mb3JtYXQgfD0gRVZFUkdSRUVOX0dSUEhf TlVNX0JBTktTKG51bV9iYW5rcyk7CisKKwkJZmJfZm9ybWF0IHw9IEVWRVJHUkVFTl9HUlBIX0FS UkFZX01PREUoRVZFUkdSRUVOX0dSUEhfQVJSQVlfMkRfVElMRURfVEhJTjEpOworCQlmYl9mb3Jt YXQgfD0gRVZFUkdSRUVOX0dSUEhfVElMRV9TUExJVCh0aWxlX3NwbGl0KTsKKwkJZmJfZm9ybWF0 IHw9IEVWRVJHUkVFTl9HUlBIX0JBTktfV0lEVEgoYmFua3cpOworCQlmYl9mb3JtYXQgfD0gRVZF UkdSRUVOX0dSUEhfQkFOS19IRUlHSFQoYmFua2gpOworCQlmYl9mb3JtYXQgfD0gRVZFUkdSRUVO X0dSUEhfTUFDUk9fVElMRV9BU1BFQ1QobXRhc3BlY3QpOworCX0gZWxzZSBpZiAodGlsaW5nX2Zs YWdzICYgQU1ER1BVX1RJTElOR19NSUNSTykKKwkJZmJfZm9ybWF0IHw9IEVWRVJHUkVFTl9HUlBI X0FSUkFZX01PREUoRVZFUkdSRUVOX0dSUEhfQVJSQVlfMURfVElMRURfVEhJTjEpOworCisKKwlp ZiAoKGFkZXYtPmFzaWNfdHlwZSA9PSBDSElQX1RBSElUSSkgfHwKKwkgICAgKGFkZXYtPmFzaWNf dHlwZSA9PSBDSElQX1BJVENBSVJOKSkKKwkJZmJfZm9ybWF0IHw9IFNJX0dSUEhfUElQRV9DT05G SUcoU0lfQUREUl9TVVJGX1A4XzMyeDMyXzh4MTYpOworCWVsc2UgaWYgKChhZGV2LT5hc2ljX3R5 cGUgPT0gQ0hJUF9WRVJERSkgfHwKKwkJIChhZGV2LT5hc2ljX3R5cGUgPT0gQ0hJUF9PTEFORCkp CisJCWZiX2Zvcm1hdCB8PSBTSV9HUlBIX1BJUEVfQ09ORklHKFNJX0FERFJfU1VSRl9QNF84eDE2 KTsKKworCWRjZV92Nl8wX3ZnYV9lbmFibGUoY3J0YywgZmFsc2UpOworCisJLyogTWFrZSBzdXJl IHN1cmZhY2UgYWRkcmVzcyBpcyB1cGRhdGVkIGF0IHZlcnRpY2FsIGJsYW5rIHJhdGhlciB0aGFu CisJICogaG9yaXpvbnRhbCBibGFuaworCSAqLworCVdSRUczMihFVkVSR1JFRU5fR1JQSF9GTElQ X0NPTlRST0wgKyBhbWRncHVfY3J0Yy0+Y3J0Y19vZmZzZXQsIDApOworCisJV1JFRzMyKEVWRVJH UkVFTl9HUlBIX1BSSU1BUllfU1VSRkFDRV9BRERSRVNTX0hJR0ggKyBhbWRncHVfY3J0Yy0+Y3J0 Y19vZmZzZXQsCisJICAgICAgIHVwcGVyXzMyX2JpdHMoZmJfbG9jYXRpb24pKTsKKwlXUkVHMzIo RVZFUkdSRUVOX0dSUEhfU0VDT05EQVJZX1NVUkZBQ0VfQUREUkVTU19ISUdIICsgYW1kZ3B1X2Ny dGMtPmNydGNfb2Zmc2V0LAorCSAgICAgICB1cHBlcl8zMl9iaXRzKGZiX2xvY2F0aW9uKSk7CisJ V1JFRzMyKEVWRVJHUkVFTl9HUlBIX1BSSU1BUllfU1VSRkFDRV9BRERSRVNTICsgYW1kZ3B1X2Ny dGMtPmNydGNfb2Zmc2V0LAorCSAgICAgICAodTMyKWZiX2xvY2F0aW9uICYgRVZFUkdSRUVOX0dS UEhfU1VSRkFDRV9BRERSRVNTX01BU0spOworCVdSRUczMihFVkVSR1JFRU5fR1JQSF9TRUNPTkRB UllfU1VSRkFDRV9BRERSRVNTICsgYW1kZ3B1X2NydGMtPmNydGNfb2Zmc2V0LAorCSAgICAgICAo dTMyKSBmYl9sb2NhdGlvbiAmIEVWRVJHUkVFTl9HUlBIX1NVUkZBQ0VfQUREUkVTU19NQVNLKTsK KwlXUkVHMzIoRVZFUkdSRUVOX0dSUEhfQ09OVFJPTCArIGFtZGdwdV9jcnRjLT5jcnRjX29mZnNl dCwgZmJfZm9ybWF0KTsKKwlXUkVHMzIoRVZFUkdSRUVOX0dSUEhfU1dBUF9DT05UUk9MICsgYW1k Z3B1X2NydGMtPmNydGNfb2Zmc2V0LCBmYl9zd2FwKTsKKworCS8qCisJICogVGhlIExVVCBvbmx5 IGhhcyAyNTYgc2xvdHMgZm9yIGluZGV4aW5nIGJ5IGEgOCBicGMgZmIuIEJ5cGFzcyB0aGUgTFVU CisJICogZm9yID4gOCBicGMgc2Nhbm91dCB0byBhdm9pZCB0cnVuY2F0aW9uIG9mIGZiIGluZGlj ZXMgdG8gOCBtc2IncywgdG8KKwkgKiByZXRhaW4gdGhlIGZ1bGwgcHJlY2lzaW9uIHRocm91Z2hv dXQgdGhlIHBpcGVsaW5lLgorCSAqLworCVdSRUczMl9QKEVWRVJHUkVFTl9HUlBIX0xVVF8xMEJJ VF9CWVBBU1NfQ09OVFJPTCArIGFtZGdwdV9jcnRjLT5jcnRjX29mZnNldCwKKwkJIChieXBhc3Nf bHV0ID8gRVZFUkdSRUVOX0xVVF8xMEJJVF9CWVBBU1NfRU4gOiAwKSwKKwkJIH5FVkVSR1JFRU5f TFVUXzEwQklUX0JZUEFTU19FTik7CisKKwlpZiAoYnlwYXNzX2x1dCkKKwkJRFJNX0RFQlVHX0tN UygiQnlwYXNzaW5nIGhhcmR3YXJlIExVVCBkdWUgdG8gMTAgYml0IGZiIHNjYW5vdXQuXG4iKTsK KworCVdSRUczMihFVkVSR1JFRU5fR1JQSF9TVVJGQUNFX09GRlNFVF9YICsgYW1kZ3B1X2NydGMt PmNydGNfb2Zmc2V0LCAwKTsKKwlXUkVHMzIoRVZFUkdSRUVOX0dSUEhfU1VSRkFDRV9PRkZTRVRf WSArIGFtZGdwdV9jcnRjLT5jcnRjX29mZnNldCwgMCk7CisJV1JFRzMyKEVWRVJHUkVFTl9HUlBI X1hfU1RBUlQgKyBhbWRncHVfY3J0Yy0+Y3J0Y19vZmZzZXQsIDApOworCVdSRUczMihFVkVSR1JF RU5fR1JQSF9ZX1NUQVJUICsgYW1kZ3B1X2NydGMtPmNydGNfb2Zmc2V0LCAwKTsKKwlXUkVHMzIo RVZFUkdSRUVOX0dSUEhfWF9FTkQgKyBhbWRncHVfY3J0Yy0+Y3J0Y19vZmZzZXQsIHRhcmdldF9m Yi0+d2lkdGgpOworCVdSRUczMihFVkVSR1JFRU5fR1JQSF9ZX0VORCArIGFtZGdwdV9jcnRjLT5j cnRjX29mZnNldCwgdGFyZ2V0X2ZiLT5oZWlnaHQpOworCisJZmJfcGl0Y2hfcGl4ZWxzID0gdGFy Z2V0X2ZiLT5waXRjaGVzWzBdIC8gKHRhcmdldF9mYi0+Yml0c19wZXJfcGl4ZWwgLyA4KTsKKwlX UkVHMzIoRVZFUkdSRUVOX0dSUEhfUElUQ0ggKyBhbWRncHVfY3J0Yy0+Y3J0Y19vZmZzZXQsIGZi X3BpdGNoX3BpeGVscyk7CisKKwlkY2VfdjZfMF9ncnBoX2VuYWJsZShjcnRjLCB0cnVlKTsKKwor CVdSRUczMihFVkVSR1JFRU5fREVTS1RPUF9IRUlHSFQgKyBhbWRncHVfY3J0Yy0+Y3J0Y19vZmZz ZXQsCisJCSAgICAgICB0YXJnZXRfZmItPmhlaWdodCk7CisJeCAmPSB+MzsKKwl5ICY9IH4xOwor CVdSRUczMihFVkVSR1JFRU5fVklFV1BPUlRfU1RBUlQgKyBhbWRncHVfY3J0Yy0+Y3J0Y19vZmZz ZXQsCisJICAgICAgICh4IDw8IDE2KSB8IHkpOworCXZpZXdwb3J0X3cgPSBjcnRjLT5tb2RlLmhk aXNwbGF5OworCXZpZXdwb3J0X2ggPSAoY3J0Yy0+bW9kZS52ZGlzcGxheSArIDEpICYgfjE7CisK KwlXUkVHMzIoRVZFUkdSRUVOX1ZJRVdQT1JUX1NJWkUgKyBhbWRncHVfY3J0Yy0+Y3J0Y19vZmZz ZXQsCisJICAgICAgICh2aWV3cG9ydF93IDw8IDE2KSB8IHZpZXdwb3J0X2gpOworCisJLyogc2V0 IHBhZ2VmbGlwIHRvIGhhcHBlbiBvbmx5IGF0IHN0YXJ0IG9mIHZibGFuayBpbnRlcnZhbCAoZnJv bnQgcG9yY2gpICovCisJV1JFRzMyKEVWRVJHUkVFTl9NQVNURVJfVVBEQVRFX01PREUgKyBhbWRn cHVfY3J0Yy0+Y3J0Y19vZmZzZXQsIDMpOworCisJaWYgKCFhdG9taWMgJiYgZmIgJiYgZmIgIT0g Y3J0Yy0+cHJpbWFyeS0+ZmIpIHsKKwkJYW1kZ3B1X2ZiID0gdG9fYW1kZ3B1X2ZyYW1lYnVmZmVy KGZiKTsKKwkJcmJvID0gZ2VtX3RvX2FtZGdwdV9ibyhhbWRncHVfZmItPm9iaik7CisJCXIgPSBh bWRncHVfYm9fcmVzZXJ2ZShyYm8sIGZhbHNlKTsKKwkJaWYgKHVubGlrZWx5KHIgIT0gMCkpCisJ CQlyZXR1cm4gcjsKKwkJYW1kZ3B1X2JvX3VucGluKHJibyk7CisJCWFtZGdwdV9ib191bnJlc2Vy dmUocmJvKTsKKwl9CisKKwkvKiBCeXRlcyBwZXIgcGl4ZWwgbWF5IGhhdmUgY2hhbmdlZCAqLwor CWRjZV92Nl8wX2JhbmR3aWR0aF91cGRhdGUoYWRldik7CisKKwlyZXR1cm4gMDsKKworfQorCitz dGF0aWMgdm9pZCBkY2VfdjZfMF9zZXRfaW50ZXJsZWF2ZShzdHJ1Y3QgZHJtX2NydGMgKmNydGMs CisJCQkJICAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlKQoreworCXN0cnVjdCBkcm1f ZGV2aWNlICpkZXYgPSBjcnRjLT5kZXY7CisJc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYgPSBk ZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBhbWRncHVfY3J0YyAqYW1kZ3B1X2NydGMgPSB0b19h bWRncHVfY3J0YyhjcnRjKTsKKworCWlmIChtb2RlLT5mbGFncyAmIERSTV9NT0RFX0ZMQUdfSU5U RVJMQUNFKQorCQlXUkVHMzIoRVZFUkdSRUVOX0RBVEFfRk9STUFUICsgYW1kZ3B1X2NydGMtPmNy dGNfb2Zmc2V0LAorCQkgICAgICAgRVZFUkdSRUVOX0lOVEVSTEVBVkVfRU4pOworCWVsc2UKKwkJ V1JFRzMyKEVWRVJHUkVFTl9EQVRBX0ZPUk1BVCArIGFtZGdwdV9jcnRjLT5jcnRjX29mZnNldCwg MCk7Cit9CisKK3N0YXRpYyB2b2lkIGRjZV92Nl8wX2NydGNfbG9hZF9sdXQoc3RydWN0IGRybV9j cnRjICpjcnRjKQoreworCisJc3RydWN0IGFtZGdwdV9jcnRjICphbWRncHVfY3J0YyA9IHRvX2Ft ZGdwdV9jcnRjKGNydGMpOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjcnRjLT5kZXY7CisJ c3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYgPSBkZXYtPmRldl9wcml2YXRlOworCWludCBpOwor CisJRFJNX0RFQlVHX0tNUygiJWRcbiIsIGFtZGdwdV9jcnRjLT5jcnRjX2lkKTsKKworCVdSRUcz MihOSV9JTlBVVF9DU0NfQ09OVFJPTCArIGFtZGdwdV9jcnRjLT5jcnRjX29mZnNldCwKKwkgICAg ICAgKE5JX0lOUFVUX0NTQ19HUlBIX01PREUoTklfSU5QVVRfQ1NDX0JZUEFTUykgfAorCQlOSV9J TlBVVF9DU0NfT1ZMX01PREUoTklfSU5QVVRfQ1NDX0JZUEFTUykpKTsKKwlXUkVHMzIoTklfUFJF U0NBTEVfR1JQSF9DT05UUk9MICsgYW1kZ3B1X2NydGMtPmNydGNfb2Zmc2V0LAorCSAgICAgICBO SV9HUlBIX1BSRVNDQUxFX0JZUEFTUyk7CisJV1JFRzMyKE5JX1BSRVNDQUxFX09WTF9DT05UUk9M ICsgYW1kZ3B1X2NydGMtPmNydGNfb2Zmc2V0LAorCSAgICAgICBOSV9PVkxfUFJFU0NBTEVfQllQ QVNTKTsKKwlXUkVHMzIoTklfSU5QVVRfR0FNTUFfQ09OVFJPTCArIGFtZGdwdV9jcnRjLT5jcnRj X29mZnNldCwKKwkgICAgICAgKE5JX0dSUEhfSU5QVVRfR0FNTUFfTU9ERShOSV9JTlBVVF9HQU1N QV9VU0VfTFVUKSB8CisJCU5JX09WTF9JTlBVVF9HQU1NQV9NT0RFKE5JX0lOUFVUX0dBTU1BX1VT RV9MVVQpKSk7CisKKworCisJV1JFRzMyKEVWRVJHUkVFTl9EQ19MVVRfQ09OVFJPTCArIGFtZGdw dV9jcnRjLT5jcnRjX29mZnNldCwgMCk7CisKKwlXUkVHMzIoRVZFUkdSRUVOX0RDX0xVVF9CTEFD S19PRkZTRVRfQkxVRSArIGFtZGdwdV9jcnRjLT5jcnRjX29mZnNldCwgMCk7CisJV1JFRzMyKEVW RVJHUkVFTl9EQ19MVVRfQkxBQ0tfT0ZGU0VUX0dSRUVOICsgYW1kZ3B1X2NydGMtPmNydGNfb2Zm c2V0LCAwKTsKKwlXUkVHMzIoRVZFUkdSRUVOX0RDX0xVVF9CTEFDS19PRkZTRVRfUkVEICsgYW1k Z3B1X2NydGMtPmNydGNfb2Zmc2V0LCAwKTsKKworCVdSRUczMihFVkVSR1JFRU5fRENfTFVUX1dI SVRFX09GRlNFVF9CTFVFICsgYW1kZ3B1X2NydGMtPmNydGNfb2Zmc2V0LCAweGZmZmYpOworCVdS RUczMihFVkVSR1JFRU5fRENfTFVUX1dISVRFX09GRlNFVF9HUkVFTiArIGFtZGdwdV9jcnRjLT5j cnRjX29mZnNldCwgMHhmZmZmKTsKKwlXUkVHMzIoRVZFUkdSRUVOX0RDX0xVVF9XSElURV9PRkZT RVRfUkVEICsgYW1kZ3B1X2NydGMtPmNydGNfb2Zmc2V0LCAweGZmZmYpOworCisJV1JFRzMyKEVW RVJHUkVFTl9EQ19MVVRfUldfTU9ERSArIGFtZGdwdV9jcnRjLT5jcnRjX29mZnNldCwgMCk7CisJ V1JFRzMyKEVWRVJHUkVFTl9EQ19MVVRfV1JJVEVfRU5fTUFTSyArIGFtZGdwdV9jcnRjLT5jcnRj X29mZnNldCwgMHgwMDAwMDAwNyk7CisKKwlXUkVHMzIoRVZFUkdSRUVOX0RDX0xVVF9SV19JTkRF WCArIGFtZGdwdV9jcnRjLT5jcnRjX29mZnNldCwgMCk7CisJZm9yIChpID0gMDsgaSA8IDI1Njsg aSsrKSB7CisJCVdSRUczMihFVkVSR1JFRU5fRENfTFVUXzMwX0NPTE9SICsgYW1kZ3B1X2NydGMt PmNydGNfb2Zmc2V0LAorCQkgICAgICAgKGFtZGdwdV9jcnRjLT5sdXRfcltpXSA8PCAyMCkgfAor CQkgICAgICAgKGFtZGdwdV9jcnRjLT5sdXRfZ1tpXSA8PCAxMCkgfAorCQkgICAgICAgKGFtZGdw dV9jcnRjLT5sdXRfYltpXSA8PCAwKSk7CisJfQorCisJV1JFRzMyKE5JX0RFR0FNTUFfQ09OVFJP TCArIGFtZGdwdV9jcnRjLT5jcnRjX29mZnNldCwKKwkgICAgICAgKE5JX0dSUEhfREVHQU1NQV9N T0RFKE5JX0RFR0FNTUFfQllQQVNTKSB8CisJCU5JX09WTF9ERUdBTU1BX01PREUoTklfREVHQU1N QV9CWVBBU1MpIHwKKwkJTklfSUNPTl9ERUdBTU1BX01PREUoTklfREVHQU1NQV9CWVBBU1MpIHwK KwkJTklfQ1VSU09SX0RFR0FNTUFfTU9ERShOSV9ERUdBTU1BX0JZUEFTUykpKTsKKwlXUkVHMzIo TklfR0FNVVRfUkVNQVBfQ09OVFJPTCArIGFtZGdwdV9jcnRjLT5jcnRjX29mZnNldCwKKwkgICAg ICAgKE5JX0dSUEhfR0FNVVRfUkVNQVBfTU9ERShOSV9HQU1VVF9SRU1BUF9CWVBBU1MpIHwKKwkJ TklfT1ZMX0dBTVVUX1JFTUFQX01PREUoTklfR0FNVVRfUkVNQVBfQllQQVNTKSkpOworCVdSRUcz MihOSV9SRUdBTU1BX0NPTlRST0wgKyBhbWRncHVfY3J0Yy0+Y3J0Y19vZmZzZXQsCisJICAgICAg IChOSV9HUlBIX1JFR0FNTUFfTU9ERShOSV9SRUdBTU1BX0JZUEFTUykgfAorCQlOSV9PVkxfUkVH QU1NQV9NT0RFKE5JX1JFR0FNTUFfQllQQVNTKSkpOworCVdSRUczMihOSV9PVVRQVVRfQ1NDX0NP TlRST0wgKyBhbWRncHVfY3J0Yy0+Y3J0Y19vZmZzZXQsCisJICAgICAgIChOSV9PVVRQVVRfQ1ND X0dSUEhfTU9ERSgwKSB8CisJCU5JX09VVFBVVF9DU0NfT1ZMX01PREUoTklfT1VUUFVUX0NTQ19C WVBBU1MpKSk7CisJLyogWFhYIG1hdGNoIHRoaXMgdG8gdGhlIGRlcHRoIG9mIHRoZSBjcnRjIGZt dCBibG9jaywgbW92ZSB0byBtb2Rlc2V0PyAqLworCVdSRUczMigweDFhNTAgKyBhbWRncHVfY3J0 Yy0+Y3J0Y19vZmZzZXQsIDApOworCisKK30KKworc3RhdGljIGludCBkY2VfdjZfMF9waWNrX2Rp Z19lbmNvZGVyKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKK3sKKwlzdHJ1Y3QgYW1kZ3B1 X2VuY29kZXIgKmFtZGdwdV9lbmNvZGVyID0gdG9fYW1kZ3B1X2VuY29kZXIoZW5jb2Rlcik7CisJ c3RydWN0IGFtZGdwdV9lbmNvZGVyX2F0b21fZGlnICpkaWcgPSBhbWRncHVfZW5jb2Rlci0+ZW5j X3ByaXY7CisKKwlzd2l0Y2ggKGFtZGdwdV9lbmNvZGVyLT5lbmNvZGVyX2lkKSB7CisJY2FzZSBF TkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9VTklQSFk6CisJCWlmIChkaWctPmxpbmtiKQorCQkJ cmV0dXJuIDE7CisJCWVsc2UKKwkJCXJldHVybiAwOworCQlicmVhazsKKwljYXNlIEVOQ09ERVJf T0JKRUNUX0lEX0lOVEVSTkFMX1VOSVBIWTE6CisJCWlmIChkaWctPmxpbmtiKQorCQkJcmV0dXJu IDM7CisJCWVsc2UKKwkJCXJldHVybiAyOworCQlicmVhazsKKwljYXNlIEVOQ09ERVJfT0JKRUNU X0lEX0lOVEVSTkFMX1VOSVBIWTI6CisJCWlmIChkaWctPmxpbmtiKQorCQkJcmV0dXJuIDU7CisJ CWVsc2UKKwkJCXJldHVybiA0OworCQlicmVhazsKKwljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lO VEVSTkFMX1VOSVBIWTM6CisJCXJldHVybiA2OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlEUk1f RVJST1IoImludmFsaWQgZW5jb2Rlcl9pZDogMHgleFxuIiwgYW1kZ3B1X2VuY29kZXItPmVuY29k ZXJfaWQpOworCQlyZXR1cm4gMDsKKwl9Cit9CisKKy8qKgorICogZGNlX3Y2XzBfcGlja19wbGwg LSBBbGxvY2F0ZSBhIFBQTEwgZm9yIHVzZSBieSB0aGUgY3J0Yy4KKyAqCisgKiBAY3J0YzogZHJt IGNydGMKKyAqCisgKiBSZXR1cm5zIHRoZSBQUExMIChQaXhlbCBQTEwpIHRvIGJlIHVzZWQgYnkg dGhlIGNydGMuICBGb3IgRFAgbW9uaXRvcnMKKyAqIGEgc2luZ2xlIFBQTEwgY2FuIGJlIHVzZWQg Zm9yIGFsbCBEUCBjcnRjcy9lbmNvZGVycy4gIEZvciBub24tRFAKKyAqIG1vbml0b3JzIGEgZGVk aWNhdGVkIFBQTEwgbXVzdCBiZSB1c2VkLiAgSWYgYSBwYXJ0aWN1bGFyIGJvYXJkIGhhcworICog YW4gZXh0ZXJuYWwgRFAgUExMLCByZXR1cm4gQVRPTV9QUExMX0lOVkFMSUQgdG8gc2tpcCBQTEwg cHJvZ3JhbW1pbmcKKyAqIGFzIHRoZXJlIGlzIG5vIG5lZWQgdG8gcHJvZ3JhbSB0aGUgUExMIGl0 c2VsZi4gIElmIHdlIGFyZSBub3QgYWJsZSB0bworICogYWxsb2NhdGUgYSBQTEwsIHJldHVybiBB VE9NX1BQTExfSU5WQUxJRCB0byBza2lwIFBMTCBwcm9ncmFtbWluZyB0bworICogYXZvaWQgbWVz c2luZyB1cCBhbiBleGlzdGluZyBtb25pdG9yLgorICoKKyAqCisgKi8KK3N0YXRpYyB1MzIgZGNl X3Y2XzBfcGlja19wbGwoc3RydWN0IGRybV9jcnRjICpjcnRjKQoreworCXN0cnVjdCBhbWRncHVf Y3J0YyAqYW1kZ3B1X2NydGMgPSB0b19hbWRncHVfY3J0YyhjcnRjKTsKKwlzdHJ1Y3QgZHJtX2Rl dmljZSAqZGV2ID0gY3J0Yy0+ZGV2OworCXN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2ID0gZGV2 LT5kZXZfcHJpdmF0ZTsKKwl1MzIgcGxsX2luX3VzZTsKKwlpbnQgcGxsOworCisJaWYgKEVOQ09E RVJfTU9ERV9JU19EUChhbWRncHVfYXRvbWJpb3NfZW5jb2Rlcl9nZXRfZW5jb2Rlcl9tb2RlKGFt ZGdwdV9jcnRjLT5lbmNvZGVyKSkpIHsKKwkJaWYgKGFkZXYtPmNsb2NrLmRwX2V4dGNsaykKKwkJ CS8qIHNraXAgUFBMTCBwcm9ncmFtbWluZyBpZiB1c2luZyBleHQgY2xvY2sgKi8KKwkJCXJldHVy biBBVE9NX1BQTExfSU5WQUxJRDsKKwkJZWxzZQorCQkJcmV0dXJuIEFUT01fUFBMTDA7CisJfSBl bHNlIHsKKwkJLyogdXNlIHRoZSBzYW1lIFBQTEwgZm9yIGFsbCBtb25pdG9ycyB3aXRoIHRoZSBz YW1lIGNsb2NrICovCisJCXBsbCA9IGFtZGdwdV9wbGxfZ2V0X3NoYXJlZF9ub25kcF9wcGxsKGNy dGMpOworCQlpZiAocGxsICE9IEFUT01fUFBMTF9JTlZBTElEKQorCQkJcmV0dXJuIHBsbDsKKwl9 CisKKwkvKiAgUFBMTDEsIGFuZCBQUExMMiAqLworCXBsbF9pbl91c2UgPSBhbWRncHVfcGxsX2dl dF91c2VfbWFzayhjcnRjKTsKKwlpZiAoIShwbGxfaW5fdXNlICYgKDEgPDwgQVRPTV9QUExMMikp KQorCQlyZXR1cm4gQVRPTV9QUExMMjsKKwlpZiAoIShwbGxfaW5fdXNlICYgKDEgPDwgQVRPTV9Q UExMMSkpKQorCQlyZXR1cm4gQVRPTV9QUExMMTsKKwlEUk1fRVJST1IoInVuYWJsZSB0byBhbGxv Y2F0ZSBhIFBQTExcbiIpOworCXJldHVybiBBVE9NX1BQTExfSU5WQUxJRDsKK30KKworc3RhdGlj IHZvaWQgZGNlX3Y2XzBfbG9ja19jdXJzb3Ioc3RydWN0IGRybV9jcnRjICpjcnRjLCBib29sIGxv Y2spCit7CisJc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYgPSBjcnRjLT5kZXYtPmRldl9wcml2 YXRlOworCXN0cnVjdCBhbWRncHVfY3J0YyAqYW1kZ3B1X2NydGMgPSB0b19hbWRncHVfY3J0Yyhj cnRjKTsKKwl1aW50MzJfdCBjdXJfbG9jazsKKwljdXJfbG9jayA9IFJSRUczMihFVkVSR1JFRU5f Q1VSX1VQREFURSArIGFtZGdwdV9jcnRjLT5jcnRjX29mZnNldCk7CisJaWYgKGxvY2spCisJCWN1 cl9sb2NrIHw9IEVWRVJHUkVFTl9DVVJTT1JfVVBEQVRFX0xPQ0s7CisJZWxzZQorCQljdXJfbG9j ayAmPSB+RVZFUkdSRUVOX0NVUlNPUl9VUERBVEVfTE9DSzsKKwlXUkVHMzIoRVZFUkdSRUVOX0NV Ul9VUERBVEUgKyBhbWRncHVfY3J0Yy0+Y3J0Y19vZmZzZXQsIGN1cl9sb2NrKTsKK30KKworc3Rh dGljIHZvaWQgZGNlX3Y2XzBfaGlkZV9jdXJzb3Ioc3RydWN0IGRybV9jcnRjICpjcnRjKQorewor CXN0cnVjdCBhbWRncHVfY3J0YyAqYW1kZ3B1X2NydGMgPSB0b19hbWRncHVfY3J0YyhjcnRjKTsK KwlzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldiA9IGNydGMtPmRldi0+ZGV2X3ByaXZhdGU7CisK KwlXUkVHMzJfSURYKEVWRVJHUkVFTl9DVVJfQ09OVFJPTCArIGFtZGdwdV9jcnRjLT5jcnRjX29m ZnNldCwKKwkJCSAgIEVWRVJHUkVFTl9DVVJTT1JfTU9ERShFVkVSR1JFRU5fQ1VSU09SXzI0Xzhf UFJFX01VTFQpIHwKKwkJCSAgIEVWRVJHUkVFTl9DVVJTT1JfVVJHRU5UX0NPTlRST0woRVZFUkdS RUVOX0NVUlNPUl9VUkdFTlRfMV8yKSk7CisKKworfQorCitzdGF0aWMgdm9pZCBkY2VfdjZfMF9z aG93X2N1cnNvcihzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCit7CisJc3RydWN0IGFtZGdwdV9jcnRj ICphbWRncHVfY3J0YyA9IHRvX2FtZGdwdV9jcnRjKGNydGMpOworCXN0cnVjdCBhbWRncHVfZGV2 aWNlICphZGV2ID0gY3J0Yy0+ZGV2LT5kZXZfcHJpdmF0ZTsKKworCVdSRUczMihBTURHUFVfTU1f SU5ERVgsIEVWRVJHUkVFTl9DVVJfQ09OVFJPTCArIGFtZGdwdV9jcnRjLT5jcnRjX29mZnNldCk7 CisJCVdSRUczMihBTURHUFVfTU1fREFUQSwgRVZFUkdSRUVOX0NVUlNPUl9FTiB8CisJCSAgICAg ICBFVkVSR1JFRU5fQ1VSU09SX01PREUoRVZFUkdSRUVOX0NVUlNPUl8yNF84X1BSRV9NVUxUKSB8 CisJCSAgICAgICBFVkVSR1JFRU5fQ1VSU09SX1VSR0VOVF9DT05UUk9MKEVWRVJHUkVFTl9DVVJT T1JfVVJHRU5UXzFfMikpOworCisKK30KKworc3RhdGljIGludCBkY2VfdjZfMF9jdXJzb3JfbW92 ZV9sb2NrZWQoc3RydWN0IGRybV9jcnRjICpjcnRjLAorCQkJCSAgICAgICBpbnQgeCwgaW50IHkp Cit7CisJc3RydWN0IGFtZGdwdV9jcnRjICphbWRncHVfY3J0YyA9IHRvX2FtZGdwdV9jcnRjKGNy dGMpOworCXN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2ID0gY3J0Yy0+ZGV2LT5kZXZfcHJpdmF0 ZTsKKwlpbnQgeG9yaWdpbiA9IDAsIHlvcmlnaW4gPSAwOworCisJaW50IHcgPSBhbWRncHVfY3J0 Yy0+Y3Vyc29yX3dpZHRoOworCisJLyogYXZpdm8gY3Vyc29yIGFyZSBvZmZzZXQgaW50byB0aGUg dG90YWwgc3VyZmFjZSAqLworCXggKz0gY3J0Yy0+eDsKKwl5ICs9IGNydGMtPnk7CisJRFJNX0RF QlVHKCJ4ICVkIHkgJWQgYy0+eCAlZCBjLT55ICVkXG4iLCB4LCB5LCBjcnRjLT54LCBjcnRjLT55 KTsKKworCWlmICh4IDwgMCkgeworCQl4b3JpZ2luID0gbWluKC14LCBhbWRncHVfY3J0Yy0+bWF4 X2N1cnNvcl93aWR0aCAtIDEpOworCQl4ID0gMDsKKwl9CisJaWYgKHkgPCAwKSB7CisJCXlvcmln aW4gPSBtaW4oLXksIGFtZGdwdV9jcnRjLT5tYXhfY3Vyc29yX2hlaWdodCAtIDEpOworCQl5ID0g MDsKKwl9CisKKworCisJV1JFRzMyKEVWRVJHUkVFTl9DVVJfUE9TSVRJT04gKyBhbWRncHVfY3J0 Yy0+Y3J0Y19vZmZzZXQsICh4IDw8IDE2KSB8IHkpOworCQlXUkVHMzIoRVZFUkdSRUVOX0NVUl9I T1RfU1BPVCArIGFtZGdwdV9jcnRjLT5jcnRjX29mZnNldCwgKHhvcmlnaW4gPDwgMTYpIHwgeW9y aWdpbik7CisJCVdSRUczMihFVkVSR1JFRU5fQ1VSX1NJWkUgKyBhbWRncHVfY3J0Yy0+Y3J0Y19v ZmZzZXQsCisJCSAgICAgICAoKHcgLSAxKSA8PCAxNikgfCAoYW1kZ3B1X2NydGMtPmN1cnNvcl9o ZWlnaHQgLSAxKSk7CisKKwlhbWRncHVfY3J0Yy0+Y3Vyc29yX3ggPSB4OworCWFtZGdwdV9jcnRj LT5jdXJzb3JfeSA9IHk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGNlX3Y2XzBfY3J0 Y19jdXJzb3JfbW92ZShzdHJ1Y3QgZHJtX2NydGMgKmNydGMsCisJCQkJICAgICBpbnQgeCwgaW50 IHkpCit7CisJaW50IHJldDsKKworCWRjZV92Nl8wX2xvY2tfY3Vyc29yKGNydGMsIHRydWUpOwor CXJldCA9IGRjZV92Nl8wX2N1cnNvcl9tb3ZlX2xvY2tlZChjcnRjLCB4LCB5KTsKKwlkY2VfdjZf MF9sb2NrX2N1cnNvcihjcnRjLCBmYWxzZSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMg aW50IGRjZV92Nl8wX2NydGNfY3Vyc29yX3NldDIoc3RydWN0IGRybV9jcnRjICpjcnRjLAorCQkJ CSAgICAgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYsCisJCQkJICAgICB1aW50MzJfdCBoYW5k bGUsCisJCQkJICAgICB1aW50MzJfdCB3aWR0aCwKKwkJCQkgICAgIHVpbnQzMl90IGhlaWdodCwK KwkJCQkgICAgIGludDMyX3QgaG90X3gsCisJCQkJICAgICBpbnQzMl90IGhvdF95KQoreworCXN0 cnVjdCBhbWRncHVfY3J0YyAqYW1kZ3B1X2NydGMgPSB0b19hbWRncHVfY3J0YyhjcnRjKTsKKwlz dHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iajsKKwlzdHJ1Y3QgYW1kZ3B1X2JvICphb2JqOworCWlu dCByZXQ7CisKKwlpZiAoIWhhbmRsZSkgeworCQkvKiB0dXJuIG9mZiBjdXJzb3IgKi8KKwkJZGNl X3Y2XzBfaGlkZV9jdXJzb3IoY3J0Yyk7CisJCW9iaiA9IE5VTEw7CisJCWdvdG8gdW5waW47CisJ fQorCisJaWYgKCh3aWR0aCA+IGFtZGdwdV9jcnRjLT5tYXhfY3Vyc29yX3dpZHRoKSB8fAorCSAg ICAoaGVpZ2h0ID4gYW1kZ3B1X2NydGMtPm1heF9jdXJzb3JfaGVpZ2h0KSkgeworCQlEUk1fRVJS T1IoImJhZCBjdXJzb3Igd2lkdGggb3IgaGVpZ2h0ICVkIHggJWRcbiIsIHdpZHRoLCBoZWlnaHQp OworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlvYmogPSBkcm1fZ2VtX29iamVjdF9sb29rdXAo Y3J0Yy0+ZGV2LCBmaWxlX3ByaXYsIGhhbmRsZSk7CisJaWYgKCFvYmopIHsKKwkJRFJNX0VSUk9S KCJDYW5ub3QgZmluZCBjdXJzb3Igb2JqZWN0ICV4IGZvciBjcnRjICVkXG4iLCBoYW5kbGUsIGFt ZGdwdV9jcnRjLT5jcnRjX2lkKTsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJYW9iaiA9IGdl bV90b19hbWRncHVfYm8ob2JqKTsKKwlyZXQgPSBhbWRncHVfYm9fcmVzZXJ2ZShhb2JqLCBmYWxz ZSk7CisJaWYgKHJldCAhPSAwKSB7CisJCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlX3VubG9j a2VkKG9iaik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gYW1kZ3B1X2JvX3Bpbihhb2Jq LCBBTURHUFVfR0VNX0RPTUFJTl9WUkFNLCAmYW1kZ3B1X2NydGMtPmN1cnNvcl9hZGRyKTsKKwlh bWRncHVfYm9fdW5yZXNlcnZlKGFvYmopOworCWlmIChyZXQpIHsKKwkJRFJNX0VSUk9SKCJGYWls ZWQgdG8gcGluIG5ldyBjdXJzb3IgQk8gKCVkKVxuIiwgcmV0KTsKKwkJZHJtX2dlbV9vYmplY3Rf dW5yZWZlcmVuY2VfdW5sb2NrZWQob2JqKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlhbWRncHVf Y3J0Yy0+Y3Vyc29yX3dpZHRoID0gd2lkdGg7CisJYW1kZ3B1X2NydGMtPmN1cnNvcl9oZWlnaHQg PSBoZWlnaHQ7CisKKwlkY2VfdjZfMF9sb2NrX2N1cnNvcihjcnRjLCB0cnVlKTsKKworCWlmICho b3RfeCAhPSBhbWRncHVfY3J0Yy0+Y3Vyc29yX2hvdF94IHx8CisJICAgIGhvdF95ICE9IGFtZGdw dV9jcnRjLT5jdXJzb3JfaG90X3kpIHsKKwkJaW50IHgsIHk7CisKKwkJeCA9IGFtZGdwdV9jcnRj LT5jdXJzb3JfeCArIGFtZGdwdV9jcnRjLT5jdXJzb3JfaG90X3ggLSBob3RfeDsKKwkJeSA9IGFt ZGdwdV9jcnRjLT5jdXJzb3JfeSArIGFtZGdwdV9jcnRjLT5jdXJzb3JfaG90X3kgLSBob3RfeTsK KworCQlkY2VfdjZfMF9jdXJzb3JfbW92ZV9sb2NrZWQoY3J0YywgeCwgeSk7CisKKwkJYW1kZ3B1 X2NydGMtPmN1cnNvcl9ob3RfeCA9IGhvdF94OworCQlhbWRncHVfY3J0Yy0+Y3Vyc29yX2hvdF95 ID0gaG90X3k7CisJfQorCisJZGNlX3Y2XzBfc2hvd19jdXJzb3IoY3J0Yyk7CisJZGNlX3Y2XzBf bG9ja19jdXJzb3IoY3J0YywgZmFsc2UpOworCit1bnBpbjoKKwlpZiAoYW1kZ3B1X2NydGMtPmN1 cnNvcl9ibykgeworCQlzdHJ1Y3QgYW1kZ3B1X2JvICphb2JqID0gZ2VtX3RvX2FtZGdwdV9ibyhh bWRncHVfY3J0Yy0+Y3Vyc29yX2JvKTsKKwkJcmV0ID0gYW1kZ3B1X2JvX3Jlc2VydmUoYW9iaiwg ZmFsc2UpOworCQlpZiAobGlrZWx5KHJldCA9PSAwKSkgeworCQkJYW1kZ3B1X2JvX3VucGluKGFv YmopOworCQkJYW1kZ3B1X2JvX3VucmVzZXJ2ZShhb2JqKTsKKwkJfQorCQlkcm1fZ2VtX29iamVj dF91bnJlZmVyZW5jZV91bmxvY2tlZChhbWRncHVfY3J0Yy0+Y3Vyc29yX2JvKTsKKwl9CisKKwlh bWRncHVfY3J0Yy0+Y3Vyc29yX2JvID0gb2JqOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9p ZCBkY2VfdjZfMF9jdXJzb3JfcmVzZXQoc3RydWN0IGRybV9jcnRjICpjcnRjKQoreworCXN0cnVj dCBhbWRncHVfY3J0YyAqYW1kZ3B1X2NydGMgPSB0b19hbWRncHVfY3J0YyhjcnRjKTsKKworCWlm IChhbWRncHVfY3J0Yy0+Y3Vyc29yX2JvKSB7CisJCWRjZV92Nl8wX2xvY2tfY3Vyc29yKGNydGMs IHRydWUpOworCisJCWRjZV92Nl8wX2N1cnNvcl9tb3ZlX2xvY2tlZChjcnRjLCBhbWRncHVfY3J0 Yy0+Y3Vyc29yX3gsCisJCQkJCSAgICBhbWRncHVfY3J0Yy0+Y3Vyc29yX3kpOworCisJCWRjZV92 Nl8wX3Nob3dfY3Vyc29yKGNydGMpOworCisJCWRjZV92Nl8wX2xvY2tfY3Vyc29yKGNydGMsIGZh bHNlKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGRjZV92Nl8wX2NydGNfZ2FtbWFfc2V0KHN0cnVj dCBkcm1fY3J0YyAqY3J0YywgdTE2ICpyZWQsIHUxNiAqZ3JlZW4sCisJCQkJICAgIHUxNiAqYmx1 ZSwgdWludDMyX3Qgc3RhcnQsIHVpbnQzMl90IHNpemUpCit7CisJc3RydWN0IGFtZGdwdV9jcnRj ICphbWRncHVfY3J0YyA9IHRvX2FtZGdwdV9jcnRjKGNydGMpOworCWludCBlbmQgPSAoc3RhcnQg KyBzaXplID4gMjU2KSA/IDI1NiA6IHN0YXJ0ICsgc2l6ZSwgaTsKKworCS8qIHVzZXJzcGFjZSBw YWxldHRlcyBhcmUgYWx3YXlzIGNvcnJlY3QgYXMgaXMgKi8KKwlmb3IgKGkgPSBzdGFydDsgaSA8 IGVuZDsgaSsrKSB7CisJCWFtZGdwdV9jcnRjLT5sdXRfcltpXSA9IHJlZFtpXSA+PiA2OworCQlh bWRncHVfY3J0Yy0+bHV0X2dbaV0gPSBncmVlbltpXSA+PiA2OworCQlhbWRncHVfY3J0Yy0+bHV0 X2JbaV0gPSBibHVlW2ldID4+IDY7CisJfQorCWRjZV92Nl8wX2NydGNfbG9hZF9sdXQoY3J0Yyk7 Cit9CisKK3N0YXRpYyB2b2lkIGRjZV92Nl8wX2NydGNfZGVzdHJveShzdHJ1Y3QgZHJtX2NydGMg KmNydGMpCit7CisJc3RydWN0IGFtZGdwdV9jcnRjICphbWRncHVfY3J0YyA9IHRvX2FtZGdwdV9j cnRjKGNydGMpOworCisJZHJtX2NydGNfY2xlYW51cChjcnRjKTsKKwlrZnJlZShhbWRncHVfY3J0 Yyk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2NydGNfZnVuY3MgZGNlX3Y2XzBfY3J0 Y19mdW5jcyA9IHsKKwkuY3Vyc29yX3NldDIgPSBkY2VfdjZfMF9jcnRjX2N1cnNvcl9zZXQyLAor CS5jdXJzb3JfbW92ZSA9IGRjZV92Nl8wX2NydGNfY3Vyc29yX21vdmUsCisJLmdhbW1hX3NldCA9 IGRjZV92Nl8wX2NydGNfZ2FtbWFfc2V0LAorCS5zZXRfY29uZmlnID0gYW1kZ3B1X2NydGNfc2V0 X2NvbmZpZywKKwkuZGVzdHJveSA9IGRjZV92Nl8wX2NydGNfZGVzdHJveSwKKwkucGFnZV9mbGlw ID0gYW1kZ3B1X2NydGNfcGFnZV9mbGlwLAorfTsKKworc3RhdGljIHZvaWQgZGNlX3Y2XzBfY3J0 Y19kcG1zKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywgaW50IG1vZGUpCit7CisJc3RydWN0IGRybV9k ZXZpY2UgKmRldiA9IGNydGMtPmRldjsKKwlzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldiA9IGRl di0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGFtZGdwdV9jcnRjICphbWRncHVfY3J0YyA9IHRvX2Ft ZGdwdV9jcnRjKGNydGMpOworCXVuc2lnbmVkIHR5cGU7CisKKwlzd2l0Y2ggKG1vZGUpIHsKKwlj YXNlIERSTV9NT0RFX0RQTVNfT046CisJCWFtZGdwdV9jcnRjLT5lbmFibGVkID0gdHJ1ZTsKKwkJ YW1kZ3B1X2F0b21iaW9zX2NydGNfZW5hYmxlKGNydGMsIEFUT01fRU5BQkxFKTsKKwkJYW1kZ3B1 X2F0b21iaW9zX2NydGNfYmxhbmsoY3J0YywgQVRPTV9ESVNBQkxFKTsKKwkJLyogTWFrZSBzdXJl IFZCTEFOSyBhbmQgUEZMSVAgaW50ZXJydXB0cyBhcmUgc3RpbGwgZW5hYmxlZCAqLworCQl0eXBl ID0gYW1kZ3B1X2NydGNfaWR4X3RvX2lycV90eXBlKGFkZXYsIGFtZGdwdV9jcnRjLT5jcnRjX2lk KTsKKwkJYW1kZ3B1X2lycV91cGRhdGUoYWRldiwgJmFkZXYtPmNydGNfaXJxLCB0eXBlKTsKKwkJ YW1kZ3B1X2lycV91cGRhdGUoYWRldiwgJmFkZXYtPnBhZ2VmbGlwX2lycSwgdHlwZSk7CisJCWRy bV92YmxhbmtfcG9zdF9tb2Rlc2V0KGRldiwgYW1kZ3B1X2NydGMtPmNydGNfaWQpOworCQlkY2Vf djZfMF9jcnRjX2xvYWRfbHV0KGNydGMpOworCQlicmVhazsKKwljYXNlIERSTV9NT0RFX0RQTVNf U1RBTkRCWToKKwljYXNlIERSTV9NT0RFX0RQTVNfU1VTUEVORDoKKwljYXNlIERSTV9NT0RFX0RQ TVNfT0ZGOgorCQlkcm1fdmJsYW5rX3ByZV9tb2Rlc2V0KGRldiwgYW1kZ3B1X2NydGMtPmNydGNf aWQpOworCQlpZiAoYW1kZ3B1X2NydGMtPmVuYWJsZWQpCisJCQlhbWRncHVfYXRvbWJpb3NfY3J0 Y19ibGFuayhjcnRjLCBBVE9NX0VOQUJMRSk7CisJCWFtZGdwdV9hdG9tYmlvc19jcnRjX2VuYWJs ZShjcnRjLCBBVE9NX0RJU0FCTEUpOworCQlhbWRncHVfY3J0Yy0+ZW5hYmxlZCA9IGZhbHNlOwor CQlicmVhazsKKwl9CisJLyogYWRqdXN0IHBtIHRvIGRwbXMgKi8KKwlhbWRncHVfcG1fY29tcHV0 ZV9jbG9ja3MoYWRldik7Cit9CisKK3N0YXRpYyB2b2lkIGRjZV92Nl8wX2NydGNfcHJlcGFyZShz dHJ1Y3QgZHJtX2NydGMgKmNydGMpCit7CisJLyogZGlzYWJsZSBjcnRjIHBhaXIgcG93ZXIgZ2F0 aW5nIGJlZm9yZSBwcm9ncmFtbWluZyAqLworCWFtZGdwdV9hdG9tYmlvc19jcnRjX3Bvd2VyZ2F0 ZShjcnRjLCBBVE9NX0RJU0FCTEUpOworCWFtZGdwdV9hdG9tYmlvc19jcnRjX2xvY2soY3J0Yywg QVRPTV9FTkFCTEUpOworCWRjZV92Nl8wX2NydGNfZHBtcyhjcnRjLCBEUk1fTU9ERV9EUE1TX09G Rik7Cit9CisKK3N0YXRpYyB2b2lkIGRjZV92Nl8wX2NydGNfY29tbWl0KHN0cnVjdCBkcm1fY3J0 YyAqY3J0YykKK3sKKwlkY2VfdjZfMF9jcnRjX2RwbXMoY3J0YywgRFJNX01PREVfRFBNU19PTik7 CisJYW1kZ3B1X2F0b21iaW9zX2NydGNfbG9jayhjcnRjLCBBVE9NX0RJU0FCTEUpOworfQorCitz dGF0aWMgdm9pZCBkY2VfdjZfMF9jcnRjX2Rpc2FibGUoc3RydWN0IGRybV9jcnRjICpjcnRjKQor eworCisJc3RydWN0IGFtZGdwdV9jcnRjICphbWRncHVfY3J0YyA9IHRvX2FtZGdwdV9jcnRjKGNy dGMpOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjcnRjLT5kZXY7CisJc3RydWN0IGFtZGdw dV9kZXZpY2UgKmFkZXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBhbWRncHVfYXRvbV9z cyBzczsKKwlpbnQgaTsKKworCWRjZV92Nl8wX2NydGNfZHBtcyhjcnRjLCBEUk1fTU9ERV9EUE1T X09GRik7CisJaWYgKGNydGMtPnByaW1hcnktPmZiKSB7CisJCWludCByOworCQlzdHJ1Y3QgYW1k Z3B1X2ZyYW1lYnVmZmVyICphbWRncHVfZmI7CisJCXN0cnVjdCBhbWRncHVfYm8gKnJibzsKKwor CQlhbWRncHVfZmIgPSB0b19hbWRncHVfZnJhbWVidWZmZXIoY3J0Yy0+cHJpbWFyeS0+ZmIpOwor CQlyYm8gPSBnZW1fdG9fYW1kZ3B1X2JvKGFtZGdwdV9mYi0+b2JqKTsKKwkJciA9IGFtZGdwdV9i b19yZXNlcnZlKHJibywgZmFsc2UpOworCQlpZiAodW5saWtlbHkocikpCisJCQlEUk1fRVJST1Io ImZhaWxlZCB0byByZXNlcnZlIHJibyBiZWZvcmUgdW5waW5cbiIpOworCQllbHNlIHsKKwkJCWFt ZGdwdV9ib191bnBpbihyYm8pOworCQkJYW1kZ3B1X2JvX3VucmVzZXJ2ZShyYm8pOworCQl9CisJ fQorCS8qIGRpc2FibGUgdGhlIEdSUEggKi8KKwlkY2VfdjZfMF9ncnBoX2VuYWJsZShjcnRjLCBm YWxzZSk7CisKKwlhbWRncHVfYXRvbWJpb3NfY3J0Y19wb3dlcmdhdGUoY3J0YywgQVRPTV9FTkFC TEUpOworCisJZm9yIChpID0gMDsgaSA8IGFkZXYtPm1vZGVfaW5mby5udW1fY3J0YzsgaSsrKSB7 CisJCWlmIChhZGV2LT5tb2RlX2luZm8uY3J0Y3NbaV0gJiYKKwkJICAgIGFkZXYtPm1vZGVfaW5m by5jcnRjc1tpXS0+ZW5hYmxlZCAmJgorCQkgICAgaSAhPSBhbWRncHVfY3J0Yy0+Y3J0Y19pZCAm JgorCQkgICAgYW1kZ3B1X2NydGMtPnBsbF9pZCA9PSBhZGV2LT5tb2RlX2luZm8uY3J0Y3NbaV0t PnBsbF9pZCkgeworCQkJLyogb25lIG90aGVyIGNydGMgaXMgdXNpbmcgdGhpcyBwbGwgZG9uJ3Qg dHVybgorCQkJICogb2ZmIHRoZSBwbGwKKwkJCSAqLworCQkJZ290byBkb25lOworCQl9CisJfQor CisJc3dpdGNoIChhbWRncHVfY3J0Yy0+cGxsX2lkKSB7CisJY2FzZSBBVE9NX1BQTEwxOgorCWNh c2UgQVRPTV9QUExMMjoKKwkJLyogZGlzYWJsZSB0aGUgcHBsbCAqLworCQlhbWRncHVfYXRvbWJp b3NfY3J0Y19wcm9ncmFtX3BsbChjcnRjLCBhbWRncHVfY3J0Yy0+Y3J0Y19pZCwgYW1kZ3B1X2Ny dGMtPnBsbF9pZCwKKwkJCQkJCSAwLCAwLCBBVE9NX0RJU0FCTEUsIDAsIDAsIDAsIDAsIDAsIGZh bHNlLCAmc3MpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Citkb25lOgorCWFt ZGdwdV9jcnRjLT5wbGxfaWQgPSBBVE9NX1BQTExfSU5WQUxJRDsKKwlhbWRncHVfY3J0Yy0+YWRq dXN0ZWRfY2xvY2sgPSAwOworCWFtZGdwdV9jcnRjLT5lbmNvZGVyID0gTlVMTDsKKwlhbWRncHVf Y3J0Yy0+Y29ubmVjdG9yID0gTlVMTDsKK30KKworc3RhdGljIGludCBkY2VfdjZfMF9jcnRjX21v ZGVfc2V0KHN0cnVjdCBkcm1fY3J0YyAqY3J0YywKKwkJCQkgIHN0cnVjdCBkcm1fZGlzcGxheV9t b2RlICptb2RlLAorCQkJCSAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmFkanVzdGVkX21vZGUs CisJCQkJICBpbnQgeCwgaW50IHksIHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKm9sZF9mYikKK3sK KwlzdHJ1Y3QgYW1kZ3B1X2NydGMgKmFtZGdwdV9jcnRjID0gdG9fYW1kZ3B1X2NydGMoY3J0Yyk7 CisKKwlpZiAoIWFtZGdwdV9jcnRjLT5hZGp1c3RlZF9jbG9jaykKKwkJcmV0dXJuIC1FSU5WQUw7 CisKKwlhbWRncHVfYXRvbWJpb3NfY3J0Y19zZXRfcGxsKGNydGMsIGFkanVzdGVkX21vZGUpOwor CWFtZGdwdV9hdG9tYmlvc19jcnRjX3NldF9kdGRfdGltaW5nKGNydGMsIGFkanVzdGVkX21vZGUp OworCWRjZV92Nl8wX2NydGNfZG9fc2V0X2Jhc2UoY3J0Yywgb2xkX2ZiLCB4LCB5LCAwKTsKKwlh bWRncHVfYXRvbWJpb3NfY3J0Y19vdmVyc2Nhbl9zZXR1cChjcnRjLCBtb2RlLCBhZGp1c3RlZF9t b2RlKTsKKwlhbWRncHVfYXRvbWJpb3NfY3J0Y19zY2FsZXJfc2V0dXAoY3J0Yyk7CisJZGNlX3Y2 XzBfY3Vyc29yX3Jlc2V0KGNydGMpOworCS8qIHVwZGF0ZSB0aGUgaHcgdmVyc2lvbiBmcHIgZHBt ICovCisJYW1kZ3B1X2NydGMtPmh3X21vZGUgPSAqYWRqdXN0ZWRfbW9kZTsKKworCXJldHVybiAw OworfQorCitzdGF0aWMgYm9vbCBkY2VfdjZfMF9jcnRjX21vZGVfZml4dXAoc3RydWN0IGRybV9j cnRjICpjcnRjLAorCQkJCSAgICAgY29uc3Qgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUs CisJCQkJICAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqYWRqdXN0ZWRfbW9kZSkKK3sKKwor CXN0cnVjdCBhbWRncHVfY3J0YyAqYW1kZ3B1X2NydGMgPSB0b19hbWRncHVfY3J0YyhjcnRjKTsK KwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY3J0Yy0+ZGV2OworCXN0cnVjdCBkcm1fZW5jb2Rl ciAqZW5jb2RlcjsKKworCS8qIGFzc2lnbiB0aGUgZW5jb2RlciB0byB0aGUgYW1kZ3B1IGNydGMg dG8gYXZvaWQgcmVwZWF0ZWQgbG9va3VwcyBsYXRlciAqLworCWxpc3RfZm9yX2VhY2hfZW50cnko ZW5jb2RlciwgJmRldi0+bW9kZV9jb25maWcuZW5jb2Rlcl9saXN0LCBoZWFkKSB7CisJCWlmIChl bmNvZGVyLT5jcnRjID09IGNydGMpIHsKKwkJCWFtZGdwdV9jcnRjLT5lbmNvZGVyID0gZW5jb2Rl cjsKKwkJCWFtZGdwdV9jcnRjLT5jb25uZWN0b3IgPSBhbWRncHVfZ2V0X2Nvbm5lY3Rvcl9mb3Jf ZW5jb2RlcihlbmNvZGVyKTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmICgoYW1kZ3B1X2NydGMt PmVuY29kZXIgPT0gTlVMTCkgfHwgKGFtZGdwdV9jcnRjLT5jb25uZWN0b3IgPT0gTlVMTCkpIHsK KwkJYW1kZ3B1X2NydGMtPmVuY29kZXIgPSBOVUxMOworCQlhbWRncHVfY3J0Yy0+Y29ubmVjdG9y ID0gTlVMTDsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlpZiAoIWFtZGdwdV9jcnRjX3NjYWxpbmdf bW9kZV9maXh1cChjcnRjLCBtb2RlLCBhZGp1c3RlZF9tb2RlKSkKKwkJcmV0dXJuIGZhbHNlOwor CWlmIChhbWRncHVfYXRvbWJpb3NfY3J0Y19wcmVwYXJlX3BsbChjcnRjLCBhZGp1c3RlZF9tb2Rl KSkKKwkJcmV0dXJuIGZhbHNlOworCS8qIHBpY2sgcGxsICovCisJYW1kZ3B1X2NydGMtPnBsbF9p ZCA9IGRjZV92Nl8wX3BpY2tfcGxsKGNydGMpOworCS8qIGlmIHdlIGNhbid0IGdldCBhIFBQTEwg Zm9yIGEgbm9uLURQIGVuY29kZXIsIGZhaWwgKi8KKwlpZiAoKGFtZGdwdV9jcnRjLT5wbGxfaWQg PT0gQVRPTV9QUExMX0lOVkFMSUQpICYmCisJICAgICFFTkNPREVSX01PREVfSVNfRFAoYW1kZ3B1 X2F0b21iaW9zX2VuY29kZXJfZ2V0X2VuY29kZXJfbW9kZShhbWRncHVfY3J0Yy0+ZW5jb2Rlcikp KQorCQlyZXR1cm4gZmFsc2U7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGludCBkY2Vf djZfMF9jcnRjX3NldF9iYXNlKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywgaW50IHgsIGludCB5LAor CQkJCSAgc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqb2xkX2ZiKQoreworCXJldHVybiBkY2VfdjZf MF9jcnRjX2RvX3NldF9iYXNlKGNydGMsIG9sZF9mYiwgeCwgeSwgMCk7Cit9CisKK3N0YXRpYyBp bnQgZGNlX3Y2XzBfY3J0Y19zZXRfYmFzZV9hdG9taWMoc3RydWN0IGRybV9jcnRjICpjcnRjLAor CQkJCQkgc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmIsCisJCQkJCSBpbnQgeCwgaW50IHksIGVu dW0gbW9kZV9zZXRfYXRvbWljIHN0YXRlKQoreworICAgICAgIHJldHVybiBkY2VfdjZfMF9jcnRj X2RvX3NldF9iYXNlKGNydGMsIGZiLCB4LCB5LCAxKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVj dCBkcm1fY3J0Y19oZWxwZXJfZnVuY3MgZGNlX3Y2XzBfY3J0Y19oZWxwZXJfZnVuY3MgPSB7CisJ LmRwbXMgPSBkY2VfdjZfMF9jcnRjX2RwbXMsCisJLm1vZGVfZml4dXAgPSBkY2VfdjZfMF9jcnRj X21vZGVfZml4dXAsCisJLm1vZGVfc2V0ID0gZGNlX3Y2XzBfY3J0Y19tb2RlX3NldCwKKwkubW9k ZV9zZXRfYmFzZSA9IGRjZV92Nl8wX2NydGNfc2V0X2Jhc2UsCisJLm1vZGVfc2V0X2Jhc2VfYXRv bWljID0gZGNlX3Y2XzBfY3J0Y19zZXRfYmFzZV9hdG9taWMsCisJLnByZXBhcmUgPSBkY2VfdjZf MF9jcnRjX3ByZXBhcmUsCisJLmNvbW1pdCA9IGRjZV92Nl8wX2NydGNfY29tbWl0LAorCS5sb2Fk X2x1dCA9IGRjZV92Nl8wX2NydGNfbG9hZF9sdXQsCisJLmRpc2FibGUgPSBkY2VfdjZfMF9jcnRj X2Rpc2FibGUsCit9OworCitzdGF0aWMgaW50IGRjZV92Nl8wX2NydGNfaW5pdChzdHJ1Y3QgYW1k Z3B1X2RldmljZSAqYWRldiwgaW50IGluZGV4KQoreworCXN0cnVjdCBhbWRncHVfY3J0YyAqYW1k Z3B1X2NydGM7CisJaW50IGk7CisKKwlhbWRncHVfY3J0YyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVj dCBhbWRncHVfY3J0YykgKworCQkJICAgICAgKEFNREdQVUZCX0NPTk5fTElNSVQgKiBzaXplb2Yo c3RydWN0IGRybV9jb25uZWN0b3IgKikpLCBHRlBfS0VSTkVMKTsKKwlpZiAoYW1kZ3B1X2NydGMg PT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlkcm1fY3J0Y19pbml0KGFkZXYtPmRkZXYs ICZhbWRncHVfY3J0Yy0+YmFzZSwgJmRjZV92Nl8wX2NydGNfZnVuY3MpOworCisJZHJtX21vZGVf Y3J0Y19zZXRfZ2FtbWFfc2l6ZSgmYW1kZ3B1X2NydGMtPmJhc2UsIDI1Nik7CisJYW1kZ3B1X2Ny dGMtPmNydGNfaWQgPSBpbmRleDsKKwlhZGV2LT5tb2RlX2luZm8uY3J0Y3NbaW5kZXhdID0gYW1k Z3B1X2NydGM7CisKKwlhbWRncHVfY3J0Yy0+bWF4X2N1cnNvcl93aWR0aCA9IENVUlNPUl9XSURU SDsKKwlhbWRncHVfY3J0Yy0+bWF4X2N1cnNvcl9oZWlnaHQgPSBDVVJTT1JfSEVJR0hUOworCWFk ZXYtPmRkZXYtPm1vZGVfY29uZmlnLmN1cnNvcl93aWR0aCA9IGFtZGdwdV9jcnRjLT5tYXhfY3Vy c29yX3dpZHRoOworCWFkZXYtPmRkZXYtPm1vZGVfY29uZmlnLmN1cnNvcl9oZWlnaHQgPSBhbWRn cHVfY3J0Yy0+bWF4X2N1cnNvcl9oZWlnaHQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKysp IHsKKwkJYW1kZ3B1X2NydGMtPmx1dF9yW2ldID0gaSA8PCAyOworCQlhbWRncHVfY3J0Yy0+bHV0 X2dbaV0gPSBpIDw8IDI7CisJCWFtZGdwdV9jcnRjLT5sdXRfYltpXSA9IGkgPDwgMjsKKwl9CisK KwlhbWRncHVfY3J0Yy0+Y3J0Y19vZmZzZXQgPSBjcnRjX29mZnNldHNbYW1kZ3B1X2NydGMtPmNy dGNfaWRdOworCisJYW1kZ3B1X2NydGMtPnBsbF9pZCA9IEFUT01fUFBMTF9JTlZBTElEOworCWFt ZGdwdV9jcnRjLT5hZGp1c3RlZF9jbG9jayA9IDA7CisJYW1kZ3B1X2NydGMtPmVuY29kZXIgPSBO VUxMOworCWFtZGdwdV9jcnRjLT5jb25uZWN0b3IgPSBOVUxMOworCWRybV9jcnRjX2hlbHBlcl9h ZGQoJmFtZGdwdV9jcnRjLT5iYXNlLCAmZGNlX3Y2XzBfY3J0Y19oZWxwZXJfZnVuY3MpOworCisJ cmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGNlX3Y2XzBfZWFybHlfaW5pdCh2b2lkICpoYW5k bGUpCit7CisJc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYgPSAoc3RydWN0IGFtZGdwdV9kZXZp Y2UgKiloYW5kbGU7CisKKwlhZGV2LT5hdWRpb19lbmRwdF9ycmVnID0gJmRjZV92Nl8wX2F1ZGlv X2VuZHB0X3JyZWc7CisJYWRldi0+YXVkaW9fZW5kcHRfd3JlZyA9ICZkY2VfdjZfMF9hdWRpb19l bmRwdF93cmVnOworCisJZGNlX3Y2XzBfc2V0X2Rpc3BsYXlfZnVuY3MoYWRldik7CisJZGNlX3Y2 XzBfc2V0X2lycV9mdW5jcyhhZGV2KTsKKworCXN3aXRjaCAoYWRldi0+YXNpY190eXBlKSB7CisJ Y2FzZSBDSElQX1RBSElUSToKKwljYXNlIENISVBfUElUQ0FJUk46CisJY2FzZSBDSElQX1ZFUkRF OgorCQlhZGV2LT5tb2RlX2luZm8ubnVtX2NydGMgPSA2OworCQlhZGV2LT5tb2RlX2luZm8ubnVt X2hwZCA9IDY7CisJCWFkZXYtPm1vZGVfaW5mby5udW1fZGlnID0gNjsKKwkJYnJlYWs7CisJY2Fz ZSBDSElQX09MQU5EOgorCQlhZGV2LT5tb2RlX2luZm8ubnVtX2NydGMgPSAyOworCQlhZGV2LT5t b2RlX2luZm8ubnVtX2hwZCA9IDI7CisJCWFkZXYtPm1vZGVfaW5mby5udW1fZGlnID0gMjsKKwkJ YnJlYWs7CisJZGVmYXVsdDoKKwkJLyogRklYTUU6IG5vdCBzdXBwb3J0ZWQgeWV0ICovCisJCXJl dHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRjZV92Nl8w X3N3X2luaXQodm9pZCAqaGFuZGxlKQoreworCWludCByLCBpOworCWJvb2wgcmV0OworCXN0cnVj dCBhbWRncHVfZGV2aWNlICphZGV2ID0gKHN0cnVjdCBhbWRncHVfZGV2aWNlICopaGFuZGxlOwor CisJZm9yIChpID0gMDsgaSA8IGFkZXYtPm1vZGVfaW5mby5udW1fY3J0YzsgaSsrKSB7CisJCXIg PSBhbWRncHVfaXJxX2FkZF9pZChhZGV2LCBpICsgMSwgJmFkZXYtPmNydGNfaXJxKTsKKwkJaWYg KHIpCisJCQlyZXR1cm4gcjsKKwl9CisKKwlmb3IgKGkgPSA4OyBpIDwgMjA7IGkgKz0gMikgewor CQlyID0gYW1kZ3B1X2lycV9hZGRfaWQoYWRldiwgaSwgJmFkZXYtPnBhZ2VmbGlwX2lycSk7CisJ CWlmIChyKQorCQkJcmV0dXJuIHI7CisJfQorCisJLyogSFBEIGhvdHBsdWcgKi8KKwlyID0gYW1k Z3B1X2lycV9hZGRfaWQoYWRldiwgNDIsICZhZGV2LT5ocGRfaXJxKTsKKwlpZiAocikKKwkJcmV0 dXJuIHI7CisKKwlhZGV2LT5tb2RlX2luZm8ubW9kZV9jb25maWdfaW5pdGlhbGl6ZWQgPSB0cnVl OworCisJYWRldi0+ZGRldi0+bW9kZV9jb25maWcuZnVuY3MgPSAmYW1kZ3B1X21vZGVfZnVuY3M7 CisKKwlhZGV2LT5kZGV2LT5tb2RlX2NvbmZpZy5hc3luY19wYWdlX2ZsaXAgPSB0cnVlOworCisJ YWRldi0+ZGRldi0+bW9kZV9jb25maWcubWF4X3dpZHRoID0gMTYzODQ7CisJYWRldi0+ZGRldi0+ bW9kZV9jb25maWcubWF4X2hlaWdodCA9IDE2Mzg0OworCisJYWRldi0+ZGRldi0+bW9kZV9jb25m aWcucHJlZmVycmVkX2RlcHRoID0gMjQ7CisJYWRldi0+ZGRldi0+bW9kZV9jb25maWcucHJlZmVy X3NoYWRvdyA9IDE7CisKKwlhZGV2LT5kZGV2LT5tb2RlX2NvbmZpZy5mYl9iYXNlID0gYWRldi0+ bWMuYXBlcl9iYXNlOworCisJciA9IGFtZGdwdV9tb2Rlc2V0X2NyZWF0ZV9wcm9wcyhhZGV2KTsK KwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlhZGV2LT5kZGV2LT5tb2RlX2NvbmZpZy5tYXhfd2lk dGggPSAxNjM4NDsKKwlhZGV2LT5kZGV2LT5tb2RlX2NvbmZpZy5tYXhfaGVpZ2h0ID0gMTYzODQ7 CisKKwkvKiBhbGxvY2F0ZSBjcnRjcyAqLworCWZvciAoaSA9IDA7IGkgPCBhZGV2LT5tb2RlX2lu Zm8ubnVtX2NydGM7IGkrKykgeworCQlyID0gZGNlX3Y2XzBfY3J0Y19pbml0KGFkZXYsIGkpOwor CQlpZiAocikKKwkJCXJldHVybiByOworCX0KKworCXJldCA9IGFtZGdwdV9hdG9tYmlvc19nZXRf Y29ubmVjdG9yX2luZm9fZnJvbV9vYmplY3RfdGFibGUoYWRldik7CisJaWYgKHJldCkKKwkJYW1k Z3B1X3ByaW50X2Rpc3BsYXlfc2V0dXAoYWRldi0+ZGRldik7CisJZWxzZQorCQlyZXR1cm4gLUVJ TlZBTDsKKworCS8qIHNldHVwIGFmbXQgKi8KKwlkY2VfdjZfMF9hZm10X2luaXQoYWRldik7CisK KwlyID0gZGNlX3Y2XzBfYXVkaW9faW5pdChhZGV2KTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisK Kwlkcm1fa21zX2hlbHBlcl9wb2xsX2luaXQoYWRldi0+ZGRldik7CisKKwlyZXR1cm4gcjsKK30K Kworc3RhdGljIGludCBkY2VfdjZfMF9zd19maW5pKHZvaWQgKmhhbmRsZSkKK3sKKwlzdHJ1Y3Qg YW1kZ3B1X2RldmljZSAqYWRldiA9IChzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqKWhhbmRsZTsKKwor CWtmcmVlKGFkZXYtPm1vZGVfaW5mby5iaW9zX2hhcmRjb2RlZF9lZGlkKTsKKworCWRybV9rbXNf aGVscGVyX3BvbGxfZmluaShhZGV2LT5kZGV2KTsKKworCWRjZV92Nl8wX2F1ZGlvX2ZpbmkoYWRl dik7CisKKwlkY2VfdjZfMF9hZm10X2ZpbmkoYWRldik7CisKKwlkcm1fbW9kZV9jb25maWdfY2xl YW51cChhZGV2LT5kZGV2KTsKKwlhZGV2LT5tb2RlX2luZm8ubW9kZV9jb25maWdfaW5pdGlhbGl6 ZWQgPSBmYWxzZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRjZV92Nl8wX2h3X2lu aXQodm9pZCAqaGFuZGxlKQoreworCWludCBpOworCXN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2 ID0gKHN0cnVjdCBhbWRncHVfZGV2aWNlICopaGFuZGxlOworCisJLyogaW5pdCBkaWcgUEhZcywg ZGlzcCBlbmcgcGxsICovCisJYW1kZ3B1X2F0b21iaW9zX2VuY29kZXJfaW5pdF9kaWcoYWRldik7 CisJYW1kZ3B1X2F0b21iaW9zX2NydGNfc2V0X2Rpc3BfZW5nX3BsbChhZGV2LCBhZGV2LT5jbG9j ay5kZWZhdWx0X2Rpc3BjbGspOworCisJLyogaW5pdGlhbGl6ZSBocGQgKi8KKwlkY2VfdjZfMF9o cGRfaW5pdChhZGV2KTsKKworCWZvciAoaSA9IDA7IGkgPCBhZGV2LT5tb2RlX2luZm8uYXVkaW8u bnVtX3BpbnM7IGkrKykgeworCQlkY2VfdjZfMF9hdWRpb19lbmFibGUoYWRldiwgJmFkZXYtPm1v ZGVfaW5mby5hdWRpby5waW5baV0sIGZhbHNlKTsKKwl9CisKKwlkY2VfdjZfMF9wYWdlZmxpcF9p bnRlcnJ1cHRfaW5pdChhZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRjZV92 Nl8wX2h3X2Zpbmkodm9pZCAqaGFuZGxlKQoreworCWludCBpOworCXN0cnVjdCBhbWRncHVfZGV2 aWNlICphZGV2ID0gKHN0cnVjdCBhbWRncHVfZGV2aWNlICopaGFuZGxlOworCisJZGNlX3Y2XzBf aHBkX2ZpbmkoYWRldik7CisKKwlmb3IgKGkgPSAwOyBpIDwgYWRldi0+bW9kZV9pbmZvLmF1ZGlv Lm51bV9waW5zOyBpKyspIHsKKwkJZGNlX3Y2XzBfYXVkaW9fZW5hYmxlKGFkZXYsICZhZGV2LT5t b2RlX2luZm8uYXVkaW8ucGluW2ldLCBmYWxzZSk7CisJfQorCisJZGNlX3Y2XzBfcGFnZWZsaXBf aW50ZXJydXB0X2ZpbmkoYWRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkY2Vf djZfMF9zdXNwZW5kKHZvaWQgKmhhbmRsZSkKK3sKKwlzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRl diA9IChzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqKWhhbmRsZTsKKworCWFtZGdwdV9hdG9tYmlvc19z Y3JhdGNoX3JlZ3Nfc2F2ZShhZGV2KTsKKworCXJldHVybiBkY2VfdjZfMF9od19maW5pKGhhbmRs ZSk7Cit9CisKK3N0YXRpYyBpbnQgZGNlX3Y2XzBfcmVzdW1lKHZvaWQgKmhhbmRsZSkKK3sKKwlz dHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldiA9IChzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqKWhhbmRs ZTsKKwlpbnQgcmV0OworCisJcmV0ID0gZGNlX3Y2XzBfaHdfaW5pdChoYW5kbGUpOworCisJYW1k Z3B1X2F0b21iaW9zX3NjcmF0Y2hfcmVnc19yZXN0b3JlKGFkZXYpOworCisJLyogdHVybiBvbiB0 aGUgQkwgKi8KKwlpZiAoYWRldi0+bW9kZV9pbmZvLmJsX2VuY29kZXIpIHsKKwkJdTggYmxfbGV2 ZWwgPSBhbWRncHVfZGlzcGxheV9iYWNrbGlnaHRfZ2V0X2xldmVsKGFkZXYsCisJCQkJCQkJCSAg YWRldi0+bW9kZV9pbmZvLmJsX2VuY29kZXIpOworCQlhbWRncHVfZGlzcGxheV9iYWNrbGlnaHRf c2V0X2xldmVsKGFkZXYsIGFkZXYtPm1vZGVfaW5mby5ibF9lbmNvZGVyLAorCQkJCQkJICAgIGJs X2xldmVsKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgYm9vbCBkY2VfdjZfMF9p c19pZGxlKHZvaWQgKmhhbmRsZSkKK3sKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGludCBk Y2VfdjZfMF93YWl0X2Zvcl9pZGxlKHZvaWQgKmhhbmRsZSkKK3sKKwlyZXR1cm4gMDsKK30KKwor c3RhdGljIGludCBkY2VfdjZfMF9zb2Z0X3Jlc2V0KHZvaWQgKmhhbmRsZSkKK3sKKwlEUk1fSU5G TygieHh4eDogZGNlX3Y2XzBfc29mdF9yZXNldCAtLS0gbm8gaW1wbCEhXG4iKTsKKwlyZXR1cm4g MDsKK30KKworc3RhdGljIHZvaWQgZGNlX3Y2XzBfc2V0X2NydGNfdmJsYW5rX2ludGVycnVwdF9z dGF0ZShzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldiwKKwkJCQkJCSAgICAgaW50IGNydGMsCisJ CQkJCQkgICAgIGVudW0gYW1kZ3B1X2ludGVycnVwdF9zdGF0ZSBzdGF0ZSkKK3sKKwl1MzIgcmVn X2Jsb2NrLCBpbnRlcnJ1cHRfbWFzazsKKworCWlmIChjcnRjID49IGFkZXYtPm1vZGVfaW5mby5u dW1fY3J0YykgeworCQlEUk1fREVCVUcoImludmFsaWQgY3J0YyAlZFxuIiwgY3J0Yyk7CisJCXJl dHVybjsKKwl9CisKKwlzd2l0Y2ggKGNydGMpIHsKKwljYXNlIDA6CisJCXJlZ19ibG9jayA9IFNJ X0NSVEMwX1JFR0lTVEVSX09GRlNFVDsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlyZWdfYmxvY2sg PSBTSV9DUlRDMV9SRUdJU1RFUl9PRkZTRVQ7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJcmVnX2Js b2NrID0gU0lfQ1JUQzJfUkVHSVNURVJfT0ZGU0VUOworCQlicmVhazsKKwljYXNlIDM6CisJCXJl Z19ibG9jayA9IFNJX0NSVEMzX1JFR0lTVEVSX09GRlNFVDsKKwkJYnJlYWs7CisJY2FzZSA0Ogor CQlyZWdfYmxvY2sgPSBTSV9DUlRDNF9SRUdJU1RFUl9PRkZTRVQ7CisJCWJyZWFrOworCWNhc2Ug NToKKwkJcmVnX2Jsb2NrID0gU0lfQ1JUQzVfUkVHSVNURVJfT0ZGU0VUOworCQlicmVhazsKKwlk ZWZhdWx0OgorCQlEUk1fREVCVUcoImludmFsaWQgY3J0YyAlZFxuIiwgY3J0Yyk7CisJCXJldHVy bjsKKwl9CisKKwlzd2l0Y2ggKHN0YXRlKSB7CisJY2FzZSBBTURHUFVfSVJRX1NUQVRFX0RJU0FC TEU6CisJCWludGVycnVwdF9tYXNrID0gUlJFRzMyKElOVF9NQVNLICsgcmVnX2Jsb2NrKTsKKwkJ aW50ZXJydXB0X21hc2sgJj0gflZCTEFOS19JTlRfTUFTSzsKKwkJV1JFRzMyKElOVF9NQVNLICsg cmVnX2Jsb2NrLCBpbnRlcnJ1cHRfbWFzayk7CisJCWJyZWFrOworCWNhc2UgQU1ER1BVX0lSUV9T VEFURV9FTkFCTEU6CisJCWludGVycnVwdF9tYXNrID0gUlJFRzMyKElOVF9NQVNLICsgcmVnX2Js b2NrKTsKKwkJaW50ZXJydXB0X21hc2sgfD0gVkJMQU5LX0lOVF9NQVNLOworCQlXUkVHMzIoSU5U X01BU0sgKyByZWdfYmxvY2ssIGludGVycnVwdF9tYXNrKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoK KwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBkY2VfdjZfMF9zZXRfY3J0Y192bGluZV9p bnRlcnJ1cHRfc3RhdGUoc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYsCisJCQkJCQkgICAgaW50 IGNydGMsCisJCQkJCQkgICAgZW51bSBhbWRncHVfaW50ZXJydXB0X3N0YXRlIHN0YXRlKQorewor Cit9CisKK3N0YXRpYyBpbnQgZGNlX3Y2XzBfc2V0X2hwZF9pbnRlcnJ1cHRfc3RhdGUoc3RydWN0 IGFtZGdwdV9kZXZpY2UgKmFkZXYsCisJCQkJCSAgICBzdHJ1Y3QgYW1kZ3B1X2lycV9zcmMgKnNy YywKKwkJCQkJICAgIHVuc2lnbmVkIHR5cGUsCisJCQkJCSAgICBlbnVtIGFtZGdwdV9pbnRlcnJ1 cHRfc3RhdGUgc3RhdGUpCit7CisJdTMyIGRjX2hwZF9pbnRfY250bF9yZWcsIGRjX2hwZF9pbnRf Y250bDsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgQU1ER1BVX0hQRF8xOgorCQlkY19ocGRf aW50X2NudGxfcmVnID0gRENfSFBEMV9JTlRfQ09OVFJPTDsKKwkJYnJlYWs7CisJY2FzZSBBTURH UFVfSFBEXzI6CisJCWRjX2hwZF9pbnRfY250bF9yZWcgPSBEQ19IUEQyX0lOVF9DT05UUk9MOwor CQlicmVhazsKKwljYXNlIEFNREdQVV9IUERfMzoKKwkJZGNfaHBkX2ludF9jbnRsX3JlZyA9IERD X0hQRDNfSU5UX0NPTlRST0w7CisJCWJyZWFrOworCWNhc2UgQU1ER1BVX0hQRF80OgorCQlkY19o cGRfaW50X2NudGxfcmVnID0gRENfSFBENF9JTlRfQ09OVFJPTDsKKwkJYnJlYWs7CisJY2FzZSBB TURHUFVfSFBEXzU6CisJCWRjX2hwZF9pbnRfY250bF9yZWcgPSBEQ19IUEQ1X0lOVF9DT05UUk9M OworCQlicmVhazsKKwljYXNlIEFNREdQVV9IUERfNjoKKwkJZGNfaHBkX2ludF9jbnRsX3JlZyA9 IERDX0hQRDZfSU5UX0NPTlRST0w7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURSTV9ERUJVRygi aW52YWxpZCBoZHAgJWRcbiIsIHR5cGUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlzd2l0Y2ggKHN0 YXRlKSB7CisJY2FzZSBBTURHUFVfSVJRX1NUQVRFX0RJU0FCTEU6CisJCWRjX2hwZF9pbnRfY250 bCA9IFJSRUczMihkY19ocGRfaW50X2NudGxfcmVnKTsKKwkJZGNfaHBkX2ludF9jbnRsICY9IH4o RENfSFBEeF9JTlRfRU4gfCBEQ19IUER4X1JYX0lOVF9FTik7CisJCVdSRUczMihkY19ocGRfaW50 X2NudGxfcmVnLCBkY19ocGRfaW50X2NudGwpOworCQlicmVhazsKKwljYXNlIEFNREdQVV9JUlFf U1RBVEVfRU5BQkxFOgorCQlkY19ocGRfaW50X2NudGwgPSBSUkVHMzIoZGNfaHBkX2ludF9jbnRs X3JlZyk7CisJCWRjX2hwZF9pbnRfY250bCB8PSAoRENfSFBEeF9JTlRfRU4gfCBEQ19IUER4X1JY X0lOVF9FTik7CisJCVdSRUczMihkY19ocGRfaW50X2NudGxfcmVnLCBkY19ocGRfaW50X2NudGwp OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwor c3RhdGljIGludCBkY2VfdjZfMF9zZXRfY3J0Y19pbnRlcnJ1cHRfc3RhdGUoc3RydWN0IGFtZGdw dV9kZXZpY2UgKmFkZXYsCisJCQkJCSAgICAgc3RydWN0IGFtZGdwdV9pcnFfc3JjICpzcmMsCisJ CQkJCSAgICAgdW5zaWduZWQgdHlwZSwKKwkJCQkJICAgICBlbnVtIGFtZGdwdV9pbnRlcnJ1cHRf c3RhdGUgc3RhdGUpCit7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBBTURHUFVfQ1JUQ19JUlFf VkJMQU5LMToKKwkJZGNlX3Y2XzBfc2V0X2NydGNfdmJsYW5rX2ludGVycnVwdF9zdGF0ZShhZGV2 LCAwLCBzdGF0ZSk7CisJCWJyZWFrOworCWNhc2UgQU1ER1BVX0NSVENfSVJRX1ZCTEFOSzI6CisJ CWRjZV92Nl8wX3NldF9jcnRjX3ZibGFua19pbnRlcnJ1cHRfc3RhdGUoYWRldiwgMSwgc3RhdGUp OworCQlicmVhazsKKwljYXNlIEFNREdQVV9DUlRDX0lSUV9WQkxBTkszOgorCQlkY2VfdjZfMF9z ZXRfY3J0Y192YmxhbmtfaW50ZXJydXB0X3N0YXRlKGFkZXYsIDIsIHN0YXRlKTsKKwkJYnJlYWs7 CisJY2FzZSBBTURHUFVfQ1JUQ19JUlFfVkJMQU5LNDoKKwkJZGNlX3Y2XzBfc2V0X2NydGNfdmJs YW5rX2ludGVycnVwdF9zdGF0ZShhZGV2LCAzLCBzdGF0ZSk7CisJCWJyZWFrOworCWNhc2UgQU1E R1BVX0NSVENfSVJRX1ZCTEFOSzU6CisJCWRjZV92Nl8wX3NldF9jcnRjX3ZibGFua19pbnRlcnJ1 cHRfc3RhdGUoYWRldiwgNCwgc3RhdGUpOworCQlicmVhazsKKwljYXNlIEFNREdQVV9DUlRDX0lS UV9WQkxBTks2OgorCQlkY2VfdjZfMF9zZXRfY3J0Y192YmxhbmtfaW50ZXJydXB0X3N0YXRlKGFk ZXYsIDUsIHN0YXRlKTsKKwkJYnJlYWs7CisJY2FzZSBBTURHUFVfQ1JUQ19JUlFfVkxJTkUxOgor CQlkY2VfdjZfMF9zZXRfY3J0Y192bGluZV9pbnRlcnJ1cHRfc3RhdGUoYWRldiwgMCwgc3RhdGUp OworCQlicmVhazsKKwljYXNlIEFNREdQVV9DUlRDX0lSUV9WTElORTI6CisJCWRjZV92Nl8wX3Nl dF9jcnRjX3ZsaW5lX2ludGVycnVwdF9zdGF0ZShhZGV2LCAxLCBzdGF0ZSk7CisJCWJyZWFrOwor CWNhc2UgQU1ER1BVX0NSVENfSVJRX1ZMSU5FMzoKKwkJZGNlX3Y2XzBfc2V0X2NydGNfdmxpbmVf aW50ZXJydXB0X3N0YXRlKGFkZXYsIDIsIHN0YXRlKTsKKwkJYnJlYWs7CisJY2FzZSBBTURHUFVf Q1JUQ19JUlFfVkxJTkU0OgorCQlkY2VfdjZfMF9zZXRfY3J0Y192bGluZV9pbnRlcnJ1cHRfc3Rh dGUoYWRldiwgMywgc3RhdGUpOworCQlicmVhazsKKwljYXNlIEFNREdQVV9DUlRDX0lSUV9WTElO RTU6CisJCWRjZV92Nl8wX3NldF9jcnRjX3ZsaW5lX2ludGVycnVwdF9zdGF0ZShhZGV2LCA0LCBz dGF0ZSk7CisJCWJyZWFrOworCWNhc2UgQU1ER1BVX0NSVENfSVJRX1ZMSU5FNjoKKwkJZGNlX3Y2 XzBfc2V0X2NydGNfdmxpbmVfaW50ZXJydXB0X3N0YXRlKGFkZXYsIDUsIHN0YXRlKTsKKwkJYnJl YWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50 IGRjZV92Nl8wX2NydGNfaXJxKHN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2LAorCQkJICAgICBz dHJ1Y3QgYW1kZ3B1X2lycV9zcmMgKnNvdXJjZSwKKwkJCSAgICAgc3RydWN0IGFtZGdwdV9pdl9l bnRyeSAqZW50cnkpCit7CisJdW5zaWduZWQgY3J0YyA9IGVudHJ5LT5zcmNfaWQgLSAxOworCS8v dWludDMyX3QgZGlzcF9pbnQgPSBSUkVHMzIoaW50ZXJydXB0X3N0YXR1c19vZmZzZXRzW2NydGNd LnJlZyk7CisJdW5zaWduZWQgaXJxX3R5cGUgPSBhbWRncHVfY3J0Y19pZHhfdG9faXJxX3R5cGUo YWRldiwgY3J0Yyk7CisKKwlzd2l0Y2ggKGVudHJ5LT5zcmNfZGF0YSkgeworCWNhc2UgMDogLyog dmJsYW5rICovCisKKwkJaWYgKGFtZGdwdV9pcnFfZW5hYmxlZChhZGV2LCBzb3VyY2UsIGlycV90 eXBlKSkgeworCQkJZHJtX2hhbmRsZV92YmxhbmsoYWRldi0+ZGRldiwgY3J0Yyk7CisJCX0KKwkJ RFJNX0lORk8oIklIOiBEJWQgdmJsYW5rXG4iLCBjcnRjICsgMSk7CisKKwkJYnJlYWs7CisJY2Fz ZSAxOiAvKiB2bGluZSAqLworCisJCURSTV9JTkZPKCJJSDogRCVkIHZsaW5lXG4iLCBjcnRjICsg MSk7CisKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJRFJNX0RFQlVHKCJVbmhhbmRsZWQgaW50ZXJy dXB0OiAlZCAlZFxuIiwgZW50cnktPnNyY19pZCwgZW50cnktPnNyY19kYXRhKTsKKwkJYnJlYWs7 CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGNlX3Y2XzBfc2V0X3BhZ2VmbGlw X2ludGVycnVwdF9zdGF0ZShzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldiwKKwkJCQkJCSBzdHJ1 Y3QgYW1kZ3B1X2lycV9zcmMgKnNyYywKKwkJCQkJCSB1bnNpZ25lZCB0eXBlLAorCQkJCQkJIGVu dW0gYW1kZ3B1X2ludGVycnVwdF9zdGF0ZSBzdGF0ZSkKK3sKKwl1MzIgcmVnOworCisJaWYgKHR5 cGUgPj0gYWRldi0+bW9kZV9pbmZvLm51bV9jcnRjKSB7CisJCURSTV9FUlJPUigiaW52YWxpZCBw YWdlZmxpcCBjcnRjICVkXG4iLCB0eXBlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmVn ID0gUlJFRzMyKEdSUEhfSU5UX0NPTlRST0wgKyBjcnRjX29mZnNldHNbdHlwZV0pOworCWlmIChz dGF0ZSA9PSBBTURHUFVfSVJRX1NUQVRFX0RJU0FCTEUpCisJCVdSRUczMihHUlBIX0lOVF9DT05U Uk9MICsgY3J0Y19vZmZzZXRzW3R5cGVdLAorCQkgICAgICAgcmVnICYgfkdSUEhfSU5URVJSVVBU X0NPTlRST0xfX0dSUEhfUEZMSVBfSU5UX01BU0tfTUFTSyk7CisJZWxzZQorCQlXUkVHMzIoR1JQ SF9JTlRfQ09OVFJPTCArIGNydGNfb2Zmc2V0c1t0eXBlXSwKKwkJICAgICAgIHJlZyB8IEdSUEhf SU5URVJSVVBUX0NPTlRST0xfX0dSUEhfUEZMSVBfSU5UX01BU0tfTUFTSyk7CisKKwlyZXR1cm4g MDsKK30KKworc3RhdGljIGludCBkY2VfdjZfMF9wYWdlZmxpcF9pcnEoc3RydWN0IGFtZGdwdV9k ZXZpY2UgKmFkZXYsCisJCQkJc3RydWN0IGFtZGdwdV9pcnFfc3JjICpzb3VyY2UsCisJCQkJc3Ry dWN0IGFtZGdwdV9pdl9lbnRyeSAqZW50cnkpCit7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJ dW5zaWduZWQgY3J0Y19pZDsKKwlzdHJ1Y3QgYW1kZ3B1X2NydGMgKmFtZGdwdV9jcnRjOworCXN0 cnVjdCBhbWRncHVfZmxpcF93b3JrICp3b3JrczsKKworCWNydGNfaWQgPSAoZW50cnktPnNyY19p ZCAtIDgpID4+IDE7CisJYW1kZ3B1X2NydGMgPSBhZGV2LT5tb2RlX2luZm8uY3J0Y3NbY3J0Y19p ZF07CisKKwlpZiAoY3J0Y19pZCA+PSBhZGV2LT5tb2RlX2luZm8ubnVtX2NydGMpIHsKKwkJRFJN X0VSUk9SKCJpbnZhbGlkIHBhZ2VmbGlwIGNydGMgJWRcbiIsIGNydGNfaWQpOworCQlyZXR1cm4g LUVJTlZBTDsKKwl9CisKKwlpZiAoUlJFRzMyKEdSUEhfSU5UX1NUQVRVUyArIGNydGNfb2Zmc2V0 c1tjcnRjX2lkXSkgJgorCSAgICBHUlBIX0lOVEVSUlVQVF9TVEFUVVNfX0dSUEhfUEZMSVBfSU5U X09DQ1VSUkVEX01BU0spCisJCVdSRUczMihHUlBIX0lOVF9TVEFUVVMgKyBjcnRjX29mZnNldHNb Y3J0Y19pZF0sCisJCSAgICAgICBHUlBIX0lOVEVSUlVQVF9TVEFUVVNfX0dSUEhfUEZMSVBfSU5U X0NMRUFSX01BU0spOworCisJLyogSVJRIGNvdWxkIG9jY3VyIHdoZW4gaW4gaW5pdGlhbCBzdGFn ZSAqLworCWlmIChhbWRncHVfY3J0YyA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCXNwaW5fbG9j a19pcnFzYXZlKCZhZGV2LT5kZGV2LT5ldmVudF9sb2NrLCBmbGFncyk7CisJd29ya3MgPSBhbWRn cHVfY3J0Yy0+cGZsaXBfd29ya3M7CisJaWYgKGFtZGdwdV9jcnRjLT5wZmxpcF9zdGF0dXMgIT0g QU1ER1BVX0ZMSVBfU1VCTUlUVEVEKXsKKwkJRFJNX0RFQlVHX0RSSVZFUigiYW1kZ3B1X2NydGMt PnBmbGlwX3N0YXR1cyA9ICVkICE9ICIKKwkJCQkJCSJBTURHUFVfRkxJUF9TVUJNSVRURUQoJWQp XG4iLAorCQkJCQkJYW1kZ3B1X2NydGMtPnBmbGlwX3N0YXR1cywKKwkJCQkJCUFNREdQVV9GTElQ X1NVQk1JVFRFRCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkZXYtPmRkZXYtPmV2ZW50 X2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogcGFnZSBmbGlwIGNvbXBsZXRl ZC4gY2xlYW4gdXAgKi8KKwlhbWRncHVfY3J0Yy0+cGZsaXBfc3RhdHVzID0gQU1ER1BVX0ZMSVBf Tk9ORTsKKwlhbWRncHVfY3J0Yy0+cGZsaXBfd29ya3MgPSBOVUxMOworCisJLyogd2FrZXVwIHVz ZXJzYXBjZSAqLworCWlmICh3b3Jrcy0+ZXZlbnQpCisJCWRybV9zZW5kX3ZibGFua19ldmVudChh ZGV2LT5kZGV2LCBjcnRjX2lkLCB3b3Jrcy0+ZXZlbnQpOworCisJc3Bpbl91bmxvY2tfaXJxcmVz dG9yZSgmYWRldi0+ZGRldi0+ZXZlbnRfbG9jaywgZmxhZ3MpOworCisJZHJtX3ZibGFua19wdXQo YWRldi0+ZGRldiwgYW1kZ3B1X2NydGMtPmNydGNfaWQpOworCXNjaGVkdWxlX3dvcmsoJndvcmtz LT51bnBpbl93b3JrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRjZV92Nl8wX2hw ZF9pcnEoc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYsCisJCQkgICAgc3RydWN0IGFtZGdwdV9p cnFfc3JjICpzb3VyY2UsCisJCQkgICAgc3RydWN0IGFtZGdwdV9pdl9lbnRyeSAqZW50cnkpCit7 CisJdWludDMyX3QgZGlzcF9pbnQsIG1hc2ssIGludF9jb250cm9sLCB0bXA7CisJdW5zaWduZWQg aHBkOworCisJaWYgKGVudHJ5LT5zcmNfZGF0YSA+IDYpIHsKKwkJRFJNX0RFQlVHKCJVbmhhbmRs ZWQgaW50ZXJydXB0OiAlZCAlZFxuIiwgZW50cnktPnNyY19pZCwgZW50cnktPnNyY19kYXRhKTsK KwkJcmV0dXJuIDA7CisJfQorCisJaHBkID0gZW50cnktPnNyY19kYXRhOworCWRpc3BfaW50ID0g UlJFRzMyKGludGVycnVwdF9zdGF0dXNfb2Zmc2V0c1tocGRdLnJlZyk7CisJbWFzayA9IGludGVy cnVwdF9zdGF0dXNfb2Zmc2V0c1tocGRdLmhwZDsKKwlpbnRfY29udHJvbCA9IGhwZF9pbnRfY29u dHJvbF9vZmZzZXRzW2hwZF07CisKKwlpZiAoZGlzcF9pbnQgJiBtYXNrKSB7CisJCXRtcCA9IFJS RUczMihpbnRfY29udHJvbCk7CisJCXRtcCB8PSBEQ19IUEQxX0lOVF9DT05UUk9MX19EQ19IUEQx X0lOVF9BQ0tfTUFTSzsKKwkJV1JFRzMyKGludF9jb250cm9sLCB0bXApOworCQlzY2hlZHVsZV93 b3JrKCZhZGV2LT5ob3RwbHVnX3dvcmspOworCQlEUk1fSU5GTygiSUg6IEhQRCVkXG4iLCBocGQg KyAxKTsKKwl9CisKKwlyZXR1cm4gMDsKKworfQorCitzdGF0aWMgaW50IGRjZV92Nl8wX3NldF9j bG9ja2dhdGluZ19zdGF0ZSh2b2lkICpoYW5kbGUsCisJCQkJCSAgZW51bSBhbWRfY2xvY2tnYXRp bmdfc3RhdGUgc3RhdGUpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGNlX3Y2XzBf c2V0X3Bvd2VyZ2F0aW5nX3N0YXRlKHZvaWQgKmhhbmRsZSwKKwkJCQkJICBlbnVtIGFtZF9wb3dl cmdhdGluZ19zdGF0ZSBzdGF0ZSkKK3sKKwlyZXR1cm4gMDsKK30KKworY29uc3Qgc3RydWN0IGFt ZF9pcF9mdW5jcyBkY2VfdjZfMF9pcF9mdW5jcyA9IHsKKwkubmFtZSA9ICJkY2VfdjZfMCIsCisJ LmVhcmx5X2luaXQgPSBkY2VfdjZfMF9lYXJseV9pbml0LAorCS5sYXRlX2luaXQgPSBOVUxMLAor CS5zd19pbml0ID0gZGNlX3Y2XzBfc3dfaW5pdCwKKwkuc3dfZmluaSA9IGRjZV92Nl8wX3N3X2Zp bmksCisJLmh3X2luaXQgPSBkY2VfdjZfMF9od19pbml0LAorCS5od19maW5pID0gZGNlX3Y2XzBf aHdfZmluaSwKKwkuc3VzcGVuZCA9IGRjZV92Nl8wX3N1c3BlbmQsCisJLnJlc3VtZSA9IGRjZV92 Nl8wX3Jlc3VtZSwKKwkuaXNfaWRsZSA9IGRjZV92Nl8wX2lzX2lkbGUsCisJLndhaXRfZm9yX2lk bGUgPSBkY2VfdjZfMF93YWl0X2Zvcl9pZGxlLAorCS5zb2Z0X3Jlc2V0ID0gZGNlX3Y2XzBfc29m dF9yZXNldCwKKwkuc2V0X2Nsb2NrZ2F0aW5nX3N0YXRlID0gZGNlX3Y2XzBfc2V0X2Nsb2NrZ2F0 aW5nX3N0YXRlLAorCS5zZXRfcG93ZXJnYXRpbmdfc3RhdGUgPSBkY2VfdjZfMF9zZXRfcG93ZXJn YXRpbmdfc3RhdGUsCit9OworCitzdGF0aWMgdm9pZAorZGNlX3Y2XzBfZW5jb2Rlcl9tb2RlX3Nl dChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsCisJCQkgIHN0cnVjdCBkcm1fZGlzcGxheV9t b2RlICptb2RlLAorCQkJICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqYWRqdXN0ZWRfbW9kZSkK K3sKKworCXN0cnVjdCBhbWRncHVfZW5jb2RlciAqYW1kZ3B1X2VuY29kZXIgPSB0b19hbWRncHVf ZW5jb2RlcihlbmNvZGVyKTsKKworCWFtZGdwdV9lbmNvZGVyLT5waXhlbF9jbG9jayA9IGFkanVz dGVkX21vZGUtPmNsb2NrOworCisJLyogbmVlZCB0byBjYWxsIHRoaXMgaGVyZSByYXRoZXIgdGhh biBpbiBwcmVwYXJlKCkgc2luY2Ugd2UgbmVlZCBzb21lIGNydGMgaW5mbyAqLworCWFtZGdwdV9h dG9tYmlvc19lbmNvZGVyX2RwbXMoZW5jb2RlciwgRFJNX01PREVfRFBNU19PRkYpOworCisJLyog c2V0IHNjYWxlciBjbGVhcnMgdGhpcyBvbiBzb21lIGNoaXBzICovCisJZGNlX3Y2XzBfc2V0X2lu dGVybGVhdmUoZW5jb2Rlci0+Y3J0YywgbW9kZSk7CisKKwlpZiAoYW1kZ3B1X2F0b21iaW9zX2Vu Y29kZXJfZ2V0X2VuY29kZXJfbW9kZShlbmNvZGVyKSA9PSBBVE9NX0VOQ09ERVJfTU9ERV9IRE1J KSB7CisJCWRjZV92Nl8wX2FmbXRfZW5hYmxlKGVuY29kZXIsIHRydWUpOworCQlkY2VfdjZfMF9h Zm10X3NldG1vZGUoZW5jb2RlciwgYWRqdXN0ZWRfbW9kZSk7CisJfQorfQorCitzdGF0aWMgdm9p ZCBkY2VfdjZfMF9lbmNvZGVyX3ByZXBhcmUoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQor eworCisJc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYgPSBlbmNvZGVyLT5kZXYtPmRldl9wcml2 YXRlOworCXN0cnVjdCBhbWRncHVfZW5jb2RlciAqYW1kZ3B1X2VuY29kZXIgPSB0b19hbWRncHVf ZW5jb2RlcihlbmNvZGVyKTsKKwlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yID0gYW1k Z3B1X2dldF9jb25uZWN0b3JfZm9yX2VuY29kZXIoZW5jb2Rlcik7CisKKwlpZiAoKGFtZGdwdV9l bmNvZGVyLT5hY3RpdmVfZGV2aWNlICYKKwkgICAgIChBVE9NX0RFVklDRV9ERlBfU1VQUE9SVCB8 IEFUT01fREVWSUNFX0xDRF9TVVBQT1JUKSkgfHwKKwkgICAgKGFtZGdwdV9lbmNvZGVyX2dldF9k cF9icmlkZ2VfZW5jb2Rlcl9pZChlbmNvZGVyKSAhPQorCSAgICAgRU5DT0RFUl9PQkpFQ1RfSURf Tk9ORSkpIHsKKwkJc3RydWN0IGFtZGdwdV9lbmNvZGVyX2F0b21fZGlnICpkaWcgPSBhbWRncHVf ZW5jb2Rlci0+ZW5jX3ByaXY7CisJCWlmIChkaWcpIHsKKwkJCWRpZy0+ZGlnX2VuY29kZXIgPSBk Y2VfdjZfMF9waWNrX2RpZ19lbmNvZGVyKGVuY29kZXIpOworCQkJaWYgKGFtZGdwdV9lbmNvZGVy LT5hY3RpdmVfZGV2aWNlICYgQVRPTV9ERVZJQ0VfREZQX1NVUFBPUlQpCisJCQkJZGlnLT5hZm10 ID0gYWRldi0+bW9kZV9pbmZvLmFmbXRbZGlnLT5kaWdfZW5jb2Rlcl07CisJCX0KKwl9CisKKwlh bWRncHVfYXRvbWJpb3Nfc2NyYXRjaF9yZWdzX2xvY2soYWRldiwgdHJ1ZSk7CisKKwlpZiAoY29u bmVjdG9yKSB7CisJCXN0cnVjdCBhbWRncHVfY29ubmVjdG9yICphbWRncHVfY29ubmVjdG9yID0g dG9fYW1kZ3B1X2Nvbm5lY3Rvcihjb25uZWN0b3IpOworCisJCS8qIHNlbGVjdCB0aGUgY2xvY2sv ZGF0YSBwb3J0IGlmIGl0IHVzZXMgYSByb3V0ZXIgKi8KKwkJaWYgKGFtZGdwdV9jb25uZWN0b3It PnJvdXRlci5jZF92YWxpZCkKKwkJCWFtZGdwdV9pMmNfcm91dGVyX3NlbGVjdF9jZF9wb3J0KGFt ZGdwdV9jb25uZWN0b3IpOworCisJCS8qIHR1cm4gZURQIHBhbmVsIG9uIGZvciBtb2RlIHNldCAq LworCQlpZiAoY29ubmVjdG9yLT5jb25uZWN0b3JfdHlwZSA9PSBEUk1fTU9ERV9DT05ORUNUT1Jf ZURQKQorCQkJYW1kZ3B1X2F0b21iaW9zX2VuY29kZXJfc2V0X2VkcF9wYW5lbF9wb3dlcihjb25u ZWN0b3IsCisJCQkJCQkJICAgICBBVE9NX1RSQU5TTUlUVEVSX0FDVElPTl9QT1dFUl9PTik7CisJ fQorCisJLyogdGhpcyBpcyBuZWVkZWQgZm9yIHRoZSBwbGwvc3Mgc2V0dXAgdG8gd29yayBjb3Jy ZWN0bHkgaW4gc29tZSBjYXNlcyAqLworCWFtZGdwdV9hdG9tYmlvc19lbmNvZGVyX3NldF9jcnRj X3NvdXJjZShlbmNvZGVyKTsKKwkvKiBzZXQgdXAgdGhlIEZNVCBibG9ja3MgKi8KKwlkY2VfdjZf MF9wcm9ncmFtX2ZtdChlbmNvZGVyKTsKK30KKworc3RhdGljIHZvaWQgZGNlX3Y2XzBfZW5jb2Rl cl9jb21taXQoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQoreworCisJc3RydWN0IGRybV9k ZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKKwlzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldiA9 IGRldi0+ZGV2X3ByaXZhdGU7CisKKwkvKiBuZWVkIHRvIGNhbGwgdGhpcyBoZXJlIGFzIHdlIG5l ZWQgdGhlIGNydGMgc2V0IHVwICovCisJYW1kZ3B1X2F0b21iaW9zX2VuY29kZXJfZHBtcyhlbmNv ZGVyLCBEUk1fTU9ERV9EUE1TX09OKTsKKwlhbWRncHVfYXRvbWJpb3Nfc2NyYXRjaF9yZWdzX2xv Y2soYWRldiwgZmFsc2UpOworfQorCitzdGF0aWMgdm9pZCBkY2VfdjZfMF9lbmNvZGVyX2Rpc2Fi bGUoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQoreworCisJc3RydWN0IGFtZGdwdV9lbmNv ZGVyICphbWRncHVfZW5jb2RlciA9IHRvX2FtZGdwdV9lbmNvZGVyKGVuY29kZXIpOworCXN0cnVj dCBhbWRncHVfZW5jb2Rlcl9hdG9tX2RpZyAqZGlnOworCisJYW1kZ3B1X2F0b21iaW9zX2VuY29k ZXJfZHBtcyhlbmNvZGVyLCBEUk1fTU9ERV9EUE1TX09GRik7CisKKwlpZiAoYW1kZ3B1X2F0b21i aW9zX2VuY29kZXJfaXNfZGlnaXRhbChlbmNvZGVyKSkgeworCQlpZiAoYW1kZ3B1X2F0b21iaW9z X2VuY29kZXJfZ2V0X2VuY29kZXJfbW9kZShlbmNvZGVyKSA9PSBBVE9NX0VOQ09ERVJfTU9ERV9I RE1JKQorCQkJZGNlX3Y2XzBfYWZtdF9lbmFibGUoZW5jb2RlciwgZmFsc2UpOworCQlkaWcgPSBh bWRncHVfZW5jb2Rlci0+ZW5jX3ByaXY7CisJCWRpZy0+ZGlnX2VuY29kZXIgPSAtMTsKKwl9CisJ YW1kZ3B1X2VuY29kZXItPmFjdGl2ZV9kZXZpY2UgPSAwOworfQorCisvKiB0aGVzZSBhcmUgaGFu ZGxlZCBieSB0aGUgcHJpbWFyeSBlbmNvZGVycyAqLworc3RhdGljIHZvaWQgZGNlX3Y2XzBfZXh0 X3ByZXBhcmUoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQoreworCit9CisKK3N0YXRpYyB2 b2lkIGRjZV92Nl8wX2V4dF9jb21taXQoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQorewor Cit9CisKK3N0YXRpYyB2b2lkCitkY2VfdjZfMF9leHRfbW9kZV9zZXQoc3RydWN0IGRybV9lbmNv ZGVyICplbmNvZGVyLAorCQkgICAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSwKKwkJ ICAgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmFkanVzdGVkX21vZGUpCit7CisKK30KKwor c3RhdGljIHZvaWQgZGNlX3Y2XzBfZXh0X2Rpc2FibGUoc3RydWN0IGRybV9lbmNvZGVyICplbmNv ZGVyKQoreworCit9CisKK3N0YXRpYyB2b2lkCitkY2VfdjZfMF9leHRfZHBtcyhzdHJ1Y3QgZHJt X2VuY29kZXIgKmVuY29kZXIsIGludCBtb2RlKQoreworCit9CisKK3N0YXRpYyBib29sIGRjZV92 Nl8wX2V4dF9tb2RlX2ZpeHVwKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwKKwkJCQkgICAg Y29uc3Qgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsCisJCQkJICAgIHN0cnVjdCBkcm1f ZGlzcGxheV9tb2RlICphZGp1c3RlZF9tb2RlKQoreworCXJldHVybiB0cnVlOworfQorCitzdGF0 aWMgY29uc3Qgc3RydWN0IGRybV9lbmNvZGVyX2hlbHBlcl9mdW5jcyBkY2VfdjZfMF9leHRfaGVs cGVyX2Z1bmNzID0geworCS5kcG1zID0gZGNlX3Y2XzBfZXh0X2RwbXMsCisJLm1vZGVfZml4dXAg PSBkY2VfdjZfMF9leHRfbW9kZV9maXh1cCwKKwkucHJlcGFyZSA9IGRjZV92Nl8wX2V4dF9wcmVw YXJlLAorCS5tb2RlX3NldCA9IGRjZV92Nl8wX2V4dF9tb2RlX3NldCwKKwkuY29tbWl0ID0gZGNl X3Y2XzBfZXh0X2NvbW1pdCwKKwkuZGlzYWJsZSA9IGRjZV92Nl8wX2V4dF9kaXNhYmxlLAorCS8q IG5vIGRldGVjdCBmb3IgVE1EUy9MVkRTIHlldCAqLworfTsKKworc3RhdGljIGNvbnN0IHN0cnVj dCBkcm1fZW5jb2Rlcl9oZWxwZXJfZnVuY3MgZGNlX3Y2XzBfZGlnX2hlbHBlcl9mdW5jcyA9IHsK KwkuZHBtcyA9IGFtZGdwdV9hdG9tYmlvc19lbmNvZGVyX2RwbXMsCisJLm1vZGVfZml4dXAgPSBh bWRncHVfYXRvbWJpb3NfZW5jb2Rlcl9tb2RlX2ZpeHVwLAorCS5wcmVwYXJlID0gZGNlX3Y2XzBf ZW5jb2Rlcl9wcmVwYXJlLAorCS5tb2RlX3NldCA9IGRjZV92Nl8wX2VuY29kZXJfbW9kZV9zZXQs CisJLmNvbW1pdCA9IGRjZV92Nl8wX2VuY29kZXJfY29tbWl0LAorCS5kaXNhYmxlID0gZGNlX3Y2 XzBfZW5jb2Rlcl9kaXNhYmxlLAorCS5kZXRlY3QgPSBhbWRncHVfYXRvbWJpb3NfZW5jb2Rlcl9k aWdfZGV0ZWN0LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fZW5jb2Rlcl9oZWxwZXJf ZnVuY3MgZGNlX3Y2XzBfZGFjX2hlbHBlcl9mdW5jcyA9IHsKKwkuZHBtcyA9IGFtZGdwdV9hdG9t Ymlvc19lbmNvZGVyX2RwbXMsCisJLm1vZGVfZml4dXAgPSBhbWRncHVfYXRvbWJpb3NfZW5jb2Rl cl9tb2RlX2ZpeHVwLAorCS5wcmVwYXJlID0gZGNlX3Y2XzBfZW5jb2Rlcl9wcmVwYXJlLAorCS5t b2RlX3NldCA9IGRjZV92Nl8wX2VuY29kZXJfbW9kZV9zZXQsCisJLmNvbW1pdCA9IGRjZV92Nl8w X2VuY29kZXJfY29tbWl0LAorCS5kZXRlY3QgPSBhbWRncHVfYXRvbWJpb3NfZW5jb2Rlcl9kYWNf ZGV0ZWN0LAorfTsKKworc3RhdGljIHZvaWQgZGNlX3Y2XzBfZW5jb2Rlcl9kZXN0cm95KHN0cnVj dCBkcm1fZW5jb2RlciAqZW5jb2RlcikKK3sKKwlzdHJ1Y3QgYW1kZ3B1X2VuY29kZXIgKmFtZGdw dV9lbmNvZGVyID0gdG9fYW1kZ3B1X2VuY29kZXIoZW5jb2Rlcik7CisJaWYgKGFtZGdwdV9lbmNv ZGVyLT5kZXZpY2VzICYgKEFUT01fREVWSUNFX0xDRF9TVVBQT1JUKSkKKwkJYW1kZ3B1X2F0b21i aW9zX2VuY29kZXJfZmluaV9iYWNrbGlnaHQoYW1kZ3B1X2VuY29kZXIpOworCWtmcmVlKGFtZGdw dV9lbmNvZGVyLT5lbmNfcHJpdik7CisJZHJtX2VuY29kZXJfY2xlYW51cChlbmNvZGVyKTsKKwlr ZnJlZShhbWRncHVfZW5jb2Rlcik7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2VuY29k ZXJfZnVuY3MgZGNlX3Y2XzBfZW5jb2Rlcl9mdW5jcyA9IHsKKwkuZGVzdHJveSA9IGRjZV92Nl8w X2VuY29kZXJfZGVzdHJveSwKK307CisKK3N0YXRpYyB2b2lkIGRjZV92Nl8wX2VuY29kZXJfYWRk KHN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2LAorCQkJCSB1aW50MzJfdCBlbmNvZGVyX2VudW0s CisJCQkJIHVpbnQzMl90IHN1cHBvcnRlZF9kZXZpY2UsCisJCQkJIHUxNiBjYXBzKQoreworCXN0 cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBhZGV2LT5kZGV2OworCXN0cnVjdCBkcm1fZW5jb2RlciAq ZW5jb2RlcjsKKwlzdHJ1Y3QgYW1kZ3B1X2VuY29kZXIgKmFtZGdwdV9lbmNvZGVyOworCisJLyog c2VlIGlmIHdlIGFscmVhZHkgYWRkZWQgaXQgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVuY29k ZXIsICZkZXYtPm1vZGVfY29uZmlnLmVuY29kZXJfbGlzdCwgaGVhZCkgeworCQlhbWRncHVfZW5j b2RlciA9IHRvX2FtZGdwdV9lbmNvZGVyKGVuY29kZXIpOworCQlpZiAoYW1kZ3B1X2VuY29kZXIt PmVuY29kZXJfZW51bSA9PSBlbmNvZGVyX2VudW0pIHsKKwkJCWFtZGdwdV9lbmNvZGVyLT5kZXZp Y2VzIHw9IHN1cHBvcnRlZF9kZXZpY2U7CisJCQlyZXR1cm47CisJCX0KKworCX0KKworCS8qIGFk ZCBhIG5ldyBvbmUgKi8KKwlhbWRncHVfZW5jb2RlciA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBh bWRncHVfZW5jb2RlciksIEdGUF9LRVJORUwpOworCWlmICghYW1kZ3B1X2VuY29kZXIpCisJCXJl dHVybjsKKworCWVuY29kZXIgPSAmYW1kZ3B1X2VuY29kZXItPmJhc2U7CisJc3dpdGNoIChhZGV2 LT5tb2RlX2luZm8ubnVtX2NydGMpIHsKKwljYXNlIDE6CisJCWVuY29kZXItPnBvc3NpYmxlX2Ny dGNzID0gMHgxOworCQlicmVhazsKKwljYXNlIDI6CisJZGVmYXVsdDoKKwkJZW5jb2Rlci0+cG9z c2libGVfY3J0Y3MgPSAweDM7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJZW5jb2Rlci0+cG9zc2li bGVfY3J0Y3MgPSAweGY7CisJCWJyZWFrOworCWNhc2UgNjoKKwkJZW5jb2Rlci0+cG9zc2libGVf Y3J0Y3MgPSAweDNmOworCQlicmVhazsKKwl9CisKKwlhbWRncHVfZW5jb2Rlci0+ZW5jX3ByaXYg PSBOVUxMOworCisJYW1kZ3B1X2VuY29kZXItPmVuY29kZXJfZW51bSA9IGVuY29kZXJfZW51bTsK KwlhbWRncHVfZW5jb2Rlci0+ZW5jb2Rlcl9pZCA9IChlbmNvZGVyX2VudW0gJiBPQkpFQ1RfSURf TUFTSykgPj4gT0JKRUNUX0lEX1NISUZUOworCWFtZGdwdV9lbmNvZGVyLT5kZXZpY2VzID0gc3Vw cG9ydGVkX2RldmljZTsKKwlhbWRncHVfZW5jb2Rlci0+cm14X3R5cGUgPSBSTVhfT0ZGOworCWFt ZGdwdV9lbmNvZGVyLT51bmRlcnNjYW5fdHlwZSA9IFVOREVSU0NBTl9PRkY7CisJYW1kZ3B1X2Vu Y29kZXItPmlzX2V4dF9lbmNvZGVyID0gZmFsc2U7CisJYW1kZ3B1X2VuY29kZXItPmNhcHMgPSBj YXBzOworCisJc3dpdGNoIChhbWRncHVfZW5jb2Rlci0+ZW5jb2Rlcl9pZCkgeworCWNhc2UgRU5D T0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfS0xEU0NQX0RBQzE6CisJY2FzZSBFTkNPREVSX09CSkVD VF9JRF9JTlRFUk5BTF9LTERTQ1BfREFDMjoKKwkJZHJtX2VuY29kZXJfaW5pdChkZXYsIGVuY29k ZXIsICZkY2VfdjZfMF9lbmNvZGVyX2Z1bmNzLAorCQkJCSBEUk1fTU9ERV9FTkNPREVSX0RBQywg TlVMTCk7CisJCWRybV9lbmNvZGVyX2hlbHBlcl9hZGQoZW5jb2RlciwgJmRjZV92Nl8wX2RhY19o ZWxwZXJfZnVuY3MpOworCQlicmVhazsKKwljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFM X0tMRFNDUF9EVk8xOgorCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfVU5JUEhZOgor CWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfVU5JUEhZMToKKwljYXNlIEVOQ09ERVJf T0JKRUNUX0lEX0lOVEVSTkFMX1VOSVBIWTI6CisJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRF Uk5BTF9VTklQSFkzOgorCQlpZiAoYW1kZ3B1X2VuY29kZXItPmRldmljZXMgJiAoQVRPTV9ERVZJ Q0VfTENEX1NVUFBPUlQpKSB7CisJCQlhbWRncHVfZW5jb2Rlci0+cm14X3R5cGUgPSBSTVhfRlVM TDsKKwkJCWRybV9lbmNvZGVyX2luaXQoZGV2LCBlbmNvZGVyLCAmZGNlX3Y2XzBfZW5jb2Rlcl9m dW5jcywKKwkJCQkJIERSTV9NT0RFX0VOQ09ERVJfTFZEUywgTlVMTCk7CisJCQlhbWRncHVfZW5j b2Rlci0+ZW5jX3ByaXYgPSBhbWRncHVfYXRvbWJpb3NfZW5jb2Rlcl9nZXRfbGNkX2luZm8oYW1k Z3B1X2VuY29kZXIpOworCQl9IGVsc2UgaWYgKGFtZGdwdV9lbmNvZGVyLT5kZXZpY2VzICYgKEFU T01fREVWSUNFX0NSVF9TVVBQT1JUKSkgeworCQkJZHJtX2VuY29kZXJfaW5pdChkZXYsIGVuY29k ZXIsICZkY2VfdjZfMF9lbmNvZGVyX2Z1bmNzLAorCQkJCQkgRFJNX01PREVfRU5DT0RFUl9EQUMs IE5VTEwpOworCQkJYW1kZ3B1X2VuY29kZXItPmVuY19wcml2ID0gYW1kZ3B1X2F0b21iaW9zX2Vu Y29kZXJfZ2V0X2RpZ19pbmZvKGFtZGdwdV9lbmNvZGVyKTsKKwkJfSBlbHNlIHsKKwkJCWRybV9l bmNvZGVyX2luaXQoZGV2LCBlbmNvZGVyLCAmZGNlX3Y2XzBfZW5jb2Rlcl9mdW5jcywKKwkJCQkJ IERSTV9NT0RFX0VOQ09ERVJfVE1EUywgTlVMTCk7CisJCQlhbWRncHVfZW5jb2Rlci0+ZW5jX3By aXYgPSBhbWRncHVfYXRvbWJpb3NfZW5jb2Rlcl9nZXRfZGlnX2luZm8oYW1kZ3B1X2VuY29kZXIp OworCQl9CisJCWRybV9lbmNvZGVyX2hlbHBlcl9hZGQoZW5jb2RlciwgJmRjZV92Nl8wX2RpZ19o ZWxwZXJfZnVuY3MpOworCQlicmVhazsKKwljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX1NJMTcwQjoK KwljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0NINzMwMzoKKwljYXNlIEVOQ09ERVJfT0JKRUNUX0lE X0VYVEVSTkFMX1NEVk9BOgorCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfRVhURVJOQUxfU0RWT0I6 CisJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9USVRGUDUxMzoKKwljYXNlIEVOQ09ERVJfT0JKRUNU X0lEX1ZUMTYyMzoKKwljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0hETUlfU0kxOTMwOgorCWNhc2Ug RU5DT0RFUl9PQkpFQ1RfSURfVFJBVklTOgorCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfTlVUTUVH OgorCQkvKiB0aGVzZSBhcmUgaGFuZGxlZCBieSB0aGUgcHJpbWFyeSBlbmNvZGVycyAqLworCQlh bWRncHVfZW5jb2Rlci0+aXNfZXh0X2VuY29kZXIgPSB0cnVlOworCQlpZiAoYW1kZ3B1X2VuY29k ZXItPmRldmljZXMgJiAoQVRPTV9ERVZJQ0VfTENEX1NVUFBPUlQpKQorCQkJZHJtX2VuY29kZXJf aW5pdChkZXYsIGVuY29kZXIsICZkY2VfdjZfMF9lbmNvZGVyX2Z1bmNzLAorCQkJCQkgRFJNX01P REVfRU5DT0RFUl9MVkRTLCBOVUxMKTsKKwkJZWxzZSBpZiAoYW1kZ3B1X2VuY29kZXItPmRldmlj ZXMgJiAoQVRPTV9ERVZJQ0VfQ1JUX1NVUFBPUlQpKQorCQkJZHJtX2VuY29kZXJfaW5pdChkZXYs IGVuY29kZXIsICZkY2VfdjZfMF9lbmNvZGVyX2Z1bmNzLAorCQkJCQkgRFJNX01PREVfRU5DT0RF Ul9EQUMsIE5VTEwpOworCQllbHNlCisJCQlkcm1fZW5jb2Rlcl9pbml0KGRldiwgZW5jb2Rlciwg JmRjZV92Nl8wX2VuY29kZXJfZnVuY3MsCisJCQkJCSBEUk1fTU9ERV9FTkNPREVSX1RNRFMsIE5V TEwpOworCQlkcm1fZW5jb2Rlcl9oZWxwZXJfYWRkKGVuY29kZXIsICZkY2VfdjZfMF9leHRfaGVs cGVyX2Z1bmNzKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGFtZGdw dV9kaXNwbGF5X2Z1bmNzIGRjZV92Nl8wX2Rpc3BsYXlfZnVuY3MgPSB7CisJLnNldF92Z2FfcmVu ZGVyX3N0YXRlID0gJmRjZV92Nl8wX3NldF92Z2FfcmVuZGVyX3N0YXRlLAorCS5iYW5kd2lkdGhf dXBkYXRlID0gJmRjZV92Nl8wX2JhbmR3aWR0aF91cGRhdGUsCisJLnZibGFua19nZXRfY291bnRl ciA9ICZkY2VfdjZfMF92YmxhbmtfZ2V0X2NvdW50ZXIsCisJLnZibGFua193YWl0ID0gJmRjZV92 Nl8wX3ZibGFua193YWl0LAorCS5pc19kaXNwbGF5X2h1bmcgPSAmZGNlX3Y2XzBfaXNfZGlzcGxh eV9odW5nLAorCS5iYWNrbGlnaHRfc2V0X2xldmVsID0gJmFtZGdwdV9hdG9tYmlvc19lbmNvZGVy X3NldF9iYWNrbGlnaHRfbGV2ZWwsCisJLmJhY2tsaWdodF9nZXRfbGV2ZWwgPSAmYW1kZ3B1X2F0 b21iaW9zX2VuY29kZXJfZ2V0X2JhY2tsaWdodF9sZXZlbCwKKwkuaHBkX3NlbnNlID0gJmRjZV92 Nl8wX2hwZF9zZW5zZSwKKwkuaHBkX3NldF9wb2xhcml0eSA9ICZkY2VfdjZfMF9ocGRfc2V0X3Bv bGFyaXR5LAorCS5ocGRfZ2V0X2dwaW9fcmVnID0gJmRjZV92Nl8wX2hwZF9nZXRfZ3Bpb19yZWcs CisJLnBhZ2VfZmxpcCA9ICZkY2VfdjZfMF9wYWdlX2ZsaXAsCisJLnBhZ2VfZmxpcF9nZXRfc2Nh bm91dHBvcyA9ICZkY2VfdjZfMF9jcnRjX2dldF9zY2Fub3V0cG9zLAorCS5hZGRfZW5jb2RlciA9 ICZkY2VfdjZfMF9lbmNvZGVyX2FkZCwKKwkuYWRkX2Nvbm5lY3RvciA9ICZhbWRncHVfY29ubmVj dG9yX2FkZCwKKwkuc3RvcF9tY19hY2Nlc3MgPSAmZGNlX3Y2XzBfc3RvcF9tY19hY2Nlc3MsCisJ LnJlc3VtZV9tY19hY2Nlc3MgPSAmZGNlX3Y2XzBfcmVzdW1lX21jX2FjY2VzcywKK307CisKK3N0 YXRpYyB2b2lkIGRjZV92Nl8wX3NldF9kaXNwbGF5X2Z1bmNzKHN0cnVjdCBhbWRncHVfZGV2aWNl ICphZGV2KQoreworCWlmIChhZGV2LT5tb2RlX2luZm8uZnVuY3MgPT0gTlVMTCkKKwkJYWRldi0+ bW9kZV9pbmZvLmZ1bmNzID0gJmRjZV92Nl8wX2Rpc3BsYXlfZnVuY3M7Cit9CisKK3N0YXRpYyBj b25zdCBzdHJ1Y3QgYW1kZ3B1X2lycV9zcmNfZnVuY3MgZGNlX3Y2XzBfY3J0Y19pcnFfZnVuY3Mg PSB7CisJLnNldCA9IGRjZV92Nl8wX3NldF9jcnRjX2ludGVycnVwdF9zdGF0ZSwKKwkucHJvY2Vz cyA9IGRjZV92Nl8wX2NydGNfaXJxLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhbWRncHVf aXJxX3NyY19mdW5jcyBkY2VfdjZfMF9wYWdlZmxpcF9pcnFfZnVuY3MgPSB7CisJLnNldCA9IGRj ZV92Nl8wX3NldF9wYWdlZmxpcF9pbnRlcnJ1cHRfc3RhdGUsCisJLnByb2Nlc3MgPSBkY2VfdjZf MF9wYWdlZmxpcF9pcnEsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGFtZGdwdV9pcnFfc3Jj X2Z1bmNzIGRjZV92Nl8wX2hwZF9pcnFfZnVuY3MgPSB7CisJLnNldCA9IGRjZV92Nl8wX3NldF9o cGRfaW50ZXJydXB0X3N0YXRlLAorCS5wcm9jZXNzID0gZGNlX3Y2XzBfaHBkX2lycSwKK307CisK K3N0YXRpYyB2b2lkIGRjZV92Nl8wX3NldF9pcnFfZnVuY3Moc3RydWN0IGFtZGdwdV9kZXZpY2Ug KmFkZXYpCit7CisJYWRldi0+Y3J0Y19pcnEubnVtX3R5cGVzID0gQU1ER1BVX0NSVENfSVJRX0xB U1Q7CisJYWRldi0+Y3J0Y19pcnEuZnVuY3MgPSAmZGNlX3Y2XzBfY3J0Y19pcnFfZnVuY3M7CisK KwlhZGV2LT5wYWdlZmxpcF9pcnEubnVtX3R5cGVzID0gQU1ER1BVX1BBR0VGTElQX0lSUV9MQVNU OworCWFkZXYtPnBhZ2VmbGlwX2lycS5mdW5jcyA9ICZkY2VfdjZfMF9wYWdlZmxpcF9pcnFfZnVu Y3M7CisKKwlhZGV2LT5ocGRfaXJxLm51bV90eXBlcyA9IEFNREdQVV9IUERfTEFTVDsKKwlhZGV2 LT5ocGRfaXJxLmZ1bmNzID0gJmRjZV92Nl8wX2hwZF9pcnFfZnVuY3M7Cit9CmRpZmYgLS1naXQg YS9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9kY2VfdjZfMC5oIGIvZHJpdmVycy9ncHUvZHJt L2FtZC9hbWRncHUvZGNlX3Y2XzAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw Li42YTU1MjgxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUv ZGNlX3Y2XzAuaApAQCAtMCwwICsxLDI5IEBACisvKgorICogQ29weXJpZ2h0IDIwMTUgQWR2YW5j ZWQgTWljcm8gRGV2aWNlcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50 ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9m IHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJT b2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlv biwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNv cHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBh bmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMg dG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0 byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBu b3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAq IGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoK KyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9G IEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1J VEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9S IEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBT SEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xERVIoUykgT1IgQVVUSE9SKFMpIEJFIExJQUJMRSBG T1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g QU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJP TSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBP UgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqLworCisjaWZuZGVm IF9fRENFX1Y2XzBfSF9fCisjZGVmaW5lIF9fRENFX1Y2XzBfSF9fCisKK2V4dGVybiBjb25zdCBz dHJ1Y3QgYW1kX2lwX2Z1bmNzIGRjZV92Nl8wX2lwX2Z1bmNzOworCisjZW5kaWYKLS0gCjIuNS41 CgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpkcmktZGV2 ZWwgbWFpbGluZyBsaXN0CmRyaS1kZXZlbEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9s aXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9kcmktZGV2ZWwK