From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1030818AbXDVT1a (ORCPT ); Sun, 22 Apr 2007 15:27:30 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1030572AbXDVT06 (ORCPT ); Sun, 22 Apr 2007 15:26:58 -0400 Received: from nic2.axis.se ([193.13.178.10]:47770 "EHLO krynn.se.axis.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1030788AbXDVT0e (ORCPT ); Sun, 22 Apr 2007 15:26:34 -0400 X-MimeOLE: Produced By Microsoft Exchange V6.0.6603.0 content-class: urn:content-classes:message MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----_=_NextPart_001_01C78514.158A3EB0" Subject: PATCH 2.6.20 14/14; CRIS architecture update - SPI Date: Sun, 22 Apr 2007 21:26:11 +0200 Message-ID: X-MS-Has-Attach: yes X-MS-TNEF-Correlator: Thread-Topic: PATCH 2.6.20 13/14; CRIS architecture update - SPI Thread-Index: AceFE8zpyHHxB67sS7iE7DDtbU9ExQ== From: "Mikael Starvik" To: Cc: X-OriginalArrivalTime: 22 Apr 2007 19:26:12.0979 (UTC) FILETIME=[16AF8430:01C78514] Sender: linux-kernel-owner@vger.kernel.org X-Mailing-List: linux-kernel@vger.kernel.org This is a multi-part message in MIME format. ------_=_NextPart_001_01C78514.158A3EB0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 VGhlIGF0dGFjaGVkIHBhdGNoIGFkZHMgYSBDUklTIFNQSSBkcml2ZXINCiANClNpZ25lZC1vZmYt Ynk6IE1pa2FlbCBTdGFydmlrIDxzdGFydmlrQGF4aXMuY29tIDxtYWlsdG86c3RhcnZpa0BheGlz LmNvbT4gPg0KIA0KL01pa2FlbA0KIA0K ------_=_NextPart_001_01C78514.158A3EB0 Content-Type: application/octet-stream; name="cris14_spi.patch" Content-Transfer-Encoding: base64 Content-Description: cris14_spi.patch Content-Disposition: attachment; filename="cris14_spi.patch" ZGlmZiAtdXJOUCAtLWV4Y2x1ZGU9JyouY3ZzaWdub3JlJyAuLi9saW51eC9kcml2ZXJzL3NwaS9L Y29uZmlnIGxpbnV4LTIuNi9kcml2ZXJzL3NwaS9LY29uZmlnCi0tLSAuLi9saW51eC9kcml2ZXJz L3NwaS9LY29uZmlnCTIwMDctMDItMDQgMTk6NDQ6NTQuMDAwMDAwMDAwICswMTAwCisrKyBsaW51 eC0yLjYvZHJpdmVycy9zcGkvS2NvbmZpZwkyMDA3LTAzLTA4IDEyOjM3OjI0LjAwMDAwMDAwMCAr MDEwMApAQCAtNzUsNiArNzUsMjYgQEAKIAkgIGluZXhwZW5zaXZlIGJhdHRlcnkgcG93ZXJlZCBt aWNyb2NvbnRyb2xsZXIgZXZhbHVhdGlvbiBib2FyZC4KIAkgIFRoaXMgc2FtZSBjYWJsZSBjYW4g YmUgdXNlZCB0byBmbGFzaCBuZXcgZmlybXdhcmUuCiAKK2NvbmZpZyBTUElfRVRSQVhfU1NFUgor IyBQcm9tcHRpbmcgaXMgaGFuZGxlZCBieSB0aGUgYXJjaC1zcGVjaWZpYyBLY29uZmlnLgorCXRy aXN0YXRlCisJZGVwZW5kcyBvbiBTUElfTUFTVEVSICYmIEVUUkFYX0FSQ0hfVjMyICYmIEVYUEVS SU1FTlRBTAorCXNlbGVjdCBTUElfQklUQkFORworCWhlbHAKKwkgIFRoaXMgZW5hYmxlcyB1c2lu ZyBhbiBzeW5jaHJvbm91cyBzZXJpYWwgKHNzZXIpIHBvcnQgYXMgYQorCSAgU1BJIG1hc3RlciBj b250cm9sbGVyIG9uIEF4aXMgRVRSQVggRlMgYW5kIGxhdGVyLiAgVGhlCisJICBkcml2ZXIgY2Fu IGJlIGNvbmZpZ3VyZWQgdG8gdXNlIGFueSBzc2VyIHBvcnQuCisKK2NvbmZpZyBTUElfRVRSQVhf R1BJTworIyBQcm9tcHRpbmcgaXMgaGFuZGxlZCBieSB0aGUgYXJjaC1zcGVjaWZpYyBLY29uZmln LgorCXRyaXN0YXRlCisJZGVwZW5kcyBvbiBTUElfTUFTVEVSICYmIEVUUkFYX0FSQ0hfVjMyICYm IEVYUEVSSU1FTlRBTAorCXNlbGVjdCBTUElfQklUQkFORworCWhlbHAKKwkgIFRoaXMgZW5hYmxl cyB1c2luZyBHUElPIHBpbnMgcG9ydCBhcyBhIFNQSSBtYXN0ZXIgY29udHJvbGxlcgorCSAgb24g QXhpcyBFVFJBWCBGUyBhbmQgbGF0ZXIuICBUaGUgZHJpdmVyIGNhbiBiZSBjb25maWd1cmVkIHRv CisJICB1c2UgYW55IEdQSU8gcGlucy4KKwogY29uZmlnIFNQSV9NUEM4M3h4CiAJdHJpc3RhdGUg IkZyZWVzY2FsZSBNUEM4M3h4IFNQSSBjb250cm9sbGVyIgogCWRlcGVuZHMgb24gU1BJX01BU1RF UiAmJiBQUENfODN4eCAmJiBFWFBFUklNRU5UQUwKZGlmZiAtdXJOUCAtLWV4Y2x1ZGU9JyouY3Zz aWdub3JlJyAuLi9saW51eC9kcml2ZXJzL3NwaS9NYWtlZmlsZSBsaW51eC0yLjYvZHJpdmVycy9z cGkvTWFrZWZpbGUKLS0tIC4uL2xpbnV4L2RyaXZlcnMvc3BpL01ha2VmaWxlCTIwMDctMDItMDQg MTk6NDQ6NTQuMDAwMDAwMDAwICswMTAwCisrKyBsaW51eC0yLjYvZHJpdmVycy9zcGkvTWFrZWZp bGUJMjAwNy0wMS0yOSAxNTo1OTo0NC4wMDAwMDAwMDAgKzAxMDAKQEAgLTEzLDYgKzEzLDggQEAK ICMgU1BJIG1hc3RlciBjb250cm9sbGVyIGRyaXZlcnMgKGJ1cykKIG9iai0kKENPTkZJR19TUElf QklUQkFORykJCSs9IHNwaV9iaXRiYW5nLm8KIG9iai0kKENPTkZJR19TUElfQlVUVEVSRkxZKQkJ Kz0gc3BpX2J1dHRlcmZseS5vCitvYmotJChDT05GSUdfU1BJX0VUUkFYX1NTRVIpCQkrPSBzcGlf Y3Jpc3YzMl9zc2VyLm8KK29iai0kKENPTkZJR19TUElfRVRSQVhfR1BJTykJCSs9IHNwaV9jcmlz djMyX2dwaW8ubwogb2JqLSQoQ09ORklHX1NQSV9QWEEyWFgpCQkrPSBweGEyeHhfc3BpLm8KIG9i ai0kKENPTkZJR19TUElfTVBDODN4eCkJCSs9IHNwaV9tcGM4M3h4Lm8KIG9iai0kKENPTkZJR19T UElfUzNDMjRYWF9HUElPKQkJKz0gc3BpX3MzYzI0eHhfZ3Bpby5vCmRpZmYgLXVyTlAgLS1leGNs dWRlPScqLmN2c2lnbm9yZScgLi4vbGludXgvZHJpdmVycy9zcGkvcHhhMnh4X3NwaS5jIGxpbnV4 LTIuNi9kcml2ZXJzL3NwaS9weGEyeHhfc3BpLmMKLS0tIC4uL2xpbnV4L2RyaXZlcnMvc3BpL3B4 YTJ4eF9zcGkuYwkyMDA3LTAyLTA0IDE5OjQ0OjU0LjAwMDAwMDAwMCArMDEwMAorKysgbGludXgt Mi42L2RyaXZlcnMvc3BpL3B4YTJ4eF9zcGkuYwkyMDA3LTAzLTA4IDEyOjM3OjI0LjAwMDAwMDAw MCArMDEwMApAQCAtMTIxNCw5ICsxMjE0LDkgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZv aWQgY2xlYW51cChjb25zdCBzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQorc3RhdGljIHZvaWQgY2xl YW51cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQogewotCXN0cnVjdCBjaGlwX2RhdGEgKmNoaXAg PSBzcGlfZ2V0X2N0bGRhdGEoKHN0cnVjdCBzcGlfZGV2aWNlICopc3BpKTsKKwlzdHJ1Y3QgY2hp cF9kYXRhICpjaGlwID0gc3BpX2dldF9jdGxkYXRhKHNwaSk7CiAKIAlrZnJlZShjaGlwKTsKIH0K ZGlmZiAtdXJOUCAtLWV4Y2x1ZGU9JyouY3ZzaWdub3JlJyAuLi9saW51eC9kcml2ZXJzL3NwaS9z cGlfYml0YmFuZy5jIGxpbnV4LTIuNi9kcml2ZXJzL3NwaS9zcGlfYml0YmFuZy5jCi0tLSAuLi9s aW51eC9kcml2ZXJzL3NwaS9zcGlfYml0YmFuZy5jCTIwMDctMDItMDQgMTk6NDQ6NTQuMDAwMDAw MDAwICswMTAwCisrKyBsaW51eC0yLjYvZHJpdmVycy9zcGkvc3BpX2JpdGJhbmcuYwkyMDA3LTAz LTA4IDEyOjM3OjI0LjAwMDAwMDAwMCArMDEwMApAQCAtNzMsMTAgKzczLDE0IEBACiAJdTgJCQkq cnggPSB0LT5yeF9idWY7CiAKIAl3aGlsZSAobGlrZWx5KGNvdW50ID4gMCkpIHsKLQkJdTgJCXdv cmQgPSAwOworCQl1OAkJd29yZDsKIAogCQlpZiAodHgpCiAJCQl3b3JkID0gKnR4Kys7CisJCWVs c2UgaWYgKHNwaS0+bW9kZSAmIFNQSV9UWF8xKQorCQkJd29yZCA9IH4wOworCQllbHNlCisJCQl3 b3JkID0gMDsKIAkJd29yZCA9IHR4cnhfd29yZChzcGksIG5zLCB3b3JkLCBiaXRzKTsKIAkJaWYg KHJ4KQogCQkJKnJ4KysgPSB3b3JkOwpAQCAtOTksMTAgKzEwMywxNCBAQAogCXUxNgkJCSpyeCA9 IHQtPnJ4X2J1ZjsKIAogCXdoaWxlIChsaWtlbHkoY291bnQgPiAxKSkgewotCQl1MTYJCXdvcmQg PSAwOworCQl1MTYJCXdvcmQ7CiAKIAkJaWYgKHR4KQogCQkJd29yZCA9ICp0eCsrOworCQllbHNl IGlmIChzcGktPm1vZGUgJiBTUElfVFhfMSkKKwkJCXdvcmQgPSB+MDsKKwkJZWxzZQorCQkJd29y ZCA9IDA7CiAJCXdvcmQgPSB0eHJ4X3dvcmQoc3BpLCBucywgd29yZCwgYml0cyk7CiAJCWlmIChy eCkKIAkJCSpyeCsrID0gd29yZDsKQEAgLTEyNSwxMCArMTMzLDE0IEBACiAJdTMyCQkJKnJ4ID0g dC0+cnhfYnVmOwogCiAJd2hpbGUgKGxpa2VseShjb3VudCA+IDMpKSB7Ci0JCXUzMgkJd29yZCA9 IDA7CisJCXUzMgkJd29yZDsKIAogCQlpZiAodHgpCiAJCQl3b3JkID0gKnR4Kys7CisJCWVsc2Ug aWYgKHNwaS0+bW9kZSAmIFNQSV9UWF8xKQorCQkJd29yZCA9IH4wOworCQllbHNlCisJCQl3b3Jk ID0gMDsKIAkJd29yZCA9IHR4cnhfd29yZChzcGksIG5zLCB3b3JkLCBiaXRzKTsKIAkJaWYgKHJ4 KQogCQkJKnJ4KysgPSB3b3JkOwpAQCAtMTc2LDYgKzE4OCw4IEBACiB9CiBFWFBPUlRfU1lNQk9M X0dQTChzcGlfYml0YmFuZ19zZXR1cF90cmFuc2Zlcik7CiAKKyNkZWZpbmUgTU9ERUJJVFMJKFNQ SV9DUEhBIHwgU1BJX0NQT0wgfCBTUElfQ1NfSElHSCB8IFNQSV9UWF8xKQorCiAvKioKICAqIHNw aV9iaXRiYW5nX3NldHVwIC0gZGVmYXVsdCBzZXR1cCBmb3IgcGVyLXdvcmQgSS9PIGxvb3BzCiAg Ki8KQEAgLTE5Miw4ICsyMDYsMTEgQEAKIAkgKiBqdXN0IGJpdGJhbmdfdHhyeF9sZV9jcGhhWCgp IHJvdXRpbmVzIHNoaWZ0aW5nIHRoZSBvdGhlciB3YXksIGFuZAogCSAqIHNvbWUgaGFyZHdhcmUg Y29udHJvbGxlcnMgYWxzbyBoYXZlIHRoaXMgc3VwcG9ydC4KIAkgKi8KLQlpZiAoKHNwaS0+bW9k ZSAmIFNQSV9MU0JfRklSU1QpICE9IDApCisJaWYgKHNwaS0+bW9kZSAmIH5NT0RFQklUUykgewor CQlkZXZfZGJnKCZzcGktPmRldiwgInVuc3VwcG9ydGVkIFNQSSBtb2RlIGJpdHMgJTA0eFxuIiwK KwkJCQlzcGktPm1vZGUgJiB+TU9ERUJJVFMpOwogCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAKIAlp ZiAoIWNzKSB7CiAJCWNzID0ga3phbGxvYyhzaXplb2YgKmNzLCBHRlBfS0VSTkVMKTsKQEAgLTIx MCw3ICsyMjcsNyBAQAogCWlmICghY3MtPnR4cnhfd29yZCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAK LQlyZXR2YWwgPSBzcGlfYml0YmFuZ19zZXR1cF90cmFuc2ZlcihzcGksIE5VTEwpOworCXJldHZh bCA9IGJpdGJhbmctPnNldHVwX3RyYW5zZmVyKHNwaSwgTlVMTCk7CiAJaWYgKHJldHZhbCA8IDAp CiAJCXJldHVybiByZXR2YWw7CiAKQEAgLTIzOCw3ICsyNTUsNyBAQAogLyoqCiAgKiBzcGlfYml0 YmFuZ19jbGVhbnVwIC0gZGVmYXVsdCBjbGVhbnVwIGZvciBwZXItd29yZCBJL08gbG9vcHMKICAq Lwotdm9pZCBzcGlfYml0YmFuZ19jbGVhbnVwKGNvbnN0IHN0cnVjdCBzcGlfZGV2aWNlICpzcGkp Cit2b2lkIHNwaV9iaXRiYW5nX2NsZWFudXAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKIHsKIAlr ZnJlZShzcGktPmNvbnRyb2xsZXJfc3RhdGUpOwogfQpAQCAtNDQyLDkgKzQ1OSwxMCBAQAogICog aGFyZHdhcmUgdGhhdCBiYXNpY2FsbHkgZXhwb3NlcyBhIHNoaWZ0IHJlZ2lzdGVyKSBvciBwZXIt c3BpX3RyYW5zZmVyCiAgKiAod2hpY2ggdGFrZXMgYmV0dGVyIGFkdmFudGFnZSBvZiBoYXJkd2Fy ZSBsaWtlIGZpZm9zIG9yIERNQSBlbmdpbmVzKS4KICAqCi0gKiBEcml2ZXJzIHVzaW5nIHBlci13 b3JkIEkvTyBsb29wcyBzaG91bGQgdXNlIChvciBjYWxsKSBzcGlfYml0YmFuZ19zZXR1cCBhbmQK LSAqIHNwaV9iaXRiYW5nX2NsZWFudXAgdG8gaGFuZGxlIHRob3NlIHNwaSBtYXN0ZXIgbWV0aG9k cy4gIFRob3NlIG1ldGhvZHMgYXJlCi0gKiB0aGUgZGVmYXVsdHMgaWYgdGhlIGJpdGJhbmctPnR4 cnhfYnVmcyByb3V0aW5lIGlzbid0IGluaXRpYWxpemVkLgorICogRHJpdmVycyB1c2luZyBwZXIt d29yZCBJL08gbG9vcHMgc2hvdWxkIHVzZSAob3IgY2FsbCkgc3BpX2JpdGJhbmdfc2V0dXAsCisg KiBzcGlfYml0YmFuZ19jbGVhbnVwIGFuZCBzcGlfYml0YmFuZ19zZXR1cF90cmFuc2ZlciB0byBo YW5kbGUgdGhvc2Ugc3BpCisgKiBtYXN0ZXIgbWV0aG9kcy4gIFRob3NlIG1ldGhvZHMgYXJlIHRo ZSBkZWZhdWx0cyBpZiB0aGUgYml0YmFuZy0+dHhyeF9idWZzCisgKiByb3V0aW5lIGlzbid0IGlu aXRpYWxpemVkLgogICoKICAqIFRoaXMgcm91dGluZSByZWdpc3RlcnMgdGhlIHNwaV9tYXN0ZXIs IHdoaWNoIHdpbGwgcHJvY2VzcyByZXF1ZXN0cyBpbiBhCiAgKiBkZWRpY2F0ZWQgdGFzaywga2Vl cGluZyBJUlFzIHVuYmxvY2tlZCBtb3N0IG9mIHRoZSB0aW1lLiAgVG8gc3RvcApkaWZmIC11ck5Q IC0tZXhjbHVkZT0nKi5jdnNpZ25vcmUnIC4uL2xpbnV4L2RyaXZlcnMvc3BpL3NwaS5jIGxpbnV4 LTIuNi9kcml2ZXJzL3NwaS9zcGkuYwotLS0gLi4vbGludXgvZHJpdmVycy9zcGkvc3BpLmMJMjAw Ny0wMi0wNCAxOTo0NDo1NC4wMDAwMDAwMDAgKzAxMDAKKysrIGxpbnV4LTIuNi9kcml2ZXJzL3Nw aS9zcGkuYwkyMDA3LTAzLTA4IDEyOjM3OjI0LjAwMDAwMDAwMCArMDEwMApAQCAtMzIsNyArMzIs NyBAQAogICovCiBzdGF0aWMgdm9pZCBzcGlkZXZfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYp CiB7Ci0JY29uc3Qgc3RydWN0IHNwaV9kZXZpY2UJKnNwaSA9IHRvX3NwaV9kZXZpY2UoZGV2KTsK KwlzdHJ1Y3Qgc3BpX2RldmljZQkqc3BpID0gdG9fc3BpX2RldmljZShkZXYpOwogCiAJLyogc3Bp IG1hc3RlcnMgbWF5IGNsZWFudXAgZm9yIHJlbGVhc2VkIGRldmljZXMgKi8KIAlpZiAoc3BpLT5t YXN0ZXItPmNsZWFudXApCmRpZmYgLXVyTlAgLS1leGNsdWRlPScqLmN2c2lnbm9yZScgLi4vbGlu dXgvZHJpdmVycy9zcGkvc3BpX2NyaXN2MzJfZ3Bpby5jIGxpbnV4LTIuNi9kcml2ZXJzL3NwaS9z cGlfY3Jpc3YzMl9ncGlvLmMKLS0tIC4uL2xpbnV4L2RyaXZlcnMvc3BpL3NwaV9jcmlzdjMyX2dw aW8uYwkxOTcwLTAxLTAxIDAxOjAwOjAwLjAwMDAwMDAwMCArMDEwMAorKysgbGludXgtMi42L2Ry aXZlcnMvc3BpL3NwaV9jcmlzdjMyX2dwaW8uYwkyMDA3LTAxLTI5IDE1OjU5OjQ0LjAwMDAwMDAw MCArMDEwMApAQCAtMCwwICsxLDI2MiBAQAorLyoKKyAqIFNpbXBsZSBiaXRiYW5nZWQtR1BJTyBT UEkgZHJpdmVyIGZvciBFVFJBWCBGUyBldCBhbC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcg QXhpcyBDb21tdW5pY2F0aW9ucyBBQgorICoKKyAqIEF1dGhvcjogSGFucy1QZXRlciBOaWxzc29u LCBpbnNwaXJlZCBieSBlYXJsaWVyIHdvcmsgYnkKKyAqIEFuZHJlIFNwYW5iZXJnIGJ1dCBtb3N0 bHkgYnkgY29weWluZyBsYXJnZSBwYXJ0cyBvZgorICogc3BpX3MzYzI0eHhfZ3Bpby5jLCBoZW5j ZSBhbHNvOgorICogQ29weXJpZ2h0IChjKSAyMDA2IEJlbiBEb29rcworICogQ29weXJpZ2h0IChj KSAyMDA2IFNpbXRlYyBFbGVjdHJvbmljcworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNv ZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRl ciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBh cworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICov CisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgor I2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpX2JpdGJh bmcuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3Jt X2RldmljZS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2JvYXJk Lmg+CisKKy8qIE91ciBtYWluIGRyaXZlciBzdGF0ZS4gICovCisKK3N0cnVjdCBjcmlzdjMyX3Nw aV9od19pbmZvIHsKKwlzdHJ1Y3QgY3Jpc3YzMl9pb3BpbiBzY2xrOworCXN0cnVjdCBjcmlzdjMy X2lvcGluIG1vc2k7CisJc3RydWN0IGNyaXN2MzJfaW9waW4gbWlzbzsKKwlzdHJ1Y3QgY3Jpc3Yz Ml9pb3BpbiBjczsKK307CisKKy8qCisgKiBUaGUgZHJpdmVyIHN0YXRlIGhpZGVzIGJlaGluZCB0 aGUgc3BpX2JpdGJhbmcgc3RhdGUuICBXZSdyZQorICogcmVzcG9uc2libGUgZm9yIGFsbG9jYXRp bmcgdGhhdCwgc28gd2UgY2FuIGdldCBhIGxpdHRsZSBzb21ldGhpbmcKKyAqIGZvciBvdXJzZWx2 ZXMuCisgKi8KKworc3RydWN0IGNyaXN2MzJfc3BpX2dwaW9fZGV2ZGF0YSB7CisJc3RydWN0IHNw aV9iaXRiYW5nIGJpdGJhbmc7CisJc3RydWN0IGNyaXN2MzJfc3BpX2h3X2luZm8gcGluczsKK307 CisKKy8qIEhlbHBlciBmdW5jdGlvbiBnZXR0aW5nIHRoZSBkcml2ZXIgc3RhdGUgZnJvbSBhIHNw aV9kZXZpY2UuICAqLworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBjcmlzdjMyX3NwaV9od19pbmZv ICpzcGlkZXZfdG9faHcoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgY3Jpc3Yz Ml9zcGlfZ3Bpb19kZXZkYXRhICpkZCA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0 ZXIpOworCXJldHVybiAmZGQtPnBpbnM7Cit9CisKKy8qIFRoZSBTUEktYml0YmFuZyBmdW5jdGlv bnM6IHNlZSBzcGlfYml0YmFuZy5oIGF0IEVYUEFORF9CSVRCQU5HX1RYUlguICAqLworCitzdGF0 aWMgaW5saW5lIHZvaWQgc2V0c2NrKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGludCBpc19vbikK K3sKKwljcmlzdjMyX2lvX3NldCgmc3BpZGV2X3RvX2h3KHNwaSktPnNjbGssIGlzX29uICE9IDAp OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0bW9zaShzdHJ1Y3Qgc3BpX2RldmljZSAqc3Bp LCBpbnQgaXNfb24pCit7CisJY3Jpc3YzMl9pb19zZXQoJnNwaWRldl90b19odyhzcGkpLT5tb3Np LCBpc19vbiAhPSAwKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgZ2V0bWlzbyhzdHJ1Y3Qgc3Bp X2RldmljZSAqc3BpKQoreworCXJldHVybiBjcmlzdjMyX2lvX3JkKCZzcGlkZXZfdG9faHcoc3Bp KS0+bWlzbykgIT0gMCA/IDEgOiAwOworfQorCisjZGVmaW5lIHNwaWRlbGF5KHgpIG5kZWxheSh4 KQorCisjZGVmaW5lCUVYUEFORF9CSVRCQU5HX1RYUlgKKyNpbmNsdWRlIDxsaW51eC9zcGkvc3Bp X2JpdGJhbmcuaD4KKworLyoKKyAqIFNQSS1iaXRiYW5nIHdvcmQgdHJhbnNtaXQtZnVuY3Rpb25z IGZvciB0aGUgZm91ciBTUEkgbW9kZXMsCisgKiBkaXNwYXRjaGluZyB0byB0aGUgaW5saW5lZCBm dW5jdGlvbnMgd2UganVzdCBpbmNsdWRlZC4KKyAqLworCitzdGF0aWMgdTMyIGNyaXN2MzJfc3Bp X2dwaW9fdHhyeF9tb2RlMChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAorCQkJCSAgICAgIHVuc2ln bmVkIG5zZWNzLCB1MzIgd29yZCwgdTggYml0cykKK3sKKwlyZXR1cm4gYml0YmFuZ190eHJ4X2Jl X2NwaGEwKHNwaSwgbnNlY3MsIDAsIHdvcmQsIGJpdHMpOworfQorCitzdGF0aWMgdTMyIGNyaXN2 MzJfc3BpX2dwaW9fdHhyeF9tb2RlMShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAorCQkJCSAgICAg ICB1bnNpZ25lZCBuc2VjcywgdTMyIHdvcmQsIHU4IGJpdHMpCit7CisJcmV0dXJuIGJpdGJhbmdf dHhyeF9iZV9jcGhhMShzcGksIG5zZWNzLCAwLCB3b3JkLCBiaXRzKTsKK30KKworc3RhdGljIHUz MiBjcmlzdjMyX3NwaV9ncGlvX3R4cnhfbW9kZTIoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKKwkJ CQkgICAgICB1bnNpZ25lZCBuc2VjcywgdTMyIHdvcmQsIHU4IGJpdHMpCit7CisJcmV0dXJuIGJp dGJhbmdfdHhyeF9iZV9jcGhhMChzcGksIG5zZWNzLCAxLCB3b3JkLCBiaXRzKTsKK30KKworc3Rh dGljIHUzMiBjcmlzdjMyX3NwaV9ncGlvX3R4cnhfbW9kZTMoc3RydWN0IHNwaV9kZXZpY2UgKnNw aSwKKwkJCQkgICAgICAgdW5zaWduZWQgbnNlY3MsIHUzMiB3b3JkLCB1OCBiaXRzKQoreworCXJl dHVybiBiaXRiYW5nX3R4cnhfYmVfY3BoYTEoc3BpLCBuc2VjcywgMSwgd29yZCwgYml0cyk7Cit9 CisKKy8qIFNQSS1iaXRiYW5nIGNoaXAtc2VsZWN0IGZ1bmN0aW9uLiAgKi8KKworc3RhdGljIHZv aWQgY3Jpc3YzMl9zcGlfZ3Bpb19jaGlwc2VsZWN0KHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGlu dCB2YWx1ZSkKK3sKKwlpZiAoc3BpLT5tb2RlICYgU1BJX0NTX0hJR0gpCisJCWNyaXN2MzJfaW9f c2V0KCZzcGlkZXZfdG9faHcoc3BpKS0+Y3MsCisJCQkgICAgICAgdmFsdWUgPT0gQklUQkFOR19D U19BQ1RJVkUgPyAxIDogMCk7CisJZWxzZQorCQljcmlzdjMyX2lvX3NldCgmc3BpZGV2X3RvX2h3 KHNwaSktPmNzLAorCQkJICAgICAgIHZhbHVlID09IEJJVEJBTkdfQ1NfQUNUSVZFID8gMCA6IDEp OworfQorCisvKiBQbGF0Zm9ybS1kZXZpY2UgcHJvYmUgZnVuY3Rpb24uICAqLworCitzdGF0aWMg aW50IF9fZGV2aW5pdCBjcmlzdjMyX3NwaV9ncGlvX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZp Y2UgKmRldikKK3sKKwlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyOworCXN0cnVjdCBjcmlzdjMy X3NwaV9ncGlvX2RldmRhdGEgICpkZDsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlzdHJ1Y3Qg Y3Jpc3YzMl9zcGlfZ3Bpb19jb250cm9sbGVyX2RhdGEgKmdjOworCWludCByZXQgPSAwOworCisJ LyoKKwkgKiBXZSBuZWVkIHRvIGdldCB0aGUgY29udHJvbGxlciBkYXRhIGFzIGEgaGFyZHdhcmUg cmVzb3VyY2UsCisJICogb3IgZWxzZSBpdCB3b3VsZG4ndCBiZSBhdmFpbGFibGUgdW50aWwgKmFm dGVyKiB0aGUKKwkgKiBzcGlfYml0YmFuZ19zdGFydCBjYWxsIQorCSAqLworCXJlcyA9IHBsYXRm b3JtX2dldF9yZXNvdXJjZV9ieW5hbWUoZGV2LCAwLCAiY29udHJvbGxlcl9kYXRhX3B0ciIpOwor CWlmIChyZXMgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZkZXYtPmRldiwgImNhbid0IGdldCBjb250 cm9sbGVyX2RhdGEgcmVzb3VyY2VcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlnYyA9IChz dHJ1Y3QgY3Jpc3YzMl9zcGlfZ3Bpb19jb250cm9sbGVyX2RhdGEgKikgcmVzLT5zdGFydDsKKwor CW1hc3RlciA9IHNwaV9hbGxvY19tYXN0ZXIoJmRldi0+ZGV2LCBzaXplb2YgKmRkKTsKKwlpZiAo bWFzdGVyID09IE5VTEwpIHsKKwkJZGV2X2VycigmZGV2LT5kZXYsICJmYWlsZWQgdG8gYWxsb2Nh dGUgc3BpIG1hc3RlclxuIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyOworCX0KKwor CWRkID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCXBsYXRmb3JtX3NldF9kcnZk YXRhKGRldiwgZGQpOworCisJLyoKKwkgKiBUaGUgZGV2aWNlIGRhdGEgYXNrcyBmb3IgdGhpcyBk cml2ZXIsIGFuZCBob2xkcyB0aGUgaWQKKwkgKiBudW1iZXIsIHdoaWNoIG11c3QgYmUgdW5pcXVl IGFtb25nIHRoZSBzYW1lLXR5cGUgZGV2aWNlcy4KKwkgKiBXZSB1c2UgdGhpcyBhcyB0aGUgbnVt YmVyIG9mIHRoaXMgU1BJIGJ1cy4KKwkgKi8KKwltYXN0ZXItPmJ1c19udW0gPSBkZXYtPmlkOwor CisJLyoKKwkgKiBBbGxvY2F0ZSBwaW5zLiAgTm90ZSB0aGF0IHRodXMgYmVpbmcgYWxsb2NhdGVk IGFzIEdQSU8sIHdlCisJICogZG9uJ3QgaGF2ZSB0byBkZWNvbmZpZ3VyZSB0aGVtIGF0IHRoZSBl bmQgb3IgaWYgc29tZXRoaW5nCisJICogZmFpbHMuCisJICovCisJaWYgKChyZXQgPSBjcmlzdjMy X2lvX2dldF9uYW1lKCZkZC0+cGlucy5jcywgZ2MtPmNzKSkgIT0gMAorCSAgICB8fCAocmV0ID0g Y3Jpc3YzMl9pb19nZXRfbmFtZSgmZGQtPnBpbnMubWlzbywgZ2MtPm1pc28pKSAhPSAwCisJICAg IHx8IChyZXQgPSBjcmlzdjMyX2lvX2dldF9uYW1lKCZkZC0+cGlucy5tb3NpLCBnYy0+bW9zaSkp ICE9IDAKKwkgICAgfHwgKHJldCA9IGNyaXN2MzJfaW9fZ2V0X25hbWUoJmRkLT5waW5zLnNjbGss IGdjLT5zY2xrKSkgIT0gMCkKKwkJZ290byBlcnJfbm9fcGluczsKKworCS8qIFNldCBkaXJlY3Rp b25zIG9mIHRoZSBTUEkgcGlucy4gICovCisJY3Jpc3YzMl9pb19zZXRfZGlyKCZkZC0+cGlucy5j cywgY3Jpc3YzMl9pb19kaXJfb3V0KTsKKwljcmlzdjMyX2lvX3NldF9kaXIoJmRkLT5waW5zLnNj bGssIGNyaXN2MzJfaW9fZGlyX291dCk7CisJY3Jpc3YzMl9pb19zZXRfZGlyKCZkZC0+cGlucy5t aXNvLCBjcmlzdjMyX2lvX2Rpcl9pbik7CisJY3Jpc3YzMl9pb19zZXRfZGlyKCZkZC0+cGlucy5t b3NpLCBjcmlzdjMyX2lvX2Rpcl9vdXQpOworCisJLyogU2V0IHN0YXRlIG9mIHRoZSBTUEkgcGlu cy4gICovCisJZGV2X2RiZygmZGV2LT5kZXYsICJjcy5wb3J0IDB4JXgsIHBpbjogJWRcbiIKKwkJ ZGQtPnBpbnMuY3MucG9ydCwgZGQtPnBpbnMuY3MuYml0KTsKKworCS8qCisJICogQ2FuJ3QgdXNl IGNyaXN2MzJfc3BpX2dwaW9fY2hpcHNlbGVjdChzcGksIDEpIGhlcmU7IHdlCisJICogZG9uJ3Qg aGF2ZSBhIHByb3BlciAic3BpIiB1bnRpbCBhZnRlciBzcGlfYml0YmFuZ19zdGFydC4KKwkgKi8K KwljcmlzdjMyX2lvX3NldCgmZGQtPnBpbnMuY3MsIDEpOworCWNyaXN2MzJfaW9fc2V0KCZkZC0+ cGlucy5zY2xrLCAwKTsKKwljcmlzdjMyX2lvX3NldCgmZGQtPnBpbnMubW9zaSwgMCk7CisKKwkv KiBTZXR1cCBTUEkgYml0YmFuZyBhZGFwdGVyIGhvb2tzLiAgKi8KKwlkZC0+Yml0YmFuZy5tYXN0 ZXIgPSBzcGlfbWFzdGVyX2dldChtYXN0ZXIpOworCWRkLT5iaXRiYW5nLmNoaXBzZWxlY3QgPSBj cmlzdjMyX3NwaV9ncGlvX2NoaXBzZWxlY3Q7CisKKwlkZC0+Yml0YmFuZy50eHJ4X3dvcmRbU1BJ X01PREVfMF0gPSBjcmlzdjMyX3NwaV9ncGlvX3R4cnhfbW9kZTA7CisJZGQtPmJpdGJhbmcudHhy eF93b3JkW1NQSV9NT0RFXzFdID0gY3Jpc3YzMl9zcGlfZ3Bpb190eHJ4X21vZGUxOworCWRkLT5i aXRiYW5nLnR4cnhfd29yZFtTUElfTU9ERV8yXSA9IGNyaXN2MzJfc3BpX2dwaW9fdHhyeF9tb2Rl MjsKKwlkZC0+Yml0YmFuZy50eHJ4X3dvcmRbU1BJX01PREVfM10gPSBjcmlzdjMyX3NwaV9ncGlv X3R4cnhfbW9kZTM7CisKKwlyZXQgPSBzcGlfYml0YmFuZ19zdGFydCgmZGQtPmJpdGJhbmcpOwor CWlmIChyZXQpCisJCWdvdG8gZXJyX25vX2JpdGJhbmc7CisKKwlwcmludGsgKEtFUk5fSU5GTyAi Q1JJUyB2MzIgU1BJIGRyaXZlciBmb3IgR1BJTyIKKwkJIiAoY3M6ICVzLCBtaXNvOiAlcywgbW9z aTogJXMsIHNjbGs6ICVzKVxuIiwKKwkJZ2MtPmNzLCBnYy0+bWlzbywgZ2MtPm1vc2ksIGdjLT5z Y2xrKTsKKworCXJldHVybiAwOworCisgZXJyX25vX2JpdGJhbmc6CisJc3BpX21hc3Rlcl9wdXQo ZGQtPmJpdGJhbmcubWFzdGVyKTsKKyBlcnJfbm9fcGluczoKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0 YShkZXYsIE5VTEwpOworIGVycjoKKwlyZXR1cm4gcmV0OworfQorCisvKiBQbGF0Zm9ybS1kZXZp Y2UgcmVtb3ZlLWZ1bmN0aW9uLiAgKi8KKworc3RhdGljIGludCBfX2RldmV4aXQgY3Jpc3YzMl9z cGlfZ3Bpb19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBj cmlzdjMyX3NwaV9ncGlvX2RldmRhdGEgKmRkID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2KTsK KwlpbnQgcmV0OworCisJcmV0ID0gc3BpX2JpdGJhbmdfc3RvcCgmZGQtPmJpdGJhbmcpOworCWlm IChyZXQgIT0gMCkKKwkJcmV0dXJuIHJldDsKKworCXNwaV9tYXN0ZXJfcHV0KGRkLT5iaXRiYW5n Lm1hc3Rlcik7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEoZGV2LCBOVUxMKTsKKwlyZXR1cm4gMDsK K30KKworLyoKKyAqIEZvciB0aGUgdGltZSBiZWluZywgdGhlcmUncyBubyBzdXNwZW5kL3Jlc3Vt ZSBzdXBwb3J0IHRvIGNhcmUKKyAqIGFib3V0LCBzbyB3ZSBsZXQgdGhvc2UgaGFuZGxlcnMgZGVm YXVsdCB0byBOVUxMLgorICovCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBjcmlzdjMy X3NwaV9ncGlvX2RydiA9IHsKKwkucHJvYmUJCT0gY3Jpc3YzMl9zcGlfZ3Bpb19wcm9iZSwKKwku cmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGNyaXN2MzJfc3BpX2dwaW9fcmVtb3ZlKSwKKwkuZHJpdmVy CQk9IHsKKwkJLm5hbWUJPSAic3BpX2NyaXN2MzJfZ3BpbyIsCisJCS5vd25lcgk9IFRISVNfTU9E VUxFLAorCX0sCit9OworCisvKiBNb2R1bGUgaW5pdCBmdW5jdGlvbi4gICovCisKK3N0YXRpYyBp bnQgX19kZXZpbml0IGNyaXN2MzJfc3BpX2dwaW9faW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0 Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmNyaXN2MzJfc3BpX2dwaW9fZHJ2KTsKK30KKworLyogTW9k dWxlIGV4aXQgZnVuY3Rpb24uICAqLworCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgY3Jpc3YzMl9z cGlfZ3Bpb19leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmNyaXN2 MzJfc3BpX2dwaW9fZHJ2KTsKK30KKworbW9kdWxlX2luaXQoY3Jpc3YzMl9zcGlfZ3Bpb19pbml0 KTsKK21vZHVsZV9leGl0KGNyaXN2MzJfc3BpX2dwaW9fZXhpdCk7CisKK01PRFVMRV9ERVNDUklQ VElPTigiQ1JJUyB2MzIgU1BJLUdQSU8gRHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJIYW5zLVBl dGVyIE5pbHNzb24sIDxocEBheGlzLmNvbT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlm ZiAtdXJOUCAtLWV4Y2x1ZGU9JyouY3ZzaWdub3JlJyAuLi9saW51eC9kcml2ZXJzL3NwaS9zcGlf Y3Jpc3YzMl9zc2VyLmMgbGludXgtMi42L2RyaXZlcnMvc3BpL3NwaV9jcmlzdjMyX3NzZXIuYwot LS0gLi4vbGludXgvZHJpdmVycy9zcGkvc3BpX2NyaXN2MzJfc3Nlci5jCTE5NzAtMDEtMDEgMDE6 MDA6MDAuMDAwMDAwMDAwICswMTAwCisrKyBsaW51eC0yLjYvZHJpdmVycy9zcGkvc3BpX2NyaXN2 MzJfc3Nlci5jCTIwMDctMDQtMTIgMTE6MjM6MDYuMDAwMDAwMDAwICswMjAwCkBAIC0wLDAgKzEs MTU2NyBAQAorLyoKKyAqIFNQSSBwb3J0IGRyaXZlciBmb3IgRVRSQVggRlMgZXQgYWwuIHVzaW5n IGEgc3luY2hyb25vdXMgc2VyaWFsCisgKiBwb3J0LCBidXQgc2ltcGxpZmllZCBieSB1c2luZyB0 aGUgc3BpX2JpdGJhbmcgZnJhbWV3b3JrLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNyBBeGlz IENvbW11bmljYXRpb25zIEFCCisgKgorICogQXV0aG9yOiBIYW5zLVBldGVyIE5pbHNzb24sIHRo b3VnaCBjb3B5aW5nIHBhcnRzIG9mCisgKiBzcGlfczNjMjR4eF9ncGlvLmMsIGhlbmNlIGFsc286 CisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgQmVuIERvb2tzCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYg U2ltdGVjIEVsZWN0cm9uaWNzCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7 IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0 ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBw dWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIGRy aXZlciByZXN0cmljdHMgZnJlcXVlbmN5LCBwb2xhcml0eSwgIndvcmQiIGxlbmd0aCBhbmQgZW5k aWFuCisgKiBtdWNoIG1vcmUgdGhhbiB0aGUgaGFyZHdhcmUgZG9lcy4gIEknbSBoYXBweSB0byB1 bnJlc3RyaWN0IGl0LCBidXQKKyAqIG9ubHkgd2l0aCB3aGF0IEkgY2FuIHRlc3QgbXlzZWxmIChh dCB0aW1lIG9mIHdyaXRpbmcsIGp1c3QgU0QvTU1DCisgKiBTUEkpIGFuZCB3aGF0IHBlb3BsZSBh Y3R1YWxseSB0ZXN0IGFuZCByZXBvcnQuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+ CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+ CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGlfYml0 YmFuZy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZv cm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8YXNt L2lvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvYm9hcmQuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9o d3JlZ3MvcmVnX21hcC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2h3cmVncy9yZWdfcmR3ci5oPgor I2luY2x1ZGUgPGFzbS9hcmNoL2h3cmVncy9zc2VyX2RlZnMuaD4KKyNpbmNsdWRlIDxhc20vYXJj aC9kbWEuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9od3JlZ3MvZG1hLmg+CisKKy8qIEEgc2l6ZSAi bm90IG11Y2ggbGFyZ2VyIiB0aGFuIHRoZSBtYXggdHlwaWNhbCB0cmFuc2ZlciBzaXplLiAgKi8K KyNkZWZpbmUgRE1BX0NIVU5LU0laIDUxMgorCisvKgorICogRm9yIGEgdHJhbnNmZXIgZXhwZWN0 ZWQgdG8gdGFrZSB0aGlzIGxvbmcsIHdlIGJ1c3ktd2FpdCBpbnN0ZWFkIG9mIGVuYWJsaW5nCisg KiBpbnRlcnJ1cHRzLgorICovCisjZGVmaW5lIElSUV9VU0FHRV9USFJFU0hPTERfTlMgMTQwMDAK KworLyogQSBmZXcgcmVnaXN0ZXIgYWNjZXNzIG1hY3JvcyB0byBhdm9pZCB2ZXJiaWFnZSBhbmQg cmVkdWNlIHR5cG9zLiAgKi8KKyNkZWZpbmUgUkVHX1JEX0RJKHJlZykgUkVHX1JEKGRtYSwgcmVn aV9kbWFpbiwgcmVnKQorI2RlZmluZSBSRUdfUkRfRE8ocmVnKSBSRUdfUkQoZG1hLCByZWdpX2Rt YW91dCwgcmVnKQorI2RlZmluZSBSRUdfUkRfU1NFUihyZWcpIFJFR19SRChzc2VyLCByZWdpX3Nz ZXIsIHJlZykKKyNkZWZpbmUgUkVHX1dSX0RJKHJlZywgdmFsKSBSRUdfV1IoZG1hLCByZWdpX2Rt YWluLCByZWcsIHZhbCkKKyNkZWZpbmUgUkVHX1dSX0RPKHJlZywgdmFsKSBSRUdfV1IoZG1hLCBy ZWdpX2RtYW91dCwgcmVnLCB2YWwpCisjZGVmaW5lIFJFR19XUl9TU0VSKHJlZywgdmFsKSBSRUdf V1Ioc3NlciwgcmVnaV9zc2VyLCByZWcsIHZhbCkKKyNkZWZpbmUgUkVHX1dSSU5UX0RJKHJlZywg dmFsKSBSRUdfV1JfSU5UKGRtYSwgcmVnaV9kbWFpbiwgcmVnLCB2YWwpCisjZGVmaW5lIFJFR19X UklOVF9ETyhyZWcsIHZhbCkgUkVHX1dSX0lOVChkbWEsIHJlZ2lfZG1hb3V0LCByZWcsIHZhbCkK KyNkZWZpbmUgUkVHX1dSSU5UX1NTRVIocmVnLCB2YWwpIFJFR19XUl9JTlQoc3NlciwgcmVnaV9z c2VyLCByZWcsIHZhbCkKKyNkZWZpbmUgUkVHX1JESU5UX0RJKHJlZykgUkVHX1JEX0lOVChkbWEs IHJlZ2lfZG1haW4sIHJlZykKKyNkZWZpbmUgUkVHX1JESU5UX0RPKHJlZykgUkVHX1JEX0lOVChk bWEsIHJlZ2lfZG1hb3V0LCByZWcpCisjZGVmaW5lIFJFR19SRElOVF9TU0VSKHJlZykgUkVHX1JE X0lOVChzc2VyLCByZWdpX3NzZXIsIHJlZykKKworI2RlZmluZSBETUFfV0FJVF9VTlRJTF9SRVNF VChpbnN0KQkJCVwKKyAgZG8gewkJCQkJCQlcCisJcmVnX2RtYV9yd19zdGF0IHI7CQkJCVwKKwlk byB7CQkJCQkJXAorCSAgCXIgPSBSRUdfUkQoZG1hLCAoaW5zdCksIHJ3X3N0YXQpOwlcCisJfSB3 aGlsZSAoci5tb2RlICE9IHJlZ2tfZG1hX3JzdCk7CQlcCisgIH0gd2hpbGUgKDApCisKKyNkZWZp bmUgRE1BX0JVU1koaW5zdCkgKFJFR19SRChkbWEsIGluc3QsIHJ3X3N0cmVhbV9jbWQpKS5idXN5 CisKKy8qIE91ciBtYWluIGRyaXZlciBzdGF0ZS4gICovCitzdHJ1Y3QgY3Jpc3YzMl9zcGlfaHdf aW5mbyB7CisJc3RydWN0IGNyaXN2MzJfcmVnaV9uX2ludCBzc2VyOworCXN0cnVjdCBjcmlzdjMy X3JlZ2lfbl9pbnQgZG1haW47CisJc3RydWN0IGNyaXN2MzJfcmVnaV9uX2ludCBkbWFvdXQ7CisK KwlyZWdfc3Nlcl9yd19jZmcgY2ZnOworCXJlZ19zc2VyX3J3X2ZybV9jZmcgZnJtX2NmZzsKKwly ZWdfc3Nlcl9yd190cl9jZmcgdHJfY2ZnOworCXJlZ19zc2VyX3J3X3JlY19jZmcgcmVjX2NmZzsK KwlyZWdfc3Nlcl9yd19leHRyYSBleHRyYTsKKworCS8qIFdlIHN0b3JlIHRoZSBzcGVlZCBpbiBr SHosIHNvIHdlIGNhbiBoYXZlIGV4cHJlc3Npb25zCisJICogbXVsdGlwbHlpbmcgMTAwTUh6IGJ5 ICogNCBiZWZvcmUgZGl2aWRpbmcgYnkgaXQsIGFuZCBzdGlsbAorCSAqIGtlZXAgaXQgaW4gYW4g dTMyLiAqLworCXUzMiBlZmZlY3RpdmVfc3BlZWRfa0h6OworCisJLyoKKwkgKiBUaGUgdGltZSBp biAxMHMgb2YgbmFub3NlY29uZHMgZm9yIGhhbGYgYSBjeWNsZXMuCisJICogRm9yIGNvbnZlbmll bmNlIGFuZCBwZXJmb3JtYW5jZTsgZGVyaXZlZCBmcm9tIHRoZSBhYm92ZS4KKwkgKi8KKwl1MzIg aGFsZl9jeWNsZV9kZWxheV9uczsKKworCS8qIFRoaXMgc2hvdWxkIGJlIG92ZXJyaWRhYmxlIGJ5 IGEgbW9kdWxlIHBhcmFtZXRlci4gICovCisJdTMyIG1heF9zcGVlZF9IejsKKworCS8qIFByZS1j b21wdXRlZCB0aW1vdXQgZm9yIHRoZSBtYXggdHJhbnNmZXIgY2h1bmstc2l6ZS4gICovCisJdTMy IGRtYV90aW1lb3V0OworCisJc3RydWN0IGNvbXBsZXRpb24gZG1hX2RvbmU7CisKKwkvKgorCSAq IElmIHdlIGdldCBhIHRpbWVvdXQgZnJvbSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQgb24g dGhlCisJICogYWJvdmUsIGZpcnN0IGxvb2sgYXQgdGhpcyBiZWZvcmUgcGFuaWNraW5nLgorCSAq LworCXUzMiBkbWFfYWN0dWFsbHlfZG9uZTsKKworCS8qCisJICogUmVzb3VyY2VzIGRvbid0IHNl ZW0gYXZhaWxhYmxlIGF0IHRoZSByZW1vdmUgY2FsbCwgc28gd2UKKwkgKiBoYXZlIHRvIHNhdmUg aW5mb3JtYXRpb24gd2UgZ2V0IHRocm91Z2ggdGhlbS4KKwkgKi8KKwlzdHJ1Y3QgY3Jpc3YzMl9z cGlfc3Nlcl9jb250cm9sbGVyX2RhdGEgKmdjOworfTsKKworLyoKKyAqIFRoZSBkcml2ZXIgc3Rh dGUgaGlkZXMgYmVoaW5kIHRoZSBzcGlfYml0YmFuZyBzdGF0ZTsgd2UncmUKKyAqIHJlc3BvbnNp YmxlIGZvciBhbGxvY2F0aW5nIHRoYXQsIHNvIHdlIGNhbiBnZXQgYSBsaXR0bGUgc29tZXRoaW5n CisgKiBmb3Igb3Vyc2VsdmVzLgorICovCitzdHJ1Y3QgY3Jpc3YzMl9zcGlfc3Nlcl9kZXZkYXRh IHsKKwlzdHJ1Y3Qgc3BpX2JpdGJhbmcgYml0YmFuZzsKKwlzdHJ1Y3QgY3Jpc3YzMl9zcGlfaHdf aW5mbyBodzsKK307CisKKy8qIE91ciBETUEgZGVzY3JpcHRvcnMgdGhhdCBuZWVkIGFsaWdubWVu dC4gICovCitzdHJ1Y3QgY3Jpc3YzMl9zcGlfZG1hX2Rlc2NycyB7CisJZG1hX2Rlc2NyX2NvbnRl eHQgaW5fY3R4dCBfX2F0dHJpYnV0ZV9fICgoX19hbGlnbmVkX18oMzIpKSk7CisJZG1hX2Rlc2Ny X2NvbnRleHQgb3V0X2N0eHQgX19hdHRyaWJ1dGVfXyAoKF9fYWxpZ25lZF9fKDMyKSkpOworCisJ LyoKKwkgKiBUaGUgY29kZSB0YWtlcyBhZHZhbnRhZ2Ugb2YgdGhlIGZhY3QgdGhhdCBpbl9kZXNj ciBhbmQKKwkgKiBvdXRfZGVzY3IgYXJlIG9uIHRoZSBzYW1lIGNhY2hlLWxpbmUgd2hlbiB3b3Jr aW5nIGFyb3VuZAorCSAqIHRoZSBjYWNoZS1idWcgaW4gVFIgMTA2LgorCSAqLworCWRtYV9kZXNj cl9kYXRhIGluX2Rlc2NyIF9fYXR0cmlidXRlX18gKChfX2FsaWduZWRfXygxNikpKTsKKwlkbWFf ZGVzY3JfZGF0YSBvdXRfZGVzY3IgX19hdHRyaWJ1dGVfXyAoKF9fYWxpZ25lZF9fKDE2KSkpOwor fTsKKworLyoKKyAqIFdoYXRldmVyIG5lZWRzIERNQSBhY2Nlc3MgaXMgaGVyZSwgYmVzaWRlcyB3 aGF0ZXZlciBETUEtYWJsZSBtZW1vcnkKKyAqIGNvbWVzIGluIHRyYW5zZmVycy4KKyAqLworc3Ry dWN0IGNyaXN2MzJfc3BpX2RtYV9jcyB7CisJc3RydWN0IGNyaXN2MzJfc3BpX2RtYV9kZXNjcnMg KmRlc2NycDsKKworCS8qIFNjcmF0Y2gtYnVmZmVycyB3aGVuIHRoZSBvcmlnaW5hbCB3YXMgbm9u LURNQS4gICovCisJdTggcnhfYnVmW0RNQV9DSFVOS1NJWl07CisJdTggdHhfYnVmW0RNQV9DSFVO S1NJWl07Cit9OworCisvKgorICogTWF4IHNwZWVkLiAgSWYgc2V0LCB3ZSB3b24ndCBnbyBmYXN0 ZXIsIHByb21pc2UuICBNYXkgYmUgdXNlZnVsCisgKiB3aGVuIGRlYWxpbmcgd2l0aCB3ZWFrIGhh cmR3YXJlOyBtaXNyb3V0ZWQgc2lnbmFsIHBhdGhzIG9yIHZhcmlvdXMKKyAqIGRlYnVnLXNpdHVh dGlvbnMuCisgKi8KK3N0YXRpYyB1bG9uZyBjcmlzdjMyX3NwaV9zcGVlZF9saW1pdF9IeiA9IDA7 CisKKy8qIEhlbHBlciBmdW5jdGlvbiBnZXR0aW5nIHRoZSBkcml2ZXIgc3RhdGUgZnJvbSBhIHNw aV9kZXZpY2UuICAqLworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBjcmlzdjMyX3NwaV9od19pbmZv ICpzcGlkZXZfdG9faHcoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgY3Jpc3Yz Ml9zcGlfc3Nlcl9kZXZkYXRhICpkZCA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0 ZXIpOworCXJldHVybiAmZGQtPmh3OworfQorCisvKiBTUEktYml0YmFuZyB3b3JkIHRyYW5zbWl0 LWZ1bmN0aW9uIGZvciBub24tRE1BLiAgKi8KKworc3RhdGljIHUzMiBjcmlzdjMyX3NwaV9zc2Vy X3R4cnhfbW9kZTMoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKKwkJCQkgICAgICAgdW5zaWduZWQg bnNlY3MsIHUzMiB3b3JkLCB1OCBiaXRzKQoreworCXN0cnVjdCBjcmlzdjMyX3NwaV9od19pbmZv ICpodyA9IHNwaWRldl90b19odyhzcGkpOworCXUzMiByZWdpX3NzZXIgPSBody0+c3Nlci5yZWdp OworCXJlZ19zc2VyX3J3X2Fja19pbnRyIGFja19pbnRyID0geyAudHJkeSA9IDEsIC5yZGF2ID0g MSB9OworCXJlZ19zc2VyX3JfaW50ciBpbnRyID0gezB9OworCXJlZ19zc2VyX3J3X3RyX2RhdGEg d19kYXRhID0geyAuZGF0YSA9ICh1OCkgd29yZCB9OworCXJlZ19zc2VyX3JfcmVjX2RhdGEgcl9k YXRhOworCXUzMiBpOworCisJLyoKKwkgKiBUaGUgdGltZW91dCByZWZsZWN0cyBvbmUgaXRlcmF0 aW9uIHBlciAxMG5zIChpbXBvc3NpYmxlIGF0CisJICogMjAwTUh6IGNsb2NrIGV2ZW4gd2l0aG91 dCB0aGUgbmRlbGF5KSBhbmQgYSB3YWl0IGZvciBhIGZ1bGwKKwkgKiBieXRlLgorCSAqLworCXUz MiB0aW1lb3V0ID0gMTAwMDAwMC8xMCo4L2h3LT5lZmZlY3RpdmVfc3BlZWRfa0h6OworCisJQlVH X09OKGJpdHMgIT0gOCk7CisKKwlpbnRyID0gUkVHX1JEX1NTRVIocl9pbnRyKTsKKworCS8qCisJ ICogV2Ugc2hvdWxkIG5ldmVyIGdldCB4cnVucyB3aGVuIHdlIGNvbnRyb2wgdGhlIHRyYW5zbWl0 dGVyCisJICogYW5kIHJlY2VpdmVyIGluIHJlZ2lzdGVyIG1vZGUuICBBbmQgaWYgd2UgZG9uJ3Qg aGF2ZQorCSAqIHRyYW5zbWl0dGVyLXJlYWR5IGFuZCBkYXRhLXJlYWR5IG9uIGVudHJ5LCBzb21l dGhpbmcncworCSAqIHNlcmlvdXNseSBmaXNoeS4KKwkgKi8KKwlpZiAoIWludHIudHJkeSB8fCAh aW50ci5yZGF2IHx8IGludHIub3J1biB8fCBpbnRyLnVydW4pCisJCXBhbmljKCJzc2VyIGhhcmR3 YXJlIG9yIFNQSSBkcml2ZXIgYnJva2VuICgxKSAweCV4XG4iLAorCQkgICAgICBSRUdfVFlQRV9D T05WKHUzMiwgcmVnX3NzZXJfcl9pbnRyLCBpbnRyKSk7CisKKwlSRUdfV1JfU1NFUihyd19hY2tf aW50ciwgYWNrX2ludHIpOworCVJFR19XUl9TU0VSKHJ3X3RyX2RhdGEsIHdfZGF0YSk7CisKKwlm b3IgKGkgPSAwOyBpIDwgdGltZW91dDsgaSsrKSB7CisJCWludHIgPSBSRUdfUkRfU1NFUihyX2lu dHIpOworCQkvKiBXYWl0IGZvciByZWNlaXZlZCBkYXRhLiAgKi8KKwkJaWYgKGludHIucmRhdikK KwkJCWJyZWFrOworCQluZGVsYXkoMTApOworCX0KKworCWlmICghKGludHIudHJkeSAmJiBpbnRy LnJkYXYpIHx8IGludHIub3J1biB8fCBpbnRyLnVydW4pCisJCXBhbmljKCJzc2VyIGhhcmR3YXJl IG9yIFNQSSBkcml2ZXIgYnJva2VuICgyKSAweCV4XG4iLAorCQkgICAgICBSRUdfVFlQRV9DT05W KHUzMiwgcmVnX3NzZXJfcl9pbnRyLCBpbnRyKSk7CisKKwlyX2RhdGEgPSBSRUdfUkRfU1NFUihy X3JlY19kYXRhKTsKKwlyZXR1cm4gcl9kYXRhLmRhdGEgJiAweGZmOworfQorCisvKgorICogV2Fp dCBmb3IgMS8yIGJpdC10aW1lIGlmIHRoZSB0cmFuc21pdHRlciBvciByZWNlaXZlciBpcyBlbmFi bGVkLgorICogV2UgbmVlZCB0byBkbyB0aGlzIGFzIHRoZSBkYXRhLWF2YWlsYWJsZSBpbmRpY2F0 aW9ucyBtYXkgYXJyaXZlCisgKiByaWdodCBhdCB0aGUgZWRnZSwgd2l0aCBoYWxmIHRoZSBsYXN0 IGN5Y2xlIHJlbWFpbmluZy4KKyAqLworc3RhdGljIHZvaWQgaW5saW5lIGNyaXN2MzJfc3BpX3Nz ZXJfd2FpdF9oYWxmYWJpdChzdHJ1Y3QgY3Jpc3YzMl9zcGlfaHdfaW5mbworCQkJCQkJICAqaHcp Cit7CisJaWYgKGh3LT5jZmcuZW4pCisJCW5kZWxheShody0+aGFsZl9jeWNsZV9kZWxheV9ucyk7 Cit9CisKKy8qCisgKiBBc3NlcnQgb3IgZGUtYXNzZXJ0IGNoaXAtc2VsZWN0LgorICogV2UgaGF2 ZSB0d28gZnVuY3Rpb25zLCB3aXRoIHRoZSBhY3RpdmUgb25lIGFzc2lnbmVkIHRvIHRoZSBiaXRi YW5nCisgKiBzbG90IGF0IHNldHVwLCB0byBhdm9pZCBhIHBlcmZvcm1hbmNlIHBlbmFsdHkgKDEl IG9uIHJlYWRzKS4KKyAqLworc3RhdGljIHZvaWQgY3Jpc3YzMl9zcGlfc3Nlcl9jaGlwX3NlbGVj dF9hY3RpdmVfaGlnaChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAorCQkJCQkJICAgICBpbnQgdmFs dWUpCit7CisJc3RydWN0IGNyaXN2MzJfc3BpX2h3X2luZm8gKmh3ID0gc3BpZGV2X3RvX2h3KHNw aSk7CisJdTMyIHJlZ2lfc3NlciA9IGh3LT5zc2VyLnJlZ2k7CisKKwkvKgorCSAqIFdlIG1heSBo YXZlIHJlY2VpdmVkIGRhdGEgYXQgdGhlICJsYXN0IHByb2R1Y2luZyBjbG9jaworCSAqIGVkZ2Ui LiAgVGh1cyB3ZSBkZWxheSBmb3IgYW5vdGhlciBoYWxmIGEgY2xvY2sgY3ljbGUuCisJICovCisJ Y3Jpc3YzMl9zcGlfc3Nlcl93YWl0X2hhbGZhYml0KGh3KTsKKworCWh3LT5mcm1fY2ZnLmZyYW1l X3Bpbl91c2UKKwkJPSB2YWx1ZSA9PSBCSVRCQU5HX0NTX0FDVElWRSA/IHJlZ2tfc3Nlcl9naW8x IDogcmVna19zc2VyX2dpbzA7CisJUkVHX1dSX1NTRVIocndfZnJtX2NmZywgaHctPmZybV9jZmcp OworfQorCitzdGF0aWMgdm9pZCBjcmlzdjMyX3NwaV9zc2VyX2NoaXBfc2VsZWN0X2FjdGl2ZV9s b3coc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKKwkJCQkJCSAgICBpbnQgdmFsdWUpCit7CisJc3Ry dWN0IGNyaXN2MzJfc3BpX2h3X2luZm8gKmh3ID0gc3BpZGV2X3RvX2h3KHNwaSk7CisJdTMyIHJl Z2lfc3NlciA9IGh3LT5zc2VyLnJlZ2k7CisKKwljcmlzdjMyX3NwaV9zc2VyX3dhaXRfaGFsZmFi aXQoaHcpOworCWh3LT5mcm1fY2ZnLmZyYW1lX3Bpbl91c2UKKwkJPSB2YWx1ZSA9PSBCSVRCQU5H X0NTX0FDVElWRSA/IHJlZ2tfc3Nlcl9naW8wIDogcmVna19zc2VyX2dpbzE7CisJUkVHX1dSX1NT RVIocndfZnJtX2NmZywgaHctPmZybV9jZmcpOworfQorCisvKiBTZXQgdGhlIHRyYW5zbWlzc2lv biBzcGVlZCBpbiBIei4gICovCisKK3N0YXRpYyBpbnQgY3Jpc3YzMl9zcGlfc3Nlcl9zZXRfc3Bl ZWRfSHooc3RydWN0IGNyaXN2MzJfc3BpX2h3X2luZm8gKmh3LAorCQkJCQkgdTMyIEh6KQorewor CXUzMiBrSHo7CisJdTMyIG5zX2RlbGF5OworCXUzMiByZWdpX3NzZXIgPSBody0+c3Nlci5yZWdp OworCisJaWYgKEh6ID4gaHctPm1heF9zcGVlZF9IeikKKwkJLyoKKwkJICogU2hvdWxkIHdlIGNv bXBsYWluPyAgUmV0dXJuIGVycm9yPyAgQ3VycmVudCBjYWxsZXIKKwkJICogc2VxdWVuY2VzIHdh bnQganVzdCB0aGUgbWF4IHNwZWVkLgorCQkgKi8KKwkJSHogPSBody0+bWF4X3NwZWVkX0h6Owor CisJa0h6ID0gSHovMTAwMDsKKworCS8qCisJICogSWYgYWJzb2x1dGVseSBuZWVkZWQsIHdlICpj b3VsZCogY2hhbmdlIHRoZSBiYXNlIGZyZXF1ZW5jeQorCSAqIGFuZCBnbyBsb3dlci4gIFVzdWFs bHksIGEgZnJlcXVlbmN5IHNldCBoaWdoZXIgdGhhbiB3YW50ZWQKKwkgKiBpcyBhIHByb2JsZW0g YnV0IGxvd2VyIGlzbid0LgorCSAqLworCWlmIChIeiA8IDEwMDAwMDAwMCAvIDY1NTM2ICsgMSkg eworCQlwcmludGsoS0VSTl9FUlIgImF0dGVtcHQgdG8gc2V0IGludmFsaWQgc3NlciBzcGVlZDog JXUgSHpcbiIsCisJCSAgICAgICBIeik7CisJCUh6ID0gMTAwMDAwMDAwIC8gNjU1MzYgKyAxOwor CX0KKworCXByX2RlYnVnKCJzZXR0aW5nIHNzZXIgc3BlZWQgdG8gJXUgSHpcbiIsIEh6KTsKKwor CS8qCisJICogQXZvaWQgZ29pbmcgYWJvdmUgdGhlIHJlcXVlc3RlZCBzcGVlZCBpZiB0aGVyZSdz IGEKKwkgKiByZW1haW5kZXIgZm9yIHRoZSAxMDAgTUh6IGNsb2NrLWRpdmlkZXIgY2FsY3VsYXRp b24sIGJ1dAorCSAqIGRvbid0IHVubmVjZXNzYXJpbHkgZ28gYmVsb3cgaWYgaXQncyBldmVuLgor CSAqLworCWh3LT5jZmcuY2xrX2RpdiA9IDEwMDAwMDAwMC9IeiAtICgoMTAwMDAwMDAwICUgSHop ID09IDApOworCisJLyogTWFrZSBzdXJlIHRoZXJlJ3Mgbm8gb25nb2luZyB0cmFuc21pc3Npb24u ICovCisJY3Jpc3YzMl9zcGlfc3Nlcl93YWl0X2hhbGZhYml0KGh3KTsKKworCS8qCisJICogV2Fp dCBmb3IgMyB0aW1lcyBtYXggb2YgdGhlIG9sZCBhbmQgdGhlIG5ldyBjbG9jayBiZWZvcmUgYW5k IGFmdGVyCisJICogY2hhbmdpbmcgdGhlIGZyZXF1ZW5jeS4gIE5vdCBiZWNhdXNlIG9mIGRvY3Vt ZW50YXRpb24gb3IgZW1waXJpY2FsCisJICogbmVlZCwgYnV0IGJlY2F1c2UgaXQgc2VlbXMgc2Fu ZSB0byBkbyBzby4gIFRoZSB0aHJlZS1iaXQtdGltZXMKKwkgKiB2YWx1ZSBpcyBiZWNhdXNlIHRo YXQncyB0aGUgZG9jdW1lbnRlZCB0aW1lIGl0IHRha2VzIGZvciBhIHJlc2V0IHRvCisJICogdGFr ZSBlZmZlY3QuCisJICovCisJbnNfZGVsYXkgPSAxMDAwMDAwKjMvKGtIeiA+IGh3LT5lZmZlY3Rp dmVfc3BlZWRfa0h6CisJCQkgICAgICA/IGtIeiA6IGh3LT5lZmZlY3RpdmVfc3BlZWRfa0h6KTsK KwluZGVsYXkobnNfZGVsYXkpOworCVJFR19XUl9TU0VSKHJ3X2NmZywgaHctPmNmZyk7CisJbmRl bGF5KG5zX2RlbGF5KTsKKworCWh3LT5lZmZlY3RpdmVfc3BlZWRfa0h6ID0ga0h6OworCisJLyoK KwkgKiBBIHRpbWVvdXQgb2YgdHdpY2UgdGhlIHRpbWUgZm9yIHRoZSBsYXJnZXN0IGNodW5rIChu b3QKKwkgKiBjb3VudGluZyBETUEgb3ZlcmhlYWQpIHBsdXMgb25lIGppZmZ5LCBzaG91bGQgYmUg bW9yZSB0aGFuCisJICogZW5vdWdoIGZvciB0aGUgdHJhbnNtaXNzaW9uLgorCSAqLworCWh3LT5k bWFfdGltZW91dCA9IDEgKyB1c2Vjc190b19qaWZmaWVzKDEwMDAqMipETUFfQ0hVTktTSVoqOC9r SHopOworCisJaHctPmhhbGZfY3ljbGVfZGVsYXlfbnMKKwkJPSAxMDAwMDAwLzIvaHctPmVmZmVj dGl2ZV9zcGVlZF9rSHo7CisKKwlwcl9kZWJ1ZygiLmNsa19kaXYgJWQsIGhhbGYgJWQsIGVmZiAl ZFxuIiwKKwkJIGh3LT5jZmcuY2xrX2RpdiwgaHctPmhhbGZfY3ljbGVfZGVsYXlfbnMsCisJCSBo dy0+ZWZmZWN0aXZlX3NwZWVkX2tIeik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBTZXQgdXAg dHJhbnNtaXR0ZXIgYW5kIHJlY2VpdmVyIGZvciBub24tRE1BIGFjY2Vzcy4KKyAqIFVuZm9ydHVu YXRlbHksIGl0IGRvZXNuJ3Qgc2VlbSBsaWtlIGhpc3BlZWQgd29ya3MgZm9yIHRoaXMgbW9kZQor ICogKG1lYSBjdWxwYSksIHNvIHdlJ3JlIHN0dWNrIHdpdGggbG9zcGVlZC1tb2RlLiAgQSBsaXR0 bGUgc2xvd2VyLAorICogYnV0IHRoYXQncyB3aGF0IHlvdSBnZXQgZm9yIG5vdCBhbGxvY2F0aW5n IERNQS4KKyAqLworc3RhdGljIGludCBjcmlzdjMyX3NldHVwX3NwaV9zc2VyX2Zvcl9yZWdfYWNj ZXNzKHN0cnVjdCBjcmlzdjMyX3NwaV9od19pbmZvICpodykKK3sKKwl1MzIgcmVnaV9zc2VyID0g aHctPnNzZXIucmVnaTsKKworCXJlZ19zc2VyX3J3X2NmZyBjZmcgPSB7MH07CisJcmVnX3NzZXJf cndfZnJtX2NmZyBmcm1fY2ZnID0gezB9OworCXJlZ19zc2VyX3J3X3RyX2NmZyB0cl9jZmcgPSB7 MH07CisJcmVnX3NzZXJfcndfcmVjX2NmZyByZWNfY2ZnID0gezB9OworCXJlZ19zc2VyX3J3X2lu dHJfbWFzayBtYXNrID0gezB9OworCXJlZ19zc2VyX3J3X2V4dHJhIGV4dHJhID0gezB9OworCXJl Z19zc2VyX3J3X3RyX2RhdGEgdHJfZGF0YSA9IHswfTsKKwlyZWdfc3Nlcl9yX2ludHIgaW50cjsK KworCWNmZy5lbiA9IDA7CisJdHJfY2ZnLnRyX2VuID0gMTsKKwlyZWNfY2ZnLnJlY19lbiA9IDE7 CisJUkVHX1dSX1NTRVIocndfY2ZnLCBjZmcpOworCVJFR19XUl9TU0VSKHJ3X3RyX2NmZywgdHJf Y2ZnKTsKKwlSRUdfV1JfU1NFUihyd19yZWNfY2ZnLCByZWNfY2ZnKTsKKwlSRUdfV1JfU1NFUihy d19pbnRyX21hc2ssIG1hc2spOworCisJLyoKKwkgKiBTZWUgMjMuNy4yIFNQSSBpbiB0aGUgaGFy ZHdhcmUgZG9jdW1lbnRhdGlvbi4KKwkgKiBFeGNlcHQgb3VyIGNvbmZpZ3VyYXRpb24gdXNlcyBi dWxrIG1vZGU7IE1NQy9TRC1TUEkKKwkgKiBpc24ndCBpc29jaHJvbm91cyBpbiBuYXR1cmUuCisJ ICogU3RlcCAxLgorCSAqLworCWNmZy5nYXRlX2NsayA9IHJlZ2tfc3Nlcl95ZXM7CisJY2ZnLmNs a2dhdGVfaW4gPSByZWdrX3NzZXJfbm87CisJY2ZnLmNsa2dhdGVfY3RybCA9IHJlZ2tfc3Nlcl90 cjsKKworCS8qIFN0ZXAgMi4gICovCisJY2ZnLm91dF9jbGtfcG9sID0gcmVna19zc2VyX3BvczsK KwljZmcub3V0X2Nsa19zcmMgPSByZWdrX3NzZXJfaW50ZXJuX2NsazsKKworCS8qIFN0ZXAgMy4g ICovCisJdHJfY2ZnLmNsa19zcmMgPSByZWdrX3NzZXJfaW50ZXJuOworCXJlY19jZmcuY2xrX3Ny YyA9IHJlZ2tfc3Nlcl9pbnRlcm47CisJZnJtX2NmZy5jbGtfc3JjID0gcmVna19zc2VyX2ludGVy bjsKKworCS8qIFN0ZXAgNC4gICovCisJdHJfY2ZnLmNsa19wb2wgPSByZWdrX3NzZXJfbmVnOwor CXJlY19jZmcuY2xrX3BvbCA9IHJlZ2tfc3Nlcl9wb3M7CisJZnJtX2NmZy5jbGtfcG9sID0gcmVn a19zc2VyX25lZzsKKworCS8qCisJICogU3RlcCA1OiBmcmFtZSBwaW4gKFBDMDMgb3IgUEQwMykg aXMgZnJhbWU7IHRoZSBzdGF0dXMgcGluCisJICogKFBDMDIsIFBEMDIpIGlzIGNvbmZpZ3VyZWQg YXMgaW5wdXQuCisJICovCisJZnJtX2NmZy5mcmFtZV9waW5fZGlyID0gcmVna19zc2VyX291dDsK KworCS8qCisJICogQ29udHJhcnkgdG8gdGhlIGRvYyBleGFtcGxlLCB3ZSBkb24ndCBnZW5lcmF0 ZSB0aGUgZnJhbWUKKwkgKiBzaWduYWwgImF1dG9tYXRpY2FsbHkiLiAgVGhpcyBzZXR0aW5nIG9m IHRoZSBmcmFtZSBwaW4gYXMKKwkgKiBjb25zdGFudCAxLCByZWZsZWN0cyBhbiBpbmFjdGl2ZSAv Q1Mgc2V0dGluZywgZm9yIGp1c3QgaWRsZQorCSAqIGNsb2NraW5nLiAgV2hlbiB3ZSBuZWVkIHRv IHRyYW5zbWl0IG9yIHJlY2VpdmUgZGF0YSwgd2UKKwkgKiBjaGFuZ2UgaXQuCisJICovCisJZnJt X2NmZy5mcmFtZV9waW5fdXNlID0gcmVna19zc2VyX2dpbzE7CisJZnJtX2NmZy5zdGF0dXNfcGlu X2RpciA9IHJlZ2tfc3Nlcl9pbjsKKworCS8qCisJICogU3RlcCA2LiAgVGhpcyBpcyBwcm9iYWJs eSBub3QgbmVjZXNzYXJ5LCBhcyB3ZSBkb24ndAorCSAqIGdlbmVyYXRlIHRoZSBmcmFtZSBzaWdu YWwgYXV0b21hdGljYWxseS4gIE5ldmVydGhlbGVzcywKKwkgKiBtb2RpZmllZCBmb3IgYnVsayB0 cmFuc21pc3Npb24uCisJICovCisJZnJtX2NmZy5vdXRfb24gPSByZWdrX3NzZXJfdHI7CisJZnJt X2NmZy5vdXRfb2ZmID0gcmVna19zc2VyX3RyOworCisJLyogU3RlcCA3LiAgU2ltaWxhcmx5LCBt YXliZSBub3QgbmVjZXNzYXJ5LiAgKi8KKwlmcm1fY2ZnLnR5cGUgPSByZWdrX3NzZXJfbGV2ZWw7 CisJZnJtX2NmZy5sZXZlbCA9IHJlZ2tfc3Nlcl9uZWdfbG87CisKKwkvKiBTdGVwIDguICBUaGVz ZSB3ZSBoYXZlIHRvIHNldCBhY2NvcmRpbmcgdG8gdGhlIGJ1bGsgbW9kZSwKKwkgKiB3aGljaCBm b3IgdHJfZGVsYXkgaXMgdGhlIHNhbWUgYXMgZm9yIGlzbzsgYSB2YWx1ZSBvZiAxCisJICogbWVh bnMgaW4gc3luYyB3aXRoIHRoZSBmcmFtZSBzaWduYWwuICBGb3IgcmVjX2RlbGF5LCB3ZQorCSAq IHN0YXJ0IGl0IGF0IHRoZSBzYW1lIHRpbWUgYXMgdGhlIHRyYW5zbWl0dGVyLiAgU2VlIGZpZ3Vy ZQorCSAqIDIzLjcgaW4gdGhlIGh3IGRvY3VtZW50YXRpb24uICAqLworCWZybV9jZmcudHJfZGVs YXkgPSAxOworCWZybV9jZmcucmVjX2RlbGF5ID0gMDsKKworCS8qIFN0ZXAgOS4gICovCisJdHJf Y2ZnLnNhbXBsZV9zaXplID0gNzsKKwlyZWNfY2ZnLnNhbXBsZV9zaXplID0gNzsKKworCS8qIFN0 ZXAgMTAuICAqLworCWZybV9jZmcud29yZHJhdGUgPSA3OworCisJLyogU3RlcCAxMSAoYnV0IGZv ciBidWxrKS4gICovCisJdHJfY2ZnLnJhdGVfY3RybCA9IHJlZ2tfc3Nlcl9idWxrOworCisJLyoK KwkgKiBTdGVwIDEyLiAgU2ltaWxhcmx5LCBtYXliZSBub3QgbmVjZXNzYXJ5OyBzdGlsbCwgbW9k aWZpZWQKKwkgKiBmb3IgYnVsay4KKwkgKi8KKwl0cl9jZmcuZnJtX3NyYyA9IHJlZ2tfc3Nlcl9p bnRlcm47CisJcmVjX2NmZy5mcm1fc3JjID0gcmVna19zc2VyX3R4X2J1bGs7CisKKwkvKiBTdGVw IDEzLiAgKi8KKwl0cl9jZmcubW9kZSA9IHJlZ2tfc3Nlcl9sb3NwZWVkOworCXJlY19jZmcubW9k ZSA9IHJlZ2tfc3Nlcl9sb3NwZWVkOworCisJLyogU3RlcCAxNC4gICovCisJdHJfY2ZnLnNoX2Rp ciA9IHJlZ2tfc3Nlcl9tc2JmaXJzdDsKKwlyZWNfY2ZnLnNoX2RpciA9IHJlZ2tfc3Nlcl9tc2Jm aXJzdDsKKworCS8qCisJICogRXh0cmEgc3RlcCBmb3IgYnVsay1zcGVjaWZpYyBzZXR0aW5ncyBh bmQgb3RoZXIgZ2VuZXJhbAorCSAqIHNldHRpbmdzIG5vdCBzcGVjaWZpZWQgaW4gdGhlIFNQSSBj b25maWcgZXhhbXBsZS4KKwkgKiBJdCdzIHVuY2VydGFpbiB3aGV0aGVyIGFsbCBvZiB0aGVzZSBh cmUgbmVlZGVkLgorCSAqLworCXRyX2NmZy5idWxrX3dzcGFjZSA9IDE7CisJdHJfY2ZnLnVzZV9k bWEgPSAwOworCisJdHJfY2ZnLnVydW5fc3RvcCA9IDE7CisJcmVjX2NmZy5vcnVuX3N0b3AgPSAx OworCXJlY19jZmcudXNlX2RtYSA9IDA7CisKKwlyZWNfY2ZnLmZpZm9fdGhyID0gcmVna19zc2Vy X2luZjsKKwlmcm1fY2ZnLmVhcmx5X3dlbmQgPSByZWdrX3NzZXJfeWVzOworCisJY2ZnLmNsa19k aXIgPSByZWdrX3NzZXJfb3V0OworCXRyX2NmZy5kYXRhX3Bpbl91c2UgPSByZWdrX3NzZXJfZG91 dDsKKwljZmcuYmFzZV9mcmVxID0gcmVna19zc2VyX2YxMDA7CisKKwkvKiBTZXR1cCBmb3IgdGhl IGluaXRpYWwgZnJlcXVlbmN5IGdpdmVuIHRvIHVzLiAgKi8KKwlody0+Y2ZnID0gY2ZnOworCWNy aXN2MzJfc3BpX3NzZXJfc2V0X3NwZWVkX0h6KGh3LCBody0+bWF4X3NwZWVkX0h6KTsKKwljZmcg PSBody0+Y2ZnOworCisJLyoKKwkgKiBXcml0ZSBpdCBhbGwsIGV4Y2VwdCBjZmcgd2hpY2ggaXMg YWxyZWFkeSB3cml0dGVuIGJ5CisJICogY3Jpc3YzMl9zcGlfc3Nlcl9zZXRfc3BlZWRfSHouCisJ ICovCisJUkVHX1dSX1NTRVIocndfZnJtX2NmZywgZnJtX2NmZyk7CisJUkVHX1dSX1NTRVIocndf dHJfY2ZnLCB0cl9jZmcpOworCVJFR19XUl9TU0VSKHJ3X3JlY19jZmcsIHJlY19jZmcpOworCVJF R19XUl9TU0VSKHJ3X2V4dHJhLCBleHRyYSk7CisKKwkvKgorCSAqIFRoZSB0cmFuc21pdC1yZWdp c3RlciBuZWVkcyB0byBiZSB3cml0dGVuIGJlZm9yZSB0aGUKKwkgKiB0cmFuc21pdHRlciBpcyBl bmFibGVkLCBhbmQgdG8gZ2V0IGEgdmFsaWQgdHJkeSBzaWduYWwKKwkgKiB3YWl0aW5nIGZvciB1 cyB3aGVuIHdlIHdhbnQgdG8gdHJhbnNtaXQgYSBieXRlLiAgQmVjYXVzZQorCSAqIHRoZSAiZnJh bWUgZXZlbnQiIGlzIHRoYXQgdGhlIHRyYW5zbWl0dGVyIGlzIHdyaXR0ZW4sIHRoaXMKKwkgKiB3 aWxsIGNhdXNlIGEgZHVtbXkgMHhmZi1ieXRlIHRvIGJlIHRyYW5zbWl0dGVkLCBidXQgdGhhdCdz CisJICogb2ssIGJlY2F1c2UgL0NTIGlzIGluYWN0aXZlLgorCSAqLworCXRyX2RhdGEuZGF0YSA9 IDB4ZmZmZjsKKwlSRUdfV1JfU1NFUihyd190cl9kYXRhLCB0cl9kYXRhKTsKKworCS8qCisJICog V2UgYWNrIGV2ZXJ5dGhpbmcgaW50ZXJydXB0LXdpc2U7IGxlZnQtb3ZlciBpbmRpY2F0b3JzIGRv bid0IGhhdmUKKwkgKiB0byBjb21lIGZyb20gKnRoaXMqIGNvZGUuCisJICovCisJUkVHX1dSSU5U X1NTRVIocndfYWNrX2ludHIsIC0xKTsKKworCS8qCisJICogV2FpdCAzIGN5Y2xlcyBiZWZvcmUg ZW5hYmxpbmcsIGFmdGVyIHRoZSB0cmFuc21pdCByZWdpc3RlcgorCSAqIGhhcyBiZWVuIHdyaXR0 ZW4uICAoVGhpcydsbCBiZSBqdXN0IGEgZmV3IG1pY3Jvc2Vjb25kcyBmb3IKKwkgKiBlLmcuIDQw MCBLSHouKQorCSAqLworCW5kZWxheSgzICogMiAqIGh3LT5oYWxmX2N5Y2xlX2RlbGF5X25zKTsK KwljZmcuZW4gPSAxOworCisJUkVHX1dSX1NTRVIocndfY2ZnLCBjZmcpOworCisJLyoKKwkgKiBO b3cgd2FpdCBmb3IgOCArIDMgY3ljbGVzLiAgVGhlIDB4ZmYgYnl0ZSBzaG91bGQgbm93IGhhdmUK KwkgKiBiZWVuIHRyYW5zbWl0dGVkIGFuZCBkdW1teSBkYXRhIHJlY2VpdmVkLgorCSAqLworCW5k ZWxheSgoOCArIDMpICogMiAqIGh3LT5oYWxmX2N5Y2xlX2RlbGF5X25zKTsKKworCS8qCisJICog U2FuaXR5LWNoZWNrIHRoYXQgd2UgaGF2ZSBkYXRhLWF2YWlsYWJsZSBhbmQgdGhlCisJICogdHJh bnNtaXR0ZXIgaXMgcmVhZHkgdG8gc2VuZCBuZXcgZGF0YS4KKwkgKi8KKwlpbnRyID0gUkVHX1JE X1NTRVIocl9pbnRyKTsKKwlpZiAoIWludHIucmRhdiB8fCAhaW50ci50cmR5KQorCQlwYW5pYygi c3NlciBodyBvciBTUEkgZHJpdmVyIGJyb2tlbiAoMykgMHgleCIsCisJCSAgICAgIFJFR19UWVBF X0NPTlYodTMyLCByZWdfc3Nlcl9yX2ludHIsIGludHIpKTsKKworCWh3LT5mcm1fY2ZnID0gZnJt X2NmZzsKKwlody0+dHJfY2ZnID0gdHJfY2ZnOworCWh3LT5yZWNfY2ZnID0gcmVjX2NmZzsKKwlo dy0+ZXh0cmEgPSBleHRyYTsKKwlody0+Y2ZnID0gY2ZnOworCXJldHVybiAwOworfQorCisvKiBJ bml0aWFsaXphdGlvbiwgbWF5YmUgZmF1bHQgcmVjb3ZlcnkuICAqLworCitzdGF0aWMgdm9pZCBj cmlzdjMyX3Jlc2V0X2RtYV9odyh1MzIgcmVnaSkKK3sKKwlSRUdfV1JfSU5UKGRtYSwgcmVnaSwg cndfaW50cl9tYXNrLCAwKTsKKworCURNQV9SRVNFVChyZWdpKTsKKwlETUFfV0FJVF9VTlRJTF9S RVNFVChyZWdpKTsKKwlETUFfRU5BQkxFKHJlZ2kpOworCVJFR19XUl9JTlQoZG1hLCByZWdpLCBy d19hY2tfaW50ciwgLTEpOworCisJRE1BX1dSX0NNRChyZWdpLCByZWdrX2RtYV9zZXRfd19zaXpl MSk7Cit9CisKKy8qIEludGVycnVwdCBmcm9tIFNTRVIsIGZvciB1c2Ugd2l0aCBETUEgd2hlbiBv bmx5IHRoZSB0cmFuc21pdHRlciBpcyB1c2VkLiAgKi8KKworc3RhdGljIGlycXJldHVybl90IHNz ZXJfaW50ZXJydXB0KGludCBpcnFubywgdm9pZCAqYXJnKQoreworCXN0cnVjdCBjcmlzdjMyX3Nw aV9od19pbmZvICpodyA9IGFyZzsKKwl1MzIgcmVnaV9zc2VyID0gaHctPnNzZXIucmVnaTsKKwly ZWdfc3Nlcl9yX2ludHIgaW50ciA9IFJFR19SRF9TU0VSKHJfaW50cik7CisKKwlpZiAoaW50ci50 aWRsZSA9PSAwICYmIGludHIudXJ1biA9PSAwKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAg ICAgInNzZXIgQDB4JXg6IHNwdXJpb3VzIHNzZXIgaW50ciwgZmxhZ3M6IDB4JXhcbiIsCisJCSAg ICAgICByZWdpX3NzZXIsIFJFR19UWVBFX0NPTlYodTMyLCByZWdfc3Nlcl9yX2ludHIsIGludHIp KTsKKwl9IGVsc2UgaWYgKGludHIudXJ1biA9PSAwKSB7CisJCWh3LT5kbWFfYWN0dWFsbHlfZG9u ZSA9IDE7CisJCWNvbXBsZXRlKCZody0+ZG1hX2RvbmUpOworCX0gZWxzZSB7CisJCS8qCisJCSAq IE1ha2UgYW55IHJlY2VwdGlvbiB0aW1lIG91dCBhbmQgbm90aWNlIHRoZSBlcnJvciwKKwkJICog d2hpY2ggaXQgbWlnaHQgbm90IG90aGVyd2lzZSBkbyBkYXRhIHdhcyAqcmVjZWl2ZWQqCisJCSAq IHN1Y2Nlc3NmdWxseS4KKwkJICovCisJCXUzMiByZWdpX2RtYWluID0gaHctPmRtYWluLnJlZ2k7 CisKKwkJLyoKKwkJICogUmVjb21tZW5kZWQgcHJhY3RpY2UgYmVmb3JlIGFja2luZyB1cnVuIGlz IHRvIHR1cm4KKwkJICogb2ZmIHNzZXIuICBUaGF0IG1pZ2h0IG5vdCBiZSBlbm91Z2ggdG8gc3Rv cCBETUEtaW4KKwkJICogZnJvbSBzaWduYWxsaW5nIHN1Y2Nlc3MgaWYgdGhlIHVuZGVycnVuIHdh cyBsYXRlIGluCisJCSAqIHRoZSB0cmFuc21pc3Npb24sIHNvIHdlIGRpc2FibGUgdGhlIERNQS1p bgorCQkgKiBpbnRlcnJ1cHRzIHRvby4KKwkJICovCisJCVJFR19XUklOVF9TU0VSKHJ3X2NmZywg MCk7CisJCVJFR19XUklOVF9ESShyd19pbnRyX21hc2ssIDApOworCQlSRUdfV1JJTlRfREkocndf YWNrX2ludHIsIC0xKTsKKwl9CisKKwlSRUdfV1JJTlRfU1NFUihyd19pbnRyX21hc2ssIDApOwor CisJLyoKKwkgKiBXZSBtdXN0IGF0IGxlYXN0IGFjayB1cnVuIHRvZ2V0aGVyIHdpdGggdGlkbGUs IGJ1dCBrZWVwIGl0CisJICogc2ltcGxlIGFuZCBhY2sgdGhlbSBhbGwuCisJICovCisJUkVHX1dS SU5UX1NTRVIocndfYWNrX2ludHIsIC0xKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKwor LyoKKyAqIEludGVycnVwdCBmcm9tIHJlY2VpdmVyIERNQSBjb25uZWN0ZWQgdG8gU1NFUiwgZm9y IHVzZSB3aGVuIHRoZQorICogcmVjZWl2ZXIgaXMgdXNlZCwgd2l0aCBvciB3aXRob3V0IHRoZSB0 cmFuc21pdHRlci4KKyAqLworc3RhdGljIGlycXJldHVybl90IHJlY19kbWFfaW50ZXJydXB0KGlu dCBpcnFubywgdm9pZCAqYXJnKQoreworCXN0cnVjdCBjcmlzdjMyX3NwaV9od19pbmZvICpodyA9 IGFyZzsKKwl1MzIgcmVnaV9kbWFpbiA9IGh3LT5kbWFpbi5yZWdpOworCXUzMiByZWdpX3NzZXIg PSBody0+c3Nlci5yZWdpOworCXJlZ19kbWFfcl9pbnRyIGludHIgPSBSRUdfUkRfREkocl9pbnRy KTsKKworCWlmIChpbnRyLmRhdGEgPT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAg ICJzc2VyIEAweCV4OiBzcHVyaW91cyByZWMgZG1hIGludHIsIGZsYWdzOiAweCV4XG4iLAorCQkg ICAgICAgcmVnaV9kbWFpbiwgUkVHX1RZUEVfQ09OVih1MzIsIHJlZ19kbWFfcl9pbnRyLCBpbnRy KSk7CisJfSBlbHNlIHsKKwkJaHctPmRtYV9hY3R1YWxseV9kb25lID0gMTsKKwkJY29tcGxldGUo Jmh3LT5kbWFfZG9uZSk7CisJfQorCisJUkVHX1dSSU5UX0RJKHJ3X2ludHJfbWFzaywgMCk7CisK KwkvKiBBdm9pZCBmYWxzZSB1bmRlcnJ1biBpbmRpY2F0aW9uczsgc3RvcCBhbGwgc3NlciBpbnRl cnJ1cHRzLiAgICovCisJUkVHX1dSSU5UX1NTRVIocndfaW50cl9tYXNrLCAwKTsKKwlSRUdfV1JJ TlRfU1NFUihyd19hY2tfaW50ciwgLTEpOworCisJUkVHX1dSSU5UX0RJKHJ3X2Fja19pbnRyLCAt MSk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKgorICogU2V0IHVwIHRyYW5zbWl0dGVy IGFuZCByZWNlaXZlciBmb3IgRE1BIGFjY2Vzcy4gIFdlIHVzZSBzZXR0aW5ncworICogZnJvbSB0 aGUgIkF0bWVsIGZhc3QgZmxhc2giIGV4YW1wbGUuCisgKi8KK3N0YXRpYyBpbnQgY3Jpc3YzMl9z ZXR1cF9zcGlfc3Nlcl9mb3JfZG1hX2FjY2VzcyhzdHJ1Y3QgY3Jpc3YzMl9zcGlfaHdfaW5mbwor CQkJCQkJICpodykKK3sKKwlpbnQgcmV0OworCXUzMiByZWdpX3NzZXIgPSBody0+c3Nlci5yZWdp OworCisJcmVnX3NzZXJfcndfY2ZnIGNmZyA9IHswfTsKKwlyZWdfc3Nlcl9yd19mcm1fY2ZnIGZy bV9jZmcgPSB7MH07CisJcmVnX3NzZXJfcndfdHJfY2ZnIHRyX2NmZyA9IHswfTsKKwlyZWdfc3Nl cl9yd19yZWNfY2ZnIHJlY19jZmcgPSB7MH07CisJcmVnX3NzZXJfcndfaW50cl9tYXNrIG1hc2sg PSB7MH07CisJcmVnX3NzZXJfcndfZXh0cmEgZXh0cmEgPSB7MH07CisKKwljZmcuZW4gPSAwOwor CXRyX2NmZy50cl9lbiA9IDE7CisJcmVjX2NmZy5yZWNfZW4gPSAxOworCVJFR19XUl9TU0VSKHJ3 X2NmZywgY2ZnKTsKKwlSRUdfV1JfU1NFUihyd190cl9jZmcsIHRyX2NmZyk7CisJUkVHX1dSX1NT RVIocndfcmVjX2NmZywgcmVjX2NmZyk7CisJUkVHX1dSX1NTRVIocndfaW50cl9tYXNrLCBtYXNr KTsKKworCS8qCisJICogU2VlIDIzLjcuNS4yIChBdG1lbCBmYXN0IGZsYXNoKSBpbiB0aGUgaGFy ZHdhcmUgZG9jdW1lbnRhdGlvbi4KKwkgKiBTdGVwIDEuCisJICovCisJY2ZnLmdhdGVfY2xrID0g cmVna19zc2VyX25vOworCisJLyogU3RlcCAyLiAgKi8KKwljZmcub3V0X2Nsa19wb2wgPSByZWdr X3NzZXJfcG9zOworCisJLyogU3RlcCAzLiAgKi8KKwljZmcub3V0X2Nsa19zcmMgPSByZWdrX3Nz ZXJfaW50ZXJuX2NsazsKKworCS8qIFN0ZXAgNC4gICovCisJdHJfY2ZnLnNhbXBsZV9zaXplID0g MTsKKwlyZWNfY2ZnLnNhbXBsZV9zaXplID0gMTsKKworCS8qIFN0ZXAgNS4gICovCisJZnJtX2Nm Zy53b3JkcmF0ZSA9IDc7CisKKwkvKiBTdGVwIDYuICAqLworCXRyX2NmZy5jbGtfc3JjID0gcmVn a19zc2VyX2ludGVybjsKKwlyZWNfY2ZnLmNsa19zcmMgPSByZWdrX3NzZXJfaW50ZXJuOworCWZy bV9jZmcuY2xrX3NyYyA9IHJlZ2tfc3Nlcl9pbnRlcm47CisJdHJfY2ZnLmNsa19wb2wgPSByZWdr X3NzZXJfbmVnOworCWZybV9jZmcuY2xrX3BvbCA9IHJlZ2tfc3Nlcl9uZWc7CisKKwkvKiBTdGVw IDcuICAqLworCXJlY19jZmcuY2xrX3BvbCA9IHJlZ2tfc3Nlcl9wb3M7CisKKwkvKiBTdGVwIDgu ICAqLworCWZybV9jZmcudHJfZGVsYXkgPSAxOworCisJLyogU3RlcCA5LiAgKi8KKwlmcm1fY2Zn LnJlY19kZWxheSA9IDE7CisKKwkvKiBTdGVwIDEwLiAgKi8KKwl0cl9jZmcuc2hfZGlyID0gcmVn a19zc2VyX21zYmZpcnN0OworCXJlY19jZmcuc2hfZGlyID0gcmVna19zc2VyX21zYmZpcnN0Owor CisJLyogU3RlcCAxMS4gICovCisJdHJfY2ZnLmZybV9zcmMgPSByZWdrX3NzZXJfaW50ZXJuOwor CXJlY19jZmcuZnJtX3NyYyA9IHJlZ2tfc3Nlcl9pbnRlcm47CisKKwkvKiBTdGVwIDEyLiAgKi8K Kwl0cl9jZmcucmF0ZV9jdHJsID0gcmVna19zc2VyX2lzbzsKKworCS8qCisJICogU3RlcCAxMy4g IE5vdGUgdGhhdCAwICE9IHR4X251bGwsIHNvIHdlJ3JlIGdvb2QgcmVnYXJkaW5nCisJICogdGhl IGRlc2NyaXB0b3IgLm1kIGZpZWxkLgorCSAqLworCXRyX2NmZy5lb3Bfc3RvcCA9IDE7CisKKwkv KiBTdGVwIDE0LiAgKi8KKwlmcm1fY2ZnLmZyYW1lX3Bpbl91c2UgPSByZWdrX3NzZXJfZ2lvMTsK Kwlmcm1fY2ZnLmZyYW1lX3Bpbl9kaXIgPSByZWdrX3NzZXJfb3V0OworCisJLyogU3RlcCAxNS4g ICovCisJZXh0cmEuY2xrb25fZW4gPSAxOworCWV4dHJhLmNsa29mZl9lbiA9IDE7CisKKwkvKiBT dGVwIDE2LiAgV2UnbGwgbW9kaWZ5IHRoaXMgdmFsdWUgZm9yIGVhY2ggImJ1cnN0Ii4gICovCisJ ZXh0cmEuY2xrb2ZmX2N5Y2xlcyA9IDc7CisKKwkvKiBTdGVwIDE3LiAgKi8KKwljZmcucHJlcGFy ZSA9IDE7CisKKwkvKgorCSAqIFRoaW5ncyBsZWZ0IG91dCBmcm9tIHRoZSBkb2N1bWVudGVkIHN0 YXJ0dXAgcHJvY2VkdXJlLgorCSAqIEl0J3MgdW5jZXJ0YWluIHdoZXRoZXIgYWxsIG9mIHRoZXNl IGFyZSBuZWVkZWQuCisJICovCisJZnJtX2NmZy5zdGF0dXNfcGluX2RpciA9IHJlZ2tfc3Nlcl9p bjsKKwl0cl9jZmcubW9kZSA9IHJlZ2tfc3Nlcl9oaXNwZWVkOworCXJlY19jZmcubW9kZSA9IHJl Z2tfc3Nlcl9oaXNwZWVkOworCWZybV9jZmcub3V0X29uID0gcmVna19zc2VyX2ludGVybl90YjsK Kwlmcm1fY2ZnLm91dF9vZmYgPSByZWdrX3NzZXJfcmVjOworCWZybV9jZmcudHlwZSA9IHJlZ2tf c3Nlcl9sZXZlbDsKKwl0cl9jZmcudXNlX2RtYSA9IDE7CisJdHJfY2ZnLnVydW5fc3RvcCA9IDE7 CisJcmVjX2NmZy5vcnVuX3N0b3AgPSAxOworCXJlY19jZmcudXNlX2RtYSA9IDE7CisJcmVjX2Nm Zy5maWZvX3RociA9IHJlZ2tfc3Nlcl9pbmY7CisJZnJtX2NmZy5lYXJseV93ZW5kID0gcmVna19z c2VyX3llczsKKwljZmcuY2xrX2RpciA9IHJlZ2tfc3Nlcl9vdXQ7CisKKwl0cl9jZmcuZGF0YV9w aW5fdXNlID0gcmVna19zc2VyX2RvdXQ7CisJY2ZnLmJhc2VfZnJlcSA9IHJlZ2tfc3Nlcl9mMTAw OworCisJUkVHX1dSX1NTRVIocndfZnJtX2NmZywgZnJtX2NmZyk7CisJUkVHX1dSX1NTRVIocndf dHJfY2ZnLCB0cl9jZmcpOworCVJFR19XUl9TU0VSKHJ3X3JlY19jZmcsIHJlY19jZmcpOworCVJF R19XUl9TU0VSKHJ3X2V4dHJhLCBleHRyYSk7CisJUkVHX1dSX1NTRVIocndfY2ZnLCBjZmcpOwor CWh3LT5mcm1fY2ZnID0gZnJtX2NmZzsKKwlody0+dHJfY2ZnID0gdHJfY2ZnOworCWh3LT5yZWNf Y2ZnID0gcmVjX2NmZzsKKwlody0+ZXh0cmEgPSBleHRyYTsKKwlody0+Y2ZnID0gY2ZnOworCisJ Y3Jpc3YzMl9zcGlfc3Nlcl9zZXRfc3BlZWRfSHooaHcsIGh3LT5tYXhfc3BlZWRfSHopOworCisJ cmV0ID0gcmVxdWVzdF9pcnEoaHctPnNzZXIuaXJxLCBzc2VyX2ludGVycnVwdCwgMCwgInNzZXIi LCBodyk7CisJaWYgKHJldCAhPSAwKQorCQlnb3RvIG5vaXJxOworCisJcmV0ID0gcmVxdWVzdF9p cnEoaHctPmRtYWluLmlycSwgcmVjX2RtYV9pbnRlcnJ1cHQsIDAsICJzc2VyIHJlYyIsIGh3KTsK KwlpZiAocmV0ICE9IDApCisJCWdvdG8gZnJlZV9vdXRpcnE7CisKKwljcmlzdjMyX3Jlc2V0X2Rt YV9odyhody0+ZG1haW4ucmVnaSk7CisJY3Jpc3YzMl9yZXNldF9kbWFfaHcoaHctPmRtYW91dC5y ZWdpKTsKKwlyZXR1cm4gMDsKKworICBmcmVlX291dGlycToKKwlmcmVlX2lycShody0+c3Nlci5p cnEsIGh3KTsKKyAgbm9pcnE6CisJcmV0dXJuIHJldDsKK30KKworLyogU1BJLW1hc3RlciBzZXR1 cCBmdW5jdGlvbiBmb3Igbm9uLURNQS4gICovCisKK3N0YXRpYyBpbnQgY3Jpc3YzMl9zcGlfc3Nl cl9yZWdzX21hc3Rlcl9zZXR1cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBj cmlzdjMyX3NwaV9od19pbmZvICpodyA9IHNwaWRldl90b19odyhzcGkpOworCXN0cnVjdCBzcGlf Yml0YmFuZyAqYml0YmFuZyA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOwor CWludCByZXQgPSAwOworCisJLyogSnVzdCBkbyBhIGxpdHRsZSBpbml0aWFsIGNvbnN0cmFpbmlu ZyBjaGVja3MuICAqLworCWlmIChzcGktPmJpdHNfcGVyX3dvcmQgPT0gMCkKKwkJc3BpLT5iaXRz X3Blcl93b3JkID0gODsKKworCWlmIChzcGktPmJpdHNfcGVyX3dvcmQgIT0gOCkKKwkJcmV0dXJu IC1FSU5WQUw7CisKKwliaXRiYW5nLT5jaGlwc2VsZWN0ID0gKHNwaS0+bW9kZSAmIFNQSV9DU19I SUdIKSAhPSAwCisJCT8gY3Jpc3YzMl9zcGlfc3Nlcl9jaGlwX3NlbGVjdF9hY3RpdmVfaGlnaAor CQk6IGNyaXN2MzJfc3BpX3NzZXJfY2hpcF9zZWxlY3RfYWN0aXZlX2xvdzsKKworCWlmIChody0+ bWF4X3NwZWVkX0h6ID09IDApIHsKKwkJdTMyIG1heF9zcGVlZF9IejsKKworCQkvKgorCQkgKiBB dCB0aGlzIHRpbWU7IGF0IHRoZSBmaXJzdCBjYWxsIHRvIHRoZSBTUEkgbWFzdGVyCisJCSAqIHNl dHVwIGZ1bmN0aW9uLCBzcGktPm1heF9zcGVlZF9oeiByZWZsZWN0cyB0aGUKKwkJICogYm9hcmQt aW5pdCB2YWx1ZS4gIEl0IHdpbGwgYmUgY2hhbmdlZCBsYXRlciBvbiBieQorCQkgKiB0aGUgcHJv dG9jb2wgbWFzdGVyLCBidXQgYXQgdGhlIG1hc3RlciBzZXR1cCBjYWxsCisJCSAqIGlzIHRoZSBv bmx5IHRpbWUgd2UgYWN0dWFsbHkgZ2V0IHRvIHNlZSB0aGUgaHcgbWF4CisJCSAqIGFuZCB0aHVz IGEgcmVhc29uYWJsZSB0aW1lIHRvIGluaXQgdGhlIGh3IGZpZWxkLgorCQkgKi8KKworCQkvKiBU aGUgbW9kdWxlIHBhcmFtZXRlciBvdmVycmlkZXMgZXZlcnl0aGluZy4gICovCisJCWlmIChjcmlz djMyX3NwaV9zcGVlZF9saW1pdF9IeiAhPSAwKQorCQkJbWF4X3NwZWVkX0h6ID0gY3Jpc3YzMl9z cGlfc3BlZWRfbGltaXRfSHo7CisJCS8qCisJCSAqIEkgbmV2ZXIgY291bGQgZ2V0IGhpc3BlZWQg bW9kZSB0byB3b3JrIGZvciBub24tRE1BLgorCQkgKiBXZSBhZGp1c3QgdGhlIG1heCBzcGVlZCBo ZXJlICh3aGVyZSB3ZSBjb3VsZAorCQkgKiBwcmVzdW1hYmx5IGZpeCBpdCksIG5vdCBpbiB0aGUg Ym9hcmQgaW5mbyBmaWxlLgorCQkgKi8KKwkJZWxzZSBpZiAoc3BpLT5tYXhfc3BlZWRfaHogPiAx NjY2NzAwMCkKKwkJCW1heF9zcGVlZF9IeiA9IDE2NjY3MDAwOworCQllbHNlCisJCQltYXhfc3Bl ZWRfSHogPSBzcGktPm1heF9zcGVlZF9oejsKKworCQlody0+bWF4X3NwZWVkX0h6ID0gbWF4X3Nw ZWVkX0h6OworCQlzcGktPm1heF9zcGVlZF9oeiA9IG1heF9zcGVlZF9IejsKKworCQkvKgorCQkg KiBXZSBhbHNvIGRvIG9uZS10aW1lIGluaXRpYWxpemF0aW9uIG9mIHRoZSBoYXJkd2FyZSBhdCB0 aGlzCisJCSAqIHBvaW50LiAgV2UgY291bGQgZGVmZXIgdG8gdGhlIHJldHVybiB0byB0aGUgcHJv YmUtZnVuY3Rpb24KKwkJICogZnJvbSBzcGlfYml0YmFuZ19zdGFydCwgYnV0IG90aGVyIGhhcmR3 YXJlIHNldHVwIChsaWtlCisJCSAqIHN1YnNlcXVlbnQgY2FsbHMgdG8gdGhpcyBmdW5jdGlvbiBi ZWZvcmUgdGhhdCkgd291bGQgaGF2ZQorCQkgKiB0byBiZSBkZWZlcnJlZCB1bnRpbCB0aGVuIHRv by4KKwkJICovCisJCXJldCA9IGNyaXN2MzJfc2V0dXBfc3BpX3NzZXJfZm9yX3JlZ19hY2Nlc3Mo aHcpOworCQlpZiAocmV0ICE9IDApCisJCQlyZXR1cm4gcmV0OworCisJCXJldCA9IHNwaV9iaXRi YW5nX3NldHVwKHNwaSk7CisJCWlmIChyZXQgIT0gMCkKKwkJCXJldHVybiByZXQ7CisKKwkJZGV2 X2luZm8oJnNwaS0+ZGV2LAorCQkJICJDUklTIHYzMiBTUEkgZHJpdmVyIGZvciBzc2VyJWRcbiIs CisJCQkgc3BpLT5tYXN0ZXItPmJ1c19udW0pOworCX0KKworCXJldHVybiAwOworfQorCisvKgor ICogU1BJLW1hc3RlciBzZXR1cF90cmFuc2Zlci1mdW5jdGlvbiB1c2VkIGZvciBib3RoIERNQSBh bmQgbm9uLURNQQorICogKHNpbmdsZSBmdW5jdGlvbiBmb3IgRE1BLCB0b2dldGhlciB3aXRoIHNw aV9iaXRiYW5nX3NldHVwX3RyYW5zZmVyCisgKiBmb3Igbm9uLURNQSkuCisgKi8KKworc3RhdGlj IGludCBjcmlzdjMyX3NwaV9zc2VyX2NvbW1vbl9zZXR1cF90cmFuc2ZlcihzdHJ1Y3Qgc3BpX2Rl dmljZSAqc3BpLAorCQkJCQkJICBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0KQoreworCXN0cnVjdCBj cmlzdjMyX3NwaV9od19pbmZvICpodyA9IHNwaWRldl90b19odyhzcGkpOworCXU4IGJpdHNfcGVy X3dvcmQ7CisJdTMyIGh6OworCWludCByZXQgPSAwOworCisJaWYgKHQpIHsKKwkJYml0c19wZXJf d29yZCA9IHQtPmJpdHNfcGVyX3dvcmQ7CisJCWh6ID0gdC0+c3BlZWRfaHo7CisJfSBlbHNlIHsK KwkJYml0c19wZXJfd29yZCA9IDA7CisJCWh6ID0gMDsKKwl9CisKKwlpZiAoYml0c19wZXJfd29y ZCA9PSAwKQorCQliaXRzX3Blcl93b3JkID0gc3BpLT5iaXRzX3Blcl93b3JkOworCisJaWYgKGJp dHNfcGVyX3dvcmQgIT0gOCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoaHogPT0gMCkKKwkJ aHogPSBzcGktPm1heF9zcGVlZF9oejsKKworCWlmIChoeiAhPSBody0+ZWZmZWN0aXZlX3NwZWVk X2tIeioxMDAwICYmIGh6ICE9IDApCisJCXJldCA9IGNyaXN2MzJfc3BpX3NzZXJfc2V0X3NwZWVk X0h6KGh3LCBoeik7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBIZWxwZXIgZm9yIGEgU1BJLW1h c3RlciBzZXR1cF90cmFuc2ZlciBmdW5jdGlvbiBmb3Igbm9uLURNQS4gICovCisKK3N0YXRpYyBp bnQgY3Jpc3YzMl9zcGlfc3Nlcl9yZWdzX3NldHVwX3RyYW5zZmVyKHN0cnVjdCBzcGlfZGV2aWNl ICpzcGksCisJCQkJCQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0KQoreworCWludCByZXQgPSBjcmlz djMyX3NwaV9zc2VyX2NvbW1vbl9zZXR1cF90cmFuc2ZlcihzcGksIHQpOworCisJaWYgKHJldCAh PSAwKQorCQlyZXR1cm4gcmV0OworCisJLyogU2V0IHVwIHRoZSBsb29wLW92ZXItYnVmZmVyIHBh cnRzLiAgKi8KKwlyZXR1cm4gc3BpX2JpdGJhbmdfc2V0dXBfdHJhbnNmZXIgKHNwaSwgdCk7Cit9 CisKKy8qIFNQSS1tYXN0ZXIgc2V0dXAgZnVuY3Rpb24gZm9yIERNQS4gICovCisKK3N0YXRpYyBp bnQgY3Jpc3YzMl9zcGlfc3Nlcl9kbWFfbWFzdGVyX3NldHVwKHN0cnVjdCBzcGlfZGV2aWNlICpz cGkpCit7CisJLyoKKwkgKiBBcyB3ZSBkb24ndCBkaXNwYXRjaCB0byB0aGUgc3BpX2JpdGJhbmcg ZGVmYXVsdCBmdW5jdGlvbiwKKwkgKiB3ZSBuZWVkIHRvIGRvIHdoYXRldmVyIHRlc3RzIGl0IGRv ZXM7IGtlZXAgaXQgaW4gc3luYy4gIE9uCisJICogdGhlIGJyaWdodCBzaWRlLCB3ZSBjYW4gdXNl IHRoZSBzcGktPmNvbnRyb2xsZXJfc3RhdGUgc2xvdDsKKwkgKiB3ZSB1c2UgaXQgZm9yIERNQTph YmxlIG1lbW9yeSBmb3IgdGhlIGRlc2NyaXB0b3JzIGFuZAorCSAqIHRlbXBvcmFyeSBidWZmZXJz IHRvIGNvcHkgbm9uLURNQTphYmxlIHRyYW5zZmVycy4KKwkgKi8KKwlzdHJ1Y3QgY3Jpc3YzMl9z cGlfaHdfaW5mbyAqaHcgPSBzcGlkZXZfdG9faHcoc3BpKTsKKwlzdHJ1Y3Qgc3BpX2JpdGJhbmcg KmJpdGJhbmcgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKKwlzdHJ1Y3Qg Y3Jpc3YzMl9zcGlfZG1hX2NzICpjczsKKwl1MzIgZG1hc2l6ZTsKKwlpbnQgcmV0ID0gMDsKKwor CWlmIChody0+bWF4X3NwZWVkX0h6ID09IDApIHsKKwkJc3RydWN0IGNyaXN2MzJfc3BpX2RtYV9k ZXNjcnMgKmRlc2NycDsKKwkJdTMyIGRlc2NycF9kbWE7CisJCXUzMiBtYXhfc3BlZWRfSHo7CisK KwkJLyogVGhlIG1vZHVsZSBwYXJhbWV0ZXIgb3ZlcnJpZGVzIGV2ZXJ5dGhpbmcuICAqLworCQlp ZiAoY3Jpc3YzMl9zcGlfc3BlZWRfbGltaXRfSHogIT0gMCkKKwkJCW1heF9zcGVlZF9IeiA9IGNy aXN2MzJfc3BpX3NwZWVkX2xpbWl0X0h6OworCQkvKgorCQkgKiBTZWUgY29tbWVudCBhdCBjb3Jy ZXNwb25kaW5nIHN0YXRlbWVudCBpbgorCQkgKiBjcmlzdjMyX3NwaV9zc2VyX3JlZ3NfbWFzdGVy X3NldHVwLgorCQkgKi8KKwkJZWxzZQorCQkJbWF4X3NwZWVkX0h6ID0gc3BpLT5tYXhfc3BlZWRf aHo7CisKKwkJaHctPm1heF9zcGVlZF9IeiA9IG1heF9zcGVlZF9IejsKKwkJc3BpLT5tYXhfc3Bl ZWRfaHogPSBtYXhfc3BlZWRfSHo7CisKKwkJcmV0ID0gY3Jpc3YzMl9zZXR1cF9zcGlfc3Nlcl9m b3JfZG1hX2FjY2Vzcyhodyk7CisJCWlmIChyZXQgIT0gMCkKKwkJCXJldHVybiByZXQ7CisKKwkJ LyogQWxsb2NhdGUgc29tZSBleHRyYSBmb3IgbmVjZXNzYXJ5IGFsaWdubWVudC4gICovCisJCWRt YXNpemUgPSBzaXplb2YgKmNzICsgMzEKKwkJCSsgc2l6ZW9mKHN0cnVjdCBjcmlzdjMyX3NwaV9k bWFfZGVzY3JzKTsKKworCQljcyA9IGt6YWxsb2MoZG1hc2l6ZSwgR0ZQX0tFUk5FTCB8IEdGUF9E TUEpOworCQlpZiAoY3MgPT0gTlVMTCkKKwkJCXJldHVybiAtRU5PTUVNOworCisJCS8qCisJCSAq IE1ha2UgZGVzY3JpcHRvcnMgYWxpZ25lZCB3aXRoaW4gdGhlIGFsbG9jYXRlZCBhcmVhLAorCQkg KiBzb21lLXBsYWNlIGFmdGVyIGNzLgorCQkgKi8KKwkJZGVzY3JwID0gKHN0cnVjdCBjcmlzdjMy X3NwaV9kbWFfZGVzY3JzICopCisJCQkoKCh1MzIpIChjcyArIDEpICsgMzEpICYgfjMxKTsKKwkJ ZGVzY3JwX2RtYSA9IHZpcnRfdG9fcGh5cyhkZXNjcnApOworCisJCS8qIFNldCB1cCB0aGUgImNv bnN0YW50IiBwYXJ0cyBvZiB0aGUgZGVzY3JpcHRvcnMuICAqLworCQlkZXNjcnAtPm91dF9kZXNj ci5lb2wgPSAxOworCQlkZXNjcnAtPm91dF9kZXNjci5pbnRyID0gMTsKKwkJZGVzY3JwLT5vdXRf ZGVzY3Iub3V0X2VvcCA9IDE7CisJCWRlc2NycC0+b3V0X2N0eHQuc2F2ZWRfZGF0YSA9IChkbWFf ZGVzY3JfZGF0YSAqKQorCQkgIChkZXNjcnBfZG1hCisJCSAgICsgb2Zmc2V0b2Yoc3RydWN0IGNy aXN2MzJfc3BpX2RtYV9kZXNjcnMsIG91dF9kZXNjcikpOworCQlkZXNjcnAtPm91dF9jdHh0Lm5l eHQgPSAwOworCisJCWRlc2NycC0+aW5fZGVzY3IuZW9sID0gMTsKKwkJZGVzY3JwLT5pbl9kZXNj ci5pbnRyID0gMTsKKwkJZGVzY3JwLT5pbl9jdHh0LnNhdmVkX2RhdGEgPSAoZG1hX2Rlc2NyX2Rh dGEgKikKKwkJCShkZXNjcnBfZG1hCisJCQkgKyBvZmZzZXRvZihzdHJ1Y3QgY3Jpc3YzMl9zcGlf ZG1hX2Rlc2NycywgaW5fZGVzY3IpKTsKKwkJZGVzY3JwLT5pbl9jdHh0Lm5leHQgPSAwOworCisJ CWNzLT5kZXNjcnAgPSBkZXNjcnA7CisJCXNwaS0+Y29udHJvbGxlcl9zdGF0ZSA9IGNzOworCisJ CWluaXRfY29tcGxldGlvbigmaHctPmRtYV9kb25lKTsKKworCQlkZXZfaW5mbygmc3BpLT5kZXYs CisJCQkgIkNSSVMgdjMyIFNQSSBkcml2ZXIgZm9yIHNzZXIlZC9ETUFcbiIsCisJCQkgc3BpLT5t YXN0ZXItPmJ1c19udW0pOworCX0KKworCS8qIERvIG91ciBleHRyYSBjb25zdHJhaW5pbmcgY2hl Y2tzLiAgKi8KKwlpZiAoc3BpLT5iaXRzX3Blcl93b3JkID09IDApCisJCXNwaS0+Yml0c19wZXJf d29yZCA9IDg7CisKKwlpZiAoc3BpLT5iaXRzX3Blcl93b3JkICE9IDgpCisJCXJldHVybiAtRUlO VkFMOworCisJLyogU1BJX0xTQl9GSVJTVCBkZWxpYmVyYXRlbHkgbGVmdCBvdXQsIGFuZCB3ZSBv bmx5IHN1cHBvcnQgbW9kZSAzLiAgKi8KKwlpZiAoKHNwaS0+bW9kZSAmIH4oU1BJX1RYXzF8U1BJ X0NTX0hJR0gpKSAhPSBTUElfTU9ERV8zKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWJpdGJhbmct PmNoaXBzZWxlY3QgPSAoc3BpLT5tb2RlICYgU1BJX0NTX0hJR0gpICE9IDAKKwkJPyBjcmlzdjMy X3NwaV9zc2VyX2NoaXBfc2VsZWN0X2FjdGl2ZV9oaWdoCisJCTogY3Jpc3YzMl9zcGlfc3Nlcl9j aGlwX3NlbGVjdF9hY3RpdmVfbG93OworCisJcmV0ID0gYml0YmFuZy0+c2V0dXBfdHJhbnNmZXIo c3BpLCBOVUxMKTsKKwlpZiAocmV0ICE9IDApCisJCXJldHVybiByZXQ7CisKKwkvKiBSZW1lbWJl ciB0byBkZS1hc3NlcnQgY2hpcC1zZWxlY3QgYmVmb3JlIHRoZSBmaXJzdCB0cmFuc2Zlci4gICov CisJc3Bpbl9sb2NrKCZiaXRiYW5nLT5sb2NrKTsKKwlpZiAoIWJpdGJhbmctPmJ1c3kpIHsKKwkJ Yml0YmFuZy0+Y2hpcHNlbGVjdChzcGksIEJJVEJBTkdfQ1NfSU5BQ1RJVkUpOworCQluZGVsYXko aHctPmhhbGZfY3ljbGVfZGVsYXlfbnMpOworCX0KKwlzcGluX3VubG9jaygmYml0YmFuZy0+bG9j ayk7CisKKwlyZXR1cm4gMDsKK30KKworLyogU1BJLW1hc3RlciBjbGVhbnVwIGZ1bmN0aW9uIGZv ciBETUEuICAqLworCitzdGF0aWMgdm9pZCBjcmlzdjMyX3NwaV9zc2VyX2RtYV9jbGVhbnVwKHN0 cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJa2ZyZWUoc3BpLT5jb250cm9sbGVyX3N0YXRlKTsK KwlzcGktPmNvbnRyb2xsZXJfc3RhdGUgPSBOVUxMOworfQorCisvKgorICogU2V0IHVwIERNQSB0 cmFuc21pdHRlciBkZXNjcmlwdG9ycyBmb3IgYSBjaHVuayBvZiBkYXRhLgorICogVGhlIGNhbGxl ciBpcyByZXNwb25zaWJsZSBmb3Igd29ya2luZyBhcm91bmQgVFIgMTA2LgorICovCitzdGF0aWMg dm9pZCBjcmlzdjMyX3NwaV9zc2VyX3NldHVwX2RtYV9kZXNjcl9vdXQodTMyIHJlZ2ksCisJCQkJ CQkgc3RydWN0IGNyaXN2MzJfc3BpX2RtYV9jcyAqY3MsCisJCQkJCQkgdTMyIG91dF9waHlzLCB1 MzIgY2h1bmtfbGVuKQoreworCUJVR19PTihjaHVua19sZW4gPiBETUFfQ0hVTktTSVopOworCXN0 cnVjdCBjcmlzdjMyX3NwaV9kbWFfZGVzY3JzICpkZXNjcnAgPSBjcy0+ZGVzY3JwOworCXUzMiBk ZXNjcnBfZG1hID0gdmlydF90b19waHlzKGRlc2NycCk7CisKKwlkZXNjcnAtPm91dF9kZXNjci5i dWYgPSAodTggKikgb3V0X3BoeXM7CisJZGVzY3JwLT5vdXRfZGVzY3IuYWZ0ZXIgPSAodTggKikg b3V0X3BoeXMgKyBjaHVua19sZW47CisJZGVzY3JwLT5vdXRfY3R4dC5zYXZlZF9kYXRhX2J1ZiA9 ICh1OCAqKSBvdXRfcGh5czsKKworCURNQV9TVEFSVF9DT05URVhUKHJlZ2ksCisJCQkgIGRlc2Ny cF9kbWEKKwkJCSAgKyBvZmZzZXRvZihzdHJ1Y3QgY3Jpc3YzMl9zcGlfZG1hX2Rlc2Nycywgb3V0 X2N0eHQpKTsKK30KKworLyoKKyAqIFNldCB1cCBETUEgcmVjZWl2ZXIgZGVzY3JpcHRvcnMgZm9y IGEgY2h1bmsgb2YgZGF0YS4KKyAqIEFsc28sIHdvcmsgYXJvdW5kIFRSIDEwNi4KKyAqLworc3Rh dGljIHZvaWQgY3Jpc3YzMl9zcGlfc3Nlcl9zZXR1cF9kbWFfZGVzY3JfaW4odTMyIHJlZ2lfZG1h aW4sCisJCQkJCQlzdHJ1Y3QgY3Jpc3YzMl9zcGlfZG1hX2NzICpjcywKKwkJCQkJCXUzMiBpbl9w aHlzLCB1MzIgY2h1bmtfbGVuKQoreworCUJVR19PTihjaHVua19sZW4gPiBETUFfQ0hVTktTSVop OworCXN0cnVjdCBjcmlzdjMyX3NwaV9kbWFfZGVzY3JzICpkZXNjcnAgPSBjcy0+ZGVzY3JwOwor CXUzMiBkZXNjcnBfZG1hID0gdmlydF90b19waHlzKGRlc2NycCk7CisKKwlkZXNjcnAtPmluX2Rl c2NyLmJ1ZiA9ICh1OCAqKSBpbl9waHlzOworCWRlc2NycC0+aW5fZGVzY3IuYWZ0ZXIgPSAodTgg KikgaW5fcGh5cyArIGNodW5rX2xlbjsKKwlkZXNjcnAtPmluX2N0eHQuc2F2ZWRfZGF0YV9idWYg PSAodTggKikgaW5fcGh5czsKKworCWZsdXNoX2RtYV9kZXNjcigmZGVzY3JwLT5pbl9kZXNjciwg MSk7CisKKwlETUFfU1RBUlRfQ09OVEVYVChyZWdpX2RtYWluLAorCQkJICBkZXNjcnBfZG1hCisJ CQkgICsgb2Zmc2V0b2Yoc3RydWN0IGNyaXN2MzJfc3BpX2RtYV9kZXNjcnMsIGluX2N0eHQpKTsK K30KKworLyoKKyAqIFNQSS1iaXRiYW5nIHR4cnhfYnVmcyBmdW5jdGlvbiBmb3IgRE1BLgorICog RklYTUU6IFdlIGhhdmUgU0cgRE1BIGRlc2NyaXB0b3JzOyB1c2UgdGhlbS4KKyAqIChSZXF1aXJl cyBhYmFuZG9uaW5nIHRoZSBzcGlfYml0YmFuZyBmcmFtZXdvcmsgaWYgZG9uZSByZWFzb25hYmx5 LikKKyAqLworc3RhdGljIGludCBjcmlzdjMyX3NwaV9zc2VyX2RtYV90eHJ4X2J1ZnMoc3RydWN0 IHNwaV9kZXZpY2UgKnNwaSwKKwkJCQkJICBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0KQoreworCXN0 cnVjdCBjcmlzdjMyX3NwaV9kbWFfY3MgKmNzID0gc3BpLT5jb250cm9sbGVyX3N0YXRlOworCXN0 cnVjdCBjcmlzdjMyX3NwaV9od19pbmZvICpodyA9IHNwaWRldl90b19odyhzcGkpOworCXUzMiBs ZW4gPSB0LT5sZW47CisJcmVnX3NzZXJfcndfY2ZnIGNmZyA9IGh3LT5jZmc7CisJcmVnX3NzZXJf cndfdHJfY2ZnIHRyX2NmZyA9IGh3LT50cl9jZmc7CisJcmVnX3NzZXJfcndfcmVjX2NmZyByZWNf Y2ZnID0gaHctPnJlY19jZmc7CisJcmVnX3NzZXJfcndfZXh0cmEgZXh0cmEgPSBody0+ZXh0cmE7 CisJdTMyIHJlZ2lfc3NlciA9IGh3LT5zc2VyLnJlZ2k7CisJdTMyIGRtYWluID0gMDsKKwl1MzIg ZG1hb3V0ID0gMDsKKwl1MzIgcmVnaV9kbWFpbiA9IGh3LT5kbWFpbi5yZWdpOworCXU4ICpyeF9i dWYgPSB0LT5yeF9idWY7CisKKwkvKgorCSAqIFVzaW5nIElSUStjb21wbGV0aW9uIGlzIG1lYXN1 cmVkIHRvIGdpdmUgYW4gb3ZlcmhlYWQgb2YgMTQKKwkgKiB1cywgc28gbGV0J3MgaW5zdGVhZCBi dXN5LXdhaXQgZm9yIHRoZSB0aW1lIHRoYXQgd291bGQgYmUKKwkgKiB3YXN0ZWQgYW55d2F5LCBh bmQgZ2V0IGJhY2sgc29vbmVyLiAgV2UncmUgbm90IGNvdW50aW5nIGluCisJICogb3RoZXIgb3Zl cmhlYWQgc3VjaCBhcyB0aGUgRE1BIGRlc2NyaXB0b3IgaW4gdGhlCisJICogdGltZS1leHByZXNz aW9uLCB3aGljaCBjYXVzZXMgdXMgdG8gdXNlIGJ1c3ktd2FpdCBmb3IKKwkgKiBkYXRhLWxlbmd0 aHMgdGhhdCBhY3R1YWxseSB0YWtlIGEgYml0IGxvbmdlciB0aGFuCisJICogSVJRX1VTQUdFX1RI UkVTSE9MRF9OUy4gIFN0aWxsLCB3aXRoIElSUV9VU0FHRV9USFJFU0hPTERfTlMKKwkgKiA9IDE0 MDAwLCB0aGUgdGhyZXNob2xkIGlzIGZvciAyMCBNSHogPT4gMzUgYnl0ZXMsIDI1ID0+IDQ0CisJ ICogYW5kIDUwID0+IDg4IGFuZCB0aGUgdHlwaWNhbCBTUEkgdHJhbnNmZXIgbGVuZ3RocyBmb3IK KwkgKiBTRGNhcmQgYXJlIHsgMSwgMiwgNywgNTEyIH0gYnl0ZXMgc28gYSBtb3JlIGNvbXBsaWNh dGVkCisJICogd291bGQgbGlrZWx5IGdpdmUgbm90aGluZyBidXQgd29yc2UgcGVyZm9ybWFuY2Ug ZHVlIHRvCisJICogY29tcGxleGl0eS4KKwkgKi8KKwlpbnQgdXNlX2lycSA9IGxlbiAqIGh3LT5o YWxmX2N5Y2xlX2RlbGF5X25zCisJCT4gSVJRX1VTQUdFX1RIUkVTSE9MRF9OUyAvIDggLyAyOwor CisJaWYgKGxlbiA+IERNQV9DSFVOS1NJWikgeworCQkvKgorCQkgKiBJdCBzaG91bGQgYmUgcXVp dGUgZWFzeSB0byBhZGp1c3QgdGhlIGNvZGUgaWYgdGhlIG5lZWQKKwkJICogYXJpc2VzIGZvciBz b21ldGhpbmcgbXVjaCBsYXJnZXIgdGhhbiB0aGUgcHJlYWxsb2NhdGVkCisJCSAqIGJ1ZmZlcnMg KHdoaWNoIGNvdWxkIHRoZW1zZWx2ZXMgZWFzaWx5IGp1c3QgYmUgaW5jcmVhc2VkKQorCQkgKiBi dXQgc3RpbGwgd2hhdCBmaXRzIGluIGV4dHJhLmNsa29mZl9jeWNsZXM6IGttYWxsb2MgYQorCQkg KiB0ZW1wb3JhcnkgZG1hYWJsZSBidWZmZXIgaW4gdGhpcyBmdW5jdGlvbiBhbmQgZnJlZSBpdCBh dAorCQkgKiB0aGUgZW5kLiAgTm8gbmVlZCB0byBvcHRpbWl6ZSByYXJlIHJlcXVlc3RzLiAgVW50 aWwgdGhlbiwKKwkJICogd2UnbGwga2VlcCB0aGUgY29kZSBhcyBzaW1wbGUgYXMgcGVyZm9ybWFu Y2UgYWxsb3dzLgorCQkgKiBBbHRlcm5hdGl2ZWx5IG9yIGlmIHdlIG5lZWQgdG8gc2VuZCBldmVu IGxhcmdlciBkYXRhLAorCQkgKiBjb25zaWRlciBjYWxsaW5nIHNlbGYgd2l0aCB0aGUgcmVxdWly ZWQgbnVtYmVyIG9mICJmYWtlZCIKKwkJICogc2hvcnRlciB0cmFuc2ZlcnMgaGVyZS4KKwkJICov CisJCWRldl9lcnIoJnNwaS0+ZGV2LAorCQkJIlRyeWluZyB0byB0cmFuc2ZlciAlZCA+IG1heCAl ZCBieXRlczoiCisJCQkiIG5lZWQgdG8gYWRqdXN0IHRoZSBTUEkgZHJpdmVyXG4iLAorCQkJbGVu LCBETUFfQ0hVTktTSVopOworCQlyZXR1cm4gLUVNU0dTSVpFOworCX0KKworCS8qCisJICogTmVl ZCB0byBzZXBhcmF0ZWx5IHRlbGwgdGhlIGhpc3BlZWQgbWFjaGluZXJ5IHRoZSBudW1iZXIgb2YK KwkgKiBiaXRzIGluIHRoaXMgdHJhbnNtaXNzaW9uLgorCSAqLworCWV4dHJhLmNsa29mZl9jeWNs ZXMgPSBsZW4gKiA4IC0gMTsKKworCWlmICh0LT50eF9idWYgIT0gTlVMTCkgeworCQlpZiAodC0+ dHhfZG1hID09IDApIHsKKwkJCW1lbWNweShjcy0+dHhfYnVmLCB0LT50eF9idWYsIGxlbik7CisJ CQlkbWFvdXQgPSB2aXJ0X3RvX3BoeXMoY3MtPnR4X2J1Zik7CisJCX0gZWxzZQorCQkJZG1hb3V0 ID0gdC0+dHhfZG1hOworCisJCWNyaXN2MzJfc3BpX3NzZXJfc2V0dXBfZG1hX2Rlc2NyX291dCho dy0+ZG1hb3V0LnJlZ2ksCisJCQkJCQkgICAgIGNzLCBkbWFvdXQsCisJCQkJCQkgICAgIGxlbik7 CisKKwkJLyogTm8gbmVlZCB0byBkbyBhbnl0aGluZyBmb3IgVFIgMTA2OyB0aGlzIERNQSBvbmx5 IHJlYWRzLiAgKi8KKwkJdHJfY2ZnLnRyX2VuID0gMTsKKwkJdHJfY2ZnLmRhdGFfcGluX3VzZSA9 IHJlZ2tfc3Nlcl9kb3V0OworCX0gZWxzZSB7CisJCXRyX2NmZy5kYXRhX3Bpbl91c2UgPSAoc3Bp LT5tb2RlICYgU1BJX1RYXzEpCisJCQk/IHJlZ2tfc3Nlcl9naW8xIDogcmVna19zc2VyX2dpbzA7 CisJCXRyX2NmZy50cl9lbiA9IDA7CisJfQorCisJaWYgKHJ4X2J1ZiAhPSAwKSB7CisJCWlmICh0 LT5yeF9kbWEgPT0gMCkKKwkJCWRtYWluID0gdmlydF90b19waHlzKGNzLT5yeF9idWYpOworCQll bHNlCisJCQlkbWFpbiA9IHQtPnJ4X2RtYTsKKworCQljcmlzdjMyX3NwaV9zc2VyX3NldHVwX2Rt YV9kZXNjcl9pbihyZWdpX2RtYWluLCBjcywKKwkJCQkJCSAgICBkbWFpbiwgbGVuKTsKKwkJcmVj X2NmZy5yZWNfZW4gPSAxOworCisJCVJFR19XUklOVF9TU0VSKHJ3X2Fja19pbnRyLCAtMSk7CisJ CVJFR19XUklOVF9ESShyd19hY2tfaW50ciwgLTEpOworCisJCS8qCisJCSAqIElmIHdlJ3JlIHJl Y2VpdmluZywgdXNlIHRoZSByZWMgZGF0YSBpbnRlcnJ1cHQgZnJvbSBETUEgYXMKKwkJICogYSBz aWduYWwgdGhhdCB0aGUgSFcgaXMgZG9uZS4KKwkJICovCisJCWlmICh1c2VfaXJxKSB7CisJCQly ZWdfc3Nlcl9yd19pbnRyX21hc2sgbWFzayA9IHsgLnVydW4gPSAxIH07CisJCQlyZWdfZG1hX3J3 X2ludHJfbWFzayBkbWFzayA9IHsgLmRhdGEgPSAxIH07CisKKwkJCVJFR19XUl9ESShyd19pbnRy X21hc2ssIGRtYXNrKTsKKworCQkJLyoKKwkJCSAqIENhdGNoIHRyYW5zbWl0dGVyIHVuZGVycnVu cyB0b28uICBXZSBkb24ndAorCQkJICogaGF2ZSB0byBjb25kaXRpb25hbGl6ZSB0aGF0IG9uIHRo ZQorCQkJICogdHJhbnNtaXR0ZXIgYmVpbmcgZW5hYmxlZDsgaXQncyBvZmYgd2hlbgorCQkJICog dGhlIHRyYW5zbWl0dGVyIGlzIG9mZi4gIEFueSBvdmVycnVucyB3aWxsCisJCQkgKiBiZSBpbmRp Y2F0ZWQgYnkgYSB0aW1lb3V0LCBzbyB3ZSBkb24ndCBoYXZlCisJCQkgKiB0byBjaGVjayBmb3Ig dGhhdCBzcGVjaWZpY2FsbHkuCisJCQkgKi8KKwkJCVJFR19XUl9TU0VSKHJ3X2ludHJfbWFzaywg bWFzayk7CisJCX0KKwl9IGVsc2UgeworCQlyZWNfY2ZnLnJlY19lbiA9IDA7CisKKwkJLyoKKwkJ ICogQWNrIHByZXZpb3VzIG92ZXJydW4sIHVuZGVycnVuIGFuZCB0aWRsZSBpbnRlcnJ1cHRzLiAg T3IKKwkJICogd2h5IG5vdCBhbGwuICBXZSdsbCBnZXQgb3J1biBhbmQgdXJ1biAibm9ybWFsbHki IGR1ZSB0byB0aGUKKwkJICogd2F5IGhpc3BlZWQgaXMgKGRvY3VtZW50ZWQgdG8pIHdvcmsgYW5k IG5lZWQgdG8gY2xlYXIgdGhlbSwKKwkJICogYW5kIHdlJ2xsIGhhdmUgYSB0aWRsZSBmcm9tIGEg cHJldmlvdXMgdHJhbnNtaXQgaWYgd2UgdXNlZAorCQkgKiB0byBib3RoIHJlY2VpdmUgYW5kIHRy YW5zbWl0LCBidXQgbm93IG9ubHkgdHJhbnNtaXQuCisJCSAqLworCQlSRUdfV1JJTlRfU1NFUihy d19hY2tfaW50ciwgLTEpOworCisJCWlmICh1c2VfaXJxKSB7CisJCQlyZWdfc3Nlcl9yd19pbnRy X21hc2sgbWFzayA9IHsgLnVydW4gPSAxLCAudGlkbGUgPSAxIH07CisJCQlSRUdfV1JfU1NFUihy d19pbnRyX21hc2ssIG1hc2spOworCQl9CisJfQorCisJUkVHX1dSX1NTRVIocndfcmVjX2NmZywg cmVjX2NmZyk7CisJUkVHX1dSX1NTRVIocndfdHJfY2ZnLCB0cl9jZmcpOworCVJFR19XUl9TU0VS KHJ3X2V4dHJhLCBleHRyYSk7CisKKwkvKgorCSAqIEJhcnJpZXJzIGFyZSBuZWVkZWQgdG8gbWFr ZSBzdXJlIHRoYXQgdGhlIGNvbXBsZXRpb24gaW5pdHMgZG9uJ3QKKwkgKiBtaWdyYXRlIHBhc3Qg dGhlIHJlZ2lzdGVyIHdyaXRlcyBkdWUgdG8gZ2NjIHNjaGVkdWxpbmcuCisJICovCisJbWIoKTsK Kwlody0+ZG1hX2FjdHVhbGx5X2RvbmUgPSAwOworCUlOSVRfQ09NUExFVElPTihody0+ZG1hX2Rv bmUpOworCW1iKCk7CisKKwkvKgorCSAqIFdhaXQgdW50aWwgRE1BIHR4IEZJRk8gaGFzIG1vcmUg dGhhbiBvbmUgYnl0ZSAoaXQgcmVhZHMgb25lCisJICogZGlyZWN0bHkgdGhlbiBvbmUgInZlcnkg cXVpY2tseSIpIGJlZm9yZSBzdGFydGluZyBzc2VyIHR4LgorCSAqLworCWlmICh0cl9jZmcudHJf ZW4pIHsKKwkJdTMyIHJlZ2lfZG1hb3V0ID0gaHctPmRtYW91dC5yZWdpOworCQl1MzIgbWlubGVu ID0gbGVuID4gMiA/IDIgOiBsZW47CisJCXdoaWxlICgoUkVHX1JEX0RPKHJ3X3N0YXQpKS5idWYg PCBtaW5sZW4pCisJCQk7CisJfQorCisJLyogV2FpdCB1bnRpbCBETUEtaW4gaXMgZmluaXNoZWQg cmVhZGluZyB0aGUgZGVzY3JpcHRvcnMuICAqLworCWlmIChyZWNfY2ZnLnJlY19lbikKKwkJd2hp bGUgKERNQV9CVVNZKHJlZ2lfZG1haW4pKQorCQkJOworCS8qCisJICogV2FpdCAzIGN5Y2xlcyBi ZWZvcmUgZW5hYmxpbmcgKHdpdGggLnByZXBhcmUgPSAxKS4KKwkgKiBGSVhNRTogQ2FuIHdlIGN1 dCB0aGlzIGJ5IHNvbWUgdGltZSBhbHJlYWR5IHBhc3NlZD8KKwkgKi8KKwluZGVsYXkoMyAqIDIg KiBody0+aGFsZl9jeWNsZV9kZWxheV9ucyk7CisJY2ZnLmVuID0gMTsKKwlSRUdfV1JfU1NFUihy d19jZmcsIGNmZyk7CisKKwkvKgorCSAqIFdhaXQgMyBtb3JlIGN5Y2xlcyBwbHVzIDMwIG5zIGJl Zm9yZSBsZXR0aW5nIGdvLgorCSAqIEZJWE1FOiBDYW4gd2UgZG8gc29tZXRoaW5nIGVsc2UgYmVm b3JlIGJ1dCBhZnRlciB0aGUKKwkgKiBwcmV2aW91cyBjZmcgd3JpdGUgYW5kIGN1dCB0aGlzIGJ5 IHRoZSB0aW1lIGFscmVhZHkgcGFzc2VkPworCSAqLworCWNmZy5wcmVwYXJlID0gMDsKKwlody0+ Y2ZnID0gY2ZnOworCW5kZWxheSgzICogMiAqIGh3LT5oYWxmX2N5Y2xlX2RlbGF5X25zICsgMzAp OworCisJUkVHX1dSX1NTRVIocndfY2ZnLCBjZmcpOworCisJLyosIFdlJ2xsIGRpc2FibGUgc3Nl ciBuZXh0IHRoZSB0aW1lIHdlIGNoYW5nZSB0aGUgY29uZmlndXJhdGlvbi4gICovCisJY2ZnLmVu ID0gMDsKKwljZmcucHJlcGFyZSA9IDE7CisJaHctPmNmZyA9IGNmZzsKKworCWlmICghdXNlX2ly cSkgeworCQkvKgorCQkgKiBXZSB1c2UgYSB0aW1lb3V0IGNvcnJlc3BvbmRpbmcgdG8gb25lIGl0 ZXJhdGlvbiBwZXIgbnMsCisJCSAqIHdoaWNoIG9mIGNvdXJzZSBpcyBhdCBsZWFzdCBmaXZlICog aW5zbnMgLyBsb29wIHRpbWVzIGFzCisJCSAqIG11Y2ggYXMgcmVhbGl0eSwgYnV0IHdlJ2xsIGF2 b2lkIGEgbmVlZCBmb3IgcmVhZGluZyBodworCQkgKiB0aW1lcnMgZGlyZWN0bHkuCisJCSAqLwor CQl1MzIgY291bnRkb3duID0gSVJRX1VTQUdFX1RIUkVTSE9MRF9OUzsKKworCQlkbworCQkJaWYg KHJlY19jZmcucmVjX2VuID09IDApIHsKKwkJCQkvKiBVc2luZyB0aGUgdHJhbnNtaXR0ZXIgb25s eS4gICovCisJCQkJcmVnX3NzZXJfcl9pbnRyIGludHIgPSBSRUdfUkRfU1NFUihyX2ludHIpOwor CisJCQkJaWYgKGludHIudGlkbGUgIT0gMCkgeworCQkJCQkvKgorCQkJCQkgKiBBbG1vc3QgZG9u ZS4uLiAgSnVzdCBjaGVjayBpZiB3ZQorCQkJCQkgKiBoYWQgYSB0cmFuc21pdHRlciB1bmRlcnJ1 biB0b28uCisJCQkJCSAqLworCQkJCQlpZiAoIWludHIudXJ1bikKKwkJCQkJCWdvdG8gdHJhbnNt aXNzaW9uX2RvbmU7CisKKwkJCQkJLyoKKwkJCQkJICogRmFsbCBvdmVyIHRvIHRoZSAidGltZSBp cyB1cCIgY2FzZTsKKwkJCQkJICogbm8gbmVlZCB0byBwcm92aWRlIGEgc3BlY2lhbCBwYXRoCisJ CQkJCSAqIGZvciB0aGUgZXJyb3IgY2FzZS4KKwkJCQkJICovCisJCQkJCWNvdW50ZG93biA9IDE7 CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQkvKiBVc2luZyBhdCBsZWFzdCB0aGUgcmVjZWl2ZXIu ICAqLworCQkJCWlmICgoUkVHX1JEX0RJKHJfaW50cikpLmRhdGEgIT0gMCkgeworCQkJCQlpZiAo KFJFR19SRF9TU0VSKHJfaW50cikpLnVydW4gPT0gMCkKKwkJCQkJCWdvdG8gdHJhbnNtaXNzaW9u X2RvbmU7CisJCQkJCWNvdW50ZG93biA9IDE7CisJCQkJfQorCQkJfQorCQl3aGlsZSAoLS1jb3Vu dGRvd24gIT0gMCk7CisKKwkJLyoKKwkJICogVGhlIHRpbWUgaXMgdXAuICBTb21ldGhpbmcgbWln aHQgYmUgd3JvbmcsIG9yIHBlcmhhcHMgd2UndmUKKwkJICogc3RhcnRlZCB1c2luZyBkYXRhIGxl bmd0aHMgd2hlcmUgdGhlIHRocmVzaG9sZCB3YXMgYWJvdXQgYQorCQkgKiBtYWduaXR1ZGUgd3Jv bmcuICBGYWxsIG92ZXIgdG8gSVJRLiAgUmVtZW1iZXIgbm90IHRvIGFjaworCQkgKiBpbnRlcnJ1 cHRzIGhlcmUgKGJ1dCBhbHdheXMgYWJvdmUsIGJlZm9yZSBzdGFydGluZyksIGVsc2UKKwkJICog d2UnbGwgaGF2ZSBhIHJhY2UgY29uZGl0aW9uIHdpdGggdGhlIGludGVycnVwdC4KKwkJICovCisJ CWlmICghcmVjX2NmZy5yZWNfZW4pIHsKKwkJCXJlZ19zc2VyX3J3X2ludHJfbWFzayBtYXNrID0g eyAudXJ1biA9IDEsIC50aWRsZSA9IDEgfTsKKwkJCVJFR19XUl9TU0VSKHJ3X2ludHJfbWFzaywg bWFzayk7CisJCX0gZWxzZSB7CisJCQlyZWdfZG1hX3J3X2ludHJfbWFzayBkbWFzayA9IHsgLmRh dGEgPSAxIH07CisJCQlyZWdfc3Nlcl9yd19pbnRyX21hc2sgbWFzayA9IHsgLnVydW4gPSAxIH07 CisKKwkJCS8qCisJCQkgKiBOZXZlciBtaW5kIGNoZWNraW5nIGZvciB0ciBiZWluZyBkaXNhYmxl ZDsgdXJ1bgorCQkJICogd29uJ3QgaGFwcGVuIHRoZW4uCisJCQkgKi8KKwkJCVJFR19XUl9TU0VS KHJ3X2ludHJfbWFzaywgbWFzayk7CisJCQlSRUdfV1JfREkocndfaW50cl9tYXNrLCBkbWFzayk7 CisJCX0KKwl9CisKKwlpZiAoIXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmaHctPmRtYV9k b25lLCBody0+ZG1hX3RpbWVvdXQpCisJICAgIC8qCisJICAgICAqIEhhdmUgdG8ga2VlcCB0cmFj ayBtYW51YWxseSB0b28sIGVsc2Ugd2UnbGwgZ2V0IGEgdGltZW91dAorCSAgICAgKiBpbmRpY2F0 aW9uIGZvciBiZWluZyBzY2hlZHVsZWQgb3V0IHRvbyBsb25nLCB3aGlsZSB0aGUKKwkgICAgICog Y29tcGxldGlvbiB3aWxsIHN0aWxsIGhhdmUgdHJpZ2dlZC4KKwkgICAgICovCisJICAgICYmICFo dy0+ZG1hX2FjdHVhbGx5X2RvbmUpIHsKKwkJdTMyIHJlZ2lfZG1hb3V0ID0gaHctPmRtYW91dC5y ZWdpOworCisJCS8qCisJCSAqIFRyYW5zZmVyIHRpbWVkIG91dC4gIFNob3VsZCBub3QgaGFwcGVu IGZvciBhCisJCSAqIHdvcmtpbmcgY29udHJvbGxlciwgZXhjZXB0IHBlcmhhcHMgaWYgdGhlIHN5 c3RlbSBpcworCQkgKiBiYWRseSBjb25kaXRpb25lZCwgY2F1c2luZyBETUEgbWVtb3J5IGJhbmR3 aWR0aAorCQkgKiBzdGFydmF0aW9uLiAgTm90IG11Y2ggdG8gZG8gYWZ0ZXJ3YXJkcywgYnV0IHBl cmhhcHMKKwkJICogcmVzZXQgRE1BIGFuZCBzc2VyIGFuZCBob3BlIGl0IHdvcmtzIHRoZSBuZXh0 IHRpbWUuCisJCSAqLworCQlSRUdfV1JJTlRfU1NFUihyd19jZmcsIDApOworCQlSRUdfV1JfU1NF Uihyd19jZmcsIGNmZyk7CisJCVJFR19XUklOVF9TU0VSKHJ3X2ludHJfbWFzaywgMCk7CisJCVJF R19XUklOVF9ESShyd19pbnRyX21hc2ssIDApOworCQlSRUdfV1JJTlRfU1NFUihyd19hY2tfaW50 ciwgLTEpOworCQljcmlzdjMyX3Jlc2V0X2RtYV9odyhody0+ZG1haW4ucmVnaSk7CisJCWNyaXN2 MzJfcmVzZXRfZG1hX2h3KGh3LT5kbWFvdXQucmVnaSk7CisKKwkJZGV2X2Vycigmc3BpLT5kZXYs ICJ0aW1lb3V0ICV1IGJ5dGVzICV1IGtIelxuIiwKKwkJCWxlbiwgaHctPmVmZmVjdGl2ZV9zcGVl ZF9rSHopOworCQlkZXZfZXJyKCZzcGktPmRldiwgInNzZXI9KCV4LCV4LCV4LCV4LCV4KVxuIiwK KwkJCVJFR19SRElOVF9TU0VSKHJ3X2NmZyksIFJFR19SRElOVF9TU0VSKHJ3X3RyX2NmZyksCisJ CQlSRUdfUkRJTlRfU1NFUihyd19yZWNfY2ZnKSwgUkVHX1JESU5UX1NTRVIocndfZXh0cmEpLAor CQkJUkVHX1JESU5UX1NTRVIocl9pbnRyKSk7CisJCWRldl9lcnIoJnNwaS0+ZGV2LCAidHg9KCV4 LCV4LCV4LCV4KVxuIiwKKwkJCWRtYW91dCwgUkVHX1JESU5UX0RPKHJ3X3N0YXQpLCBSRUdfUkRJ TlRfRE8ocndfZGF0YSksCisJCQlSRUdfUkRJTlRfRE8ocl9pbnRyKSk7CisJCWRldl9lcnIoJnNw aS0+ZGV2LCAicng9KCV4LCV4LCV4LCV4KVxuIiwKKwkJCWRtYWluLCBSRUdfUkRJTlRfREkocndf c3RhdCksIFJFR19SRElOVF9ESShyd19kYXRhKSwKKwkJCVJFR19SRElOVF9ESShyX2ludHIpKTsK KwkJcmV0dXJuIC1FSU87CisJfQorCisgdHJhbnNtaXNzaW9uX2RvbmU6CisJLyogV2FpdCBmb3Ig dGhlIGxhc3QgaGFsZi1jeWNsZSBvZiB0aGUgbGFzdCBjeWNsZS4gICovCisJY3Jpc3YzMl9zcGlf c3Nlcl93YWl0X2hhbGZhYml0KGh3KTsKKworCS8qIFJlc2V0IGZvciBhbm90aGVyIGNhbGwuICAq LworCVJFR19XUl9TU0VSKHJ3X2NmZywgY2ZnKTsKKworCS8qCisJICogSWYgd2UgaGFkIHRvIHVz ZSB0aGUgdGVtcCBETUFhYmxlIHJlYyBidWZmZXIsIGNvcHkgaXQgdG8gdGhlIHJpZ2h0CisJICog cG9zaXRpb24uCisJICovCisJaWYgKHQtPnJ4X2J1ZiAhPSAwICYmIHQtPnJ4X2RtYSA9PSAwKQor CQltZW1jcHkgKHQtPnJ4X2J1ZiwgY3MtPnJ4X2J1ZiwgbGVuKTsKKworCS8qCisJICogQWxsIGNs ZWFyLiAgVGhlIGludGVycnVwdCBmdW5jdGlvbiBkaXNhYmxlZCB0aGUgaW50ZXJydXB0LCB3ZSBk b24ndAorCSAqIGhhdmUgdG8gZG8gbW9yZS4KKwkgKi8KKwlyZXR1cm4gbGVuOworfQorCisvKiBQ bGF0Zm9ybS1kZXZpY2UgcHJvYmUgZnVuY3Rpb24uICAqLworCitzdGF0aWMgaW50IF9fZGV2aW5p dCBjcmlzdjMyX3NwaV9zc2VyX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3sK KwlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyOworCXN0cnVjdCBjcmlzdjMyX3NwaV9zc2VyX2Rl dmRhdGEgKmRkOworCXN0cnVjdCBjcmlzdjMyX3NwaV9od19pbmZvICpodzsKKwlzdHJ1Y3QgcmVz b3VyY2UgKnJlczsKKwlzdHJ1Y3QgY3Jpc3YzMl9zcGlfc3Nlcl9jb250cm9sbGVyX2RhdGEgKmdj OworCWludCByZXQ7CisKKwkvKgorCSAqIFdlIG5lZWQgdG8gZ2V0IHRoZSBjb250cm9sbGVyIGRh dGEgYXMgYSBoYXJkd2FyZSByZXNvdXJjZSwKKwkgKiBvciBlbHNlIGl0IHdvdWxkbid0IGJlIGF2 YWlsYWJsZSB1bnRpbCAqYWZ0ZXIqIHRoZQorCSAqIHNwaV9iaXRiYW5nX3N0YXJ0IGNhbGwhCisJ ICovCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlX2J5bmFtZShkZXYsIDAsICJjb250cm9s bGVyX2RhdGFfcHRyIik7CisJaWYgKHJlcyA9PSBOVUxMKSB7CisJCWRldl9lcnIoJmRldi0+ZGV2 LAorCQkJImNhbid0IGdldCBjb250cm9sbGVyX2RhdGEgcmVzb3VyY2UgYXQgcHJvYmVcbiIpOwor CQlyZXR1cm4gLUVJTzsKKwl9CisKKwlnYyA9IChzdHJ1Y3QgY3Jpc3YzMl9zcGlfc3Nlcl9jb250 cm9sbGVyX2RhdGEgKikgcmVzLT5zdGFydDsKKworCW1hc3RlciA9IHNwaV9hbGxvY19tYXN0ZXIo JmRldi0+ZGV2LCBzaXplb2YgKmRkKTsKKwlpZiAobWFzdGVyID09IE5VTEwpIHsKKwkJZGV2X2Vy cigmZGV2LT5kZXYsICJmYWlsZWQgdG8gYWxsb2NhdGUgc3BpIG1hc3RlclxuIik7CisJCXJldCA9 IC1FTk9NRU07CisJCWdvdG8gZXJyOworCX0KKworCWRkID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0 YShtYXN0ZXIpOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKGRldiwgZGQpOworCisJLyoKKwkgKiBU aGUgZGV2aWNlIGRhdGEgYXNrcyBmb3IgdGhpcyBkcml2ZXIsIGFuZCBob2xkcyB0aGUgaWQKKwkg KiBudW1iZXIsIHdoaWNoIG11c3QgYmUgdW5pcXVlIGFtb25nIHRoZSBzYW1lLXR5cGUgZGV2aWNl cy4KKwkgKiBXZSB1c2UgdGhpcyBhcyB0aGUgbnVtYmVyIG9mIHRoaXMgU1BJIGJ1cy4KKwkgKi8K KwltYXN0ZXItPmJ1c19udW0gPSBkZXYtPmlkOworCisJLyogU2V0dXAgU1BJIGJpdGJhbmcgYWRh cHRlciBob29rcy4gICovCisJZGQtPmJpdGJhbmcubWFzdGVyID0gc3BpX21hc3Rlcl9nZXQobWFz dGVyKTsKKwlkZC0+Yml0YmFuZy5jaGlwc2VsZWN0ID0gY3Jpc3YzMl9zcGlfc3Nlcl9jaGlwX3Nl bGVjdF9hY3RpdmVfbG93OworCisJaHcgPSAmZGQtPmh3OworCWh3LT5nYyA9IGdjOworCisJLyog UHJlLXNwaV9iaXRiYW5nX3N0YXJ0IHNldHVwLiAqLworCWlmIChnYy0+dXNpbmdfZG1hKSB7CisJ CS8qIFNldHVwIERNQSBhbmQgaW50ZXJydXB0cy4gICovCisJCXJldCA9IGdjLT5pZmFjZV9hbGxv Y2F0ZSgmaHctPnNzZXIsICZody0+ZG1haW4sICZody0+ZG1hb3V0KTsKKwkJaWYgKHJldCAhPSAw KQorCQkJZ290byBlcnJfbm9fcmVnczsKKworCQlkZC0+Yml0YmFuZy5tYXN0ZXItPnNldHVwID0g Y3Jpc3YzMl9zcGlfc3Nlcl9kbWFfbWFzdGVyX3NldHVwOworCQlkZC0+Yml0YmFuZy5zZXR1cF90 cmFuc2ZlcgorCQkJPSBjcmlzdjMyX3NwaV9zc2VyX2NvbW1vbl9zZXR1cF90cmFuc2ZlcjsKKwkJ ZGQtPmJpdGJhbmcudHhyeF9idWZzID0gY3Jpc3YzMl9zcGlfc3Nlcl9kbWFfdHhyeF9idWZzOwor CQlkZC0+Yml0YmFuZy5tYXN0ZXItPmNsZWFudXAgPSBjcmlzdjMyX3NwaV9zc2VyX2RtYV9jbGVh bnVwOworCX0gZWxzZSB7CisJCS8qIEp1c3QgcmVnaXN0ZXJzLCB0aGVuLiAgKi8KKwkJcmV0ID0g Z2MtPmlmYWNlX2FsbG9jYXRlKCZody0+c3NlciwgTlVMTCwgTlVMTCk7CisJCWlmIChyZXQgIT0g MCkKKwkJCWdvdG8gZXJyX25vX3JlZ3M7CisKKwkJZGQtPmJpdGJhbmcubWFzdGVyLT5zZXR1cAor CQkJPSBjcmlzdjMyX3NwaV9zc2VyX3JlZ3NfbWFzdGVyX3NldHVwOworCQlkZC0+Yml0YmFuZy5z ZXR1cF90cmFuc2ZlcgorCQkJPSBjcmlzdjMyX3NwaV9zc2VyX3JlZ3Nfc2V0dXBfdHJhbnNmZXI7 CisJCWRkLT5iaXRiYW5nLm1hc3Rlci0+Y2xlYW51cCA9IHNwaV9iaXRiYW5nX2NsZWFudXA7CisK KwkJLyoKKwkJICogV2UgY2FuIGRvIGFsbCBtb2RlcyBwcmV0dHkgc2ltcGx5LCBidXQgSSBoYXZl IG5vCisJCSAqIHNpbXBsZSBlbm91Z2ggd2F5IHRvIHRlc3QgdGhlbSwgc28gSSB3b24ndC4KKwkJ ICovCisJCWRkLT5iaXRiYW5nLnR4cnhfd29yZFtTUElfTU9ERV8zXQorCQkJPSBjcmlzdjMyX3Nw aV9zc2VyX3R4cnhfbW9kZTM7CisJfQorCisJcmV0ID0gc3BpX2JpdGJhbmdfc3RhcnQoJmRkLT5i aXRiYW5nKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9ub19iaXRiYW5nOworCisJLyoKKwkgKiBX ZSBkb24ndCBoYXZlIGEgZGV2X2luZm8gaGVyZSwgYXMgaW5pdGlhbGl6YXRpb24gdGhhdCBtYXkg ZmFpbCBpcworCSAqIHBvc3Rwb25lZCB0byB0aGUgZmlyc3QgbWFzdGVyLT5zZXR1cCBjYWxsLiAg SXQncyBjYWxsZWQgZnJvbQorCSAqIHNwaV9iaXRiYW5nX3N0YXJ0IChhYm92ZSksIHdoZXJlIHRo ZSBjYWxsLWNoYWluIGRvZXNuJ3QgbG9vayB0b28KKwkgKiBjbG9zZSBhdCBlcnJvciByZXR1cm4g dmFsdWVzOyB3ZSdsbCBnZXQgaGVyZSBzdWNjZXNzZnVsbHkgYW55d2F5LAorCSAqIHNvIGVtaXR0 aW5nIGEgc2VwYXJhdGUgbWVzc2FnZSBoZXJlIGlzIGF0IG1vc3QgY29uZnVzaW5nLgorCSAqLwor CWRldl9kYmcoJmRldi0+ZGV2LAorCQkiQ1JJUyB2MzIgU1BJIGRyaXZlciBmb3Igc3NlciVkJXMg cHJlc2VudFxuIiwKKwkJbWFzdGVyLT5idXNfbnVtLAorCQlnYy0+dXNpbmdfZG1hID8gIi9ETUEi IDogIiIpOworCisJcmV0dXJuIDA7CisKKyBlcnJfbm9fYml0YmFuZzoKKwlnYy0+aWZhY2VfZnJl ZSgpOworCisgZXJyX25vX3JlZ3M6CisJcGxhdGZvcm1fc2V0X2RydmRhdGEoZGV2LCBOVUxMKTsK KwlzcGlfbWFzdGVyX3B1dChkZC0+Yml0YmFuZy5tYXN0ZXIpOworCisgZXJyOgorCXJldHVybiBy ZXQ7Cit9CisKKy8qIFBsYXRmb3JtLWRldmljZSByZW1vdmUtZnVuY3Rpb24uICAqLworCitzdGF0 aWMgaW50IF9fZGV2ZXhpdCBjcmlzdjMyX3NwaV9zc2VyX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1f ZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGNyaXN2MzJfc3BpX3NzZXJfZGV2ZGF0YSAqZGQgPSBw bGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBjcmlzdjMyX3NwaV9od19pbmZvICpo dyA9ICZkZC0+aHc7CisJc3RydWN0IGNyaXN2MzJfc3BpX3NzZXJfY29udHJvbGxlcl9kYXRhICpn YyA9IGh3LT5nYzsKKwlpbnQgcmV0OworCisJLyogV2UgbmVlZCB0byBzdG9wIGFsbCBiaXRiYW5n aW5nIGFjdGl2aXR5IHNlcGFyYXRlbHkuICAqLworCXJldCA9IHNwaV9iaXRiYW5nX3N0b3AoJmRk LT5iaXRiYW5nKTsKKwlpZiAocmV0ICE9IDApCisJCXJldHVybiByZXQ7CisKKwlzcGlfbWFzdGVy X3B1dChkZC0+Yml0YmFuZy5tYXN0ZXIpOworCisJLyoKKwkgKiBJZiB3ZSBnZXQgaGVyZSwgdGhl IHF1ZXVlIGlzIGVtcHR5IGFuZCB0aGVyZSdzIG5vIGFjdGl2aXR5OworCSAqIGl0J3Mgc2FmZSB0 byBmbGlwIHRoZSBzd2l0Y2ggb24gdGhlIGludGVyZmFjZXMuCisJICovCisJaWYgKGdjLT51c2lu Z19kbWEpIHsKKwkJdTMyIHJlZ2lfZG1haW4gPSBody0+ZG1haW4ucmVnaTsKKwkJdTMyIHJlZ2lf ZG1hb3V0ID0gaHctPmRtYW91dC5yZWdpOworCQl1MzIgcmVnaV9zc2VyID0gaHctPnNzZXIucmVn aTsKKworCQlSRUdfV1JJTlRfU1NFUihyd19pbnRyX21hc2ssIDApOworCQlSRUdfV1JJTlRfREko cndfaW50cl9tYXNrLCAwKTsKKwkJUkVHX1dSSU5UX0RPKHJ3X2ludHJfbWFzaywgMCk7CisJCWh3 LT5jZmcuZW4gPSAwOworCQlSRUdfV1JfU1NFUihyd19jZmcsIGh3LT5jZmcpOworCQlETUFfUkVT RVQocmVnaV9kbWFpbik7CisJCURNQV9SRVNFVChyZWdpX2RtYW91dCk7CisJCWZyZWVfaXJxKGh3 LT5zc2VyLmlycSwgaHcpOworCQlmcmVlX2lycShody0+ZG1haW4uaXJxLCBodyk7CisJfQorCisJ Z2MtPmlmYWNlX2ZyZWUoKTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKGRldiwgTlVMTCk7CisJ cmV0dXJuIDA7Cit9CisKKy8qCisgKiBGb3IgdGhlIHRpbWUgYmVpbmcsIHRoZXJlJ3Mgbm8gc3Vz cGVuZC9yZXN1bWUgc3VwcG9ydCB0byBjYXJlCisgKiBhYm91dCwgc28gdGhvc2UgaGFuZGxlcnMg ZGVmYXVsdCB0byBOVUxMLgorICovCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBjcmlz djMyX3NwaV9zc2VyX2RydiA9IHsKKwkucHJvYmUJCT0gY3Jpc3YzMl9zcGlfc3Nlcl9wcm9iZSwK KwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGNyaXN2MzJfc3BpX3NzZXJfcmVtb3ZlKSwKKwkuZHJp dmVyCQk9IHsKKwkJLm5hbWUJPSAic3BpX2NyaXN2MzJfc3NlciIsCisJCS5vd25lcgk9IFRISVNf TU9EVUxFLAorCX0sCit9OworCisvKiBNb2R1bGUgaW5pdCBmdW5jdGlvbi4gICovCisKK3N0YXRp YyBpbnQgX19kZXZpbml0IGNyaXN2MzJfc3BpX3NzZXJfaW5pdCh2b2lkKQoreworCXJldHVybiBw bGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmNyaXN2MzJfc3BpX3NzZXJfZHJ2KTsKK30KKworLyog TW9kdWxlIGV4aXQgZnVuY3Rpb24uICAqLworCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgY3Jpc3Yz Ml9zcGlfc3Nlcl9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmNy aXN2MzJfc3BpX3NzZXJfZHJ2KTsKK30KKworLyogU2V0dGVyIGZ1bmN0aW9uIGZvciBzcGVlZCBs aW1pdC4gICovCisKK3N0YXRpYyBpbnQgY3Jpc3YzMl9zcGlfc3BlZWRfbGltaXRfSHpfc2V0dGVy KGNvbnN0IGNoYXIgKnZhbCwKKwkJCQkJICAgICBzdHJ1Y3Qga2VybmVsX3BhcmFtICprcCkKK3sK KwljaGFyICplbmRwOworCXVsb25nIG51bSA9IHNpbXBsZV9zdHJ0b3VsKHZhbCwgJmVuZHAsIDAp OworCWlmIChlbmRwID09IHZhbAorCSAgICB8fCAqZW5kcCAhPSAwCisJICAgIHx8IG51bSA8PSAw CisJICAgIC8qCisJICAgICAqIFdlIGNhbid0IGdvIGFib3ZlIDEwMCBNSHogc3BlZWQuICBBY3R1 YWxseSB3ZSBjYW4ndCBnbworCSAgICAgKiBhYm92ZSA1MCBNSHogdXNpbmcgdGhlIHNzZXIgc3Vw cG9ydCBidXQgaXQgbWlnaHQgbWFrZQorCSAgICAgKiBzZW5zZSB0cnlpbmcuCisJICAgICAqLwor CSAgICB8fCBudW0gPiAxMDAwMDAwMDApCisJCXJldHVybiAtRUlOVkFMOworCSoodWxvbmcgKikg a3AtPmFyZyA9IG51bTsKKwlyZXR1cm4gMDsKK30KKworbW9kdWxlX3BhcmFtX2NhbGwoY3Jpc3Yz Ml9zcGlfbWF4X3NwZWVkX2h6LAorCQkgIGNyaXN2MzJfc3BpX3NwZWVkX2xpbWl0X0h6X3NldHRl ciwgcGFyYW1fZ2V0X3Vsb25nLAorCQkgICZjcmlzdjMyX3NwaV9zcGVlZF9saW1pdF9IeiwgMDY0 NCk7CisKK21vZHVsZV9pbml0KGNyaXN2MzJfc3BpX3NzZXJfaW5pdCk7Cittb2R1bGVfZXhpdChj cmlzdjMyX3NwaV9zc2VyX2V4aXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkNSSVMgdjMyIFNQ SS1TU0VSIERyaXZlciIpOworTU9EVUxFX0FVVEhPUigiSGFucy1QZXRlciBOaWxzc29uLCA8aHBA YXhpcy5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7Cg== ------_=_NextPart_001_01C78514.158A3EB0--