From mboxrd@z Thu Jan 1 00:00:00 1970 From: Sameer Goel Subject: [RFC v2 4/7] ACPI: arm: Support for IORT Date: Wed, 20 Sep 2017 18:37:07 -0600 Message-ID: <1505954230-18892-5-git-send-email-sgoel@codeaurora.org> References: <1505954230-18892-1-git-send-email-sgoel@codeaurora.org> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail6.bemta6.messagelabs.com ([193.109.254.103]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dupUs-0000Mo-QC for xen-devel@lists.xenproject.org; Thu, 21 Sep 2017 00:37:42 +0000 In-Reply-To: <1505954230-18892-1-git-send-email-sgoel@codeaurora.org> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" To: xen-devel@lists.xenproject.org, julien.grall@arm.com, mjaggi@caviumnetworks.com Cc: sstabellini@kernel.org, wei.liu2@citrix.com, george.dunlap@eu.citrix.com, Andrew.Cooper3@citrix.com, jbeulich@suse.com, Sameer Goel , Ian.Jackson@citrix.com, nd@arm.com, robin.murphy@arm.com, shankerd@codeaurora.org List-Id: xen-devel@lists.xenproject.org VmVyYmF0aW0gZmlsZXMgZnJvbSBMaW51eCBrZXJuZWwuCmlvcnQuYzogY29tbWl0IGQ4OWNmMmU0 MTgyNjogQUNQSS9JT1JUOiBGaXggdGhlIGluZGVudGF0aW9uIGluCmlvcnRfc2Nhbl9ub2RlKCkK YWNwaV9pb3J0Lmg6IGNvbW1pdCAxOGI3MDliZWI1MDM6QUNQSS9JT1JUOiBNYWtlIGRtYSBtYXNr cyBzZXQtdXAgSU9SVApzcGVjaWZpYwoKU2lnbmVkLW9mZi1ieTogU2FtZWVyIEdvZWwgPHNnb2Vs QGNvZGVhdXJvcmEub3JnPgotLS0KIHhlbi9kcml2ZXJzL2FjcGkvYXJtL2lvcnQuYyAgfCA5NjEg KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwogeGVuL2luY2x1ZGUv YWNwaS9hY3BpX2lvcnQuaCB8ICA1OCArKysKIDIgZmlsZXMgY2hhbmdlZCwgMTAxOSBpbnNlcnRp b25zKCspCiBjcmVhdGUgbW9kZSAxMDA2NDQgeGVuL2RyaXZlcnMvYWNwaS9hcm0vaW9ydC5jCiBj cmVhdGUgbW9kZSAxMDA2NDQgeGVuL2luY2x1ZGUvYWNwaS9hY3BpX2lvcnQuaAoKZGlmZiAtLWdp dCBhL3hlbi9kcml2ZXJzL2FjcGkvYXJtL2lvcnQuYyBiL3hlbi9kcml2ZXJzL2FjcGkvYXJtL2lv cnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTM2OGE2Ci0tLSAvZGV2 L251bGwKKysrIGIveGVuL2RyaXZlcnMvYWNwaS9hcm0vaW9ydC5jCkBAIC0wLDAgKzEsOTYxIEBA CisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2LCBTZW1paGFsZgorICoJQXV0aG9yOiBUb21hc3og Tm93aWNraSA8dG5Ac2VtaWhhbGYuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNv ZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRl ciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNl bnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91 bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUg aXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQg ZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5F U1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMg TGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGlzIGZpbGUgaW1wbGVtZW50 cyBlYXJseSBkZXRlY3Rpb24vcGFyc2luZyBvZiBJL08gbWFwcGluZworICogcmVwb3J0ZWQgdG8g T1MgdGhyb3VnaCBmaXJtd2FyZSB2aWEgSS9PIFJlbWFwcGluZyBUYWJsZSAoSU9SVCkKKyAqIElP UlQgZG9jdW1lbnQgbnVtYmVyOiBBUk0gREVOIDAwNDlBCisgKi8KKworI2RlZmluZSBwcl9mbXQo Zm10KQkiQUNQSTogSU9SVDogIiBmbXQKKworI2luY2x1ZGUgPGxpbnV4L2FjcGlfaW9ydC5oPgor I2luY2x1ZGUgPGxpbnV4L2lvbW11Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5j bHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxp bnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworI2RlZmlu ZSBJT1JUX1RZUEVfTUFTSyh0eXBlKQkoMSA8PCAodHlwZSkpCisjZGVmaW5lIElPUlRfTVNJX1RZ UEUJCSgxIDw8IEFDUElfSU9SVF9OT0RFX0lUU19HUk9VUCkKKyNkZWZpbmUgSU9SVF9JT01NVV9U WVBFCQkoKDEgPDwgQUNQSV9JT1JUX05PREVfU01NVSkgfAlcCisJCQkJKDEgPDwgQUNQSV9JT1JU X05PREVfU01NVV9WMykpCisKK3N0cnVjdCBpb3J0X2l0c19tc2lfY2hpcCB7CisJc3RydWN0IGxp c3RfaGVhZAlsaXN0OworCXN0cnVjdCBmd25vZGVfaGFuZGxlCSpmd19ub2RlOworCXUzMgkJCXRy YW5zbGF0aW9uX2lkOworfTsKKworc3RydWN0IGlvcnRfZndub2RlIHsKKwlzdHJ1Y3QgbGlzdF9o ZWFkIGxpc3Q7CisJc3RydWN0IGFjcGlfaW9ydF9ub2RlICppb3J0X25vZGU7CisJc3RydWN0IGZ3 bm9kZV9oYW5kbGUgKmZ3bm9kZTsKK307CitzdGF0aWMgTElTVF9IRUFEKGlvcnRfZndub2RlX2xp c3QpOworc3RhdGljIERFRklORV9TUElOTE9DSyhpb3J0X2Z3bm9kZV9sb2NrKTsKKworLyoqCisg KiBpb3J0X3NldF9md25vZGUoKSAtIENyZWF0ZSBpb3J0X2Z3bm9kZSBhbmQgdXNlIGl0IHRvIHJl Z2lzdGVyCisgKgkJICAgICAgIGlvbW11IGRhdGEgaW4gdGhlIGlvcnRfZndub2RlX2xpc3QKKyAq CisgKiBAbm9kZTogSU9SVCB0YWJsZSBub2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgSU9NTVUKKyAq IEBmd25vZGU6IGZ3bm9kZSBhc3NvY2lhdGVkIHdpdGggdGhlIElPUlQgbm9kZQorICoKKyAqIFJl dHVybnM6IDAgb24gc3VjY2VzcworICogICAgICAgICAgPDAgb24gZmFpbHVyZQorICovCitzdGF0 aWMgaW5saW5lIGludCBpb3J0X3NldF9md25vZGUoc3RydWN0IGFjcGlfaW9ydF9ub2RlICppb3J0 X25vZGUsCisJCQkJICBzdHJ1Y3QgZndub2RlX2hhbmRsZSAqZndub2RlKQoreworCXN0cnVjdCBp b3J0X2Z3bm9kZSAqbnA7CisKKwlucCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpb3J0X2Z3bm9k ZSksIEdGUF9BVE9NSUMpOworCisJaWYgKFdBUk5fT04oIW5wKSkKKwkJcmV0dXJuIC1FTk9NRU07 CisKKwlJTklUX0xJU1RfSEVBRCgmbnAtPmxpc3QpOworCW5wLT5pb3J0X25vZGUgPSBpb3J0X25v ZGU7CisJbnAtPmZ3bm9kZSA9IGZ3bm9kZTsKKworCXNwaW5fbG9jaygmaW9ydF9md25vZGVfbG9j ayk7CisJbGlzdF9hZGRfdGFpbCgmbnAtPmxpc3QsICZpb3J0X2Z3bm9kZV9saXN0KTsKKwlzcGlu X3VubG9jaygmaW9ydF9md25vZGVfbG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBp b3J0X2dldF9md25vZGUoKSAtIFJldHJpZXZlIGZ3bm9kZSBhc3NvY2lhdGVkIHdpdGggYW4gSU9S VCBub2RlCisgKgorICogQG5vZGU6IElPUlQgdGFibGUgbm9kZSB0byBiZSBsb29rZWQtdXAKKyAq CisgKiBSZXR1cm5zOiBmd25vZGVfaGFuZGxlIHBvaW50ZXIgb24gc3VjY2VzcywgTlVMTCBvbiBm YWlsdXJlCisgKi8KK3N0YXRpYyBpbmxpbmUKK3N0cnVjdCBmd25vZGVfaGFuZGxlICppb3J0X2dl dF9md25vZGUoc3RydWN0IGFjcGlfaW9ydF9ub2RlICpub2RlKQoreworCXN0cnVjdCBpb3J0X2Z3 bm9kZSAqY3VycjsKKwlzdHJ1Y3QgZndub2RlX2hhbmRsZSAqZndub2RlID0gTlVMTDsKKworCXNw aW5fbG9jaygmaW9ydF9md25vZGVfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjdXJyLCAm aW9ydF9md25vZGVfbGlzdCwgbGlzdCkgeworCQlpZiAoY3Vyci0+aW9ydF9ub2RlID09IG5vZGUp IHsKKwkJCWZ3bm9kZSA9IGN1cnItPmZ3bm9kZTsKKwkJCWJyZWFrOworCQl9CisJfQorCXNwaW5f dW5sb2NrKCZpb3J0X2Z3bm9kZV9sb2NrKTsKKworCXJldHVybiBmd25vZGU7Cit9CisKKy8qKgor ICogaW9ydF9kZWxldGVfZndub2RlKCkgLSBEZWxldGUgZndub2RlIGFzc29jaWF0ZWQgd2l0aCBh biBJT1JUIG5vZGUKKyAqCisgKiBAbm9kZTogSU9SVCB0YWJsZSBub2RlIGFzc29jaWF0ZWQgd2l0 aCBmd25vZGUgdG8gZGVsZXRlCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBpb3J0X2RlbGV0ZV9m d25vZGUoc3RydWN0IGFjcGlfaW9ydF9ub2RlICpub2RlKQoreworCXN0cnVjdCBpb3J0X2Z3bm9k ZSAqY3VyciwgKnRtcDsKKworCXNwaW5fbG9jaygmaW9ydF9md25vZGVfbG9jayk7CisJbGlzdF9m b3JfZWFjaF9lbnRyeV9zYWZlKGN1cnIsIHRtcCwgJmlvcnRfZndub2RlX2xpc3QsIGxpc3QpIHsK KwkJaWYgKGN1cnItPmlvcnRfbm9kZSA9PSBub2RlKSB7CisJCQlsaXN0X2RlbCgmY3Vyci0+bGlz dCk7CisJCQlrZnJlZShjdXJyKTsKKwkJCWJyZWFrOworCQl9CisJfQorCXNwaW5fdW5sb2NrKCZp b3J0X2Z3bm9kZV9sb2NrKTsKK30KKwordHlwZWRlZiBhY3BpX3N0YXR1cyAoKmlvcnRfZmluZF9u b2RlX2NhbGxiYWNrKQorCShzdHJ1Y3QgYWNwaV9pb3J0X25vZGUgKm5vZGUsIHZvaWQgKmNvbnRl eHQpOworCisvKiBSb290IHBvaW50ZXIgdG8gdGhlIG1hcHBlZCBJT1JUIHRhYmxlICovCitzdGF0 aWMgc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICppb3J0X3RhYmxlOworCitzdGF0aWMgTElTVF9I RUFEKGlvcnRfbXNpX2NoaXBfbGlzdCk7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGlvcnRfbXNp X2NoaXBfbG9jayk7CisKKy8qKgorICogaW9ydF9yZWdpc3Rlcl9kb21haW5fdG9rZW4oKSAtIHJl Z2lzdGVyIGRvbWFpbiB0b2tlbiBhbmQgcmVsYXRlZCBJVFMgSUQKKyAqIHRvIHRoZSBsaXN0IGZy b20gd2hlcmUgd2UgY2FuIGdldCBpdCBiYWNrIGxhdGVyIG9uLgorICogQHRyYW5zX2lkOiBJVFMg SUQuCisgKiBAZndfbm9kZTogRG9tYWluIHRva2VuLgorICoKKyAqIFJldHVybnM6IDAgb24gc3Vj Y2VzcywgLUVOT01FTSBpZiBubyBtZW1vcnkgd2hlbiBhbGxvY2F0aW5nIGxpc3QgZWxlbWVudAor ICovCitpbnQgaW9ydF9yZWdpc3Rlcl9kb21haW5fdG9rZW4oaW50IHRyYW5zX2lkLCBzdHJ1Y3Qg Zndub2RlX2hhbmRsZSAqZndfbm9kZSkKK3sKKwlzdHJ1Y3QgaW9ydF9pdHNfbXNpX2NoaXAgKml0 c19tc2lfY2hpcDsKKworCWl0c19tc2lfY2hpcCA9IGt6YWxsb2Moc2l6ZW9mKCppdHNfbXNpX2No aXApLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWl0c19tc2lfY2hpcCkKKwkJcmV0dXJuIC1FTk9NRU07 CisKKwlpdHNfbXNpX2NoaXAtPmZ3X25vZGUgPSBmd19ub2RlOworCWl0c19tc2lfY2hpcC0+dHJh bnNsYXRpb25faWQgPSB0cmFuc19pZDsKKworCXNwaW5fbG9jaygmaW9ydF9tc2lfY2hpcF9sb2Nr KTsKKwlsaXN0X2FkZCgmaXRzX21zaV9jaGlwLT5saXN0LCAmaW9ydF9tc2lfY2hpcF9saXN0KTsK KwlzcGluX3VubG9jaygmaW9ydF9tc2lfY2hpcF9sb2NrKTsKKworCXJldHVybiAwOworfQorCisv KioKKyAqIGlvcnRfZGVyZWdpc3Rlcl9kb21haW5fdG9rZW4oKSAtIERlcmVnaXN0ZXIgZG9tYWlu IHRva2VuIGJhc2VkIG9uIElUUyBJRAorICogQHRyYW5zX2lkOiBJVFMgSUQuCisgKgorICogUmV0 dXJuczogbm9uZS4KKyAqLwordm9pZCBpb3J0X2RlcmVnaXN0ZXJfZG9tYWluX3Rva2VuKGludCB0 cmFuc19pZCkKK3sKKwlzdHJ1Y3QgaW9ydF9pdHNfbXNpX2NoaXAgKml0c19tc2lfY2hpcCwgKnQ7 CisKKwlzcGluX2xvY2soJmlvcnRfbXNpX2NoaXBfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRy eV9zYWZlKGl0c19tc2lfY2hpcCwgdCwgJmlvcnRfbXNpX2NoaXBfbGlzdCwgbGlzdCkgeworCQlp ZiAoaXRzX21zaV9jaGlwLT50cmFuc2xhdGlvbl9pZCA9PSB0cmFuc19pZCkgeworCQkJbGlzdF9k ZWwoJml0c19tc2lfY2hpcC0+bGlzdCk7CisJCQlrZnJlZShpdHNfbXNpX2NoaXApOworCQkJYnJl YWs7CisJCX0KKwl9CisJc3Bpbl91bmxvY2soJmlvcnRfbXNpX2NoaXBfbG9jayk7Cit9CisKKy8q KgorICogaW9ydF9maW5kX2RvbWFpbl90b2tlbigpIC0gRmluZCBkb21haW4gdG9rZW4gYmFzZWQg b24gZ2l2ZW4gSVRTIElECisgKiBAdHJhbnNfaWQ6IElUUyBJRC4KKyAqCisgKiBSZXR1cm5zOiBk b21haW4gdG9rZW4gd2hlbiBmaW5kIG9uIHRoZSBsaXN0LCBOVUxMIG90aGVyd2lzZQorICovCitz dHJ1Y3QgZndub2RlX2hhbmRsZSAqaW9ydF9maW5kX2RvbWFpbl90b2tlbihpbnQgdHJhbnNfaWQp Cit7CisJc3RydWN0IGZ3bm9kZV9oYW5kbGUgKmZ3X25vZGUgPSBOVUxMOworCXN0cnVjdCBpb3J0 X2l0c19tc2lfY2hpcCAqaXRzX21zaV9jaGlwOworCisJc3Bpbl9sb2NrKCZpb3J0X21zaV9jaGlw X2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkoaXRzX21zaV9jaGlwLCAmaW9ydF9tc2lfY2hp cF9saXN0LCBsaXN0KSB7CisJCWlmIChpdHNfbXNpX2NoaXAtPnRyYW5zbGF0aW9uX2lkID09IHRy YW5zX2lkKSB7CisJCQlmd19ub2RlID0gaXRzX21zaV9jaGlwLT5md19ub2RlOworCQkJYnJlYWs7 CisJCX0KKwl9CisJc3Bpbl91bmxvY2soJmlvcnRfbXNpX2NoaXBfbG9jayk7CisKKwlyZXR1cm4g Zndfbm9kZTsKK30KKworc3RhdGljIHN0cnVjdCBhY3BpX2lvcnRfbm9kZSAqaW9ydF9zY2FuX25v ZGUoZW51bSBhY3BpX2lvcnRfbm9kZV90eXBlIHR5cGUsCisJCQkJCSAgICAgaW9ydF9maW5kX25v ZGVfY2FsbGJhY2sgY2FsbGJhY2ssCisJCQkJCSAgICAgdm9pZCAqY29udGV4dCkKK3sKKwlzdHJ1 Y3QgYWNwaV9pb3J0X25vZGUgKmlvcnRfbm9kZSwgKmlvcnRfZW5kOworCXN0cnVjdCBhY3BpX3Rh YmxlX2lvcnQgKmlvcnQ7CisJaW50IGk7CisKKwlpZiAoIWlvcnRfdGFibGUpCisJCXJldHVybiBO VUxMOworCisJLyogR2V0IHRoZSBmaXJzdCBJT1JUIG5vZGUgKi8KKwlpb3J0ID0gKHN0cnVjdCBh Y3BpX3RhYmxlX2lvcnQgKilpb3J0X3RhYmxlOworCWlvcnRfbm9kZSA9IEFDUElfQUREX1BUUihz dHJ1Y3QgYWNwaV9pb3J0X25vZGUsIGlvcnQsCisJCQkJIGlvcnQtPm5vZGVfb2Zmc2V0KTsKKwlp b3J0X2VuZCA9IEFDUElfQUREX1BUUihzdHJ1Y3QgYWNwaV9pb3J0X25vZGUsIGlvcnRfdGFibGUs CisJCQkJaW9ydF90YWJsZS0+bGVuZ3RoKTsKKworCWZvciAoaSA9IDA7IGkgPCBpb3J0LT5ub2Rl X2NvdW50OyBpKyspIHsKKwkJaWYgKFdBUk5fVEFJTlQoaW9ydF9ub2RlID49IGlvcnRfZW5kLCBU QUlOVF9GSVJNV0FSRV9XT1JLQVJPVU5ELAorCQkJICAgICAgICJJT1JUIG5vZGUgcG9pbnRlciBv dmVyZmxvd3MsIGJhZCB0YWJsZSFcbiIpKQorCQkJcmV0dXJuIE5VTEw7CisKKwkJaWYgKGlvcnRf bm9kZS0+dHlwZSA9PSB0eXBlICYmCisJCSAgICBBQ1BJX1NVQ0NFU1MoY2FsbGJhY2soaW9ydF9u b2RlLCBjb250ZXh0KSkpCisJCQlyZXR1cm4gaW9ydF9ub2RlOworCisJCWlvcnRfbm9kZSA9IEFD UElfQUREX1BUUihzdHJ1Y3QgYWNwaV9pb3J0X25vZGUsIGlvcnRfbm9kZSwKKwkJCQkJIGlvcnRf bm9kZS0+bGVuZ3RoKTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGFjcGlfc3Rh dHVzCitpb3J0X21hdGNoX3R5cGVfY2FsbGJhY2soc3RydWN0IGFjcGlfaW9ydF9ub2RlICpub2Rl LCB2b2lkICpjb250ZXh0KQoreworCXJldHVybiBBRV9PSzsKK30KKworYm9vbCBpb3J0X25vZGVf bWF0Y2godTggdHlwZSkKK3sKKwlzdHJ1Y3QgYWNwaV9pb3J0X25vZGUgKm5vZGU7CisKKwlub2Rl ID0gaW9ydF9zY2FuX25vZGUodHlwZSwgaW9ydF9tYXRjaF90eXBlX2NhbGxiYWNrLCBOVUxMKTsK KworCXJldHVybiBub2RlICE9IE5VTEw7Cit9CisKK3N0YXRpYyBhY3BpX3N0YXR1cyBpb3J0X21h dGNoX25vZGVfY2FsbGJhY2soc3RydWN0IGFjcGlfaW9ydF9ub2RlICpub2RlLAorCQkJCQkgICAg dm9pZCAqY29udGV4dCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjb250ZXh0OworCWFjcGlf c3RhdHVzIHN0YXR1czsKKworCWlmIChub2RlLT50eXBlID09IEFDUElfSU9SVF9OT0RFX05BTUVE X0NPTVBPTkVOVCkgeworCQlzdHJ1Y3QgYWNwaV9idWZmZXIgYnVmID0geyBBQ1BJX0FMTE9DQVRF X0JVRkZFUiwgTlVMTCB9OworCQlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFkZXYgPSB0b19hY3BpX2Rl dmljZV9ub2RlKGRldi0+Zndub2RlKTsKKwkJc3RydWN0IGFjcGlfaW9ydF9uYW1lZF9jb21wb25l bnQgKm5jb21wOworCisJCWlmICghYWRldikgeworCQkJc3RhdHVzID0gQUVfTk9UX0ZPVU5EOwor CQkJZ290byBvdXQ7CisJCX0KKworCQlzdGF0dXMgPSBhY3BpX2dldF9uYW1lKGFkZXYtPmhhbmRs ZSwgQUNQSV9GVUxMX1BBVEhOQU1FLCAmYnVmKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMp KSB7CisJCQlkZXZfd2FybihkZXYsICJDYW4ndCBnZXQgZGV2aWNlIGZ1bGwgcGF0aCBuYW1lXG4i KTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJbmNvbXAgPSAoc3RydWN0IGFjcGlfaW9ydF9uYW1l ZF9jb21wb25lbnQgKilub2RlLT5ub2RlX2RhdGE7CisJCXN0YXR1cyA9ICFzdHJjbXAobmNvbXAt PmRldmljZV9uYW1lLCBidWYucG9pbnRlcikgPworCQkJCQkJCUFFX09LIDogQUVfTk9UX0ZPVU5E OworCQlhY3BpX29zX2ZyZWUoYnVmLnBvaW50ZXIpOworCX0gZWxzZSBpZiAobm9kZS0+dHlwZSA9 PSBBQ1BJX0lPUlRfTk9ERV9QQ0lfUk9PVF9DT01QTEVYKSB7CisJCXN0cnVjdCBhY3BpX2lvcnRf cm9vdF9jb21wbGV4ICpwY2lfcmM7CisJCXN0cnVjdCBwY2lfYnVzICpidXM7CisKKwkJYnVzID0g dG9fcGNpX2J1cyhkZXYpOworCQlwY2lfcmMgPSAoc3RydWN0IGFjcGlfaW9ydF9yb290X2NvbXBs ZXggKilub2RlLT5ub2RlX2RhdGE7CisKKwkJLyoKKwkJICogSXQgaXMgYXNzdW1lZCB0aGF0IFBD SSBzZWdtZW50IG51bWJlcnMgbWFwcyBvbmUtdG8tb25lCisJCSAqIHdpdGggcm9vdCBjb21wbGV4 ZXMuIEVhY2ggc2VnbWVudCBudW1iZXIgY2FuIHJlcHJlc2VudCBvbmx5CisJCSAqIG9uZSByb290 IGNvbXBsZXguCisJCSAqLworCQlzdGF0dXMgPSBwY2lfcmMtPnBjaV9zZWdtZW50X251bWJlciA9 PSBwY2lfZG9tYWluX25yKGJ1cykgPworCQkJCQkJCUFFX09LIDogQUVfTk9UX0ZPVU5EOworCX0g ZWxzZSB7CisJCXN0YXR1cyA9IEFFX05PVF9GT1VORDsKKwl9CitvdXQ6CisJcmV0dXJuIHN0YXR1 czsKK30KKworc3RhdGljIGludCBpb3J0X2lkX21hcChzdHJ1Y3QgYWNwaV9pb3J0X2lkX21hcHBp bmcgKm1hcCwgdTggdHlwZSwgdTMyIHJpZF9pbiwKKwkJICAgICAgIHUzMiAqcmlkX291dCkKK3sK KwkvKiBTaW5nbGUgbWFwcGluZyBkb2VzIG5vdCBjYXJlIGZvciBpbnB1dCBpZCAqLworCWlmICht YXAtPmZsYWdzICYgQUNQSV9JT1JUX0lEX1NJTkdMRV9NQVBQSU5HKSB7CisJCWlmICh0eXBlID09 IEFDUElfSU9SVF9OT0RFX05BTUVEX0NPTVBPTkVOVCB8fAorCQkgICAgdHlwZSA9PSBBQ1BJX0lP UlRfTk9ERV9QQ0lfUk9PVF9DT01QTEVYKSB7CisJCQkqcmlkX291dCA9IG1hcC0+b3V0cHV0X2Jh c2U7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCXByX3dhcm4oRldfQlVHICJbbWFwICVwXSBTSU5H TEUgTUFQUElORyBmbGFnIG5vdCBhbGxvd2VkIGZvciBub2RlIHR5cGUgJWQsIHNraXBwaW5nIElE IG1hcFxuIiwKKwkJCW1hcCwgdHlwZSk7CisJCXJldHVybiAtRU5YSU87CisJfQorCisJaWYgKHJp ZF9pbiA8IG1hcC0+aW5wdXRfYmFzZSB8fAorCSAgICAocmlkX2luID49IG1hcC0+aW5wdXRfYmFz ZSArIG1hcC0+aWRfY291bnQpKQorCQlyZXR1cm4gLUVOWElPOworCisJKnJpZF9vdXQgPSBtYXAt Pm91dHB1dF9iYXNlICsgKHJpZF9pbiAtIG1hcC0+aW5wdXRfYmFzZSk7CisJcmV0dXJuIDA7Cit9 CisKK3N0YXRpYworc3RydWN0IGFjcGlfaW9ydF9ub2RlICppb3J0X25vZGVfZ2V0X2lkKHN0cnVj dCBhY3BpX2lvcnRfbm9kZSAqbm9kZSwKKwkJCQkJdTMyICppZF9vdXQsIHU4IHR5cGVfbWFzaywK KwkJCQkJaW50IGluZGV4KQoreworCXN0cnVjdCBhY3BpX2lvcnRfbm9kZSAqcGFyZW50OworCXN0 cnVjdCBhY3BpX2lvcnRfaWRfbWFwcGluZyAqbWFwOworCisJaWYgKCFub2RlLT5tYXBwaW5nX29m ZnNldCB8fCAhbm9kZS0+bWFwcGluZ19jb3VudCB8fAorCQkJCSAgICAgaW5kZXggPj0gbm9kZS0+ bWFwcGluZ19jb3VudCkKKwkJcmV0dXJuIE5VTEw7CisKKwltYXAgPSBBQ1BJX0FERF9QVFIoc3Ry dWN0IGFjcGlfaW9ydF9pZF9tYXBwaW5nLCBub2RlLAorCQkJICAgbm9kZS0+bWFwcGluZ19vZmZz ZXQgKyBpbmRleCAqIHNpemVvZigqbWFwKSk7CisKKwkvKiBGaXJtd2FyZSBidWchICovCisJaWYg KCFtYXAtPm91dHB1dF9yZWZlcmVuY2UpIHsKKwkJcHJfZXJyKEZXX0JVRyAiW25vZGUgJXAgdHlw ZSAlZF0gSUQgbWFwIGhhcyBOVUxMIHBhcmVudCByZWZlcmVuY2VcbiIsCisJCSAgICAgICBub2Rl LCBub2RlLT50eXBlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcGFyZW50ID0gQUNQSV9BRERf UFRSKHN0cnVjdCBhY3BpX2lvcnRfbm9kZSwgaW9ydF90YWJsZSwKKwkJCSAgICAgICBtYXAtPm91 dHB1dF9yZWZlcmVuY2UpOworCisJaWYgKCEoSU9SVF9UWVBFX01BU0socGFyZW50LT50eXBlKSAm IHR5cGVfbWFzaykpCisJCXJldHVybiBOVUxMOworCisJaWYgKG1hcC0+ZmxhZ3MgJiBBQ1BJX0lP UlRfSURfU0lOR0xFX01BUFBJTkcpIHsKKwkJaWYgKG5vZGUtPnR5cGUgPT0gQUNQSV9JT1JUX05P REVfTkFNRURfQ09NUE9ORU5UIHx8CisJCSAgICBub2RlLT50eXBlID09IEFDUElfSU9SVF9OT0RF X1BDSV9ST09UX0NPTVBMRVgpIHsKKwkJCSppZF9vdXQgPSBtYXAtPm91dHB1dF9iYXNlOworCQkJ cmV0dXJuIHBhcmVudDsKKwkJfQorCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3Ry dWN0IGFjcGlfaW9ydF9ub2RlICppb3J0X25vZGVfbWFwX3JpZChzdHJ1Y3QgYWNwaV9pb3J0X25v ZGUgKm5vZGUsCisJCQkJCQl1MzIgcmlkX2luLCB1MzIgKnJpZF9vdXQsCisJCQkJCQl1OCB0eXBl X21hc2spCit7CisJdTMyIHJpZCA9IHJpZF9pbjsKKworCS8qIFBhcnNlIHRoZSBJRCBtYXBwaW5n IHRyZWUgdG8gZmluZCBzcGVjaWZpZWQgbm9kZSB0eXBlICovCisJd2hpbGUgKG5vZGUpIHsKKwkJ c3RydWN0IGFjcGlfaW9ydF9pZF9tYXBwaW5nICptYXA7CisJCWludCBpOworCisJCWlmIChJT1JU X1RZUEVfTUFTSyhub2RlLT50eXBlKSAmIHR5cGVfbWFzaykgeworCQkJaWYgKHJpZF9vdXQpCisJ CQkJKnJpZF9vdXQgPSByaWQ7CisJCQlyZXR1cm4gbm9kZTsKKwkJfQorCisJCWlmICghbm9kZS0+ bWFwcGluZ19vZmZzZXQgfHwgIW5vZGUtPm1hcHBpbmdfY291bnQpCisJCQlnb3RvIGZhaWxfbWFw OworCisJCW1hcCA9IEFDUElfQUREX1BUUihzdHJ1Y3QgYWNwaV9pb3J0X2lkX21hcHBpbmcsIG5v ZGUsCisJCQkJICAgbm9kZS0+bWFwcGluZ19vZmZzZXQpOworCisJCS8qIEZpcm13YXJlIGJ1ZyEg Ki8KKwkJaWYgKCFtYXAtPm91dHB1dF9yZWZlcmVuY2UpIHsKKwkJCXByX2VycihGV19CVUcgIltu b2RlICVwIHR5cGUgJWRdIElEIG1hcCBoYXMgTlVMTCBwYXJlbnQgcmVmZXJlbmNlXG4iLAorCQkJ ICAgICAgIG5vZGUsIG5vZGUtPnR5cGUpOworCQkJZ290byBmYWlsX21hcDsKKwkJfQorCisJCS8q IERvIHRoZSBSSUQgdHJhbnNsYXRpb24gKi8KKwkJZm9yIChpID0gMDsgaSA8IG5vZGUtPm1hcHBp bmdfY291bnQ7IGkrKywgbWFwKyspIHsKKwkJCWlmICghaW9ydF9pZF9tYXAobWFwLCBub2RlLT50 eXBlLCByaWQsICZyaWQpKQorCQkJCWJyZWFrOworCQl9CisKKwkJaWYgKGkgPT0gbm9kZS0+bWFw cGluZ19jb3VudCkKKwkJCWdvdG8gZmFpbF9tYXA7CisKKwkJbm9kZSA9IEFDUElfQUREX1BUUihz dHJ1Y3QgYWNwaV9pb3J0X25vZGUsIGlvcnRfdGFibGUsCisJCQkJICAgIG1hcC0+b3V0cHV0X3Jl ZmVyZW5jZSk7CisJfQorCitmYWlsX21hcDoKKwkvKiBNYXAgaW5wdXQgUklEIHRvIG91dHB1dCBS SUQgdW5jaGFuZ2VkIG9uIG1hcHBpbmcgZmFpbHVyZSovCisJaWYgKHJpZF9vdXQpCisJCSpyaWRf b3V0ID0gcmlkX2luOworCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYWNwaV9p b3J0X25vZGUgKmlvcnRfZmluZF9kZXZfbm9kZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3Ry dWN0IHBjaV9idXMgKnBidXM7CisKKwlpZiAoIWRldl9pc19wY2koZGV2KSkKKwkJcmV0dXJuIGlv cnRfc2Nhbl9ub2RlKEFDUElfSU9SVF9OT0RFX05BTUVEX0NPTVBPTkVOVCwKKwkJCQkgICAgICBp b3J0X21hdGNoX25vZGVfY2FsbGJhY2ssIGRldik7CisKKwkvKiBGaW5kIGEgUENJIHJvb3QgYnVz ICovCisJcGJ1cyA9IHRvX3BjaV9kZXYoZGV2KS0+YnVzOworCXdoaWxlICghcGNpX2lzX3Jvb3Rf YnVzKHBidXMpKQorCQlwYnVzID0gcGJ1cy0+cGFyZW50OworCisJcmV0dXJuIGlvcnRfc2Nhbl9u b2RlKEFDUElfSU9SVF9OT0RFX1BDSV9ST09UX0NPTVBMRVgsCisJCQkgICAgICBpb3J0X21hdGNo X25vZGVfY2FsbGJhY2ssICZwYnVzLT5kZXYpOworfQorCisvKioKKyAqIGlvcnRfbXNpX21hcF9y aWQoKSAtIE1hcCBhIE1TSSByZXF1ZXN0ZXIgSUQgZm9yIGEgZGV2aWNlCisgKiBAZGV2OiBUaGUg ZGV2aWNlIGZvciB3aGljaCB0aGUgbWFwcGluZyBpcyB0byBiZSBkb25lLgorICogQHJlcV9pZDog VGhlIGRldmljZSByZXF1ZXN0ZXIgSUQuCisgKgorICogUmV0dXJuczogbWFwcGVkIE1TSSBSSUQg b24gc3VjY2VzcywgaW5wdXQgcmVxdWVzdGVyIElEIG90aGVyd2lzZQorICovCit1MzIgaW9ydF9t c2lfbWFwX3JpZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHUzMiByZXFfaWQpCit7CisJc3RydWN0IGFj cGlfaW9ydF9ub2RlICpub2RlOworCXUzMiBkZXZfaWQ7CisKKwlub2RlID0gaW9ydF9maW5kX2Rl dl9ub2RlKGRldik7CisJaWYgKCFub2RlKQorCQlyZXR1cm4gcmVxX2lkOworCisJaW9ydF9ub2Rl X21hcF9yaWQobm9kZSwgcmVxX2lkLCAmZGV2X2lkLCBJT1JUX01TSV9UWVBFKTsKKwlyZXR1cm4g ZGV2X2lkOworfQorCisvKioKKyAqIGlvcnRfZGV2X2ZpbmRfaXRzX2lkKCkgLSBGaW5kIHRoZSBJ VFMgaWRlbnRpZmllciBmb3IgYSBkZXZpY2UKKyAqIEBkZXY6IFRoZSBkZXZpY2UuCisgKiBAaWR4 OiBJbmRleCBvZiB0aGUgSVRTIGlkZW50aWZpZXIgbGlzdC4KKyAqIEBpdHNfaWQ6IElUUyBpZGVu dGlmaWVyLgorICoKKyAqIFJldHVybnM6IDAgb24gc3VjY2VzcywgYXBwcm9wcmlhdGUgZXJyb3Ig dmFsdWUgb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbnQgaW9ydF9kZXZfZmluZF9pdHNfaWQoc3Ry dWN0IGRldmljZSAqZGV2LCB1MzIgcmVxX2lkLAorCQkJCXVuc2lnbmVkIGludCBpZHgsIGludCAq aXRzX2lkKQoreworCXN0cnVjdCBhY3BpX2lvcnRfaXRzX2dyb3VwICppdHM7CisJc3RydWN0IGFj cGlfaW9ydF9ub2RlICpub2RlOworCisJbm9kZSA9IGlvcnRfZmluZF9kZXZfbm9kZShkZXYpOwor CWlmICghbm9kZSkKKwkJcmV0dXJuIC1FTlhJTzsKKworCW5vZGUgPSBpb3J0X25vZGVfbWFwX3Jp ZChub2RlLCByZXFfaWQsIE5VTEwsIElPUlRfTVNJX1RZUEUpOworCWlmICghbm9kZSkKKwkJcmV0 dXJuIC1FTlhJTzsKKworCS8qIE1vdmUgdG8gSVRTIHNwZWNpZmljIGRhdGEgKi8KKwlpdHMgPSAo c3RydWN0IGFjcGlfaW9ydF9pdHNfZ3JvdXAgKilub2RlLT5ub2RlX2RhdGE7CisJaWYgKGlkeCA+ IGl0cy0+aXRzX2NvdW50KSB7CisJCWRldl9lcnIoZGV2LCAicmVxdWVzdGVkIElUUyBJRCBpbmRl eCBbJWRdIGlzIGdyZWF0ZXIgdGhhbiBhdmFpbGFibGUgWyVkXVxuIiwKKwkJCWlkeCwgaXRzLT5p dHNfY291bnQpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCSppdHNfaWQgPSBpdHMtPmlkZW50 aWZpZXJzW2lkeF07CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaW9ydF9nZXRfZGV2aWNlX2Rv bWFpbigpIC0gRmluZCBNU0kgZG9tYWluIHJlbGF0ZWQgdG8gYSBkZXZpY2UKKyAqIEBkZXY6IFRo ZSBkZXZpY2UuCisgKiBAcmVxX2lkOiBSZXF1ZXN0ZXIgSUQgZm9yIHRoZSBkZXZpY2UuCisgKgor ICogUmV0dXJuczogdGhlIE1TSSBkb21haW4gZm9yIHRoaXMgZGV2aWNlLCBOVUxMIG90aGVyd2lz ZQorICovCitzdHJ1Y3QgaXJxX2RvbWFpbiAqaW9ydF9nZXRfZGV2aWNlX2RvbWFpbihzdHJ1Y3Qg ZGV2aWNlICpkZXYsIHUzMiByZXFfaWQpCit7CisJc3RydWN0IGZ3bm9kZV9oYW5kbGUgKmhhbmRs ZTsKKwlpbnQgaXRzX2lkOworCisJaWYgKGlvcnRfZGV2X2ZpbmRfaXRzX2lkKGRldiwgcmVxX2lk LCAwLCAmaXRzX2lkKSkKKwkJcmV0dXJuIE5VTEw7CisKKwloYW5kbGUgPSBpb3J0X2ZpbmRfZG9t YWluX3Rva2VuKGl0c19pZCk7CisJaWYgKCFoYW5kbGUpCisJCXJldHVybiBOVUxMOworCisJcmV0 dXJuIGlycV9maW5kX21hdGNoaW5nX2Z3bm9kZShoYW5kbGUsIERPTUFJTl9CVVNfUENJX01TSSk7 Cit9CisKK3N0YXRpYyBpbnQgX19nZXRfcGNpX3JpZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdTE2 IGFsaWFzLCB2b2lkICpkYXRhKQoreworCXUzMiAqcmlkID0gZGF0YTsKKworCSpyaWQgPSBhbGlh czsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhcm1fc21tdV9pb3J0X3hsYXRlKHN0cnVj dCBkZXZpY2UgKmRldiwgdTMyIHN0cmVhbWlkLAorCQkJICAgICAgIHN0cnVjdCBmd25vZGVfaGFu ZGxlICpmd25vZGUsCisJCQkgICAgICAgY29uc3Qgc3RydWN0IGlvbW11X29wcyAqb3BzKQorewor CWludCByZXQgPSBpb21tdV9md3NwZWNfaW5pdChkZXYsIGZ3bm9kZSwgb3BzKTsKKworCWlmICgh cmV0KQorCQlyZXQgPSBpb21tdV9md3NwZWNfYWRkX2lkcyhkZXYsICZzdHJlYW1pZCwgMSk7CisK KwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGlvbW11X29wcyAqaW9ydF9p b21tdV94bGF0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCXN0cnVjdCBhY3BpX2lvcnRfbm9k ZSAqbm9kZSwKKwkJCQkJdTMyIHN0cmVhbWlkKQoreworCWNvbnN0IHN0cnVjdCBpb21tdV9vcHMg Km9wcyA9IE5VTEw7CisJaW50IHJldCA9IC1FTk9ERVY7CisJc3RydWN0IGZ3bm9kZV9oYW5kbGUg KmlvcnRfZndub2RlOworCisJaWYgKG5vZGUpIHsKKwkJaW9ydF9md25vZGUgPSBpb3J0X2dldF9m d25vZGUobm9kZSk7CisJCWlmICghaW9ydF9md25vZGUpCisJCQlyZXR1cm4gTlVMTDsKKworCQlv cHMgPSBpb21tdV9vcHNfZnJvbV9md25vZGUoaW9ydF9md25vZGUpOworCQlpZiAoIW9wcykKKwkJ CXJldHVybiBOVUxMOworCisJCXJldCA9IGFybV9zbW11X2lvcnRfeGxhdGUoZGV2LCBzdHJlYW1p ZCwgaW9ydF9md25vZGUsIG9wcyk7CisJfQorCisJcmV0dXJuIHJldCA/IE5VTEwgOiBvcHM7Cit9 CisKKy8qKgorICogaW9ydF9zZXRfZG1hX21hc2sgLSBTZXQtdXAgZG1hIG1hc2sgZm9yIGEgZGV2 aWNlLgorICoKKyAqIEBkZXY6IGRldmljZSB0byBjb25maWd1cmUKKyAqLwordm9pZCBpb3J0X3Nl dF9kbWFfbWFzayhzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJLyoKKwkgKiBTZXQgZGVmYXVsdCBj b2hlcmVudF9kbWFfbWFzayB0byAzMiBiaXQuICBEcml2ZXJzIGFyZSBleHBlY3RlZCB0bworCSAq IHNldHVwIHRoZSBjb3JyZWN0IHN1cHBvcnRlZCBtYXNrLgorCSAqLworCWlmICghZGV2LT5jb2hl cmVudF9kbWFfbWFzaykKKwkJZGV2LT5jb2hlcmVudF9kbWFfbWFzayA9IERNQV9CSVRfTUFTSygz Mik7CisKKwkvKgorCSAqIFNldCBpdCB0byBjb2hlcmVudF9kbWFfbWFzayBieSBkZWZhdWx0IGlm IHRoZSBhcmNoaXRlY3R1cmUKKwkgKiBjb2RlIGhhcyBub3Qgc2V0IGl0LgorCSAqLworCWlmICgh ZGV2LT5kbWFfbWFzaykKKwkJZGV2LT5kbWFfbWFzayA9ICZkZXYtPmNvaGVyZW50X2RtYV9tYXNr OworfQorCisvKioKKyAqIGlvcnRfaW9tbXVfY29uZmlndXJlIC0gU2V0LXVwIElPTU1VIGNvbmZp Z3VyYXRpb24gZm9yIGEgZGV2aWNlLgorICoKKyAqIEBkZXY6IGRldmljZSB0byBjb25maWd1cmUK KyAqCisgKiBSZXR1cm5zOiBpb21tdV9vcHMgcG9pbnRlciBvbiBjb25maWd1cmF0aW9uIHN1Y2Nl c3MKKyAqICAgICAgICAgIE5VTEwgb24gY29uZmlndXJhdGlvbiBmYWlsdXJlCisgKi8KK2NvbnN0 IHN0cnVjdCBpb21tdV9vcHMgKmlvcnRfaW9tbXVfY29uZmlndXJlKHN0cnVjdCBkZXZpY2UgKmRl dikKK3sKKwlzdHJ1Y3QgYWNwaV9pb3J0X25vZGUgKm5vZGUsICpwYXJlbnQ7CisJY29uc3Qgc3Ry dWN0IGlvbW11X29wcyAqb3BzID0gTlVMTDsKKwl1MzIgc3RyZWFtaWQgPSAwOworCisJaWYgKGRl dl9pc19wY2koZGV2KSkgeworCQlzdHJ1Y3QgcGNpX2J1cyAqYnVzID0gdG9fcGNpX2RldihkZXYp LT5idXM7CisJCXUzMiByaWQ7CisKKwkJcGNpX2Zvcl9lYWNoX2RtYV9hbGlhcyh0b19wY2lfZGV2 KGRldiksIF9fZ2V0X3BjaV9yaWQsCisJCQkJICAgICAgICZyaWQpOworCisJCW5vZGUgPSBpb3J0 X3NjYW5fbm9kZShBQ1BJX0lPUlRfTk9ERV9QQ0lfUk9PVF9DT01QTEVYLAorCQkJCSAgICAgIGlv cnRfbWF0Y2hfbm9kZV9jYWxsYmFjaywgJmJ1cy0+ZGV2KTsKKwkJaWYgKCFub2RlKQorCQkJcmV0 dXJuIE5VTEw7CisKKwkJcGFyZW50ID0gaW9ydF9ub2RlX21hcF9yaWQobm9kZSwgcmlkLCAmc3Ry ZWFtaWQsCisJCQkJCSAgIElPUlRfSU9NTVVfVFlQRSk7CisKKwkJb3BzID0gaW9ydF9pb21tdV94 bGF0ZShkZXYsIHBhcmVudCwgc3RyZWFtaWQpOworCisJfSBlbHNlIHsKKwkJaW50IGkgPSAwOwor CisJCW5vZGUgPSBpb3J0X3NjYW5fbm9kZShBQ1BJX0lPUlRfTk9ERV9OQU1FRF9DT01QT05FTlQs CisJCQkJICAgICAgaW9ydF9tYXRjaF9ub2RlX2NhbGxiYWNrLCBkZXYpOworCQlpZiAoIW5vZGUp CisJCQlyZXR1cm4gTlVMTDsKKworCQlwYXJlbnQgPSBpb3J0X25vZGVfZ2V0X2lkKG5vZGUsICZz dHJlYW1pZCwKKwkJCQkJICBJT1JUX0lPTU1VX1RZUEUsIGkrKyk7CisKKwkJd2hpbGUgKHBhcmVu dCkgeworCQkJb3BzID0gaW9ydF9pb21tdV94bGF0ZShkZXYsIHBhcmVudCwgc3RyZWFtaWQpOwor CisJCQlwYXJlbnQgPSBpb3J0X25vZGVfZ2V0X2lkKG5vZGUsICZzdHJlYW1pZCwKKwkJCQkJCSAg SU9SVF9JT01NVV9UWVBFLCBpKyspOworCQl9CisJfQorCisJcmV0dXJuIG9wczsKK30KKworc3Rh dGljIHZvaWQgX19pbml0IGFjcGlfaW9ydF9yZWdpc3Rlcl9pcnEoaW50IGh3aXJxLCBjb25zdCBj aGFyICpuYW1lLAorCQkJCQkgIGludCB0cmlnZ2VyLAorCQkJCQkgIHN0cnVjdCByZXNvdXJjZSAq cmVzKQoreworCWludCBpcnEgPSBhY3BpX3JlZ2lzdGVyX2dzaShOVUxMLCBod2lycSwgdHJpZ2dl ciwKKwkJCQkgICAgQUNQSV9BQ1RJVkVfSElHSCk7CisKKwlpZiAoaXJxIDw9IDApIHsKKwkJcHJf ZXJyKCJjb3VsZCBub3QgcmVnaXN0ZXIgZ3NpIGh3aXJxICVkIG5hbWUgWyVzXVxuIiwgaHdpcnEs CisJCQkJCQkJCSAgICAgIG5hbWUpOworCQlyZXR1cm47CisJfQorCisJcmVzLT5zdGFydCA9IGly cTsKKwlyZXMtPmVuZCA9IGlycTsKKwlyZXMtPmZsYWdzID0gSU9SRVNPVVJDRV9JUlE7CisJcmVz LT5uYW1lID0gbmFtZTsKK30KKworc3RhdGljIGludCBfX2luaXQgYXJtX3NtbXVfdjNfY291bnRf cmVzb3VyY2VzKHN0cnVjdCBhY3BpX2lvcnRfbm9kZSAqbm9kZSkKK3sKKwlzdHJ1Y3QgYWNwaV9p b3J0X3NtbXVfdjMgKnNtbXU7CisJLyogQWx3YXlzIHByZXNlbnQgbWVtIHJlc291cmNlICovCisJ aW50IG51bV9yZXMgPSAxOworCisJLyogUmV0cmlldmUgU01NVXYzIHNwZWNpZmljIGRhdGEgKi8K KwlzbW11ID0gKHN0cnVjdCBhY3BpX2lvcnRfc21tdV92MyAqKW5vZGUtPm5vZGVfZGF0YTsKKwor CWlmIChzbW11LT5ldmVudF9nc2l2KQorCQludW1fcmVzKys7CisKKwlpZiAoc21tdS0+cHJpX2dz aXYpCisJCW51bV9yZXMrKzsKKworCWlmIChzbW11LT5nZXJyX2dzaXYpCisJCW51bV9yZXMrKzsK KworCWlmIChzbW11LT5zeW5jX2dzaXYpCisJCW51bV9yZXMrKzsKKworCXJldHVybiBudW1fcmVz OworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgYXJtX3NtbXVfdjNfaW5pdF9yZXNvdXJjZXMoc3Ry dWN0IHJlc291cmNlICpyZXMsCisJCQkJCSAgICAgIHN0cnVjdCBhY3BpX2lvcnRfbm9kZSAqbm9k ZSkKK3sKKwlzdHJ1Y3QgYWNwaV9pb3J0X3NtbXVfdjMgKnNtbXU7CisJaW50IG51bV9yZXMgPSAw OworCisJLyogUmV0cmlldmUgU01NVXYzIHNwZWNpZmljIGRhdGEgKi8KKwlzbW11ID0gKHN0cnVj dCBhY3BpX2lvcnRfc21tdV92MyAqKW5vZGUtPm5vZGVfZGF0YTsKKworCXJlc1tudW1fcmVzXS5z dGFydCA9IHNtbXUtPmJhc2VfYWRkcmVzczsKKwlyZXNbbnVtX3Jlc10uZW5kID0gc21tdS0+YmFz ZV9hZGRyZXNzICsgU1pfMTI4SyAtIDE7CisJcmVzW251bV9yZXNdLmZsYWdzID0gSU9SRVNPVVJD RV9NRU07CisKKwludW1fcmVzKys7CisKKwlpZiAoc21tdS0+ZXZlbnRfZ3NpdikKKwkJYWNwaV9p b3J0X3JlZ2lzdGVyX2lycShzbW11LT5ldmVudF9nc2l2LCAiZXZlbnRxIiwKKwkJCQkgICAgICAg QUNQSV9FREdFX1NFTlNJVElWRSwKKwkJCQkgICAgICAgJnJlc1tudW1fcmVzKytdKTsKKworCWlm IChzbW11LT5wcmlfZ3NpdikKKwkJYWNwaV9pb3J0X3JlZ2lzdGVyX2lycShzbW11LT5wcmlfZ3Np diwgInByaXEiLAorCQkJCSAgICAgICBBQ1BJX0VER0VfU0VOU0lUSVZFLAorCQkJCSAgICAgICAm cmVzW251bV9yZXMrK10pOworCisJaWYgKHNtbXUtPmdlcnJfZ3NpdikKKwkJYWNwaV9pb3J0X3Jl Z2lzdGVyX2lycShzbW11LT5nZXJyX2dzaXYsICJnZXJyb3IiLAorCQkJCSAgICAgICBBQ1BJX0VE R0VfU0VOU0lUSVZFLAorCQkJCSAgICAgICAmcmVzW251bV9yZXMrK10pOworCisJaWYgKHNtbXUt PnN5bmNfZ3NpdikKKwkJYWNwaV9pb3J0X3JlZ2lzdGVyX2lycShzbW11LT5zeW5jX2dzaXYsICJj bWRxLXN5bmMiLAorCQkJCSAgICAgICBBQ1BJX0VER0VfU0VOU0lUSVZFLAorCQkJCSAgICAgICAm cmVzW251bV9yZXMrK10pOworfQorCitzdGF0aWMgYm9vbCBfX2luaXQgYXJtX3NtbXVfdjNfaXNf Y29oZXJlbnQoc3RydWN0IGFjcGlfaW9ydF9ub2RlICpub2RlKQoreworCXN0cnVjdCBhY3BpX2lv cnRfc21tdV92MyAqc21tdTsKKworCS8qIFJldHJpZXZlIFNNTVV2MyBzcGVjaWZpYyBkYXRhICov CisJc21tdSA9IChzdHJ1Y3QgYWNwaV9pb3J0X3NtbXVfdjMgKilub2RlLT5ub2RlX2RhdGE7CisK KwlyZXR1cm4gc21tdS0+ZmxhZ3MgJiBBQ1BJX0lPUlRfU01NVV9WM19DT0hBQ0NfT1ZFUlJJREU7 Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGFybV9zbW11X2NvdW50X3Jlc291cmNlcyhzdHJ1Y3Qg YWNwaV9pb3J0X25vZGUgKm5vZGUpCit7CisJc3RydWN0IGFjcGlfaW9ydF9zbW11ICpzbW11Owor CisJLyogUmV0cmlldmUgU01NVSBzcGVjaWZpYyBkYXRhICovCisJc21tdSA9IChzdHJ1Y3QgYWNw aV9pb3J0X3NtbXUgKilub2RlLT5ub2RlX2RhdGE7CisKKwkvKgorCSAqIE9ubHkgY29uc2lkZXIg dGhlIGdsb2JhbCBmYXVsdCBpbnRlcnJ1cHQgYW5kIGlnbm9yZSB0aGUKKwkgKiBjb25maWd1cmF0 aW9uIGFjY2VzcyBpbnRlcnJ1cHQuCisJICoKKwkgKiBNTUlPIGFkZHJlc3MgYW5kIGdsb2JhbCBm YXVsdCBpbnRlcnJ1cHQgcmVzb3VyY2VzIGFyZSBhbHdheXMKKwkgKiBwcmVzZW50IHNvIGFkZCB0 aGVtIHRvIHRoZSBjb250ZXh0IGludGVycnVwdCBjb3VudCBhcyBhIHN0YXRpYworCSAqIHZhbHVl LgorCSAqLworCXJldHVybiBzbW11LT5jb250ZXh0X2ludGVycnVwdF9jb3VudCArIDI7Cit9CisK K3N0YXRpYyB2b2lkIF9faW5pdCBhcm1fc21tdV9pbml0X3Jlc291cmNlcyhzdHJ1Y3QgcmVzb3Vy Y2UgKnJlcywKKwkJCQkJICAgc3RydWN0IGFjcGlfaW9ydF9ub2RlICpub2RlKQoreworCXN0cnVj dCBhY3BpX2lvcnRfc21tdSAqc21tdTsKKwlpbnQgaSwgaHdfaXJxLCB0cmlnZ2VyLCBudW1fcmVz ID0gMDsKKwl1NjQgKmN0eF9pcnEsICpnbGJfaXJxOworCisJLyogUmV0cmlldmUgU01NVSBzcGVj aWZpYyBkYXRhICovCisJc21tdSA9IChzdHJ1Y3QgYWNwaV9pb3J0X3NtbXUgKilub2RlLT5ub2Rl X2RhdGE7CisKKwlyZXNbbnVtX3Jlc10uc3RhcnQgPSBzbW11LT5iYXNlX2FkZHJlc3M7CisJcmVz W251bV9yZXNdLmVuZCA9IHNtbXUtPmJhc2VfYWRkcmVzcyArIHNtbXUtPnNwYW4gLSAxOworCXJl c1tudW1fcmVzXS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNOworCW51bV9yZXMrKzsKKworCWdsYl9p cnEgPSBBQ1BJX0FERF9QVFIodTY0LCBub2RlLCBzbW11LT5nbG9iYWxfaW50ZXJydXB0X29mZnNl dCk7CisJLyogR2xvYmFsIElSUXMgKi8KKwlod19pcnEgPSBJT1JUX0lSUV9NQVNLKGdsYl9pcnFb MF0pOworCXRyaWdnZXIgPSBJT1JUX0lSUV9UUklHR0VSX01BU0soZ2xiX2lycVswXSk7CisKKwlh Y3BpX2lvcnRfcmVnaXN0ZXJfaXJxKGh3X2lycSwgImFybS1zbW11LWdsb2JhbCIsIHRyaWdnZXIs CisJCQkJICAgICAmcmVzW251bV9yZXMrK10pOworCisJLyogQ29udGV4dCBJUlFzICovCisJY3R4 X2lycSA9IEFDUElfQUREX1BUUih1NjQsIG5vZGUsIHNtbXUtPmNvbnRleHRfaW50ZXJydXB0X29m ZnNldCk7CisJZm9yIChpID0gMDsgaSA8IHNtbXUtPmNvbnRleHRfaW50ZXJydXB0X2NvdW50OyBp KyspIHsKKwkJaHdfaXJxID0gSU9SVF9JUlFfTUFTSyhjdHhfaXJxW2ldKTsKKwkJdHJpZ2dlciA9 IElPUlRfSVJRX1RSSUdHRVJfTUFTSyhjdHhfaXJxW2ldKTsKKworCQlhY3BpX2lvcnRfcmVnaXN0 ZXJfaXJxKGh3X2lycSwgImFybS1zbW11LWNvbnRleHQiLCB0cmlnZ2VyLAorCQkJCSAgICAgICAm cmVzW251bV9yZXMrK10pOworCX0KK30KKworc3RhdGljIGJvb2wgX19pbml0IGFybV9zbW11X2lz X2NvaGVyZW50KHN0cnVjdCBhY3BpX2lvcnRfbm9kZSAqbm9kZSkKK3sKKwlzdHJ1Y3QgYWNwaV9p b3J0X3NtbXUgKnNtbXU7CisKKwkvKiBSZXRyaWV2ZSBTTU1VIHNwZWNpZmljIGRhdGEgKi8KKwlz bW11ID0gKHN0cnVjdCBhY3BpX2lvcnRfc21tdSAqKW5vZGUtPm5vZGVfZGF0YTsKKworCXJldHVy biBzbW11LT5mbGFncyAmIEFDUElfSU9SVF9TTU1VX0NPSEVSRU5UX1dBTEs7Cit9CisKK3N0cnVj dCBpb3J0X2lvbW11X2NvbmZpZyB7CisJY29uc3QgY2hhciAqbmFtZTsKKwlpbnQgKCppb21tdV9p bml0KShzdHJ1Y3QgYWNwaV9pb3J0X25vZGUgKm5vZGUpOworCWJvb2wgKCppb21tdV9pc19jb2hl cmVudCkoc3RydWN0IGFjcGlfaW9ydF9ub2RlICpub2RlKTsKKwlpbnQgKCppb21tdV9jb3VudF9y ZXNvdXJjZXMpKHN0cnVjdCBhY3BpX2lvcnRfbm9kZSAqbm9kZSk7CisJdm9pZCAoKmlvbW11X2lu aXRfcmVzb3VyY2VzKShzdHJ1Y3QgcmVzb3VyY2UgKnJlcywKKwkJCQkgICAgIHN0cnVjdCBhY3Bp X2lvcnRfbm9kZSAqbm9kZSk7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGlvcnRfaW9tbXVf Y29uZmlnIGlvcnRfYXJtX3NtbXVfdjNfY2ZnIF9faW5pdGNvbnN0ID0geworCS5uYW1lID0gImFy bS1zbW11LXYzIiwKKwkuaW9tbXVfaXNfY29oZXJlbnQgPSBhcm1fc21tdV92M19pc19jb2hlcmVu dCwKKwkuaW9tbXVfY291bnRfcmVzb3VyY2VzID0gYXJtX3NtbXVfdjNfY291bnRfcmVzb3VyY2Vz LAorCS5pb21tdV9pbml0X3Jlc291cmNlcyA9IGFybV9zbW11X3YzX2luaXRfcmVzb3VyY2VzCit9 OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGlvcnRfaW9tbXVfY29uZmlnIGlvcnRfYXJtX3NtbXVf Y2ZnIF9faW5pdGNvbnN0ID0geworCS5uYW1lID0gImFybS1zbW11IiwKKwkuaW9tbXVfaXNfY29o ZXJlbnQgPSBhcm1fc21tdV9pc19jb2hlcmVudCwKKwkuaW9tbXVfY291bnRfcmVzb3VyY2VzID0g YXJtX3NtbXVfY291bnRfcmVzb3VyY2VzLAorCS5pb21tdV9pbml0X3Jlc291cmNlcyA9IGFybV9z bW11X2luaXRfcmVzb3VyY2VzCit9OworCitzdGF0aWMgX19pbml0Citjb25zdCBzdHJ1Y3QgaW9y dF9pb21tdV9jb25maWcgKmlvcnRfZ2V0X2lvbW11X2NmZyhzdHJ1Y3QgYWNwaV9pb3J0X25vZGUg Km5vZGUpCit7CisJc3dpdGNoIChub2RlLT50eXBlKSB7CisJY2FzZSBBQ1BJX0lPUlRfTk9ERV9T TU1VX1YzOgorCQlyZXR1cm4gJmlvcnRfYXJtX3NtbXVfdjNfY2ZnOworCWNhc2UgQUNQSV9JT1JU X05PREVfU01NVToKKwkJcmV0dXJuICZpb3J0X2FybV9zbW11X2NmZzsKKwlkZWZhdWx0OgorCQly ZXR1cm4gTlVMTDsKKwl9Cit9CisKKy8qKgorICogaW9ydF9hZGRfc21tdV9wbGF0Zm9ybV9kZXZp Y2UoKSAtIEFsbG9jYXRlIGEgcGxhdGZvcm0gZGV2aWNlIGZvciBTTU1VCisgKiBAbm9kZTogUG9p bnRlciB0byBTTU1VIEFDUEkgSU9SVCBub2RlCisgKgorICogUmV0dXJuczogMCBvbiBzdWNjZXNz LCA8MCBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGlvcnRfYWRkX3NtbXVfcGxhdGZv cm1fZGV2aWNlKHN0cnVjdCBhY3BpX2lvcnRfbm9kZSAqbm9kZSkKK3sKKwlzdHJ1Y3QgZndub2Rl X2hhbmRsZSAqZndub2RlOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CisJc3RydWN0 IHJlc291cmNlICpyOworCWVudW0gZGV2X2RtYV9hdHRyIGF0dHI7CisJaW50IHJldCwgY291bnQ7 CisJY29uc3Qgc3RydWN0IGlvcnRfaW9tbXVfY29uZmlnICpvcHMgPSBpb3J0X2dldF9pb21tdV9j Zmcobm9kZSk7CisKKwlpZiAoIW9wcykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlwZGV2ID0gcGxh dGZvcm1fZGV2aWNlX2FsbG9jKG9wcy0+bmFtZSwgUExBVEZPUk1fREVWSURfQVVUTyk7CisJaWYg KCFwZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWNvdW50ID0gb3BzLT5pb21tdV9jb3VudF9y ZXNvdXJjZXMobm9kZSk7CisKKwlyID0ga2NhbGxvYyhjb3VudCwgc2l6ZW9mKCpyKSwgR0ZQX0tF Uk5FTCk7CisJaWYgKCFyKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZGV2X3B1dDsKKwl9 CisKKwlvcHMtPmlvbW11X2luaXRfcmVzb3VyY2VzKHIsIG5vZGUpOworCisJcmV0ID0gcGxhdGZv cm1fZGV2aWNlX2FkZF9yZXNvdXJjZXMocGRldiwgciwgY291bnQpOworCS8qCisJICogUmVzb3Vy Y2VzIGFyZSBkdXBsaWNhdGVkIGluIHBsYXRmb3JtX2RldmljZV9hZGRfcmVzb3VyY2VzLAorCSAq IGZyZWUgdGhlaXIgYWxsb2NhdGVkIG1lbW9yeQorCSAqLworCWtmcmVlKHIpOworCisJaWYgKHJl dCkKKwkJZ290byBkZXZfcHV0OworCisJLyoKKwkgKiBBZGQgYSBjb3B5IG9mIElPUlQgbm9kZSBw b2ludGVyIHRvIHBsYXRmb3JtX2RhdGEgdG8KKwkgKiBiZSB1c2VkIHRvIHJldHJpZXZlIElPUlQg ZGF0YSBpbmZvcm1hdGlvbi4KKwkgKi8KKwlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkX2RhdGEo cGRldiwgJm5vZGUsIHNpemVvZihub2RlKSk7CisJaWYgKHJldCkKKwkJZ290byBkZXZfcHV0Owor CisJLyoKKwkgKiBXZSBleHBlY3QgdGhlIGRtYSBtYXNrcyB0byBiZSBlcXVpdmFsZW50IGZvcgor CSAqIGFsbCBTTU1VcyBzZXQtdXBzCisJICovCisJcGRldi0+ZGV2LmRtYV9tYXNrID0gJnBkZXYt PmRldi5jb2hlcmVudF9kbWFfbWFzazsKKworCWZ3bm9kZSA9IGlvcnRfZ2V0X2Z3bm9kZShub2Rl KTsKKworCWlmICghZndub2RlKSB7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gZGV2X3B1dDsK Kwl9CisKKwlwZGV2LT5kZXYuZndub2RlID0gZndub2RlOworCisJYXR0ciA9IG9wcy0+aW9tbXVf aXNfY29oZXJlbnQobm9kZSkgPworCQkJICAgICBERVZfRE1BX0NPSEVSRU5UIDogREVWX0RNQV9O T05fQ09IRVJFTlQ7CisKKwkvKiBDb25maWd1cmUgRE1BIGZvciB0aGUgcGFnZSB0YWJsZSB3YWxr ZXIgKi8KKwlhY3BpX2RtYV9jb25maWd1cmUoJnBkZXYtPmRldiwgYXR0cik7CisKKwlyZXQgPSBw bGF0Zm9ybV9kZXZpY2VfYWRkKHBkZXYpOworCWlmIChyZXQpCisJCWdvdG8gZG1hX2RlY29uZmln dXJlOworCisJcmV0dXJuIDA7CisKK2RtYV9kZWNvbmZpZ3VyZToKKwlhY3BpX2RtYV9kZWNvbmZp Z3VyZSgmcGRldi0+ZGV2KTsKK2Rldl9wdXQ6CisJcGxhdGZvcm1fZGV2aWNlX3B1dChwZGV2KTsK KworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBpb3J0X2luaXRfcGxhdGZv cm1fZGV2aWNlcyh2b2lkKQoreworCXN0cnVjdCBhY3BpX2lvcnRfbm9kZSAqaW9ydF9ub2RlLCAq aW9ydF9lbmQ7CisJc3RydWN0IGFjcGlfdGFibGVfaW9ydCAqaW9ydDsKKwlzdHJ1Y3QgZndub2Rl X2hhbmRsZSAqZndub2RlOworCWludCBpLCByZXQ7CisKKwkvKgorCSAqIGlvcnRfdGFibGUgYW5k IGlvcnQgYm90aCBwb2ludCB0byB0aGUgc3RhcnQgb2YgSU9SVCB0YWJsZSwgYnV0CisJICogaGF2 ZSBkaWZmZXJlbnQgc3RydWN0IHR5cGVzCisJICovCisJaW9ydCA9IChzdHJ1Y3QgYWNwaV90YWJs ZV9pb3J0ICopaW9ydF90YWJsZTsKKworCS8qIEdldCB0aGUgZmlyc3QgSU9SVCBub2RlICovCisJ aW9ydF9ub2RlID0gQUNQSV9BRERfUFRSKHN0cnVjdCBhY3BpX2lvcnRfbm9kZSwgaW9ydCwKKwkJ CQkgaW9ydC0+bm9kZV9vZmZzZXQpOworCWlvcnRfZW5kID0gQUNQSV9BRERfUFRSKHN0cnVjdCBh Y3BpX2lvcnRfbm9kZSwgaW9ydCwKKwkJCQlpb3J0X3RhYmxlLT5sZW5ndGgpOworCisJZm9yIChp ID0gMDsgaSA8IGlvcnQtPm5vZGVfY291bnQ7IGkrKykgeworCQlpZiAoaW9ydF9ub2RlID49IGlv cnRfZW5kKSB7CisJCQlwcl9lcnIoImlvcnQgbm9kZSBwb2ludGVyIG92ZXJmbG93cywgYmFkIHRh YmxlXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCisJCWlmICgoaW9ydF9ub2RlLT50eXBlID09IEFD UElfSU9SVF9OT0RFX1NNTVUpIHx8CisJCQkoaW9ydF9ub2RlLT50eXBlID09IEFDUElfSU9SVF9O T0RFX1NNTVVfVjMpKSB7CisKKwkJCWZ3bm9kZSA9IGFjcGlfYWxsb2NfZndub2RlX3N0YXRpYygp OworCQkJaWYgKCFmd25vZGUpCisJCQkJcmV0dXJuOworCisJCQlpb3J0X3NldF9md25vZGUoaW9y dF9ub2RlLCBmd25vZGUpOworCisJCQlyZXQgPSBpb3J0X2FkZF9zbW11X3BsYXRmb3JtX2Rldmlj ZShpb3J0X25vZGUpOworCQkJaWYgKHJldCkgeworCQkJCWlvcnRfZGVsZXRlX2Z3bm9kZShpb3J0 X25vZGUpOworCQkJCWFjcGlfZnJlZV9md25vZGVfc3RhdGljKGZ3bm9kZSk7CisJCQkJcmV0dXJu OworCQkJfQorCQl9CisKKwkJaW9ydF9ub2RlID0gQUNQSV9BRERfUFRSKHN0cnVjdCBhY3BpX2lv cnRfbm9kZSwgaW9ydF9ub2RlLAorCQkJCQkgaW9ydF9ub2RlLT5sZW5ndGgpOworCX0KK30KKwor dm9pZCBfX2luaXQgYWNwaV9pb3J0X2luaXQodm9pZCkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7 CisKKwlzdGF0dXMgPSBhY3BpX2dldF90YWJsZShBQ1BJX1NJR19JT1JULCAwLCAmaW9ydF90YWJs ZSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCWlmIChzdGF0dXMgIT0gQUVfTk9U X0ZPVU5EKSB7CisJCQljb25zdCBjaGFyICptc2cgPSBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3Rh dHVzKTsKKworCQkJcHJfZXJyKCJGYWlsZWQgdG8gZ2V0IHRhYmxlLCAlc1xuIiwgbXNnKTsKKwkJ fQorCisJCXJldHVybjsKKwl9CisKKwlpb3J0X2luaXRfcGxhdGZvcm1fZGV2aWNlcygpOworCisJ YWNwaV9wcm9iZV9kZXZpY2VfdGFibGUoaW9ydCk7Cit9CmRpZmYgLS1naXQgYS94ZW4vaW5jbHVk ZS9hY3BpL2FjcGlfaW9ydC5oIGIveGVuL2luY2x1ZGUvYWNwaS9hY3BpX2lvcnQuaApuZXcgZmls ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2UwODA5Ci0tLSAvZGV2L251bGwKKysrIGIv eGVuL2luY2x1ZGUvYWNwaS9hY3BpX2lvcnQuaApAQCAtMCwwICsxLDU4IEBACisvKgorICogQ29w eXJpZ2h0IChDKSAyMDE2LCBTZW1paGFsZgorICoJQXV0aG9yOiBUb21hc3ogTm93aWNraSA8dG5A c2VtaWhhbGYuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3Ug Y2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMg YW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVy c2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAq CisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1 c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1w bGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFS VElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IK KyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5 IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHBy b2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5j LiwgNTkgVGVtcGxlCisgKiBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3 IFVTQS4KKyAqLworCisjaWZuZGVmIF9fQUNQSV9JT1JUX0hfXworI2RlZmluZSBfX0FDUElfSU9S VF9IX18KKworI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9md25vZGUu aD4KKyNpbmNsdWRlIDxsaW51eC9pcnFkb21haW4uaD4KKworI2RlZmluZSBJT1JUX0lSUV9NQVNL KGlycSkJCShpcnEgJiAweGZmZmZmZmZmVUxMKQorI2RlZmluZSBJT1JUX0lSUV9UUklHR0VSX01B U0soaXJxKQkoKGlycSA+PiAzMikgJiAweGZmZmZmZmZmVUxMKQorCitpbnQgaW9ydF9yZWdpc3Rl cl9kb21haW5fdG9rZW4oaW50IHRyYW5zX2lkLCBzdHJ1Y3QgZndub2RlX2hhbmRsZSAqZndfbm9k ZSk7Cit2b2lkIGlvcnRfZGVyZWdpc3Rlcl9kb21haW5fdG9rZW4oaW50IHRyYW5zX2lkKTsKK3N0 cnVjdCBmd25vZGVfaGFuZGxlICppb3J0X2ZpbmRfZG9tYWluX3Rva2VuKGludCB0cmFuc19pZCk7 CisjaWZkZWYgQ09ORklHX0FDUElfSU9SVAordm9pZCBhY3BpX2lvcnRfaW5pdCh2b2lkKTsKK2Jv b2wgaW9ydF9ub2RlX21hdGNoKHU4IHR5cGUpOwordTMyIGlvcnRfbXNpX21hcF9yaWQoc3RydWN0 IGRldmljZSAqZGV2LCB1MzIgcmVxX2lkKTsKK3N0cnVjdCBpcnFfZG9tYWluICppb3J0X2dldF9k ZXZpY2VfZG9tYWluKHN0cnVjdCBkZXZpY2UgKmRldiwgdTMyIHJlcV9pZCk7CisvKiBJT01NVSBp bnRlcmZhY2UgKi8KK3ZvaWQgaW9ydF9zZXRfZG1hX21hc2soc3RydWN0IGRldmljZSAqZGV2KTsK K2NvbnN0IHN0cnVjdCBpb21tdV9vcHMgKmlvcnRfaW9tbXVfY29uZmlndXJlKHN0cnVjdCBkZXZp Y2UgKmRldik7CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIGFjcGlfaW9ydF9pbml0KHZvaWQp IHsgfQorc3RhdGljIGlubGluZSBib29sIGlvcnRfbm9kZV9tYXRjaCh1OCB0eXBlKSB7IHJldHVy biBmYWxzZTsgfQorc3RhdGljIGlubGluZSB1MzIgaW9ydF9tc2lfbWFwX3JpZChzdHJ1Y3QgZGV2 aWNlICpkZXYsIHUzMiByZXFfaWQpCit7IHJldHVybiByZXFfaWQ7IH0KK3N0YXRpYyBpbmxpbmUg c3RydWN0IGlycV9kb21haW4gKmlvcnRfZ2V0X2RldmljZV9kb21haW4oc3RydWN0IGRldmljZSAq ZGV2LAorCQkJCQkJCXUzMiByZXFfaWQpCit7IHJldHVybiBOVUxMOyB9CisvKiBJT01NVSBpbnRl cmZhY2UgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBpb3J0X3NldF9kbWFfbWFzayhzdHJ1Y3QgZGV2 aWNlICpkZXYpIHsgfQorc3RhdGljIGlubGluZQorY29uc3Qgc3RydWN0IGlvbW11X29wcyAqaW9y dF9pb21tdV9jb25maWd1cmUoc3RydWN0IGRldmljZSAqZGV2KQoreyByZXR1cm4gTlVMTDsgfQor I2VuZGlmCisKKyNkZWZpbmUgSU9SVF9BQ1BJX0RFQ0xBUkUobmFtZSwgdGFibGVfaWQsIGZuKQkJ XAorCUFDUElfREVDTEFSRV9QUk9CRV9FTlRSWShpb3J0LCBuYW1lLCB0YWJsZV9pZCwgMCwgTlVM TCwgMCwgZm4pCisKKyNlbmRpZiAvKiBfX0FDUElfSU9SVF9IX18gKi8KLS0gClF1YWxjb21tIERh dGFjZW50ZXIgVGVjaG5vbG9naWVzIGFzIGFuIGFmZmlsaWF0ZSBvZiBRdWFsY29tbSBUZWNobm9s b2dpZXMsIEluYy4gUXVhbGNvbW0gVGVjaG5vbG9naWVzLCBJbmMuIGlzIGEgbWVtYmVyIG9mIHRo ZSBDb2RlIEF1cm9yYSBGb3J1bSwgYSBMaW51eCBGb3VuZGF0aW9uIENvbGxhYm9yYXRpdmUgUHJv amVjdC4KCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpY ZW4tZGV2ZWwgbWFpbGluZyBsaXN0Clhlbi1kZXZlbEBsaXN0cy54ZW4ub3JnCmh0dHBzOi8vbGlz dHMueGVuLm9yZy94ZW4tZGV2ZWwK