From mboxrd@z Thu Jan 1 00:00:00 1970 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: base64 Subject: [v4,3/4] edac: synopsys: Add EDAC ECC support for ZynqMP DDRC From: Borislav Petkov Message-Id: <20180821130946.GD30528@nazgul.tnic> Date: Tue, 21 Aug 2018 15:09:46 +0200 To: Manish Narani Cc: robh+dt@kernel.org, mark.rutland@arm.com, catalin.marinas@arm.com, will.deacon@arm.com, michal.simek@xilinx.com, mchehab@kernel.org, mdf@kernel.org, edgar.iglesias@xilinx.com, shubhrajyoti.datta@xilinx.com, naga.sureshkumar.relli@xilinx.com, bharat.kumar.gogada@xilinx.com, stefan.krsmanovic@aggios.com, sgoud@xilinx.com, anirudh@xilinx.com, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-edac@vger.kernel.org List-ID: T24gU2F0LCBBdWcgMDQsIDIwMTggYXQgMDI6NTU6MzRQTSArMDUzMCwgTWFuaXNoIE5hcmFuaSB3 cm90ZToKPiBBZGQgRURBQyBFQ0Mgc3VwcG9ydCBmb3IgWnlucU1QIEREUkMgSVAuIEFsc28gYWRk IHN1cHBvcnQgZm9yIEVDQyBFcnJvcgo+IEluamVjdGlvbiBpbiBaeW5xTVAuIFRoZSBjb3JyZWN0 ZWQgYW5kIHVuY29ycmVjdGVkIGVycm9yIGludGVycnVwdHMKPiBzdXBwb3J0IGlzIGFkZGVkLiBU aGUgUm93LCBDb2x1bW4sIEJhbmssIEJhbmsgR3JvdXAgYW5kIFJhbmsgYml0cwo+IHBvc2l0aW9u cyBhcmUgZGV0ZXJtaW5lZCB2aWEgQWRkcmVzcyBNYXAgcmVnaXN0ZXJzIG9mIFN5bm9wc3lzIERE UkMuCj4gCj4gU2lnbmVkLW9mZi1ieTogTWFuaXNoIE5hcmFuaSA8bWFuaXNoLm5hcmFuaUB4aWxp bnguY29tPgo+IC0tLQo+ICBkcml2ZXJzL2VkYWMvS2NvbmZpZyAgICAgICAgIHwgICAyICstCj4g IGRyaXZlcnMvZWRhYy9zeW5vcHN5c19lZGFjLmMgfCA4NjQgKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrLQo+ICAyIGZpbGVzIGNoYW5nZWQsIDg0OCBpbnNlcnRpb25z KCspLCAxOCBkZWxldGlvbnMoLSkKPiAKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9lZGFjL0tjb25m aWcgYi9kcml2ZXJzL2VkYWMvS2NvbmZpZwo+IGluZGV4IDU3MzA0YjIuLmIxZmM3YTE2IDEwMDY0 NAo+IC0tLSBhL2RyaXZlcnMvZWRhYy9LY29uZmlnCj4gKysrIGIvZHJpdmVycy9lZGFjL0tjb25m aWcKPiBAQCAtNDQxLDcgKzQ0MSw3IEBAIGNvbmZpZyBFREFDX0FMVEVSQV9TRE1NQwo+ICAKPiAg Y29uZmlnIEVEQUNfU1lOT1BTWVMKPiAgCXRyaXN0YXRlICJTeW5vcHN5cyBERFIgTWVtb3J5IENv bnRyb2xsZXIiCj4gLQlkZXBlbmRzIG9uIEFSQ0hfWllOUQo+ICsJZGVwZW5kcyBvbiBBUkNIX1pZ TlEgfHwgQVJNNjQKPiAgCWhlbHAKPiAgCSAgU3VwcG9ydCBmb3IgZXJyb3IgZGV0ZWN0aW9uIGFu ZCBjb3JyZWN0aW9uIG9uIHRoZSBTeW5vcHN5cyBERFIKPiAgCSAgbWVtb3J5IGNvbnRyb2xsZXIu Cj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9zeW5vcHN5c19lZGFjLmMgYi9kcml2ZXJzL2Vk YWMvc3lub3BzeXNfZWRhYy5jCj4gaW5kZXggYjNjNTRlNy4uODJmMjc2YiAxMDA2NDQKPiAtLS0g YS9kcml2ZXJzL2VkYWMvc3lub3BzeXNfZWRhYy5jCj4gKysrIGIvZHJpdmVycy9lZGFjL3N5bm9w c3lzX2VkYWMuYwo+IEBAIC0yMiw2ICsyMiw3IEBACj4gICNpbmNsdWRlIDxsaW51eC9lZGFjLmg+ Cj4gICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KPiAgI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3Jt X2RldmljZS5oPgo+ICsjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Cj4gICNpbmNsdWRlIDxs aW51eC9vZi5oPgo+ICAKPiAgI2luY2x1ZGUgImVkYWNfbW9kdWxlLmgiCj4gQEAgLTk2LDYgKzk3 LDE3MCBAQAo+ICAjZGVmaW5lIFNDUlVCX01PREVfTUFTSwkJMHg3Cj4gICNkZWZpbmUgU0NSVUJf TU9ERV9TRUNERUQJMHg0Cj4gIAo+ICsvKiBERFIgRUNDIFF1aXJrcyAqLwo+ICsjZGVmaW5lIERE Ul9FQ0NfSU5UUl9TVVBQT1JUCUJJVCgwKQo+ICsKPiArLyogRERSIEVDQyBRdWlya3MgKi8KPiAr I2RlZmluZSBERFJfRUNDX0lOVFJfU1VQUE9SVAlCSVQoMCkKClRoaXMgaXMgcmVwZWF0ZWQuCgo+ ICsjZGVmaW5lIEREUl9FQ0NfREFUQV9QT0lTT05fU1VQUE9SVCBCSVQoMSkKPiArCj4gKy8qIFp5 bnFNUCBFbmhhbmNlZCBERFIgbWVtb3J5IGNvbnRyb2xsZXIgcmVnaXN0ZXJzIHRoYXQgYXJlIHJl bGV2YW50IHRvIEVDQyAqLwo+ICsvKiBFQ0MgQ29uZmlndXJhdGlvbiBSZWdpc3RlcnMgKi8KPiAr I2RlZmluZSBFQ0NfQ0ZHMF9PRlNUCTB4NzAKPiArI2RlZmluZSBFQ0NfQ0ZHMV9PRlNUCTB4NzQK PiArCj4gKy8qIEVDQyBTdGF0dXMgUmVnaXN0ZXIgKi8KPiArI2RlZmluZSBFQ0NfU1RBVF9PRlNU CTB4NzgKPiArCj4gKy8qIEVDQyBDbGVhciBSZWdpc3RlciAqLwo+ICsjZGVmaW5lIEVDQ19DTFJf T0ZTVAkweDdDCj4gKwo+ICsvKiBFQ0MgRXJyb3IgY291bnQgUmVnaXN0ZXIgKi8KPiArI2RlZmlu ZSBFQ0NfRVJSQ05UX09GU1QJMHg4MAoKRG8geW91IG5vdCBzZWUgaG93IHRoZSByZXN0IG9mIHRo ZSBkZWZpbmVzJyB2YWx1ZXMgYXJlIGFsaWduZWQKdmVydGljYWxseSBpbiB0aGlzIGZpbGU/Cgo+ ICsKPiArLyogRUNDIENvcnJlY3RlZCBFcnJvciBBZGRyZXNzIFJlZ2lzdGVyICovCj4gKyNkZWZp bmUgRUNDX0NFQUREUjBfT0ZTVAkweDg0Cj4gKyNkZWZpbmUgRUNDX0NFQUREUjFfT0ZTVAkweDg4 Cj4gKwo+ICsvKiBFQ0MgU3luZHJvbWUgUmVnaXN0ZXJzICovCj4gKyNkZWZpbmUgRUNDX0NTWU5E MF9PRlNUCTB4OEMKPiArI2RlZmluZSBFQ0NfQ1NZTkQxX09GU1QJMHg5MAo+ICsjZGVmaW5lIEVD Q19DU1lORDJfT0ZTVAkweDk0Cj4gKwo+ICsvKiBFQ0MgQml0IE1hc2swIEFkZHJlc3MgUmVnaXN0 ZXIgKi8KPiArI2RlZmluZSBFQ0NfQklUTUFTSzBfT0ZTVAkweDk4Cj4gKyNkZWZpbmUgRUNDX0JJ VE1BU0sxX09GU1QJMHg5Qwo+ICsjZGVmaW5lIEVDQ19CSVRNQVNLMl9PRlNUCTB4QTAKPiArCj4g Ky8qIEVDQyBVbkNvcnJlY3RlZCBFcnJvciBBZGRyZXNzIFJlZ2lzdGVyICovCj4gKyNkZWZpbmUg RUNDX1VFQUREUjBfT0ZTVAkweEE0Cj4gKyNkZWZpbmUgRUNDX1VFQUREUjFfT0ZTVAkweEE4Cj4g Kwo+ICsvKiBFQ0MgU3luZHJvbWUgUmVnaXN0ZXJzICovCj4gKyNkZWZpbmUgRUNDX1VFU1lORDBf T0ZTVAkweEFDCj4gKyNkZWZpbmUgRUNDX1VFU1lORDFfT0ZTVAkweEIwCj4gKyNkZWZpbmUgRUND X1VFU1lORDJfT0ZTVAkweEI0Cj4gKwo+ICsvKiBFQ0MgUG9pc29uIEFkZHJlc3MgUmVnICovCj4g KyNkZWZpbmUgRUNDX1BPSVNPTjBfT0ZTVAkweEI4Cj4gKyNkZWZpbmUgRUNDX1BPSVNPTjFfT0ZT VAkweEJDCj4gKwo+ICsjZGVmaW5lIEVDQ19BRERSTUFQMF9PRkZTRVQJMHgyMDAKPiArCj4gKy8q IENvbnRyb2wgcmVnaXN0ZXIgYml0ZmllbGQgZGVmaW5pdGlvbnMgKi8KPiArI2RlZmluZSBFQ0Nf Q1RSTF9CVVNXSURUSF9NQVNLCTB4MzAwMAo+ICsjZGVmaW5lIEVDQ19DVFJMX0JVU1dJRFRIX1NI SUZUCTEyCj4gKyNkZWZpbmUgRUNDX0NUUkxfQ0xSX0NFX0VSUkNOVAlCSVQoMikKPiArI2RlZmlu ZSBFQ0NfQ1RSTF9DTFJfVUVfRVJSQ05UCUJJVCgzKQo+ICsKPiArLyogRERSIENvbnRyb2wgUmVn aXN0ZXIgd2lkdGggZGVmaW5pdGlvbnMgICovCj4gKyNkZWZpbmUgRERSQ1RMX0VXRFRIXzE2CQky Cj4gKyNkZWZpbmUgRERSQ1RMX0VXRFRIXzMyCQkxCj4gKyNkZWZpbmUgRERSQ1RMX0VXRFRIXzY0 CQkwCj4gKwo+ICsvKiBFQ0Mgc3RhdHVzIHJlZ2lzdGVyIGRlZmluaXRpb25zICovCj4gKyNkZWZp bmUgRUNDX1NUQVRfVUVDTlRfTUFTSwkweEYwMDAwCj4gKyNkZWZpbmUgRUNDX1NUQVRfVUVDTlRf U0hJRlQJMTYKPiArI2RlZmluZSBFQ0NfU1RBVF9DRUNOVF9NQVNLCTB4RjAwCj4gKyNkZWZpbmUg RUNDX1NUQVRfQ0VDTlRfU0hJRlQJOAo+ICsjZGVmaW5lIEVDQ19TVEFUX0JJVE5VTV9NQVNLCTB4 N0YKPiArCj4gKy8qIEREUiBRT1MgSW50ZXJydXB0IHJlZ2lzdGVyIGRlZmluaXRpb25zICovCj4g KyNkZWZpbmUgRERSX1FPU19JUlFfU1RBVF9PRlNUCTB4MjAyMDAKPiArI2RlZmluZSBERFJfUU9T VUVfTUFTSwkJMHg0Cj4gKyNkZWZpbmUJRERSX1FPU0NFX01BU0sJCTB4Mgo+ICsjZGVmaW5lCUVD Q19DRV9VRV9JTlRSX01BU0sJMHg2Cj4gKyNkZWZpbmUgRERSX1FPU19JUlFfRU5fT0ZTVCAgICAg MHgyMDIwOAo+ICsjZGVmaW5lIEREUl9RT1NfSVJRX0RCX09GU1QJMHgyMDIwQwo+ICsKPiArLyog RUNDIENvcnJlY3RlZCBFcnJvciBSZWdpc3RlciBNYXNrIGFuZCBTaGlmdHMqLwo+ICsjZGVmaW5l IEVDQ19DRUFERFIwX1JXX01BU0sJMHgzRkZGRgo+ICsjZGVmaW5lIEVDQ19DRUFERFIwX1JOS19N QVNLCUJJVCgyNCkKPiArI2RlZmluZSBFQ0NfQ0VBRERSMV9CTktHUlBfTUFTSwkweDMwMDAwMDAK PiArI2RlZmluZSBFQ0NfQ0VBRERSMV9CTktOUl9NQVNLCTB4NzAwMDAKPiArI2RlZmluZSBFQ0Nf Q0VBRERSMV9CTEtOUl9NQVNLCTB4RkZGCj4gKyNkZWZpbmUgRUNDX0NFQUREUjFfQk5LR1JQX1NI SUZUCTI0Cj4gKyNkZWZpbmUgRUNDX0NFQUREUjFfQk5LTlJfU0hJRlQJMTYKPiArCj4gKy8qIEVD QyBQb2lzb24gcmVnaXN0ZXIgc2hpZnRzICovCj4gKyNkZWZpbmUgRUNDX1BPSVNPTjBfUkFOS19T SElGVCAyNAo+ICsjZGVmaW5lIEVDQ19QT0lTT04xX0JBTktHUlBfU0hJRlQgMjgKPiArI2RlZmlu ZSBFQ0NfUE9JU09OMV9CQU5LTlJfU0hJRlQgMjQKPiArCj4gKy8qIEREUiBNZW1vcnkgdHlwZSBk ZWZpbmVzICovCj4gKyNkZWZpbmUgTUVNX1RZUEVfRERSMwkJMHgxCj4gKyNkZWZpbmUgTUVNX1RZ UEVfTFBERFIzCQkweDgKPiArI2RlZmluZSBNRU1fVFlQRV9ERFIyCQkweDQKPiArI2RlZmluZSBN RU1fVFlQRV9ERFI0CQkweDEwCj4gKyNkZWZpbmUgTUVNX1RZUEVfTFBERFI0CQkweDIwCj4gKwo+ ICsvKiBERFJDIFNvZnR3YXJlIGNvbnRyb2wgcmVnaXN0ZXIgKi8KPiArI2RlZmluZSBERFJDX1NX Q1RMIDB4MzIwCj4gKwo+ICsvKiBERFJDIEVDQyBDRSAmIFVFIHBvaXNvbiBtYXNrICovCj4gKyNk ZWZpbmUgRUNDX0NFUE9JU09OX01BU0sgMHgzCj4gKyNkZWZpbmUgRUNDX1VFUE9JU09OX01BU0sg MHgxCj4gKwo+ICsvKiBERFJDIERldmljZSBjb25maWcgbWFza3MgKi8KPiArI2RlZmluZSBERFJD X01TVFJfREVWX0NPTkZJR19NQVNLIDB4QzAwMDAwMDAKPiArI2RlZmluZSBERFJDX01TVFJfREVW X0NPTkZJR19TSElGVAkzMAo+ICsjZGVmaW5lIEREUkNfTVNUUl9ERVZfQ09ORklHX1g0X01BU0sJ MHgwCj4gKyNkZWZpbmUgRERSQ19NU1RSX0RFVl9DT05GSUdfWDhfTUFTSwkweDEKPiArI2RlZmlu ZSBERFJDX01TVFJfREVWX0NPTkZJR19YMTZfTUFTSwkweDIKPiArI2RlZmluZSBERFJDX01TVFJf REVWX0NPTkZJR19YMzJfTUFTSwkweDMKClRob3NlIGFyZSB0b28gbG9uZyBhbmQgdGh1cyB2aW9s YXRlIHRoZSB2ZXJ0aWNhbCBhbGlnbm1lbnQgLSBzbyB5b3UgY2FuIHNob3J0ZW4KdGhlbSBieSBk b2luZywgZm9yIGV4YW1wbGUsIHMvQ09ORklHX01BU0svQ0ZHX01TSy8KCj4gKwo+ICsjZGVmaW5l IEREUl9NQVhfUk9XX1NISUZUCTE4Cj4gKyNkZWZpbmUgRERSX01BWF9DT0xfU0hJRlQJMTQKPiAr I2RlZmluZSBERFJfTUFYX0JBTktfU0hJRlQJMwo+ICsjZGVmaW5lIEREUl9NQVhfQkFOS0dSUF9T SElGVAkyCj4gKwo+ICsjZGVmaW5lIFJPV19NQVhfVkFMX01BU0sJMHhGCj4gKyNkZWZpbmUgQ09M X01BWF9WQUxfTUFTSwkweEYKPiArI2RlZmluZSBCQU5LX01BWF9WQUxfTUFTSwkweDFGCj4gKyNk ZWZpbmUgQkFOS0dSUF9NQVhfVkFMX01BU0sJMHgxRgo+ICsjZGVmaW5lIFJBTktfTUFYX1ZBTF9N QVNLCTB4MUYKPiArCj4gKyNkZWZpbmUgUk9XX0IwX0JBU0UJCTYKPiArI2RlZmluZSBST1dfQjFf QkFTRQkJNwo+ICsjZGVmaW5lIFJPV19CMl9CQVNFCQk4Cj4gKyNkZWZpbmUgUk9XX0IzX0JBU0UJ CTkKPiArI2RlZmluZSBST1dfQjRfQkFTRQkJMTAKPiArI2RlZmluZSBST1dfQjVfQkFTRQkJMTEK PiArI2RlZmluZSBST1dfQjZfQkFTRQkJMTIKPiArI2RlZmluZSBST1dfQjdfQkFTRQkJMTMKPiAr I2RlZmluZSBST1dfQjhfQkFTRQkJMTQKPiArI2RlZmluZSBST1dfQjlfQkFTRQkJMTUKPiArI2Rl ZmluZSBST1dfQjEwX0JBU0UJCTE2Cj4gKyNkZWZpbmUgUk9XX0IxMV9CQVNFCQkxNwo+ICsjZGVm aW5lIFJPV19CMTJfQkFTRQkJMTgKPiArI2RlZmluZSBST1dfQjEzX0JBU0UJCTE5Cj4gKyNkZWZp bmUgUk9XX0IxNF9CQVNFCQkyMAo+ICsjZGVmaW5lIFJPV19CMTVfQkFTRQkJMjEKPiArI2RlZmlu ZSBST1dfQjE2X0JBU0UJCTIyCj4gKyNkZWZpbmUgUk9XX0IxN19CQVNFCQkyMwo+ICsKPiArI2Rl ZmluZSBDT0xfQjJfQkFTRQkJMgo+ICsjZGVmaW5lIENPTF9CM19CQVNFCQkzCj4gKyNkZWZpbmUg Q09MX0I0X0JBU0UJCTQKPiArI2RlZmluZSBDT0xfQjVfQkFTRQkJNQo+ICsjZGVmaW5lIENPTF9C Nl9CQVNFCQk2Cj4gKyNkZWZpbmUgQ09MX0I3X0JBU0UJCTcKPiArI2RlZmluZSBDT0xfQjhfQkFT RQkJOAo+ICsjZGVmaW5lIENPTF9COV9CQVNFCQk5Cj4gKyNkZWZpbmUgQ09MX0IxMF9CQVNFCQkx MAo+ICsjZGVmaW5lIENPTF9CMTFfQkFTRQkJMTEKPiArI2RlZmluZSBDT0xfQjEyX0JBU0UJCTEy Cj4gKyNkZWZpbmUgQ09MX0IxM19CQVNFCQkxMwo+ICsKPiArI2RlZmluZSBCQU5LX0IwX0JBU0UJ CTIKPiArI2RlZmluZSBCQU5LX0IxX0JBU0UJCTMKPiArI2RlZmluZSBCQU5LX0IyX0JBU0UJCTQK PiArCj4gKyNkZWZpbmUgQkFOS0dSUF9CMF9CQVNFCQkyCj4gKyNkZWZpbmUgQkFOS0dSUF9CMV9C QVNFCQkzCj4gKwo+ICsjZGVmaW5lIFJBTktfQjBfQkFTRQkJNgo+ICsKPiAgLyoqCj4gICAqIHN0 cnVjdCBlY2NfZXJyb3JfaW5mbyAtIEVDQyBlcnJvciBsb2cgaW5mb3JtYXRpb24KPiAgICogQHJv dzoJUm93IG51bWJlcgo+IEBAIC0xMDMsNiArMjY4LDggQEAKPiAgICogQGJhbms6CUJhbmsgbnVt YmVyCj4gICAqIEBiaXRwb3M6CUJpdCBwb3NpdGlvbgo+ICAgKiBAZGF0YToJRGF0YSBjYXVzaW5n IHRoZSBlcnJvcgo+ICsgKiBAYmFua2dycG5yOglCYW5rIGdyb3VwIG51bWJlcgo+ICsgKiBAYmxr bnI6CUJsb2NrIG51bWJlcgo+ICAgKi8KPiAgc3RydWN0IGVjY19lcnJvcl9pbmZvIHsKPiAgCXUz MiByb3c7Cj4gQEAgLTExMCw2ICsyNzcsOCBAQCBzdHJ1Y3QgZWNjX2Vycm9yX2luZm8gewo+ICAJ dTMyIGJhbms7Cj4gIAl1MzIgYml0cG9zOwo+ICAJdTMyIGRhdGE7Cj4gKwl1MzIgYmFua2dycG5y Owo+ICsJdTMyIGJsa25yOwo+ICB9Owo+ICAKPiAgLyoqCj4gQEAgLTEyOCwxMiArMjk3LDE4IEBA IHN0cnVjdCBzeW5wc19lY2Nfc3RhdHVzIHsKPiAgCj4gIC8qKgo+ICAgKiBzdHJ1Y3Qgc3lucHNf ZWRhY19wcml2IC0gRERSIG1lbW9yeSBjb250cm9sbGVyIHByaXZhdGUgaW5zdGFuY2UgZGF0YQo+ IC0gKiBAYmFzZWFkZHI6CUJhc2UgYWRkcmVzcyBvZiB0aGUgRERSIGNvbnRyb2xsZXIKPiAtICog QG1lc3NhZ2U6CUJ1ZmZlciBmb3IgZnJhbWluZyB0aGUgZXZlbnQgc3BlY2lmaWMgaW5mbwo+IC0g KiBAc3RhdDoJRUNDIHN0YXR1cyBpbmZvcm1hdGlvbgo+IC0gKiBAcF9kYXRhOglQb2ludGVyIHRv IHBsYXRmb3JtIGRhdGEKPiAtICogQGNlX2NudDoJQ29ycmVjdGFibGUgRXJyb3IgY291bnQKPiAt ICogQHVlX2NudDoJVW5jb3JyZWN0YWJsZSBFcnJvciBjb3VudAo+ICsgKiBAYmFzZWFkZHI6CQlC YXNlIGFkZHJlc3Mgb2YgdGhlIEREUiBjb250cm9sbGVyCj4gKyAqIEBtZXNzYWdlOgkJQnVmZmVy IGZvciBmcmFtaW5nIHRoZSBldmVudCBzcGVjaWZpYyBpbmZvCj4gKyAqIEBzdGF0OgkJRUNDIHN0 YXR1cyBpbmZvcm1hdGlvbgo+ICsgKiBAcF9kYXRhOgkJUG9pbnRlciB0byBwbGF0Zm9ybSBkYXRh Cj4gKyAqIEBjZV9jbnQ6CQlDb3JyZWN0YWJsZSBFcnJvciBjb3VudAo+ICsgKiBAdWVfY250OgkJ VW5jb3JyZWN0YWJsZSBFcnJvciBjb3VudAo+ICsgKiBAcG9pc29uX2FkZHI6CURhdGEgcG9pc29u IGFkZHJlc3MKPiArICogQHJvd19zaGlmdDoJCVZhbHVlIG9mIHJvdyBzaGlmdHMKPiArICogQGNv bF9zaGlmdDoJCVZhbHVlIG9mIGNvbCBzaGlmdHMKPiArICogQGJhbmtfc2hpZnQ6CQlWYWx1ZSBv ZiBiYW5rIHNoaWZ0cwo+ICsgKiBAYmFua2dycF9zaGlmdDoJVmFsdWUgb2YgYmFuayBncm91cCBz aGlmdHMKPiArICogQHJhbmtfc2hpZnQ6CQlWYWx1ZSBvZiByYW5rIHNoaWZ0cwoKV2Uga25vdyBp dCBpcyBhIHZhbHVlIC0gZXhwbGFpbmluZyB3aGF0IHRob3NlIHNoaWZ0cyBhcmUgd291bGQgYmUg bXVjaAptb3JlIGhlbHBmdWwuCgo+ICAgKi8KPiAgc3RydWN0IHN5bnBzX2VkYWNfcHJpdiB7Cj4g IAl2b2lkIF9faW9tZW0gKmJhc2VhZGRyOwo+IEBAIC0xNDIsNiArMzE3LDEyIEBAIHN0cnVjdCBz eW5wc19lZGFjX3ByaXYgewo+ICAJY29uc3Qgc3RydWN0IHN5bnBzX3BsYXRmb3JtX2RhdGEgKnBf ZGF0YTsKPiAgCXUzMiBjZV9jbnQ7Cj4gIAl1MzIgdWVfY250Owo+ICsJdWxvbmcgcG9pc29uX2Fk ZHI7Cj4gKwl1MzIgcm93X3NoaWZ0WzE4XTsKPiArCXUzMiBjb2xfc2hpZnRbMTRdOwo+ICsJdTMy IGJhbmtfc2hpZnRbM107Cj4gKwl1MzIgYmFua2dycF9zaGlmdFsyXTsKPiArCXUzMiByYW5rX3No aWZ0WzFdOwo+ICB9Owo+ICAKPiAgLyoqCj4gQEAgLTE2Niw3ICszNDcsNyBAQCBzdHJ1Y3Qgc3lu cHNfcGxhdGZvcm1fZGF0YSB7Cj4gICAqCj4gICAqIERldGVybWluZXMgdGhlcmUgaXMgYW55IGVj YyBlcnJvciBvciBub3QKPiAgICoKPiAtICogUmV0dXJuOiBvbmUgaWYgdGhlcmUgaXMgbm8gZXJy b3Igb3RoZXJ3aXNlIHJldHVybnMgemVybwo+ICsgKiBSZXR1cm46IDEgaWYgdGhlcmUgaXMgbm8g ZXJyb3Igb3RoZXJ3aXNlIHJldHVybnMgMAo+ICAgKi8KPiAgc3RhdGljIGludCBzeW5wc19lZGFj X2dldGVycm9yX2luZm8oc3RydWN0IHN5bnBzX2VkYWNfcHJpdiAqcHJpdikKPiAgewo+IEBAIC0y MjEsNiArNDAyLDcyIEBAIHN0YXRpYyBpbnQgc3lucHNfZWRhY19nZXRlcnJvcl9pbmZvKHN0cnVj dCBzeW5wc19lZGFjX3ByaXYgKnByaXYpCj4gIH0KPiAgCj4gIC8qKgo+ICsgKiBzeW5wc19lbmhf ZWRhY19nZXRlcnJvcl9pbmZvIC0gR2V0IHRoZSBjdXJyZW50IGVjYyBlcnJvciBpbmZvCj4gKyAq IEBiYXNlOglQb2ludGVyIHRvIHRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIGRkciBtZW1vcnkgY29u dHJvbGxlcgo+ICsgKiBAcDoJCVBvaW50ZXIgdG8gdGhlIHN5bm9wc3lzIGVjYyBzdGF0dXMgc3Ry dWN0dXJlCj4gKyAqCj4gKyAqIERldGVybWluZXMgdGhlcmUgaXMgYW55IGVjYyBlcnJvciBvciBu b3QKPiArICoKPiArICogUmV0dXJuOiBvbmUgaWYgdGhlcmUgaXMgbm8gZXJyb3Igb3RoZXJ3aXNl IHJldHVybnMgemVybwo+ICsgKi8KClRoYXQncyBvbmUgc2xvcHB5IGNvbW1lbnQgLSB0aGUgZnVu Y3Rpb24gYXJndW1lbnRzIGFyZSB3cm9uZyBhbmQgdGhlCmRlc2NyaXB0aW9uIHRleHQgbmVlZHMg dG8gaGF2ZSBjb3JyZWN0IGVuZ2xpc2ggc2VudGVuY2VzIGVuZGluZyB3aXRoIGEKZnVsbHN0b3Au Cgo+ICtzdGF0aWMgaW50IHN5bnBzX2VuaF9lZGFjX2dldGVycm9yX2luZm8oc3RydWN0IHN5bnBz X2VkYWNfcHJpdiAqcHJpdikKCldoYXQgaXMgdGhhdCBwcmVmaXggInN5bnBzX2VuaF9lZGFjIiBl dmVuIHN1cHBvc2VkIHRvIG1lYW4/IEVzcGVjaWFsbHkKc2luY2UgdGhpcyBpcyBhIHN0YXRpYyBm dW5jdGlvbiB3aGljaCBkb2Vzbid0IG5lZWQgYW55IHByZWZpeGluZy4uLgpDaGVjayB5b3VyIG90 aGVyIGZ1bmN0aW9ucyB0b28uCgo+ICt7Cj4gKwl2b2lkIF9faW9tZW0gKmJhc2U7Cj4gKwlzdHJ1 Y3Qgc3lucHNfZWNjX3N0YXR1cyAqcDsKPiArCXUzMiByZWd2YWwsIGNsZWFydmFsID0gMDsKPiAr Cj4gKwlpZiAoIXByaXYpCj4gKwkJcmV0dXJuIDE7Cj4gKwo+ICsJYmFzZSA9IHByaXYtPmJhc2Vh ZGRyOwo+ICsJcCA9ICZwcml2LT5zdGF0Owo+ICsKPiArCXJlZ3ZhbCA9IHJlYWRsKGJhc2UgKyBF Q0NfU1RBVF9PRlNUKTsKPiArCWlmICghcmVndmFsKQo+ICsJCXJldHVybiAxOwo+ICsKPiArCXAt PmNlX2NudCA9IChyZWd2YWwgJiBFQ0NfU1RBVF9DRUNOVF9NQVNLKSA+PiBFQ0NfU1RBVF9DRUNO VF9TSElGVDsKPiArCXAtPnVlX2NudCA9IChyZWd2YWwgJiBFQ0NfU1RBVF9VRUNOVF9NQVNLKSA+ PiBFQ0NfU1RBVF9VRUNOVF9TSElGVDsKPiArCXAtPmNlaW5mby5iaXRwb3MgPSAocmVndmFsICYg RUNDX1NUQVRfQklUTlVNX01BU0spOwo+ICsKPiArCXJlZ3ZhbCA9IHJlYWRsKGJhc2UgKyBFQ0Nf Q0VBRERSMF9PRlNUKTsKPiArCWlmICghKHAtPmNlX2NudCkpCj4gKwkJZ290byB1ZV9lcnI7Cj4g Kwo+ICsJcC0+Y2VpbmZvLnJvdyA9IChyZWd2YWwgJiBFQ0NfQ0VBRERSMF9SV19NQVNLKTsKPiAr CXJlZ3ZhbCA9IHJlYWRsKGJhc2UgKyBFQ0NfQ0VBRERSMV9PRlNUKTsKPiArCXAtPmNlaW5mby5i YW5rID0gKHJlZ3ZhbCAmIEVDQ19DRUFERFIxX0JOS05SX01BU0spID4+Cj4gKwkJCQkJRUNDX0NF QUREUjFfQk5LTlJfU0hJRlQ7Cj4gKwlwLT5jZWluZm8uYmFua2dycG5yID0gKHJlZ3ZhbCAmCUVD Q19DRUFERFIxX0JOS0dSUF9NQVNLKSA+Pgo+ICsJCQkJCUVDQ19DRUFERFIxX0JOS0dSUF9TSElG VDsKPiArCXAtPmNlaW5mby5ibGtuciA9IChyZWd2YWwgJiBFQ0NfQ0VBRERSMV9CTEtOUl9NQVNL KTsKPiArCXAtPmNlaW5mby5kYXRhID0gcmVhZGwoYmFzZSArIEVDQ19DU1lORDBfT0ZTVCk7Cj4g KwllZGFjX2RiZygzLCAiY2UgYml0IHBvc2l0aW9uOiAlZCBkYXRhOiAlZFxuIiwgcC0+Y2VpbmZv LmJpdHBvcywKPiArCQkgcC0+Y2VpbmZvLmRhdGEpOwo+ICsKPiArdWVfZXJyOgo+ICsJcmVndmFs ID0gcmVhZGwoYmFzZSArIEVDQ19VRUFERFIwX09GU1QpOwo+ICsJaWYgKCEocC0+dWVfY250KSkK PiArCQlnb3RvIG91dDsKPiArCj4gKwlwLT51ZWluZm8ucm93ID0gKHJlZ3ZhbCAmIEVDQ19DRUFE RFIwX1JXX01BU0spOwo+ICsJcmVndmFsID0gcmVhZGwoYmFzZSArIEVDQ19VRUFERFIxX09GU1Qp Owo+ICsJcC0+dWVpbmZvLmJhbmtncnBuciA9IChyZWd2YWwgJiBFQ0NfQ0VBRERSMV9CTktHUlBf TUFTSykgPj4KPiArCQkJCQlFQ0NfQ0VBRERSMV9CTktHUlBfU0hJRlQ7Cj4gKwlwLT51ZWluZm8u YmFuayA9IChyZWd2YWwgJiBFQ0NfQ0VBRERSMV9CTktOUl9NQVNLKSA+Pgo+ICsJCQkJCUVDQ19D RUFERFIxX0JOS05SX1NISUZUOwo+ICsJcC0+dWVpbmZvLmJsa25yID0gKHJlZ3ZhbCAmIEVDQ19D RUFERFIxX0JMS05SX01BU0spOwo+ICsJcC0+dWVpbmZvLmRhdGEgPSByZWFkbChiYXNlICsgRUND X1VFU1lORDBfT0ZTVCk7Cj4gK291dDoKPiArCWNsZWFydmFsID0gRUNDX0NUUkxfQ0xSX0NFX0VS UiB8IEVDQ19DVFJMX0NMUl9DRV9FUlJDTlQ7Cj4gKwljbGVhcnZhbCB8PSBFQ0NfQ1RSTF9DTFJf VUVfRVJSIHwgRUNDX0NUUkxfQ0xSX1VFX0VSUkNOVDsKPiArCXdyaXRlbChjbGVhcnZhbCwgYmFz ZSArIEVDQ19DTFJfT0ZTVCk7Cj4gKwl3cml0ZWwoMHgwLCBiYXNlICsgRUNDX0NMUl9PRlNUKTsK PiArCj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiArLyoqCj4gICAqIHN5bnBzX2VkYWNfaGFuZGxl X2Vycm9yIC0gSGFuZGxlIGNvbnRyb2xsZXIgZXJyb3IgdHlwZXMgQ0UgYW5kIFVFCj4gICAqIEBt Y2k6CVBvaW50ZXIgdG8gdGhlIGVkYWMgbWVtb3J5IGNvbnRyb2xsZXIgaW5zdGFuY2UKPiAgICog QHA6CQlQb2ludGVyIHRvIHRoZSBzeW5vcHN5cyBlY2Mgc3RhdHVzIHN0cnVjdHVyZQo+IEBAIC0y MzUsOSArNDgyLDE3IEBAIHN0YXRpYyB2b2lkIHN5bnBzX2VkYWNfaGFuZGxlX2Vycm9yKHN0cnVj dCBtZW1fY3RsX2luZm8gKm1jaSwKPiAgCj4gIAlpZiAocC0+Y2VfY250KSB7Cj4gIAkJcGluZiA9 ICZwLT5jZWluZm87Cj4gLQkJc25wcmludGYocHJpdi0+bWVzc2FnZSwgU1lOUFNfRURBQ19NU0df U0laRSwKPiAtCQkJICJERFIgRUNDIGVycm9yIHR5cGUgOiVzIFJvdyAlZCBCYW5rICVkIENvbCAl ZCAiLAo+IC0JCQkgIkNFIiwgcGluZi0+cm93LCBwaW5mLT5iYW5rLCBwaW5mLT5jb2wpOwo+ICsJ CWlmIChwcml2LT5wX2RhdGEtPnF1aXJrcyA9PSAwKQoKCQlpZiAoIS4uLgoKPiArCQkJc25wcmlu dGYocHJpdi0+bWVzc2FnZSwgU1lOUFNfRURBQ19NU0dfU0laRSwKPiArCQkJCSAiRERSIEVDQyBl cnJvciB0eXBlIDolcyBSb3cgJWQgQmFuayAlZCBDb2wgJWQgIiwKPiArCQkJCSAiQ0UiLCBwaW5m LT5yb3csIHBpbmYtPmJhbmssIHBpbmYtPmNvbCk7Cj4gKwkJZWxzZQo+ICsJCQlzbnByaW50Zihw cml2LT5tZXNzYWdlLCBTWU5QU19FREFDX01TR19TSVpFLAo+ICsJCQkJICJERFIgRUNDIGVycm9y IHR5cGUgOiVzIFJvdyAlZCBCYW5rICVkIENvbCAlZCAiCj4gKwkJCQkgIkJhbmtHcm91cCBOdW1i ZXIgJWQgQmxvY2sgTnVtYmVyICVkIiwKPiArCQkJCSAiQ0UiLCBwaW5mLT5yb3csIHBpbmYtPmJh bmssIHBpbmYtPmNvbCwKPiArCQkJCSBwaW5mLT5iYW5rZ3JwbnIsIHBpbmYtPmJsa25yKTsKPiAr CgpQbHMgaW50ZWdyYXRlIGNoZWNrcGF0Y2gucGwgaW50byB5b3VyIHBhdGNoIGNyZWF0aW9uIHdv cmtmbG93IC0gc29tZSBvZgp0aGUgd2FybmluZ3MgZG8gbWFrZSBzZW5zZToKCldBUk5JTkc6IHF1 b3RlZCBzdHJpbmcgc3BsaXQgYWNyb3NzIGxpbmVzCiMzODA6IEZJTEU6IGRyaXZlcnMvZWRhYy9z eW5vcHN5c19lZGFjLmM6NDkyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRERS IEVDQyBlcnJvciB0eXBlIDolcyBSb3cgJWQgQmFuayAlZCBDb2wgJWQgIgorICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAiQmFua0dyb3VwIE51bWJlciAlZCBCbG9jayBOdW1iZXIgJWQi LAoKV0FSTklORzogcXVvdGVkIHN0cmluZyBzcGxpdCBhY3Jvc3MgbGluZXMKIzQwMTogRklMRTog ZHJpdmVycy9lZGFjL3N5bm9wc3lzX2VkYWMuYzo1MTA6CisgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICJERFIgRUNDIGVycm9yIHR5cGUgOiVzIFJvdyAlZCBCYW5rICVkIENvbCAlZCAi CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCYW5rR3JvdXAgTnVtYmVyICVkIEJs b2NrIE51bWJlciAlZCIsCgp0b3RhbDogMCBlcnJvcnMsIDIgd2FybmluZ3MsIDEwMDUgbGluZXMg Y2hlY2tlZAoKCj4gIAkJZWRhY19tY19oYW5kbGVfZXJyb3IoSFdfRVZFTlRfRVJSX0NPUlJFQ1RF RCwgbWNpLAo+ICAJCQkJICAgICBwLT5jZV9jbnQsIDAsIDAsIDAsIDAsIDAsIC0xLAo+ICAJCQkJ ICAgICBwcml2LT5tZXNzYWdlLCAiIik7Cj4gQEAgLTI0NSw5ICs1MDAsMTcgQEAgc3RhdGljIHZv aWQgc3lucHNfZWRhY19oYW5kbGVfZXJyb3Ioc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpLAo+ICAK PiAgCWlmIChwLT51ZV9jbnQpIHsKPiAgCQlwaW5mID0gJnAtPnVlaW5mbzsKPiAtCQlzbnByaW50 Zihwcml2LT5tZXNzYWdlLCBTWU5QU19FREFDX01TR19TSVpFLAo+IC0JCQkgIkREUiBFQ0MgZXJy b3IgdHlwZSA6JXMgUm93ICVkIEJhbmsgJWQgQ29sICVkICIsCj4gLQkJCSAiVUUiLCBwaW5mLT5y b3csIHBpbmYtPmJhbmssIHBpbmYtPmNvbCk7Cj4gKwkJaWYgKHByaXYtPnBfZGF0YS0+cXVpcmtz ID09IDApCgoJCWlmICghLi4uCgo+ICsJCQlzbnByaW50Zihwcml2LT5tZXNzYWdlLCBTWU5QU19F REFDX01TR19TSVpFLAo+ICsJCQkJICJERFIgRUNDIGVycm9yIHR5cGUgOiVzIFJvdyAlZCBCYW5r ICVkIENvbCAlZCAiLAo+ICsJCQkJIlVFIiwgcGluZi0+cm93LCBwaW5mLT5iYW5rLCBwaW5mLT5j b2wpOwo+ICsJCWVsc2UKPiArCQkJc25wcmludGYocHJpdi0+bWVzc2FnZSwgU1lOUFNfRURBQ19N U0dfU0laRSwKPiArCQkJCSAiRERSIEVDQyBlcnJvciB0eXBlIDolcyBSb3cgJWQgQmFuayAlZCBD b2wgJWQgIgo+ICsJCQkJICJCYW5rR3JvdXAgTnVtYmVyICVkIEJsb2NrIE51bWJlciAlZCIsCj4g KwkJCQkgIlVFIiwgcGluZi0+cm93LCBwaW5mLT5iYW5rLCBwaW5mLT5jb2wsCj4gKwkJCQkgcGlu Zi0+YmFua2dycG5yLCBwaW5mLT5ibGtucik7Cj4gKwo+ICAJCWVkYWNfbWNfaGFuZGxlX2Vycm9y KEhXX0VWRU5UX0VSUl9VTkNPUlJFQ1RFRCwgbWNpLAo+ICAJCQkJICAgICBwLT51ZV9jbnQsIDAs IDAsIDAsIDAsIDAsIC0xLAo+ICAJCQkJICAgICBwcml2LT5tZXNzYWdlLCAiIik7Cj4gQEAgLTI1 Nyw2ICs1MjAsNDEgQEAgc3RhdGljIHZvaWQgc3lucHNfZWRhY19oYW5kbGVfZXJyb3Ioc3RydWN0 IG1lbV9jdGxfaW5mbyAqbWNpLAo+ICB9Cj4gIAo+ICAvKioKPiArICogc3lucHNfZWRhY19pbnRy X2hhbmRsZXIgLSBzeW5wcyBlZGFjIGlzcgoKRWl0aGVyIGV4cGxhaW4gaW4gcGxhaW4gZW5nbGlz aCB3aGF0IHRoaXMgaXMgb3IgZG9uJ3Qgd3JpdGUgYSBjb21tZW50IGF0CmFsbC4gImlzciIgaXMg bm90IGhlbHBpbmcuCgpBbHNvLCBpdCBpcyBFREFDIGFuZCBub3QgImVkYWMiIC0gY2hlY2sgeW91 ciB3aG9sZSBwYXRjaCBmb3IgbG93ZXJjYXNlZAphYmJyZXZpYXRpb25zIGxpa2UgImRkciIsICJl Y2MiLCAuLi4sIGFuZCBjb3JyZWN0IHRoZW0uCgo+ICsgKiBAaXJxOiAgICAgICAgaXJxIG51bWJl cgo+ICsgKiBAZGV2X2lkOiAgICAgZGV2aWNlIGlkIHBvbml0ZXIKCkFsc28sIGNoZWNrIHlvdXIg cGF0Y2ggZm9yIHNwZWxsaW5nIGVycm9yczogInBvbml0ZXIiIGlzIHNvbWUgbmV3IHR5cGUKb2Yg cG9ueSBvcj8KCjopCgo+ICsgKgo+ICsgKiBUaGlzIGlzIHRoZSBJc3Igcm91dGluZSBjYWxsZWQg YnkgZWRhYyBjb3JlIGludGVycnVwdCB0aHJlYWQuCj4gKyAqIFVzZWQgdG8gY2hlY2sgYW5kIHBv c3QgRUNDIGVycm9ycy4KPiArICoKPiArICogUmV0dXJuOiBJUlFfTk9ORSwgaWYgaW50ZXJydXB0 IG5vdCBzZXQgb3IgSVJRX0hBTkRMRUQgb3RoZXJ3aXNlCgpBbGwgdGhvc2Ugc2VudGVuY2VzIG5l ZWQgdG8gZW5kIHdpdGggYSBmdWxsc3RvcC4gQ2hlY2sgeW91ciB3aG9sZSBwYXRjaC4KCj4gKyAq Lwo+ICtzdGF0aWMgaXJxcmV0dXJuX3Qgc3lucHNfZWRhY19pbnRyX2hhbmRsZXIoaW50IGlycSwg dm9pZCAqZGV2X2lkKQo+ICt7Cj4gKwlzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2kgPSBkZXZfaWQ7 Cj4gKwlzdHJ1Y3Qgc3lucHNfZWRhY19wcml2ICpwcml2ID0gbWNpLT5wdnRfaW5mbzsKPiArCWNv bnN0IHN0cnVjdCBzeW5wc19wbGF0Zm9ybV9kYXRhICpwX2RhdGEgPSBwcml2LT5wX2RhdGE7Cj4g KwlpbnQgc3RhdHVzLCByZWd2YWw7Cj4gKwo+ICsJcmVndmFsID0gcmVhZGwocHJpdi0+YmFzZWFk ZHIgKyBERFJfUU9TX0lSUV9TVEFUX09GU1QpICYKPiArCQkJKEREUl9RT1NDRV9NQVNLIHwgRERS X1FPU1VFX01BU0spOwoKRG8gdGhlICYgaW4gYSBzZWNvbmQgbGluZToKCglyZWd2YWwgJj0gLi4u Cgpmb3IgYmV0dGVyIHJlYWRhYmlsaXR5LgoKPiArCWlmICghKHJlZ3ZhbCAmIEVDQ19DRV9VRV9J TlRSX01BU0spKQo+ICsJCXJldHVybiBJUlFfTk9ORTsKCjwtLS0tLSBuZXdsaW5lIGhlcmUuCgo+ ICsJc3RhdHVzID0gcF9kYXRhLT5lZGFjX2dldGVycm9yX2luZm8ocHJpdik7Cj4gKwlpZiAoc3Rh dHVzKQo+ICsJCXJldHVybiBJUlFfTk9ORTsKPiArCj4gKwlwcml2LT5jZV9jbnQgKz0gcHJpdi0+ c3RhdC5jZV9jbnQ7Cj4gKwlwcml2LT51ZV9jbnQgKz0gcHJpdi0+c3RhdC51ZV9jbnQ7Cj4gKwlz eW5wc19lZGFjX2hhbmRsZV9lcnJvcihtY2ksICZwcml2LT5zdGF0KTsKPiArCj4gKwllZGFjX2Ri ZygzLCAiVG90YWwgZXJyb3IgY291bnQgY2UgJWQgdWUgJWRcbiIsCj4gKwkJIHByaXYtPmNlX2Nu dCwgcHJpdi0+dWVfY250KTsKPiArCXdyaXRlbChyZWd2YWwsIHByaXYtPmJhc2VhZGRyICsgRERS X1FPU19JUlFfU1RBVF9PRlNUKTsKPiArCXJldHVybiBJUlFfSEFORExFRDsKPiArfQo+ICsKPiAr LyoqCj4gICAqIHN5bnBzX2VkYWNfY2hlY2sgLSBDaGVjayBjb250cm9sbGVyIGZvciBFQ0MgZXJy b3JzCj4gICAqIEBtY2k6CVBvaW50ZXIgdG8gdGhlIGVkYWMgbWVtb3J5IGNvbnRyb2xsZXIgaW5z dGFuY2UKPiAgICoKPiBAQCAtMzEyLDYgKzYxMCw0MCBAQCBzdGF0aWMgZW51bSBkZXZfdHlwZSBz eW5wc19lZGFjX2dldF9kdHlwZShjb25zdCB2b2lkIF9faW9tZW0gKmJhc2UpCj4gIH0KPiAgCj4g IC8qKgo+ICsgKiBzeW5wc19lbmhfZWRhY19nZXRfZHR5cGUgLSBSZXR1cm4gdGhlIGNvbnRyb2xs ZXIgbWVtb3J5IHdpZHRoCj4gKyAqIEBiYXNlOglQb2ludGVyIHRvIHRoZSBkZHIgbWVtb3J5IGNv bnRyb2xsZXIgYmFzZSBhZGRyZXNzCj4gKyAqCj4gKyAqIEdldCB0aGUgRURBQyBkZXZpY2UgdHlw ZSB3aWR0aCBhcHByb3ByaWF0ZSBmb3IgdGhlIGN1cnJlbnQgY29udHJvbGxlcgo+ICsgKiBjb25m aWd1cmF0aW9uLgo+ICsgKgo+ICsgKiBSZXR1cm46IGEgZGV2aWNlIHR5cGUgd2lkdGggZW51bWVy YXRpb24uCj4gKyAqLwo+ICtzdGF0aWMgZW51bSBkZXZfdHlwZSBzeW5wc19lbmhfZWRhY19nZXRf ZHR5cGUoY29uc3Qgdm9pZCBfX2lvbWVtICpiYXNlKQo+ICt7Cj4gKwllbnVtIGRldl90eXBlIGR0 Owo+ICsJdTMyIHdpZHRoOwo+ICsKPiArCXdpZHRoID0gcmVhZGwoYmFzZSArIENUUkxfT0ZTVCk7 Cj4gKwl3aWR0aCA9ICh3aWR0aCAmIEVDQ19DVFJMX0JVU1dJRFRIX01BU0spID4+Cj4gKwkJRUND X0NUUkxfQlVTV0lEVEhfU0hJRlQ7CgpMZXQgaXQgc3RpY2sgb3V0IGluc3RlYWQgb2YgYnJlYWtp bmcgaXQgdGhpcyB3YXkuCgo+ICsJc3dpdGNoICh3aWR0aCkgewo+ICsJY2FzZSBERFJDVExfRVdE VEhfMTY6Cj4gKwkJZHQgPSBERVZfWDI7Cj4gKwkJYnJlYWs7Cj4gKwljYXNlIEREUkNUTF9FV0RU SF8zMjoKPiArCQlkdCA9IERFVl9YNDsKPiArCQlicmVhazsKPiArCWNhc2UgRERSQ1RMX0VXRFRI XzY0Ogo+ICsJCWR0ID0gREVWX1g4Owo+ICsJCWJyZWFrOwo+ICsJZGVmYXVsdDoKPiArCQlkdCA9 IERFVl9VTktOT1dOOwo+ICsJfQo+ICsKPiArCXJldHVybiBkdDsKPiArfQo+ICsKPiArLyoqCj4g ICAqIHN5bnBzX2VkYWNfZ2V0X2VjY3N0YXRlIC0gUmV0dXJuIHRoZSBjb250cm9sbGVyIGVjYyBl bmFibGUvZGlzYWJsZSBzdGF0dXMKPiAgICogQGJhc2U6CVBvaW50ZXIgdG8gdGhlIGRkciBtZW1v cnkgY29udHJvbGxlciBiYXNlIGFkZHJlc3MKPiAgICoKPiBAQCAtMzM3LDYgKzY2OSwzMiBAQCBz dGF0aWMgYm9vbCBzeW5wc19lZGFjX2dldF9lY2NzdGF0ZSh2b2lkIF9faW9tZW0gKmJhc2UpCj4g IH0KPiAgCj4gIC8qKgo+ICsgKiBzeW5wc19lbmhfZWRhY19nZXRfZWNjc3RhdGUgLSBSZXR1cm4g dGhlIGNvbnRyb2xsZXIgZWNjIGVuYWJsZS9kaXNhYmxlIHN0YXR1cwo+ICsgKiBAYmFzZToJUG9p bnRlciB0byB0aGUgZGRyIG1lbW9yeSBjb250cm9sbGVyIGJhc2UgYWRkcmVzcwo+ICsgKgo+ICsg KiBHZXQgdGhlIEVDQyBlbmFibGUvZGlzYWJsZSBzdGF0dXMgZm9yIHRoZSBjb250cm9sbGVyCj4g KyAqCj4gKyAqIFJldHVybjogYSBlY2Mgc3RhdHVzIGJvb2xlYW4gaS5lIHRydWUvZmFsc2UgLSBl bmFibGVkL2Rpc2FibGVkLgo+ICsgKi8KPiArc3RhdGljIGJvb2wgc3lucHNfZW5oX2VkYWNfZ2V0 X2VjY3N0YXRlKHZvaWQgX19pb21lbSAqYmFzZSkKPiArewo+ICsJZW51bSBkZXZfdHlwZSBkdDsK PiArCXUzMiBlY2N0eXBlOwo+ICsJYm9vbCBzdGF0ZSA9IGZhbHNlOwoKWW91IGRvbid0IG5lZWQg c3RhdGUgYXQgYWxsLCBqdXN0IGRvLi4uCgo+ICsKPiArCWR0ID0gc3lucHNfZW5oX2VkYWNfZ2V0 X2R0eXBlKGJhc2UpOwo+ICsJaWYgKGR0ID09IERFVl9VTktOT1dOKQo+ICsJCXJldHVybiBzdGF0 ZTsKCgkJcmV0dXJuIGZhbHNlOwoKPiArCj4gKwllY2N0eXBlID0gcmVhZGwoYmFzZSArIEVDQ19D RkcwX09GU1QpICYgU0NSVUJfTU9ERV9NQVNLOwo+ICsJaWYgKChlY2N0eXBlID09IFNDUlVCX01P REVfU0VDREVEKSAmJgo+ICsJICAgICgoZHQgPT0gREVWX1gyKSB8fCAoZHQgPT0gREVWX1g0KSB8 fCAoZHQgPT0gREVWX1g4KSkpCj4gKwkJc3RhdGUgPSB0cnVlOwoKCQlyZXR1cm4gdHJ1ZTsKCj4g Kwo+ICsJcmV0dXJuIHN0YXRlOwoKCXJldHVybiBmYWxzZTsKCj4gK30KPiArCj4gKy8qKgo+ICAg KiBzeW5wc19lZGFjX2dldF9tZW1zaXplIC0gcmVhZHMgdGhlIHNpemUgb2YgdGhlIGF0dGFjaGVk IG1lbW9yeSBkZXZpY2UKPiAgICoKPiAgICogUmV0dXJuOiB0aGUgbWVtb3J5IHNpemUgaW4gYnl0 ZXMKPiBAQCAtMzc1LDYgKzczMywzNSBAQCBzdGF0aWMgZW51bSBtZW1fdHlwZSBzeW5wc19lZGFj X2dldF9tdHlwZShjb25zdCB2b2lkIF9faW9tZW0gKmJhc2UpCj4gIH0KPiAgCj4gIC8qKgo+ICsg KiBzeW5wc19lbmhfZWRhY19nZXRfbXR5cGUgLSBSZXR1cm5zIGNvbnRyb2xsZXIgbWVtb3J5IHR5 cGUKPiArICogQGJhc2U6CXBvaW50ZXIgdG8gdGhlIHN5bm9wc3lzIGVjYyBzdGF0dXMgc3RydWN0 dXJlCj4gKyAqCj4gKyAqIEdldCB0aGUgRURBQyBtZW1vcnkgdHlwZSBhcHByb3ByaWF0ZSBmb3Ig dGhlIGN1cnJlbnQgY29udHJvbGxlcgo+ICsgKiBjb25maWd1cmF0aW9uLgo+ICsgKgo+ICsgKiBS ZXR1cm46IGEgbWVtb3J5IHR5cGUgZW51bWVyYXRpb24uCj4gKyAqLwo+ICtzdGF0aWMgZW51bSBt ZW1fdHlwZSBzeW5wc19lbmhfZWRhY19nZXRfbXR5cGUoY29uc3Qgdm9pZCBfX2lvbWVtICpiYXNl KQo+ICt7Cj4gKwllbnVtIG1lbV90eXBlIG10Owo+ICsJdTMyIG1lbXR5cGU7Cj4gKwo+ICsJbWVt dHlwZSA9IHJlYWRsKGJhc2UgKyBDVFJMX09GU1QpOwo+ICsKPiArCW10ID0gTUVNX1VOS05PV047 CgpZb3UgZG9uJ3QgbmVlZCB0aGlzIGRlZmF1bHQgYXNzaWdubWVudC4uLgoKPiArCWlmICgobWVt dHlwZSAmIE1FTV9UWVBFX0REUjMpIHx8IChtZW10eXBlICYgTUVNX1RZUEVfTFBERFIzKSkKPiAr CQltdCA9IE1FTV9ERFIzOwo+ICsJZWxzZSBpZiAobWVtdHlwZSAmIE1FTV9UWVBFX0REUjIpCj4g KwkJbXQgPSBNRU1fUkREUjI7Cj4gKwllbHNlIGlmICgobWVtdHlwZSAmIE1FTV9UWVBFX0xQRERS NCkgfHwgKG1lbXR5cGUgJiBNRU1fVFlQRV9ERFI0KSkKPiArCQltdCA9IE1FTV9ERFI0Owo+ICsJ ZWxzZQo+ICsJCW10ID0gTUVNX0VNUFRZOwoKLi4uIGlmIHlvdSBkbyB0aGUgY2F0Y2gtYWxsIGhl cmUuCgo+ICsKPiArCXJldHVybiBtdDsKPiArfQo+ICsKPiArLyoqCj4gICAqIHN5bnBzX2VkYWNf aW5pdF9jc3Jvd3MgLSBJbml0aWFsaXplIHRoZSBjcyByb3cgZGF0YQo+ICAgKiBAbWNpOglQb2lu dGVyIHRvIHRoZSBlZGFjIG1lbW9yeSBjb250cm9sbGVyIGluc3RhbmNlCj4gICAqCj4gQEAgLTQ0 Miw4ICs4MjksMTMgQEAgc3RhdGljIGludCBzeW5wc19lZGFjX21jX2luaXQoc3RydWN0IG1lbV9j dGxfaW5mbyAqbWNpLAo+ICAJbWNpLT5kZXZfbmFtZSA9IFNZTlBTX0VEQUNfTU9EX1NUUklORzsK PiAgCW1jaS0+bW9kX25hbWUgPSBTWU5QU19FREFDX01PRF9WRVI7Cj4gIAo+IC0JZWRhY19vcF9z dGF0ZSA9IEVEQUNfT1BTVEFURV9QT0xMOwo+IC0JbWNpLT5lZGFjX2NoZWNrID0gc3lucHNfZWRh Y19jaGVjazsKPiArCWlmIChwcml2LT5wX2RhdGEtPnF1aXJrcyAmIEREUl9FQ0NfSU5UUl9TVVBQ T1JUKSB7Cj4gKwkJZWRhY19vcF9zdGF0ZSA9IEVEQUNfT1BTVEFURV9JTlQ7Cj4gKwl9IGVsc2Ug ewo+ICsJCWVkYWNfb3Bfc3RhdGUgPSBFREFDX09QU1RBVEVfUE9MTDsKPiArCQltY2ktPmVkYWNf Y2hlY2sgPSBzeW5wc19lZGFjX2NoZWNrOwo+ICsJfQo+ICsKPiAgCW1jaS0+Y3RsX3BhZ2VfdG9f cGh5cyA9IE5VTEw7Cj4gIAo+ICAJc3RhdHVzID0gc3lucHNfZWRhY19pbml0X2Nzcm93cyhtY2kp Owo+IEBAIC00NTksMTMgKzg1MSw0MDkgQEAgc3RhdGljIGNvbnN0IHN0cnVjdCBzeW5wc19wbGF0 Zm9ybV9kYXRhIHp5bnFfZWRhY19kZWYgPSB7Cj4gIAkucXVpcmtzCQkJPSAwLAo+ICB9Owo+ICAK PiArc3RhdGljIGNvbnN0IHN0cnVjdCBzeW5wc19wbGF0Zm9ybV9kYXRhIHp5bnFtcF9lbmhfZWRh Y19kZWYgPSB7Cj4gKwkuZWRhY19nZXRlcnJvcl9pbmZvCT0gc3lucHNfZW5oX2VkYWNfZ2V0ZXJy b3JfaW5mbywKPiArCS5lZGFjX2dldF9tdHlwZQkJPSBzeW5wc19lbmhfZWRhY19nZXRfbXR5cGUs Cj4gKwkuZWRhY19nZXRfZHR5cGUJCT0gc3lucHNfZW5oX2VkYWNfZ2V0X2R0eXBlLAo+ICsJLmVk YWNfZ2V0X2VjY3N0YXRlCT0gc3lucHNfZW5oX2VkYWNfZ2V0X2VjY3N0YXRlLAo+ICsJLnF1aXJr cwkJCT0gKEREUl9FQ0NfSU5UUl9TVVBQT1JUIHwKPiArCQkJCSAgIEREUl9FQ0NfREFUQV9QT0lT T05fU1VQUE9SVCksCj4gK307Cj4gKwo+ICBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9p ZCBzeW5wc19lZGFjX21hdGNoW10gPSB7Cj4gIAl7IC5jb21wYXRpYmxlID0gInhsbngsenlucS1k ZHJjLWEwNSIsIC5kYXRhID0gKHZvaWQgKikmenlucV9lZGFjX2RlZiB9LAo+ICsJeyAuY29tcGF0 aWJsZSA9ICJ4bG54LHp5bnFtcC1kZHJjLTIuNDBhIiwKPiArCQkJCS5kYXRhID0gKHZvaWQgKikm enlucW1wX2VuaF9lZGFjX2RlZn0sCgpBbGlnbiB0aG9zZSBzdHJ1Y3QgbWVtYmVycyB2ZXJ0aWNh bGx5IGxpa2UgdGhpczoKCnN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHN5bnBzX2Vk YWNfbWF0Y2hbXSA9IHsKICAgICAgICB7CiAgICAgICAgICAgICAgICAuY29tcGF0aWJsZSA9ICJ4 bG54LHp5bnEtZGRyYy1hMDUiLAogICAgICAgICAgICAgICAgLmRhdGEgPSAodm9pZCAqKSZ6eW5x X2VkYWNfZGVmCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICAgICAuY29tcGF0aWJs ZSA9ICJ4bG54LHp5bnFtcC1kZHJjLTIuNDBhIiwKICAgICAgICAgICAgICAgIC5kYXRhID0gKHZv aWQgKikmenlucW1wX2VuaF9lZGFjX2RlZgogICAgICAgIH0sCiAgICAgICAgeyAvKiBlbmQgb2Yg dGFibGUgKi8gfQp9OwoKPiAgTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgc3lucHNfZWRhY19tYXRj aCk7Cj4gIAo+ICsjZGVmaW5lIHRvX21jaShrKSBjb250YWluZXJfb2Yoaywgc3RydWN0IG1lbV9j dGxfaW5mbywgZGV2KQo+ICsKPiArLyoqCj4gKyAqIGRkcl9wb2lzb25fc2V0dXAgLQl1cGRhdGUg cG9pc29uIHJlZ2lzdGVycwo+ICsgKiBAcHJpdjoJCVBvaW50ZXIgdG8gc3lucHNfZWRhY19wcml2 IHN0cnVjdAo+ICsgKgo+ICsgKiBVcGRhdGUgcG9pc29uIHJlZ2lzdGVycyBhcyBwZXIgZGRyIG1h cHBpbmcKPiArICogUmV0dXJuOiBub25lLgo+ICsgKi8KPiArc3RhdGljIHZvaWQgZGRyX3BvaXNv bl9zZXR1cChzdHJ1Y3Qgc3lucHNfZWRhY19wcml2ICpwcml2KQo+ICt7Cj4gKwlpbnQgY29sID0g MCwgcm93ID0gMCwgYmFuayA9IDAsIGJhbmtncnAgPSAwLCByYW5rID0gMCwgcmVndmFsOwo+ICsJ aW50IGluZGV4Owo+ICsJdWxvbmcgaGlmX2FkZHIgPSAwOwo+ICsKPiArCWhpZl9hZGRyID0gcHJp di0+cG9pc29uX2FkZHIgPj4gMzsKPiArCj4gKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBERFJf TUFYX1JPV19TSElGVDsgaW5kZXgrKykgewo+ICsJCWlmIChwcml2LT5yb3dfc2hpZnRbaW5kZXhd KQo+ICsJCQlyb3cgfD0gKCgoaGlmX2FkZHIgPj4gcHJpdi0+cm93X3NoaWZ0W2luZGV4XSkgJgo+ ICsJCQkJCQlCSVQoMCkpIDw8IGluZGV4KTsKPiArCQllbHNlCj4gKwkJCWJyZWFrOwo+ICsJfQo+ ICsKPiArCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IEREUl9NQVhfQ09MX1NISUZUOyBpbmRleCsr KSB7Cj4gKwkJaWYgKHByaXYtPmNvbF9zaGlmdFtpbmRleF0gfHwgaW5kZXggPCAzKQo+ICsJCQlj b2wgfD0gKCgoaGlmX2FkZHIgPj4gcHJpdi0+Y29sX3NoaWZ0W2luZGV4XSkgJgo+ICsJCQkJCQlC SVQoMCkpIDw8IGluZGV4KTsKPiArCQllbHNlCj4gKwkJCWJyZWFrOwo+ICsJfQo+ICsKPiArCWZv ciAoaW5kZXggPSAwOyBpbmRleCA8IEREUl9NQVhfQkFOS19TSElGVDsgaW5kZXgrKykgewo+ICsJ CWlmIChwcml2LT5iYW5rX3NoaWZ0W2luZGV4XSkKPiArCQkJYmFuayB8PSAoKChoaWZfYWRkciA+ PiBwcml2LT5iYW5rX3NoaWZ0W2luZGV4XSkgJgo+ICsJCQkJCQlCSVQoMCkpIDw8IGluZGV4KTsK PiArCQllbHNlCj4gKwkJCWJyZWFrOwo+ICsJfQo+ICsKPiArCWZvciAoaW5kZXggPSAwOyBpbmRl eCA8IEREUl9NQVhfQkFOS0dSUF9TSElGVDsgaW5kZXgrKykgewo+ICsJCWlmIChwcml2LT5iYW5r Z3JwX3NoaWZ0W2luZGV4XSkKPiArCQkJYmFua2dycCB8PSAoKChoaWZfYWRkciA+PiBwcml2LT5i YW5rZ3JwX3NoaWZ0W2luZGV4XSkKPiArCQkJCQkJJiBCSVQoMCkpIDw8IGluZGV4KTsKPiArCQll bHNlCj4gKwkJCWJyZWFrOwo+ICsJfQo+ICsKPiArCWlmIChwcml2LT5yYW5rX3NoaWZ0WzBdKQo+ ICsJCXJhbmsgPSAoaGlmX2FkZHIgPj4gcHJpdi0+cmFua19zaGlmdFswXSkgJiBCSVQoMCk7Cj4g Kwo+ICsJcmVndmFsID0gKHJhbmsgPDwgRUNDX1BPSVNPTjBfUkFOS19TSElGVCkgfCBjb2w7Cj4g Kwl3cml0ZWwocmVndmFsLCBwcml2LT5iYXNlYWRkciArIEVDQ19QT0lTT04wX09GU1QpOwo+ICsJ cmVndmFsID0gKGJhbmtncnAgPDwgRUNDX1BPSVNPTjFfQkFOS0dSUF9TSElGVCkgfAo+ICsJCQkg KGJhbmsgPDwgRUNDX1BPSVNPTjFfQkFOS05SX1NISUZUKSB8IHJvdzsKPiArCXdyaXRlbChyZWd2 YWwsIHByaXYtPmJhc2VhZGRyICsgRUNDX1BPSVNPTjFfT0ZTVCk7CgpUaG9zZSA0IGxpbmVzIGNv dWxkIHVzZSBzb21lIHJlYWRhYmlsaXR5IGltcHJvdmVtZW50cy4KCj4gK30KPiArCj4gKy8qKgo+ ICsgKiBpbmplY3RfZGF0YV9lcnJvcl9zaG93IC0gR2V0IFBvaXNvbjAgJiAxIHJlZ2lzdGVyIGNv bnRlbnRzCj4gKyAqIEBkZXY6CVBvaW50ZXIgdG8gdGhlIGRldmljZSBzdHJ1Y3QKPiArICogQG1h dHRyOglQb2ludGVyIHRvIGRldmljZSBhdHRyaWJ1dGVzCj4gKyAqIEBkYXRhOglQb2ludGVyIHRv IHVzZXIgZGF0YQoKVGhhdCAicG9pbnRlciB0byIgaXMga2luZGEgc2lsbHkuIEp1c3QgZXhwbGFp biB3aGF0IHRob3NlIHRoaW5ncyBhcmUuCkRpdHRvIGZvciB0aGUgcmVzdCBvZiB0aGUgZHJpdmVy LgoKPiArICoKPiArICogR2V0IHRoZSBQb2lzb24wIGFuZCBQb2lzb24xIHJlZ2lzdGVyIGNvbnRl bnRzCj4gKyAqIFJldHVybjogTnVtYmVyIG9mIGJ5dGVzIGNvcGllZC4KPiArICovCj4gK3N0YXRp YyBzc2l6ZV90IGluamVjdF9kYXRhX2Vycm9yX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAo+ICsJ CQkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICptYXR0ciwKPiArCQkJCQkgICAgICBj aGFyICpkYXRhKQoKQWxpZ24gYXJndW1lbnRzIG9uIHRoZSBvcGVuaW5nIGJyYWNlLgoKTW9yZSBp bXBvcnRhbnRseSwgeW91IG5lZWQgdG8gcHV0IGFsbCB0aGF0IGluamVjdGlvbiBmdW5jdGlvbmFs aXR5CmJlaGluZCBDT05GSUdfRURBQ19ERUJVRyAtIHlvdSBkb24ndCB3YW50IHRvIGV4cG9zZSB0 aGUgaW5qZWN0aW9uCmNhcGFiaWxpdGllcyBvbiBhIHByb2R1Y3Rpb24gbWFjaGluZS4KCj4gK3sK PiArCXN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSA9IHRvX21jaShkZXYpOwo+ICsJc3RydWN0IHN5 bnBzX2VkYWNfcHJpdiAqcHJpdiA9IG1jaS0+cHZ0X2luZm87Cj4gKwo+ICsJcmV0dXJuIHNwcmlu dGYoZGF0YSwgIlBvaXNvbjAgQWRkcjogMHglMDh4XG5cclBvaXNvbjEgQWRkcjogMHglMDh4XG5c ciIKPiArCQkJIkVycm9yIGluamVjdGlvbiBBZGRyZXNzOiAweCVseFxuXHIiLAo+ICsJCQlyZWFk bChwcml2LT5iYXNlYWRkciArIEVDQ19QT0lTT04wX09GU1QpLAo+ICsJCQlyZWFkbChwcml2LT5i YXNlYWRkciArIEVDQ19QT0lTT04xX09GU1QpLAo+ICsJCQlwcml2LT5wb2lzb25fYWRkcik7Cj4g K30KPiArCj4gKy8qKgo+ICsgKiBpbmplY3RfZGF0YV9lcnJvcl9zdG9yZSAtIENvbmZpZ3VyZSBQ b2lzb24wIFBvaXNvbjEgcmVnaXN0ZXJzCj4gKyAqIEBkZXY6CVBvaW50ZXIgdG8gdGhlIGRldmlj ZSBzdHJ1Y3QKPiArICogQG1hdHRyOglQb2ludGVyIHRvIGRldmljZSBhdHRyaWJ1dGVzCj4gKyAq IEBkYXRhOglQb2ludGVyIHRvIHVzZXIgZGF0YQo+ICsgKiBAY291bnQ6CXJlYWQgdGhlIHNpemUg Ynl0ZXMgZnJvbSBidWZmZXIKPiArICoKPiArICogQ29uZmlndXJlcyB0aGUgUG9pc29uMCBhbmQg UG9pc29uMSByZWdpc3RlciBjb250ZW50cyBhcyBwZXIgdXNlciBnaXZlbgo+ICsgKiBhZGRyZXNz Cj4gKyAqIFJldHVybjogTnVtYmVyIG9mIGJ5dGVzIGNvcGllZC4KPiArICovCj4gK3N0YXRpYyBz c2l6ZV90IGluamVjdF9kYXRhX2Vycm9yX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKPiArCQkJ CQkgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKm1hdHRyLAo+ICsJCQkJCSAgICAgICBj b25zdCBjaGFyICpkYXRhLCBzaXplX3QgY291bnQpCj4gK3sKPiArCXN0cnVjdCBtZW1fY3RsX2lu Zm8gKm1jaSA9IHRvX21jaShkZXYpOwo+ICsJc3RydWN0IHN5bnBzX2VkYWNfcHJpdiAqcHJpdiA9 IG1jaS0+cHZ0X2luZm87Cj4gKwo+ICsJaWYgKGtzdHJ0b3VsKGRhdGEsIDAsICZwcml2LT5wb2lz b25fYWRkcikpCj4gKwkJcmV0dXJuIC1FSU5WQUw7Cj4gKwo+ICsJZGRyX3BvaXNvbl9zZXR1cChw cml2KTsKPiArCj4gKwlyZXR1cm4gY291bnQ7Cj4gK30KPiArCj4gKy8qKgo+ICsgKiBpbmplY3Rf ZGF0YV9wb2lzb25fc2hvdyAtIFNob3dzIHR5cGUgb2YgRGF0YSBwb2lzb24KPiArICogQGRldjoJ UG9pbnRlciB0byB0aGUgZGV2aWNlIHN0cnVjdAo+ICsgKiBAbWF0dHI6CVBvaW50ZXIgdG8gZGV2 aWNlIGF0dHJpYnV0ZXMKPiArICogQGRhdGE6CVBvaW50ZXIgdG8gdXNlciBkYXRhCj4gKyAqCj4g KyAqIFNob3dzIHRoZSB0eXBlIG9mIEVycm9yIGluamVjdGlvbiBlbmFibGVkLCBlaXRoZXIgVUUg b3IgQ0UKPiArICogUmV0dXJuOiBOdW1iZXIgb2YgYnl0ZXMgY29waWVkLgo+ICsgKi8KPiArc3Rh dGljIHNzaXplX3QgaW5qZWN0X2RhdGFfcG9pc29uX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAo+ ICsJCQkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICptYXR0ciwKPiArCQkJCQkgICAg ICBjaGFyICpkYXRhKQo+ICt7Cj4gKwlzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2kgPSB0b19tY2ko ZGV2KTsKPiArCXN0cnVjdCBzeW5wc19lZGFjX3ByaXYgKnByaXYgPSBtY2ktPnB2dF9pbmZvOwo+ ICsKPiArCXJldHVybiBzcHJpbnRmKGRhdGEsICJEYXRhIFBvaXNvbmluZzogJXNcblxyIiwKPiAr CQkJKCgocmVhZGwocHJpdi0+YmFzZWFkZHIgKyBFQ0NfQ0ZHMV9PRlNUKSkgJiAweDMpID09IDB4 MykKPiArCQkJPyAoIkNvcnJlY3RhYmxlIEVycm9yIikgOiAoIlVuQ29ycmVjdGFibGUgRXJyb3Ii KSk7Cj4gK30KPiArCj4gKy8qKgo+ICsgKiBpbmplY3RfZGF0YV9wb2lzb25fc3RvcmUgLSBFbmJs ZXMgRGF0YSBwb2lzb24gQ0UvVUUKPiArICogQGRldjoJUG9pbnRlciB0byB0aGUgZGV2aWNlIHN0 cnVjdAo+ICsgKiBAbWF0dHI6CVBvaW50ZXIgdG8gZGV2aWNlIGF0dHJpYnV0ZXMKPiArICogQGRh dGE6CVBvaW50ZXIgdG8gdXNlciBkYXRhCj4gKyAqIEBjb3VudDoJcmVhZCB0aGUgc2l6ZSBieXRl cyBmcm9tIGJ1ZmZlcgo+ICsgKgo+ICsgKiBFbmFibGVzIHRoZSBDRSBvciBVRSBEYXRhIHBvaXNv bgo+ICsgKiBSZXR1cm46IE51bWJlciBvZiBieXRlcyBjb3BpZWQuCj4gKyAqLwo+ICtzdGF0aWMg c3NpemVfdCBpbmplY3RfZGF0YV9wb2lzb25fc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAo+ICsJ CQkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqbWF0dHIsCj4gKwkJCQkJICAgICAg IGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBjb3VudCkKPiArewo+ICsJc3RydWN0IG1lbV9jdGxf aW5mbyAqbWNpID0gdG9fbWNpKGRldik7Cj4gKwlzdHJ1Y3Qgc3lucHNfZWRhY19wcml2ICpwcml2 ID0gbWNpLT5wdnRfaW5mbzsKPiArCj4gKwl3cml0ZWwoMCwgcHJpdi0+YmFzZWFkZHIgKyBERFJD X1NXQ1RMKTsKPiArCWlmIChzdHJuY21wKGRhdGEsICJDRSIsIDIpID09IDApCj4gKwkJd3JpdGVs KEVDQ19DRVBPSVNPTl9NQVNLLCBwcml2LT5iYXNlYWRkciArIEVDQ19DRkcxX09GU1QpOwo+ICsJ ZWxzZQo+ICsJCXdyaXRlbChFQ0NfVUVQT0lTT05fTUFTSywgcHJpdi0+YmFzZWFkZHIgKyBFQ0Nf Q0ZHMV9PRlNUKTsKPiArCXdyaXRlbCgxLCBwcml2LT5iYXNlYWRkciArIEREUkNfU1dDVEwpOwo+ ICsKPiArCXJldHVybiBjb3VudDsKPiArfQo+ICsKPiArc3RhdGljIERFVklDRV9BVFRSX1JXKGlu amVjdF9kYXRhX2Vycm9yKTsKPiArc3RhdGljIERFVklDRV9BVFRSX1JXKGluamVjdF9kYXRhX3Bv aXNvbik7Cj4gKwo+ICsvKioKPiArICogc3lucHNfZWRhY19jcmVhdGVfc3lzZnNfYXR0cmlidXRl cyAtIENyZWF0ZSBzeXNmcyBlbnRyaWVzCj4gKyAqIEBtY2k6CVBvaW50ZXIgdG8gdGhlIGVkYWMg bWVtb3J5IGNvbnRyb2xsZXIgaW5zdGFuY2UKPiArICoKPiArICogQ3JlYXRlIHN5c2ZzIGF0dHJp YnV0ZXMgZm9yIGluamVjdGluZyBFQ0MgZXJyb3JzIHVzaW5nIGRhdGEgcG9pc29uLgo+ICsgKgo+ ICsgKiBSZXR1cm46IDAgaWYgc3lzZnMgY3JlYXRpb24gd2FzIHN1Y2Nlc3NmdWwsIGVsc2UgcmV0 dXJuIG5lZ2F0aXZlIGVycm9yIGNvZGUuCj4gKyAqLwo+ICtzdGF0aWMgaW50IHN5bnBzX2VkYWNf Y3JlYXRlX3N5c2ZzX2F0dHJpYnV0ZXMoc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpKQo+ICt7Cj4g KwlpbnQgcmM7Cj4gKwo+ICsJcmMgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJm1jaS0+ZGV2LCAmZGV2 X2F0dHJfaW5qZWN0X2RhdGFfZXJyb3IpOwo+ICsJaWYgKHJjIDwgMCkKPiArCQlyZXR1cm4gcmM7 Cj4gKwlyYyA9IGRldmljZV9jcmVhdGVfZmlsZSgmbWNpLT5kZXYsICZkZXZfYXR0cl9pbmplY3Rf ZGF0YV9wb2lzb24pOwo+ICsJaWYgKHJjIDwgMCkKPiArCQlyZXR1cm4gcmM7Cj4gKwlyZXR1cm4g MDsKPiArfQo+ICsKPiArLyoqCj4gKyAqIHN5bnBzX2VkYWNfcmVtb3ZlX3N5c2ZzX2F0dHJpYnV0 ZXMgLSBSZW1vdmVzIHN5c2ZzIGVudHJpZXMKPiArICogQG1jaToJUG9pbnRlciB0byB0aGUgZWRh YyBtZW1vcnkgY29udHJvbGxlciBpbnN0YW5jZQo+ICsgKgo+ICsgKiBSZW1vdmVzIHN5c2ZzIGF0 dHJpYnV0ZXMuCj4gKyAqCj4gKyAqIFJldHVybjogbm9uZS4KPiArICovCj4gK3N0YXRpYyB2b2lk IHN5bnBzX2VkYWNfcmVtb3ZlX3N5c2ZzX2F0dHJpYnV0ZXMoc3RydWN0IG1lbV9jdGxfaW5mbyAq bWNpKQo+ICt7Cj4gKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJm1jaS0+ZGV2LCAmZGV2X2F0dHJfaW5q ZWN0X2RhdGFfZXJyb3IpOwo+ICsJZGV2aWNlX3JlbW92ZV9maWxlKCZtY2ktPmRldiwgJmRldl9h dHRyX2luamVjdF9kYXRhX3BvaXNvbik7Cj4gK30KPiArCj4gKy8qKgo+ICsgKiBzZXR1cF9hZGRy ZXNzX21hcCAtCVNldCBBZGRyZXNzIE1hcCBieSBxdWVyeWluZyBBRERSTUFQIHJlZ2lzdGVycwo+ ICsgKiBAcHJpdjoJCVBvaW50ZXIgdG8gc3lucHNfZWRhY19wcml2IHN0cnVjdAo+ICsgKgo+ICsg KiBTZXQgQWRkcmVzcyBNYXAgYnkgcXVlcnlpbmcgQUREUk1BUCByZWdpc3RlcnMKPiArICogUmV0 dXJuOiBub25lLgo+ICsgKi8KPiArc3RhdGljIHZvaWQgc2V0dXBfYWRkcmVzc19tYXAoc3RydWN0 IHN5bnBzX2VkYWNfcHJpdiAqcHJpdikKPiArewo+ICsJdTMyIGFkZHJtYXBbMTJdLCBhZGRybWFw X3Jvd19iMl8xMDsKPiArCWludCBpbmRleDsKPiArCXUzMiB3aWR0aCwgbWVtdHlwZTsKPiArCj4g KwltZW10eXBlID0gcmVhZGwocHJpdi0+YmFzZWFkZHIgKyBDVFJMX09GU1QpOwo+ICsJd2lkdGgg PSAobWVtdHlwZSAmIEVDQ19DVFJMX0JVU1dJRFRIX01BU0spID4+IEVDQ19DVFJMX0JVU1dJRFRI X1NISUZUOwo+ICsKPiArCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IDEyOyBpbmRleCsrKSB7Cj4g KwkJdTMyIGFkZHJtYXBfb2Zmc2V0Owo+ICsKPiArCQlhZGRybWFwX29mZnNldCA9IEVDQ19BRERS TUFQMF9PRkZTRVQgKyAoaW5kZXggKiA0KTsKPiArCQlhZGRybWFwW2luZGV4XSA9IHJlYWRsKHBy aXYtPmJhc2VhZGRyICsgYWRkcm1hcF9vZmZzZXQpOwo+ICsJfQo+ICsKPiArCXByaXYtPnJvd19z aGlmdFswXSA9IChhZGRybWFwWzVdICYgUk9XX01BWF9WQUxfTUFTSykgKyBST1dfQjBfQkFTRTsK PiArCXByaXYtPnJvd19zaGlmdFsxXSA9ICgoYWRkcm1hcFs1XSA+PiA4KSAmCj4gKwkJCVJPV19N QVhfVkFMX01BU0spICsgUk9XX0IxX0JBU0U7Cj4gKwo+ICsJYWRkcm1hcF9yb3dfYjJfMTAgPSAo YWRkcm1hcFs1XSA+PiAxNikgJiBST1dfTUFYX1ZBTF9NQVNLOwo+ICsJaWYgKGFkZHJtYXBfcm93 X2IyXzEwICE9IFJPV19NQVhfVkFMX01BU0spIHsKPiArCQlmb3IgKGluZGV4ID0gMjsgaW5kZXgg PCAxMTsgaW5kZXgrKykKPiArCQkJcHJpdi0+cm93X3NoaWZ0W2luZGV4XSA9IGFkZHJtYXBfcm93 X2IyXzEwICsKPiArCQkJCWluZGV4ICsgUk9XX0IwX0JBU0U7Cj4gKwo+ICsJfSBlbHNlIHsKPiAr CQlwcml2LT5yb3dfc2hpZnRbMl0gPSAoYWRkcm1hcFs5XSAmCj4gKwkJCQlST1dfTUFYX1ZBTF9N QVNLKSArIFJPV19CMl9CQVNFOwo+ICsJCXByaXYtPnJvd19zaGlmdFszXSA9ICgoYWRkcm1hcFs5 XSA+PiA4KSAmCj4gKwkJCQlST1dfTUFYX1ZBTF9NQVNLKSArIFJPV19CM19CQVNFOwo+ICsJCXBy aXYtPnJvd19zaGlmdFs0XSA9ICgoYWRkcm1hcFs5XSA+PiAxNikgJgo+ICsJCQkJUk9XX01BWF9W QUxfTUFTSykgKyBST1dfQjRfQkFTRTsKPiArCQlwcml2LT5yb3dfc2hpZnRbNV0gPSAoKGFkZHJt YXBbOV0gPj4gMjQpICYKPiArCQkJCVJPV19NQVhfVkFMX01BU0spICsgUk9XX0I1X0JBU0U7Cj4g KwkJcHJpdi0+cm93X3NoaWZ0WzZdID0gKGFkZHJtYXBbMTBdICYKPiArCQkJCVJPV19NQVhfVkFM X01BU0spICsgUk9XX0I2X0JBU0U7Cj4gKwkJcHJpdi0+cm93X3NoaWZ0WzddID0gKChhZGRybWFw WzEwXSA+PiA4KSAmCj4gKwkJCQlST1dfTUFYX1ZBTF9NQVNLKSArIFJPV19CN19CQVNFOwo+ICsJ CXByaXYtPnJvd19zaGlmdFs4XSA9ICgoYWRkcm1hcFsxMF0gPj4gMTYpICYKPiArCQkJCVJPV19N QVhfVkFMX01BU0spICsgUk9XX0I4X0JBU0U7Cj4gKwkJcHJpdi0+cm93X3NoaWZ0WzldID0gKChh ZGRybWFwWzEwXSA+PiAyNCkgJgo+ICsJCQkJUk9XX01BWF9WQUxfTUFTSykgKyBST1dfQjlfQkFT RTsKPiArCQlwcml2LT5yb3dfc2hpZnRbMTBdID0gKGFkZHJtYXBbMTFdICYKPiArCQkJCVJPV19N QVhfVkFMX01BU0spICsgUk9XX0IxMF9CQVNFOwo+ICsJfQo+ICsKPiArCXByaXYtPnJvd19zaGlm dFsxMV0gPSAoKChhZGRybWFwWzVdID4+IDI0KSAmIFJPV19NQVhfVkFMX01BU0spID09Cj4gKwkJ CQlST1dfTUFYX1ZBTF9NQVNLKSA/IDAgOiAoKChhZGRybWFwWzVdID4+IDI0KSAmCj4gKwkJCQlS T1dfTUFYX1ZBTF9NQVNLKSArIFJPV19CMTFfQkFTRSk7Cj4gKwlwcml2LT5yb3dfc2hpZnRbMTJd ID0gKChhZGRybWFwWzZdICYgUk9XX01BWF9WQUxfTUFTSykgPT0KPiArCQkJCVJPV19NQVhfVkFM X01BU0spID8gMCA6ICgoYWRkcm1hcFs2XSAmCj4gKwkJCQlST1dfTUFYX1ZBTF9NQVNLKSArIFJP V19CMTJfQkFTRSk7Cj4gKwlwcml2LT5yb3dfc2hpZnRbMTNdID0gKCgoYWRkcm1hcFs2XSA+PiA4 KSAmIFJPV19NQVhfVkFMX01BU0spID09Cj4gKwkJCQlST1dfTUFYX1ZBTF9NQVNLKSA/IDAgOiAo KChhZGRybWFwWzZdID4+IDgpICYKPiArCQkJCVJPV19NQVhfVkFMX01BU0spICsgUk9XX0IxM19C QVNFKTsKPiArCXByaXYtPnJvd19zaGlmdFsxNF0gPSAoKChhZGRybWFwWzZdID4+IDE2KSAmIFJP V19NQVhfVkFMX01BU0spID09Cj4gKwkJCQlST1dfTUFYX1ZBTF9NQVNLKSA/IDAgOiAoKChhZGRy bWFwWzZdID4+IDE2KSAmCj4gKwkJCQlST1dfTUFYX1ZBTF9NQVNLKSArIFJPV19CMTRfQkFTRSk7 Cj4gKwlwcml2LT5yb3dfc2hpZnRbMTVdID0gKCgoYWRkcm1hcFs2XSA+PiAyNCkgJiBST1dfTUFY X1ZBTF9NQVNLKSA9PQo+ICsJCQkJUk9XX01BWF9WQUxfTUFTSykgPyAwIDogKCgoYWRkcm1hcFs2 XSA+PiAyNCkgJgo+ICsJCQkJUk9XX01BWF9WQUxfTUFTSykgKyBST1dfQjE1X0JBU0UpOwo+ICsJ cHJpdi0+cm93X3NoaWZ0WzE2XSA9ICgoYWRkcm1hcFs3XSAmIFJPV19NQVhfVkFMX01BU0spID09 Cj4gKwkJCQlST1dfTUFYX1ZBTF9NQVNLKSA/IDAgOiAoKGFkZHJtYXBbN10gJgo+ICsJCQkJUk9X X01BWF9WQUxfTUFTSykgKyBST1dfQjE2X0JBU0UpOwo+ICsJcHJpdi0+cm93X3NoaWZ0WzE3XSA9 ICgoKGFkZHJtYXBbN10gPj4gOCkgJiBST1dfTUFYX1ZBTF9NQVNLKSA9PQo+ICsJCQkJUk9XX01B WF9WQUxfTUFTSykgPyAwIDogKCgoYWRkcm1hcFs3XSA+PiA4KSAmCj4gKwkJCQlST1dfTUFYX1ZB TF9NQVNLKSArIFJPV19CMTdfQkFTRSk7Cj4gKwo+ICsJcHJpdi0+Y29sX3NoaWZ0WzBdID0gMDsK PiArCXByaXYtPmNvbF9zaGlmdFsxXSA9IDE7Cj4gKwlwcml2LT5jb2xfc2hpZnRbMl0gPSAoYWRk cm1hcFsyXSAmIENPTF9NQVhfVkFMX01BU0spICsgQ09MX0IyX0JBU0U7Cj4gKwlwcml2LT5jb2xf c2hpZnRbM10gPSAoKGFkZHJtYXBbMl0gPj4gOCkgJgo+ICsJCQlDT0xfTUFYX1ZBTF9NQVNLKSAr IENPTF9CM19CQVNFOwo+ICsJcHJpdi0+Y29sX3NoaWZ0WzRdID0gKCgoYWRkcm1hcFsyXSA+PiAx NikgJiBDT0xfTUFYX1ZBTF9NQVNLKSA9PQo+ICsJCQlDT0xfTUFYX1ZBTF9NQVNLKSA/IDAgOiAo KChhZGRybWFwWzJdID4+IDE2KSAmCj4gKwkJCQkJQ09MX01BWF9WQUxfTUFTSykgKyBDT0xfQjRf QkFTRSk7Cj4gKwlwcml2LT5jb2xfc2hpZnRbNV0gPSAoKChhZGRybWFwWzJdID4+IDI0KSAmIENP TF9NQVhfVkFMX01BU0spID09Cj4gKwkJCUNPTF9NQVhfVkFMX01BU0spID8gMCA6ICgoKGFkZHJt YXBbMl0gPj4gMjQpICYKPiArCQkJCQlDT0xfTUFYX1ZBTF9NQVNLKSArIENPTF9CNV9CQVNFKTsK PiArCXByaXYtPmNvbF9zaGlmdFs2XSA9ICgoYWRkcm1hcFszXSAmIENPTF9NQVhfVkFMX01BU0sp ID09Cj4gKwkJCUNPTF9NQVhfVkFMX01BU0spID8gMCA6ICgoYWRkcm1hcFszXSAmCj4gKwkJCQkJ Q09MX01BWF9WQUxfTUFTSykgKyBDT0xfQjZfQkFTRSk7Cj4gKwlwcml2LT5jb2xfc2hpZnRbN10g PSAoKChhZGRybWFwWzNdID4+IDgpICYgQ09MX01BWF9WQUxfTUFTSykgPT0KPiArCQkJQ09MX01B WF9WQUxfTUFTSykgPyAwIDogKCgoYWRkcm1hcFszXSA+PiA4KSAmCj4gKwkJCQkJQ09MX01BWF9W QUxfTUFTSykgKyBDT0xfQjdfQkFTRSk7Cj4gKwlwcml2LT5jb2xfc2hpZnRbOF0gPSAoKChhZGRy bWFwWzNdID4+IDE2KSAmIENPTF9NQVhfVkFMX01BU0spID09Cj4gKwkJCUNPTF9NQVhfVkFMX01B U0spID8gMCA6ICgoKGFkZHJtYXBbM10gPj4gMTYpICYKPiArCQkJCQlDT0xfTUFYX1ZBTF9NQVNL KSArIENPTF9COF9CQVNFKTsKPiArCXByaXYtPmNvbF9zaGlmdFs5XSA9ICgoKGFkZHJtYXBbM10g Pj4gMjQpICYgQ09MX01BWF9WQUxfTUFTSykgPT0KPiArCQkJQ09MX01BWF9WQUxfTUFTSykgPyAw IDogKCgoYWRkcm1hcFszXSA+PiAyNCkgJgo+ICsJCQkJCUNPTF9NQVhfVkFMX01BU0spICsgQ09M X0I5X0JBU0UpOwo+ICsJaWYgKHdpZHRoID09IEREUkNUTF9FV0RUSF82NCkgewo+ICsJCWlmICht ZW10eXBlICYgTUVNX1RZUEVfTFBERFIzKSB7Cj4gKwkJCXByaXYtPmNvbF9zaGlmdFsxMF0gPSAo KGFkZHJtYXBbNF0gJgo+ICsJCQkJQ09MX01BWF9WQUxfTUFTSykgPT0gQ09MX01BWF9WQUxfTUFT SykgPyAwIDoKPiArCQkJCSgoYWRkcm1hcFs0XSAmIENPTF9NQVhfVkFMX01BU0spICsKPiArCQkJ CSBDT0xfQjEwX0JBU0UpOwo+ICsJCQlwcml2LT5jb2xfc2hpZnRbMTFdID0gKCgoYWRkcm1hcFs0 XSA+PiA4KSAmCj4gKwkJCQlDT0xfTUFYX1ZBTF9NQVNLKSA9PSBDT0xfTUFYX1ZBTF9NQVNLKSA/ IDAgOgo+ICsJCQkJKCgoYWRkcm1hcFs0XSA+PiA4KSAmIENPTF9NQVhfVkFMX01BU0spICsKPiAr CQkJCSBDT0xfQjExX0JBU0UpOwo+ICsJCX0gZWxzZSB7Cj4gKwkJCXByaXYtPmNvbF9zaGlmdFsx MV0gPSAoKGFkZHJtYXBbNF0gJgo+ICsJCQkJQ09MX01BWF9WQUxfTUFTSykgPT0gQ09MX01BWF9W QUxfTUFTSykgPyAwIDoKPiArCQkJCSgoYWRkcm1hcFs0XSAmIENPTF9NQVhfVkFMX01BU0spICsK PiArCQkJCSBDT0xfQjEwX0JBU0UpOwo+ICsJCQlwcml2LT5jb2xfc2hpZnRbMTNdID0gKCgoYWRk cm1hcFs0XSA+PiA4KSAmCj4gKwkJCQlDT0xfTUFYX1ZBTF9NQVNLKSA9PSBDT0xfTUFYX1ZBTF9N QVNLKSA/IDAgOgo+ICsJCQkJKCgoYWRkcm1hcFs0XSA+PiA4KSAmIENPTF9NQVhfVkFMX01BU0sp ICsKPiArCQkJCSBDT0xfQjExX0JBU0UpOwo+ICsJCX0KPiArCX0gZWxzZSBpZiAod2lkdGggPT0g RERSQ1RMX0VXRFRIXzMyKSB7Cj4gKwkJaWYgKG1lbXR5cGUgJiBNRU1fVFlQRV9MUEREUjMpIHsK PiArCQkJcHJpdi0+Y29sX3NoaWZ0WzEwXSA9ICgoKGFkZHJtYXBbM10gPj4gMjQpICYKPiArCQkJ CUNPTF9NQVhfVkFMX01BU0spID09IENPTF9NQVhfVkFMX01BU0spID8gMCA6Cj4gKwkJCQkoKChh ZGRybWFwWzNdID4+IDI0KSAmIENPTF9NQVhfVkFMX01BU0spICsKPiArCQkJCSBDT0xfQjlfQkFT RSk7Cj4gKwkJCXByaXYtPmNvbF9zaGlmdFsxMV0gPSAoKGFkZHJtYXBbNF0gJgo+ICsJCQkJQ09M X01BWF9WQUxfTUFTSykgPT0gQ09MX01BWF9WQUxfTUFTSykgPyAwIDoKPiArCQkJCSgoYWRkcm1h cFs0XSAmIENPTF9NQVhfVkFMX01BU0spICsKPiArCQkJCSBDT0xfQjEwX0JBU0UpOwo+ICsJCX0g ZWxzZSB7Cj4gKwkJCXByaXYtPmNvbF9zaGlmdFsxMV0gPSAoKChhZGRybWFwWzNdID4+IDI0KSAm Cj4gKwkJCQlDT0xfTUFYX1ZBTF9NQVNLKSA9PSBDT0xfTUFYX1ZBTF9NQVNLKSA/IDAgOgo+ICsJ CQkJKCgoYWRkcm1hcFszXSA+PiAyNCkgJiBDT0xfTUFYX1ZBTF9NQVNLKSArCj4gKwkJCQkgQ09M X0I5X0JBU0UpOwo+ICsJCQlwcml2LT5jb2xfc2hpZnRbMTNdID0gKChhZGRybWFwWzRdICYKPiAr CQkJCUNPTF9NQVhfVkFMX01BU0spID09IENPTF9NQVhfVkFMX01BU0spID8gMCA6Cj4gKwkJCQko KGFkZHJtYXBbNF0gJiBDT0xfTUFYX1ZBTF9NQVNLKSArCj4gKwkJCQkgQ09MX0IxMF9CQVNFKTsK PiArCQl9Cj4gKwl9IGVsc2Ugewo+ICsJCWlmIChtZW10eXBlICYgTUVNX1RZUEVfTFBERFIzKSB7 Cj4gKwkJCXByaXYtPmNvbF9zaGlmdFsxMF0gPSAoKChhZGRybWFwWzNdID4+IDE2KSAmCj4gKwkJ CQlDT0xfTUFYX1ZBTF9NQVNLKSA9PSBDT0xfTUFYX1ZBTF9NQVNLKSA/IDAgOgo+ICsJCQkJKCgo YWRkcm1hcFszXSA+PiAxNikgJiBDT0xfTUFYX1ZBTF9NQVNLKSArCj4gKwkJCQkgQ09MX0I4X0JB U0UpOwo+ICsJCQlwcml2LT5jb2xfc2hpZnRbMTFdID0gKCgoYWRkcm1hcFszXSA+PiAyNCkgJgo+ ICsJCQkJQ09MX01BWF9WQUxfTUFTSykgPT0gQ09MX01BWF9WQUxfTUFTSykgPyAwIDoKPiArCQkJ CSgoKGFkZHJtYXBbM10gPj4gMjQpICYgQ09MX01BWF9WQUxfTUFTSykgKwo+ICsJCQkJIENPTF9C OV9CQVNFKTsKPiArCQkJcHJpdi0+Y29sX3NoaWZ0WzEzXSA9ICgoYWRkcm1hcFs0XSAmCj4gKwkJ CQlDT0xfTUFYX1ZBTF9NQVNLKSA9PSBDT0xfTUFYX1ZBTF9NQVNLKSA/IDAgOgo+ICsJCQkJKChh ZGRybWFwWzRdICYgQ09MX01BWF9WQUxfTUFTSykgKwo+ICsJCQkJIENPTF9CMTBfQkFTRSk7Cj4g KwkJfSBlbHNlIHsKPiArCQkJcHJpdi0+Y29sX3NoaWZ0WzExXSA9ICgoKGFkZHJtYXBbM10gPj4g MTYpICYKPiArCQkJCUNPTF9NQVhfVkFMX01BU0spID09IENPTF9NQVhfVkFMX01BU0spID8gMCA6 Cj4gKwkJCQkoKChhZGRybWFwWzNdID4+IDE2KSAmIENPTF9NQVhfVkFMX01BU0spICsKPiArCQkJ CSBDT0xfQjhfQkFTRSk7Cj4gKwkJCXByaXYtPmNvbF9zaGlmdFsxM10gPSAoKChhZGRybWFwWzNd ID4+IDI0KSAmCj4gKwkJCQlDT0xfTUFYX1ZBTF9NQVNLKSA9PSBDT0xfTUFYX1ZBTF9NQVNLKSA/ IDAgOgo+ICsJCQkJKCgoYWRkcm1hcFszXSA+PiAyNCkgJiBDT0xfTUFYX1ZBTF9NQVNLKSArCj4g KwkJCQkgQ09MX0I5X0JBU0UpOwo+ICsJCX0KPiArCX0KPiArCj4gKwlpZiAod2lkdGgpIHsKPiAr CQlmb3IgKGluZGV4ID0gOTsgaW5kZXggPiB3aWR0aDsgaW5kZXgtLSkgewo+ICsJCQlwcml2LT5j b2xfc2hpZnRbaW5kZXhdID0gcHJpdi0+Y29sX3NoaWZ0W2luZGV4IC0gd2lkdGhdOwo+ICsJCQlw cml2LT5jb2xfc2hpZnRbaW5kZXggLSB3aWR0aF0gPSAwOwo+ICsJCX0KPiArCX0KPiArCj4gKwlw cml2LT5iYW5rX3NoaWZ0WzBdID0gKGFkZHJtYXBbMV0gJiBCQU5LX01BWF9WQUxfTUFTSykgKyBC QU5LX0IwX0JBU0U7Cj4gKwlwcml2LT5iYW5rX3NoaWZ0WzFdID0gKChhZGRybWFwWzFdID4+IDgp ICYKPiArCQkJCUJBTktfTUFYX1ZBTF9NQVNLKSArIEJBTktfQjFfQkFTRTsKPiArCXByaXYtPmJh bmtfc2hpZnRbMl0gPSAoKChhZGRybWFwWzFdID4+IDE2KSAmCj4gKwkJCQlCQU5LX01BWF9WQUxf TUFTSykgPT0gQkFOS19NQVhfVkFMX01BU0spID8gMCA6Cj4gKwkJCQkoKChhZGRybWFwWzFdID4+ IDE2KSAmIEJBTktfTUFYX1ZBTF9NQVNLKSArCj4gKwkJCQkgQkFOS19CMl9CQVNFKTsKPiArCj4g Kwlwcml2LT5iYW5rZ3JwX3NoaWZ0WzBdID0gKGFkZHJtYXBbOF0gJgo+ICsJCQkJQkFOS0dSUF9N QVhfVkFMX01BU0spICsgQkFOS0dSUF9CMF9CQVNFOwo+ICsJcHJpdi0+YmFua2dycF9zaGlmdFsx XSA9ICgoKGFkZHJtYXBbOF0gPj4gOCkgJiBCQU5LR1JQX01BWF9WQUxfTUFTSykgPT0KPiArCQkJ CUJBTktHUlBfTUFYX1ZBTF9NQVNLKSA/IDAgOiAoKChhZGRybWFwWzhdID4+IDgpCj4gKwkJCQkm IEJBTktHUlBfTUFYX1ZBTF9NQVNLKSArIEJBTktHUlBfQjFfQkFTRSk7Cj4gKwo+ICsJcHJpdi0+ cmFua19zaGlmdFswXSA9ICgoYWRkcm1hcFswXSAmIFJBTktfTUFYX1ZBTF9NQVNLKSA9PQo+ICsJ CQkJUkFOS19NQVhfVkFMX01BU0spID8gMCA6ICgoYWRkcm1hcFswXSAmCj4gKwkJCQlSQU5LX01B WF9WQUxfTUFTSykgKyBSQU5LX0IwX0JBU0UpOwo+ICt9CgpUaGUgYXNzaWdubWVudHMgaW4gdGhh dCB3aG9sZSBmdW5jdGlvbiBhcmUgcmVhbGx5IHVucmVhZGFibGUuIFlvdSBjb3VsZApkZWZpbmUg bWFjcm9zIG1heWJlIGFuZCBoaWRlIGFsbCB0aGUgZGV0YWlscyBpbiB0aGVtIGFzIHRoZSBhc3Np Z25tZW50cwpsb29rIHByZXR0eSByZWd1bGFyLi4uCgo+ICsKPiAgLyoqCj4gICAqIHN5bnBzX2Vk YWNfbWNfcHJvYmUgLSBDaGVjayBjb250cm9sbGVyIGFuZCBiaW5kIGRyaXZlcgo+ICAgKiBAcGRl djoJUG9pbnRlciB0byB0aGUgcGxhdGZvcm1fZGV2aWNlIHN0cnVjdAo+IEBAIC00ODAsNyArMTI2 OCw3IEBAIHN0YXRpYyBpbnQgc3lucHNfZWRhY19tY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2 aWNlICpwZGV2KQo+ICAJc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpOwo+ICAJc3RydWN0IGVkYWNf bWNfbGF5ZXIgbGF5ZXJzWzJdOwo+ICAJc3RydWN0IHN5bnBzX2VkYWNfcHJpdiAqcHJpdjsKPiAt CWludCByYzsKPiArCWludCByYywgaXJxLCBzdGF0dXM7Cj4gIAlzdHJ1Y3QgcmVzb3VyY2UgKnJl czsKPiAgCXZvaWQgX19pb21lbSAqYmFzZWFkZHI7Cj4gIAljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNl X2lkICptYXRjaDsKPiBAQCAtNTI5LDYgKzEzMTcsMjcgQEAgc3RhdGljIGludCBzeW5wc19lZGFj X21jX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCj4gIAkJZ290byBmcmVlX2Vk YWNfbWM7Cj4gIAl9Cj4gIAo+ICsJaWYgKHByaXYtPnBfZGF0YS0+cXVpcmtzICYgRERSX0VDQ19J TlRSX1NVUFBPUlQpIHsKPiArCQlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOwo+ICsJ CWlmIChpcnEgPCAwKSB7Cj4gKwkJCWVkYWNfcHJpbnRrKEtFUk5fRVJSLCBFREFDX01DLAo+ICsJ CQkJCSJObyBpcnEgJWQgaW4gRFRcbiIsIGlycSk7Cj4gKwkJCXJldHVybiAtRU5PREVWOwoKCQkJ Z290byBmcmVlX2VkYWNfbWM7CgpvdGhlcndpc2UgeW91IGxlYWsgbWVtb3J5LgoKPiArCQl9Cj4g Kwo+ICsJCXN0YXR1cyA9IGRldm1fcmVxdWVzdF9pcnEoJnBkZXYtPmRldiwgaXJxLAo+ICsJCQlz eW5wc19lZGFjX2ludHJfaGFuZGxlciwKPiArCQkJMCwgZGV2X25hbWUoJnBkZXYtPmRldiksIG1j aSk7Cj4gKwkJaWYgKHN0YXR1cyA8IDApIHsKPiArCQkJZWRhY19wcmludGsoS0VSTl9FUlIsIEVE QUNfTUMsICJGYWlsZWQgdG8gcmVxdWVzdCBJcnFcbiIpOwo+ICsJCQlnb3RvIGZyZWVfZWRhY19t YzsKPiArCQl9Cj4gKwo+ICsJCS8qIEVuYWJsZSBVRS9DRSBJbnRlcnJ1cHRzICovCj4gKwkJd3Jp dGVsKChERFJfUU9TVUVfTUFTSyB8IEREUl9RT1NDRV9NQVNLKSwKPiArCQkJcHJpdi0+YmFzZWFk ZHIgKyBERFJfUU9TX0lSUV9FTl9PRlNUKTsKPiArCX0KPiArCj4gIAlyYyA9IGVkYWNfbWNfYWRk X21jKG1jaSk7Cj4gIAlpZiAocmMpIHsKPiAgCQllZGFjX3ByaW50ayhLRVJOX0VSUiwgRURBQ19N QywKPiBAQCAtNTM2LDExICsxMzQ1LDI0IEBAIHN0YXRpYyBpbnQgc3lucHNfZWRhY19tY19wcm9i ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQo+ICAJCWdvdG8gZnJlZV9lZGFjX21jOwo+ ICAJfQo+ICAKPiArCWlmIChwcml2LT5wX2RhdGEtPnF1aXJrcyAmIEREUl9FQ0NfREFUQV9QT0lT T05fU1VQUE9SVCkgewo+ICsJCWlmIChzeW5wc19lZGFjX2NyZWF0ZV9zeXNmc19hdHRyaWJ1dGVz KG1jaSkpIHsKPiArCQkJZWRhY19wcmludGsoS0VSTl9FUlIsIEVEQUNfTUMsCj4gKwkJCQkJIkZh aWxlZCB0byBjcmVhdGUgc3lzZnMgZW50cmllc1xuIik7Cj4gKwkJCWdvdG8gZnJlZV9lZGFjX21j Owo+ICsJCX0KPiArCX0KPiArCj4gKwlpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUocGRldi0+ ZGV2Lm9mX25vZGUsCj4gKwkJCQkgICAgInhsbngsenlucW1wLWRkcmMtMi40MGEiKSkKPiArCQlz ZXR1cF9hZGRyZXNzX21hcChwcml2KTsKPiArCj4gIAkvKgo+ICAJICogU3RhcnQgY2FwdHVyaW5n IHRoZSBjb3JyZWN0YWJsZSBhbmQgdW5jb3JyZWN0YWJsZSBlcnJvcnMuIEEgd3JpdGUgb2YKPiAg CSAqIDAgc3RhcnRzIHRoZSBjb3VudGVycy4KPiAgCSAqLwo+IC0Jd3JpdGVsKDB4MCwgYmFzZWFk ZHIgKyBFQ0NfQ1RSTF9PRlNUKTsKPiArCWlmICghKHByaXYtPnBfZGF0YS0+cXVpcmtzICYgRERS X0VDQ19JTlRSX1NVUFBPUlQpKQo+ICsJCXdyaXRlbCgweDAsIGJhc2VhZGRyICsgRUNDX0NUUkxf T0ZTVCk7Cj4gIAlyZXR1cm4gcmM7Cj4gIAo+ICBmcmVlX2VkYWNfbWM6Cj4gQEAgLTU1OCw4ICsx MzgwLDE2IEBAIHN0YXRpYyBpbnQgc3lucHNfZWRhY19tY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1f ZGV2aWNlICpwZGV2KQo+ICBzdGF0aWMgaW50IHN5bnBzX2VkYWNfbWNfcmVtb3ZlKHN0cnVjdCBw bGF0Zm9ybV9kZXZpY2UgKnBkZXYpCj4gIHsKPiAgCXN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSA9 IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwo+ICsJc3RydWN0IHN5bnBzX2VkYWNfcHJpdiAq cHJpdjsKPiAgCj4gKwlwcml2ID0gbWNpLT5wdnRfaW5mbzsKPiArCWlmIChwcml2LT5wX2RhdGEt PnF1aXJrcyAmIEREUl9FQ0NfSU5UUl9TVVBQT1JUKQo+ICsJCS8qIERpc2FibGUgVUUvQ0UgSW50 ZXJydXB0cyAqLwo+ICsJCXdyaXRlbCgoRERSX1FPU1VFX01BU0sgfCBERFJfUU9TQ0VfTUFTSyks Cj4gKwkJCXByaXYtPmJhc2VhZGRyICsgRERSX1FPU19JUlFfREJfT0ZTVCk7Cj4gIAllZGFjX21j X2RlbF9tYygmcGRldi0+ZGV2KTsKPiArCWlmIChwcml2LT5wX2RhdGEtPnF1aXJrcyAmIEREUl9F Q0NfREFUQV9QT0lTT05fU1VQUE9SVCkKPiArCQlzeW5wc19lZGFjX3JlbW92ZV9zeXNmc19hdHRy aWJ1dGVzKG1jaSk7Cj4gIAllZGFjX21jX2ZyZWUobWNpKTsKPiAgCj4gIAlyZXR1cm4gMDsKPiAt LSAKPiAyLjEuMQo+IAo+Cg==