From mboxrd@z Thu Jan 1 00:00:00 1970 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: base64 Subject: [1/4] EDAC, skx_comm_edac: Separate common codes from the skx_edac driver From: "Luck, Tony" Message-Id: <20190125195902.17109-2-tony.luck@intel.com> Date: Fri, 25 Jan 2019 11:58:59 -0800 To: Borislav Petkov Cc: Qiuxu Zhuo , Tony Luck , Aristeu Rozanski , Mauro Carvalho Chehab , Kan Liang , linux-edac@vger.kernel.org, linux-kernel@vger.kernel.org List-ID: RnJvbTogUWl1eHUgWmh1byA8cWl1eHUuemh1b0BpbnRlbC5jb20+CgpQYXJ0IG9mIHRoZSBza3hf ZWRhYyBkcml2ZXIgY29kZXMgYXJlIGFsc28gdXNlZCBmb3IgSW50ZWwgMTBubSBzZXJ2ZXIKRURB QyBkcml2ZXIuIENhcnZlIG91dCB0aGUgY29tbW9uIHBhcnQgZnJvbSB0aGUgc2t4X2VkYWMgZHJp dmVyIGluCnByZXBhcmF0aW9uIHRvIHN1cHBvcnQgYm90aCBza3hfZWRhYyBkcml2ZXIgYW5kIGkx MG5tX2VkYWMgZHJpdmVyLgoKQ28tZGV2ZWxvcGVkLWJ5OiBUb255IEx1Y2sgPHRvbnkubHVja0Bp bnRlbC5jb20+ClNpZ25lZC1vZmYtYnk6IFFpdXh1IFpodW8gPHFpdXh1LnpodW9AaW50ZWwuY29t PgpTaWduZWQtb2ZmLWJ5OiBUb255IEx1Y2sgPHRvbnkubHVja0BpbnRlbC5jb20+Ci0tLQogZHJp dmVycy9lZGFjL3NreF9jb21tX2VkYWMuYyB8IDY5MyArKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKwogZHJpdmVycy9lZGFjL3NreF9jb21tX2VkYWMuaCB8IDE1OCArKysrKysrKwog MiBmaWxlcyBjaGFuZ2VkLCA4NTEgaW5zZXJ0aW9ucygrKQogY3JlYXRlIG1vZGUgMTAwNjQ0IGRy aXZlcnMvZWRhYy9za3hfY29tbV9lZGFjLmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2Vk YWMvc2t4X2NvbW1fZWRhYy5oCgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9lZGFjL3NreF9jb21tX2Vk YWMuYyBiL2RyaXZlcnMvZWRhYy9za3hfY29tbV9lZGFjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQK aW5kZXggMDAwMDAwMDAwMDAwLi5mZDJjY2JhNjY4NzQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2 ZXJzL2VkYWMvc2t4X2NvbW1fZWRhYy5jCkBAIC0wLDAgKzEsNjkzIEBACisvLyBTUERYLUxpY2Vu c2UtSWRlbnRpZmllcjogR1BMLTIuMAorLyoKKyAqIENvbW1vbiBjb2RlcyBmb3IgYm90aCB0aGUg c2t4X2VkYWMgZHJpdmVyIGFuZCBJbnRlbCAxMG5tIHNlcnZlciBFREFDIGRyaXZlci4KKyAqIE9y aWdpbmFsbHkgc3BsaXQgb3V0IGZyb20gdGhlIHNreF9lZGFjIGRyaXZlci4KKyAqCisgKiBDb3B5 cmlnaHQgKGMpIDIwMTgsIEludGVsIENvcnBvcmF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51 eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgv cGNpLmg+CisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtaS5oPgor I2luY2x1ZGUgPGxpbnV4L2FkeGwuaD4KKyNpbmNsdWRlIDxhY3BpL25maXQuaD4KKyNpbmNsdWRl IDxhc20vbWNlLmg+CisjaW5jbHVkZSA8bGludXgvZWRhYy5oPgorI2luY2x1ZGUgImVkYWNfbW9k dWxlLmgiCisjaW5jbHVkZSAic2t4X2NvbW1fZWRhYy5oIgorCitzdGF0aWMgY29uc3QgY2hhciAq IGNvbnN0IGNvbXBvbmVudF9uYW1lc1tdID0geworCVtJTkRFWF9TT0NLRVRdCT0gIlByb2Nlc3Nv clNvY2tldElkIiwKKwlbSU5ERVhfTUVNQ1RSTF0JPSAiTWVtb3J5Q29udHJvbGxlcklkIiwKKwlb SU5ERVhfQ0hBTk5FTF0JPSAiQ2hhbm5lbElkIiwKKwlbSU5ERVhfRElNTV0JPSAiRGltbVNsb3RJ ZCIsCit9OworCitzdGF0aWMgaW50IGNvbXBvbmVudF9pbmRpY2VzW0FSUkFZX1NJWkUoY29tcG9u ZW50X25hbWVzKV07CitzdGF0aWMgaW50IGFkeGxfY29tcG9uZW50X2NvdW50Oworc3RhdGljIGNv bnN0IGNoYXIgKiBjb25zdCAqYWR4bF9jb21wb25lbnRfbmFtZXM7CitzdGF0aWMgdTY0ICphZHhs X3ZhbHVlczsKK3N0YXRpYyBjaGFyICphZHhsX21zZzsKKworc3RhdGljIGNoYXIgc2t4X21zZ1tN U0dfU0laRV07CitzdGF0aWMgc2t4X2RlY29kZV9mIHNreF9kZWNvZGU7CitzdGF0aWMgdTY0IHNr eF90b2xtLCBza3hfdG9obTsKK3N0YXRpYyBMSVNUX0hFQUQoZGV2X2VkYWNfbGlzdCk7CisKK2lu dCBfX2luaXQgc2t4X2FkeGxfZ2V0KHZvaWQpCit7CisJY29uc3QgY2hhciAqIGNvbnN0ICpuYW1l czsKKwlpbnQgaSwgajsKKworCW5hbWVzID0gYWR4bF9nZXRfY29tcG9uZW50X25hbWVzKCk7CisJ aWYgKCFuYW1lcykgeworCQlza3hfcHJpbnRrKEtFUk5fTk9USUNFLCAiTm8gZmlybXdhcmUgc3Vw cG9ydCBmb3IgYWRkcmVzcyB0cmFuc2xhdGlvbi5cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9 CisKKwlmb3IgKGkgPSAwOyBpIDwgSU5ERVhfTUFYOyBpKyspIHsKKwkJZm9yIChqID0gMDsgbmFt ZXNbal07IGorKykgeworCQkJaWYgKCFzdHJjbXAoY29tcG9uZW50X25hbWVzW2ldLCBuYW1lc1tq XSkpIHsKKwkJCQljb21wb25lbnRfaW5kaWNlc1tpXSA9IGo7CisJCQkJYnJlYWs7CisJCQl9CisJ CX0KKworCQlpZiAoIW5hbWVzW2pdKQorCQkJZ290byBlcnI7CisJfQorCisJYWR4bF9jb21wb25l bnRfbmFtZXMgPSBuYW1lczsKKwl3aGlsZSAoKm5hbWVzKyspCisJCWFkeGxfY29tcG9uZW50X2Nv dW50Kys7CisKKwlhZHhsX3ZhbHVlcyA9IGtjYWxsb2MoYWR4bF9jb21wb25lbnRfY291bnQsIHNp emVvZigqYWR4bF92YWx1ZXMpLAorCQkJICAgICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFhZHhsX3Zh bHVlcykgeworCQlhZHhsX2NvbXBvbmVudF9jb3VudCA9IDA7CisJCXJldHVybiAtRU5PTUVNOwor CX0KKworCWFkeGxfbXNnID0ga3phbGxvYyhNU0dfU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFh ZHhsX21zZykgeworCQlhZHhsX2NvbXBvbmVudF9jb3VudCA9IDA7CisJCWtmcmVlKGFkeGxfdmFs dWVzKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcmV0dXJuIDA7CitlcnI6CisJc2t4X3By aW50ayhLRVJOX0VSUiwgIiclcycgaXMgbm90IG1hdGNoZWQgZnJvbSBEU00gcGFyYW1ldGVyczog IiwKKwkJICAgY29tcG9uZW50X25hbWVzW2ldKTsKKwlmb3IgKGogPSAwOyBuYW1lc1tqXTsgaisr KQorCQlza3hfcHJpbnRrKEtFUk5fQ09OVCwgIiVzICIsIG5hbWVzW2pdKTsKKwlza3hfcHJpbnRr KEtFUk5fQ09OVCwgIlxuIik7CisKKwlyZXR1cm4gLUVOT0RFVjsKK30KKwordm9pZCBfX2V4aXQg c2t4X2FkeGxfcHV0KHZvaWQpCit7CisJa2ZyZWUoYWR4bF92YWx1ZXMpOworCWtmcmVlKGFkeGxf bXNnKTsKK30KKworc3RhdGljIGJvb2wgc2t4X2FkeGxfZGVjb2RlKHN0cnVjdCBkZWNvZGVkX2Fk ZHIgKnJlcykKK3sKKwlpbnQgaSwgbGVuID0gMDsKKworCWlmIChyZXMtPmFkZHIgPj0gc2t4X3Rv aG0gfHwgKHJlcy0+YWRkciA+PSBza3hfdG9sbSAmJgorCQkJCSAgICAgIHJlcy0+YWRkciA8IEJJ VF9VTEwoMzIpKSkgeworCQllZGFjX2RiZygwLCAiQWRkcmVzcyAweCVsbHggb3V0IG9mIHJhbmdl XG4iLCByZXMtPmFkZHIpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJaWYgKGFkeGxfZGVjb2Rl KHJlcy0+YWRkciwgYWR4bF92YWx1ZXMpKSB7CisJCWVkYWNfZGJnKDAsICJGYWlsZWQgdG8gZGVj b2RlIDB4JWxseFxuIiwgcmVzLT5hZGRyKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXJlcy0+ c29ja2V0ICA9IChpbnQpYWR4bF92YWx1ZXNbY29tcG9uZW50X2luZGljZXNbSU5ERVhfU09DS0VU XV07CisJcmVzLT5pbWMgICAgID0gKGludClhZHhsX3ZhbHVlc1tjb21wb25lbnRfaW5kaWNlc1tJ TkRFWF9NRU1DVFJMXV07CisJcmVzLT5jaGFubmVsID0gKGludClhZHhsX3ZhbHVlc1tjb21wb25l bnRfaW5kaWNlc1tJTkRFWF9DSEFOTkVMXV07CisJcmVzLT5kaW1tICAgID0gKGludClhZHhsX3Zh bHVlc1tjb21wb25lbnRfaW5kaWNlc1tJTkRFWF9ESU1NXV07CisKKwlmb3IgKGkgPSAwOyBpIDwg YWR4bF9jb21wb25lbnRfY291bnQ7IGkrKykgeworCQlpZiAoYWR4bF92YWx1ZXNbaV0gPT0gfjB4 MHVsbCkKKwkJCWNvbnRpbnVlOworCisJCWxlbiArPSBzbnByaW50ZihhZHhsX21zZyArIGxlbiwg TVNHX1NJWkUgLSBsZW4sICIgJXM6MHglbGx4IiwKKwkJCQlhZHhsX2NvbXBvbmVudF9uYW1lc1tp XSwgYWR4bF92YWx1ZXNbaV0pOworCQlpZiAoTVNHX1NJWkUgLSBsZW4gPD0gMCkKKwkJCWJyZWFr OworCX0KKworCXJldHVybiB0cnVlOworfQorCit2b2lkIHNreF9zZXRfZGVjb2RlKHNreF9kZWNv ZGVfZiBkZWNvZGUpCit7CisJc2t4X2RlY29kZSA9IGRlY29kZTsKK30KKworaW50IHNreF9nZXRf c3JjX2lkKHN0cnVjdCBza3hfZGV2ICpkLCB1OCAqaWQpCit7CisJdTMyIHJlZzsKKworCWlmIChw Y2lfcmVhZF9jb25maWdfZHdvcmQoZC0+dXRpbF9hbGwsIDB4ZjAsICZyZWcpKSB7CisJCXNreF9w cmludGsoS0VSTl9FUlIsICJGYWlsZWQgdG8gcmVhZCBzcmMgaWRcbiIpOworCQlyZXR1cm4gLUVO T0RFVjsKKwl9CisKKwkqaWQgPSBHRVRfQklURklFTEQocmVnLCAxMiwgMTQpOworCXJldHVybiAw OworfQorCitpbnQgc2t4X2dldF9ub2RlX2lkKHN0cnVjdCBza3hfZGV2ICpkLCB1OCAqaWQpCit7 CisJdTMyIHJlZzsKKworCWlmIChwY2lfcmVhZF9jb25maWdfZHdvcmQoZC0+dXRpbF9hbGwsIDB4 ZjQsICZyZWcpKSB7CisJCXNreF9wcmludGsoS0VSTl9FUlIsICJGYWlsZWQgdG8gcmVhZCBub2Rl IGlkXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJKmlkID0gR0VUX0JJVEZJRUxEKHJl ZywgMCwgMik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3dpZHRoKHUzMiBtdHIp Cit7CisJc3dpdGNoIChHRVRfQklURklFTEQobXRyLCA4LCA5KSkgeworCWNhc2UgMDoKKwkJcmV0 dXJuIERFVl9YNDsKKwljYXNlIDE6CisJCXJldHVybiBERVZfWDg7CisJY2FzZSAyOgorCQlyZXR1 cm4gREVWX1gxNjsKKwl9CisJcmV0dXJuIERFVl9VTktOT1dOOworfQorCisvKgorICogV2UgdXNl IHRoZSBwZXItc29ja2V0IGRldmljZSBAZGlkIHRvIGNvdW50IGhvdyBtYW55IHNvY2tldHMgYXJl IHByZXNlbnQsCisgKiBhbmQgdG8gZGV0ZW1pbmUgd2hpY2ggUENJIGJ1c2VzIGFyZSBhc3NvY2lh dGVkIHdpdGggZWFjaCBzb2NrZXQuIEFsbG9jYXRlCisgKiBhbmQgYnVpbGQgdGhlIGZ1bGwgbGlz dCBvZiBhbGwgdGhlIHNreF9kZXYgc3RydWN0dXJlcyB0aGF0IHdlIG5lZWQgaGVyZS4KKyAqLwor aW50IHNreF9nZXRfYWxsX2J1c19tYXBwaW5ncyh1bnNpZ25lZCBpbnQgZGlkLCBpbnQgb2ZmLCBl bnVtIHR5cGUgdHlwZSwKKwkJCSAgICAgc3RydWN0IGxpc3RfaGVhZCAqKmxpc3QpCit7CisJc3Ry dWN0IHBjaV9kZXYgKnBkZXYsICpwcmV2OworCXN0cnVjdCBza3hfZGV2ICpkOworCXUzMiByZWc7 CisJaW50IG5kZXYgPSAwOworCisJcHJldiA9IE5VTEw7CisJZm9yICg7OykgeworCQlwZGV2ID0g cGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgZGlkLCBwcmV2KTsKKwkJaWYgKCFw ZGV2KQorCQkJYnJlYWs7CisJCW5kZXYrKzsKKwkJZCA9IGt6YWxsb2Moc2l6ZW9mKCpkKSwgR0ZQ X0tFUk5FTCk7CisJCWlmICghZCkgeworCQkJcGNpX2Rldl9wdXQocGRldik7CisJCQlyZXR1cm4g LUVOT01FTTsKKwkJfQorCisJCWlmIChwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgb2ZmLCAm cmVnKSkgeworCQkJa2ZyZWUoZCk7CisJCQlwY2lfZGV2X3B1dChwZGV2KTsKKwkJCXNreF9wcmlu dGsoS0VSTl9FUlIsICJGYWlsZWQgdG8gcmVhZCBidXMgaWR4XG4iKTsKKwkJCXJldHVybiAtRU5P REVWOworCQl9CisKKwkJZC0+YnVzWzBdID0gR0VUX0JJVEZJRUxEKHJlZywgMCwgNyk7CisJCWQt PmJ1c1sxXSA9IEdFVF9CSVRGSUVMRChyZWcsIDgsIDE1KTsKKwkJaWYgKHR5cGUgPT0gU0tYKSB7 CisJCQlkLT5zZWcgPSBwY2lfZG9tYWluX25yKHBkZXYtPmJ1cyk7CisJCQlkLT5idXNbMl0gPSBH RVRfQklURklFTEQocmVnLCAxNiwgMjMpOworCQkJZC0+YnVzWzNdID0gR0VUX0JJVEZJRUxEKHJl ZywgMjQsIDMxKTsKKwkJfSBlbHNlIHsKKwkJCWQtPnNlZyA9IEdFVF9CSVRGSUVMRChyZWcsIDE2 LCAyMyk7CisJCX0KKworCQllZGFjX2RiZygyLCAiYnVzc2VzOiAweCV4LCAweCV4LCAweCV4LCAw eCV4XG4iLAorCQkJIGQtPmJ1c1swXSwgZC0+YnVzWzFdLCBkLT5idXNbMl0sIGQtPmJ1c1szXSk7 CisJCWxpc3RfYWRkX3RhaWwoJmQtPmxpc3QsICZkZXZfZWRhY19saXN0KTsKKwkJcHJldiA9IHBk ZXY7CisJfQorCisJaWYgKGxpc3QpCisJCSpsaXN0ID0gJmRldl9lZGFjX2xpc3Q7CisJcmV0dXJu IG5kZXY7Cit9CisKK2ludCBza3hfZ2V0X2hpX2xvKHVuc2lnbmVkIGludCBkaWQsIGludCBvZmZb XSwgdTY0ICp0b2xtLCB1NjQgKnRvaG0pCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXY7CisJdTMy IHJlZzsKKworCXBkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX0lOVEVMLCBkaWQs IE5VTEwpOworCWlmICghcGRldikgeworCQlza3hfcHJpbnRrKEtFUk5fRVJSLCAiQ2FuJ3QgZ2V0 IHRvbG0vdG9obVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmIChwY2lfcmVhZF9j b25maWdfZHdvcmQocGRldiwgb2ZmWzBdLCAmcmVnKSkgeworCQlza3hfcHJpbnRrKEtFUk5fRVJS LCAiRmFpbGVkIHRvIHJlYWQgdG9sbVxuIik7CisJCWdvdG8gZmFpbDsKKwl9CisJc2t4X3RvbG0g PSByZWc7CisKKwlpZiAocGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIG9mZlsxXSwgJnJlZykp IHsKKwkJc2t4X3ByaW50ayhLRVJOX0VSUiwgIkZhaWxlZCB0byByZWFkIGxvd2VyIHRvaG1cbiIp OworCQlnb3RvIGZhaWw7CisJfQorCXNreF90b2htID0gcmVnOworCisJaWYgKHBjaV9yZWFkX2Nv bmZpZ19kd29yZChwZGV2LCBvZmZbMl0sICZyZWcpKSB7CisJCXNreF9wcmludGsoS0VSTl9FUlIs ICJGYWlsZWQgdG8gcmVhZCB1cHBlciB0b2htXG4iKTsKKwkJZ290byBmYWlsOworCX0KKwlza3hf dG9obSB8PSAodTY0KXJlZyA8PCAzMjsKKworCXBjaV9kZXZfcHV0KHBkZXYpOworCSp0b2xtID0g c2t4X3RvbG07CisJKnRvaG0gPSBza3hfdG9obTsKKwllZGFjX2RiZygyLCAidG9sbSA9IDB4JWxs eCB0b2htID0gMHglbGx4XG4iLCBza3hfdG9sbSwgc2t4X3RvaG0pOworCXJldHVybiAwOworZmFp bDoKKwlwY2lfZGV2X3B1dChwZGV2KTsKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGljIGlu dCBza3hfZ2V0X2RpbW1fYXR0cih1MzIgcmVnLCBpbnQgbG9iaXQsIGludCBoaWJpdCwgaW50IGFk ZCwKKwkJCSAgICAgaW50IG1pbnZhbCwgaW50IG1heHZhbCwgY29uc3QgY2hhciAqbmFtZSkKK3sK Kwl1MzIgdmFsID0gR0VUX0JJVEZJRUxEKHJlZywgbG9iaXQsIGhpYml0KTsKKworCWlmICh2YWwg PCBtaW52YWwgfHwgdmFsID4gbWF4dmFsKSB7CisJCWVkYWNfZGJnKDIsICJiYWQgJXMgPSAlZCAo cmF3PTB4JXgpXG4iLCBuYW1lLCB2YWwsIHJlZyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwly ZXR1cm4gdmFsICsgYWRkOworfQorCisjZGVmaW5lIG51bXJhbmsocmVnKQlza3hfZ2V0X2RpbW1f YXR0cihyZWcsIDEyLCAxMywgMCwgMCwgMiwgInJhbmtzIikKKyNkZWZpbmUgbnVtcm93KHJlZykJ c2t4X2dldF9kaW1tX2F0dHIocmVnLCAyLCA0LCAxMiwgMSwgNiwgInJvd3MiKQorI2RlZmluZSBu dW1jb2wocmVnKQlza3hfZ2V0X2RpbW1fYXR0cihyZWcsIDAsIDEsIDEwLCAwLCAyLCAiY29scyIp CisKK2ludCBza3hfZ2V0X2RpbW1faW5mbyh1MzIgbXRyLCB1MzIgYW1hcCwgc3RydWN0IGRpbW1f aW5mbyAqZGltbSwKKwkJICAgICAgc3RydWN0IHNreF9pbWMgKmltYywgaW50IGNoYW4sIGludCBk aW1tbm8pCit7CisJaW50ICBiYW5rcyA9IDE2LCByYW5rcywgcm93cywgY29scywgbnBhZ2VzOwor CXU2NCBzaXplOworCisJcmFua3MgPSBudW1yYW5rKG10cik7CisJcm93cyA9IG51bXJvdyhtdHIp OworCWNvbHMgPSBudW1jb2wobXRyKTsKKworCS8qCisJICogQ29tcHV0ZSBzaXplIGluIDgtYnl0 ZSAoMl4zKSB3b3JkcywgdGhlbiBzaGlmdCB0byBNaUIgKDJeMjApCisJICovCisJc2l6ZSA9ICgo MXVsbCA8PCAocm93cyArIGNvbHMgKyByYW5rcykpICogYmFua3MpID4+ICgyMCAtIDMpOworCW5w YWdlcyA9IE1pQl9UT19QQUdFUyhzaXplKTsKKworCWVkYWNfZGJnKDAsICJtYyMlZDogY2hhbm5l bCAlZCwgZGltbSAlZCwgJWxsZCBNaUIgKCVkIHBhZ2VzKSBiYW5rOiAlZCwgcmFuazogJWQsIHJv dzogMHgleCwgY29sOiAweCV4XG4iLAorCQkgaW1jLT5tYywgY2hhbiwgZGltbW5vLCBzaXplLCBu cGFnZXMsCisJCSBiYW5rcywgMSA8PCByYW5rcywgcm93cywgY29scyk7CisKKwlpbWMtPmNoYW5b Y2hhbl0uZGltbXNbZGltbW5vXS5jbG9zZV9wZyA9IEdFVF9CSVRGSUVMRChtdHIsIDAsIDApOwor CWltYy0+Y2hhbltjaGFuXS5kaW1tc1tkaW1tbm9dLmJhbmtfeG9yX2VuYWJsZSA9IEdFVF9CSVRG SUVMRChtdHIsIDksIDkpOworCWltYy0+Y2hhbltjaGFuXS5kaW1tc1tkaW1tbm9dLmZpbmVfZ3Jh aW5fYmFuayA9IEdFVF9CSVRGSUVMRChhbWFwLCAwLCAwKTsKKwlpbWMtPmNoYW5bY2hhbl0uZGlt bXNbZGltbW5vXS5yb3diaXRzID0gcm93czsKKwlpbWMtPmNoYW5bY2hhbl0uZGltbXNbZGltbW5v XS5jb2xiaXRzID0gY29sczsKKworCWRpbW0tPm5yX3BhZ2VzID0gbnBhZ2VzOworCWRpbW0tPmdy YWluID0gMzI7CisJZGltbS0+ZHR5cGUgPSBnZXRfd2lkdGgobXRyKTsKKwlkaW1tLT5tdHlwZSA9 IE1FTV9ERFI0OworCWRpbW0tPmVkYWNfbW9kZSA9IEVEQUNfU0VDREVEOyAvKiBsaWtlbHkgYmV0 dGVyIHRoYW4gdGhpcyAqLworCXNucHJpbnRmKGRpbW0tPmxhYmVsLCBzaXplb2YoZGltbS0+bGFi ZWwpLCAiQ1BVX1NyY0lEIyV1X01DIyV1X0NoYW4jJXVfRElNTSMldSIsCisJCSBpbWMtPnNyY19p ZCwgaW1jLT5sbWMsIGNoYW4sIGRpbW1ubyk7CisKKwlyZXR1cm4gMTsKK30KKworaW50IHNreF9n ZXRfbnZkaW1tX2luZm8oc3RydWN0IGRpbW1faW5mbyAqZGltbSwgc3RydWN0IHNreF9pbWMgKmlt YywKKwkJCWludCBjaGFuLCBpbnQgZGltbW5vLCBjb25zdCBjaGFyICptb2Rfc3RyKQoreworCWlu dCBzbWJpb3NfaGFuZGxlOworCXUzMiBkZXZfaGFuZGxlOworCXUxNiBmbGFnczsKKwl1NjQgc2l6 ZSA9IDA7CisKKwlkZXZfaGFuZGxlID0gQUNQSV9ORklUX0JVSUxEX0RFVklDRV9IQU5ETEUoZGlt bW5vLCBjaGFuLCBpbWMtPmxtYywKKwkJCQkJCSAgIGltYy0+c3JjX2lkLCAwKTsKKworCXNtYmlv c19oYW5kbGUgPSBuZml0X2dldF9zbWJpb3NfaWQoZGV2X2hhbmRsZSwgJmZsYWdzKTsKKwlpZiAo c21iaW9zX2hhbmRsZSA9PSAtRU9QTk9UU1VQUCkgeworCQlwcl93YXJuX29uY2UoIiVzOiBDYW4n dCBmaW5kIHNpemUgb2YgTlZESU1NLiBUcnkgZW5hYmxpbmcgQ09ORklHX0FDUElfTkZJVFxuIiwg bW9kX3N0cik7CisJCWdvdG8gdW5rbm93bl9zaXplOworCX0KKworCWlmIChzbWJpb3NfaGFuZGxl IDwgMCkgeworCQlza3hfcHJpbnRrKEtFUk5fRVJSLCAiQ2FuJ3QgZmluZCBoYW5kbGUgZm9yIE5W RElNTSBBRFI9MHgleFxuIiwgZGV2X2hhbmRsZSk7CisJCWdvdG8gdW5rbm93bl9zaXplOworCX0K KworCWlmIChmbGFncyAmIEFDUElfTkZJVF9NRU1fTUFQX0ZBSUxFRCkgeworCQlza3hfcHJpbnRr KEtFUk5fRVJSLCAiTlZESU1NIEFEUj0weCV4IGlzIG5vdCBtYXBwZWRcbiIsIGRldl9oYW5kbGUp OworCQlnb3RvIHVua25vd25fc2l6ZTsKKwl9CisKKwlzaXplID0gZG1pX21lbWRldl9zaXplKHNt Ymlvc19oYW5kbGUpOworCWlmIChzaXplID09IH4wdWxsKQorCQlza3hfcHJpbnRrKEtFUk5fRVJS LCAiQ2FuJ3QgZmluZCBzaXplIGZvciBOVkRJTU0gQURSPTB4JXgvU01CSU9TPTB4JXhcbiIsCisJ CQkgICBkZXZfaGFuZGxlLCBzbWJpb3NfaGFuZGxlKTsKKwordW5rbm93bl9zaXplOgorCWRpbW0t Pm5yX3BhZ2VzID0gc2l6ZSA+PiBQQUdFX1NISUZUOworCWRpbW0tPmdyYWluID0gMzI7CisJZGlt bS0+ZHR5cGUgPSBERVZfVU5LTk9XTjsKKwlkaW1tLT5tdHlwZSA9IE1FTV9OVkRJTU07CisJZGlt bS0+ZWRhY19tb2RlID0gRURBQ19TRUNERUQ7IC8qIGxpa2VseSBiZXR0ZXIgdGhhbiB0aGlzICov CisKKwllZGFjX2RiZygwLCAibWMjJWQ6IGNoYW5uZWwgJWQsIGRpbW0gJWQsICVsbHUgTWlCICgl dSBwYWdlcylcbiIsCisJCSBpbWMtPm1jLCBjaGFuLCBkaW1tbm8sIHNpemUgPj4gMjAsIGRpbW0t Pm5yX3BhZ2VzKTsKKworCXNucHJpbnRmKGRpbW0tPmxhYmVsLCBzaXplb2YoZGltbS0+bGFiZWwp LCAiQ1BVX1NyY0lEIyV1X01DIyV1X0NoYW4jJXVfRElNTSMldSIsCisJCSBpbWMtPnNyY19pZCwg aW1jLT5sbWMsIGNoYW4sIGRpbW1ubyk7CisKKwlyZXR1cm4gKHNpemUgPT0gMCB8fCBzaXplID09 IH4wdWxsKSA/IDAgOiAxOworfQorCitpbnQgc2t4X3JlZ2lzdGVyX21jaShzdHJ1Y3Qgc2t4X2lt YyAqaW1jLCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJICAgICBjb25zdCBjaGFyICpjdGxfbmFt ZSwgY29uc3QgY2hhciAqbW9kX3N0ciwKKwkJICAgICBnZXRfZGltbV9jb25maWdfZiBnZXRfZGlt bV9jb25maWcpCit7CisJc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpOworCXN0cnVjdCBlZGFjX21j X2xheWVyIGxheWVyc1syXTsKKwlzdHJ1Y3Qgc2t4X3B2dCAqcHZ0OworCWludCByYzsKKworCS8q IEFsbG9jYXRlIGEgbmV3IE1DIGNvbnRyb2wgc3RydWN0dXJlICovCisJbGF5ZXJzWzBdLnR5cGUg PSBFREFDX01DX0xBWUVSX0NIQU5ORUw7CisJbGF5ZXJzWzBdLnNpemUgPSBOVU1fQ0hBTk5FTFM7 CisJbGF5ZXJzWzBdLmlzX3ZpcnRfY3Nyb3cgPSBmYWxzZTsKKwlsYXllcnNbMV0udHlwZSA9IEVE QUNfTUNfTEFZRVJfU0xPVDsKKwlsYXllcnNbMV0uc2l6ZSA9IE5VTV9ESU1NUzsKKwlsYXllcnNb MV0uaXNfdmlydF9jc3JvdyA9IHRydWU7CisJbWNpID0gZWRhY19tY19hbGxvYyhpbWMtPm1jLCBB UlJBWV9TSVpFKGxheWVycyksIGxheWVycywKKwkJCSAgICBzaXplb2Yoc3RydWN0IHNreF9wdnQp KTsKKworCWlmICh1bmxpa2VseSghbWNpKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwllZGFjX2Ri ZygwLCAiTUMjJWQ6IG1jaSA9ICVwXG4iLCBpbWMtPm1jLCBtY2kpOworCisJLyogQXNzb2NpYXRl IHNreF9kZXYgYW5kIG1jaSBmb3IgZnV0dXJlIHVzYWdlICovCisJaW1jLT5tY2kgPSBtY2k7CisJ cHZ0ID0gbWNpLT5wdnRfaW5mbzsKKwlwdnQtPmltYyA9IGltYzsKKworCW1jaS0+Y3RsX25hbWUg PSBrYXNwcmludGYoR0ZQX0tFUk5FTCwgIiVzIyVkIElNQyMlZCIsIGN0bF9uYW1lLAorCQkJCSAg aW1jLT5ub2RlX2lkLCBpbWMtPmxtYyk7CisJaWYgKCFtY2ktPmN0bF9uYW1lKSB7CisJCXJjID0g LUVOT01FTTsKKwkJZ290byBmYWlsMDsKKwl9CisKKwltY2ktPm10eXBlX2NhcCA9IE1FTV9GTEFH X0REUjQgfCBNRU1fRkxBR19OVkRJTU07CisJbWNpLT5lZGFjX2N0bF9jYXAgPSBFREFDX0ZMQUdf Tk9ORTsKKwltY2ktPmVkYWNfY2FwID0gRURBQ19GTEFHX05PTkU7CisJbWNpLT5tb2RfbmFtZSA9 IG1vZF9zdHI7CisJbWNpLT5kZXZfbmFtZSA9IHBjaV9uYW1lKHBkZXYpOworCW1jaS0+Y3RsX3Bh Z2VfdG9fcGh5cyA9IE5VTEw7CisKKwlyYyA9IGdldF9kaW1tX2NvbmZpZyhtY2kpOworCWlmIChy YyA8IDApCisJCWdvdG8gZmFpbDsKKworCS8qIFJlY29yZCBwdHIgdG8gdGhlIGdlbmVyaWMgZGV2 aWNlICovCisJbWNpLT5wZGV2ID0gJnBkZXYtPmRldjsKKworCS8qIEFkZCB0aGlzIG5ldyBNQyBj b250cm9sIHN0cnVjdHVyZSB0byBFREFDJ3MgbGlzdCBvZiBNQ3MgKi8KKwlpZiAodW5saWtlbHko ZWRhY19tY19hZGRfbWMobWNpKSkpIHsKKwkJZWRhY19kYmcoMCwgIk1DOiBmYWlsZWQgZWRhY19t Y19hZGRfbWMoKVxuIik7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBmYWlsOworCX0KKworCXJl dHVybiAwOworCitmYWlsOgorCWtmcmVlKG1jaS0+Y3RsX25hbWUpOworZmFpbDA6CisJZWRhY19t Y19mcmVlKG1jaSk7CisJaW1jLT5tY2kgPSBOVUxMOworCXJldHVybiByYzsKK30KKworc3RhdGlj IHZvaWQgc2t4X3VucmVnaXN0ZXJfbWNpKHN0cnVjdCBza3hfaW1jICppbWMpCit7CisJc3RydWN0 IG1lbV9jdGxfaW5mbyAqbWNpID0gaW1jLT5tY2k7CisKKwlpZiAoIW1jaSkKKwkJcmV0dXJuOwor CisJZWRhY19kYmcoMCwgIk1DJWQ6IG1jaSA9ICVwXG4iLCBpbWMtPm1jLCBtY2kpOworCisJLyog UmVtb3ZlIE1DIHN5c2ZzIG5vZGVzICovCisJZWRhY19tY19kZWxfbWMobWNpLT5wZGV2KTsKKwor CWVkYWNfZGJnKDEsICIlczogZnJlZSBtY2kgc3RydWN0XG4iLCBtY2ktPmN0bF9uYW1lKTsKKwlr ZnJlZShtY2ktPmN0bF9uYW1lKTsKKwllZGFjX21jX2ZyZWUobWNpKTsKK30KKworc3RhdGljIHN0 cnVjdCBtZW1fY3RsX2luZm8gKmdldF9tY2koaW50IHNyY19pZCwgaW50IGxtYykKK3sKKwlzdHJ1 Y3Qgc2t4X2RldiAqZDsKKworCWlmIChsbWMgPiBOVU1fSU1DIC0gMSkgeworCQlza3hfcHJpbnRr KEtFUk5fRVJSLCAiQmFkIGxtYyAlZFxuIiwgbG1jKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJ bGlzdF9mb3JfZWFjaF9lbnRyeShkLCAmZGV2X2VkYWNfbGlzdCwgbGlzdCkgeworCQlpZiAoZC0+ aW1jWzBdLnNyY19pZCA9PSBzcmNfaWQpCisJCQlyZXR1cm4gZC0+aW1jW2xtY10ubWNpOworCX0K KworCXNreF9wcmludGsoS0VSTl9FUlIsICJObyBtY2kgZm9yIHNyY19pZCAlZCBsbWMgJWRcbiIs IHNyY19pZCwgbG1jKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgc2t4X21jZV9v dXRwdXRfZXJyb3Ioc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpLAorCQkJCSBjb25zdCBzdHJ1Y3Qg bWNlICptLAorCQkJCSBzdHJ1Y3QgZGVjb2RlZF9hZGRyICpyZXMpCit7CisJZW51bSBod19ldmVu dF9tY19lcnJfdHlwZSB0cF9ldmVudDsKKwljaGFyICp0eXBlLCAqb3B0eXBlOworCWJvb2wgcmlw diA9IEdFVF9CSVRGSUVMRChtLT5tY2dzdGF0dXMsIDAsIDApOworCWJvb2wgb3ZlcmZsb3cgPSBH RVRfQklURklFTEQobS0+c3RhdHVzLCA2MiwgNjIpOworCWJvb2wgdW5jb3JyZWN0ZWRfZXJyb3Ig PSBHRVRfQklURklFTEQobS0+c3RhdHVzLCA2MSwgNjEpOworCWJvb2wgcmVjb3ZlcmFibGU7CisJ dTMyIGNvcmVfZXJyX2NudCA9IEdFVF9CSVRGSUVMRChtLT5zdGF0dXMsIDM4LCA1Mik7CisJdTMy IG1zY29kID0gR0VUX0JJVEZJRUxEKG0tPnN0YXR1cywgMTYsIDMxKTsKKwl1MzIgZXJyY29kZSA9 IEdFVF9CSVRGSUVMRChtLT5zdGF0dXMsIDAsIDE1KTsKKwl1MzIgb3B0eXBlbnVtID0gR0VUX0JJ VEZJRUxEKG0tPnN0YXR1cywgNCwgNik7CisKKwlyZWNvdmVyYWJsZSA9IEdFVF9CSVRGSUVMRCht LT5zdGF0dXMsIDU2LCA1Nik7CisKKwlpZiAodW5jb3JyZWN0ZWRfZXJyb3IpIHsKKwkJY29yZV9l cnJfY250ID0gMTsKKwkJaWYgKHJpcHYpIHsKKwkJCXR5cGUgPSAiRkFUQUwiOworCQkJdHBfZXZl bnQgPSBIV19FVkVOVF9FUlJfRkFUQUw7CisJCX0gZWxzZSB7CisJCQl0eXBlID0gIk5PTl9GQVRB TCI7CisJCQl0cF9ldmVudCA9IEhXX0VWRU5UX0VSUl9VTkNPUlJFQ1RFRDsKKwkJfQorCX0gZWxz ZSB7CisJCXR5cGUgPSAiQ09SUkVDVEVEIjsKKwkJdHBfZXZlbnQgPSBIV19FVkVOVF9FUlJfQ09S UkVDVEVEOworCX0KKworCS8qCisJICogQWNjb3JkaW5nIHdpdGggVGFibGUgMTUtOSBvZiB0aGUg SW50ZWwgQXJjaGl0ZWN0dXJlIHNwZWMgdm9sIDNBLAorCSAqIG1lbW9yeSBlcnJvcnMgc2hvdWxk IGZpdCBpbiB0aGlzIG1hc2s6CisJICoJMDAwZiAwMDAwIDFtbW0gY2NjYyAoYmluYXJ5KQorCSAq IHdoZXJlOgorCSAqCWYgPSBDb3JyZWN0aW9uIFJlcG9ydCBGaWx0ZXJpbmcgQml0LiBJZiAxLCBz dWJzZXF1ZW50IGVycm9ycworCSAqCSAgICB3b24ndCBiZSBzaG93bgorCSAqCW1tbSA9IGVycm9y IHR5cGUKKwkgKgljY2NjID0gY2hhbm5lbAorCSAqIElmIHRoZSBtYXNrIGRvZXNuJ3QgbWF0Y2gs IHJlcG9ydCBhbiBlcnJvciB0byB0aGUgcGFyc2luZyBsb2dpYworCSAqLworCWlmICghKChlcnJj b2RlICYgMHhlZjgwKSA9PSAweDgwKSkgeworCQlvcHR5cGUgPSAiQ2FuJ3QgcGFyc2U6IGl0IGlz IG5vdCBhIG1lbSI7CisJfSBlbHNlIHsKKwkJc3dpdGNoIChvcHR5cGVudW0pIHsKKwkJY2FzZSAw OgorCQkJb3B0eXBlID0gImdlbmVyaWMgdW5kZWYgcmVxdWVzdCBlcnJvciI7CisJCQlicmVhazsK KwkJY2FzZSAxOgorCQkJb3B0eXBlID0gIm1lbW9yeSByZWFkIGVycm9yIjsKKwkJCWJyZWFrOwor CQljYXNlIDI6CisJCQlvcHR5cGUgPSAibWVtb3J5IHdyaXRlIGVycm9yIjsKKwkJCWJyZWFrOwor CQljYXNlIDM6CisJCQlvcHR5cGUgPSAiYWRkci9jbWQgZXJyb3IiOworCQkJYnJlYWs7CisJCWNh c2UgNDoKKwkJCW9wdHlwZSA9ICJtZW1vcnkgc2NydWJiaW5nIGVycm9yIjsKKwkJCWJyZWFrOwor CQlkZWZhdWx0OgorCQkJb3B0eXBlID0gInJlc2VydmVkIjsKKwkJCWJyZWFrOworCQl9CisJfQor CWlmIChhZHhsX2NvbXBvbmVudF9jb3VudCkgeworCQlzbnByaW50Zihza3hfbXNnLCBNU0dfU0la RSwgIiVzJXMgZXJyX2NvZGU6MHglMDR4OjB4JTA0eCAlcyIsCisJCQkgb3ZlcmZsb3cgPyAiIE9W RVJGTE9XIiA6ICIiLAorCQkJICh1bmNvcnJlY3RlZF9lcnJvciAmJiByZWNvdmVyYWJsZSkgPyAi IHJlY292ZXJhYmxlIiA6ICIiLAorCQkJIG1zY29kLCBlcnJjb2RlLCBhZHhsX21zZyk7CisJfSBl bHNlIHsKKwkJc25wcmludGYoc2t4X21zZywgTVNHX1NJWkUsCisJCQkgIiVzJXMgZXJyX2NvZGU6 MHglMDR4OjB4JTA0eCBzb2NrZXQ6JWQgaW1jOiVkIHJhbms6JWQgYmc6JWQgYmE6JWQgcm93OjB4 JXggY29sOjB4JXgiLAorCQkJIG92ZXJmbG93ID8gIiBPVkVSRkxPVyIgOiAiIiwKKwkJCSAodW5j b3JyZWN0ZWRfZXJyb3IgJiYgcmVjb3ZlcmFibGUpID8gIiByZWNvdmVyYWJsZSIgOiAiIiwKKwkJ CSBtc2NvZCwgZXJyY29kZSwKKwkJCSByZXMtPnNvY2tldCwgcmVzLT5pbWMsIHJlcy0+cmFuaywK KwkJCSByZXMtPmJhbmtfZ3JvdXAsIHJlcy0+YmFua19hZGRyZXNzLCByZXMtPnJvdywgcmVzLT5j b2x1bW4pOworCX0KKworCWVkYWNfZGJnKDAsICIlc1xuIiwgc2t4X21zZyk7CisKKwkvKiBDYWxs IHRoZSBoZWxwZXIgdG8gb3V0cHV0IG1lc3NhZ2UgKi8KKwllZGFjX21jX2hhbmRsZV9lcnJvcih0 cF9ldmVudCwgbWNpLCBjb3JlX2Vycl9jbnQsCisJCQkgICAgIG0tPmFkZHIgPj4gUEFHRV9TSElG VCwgbS0+YWRkciAmIH5QQUdFX01BU0ssIDAsCisJCQkgICAgIHJlcy0+Y2hhbm5lbCwgcmVzLT5k aW1tLCAtMSwKKwkJCSAgICAgb3B0eXBlLCBza3hfbXNnKTsKK30KKworaW50IHNreF9tY2VfY2hl Y2tfZXJyb3Ioc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwgdW5zaWduZWQgbG9uZyB2YWwsCisJ CQl2b2lkICpkYXRhKQoreworCXN0cnVjdCBtY2UgKm1jZSA9IChzdHJ1Y3QgbWNlICopZGF0YTsK KwlzdHJ1Y3QgZGVjb2RlZF9hZGRyIHJlczsKKwlzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2k7CisJ Y2hhciAqdHlwZTsKKworCWlmIChlZGFjX2dldF9yZXBvcnRfc3RhdHVzKCkgPT0gRURBQ19SRVBP UlRJTkdfRElTQUJMRUQpCisJCXJldHVybiBOT1RJRllfRE9ORTsKKworCS8qIGlnbm9yZSB1bmxl c3MgdGhpcyBpcyBtZW1vcnkgcmVsYXRlZCB3aXRoIGFuIGFkZHJlc3MgKi8KKwlpZiAoKG1jZS0+ c3RhdHVzICYgMHhlZmZmKSA+PiA3ICE9IDEgfHwgIShtY2UtPnN0YXR1cyAmIE1DSV9TVEFUVVNf QUREUlYpKQorCQlyZXR1cm4gTk9USUZZX0RPTkU7CisKKwltZW1zZXQoJnJlcywgMCwgc2l6ZW9m KHJlcykpOworCXJlcy5hZGRyID0gbWNlLT5hZGRyOworCisJaWYgKGFkeGxfY29tcG9uZW50X2Nv dW50KSB7CisJCWlmICghc2t4X2FkeGxfZGVjb2RlKCZyZXMpKQorCQkJcmV0dXJuIE5PVElGWV9E T05FOworCisJCW1jaSA9IGdldF9tY2kocmVzLnNvY2tldCwgcmVzLmltYyk7CisJfSBlbHNlIHsK KwkJaWYgKCFza3hfZGVjb2RlIHx8ICFza3hfZGVjb2RlKCZyZXMpKQorCQkJcmV0dXJuIE5PVElG WV9ET05FOworCisJCW1jaSA9IHJlcy5kZXYtPmltY1tyZXMuaW1jXS5tY2k7CisJfQorCisJaWYg KCFtY2kpCisJCXJldHVybiBOT1RJRllfRE9ORTsKKworCWlmIChtY2UtPm1jZ3N0YXR1cyAmIE1D R19TVEFUVVNfTUNJUCkKKwkJdHlwZSA9ICJFeGNlcHRpb24iOworCWVsc2UKKwkJdHlwZSA9ICJF dmVudCI7CisKKwlza3hfbWNfcHJpbnRrKG1jaSwgS0VSTl9ERUJVRywgIkhBTkRMSU5HIE1DRSBN RU1PUlkgRVJST1JcbiIpOworCisJc2t4X21jX3ByaW50ayhtY2ksIEtFUk5fREVCVUcsICJDUFUg JWQ6IE1hY2hpbmUgQ2hlY2sgJXM6IDB4JWxseCAiCisJCQkgICAiQmFuayAlZDogMHglbGx4XG4i LCBtY2UtPmV4dGNwdSwgdHlwZSwKKwkJCSAgIG1jZS0+bWNnc3RhdHVzLCBtY2UtPmJhbmssIG1j ZS0+c3RhdHVzKTsKKwlza3hfbWNfcHJpbnRrKG1jaSwgS0VSTl9ERUJVRywgIlRTQyAweCVsbHgg IiwgbWNlLT50c2MpOworCXNreF9tY19wcmludGsobWNpLCBLRVJOX0RFQlVHLCAiQUREUiAweCVs bHggIiwgbWNlLT5hZGRyKTsKKwlza3hfbWNfcHJpbnRrKG1jaSwgS0VSTl9ERUJVRywgIk1JU0Mg MHglbGx4ICIsIG1jZS0+bWlzYyk7CisKKwlza3hfbWNfcHJpbnRrKG1jaSwgS0VSTl9ERUJVRywg IlBST0NFU1NPUiAldToweCV4IFRJTUUgJWxsdSBTT0NLRVQgIgorCQkJICAgIiV1IEFQSUMgMHgl eFxuIiwgbWNlLT5jcHV2ZW5kb3IsIG1jZS0+Y3B1aWQsCisJCQkgICBtY2UtPnRpbWUsIG1jZS0+ c29ja2V0aWQsIG1jZS0+YXBpY2lkKTsKKworCXNreF9tY2Vfb3V0cHV0X2Vycm9yKG1jaSwgbWNl LCAmcmVzKTsKKworCXJldHVybiBOT1RJRllfRE9ORTsKK30KKwordm9pZCBza3hfcmVtb3ZlKHZv aWQpCit7CisJaW50IGksIGo7CisJc3RydWN0IHNreF9kZXYgKmQsICp0bXA7CisKKwllZGFjX2Ri ZygwLCAiXG4iKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkLCB0bXAsICZkZXZfZWRh Y19saXN0LCBsaXN0KSB7CisJCWxpc3RfZGVsKCZkLT5saXN0KTsKKwkJZm9yIChpID0gMDsgaSA8 IE5VTV9JTUM7IGkrKykgeworCQkJaWYgKGQtPmltY1tpXS5tY2kpCisJCQkJc2t4X3VucmVnaXN0 ZXJfbWNpKCZkLT5pbWNbaV0pOworCisJCQlpZiAoZC0+aW1jW2ldLm1kZXYpCisJCQkJcGNpX2Rl dl9wdXQoZC0+aW1jW2ldLm1kZXYpOworCisJCQlpZiAoZC0+aW1jW2ldLm1iYXNlKQorCQkJCWlv dW5tYXAoZC0+aW1jW2ldLm1iYXNlKTsKKworCQkJZm9yIChqID0gMDsgaiA8IE5VTV9DSEFOTkVM UzsgaisrKSB7CisJCQkJaWYgKGQtPmltY1tpXS5jaGFuW2pdLmNkZXYpCisJCQkJCXBjaV9kZXZf cHV0KGQtPmltY1tpXS5jaGFuW2pdLmNkZXYpOworCQkJfQorCQl9CisJCWlmIChkLT51dGlsX2Fs bCkKKwkJCXBjaV9kZXZfcHV0KGQtPnV0aWxfYWxsKTsKKwkJaWYgKGQtPnNhZF9hbGwpCisJCQlw Y2lfZGV2X3B1dChkLT5zYWRfYWxsKTsKKwkJaWYgKGQtPnVyYWN1KQorCQkJcGNpX2Rldl9wdXQo ZC0+dXJhY3UpOworCisJCWtmcmVlKGQpOworCX0KK30KKworI2lmZGVmIENPTkZJR19FREFDX0RF QlVHCisvKgorICogRGVidWcgZmVhdHVyZS4KKyAqIEV4ZXJjaXNlIHRoZSBhZGRyZXNzIGRlY29k ZSBsb2dpYyBieSB3cml0aW5nIGFuIGFkZHJlc3MgdG8KKyAqIC9zeXMva2VybmVsL2RlYnVnL2Vk YWMvZGlybmFtZS9hZGRyLgorICovCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqc2t4X3Rlc3Q7CisK K3N0YXRpYyBpbnQgZGVidWdmc191NjRfc2V0KHZvaWQgKmRhdGEsIHU2NCB2YWwpCit7CisJc3Ry dWN0IG1jZSBtOworCisJcHJfd2Fybl9vbmNlKCJGYWtlIGVycm9yIHRvIDB4JWxseCBpbmplY3Rl ZCB2aWEgZGVidWdmc1xuIiwgdmFsKTsKKworCW1lbXNldCgmbSwgMCwgc2l6ZW9mKG0pKTsKKwkv KiBBRERSViArIE1lbVJkICsgVW5rbm93biBjaGFubmVsICovCisJbS5zdGF0dXMgPSBNQ0lfU1RB VFVTX0FERFJWICsgMHg5MDsKKwkvKiBPbmUgY29ycmVjdGVkIGVycm9yICovCisJbS5zdGF0dXMg fD0gQklUX1VMTChNQ0lfU1RBVFVTX0NFQ19TSElGVCk7CisJbS5hZGRyID0gdmFsOworCXNreF9t Y2VfY2hlY2tfZXJyb3IoTlVMTCwgMCwgJm0pOworCisJcmV0dXJuIDA7Cit9CitERUZJTkVfU0lN UExFX0FUVFJJQlVURShmb3BzX3U2NF93bywgTlVMTCwgZGVidWdmc191NjRfc2V0LCAiJWxsdVxu Iik7CisKK3ZvaWQgc2V0dXBfc2t4X2RlYnVnKGNvbnN0IGNoYXIgKmRpcm5hbWUpCit7CisJc2t4 X3Rlc3QgPSBlZGFjX2RlYnVnZnNfY3JlYXRlX2RpcihkaXJuYW1lKTsKKwlpZiAoIXNreF90ZXN0 KQorCQlyZXR1cm47CisKKwlpZiAoIWVkYWNfZGVidWdmc19jcmVhdGVfZmlsZSgiYWRkciIsIDAy MDAsIHNreF90ZXN0LAorCQkJCSAgICAgIE5VTEwsICZmb3BzX3U2NF93bykpIHsKKwkJZGVidWdm c19yZW1vdmUoc2t4X3Rlc3QpOworCQlza3hfdGVzdCA9IE5VTEw7CisJfQorfQorCit2b2lkIHRl YXJkb3duX3NreF9kZWJ1Zyh2b2lkKQoreworCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZShza3hf dGVzdCk7Cit9CisjZW5kaWYgLypDT05GSUdfRURBQ19ERUJVRyovCmRpZmYgLS1naXQgYS9kcml2 ZXJzL2VkYWMvc2t4X2NvbW1fZWRhYy5oIGIvZHJpdmVycy9lZGFjL3NreF9jb21tX2VkYWMuaApu ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAuLmY3NjE4YTljYzBhZQotLS0g L2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZWRhYy9za3hfY29tbV9lZGFjLmgKQEAgLTAsMCArMSwx NTggQEAKKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCisvKgorICogQ29tbW9u IGNvZGVzIGZvciBib3RoIHRoZSBza3hfZWRhYyBkcml2ZXIgYW5kIEludGVsIDEwbm0gc2VydmVy IEVEQUMgZHJpdmVyLgorICogT3JpZ2luYWxseSBzcGxpdCBvdXQgZnJvbSB0aGUgc2t4X2VkYWMg ZHJpdmVyLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxOCwgSW50ZWwgQ29ycG9yYXRpb24uCisg Ki8KKworI2lmbmRlZiBfU0tYX0NPTU1fRURBQ19ICisjZGVmaW5lIF9TS1hfQ09NTV9FREFDX0gK KworI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4K KyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CisjaW5jbHVk ZSA8bGludXgvYWR4bC5oPgorCisjZGVmaW5lIE1TR19TSVpFCQkxMDI0CisKKy8qCisgKiBEZWJ1 ZyBtYWNyb3MKKyAqLworI2RlZmluZSBza3hfcHJpbnRrKGxldmVsLCBmbXQsIGFyZy4uLikJCQlc CisJZWRhY19wcmludGsobGV2ZWwsICJza3giLCBmbXQsICMjYXJnKQorCisjZGVmaW5lIHNreF9t Y19wcmludGsobWNpLCBsZXZlbCwgZm10LCBhcmcuLi4pCQlcCisJZWRhY19tY19jaGlwc2V0X3By aW50ayhtY2ksIGxldmVsLCAic2t4IiwgZm10LCAjI2FyZykKKworLyoKKyAqIEdldCBhIGJpdCBm aWVsZCBhdCByZWdpc3RlciB2YWx1ZSA8dj4sIGZyb20gYml0IDxsbz4gdG8gYml0IDxoaT4KKyAq LworI2RlZmluZSBHRVRfQklURklFTEQodiwgbG8sIGhpKSBcCisJKCgodikgJiBHRU5NQVNLX1VM TCgoaGkpLCAobG8pKSkgPj4gKGxvKSkKKworI2RlZmluZSBTS1hfTlVNX0lNQwkJMgkvKiBNZW1v cnkgY29udHJvbGxlcnMgcGVyIHNvY2tldCAqLworI2RlZmluZSBTS1hfTlVNX0NIQU5ORUxTCTMJ LyogQ2hhbm5lbHMgcGVyIG1lbW9yeSBjb250cm9sbGVyICovCisjZGVmaW5lIFNLWF9OVU1fRElN TVMJCTIJLyogTWF4IERJTU1TIHBlciBjaGFubmVsICovCisKKyNkZWZpbmUgSTEwTk1fTlVNX0lN QwkJNAorI2RlZmluZSBJMTBOTV9OVU1fQ0hBTk5FTFMJMgorI2RlZmluZSBJMTBOTV9OVU1fRElN TVMJCTIKKworI2RlZmluZSBNQVgoYSwgYikJKChhKSA+IChiKSA/IChhKSA6IChiKSkKKyNkZWZp bmUgTlVNX0lNQwkJTUFYKFNLWF9OVU1fSU1DLCBJMTBOTV9OVU1fSU1DKQorI2RlZmluZSBOVU1f Q0hBTk5FTFMJTUFYKFNLWF9OVU1fQ0hBTk5FTFMsIEkxME5NX05VTV9DSEFOTkVMUykKKyNkZWZp bmUgTlVNX0RJTU1TCU1BWChTS1hfTlVNX0RJTU1TLCBJMTBOTV9OVU1fRElNTVMpCisKKyNkZWZp bmUgSVNfRElNTV9QUkVTRU5UKHIpCQlHRVRfQklURklFTEQociwgMTUsIDE1KQorI2RlZmluZSBJ U19OVkRJTU1fUFJFU0VOVChyLCBpKQkJR0VUX0JJVEZJRUxEKHIsIGksIGkpCisKKy8qCisgKiBF YWNoIGNwdSBzb2NrZXQgY29udGFpbnMgc29tZSBwY2kgZGV2aWNlcyB0aGF0IHByb3ZpZGUgZ2xv YmFsCisgKiBpbmZvcm1hdGlvbiwgYW5kIGFsc28gc29tZSB0aGF0IGFyZSBsb2NhbCB0byBlYWNo IG9mIHRoZSB0d28KKyAqIG1lbW9yeSBjb250cm9sbGVycyBvbiB0aGUgZGllLgorICovCitzdHJ1 Y3Qgc2t4X2RldiB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXU4IGJ1c1s0XTsKKwlpbnQg c2VnOworCXN0cnVjdCBwY2lfZGV2ICpzYWRfYWxsOworCXN0cnVjdCBwY2lfZGV2ICp1dGlsX2Fs bDsKKwlzdHJ1Y3QgcGNpX2RldiAqdXJhY3U7IC8qIGZvciBpMTBubSBDUFUgKi8KKwl1MzIgbWNy b3V0ZTsKKwlzdHJ1Y3Qgc2t4X2ltYyB7CisJCXN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaTsKKwkJ c3RydWN0IHBjaV9kZXYgKm1kZXY7IC8qIGZvciBpMTBubSBDUFUgKi8KKwkJdm9pZCBfX2lvbWVt ICptYmFzZTsgIC8qIGZvciBpMTBubSBDUFUgKi8KKwkJdTggbWM7CS8qIHN5c3RlbSB3aWRlIG1j IyAqLworCQl1OCBsbWM7CS8qIHNvY2tldCByZWxhdGl2ZSBtYyMgKi8KKwkJdTggc3JjX2lkLCBu b2RlX2lkOworCQlzdHJ1Y3Qgc2t4X2NoYW5uZWwgeworCQkJc3RydWN0IHBjaV9kZXYJKmNkZXY7 CisJCQlzdHJ1Y3Qgc2t4X2RpbW0geworCQkJCXU4IGNsb3NlX3BnOworCQkJCXU4IGJhbmtfeG9y X2VuYWJsZTsKKwkJCQl1OCBmaW5lX2dyYWluX2Jhbms7CisJCQkJdTggcm93Yml0czsKKwkJCQl1 OCBjb2xiaXRzOworCQkJfSBkaW1tc1tOVU1fRElNTVNdOworCQl9IGNoYW5bTlVNX0NIQU5ORUxT XTsKKwl9IGltY1tOVU1fSU1DXTsKK307CisKK3N0cnVjdCBza3hfcHZ0IHsKKwlzdHJ1Y3Qgc2t4 X2ltYwkqaW1jOworfTsKKworZW51bSB0eXBlIHsKKwlTS1gsCisJSTEwTk0KK307CisKK2VudW0g eworCUlOREVYX1NPQ0tFVCwKKwlJTkRFWF9NRU1DVFJMLAorCUlOREVYX0NIQU5ORUwsCisJSU5E RVhfRElNTSwKKwlJTkRFWF9NQVgKK307CisKK3N0cnVjdCBkZWNvZGVkX2FkZHIgeworCXN0cnVj dCBza3hfZGV2ICpkZXY7CisJdTY0CWFkZHI7CisJaW50CXNvY2tldDsKKwlpbnQJaW1jOworCWlu dAljaGFubmVsOworCXU2NAljaGFuX2FkZHI7CisJaW50CXNrdHdheXM7CisJaW50CWNoYW53YXlz OworCWludAlkaW1tOworCWludAlyYW5rOworCWludAljaGFubmVsX3Jhbms7CisJdTY0CXJhbmtf YWRkcmVzczsKKwlpbnQJcm93OworCWludAljb2x1bW47CisJaW50CWJhbmtfYWRkcmVzczsKKwlp bnQJYmFua19ncm91cDsKK307CisKK3R5cGVkZWYgaW50ICgqZ2V0X2RpbW1fY29uZmlnX2YpKHN0 cnVjdCBtZW1fY3RsX2luZm8gKm1jaSk7Cit0eXBlZGVmIGJvb2wgKCpza3hfZGVjb2RlX2YpKHN0 cnVjdCBkZWNvZGVkX2FkZHIgKnJlcyk7CisKK2ludCBfX2luaXQgc2t4X2FkeGxfZ2V0KHZvaWQp Owordm9pZCBfX2V4aXQgc2t4X2FkeGxfcHV0KHZvaWQpOwordm9pZCBza3hfc2V0X2RlY29kZShz a3hfZGVjb2RlX2YgZGVjb2RlKTsKKworaW50IHNreF9nZXRfc3JjX2lkKHN0cnVjdCBza3hfZGV2 ICpkLCB1OCAqaWQpOworaW50IHNreF9nZXRfbm9kZV9pZChzdHJ1Y3Qgc2t4X2RldiAqZCwgdTgg KmlkKTsKKworaW50IHNreF9nZXRfYWxsX2J1c19tYXBwaW5ncyh1bnNpZ25lZCBpbnQgZGlkLCBp bnQgb2ZmLCBlbnVtIHR5cGUsCisJCQkgICAgIHN0cnVjdCBsaXN0X2hlYWQgKipsaXN0KTsKKwor aW50IHNreF9nZXRfaGlfbG8odW5zaWduZWQgaW50IGRpZCwgaW50IG9mZltdLCB1NjQgKnRvbG0s IHU2NCAqdG9obSk7CisKK2ludCBza3hfZ2V0X2RpbW1faW5mbyh1MzIgbXRyLCB1MzIgYW1hcCwg c3RydWN0IGRpbW1faW5mbyAqZGltbSwKKwkJICAgICAgc3RydWN0IHNreF9pbWMgKmltYywgaW50 IGNoYW4sIGludCBkaW1tbm8pOworCitpbnQgc2t4X2dldF9udmRpbW1faW5mbyhzdHJ1Y3QgZGlt bV9pbmZvICpkaW1tLCBzdHJ1Y3Qgc2t4X2ltYyAqaW1jLAorCQkJaW50IGNoYW4sIGludCBkaW1t bm8sIGNvbnN0IGNoYXIgKm1vZF9zdHIpOworCitpbnQgc2t4X3JlZ2lzdGVyX21jaShzdHJ1Y3Qg c2t4X2ltYyAqaW1jLCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJICAgICBjb25zdCBjaGFyICpj dGxfbmFtZSwgY29uc3QgY2hhciAqbW9kX3N0ciwKKwkJICAgICBnZXRfZGltbV9jb25maWdfZiBn ZXRfZGltbV9jb25maWcpOworCitpbnQgc2t4X21jZV9jaGVja19lcnJvcihzdHJ1Y3Qgbm90aWZp ZXJfYmxvY2sgKm5iLCB1bnNpZ25lZCBsb25nIHZhbCwKKwkJCXZvaWQgKmRhdGEpOworCit2b2lk IHNreF9yZW1vdmUodm9pZCk7CisKKyNpZmRlZiBDT05GSUdfRURBQ19ERUJVRwordm9pZCBzZXR1 cF9za3hfZGVidWcoY29uc3QgY2hhciAqZGlybmFtZSk7Cit2b2lkIHRlYXJkb3duX3NreF9kZWJ1 Zyh2b2lkKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0dXBfc2t4X2RlYnVnKGNvbnN0 IGNoYXIgKmRpcm5hbWUpIHt9CitzdGF0aWMgaW5saW5lIHZvaWQgdGVhcmRvd25fc2t4X2RlYnVn KHZvaWQpIHt9CisjZW5kaWYgLypDT05GSUdfRURBQ19ERUJVRyovCisKKyNlbmRpZiAvKiBfU0tY X0NPTU1fRURBQ19IICovCg==