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: [v3,3/4] edac: synopsys: Add EDAC ECC support for ZynqMP DDRC From: Manish Narani Message-Id: <1533214282-9977-4-git-send-email-manish.narani@xilinx.com> Date: Thu, 2 Aug 2018 18:21:21 +0530 To: robh+dt@kernel.org, mark.rutland@arm.com, catalin.marinas@arm.com, will.deacon@arm.com, michal.simek@xilinx.com, bp@alien8.de, 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 Cc: 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, Manish Narani List-ID: VGhpcyBwYXRjaCBhZGRzIEVEQUMgRUNDIHN1cHBvcnQgZm9yIFp5bnFNUCBERFJDIElQLiBUaGUg cGF0Y2ggYWxzbyBhZGRzCnN1cHBvcnQgZm9yIEVDQyBFcnJvciBJbmplY3Rpb24gaW4gWnlucU1Q LiBUaGUgY29ycmVjdGVkIGFuZCB1bmNvcnJlY3RlZAplcnJvciBpbnRlcnJ1cHRzIHN1cHBvcnQg aXMgYWRkZWQgaW4gdGhpcyBwYXRjaC4gVGhlIFJvdywgQ29sdW1uLCBCYW5rLApCYW5rIEdyb3Vw IGFuZCBSYW5rIGJpdHMgcG9zaXRpb25zIGFyZSBkZXRlcm1pbmVkIHZpYSBBZGRyZXNzIE1hcApy ZWdpc3RlcnMgb2YgU3lub3BzeXMgRERSQy4KClNpZ25lZC1vZmYtYnk6IE1hbmlzaCBOYXJhbmkg PG1hbmlzaC5uYXJhbmlAeGlsaW54LmNvbT4KLS0tCiBkcml2ZXJzL2VkYWMvS2NvbmZpZyAgICAg ICAgIHwgICAyICstCiBkcml2ZXJzL2VkYWMvc3lub3BzeXNfZWRhYy5jIHwgODU3ICsrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKy0KIDIgZmlsZXMgY2hhbmdlZCwgODQx IGluc2VydGlvbnMoKyksIDE4IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRh Yy9LY29uZmlnIGIvZHJpdmVycy9lZGFjL0tjb25maWcKaW5kZXggNTczMDRiMi4uYjFmYzdhMTYg MTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWRhYy9LY29uZmlnCisrKyBiL2RyaXZlcnMvZWRhYy9LY29u ZmlnCkBAIC00NDEsNyArNDQxLDcgQEAgY29uZmlnIEVEQUNfQUxURVJBX1NETU1DCiAKIGNvbmZp ZyBFREFDX1NZTk9QU1lTCiAJdHJpc3RhdGUgIlN5bm9wc3lzIEREUiBNZW1vcnkgQ29udHJvbGxl ciIKLQlkZXBlbmRzIG9uIEFSQ0hfWllOUQorCWRlcGVuZHMgb24gQVJDSF9aWU5RIHx8IEFSTTY0 CiAJaGVscAogCSAgU3VwcG9ydCBmb3IgZXJyb3IgZGV0ZWN0aW9uIGFuZCBjb3JyZWN0aW9uIG9u IHRoZSBTeW5vcHN5cyBERFIKIAkgIG1lbW9yeSBjb250cm9sbGVyLgpkaWZmIC0tZ2l0IGEvZHJp dmVycy9lZGFjL3N5bm9wc3lzX2VkYWMuYyBiL2RyaXZlcnMvZWRhYy9zeW5vcHN5c19lZGFjLmMK aW5kZXggZDQ3OThlOC4uOGExYzMyNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9lZGFjL3N5bm9wc3lz X2VkYWMuYworKysgYi9kcml2ZXJzL2VkYWMvc3lub3BzeXNfZWRhYy5jCkBAIC0yMiw2ICsyMiw3 IEBACiAjaW5jbHVkZSA8bGludXgvZWRhYy5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgog I2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVy cnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAKICNpbmNsdWRlICJlZGFjX21vZHVsZS5o IgpAQCAtOTYsNiArOTcsMTcwIEBACiAjZGVmaW5lIFNDUlVCX01PREVfTUFTSwkJMHg3CiAjZGVm aW5lIFNDUlVCX01PREVfU0VDREVECTB4NAogCisvKiBERFIgRUNDIFF1aXJrcyAqLworI2RlZmlu ZSBERFJfRUNDX0lOVFJfU1VQUE9SVAlCSVQoMCkKKworLyogRERSIEVDQyBRdWlya3MgKi8KKyNk ZWZpbmUgRERSX0VDQ19JTlRSX1NVUFBPUlQJQklUKDApCisjZGVmaW5lIEREUl9FQ0NfREFUQV9Q T0lTT05fU1VQUE9SVCBCSVQoMSkKKworLyogWnlucU1QIEVuaGFuY2VkIEREUiBtZW1vcnkgY29u dHJvbGxlciByZWdpc3RlcnMgdGhhdCBhcmUgcmVsZXZhbnQgdG8gRUNDICovCisvKiBFQ0MgQ29u ZmlndXJhdGlvbiBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgRUNDX0NGRzBfT0ZTVAkweDcwCisjZGVm aW5lIEVDQ19DRkcxX09GU1QJMHg3NAorCisvKiBFQ0MgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVm aW5lIEVDQ19TVEFUX09GU1QJMHg3OAorCisvKiBFQ0MgQ2xlYXIgUmVnaXN0ZXIgKi8KKyNkZWZp bmUgRUNDX0NMUl9PRlNUCTB4N0MKKworLyogRUNDIEVycm9yIGNvdW50IFJlZ2lzdGVyICovCisj ZGVmaW5lIEVDQ19FUlJDTlRfT0ZTVAkweDgwCisKKy8qIEVDQyBDb3JyZWN0ZWQgRXJyb3IgQWRk cmVzcyBSZWdpc3RlciAqLworI2RlZmluZSBFQ0NfQ0VBRERSMF9PRlNUCTB4ODQKKyNkZWZpbmUg RUNDX0NFQUREUjFfT0ZTVAkweDg4CisKKy8qIEVDQyBTeW5kcm9tZSBSZWdpc3RlcnMgKi8KKyNk ZWZpbmUgRUNDX0NTWU5EMF9PRlNUCTB4OEMKKyNkZWZpbmUgRUNDX0NTWU5EMV9PRlNUCTB4OTAK KyNkZWZpbmUgRUNDX0NTWU5EMl9PRlNUCTB4OTQKKworLyogRUNDIEJpdCBNYXNrMCBBZGRyZXNz IFJlZ2lzdGVyICovCisjZGVmaW5lIEVDQ19CSVRNQVNLMF9PRlNUCTB4OTgKKyNkZWZpbmUgRUND X0JJVE1BU0sxX09GU1QJMHg5QworI2RlZmluZSBFQ0NfQklUTUFTSzJfT0ZTVAkweEEwCisKKy8q IEVDQyBVbkNvcnJlY3RlZCBFcnJvciBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lIEVDQ19V RUFERFIwX09GU1QJMHhBNAorI2RlZmluZSBFQ0NfVUVBRERSMV9PRlNUCTB4QTgKKworLyogRUND IFN5bmRyb21lIFJlZ2lzdGVycyAqLworI2RlZmluZSBFQ0NfVUVTWU5EMF9PRlNUCTB4QUMKKyNk ZWZpbmUgRUNDX1VFU1lORDFfT0ZTVAkweEIwCisjZGVmaW5lIEVDQ19VRVNZTkQyX09GU1QJMHhC NAorCisvKiBFQ0MgUG9pc29uIEFkZHJlc3MgUmVnICovCisjZGVmaW5lIEVDQ19QT0lTT04wX09G U1QJMHhCOAorI2RlZmluZSBFQ0NfUE9JU09OMV9PRlNUCTB4QkMKKworI2RlZmluZSBFQ0NfQURE Uk1BUDBfT0ZGU0VUCTB4MjAwCisKKy8qIENvbnRyb2wgcmVnaXN0ZXIgYml0ZmllbGQgZGVmaW5p dGlvbnMgKi8KKyNkZWZpbmUgRUNDX0NUUkxfQlVTV0lEVEhfTUFTSwkweDMwMDAKKyNkZWZpbmUg RUNDX0NUUkxfQlVTV0lEVEhfU0hJRlQJMTIKKyNkZWZpbmUgRUNDX0NUUkxfQ0xSX0NFX0VSUkNO VAlCSVQoMikKKyNkZWZpbmUgRUNDX0NUUkxfQ0xSX1VFX0VSUkNOVAlCSVQoMykKKworLyogRERS IENvbnRyb2wgUmVnaXN0ZXIgd2lkdGggZGVmaW5pdGlvbnMgICovCisjZGVmaW5lIEREUkNUTF9F V0RUSF8xNgkJMgorI2RlZmluZSBERFJDVExfRVdEVEhfMzIJCTEKKyNkZWZpbmUgRERSQ1RMX0VX RFRIXzY0CQkwCisKKy8qIEVDQyBzdGF0dXMgcmVnaXN0ZXIgZGVmaW5pdGlvbnMgKi8KKyNkZWZp bmUgRUNDX1NUQVRfVUVDTlRfTUFTSwkweEYwMDAwCisjZGVmaW5lIEVDQ19TVEFUX1VFQ05UX1NI SUZUCTE2CisjZGVmaW5lIEVDQ19TVEFUX0NFQ05UX01BU0sJMHhGMDAKKyNkZWZpbmUgRUNDX1NU QVRfQ0VDTlRfU0hJRlQJOAorI2RlZmluZSBFQ0NfU1RBVF9CSVROVU1fTUFTSwkweDdGCisKKy8q IEREUiBRT1MgSW50ZXJydXB0IHJlZ2lzdGVyIGRlZmluaXRpb25zICovCisjZGVmaW5lIEREUl9R T1NfSVJRX1NUQVRfT0ZTVAkweDIwMjAwCisjZGVmaW5lIEREUl9RT1NVRV9NQVNLCQkweDQKKyNk ZWZpbmUJRERSX1FPU0NFX01BU0sJCTB4MgorI2RlZmluZQlFQ0NfQ0VfVUVfSU5UUl9NQVNLCTB4 NgorI2RlZmluZSBERFJfUU9TX0lSUV9FTl9PRlNUICAgICAweDIwMjA4CisjZGVmaW5lIEREUl9R T1NfSVJRX0RCX09GU1QJMHgyMDIwQworCisvKiBFQ0MgQ29ycmVjdGVkIEVycm9yIFJlZ2lzdGVy IE1hc2sgYW5kIFNoaWZ0cyovCisjZGVmaW5lIEVDQ19DRUFERFIwX1JXX01BU0sJMHgzRkZGRgor I2RlZmluZSBFQ0NfQ0VBRERSMF9STktfTUFTSwlCSVQoMjQpCisjZGVmaW5lIEVDQ19DRUFERFIx X0JOS0dSUF9NQVNLCTB4MzAwMDAwMAorI2RlZmluZSBFQ0NfQ0VBRERSMV9CTktOUl9NQVNLCTB4 NzAwMDAKKyNkZWZpbmUgRUNDX0NFQUREUjFfQkxLTlJfTUFTSwkweEZGRgorI2RlZmluZSBFQ0Nf Q0VBRERSMV9CTktHUlBfU0hJRlQJMjQKKyNkZWZpbmUgRUNDX0NFQUREUjFfQk5LTlJfU0hJRlQJ MTYKKworLyogRUNDIFBvaXNvbiByZWdpc3RlciBzaGlmdHMgKi8KKyNkZWZpbmUgRUNDX1BPSVNP TjBfUkFOS19TSElGVCAyNAorI2RlZmluZSBFQ0NfUE9JU09OMV9CQU5LR1JQX1NISUZUIDI4Cisj ZGVmaW5lIEVDQ19QT0lTT04xX0JBTktOUl9TSElGVCAyNAorCisvKiBERFIgTWVtb3J5IHR5cGUg ZGVmaW5lcyAqLworI2RlZmluZSBNRU1fVFlQRV9ERFIzCQkweDEKKyNkZWZpbmUgTUVNX1RZUEVf TFBERFIzCQkweDgKKyNkZWZpbmUgTUVNX1RZUEVfRERSMgkJMHg0CisjZGVmaW5lIE1FTV9UWVBF X0REUjQJCTB4MTAKKyNkZWZpbmUgTUVNX1RZUEVfTFBERFI0CQkweDIwCisKKy8qIEREUkMgU29m dHdhcmUgY29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSBERFJDX1NXQ1RMIDB4MzIwCisKKy8q IEREUkMgRUNDIENFICYgVUUgcG9pc29uIG1hc2sgKi8KKyNkZWZpbmUgRUNDX0NFUE9JU09OX01B U0sgMHgzCisjZGVmaW5lIEVDQ19VRVBPSVNPTl9NQVNLIDB4MQorCisvKiBERFJDIERldmljZSBj b25maWcgbWFza3MgKi8KKyNkZWZpbmUgRERSQ19NU1RSX0RFVl9DT05GSUdfTUFTSyAweEMwMDAw MDAwCisjZGVmaW5lIEREUkNfTVNUUl9ERVZfQ09ORklHX1NISUZUCTMwCisjZGVmaW5lIEREUkNf TVNUUl9ERVZfQ09ORklHX1g0X01BU0sJMHgwCisjZGVmaW5lIEREUkNfTVNUUl9ERVZfQ09ORklH X1g4X01BU0sJMHgxCisjZGVmaW5lIEREUkNfTVNUUl9ERVZfQ09ORklHX1gxNl9NQVNLCTB4Mgor I2RlZmluZSBERFJDX01TVFJfREVWX0NPTkZJR19YMzJfTUFTSwkweDMKKworI2RlZmluZSBERFJf TUFYX1JPV19TSElGVAkxOAorI2RlZmluZSBERFJfTUFYX0NPTF9TSElGVAkxNAorI2RlZmluZSBE RFJfTUFYX0JBTktfU0hJRlQJMworI2RlZmluZSBERFJfTUFYX0JBTktHUlBfU0hJRlQJMgorCisj ZGVmaW5lIFJPV19NQVhfVkFMX01BU0sJMHhGCisjZGVmaW5lIENPTF9NQVhfVkFMX01BU0sJMHhG CisjZGVmaW5lIEJBTktfTUFYX1ZBTF9NQVNLCTB4MUYKKyNkZWZpbmUgQkFOS0dSUF9NQVhfVkFM X01BU0sJMHgxRgorI2RlZmluZSBSQU5LX01BWF9WQUxfTUFTSwkweDFGCisKKyNkZWZpbmUgUk9X X0IwX0JBU0UJCTYKKyNkZWZpbmUgUk9XX0IxX0JBU0UJCTcKKyNkZWZpbmUgUk9XX0IyX0JBU0UJ CTgKKyNkZWZpbmUgUk9XX0IzX0JBU0UJCTkKKyNkZWZpbmUgUk9XX0I0X0JBU0UJCTEwCisjZGVm aW5lIFJPV19CNV9CQVNFCQkxMQorI2RlZmluZSBST1dfQjZfQkFTRQkJMTIKKyNkZWZpbmUgUk9X X0I3X0JBU0UJCTEzCisjZGVmaW5lIFJPV19COF9CQVNFCQkxNAorI2RlZmluZSBST1dfQjlfQkFT RQkJMTUKKyNkZWZpbmUgUk9XX0IxMF9CQVNFCQkxNgorI2RlZmluZSBST1dfQjExX0JBU0UJCTE3 CisjZGVmaW5lIFJPV19CMTJfQkFTRQkJMTgKKyNkZWZpbmUgUk9XX0IxM19CQVNFCQkxOQorI2Rl ZmluZSBST1dfQjE0X0JBU0UJCTIwCisjZGVmaW5lIFJPV19CMTVfQkFTRQkJMjEKKyNkZWZpbmUg Uk9XX0IxNl9CQVNFCQkyMgorI2RlZmluZSBST1dfQjE3X0JBU0UJCTIzCisKKyNkZWZpbmUgQ09M X0IyX0JBU0UJCTIKKyNkZWZpbmUgQ09MX0IzX0JBU0UJCTMKKyNkZWZpbmUgQ09MX0I0X0JBU0UJ CTQKKyNkZWZpbmUgQ09MX0I1X0JBU0UJCTUKKyNkZWZpbmUgQ09MX0I2X0JBU0UJCTYKKyNkZWZp bmUgQ09MX0I3X0JBU0UJCTcKKyNkZWZpbmUgQ09MX0I4X0JBU0UJCTgKKyNkZWZpbmUgQ09MX0I5 X0JBU0UJCTkKKyNkZWZpbmUgQ09MX0IxMF9CQVNFCQkxMAorI2RlZmluZSBDT0xfQjExX0JBU0UJ CTExCisjZGVmaW5lIENPTF9CMTJfQkFTRQkJMTIKKyNkZWZpbmUgQ09MX0IxM19CQVNFCQkxMwor CisjZGVmaW5lIEJBTktfQjBfQkFTRQkJMgorI2RlZmluZSBCQU5LX0IxX0JBU0UJCTMKKyNkZWZp bmUgQkFOS19CMl9CQVNFCQk0CisKKyNkZWZpbmUgQkFOS0dSUF9CMF9CQVNFCQkyCisjZGVmaW5l IEJBTktHUlBfQjFfQkFTRQkJMworCisjZGVmaW5lIFJBTktfQjBfQkFTRQkJNgorCiAvKioKICAq IHN0cnVjdCBlY2NfZXJyb3JfaW5mbyAtIEVDQyBlcnJvciBsb2cgaW5mb3JtYXRpb24KICAqIEBy b3c6CVJvdyBudW1iZXIKQEAgLTEwMyw2ICsyNjgsOCBAQAogICogQGJhbms6CUJhbmsgbnVtYmVy CiAgKiBAYml0cG9zOglCaXQgcG9zaXRpb24KICAqIEBkYXRhOglEYXRhIGNhdXNpbmcgdGhlIGVy cm9yCisgKiBAYmFua2dycG5yOglCYW5rIGdyb3VwIG51bWJlcgorICogQGJsa25yOglCbG9jayBu dW1iZXIKICAqLwogc3RydWN0IGVjY19lcnJvcl9pbmZvIHsKIAl1MzIgcm93OwpAQCAtMTEwLDYg KzI3Nyw4IEBAIHN0cnVjdCBlY2NfZXJyb3JfaW5mbyB7CiAJdTMyIGJhbms7CiAJdTMyIGJpdHBv czsKIAl1MzIgZGF0YTsKKwl1MzIgYmFua2dycG5yOworCXUzMiBibGtucjsKIH07CiAKIC8qKgpA QCAtMTI4LDEyICsyOTcsMTggQEAgc3RydWN0IHN5bnBzX2VjY19zdGF0dXMgewogCiAvKioKICAq IHN0cnVjdCBzeW5wc19lZGFjX3ByaXYgLSBERFIgbWVtb3J5IGNvbnRyb2xsZXIgcHJpdmF0ZSBp bnN0YW5jZSBkYXRhCi0gKiBAYmFzZWFkZHI6CUJhc2UgYWRkcmVzcyBvZiB0aGUgRERSIGNvbnRy b2xsZXIKLSAqIEBtZXNzYWdlOglCdWZmZXIgZm9yIGZyYW1pbmcgdGhlIGV2ZW50IHNwZWNpZmlj IGluZm8KLSAqIEBzdGF0OglFQ0Mgc3RhdHVzIGluZm9ybWF0aW9uCi0gKiBAcF9kYXRhOglQb2lu dGVyIHRvIHBsYXRmb3JtIGRhdGEKLSAqIEBjZV9jbnQ6CUNvcnJlY3RhYmxlIEVycm9yIGNvdW50 Ci0gKiBAdWVfY250OglVbmNvcnJlY3RhYmxlIEVycm9yIGNvdW50CisgKiBAYmFzZWFkZHI6CQlC YXNlIGFkZHJlc3Mgb2YgdGhlIEREUiBjb250cm9sbGVyCisgKiBAbWVzc2FnZToJCUJ1ZmZlciBm b3IgZnJhbWluZyB0aGUgZXZlbnQgc3BlY2lmaWMgaW5mbworICogQHN0YXQ6CQlFQ0Mgc3RhdHVz IGluZm9ybWF0aW9uCisgKiBAcF9kYXRhOgkJUG9pbnRlciB0byBwbGF0Zm9ybSBkYXRhCisgKiBA Y2VfY250OgkJQ29ycmVjdGFibGUgRXJyb3IgY291bnQKKyAqIEB1ZV9jbnQ6CQlVbmNvcnJlY3Rh YmxlIEVycm9yIGNvdW50CisgKiBAcG9pc29uX2FkZHI6CURhdGEgcG9pc29uIGFkZHJlc3MKKyAq IEByb3dfc2hpZnQ6CQlWYWx1ZSBvZiByb3cgc2hpZnRzCisgKiBAY29sX3NoaWZ0OgkJVmFsdWUg b2YgY29sIHNoaWZ0cworICogQGJhbmtfc2hpZnQ6CQlWYWx1ZSBvZiBiYW5rIHNoaWZ0cworICog QGJhbmtncnBfc2hpZnQ6CVZhbHVlIG9mIGJhbmsgZ3JvdXAgc2hpZnRzCisgKiBAcmFua19zaGlm dDoJCVZhbHVlIG9mIHJhbmsgc2hpZnRzCiAgKi8KIHN0cnVjdCBzeW5wc19lZGFjX3ByaXYgewog CXZvaWQgX19pb21lbSAqYmFzZWFkZHI7CkBAIC0xNDIsNiArMzE3LDEyIEBAIHN0cnVjdCBzeW5w c19lZGFjX3ByaXYgewogCWNvbnN0IHN0cnVjdCBzeW5wc19wbGF0Zm9ybV9kYXRhICpwX2RhdGE7 CiAJdTMyIGNlX2NudDsKIAl1MzIgdWVfY250OworCXVsb25nIHBvaXNvbl9hZGRyOworCXUzMiBy b3dfc2hpZnRbMThdOworCXUzMiBjb2xfc2hpZnRbMTRdOworCXUzMiBiYW5rX3NoaWZ0WzNdOwor CXUzMiBiYW5rZ3JwX3NoaWZ0WzJdOworCXUzMiByYW5rX3NoaWZ0WzFdOwogfTsKIAogLyoqCkBA IC0xNjgsNyArMzQ5LDcgQEAgc3RydWN0IHN5bnBzX3BsYXRmb3JtX2RhdGEgewogICoKICAqIERl dGVybWluZXMgdGhlcmUgaXMgYW55IGVjYyBlcnJvciBvciBub3QKICAqCi0gKiBSZXR1cm46IG9u ZSBpZiB0aGVyZSBpcyBubyBlcnJvciBvdGhlcndpc2UgcmV0dXJucyB6ZXJvCisgKiBSZXR1cm46 IDEgaWYgdGhlcmUgaXMgbm8gZXJyb3Igb3RoZXJ3aXNlIHJldHVybnMgMAogICovCiBzdGF0aWMg aW50IHN5bnBzX2VkYWNfZ2V0ZXJyb3JfaW5mbyh2b2lkIF9faW9tZW0gKmJhc2UsCiAJCQkJICAg IHN0cnVjdCBzeW5wc19lY2Nfc3RhdHVzICpwKQpAQCAtMjE2LDYgKzM5Nyw2NSBAQCBzdGF0aWMg aW50IHN5bnBzX2VkYWNfZ2V0ZXJyb3JfaW5mbyh2b2lkIF9faW9tZW0gKmJhc2UsCiB9CiAKIC8q KgorICogc3lucHNfZW5oX2VkYWNfZ2V0ZXJyb3JfaW5mbyAtIEdldCB0aGUgY3VycmVudCBlY2Mg ZXJyb3IgaW5mbworICogQGJhc2U6CVBvaW50ZXIgdG8gdGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUg ZGRyIG1lbW9yeSBjb250cm9sbGVyCisgKiBAcDoJCVBvaW50ZXIgdG8gdGhlIHN5bm9wc3lzIGVj YyBzdGF0dXMgc3RydWN0dXJlCisgKgorICogRGV0ZXJtaW5lcyB0aGVyZSBpcyBhbnkgZWNjIGVy cm9yIG9yIG5vdAorICoKKyAqIFJldHVybjogb25lIGlmIHRoZXJlIGlzIG5vIGVycm9yIG90aGVy d2lzZSByZXR1cm5zIHplcm8KKyAqLworc3RhdGljIGludCBzeW5wc19lbmhfZWRhY19nZXRlcnJv cl9pbmZvKHZvaWQgX19pb21lbSAqYmFzZSwKKwkJCQkJc3RydWN0IHN5bnBzX2VjY19zdGF0dXMg KnApCit7CisJdTMyIHJlZ3ZhbCwgY2xlYXJ2YWwgPSAwOworCisJcmVndmFsID0gcmVhZGwoYmFz ZSArIEVDQ19TVEFUX09GU1QpOworCWlmICghcmVndmFsKQorCQlyZXR1cm4gMTsKKworCXAtPmNl X2NudCA9IChyZWd2YWwgJiBFQ0NfU1RBVF9DRUNOVF9NQVNLKSA+PiBFQ0NfU1RBVF9DRUNOVF9T SElGVDsKKwlwLT51ZV9jbnQgPSAocmVndmFsICYgRUNDX1NUQVRfVUVDTlRfTUFTSykgPj4gRUND X1NUQVRfVUVDTlRfU0hJRlQ7CisJcC0+Y2VpbmZvLmJpdHBvcyA9IChyZWd2YWwgJiBFQ0NfU1RB VF9CSVROVU1fTUFTSyk7CisKKwlyZWd2YWwgPSByZWFkbChiYXNlICsgRUNDX0NFQUREUjBfT0ZT VCk7CisJaWYgKCEocC0+Y2VfY250KSkKKwkJZ290byB1ZV9lcnI7CisKKwlwLT5jZWluZm8ucm93 ID0gKHJlZ3ZhbCAmIEVDQ19DRUFERFIwX1JXX01BU0spOworCXJlZ3ZhbCA9IHJlYWRsKGJhc2Ug KyBFQ0NfQ0VBRERSMV9PRlNUKTsKKwlwLT5jZWluZm8uYmFuayA9IChyZWd2YWwgJiBFQ0NfQ0VB RERSMV9CTktOUl9NQVNLKSA+PgorCQkJCQlFQ0NfQ0VBRERSMV9CTktOUl9TSElGVDsKKwlwLT5j ZWluZm8uYmFua2dycG5yID0gKHJlZ3ZhbCAmCUVDQ19DRUFERFIxX0JOS0dSUF9NQVNLKSA+Pgor CQkJCQlFQ0NfQ0VBRERSMV9CTktHUlBfU0hJRlQ7CisJcC0+Y2VpbmZvLmJsa25yID0gKHJlZ3Zh bCAmIEVDQ19DRUFERFIxX0JMS05SX01BU0spOworCXAtPmNlaW5mby5kYXRhID0gcmVhZGwoYmFz ZSArIEVDQ19DU1lORDBfT0ZTVCk7CisJZWRhY19kYmcoMywgImNlIGJpdCBwb3NpdGlvbjogJWQg ZGF0YTogJWRcbiIsIHAtPmNlaW5mby5iaXRwb3MsCisJCSBwLT5jZWluZm8uZGF0YSk7CisKK3Vl X2VycjoKKwlyZWd2YWwgPSByZWFkbChiYXNlICsgRUNDX1VFQUREUjBfT0ZTVCk7CisJaWYgKCEo cC0+dWVfY250KSkKKwkJZ290byBvdXQ7CisKKwlwLT51ZWluZm8ucm93ID0gKHJlZ3ZhbCAmIEVD Q19DRUFERFIwX1JXX01BU0spOworCXJlZ3ZhbCA9IHJlYWRsKGJhc2UgKyBFQ0NfVUVBRERSMV9P RlNUKTsKKwlwLT51ZWluZm8uYmFua2dycG5yID0gKHJlZ3ZhbCAmIEVDQ19DRUFERFIxX0JOS0dS UF9NQVNLKSA+PgorCQkJCQlFQ0NfQ0VBRERSMV9CTktHUlBfU0hJRlQ7CisJcC0+dWVpbmZvLmJh bmsgPSAocmVndmFsICYgRUNDX0NFQUREUjFfQk5LTlJfTUFTSykgPj4KKwkJCQkJRUNDX0NFQURE UjFfQk5LTlJfU0hJRlQ7CisJcC0+dWVpbmZvLmJsa25yID0gKHJlZ3ZhbCAmIEVDQ19DRUFERFIx X0JMS05SX01BU0spOworCXAtPnVlaW5mby5kYXRhID0gcmVhZGwoYmFzZSArIEVDQ19VRVNZTkQw X09GU1QpOworb3V0OgorCWNsZWFydmFsID0gRUNDX0NUUkxfQ0xSX0NFX0VSUiB8IEVDQ19DVFJM X0NMUl9DRV9FUlJDTlQ7CisJY2xlYXJ2YWwgfD0gRUNDX0NUUkxfQ0xSX1VFX0VSUiB8IEVDQ19D VFJMX0NMUl9VRV9FUlJDTlQ7CisJd3JpdGVsKGNsZWFydmFsLCBiYXNlICsgRUNDX0NMUl9PRlNU KTsKKwl3cml0ZWwoMHgwLCBiYXNlICsgRUNDX0NMUl9PRlNUKTsKKworCXJldHVybiAwOworfQor CisvKioKICAqIHN5bnBzX2VkYWNfaGFuZGxlX2Vycm9yIC0gSGFuZGxlIGNvbnRyb2xsZXIgZXJy b3IgdHlwZXMgQ0UgYW5kIFVFCiAgKiBAbWNpOglQb2ludGVyIHRvIHRoZSBlZGFjIG1lbW9yeSBj b250cm9sbGVyIGluc3RhbmNlCiAgKiBAcDoJCVBvaW50ZXIgdG8gdGhlIHN5bm9wc3lzIGVjYyBz dGF0dXMgc3RydWN0dXJlCkBAIC0yMzAsOSArNDcwLDE3IEBAIHN0YXRpYyB2b2lkIHN5bnBzX2Vk YWNfaGFuZGxlX2Vycm9yKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSwKIAogCWlmIChwLT5jZV9j bnQpIHsKIAkJcGluZiA9ICZwLT5jZWluZm87Ci0JCXNucHJpbnRmKHByaXYtPm1lc3NhZ2UsIFNZ TlBTX0VEQUNfTVNHX1NJWkUsCi0JCQkgIkREUiBFQ0MgZXJyb3IgdHlwZSA6JXMgUm93ICVkIEJh bmsgJWQgQ29sICVkICIsCi0JCQkgIkNFIiwgcGluZi0+cm93LCBwaW5mLT5iYW5rLCBwaW5mLT5j b2wpOworCQlpZiAocHJpdi0+cF9kYXRhLT5xdWlya3MgPT0gMCkKKwkJCXNucHJpbnRmKHByaXYt Pm1lc3NhZ2UsIFNZTlBTX0VEQUNfTVNHX1NJWkUsCisJCQkJICJERFIgRUNDIGVycm9yIHR5cGUg OiVzIFJvdyAlZCBCYW5rICVkIENvbCAlZCAiLAorCQkJCSAiQ0UiLCBwaW5mLT5yb3csIHBpbmYt PmJhbmssIHBpbmYtPmNvbCk7CisJCWVsc2UKKwkJCXNucHJpbnRmKHByaXYtPm1lc3NhZ2UsIFNZ TlBTX0VEQUNfTVNHX1NJWkUsCisJCQkJICJERFIgRUNDIGVycm9yIHR5cGUgOiVzIFJvdyAlZCBC YW5rICVkIENvbCAlZCAiCisJCQkJICJCYW5rR3JvdXAgTnVtYmVyICVkIEJsb2NrIE51bWJlciAl ZCIsCisJCQkJICJDRSIsIHBpbmYtPnJvdywgcGluZi0+YmFuaywgcGluZi0+Y29sLAorCQkJCSBw aW5mLT5iYW5rZ3JwbnIsIHBpbmYtPmJsa25yKTsKKwogCQllZGFjX21jX2hhbmRsZV9lcnJvcihI V19FVkVOVF9FUlJfQ09SUkVDVEVELCBtY2ksCiAJCQkJICAgICBwLT5jZV9jbnQsIDAsIDAsIDAs IDAsIDAsIC0xLAogCQkJCSAgICAgcHJpdi0+bWVzc2FnZSwgIiIpOwpAQCAtMjQwLDkgKzQ4OCwx NyBAQCBzdGF0aWMgdm9pZCBzeW5wc19lZGFjX2hhbmRsZV9lcnJvcihzdHJ1Y3QgbWVtX2N0bF9p bmZvICptY2ksCiAKIAlpZiAocC0+dWVfY250KSB7CiAJCXBpbmYgPSAmcC0+dWVpbmZvOwotCQlz bnByaW50Zihwcml2LT5tZXNzYWdlLCBTWU5QU19FREFDX01TR19TSVpFLAotCQkJICJERFIgRUND IGVycm9yIHR5cGUgOiVzIFJvdyAlZCBCYW5rICVkIENvbCAlZCAiLAotCQkJICJVRSIsIHBpbmYt PnJvdywgcGluZi0+YmFuaywgcGluZi0+Y29sKTsKKwkJaWYgKHByaXYtPnBfZGF0YS0+cXVpcmtz ID09IDApCisJCQlzbnByaW50Zihwcml2LT5tZXNzYWdlLCBTWU5QU19FREFDX01TR19TSVpFLAor CQkJCSAiRERSIEVDQyBlcnJvciB0eXBlIDolcyBSb3cgJWQgQmFuayAlZCBDb2wgJWQgIiwKKwkJ CQkiVUUiLCBwaW5mLT5yb3csIHBpbmYtPmJhbmssIHBpbmYtPmNvbCk7CisJCWVsc2UKKwkJCXNu cHJpbnRmKHByaXYtPm1lc3NhZ2UsIFNZTlBTX0VEQUNfTVNHX1NJWkUsCisJCQkJICJERFIgRUND IGVycm9yIHR5cGUgOiVzIFJvdyAlZCBCYW5rICVkIENvbCAlZCAiCisJCQkJICJCYW5rR3JvdXAg TnVtYmVyICVkIEJsb2NrIE51bWJlciAlZCIsCisJCQkJICJVRSIsIHBpbmYtPnJvdywgcGluZi0+ YmFuaywgcGluZi0+Y29sLAorCQkJCSBwaW5mLT5iYW5rZ3JwbnIsIHBpbmYtPmJsa25yKTsKKwog CQllZGFjX21jX2hhbmRsZV9lcnJvcihIV19FVkVOVF9FUlJfVU5DT1JSRUNURUQsIG1jaSwKIAkJ CQkgICAgIHAtPnVlX2NudCwgMCwgMCwgMCwgMCwgMCwgLTEsCiAJCQkJICAgICBwcml2LT5tZXNz YWdlLCAiIik7CkBAIC0yNTIsNiArNTA4LDQxIEBAIHN0YXRpYyB2b2lkIHN5bnBzX2VkYWNfaGFu ZGxlX2Vycm9yKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSwKIH0KIAogLyoqCisgKiBzeW5wc19l ZGFjX2ludHJfaGFuZGxlciAtIHN5bnBzIGVkYWMgaXNyCisgKiBAaXJxOiAgICAgICAgaXJxIG51 bWJlcgorICogQGRldl9pZDogICAgIGRldmljZSBpZCBwb25pdGVyCisgKgorICogVGhpcyBpcyB0 aGUgSXNyIHJvdXRpbmUgY2FsbGVkIGJ5IGVkYWMgY29yZSBpbnRlcnJ1cHQgdGhyZWFkLgorICog VXNlZCB0byBjaGVjayBhbmQgcG9zdCBFQ0MgZXJyb3JzLgorICoKKyAqIFJldHVybjogSVJRX05P TkUsIGlmIGludGVycnVwdCBub3Qgc2V0IG9yIElSUV9IQU5ETEVEIG90aGVyd2lzZQorICovCitz dGF0aWMgaXJxcmV0dXJuX3Qgc3lucHNfZWRhY19pbnRyX2hhbmRsZXIoaW50IGlycSwgdm9pZCAq ZGV2X2lkKQoreworCXN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSA9IGRldl9pZDsKKwlzdHJ1Y3Qg c3lucHNfZWRhY19wcml2ICpwcml2ID0gbWNpLT5wdnRfaW5mbzsKKwlpbnQgc3RhdHVzLCByZWd2 YWw7CisKKwlyZWd2YWwgPSByZWFkbChwcml2LT5iYXNlYWRkciArIEREUl9RT1NfSVJRX1NUQVRf T0ZTVCkgJgorCQkJKEREUl9RT1NDRV9NQVNLIHwgRERSX1FPU1VFX01BU0spOworCWlmICghKHJl Z3ZhbCAmIEVDQ19DRV9VRV9JTlRSX01BU0spKQorCQlyZXR1cm4gSVJRX05PTkU7CisJc3RhdHVz ID0gcHJpdi0+cF9kYXRhLT5zeW5wc19lZGFjX2dldGVycm9yX2luZm8ocHJpdi0+YmFzZWFkZHIs CisJCQkJJnByaXYtPnN0YXQpOworCWlmIChzdGF0dXMpCisJCXJldHVybiBJUlFfTk9ORTsKKwor CXByaXYtPmNlX2NudCArPSBwcml2LT5zdGF0LmNlX2NudDsKKwlwcml2LT51ZV9jbnQgKz0gcHJp di0+c3RhdC51ZV9jbnQ7CisJc3lucHNfZWRhY19oYW5kbGVfZXJyb3IobWNpLCAmcHJpdi0+c3Rh dCk7CisKKwllZGFjX2RiZygzLCAiVG90YWwgZXJyb3IgY291bnQgY2UgJWQgdWUgJWRcbiIsCisJ CSBwcml2LT5jZV9jbnQsIHByaXYtPnVlX2NudCk7CisJd3JpdGVsKHJlZ3ZhbCwgcHJpdi0+YmFz ZWFkZHIgKyBERFJfUU9TX0lSUV9TVEFUX09GU1QpOworCXJldHVybiBJUlFfSEFORExFRDsKK30K KworLyoqCiAgKiBzeW5wc19lZGFjX2NoZWNrIC0gQ2hlY2sgY29udHJvbGxlciBmb3IgRUNDIGVy cm9ycwogICogQG1jaToJUG9pbnRlciB0byB0aGUgZWRhYyBtZW1vcnkgY29udHJvbGxlciBpbnN0 YW5jZQogICoKQEAgLTMwNyw2ICs1OTgsNDAgQEAgc3RhdGljIGVudW0gZGV2X3R5cGUgc3lucHNf ZWRhY19nZXRfZHR5cGUoY29uc3Qgdm9pZCBfX2lvbWVtICpiYXNlKQogfQogCiAvKioKKyAqIHN5 bnBzX2VuaF9lZGFjX2dldF9kdHlwZSAtIFJldHVybiB0aGUgY29udHJvbGxlciBtZW1vcnkgd2lk dGgKKyAqIEBiYXNlOglQb2ludGVyIHRvIHRoZSBkZHIgbWVtb3J5IGNvbnRyb2xsZXIgYmFzZSBh ZGRyZXNzCisgKgorICogR2V0IHRoZSBFREFDIGRldmljZSB0eXBlIHdpZHRoIGFwcHJvcHJpYXRl IGZvciB0aGUgY3VycmVudCBjb250cm9sbGVyCisgKiBjb25maWd1cmF0aW9uLgorICoKKyAqIFJl dHVybjogYSBkZXZpY2UgdHlwZSB3aWR0aCBlbnVtZXJhdGlvbi4KKyAqLworc3RhdGljIGVudW0g ZGV2X3R5cGUgc3lucHNfZW5oX2VkYWNfZ2V0X2R0eXBlKGNvbnN0IHZvaWQgX19pb21lbSAqYmFz ZSkKK3sKKwllbnVtIGRldl90eXBlIGR0OworCXUzMiB3aWR0aDsKKworCXdpZHRoID0gcmVhZGwo YmFzZSArIENUUkxfT0ZTVCk7CisJd2lkdGggPSAod2lkdGggJiBFQ0NfQ1RSTF9CVVNXSURUSF9N QVNLKSA+PgorCQlFQ0NfQ1RSTF9CVVNXSURUSF9TSElGVDsKKwlzd2l0Y2ggKHdpZHRoKSB7CisJ Y2FzZSBERFJDVExfRVdEVEhfMTY6CisJCWR0ID0gREVWX1gyOworCQlicmVhazsKKwljYXNlIERE UkNUTF9FV0RUSF8zMjoKKwkJZHQgPSBERVZfWDQ7CisJCWJyZWFrOworCWNhc2UgRERSQ1RMX0VX RFRIXzY0OgorCQlkdCA9IERFVl9YODsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZHQgPSBERVZf VU5LTk9XTjsKKwl9CisKKwlyZXR1cm4gZHQ7Cit9CisKKy8qKgogICogc3lucHNfZWRhY19nZXRf ZWNjc3RhdGUgLSBSZXR1cm4gdGhlIGNvbnRyb2xsZXIgZWNjIGVuYWJsZS9kaXNhYmxlIHN0YXR1 cwogICogQGJhc2U6CVBvaW50ZXIgdG8gdGhlIGRkciBtZW1vcnkgY29udHJvbGxlciBiYXNlIGFk ZHJlc3MKICAqCkBAIC0zMzIsNiArNjU3LDMyIEBAIHN0YXRpYyBib29sIHN5bnBzX2VkYWNfZ2V0 X2VjY3N0YXRlKHZvaWQgX19pb21lbSAqYmFzZSkKIH0KIAogLyoqCisgKiBzeW5wc19lbmhfZWRh Y19nZXRfZWNjc3RhdGUgLSBSZXR1cm4gdGhlIGNvbnRyb2xsZXIgZWNjIGVuYWJsZS9kaXNhYmxl IHN0YXR1cworICogQGJhc2U6CVBvaW50ZXIgdG8gdGhlIGRkciBtZW1vcnkgY29udHJvbGxlciBi YXNlIGFkZHJlc3MKKyAqCisgKiBHZXQgdGhlIEVDQyBlbmFibGUvZGlzYWJsZSBzdGF0dXMgZm9y IHRoZSBjb250cm9sbGVyCisgKgorICogUmV0dXJuOiBhIGVjYyBzdGF0dXMgYm9vbGVhbiBpLmUg dHJ1ZS9mYWxzZSAtIGVuYWJsZWQvZGlzYWJsZWQuCisgKi8KK3N0YXRpYyBib29sIHN5bnBzX2Vu aF9lZGFjX2dldF9lY2NzdGF0ZSh2b2lkIF9faW9tZW0gKmJhc2UpCit7CisJZW51bSBkZXZfdHlw ZSBkdDsKKwl1MzIgZWNjdHlwZTsKKwlib29sIHN0YXRlID0gZmFsc2U7CisKKwlkdCA9IHN5bnBz X2VuaF9lZGFjX2dldF9kdHlwZShiYXNlKTsKKwlpZiAoZHQgPT0gREVWX1VOS05PV04pCisJCXJl dHVybiBzdGF0ZTsKKworCWVjY3R5cGUgPSByZWFkbChiYXNlICsgRUNDX0NGRzBfT0ZTVCkgJiBT Q1JVQl9NT0RFX01BU0s7CisJaWYgKChlY2N0eXBlID09IFNDUlVCX01PREVfU0VDREVEKSAmJgor CSAgICAoKGR0ID09IERFVl9YMikgfHwgKGR0ID09IERFVl9YNCkgfHwgKGR0ID09IERFVl9YOCkp KQorCQlzdGF0ZSA9IHRydWU7CisKKwlyZXR1cm4gc3RhdGU7Cit9CisKKy8qKgogICogc3lucHNf ZWRhY19nZXRfbWVtc2l6ZSAtIHJlYWRzIHRoZSBzaXplIG9mIHRoZSBhdHRhY2hlZCBtZW1vcnkg ZGV2aWNlCiAgKgogICogUmV0dXJuOiB0aGUgbWVtb3J5IHNpemUgaW4gYnl0ZXMKQEAgLTM3MCw2 ICs3MjEsMzUgQEAgc3RhdGljIGVudW0gbWVtX3R5cGUgc3lucHNfZWRhY19nZXRfbXR5cGUoY29u c3Qgdm9pZCBfX2lvbWVtICpiYXNlKQogfQogCiAvKioKKyAqIHN5bnBzX2VuaF9lZGFjX2dldF9t dHlwZSAtIFJldHVybnMgY29udHJvbGxlciBtZW1vcnkgdHlwZQorICogQGJhc2U6CXBvaW50ZXIg dG8gdGhlIHN5bm9wc3lzIGVjYyBzdGF0dXMgc3RydWN0dXJlCisgKgorICogR2V0IHRoZSBFREFD IG1lbW9yeSB0eXBlIGFwcHJvcHJpYXRlIGZvciB0aGUgY3VycmVudCBjb250cm9sbGVyCisgKiBj b25maWd1cmF0aW9uLgorICoKKyAqIFJldHVybjogYSBtZW1vcnkgdHlwZSBlbnVtZXJhdGlvbi4K KyAqLworc3RhdGljIGVudW0gbWVtX3R5cGUgc3lucHNfZW5oX2VkYWNfZ2V0X210eXBlKGNvbnN0 IHZvaWQgX19pb21lbSAqYmFzZSkKK3sKKwllbnVtIG1lbV90eXBlIG10OworCXUzMiBtZW10eXBl OworCisJbWVtdHlwZSA9IHJlYWRsKGJhc2UgKyBDVFJMX09GU1QpOworCisJbXQgPSBNRU1fVU5L Tk9XTjsKKwlpZiAoKG1lbXR5cGUgJiBNRU1fVFlQRV9ERFIzKSB8fCAobWVtdHlwZSAmIE1FTV9U WVBFX0xQRERSMykpCisJCW10ID0gTUVNX0REUjM7CisJZWxzZSBpZiAobWVtdHlwZSAmIE1FTV9U WVBFX0REUjIpCisJCW10ID0gTUVNX1JERFIyOworCWVsc2UgaWYgKChtZW10eXBlICYgTUVNX1RZ UEVfTFBERFI0KSB8fCAobWVtdHlwZSAmIE1FTV9UWVBFX0REUjQpKQorCQltdCA9IE1FTV9ERFI0 OworCWVsc2UKKwkJbXQgPSBNRU1fRU1QVFk7CisKKwlyZXR1cm4gbXQ7Cit9CisKKy8qKgogICog c3lucHNfZWRhY19pbml0X2Nzcm93cyAtIEluaXRpYWxpemUgdGhlIGNzIHJvdyBkYXRhCiAgKiBA bWNpOglQb2ludGVyIHRvIHRoZSBlZGFjIG1lbW9yeSBjb250cm9sbGVyIGluc3RhbmNlCiAgKgpA QCAtNDM3LDggKzgxNywxMyBAQCBzdGF0aWMgaW50IHN5bnBzX2VkYWNfbWNfaW5pdChzdHJ1Y3Qg bWVtX2N0bF9pbmZvICptY2ksCiAJbWNpLT5kZXZfbmFtZSA9IFNZTlBTX0VEQUNfTU9EX1NUUklO RzsKIAltY2ktPm1vZF9uYW1lID0gU1lOUFNfRURBQ19NT0RfVkVSOwogCi0JZWRhY19vcF9zdGF0 ZSA9IEVEQUNfT1BTVEFURV9QT0xMOwotCW1jaS0+ZWRhY19jaGVjayA9IHN5bnBzX2VkYWNfY2hl Y2s7CisJaWYgKHByaXYtPnBfZGF0YS0+cXVpcmtzICYgRERSX0VDQ19JTlRSX1NVUFBPUlQpIHsK KwkJZWRhY19vcF9zdGF0ZSA9IEVEQUNfT1BTVEFURV9JTlQ7CisJfSBlbHNlIHsKKwkJZWRhY19v cF9zdGF0ZSA9IEVEQUNfT1BTVEFURV9QT0xMOworCQltY2ktPmVkYWNfY2hlY2sgPSBzeW5wc19l ZGFjX2NoZWNrOworCX0KKwogCW1jaS0+Y3RsX3BhZ2VfdG9fcGh5cyA9IE5VTEw7CiAKIAlzdGF0 dXMgPSBzeW5wc19lZGFjX2luaXRfY3Nyb3dzKG1jaSk7CkBAIC00NTQsMTMgKzgzOSw0MDkgQEAg c3RhdGljIGNvbnN0IHN0cnVjdCBzeW5wc19wbGF0Zm9ybV9kYXRhIHp5bnFfZWRhY19kZWYgPSB7 CiAJLnF1aXJrcwkJCQk9IDAsCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IHN5bnBzX3BsYXRm b3JtX2RhdGEgenlucW1wX2VuaF9lZGFjX2RlZiA9IHsKKwkuc3lucHNfZWRhY19nZXRlcnJvcl9p bmZvCT0gc3lucHNfZW5oX2VkYWNfZ2V0ZXJyb3JfaW5mbywKKwkuc3lucHNfZWRhY19nZXRfbXR5 cGUJCT0gc3lucHNfZW5oX2VkYWNfZ2V0X210eXBlLAorCS5zeW5wc19lZGFjX2dldF9kdHlwZQkJ PSBzeW5wc19lbmhfZWRhY19nZXRfZHR5cGUsCisJLnN5bnBzX2VkYWNfZ2V0X2VjY3N0YXRlCT0g c3lucHNfZW5oX2VkYWNfZ2V0X2VjY3N0YXRlLAorCS5xdWlya3MJCQkJPSAoRERSX0VDQ19JTlRS X1NVUFBPUlQgfAorCQkJCQkgICBERFJfRUNDX0RBVEFfUE9JU09OX1NVUFBPUlQpLAorfTsKKwog c3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgc3lucHNfZWRhY19tYXRjaFtdID0gewog CXsgLmNvbXBhdGlibGUgPSAieGxueCx6eW5xLWRkcmMtYTA1IiwgLmRhdGEgPSAodm9pZCAqKSZ6 eW5xX2VkYWNfZGVmIH0sCisJeyAuY29tcGF0aWJsZSA9ICJ4bG54LHp5bnFtcC1kZHJjLTIuNDBh IiwKKwkJCQkuZGF0YSA9ICh2b2lkICopJnp5bnFtcF9lbmhfZWRhY19kZWZ9LAogCXsgLyogZW5k IG9mIHRhYmxlICovIH0KIH07CiAKIE1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHN5bnBzX2VkYWNf bWF0Y2gpOwogCisjZGVmaW5lIHRvX21jaShrKSBjb250YWluZXJfb2Yoaywgc3RydWN0IG1lbV9j dGxfaW5mbywgZGV2KQorCisvKioKKyAqIGRkcl9wb2lzb25fc2V0dXAgLQl1cGRhdGUgcG9pc29u IHJlZ2lzdGVycworICogQHByaXY6CQlQb2ludGVyIHRvIHN5bnBzX2VkYWNfcHJpdiBzdHJ1Y3QK KyAqCisgKiBVcGRhdGUgcG9pc29uIHJlZ2lzdGVycyBhcyBwZXIgZGRyIG1hcHBpbmcKKyAqIFJl dHVybjogbm9uZS4KKyAqLworc3RhdGljIHZvaWQgZGRyX3BvaXNvbl9zZXR1cChzdHJ1Y3Qgc3lu cHNfZWRhY19wcml2ICpwcml2KQoreworCWludCBjb2wgPSAwLCByb3cgPSAwLCBiYW5rID0gMCwg YmFua2dycCA9IDAsIHJhbmsgPSAwLCByZWd2YWw7CisJaW50IGluZGV4OworCXVsb25nIGhpZl9h ZGRyID0gMDsKKworCWhpZl9hZGRyID0gcHJpdi0+cG9pc29uX2FkZHIgPj4gMzsKKworCWZvciAo aW5kZXggPSAwOyBpbmRleCA8IEREUl9NQVhfUk9XX1NISUZUOyBpbmRleCsrKSB7CisJCWlmIChw cml2LT5yb3dfc2hpZnRbaW5kZXhdKQorCQkJcm93IHw9ICgoKGhpZl9hZGRyID4+IHByaXYtPnJv d19zaGlmdFtpbmRleF0pICYKKwkJCQkJCUJJVCgwKSkgPDwgaW5kZXgpOworCQllbHNlCisJCQli cmVhazsKKwl9CisKKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBERFJfTUFYX0NPTF9TSElGVDsg aW5kZXgrKykgeworCQlpZiAocHJpdi0+Y29sX3NoaWZ0W2luZGV4XSB8fCBpbmRleCA8IDMpCisJ CQljb2wgfD0gKCgoaGlmX2FkZHIgPj4gcHJpdi0+Y29sX3NoaWZ0W2luZGV4XSkgJgorCQkJCQkJ QklUKDApKSA8PCBpbmRleCk7CisJCWVsc2UKKwkJCWJyZWFrOworCX0KKworCWZvciAoaW5kZXgg PSAwOyBpbmRleCA8IEREUl9NQVhfQkFOS19TSElGVDsgaW5kZXgrKykgeworCQlpZiAocHJpdi0+ YmFua19zaGlmdFtpbmRleF0pCisJCQliYW5rIHw9ICgoKGhpZl9hZGRyID4+IHByaXYtPmJhbmtf c2hpZnRbaW5kZXhdKSAmCisJCQkJCQlCSVQoMCkpIDw8IGluZGV4KTsKKwkJZWxzZQorCQkJYnJl YWs7CisJfQorCisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgRERSX01BWF9CQU5LR1JQX1NISUZU OyBpbmRleCsrKSB7CisJCWlmIChwcml2LT5iYW5rZ3JwX3NoaWZ0W2luZGV4XSkKKwkJCWJhbmtn cnAgfD0gKCgoaGlmX2FkZHIgPj4gcHJpdi0+YmFua2dycF9zaGlmdFtpbmRleF0pCisJCQkJCQkm IEJJVCgwKSkgPDwgaW5kZXgpOworCQllbHNlCisJCQlicmVhazsKKwl9CisKKwlpZiAocHJpdi0+ cmFua19zaGlmdFswXSkKKwkJcmFuayA9IChoaWZfYWRkciA+PiBwcml2LT5yYW5rX3NoaWZ0WzBd KSAmIEJJVCgwKTsKKworCXJlZ3ZhbCA9IChyYW5rIDw8IEVDQ19QT0lTT04wX1JBTktfU0hJRlQp IHwgY29sOworCXdyaXRlbChyZWd2YWwsIHByaXYtPmJhc2VhZGRyICsgRUNDX1BPSVNPTjBfT0ZT VCk7CisJcmVndmFsID0gKGJhbmtncnAgPDwgRUNDX1BPSVNPTjFfQkFOS0dSUF9TSElGVCkgfAor CQkJIChiYW5rIDw8IEVDQ19QT0lTT04xX0JBTktOUl9TSElGVCkgfCByb3c7CisJd3JpdGVsKHJl Z3ZhbCwgcHJpdi0+YmFzZWFkZHIgKyBFQ0NfUE9JU09OMV9PRlNUKTsKK30KKworLyoqCisgKiBp bmplY3RfZGF0YV9lcnJvcl9zaG93IC0gR2V0IFBvaXNvbjAgJiAxIHJlZ2lzdGVyIGNvbnRlbnRz CisgKiBAZGV2OglQb2ludGVyIHRvIHRoZSBkZXZpY2Ugc3RydWN0CisgKiBAbWF0dHI6CVBvaW50 ZXIgdG8gZGV2aWNlIGF0dHJpYnV0ZXMKKyAqIEBkYXRhOglQb2ludGVyIHRvIHVzZXIgZGF0YQor ICoKKyAqIEdldCB0aGUgUG9pc29uMCBhbmQgUG9pc29uMSByZWdpc3RlciBjb250ZW50cworICog UmV0dXJuOiBOdW1iZXIgb2YgYnl0ZXMgY29waWVkLgorICovCitzdGF0aWMgc3NpemVfdCBpbmpl Y3RfZGF0YV9lcnJvcl9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJICAgICAgc3RydWN0 IGRldmljZV9hdHRyaWJ1dGUgKm1hdHRyLAorCQkJCQkgICAgICBjaGFyICpkYXRhKQoreworCXN0 cnVjdCBtZW1fY3RsX2luZm8gKm1jaSA9IHRvX21jaShkZXYpOworCXN0cnVjdCBzeW5wc19lZGFj X3ByaXYgKnByaXYgPSBtY2ktPnB2dF9pbmZvOworCisJcmV0dXJuIHNwcmludGYoZGF0YSwgIlBv aXNvbjAgQWRkcjogMHglMDh4XG5cclBvaXNvbjEgQWRkcjogMHglMDh4XG5cciIKKwkJCSJFcnJv ciBpbmplY3Rpb24gQWRkcmVzczogMHglbHhcblxyIiwKKwkJCXJlYWRsKHByaXYtPmJhc2VhZGRy ICsgRUNDX1BPSVNPTjBfT0ZTVCksCisJCQlyZWFkbChwcml2LT5iYXNlYWRkciArIEVDQ19QT0lT T04xX09GU1QpLAorCQkJcHJpdi0+cG9pc29uX2FkZHIpOworfQorCisvKioKKyAqIGluamVjdF9k YXRhX2Vycm9yX3N0b3JlIC0gQ29uZmlndXJlIFBvaXNvbjAgUG9pc29uMSByZWdpc3RlcnMKKyAq IEBkZXY6CVBvaW50ZXIgdG8gdGhlIGRldmljZSBzdHJ1Y3QKKyAqIEBtYXR0cjoJUG9pbnRlciB0 byBkZXZpY2UgYXR0cmlidXRlcworICogQGRhdGE6CVBvaW50ZXIgdG8gdXNlciBkYXRhCisgKiBA Y291bnQ6CXJlYWQgdGhlIHNpemUgYnl0ZXMgZnJvbSBidWZmZXIKKyAqCisgKiBDb25maWd1cmVz IHRoZSBQb2lzb24wIGFuZCBQb2lzb24xIHJlZ2lzdGVyIGNvbnRlbnRzIGFzIHBlciB1c2VyIGdp dmVuCisgKiBhZGRyZXNzCisgKiBSZXR1cm46IE51bWJlciBvZiBieXRlcyBjb3BpZWQuCisgKi8K K3N0YXRpYyBzc2l6ZV90IGluamVjdF9kYXRhX2Vycm9yX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRl diwKKwkJCQkJICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICptYXR0ciwKKwkJCQkJICAg ICAgIGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgbWVtX2N0bF9p bmZvICptY2kgPSB0b19tY2koZGV2KTsKKwlzdHJ1Y3Qgc3lucHNfZWRhY19wcml2ICpwcml2ID0g bWNpLT5wdnRfaW5mbzsKKworCWlmIChrc3RydG91bChkYXRhLCAwLCAmcHJpdi0+cG9pc29uX2Fk ZHIpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRkcl9wb2lzb25fc2V0dXAocHJpdik7CisKKwly ZXR1cm4gY291bnQ7Cit9CisKKy8qKgorICogaW5qZWN0X2RhdGFfcG9pc29uX3Nob3cgLSBTaG93 cyB0eXBlIG9mIERhdGEgcG9pc29uCisgKiBAZGV2OglQb2ludGVyIHRvIHRoZSBkZXZpY2Ugc3Ry dWN0CisgKiBAbWF0dHI6CVBvaW50ZXIgdG8gZGV2aWNlIGF0dHJpYnV0ZXMKKyAqIEBkYXRhOglQ b2ludGVyIHRvIHVzZXIgZGF0YQorICoKKyAqIFNob3dzIHRoZSB0eXBlIG9mIEVycm9yIGluamVj dGlvbiBlbmFibGVkLCBlaXRoZXIgVUUgb3IgQ0UKKyAqIFJldHVybjogTnVtYmVyIG9mIGJ5dGVz IGNvcGllZC4KKyAqLworc3RhdGljIHNzaXplX3QgaW5qZWN0X2RhdGFfcG9pc29uX3Nob3coc3Ry dWN0IGRldmljZSAqZGV2LAorCQkJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqbWF0 dHIsCisJCQkJCSAgICAgIGNoYXIgKmRhdGEpCit7CisJc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNp ID0gdG9fbWNpKGRldik7CisJc3RydWN0IHN5bnBzX2VkYWNfcHJpdiAqcHJpdiA9IG1jaS0+cHZ0 X2luZm87CisKKwlyZXR1cm4gc3ByaW50ZihkYXRhLCAiRGF0YSBQb2lzb25pbmc6ICVzXG5cciIs CisJCQkoKChyZWFkbChwcml2LT5iYXNlYWRkciArIEVDQ19DRkcxX09GU1QpKSAmIDB4MykgPT0g MHgzKQorCQkJPyAoIkNvcnJlY3RhYmxlIEVycm9yIikgOiAoIlVuQ29ycmVjdGFibGUgRXJyb3Ii KSk7Cit9CisKKy8qKgorICogaW5qZWN0X2RhdGFfcG9pc29uX3N0b3JlIC0gRW5ibGVzIERhdGEg cG9pc29uIENFL1VFCisgKiBAZGV2OglQb2ludGVyIHRvIHRoZSBkZXZpY2Ugc3RydWN0CisgKiBA bWF0dHI6CVBvaW50ZXIgdG8gZGV2aWNlIGF0dHJpYnV0ZXMKKyAqIEBkYXRhOglQb2ludGVyIHRv IHVzZXIgZGF0YQorICogQGNvdW50OglyZWFkIHRoZSBzaXplIGJ5dGVzIGZyb20gYnVmZmVyCisg KgorICogRW5hYmxlcyB0aGUgQ0Ugb3IgVUUgRGF0YSBwb2lzb24KKyAqIFJldHVybjogTnVtYmVy IG9mIGJ5dGVzIGNvcGllZC4KKyAqLworc3RhdGljIHNzaXplX3QgaW5qZWN0X2RhdGFfcG9pc29u X3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0 cmlidXRlICptYXR0ciwKKwkJCQkJICAgICAgIGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBjb3Vu dCkKK3sKKwlzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2kgPSB0b19tY2koZGV2KTsKKwlzdHJ1Y3Qg c3lucHNfZWRhY19wcml2ICpwcml2ID0gbWNpLT5wdnRfaW5mbzsKKworCXdyaXRlbCgwLCBwcml2 LT5iYXNlYWRkciArIEREUkNfU1dDVEwpOworCWlmIChzdHJuY21wKGRhdGEsICJDRSIsIDIpID09 IDApCisJCXdyaXRlbChFQ0NfQ0VQT0lTT05fTUFTSywgcHJpdi0+YmFzZWFkZHIgKyBFQ0NfQ0ZH MV9PRlNUKTsKKwllbHNlCisJCXdyaXRlbChFQ0NfVUVQT0lTT05fTUFTSywgcHJpdi0+YmFzZWFk ZHIgKyBFQ0NfQ0ZHMV9PRlNUKTsKKwl3cml0ZWwoMSwgcHJpdi0+YmFzZWFkZHIgKyBERFJDX1NX Q1RMKTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIERFVklDRV9BVFRSX1JXKGluamVj dF9kYXRhX2Vycm9yKTsKK3N0YXRpYyBERVZJQ0VfQVRUUl9SVyhpbmplY3RfZGF0YV9wb2lzb24p OworCisvKioKKyAqIHN5bnBzX2VkYWNfY3JlYXRlX3N5c2ZzX2F0dHJpYnV0ZXMgLSBDcmVhdGUg c3lzZnMgZW50cmllcworICogQG1jaToJUG9pbnRlciB0byB0aGUgZWRhYyBtZW1vcnkgY29udHJv bGxlciBpbnN0YW5jZQorICoKKyAqIENyZWF0ZSBzeXNmcyBhdHRyaWJ1dGVzIGZvciBpbmplY3Rp bmcgRUNDIGVycm9ycyB1c2luZyBkYXRhIHBvaXNvbi4KKyAqCisgKiBSZXR1cm46IDAgaWYgc3lz ZnMgY3JlYXRpb24gd2FzIHN1Y2Nlc3NmdWwsIGVsc2UgcmV0dXJuIG5lZ2F0aXZlIGVycm9yIGNv ZGUuCisgKi8KK3N0YXRpYyBpbnQgc3lucHNfZWRhY19jcmVhdGVfc3lzZnNfYXR0cmlidXRlcyhz dHJ1Y3QgbWVtX2N0bF9pbmZvICptY2kpCit7CisJaW50IHJjOworCisJcmMgPSBkZXZpY2VfY3Jl YXRlX2ZpbGUoJm1jaS0+ZGV2LCAmZGV2X2F0dHJfaW5qZWN0X2RhdGFfZXJyb3IpOworCWlmIChy YyA8IDApCisJCXJldHVybiByYzsKKwlyYyA9IGRldmljZV9jcmVhdGVfZmlsZSgmbWNpLT5kZXYs ICZkZXZfYXR0cl9pbmplY3RfZGF0YV9wb2lzb24pOworCWlmIChyYyA8IDApCisJCXJldHVybiBy YzsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBzeW5wc19lZGFjX3JlbW92ZV9zeXNmc19hdHRy aWJ1dGVzIC0gUmVtb3ZlcyBzeXNmcyBlbnRyaWVzCisgKiBAbWNpOglQb2ludGVyIHRvIHRoZSBl ZGFjIG1lbW9yeSBjb250cm9sbGVyIGluc3RhbmNlCisgKgorICogUmVtb3ZlcyBzeXNmcyBhdHRy aWJ1dGVzLgorICoKKyAqIFJldHVybjogbm9uZS4KKyAqLworc3RhdGljIHZvaWQgc3lucHNfZWRh Y19yZW1vdmVfc3lzZnNfYXR0cmlidXRlcyhzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2kpCit7CisJ ZGV2aWNlX3JlbW92ZV9maWxlKCZtY2ktPmRldiwgJmRldl9hdHRyX2luamVjdF9kYXRhX2Vycm9y KTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJm1jaS0+ZGV2LCAmZGV2X2F0dHJfaW5qZWN0X2RhdGFf cG9pc29uKTsKK30KKworLyoqCisgKiBzZXR1cF9hZGRyZXNzX21hcCAtCVNldCBBZGRyZXNzIE1h cCBieSBxdWVyeWluZyBBRERSTUFQIHJlZ2lzdGVycworICogQHByaXY6CQlQb2ludGVyIHRvIHN5 bnBzX2VkYWNfcHJpdiBzdHJ1Y3QKKyAqCisgKiBTZXQgQWRkcmVzcyBNYXAgYnkgcXVlcnlpbmcg QUREUk1BUCByZWdpc3RlcnMKKyAqIFJldHVybjogbm9uZS4KKyAqLworc3RhdGljIHZvaWQgc2V0 dXBfYWRkcmVzc19tYXAoc3RydWN0IHN5bnBzX2VkYWNfcHJpdiAqcHJpdikKK3sKKwl1MzIgYWRk cm1hcFsxMl0sIGFkZHJtYXBfcm93X2IyXzEwOworCWludCBpbmRleDsKKwl1MzIgd2lkdGgsIG1l bXR5cGU7CisKKwltZW10eXBlID0gcmVhZGwocHJpdi0+YmFzZWFkZHIgKyBDVFJMX09GU1QpOwor CXdpZHRoID0gKG1lbXR5cGUgJiBFQ0NfQ1RSTF9CVVNXSURUSF9NQVNLKSA+PiBFQ0NfQ1RSTF9C VVNXSURUSF9TSElGVDsKKworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IDEyOyBpbmRleCsrKSB7 CisJCXUzMiBhZGRybWFwX29mZnNldDsKKworCQlhZGRybWFwX29mZnNldCA9IEVDQ19BRERSTUFQ MF9PRkZTRVQgKyAoaW5kZXggKiA0KTsKKwkJYWRkcm1hcFtpbmRleF0gPSByZWFkbChwcml2LT5i YXNlYWRkciArIGFkZHJtYXBfb2Zmc2V0KTsKKwl9CisKKwlwcml2LT5yb3dfc2hpZnRbMF0gPSAo YWRkcm1hcFs1XSAmIFJPV19NQVhfVkFMX01BU0spICsgUk9XX0IwX0JBU0U7CisJcHJpdi0+cm93 X3NoaWZ0WzFdID0gKChhZGRybWFwWzVdID4+IDgpICYKKwkJCVJPV19NQVhfVkFMX01BU0spICsg Uk9XX0IxX0JBU0U7CisKKwlhZGRybWFwX3Jvd19iMl8xMCA9IChhZGRybWFwWzVdID4+IDE2KSAm IFJPV19NQVhfVkFMX01BU0s7CisJaWYgKGFkZHJtYXBfcm93X2IyXzEwICE9IFJPV19NQVhfVkFM X01BU0spIHsKKwkJZm9yIChpbmRleCA9IDI7IGluZGV4IDwgMTE7IGluZGV4KyspCisJCQlwcml2 LT5yb3dfc2hpZnRbaW5kZXhdID0gYWRkcm1hcF9yb3dfYjJfMTAgKworCQkJCWluZGV4ICsgUk9X X0IwX0JBU0U7CisKKwl9IGVsc2UgeworCQlwcml2LT5yb3dfc2hpZnRbMl0gPSAoYWRkcm1hcFs5 XSAmCisJCQkJUk9XX01BWF9WQUxfTUFTSykgKyBST1dfQjJfQkFTRTsKKwkJcHJpdi0+cm93X3No aWZ0WzNdID0gKChhZGRybWFwWzldID4+IDgpICYKKwkJCQlST1dfTUFYX1ZBTF9NQVNLKSArIFJP V19CM19CQVNFOworCQlwcml2LT5yb3dfc2hpZnRbNF0gPSAoKGFkZHJtYXBbOV0gPj4gMTYpICYK KwkJCQlST1dfTUFYX1ZBTF9NQVNLKSArIFJPV19CNF9CQVNFOworCQlwcml2LT5yb3dfc2hpZnRb NV0gPSAoKGFkZHJtYXBbOV0gPj4gMjQpICYKKwkJCQlST1dfTUFYX1ZBTF9NQVNLKSArIFJPV19C NV9CQVNFOworCQlwcml2LT5yb3dfc2hpZnRbNl0gPSAoYWRkcm1hcFsxMF0gJgorCQkJCVJPV19N QVhfVkFMX01BU0spICsgUk9XX0I2X0JBU0U7CisJCXByaXYtPnJvd19zaGlmdFs3XSA9ICgoYWRk cm1hcFsxMF0gPj4gOCkgJgorCQkJCVJPV19NQVhfVkFMX01BU0spICsgUk9XX0I3X0JBU0U7CisJ CXByaXYtPnJvd19zaGlmdFs4XSA9ICgoYWRkcm1hcFsxMF0gPj4gMTYpICYKKwkJCQlST1dfTUFY X1ZBTF9NQVNLKSArIFJPV19COF9CQVNFOworCQlwcml2LT5yb3dfc2hpZnRbOV0gPSAoKGFkZHJt YXBbMTBdID4+IDI0KSAmCisJCQkJUk9XX01BWF9WQUxfTUFTSykgKyBST1dfQjlfQkFTRTsKKwkJ cHJpdi0+cm93X3NoaWZ0WzEwXSA9IChhZGRybWFwWzExXSAmCisJCQkJUk9XX01BWF9WQUxfTUFT SykgKyBST1dfQjEwX0JBU0U7CisJfQorCisJcHJpdi0+cm93X3NoaWZ0WzExXSA9ICgoKGFkZHJt YXBbNV0gPj4gMjQpICYgUk9XX01BWF9WQUxfTUFTSykgPT0KKwkJCQlST1dfTUFYX1ZBTF9NQVNL KSA/IDAgOiAoKChhZGRybWFwWzVdID4+IDI0KSAmCisJCQkJUk9XX01BWF9WQUxfTUFTSykgKyBS T1dfQjExX0JBU0UpOworCXByaXYtPnJvd19zaGlmdFsxMl0gPSAoKGFkZHJtYXBbNl0gJiBST1df TUFYX1ZBTF9NQVNLKSA9PQorCQkJCVJPV19NQVhfVkFMX01BU0spID8gMCA6ICgoYWRkcm1hcFs2 XSAmCisJCQkJUk9XX01BWF9WQUxfTUFTSykgKyBST1dfQjEyX0JBU0UpOworCXByaXYtPnJvd19z aGlmdFsxM10gPSAoKChhZGRybWFwWzZdID4+IDgpICYgUk9XX01BWF9WQUxfTUFTSykgPT0KKwkJ CQlST1dfTUFYX1ZBTF9NQVNLKSA/IDAgOiAoKChhZGRybWFwWzZdID4+IDgpICYKKwkJCQlST1df TUFYX1ZBTF9NQVNLKSArIFJPV19CMTNfQkFTRSk7CisJcHJpdi0+cm93X3NoaWZ0WzE0XSA9ICgo KGFkZHJtYXBbNl0gPj4gMTYpICYgUk9XX01BWF9WQUxfTUFTSykgPT0KKwkJCQlST1dfTUFYX1ZB TF9NQVNLKSA/IDAgOiAoKChhZGRybWFwWzZdID4+IDE2KSAmCisJCQkJUk9XX01BWF9WQUxfTUFT SykgKyBST1dfQjE0X0JBU0UpOworCXByaXYtPnJvd19zaGlmdFsxNV0gPSAoKChhZGRybWFwWzZd ID4+IDI0KSAmIFJPV19NQVhfVkFMX01BU0spID09CisJCQkJUk9XX01BWF9WQUxfTUFTSykgPyAw IDogKCgoYWRkcm1hcFs2XSA+PiAyNCkgJgorCQkJCVJPV19NQVhfVkFMX01BU0spICsgUk9XX0Ix NV9CQVNFKTsKKwlwcml2LT5yb3dfc2hpZnRbMTZdID0gKChhZGRybWFwWzddICYgUk9XX01BWF9W QUxfTUFTSykgPT0KKwkJCQlST1dfTUFYX1ZBTF9NQVNLKSA/IDAgOiAoKGFkZHJtYXBbN10gJgor CQkJCVJPV19NQVhfVkFMX01BU0spICsgUk9XX0IxNl9CQVNFKTsKKwlwcml2LT5yb3dfc2hpZnRb MTddID0gKCgoYWRkcm1hcFs3XSA+PiA4KSAmIFJPV19NQVhfVkFMX01BU0spID09CisJCQkJUk9X X01BWF9WQUxfTUFTSykgPyAwIDogKCgoYWRkcm1hcFs3XSA+PiA4KSAmCisJCQkJUk9XX01BWF9W QUxfTUFTSykgKyBST1dfQjE3X0JBU0UpOworCisJcHJpdi0+Y29sX3NoaWZ0WzBdID0gMDsKKwlw cml2LT5jb2xfc2hpZnRbMV0gPSAxOworCXByaXYtPmNvbF9zaGlmdFsyXSA9IChhZGRybWFwWzJd ICYgQ09MX01BWF9WQUxfTUFTSykgKyBDT0xfQjJfQkFTRTsKKwlwcml2LT5jb2xfc2hpZnRbM10g PSAoKGFkZHJtYXBbMl0gPj4gOCkgJgorCQkJQ09MX01BWF9WQUxfTUFTSykgKyBDT0xfQjNfQkFT RTsKKwlwcml2LT5jb2xfc2hpZnRbNF0gPSAoKChhZGRybWFwWzJdID4+IDE2KSAmIENPTF9NQVhf VkFMX01BU0spID09CisJCQlDT0xfTUFYX1ZBTF9NQVNLKSA/IDAgOiAoKChhZGRybWFwWzJdID4+ IDE2KSAmCisJCQkJCUNPTF9NQVhfVkFMX01BU0spICsgQ09MX0I0X0JBU0UpOworCXByaXYtPmNv bF9zaGlmdFs1XSA9ICgoKGFkZHJtYXBbMl0gPj4gMjQpICYgQ09MX01BWF9WQUxfTUFTSykgPT0K KwkJCUNPTF9NQVhfVkFMX01BU0spID8gMCA6ICgoKGFkZHJtYXBbMl0gPj4gMjQpICYKKwkJCQkJ Q09MX01BWF9WQUxfTUFTSykgKyBDT0xfQjVfQkFTRSk7CisJcHJpdi0+Y29sX3NoaWZ0WzZdID0g KChhZGRybWFwWzNdICYgQ09MX01BWF9WQUxfTUFTSykgPT0KKwkJCUNPTF9NQVhfVkFMX01BU0sp ID8gMCA6ICgoYWRkcm1hcFszXSAmCisJCQkJCUNPTF9NQVhfVkFMX01BU0spICsgQ09MX0I2X0JB U0UpOworCXByaXYtPmNvbF9zaGlmdFs3XSA9ICgoKGFkZHJtYXBbM10gPj4gOCkgJiBDT0xfTUFY X1ZBTF9NQVNLKSA9PQorCQkJQ09MX01BWF9WQUxfTUFTSykgPyAwIDogKCgoYWRkcm1hcFszXSA+ PiA4KSAmCisJCQkJCUNPTF9NQVhfVkFMX01BU0spICsgQ09MX0I3X0JBU0UpOworCXByaXYtPmNv bF9zaGlmdFs4XSA9ICgoKGFkZHJtYXBbM10gPj4gMTYpICYgQ09MX01BWF9WQUxfTUFTSykgPT0K KwkJCUNPTF9NQVhfVkFMX01BU0spID8gMCA6ICgoKGFkZHJtYXBbM10gPj4gMTYpICYKKwkJCQkJ Q09MX01BWF9WQUxfTUFTSykgKyBDT0xfQjhfQkFTRSk7CisJcHJpdi0+Y29sX3NoaWZ0WzldID0g KCgoYWRkcm1hcFszXSA+PiAyNCkgJiBDT0xfTUFYX1ZBTF9NQVNLKSA9PQorCQkJQ09MX01BWF9W QUxfTUFTSykgPyAwIDogKCgoYWRkcm1hcFszXSA+PiAyNCkgJgorCQkJCQlDT0xfTUFYX1ZBTF9N QVNLKSArIENPTF9COV9CQVNFKTsKKwlpZiAod2lkdGggPT0gRERSQ1RMX0VXRFRIXzY0KSB7CisJ CWlmIChtZW10eXBlICYgTUVNX1RZUEVfTFBERFIzKSB7CisJCQlwcml2LT5jb2xfc2hpZnRbMTBd ID0gKChhZGRybWFwWzRdICYKKwkJCQlDT0xfTUFYX1ZBTF9NQVNLKSA9PSBDT0xfTUFYX1ZBTF9N QVNLKSA/IDAgOgorCQkJCSgoYWRkcm1hcFs0XSAmIENPTF9NQVhfVkFMX01BU0spICsKKwkJCQkg Q09MX0IxMF9CQVNFKTsKKwkJCXByaXYtPmNvbF9zaGlmdFsxMV0gPSAoKChhZGRybWFwWzRdID4+ IDgpICYKKwkJCQlDT0xfTUFYX1ZBTF9NQVNLKSA9PSBDT0xfTUFYX1ZBTF9NQVNLKSA/IDAgOgor CQkJCSgoKGFkZHJtYXBbNF0gPj4gOCkgJiBDT0xfTUFYX1ZBTF9NQVNLKSArCisJCQkJIENPTF9C MTFfQkFTRSk7CisJCX0gZWxzZSB7CisJCQlwcml2LT5jb2xfc2hpZnRbMTFdID0gKChhZGRybWFw WzRdICYKKwkJCQlDT0xfTUFYX1ZBTF9NQVNLKSA9PSBDT0xfTUFYX1ZBTF9NQVNLKSA/IDAgOgor CQkJCSgoYWRkcm1hcFs0XSAmIENPTF9NQVhfVkFMX01BU0spICsKKwkJCQkgQ09MX0IxMF9CQVNF KTsKKwkJCXByaXYtPmNvbF9zaGlmdFsxM10gPSAoKChhZGRybWFwWzRdID4+IDgpICYKKwkJCQlD T0xfTUFYX1ZBTF9NQVNLKSA9PSBDT0xfTUFYX1ZBTF9NQVNLKSA/IDAgOgorCQkJCSgoKGFkZHJt YXBbNF0gPj4gOCkgJiBDT0xfTUFYX1ZBTF9NQVNLKSArCisJCQkJIENPTF9CMTFfQkFTRSk7CisJ CX0KKwl9IGVsc2UgaWYgKHdpZHRoID09IEREUkNUTF9FV0RUSF8zMikgeworCQlpZiAobWVtdHlw ZSAmIE1FTV9UWVBFX0xQRERSMykgeworCQkJcHJpdi0+Y29sX3NoaWZ0WzEwXSA9ICgoKGFkZHJt YXBbM10gPj4gMjQpICYKKwkJCQlDT0xfTUFYX1ZBTF9NQVNLKSA9PSBDT0xfTUFYX1ZBTF9NQVNL KSA/IDAgOgorCQkJCSgoKGFkZHJtYXBbM10gPj4gMjQpICYgQ09MX01BWF9WQUxfTUFTSykgKwor CQkJCSBDT0xfQjlfQkFTRSk7CisJCQlwcml2LT5jb2xfc2hpZnRbMTFdID0gKChhZGRybWFwWzRd ICYKKwkJCQlDT0xfTUFYX1ZBTF9NQVNLKSA9PSBDT0xfTUFYX1ZBTF9NQVNLKSA/IDAgOgorCQkJ CSgoYWRkcm1hcFs0XSAmIENPTF9NQVhfVkFMX01BU0spICsKKwkJCQkgQ09MX0IxMF9CQVNFKTsK KwkJfSBlbHNlIHsKKwkJCXByaXYtPmNvbF9zaGlmdFsxMV0gPSAoKChhZGRybWFwWzNdID4+IDI0 KSAmCisJCQkJQ09MX01BWF9WQUxfTUFTSykgPT0gQ09MX01BWF9WQUxfTUFTSykgPyAwIDoKKwkJ CQkoKChhZGRybWFwWzNdID4+IDI0KSAmIENPTF9NQVhfVkFMX01BU0spICsKKwkJCQkgQ09MX0I5 X0JBU0UpOworCQkJcHJpdi0+Y29sX3NoaWZ0WzEzXSA9ICgoYWRkcm1hcFs0XSAmCisJCQkJQ09M X01BWF9WQUxfTUFTSykgPT0gQ09MX01BWF9WQUxfTUFTSykgPyAwIDoKKwkJCQkoKGFkZHJtYXBb NF0gJiBDT0xfTUFYX1ZBTF9NQVNLKSArCisJCQkJIENPTF9CMTBfQkFTRSk7CisJCX0KKwl9IGVs c2UgeworCQlpZiAobWVtdHlwZSAmIE1FTV9UWVBFX0xQRERSMykgeworCQkJcHJpdi0+Y29sX3No aWZ0WzEwXSA9ICgoKGFkZHJtYXBbM10gPj4gMTYpICYKKwkJCQlDT0xfTUFYX1ZBTF9NQVNLKSA9 PSBDT0xfTUFYX1ZBTF9NQVNLKSA/IDAgOgorCQkJCSgoKGFkZHJtYXBbM10gPj4gMTYpICYgQ09M X01BWF9WQUxfTUFTSykgKworCQkJCSBDT0xfQjhfQkFTRSk7CisJCQlwcml2LT5jb2xfc2hpZnRb MTFdID0gKCgoYWRkcm1hcFszXSA+PiAyNCkgJgorCQkJCUNPTF9NQVhfVkFMX01BU0spID09IENP TF9NQVhfVkFMX01BU0spID8gMCA6CisJCQkJKCgoYWRkcm1hcFszXSA+PiAyNCkgJiBDT0xfTUFY X1ZBTF9NQVNLKSArCisJCQkJIENPTF9COV9CQVNFKTsKKwkJCXByaXYtPmNvbF9zaGlmdFsxM10g PSAoKGFkZHJtYXBbNF0gJgorCQkJCUNPTF9NQVhfVkFMX01BU0spID09IENPTF9NQVhfVkFMX01B U0spID8gMCA6CisJCQkJKChhZGRybWFwWzRdICYgQ09MX01BWF9WQUxfTUFTSykgKworCQkJCSBD T0xfQjEwX0JBU0UpOworCQl9IGVsc2UgeworCQkJcHJpdi0+Y29sX3NoaWZ0WzExXSA9ICgoKGFk ZHJtYXBbM10gPj4gMTYpICYKKwkJCQlDT0xfTUFYX1ZBTF9NQVNLKSA9PSBDT0xfTUFYX1ZBTF9N QVNLKSA/IDAgOgorCQkJCSgoKGFkZHJtYXBbM10gPj4gMTYpICYgQ09MX01BWF9WQUxfTUFTSykg KworCQkJCSBDT0xfQjhfQkFTRSk7CisJCQlwcml2LT5jb2xfc2hpZnRbMTNdID0gKCgoYWRkcm1h cFszXSA+PiAyNCkgJgorCQkJCUNPTF9NQVhfVkFMX01BU0spID09IENPTF9NQVhfVkFMX01BU0sp ID8gMCA6CisJCQkJKCgoYWRkcm1hcFszXSA+PiAyNCkgJiBDT0xfTUFYX1ZBTF9NQVNLKSArCisJ CQkJIENPTF9COV9CQVNFKTsKKwkJfQorCX0KKworCWlmICh3aWR0aCkgeworCQlmb3IgKGluZGV4 ID0gOTsgaW5kZXggPiB3aWR0aDsgaW5kZXgtLSkgeworCQkJcHJpdi0+Y29sX3NoaWZ0W2luZGV4 XSA9IHByaXYtPmNvbF9zaGlmdFtpbmRleCAtIHdpZHRoXTsKKwkJCXByaXYtPmNvbF9zaGlmdFtp bmRleCAtIHdpZHRoXSA9IDA7CisJCX0KKwl9CisKKwlwcml2LT5iYW5rX3NoaWZ0WzBdID0gKGFk ZHJtYXBbMV0gJiBCQU5LX01BWF9WQUxfTUFTSykgKyBCQU5LX0IwX0JBU0U7CisJcHJpdi0+YmFu a19zaGlmdFsxXSA9ICgoYWRkcm1hcFsxXSA+PiA4KSAmCisJCQkJQkFOS19NQVhfVkFMX01BU0sp ICsgQkFOS19CMV9CQVNFOworCXByaXYtPmJhbmtfc2hpZnRbMl0gPSAoKChhZGRybWFwWzFdID4+ IDE2KSAmCisJCQkJQkFOS19NQVhfVkFMX01BU0spID09IEJBTktfTUFYX1ZBTF9NQVNLKSA/IDAg OgorCQkJCSgoKGFkZHJtYXBbMV0gPj4gMTYpICYgQkFOS19NQVhfVkFMX01BU0spICsKKwkJCQkg QkFOS19CMl9CQVNFKTsKKworCXByaXYtPmJhbmtncnBfc2hpZnRbMF0gPSAoYWRkcm1hcFs4XSAm CisJCQkJQkFOS0dSUF9NQVhfVkFMX01BU0spICsgQkFOS0dSUF9CMF9CQVNFOworCXByaXYtPmJh bmtncnBfc2hpZnRbMV0gPSAoKChhZGRybWFwWzhdID4+IDgpICYgQkFOS0dSUF9NQVhfVkFMX01B U0spID09CisJCQkJQkFOS0dSUF9NQVhfVkFMX01BU0spID8gMCA6ICgoKGFkZHJtYXBbOF0gPj4g OCkKKwkJCQkmIEJBTktHUlBfTUFYX1ZBTF9NQVNLKSArIEJBTktHUlBfQjFfQkFTRSk7CisKKwlw cml2LT5yYW5rX3NoaWZ0WzBdID0gKChhZGRybWFwWzBdICYgUkFOS19NQVhfVkFMX01BU0spID09 CisJCQkJUkFOS19NQVhfVkFMX01BU0spID8gMCA6ICgoYWRkcm1hcFswXSAmCisJCQkJUkFOS19N QVhfVkFMX01BU0spICsgUkFOS19CMF9CQVNFKTsKK30KKwogLyoqCiAgKiBzeW5wc19lZGFjX21j X3Byb2JlIC0gQ2hlY2sgY29udHJvbGxlciBhbmQgYmluZCBkcml2ZXIKICAqIEBwZGV2OglQb2lu dGVyIHRvIHRoZSBwbGF0Zm9ybV9kZXZpY2Ugc3RydWN0CkBAIC00NzUsNyArMTI1Niw3IEBAIHN0 YXRpYyBpbnQgc3lucHNfZWRhY19tY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2 KQogCXN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaTsKIAlzdHJ1Y3QgZWRhY19tY19sYXllciBsYXll cnNbMl07CiAJc3RydWN0IHN5bnBzX2VkYWNfcHJpdiAqcHJpdjsKLQlpbnQgcmM7CisJaW50IHJj LCBpcnEsIHN0YXR1czsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKIAl2b2lkIF9faW9tZW0gKmJh c2VhZGRyOwogCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoOwpAQCAtNTI0LDYgKzEz MDUsMjcgQEAgc3RhdGljIGludCBzeW5wc19lZGFjX21jX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9k ZXZpY2UgKnBkZXYpCiAJCWdvdG8gZnJlZV9lZGFjX21jOwogCX0KIAorCWlmIChwcml2LT5wX2Rh dGEtPnF1aXJrcyAmIEREUl9FQ0NfSU5UUl9TVVBQT1JUKSB7CisJCWlycSA9IHBsYXRmb3JtX2dl dF9pcnEocGRldiwgMCk7CisJCWlmIChpcnEgPCAwKSB7CisJCQllZGFjX3ByaW50ayhLRVJOX0VS UiwgRURBQ19NQywKKwkJCQkJIk5vIGlycSAlZCBpbiBEVFxuIiwgaXJxKTsKKwkJCXJldHVybiAt RU5PREVWOworCQl9CisKKwkJc3RhdHVzID0gZGV2bV9yZXF1ZXN0X2lycSgmcGRldi0+ZGV2LCBp cnEsCisJCQlzeW5wc19lZGFjX2ludHJfaGFuZGxlciwKKwkJCTAsIGRldl9uYW1lKCZwZGV2LT5k ZXYpLCBtY2kpOworCQlpZiAoc3RhdHVzIDwgMCkgeworCQkJZWRhY19wcmludGsoS0VSTl9FUlIs IEVEQUNfTUMsICJGYWlsZWQgdG8gcmVxdWVzdCBJcnFcbiIpOworCQkJZ290byBmcmVlX2VkYWNf bWM7CisJCX0KKworCQkvKiBFbmFibGUgVUUvQ0UgSW50ZXJydXB0cyAqLworCQl3cml0ZWwoKERE Ul9RT1NVRV9NQVNLIHwgRERSX1FPU0NFX01BU0spLAorCQkJcHJpdi0+YmFzZWFkZHIgKyBERFJf UU9TX0lSUV9FTl9PRlNUKTsKKwl9CisKIAlyYyA9IGVkYWNfbWNfYWRkX21jKG1jaSk7CiAJaWYg KHJjKSB7CiAJCWVkYWNfcHJpbnRrKEtFUk5fRVJSLCBFREFDX01DLApAQCAtNTMxLDExICsxMzMz LDI0IEBAIHN0YXRpYyBpbnQgc3lucHNfZWRhY19tY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2 aWNlICpwZGV2KQogCQlnb3RvIGZyZWVfZWRhY19tYzsKIAl9CiAKKwlpZiAocHJpdi0+cF9kYXRh LT5xdWlya3MgJiBERFJfRUNDX0RBVEFfUE9JU09OX1NVUFBPUlQpIHsKKwkJaWYgKHN5bnBzX2Vk YWNfY3JlYXRlX3N5c2ZzX2F0dHJpYnV0ZXMobWNpKSkgeworCQkJZWRhY19wcmludGsoS0VSTl9F UlIsIEVEQUNfTUMsCisJCQkJCSJGYWlsZWQgdG8gY3JlYXRlIHN5c2ZzIGVudHJpZXNcbiIpOwor CQkJZ290byBmcmVlX2VkYWNfbWM7CisJCX0KKwl9CisKKwlpZiAob2ZfZGV2aWNlX2lzX2NvbXBh dGlibGUocGRldi0+ZGV2Lm9mX25vZGUsCisJCQkJICAgICJ4bG54LHp5bnFtcC1kZHJjLTIuNDBh IikpCisJCXNldHVwX2FkZHJlc3NfbWFwKHByaXYpOworCiAJLyoKIAkgKiBTdGFydCBjYXB0dXJp bmcgdGhlIGNvcnJlY3RhYmxlIGFuZCB1bmNvcnJlY3RhYmxlIGVycm9ycy4gQSB3cml0ZSBvZgog CSAqIDAgc3RhcnRzIHRoZSBjb3VudGVycy4KIAkgKi8KLQl3cml0ZWwoMHgwLCBiYXNlYWRkciAr IEVDQ19DVFJMX09GU1QpOworCWlmICghKHByaXYtPnBfZGF0YS0+cXVpcmtzICYgRERSX0VDQ19J TlRSX1NVUFBPUlQpKQorCQl3cml0ZWwoMHgwLCBiYXNlYWRkciArIEVDQ19DVFJMX09GU1QpOwog CXJldHVybiByYzsKIAogZnJlZV9lZGFjX21jOgpAQCAtNTUzLDggKzEzNjgsMTYgQEAgc3RhdGlj IGludCBzeW5wc19lZGFjX21jX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiBz dGF0aWMgaW50IHN5bnBzX2VkYWNfbWNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBk ZXYpCiB7CiAJc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEo cGRldik7CisJc3RydWN0IHN5bnBzX2VkYWNfcHJpdiAqcHJpdjsKIAorCXByaXYgPSBtY2ktPnB2 dF9pbmZvOworCWlmIChwcml2LT5wX2RhdGEtPnF1aXJrcyAmIEREUl9FQ0NfSU5UUl9TVVBQT1JU KQorCQkvKiBEaXNhYmxlIFVFL0NFIEludGVycnVwdHMgKi8KKwkJd3JpdGVsKChERFJfUU9TVUVf TUFTSyB8IEREUl9RT1NDRV9NQVNLKSwKKwkJCXByaXYtPmJhc2VhZGRyICsgRERSX1FPU19JUlFf REJfT0ZTVCk7CiAJZWRhY19tY19kZWxfbWMoJnBkZXYtPmRldik7CisJaWYgKHByaXYtPnBfZGF0 YS0+cXVpcmtzICYgRERSX0VDQ19EQVRBX1BPSVNPTl9TVVBQT1JUKQorCQlzeW5wc19lZGFjX3Jl bW92ZV9zeXNmc19hdHRyaWJ1dGVzKG1jaSk7CiAJZWRhY19tY19mcmVlKG1jaSk7CiAKIAlyZXR1 cm4gMDsK