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: [2/2] dma: xilinx: dpdma: Add the Xilinx DisplayPort DMA engine driver From: Hyun Kwon Message-Id: <1515204848-3493-2-git-send-email-hyun.kwon@xilinx.com> Date: Fri, 5 Jan 2018 18:14:08 -0800 To: dmaengine@vger.kernel.org Cc: devicetree@vger.kernel.org, Michal Simek , Hyun Kwon , Tejas Upadhyay List-ID: VGhlIFp5bnFNUCBpbmNsdWRlcyB0aGUgRGlzcGxheVBvcnQgc3Vic3lzdGVtIHdpdGggb3duIERN QSBlbmdpbmUKY2FsbGVkIERQRE1BLiBUaGUgRFBETUEgSVAgY29tZXMgd2l0aCA2IGluZGl2aWR1 YWwgY2hhbm5lbHMKKDQgZm9yIGRpc3BsYXksIDIgZm9yIGF1ZGlvKS4gVGhpcyBkcml2ZXIgaW1w bGVtZW50cyBETUFFTkdJTkUgQVBJCndoaWNoIGNhbiBiZSB1c2VkIGZvciBhdWRpbyAoQUxTQSkg YW5kIGRpc3BsYXkgKERSTSkgZHJpdmVycy4KClNpZ25lZC1vZmYtYnk6IEh5dW4gS3dvbiA8aHl1 bi5rd29uQHhpbGlueC5jb20+ClNpZ25lZC1vZmYtYnk6IFRlamFzIFVwYWRoeWF5IDx0ZWphc3VA eGlsaW54LmNvbT4KU2lnbmVkLW9mZi1ieTogTWljaGFsIFNpbWVrIDxtaWNoYWwuc2ltZWtAeGls aW54LmNvbT4KLS0tCiBNQUlOVEFJTkVSUyAgICAgICAgICAgICAgICAgICAgICAgfCAgICA3ICsK IGRyaXZlcnMvZG1hL0tjb25maWcgICAgICAgICAgICAgICB8ICAgMTkgKwogZHJpdmVycy9kbWEv eGlsaW54L01ha2VmaWxlICAgICAgIHwgICAgMSArCiBkcml2ZXJzL2RtYS94aWxpbngveGlsaW54 X2RwZG1hLmMgfCAyMzA5ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKIDQg ZmlsZXMgY2hhbmdlZCwgMjMzNiBpbnNlcnRpb25zKCspCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJp dmVycy9kbWEveGlsaW54L3hpbGlueF9kcGRtYS5jCgpkaWZmIC0tZ2l0IGEvTUFJTlRBSU5FUlMg Yi9NQUlOVEFJTkVSUwppbmRleCBhNmU4NmUyLi4yZjFhMTZmIDEwMDY0NAotLS0gYS9NQUlOVEFJ TkVSUworKysgYi9NQUlOVEFJTkVSUwpAQCAtMTUwMDUsNiArMTUwMDUsMTMgQEAgRjoJRG9jdW1l bnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21lZGlhL3hpbGlueC8KIEY6CWRyaXZlcnMvbWVk aWEvcGxhdGZvcm0veGlsaW54LwogRjoJaW5jbHVkZS91YXBpL2xpbnV4L3hpbGlueC12NGwyLWNv bnRyb2xzLmgKIAorWGlsaW54IFp5bnFNUCBEUERNQSBEUklWRVIKK006CUh5dW4gS3dvbiA8aHl1 bi5rd29uQHhpbGlueC5jb20+CitMOglkbWFlbmdpbmVAdmdlci5rZXJuZWwub3JnCitTOglTdXBw b3J0ZWQKK0Y6CURvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9kbWEveGlsaW54L3hp bGlueF9kcGRtYS50eHQKK0Y6CWRyaXZlcnMvZG1hL3hpbGlueF9kcGRtYS5jCisKIFhJTExZQlVT IERSSVZFUgogTToJRWxpIEJpbGxhdWVyIDxlbGkuYmlsbGF1ZXJAZ21haWwuY29tPgogTDoJbGlu dXgta2VybmVsQHZnZXIua2VybmVsLm9yZwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvS2NvbmZp ZyBiL2RyaXZlcnMvZG1hL0tjb25maWcKaW5kZXggMjdkZjNlMi4uNTEyMDIzOCAxMDA2NDQKLS0t IGEvZHJpdmVycy9kbWEvS2NvbmZpZworKysgYi9kcml2ZXJzL2RtYS9LY29uZmlnCkBAIC02MTQs NiArNjE0LDI1IEBAIGNvbmZpZyBYSUxJTlhfRE1BCiAJICBBWEkgRE1BIGVuZ2luZSBwcm92aWRl cyBoaWdoLWJhbmR3aWR0aCBvbmUgZGltZW5zaW9uYWwgZGlyZWN0CiAJICBtZW1vcnkgYWNjZXNz IGJldHdlZW4gbWVtb3J5IGFuZCBBWEk0LVN0cmVhbSB0YXJnZXQgcGVyaXBoZXJhbHMuCiAKK2Nv bmZpZyBYSUxJTlhfRFBETUEKKwl0cmlzdGF0ZSAiWGlsaW54IERQRE1BIEVuZ2luZSIKKwlzZWxl Y3QgRE1BX0VOR0lORQorCWhlbHAKKwkgIEVuYWJsZSBzdXBwb3J0IGZvciBYaWxpbnggWnlucU1Q IERpc3BsYXlQb3J0IERNQS4gQ2hvb3NlIHRoaXMgb3B0aW9uCisJICBpZiB5b3UgaGF2ZSBhIFhp bGlueCBaeW5xTVAgU29DIHdpdGggRGlzcGxheVBvcnQgc3Vic3lzdGVtCisJICBETUEgZW5naW5l cy4gVGhlIGRyaXZlciBwcm92aWRlcyB0aGUgZG1hZW5naW5lIGZ1bmN0aW9uYWxpdGllcworCSAg Zm9yIHRoZSBEaXNwbGF5UG9ydCBETUEgZW5naW5lcy4KKworY29uZmlnIFhJTElOWF9EUERNQV9E RUJVR19GUworICAgICAgICBib29sICJYaWxpbnggRFBETUEgZGVidWdmcyIKKyAgICAgICAgZGVw ZW5kcyBvbiBERUJVR19GUyAmJiBYSUxJTlhfRFBETUEKKyAgICAgICAgaGVscAorICAgICAgICAg IEVuYWJsZSB0aGUgZGVidWdmcyBjb2RlIGZvciBEUERNQSBkcml2ZXIuIFRoZSBkZWJ1Z2ZzIGNv ZGUKKyAgICAgICAgICBlbmFibGVzIGRlYnVnZ2luZyBvciB0ZXN0aW5nIHJlbGF0ZWQgZmVhdHVy ZXMuIEl0IGV4cG9zZXMgc29tZQorICAgICAgICAgIGxvdyBsZXZlbCBjb250cm9scyB0byB0aGUg dXNlciBzcGFjZSB0byBoZWxwIHRlc3RpbmcgYXV0b21hdGlvbiwKKyAgICAgICAgICBhcyB3ZWxs IGFzIGNhbiBlbmFibGUgYWRkaXRpb25hbCBkaWFnbm9zdGljIG9yIHN0YXRpc3RpY2FsCisgICAg ICAgICAgaW5mb3JtYXRpb24uCisKIGNvbmZpZyBYSUxJTlhfWllOUU1QX0RNQQogCXRyaXN0YXRl ICJYaWxpbnggWnlucU1QIERNQSBFbmdpbmUiCiAJZGVwZW5kcyBvbiAoQVJDSF9aWU5RIHx8IE1J Q1JPQkxBWkUgfHwgQVJNNjQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS94aWxpbngvTWFrZWZp bGUgYi9kcml2ZXJzL2RtYS94aWxpbngvTWFrZWZpbGUKaW5kZXggOWU5MWY4Zi4uNjc5YzRiOCAx MDA2NDQKLS0tIGEvZHJpdmVycy9kbWEveGlsaW54L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvZG1h L3hpbGlueC9NYWtlZmlsZQpAQCAtMSwyICsxLDMgQEAKIG9iai0kKENPTkZJR19YSUxJTlhfRE1B KSArPSB4aWxpbnhfZG1hLm8KK29iai0kKENPTkZJR19YSUxJTlhfRFBETUEpICs9IHhpbGlueF9k cGRtYS5vCiBvYmotJChDT05GSUdfWElMSU5YX1pZTlFNUF9ETUEpICs9IHp5bnFtcF9kbWEubwpk aWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEveGlsaW54L3hpbGlueF9kcGRtYS5jIGIvZHJpdmVycy9k bWEveGlsaW54L3hpbGlueF9kcGRtYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAw MDAuLjhhNTY0NmUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2RtYS94aWxpbngveGlsaW54 X2RwZG1hLmMKQEAgLTAsMCArMSwyMzA5IEBACisvKgorICogWGlsaW54IFp5bnFNUCBEUERNQSBF bmdpbmUgZHJpdmVyCisgKgorICogIENvcHlyaWdodCAoQykgMjAxNSAtIDIwMTggWGlsaW54LCBJ bmMuCisgKgorICogIEF1dGhvcjogSHl1biBXb28gS3dvbiA8aHl1bi5rd29uQHhpbGlueC5jb20+ CisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKKyAqLworCisjaW5jbHVk ZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGlu dXgvZGVidWdmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgv ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZG1hZW5naW5lLmg+CisjaW5jbHVkZSA8bGludXgv ZG1hcG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVy cnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycXJldHVybi5oPgorI2luY2x1ZGUgPGxpbnV4L21v ZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZG1hLmg+ CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2No ZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2su aD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4K KyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisKKyNpbmNsdWRlICIuLi9kbWFlbmdpbmUuaCIKKwor LyogRFBETUEgcmVnaXN0ZXJzICovCisjZGVmaW5lIFhJTElOWF9EUERNQV9FUlJfQ1RSTAkJCQkw eDAKKyNkZWZpbmUgWElMSU5YX0RQRE1BX0lTUgkJCQkweDQKKyNkZWZpbmUgWElMSU5YX0RQRE1B X0lNUgkJCQkweDgKKyNkZWZpbmUgWElMSU5YX0RQRE1BX0lFTgkJCQkweGMKKyNkZWZpbmUgWElM SU5YX0RQRE1BX0lEUwkJCQkweDEwCisjZGVmaW5lIFhJTElOWF9EUERNQV9JTlRSX0RFU0NfRE9O RV9NQVNLCQkoMHgzZiA8PCAwKQorI2RlZmluZSBYSUxJTlhfRFBETUFfSU5UUl9ERVNDX0RPTkVf U0hJRlQJCTAKKyNkZWZpbmUgWElMSU5YX0RQRE1BX0lOVFJfTk9fT1NUQU5EX01BU0sJCSgweDNm IDw8IDYpCisjZGVmaW5lIFhJTElOWF9EUERNQV9JTlRSX05PX09TVEFORF9TSElGVAkJNgorI2Rl ZmluZSBYSUxJTlhfRFBETUFfSU5UUl9BWElfRVJSX01BU0sJCQkoMHgzZiA8PCAxMikKKyNkZWZp bmUgWElMSU5YX0RQRE1BX0lOVFJfQVhJX0VSUl9TSElGVAkJCTEyCisjZGVmaW5lIFhJTElOWF9E UERNQV9JTlRSX0RFU0NfRVJSX01BU0sJCQkoMHgzZiA8PCAxOCkKKyNkZWZpbmUgWElMSU5YX0RQ RE1BX0lOVFJfREVTQ19FUlJfU0hJRlQJCTE2CisjZGVmaW5lIFhJTElOWF9EUERNQV9JTlRSX1dS X0NNRF9GSUZPX0ZVTEwJCUJJVCgyNCkKKyNkZWZpbmUgWElMSU5YX0RQRE1BX0lOVFJfV1JfREFU QV9GSUZPX0ZVTEwJCUJJVCgyNSkKKyNkZWZpbmUgWElMSU5YX0RQRE1BX0lOVFJfQVhJXzRLX0NS T1NTCQkJQklUKDI2KQorI2RlZmluZSBYSUxJTlhfRFBETUFfSU5UUl9WU1lOQwkJCQlCSVQoMjcp CisjZGVmaW5lIFhJTElOWF9EUERNQV9JTlRSX0NIQU5fRVJSX01BU0sJCQkweDQxMDAwCisjZGVm aW5lIFhJTElOWF9EUERNQV9JTlRSX0NIQU5fRVJSCQkJMHhmZmYwMDAKKyNkZWZpbmUgWElMSU5Y X0RQRE1BX0lOVFJfR0xPQkFMX0VSUgkJCTB4NzAwMDAwMAorI2RlZmluZSBYSUxJTlhfRFBETUFf SU5UUl9FUlJfQUxMCQkJMHg3ZmZmMDAwCisjZGVmaW5lIFhJTElOWF9EUERNQV9JTlRSX0NIQU5f TUFTSwkJCTB4NDEwNDEKKyNkZWZpbmUgWElMSU5YX0RQRE1BX0lOVFJfR0xPQkFMX01BU0sJCQkw eGYwMDAwMDAKKyNkZWZpbmUgWElMSU5YX0RQRE1BX0lOVFJfQUxMCQkJCTB4ZmZmZmZmZgorI2Rl ZmluZSBYSUxJTlhfRFBETUFfRUlTUgkJCQkweDE0CisjZGVmaW5lIFhJTElOWF9EUERNQV9FSU1S CQkJCTB4MTgKKyNkZWZpbmUgWElMSU5YX0RQRE1BX0VJRU4JCQkJMHgxYworI2RlZmluZSBYSUxJ TlhfRFBETUFfRUlEUwkJCQkweDIwCisjZGVmaW5lIFhJTElOWF9EUERNQV9FSU5UUl9JTlZfQVBC CQkJQklUKDApCisjZGVmaW5lIFhJTElOWF9EUERNQV9FSU5UUl9SRF9BWElfRVJSX01BU0sJCSgw eDNmIDw8IDEpCisjZGVmaW5lIFhJTElOWF9EUERNQV9FSU5UUl9SRF9BWElfRVJSX1NISUZUCQkx CisjZGVmaW5lIFhJTElOWF9EUERNQV9FSU5UUl9QUkVfRVJSX01BU0sJCQkoMHgzZiA8PCA3KQor I2RlZmluZSBYSUxJTlhfRFBETUFfRUlOVFJfUFJFX0VSUl9TSElGVAkJNworI2RlZmluZSBYSUxJ TlhfRFBETUFfRUlOVFJfQ1JDX0VSUl9NQVNLCQkJKDB4M2YgPDwgMTMpCisjZGVmaW5lIFhJTElO WF9EUERNQV9FSU5UUl9DUkNfRVJSX1NISUZUCQkxMworI2RlZmluZSBYSUxJTlhfRFBETUFfRUlO VFJfV1JfQVhJX0VSUl9NQVNLCQkoMHgzZiA8PCAxOSkKKyNkZWZpbmUgWElMSU5YX0RQRE1BX0VJ TlRSX1dSX0FYSV9FUlJfU0hJRlQJCTE5CisjZGVmaW5lIFhJTElOWF9EUERNQV9FSU5UUl9ERVND X0RPTkVfRVJSX01BU0sJCSgweDNmIDw8IDI1KQorI2RlZmluZSBYSUxJTlhfRFBETUFfRUlOVFJf REVTQ19ET05FX0VSUl9TSElGVAkJMjUKKyNkZWZpbmUgWElMSU5YX0RQRE1BX0VJTlRSX1JEX0NN RF9GSUZPX0ZVTEwJCUJJVCgzMikKKyNkZWZpbmUgWElMSU5YX0RQRE1BX0VJTlRSX0NIQU5fRVJS X01BU0sJCTB4MjA4MjA4MgorI2RlZmluZSBYSUxJTlhfRFBETUFfRUlOVFJfQ0hBTl9FUlIJCQkw eDdmZmZmZmZlCisjZGVmaW5lIFhJTElOWF9EUERNQV9FSU5UUl9HTE9CQUxfRVJSCQkJMHg4MDAw MDAwMQorI2RlZmluZSBYSUxJTlhfRFBETUFfRUlOVFJfQUxMCQkJCTB4ZmZmZmZmZmYKKyNkZWZp bmUgWElMSU5YX0RQRE1BX0NOVEwJCQkJMHgxMDAKKyNkZWZpbmUgWElMSU5YX0RQRE1BX0dCTAkJ CQkweDEwNAorI2RlZmluZSBYSUxJTlhfRFBETUFfR0JMX1RSSUdfU0hJRlQJCQkwCisjZGVmaW5l IFhJTElOWF9EUERNQV9HQkxfUkVUUklHX1NISUZUCQkJNgorI2RlZmluZSBYSUxJTlhfRFBETUFf QUxDMF9DTlRMCQkJCTB4MTA4CisjZGVmaW5lIFhJTElOWF9EUERNQV9BTEMwX1NUQVRVUwkJCTB4 MTBjCisjZGVmaW5lIFhJTElOWF9EUERNQV9BTEMwX01BWAkJCQkweDExMAorI2RlZmluZSBYSUxJ TlhfRFBETUFfQUxDMF9NSU4JCQkJMHgxMTQKKyNkZWZpbmUgWElMSU5YX0RQRE1BX0FMQzBfQUND CQkJCTB4MTE4CisjZGVmaW5lIFhJTElOWF9EUERNQV9BTEMwX0FDQ19UUkFOCQkJMHgxMWMKKyNk ZWZpbmUgWElMSU5YX0RQRE1BX0FMQzFfQ05UTAkJCQkweDEyMAorI2RlZmluZSBYSUxJTlhfRFBE TUFfQUxDMV9TVEFUVVMJCQkweDEyNAorI2RlZmluZSBYSUxJTlhfRFBETUFfQUxDMV9NQVgJCQkJ MHgxMjgKKyNkZWZpbmUgWElMSU5YX0RQRE1BX0FMQzFfTUlOCQkJCTB4MTJjCisjZGVmaW5lIFhJ TElOWF9EUERNQV9BTEMxX0FDQwkJCQkweDEzMAorI2RlZmluZSBYSUxJTlhfRFBETUFfQUxDMV9B Q0NfVFJBTgkJCTB4MTM0CisKKy8qIENoYW5uZWwgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgWElMSU5Y X0RQRE1BX0NIX0JBU0UJCQkJMHgyMDAKKyNkZWZpbmUgWElMSU5YX0RQRE1BX0NIX09GRlNFVAkJ CQkweDEwMAorI2RlZmluZSBYSUxJTlhfRFBETUFfQ0hfREVTQ19TVEFSVF9BRERSRQkJMHgwCisj ZGVmaW5lIFhJTElOWF9EUERNQV9DSF9ERVNDX1NUQVJUX0FERFIJCQkweDQKKyNkZWZpbmUgWElM SU5YX0RQRE1BX0NIX0RFU0NfTkVYVF9BRERSRQkJCTB4OAorI2RlZmluZSBYSUxJTlhfRFBETUFf Q0hfREVTQ19ORVhUX0FERFIJCQkweGMKKyNkZWZpbmUgWElMSU5YX0RQRE1BX0NIX1BZTERfQ1VS X0FERFJFCQkJMHgxMAorI2RlZmluZSBYSUxJTlhfRFBETUFfQ0hfUFlMRF9DVVJfQUREUgkJCTB4 MTQKKyNkZWZpbmUgWElMSU5YX0RQRE1BX0NIX0NOVEwJCQkJMHgxOAorI2RlZmluZSBYSUxJTlhf RFBETUFfQ0hfQ05UTF9FTkFCTEUJCQlCSVQoMCkKKyNkZWZpbmUgWElMSU5YX0RQRE1BX0NIX0NO VExfUEFVU0UJCQlCSVQoMSkKKyNkZWZpbmUgWElMSU5YX0RQRE1BX0NIX0NOVExfUU9TX0RTQ1Jf V1JfU0hJRlQJCTIKKyNkZWZpbmUgWElMSU5YX0RQRE1BX0NIX0NOVExfUU9TX0RTQ1JfUkRfU0hJ RlQJCTYKKyNkZWZpbmUgWElMSU5YX0RQRE1BX0NIX0NOVExfUU9TX0RBVEFfUkRfU0hJRlQJCTEw CisjZGVmaW5lIFhJTElOWF9EUERNQV9DSF9DTlRMX1FPU19WSURfQ0xBU1MJCTExCisjZGVmaW5l IFhJTElOWF9EUERNQV9DSF9TVEFUVVMJCQkJMHgxYworI2RlZmluZSBYSUxJTlhfRFBETUFfQ0hf U1RBVFVTX09UUkFOX0NOVF9NQVNLCQkoMHhmIDw8IDIxKQorI2RlZmluZSBYSUxJTlhfRFBETUFf Q0hfU1RBVFVTX09UUkFOX0NOVF9TSElGVAkJMjEKKyNkZWZpbmUgWElMSU5YX0RQRE1BX0NIX1ZE TwkJCQkweDIwCisjZGVmaW5lIFhJTElOWF9EUERNQV9DSF9QWUxEX1NaCQkJCTB4MjQKKyNkZWZp bmUgWElMSU5YX0RQRE1BX0NIX0RFU0NfSUQJCQkJMHgyOAorCisvKiBEUERNQSBkZXNjcmlwdG9y IGZpZWxkcyAqLworI2RlZmluZSBYSUxJTlhfRFBETUFfREVTQ19DT05UUk9MX1BSRUVNQkxFCQko MHhhNSkKKyNkZWZpbmUgWElMSU5YX0RQRE1BX0RFU0NfQ09OVFJPTF9DT01QTEVURV9JTlRSCQlC SVQoOCkKKyNkZWZpbmUgWElMSU5YX0RQRE1BX0RFU0NfQ09OVFJPTF9ERVNDX1VQREFURQkJQklU KDkpCisjZGVmaW5lIFhJTElOWF9EUERNQV9ERVNDX0NPTlRST0xfSUdOT1JFX0RPTkUJCUJJVCgx MCkKKyNkZWZpbmUgWElMSU5YX0RQRE1BX0RFU0NfQ09OVFJPTF9GUkFHX01PREUJCUJJVCgxOCkK KyNkZWZpbmUgWElMSU5YX0RQRE1BX0RFU0NfQ09OVFJPTF9MQVNUCQkJQklUKDE5KQorI2RlZmlu ZSBYSUxJTlhfRFBETUFfREVTQ19DT05UUk9MX0VOQUJMRV9DUkMJCUJJVCgyMCkKKyNkZWZpbmUg WElMSU5YX0RQRE1BX0RFU0NfQ09OVFJPTF9MQVNUX09GX0ZSQU1FCQlCSVQoMjEpCisjZGVmaW5l IFhJTElOWF9EUERNQV9ERVNDX0lEX01BU0sJCQkoMHhmZmZmIDw8IDApCisjZGVmaW5lIFhJTElO WF9EUERNQV9ERVNDX0lEX1NISUZUCQkJKDApCisjZGVmaW5lIFhJTElOWF9EUERNQV9ERVNDX0hT SVpFX1NUUklERV9IU0laRV9NQVNLCSgweDNmZmZmIDw8IDApCisjZGVmaW5lIFhJTElOWF9EUERN QV9ERVNDX0hTSVpFX1NUUklERV9IU0laRV9TSElGVAkoMCkKKyNkZWZpbmUgWElMSU5YX0RQRE1B X0RFU0NfSFNJWkVfU1RSSURFX1NUUklERV9NQVNLCSgweDNmZmYgPDwgMTgpCisjZGVmaW5lIFhJ TElOWF9EUERNQV9ERVNDX0hTSVpFX1NUUklERV9TVFJJREVfU0hJRlQJKDE4KQorI2RlZmluZSBY SUxJTlhfRFBETUFfREVTQ19BRERSX0VYVF9BRERSX01BU0sJCSgweGZmZikKKyNkZWZpbmUgWElM SU5YX0RQRE1BX0RFU0NfQUREUl9FWFRfQUREUl9TSElGVAkJKDE2KQorCisjZGVmaW5lIFhJTElO WF9EUERNQV9BTElHTl9CWVRFUwkJCTI1NgorCisjZGVmaW5lIFhJTElOWF9EUERNQV9OVU1fQ0hB TgkJCQk2CisjZGVmaW5lIFhJTElOWF9EUERNQV9QQUdFX01BU0sJCQkJKCgxIDw8IDEyKSAtIDEp CisjZGVmaW5lIFhJTElOWF9EUERNQV9QQUdFX1NISUZUCQkJCTEyCisKKy8qKgorICogc3RydWN0 IHhpbGlueF9kcGRtYV9od19kZXNjIC0gRFBETUEgaGFyZHdhcmUgZGVzY3JpcHRvcgorICogQGNv bnRyb2w6IGNvbnRyb2wgY29uZmlndXJhdGlvbiBmaWVsZAorICogQGRlc2NfaWQ6IGRlc2NyaXB0 b3IgSUQKKyAqIEB4ZmVyX3NpemU6IHRyYW5zZmVyIHNpemUKKyAqIEBoc2l6ZV9zdHJpZGU6IGhv cml6b250YWwgc2l6ZSBhbmQgc3RyaWRlCisgKiBAdGltZXN0YW1wX2xzYjogTFNCIG9mIHRpbWUg c3RhbXAKKyAqIEB0aW1lc3RhbXBfbXNiOiBNU0Igb2YgdGltZSBzdGFtcAorICogQGFkZHJfZXh0 OiB1cHBlciAxNiBiaXQgb2YgNDggYml0IGFkZHJlc3MgKG5leHRfZGVzYyBhbmQgc3JjX2FkZHIp CisgKiBAbmV4dF9kZXNjOiBuZXh0IGRlc2NyaXB0b3IgMzIgYml0IGFkZHJlc3MKKyAqIEBzcmNf YWRkcjogcGF5bG9hZCBzb3VyY2UgYWRkcmVzcyAobG93ZXIgMzIgYml0IG9mIDFzdCA0S0IgcGFn ZSkKKyAqIEBhZGRyX2V4dF8yMzogdXBwZXIgMTYgYml0IG9mIDQ4IGJpdCBhZGRyZXNzIChzcmNf YWRkcjIgYW5kIHNyY19hZGRyMykKKyAqIEBhZGRyX2V4dF80NTogdXBwZXIgMTYgYml0IG9mIDQ4 IGJpdCBhZGRyZXNzIChzcmNfYWRkcjQgYW5kIHNyY19hZGRyNSkKKyAqIEBzcmNfYWRkcjI6IHBh eWxvYWQgc291cmNlIGFkZHJlc3MgKGxvd2VyIDMyIGJpdCBvZiAybmQgNEtCIHBhZ2UpCisgKiBA c3JjX2FkZHIzOiBwYXlsb2FkIHNvdXJjZSBhZGRyZXNzIChsb3dlciAzMiBiaXQgb2YgM3JkIDRL QiBwYWdlKQorICogQHNyY19hZGRyNDogcGF5bG9hZCBzb3VyY2UgYWRkcmVzcyAobG93ZXIgMzIg Yml0IG9mIDR0aCA0S0IgcGFnZSkKKyAqIEBzcmNfYWRkcjU6IHBheWxvYWQgc291cmNlIGFkZHJl c3MgKGxvd2VyIDMyIGJpdCBvZiA1dGggNEtCIHBhZ2UpCisgKiBAY3JjOiBkZXNjcmlwdG9yIENS QworICovCitzdHJ1Y3QgeGlsaW54X2RwZG1hX2h3X2Rlc2MgeworCXUzMiBjb250cm9sOworCXUz MiBkZXNjX2lkOworCXUzMiB4ZmVyX3NpemU7CisJdTMyIGhzaXplX3N0cmlkZTsKKwl1MzIgdGlt ZXN0YW1wX2xzYjsKKwl1MzIgdGltZXN0YW1wX21zYjsKKwl1MzIgYWRkcl9leHQ7CisJdTMyIG5l eHRfZGVzYzsKKwl1MzIgc3JjX2FkZHI7CisJdTMyIGFkZHJfZXh0XzIzOworCXUzMiBhZGRyX2V4 dF80NTsKKwl1MzIgc3JjX2FkZHIyOworCXUzMiBzcmNfYWRkcjM7CisJdTMyIHNyY19hZGRyNDsK Kwl1MzIgc3JjX2FkZHI1OworCXUzMiBjcmM7Cit9IF9fYWxpZ25lZChYSUxJTlhfRFBETUFfQUxJ R05fQllURVMpOworCisvKioKKyAqIHN0cnVjdCB4aWxpbnhfZHBkbWFfc3dfZGVzYyAtIERQRE1B IHNvZnR3YXJlIGRlc2NyaXB0b3IKKyAqIEBodzogRFBETUEgaGFyZHdhcmUgZGVzY3JpcHRvcgor ICogQG5vZGU6IGxpc3Qgbm9kZSBmb3Igc29mdHdhcmUgZGVzY3JpcHRvcnMKKyAqIEBwaHlzOiBw aHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBzb2Z0d2FyZSBkZXNjcmlwdG9yCisgKi8KK3N0cnVjdCB4 aWxpbnhfZHBkbWFfc3dfZGVzYyB7CisJc3RydWN0IHhpbGlueF9kcGRtYV9od19kZXNjIGh3Owor CXN0cnVjdCBsaXN0X2hlYWQgbm9kZTsKKwlkbWFfYWRkcl90IHBoeXM7Cit9OworCisvKioKKyAq IGVudW0geGlsaW54X2RwZG1hX3R4X2Rlc2Nfc3RhdHVzIC0gRFBETUEgdHggZGVzY3JpcHRvciBz dGF0dXMKKyAqIEBQUkVQQVJFRDogZGVzY3JpcHRvciBpcyBwcmVwYXJlZCBmb3IgdHJhbnNhY3Rp b24KKyAqIEBBQ1RJVkU6IHRyYW5zYWN0aW9uIGlzIChiZWluZykgZG9uZSBzdWNjZXNzZnVsbHkK KyAqIEBFUlJPUkVEOiBkZXNjcmlwdG9yIGdlbmVyYXRlcyBzb21lIGVycm9ycworICovCitlbnVt IHhpbGlueF9kcGRtYV90eF9kZXNjX3N0YXR1cyB7CisJUFJFUEFSRUQsCisJQUNUSVZFLAorCUVS Uk9SRUQKK307CisKKy8qKgorICogc3RydWN0IHhpbGlueF9kcGRtYV90eF9kZXNjIC0gRFBETUEg dHJhbnNhY3Rpb24gZGVzY3JpcHRvcgorICogQGFzeW5jX3R4OiBETUEgYXN5bmMgdHJhbnNhY3Rp b24gZGVzY3JpcHRvcgorICogQGRlc2NyaXB0b3JzOiBsaXN0IG9mIHNvZnR3YXJlIGRlc2NyaXB0 b3JzCisgKiBAbm9kZTogbGlzdCBub2RlIGZvciB0cmFuc2FjdGlvbiBkZXNjcmlwdG9ycworICog QHN0YXR1czogdHggZGVzY3JpcHRvciBzdGF0dXMKKyAqIEBkb25lX2NudDogbnVtYmVyIG9mIGNv bXBsZXRlIG5vdGlmaWNhdGlvbiB0byBkZWxpdmVyCisgKi8KK3N0cnVjdCB4aWxpbnhfZHBkbWFf dHhfZGVzYyB7CisJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yIGFzeW5jX3R4OworCXN0 cnVjdCBsaXN0X2hlYWQgZGVzY3JpcHRvcnM7CisJc3RydWN0IGxpc3RfaGVhZCBub2RlOworCWVu dW0geGlsaW54X2RwZG1hX3R4X2Rlc2Nfc3RhdHVzIHN0YXR1czsKKwl1bnNpZ25lZCBpbnQgZG9u ZV9jbnQ7Cit9OworCisvKioKKyAqIGVudW0geGlsaW54X2RwZG1hX2NoYW5faWQgLSBEUERNQSBj aGFubmVsIElECisgKiBAVklERU8wOiB2aWRlbyAxc3QgY2hhbm5lbAorICogQFZJREVPMTogdmlk ZW8gMm5kIGNoYW5uZWwgZm9yIG11bHRpIHBsYW5lIHl1diBmb3JtYXRzCisgKiBAVklERU8yOiB2 aWRlbyAzcmQgY2hhbm5lbCBmb3IgbXVsdGkgcGxhbmUgeXV2IGZvcm1hdHMKKyAqIEBHUkFQSElD UzogZ3JhcGhpY3MgY2hhbm5lbAorICogQEFVRElPMDogMXN0IGF1ZGlvIGNoYW5uZWwKKyAqIEBB VURJTzE6IDJuZCBhdWRpbyBjaGFubmVsCisgKi8KK2VudW0geGlsaW54X2RwZG1hX2NoYW5faWQg eworCVZJREVPMCwKKwlWSURFTzEsCisJVklERU8yLAorCUdSQVBISUNTLAorCUFVRElPMCwKKwlB VURJTzEKK307CisKKy8qKgorICogZW51bSB4aWxpbnhfZHBkbWFfY2hhbl9zdGF0dXMgLSBEUERN QSBjaGFubmVsIHN0YXR1cworICogQElETEU6IGlkbGUgc3RhdGUKKyAqIEBTVFJFQU1JTkc6IGFj dGl2ZWx5IHN0cmVhbWluZyBzdGF0ZQorICovCitlbnVtIHhpbGlueF9kcGRtYV9jaGFuX3N0YXR1 cyB7CisJSURMRSwKKwlTVFJFQU1JTkcKK307CisKKy8qCisgKiBEUERNQSBkZXNjcmlwdG9yIHBs YWNlbWVudAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIERQRE1BIGRlc2NyaXRw b3IgbGlmZSB0aW1lIGlzIGRlc2NyaWJlZCB3aXRoIGZvbGxvd2luZyBwbGFjZW1lbnRzOgorICoK KyAqIGFsbG9jYXRlZF9kZXNjIC0+IHN1Ym1pdHRlZF9kZXNjIC0+IHBlbmRpbmdfZGVzYyAtPiBh Y3RpdmVfZGVzYyAtPiBkb25lX2xpc3QKKyAqCisgKiBUcmFuc2l0aW9uIGlzIHRyaWdnZXJlZCBh cyBmb2xsb3dpbmc6CisgKgorICogLT4gYWxsb2NhdGVkX2Rlc2MgOiBhIGRlc2NyaXB0b3IgYWxs b2NhdGlvbgorICogYWxsb2NhdGVkX2Rlc2MgLT4gc3VibWl0dGVkX2Rlc2M6IGEgZGVzY3JpcHRv ciBzdWJtaXNzaW9uCisgKiBzdWJtaXR0ZWRfZGVzYyAtPiBwZW5kaW5nX2Rlc2M6IHJlcXVlc3Qg dG8gaXNzdWUgcGVuZGluZyBhIGRlc2NyaXB0b3IKKyAqIHBlbmRpbmdfZGVzYyAtPiBhY3RpdmVf ZGVzYzogVlNZTkMgaW50ciB3aGVuIGEgZGVzYyBpcyBzY2hlZHVsZWQgdG8gRFBETUEKKyAqIGFj dGl2ZV9kZXNjIC0+IGRvbmVfbGlzdDogVlNZTkMgaW50ciB3aGVuIERQRE1BIHN3aXRjaGVzIHRv IGEgbmV3IGRlc2MKKyAqLworCisvKioKKyAqIHN0cnVjdCB4aWxpbnhfZHBkbWFfY2hhbiAtIERQ RE1BIGNoYW5uZWwKKyAqIEBjb21tb246IGdlbmVyaWMgZG1hIGNoYW5uZWwgc3RydWN0dXJlCisg KiBAcmVnOiByZWdpc3RlciBiYXNlIGFkZHJlc3MKKyAqIEBpZDogY2hhbm5lbCBJRAorICogQHdh aXRfdG9fc3RvcDogcXVldWUgdG8gd2FpdCBmb3Igb3V0c3RhbmRpbmcgdHJhbnNhY2l0b25zIGJl Zm9yZSBzdG9wcGluZworICogQHN0YXR1czogY2hhbm5lbCBzdGF0dXMKKyAqIEBmaXJzdF9mcmFt ZTogZmxhZyBmb3IgdGhlIGZpcnN0IGZyYW1lIG9mIHN0cmVhbQorICogQHZpZGVvX2dyb3VwOiBm bGFnIGlmIG11bHRpLWNoYW5uZWwgb3BlcmF0aW9uIGlzIG5lZWRlZCBmb3IgdmlkZW8gY2hhbm5l bHMKKyAqIEBsb2NrOiBsb2NrIHRvIGFjY2VzcyBzdHJ1Y3QgeGlsaW54X2RwZG1hX2NoYW4KKyAq IEBkZXNjX3Bvb2w6IGRlc2NyaXB0b3IgYWxsb2NhdGlvbiBwb29sCisgKiBAZG9uZV90YXNrOiBk b25lIElSUSBib3R0b20gaGFsZiBoYW5kbGVyCisgKiBAZXJyX3Rhc2s6IGVycm9yIElSUSBib3R0 b20gaGFsZiBoYW5kbGVyCisgKiBAYWxsb2NhdGVkX2Rlc2M6IGFsbG9jYXRlZCBkZXNjcmlwdG9y CisgKiBAc3VibWl0dGVkX2Rlc2M6IHN1Ym1pdHRlZCBkZXNjcmlwdG9yCisgKiBAcGVuZGluZ19k ZXNjOiBwZW5kaW5nIGRlc2NyaXB0b3IgdG8gYmUgc2NoZWR1bGVkIGluIG5leHQgcGVyaW9kCisg KiBAYWN0aXZlX2Rlc2M6IGRlc2NyaXB0b3IgdGhhdCB0aGUgRFBETUEgY2hhbm5lbCBpcyBhY3Rp dmUgb24KKyAqIEBkb25lX2xpc3Q6IGRvbmUgZGVzY3JpcHRvciBsaXN0CisgKiBAeGRldjogRFBE TUEgZGV2aWNlCisgKi8KK3N0cnVjdCB4aWxpbnhfZHBkbWFfY2hhbiB7CisJc3RydWN0IGRtYV9j aGFuIGNvbW1vbjsKKwl2b2lkIF9faW9tZW0gKnJlZzsKKwllbnVtIHhpbGlueF9kcGRtYV9jaGFu X2lkIGlkOworCisJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdF90b19zdG9wOworCWVudW0geGlsaW54 X2RwZG1hX2NoYW5fc3RhdHVzIHN0YXR1czsKKwlib29sIGZpcnN0X2ZyYW1lOworCWJvb2wgdmlk ZW9fZ3JvdXA7CisKKwlzcGlubG9ja190IGxvY2s7IC8qIGxvY2sgdG8gYWNjZXNzIHN0cnVjdCB4 aWxpbnhfZHBkbWFfY2hhbiAqLworCXN0cnVjdCBkbWFfcG9vbCAqZGVzY19wb29sOworCXN0cnVj dCB0YXNrbGV0X3N0cnVjdCBkb25lX3Rhc2s7CisJc3RydWN0IHRhc2tsZXRfc3RydWN0IGVycl90 YXNrOworCisJc3RydWN0IHhpbGlueF9kcGRtYV90eF9kZXNjICphbGxvY2F0ZWRfZGVzYzsKKwlz dHJ1Y3QgeGlsaW54X2RwZG1hX3R4X2Rlc2MgKnN1Ym1pdHRlZF9kZXNjOworCXN0cnVjdCB4aWxp bnhfZHBkbWFfdHhfZGVzYyAqcGVuZGluZ19kZXNjOworCXN0cnVjdCB4aWxpbnhfZHBkbWFfdHhf ZGVzYyAqYWN0aXZlX2Rlc2M7CisJc3RydWN0IGxpc3RfaGVhZCBkb25lX2xpc3Q7CisKKwlzdHJ1 Y3QgeGlsaW54X2RwZG1hX2RldmljZSAqeGRldjsKK307CisKKy8qKgorICogc3RydWN0IHhpbGlu eF9kcGRtYV9kZXZpY2UgLSBEUERNQSBkZXZpY2UKKyAqIEBjb21tb246IGdlbmVyaWMgZG1hIGRl dmljZSBzdHJ1Y3R1cmUKKyAqIEByZWc6IHJlZ2lzdGVyIGJhc2UgYWRkcmVzcworICogQGRldjog Z2VuZXJpYyBkZXZpY2Ugc3RydWN0dXJlCisgKiBAYXhpX2NsazogYXhpIGNsb2NrCisgKiBAY2hh bjogRFBETUEgY2hhbm5lbHMKKyAqIEBleHRfYWRkcjogZmxhZyBmb3IgNjQgYml0IHN5c3RlbSAo NDggYml0IGFkZHJlc3NpbmcpCisgKiBAZGVzY19hZGRyOiBkZXNjcmlwdG9yIGFkZHJlc3Npbmcg Y2FsbGJhY2sgKDMyIGJpdCB2cyA2NCBiaXQpCisgKi8KK3N0cnVjdCB4aWxpbnhfZHBkbWFfZGV2 aWNlIHsKKwlzdHJ1Y3QgZG1hX2RldmljZSBjb21tb247CisJdm9pZCBfX2lvbWVtICpyZWc7CisJ c3RydWN0IGRldmljZSAqZGV2OworCisJc3RydWN0IGNsayAqYXhpX2NsazsKKwlzdHJ1Y3QgeGls aW54X2RwZG1hX2NoYW4gKmNoYW5bWElMSU5YX0RQRE1BX05VTV9DSEFOXTsKKworCWJvb2wgZXh0 X2FkZHI7CisJdm9pZCAoKmRlc2NfYWRkcikoc3RydWN0IHhpbGlueF9kcGRtYV9zd19kZXNjICpz d19kZXNjLAorCQkJICBzdHJ1Y3QgeGlsaW54X2RwZG1hX3N3X2Rlc2MgKnByZXYsCisJCQkgIGRt YV9hZGRyX3QgZG1hX2FkZHJbXSwgdW5zaWduZWQgaW50IG51bV9zcmNfYWRkcik7Cit9OworCisj aWZkZWYgQ09ORklHX1hJTElOWF9EUERNQV9ERUJVR19GUworI2RlZmluZSBYSUxJTlhfRFBETUFf REVCVUdGU19SRUFEX01BWF9TSVpFCTMyCisjZGVmaW5lIFhJTElOWF9EUERNQV9ERUJVR0ZTX1VJ TlQxNl9NQVhfU1RSCSI2NTUzNSIKKyNkZWZpbmUgSU5fUkFOR0UoeCwgbWluLCBtYXgpICh7CQlc CisJCXR5cGVvZih4KSBfeCA9ICh4KTsJCVwKKwkJX3ggPj0gKG1pbikgJiYgX3ggPD0gKG1heCk7 IH0pCisKKy8qIE1hdGNoIHhpbGlueF9kcGRtYV90ZXN0Y2FzZXMgdnMgZHBkbWFfZGVidWdmc19y ZXFzW10gZW50cnkgKi8KK2VudW0geGlsaW54X2RwZG1hX3Rlc3RjYXNlcyB7CisJRFBETUFfVENf SU5UUl9ET05FLAorCURQRE1BX1RDX05PTkUKK307CisKK3N0cnVjdCB4aWxpbnhfZHBkbWFfZGVi dWdmcyB7CisJZW51bSB4aWxpbnhfZHBkbWFfdGVzdGNhc2VzIHRlc3RjYXNlOworCXUxNiB4aWxp bnhfZHBkbWFfaW50cl9kb25lX2NvdW50OworCWVudW0geGlsaW54X2RwZG1hX2NoYW5faWQgY2hh bl9pZDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgeGlsaW54X2RwZG1hX2RlYnVnZnMgZHBkbWFfZGVi dWdmczsKK3N0cnVjdCB4aWxpbnhfZHBkbWFfZGVidWdmc19yZXF1ZXN0IHsKKwljb25zdCBjaGFy ICpyZXE7CisJZW51bSB4aWxpbnhfZHBkbWFfdGVzdGNhc2VzIHRjOworCXNzaXplX3QgKCpyZWFk X2hhbmRsZXIpKGNoYXIgKiprZXJuX2J1ZmYpOworCXNzaXplX3QgKCp3cml0ZV9oYW5kbGVyKShj aGFyICoqY21kKTsKK307CisKK3N0YXRpYyB2b2lkIHhpbGlueF9kcGRtYV9kZWJ1Z2ZzX2ludHJf ZG9uZV9jb3VudF9pbmNyKGludCBjaGFuX2lkKQoreworCWlmIChjaGFuX2lkID09IGRwZG1hX2Rl YnVnZnMuY2hhbl9pZCkKKwkJZHBkbWFfZGVidWdmcy54aWxpbnhfZHBkbWFfaW50cl9kb25lX2Nv dW50Kys7Cit9CisKK3N0YXRpYyBzNjQgeGlsaW54X2RwZG1hX2RlYnVnZnNfYXJndW1lbnRfdmFs dWUoY2hhciAqYXJnKQoreworCXM2NCB2YWx1ZTsKKworCWlmICghYXJnKQorCQlyZXR1cm4gLTE7 CisKKwlpZiAoIWtzdHJ0b3M2NChhcmcsIDAsICZ2YWx1ZSkpCisJCXJldHVybiB2YWx1ZTsKKwor CXJldHVybiAtMTsKK30KKworc3RhdGljIHNzaXplX3QKK3hpbGlueF9kcGRtYV9kZWJ1Z2ZzX2Rl c2NfZG9uZV9pbnRyX3dyaXRlKGNoYXIgKipkcGRtYV90ZXN0X2FyZykKK3sKKwljaGFyICphcmc7 CisJY2hhciAqYXJnX2NoYW5faWQ7CisJczY0IGlkOworCisJYXJnID0gc3Ryc2VwKGRwZG1hX3Rl c3RfYXJnLCAiICIpOworCWlmIChzdHJuY2FzZWNtcChhcmcsICJzdGFydCIsIDUpICE9IDApCisJ CXJldHVybiAtRUlOVkFMOworCisJYXJnX2NoYW5faWQgPSBzdHJzZXAoZHBkbWFfdGVzdF9hcmcs ICIgIik7CisJaWQgPSB4aWxpbnhfZHBkbWFfZGVidWdmc19hcmd1bWVudF92YWx1ZShhcmdfY2hh bl9pZCk7CisKKwlpZiAoaWQgPCAwIHx8ICFJTl9SQU5HRShpZCwgVklERU8wLCBBVURJTzEpKQor CQlyZXR1cm4gLUVJTlZBTDsKKworCWRwZG1hX2RlYnVnZnMudGVzdGNhc2UgPSBEUERNQV9UQ19J TlRSX0RPTkU7CisJZHBkbWFfZGVidWdmcy54aWxpbnhfZHBkbWFfaW50cl9kb25lX2NvdW50ID0g MDsKKwlkcGRtYV9kZWJ1Z2ZzLmNoYW5faWQgPSBpZDsKKworCXJldHVybiAwOworfQorCitzdGF0 aWMgc3NpemVfdCB4aWxpbnhfZHBkbWFfZGVidWdmc19kZXNjX2RvbmVfaW50cl9yZWFkKGNoYXIg KiprZXJuX2J1ZmYpCit7CisJc2l6ZV90IG91dF9zdHJfbGVuOworCisJZHBkbWFfZGVidWdmcy50 ZXN0Y2FzZSA9IERQRE1BX1RDX05PTkU7CisKKwlvdXRfc3RyX2xlbiA9IHN0cmxlbihYSUxJTlhf RFBETUFfREVCVUdGU19VSU5UMTZfTUFYX1NUUik7CisJb3V0X3N0cl9sZW4gPSBtaW5fdChzaXpl X3QsIFhJTElOWF9EUERNQV9ERUJVR0ZTX1JFQURfTUFYX1NJWkUsCisJCQkgICAgb3V0X3N0cl9s ZW4pOworCXNucHJpbnRmKCprZXJuX2J1ZmYsIG91dF9zdHJfbGVuLCAiJWQiLAorCQkgZHBkbWFf ZGVidWdmcy54aWxpbnhfZHBkbWFfaW50cl9kb25lX2NvdW50KTsKKworCXJldHVybiAwOworfQor CisvKiBNYXRjaCB4aWxpbnhfZHBkbWFfdGVzdGNhc2VzIHZzIGRwZG1hX2RlYnVnZnNfcmVxc1td IGVudHJ5ICovCitzdHJ1Y3QgeGlsaW54X2RwZG1hX2RlYnVnZnNfcmVxdWVzdCBkcGRtYV9kZWJ1 Z2ZzX3JlcXNbXSA9IHsKKwl7IkRFU0NSSVBUT1JfRE9ORV9JTlRSIiwgRFBETUFfVENfSU5UUl9E T05FLAorCQkJeGlsaW54X2RwZG1hX2RlYnVnZnNfZGVzY19kb25lX2ludHJfcmVhZCwKKwkJCXhp bGlueF9kcGRtYV9kZWJ1Z2ZzX2Rlc2NfZG9uZV9pbnRyX3dyaXRlfSwKK307CisKK3N0YXRpYyBz c2l6ZV90IHhpbGlueF9kcGRtYV9kZWJ1Z2ZzX3dyaXRlKHN0cnVjdCBmaWxlICpmLCBjb25zdCBj aGFyIF9fdXNlcgorCQkJCQkgICAgICAgKmJ1Ziwgc2l6ZV90IHNpemUsIGxvZmZfdCAqcG9zKQor eworCWNoYXIgKmtlcm5fYnVmZiwgKmtlcm5fYnVmZl9zdGFydDsKKwljaGFyICpkcGRtYV90ZXN0 X3JlcTsKKwlpbnQgcmV0OworCWludCBpOworCisJaWYgKCpwb3MgIT0gMCB8fCBzaXplIDw9IDAp CisJCXJldHVybiAtRUlOVkFMOworCisJLyogU3VwcG9ydGluZyBzaW5nbGUgaW5zdGFuY2Ugb2Yg dGVzdCBhcyBvZiBub3cqLworCWlmIChkcGRtYV9kZWJ1Z2ZzLnRlc3RjYXNlICE9IERQRE1BX1RD X05PTkUpCisJCXJldHVybiAtRUJVU1k7CisKKwlrZXJuX2J1ZmYgPSBremFsbG9jKHNpemUsIEdG UF9LRVJORUwpOworCWlmICgha2Vybl9idWZmKQorCQlyZXR1cm4gLUVOT01FTTsKKwlrZXJuX2J1 ZmZfc3RhcnQgPSBrZXJuX2J1ZmY7CisKKwlyZXQgPSBzdHJuY3B5X2Zyb21fdXNlcihrZXJuX2J1 ZmYsIGJ1Ziwgc2l6ZSk7CisJaWYgKHJldCA8IDApIHsKKwkJa2ZyZWUoa2Vybl9idWZmX3N0YXJ0 KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBSZWFkIHRoZSB0ZXN0Y2FzZSBuYW1lIGZyb20g YSB1c2VyIHJlcXVlc3QgKi8KKwlkcGRtYV90ZXN0X3JlcSA9IHN0cnNlcCgma2Vybl9idWZmLCAi ICIpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZHBkbWFfZGVidWdmc19yZXFzKTsg aSsrKSB7CisJCWlmICghc3RyY2FzZWNtcChkcGRtYV90ZXN0X3JlcSwgZHBkbWFfZGVidWdmc19y ZXFzW2ldLnJlcSkpIHsKKwkJCWlmICghZHBkbWFfZGVidWdmc19yZXFzW2ldLndyaXRlX2hhbmRs ZXIoJmtlcm5fYnVmZikpIHsKKwkJCQlrZnJlZShrZXJuX2J1ZmZfc3RhcnQpOworCQkJCXJldHVy biBzaXplOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwl9CisJa2ZyZWUoa2Vybl9idWZmX3N0YXJ0 KTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHNzaXplX3QgeGlsaW54X2RwZG1hX2Rl YnVnZnNfcmVhZChzdHJ1Y3QgZmlsZSAqZiwgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCQkJIHNpemVf dCBzaXplLCBsb2ZmX3QgKnBvcykKK3sKKwljaGFyICprZXJuX2J1ZmYgPSBOVUxMOworCXNpemVf dCBrZXJuX2J1ZmZfbGVuLCBvdXRfc3RyX2xlbjsKKwllbnVtIHhpbGlueF9kcGRtYV90ZXN0Y2Fz ZXMgdGM7CisJaW50IHJldDsKKworCWlmIChzaXplIDw9IDApCisJCXJldHVybiAtRUlOVkFMOwor CisJaWYgKCpwb3MgIT0gMCkKKwkJcmV0dXJuIDA7CisKKwlrZXJuX2J1ZmYgPSBremFsbG9jKFhJ TElOWF9EUERNQV9ERUJVR0ZTX1JFQURfTUFYX1NJWkUsIEdGUF9LRVJORUwpOworCWlmICgha2Vy bl9idWZmKSB7CisJCWRwZG1hX2RlYnVnZnMudGVzdGNhc2UgPSBEUERNQV9UQ19OT05FOworCQly ZXR1cm4gLUVOT01FTTsKKwl9CisKKwl0YyA9IGRwZG1hX2RlYnVnZnMudGVzdGNhc2U7CisJaWYg KHRjID09IERQRE1BX1RDX05PTkUpIHsKKwkJb3V0X3N0cl9sZW4gPSBzdHJsZW4oIk5vIHRlc3Rj YXNlIGV4ZWN1dGVkIik7CisJCW91dF9zdHJfbGVuID0gbWluX3Qoc2l6ZV90LCBYSUxJTlhfRFBE TUFfREVCVUdGU19SRUFEX01BWF9TSVpFLAorCQkJCSAgICBvdXRfc3RyX2xlbik7CisJCXNucHJp bnRmKGtlcm5fYnVmZiwgb3V0X3N0cl9sZW4sICIlcyIsICJObyB0ZXN0Y2FzZSBleGVjdXRlZCIp OworCX0gZWxzZSB7CisJCXJldCA9IGRwZG1hX2RlYnVnZnNfcmVxc1t0Y10ucmVhZF9oYW5kbGVy KCZrZXJuX2J1ZmYpOworCQlpZiAocmV0KSB7CisJCQlrZnJlZShrZXJuX2J1ZmYpOworCQkJcmV0 dXJuIHJldDsKKwkJfQorCX0KKworCWtlcm5fYnVmZl9sZW4gPSBzdHJsZW4oa2Vybl9idWZmKTsK KwlzaXplID0gbWluKHNpemUsIGtlcm5fYnVmZl9sZW4pOworCisJcmV0ID0gY29weV90b191c2Vy KGJ1Ziwga2Vybl9idWZmLCBzaXplKTsKKworCWtmcmVlKGtlcm5fYnVmZik7CisJaWYgKHJldCkK KwkJcmV0dXJuIHJldDsKKworCSpwb3MgPSBzaXplICsgMTsKKwlyZXR1cm4gc2l6ZTsKK30KKwor c3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZm9wc194aWxpbnhfZHBkbWFfZGJn ZnMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLnJlYWQgPSB4aWxpbnhfZHBkbWFfZGVi dWdmc19yZWFkLAorCS53cml0ZSA9IHhpbGlueF9kcGRtYV9kZWJ1Z2ZzX3dyaXRlLAorfTsKKwor c3RhdGljIGludCB4aWxpbnhfZHBkbWFfZGVidWdmc19pbml0KHN0cnVjdCBkZXZpY2UgKmRldikK K3sKKwlpbnQgZXJyOworCXN0cnVjdCBkZW50cnkgKnhpbGlueF9kcGRtYV9kZWJ1Z2ZzX2Rpciwg KnhpbGlueF9kcGRtYV9kZWJ1Z2ZzX2ZpbGU7CisKKwlkcGRtYV9kZWJ1Z2ZzLnRlc3RjYXNlID0g RFBETUFfVENfTk9ORTsKKworCXhpbGlueF9kcGRtYV9kZWJ1Z2ZzX2RpciA9IGRlYnVnZnNfY3Jl YXRlX2RpcigiZHBkbWEiLCBOVUxMKTsKKwlpZiAoIXhpbGlueF9kcGRtYV9kZWJ1Z2ZzX2Rpcikg eworCQlkZXZfZXJyKGRldiwgImRlYnVnZnNfY3JlYXRlX2RpciBmYWlsZWRcbiIpOworCQlyZXR1 cm4gLUVOT0RFVjsKKwl9CisKKwl4aWxpbnhfZHBkbWFfZGVidWdmc19maWxlID0KKwkJZGVidWdm c19jcmVhdGVfZmlsZSgidGVzdGNhc2UiLCAwNDQ0LAorCQkJCSAgICB4aWxpbnhfZHBkbWFfZGVi dWdmc19kaXIsIE5VTEwsCisJCQkJICAgICZmb3BzX3hpbGlueF9kcGRtYV9kYmdmcyk7CisJaWYg KCF4aWxpbnhfZHBkbWFfZGVidWdmc19maWxlKSB7CisJCWRldl9lcnIoZGV2LCAiZGVidWdmc19j cmVhdGVfZmlsZSB0ZXN0Y2FzZSBmYWlsZWRcbiIpOworCQllcnIgPSAtRU5PREVWOworCQlnb3Rv IGVycl9kYmdmczsKKwl9CisJcmV0dXJuIDA7CisKK2Vycl9kYmdmczoKKwlkZWJ1Z2ZzX3JlbW92 ZV9yZWN1cnNpdmUoeGlsaW54X2RwZG1hX2RlYnVnZnNfZGlyKTsKKwl4aWxpbnhfZHBkbWFfZGVi dWdmc19kaXIgPSBOVUxMOworCXJldHVybiBlcnI7Cit9CisKKyNlbHNlCitzdGF0aWMgaW50IHhp bGlueF9kcGRtYV9kZWJ1Z2ZzX2luaXQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXJldHVybiAw OworfQorCitzdGF0aWMgdm9pZCB4aWxpbnhfZHBkbWFfZGVidWdmc19pbnRyX2RvbmVfY291bnRf aW5jcihpbnQgY2hhbl9pZCkKK3sKK30KKyNlbmRpZiAvKiBDT05GSUdfWElMSU5YX0RQRE1BX0RF QlVHX0ZTICovCisKKyNkZWZpbmUgdG9fZHBkbWFfdHhfZGVzYyh0eCkgXAorCWNvbnRhaW5lcl9v Zih0eCwgc3RydWN0IHhpbGlueF9kcGRtYV90eF9kZXNjLCBhc3luY190eCkKKworI2RlZmluZSB0 b194aWxpbnhfY2hhbihjaGFuKSBcCisJY29udGFpbmVyX29mKGNoYW4sIHN0cnVjdCB4aWxpbnhf ZHBkbWFfY2hhbiwgY29tbW9uKQorCisvKiBJTyBvcGVyYXRpb25zICovCisKK3N0YXRpYyBpbmxp bmUgdTMyIGRwZG1hX3JlYWQodm9pZCBfX2lvbWVtICpiYXNlLCB1MzIgb2Zmc2V0KQoreworCXJl dHVybiBpb3JlYWQzMihiYXNlICsgb2Zmc2V0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRw ZG1hX3dyaXRlKHZvaWQgX19pb21lbSAqYmFzZSwgdTMyIG9mZnNldCwgdTMyIHZhbCkKK3sKKwlp b3dyaXRlMzIodmFsLCBiYXNlICsgb2Zmc2V0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRw ZG1hX2Nscih2b2lkIF9faW9tZW0gKmJhc2UsIHUzMiBvZmZzZXQsIHUzMiBjbHIpCit7CisJZHBk bWFfd3JpdGUoYmFzZSwgb2Zmc2V0LCBkcGRtYV9yZWFkKGJhc2UsIG9mZnNldCkgJiB+Y2xyKTsK K30KKworc3RhdGljIGlubGluZSB2b2lkIGRwZG1hX3NldCh2b2lkIF9faW9tZW0gKmJhc2UsIHUz MiBvZmZzZXQsIHUzMiBzZXQpCit7CisJZHBkbWFfd3JpdGUoYmFzZSwgb2Zmc2V0LCBkcGRtYV9y ZWFkKGJhc2UsIG9mZnNldCkgfCBzZXQpOworfQorCisvKiBYaWxpbnggRFBETUEgZGVzY3JpcHRv ciBvcGVyYXRpb25zICovCisKKy8qKgorICogeGlsaW54X2RwZG1hX3N3X2Rlc2NfbmV4dF8zMiAt IFNldCAzMiBiaXQgYWRkcmVzcyBvZiBhIG5leHQgc3cgZGVzY3JpcHRvcgorICogQHN3X2Rlc2M6 IGN1cnJlbnQgc29mdHdhcmUgZGVzY3JpcHRvcgorICogQG5leHQ6IG5leHQgZGVzY3JpcHRvcgor ICoKKyAqIFVwZGF0ZSB0aGUgY3VycmVudCBzdyBkZXNjcmlwdG9yIEBzd19kZXNjIHdpdGggMzIg Yml0IGFkZHJlc3Mgb2YgdGhlIG5leHQKKyAqIGRlc2NyaXB0b3IgQG5leHQuCisgKi8KK3N0YXRp YyBpbmxpbmUgdm9pZAoreGlsaW54X2RwZG1hX3N3X2Rlc2NfbmV4dF8zMihzdHJ1Y3QgeGlsaW54 X2RwZG1hX3N3X2Rlc2MgKnN3X2Rlc2MsCisJCQkgICAgIHN0cnVjdCB4aWxpbnhfZHBkbWFfc3df ZGVzYyAqbmV4dCkKK3sKKwlzd19kZXNjLT5ody5uZXh0X2Rlc2MgPSBuZXh0LT5waHlzOworfQor CisvKioKKyAqIHhpbGlueF9kcGRtYV9zd19kZXNjX2FkZHJfMzIgLSBVcGRhdGUgdGhlIHN3IGRl c2NyaXB0b3Igd2l0aCAzMiBiaXQgYWRkcmVzcworICogQHN3X2Rlc2M6IHNvZnR3YXJlIGRlc2Ny aXB0b3IKKyAqIEBwcmV2OiBwcmV2aW91cyBkZXNjcmlwdG9yCisgKiBAZG1hX2FkZHI6IGFycmF5 IG9mIGRtYSBhZGRyZXNzZXMKKyAqIEBudW1fc3JjX2FkZHI6IG51bWJlciBvZiBhZGRyZXNzZXMg aW4gQGRtYV9hZGRyCisgKgorICogVXBkYXRlIHRoZSBkZXNjcmlwdG9yIEBzd19kZXNjIHdpdGgg MzIgYml0IGFkZHJlc3MuCisgKi8KK3N0YXRpYyB2b2lkIHhpbGlueF9kcGRtYV9zd19kZXNjX2Fk ZHJfMzIoc3RydWN0IHhpbGlueF9kcGRtYV9zd19kZXNjICpzd19kZXNjLAorCQkJCQkgc3RydWN0 IHhpbGlueF9kcGRtYV9zd19kZXNjICpwcmV2LAorCQkJCQkgZG1hX2FkZHJfdCBkbWFfYWRkcltd LAorCQkJCQkgdW5zaWduZWQgaW50IG51bV9zcmNfYWRkcikKK3sKKwlzdHJ1Y3QgeGlsaW54X2Rw ZG1hX2h3X2Rlc2MgKmh3X2Rlc2MgPSAmc3dfZGVzYy0+aHc7CisJdW5zaWduZWQgaW50IGk7CisK Kwlod19kZXNjLT5zcmNfYWRkciA9IGRtYV9hZGRyWzBdOworCisJaWYgKHByZXYpCisJCXhpbGlu eF9kcGRtYV9zd19kZXNjX25leHRfMzIocHJldiwgc3dfZGVzYyk7CisKKwlmb3IgKGkgPSAxOyBp IDwgbnVtX3NyY19hZGRyOyBpKyspIHsKKwkJdTMyICphZGRyID0gJmh3X2Rlc2MtPnNyY19hZGRy MjsKKwkJdTMyIGZyYWdfYWRkcjsKKworCQlmcmFnX2FkZHIgPSBkbWFfYWRkcltpXTsKKwkJYWRk cltpIC0gMV0gPSBmcmFnX2FkZHI7CisJfQorfQorCisvKioKKyAqIHhpbGlueF9kcGRtYV9zd19k ZXNjX25leHRfNjQgLSBTZXQgNjQgYml0IGFkZHJlc3Mgb2YgYSBuZXh0IHN3IGRlc2NyaXB0b3IK KyAqIEBzd19kZXNjOiBjdXJyZW50IHNvZnR3YXJlIGRlc2NyaXB0b3IKKyAqIEBuZXh0OiBuZXh0 IGRlc2NyaXB0b3IKKyAqCisgKiBVcGRhdGUgdGhlIGN1cnJlbnQgc3cgZGVzY3JpcHRvciBAc3df ZGVzYyB3aXRoIDY0IGJpdCBhZGRyZXNzIG9mIHRoZSBuZXh0CisgKiBkZXNjcmlwdG9yIEBuZXh0 LgorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK3hpbGlueF9kcGRtYV9zd19kZXNjX25leHRfNjQo c3RydWN0IHhpbGlueF9kcGRtYV9zd19kZXNjICpzd19kZXNjLAorCQkJICAgICBzdHJ1Y3QgeGls aW54X2RwZG1hX3N3X2Rlc2MgKm5leHQpCit7CisJc3dfZGVzYy0+aHcubmV4dF9kZXNjID0gbG93 ZXJfMzJfYml0cyhuZXh0LT5waHlzKTsKKwlzd19kZXNjLT5ody5hZGRyX2V4dCB8PSB1cHBlcl8z Ml9iaXRzKG5leHQtPnBoeXMpICYKKwkJCQlYSUxJTlhfRFBETUFfREVTQ19BRERSX0VYVF9BRERS X01BU0s7Cit9CisKKy8qKgorICogeGlsaW54X2RwZG1hX3N3X2Rlc2NfYWRkcl82NCAtIFVwZGF0 ZSB0aGUgc3cgZGVzY3JpcHRvciB3aXRoIDY0IGJpdCBhZGRyZXNzCisgKiBAc3dfZGVzYzogc29m dHdhcmUgZGVzY3JpcHRvcgorICogQHByZXY6IHByZXZpb3VzIGRlc2NyaXB0b3IKKyAqIEBkbWFf YWRkcjogYXJyYXkgb2YgZG1hIGFkZHJlc3NlcworICogQG51bV9zcmNfYWRkcjogbnVtYmVyIG9m IGFkZHJlc3NlcyBpbiBAZG1hX2FkZHIKKyAqCisgKiBVcGRhdGUgdGhlIGRlc2NyaXB0b3IgQHN3 X2Rlc2Mgd2l0aCA2NCBiaXQgYWRkcmVzcy4KKyAqLworc3RhdGljIHZvaWQgeGlsaW54X2RwZG1h X3N3X2Rlc2NfYWRkcl82NChzdHJ1Y3QgeGlsaW54X2RwZG1hX3N3X2Rlc2MgKnN3X2Rlc2MsCisJ CQkJCSBzdHJ1Y3QgeGlsaW54X2RwZG1hX3N3X2Rlc2MgKnByZXYsCisJCQkJCSBkbWFfYWRkcl90 IGRtYV9hZGRyW10sCisJCQkJCSB1bnNpZ25lZCBpbnQgbnVtX3NyY19hZGRyKQoreworCXN0cnVj dCB4aWxpbnhfZHBkbWFfaHdfZGVzYyAqaHdfZGVzYyA9ICZzd19kZXNjLT5odzsKKwl1bnNpZ25l ZCBpbnQgaTsKKwl1MzIgc3JjX2FkZHJfZXh0bjsKKworCWh3X2Rlc2MtPnNyY19hZGRyID0gbG93 ZXJfMzJfYml0cyhkbWFfYWRkclswXSk7CisJc3JjX2FkZHJfZXh0biA9IHVwcGVyXzMyX2JpdHMo ZG1hX2FkZHJbMF0pICYKKwkJCVhJTElOWF9EUERNQV9ERVNDX0FERFJfRVhUX0FERFJfTUFTSzsK Kwlod19kZXNjLT5hZGRyX2V4dCB8PSAoc3JjX2FkZHJfZXh0biA8PAorCQkJICAgICAgWElMSU5Y X0RQRE1BX0RFU0NfQUREUl9FWFRfQUREUl9TSElGVCk7CisKKwlpZiAocHJldikKKwkJeGlsaW54 X2RwZG1hX3N3X2Rlc2NfbmV4dF82NChwcmV2LCBzd19kZXNjKTsKKworCWZvciAoaSA9IDE7IGkg PCBudW1fc3JjX2FkZHI7IGkrKykgeworCQl1MzIgKmFkZHIgPSAmaHdfZGVzYy0+c3JjX2FkZHIy OworCQl1MzIgKmFkZHJfZXh0ID0gJmh3X2Rlc2MtPmFkZHJfZXh0XzIzOworCQl1NjQgZnJhZ19h ZGRyOworCisJCWZyYWdfYWRkciA9IGRtYV9hZGRyW2ldOworCQlhZGRyW2ldID0gKHUzMilmcmFn X2FkZHI7CisKKwkJZnJhZ19hZGRyID4+PSAzMjsKKwkJZnJhZ19hZGRyICY9IFhJTElOWF9EUERN QV9ERVNDX0FERFJfRVhUX0FERFJfTUFTSzsKKwkJZnJhZ19hZGRyIDw8PSBYSUxJTlhfRFBETUFf REVTQ19BRERSX0VYVF9BRERSX1NISUZUICogKGkgJSAyKTsKKwkJYWRkcl9leHRbaSAvIDJdID0g ZnJhZ19hZGRyOworCX0KK30KKworLyogWGlsaW54IERQRE1BIGNoYW5uZWwgZGVzY3JpcHRvciBv cGVyYXRpb25zICovCisKKy8qKgorICogeGlsaW54X2RwZG1hX2NoYW5fYWxsb2Nfc3dfZGVzYyAt IEFsbG9jYXRlIGEgc29mdHdhcmUgZGVzY3JpcHRvcgorICogQGNoYW46IERQRE1BIGNoYW5uZWwK KyAqCisgKiBBbGxvY2F0ZSBhIHNvZnR3YXJlIGRlc2NyaXB0b3IgZnJvbSB0aGUgY2hhbm5lbCdz IGRlc2NyaXB0b3IgcG9vbC4KKyAqCisgKiBSZXR1cm46IGEgc29mdHdhcmUgZGVzY3JpcHRvciBv ciBOVUxMLgorICovCitzdGF0aWMgc3RydWN0IHhpbGlueF9kcGRtYV9zd19kZXNjICoKK3hpbGlu eF9kcGRtYV9jaGFuX2FsbG9jX3N3X2Rlc2Moc3RydWN0IHhpbGlueF9kcGRtYV9jaGFuICpjaGFu KQoreworCXN0cnVjdCB4aWxpbnhfZHBkbWFfc3dfZGVzYyAqc3dfZGVzYzsKKwlkbWFfYWRkcl90 IHBoeXM7CisKKwlzd19kZXNjID0gZG1hX3Bvb2xfemFsbG9jKGNoYW4tPmRlc2NfcG9vbCwgR0ZQ X0FUT01JQywgJnBoeXMpOworCWlmICghc3dfZGVzYykKKwkJcmV0dXJuIE5VTEw7CisKKwlzd19k ZXNjLT5waHlzID0gcGh5czsKKworCXJldHVybiBzd19kZXNjOworfQorCisvKioKKyAqIHhpbGlu eF9kcGRtYV9jaGFuX2ZyZWVfc3dfZGVzYyAtIEZyZWUgYSBzb2Z0d2FyZSBkZXNjcmlwdG9yCisg KiBAY2hhbjogRFBETUEgY2hhbm5lbAorICogQHN3X2Rlc2M6IHNvZnR3YXJlIGRlc2NyaXB0b3Ig dG8gZnJlZQorICoKKyAqIEZyZWUgYSBzb2Z0d2FyZSBkZXNjcmlwdG9yIGZyb20gdGhlIGNoYW5u ZWwncyBkZXNjcmlwdG9yIHBvb2wuCisgKi8KK3N0YXRpYyB2b2lkCit4aWxpbnhfZHBkbWFfY2hh bl9mcmVlX3N3X2Rlc2Moc3RydWN0IHhpbGlueF9kcGRtYV9jaGFuICpjaGFuLAorCQkJICAgICAg IHN0cnVjdCB4aWxpbnhfZHBkbWFfc3dfZGVzYyAqc3dfZGVzYykKK3sKKwlkbWFfcG9vbF9mcmVl KGNoYW4tPmRlc2NfcG9vbCwgc3dfZGVzYywgc3dfZGVzYy0+cGh5cyk7Cit9CisKKy8qKgorICog eGlsaW54X2RwZG1hX2NoYW5fZHVtcF90eF9kZXNjIC0gRHVtcCBhIHR4IGRlc2NyaXB0b3IKKyAq IEBjaGFuOiBEUERNQSBjaGFubmVsCisgKiBAdHhfZGVzYzogdHggZGVzY3JpcHRvciB0byBkdW1w CisgKgorICogRHVtcCBjb250ZW50cyBvZiBhIHR4IGRlc2NyaXB0b3IKKyAqLworc3RhdGljIHZv aWQgeGlsaW54X2RwZG1hX2NoYW5fZHVtcF90eF9kZXNjKHN0cnVjdCB4aWxpbnhfZHBkbWFfY2hh biAqY2hhbiwKKwkJCQkJICAgc3RydWN0IHhpbGlueF9kcGRtYV90eF9kZXNjICp0eF9kZXNjKQor eworCXN0cnVjdCB4aWxpbnhfZHBkbWFfc3dfZGVzYyAqc3dfZGVzYzsKKwlzdHJ1Y3QgZGV2aWNl ICpkZXYgPSBjaGFuLT54ZGV2LT5kZXY7CisJdW5zaWduZWQgaW50IGkgPSAwOworCisJZGV2X2Ri ZyhkZXYsICItLS0tLS0tIFRYIGRlc2NyaXB0b3IgZHVtcCBzdGFydCAtLS0tLS0tXG4iKTsKKwlk ZXZfZGJnKGRldiwgIi0tLS0tLS0gY2hhbm5lbCBJRCA9ICVkIC0tLS0tLS1cbiIsIGNoYW4tPmlk KTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoc3dfZGVzYywgJnR4X2Rlc2MtPmRlc2NyaXB0b3Jz LCBub2RlKSB7CisJCXN0cnVjdCB4aWxpbnhfZHBkbWFfaHdfZGVzYyAqaHdfZGVzYyA9ICZzd19k ZXNjLT5odzsKKworCQlkZXZfZGJnKGRldiwgIi0tLS0tLS0gSFcgZGVzY3JpcHRvciAlZCAtLS0t LS0tXG4iLCBpKyspOworCQlkZXZfZGJnKGRldiwgImRlc2NyaXB0b3IgcGh5czogJXBhZFxuIiwg JnN3X2Rlc2MtPnBoeXMpOworCQlkZXZfZGJnKGRldiwgImNvbnRyb2w6IDB4JTA4eFxuIiwgaHdf ZGVzYy0+Y29udHJvbCk7CisJCWRldl9kYmcoZGV2LCAiZGVzY19pZDogMHglMDh4XG4iLCBod19k ZXNjLT5kZXNjX2lkKTsKKwkJZGV2X2RiZyhkZXYsICJ4ZmVyX3NpemU6IDB4JTA4eFxuIiwgaHdf ZGVzYy0+eGZlcl9zaXplKTsKKwkJZGV2X2RiZyhkZXYsICJoc2l6ZV9zdHJpZGU6IDB4JTA4eFxu IiwgaHdfZGVzYy0+aHNpemVfc3RyaWRlKTsKKwkJZGV2X2RiZyhkZXYsICJ0aW1lc3RhbXBfbHNi OiAweCUwOHhcbiIsIGh3X2Rlc2MtPnRpbWVzdGFtcF9sc2IpOworCQlkZXZfZGJnKGRldiwgInRp bWVzdGFtcF9tc2I6IDB4JTA4eFxuIiwgaHdfZGVzYy0+dGltZXN0YW1wX21zYik7CisJCWRldl9k YmcoZGV2LCAiYWRkcl9leHQ6IDB4JTA4eFxuIiwgaHdfZGVzYy0+YWRkcl9leHQpOworCQlkZXZf ZGJnKGRldiwgIm5leHRfZGVzYzogMHglMDh4XG4iLCBod19kZXNjLT5uZXh0X2Rlc2MpOworCQlk ZXZfZGJnKGRldiwgInNyY19hZGRyOiAweCUwOHhcbiIsIGh3X2Rlc2MtPnNyY19hZGRyKTsKKwkJ ZGV2X2RiZyhkZXYsICJhZGRyX2V4dF8yMzogMHglMDh4XG4iLCBod19kZXNjLT5hZGRyX2V4dF8y Myk7CisJCWRldl9kYmcoZGV2LCAiYWRkcl9leHRfNDU6IDB4JTA4eFxuIiwgaHdfZGVzYy0+YWRk cl9leHRfNDUpOworCQlkZXZfZGJnKGRldiwgInNyY19hZGRyMjogMHglMDh4XG4iLCBod19kZXNj LT5zcmNfYWRkcjIpOworCQlkZXZfZGJnKGRldiwgInNyY19hZGRyMzogMHglMDh4XG4iLCBod19k ZXNjLT5zcmNfYWRkcjMpOworCQlkZXZfZGJnKGRldiwgInNyY19hZGRyNDogMHglMDh4XG4iLCBo d19kZXNjLT5zcmNfYWRkcjQpOworCQlkZXZfZGJnKGRldiwgInNyY19hZGRyNTogMHglMDh4XG4i LCBod19kZXNjLT5zcmNfYWRkcjUpOworCQlkZXZfZGJnKGRldiwgImNyYzogMHglMDh4XG4iLCBo d19kZXNjLT5jcmMpOworCX0KKworCWRldl9kYmcoZGV2LCAiLS0tLS0tLSBUWCBkZXNjcmlwdG9y IGR1bXAgZW5kIC0tLS0tLS1cbiIpOworfQorCisvKioKKyAqIHhpbGlueF9kcGRtYV9jaGFuX2Fs bG9jX3R4X2Rlc2MgLSBBbGxvY2F0ZSBhIHRyYW5zYWN0aW9uIGRlc2NyaXB0b3IKKyAqIEBjaGFu OiBEUERNQSBjaGFubmVsCisgKgorICogQWxsb2NhdGUgYSB0eCBkZXNjcmlwdG9yLgorICoKKyAq IFJldHVybjogYSB0eCBkZXNjcmlwdG9yIG9yIE5VTEwuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgeGls aW54X2RwZG1hX3R4X2Rlc2MgKgoreGlsaW54X2RwZG1hX2NoYW5fYWxsb2NfdHhfZGVzYyhzdHJ1 Y3QgeGlsaW54X2RwZG1hX2NoYW4gKmNoYW4pCit7CisJc3RydWN0IHhpbGlueF9kcGRtYV90eF9k ZXNjICp0eF9kZXNjOworCisJdHhfZGVzYyA9IGt6YWxsb2Moc2l6ZW9mKCp0eF9kZXNjKSwgR0ZQ X0tFUk5FTCk7CisJaWYgKCF0eF9kZXNjKQorCQlyZXR1cm4gTlVMTDsKKworCUlOSVRfTElTVF9I RUFEKCZ0eF9kZXNjLT5kZXNjcmlwdG9ycyk7CisJdHhfZGVzYy0+c3RhdHVzID0gUFJFUEFSRUQ7 CisKKwlyZXR1cm4gdHhfZGVzYzsKK30KKworLyoqCisgKiB4aWxpbnhfZHBkbWFfY2hhbl9mcmVl X3R4X2Rlc2MgLSBGcmVlIGEgdHJhbnNhY3Rpb24gZGVzY3JpcHRvcgorICogQGNoYW46IERQRE1B IGNoYW5uZWwKKyAqIEB0eF9kZXNjOiB0eCBkZXNjcmlwdG9yCisgKgorICogRnJlZSB0aGUgdHgg ZGVzY3JpcHRvciBAdHhfZGVzYyBpbmNsdWRpbmcgaXRzIHNvZnR3YXJlIGRlc2NyaXB0b3JzLgor ICovCitzdGF0aWMgdm9pZAoreGlsaW54X2RwZG1hX2NoYW5fZnJlZV90eF9kZXNjKHN0cnVjdCB4 aWxpbnhfZHBkbWFfY2hhbiAqY2hhbiwKKwkJCSAgICAgICBzdHJ1Y3QgeGlsaW54X2RwZG1hX3R4 X2Rlc2MgKnR4X2Rlc2MpCit7CisJc3RydWN0IHhpbGlueF9kcGRtYV9zd19kZXNjICpzd19kZXNj LCAqbmV4dDsKKworCWlmICghdHhfZGVzYykKKwkJcmV0dXJuOworCisJbGlzdF9mb3JfZWFjaF9l bnRyeV9zYWZlKHN3X2Rlc2MsIG5leHQsICZ0eF9kZXNjLT5kZXNjcmlwdG9ycywgbm9kZSkgewor CQlsaXN0X2RlbCgmc3dfZGVzYy0+bm9kZSk7CisJCXhpbGlueF9kcGRtYV9jaGFuX2ZyZWVfc3df ZGVzYyhjaGFuLCBzd19kZXNjKTsKKwl9CisKKwlrZnJlZSh0eF9kZXNjKTsKK30KKworLyoqCisg KiB4aWxpbnhfZHBkbWFfY2hhbl9zdWJtaXRfdHhfZGVzYyAtIFN1Ym1pdCBhIHRyYW5zYWN0aW9u IGRlc2NyaXB0b3IKKyAqIEBjaGFuOiBEUERNQSBjaGFubmVsCisgKiBAdHhfZGVzYzogdHggZGVz Y3JpcHRvcgorICoKKyAqIFN1Ym1pdCB0aGUgdHggZGVzY3JpcHRvciBAdHhfZGVzYyB0byB0aGUg Y2hhbm5lbCBAY2hhbi4KKyAqCisgKiBSZXR1cm46IGEgY29va2llIGFzc2lnbmVkIHRvIHRoZSB0 eCBkZXNjcmlwdG9yCisgKi8KK3N0YXRpYyBkbWFfY29va2llX3QKK3hpbGlueF9kcGRtYV9jaGFu X3N1Ym1pdF90eF9kZXNjKHN0cnVjdCB4aWxpbnhfZHBkbWFfY2hhbiAqY2hhbiwKKwkJCQkgc3Ry dWN0IHhpbGlueF9kcGRtYV90eF9kZXNjICp0eF9kZXNjKQoreworCXN0cnVjdCB4aWxpbnhfZHBk bWFfc3dfZGVzYyAqc3dfZGVzYzsKKwlkbWFfY29va2llX3QgY29va2llOworCXVuc2lnbmVkIGxv bmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2hhbi0+bG9jaywgZmxhZ3MpOworCisJ aWYgKGNoYW4tPnN1Ym1pdHRlZF9kZXNjKSB7CisJCWNvb2tpZSA9IGNoYW4tPnN1Ym1pdHRlZF9k ZXNjLT5hc3luY190eC5jb29raWU7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKwljb29raWUg PSBkbWFfY29va2llX2Fzc2lnbigmdHhfZGVzYy0+YXN5bmNfdHgpOworCisJLyogQXNzaWduIHRo ZSBjb29raWUgdG8gZGVzY3JpcHRvcnMgaW4gdGhpcyB0cmFuc2FjdGlvbiAqLworCS8qIE9ubHkg MTYgYml0IHdpbGwgYmUgdXNlZCwgYnV0IGl0IHNob3VsZCBiZSBlbm91Z2ggKi8KKwlsaXN0X2Zv cl9lYWNoX2VudHJ5KHN3X2Rlc2MsICZ0eF9kZXNjLT5kZXNjcmlwdG9ycywgbm9kZSkKKwkJc3df ZGVzYy0+aHcuZGVzY19pZCA9IGNvb2tpZTsKKworCWlmICh0eF9kZXNjICE9IGNoYW4tPmFsbG9j YXRlZF9kZXNjKQorCQlkZXZfZXJyKGNoYW4tPnhkZXYtPmRldiwgImRlc2MgIT0gYWxsb2NhdGVk X2Rlc2NcbiIpOworCWVsc2UKKwkJY2hhbi0+YWxsb2NhdGVkX2Rlc2MgPSBOVUxMOworCWNoYW4t PnN1Ym1pdHRlZF9kZXNjID0gdHhfZGVzYzsKKworCWlmIChjaGFuLT5pZCA9PSBWSURFTzEgfHwg Y2hhbi0+aWQgPT0gVklERU8yKSB7CisJCWNoYW4tPnZpZGVvX2dyb3VwID0gdHJ1ZTsKKwkJY2hh bi0+eGRldi0+Y2hhbltWSURFTzBdLT52aWRlb19ncm91cCA9IHRydWU7CisJfQorCitvdXRfdW5s b2NrOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoYW4tPmxvY2ssIGZsYWdzKTsKKworCXJl dHVybiBjb29raWU7Cit9CisKKy8qKgorICogeGlsaW54X2RwZG1hX2NoYW5fZnJlZV9kZXNjX2xp c3QgLSBGcmVlIGEgZGVzY3JpcHRvciBsaXN0CisgKiBAY2hhbjogRFBETUEgY2hhbm5lbAorICog QGxpc3Q6IHR4IGRlc2NyaXB0b3IgbGlzdAorICoKKyAqIEZyZWUgdHggZGVzY3JpcHRvcnMgaW4g dGhlIGxpc3QgQGxpc3QuCisgKi8KK3N0YXRpYyB2b2lkIHhpbGlueF9kcGRtYV9jaGFuX2ZyZWVf ZGVzY19saXN0KHN0cnVjdCB4aWxpbnhfZHBkbWFfY2hhbiAqY2hhbiwKKwkJCQkJICAgICBzdHJ1 Y3QgbGlzdF9oZWFkICpsaXN0KQoreworCXN0cnVjdCB4aWxpbnhfZHBkbWFfdHhfZGVzYyAqdHhf ZGVzYywgKm5leHQ7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodHhfZGVzYywgbmV4dCwg bGlzdCwgbm9kZSkgeworCQlsaXN0X2RlbCgmdHhfZGVzYy0+bm9kZSk7CisJCXhpbGlueF9kcGRt YV9jaGFuX2ZyZWVfdHhfZGVzYyhjaGFuLCB0eF9kZXNjKTsKKwl9Cit9CisKKy8qKgorICogeGls aW54X2RwZG1hX2NoYW5fZnJlZV9hbGxfZGVzYyAtIEZyZWUgYWxsIGRlc2NyaXB0b3JzIG9mIHRo ZSBjaGFubmVsCisgKiBAY2hhbjogRFBETUEgY2hhbm5lbAorICoKKyAqIEZyZWUgYWxsIGRlc2Ny aXB0b3JzIGFzc29jaWF0ZWQgd2l0aCB0aGUgY2hhbm5lbC4gVGhlIGNoYW5uZWwgc2hvdWxkIGJl CisgKiBkaXNhYmxlZCBiZWZvcmUgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQsIG90aGVyd2lzZSwg dGhpcyBmdW5jdGlvbiBtYXkKKyAqIHJlc3VsdCBpbiBtaXNiZWhhdmlvciBvZiB0aGUgc3lzdGVt IGR1ZSB0byByZW1haW5pbmcgb3V0c3RhbmRpbmcKKyAqIHRyYW5zYWN0aW9ucy4KKyAqLworc3Rh dGljIHZvaWQgeGlsaW54X2RwZG1hX2NoYW5fZnJlZV9hbGxfZGVzYyhzdHJ1Y3QgeGlsaW54X2Rw ZG1hX2NoYW4gKmNoYW4pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19p cnFzYXZlKCZjaGFuLT5sb2NrLCBmbGFncyk7CisKKwlkZXZfZGJnKGNoYW4tPnhkZXYtPmRldiwg ImNoYW4tPnN0YXR1cyA9ICVzXG4iLAorCQljaGFuLT5zdGF0dXMgPT0gU1RSRUFNSU5HID8gIlNU UkVBTUlORyIgOiAiSURMRSIpOworCisJeGlsaW54X2RwZG1hX2NoYW5fZnJlZV90eF9kZXNjKGNo YW4sIGNoYW4tPmFsbG9jYXRlZF9kZXNjKTsKKwljaGFuLT5hbGxvY2F0ZWRfZGVzYyA9IE5VTEw7 CisJeGlsaW54X2RwZG1hX2NoYW5fZnJlZV90eF9kZXNjKGNoYW4sIGNoYW4tPnN1Ym1pdHRlZF9k ZXNjKTsKKwljaGFuLT5zdWJtaXR0ZWRfZGVzYyA9IE5VTEw7CisJeGlsaW54X2RwZG1hX2NoYW5f ZnJlZV90eF9kZXNjKGNoYW4sIGNoYW4tPnBlbmRpbmdfZGVzYyk7CisJY2hhbi0+cGVuZGluZ19k ZXNjID0gTlVMTDsKKwl4aWxpbnhfZHBkbWFfY2hhbl9mcmVlX3R4X2Rlc2MoY2hhbiwgY2hhbi0+ YWN0aXZlX2Rlc2MpOworCWNoYW4tPmFjdGl2ZV9kZXNjID0gTlVMTDsKKwl4aWxpbnhfZHBkbWFf Y2hhbl9mcmVlX2Rlc2NfbGlzdChjaGFuLCAmY2hhbi0+ZG9uZV9saXN0KTsKKworCXNwaW5fdW5s b2NrX2lycXJlc3RvcmUoJmNoYW4tPmxvY2ssIGZsYWdzKTsKK30KKworLyoqCisgKiB4aWxpbnhf ZHBkbWFfY2hhbl9jbGVhbnVwX2Rlc2MgLSBDbGVhbiB1cCBkZXNjcmlwdG9ycworICogQGNoYW46 IERQRE1BIGNoYW5uZWwKKyAqCisgKiBUcmlnZ2VyIHRoZSBjb21wbGV0ZSBjYWxsYmFja3Mgb2Yg ZGVzY3JpcHRvcnMgd2l0aCBmaW5pc2hlZCB0cmFuc2FjdGlvbnMuCisgKiBGcmVlIGRlc2NyaXB0 b3JzIHdoaWNoIGFyZSBubyBsb25nZXIgaW4gdXNlLgorICovCitzdGF0aWMgdm9pZCB4aWxpbnhf ZHBkbWFfY2hhbl9jbGVhbnVwX2Rlc2Moc3RydWN0IHhpbGlueF9kcGRtYV9jaGFuICpjaGFuKQor eworCXN0cnVjdCB4aWxpbnhfZHBkbWFfdHhfZGVzYyAqZGVzYzsKKwlkbWFfYXN5bmNfdHhfY2Fs bGJhY2sgY2FsbGJhY2s7CisJdm9pZCAqY2FsbGJhY2tfcGFyYW07CisJdW5zaWduZWQgbG9uZyBm bGFnczsKKwl1bnNpZ25lZCBpbnQgY250LCBpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNoYW4t PmxvY2ssIGZsYWdzKTsKKworCXdoaWxlICghbGlzdF9lbXB0eSgmY2hhbi0+ZG9uZV9saXN0KSkg eworCQlkZXNjID0gbGlzdF9maXJzdF9lbnRyeSgmY2hhbi0+ZG9uZV9saXN0LAorCQkJCQlzdHJ1 Y3QgeGlsaW54X2RwZG1hX3R4X2Rlc2MsIG5vZGUpOworCQlsaXN0X2RlbCgmZGVzYy0+bm9kZSk7 CisKKwkJY250ID0gZGVzYy0+ZG9uZV9jbnQ7CisJCWRlc2MtPmRvbmVfY250ID0gMDsKKwkJY2Fs bGJhY2sgPSBkZXNjLT5hc3luY190eC5jYWxsYmFjazsKKwkJY2FsbGJhY2tfcGFyYW0gPSBkZXNj LT5hc3luY190eC5jYWxsYmFja19wYXJhbTsKKwkJaWYgKGNhbGxiYWNrKSB7CisJCQlzcGluX3Vu bG9ja19pcnFyZXN0b3JlKCZjaGFuLT5sb2NrLCBmbGFncyk7CisJCQlmb3IgKGkgPSAwOyBpIDwg Y250OyBpKyspCisJCQkJY2FsbGJhY2soY2FsbGJhY2tfcGFyYW0pOworCQkJc3Bpbl9sb2NrX2ly cXNhdmUoJmNoYW4tPmxvY2ssIGZsYWdzKTsKKwkJfQorCisJCXhpbGlueF9kcGRtYV9jaGFuX2Zy ZWVfdHhfZGVzYyhjaGFuLCBkZXNjKTsKKwl9CisKKwlpZiAoY2hhbi0+YWN0aXZlX2Rlc2MpIHsK KwkJY250ID0gY2hhbi0+YWN0aXZlX2Rlc2MtPmRvbmVfY250OworCQljaGFuLT5hY3RpdmVfZGVz Yy0+ZG9uZV9jbnQgPSAwOworCQljYWxsYmFjayA9IGNoYW4tPmFjdGl2ZV9kZXNjLT5hc3luY190 eC5jYWxsYmFjazsKKwkJY2FsbGJhY2tfcGFyYW0gPSBjaGFuLT5hY3RpdmVfZGVzYy0+YXN5bmNf dHguY2FsbGJhY2tfcGFyYW07CisJCWlmIChjYWxsYmFjaykgeworCQkJc3Bpbl91bmxvY2tfaXJx cmVzdG9yZSgmY2hhbi0+bG9jaywgZmxhZ3MpOworCQkJZm9yIChpID0gMDsgaSA8IGNudDsgaSsr KQorCQkJCWNhbGxiYWNrKGNhbGxiYWNrX3BhcmFtKTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZj aGFuLT5sb2NrLCBmbGFncyk7CisJCX0KKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZj aGFuLT5sb2NrLCBmbGFncyk7Cit9CisKKy8qKgorICogeGlsaW54X2RwZG1hX2NoYW5fZGVzY19h Y3RpdmUgLSBTZXQgdGhlIGRlc2NyaXB0b3IgYXMgYWN0aXZlCisgKiBAY2hhbjogRFBETUEgY2hh bm5lbAorICoKKyAqIE1ha2UgdGhlIHBlbmRpbmcgZGVzY3JpcHRvciBAY2hhbi0+cGVuZGluZ19k ZXNjIGFzIGFjdGl2ZS4gVGhpcyBmdW5jdGlvbgorICogc2hvdWxkIGJlIGNhbGxlZCB3aGVuIHRo ZSBjaGFubmVsIHN0YXJ0cyBvcGVyYXRpbmcgb24gdGhlIHBlbmRpbmcgZGVzY3JpcHRvci4KKyAq Lworc3RhdGljIHZvaWQgeGlsaW54X2RwZG1hX2NoYW5fZGVzY19hY3RpdmUoc3RydWN0IHhpbGlu eF9kcGRtYV9jaGFuICpjaGFuKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xv Y2tfaXJxc2F2ZSgmY2hhbi0+bG9jaywgZmxhZ3MpOworCisJaWYgKCFjaGFuLT5wZW5kaW5nX2Rl c2MpCisJCWdvdG8gb3V0X3VubG9jazsKKworCWlmIChjaGFuLT5hY3RpdmVfZGVzYykKKwkJbGlz dF9hZGRfdGFpbCgmY2hhbi0+YWN0aXZlX2Rlc2MtPm5vZGUsICZjaGFuLT5kb25lX2xpc3QpOwor CisJY2hhbi0+YWN0aXZlX2Rlc2MgPSBjaGFuLT5wZW5kaW5nX2Rlc2M7CisJY2hhbi0+cGVuZGlu Z19kZXNjID0gTlVMTDsKKworb3V0X3VubG9jazoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZj aGFuLT5sb2NrLCBmbGFncyk7Cit9CisKKy8qKgorICogeGlsaW54X2RwZG1hX2NoYW5fZGVzY19k b25lX2ludHIgLSBNYXJrIHRoZSBjdXJyZW50IGRlc2NyaXB0b3IgYXMgJ2RvbmUnCisgKiBAY2hh bjogRFBETUEgY2hhbm5lbAorICoKKyAqIE1hcmsgdGhlIGN1cnJlbnQgYWN0aXZlIGRlc2NyaXB0 b3IgQGNoYW4tPmFjdGl2ZV9kZXNjIGFzICdkb25lJy4gVGhpcworICogZnVuY3Rpb24gc2hvdWxk IGJlIGNhbGxlZCB0byBtYXJrIGNvbXBsZXRpb24gb2YgdGhlIGN1cnJlbnRseSBhY3RpdmUKKyAq IGRlc2NyaXB0b3IuCisgKi8KK3N0YXRpYyB2b2lkIHhpbGlueF9kcGRtYV9jaGFuX2Rlc2NfZG9u ZV9pbnRyKHN0cnVjdCB4aWxpbnhfZHBkbWFfY2hhbiAqY2hhbikKK3sKKwl1bnNpZ25lZCBsb25n IGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNoYW4tPmxvY2ssIGZsYWdzKTsKKworCXhp bGlueF9kcGRtYV9kZWJ1Z2ZzX2ludHJfZG9uZV9jb3VudF9pbmNyKGNoYW4tPmlkKTsKKworCWlm ICghY2hhbi0+YWN0aXZlX2Rlc2MpIHsKKwkJZGV2X2RiZyhjaGFuLT54ZGV2LT5kZXYsICJkb25l IGludHIgd2l0aCBubyBhY3RpdmUgZGVzY1xuIik7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisK KwljaGFuLT5hY3RpdmVfZGVzYy0+ZG9uZV9jbnQrKzsKKwlpZiAoY2hhbi0+YWN0aXZlX2Rlc2Mt PnN0YXR1cyA9PSAgUFJFUEFSRUQpIHsKKwkJZG1hX2Nvb2tpZV9jb21wbGV0ZSgmY2hhbi0+YWN0 aXZlX2Rlc2MtPmFzeW5jX3R4KTsKKwkJY2hhbi0+YWN0aXZlX2Rlc2MtPnN0YXR1cyA9IEFDVElW RTsKKwl9CisKK291dF91bmxvY2s6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hhbi0+bG9j aywgZmxhZ3MpOworCXRhc2tsZXRfc2NoZWR1bGUoJmNoYW4tPmRvbmVfdGFzayk7Cit9CisKKy8q KgorICogeGlsaW54X2RwZG1hX2NoYW5fcHJlcF9zbGF2ZV9zZyAtIFByZXBhcmUgYSBzY2F0dGVy LWdhdGhlciBkbWEgZGVzY3JpcHRvcgorICogQGNoYW46IERQRE1BIGNoYW5uZWwKKyAqIEBzZ2w6 IHNjYXR0ZXItZ2F0aGVyIGxpc3QKKyAqCisgKiBQcmVwYXJlIGEgdHggZGVzY3JpcHRvciBpbmN1 ZGxpbmcgaW50ZXJuYWwgc29mdHdhcmUvaGFyZHdhcmUgZGVzY3JpcHRvcnMKKyAqIGZvciB0aGUg Z2l2ZW4gc2NhdHRlci1nYXRoZXIgdHJhbnNhY3Rpb24uCisgKgorICogUmV0dXJuOiBBIGRtYSBh c3luYyB0eCBkZXNjcmlwdG9yIG9uIHN1Y2Nlc3MsIG9yIE5VTEwuCisgKi8KK3N0YXRpYyBzdHJ1 Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKgoreGlsaW54X2RwZG1hX2NoYW5fcHJlcF9zbGF2 ZV9zZyhzdHJ1Y3QgeGlsaW54X2RwZG1hX2NoYW4gKmNoYW4sCisJCQkJc3RydWN0IHNjYXR0ZXJs aXN0ICpzZ2wpCit7CisJc3RydWN0IHhpbGlueF9kcGRtYV90eF9kZXNjICp0eF9kZXNjOworCXN0 cnVjdCB4aWxpbnhfZHBkbWFfc3dfZGVzYyAqc3dfZGVzYywgKmxhc3QgPSBOVUxMOworCXN0cnVj dCBzY2F0dGVybGlzdCAqaXRlciA9IHNnbDsKKwl1MzIgbGluZV9zaXplID0gMDsKKworCWlmIChj aGFuLT5hbGxvY2F0ZWRfZGVzYykKKwkJcmV0dXJuICZjaGFuLT5hbGxvY2F0ZWRfZGVzYy0+YXN5 bmNfdHg7CisKKwl0eF9kZXNjID0geGlsaW54X2RwZG1hX2NoYW5fYWxsb2NfdHhfZGVzYyhjaGFu KTsKKwlpZiAoIXR4X2Rlc2MpCisJCXJldHVybiBOVUxMOworCisJd2hpbGUgKCFzZ19pc19jaGFp bihpdGVyKSkKKwkJbGluZV9zaXplICs9IHNnX2RtYV9sZW4oaXRlcisrKTsKKworCXdoaWxlIChz Z2wpIHsKKwkJc3RydWN0IHhpbGlueF9kcGRtYV9od19kZXNjICpod19kZXNjOworCQlkbWFfYWRk cl90IGRtYV9hZGRyWzRdOworCQl1bnNpZ25lZCBpbnQgbnVtX3BhZ2VzID0gMDsKKworCQlzd19k ZXNjID0geGlsaW54X2RwZG1hX2NoYW5fYWxsb2Nfc3dfZGVzYyhjaGFuKTsKKwkJaWYgKCFzd19k ZXNjKQorCQkJZ290byBlcnJvcjsKKworCQl3aGlsZSAoIXNnX2lzX2NoYWluKHNnbCkgJiYgIXNn X2lzX2xhc3Qoc2dsKSkgeworCQkJZG1hX2FkZHJbbnVtX3BhZ2VzXSA9IHNnX2RtYV9hZGRyZXNz KHNnbCsrKTsKKwkJCWlmICghSVNfQUxJR05FRChkbWFfYWRkcltudW1fcGFnZXMrK10sCisJCQkJ CVhJTElOWF9EUERNQV9BTElHTl9CWVRFUykpIHsKKwkJCQlkZXZfZXJyKGNoYW4tPnhkZXYtPmRl diwKKwkJCQkJImJ1ZmZlciBzaG91bGQgYmUgYWxpZ25lZCBhdCAlZCBCXG4iLAorCQkJCQlYSUxJ TlhfRFBETUFfQUxJR05fQllURVMpOworCQkJCWdvdG8gZXJyb3I7CisJCQl9CisJCX0KKworCQlj aGFuLT54ZGV2LT5kZXNjX2FkZHIoc3dfZGVzYywgbGFzdCwgZG1hX2FkZHIsIG51bV9wYWdlcyk7 CisJCWh3X2Rlc2MgPSAmc3dfZGVzYy0+aHc7CisJCWh3X2Rlc2MtPnhmZXJfc2l6ZSA9IGxpbmVf c2l6ZTsKKwkJaHdfZGVzYy0+aHNpemVfc3RyaWRlID0KKwkJCWxpbmVfc2l6ZSA8PCBYSUxJTlhf RFBETUFfREVTQ19IU0laRV9TVFJJREVfSFNJWkVfU0hJRlQ7CisJCWh3X2Rlc2MtPmNvbnRyb2wg fD0gWElMSU5YX0RQRE1BX0RFU0NfQ09OVFJPTF9QUkVFTUJMRTsKKwkJaHdfZGVzYy0+Y29udHJv bCB8PSBYSUxJTlhfRFBETUFfREVTQ19DT05UUk9MX0ZSQUdfTU9ERTsKKwkJaHdfZGVzYy0+Y29u dHJvbCB8PSBYSUxJTlhfRFBETUFfREVTQ19DT05UUk9MX0lHTk9SRV9ET05FOworCisJCWxpc3Rf YWRkX3RhaWwoJnN3X2Rlc2MtPm5vZGUsICZ0eF9kZXNjLT5kZXNjcmlwdG9ycyk7CisJCWxhc3Qg PSBzd19kZXNjOworCQlpZiAoc2dfaXNfbGFzdChzZ2wpKQorCQkJYnJlYWs7CisJCXNnbCA9IHNn X2NoYWluX3B0cihzZ2wpOworCX0KKworCXN3X2Rlc2MgPSBsaXN0X2ZpcnN0X2VudHJ5KCZ0eF9k ZXNjLT5kZXNjcmlwdG9ycywKKwkJCQkgICBzdHJ1Y3QgeGlsaW54X2RwZG1hX3N3X2Rlc2MsIG5v ZGUpOworCWlmIChjaGFuLT54ZGV2LT5leHRfYWRkcikKKwkJeGlsaW54X2RwZG1hX3N3X2Rlc2Nf bmV4dF82NChsYXN0LCBzd19kZXNjKTsKKwllbHNlCisJCXhpbGlueF9kcGRtYV9zd19kZXNjX25l eHRfMzIobGFzdCwgc3dfZGVzYyk7CisJbGFzdC0+aHcuY29udHJvbCB8PSBYSUxJTlhfRFBETUFf REVTQ19DT05UUk9MX0NPTVBMRVRFX0lOVFI7CisJbGFzdC0+aHcuY29udHJvbCB8PSBYSUxJTlhf RFBETUFfREVTQ19DT05UUk9MX0xBU1RfT0ZfRlJBTUU7CisKKwljaGFuLT5hbGxvY2F0ZWRfZGVz YyA9IHR4X2Rlc2M7CisKKwlyZXR1cm4gJnR4X2Rlc2MtPmFzeW5jX3R4OworCitlcnJvcjoKKwl4 aWxpbnhfZHBkbWFfY2hhbl9mcmVlX3R4X2Rlc2MoY2hhbiwgdHhfZGVzYyk7CisKKwlyZXR1cm4g TlVMTDsKK30KKworLyoqCisgKiB4aWxpbnhfZHBkbWFfY2hhbl9wcmVwX2N5Y2xpYyAtIFByZXBh cmUgYSBjeWNsaWMgZG1hIGRlc2NyaXB0b3IKKyAqIEBjaGFuOiBEUERNQSBjaGFubmVsCisgKiBA YnVmX2FkZHI6IGJ1ZmZlciBhZGRyZXNzCisgKiBAYnVmX2xlbjogYnVmZmVyIGxlbmd0aAorICog QHBlcmlvZF9sZW46IG51bWJlciBvZiBwZXJpb2RzCisgKgorICogUHJlcGFyZSBhIHR4IGRlc2Ny aXB0b3IgaW5jdWRsaW5nIGludGVybmFsIHNvZnR3YXJlL2hhcmR3YXJlIGRlc2NyaXB0b3JzCisg KiBmb3IgdGhlIGdpdmVuIGN5Y2xpYyB0cmFuc2FjdGlvbi4KKyAqCisgKiBSZXR1cm46IEEgZG1h IGFzeW5jIHR4IGRlc2NyaXB0b3Igb24gc3VjY2Vzcywgb3IgTlVMTC4KKyAqLworc3RhdGljIHN0 cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqCit4aWxpbnhfZHBkbWFfY2hhbl9wcmVwX2N5 Y2xpYyhzdHJ1Y3QgeGlsaW54X2RwZG1hX2NoYW4gKmNoYW4sCisJCQkgICAgICBkbWFfYWRkcl90 IGJ1Zl9hZGRyLCBzaXplX3QgYnVmX2xlbiwKKwkJCSAgICAgIHNpemVfdCBwZXJpb2RfbGVuKQor eworCXN0cnVjdCB4aWxpbnhfZHBkbWFfdHhfZGVzYyAqdHhfZGVzYzsKKwlzdHJ1Y3QgeGlsaW54 X2RwZG1hX3N3X2Rlc2MgKnN3X2Rlc2MsICpsYXN0ID0gTlVMTDsKKwl1bnNpZ25lZCBpbnQgcGVy aW9kcyA9IGJ1Zl9sZW4gLyBwZXJpb2RfbGVuOworCXVuc2lnbmVkIGludCBpOworCisJaWYgKGNo YW4tPmFsbG9jYXRlZF9kZXNjKQorCQlyZXR1cm4gJmNoYW4tPmFsbG9jYXRlZF9kZXNjLT5hc3lu Y190eDsKKworCXR4X2Rlc2MgPSB4aWxpbnhfZHBkbWFfY2hhbl9hbGxvY190eF9kZXNjKGNoYW4p OworCWlmICghdHhfZGVzYykKKwkJcmV0dXJuIE5VTEw7CisKKwlmb3IgKGkgPSAwOyBpIDwgcGVy aW9kczsgaSsrKSB7CisJCXN0cnVjdCB4aWxpbnhfZHBkbWFfaHdfZGVzYyAqaHdfZGVzYzsKKwor CQlpZiAoIUlTX0FMSUdORUQoYnVmX2FkZHIsIFhJTElOWF9EUERNQV9BTElHTl9CWVRFUykpIHsK KwkJCWRldl9lcnIoY2hhbi0+eGRldi0+ZGV2LAorCQkJCSJidWZmZXIgc2hvdWxkIGJlIGFsaWdu ZWQgYXQgJWQgQlxuIiwKKwkJCQlYSUxJTlhfRFBETUFfQUxJR05fQllURVMpOworCQkJZ290byBl cnJvcjsKKwkJfQorCisJCXN3X2Rlc2MgPSB4aWxpbnhfZHBkbWFfY2hhbl9hbGxvY19zd19kZXNj KGNoYW4pOworCQlpZiAoIXN3X2Rlc2MpCisJCQlnb3RvIGVycm9yOworCisJCWNoYW4tPnhkZXYt PmRlc2NfYWRkcihzd19kZXNjLCBsYXN0LCAmYnVmX2FkZHIsIDEpOworCQlod19kZXNjID0gJnN3 X2Rlc2MtPmh3OworCQlod19kZXNjLT54ZmVyX3NpemUgPSBwZXJpb2RfbGVuOworCQlod19kZXNj LT5oc2l6ZV9zdHJpZGUgPQorCQkJcGVyaW9kX2xlbiA8PAorCQkJWElMSU5YX0RQRE1BX0RFU0Nf SFNJWkVfU1RSSURFX0hTSVpFX1NISUZUOworCQlod19kZXNjLT5oc2l6ZV9zdHJpZGUgfD0KKwkJ CXBlcmlvZF9sZW4gPDwKKwkJCVhJTElOWF9EUERNQV9ERVNDX0hTSVpFX1NUUklERV9TVFJJREVf U0hJRlQ7CisJCWh3X2Rlc2MtPmNvbnRyb2wgfD0gWElMSU5YX0RQRE1BX0RFU0NfQ09OVFJPTF9Q UkVFTUJMRTsKKwkJaHdfZGVzYy0+Y29udHJvbCB8PSBYSUxJTlhfRFBETUFfREVTQ19DT05UUk9M X0lHTk9SRV9ET05FOworCQlod19kZXNjLT5jb250cm9sIHw9IFhJTElOWF9EUERNQV9ERVNDX0NP TlRST0xfQ09NUExFVEVfSU5UUjsKKworCQlsaXN0X2FkZF90YWlsKCZzd19kZXNjLT5ub2RlLCAm dHhfZGVzYy0+ZGVzY3JpcHRvcnMpOworCisJCWJ1Zl9hZGRyICs9IHBlcmlvZF9sZW47CisJCWxh c3QgPSBzd19kZXNjOworCX0KKworCXN3X2Rlc2MgPSBsaXN0X2ZpcnN0X2VudHJ5KCZ0eF9kZXNj LT5kZXNjcmlwdG9ycywKKwkJCQkgICBzdHJ1Y3QgeGlsaW54X2RwZG1hX3N3X2Rlc2MsIG5vZGUp OworCWlmIChjaGFuLT54ZGV2LT5leHRfYWRkcikKKwkJeGlsaW54X2RwZG1hX3N3X2Rlc2NfbmV4 dF82NChsYXN0LCBzd19kZXNjKTsKKwllbHNlCisJCXhpbGlueF9kcGRtYV9zd19kZXNjX25leHRf MzIobGFzdCwgc3dfZGVzYyk7CisJbGFzdC0+aHcuY29udHJvbCB8PSBYSUxJTlhfRFBETUFfREVT Q19DT05UUk9MX0xBU1RfT0ZfRlJBTUU7CisKKwljaGFuLT5hbGxvY2F0ZWRfZGVzYyA9IHR4X2Rl c2M7CisKKwlyZXR1cm4gJnR4X2Rlc2MtPmFzeW5jX3R4OworCitlcnJvcjoKKwl4aWxpbnhfZHBk bWFfY2hhbl9mcmVlX3R4X2Rlc2MoY2hhbiwgdHhfZGVzYyk7CisKKwlyZXR1cm4gTlVMTDsKK30K KworLyoqCisgKiB4aWxpbnhfZHBkbWFfY2hhbl9wcmVwX2ludGVybGVhdmVkIC0gUHJlcGFyZSBh IGludGVybGVhdmVkIGRtYSBkZXNjcmlwdG9yCisgKiBAY2hhbjogRFBETUEgY2hhbm5lbAorICog QHh0OiBkbWEgaW50ZXJsZWF2ZWQgdGVtcGxhdGUKKyAqCisgKiBQcmVwYXJlIGEgdHggZGVzY3Jp cHRvciBpbmN1ZGxpbmcgaW50ZXJuYWwgc29mdHdhcmUvaGFyZHdhcmUgZGVzY3JpcHRvcnMKKyAq IGJhc2VkIG9uIEB4dC4KKyAqCisgKiBSZXR1cm46IEEgZG1hIGFzeW5jIHR4IGRlc2NyaXB0b3Ig b24gc3VjY2Vzcywgb3IgTlVMTC4KKyAqLworc3RhdGljIHN0cnVjdCBkbWFfYXN5bmNfdHhfZGVz Y3JpcHRvciAqCit4aWxpbnhfZHBkbWFfY2hhbl9wcmVwX2ludGVybGVhdmVkKHN0cnVjdCB4aWxp bnhfZHBkbWFfY2hhbiAqY2hhbiwKKwkJCQkgICBzdHJ1Y3QgZG1hX2ludGVybGVhdmVkX3RlbXBs YXRlICp4dCkKK3sKKwlzdHJ1Y3QgeGlsaW54X2RwZG1hX3R4X2Rlc2MgKnR4X2Rlc2M7CisJc3Ry dWN0IHhpbGlueF9kcGRtYV9zd19kZXNjICpzd19kZXNjOworCXN0cnVjdCB4aWxpbnhfZHBkbWFf aHdfZGVzYyAqaHdfZGVzYzsKKwlzaXplX3QgaHNpemUgPSB4dC0+c2dsWzBdLnNpemU7CisJc2l6 ZV90IHN0cmlkZSA9IGhzaXplICsgeHQtPnNnbFswXS5pY2c7CisKKwlpZiAoIUlTX0FMSUdORUQo eHQtPnNyY19zdGFydCwgWElMSU5YX0RQRE1BX0FMSUdOX0JZVEVTKSkgeworCQlkZXZfZXJyKGNo YW4tPnhkZXYtPmRldiwgImJ1ZmZlciBzaG91bGQgYmUgYWxpZ25lZCBhdCAlZCBCXG4iLAorCQkJ WElMSU5YX0RQRE1BX0FMSUdOX0JZVEVTKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKGNo YW4tPmFsbG9jYXRlZF9kZXNjKQorCQlyZXR1cm4gJmNoYW4tPmFsbG9jYXRlZF9kZXNjLT5hc3lu Y190eDsKKworCXR4X2Rlc2MgPSB4aWxpbnhfZHBkbWFfY2hhbl9hbGxvY190eF9kZXNjKGNoYW4p OworCWlmICghdHhfZGVzYykKKwkJcmV0dXJuIE5VTEw7CisKKwlzd19kZXNjID0geGlsaW54X2Rw ZG1hX2NoYW5fYWxsb2Nfc3dfZGVzYyhjaGFuKTsKKwlpZiAoIXN3X2Rlc2MpCisJCWdvdG8gZXJy b3I7CisKKwljaGFuLT54ZGV2LT5kZXNjX2FkZHIoc3dfZGVzYywgc3dfZGVzYywgJnh0LT5zcmNf c3RhcnQsIDEpOworCWh3X2Rlc2MgPSAmc3dfZGVzYy0+aHc7CisJaHdfZGVzYy0+eGZlcl9zaXpl ID0gaHNpemUgKiB4dC0+bnVtZjsKKwlod19kZXNjLT5oc2l6ZV9zdHJpZGUgPSBoc2l6ZSA8PAor CQkJCVhJTElOWF9EUERNQV9ERVNDX0hTSVpFX1NUUklERV9IU0laRV9TSElGVDsKKwlod19kZXNj LT5oc2l6ZV9zdHJpZGUgfD0gKHN0cmlkZSAvIDE2KSA8PAorCQkJCSBYSUxJTlhfRFBETUFfREVT Q19IU0laRV9TVFJJREVfU1RSSURFX1NISUZUOworCWh3X2Rlc2MtPmNvbnRyb2wgfD0gWElMSU5Y X0RQRE1BX0RFU0NfQ09OVFJPTF9QUkVFTUJMRTsKKwlod19kZXNjLT5jb250cm9sIHw9IFhJTElO WF9EUERNQV9ERVNDX0NPTlRST0xfQ09NUExFVEVfSU5UUjsKKwlod19kZXNjLT5jb250cm9sIHw9 IFhJTElOWF9EUERNQV9ERVNDX0NPTlRST0xfSUdOT1JFX0RPTkU7CisJaHdfZGVzYy0+Y29udHJv bCB8PSBYSUxJTlhfRFBETUFfREVTQ19DT05UUk9MX0xBU1RfT0ZfRlJBTUU7CisKKwlsaXN0X2Fk ZF90YWlsKCZzd19kZXNjLT5ub2RlLCAmdHhfZGVzYy0+ZGVzY3JpcHRvcnMpOworCWNoYW4tPmFs bG9jYXRlZF9kZXNjID0gdHhfZGVzYzsKKworCXJldHVybiAmdHhfZGVzYy0+YXN5bmNfdHg7CisK K2Vycm9yOgorCXhpbGlueF9kcGRtYV9jaGFuX2ZyZWVfdHhfZGVzYyhjaGFuLCB0eF9kZXNjKTsK KworCXJldHVybiBOVUxMOworfQorCisvKiBYaWxpbnggRFBETUEgY2hhbm5lbCBvcGVyYXRpb25z ICovCisKKy8qKgorICogeGlsaW54X2RwZG1hX2NoYW5fZW5hYmxlIC0gRW5hYmxlIHRoZSBjaGFu bmVsCisgKiBAY2hhbjogRFBETUEgY2hhbm5lbAorICoKKyAqIEVuYWJsZSB0aGUgY2hhbm5lbCBh bmQgaXRzIGludGVycnVwdHMuIFNldCB0aGUgUW9TIHZhbHVlcyBmb3IgdmlkZW8gY2xhc3MuCisg Ki8KK3N0YXRpYyBpbmxpbmUgdm9pZCB4aWxpbnhfZHBkbWFfY2hhbl9lbmFibGUoc3RydWN0IHhp bGlueF9kcGRtYV9jaGFuICpjaGFuKQoreworCXUzMiByZWc7CisKKwlyZWcgPSBYSUxJTlhfRFBE TUFfSU5UUl9DSEFOX01BU0sgPDwgY2hhbi0+aWQ7CisJcmVnIHw9IFhJTElOWF9EUERNQV9JTlRS X0dMT0JBTF9NQVNLOworCWRwZG1hX3dyaXRlKGNoYW4tPnhkZXYtPnJlZywgWElMSU5YX0RQRE1B X0lFTiwgcmVnKTsKKwlyZWcgPSBYSUxJTlhfRFBETUFfRUlOVFJfQ0hBTl9FUlJfTUFTSyA8PCBj aGFuLT5pZDsKKwlyZWcgfD0gWElMSU5YX0RQRE1BX0lOVFJfR0xPQkFMX0VSUjsKKwlkcGRtYV93 cml0ZShjaGFuLT54ZGV2LT5yZWcsIFhJTElOWF9EUERNQV9FSUVOLCByZWcpOworCisJcmVnID0g WElMSU5YX0RQRE1BX0NIX0NOVExfRU5BQkxFOworCXJlZyB8PSBYSUxJTlhfRFBETUFfQ0hfQ05U TF9RT1NfVklEX0NMQVNTIDw8CisJICAgICAgIFhJTElOWF9EUERNQV9DSF9DTlRMX1FPU19EU0NS X1dSX1NISUZUOworCXJlZyB8PSBYSUxJTlhfRFBETUFfQ0hfQ05UTF9RT1NfVklEX0NMQVNTIDw8 CisJICAgICAgIFhJTElOWF9EUERNQV9DSF9DTlRMX1FPU19EU0NSX1JEX1NISUZUOworCXJlZyB8 PSBYSUxJTlhfRFBETUFfQ0hfQ05UTF9RT1NfVklEX0NMQVNTIDw8CisJICAgICAgIFhJTElOWF9E UERNQV9DSF9DTlRMX1FPU19EQVRBX1JEX1NISUZUOworCWRwZG1hX3NldChjaGFuLT5yZWcsIFhJ TElOWF9EUERNQV9DSF9DTlRMLCByZWcpOworfQorCisvKioKKyAqIHhpbGlueF9kcGRtYV9jaGFu X2Rpc2FibGUgLSBEaXNhYmxlIHRoZSBjaGFubmVsCisgKiBAY2hhbjogRFBETUEgY2hhbm5lbAor ICoKKyAqIERpc2FibGUgdGhlIGNoYW5uZWwgYW5kIGl0cyBpbnRlcnJ1cHRzLgorICovCitzdGF0 aWMgaW5saW5lIHZvaWQgeGlsaW54X2RwZG1hX2NoYW5fZGlzYWJsZShzdHJ1Y3QgeGlsaW54X2Rw ZG1hX2NoYW4gKmNoYW4pCit7CisJdTMyIHJlZzsKKworCXJlZyA9IFhJTElOWF9EUERNQV9JTlRS X0NIQU5fTUFTSyA8PCBjaGFuLT5pZDsKKwlkcGRtYV93cml0ZShjaGFuLT54ZGV2LT5yZWcsIFhJ TElOWF9EUERNQV9JRU4sIHJlZyk7CisJcmVnID0gWElMSU5YX0RQRE1BX0VJTlRSX0NIQU5fRVJS X01BU0sgPDwgY2hhbi0+aWQ7CisJZHBkbWFfd3JpdGUoY2hhbi0+eGRldi0+cmVnLCBYSUxJTlhf RFBETUFfRUlFTiwgcmVnKTsKKworCWRwZG1hX2NscihjaGFuLT5yZWcsIFhJTElOWF9EUERNQV9D SF9DTlRMLCBYSUxJTlhfRFBETUFfQ0hfQ05UTF9FTkFCTEUpOworfQorCisvKioKKyAqIHhpbGlu eF9kcGRtYV9jaGFuX3BhdXNlIC0gUGF1c2UgdGhlIGNoYW5uZWwKKyAqIEBjaGFuOiBEUERNQSBj aGFubmVsCisgKgorICogUGF1c2UgdGhlIGNoYW5uZWwuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9p ZCB4aWxpbnhfZHBkbWFfY2hhbl9wYXVzZShzdHJ1Y3QgeGlsaW54X2RwZG1hX2NoYW4gKmNoYW4p Cit7CisJZHBkbWFfc2V0KGNoYW4tPnJlZywgWElMSU5YX0RQRE1BX0NIX0NOVEwsIFhJTElOWF9E UERNQV9DSF9DTlRMX1BBVVNFKTsKK30KKworLyoqCisgKiB4aWxpbnhfZHBkbWFfY2hhbl91bnBh dXNlIC0gVW5wYXVzZSB0aGUgY2hhbm5lbAorICogQGNoYW46IERQRE1BIGNoYW5uZWwKKyAqCisg KiBVbnBhdXNlIHRoZSBjaGFubmVsLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgeGlsaW54X2Rw ZG1hX2NoYW5fdW5wYXVzZShzdHJ1Y3QgeGlsaW54X2RwZG1hX2NoYW4gKmNoYW4pCit7CisJZHBk bWFfY2xyKGNoYW4tPnJlZywgWElMSU5YX0RQRE1BX0NIX0NOVEwsIFhJTElOWF9EUERNQV9DSF9D TlRMX1BBVVNFKTsKK30KKworc3RhdGljIHUzMgoreGlsaW54X2RwZG1hX2NoYW5fdmlkZW9fZ3Jv dXBfcmVhZHkoc3RydWN0IHhpbGlueF9kcGRtYV9jaGFuICpjaGFuKQoreworCXN0cnVjdCB4aWxp bnhfZHBkbWFfZGV2aWNlICp4ZGV2ID0gY2hhbi0+eGRldjsKKwl1MzIgaSA9IDAsIHJldCA9IDA7 CisKKwlmb3IgKGkgPSBWSURFTzA7IGkgPCBHUkFQSElDUzsgaSsrKSB7CisJCWlmICh4ZGV2LT5j aGFuW2ldLT52aWRlb19ncm91cCAmJgorCQkgICAgeGRldi0+Y2hhbltpXS0+c3RhdHVzICE9IFNU UkVBTUlORykKKwkJCXJldHVybiAwOworCisJCWlmICh4ZGV2LT5jaGFuW2ldLT52aWRlb19ncm91 cCkKKwkJCXJldCB8PSBCSVQoaSk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiB4 aWxpbnhfZHBkbWFfY2hhbl9pc3N1ZV9wZW5kaW5nIC0gSXNzdWUgdGhlIHBlbmRpbmcgZGVzY3Jp cHRvcgorICogQGNoYW46IERQRE1BIGNoYW5uZWwKKyAqCisgKiBJc3N1ZSB0aGUgZmlyc3QgcGVu ZGluZyBkZXNjcmlwdG9yIGZyb20gQGNoYW4tPnN1Ym1pdHRlZF9kZXNjLiBJZiB0aGUgY2hhbm5l bAorICogaXMgYWxyZWFkeSBzdHJlYW1pbmcsIHRoZSBjaGFubmVsIGlzIHJlLXRyaWdnZXJlZCB3 aXRoIHRoZSBwZW5kaW5nCisgKiBkZXNjcmlwdG9yLgorICovCitzdGF0aWMgdm9pZCB4aWxpbnhf ZHBkbWFfY2hhbl9pc3N1ZV9wZW5kaW5nKHN0cnVjdCB4aWxpbnhfZHBkbWFfY2hhbiAqY2hhbikK K3sKKwlzdHJ1Y3QgeGlsaW54X2RwZG1hX2RldmljZSAqeGRldiA9IGNoYW4tPnhkZXY7CisJc3Ry dWN0IHhpbGlueF9kcGRtYV9zd19kZXNjICpzd19kZXNjOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7 CisJdTMyIHJlZywgY2hhbm5lbHM7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2hhbi0+bG9jaywg ZmxhZ3MpOworCisJaWYgKCFjaGFuLT5zdWJtaXR0ZWRfZGVzYyB8fCBjaGFuLT5wZW5kaW5nX2Rl c2MpCisJCWdvdG8gb3V0X3VubG9jazsKKworCWNoYW4tPnBlbmRpbmdfZGVzYyA9IGNoYW4tPnN1 Ym1pdHRlZF9kZXNjOworCWNoYW4tPnN1Ym1pdHRlZF9kZXNjID0gTlVMTDsKKworCXN3X2Rlc2Mg PSBsaXN0X2ZpcnN0X2VudHJ5KCZjaGFuLT5wZW5kaW5nX2Rlc2MtPmRlc2NyaXB0b3JzLAorCQkJ CSAgIHN0cnVjdCB4aWxpbnhfZHBkbWFfc3dfZGVzYywgbm9kZSk7CisJZHBkbWFfd3JpdGUoY2hh bi0+cmVnLCBYSUxJTlhfRFBETUFfQ0hfREVTQ19TVEFSVF9BRERSLAorCQkgICAgKHUzMilzd19k ZXNjLT5waHlzKTsKKwlpZiAoeGRldi0+ZXh0X2FkZHIpCisJCWRwZG1hX3dyaXRlKGNoYW4tPnJl ZywgWElMSU5YX0RQRE1BX0NIX0RFU0NfU1RBUlRfQUREUkUsCisJCQkgICAgKCh1NjQpc3dfZGVz Yy0+cGh5cyA+PiAzMikgJgorCQkJICAgIFhJTElOWF9EUERNQV9ERVNDX0FERFJfRVhUX0FERFJf TUFTSyk7CisKKwlpZiAoY2hhbi0+Zmlyc3RfZnJhbWUpIHsKKwkJY2hhbi0+Zmlyc3RfZnJhbWUg PSBmYWxzZTsKKwkJaWYgKGNoYW4tPnZpZGVvX2dyb3VwKSB7CisJCQljaGFubmVscyA9IHhpbGlu eF9kcGRtYV9jaGFuX3ZpZGVvX2dyb3VwX3JlYWR5KGNoYW4pOworCQkJaWYgKCFjaGFubmVscykK KwkJCQlnb3RvIG91dF91bmxvY2s7CisJCQlyZWcgPSBjaGFubmVscyA8PCBYSUxJTlhfRFBETUFf R0JMX1RSSUdfU0hJRlQ7CisJCX0gZWxzZSB7CisJCQlyZWcgPSAxIDw8IChYSUxJTlhfRFBETUFf R0JMX1RSSUdfU0hJRlQgKyBjaGFuLT5pZCk7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoY2hhbi0+ dmlkZW9fZ3JvdXApIHsKKwkJCWNoYW5uZWxzID0geGlsaW54X2RwZG1hX2NoYW5fdmlkZW9fZ3Jv dXBfcmVhZHkoY2hhbik7CisJCQlpZiAoIWNoYW5uZWxzKQorCQkJCWdvdG8gb3V0X3VubG9jazsK KwkJCXJlZyA9IGNoYW5uZWxzIDw8IFhJTElOWF9EUERNQV9HQkxfUkVUUklHX1NISUZUOworCQl9 IGVsc2UgeworCQkJcmVnID0gMSA8PCAoWElMSU5YX0RQRE1BX0dCTF9SRVRSSUdfU0hJRlQgKyBj aGFuLT5pZCk7CisJCX0KKwl9CisKKwlkcGRtYV93cml0ZSh4ZGV2LT5yZWcsIFhJTElOWF9EUERN QV9HQkwsIHJlZyk7CisKK291dF91bmxvY2s6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hh bi0+bG9jaywgZmxhZ3MpOworfQorCisvKioKKyAqIHhpbGlueF9kcGRtYV9jaGFuX3N0YXJ0IC0g U3RhcnQgdGhlIGNoYW5uZWwKKyAqIEBjaGFuOiBEUERNQSBjaGFubmVsCisgKgorICogU3RhcnQg dGhlIGNoYW5uZWwgYnkgZW5hYmxpbmcgaW50ZXJydXB0cyBhbmQgdHJpZ2dlcmluZyB0aGUgY2hh bm5lbC4KKyAqIElmIHRoZSBjaGFubmVsIGlzIGVuYWJsZWQgYWxyZWFkeSBvciB0aGVyZSdzIG5v IHBlbmRpbmcgZGVzY3JpcHRvciwgdGhpcworICogZnVuY3Rpb24gd29uJ3QgZG8gYW55dGhpbmcg b24gdGhlIGNoYW5uZWwuCisgKi8KK3N0YXRpYyB2b2lkIHhpbGlueF9kcGRtYV9jaGFuX3N0YXJ0 KHN0cnVjdCB4aWxpbnhfZHBkbWFfY2hhbiAqY2hhbikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdz OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNoYW4tPmxvY2ssIGZsYWdzKTsKKworCWlmICghY2hh bi0+c3VibWl0dGVkX2Rlc2MgfHwgY2hhbi0+c3RhdHVzID09IFNUUkVBTUlORykKKwkJZ290byBv dXRfdW5sb2NrOworCisJeGlsaW54X2RwZG1hX2NoYW5fdW5wYXVzZShjaGFuKTsKKwl4aWxpbnhf ZHBkbWFfY2hhbl9lbmFibGUoY2hhbik7CisJY2hhbi0+Zmlyc3RfZnJhbWUgPSB0cnVlOworCWNo YW4tPnN0YXR1cyA9IFNUUkVBTUlORzsKKworb3V0X3VubG9jazoKKwlzcGluX3VubG9ja19pcnFy ZXN0b3JlKCZjaGFuLT5sb2NrLCBmbGFncyk7Cit9CisKKy8qKgorICogeGlsaW54X2RwZG1hX2No YW5fb3N0YW5kIC0gTnVtYmVyIG9mIG91dHN0YW5kaW5nIHRyYW5zYWN0aW9ucworICogQGNoYW46 IERQRE1BIGNoYW5uZWwKKyAqCisgKiBSZWFkIGFuZCByZXR1cm4gdGhlIG51bWJlciBvZiBvdXRz dGFuZGluZyB0cmFuc2FjdGlvbnMgZnJvbSByZWdpc3Rlci4KKyAqCisgKiBSZXR1cm46IE51bWJl ciBvZiBvdXRzdGFuZGluZyB0cmFuc2FjdGlvbnMgZnJvbSB0aGUgc3RhdHVzIHJlZ2lzdGVyLgor ICovCitzdGF0aWMgaW5saW5lIHUzMiB4aWxpbnhfZHBkbWFfY2hhbl9vc3RhbmQoc3RydWN0IHhp bGlueF9kcGRtYV9jaGFuICpjaGFuKQoreworCXJldHVybiBkcGRtYV9yZWFkKGNoYW4tPnJlZywg WElMSU5YX0RQRE1BX0NIX1NUQVRVUykgPj4KKwkgICAgICAgWElMSU5YX0RQRE1BX0NIX1NUQVRV U19PVFJBTl9DTlRfU0hJRlQgJgorCSAgICAgICBYSUxJTlhfRFBETUFfQ0hfU1RBVFVTX09UUkFO X0NOVF9NQVNLOworfQorCisvKioKKyAqIHhpbGlueF9kcGRtYV9jaGFuX25vX29zdGFuZCAtIE5v dGlmeSBubyBvdXRzdGFuZGluZyB0cmFuc2FjdGlvbiBldmVudAorICogQGNoYW46IERQRE1BIGNo YW5uZWwKKyAqCisgKiBOb3RpZnkgd2FpdGVycyBmb3Igbm8gb3V0c3RhbmRpbmcgZXZlbnQsIHNv IHdhaXRlcnMgY2FuIHN0b3AgdGhlIGNoYW5uZWwKKyAqIHNhZmVseS4gVGhpcyBmdW5jdGlvbiBp cyBzdXBwb3NlZCB0byBiZSBjYWxsZWQgd2hlbiAnbm8gb3V0c3RhbmRpbmcnCisgKiBpbnRlcnJ1 cHQgaXMgZ2VuZXJhdGVkLiBUaGUgJ25vIG91dHN0YW5kaW5nJyBpbnRlcnJ1cHQgaXMgZGlzYWJs ZWQgYW5kCisgKiBzaG91bGQgYmUgcmUtZW5hYmxlZCB3aGVuIHRoaXMgZXZlbnQgaXMgaGFuZGxl ZC4gSWYgdGhlIGNoYW5uZWwgc3RhdHVzCisgKiByZWdpc3RlciBzdGlsbCBzaG93cyBzb21lIG51 bWJlciBvZiBvdXRzdGFuZGluZyB0cmFuc2FjdGlvbnMsIHRoZSBpbnRlcnJ1cHQKKyAqIHJlbWFp bnMgZW5hYmxlZC4KKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2Vzcy4gT24gZmFpbHVyZSwgLUVX T1VMREJMT0NLIGlmIHRoZXJlJ3Mgc3RpbGwgb3V0c3RhbmRpbmcKKyAqIHRyYW5zYWN0aW9uKHMp LgorICovCitzdGF0aWMgaW50IHhpbGlueF9kcGRtYV9jaGFuX25vdGlmeV9ub19vc3RhbmQoc3Ry dWN0IHhpbGlueF9kcGRtYV9jaGFuICpjaGFuKQoreworCXUzMiBjbnQ7CisKKwljbnQgPSB4aWxp bnhfZHBkbWFfY2hhbl9vc3RhbmQoY2hhbik7CisJaWYgKGNudCkgeworCQlkZXZfZGJnKGNoYW4t PnhkZXYtPmRldiwgIiVkIG91dHN0YW5kaW5nIHRyYW5zYWN0aW9uc1xuIiwgY250KTsKKwkJcmV0 dXJuIC1FV09VTERCTE9DSzsKKwl9CisKKwkvKiBEaXNhYmxlICdubyBvdXRzdGFuZGluZycgaW50 ZXJydXB0ICovCisJZHBkbWFfd3JpdGUoY2hhbi0+eGRldi0+cmVnLCBYSUxJTlhfRFBETUFfSURT LAorCQkgICAgMSA8PCAoWElMSU5YX0RQRE1BX0lOVFJfTk9fT1NUQU5EX1NISUZUICsgY2hhbi0+ aWQpKTsKKwl3YWtlX3VwKCZjaGFuLT53YWl0X3RvX3N0b3ApOworCisJcmV0dXJuIDA7Cit9CisK Ky8qKgorICogeGlsaW54X2RwZG1hX2NoYW5fd2FpdF9ub19vc3RhbmQgLSBXYWl0IGZvciB0aGUg bm8gb3V0c3RhbmRpbmcgaW50cgorICogQGNoYW46IERQRE1BIGNoYW5uZWwKKyAqCisgKiBXYWl0 IGZvciB0aGUgbm8gb3V0c3RhbmRpbmcgdHJhbnNhY3Rpb24gaW50ZXJydXB0LiBUaGlzIGZ1bmN0 aW9ucyBjYW4gc2xlZXAKKyAqIGZvciA1MG1zLgorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNz LiBPbiBmYWlsdXJlLCAtRVRJTUVPVVQgZm9yIHRpbWUgb3V0LCBvciB0aGUgZXJyb3IgY29kZQor ICogZnJvbSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dCgpLgorICovCitzdGF0aWMg aW50IHhpbGlueF9kcGRtYV9jaGFuX3dhaXRfbm9fb3N0YW5kKHN0cnVjdCB4aWxpbnhfZHBkbWFf Y2hhbiAqY2hhbikKK3sKKwlpbnQgcmV0OworCisJLyogV2FpdCBmb3IgYSBubyBvdXRzdGFuZGlu ZyB0cmFuc2FjdGlvbiBpbnRlcnJ1cHQgdXB0byA1MG1zZWMgKi8KKwlyZXQgPSB3YWl0X2V2ZW50 X2ludGVycnVwdGlibGVfdGltZW91dChjaGFuLT53YWl0X3RvX3N0b3AsCisJCQkJCSAgICAgICAh eGlsaW54X2RwZG1hX2NoYW5fb3N0YW5kKGNoYW4pLAorCQkJCQkgICAgICAgbXNlY3NfdG9famlm Zmllcyg1MCkpOworCWlmIChyZXQgPiAwKSB7CisJCWRwZG1hX3dyaXRlKGNoYW4tPnhkZXYtPnJl ZywgWElMSU5YX0RQRE1BX0lFTiwKKwkJCSAgICAxIDw8CisJCQkgICAgKFhJTElOWF9EUERNQV9J TlRSX05PX09TVEFORF9TSElGVCArIGNoYW4tPmlkKSk7CisJCXJldHVybiAwOworCX0KKworCWRl dl9lcnIoY2hhbi0+eGRldi0+ZGV2LCAibm90IHJlYWR5IHRvIHN0b3A6ICVkIHRyYW5zXG4iLAor CQl4aWxpbnhfZHBkbWFfY2hhbl9vc3RhbmQoY2hhbikpOworCisJaWYgKHJldCA9PSAwKQorCQly ZXR1cm4gLUVUSU1FRE9VVDsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogeGlsaW54X2Rw ZG1hX2NoYW5fcG9sbF9ub19vc3RhbmQgLSBQb2xsIHRoZSBvdXRzdGFuZGluZyB0cmFuc2FjdGlv biBzdGF0dXMKKyAqIEBjaGFuOiBEUERNQSBjaGFubmVsCisgKgorICogUG9sbCB0aGUgb3V0c3Rh bmRpbmcgdHJhbnNhY3Rpb24gc3RhdHVzLCBhbmQgcmV0dXJuIHdoZW4gdGhlcmUncyBubworICog b3V0c3RhbmRpbmcgdHJhbnNhY3Rpb24uIFRoaXMgZnVuY3Rpb25zIGNhbiBiZSB1c2VkIGluIHRo ZSBpbnRlcnJ1cHQgY29udGV4dAorICogb3Igd2hlcmUgdGhlIGF0b21pY2l0eSBpcyByZXF1aXJl ZC4gQ2FsbGluZyB0aHJlYWQgbWF5IHdhaXQgbW9yZSB0aGFuIDUwbXMuCisgKgorICogUmV0dXJu OiAwIG9uIHN1Y2Nlc3MsIG9yIC1FVElNRURPVVQuCisgKi8KK3N0YXRpYyBpbnQgeGlsaW54X2Rw ZG1hX2NoYW5fcG9sbF9ub19vc3RhbmQoc3RydWN0IHhpbGlueF9kcGRtYV9jaGFuICpjaGFuKQor eworCXUzMiBjbnQsIGxvb3AgPSA1MDAwMDsKKworCS8qIFBvbGwgYXQgbGVhc3QgZm9yIDUwbXMg KDIwIGZwcykuICovCisJZG8geworCQljbnQgPSB4aWxpbnhfZHBkbWFfY2hhbl9vc3RhbmQoY2hh bik7CisJCXVkZWxheSgxKTsKKwl9IHdoaWxlIChsb29wLS0gPiAwICYmIGNudCk7CisKKwlpZiAo bG9vcCkgeworCQlkcGRtYV93cml0ZShjaGFuLT54ZGV2LT5yZWcsIFhJTElOWF9EUERNQV9JRU4s CisJCQkgICAgMSA8PAorCQkJICAgIChYSUxJTlhfRFBETUFfSU5UUl9OT19PU1RBTkRfU0hJRlQg KyBjaGFuLT5pZCkpOworCQlyZXR1cm4gMDsKKwl9CisKKwlkZXZfZXJyKGNoYW4tPnhkZXYtPmRl diwgIm5vdCByZWFkeSB0byBzdG9wOiAlZCB0cmFuc1xuIiwKKwkJeGlsaW54X2RwZG1hX2NoYW5f b3N0YW5kKGNoYW4pKTsKKworCXJldHVybiAtRVRJTUVET1VUOworfQorCisvKioKKyAqIHhpbGlu eF9kcGRtYV9jaGFuX3N0b3AgLSBTdG9wIHRoZSBjaGFubmVsCisgKiBAY2hhbjogRFBETUEgY2hh bm5lbAorICogQHBvbGw6IGZsYWcgd2hldGhlciB0byBwb2xsIG9yIHdhaXQKKyAqCisgKiBTdG9w IHRoZSBjaGFubmVsIHdpdGggdGhlIGZvbGxvd2luZyBzZXF1ZW5jZTogMS4gUGF1c2UsIDIuIFdh aXQgKHNsZWVwKSBmb3IKKyAqIG5vIG91dHN0YW5kaW5nIHRyYW5zYWN0aW9uIGludGVycnVwdCwg My4gRGlzYWJsZSB0aGUgY2hhbm5lbC4KKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2Vzcywgb3Ig YW4gZXJyb3IgZnJvbSB4aWxpbnhfZHBkbWFfY2hhbl9wb2xsL3dhaXRfb3N0YW5kKCkuCisgKi8K K3N0YXRpYyBpbnQgeGlsaW54X2RwZG1hX2NoYW5fc3RvcChzdHJ1Y3QgeGlsaW54X2RwZG1hX2No YW4gKmNoYW4sIGJvb2wgcG9sbCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWJvb2wgcmV0 OworCisJeGlsaW54X2RwZG1hX2NoYW5fcGF1c2UoY2hhbik7CisJaWYgKHBvbGwpCisJCXJldCA9 IHhpbGlueF9kcGRtYV9jaGFuX3BvbGxfbm9fb3N0YW5kKGNoYW4pOworCWVsc2UKKwkJcmV0ID0g eGlsaW54X2RwZG1hX2NoYW5fd2FpdF9ub19vc3RhbmQoY2hhbik7CisJaWYgKHJldCkKKwkJcmV0 dXJuIHJldDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjaGFuLT5sb2NrLCBmbGFncyk7CisJeGls aW54X2RwZG1hX2NoYW5fZGlzYWJsZShjaGFuKTsKKwljaGFuLT5zdGF0dXMgPSBJRExFOworCXNw aW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoYW4tPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOwor fQorCisvKioKKyAqIHhpbGlueF9kcGRtYV9jaGFuX2FsbG9jX3Jlc291cmNlcyAtIEFsbG9jYXRl IHJlc291cmNlcyBmb3IgdGhlIGNoYW5uZWwKKyAqIEBjaGFuOiBEUERNQSBjaGFubmVsCisgKgor ICogQWxsb2NhdGUgYSBkZXNjcmlwdG9yIHBvb2wgZm9yIHRoZSBjaGFubmVsLgorICoKKyAqIFJl dHVybjogMCBvbiBzdWNjZXNzLCBvciAtRU5PTUVNIGlmIGZhaWxlZCB0byBhbGxvY2F0ZSBhIHBv b2wuCisgKi8KK3N0YXRpYyBpbnQgeGlsaW54X2RwZG1hX2NoYW5fYWxsb2NfcmVzb3VyY2VzKHN0 cnVjdCB4aWxpbnhfZHBkbWFfY2hhbiAqY2hhbikKK3sKKwljaGFuLT5kZXNjX3Bvb2wgPSBkbWFf cG9vbF9jcmVhdGUoZGV2X25hbWUoY2hhbi0+eGRldi0+ZGV2KSwKKwkJCQljaGFuLT54ZGV2LT5k ZXYsCisJCQkJc2l6ZW9mKHN0cnVjdCB4aWxpbnhfZHBkbWFfc3dfZGVzYyksCisJCQkJX19hbGln bm9mX18oc3RydWN0IHhpbGlueF9kcGRtYV9zd19kZXNjKSwgMCk7CisJaWYgKCFjaGFuLT5kZXNj X3Bvb2wpIHsKKwkJZGV2X2VycihjaGFuLT54ZGV2LT5kZXYsCisJCQkiZmFpbGVkIHRvIGFsbG9j YXRlIGEgZGVzY3JpcHRvciBwb29sXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcmV0 dXJuIDA7Cit9CisKKy8qKgorICogeGlsaW54X2RwZG1hX2NoYW5fZnJlZV9yZXNvdXJjZXMgLSBG cmVlIGFsbCByZXNvdXJjZXMgZm9yIHRoZSBjaGFubmVsCisgKiBAY2hhbjogRFBETUEgY2hhbm5l bAorICoKKyAqIEZyZWUgYWxsIGRlc2NyaXB0b3JzIGFuZCB0aGUgZGVzY3JpcHRvciBwb29sIGZv ciB0aGUgY2hhbm5lbC4KKyAqLworc3RhdGljIHZvaWQgeGlsaW54X2RwZG1hX2NoYW5fZnJlZV9y ZXNvdXJjZXMoc3RydWN0IHhpbGlueF9kcGRtYV9jaGFuICpjaGFuKQoreworCXhpbGlueF9kcGRt YV9jaGFuX2ZyZWVfYWxsX2Rlc2MoY2hhbik7CisJZG1hX3Bvb2xfZGVzdHJveShjaGFuLT5kZXNj X3Bvb2wpOworCWNoYW4tPmRlc2NfcG9vbCA9IE5VTEw7Cit9CisKKy8qKgorICogeGlsaW54X2Rw ZG1hX2NoYW5fdGVybWluYXRlX2FsbCAtIFRlcm1pbmF0ZSB0aGUgY2hhbm5lbCBhbmQgZGVzY3Jp cHRvcnMKKyAqIEBjaGFuOiBEUERNQSBjaGFubmVsCisgKgorICogU3RvcCB0aGUgY2hhbm5lbCBh bmQgZnJlZSBhbGwgYXNzb2NpYXRlZCBkZXNjcmlwdG9ycy4gUG9sbCB0aGUgbm8gb3V0c3RhbmRp bmcKKyAqIHRyYW5zYWN0aW9uIGludGVycnVwdCBhcyB0aGlzIGNhbiBiZSBjYWxsZWQgZnJvbSBh biBhdG9taWMgY29udGV4dC4KKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2Vzcywgb3IgdGhlIGVy cm9yIGNvZGUgZnJvbSB4aWxpbnhfZHBkbWFfY2hhbl9zdG9wKCkuCisgKi8KK3N0YXRpYyBpbnQg eGlsaW54X2RwZG1hX2NoYW5fdGVybWluYXRlX2FsbChzdHJ1Y3QgeGlsaW54X2RwZG1hX2NoYW4g KmNoYW4pCit7CisJc3RydWN0IHhpbGlueF9kcGRtYV9kZXZpY2UgKnhkZXYgPSBjaGFuLT54ZGV2 OworCWludCByZXQ7CisJdW5zaWduZWQgaW50IGk7CisKKwlpZiAoY2hhbi0+dmlkZW9fZ3JvdXAp IHsKKwkJZm9yIChpID0gVklERU8wOyBpIDwgR1JBUEhJQ1M7IGkrKykgeworCQkJaWYgKHhkZXYt PmNoYW5baV0tPnZpZGVvX2dyb3VwICYmCisJCQkgICAgeGRldi0+Y2hhbltpXS0+c3RhdHVzID09 IFNUUkVBTUlORykgeworCQkJCXhpbGlueF9kcGRtYV9jaGFuX3BhdXNlKHhkZXYtPmNoYW5baV0p OworCQkJCXhkZXYtPmNoYW5baV0tPnZpZGVvX2dyb3VwID0gZmFsc2U7CisJCQl9CisJCX0KKwl9 CisKKwlyZXQgPSB4aWxpbnhfZHBkbWFfY2hhbl9zdG9wKGNoYW4sIHRydWUpOworCWlmIChyZXQp CisJCXJldHVybiByZXQ7CisKKwl4aWxpbnhfZHBkbWFfY2hhbl9mcmVlX2FsbF9kZXNjKGNoYW4p OworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogeGlsaW54X2RwZG1hX2NoYW5fc3luY2hyb25p emUgLSBTeW5jaHJvbml6ZSBhbGwgb3V0Z29pbmcgdHJhbnNmZXIKKyAqIEBjaGFuOiBEUERNQSBj aGFubmVsCisgKgorICogU3RvcCB0aGUgY2hhbm5lbCBhbmQgZnJlZSBhbGwgYXNzb2NpYXRlZCBk ZXNjcmlwdG9ycy4gQXMgdGhpcyBjYW4ndCBiZQorICogY2FsbGVkIGluIGFuIGF0b21pYyBjb250 ZXh0LCBzbGVlcC13YWl0IGZvciBubyBvdXRzdGFuZGluZyB0cmFuc2FjdGlvbgorICogaW50ZXJy dXB0LiBUaGVuIGtpbGwgYWxsIHJlbGF0ZWQgdGFza2xldHMuCisgKgorICogUmV0dXJuOiAwIG9u IHN1Y2Nlc3MsIG9yIHRoZSBlcnJvciBjb2RlIGZyb20geGlsaW54X2RwZG1hX2NoYW5fc3RvcCgp LgorICovCitzdGF0aWMgaW50IHhpbGlueF9kcGRtYV9jaGFuX3N5bmNocm9uaXplKHN0cnVjdCB4 aWxpbnhfZHBkbWFfY2hhbiAqY2hhbikKK3sKKwlzdHJ1Y3QgeGlsaW54X2RwZG1hX2RldmljZSAq eGRldiA9IGNoYW4tPnhkZXY7CisJaW50IHJldDsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWlmIChj aGFuLT52aWRlb19ncm91cCkgeworCQlmb3IgKGkgPSBWSURFTzA7IGkgPCBHUkFQSElDUzsgaSsr KSB7CisJCQlpZiAoeGRldi0+Y2hhbltpXS0+dmlkZW9fZ3JvdXAgJiYKKwkJCSAgICB4ZGV2LT5j aGFuW2ldLT5zdGF0dXMgPT0gU1RSRUFNSU5HKSB7CisJCQkJeGlsaW54X2RwZG1hX2NoYW5fcGF1 c2UoeGRldi0+Y2hhbltpXSk7CisJCQkJeGRldi0+Y2hhbltpXS0+dmlkZW9fZ3JvdXAgPSBmYWxz ZTsKKwkJCX0KKwkJfQorCX0KKworCXJldCA9IHhpbGlueF9kcGRtYV9jaGFuX3N0b3AoY2hhbiwg ZmFsc2UpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwl0YXNrbGV0X2tpbGwoJmNoYW4t PmVycl90YXNrKTsKKwl0YXNrbGV0X2tpbGwoJmNoYW4tPmRvbmVfdGFzayk7CisJeGlsaW54X2Rw ZG1hX2NoYW5fZnJlZV9hbGxfZGVzYyhjaGFuKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAq IHhpbGlueF9kcGRtYV9jaGFuX2VyciAtIERldGVjdCBhbnkgY2hhbm5lbCBlcnJvcgorICogQGNo YW46IERQRE1BIGNoYW5uZWwKKyAqIEBpc3I6IG1hc2tlZCBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lz dGVyCisgKiBAZWlzcjogRXJyb3IgSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlcgorICoKKyAqIFJl dHVybjogdHJ1ZSBpZiBhbnkgY2hhbm5lbCBlcnJvciBvY2N1cnMsIG9yIGZhbHNlIG90aGVyd2lz ZS4KKyAqLworc3RhdGljIGJvb2wKK3hpbGlueF9kcGRtYV9jaGFuX2VycihzdHJ1Y3QgeGlsaW54 X2RwZG1hX2NoYW4gKmNoYW4sIHUzMiBpc3IsIHUzMiBlaXNyKQoreworCWlmICghY2hhbikKKwkJ cmV0dXJuIGZhbHNlOworCisJaWYgKGNoYW4tPnN0YXR1cyA9PSBTVFJFQU1JTkcgJiYKKwkgICAg KChpc3IgJiAoWElMSU5YX0RQRE1BX0lOVFJfQ0hBTl9FUlJfTUFTSyA8PCBjaGFuLT5pZCkpIHx8 CisJICAgIChlaXNyICYgKFhJTElOWF9EUERNQV9FSU5UUl9DSEFOX0VSUl9NQVNLIDw8IGNoYW4t PmlkKSkpKQorCQlyZXR1cm4gdHJ1ZTsKKworCXJldHVybiBmYWxzZTsKK30KKworLyoqCisgKiB4 aWxpbnhfZHBkbWFfY2hhbl9oYW5kbGVfZXJyIC0gRFBETUEgY2hhbm5lbCBlcnJvciBoYW5kbGlu ZworICogQGNoYW46IERQRE1BIGNoYW5uZWwKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxl ZCB3aGVuIGFueSBjaGFubmVsIGVycm9yIG9yIGFueSBnbG9iYWwgZXJyb3Igb2NjdXJzLgorICog VGhlIGZ1bmN0aW9uIGRpc2FibGVzIHRoZSBwYXVzZWQgY2hhbm5lbCBieSBlcnJvcnMgYW5kIGRl dGVybWluZXMKKyAqIGlmIHRoZSBjdXJyZW50IGFjdGl2ZSBkZXNjcmlwdG9yIGNhbiBiZSByZXNj aGVkdWxlZCBkZXBlbmRpbmcgb24KKyAqIHRoZSBkZXNjcmlwdG9yIHN0YXR1cy4KKyAqLworc3Rh dGljIHZvaWQgeGlsaW54X2RwZG1hX2NoYW5faGFuZGxlX2VycihzdHJ1Y3QgeGlsaW54X2RwZG1h X2NoYW4gKmNoYW4pCit7CisJc3RydWN0IHhpbGlueF9kcGRtYV9kZXZpY2UgKnhkZXYgPSBjaGFu LT54ZGV2OworCXN0cnVjdCBkZXZpY2UgKmRldiA9IHhkZXYtPmRldjsKKwl1bnNpZ25lZCBsb25n IGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNoYW4tPmxvY2ssIGZsYWdzKTsKKworCWRl dl9kYmcoZGV2LCAiY3VyIGRlc2MgYWRkciA9IDB4JTA0eCUwOHhcbiIsCisJCWRwZG1hX3JlYWQo Y2hhbi0+cmVnLCBYSUxJTlhfRFBETUFfQ0hfREVTQ19TVEFSVF9BRERSRSksCisJCWRwZG1hX3Jl YWQoY2hhbi0+cmVnLCBYSUxJTlhfRFBETUFfQ0hfREVTQ19TVEFSVF9BRERSKSk7CisJZGV2X2Ri ZyhkZXYsICJjdXIgcGF5bG9hZCBhZGRyID0gMHglMDR4JTA4eFxuIiwKKwkJZHBkbWFfcmVhZChj aGFuLT5yZWcsIFhJTElOWF9EUERNQV9DSF9QWUxEX0NVUl9BRERSRSksCisJCWRwZG1hX3JlYWQo Y2hhbi0+cmVnLCBYSUxJTlhfRFBETUFfQ0hfUFlMRF9DVVJfQUREUikpOworCisJeGlsaW54X2Rw ZG1hX2NoYW5fZGlzYWJsZShjaGFuKTsKKwljaGFuLT5zdGF0dXMgPSBJRExFOworCisJaWYgKCFj aGFuLT5hY3RpdmVfZGVzYykKKwkJZ290byBvdXRfdW5sb2NrOworCisJeGlsaW54X2RwZG1hX2No YW5fZHVtcF90eF9kZXNjKGNoYW4sIGNoYW4tPmFjdGl2ZV9kZXNjKTsKKworCXN3aXRjaCAoY2hh bi0+YWN0aXZlX2Rlc2MtPnN0YXR1cykgeworCWNhc2UgRVJST1JFRDoKKwkJZGV2X2RiZyhkZXYs ICJyZXBlYXRlZCBlcnJvciBvbiBkZXNjXG4iKTsKKwljYXNlIEFDVElWRToKKwljYXNlIFBSRVBB UkVEOgorCQkvKiBSZXNjaGVkdWxlIGlmIHRoZXJlJ3Mgbm8gbmV3IGRlc2NyaXB0b3IgKi8KKwkJ aWYgKCFjaGFuLT5zdWJtaXR0ZWRfZGVzYykKKwkJCWNoYW4tPnN1Ym1pdHRlZF9kZXNjID0gY2hh bi0+YWN0aXZlX2Rlc2M7CisJCWNoYW4tPmFjdGl2ZV9kZXNjLT5zdGF0dXMgPSBFUlJPUkVEOwor CQlicmVhazsKKwl9CisJY2hhbi0+YWN0aXZlX2Rlc2MgPSBOVUxMOworCitvdXRfdW5sb2NrOgor CXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoYW4tPmxvY2ssIGZsYWdzKTsKK30KKworLyogRE1B IHR4IGRlc2NyaXB0b3IgKi8KKworc3RhdGljIGRtYV9jb29raWVfdCB4aWxpbnhfZHBkbWFfdHhf c3VibWl0KHN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqdHgpCit7CisJc3RydWN0IHhp bGlueF9kcGRtYV9jaGFuICpjaGFuID0gdG9feGlsaW54X2NoYW4odHgtPmNoYW4pOworCXN0cnVj dCB4aWxpbnhfZHBkbWFfdHhfZGVzYyAqdHhfZGVzYyA9IHRvX2RwZG1hX3R4X2Rlc2ModHgpOwor CisJcmV0dXJuIHhpbGlueF9kcGRtYV9jaGFuX3N1Ym1pdF90eF9kZXNjKGNoYW4sIHR4X2Rlc2Mp OworfQorCisvKiBETUEgY2hhbm5lbCBvcGVyYXRpb25zICovCisKK3N0YXRpYyBzdHJ1Y3QgZG1h X2FzeW5jX3R4X2Rlc2NyaXB0b3IgKgoreGlsaW54X2RwZG1hX3ByZXBfc2xhdmVfc2coc3RydWN0 IGRtYV9jaGFuICpkY2hhbiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2wsCisJCQkgICB1bnNpZ25l ZCBpbnQgc2dfbGVuLAorCQkJICAgZW51bSBkbWFfdHJhbnNmZXJfZGlyZWN0aW9uIGRpcmVjdGlv biwKKwkJCSAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIHZvaWQgKmNvbnRleHQpCit7CisJc3RydWN0 IHhpbGlueF9kcGRtYV9jaGFuICpjaGFuID0gdG9feGlsaW54X2NoYW4oZGNoYW4pOworCXN0cnVj dCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqYXN5bmNfdHg7CisKKwlpZiAoZGlyZWN0aW9uICE9 IERNQV9NRU1fVE9fREVWKQorCQlyZXR1cm4gTlVMTDsKKworCWlmICghc2dsIHx8IHNnX2xlbiA8 IDIpCisJCXJldHVybiBOVUxMOworCisJYXN5bmNfdHggPSB4aWxpbnhfZHBkbWFfY2hhbl9wcmVw X3NsYXZlX3NnKGNoYW4sIHNnbCk7CisJaWYgKCFhc3luY190eCkKKwkJcmV0dXJuIE5VTEw7CisK KwlkbWFfYXN5bmNfdHhfZGVzY3JpcHRvcl9pbml0KGFzeW5jX3R4LCBkY2hhbik7CisJYXN5bmNf dHgtPnR4X3N1Ym1pdCA9IHhpbGlueF9kcGRtYV90eF9zdWJtaXQ7CisJYXN5bmNfdHgtPmZsYWdz ID0gZmxhZ3M7CisJYXN5bmNfdHhfYWNrKGFzeW5jX3R4KTsKKworCXJldHVybiBhc3luY190eDsK K30KKworc3RhdGljIHN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqCit4aWxpbnhfZHBk bWFfcHJlcF9kbWFfY3ljbGljKHN0cnVjdCBkbWFfY2hhbiAqZGNoYW4sIGRtYV9hZGRyX3QgYnVm X2FkZHIsCisJCQkgICAgIHNpemVfdCBidWZfbGVuLCBzaXplX3QgcGVyaW9kX2xlbiwKKwkJCSAg ICAgZW51bSBkbWFfdHJhbnNmZXJfZGlyZWN0aW9uIGRpcmVjdGlvbiwKKwkJCSAgICAgdW5zaWdu ZWQgbG9uZyBmbGFncykKK3sKKwlzdHJ1Y3QgeGlsaW54X2RwZG1hX2NoYW4gKmNoYW4gPSB0b194 aWxpbnhfY2hhbihkY2hhbik7CisJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICphc3lu Y190eDsKKworCWlmIChkaXJlY3Rpb24gIT0gRE1BX01FTV9UT19ERVYpCisJCXJldHVybiBOVUxM OworCisJaWYgKGJ1Zl9sZW4gJSBwZXJpb2RfbGVuKQorCQlyZXR1cm4gTlVMTDsKKworCWFzeW5j X3R4ID0geGlsaW54X2RwZG1hX2NoYW5fcHJlcF9jeWNsaWMoY2hhbiwgYnVmX2FkZHIsIGJ1Zl9s ZW4sCisJCQkJCQkgcGVyaW9kX2xlbik7CisJaWYgKCFhc3luY190eCkKKwkJcmV0dXJuIE5VTEw7 CisKKwlkbWFfYXN5bmNfdHhfZGVzY3JpcHRvcl9pbml0KGFzeW5jX3R4LCBkY2hhbik7CisJYXN5 bmNfdHgtPnR4X3N1Ym1pdCA9IHhpbGlueF9kcGRtYV90eF9zdWJtaXQ7CisJYXN5bmNfdHgtPmZs YWdzID0gZmxhZ3M7CisJYXN5bmNfdHhfYWNrKGFzeW5jX3R4KTsKKworCXJldHVybiBhc3luY190 eDsKK30KKworc3RhdGljIHN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqCit4aWxpbnhf ZHBkbWFfcHJlcF9pbnRlcmxlYXZlZF9kbWEoc3RydWN0IGRtYV9jaGFuICpkY2hhbiwKKwkJCQkg IHN0cnVjdCBkbWFfaW50ZXJsZWF2ZWRfdGVtcGxhdGUgKnh0LAorCQkJCSAgdW5zaWduZWQgbG9u ZyBmbGFncykKK3sKKwlzdHJ1Y3QgeGlsaW54X2RwZG1hX2NoYW4gKmNoYW4gPSB0b194aWxpbnhf Y2hhbihkY2hhbik7CisJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICphc3luY190eDsK KworCWlmICh4dC0+ZGlyICE9IERNQV9NRU1fVE9fREVWKQorCQlyZXR1cm4gTlVMTDsKKworCWlm ICgheHQtPm51bWYgfHwgIXh0LT5zZ2xbMF0uc2l6ZSkKKwkJcmV0dXJuIE5VTEw7CisKKwlhc3lu Y190eCA9IHhpbGlueF9kcGRtYV9jaGFuX3ByZXBfaW50ZXJsZWF2ZWQoY2hhbiwgeHQpOworCWlm ICghYXN5bmNfdHgpCisJCXJldHVybiBOVUxMOworCisJZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3Jf aW5pdChhc3luY190eCwgZGNoYW4pOworCWFzeW5jX3R4LT50eF9zdWJtaXQgPSB4aWxpbnhfZHBk bWFfdHhfc3VibWl0OworCWFzeW5jX3R4LT5mbGFncyA9IGZsYWdzOworCWFzeW5jX3R4X2Fjayhh c3luY190eCk7CisKKwlyZXR1cm4gYXN5bmNfdHg7Cit9CisKK3N0YXRpYyBpbnQgeGlsaW54X2Rw ZG1hX2FsbG9jX2NoYW5fcmVzb3VyY2VzKHN0cnVjdCBkbWFfY2hhbiAqZGNoYW4pCit7CisJc3Ry dWN0IHhpbGlueF9kcGRtYV9jaGFuICpjaGFuID0gdG9feGlsaW54X2NoYW4oZGNoYW4pOworCisJ ZG1hX2Nvb2tpZV9pbml0KGRjaGFuKTsKKworCXJldHVybiB4aWxpbnhfZHBkbWFfY2hhbl9hbGxv Y19yZXNvdXJjZXMoY2hhbik7Cit9CisKK3N0YXRpYyB2b2lkIHhpbGlueF9kcGRtYV9mcmVlX2No YW5fcmVzb3VyY2VzKHN0cnVjdCBkbWFfY2hhbiAqZGNoYW4pCit7CisJc3RydWN0IHhpbGlueF9k cGRtYV9jaGFuICpjaGFuID0gdG9feGlsaW54X2NoYW4oZGNoYW4pOworCisJeGlsaW54X2RwZG1h X2NoYW5fZnJlZV9yZXNvdXJjZXMoY2hhbik7Cit9CisKK3N0YXRpYyBlbnVtIGRtYV9zdGF0dXMg eGlsaW54X2RwZG1hX3R4X3N0YXR1cyhzdHJ1Y3QgZG1hX2NoYW4gKmRjaGFuLAorCQkJCQkgICAg ICBkbWFfY29va2llX3QgY29va2llLAorCQkJCQkgICAgICBzdHJ1Y3QgZG1hX3R4X3N0YXRlICp0 eHN0YXRlKQoreworCXJldHVybiBkbWFfY29va2llX3N0YXR1cyhkY2hhbiwgY29va2llLCB0eHN0 YXRlKTsKK30KKworc3RhdGljIHZvaWQgeGlsaW54X2RwZG1hX2lzc3VlX3BlbmRpbmcoc3RydWN0 IGRtYV9jaGFuICpkY2hhbikKK3sKKwlzdHJ1Y3QgeGlsaW54X2RwZG1hX2NoYW4gKmNoYW4gPSB0 b194aWxpbnhfY2hhbihkY2hhbik7CisKKwl4aWxpbnhfZHBkbWFfY2hhbl9zdGFydChjaGFuKTsK Kwl4aWxpbnhfZHBkbWFfY2hhbl9pc3N1ZV9wZW5kaW5nKGNoYW4pOworfQorCitzdGF0aWMgaW50 IHhpbGlueF9kcGRtYV9jb25maWcoc3RydWN0IGRtYV9jaGFuICpkY2hhbiwKKwkJCSAgICAgICBz dHJ1Y3QgZG1hX3NsYXZlX2NvbmZpZyAqY29uZmlnKQoreworCWlmIChjb25maWctPmRpcmVjdGlv biAhPSBETUFfTUVNX1RPX0RFVikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gMDsKK30K Kworc3RhdGljIGludCB4aWxpbnhfZHBkbWFfcGF1c2Uoc3RydWN0IGRtYV9jaGFuICpkY2hhbikK K3sKKwl4aWxpbnhfZHBkbWFfY2hhbl9wYXVzZSh0b194aWxpbnhfY2hhbihkY2hhbikpOworCisJ cmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgeGlsaW54X2RwZG1hX3Jlc3VtZShzdHJ1Y3QgZG1h X2NoYW4gKmRjaGFuKQoreworCXhpbGlueF9kcGRtYV9jaGFuX3VucGF1c2UodG9feGlsaW54X2No YW4oZGNoYW4pKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHhpbGlueF9kcGRtYV90 ZXJtaW5hdGVfYWxsKHN0cnVjdCBkbWFfY2hhbiAqZGNoYW4pCit7CisJcmV0dXJuIHhpbGlueF9k cGRtYV9jaGFuX3Rlcm1pbmF0ZV9hbGwodG9feGlsaW54X2NoYW4oZGNoYW4pKTsKK30KKworc3Rh dGljIHZvaWQgeGlsaW54X2RwZG1hX3N5bmNocm9uaXplKHN0cnVjdCBkbWFfY2hhbiAqZGNoYW4p Cit7CisJeGlsaW54X2RwZG1hX2NoYW5fc3luY2hyb25pemUodG9feGlsaW54X2NoYW4oZGNoYW4p KTsKK30KKworLyogWGlsaW54IERQRE1BIGRldmljZSBvcGVyYXRpb25zICovCisKKy8qKgorICog eGlsaW54X2RwZG1hX2VyciAtIERldGVjdCBhbnkgZ2xvYmFsIGVycm9yCisgKiBAaXNyOiBJbnRl cnJ1cHQgU3RhdHVzIFJlZ2lzdGVyCisgKiBAZWlzcjogRXJyb3IgSW50ZXJydXB0IFN0YXR1cyBS ZWdpc3RlcgorICoKKyAqIFJldHVybjogVHJ1ZSBpZiBhbnkgZ2xvYmFsIGVycm9yIG9jY3Vycywg b3IgZmFsc2Ugb3RoZXJ3aXNlLgorICovCitzdGF0aWMgYm9vbCB4aWxpbnhfZHBkbWFfZXJyKHUz MiBpc3IsIHUzMiBlaXNyKQoreworCWlmICgoaXNyICYgWElMSU5YX0RQRE1BX0lOVFJfR0xPQkFM X0VSUiB8fAorCSAgICAgZWlzciAmIFhJTElOWF9EUERNQV9FSU5UUl9HTE9CQUxfRVJSKSkKKwkJ cmV0dXJuIHRydWU7CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKKy8qKgorICogeGlsaW54X2RwZG1h X2hhbmRsZV9lcnJfaW50ciAtIEhhbmRsZSBEUERNQSBlcnJvciBpbnRlcnJ1cHQKKyAqIEB4ZGV2 OiBEUERNQSBkZXZpY2UKKyAqIEBpc3I6IG1hc2tlZCBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVy CisgKiBAZWlzcjogRXJyb3IgSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlcgorICoKKyAqIEhhbmRs ZSBpZiBhbnkgZXJyb3Igb2NjdXJzIGJhc2VkIG9uIEBpc3IgYW5kIEBlaXNyLiBUaGlzIGZ1bmN0 aW9uIGRpc2FibGVzCisgKiBjb3JyZXNwb25kaW5nIGVycm9yIGludGVycnVwdHMsIGFuZCB0aG9z ZSBzaG91bGQgYmUgcmUtZW5hYmxlZCBvbmNlIGhhbmRsaW5nCisgKiBpcyBkb25lLgorICovCitz dGF0aWMgdm9pZCB4aWxpbnhfZHBkbWFfaGFuZGxlX2Vycl9pbnRyKHN0cnVjdCB4aWxpbnhfZHBk bWFfZGV2aWNlICp4ZGV2LAorCQkJCQkgdTMyIGlzciwgdTMyIGVpc3IpCit7CisJYm9vbCBlcnIg PSB4aWxpbnhfZHBkbWFfZXJyKGlzciwgZWlzcik7CisJdW5zaWduZWQgaW50IGk7CisKKwlkZXZf ZGJnX3JhdGVsaW1pdGVkKHhkZXYtPmRldiwKKwkJCSAgICAiZXJyb3IgaW50cjogaXNyID0gMHgl MDh4LCBlaXNyID0gMHglMDh4XG4iLAorCQkJICAgIGlzciwgZWlzcik7CisKKwkvKiBEaXNhYmxl IGNoYW5uZWwgZXJyb3IgaW50ZXJydXB0cyB1bnRpbCBlcnJvcnMgYXJlIGhhbmRsZWQuICovCisJ ZHBkbWFfd3JpdGUoeGRldi0+cmVnLCBYSUxJTlhfRFBETUFfSURTLAorCQkgICAgaXNyICYgflhJ TElOWF9EUERNQV9JTlRSX0dMT0JBTF9FUlIpOworCWRwZG1hX3dyaXRlKHhkZXYtPnJlZywgWElM SU5YX0RQRE1BX0VJRFMsCisJCSAgICBlaXNyICYgflhJTElOWF9EUERNQV9FSU5UUl9HTE9CQUxf RVJSKTsKKworCWZvciAoaSA9IDA7IGkgPCBYSUxJTlhfRFBETUFfTlVNX0NIQU47IGkrKykKKwkJ aWYgKGVyciB8fCB4aWxpbnhfZHBkbWFfY2hhbl9lcnIoeGRldi0+Y2hhbltpXSwgaXNyLCBlaXNy KSkKKwkJCXRhc2tsZXRfc2NoZWR1bGUoJnhkZXYtPmNoYW5baV0tPmVycl90YXNrKTsKK30KKwor LyoqCisgKiB4aWxpbnhfZHBkbWFfaGFuZGxlX3ZzeW5jX2ludHIgLSBIYW5kbGUgdGhlIFZTWU5D IGludGVycnVwdAorICogQHhkZXY6IERQRE1BIGRldmljZQorICoKKyAqIEhhbmRsZSB0aGUgVlNZ TkMgZXZlbnQuIEF0IHRoaXMgcG9pbnQsIHRoZSBjdXJyZW50IGZyYW1lIGJlY29tZXMgYWN0aXZl LAorICogd2hpY2ggbWVhbnMgdGhlIERQRE1BIGFjdHVhbGx5IHN0YXJ0cyBmZXRjaGluZywgYW5k IHRoZSBuZXh0IGZyYW1lIGNhbiBiZQorICogc2NoZWR1bGVkLgorICovCitzdGF0aWMgdm9pZCB4 aWxpbnhfZHBkbWFfaGFuZGxlX3ZzeW5jX2ludHIoc3RydWN0IHhpbGlueF9kcGRtYV9kZXZpY2Ug KnhkZXYpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgWElMSU5YX0RQ RE1BX05VTV9DSEFOOyBpKyspIHsKKwkJaWYgKHhkZXYtPmNoYW5baV0gJiYKKwkJICAgIHhkZXYt PmNoYW5baV0tPnN0YXR1cyA9PSBTVFJFQU1JTkcpIHsKKwkJCXhpbGlueF9kcGRtYV9jaGFuX2Rl c2NfYWN0aXZlKHhkZXYtPmNoYW5baV0pOworCQkJeGlsaW54X2RwZG1hX2NoYW5faXNzdWVfcGVu ZGluZyh4ZGV2LT5jaGFuW2ldKTsKKwkJfQorCX0KK30KKworLyoqCisgKiB4aWxpbnhfZHBkbWFf ZW5hYmxlX2ludHIgLSBFbmFibGUgaW50ZXJydXB0cworICogQHhkZXY6IERQRE1BIGRldmljZQor ICoKKyAqIEVuYWJsZSBpbnRlcnJ1cHRzLgorICovCitzdGF0aWMgdm9pZCB4aWxpbnhfZHBkbWFf ZW5hYmxlX2ludHIoc3RydWN0IHhpbGlueF9kcGRtYV9kZXZpY2UgKnhkZXYpCit7CisJZHBkbWFf d3JpdGUoeGRldi0+cmVnLCBYSUxJTlhfRFBETUFfSUVOLCBYSUxJTlhfRFBETUFfSU5UUl9BTEwp OworCWRwZG1hX3dyaXRlKHhkZXYtPnJlZywgWElMSU5YX0RQRE1BX0VJRU4sIFhJTElOWF9EUERN QV9FSU5UUl9BTEwpOworfQorCisvKioKKyAqIHhpbGlueF9kcGRtYV9kaXNhYmxlX2ludHIgLSBE aXNhYmxlIGludGVycnVwdHMKKyAqIEB4ZGV2OiBEUERNQSBkZXZpY2UKKyAqCisgKiBEaXNhYmxl IGludGVycnVwdHMuCisgKi8KK3N0YXRpYyB2b2lkIHhpbGlueF9kcGRtYV9kaXNhYmxlX2ludHIo c3RydWN0IHhpbGlueF9kcGRtYV9kZXZpY2UgKnhkZXYpCit7CisJZHBkbWFfd3JpdGUoeGRldi0+ cmVnLCBYSUxJTlhfRFBETUFfSURTLCBYSUxJTlhfRFBETUFfSU5UUl9FUlJfQUxMKTsKKwlkcGRt YV93cml0ZSh4ZGV2LT5yZWcsIFhJTElOWF9EUERNQV9FSURTLCBYSUxJTlhfRFBETUFfRUlOVFJf QUxMKTsKK30KKworLyogSW50ZXJydXB0IGhhbmRsaW5nIG9wZXJhdGlvbnMqLworCisvKioKKyAq IHhpbGlueF9kcGRtYV9jaGFuX2Vycl90YXNrIC0gUGVyIGNoYW5uZWwgdGFza2xldCBmb3IgZXJy b3IgaGFuZGxpbmcKKyAqIEBkYXRhOiB0YXNrbGV0IGRhdGEgdG8gYmUgY2FzdGVkIHRvIERQRE1B IGNoYW5uZWwgc3RydWN0dXJlCisgKgorICogUGVyIGNoYW5uZWwgZXJyb3IgaGFuZGxpbmcgdGFz a2xldC4gVGhpcyBmdW5jdGlvbiB3YWl0cyBmb3IgdGhlIG91dHN0YW5kaW5nCisgKiB0cmFuc2Fj dGlvbiB0byBjb21wbGV0ZSBhbmQgdHJpZ2dlcnMgZXJyb3IgaGFuZGxpbmcuIEFmdGVyIGVycm9y IGhhbmRsaW5nLAorICogcmUtZW5hYmxlIGNoYW5uZWwgZXJyb3IgaW50ZXJydXB0cywgYW5kIHJl c3RhcnQgdGhlIGNoYW5uZWwgaWYgbmVlZGVkLgorICovCitzdGF0aWMgdm9pZCB4aWxpbnhfZHBk bWFfY2hhbl9lcnJfdGFzayh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IHhpbGlueF9k cGRtYV9jaGFuICpjaGFuID0gKHN0cnVjdCB4aWxpbnhfZHBkbWFfY2hhbiAqKWRhdGE7CisJc3Ry dWN0IHhpbGlueF9kcGRtYV9kZXZpY2UgKnhkZXYgPSBjaGFuLT54ZGV2OworCisJLyogUHJvY2Vl ZCBlcnJvciBoYW5kbGluZyBldmVuIHdoZW4gcG9sbGluZyBmYWlscy4gKi8KKwl4aWxpbnhfZHBk bWFfY2hhbl9wb2xsX25vX29zdGFuZChjaGFuKTsKKworCXhpbGlueF9kcGRtYV9jaGFuX2hhbmRs ZV9lcnIoY2hhbik7CisKKwlkcGRtYV93cml0ZSh4ZGV2LT5yZWcsIFhJTElOWF9EUERNQV9JRU4s CisJCSAgICBYSUxJTlhfRFBETUFfSU5UUl9DSEFOX0VSUl9NQVNLIDw8IGNoYW4tPmlkKTsKKwlk cGRtYV93cml0ZSh4ZGV2LT5yZWcsIFhJTElOWF9EUERNQV9FSUVOLAorCQkgICAgWElMSU5YX0RQ RE1BX0VJTlRSX0NIQU5fRVJSX01BU0sgPDwgY2hhbi0+aWQpOworCisJeGlsaW54X2RwZG1hX2No YW5fc3RhcnQoY2hhbik7CisJeGlsaW54X2RwZG1hX2NoYW5faXNzdWVfcGVuZGluZyhjaGFuKTsK K30KKworLyoqCisgKiB4aWxpbnhfZHBkbWFfY2hhbl9kb25lX3Rhc2sgLSBQZXIgY2hhbm5lbCB0 YXNrbGV0IGZvciBkb25lIGludGVycnVwdCBoYW5kbGluZworICogQGRhdGE6IHRhc2tsZXQgZGF0 YSB0byBiZSBjYXN0ZWQgdG8gRFBETUEgY2hhbm5lbCBzdHJ1Y3R1cmUKKyAqCisgKiBQZXIgY2hh bm5lbCBkb25lIGludGVycnVwdCBoYW5kbGluZyB0YXNrbGV0LgorICovCitzdGF0aWMgdm9pZCB4 aWxpbnhfZHBkbWFfY2hhbl9kb25lX3Rhc2sodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVj dCB4aWxpbnhfZHBkbWFfY2hhbiAqY2hhbiA9IChzdHJ1Y3QgeGlsaW54X2RwZG1hX2NoYW4gKilk YXRhOworCisJeGlsaW54X2RwZG1hX2NoYW5fY2xlYW51cF9kZXNjKGNoYW4pOworfQorCitzdGF0 aWMgaXJxcmV0dXJuX3QgeGlsaW54X2RwZG1hX2lycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRh dGEpCit7CisJc3RydWN0IHhpbGlueF9kcGRtYV9kZXZpY2UgKnhkZXYgPSBkYXRhOworCXUzMiBz dGF0dXMsIGVycm9yLCBpOworCXVuc2lnbmVkIGxvbmcgbWFza2VkOworCisJc3RhdHVzID0gZHBk bWFfcmVhZCh4ZGV2LT5yZWcsIFhJTElOWF9EUERNQV9JU1IpOworCWVycm9yID0gZHBkbWFfcmVh ZCh4ZGV2LT5yZWcsIFhJTElOWF9EUERNQV9FSVNSKTsKKwlpZiAoIXN0YXR1cyAmJiAhZXJyb3Ip CisJCXJldHVybiBJUlFfTk9ORTsKKworCWRwZG1hX3dyaXRlKHhkZXYtPnJlZywgWElMSU5YX0RQ RE1BX0lTUiwgc3RhdHVzKTsKKwlkcGRtYV93cml0ZSh4ZGV2LT5yZWcsIFhJTElOWF9EUERNQV9F SVNSLCBlcnJvcik7CisKKwlpZiAoc3RhdHVzICYgWElMSU5YX0RQRE1BX0lOVFJfVlNZTkMpCisJ CXhpbGlueF9kcGRtYV9oYW5kbGVfdnN5bmNfaW50cih4ZGV2KTsKKworCW1hc2tlZCA9IChzdGF0 dXMgJiBYSUxJTlhfRFBETUFfSU5UUl9ERVNDX0RPTkVfTUFTSykgPj4KKwkJIFhJTElOWF9EUERN QV9JTlRSX0RFU0NfRE9ORV9TSElGVDsKKwlpZiAobWFza2VkKQorCQlmb3JfZWFjaF9zZXRfYml0 KGksICZtYXNrZWQsIFhJTElOWF9EUERNQV9OVU1fQ0hBTikKKwkJCXhpbGlueF9kcGRtYV9jaGFu X2Rlc2NfZG9uZV9pbnRyKHhkZXYtPmNoYW5baV0pOworCisJbWFza2VkID0gKHN0YXR1cyAmIFhJ TElOWF9EUERNQV9JTlRSX05PX09TVEFORF9NQVNLKSA+PgorCQkgWElMSU5YX0RQRE1BX0lOVFJf Tk9fT1NUQU5EX1NISUZUOworCWlmIChtYXNrZWQpCisJCWZvcl9lYWNoX3NldF9iaXQoaSwgJm1h c2tlZCwgWElMSU5YX0RQRE1BX05VTV9DSEFOKQorCQkJeGlsaW54X2RwZG1hX2NoYW5fbm90aWZ5 X25vX29zdGFuZCh4ZGV2LT5jaGFuW2ldKTsKKworCW1hc2tlZCA9IHN0YXR1cyAmIFhJTElOWF9E UERNQV9JTlRSX0VSUl9BTEw7CisJaWYgKG1hc2tlZCB8fCBlcnJvcikKKwkJeGlsaW54X2RwZG1h X2hhbmRsZV9lcnJfaW50cih4ZGV2LCBtYXNrZWQsIGVycm9yKTsKKworCXJldHVybiBJUlFfSEFO RExFRDsKK30KKworLyogSW5pdGlhbGl6YXRpb24gb3BlcmF0aW9ucyAqLworCitzdGF0aWMgc3Ry dWN0IHhpbGlueF9kcGRtYV9jaGFuICoKK3hpbGlueF9kcGRtYV9jaGFuX3Byb2JlKHN0cnVjdCBk ZXZpY2Vfbm9kZSAqbm9kZSwKKwkJCXN0cnVjdCB4aWxpbnhfZHBkbWFfZGV2aWNlICp4ZGV2KQor eworCXN0cnVjdCB4aWxpbnhfZHBkbWFfY2hhbiAqY2hhbjsKKworCWNoYW4gPSBkZXZtX2t6YWxs b2MoeGRldi0+ZGV2LCBzaXplb2YoKmNoYW4pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNoYW4pCisJ CXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxl KG5vZGUsICJ4bG54LHZpZGVvMCIpKSB7CisJCWNoYW4tPmlkID0gVklERU8wOworCX0gZWxzZSBp ZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUobm9kZSwgInhsbngsdmlkZW8xIikpIHsKKwkJY2hh bi0+aWQgPSBWSURFTzE7CisJfSBlbHNlIGlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShub2Rl LCAieGxueCx2aWRlbzIiKSkgeworCQljaGFuLT5pZCA9IFZJREVPMjsKKwl9IGVsc2UgaWYgKG9m X2RldmljZV9pc19jb21wYXRpYmxlKG5vZGUsICJ4bG54LGdyYXBoaWNzIikpIHsKKwkJY2hhbi0+ aWQgPSBHUkFQSElDUzsKKwl9IGVsc2UgaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKG5vZGUs ICJ4bG54LGF1ZGlvMCIpKSB7CisJCWNoYW4tPmlkID0gQVVESU8wOworCX0gZWxzZSBpZiAob2Zf ZGV2aWNlX2lzX2NvbXBhdGlibGUobm9kZSwgInhsbngsYXVkaW8xIikpIHsKKwkJY2hhbi0+aWQg PSBBVURJTzE7CisJfSBlbHNlIHsKKwkJZGV2X2Vycih4ZGV2LT5kZXYsICJpbnZhbGlkIGNoYW5u ZWwgY29tcGF0aWJsZSBzdHJpbmcgaW4gRFRcbiIpOworCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFM KTsKKwl9CisKKwljaGFuLT5yZWcgPSB4ZGV2LT5yZWcgKyBYSUxJTlhfRFBETUFfQ0hfQkFTRSAr IFhJTElOWF9EUERNQV9DSF9PRkZTRVQgKgorCQkgICAgY2hhbi0+aWQ7CisJY2hhbi0+c3RhdHVz ID0gSURMRTsKKworCXNwaW5fbG9ja19pbml0KCZjaGFuLT5sb2NrKTsKKwlJTklUX0xJU1RfSEVB RCgmY2hhbi0+ZG9uZV9saXN0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjaGFuLT53YWl0X3Rv X3N0b3ApOworCisJdGFza2xldF9pbml0KCZjaGFuLT5kb25lX3Rhc2ssIHhpbGlueF9kcGRtYV9j aGFuX2RvbmVfdGFzaywKKwkJICAgICAodW5zaWduZWQgbG9uZyljaGFuKTsKKwl0YXNrbGV0X2lu aXQoJmNoYW4tPmVycl90YXNrLCB4aWxpbnhfZHBkbWFfY2hhbl9lcnJfdGFzaywKKwkJICAgICAo dW5zaWduZWQgbG9uZyljaGFuKTsKKworCWNoYW4tPmNvbW1vbi5kZXZpY2UgPSAmeGRldi0+Y29t bW9uOworCWNoYW4tPnhkZXYgPSB4ZGV2OworCisJbGlzdF9hZGRfdGFpbCgmY2hhbi0+Y29tbW9u LmRldmljZV9ub2RlLCAmeGRldi0+Y29tbW9uLmNoYW5uZWxzKTsKKwl4ZGV2LT5jaGFuW2NoYW4t PmlkXSA9IGNoYW47CisKKwlyZXR1cm4gY2hhbjsKK30KKworc3RhdGljIHZvaWQgeGlsaW54X2Rw ZG1hX2NoYW5fcmVtb3ZlKHN0cnVjdCB4aWxpbnhfZHBkbWFfY2hhbiAqY2hhbikKK3sKKwl0YXNr bGV0X2tpbGwoJmNoYW4tPmVycl90YXNrKTsKKwl0YXNrbGV0X2tpbGwoJmNoYW4tPmRvbmVfdGFz ayk7CisJbGlzdF9kZWwoJmNoYW4tPmNvbW1vbi5kZXZpY2Vfbm9kZSk7Cit9CisKK3N0YXRpYyBz dHJ1Y3QgZG1hX2NoYW4gKm9mX2RtYV94aWxpbnhfeGxhdGUoc3RydWN0IG9mX3BoYW5kbGVfYXJn cyAqZG1hX3NwZWMsCisJCQkJCSAgICBzdHJ1Y3Qgb2ZfZG1hICpvZmRtYSkKK3sKKwlzdHJ1Y3Qg eGlsaW54X2RwZG1hX2RldmljZSAqeGRldiA9IG9mZG1hLT5vZl9kbWFfZGF0YTsKKwl1aW50MzJf dCBjaGFuX2lkID0gZG1hX3NwZWMtPmFyZ3NbMF07CisKKwlpZiAoY2hhbl9pZCA+PSBYSUxJTlhf RFBETUFfTlVNX0NIQU4pCisJCXJldHVybiBOVUxMOworCisJaWYgKCF4ZGV2LT5jaGFuW2NoYW5f aWRdKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiBkbWFfZ2V0X3NsYXZlX2NoYW5uZWwoJnhk ZXYtPmNoYW5bY2hhbl9pZF0tPmNvbW1vbik7Cit9CisKK3N0YXRpYyBpbnQgeGlsaW54X2RwZG1h X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHhpbGlueF9k cGRtYV9kZXZpY2UgKnhkZXY7CisJc3RydWN0IHhpbGlueF9kcGRtYV9jaGFuICpjaGFuOworCXN0 cnVjdCBkbWFfZGV2aWNlICpkZGV2OworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCXN0cnVjdCBk ZXZpY2Vfbm9kZSAqbm9kZSwgKmNoaWxkOworCXUzMiBpOworCWludCBpcnEsIHJldDsKKworCXhk ZXYgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCp4ZGV2KSwgR0ZQX0tFUk5FTCk7 CisJaWYgKCF4ZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCXhkZXYtPmRldiA9ICZwZGV2LT5k ZXY7CisJZGRldiA9ICZ4ZGV2LT5jb21tb247CisJZGRldi0+ZGV2ID0gJnBkZXYtPmRldjsKKwlu b2RlID0geGRldi0+ZGV2LT5vZl9ub2RlOworCisJeGRldi0+YXhpX2NsayA9IGRldm1fY2xrX2dl dCh4ZGV2LT5kZXYsICJheGlfY2xrIik7CisJaWYgKElTX0VSUih4ZGV2LT5heGlfY2xrKSkKKwkJ cmV0dXJuIFBUUl9FUlIoeGRldi0+YXhpX2Nsayk7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVz b3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCXhkZXYtPnJlZyA9IGRldm1faW9yZW1h cF9yZXNvdXJjZSgmcGRldi0+ZGV2LCByZXMpOworCWlmIChJU19FUlIoeGRldi0+cmVnKSkKKwkJ cmV0dXJuIFBUUl9FUlIoeGRldi0+cmVnKTsKKworCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRl diwgMCk7CisJaWYgKGlycSA8IDApIHsKKwkJZGV2X2Vycih4ZGV2LT5kZXYsICJmYWlsZWQgdG8g Z2V0IHBsYXRmb3JtIGlycVxuIik7CisJCXJldHVybiBpcnE7CisJfQorCisJcmV0ID0gZGV2bV9y ZXF1ZXN0X2lycSh4ZGV2LT5kZXYsIGlycSwgeGlsaW54X2RwZG1hX2lycV9oYW5kbGVyLAorCQkJ ICAgICAgIElSUUZfU0hBUkVELCBkZXZfbmFtZSh4ZGV2LT5kZXYpLCB4ZGV2KTsKKwlpZiAocmV0 KSB7CisJCWRldl9lcnIoeGRldi0+ZGV2LCAiZmFpbGVkIHRvIHJlcXVlc3QgSVJRXG4iKTsKKwkJ cmV0dXJuIHJldDsKKwl9CisKKwlJTklUX0xJU1RfSEVBRCgmeGRldi0+Y29tbW9uLmNoYW5uZWxz KTsKKwlkbWFfY2FwX3NldChETUFfU0xBVkUsIGRkZXYtPmNhcF9tYXNrKTsKKwlkbWFfY2FwX3Nl dChETUFfUFJJVkFURSwgZGRldi0+Y2FwX21hc2spOworCWRtYV9jYXBfc2V0KERNQV9DWUNMSUMs IGRkZXYtPmNhcF9tYXNrKTsKKwlkbWFfY2FwX3NldChETUFfSU5URVJMRUFWRSwgZGRldi0+Y2Fw X21hc2spOworCWRkZXYtPmNvcHlfYWxpZ24gPSBmbHMoWElMSU5YX0RQRE1BX0FMSUdOX0JZVEVT IC0gMSk7CisKKwlkZGV2LT5kZXZpY2VfYWxsb2NfY2hhbl9yZXNvdXJjZXMgPSB4aWxpbnhfZHBk bWFfYWxsb2NfY2hhbl9yZXNvdXJjZXM7CisJZGRldi0+ZGV2aWNlX2ZyZWVfY2hhbl9yZXNvdXJj ZXMgPSB4aWxpbnhfZHBkbWFfZnJlZV9jaGFuX3Jlc291cmNlczsKKwlkZGV2LT5kZXZpY2VfcHJl cF9zbGF2ZV9zZyA9IHhpbGlueF9kcGRtYV9wcmVwX3NsYXZlX3NnOworCWRkZXYtPmRldmljZV9w cmVwX2RtYV9jeWNsaWMgPSB4aWxpbnhfZHBkbWFfcHJlcF9kbWFfY3ljbGljOworCWRkZXYtPmRl dmljZV9wcmVwX2ludGVybGVhdmVkX2RtYSA9IHhpbGlueF9kcGRtYV9wcmVwX2ludGVybGVhdmVk X2RtYTsKKwlkZGV2LT5kZXZpY2VfdHhfc3RhdHVzID0geGlsaW54X2RwZG1hX3R4X3N0YXR1czsK KwlkZGV2LT5kZXZpY2VfaXNzdWVfcGVuZGluZyA9IHhpbGlueF9kcGRtYV9pc3N1ZV9wZW5kaW5n OworCWRkZXYtPmRldmljZV9jb25maWcgPSB4aWxpbnhfZHBkbWFfY29uZmlnOworCWRkZXYtPmRl dmljZV9wYXVzZSA9IHhpbGlueF9kcGRtYV9wYXVzZTsKKwlkZGV2LT5kZXZpY2VfcmVzdW1lID0g eGlsaW54X2RwZG1hX3Jlc3VtZTsKKwlkZGV2LT5kZXZpY2VfdGVybWluYXRlX2FsbCA9IHhpbGlu eF9kcGRtYV90ZXJtaW5hdGVfYWxsOworCWRkZXYtPmRldmljZV9zeW5jaHJvbml6ZSA9IHhpbGlu eF9kcGRtYV9zeW5jaHJvbml6ZTsKKwlkZGV2LT5zcmNfYWRkcl93aWR0aHMgPSBCSVQoRE1BX1NM QVZFX0JVU1dJRFRIX1VOREVGSU5FRCk7CisJZGRldi0+ZGlyZWN0aW9ucyA9IEJJVChETUFfTUVN X1RPX0RFVik7CisJZGRldi0+cmVzaWR1ZV9ncmFudWxhcml0eSA9IERNQV9SRVNJRFVFX0dSQU5V TEFSSVRZX0RFU0NSSVBUT1I7CisKKwlmb3JfZWFjaF9jaGlsZF9vZl9ub2RlKG5vZGUsIGNoaWxk KSB7CisJCWNoYW4gPSB4aWxpbnhfZHBkbWFfY2hhbl9wcm9iZShjaGlsZCwgeGRldik7CisJCWlm IChJU19FUlIoY2hhbikpIHsKKwkJCWRldl9lcnIoeGRldi0+ZGV2LCAiZmFpbGVkIHRvIHByb2Jl IGEgY2hhbm5lbFxuIik7CisJCQlyZXQgPSBQVFJfRVJSKGNoYW4pOworCQkJZ290byBlcnJvcjsK KwkJfQorCX0KKworCXhkZXYtPmV4dF9hZGRyID0gc2l6ZW9mKGRtYV9hZGRyX3QpID4gNDsKKwlp ZiAoeGRldi0+ZXh0X2FkZHIpCisJCXhkZXYtPmRlc2NfYWRkciA9IHhpbGlueF9kcGRtYV9zd19k ZXNjX2FkZHJfNjQ7CisJZWxzZQorCQl4ZGV2LT5kZXNjX2FkZHIgPSB4aWxpbnhfZHBkbWFfc3df ZGVzY19hZGRyXzMyOworCisJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKHhkZXYtPmF4aV9jbGsp OworCWlmIChyZXQpIHsKKwkJZGV2X2Vycih4ZGV2LT5kZXYsICJmYWlsZWQgdG8gZW5hYmxlIHRo ZSBheGkgY2xvY2tcbiIpOworCQlnb3RvIGVycm9yOworCX0KKworCXJldCA9IGRtYV9hc3luY19k ZXZpY2VfcmVnaXN0ZXIoZGRldik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKHhkZXYtPmRldiwg ImZhaWxlZCB0byByZWdpc3RlciB0aGUgZG1hIGRldmljZVxuIik7CisJCWdvdG8gZXJyb3JfZG1h X2FzeW5jOworCX0KKworCXJldCA9IG9mX2RtYV9jb250cm9sbGVyX3JlZ2lzdGVyKHhkZXYtPmRl di0+b2Zfbm9kZSwKKwkJCQkJIG9mX2RtYV94aWxpbnhfeGxhdGUsIGRkZXYpOworCWlmIChyZXQp IHsKKwkJZGV2X2Vycih4ZGV2LT5kZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgRE1BIHRvIERUIERN QSBoZWxwZXJcbiIpOworCQlnb3RvIGVycm9yX29mX2RtYTsKKwl9CisKKwl4aWxpbnhfZHBkbWFf ZW5hYmxlX2ludHIoeGRldik7CisKKwl4aWxpbnhfZHBkbWFfZGVidWdmc19pbml0KCZwZGV2LT5k ZXYpOworCisJZGV2X2luZm8oJnBkZXYtPmRldiwgIlhpbGlueCBEUERNQSBlbmdpbmUgaXMgcHJv YmVkXG4iKTsKKworCXJldHVybiAwOworCitlcnJvcl9vZl9kbWE6CisJZG1hX2FzeW5jX2Rldmlj ZV91bnJlZ2lzdGVyKGRkZXYpOworZXJyb3JfZG1hX2FzeW5jOgorCWNsa19kaXNhYmxlX3VucHJl cGFyZSh4ZGV2LT5heGlfY2xrKTsKK2Vycm9yOgorCWZvciAoaSA9IDA7IGkgPCBYSUxJTlhfRFBE TUFfTlVNX0NIQU47IGkrKykKKwkJaWYgKHhkZXYtPmNoYW5baV0pCisJCQl4aWxpbnhfZHBkbWFf Y2hhbl9yZW1vdmUoeGRldi0+Y2hhbltpXSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMg aW50IHhpbGlueF9kcGRtYV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sK KwlzdHJ1Y3QgeGlsaW54X2RwZG1hX2RldmljZSAqeGRldjsKKwl1bnNpZ25lZCBpbnQgaTsKKwor CXhkZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCXhpbGlueF9kcGRtYV9kaXNh YmxlX2ludHIoeGRldik7CisJb2ZfZG1hX2NvbnRyb2xsZXJfZnJlZShwZGV2LT5kZXYub2Zfbm9k ZSk7CisJZG1hX2FzeW5jX2RldmljZV91bnJlZ2lzdGVyKCZ4ZGV2LT5jb21tb24pOworCWNsa19k aXNhYmxlX3VucHJlcGFyZSh4ZGV2LT5heGlfY2xrKTsKKworCWZvciAoaSA9IDA7IGkgPCBYSUxJ TlhfRFBETUFfTlVNX0NIQU47IGkrKykKKwkJaWYgKHhkZXYtPmNoYW5baV0pCisJCQl4aWxpbnhf ZHBkbWFfY2hhbl9yZW1vdmUoeGRldi0+Y2hhbltpXSk7CisKKwlyZXR1cm4gMDsKK30KKworc3Rh dGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgeGlsaW54X2RwZG1hX29mX21hdGNoW10gPSB7 CisJeyAuY29tcGF0aWJsZSA9ICJ4bG54LGRwZG1hIix9LAorCXsgLyogZW5kIG9mIHRhYmxlICov IH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgeGlsaW54X2RwZG1hX29mX21hdGNoKTsK Kworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgeGlsaW54X2RwZG1hX2RyaXZlciA9IHsK KwkucHJvYmUJCQk9IHhpbGlueF9kcGRtYV9wcm9iZSwKKwkucmVtb3ZlCQkJPSB4aWxpbnhfZHBk bWFfcmVtb3ZlLAorCS5kcml2ZXIJCQk9IHsKKwkJLm5hbWUJCT0gInhpbGlueC1kcGRtYSIsCisJ CS5vZl9tYXRjaF90YWJsZQk9IHhpbGlueF9kcGRtYV9vZl9tYXRjaCwKKwl9LAorfTsKKworbW9k dWxlX3BsYXRmb3JtX2RyaXZlcih4aWxpbnhfZHBkbWFfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhP UigiWGlsaW54LCBJbmMuIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlhpbGlueCBEUERNQSBkcml2 ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsK