From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S261434AbULNGja (ORCPT ); Tue, 14 Dec 2004 01:39:30 -0500 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S261432AbULNGja (ORCPT ); Tue, 14 Dec 2004 01:39:30 -0500 Received: from NK210-202-245-3.vdsl.static.apol.com.tw ([210.202.245.3]:64678 "EHLO uli.com.tw") by vger.kernel.org with ESMTP id S261434AbULNGgj (ORCPT ); Tue, 14 Dec 2004 01:36:39 -0500 Subject: re: Re: [patch] scsi/libata: correct bug for ULi M5281 To: Jeff Garzik Cc: linux-kernel@vger.kernel.org, linux-ide@vger.kernel.org, andrebalsa@mailingaddress.org, Peer.Chen@uli.com.tw, Emily.Jiang@uli.com.tw, Eric.Lo@uli.com.tw X-Mailer: Lotus Notes R5.0 (Intl) 30 March 1999 Message-ID: From: Clear.Zhang@uli.com.tw Date: Tue, 14 Dec 2004 14:36:17 +0800 MIME-Version: 1.0 X-MIMETrack: Serialize by Router on ulicnm01/ULI(Release 5.0.11 |July 24, 2002) at 2004-12-14 14:36:19, Itemize by SMTP Server on ulim01/ULI(Release 5.0.11 |July 24, 2002) at 2004/12/14 02:36:24 PM, Serialize by Router on ulim01/ULI(Release 5.0.11 |July 24, 2002) at 2004/12/14 02:36:29 PM Content-type: multipart/mixed; Boundary="0__=C7BBE5F9DFB046DB8f9e8a93df938690918cC7BBE5F9DFB046DB" Content-Disposition: inline Sender: linux-kernel-owner@vger.kernel.org X-Mailing-List: linux-kernel@vger.kernel.org --0__=C7BBE5F9DFB046DB8f9e8a93df938690918cC7BBE5F9DFB046DB Content-transfer-encoding: base64 Content-type: text/plain; charset=gb2312 DQpIaSBKZWZmLA0KDQpJJ3ZlIGNvcnJlY3QgdGhlIHBhdGNoIGFjY29yZGluZyB0byB5b3VyIHN1 Z2dlc3Rpb24uDQpCdXQgd2UgbmVlZCBsaWJhdGEtY29yZS5jIHRvIGV4cG9ydCBzb21lIGZ1bmN0 aW9ucy4NCkhlcmUgaXMgdGhlIHBhdGNoLiBQbGVhc2UgY2hlY2sgaXQgYW5kIGFwcGx5IGl0IHRv IG5ldyBrZXJuZWxzLg0KVGhhbmtzIGEgbG90Lg0KDQpSZWdhcmRzLA0KQ2xlYXIgICAgICAgICAg ICAgICAgICAgICAgICAgKFNlZSBhdHRhY2hlZCBmaWxlOiBwYXRjaF9VTGlfTTUyODEpDQoNCg0K ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICBKZWZmIEdhcnppayAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgPGpn YXJ6aWtAcG9ib3guYyAgICAgICAgIMrVvP7Iy6O6IENsZWFyLlpoYW5nQHVsaS5jb20udHcgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAg ICAgICAgICAgICAgIG9tPiAgICAgICAgICAgICAgICAgICAgICCzrcvNo7ogICBsaW51eC1rZXJu ZWxAdmdlci5rZXJuZWwub3JnLCBsaW51eC1pZGVAdmdlci5rZXJuZWwub3JnLCAgICAgICAgICAg ICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5k cmViYWxzYUBtYWlsaW5nYWRkcmVzcy5vcmcsIFBlZXIuQ2hlbkB1bGkuY29tLnR3LCBFbWlseS5K aWFuZ0B1bGkuY29tLnR3LCAgICAgDQogICAgICAgICAgICAgICAgICAgICAgMjAwNC0xMi0xMiAw MzoxNSAgICAgICAgIEVyaWMuTG9AdWxpLmNvbS50dyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICDW98zio7ogICBSZTogW3BhdGNoXSBzY3NpL2xp YmF0YTogY29ycmVjdCBidWcgZm9yIFVMaSBNNTI4MSAgICAgICAgICAgICAgICAgICAgICANCiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgDQoNCg0KDQpDbGVhci5aaGFuZ0B1bGkuY29tLnR3IHdyb3RlOg0KPiBIaSwg SmVmZg0KPg0KPiBUaGUgc2F0YV91bGkgcGF0Y2ggZm9yIG01MjgxIGxvb2tzIGZpbmUsYnV0IHNv bWUgb2YgTTUyODEgY2hpcCdzIFBIWQ0KPiBpcyBub3Qgc3RhYmxlIHNvbWV0aW1lLCBzbyBpdCBu ZWVkIGEgd29ya2Fyb3VuZCB0byBjb3JyZWN0IHRoZSBidWcuDQo+DQo+IHBhdGNoX001Mjgxd29y a2Fyb3VuZCBpcyBqdXN0IGZvciBpdC4NCj4NCj4gVGhlIHBhdGNoIGlzIGFwcGxpZWQgdG8ga2Vy bmVsIDIuNi45LiBQbGVhc2VzIGFwcGx5IHRvIG5ldyBrZXJuZWxzLA0KdGhhbmtzDQo+IGEgbG90 Lg0KPg0KPiBTaWduZWQtb2ZmLWJ5OiBDbGVhciBaaGFuZyA8Q2xlYXIuWmhhbmdAdWxpLmNvbS50 dz4NCg0KSSdtIGFmcmFpZCBJIG11c3QgcmVqZWN0IHRoaXMgcGF0Y2guICBXZSBkbyBub3Qgd2lz aCB0byBwdXQNCmhhcmR3YXJlLXNwZWNpZmljIHdvcmthcm91bmRzIGluIGxpYmF0YS1jb3JlLmMg b3IgbGliYXRhLXNjc2kuYy4NCg0KSSB3b3VsZCBzdWdnZXN0IGVpdGhlcg0KKGEpIGZpbmRpbmcg YSB3YXkgdG8gYWRkIHRoZSB3b3JrYXJvdW5kIHRvIHNhdGFfdWxpLmMsIG9yDQooYikgZmluZGlu ZyB0aGUgInJvb3QgY2F1c2UiIG9mIHRoZSBwcm9ibGVtLCBhbmQgZGV0ZXJtaW5lIHdoeSB0aGUN CmxpYmF0YSBjb2RlIGlzIGluc3VmZmljaWVudC4NCg0KVHdvIHN1Z2dlc3Rpb25zIEkgaGF2ZSB3 aGlsZSBpbnZlc3RpZ2F0aW5nIHlvdXIgcHJvYmxlbToNCjEpIFJlcGxhY2luZyB0aGUgLT5waHlf cmVzZXQoKSBob29rIG1heSBhbGxvdyB5b3UgdG8gc29sdmUgdGhlIHByb2JsZW0NCmluIHNhdGFf dWxpLmMuDQoyKSBJdCBpcyBlbnRpcmVseSBwb3NzaWJsZSB0aGF0IHdlIG5lZWQgdG8gYWRkIGFk ZGl0aW9uYWwgZXJyb3IgaGFuZGxpbmcNCmNvZGUgdG8gbGliYXRhLCBpbmNsdWRpbmcgaG9va3Mg YmFjayBpbnRvIHRoZSBsb3ctbGV2ZWwgZHJpdmVyIChzdWNoIGFzDQpzYXRhX3VsaS5jKS4NCg0K UmVnYXJkcywNCg0KICAgICAgICAgICAgIEplZmYNCg0KDQoNCg0KDQo= --0__=C7BBE5F9DFB046DB8f9e8a93df938690918cC7BBE5F9DFB046DB Content-type: application/octet-stream; name="=?gb2312?B?cGF0Y2hfVUxpX001Mjgx?=" Content-Disposition: attachment; filename="=?gb2312?B?cGF0Y2hfVUxpX001Mjgx?=" Content-Transfer-Encoding: base64 ZGlmZiAtdXByTiBsaW51eC0yLjYuOS12YW5pbGxhL2RyaXZlcnMvc2NzaS9saWJhdGEtY29yZS5j IGxpbnV4LTIuNi45L2RyaXZlcnMvc2NzaS9saWJhdGEtY29yZS5jCi0tLSBsaW51eC0yLjYuOS12 YW5pbGxhL2RyaXZlcnMvc2NzaS9saWJhdGEtY29yZS5jCTIwMDQtMTAtMTkgMDU6NTM6MDYuMDAw MDAwMDAwICswODAwCisrKyBsaW51eC0yLjYuOS9kcml2ZXJzL3Njc2kvbGliYXRhLWNvcmUuYwky MDA0LTEyLTE0IDE0OjA4OjAwLjIwMjQxMjIyNCArMDgwMApAQCAtMzY1NSwzICszNjU1LDE2IEBA IEVYUE9SVF9TWU1CT0xfR1BMKGF0YV9zY3NpX3JlbGVhc2UpOwogRVhQT1JUX1NZTUJPTF9HUEwo YXRhX2hvc3RfaW50cik7CiBFWFBPUlRfU1lNQk9MX0dQTChhdGFfZGV2X2NsYXNzaWZ5KTsKIEVY UE9SVF9TWU1CT0xfR1BMKGF0YV9kZXZfaWRfc3RyaW5nKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGF0 YV9zY3NpX3JidWZfZmlsbCk7CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfc2NzaW9wX2lucV8wMCk7 CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfc2NzaW9wX25vb3ApOworRVhQT1JUX1NZTUJPTF9HUEwo YXRhX3Njc2lfYmFkY21kKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9zY3Npb3BfaW5xXzgwKTsK K0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9zY3Npb3BfaW5xXzgzKTsKK0VYUE9SVF9TWU1CT0xfR1BM KGF0YV9zY3Npb3BfbW9kZV9zZW5zZSk7CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfc2NzaW9wX3Jl YWRfY2FwKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9zY3Npb3BfaW5xX3N0ZCk7CitFWFBPUlRf U1lNQk9MX0dQTChhdGFfdG9fc2Vuc2VfZXJyb3IpOworRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3Nj c2lvcF9yZXBvcnRfbHVucyk7CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfcWNfbmV3X2luaXQpOwor RVhQT1JUX1NZTUJPTF9HUEwoYXRhX3FjX2lzc3VlKTsKZGlmZiAtdXByTiBsaW51eC0yLjYuOS12 YW5pbGxhL2RyaXZlcnMvc2NzaS9zYXRhX3VsaS5jIGxpbnV4LTIuNi45L2RyaXZlcnMvc2NzaS9z YXRhX3VsaS5jCi0tLSBsaW51eC0yLjYuOS12YW5pbGxhL2RyaXZlcnMvc2NzaS9zYXRhX3VsaS5j CTE5NzAtMDEtMDEgMDg6MDA6MDAuMDAwMDAwMDAwICswODAwCisrKyBsaW51eC0yLjYuOS9kcml2 ZXJzL3Njc2kvc2F0YV91bGkuYwkyMDA0LTEyLTE0IDE0OjA3OjUyLjkzNTUxNjk2MCArMDgwMApA QCAtMCwwICsxLDE1MjIgQEAKKy8qCisgKiAgc2F0YV91bGkuYyAtIFVMaSBFbGVjdHJvbmljcyBT QVRBCisgKgorICogIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhl IE9wZW4KKyAqICBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4xIHRoYXQgY2FuIGJlIGZvdW5k IGF0CisgKiAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wtMS4xLnR4dCBh bmQgaXMgaW5jbHVkZWQgaGVyZWluCisgKiAgYnkgcmVmZXJlbmNlLgorICoKKyAqICBBbHRlcm5h dGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0 ZXJtcworICogIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgKHRo ZSAiR1BMIikgYXMgZGlzdHJpYnV0ZWQKKyAqICBpbiB0aGUga2VybmVsIHNvdXJjZSBDT1BZSU5H IGZpbGUsIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YKKyAqICB0aGUgR1BMIGFyZSBh cHBsaWNhYmxlIGluc3RlYWQgb2YgdGhlIGFib3ZlLiAgSWYgeW91IHdpc2ggdG8gYWxsb3cKKyAq ICB0aGUgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seSB1bmRlciB0aGUgdGVy bXMgb2YgdGhlCisgKiAgR1BMIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvIHVzZSB5b3VyIHZl cnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCisgKiAgdGhlIE9TTCwgaW5kaWNhdGUgeW91ciBkZWNp c2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQKKyAqICByZXBsYWNlIHRo ZW0gd2l0aCB0aGUgbm90aWNlIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBH UEwuCisgKiAgSWYgeW91IGRvIG5vdCBkZWxldGUgdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVj aXBpZW50IG1heSB1c2UgeW91cgorICogIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIGVpdGhl ciB0aGUgT1NMIG9yIHRoZSBHUEwuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcu aD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4K KyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVk ZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxs aW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlICJzY3NpLmgiCisjaW5jbHVkZSA8c2NzaS9zY3Np X2hvc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9saWJhdGEuaD4KKworI2RlZmluZSBEUlZfTkFNRQki c2F0YV91bGkiCisjZGVmaW5lIERSVl9WRVJTSU9OCSIwLjExIgorCisvL2FkZCBieSBjbGVhciB6 aGFuZyAyMDA0LzEyLzEzCisjZGVmaW5lIHByaW50X2NsZWFyKF94XykgcHJpbnRrIF94XwordHlw ZWRlZiB1bnNpZ25lZCBpbnQgKCphdGFfeGxhdF9mdW5jX3QpKHN0cnVjdCBhdGFfcXVldWVkX2Nt ZCAqcWMsIHU4ICpzY3NpY21kKTsKK3N0YXRpYyB1OCBpZnRpbWVvdXQ9MDsKKy8vZW5kIGFkZAor CitlbnVtIHsKKwl1bGlfNTI4OQkJPSAwLAorCXVsaV81Mjg3CQk9IDEsCisJdWxpXzUyODEJICAg ICAgID0gMiwKKwkKKwkvKiBQQ0kgY29uZmlndXJhdGlvbiByZWdpc3RlcnMgKi8vL21vZGl5IGJ5 IGNsZWFyIGNodW5nIDIwMDQvMTIvNworCS8vVUxJX1NDUl9CQVNFCQk9IDB4OTAsIC8qIHNhdGEw IHBoeSBTQ1IgcmVnaXN0ZXJzICovCisJLy9VTElfU0FUQTFfT0ZTCQk9IDB4MTAsIC8qIG9mZnNl dCBmcm9tIHNhdGEwLT5zYXRhMSBwaHkgcmVncyAqLworCVVMSTUyODdfQkFTRQkJIAkJID0gMHg5 MCwgLyogc2F0YTAgcGh5IFNDUiByZWdpc3RlcnMgKi8KKyAgICAgICAJVUxJNTI4N19PRkZTCQkg CQkgPSAweDEwLCAvKiBvZmZzZXQgZnJvbSBzYXRhMC0+c2F0YTEgcGh5IHJlZ3MgKi8KKyAgICAg ICAJVUxJNTI4MV9CQVNFCQkgCQkgPSAweDYwLCAvKiBzYXRhMCBwaHkgU0NSICByZWdpc3RlcnMg Ki8KKwlVTEk1MjgxX09GRlMJCSAJCSA9IDB4NjAsIC8qIG9mZnNldCBmcm9tIHNhdGEwLT5zYXRh MSBwaHkgcmVncyAqLworCit9OworCitzdGF0aWMgaW50IHVsaV9pbml0X29uZSAoc3RydWN0IHBj aV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpOworc3RhdGljIHUz MiB1bGlfc2NyX3JlYWQgKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGludCBzY19yZWcp Oworc3RhdGljIHZvaWQgdWxpX3Njcl93cml0ZSAoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWdu ZWQgaW50IHNjX3JlZywgdTMyIHZhbCk7CisKKy8vYWRkIGJ5IGNsZWFyIHpoYW5nIDIwMDQvMTIv MTMKK3N0YXRpYyBzdHJ1Y3QgYXRhX2RldmljZSAqYXRhX3Njc2lfZmluZF9kZXZfdWxpKHN0cnVj dCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBzY3NpX2RldmljZSAqc2NzaWRldik7CitzdGF0aWMgdW5z aWduZWQgaW50IGF0YV9zY3NpX2ZsdXNoX3hsYXRfdWxpKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAq cWMsIHU4ICpzY3NpY21kKTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYXRhX3Njc2lfdmVyaWZ5X3hs YXRfdWxpKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMsIHU4ICpzY3NpY21kKTsKK3N0YXRpYyB1 bnNpZ25lZCBpbnQgYXRhX3Njc2lfcndfeGxhdF91bGkoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpx YywgdTggKnNjc2ljbWQpOworc3RhdGljIGlubGluZSBhdGFfeGxhdF9mdW5jX3QgYXRhX2dldF94 bGF0X2Z1bmNfdWxpKHN0cnVjdCBhdGFfZGV2aWNlICpkZXYsIHU4IGNtZCk7CitzdHJ1Y3QgYXRh X3F1ZXVlZF9jbWQgKmF0YV9zY3NpX3FjX25ld191bGkoc3RydWN0IGF0YV9wb3J0ICphcCwKKwkJ CQkgICAgICAgc3RydWN0IGF0YV9kZXZpY2UgKmRldiwKKwkJCQkgICAgICAgc3RydWN0IHNjc2lf Y21uZCAqY21kLAorCQkJCSAgICAgICB2b2lkICgqZG9uZSkoc3RydWN0IHNjc2lfY21uZCAqKSk7 CitzdGF0aWMgaW50IGF0YV9zY3NpX3FjX2NvbXBsZXRlX3VsaShzdHJ1Y3QgYXRhX3F1ZXVlZF9j bWQgKnFjLCB1OCBkcnZfc3RhdCk7CitzdGF0aWMgdm9pZCBhdGFfc2NzaV90cmFuc2xhdGVfdWxp KHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfZGV2aWNlICpkZXYsCisJCQkgICAgICBz dHJ1Y3Qgc2NzaV9jbW5kICpjbWQsCisJCQkgICAgICB2b2lkICgqZG9uZSkoc3RydWN0IHNjc2lf Y21uZCAqKSwKKwkJCSAgICAgIGF0YV94bGF0X2Z1bmNfdCB4bGF0X2Z1bmMpOworc3RhdGljIHZv aWQgYXRhX3Njc2lfc2ltdWxhdGVfdWxpKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFf ZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsCisJCQkgICAgICB2 b2lkICgqZG9uZSkoc3RydWN0IHNjc2lfY21uZCAqKSk7CitzdGF0aWMgdW5zaWduZWQgaW50IGF0 YV9zY3NpX3JidWZfZ2V0X3VsaShzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsIHU4ICoqYnVmX291dCk7 CitzdGF0aWMgaW5saW5lIHZvaWQgYXRhX3Njc2lfcmJ1Zl9wdXRfdWxpKHN0cnVjdCBzY3NpX2Nt bmQgKmNtZCk7CitzdGF0aWMgaW50IGF0YXBpX3FjX2NvbXBsZXRlX3VsaShzdHJ1Y3QgYXRhX3F1 ZXVlZF9jbWQgKnFjLCB1OCBkcnZfc3RhdCk7CitzdGF0aWMgdW5zaWduZWQgaW50IGF0YXBpX3hs YXRfdWxpKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMsIHU4ICpzY3NpY21kKTsKK3N0YXRpYyBp bnQgYXRhX3Njc2lfcXVldWVjbWRfdWxpKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwgdm9pZCAoKmRv bmUpKHN0cnVjdCBzY3NpX2NtbmQgKikpOworCitzdGF0aWMgdm9pZCBhdGFfcWNfdGltZW91dF91 bGkoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYyk7CitzdGF0aWMgdm9pZCBhdGFfZW5nX3RpbWVv dXRfdWxpKHN0cnVjdCBhdGFfcG9ydCAqYXApOworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8KK3N0 cnVjdCBhdGFfc2NzaV9hcmdzIHsKKyAgICAgICAgc3RydWN0IGF0YV9wb3J0ICAgICAgICAgKmFw OworICAgICAgICBzdHJ1Y3QgYXRhX2RldmljZSAgICAgICAqZGV2OworICAgICAgICBzdHJ1Y3Qg c2NzaV9jbW5kICAgICAgICAgICAgICAgICpjbWQ7CisgICAgICAgIHZvaWQgICAgICAgICAgICAg ICAgICAgICgqZG9uZSkoc3RydWN0IHNjc2lfY21uZCAqKTsKK307CisvKiBsaWJhdGEtY29yZS5j ICovCitleHRlcm4gc3RydWN0IGF0YV9xdWV1ZWRfY21kICphdGFfcWNfbmV3X2luaXQoc3RydWN0 IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV9kZXZpY2UgKmRldik7CitleHRlcm4gaW50IGF0YV9x Y19pc3N1ZShzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKTsKKworLyogbGliYXRhLXNjc2kuYyAq LworZXh0ZXJuIHZvaWQgYXRhX3RvX3NlbnNlX2Vycm9yKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAq cWMsIHU4IGRydl9zdGF0KTsKKworZXh0ZXJuIHVuc2lnbmVkIGludCBhdGFfc2NzaW9wX2lucV9z dGQoc3RydWN0IGF0YV9zY3NpX2FyZ3MgKmFyZ3MsIHU4ICpyYnVmLCB1bnNpZ25lZCBpbnQgYnVm bGVuKTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgYXRhX3Njc2lvcF9pbnFfMDAoc3RydWN0IGF0YV9z Y3NpX2FyZ3MgKmFyZ3MsIHU4ICpyYnVmLCB1bnNpZ25lZCBpbnQgYnVmbGVuKTsKK2V4dGVybiB1 bnNpZ25lZCBpbnQgYXRhX3Njc2lvcF9pbnFfODAoc3RydWN0IGF0YV9zY3NpX2FyZ3MgKmFyZ3Ms IHU4ICpyYnVmLCB1bnNpZ25lZCBpbnQgYnVmbGVuKTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgYXRh X3Njc2lvcF9pbnFfODMoc3RydWN0IGF0YV9zY3NpX2FyZ3MgKmFyZ3MsIHU4ICpyYnVmLCB1bnNp Z25lZCBpbnQgYnVmbGVuKTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgYXRhX3Njc2lvcF9ub29wKHN0 cnVjdCBhdGFfc2NzaV9hcmdzICphcmdzLCB1OCAqcmJ1ZiwgdW5zaWduZWQgaW50IGJ1Zmxlbik7 CitleHRlcm4gdW5zaWduZWQgaW50IGF0YV9zY3Npb3BfbW9kZV9zZW5zZShzdHJ1Y3QgYXRhX3Nj c2lfYXJncyAqYXJncywgdTggKnJidWYsIHVuc2lnbmVkIGludCBidWZsZW4pOworZXh0ZXJuIHVu c2lnbmVkIGludCBhdGFfc2NzaW9wX3JlYWRfY2FwKHN0cnVjdCBhdGFfc2NzaV9hcmdzICphcmdz LCB1OCAqcmJ1ZiwgdW5zaWduZWQgaW50IGJ1Zmxlbik7CitleHRlcm4gdW5zaWduZWQgaW50IGF0 YV9zY3Npb3BfcmVwb3J0X2x1bnMoc3RydWN0IGF0YV9zY3NpX2FyZ3MgKmFyZ3MsIHU4ICpyYnVm LCB1bnNpZ25lZCBpbnQgYnVmbGVuKTsKK2V4dGVybiB2b2lkIGF0YV9zY3NpX2JhZGNtZChzdHJ1 Y3Qgc2NzaV9jbW5kICpjbWQsIHZvaWQgKCpkb25lKShzdHJ1Y3Qgc2NzaV9jbW5kICopLCB1OCBh c2MsIHU4IGFzY3EpOworZXh0ZXJuIHZvaWQgYXRhX3Njc2lfcmJ1Zl9maWxsKHN0cnVjdCBhdGFf c2NzaV9hcmdzICphcmdzLCB1bnNpZ25lZCBpbnQgKCphY3RvcikgKHN0cnVjdCBhdGFfc2NzaV9h cmdzICphcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4 ICpyYnVmLCB1bnNpZ25lZCBpbnQgYnVmbGVuKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgCitzdGF0aWMgaW5saW5lIHZvaWQgYXRhX2JhZF9zY3Npb3Aoc3Ry dWN0IHNjc2lfY21uZCAqY21kLCB2b2lkICgqZG9uZSkoc3RydWN0IHNjc2lfY21uZCAqKSk7Citz dGF0aWMgaW5saW5lIHZvaWQgYXRhX2JhZF9jZGIoc3RydWN0IHNjc2lfY21uZCAqY21kLCB2b2lk ICgqZG9uZSkoc3RydWN0IHNjc2lfY21uZCAqKSk7CitzdGF0aWMgaW5saW5lIHZvaWQgYXRhX2Jh ZF9zY3Npb3Aoc3RydWN0IHNjc2lfY21uZCAqY21kLCB2b2lkICgqZG9uZSkoc3RydWN0IHNjc2lf Y21uZCAqKSkKK3sKKyAgICAgICAgYXRhX3Njc2lfYmFkY21kKGNtZCwgZG9uZSwgMHgyMCwgMHgw MCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhdGFfYmFkX2NkYihzdHJ1Y3Qgc2NzaV9jbW5k ICpjbWQsIHZvaWQgKCpkb25lKShzdHJ1Y3Qgc2NzaV9jbW5kICopKQoreworICAgICAgICBhdGFf c2NzaV9iYWRjbWQoY21kLCBkb25lLCAweDI0LCAweDAwKTsKK30KKworc3RhdGljIHN0cnVjdCBw Y2lfZGV2aWNlX2lkIHVsaV9wY2lfdGJsW10gPSB7CisJeyBQQ0lfVkVORE9SX0lEX0FMLCAweDUy ODksIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIHVsaV81Mjg5IH0sCisJeyBQQ0lfVkVO RE9SX0lEX0FMLCAweDUyODcsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIHVsaV81Mjg3 IH0sCisJeyBQQ0lfVkVORE9SX0lEX0FMLCAweDUyODEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQs IDAsIDAsIHVsaV81MjgxIH0sCisJeyB9CS8qIHRlcm1pbmF0ZSBsaXN0ICovCit9OworCisKK3N0 YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciB1bGlfcGNpX2RyaXZlciA9IHsKKwkubmFtZQkJCT0gRFJW X05BTUUsCisJLmlkX3RhYmxlCQk9IHVsaV9wY2lfdGJsLAorCS5wcm9iZQkJCT0gdWxpX2luaXRf b25lLAorCS5yZW1vdmUJCQk9IGF0YV9wY2lfcmVtb3ZlX29uZSwKK307CisKK3N0YXRpYyBTY3Np X0hvc3RfVGVtcGxhdGUgdWxpX3NodCA9IHsKKwkubW9kdWxlCQkJPSBUSElTX01PRFVMRSwKKwku bmFtZQkJCT0gRFJWX05BTUUsCisJLmlvY3RsCQkJPSBhdGFfc2NzaV9pb2N0bCwKKwkucXVldWVj b21tYW5kCQk9IGF0YV9zY3NpX3F1ZXVlY21kX3VsaSwKKwkuZWhfc3RyYXRlZ3lfaGFuZGxlcgk9 IGF0YV9zY3NpX2Vycm9yLAorCS5jYW5fcXVldWUJCT0gQVRBX0RFRl9RVUVVRSwKKwkudGhpc19p ZAkJPSBBVEFfU0hUX1RISVNfSUQsCisJLnNnX3RhYmxlc2l6ZQkJPSBBVEFfTUFYX1BSRCwKKwku bWF4X3NlY3RvcnMJCT0gQVRBX01BWF9TRUNUT1JTLAorCS5jbWRfcGVyX2x1bgkJPSBBVEFfU0hU X0NNRF9QRVJfTFVOLAorCS5lbXVsYXRlZAkJPSBBVEFfU0hUX0VNVUxBVEVELAorCS51c2VfY2x1 c3RlcmluZwkJPSBBVEFfU0hUX1VTRV9DTFVTVEVSSU5HLAorCS5wcm9jX25hbWUJCT0gRFJWX05B TUUsCisJLmRtYV9ib3VuZGFyeQkJPSBBVEFfRE1BX0JPVU5EQVJZLAorCS5zbGF2ZV9jb25maWd1 cmUJPSBhdGFfc2NzaV9zbGF2ZV9jb25maWcsCisJLmJpb3NfcGFyYW0JCT0gYXRhX3N0ZF9iaW9z X3BhcmFtLAorfTsKKworc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIHVsaV9vcHMg PSB7CisJLnBvcnRfZGlzYWJsZQkJPSBhdGFfcG9ydF9kaXNhYmxlLAorCS50Zl9sb2FkCQk9IGF0 YV90Zl9sb2FkLAorCS50Zl9yZWFkCQk9IGF0YV90Zl9yZWFkLAorCS5jaGVja19zdGF0dXMJCT0g YXRhX2NoZWNrX3N0YXR1cywKKwkuZXhlY19jb21tYW5kCQk9IGF0YV9leGVjX2NvbW1hbmQsCisJ LmRldl9zZWxlY3QJCT0gYXRhX3N0ZF9kZXZfc2VsZWN0LAorCS5waHlfcmVzZXQJCT0gc2F0YV9w aHlfcmVzZXQsCisJLmJtZG1hX3NldHVwICAgICAgICAgICAgPSBhdGFfYm1kbWFfc2V0dXAsCisJ LmJtZG1hX3N0YXJ0ICAgICAgICAgICAgPSBhdGFfYm1kbWFfc3RhcnQsCisJLnFjX3ByZXAJCT0g YXRhX3FjX3ByZXAsCisJLnFjX2lzc3VlCQk9IGF0YV9xY19pc3N1ZV9wcm90LAorCS5lbmdfdGlt ZW91dAkJPSBhdGFfZW5nX3RpbWVvdXRfdWxpLAorCS5pcnFfaGFuZGxlcgkJPSBhdGFfaW50ZXJy dXB0LAorCS5pcnFfY2xlYXIJCT0gYXRhX2JtZG1hX2lycV9jbGVhciwKKwkuc2NyX3JlYWQJCT0g dWxpX3Njcl9yZWFkLAorCS5zY3Jfd3JpdGUJCT0gdWxpX3Njcl93cml0ZSwKKwkucG9ydF9zdGFy dAkJPSBhdGFfcG9ydF9zdGFydCwKKwkucG9ydF9zdG9wCQk9IGF0YV9wb3J0X3N0b3AsCit9Owor CitzdGF0aWMgc3RydWN0IGF0YV9wb3J0X2luZm8gdWxpX3BvcnRfaW5mbyA9IHsKKwkuc2h0CQk9 ICZ1bGlfc2h0LAorCS5ob3N0X2ZsYWdzCT0gQVRBX0ZMQUdfU0FUQSB8IEFUQV9GTEFHX1NBVEFf UkVTRVQgfAorCQkJICBBVEFfRkxBR19OT19MRUdBQ1ksCisJLnBpb19tYXNrCT0gMHgxZiwKKwku bXdkbWFfbWFzawk9IDB4NywKKwkudWRtYV9tYXNrCT0gMHg3ZiwKKwkucG9ydF9vcHMJPSAmdWxp X29wcywKK307CisKK01PRFVMRV9BVVRIT1IoIlBlZXIgQ2hlbiIpOworTU9EVUxFX0RFU0NSSVBU SU9OKCJsb3ctbGV2ZWwgZHJpdmVyIGZvciBVTGkgRWxlY3Ryb25pY3MgU0FUQSBjb250cm9sbGVy Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgdWxp X3BjaV90YmwpOworCitzdGF0aWMgdW5zaWduZWQgaW50IGdldF9zY3JfY2ZnX2FkZHIoc3RydWN0 IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50IHNjX3JlZykKK3sKKwlyZXR1cm4gYXAtPmlvYWRk ci5zY3JfYWRkciArICg0ICogc2NfcmVnKTsKK30KKworc3RhdGljIHUzMiB1bGlfc2NyX2NmZ19y ZWFkIChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgc2NfcmVnKQoreworCXVuc2ln bmVkIGludCBjZmdfYWRkciA9IGdldF9zY3JfY2ZnX2FkZHIoYXAsIHNjX3JlZyk7CisJdTMyIHZh bDsKKworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChhcC0+aG9zdF9zZXQtPnBkZXYsIGNmZ19hZGRy LCAmdmFsKTsKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgdm9pZCB1bGlfc2NyX2NmZ193cml0 ZSAoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50IHNjciwgdTMyIHZhbCkKK3sKKwl1 bnNpZ25lZCBpbnQgY2ZnX2FkZHIgPSBnZXRfc2NyX2NmZ19hZGRyKGFwLCBzY3IpOworCisJcGNp X3dyaXRlX2NvbmZpZ19kd29yZChhcC0+aG9zdF9zZXQtPnBkZXYsIGNmZ19hZGRyLCB2YWwpOwor fQorCitzdGF0aWMgdTMyIHVsaV9zY3JfcmVhZCAoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWdu ZWQgaW50IHNjX3JlZykKK3sKKwlpZiAoc2NfcmVnID4gU0NSX0NPTlRST0wpCisJCXJldHVybiAw eGZmZmZmZmZmVTsKKworCXJldHVybiB1bGlfc2NyX2NmZ19yZWFkKGFwLCBzY19yZWcpOworfQor CitzdGF0aWMgdm9pZCB1bGlfc2NyX3dyaXRlIChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25l ZCBpbnQgc2NfcmVnLCB1MzIgdmFsKQoreworCWlmIChzY19yZWcgPiBTQ1JfQ09OVFJPTCkJLy9T Q1JfQ09OVFJPTD0yLCBTQ1JfRVJST1I9MSwgU0NSX1NUQVRVUz0wCisJCXJldHVybjsKKworCXVs aV9zY3JfY2ZnX3dyaXRlKGFwLCBzY19yZWcsIHZhbCk7Cit9CisKKy8qIG1vdmUgdG8gUENJIGxh eWVyLCBpbnRlZ3JhdGUgdy8gTVNJIHN0dWZmICovCitzdGF0aWMgdm9pZCBwY2lfZW5hYmxlX2lu dHgoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJdTE2IHBjaV9jb21tYW5kOworCisJcGNpX3Jl YWRfY29uZmlnX3dvcmQocGRldiwgUENJX0NPTU1BTkQsICZwY2lfY29tbWFuZCk7CisJaWYgKHBj aV9jb21tYW5kICYgUENJX0NPTU1BTkRfSU5UWF9ESVNBQkxFKSB7CisJCXBjaV9jb21tYW5kICY9 IH5QQ0lfQ09NTUFORF9JTlRYX0RJU0FCTEU7CisJCXBjaV93cml0ZV9jb25maWdfd29yZChwZGV2 LCBQQ0lfQ09NTUFORCwgcGNpX2NvbW1hbmQpOworCX0KK30KKworc3RhdGljIGludCB1bGlfaW5p dF9vbmUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAq ZW50KQoreworCXN0cnVjdCBhdGFfcHJvYmVfZW50ICpwcm9iZV9lbnQgPSBOVUxMOworCWludCBy YzsKKwl1bnNpZ25lZCBpbnQgYm9hcmRfaWR4ID0gKHVuc2lnbmVkIGludCkgZW50LT5kcml2ZXJf ZGF0YTsKKwlzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqcHBpOworCQkKKwlyYyA9IHBjaV9lbmFibGVf ZGV2aWNlKHBkZXYpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJcmMgPSBwY2lfcmVxdWVz dF9yZWdpb25zKHBkZXYsIERSVl9OQU1FKTsKKwlpZiAocmMpCisJCWdvdG8gZXJyX291dDsKKwor CXJjID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBBVEFfRE1BX01BU0spOworCWlmIChyYykKKwkJ Z290byBlcnJfb3V0X3JlZ2lvbnM7CisJcmMgPSBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2so cGRldiwgQVRBX0RNQV9NQVNLKTsKKwlpZiAocmMpCisJCWdvdG8gZXJyX291dF9yZWdpb25zOwor CisJcHBpID0gJnVsaV9wb3J0X2luZm87CisJcHJvYmVfZW50ID0gYXRhX3BjaV9pbml0X25hdGl2 ZV9tb2RlKHBkZXYsICZwcGkpOworCQorCWlmICghcHJvYmVfZW50KSB7CisJCXJjID0gLUVOT01F TTsKKwkJZ290byBlcnJfb3V0X3JlZ2lvbnM7CisJfQorCisJc3dpdGNoIChib2FyZF9pZHgpIHsK KwljYXNlIHVsaV81Mjg3OgorCQlwcm9iZV9lbnQtPnBvcnRbMF0uc2NyX2FkZHIgPSBVTEk1Mjg3 X0JBU0U7CisJCXByb2JlX2VudC0+cG9ydFsxXS5zY3JfYWRkciA9IFVMSTUyODdfQkFTRSArIFVM STUyODdfT0ZGUzsKKyAgICAgICAgCXByb2JlX2VudC0+bl9wb3J0cyA9IDQ7CisgCisgICAgICAg IAlwcm9iZV9lbnQtPnBvcnRbMl0uY21kX2FkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwg MCkgKyA4OworCQlwcm9iZV9lbnQtPnBvcnRbMl0uYWx0c3RhdHVzX2FkZHIgPQorIAkJcHJvYmVf ZW50LT5wb3J0WzJdLmN0bF9hZGRyID0KKyAJCQkJIChwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwg MSkgfCBBVEFfUENJX0NUTF9PRlMpICsgNDsKKyAJCXByb2JlX2VudC0+cG9ydFsyXS5ibWRtYV9h ZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDQpICsgMTY7CisgCQlwcm9iZV9lbnQtPnBv cnRbMl0uc2NyX2FkZHIgPSBVTEk1Mjg3X0JBU0UgKyBVTEk1Mjg3X09GRlMqNDsKKworIAkJcHJv YmVfZW50LT5wb3J0WzNdLmNtZF9hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDIpICsg ODsKKyAJCXByb2JlX2VudC0+cG9ydFszXS5hbHRzdGF0dXNfYWRkciA9CisgCQlwcm9iZV9lbnQt PnBvcnRbM10uY3RsX2FkZHIgPQorIAkJCQkgKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAzKSB8 IEFUQV9QQ0lfQ1RMX09GUykgKyA0OworIAkJcHJvYmVfZW50LT5wb3J0WzNdLmJtZG1hX2FkZHIg PSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgNCkgKyAyNDsKKyAJCXByb2JlX2VudC0+cG9ydFsz XS5zY3JfYWRkciA9IFVMSTUyODdfQkFTRSArIFVMSTUyODdfT0ZGUyo1OworCisgCQlhdGFfc3Rk X3BvcnRzKCZwcm9iZV9lbnQtPnBvcnRbMl0pOworIAkJYXRhX3N0ZF9wb3J0cygmcHJvYmVfZW50 LT5wb3J0WzNdKTsKKyAJCWJyZWFrOworCQkKKwljYXNlIHVsaV81Mjg5OgorICAgICAgIAlwcm9i ZV9lbnQtPnBvcnRbMF0uc2NyX2FkZHIgPSBVTEk1Mjg3X0JBU0U7CisJCXByb2JlX2VudC0+cG9y dFsxXS5zY3JfYWRkciA9IFVMSTUyODdfQkFTRSArIFVMSTUyODdfT0ZGUzsKKwkJYnJlYWs7CisK KwljYXNlIHVsaV81MjgxOgorCSAJcHJvYmVfZW50LT5wb3J0WzBdLnNjcl9hZGRyID0gVUxJNTI4 MV9CQVNFOworIAkJcHJvYmVfZW50LT5wb3J0WzFdLnNjcl9hZGRyID0gVUxJNTI4MV9CQVNFICsg VUxJNTI4MV9PRkZTOworIAkJYnJlYWs7CisJCQorCWRlZmF1bHQ6CisJCUJVRygpOworCQlicmVh azsKKwl9CisJcGNpX3NldF9tYXN0ZXIocGRldik7CisJcGNpX2VuYWJsZV9pbnR4KHBkZXYpOwor CisJLyogRklYTUU6IGNoZWNrIGF0YV9kZXZpY2VfYWRkIHJldHVybiB2YWx1ZSAqLworCWF0YV9k ZXZpY2VfYWRkKHByb2JlX2VudCk7CisJa2ZyZWUocHJvYmVfZW50KTsKKworCXJldHVybiAwOwor CitlcnJfb3V0X3JlZ2lvbnM6CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKworZXJyX291 dDoKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJcmV0dXJuIHJjOworCit9CisKK3N0YXRp YyBpbnQgX19pbml0IHVsaV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgm dWxpX3BjaV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgdWxpX2V4aXQodm9pZCkK K3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnVsaV9wY2lfZHJpdmVyKTsKK30KKworLy9hZGQg YnkgY2xlYXIgemhhbmcgMjAwNC8xMi8xMworCisvKioKKyAqCWF0YV9zY3NpX2ZpbmRfZGV2X3Vs aSAtIGxvb2t1cCBhdGFfZGV2aWNlIGZyb20gc2NzaV9jbW5kCisgKglAYXA6IEFUQSBwb3J0IHRv IHdoaWNoIHRoZSBkZXZpY2UgaXMgYXR0YWNoZWQKKyAqCUBjbWQ6IFNDU0kgY29tbWFuZCB0byBi ZSBzZW50IHRvIHRoZSBkZXZpY2UKKyAqCisgKglHaXZlbiB2YXJpb3VzIGluZm9ybWF0aW9uIHBy b3ZpZGVkIGluIHN0cnVjdCBzY3NpX2NtbmQsCisgKgltYXAgdGhhdCBvbnRvIGFuIEFUQSBidXMs IGFuZCB1c2luZyB0aGF0IG1hcHBpbmcKKyAqCWRldGVybWluZSB3aGljaCBhdGFfZGV2aWNlIGlz IGFzc29jaWF0ZWQgd2l0aCB0aGUKKyAqCVNDU0kgY29tbWFuZCB0byBiZSBzZW50LgorICoKKyAq CUxPQ0tJTkc6CisgKglzcGluX2xvY2tfaXJxc2F2ZShob3N0X3NldCBsb2NrKQorICoKKyAqCVJF VFVSTlM6CisgKglBc3NvY2lhdGVkIEFUQSBkZXZpY2UsIG9yICVOVUxMIGlmIG5vdCBmb3VuZC4K KyAqLworCitzdGF0aWMgc3RydWN0IGF0YV9kZXZpY2UgKgorYXRhX3Njc2lfZmluZF9kZXZfdWxp KHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBzY3NpX2RldmljZSAqc2NzaWRldikKK3sKKwlz dHJ1Y3QgYXRhX2RldmljZSAqZGV2OworCisJLyogc2tpcCBjb21tYW5kcyBub3QgYWRkcmVzc2Vk IHRvIHRhcmdldHMgd2Ugc2ltdWxhdGUgKi8KKwlpZiAobGlrZWx5KHNjc2lkZXYtPmlkIDwgQVRB X01BWF9ERVZJQ0VTKSkKKwkJZGV2ID0gJmFwLT5kZXZpY2Vbc2NzaWRldi0+aWRdOworCWVsc2UK KwkJcmV0dXJuIE5VTEw7CisKKwlpZiAodW5saWtlbHkoKHNjc2lkZXYtPmNoYW5uZWwgIT0gMCkg fHwKKwkJICAgICAoc2NzaWRldi0+bHVuICE9IDApKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAo dW5saWtlbHkoIWF0YV9kZXZfcHJlc2VudChkZXYpKSkKKwkJcmV0dXJuIE5VTEw7CisKKyNpZm5k ZWYgQVRBX0VOQUJMRV9BVEFQSQorCWlmICh1bmxpa2VseShkZXYtPmNsYXNzID09IEFUQV9ERVZf QVRBUEkpKQorCQlyZXR1cm4gTlVMTDsKKyNlbmRpZgorCisJcmV0dXJuIGRldjsKK30KKworLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vCisvKioKKyAqCWF0YV9zY3NpX2ZsdXNoX3hsYXRfdWxpIC0gVHJhbnNsYXRlIFNDU0kg U1lOQ0hST05JWkUgQ0FDSEUgY29tbWFuZAorICoJQHFjOiBTdG9yYWdlIGZvciB0cmFuc2xhdGVk IEFUQSB0YXNrZmlsZQorICoJQHNjc2ljbWQ6IFNDU0kgY29tbWFuZCB0byB0cmFuc2xhdGUgKGln bm9yZWQpCisgKgorICoJU2V0cyB1cCBhbiBBVEEgdGFza2ZpbGUgdG8gaXNzdWUgRkxVU0ggQ0FD SEUgb3IKKyAqCUZMVVNIIENBQ0hFIEVYVC4KKyAqCisgKglMT0NLSU5HOgorICoJc3Bpbl9sb2Nr X2lycXNhdmUoaG9zdF9zZXQgbG9jaykKKyAqCisgKglSRVRVUk5TOgorICoJWmVybyBvbiBzdWNj ZXNzLCBub24temVybyBvbiBlcnJvci4KKyAqLworCitzdGF0aWMgdW5zaWduZWQgaW50IGF0YV9z Y3NpX2ZsdXNoX3hsYXRfdWxpKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMsIHU4ICpzY3NpY21k KQoreworCXN0cnVjdCBhdGFfdGFza2ZpbGUgKnRmID0gJnFjLT50ZjsKKworCXRmLT5mbGFncyB8 PSBBVEFfVEZMQUdfREVWSUNFOworCXRmLT5wcm90b2NvbCA9IEFUQV9QUk9UX05PREFUQTsKKwor CWlmICgodGYtPmZsYWdzICYgQVRBX1RGTEFHX0xCQTQ4KSAmJgorCSAgICAoYXRhX2lkX2hhc19m bHVzaF9leHQocWMtPmRldikpKQorCQl0Zi0+Y29tbWFuZCA9IEFUQV9DTURfRkxVU0hfRVhUOwor CWVsc2UKKwkJdGYtPmNvbW1hbmQgPSBBVEFfQ01EX0ZMVVNIOworCisJcmV0dXJuIDA7Cit9CisK Ky8qKgorICoJYXRhX3Njc2lfdmVyaWZ5X3hsYXRfdWxpIC0gVHJhbnNsYXRlIFNDU0kgVkVSSUZZ IGNvbW1hbmQgaW50byBhbiBBVEEgb25lCisgKglAcWM6IFN0b3JhZ2UgZm9yIHRyYW5zbGF0ZWQg QVRBIHRhc2tmaWxlCisgKglAc2NzaWNtZDogU0NTSSBjb21tYW5kIHRvIHRyYW5zbGF0ZQorICoK KyAqCUNvbnZlcnRzIFNDU0kgVkVSSUZZIGNvbW1hbmQgdG8gYW4gQVRBIFJFQUQgVkVSSUZZIGNv bW1hbmQuCisgKgorICoJTE9DS0lORzoKKyAqCXNwaW5fbG9ja19pcnFzYXZlKGhvc3Rfc2V0IGxv Y2spCisgKgorICoJUkVUVVJOUzoKKyAqCVplcm8gb24gc3VjY2Vzcywgbm9uLXplcm8gb24gZXJy b3IuCisgKi8KKworc3RhdGljIHVuc2lnbmVkIGludCBhdGFfc2NzaV92ZXJpZnlfeGxhdF91bGko c3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYywgdTggKnNjc2ljbWQpCit7CisJc3RydWN0IGF0YV90 YXNrZmlsZSAqdGYgPSAmcWMtPnRmOworCXVuc2lnbmVkIGludCBsYmE0OCA9IHRmLT5mbGFncyAm IEFUQV9URkxBR19MQkE0ODsKKwl1NjQgZGV2X3NlY3RvcnMgPSBxYy0+ZGV2LT5uX3NlY3RvcnM7 CisJdTY0IHNlY3QgPSAwOworCXUzMiBuX3NlY3QgPSAwOworCisJdGYtPmZsYWdzIHw9IEFUQV9U RkxBR19JU0FERFIgfCBBVEFfVEZMQUdfREVWSUNFOworCXRmLT5wcm90b2NvbCA9IEFUQV9QUk9U X05PREFUQTsKKwl0Zi0+ZGV2aWNlIHw9IEFUQV9MQkE7CisKKwlpZiAoc2NzaWNtZFswXSA9PSBW RVJJRlkpIHsKKwkJc2VjdCB8PSAoKHU2NClzY3NpY21kWzJdKSA8PCAyNDsKKwkJc2VjdCB8PSAo KHU2NClzY3NpY21kWzNdKSA8PCAxNjsKKwkJc2VjdCB8PSAoKHU2NClzY3NpY21kWzRdKSA8PCA4 OworCQlzZWN0IHw9ICgodTY0KXNjc2ljbWRbNV0pOworCisJCW5fc2VjdCB8PSAoKHUzMilzY3Np Y21kWzddKSA8PCA4OworCQluX3NlY3QgfD0gKCh1MzIpc2NzaWNtZFs4XSk7CisJfQorCisJZWxz ZSBpZiAoc2NzaWNtZFswXSA9PSBWRVJJRllfMTYpIHsKKwkJc2VjdCB8PSAoKHU2NClzY3NpY21k WzJdKSA8PCA1NjsKKwkJc2VjdCB8PSAoKHU2NClzY3NpY21kWzNdKSA8PCA0ODsKKwkJc2VjdCB8 PSAoKHU2NClzY3NpY21kWzRdKSA8PCA0MDsKKwkJc2VjdCB8PSAoKHU2NClzY3NpY21kWzVdKSA8 PCAzMjsKKwkJc2VjdCB8PSAoKHU2NClzY3NpY21kWzZdKSA8PCAyNDsKKwkJc2VjdCB8PSAoKHU2 NClzY3NpY21kWzddKSA8PCAxNjsKKwkJc2VjdCB8PSAoKHU2NClzY3NpY21kWzhdKSA8PCA4Owor CQlzZWN0IHw9ICgodTY0KXNjc2ljbWRbOV0pOworCisJCW5fc2VjdCB8PSAoKHUzMilzY3NpY21k WzEwXSkgPDwgMjQ7CisJCW5fc2VjdCB8PSAoKHUzMilzY3NpY21kWzExXSkgPDwgMTY7CisJCW5f c2VjdCB8PSAoKHUzMilzY3NpY21kWzEyXSkgPDwgODsKKwkJbl9zZWN0IHw9ICgodTMyKXNjc2lj bWRbMTNdKTsKKwl9CisKKwllbHNlCisJCXJldHVybiAxOworCisJaWYgKCFuX3NlY3QpCisJCXJl dHVybiAxOworCWlmIChzZWN0ID49IGRldl9zZWN0b3JzKQorCQlyZXR1cm4gMTsKKwlpZiAoKHNl Y3QgKyBuX3NlY3QpID4gZGV2X3NlY3RvcnMpCisJCXJldHVybiAxOworCWlmIChsYmE0OCkgewor CQlpZiAobl9zZWN0ID4gKDY0ICogMTAyNCkpCisJCQlyZXR1cm4gMTsKKwl9IGVsc2UgeworCQlp ZiAobl9zZWN0ID4gMjU2KQorCQkJcmV0dXJuIDE7CisJfQorCisJaWYgKGxiYTQ4KSB7CisJCXRm LT5ob2JfbnNlY3QgPSAobl9zZWN0ID4+IDgpICYgMHhmZjsKKworCQl0Zi0+aG9iX2xiYWggPSAo c2VjdCA+PiA0MCkgJiAweGZmOworCQl0Zi0+aG9iX2xiYW0gPSAoc2VjdCA+PiAzMikgJiAweGZm OworCQl0Zi0+aG9iX2xiYWwgPSAoc2VjdCA+PiAyNCkgJiAweGZmOworCX0gZWxzZQorCQl0Zi0+ ZGV2aWNlIHw9IChzZWN0ID4+IDI0KSAmIDB4ZjsKKworCXRmLT5uc2VjdCA9IG5fc2VjdCAmIDB4 ZmY7CisKKwl0Zi0+aG9iX2xiYWggPSAoc2VjdCA+PiAxNikgJiAweGZmOworCXRmLT5ob2JfbGJh bSA9IChzZWN0ID4+IDgpICYgMHhmZjsKKwl0Zi0+aG9iX2xiYWwgPSBzZWN0ICYgMHhmZjsKKwor CXJldHVybiAwOworfQorCisvKioKKyAqCWF0YV9zY3NpX3J3X3hsYXRfdWxpIC0gVHJhbnNsYXRl IFNDU0kgci93IGNvbW1hbmQgaW50byBhbiBBVEEgb25lCisgKglAcWM6IFN0b3JhZ2UgZm9yIHRy YW5zbGF0ZWQgQVRBIHRhc2tmaWxlCisgKglAc2NzaWNtZDogU0NTSSBjb21tYW5kIHRvIHRyYW5z bGF0ZQorICoKKyAqCUNvbnZlcnRzIGFueSBvZiBzaXggU0NTSSByZWFkL3dyaXRlIGNvbW1hbmRz IGludG8gdGhlCisgKglBVEEgY291bnRlcnBhcnQsIGluY2x1ZGluZyBzdGFydGluZyBzZWN0b3Ig KExCQSksCisgKglzZWN0b3IgY291bnQsIGFuZCB0YWtpbmcgaW50byBhY2NvdW50IHRoZSBkZXZp Y2UncyBMQkE0OAorICoJc3VwcG9ydC4KKyAqCisgKglDb21tYW5kcyAlUkVBRF82LCAlUkVBRF8x MCwgJVJFQURfMTYsICVXUklURV82LCAlV1JJVEVfMTAsIGFuZAorICoJJVdSSVRFXzE2IGFyZSBj dXJyZW50bHkgc3VwcG9ydGVkLgorICoKKyAqCUxPQ0tJTkc6CisgKglzcGluX2xvY2tfaXJxc2F2 ZShob3N0X3NldCBsb2NrKQorICoKKyAqCVJFVFVSTlM6CisgKglaZXJvIG9uIHN1Y2Nlc3MsIG5v bi16ZXJvIG9uIGVycm9yLgorICovCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYXRhX3Njc2lfcndf eGxhdF91bGkoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYywgdTggKnNjc2ljbWQpCit7CisJc3Ry dWN0IGF0YV90YXNrZmlsZSAqdGYgPSAmcWMtPnRmOworCXVuc2lnbmVkIGludCBsYmE0OCA9IHRm LT5mbGFncyAmIEFUQV9URkxBR19MQkE0ODsKKworCXRmLT5mbGFncyB8PSBBVEFfVEZMQUdfSVNB RERSIHwgQVRBX1RGTEFHX0RFVklDRTsKKwl0Zi0+cHJvdG9jb2wgPSBxYy0+ZGV2LT54ZmVyX3By b3RvY29sOworCXRmLT5kZXZpY2UgfD0gQVRBX0xCQTsKKworCWlmIChzY3NpY21kWzBdID09IFJF QURfMTAgfHwgc2NzaWNtZFswXSA9PSBSRUFEXzYgfHwKKwkgICAgc2NzaWNtZFswXSA9PSBSRUFE XzE2KSB7CisJCXRmLT5jb21tYW5kID0gcWMtPmRldi0+cmVhZF9jbWQ7CisJfSBlbHNlIHsKKwkJ dGYtPmNvbW1hbmQgPSBxYy0+ZGV2LT53cml0ZV9jbWQ7CisJCXRmLT5mbGFncyB8PSBBVEFfVEZM QUdfV1JJVEU7CisJfQorCisJaWYgKHNjc2ljbWRbMF0gPT0gUkVBRF8xMCB8fCBzY3NpY21kWzBd ID09IFdSSVRFXzEwKSB7CisJCWlmIChsYmE0OCkgeworCQkJdGYtPmhvYl9uc2VjdCA9IHNjc2lj bWRbN107CisJCQl0Zi0+aG9iX2xiYWwgPSBzY3NpY21kWzJdOworCisJCQlxYy0+bnNlY3QgPSAo KHVuc2lnbmVkIGludClzY3NpY21kWzddIDw8IDgpIHwKKwkJCQkJc2NzaWNtZFs4XTsKKwkJfSBl bHNlIHsKKwkJCS8qIGlmIHdlIGRvbid0IHN1cHBvcnQgTEJBNDggYWRkcmVzc2luZywgdGhlIHJl cXVlc3QKKwkJCSAqIC1tYXktIGJlIHRvbyBsYXJnZS4gKi8KKwkJCWlmICgoc2NzaWNtZFsyXSAm IDB4ZjApIHx8IHNjc2ljbWRbN10pCisJCQkJcmV0dXJuIDE7CisKKwkJCS8qIHN0b3JlcyBMQkEy NzoyNCBpbiBsb3dlciA0IGJpdHMgb2YgZGV2aWNlIHJlZyAqLworCQkJdGYtPmRldmljZSB8PSBz Y3NpY21kWzJdOworCisJCQlxYy0+bnNlY3QgPSBzY3NpY21kWzhdOworCQl9CisKKwkJdGYtPm5z ZWN0ID0gc2NzaWNtZFs4XTsKKwkJdGYtPmxiYWwgPSBzY3NpY21kWzVdOworCQl0Zi0+bGJhbSA9 IHNjc2ljbWRbNF07CisJCXRmLT5sYmFoID0gc2NzaWNtZFszXTsKKworCQlWUFJJTlRLKCJ0ZW4t Ynl0ZSBjb21tYW5kXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHNjc2ljbWRbMF0gPT0g UkVBRF82IHx8IHNjc2ljbWRbMF0gPT0gV1JJVEVfNikgeworCQlxYy0+bnNlY3QgPSB0Zi0+bnNl Y3QgPSBzY3NpY21kWzRdOworCQl0Zi0+bGJhbCA9IHNjc2ljbWRbM107CisJCXRmLT5sYmFtID0g c2NzaWNtZFsyXTsKKwkJdGYtPmxiYWggPSBzY3NpY21kWzFdICYgMHgxZjsgLyogbWFzayBvdXQg cmVzZXJ2ZWQgYml0cyAqLworCisJCVZQUklOVEsoInNpeC1ieXRlIGNvbW1hbmRcbiIpOworCQly ZXR1cm4gMDsKKwl9CisKKwlpZiAoc2NzaWNtZFswXSA9PSBSRUFEXzE2IHx8IHNjc2ljbWRbMF0g PT0gV1JJVEVfMTYpIHsKKwkJLyogcnVsZSBvdXQgaW1wb3NzaWJsZSBMQkFzIGFuZCBzZWN0b3Ig Y291bnRzICovCisJCWlmIChzY3NpY21kWzJdIHx8IHNjc2ljbWRbM10gfHwgc2NzaWNtZFsxMF0g fHwgc2NzaWNtZFsxMV0pCisJCQlyZXR1cm4gMTsKKworCQlpZiAobGJhNDgpIHsKKwkJCXRmLT5o b2JfbnNlY3QgPSBzY3NpY21kWzEyXTsKKwkJCXRmLT5ob2JfbGJhbCA9IHNjc2ljbWRbNl07CisJ CQl0Zi0+aG9iX2xiYW0gPSBzY3NpY21kWzVdOworCQkJdGYtPmhvYl9sYmFoID0gc2NzaWNtZFs0 XTsKKworCQkJcWMtPm5zZWN0ID0gKCh1bnNpZ25lZCBpbnQpc2NzaWNtZFsxMl0gPDwgOCkgfAor CQkJCQlzY3NpY21kWzEzXTsKKwkJfSBlbHNlIHsKKwkJCS8qIG9uY2UgYWdhaW4sIGZpbHRlciBv dXQgaW1wb3NzaWJsZSBub24temVybyB2YWx1ZXMgKi8KKwkJCWlmIChzY3NpY21kWzRdIHx8IHNj c2ljbWRbNV0gfHwgc2NzaWNtZFsxMl0gfHwKKwkJCSAgICAoc2NzaWNtZFs2XSAmIDB4ZjApKQor CQkJCXJldHVybiAxOworCisJCQkvKiBzdG9yZXMgTEJBMjc6MjQgaW4gbG93ZXIgNCBiaXRzIG9m IGRldmljZSByZWcgKi8KKwkJCXRmLT5kZXZpY2UgfD0gc2NzaWNtZFsyXTsKKworCQkJcWMtPm5z ZWN0ID0gc2NzaWNtZFsxM107CisJCX0KKworCQl0Zi0+bnNlY3QgPSBzY3NpY21kWzEzXTsKKwkJ dGYtPmxiYWwgPSBzY3NpY21kWzldOworCQl0Zi0+bGJhbSA9IHNjc2ljbWRbOF07CisJCXRmLT5s YmFoID0gc2NzaWNtZFs3XTsKKworCQlWUFJJTlRLKCJzaXh0ZWVuLWJ5dGUgY29tbWFuZFxuIik7 CisJCXJldHVybiAwOworCX0KKworCURQUklOVEsoIm5vLWJ5dGUgY29tbWFuZFxuIik7CisJcmV0 dXJuIDE7Cit9CisKKy8qKgorICoJYXRhX2dldF94bGF0X2Z1bmNfdWxpIC0gY2hlY2sgaWYgU0NT SSB0byBBVEEgdHJhbnNsYXRpb24gaXMgcG9zc2libGUKKyAqCUBkZXY6IEFUQSBkZXZpY2UKKyAq CUBjbWQ6IFNDU0kgY29tbWFuZCBvcGNvZGUgdG8gY29uc2lkZXIKKyAqCisgKglMb29rIHVwIHRo ZSBTQ1NJIGNvbW1hbmQgZ2l2ZW4sIGFuZCBkZXRlcm1pbmUgd2hldGhlciB0aGUKKyAqCVNDU0kg Y29tbWFuZCBpcyB0byBiZSB0cmFuc2xhdGVkIG9yIHNpbXVsYXRlZC4KKyAqCisgKglSRVRVUk5T OgorICoJUG9pbnRlciB0byB0cmFuc2xhdGlvbiBmdW5jdGlvbiBpZiBwb3NzaWJsZSwgJU5VTEwg aWYgbm90LgorICovCisKK3N0YXRpYyBpbmxpbmUgYXRhX3hsYXRfZnVuY190IGF0YV9nZXRfeGxh dF9mdW5jX3VsaShzdHJ1Y3QgYXRhX2RldmljZSAqZGV2LCB1OCBjbWQpCit7CisJc3dpdGNoIChj bWQpIHsKKwljYXNlIFJFQURfNjoKKwljYXNlIFJFQURfMTA6CisJY2FzZSBSRUFEXzE2OgorCisJ Y2FzZSBXUklURV82OgorCWNhc2UgV1JJVEVfMTA6CisJY2FzZSBXUklURV8xNjoKKwkJcmV0dXJu IGF0YV9zY3NpX3J3X3hsYXRfdWxpOworCisJY2FzZSBTWU5DSFJPTklaRV9DQUNIRToKKwkJaWYg KGF0YV90cnlfZmx1c2hfY2FjaGUoZGV2KSkKKwkJCXJldHVybiBhdGFfc2NzaV9mbHVzaF94bGF0 X3VsaTsKKwkJYnJlYWs7CisKKwljYXNlIFZFUklGWToKKwljYXNlIFZFUklGWV8xNjoKKwkJcmV0 dXJuIGF0YV9zY3NpX3ZlcmlmeV94bGF0X3VsaTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLworCisvKioKKyAqCWF0YV9zY3NpX3FjX25ld191bGkgLSBhY3F1aXJlIG5ldyBhdGFfcXVl dWVkX2NtZCByZWZlcmVuY2UKKyAqCUBhcDogQVRBIHBvcnQgdG8gd2hpY2ggdGhlIG5ldyBjb21t YW5kIGlzIGF0dGFjaGVkCisgKglAZGV2OiBBVEEgZGV2aWNlIHRvIHdoaWNoIHRoZSBuZXcgY29t bWFuZCBpcyBhdHRhY2hlZAorICoJQGNtZDogU0NTSSBjb21tYW5kIHRoYXQgb3JpZ2luYXRlZCB0 aGlzIEFUQSBjb21tYW5kCisgKglAZG9uZTogU0NTSSBjb21tYW5kIGNvbXBsZXRpb24gZnVuY3Rp b24KKyAqCisgKglPYnRhaW4gYSByZWZlcmVuY2UgdG8gYW4gdW51c2VkIGF0YV9xdWV1ZWRfY21k IHN0cnVjdHVyZSwKKyAqCXdoaWNoIGlzIHRoZSBiYXNpYyBsaWJhdGEgc3RydWN0dXJlIHJlcHJl c2VudGluZyBhIHNpbmdsZQorICoJQVRBIGNvbW1hbmQgc2VudCB0byB0aGUgaGFyZHdhcmUuCisg KgorICoJSWYgYSBjb21tYW5kIHdhcyBhdmFpbGFibGUsIGZpbGwgaW4gdGhlIFNDU0ktc3BlY2lm aWMKKyAqCXBvcnRpb25zIG9mIHRoZSBzdHJ1Y3R1cmUgd2l0aCBpbmZvcm1hdGlvbiBvbiB0aGUK KyAqCWN1cnJlbnQgY29tbWFuZC4KKyAqCisgKglMT0NLSU5HOgorICoJc3Bpbl9sb2NrX2lycXNh dmUoaG9zdF9zZXQgbG9jaykKKyAqCisgKglSRVRVUk5TOgorICoJQ29tbWFuZCBhbGxvY2F0ZWQs IG9yICVOVUxMIGlmIG5vbmUgYXZhaWxhYmxlLgorICovCitzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQg KmF0YV9zY3NpX3FjX25ld191bGkoc3RydWN0IGF0YV9wb3J0ICphcCwKKwkJCQkgICAgICAgc3Ry dWN0IGF0YV9kZXZpY2UgKmRldiwKKwkJCQkgICAgICAgc3RydWN0IHNjc2lfY21uZCAqY21kLAor CQkJCSAgICAgICB2b2lkICgqZG9uZSkoc3RydWN0IHNjc2lfY21uZCAqKSkKK3sKKwlzdHJ1Y3Qg YXRhX3F1ZXVlZF9jbWQgKnFjOworCisJcWMgPSBhdGFfcWNfbmV3X2luaXQoYXAsIGRldik7CisJ aWYgKHFjKSB7CisJCXFjLT5zY3NpY21kID0gY21kOworCQlxYy0+c2NzaWRvbmUgPSBkb25lOwor CisJCWlmIChjbWQtPnVzZV9zZykgeworCQkJcWMtPnNnID0gKHN0cnVjdCBzY2F0dGVybGlzdCAq KSBjbWQtPnJlcXVlc3RfYnVmZmVyOworCQkJcWMtPm5fZWxlbSA9IGNtZC0+dXNlX3NnOworCQl9 IGVsc2UgeworCQkJcWMtPnNnID0gJnFjLT5zZ2VudDsKKwkJCXFjLT5uX2VsZW0gPSAxOworCQl9 CisJfSBlbHNlIHsKKwkJY21kLT5yZXN1bHQgPSAoRElEX09LIDw8IDE2KSB8IChRVUVVRV9GVUxM IDw8IDEpOworCQlkb25lKGNtZCk7CisJfQorCisJcmV0dXJuIHFjOworfQorLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v CisKK3N0YXRpYyBpbnQgYXRhX3Njc2lfcWNfY29tcGxldGVfdWxpKHN0cnVjdCBhdGFfcXVldWVk X2NtZCAqcWMsIHU4IGRydl9zdGF0KQoreworCXN0cnVjdCBzY3NpX2NtbmQgKmNtZCA9IHFjLT5z Y3NpY21kOworCQorCS8vIGFkZCBieSBjbGVhciBjaGV1bmcgMjAwNC8xMi83IGZvciBVTGkgTTUy ODEgd29ya2Fyb3VkCQorCWlmKHFjLT5hcC0+aG9zdF9zZXQtPnBkZXYtPnZlbmRvcj09MHgxMGI5 ICYmCisJCXFjLT5hcC0+aG9zdF9zZXQtPnBkZXYtPmRldmljZT09MHg1MjgxKQorCXsKKwkJCisJ CXN0cnVjdCBwY2lfZGV2ICpwZGV2X201MjgxPXFjLT5hcC0+aG9zdF9zZXQtPnBkZXY7CisJCXU4 IG01MjgxX3JldmlzaW9uOworCQkKKwkJY21kLT5yZXN1bHQgPSBTQU1fU1RBVF9HT09EOworCQkJ ICAgICAgICAgICAgICAKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldl9tNTI4MSwgUENJX1JF VklTSU9OX0lELCAmbTUyODFfcmV2aXNpb24pOworCQkvL3ByaW50aygibTUyODFfcmV2aXNpb249 MHgleFxuIixtNTI4MV9yZXZpc2lvbik7CisJCS8vdmVyc2lvbiAweGEwLDB4YTEsMHhiMSBuZWVk IHdvcmthcm91ZAkKKwkJaWYobTUyODFfcmV2aXNpb249PTB4YTAgfHxtNTI4MV9yZXZpc2lvbj09 MHhhMSB8fG01MjgxX3JldmlzaW9uPT0weGIxICkKKwkJeworCQkJdTE2IGVycm9yX201MjgxOwor CQkJdW5zaWduZWQgbG9uZwlzY3JfYWRkcl9tNTI4MSA9IHFjLT5hcC0+aW9hZGRyLnNjcl9hZGRy OworCQkJCisJCQlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2X201MjgxLHNjcl9hZGRyX201Mjgx KzYsICZlcnJvcl9tNTI4MSk7CisJCQkKKwkJCWlmICggdW5saWtlbHkoZHJ2X3N0YXQgJiAoQVRB X0VSUiB8IEFUQV9CVVNZIHwgQVRBX0RSUSkpICYmIGlmdGltZW91dD09MC8qZXhwcmVzcyBub3Qg dGltZW91dCovKQorCQkJCWF0YV90b19zZW5zZV9lcnJvcihxYywgZHJ2X3N0YXQpOworCQkJLy90 aW1lIG91dCBvciBkcml2ZSBzdGF0dXMgaXMgb2sJCQkKKwkJCWVsc2UgaWYgKChlcnJvcl9tNTI4 MSAmIDB4M2Y4KSE9MCB8fCBpZnRpbWVvdXQ9PTEpIC8vdGhlIHNyYyBlcnJvcmUgcHJlc2VudAor CQkJeworCQkJCXUzMiBzY3I0X201MjgxOworCQkJCXU4ICByZXNldF9tNTI4MSwgc3R1cywgc2Ny MF9tNTI4MTsKKwkJCQkKKwkJCQl1OCBraywgamo7CisgICAgICAgICAgICAgIAkJCXU4IGNvbXJl c2V0PTEsIHNvZnRyZXNldD0xOy8vc3VjY2Vzcz0wLCBmYWlsPTEKKwkJCisJCQkJcHJpbnRrKCJV TGkgc2F0YSBlcnJvcjoweCV4XG4iLGVycm9yX201MjgxKTsKKwkJCQkvL3Jlc2V0CisJCQkJLy8g ZG1hIGhhdmUgYmVlbiBjbG9zZWQKKwkJCQkvL19fc2F2ZV9mbGFncyhmbGFnc19tNTI4MSk7CisJ CQkJLy9fX2NsaSgpOworCQkJCS8vY29tIHJlc2V0CisJCQkJZm9yKGtrPTA7a2s8MjA7a2srKykK KwkJCQl7CisJCQkJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXZfbTUyODEsc2NyX2FkZHJfbTUy ODErOCwmcmVzZXRfbTUyODEpOworCQkJCQlyZXNldF9tNTI4MSA9IHJlc2V0X201MjgxICYgMHhm ZTsKKwkJCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXZfbTUyODEsc2NyX2FkZHJfbTUyODEr OCxyZXNldF9tNTI4MSk7CisJCQkJCXJlc2V0X201MjgxID0gcmVzZXRfbTUyODEgfCAweDAxOwor CQkJCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldl9tNTI4MSxzY3JfYWRkcl9tNTI4MSs4LHJl c2V0X201MjgxKTsJCQorCQkJCQkKKwkJCQkJLy9kZWxheSB0d28gbXMKKwkJCQkJbWRlbGF5KDIp OworCQkJCQkKKwkJCQkJLy9yZWFsbGVydCBhbmQgY2xlYXIgZXJybyBiaXQKKwkJCQkJcmVzZXRf bTUyODEgPSByZXNldF9tNTI4MSAmIDB4ZmU7CisJCSAgICAgICAgCQlwY2lfd3JpdGVfY29uZmln X2J5dGUocGRldl9tNTI4MSxzY3JfYWRkcl9tNTI4MSs4LHJlc2V0X201MjgxKTsKKwkJCQkJbWRl bGF5KDIpOworCQkJCQkJCQkJCQorCQkJCQlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2X201Mjgx LHNjcl9hZGRyX201MjgxLCZzY3IwX201MjgxKTsKKwkJCQkJcGNpX3JlYWRfY29uZmlnX2R3b3Jk KHBkZXZfbTUyODEsc2NyX2FkZHJfbTUyODErNCwmc2NyNF9tNTI4MSk7CisJCQkJCWlmKHNjcjBf bTUyODEhPTB4MTMgfHwoc2NyNF9tNTI4MSAmIDB4NTAwMDApIT0gMHgwMDA1MDAwMCApCisJCQkJ CXsKKwkJCQkJCXByaW50X2NsZWFyKCgicGh5IHJlc2V0IGZhaWxlZFxuIikpOworCQkJCQkJcHJp bnRfY2xlYXIoKCJzY3IwPTB4JXhcbiIsIHNjcjBfbTUyODEpKTsKKwkJCQkJCXByaW50X2NsZWFy KCgic2NyND0weCV4XG4iLCBzY3I0X201MjgxKSk7CisJCQkJCQljb250aW51ZTsKKwkJCQkJfQor CQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCS8vcHJpbnRfY2xlYXIoKCJjb20gcmVzZXQgc3VjY2Vz c1xuIikpOworCQkJCQkJLy9jbGVhciBlcnJvciBiaXRzCisJCQkJCQlwY2lfd3JpdGVfY29uZmln X2R3b3JkKHBkZXZfbTUyODEsc2NyX2FkZHJfbTUyODErNCxzY3I0X201MjgxKTsKKworCQkJCQkJ Y29tcmVzZXQ9MDsvL3N1Y2Nlc3MKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCQorCQkJCX0K KwkJCQkKKwkJCQlpZihjb21yZXNldD09MCkKKwkJCQl7CisJCQkJCS8vc3R1cz0gaW5iKHFjLT5h cC0+aW9hZGRyLnN0YXR1c19hZGRyKTsvLyBnZXQgZHJpdmUgc3RhdHVzIAorCQkJCQlqaj0wOwor CQkJCQlkbworCQkJCQl7CisJCQkJCQltZGVsYXkoMik7CisJCQkJCQlzdHVzPSBpbmIocWMtPmFw LT5pb2FkZHIuc3RhdHVzX2FkZHIpOy8vIGdldCBkcml2ZSBzdGF0dXMgCisJCQkJCQlqaisrOwor CQkJCQkJaWYoamo+PTE1MCkKKwkJCQkJCXsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJ fXdoaWxlIChzdHVzIT0weDUwKTsKKwkJCQkJCisJCQkJCS8vcHJpbnRfY2xlYXIoKCJqaj0weCV4 XG4iLCBqaikpOworCQkJCQkJCQkJCQorCQkJCQlpZihzdHVzIT0weDUwIC8qJiYgaWZ0aW1lb3V0 PT0xKi8pCisJCQkJCXsKKwkJCQkJCS8vcHJpbnRfY2xlYXIoKCJzb2Z0IHJlc2V0XG4iKSk7CisJ CQkJCQlmb3Ioa2s9MDtrazw1O2trKyspCisJCQkJCQl7CisJCQkJCQkJb3V0YigweDA0LHFjLT5h cC0+aW9hZGRyLmN0bF9hZGRyKTsJLy8gc2V0IFNSU1QgCisJCQkJCQkJbWRlbGF5KDUpOwkJCS8v IG1vcmUgdGhhbiBlbm91Z2ggdGltZSAKKwkJCQkJCQlvdXRiKDAscWMtPmFwLT5pb2FkZHIuY3Rs X2FkZHIpOwkvLyBjbGVhciAKKwkJCQkJCQlqaj0wOworCQkJCQkJCWRvCisJCQkJCQkJeworCQkJ CQkJCQltZGVsYXkoMSk7CisJCQkJCQkJCXN0dXM9IGluYihxYy0+YXAtPmlvYWRkci5zdGF0dXNf YWRkcik7Ly8gZ2V0IGRyaXZlIHN0YXR1cyAKKwkJCQkJCQkJamorKzsKKwkJCQkJCQkJaWYoamo+ PTEwMCkKKwkJCQkJCQkJeworCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCX0KKwkJCQkJCQl9d2hp bGUgKHN0dXMhPTB4NTApOworCisJCQkJCQkJaWYoc3R1cz09MHg1MCkKKwkJCQkJCQl7CisJCQkJ CQkJCXNvZnRyZXNldD0wOy8vc3VjZXNzCisJCQkJCQkJCWJyZWFrOworCQkJCQkJCX0KKwkJCQkJ CQkKKwkJCQkJCX0JCQkJCQkKKwkJCQkKKwkJCQkJfQorCQkJCQlpZihzdHVzPT0weDUwKQorCQkJ CQl7CisJCQkJCQlzb2Z0cmVzZXQ9MDsKKwkJCQkJfQorCQkJCQlwcmludF9jbGVhcigoIlVMaSBk cml2ZSBzdGF0dXM9MHgleFxuIixzdHVzKSk7CisJCQkJCQorCQkJCX0KKwkJCQlpZnRpbWVvdXQ9 MDsJCQkKKwkJCQkvL19fcmVzdG9yZV9mbGFncyhmbGFnc19tNTI4MSk7CisJCQkJCisKKwkJCQkv L3NldCB0aGUgY29tbWFuZAorCQkJCS8vdHJuc2xhdGUgZXJyb3IgY2FuIGJlIGRvbmUgYWNjb3Jp bmcgdG8gYXRhX3RvX3NlbnNlX2Vycm9yCisJCQkJCQkKKwkJCQlpZihjb21yZXNldD09MSkKKwkJ CQl7CisJCQkJCWF0YV90b19zZW5zZV9lcnJvcihxYywgMHgyMCk7CisJCQkJfQorCQkJCWVsc2Ug CisJCQkJeworCQkJCQkvL3ByaW50X2NsZWFyKCgidG8gc3lzXG4iKSk7CisJCQkJCWF0YV90b19z ZW5zZV9lcnJvcihxYywgMHgxKTsJCisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWNt ZC0+cmVzdWx0ID0gU0FNX1NUQVRfR09PRDsKKwkJCX0KKworCQl9CisJCWVsc2UKKwkJeworCQkJ aWYgKHVubGlrZWx5KGRydl9zdGF0ICYgKEFUQV9FUlIgfCBBVEFfQlVTWSB8IEFUQV9EUlEpKSkK KwkJCQlhdGFfdG9fc2Vuc2VfZXJyb3IocWMsIGRydl9zdGF0KTsKKwkJCWVsc2UKKwkJCQljbWQt PnJlc3VsdCA9IFNBTV9TVEFUX0dPT0Q7CisJCX0KKwl9CisJLy9lbmQgYWRkIGJ5IGNsZWFyIGNo ZXVuZyAyMDA0LzEyLzcKKwllbHNlCisJeworCisJCWlmICh1bmxpa2VseShkcnZfc3RhdCAmIChB VEFfRVJSIHwgQVRBX0JVU1kgfCBBVEFfRFJRKSkpCisJCQlhdGFfdG9fc2Vuc2VfZXJyb3IocWMs IGRydl9zdGF0KTsKKwkJZWxzZQorCQkJY21kLT5yZXN1bHQgPSBTQU1fU1RBVF9HT09EOworCX0K KworCXFjLT5zY3NpZG9uZShjbWQpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJYXRhX3Nj c2lfdHJhbnNsYXRlX3VsaSAtIFRyYW5zbGF0ZSB0aGVuIGlzc3VlIFNDU0kgY29tbWFuZCB0byBB VEEgZGV2aWNlCisgKglAYXA6IEFUQSBwb3J0IHRvIHdoaWNoIHRoZSBjb21tYW5kIGlzIGFkZHJl c3NlZAorICoJQGRldjogQVRBIGRldmljZSB0byB3aGljaCB0aGUgY29tbWFuZCBpcyBhZGRyZXNz ZWQKKyAqCUBjbWQ6IFNDU0kgY29tbWFuZCB0byBleGVjdXRlCisgKglAZG9uZTogU0NTSSBjb21t YW5kIGNvbXBsZXRpb24gZnVuY3Rpb24KKyAqCUB4bGF0X2Z1bmM6IEFjdG9yIHdoaWNoIHRyYW5z bGF0ZXMgQGNtZCB0byBhbiBBVEEgdGFza2ZpbGUKKyAqCisgKglPdXIgLT5xdWV1ZWNvbW1hbmQo KSBmdW5jdGlvbiBoYXMgZGVjaWRlZCB0aGF0IHRoZSBTQ1NJCisgKgljb21tYW5kIGlzc3VlZCBj YW4gYmUgZGlyZWN0bHkgdHJhbnNsYXRlZCBpbnRvIGFuIEFUQQorICoJY29tbWFuZCwgcmF0aGVy IHRoYW4gaGFuZGxlZCBpbnRlcm5hbGx5LgorICoKKyAqCVRoaXMgZnVuY3Rpb24gc2V0cyB1cCBh biBhdGFfcXVldWVkX2NtZCBzdHJ1Y3R1cmUgZm9yIHRoZQorICoJU0NTSSBjb21tYW5kLCBhbmQg c2VuZHMgdGhhdCBhdGFfcXVldWVkX2NtZCB0byB0aGUgaGFyZHdhcmUuCisgKgorICoJTE9DS0lO RzoKKyAqCXNwaW5fbG9ja19pcnFzYXZlKGhvc3Rfc2V0IGxvY2spCisgKi8KKworc3RhdGljIHZv aWQgYXRhX3Njc2lfdHJhbnNsYXRlX3VsaShzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRh X2RldmljZSAqZGV2LAorCQkJICAgICAgc3RydWN0IHNjc2lfY21uZCAqY21kLAorCQkJICAgICAg dm9pZCAoKmRvbmUpKHN0cnVjdCBzY3NpX2NtbmQgKiksCisJCQkgICAgICBhdGFfeGxhdF9mdW5j X3QgeGxhdF9mdW5jKQoreworCXN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWM7CisJdTggKnNjc2lj bWQgPSBjbWQtPmNtbmQ7CisKKwlWUFJJTlRLKCJFTlRFUlxuIik7CisKKwlxYyA9IGF0YV9zY3Np X3FjX25ld191bGkoYXAsIGRldiwgY21kLCBkb25lKTsKKwlpZiAoIXFjKQorCQlyZXR1cm47CisK KwkvKiBkYXRhIGlzIHByZXNlbnQ7IGRtYS1tYXAgaXQgKi8KKwlpZiAoY21kLT5zY19kYXRhX2Rp cmVjdGlvbiA9PSBTQ1NJX0RBVEFfUkVBRCB8fAorCSAgICBjbWQtPnNjX2RhdGFfZGlyZWN0aW9u ID09IFNDU0lfREFUQV9XUklURSkgeworCQlpZiAodW5saWtlbHkoY21kLT5yZXF1ZXN0X2J1ZmZs ZW4gPCAxKSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYXRhJXUoJXUpOiBXQVJOSU5HOiB6 ZXJvIGxlbiByL3cgcmVxXG4iLAorCQkJICAgICAgIGFwLT5pZCwgZGV2LT5kZXZubyk7CisJCQln b3RvIGVycl9vdXQ7CisJCX0KKworCQlpZiAoY21kLT51c2Vfc2cpCisJCQlhdGFfc2dfaW5pdChx YywgY21kLT5yZXF1ZXN0X2J1ZmZlciwgY21kLT51c2Vfc2cpOworCQllbHNlCisJCQlhdGFfc2df aW5pdF9vbmUocWMsIGNtZC0+cmVxdWVzdF9idWZmZXIsCisJCQkJCWNtZC0+cmVxdWVzdF9idWZm bGVuKTsKKworCQlxYy0+cGNpX2RtYV9kaXIgPSBzY3NpX3RvX3BjaV9kbWFfZGlyKGNtZC0+c2Nf ZGF0YV9kaXJlY3Rpb24pOworCX0KKworCXFjLT5jb21wbGV0ZV9mbiA9IGF0YV9zY3NpX3FjX2Nv bXBsZXRlX3VsaTsKKworCWlmICh4bGF0X2Z1bmMocWMsIHNjc2ljbWQpKQorCQlnb3RvIGVycl9v dXQ7CisKKwkvKiBzZWxlY3QgZGV2aWNlLCBzZW5kIGNvbW1hbmQgdG8gaGFyZHdhcmUgKi8KKwlp ZiAoYXRhX3FjX2lzc3VlKHFjKSkKKwkJZ290byBlcnJfb3V0OworCisJVlBSSU5USygiRVhJVFxu Iik7CisJcmV0dXJuOworCitlcnJfb3V0OgorCWF0YV9iYWRfY2RiKGNtZCwgZG9uZSk7CisJRFBS SU5USygiRVhJVCAtIGJhZGNtZFxuIik7Cit9CisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8q KgorICoJYXRhX3Njc2lfc2ltdWxhdGVfdWxpIC0gc2ltdWxhdGUgU0NTSSBjb21tYW5kIG9uIEFU QSBkZXZpY2UKKyAqCUBhcDogUG9ydCB0byB3aGljaCBBVEEgZGV2aWNlIGlzIGF0dGFjaGVkLgor ICoJQGRldjogVGFyZ2V0IGRldmljZSBmb3IgQ0RCLgorICoJQGNtZDogU0NTSSBjb21tYW5kIGJl aW5nIHNlbnQgdG8gZGV2aWNlLgorICoJQGRvbmU6IFNDU0kgY29tbWFuZCBjb21wbGV0aW9uIGZ1 bmN0aW9uLgorICoKKyAqCUludGVycHJldHMgYW5kIGRpcmVjdGx5IGV4ZWN1dGVzIGEgc2VsZWN0 IGxpc3Qgb2YgU0NTSSBjb21tYW5kcworICoJdGhhdCBjYW4gYmUgaGFuZGxlZCBpbnRlcm5hbGx5 LgorICoKKyAqCUxPQ0tJTkc6CisgKglzcGluX2xvY2tfaXJxc2F2ZShob3N0X3NldCBsb2NrKQor ICovCisKK3N0YXRpYyB2b2lkIGF0YV9zY3NpX3NpbXVsYXRlX3VsaShzdHJ1Y3QgYXRhX3BvcnQg KmFwLCBzdHJ1Y3QgYXRhX2RldmljZSAqZGV2LAorCQkJICAgICAgc3RydWN0IHNjc2lfY21uZCAq Y21kLAorCQkJICAgICAgdm9pZCAoKmRvbmUpKHN0cnVjdCBzY3NpX2NtbmQgKikpCit7CisJc3Ry dWN0IGF0YV9zY3NpX2FyZ3MgYXJnczsKKwl1OCAqc2NzaWNtZCA9IGNtZC0+Y21uZDsKKworCWFy Z3MuYXAgPSBhcDsKKwlhcmdzLmRldiA9IGRldjsKKwlhcmdzLmNtZCA9IGNtZDsKKwlhcmdzLmRv bmUgPSBkb25lOworCisJc3dpdGNoKHNjc2ljbWRbMF0pIHsKKwkJLyogbm8tb3AncywgY29tcGxl dGUgd2l0aCBzdWNjZXNzICovCisJCWNhc2UgU1lOQ0hST05JWkVfQ0FDSEU6CisJCWNhc2UgUkVa RVJPX1VOSVQ6CisJCWNhc2UgU0VFS182OgorCQljYXNlIFNFRUtfMTA6CisJCWNhc2UgVEVTVF9V TklUX1JFQURZOgorCQljYXNlIEZPUk1BVF9VTklUOgkJLyogRklYTUU6IGNvcnJlY3Q/ICovCisJ CWNhc2UgU0VORF9ESUFHTk9TVElDOgkJLyogRklYTUU6IGNvcnJlY3Q/ICovCisJCQlhdGFfc2Nz aV9yYnVmX2ZpbGwoJmFyZ3MsIGF0YV9zY3Npb3Bfbm9vcCk7CisJCQlicmVhazsKKworCQljYXNl IElOUVVJUlk6CisJCQlpZiAoc2NzaWNtZFsxXSAmIDIpCSAgICAgICAgICAgLyogaXMgQ21kRHQg c2V0PyAgKi8KKwkJCQlhdGFfYmFkX2NkYihjbWQsIGRvbmUpOworCQkJZWxzZSBpZiAoKHNjc2lj bWRbMV0gJiAxKSA9PSAwKSAgICAvKiBpcyBFVlBEIGNsZWFyPyAqLworCQkJCWF0YV9zY3NpX3Ji dWZfZmlsbCgmYXJncywgYXRhX3Njc2lvcF9pbnFfc3RkKTsKKwkJCWVsc2UgaWYgKHNjc2ljbWRb Ml0gPT0gMHgwMCkKKwkJCQlhdGFfc2NzaV9yYnVmX2ZpbGwoJmFyZ3MsIGF0YV9zY3Npb3BfaW5x XzAwKTsKKwkJCWVsc2UgaWYgKHNjc2ljbWRbMl0gPT0gMHg4MCkKKwkJCQlhdGFfc2NzaV9yYnVm X2ZpbGwoJmFyZ3MsIGF0YV9zY3Npb3BfaW5xXzgwKTsKKwkJCWVsc2UgaWYgKHNjc2ljbWRbMl0g PT0gMHg4MykKKwkJCQlhdGFfc2NzaV9yYnVmX2ZpbGwoJmFyZ3MsIGF0YV9zY3Npb3BfaW5xXzgz KTsKKwkJCWVsc2UKKwkJCQlhdGFfYmFkX2NkYihjbWQsIGRvbmUpOworCQkJYnJlYWs7CisKKwkJ Y2FzZSBNT0RFX1NFTlNFOgorCQljYXNlIE1PREVfU0VOU0VfMTA6CisJCQlhdGFfc2NzaV9yYnVm X2ZpbGwoJmFyZ3MsIGF0YV9zY3Npb3BfbW9kZV9zZW5zZSk7CisJCQlicmVhazsKKworCQljYXNl IE1PREVfU0VMRUNUOgkvKiB1bmNvbmRpdGlvbmFsbHkgcmV0dXJuICovCisJCWNhc2UgTU9ERV9T RUxFQ1RfMTA6CS8qIGJhZC1maWVsZC1pbi1jZGIgKi8KKwkJCWF0YV9iYWRfY2RiKGNtZCwgZG9u ZSk7CisJCQlicmVhazsKKworCQljYXNlIFJFQURfQ0FQQUNJVFk6CisJCQlhdGFfc2NzaV9yYnVm X2ZpbGwoJmFyZ3MsIGF0YV9zY3Npb3BfcmVhZF9jYXApOworCQkJYnJlYWs7CisKKwkJY2FzZSBT RVJWSUNFX0FDVElPTl9JTjoKKwkJCWlmICgoc2NzaWNtZFsxXSAmIDB4MWYpID09IFNBSV9SRUFE X0NBUEFDSVRZXzE2KQorCQkJCWF0YV9zY3NpX3JidWZfZmlsbCgmYXJncywgYXRhX3Njc2lvcF9y ZWFkX2NhcCk7CisJCQllbHNlCisJCQkJYXRhX2JhZF9jZGIoY21kLCBkb25lKTsKKwkJCWJyZWFr OworCisJCWNhc2UgUkVQT1JUX0xVTlM6CisJCQlhdGFfc2NzaV9yYnVmX2ZpbGwoJmFyZ3MsIGF0 YV9zY3Npb3BfcmVwb3J0X2x1bnMpOworCQkJYnJlYWs7CisKKwkJLyogbWFuZGFudG9yeSBjb21t YW5kcyB3ZSBoYXZlbid0IGltcGxlbWVudGVkIHlldCAqLworCQljYXNlIFJFUVVFU1RfU0VOU0U6 CisKKwkJLyogYWxsIG90aGVyIGNvbW1hbmRzICovCisJCWRlZmF1bHQ6CisJCQlhdGFfYmFkX3Nj c2lvcChjbWQsIGRvbmUpOworCQkJYnJlYWs7CisJfQorfQorLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioK KyAqCWF0YV9zY3NpX3JidWZfZ2V0X3VsaSAtIE1hcCByZXNwb25zZSBidWZmZXIuCisgKglAY21k OiBTQ1NJIGNvbW1hbmQgY29udGFpbmluZyBidWZmZXIgdG8gYmUgbWFwcGVkLgorICoJQGJ1Zl9v dXQ6IFBvaW50ZXIgdG8gbWFwcGVkIGFyZWEuCisgKgorICoJTWFwcyBidWZmZXIgY29udGFpbmVk IHdpdGhpbiBTQ1NJIGNvbW1hbmQgQGNtZC4KKyAqCisgKglMT0NLSU5HOgorICoJc3Bpbl9sb2Nr X2lycXNhdmUoaG9zdF9zZXQgbG9jaykKKyAqCisgKglSRVRVUk5TOgorICoJTGVuZ3RoIG9mIHJl c3BvbnNlIGJ1ZmZlci4KKyAqLworCitzdGF0aWMgdW5zaWduZWQgaW50IGF0YV9zY3NpX3JidWZf Z2V0X3VsaShzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsIHU4ICoqYnVmX291dCkKK3sKKwl1OCAqYnVm OworCXVuc2lnbmVkIGludCBidWZsZW47CisKKwlpZiAoY21kLT51c2Vfc2cpIHsKKwkJc3RydWN0 IHNjYXR0ZXJsaXN0ICpzZzsKKworCQlzZyA9IChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKikgY21kLT5y ZXF1ZXN0X2J1ZmZlcjsKKwkJYnVmID0ga21hcF9hdG9taWMoc2ctPnBhZ2UsIEtNX1VTRVIwKSAr IHNnLT5vZmZzZXQ7CisJCWJ1ZmxlbiA9IHNnLT5sZW5ndGg7CisJfSBlbHNlIHsKKwkJYnVmID0g Y21kLT5yZXF1ZXN0X2J1ZmZlcjsKKwkJYnVmbGVuID0gY21kLT5yZXF1ZXN0X2J1ZmZsZW47CisJ fQorCisJbWVtc2V0KGJ1ZiwgMCwgYnVmbGVuKTsKKwkqYnVmX291dCA9IGJ1ZjsKKwlyZXR1cm4g YnVmbGVuOworfQorCisvKioKKyAqCWF0YV9zY3NpX3JidWZfcHV0X3VsaSAtIFVubWFwIHJlc3Bv bnNlIGJ1ZmZlci4KKyAqCUBjbWQ6IFNDU0kgY29tbWFuZCBjb250YWluaW5nIGJ1ZmZlciB0byBi ZSB1bm1hcHBlZC4KKyAqCisgKglVbm1hcHMgcmVzcG9uc2UgYnVmZmVyIGNvbnRhaW5lZCB3aXRo aW4gQGNtZC4KKyAqCisgKglMT0NLSU5HOgorICoJc3Bpbl9sb2NrX2lycXNhdmUoaG9zdF9zZXQg bG9jaykKKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgYXRhX3Njc2lfcmJ1Zl9wdXRfdWxpKHN0 cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwlpZiAoY21kLT51c2Vfc2cpIHsKKwkJc3RydWN0IHNj YXR0ZXJsaXN0ICpzZzsKKworCQlzZyA9IChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKikgY21kLT5yZXF1 ZXN0X2J1ZmZlcjsKKwkJa3VubWFwX2F0b21pYyhzZy0+cGFnZSwgS01fVVNFUjApOworCX0KK30K K3N0YXRpYyBpbnQgYXRhcGlfcWNfY29tcGxldGVfdWxpKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAq cWMsIHU4IGRydl9zdGF0KQoreworCXN0cnVjdCBzY3NpX2NtbmQgKmNtZCA9IHFjLT5zY3NpY21k OworCQorCS8vIGFkZCBieSBjbGVhciBjaGV1bmcgMjAwNC8xMi83IGZvciBVTGkgTTUyODEgd29y a2Fyb3VkCQorCWlmKHFjLT5hcC0+aG9zdF9zZXQtPnBkZXYtPnZlbmRvcj09MHgxMGI5ICYmCisJ CXFjLT5hcC0+aG9zdF9zZXQtPnBkZXYtPmRldmljZT09MHg1MjgxKQorCXsKKwkJCisJCXN0cnVj dCBwY2lfZGV2ICpwZGV2X201MjgxPXFjLT5hcC0+aG9zdF9zZXQtPnBkZXY7CisJCXU4IG01Mjgx X3JldmlzaW9uOworCQkKKwkJY21kLT5yZXN1bHQgPSBTQU1fU1RBVF9HT09EOworCQkJICAgICAg ICAgICAgICAKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldl9tNTI4MSwgUENJX1JFVklTSU9O X0lELCAmbTUyODFfcmV2aXNpb24pOworCQkvL3ByaW50aygibTUyODFfcmV2aXNpb249MHgleFxu IixtNTI4MV9yZXZpc2lvbik7CisJCS8vdmVyc2lvbiAweGEwLDB4YTEsMHhiMSBuZWVkIHdvcmth cm91ZAkKKwkJaWYobTUyODFfcmV2aXNpb249PTB4YTAgfHxtNTI4MV9yZXZpc2lvbj09MHhhMSB8 fG01MjgxX3JldmlzaW9uPT0weGIxICkKKwkJeworCQkJdTE2IGVycm9yX201MjgxOworCQkJdW5z aWduZWQgbG9uZwlzY3JfYWRkcl9tNTI4MSA9IHFjLT5hcC0+aW9hZGRyLnNjcl9hZGRyOworCQkJ CisJCQlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2X201MjgxLHNjcl9hZGRyX201MjgxKzYsICZl cnJvcl9tNTI4MSk7CisJCQkKKwkJCWlmICggdW5saWtlbHkoZHJ2X3N0YXQgJiAoQVRBX0VSUiB8 IEFUQV9CVVNZIHwgQVRBX0RSUSkpICYmIGlmdGltZW91dD09MC8qZXhwcmVzcyBub3QgdGltZW91 dCovKQorCQkJCWNtZC0+cmVzdWx0ID0gU0FNX1NUQVRfQ0hFQ0tfQ09ORElUSU9OOworCQkJLy90 aW1lIG91dCBvciBkcml2ZSBzdGF0dXMgaXMgb2sJCQkKKwkJCWVsc2UgaWYgKChlcnJvcl9tNTI4 MSAmIDB4M2Y4KSE9MCB8fCBpZnRpbWVvdXQ9PTEpIC8vdGhlIHNyYyBlcnJvcmUgcHJlc2VudAor CQkJeworCQkJCXUzMiBzY3I0X201MjgxOworCQkJCXU4ICByZXNldF9tNTI4MSwgc3R1cywgc2Ny MF9tNTI4MTsKKwkJCQkKKwkJCQl1OCBraywgamo7CisgICAgICAgICAgICAgIAkJCXU4IGNvbXJl c2V0PTEsIHNvZnRyZXNldD0xOy8vc3VjY2Vzcz0wLCBmYWlsPTEKKwkJCisJCQkJcHJpbnRrKCJV TGkgc2F0YSBlcnJvcjoweCV4XG4iLGVycm9yX201MjgxKTsKKwkJCQkvL3Jlc2V0CisJCQkJLy8g ZG1hIGhhdmUgYmVlbiBjbG9zZWQKKwkJCQkvL19fc2F2ZV9mbGFncyhmbGFnc19tNTI4MSk7CisJ CQkJLy9fX2NsaSgpOworCQkJCS8vY29tIHJlc2V0CisJCQkJZm9yKGtrPTA7a2s8MjA7a2srKykK KwkJCQl7CisJCQkJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXZfbTUyODEsc2NyX2FkZHJfbTUy ODErOCwmcmVzZXRfbTUyODEpOworCQkJCQlyZXNldF9tNTI4MSA9IHJlc2V0X201MjgxICYgMHhm ZTsKKwkJCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXZfbTUyODEsc2NyX2FkZHJfbTUyODEr OCxyZXNldF9tNTI4MSk7CisJCQkJCXJlc2V0X201MjgxID0gcmVzZXRfbTUyODEgfCAweDAxOwor CQkJCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldl9tNTI4MSxzY3JfYWRkcl9tNTI4MSs4LHJl c2V0X201MjgxKTsJCQorCQkJCQkKKwkJCQkJLy9kZWxheSB0d28gbXMKKwkJCQkJbWRlbGF5KDIp OworCQkJCQkKKwkJCQkJLy9yZWFsbGVydCBhbmQgY2xlYXIgZXJybyBiaXQKKwkJCQkJcmVzZXRf bTUyODEgPSByZXNldF9tNTI4MSAmIDB4ZmU7CisJCSAgICAgICAgCQlwY2lfd3JpdGVfY29uZmln X2J5dGUocGRldl9tNTI4MSxzY3JfYWRkcl9tNTI4MSs4LHJlc2V0X201MjgxKTsKKwkJCQkJbWRl bGF5KDIpOworCQkJCQkJCQkJCQorCQkJCQlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2X201Mjgx LHNjcl9hZGRyX201MjgxLCZzY3IwX201MjgxKTsKKwkJCQkJcGNpX3JlYWRfY29uZmlnX2R3b3Jk KHBkZXZfbTUyODEsc2NyX2FkZHJfbTUyODErNCwmc2NyNF9tNTI4MSk7CisJCQkJCWlmKHNjcjBf bTUyODEhPTB4MTMgfHwoc2NyNF9tNTI4MSAmIDB4NTAwMDApIT0gMHgwMDA1MDAwMCApCisJCQkJ CXsKKwkJCQkJCXByaW50X2NsZWFyKCgicGh5IHJlc2V0IGZhaWxlZFxuIikpOworCQkJCQkJcHJp bnRfY2xlYXIoKCJzY3IwPTB4JXhcbiIsIHNjcjBfbTUyODEpKTsKKwkJCQkJCXByaW50X2NsZWFy KCgic2NyND0weCV4XG4iLCBzY3I0X201MjgxKSk7CisJCQkJCQljb250aW51ZTsKKwkJCQkJfQor CQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCS8vcHJpbnRfY2xlYXIoKCJjb20gcmVzZXQgc3VjY2Vz c1xuIikpOworCQkJCQkJLy9jbGVhciBlcnJvciBiaXRzCisJCQkJCQlwY2lfd3JpdGVfY29uZmln X2R3b3JkKHBkZXZfbTUyODEsc2NyX2FkZHJfbTUyODErNCxzY3I0X201MjgxKTsKKworCQkJCQkJ Y29tcmVzZXQ9MDsvL3N1Y2Nlc3MKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCQorCQkJCX0K KwkJCQkKKwkJCQlpZihjb21yZXNldD09MCkKKwkJCQl7CisJCQkJCS8vc3R1cz0gaW5iKHFjLT5h cC0+aW9hZGRyLnN0YXR1c19hZGRyKTsvLyBnZXQgZHJpdmUgc3RhdHVzIAorCQkJCQlqaj0wOwor CQkJCQlkbworCQkJCQl7CisJCQkJCQltZGVsYXkoMik7CisJCQkJCQlzdHVzPSBpbmIocWMtPmFw LT5pb2FkZHIuc3RhdHVzX2FkZHIpOy8vIGdldCBkcml2ZSBzdGF0dXMgCisJCQkJCQlqaisrOwor CQkJCQkJaWYoamo+PTE1MCkKKwkJCQkJCXsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJ fXdoaWxlIChzdHVzIT0weDUwKTsKKwkJCQkJCisJCQkJCS8vcHJpbnRfY2xlYXIoKCJqaj0weCV4 XG4iLCBqaikpOworCQkJCQkJCQkJCQorCQkJCQlpZihzdHVzIT0weDUwIC8qJiYgaWZ0aW1lb3V0 PT0xKi8pCisJCQkJCXsKKwkJCQkJCS8vcHJpbnRfY2xlYXIoKCJzb2Z0IHJlc2V0XG4iKSk7CisJ CQkJCQlmb3Ioa2s9MDtrazw1O2trKyspCisJCQkJCQl7CisJCQkJCQkJb3V0YigweDA0LHFjLT5h cC0+aW9hZGRyLmN0bF9hZGRyKTsJLy8gc2V0IFNSU1QgCisJCQkJCQkJbWRlbGF5KDUpOwkJCS8v IG1vcmUgdGhhbiBlbm91Z2ggdGltZSAKKwkJCQkJCQlvdXRiKDAscWMtPmFwLT5pb2FkZHIuY3Rs X2FkZHIpOwkvLyBjbGVhciAKKwkJCQkJCQlqaj0wOworCQkJCQkJCWRvCisJCQkJCQkJeworCQkJ CQkJCQltZGVsYXkoMSk7CisJCQkJCQkJCXN0dXM9IGluYihxYy0+YXAtPmlvYWRkci5zdGF0dXNf YWRkcik7Ly8gZ2V0IGRyaXZlIHN0YXR1cyAKKwkJCQkJCQkJamorKzsKKwkJCQkJCQkJaWYoamo+ PTEwMCkKKwkJCQkJCQkJeworCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCX0KKwkJCQkJCQl9d2hp bGUgKHN0dXMhPTB4NTApOworCisJCQkJCQkJaWYoc3R1cz09MHg1MCkKKwkJCQkJCQl7CisJCQkJ CQkJCXNvZnRyZXNldD0wOy8vc3VjZXNzCisJCQkJCQkJCWJyZWFrOworCQkJCQkJCX0KKwkJCQkJ CQkKKwkJCQkJCX0JCQkJCQkKKwkJCQkKKwkJCQkJfQorCQkJCQlpZihzdHVzPT0weDUwKQorCQkJ CQl7CisJCQkJCQlzb2Z0cmVzZXQ9MDsKKwkJCQkJfQorCQkJCQlwcmludF9jbGVhcigoIlVMaSBk cml2ZSBzdGF0dXM9MHgleFxuIixzdHVzKSk7CisJCQkJCQorCQkJCX0KKwkJCQlpZnRpbWVvdXQ9 MDsJCQkKKwkJCQkvL19fcmVzdG9yZV9mbGFncyhmbGFnc19tNTI4MSk7CisJCQkJCisKKwkJCQkv L3NldCB0aGUgY29tbWFuZAorCQkJCS8vdHJuc2xhdGUgZXJyb3IgY2FuIGJlIGRvbmUgYWNjb3Jp bmcgdG8gYXRhX3RvX3NlbnNlX2Vycm9yCisJCQkJY21kLT5yZXN1bHQgPSBTQU1fU1RBVF9DSEVD S19DT05ESVRJT047CQkKKwkJCQkvKmlmKGNvbXJlc2V0PT0xKQorCQkJCXsKKwkJCQkJYXRhX3Rv X3NlbnNlX2Vycm9yKHFjLCAweDIwKTsKKwkJCQl9CisJCQkJZWxzZSAKKwkJCQl7CisJCQkJCS8v cHJpbnRfY2xlYXIoKCJ0byBzeXNcbiIpKTsKKwkJCQkJYXRhX3RvX3NlbnNlX2Vycm9yKHFjLCAw eDEpOwkKKwkJCQl9Ki8KKwkJCX0KKwkJCWVsc2UgCisJCQl7CisJCQkJdTggKnNjc2ljbWQgPSBj bWQtPmNtbmQ7CisJCQorCQkJCWlmIChzY3NpY21kWzBdID09IElOUVVJUlkpIHsKKwkJCQkJdTgg KmJ1ZiA9IE5VTEw7CisJCQkJCXVuc2lnbmVkIGludCBidWZsZW47CisJCQorCQkJCQlidWZsZW4g PSBhdGFfc2NzaV9yYnVmX2dldF91bGkoY21kLCAmYnVmKTsKKwkJCQkJYnVmWzJdID0gMHg1Owor CQkJCQlidWZbM10gPSAoYnVmWzNdICYgMHhmMCkgfCAyOworCQkJCQlhdGFfc2NzaV9yYnVmX3B1 dF91bGkoY21kKTsKKwkJCQl9CisJCQkJY21kLT5yZXN1bHQgPSBTQU1fU1RBVF9HT09EOworCQkJ fQorCisJCX0KKwkJZWxzZQorCQl7CisJCQlpZiAodW5saWtlbHkoZHJ2X3N0YXQgJiAoQVRBX0VS UiB8IEFUQV9CVVNZIHwgQVRBX0RSUSkpKQorCQkJCWNtZC0+cmVzdWx0ID0gU0FNX1NUQVRfQ0hF Q0tfQ09ORElUSU9OOworCQkJZWxzZSB7CisJCQkJdTggKnNjc2ljbWQgPSBjbWQtPmNtbmQ7CisJ CQorCQkJCWlmIChzY3NpY21kWzBdID09IElOUVVJUlkpIHsKKwkJCQkJdTggKmJ1ZiA9IE5VTEw7 CisJCQkJCXVuc2lnbmVkIGludCBidWZsZW47CisJCQorCQkJCQlidWZsZW4gPSBhdGFfc2NzaV9y YnVmX2dldF91bGkoY21kLCAmYnVmKTsKKwkJCQkJYnVmWzJdID0gMHg1OworCQkJCQlidWZbM10g PSAoYnVmWzNdICYgMHhmMCkgfCAyOworCQkJCQlhdGFfc2NzaV9yYnVmX3B1dF91bGkoY21kKTsK KwkJCQl9CisJCQkJY21kLT5yZXN1bHQgPSBTQU1fU1RBVF9HT09EOworCQkJfQorCQl9CisJfQor CS8vZW5kIGFkZCBieSBjbGVhciBjaGV1bmcgMjAwNC8xMi83CisJCisJZWxzZQorCXsKKworCQlp ZiAodW5saWtlbHkoZHJ2X3N0YXQgJiAoQVRBX0VSUiB8IEFUQV9CVVNZIHwgQVRBX0RSUSkpKQor CQkJY21kLT5yZXN1bHQgPSBTQU1fU1RBVF9DSEVDS19DT05ESVRJT047CisJCWVsc2UgeworCQkJ dTggKnNjc2ljbWQgPSBjbWQtPmNtbmQ7CisJCisJCQlpZiAoc2NzaWNtZFswXSA9PSBJTlFVSVJZ KSB7CisJCQkJdTggKmJ1ZiA9IE5VTEw7CisJCQkJdW5zaWduZWQgaW50IGJ1ZmxlbjsKKwkKKwkJ CQlidWZsZW4gPSBhdGFfc2NzaV9yYnVmX2dldF91bGkoY21kLCAmYnVmKTsKKwkJCQlidWZbMl0g PSAweDU7CisJCQkJYnVmWzNdID0gKGJ1ZlszXSAmIDB4ZjApIHwgMjsKKwkJCQlhdGFfc2NzaV9y YnVmX3B1dF91bGkoY21kKTsKKwkJCX0KKwkJCWNtZC0+cmVzdWx0ID0gU0FNX1NUQVRfR09PRDsK KwkJfQorCX0KKworCXFjLT5zY3NpZG9uZShjbWQpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgor ICoJYXRhcGlfeGxhdF91bGkgLSBJbml0aWFsaXplIFBBQ0tFVCB0YXNrZmlsZQorICoJQHFjOiBj b21tYW5kIHN0cnVjdHVyZSB0byBiZSBpbml0aWFsaXplZAorICoJQHNjc2ljbWQ6IFNDU0kgQ0RC IGFzc29jaWF0ZWQgd2l0aCB0aGlzIFBBQ0tFVCBjb21tYW5kCisgKgorICoJTE9DS0lORzoKKyAq CXNwaW5fbG9ja19pcnFzYXZlKGhvc3Rfc2V0IGxvY2spCisgKgorICoJUkVUVVJOUzoKKyAqCVpl cm8gb24gc3VjY2Vzcywgbm9uLXplcm8gb24gZmFpbHVyZS4KKyAqLworCitzdGF0aWMgdW5zaWdu ZWQgaW50IGF0YXBpX3hsYXRfdWxpKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMsIHU4ICpzY3Np Y21kKQoreworCXN0cnVjdCBzY3NpX2NtbmQgKmNtZCA9IHFjLT5zY3NpY21kOworCXN0cnVjdCBh dGFfZGV2aWNlICpkZXYgPSBxYy0+ZGV2OworCWludCB1c2luZ19waW8gPSAoZGV2LT5mbGFncyAm IEFUQV9ERkxBR19QSU8pOworCWludCBub2RhdGEgPSAoY21kLT5zY19kYXRhX2RpcmVjdGlvbiA9 PSBTQ1NJX0RBVEFfTk9ORSk7CisKKwltZW1jcHkoJnFjLT5jZGIsIHNjc2ljbWQsIHFjLT5hcC0+ Y2RiX2xlbik7CisKKwlxYy0+Y29tcGxldGVfZm4gPSBhdGFwaV9xY19jb21wbGV0ZV91bGk7CisK KwlxYy0+dGYuZmxhZ3MgfD0gQVRBX1RGTEFHX0lTQUREUiB8IEFUQV9URkxBR19ERVZJQ0U7CisJ aWYgKGNtZC0+c2NfZGF0YV9kaXJlY3Rpb24gPT0gU0NTSV9EQVRBX1dSSVRFKSB7CisJCXFjLT50 Zi5mbGFncyB8PSBBVEFfVEZMQUdfV1JJVEU7CisJCURQUklOVEsoImRpcmVjdGlvbjogd3JpdGVc biIpOworCX0KKworCXFjLT50Zi5jb21tYW5kID0gQVRBX0NNRF9QQUNLRVQ7CisKKwkvKiBubyBk YXRhLCBvciBQSU8gZGF0YSB4ZmVyICovCisJaWYgKHVzaW5nX3BpbyB8fCBub2RhdGEpIHsKKwkJ aWYgKG5vZGF0YSkKKwkJCXFjLT50Zi5wcm90b2NvbCA9IEFUQV9QUk9UX0FUQVBJX05PREFUQTsK KwkJZWxzZQorCQkJcWMtPnRmLnByb3RvY29sID0gQVRBX1BST1RfQVRBUEk7CisJCXFjLT50Zi5s YmFtID0gKDggKiAxMDI0KSAmIDB4ZmY7CisJCXFjLT50Zi5sYmFoID0gKDggKiAxMDI0KSA+PiA4 OworCX0KKworCS8qIERNQSBkYXRhIHhmZXIgKi8KKwllbHNlIHsKKwkJcWMtPnRmLnByb3RvY29s ID0gQVRBX1BST1RfQVRBUElfRE1BOworCQlxYy0+dGYuZmVhdHVyZSB8PSBBVEFQSV9QS1RfRE1B OworCisjaWZkZWYgQVRBUElfRU5BQkxFX0RNQURJUgorCQkvKiBzb21lIFNBVEEgYnJpZGdlcyBu ZWVkIHVzIHRvIGluZGljYXRlIGRhdGEgeGZlciBkaXJlY3Rpb24gKi8KKwkJaWYgKGNtZC0+c2Nf ZGF0YV9kaXJlY3Rpb24gIT0gU0NTSV9EQVRBX1dSSVRFKQorCQkJcWMtPnRmLmZlYXR1cmUgfD0g QVRBUElfRE1BRElSOworI2VuZGlmCisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8qKgor ICoJYXRhX3Njc2lfcXVldWVjbWRfdWxpIC0gSXNzdWUgU0NTSSBjZGIgdG8gbGliYXRhLW1hbmFn ZWQgZGV2aWNlCisgKglAY21kOiBTQ1NJIGNvbW1hbmQgdG8gYmUgc2VudAorICoJQGRvbmU6IENv bXBsZXRpb24gZnVuY3Rpb24sIGNhbGxlZCB3aGVuIGNvbW1hbmQgaXMgY29tcGxldGUKKyAqCisg KglJbiBzb21lIGNhc2VzLCB0aGlzIGZ1bmN0aW9uIHRyYW5zbGF0ZXMgU0NTSSBjb21tYW5kcyBp bnRvCisgKglBVEEgdGFza2ZpbGVzLCBhbmQgcXVldWVzIHRoZSB0YXNrZmlsZXMgdG8gYmUgc2Vu dCB0bworICoJaGFyZHdhcmUuICBJbiBvdGhlciBjYXNlcywgdGhpcyBmdW5jdGlvbiBzaW11bGF0 ZXMgYQorICoJU0NTSSBkZXZpY2UgYnkgZXZhbHVhdGluZyBhbmQgcmVzcG9uZGluZyB0byBjZXJ0 YWluCisgKglTQ1NJIGNvbW1hbmRzLiAgVGhpcyBjcmVhdGVzIHRoZSBvdmVyYWxsIGVmZmVjdCBv ZgorICoJQVRBIGFuZCBBVEFQSSBkZXZpY2VzIGFwcGVhcmluZyBhcyBTQ1NJIGRldmljZXMuCisg KgorICoJTE9DS0lORzoKKyAqCVJlbGVhc2VzIHNjc2ktbGF5ZXItaGVsZCBsb2NrLCBhbmQgb2J0 YWlucyBob3N0X3NldCBsb2NrLgorICoKKyAqCVJFVFVSTlM6CisgKglaZXJvLgorICovCisKK3N0 YXRpYyBpbnQgYXRhX3Njc2lfcXVldWVjbWRfdWxpKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwgdm9p ZCAoKmRvbmUpKHN0cnVjdCBzY3NpX2NtbmQgKikpCit7CisJc3RydWN0IGF0YV9wb3J0ICphcDsK KwlzdHJ1Y3QgYXRhX2RldmljZSAqZGV2OworCXN0cnVjdCBzY3NpX2RldmljZSAqc2NzaWRldiA9 IGNtZC0+ZGV2aWNlOworCisJYXAgPSAoc3RydWN0IGF0YV9wb3J0ICopICZzY3NpZGV2LT5ob3N0 LT5ob3N0ZGF0YVswXTsKKworCS8vYXRhX3Njc2lfZHVtcF9jZGIoYXAsIGNtZCk7CisKKwlkZXYg PSBhdGFfc2NzaV9maW5kX2Rldl91bGkoYXAsIHNjc2lkZXYpOworCWlmICh1bmxpa2VseSghZGV2 KSkgeworCQljbWQtPnJlc3VsdCA9IChESURfQkFEX1RBUkdFVCA8PCAxNik7CisJCWRvbmUoY21k KTsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKworCWlmIChkZXYtPmNsYXNzID09IEFUQV9ERVZf QVRBKSB7CisJCWF0YV94bGF0X2Z1bmNfdCB4bGF0X2Z1bmMgPSBhdGFfZ2V0X3hsYXRfZnVuY191 bGkoZGV2LAorCQkJCQkJCSAgICAgIGNtZC0+Y21uZFswXSk7CisKKwkJaWYgKHhsYXRfZnVuYykK KwkJCWF0YV9zY3NpX3RyYW5zbGF0ZV91bGkoYXAsIGRldiwgY21kLCBkb25lLCB4bGF0X2Z1bmMp OworCQllbHNlCisJCQlhdGFfc2NzaV9zaW11bGF0ZV91bGkoYXAsIGRldiwgY21kLCBkb25lKTsK Kwl9IGVsc2UKKwkJYXRhX3Njc2lfdHJhbnNsYXRlX3VsaShhcCwgZGV2LCBjbWQsIGRvbmUsIGF0 YXBpX3hsYXRfdWxpKTsKKworb3V0X3VubG9jazoKKwlyZXR1cm4gMDsKK30KKy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8KKworLyoqCisgKglhdGFfcWNfdGltZW91dF91bGkgLSBIYW5kbGUgdGltZW91dCBvZiBxdWV1 ZWQgY29tbWFuZAorICoJQHFjOiBDb21tYW5kIHRoYXQgdGltZWQgb3V0CisgKgorICoJU29tZSBw YXJ0IG9mIHRoZSBrZXJuZWwgKGN1cnJlbnRseSwgb25seSB0aGUgU0NTSSBsYXllcikKKyAqCWhh cyBub3RpY2VkIHRoYXQgdGhlIGFjdGl2ZSBjb21tYW5kIG9uIHBvcnQgQGFwIGhhcyBub3QKKyAq CWNvbXBsZXRlZCBhZnRlciBhIHNwZWNpZmllZCBsZW5ndGggb2YgdGltZS4gIEhhbmRsZSB0aGlz CisgKgljb25kaXRpb24gYnkgZGlzYWJsaW5nIERNQSAoaWYgbmVjZXNzYXJ5KSBhbmQgY29tcGxl dGluZworICoJdHJhbnNhY3Rpb25zLCB3aXRoIGVycm9yIGlmIG5lY2Vzc2FyeS4KKyAqCisgKglU aGlzIGFsc28gaGFuZGxlcyB0aGUgY2FzZSBvZiB0aGUgImxvc3QgaW50ZXJydXB0Iiwgd2hlcmUK KyAqCWZvciBzb21lIHJlYXNvbiAocG9zc2libHkgaGFyZHdhcmUgYnVnLCBwb3NzaWJseSBkcml2 ZXIgYnVnKQorICoJYW4gaW50ZXJydXB0IHdhcyBub3QgZGVsaXZlcmVkIHRvIHRoZSBkcml2ZXIs IGV2ZW4gdGhvdWdoIHRoZQorICoJdHJhbnNhY3Rpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4K KyAqCisgKglMT0NLSU5HOgorICovCisKK3N0YXRpYyB2b2lkIGF0YV9xY190aW1lb3V0X3VsaShz dHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKQoreworCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBxYy0+ YXA7CisJdTggaG9zdF9zdGF0ID0gMCwgZHJ2X3N0YXQ7CisKKwlEUFJJTlRLKCJFTlRFUlxuIik7 CisKKwkvKiBoYWNrIGFsZXJ0ISAgV2UgY2Fubm90IHVzZSB0aGUgc3VwcGxpZWQgY29tcGxldGlv bgorCSAqIGZ1bmN0aW9uIGZyb20gaW5zaWRlIHRoZSAtPmVoX3N0cmF0ZWd5X2hhbmRsZXIoKSB0 aHJlYWQuCisJICogbGliYXRhIGlzIHRoZSBvbmx5IHVzZXIgb2YgLT5laF9zdHJhdGVneV9oYW5k bGVyKCkgaW4KKwkgKiBhbnkga2VybmVsLCBzbyB0aGUgZGVmYXVsdCBzY3NpX2RvbmUoKSBhc3N1 bWVzIGl0IGlzCisJICogbm90IGJlaW5nIGNhbGxlZCBmcm9tIHRoZSBTQ1NJIEVILgorCSAqLwor CXFjLT5zY3NpZG9uZSA9IHNjc2lfZmluaXNoX2NvbW1hbmQ7CisKKwlzd2l0Y2ggKHFjLT50Zi5w cm90b2NvbCkgeworCisJY2FzZSBBVEFfUFJPVF9ETUE6CisJY2FzZSBBVEFfUFJPVF9BVEFQSV9E TUE6CisJCWhvc3Rfc3RhdCA9IGF0YV9ibWRtYV9zdGF0dXMoYXApOworCisJCS8qIGJlZm9yZSB3 ZSBkbyBhbnl0aGluZyBlbHNlLCBjbGVhciBETUEtU3RhcnQgYml0ICovCisJCWF0YV9ibWRtYV9z dG9wKGFwKTsKKworCQkvKiBmYWxsIHRocm91Z2ggKi8KKworCWRlZmF1bHQ6CisJCWF0YV9hbHRz dGF0dXMoYXApOworCQlkcnZfc3RhdCA9IGF0YV9jaGtfc3RhdHVzKGFwKTsKKworCQkvKiBhY2sg Ym1kbWEgaXJxIGV2ZW50cyAqLworCQlhdGFfYm1kbWFfYWNrX2lycShhcCk7CisKKwkJcHJpbnRr KEtFUk5fRVJSICJhdGEldTogY29tbWFuZCAweCV4IHRpbWVvdXQsIHN0YXQgMHgleCBob3N0X3N0 YXQgMHgleFxuIiwKKwkJICAgICAgIGFwLT5pZCwgcWMtPnRmLmNvbW1hbmQsIGRydl9zdGF0LCBo b3N0X3N0YXQpOworCisJCS8qIGNvbXBsZXRlIHRhc2tmaWxlIHRyYW5zYWN0aW9uICovCisJCWF0 YV9xY19jb21wbGV0ZShxYywgZHJ2X3N0YXQpOworCQlicmVhazsKKwl9CisKKwlEUFJJTlRLKCJF WElUXG4iKTsKK30KKworLyoqCisgKglhdGFfZW5nX3RpbWVvdXRfdWxpIC0gSGFuZGxlIHRpbWVv dXQgb2YgcXVldWVkIGNvbW1hbmQKKyAqCUBhcDogUG9ydCBvbiB3aGljaCB0aW1lZC1vdXQgY29t bWFuZCBpcyBhY3RpdmUKKyAqCisgKglTb21lIHBhcnQgb2YgdGhlIGtlcm5lbCAoY3VycmVudGx5 LCBvbmx5IHRoZSBTQ1NJIGxheWVyKQorICoJaGFzIG5vdGljZWQgdGhhdCB0aGUgYWN0aXZlIGNv bW1hbmQgb24gcG9ydCBAYXAgaGFzIG5vdAorICoJY29tcGxldGVkIGFmdGVyIGEgc3BlY2lmaWVk IGxlbmd0aCBvZiB0aW1lLiAgSGFuZGxlIHRoaXMKKyAqCWNvbmRpdGlvbiBieSBkaXNhYmxpbmcg RE1BIChpZiBuZWNlc3NhcnkpIGFuZCBjb21wbGV0aW5nCisgKgl0cmFuc2FjdGlvbnMsIHdpdGgg ZXJyb3IgaWYgbmVjZXNzYXJ5LgorICoKKyAqCVRoaXMgYWxzbyBoYW5kbGVzIHRoZSBjYXNlIG9m IHRoZSAibG9zdCBpbnRlcnJ1cHQiLCB3aGVyZQorICoJZm9yIHNvbWUgcmVhc29uIChwb3NzaWJs eSBoYXJkd2FyZSBidWcsIHBvc3NpYmx5IGRyaXZlciBidWcpCisgKglhbiBpbnRlcnJ1cHQgd2Fz IG5vdCBkZWxpdmVyZWQgdG8gdGhlIGRyaXZlciwgZXZlbiB0aG91Z2ggdGhlCisgKgl0cmFuc2Fj dGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LgorICoKKyAqCUxPQ0tJTkc6CisgKglJbmhlcml0 ZWQgZnJvbSBTQ1NJIGxheWVyIChub25lLCBjYW4gc2xlZXApCisgKi8KKworc3RhdGljIHZvaWQg YXRhX2VuZ190aW1lb3V0X3VsaShzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCXN0cnVjdCBhdGFf cXVldWVkX2NtZCAqcWM7CisKKwlEUFJJTlRLKCJFTlRFUlxuIik7CisJCisJLy9hZGQgYnkgY2xl YXIgY2hldW5nIDIwMDQvMTIvNworCWlmdGltZW91dD0xOworCisJcWMgPSBhdGFfcWNfZnJvbV90 YWcoYXAsIGFwLT5hY3RpdmVfdGFnKTsKKwlpZiAoIXFjKSB7CisJCXByaW50ayhLRVJOX0VSUiAi YXRhJXU6IEJVRzogdGltZW91dCB3aXRob3V0IGNvbW1hbmRcbiIsCisJCSAgICAgICBhcC0+aWQp OworCQlnb3RvIG91dDsKKwl9CisKKwlhdGFfcWNfdGltZW91dF91bGkocWMpOworCitvdXQ6CisJ RFBSSU5USygiRVhJVFxuIik7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworbW9k dWxlX2luaXQodWxpX2luaXQpOworbW9kdWxlX2V4aXQodWxpX2V4aXQpOwo= --0__=C7BBE5F9DFB046DB8f9e8a93df938690918cC7BBE5F9DFB046DB--