From mboxrd@z Thu Jan 1 00:00:00 1970 From: Sameer Goel Subject: [RFC 5/6] ACPI: arm: Support for IORT Date: Thu, 8 Jun 2017 13:30:46 -0600 Message-ID: <1496950247-8755-6-git-send-email-sgoel@codeaurora.org> References: <1496950247-8755-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 1dJ39L-00015o-Oz for xen-devel@lists.xenproject.org; Thu, 08 Jun 2017 19:31:19 +0000 In-Reply-To: <1496950247-8755-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 Cc: Stefano Stabellini , Tomasz Nowicki , Punit Agrawal , Sameer Goel , Robin Murphy , Shanker Donthineni List-Id: xen-devel@lists.xenproject.org VmVyYmF0aW0gZmlsZXMgZnJvbSBMaW51eCBrZXJuZWwuCmlvcnQuYzogY29tbWl0IGNhNzhkMzE3 M2NmZjpNZXJnZSB0YWcgJ2FybTY0LXVwc3RyZWFtJwphY3BpX2lvcnQuaDogY29tbWl0IDE4Yjcw OWJlYjUwMzpBQ1BJL0lPUlQ6IE1ha2UgZG1hIG1hc2tzIHNldC11cCBJT1JUCnNwZWNpZmljCgpT aWduZWQtb2ZmLWJ5OiBTYW1lZXIgR29lbCA8c2dvZWxAY29kZWF1cm9yYS5vcmc+Ci0tLQogeGVu L2RyaXZlcnMvYWNwaS9hcm0vaW9ydC5jICB8IDk2MSArKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrCiB4ZW4vaW5jbHVkZS9hY3BpL2FjcGlfaW9ydC5oIHwgIDU4ICsr KwogMiBmaWxlcyBjaGFuZ2VkLCAxMDE5IGluc2VydGlvbnMoKykKIGNyZWF0ZSBtb2RlIDEwMDY0 NCB4ZW4vZHJpdmVycy9hY3BpL2FybS9pb3J0LmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCB4ZW4vaW5j bHVkZS9hY3BpL2FjcGlfaW9ydC5oCgpkaWZmIC0tZ2l0IGEveGVuL2RyaXZlcnMvYWNwaS9hcm0v aW9ydC5jIGIveGVuL2RyaXZlcnMvYWNwaS9hcm0vaW9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0 CmluZGV4IDAwMDAwMDAuLjRhNWJiOTYKLS0tIC9kZXYvbnVsbAorKysgYi94ZW4vZHJpdmVycy9h Y3BpL2FybS9pb3J0LmMKQEAgLTAsMCArMSw5NjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw MTYsIFNlbWloYWxmCisgKglBdXRob3I6IFRvbWFzeiBOb3dpY2tpIDx0bkBzZW1paGFsZi5jb20+ CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmli dXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9u cyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1 Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJv Z3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJ VEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5 IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBP U0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRh aWxzLgorICoKKyAqIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGVhcmx5IGRldGVjdGlvbi9wYXJzaW5n IG9mIEkvTyBtYXBwaW5nCisgKiByZXBvcnRlZCB0byBPUyB0aHJvdWdoIGZpcm13YXJlIHZpYSBJ L08gUmVtYXBwaW5nIFRhYmxlIChJT1JUKQorICogSU9SVCBkb2N1bWVudCBudW1iZXI6IEFSTSBE RU4gMDA0OUEKKyAqLworCisjZGVmaW5lIHByX2ZtdChmbXQpCSJBQ1BJOiBJT1JUOiAiIGZtdAor CisjaW5jbHVkZSA8bGludXgvYWNwaV9pb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9tbXUuaD4K KyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5j bHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Cisj aW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjZGVmaW5lIElPUlRfVFlQRV9NQVNLKHR5cGUpCSgx IDw8ICh0eXBlKSkKKyNkZWZpbmUgSU9SVF9NU0lfVFlQRQkJKDEgPDwgQUNQSV9JT1JUX05PREVf SVRTX0dST1VQKQorI2RlZmluZSBJT1JUX0lPTU1VX1RZUEUJCSgoMSA8PCBBQ1BJX0lPUlRfTk9E RV9TTU1VKSB8CVwKKwkJCQkoMSA8PCBBQ1BJX0lPUlRfTk9ERV9TTU1VX1YzKSkKKworc3RydWN0 IGlvcnRfaXRzX21zaV9jaGlwIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7CisJc3RydWN0IGZ3 bm9kZV9oYW5kbGUJKmZ3X25vZGU7CisJdTMyCQkJdHJhbnNsYXRpb25faWQ7Cit9OworCitzdHJ1 Y3QgaW9ydF9md25vZGUgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3QgYWNwaV9p b3J0X25vZGUgKmlvcnRfbm9kZTsKKwlzdHJ1Y3QgZndub2RlX2hhbmRsZSAqZndub2RlOworfTsK K3N0YXRpYyBMSVNUX0hFQUQoaW9ydF9md25vZGVfbGlzdCk7CitzdGF0aWMgREVGSU5FX1NQSU5M T0NLKGlvcnRfZndub2RlX2xvY2spOworCisvKioKKyAqIGlvcnRfc2V0X2Z3bm9kZSgpIC0gQ3Jl YXRlIGlvcnRfZndub2RlIGFuZCB1c2UgaXQgdG8gcmVnaXN0ZXIKKyAqCQkgICAgICAgaW9tbXUg ZGF0YSBpbiB0aGUgaW9ydF9md25vZGVfbGlzdAorICoKKyAqIEBub2RlOiBJT1JUIHRhYmxlIG5v ZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBJT01NVQorICogQGZ3bm9kZTogZndub2RlIGFzc29jaWF0 ZWQgd2l0aCB0aGUgSU9SVCBub2RlCisgKgorICogUmV0dXJuczogMCBvbiBzdWNjZXNzCisgKiAg ICAgICAgICA8MCBvbiBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGlvcnRfc2V0X2Z3 bm9kZShzdHJ1Y3QgYWNwaV9pb3J0X25vZGUgKmlvcnRfbm9kZSwKKwkJCQkgIHN0cnVjdCBmd25v ZGVfaGFuZGxlICpmd25vZGUpCit7CisJc3RydWN0IGlvcnRfZndub2RlICpucDsKKworCW5wID0g a3phbGxvYyhzaXplb2Yoc3RydWN0IGlvcnRfZndub2RlKSwgR0ZQX0FUT01JQyk7CisKKwlpZiAo V0FSTl9PTighbnApKQorCQlyZXR1cm4gLUVOT01FTTsKKworCUlOSVRfTElTVF9IRUFEKCZucC0+ bGlzdCk7CisJbnAtPmlvcnRfbm9kZSA9IGlvcnRfbm9kZTsKKwlucC0+Zndub2RlID0gZndub2Rl OworCisJc3Bpbl9sb2NrKCZpb3J0X2Z3bm9kZV9sb2NrKTsKKwlsaXN0X2FkZF90YWlsKCZucC0+ bGlzdCwgJmlvcnRfZndub2RlX2xpc3QpOworCXNwaW5fdW5sb2NrKCZpb3J0X2Z3bm9kZV9sb2Nr KTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGlvcnRfZ2V0X2Z3bm9kZSgpIC0gUmV0cmll dmUgZndub2RlIGFzc29jaWF0ZWQgd2l0aCBhbiBJT1JUIG5vZGUKKyAqCisgKiBAbm9kZTogSU9S VCB0YWJsZSBub2RlIHRvIGJlIGxvb2tlZC11cAorICoKKyAqIFJldHVybnM6IGZ3bm9kZV9oYW5k bGUgcG9pbnRlciBvbiBzdWNjZXNzLCBOVUxMIG9uIGZhaWx1cmUKKyAqLworc3RhdGljIGlubGlu ZQorc3RydWN0IGZ3bm9kZV9oYW5kbGUgKmlvcnRfZ2V0X2Z3bm9kZShzdHJ1Y3QgYWNwaV9pb3J0 X25vZGUgKm5vZGUpCit7CisJc3RydWN0IGlvcnRfZndub2RlICpjdXJyOworCXN0cnVjdCBmd25v ZGVfaGFuZGxlICpmd25vZGUgPSBOVUxMOworCisJc3Bpbl9sb2NrKCZpb3J0X2Z3bm9kZV9sb2Nr KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGN1cnIsICZpb3J0X2Z3bm9kZV9saXN0LCBsaXN0KSB7 CisJCWlmIChjdXJyLT5pb3J0X25vZGUgPT0gbm9kZSkgeworCQkJZndub2RlID0gY3Vyci0+Zndu b2RlOworCQkJYnJlYWs7CisJCX0KKwl9CisJc3Bpbl91bmxvY2soJmlvcnRfZndub2RlX2xvY2sp OworCisJcmV0dXJuIGZ3bm9kZTsKK30KKworLyoqCisgKiBpb3J0X2RlbGV0ZV9md25vZGUoKSAt IERlbGV0ZSBmd25vZGUgYXNzb2NpYXRlZCB3aXRoIGFuIElPUlQgbm9kZQorICoKKyAqIEBub2Rl OiBJT1JUIHRhYmxlIG5vZGUgYXNzb2NpYXRlZCB3aXRoIGZ3bm9kZSB0byBkZWxldGUKKyAqLwor c3RhdGljIGlubGluZSB2b2lkIGlvcnRfZGVsZXRlX2Z3bm9kZShzdHJ1Y3QgYWNwaV9pb3J0X25v ZGUgKm5vZGUpCit7CisJc3RydWN0IGlvcnRfZndub2RlICpjdXJyLCAqdG1wOworCisJc3Bpbl9s b2NrKCZpb3J0X2Z3bm9kZV9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoY3Vyciwg dG1wLCAmaW9ydF9md25vZGVfbGlzdCwgbGlzdCkgeworCQlpZiAoY3Vyci0+aW9ydF9ub2RlID09 IG5vZGUpIHsKKwkJCWxpc3RfZGVsKCZjdXJyLT5saXN0KTsKKwkJCWtmcmVlKGN1cnIpOworCQkJ YnJlYWs7CisJCX0KKwl9CisJc3Bpbl91bmxvY2soJmlvcnRfZndub2RlX2xvY2spOworfQorCit0 eXBlZGVmIGFjcGlfc3RhdHVzICgqaW9ydF9maW5kX25vZGVfY2FsbGJhY2spCisJKHN0cnVjdCBh Y3BpX2lvcnRfbm9kZSAqbm9kZSwgdm9pZCAqY29udGV4dCk7CisKKy8qIFJvb3QgcG9pbnRlciB0 byB0aGUgbWFwcGVkIElPUlQgdGFibGUgKi8KK3N0YXRpYyBzdHJ1Y3QgYWNwaV90YWJsZV9oZWFk ZXIgKmlvcnRfdGFibGU7CisKK3N0YXRpYyBMSVNUX0hFQUQoaW9ydF9tc2lfY2hpcF9saXN0KTsK K3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soaW9ydF9tc2lfY2hpcF9sb2NrKTsKKworLyoqCisgKiBp b3J0X3JlZ2lzdGVyX2RvbWFpbl90b2tlbigpIC0gcmVnaXN0ZXIgZG9tYWluIHRva2VuIGFuZCBy ZWxhdGVkIElUUyBJRAorICogdG8gdGhlIGxpc3QgZnJvbSB3aGVyZSB3ZSBjYW4gZ2V0IGl0IGJh Y2sgbGF0ZXIgb24uCisgKiBAdHJhbnNfaWQ6IElUUyBJRC4KKyAqIEBmd19ub2RlOiBEb21haW4g dG9rZW4uCisgKgorICogUmV0dXJuczogMCBvbiBzdWNjZXNzLCAtRU5PTUVNIGlmIG5vIG1lbW9y eSB3aGVuIGFsbG9jYXRpbmcgbGlzdCBlbGVtZW50CisgKi8KK2ludCBpb3J0X3JlZ2lzdGVyX2Rv bWFpbl90b2tlbihpbnQgdHJhbnNfaWQsIHN0cnVjdCBmd25vZGVfaGFuZGxlICpmd19ub2RlKQor eworCXN0cnVjdCBpb3J0X2l0c19tc2lfY2hpcCAqaXRzX21zaV9jaGlwOworCisJaXRzX21zaV9j aGlwID0ga3phbGxvYyhzaXplb2YoKml0c19tc2lfY2hpcCksIEdGUF9LRVJORUwpOworCWlmICgh aXRzX21zaV9jaGlwKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWl0c19tc2lfY2hpcC0+Zndfbm9k ZSA9IGZ3X25vZGU7CisJaXRzX21zaV9jaGlwLT50cmFuc2xhdGlvbl9pZCA9IHRyYW5zX2lkOwor CisJc3Bpbl9sb2NrKCZpb3J0X21zaV9jaGlwX2xvY2spOworCWxpc3RfYWRkKCZpdHNfbXNpX2No aXAtPmxpc3QsICZpb3J0X21zaV9jaGlwX2xpc3QpOworCXNwaW5fdW5sb2NrKCZpb3J0X21zaV9j aGlwX2xvY2spOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaW9ydF9kZXJlZ2lzdGVyX2Rv bWFpbl90b2tlbigpIC0gRGVyZWdpc3RlciBkb21haW4gdG9rZW4gYmFzZWQgb24gSVRTIElECisg KiBAdHJhbnNfaWQ6IElUUyBJRC4KKyAqCisgKiBSZXR1cm5zOiBub25lLgorICovCit2b2lkIGlv cnRfZGVyZWdpc3Rlcl9kb21haW5fdG9rZW4oaW50IHRyYW5zX2lkKQoreworCXN0cnVjdCBpb3J0 X2l0c19tc2lfY2hpcCAqaXRzX21zaV9jaGlwLCAqdDsKKworCXNwaW5fbG9jaygmaW9ydF9tc2lf Y2hpcF9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoaXRzX21zaV9jaGlwLCB0LCAm aW9ydF9tc2lfY2hpcF9saXN0LCBsaXN0KSB7CisJCWlmIChpdHNfbXNpX2NoaXAtPnRyYW5zbGF0 aW9uX2lkID09IHRyYW5zX2lkKSB7CisJCQlsaXN0X2RlbCgmaXRzX21zaV9jaGlwLT5saXN0KTsK KwkJCWtmcmVlKGl0c19tc2lfY2hpcCk7CisJCQlicmVhazsKKwkJfQorCX0KKwlzcGluX3VubG9j aygmaW9ydF9tc2lfY2hpcF9sb2NrKTsKK30KKworLyoqCisgKiBpb3J0X2ZpbmRfZG9tYWluX3Rv a2VuKCkgLSBGaW5kIGRvbWFpbiB0b2tlbiBiYXNlZCBvbiBnaXZlbiBJVFMgSUQKKyAqIEB0cmFu c19pZDogSVRTIElELgorICoKKyAqIFJldHVybnM6IGRvbWFpbiB0b2tlbiB3aGVuIGZpbmQgb24g dGhlIGxpc3QsIE5VTEwgb3RoZXJ3aXNlCisgKi8KK3N0cnVjdCBmd25vZGVfaGFuZGxlICppb3J0 X2ZpbmRfZG9tYWluX3Rva2VuKGludCB0cmFuc19pZCkKK3sKKwlzdHJ1Y3QgZndub2RlX2hhbmRs ZSAqZndfbm9kZSA9IE5VTEw7CisJc3RydWN0IGlvcnRfaXRzX21zaV9jaGlwICppdHNfbXNpX2No aXA7CisKKwlzcGluX2xvY2soJmlvcnRfbXNpX2NoaXBfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9l bnRyeShpdHNfbXNpX2NoaXAsICZpb3J0X21zaV9jaGlwX2xpc3QsIGxpc3QpIHsKKwkJaWYgKGl0 c19tc2lfY2hpcC0+dHJhbnNsYXRpb25faWQgPT0gdHJhbnNfaWQpIHsKKwkJCWZ3X25vZGUgPSBp dHNfbXNpX2NoaXAtPmZ3X25vZGU7CisJCQlicmVhazsKKwkJfQorCX0KKwlzcGluX3VubG9jaygm aW9ydF9tc2lfY2hpcF9sb2NrKTsKKworCXJldHVybiBmd19ub2RlOworfQorCitzdGF0aWMgc3Ry dWN0IGFjcGlfaW9ydF9ub2RlICppb3J0X3NjYW5fbm9kZShlbnVtIGFjcGlfaW9ydF9ub2RlX3R5 cGUgdHlwZSwKKwkJCQkJICAgICBpb3J0X2ZpbmRfbm9kZV9jYWxsYmFjayBjYWxsYmFjaywKKwkJ CQkJICAgICB2b2lkICpjb250ZXh0KQoreworCXN0cnVjdCBhY3BpX2lvcnRfbm9kZSAqaW9ydF9u b2RlLCAqaW9ydF9lbmQ7CisJc3RydWN0IGFjcGlfdGFibGVfaW9ydCAqaW9ydDsKKwlpbnQgaTsK KworCWlmICghaW9ydF90YWJsZSkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBHZXQgdGhlIGZpcnN0 IElPUlQgbm9kZSAqLworCWlvcnQgPSAoc3RydWN0IGFjcGlfdGFibGVfaW9ydCAqKWlvcnRfdGFi bGU7CisJaW9ydF9ub2RlID0gQUNQSV9BRERfUFRSKHN0cnVjdCBhY3BpX2lvcnRfbm9kZSwgaW9y dCwKKwkJCQkgaW9ydC0+bm9kZV9vZmZzZXQpOworCWlvcnRfZW5kID0gQUNQSV9BRERfUFRSKHN0 cnVjdCBhY3BpX2lvcnRfbm9kZSwgaW9ydF90YWJsZSwKKwkJCQlpb3J0X3RhYmxlLT5sZW5ndGgp OworCisJZm9yIChpID0gMDsgaSA8IGlvcnQtPm5vZGVfY291bnQ7IGkrKykgeworCQlpZiAoV0FS Tl9UQUlOVChpb3J0X25vZGUgPj0gaW9ydF9lbmQsIFRBSU5UX0ZJUk1XQVJFX1dPUktBUk9VTkQs CisJCQkgICAgICAgIklPUlQgbm9kZSBwb2ludGVyIG92ZXJmbG93cywgYmFkIHRhYmxlIVxuIikp CisJCQlyZXR1cm4gTlVMTDsKKworCQlpZiAoaW9ydF9ub2RlLT50eXBlID09IHR5cGUgJiYKKwkJ ICAgIEFDUElfU1VDQ0VTUyhjYWxsYmFjayhpb3J0X25vZGUsIGNvbnRleHQpKSkKKwkJCQlyZXR1 cm4gaW9ydF9ub2RlOworCisJCWlvcnRfbm9kZSA9IEFDUElfQUREX1BUUihzdHJ1Y3QgYWNwaV9p b3J0X25vZGUsIGlvcnRfbm9kZSwKKwkJCQkJIGlvcnRfbm9kZS0+bGVuZ3RoKTsKKwl9CisKKwly ZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGFjcGlfc3RhdHVzCitpb3J0X21hdGNoX3R5cGVfY2Fs bGJhY2soc3RydWN0IGFjcGlfaW9ydF9ub2RlICpub2RlLCB2b2lkICpjb250ZXh0KQoreworCXJl dHVybiBBRV9PSzsKK30KKworYm9vbCBpb3J0X25vZGVfbWF0Y2godTggdHlwZSkKK3sKKwlzdHJ1 Y3QgYWNwaV9pb3J0X25vZGUgKm5vZGU7CisKKwlub2RlID0gaW9ydF9zY2FuX25vZGUodHlwZSwg aW9ydF9tYXRjaF90eXBlX2NhbGxiYWNrLCBOVUxMKTsKKworCXJldHVybiBub2RlICE9IE5VTEw7 Cit9CisKK3N0YXRpYyBhY3BpX3N0YXR1cyBpb3J0X21hdGNoX25vZGVfY2FsbGJhY2soc3RydWN0 IGFjcGlfaW9ydF9ub2RlICpub2RlLAorCQkJCQkgICAgdm9pZCAqY29udGV4dCkKK3sKKwlzdHJ1 Y3QgZGV2aWNlICpkZXYgPSBjb250ZXh0OworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCWlmIChu b2RlLT50eXBlID09IEFDUElfSU9SVF9OT0RFX05BTUVEX0NPTVBPTkVOVCkgeworCQlzdHJ1Y3Qg YWNwaV9idWZmZXIgYnVmID0geyBBQ1BJX0FMTE9DQVRFX0JVRkZFUiwgTlVMTCB9OworCQlzdHJ1 Y3QgYWNwaV9kZXZpY2UgKmFkZXYgPSB0b19hY3BpX2RldmljZV9ub2RlKGRldi0+Zndub2RlKTsK KwkJc3RydWN0IGFjcGlfaW9ydF9uYW1lZF9jb21wb25lbnQgKm5jb21wOworCisJCWlmICghYWRl dikgeworCQkJc3RhdHVzID0gQUVfTk9UX0ZPVU5EOworCQkJZ290byBvdXQ7CisJCX0KKworCQlz dGF0dXMgPSBhY3BpX2dldF9uYW1lKGFkZXYtPmhhbmRsZSwgQUNQSV9GVUxMX1BBVEhOQU1FLCAm YnVmKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlkZXZfd2FybihkZXYsICJD YW4ndCBnZXQgZGV2aWNlIGZ1bGwgcGF0aCBuYW1lXG4iKTsKKwkJCWdvdG8gb3V0OworCQl9CisK KwkJbmNvbXAgPSAoc3RydWN0IGFjcGlfaW9ydF9uYW1lZF9jb21wb25lbnQgKilub2RlLT5ub2Rl X2RhdGE7CisJCXN0YXR1cyA9ICFzdHJjbXAobmNvbXAtPmRldmljZV9uYW1lLCBidWYucG9pbnRl cikgPworCQkJCQkJCUFFX09LIDogQUVfTk9UX0ZPVU5EOworCQlhY3BpX29zX2ZyZWUoYnVmLnBv aW50ZXIpOworCX0gZWxzZSBpZiAobm9kZS0+dHlwZSA9PSBBQ1BJX0lPUlRfTk9ERV9QQ0lfUk9P VF9DT01QTEVYKSB7CisJCXN0cnVjdCBhY3BpX2lvcnRfcm9vdF9jb21wbGV4ICpwY2lfcmM7CisJ CXN0cnVjdCBwY2lfYnVzICpidXM7CisKKwkJYnVzID0gdG9fcGNpX2J1cyhkZXYpOworCQlwY2lf cmMgPSAoc3RydWN0IGFjcGlfaW9ydF9yb290X2NvbXBsZXggKilub2RlLT5ub2RlX2RhdGE7CisK KwkJLyoKKwkJICogSXQgaXMgYXNzdW1lZCB0aGF0IFBDSSBzZWdtZW50IG51bWJlcnMgbWFwcyBv bmUtdG8tb25lCisJCSAqIHdpdGggcm9vdCBjb21wbGV4ZXMuIEVhY2ggc2VnbWVudCBudW1iZXIg Y2FuIHJlcHJlc2VudCBvbmx5CisJCSAqIG9uZSByb290IGNvbXBsZXguCisJCSAqLworCQlzdGF0 dXMgPSBwY2lfcmMtPnBjaV9zZWdtZW50X251bWJlciA9PSBwY2lfZG9tYWluX25yKGJ1cykgPwor CQkJCQkJCUFFX09LIDogQUVfTk9UX0ZPVU5EOworCX0gZWxzZSB7CisJCXN0YXR1cyA9IEFFX05P VF9GT1VORDsKKwl9CitvdXQ6CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBpb3J0 X2lkX21hcChzdHJ1Y3QgYWNwaV9pb3J0X2lkX21hcHBpbmcgKm1hcCwgdTggdHlwZSwgdTMyIHJp ZF9pbiwKKwkJICAgICAgIHUzMiAqcmlkX291dCkKK3sKKwkvKiBTaW5nbGUgbWFwcGluZyBkb2Vz IG5vdCBjYXJlIGZvciBpbnB1dCBpZCAqLworCWlmIChtYXAtPmZsYWdzICYgQUNQSV9JT1JUX0lE X1NJTkdMRV9NQVBQSU5HKSB7CisJCWlmICh0eXBlID09IEFDUElfSU9SVF9OT0RFX05BTUVEX0NP TVBPTkVOVCB8fAorCQkgICAgdHlwZSA9PSBBQ1BJX0lPUlRfTk9ERV9QQ0lfUk9PVF9DT01QTEVY KSB7CisJCQkqcmlkX291dCA9IG1hcC0+b3V0cHV0X2Jhc2U7CisJCQlyZXR1cm4gMDsKKwkJfQor CisJCXByX3dhcm4oRldfQlVHICJbbWFwICVwXSBTSU5HTEUgTUFQUElORyBmbGFnIG5vdCBhbGxv d2VkIGZvciBub2RlIHR5cGUgJWQsIHNraXBwaW5nIElEIG1hcFxuIiwKKwkJCW1hcCwgdHlwZSk7 CisJCXJldHVybiAtRU5YSU87CisJfQorCisJaWYgKHJpZF9pbiA8IG1hcC0+aW5wdXRfYmFzZSB8 fAorCSAgICAocmlkX2luID49IG1hcC0+aW5wdXRfYmFzZSArIG1hcC0+aWRfY291bnQpKQorCQly ZXR1cm4gLUVOWElPOworCisJKnJpZF9vdXQgPSBtYXAtPm91dHB1dF9iYXNlICsgKHJpZF9pbiAt IG1hcC0+aW5wdXRfYmFzZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYworc3RydWN0IGFjcGlf aW9ydF9ub2RlICppb3J0X25vZGVfZ2V0X2lkKHN0cnVjdCBhY3BpX2lvcnRfbm9kZSAqbm9kZSwK KwkJCQkJdTMyICppZF9vdXQsIHU4IHR5cGVfbWFzaywKKwkJCQkJaW50IGluZGV4KQoreworCXN0 cnVjdCBhY3BpX2lvcnRfbm9kZSAqcGFyZW50OworCXN0cnVjdCBhY3BpX2lvcnRfaWRfbWFwcGlu ZyAqbWFwOworCisJaWYgKCFub2RlLT5tYXBwaW5nX29mZnNldCB8fCAhbm9kZS0+bWFwcGluZ19j b3VudCB8fAorCQkJCSAgICAgaW5kZXggPj0gbm9kZS0+bWFwcGluZ19jb3VudCkKKwkJcmV0dXJu IE5VTEw7CisKKwltYXAgPSBBQ1BJX0FERF9QVFIoc3RydWN0IGFjcGlfaW9ydF9pZF9tYXBwaW5n LCBub2RlLAorCQkJICAgbm9kZS0+bWFwcGluZ19vZmZzZXQgKyBpbmRleCAqIHNpemVvZigqbWFw KSk7CisKKwkvKiBGaXJtd2FyZSBidWchICovCisJaWYgKCFtYXAtPm91dHB1dF9yZWZlcmVuY2Up IHsKKwkJcHJfZXJyKEZXX0JVRyAiW25vZGUgJXAgdHlwZSAlZF0gSUQgbWFwIGhhcyBOVUxMIHBh cmVudCByZWZlcmVuY2VcbiIsCisJCSAgICAgICBub2RlLCBub2RlLT50eXBlKTsKKwkJcmV0dXJu IE5VTEw7CisJfQorCisJcGFyZW50ID0gQUNQSV9BRERfUFRSKHN0cnVjdCBhY3BpX2lvcnRfbm9k ZSwgaW9ydF90YWJsZSwKKwkJCSAgICAgICBtYXAtPm91dHB1dF9yZWZlcmVuY2UpOworCisJaWYg KCEoSU9SVF9UWVBFX01BU0socGFyZW50LT50eXBlKSAmIHR5cGVfbWFzaykpCisJCXJldHVybiBO VUxMOworCisJaWYgKG1hcC0+ZmxhZ3MgJiBBQ1BJX0lPUlRfSURfU0lOR0xFX01BUFBJTkcpIHsK KwkJaWYgKG5vZGUtPnR5cGUgPT0gQUNQSV9JT1JUX05PREVfTkFNRURfQ09NUE9ORU5UIHx8CisJ CSAgICBub2RlLT50eXBlID09IEFDUElfSU9SVF9OT0RFX1BDSV9ST09UX0NPTVBMRVgpIHsKKwkJ CSppZF9vdXQgPSBtYXAtPm91dHB1dF9iYXNlOworCQkJcmV0dXJuIHBhcmVudDsKKwkJfQorCX0K KworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IGFjcGlfaW9ydF9ub2RlICppb3J0 X25vZGVfbWFwX3JpZChzdHJ1Y3QgYWNwaV9pb3J0X25vZGUgKm5vZGUsCisJCQkJCQl1MzIgcmlk X2luLCB1MzIgKnJpZF9vdXQsCisJCQkJCQl1OCB0eXBlX21hc2spCit7CisJdTMyIHJpZCA9IHJp ZF9pbjsKKworCS8qIFBhcnNlIHRoZSBJRCBtYXBwaW5nIHRyZWUgdG8gZmluZCBzcGVjaWZpZWQg bm9kZSB0eXBlICovCisJd2hpbGUgKG5vZGUpIHsKKwkJc3RydWN0IGFjcGlfaW9ydF9pZF9tYXBw aW5nICptYXA7CisJCWludCBpOworCisJCWlmIChJT1JUX1RZUEVfTUFTSyhub2RlLT50eXBlKSAm IHR5cGVfbWFzaykgeworCQkJaWYgKHJpZF9vdXQpCisJCQkJKnJpZF9vdXQgPSByaWQ7CisJCQly ZXR1cm4gbm9kZTsKKwkJfQorCisJCWlmICghbm9kZS0+bWFwcGluZ19vZmZzZXQgfHwgIW5vZGUt Pm1hcHBpbmdfY291bnQpCisJCQlnb3RvIGZhaWxfbWFwOworCisJCW1hcCA9IEFDUElfQUREX1BU UihzdHJ1Y3QgYWNwaV9pb3J0X2lkX21hcHBpbmcsIG5vZGUsCisJCQkJICAgbm9kZS0+bWFwcGlu Z19vZmZzZXQpOworCisJCS8qIEZpcm13YXJlIGJ1ZyEgKi8KKwkJaWYgKCFtYXAtPm91dHB1dF9y ZWZlcmVuY2UpIHsKKwkJCXByX2VycihGV19CVUcgIltub2RlICVwIHR5cGUgJWRdIElEIG1hcCBo YXMgTlVMTCBwYXJlbnQgcmVmZXJlbmNlXG4iLAorCQkJICAgICAgIG5vZGUsIG5vZGUtPnR5cGUp OworCQkJZ290byBmYWlsX21hcDsKKwkJfQorCisJCS8qIERvIHRoZSBSSUQgdHJhbnNsYXRpb24g Ki8KKwkJZm9yIChpID0gMDsgaSA8IG5vZGUtPm1hcHBpbmdfY291bnQ7IGkrKywgbWFwKyspIHsK KwkJCWlmICghaW9ydF9pZF9tYXAobWFwLCBub2RlLT50eXBlLCByaWQsICZyaWQpKQorCQkJCWJy ZWFrOworCQl9CisKKwkJaWYgKGkgPT0gbm9kZS0+bWFwcGluZ19jb3VudCkKKwkJCWdvdG8gZmFp bF9tYXA7CisKKwkJbm9kZSA9IEFDUElfQUREX1BUUihzdHJ1Y3QgYWNwaV9pb3J0X25vZGUsIGlv cnRfdGFibGUsCisJCQkJICAgIG1hcC0+b3V0cHV0X3JlZmVyZW5jZSk7CisJfQorCitmYWlsX21h cDoKKwkvKiBNYXAgaW5wdXQgUklEIHRvIG91dHB1dCBSSUQgdW5jaGFuZ2VkIG9uIG1hcHBpbmcg ZmFpbHVyZSovCisJaWYgKHJpZF9vdXQpCisJCSpyaWRfb3V0ID0gcmlkX2luOworCisJcmV0dXJu IE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYWNwaV9pb3J0X25vZGUgKmlvcnRfZmluZF9kZXZf bm9kZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBjaV9idXMgKnBidXM7CisKKwlp ZiAoIWRldl9pc19wY2koZGV2KSkKKwkJcmV0dXJuIGlvcnRfc2Nhbl9ub2RlKEFDUElfSU9SVF9O T0RFX05BTUVEX0NPTVBPTkVOVCwKKwkJCQkgICAgICBpb3J0X21hdGNoX25vZGVfY2FsbGJhY2ss IGRldik7CisKKwkvKiBGaW5kIGEgUENJIHJvb3QgYnVzICovCisJcGJ1cyA9IHRvX3BjaV9kZXYo ZGV2KS0+YnVzOworCXdoaWxlICghcGNpX2lzX3Jvb3RfYnVzKHBidXMpKQorCQlwYnVzID0gcGJ1 cy0+cGFyZW50OworCisJcmV0dXJuIGlvcnRfc2Nhbl9ub2RlKEFDUElfSU9SVF9OT0RFX1BDSV9S T09UX0NPTVBMRVgsCisJCQkgICAgICBpb3J0X21hdGNoX25vZGVfY2FsbGJhY2ssICZwYnVzLT5k ZXYpOworfQorCisvKioKKyAqIGlvcnRfbXNpX21hcF9yaWQoKSAtIE1hcCBhIE1TSSByZXF1ZXN0 ZXIgSUQgZm9yIGEgZGV2aWNlCisgKiBAZGV2OiBUaGUgZGV2aWNlIGZvciB3aGljaCB0aGUgbWFw cGluZyBpcyB0byBiZSBkb25lLgorICogQHJlcV9pZDogVGhlIGRldmljZSByZXF1ZXN0ZXIgSUQu CisgKgorICogUmV0dXJuczogbWFwcGVkIE1TSSBSSUQgb24gc3VjY2VzcywgaW5wdXQgcmVxdWVz dGVyIElEIG90aGVyd2lzZQorICovCit1MzIgaW9ydF9tc2lfbWFwX3JpZChzdHJ1Y3QgZGV2aWNl ICpkZXYsIHUzMiByZXFfaWQpCit7CisJc3RydWN0IGFjcGlfaW9ydF9ub2RlICpub2RlOworCXUz MiBkZXZfaWQ7CisKKwlub2RlID0gaW9ydF9maW5kX2Rldl9ub2RlKGRldik7CisJaWYgKCFub2Rl KQorCQlyZXR1cm4gcmVxX2lkOworCisJaW9ydF9ub2RlX21hcF9yaWQobm9kZSwgcmVxX2lkLCAm ZGV2X2lkLCBJT1JUX01TSV9UWVBFKTsKKwlyZXR1cm4gZGV2X2lkOworfQorCisvKioKKyAqIGlv cnRfZGV2X2ZpbmRfaXRzX2lkKCkgLSBGaW5kIHRoZSBJVFMgaWRlbnRpZmllciBmb3IgYSBkZXZp Y2UKKyAqIEBkZXY6IFRoZSBkZXZpY2UuCisgKiBAaWR4OiBJbmRleCBvZiB0aGUgSVRTIGlkZW50 aWZpZXIgbGlzdC4KKyAqIEBpdHNfaWQ6IElUUyBpZGVudGlmaWVyLgorICoKKyAqIFJldHVybnM6 IDAgb24gc3VjY2VzcywgYXBwcm9wcmlhdGUgZXJyb3IgdmFsdWUgb3RoZXJ3aXNlCisgKi8KK3N0 YXRpYyBpbnQgaW9ydF9kZXZfZmluZF9pdHNfaWQoc3RydWN0IGRldmljZSAqZGV2LCB1MzIgcmVx X2lkLAorCQkJCXVuc2lnbmVkIGludCBpZHgsIGludCAqaXRzX2lkKQoreworCXN0cnVjdCBhY3Bp X2lvcnRfaXRzX2dyb3VwICppdHM7CisJc3RydWN0IGFjcGlfaW9ydF9ub2RlICpub2RlOworCisJ bm9kZSA9IGlvcnRfZmluZF9kZXZfbm9kZShkZXYpOworCWlmICghbm9kZSkKKwkJcmV0dXJuIC1F TlhJTzsKKworCW5vZGUgPSBpb3J0X25vZGVfbWFwX3JpZChub2RlLCByZXFfaWQsIE5VTEwsIElP UlRfTVNJX1RZUEUpOworCWlmICghbm9kZSkKKwkJcmV0dXJuIC1FTlhJTzsKKworCS8qIE1vdmUg dG8gSVRTIHNwZWNpZmljIGRhdGEgKi8KKwlpdHMgPSAoc3RydWN0IGFjcGlfaW9ydF9pdHNfZ3Jv dXAgKilub2RlLT5ub2RlX2RhdGE7CisJaWYgKGlkeCA+IGl0cy0+aXRzX2NvdW50KSB7CisJCWRl dl9lcnIoZGV2LCAicmVxdWVzdGVkIElUUyBJRCBpbmRleCBbJWRdIGlzIGdyZWF0ZXIgdGhhbiBh dmFpbGFibGUgWyVkXVxuIiwKKwkJCWlkeCwgaXRzLT5pdHNfY291bnQpOworCQlyZXR1cm4gLUVO WElPOworCX0KKworCSppdHNfaWQgPSBpdHMtPmlkZW50aWZpZXJzW2lkeF07CisJcmV0dXJuIDA7 Cit9CisKKy8qKgorICogaW9ydF9nZXRfZGV2aWNlX2RvbWFpbigpIC0gRmluZCBNU0kgZG9tYWlu IHJlbGF0ZWQgdG8gYSBkZXZpY2UKKyAqIEBkZXY6IFRoZSBkZXZpY2UuCisgKiBAcmVxX2lkOiBS ZXF1ZXN0ZXIgSUQgZm9yIHRoZSBkZXZpY2UuCisgKgorICogUmV0dXJuczogdGhlIE1TSSBkb21h aW4gZm9yIHRoaXMgZGV2aWNlLCBOVUxMIG90aGVyd2lzZQorICovCitzdHJ1Y3QgaXJxX2RvbWFp biAqaW9ydF9nZXRfZGV2aWNlX2RvbWFpbihzdHJ1Y3QgZGV2aWNlICpkZXYsIHUzMiByZXFfaWQp Cit7CisJc3RydWN0IGZ3bm9kZV9oYW5kbGUgKmhhbmRsZTsKKwlpbnQgaXRzX2lkOworCisJaWYg KGlvcnRfZGV2X2ZpbmRfaXRzX2lkKGRldiwgcmVxX2lkLCAwLCAmaXRzX2lkKSkKKwkJcmV0dXJu IE5VTEw7CisKKwloYW5kbGUgPSBpb3J0X2ZpbmRfZG9tYWluX3Rva2VuKGl0c19pZCk7CisJaWYg KCFoYW5kbGUpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIGlycV9maW5kX21hdGNoaW5nX2Z3 bm9kZShoYW5kbGUsIERPTUFJTl9CVVNfUENJX01TSSk7Cit9CisKK3N0YXRpYyBpbnQgX19nZXRf cGNpX3JpZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdTE2IGFsaWFzLCB2b2lkICpkYXRhKQorewor CXUzMiAqcmlkID0gZGF0YTsKKworCSpyaWQgPSBhbGlhczsKKwlyZXR1cm4gMDsKK30KKworc3Rh dGljIGludCBhcm1fc21tdV9pb3J0X3hsYXRlKHN0cnVjdCBkZXZpY2UgKmRldiwgdTMyIHN0cmVh bWlkLAorCQkJICAgICAgIHN0cnVjdCBmd25vZGVfaGFuZGxlICpmd25vZGUsCisJCQkgICAgICAg Y29uc3Qgc3RydWN0IGlvbW11X29wcyAqb3BzKQoreworCWludCByZXQgPSBpb21tdV9md3NwZWNf aW5pdChkZXYsIGZ3bm9kZSwgb3BzKTsKKworCWlmICghcmV0KQorCQlyZXQgPSBpb21tdV9md3Nw ZWNfYWRkX2lkcyhkZXYsICZzdHJlYW1pZCwgMSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0 aWMgY29uc3Qgc3RydWN0IGlvbW11X29wcyAqaW9ydF9pb21tdV94bGF0ZShzdHJ1Y3QgZGV2aWNl ICpkZXYsCisJCQkJCXN0cnVjdCBhY3BpX2lvcnRfbm9kZSAqbm9kZSwKKwkJCQkJdTMyIHN0cmVh bWlkKQoreworCWNvbnN0IHN0cnVjdCBpb21tdV9vcHMgKm9wcyA9IE5VTEw7CisJaW50IHJldCA9 IC1FTk9ERVY7CisJc3RydWN0IGZ3bm9kZV9oYW5kbGUgKmlvcnRfZndub2RlOworCisJaWYgKG5v ZGUpIHsKKwkJaW9ydF9md25vZGUgPSBpb3J0X2dldF9md25vZGUobm9kZSk7CisJCWlmICghaW9y dF9md25vZGUpCisJCQlyZXR1cm4gTlVMTDsKKworCQlvcHMgPSBpb21tdV9vcHNfZnJvbV9md25v ZGUoaW9ydF9md25vZGUpOworCQlpZiAoIW9wcykKKwkJCXJldHVybiBOVUxMOworCisJCXJldCA9 IGFybV9zbW11X2lvcnRfeGxhdGUoZGV2LCBzdHJlYW1pZCwgaW9ydF9md25vZGUsIG9wcyk7CisJ fQorCisJcmV0dXJuIHJldCA/IE5VTEwgOiBvcHM7Cit9CisKKy8qKgorICogaW9ydF9zZXRfZG1h X21hc2sgLSBTZXQtdXAgZG1hIG1hc2sgZm9yIGEgZGV2aWNlLgorICoKKyAqIEBkZXY6IGRldmlj ZSB0byBjb25maWd1cmUKKyAqLwordm9pZCBpb3J0X3NldF9kbWFfbWFzayhzdHJ1Y3QgZGV2aWNl ICpkZXYpCit7CisJLyoKKwkgKiBTZXQgZGVmYXVsdCBjb2hlcmVudF9kbWFfbWFzayB0byAzMiBi aXQuICBEcml2ZXJzIGFyZSBleHBlY3RlZCB0bworCSAqIHNldHVwIHRoZSBjb3JyZWN0IHN1cHBv cnRlZCBtYXNrLgorCSAqLworCWlmICghZGV2LT5jb2hlcmVudF9kbWFfbWFzaykKKwkJZGV2LT5j b2hlcmVudF9kbWFfbWFzayA9IERNQV9CSVRfTUFTSygzMik7CisKKwkvKgorCSAqIFNldCBpdCB0 byBjb2hlcmVudF9kbWFfbWFzayBieSBkZWZhdWx0IGlmIHRoZSBhcmNoaXRlY3R1cmUKKwkgKiBj b2RlIGhhcyBub3Qgc2V0IGl0LgorCSAqLworCWlmICghZGV2LT5kbWFfbWFzaykKKwkJZGV2LT5k bWFfbWFzayA9ICZkZXYtPmNvaGVyZW50X2RtYV9tYXNrOworfQorCisvKioKKyAqIGlvcnRfaW9t bXVfY29uZmlndXJlIC0gU2V0LXVwIElPTU1VIGNvbmZpZ3VyYXRpb24gZm9yIGEgZGV2aWNlLgor ICoKKyAqIEBkZXY6IGRldmljZSB0byBjb25maWd1cmUKKyAqCisgKiBSZXR1cm5zOiBpb21tdV9v cHMgcG9pbnRlciBvbiBjb25maWd1cmF0aW9uIHN1Y2Nlc3MKKyAqICAgICAgICAgIE5VTEwgb24g Y29uZmlndXJhdGlvbiBmYWlsdXJlCisgKi8KK2NvbnN0IHN0cnVjdCBpb21tdV9vcHMgKmlvcnRf aW9tbXVfY29uZmlndXJlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYWNwaV9pb3J0 X25vZGUgKm5vZGUsICpwYXJlbnQ7CisJY29uc3Qgc3RydWN0IGlvbW11X29wcyAqb3BzID0gTlVM TDsKKwl1MzIgc3RyZWFtaWQgPSAwOworCisJaWYgKGRldl9pc19wY2koZGV2KSkgeworCQlzdHJ1 Y3QgcGNpX2J1cyAqYnVzID0gdG9fcGNpX2RldihkZXYpLT5idXM7CisJCXUzMiByaWQ7CisKKwkJ cGNpX2Zvcl9lYWNoX2RtYV9hbGlhcyh0b19wY2lfZGV2KGRldiksIF9fZ2V0X3BjaV9yaWQsCisJ CQkJICAgICAgICZyaWQpOworCisJCW5vZGUgPSBpb3J0X3NjYW5fbm9kZShBQ1BJX0lPUlRfTk9E RV9QQ0lfUk9PVF9DT01QTEVYLAorCQkJCSAgICAgIGlvcnRfbWF0Y2hfbm9kZV9jYWxsYmFjaywg JmJ1cy0+ZGV2KTsKKwkJaWYgKCFub2RlKQorCQkJcmV0dXJuIE5VTEw7CisKKwkJcGFyZW50ID0g aW9ydF9ub2RlX21hcF9yaWQobm9kZSwgcmlkLCAmc3RyZWFtaWQsCisJCQkJCSAgIElPUlRfSU9N TVVfVFlQRSk7CisKKwkJb3BzID0gaW9ydF9pb21tdV94bGF0ZShkZXYsIHBhcmVudCwgc3RyZWFt aWQpOworCisJfSBlbHNlIHsKKwkJaW50IGkgPSAwOworCisJCW5vZGUgPSBpb3J0X3NjYW5fbm9k ZShBQ1BJX0lPUlRfTk9ERV9OQU1FRF9DT01QT05FTlQsCisJCQkJICAgICAgaW9ydF9tYXRjaF9u b2RlX2NhbGxiYWNrLCBkZXYpOworCQlpZiAoIW5vZGUpCisJCQlyZXR1cm4gTlVMTDsKKworCQlw YXJlbnQgPSBpb3J0X25vZGVfZ2V0X2lkKG5vZGUsICZzdHJlYW1pZCwKKwkJCQkJICBJT1JUX0lP TU1VX1RZUEUsIGkrKyk7CisKKwkJd2hpbGUgKHBhcmVudCkgeworCQkJb3BzID0gaW9ydF9pb21t dV94bGF0ZShkZXYsIHBhcmVudCwgc3RyZWFtaWQpOworCisJCQlwYXJlbnQgPSBpb3J0X25vZGVf Z2V0X2lkKG5vZGUsICZzdHJlYW1pZCwKKwkJCQkJCSAgSU9SVF9JT01NVV9UWVBFLCBpKyspOwor CQl9CisJfQorCisJcmV0dXJuIG9wczsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGFjcGlfaW9y dF9yZWdpc3Rlcl9pcnEoaW50IGh3aXJxLCBjb25zdCBjaGFyICpuYW1lLAorCQkJCQkgIGludCB0 cmlnZ2VyLAorCQkJCQkgIHN0cnVjdCByZXNvdXJjZSAqcmVzKQoreworCWludCBpcnEgPSBhY3Bp X3JlZ2lzdGVyX2dzaShOVUxMLCBod2lycSwgdHJpZ2dlciwKKwkJCQkgICAgQUNQSV9BQ1RJVkVf SElHSCk7CisKKwlpZiAoaXJxIDw9IDApIHsKKwkJcHJfZXJyKCJjb3VsZCBub3QgcmVnaXN0ZXIg Z3NpIGh3aXJxICVkIG5hbWUgWyVzXVxuIiwgaHdpcnEsCisJCQkJCQkJCSAgICAgIG5hbWUpOwor CQlyZXR1cm47CisJfQorCisJcmVzLT5zdGFydCA9IGlycTsKKwlyZXMtPmVuZCA9IGlycTsKKwly ZXMtPmZsYWdzID0gSU9SRVNPVVJDRV9JUlE7CisJcmVzLT5uYW1lID0gbmFtZTsKK30KKworc3Rh dGljIGludCBfX2luaXQgYXJtX3NtbXVfdjNfY291bnRfcmVzb3VyY2VzKHN0cnVjdCBhY3BpX2lv cnRfbm9kZSAqbm9kZSkKK3sKKwlzdHJ1Y3QgYWNwaV9pb3J0X3NtbXVfdjMgKnNtbXU7CisJLyog QWx3YXlzIHByZXNlbnQgbWVtIHJlc291cmNlICovCisJaW50IG51bV9yZXMgPSAxOworCisJLyog UmV0cmlldmUgU01NVXYzIHNwZWNpZmljIGRhdGEgKi8KKwlzbW11ID0gKHN0cnVjdCBhY3BpX2lv cnRfc21tdV92MyAqKW5vZGUtPm5vZGVfZGF0YTsKKworCWlmIChzbW11LT5ldmVudF9nc2l2KQor CQludW1fcmVzKys7CisKKwlpZiAoc21tdS0+cHJpX2dzaXYpCisJCW51bV9yZXMrKzsKKworCWlm IChzbW11LT5nZXJyX2dzaXYpCisJCW51bV9yZXMrKzsKKworCWlmIChzbW11LT5zeW5jX2dzaXYp CisJCW51bV9yZXMrKzsKKworCXJldHVybiBudW1fcmVzOworfQorCitzdGF0aWMgdm9pZCBfX2lu aXQgYXJtX3NtbXVfdjNfaW5pdF9yZXNvdXJjZXMoc3RydWN0IHJlc291cmNlICpyZXMsCisJCQkJ CSAgICAgIHN0cnVjdCBhY3BpX2lvcnRfbm9kZSAqbm9kZSkKK3sKKwlzdHJ1Y3QgYWNwaV9pb3J0 X3NtbXVfdjMgKnNtbXU7CisJaW50IG51bV9yZXMgPSAwOworCisJLyogUmV0cmlldmUgU01NVXYz IHNwZWNpZmljIGRhdGEgKi8KKwlzbW11ID0gKHN0cnVjdCBhY3BpX2lvcnRfc21tdV92MyAqKW5v ZGUtPm5vZGVfZGF0YTsKKworCXJlc1tudW1fcmVzXS5zdGFydCA9IHNtbXUtPmJhc2VfYWRkcmVz czsKKwlyZXNbbnVtX3Jlc10uZW5kID0gc21tdS0+YmFzZV9hZGRyZXNzICsgU1pfMTI4SyAtIDE7 CisJcmVzW251bV9yZXNdLmZsYWdzID0gSU9SRVNPVVJDRV9NRU07CisKKwludW1fcmVzKys7CisK KwlpZiAoc21tdS0+ZXZlbnRfZ3NpdikKKwkJYWNwaV9pb3J0X3JlZ2lzdGVyX2lycShzbW11LT5l dmVudF9nc2l2LCAiZXZlbnRxIiwKKwkJCQkgICAgICAgQUNQSV9FREdFX1NFTlNJVElWRSwKKwkJ CQkgICAgICAgJnJlc1tudW1fcmVzKytdKTsKKworCWlmIChzbW11LT5wcmlfZ3NpdikKKwkJYWNw aV9pb3J0X3JlZ2lzdGVyX2lycShzbW11LT5wcmlfZ3NpdiwgInByaXEiLAorCQkJCSAgICAgICBB Q1BJX0VER0VfU0VOU0lUSVZFLAorCQkJCSAgICAgICAmcmVzW251bV9yZXMrK10pOworCisJaWYg KHNtbXUtPmdlcnJfZ3NpdikKKwkJYWNwaV9pb3J0X3JlZ2lzdGVyX2lycShzbW11LT5nZXJyX2dz aXYsICJnZXJyb3IiLAorCQkJCSAgICAgICBBQ1BJX0VER0VfU0VOU0lUSVZFLAorCQkJCSAgICAg ICAmcmVzW251bV9yZXMrK10pOworCisJaWYgKHNtbXUtPnN5bmNfZ3NpdikKKwkJYWNwaV9pb3J0 X3JlZ2lzdGVyX2lycShzbW11LT5zeW5jX2dzaXYsICJjbWRxLXN5bmMiLAorCQkJCSAgICAgICBB Q1BJX0VER0VfU0VOU0lUSVZFLAorCQkJCSAgICAgICAmcmVzW251bV9yZXMrK10pOworfQorCitz dGF0aWMgYm9vbCBfX2luaXQgYXJtX3NtbXVfdjNfaXNfY29oZXJlbnQoc3RydWN0IGFjcGlfaW9y dF9ub2RlICpub2RlKQoreworCXN0cnVjdCBhY3BpX2lvcnRfc21tdV92MyAqc21tdTsKKworCS8q IFJldHJpZXZlIFNNTVV2MyBzcGVjaWZpYyBkYXRhICovCisJc21tdSA9IChzdHJ1Y3QgYWNwaV9p b3J0X3NtbXVfdjMgKilub2RlLT5ub2RlX2RhdGE7CisKKwlyZXR1cm4gc21tdS0+ZmxhZ3MgJiBB Q1BJX0lPUlRfU01NVV9WM19DT0hBQ0NfT1ZFUlJJREU7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0 IGFybV9zbW11X2NvdW50X3Jlc291cmNlcyhzdHJ1Y3QgYWNwaV9pb3J0X25vZGUgKm5vZGUpCit7 CisJc3RydWN0IGFjcGlfaW9ydF9zbW11ICpzbW11OworCisJLyogUmV0cmlldmUgU01NVSBzcGVj aWZpYyBkYXRhICovCisJc21tdSA9IChzdHJ1Y3QgYWNwaV9pb3J0X3NtbXUgKilub2RlLT5ub2Rl X2RhdGE7CisKKwkvKgorCSAqIE9ubHkgY29uc2lkZXIgdGhlIGdsb2JhbCBmYXVsdCBpbnRlcnJ1 cHQgYW5kIGlnbm9yZSB0aGUKKwkgKiBjb25maWd1cmF0aW9uIGFjY2VzcyBpbnRlcnJ1cHQuCisJ ICoKKwkgKiBNTUlPIGFkZHJlc3MgYW5kIGdsb2JhbCBmYXVsdCBpbnRlcnJ1cHQgcmVzb3VyY2Vz IGFyZSBhbHdheXMKKwkgKiBwcmVzZW50IHNvIGFkZCB0aGVtIHRvIHRoZSBjb250ZXh0IGludGVy cnVwdCBjb3VudCBhcyBhIHN0YXRpYworCSAqIHZhbHVlLgorCSAqLworCXJldHVybiBzbW11LT5j b250ZXh0X2ludGVycnVwdF9jb3VudCArIDI7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBhcm1f c21tdV9pbml0X3Jlc291cmNlcyhzdHJ1Y3QgcmVzb3VyY2UgKnJlcywKKwkJCQkJICAgc3RydWN0 IGFjcGlfaW9ydF9ub2RlICpub2RlKQoreworCXN0cnVjdCBhY3BpX2lvcnRfc21tdSAqc21tdTsK KwlpbnQgaSwgaHdfaXJxLCB0cmlnZ2VyLCBudW1fcmVzID0gMDsKKwl1NjQgKmN0eF9pcnEsICpn bGJfaXJxOworCisJLyogUmV0cmlldmUgU01NVSBzcGVjaWZpYyBkYXRhICovCisJc21tdSA9IChz dHJ1Y3QgYWNwaV9pb3J0X3NtbXUgKilub2RlLT5ub2RlX2RhdGE7CisKKwlyZXNbbnVtX3Jlc10u c3RhcnQgPSBzbW11LT5iYXNlX2FkZHJlc3M7CisJcmVzW251bV9yZXNdLmVuZCA9IHNtbXUtPmJh c2VfYWRkcmVzcyArIHNtbXUtPnNwYW4gLSAxOworCXJlc1tudW1fcmVzXS5mbGFncyA9IElPUkVT T1VSQ0VfTUVNOworCW51bV9yZXMrKzsKKworCWdsYl9pcnEgPSBBQ1BJX0FERF9QVFIodTY0LCBu b2RlLCBzbW11LT5nbG9iYWxfaW50ZXJydXB0X29mZnNldCk7CisJLyogR2xvYmFsIElSUXMgKi8K Kwlod19pcnEgPSBJT1JUX0lSUV9NQVNLKGdsYl9pcnFbMF0pOworCXRyaWdnZXIgPSBJT1JUX0lS UV9UUklHR0VSX01BU0soZ2xiX2lycVswXSk7CisKKwlhY3BpX2lvcnRfcmVnaXN0ZXJfaXJxKGh3 X2lycSwgImFybS1zbW11LWdsb2JhbCIsIHRyaWdnZXIsCisJCQkJICAgICAmcmVzW251bV9yZXMr K10pOworCisJLyogQ29udGV4dCBJUlFzICovCisJY3R4X2lycSA9IEFDUElfQUREX1BUUih1NjQs IG5vZGUsIHNtbXUtPmNvbnRleHRfaW50ZXJydXB0X29mZnNldCk7CisJZm9yIChpID0gMDsgaSA8 IHNtbXUtPmNvbnRleHRfaW50ZXJydXB0X2NvdW50OyBpKyspIHsKKwkJaHdfaXJxID0gSU9SVF9J UlFfTUFTSyhjdHhfaXJxW2ldKTsKKwkJdHJpZ2dlciA9IElPUlRfSVJRX1RSSUdHRVJfTUFTSyhj dHhfaXJxW2ldKTsKKworCQlhY3BpX2lvcnRfcmVnaXN0ZXJfaXJxKGh3X2lycSwgImFybS1zbW11 LWNvbnRleHQiLCB0cmlnZ2VyLAorCQkJCSAgICAgICAmcmVzW251bV9yZXMrK10pOworCX0KK30K Kworc3RhdGljIGJvb2wgX19pbml0IGFybV9zbW11X2lzX2NvaGVyZW50KHN0cnVjdCBhY3BpX2lv cnRfbm9kZSAqbm9kZSkKK3sKKwlzdHJ1Y3QgYWNwaV9pb3J0X3NtbXUgKnNtbXU7CisKKwkvKiBS ZXRyaWV2ZSBTTU1VIHNwZWNpZmljIGRhdGEgKi8KKwlzbW11ID0gKHN0cnVjdCBhY3BpX2lvcnRf c21tdSAqKW5vZGUtPm5vZGVfZGF0YTsKKworCXJldHVybiBzbW11LT5mbGFncyAmIEFDUElfSU9S VF9TTU1VX0NPSEVSRU5UX1dBTEs7Cit9CisKK3N0cnVjdCBpb3J0X2lvbW11X2NvbmZpZyB7CisJ Y29uc3QgY2hhciAqbmFtZTsKKwlpbnQgKCppb21tdV9pbml0KShzdHJ1Y3QgYWNwaV9pb3J0X25v ZGUgKm5vZGUpOworCWJvb2wgKCppb21tdV9pc19jb2hlcmVudCkoc3RydWN0IGFjcGlfaW9ydF9u b2RlICpub2RlKTsKKwlpbnQgKCppb21tdV9jb3VudF9yZXNvdXJjZXMpKHN0cnVjdCBhY3BpX2lv cnRfbm9kZSAqbm9kZSk7CisJdm9pZCAoKmlvbW11X2luaXRfcmVzb3VyY2VzKShzdHJ1Y3QgcmVz b3VyY2UgKnJlcywKKwkJCQkgICAgIHN0cnVjdCBhY3BpX2lvcnRfbm9kZSAqbm9kZSk7Cit9Owor CitzdGF0aWMgY29uc3Qgc3RydWN0IGlvcnRfaW9tbXVfY29uZmlnIGlvcnRfYXJtX3NtbXVfdjNf Y2ZnIF9faW5pdGNvbnN0ID0geworCS5uYW1lID0gImFybS1zbW11LXYzIiwKKwkuaW9tbXVfaXNf Y29oZXJlbnQgPSBhcm1fc21tdV92M19pc19jb2hlcmVudCwKKwkuaW9tbXVfY291bnRfcmVzb3Vy Y2VzID0gYXJtX3NtbXVfdjNfY291bnRfcmVzb3VyY2VzLAorCS5pb21tdV9pbml0X3Jlc291cmNl cyA9IGFybV9zbW11X3YzX2luaXRfcmVzb3VyY2VzCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0 IGlvcnRfaW9tbXVfY29uZmlnIGlvcnRfYXJtX3NtbXVfY2ZnIF9faW5pdGNvbnN0ID0geworCS5u YW1lID0gImFybS1zbW11IiwKKwkuaW9tbXVfaXNfY29oZXJlbnQgPSBhcm1fc21tdV9pc19jb2hl cmVudCwKKwkuaW9tbXVfY291bnRfcmVzb3VyY2VzID0gYXJtX3NtbXVfY291bnRfcmVzb3VyY2Vz LAorCS5pb21tdV9pbml0X3Jlc291cmNlcyA9IGFybV9zbW11X2luaXRfcmVzb3VyY2VzCit9Owor CitzdGF0aWMgX19pbml0Citjb25zdCBzdHJ1Y3QgaW9ydF9pb21tdV9jb25maWcgKmlvcnRfZ2V0 X2lvbW11X2NmZyhzdHJ1Y3QgYWNwaV9pb3J0X25vZGUgKm5vZGUpCit7CisJc3dpdGNoIChub2Rl LT50eXBlKSB7CisJY2FzZSBBQ1BJX0lPUlRfTk9ERV9TTU1VX1YzOgorCQlyZXR1cm4gJmlvcnRf YXJtX3NtbXVfdjNfY2ZnOworCWNhc2UgQUNQSV9JT1JUX05PREVfU01NVToKKwkJcmV0dXJuICZp b3J0X2FybV9zbW11X2NmZzsKKwlkZWZhdWx0OgorCQlyZXR1cm4gTlVMTDsKKwl9Cit9CisKKy8q KgorICogaW9ydF9hZGRfc21tdV9wbGF0Zm9ybV9kZXZpY2UoKSAtIEFsbG9jYXRlIGEgcGxhdGZv cm0gZGV2aWNlIGZvciBTTU1VCisgKiBAbm9kZTogUG9pbnRlciB0byBTTU1VIEFDUEkgSU9SVCBu b2RlCisgKgorICogUmV0dXJuczogMCBvbiBzdWNjZXNzLCA8MCBmYWlsdXJlCisgKi8KK3N0YXRp YyBpbnQgX19pbml0IGlvcnRfYWRkX3NtbXVfcGxhdGZvcm1fZGV2aWNlKHN0cnVjdCBhY3BpX2lv cnRfbm9kZSAqbm9kZSkKK3sKKwlzdHJ1Y3QgZndub2RlX2hhbmRsZSAqZndub2RlOworCXN0cnVj dCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CisJc3RydWN0IHJlc291cmNlICpyOworCWVudW0gZGV2 X2RtYV9hdHRyIGF0dHI7CisJaW50IHJldCwgY291bnQ7CisJY29uc3Qgc3RydWN0IGlvcnRfaW9t bXVfY29uZmlnICpvcHMgPSBpb3J0X2dldF9pb21tdV9jZmcobm9kZSk7CisKKwlpZiAoIW9wcykK KwkJcmV0dXJuIC1FTk9ERVY7CisKKwlwZGV2ID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKG9wcy0+ bmFtZSwgUExBVEZPUk1fREVWSURfQVVUTyk7CisJaWYgKCFwZGV2KQorCQlyZXR1cm4gLUVOT01F TTsKKworCWNvdW50ID0gb3BzLT5pb21tdV9jb3VudF9yZXNvdXJjZXMobm9kZSk7CisKKwlyID0g a2NhbGxvYyhjb3VudCwgc2l6ZW9mKCpyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyKSB7CisJCXJl dCA9IC1FTk9NRU07CisJCWdvdG8gZGV2X3B1dDsKKwl9CisKKwlvcHMtPmlvbW11X2luaXRfcmVz b3VyY2VzKHIsIG5vZGUpOworCisJcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9yZXNvdXJjZXMo cGRldiwgciwgY291bnQpOworCS8qCisJICogUmVzb3VyY2VzIGFyZSBkdXBsaWNhdGVkIGluIHBs YXRmb3JtX2RldmljZV9hZGRfcmVzb3VyY2VzLAorCSAqIGZyZWUgdGhlaXIgYWxsb2NhdGVkIG1l bW9yeQorCSAqLworCWtmcmVlKHIpOworCisJaWYgKHJldCkKKwkJZ290byBkZXZfcHV0OworCisJ LyoKKwkgKiBBZGQgYSBjb3B5IG9mIElPUlQgbm9kZSBwb2ludGVyIHRvIHBsYXRmb3JtX2RhdGEg dG8KKwkgKiBiZSB1c2VkIHRvIHJldHJpZXZlIElPUlQgZGF0YSBpbmZvcm1hdGlvbi4KKwkgKi8K KwlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkX2RhdGEocGRldiwgJm5vZGUsIHNpemVvZihub2Rl KSk7CisJaWYgKHJldCkKKwkJZ290byBkZXZfcHV0OworCisJLyoKKwkgKiBXZSBleHBlY3QgdGhl IGRtYSBtYXNrcyB0byBiZSBlcXVpdmFsZW50IGZvcgorCSAqIGFsbCBTTU1VcyBzZXQtdXBzCisJ ICovCisJcGRldi0+ZGV2LmRtYV9tYXNrID0gJnBkZXYtPmRldi5jb2hlcmVudF9kbWFfbWFzazsK KworCWZ3bm9kZSA9IGlvcnRfZ2V0X2Z3bm9kZShub2RlKTsKKworCWlmICghZndub2RlKSB7CisJ CXJldCA9IC1FTk9ERVY7CisJCWdvdG8gZGV2X3B1dDsKKwl9CisKKwlwZGV2LT5kZXYuZndub2Rl ID0gZndub2RlOworCisJYXR0ciA9IG9wcy0+aW9tbXVfaXNfY29oZXJlbnQobm9kZSkgPworCQkJ ICAgICBERVZfRE1BX0NPSEVSRU5UIDogREVWX0RNQV9OT05fQ09IRVJFTlQ7CisKKwkvKiBDb25m aWd1cmUgRE1BIGZvciB0aGUgcGFnZSB0YWJsZSB3YWxrZXIgKi8KKwlhY3BpX2RtYV9jb25maWd1 cmUoJnBkZXYtPmRldiwgYXR0cik7CisKKwlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKHBkZXYp OworCWlmIChyZXQpCisJCWdvdG8gZG1hX2RlY29uZmlndXJlOworCisJcmV0dXJuIDA7CisKK2Rt YV9kZWNvbmZpZ3VyZToKKwlhY3BpX2RtYV9kZWNvbmZpZ3VyZSgmcGRldi0+ZGV2KTsKK2Rldl9w dXQ6CisJcGxhdGZvcm1fZGV2aWNlX3B1dChwZGV2KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0 YXRpYyB2b2lkIF9faW5pdCBpb3J0X2luaXRfcGxhdGZvcm1fZGV2aWNlcyh2b2lkKQoreworCXN0 cnVjdCBhY3BpX2lvcnRfbm9kZSAqaW9ydF9ub2RlLCAqaW9ydF9lbmQ7CisJc3RydWN0IGFjcGlf dGFibGVfaW9ydCAqaW9ydDsKKwlzdHJ1Y3QgZndub2RlX2hhbmRsZSAqZndub2RlOworCWludCBp LCByZXQ7CisKKwkvKgorCSAqIGlvcnRfdGFibGUgYW5kIGlvcnQgYm90aCBwb2ludCB0byB0aGUg c3RhcnQgb2YgSU9SVCB0YWJsZSwgYnV0CisJICogaGF2ZSBkaWZmZXJlbnQgc3RydWN0IHR5cGVz CisJICovCisJaW9ydCA9IChzdHJ1Y3QgYWNwaV90YWJsZV9pb3J0ICopaW9ydF90YWJsZTsKKwor CS8qIEdldCB0aGUgZmlyc3QgSU9SVCBub2RlICovCisJaW9ydF9ub2RlID0gQUNQSV9BRERfUFRS KHN0cnVjdCBhY3BpX2lvcnRfbm9kZSwgaW9ydCwKKwkJCQkgaW9ydC0+bm9kZV9vZmZzZXQpOwor CWlvcnRfZW5kID0gQUNQSV9BRERfUFRSKHN0cnVjdCBhY3BpX2lvcnRfbm9kZSwgaW9ydCwKKwkJ CQlpb3J0X3RhYmxlLT5sZW5ndGgpOworCisJZm9yIChpID0gMDsgaSA8IGlvcnQtPm5vZGVfY291 bnQ7IGkrKykgeworCQlpZiAoaW9ydF9ub2RlID49IGlvcnRfZW5kKSB7CisJCQlwcl9lcnIoImlv cnQgbm9kZSBwb2ludGVyIG92ZXJmbG93cywgYmFkIHRhYmxlXG4iKTsKKwkJCXJldHVybjsKKwkJ fQorCisJCWlmICgoaW9ydF9ub2RlLT50eXBlID09IEFDUElfSU9SVF9OT0RFX1NNTVUpIHx8CisJ CQkoaW9ydF9ub2RlLT50eXBlID09IEFDUElfSU9SVF9OT0RFX1NNTVVfVjMpKSB7CisKKwkJCWZ3 bm9kZSA9IGFjcGlfYWxsb2NfZndub2RlX3N0YXRpYygpOworCQkJaWYgKCFmd25vZGUpCisJCQkJ cmV0dXJuOworCisJCQlpb3J0X3NldF9md25vZGUoaW9ydF9ub2RlLCBmd25vZGUpOworCisJCQly ZXQgPSBpb3J0X2FkZF9zbW11X3BsYXRmb3JtX2RldmljZShpb3J0X25vZGUpOworCQkJaWYgKHJl dCkgeworCQkJCWlvcnRfZGVsZXRlX2Z3bm9kZShpb3J0X25vZGUpOworCQkJCWFjcGlfZnJlZV9m d25vZGVfc3RhdGljKGZ3bm9kZSk7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisKKwkJaW9ydF9u b2RlID0gQUNQSV9BRERfUFRSKHN0cnVjdCBhY3BpX2lvcnRfbm9kZSwgaW9ydF9ub2RlLAorCQkJ CQkgaW9ydF9ub2RlLT5sZW5ndGgpOworCX0KK30KKwordm9pZCBfX2luaXQgYWNwaV9pb3J0X2lu aXQodm9pZCkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisKKwlzdGF0dXMgPSBhY3BpX2dldF90 YWJsZShBQ1BJX1NJR19JT1JULCAwLCAmaW9ydF90YWJsZSk7CisJaWYgKEFDUElfRkFJTFVSRShz dGF0dXMpKSB7CisJCWlmIChzdGF0dXMgIT0gQUVfTk9UX0ZPVU5EKSB7CisJCQljb25zdCBjaGFy ICptc2cgPSBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKTsKKworCQkJcHJfZXJyKCJGYWls ZWQgdG8gZ2V0IHRhYmxlLCAlc1xuIiwgbXNnKTsKKwkJfQorCisJCXJldHVybjsKKwl9CisKKwlp b3J0X2luaXRfcGxhdGZvcm1fZGV2aWNlcygpOworCisJYWNwaV9wcm9iZV9kZXZpY2VfdGFibGUo aW9ydCk7Cit9CmRpZmYgLS1naXQgYS94ZW4vaW5jbHVkZS9hY3BpL2FjcGlfaW9ydC5oIGIveGVu L2luY2x1ZGUvYWNwaS9hY3BpX2lvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAw MDAwLi43N2UwODA5Ci0tLSAvZGV2L251bGwKKysrIGIveGVuL2luY2x1ZGUvYWNwaS9hY3BpX2lv cnQuaApAQCAtMCwwICsxLDU4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2LCBTZW1paGFs ZgorICoJQXV0aG9yOiBUb21hc3ogTm93aWNraSA8dG5Ac2VtaWhhbGYuY29tPgorICoKKyAqIFRo aXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQv b3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdO VSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkg dGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlz dHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBB TlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFO VEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRo ZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisg KiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJs aWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8g dGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlCisgKiBQbGFjZSAt IFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQS4KKyAqLworCisjaWZuZGVmIF9f QUNQSV9JT1JUX0hfXworI2RlZmluZSBfX0FDUElfSU9SVF9IX18KKworI2luY2x1ZGUgPGxpbnV4 L2FjcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9md25vZGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnFk b21haW4uaD4KKworI2RlZmluZSBJT1JUX0lSUV9NQVNLKGlycSkJCShpcnEgJiAweGZmZmZmZmZm VUxMKQorI2RlZmluZSBJT1JUX0lSUV9UUklHR0VSX01BU0soaXJxKQkoKGlycSA+PiAzMikgJiAw eGZmZmZmZmZmVUxMKQorCitpbnQgaW9ydF9yZWdpc3Rlcl9kb21haW5fdG9rZW4oaW50IHRyYW5z X2lkLCBzdHJ1Y3QgZndub2RlX2hhbmRsZSAqZndfbm9kZSk7Cit2b2lkIGlvcnRfZGVyZWdpc3Rl cl9kb21haW5fdG9rZW4oaW50IHRyYW5zX2lkKTsKK3N0cnVjdCBmd25vZGVfaGFuZGxlICppb3J0 X2ZpbmRfZG9tYWluX3Rva2VuKGludCB0cmFuc19pZCk7CisjaWZkZWYgQ09ORklHX0FDUElfSU9S VAordm9pZCBhY3BpX2lvcnRfaW5pdCh2b2lkKTsKK2Jvb2wgaW9ydF9ub2RlX21hdGNoKHU4IHR5 cGUpOwordTMyIGlvcnRfbXNpX21hcF9yaWQoc3RydWN0IGRldmljZSAqZGV2LCB1MzIgcmVxX2lk KTsKK3N0cnVjdCBpcnFfZG9tYWluICppb3J0X2dldF9kZXZpY2VfZG9tYWluKHN0cnVjdCBkZXZp Y2UgKmRldiwgdTMyIHJlcV9pZCk7CisvKiBJT01NVSBpbnRlcmZhY2UgKi8KK3ZvaWQgaW9ydF9z ZXRfZG1hX21hc2soc3RydWN0IGRldmljZSAqZGV2KTsKK2NvbnN0IHN0cnVjdCBpb21tdV9vcHMg KmlvcnRfaW9tbXVfY29uZmlndXJlKHN0cnVjdCBkZXZpY2UgKmRldik7CisjZWxzZQorc3RhdGlj IGlubGluZSB2b2lkIGFjcGlfaW9ydF9pbml0KHZvaWQpIHsgfQorc3RhdGljIGlubGluZSBib29s IGlvcnRfbm9kZV9tYXRjaCh1OCB0eXBlKSB7IHJldHVybiBmYWxzZTsgfQorc3RhdGljIGlubGlu ZSB1MzIgaW9ydF9tc2lfbWFwX3JpZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHUzMiByZXFfaWQpCit7 IHJldHVybiByZXFfaWQ7IH0KK3N0YXRpYyBpbmxpbmUgc3RydWN0IGlycV9kb21haW4gKmlvcnRf Z2V0X2RldmljZV9kb21haW4oc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkJCXUzMiByZXFfaWQp Cit7IHJldHVybiBOVUxMOyB9CisvKiBJT01NVSBpbnRlcmZhY2UgKi8KK3N0YXRpYyBpbmxpbmUg dm9pZCBpb3J0X3NldF9kbWFfbWFzayhzdHJ1Y3QgZGV2aWNlICpkZXYpIHsgfQorc3RhdGljIGlu bGluZQorY29uc3Qgc3RydWN0IGlvbW11X29wcyAqaW9ydF9pb21tdV9jb25maWd1cmUoc3RydWN0 IGRldmljZSAqZGV2KQoreyByZXR1cm4gTlVMTDsgfQorI2VuZGlmCisKKyNkZWZpbmUgSU9SVF9B Q1BJX0RFQ0xBUkUobmFtZSwgdGFibGVfaWQsIGZuKQkJXAorCUFDUElfREVDTEFSRV9QUk9CRV9F TlRSWShpb3J0LCBuYW1lLCB0YWJsZV9pZCwgMCwgTlVMTCwgMCwgZm4pCisKKyNlbmRpZiAvKiBf X0FDUElfSU9SVF9IX18gKi8KLS0gClF1YWxjb21tIERhdGFjZW50ZXIgVGVjaG5vbG9naWVzIGFz IGFuIGFmZmlsaWF0ZSBvZiBRdWFsY29tbSBUZWNobm9sb2dpZXMsIEluYy4gUXVhbGNvbW0gVGVj aG5vbG9naWVzLCBJbmMuIGlzIGEgbWVtYmVyIG9mIHRoZSBDb2RlIEF1cm9yYSBGb3J1bSwgYSBM aW51eCBGb3VuZGF0aW9uIENvbGxhYm9yYXRpdmUgUHJvamVjdC4KCgpfX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpYZW4tZGV2ZWwgbWFpbGluZyBsaXN0Clhl bi1kZXZlbEBsaXN0cy54ZW4ub3JnCmh0dHBzOi8vbGlzdHMueGVuLm9yZy94ZW4tZGV2ZWwK