From mboxrd@z Thu Jan 1 00:00:00 1970 From: Hyun Kwon Subject: [PATCH v8 4/5] drm: xlnx: DRM KMS driver for Xilinx ZynqMP DisplayPort Date: Sat, 7 Jul 2018 19:05:37 -0700 Message-ID: <1531015538-32268-5-git-send-email-hyun.kwon@xilinx.com> References: <1531015538-32268-1-git-send-email-hyun.kwon@xilinx.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <1531015538-32268-1-git-send-email-hyun.kwon@xilinx.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, devicetree@vger.kernel.org, Laurent Pinchart Cc: Daniel Vetter , Rob Herring , Michal Simek , Hyun Kwon List-Id: devicetree@vger.kernel.org VGhpcyBkcml2ZXIgY3JlYXRlcyBEUk0gZW5jb2RlciBhbmQgY29ubmVjdG9yIGZvciBaeW5xTVAg RGlzcGxheVBvcnQuCgpTaWduZWQtb2ZmLWJ5OiBIeXVuIEt3b24gPGh5dW4ua3dvbkB4aWxpbngu Y29tPgpBY2tlZC1ieTogRGFuaWVsIFZldHRlciA8ZGFuaWVsLnZldHRlckBmZndsbC5jaD4KLS0t CnY4Ci0gQWxsb3cgdG8gaW5pdGlhbGl6ZSB3aXRob3V0IGFueSBwaHkgbGFuZQp2NwotIFVzZSBj b3JyZWN0IG51bWJlciBvZiBsYW5lcwp2NgotIENvbnN0aWZ5IGFsbCBmdW5jdGlvbiBwb2ludGVy cwotIENsZWFuIHVwIHRoZSBkdXBsaWNhdGVkIGxpY2Vuc2UgcGFyYWdyYXBocwotIERvIGNvbXBs ZXRlIGZvcndhcmQgZGVjbGFyYXRpb24gaW4gdGhlIGhlYWRlcgp2MgotIENoYW5nZSB0aGUgU1BE WCBpZGVudGlmaWVyIGZvcm1hdAotIFNwbGl0IGRybSBwcm9wZXJ0aWVzIGludG8gYSBzZXBhcmF0 ZSBwYXRjaAotLS0KLS0tCiBkcml2ZXJzL2dwdS9kcm0veGxueC96eW5xbXBfZHAuYyB8IDE3NTYg KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKIGRyaXZlcnMvZ3B1L2RybS94 bG54L3p5bnFtcF9kcC5oIHwgICAzMCArCiAyIGZpbGVzIGNoYW5nZWQsIDE3ODYgaW5zZXJ0aW9u cygrKQogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1L2RybS94bG54L3p5bnFtcF9kcC5j CiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL3hsbngvenlucW1wX2RwLmgKCmRp ZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0veGxueC96eW5xbXBfZHAuYyBiL2RyaXZlcnMvZ3B1 L2RybS94bG54L3p5bnFtcF9kcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAu LmU2MGYwN2IKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0veGxueC96eW5xbXBf ZHAuYwpAQCAtMCwwICsxLDE3NTYgQEAKKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwt Mi4wCisvKgorICogWnlucU1QIERpc3BsYXlQb3J0IERyaXZlcgorICoKKyAqICBDb3B5cmlnaHQg KEMpIDIwMTcgLSAyMDE4IFhpbGlueCwgSW5jLgorICoKKyAqICBBdXRob3I6IEh5dW4gV29vIEt3 b24gPGh5dW4ua3dvbkB4aWxpbnguY29tPgorICovCisKKyNpbmNsdWRlIDxkcm0vZHJtUC5oPgor I2luY2x1ZGUgPGRybS9kcm1fYXRvbWljX2hlbHBlci5oPgorI2luY2x1ZGUgPGRybS9kcm1fY29u bmVjdG9yLmg+CisjaW5jbHVkZSA8ZHJtL2RybV9jcnRjLmg+CisjaW5jbHVkZSA8ZHJtL2RybV9j cnRjX2hlbHBlci5oPgorI2luY2x1ZGUgPGRybS9kcm1fZHBfaGVscGVyLmg+CisjaW5jbHVkZSA8 ZHJtL2RybV9vZi5oPgorCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51 eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9t dXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L3BoeS9waHkuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0 Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CisjaW5jbHVkZSA8 bGludXgvdWFjY2Vzcy5oPgorCisjaW5jbHVkZSAienlucW1wX2Rpc3AuaCIKKyNpbmNsdWRlICJ6 eW5xbXBfZHBzdWIuaCIKKworc3RhdGljIHVpbnQgenlucW1wX2RwX2F1eF90aW1lb3V0X21zID0g NTA7Cittb2R1bGVfcGFyYW1fbmFtZWQoYXV4X3RpbWVvdXRfbXMsIHp5bnFtcF9kcF9hdXhfdGlt ZW91dF9tcywgdWludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGF1eF90aW1lb3V0X21zLCAi RFAgYXV4IHRpbWVvdXQgdmFsdWUgaW4gbXNlYyAoZGVmYXVsdDogNTApIik7CisKKy8qCisgKiBT b21lIHNpbmsgcmVxdWlyZXMgYSBkZWxheSBhZnRlciBwb3dlciBvbiByZXF1ZXN0CisgKi8KK3N0 YXRpYyB1aW50IHp5bnFtcF9kcF9wb3dlcl9vbl9kZWxheV9tcyA9IDQ7Cittb2R1bGVfcGFyYW1f bmFtZWQocG93ZXJfb25fZGVsYXlfbXMsIHp5bnFtcF9kcF9wb3dlcl9vbl9kZWxheV9tcywgdWlu dCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGF1eF90aW1lb3V0X21zLCAiRFAgcG93ZXIgb24g ZGVsYXkgaW4gbXNlYyAoZGVmYXVsdDogNCkiKTsKKworLyogTGluayBjb25maWd1cmF0aW9uIHJl Z2lzdGVycyAqLworI2RlZmluZSBaWU5RTVBfRFBfVFhfTElOS19CV19TRVQJCQkweDAKKyNkZWZp bmUgWllOUU1QX0RQX1RYX0xBTkVfQ05UX1NFVAkJCTB4NAorI2RlZmluZSBaWU5RTVBfRFBfVFhf RU5IQU5DRURfRlJBTUVfRU4JCQkweDgKKyNkZWZpbmUgWllOUU1QX0RQX1RYX1RSQUlOSU5HX1BB VFRFUk5fU0VUCQkweGMKKyNkZWZpbmUgWllOUU1QX0RQX1RYX1NDUkFNQkxJTkdfRElTQUJMRQkJ CTB4MTQKKyNkZWZpbmUgWllOUU1QX0RQX1RYX0RPV05TUFJFQURfQ1RMCQkJMHgxOAorI2RlZmlu ZSBaWU5RTVBfRFBfVFhfU1dfUkVTRVQJCQkJMHgxYworI2RlZmluZSBaWU5RTVBfRFBfVFhfU1df UkVTRVRfU1RSRUFNMQkJCUJJVCgwKQorI2RlZmluZSBaWU5RTVBfRFBfVFhfU1dfUkVTRVRfU1RS RUFNMgkJCUJJVCgxKQorI2RlZmluZSBaWU5RTVBfRFBfVFhfU1dfUkVTRVRfU1RSRUFNMwkJCUJJ VCgyKQorI2RlZmluZSBaWU5RTVBfRFBfVFhfU1dfUkVTRVRfU1RSRUFNNAkJCUJJVCgzKQorI2Rl ZmluZSBaWU5RTVBfRFBfVFhfU1dfUkVTRVRfQVVYCQkJQklUKDcpCisjZGVmaW5lIFpZTlFNUF9E UF9UWF9TV19SRVNFVF9BTEwJCQkoWllOUU1QX0RQX1RYX1NXX1JFU0VUX1NUUkVBTTEgfCBcCisJ CQkJCQkJIFpZTlFNUF9EUF9UWF9TV19SRVNFVF9TVFJFQU0yIHwgXAorCQkJCQkJCSBaWU5RTVBf RFBfVFhfU1dfUkVTRVRfU1RSRUFNMyB8IFwKKwkJCQkJCQkgWllOUU1QX0RQX1RYX1NXX1JFU0VU X1NUUkVBTTQgfCBcCisJCQkJCQkJIFpZTlFNUF9EUF9UWF9TV19SRVNFVF9BVVgpCisKKy8qIENv cmUgZW5hYmxlIHJlZ2lzdGVycyAqLworI2RlZmluZSBaWU5RTVBfRFBfVFhfRU5BQkxFCQkJCTB4 ODAKKyNkZWZpbmUgWllOUU1QX0RQX1RYX0VOQUJMRV9NQUlOX1NUUkVBTQkJCTB4ODQKKyNkZWZp bmUgWllOUU1QX0RQX1RYX0ZPUkNFX1NDUkFNQkxFUl9SRVNFVAkJMHhjMAorI2RlZmluZSBaWU5R TVBfRFBfVFhfVkVSU0lPTgkJCQkweGY4CisjZGVmaW5lIFpZTlFNUF9EUF9UWF9WRVJTSU9OX01B Sk9SX01BU0sJCQlHRU5NQVNLKDMxLCAyNCkKKyNkZWZpbmUgWllOUU1QX0RQX1RYX1ZFUlNJT05f TUFKT1JfU0hJRlQJCTI0CisjZGVmaW5lIFpZTlFNUF9EUF9UWF9WRVJTSU9OX01JTk9SX01BU0sJ CQlHRU5NQVNLKDIzLCAxNikKKyNkZWZpbmUgWllOUU1QX0RQX1RYX1ZFUlNJT05fTUlOT1JfU0hJ RlQJCTE2CisjZGVmaW5lIFpZTlFNUF9EUF9UWF9WRVJTSU9OX1JFVklTSU9OX01BU0sJCUdFTk1B U0soMTUsIDEyKQorI2RlZmluZSBaWU5RTVBfRFBfVFhfVkVSU0lPTl9SRVZJU0lPTl9TSElGVAkJ MTIKKyNkZWZpbmUgWllOUU1QX0RQX1RYX1ZFUlNJT05fUEFUQ0hfTUFTSwkJCUdFTk1BU0soMTEs IDgpCisjZGVmaW5lIFpZTlFNUF9EUF9UWF9WRVJTSU9OX1BBVENIX1NISUZUCQk4CisjZGVmaW5l IFpZTlFNUF9EUF9UWF9WRVJTSU9OX0lOVEVSTkFMX01BU0sJCUdFTk1BU0soNywgMCkKKyNkZWZp bmUgWllOUU1QX0RQX1RYX1ZFUlNJT05fSU5URVJOQUxfU0hJRlQJCTAKKworLyogQ29yZSBJRCBy ZWdpc3RlcnMgKi8KKyNkZWZpbmUgWllOUU1QX0RQX1RYX0NPUkVfSUQJCQkJMHhmYworI2RlZmlu ZSBaWU5RTVBfRFBfVFhfQ09SRV9JRF9NQUpPUl9NQVNLCQkJR0VOTUFTSygzMSwgMjQpCisjZGVm aW5lIFpZTlFNUF9EUF9UWF9DT1JFX0lEX01BSk9SX1NISUZUCQkyNAorI2RlZmluZSBaWU5RTVBf RFBfVFhfQ09SRV9JRF9NSU5PUl9NQVNLCQkJR0VOTUFTSygyMywgMTYpCisjZGVmaW5lIFpZTlFN UF9EUF9UWF9DT1JFX0lEX01JTk9SX1NISUZUCQkxNgorI2RlZmluZSBaWU5RTVBfRFBfVFhfQ09S RV9JRF9SRVZJU0lPTl9NQVNLCQlHRU5NQVNLKDE1LCA4KQorI2RlZmluZSBaWU5RTVBfRFBfVFhf Q09SRV9JRF9SRVZJU0lPTl9TSElGVAkJOAorI2RlZmluZSBaWU5RTVBfRFBfVFhfQ09SRV9JRF9E SVJFQ1RJT04JCQlHRU5NQVNLKDEpCisKKy8qIEFVWCBjaGFubmVsIGludGVyZmFjZSByZWdpc3Rl cnMgKi8KKyNkZWZpbmUgWllOUU1QX0RQX1RYX0FVWF9DT01NQU5ECQkJMHgxMDAKKyNkZWZpbmUg WllOUU1QX0RQX1RYX0FVWF9DT01NQU5EX0NNRF9TSElGVAkJOAorI2RlZmluZSBaWU5RTVBfRFBf VFhfQVVYX0NPTU1BTkRfQUREUkVTU19PTkxZCQlCSVQoMTIpCisjZGVmaW5lIFpZTlFNUF9EUF9U WF9BVVhfQ09NTUFORF9CWVRFU19TSElGVAkJMAorI2RlZmluZSBaWU5RTVBfRFBfVFhfQVVYX1dS SVRFX0ZJRk8JCQkweDEwNAorI2RlZmluZSBaWU5RTVBfRFBfVFhfQVVYX0FERFJFU1MJCQkweDEw OAorI2RlZmluZSBaWU5RTVBfRFBfVFhfQ0xLX0RJVklERVIJCQkweDEwYworI2RlZmluZSBaWU5R TVBfRFBfVFhfQ0xLX0RJVklERVJfTUhaCQkJMTAwMDAwMAorI2RlZmluZSBaWU5RTVBfRFBfVFhf Q0xLX0RJVklERVJfQVVYX0ZJTFRFUl9TSElGVAk4CisjZGVmaW5lIFpZTlFNUF9EUF9UWF9JTlRS X1NJR05BTF9TVEFURQkJCTB4MTMwCisjZGVmaW5lIFpZTlFNUF9EUF9UWF9JTlRSX1NJR05BTF9T VEFURV9IUEQJCUJJVCgwKQorI2RlZmluZSBaWU5RTVBfRFBfVFhfSU5UUl9TSUdOQUxfU1RBVEVf UkVRVUVTVAkJQklUKDEpCisjZGVmaW5lIFpZTlFNUF9EUF9UWF9JTlRSX1NJR05BTF9TVEFURV9S RVBMWQkJQklUKDIpCisjZGVmaW5lIFpZTlFNUF9EUF9UWF9JTlRSX1NJR05BTF9TVEFURV9SRVBM WV9USU1FT1VUCUJJVCgzKQorI2RlZmluZSBaWU5RTVBfRFBfVFhfQVVYX1JFUExZX0RBVEEJCQkw eDEzNAorI2RlZmluZSBaWU5RTVBfRFBfVFhfQVVYX1JFUExZX0NPREUJCQkweDEzOAorI2RlZmlu ZSBaWU5RTVBfRFBfVFhfQVVYX1JFUExZX0NPREVfQVVYX0FDSwkJKDApCisjZGVmaW5lIFpZTlFN UF9EUF9UWF9BVVhfUkVQTFlfQ09ERV9BVVhfTkFDSwkJQklUKDApCisjZGVmaW5lIFpZTlFNUF9E UF9UWF9BVVhfUkVQTFlfQ09ERV9BVVhfREVGRVIJCUJJVCgxKQorI2RlZmluZSBaWU5RTVBfRFBf VFhfQVVYX1JFUExZX0NPREVfSTJDX0FDSwkJKDApCisjZGVmaW5lIFpZTlFNUF9EUF9UWF9BVVhf UkVQTFlfQ09ERV9JMkNfTkFDSwkJQklUKDIpCisjZGVmaW5lIFpZTlFNUF9EUF9UWF9BVVhfUkVQ TFlfQ09ERV9JMkNfREVGRVIJCUJJVCgzKQorI2RlZmluZSBaWU5RTVBfRFBfVFhfQVVYX1JFUExZ X0NOVAkJCTB4MTNjCisjZGVmaW5lIFpZTlFNUF9EUF9UWF9BVVhfUkVQTFlfQ05UX01BU0sJCQkw eGZmCisjZGVmaW5lIFpZTlFNUF9EUF9UWF9JTlRSX1NUQVRVUwkJCTB4MTQwCisjZGVmaW5lIFpZ TlFNUF9EUF9UWF9JTlRSX01BU0sJCQkJMHgxNDQKKyNkZWZpbmUgWllOUU1QX0RQX1RYX0lOVFJf SFBEX0lSUQkJCUJJVCgwKQorI2RlZmluZSBaWU5RTVBfRFBfVFhfSU5UUl9IUERfRVZFTlQJCQlC SVQoMSkKKyNkZWZpbmUgWllOUU1QX0RQX1RYX0lOVFJfUkVQTFlfUkVDVgkJCUJJVCgyKQorI2Rl ZmluZSBaWU5RTVBfRFBfVFhfSU5UUl9SRVBMWV9USU1FT1VUCQkJQklUKDMpCisjZGVmaW5lIFpZ TlFNUF9EUF9UWF9JTlRSX0hQRF9QVUxTRQkJCUJJVCg0KQorI2RlZmluZSBaWU5RTVBfRFBfVFhf SU5UUl9FWFRfUEtUX1RYRAkJCUJJVCg1KQorI2RlZmluZSBaWU5RTVBfRFBfVFhfSU5UUl9MSVZf QUJVRl9VTkRSRkxXCQlCSVQoMTIpCisjZGVmaW5lIFpZTlFNUF9EUF9UWF9JTlRSX1ZCTEFOS19T VEFSVAkJCUJJVCgxMykKKyNkZWZpbmUgWllOUU1QX0RQX1RYX0lOVFJfUElYRUwwX01BVENICQkJ QklUKDE0KQorI2RlZmluZSBaWU5RTVBfRFBfVFhfSU5UUl9QSVhFTDFfTUFUQ0gJCQlCSVQoMTUp CisjZGVmaW5lIFpZTlFNUF9EUF9UWF9JTlRSX0NIQlVGX1VOREVSRkxXX01BU0sJCTB4M2YwMDAw CisjZGVmaW5lIFpZTlFNUF9EUF9UWF9JTlRSX0NIQlVGX09WRVJGTFdfTUFTSwkJMHhmYzAwMDAw CisjZGVmaW5lIFpZTlFNUF9EUF9UWF9JTlRSX0NVU1RfVFNfMgkJCUJJVCgyOCkKKyNkZWZpbmUg WllOUU1QX0RQX1RYX0lOVFJfQ1VTVF9UUwkJCUJJVCgyOSkKKyNkZWZpbmUgWllOUU1QX0RQX1RY X0lOVFJfRVhUX1ZTWU5DX1RTCQkJQklUKDMwKQorI2RlZmluZSBaWU5RTVBfRFBfVFhfSU5UUl9W U1lOQ19UUwkJCUJJVCgzMSkKKyNkZWZpbmUgWllOUU1QX0RQX1RYX0lOVFJfQUxMCQkJCShaWU5R TVBfRFBfVFhfSU5UUl9IUERfSVJRIHwgXAorCQkJCQkJCSBaWU5RTVBfRFBfVFhfSU5UUl9IUERf RVZFTlQgfCBcCisJCQkJCQkJIFpZTlFNUF9EUF9UWF9JTlRSX1JFUExZX1JFQ1YgfCBcCisJCQkJ CQkJIFpZTlFNUF9EUF9UWF9JTlRSX1JFUExZX1RJTUVPVVQgfCBcCisJCQkJCQkJIFpZTlFNUF9E UF9UWF9JTlRSX0hQRF9QVUxTRSB8IFwKKwkJCQkJCQkgWllOUU1QX0RQX1RYX0lOVFJfRVhUX1BL VF9UWEQgfCBcCisJCQkJCQkJIFpZTlFNUF9EUF9UWF9JTlRSX0xJVl9BQlVGX1VORFJGTFcgfCBc CisJCQkJCQkJIFpZTlFNUF9EUF9UWF9JTlRSX0NIQlVGX1VOREVSRkxXX01BU0sgfCBcCisJCQkJ CQkJIFpZTlFNUF9EUF9UWF9JTlRSX0NIQlVGX09WRVJGTFdfTUFTSykKKyNkZWZpbmUgWllOUU1Q X0RQX1RYX05PX0lOVFJfQUxMCQkJKFpZTlFNUF9EUF9UWF9JTlRSX1BJWEVMMF9NQVRDSCB8IFwK KwkJCQkJCQkgWllOUU1QX0RQX1RYX0lOVFJfUElYRUwxX01BVENIIHwgXAorCQkJCQkJCSBaWU5R TVBfRFBfVFhfSU5UUl9DVVNUX1RTXzIgfCBcCisJCQkJCQkJIFpZTlFNUF9EUF9UWF9JTlRSX0NV U1RfVFMgfCBcCisJCQkJCQkJIFpZTlFNUF9EUF9UWF9JTlRSX0VYVF9WU1lOQ19UUyB8IFwKKwkJ CQkJCQkgWllOUU1QX0RQX1RYX0lOVFJfVlNZTkNfVFMpCisjZGVmaW5lIFpZTlFNUF9EUF9UWF9S RVBMWV9EQVRBX0NOVAkJCTB4MTQ4CisjZGVmaW5lIFpZTlFNUF9EUF9TVUJfVFhfSU5UUl9TVEFU VVMJCQkweDNhMAorI2RlZmluZSBaWU5RTVBfRFBfU1VCX1RYX0lOVFJfTUFTSwkJCTB4M2E0Cisj ZGVmaW5lIFpZTlFNUF9EUF9TVUJfVFhfSU5UUl9FTgkJCTB4M2E4CisjZGVmaW5lIFpZTlFNUF9E UF9TVUJfVFhfSU5UUl9EUwkJCTB4M2FjCisKKy8qIE1haW4gc3RyZWFtIGF0dHJpYnV0ZSByZWdp c3RlcnMgKi8KKyNkZWZpbmUgWllOUU1QX0RQX1RYX01BSU5fU1RSRUFNX0hUT1RBTAkJCTB4MTgw CisjZGVmaW5lIFpZTlFNUF9EUF9UWF9NQUlOX1NUUkVBTV9WVE9UQUwJCQkweDE4NAorI2RlZmlu ZSBaWU5RTVBfRFBfVFhfTUFJTl9TVFJFQU1fUE9MQVJJVFkJCTB4MTg4CisjZGVmaW5lIFpZTlFN UF9EUF9UWF9NQUlOX1NUUkVBTV9QT0xBUklUWV9IU1lOQ19TSElGVAkwCisjZGVmaW5lIFpZTlFN UF9EUF9UWF9NQUlOX1NUUkVBTV9QT0xBUklUWV9WU1lOQ19TSElGVAkxCisjZGVmaW5lIFpZTlFN UF9EUF9UWF9NQUlOX1NUUkVBTV9IU1dJRFRICQkweDE4YworI2RlZmluZSBaWU5RTVBfRFBfVFhf TUFJTl9TVFJFQU1fVlNXSURUSAkJMHgxOTAKKyNkZWZpbmUgWllOUU1QX0RQX1RYX01BSU5fU1RS RUFNX0hSRVMJCQkweDE5NAorI2RlZmluZSBaWU5RTVBfRFBfVFhfTUFJTl9TVFJFQU1fVlJFUwkJ CTB4MTk4CisjZGVmaW5lIFpZTlFNUF9EUF9UWF9NQUlOX1NUUkVBTV9IU1RBUlQJCQkweDE5Ywor I2RlZmluZSBaWU5RTVBfRFBfVFhfTUFJTl9TVFJFQU1fVlNUQVJUCQkJMHgxYTAKKyNkZWZpbmUg WllOUU1QX0RQX1RYX01BSU5fU1RSRUFNX01JU0MwCQkJMHgxYTQKKyNkZWZpbmUgWllOUU1QX0RQ X1RYX01BSU5fU1RSRUFNX01JU0MwX1NZTkMJCUJJVCgwKQorI2RlZmluZSBaWU5RTVBfRFBfVFhf TUFJTl9TVFJFQU1fTUlTQzBfRk9STUFUX1NISUZUCTEKKyNkZWZpbmUgWllOUU1QX0RQX1RYX01B SU5fU1RSRUFNX01JU0MwX0RZTkFNSUNfUkFOR0UJQklUKDMpCisjZGVmaW5lIFpZTlFNUF9EUF9U WF9NQUlOX1NUUkVBTV9NSVNDMF9ZQ0JDUl9DT0xSSU1FVFJZCUJJVCg0KQorI2RlZmluZSBaWU5R TVBfRFBfVFhfTUFJTl9TVFJFQU1fTUlTQzBfQlBDX1NISUZUCTUKKyNkZWZpbmUgWllOUU1QX0RQ X1RYX01BSU5fU1RSRUFNX01JU0MxCQkJMHgxYTgKKyNkZWZpbmUgWllOUU1QX0RQX1RYX01BSU5f U1RSRUFNX01JU0MwX0lOVEVSTEFDRURfVkVSVAlCSVQoMCkKKyNkZWZpbmUgWllOUU1QX0RQX1RY X01BSU5fU1RSRUFNX01JU0MwX1NURVJFT19WSURfU0hJRlQJMQorI2RlZmluZSBaWU5RTVBfRFBf VFhfTV9WSUQJCQkJMHgxYWMKKyNkZWZpbmUgWllOUU1QX0RQX1RYX1RSQU5TRkVSX1VOSVRfU0la RQkJCTB4MWIwCisjZGVmaW5lIFpZTlFNUF9EUF9UWF9ERUZfVFJBTlNGRVJfVU5JVF9TSVpFCQk2 NAorI2RlZmluZSBaWU5RTVBfRFBfVFhfTl9WSUQJCQkJMHgxYjQKKyNkZWZpbmUgWllOUU1QX0RQ X1RYX1VTRVJfUElYRUxfV0lEVEgJCQkweDFiOAorI2RlZmluZSBaWU5RTVBfRFBfVFhfVVNFUl9E QVRBX0NOVF9QRVJfTEFORQkJMHgxYmMKKyNkZWZpbmUgWllOUU1QX0RQX1RYX01JTl9CWVRFU19Q RVJfVFUJCQkweDFjNAorI2RlZmluZSBaWU5RTVBfRFBfVFhfRlJBQ19CWVRFU19QRVJfVFUJCQkw eDFjOAorI2RlZmluZSBaWU5RTVBfRFBfVFhfSU5JVF9XQUlUCQkJCTB4MWNjCisKKy8qIFBIWSBj b25maWd1cmF0aW9uIGFuZCBzdGF0dXMgcmVnaXN0ZXJzICovCisjZGVmaW5lIFpZTlFNUF9EUF9U WF9QSFlfQ09ORklHCQkJCTB4MjAwCisjZGVmaW5lIFpZTlFNUF9EUF9UWF9QSFlfQ09ORklHX1BI WV9SRVNFVAkJQklUKDApCisjZGVmaW5lIFpZTlFNUF9EUF9UWF9QSFlfQ09ORklHX0dUVFhfUkVT RVQJCUJJVCgxKQorI2RlZmluZSBaWU5RTVBfRFBfVFhfUEhZX0NPTkZJR19QSFlfUE1BX1JFU0VU CQlCSVQoOCkKKyNkZWZpbmUgWllOUU1QX0RQX1RYX1BIWV9DT05GSUdfUEhZX1BDU19SRVNFVAkJ QklUKDkpCisjZGVmaW5lIFpZTlFNUF9EUF9UWF9QSFlfQ09ORklHX0FMTF9SRVNFVAkJKFpZTlFN UF9EUF9UWF9QSFlfQ09ORklHX1BIWV9SRVNFVCB8IFwKKwkJCQkJCQkgWllOUU1QX0RQX1RYX1BI WV9DT05GSUdfR1RUWF9SRVNFVCB8IFwKKwkJCQkJCQkgWllOUU1QX0RQX1RYX1BIWV9DT05GSUdf UEhZX1BNQV9SRVNFVCB8IFwKKwkJCQkJCQkgWllOUU1QX0RQX1RYX1BIWV9DT05GSUdfUEhZX1BD U19SRVNFVCkKKyNkZWZpbmUgWllOUU1QX0RQX1RYX1BIWV9QUkVFTVBIQVNJU19MQU5FXzAJCTB4 MjEwCisjZGVmaW5lIFpZTlFNUF9EUF9UWF9QSFlfUFJFRU1QSEFTSVNfTEFORV8xCQkweDIxNAor I2RlZmluZSBaWU5RTVBfRFBfVFhfUEhZX1BSRUVNUEhBU0lTX0xBTkVfMgkJMHgyMTgKKyNkZWZp bmUgWllOUU1QX0RQX1RYX1BIWV9QUkVFTVBIQVNJU19MQU5FXzMJCTB4MjFjCisjZGVmaW5lIFpZ TlFNUF9EUF9UWF9QSFlfVk9MVEFHRV9ESUZGX0xBTkVfMAkJMHgyMjAKKyNkZWZpbmUgWllOUU1Q X0RQX1RYX1BIWV9WT0xUQUdFX0RJRkZfTEFORV8xCQkweDIyNAorI2RlZmluZSBaWU5RTVBfRFBf VFhfUEhZX1ZPTFRBR0VfRElGRl9MQU5FXzIJCTB4MjI4CisjZGVmaW5lIFpZTlFNUF9EUF9UWF9Q SFlfVk9MVEFHRV9ESUZGX0xBTkVfMwkJMHgyMmMKKyNkZWZpbmUgWllOUU1QX0RQX1RYX1BIWV9D TE9DS19GRUVEQkFDS19TRVRUSU5HCQkweDIzNAorI2RlZmluZSBaWU5RTVBfRFBfVFhfUEhZX0NM T0NLX0ZFRURCQUNLX1NFVFRJTkdfMTYyCTB4MQorI2RlZmluZSBaWU5RTVBfRFBfVFhfUEhZX0NM T0NLX0ZFRURCQUNLX1NFVFRJTkdfMjcwCTB4MworI2RlZmluZSBaWU5RTVBfRFBfVFhfUEhZX0NM T0NLX0ZFRURCQUNLX1NFVFRJTkdfNTQwCTB4NQorI2RlZmluZSBaWU5RTVBfRFBfVFhfUEhZX1BP V0VSX0RPV04JCQkweDIzOAorI2RlZmluZSBaWU5RTVBfRFBfVFhfUEhZX1BPV0VSX0RPV05fTEFO RV8wCQlCSVQoMCkKKyNkZWZpbmUgWllOUU1QX0RQX1RYX1BIWV9QT1dFUl9ET1dOX0xBTkVfMQkJ QklUKDEpCisjZGVmaW5lIFpZTlFNUF9EUF9UWF9QSFlfUE9XRVJfRE9XTl9MQU5FXzIJCUJJVCgy KQorI2RlZmluZSBaWU5RTVBfRFBfVFhfUEhZX1BPV0VSX0RPV05fTEFORV8zCQlCSVQoMykKKyNk ZWZpbmUgWllOUU1QX0RQX1RYX1BIWV9QT1dFUl9ET1dOX0FMTAkJCTB4ZgorI2RlZmluZSBaWU5R TVBfRFBfVFhfUEhZX1BSRUNVUlNPUl9MQU5FXzAJCTB4MjNjCisjZGVmaW5lIFpZTlFNUF9EUF9U WF9QSFlfUFJFQ1VSU09SX0xBTkVfMQkJMHgyNDAKKyNkZWZpbmUgWllOUU1QX0RQX1RYX1BIWV9Q UkVDVVJTT1JfTEFORV8yCQkweDI0NAorI2RlZmluZSBaWU5RTVBfRFBfVFhfUEhZX1BSRUNVUlNP Ul9MQU5FXzMJCTB4MjQ4CisjZGVmaW5lIFpZTlFNUF9EUF9UWF9QSFlfUE9TVENVUlNPUl9MQU5F XzAJCTB4MjRjCisjZGVmaW5lIFpZTlFNUF9EUF9UWF9QSFlfUE9TVENVUlNPUl9MQU5FXzEJCTB4 MjUwCisjZGVmaW5lIFpZTlFNUF9EUF9UWF9QSFlfUE9TVENVUlNPUl9MQU5FXzIJCTB4MjU0Cisj ZGVmaW5lIFpZTlFNUF9EUF9UWF9QSFlfUE9TVENVUlNPUl9MQU5FXzMJCTB4MjU4CisjZGVmaW5l IFpZTlFNUF9EUF9TVUJfVFhfUEhZX1BSRUNVUlNPUl9MQU5FXzAJCTB4MjRjCisjZGVmaW5lIFpZ TlFNUF9EUF9TVUJfVFhfUEhZX1BSRUNVUlNPUl9MQU5FXzEJCTB4MjUwCisjZGVmaW5lIFpZTlFN UF9EUF9UWF9QSFlfU1RBVFVTCQkJCTB4MjgwCisjZGVmaW5lIFpZTlFNUF9EUF9UWF9QSFlfU1RB VFVTX1BMTF9MT0NLRURfU0hJRlQJNAorI2RlZmluZSBaWU5RTVBfRFBfVFhfUEhZX1NUQVRVU19G UEdBX1BMTF9MT0NLRUQJCUJJVCg2KQorCisvKiBBdWRpbyByZWdpc3RlcnMgKi8KKyNkZWZpbmUg WllOUU1QX0RQX1RYX0FVRElPX0NPTlRST0wJCQkweDMwMAorI2RlZmluZSBaWU5RTVBfRFBfVFhf QVVESU9fQ0hBTk5FTFMJCQkweDMwNAorI2RlZmluZSBaWU5RTVBfRFBfVFhfQVVESU9fSU5GT19E QVRBCQkJMHgzMDgKKyNkZWZpbmUgWllOUU1QX0RQX1RYX0FVRElPX01fQVVECQkJMHgzMjgKKyNk ZWZpbmUgWllOUU1QX0RQX1RYX0FVRElPX05fQVVECQkJMHgzMmMKKyNkZWZpbmUgWllOUU1QX0RQ X1RYX0FVRElPX0VYVF9EQVRBCQkJMHgzMzAKKworI2RlZmluZSBaWU5RTVBfRFBfTUlTQzBfUkdC CQkJCSgwKQorI2RlZmluZSBaWU5RTVBfRFBfTUlTQzBfWUNSQ0JfNDIyCQkJKDUgPDwgMSkKKyNk ZWZpbmUgWllOUU1QX0RQX01JU0MwX1lDUkNCXzQ0NAkJCSg2IDw8IDEpCisjZGVmaW5lIFpZTlFN UF9EUF9NSVNDMF9GT1JNQVRfTUFTSwkJCTB4ZQorI2RlZmluZSBaWU5RTVBfRFBfTUlTQzBfQlBD XzYJCQkJKDAgPDwgNSkKKyNkZWZpbmUgWllOUU1QX0RQX01JU0MwX0JQQ184CQkJCSgxIDw8IDUp CisjZGVmaW5lIFpZTlFNUF9EUF9NSVNDMF9CUENfMTAJCQkJKDIgPDwgNSkKKyNkZWZpbmUgWllO UU1QX0RQX01JU0MwX0JQQ18xMgkJCQkoMyA8PCA1KQorI2RlZmluZSBaWU5RTVBfRFBfTUlTQzBf QlBDXzE2CQkJCSg0IDw8IDUpCisjZGVmaW5lIFpZTlFNUF9EUF9NSVNDMF9CUENfTUFTSwkJCTB4 ZTAKKyNkZWZpbmUgWllOUU1QX0RQX01JU0MxX1lfT05MWQkJCQkoMSA8PCA3KQorCisjZGVmaW5l IFpZTlFNUF9EUF9NQVhfTEFORVMJCQkJMgorI2RlZmluZSBaWU5RTVBfTUFYX0ZSRVEJCQkJCTMw MDAwMDAKKworI2RlZmluZSBEUF9SRURVQ0VEX0JJVF9SQVRFCQkJCTE2MjAwMAorI2RlZmluZSBE UF9ISUdIX0JJVF9SQVRFCQkJCTI3MDAwMAorI2RlZmluZSBEUF9ISUdIX0JJVF9SQVRFMgkJCQk1 NDAwMDAKKyNkZWZpbmUgRFBfTUFYX1RSQUlOSU5HX1RSSUVTCQkJCTUKKyNkZWZpbmUgRFBfVjFf MgkJCQkJCTB4MTIKKworLyoqCisgKiBzdHJ1Y3QgenlucW1wX2RwX2xpbmtfY29uZmlnIC0gQ29t bW9uIGxpbmsgY29uZmlnIGJldHdlZW4gc291cmNlIGFuZCBzaW5rCisgKiBAbWF4X3JhdGU6IG1h eGltdW0gbGluayByYXRlCisgKiBAbWF4X2xhbmVzOiBtYXhpbXVtIG51bWJlciBvZiBsYW5lcwor ICovCitzdHJ1Y3QgenlucW1wX2RwX2xpbmtfY29uZmlnIHsKKwlpbnQgbWF4X3JhdGU7CisJdTgg bWF4X2xhbmVzOworfTsKKworLyoqCisgKiBzdHJ1Y3QgenlucW1wX2RwX21vZGUgLSBDb25maWd1 cmVkIG1vZGUgb2YgRGlzcGxheVBvcnQKKyAqIEBid19jb2RlOiBjb2RlIGZvciBiYW5kd2lkdGgo bGluayByYXRlKQorICogQGxhbmVfY250OiBudW1iZXIgb2YgbGFuZXMKKyAqIEBwY2xvY2s6IHBp eGVsIGNsb2NrIGZyZXF1ZW5jeSBvZiBjdXJyZW50IG1vZGUKKyAqIEBmbXQ6IGZvcm1hdCBpZGVu dGlmaWVyIHN0cmluZworICovCitzdHJ1Y3QgenlucW1wX2RwX21vZGUgeworCXU4IGJ3X2NvZGU7 CisJdTggbGFuZV9jbnQ7CisJaW50IHBjbG9jazsKKwljb25zdCBjaGFyICpmbXQ7Cit9OworCisv KioKKyAqIHN0cnVjdCB6eW5xbXBfZHBfY29uZmlnIC0gQ29uZmlndXJhdGlvbiBvZiBEaXNwbGF5 UG9ydCBmcm9tIERUUworICogQG1pc2MwOiBtaXNjMCBjb25maWd1cmF0aW9uIChwZXIgRFAgdjEu MiBzcGVjKQorICogQG1pc2MxOiBtaXNjMSBjb25maWd1cmF0aW9uIChwZXIgRFAgdjEuMiBzcGVj KQorICogQGJwcDogYml0cyBwZXIgcGl4ZWwKKyAqIEBicGM6IGJpdHMgcGVyIGNvbXBvbmVudAor ICogQG51bV9jb2xvcnM6IG51bWJlciBvZiBjb2xvciBjb21wb25lbnRzCisgKi8KK3N0cnVjdCB6 eW5xbXBfZHBfY29uZmlnIHsKKwl1OCBtaXNjMDsKKwl1OCBtaXNjMTsKKwl1OCBicHA7CisJdTgg YnBjOworCXU4IG51bV9jb2xvcnM7Cit9OworCisvKioKKyAqIHN0cnVjdCB6eW5xbXBfZHAgLSBY aWxpbnggRGlzcGxheVBvcnQgY29yZQorICogQGVuY29kZXI6IHRoZSBkcm0gZW5jb2RlciBzdHJ1 Y3R1cmUKKyAqIEBjb25uZWN0b3I6IHRoZSBkcm0gY29ubmVjdG9yIHN0cnVjdHVyZQorICogQGRl djogZGV2aWNlIHN0cnVjdHVyZQorICogQGRwc3ViOiBEaXNwbGF5IHN1YnN5c3RlbQorICogQGRy bTogRFJNIGNvcmUKKyAqIEBpb21lbTogZGV2aWNlIEkvTyBtZW1vcnkgZm9yIHJlZ2lzdGVyIGFj Y2VzcworICogQGlycTogaXJxCisgKiBAY29uZmlnOiBJUCBjb3JlIGNvbmZpZ3VyYXRpb24gZnJv bSBEVFMKKyAqIEBhdXg6IGF1eCBjaGFubmVsCisgKiBAcGh5OiBQSFkgaGFuZGxlcyBmb3IgRFAg bGFuZXMKKyAqIEBudW1fbGFuZXM6IG51bWJlciBvZiBlbmFibGVkIHBoeSBsYW5lcworICogQGhw ZF93b3JrOiBob3QgcGx1ZyBkZXRlY3Rpb24gd29ya2VyCisgKiBAc3RhdHVzOiBjb25uZWN0aW9u IHN0YXR1cworICogQGVuYWJsZWQ6IGZsYWcgdG8gaW5kaWNhdGUgaWYgdGhlIGRldmljZSBpcyBl bmFibGVkCisgKiBAZHBtczogY3VycmVudCBkcG1zIHN0YXRlCisgKiBAZHBjZDogRFAgY29uZmln dXJhdGlvbiBkYXRhIGZyb20gY3VycmVudGx5IGNvbm5lY3RlZCBzaW5rIGRldmljZQorICogQGxp bmtfY29uZmlnOiBjb21tb24gbGluayBjb25maWd1cmF0aW9uIGJldHdlZW4gSVAgY29yZSBhbmQg c2luayBkZXZpY2UKKyAqIEBtb2RlOiBjdXJyZW50IG1vZGUgYmV0d2VlbiBJUCBjb3JlIGFuZCBz aW5rIGRldmljZQorICogQHRyYWluX3NldDogc2V0IG9mIHRyYWluaW5nIGRhdGEKKyAqLworc3Ry dWN0IHp5bnFtcF9kcCB7CisJc3RydWN0IGRybV9lbmNvZGVyIGVuY29kZXI7CisJc3RydWN0IGRy bV9jb25uZWN0b3IgY29ubmVjdG9yOworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlzdHJ1Y3Qgenlu cW1wX2Rwc3ViICpkcHN1YjsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZHJtOworCXZvaWQgX19pb21l bSAqaW9tZW07CisJaW50IGlycTsKKworCXN0cnVjdCB6eW5xbXBfZHBfY29uZmlnIGNvbmZpZzsK KwlzdHJ1Y3QgZHJtX2RwX2F1eCBhdXg7CisJc3RydWN0IHBoeSAqcGh5W1pZTlFNUF9EUF9NQVhf TEFORVNdOworCXU4IG51bV9sYW5lczsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIGhwZF93b3JrOwor CWVudW0gZHJtX2Nvbm5lY3Rvcl9zdGF0dXMgc3RhdHVzOworCWJvb2wgZW5hYmxlZDsKKworCWlu dCBkcG1zOworCXU4IGRwY2RbRFBfUkVDRUlWRVJfQ0FQX1NJWkVdOworCXN0cnVjdCB6eW5xbXBf ZHBfbGlua19jb25maWcgbGlua19jb25maWc7CisJc3RydWN0IHp5bnFtcF9kcF9tb2RlIG1vZGU7 CisJdTggdHJhaW5fc2V0W1pZTlFNUF9EUF9NQVhfTEFORVNdOworfTsKKworc3RhdGljIGlubGlu ZSBzdHJ1Y3QgenlucW1wX2RwICplbmNvZGVyX3RvX2RwKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5j b2RlcikKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKGVuY29kZXIsIHN0cnVjdCB6eW5xbXBfZHAs IGVuY29kZXIpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCB6eW5xbXBfZHAgKmNvbm5lY3Rv cl90b19kcChzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQoreworCXJldHVybiBjb250 YWluZXJfb2YoY29ubmVjdG9yLCBzdHJ1Y3QgenlucW1wX2RwLCBjb25uZWN0b3IpOworfQorCitz dGF0aWMgdm9pZCB6eW5xbXBfZHBfd3JpdGUodm9pZCBfX2lvbWVtICpiYXNlLCBpbnQgb2Zmc2V0 LCB1MzIgdmFsKQoreworCXdyaXRlbCh2YWwsIGJhc2UgKyBvZmZzZXQpOworfQorCitzdGF0aWMg dTMyIHp5bnFtcF9kcF9yZWFkKHZvaWQgX19pb21lbSAqYmFzZSwgaW50IG9mZnNldCkKK3sKKwly ZXR1cm4gcmVhZGwoYmFzZSArIG9mZnNldCk7Cit9CisKK3N0YXRpYyB2b2lkIHp5bnFtcF9kcF9j bHIodm9pZCBfX2lvbWVtICpiYXNlLCBpbnQgb2Zmc2V0LCB1MzIgY2xyKQoreworCXp5bnFtcF9k cF93cml0ZShiYXNlLCBvZmZzZXQsIHp5bnFtcF9kcF9yZWFkKGJhc2UsIG9mZnNldCkgJiB+Y2xy KTsKK30KKworc3RhdGljIHZvaWQgenlucW1wX2RwX3NldCh2b2lkIF9faW9tZW0gKmJhc2UsIGlu dCBvZmZzZXQsIHUzMiBzZXQpCit7CisJenlucW1wX2RwX3dyaXRlKGJhc2UsIG9mZnNldCwgenlu cW1wX2RwX3JlYWQoYmFzZSwgb2Zmc2V0KSB8IHNldCk7Cit9CisKKy8qCisgKiBJbnRlcm5hbCBm dW5jdGlvbnM6IHVzZWQgYnkgenlucW1wX2Rpc3AuYworICovCisKKy8qKgorICogenlucW1wX2Rw X3VwZGF0ZV9icHAgLSBVcGRhdGUgdGhlIGN1cnJlbnQgYnBwIGNvbmZpZworICogQGRwOiBEaXNw bGF5UG9ydCBJUCBjb3JlIHN0cnVjdHVyZQorICoKKyAqIFVwZGF0ZSB0aGUgY3VycmVudCBicHAg YmFzZWQgb24gdGhlIGNvbG9yIGZvcm1hdDogYnBjICYgbnVtX2NvbG9ycy4KKyAqIEFueSBmdW5j dGlvbiB0aGF0IGNoYW5nZXMgYnBjIG9yIG51bV9jb2xvcnMgc2hvdWxkIGNhbGwgdGhpcworICog dG8ga2VlcCB0aGUgYnBwIHZhbHVlIGluIHN5bmMuCisgKi8KK3N0YXRpYyB2b2lkIHp5bnFtcF9k cF91cGRhdGVfYnBwKHN0cnVjdCB6eW5xbXBfZHAgKmRwKQoreworCXN0cnVjdCB6eW5xbXBfZHBf Y29uZmlnICpjb25maWcgPSAmZHAtPmNvbmZpZzsKKworCWNvbmZpZy0+YnBwID0gZHAtPmNvbmZp Zy5icGMgKiBkcC0+Y29uZmlnLm51bV9jb2xvcnM7Cit9CisKKy8qKgorICogenlucW1wX2RwX3Nl dF9jb2xvciAtIFNldCB0aGUgY29sb3IKKyAqIEBkcDogRGlzcGxheVBvcnQgSVAgY29yZSBzdHJ1 Y3R1cmUKKyAqIEBjb2xvcjogY29sb3Igc3RyaW5nLCBmcm9tIHp5bnFtcF9kaXNwX2NvbG9yX2Vu dW0KKyAqCisgKiBVcGRhdGUgbWlzYyByZWdpc3RlciB2YWx1ZXMgYmFzZWQgb24gQGNvbG9yIHN0 cmluZy4KKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2Vzcywgb3IgLUVJTlZBTC4KKyAqLworaW50 IHp5bnFtcF9kcF9zZXRfY29sb3Ioc3RydWN0IHp5bnFtcF9kcCAqZHAsIGNvbnN0IGNoYXIgKmNv bG9yKQoreworCXN0cnVjdCB6eW5xbXBfZHBfY29uZmlnICpjb25maWcgPSAmZHAtPmNvbmZpZzsK KworCWNvbmZpZy0+bWlzYzAgJj0gflpZTlFNUF9EUF9NSVNDMF9GT1JNQVRfTUFTSzsKKwljb25m aWctPm1pc2MxICY9IH5aWU5RTVBfRFBfTUlTQzFfWV9PTkxZOworCWlmIChzdHJjbXAoY29sb3Is ICJyZ2IiKSA9PSAwKSB7CisJCWNvbmZpZy0+bWlzYzAgfD0gWllOUU1QX0RQX01JU0MwX1JHQjsK KwkJY29uZmlnLT5udW1fY29sb3JzID0gMzsKKwl9IGVsc2UgaWYgKHN0cmNtcChjb2xvciwgInlj cmNiNDIyIikgPT0gMCkgeworCQljb25maWctPm1pc2MwIHw9IFpZTlFNUF9EUF9NSVNDMF9ZQ1JD Ql80MjI7CisJCWNvbmZpZy0+bnVtX2NvbG9ycyA9IDI7CisJfSBlbHNlIGlmIChzdHJjbXAoY29s b3IsICJ5Y3JjYjQ0NCIpID09IDApIHsKKwkJY29uZmlnLT5taXNjMCB8PSBaWU5RTVBfRFBfTUlT QzBfWUNSQ0JfNDQ0OworCQljb25maWctPm51bV9jb2xvcnMgPSAzOworCX0gZWxzZSBpZiAoc3Ry Y21wKGNvbG9yLCAieW9ubHkiKSA9PSAwKSB7CisJCWNvbmZpZy0+bWlzYzEgfD0gWllOUU1QX0RQ X01JU0MxX1lfT05MWTsKKwkJY29uZmlnLT5udW1fY29sb3JzID0gMTsKKwl9IGVsc2UgeworCQlk ZXZfZXJyKGRwLT5kZXYsICJJbnZhbGlkIGNvbG9ybWV0cnkgaW4gRFRcbiIpOworCQlyZXR1cm4g LUVJTlZBTDsKKwl9CisJenlucW1wX2RwX3VwZGF0ZV9icHAoZHApOworCisJcmV0dXJuIDA7Cit9 CisKKy8qKgorICogenlucW1wX2RwX2VuYWJsZV92YmxhbmsgLSBFbmFibGUgdmJsYW5rCisgKiBA ZHA6IERpc3BsYXlQb3J0IElQIGNvcmUgc3RydWN0dXJlCisgKgorICogRW5hYmxlIHZibGFuayBp bnRlcnJ1cHQKKyAqLwordm9pZCB6eW5xbXBfZHBfZW5hYmxlX3ZibGFuayhzdHJ1Y3QgenlucW1w X2RwICpkcCkKK3sKKwl6eW5xbXBfZHBfd3JpdGUoZHAtPmlvbWVtLCBaWU5RTVBfRFBfU1VCX1RY X0lOVFJfRU4sCisJCQlaWU5RTVBfRFBfVFhfSU5UUl9WQkxBTktfU1RBUlQpOworfQorCisvKioK KyAqIHp5bnFtcF9kcF9kaXNhYmxlX3ZibGFuayAtIERpc2FibGUgdmJsYW5rCisgKiBAZHA6IERp c3BsYXlQb3J0IElQIGNvcmUgc3RydWN0dXJlCisgKgorICogRGlzYWJsZSB2YmxhbmsgaW50ZXJy dXB0CisgKi8KK3ZvaWQgenlucW1wX2RwX2Rpc2FibGVfdmJsYW5rKHN0cnVjdCB6eW5xbXBfZHAg KmRwKQoreworCXp5bnFtcF9kcF93cml0ZShkcC0+aW9tZW0sIFpZTlFNUF9EUF9TVUJfVFhfSU5U Ul9EUywKKwkJCVpZTlFNUF9EUF9UWF9JTlRSX1ZCTEFOS19TVEFSVCk7Cit9CisKKy8qCisgKiBE UCBQSFkgZnVuY3Rpb25zCisgKi8KKworLyoqCisgKiB6eW5xbXBfZHBfaW5pdF9waHkgLSBJbml0 aWFsaXplIHRoZSBwaHkKKyAqIEBkcDogRGlzcGxheVBvcnQgSVAgY29yZSBzdHJ1Y3R1cmUKKyAq CisgKiBJbml0aWFsaXplIHRoZSBwaHkuCisgKgorICogUmV0dXJuOiAwIGlmIHRoZSBwaHkgaW5z dGFuY2VzIGFyZSBpbml0aWFsaXplZCBjb3JyZWN0bHksIG9yIHRoZSBlcnJvciBjb2RlCisgKiBy ZXR1cm5lZCBmcm9tIHRoZSBjYWxsZWUgZnVuY3Rpb25zLgorICovCitzdGF0aWMgaW50IHp5bnFt cF9kcF9pbml0X3BoeShzdHJ1Y3QgenlucW1wX2RwICpkcCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsK KwlpbnQgcmV0OworCisJZm9yIChpID0gMDsgaSA8IGRwLT5udW1fbGFuZXM7IGkrKykgeworCQly ZXQgPSBwaHlfaW5pdChkcC0+cGh5W2ldKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycihkcC0+ ZGV2LCAiZmFpbGVkIHRvIGluaXQgcGh5IGxhbmUgJWRcbiIsIGkpOworCQkJcmV0dXJuIHJldDsK KwkJfQorCX0KKworCXp5bnFtcF9kcF93cml0ZShkcC0+aW9tZW0sIFpZTlFNUF9EUF9TVUJfVFhf SU5UUl9EUywKKwkJCVpZTlFNUF9EUF9UWF9JTlRSX0FMTCk7CisJenlucW1wX2RwX2NscihkcC0+ aW9tZW0sIFpZTlFNUF9EUF9UWF9QSFlfQ09ORklHLAorCQkgICAgICBaWU5RTVBfRFBfVFhfUEhZ X0NPTkZJR19BTExfUkVTRVQpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogenlucW1wX2Rw X2V4aXRfcGh5IC0gRXhpdCB0aGUgcGh5CisgKiBAZHA6IERpc3BsYXlQb3J0IElQIGNvcmUgc3Ry dWN0dXJlCisgKgorICogRXhpdCB0aGUgcGh5LgorICovCitzdGF0aWMgdm9pZCB6eW5xbXBfZHBf ZXhpdF9waHkoc3RydWN0IHp5bnFtcF9kcCAqZHApCit7CisJdW5zaWduZWQgaW50IGk7CisJaW50 IHJldDsKKworCWZvciAoaSA9IDA7IGkgPCBkcC0+bnVtX2xhbmVzOyBpKyspIHsKKwkJcmV0ID0g cGh5X2V4aXQoZHAtPnBoeVtpXSk7CisJCWlmIChyZXQpCisJCQlkZXZfZXJyKGRwLT5kZXYsICJm YWlsZWQgdG8gZXhpdCBwaHkoJWQpICVkXG4iLCBpLCByZXQpOworCX0KK30KKworLyoqCisgKiB6 eW5xbXBfZHBfcGh5X3JlYWR5IC0gQ2hlY2sgaWYgUEhZIGlzIHJlYWR5CisgKiBAZHA6IERpc3Bs YXlQb3J0IElQIGNvcmUgc3RydWN0dXJlCisgKgorICogQ2hlY2sgaWYgUEhZIGlzIHJlYWR5LiBJ ZiBQSFkgaXMgbm90IHJlYWR5LCB3YWl0IDFtcyB0byBjaGVjayBmb3IgMTAwIHRpbWVzLgorICog VGhpcyBhbW91bnQgb2YgZGVsYXkgd2FzIHN1Z2dlc3RlZCBieSBJUCBkZXNpZ25lci4KKyAqCisg KiBSZXR1cm46IDAgaWYgUEhZIGlzIHJlYWR5LCBvciAtRU5PREVWIGlmIFBIWSBpcyBub3QgcmVh ZHkuCisgKi8KK3N0YXRpYyBpbnQgenlucW1wX2RwX3BoeV9yZWFkeShzdHJ1Y3QgenlucW1wX2Rw ICpkcCkKK3sKKwl1MzIgaSwgcmVnLCByZWFkeTsKKworCXJlYWR5ID0gKDEgPDwgZHAtPm51bV9s YW5lcykgLSAxOworCisJLyogV2FpdCBmb3IgMTAwICogMW1zLiBUaGlzIHNob3VsZCBiZSBlbm91 Z2ggdGltZSBmb3IgUEhZIHRvIGJlIHJlYWR5ICovCisJZm9yIChpID0gMDsgOyBpKyspIHsKKwkJ cmVnID0genlucW1wX2RwX3JlYWQoZHAtPmlvbWVtLCBaWU5RTVBfRFBfVFhfUEhZX1NUQVRVUyk7 CisJCWlmICgocmVnICYgcmVhZHkpID09IHJlYWR5KQorCQkJcmV0dXJuIDA7CisKKwkJaWYgKGkg PT0gMTAwKSB7CisJCQlkZXZfZXJyKGRwLT5kZXYsICJQSFkgaXNuJ3QgcmVhZHlcbiIpOworCQkJ cmV0dXJuIC1FTk9ERVY7CisJCX0KKworCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMTEwMCk7CisJfQor CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBEUCBmdW5jdGlvbnMKKyAqLworCisvKioKKyAqIHp5 bnFtcF9kcF9tYXhfcmF0ZSAtIENhbGN1bGF0ZSBhbmQgcmV0dXJuIGF2YWlsYWJsZSBtYXggcGl4 ZWwgY2xvY2sKKyAqIEBsaW5rX3JhdGU6IGxpbmsgcmF0ZSAoS2lsby1ieXRlcyAvIHNlYykKKyAq IEBsYW5lX251bTogbnVtYmVyIG9mIGxhbmVzCisgKiBAYnBwOiBiaXRzIHBlciBwaXhlbAorICoK KyAqIFJldHVybjogbWF4IHBpeGVsIGNsb2NrIChLSHopIHN1cHBvcnRlZCBieSBjdXJyZW50IGxp bmsgY29uZmlnLgorICovCitzdGF0aWMgaW5saW5lIGludCB6eW5xbXBfZHBfbWF4X3JhdGUoaW50 IGxpbmtfcmF0ZSwgdTggbGFuZV9udW0sIHU4IGJwcCkKK3sKKwlyZXR1cm4gbGlua19yYXRlICog bGFuZV9udW0gKiA4IC8gYnBwOworfQorCisvKioKKyAqIHp5bnFtcF9kcF9tb2RlX2NvbmZpZ3Vy ZSAtIENvbmZpZ3VyZSB0aGUgbGluayB2YWx1ZXMKKyAqIEBkcDogRGlzcGxheVBvcnQgSVAgY29y ZSBzdHJ1Y3R1cmUKKyAqIEBwY2xvY2s6IHBpeGVsIGNsb2NrIGZvciByZXF1ZXN0ZWQgZGlzcGxh eSBtb2RlCisgKiBAY3VycmVudF9idzogY3VycmVudCBsaW5rIHJhdGUKKyAqCisgKiBGaW5kIHRo ZSBsaW5rIGNvbmZpZ3VyYXRpb24gdmFsdWVzLCByYXRlIGFuZCBsYW5lIGNvdW50IGZvciByZXF1 ZXN0ZWQgcGl4ZWwKKyAqIGNsb2NrIEBwY2xvY2suIFRoZSBAcGNsb2NrIGlzIHN0b3JlZCBpbiB0 aGUgbW9kZSB0byBiZSB1c2VkIGluIG90aGVyCisgKiBmdW5jdGlvbnMgbGF0ZXIuIFRoZSByZXR1 cm5lZCByYXRlIGlzIGRvd25zaGlmdGVkIGZyb20gdGhlIGN1cnJlbnQgcmF0ZQorICogQGN1cnJl bnRfYncuCisgKgorICogUmV0dXJuOiBDdXJyZW50IGxpbmsgcmF0ZSBjb2RlLCBvciAtRUlOVkFM LgorICovCitzdGF0aWMgaW50IHp5bnFtcF9kcF9tb2RlX2NvbmZpZ3VyZShzdHJ1Y3QgenlucW1w X2RwICpkcCwgaW50IHBjbG9jaywKKwkJCQkgICAgdTggY3VycmVudF9idykKK3sKKwlpbnQgbWF4 X3JhdGUgPSBkcC0+bGlua19jb25maWcubWF4X3JhdGU7CisJdTggYndzWzNdID0geyBEUF9MSU5L X0JXXzFfNjIsIERQX0xJTktfQldfMl83LCBEUF9MSU5LX0JXXzVfNCB9OworCXU4IG1heF9sYW5l cyA9IGRwLT5saW5rX2NvbmZpZy5tYXhfbGFuZXM7CisJdTggbWF4X2xpbmtfcmF0ZV9jb2RlID0g ZHJtX2RwX2xpbmtfcmF0ZV90b19id19jb2RlKG1heF9yYXRlKTsKKwl1OCBicHAgPSBkcC0+Y29u ZmlnLmJwcDsKKwl1OCBsYW5lX2NudDsKKwlzOCBpOworCisJaWYgKGN1cnJlbnRfYncgPT0gRFBf TElOS19CV18xXzYyKSB7CisJCWRldl9lcnIoZHAtPmRldiwgImNhbid0IGRvd25zaGlmdC4gYWxy ZWFkeSBsb3dlc3QgbGluayByYXRlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZm9y IChpID0gQVJSQVlfU0laRShid3MpIC0gMTsgaSA+PSAwOyBpLS0pIHsKKwkJaWYgKGN1cnJlbnRf YncgJiYgYndzW2ldID49IGN1cnJlbnRfYncpCisJCQljb250aW51ZTsKKworCQlpZiAoYndzW2ld IDw9IG1heF9saW5rX3JhdGVfY29kZSkKKwkJCWJyZWFrOworCX0KKworCWZvciAobGFuZV9jbnQg PSAxOyBsYW5lX2NudCA8PSBtYXhfbGFuZXM7IGxhbmVfY250IDw8PSAxKSB7CisJCWludCBidzsK KwkJdTMyIHJhdGU7CisKKwkJYncgPSBkcm1fZHBfYndfY29kZV90b19saW5rX3JhdGUoYndzW2ld KTsKKwkJcmF0ZSA9IHp5bnFtcF9kcF9tYXhfcmF0ZShidywgbGFuZV9jbnQsIGJwcCk7CisJCWlm IChwY2xvY2sgPD0gcmF0ZSkgeworCQkJZHAtPm1vZGUuYndfY29kZSA9IGJ3c1tpXTsKKwkJCWRw LT5tb2RlLmxhbmVfY250ID0gbGFuZV9jbnQ7CisJCQlkcC0+bW9kZS5wY2xvY2sgPSBwY2xvY2s7 CisJCQlyZXR1cm4gZHAtPm1vZGUuYndfY29kZTsKKwkJfQorCX0KKworCWRldl9lcnIoZHAtPmRl diwgImZhaWxlZCB0byBjb25maWd1cmUgbGluayB2YWx1ZXNcbiIpOworCisJcmV0dXJuIC1FSU5W QUw7Cit9CisKKy8qKgorICogenlucW1wX2RwX2FkanVzdF90cmFpbiAtIEFkanVzdCB0cmFpbiB2 YWx1ZXMKKyAqIEBkcDogRGlzcGxheVBvcnQgSVAgY29yZSBzdHJ1Y3R1cmUKKyAqIEBsaW5rX3N0 YXR1czogbGluayBzdGF0dXMgZnJvbSBzaW5rIHdoaWNoIGNvbnRhaW5zIHJlcXVlc3RlZCB0cmFp bmluZyB2YWx1ZXMKKyAqLworc3RhdGljIHZvaWQgenlucW1wX2RwX2FkanVzdF90cmFpbihzdHJ1 Y3QgenlucW1wX2RwICpkcCwKKwkJCQkgICB1OCBsaW5rX3N0YXR1c1tEUF9MSU5LX1NUQVRVU19T SVpFXSkKK3sKKwl1OCAqdHJhaW5fc2V0ID0gZHAtPnRyYWluX3NldDsKKwl1OCB2b2x0YWdlID0g MCwgcHJlZW1waGFzaXMgPSAwOworCXU4IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZHAtPm1vZGUu bGFuZV9jbnQ7IGkrKykgeworCQl1OCB2ID0gZHJtX2RwX2dldF9hZGp1c3RfcmVxdWVzdF92b2x0 YWdlKGxpbmtfc3RhdHVzLCBpKTsKKwkJdTggcCA9IGRybV9kcF9nZXRfYWRqdXN0X3JlcXVlc3Rf cHJlX2VtcGhhc2lzKGxpbmtfc3RhdHVzLCBpKTsKKworCQlpZiAodiA+IHZvbHRhZ2UpCisJCQl2 b2x0YWdlID0gdjsKKworCQlpZiAocCA+IHByZWVtcGhhc2lzKQorCQkJcHJlZW1waGFzaXMgPSBw OworCX0KKworCWlmICh2b2x0YWdlID49IERQX1RSQUlOX1ZPTFRBR0VfU1dJTkdfTEVWRUxfMykK KwkJdm9sdGFnZSB8PSBEUF9UUkFJTl9NQVhfU1dJTkdfUkVBQ0hFRDsKKworCWlmIChwcmVlbXBo YXNpcyA+PSBEUF9UUkFJTl9QUkVfRU1QSF9MRVZFTF8yKQorCQlwcmVlbXBoYXNpcyB8PSBEUF9U UkFJTl9NQVhfUFJFX0VNUEhBU0lTX1JFQUNIRUQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgZHAtPm1v ZGUubGFuZV9jbnQ7IGkrKykKKwkJdHJhaW5fc2V0W2ldID0gdm9sdGFnZSB8IHByZWVtcGhhc2lz OworfQorCisvKioKKyAqIHp5bnFtcF9kcF91cGRhdGVfdnNfZW1waCAtIFVwZGF0ZSB0aGUgdHJh aW5pbmcgdmFsdWVzCisgKiBAZHA6IERpc3BsYXlQb3J0IElQIGNvcmUgc3RydWN0dXJlCisgKgor ICogVXBkYXRlIHRoZSB0cmFpbmluZyB2YWx1ZXMgYmFzZWQgb24gdGhlIHJlcXVlc3QgZnJvbSBz aW5rLiBUaGUgbWFwcGVkIHZhbHVlcworICogYXJlIHByZWRlZmluZWQsIGFuZCB2YWx1ZXModnMs IHBlLCBwYykgYXJlIGZyb20gdGhlIGRldmljZSBtYW51YWwuCisgKgorICogUmV0dXJuOiAwIGlm IHZzIGFuZCBlbXBoIGFyZSB1cGRhdGVkIHN1Y2Nlc3NmdWxseSwgb3IgdGhlIGVycm9yIGNvZGUg cmV0dXJuZWQKKyAqIGJ5IGRybV9kcF9kcGNkX3dyaXRlKCkuCisgKi8KK3N0YXRpYyBpbnQgenlu cW1wX2RwX3VwZGF0ZV92c19lbXBoKHN0cnVjdCB6eW5xbXBfZHAgKmRwKQoreworCXU4ICp0cmFp bl9zZXQgPSBkcC0+dHJhaW5fc2V0OworCXU4IGksIHZfbGV2ZWwsIHBfbGV2ZWw7CisJaW50IHJl dDsKKworCXJldCA9IGRybV9kcF9kcGNkX3dyaXRlKCZkcC0+YXV4LCBEUF9UUkFJTklOR19MQU5F MF9TRVQsIHRyYWluX3NldCwKKwkJCQlkcC0+bW9kZS5sYW5lX2NudCk7CisJaWYgKHJldCA8IDAp CisJCXJldHVybiByZXQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgZHAtPm1vZGUubGFuZV9jbnQ7IGkr KykgeworCQl1MzIgcmVnID0gWllOUU1QX0RQX1NVQl9UWF9QSFlfUFJFQ1VSU09SX0xBTkVfMCAr IGkgKiA0OworCisJCXZfbGV2ZWwgPSAodHJhaW5fc2V0W2ldICYgRFBfVFJBSU5fVk9MVEFHRV9T V0lOR19NQVNLKSA+PgorCQkJICBEUF9UUkFJTl9WT0xUQUdFX1NXSU5HX1NISUZUOworCQlwX2xl dmVsID0gKHRyYWluX3NldFtpXSAmIERQX1RSQUlOX1BSRV9FTVBIQVNJU19NQVNLKSA+PgorCQkJ ICBEUF9UUkFJTl9QUkVfRU1QSEFTSVNfU0hJRlQ7CisKKwkJenlucW1wX2RwX3dyaXRlKGRwLT5p b21lbSwgcmVnLCAweDIpOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIHp5bnFtcF9k cF9saW5rX3RyYWluX2NyIC0gVHJhaW4gY2xvY2sgcmVjb3ZlcnkKKyAqIEBkcDogRGlzcGxheVBv cnQgSVAgY29yZSBzdHJ1Y3R1cmUKKyAqCisgKiBSZXR1cm46IDAgaWYgY2xvY2sgcmVjb3Zlcnkg dHJhaW4gaXMgZG9uZSBzdWNjZXNzZnVsbHksIG9yIGNvcnJlc3BvbmRpbmcKKyAqIGVycm9yIGNv ZGUuCisgKi8KK3N0YXRpYyBpbnQgenlucW1wX2RwX2xpbmtfdHJhaW5fY3Ioc3RydWN0IHp5bnFt cF9kcCAqZHApCit7CisJdTggbGlua19zdGF0dXNbRFBfTElOS19TVEFUVVNfU0laRV07CisJdTgg bGFuZV9jbnQgPSBkcC0+bW9kZS5sYW5lX2NudDsKKwl1OCB2cyA9IDAsIHRyaWVzID0gMDsKKwl1 MTYgbWF4X3RyaWVzLCBpOworCWJvb2wgY3JfZG9uZTsKKwlpbnQgcmV0OworCisJenlucW1wX2Rw X3dyaXRlKGRwLT5pb21lbSwgWllOUU1QX0RQX1RYX1RSQUlOSU5HX1BBVFRFUk5fU0VULAorCQkJ RFBfVFJBSU5JTkdfUEFUVEVSTl8xKTsKKwlyZXQgPSBkcm1fZHBfZHBjZF93cml0ZWIoJmRwLT5h dXgsIERQX1RSQUlOSU5HX1BBVFRFUk5fU0VULAorCQkJCSBEUF9UUkFJTklOR19QQVRURVJOXzEg fAorCQkJCSBEUF9MSU5LX1NDUkFNQkxJTkdfRElTQUJMRSk7CisJaWYgKHJldCA8IDApCisJCXJl dHVybiByZXQ7CisKKwkvKgorCSAqIDI1NiBsb29wcyBzaG91bGQgYmUgbWF4aW11bSBpdGVyYXRp b25zIGZvciA0IGxhbmVzIGFuZCA0IHZhbHVlcy4KKwkgKiBTbywgVGhpcyBsb29wIHNob3VsZCBl eGl0IGJlZm9yZSA1MTIgaXRlcmF0aW9ucworCSAqLworCWZvciAobWF4X3RyaWVzID0gMDsgbWF4 X3RyaWVzIDwgNTEyOyBtYXhfdHJpZXMrKykgeworCQlyZXQgPSB6eW5xbXBfZHBfdXBkYXRlX3Zz X2VtcGgoZHApOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQlkcm1fZHBfbGlua190 cmFpbl9jbG9ja19yZWNvdmVyeV9kZWxheShkcC0+ZHBjZCk7CisJCXJldCA9IGRybV9kcF9kcGNk X3JlYWRfbGlua19zdGF0dXMoJmRwLT5hdXgsIGxpbmtfc3RhdHVzKTsKKwkJaWYgKHJldCA8IDAp CisJCQlyZXR1cm4gcmV0OworCisJCWNyX2RvbmUgPSBkcm1fZHBfY2xvY2tfcmVjb3Zlcnlfb2so bGlua19zdGF0dXMsIGxhbmVfY250KTsKKwkJaWYgKGNyX2RvbmUpCisJCQlicmVhazsKKworCQlm b3IgKGkgPSAwOyBpIDwgbGFuZV9jbnQ7IGkrKykKKwkJCWlmICghKGRwLT50cmFpbl9zZXRbaV0g JiBEUF9UUkFJTl9NQVhfU1dJTkdfUkVBQ0hFRCkpCisJCQkJYnJlYWs7CisJCWlmIChpID09IGxh bmVfY250KQorCQkJYnJlYWs7CisKKwkJaWYgKChkcC0+dHJhaW5fc2V0WzBdICYgRFBfVFJBSU5f Vk9MVEFHRV9TV0lOR19NQVNLKSA9PSB2cykKKwkJCXRyaWVzKys7CisJCWVsc2UKKwkJCXRyaWVz ID0gMDsKKworCQlpZiAodHJpZXMgPT0gRFBfTUFYX1RSQUlOSU5HX1RSSUVTKQorCQkJYnJlYWs7 CisKKwkJdnMgPSBkcC0+dHJhaW5fc2V0WzBdICYgRFBfVFJBSU5fVk9MVEFHRV9TV0lOR19NQVNL OworCQl6eW5xbXBfZHBfYWRqdXN0X3RyYWluKGRwLCBsaW5rX3N0YXR1cyk7CisJfQorCisJaWYg KCFjcl9kb25lKQorCQlyZXR1cm4gLUVJTzsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIHp5 bnFtcF9kcF9saW5rX3RyYWluX2NlIC0gVHJhaW4gY2hhbm5lbCBlcXVhbGl6YXRpb24KKyAqIEBk cDogRGlzcGxheVBvcnQgSVAgY29yZSBzdHJ1Y3R1cmUKKyAqCisgKiBSZXR1cm46IDAgaWYgY2hh bm5lbCBlcXVhbGl6YXRpb24gdHJhaW4gaXMgZG9uZSBzdWNjZXNzZnVsbHksIG9yCisgKiBjb3Jy ZXNwb25kaW5nIGVycm9yIGNvZGUuCisgKi8KK3N0YXRpYyBpbnQgenlucW1wX2RwX2xpbmtfdHJh aW5fY2Uoc3RydWN0IHp5bnFtcF9kcCAqZHApCit7CisJdTggbGlua19zdGF0dXNbRFBfTElOS19T VEFUVVNfU0laRV07CisJdTggbGFuZV9jbnQgPSBkcC0+bW9kZS5sYW5lX2NudDsKKwl1MzIgcGF0 LCB0cmllczsKKwlpbnQgcmV0OworCWJvb2wgY2VfZG9uZTsKKworCWlmIChkcC0+ZHBjZFtEUF9E UENEX1JFVl0gPj0gRFBfVjFfMiAmJgorCSAgICBkcC0+ZHBjZFtEUF9NQVhfTEFORV9DT1VOVF0g JiBEUF9UUFMzX1NVUFBPUlRFRCkKKwkJcGF0ID0gRFBfVFJBSU5JTkdfUEFUVEVSTl8zOworCWVs c2UKKwkJcGF0ID0gRFBfVFJBSU5JTkdfUEFUVEVSTl8yOworCisJenlucW1wX2RwX3dyaXRlKGRw LT5pb21lbSwgWllOUU1QX0RQX1RYX1RSQUlOSU5HX1BBVFRFUk5fU0VULCBwYXQpOworCXJldCA9 IGRybV9kcF9kcGNkX3dyaXRlYigmZHAtPmF1eCwgRFBfVFJBSU5JTkdfUEFUVEVSTl9TRVQsCisJ CQkJIHBhdCB8IERQX0xJTktfU0NSQU1CTElOR19ESVNBQkxFKTsKKwlpZiAocmV0IDwgMCkKKwkJ cmV0dXJuIHJldDsKKworCWZvciAodHJpZXMgPSAwOyB0cmllcyA8IERQX01BWF9UUkFJTklOR19U UklFUzsgdHJpZXMrKykgeworCQlyZXQgPSB6eW5xbXBfZHBfdXBkYXRlX3ZzX2VtcGgoZHApOwor CQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQlkcm1fZHBfbGlua190cmFpbl9jaGFubmVs X2VxX2RlbGF5KGRwLT5kcGNkKTsKKwkJcmV0ID0gZHJtX2RwX2RwY2RfcmVhZF9saW5rX3N0YXR1 cygmZHAtPmF1eCwgbGlua19zdGF0dXMpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7 CisKKwkJY2VfZG9uZSA9IGRybV9kcF9jaGFubmVsX2VxX29rKGxpbmtfc3RhdHVzLCBsYW5lX2Nu dCk7CisJCWlmIChjZV9kb25lKQorCQkJYnJlYWs7CisKKwkJenlucW1wX2RwX2FkanVzdF90cmFp bihkcCwgbGlua19zdGF0dXMpOworCX0KKworCWlmICghY2VfZG9uZSkKKwkJcmV0dXJuIC1FSU87 CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB6eW5xbXBfZHBfbGlua190cmFpbiAtIFRyYWlu IHRoZSBsaW5rCisgKiBAZHA6IERpc3BsYXlQb3J0IElQIGNvcmUgc3RydWN0dXJlCisgKgorICog UmV0dXJuOiAwIGlmIGFsbCB0cmFpbnMgYXJlIGRvbmUgc3VjY2Vzc2Z1bGx5LCBvciBjb3JyZXNw b25kaW5nIGVycm9yIGNvZGUuCisgKi8KK3N0YXRpYyBpbnQgenlucW1wX2RwX3RyYWluKHN0cnVj dCB6eW5xbXBfZHAgKmRwKQoreworCXUzMiByZWc7CisJdTggYndfY29kZSA9IGRwLT5tb2RlLmJ3 X2NvZGU7CisJdTggbGFuZV9jbnQgPSBkcC0+bW9kZS5sYW5lX2NudDsKKwl1OCBhdXhfbGFuZV9j bnQgPSBsYW5lX2NudDsKKwlib29sIGVuaGFuY2VkOworCWludCByZXQ7CisKKwl6eW5xbXBfZHBf d3JpdGUoZHAtPmlvbWVtLCBaWU5RTVBfRFBfVFhfTEFORV9DTlRfU0VULCBsYW5lX2NudCk7CisJ ZW5oYW5jZWQgPSBkcm1fZHBfZW5oYW5jZWRfZnJhbWVfY2FwKGRwLT5kcGNkKTsKKwlpZiAoZW5o YW5jZWQpIHsKKwkJenlucW1wX2RwX3dyaXRlKGRwLT5pb21lbSwgWllOUU1QX0RQX1RYX0VOSEFO Q0VEX0ZSQU1FX0VOLCAxKTsKKwkJYXV4X2xhbmVfY250IHw9IERQX0xBTkVfQ09VTlRfRU5IQU5D RURfRlJBTUVfRU47CisJfQorCisJaWYgKGRwLT5kcGNkWzNdICYgMHgxKSB7CisJCXp5bnFtcF9k cF93cml0ZShkcC0+aW9tZW0sIFpZTlFNUF9EUF9UWF9ET1dOU1BSRUFEX0NUTCwgMSk7CisJCWRy bV9kcF9kcGNkX3dyaXRlYigmZHAtPmF1eCwgRFBfRE9XTlNQUkVBRF9DVFJMLAorCQkJCSAgIERQ X1NQUkVBRF9BTVBfMF81KTsKKwl9IGVsc2UgeworCQl6eW5xbXBfZHBfd3JpdGUoZHAtPmlvbWVt LCBaWU5RTVBfRFBfVFhfRE9XTlNQUkVBRF9DVEwsIDApOworCQlkcm1fZHBfZHBjZF93cml0ZWIo JmRwLT5hdXgsIERQX0RPV05TUFJFQURfQ1RSTCwgMCk7CisJfQorCisJcmV0ID0gZHJtX2RwX2Rw Y2Rfd3JpdGViKCZkcC0+YXV4LCBEUF9MQU5FX0NPVU5UX1NFVCwgYXV4X2xhbmVfY250KTsKKwlp ZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGRwLT5kZXYsICJmYWlsZWQgdG8gc2V0IGxhbmUgY291 bnRcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IGRybV9kcF9kcGNkX3dyaXRlYigm ZHAtPmF1eCwgRFBfTUFJTl9MSU5LX0NIQU5ORUxfQ09ESU5HX1NFVCwKKwkJCQkgRFBfU0VUX0FO U0lfOEIxMEIpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZHAtPmRldiwgImZhaWxlZCB0 byBzZXQgQU5TSSA4Qi8xMEIgZW5jb2RpbmdcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJl dCA9IGRybV9kcF9kcGNkX3dyaXRlYigmZHAtPmF1eCwgRFBfTElOS19CV19TRVQsIGJ3X2NvZGUp OworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZHAtPmRldiwgImZhaWxlZCB0byBzZXQgRFAg YmFuZHdpZHRoXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwl6eW5xbXBfZHBfd3JpdGUoZHAt PmlvbWVtLCBaWU5RTVBfRFBfVFhfTElOS19CV19TRVQsIGJ3X2NvZGUpOworCXN3aXRjaCAoYndf Y29kZSkgeworCWNhc2UgRFBfTElOS19CV18xXzYyOgorCQlyZWcgPSBaWU5RTVBfRFBfVFhfUEhZ X0NMT0NLX0ZFRURCQUNLX1NFVFRJTkdfMTYyOworCQlicmVhazsKKwljYXNlIERQX0xJTktfQldf Ml83OgorCQlyZWcgPSBaWU5RTVBfRFBfVFhfUEhZX0NMT0NLX0ZFRURCQUNLX1NFVFRJTkdfMjcw OworCQlicmVhazsKKwljYXNlIERQX0xJTktfQldfNV80OgorCWRlZmF1bHQ6CisJCXJlZyA9IFpZ TlFNUF9EUF9UWF9QSFlfQ0xPQ0tfRkVFREJBQ0tfU0VUVElOR181NDA7CisJCWJyZWFrOworCX0K KworCXp5bnFtcF9kcF93cml0ZShkcC0+aW9tZW0sIFpZTlFNUF9EUF9UWF9QSFlfQ0xPQ0tfRkVF REJBQ0tfU0VUVElORywKKwkJCXJlZyk7CisJcmV0ID0genlucW1wX2RwX3BoeV9yZWFkeShkcCk7 CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwl6eW5xbXBfZHBfd3JpdGUoZHAtPmlv bWVtLCBaWU5RTVBfRFBfVFhfU0NSQU1CTElOR19ESVNBQkxFLCAxKTsKKwltZW1zZXQoZHAtPnRy YWluX3NldCwgMCwgNCk7CisJcmV0ID0genlucW1wX2RwX2xpbmtfdHJhaW5fY3IoZHApOworCWlm IChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSB6eW5xbXBfZHBfbGlua190cmFpbl9jZShk cCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGRybV9kcF9kcGNkX3dyaXRl YigmZHAtPmF1eCwgRFBfVFJBSU5JTkdfUEFUVEVSTl9TRVQsCisJCQkJIERQX1RSQUlOSU5HX1BB VFRFUk5fRElTQUJMRSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihkcC0+ZGV2LCAiZmFp bGVkIHRvIGRpc2FibGUgdHJhaW5pbmcgcGF0dGVyblxuIik7CisJCXJldHVybiByZXQ7CisJfQor CXp5bnFtcF9kcF93cml0ZShkcC0+aW9tZW0sIFpZTlFNUF9EUF9UWF9UUkFJTklOR19QQVRURVJO X1NFVCwKKwkJCURQX1RSQUlOSU5HX1BBVFRFUk5fRElTQUJMRSk7CisKKwl6eW5xbXBfZHBfd3Jp dGUoZHAtPmlvbWVtLCBaWU5RTVBfRFBfVFhfU0NSQU1CTElOR19ESVNBQkxFLCAwKTsKKworCXJl dHVybiAwOworfQorCisvKioKKyAqIHp5bnFtcF9kcF90cmFpbl9sb29wIC0gRG93bnNoaWZ0IHRo ZSBsaW5rIHJhdGUgZHVyaW5nIHRyYWluaW5nCisgKiBAZHA6IERpc3BsYXlQb3J0IElQIGNvcmUg c3RydWN0dXJlCisgKgorICogVHJhaW4gdGhlIGxpbmsgYnkgZG93bnNoaWZ0aW5nIHRoZSBsaW5r IHJhdGUgaWYgdHJhaW5pbmcgaXMgbm90IHN1Y2Nlc3NmdWwuCisgKi8KK3N0YXRpYyB2b2lkIHp5 bnFtcF9kcF90cmFpbl9sb29wKHN0cnVjdCB6eW5xbXBfZHAgKmRwKQoreworCXN0cnVjdCB6eW5x bXBfZHBfbW9kZSAqbW9kZSA9ICZkcC0+bW9kZTsKKwl1OCBidyA9IG1vZGUtPmJ3X2NvZGU7CisJ aW50IHJldDsKKworCWRvIHsKKwkJaWYgKGRwLT5zdGF0dXMgPT0gY29ubmVjdG9yX3N0YXR1c19k aXNjb25uZWN0ZWQgfHwKKwkJICAgICFkcC0+ZW5hYmxlZCkKKwkJCXJldHVybjsKKworCQlyZXQg PSB6eW5xbXBfZHBfdHJhaW4oZHApOworCQlpZiAoIXJldCkKKwkJCXJldHVybjsKKworCQlyZXQg PSB6eW5xbXBfZHBfbW9kZV9jb25maWd1cmUoZHAsIG1vZGUtPnBjbG9jaywgYncpOworCQlpZiAo cmV0IDwgMCkKKwkJCWdvdG8gZXJyX291dDsKKworCQlidyA9IHJldDsKKwl9IHdoaWxlIChidyA+ PSBEUF9MSU5LX0JXXzFfNjIpOworCitlcnJfb3V0OgorCWRldl9lcnIoZHAtPmRldiwgImZhaWxl ZCB0byB0cmFpbiB0aGUgRFAgbGlua1xuIik7Cit9CisKKy8qCisgKiBEUCBBdXggZnVuY3Rpb25z CisgKi8KKworI2RlZmluZSBBVVhfUkVBRF9CSVQJMHgxCisKKy8qKgorICogenlucW1wX2RwX2F1 eF9jbWRfc3VibWl0IC0gU3VibWl0IGF1eCBjb21tYW5kCisgKiBAZHA6IERpc3BsYXlQb3J0IElQ IGNvcmUgc3RydWN0dXJlCisgKiBAY21kOiBhdXggY29tbWFuZAorICogQGFkZHI6IGF1eCBhZGRy ZXNzCisgKiBAYnVmOiBidWZmZXIgZm9yIGNvbW1hbmQgZGF0YQorICogQGJ5dGVzOiBudW1iZXIg b2YgYnl0ZXMgZm9yIEBidWYKKyAqIEByZXBseTogcmVwbHkgY29kZSB0byBiZSByZXR1cm5lZAor ICoKKyAqIFN1Ym1pdCBhbiBhdXggY29tbWFuZC4gQWxsIGF1eCByZWxhdGVkIGNvbW1hbmRzLCBu YXRpdmUgb3IgaTJjIGF1eAorICogcmVhZC93cml0ZSwgYXJlIHN1Ym1pdHRlZCB0aHJvdWdoIHRo aXMgZnVuY3Rpb24uIFRoZSBmdW5jdGlvbiBpcyBtYXBwZWQgdG8KKyAqIHRoZSB0cmFuc2ZlciBm dW5jdGlvbiBvZiBzdHJ1Y3QgZHJtX2RwX2F1eC4gVGhpcyBmdW5jdGlvbiBpbnZvbHZlcyBpbgor ICogbXVsdGlwbGUgcmVnaXN0ZXIgcmVhZHMvd3JpdGVzLCB0aHVzIHN5bmNocm9uaXphdGlvbiBp cyBuZWVkZWQsIGFuZCBpdCBpcworICogZG9uZSBieSBkcm1fZHBfaGVscGVyIHVzaW5nIEBod19t dXRleC4gVGhlIGNhbGxpbmcgdGhyZWFkIGdvZXMgaW50byBzbGVlcAorICogaWYgdGhlcmUncyBu byBpbW1lZGlhdGUgcmVwbHkgdG8gdGhlIGNvbW1hbmQgc3VibWlzc2lvbi4gVGhlIHJlcGx5IGNv ZGUgaXMKKyAqIHJldHVybmVkIGF0IEByZXBseSBpZiBAcmVwbHkgIT0gTlVMTC4KKyAqCisgKiBS ZXR1cm46IDAgaWYgdGhlIGNvbW1hbmQgaXMgc3VibWl0dGVkIHByb3Blcmx5LCBvciBjb3JyZXNw b25kaW5nIGVycm9yIGNvZGU6CisgKiAtRUJVU1kgd2hlbiB0aGVyZSBpcyBhbnkgcmVxdWVzdCBh bHJlYWR5IGJlaW5nIHByb2Nlc3NlZAorICogLUVUSU1FRE9VVCB3aGVuIHJlY2VpdmluZyByZXBs eSBpcyB0aW1lZCBvdXQKKyAqIC1FSU8gd2hlbiByZWNlaXZlZCBieXRlcyBhcmUgbGVzcyB0aGFu IHJlcXVlc3RlZAorICovCitzdGF0aWMgaW50IHp5bnFtcF9kcF9hdXhfY21kX3N1Ym1pdChzdHJ1 Y3QgenlucW1wX2RwICpkcCwgdTMyIGNtZCwgdTE2IGFkZHIsCisJCQkJICAgIHU4ICpidWYsIHU4 IGJ5dGVzLCB1OCAqcmVwbHkpCit7CisJYm9vbCBpc19yZWFkID0gKGNtZCAmIEFVWF9SRUFEX0JJ VCkgPyB0cnVlIDogZmFsc2U7CisJdm9pZCBfX2lvbWVtICppb21lbSA9IGRwLT5pb21lbTsKKwl1 MzIgcmVnLCBpOworCisJcmVnID0genlucW1wX2RwX3JlYWQoaW9tZW0sIFpZTlFNUF9EUF9UWF9J TlRSX1NJR05BTF9TVEFURSk7CisJaWYgKHJlZyAmIFpZTlFNUF9EUF9UWF9JTlRSX1NJR05BTF9T VEFURV9SRVFVRVNUKQorCQlyZXR1cm4gLUVCVVNZOworCisJenlucW1wX2RwX3dyaXRlKGlvbWVt LCBaWU5RTVBfRFBfVFhfQVVYX0FERFJFU1MsIGFkZHIpOworCWlmICghaXNfcmVhZCkKKwkJZm9y IChpID0gMDsgaSA8IGJ5dGVzOyBpKyspCisJCQl6eW5xbXBfZHBfd3JpdGUoaW9tZW0sIFpZTlFN UF9EUF9UWF9BVVhfV1JJVEVfRklGTywKKwkJCQkJYnVmW2ldKTsKKworCXJlZyA9IGNtZCA8PCBa WU5RTVBfRFBfVFhfQVVYX0NPTU1BTkRfQ01EX1NISUZUOworCWlmICghYnVmIHx8ICFieXRlcykK KwkJcmVnIHw9IFpZTlFNUF9EUF9UWF9BVVhfQ09NTUFORF9BRERSRVNTX09OTFk7CisJZWxzZQor CQlyZWcgfD0gKGJ5dGVzIC0gMSkgPDwgWllOUU1QX0RQX1RYX0FVWF9DT01NQU5EX0JZVEVTX1NI SUZUOworCXp5bnFtcF9kcF93cml0ZShpb21lbSwgWllOUU1QX0RQX1RYX0FVWF9DT01NQU5ELCBy ZWcpOworCisJLyogV2FpdCBmb3IgcmVwbHkgdG8gYmUgZGVsaXZlcmVkIHVwdG8gMm1zICovCisJ Zm9yIChpID0gMDsgOyBpKyspIHsKKwkJcmVnID0genlucW1wX2RwX3JlYWQoaW9tZW0sIFpZTlFN UF9EUF9UWF9JTlRSX1NJR05BTF9TVEFURSk7CisJCWlmIChyZWcgJiBaWU5RTVBfRFBfVFhfSU5U Ul9TSUdOQUxfU1RBVEVfUkVQTFkpCisJCQlicmVhazsKKworCQlpZiAocmVnICYgWllOUU1QX0RQ X1RYX0lOVFJfU0lHTkFMX1NUQVRFX1JFUExZX1RJTUVPVVQgfHwKKwkJICAgIGkgPT0gMikKKwkJ CXJldHVybiAtRVRJTUVET1VUOworCisJCXVzbGVlcF9yYW5nZSgxMDAwLCAxMTAwKTsKKwl9CisK KwlyZWcgPSB6eW5xbXBfZHBfcmVhZChpb21lbSwgWllOUU1QX0RQX1RYX0FVWF9SRVBMWV9DT0RF KTsKKwlpZiAocmVwbHkpCisJCSpyZXBseSA9IHJlZzsKKworCWlmIChpc19yZWFkICYmCisJICAg IChyZWcgPT0gWllOUU1QX0RQX1RYX0FVWF9SRVBMWV9DT0RFX0FVWF9BQ0sgfHwKKwkgICAgIHJl ZyA9PSBaWU5RTVBfRFBfVFhfQVVYX1JFUExZX0NPREVfSTJDX0FDSykpIHsKKwkJcmVnID0genlu cW1wX2RwX3JlYWQoaW9tZW0sIFpZTlFNUF9EUF9UWF9SRVBMWV9EQVRBX0NOVCk7CisJCWlmICgo cmVnICYgWllOUU1QX0RQX1RYX0FVWF9SRVBMWV9DTlRfTUFTSykgIT0gYnl0ZXMpCisJCQlyZXR1 cm4gLUVJTzsKKworCQlmb3IgKGkgPSAwOyBpIDwgYnl0ZXM7IGkrKykgeworCQkJYnVmW2ldID0g enlucW1wX2RwX3JlYWQoaW9tZW0sCisJCQkJCQlaWU5RTVBfRFBfVFhfQVVYX1JFUExZX0RBVEEp OworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90Cit6eW5xbXBfZHBf YXV4X3RyYW5zZmVyKHN0cnVjdCBkcm1fZHBfYXV4ICphdXgsIHN0cnVjdCBkcm1fZHBfYXV4X21z ZyAqbXNnKQoreworCXN0cnVjdCB6eW5xbXBfZHAgKmRwID0gY29udGFpbmVyX29mKGF1eCwgc3Ry dWN0IHp5bnFtcF9kcCwgYXV4KTsKKwlpbnQgcmV0OworCXVuc2lnbmVkIGludCBpLCBpdGVyOwor CisJLyogTnVtYmVyIG9mIGxvb3BzID0gdGltZW91dCBpbiBtc2VjIC8gYXV4IGRlbGF5ICg0MDAg dXNlYykgKi8KKwlpdGVyID0genlucW1wX2RwX2F1eF90aW1lb3V0X21zICogMTAwMCAvIDQwMDsK KwlpdGVyID0gaXRlciA/IGl0ZXIgOiAxOworCisJZm9yIChpID0gMDsgaSA8IGl0ZXI7IGkrKykg eworCQlyZXQgPSB6eW5xbXBfZHBfYXV4X2NtZF9zdWJtaXQoZHAsIG1zZy0+cmVxdWVzdCwgbXNn LT5hZGRyZXNzLAorCQkJCQkgICAgICAgbXNnLT5idWZmZXIsIG1zZy0+c2l6ZSwKKwkJCQkJICAg ICAgICZtc2ctPnJlcGx5KTsKKwkJaWYgKCFyZXQpIHsKKwkJCWRldl9kYmcoZHAtPmRldiwgImF1 eCAlZCByZXRyaWVzXG4iLCBpKTsKKwkJCXJldHVybiBtc2ctPnNpemU7CisJCX0KKworCQlpZiAo ZHAtPnN0YXR1cyA9PSBjb25uZWN0b3Jfc3RhdHVzX2Rpc2Nvbm5lY3RlZCkgeworCQkJZGV2X2Ri ZyhkcC0+ZGV2LCAibm8gY29ubmVjdGVkIGF1eCBkZXZpY2VcbiIpOworCQkJcmV0dXJuIC1FTk9E RVY7CisJCX0KKworCQl1c2xlZXBfcmFuZ2UoNDAwLCA1MDApOworCX0KKworCWRldl9kYmcoZHAt PmRldiwgImZhaWxlZCB0byBkbyBhdXggdHJhbnNmZXIgKCVkKVxuIiwgcmV0KTsKKworCXJldHVy biByZXQ7Cit9CisKKy8qKgorICogenlucW1wX2RwX2luaXRfYXV4IC0gSW5pdGlhbGl6ZSB0aGUg RFAgYXV4CisgKiBAZHA6IERpc3BsYXlQb3J0IElQIGNvcmUgc3RydWN0dXJlCisgKgorICogSW5p dGlhbGl6ZSB0aGUgRFAgYXV4LiBUaGUgYXV4IGNsb2NrIGlzIGRlcml2ZWQgZnJvbSB0aGUgYXhp IGNsb2NrLCBzbworICogdGhpcyBmdW5jdGlvbiBnZXRzIHRoZSBheGkgY2xvY2sgZnJlcXVlbmN5 IGFuZCBjYWxjdWxhdGVzIHRoZSBmaWx0ZXIKKyAqIHZhbHVlLiBBZGRpdGlvbmFsbHksIHRoZSBp bnRlcnJ1cHRzIGFuZCB0cmFuc21pdHRlciBhcmUgZW5hYmxlZC4KKyAqCisgKiBSZXR1cm46IDAg b24gc3VjY2VzcywgZXJyb3IgdmFsdWUgb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbnQgenlucW1w X2RwX2luaXRfYXV4KHN0cnVjdCB6eW5xbXBfZHAgKmRwKQoreworCXVuc2lnbmVkIGludCByYXRl OworCXUzMiByZWcsIHc7CisKKwlyYXRlID0genlucW1wX2Rpc3BfZ2V0X2FwYl9jbGtfcmF0ZShk cC0+ZHBzdWItPmRpc3ApOworCWlmIChyYXRlIDwgWllOUU1QX0RQX1RYX0NMS19ESVZJREVSX01I WikgeworCQlkZXZfZXJyKGRwLT5kZXYsICJhY2xrIHNob3VsZCBiZSBoaWdoZXIgdGhhbiAxTUh6 XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogQWxsb3dhYmxlIHZhbHVlcyBmb3Ig dGhpcyByZWdpc3RlciBhcmU6IDgsIDE2LCAyNCwgMzIsIDQwLCA0OCAqLworCWZvciAodyA9IDg7 IHcgPD0gNDg7IHcgKz0gOCkgeworCQkvKiBBVVggcHVsc2Ugd2lkdGggc2hvdWxkIGJlIGJldHdl ZW4gMC40IHRvIDAuNiB1c2VjICovCisJCWlmICh3ID49ICg0ICogcmF0ZSAvIDEwMDAwMDAwKSAm JgorCQkgICAgdyA8PSAoNiAqIHJhdGUgLyAxMDAwMDAwMCkpCisJCQlicmVhazsKKwl9CisKKwlp ZiAodyA+IDQ4KSB7CisJCWRldl9lcnIoZHAtPmRldiwgImFjbGsgZnJlcXVlbmN5IHRvbyBoaWdo XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJlZyA9IHcgPDwgWllOUU1QX0RQX1RYX0NM S19ESVZJREVSX0FVWF9GSUxURVJfU0hJRlQ7CisJcmVnIHw9IHJhdGUgLyBaWU5RTVBfRFBfVFhf Q0xLX0RJVklERVJfTUhaOworCXp5bnFtcF9kcF93cml0ZShkcC0+aW9tZW0sIFpZTlFNUF9EUF9U WF9DTEtfRElWSURFUiwgcmVnKTsKKwl6eW5xbXBfZHBfd3JpdGUoZHAtPmlvbWVtLCBaWU5RTVBf RFBfU1VCX1RYX0lOVFJfRU4sCisJCQlaWU5RTVBfRFBfVFhfSU5UUl9BTEwpOworCXp5bnFtcF9k cF93cml0ZShkcC0+aW9tZW0sIFpZTlFNUF9EUF9TVUJfVFhfSU5UUl9EUywKKwkJCVpZTlFNUF9E UF9UWF9OT19JTlRSX0FMTCk7CisJenlucW1wX2RwX3dyaXRlKGRwLT5pb21lbSwgWllOUU1QX0RQ X1RYX0VOQUJMRSwgMSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB6eW5xbXBfZHBfZXhp dF9hdXggLSBEZS1pbml0aWFsaXplIHRoZSBEUCBhdXgKKyAqIEBkcDogRGlzcGxheVBvcnQgSVAg Y29yZSBzdHJ1Y3R1cmUKKyAqCisgKiBEZS1pbml0aWFsaXplIHRoZSBEUCBhdXguIERpc2FibGUg YWxsIGludGVycnVwdHMgd2hpY2ggYXJlIGVuYWJsZWQKKyAqIHRocm91Z2ggYXV4IGluaXRpYWxp emF0aW9uLCBhcyB3ZWxsIGFzIHRoZSB0cmFuc21pdHRlci4KKyAqLworc3RhdGljIHZvaWQgenlu cW1wX2RwX2V4aXRfYXV4KHN0cnVjdCB6eW5xbXBfZHAgKmRwKQoreworCXp5bnFtcF9kcF93cml0 ZShkcC0+aW9tZW0sIFpZTlFNUF9EUF9UWF9FTkFCTEUsIDApOworCXp5bnFtcF9kcF93cml0ZShk cC0+aW9tZW0sIFpZTlFNUF9EUF9TVUJfVFhfSU5UUl9EUywgMHhmZmZmZmZmZik7Cit9CisKKy8q CisgKiBHZW5lcmljIERQIGZ1bmN0aW9ucworICovCisKKy8qKgorICogenlucW1wX2RwX3VwZGF0 ZV9taXNjIC0gV3JpdGUgdGhlIG1pc2MgcmVnaXN0ZXJzCisgKiBAZHA6IERpc3BsYXlQb3J0IElQ IGNvcmUgc3RydWN0dXJlCisgKgorICogVGhlIG1pc2MgcmVnaXN0ZXIgdmFsdWVzIGFyZSBzdG9y ZWQgaW4gdGhlIHN0cnVjdHVyZSwgYW5kIHRoaXMKKyAqIGZ1bmN0aW9uIGFwcGxpZXMgdGhlIHZh bHVlcyBpbnRvIHRoZSByZWdpc3RlcnMuCisgKi8KK3N0YXRpYyB2b2lkIHp5bnFtcF9kcF91cGRh dGVfbWlzYyhzdHJ1Y3QgenlucW1wX2RwICpkcCkKK3sKKwl6eW5xbXBfZHBfd3JpdGUoZHAtPmlv bWVtLCBaWU5RTVBfRFBfVFhfTUFJTl9TVFJFQU1fTUlTQzAsCisJCQlkcC0+Y29uZmlnLm1pc2Mw KTsKKwl6eW5xbXBfZHBfd3JpdGUoZHAtPmlvbWVtLCBaWU5RTVBfRFBfVFhfTUFJTl9TVFJFQU1f TUlTQzEsCisJCQlkcC0+Y29uZmlnLm1pc2MxKTsKK30KKworLyoqCisgKiB6eW5xbXBfZHBfc2V0 X2JwYyAtIFNldCBicGMgdmFsdWUgaW4gc29mdHdhcmUgbWlzYyBzdGF0ZQorICogQGRwOiBEaXNw bGF5UG9ydCBJUCBjb3JlIHN0cnVjdHVyZQorICogQGJwYzogYml0cyBwZXIgY29tcG9uZW50Cisg KgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIG9yIHRoZSBmYWxsYmFjayBicGMgdmFsdWUKKyAq Lworc3RhdGljIHU4IHp5bnFtcF9kcF9zZXRfYnBjKHN0cnVjdCB6eW5xbXBfZHAgKmRwLCB1OCBi cGMpCit7CisJc3RydWN0IHp5bnFtcF9kcF9jb25maWcgKmNvbmZpZyA9ICZkcC0+Y29uZmlnOwor CXU4IHJldCA9IDA7CisKKwlpZiAoZHAtPmNvbm5lY3Rvci5kaXNwbGF5X2luZm8uYnBjICYmCisJ ICAgIGRwLT5jb25uZWN0b3IuZGlzcGxheV9pbmZvLmJwYyAhPSBicGMpIHsKKwkJZGV2X2Vycihk cC0+ZGV2LCAicmVxdWVzdGVkIGJwYyAoJXUpICE9IGRpc3BsYXkgaW5mbyAoJXUpXG4iLAorCQkJ YnBjLCBkcC0+Y29ubmVjdG9yLmRpc3BsYXlfaW5mby5icGMpOworCQlicGMgPSBkcC0+Y29ubmVj dG9yLmRpc3BsYXlfaW5mby5icGM7CisJfQorCisJY29uZmlnLT5taXNjMCAmPSB+WllOUU1QX0RQ X01JU0MwX0JQQ19NQVNLOworCXN3aXRjaCAoYnBjKSB7CisJY2FzZSA2OgorCQljb25maWctPm1p c2MwIHw9IFpZTlFNUF9EUF9NSVNDMF9CUENfNjsKKwkJYnJlYWs7CisJY2FzZSA4OgorCQljb25m aWctPm1pc2MwIHw9IFpZTlFNUF9EUF9NSVNDMF9CUENfODsKKwkJYnJlYWs7CisJY2FzZSAxMDoK KwkJY29uZmlnLT5taXNjMCB8PSBaWU5RTVBfRFBfTUlTQzBfQlBDXzEwOworCQlicmVhazsKKwlj YXNlIDEyOgorCQljb25maWctPm1pc2MwIHw9IFpZTlFNUF9EUF9NSVNDMF9CUENfMTI7CisJCWJy ZWFrOworCWNhc2UgMTY6CisJCWNvbmZpZy0+bWlzYzAgfD0gWllOUU1QX0RQX01JU0MwX0JQQ18x NjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2VycihkcC0+ZGV2LCAiTm90IHN1cHBvcnRl ZCBicGMgKCV1KS4gZmFsbCBiYWNrIHRvIDhicGNcbiIsCisJCQlicGMpOworCQljb25maWctPm1p c2MwIHw9IFpZTlFNUF9EUF9NSVNDMF9CUENfODsKKwkJcmV0ID0gODsKKwkJYnJlYWs7CisJfQor CWNvbmZpZy0+YnBjID0gYnBjOworCXp5bnFtcF9kcF91cGRhdGVfYnBwKGRwKTsKKworCXJldHVy biByZXQ7Cit9CisKKy8qKgorICogenlucW1wX2RwX2VuY29kZXJfbW9kZV9zZXRfdHJhbnNmZXJf dW5pdCAtIFNldCB0aGUgdHJhbnNmZXIgdW5pdCB2YWx1ZXMKKyAqIEBkcDogRGlzcGxheVBvcnQg SVAgY29yZSBzdHJ1Y3R1cmUKKyAqIEBtb2RlOiByZXF1ZXN0ZWQgZGlzcGxheSBtb2RlCisgKgor ICogU2V0IHRoZSB0cmFuc2ZlciB1bml0LCBhbmQgY2FjdWxhdGUgYWxsIHRyYW5zZmVyIHVuaXQg c2l6ZSByZWxhdGVkIHZhbHVlcy4KKyAqIENhbGN1bGF0aW9uIGlzIGJhc2VkIG9uIERQIGFuZCBJ UCBjb3JlIHNwZWNpZmljYXRpb24uCisgKi8KK3N0YXRpYyB2b2lkCit6eW5xbXBfZHBfZW5jb2Rl cl9tb2RlX3NldF90cmFuc2Zlcl91bml0KHN0cnVjdCB6eW5xbXBfZHAgKmRwLAorCQkJCQkgc3Ry dWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUpCit7CisJdTMyIHR1ID0gWllOUU1QX0RQX1RYX0RF Rl9UUkFOU0ZFUl9VTklUX1NJWkU7CisJdTMyIGJ3LCB2aWRfa2J5dGVzLCBhdmdfYnl0ZXNfcGVy X3R1LCBpbml0X3dhaXQ7CisKKwkvKiBVc2UgdGhlIG1heCB0cmFuc2ZlciB1bml0IHNpemUgKGRl ZmF1bHQpICovCisJenlucW1wX2RwX3dyaXRlKGRwLT5pb21lbSwgWllOUU1QX0RQX1RYX1RSQU5T RkVSX1VOSVRfU0laRSwgdHUpOworCisJdmlkX2tieXRlcyA9IG1vZGUtPmNsb2NrICogKGRwLT5j b25maWcuYnBwIC8gOCk7CisJYncgPSBkcm1fZHBfYndfY29kZV90b19saW5rX3JhdGUoZHAtPm1v ZGUuYndfY29kZSk7CisJYXZnX2J5dGVzX3Blcl90dSA9IHZpZF9rYnl0ZXMgKiB0dSAvIChkcC0+ bW9kZS5sYW5lX2NudCAqIGJ3IC8gMTAwMCk7CisJenlucW1wX2RwX3dyaXRlKGRwLT5pb21lbSwg WllOUU1QX0RQX1RYX01JTl9CWVRFU19QRVJfVFUsCisJCQlhdmdfYnl0ZXNfcGVyX3R1IC8gMTAw MCk7CisJenlucW1wX2RwX3dyaXRlKGRwLT5pb21lbSwgWllOUU1QX0RQX1RYX0ZSQUNfQllURVNf UEVSX1RVLAorCQkJYXZnX2J5dGVzX3Blcl90dSAlIDEwMDApOworCisJLyogQ29uZmlndXJlIHRo ZSBpbml0aWFsIHdhaXQgY3ljbGUgYmFzZWQgb24gdHJhbnNmZXIgdW5pdCBzaXplICovCisJaWYg KHR1IDwgKGF2Z19ieXRlc19wZXJfdHUgLyAxMDAwKSkKKwkJaW5pdF93YWl0ID0gMDsKKwllbHNl IGlmICgoYXZnX2J5dGVzX3Blcl90dSAvIDEwMDApIDw9IDQpCisJCWluaXRfd2FpdCA9IHR1Owor CWVsc2UKKwkJaW5pdF93YWl0ID0gdHUgLSBhdmdfYnl0ZXNfcGVyX3R1IC8gMTAwMDsKKworCXp5 bnFtcF9kcF93cml0ZShkcC0+aW9tZW0sIFpZTlFNUF9EUF9UWF9JTklUX1dBSVQsIGluaXRfd2Fp dCk7Cit9CisKKy8qKgorICogenlucW1wX2RwX2VuY29kZXJfbW9kZV9zZXRfc3RyZWFtIC0gQ29u ZmlndXJlIHRoZSBtYWluIHN0cmVhbQorICogQGRwOiBEaXNwbGF5UG9ydCBJUCBjb3JlIHN0cnVj dHVyZQorICogQG1vZGU6IHJlcXVlc3RlZCBkaXNwbGF5IG1vZGUKKyAqCisgKiBDb25maWd1cmUg dGhlIG1haW4gc3RyZWFtIGJhc2VkIG9uIHRoZSByZXF1ZXN0ZWQgbW9kZSBAbW9kZS4gQ2FsY3Vs YXRpb24gaXMKKyAqIGJhc2VkIG9uIElQIGNvcmUgc3BlY2lmaWNhdGlvbi4KKyAqLwordm9pZCB6 eW5xbXBfZHBfZW5jb2Rlcl9tb2RlX3NldF9zdHJlYW0oc3RydWN0IHp5bnFtcF9kcCAqZHAsCisJ CQkJICAgICAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlKQoreworCXZvaWQgX19pb21l bSAqaW9tZW0gPSBkcC0+aW9tZW07CisJdTggbGFuZV9jbnQgPSBkcC0+bW9kZS5sYW5lX2NudDsK Kwl1MzIgcmVnLCB3cGw7CisJdW5zaWduZWQgaW50IHJhdGU7CisKKwl6eW5xbXBfZHBfd3JpdGUo aW9tZW0sIFpZTlFNUF9EUF9UWF9NQUlOX1NUUkVBTV9IVE9UQUwsIG1vZGUtPmh0b3RhbCk7CisJ enlucW1wX2RwX3dyaXRlKGlvbWVtLCBaWU5RTVBfRFBfVFhfTUFJTl9TVFJFQU1fVlRPVEFMLCBt b2RlLT52dG90YWwpOworCXp5bnFtcF9kcF93cml0ZShpb21lbSwgWllOUU1QX0RQX1RYX01BSU5f U1RSRUFNX1BPTEFSSVRZLAorCQkJKCEhKG1vZGUtPmZsYWdzICYgRFJNX01PREVfRkxBR19QVlNZ TkMpIDw8CisJCQkgWllOUU1QX0RQX1RYX01BSU5fU1RSRUFNX1BPTEFSSVRZX1ZTWU5DX1NISUZU KSB8CisJCQkoISEobW9kZS0+ZmxhZ3MgJiBEUk1fTU9ERV9GTEFHX1BIU1lOQykgPDwKKwkJCSBa WU5RTVBfRFBfVFhfTUFJTl9TVFJFQU1fUE9MQVJJVFlfSFNZTkNfU0hJRlQpKTsKKwl6eW5xbXBf ZHBfd3JpdGUoaW9tZW0sIFpZTlFNUF9EUF9UWF9NQUlOX1NUUkVBTV9IU1dJRFRILAorCQkJbW9k ZS0+aHN5bmNfZW5kIC0gbW9kZS0+aHN5bmNfc3RhcnQpOworCXp5bnFtcF9kcF93cml0ZShpb21l bSwgWllOUU1QX0RQX1RYX01BSU5fU1RSRUFNX1ZTV0lEVEgsCisJCQltb2RlLT52c3luY19lbmQg LSBtb2RlLT52c3luY19zdGFydCk7CisJenlucW1wX2RwX3dyaXRlKGlvbWVtLCBaWU5RTVBfRFBf VFhfTUFJTl9TVFJFQU1fSFJFUywgbW9kZS0+aGRpc3BsYXkpOworCXp5bnFtcF9kcF93cml0ZShp b21lbSwgWllOUU1QX0RQX1RYX01BSU5fU1RSRUFNX1ZSRVMsIG1vZGUtPnZkaXNwbGF5KTsKKwl6 eW5xbXBfZHBfd3JpdGUoaW9tZW0sIFpZTlFNUF9EUF9UWF9NQUlOX1NUUkVBTV9IU1RBUlQsCisJ CQltb2RlLT5odG90YWwgLSBtb2RlLT5oc3luY19zdGFydCk7CisJenlucW1wX2RwX3dyaXRlKGlv bWVtLCBaWU5RTVBfRFBfVFhfTUFJTl9TVFJFQU1fVlNUQVJULAorCQkJbW9kZS0+dnRvdGFsIC0g bW9kZS0+dnN5bmNfc3RhcnQpOworCisJLyogSW4gc3luY2hyb25vdXMgbW9kZSwgc2V0IHRoZSBk aXZpZXJzICovCisJaWYgKGRwLT5jb25maWcubWlzYzAgJiBaWU5RTVBfRFBfVFhfTUFJTl9TVFJF QU1fTUlTQzBfU1lOQykgeworCQlyZWcgPSBkcm1fZHBfYndfY29kZV90b19saW5rX3JhdGUoZHAt Pm1vZGUuYndfY29kZSk7CisJCXp5bnFtcF9kcF93cml0ZShpb21lbSwgWllOUU1QX0RQX1RYX05f VklELCByZWcpOworCQl6eW5xbXBfZHBfd3JpdGUoaW9tZW0sIFpZTlFNUF9EUF9UWF9NX1ZJRCwg bW9kZS0+Y2xvY2spOworCQlyYXRlID0genlucW1wX2Rpc3BfZ2V0X2F1ZF9jbGtfcmF0ZShkcC0+ ZHBzdWItPmRpc3ApOworCQlpZiAocmF0ZSkgeworCQkJZGV2X2RiZyhkcC0+ZGV2LCAiQXVkaW8g cmF0ZTogJWRcbiIsIHJhdGUgLyA1MTIpOworCQkJenlucW1wX2RwX3dyaXRlKGlvbWVtLCBaWU5R TVBfRFBfVFhfQVVESU9fTl9BVUQsIHJlZyk7CisJCQl6eW5xbXBfZHBfd3JpdGUoaW9tZW0sIFpZ TlFNUF9EUF9UWF9BVURJT19NX0FVRCwKKwkJCQkJcmF0ZSAvIDEwMDApOworCQl9CisJfQorCisJ LyogT25seSAyIGNoYW5uZWwgYXVkaW8gaXMgc3VwcG9ydGVkIG5vdyAqLworCWlmICh6eW5xbXBf ZGlzcF9hdWRfZW5hYmxlZChkcC0+ZHBzdWItPmRpc3ApKQorCQl6eW5xbXBfZHBfd3JpdGUoaW9t ZW0sIFpZTlFNUF9EUF9UWF9BVURJT19DSEFOTkVMUywgMSk7CisKKwl6eW5xbXBfZHBfd3JpdGUo aW9tZW0sIFpZTlFNUF9EUF9UWF9VU0VSX1BJWEVMX1dJRFRILCAxKTsKKworCS8qIFRyYW5zbGF0 ZSB0byB0aGUgbmF0aXZlIDE2IGJpdCBkYXRhcGF0aCBiYXNlZCBvbiBJUCBjb3JlIHNwZWMgKi8K Kwl3cGwgPSAobW9kZS0+aGRpc3BsYXkgKiBkcC0+Y29uZmlnLmJwcCArIDE1KSAvIDE2OworCXJl ZyA9IHdwbCArIHdwbCAlIGxhbmVfY250IC0gbGFuZV9jbnQ7CisJenlucW1wX2RwX3dyaXRlKGlv bWVtLCBaWU5RTVBfRFBfVFhfVVNFUl9EQVRBX0NOVF9QRVJfTEFORSwgcmVnKTsKK30KKworLyoK KyAqIERSTSBjb25uZWN0b3IgZnVuY3Rpb25zCisgKi8KKworc3RhdGljIGVudW0gZHJtX2Nvbm5l Y3Rvcl9zdGF0dXMKK3p5bnFtcF9kcF9jb25uZWN0b3JfZGV0ZWN0KHN0cnVjdCBkcm1fY29ubmVj dG9yICpjb25uZWN0b3IsIGJvb2wgZm9yY2UpCit7CisJc3RydWN0IHp5bnFtcF9kcCAqZHAgPSBj b25uZWN0b3JfdG9fZHAoY29ubmVjdG9yKTsKKwlzdHJ1Y3QgenlucW1wX2RwX2xpbmtfY29uZmln ICpsaW5rX2NvbmZpZyA9ICZkcC0+bGlua19jb25maWc7CisJdTMyIHN0YXRlLCBpOworCWludCBy ZXQ7CisKKwkvKgorCSAqIFRoaXMgaXMgZnJvbSBoZXVyaXN0aWMuIEl0IHRha2VzIHNvbWUgZGVs YXkgKGV4LCAxMDAgfiA1MDAgbXNlYykgdG8KKwkgKiBnZXQgdGhlIEhQRCBzaWduYWwgd2l0aCBz b21lIG1vbml0b3JzLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisJCXN0YXRl ID0genlucW1wX2RwX3JlYWQoZHAtPmlvbWVtLAorCQkJCSAgICAgICBaWU5RTVBfRFBfVFhfSU5U Ul9TSUdOQUxfU1RBVEUpOworCQlpZiAoc3RhdGUgJiBaWU5RTVBfRFBfVFhfSU5UUl9TSUdOQUxf U1RBVEVfSFBEKQorCQkJYnJlYWs7CisJCW1zbGVlcCgxMDApOworCX0KKworCWlmIChzdGF0ZSAm IFpZTlFNUF9EUF9UWF9JTlRSX1NJR05BTF9TVEFURV9IUEQpIHsKKwkJcmV0ID0gZHJtX2RwX2Rw Y2RfcmVhZCgmZHAtPmF1eCwgMHgwLCBkcC0+ZHBjZCwKKwkJCQkgICAgICAgc2l6ZW9mKGRwLT5k cGNkKSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfZGJnKGRwLT5kZXYsICJEUENEIHJlYWQg ZmFpbGVzIik7CisJCQlnb3RvIGRpc2Nvbm5lY3RlZDsKKwkJfQorCisJCWxpbmtfY29uZmlnLT5t YXhfcmF0ZSA9IG1pbl90KGludCwKKwkJCQkJICAgICAgZHJtX2RwX21heF9saW5rX3JhdGUoZHAt PmRwY2QpLAorCQkJCQkgICAgICBEUF9ISUdIX0JJVF9SQVRFMik7CisJCWxpbmtfY29uZmlnLT5t YXhfbGFuZXMgPSBtaW5fdCh1OCwKKwkJCQkJICAgICAgIGRybV9kcF9tYXhfbGFuZV9jb3VudChk cC0+ZHBjZCksCisJCQkJCSAgICAgICBkcC0+bnVtX2xhbmVzKTsKKworCQlkcC0+c3RhdHVzID0g Y29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQ7CisJCXJldHVybiBjb25uZWN0b3Jfc3RhdHVzX2Nv bm5lY3RlZDsKKwl9CisKK2Rpc2Nvbm5lY3RlZDoKKwlkcC0+c3RhdHVzID0gY29ubmVjdG9yX3N0 YXR1c19kaXNjb25uZWN0ZWQ7CisJcmV0dXJuIGNvbm5lY3Rvcl9zdGF0dXNfZGlzY29ubmVjdGVk OworfQorCitzdGF0aWMgaW50IHp5bnFtcF9kcF9jb25uZWN0b3JfZ2V0X21vZGVzKHN0cnVjdCBk cm1fY29ubmVjdG9yICpjb25uZWN0b3IpCit7CisJc3RydWN0IHp5bnFtcF9kcCAqZHAgPSBjb25u ZWN0b3JfdG9fZHAoY29ubmVjdG9yKTsKKwlzdHJ1Y3QgZWRpZCAqZWRpZDsKKwlpbnQgcmV0Owor CisJZWRpZCA9IGRybV9nZXRfZWRpZChjb25uZWN0b3IsICZkcC0+YXV4LmRkYyk7CisJaWYgKCFl ZGlkKQorCQlyZXR1cm4gMDsKKworCWRybV9tb2RlX2Nvbm5lY3Rvcl91cGRhdGVfZWRpZF9wcm9w ZXJ0eShjb25uZWN0b3IsIGVkaWQpOworCXJldCA9IGRybV9hZGRfZWRpZF9tb2Rlcyhjb25uZWN0 b3IsIGVkaWQpOworCWtmcmVlKGVkaWQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0 cnVjdCBkcm1fZW5jb2RlciAqCit6eW5xbXBfZHBfY29ubmVjdG9yX2Jlc3RfZW5jb2RlcihzdHJ1 Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQoreworCXN0cnVjdCB6eW5xbXBfZHAgKmRwID0g Y29ubmVjdG9yX3RvX2RwKGNvbm5lY3Rvcik7CisKKwlyZXR1cm4gJmRwLT5lbmNvZGVyOworfQor CitzdGF0aWMgaW50IHp5bnFtcF9kcF9jb25uZWN0b3JfbW9kZV92YWxpZChzdHJ1Y3QgZHJtX2Nv bm5lY3RvciAqY29ubmVjdG9yLAorCQkJCQkgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2Rl KQoreworCXN0cnVjdCB6eW5xbXBfZHAgKmRwID0gY29ubmVjdG9yX3RvX2RwKGNvbm5lY3Rvcik7 CisJdTggbWF4X2xhbmVzID0gZHAtPmxpbmtfY29uZmlnLm1heF9sYW5lczsKKwl1OCBicHAgPSBk cC0+Y29uZmlnLmJwcDsKKwlpbnQgbWF4X3JhdGUgPSBkcC0+bGlua19jb25maWcubWF4X3JhdGU7 CisJaW50IHJhdGU7CisKKwlpZiAobW9kZS0+Y2xvY2sgPiBaWU5RTVBfTUFYX0ZSRVEpIHsKKwkJ ZGV2X2RiZyhkcC0+ZGV2LCAiZmlsdGVyZWQgdGhlIG1vZGUsICVzLGZvciBoaWdoIHBpeGVsIHJh dGVcbiIsCisJCQltb2RlLT5uYW1lKTsKKwkJZHJtX21vZGVfZGVidWdfcHJpbnRtb2RlbGluZSht b2RlKTsKKwkJcmV0dXJuIE1PREVfQ0xPQ0tfSElHSDsKKwl9CisKKwkvKiBDaGVjayB3aXRoIGxp bmsgcmF0ZSBhbmQgbGFuZSBjb3VudCAqLworCXJhdGUgPSB6eW5xbXBfZHBfbWF4X3JhdGUobWF4 X3JhdGUsIG1heF9sYW5lcywgYnBwKTsKKwlpZiAobW9kZS0+Y2xvY2sgPiByYXRlKSB7CisJCWRl dl9kYmcoZHAtPmRldiwgImZpbHRlcmVkIHRoZSBtb2RlLCAlcyxmb3IgaGlnaCBwaXhlbCByYXRl XG4iLAorCQkJbW9kZS0+bmFtZSk7CisJCWRybV9tb2RlX2RlYnVnX3ByaW50bW9kZWxpbmUobW9k ZSk7CisJCXJldHVybiBNT0RFX0NMT0NLX0hJR0g7CisJfQorCisJcmV0dXJuIE1PREVfT0s7Cit9 CisKK3N0YXRpYyB2b2lkIHp5bnFtcF9kcF9jb25uZWN0b3JfZGVzdHJveShzdHJ1Y3QgZHJtX2Nv bm5lY3RvciAqY29ubmVjdG9yKQoreworCWRybV9jb25uZWN0b3JfdW5yZWdpc3Rlcihjb25uZWN0 b3IpOworCWRybV9jb25uZWN0b3JfY2xlYW51cChjb25uZWN0b3IpOworfQorCitzdGF0aWMgY29u c3Qgc3RydWN0IGRybV9jb25uZWN0b3JfZnVuY3MgenlucW1wX2RwX2Nvbm5lY3Rvcl9mdW5jcyA9 IHsKKwkuZGV0ZWN0CQkJPSB6eW5xbXBfZHBfY29ubmVjdG9yX2RldGVjdCwKKwkuZmlsbF9tb2Rl cwkJPSBkcm1faGVscGVyX3Byb2JlX3NpbmdsZV9jb25uZWN0b3JfbW9kZXMsCisJLmRlc3Ryb3kJ CT0genlucW1wX2RwX2Nvbm5lY3Rvcl9kZXN0cm95LAorCS5hdG9taWNfZHVwbGljYXRlX3N0YXRl CT0gZHJtX2F0b21pY19oZWxwZXJfY29ubmVjdG9yX2R1cGxpY2F0ZV9zdGF0ZSwKKwkuYXRvbWlj X2Rlc3Ryb3lfc3RhdGUJPSBkcm1fYXRvbWljX2hlbHBlcl9jb25uZWN0b3JfZGVzdHJveV9zdGF0 ZSwKKwkucmVzZXQJCQk9IGRybV9hdG9taWNfaGVscGVyX2Nvbm5lY3Rvcl9yZXNldCwKK307CisK K3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9oZWxwZXJfZnVuY3MKK3p5bnFtcF9k cF9jb25uZWN0b3JfaGVscGVyX2Z1bmNzID0geworCS5nZXRfbW9kZXMJPSB6eW5xbXBfZHBfY29u bmVjdG9yX2dldF9tb2RlcywKKwkuYmVzdF9lbmNvZGVyCT0genlucW1wX2RwX2Nvbm5lY3Rvcl9i ZXN0X2VuY29kZXIsCisJLm1vZGVfdmFsaWQJPSB6eW5xbXBfZHBfY29ubmVjdG9yX21vZGVfdmFs aWQsCit9OworCisvKgorICogRFJNIGVuY29kZXIgZnVuY3Rpb25zCisgKi8KKworc3RhdGljIHZv aWQgenlucW1wX2RwX2VuY29kZXJfZW5hYmxlKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikK K3sKKwlzdHJ1Y3QgenlucW1wX2RwICpkcCA9IGVuY29kZXJfdG9fZHAoZW5jb2Rlcik7CisJdm9p ZCBfX2lvbWVtICppb21lbSA9IGRwLT5pb21lbTsKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgcmV0 ID0gMDsKKworCXBtX3J1bnRpbWVfZ2V0X3N5bmMoZHAtPmRldik7CisJZHAtPmVuYWJsZWQgPSB0 cnVlOworCXp5bnFtcF9kcF9pbml0X2F1eChkcCk7CisJenlucW1wX2RwX3VwZGF0ZV9taXNjKGRw KTsKKwlpZiAoenlucW1wX2Rpc3BfYXVkX2VuYWJsZWQoZHAtPmRwc3ViLT5kaXNwKSkKKwkJenlu cW1wX2RwX3dyaXRlKGlvbWVtLCBaWU5RTVBfRFBfVFhfQVVESU9fQ09OVFJPTCwgMSk7CisJenlu cW1wX2RwX3dyaXRlKGlvbWVtLCBaWU5RTVBfRFBfVFhfUEhZX1BPV0VSX0RPV04sIDApOworCWlm IChkcC0+c3RhdHVzID09IGNvbm5lY3Rvcl9zdGF0dXNfY29ubmVjdGVkKSB7CisJCWZvciAoaSA9 IDA7IGkgPCAzOyBpKyspIHsKKwkJCXJldCA9IGRybV9kcF9kcGNkX3dyaXRlYigmZHAtPmF1eCwg RFBfU0VUX1BPV0VSLAorCQkJCQkJIERQX1NFVF9QT1dFUl9EMCk7CisJCQlpZiAocmV0ID09IDEp CisJCQkJYnJlYWs7CisJCQl1c2xlZXBfcmFuZ2UoMzAwLCA1MDApOworCQl9CisJCS8qIFNvbWUg bW9uaXRvcnMgdGFrZSB0aW1lIHRvIHdha2UgdXAgcHJvcGVybHkgKi8KKwkJbXNsZWVwKHp5bnFt cF9kcF9wb3dlcl9vbl9kZWxheV9tcyk7CisJfQorCWlmIChyZXQgIT0gMSkKKwkJZGV2X2RiZyhk cC0+ZGV2LCAiRFAgYXV4IGZhaWxlZFxuIik7CisJZWxzZQorCQl6eW5xbXBfZHBfdHJhaW5fbG9v cChkcCk7CisJenlucW1wX2RwX3dyaXRlKGlvbWVtLCBaWU5RTVBfRFBfVFhfU1dfUkVTRVQsCisJ CQlaWU5RTVBfRFBfVFhfU1dfUkVTRVRfQUxMKTsKKwl6eW5xbXBfZHBfd3JpdGUoaW9tZW0sIFpZ TlFNUF9EUF9UWF9FTkFCTEVfTUFJTl9TVFJFQU0sIDEpOworfQorCitzdGF0aWMgdm9pZCB6eW5x bXBfZHBfZW5jb2Rlcl9kaXNhYmxlKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKK3sKKwlz dHJ1Y3QgenlucW1wX2RwICpkcCA9IGVuY29kZXJfdG9fZHAoZW5jb2Rlcik7CisJdm9pZCBfX2lv bWVtICppb21lbSA9IGRwLT5pb21lbTsKKworCWRwLT5lbmFibGVkID0gZmFsc2U7CisJY2FuY2Vs X2RlbGF5ZWRfd29yaygmZHAtPmhwZF93b3JrKTsKKwl6eW5xbXBfZHBfd3JpdGUoaW9tZW0sIFpZ TlFNUF9EUF9UWF9FTkFCTEVfTUFJTl9TVFJFQU0sIDApOworCWRybV9kcF9kcGNkX3dyaXRlYigm ZHAtPmF1eCwgRFBfU0VUX1BPV0VSLCBEUF9TRVRfUE9XRVJfRDMpOworCXp5bnFtcF9kcF93cml0 ZShpb21lbSwgWllOUU1QX0RQX1RYX1BIWV9QT1dFUl9ET1dOLAorCQkJWllOUU1QX0RQX1RYX1BI WV9QT1dFUl9ET1dOX0FMTCk7CisJaWYgKHp5bnFtcF9kaXNwX2F1ZF9lbmFibGVkKGRwLT5kcHN1 Yi0+ZGlzcCkpCisJCXp5bnFtcF9kcF93cml0ZShpb21lbSwgWllOUU1QX0RQX1RYX0FVRElPX0NP TlRST0wsIDApOworCXBtX3J1bnRpbWVfcHV0X3N5bmMoZHAtPmRldik7Cit9CisKK3N0YXRpYyB2 b2lkCit6eW5xbXBfZHBfZW5jb2Rlcl9hdG9taWNfbW9kZV9zZXQoc3RydWN0IGRybV9lbmNvZGVy ICplbmNvZGVyLAorCQkJCSAgc3RydWN0IGRybV9jcnRjX3N0YXRlICpjcnRjX3N0YXRlLAorCQkJ CSAgc3RydWN0IGRybV9jb25uZWN0b3Jfc3RhdGUgKmNvbm5lY3Rvcl9zdGF0ZSkKK3sKKwlzdHJ1 Y3QgenlucW1wX2RwICpkcCA9IGVuY29kZXJfdG9fZHAoZW5jb2Rlcik7CisJc3RydWN0IGRybV9k aXNwbGF5X21vZGUgKm1vZGUgPSAmY3J0Y19zdGF0ZS0+bW9kZTsKKwlzdHJ1Y3QgZHJtX2Rpc3Bs YXlfbW9kZSAqYWRqdXN0ZWRfbW9kZSA9ICZjcnRjX3N0YXRlLT5hZGp1c3RlZF9tb2RlOworCXU4 IG1heF9sYW5lcyA9IGRwLT5saW5rX2NvbmZpZy5tYXhfbGFuZXM7CisJdTggYnBwID0gZHAtPmNv bmZpZy5icHA7CisJaW50IHJhdGUsIG1heF9yYXRlID0gZHAtPmxpbmtfY29uZmlnLm1heF9yYXRl OworCWludCByZXQ7CisKKwkvKiBDaGVjayBhZ2FpbiBhcyBicHAgb3IgZm9ybWF0IG1pZ2h0IGhh dmUgYmVlbiBjaGFnbmVkICovCisJcmF0ZSA9IHp5bnFtcF9kcF9tYXhfcmF0ZShtYXhfcmF0ZSwg bWF4X2xhbmVzLCBicHApOworCWlmIChtb2RlLT5jbG9jayA+IHJhdGUpIHsKKwkJZGV2X2Vycihk cC0+ZGV2LCAidGhlIG1vZGUsICVzLGhhcyB0b28gaGlnaCBwaXhlbCByYXRlXG4iLAorCQkJbW9k ZS0+bmFtZSk7CisJCWRybV9tb2RlX2RlYnVnX3ByaW50bW9kZWxpbmUobW9kZSk7CisJfQorCisJ cmV0ID0genlucW1wX2RwX21vZGVfY29uZmlndXJlKGRwLCBhZGp1c3RlZF9tb2RlLT5jbG9jaywg MCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybjsKKworCXp5bnFtcF9kcF9lbmNvZGVyX21vZGVf c2V0X3RyYW5zZmVyX3VuaXQoZHAsIGFkanVzdGVkX21vZGUpOworfQorCisjZGVmaW5lIFpZTlFN UF9EUF9NSU5fSF9CQUNLUE9SQ0gJMjAKKworc3RhdGljIGludAorenlucW1wX2RwX2VuY29kZXJf YXRvbWljX2NoZWNrKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwKKwkJCSAgICAgICBzdHJ1 Y3QgZHJtX2NydGNfc3RhdGUgKmNydGNfc3RhdGUsCisJCQkgICAgICAgc3RydWN0IGRybV9jb25u ZWN0b3Jfc3RhdGUgKmNvbm5fc3RhdGUpCit7CisJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1v ZGUgPSAmY3J0Y19zdGF0ZS0+bW9kZTsKKwlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqYWRqdXN0 ZWRfbW9kZSA9ICZjcnRjX3N0YXRlLT5hZGp1c3RlZF9tb2RlOworCWludCBkaWZmID0gbW9kZS0+ aHRvdGFsIC0gbW9kZS0+aHN5bmNfZW5kOworCisJLyoKKwkgKiBaeW5xTVAgRFAgcmVxdWlyZXMg aG9yaXpvbnRhbCBiYWNrcG9yY2ggdG8gYmUgZ3JlYXRlciB0aGFuIDEyLgorCSAqIFRoaXMgbGlt aXRhdGlvbiBtYXkgbm90IGJlIGNvbXBhdGlibGUgd2l0aCB0aGUgc2luayBkZXZpY2UuCisJICov CisJaWYgKGRpZmYgPCBaWU5RTVBfRFBfTUlOX0hfQkFDS1BPUkNIKSB7CisJCWludCB2cmVmcmVz aCA9IChhZGp1c3RlZF9tb2RlLT5jbG9jayAqIDEwMDApIC8KKwkJCSAgICAgICAoYWRqdXN0ZWRf bW9kZS0+dnRvdGFsICogYWRqdXN0ZWRfbW9kZS0+aHRvdGFsKTsKKworCQlkZXZfZGJnKGVuY29k ZXItPmRldi0+ZGV2LCAiaGJhY2twb3JjaCBhZGp1c3RlZDogJWQgdG8gJWQiLAorCQkJZGlmZiwg WllOUU1QX0RQX01JTl9IX0JBQ0tQT1JDSCAtIGRpZmYpOworCQlkaWZmID0gWllOUU1QX0RQX01J Tl9IX0JBQ0tQT1JDSCAtIGRpZmY7CisJCWFkanVzdGVkX21vZGUtPmh0b3RhbCArPSBkaWZmOwor CQlhZGp1c3RlZF9tb2RlLT5jbG9jayA9IGFkanVzdGVkX21vZGUtPnZ0b3RhbCAqCisJCQkJICAg ICAgIGFkanVzdGVkX21vZGUtPmh0b3RhbCAqIHZyZWZyZXNoIC8gMTAwMDsKKwl9CisKKwlyZXR1 cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fZW5jb2Rlcl9mdW5jcyB6eW5xbXBf ZHBfZW5jb2Rlcl9mdW5jcyA9IHsKKwkuZGVzdHJveSA9IGRybV9lbmNvZGVyX2NsZWFudXAsCit9 OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9lbmNvZGVyX2hlbHBlcl9mdW5jcyB6eW5xbXBf ZHBfZW5jb2Rlcl9oZWxwZXJfZnVuY3MgPSB7CisJLmVuYWJsZQkJCT0genlucW1wX2RwX2VuY29k ZXJfZW5hYmxlLAorCS5kaXNhYmxlCQk9IHp5bnFtcF9kcF9lbmNvZGVyX2Rpc2FibGUsCisJLmF0 b21pY19tb2RlX3NldAk9IHp5bnFtcF9kcF9lbmNvZGVyX2F0b21pY19tb2RlX3NldCwKKwkuYXRv bWljX2NoZWNrCQk9IHp5bnFtcF9kcF9lbmNvZGVyX2F0b21pY19jaGVjaywKK307CisKKy8qCisg KiBDb21wb25lbnQgZnVuY3Rpb25zCisgKi8KKworc3RhdGljIHZvaWQgenlucW1wX2RwX2hwZF93 b3JrX2Z1bmMoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCB6eW5xbXBfZHAg KmRwOworCisJZHAgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHp5bnFtcF9kcCwgaHBkX3dv cmsud29yayk7CisKKwlpZiAoZHAtPmRybSkKKwkJZHJtX2hlbHBlcl9ocGRfaXJxX2V2ZW50KGRw LT5kcm0pOworfQorCitpbnQgenlucW1wX2RwX2JpbmQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1 Y3QgZGV2aWNlICptYXN0ZXIsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHp5bnFtcF9kcHN1YiAq ZHBzdWIgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgenlucW1wX2RwICpkcCA9IGRw c3ViLT5kcDsKKwlzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIgPSAmZHAtPmVuY29kZXI7CisJ c3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciA9ICZkcC0+Y29ubmVjdG9yOworCXN0cnVj dCBkcm1fZGV2aWNlICpkcm0gPSBkYXRhOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcG9ydDsKKwlp bnQgcmV0OworCisJaWYgKCFkcC0+bnVtX2xhbmVzKQorCQlyZXR1cm4gMDsKKworCWVuY29kZXIt PnBvc3NpYmxlX2NydGNzIHw9IHp5bnFtcF9kaXNwX2dldF9jcnRjX21hc2soZHBzdWItPmRpc3Ap OworCWZvcl9lYWNoX2NoaWxkX29mX25vZGUoZGV2LT5vZl9ub2RlLCBwb3J0KSB7CisJCWlmICgh cG9ydC0+bmFtZSB8fCBvZl9ub2RlX2NtcChwb3J0LT5uYW1lLCAicG9ydCIpKQorCQkJY29udGlu dWU7CisJCWVuY29kZXItPnBvc3NpYmxlX2NydGNzIHw9IGRybV9vZl9maW5kX3Bvc3NpYmxlX2Ny dGNzKGRybSwKKwkJCQkJCQkJICAgICAgcG9ydCk7CisJfQorCWRybV9lbmNvZGVyX2luaXQoZHJt LCBlbmNvZGVyLCAmenlucW1wX2RwX2VuY29kZXJfZnVuY3MsCisJCQkgRFJNX01PREVfRU5DT0RF Ul9UTURTLCBOVUxMKTsKKwlkcm1fZW5jb2Rlcl9oZWxwZXJfYWRkKGVuY29kZXIsICZ6eW5xbXBf ZHBfZW5jb2Rlcl9oZWxwZXJfZnVuY3MpOworCisJY29ubmVjdG9yLT5wb2xsZWQgPSBEUk1fQ09O TkVDVE9SX1BPTExfSFBEOworCXJldCA9IGRybV9jb25uZWN0b3JfaW5pdChlbmNvZGVyLT5kZXYs IGNvbm5lY3RvciwKKwkJCQkgJnp5bnFtcF9kcF9jb25uZWN0b3JfZnVuY3MsCisJCQkJIERSTV9N T0RFX0NPTk5FQ1RPUl9EaXNwbGF5UG9ydCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRwLT5k ZXYsICJmYWlsZWQgdG8gaW5pdGlhbGl6ZSB0aGUgZHJtIGNvbm5lY3RvciIpOworCQlnb3RvIGVy cm9yX2VuY29kZXI7CisJfQorCisJZHJtX2Nvbm5lY3Rvcl9oZWxwZXJfYWRkKGNvbm5lY3Rvciwg Jnp5bnFtcF9kcF9jb25uZWN0b3JfaGVscGVyX2Z1bmNzKTsKKwlkcm1fY29ubmVjdG9yX3JlZ2lz dGVyKGNvbm5lY3Rvcik7CisJZHJtX21vZGVfY29ubmVjdG9yX2F0dGFjaF9lbmNvZGVyKGNvbm5l Y3RvciwgZW5jb2Rlcik7CisJY29ubmVjdG9yLT5kcG1zID0gRFJNX01PREVfRFBNU19PRkY7CisK KwlkcC0+ZHJtID0gZHJtOworCWRwLT5jb25maWcubWlzYzAgJj0gflpZTlFNUF9EUF9UWF9NQUlO X1NUUkVBTV9NSVNDMF9TWU5DOworCXJldCA9IHp5bnFtcF9kcF9zZXRfYnBjKGRwLCA4KTsKKwl6 eW5xbXBfZHBfdXBkYXRlX2JwcChkcCk7CisKKwkvKiBUaGlzIGVuYWJsZXMgaW50ZXJydXB0cywg c28gc2hvdWxkIGJlIGNhbGxlZCBhZnRlciBEUk0gaW5pdCAqLworCXJldCA9IHp5bnFtcF9kcF9p bml0X2F1eChkcCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRwLT5kZXYsICJmYWlsZWQgdG8g aW5pdGlhbGl6ZSBEUCBhdXgiKTsKKwkJZ290byBlcnJvcl9jb25uZWN0b3I7CisJfQorCUlOSVRf REVMQVlFRF9XT1JLKCZkcC0+aHBkX3dvcmssIHp5bnFtcF9kcF9ocGRfd29ya19mdW5jKTsKKwor CXJldHVybiAwOworCitlcnJvcl9jb25uZWN0b3I6CisJenlucW1wX2RwX2Nvbm5lY3Rvcl9kZXN0 cm95KCZkcC0+Y29ubmVjdG9yKTsKK2Vycm9yX2VuY29kZXI6CisJZHJtX2VuY29kZXJfY2xlYW51 cCgmZHAtPmVuY29kZXIpOworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgenlucW1wX2RwX3VuYmlu ZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2UgKm1hc3Rlciwgdm9pZCAqZGF0YSkK K3sKKwlzdHJ1Y3QgenlucW1wX2Rwc3ViICpkcHN1YiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwor CXN0cnVjdCB6eW5xbXBfZHAgKmRwID0gZHBzdWItPmRwOworCisJZGlzYWJsZV9pcnEoZHAtPmly cSk7CisJaWYgKCFkcC0+bnVtX2xhbmVzKQorCQlyZXR1cm47CisKKwljYW5jZWxfZGVsYXllZF93 b3JrX3N5bmMoJmRwLT5ocGRfd29yayk7CisJenlucW1wX2RwX2V4aXRfYXV4KGRwKTsKKwl6eW5x bXBfZHBfY29ubmVjdG9yX2Rlc3Ryb3koJmRwLT5jb25uZWN0b3IpOworCWRybV9lbmNvZGVyX2Ns ZWFudXAoJmRwLT5lbmNvZGVyKTsKK30KKworLyoKKyAqIFBsYXRmb3JtIGZ1bmN0aW9ucworICov CisKK3N0YXRpYyBpcnFyZXR1cm5fdCB6eW5xbXBfZHBfaXJxX2hhbmRsZXIoaW50IGlycSwgdm9p ZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgenlucW1wX2RwICpkcCA9IChzdHJ1Y3QgenlucW1wX2RwICop ZGF0YTsKKwl1MzIgc3RhdHVzLCBtYXNrOworCisJc3RhdHVzID0genlucW1wX2RwX3JlYWQoZHAt PmlvbWVtLCBaWU5RTVBfRFBfU1VCX1RYX0lOVFJfU1RBVFVTKTsKKwltYXNrID0genlucW1wX2Rw X3JlYWQoZHAtPmlvbWVtLCBaWU5RTVBfRFBfU1VCX1RYX0lOVFJfTUFTSyk7CisJaWYgKCEoc3Rh dHVzICYgfm1hc2spKQorCQlyZXR1cm4gSVJRX05PTkU7CisKKwkvKiBkYmcgZm9yIGRpYWdub3N0 aWMsIGJ1dCBub3QgbXVjaCB0aGF0IHRoZSBkcml2ZXIgY2FuIGRvICovCisJaWYgKHN0YXR1cyAm IFpZTlFNUF9EUF9UWF9JTlRSX0NIQlVGX1VOREVSRkxXX01BU0spCisJCWRldl9kYmdfcmF0ZWxp bWl0ZWQoZHAtPmRldiwgInVuZGVyZmxvdyBpbnRlcnJ1cHRcbiIpOworCWlmIChzdGF0dXMgJiBa WU5RTVBfRFBfVFhfSU5UUl9DSEJVRl9PVkVSRkxXX01BU0spCisJCWRldl9kYmdfcmF0ZWxpbWl0 ZWQoZHAtPmRldiwgIm92ZXJmbG93IGludGVycnVwdFxuIik7CisKKwl6eW5xbXBfZHBfd3JpdGUo ZHAtPmlvbWVtLCBaWU5RTVBfRFBfU1VCX1RYX0lOVFJfU1RBVFVTLCBzdGF0dXMpOworCisJLyog VGhlIERQIHZibGFuayB3aWxsIG5vdCBiZSBlbmFibGVkIHdpdGggcmVtb3RlIGNydGMgZGV2aWNl ICovCisJaWYgKHN0YXR1cyAmIFpZTlFNUF9EUF9UWF9JTlRSX1ZCTEFOS19TVEFSVCkKKwkJenlu cW1wX2Rpc3BfaGFuZGxlX3ZibGFuayhkcC0+ZHBzdWItPmRpc3ApOworCisJaWYgKHN0YXR1cyAm IFpZTlFNUF9EUF9UWF9JTlRSX0hQRF9FVkVOVCkKKwkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZk cC0+aHBkX3dvcmssIDApOworCisJaWYgKHN0YXR1cyAmIFpZTlFNUF9EUF9UWF9JTlRSX0hQRF9J UlEpIHsKKwkJaW50IHJldDsKKwkJdTggc3RhdHVzW0RQX0xJTktfU1RBVFVTX1NJWkUgKyAyXTsK KworCQlyZXQgPSBkcm1fZHBfZHBjZF9yZWFkKCZkcC0+YXV4LCBEUF9TSU5LX0NPVU5ULCBzdGF0 dXMsCisJCQkJICAgICAgIERQX0xJTktfU1RBVFVTX1NJWkUgKyAyKTsKKwkJaWYgKHJldCA8IDAp CisJCQlnb3RvIGhhbmRsZWQ7CisKKwkJaWYgKHN0YXR1c1s0XSAmIERQX0xJTktfU1RBVFVTX1VQ REFURUQgfHwKKwkJICAgICFkcm1fZHBfY2xvY2tfcmVjb3Zlcnlfb2soJnN0YXR1c1syXSwgZHAt Pm1vZGUubGFuZV9jbnQpIHx8CisJCSAgICAhZHJtX2RwX2NoYW5uZWxfZXFfb2soJnN0YXR1c1sy XSwgZHAtPm1vZGUubGFuZV9jbnQpKSB7CisJCQl6eW5xbXBfZHBfdHJhaW5fbG9vcChkcCk7CisJ CX0KKwl9CisKK2hhbmRsZWQ6CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitpbnQgenlucW1w X2RwX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHp5bnFt cF9kcHN1YiAqZHBzdWI7CisJc3RydWN0IHp5bnFtcF9kcCAqZHA7CisJc3RydWN0IHJlc291cmNl ICpyZXM7CisJdW5zaWduZWQgaW50IGk7CisJaW50IGlycSwgcmV0OworCisJZHAgPSBkZXZtX2t6 YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpkcCksIEdGUF9LRVJORUwpOworCWlmICghZHApCisJ CXJldHVybiAtRU5PTUVNOworCisJZHAtPmRwbXMgPSBEUk1fTU9ERV9EUE1TX09GRjsKKwlkcC0+ c3RhdHVzID0gY29ubmVjdG9yX3N0YXR1c19kaXNjb25uZWN0ZWQ7CisJZHAtPmRldiA9ICZwZGV2 LT5kZXY7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lKHBkZXYsIElPUkVT T1VSQ0VfTUVNLCAiZHAiKTsKKwlkcC0+aW9tZW0gPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoZHAt PmRldiwgcmVzKTsKKwlpZiAoSVNfRVJSKGRwLT5pb21lbSkpCisJCXJldHVybiBQVFJfRVJSKGRw LT5pb21lbSk7CisKKwl6eW5xbXBfZHBfd3JpdGUoZHAtPmlvbWVtLCBaWU5RTVBfRFBfVFhfUEhZ X1BPV0VSX0RPV04sCisJCQlaWU5RTVBfRFBfVFhfUEhZX1BPV0VSX0RPV05fQUxMKTsKKwl6eW5x bXBfZHBfc2V0KGRwLT5pb21lbSwgWllOUU1QX0RQX1RYX1BIWV9DT05GSUcsCisJCSAgICAgIFpZ TlFNUF9EUF9UWF9QSFlfQ09ORklHX0FMTF9SRVNFVCk7CisJenlucW1wX2RwX3dyaXRlKGRwLT5p b21lbSwgWllOUU1QX0RQX1RYX0ZPUkNFX1NDUkFNQkxFUl9SRVNFVCwgMSk7CisJenlucW1wX2Rw X3dyaXRlKGRwLT5pb21lbSwgWllOUU1QX0RQX1RYX0VOQUJMRSwgMCk7CisKKwlkcC0+bnVtX2xh bmVzID0gMjsKKwlmb3IgKGkgPSAwOyBpIDwgWllOUU1QX0RQX01BWF9MQU5FUzsgaSsrKSB7CisJ CWNoYXIgcGh5X25hbWVbMTZdOworCisJCXNucHJpbnRmKHBoeV9uYW1lLCBzaXplb2YocGh5X25h bWUpLCAiZHAtcGh5JWQiLCBpKTsKKwkJZHAtPnBoeVtpXSA9IGRldm1fcGh5X2dldChkcC0+ZGV2 LCBwaHlfbmFtZSk7CisJCWlmIChJU19FUlIoZHAtPnBoeVtpXSkpIHsKKwkJCXJldCA9IFBUUl9F UlIoZHAtPnBoeVtpXSk7CisJCQlkcC0+cGh5W2ldID0gTlVMTDsKKworCQkJLyogMm5kIGxhbmUg aXMgb3B0aW9uYWwgKi8KKwkJCWlmIChpID09IDEgJiYgcmV0ID09IC1FTk9ERVYpIHsKKwkJCQlk cC0+bnVtX2xhbmVzID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLyoKKwkJCSAqIElmIG5v IHBoeSBsYW5lIGlzIGFzc2lnbmVkLCB0aGUgRFAgVHggZ2V0cyBkaXNhYmxlZC4KKwkJCSAqIFRo ZSBkaXNwbGF5IHBhcnQgb2YgdGhlIERQIHN1YnN5c3RlbSBjYW4gc3RpbGwgYmUKKwkJCSAqIHVz ZWQgdG8gZHJpdmUgdGhlIG91dHB1dCB0byBGUEdBLCB0aHVzIGxldCB0aGUgRFAKKwkJCSAqIHN1 YnN5c3RlbSBkcml2ZXIgdG8gcHJvY2VlZCB3aXRob3V0IHRoaXMgRFAgVHguCisJCQkgKi8KKwkJ CWlmIChpID09IDAgJiYgcmV0ID09IC1FTk9ERVYpIHsKKwkJCQlkcC0+bnVtX2xhbmVzID0gMDsK KwkJCQlnb3RvIG91dDsKKwkJCX0KKworCQkJaWYgKHJldCAhPSAtRVBST0JFX0RFRkVSKQorCQkJ CWRldl9lcnIoZHAtPmRldiwgImZhaWxlZCB0byBnZXQgcGh5IGxhbmVcbiIpOworCisJCQlyZXR1 cm4gcmV0OworCQl9CisJfQorCisJcmV0ID0genlucW1wX2RwX2luaXRfcGh5KGRwKTsKKwlpZiAo cmV0KQorCQlnb3RvIGVycm9yX3BoeTsKKworCWRwLT5hdXgubmFtZSA9ICJaeW5xTVAgRFAgQVVY IjsKKwlkcC0+YXV4LmRldiA9IGRwLT5kZXY7CisJZHAtPmF1eC50cmFuc2ZlciA9IHp5bnFtcF9k cF9hdXhfdHJhbnNmZXI7CisJcmV0ID0gZHJtX2RwX2F1eF9yZWdpc3RlcigmZHAtPmF1eCk7CisJ aWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihkcC0+ZGV2LCAiZmFpbGVkIHRvIGluaXRpYWxpemUg RFAgYXV4XG4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisKK291dDoKKwlpcnEgPSBwbGF0Zm9ybV9n ZXRfaXJxKHBkZXYsIDApOworCWlmIChpcnEgPCAwKSB7CisJCXJldCA9IGlycTsKKwkJZ290byBl cnJvcjsKKwl9CisKKwlyZXQgPSBkZXZtX3JlcXVlc3RfdGhyZWFkZWRfaXJxKGRwLT5kZXYsIGly cSwgTlVMTCwKKwkJCQkJenlucW1wX2RwX2lycV9oYW5kbGVyLCBJUlFGX09ORVNIT1QsCisJCQkJ CWRldl9uYW1lKGRwLT5kZXYpLCBkcCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyb3I7CisJ ZHAtPmlycSA9IGlycTsKKworCWRwc3ViID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJ ZHBzdWItPmRwID0gZHA7CisJZHAtPmRwc3ViID0gZHBzdWI7CisKKwlkZXZfZGJnKGRwLT5kZXYs CisJCSJaeW5xTVAgRGlzcGxheVBvcnQgVHggZHJpdmVyIHByb2JlZCB3aXRoICV1IHBoeSBsYW5l c1xuIiwKKwkJZHAtPm51bV9sYW5lcyk7CisKKwlyZXR1cm4gMDsKKworZXJyb3I6CisJZHJtX2Rw X2F1eF91bnJlZ2lzdGVyKCZkcC0+YXV4KTsKK2Vycm9yX3BoeToKKwl6eW5xbXBfZHBfZXhpdF9w aHkoZHApOworCXJldHVybiByZXQ7Cit9CisKK2ludCB6eW5xbXBfZHBfcmVtb3ZlKHN0cnVjdCBw bGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHp5bnFtcF9kcHN1YiAqZHBzdWIgPSBw bGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgenlucW1wX2RwICpkcCA9IGRwc3Vi LT5kcDsKKworCXp5bnFtcF9kcF93cml0ZShkcC0+aW9tZW0sIFpZTlFNUF9EUF9UWF9FTkFCTEUs IDApOworCWRybV9kcF9hdXhfdW5yZWdpc3RlcigmZHAtPmF1eCk7CisJenlucW1wX2RwX2V4aXRf cGh5KGRwKTsKKwlkcHN1Yi0+ZHAgPSBOVUxMOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQg YS9kcml2ZXJzL2dwdS9kcm0veGxueC96eW5xbXBfZHAuaCBiL2RyaXZlcnMvZ3B1L2RybS94bG54 L3p5bnFtcF9kcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MzYwZjEK LS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0veGxueC96eW5xbXBfZHAuaApAQCAt MCwwICsxLDMwIEBACisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAorLyoKKyAq IFp5bnFNUCBEaXNwbGF5UG9ydCBEcml2ZXIKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDE3IC0g MjAxOCBYaWxpbngsIEluYy4KKyAqCisgKiAgQXV0aG9yOiBIeXVuIFdvbyBLd29uIDxoeXVuLmt3 b25AeGlsaW54LmNvbT4KKyAqLworCisjaWZuZGVmIF9aWU5RTVBfRFBfSF8KKyNkZWZpbmUgX1pZ TlFNUF9EUF9IXworCitzdHJ1Y3QgZGV2aWNlOworc3RydWN0IGRybV9kaXNwbGF5X21vZGU7Citz dHJ1Y3QgcGxhdGZvcm1fZGV2aWNlOworc3RydWN0IHp5bnFtcF9kcDsKKworY29uc3QgaW50IHp5 bnFtcF9kcF9zZXRfY29sb3Ioc3RydWN0IHp5bnFtcF9kcCAqZHAsIGNvbnN0IGNoYXIgKmNvbG9y KTsKK3ZvaWQgenlucW1wX2RwX2VuYWJsZV92Ymxhbmsoc3RydWN0IHp5bnFtcF9kcCAqZHApOwor dm9pZCB6eW5xbXBfZHBfZGlzYWJsZV92Ymxhbmsoc3RydWN0IHp5bnFtcF9kcCAqZHApOwordm9p ZCB6eW5xbXBfZHBfZW5jb2Rlcl9tb2RlX3NldF9zdHJlYW0oc3RydWN0IHp5bnFtcF9kcCAqZHAs CisJCQkJICAgICAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlKTsKKworaW50IHp5bnFt cF9kcF9iaW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZSAqbWFzdGVyLCB2b2lk ICpkYXRhKTsKK3ZvaWQgenlucW1wX2RwX3VuYmluZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVj dCBkZXZpY2UgKm1hc3Rlciwgdm9pZCAqZGF0YSk7CisKK2ludCB6eW5xbXBfZHBfcHJvYmUoc3Ry dWN0IHBsYXRmb3JtX2RldmljZSAqcGRldik7CitpbnQgenlucW1wX2RwX3JlbW92ZShzdHJ1Y3Qg cGxhdGZvcm1fZGV2aWNlICpwZGV2KTsKKworI2VuZGlmIC8qIF9aWU5RTVBfRFBfSF8gKi8KLS0g CjIuNy40CgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpk cmktZGV2ZWwgbWFpbGluZyBsaXN0CmRyaS1kZXZlbEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0 cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9kcmktZGV2ZWwK