From mboxrd@z Thu Jan 1 00:00:00 1970 From: Oleksandr Tyshchenko Subject: [RFC PATCH v1 1/7] iommu/arm: ipmmu-vmsa: Add IPMMU-VMSA support Date: Wed, 26 Jul 2017 18:09:58 +0300 Message-ID: <1501081804-4882-2-git-send-email-olekstysh@gmail.com> References: <1501081804-4882-1-git-send-email-olekstysh@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail6.bemta3.messagelabs.com ([195.245.230.39]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1daNx7-0008N5-GZ for xen-devel@lists.xenproject.org; Wed, 26 Jul 2017 15:10:21 +0000 Received: by mail-lf0-f68.google.com with SMTP id 65so2764421lfa.0 for ; Wed, 26 Jul 2017 08:10:19 -0700 (PDT) In-Reply-To: <1501081804-4882-1-git-send-email-olekstysh@gmail.com> 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 Cc: Oleksandr Tyshchenko , Julien Grall , Stefano Stabellini List-Id: xen-devel@lists.xenproject.org RnJvbTogT2xla3NhbmRyIFR5c2hjaGVua28gPG9sZWtzYW5kcl90eXNoY2hlbmtvQGVwYW0uY29t PgoKSXQgaXMgVk1TQS1jb21wYXRpYmxlIElPTU1VIHRoYXQgaW50ZWdyYXRlZCBpbiB0aGUKbmV3 ZXN0IFJlbmVzYXMgU29DcyAoQVJNKS4gQ29weSBMaW51eCBJUE1NVSBkcml2ZXIgYXMgaXMgZm9y IG5vdy4KTmV4dCBwYXRjaGVzIHdpbGwgc2hvdyB3aGF0IGlzIGdvaW5nIG9uLgoKTGludXggZHJp dmVyIHdhcyB0YWtlbiBoZXJlOgpnaXQ6Ly9naXQua2VybmVsLm9yZy9wdWIvc2NtL2xpbnV4L2tl cm5lbC9naXQvaG9ybXMvcmVuZXNhcy1ic3AuZ2l0IHJjYXItMy41LjMKClNpZ25lZC1vZmYtYnk6 IE9sZWtzYW5kciBUeXNoY2hlbmtvIDxvbGVrc2FuZHJfdHlzaGNoZW5rb0BlcGFtLmNvbT4KQ0M6 IEp1bGllbiBHcmFsbCA8anVsaWVuLmdyYWxsQGFybS5jb20+CkNDOiBTdGVmYW5vIFN0YWJlbGxp bmkgPHNzdGFiZWxsaW5pQGtlcm5lbC5vcmc+Ci0tLQogeGVuL2RyaXZlcnMvcGFzc3Rocm91Z2gv YXJtL2lwbW11LXZtc2EuYyB8IDE2NDcgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCiAx IGZpbGUgY2hhbmdlZCwgMTY0NyBpbnNlcnRpb25zKCspCiBjcmVhdGUgbW9kZSAxMDA2NDQgeGVu L2RyaXZlcnMvcGFzc3Rocm91Z2gvYXJtL2lwbW11LXZtc2EuYwoKZGlmZiAtLWdpdCBhL3hlbi9k cml2ZXJzL3Bhc3N0aHJvdWdoL2FybS9pcG1tdS12bXNhLmMgYi94ZW4vZHJpdmVycy9wYXNzdGhy b3VnaC9hcm0vaXBtbXUtdm1zYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAu LjJiMzgwZmYKLS0tIC9kZXYvbnVsbAorKysgYi94ZW4vZHJpdmVycy9wYXNzdGhyb3VnaC9hcm0v aXBtbXUtdm1zYS5jCkBAIC0wLDAgKzEsMTY0NyBAQAorLyoKKyAqIElQTU1VIFZNU0EKKyAqCisg KiBDb3B5cmlnaHQgKEMpIDIwMTQgUmVuZXNhcyBFbGVjdHJvbmljcyBDb3Jwb3JhdGlvbgorICoK KyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBp dCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFs IFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91 bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxsaW51 eC9iaXRtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2Rt YS1pb21tdS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGlu dXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50 ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pb21tdS5o PgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5j bHVkZSA8bGludXgvb2ZfaW9tbXUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2Uu aD4KKyNpbmNsdWRlIDxsaW51eC9zaXplcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKwor I2lmIGRlZmluZWQoQ09ORklHX0FSTSkgJiYgIWRlZmluZWQoQ09ORklHX0lPTU1VX0RNQSkKKyNp bmNsdWRlIDxhc20vZG1hLWlvbW11Lmg+CisjaW5jbHVkZSA8YXNtL3BnYWxsb2MuaD4KKyNlbmRp ZgorCisjaW5jbHVkZSAiaW8tcGd0YWJsZS5oIgorCisjZGVmaW5lIElQTU1VX0NUWF9NQVggOAor CitzdHJ1Y3QgaXBtbXVfZmVhdHVyZXMgeworCWJvb2wgdXNlX25zX2FsaWFzX29mZnNldDsKKwli b29sIGhhc19jYWNoZV9sZWFmX25vZGVzOworCWJvb2wgaGFzX2VpZ2h0X2N0eDsKKwlib29sIHNl dHVwX2ltYnVzY3I7CisJYm9vbCB0d29iaXRfaW10dGJjcl9zbDA7Cit9OworCisjaWZkZWYgQ09O RklHX1JDQVJfRERSX0JBQ0tVUAorc3RydWN0IGh3X3JlZ2lzdGVyIHsKKwljaGFyICpyZWdfbmFt ZTsKKwl1bnNpZ25lZCBpbnQgcmVnX29mZnNldDsKKwl1bnNpZ25lZCBpbnQgcmVnX2RhdGE7Cit9 OworI2VuZGlmCisKK3N0cnVjdCBpcG1tdV92bXNhX2RldmljZSB7CisJc3RydWN0IGRldmljZSAq ZGV2OworCXZvaWQgX19pb21lbSAqYmFzZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJY29u c3Qgc3RydWN0IGlwbW11X2ZlYXR1cmVzICpmZWF0dXJlczsKKwlib29sIGlzX2xlYWY7CisJdW5z aWduZWQgaW50IG51bV91dGxiczsKKwl1bnNpZ25lZCBpbnQgbnVtX2N0eDsKKwlzcGlubG9ja190 IGxvY2s7CQkJLyogUHJvdGVjdHMgY3R4IGFuZCBkb21haW5zW10gKi8KKwlERUNMQVJFX0JJVE1B UChjdHgsIElQTU1VX0NUWF9NQVgpOworCXN0cnVjdCBpcG1tdV92bXNhX2RvbWFpbiAqZG9tYWlu c1tJUE1NVV9DVFhfTUFYXTsKKyNpZmRlZiBDT05GSUdfUkNBUl9ERFJfQkFDS1VQCisJc3RydWN0 IGh3X3JlZ2lzdGVyICpyZWdfYmFja3VwW0lQTU1VX0NUWF9NQVhdOworI2VuZGlmCisKKwlzdHJ1 Y3QgZG1hX2lvbW11X21hcHBpbmcgKm1hcHBpbmc7Cit9OworCitzdHJ1Y3QgaXBtbXVfdm1zYV9k b21haW4geworCXN0cnVjdCBpcG1tdV92bXNhX2RldmljZSAqbW11OworCXN0cnVjdCBpcG1tdV92 bXNhX2RldmljZSAqcm9vdDsKKwlzdHJ1Y3QgaW9tbXVfZG9tYWluIGlvX2RvbWFpbjsKKworCXN0 cnVjdCBpb19wZ3RhYmxlX2NmZyBjZmc7CisJc3RydWN0IGlvX3BndGFibGVfb3BzICppb3A7CisK Kwl1bnNpZ25lZCBpbnQgY29udGV4dF9pZDsKKwlzcGlubG9ja190IGxvY2s7CQkJLyogUHJvdGVj dHMgbWFwcGluZ3MgKi8KK307CisKK3N0cnVjdCBpcG1tdV92bXNhX2FyY2hkYXRhIHsKKwlzdHJ1 Y3QgaXBtbXVfdm1zYV9kZXZpY2UgKm1tdTsKKwl1bnNpZ25lZCBpbnQgKnV0bGJzOworCXVuc2ln bmVkIGludCBudW1fdXRsYnM7CisJc3RydWN0IGRldmljZSAqZGV2OworCXN0cnVjdCBsaXN0X2hl YWQgbGlzdDsKKyNpZmRlZiBDT05GSUdfUkNBUl9ERFJfQkFDS1VQCisJdW5zaWduZWQgaW50ICp1 dGxic192YWw7CisJdW5zaWduZWQgaW50ICphc2lkc192YWw7CisjZW5kaWYKK307CisKK3N0YXRp YyBERUZJTkVfU1BJTkxPQ0soaXBtbXVfZGV2aWNlc19sb2NrKTsKK3N0YXRpYyBMSVNUX0hFQUQo aXBtbXVfZGV2aWNlcyk7CisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soaXBtbXVfc2xhdmVfZGV2 aWNlc19sb2NrKTsKK3N0YXRpYyBMSVNUX0hFQUQoaXBtbXVfc2xhdmVfZGV2aWNlcyk7CisKK3N0 YXRpYyBzdHJ1Y3QgaXBtbXVfdm1zYV9kb21haW4gKnRvX3Ztc2FfZG9tYWluKHN0cnVjdCBpb21t dV9kb21haW4gKmRvbSkKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKGRvbSwgc3RydWN0IGlwbW11 X3Ztc2FfZG9tYWluLCBpb19kb21haW4pOworfQorCisjaWYgZGVmaW5lZChDT05GSUdfQVJNKSB8 fCBkZWZpbmVkKENPTkZJR19BUk02NCkKK3N0YXRpYyBzdHJ1Y3QgaXBtbXVfdm1zYV9hcmNoZGF0 YSAqdG9fYXJjaGRhdGEoc3RydWN0IGRldmljZSAqZGV2KQoreworCXJldHVybiBkZXYtPmFyY2hk YXRhLmlvbW11OworfQorc3RhdGljIHZvaWQgc2V0X2FyY2hkYXRhKHN0cnVjdCBkZXZpY2UgKmRl diwgc3RydWN0IGlwbW11X3Ztc2FfYXJjaGRhdGEgKnApCit7CisJZGV2LT5hcmNoZGF0YS5pb21t dSA9IHA7Cit9CisjZWxzZQorc3RhdGljIHN0cnVjdCBpcG1tdV92bXNhX2FyY2hkYXRhICp0b19h cmNoZGF0YShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIE5VTEw7Cit9CitzdGF0aWMg dm9pZCBzZXRfYXJjaGRhdGEoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgaXBtbXVfdm1zYV9h cmNoZGF0YSAqcCkKK3sKK30KKyNlbmRpZgorCisjZGVmaW5lIFRMQl9MT09QX1RJTUVPVVQJCTEw MAkvKiAxMDB1cyAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUmVnaXN0ZXJzIERl ZmluaXRpb24KKyAqLworCisjZGVmaW5lIElNX05TX0FMSUFTX09GRlNFVAkJMHg4MDAKKworI2Rl ZmluZSBJTV9DVFhfU0laRQkJCTB4NDAKKworI2RlZmluZSBJTUNUUgkJCQkweDAwMDAKKyNkZWZp bmUgSU1DVFJfVFJFCQkJKDEgPDwgMTcpCisjZGVmaW5lIElNQ1RSX0FGRQkJCSgxIDw8IDE2KQor I2RlZmluZSBJTUNUUl9SVFNFTF9NQVNLCQkoMyA8PCA0KQorI2RlZmluZSBJTUNUUl9SVFNFTF9T SElGVAkJNAorI2RlZmluZSBJTUNUUl9UUkVOCQkJKDEgPDwgMykKKyNkZWZpbmUgSU1DVFJfSU5U RU4JCQkoMSA8PCAyKQorI2RlZmluZSBJTUNUUl9GTFVTSAkJCSgxIDw8IDEpCisjZGVmaW5lIElN Q1RSX01NVUVOCQkJKDEgPDwgMCkKKworI2RlZmluZSBJTUNBQVIJCQkJMHgwMDA0CisKKyNkZWZp bmUgSU1UVEJDUgkJCQkweDAwMDgKKyNkZWZpbmUgSU1UVEJDUl9FQUUJCQkoMSA8PCAzMSkKKyNk ZWZpbmUgSU1UVEJDUl9QTUIJCQkoMSA8PCAzMCkKKyNkZWZpbmUgSU1UVEJDUl9TSDFfTk9OX1NI QVJFQUJMRQkoMCA8PCAyOCkKKyNkZWZpbmUgSU1UVEJDUl9TSDFfT1VURVJfU0hBUkVBQkxFCSgy IDw8IDI4KQorI2RlZmluZSBJTVRUQkNSX1NIMV9JTk5FUl9TSEFSRUFCTEUJKDMgPDwgMjgpCisj ZGVmaW5lIElNVFRCQ1JfU0gxX01BU0sJCSgzIDw8IDI4KQorI2RlZmluZSBJTVRUQkNSX09SR04x X05DCQkoMCA8PCAyNikKKyNkZWZpbmUgSU1UVEJDUl9PUkdOMV9XQl9XQQkJKDEgPDwgMjYpCisj ZGVmaW5lIElNVFRCQ1JfT1JHTjFfV1QJCSgyIDw8IDI2KQorI2RlZmluZSBJTVRUQkNSX09SR04x X1dCCQkoMyA8PCAyNikKKyNkZWZpbmUgSU1UVEJDUl9PUkdOMV9NQVNLCQkoMyA8PCAyNikKKyNk ZWZpbmUgSU1UVEJDUl9JUkdOMV9OQwkJKDAgPDwgMjQpCisjZGVmaW5lIElNVFRCQ1JfSVJHTjFf V0JfV0EJCSgxIDw8IDI0KQorI2RlZmluZSBJTVRUQkNSX0lSR04xX1dUCQkoMiA8PCAyNCkKKyNk ZWZpbmUgSU1UVEJDUl9JUkdOMV9XQgkJKDMgPDwgMjQpCisjZGVmaW5lIElNVFRCQ1JfSVJHTjFf TUFTSwkJKDMgPDwgMjQpCisjZGVmaW5lIElNVFRCQ1JfVFNaMV9NQVNLCQkoNyA8PCAxNikKKyNk ZWZpbmUgSU1UVEJDUl9UU1oxX1NISUZUCQkxNgorI2RlZmluZSBJTVRUQkNSX1NIMF9OT05fU0hB UkVBQkxFCSgwIDw8IDEyKQorI2RlZmluZSBJTVRUQkNSX1NIMF9PVVRFUl9TSEFSRUFCTEUJKDIg PDwgMTIpCisjZGVmaW5lIElNVFRCQ1JfU0gwX0lOTkVSX1NIQVJFQUJMRQkoMyA8PCAxMikKKyNk ZWZpbmUgSU1UVEJDUl9TSDBfTUFTSwkJKDMgPDwgMTIpCisjZGVmaW5lIElNVFRCQ1JfT1JHTjBf TkMJCSgwIDw8IDEwKQorI2RlZmluZSBJTVRUQkNSX09SR04wX1dCX1dBCQkoMSA8PCAxMCkKKyNk ZWZpbmUgSU1UVEJDUl9PUkdOMF9XVAkJKDIgPDwgMTApCisjZGVmaW5lIElNVFRCQ1JfT1JHTjBf V0IJCSgzIDw8IDEwKQorI2RlZmluZSBJTVRUQkNSX09SR04wX01BU0sJCSgzIDw8IDEwKQorI2Rl ZmluZSBJTVRUQkNSX0lSR04wX05DCQkoMCA8PCA4KQorI2RlZmluZSBJTVRUQkNSX0lSR04wX1dC X1dBCQkoMSA8PCA4KQorI2RlZmluZSBJTVRUQkNSX0lSR04wX1dUCQkoMiA8PCA4KQorI2RlZmlu ZSBJTVRUQkNSX0lSR04wX1dCCQkoMyA8PCA4KQorI2RlZmluZSBJTVRUQkNSX0lSR04wX01BU0sJ CSgzIDw8IDgpCisjZGVmaW5lIElNVFRCQ1JfU0wwX0xWTF8yCQkoMCA8PCA0KQorI2RlZmluZSBJ TVRUQkNSX1NMMF9MVkxfMQkJKDEgPDwgNCkKKyNkZWZpbmUgSU1UVEJDUl9UU1owX01BU0sJCSg3 IDw8IDApCisjZGVmaW5lIElNVFRCQ1JfVFNaMF9TSElGVAkJTworCisjZGVmaW5lIElNVFRCQ1Jf U0wwX1RXT0JJVF9MVkxfMwkoMCA8PCA2KQorI2RlZmluZSBJTVRUQkNSX1NMMF9UV09CSVRfTFZM XzIJKDEgPDwgNikKKyNkZWZpbmUgSU1UVEJDUl9TTDBfVFdPQklUX0xWTF8xCSgyIDw8IDYpCisK KyNkZWZpbmUgSU1CVVNDUgkJCQkweDAwMGMKKyNkZWZpbmUgSU1CVVNDUl9EVk0JCQkoMSA8PCAy KQorI2RlZmluZSBJTUJVU0NSX0JVU1NFTF9TWVMJCSgwIDw8IDApCisjZGVmaW5lIElNQlVTQ1Jf QlVTU0VMX0NDSQkJKDEgPDwgMCkKKyNkZWZpbmUgSU1CVVNDUl9CVVNTRUxfSU1DQUFSCQkoMiA8 PCAwKQorI2RlZmluZSBJTUJVU0NSX0JVU1NFTF9DQ0lfSU1DQUFSCSgzIDw8IDApCisjZGVmaW5l IElNQlVTQ1JfQlVTU0VMX01BU0sJCSgzIDw8IDApCisKKyNkZWZpbmUgSU1UVExCUjAJCQkweDAw MTAKKyNkZWZpbmUgSU1UVFVCUjAJCQkweDAwMTQKKyNkZWZpbmUgSU1UVExCUjEJCQkweDAwMTgK KyNkZWZpbmUgSU1UVFVCUjEJCQkweDAwMWMKKworI2RlZmluZSBJTVNUUgkJCQkweDAwMjAKKyNk ZWZpbmUgSU1TVFJfRVJSTFZMX01BU0sJCSgzIDw8IDEyKQorI2RlZmluZSBJTVNUUl9FUlJMVkxf U0hJRlQJCTEyCisjZGVmaW5lIElNU1RSX0VSUkNPREVfVExCX0ZPUk1BVAkoMSA8PCA4KQorI2Rl ZmluZSBJTVNUUl9FUlJDT0RFX0FDQ0VTU19QRVJNCSg0IDw8IDgpCisjZGVmaW5lIElNU1RSX0VS UkNPREVfU0VDVVJFX0FDQ0VTUwkoNSA8PCA4KQorI2RlZmluZSBJTVNUUl9FUlJDT0RFX01BU0sJ CSg3IDw8IDgpCisjZGVmaW5lIElNU1RSX01ISVQJCQkoMSA8PCA0KQorI2RlZmluZSBJTVNUUl9B Qk9SVAkJCSgxIDw8IDIpCisjZGVmaW5lIElNU1RSX1BGCQkJKDEgPDwgMSkKKyNkZWZpbmUgSU1T VFJfVEYJCQkoMSA8PCAwKQorCisjZGVmaW5lIElNTUFJUjAJCQkJMHgwMDI4CisjZGVmaW5lIElN TUFJUjEJCQkJMHgwMDJjCisjZGVmaW5lIElNTUFJUl9BVFRSX01BU0sJCTB4ZmYKKyNkZWZpbmUg SU1NQUlSX0FUVFJfREVWSUNFCQkweDA0CisjZGVmaW5lIElNTUFJUl9BVFRSX05DCQkJMHg0NAor I2RlZmluZSBJTU1BSVJfQVRUUl9XQlJXQQkJMHhmZgorI2RlZmluZSBJTU1BSVJfQVRUUl9TSElG VChuKQkJKChuKSA8PCAzKQorI2RlZmluZSBJTU1BSVJfQVRUUl9JRFhfTkMJCTAKKyNkZWZpbmUg SU1NQUlSX0FUVFJfSURYX1dCUldBCQkxCisjZGVmaW5lIElNTUFJUl9BVFRSX0lEWF9ERVYJCTIK KworI2RlZmluZSBJTUVBUgkJCQkweDAwMzAKKworI2RlZmluZSBJTVBDVFIJCQkJMHgwMjAwCisj ZGVmaW5lIElNUFNUUgkJCQkweDAyMDgKKyNkZWZpbmUgSU1QRUFSCQkJCTB4MDIwYworI2RlZmlu ZSBJTVBNQkEobikJCQkoMHgwMjgwICsgKChuKSAqIDQpKQorI2RlZmluZSBJTVBNQkQobikJCQko MHgwMmMwICsgKChuKSAqIDQpKQorCisjZGVmaW5lIElNVUNUUihuKQkJCSgweDAzMDAgKyAoKG4p ICogMTYpKQorI2RlZmluZSBJTVVDVFIyKG4pCQkJKDB4MDYwMCArICgobikgKiAxNikpCisjZGVm aW5lIElNVUNUUl9GSVhBRERFTgkJCSgxIDw8IDMxKQorI2RlZmluZSBJTVVDVFJfRklYQUREX01B U0sJCSgweGZmIDw8IDE2KQorI2RlZmluZSBJTVVDVFJfRklYQUREX1NISUZUCQkxNgorI2RlZmlu ZSBJTVVDVFJfVFRTRUxfTU1VKG4pCQkoKG4pIDw8IDQpCisjZGVmaW5lIElNVUNUUl9UVFNFTF9Q TUIJCSg4IDw8IDQpCisjZGVmaW5lIElNVUNUUl9UVFNFTF9NQVNLCQkoMTUgPDwgNCkKKyNkZWZp bmUgSU1VQ1RSX0ZMVVNICQkJKDEgPDwgMSkKKyNkZWZpbmUgSU1VQ1RSX01NVUVOCQkJKDEgPDwg MCkKKworI2RlZmluZSBJTVVBU0lEKG4pCQkJKDB4MDMwOCArICgobikgKiAxNikpCisjZGVmaW5l IElNVUFTSUQyKG4pCQkJKDB4MDYwOCArICgobikgKiAxNikpCisjZGVmaW5lIElNVUFTSURfQVNJ RDhfTUFTSwkJKDB4ZmYgPDwgOCkKKyNkZWZpbmUgSU1VQVNJRF9BU0lEOF9TSElGVAkJOAorI2Rl ZmluZSBJTVVBU0lEX0FTSUQwX01BU0sJCSgweGZmIDw8IDApCisjZGVmaW5lIElNVUFTSURfQVNJ RDBfU0hJRlQJCTAKKworI2lmZGVmIENPTkZJR19SQ0FSX0REUl9CQUNLVVAKKyNkZWZpbmUgSFdf UkVHSVNURVJfQkFDS1VQX1NJWkUJCUFSUkFZX1NJWkUocm9vdF9wZ3RhYmxlMF9yZWcpCitzdGF0 aWMgc3RydWN0IGh3X3JlZ2lzdGVyIHJvb3RfcGd0YWJsZTBfcmVnW10gPSB7CisJeyJJTVRUTEJS MCIsCUlNVFRMQlIwLAkwfSwKKwl7IklNVFRVQlIwIiwJSU1UVFVCUjAsCTB9LAorCXsiSU1UVEJD UiIsCUlNVFRCQ1IsCTB9LAorCXsiSU1UVExCUjEiLAlJTVRUTEJSMSwJMH0sCisJeyJJTVRUVUJS MSIsCUlNVFRVQlIxLAkwfSwKKwl7IklNTUFJUjAiLAlJTU1BSVIwLAkwfSwKKwl7IklNTUFJUjEi LAlJTU1BSVIxLAkwfSwKKwl7IklNQ1RSIiwJSU1DVFIsCQkwfSwKK307CisKK3N0YXRpYyBzdHJ1 Y3QgaHdfcmVnaXN0ZXIgcm9vdF9wZ3RhYmxlMV9yZWdbXSA9IHsKKwl7IklNVFRMQlIwIiwJSU1U VExCUjAsCTB9LAorCXsiSU1UVFVCUjAiLAlJTVRUVUJSMCwJMH0sCisJeyJJTVRUQkNSIiwJSU1U VEJDUiwJMH0sCisJeyJJTVRUTEJSMSIsCUlNVFRMQlIxLAkwfSwKKwl7IklNVFRVQlIxIiwJSU1U VFVCUjEsCTB9LAorCXsiSU1NQUlSMCIsCUlNTUFJUjAsCTB9LAorCXsiSU1NQUlSMSIsCUlNTUFJ UjEsCTB9LAorCXsiSU1DVFIiLAlJTUNUUiwJCTB9LAorfTsKKworc3RhdGljIHN0cnVjdCBod19y ZWdpc3RlciByb290X3BndGFibGUyX3JlZ1tdID0geworCXsiSU1UVExCUjAiLAlJTVRUTEJSMCwJ MH0sCisJeyJJTVRUVUJSMCIsCUlNVFRVQlIwLAkwfSwKKwl7IklNVFRCQ1IiLAlJTVRUQkNSLAkw fSwKKwl7IklNVFRMQlIxIiwJSU1UVExCUjEsCTB9LAorCXsiSU1UVFVCUjEiLAlJTVRUVUJSMSwJ MH0sCisJeyJJTU1BSVIwIiwJSU1NQUlSMCwJMH0sCisJeyJJTU1BSVIxIiwJSU1NQUlSMSwJMH0s CisJeyJJTUNUUiIsCUlNQ1RSLAkJMH0sCit9OworCitzdGF0aWMgc3RydWN0IGh3X3JlZ2lzdGVy IHJvb3RfcGd0YWJsZTNfcmVnW10gPSB7CisJeyJJTVRUTEJSMCIsCUlNVFRMQlIwLAkwfSwKKwl7 IklNVFRVQlIwIiwJSU1UVFVCUjAsCTB9LAorCXsiSU1UVEJDUiIsCUlNVFRCQ1IsCTB9LAorCXsi SU1UVExCUjEiLAlJTVRUTEJSMSwJMH0sCisJeyJJTVRUVUJSMSIsCUlNVFRVQlIxLAkwfSwKKwl7 IklNTUFJUjAiLAlJTU1BSVIwLAkwfSwKKwl7IklNTUFJUjEiLAlJTU1BSVIxLAkwfSwKKwl7IklN Q1RSIiwJSU1DVFIsCQkwfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaHdfcmVnaXN0ZXIgcm9vdF9w Z3RhYmxlNF9yZWdbXSA9IHsKKwl7IklNVFRMQlIwIiwJSU1UVExCUjAsCTB9LAorCXsiSU1UVFVC UjAiLAlJTVRUVUJSMCwJMH0sCisJeyJJTVRUQkNSIiwJSU1UVEJDUiwJMH0sCisJeyJJTVRUTEJS MSIsCUlNVFRMQlIxLAkwfSwKKwl7IklNVFRVQlIxIiwJSU1UVFVCUjEsCTB9LAorCXsiSU1NQUlS MCIsCUlNTUFJUjAsCTB9LAorCXsiSU1NQUlSMSIsCUlNTUFJUjEsCTB9LAorCXsiSU1DVFIiLAlJ TUNUUiwJCTB9LAorfTsKKworc3RhdGljIHN0cnVjdCBod19yZWdpc3RlciByb290X3BndGFibGU1 X3JlZ1tdID0geworCXsiSU1UVExCUjAiLAlJTVRUTEJSMCwJMH0sCisJeyJJTVRUVUJSMCIsCUlN VFRVQlIwLAkwfSwKKwl7IklNVFRCQ1IiLAlJTVRUQkNSLAkwfSwKKwl7IklNVFRMQlIxIiwJSU1U VExCUjEsCTB9LAorCXsiSU1UVFVCUjEiLAlJTVRUVUJSMSwJMH0sCisJeyJJTU1BSVIwIiwJSU1N QUlSMCwJMH0sCisJeyJJTU1BSVIxIiwJSU1NQUlSMSwJMH0sCisJeyJJTUNUUiIsCUlNQ1RSLAkJ MH0sCit9OworCitzdGF0aWMgc3RydWN0IGh3X3JlZ2lzdGVyIHJvb3RfcGd0YWJsZTZfcmVnW10g PSB7CisJeyJJTVRUTEJSMCIsCUlNVFRMQlIwLAkwfSwKKwl7IklNVFRVQlIwIiwJSU1UVFVCUjAs CTB9LAorCXsiSU1UVEJDUiIsCUlNVFRCQ1IsCTB9LAorCXsiSU1UVExCUjEiLAlJTVRUTEJSMSwJ MH0sCisJeyJJTVRUVUJSMSIsCUlNVFRVQlIxLAkwfSwKKwl7IklNTUFJUjAiLAlJTU1BSVIwLAkw fSwKKwl7IklNTUFJUjEiLAlJTU1BSVIxLAkwfSwKKwl7IklNQ1RSIiwJSU1DVFIsCQkwfSwKK307 CisKK3N0YXRpYyBzdHJ1Y3QgaHdfcmVnaXN0ZXIgcm9vdF9wZ3RhYmxlN19yZWdbXSA9IHsKKwl7 IklNVFRMQlIwIiwJSU1UVExCUjAsCTB9LAorCXsiSU1UVFVCUjAiLAlJTVRUVUJSMCwJMH0sCisJ eyJJTVRUQkNSIiwJSU1UVEJDUiwJMH0sCisJeyJJTVRUTEJSMSIsCUlNVFRMQlIxLAkwfSwKKwl7 IklNVFRVQlIxIiwJSU1UVFVCUjEsCTB9LAorCXsiSU1NQUlSMCIsCUlNTUFJUjAsCTB9LAorCXsi SU1NQUlSMSIsCUlNTUFJUjEsCTB9LAorCXsiSU1DVFIiLAlJTUNUUiwJCTB9LAorfTsKKworc3Rh dGljIHN0cnVjdCBod19yZWdpc3RlciAqcm9vdF9wZ3RhYmxlW0lQTU1VX0NUWF9NQVhdID0gewor CXJvb3RfcGd0YWJsZTBfcmVnLAorCXJvb3RfcGd0YWJsZTFfcmVnLAorCXJvb3RfcGd0YWJsZTJf cmVnLAorCXJvb3RfcGd0YWJsZTNfcmVnLAorCXJvb3RfcGd0YWJsZTRfcmVnLAorCXJvb3RfcGd0 YWJsZTVfcmVnLAorCXJvb3RfcGd0YWJsZTZfcmVnLAorCXJvb3RfcGd0YWJsZTdfcmVnLAorfTsK KworI2VuZGlmCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUm9vdCBkZXZpY2UgaGFuZGxp bmcKKyAqLworCitzdGF0aWMgYm9vbCBpcG1tdV9pc19yb290KHN0cnVjdCBpcG1tdV92bXNhX2Rl dmljZSAqbW11KQoreworCWlmIChtbXUtPmZlYXR1cmVzLT5oYXNfY2FjaGVfbGVhZl9ub2RlcykK KwkJcmV0dXJuIG1tdS0+aXNfbGVhZiA/IGZhbHNlIDogdHJ1ZTsKKwllbHNlCisJCXJldHVybiB0 cnVlOyAvKiBvbGRlciBJUE1NVSBoYXJkd2FyZSB0cmVhdGVkIGFzIHNpbmdsZSByb290ICovCit9 CisKK3N0YXRpYyBzdHJ1Y3QgaXBtbXVfdm1zYV9kZXZpY2UgKmlwbW11X2ZpbmRfcm9vdChzdHJ1 Y3QgaXBtbXVfdm1zYV9kZXZpY2UgKmxlYWYpCit7CisJc3RydWN0IGlwbW11X3Ztc2FfZGV2aWNl ICptbXUgPSBOVUxMOworCisJaWYgKGlwbW11X2lzX3Jvb3QobGVhZikpCisJCXJldHVybiBsZWFm OworCisJc3Bpbl9sb2NrKCZpcG1tdV9kZXZpY2VzX2xvY2spOworCisJbGlzdF9mb3JfZWFjaF9l bnRyeShtbXUsICZpcG1tdV9kZXZpY2VzLCBsaXN0KSB7CisJCWlmIChpcG1tdV9pc19yb290KG1t dSkpCisJCQlicmVhazsKKwl9CisKKwlzcGluX3VubG9jaygmaXBtbXVfZGV2aWNlc19sb2NrKTsK KwlyZXR1cm4gbW11OworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUmVhZC9Xcml0 ZSBBY2Nlc3MKKyAqLworCitzdGF0aWMgdTMyIGlwbW11X3JlYWQoc3RydWN0IGlwbW11X3Ztc2Ff ZGV2aWNlICptbXUsIHVuc2lnbmVkIGludCBvZmZzZXQpCit7CisJcmV0dXJuIGlvcmVhZDMyKG1t dS0+YmFzZSArIG9mZnNldCk7Cit9CisKK3N0YXRpYyB2b2lkIGlwbW11X3dyaXRlKHN0cnVjdCBp cG1tdV92bXNhX2RldmljZSAqbW11LCB1bnNpZ25lZCBpbnQgb2Zmc2V0LAorCQkJdTMyIGRhdGEp Cit7CisJaW93cml0ZTMyKGRhdGEsIG1tdS0+YmFzZSArIG9mZnNldCk7Cit9CisKK3N0YXRpYyB1 MzIgaXBtbXVfY3R4X3JlYWQoc3RydWN0IGlwbW11X3Ztc2FfZG9tYWluICpkb21haW4sIHVuc2ln bmVkIGludCByZWcpCit7CisJcmV0dXJuIGlwbW11X3JlYWQoZG9tYWluLT5yb290LCBkb21haW4t PmNvbnRleHRfaWQgKiBJTV9DVFhfU0laRSArIHJlZyk7Cit9CisKK3N0YXRpYyB2b2lkIGlwbW11 X2N0eF93cml0ZShzdHJ1Y3QgaXBtbXVfdm1zYV9kb21haW4gKmRvbWFpbiwgdW5zaWduZWQgaW50 IHJlZywKKwkJCSAgICB1MzIgZGF0YSkKK3sKKwlpcG1tdV93cml0ZShkb21haW4tPnJvb3QsIGRv bWFpbi0+Y29udGV4dF9pZCAqIElNX0NUWF9TSVpFICsgcmVnLCBkYXRhKTsKK30KKworc3RhdGlj IHZvaWQgaXBtbXVfY3R4X3dyaXRlMihzdHJ1Y3QgaXBtbXVfdm1zYV9kb21haW4gKmRvbWFpbiwg dW5zaWduZWQgaW50IHJlZywKKwkJCSAgICAgdTMyIGRhdGEpCit7CisJaWYgKGRvbWFpbi0+bW11 ICE9IGRvbWFpbi0+cm9vdCkKKwkJaXBtbXVfd3JpdGUoZG9tYWluLT5tbXUsCisJCQkgICAgZG9t YWluLT5jb250ZXh0X2lkICogSU1fQ1RYX1NJWkUgKyByZWcsIGRhdGEpOworCisJaXBtbXVfd3Jp dGUoZG9tYWluLT5yb290LCBkb21haW4tPmNvbnRleHRfaWQgKiBJTV9DVFhfU0laRSArIHJlZywg ZGF0YSk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBUTEIgYW5kIG1pY3JvVExC IE1hbmFnZW1lbnQKKyAqLworCisvKiBXYWl0IGZvciBhbnkgcGVuZGluZyBUTEIgaW52YWxpZGF0 aW9ucyB0byBjb21wbGV0ZSAqLworc3RhdGljIHZvaWQgaXBtbXVfdGxiX3N5bmMoc3RydWN0IGlw bW11X3Ztc2FfZG9tYWluICpkb21haW4pCit7CisJdW5zaWduZWQgaW50IGNvdW50ID0gMDsKKwor CXdoaWxlIChpcG1tdV9jdHhfcmVhZChkb21haW4sIElNQ1RSKSAmIElNQ1RSX0ZMVVNIKSB7CisJ CWNwdV9yZWxheCgpOworCQlpZiAoKytjb3VudCA9PSBUTEJfTE9PUF9USU1FT1VUKSB7CisJCQlk ZXZfZXJyX3JhdGVsaW1pdGVkKGRvbWFpbi0+bW11LT5kZXYsCisJCQkiVExCIHN5bmMgdGltZWQg b3V0IC0tIE1NVSBtYXkgYmUgZGVhZGxvY2tlZFxuIik7CisJCQlyZXR1cm47CisJCX0KKwkJdWRl bGF5KDEpOworCX0KK30KKworc3RhdGljIHZvaWQgaXBtbXVfdGxiX2ludmFsaWRhdGUoc3RydWN0 IGlwbW11X3Ztc2FfZG9tYWluICpkb21haW4pCit7CisJdTMyIHJlZzsKKworCXJlZyA9IGlwbW11 X2N0eF9yZWFkKGRvbWFpbiwgSU1DVFIpOworCXJlZyB8PSBJTUNUUl9GTFVTSDsKKwlpcG1tdV9j dHhfd3JpdGUyKGRvbWFpbiwgSU1DVFIsIHJlZyk7CisKKwlpcG1tdV90bGJfc3luYyhkb21haW4p OworfQorCisvKgorICogRW5hYmxlIE1NVSB0cmFuc2xhdGlvbiBmb3IgdGhlIG1pY3JvVExCLgor ICovCitzdGF0aWMgdm9pZCBpcG1tdV91dGxiX2VuYWJsZShzdHJ1Y3QgaXBtbXVfdm1zYV9kb21h aW4gKmRvbWFpbiwKKwkJCSAgICAgIHVuc2lnbmVkIGludCB1dGxiKQoreworCXN0cnVjdCBpcG1t dV92bXNhX2RldmljZSAqbW11ID0gZG9tYWluLT5tbXU7CisJdW5zaWduZWQgaW50IG9mZnNldDsK KworCS8qCisJICogVE9ETzogUmVmZXJlbmNlLWNvdW50IHRoZSBtaWNyb1RMQiBhcyBzZXZlcmFs IGJ1cyBtYXN0ZXJzIGNhbiBiZQorCSAqIGNvbm5lY3RlZCB0byB0aGUgc2FtZSBtaWNyb1RMQi4K KwkgKi8KKworCS8qIFRPRE86IFdoYXQgc2hvdWxkIHdlIHNldCB0aGUgQVNJRCB0byA/ICovCisJ b2Zmc2V0ID0gKHV0bGIgPCAzMikgPyBJTVVBU0lEKHV0bGIpIDogSU1VQVNJRDIodXRsYiAtIDMy KTsKKwlpcG1tdV93cml0ZShtbXUsIG9mZnNldCwgMCk7CisKKwkvKiBUT0RPOiBEbyB3ZSBuZWVk IHRvIGZsdXNoIHRoZSBtaWNyb1RMQiA/ICovCisJb2Zmc2V0ID0gKHV0bGIgPCAzMikgPyBJTVVD VFIodXRsYikgOiBJTVVDVFIyKHV0bGIgLSAzMik7CisJaXBtbXVfd3JpdGUobW11LCBvZmZzZXQs CisJCSAgICBJTVVDVFJfVFRTRUxfTU1VKGRvbWFpbi0+Y29udGV4dF9pZCkgfCBJTVVDVFJfRkxV U0ggfAorCQkgICAgSU1VQ1RSX01NVUVOKTsKK30KKworLyoKKyAqIERpc2FibGUgTU1VIHRyYW5z bGF0aW9uIGZvciB0aGUgbWljcm9UTEIuCisgKi8KK3N0YXRpYyB2b2lkIGlwbW11X3V0bGJfZGlz YWJsZShzdHJ1Y3QgaXBtbXVfdm1zYV9kb21haW4gKmRvbWFpbiwKKwkJCSAgICAgICB1bnNpZ25l ZCBpbnQgdXRsYikKK3sKKwlzdHJ1Y3QgaXBtbXVfdm1zYV9kZXZpY2UgKm1tdSA9IGRvbWFpbi0+ bW11OworCXVuc2lnbmVkIGludCBvZmZzZXQ7CisKKwlvZmZzZXQgPSAodXRsYiA8IDMyKSA/IElN VUNUUih1dGxiKSA6IElNVUNUUjIodXRsYiAtIDMyKTsKKwlpcG1tdV93cml0ZShtbXUsIG9mZnNl dCwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGlwbW11X3RsYl9mbHVzaF9hbGwodm9pZCAqY29va2ll KQoreworCXN0cnVjdCBpcG1tdV92bXNhX2RvbWFpbiAqZG9tYWluID0gY29va2llOworCisJaXBt bXVfdGxiX2ludmFsaWRhdGUoZG9tYWluKTsKK30KKworc3RhdGljIHZvaWQgaXBtbXVfdGxiX2Fk ZF9mbHVzaCh1bnNpZ25lZCBsb25nIGlvdmEsIHNpemVfdCBzaXplLAorCQkJCXNpemVfdCBncmFu dWxlLCBib29sIGxlYWYsIHZvaWQgKmNvb2tpZSkKK3sKKwkvKiBUaGUgaGFyZHdhcmUgZG9lc24n dCBzdXBwb3J0IHNlbGVjdGl2ZSBUTEIgZmx1c2guICovCit9CisKK3N0YXRpYyBzdHJ1Y3QgaW9t bXVfZ2F0aGVyX29wcyBpcG1tdV9nYXRoZXJfb3BzID0geworCS50bGJfZmx1c2hfYWxsID0gaXBt bXVfdGxiX2ZsdXNoX2FsbCwKKwkudGxiX2FkZF9mbHVzaCA9IGlwbW11X3RsYl9hZGRfZmx1c2gs CisJLnRsYl9zeW5jID0gaXBtbXVfdGxiX2ZsdXNoX2FsbCwKK307CisKKy8qIC0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tCisgKiBEb21haW4vQ29udGV4dCBNYW5hZ2VtZW50CisgKi8KKworc3RhdGljIGlu dCBpcG1tdV9kb21haW5fYWxsb2NhdGVfY29udGV4dChzdHJ1Y3QgaXBtbXVfdm1zYV9kZXZpY2Ug Km1tdSwKKwkJCQkJIHN0cnVjdCBpcG1tdV92bXNhX2RvbWFpbiAqZG9tYWluKQoreworCXVuc2ln bmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZtbXUtPmxv Y2ssIGZsYWdzKTsKKworCXJldCA9IGZpbmRfZmlyc3RfemVyb19iaXQobW11LT5jdHgsIG1tdS0+ bnVtX2N0eCk7CisJaWYgKHJldCAhPSBtbXUtPm51bV9jdHgpIHsKKwkJbW11LT5kb21haW5zW3Jl dF0gPSBkb21haW47CisJCXNldF9iaXQocmV0LCBtbXUtPmN0eCk7CisJfSBlbHNlCisJCXJldCA9 IC1FQlVTWTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1tdS0+bG9jaywgZmxhZ3MpOwor CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBpcG1tdV9kb21haW5faW5pdF9jb250ZXh0 KHN0cnVjdCBpcG1tdV92bXNhX2RvbWFpbiAqZG9tYWluKQoreworCXU2NCB0dGJyOworCXUzMiB0 bXA7CisJaW50IHJldDsKKworCS8qCisJICogQWxsb2NhdGUgdGhlIHBhZ2UgdGFibGUgb3BlcmF0 aW9ucy4KKwkgKgorCSAqIFZNU0Egc3RhdGVzIGluIHNlY3Rpb24gQjMuNi4zICJDb250cm9sIG9m IFNlY3VyZSBvciBOb24tc2VjdXJlIG1lbW9yeQorCSAqIGFjY2VzcywgTG9uZy1kZXNjcmlwdG9y IGZvcm1hdCIgdGhhdCB0aGUgTlN0YWJsZSBiaXQgYmVpbmcgc2V0IGluIGEKKwkgKiB0YWJsZSBk ZXNjcmlwdG9yIHdpbGwgcmVzdWx0IGluIHRoZSBOU3RhYmxlIGFuZCBOUyBiaXRzIG9mIGFsbCBj aGlsZAorCSAqIGVudHJpZXMgYmVpbmcgaWdub3JlZCBhbmQgY29uc2lkZXJlZCBhcyBiZWluZyBz ZXQuIFRoZSBJUE1NVSBzZWVtcworCSAqIG5vdCB0byBjb21wbHkgd2l0aCB0aGlzLCBhcyBpdCBn ZW5lcmF0ZXMgYSBzZWN1cmUgYWNjZXNzIHBhZ2UgZmF1bHQKKwkgKiBpZiBhbnkgb2YgdGhlIE5T dGFibGUgYW5kIE5TIGJpdHMgaXNuJ3Qgc2V0IHdoZW4gcnVubmluZyBpbgorCSAqIG5vbi1zZWN1 cmUgbW9kZS4KKwkgKi8KKwlkb21haW4tPmNmZy5xdWlya3MgPSBJT19QR1RBQkxFX1FVSVJLX0FS TV9OUzsKKwlkb21haW4tPmNmZy5wZ3NpemVfYml0bWFwID0gU1pfMUcgfCBTWl8yTSB8IFNaXzRL LAorCWRvbWFpbi0+Y2ZnLmlhcyA9IDMyOworCWRvbWFpbi0+Y2ZnLm9hcyA9IDQwOworCWRvbWFp bi0+Y2ZnLnRsYiA9ICZpcG1tdV9nYXRoZXJfb3BzOworCWRvbWFpbi0+aW9fZG9tYWluLmdlb21l dHJ5LmFwZXJ0dXJlX2VuZCA9IERNQV9CSVRfTUFTSygzMik7CisJZG9tYWluLT5pb19kb21haW4u Z2VvbWV0cnkuZm9yY2VfYXBlcnR1cmUgPSB0cnVlOworCS8qCisJICogVE9ETzogQWRkIHN1cHBv cnQgZm9yIGNvaGVyZW50IHdhbGsgdGhyb3VnaCBDQ0kgd2l0aCBEVk0gYW5kIHJlbW92ZQorCSAq IGNhY2hlIGhhbmRsaW5nLiBGb3Igbm93LCBkZWxlZ2F0ZSBpdCB0byB0aGUgaW8tcGd0YWJsZSBj b2RlLgorCSAqLworCWRvbWFpbi0+Y2ZnLmlvbW11X2RldiA9IGRvbWFpbi0+cm9vdC0+ZGV2Owor CisJZG9tYWluLT5pb3AgPSBhbGxvY19pb19wZ3RhYmxlX29wcyhBUk1fMzJfTFBBRV9TMSwgJmRv bWFpbi0+Y2ZnLAorCQkJCQkgICBkb21haW4pOworCWlmICghZG9tYWluLT5pb3ApCisJCXJldHVy biAtRUlOVkFMOworCisJLyoKKwkgKiBGaW5kIGFuIHVudXNlZCBjb250ZXh0LgorCSAqLworCXJl dCA9IGlwbW11X2RvbWFpbl9hbGxvY2F0ZV9jb250ZXh0KGRvbWFpbi0+cm9vdCwgZG9tYWluKTsK KwlpZiAocmV0IDwgMCkgeworCQlmcmVlX2lvX3BndGFibGVfb3BzKGRvbWFpbi0+aW9wKTsKKwkJ cmV0dXJuIHJldDsKKwl9CisKKwlkb21haW4tPmNvbnRleHRfaWQgPSByZXQ7CisjaWZkZWYgQ09O RklHX1JDQVJfRERSX0JBQ0tVUAorCWRvbWFpbi0+cm9vdC0+cmVnX2JhY2t1cFtyZXRdID0gcm9v dF9wZ3RhYmxlW3JldF07CisjZW5kaWYKKworCS8qIFRUQlIwICovCisJdHRiciA9IGRvbWFpbi0+ Y2ZnLmFybV9scGFlX3MxX2NmZy50dGJyWzBdOworCWlwbW11X2N0eF93cml0ZShkb21haW4sIElN VFRMQlIwLCB0dGJyKTsKKwlpcG1tdV9jdHhfd3JpdGUoZG9tYWluLCBJTVRUVUJSMCwgdHRiciA+ PiAzMik7CisKKwkvKgorCSAqIFRUQkNSCisJICogV2UgdXNlIGxvbmcgZGVzY3JpcHRvcnMgd2l0 aCBpbm5lci1zaGFyZWFibGUgV0JXQSB0YWJsZXMgYW5kIGFsbG9jYXRlCisJICogdGhlIHdob2xl IDMyLWJpdCBWQSBzcGFjZSB0byBUVEJSMC4KKwkgKi8KKworCWlmIChkb21haW4tPnJvb3QtPmZl YXR1cmVzLT50d29iaXRfaW10dGJjcl9zbDApCisJCXRtcCA9IElNVFRCQ1JfU0wwX1RXT0JJVF9M VkxfMTsKKwllbHNlCisJCXRtcCA9IElNVFRCQ1JfU0wwX0xWTF8xOworCisJaXBtbXVfY3R4X3dy aXRlKGRvbWFpbiwgSU1UVEJDUiwgSU1UVEJDUl9FQUUgfAorCQkJSU1UVEJDUl9TSDBfSU5ORVJf U0hBUkVBQkxFIHwgSU1UVEJDUl9PUkdOMF9XQl9XQSB8CisJCQlJTVRUQkNSX0lSR04wX1dCX1dB IHwgdG1wKTsKKworCS8qIE1BSVIwICovCisJaXBtbXVfY3R4X3dyaXRlKGRvbWFpbiwgSU1NQUlS MCwgZG9tYWluLT5jZmcuYXJtX2xwYWVfczFfY2ZnLm1haXJbMF0pOworCisJLyogSU1CVVNDUiAq LworCWlmIChkb21haW4tPnJvb3QtPmZlYXR1cmVzLT5zZXR1cF9pbWJ1c2NyKQorCQlpcG1tdV9j dHhfd3JpdGUoZG9tYWluLCBJTUJVU0NSLAorCQkJCWlwbW11X2N0eF9yZWFkKGRvbWFpbiwgSU1C VVNDUikgJgorCQkJCX4oSU1CVVNDUl9EVk0gfCBJTUJVU0NSX0JVU1NFTF9NQVNLKSk7CisJLyoK KwkgKiBJTVNUUgorCSAqIENsZWFyIGFsbCBpbnRlcnJ1cHQgZmxhZ3MuCisJICovCisJaXBtbXVf Y3R4X3dyaXRlKGRvbWFpbiwgSU1TVFIsIGlwbW11X2N0eF9yZWFkKGRvbWFpbiwgSU1TVFIpKTsK KworCS8qCisJICogSU1DVFIKKwkgKiBFbmFibGUgdGhlIE1NVSBhbmQgaW50ZXJydXB0IGdlbmVy YXRpb24uIFRoZSBsb25nLWRlc2NyaXB0b3IKKwkgKiB0cmFuc2xhdGlvbiB0YWJsZSBmb3JtYXQg ZG9lc24ndCB1c2UgVEVYIHJlbWFwcGluZy4gRG9uJ3QgZW5hYmxlIEFGCisJICogc29mdHdhcmUg bWFuYWdlbWVudCBhcyB3ZSBoYXZlIG5vIHVzZSBmb3IgaXQuIEZsdXNoIHRoZSBUTEIgYXMKKwkg KiByZXF1aXJlZCB3aGVuIG1vZGlmeWluZyB0aGUgY29udGV4dCByZWdpc3RlcnMuCisJICovCisJ aXBtbXVfY3R4X3dyaXRlMihkb21haW4sIElNQ1RSLAorCQkJIElNQ1RSX0lOVEVOIHwgSU1DVFJf RkxVU0ggfCBJTUNUUl9NTVVFTik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaXBt bXVfZG9tYWluX2ZyZWVfY29udGV4dChzdHJ1Y3QgaXBtbXVfdm1zYV9kZXZpY2UgKm1tdSwKKwkJ CQkgICAgICB1bnNpZ25lZCBpbnQgY29udGV4dF9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdz OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm1tdS0+bG9jaywgZmxhZ3MpOworCisJY2xlYXJfYml0 KGNvbnRleHRfaWQsIG1tdS0+Y3R4KTsKKwltbXUtPmRvbWFpbnNbY29udGV4dF9pZF0gPSBOVUxM OworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbW11LT5sb2NrLCBmbGFncyk7Cit9CisKK3N0 YXRpYyB2b2lkIGlwbW11X2RvbWFpbl9kZXN0cm95X2NvbnRleHQoc3RydWN0IGlwbW11X3Ztc2Ff ZG9tYWluICpkb21haW4pCit7CisJLyoKKwkgKiBEaXNhYmxlIHRoZSBjb250ZXh0LiBGbHVzaCB0 aGUgVExCIGFzIHJlcXVpcmVkIHdoZW4gbW9kaWZ5aW5nIHRoZQorCSAqIGNvbnRleHQgcmVnaXN0 ZXJzLgorCSAqCisJICogVE9ETzogSXMgVExCIGZsdXNoIHJlYWxseSBuZWVkZWQgPworCSAqLwor CWlwbW11X2N0eF93cml0ZTIoZG9tYWluLCBJTUNUUiwgSU1DVFJfRkxVU0gpOworCWlwbW11X3Rs Yl9zeW5jKGRvbWFpbik7CisKKyNpZmRlZiBDT05GSUdfUkNBUl9ERFJfQkFDS1VQCisJZG9tYWlu LT5yb290LT5yZWdfYmFja3VwW2RvbWFpbi0+Y29udGV4dF9pZF0gPSBOVUxMOworI2VuZGlmCisK KwlpcG1tdV9kb21haW5fZnJlZV9jb250ZXh0KGRvbWFpbi0+cm9vdCwgZG9tYWluLT5jb250ZXh0 X2lkKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZhdWx0IEhhbmRsaW5nCisg Ki8KKworc3RhdGljIGlycXJldHVybl90IGlwbW11X2RvbWFpbl9pcnEoc3RydWN0IGlwbW11X3Zt c2FfZG9tYWluICpkb21haW4pCit7CisJY29uc3QgdTMyIGVycl9tYXNrID0gSU1TVFJfTUhJVCB8 IElNU1RSX0FCT1JUIHwgSU1TVFJfUEYgfCBJTVNUUl9URjsKKwlzdHJ1Y3QgaXBtbXVfdm1zYV9k ZXZpY2UgKm1tdSA9IGRvbWFpbi0+bW11OworCXUzMiBzdGF0dXM7CisJdTMyIGlvdmE7CisKKwlz dGF0dXMgPSBpcG1tdV9jdHhfcmVhZChkb21haW4sIElNU1RSKTsKKwlpZiAoIShzdGF0dXMgJiBl cnJfbWFzaykpCisJCXJldHVybiBJUlFfTk9ORTsKKworCWlvdmEgPSBpcG1tdV9jdHhfcmVhZChk b21haW4sIElNRUFSKTsKKworCS8qCisJICogQ2xlYXIgdGhlIGVycm9yIHN0YXR1cyBmbGFncy4g VW5saWtlIHRyYWRpdGlvbmFsIGludGVycnVwdCBmbGFnCisJICogcmVnaXN0ZXJzIHRoYXQgbXVz dCBiZSBjbGVhcmVkIGJ5IHdyaXRpbmcgMSwgdGhpcyBzdGF0dXMgcmVnaXN0ZXIKKwkgKiBzZWVt cyB0byByZXF1aXJlIDAuIFRoZSBlcnJvciBhZGRyZXNzIHJlZ2lzdGVyIG11c3QgYmUgcmVhZCBi ZWZvcmUsCisJICogb3RoZXJ3aXNlIGl0cyB2YWx1ZSB3aWxsIGJlIDAuCisJICovCisJaXBtbXVf Y3R4X3dyaXRlKGRvbWFpbiwgSU1TVFIsIDApOworCisJLyogTG9nIGZhdGFsIGVycm9ycy4gKi8K KwlpZiAoc3RhdHVzICYgSU1TVFJfTUhJVCkKKwkJZGV2X2Vycl9yYXRlbGltaXRlZChtbXUtPmRl diwgIk11bHRpcGxlIFRMQiBoaXRzIEAweCUwOHhcbiIsCisJCQkJICAgIGlvdmEpOworCWlmIChz dGF0dXMgJiBJTVNUUl9BQk9SVCkKKwkJZGV2X2Vycl9yYXRlbGltaXRlZChtbXUtPmRldiwgIlBh Z2UgVGFibGUgV2FsayBBYm9ydCBAMHglMDh4XG4iLAorCQkJCSAgICBpb3ZhKTsKKworCWlmICgh KHN0YXR1cyAmIChJTVNUUl9QRiB8IElNU1RSX1RGKSkpCisJCXJldHVybiBJUlFfTk9ORTsKKwor CS8qCisJICogVHJ5IHRvIGhhbmRsZSBwYWdlIGZhdWx0cyBhbmQgdHJhbnNsYXRpb24gZmF1bHRz LgorCSAqCisJICogVE9ETzogV2UgbmVlZCB0byBsb29rIHVwIHRoZSBmYXVsdHkgZGV2aWNlIGJh c2VkIG9uIHRoZSBJL08gVkEuIFVzZQorCSAqIHRoZSBJT01NVSBkZXZpY2UgZm9yIG5vdy4KKwkg Ki8KKwlpZiAoIXJlcG9ydF9pb21tdV9mYXVsdCgmZG9tYWluLT5pb19kb21haW4sIG1tdS0+ZGV2 LCBpb3ZhLCAwKSkKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCisJZGV2X2Vycl9yYXRlbGltaXRl ZChtbXUtPmRldiwKKwkJCSAgICAiVW5oYW5kbGVkIGZhdWx0OiBzdGF0dXMgMHglMDh4IGlvdmEg MHglMDh4XG4iLAorCQkJICAgIHN0YXR1cywgaW92YSk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7 Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBpcG1tdV9pcnEoaW50IGlycSwgdm9pZCAqZGV2KQor eworCXN0cnVjdCBpcG1tdV92bXNhX2RldmljZSAqbW11ID0gZGV2OworCWlycXJldHVybl90IHN0 YXR1cyA9IElSUV9OT05FOworCXVuc2lnbmVkIGludCBpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7 CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbW11LT5sb2NrLCBmbGFncyk7CisKKwkvKgorCSAqIENo ZWNrIGludGVycnVwdHMgZm9yIGFsbCBhY3RpdmUgY29udGV4dHMuCisJICovCisJZm9yIChpID0g MDsgaSA8IG1tdS0+bnVtX2N0eDsgaSsrKSB7CisJCWlmICghbW11LT5kb21haW5zW2ldKQorCQkJ Y29udGludWU7CisJCWlmIChpcG1tdV9kb21haW5faXJxKG1tdS0+ZG9tYWluc1tpXSkgPT0gSVJR X0hBTkRMRUQpCisJCQlzdGF0dXMgPSBJUlFfSEFORExFRDsKKwl9CisKKwlzcGluX3VubG9ja19p cnFyZXN0b3JlKCZtbXUtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8q IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBJT01NVSBPcGVyYXRpb25zCisgKi8KKworc3RhdGlj IHN0cnVjdCBpb21tdV9kb21haW4gKl9faXBtbXVfZG9tYWluX2FsbG9jKHVuc2lnbmVkIHR5cGUp Cit7CisJc3RydWN0IGlwbW11X3Ztc2FfZG9tYWluICpkb21haW47CisKKwlkb21haW4gPSBremFs bG9jKHNpemVvZigqZG9tYWluKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkb21haW4pCisJCXJldHVy biBOVUxMOworCisJc3Bpbl9sb2NrX2luaXQoJmRvbWFpbi0+bG9jayk7CisKKwlyZXR1cm4gJmRv bWFpbi0+aW9fZG9tYWluOworfQorCitzdGF0aWMgdm9pZCBpcG1tdV9kb21haW5fZnJlZShzdHJ1 Y3QgaW9tbXVfZG9tYWluICppb19kb21haW4pCit7CisJc3RydWN0IGlwbW11X3Ztc2FfZG9tYWlu ICpkb21haW4gPSB0b192bXNhX2RvbWFpbihpb19kb21haW4pOworCisJLyoKKwkgKiBGcmVlIHRo ZSBkb21haW4gcmVzb3VyY2VzLiBXZSBhc3N1bWUgdGhhdCBhbGwgZGV2aWNlcyBoYXZlIGFscmVh ZHkKKwkgKiBiZWVuIGRldGFjaGVkLgorCSAqLworCWlwbW11X2RvbWFpbl9kZXN0cm95X2NvbnRl eHQoZG9tYWluKTsKKwlmcmVlX2lvX3BndGFibGVfb3BzKGRvbWFpbi0+aW9wKTsKKwlrZnJlZShk b21haW4pOworfQorCitzdGF0aWMgaW50IGlwbW11X2F0dGFjaF9kZXZpY2Uoc3RydWN0IGlvbW11 X2RvbWFpbiAqaW9fZG9tYWluLAorCQkJICAgICAgIHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlz dHJ1Y3QgaXBtbXVfdm1zYV9hcmNoZGF0YSAqYXJjaGRhdGEgPSB0b19hcmNoZGF0YShkZXYpOwor CXN0cnVjdCBpcG1tdV92bXNhX2RldmljZSAqcm9vdCwgKm1tdSA9IGFyY2hkYXRhLT5tbXU7CisJ c3RydWN0IGlwbW11X3Ztc2FfZG9tYWluICpkb21haW4gPSB0b192bXNhX2RvbWFpbihpb19kb21h aW4pOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IGk7CisJaW50IHJldCA9 IDA7CisKKwlpZiAoIW1tdSkgeworCQlkZXZfZXJyKGRldiwgIkNhbm5vdCBhdHRhY2ggdG8gSVBN TVVcbiIpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCXJvb3QgPSBpcG1tdV9maW5kX3Jvb3Qo YXJjaGRhdGEtPm1tdSk7CisJaWYgKCFyb290KSB7CisJCWRldl9lcnIoZGV2LCAiVW5hYmxlIHRv IGxvY2F0ZSByb290IElQTU1VXG4iKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCisJc3Bpbl9s b2NrX2lycXNhdmUoJmRvbWFpbi0+bG9jaywgZmxhZ3MpOworCisJaWYgKCFkb21haW4tPm1tdSkg eworCQkvKiBUaGUgZG9tYWluIGhhc24ndCBiZWVuIHVzZWQgeWV0LCBpbml0aWFsaXplIGl0LiAq LworCQlkb21haW4tPm1tdSA9IG1tdTsKKwkJZG9tYWluLT5yb290ID0gcm9vdDsKKwkJcmV0ID0g aXBtbXVfZG9tYWluX2luaXRfY29udGV4dChkb21haW4pOworCQlpZiAocmV0IDwgMCkgeworCQkJ ZGV2X2VycihkZXYsICJVbmFibGUgdG8gaW5pdGlhbGl6ZSBJUE1NVSBjb250ZXh0XG4iKTsKKwkJ CWRvbWFpbi0+bW11ID0gTlVMTDsKKwkJfSBlbHNlIHsKKwkJCWRldl9pbmZvKGRldiwgIlVzaW5n IElQTU1VIGNvbnRleHQgJXVcbiIsCisJCQkJIGRvbWFpbi0+Y29udGV4dF9pZCk7CisJCX0KKwl9 IGVsc2UgaWYgKGRvbWFpbi0+bW11ICE9IG1tdSkgeworCQkvKgorCQkgKiBTb21ldGhpbmcgaXMg d3JvbmcsIHdlIGNhbid0IGF0dGFjaCB0d28gZGV2aWNlcyB1c2luZworCQkgKiBkaWZmZXJlbnQg SU9NTVVzIHRvIHRoZSBzYW1lIGRvbWFpbi4KKwkJICovCisJCWRldl9lcnIoZGV2LCAiQ2FuJ3Qg YXR0YWNoIElQTU1VICVzIHRvIGRvbWFpbiBvbiBJUE1NVSAlc1xuIiwKKwkJCWRldl9uYW1lKG1t dS0+ZGV2KSwgZGV2X25hbWUoZG9tYWluLT5tbXUtPmRldikpOworCQlyZXQgPSAtRUlOVkFMOwor CX0gZWxzZSB7CisJCQlkZXZfaW5mbyhkZXYsICJSZXVzaW5nIElQTU1VIGNvbnRleHQgJXVcbiIs CisJCQkJIGRvbWFpbi0+Y29udGV4dF9pZCk7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9y ZSgmZG9tYWluLT5sb2NrLCBmbGFncyk7CisKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsK KworCWZvciAoaSA9IDA7IGkgPCBhcmNoZGF0YS0+bnVtX3V0bGJzOyArK2kpCisJCWlwbW11X3V0 bGJfZW5hYmxlKGRvbWFpbiwgYXJjaGRhdGEtPnV0bGJzW2ldKTsKKworCXJldHVybiAwOworfQor CitzdGF0aWMgdm9pZCBpcG1tdV9kZXRhY2hfZGV2aWNlKHN0cnVjdCBpb21tdV9kb21haW4gKmlv X2RvbWFpbiwKKwkJCQlzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGlwbW11X3Ztc2Ff YXJjaGRhdGEgKmFyY2hkYXRhID0gdG9fYXJjaGRhdGEoZGV2KTsKKwlzdHJ1Y3QgaXBtbXVfdm1z YV9kb21haW4gKmRvbWFpbiA9IHRvX3Ztc2FfZG9tYWluKGlvX2RvbWFpbik7CisJdW5zaWduZWQg aW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgYXJjaGRhdGEtPm51bV91dGxiczsgKytpKQorCQlp cG1tdV91dGxiX2Rpc2FibGUoZG9tYWluLCBhcmNoZGF0YS0+dXRsYnNbaV0pOworCisJLyoKKwkg KiBUT0RPOiBPcHRpbWl6ZSBieSBkaXNhYmxpbmcgdGhlIGNvbnRleHQgd2hlbiBubyBkZXZpY2Ug aXMgYXR0YWNoZWQuCisJICovCit9CisKK3N0YXRpYyBpbnQgaXBtbXVfbWFwKHN0cnVjdCBpb21t dV9kb21haW4gKmlvX2RvbWFpbiwgdW5zaWduZWQgbG9uZyBpb3ZhLAorCQkgICAgIHBoeXNfYWRk cl90IHBhZGRyLCBzaXplX3Qgc2l6ZSwgaW50IHByb3QpCit7CisJc3RydWN0IGlwbW11X3Ztc2Ff ZG9tYWluICpkb21haW4gPSB0b192bXNhX2RvbWFpbihpb19kb21haW4pOworCisJaWYgKCFkb21h aW4pCisJCXJldHVybiAtRU5PREVWOworCisJcmV0dXJuIGRvbWFpbi0+aW9wLT5tYXAoZG9tYWlu LT5pb3AsIGlvdmEsIHBhZGRyLCBzaXplLCBwcm90KTsKK30KKworc3RhdGljIHNpemVfdCBpcG1t dV91bm1hcChzdHJ1Y3QgaW9tbXVfZG9tYWluICppb19kb21haW4sIHVuc2lnbmVkIGxvbmcgaW92 YSwKKwkJCSAgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IGlwbW11X3Ztc2FfZG9tYWluICpkb21h aW4gPSB0b192bXNhX2RvbWFpbihpb19kb21haW4pOworCisJcmV0dXJuIGRvbWFpbi0+aW9wLT51 bm1hcChkb21haW4tPmlvcCwgaW92YSwgc2l6ZSk7Cit9CisKK3N0YXRpYyBwaHlzX2FkZHJfdCBp cG1tdV9pb3ZhX3RvX3BoeXMoc3RydWN0IGlvbW11X2RvbWFpbiAqaW9fZG9tYWluLAorCQkJCSAg ICAgIGRtYV9hZGRyX3QgaW92YSkKK3sKKwlzdHJ1Y3QgaXBtbXVfdm1zYV9kb21haW4gKmRvbWFp biA9IHRvX3Ztc2FfZG9tYWluKGlvX2RvbWFpbik7CisKKwkvKiBUT0RPOiBJcyBsb2NraW5nIG5l ZWRlZCA/ICovCisKKwlyZXR1cm4gZG9tYWluLT5pb3AtPmlvdmFfdG9fcGh5cyhkb21haW4tPmlv cCwgaW92YSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlICppcG1tdV9maW5kX3NpYmxpbmdf ZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaXBtbXVfdm1zYV9hcmNoZGF0 YSAqYXJjaGRhdGEgPSBkZXYtPmFyY2hkYXRhLmlvbW11OworCXN0cnVjdCBpcG1tdV92bXNhX2Fy Y2hkYXRhICpzaWJsaW5nX2FyY2hkYXRhID0gTlVMTDsKKwlib29sIGZvdW5kID0gZmFsc2U7CisK KwlzcGluX2xvY2soJmlwbW11X3NsYXZlX2RldmljZXNfbG9jayk7CisKKwlsaXN0X2Zvcl9lYWNo X2VudHJ5KHNpYmxpbmdfYXJjaGRhdGEsICZpcG1tdV9zbGF2ZV9kZXZpY2VzLCBsaXN0KSB7CisJ CWlmIChhcmNoZGF0YSA9PSBzaWJsaW5nX2FyY2hkYXRhKQorCQkJY29udGludWU7CisJCWlmIChz aWJsaW5nX2FyY2hkYXRhLT5tbXUgPT0gYXJjaGRhdGEtPm1tdSkgeworCQkJZm91bmQgPSB0cnVl OworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlzcGluX3VubG9jaygmaXBtbXVfc2xhdmVfZGV2aWNl c19sb2NrKTsKKworCXJldHVybiBmb3VuZCA/IHNpYmxpbmdfYXJjaGRhdGEtPmRldiA6IE5VTEw7 Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaW9tbXVfZ3JvdXAgKmlwbW11X2ZpbmRfZ3JvdXAoc3RydWN0 IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpb21tdV9ncm91cCAqZ3JvdXA7CisJc3RydWN0IGRl dmljZSAqc2libGluZzsKKworCXNpYmxpbmcgPSBpcG1tdV9maW5kX3NpYmxpbmdfZGV2aWNlKGRl dik7CisJaWYgKHNpYmxpbmcpCisJCWdyb3VwID0gaW9tbXVfZ3JvdXBfZ2V0KHNpYmxpbmcpOwor CWlmICghc2libGluZyB8fCBJU19FUlIoZ3JvdXApKQorCQlncm91cCA9IGdlbmVyaWNfZGV2aWNl X2dyb3VwKGRldik7CisKKwlyZXR1cm4gZ3JvdXA7Cit9CisKK3N0YXRpYyBpbnQgaXBtbXVfZmlu ZF91dGxicyhzdHJ1Y3QgaXBtbXVfdm1zYV9kZXZpY2UgKm1tdSwgc3RydWN0IGRldmljZSAqZGV2 LAorCQkJICAgIHVuc2lnbmVkIGludCAqdXRsYnMsIHVuc2lnbmVkIGludCBudW1fdXRsYnMpCit7 CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3V0bGJzOyArK2kpIHsK KwkJc3RydWN0IG9mX3BoYW5kbGVfYXJncyBhcmdzOworCQlpbnQgcmV0OworCisJCXJldCA9IG9m X3BhcnNlX3BoYW5kbGVfd2l0aF9hcmdzKGRldi0+b2Zfbm9kZSwgImlvbW11cyIsCisJCQkJCQkg IiNpb21tdS1jZWxscyIsIGksICZhcmdzKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0 OworCisJCW9mX25vZGVfcHV0KGFyZ3MubnApOworCisJCWlmIChhcmdzLm5wICE9IG1tdS0+ZGV2 LT5vZl9ub2RlIHx8IGFyZ3MuYXJnc19jb3VudCAhPSAxKQorCQkJcmV0dXJuIC1FSU5WQUw7CisK KwkJdXRsYnNbaV0gPSBhcmdzLmFyZ3NbMF07CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRp YyBpbnQgaXBtbXVfaW5pdF9wbGF0Zm9ybV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQorewor CXN0cnVjdCBpcG1tdV92bXNhX2FyY2hkYXRhICphcmNoZGF0YTsKKwlzdHJ1Y3QgaXBtbXVfdm1z YV9kZXZpY2UgKm1tdTsKKwl1bnNpZ25lZCBpbnQgKnV0bGJzOworI2lmZGVmIENPTkZJR19SQ0FS X0REUl9CQUNLVVAKKwl1bnNpZ25lZCBpbnQgKnV0bGJzX3ZhbCwgKmFzaWRzX3ZhbDsKKyNlbmRp ZgorCXVuc2lnbmVkIGludCBpOworCWludCBudW1fdXRsYnM7CisJaW50IHJldCA9IC1FTk9ERVY7 CisKKwkvKiBGaW5kIHRoZSBtYXN0ZXIgY29ycmVzcG9uZGluZyB0byB0aGUgZGV2aWNlLiAqLwor CisJbnVtX3V0bGJzID0gb2ZfY291bnRfcGhhbmRsZV93aXRoX2FyZ3MoZGV2LT5vZl9ub2RlLCAi aW9tbXVzIiwKKwkJCQkJICAgICAgICIjaW9tbXUtY2VsbHMiKTsKKwlpZiAobnVtX3V0bGJzIDwg MCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwl1dGxicyA9IGtjYWxsb2MobnVtX3V0bGJzLCBzaXpl b2YoKnV0bGJzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF1dGxicykKKwkJcmV0dXJuIC1FTk9NRU07 CisKKyNpZmRlZiBDT05GSUdfUkNBUl9ERFJfQkFDS1VQCisJdXRsYnNfdmFsID0ga2NhbGxvYyhu dW1fdXRsYnMsIHNpemVvZigqdXRsYnNfdmFsKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF1dGxic192 YWwpCisJCXJldHVybiAtRU5PTUVNOworCWFzaWRzX3ZhbCA9IGtjYWxsb2MobnVtX3V0bGJzLCBz aXplb2YoKmFzaWRzX3ZhbCksIEdGUF9LRVJORUwpOworCWlmICghYXNpZHNfdmFsKQorCQlyZXR1 cm4gLUVOT01FTTsKKyNlbmRpZgorCisJc3Bpbl9sb2NrKCZpcG1tdV9kZXZpY2VzX2xvY2spOwor CisJbGlzdF9mb3JfZWFjaF9lbnRyeShtbXUsICZpcG1tdV9kZXZpY2VzLCBsaXN0KSB7CisJCXJl dCA9IGlwbW11X2ZpbmRfdXRsYnMobW11LCBkZXYsIHV0bGJzLCBudW1fdXRsYnMpOworCQlpZiAo IXJldCkgeworCQkJLyoKKwkJCSAqIFRPRE8gVGFrZSBhIHJlZmVyZW5jZSB0byB0aGUgTU1VIHRv IHByb3RlY3QKKwkJCSAqIGFnYWluc3QgZGV2aWNlIHJlbW92YWwuCisJCQkgKi8KKwkJCWJyZWFr OworCQl9CisJfQorCisJc3Bpbl91bmxvY2soJmlwbW11X2RldmljZXNfbG9jayk7CisKKwlpZiAo cmV0IDwgMCkKKwkJZ290byBlcnJvcjsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fdXRsYnM7ICsr aSkgeworCQlpZiAodXRsYnNbaV0gPj0gbW11LT5udW1fdXRsYnMpIHsKKwkJCXJldCA9IC1FSU5W QUw7CisJCQlnb3RvIGVycm9yOworCQl9CisJfQorCisJYXJjaGRhdGEgPSBremFsbG9jKHNpemVv ZigqYXJjaGRhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWFyY2hkYXRhKSB7CisJCXJldCA9IC1F Tk9NRU07CisJCWdvdG8gZXJyb3I7CisJfQorCisJYXJjaGRhdGEtPm1tdSA9IG1tdTsKKwlhcmNo ZGF0YS0+dXRsYnMgPSB1dGxiczsKKyNpZmRlZiBDT05GSUdfUkNBUl9ERFJfQkFDS1VQCisJYXJj aGRhdGEtPnV0bGJzX3ZhbCA9IHV0bGJzX3ZhbDsKKwlhcmNoZGF0YS0+YXNpZHNfdmFsID0gYXNp ZHNfdmFsOworI2VuZGlmCisJYXJjaGRhdGEtPm51bV91dGxicyA9IG51bV91dGxiczsKKwlhcmNo ZGF0YS0+ZGV2ID0gZGV2OworCXNldF9hcmNoZGF0YShkZXYsIGFyY2hkYXRhKTsKKwlyZXR1cm4g MDsKKworZXJyb3I6CisJa2ZyZWUodXRsYnMpOworCXJldHVybiByZXQ7Cit9CisKKyNpZiBkZWZp bmVkKENPTkZJR19BUk0pICYmICFkZWZpbmVkKENPTkZJR19JT01NVV9ETUEpCisKK3N0YXRpYyBp bnQgaXBtbXVfYWRkX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGlwbW11 X3Ztc2FfZGV2aWNlICptbXUgPSBOVUxMOworCXN0cnVjdCBpb21tdV9ncm91cCAqZ3JvdXA7CisJ aW50IHJldDsKKworCWlmICh0b19hcmNoZGF0YShkZXYpKSB7CisJCWRldl93YXJuKGRldiwgIklP TU1VIGRyaXZlciBhbHJlYWR5IGFzc2lnbmVkIHRvIGRldmljZSAlc1xuIiwKKwkJCSBkZXZfbmFt ZShkZXYpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogQ3JlYXRlIGEgZGV2aWNlIGdy b3VwIGFuZCBhZGQgdGhlIGRldmljZSB0byBpdC4gKi8KKwlncm91cCA9IGlvbW11X2dyb3VwX2Fs bG9jKCk7CisJaWYgKElTX0VSUihncm91cCkpIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8g YWxsb2NhdGUgSU9NTVUgZ3JvdXBcbiIpOworCQlyZXQgPSBQVFJfRVJSKGdyb3VwKTsKKwkJZ290 byBlcnJvcjsKKwl9CisKKwlyZXQgPSBpb21tdV9ncm91cF9hZGRfZGV2aWNlKGdyb3VwLCBkZXYp OworCWlvbW11X2dyb3VwX3B1dChncm91cCk7CisKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJy KGRldiwgIkZhaWxlZCB0byBhZGQgZGV2aWNlIHRvIElQTU1VIGdyb3VwXG4iKTsKKwkJZ3JvdXAg PSBOVUxMOworCQlnb3RvIGVycm9yOworCX0KKworCXJldCA9IGlwbW11X2luaXRfcGxhdGZvcm1f ZGV2aWNlKGRldik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKgorCSAqIENy ZWF0ZSB0aGUgQVJNIG1hcHBpbmcsIHVzZWQgYnkgdGhlIEFSTSBETUEgbWFwcGluZyBjb3JlIHRv IGFsbG9jYXRlCisJICogVkFzLiBUaGlzIHdpbGwgYWxsb2NhdGUgYSBjb3JyZXNwb25kaW5nIElP TU1VIGRvbWFpbi4KKwkgKgorCSAqIFRPRE86CisJICogLSBDcmVhdGUgb25lIG1hcHBpbmcgcGVy IGNvbnRleHQgKFRMQikuCisJICogLSBNYWtlIHRoZSBtYXBwaW5nIHNpemUgY29uZmlndXJhYmxl ID8gV2UgY3VycmVudGx5IHVzZSBhIDJHQiBtYXBwaW5nCisJICogICBhdCBhIDFHQiBvZmZzZXQg dG8gZW5zdXJlIHRoYXQgTlVMTCBWQXMgd2lsbCBmYXVsdC4KKwkgKi8KKwltbXUgPSB0b19hcmNo ZGF0YShkZXYpLT5tbXU7CisJaWYgKCFtbXUtPm1hcHBpbmcpIHsKKwkJc3RydWN0IGRtYV9pb21t dV9tYXBwaW5nICptYXBwaW5nOworCisJCW1hcHBpbmcgPSBhcm1faW9tbXVfY3JlYXRlX21hcHBp bmcoJnBsYXRmb3JtX2J1c190eXBlLAorCQkJCQkJICAgU1pfMUcsIFNaXzJHKTsKKwkJaWYgKElT X0VSUihtYXBwaW5nKSkgeworCQkJZGV2X2VycihtbXUtPmRldiwgImZhaWxlZCB0byBjcmVhdGUg QVJNIElPTU1VIG1hcHBpbmdcbiIpOworCQkJcmV0ID0gUFRSX0VSUihtYXBwaW5nKTsKKwkJCWdv dG8gZXJyb3I7CisJCX0KKworCQltbXUtPm1hcHBpbmcgPSBtYXBwaW5nOworCX0KKworCS8qIEF0 dGFjaCB0aGUgQVJNIFZBIG1hcHBpbmcgdG8gdGhlIGRldmljZS4gKi8KKwlyZXQgPSBhcm1faW9t bXVfYXR0YWNoX2RldmljZShkZXYsIG1tdS0+bWFwcGluZyk7CisJaWYgKHJldCA8IDApIHsKKwkJ ZGV2X2VycihkZXYsICJGYWlsZWQgdG8gYXR0YWNoIGRldmljZSB0byBWQSBtYXBwaW5nXG4iKTsK KwkJZ290byBlcnJvcjsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyb3I6CisJaWYgKG1tdSkKKwkJ YXJtX2lvbW11X3JlbGVhc2VfbWFwcGluZyhtbXUtPm1hcHBpbmcpOworCisJc2V0X2FyY2hkYXRh KGRldiwgTlVMTCk7CisKKwlpZiAoIUlTX0VSUl9PUl9OVUxMKGdyb3VwKSkKKwkJaW9tbXVfZ3Jv dXBfcmVtb3ZlX2RldmljZShkZXYpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQg aXBtbXVfcmVtb3ZlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGlwbW11 X3Ztc2FfYXJjaGRhdGEgKmFyY2hkYXRhID0gdG9fYXJjaGRhdGEoZGV2KTsKKworCWFybV9pb21t dV9kZXRhY2hfZGV2aWNlKGRldik7CisJaW9tbXVfZ3JvdXBfcmVtb3ZlX2RldmljZShkZXYpOwor CisJa2ZyZWUoYXJjaGRhdGEtPnV0bGJzKTsKKyNpZmRlZiBDT05GSUdfUkNBUl9ERFJfQkFDS1VQ CisJa2ZyZWUoYXJjaGRhdGEtPnV0bGJzX3ZhbCk7CisJa2ZyZWUoYXJjaGRhdGEtPmFzaWRzX3Zh bCk7CisjZW5kaWYKKwlrZnJlZShhcmNoZGF0YSk7CisKKwlzZXRfYXJjaGRhdGEoZGV2LCBOVUxM KTsKK30KKworc3RhdGljIHN0cnVjdCBpb21tdV9kb21haW4gKmlwbW11X2RvbWFpbl9hbGxvYyh1 bnNpZ25lZCB0eXBlKQoreworCWlmICh0eXBlICE9IElPTU1VX0RPTUFJTl9VTk1BTkFHRUQpCisJ CXJldHVybiBOVUxMOworCisJcmV0dXJuIF9faXBtbXVfZG9tYWluX2FsbG9jKHR5cGUpOworfQor CitzdGF0aWMgY29uc3Qgc3RydWN0IGlvbW11X29wcyBpcG1tdV9vcHMgPSB7CisJLmRvbWFpbl9h bGxvYyA9IGlwbW11X2RvbWFpbl9hbGxvYywKKwkuZG9tYWluX2ZyZWUgPSBpcG1tdV9kb21haW5f ZnJlZSwKKwkuYXR0YWNoX2RldiA9IGlwbW11X2F0dGFjaF9kZXZpY2UsCisJLmRldGFjaF9kZXYg PSBpcG1tdV9kZXRhY2hfZGV2aWNlLAorCS5tYXAgPSBpcG1tdV9tYXAsCisJLnVubWFwID0gaXBt bXVfdW5tYXAsCisJLm1hcF9zZyA9IGRlZmF1bHRfaW9tbXVfbWFwX3NnLAorCS5pb3ZhX3RvX3Bo eXMgPSBpcG1tdV9pb3ZhX3RvX3BoeXMsCisJLmFkZF9kZXZpY2UgPSBpcG1tdV9hZGRfZGV2aWNl LAorCS5yZW1vdmVfZGV2aWNlID0gaXBtbXVfcmVtb3ZlX2RldmljZSwKKwkucGdzaXplX2JpdG1h cCA9IFNaXzFHIHwgU1pfMk0gfCBTWl80SywKK307CisKKyNlbmRpZiAvKiAhQ09ORklHX0FSTSAm JiBDT05GSUdfSU9NTVVfRE1BICovCisKKyNpZmRlZiBDT05GSUdfSU9NTVVfRE1BCisKK3N0YXRp YyBzdHJ1Y3QgaW9tbXVfZG9tYWluICppcG1tdV9kb21haW5fYWxsb2NfZG1hKHVuc2lnbmVkIHR5 cGUpCit7CisJc3RydWN0IGlvbW11X2RvbWFpbiAqaW9fZG9tYWluID0gTlVMTDsKKworCXN3aXRj aCAodHlwZSkgeworCWNhc2UgSU9NTVVfRE9NQUlOX1VOTUFOQUdFRDoKKwkJaW9fZG9tYWluID0g X19pcG1tdV9kb21haW5fYWxsb2ModHlwZSk7CisJCWJyZWFrOworCisJY2FzZSBJT01NVV9ET01B SU5fRE1BOgorCQlpb19kb21haW4gPSBfX2lwbW11X2RvbWFpbl9hbGxvYyh0eXBlKTsKKwkJaWYg KGlvX2RvbWFpbikKKwkJCWlvbW11X2dldF9kbWFfY29va2llKGlvX2RvbWFpbik7CisJCWJyZWFr OworCX0KKworCXJldHVybiBpb19kb21haW47Cit9CisKK3N0YXRpYyB2b2lkIGlwbW11X2RvbWFp bl9mcmVlX2RtYShzdHJ1Y3QgaW9tbXVfZG9tYWluICppb19kb21haW4pCit7CisJc3dpdGNoIChp b19kb21haW4tPnR5cGUpIHsKKwljYXNlIElPTU1VX0RPTUFJTl9ETUE6CisJCWlvbW11X3B1dF9k bWFfY29va2llKGlvX2RvbWFpbik7CisJCS8qIGZhbGwtdGhyb3VnaCAqLworCWRlZmF1bHQ6CisJ CWlwbW11X2RvbWFpbl9mcmVlKGlvX2RvbWFpbik7CisJCWJyZWFrOworCX0KK30KKworc3RhdGlj IGludCBpcG1tdV9hZGRfZGV2aWNlX2RtYShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0 IGlwbW11X3Ztc2FfYXJjaGRhdGEgKmFyY2hkYXRhID0gZGV2LT5hcmNoZGF0YS5pb21tdTsKKwlz dHJ1Y3QgaW9tbXVfZ3JvdXAgKmdyb3VwOworCisJLyogb25seSBhY2NlcHQgZGV2aWNlcyB3aXRo IGlvbW11cyBwcm9wZXJ0eSAqLworCWlmIChvZl9jb3VudF9waGFuZGxlX3dpdGhfYXJncyhkZXYt Pm9mX25vZGUsICJpb21tdXMiLAorCQkJCSAgICAgICAiI2lvbW11LWNlbGxzIikgPCAwKQorCQly ZXR1cm4gLUVOT0RFVjsKKworCWdyb3VwID0gaW9tbXVfZ3JvdXBfZ2V0X2Zvcl9kZXYoZGV2KTsK KwlpZiAoSVNfRVJSKGdyb3VwKSkKKwkJcmV0dXJuIFBUUl9FUlIoZ3JvdXApOworCisJYXJjaGRh dGEgPSBkZXYtPmFyY2hkYXRhLmlvbW11OworCXNwaW5fbG9jaygmaXBtbXVfc2xhdmVfZGV2aWNl c19sb2NrKTsKKwlsaXN0X2FkZCgmYXJjaGRhdGEtPmxpc3QsICZpcG1tdV9zbGF2ZV9kZXZpY2Vz KTsKKwlzcGluX3VubG9jaygmaXBtbXVfc2xhdmVfZGV2aWNlc19sb2NrKTsKKwlyZXR1cm4gMDsK K30KKworc3RhdGljIHZvaWQgaXBtbXVfcmVtb3ZlX2RldmljZV9kbWEoc3RydWN0IGRldmljZSAq ZGV2KQoreworCXN0cnVjdCBpcG1tdV92bXNhX2FyY2hkYXRhICphcmNoZGF0YSA9IGRldi0+YXJj aGRhdGEuaW9tbXU7CisKKwlzcGluX2xvY2soJmlwbW11X3NsYXZlX2RldmljZXNfbG9jayk7CisJ bGlzdF9kZWwoJmFyY2hkYXRhLT5saXN0KTsKKwlzcGluX3VubG9jaygmaXBtbXVfc2xhdmVfZGV2 aWNlc19sb2NrKTsKKworCWlvbW11X2dyb3VwX3JlbW92ZV9kZXZpY2UoZGV2KTsKK30KKworc3Rh dGljIHN0cnVjdCBpb21tdV9ncm91cCAqaXBtbXVfZGV2aWNlX2dyb3VwX2RtYShzdHJ1Y3QgZGV2 aWNlICpkZXYpCit7CisJc3RydWN0IGlvbW11X2dyb3VwICpncm91cDsKKwlpbnQgcmV0OworCisJ cmV0ID0gaXBtbXVfaW5pdF9wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlpZiAoIXJldCkKKwkJZ3Jv dXAgPSBpcG1tdV9maW5kX2dyb3VwKGRldik7CisJZWxzZQorCQlncm91cCA9IEVSUl9QVFIocmV0 KTsKKworCXJldHVybiBncm91cDsKK30KKworc3RhdGljIGludCBpcG1tdV9vZl94bGF0ZV9kbWEo c3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgICAgc3RydWN0IG9mX3BoYW5kbGVfYXJncyAqc3Bl YykKK3sKKwkvKiBJZiB0aGUgSVBNTVUgZGV2aWNlIGlzIGRpc2FibGVkIGluIERUIHRoZW4gcmV0 dXJuIGVycm9yCisJICogdG8gbWFrZSBzdXJlIHRoZSBvZl9pb21tdSBjb2RlIGRvZXMgbm90IGlu c3RhbGwgb3BzCisJICogZXZlbiB0aG91Z2ggdGhlIGlvbW11IGRldmljZSBpcyBkaXNhYmxlZAor CSAqLworCWlmICghb2ZfZGV2aWNlX2lzX2F2YWlsYWJsZShzcGVjLT5ucCkpCisJCXJldHVybiAt RU5PREVWOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaW9tbXVfb3Bz IGlwbW11X29wcyA9IHsKKwkuZG9tYWluX2FsbG9jID0gaXBtbXVfZG9tYWluX2FsbG9jX2RtYSwK KwkuZG9tYWluX2ZyZWUgPSBpcG1tdV9kb21haW5fZnJlZV9kbWEsCisJLmF0dGFjaF9kZXYgPSBp cG1tdV9hdHRhY2hfZGV2aWNlLAorCS5kZXRhY2hfZGV2ID0gaXBtbXVfZGV0YWNoX2RldmljZSwK KwkubWFwID0gaXBtbXVfbWFwLAorCS51bm1hcCA9IGlwbW11X3VubWFwLAorCS5tYXBfc2cgPSBk ZWZhdWx0X2lvbW11X21hcF9zZywKKwkuaW92YV90b19waHlzID0gaXBtbXVfaW92YV90b19waHlz LAorCS5hZGRfZGV2aWNlID0gaXBtbXVfYWRkX2RldmljZV9kbWEsCisJLnJlbW92ZV9kZXZpY2Ug PSBpcG1tdV9yZW1vdmVfZGV2aWNlX2RtYSwKKwkuZGV2aWNlX2dyb3VwID0gaXBtbXVfZGV2aWNl X2dyb3VwX2RtYSwKKwkucGdzaXplX2JpdG1hcCA9IFNaXzFHIHwgU1pfMk0gfCBTWl80SywKKwku b2ZfeGxhdGUgPSBpcG1tdV9vZl94bGF0ZV9kbWEsCit9OworCisjZW5kaWYgLyogQ09ORklHX0lP TU1VX0RNQSAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUHJvYmUvcmVtb3ZlIGFu ZCBpbml0CisgKi8KKworc3RhdGljIHZvaWQgaXBtbXVfZGV2aWNlX3Jlc2V0KHN0cnVjdCBpcG1t dV92bXNhX2RldmljZSAqbW11KQoreworCXVuc2lnbmVkIGludCBpOworCisJLyogRGlzYWJsZSBh bGwgY29udGV4dHMuICovCisJZm9yIChpID0gMDsgaSA8IG1tdS0+bnVtX2N0eDsgKytpKQorCQlp cG1tdV93cml0ZShtbXUsIGkgKiBJTV9DVFhfU0laRSArIElNQ1RSLCAwKTsKK30KKworc3RhdGlj IGNvbnN0IHN0cnVjdCBpcG1tdV9mZWF0dXJlcyBpcG1tdV9mZWF0dXJlc19kZWZhdWx0ID0gewor CS51c2VfbnNfYWxpYXNfb2Zmc2V0ID0gdHJ1ZSwKKwkuaGFzX2NhY2hlX2xlYWZfbm9kZXMgPSBm YWxzZSwKKwkuaGFzX2VpZ2h0X2N0eCA9IGZhbHNlLAorCS5zZXR1cF9pbWJ1c2NyID0gdHJ1ZSwK KwkudHdvYml0X2ltdHRiY3Jfc2wwID0gZmFsc2UsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0 IGlwbW11X2ZlYXR1cmVzIGlwbW11X2ZlYXR1cmVzX3JjYXJfZ2VuMyA9IHsKKwkudXNlX25zX2Fs aWFzX29mZnNldCA9IGZhbHNlLAorCS5oYXNfY2FjaGVfbGVhZl9ub2RlcyA9IHRydWUsCisJLmhh c19laWdodF9jdHggPSB0cnVlLAorCS5zZXR1cF9pbWJ1c2NyID0gZmFsc2UsCisJLnR3b2JpdF9p bXR0YmNyX3NsMCA9IHRydWUsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9p ZCBpcG1tdV9vZl9pZHNbXSA9IHsKKwl7CisJCS5jb21wYXRpYmxlID0gInJlbmVzYXMsaXBtbXUt dm1zYSIsCisJCS5kYXRhID0gJmlwbW11X2ZlYXR1cmVzX2RlZmF1bHQsCisJfSwgeworCQkuY29t cGF0aWJsZSA9ICJyZW5lc2FzLGlwbW11LXI4YTc3OTUiLAorCQkuZGF0YSA9ICZpcG1tdV9mZWF0 dXJlc19yY2FyX2dlbjMsCisJfSwgeworCQkuY29tcGF0aWJsZSA9ICJyZW5lc2FzLGlwbW11LXI4 YTc3OTYiLAorCQkuZGF0YSA9ICZpcG1tdV9mZWF0dXJlc19yY2FyX2dlbjMsCisJfSwgeworCQkv KiBUZXJtaW5hdG9yICovCisJfSwKK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGlwbW11 X29mX2lkcyk7CisKK3N0YXRpYyBpbnQgaXBtbXVfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2Rldmlj ZSAqcGRldikKK3sKKwlzdHJ1Y3QgaXBtbXVfdm1zYV9kZXZpY2UgKm1tdTsKKwljb25zdCBzdHJ1 Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaDsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlpbnQgaXJx OworCWludCByZXQ7CisKKwltYXRjaCA9IG9mX21hdGNoX25vZGUoaXBtbXVfb2ZfaWRzLCBwZGV2 LT5kZXYub2Zfbm9kZSk7CisJaWYgKCFtYXRjaCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltbXUg PSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCptbXUpLCBHRlBfS0VSTkVMKTsKKwlp ZiAoIW1tdSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW5ub3QgYWxsb2NhdGUgZGV2aWNl IGRhdGFcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwltbXUtPmRldiA9ICZwZGV2LT5k ZXY7CisJbW11LT5udW1fdXRsYnMgPSA0ODsKKwlzcGluX2xvY2tfaW5pdCgmbW11LT5sb2NrKTsK KwliaXRtYXBfemVybyhtbXUtPmN0eCwgSVBNTVVfQ1RYX01BWCk7CisJbW11LT5mZWF0dXJlcyA9 IG1hdGNoLT5kYXRhOworCWRtYV9zZXRfbWFza19hbmRfY29oZXJlbnQoJnBkZXYtPmRldiwgRE1B X0JJVF9NQVNLKDY0KSk7CisKKwkvKiBNYXAgSS9PIG1lbW9yeSBhbmQgcmVxdWVzdCBJUlEuICov CisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsK KwltbXUtPmJhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKKwlp ZiAoSVNfRVJSKG1tdS0+YmFzZSkpCisJCXJldHVybiBQVFJfRVJSKG1tdS0+YmFzZSk7CisKKwkv KgorCSAqIFRoZSBJUE1NVSBoYXMgdHdvIHJlZ2lzdGVyIGJhbmtzLCBmb3Igc2VjdXJlIGFuZCBu b24tc2VjdXJlIG1vZGVzLgorCSAqIFRoZSBiYW5rIG1hcHBlZCBhdCB0aGUgYmVnaW5uaW5nIG9m IHRoZSBJUE1NVSBhZGRyZXNzIHNwYWNlCisJICogY29ycmVzcG9uZHMgdG8gdGhlIHJ1bm5pbmcg bW9kZSBvZiB0aGUgQ1BVLiBXaGVuIHJ1bm5pbmcgaW4gc2VjdXJlCisJICogbW9kZSB0aGUgbm9u LXNlY3VyZSByZWdpc3RlciBiYW5rIGlzIGFsc28gYXZhaWxhYmxlIGF0IGFuIG9mZnNldC4KKwkg KgorCSAqIFNlY3VyZSBtb2RlIG9wZXJhdGlvbiBpc24ndCBjbGVhcmx5IGRvY3VtZW50ZWQgYW5k IGlzIHRodXMgY3VycmVudGx5CisJICogbm90IGltcGxlbWVudGVkIGluIHRoZSBkcml2ZXIuIEZ1 cnRoZXJtb3JlLCBwcmVsaW1pbmFyeSB0ZXN0cyBvZgorCSAqIG5vbi1zZWN1cmUgb3BlcmF0aW9u IHdpdGggdGhlIG1haW4gcmVnaXN0ZXIgYmFuayB3ZXJlIG5vdCBzdWNjZXNzZnVsLgorCSAqIE9m ZnNldCB0aGUgcmVnaXN0ZXJzIGJhc2UgdW5jb25kaXRpb25hbGx5IHRvIHBvaW50IHRvIHRoZSBu b24tc2VjdXJlCisJICogYWxpYXMgc3BhY2UgZm9yIG5vdy4KKwkgKi8KKwlpZiAobW11LT5mZWF0 dXJlcy0+dXNlX25zX2FsaWFzX29mZnNldCkKKwkJbW11LT5iYXNlICs9IElNX05TX0FMSUFTX09G RlNFVDsKKworCS8qCisJICogVGhlIG51bWJlciBvZiBjb250ZXh0cyB2YXJpZXMgd2l0aCBnZW5l cmF0aW9uIGFuZCBpbnN0YW5jZS4KKwkgKiBOZXdlciBTb0NzIGdldCBhIHRvdGFsIG9mIDggY29u dGV4dHMgZW5hYmxlZCwgb2xkZXIgb25lcyBqdXN0IG9uZS4KKwkgKi8KKwlpZiAobW11LT5mZWF0 dXJlcy0+aGFzX2VpZ2h0X2N0eCkKKwkJbW11LT5udW1fY3R4ID0gODsKKwllbHNlCisJCW1tdS0+ bnVtX2N0eCA9IDE7CisKKwlXQVJOX09OKG1tdS0+bnVtX2N0eCA+IElQTU1VX0NUWF9NQVgpOwor CisJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKworCS8qCisJICogRGV0ZXJtaW5l IGlmIHRoaXMgSVBNTVUgaW5zdGFuY2UgaXMgYSBsZWFmIGRldmljZSBieSBjaGVja2luZworCSAq IGlmIHRoZSByZW5lc2FzLGlwbW11LW1haW4gcHJvcGVydHkgZXhpc3RzIG9yIG5vdC4KKwkgKi8K KwlpZiAobW11LT5mZWF0dXJlcy0+aGFzX2NhY2hlX2xlYWZfbm9kZXMgJiYKKwkgICAgb2ZfZmlu ZF9wcm9wZXJ0eShwZGV2LT5kZXYub2Zfbm9kZSwgInJlbmVzYXMsaXBtbXUtbWFpbiIsIE5VTEwp KQorCQltbXUtPmlzX2xlYWYgPSB0cnVlOworCisJLyogUm9vdCBkZXZpY2VzIGhhdmUgbWFuZGF0 b3J5IElSUXMgKi8KKwlpZiAoaXBtbXVfaXNfcm9vdChtbXUpKSB7CisJCWlmIChpcnEgPCAwKSB7 CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJubyBJUlEgZm91bmRcbiIpOworCQkJcmV0dXJuIGly cTsKKwkJfQorCisJCXJldCA9IGRldm1fcmVxdWVzdF9pcnEoJnBkZXYtPmRldiwgaXJxLCBpcG1t dV9pcnEsIDAsCisJCQkJICAgICAgIGRldl9uYW1lKCZwZGV2LT5kZXYpLCBtbXUpOworCQlpZiAo cmV0IDwgMCkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHJlcXVlc3QgSVJR ICVkXG4iLCBpcnEpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCWlwbW11X2RldmljZV9yZXNl dChtbXUpOworCX0KKworCS8qCisJICogV2UgY2FuJ3QgY3JlYXRlIHRoZSBBUk0gbWFwcGluZyBo ZXJlIGFzIGl0IHJlcXVpcmVzIHRoZSBidXMgdG8gaGF2ZQorCSAqIGFuIElPTU1VLCB3aGljaCBv bmx5IGhhcHBlbnMgd2hlbiBidXNfc2V0X2lvbW11KCkgaXMgY2FsbGVkIGluCisJICogaXBtbXVf aW5pdCgpIGFmdGVyIHRoZSBwcm9iZSBmdW5jdGlvbiByZXR1cm5zLgorCSAqLworCisJc3Bpbl9s b2NrKCZpcG1tdV9kZXZpY2VzX2xvY2spOworCWxpc3RfYWRkKCZtbXUtPmxpc3QsICZpcG1tdV9k ZXZpY2VzKTsKKwlzcGluX3VubG9jaygmaXBtbXVfZGV2aWNlc19sb2NrKTsKKworCXBsYXRmb3Jt X3NldF9kcnZkYXRhKHBkZXYsIG1tdSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBp cG1tdV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgaXBt bXVfdm1zYV9kZXZpY2UgKm1tdSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJc3Bp bl9sb2NrKCZpcG1tdV9kZXZpY2VzX2xvY2spOworCWxpc3RfZGVsKCZtbXUtPmxpc3QpOworCXNw aW5fdW5sb2NrKCZpcG1tdV9kZXZpY2VzX2xvY2spOworCisjaWYgZGVmaW5lZChDT05GSUdfQVJN KSAmJiAhZGVmaW5lZChDT05GSUdfSU9NTVVfRE1BKQorCWFybV9pb21tdV9yZWxlYXNlX21hcHBp bmcobW11LT5tYXBwaW5nKTsKKyNlbmRpZgorCisJaXBtbXVfZGV2aWNlX3Jlc2V0KG1tdSk7CisK KwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19QTV9TTEVFUAorI2lmZGVmIENPTkZJR19S Q0FSX0REUl9CQUNLVVAKK3N0YXRpYyBpbnQgaXBtbXVfdXRsYnNfYmFja3VwKHN0cnVjdCBpcG1t dV92bXNhX2RldmljZSAqbW11KQoreworCXVuc2lnbmVkIGludCBpOworCXN0cnVjdCBpcG1tdV92 bXNhX2RldmljZSAqc2xhdmVfbW11ID0gTlVMTDsKKwlzdHJ1Y3QgaXBtbXVfdm1zYV9hcmNoZGF0 YSAqc2xhdmVfZGV2ID0gTlVMTDsKKworCXByX2RlYnVnKCIlczogSGFuZGxlIFVUTEIgYmFja3Vw XG4iLCBkZXZfbmFtZShtbXUtPmRldikpOworCisJc3Bpbl9sb2NrKCZpcG1tdV9zbGF2ZV9kZXZp Y2VzX2xvY2spOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShzbGF2ZV9kZXYsICZpcG1tdV9zbGF2 ZV9kZXZpY2VzLCBsaXN0KSB7CisJCXNsYXZlX21tdSA9IHNsYXZlX2Rldi0+bW11OworCisJCWlm IChzbGF2ZV9tbXUgIT0gbW11KQorCQkJY29udGludWU7CisKKwkJZm9yIChpID0gMDsgaSA8IHNs YXZlX2Rldi0+bnVtX3V0bGJzOyArK2kpIHsKKwkJCXNsYXZlX2Rldi0+dXRsYnNfdmFsW2ldID0K KwkJCQlpcG1tdV9yZWFkKHNsYXZlX21tdSwKKwkJCQkJSU1VQ1RSKHNsYXZlX2Rldi0+dXRsYnNb aV0pKTsKKwkJCXNsYXZlX2Rldi0+YXNpZHNfdmFsW2ldID0KKwkJCQlpcG1tdV9yZWFkKHNsYXZl X21tdSwKKwkJCQkJSU1VQVNJRChzbGF2ZV9kZXYtPnV0bGJzW2ldKSk7CisJCQlwcl9kZWJ1Zygi JWQ6IEJhY2t1cCBVVExCWyVkXTogMHgleCwgQVNJRFslZF06ICVkXG4iLAorCQkJCWksIHNsYXZl X2Rldi0+dXRsYnNbaV0sIHNsYXZlX2Rldi0+dXRsYnNfdmFsW2ldLAorCQkJCXNsYXZlX2Rldi0+ dXRsYnNbaV0sCisJCQkJc2xhdmVfZGV2LT5hc2lkc192YWxbaV0pOworCQl9CisJfQorCisJc3Bp bl91bmxvY2soJmlwbW11X3NsYXZlX2RldmljZXNfbG9jayk7CisKKwlyZXR1cm4gMDsKK30KKwor c3RhdGljIGludCBpcG1tdV91dGxic19yZXN0b3JlKHN0cnVjdCBpcG1tdV92bXNhX2RldmljZSAq bW11KQoreworCXVuc2lnbmVkIGludCBpOworCXN0cnVjdCBpcG1tdV92bXNhX2RldmljZSAqc2xh dmVfbW11ID0gTlVMTDsKKwlzdHJ1Y3QgaXBtbXVfdm1zYV9hcmNoZGF0YSAqc2xhdmVfZGV2ID0g TlVMTDsKKworCXByX2RlYnVnKCIlczogSGFuZGxlIFVUTEIgcmVzdG9yZVxuIiwgZGV2X25hbWUo bW11LT5kZXYpKTsKKworCXNwaW5fbG9jaygmaXBtbXVfc2xhdmVfZGV2aWNlc19sb2NrKTsKKwor CWxpc3RfZm9yX2VhY2hfZW50cnkoc2xhdmVfZGV2LCAmaXBtbXVfc2xhdmVfZGV2aWNlcywgbGlz dCkgeworCQlzbGF2ZV9tbXUgPSBzbGF2ZV9kZXYtPm1tdTsKKworCQlpZiAoc2xhdmVfbW11ICE9 IG1tdSkKKwkJCWNvbnRpbnVlOworCisJCWZvciAoaSA9IDA7IGkgPCBzbGF2ZV9kZXYtPm51bV91 dGxiczsgKytpKSB7CisJCQlpcG1tdV93cml0ZShzbGF2ZV9tbXUsIElNVUFTSUQoc2xhdmVfZGV2 LT51dGxic1tpXSksCisJCQkJCXNsYXZlX2Rldi0+YXNpZHNfdmFsW2ldKTsKKwkJCWlwbW11X3dy aXRlKHNsYXZlX21tdSwKKwkJCQlJTVVDVFIoc2xhdmVfZGV2LT51dGxic1tpXSksCisJCQkJKHNs YXZlX2Rldi0+dXRsYnNfdmFsW2ldIHwgSU1VQ1RSX0ZMVVNIKSk7CisJCQlwcl9kZWJ1ZygiJWQ6 IFJlc3RvcmUgVVRMQlslZF06IDB4JXgsIEFTSURbJWRdOiAlZFxuIiwKKwkJCQlpLCBzbGF2ZV9k ZXYtPnV0bGJzW2ldLAorCQkJCWlwbW11X3JlYWQoc2xhdmVfbW11LAorCQkJCQlJTVVDVFIoc2xh dmVfZGV2LT51dGxic1tpXSkpLAorCQkJCXNsYXZlX2Rldi0+dXRsYnNbaV0sCisJCQkJaXBtbXVf cmVhZChzbGF2ZV9tbXUsCisJCQkJSU1VQVNJRChzbGF2ZV9kZXYtPnV0bGJzW2ldKSkpOworCQl9 CisJfQorCisJc3Bpbl91bmxvY2soJmlwbW11X3NsYXZlX2RldmljZXNfbG9jayk7CisKKwlyZXR1 cm4gMDsKK30KKworc3RhdGljIGludCBpcG1tdV9kb21haW5fYmFja3VwX2NvbnRleHQoc3RydWN0 IGlwbW11X3Ztc2FfZG9tYWluICpkb21haW4pCit7CisJc3RydWN0IGlwbW11X3Ztc2FfZGV2aWNl ICptbXUgPSBkb21haW4tPnJvb3Q7CisJc3RydWN0IGh3X3JlZ2lzdGVyICpyZWcgPSBtbXUtPnJl Z19iYWNrdXBbZG9tYWluLT5jb250ZXh0X2lkXTsKKwl1bnNpZ25lZCBpbnQgaTsKKworCXByX2lu Zm8oIiVzOiBIYW5kbGUgZG9tYWluIGNvbnRleHQgYmFja3VwXG4iLCBkZXZfbmFtZShtbXUtPmRl dikpOworCisJZm9yIChpID0gMDsgaSA8IEhXX1JFR0lTVEVSX0JBQ0tVUF9TSVpFOyBpKyspIHsK KwkJcmVnW2ldLnJlZ19kYXRhID0gaXBtbXVfY3R4X3JlYWQoZG9tYWluLCByZWdbaV0ucmVnX29m ZnNldCk7CisKKwkJcHJfaW5mbygiJXM6IHJlZ19kYXRhIDB4JXgsIHJlZ19vZmZzZXQgMHgleFxu IiwKKwkJCQlyZWdbaV0ucmVnX25hbWUsCisJCQkJcmVnW2ldLnJlZ19kYXRhLAorCQkJCXJlZ1tp XS5yZWdfb2Zmc2V0KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpcG1tdV9k b21haW5fcmVzdG9yZV9jb250ZXh0KHN0cnVjdCBpcG1tdV92bXNhX2RvbWFpbiAqZG9tYWluKQor eworCXN0cnVjdCBpcG1tdV92bXNhX2RldmljZSAqbW11ID0gZG9tYWluLT5yb290OworCXN0cnVj dCBod19yZWdpc3RlciAqcmVnID0gbW11LT5yZWdfYmFja3VwW2RvbWFpbi0+Y29udGV4dF9pZF07 CisJdW5zaWduZWQgaW50IGk7CisKKwlwcl9pbmZvKCIlczogSGFuZGxlIGRvbWFpbiBjb250ZXh0 IHJlc3RvcmVcbiIsIGRldl9uYW1lKG1tdS0+ZGV2KSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgSFdf UkVHSVNURVJfQkFDS1VQX1NJWkU7IGkrKykgeworCQlpZiAocmVnW2ldLnJlZ19vZmZzZXQgIT0g SU1DVFIpIHsKKwkJCWlwbW11X2N0eF93cml0ZShkb21haW4sCisJCQkJcmVnW2ldLnJlZ19vZmZz ZXQsCisJCQkJcmVnW2ldLnJlZ19kYXRhKTsKKworCQkJcHJfaW5mbygiJXM6IHJlZ19kYXRhIDB4 JXgsIHJlZ19vZmZzZXQgMHgleFxuIiwKKwkJCQlyZWdbaV0ucmVnX25hbWUsCisJCQkJaXBtbXVf Y3R4X3JlYWQoZG9tYWluLCByZWdbaV0ucmVnX29mZnNldCksCisJCQkJcmVnW2ldLnJlZ19vZmZz ZXQpOworCisJCX0gZWxzZSB7CisJCQlpcG1tdV9jdHhfd3JpdGUyKGRvbWFpbiwKKwkJCQlyZWdb aV0ucmVnX29mZnNldCwKKwkJCQlyZWdbaV0ucmVnX2RhdGEgfCBJTUNUUl9GTFVTSCk7CisKKwkJ CXByX2luZm8oIiVzOiByZWdfZGF0YSAweCV4LCByZWdfb2Zmc2V0IDB4JXhcbiIsCisJCQkJcmVn W2ldLnJlZ19uYW1lLAorCQkJCWlwbW11X2N0eF9yZWFkKGRvbWFpbiwKKwkJCQkJcmVnW2ldLnJl Z19vZmZzZXQpLAorCQkJCXJlZ1tpXS5yZWdfb2Zmc2V0KTsKKwkJfQorCX0KKworCXJldHVybiAw OworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgaXBtbXVfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpk ZXYpCit7CisjaWZkZWYgQ09ORklHX1JDQVJfRERSX0JBQ0tVUAorCWludCBjdHg7CisJdW5zaWdu ZWQgaW50IGk7CisJc3RydWN0IGlwbW11X3Ztc2FfZGV2aWNlICptbXUgPSBkZXZfZ2V0X2RydmRh dGEoZGV2KTsKKworCXByX2RlYnVnKCIlczogJXNcbiIsIF9fZnVuY19fLCBkZXZfbmFtZShkZXYp KTsKKworCS8qIE9ubHkgYmFja3VwIFVUTEIgaW4gSVBNTVUgY2FjaGUgZGV2aWNlcyovCisJaWYg KCFpcG1tdV9pc19yb290KG1tdSkpCisJCWlwbW11X3V0bGJzX2JhY2t1cChtbXUpOworCisJY3R4 ID0gZmluZF9maXJzdF96ZXJvX2JpdChtbXUtPmN0eCwgbW11LT5udW1fY3R4KTsKKworCWZvciAo aSA9IDA7IGkgPCBjdHg7IGkrKykgeworCQlwcl9pbmZvKCJIYW5kbGUgY3R4ICVkXG4iLCBpKTsK KwkJaXBtbXVfZG9tYWluX2JhY2t1cF9jb250ZXh0KG1tdS0+ZG9tYWluc1tpXSk7CisJfQorI2Vu ZGlmCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpcG1tdV9yZXN1bWUoc3RydWN0IGRl dmljZSAqZGV2KQoreworI2lmZGVmIENPTkZJR19SQ0FSX0REUl9CQUNLVVAKKwlpbnQgY3R4Owor CXVuc2lnbmVkIGludCBpOworCXN0cnVjdCBpcG1tdV92bXNhX2RldmljZSAqbW11ID0gZGV2X2dl dF9kcnZkYXRhKGRldik7CisKKwlwcl9kZWJ1ZygiJXM6ICVzXG4iLCBfX2Z1bmNfXywgZGV2X25h bWUoZGV2KSk7CisKKwljdHggPSBmaW5kX2ZpcnN0X3plcm9fYml0KG1tdS0+Y3R4LCBtbXUtPm51 bV9jdHgpOworCisJZm9yIChpID0gMDsgaSA8IGN0eDsgaSsrKSB7CisJCXByX2luZm8oIkhhbmRs ZSBjdHggJWRcbiIsIGkpOworCQlpcG1tdV9kb21haW5fcmVzdG9yZV9jb250ZXh0KG1tdS0+ZG9t YWluc1tpXSk7CisJfQorCisJLyogT25seSBiYWNrdXAgVVRMQiBpbiBJUE1NVSBjYWNoZSBkZXZp Y2VzKi8KKwlpZiAoIWlwbW11X2lzX3Jvb3QobW11KSkKKwkJaXBtbXVfdXRsYnNfcmVzdG9yZSht bXUpOworI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIFNJTVBMRV9ERVZfUE1fT1BT KGlwbW11X3BtX29wcywKKwkJCWlwbW11X3N1c3BlbmQsIGlwbW11X3Jlc3VtZSk7CisjZGVmaW5l IERFVl9QTV9PUFMgKCZpcG1tdV9wbV9vcHMpCisjZWxzZQorI2RlZmluZSBERVZfUE1fT1BTIE5V TEwKKyNlbmRpZiAvKiBDT05GSUdfUE1fU0xFRVAgKi8KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9y bV9kcml2ZXIgaXBtbXVfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImlwbW11 LXZtc2EiLAorCQkucG0JPSBERVZfUE1fT1BTLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBvZl9tYXRj aF9wdHIoaXBtbXVfb2ZfaWRzKSwKKwl9LAorCS5wcm9iZSA9IGlwbW11X3Byb2JlLAorCS5yZW1v dmUJPSBpcG1tdV9yZW1vdmUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpcG1tdV9pbml0KHZv aWQpCit7CisJc3RhdGljIGJvb2wgc2V0dXBfZG9uZTsKKwlpbnQgcmV0OworCisJaWYgKHNldHVw X2RvbmUpCisJCXJldHVybiAwOworCisJcmV0ID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZp cG1tdV9kcml2ZXIpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisjaWYgZGVmaW5l ZChDT05GSUdfQVJNKSAmJiAhZGVmaW5lZChDT05GSUdfSU9NTVVfRE1BKQorCWlmICghaW9tbXVf cHJlc2VudCgmcGxhdGZvcm1fYnVzX3R5cGUpKQorCQlidXNfc2V0X2lvbW11KCZwbGF0Zm9ybV9i dXNfdHlwZSwgJmlwbW11X29wcyk7CisjZW5kaWYKKworCXNldHVwX2RvbmUgPSB0cnVlOworCXJl dHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgaXBtbXVfZXhpdCh2b2lkKQoreworCXJl dHVybiBwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmaXBtbXVfZHJpdmVyKTsKK30KKworc3Vi c3lzX2luaXRjYWxsKGlwbW11X2luaXQpOworbW9kdWxlX2V4aXQoaXBtbXVfZXhpdCk7CisKKyNp ZmRlZiBDT05GSUdfSU9NTVVfRE1BCitzdGF0aWMgaW50IF9faW5pdCBpcG1tdV92bXNhX2lvbW11 X29mX3NldHVwKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCit7CisJc3RhdGljIGNvbnN0IHN0cnVj dCBpb21tdV9vcHMgKm9wcyA9ICZpcG1tdV9vcHM7CisKKwlpcG1tdV9pbml0KCk7CisKKwlvZl9p b21tdV9zZXRfb3BzKG5wLCAoc3RydWN0IGlvbW11X29wcyAqKW9wcyk7CisJaWYgKCFpb21tdV9w cmVzZW50KCZwbGF0Zm9ybV9idXNfdHlwZSkpCisJCWJ1c19zZXRfaW9tbXUoJnBsYXRmb3JtX2J1 c190eXBlLCBvcHMpOworCisJcmV0dXJuIDA7Cit9CisKK0lPTU1VX09GX0RFQ0xBUkUoaXBtbXVf dm1zYV9pb21tdV9vZiwgInJlbmVzYXMsaXBtbXUtdm1zYSIsCisJCSBpcG1tdV92bXNhX2lvbW11 X29mX3NldHVwKTsKK0lPTU1VX09GX0RFQ0xBUkUoaXBtbXVfcjhhNzc5NV9pb21tdV9vZiwgInJl bmVzYXMsaXBtbXUtcjhhNzc5NSIsCisJCSBpcG1tdV92bXNhX2lvbW11X29mX3NldHVwKTsKK0lP TU1VX09GX0RFQ0xBUkUoaXBtbXVfcjhhNzc5Nl9pb21tdV9vZiwgInJlbmVzYXMsaXBtbXUtcjhh Nzc5NiIsCisJCSBpcG1tdV92bXNhX2lvbW11X29mX3NldHVwKTsKKyNlbmRpZgorCitNT0RVTEVf REVTQ1JJUFRJT04oIklPTU1VIEFQSSBmb3IgUmVuZXNhcyBWTVNBLWNvbXBhdGlibGUgSVBNTVUi KTsKK01PRFVMRV9BVVRIT1IoIkxhdXJlbnQgUGluY2hhcnQgPGxhdXJlbnQucGluY2hhcnRAaWRl YXNvbmJvYXJkLmNvbT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKLS0gCjIuNy40CgoK X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KWGVuLWRldmVs IG1haWxpbmcgbGlzdApYZW4tZGV2ZWxAbGlzdHMueGVuLm9yZwpodHRwczovL2xpc3RzLnhlbi5v cmcveGVuLWRldmVsCg==