From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Liu, Yi L" Subject: [RFC v3 1/3] vfio_pci: split vfio_pci.c into two source files Date: Tue, 23 Apr 2019 20:14:38 +0800 Message-ID: <1556021680-2911-2-git-send-email-yi.l.liu@intel.com> References: <1556021680-2911-1-git-send-email-yi.l.liu@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <1556021680-2911-1-git-send-email-yi.l.liu-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: iommu-bounces-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org Errors-To: iommu-bounces-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org To: alex.williamson-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org, kwankhede-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org Cc: kevin.tian-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org, kvm-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, Liu-i9wRM+HIrmnmtl4Z8vJ8Kg761KYD1DLY@public.gmane.org, jean-philippe.brucker-5wv7dgnIgG8@public.gmane.org, linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, yamada.masahiro-uWyLwvC0a2jby3iVrkZq2A@public.gmane.org, yi.y.sun-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org, iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org List-Id: iommu@lists.linux-foundation.org VGhpcyBwYXRjaCBzcGxpdHMgdGhlIG5vbi1tb2R1bGUgc3BlY2lmaWMgY29kZXMgZnJvbSBvcmln aW5hbApkcml2ZXJzL3ZmaW8vcGNpL3ZmaW9fcGNpLmMgaW50byBhIGNvbW1vbi5jIHVuZGVyIGRy aXZlcnMvdmZpby9wY2kuClRoaXMgaXMgZm9yIHBvdGVudGlhbCBjb2RlIHNoYXJpbmcuIGUuZy4g dmZpby1tZGV2LXBjaSBkcml2ZXIKCkNjOiBLZXZpbiBUaWFuIDxrZXZpbi50aWFuQGludGVsLmNv bT4KQ2M6IEx1IEJhb2x1IDxiYW9sdS5sdUBsaW51eC5pbnRlbC5jb20+ClNpZ25lZC1vZmYtYnk6 IExpdSwgWWkgTCA8eWkubC5saXVAaW50ZWwuY29tPgotLS0KIGRyaXZlcnMvdmZpby9wY2kvTWFr ZWZpbGUgICAgICAgICAgIHwgICAgMiArLQogZHJpdmVycy92ZmlvL3BjaS9jb21tb24uYyAgICAg ICAgICAgfCAxNTExICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCiBkcml2ZXJz L3ZmaW8vcGNpL3ZmaW9fcGNpLmMgICAgICAgICB8IDE0NzYgKy0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLQogZHJpdmVycy92ZmlvL3BjaS92ZmlvX3BjaV9wcml2YXRlLmggfCAgIDI3 ICsKIDQgZmlsZXMgY2hhbmdlZCwgMTU1MSBpbnNlcnRpb25zKCspLCAxNDY1IGRlbGV0aW9ucygt KQogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvdmZpby9wY2kvY29tbW9uLmMKCmRpZmYgLS1n aXQgYS9kcml2ZXJzL3ZmaW8vcGNpL01ha2VmaWxlIGIvZHJpdmVycy92ZmlvL3BjaS9NYWtlZmls ZQppbmRleCA5NjYyYzA2Li44MTNmNmIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZmaW8vcGNpL01h a2VmaWxlCisrKyBiL2RyaXZlcnMvdmZpby9wY2kvTWFrZWZpbGUKQEAgLTEsNSArMSw1IEBACiAK LXZmaW8tcGNpLXkgOj0gdmZpb19wY2kubyB2ZmlvX3BjaV9pbnRycy5vIHZmaW9fcGNpX3Jkd3Iu byB2ZmlvX3BjaV9jb25maWcubwordmZpby1wY2kteSA6PSB2ZmlvX3BjaS5vIGNvbW1vbi5vIHZm aW9fcGNpX2ludHJzLm8gdmZpb19wY2lfcmR3ci5vIHZmaW9fcGNpX2NvbmZpZy5vCiB2ZmlvLXBj aS0kKENPTkZJR19WRklPX1BDSV9JR0QpICs9IHZmaW9fcGNpX2lnZC5vCiB2ZmlvLXBjaS0kKENP TkZJR19WRklPX1BDSV9OVkxJTksyKSArPSB2ZmlvX3BjaV9udmxpbmsyLm8KIApkaWZmIC0tZ2l0 IGEvZHJpdmVycy92ZmlvL3BjaS9jb21tb24uYyBiL2RyaXZlcnMvdmZpby9wY2kvY29tbW9uLmMK bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ3ZTJlNAotLS0gL2Rldi9udWxs CisrKyBiL2RyaXZlcnMvdmZpby9wY2kvY29tbW9uLmMKQEAgLTAsMCArMSwxNTExIEBACisvKgor ICogQ29weXJpZ2h0IMKpIDIwMTkgSW50ZWwgQ29ycG9yYXRpb24uCisgKiAgICAgQXV0aG9yOiBM aXUsIFlpIEwgPHlpLmwubGl1QGludGVsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJl ZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQg dW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9u IDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoK KyAqIERlcml2ZWQgZnJvbSBvcmlnaW5hbCB2ZmlvX3BjaS5jOgorICogQ29weXJpZ2h0IChDKSAy MDEyIFJlZCBIYXQsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAgICAgQXV0aG9yOiBB bGV4IFdpbGxpYW1zb24gPGFsZXgud2lsbGlhbXNvbkByZWRoYXQuY29tPgorICoKKyAqIERlcml2 ZWQgZnJvbSBvcmlnaW5hbCB2ZmlvOgorICogQ29weXJpZ2h0IDIwMTAgQ2lzY28gU3lzdGVtcywg SW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIEF1dGhvcjogVG9tIEx5b24sIHB1Z3NAY2lz Y28uY29tCisgKi8KKworI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZt dAorCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXZlbnRmZC5o PgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4K KyNpbmNsdWRlIDxsaW51eC9pb21tdS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2lu Y2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNs dWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CisjaW5jbHVk ZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGlu dXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZmaW8uaD4KKyNpbmNsdWRlIDxsaW51eC92 Z2FhcmIuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3NwZWMuaD4KKworI2luY2x1ZGUgInZmaW9fcGNp X3ByaXZhdGUuaCIKKworaW5saW5lIGJvb2wgdmZpb192Z2FfZGlzYWJsZWQoc3RydWN0IHZmaW9f cGNpX2RldmljZSAqdmRldikKK3sKKyNpZmRlZiBDT05GSUdfVkZJT19QQ0lfVkdBCisJcmV0dXJu IHZkZXYtPmRpc2FibGVfdmdhOworI2Vsc2UKKwlyZXR1cm4gdHJ1ZTsKKyNlbmRpZgorfQorCisv KgorICogT3VyIFZHQSBhcmJpdGVyIHBhcnRpY2lwYXRpb24gaXMgbGltaXRlZCBzaW5jZSB3ZSBk b24ndCBrbm93IGFueXRoaW5nCisgKiBhYm91dCB0aGUgZGV2aWNlIGl0c2VsZi4gIEhvd2V2ZXIs IGlmIHRoZSBkZXZpY2UgaXMgdGhlIG9ubHkgVkdBIGRldmljZQorICogZG93bnN0cmVhbSBvZiBh IGJyaWRnZSBhbmQgVkZJTyBWR0Egc3VwcG9ydCBpcyBkaXNhYmxlZCwgdGhlbiB3ZSBjYW4KKyAq IHNhZmVseSByZXR1cm4gbGVnYWN5IFZHQSBJTyBhbmQgbWVtb3J5IGFzIG5vdCBkZWNvZGVkIHNp bmNlIHRoZSB1c2VyCisgKiBoYXMgbm8gd2F5IHRvIGdldCB0byBpdCBhbmQgcm91dGluZyBjYW4g YmUgZGlzYWJsZWQgZXh0ZXJuYWxseSBhdCB0aGUKKyAqIGJyaWRnZS4KKyAqLworc3RhdGljIHVu c2lnbmVkIGludCB2ZmlvX3BjaV9zZXRfdmdhX2RlY29kZSh2b2lkICpvcGFxdWUsIGJvb2wgc2lu Z2xlX3ZnYSkKK3sKKwlzdHJ1Y3QgdmZpb19wY2lfZGV2aWNlICp2ZGV2ID0gb3BhcXVlOworCXN0 cnVjdCBwY2lfZGV2ICp0bXAgPSBOVUxMLCAqcGRldiA9IHZkZXYtPnBkZXY7CisJdW5zaWduZWQg Y2hhciBtYXhfYnVzbnI7CisJdW5zaWduZWQgaW50IGRlY29kZXM7CisKKwlpZiAoc2luZ2xlX3Zn YSB8fCAhdmZpb192Z2FfZGlzYWJsZWQodmRldikgfHwKKwkgICAgcGNpX2lzX3Jvb3RfYnVzKHBk ZXYtPmJ1cykpCisJCXJldHVybiBWR0FfUlNSQ19OT1JNQUxfSU8gfCBWR0FfUlNSQ19OT1JNQUxf TUVNIHwKKwkJICAgICAgIFZHQV9SU1JDX0xFR0FDWV9JTyB8IFZHQV9SU1JDX0xFR0FDWV9NRU07 CisKKwltYXhfYnVzbnIgPSBwY2lfYnVzX21heF9idXNucihwZGV2LT5idXMpOworCWRlY29kZXMg PSBWR0FfUlNSQ19OT1JNQUxfSU8gfCBWR0FfUlNSQ19OT1JNQUxfTUVNOworCisJd2hpbGUgKCh0 bXAgPSBwY2lfZ2V0X2NsYXNzKFBDSV9DTEFTU19ESVNQTEFZX1ZHQSA8PCA4LCB0bXApKSAhPSBO VUxMKSB7CisJCWlmICh0bXAgPT0gcGRldiB8fAorCQkgICAgcGNpX2RvbWFpbl9ucih0bXAtPmJ1 cykgIT0gcGNpX2RvbWFpbl9ucihwZGV2LT5idXMpIHx8CisJCSAgICBwY2lfaXNfcm9vdF9idXMo dG1wLT5idXMpKQorCQkJY29udGludWU7CisKKwkJaWYgKHRtcC0+YnVzLT5udW1iZXIgPj0gcGRl di0+YnVzLT5udW1iZXIgJiYKKwkJICAgIHRtcC0+YnVzLT5udW1iZXIgPD0gbWF4X2J1c25yKSB7 CisJCQlwY2lfZGV2X3B1dCh0bXApOworCQkJZGVjb2RlcyB8PSBWR0FfUlNSQ19MRUdBQ1lfSU8g fCBWR0FfUlNSQ19MRUdBQ1lfTUVNOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gZGVj b2RlczsKK30KKworaW5saW5lIGJvb2wgdmZpb19wY2lfaXNfdmdhKHN0cnVjdCBwY2lfZGV2ICpw ZGV2KQoreworCXJldHVybiAocGRldi0+Y2xhc3MgPj4gOCkgPT0gUENJX0NMQVNTX0RJU1BMQVlf VkdBOworfQorCit2b2lkIHZmaW9fcGNpX3ZnYV9wcm9iZShzdHJ1Y3QgdmZpb19wY2lfZGV2aWNl ICp2ZGV2KQoreworCXZnYV9jbGllbnRfcmVnaXN0ZXIodmRldi0+cGRldiwgdmRldiwgTlVMTCwg dmZpb19wY2lfc2V0X3ZnYV9kZWNvZGUpOworCXZnYV9zZXRfbGVnYWN5X2RlY29kaW5nKHZkZXYt PnBkZXYsCisJCQkJdmZpb19wY2lfc2V0X3ZnYV9kZWNvZGUodmRldiwgZmFsc2UpKTsKK30KKwor dm9pZCB2ZmlvX3BjaV92Z2FfcmVtb3ZlKHN0cnVjdCB2ZmlvX3BjaV9kZXZpY2UgKnZkZXYpCit7 CisJdmdhX2NsaWVudF9yZWdpc3Rlcih2ZGV2LT5wZGV2LCBOVUxMLCBOVUxMLCBOVUxMKTsKKwl2 Z2Ffc2V0X2xlZ2FjeV9kZWNvZGluZyh2ZGV2LT5wZGV2LAorCQkJVkdBX1JTUkNfTk9STUFMX0lP IHwgVkdBX1JTUkNfTk9STUFMX01FTSB8CisJCQlWR0FfUlNSQ19MRUdBQ1lfSU8gfCBWR0FfUlNS Q19MRUdBQ1lfTUVNKTsKK30KKworc3RhdGljIHZvaWQgdmZpb19wY2lfcHJvYmVfbW1hcHMoc3Ry dWN0IHZmaW9fcGNpX2RldmljZSAqdmRldikKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlp bnQgYmFyOworCXN0cnVjdCB2ZmlvX3BjaV9kdW1teV9yZXNvdXJjZSAqZHVtbXlfcmVzOworCisJ SU5JVF9MSVNUX0hFQUQoJnZkZXYtPmR1bW15X3Jlc291cmNlc19saXN0KTsKKworCWZvciAoYmFy ID0gUENJX1NURF9SRVNPVVJDRVM7IGJhciA8PSBQQ0lfU1REX1JFU09VUkNFX0VORDsgYmFyKysp IHsKKwkJcmVzID0gdmRldi0+cGRldi0+cmVzb3VyY2UgKyBiYXI7CisKKwkJaWYgKCFJU19FTkFC TEVEKENPTkZJR19WRklPX1BDSV9NTUFQKSkKKwkJCWdvdG8gbm9fbW1hcDsKKworCQlpZiAoIShy ZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9NRU0pKQorCQkJZ290byBub19tbWFwOworCisJCS8qCisJ CSAqIFRoZSBQQ0kgY29yZSBzaG91bGRuJ3Qgc2V0IHVwIGEgcmVzb3VyY2Ugd2l0aCBhCisJCSAq IHR5cGUgYnV0IHplcm8gc2l6ZS4gQnV0IHRoZXJlIG1heSBiZSBidWdzIHRoYXQKKwkJICogY2F1 c2UgdXMgdG8gZG8gdGhhdC4KKwkJICovCisJCWlmICghcmVzb3VyY2Vfc2l6ZShyZXMpKQorCQkJ Z290byBub19tbWFwOworCisJCWlmIChyZXNvdXJjZV9zaXplKHJlcykgPj0gUEFHRV9TSVpFKSB7 CisJCQl2ZGV2LT5iYXJfbW1hcF9zdXBwb3J0ZWRbYmFyXSA9IHRydWU7CisJCQljb250aW51ZTsK KwkJfQorCisJCWlmICghKHJlcy0+c3RhcnQgJiB+UEFHRV9NQVNLKSkgeworCQkJLyoKKwkJCSAq IEFkZCBhIGR1bW15IHJlc291cmNlIHRvIHJlc2VydmUgdGhlIHJlbWFpbmRlcgorCQkJICogb2Yg dGhlIGV4Y2x1c2l2ZSBwYWdlIGluIGNhc2UgdGhhdCBob3QtYWRkCisJCQkgKiBkZXZpY2UncyBi YXIgaXMgYXNzaWduZWQgaW50byBpdC4KKwkJCSAqLworCQkJZHVtbXlfcmVzID0ga3phbGxvYyhz aXplb2YoKmR1bW15X3JlcyksIEdGUF9LRVJORUwpOworCQkJaWYgKGR1bW15X3JlcyA9PSBOVUxM KQorCQkJCWdvdG8gbm9fbW1hcDsKKworCQkJZHVtbXlfcmVzLT5yZXNvdXJjZS5uYW1lID0gInZm aW8gc3ViLXBhZ2UgcmVzZXJ2ZWQiOworCQkJZHVtbXlfcmVzLT5yZXNvdXJjZS5zdGFydCA9IHJl cy0+ZW5kICsgMTsKKwkJCWR1bW15X3Jlcy0+cmVzb3VyY2UuZW5kID0gcmVzLT5zdGFydCArIFBB R0VfU0laRSAtIDE7CisJCQlkdW1teV9yZXMtPnJlc291cmNlLmZsYWdzID0gcmVzLT5mbGFnczsK KwkJCWlmIChyZXF1ZXN0X3Jlc291cmNlKHJlcy0+cGFyZW50LAorCQkJCQkJJmR1bW15X3Jlcy0+ cmVzb3VyY2UpKSB7CisJCQkJa2ZyZWUoZHVtbXlfcmVzKTsKKwkJCQlnb3RvIG5vX21tYXA7CisJ CQl9CisJCQlkdW1teV9yZXMtPmluZGV4ID0gYmFyOworCQkJbGlzdF9hZGQoJmR1bW15X3Jlcy0+ cmVzX25leHQsCisJCQkJCSZ2ZGV2LT5kdW1teV9yZXNvdXJjZXNfbGlzdCk7CisJCQl2ZGV2LT5i YXJfbW1hcF9zdXBwb3J0ZWRbYmFyXSA9IHRydWU7CisJCQljb250aW51ZTsKKwkJfQorCQkvKgor CQkgKiBIZXJlIHdlIGRvbid0IGhhbmRsZSB0aGUgY2FzZSB3aGVuIHRoZSBCQVIgaXMgbm90IHBh Z2UKKwkJICogYWxpZ25lZCBiZWNhdXNlIHdlIGNhbid0IGV4cGVjdCB0aGUgQkFSIHdpbGwgYmUK KwkJICogYXNzaWduZWQgaW50byB0aGUgc2FtZSBsb2NhdGlvbiBpbiBhIHBhZ2UgaW4gZ3Vlc3QK KwkJICogd2hlbiB3ZSBwYXNzdGhyb3VnaCB0aGUgQkFSLiBBbmQgaXQncyBoYXJkIHRvIGFjY2Vz cworCQkgKiB0aGlzIEJBUiBpbiB1c2Vyc3BhY2UgYmVjYXVzZSB3ZSBoYXZlIG5vIHdheSB0byBn ZXQKKwkJICogdGhlIEJBUidzIGxvY2F0aW9uIGluIGEgcGFnZS4KKwkJICovCitub19tbWFwOgor CQl2ZGV2LT5iYXJfbW1hcF9zdXBwb3J0ZWRbYmFyXSA9IGZhbHNlOworCX0KK30KKworc3RhdGlj IHZvaWQgdmZpb19wY2lfdHJ5X2J1c19yZXNldChzdHJ1Y3QgdmZpb19wY2lfZGV2aWNlICp2ZGV2 KTsKKworLyoKKyAqIElOVHggbWFza2luZyByZXF1aXJlcyB0aGUgYWJpbGl0eSB0byBkaXNhYmxl IElOVHggc2lnbmFsaW5nIHZpYSBQQ0lfQ09NTUFORAorICogX2FuZF8gdGhlIGFiaWxpdHkgZGV0 ZWN0IHdoZW4gdGhlIGRldmljZSBpcyBhc3NlcnRpbmcgSU5UeCB2aWEgUENJX1NUQVRVUy4KKyAq IElmIGEgZGV2aWNlIGltcGxlbWVudHMgdGhlIGZvcm1lciBidXQgbm90IHRoZSBsYXR0ZXIgd2Ug d291bGQgdHlwaWNhbGx5CisgKiBleHBlY3QgYnJva2VuX2ludHhfbWFza2luZyBiZSBzZXQgYW5k IHJlcXVpcmUgYW4gZXhjbHVzaXZlIGludGVycnVwdC4KKyAqIEhvd2V2ZXIgc2luY2Ugd2UgZG8g aGF2ZSBjb250cm9sIG9mIHRoZSBkZXZpY2UncyBhYmlsaXR5IHRvIGFzc2VydCBJTlR4LAorICog d2UgY2FuIGluc3RlYWQgcHJldGVuZCB0aGF0IHRoZSBkZXZpY2UgZG9lcyBub3QgaW1wbGVtZW50 IElOVHgsIHZpcnR1YWxpemluZworICogdGhlIHBpbiByZWdpc3RlciB0byByZXBvcnQgemVybyBh bmQgbWFpbnRhaW5pbmcgRGlzSU5UeCBzZXQgb24gdGhlIGhvc3QuCisgKi8KK3N0YXRpYyBib29s IHZmaW9fcGNpX25vaW50eChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzd2l0Y2ggKHBkZXYt PnZlbmRvcikgeworCWNhc2UgUENJX1ZFTkRPUl9JRF9JTlRFTDoKKwkJc3dpdGNoIChwZGV2LT5k ZXZpY2UpIHsKKwkJLyogQWxsIGk0MGUgKFhMNzEwL1g3MTAvWFhWNzEwKSAxMC8yMC8yNS80MEdi RSBOSUNzICovCisJCWNhc2UgMHgxNTcyOgorCQljYXNlIDB4MTU3NDoKKwkJY2FzZSAweDE1ODAg Li4uIDB4MTU4MToKKwkJY2FzZSAweDE1ODMgLi4uIDB4MTU4YjoKKwkJY2FzZSAweDM3ZDAgLi4u IDB4MzdkMjoKKwkJCXJldHVybiB0cnVlOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIGZhbHNlOwor CQl9CisJfQorCisJcmV0dXJuIGZhbHNlOworfQorCit2b2lkIHZmaW9fcGNpX3Byb2JlX3Bvd2Vy X3N0YXRlKHN0cnVjdCB2ZmlvX3BjaV9kZXZpY2UgKnZkZXYpCit7CisJc3RydWN0IHBjaV9kZXYg KnBkZXYgPSB2ZGV2LT5wZGV2OworCXUxNiBwbWNzcjsKKworCWlmICghcGRldi0+cG1fY2FwKQor CQlyZXR1cm47CisKKwlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBwZGV2LT5wbV9jYXAgKyBQ Q0lfUE1fQ1RSTCwgJnBtY3NyKTsKKworCXZkZXYtPm5lZWRzX3BtX3Jlc3RvcmUgPSAhKHBtY3Ny ICYgUENJX1BNX0NUUkxfTk9fU09GVF9SRVNFVCk7Cit9CisKKy8qCisgKiBwY2lfc2V0X3Bvd2Vy X3N0YXRlKCkgd3JhcHBlciBoYW5kbGluZyBkZXZpY2VzIHdoaWNoIHBlcmZvcm0gYSBzb2Z0IHJl c2V0IG9uCisgKiBEMy0+RDAgdHJhbnNpdGlvbi4gIFNhdmUgc3RhdGUgcHJpb3IgdG8gRDAvMS8y LT5EMywgc3Rhc2ggaXQgb24gdGhlIHZkZXYsCisgKiByZXN0b3JlIHdoZW4gcmV0dXJuZWQgdG8g RDAuICBTYXZlZCBzZXBhcmF0ZWx5IGZyb20gcGNpX3NhdmVkX3N0YXRlIGZvciB1c2UKKyAqIGJ5 IFBNIGNhcGFiaWxpdHkgZW11bGF0aW9uIGFuZCBzZXBhcmF0ZWx5IGZyb20gcGNpX2RldiBpbnRl cm5hbCBzYXZlZCBzdGF0ZQorICogdG8gYXZvaWQgaXQgYmVpbmcgb3ZlcndyaXR0ZW4gYW5kIGNv bnN1bWVkIGFyb3VuZCBvdGhlciByZXNldHMuCisgKi8KK2ludCB2ZmlvX3BjaV9zZXRfcG93ZXJf c3RhdGUoc3RydWN0IHZmaW9fcGNpX2RldmljZSAqdmRldiwgcGNpX3Bvd2VyX3Qgc3RhdGUpCit7 CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB2ZGV2LT5wZGV2OworCWJvb2wgbmVlZHNfcmVzdG9y ZSA9IGZhbHNlLCBuZWVkc19zYXZlID0gZmFsc2U7CisJaW50IHJldDsKKworCWlmICh2ZGV2LT5u ZWVkc19wbV9yZXN0b3JlKSB7CisJCWlmIChwZGV2LT5jdXJyZW50X3N0YXRlIDwgUENJX0QzaG90 ICYmIHN0YXRlID49IFBDSV9EM2hvdCkgeworCQkJcGNpX3NhdmVfc3RhdGUocGRldik7CisJCQlu ZWVkc19zYXZlID0gdHJ1ZTsKKwkJfQorCisJCWlmIChwZGV2LT5jdXJyZW50X3N0YXRlID49IFBD SV9EM2hvdCAmJiBzdGF0ZSA8PSBQQ0lfRDApCisJCQluZWVkc19yZXN0b3JlID0gdHJ1ZTsKKwl9 CisKKwlyZXQgPSBwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIHN0YXRlKTsKKworCWlmICghcmV0 KSB7CisJCS8qIEQzIG1pZ2h0IGJlIHVuc3VwcG9ydGVkIHZpYSBxdWlyaywgc2tpcCB1bmxlc3Mg aW4gRDMgKi8KKwkJaWYgKG5lZWRzX3NhdmUgJiYgcGRldi0+Y3VycmVudF9zdGF0ZSA+PSBQQ0lf RDNob3QpIHsKKwkJCXZkZXYtPnBtX3NhdmUgPSBwY2lfc3RvcmVfc2F2ZWRfc3RhdGUocGRldik7 CisJCX0gZWxzZSBpZiAobmVlZHNfcmVzdG9yZSkgeworCQkJcGNpX2xvYWRfYW5kX2ZyZWVfc2F2 ZWRfc3RhdGUocGRldiwgJnZkZXYtPnBtX3NhdmUpOworCQkJcGNpX3Jlc3RvcmVfc3RhdGUocGRl dik7CisJCX0KKwl9CisKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIHZmaW9fcGNpX3Byb2JlX2lk bGVfZDMoc3RydWN0IHZmaW9fcGNpX2RldmljZSAqdmRldikKK3sKKworCS8qCisJICogcGNpLWNv cmUgc2V0cyB0aGUgZGV2aWNlIHBvd2VyIHN0YXRlIHRvIGFuIHVua25vd24gdmFsdWUgYXQKKwkg KiBib290dXAgYW5kIGFmdGVyIGJlaW5nIHJlbW92ZWQgZnJvbSBhIGRyaXZlci4gIFRoZSBvbmx5 CisJICogdHJhbnNpdGlvbiBpdCBhbGxvd3MgZnJvbSB0aGlzIHVua25vd24gc3RhdGUgaXMgdG8g RDAsIHdoaWNoCisJICogdHlwaWNhbGx5IGhhcHBlbnMgd2hlbiBhIGRyaXZlciBjYWxscyBwY2lf ZW5hYmxlX2RldmljZSgpLgorCSAqIFdlJ3JlIG5vdCByZWFkeSB0byBlbmFibGUgdGhlIGRldmlj ZSB5ZXQsIGJ1dCB3ZSBkbyB3YW50IHRvCisJICogYmUgYWJsZSB0byBnZXQgdG8gRDMuICBUaGVy ZWZvcmUgZmlyc3QgZG8gYSBEMCB0cmFuc2l0aW9uCisJICogYmVmb3JlIGdvaW5nIHRvIEQzLgor CSAqLworCXZmaW9fcGNpX3NldF9wb3dlcl9zdGF0ZSh2ZGV2LCBQQ0lfRDApOworCXZmaW9fcGNp X3NldF9wb3dlcl9zdGF0ZSh2ZGV2LCBQQ0lfRDNob3QpOworfQorCitpbnQgdmZpb19wY2lfZW5h YmxlKHN0cnVjdCB2ZmlvX3BjaV9kZXZpY2UgKnZkZXYpCit7CisJc3RydWN0IHBjaV9kZXYgKnBk ZXYgPSB2ZGV2LT5wZGV2OworCWludCByZXQ7CisJdTE2IGNtZDsKKwl1OCBtc2l4X3BvczsKKwor CXZmaW9fcGNpX3NldF9wb3dlcl9zdGF0ZSh2ZGV2LCBQQ0lfRDApOworCisJLyogRG9uJ3QgYWxs b3cgb3VyIGluaXRpYWwgc2F2ZWQgc3RhdGUgdG8gaW5jbHVkZSBidXNtYXN0ZXIgKi8KKwlwY2lf Y2xlYXJfbWFzdGVyKHBkZXYpOworCisJcmV0ID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJ aWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qIElmIHJlc2V0IGZhaWxzIGJlY2F1c2Ugb2Yg dGhlIGRldmljZSBsb2NrLCBmYWlsIHRoaXMgcGF0aCBlbnRpcmVseSAqLworCXJldCA9IHBjaV90 cnlfcmVzZXRfZnVuY3Rpb24ocGRldik7CisJaWYgKHJldCA9PSAtRUFHQUlOKSB7CisJCXBjaV9k aXNhYmxlX2RldmljZShwZGV2KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwl2ZGV2LT5yZXNldF93 b3JrcyA9ICFyZXQ7CisJcGNpX3NhdmVfc3RhdGUocGRldik7CisJdmRldi0+cGNpX3NhdmVkX3N0 YXRlID0gcGNpX3N0b3JlX3NhdmVkX3N0YXRlKHBkZXYpOworCWlmICghdmRldi0+cGNpX3NhdmVk X3N0YXRlKQorCQlwcl9kZWJ1ZygiJXM6IENvdWxkbid0IHN0b3JlICVzIHNhdmVkIHN0YXRlXG4i LAorCQkJIF9fZnVuY19fLCBkZXZfbmFtZSgmcGRldi0+ZGV2KSk7CisKKwlpZiAobGlrZWx5KCF2 ZGV2LT5ub2ludHhtYXNrKSkgeworCQlpZiAodmZpb19wY2lfbm9pbnR4KHBkZXYpKSB7CisJCQlk ZXZfaW5mbygmcGRldi0+ZGV2LCAiTWFza2luZyBicm9rZW4gSU5UeCBzdXBwb3J0XG4iKTsKKwkJ CXZkZXYtPm5vaW50eCA9IHRydWU7CisJCQlwY2lfaW50eChwZGV2LCAwKTsKKwkJfSBlbHNlCisJ CQl2ZGV2LT5wY2lfMl8zID0gcGNpX2ludHhfbWFza19zdXBwb3J0ZWQocGRldik7CisJfQorCisJ cGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgUENJX0NPTU1BTkQsICZjbWQpOworCWlmICh2ZGV2 LT5wY2lfMl8zICYmIChjbWQgJiBQQ0lfQ09NTUFORF9JTlRYX0RJU0FCTEUpKSB7CisJCWNtZCAm PSB+UENJX0NPTU1BTkRfSU5UWF9ESVNBQkxFOworCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQocGRl diwgUENJX0NPTU1BTkQsIGNtZCk7CisJfQorCisJcmV0ID0gdmZpb19jb25maWdfaW5pdCh2ZGV2 KTsKKwlpZiAocmV0KSB7CisJCWtmcmVlKHZkZXYtPnBjaV9zYXZlZF9zdGF0ZSk7CisJCXZkZXYt PnBjaV9zYXZlZF9zdGF0ZSA9IE5VTEw7CisJCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwkJ cmV0dXJuIHJldDsKKwl9CisKKwltc2l4X3BvcyA9IHBkZXYtPm1zaXhfY2FwOworCWlmIChtc2l4 X3BvcykgeworCQl1MTYgZmxhZ3M7CisJCXUzMiB0YWJsZTsKKworCQlwY2lfcmVhZF9jb25maWdf d29yZChwZGV2LCBtc2l4X3BvcyArIFBDSV9NU0lYX0ZMQUdTLCAmZmxhZ3MpOworCQlwY2lfcmVh ZF9jb25maWdfZHdvcmQocGRldiwgbXNpeF9wb3MgKyBQQ0lfTVNJWF9UQUJMRSwgJnRhYmxlKTsK KworCQl2ZGV2LT5tc2l4X2JhciA9IHRhYmxlICYgUENJX01TSVhfVEFCTEVfQklSOworCQl2ZGV2 LT5tc2l4X29mZnNldCA9IHRhYmxlICYgUENJX01TSVhfVEFCTEVfT0ZGU0VUOworCQl2ZGV2LT5t c2l4X3NpemUgPSAoKGZsYWdzICYgUENJX01TSVhfRkxBR1NfUVNJWkUpICsgMSkgKiAxNjsKKwl9 IGVsc2UKKwkJdmRldi0+bXNpeF9iYXIgPSAweEZGOworCisJaWYgKCF2ZmlvX3ZnYV9kaXNhYmxl ZCh2ZGV2KSAmJiB2ZmlvX3BjaV9pc192Z2EocGRldikpCisJCXZkZXYtPmhhc192Z2EgPSB0cnVl OworCisKKwlpZiAodmZpb19wY2lfaXNfdmdhKHBkZXYpICYmCisJICAgIHBkZXYtPnZlbmRvciA9 PSBQQ0lfVkVORE9SX0lEX0lOVEVMICYmCisJICAgIElTX0VOQUJMRUQoQ09ORklHX1ZGSU9fUENJ X0lHRCkpIHsKKwkJcmV0ID0gdmZpb19wY2lfaWdkX2luaXQodmRldik7CisJCWlmIChyZXQpIHsK KwkJCWRldl93YXJuKCZ2ZGV2LT5wZGV2LT5kZXYsCisJCQkJICJGYWlsZWQgdG8gc2V0dXAgSW50 ZWwgSUdEIHJlZ2lvbnNcbiIpOworCQkJZ290byBkaXNhYmxlX2V4aXQ7CisJCX0KKwl9CisKKwlp ZiAocGRldi0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfTlZJRElBICYmCisJICAgIElTX0VOQUJM RUQoQ09ORklHX1ZGSU9fUENJX05WTElOSzIpKSB7CisJCXJldCA9IHZmaW9fcGNpX252ZGlhX3Yx MDBfbnZsaW5rMl9pbml0KHZkZXYpOworCQlpZiAocmV0ICYmIHJldCAhPSAtRU5PREVWKSB7CisJ CQlkZXZfd2FybigmdmRldi0+cGRldi0+ZGV2LAorCQkJCSAiRmFpbGVkIHRvIHNldHVwIE5WSURJ QSBOVjIgUkFNIHJlZ2lvblxuIik7CisJCQlnb3RvIGRpc2FibGVfZXhpdDsKKwkJfQorCX0KKwor CWlmIChwZGV2LT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9JQk0gJiYKKwkgICAgSVNfRU5BQkxF RChDT05GSUdfVkZJT19QQ0lfTlZMSU5LMikpIHsKKwkJcmV0ID0gdmZpb19wY2lfaWJtX25wdTJf aW5pdCh2ZGV2KTsKKwkJaWYgKHJldCAmJiByZXQgIT0gLUVOT0RFVikgeworCQkJZGV2X3dhcm4o JnZkZXYtPnBkZXYtPmRldiwKKwkJCQkJIkZhaWxlZCB0byBzZXR1cCBOVklESUEgTlYyIEFUU0Qg cmVnaW9uXG4iKTsKKwkJCWdvdG8gZGlzYWJsZV9leGl0OworCQl9CisJfQorCisJdmZpb19wY2lf cHJvYmVfbW1hcHModmRldik7CisKKwlyZXR1cm4gMDsKKworZGlzYWJsZV9leGl0OgorCXZmaW9f cGNpX2Rpc2FibGUodmRldik7CisJcmV0dXJuIHJldDsKK30KKwordm9pZCB2ZmlvX3BjaV9kaXNh YmxlKHN0cnVjdCB2ZmlvX3BjaV9kZXZpY2UgKnZkZXYpCit7CisJc3RydWN0IHBjaV9kZXYgKnBk ZXYgPSB2ZGV2LT5wZGV2OworCXN0cnVjdCB2ZmlvX3BjaV9kdW1teV9yZXNvdXJjZSAqZHVtbXlf cmVzLCAqdG1wOworCXN0cnVjdCB2ZmlvX3BjaV9pb2V2ZW50ZmQgKmlvZXZlbnRmZCwgKmlvZXZl bnRmZF90bXA7CisJaW50IGksIGJhcjsKKworCS8qIFN0b3AgdGhlIGRldmljZSBmcm9tIGZ1cnRo ZXIgRE1BICovCisJcGNpX2NsZWFyX21hc3RlcihwZGV2KTsKKworCXZmaW9fcGNpX3NldF9pcnFz X2lvY3RsKHZkZXYsIFZGSU9fSVJRX1NFVF9EQVRBX05PTkUgfAorCQkJCVZGSU9fSVJRX1NFVF9B Q1RJT05fVFJJR0dFUiwKKwkJCQl2ZGV2LT5pcnFfdHlwZSwgMCwgMCwgTlVMTCk7CisKKwkvKiBE ZXZpY2UgY2xvc2VkLCBkb24ndCBuZWVkIG11dGV4IGhlcmUgKi8KKwlsaXN0X2Zvcl9lYWNoX2Vu dHJ5X3NhZmUoaW9ldmVudGZkLCBpb2V2ZW50ZmRfdG1wLAorCQkJCSAmdmRldi0+aW9ldmVudGZk c19saXN0LCBuZXh0KSB7CisJCXZmaW9fdmlycWZkX2Rpc2FibGUoJmlvZXZlbnRmZC0+dmlycWZk KTsKKwkJbGlzdF9kZWwoJmlvZXZlbnRmZC0+bmV4dCk7CisJCWtmcmVlKGlvZXZlbnRmZCk7CisJ fQorCXZkZXYtPmlvZXZlbnRmZHNfbnIgPSAwOworCisJdmRldi0+dmlycV9kaXNhYmxlZCA9IGZh bHNlOworCisJZm9yIChpID0gMDsgaSA8IHZkZXYtPm51bV9yZWdpb25zOyBpKyspCisJCXZkZXYt PnJlZ2lvbltpXS5vcHMtPnJlbGVhc2UodmRldiwgJnZkZXYtPnJlZ2lvbltpXSk7CisKKwl2ZGV2 LT5udW1fcmVnaW9ucyA9IDA7CisJa2ZyZWUodmRldi0+cmVnaW9uKTsKKwl2ZGV2LT5yZWdpb24g PSBOVUxMOyAvKiBkb24ndCBrcmVhbGxvYyBhIGZyZWVkIHBvaW50ZXIgKi8KKworCXZmaW9fY29u ZmlnX2ZyZWUodmRldik7CisKKwlmb3IgKGJhciA9IFBDSV9TVERfUkVTT1VSQ0VTOyBiYXIgPD0g UENJX1NURF9SRVNPVVJDRV9FTkQ7IGJhcisrKSB7CisJCWlmICghdmRldi0+YmFybWFwW2Jhcl0p CisJCQljb250aW51ZTsKKwkJcGNpX2lvdW5tYXAocGRldiwgdmRldi0+YmFybWFwW2Jhcl0pOwor CQlwY2lfcmVsZWFzZV9zZWxlY3RlZF9yZWdpb25zKHBkZXYsIDEgPDwgYmFyKTsKKwkJdmRldi0+ YmFybWFwW2Jhcl0gPSBOVUxMOworCX0KKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkdW1t eV9yZXMsIHRtcCwKKwkJCQkgJnZkZXYtPmR1bW15X3Jlc291cmNlc19saXN0LCByZXNfbmV4dCkg eworCQlsaXN0X2RlbCgmZHVtbXlfcmVzLT5yZXNfbmV4dCk7CisJCXJlbGVhc2VfcmVzb3VyY2Uo JmR1bW15X3Jlcy0+cmVzb3VyY2UpOworCQlrZnJlZShkdW1teV9yZXMpOworCX0KKworCXZkZXYt Pm5lZWRzX3Jlc2V0ID0gdHJ1ZTsKKworCS8qCisJICogSWYgd2UgaGF2ZSBzYXZlZCBzdGF0ZSwg cmVzdG9yZSBpdC4gIElmIHdlIGNhbiByZXNldCB0aGUgZGV2aWNlLAorCSAqIGV2ZW4gYmV0dGVy LiAgUmVzZXR0aW5nIHdpdGggY3VycmVudCBzdGF0ZSBzZWVtcyBiZXR0ZXIgdGhhbgorCSAqIG5v dGhpbmcsIGJ1dCBzYXZpbmcgYW5kIHJlc3RvcmluZyBjdXJyZW50IHN0YXRlIHdpdGhvdXQgcmVz ZXQKKwkgKiBpcyBqdXN0IGJ1c3kgd29yay4KKwkgKi8KKwlpZiAocGNpX2xvYWRfYW5kX2ZyZWVf c2F2ZWRfc3RhdGUocGRldiwgJnZkZXYtPnBjaV9zYXZlZF9zdGF0ZSkpIHsKKwkJcHJfaW5mbygi JXM6IENvdWxkbid0IHJlbG9hZCAlcyBzYXZlZCBzdGF0ZVxuIiwKKwkJCV9fZnVuY19fLCBkZXZf bmFtZSgmcGRldi0+ZGV2KSk7CisKKwkJaWYgKCF2ZGV2LT5yZXNldF93b3JrcykKKwkJCWdvdG8g b3V0OworCisJCXBjaV9zYXZlX3N0YXRlKHBkZXYpOworCX0KKworCS8qCisJICogRGlzYWJsZSBJ TlR4IGFuZCBNU0ksIHByZXN1bWFibHkgdG8gYXZvaWQgc3B1cmlvdXMgaW50ZXJydXB0cworCSAq IGR1cmluZyByZXNldC4gIFN0b2xlbiBmcm9tIHBjaV9yZXNldF9mdW5jdGlvbigpCisJICovCisJ cGNpX3dyaXRlX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9DT01NQU5ELCBQQ0lfQ09NTUFORF9JTlRY X0RJU0FCTEUpOworCisJLyoKKwkgKiBUcnkgdG8gcmVzZXQgdGhlIGRldmljZS4gIFRoZSBzdWNj ZXNzIG9mIHRoaXMgaXMgZGVwZW5kZW50IG9uCisJICogYmVpbmcgYWJsZSB0byBsb2NrIHRoZSBk ZXZpY2UsIHdoaWNoIGlzIG5vdCBhbHdheXMgcG9zc2libGUuCisJICovCisJaWYgKHZkZXYtPnJl c2V0X3dvcmtzICYmICFwY2lfdHJ5X3Jlc2V0X2Z1bmN0aW9uKHBkZXYpKQorCQl2ZGV2LT5uZWVk c19yZXNldCA9IGZhbHNlOworCisJcGNpX3Jlc3RvcmVfc3RhdGUocGRldik7CitvdXQ6CisJcGNp X2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCisJdmZpb19wY2lfdHJ5X2J1c19yZXNldCh2ZGV2KTsK KworCWlmICghdmRldi0+ZGlzYWJsZV9pZGxlX2QzKQorCQl2ZmlvX3BjaV9zZXRfcG93ZXJfc3Rh dGUodmRldiwgUENJX0QzaG90KTsKK30KKworc3RhdGljIGludCB2ZmlvX3BjaV9nZXRfaXJxX2Nv dW50KHN0cnVjdCB2ZmlvX3BjaV9kZXZpY2UgKnZkZXYsIGludCBpcnFfdHlwZSkKK3sKKwlpZiAo aXJxX3R5cGUgPT0gVkZJT19QQ0lfSU5UWF9JUlFfSU5ERVgpIHsKKwkJdTggcGluOworCisJCWlm ICghSVNfRU5BQkxFRChDT05GSUdfVkZJT19QQ0lfSU5UWCkgfHwKKwkJICAgIHZkZXYtPm5vaW50 eCB8fCB2ZGV2LT5wZGV2LT5pc192aXJ0Zm4pCisJCQlyZXR1cm4gMDsKKworCQlwY2lfcmVhZF9j b25maWdfYnl0ZSh2ZGV2LT5wZGV2LCBQQ0lfSU5URVJSVVBUX1BJTiwgJnBpbik7CisKKwkJcmV0 dXJuIHBpbiA/IDEgOiAwOworCX0gZWxzZSBpZiAoaXJxX3R5cGUgPT0gVkZJT19QQ0lfTVNJX0lS UV9JTkRFWCkgeworCQl1OCBwb3M7CisJCXUxNiBmbGFnczsKKworCQlwb3MgPSB2ZGV2LT5wZGV2 LT5tc2lfY2FwOworCQlpZiAocG9zKSB7CisJCQlwY2lfcmVhZF9jb25maWdfd29yZCh2ZGV2LT5w ZGV2LAorCQkJCQkgICAgIHBvcyArIFBDSV9NU0lfRkxBR1MsICZmbGFncyk7CisJCQlyZXR1cm4g MSA8PCAoKGZsYWdzICYgUENJX01TSV9GTEFHU19RTUFTSykgPj4gMSk7CisJCX0KKwl9IGVsc2Ug aWYgKGlycV90eXBlID09IFZGSU9fUENJX01TSVhfSVJRX0lOREVYKSB7CisJCXU4IHBvczsKKwkJ dTE2IGZsYWdzOworCisJCXBvcyA9IHZkZXYtPnBkZXYtPm1zaXhfY2FwOworCQlpZiAocG9zKSB7 CisJCQlwY2lfcmVhZF9jb25maWdfd29yZCh2ZGV2LT5wZGV2LAorCQkJCQkgICAgIHBvcyArIFBD SV9NU0lYX0ZMQUdTLCAmZmxhZ3MpOworCisJCQlyZXR1cm4gKGZsYWdzICYgUENJX01TSVhfRkxB R1NfUVNJWkUpICsgMTsKKwkJfQorCX0gZWxzZSBpZiAoaXJxX3R5cGUgPT0gVkZJT19QQ0lfRVJS X0lSUV9JTkRFWCkgeworCQlpZiAocGNpX2lzX3BjaWUodmRldi0+cGRldikpCisJCQlyZXR1cm4g MTsKKwl9IGVsc2UgaWYgKGlycV90eXBlID09IFZGSU9fUENJX1JFUV9JUlFfSU5ERVgpIHsKKwkJ cmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmZpb19wY2lfY291 bnRfZGV2cyhzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdm9pZCAqZGF0YSkKK3sKKwkoKihpbnQgKilk YXRhKSsrOworCXJldHVybiAwOworfQorCitzdHJ1Y3QgdmZpb19wY2lfZmlsbF9pbmZvIHsKKwlp bnQgbWF4OworCWludCBjdXI7CisJc3RydWN0IHZmaW9fcGNpX2RlcGVuZGVudF9kZXZpY2UgKmRl dmljZXM7Cit9OworCitzdGF0aWMgaW50IHZmaW9fcGNpX2ZpbGxfZGV2cyhzdHJ1Y3QgcGNpX2Rl diAqcGRldiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgdmZpb19wY2lfZmlsbF9pbmZvICpmaWxs ID0gZGF0YTsKKwlzdHJ1Y3QgaW9tbXVfZ3JvdXAgKmlvbW11X2dyb3VwOworCisJaWYgKGZpbGwt PmN1ciA9PSBmaWxsLT5tYXgpCisJCXJldHVybiAtRUFHQUlOOyAvKiBTb21ldGhpbmcgY2hhbmdl ZCwgdHJ5IGFnYWluICovCisKKwlpb21tdV9ncm91cCA9IGlvbW11X2dyb3VwX2dldCgmcGRldi0+ ZGV2KTsKKwlpZiAoIWlvbW11X2dyb3VwKQorCQlyZXR1cm4gLUVQRVJNOyAvKiBDYW5ub3QgcmVz ZXQgbm9uLWlzb2xhdGVkIGRldmljZXMgKi8KKworCWZpbGwtPmRldmljZXNbZmlsbC0+Y3VyXS5n cm91cF9pZCA9IGlvbW11X2dyb3VwX2lkKGlvbW11X2dyb3VwKTsKKwlmaWxsLT5kZXZpY2VzW2Zp bGwtPmN1cl0uc2VnbWVudCA9IHBjaV9kb21haW5fbnIocGRldi0+YnVzKTsKKwlmaWxsLT5kZXZp Y2VzW2ZpbGwtPmN1cl0uYnVzID0gcGRldi0+YnVzLT5udW1iZXI7CisJZmlsbC0+ZGV2aWNlc1tm aWxsLT5jdXJdLmRldmZuID0gcGRldi0+ZGV2Zm47CisJZmlsbC0+Y3VyKys7CisJaW9tbXVfZ3Jv dXBfcHV0KGlvbW11X2dyb3VwKTsKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IHZmaW9fcGNpX2dy b3VwX2VudHJ5IHsKKwlzdHJ1Y3QgdmZpb19ncm91cCAqZ3JvdXA7CisJaW50IGlkOworfTsKKwor c3RydWN0IHZmaW9fcGNpX2dyb3VwX2luZm8geworCWludCBjb3VudDsKKwlzdHJ1Y3QgdmZpb19w Y2lfZ3JvdXBfZW50cnkgKmdyb3VwczsKK307CisKK3N0YXRpYyBpbnQgdmZpb19wY2lfdmFsaWRh dGVfZGV2cyhzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgdmZp b19wY2lfZ3JvdXBfaW5mbyAqaW5mbyA9IGRhdGE7CisJc3RydWN0IGlvbW11X2dyb3VwICpncm91 cDsKKwlpbnQgaWQsIGk7CisKKwlncm91cCA9IGlvbW11X2dyb3VwX2dldCgmcGRldi0+ZGV2KTsK KwlpZiAoIWdyb3VwKQorCQlyZXR1cm4gLUVQRVJNOworCisJaWQgPSBpb21tdV9ncm91cF9pZChn cm91cCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgaW5mby0+Y291bnQ7IGkrKykKKwkJaWYgKGluZm8t Pmdyb3Vwc1tpXS5pZCA9PSBpZCkKKwkJCWJyZWFrOworCisJaW9tbXVfZ3JvdXBfcHV0KGdyb3Vw KTsKKworCXJldHVybiAoaSA9PSBpbmZvLT5jb3VudCkgPyAtRUlOVkFMIDogMDsKK30KKworc3Rh dGljIGJvb2wgdmZpb19wY2lfZGV2X2JlbG93X3Nsb3Qoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0 cnVjdCBwY2lfc2xvdCAqc2xvdCkKK3sKKwlmb3IgKDsgcGRldjsgcGRldiA9IHBkZXYtPmJ1cy0+ c2VsZikKKwkJaWYgKHBkZXYtPmJ1cyA9PSBzbG90LT5idXMpCisJCQlyZXR1cm4gKHBkZXYtPnNs b3QgPT0gc2xvdCk7CisJcmV0dXJuIGZhbHNlOworfQorCitzdHJ1Y3QgdmZpb19wY2lfd2Fsa19p bmZvIHsKKwlpbnQgKCpmbikoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHZvaWQgKmRhdGEpOworCXZv aWQgKmRhdGE7CisJc3RydWN0IHBjaV9kZXYgKnBkZXY7CisJYm9vbCBzbG90OworCWludCByZXQ7 Cit9OworCitzdGF0aWMgaW50IHZmaW9fcGNpX3dhbGtfd3JhcHBlcihzdHJ1Y3QgcGNpX2RldiAq cGRldiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgdmZpb19wY2lfd2Fsa19pbmZvICp3YWxrID0g ZGF0YTsKKworCWlmICghd2Fsay0+c2xvdCB8fCB2ZmlvX3BjaV9kZXZfYmVsb3dfc2xvdChwZGV2 LCB3YWxrLT5wZGV2LT5zbG90KSkKKwkJd2Fsay0+cmV0ID0gd2Fsay0+Zm4ocGRldiwgd2Fsay0+ ZGF0YSk7CisKKwlyZXR1cm4gd2Fsay0+cmV0OworfQorCitzdGF0aWMgaW50IHZmaW9fcGNpX2Zv cl9lYWNoX3Nsb3Rfb3JfYnVzKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCQkgaW50ICgqZm4p KHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCQkJICAgdm9pZCAqZGF0YSksIHZvaWQgKmRhdGEs CisJCQkJCSBib29sIHNsb3QpCit7CisJc3RydWN0IHZmaW9fcGNpX3dhbGtfaW5mbyB3YWxrID0g eworCQkuZm4gPSBmbiwgLmRhdGEgPSBkYXRhLCAucGRldiA9IHBkZXYsIC5zbG90ID0gc2xvdCwg LnJldCA9IDAsCisJfTsKKworCXBjaV93YWxrX2J1cyhwZGV2LT5idXMsIHZmaW9fcGNpX3dhbGtf d3JhcHBlciwgJndhbGspOworCisJcmV0dXJuIHdhbGsucmV0OworfQorCitzdGF0aWMgaW50IG1z aXhfbW1hcHBhYmxlX2NhcChzdHJ1Y3QgdmZpb19wY2lfZGV2aWNlICp2ZGV2LAorCQkJICAgICAg c3RydWN0IHZmaW9faW5mb19jYXAgKmNhcHMpCit7CisJc3RydWN0IHZmaW9faW5mb19jYXBfaGVh ZGVyIGhlYWRlciA9IHsKKwkJLmlkID0gVkZJT19SRUdJT05fSU5GT19DQVBfTVNJWF9NQVBQQUJM RSwKKwkJLnZlcnNpb24gPSAxCisJfTsKKworCXJldHVybiB2ZmlvX2luZm9fYWRkX2NhcGFiaWxp dHkoY2FwcywgJmhlYWRlciwgc2l6ZW9mKGhlYWRlcikpOworfQorCitpbnQgdmZpb19wY2lfcmVn aXN0ZXJfZGV2X3JlZ2lvbihzdHJ1Y3QgdmZpb19wY2lfZGV2aWNlICp2ZGV2LAorCQkJCSB1bnNp Z25lZCBpbnQgdHlwZSwgdW5zaWduZWQgaW50IHN1YnR5cGUsCisJCQkJIGNvbnN0IHN0cnVjdCB2 ZmlvX3BjaV9yZWdvcHMgKm9wcywKKwkJCQkgc2l6ZV90IHNpemUsIHUzMiBmbGFncywgdm9pZCAq ZGF0YSkKK3sKKwlzdHJ1Y3QgdmZpb19wY2lfcmVnaW9uICpyZWdpb247CisKKwlyZWdpb24gPSBr cmVhbGxvYyh2ZGV2LT5yZWdpb24sCisJCQkgICh2ZGV2LT5udW1fcmVnaW9ucyArIDEpICogc2l6 ZW9mKCpyZWdpb24pLAorCQkJICBHRlBfS0VSTkVMKTsKKwlpZiAoIXJlZ2lvbikKKwkJcmV0dXJu IC1FTk9NRU07CisKKwl2ZGV2LT5yZWdpb24gPSByZWdpb247CisJdmRldi0+cmVnaW9uW3ZkZXYt Pm51bV9yZWdpb25zXS50eXBlID0gdHlwZTsKKwl2ZGV2LT5yZWdpb25bdmRldi0+bnVtX3JlZ2lv bnNdLnN1YnR5cGUgPSBzdWJ0eXBlOworCXZkZXYtPnJlZ2lvblt2ZGV2LT5udW1fcmVnaW9uc10u b3BzID0gb3BzOworCXZkZXYtPnJlZ2lvblt2ZGV2LT5udW1fcmVnaW9uc10uc2l6ZSA9IHNpemU7 CisJdmRldi0+cmVnaW9uW3ZkZXYtPm51bV9yZWdpb25zXS5mbGFncyA9IGZsYWdzOworCXZkZXYt PnJlZ2lvblt2ZGV2LT5udW1fcmVnaW9uc10uZGF0YSA9IGRhdGE7CisKKwl2ZGV2LT5udW1fcmVn aW9ucysrOworCisJcmV0dXJuIDA7Cit9CisKK2xvbmcgdmZpb19wY2lfaW9jdGwodm9pZCAqZGV2 aWNlX2RhdGEsCisJCSAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQorewor CXN0cnVjdCB2ZmlvX3BjaV9kZXZpY2UgKnZkZXYgPSBkZXZpY2VfZGF0YTsKKwl1bnNpZ25lZCBs b25nIG1pbnN6OworCisJaWYgKGNtZCA9PSBWRklPX0RFVklDRV9HRVRfSU5GTykgeworCQlzdHJ1 Y3QgdmZpb19kZXZpY2VfaW5mbyBpbmZvOworCisJCW1pbnN6ID0gb2Zmc2V0b2ZlbmQoc3RydWN0 IHZmaW9fZGV2aWNlX2luZm8sIG51bV9pcnFzKTsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJmlu Zm8sICh2b2lkIF9fdXNlciAqKWFyZywgbWluc3opKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJ aWYgKGluZm8uYXJnc3ogPCBtaW5zeikKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWluZm8uZmxh Z3MgPSBWRklPX0RFVklDRV9GTEFHU19QQ0k7CisKKwkJaWYgKHZkZXYtPnJlc2V0X3dvcmtzKQor CQkJaW5mby5mbGFncyB8PSBWRklPX0RFVklDRV9GTEFHU19SRVNFVDsKKworCQlpbmZvLm51bV9y ZWdpb25zID0gVkZJT19QQ0lfTlVNX1JFR0lPTlMgKyB2ZGV2LT5udW1fcmVnaW9uczsKKwkJaW5m by5udW1faXJxcyA9IFZGSU9fUENJX05VTV9JUlFTOworCisJCXJldHVybiBjb3B5X3RvX3VzZXIo KHZvaWQgX191c2VyICopYXJnLCAmaW5mbywgbWluc3opID8KKwkJCS1FRkFVTFQgOiAwOworCisJ fSBlbHNlIGlmIChjbWQgPT0gVkZJT19ERVZJQ0VfR0VUX1JFR0lPTl9JTkZPKSB7CisJCXN0cnVj dCBwY2lfZGV2ICpwZGV2ID0gdmRldi0+cGRldjsKKwkJc3RydWN0IHZmaW9fcmVnaW9uX2luZm8g aW5mbzsKKwkJc3RydWN0IHZmaW9faW5mb19jYXAgY2FwcyA9IHsgLmJ1ZiA9IE5VTEwsIC5zaXpl ID0gMCB9OworCQlpbnQgaSwgcmV0OworCisJCW1pbnN6ID0gb2Zmc2V0b2ZlbmQoc3RydWN0IHZm aW9fcmVnaW9uX2luZm8sIG9mZnNldCk7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZpbmZvLCAo dm9pZCBfX3VzZXIgKilhcmcsIG1pbnN6KSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWlmIChp bmZvLmFyZ3N6IDwgbWluc3opCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlzd2l0Y2ggKGluZm8u aW5kZXgpIHsKKwkJY2FzZSBWRklPX1BDSV9DT05GSUdfUkVHSU9OX0lOREVYOgorCQkJaW5mby5v ZmZzZXQgPSBWRklPX1BDSV9JTkRFWF9UT19PRkZTRVQoaW5mby5pbmRleCk7CisJCQlpbmZvLnNp emUgPSBwZGV2LT5jZmdfc2l6ZTsKKwkJCWluZm8uZmxhZ3MgPSBWRklPX1JFR0lPTl9JTkZPX0ZM QUdfUkVBRCB8CisJCQkJICAgICBWRklPX1JFR0lPTl9JTkZPX0ZMQUdfV1JJVEU7CisJCQlicmVh azsKKwkJY2FzZSBWRklPX1BDSV9CQVIwX1JFR0lPTl9JTkRFWCAuLi4gVkZJT19QQ0lfQkFSNV9S RUdJT05fSU5ERVg6CisJCQlpbmZvLm9mZnNldCA9IFZGSU9fUENJX0lOREVYX1RPX09GRlNFVChp bmZvLmluZGV4KTsKKwkJCWluZm8uc2l6ZSA9IHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgaW5mby5p bmRleCk7CisJCQlpZiAoIWluZm8uc2l6ZSkgeworCQkJCWluZm8uZmxhZ3MgPSAwOworCQkJCWJy ZWFrOworCQkJfQorCisJCQlpbmZvLmZsYWdzID0gVkZJT19SRUdJT05fSU5GT19GTEFHX1JFQUQg fAorCQkJCSAgICAgVkZJT19SRUdJT05fSU5GT19GTEFHX1dSSVRFOworCQkJaWYgKHZkZXYtPmJh cl9tbWFwX3N1cHBvcnRlZFtpbmZvLmluZGV4XSkgeworCQkJCWluZm8uZmxhZ3MgfD0gVkZJT19S RUdJT05fSU5GT19GTEFHX01NQVA7CisJCQkJaWYgKGluZm8uaW5kZXggPT0gdmRldi0+bXNpeF9i YXIpIHsKKwkJCQkJcmV0ID0gbXNpeF9tbWFwcGFibGVfY2FwKHZkZXYsICZjYXBzKTsKKwkJCQkJ aWYgKHJldCkKKwkJCQkJCXJldHVybiByZXQ7CisJCQkJfQorCQkJfQorCisJCQlicmVhazsKKwkJ Y2FzZSBWRklPX1BDSV9ST01fUkVHSU9OX0lOREVYOgorCQl7CisJCQl2b2lkIF9faW9tZW0gKmlv OworCQkJc2l6ZV90IHNpemU7CisJCQl1MTYgb3JpZ19jbWQ7CisKKwkJCWluZm8ub2Zmc2V0ID0g VkZJT19QQ0lfSU5ERVhfVE9fT0ZGU0VUKGluZm8uaW5kZXgpOworCQkJaW5mby5mbGFncyA9IDA7 CisKKwkJCS8qIFJlcG9ydCB0aGUgQkFSIHNpemUsIG5vdCB0aGUgUk9NIHNpemUgKi8KKwkJCWlu Zm8uc2l6ZSA9IHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgaW5mby5pbmRleCk7CisJCQlpZiAoIWlu Zm8uc2l6ZSkgeworCQkJCS8qIFNoYWRvdyBST01zIGFwcGVhciBhcyBQQ0kgb3B0aW9uIFJPTXMg Ki8KKwkJCQlpZiAocGRldi0+cmVzb3VyY2VbUENJX1JPTV9SRVNPVVJDRV0uZmxhZ3MgJgorCQkJ CQkJCUlPUkVTT1VSQ0VfUk9NX1NIQURPVykKKwkJCQkJaW5mby5zaXplID0gMHgyMDAwMDsKKwkJ CQllbHNlCisJCQkJCWJyZWFrOworCQkJfQorCisJCQkvKgorCQkJICogSXMgaXQgcmVhbGx5IHRo ZXJlPyAgRW5hYmxlIG1lbW9yeSBkZWNvZGUgZm9yCisJCQkgKiBpbXBsaWNpdCBhY2Nlc3MgaW4g cGNpX21hcF9yb20oKS4KKwkJCSAqLworCQkJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgUENJ X0NPTU1BTkQsICZvcmlnX2NtZCk7CisJCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQocGRldiwgUENJ X0NPTU1BTkQsCisJCQkJCSAgICAgIG9yaWdfY21kIHwgUENJX0NPTU1BTkRfTUVNT1JZKTsKKwor CQkJaW8gPSBwY2lfbWFwX3JvbShwZGV2LCAmc2l6ZSk7CisJCQlpZiAoaW8pIHsKKwkJCQlpbmZv LmZsYWdzID0gVkZJT19SRUdJT05fSU5GT19GTEFHX1JFQUQ7CisJCQkJcGNpX3VubWFwX3JvbShw ZGV2LCBpbyk7CisJCQl9IGVsc2UgeworCQkJCWluZm8uc2l6ZSA9IDA7CisJCQl9CisKKwkJCXBj aV93cml0ZV9jb25maWdfd29yZChwZGV2LCBQQ0lfQ09NTUFORCwgb3JpZ19jbWQpOworCQkJYnJl YWs7CisJCX0KKwkJY2FzZSBWRklPX1BDSV9WR0FfUkVHSU9OX0lOREVYOgorCQkJaWYgKCF2ZGV2 LT5oYXNfdmdhKQorCQkJCXJldHVybiAtRUlOVkFMOworCisJCQlpbmZvLm9mZnNldCA9IFZGSU9f UENJX0lOREVYX1RPX09GRlNFVChpbmZvLmluZGV4KTsKKwkJCWluZm8uc2l6ZSA9IDB4YzAwMDA7 CisJCQlpbmZvLmZsYWdzID0gVkZJT19SRUdJT05fSU5GT19GTEFHX1JFQUQgfAorCQkJCSAgICAg VkZJT19SRUdJT05fSU5GT19GTEFHX1dSSVRFOworCisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJ eworCQkJc3RydWN0IHZmaW9fcmVnaW9uX2luZm9fY2FwX3R5cGUgY2FwX3R5cGUgPSB7CisJCQkJ CS5oZWFkZXIuaWQgPSBWRklPX1JFR0lPTl9JTkZPX0NBUF9UWVBFLAorCQkJCQkuaGVhZGVyLnZl cnNpb24gPSAxIH07CisKKwkJCWlmIChpbmZvLmluZGV4ID49CisJCQkgICAgVkZJT19QQ0lfTlVN X1JFR0lPTlMgKyB2ZGV2LT5udW1fcmVnaW9ucykKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWlu Zm8uaW5kZXggPSBhcnJheV9pbmRleF9ub3NwZWMoaW5mby5pbmRleCwKKwkJCQkJCQlWRklPX1BD SV9OVU1fUkVHSU9OUyArCisJCQkJCQkJdmRldi0+bnVtX3JlZ2lvbnMpOworCisJCQlpID0gaW5m by5pbmRleCAtIFZGSU9fUENJX05VTV9SRUdJT05TOworCisJCQlpbmZvLm9mZnNldCA9IFZGSU9f UENJX0lOREVYX1RPX09GRlNFVChpbmZvLmluZGV4KTsKKwkJCWluZm8uc2l6ZSA9IHZkZXYtPnJl Z2lvbltpXS5zaXplOworCQkJaW5mby5mbGFncyA9IHZkZXYtPnJlZ2lvbltpXS5mbGFnczsKKwor CQkJY2FwX3R5cGUudHlwZSA9IHZkZXYtPnJlZ2lvbltpXS50eXBlOworCQkJY2FwX3R5cGUuc3Vi dHlwZSA9IHZkZXYtPnJlZ2lvbltpXS5zdWJ0eXBlOworCisJCQlyZXQgPSB2ZmlvX2luZm9fYWRk X2NhcGFiaWxpdHkoJmNhcHMsICZjYXBfdHlwZS5oZWFkZXIsCisJCQkJCQkgICAgICAgc2l6ZW9m KGNhcF90eXBlKSk7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiByZXQ7CisKKwkJCWlmICh2ZGV2 LT5yZWdpb25baV0ub3BzLT5hZGRfY2FwYWJpbGl0eSkgeworCQkJCXJldCA9IHZkZXYtPnJlZ2lv bltpXS5vcHMtPmFkZF9jYXBhYmlsaXR5KHZkZXYsCisJCQkJCQkmdmRldi0+cmVnaW9uW2ldLCAm Y2Fwcyk7CisJCQkJaWYgKHJldCkKKwkJCQkJcmV0dXJuIHJldDsKKwkJCX0KKwkJfQorCQl9CisK KwkJaWYgKGNhcHMuc2l6ZSkgeworCQkJaW5mby5mbGFncyB8PSBWRklPX1JFR0lPTl9JTkZPX0ZM QUdfQ0FQUzsKKwkJCWlmIChpbmZvLmFyZ3N6IDwgc2l6ZW9mKGluZm8pICsgY2Fwcy5zaXplKSB7 CisJCQkJaW5mby5hcmdzeiA9IHNpemVvZihpbmZvKSArIGNhcHMuc2l6ZTsKKwkJCQlpbmZvLmNh cF9vZmZzZXQgPSAwOworCQkJfSBlbHNlIHsKKwkJCQl2ZmlvX2luZm9fY2FwX3NoaWZ0KCZjYXBz LCBzaXplb2YoaW5mbykpOworCQkJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJn ICsKKwkJCQkJCSAgc2l6ZW9mKGluZm8pLCBjYXBzLmJ1ZiwKKwkJCQkJCSAgY2Fwcy5zaXplKSkg eworCQkJCQlrZnJlZShjYXBzLmJ1Zik7CisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCX0KKwkJ CQlpbmZvLmNhcF9vZmZzZXQgPSBzaXplb2YoaW5mbyk7CisJCQl9CisKKwkJCWtmcmVlKGNhcHMu YnVmKTsKKwkJfQorCisJCXJldHVybiBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAm aW5mbywgbWluc3opID8KKwkJCS1FRkFVTFQgOiAwOworCisJfSBlbHNlIGlmIChjbWQgPT0gVkZJ T19ERVZJQ0VfR0VUX0lSUV9JTkZPKSB7CisJCXN0cnVjdCB2ZmlvX2lycV9pbmZvIGluZm87CisK KwkJbWluc3ogPSBvZmZzZXRvZmVuZChzdHJ1Y3QgdmZpb19pcnFfaW5mbywgY291bnQpOworCisJ CWlmIChjb3B5X2Zyb21fdXNlcigmaW5mbywgKHZvaWQgX191c2VyICopYXJnLCBtaW5zeikpCisJ CQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiAoaW5mby5hcmdzeiA8IG1pbnN6IHx8IGluZm8uaW5k ZXggPj0gVkZJT19QQ0lfTlVNX0lSUVMpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlzd2l0Y2gg KGluZm8uaW5kZXgpIHsKKwkJY2FzZSBWRklPX1BDSV9JTlRYX0lSUV9JTkRFWCAuLi4gVkZJT19Q Q0lfTVNJWF9JUlFfSU5ERVg6CisJCWNhc2UgVkZJT19QQ0lfUkVRX0lSUV9JTkRFWDoKKwkJCWJy ZWFrOworCQljYXNlIFZGSU9fUENJX0VSUl9JUlFfSU5ERVg6CisJCQlpZiAocGNpX2lzX3BjaWUo dmRldi0+cGRldikpCisJCQkJYnJlYWs7CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCQlkZWZhdWx0 OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlpbmZvLmZsYWdzID0gVkZJT19JUlFfSU5G T19FVkVOVEZEOworCisJCWluZm8uY291bnQgPSB2ZmlvX3BjaV9nZXRfaXJxX2NvdW50KHZkZXYs IGluZm8uaW5kZXgpOworCisJCWlmIChpbmZvLmluZGV4ID09IFZGSU9fUENJX0lOVFhfSVJRX0lO REVYKQorCQkJaW5mby5mbGFncyB8PSAoVkZJT19JUlFfSU5GT19NQVNLQUJMRSB8CisJCQkJICAg ICAgIFZGSU9fSVJRX0lORk9fQVVUT01BU0tFRCk7CisJCWVsc2UKKwkJCWluZm8uZmxhZ3MgfD0g VkZJT19JUlFfSU5GT19OT1JFU0laRTsKKworCQlyZXR1cm4gY29weV90b191c2VyKCh2b2lkIF9f dXNlciAqKWFyZywgJmluZm8sIG1pbnN6KSA/CisJCQktRUZBVUxUIDogMDsKKworCX0gZWxzZSBp ZiAoY21kID09IFZGSU9fREVWSUNFX1NFVF9JUlFTKSB7CisJCXN0cnVjdCB2ZmlvX2lycV9zZXQg aGRyOworCQl1OCAqZGF0YSA9IE5VTEw7CisJCWludCBtYXgsIHJldCA9IDA7CisJCXNpemVfdCBk YXRhX3NpemUgPSAwOworCisJCW1pbnN6ID0gb2Zmc2V0b2ZlbmQoc3RydWN0IHZmaW9faXJxX3Nl dCwgY291bnQpOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmaGRyLCAodm9pZCBfX3VzZXIgKilh cmcsIG1pbnN6KSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCW1heCA9IHZmaW9fcGNpX2dldF9p cnFfY291bnQodmRldiwgaGRyLmluZGV4KTsKKworCQlyZXQgPSB2ZmlvX3NldF9pcnFzX3ZhbGlk YXRlX2FuZF9wcmVwYXJlKCZoZHIsIG1heCwKKwkJCQkJCSBWRklPX1BDSV9OVU1fSVJRUywgJmRh dGFfc2l6ZSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCWlmIChkYXRhX3NpemUp IHsKKwkJCWRhdGEgPSBtZW1kdXBfdXNlcigodm9pZCBfX3VzZXIgKikoYXJnICsgbWluc3opLAor CQkJCQkgICAgZGF0YV9zaXplKTsKKwkJCWlmIChJU19FUlIoZGF0YSkpCisJCQkJcmV0dXJuIFBU Ul9FUlIoZGF0YSk7CisJCX0KKworCQltdXRleF9sb2NrKCZ2ZGV2LT5pZ2F0ZSk7CisKKwkJcmV0 ID0gdmZpb19wY2lfc2V0X2lycXNfaW9jdGwodmRldiwgaGRyLmZsYWdzLCBoZHIuaW5kZXgsCisJ CQkJCSAgICAgIGhkci5zdGFydCwgaGRyLmNvdW50LCBkYXRhKTsKKworCQltdXRleF91bmxvY2so JnZkZXYtPmlnYXRlKTsKKwkJa2ZyZWUoZGF0YSk7CisKKwkJcmV0dXJuIHJldDsKKworCX0gZWxz ZSBpZiAoY21kID09IFZGSU9fREVWSUNFX1JFU0VUKSB7CisJCXJldHVybiB2ZGV2LT5yZXNldF93 b3JrcyA/CisJCQlwY2lfdHJ5X3Jlc2V0X2Z1bmN0aW9uKHZkZXYtPnBkZXYpIDogLUVJTlZBTDsK KworCX0gZWxzZSBpZiAoY21kID09IFZGSU9fREVWSUNFX0dFVF9QQ0lfSE9UX1JFU0VUX0lORk8p IHsKKwkJc3RydWN0IHZmaW9fcGNpX2hvdF9yZXNldF9pbmZvIGhkcjsKKwkJc3RydWN0IHZmaW9f cGNpX2ZpbGxfaW5mbyBmaWxsID0geyAwIH07CisJCXN0cnVjdCB2ZmlvX3BjaV9kZXBlbmRlbnRf ZGV2aWNlICpkZXZpY2VzID0gTlVMTDsKKwkJYm9vbCBzbG90ID0gZmFsc2U7CisJCWludCByZXQg PSAwOworCisJCW1pbnN6ID0gb2Zmc2V0b2ZlbmQoc3RydWN0IHZmaW9fcGNpX2hvdF9yZXNldF9p bmZvLCBjb3VudCk7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZoZHIsICh2b2lkIF9fdXNlciAq KWFyZywgbWluc3opKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJaWYgKGhkci5hcmdzeiA8IG1p bnN6KQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJaGRyLmZsYWdzID0gMDsKKworCQkvKiBDYW4g d2UgZG8gYSBzbG90IG9yIGJ1cyByZXNldCBvciBuZWl0aGVyPyAqLworCQlpZiAoIXBjaV9wcm9i ZV9yZXNldF9zbG90KHZkZXYtPnBkZXYtPnNsb3QpKQorCQkJc2xvdCA9IHRydWU7CisJCWVsc2Ug aWYgKHBjaV9wcm9iZV9yZXNldF9idXModmRldi0+cGRldi0+YnVzKSkKKwkJCXJldHVybiAtRU5P REVWOworCisJCS8qIEhvdyBtYW55IGRldmljZXMgYXJlIGFmZmVjdGVkPyAqLworCQlyZXQgPSB2 ZmlvX3BjaV9mb3JfZWFjaF9zbG90X29yX2J1cyh2ZGV2LT5wZGV2LAorCQkJCQkJICAgIHZmaW9f cGNpX2NvdW50X2RldnMsCisJCQkJCQkgICAgJmZpbGwubWF4LCBzbG90KTsKKwkJaWYgKHJldCkK KwkJCXJldHVybiByZXQ7CisKKwkJV0FSTl9PTighZmlsbC5tYXgpOyAvKiBTaG91bGQgYWx3YXlz IGJlIGF0IGxlYXN0IG9uZSAqLworCisJCS8qCisJCSAqIElmIHRoZXJlJ3MgZW5vdWdoIHNwYWNl LCBmaWxsIGl0IG5vdywgb3RoZXJ3aXNlIHJldHVybgorCQkgKiAtRU5PU1BDIGFuZCB0aGUgbnVt YmVyIG9mIGRldmljZXMgYWZmZWN0ZWQuCisJCSAqLworCQlpZiAoaGRyLmFyZ3N6IDwgc2l6ZW9m KGhkcikgKyAoZmlsbC5tYXggKiBzaXplb2YoKmRldmljZXMpKSkgeworCQkJcmV0ID0gLUVOT1NQ QzsKKwkJCWhkci5jb3VudCA9IGZpbGwubWF4OworCQkJZ290byByZXNldF9pbmZvX2V4aXQ7CisJ CX0KKworCQlkZXZpY2VzID0ga2NhbGxvYyhmaWxsLm1heCwgc2l6ZW9mKCpkZXZpY2VzKSwgR0ZQ X0tFUk5FTCk7CisJCWlmICghZGV2aWNlcykKKwkJCXJldHVybiAtRU5PTUVNOworCisJCWZpbGwu ZGV2aWNlcyA9IGRldmljZXM7CisKKwkJcmV0ID0gdmZpb19wY2lfZm9yX2VhY2hfc2xvdF9vcl9i dXModmRldi0+cGRldiwKKwkJCQkJCSAgICB2ZmlvX3BjaV9maWxsX2RldnMsCisJCQkJCQkgICAg JmZpbGwsIHNsb3QpOworCisJCS8qCisJCSAqIElmIGEgZGV2aWNlIHdhcyByZW1vdmVkIGJldHdl ZW4gY291bnRpbmcgYW5kIGZpbGxpbmcsCisJCSAqIHdlIG1heSBjb21lIHVwIHNob3J0IG9mIGZp bGwubWF4LiAgSWYgYSBkZXZpY2Ugd2FzCisJCSAqIGFkZGVkLCB3ZSdsbCBoYXZlIGEgcmV0dXJu IG9mIC1FQUdBSU4gYWJvdmUuCisJCSAqLworCQlpZiAoIXJldCkKKwkJCWhkci5jb3VudCA9IGZp bGwuY3VyOworCityZXNldF9pbmZvX2V4aXQ6CisJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191 c2VyICopYXJnLCAmaGRyLCBtaW5zeikpCisJCQlyZXQgPSAtRUZBVUxUOworCisJCWlmICghcmV0 KSB7CisJCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKShhcmcgKyBtaW5zeiksIGRl dmljZXMsCisJCQkJCSBoZHIuY291bnQgKiBzaXplb2YoKmRldmljZXMpKSkKKwkJCQlyZXQgPSAt RUZBVUxUOworCQl9CisKKwkJa2ZyZWUoZGV2aWNlcyk7CisJCXJldHVybiByZXQ7CisKKwl9IGVs c2UgaWYgKGNtZCA9PSBWRklPX0RFVklDRV9QQ0lfSE9UX1JFU0VUKSB7CisJCXN0cnVjdCB2Zmlv X3BjaV9ob3RfcmVzZXQgaGRyOworCQlpbnQzMl90ICpncm91cF9mZHM7CisJCXN0cnVjdCB2Zmlv X3BjaV9ncm91cF9lbnRyeSAqZ3JvdXBzOworCQlzdHJ1Y3QgdmZpb19wY2lfZ3JvdXBfaW5mbyBp bmZvOworCQlib29sIHNsb3QgPSBmYWxzZTsKKwkJaW50IGksIGNvdW50ID0gMCwgcmV0ID0gMDsK KworCQltaW5zeiA9IG9mZnNldG9mZW5kKHN0cnVjdCB2ZmlvX3BjaV9ob3RfcmVzZXQsIGNvdW50 KTsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJmhkciwgKHZvaWQgX191c2VyICopYXJnLCBtaW5z eikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiAoaGRyLmFyZ3N6IDwgbWluc3ogfHwgaGRy LmZsYWdzKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJLyogQ2FuIHdlIGRvIGEgc2xvdCBvciBi dXMgcmVzZXQgb3IgbmVpdGhlcj8gKi8KKwkJaWYgKCFwY2lfcHJvYmVfcmVzZXRfc2xvdCh2ZGV2 LT5wZGV2LT5zbG90KSkKKwkJCXNsb3QgPSB0cnVlOworCQllbHNlIGlmIChwY2lfcHJvYmVfcmVz ZXRfYnVzKHZkZXYtPnBkZXYtPmJ1cykpCisJCQlyZXR1cm4gLUVOT0RFVjsKKworCQkvKgorCQkg KiBXZSBjYW4ndCBsZXQgdXNlcnNwYWNlIGdpdmUgdXMgYW4gYXJiaXRyYXJpbHkgbGFyZ2UKKwkJ ICogYnVmZmVyIHRvIGNvcHksIHNvIHZlcmlmeSBob3cgbWFueSB3ZSB0aGluayB0aGVyZQorCQkg KiBjb3VsZCBiZS4gIE5vdGUgZ3JvdXBzIGNhbiBoYXZlIG11bHRpcGxlIGRldmljZXMgc28KKwkJ ICogb25lIGdyb3VwIHBlciBkZXZpY2UgaXMgdGhlIG1heC4KKwkJICovCisJCXJldCA9IHZmaW9f cGNpX2Zvcl9lYWNoX3Nsb3Rfb3JfYnVzKHZkZXYtPnBkZXYsCisJCQkJCQkgICAgdmZpb19wY2lf Y291bnRfZGV2cywKKwkJCQkJCSAgICAmY291bnQsIHNsb3QpOworCQlpZiAocmV0KQorCQkJcmV0 dXJuIHJldDsKKworCQkvKiBTb21ld2hlcmUgYmV0d2VlbiAxIGFuZCBjb3VudCBpcyBPSyAqLwor CQlpZiAoIWhkci5jb3VudCB8fCBoZHIuY291bnQgPiBjb3VudCkKKwkJCXJldHVybiAtRUlOVkFM OworCisJCWdyb3VwX2ZkcyA9IGtjYWxsb2MoaGRyLmNvdW50LCBzaXplb2YoKmdyb3VwX2Zkcyks IEdGUF9LRVJORUwpOworCQlncm91cHMgPSBrY2FsbG9jKGhkci5jb3VudCwgc2l6ZW9mKCpncm91 cHMpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFncm91cF9mZHMgfHwgIWdyb3VwcykgeworCQkJa2Zy ZWUoZ3JvdXBfZmRzKTsKKwkJCWtmcmVlKGdyb3Vwcyk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJ fQorCisJCWlmIChjb3B5X2Zyb21fdXNlcihncm91cF9mZHMsICh2b2lkIF9fdXNlciAqKShhcmcg KyBtaW5zeiksCisJCQkJICAgaGRyLmNvdW50ICogc2l6ZW9mKCpncm91cF9mZHMpKSkgeworCQkJ a2ZyZWUoZ3JvdXBfZmRzKTsKKwkJCWtmcmVlKGdyb3Vwcyk7CisJCQlyZXR1cm4gLUVGQVVMVDsK KwkJfQorCisJCS8qCisJCSAqIEZvciBlYWNoIGdyb3VwX2ZkLCBnZXQgdGhlIGdyb3VwIHRocm91 Z2ggdGhlIHZmaW8gZXh0ZXJuYWwKKwkJICogdXNlciBpbnRlcmZhY2UgYW5kIHN0b3JlIHRoZSBn cm91cCBhbmQgaW9tbXUgSUQuICBUaGlzCisJCSAqIGVuc3VyZXMgdGhlIGdyb3VwIGlzIGhlbGQg YWNyb3NzIHRoZSByZXNldC4KKwkJICovCisJCWZvciAoaSA9IDA7IGkgPCBoZHIuY291bnQ7IGkr KykgeworCQkJc3RydWN0IHZmaW9fZ3JvdXAgKmdyb3VwOworCQkJc3RydWN0IGZkIGYgPSBmZGdl dChncm91cF9mZHNbaV0pOworCisJCQlpZiAoIWYuZmlsZSkgeworCQkJCXJldCA9IC1FQkFERjsK KwkJCQlicmVhazsKKwkJCX0KKworCQkJZ3JvdXAgPSB2ZmlvX2dyb3VwX2dldF9leHRlcm5hbF91 c2VyKGYuZmlsZSk7CisJCQlmZHB1dChmKTsKKwkJCWlmIChJU19FUlIoZ3JvdXApKSB7CisJCQkJ cmV0ID0gUFRSX0VSUihncm91cCk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWdyb3Vwc1tpXS5n cm91cCA9IGdyb3VwOworCQkJZ3JvdXBzW2ldLmlkID0gdmZpb19leHRlcm5hbF91c2VyX2lvbW11 X2lkKGdyb3VwKTsKKwkJfQorCisJCWtmcmVlKGdyb3VwX2Zkcyk7CisKKwkJLyogcmVsZWFzZSBy ZWZlcmVuY2UgdG8gZ3JvdXBzIG9uIGVycm9yICovCisJCWlmIChyZXQpCisJCQlnb3RvIGhvdF9y ZXNldF9yZWxlYXNlOworCisJCWluZm8uY291bnQgPSBoZHIuY291bnQ7CisJCWluZm8uZ3JvdXBz ID0gZ3JvdXBzOworCisJCS8qCisJCSAqIFRlc3Qgd2hldGhlciBhbGwgdGhlIGFmZmVjdGVkIGRl dmljZXMgYXJlIGNvbnRhaW5lZAorCQkgKiBieSB0aGUgc2V0IG9mIGdyb3VwcyBwcm92aWRlZCBi eSB0aGUgdXNlci4KKwkJICovCisJCXJldCA9IHZmaW9fcGNpX2Zvcl9lYWNoX3Nsb3Rfb3JfYnVz KHZkZXYtPnBkZXYsCisJCQkJCQkgICAgdmZpb19wY2lfdmFsaWRhdGVfZGV2cywKKwkJCQkJCSAg ICAmaW5mbywgc2xvdCk7CisJCWlmICghcmV0KQorCQkJLyogVXNlciBoYXMgYWNjZXNzLCBkbyB0 aGUgcmVzZXQgKi8KKwkJCXJldCA9IHBjaV9yZXNldF9idXModmRldi0+cGRldik7CisKK2hvdF9y ZXNldF9yZWxlYXNlOgorCQlmb3IgKGktLTsgaSA+PSAwOyBpLS0pCisJCQl2ZmlvX2dyb3VwX3B1 dF9leHRlcm5hbF91c2VyKGdyb3Vwc1tpXS5ncm91cCk7CisKKwkJa2ZyZWUoZ3JvdXBzKTsKKwkJ cmV0dXJuIHJldDsKKwl9IGVsc2UgaWYgKGNtZCA9PSBWRklPX0RFVklDRV9JT0VWRU5URkQpIHsK KwkJc3RydWN0IHZmaW9fZGV2aWNlX2lvZXZlbnRmZCBpb2V2ZW50ZmQ7CisJCWludCBjb3VudDsK KworCQltaW5zeiA9IG9mZnNldG9mZW5kKHN0cnVjdCB2ZmlvX2RldmljZV9pb2V2ZW50ZmQsIGZk KTsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJmlvZXZlbnRmZCwgKHZvaWQgX191c2VyICopYXJn LCBtaW5zeikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiAoaW9ldmVudGZkLmFyZ3N6IDwg bWluc3opCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlpZiAoaW9ldmVudGZkLmZsYWdzICYgflZG SU9fREVWSUNFX0lPRVZFTlRGRF9TSVpFX01BU0spCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlj b3VudCA9IGlvZXZlbnRmZC5mbGFncyAmIFZGSU9fREVWSUNFX0lPRVZFTlRGRF9TSVpFX01BU0s7 CisKKwkJaWYgKGh3ZWlnaHQ4KGNvdW50KSAhPSAxIHx8IGlvZXZlbnRmZC5mZCA8IC0xKQorCQkJ cmV0dXJuIC1FSU5WQUw7CisKKwkJcmV0dXJuIHZmaW9fcGNpX2lvZXZlbnRmZCh2ZGV2LCBpb2V2 ZW50ZmQub2Zmc2V0LAorCQkJCQkgIGlvZXZlbnRmZC5kYXRhLCBjb3VudCwgaW9ldmVudGZkLmZk KTsKKwl9CisKKwlyZXR1cm4gLUVOT1RUWTsKK30KKworc3RhdGljIHNzaXplX3QgdmZpb19wY2lf cncodm9pZCAqZGV2aWNlX2RhdGEsIGNoYXIgX191c2VyICpidWYsCisJCQkgICBzaXplX3QgY291 bnQsIGxvZmZfdCAqcHBvcywgYm9vbCBpc3dyaXRlKQoreworCXVuc2lnbmVkIGludCBpbmRleCA9 IFZGSU9fUENJX09GRlNFVF9UT19JTkRFWCgqcHBvcyk7CisJc3RydWN0IHZmaW9fcGNpX2Rldmlj ZSAqdmRldiA9IGRldmljZV9kYXRhOworCisJaWYgKGluZGV4ID49IFZGSU9fUENJX05VTV9SRUdJ T05TICsgdmRldi0+bnVtX3JlZ2lvbnMpCisJCXJldHVybiAtRUlOVkFMOworCisJc3dpdGNoIChp bmRleCkgeworCWNhc2UgVkZJT19QQ0lfQ09ORklHX1JFR0lPTl9JTkRFWDoKKwkJcmV0dXJuIHZm aW9fcGNpX2NvbmZpZ19ydyh2ZGV2LCBidWYsIGNvdW50LCBwcG9zLCBpc3dyaXRlKTsKKworCWNh c2UgVkZJT19QQ0lfUk9NX1JFR0lPTl9JTkRFWDoKKwkJaWYgKGlzd3JpdGUpCisJCQlyZXR1cm4g LUVJTlZBTDsKKwkJcmV0dXJuIHZmaW9fcGNpX2Jhcl9ydyh2ZGV2LCBidWYsIGNvdW50LCBwcG9z LCBmYWxzZSk7CisKKwljYXNlIFZGSU9fUENJX0JBUjBfUkVHSU9OX0lOREVYIC4uLiBWRklPX1BD SV9CQVI1X1JFR0lPTl9JTkRFWDoKKwkJcmV0dXJuIHZmaW9fcGNpX2Jhcl9ydyh2ZGV2LCBidWYs IGNvdW50LCBwcG9zLCBpc3dyaXRlKTsKKworCWNhc2UgVkZJT19QQ0lfVkdBX1JFR0lPTl9JTkRF WDoKKwkJcmV0dXJuIHZmaW9fcGNpX3ZnYV9ydyh2ZGV2LCBidWYsIGNvdW50LCBwcG9zLCBpc3dy aXRlKTsKKwlkZWZhdWx0OgorCQlpbmRleCAtPSBWRklPX1BDSV9OVU1fUkVHSU9OUzsKKwkJcmV0 dXJuIHZkZXYtPnJlZ2lvbltpbmRleF0ub3BzLT5ydyh2ZGV2LCBidWYsCisJCQkJCQkgICBjb3Vu dCwgcHBvcywgaXN3cml0ZSk7CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3NzaXplX3Qg dmZpb19wY2lfcmVhZCh2b2lkICpkZXZpY2VfZGF0YSwgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCSAg ICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJaWYgKCFjb3VudCkKKwkJcmV0dXJu IDA7CisKKwlyZXR1cm4gdmZpb19wY2lfcncoZGV2aWNlX2RhdGEsIGJ1ZiwgY291bnQsIHBwb3Ms IGZhbHNlKTsKK30KKworc3NpemVfdCB2ZmlvX3BjaV93cml0ZSh2b2lkICpkZXZpY2VfZGF0YSwg Y29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCSAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpw cG9zKQoreworCWlmICghY291bnQpCisJCXJldHVybiAwOworCisJcmV0dXJuIHZmaW9fcGNpX3J3 KGRldmljZV9kYXRhLCAoY2hhciBfX3VzZXIgKilidWYsIGNvdW50LCBwcG9zLCB0cnVlKTsKK30K KworaW50IHZmaW9fcGNpX21tYXAodm9pZCAqZGV2aWNlX2RhdGEsIHN0cnVjdCB2bV9hcmVhX3N0 cnVjdCAqdm1hKQoreworCXN0cnVjdCB2ZmlvX3BjaV9kZXZpY2UgKnZkZXYgPSBkZXZpY2VfZGF0 YTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHZkZXYtPnBkZXY7CisJdW5zaWduZWQgaW50IGlu ZGV4OworCXU2NCBwaHlzX2xlbiwgcmVxX2xlbiwgcGdvZmYsIHJlcV9zdGFydDsKKwlpbnQgcmV0 OworCisJaW5kZXggPSB2bWEtPnZtX3Bnb2ZmID4+IChWRklPX1BDSV9PRkZTRVRfU0hJRlQgLSBQ QUdFX1NISUZUKTsKKworCWlmICh2bWEtPnZtX2VuZCA8IHZtYS0+dm1fc3RhcnQpCisJCXJldHVy biAtRUlOVkFMOworCWlmICgodm1hLT52bV9mbGFncyAmIFZNX1NIQVJFRCkgPT0gMCkKKwkJcmV0 dXJuIC1FSU5WQUw7CisJaWYgKGluZGV4ID49IFZGSU9fUENJX05VTV9SRUdJT05TKSB7CisJCWlu dCByZWdudW0gPSBpbmRleCAtIFZGSU9fUENJX05VTV9SRUdJT05TOworCQlzdHJ1Y3QgdmZpb19w Y2lfcmVnaW9uICpyZWdpb24gPSB2ZGV2LT5yZWdpb24gKyByZWdudW07CisKKwkJaWYgKHJlZ2lv biAmJiByZWdpb24tPm9wcyAmJiByZWdpb24tPm9wcy0+bW1hcCAmJgorCQkgICAgKHJlZ2lvbi0+ ZmxhZ3MgJiBWRklPX1JFR0lPTl9JTkZPX0ZMQUdfTU1BUCkpCisJCQlyZXR1cm4gcmVnaW9uLT5v cHMtPm1tYXAodmRldiwgcmVnaW9uLCB2bWEpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYg KGluZGV4ID49IFZGSU9fUENJX1JPTV9SRUdJT05fSU5ERVgpCisJCXJldHVybiAtRUlOVkFMOwor CWlmICghdmRldi0+YmFyX21tYXBfc3VwcG9ydGVkW2luZGV4XSkKKwkJcmV0dXJuIC1FSU5WQUw7 CisKKwlwaHlzX2xlbiA9IFBBR0VfQUxJR04ocGNpX3Jlc291cmNlX2xlbihwZGV2LCBpbmRleCkp OworCXJlcV9sZW4gPSB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQ7CisJcGdvZmYgPSB2bWEt PnZtX3Bnb2ZmICYKKwkJKCgxVSA8PCAoVkZJT19QQ0lfT0ZGU0VUX1NISUZUIC0gUEFHRV9TSElG VCkpIC0gMSk7CisJcmVxX3N0YXJ0ID0gcGdvZmYgPDwgUEFHRV9TSElGVDsKKworCWlmIChyZXFf c3RhcnQgKyByZXFfbGVuID4gcGh5c19sZW4pCisJCXJldHVybiAtRUlOVkFMOworCisJLyoKKwkg KiBFdmVuIHRob3VnaCB3ZSBkb24ndCBtYWtlIHVzZSBvZiB0aGUgYmFybWFwIGZvciB0aGUgbW1h cCwKKwkgKiB3ZSBuZWVkIHRvIHJlcXVlc3QgdGhlIHJlZ2lvbiBhbmQgdGhlIGJhcm1hcCB0cmFj a3MgdGhhdC4KKwkgKi8KKwlpZiAoIXZkZXYtPmJhcm1hcFtpbmRleF0pIHsKKwkJcmV0ID0gcGNp X3JlcXVlc3Rfc2VsZWN0ZWRfcmVnaW9ucyhwZGV2LAorCQkJCQkJICAgMSA8PCBpbmRleCwKKwkJ CQkJCSAgIHBjaV9kZXZfZHJpdmVyKHBkZXYpLT5uYW1lKTsKKwkJaWYgKHJldCkKKwkJCXJldHVy biByZXQ7CisKKwkJdmRldi0+YmFybWFwW2luZGV4XSA9IHBjaV9pb21hcChwZGV2LCBpbmRleCwg MCk7CisJCWlmICghdmRldi0+YmFybWFwW2luZGV4XSkgeworCQkJcGNpX3JlbGVhc2Vfc2VsZWN0 ZWRfcmVnaW9ucyhwZGV2LCAxIDw8IGluZGV4KTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJ fQorCisJdm1hLT52bV9wcml2YXRlX2RhdGEgPSB2ZGV2OworCXZtYS0+dm1fcGFnZV9wcm90ID0g cGdwcm90X25vbmNhY2hlZCh2bWEtPnZtX3BhZ2VfcHJvdCk7CisJdm1hLT52bV9wZ29mZiA9IChw Y2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgaW5kZXgpID4+IFBBR0VfU0hJRlQpICsgcGdvZmY7CisK KwlyZXR1cm4gcmVtYXBfcGZuX3JhbmdlKHZtYSwgdm1hLT52bV9zdGFydCwgdm1hLT52bV9wZ29m ZiwKKwkJCSAgICAgICByZXFfbGVuLCB2bWEtPnZtX3BhZ2VfcHJvdCk7Cit9CisKK3ZvaWQgdmZp b19wY2lfcmVxdWVzdCh2b2lkICpkZXZpY2VfZGF0YSwgdW5zaWduZWQgaW50IGNvdW50KQorewor CXN0cnVjdCB2ZmlvX3BjaV9kZXZpY2UgKnZkZXYgPSBkZXZpY2VfZGF0YTsKKworCW11dGV4X2xv Y2soJnZkZXYtPmlnYXRlKTsKKworCWlmICh2ZGV2LT5yZXFfdHJpZ2dlcikgeworCQlpZiAoIShj b3VudCAlIDEwKSkKKwkJCWRldl9ub3RpY2VfcmF0ZWxpbWl0ZWQoJnZkZXYtPnBkZXYtPmRldiwK KwkJCQkiUmVsYXlpbmcgZGV2aWNlIHJlcXVlc3QgdG8gdXNlciAoIyV1KVxuIiwKKwkJCQljb3Vu dCk7CisJCWV2ZW50ZmRfc2lnbmFsKHZkZXYtPnJlcV90cmlnZ2VyLCAxKTsKKwl9IGVsc2UgaWYg KGNvdW50ID09IDApIHsKKwkJZGV2X3dhcm4oJnZkZXYtPnBkZXYtPmRldiwKKwkJCSJObyBkZXZp Y2UgcmVxdWVzdCBjaGFubmVsIHJlZ2lzdGVyZWQsIGJsb2NrZWQgdW50aWwgcmVsZWFzZWQgYnkg dXNlclxuIik7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZ2ZGV2LT5pZ2F0ZSk7Cit9CisKK3N0YXRp YyBwY2lfZXJzX3Jlc3VsdF90IHZmaW9fcGNpX2Flcl9lcnJfZGV0ZWN0ZWQoc3RydWN0IHBjaV9k ZXYgKnBkZXYsCisJCQkJCQkgIHBjaV9jaGFubmVsX3N0YXRlX3Qgc3RhdGUpCit7CisJc3RydWN0 IHZmaW9fcGNpX2RldmljZSAqdmRldjsKKwlzdHJ1Y3QgdmZpb19kZXZpY2UgKmRldmljZTsKKwor CWRldmljZSA9IHZmaW9fZGV2aWNlX2dldF9mcm9tX2RldigmcGRldi0+ZGV2KTsKKwlpZiAoZGV2 aWNlID09IE5VTEwpCisJCXJldHVybiBQQ0lfRVJTX1JFU1VMVF9ESVNDT05ORUNUOworCisJdmRl diA9IHZmaW9fZGV2aWNlX2RhdGEoZGV2aWNlKTsKKwlpZiAodmRldiA9PSBOVUxMKSB7CisJCXZm aW9fZGV2aWNlX3B1dChkZXZpY2UpOworCQlyZXR1cm4gUENJX0VSU19SRVNVTFRfRElTQ09OTkVD VDsKKwl9CisKKwltdXRleF9sb2NrKCZ2ZGV2LT5pZ2F0ZSk7CisKKwlpZiAodmRldi0+ZXJyX3Ry aWdnZXIpCisJCWV2ZW50ZmRfc2lnbmFsKHZkZXYtPmVycl90cmlnZ2VyLCAxKTsKKworCW11dGV4 X3VubG9jaygmdmRldi0+aWdhdGUpOworCisJdmZpb19kZXZpY2VfcHV0KGRldmljZSk7CisKKwly ZXR1cm4gUENJX0VSU19SRVNVTFRfQ0FOX1JFQ09WRVI7Cit9CisKK2NvbnN0IHN0cnVjdCBwY2lf ZXJyb3JfaGFuZGxlcnMgdmZpb19lcnJfaGFuZGxlcnMgPSB7CisJLmVycm9yX2RldGVjdGVkID0g dmZpb19wY2lfYWVyX2Vycl9kZXRlY3RlZCwKK307CisKK3N0YXRpYyBERUZJTkVfTVVURVgocmVm bGNrX2xvY2spOworCitzdGF0aWMgc3RydWN0IHZmaW9fcGNpX3JlZmxjayAqdmZpb19wY2lfcmVm bGNrX2FsbG9jKHZvaWQpCit7CisJc3RydWN0IHZmaW9fcGNpX3JlZmxjayAqcmVmbGNrOworCisJ cmVmbGNrID0ga3phbGxvYyhzaXplb2YoKnJlZmxjayksIEdGUF9LRVJORUwpOworCWlmICghcmVm bGNrKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCWtyZWZfaW5pdCgmcmVmbGNrLT5r cmVmKTsKKwltdXRleF9pbml0KCZyZWZsY2stPmxvY2spOworCisJcmV0dXJuIHJlZmxjazsKK30K Kworc3RhdGljIHZvaWQgdmZpb19wY2lfcmVmbGNrX2dldChzdHJ1Y3QgdmZpb19wY2lfcmVmbGNr ICpyZWZsY2spCit7CisJa3JlZl9nZXQoJnJlZmxjay0+a3JlZik7Cit9CisKK3N0YXRpYyBpbnQg dmZpb19wY2lfcmVmbGNrX2ZpbmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHZvaWQgKmRhdGEpCit7 CisJc3RydWN0IHZmaW9fcGNpX2RldmljZSAqdmRldiA9IGRhdGE7CisJc3RydWN0IHZmaW9fcGNp X3JlZmxjayAqKnByZWZsY2sgPSAmdmRldi0+cmVmbGNrOworCXN0cnVjdCB2ZmlvX2RldmljZSAq ZGV2aWNlOworCXN0cnVjdCB2ZmlvX3BjaV9kZXZpY2UgKnRtcDsKKworCWRldmljZSA9IHZmaW9f ZGV2aWNlX2dldF9mcm9tX2RldigmcGRldi0+ZGV2KTsKKwlpZiAoIWRldmljZSkKKwkJcmV0dXJu IDA7CisKKwlpZiAocGNpX2Rldl9kcml2ZXIocGRldikgIT0gcGNpX2Rldl9kcml2ZXIodmRldi0+ cGRldikpIHsKKwkJdmZpb19kZXZpY2VfcHV0KGRldmljZSk7CisJCXJldHVybiAwOworCX0KKwor CXRtcCA9IHZmaW9fZGV2aWNlX2RhdGEoZGV2aWNlKTsKKworCWlmICh0bXAtPnJlZmxjaykgewor CQl2ZmlvX3BjaV9yZWZsY2tfZ2V0KHRtcC0+cmVmbGNrKTsKKwkJKnByZWZsY2sgPSB0bXAtPnJl ZmxjazsKKwkJdmZpb19kZXZpY2VfcHV0KGRldmljZSk7CisJCXJldHVybiAxOworCX0KKworCXZm aW9fZGV2aWNlX3B1dChkZXZpY2UpOworCXJldHVybiAwOworfQorCitpbnQgdmZpb19wY2lfcmVm bGNrX2F0dGFjaChzdHJ1Y3QgdmZpb19wY2lfZGV2aWNlICp2ZGV2KQoreworCWJvb2wgc2xvdCA9 ICFwY2lfcHJvYmVfcmVzZXRfc2xvdCh2ZGV2LT5wZGV2LT5zbG90KTsKKworCW11dGV4X2xvY2so JnJlZmxja19sb2NrKTsKKworCWlmIChwY2lfaXNfcm9vdF9idXModmRldi0+cGRldi0+YnVzKSB8 fAorCSAgICB2ZmlvX3BjaV9mb3JfZWFjaF9zbG90X29yX2J1cyh2ZGV2LT5wZGV2LCB2ZmlvX3Bj aV9yZWZsY2tfZmluZCwKKwkJCQkJICB2ZGV2LCBzbG90KSA8PSAwKQorCQl2ZGV2LT5yZWZsY2sg PSB2ZmlvX3BjaV9yZWZsY2tfYWxsb2MoKTsKKworCW11dGV4X3VubG9jaygmcmVmbGNrX2xvY2sp OworCisJcmV0dXJuIFBUUl9FUlJfT1JfWkVSTyh2ZGV2LT5yZWZsY2spOworfQorCitzdGF0aWMg dm9pZCB2ZmlvX3BjaV9yZWZsY2tfcmVsZWFzZShzdHJ1Y3Qga3JlZiAqa3JlZikKK3sKKwlzdHJ1 Y3QgdmZpb19wY2lfcmVmbGNrICpyZWZsY2sgPSBjb250YWluZXJfb2Yoa3JlZiwKKwkJCQkJCSAg ICAgIHN0cnVjdCB2ZmlvX3BjaV9yZWZsY2ssCisJCQkJCQkgICAgICBrcmVmKTsKKworCWtmcmVl KHJlZmxjayk7CisJbXV0ZXhfdW5sb2NrKCZyZWZsY2tfbG9jayk7Cit9CisKK3ZvaWQgdmZpb19w Y2lfcmVmbGNrX3B1dChzdHJ1Y3QgdmZpb19wY2lfcmVmbGNrICpyZWZsY2spCit7CisJa3JlZl9w dXRfbXV0ZXgoJnJlZmxjay0+a3JlZiwgdmZpb19wY2lfcmVmbGNrX3JlbGVhc2UsICZyZWZsY2tf bG9jayk7Cit9CisKK3N0cnVjdCB2ZmlvX2RldmljZXMgeworCXN0cnVjdCB2ZmlvX2RldmljZSAq KmRldmljZXM7CisJc3RydWN0IHZmaW9fcGNpX2RldmljZSAqdmRldjsKKwlpbnQgY3VyX2luZGV4 OworCWludCBtYXhfaW5kZXg7Cit9OworCitzdGF0aWMgaW50IHZmaW9fcGNpX2dldF91bnVzZWRf ZGV2cyhzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgdmZpb19k ZXZpY2VzICpkZXZzID0gZGF0YTsKKwlzdHJ1Y3QgdmZpb19kZXZpY2UgKmRldmljZTsKKwlzdHJ1 Y3QgdmZpb19wY2lfZGV2aWNlICp0bXA7CisKKwlpZiAoZGV2cy0+Y3VyX2luZGV4ID09IGRldnMt Pm1heF9pbmRleCkKKwkJcmV0dXJuIC1FTk9TUEM7CisKKwlkZXZpY2UgPSB2ZmlvX2RldmljZV9n ZXRfZnJvbV9kZXYoJnBkZXYtPmRldik7CisJaWYgKCFkZXZpY2UpCisJCXJldHVybiAtRUlOVkFM OworCisJaWYgKHBjaV9kZXZfZHJpdmVyKHBkZXYpICE9IHBjaV9kZXZfZHJpdmVyKGRldnMtPnZk ZXYtPnBkZXYpKSB7CisJCXZmaW9fZGV2aWNlX3B1dChkZXZpY2UpOworCQlyZXR1cm4gLUVCVVNZ OworCX0KKworCXRtcCA9IHZmaW9fZGV2aWNlX2RhdGEoZGV2aWNlKTsKKworCS8qIEZhdWx0IGlm IHRoZSBkZXZpY2UgaXMgbm90IHVudXNlZCAqLworCWlmICh0bXAtPnJlZmNudCkgeworCQl2Zmlv X2RldmljZV9wdXQoZGV2aWNlKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlkZXZzLT5kZXZp Y2VzW2RldnMtPmN1cl9pbmRleCsrXSA9IGRldmljZTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAq IElmIGEgYnVzIG9yIHNsb3QgcmVzZXQgaXMgYXZhaWxhYmxlIGZvciB0aGUgcHJvdmlkZWQgZGV2 aWNlIGFuZDoKKyAqICAtIEFsbCBvZiB0aGUgZGV2aWNlcyBhZmZlY3RlZCBieSB0aGF0IGJ1cyBv ciBzbG90IHJlc2V0IGFyZSB1bnVzZWQKKyAqICAgICghcmVmY250KQorICogIC0gQXQgbGVhc3Qg b25lIG9mIHRoZSBhZmZlY3RlZCBkZXZpY2VzIGlzIG1hcmtlZCBkaXJ0eSB2aWEKKyAqICAgIG5l ZWRzX3Jlc2V0IChzdWNoIGFzIGJ5IGxhY2sgb2YgRkxSIHN1cHBvcnQpCisgKiBUaGVuIGF0dGVt cHQgdG8gcGVyZm9ybSB0aGF0IGJ1cyBvciBzbG90IHJlc2V0LiAgQ2FsbGVycyBhcmUgcmVxdWly ZWQKKyAqIHRvIGhvbGQgdmRldi0+cmVmbGNrLT5sb2NrLCBwcm90ZWN0aW5nIHRoZSBidXMvc2xv dCByZXNldCBncm91cCBmcm9tCisgKiBjb25jdXJyZW50IG9wZW5zLiAgQSB2ZmlvX2RldmljZSBy ZWZlcmVuY2UgaXMgYWNxdWlyZWQgZm9yIGVhY2ggZGV2aWNlCisgKiB0byBwcmV2ZW50IHVuYmlu ZHMgZHVyaW5nIHRoZSByZXNldCBvcGVyYXRpb24uCisgKgorICogTkI6IHZmaW8tY29yZSBjb25z aWRlcnMgYSBncm91cCB0byBiZSB2aWFibGUgZXZlbiBpZiBzb21lIGRldmljZXMgYXJlCisgKiBi b3VuZCB0byBkcml2ZXJzIGxpa2UgcGNpLXN0dWIgb3IgcGNpZXBvcnQuICBIZXJlIHdlIHJlcXVp cmUgYWxsIGRldmljZXMKKyAqIHRvIGJlIGJvdW5kIHRvIHZmaW9fcGNpIHNpbmNlIHRoYXQncyB0 aGUgb25seSB3YXkgd2UgY2FuIGJlIHN1cmUgdGhleQorICogc3RheSBwdXQuCisgKi8KK3N0YXRp YyB2b2lkIHZmaW9fcGNpX3RyeV9idXNfcmVzZXQoc3RydWN0IHZmaW9fcGNpX2RldmljZSAqdmRl dikKK3sKKwlzdHJ1Y3QgdmZpb19kZXZpY2VzIGRldnMgPSB7IC5jdXJfaW5kZXggPSAwIH07CisJ aW50IGkgPSAwLCByZXQgPSAtRUlOVkFMOworCWJvb2wgc2xvdCA9IGZhbHNlOworCXN0cnVjdCB2 ZmlvX3BjaV9kZXZpY2UgKnRtcDsKKworCWlmICghcGNpX3Byb2JlX3Jlc2V0X3Nsb3QodmRldi0+ cGRldi0+c2xvdCkpCisJCXNsb3QgPSB0cnVlOworCWVsc2UgaWYgKHBjaV9wcm9iZV9yZXNldF9i dXModmRldi0+cGRldi0+YnVzKSkKKwkJcmV0dXJuOworCisJaWYgKHZmaW9fcGNpX2Zvcl9lYWNo X3Nsb3Rfb3JfYnVzKHZkZXYtPnBkZXYsIHZmaW9fcGNpX2NvdW50X2RldnMsCisJCQkJCSAgJmks IHNsb3QpIHx8ICFpKQorCQlyZXR1cm47CisKKwlkZXZzLm1heF9pbmRleCA9IGk7CisJZGV2cy5k ZXZpY2VzID0ga2NhbGxvYyhpLCBzaXplb2Yoc3RydWN0IHZmaW9fZGV2aWNlICopLCBHRlBfS0VS TkVMKTsKKwlpZiAoIWRldnMuZGV2aWNlcykKKwkJcmV0dXJuOworCisJaWYgKHZmaW9fcGNpX2Zv cl9lYWNoX3Nsb3Rfb3JfYnVzKHZkZXYtPnBkZXYsCisJCQkJCSAgdmZpb19wY2lfZ2V0X3VudXNl ZF9kZXZzLAorCQkJCQkgICZkZXZzLCBzbG90KSkKKwkJZ290byBwdXRfZGV2czsKKworCS8qIERv ZXMgYXQgbGVhc3Qgb25lIG5lZWQgYSByZXNldD8gKi8KKwlmb3IgKGkgPSAwOyBpIDwgZGV2cy5j dXJfaW5kZXg7IGkrKykgeworCQl0bXAgPSB2ZmlvX2RldmljZV9kYXRhKGRldnMuZGV2aWNlc1tp XSk7CisJCWlmICh0bXAtPm5lZWRzX3Jlc2V0KSB7CisJCQlyZXQgPSBwY2lfcmVzZXRfYnVzKHZk ZXYtPnBkZXYpOworCQkJYnJlYWs7CisJCX0KKwl9CisKK3B1dF9kZXZzOgorCWZvciAoaSA9IDA7 IGkgPCBkZXZzLmN1cl9pbmRleDsgaSsrKSB7CisJCXRtcCA9IHZmaW9fZGV2aWNlX2RhdGEoZGV2 cy5kZXZpY2VzW2ldKTsKKworCQkvKgorCQkgKiBJZiByZXNldCB3YXMgc3VjY2Vzc2Z1bCwgYWZm ZWN0ZWQgZGV2aWNlcyBubyBsb25nZXIgbmVlZAorCQkgKiBhIHJlc2V0IGFuZCB3ZSBzaG91bGQg cmV0dXJuIGFsbCB0aGUgY29sbGF0ZXJhbCBkZXZpY2VzCisJCSAqIHRvIGxvdyBwb3dlci4gIElm IG5vdCBzdWNjZXNzZnVsLCB3ZSBlaXRoZXIgZGlkbid0IHJlc2V0CisJCSAqIHRoZSBidXMgb3Ig dGltZWQgb3V0IHdhaXRpbmcgZm9yIGl0LCBzbyBsZXQncyBub3QgdG91Y2gKKwkJICogdGhlIHBv d2VyIHN0YXRlLgorCQkgKi8KKwkJaWYgKCFyZXQpIHsKKwkJCXRtcC0+bmVlZHNfcmVzZXQgPSBm YWxzZTsKKworCQkJaWYgKHRtcCAhPSB2ZGV2ICYmICF2ZGV2LT5kaXNhYmxlX2lkbGVfZDMpCisJ CQkJdmZpb19wY2lfc2V0X3Bvd2VyX3N0YXRlKHRtcCwgUENJX0QzaG90KTsKKwkJfQorCisJCXZm aW9fZGV2aWNlX3B1dChkZXZzLmRldmljZXNbaV0pOworCX0KKworCWtmcmVlKGRldnMuZGV2aWNl cyk7Cit9CisKK3ZvaWQgX19pbml0IHZmaW9fcGNpX2ZpbGxfaWRzKGNoYXIgKmlkcywgc3RydWN0 IHBjaV9kcml2ZXIgKmRyaXZlcikKK3sKKwljaGFyICpwLCAqaWQ7CisJaW50IHJjOworCisJLyog bm8gaWRzIHBhc3NlZCBhY3R1YWxseSAqLworCWlmIChpZHNbMF0gPT0gJ1wwJykKKwkJcmV0dXJu OworCisJLyogYWRkIGlkcyBzcGVjaWZpZWQgaW4gdGhlIG1vZHVsZSBwYXJhbWV0ZXIgKi8KKwlw ID0gaWRzOworCXdoaWxlICgoaWQgPSBzdHJzZXAoJnAsICIsIikpKSB7CisJCXVuc2lnbmVkIGlu dCB2ZW5kb3IsIGRldmljZSwgc3VidmVuZG9yID0gUENJX0FOWV9JRCwKKwkJCXN1YmRldmljZSA9 IFBDSV9BTllfSUQsIGNsYXNzID0gMCwgY2xhc3NfbWFzayA9IDA7CisJCWludCBmaWVsZHM7CisK KwkJaWYgKCFzdHJsZW4oaWQpKQorCQkJY29udGludWU7CisKKwkJZmllbGRzID0gc3NjYW5mKGlk LCAiJXg6JXg6JXg6JXg6JXg6JXgiLAorCQkJCSZ2ZW5kb3IsICZkZXZpY2UsICZzdWJ2ZW5kb3Is ICZzdWJkZXZpY2UsCisJCQkJJmNsYXNzLCAmY2xhc3NfbWFzayk7CisKKwkJaWYgKGZpZWxkcyA8 IDIpIHsKKwkJCXByX3dhcm4oImludmFsaWQgaWQgc3RyaW5nIFwiJXNcIlxuIiwgaWQpOworCQkJ Y29udGludWU7CisJCX0KKworCQlyYyA9IHBjaV9hZGRfZHluaWQoZHJpdmVyLCB2ZW5kb3IsIGRl dmljZSwKKwkJCQkgICBzdWJ2ZW5kb3IsIHN1YmRldmljZSwgY2xhc3MsIGNsYXNzX21hc2ssIDAp OworCQlpZiAocmMpCisJCQlwcl93YXJuKCJmYWlsZWQgdG8gYWRkIGR5bmFtaWMgaWQgWyUwNHg6 JTA0eFslMDR4OiUwNHhdXSBjbGFzcyAlIzA4eC8lMDh4ICglZClcbiIsCisJCQkJdmVuZG9yLCBk ZXZpY2UsIHN1YnZlbmRvciwgc3ViZGV2aWNlLAorCQkJCWNsYXNzLCBjbGFzc19tYXNrLCByYyk7 CisJCWVsc2UKKwkJCXByX2luZm8oImFkZCBbJTA0eDolMDR4WyUwNHg6JTA0eF1dIGNsYXNzICUj MDh4LyUwOHhcbiIsCisJCQkJdmVuZG9yLCBkZXZpY2UsIHN1YnZlbmRvciwgc3ViZGV2aWNlLAor CQkJCWNsYXNzLCBjbGFzc19tYXNrKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZmaW8v cGNpL3ZmaW9fcGNpLmMgYi9kcml2ZXJzL3ZmaW8vcGNpL3ZmaW9fcGNpLmMKaW5kZXggM2ZhMjBl OS4uNmNlMWE4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy92ZmlvL3BjaS92ZmlvX3BjaS5jCisrKyBi L2RyaXZlcnMvdmZpby9wY2kvdmZpb19wY2kuYwpAQCAtNTYsNDExICs1Niw2IEBAIG1vZHVsZV9w YXJhbShkaXNhYmxlX2lkbGVfZDMsIGJvb2wsIFNfSVJVR08gfCBTX0lXVVNSKTsKIE1PRFVMRV9Q QVJNX0RFU0MoZGlzYWJsZV9pZGxlX2QzLAogCQkgIkRpc2FibGUgdXNpbmcgdGhlIFBDSSBEMyBs b3cgcG93ZXIgc3RhdGUgZm9yIGlkbGUsIHVudXNlZCBkZXZpY2VzIik7CiAKLXN0YXRpYyBpbmxp bmUgYm9vbCB2ZmlvX3ZnYV9kaXNhYmxlZCh2b2lkKQotewotI2lmZGVmIENPTkZJR19WRklPX1BD SV9WR0EKLQlyZXR1cm4gZGlzYWJsZV92Z2E7Ci0jZWxzZQotCXJldHVybiB0cnVlOwotI2VuZGlm Ci19Ci0KLS8qCi0gKiBPdXIgVkdBIGFyYml0ZXIgcGFydGljaXBhdGlvbiBpcyBsaW1pdGVkIHNp bmNlIHdlIGRvbid0IGtub3cgYW55dGhpbmcKLSAqIGFib3V0IHRoZSBkZXZpY2UgaXRzZWxmLiAg SG93ZXZlciwgaWYgdGhlIGRldmljZSBpcyB0aGUgb25seSBWR0EgZGV2aWNlCi0gKiBkb3duc3Ry ZWFtIG9mIGEgYnJpZGdlIGFuZCBWRklPIFZHQSBzdXBwb3J0IGlzIGRpc2FibGVkLCB0aGVuIHdl IGNhbgotICogc2FmZWx5IHJldHVybiBsZWdhY3kgVkdBIElPIGFuZCBtZW1vcnkgYXMgbm90IGRl Y29kZWQgc2luY2UgdGhlIHVzZXIKLSAqIGhhcyBubyB3YXkgdG8gZ2V0IHRvIGl0IGFuZCByb3V0 aW5nIGNhbiBiZSBkaXNhYmxlZCBleHRlcm5hbGx5IGF0IHRoZQotICogYnJpZGdlLgotICovCi1z dGF0aWMgdW5zaWduZWQgaW50IHZmaW9fcGNpX3NldF92Z2FfZGVjb2RlKHZvaWQgKm9wYXF1ZSwg Ym9vbCBzaW5nbGVfdmdhKQotewotCXN0cnVjdCB2ZmlvX3BjaV9kZXZpY2UgKnZkZXYgPSBvcGFx dWU7Ci0Jc3RydWN0IHBjaV9kZXYgKnRtcCA9IE5VTEwsICpwZGV2ID0gdmRldi0+cGRldjsKLQl1 bnNpZ25lZCBjaGFyIG1heF9idXNucjsKLQl1bnNpZ25lZCBpbnQgZGVjb2RlczsKLQotCWlmIChz aW5nbGVfdmdhIHx8ICF2ZmlvX3ZnYV9kaXNhYmxlZCgpIHx8IHBjaV9pc19yb290X2J1cyhwZGV2 LT5idXMpKQotCQlyZXR1cm4gVkdBX1JTUkNfTk9STUFMX0lPIHwgVkdBX1JTUkNfTk9STUFMX01F TSB8Ci0JCSAgICAgICBWR0FfUlNSQ19MRUdBQ1lfSU8gfCBWR0FfUlNSQ19MRUdBQ1lfTUVNOwot Ci0JbWF4X2J1c25yID0gcGNpX2J1c19tYXhfYnVzbnIocGRldi0+YnVzKTsKLQlkZWNvZGVzID0g VkdBX1JTUkNfTk9STUFMX0lPIHwgVkdBX1JTUkNfTk9STUFMX01FTTsKLQotCXdoaWxlICgodG1w ID0gcGNpX2dldF9jbGFzcyhQQ0lfQ0xBU1NfRElTUExBWV9WR0EgPDwgOCwgdG1wKSkgIT0gTlVM TCkgewotCQlpZiAodG1wID09IHBkZXYgfHwKLQkJICAgIHBjaV9kb21haW5fbnIodG1wLT5idXMp ICE9IHBjaV9kb21haW5fbnIocGRldi0+YnVzKSB8fAotCQkgICAgcGNpX2lzX3Jvb3RfYnVzKHRt cC0+YnVzKSkKLQkJCWNvbnRpbnVlOwotCi0JCWlmICh0bXAtPmJ1cy0+bnVtYmVyID49IHBkZXYt PmJ1cy0+bnVtYmVyICYmCi0JCSAgICB0bXAtPmJ1cy0+bnVtYmVyIDw9IG1heF9idXNucikgewot CQkJcGNpX2Rldl9wdXQodG1wKTsKLQkJCWRlY29kZXMgfD0gVkdBX1JTUkNfTEVHQUNZX0lPIHwg VkdBX1JTUkNfTEVHQUNZX01FTTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcmV0dXJuIGRlY29k ZXM7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbCB2ZmlvX3BjaV9pc192Z2Eoc3RydWN0IHBjaV9k ZXYgKnBkZXYpCi17Ci0JcmV0dXJuIChwZGV2LT5jbGFzcyA+PiA4KSA9PSBQQ0lfQ0xBU1NfRElT UExBWV9WR0E7Ci19Ci0KLXN0YXRpYyB2b2lkIHZmaW9fcGNpX3Byb2JlX21tYXBzKHN0cnVjdCB2 ZmlvX3BjaV9kZXZpY2UgKnZkZXYpCi17Ci0Jc3RydWN0IHJlc291cmNlICpyZXM7Ci0JaW50IGJh cjsKLQlzdHJ1Y3QgdmZpb19wY2lfZHVtbXlfcmVzb3VyY2UgKmR1bW15X3JlczsKLQotCUlOSVRf TElTVF9IRUFEKCZ2ZGV2LT5kdW1teV9yZXNvdXJjZXNfbGlzdCk7Ci0KLQlmb3IgKGJhciA9IFBD SV9TVERfUkVTT1VSQ0VTOyBiYXIgPD0gUENJX1NURF9SRVNPVVJDRV9FTkQ7IGJhcisrKSB7Ci0J CXJlcyA9IHZkZXYtPnBkZXYtPnJlc291cmNlICsgYmFyOwotCi0JCWlmICghSVNfRU5BQkxFRChD T05GSUdfVkZJT19QQ0lfTU1BUCkpCi0JCQlnb3RvIG5vX21tYXA7Ci0KLQkJaWYgKCEocmVzLT5m bGFncyAmIElPUkVTT1VSQ0VfTUVNKSkKLQkJCWdvdG8gbm9fbW1hcDsKLQotCQkvKgotCQkgKiBU aGUgUENJIGNvcmUgc2hvdWxkbid0IHNldCB1cCBhIHJlc291cmNlIHdpdGggYQotCQkgKiB0eXBl IGJ1dCB6ZXJvIHNpemUuIEJ1dCB0aGVyZSBtYXkgYmUgYnVncyB0aGF0Ci0JCSAqIGNhdXNlIHVz IHRvIGRvIHRoYXQuCi0JCSAqLwotCQlpZiAoIXJlc291cmNlX3NpemUocmVzKSkKLQkJCWdvdG8g bm9fbW1hcDsKLQotCQlpZiAocmVzb3VyY2Vfc2l6ZShyZXMpID49IFBBR0VfU0laRSkgewotCQkJ dmRldi0+YmFyX21tYXBfc3VwcG9ydGVkW2Jhcl0gPSB0cnVlOwotCQkJY29udGludWU7Ci0JCX0K LQotCQlpZiAoIShyZXMtPnN0YXJ0ICYgflBBR0VfTUFTSykpIHsKLQkJCS8qCi0JCQkgKiBBZGQg YSBkdW1teSByZXNvdXJjZSB0byByZXNlcnZlIHRoZSByZW1haW5kZXIKLQkJCSAqIG9mIHRoZSBl eGNsdXNpdmUgcGFnZSBpbiBjYXNlIHRoYXQgaG90LWFkZAotCQkJICogZGV2aWNlJ3MgYmFyIGlz IGFzc2lnbmVkIGludG8gaXQuCi0JCQkgKi8KLQkJCWR1bW15X3JlcyA9IGt6YWxsb2Moc2l6ZW9m KCpkdW1teV9yZXMpLCBHRlBfS0VSTkVMKTsKLQkJCWlmIChkdW1teV9yZXMgPT0gTlVMTCkKLQkJ CQlnb3RvIG5vX21tYXA7Ci0KLQkJCWR1bW15X3Jlcy0+cmVzb3VyY2UubmFtZSA9ICJ2ZmlvIHN1 Yi1wYWdlIHJlc2VydmVkIjsKLQkJCWR1bW15X3Jlcy0+cmVzb3VyY2Uuc3RhcnQgPSByZXMtPmVu ZCArIDE7Ci0JCQlkdW1teV9yZXMtPnJlc291cmNlLmVuZCA9IHJlcy0+c3RhcnQgKyBQQUdFX1NJ WkUgLSAxOwotCQkJZHVtbXlfcmVzLT5yZXNvdXJjZS5mbGFncyA9IHJlcy0+ZmxhZ3M7Ci0JCQlp ZiAocmVxdWVzdF9yZXNvdXJjZShyZXMtPnBhcmVudCwKLQkJCQkJCSZkdW1teV9yZXMtPnJlc291 cmNlKSkgewotCQkJCWtmcmVlKGR1bW15X3Jlcyk7Ci0JCQkJZ290byBub19tbWFwOwotCQkJfQot CQkJZHVtbXlfcmVzLT5pbmRleCA9IGJhcjsKLQkJCWxpc3RfYWRkKCZkdW1teV9yZXMtPnJlc19u ZXh0LAotCQkJCQkmdmRldi0+ZHVtbXlfcmVzb3VyY2VzX2xpc3QpOwotCQkJdmRldi0+YmFyX21t YXBfc3VwcG9ydGVkW2Jhcl0gPSB0cnVlOwotCQkJY29udGludWU7Ci0JCX0KLQkJLyoKLQkJICog SGVyZSB3ZSBkb24ndCBoYW5kbGUgdGhlIGNhc2Ugd2hlbiB0aGUgQkFSIGlzIG5vdCBwYWdlCi0J CSAqIGFsaWduZWQgYmVjYXVzZSB3ZSBjYW4ndCBleHBlY3QgdGhlIEJBUiB3aWxsIGJlCi0JCSAq IGFzc2lnbmVkIGludG8gdGhlIHNhbWUgbG9jYXRpb24gaW4gYSBwYWdlIGluIGd1ZXN0Ci0JCSAq IHdoZW4gd2UgcGFzc3Rocm91Z2ggdGhlIEJBUi4gQW5kIGl0J3MgaGFyZCB0byBhY2Nlc3MKLQkJ ICogdGhpcyBCQVIgaW4gdXNlcnNwYWNlIGJlY2F1c2Ugd2UgaGF2ZSBubyB3YXkgdG8gZ2V0Ci0J CSAqIHRoZSBCQVIncyBsb2NhdGlvbiBpbiBhIHBhZ2UuCi0JCSAqLwotbm9fbW1hcDoKLQkJdmRl di0+YmFyX21tYXBfc3VwcG9ydGVkW2Jhcl0gPSBmYWxzZTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lk IHZmaW9fcGNpX3RyeV9idXNfcmVzZXQoc3RydWN0IHZmaW9fcGNpX2RldmljZSAqdmRldik7Ci1z dGF0aWMgdm9pZCB2ZmlvX3BjaV9kaXNhYmxlKHN0cnVjdCB2ZmlvX3BjaV9kZXZpY2UgKnZkZXYp OwotCi0vKgotICogSU5UeCBtYXNraW5nIHJlcXVpcmVzIHRoZSBhYmlsaXR5IHRvIGRpc2FibGUg SU5UeCBzaWduYWxpbmcgdmlhIFBDSV9DT01NQU5ECi0gKiBfYW5kXyB0aGUgYWJpbGl0eSBkZXRl Y3Qgd2hlbiB0aGUgZGV2aWNlIGlzIGFzc2VydGluZyBJTlR4IHZpYSBQQ0lfU1RBVFVTLgotICog SWYgYSBkZXZpY2UgaW1wbGVtZW50cyB0aGUgZm9ybWVyIGJ1dCBub3QgdGhlIGxhdHRlciB3ZSB3 b3VsZCB0eXBpY2FsbHkKLSAqIGV4cGVjdCBicm9rZW5faW50eF9tYXNraW5nIGJlIHNldCBhbmQg cmVxdWlyZSBhbiBleGNsdXNpdmUgaW50ZXJydXB0LgotICogSG93ZXZlciBzaW5jZSB3ZSBkbyBo YXZlIGNvbnRyb2wgb2YgdGhlIGRldmljZSdzIGFiaWxpdHkgdG8gYXNzZXJ0IElOVHgsCi0gKiB3 ZSBjYW4gaW5zdGVhZCBwcmV0ZW5kIHRoYXQgdGhlIGRldmljZSBkb2VzIG5vdCBpbXBsZW1lbnQg SU5UeCwgdmlydHVhbGl6aW5nCi0gKiB0aGUgcGluIHJlZ2lzdGVyIHRvIHJlcG9ydCB6ZXJvIGFu ZCBtYWludGFpbmluZyBEaXNJTlR4IHNldCBvbiB0aGUgaG9zdC4KLSAqLwotc3RhdGljIGJvb2wg dmZpb19wY2lfbm9pbnR4KHN0cnVjdCBwY2lfZGV2ICpwZGV2KQotewotCXN3aXRjaCAocGRldi0+ dmVuZG9yKSB7Ci0JY2FzZSBQQ0lfVkVORE9SX0lEX0lOVEVMOgotCQlzd2l0Y2ggKHBkZXYtPmRl dmljZSkgewotCQkvKiBBbGwgaTQwZSAoWEw3MTAvWDcxMC9YWFY3MTApIDEwLzIwLzI1LzQwR2JF IE5JQ3MgKi8KLQkJY2FzZSAweDE1NzI6Ci0JCWNhc2UgMHgxNTc0OgotCQljYXNlIDB4MTU4MCAu Li4gMHgxNTgxOgotCQljYXNlIDB4MTU4MyAuLi4gMHgxNThiOgotCQljYXNlIDB4MzdkMCAuLi4g MHgzN2QyOgotCQkJcmV0dXJuIHRydWU7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gZmFsc2U7Ci0J CX0KLQl9Ci0KLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyB2b2lkIHZmaW9fcGNpX3Byb2Jl X3Bvd2VyX3N0YXRlKHN0cnVjdCB2ZmlvX3BjaV9kZXZpY2UgKnZkZXYpCi17Ci0Jc3RydWN0IHBj aV9kZXYgKnBkZXYgPSB2ZGV2LT5wZGV2OwotCXUxNiBwbWNzcjsKLQotCWlmICghcGRldi0+cG1f Y2FwKQotCQlyZXR1cm47Ci0KLQlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBwZGV2LT5wbV9j YXAgKyBQQ0lfUE1fQ1RSTCwgJnBtY3NyKTsKLQotCXZkZXYtPm5lZWRzX3BtX3Jlc3RvcmUgPSAh KHBtY3NyICYgUENJX1BNX0NUUkxfTk9fU09GVF9SRVNFVCk7Ci19Ci0KLS8qCi0gKiBwY2lfc2V0 X3Bvd2VyX3N0YXRlKCkgd3JhcHBlciBoYW5kbGluZyBkZXZpY2VzIHdoaWNoIHBlcmZvcm0gYSBz b2Z0IHJlc2V0IG9uCi0gKiBEMy0+RDAgdHJhbnNpdGlvbi4gIFNhdmUgc3RhdGUgcHJpb3IgdG8g RDAvMS8yLT5EMywgc3Rhc2ggaXQgb24gdGhlIHZkZXYsCi0gKiByZXN0b3JlIHdoZW4gcmV0dXJu ZWQgdG8gRDAuICBTYXZlZCBzZXBhcmF0ZWx5IGZyb20gcGNpX3NhdmVkX3N0YXRlIGZvciB1c2UK LSAqIGJ5IFBNIGNhcGFiaWxpdHkgZW11bGF0aW9uIGFuZCBzZXBhcmF0ZWx5IGZyb20gcGNpX2Rl diBpbnRlcm5hbCBzYXZlZCBzdGF0ZQotICogdG8gYXZvaWQgaXQgYmVpbmcgb3ZlcndyaXR0ZW4g YW5kIGNvbnN1bWVkIGFyb3VuZCBvdGhlciByZXNldHMuCi0gKi8KLWludCB2ZmlvX3BjaV9zZXRf cG93ZXJfc3RhdGUoc3RydWN0IHZmaW9fcGNpX2RldmljZSAqdmRldiwgcGNpX3Bvd2VyX3Qgc3Rh dGUpCi17Ci0Jc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB2ZGV2LT5wZGV2OwotCWJvb2wgbmVlZHNf cmVzdG9yZSA9IGZhbHNlLCBuZWVkc19zYXZlID0gZmFsc2U7Ci0JaW50IHJldDsKLQotCWlmICh2 ZGV2LT5uZWVkc19wbV9yZXN0b3JlKSB7Ci0JCWlmIChwZGV2LT5jdXJyZW50X3N0YXRlIDwgUENJ X0QzaG90ICYmIHN0YXRlID49IFBDSV9EM2hvdCkgewotCQkJcGNpX3NhdmVfc3RhdGUocGRldik7 Ci0JCQluZWVkc19zYXZlID0gdHJ1ZTsKLQkJfQotCi0JCWlmIChwZGV2LT5jdXJyZW50X3N0YXRl ID49IFBDSV9EM2hvdCAmJiBzdGF0ZSA8PSBQQ0lfRDApCi0JCQluZWVkc19yZXN0b3JlID0gdHJ1 ZTsKLQl9Ci0KLQlyZXQgPSBwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIHN0YXRlKTsKLQotCWlm ICghcmV0KSB7Ci0JCS8qIEQzIG1pZ2h0IGJlIHVuc3VwcG9ydGVkIHZpYSBxdWlyaywgc2tpcCB1 bmxlc3MgaW4gRDMgKi8KLQkJaWYgKG5lZWRzX3NhdmUgJiYgcGRldi0+Y3VycmVudF9zdGF0ZSA+ PSBQQ0lfRDNob3QpIHsKLQkJCXZkZXYtPnBtX3NhdmUgPSBwY2lfc3RvcmVfc2F2ZWRfc3RhdGUo cGRldik7Ci0JCX0gZWxzZSBpZiAobmVlZHNfcmVzdG9yZSkgewotCQkJcGNpX2xvYWRfYW5kX2Zy ZWVfc2F2ZWRfc3RhdGUocGRldiwgJnZkZXYtPnBtX3NhdmUpOwotCQkJcGNpX3Jlc3RvcmVfc3Rh dGUocGRldik7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHZmaW9f cGNpX2VuYWJsZShzdHJ1Y3QgdmZpb19wY2lfZGV2aWNlICp2ZGV2KQotewotCXN0cnVjdCBwY2lf ZGV2ICpwZGV2ID0gdmRldi0+cGRldjsKLQlpbnQgcmV0OwotCXUxNiBjbWQ7Ci0JdTggbXNpeF9w b3M7Ci0KLQl2ZmlvX3BjaV9zZXRfcG93ZXJfc3RhdGUodmRldiwgUENJX0QwKTsKLQotCS8qIERv bid0IGFsbG93IG91ciBpbml0aWFsIHNhdmVkIHN0YXRlIHRvIGluY2x1ZGUgYnVzbWFzdGVyICov Ci0JcGNpX2NsZWFyX21hc3RlcihwZGV2KTsKLQotCXJldCA9IHBjaV9lbmFibGVfZGV2aWNlKHBk ZXYpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQkvKiBJZiByZXNldCBmYWlscyBiZWNh dXNlIG9mIHRoZSBkZXZpY2UgbG9jaywgZmFpbCB0aGlzIHBhdGggZW50aXJlbHkgKi8KLQlyZXQg PSBwY2lfdHJ5X3Jlc2V0X2Z1bmN0aW9uKHBkZXYpOwotCWlmIChyZXQgPT0gLUVBR0FJTikgewot CQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JdmRldi0+ cmVzZXRfd29ya3MgPSAhcmV0OwotCXBjaV9zYXZlX3N0YXRlKHBkZXYpOwotCXZkZXYtPnBjaV9z YXZlZF9zdGF0ZSA9IHBjaV9zdG9yZV9zYXZlZF9zdGF0ZShwZGV2KTsKLQlpZiAoIXZkZXYtPnBj aV9zYXZlZF9zdGF0ZSkKLQkJcHJfZGVidWcoIiVzOiBDb3VsZG4ndCBzdG9yZSAlcyBzYXZlZCBz dGF0ZVxuIiwKLQkJCSBfX2Z1bmNfXywgZGV2X25hbWUoJnBkZXYtPmRldikpOwotCi0JaWYgKGxp a2VseSghbm9pbnR4bWFzaykpIHsKLQkJaWYgKHZmaW9fcGNpX25vaW50eChwZGV2KSkgewotCQkJ ZGV2X2luZm8oJnBkZXYtPmRldiwgIk1hc2tpbmcgYnJva2VuIElOVHggc3VwcG9ydFxuIik7Ci0J CQl2ZGV2LT5ub2ludHggPSB0cnVlOwotCQkJcGNpX2ludHgocGRldiwgMCk7Ci0JCX0gZWxzZQot CQkJdmRldi0+cGNpXzJfMyA9IHBjaV9pbnR4X21hc2tfc3VwcG9ydGVkKHBkZXYpOwotCX0KLQot CXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9DT01NQU5ELCAmY21kKTsKLQlpZiAodmRl di0+cGNpXzJfMyAmJiAoY21kICYgUENJX0NPTU1BTkRfSU5UWF9ESVNBQkxFKSkgewotCQljbWQg Jj0gflBDSV9DT01NQU5EX0lOVFhfRElTQUJMRTsKLQkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBk ZXYsIFBDSV9DT01NQU5ELCBjbWQpOwotCX0KLQotCXJldCA9IHZmaW9fY29uZmlnX2luaXQodmRl dik7Ci0JaWYgKHJldCkgewotCQlrZnJlZSh2ZGV2LT5wY2lfc2F2ZWRfc3RhdGUpOwotCQl2ZGV2 LT5wY2lfc2F2ZWRfc3RhdGUgPSBOVUxMOwotCQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7Ci0J CXJldHVybiByZXQ7Ci0JfQotCi0JbXNpeF9wb3MgPSBwZGV2LT5tc2l4X2NhcDsKLQlpZiAobXNp eF9wb3MpIHsKLQkJdTE2IGZsYWdzOwotCQl1MzIgdGFibGU7Ci0KLQkJcGNpX3JlYWRfY29uZmln X3dvcmQocGRldiwgbXNpeF9wb3MgKyBQQ0lfTVNJWF9GTEFHUywgJmZsYWdzKTsKLQkJcGNpX3Jl YWRfY29uZmlnX2R3b3JkKHBkZXYsIG1zaXhfcG9zICsgUENJX01TSVhfVEFCTEUsICZ0YWJsZSk7 Ci0KLQkJdmRldi0+bXNpeF9iYXIgPSB0YWJsZSAmIFBDSV9NU0lYX1RBQkxFX0JJUjsKLQkJdmRl di0+bXNpeF9vZmZzZXQgPSB0YWJsZSAmIFBDSV9NU0lYX1RBQkxFX09GRlNFVDsKLQkJdmRldi0+ bXNpeF9zaXplID0gKChmbGFncyAmIFBDSV9NU0lYX0ZMQUdTX1FTSVpFKSArIDEpICogMTY7Ci0J fSBlbHNlCi0JCXZkZXYtPm1zaXhfYmFyID0gMHhGRjsKLQotCWlmICghdmZpb192Z2FfZGlzYWJs ZWQoKSAmJiB2ZmlvX3BjaV9pc192Z2EocGRldikpCi0JCXZkZXYtPmhhc192Z2EgPSB0cnVlOwot Ci0KLQlpZiAodmZpb19wY2lfaXNfdmdhKHBkZXYpICYmCi0JICAgIHBkZXYtPnZlbmRvciA9PSBQ Q0lfVkVORE9SX0lEX0lOVEVMICYmCi0JICAgIElTX0VOQUJMRUQoQ09ORklHX1ZGSU9fUENJX0lH RCkpIHsKLQkJcmV0ID0gdmZpb19wY2lfaWdkX2luaXQodmRldik7Ci0JCWlmIChyZXQpIHsKLQkJ CWRldl93YXJuKCZ2ZGV2LT5wZGV2LT5kZXYsCi0JCQkJICJGYWlsZWQgdG8gc2V0dXAgSW50ZWwg SUdEIHJlZ2lvbnNcbiIpOwotCQkJZ290byBkaXNhYmxlX2V4aXQ7Ci0JCX0KLQl9Ci0KLQlpZiAo cGRldi0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfTlZJRElBICYmCi0JICAgIElTX0VOQUJMRUQo Q09ORklHX1ZGSU9fUENJX05WTElOSzIpKSB7Ci0JCXJldCA9IHZmaW9fcGNpX252ZGlhX3YxMDBf bnZsaW5rMl9pbml0KHZkZXYpOwotCQlpZiAocmV0ICYmIHJldCAhPSAtRU5PREVWKSB7Ci0JCQlk ZXZfd2FybigmdmRldi0+cGRldi0+ZGV2LAotCQkJCSAiRmFpbGVkIHRvIHNldHVwIE5WSURJQSBO VjIgUkFNIHJlZ2lvblxuIik7Ci0JCQlnb3RvIGRpc2FibGVfZXhpdDsKLQkJfQotCX0KLQotCWlm IChwZGV2LT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9JQk0gJiYKLQkgICAgSVNfRU5BQkxFRChD T05GSUdfVkZJT19QQ0lfTlZMSU5LMikpIHsKLQkJcmV0ID0gdmZpb19wY2lfaWJtX25wdTJfaW5p dCh2ZGV2KTsKLQkJaWYgKHJldCAmJiByZXQgIT0gLUVOT0RFVikgewotCQkJZGV2X3dhcm4oJnZk ZXYtPnBkZXYtPmRldiwKLQkJCQkJIkZhaWxlZCB0byBzZXR1cCBOVklESUEgTlYyIEFUU0QgcmVn aW9uXG4iKTsKLQkJCWdvdG8gZGlzYWJsZV9leGl0OwotCQl9Ci0JfQotCi0JdmZpb19wY2lfcHJv YmVfbW1hcHModmRldik7Ci0KLQlyZXR1cm4gMDsKLQotZGlzYWJsZV9leGl0OgotCXZmaW9fcGNp X2Rpc2FibGUodmRldik7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgdmZpb19wY2lf ZGlzYWJsZShzdHJ1Y3QgdmZpb19wY2lfZGV2aWNlICp2ZGV2KQotewotCXN0cnVjdCBwY2lfZGV2 ICpwZGV2ID0gdmRldi0+cGRldjsKLQlzdHJ1Y3QgdmZpb19wY2lfZHVtbXlfcmVzb3VyY2UgKmR1 bW15X3JlcywgKnRtcDsKLQlzdHJ1Y3QgdmZpb19wY2lfaW9ldmVudGZkICppb2V2ZW50ZmQsICpp b2V2ZW50ZmRfdG1wOwotCWludCBpLCBiYXI7Ci0KLQkvKiBTdG9wIHRoZSBkZXZpY2UgZnJvbSBm dXJ0aGVyIERNQSAqLwotCXBjaV9jbGVhcl9tYXN0ZXIocGRldik7Ci0KLQl2ZmlvX3BjaV9zZXRf aXJxc19pb2N0bCh2ZGV2LCBWRklPX0lSUV9TRVRfREFUQV9OT05FIHwKLQkJCQlWRklPX0lSUV9T RVRfQUNUSU9OX1RSSUdHRVIsCi0JCQkJdmRldi0+aXJxX3R5cGUsIDAsIDAsIE5VTEwpOwotCi0J LyogRGV2aWNlIGNsb3NlZCwgZG9uJ3QgbmVlZCBtdXRleCBoZXJlICovCi0JbGlzdF9mb3JfZWFj aF9lbnRyeV9zYWZlKGlvZXZlbnRmZCwgaW9ldmVudGZkX3RtcCwKLQkJCQkgJnZkZXYtPmlvZXZl bnRmZHNfbGlzdCwgbmV4dCkgewotCQl2ZmlvX3ZpcnFmZF9kaXNhYmxlKCZpb2V2ZW50ZmQtPnZp cnFmZCk7Ci0JCWxpc3RfZGVsKCZpb2V2ZW50ZmQtPm5leHQpOwotCQlrZnJlZShpb2V2ZW50ZmQp OwotCX0KLQl2ZGV2LT5pb2V2ZW50ZmRzX25yID0gMDsKLQotCXZkZXYtPnZpcnFfZGlzYWJsZWQg PSBmYWxzZTsKLQotCWZvciAoaSA9IDA7IGkgPCB2ZGV2LT5udW1fcmVnaW9uczsgaSsrKQotCQl2 ZGV2LT5yZWdpb25baV0ub3BzLT5yZWxlYXNlKHZkZXYsICZ2ZGV2LT5yZWdpb25baV0pOwotCi0J dmRldi0+bnVtX3JlZ2lvbnMgPSAwOwotCWtmcmVlKHZkZXYtPnJlZ2lvbik7Ci0JdmRldi0+cmVn aW9uID0gTlVMTDsgLyogZG9uJ3Qga3JlYWxsb2MgYSBmcmVlZCBwb2ludGVyICovCi0KLQl2Zmlv X2NvbmZpZ19mcmVlKHZkZXYpOwotCi0JZm9yIChiYXIgPSBQQ0lfU1REX1JFU09VUkNFUzsgYmFy IDw9IFBDSV9TVERfUkVTT1VSQ0VfRU5EOyBiYXIrKykgewotCQlpZiAoIXZkZXYtPmJhcm1hcFti YXJdKQotCQkJY29udGludWU7Ci0JCXBjaV9pb3VubWFwKHBkZXYsIHZkZXYtPmJhcm1hcFtiYXJd KTsKLQkJcGNpX3JlbGVhc2Vfc2VsZWN0ZWRfcmVnaW9ucyhwZGV2LCAxIDw8IGJhcik7Ci0JCXZk ZXYtPmJhcm1hcFtiYXJdID0gTlVMTDsKLQl9Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUo ZHVtbXlfcmVzLCB0bXAsCi0JCQkJICZ2ZGV2LT5kdW1teV9yZXNvdXJjZXNfbGlzdCwgcmVzX25l eHQpIHsKLQkJbGlzdF9kZWwoJmR1bW15X3Jlcy0+cmVzX25leHQpOwotCQlyZWxlYXNlX3Jlc291 cmNlKCZkdW1teV9yZXMtPnJlc291cmNlKTsKLQkJa2ZyZWUoZHVtbXlfcmVzKTsKLQl9Ci0KLQl2 ZGV2LT5uZWVkc19yZXNldCA9IHRydWU7Ci0KLQkvKgotCSAqIElmIHdlIGhhdmUgc2F2ZWQgc3Rh dGUsIHJlc3RvcmUgaXQuICBJZiB3ZSBjYW4gcmVzZXQgdGhlIGRldmljZSwKLQkgKiBldmVuIGJl dHRlci4gIFJlc2V0dGluZyB3aXRoIGN1cnJlbnQgc3RhdGUgc2VlbXMgYmV0dGVyIHRoYW4KLQkg KiBub3RoaW5nLCBidXQgc2F2aW5nIGFuZCByZXN0b3JpbmcgY3VycmVudCBzdGF0ZSB3aXRob3V0 IHJlc2V0Ci0JICogaXMganVzdCBidXN5IHdvcmsuCi0JICovCi0JaWYgKHBjaV9sb2FkX2FuZF9m cmVlX3NhdmVkX3N0YXRlKHBkZXYsICZ2ZGV2LT5wY2lfc2F2ZWRfc3RhdGUpKSB7Ci0JCXByX2lu Zm8oIiVzOiBDb3VsZG4ndCByZWxvYWQgJXMgc2F2ZWQgc3RhdGVcbiIsCi0JCQlfX2Z1bmNfXywg ZGV2X25hbWUoJnBkZXYtPmRldikpOwotCi0JCWlmICghdmRldi0+cmVzZXRfd29ya3MpCi0JCQln b3RvIG91dDsKLQotCQlwY2lfc2F2ZV9zdGF0ZShwZGV2KTsKLQl9Ci0KLQkvKgotCSAqIERpc2Fi bGUgSU5UeCBhbmQgTVNJLCBwcmVzdW1hYmx5IHRvIGF2b2lkIHNwdXJpb3VzIGludGVycnVwdHMK LQkgKiBkdXJpbmcgcmVzZXQuICBTdG9sZW4gZnJvbSBwY2lfcmVzZXRfZnVuY3Rpb24oKQotCSAq LwotCXBjaV93cml0ZV9jb25maWdfd29yZChwZGV2LCBQQ0lfQ09NTUFORCwgUENJX0NPTU1BTkRf SU5UWF9ESVNBQkxFKTsKLQotCS8qCi0JICogVHJ5IHRvIHJlc2V0IHRoZSBkZXZpY2UuICBUaGUg c3VjY2VzcyBvZiB0aGlzIGlzIGRlcGVuZGVudCBvbgotCSAqIGJlaW5nIGFibGUgdG8gbG9jayB0 aGUgZGV2aWNlLCB3aGljaCBpcyBub3QgYWx3YXlzIHBvc3NpYmxlLgotCSAqLwotCWlmICh2ZGV2 LT5yZXNldF93b3JrcyAmJiAhcGNpX3RyeV9yZXNldF9mdW5jdGlvbihwZGV2KSkKLQkJdmRldi0+ bmVlZHNfcmVzZXQgPSBmYWxzZTsKLQotCXBjaV9yZXN0b3JlX3N0YXRlKHBkZXYpOwotb3V0Ogot CXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKLQotCXZmaW9fcGNpX3RyeV9idXNfcmVzZXQodmRl dik7Ci0KLQlpZiAoIWRpc2FibGVfaWRsZV9kMykKLQkJdmZpb19wY2lfc2V0X3Bvd2VyX3N0YXRl KHZkZXYsIFBDSV9EM2hvdCk7Ci19Ci0KIHN0YXRpYyB2b2lkIHZmaW9fcGNpX3JlbGVhc2Uodm9p ZCAqZGV2aWNlX2RhdGEpCiB7CiAJc3RydWN0IHZmaW9fcGNpX2RldmljZSAqdmRldiA9IGRldmlj ZV9kYXRhOwpAQCAtNTAyLDc3NiArOTcsNiBAQCBzdGF0aWMgaW50IHZmaW9fcGNpX29wZW4odm9p ZCAqZGV2aWNlX2RhdGEpCiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCB2ZmlvX3BjaV9n ZXRfaXJxX2NvdW50KHN0cnVjdCB2ZmlvX3BjaV9kZXZpY2UgKnZkZXYsIGludCBpcnFfdHlwZSkK LXsKLQlpZiAoaXJxX3R5cGUgPT0gVkZJT19QQ0lfSU5UWF9JUlFfSU5ERVgpIHsKLQkJdTggcGlu OwotCi0JCWlmICghSVNfRU5BQkxFRChDT05GSUdfVkZJT19QQ0lfSU5UWCkgfHwKLQkJICAgIHZk ZXYtPm5vaW50eCB8fCB2ZGV2LT5wZGV2LT5pc192aXJ0Zm4pCi0JCQlyZXR1cm4gMDsKLQotCQlw Y2lfcmVhZF9jb25maWdfYnl0ZSh2ZGV2LT5wZGV2LCBQQ0lfSU5URVJSVVBUX1BJTiwgJnBpbik7 Ci0KLQkJcmV0dXJuIHBpbiA/IDEgOiAwOwotCX0gZWxzZSBpZiAoaXJxX3R5cGUgPT0gVkZJT19Q Q0lfTVNJX0lSUV9JTkRFWCkgewotCQl1OCBwb3M7Ci0JCXUxNiBmbGFnczsKLQotCQlwb3MgPSB2 ZGV2LT5wZGV2LT5tc2lfY2FwOwotCQlpZiAocG9zKSB7Ci0JCQlwY2lfcmVhZF9jb25maWdfd29y ZCh2ZGV2LT5wZGV2LAotCQkJCQkgICAgIHBvcyArIFBDSV9NU0lfRkxBR1MsICZmbGFncyk7Ci0J CQlyZXR1cm4gMSA8PCAoKGZsYWdzICYgUENJX01TSV9GTEFHU19RTUFTSykgPj4gMSk7Ci0JCX0K LQl9IGVsc2UgaWYgKGlycV90eXBlID09IFZGSU9fUENJX01TSVhfSVJRX0lOREVYKSB7Ci0JCXU4 IHBvczsKLQkJdTE2IGZsYWdzOwotCi0JCXBvcyA9IHZkZXYtPnBkZXYtPm1zaXhfY2FwOwotCQlp ZiAocG9zKSB7Ci0JCQlwY2lfcmVhZF9jb25maWdfd29yZCh2ZGV2LT5wZGV2LAotCQkJCQkgICAg IHBvcyArIFBDSV9NU0lYX0ZMQUdTLCAmZmxhZ3MpOwotCi0JCQlyZXR1cm4gKGZsYWdzICYgUENJ X01TSVhfRkxBR1NfUVNJWkUpICsgMTsKLQkJfQotCX0gZWxzZSBpZiAoaXJxX3R5cGUgPT0gVkZJ T19QQ0lfRVJSX0lSUV9JTkRFWCkgewotCQlpZiAocGNpX2lzX3BjaWUodmRldi0+cGRldikpCi0J CQlyZXR1cm4gMTsKLQl9IGVsc2UgaWYgKGlycV90eXBlID09IFZGSU9fUENJX1JFUV9JUlFfSU5E RVgpIHsKLQkJcmV0dXJuIDE7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdmZp b19wY2lfY291bnRfZGV2cyhzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdm9pZCAqZGF0YSkKLXsKLQko KihpbnQgKilkYXRhKSsrOwotCXJldHVybiAwOwotfQotCi1zdHJ1Y3QgdmZpb19wY2lfZmlsbF9p bmZvIHsKLQlpbnQgbWF4OwotCWludCBjdXI7Ci0Jc3RydWN0IHZmaW9fcGNpX2RlcGVuZGVudF9k ZXZpY2UgKmRldmljZXM7Ci19OwotCi1zdGF0aWMgaW50IHZmaW9fcGNpX2ZpbGxfZGV2cyhzdHJ1 Y3QgcGNpX2RldiAqcGRldiwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgdmZpb19wY2lfZmlsbF9p bmZvICpmaWxsID0gZGF0YTsKLQlzdHJ1Y3QgaW9tbXVfZ3JvdXAgKmlvbW11X2dyb3VwOwotCi0J aWYgKGZpbGwtPmN1ciA9PSBmaWxsLT5tYXgpCi0JCXJldHVybiAtRUFHQUlOOyAvKiBTb21ldGhp bmcgY2hhbmdlZCwgdHJ5IGFnYWluICovCi0KLQlpb21tdV9ncm91cCA9IGlvbW11X2dyb3VwX2dl dCgmcGRldi0+ZGV2KTsKLQlpZiAoIWlvbW11X2dyb3VwKQotCQlyZXR1cm4gLUVQRVJNOyAvKiBD YW5ub3QgcmVzZXQgbm9uLWlzb2xhdGVkIGRldmljZXMgKi8KLQotCWZpbGwtPmRldmljZXNbZmls bC0+Y3VyXS5ncm91cF9pZCA9IGlvbW11X2dyb3VwX2lkKGlvbW11X2dyb3VwKTsKLQlmaWxsLT5k ZXZpY2VzW2ZpbGwtPmN1cl0uc2VnbWVudCA9IHBjaV9kb21haW5fbnIocGRldi0+YnVzKTsKLQlm aWxsLT5kZXZpY2VzW2ZpbGwtPmN1cl0uYnVzID0gcGRldi0+YnVzLT5udW1iZXI7Ci0JZmlsbC0+ ZGV2aWNlc1tmaWxsLT5jdXJdLmRldmZuID0gcGRldi0+ZGV2Zm47Ci0JZmlsbC0+Y3VyKys7Ci0J aW9tbXVfZ3JvdXBfcHV0KGlvbW11X2dyb3VwKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RydWN0IHZm aW9fcGNpX2dyb3VwX2VudHJ5IHsKLQlzdHJ1Y3QgdmZpb19ncm91cCAqZ3JvdXA7Ci0JaW50IGlk OwotfTsKLQotc3RydWN0IHZmaW9fcGNpX2dyb3VwX2luZm8gewotCWludCBjb3VudDsKLQlzdHJ1 Y3QgdmZpb19wY2lfZ3JvdXBfZW50cnkgKmdyb3VwczsKLX07Ci0KLXN0YXRpYyBpbnQgdmZpb19w Y2lfdmFsaWRhdGVfZGV2cyhzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdm9pZCAqZGF0YSkKLXsKLQlz dHJ1Y3QgdmZpb19wY2lfZ3JvdXBfaW5mbyAqaW5mbyA9IGRhdGE7Ci0Jc3RydWN0IGlvbW11X2dy b3VwICpncm91cDsKLQlpbnQgaWQsIGk7Ci0KLQlncm91cCA9IGlvbW11X2dyb3VwX2dldCgmcGRl di0+ZGV2KTsKLQlpZiAoIWdyb3VwKQotCQlyZXR1cm4gLUVQRVJNOwotCi0JaWQgPSBpb21tdV9n cm91cF9pZChncm91cCk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgaW5mby0+Y291bnQ7IGkrKykKLQkJ aWYgKGluZm8tPmdyb3Vwc1tpXS5pZCA9PSBpZCkKLQkJCWJyZWFrOwotCi0JaW9tbXVfZ3JvdXBf cHV0KGdyb3VwKTsKLQotCXJldHVybiAoaSA9PSBpbmZvLT5jb3VudCkgPyAtRUlOVkFMIDogMDsK LX0KLQotc3RhdGljIGJvb2wgdmZpb19wY2lfZGV2X2JlbG93X3Nsb3Qoc3RydWN0IHBjaV9kZXYg KnBkZXYsIHN0cnVjdCBwY2lfc2xvdCAqc2xvdCkKLXsKLQlmb3IgKDsgcGRldjsgcGRldiA9IHBk ZXYtPmJ1cy0+c2VsZikKLQkJaWYgKHBkZXYtPmJ1cyA9PSBzbG90LT5idXMpCi0JCQlyZXR1cm4g KHBkZXYtPnNsb3QgPT0gc2xvdCk7Ci0JcmV0dXJuIGZhbHNlOwotfQotCi1zdHJ1Y3QgdmZpb19w Y2lfd2Fsa19pbmZvIHsKLQlpbnQgKCpmbikoc3RydWN0IHBjaV9kZXYgKiwgdm9pZCAqZGF0YSk7 Ci0Jdm9pZCAqZGF0YTsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKLQlib29sIHNsb3Q7Ci0JaW50 IHJldDsKLX07Ci0KLXN0YXRpYyBpbnQgdmZpb19wY2lfd2Fsa193cmFwcGVyKHN0cnVjdCBwY2lf ZGV2ICpwZGV2LCB2b2lkICpkYXRhKQotewotCXN0cnVjdCB2ZmlvX3BjaV93YWxrX2luZm8gKndh bGsgPSBkYXRhOwotCi0JaWYgKCF3YWxrLT5zbG90IHx8IHZmaW9fcGNpX2Rldl9iZWxvd19zbG90 KHBkZXYsIHdhbGstPnBkZXYtPnNsb3QpKQotCQl3YWxrLT5yZXQgPSB3YWxrLT5mbihwZGV2LCB3 YWxrLT5kYXRhKTsKLQotCXJldHVybiB3YWxrLT5yZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdmZpb19w Y2lfZm9yX2VhY2hfc2xvdF9vcl9idXMoc3RydWN0IHBjaV9kZXYgKnBkZXYsCi0JCQkJCSBpbnQg KCpmbikoc3RydWN0IHBjaV9kZXYgKiwKLQkJCQkJCSAgIHZvaWQgKmRhdGEpLCB2b2lkICpkYXRh LAotCQkJCQkgYm9vbCBzbG90KQotewotCXN0cnVjdCB2ZmlvX3BjaV93YWxrX2luZm8gd2FsayA9 IHsKLQkJLmZuID0gZm4sIC5kYXRhID0gZGF0YSwgLnBkZXYgPSBwZGV2LCAuc2xvdCA9IHNsb3Qs IC5yZXQgPSAwLAotCX07Ci0KLQlwY2lfd2Fsa19idXMocGRldi0+YnVzLCB2ZmlvX3BjaV93YWxr X3dyYXBwZXIsICZ3YWxrKTsKLQotCXJldHVybiB3YWxrLnJldDsKLX0KLQotc3RhdGljIGludCBt c2l4X21tYXBwYWJsZV9jYXAoc3RydWN0IHZmaW9fcGNpX2RldmljZSAqdmRldiwKLQkJCSAgICAg IHN0cnVjdCB2ZmlvX2luZm9fY2FwICpjYXBzKQotewotCXN0cnVjdCB2ZmlvX2luZm9fY2FwX2hl YWRlciBoZWFkZXIgPSB7Ci0JCS5pZCA9IFZGSU9fUkVHSU9OX0lORk9fQ0FQX01TSVhfTUFQUEFC TEUsCi0JCS52ZXJzaW9uID0gMQotCX07Ci0KLQlyZXR1cm4gdmZpb19pbmZvX2FkZF9jYXBhYmls aXR5KGNhcHMsICZoZWFkZXIsIHNpemVvZihoZWFkZXIpKTsKLX0KLQotaW50IHZmaW9fcGNpX3Jl Z2lzdGVyX2Rldl9yZWdpb24oc3RydWN0IHZmaW9fcGNpX2RldmljZSAqdmRldiwKLQkJCQkgdW5z aWduZWQgaW50IHR5cGUsIHVuc2lnbmVkIGludCBzdWJ0eXBlLAotCQkJCSBjb25zdCBzdHJ1Y3Qg dmZpb19wY2lfcmVnb3BzICpvcHMsCi0JCQkJIHNpemVfdCBzaXplLCB1MzIgZmxhZ3MsIHZvaWQg KmRhdGEpCi17Ci0Jc3RydWN0IHZmaW9fcGNpX3JlZ2lvbiAqcmVnaW9uOwotCi0JcmVnaW9uID0g a3JlYWxsb2ModmRldi0+cmVnaW9uLAotCQkJICAodmRldi0+bnVtX3JlZ2lvbnMgKyAxKSAqIHNp emVvZigqcmVnaW9uKSwKLQkJCSAgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFyZWdpb24pCi0JCXJldHVy biAtRU5PTUVNOwotCi0JdmRldi0+cmVnaW9uID0gcmVnaW9uOwotCXZkZXYtPnJlZ2lvblt2ZGV2 LT5udW1fcmVnaW9uc10udHlwZSA9IHR5cGU7Ci0JdmRldi0+cmVnaW9uW3ZkZXYtPm51bV9yZWdp b25zXS5zdWJ0eXBlID0gc3VidHlwZTsKLQl2ZGV2LT5yZWdpb25bdmRldi0+bnVtX3JlZ2lvbnNd Lm9wcyA9IG9wczsKLQl2ZGV2LT5yZWdpb25bdmRldi0+bnVtX3JlZ2lvbnNdLnNpemUgPSBzaXpl OwotCXZkZXYtPnJlZ2lvblt2ZGV2LT5udW1fcmVnaW9uc10uZmxhZ3MgPSBmbGFnczsKLQl2ZGV2 LT5yZWdpb25bdmRldi0+bnVtX3JlZ2lvbnNdLmRhdGEgPSBkYXRhOwotCi0JdmRldi0+bnVtX3Jl Z2lvbnMrKzsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgbG9uZyB2ZmlvX3BjaV9pb2N0bCh2 b2lkICpkZXZpY2VfZGF0YSwKLQkJCSAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcg YXJnKQotewotCXN0cnVjdCB2ZmlvX3BjaV9kZXZpY2UgKnZkZXYgPSBkZXZpY2VfZGF0YTsKLQl1 bnNpZ25lZCBsb25nIG1pbnN6OwotCi0JaWYgKGNtZCA9PSBWRklPX0RFVklDRV9HRVRfSU5GTykg ewotCQlzdHJ1Y3QgdmZpb19kZXZpY2VfaW5mbyBpbmZvOwotCi0JCW1pbnN6ID0gb2Zmc2V0b2Zl bmQoc3RydWN0IHZmaW9fZGV2aWNlX2luZm8sIG51bV9pcnFzKTsKLQotCQlpZiAoY29weV9mcm9t X3VzZXIoJmluZm8sICh2b2lkIF9fdXNlciAqKWFyZywgbWluc3opKQotCQkJcmV0dXJuIC1FRkFV TFQ7Ci0KLQkJaWYgKGluZm8uYXJnc3ogPCBtaW5zeikKLQkJCXJldHVybiAtRUlOVkFMOwotCi0J CWluZm8uZmxhZ3MgPSBWRklPX0RFVklDRV9GTEFHU19QQ0k7Ci0KLQkJaWYgKHZkZXYtPnJlc2V0 X3dvcmtzKQotCQkJaW5mby5mbGFncyB8PSBWRklPX0RFVklDRV9GTEFHU19SRVNFVDsKLQotCQlp bmZvLm51bV9yZWdpb25zID0gVkZJT19QQ0lfTlVNX1JFR0lPTlMgKyB2ZGV2LT5udW1fcmVnaW9u czsKLQkJaW5mby5udW1faXJxcyA9IFZGSU9fUENJX05VTV9JUlFTOwotCi0JCXJldHVybiBjb3B5 X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmaW5mbywgbWluc3opID8KLQkJCS1FRkFVTFQg OiAwOwotCi0JfSBlbHNlIGlmIChjbWQgPT0gVkZJT19ERVZJQ0VfR0VUX1JFR0lPTl9JTkZPKSB7 Ci0JCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdmRldi0+cGRldjsKLQkJc3RydWN0IHZmaW9fcmVn aW9uX2luZm8gaW5mbzsKLQkJc3RydWN0IHZmaW9faW5mb19jYXAgY2FwcyA9IHsgLmJ1ZiA9IE5V TEwsIC5zaXplID0gMCB9OwotCQlpbnQgaSwgcmV0OwotCi0JCW1pbnN6ID0gb2Zmc2V0b2ZlbmQo c3RydWN0IHZmaW9fcmVnaW9uX2luZm8sIG9mZnNldCk7Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2Vy KCZpbmZvLCAodm9pZCBfX3VzZXIgKilhcmcsIG1pbnN6KSkKLQkJCXJldHVybiAtRUZBVUxUOwot Ci0JCWlmIChpbmZvLmFyZ3N6IDwgbWluc3opCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQotCQlzd2l0 Y2ggKGluZm8uaW5kZXgpIHsKLQkJY2FzZSBWRklPX1BDSV9DT05GSUdfUkVHSU9OX0lOREVYOgot CQkJaW5mby5vZmZzZXQgPSBWRklPX1BDSV9JTkRFWF9UT19PRkZTRVQoaW5mby5pbmRleCk7Ci0J CQlpbmZvLnNpemUgPSBwZGV2LT5jZmdfc2l6ZTsKLQkJCWluZm8uZmxhZ3MgPSBWRklPX1JFR0lP Tl9JTkZPX0ZMQUdfUkVBRCB8Ci0JCQkJICAgICBWRklPX1JFR0lPTl9JTkZPX0ZMQUdfV1JJVEU7 Ci0JCQlicmVhazsKLQkJY2FzZSBWRklPX1BDSV9CQVIwX1JFR0lPTl9JTkRFWCAuLi4gVkZJT19Q Q0lfQkFSNV9SRUdJT05fSU5ERVg6Ci0JCQlpbmZvLm9mZnNldCA9IFZGSU9fUENJX0lOREVYX1RP X09GRlNFVChpbmZvLmluZGV4KTsKLQkJCWluZm8uc2l6ZSA9IHBjaV9yZXNvdXJjZV9sZW4ocGRl diwgaW5mby5pbmRleCk7Ci0JCQlpZiAoIWluZm8uc2l6ZSkgewotCQkJCWluZm8uZmxhZ3MgPSAw OwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlpbmZvLmZsYWdzID0gVkZJT19SRUdJT05fSU5GT19G TEFHX1JFQUQgfAotCQkJCSAgICAgVkZJT19SRUdJT05fSU5GT19GTEFHX1dSSVRFOwotCQkJaWYg KHZkZXYtPmJhcl9tbWFwX3N1cHBvcnRlZFtpbmZvLmluZGV4XSkgewotCQkJCWluZm8uZmxhZ3Mg fD0gVkZJT19SRUdJT05fSU5GT19GTEFHX01NQVA7Ci0JCQkJaWYgKGluZm8uaW5kZXggPT0gdmRl di0+bXNpeF9iYXIpIHsKLQkJCQkJcmV0ID0gbXNpeF9tbWFwcGFibGVfY2FwKHZkZXYsICZjYXBz KTsKLQkJCQkJaWYgKHJldCkKLQkJCQkJCXJldHVybiByZXQ7Ci0JCQkJfQotCQkJfQotCi0JCQli cmVhazsKLQkJY2FzZSBWRklPX1BDSV9ST01fUkVHSU9OX0lOREVYOgotCQl7Ci0JCQl2b2lkIF9f aW9tZW0gKmlvOwotCQkJc2l6ZV90IHNpemU7Ci0JCQl1MTYgb3JpZ19jbWQ7Ci0KLQkJCWluZm8u b2Zmc2V0ID0gVkZJT19QQ0lfSU5ERVhfVE9fT0ZGU0VUKGluZm8uaW5kZXgpOwotCQkJaW5mby5m bGFncyA9IDA7Ci0KLQkJCS8qIFJlcG9ydCB0aGUgQkFSIHNpemUsIG5vdCB0aGUgUk9NIHNpemUg Ki8KLQkJCWluZm8uc2l6ZSA9IHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgaW5mby5pbmRleCk7Ci0J CQlpZiAoIWluZm8uc2l6ZSkgewotCQkJCS8qIFNoYWRvdyBST01zIGFwcGVhciBhcyBQQ0kgb3B0 aW9uIFJPTXMgKi8KLQkJCQlpZiAocGRldi0+cmVzb3VyY2VbUENJX1JPTV9SRVNPVVJDRV0uZmxh Z3MgJgotCQkJCQkJCUlPUkVTT1VSQ0VfUk9NX1NIQURPVykKLQkJCQkJaW5mby5zaXplID0gMHgy MDAwMDsKLQkJCQllbHNlCi0JCQkJCWJyZWFrOwotCQkJfQotCi0JCQkvKgotCQkJICogSXMgaXQg cmVhbGx5IHRoZXJlPyAgRW5hYmxlIG1lbW9yeSBkZWNvZGUgZm9yCi0JCQkgKiBpbXBsaWNpdCBh Y2Nlc3MgaW4gcGNpX21hcF9yb20oKS4KLQkJCSAqLwotCQkJcGNpX3JlYWRfY29uZmlnX3dvcmQo cGRldiwgUENJX0NPTU1BTkQsICZvcmlnX2NtZCk7Ci0JCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQo cGRldiwgUENJX0NPTU1BTkQsCi0JCQkJCSAgICAgIG9yaWdfY21kIHwgUENJX0NPTU1BTkRfTUVN T1JZKTsKLQotCQkJaW8gPSBwY2lfbWFwX3JvbShwZGV2LCAmc2l6ZSk7Ci0JCQlpZiAoaW8pIHsK LQkJCQlpbmZvLmZsYWdzID0gVkZJT19SRUdJT05fSU5GT19GTEFHX1JFQUQ7Ci0JCQkJcGNpX3Vu bWFwX3JvbShwZGV2LCBpbyk7Ci0JCQl9IGVsc2UgewotCQkJCWluZm8uc2l6ZSA9IDA7Ci0JCQl9 Ci0KLQkJCXBjaV93cml0ZV9jb25maWdfd29yZChwZGV2LCBQQ0lfQ09NTUFORCwgb3JpZ19jbWQp OwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBWRklPX1BDSV9WR0FfUkVHSU9OX0lOREVYOgotCQkJ aWYgKCF2ZGV2LT5oYXNfdmdhKQotCQkJCXJldHVybiAtRUlOVkFMOwotCi0JCQlpbmZvLm9mZnNl dCA9IFZGSU9fUENJX0lOREVYX1RPX09GRlNFVChpbmZvLmluZGV4KTsKLQkJCWluZm8uc2l6ZSA9 IDB4YzAwMDA7Ci0JCQlpbmZvLmZsYWdzID0gVkZJT19SRUdJT05fSU5GT19GTEFHX1JFQUQgfAot CQkJCSAgICAgVkZJT19SRUdJT05fSU5GT19GTEFHX1dSSVRFOwotCi0JCQlicmVhazsKLQkJZGVm YXVsdDoKLQkJewotCQkJc3RydWN0IHZmaW9fcmVnaW9uX2luZm9fY2FwX3R5cGUgY2FwX3R5cGUg PSB7Ci0JCQkJCS5oZWFkZXIuaWQgPSBWRklPX1JFR0lPTl9JTkZPX0NBUF9UWVBFLAotCQkJCQku aGVhZGVyLnZlcnNpb24gPSAxIH07Ci0KLQkJCWlmIChpbmZvLmluZGV4ID49Ci0JCQkgICAgVkZJ T19QQ0lfTlVNX1JFR0lPTlMgKyB2ZGV2LT5udW1fcmVnaW9ucykKLQkJCQlyZXR1cm4gLUVJTlZB TDsKLQkJCWluZm8uaW5kZXggPSBhcnJheV9pbmRleF9ub3NwZWMoaW5mby5pbmRleCwKLQkJCQkJ CQlWRklPX1BDSV9OVU1fUkVHSU9OUyArCi0JCQkJCQkJdmRldi0+bnVtX3JlZ2lvbnMpOwotCi0J CQlpID0gaW5mby5pbmRleCAtIFZGSU9fUENJX05VTV9SRUdJT05TOwotCi0JCQlpbmZvLm9mZnNl dCA9IFZGSU9fUENJX0lOREVYX1RPX09GRlNFVChpbmZvLmluZGV4KTsKLQkJCWluZm8uc2l6ZSA9 IHZkZXYtPnJlZ2lvbltpXS5zaXplOwotCQkJaW5mby5mbGFncyA9IHZkZXYtPnJlZ2lvbltpXS5m bGFnczsKLQotCQkJY2FwX3R5cGUudHlwZSA9IHZkZXYtPnJlZ2lvbltpXS50eXBlOwotCQkJY2Fw X3R5cGUuc3VidHlwZSA9IHZkZXYtPnJlZ2lvbltpXS5zdWJ0eXBlOwotCi0JCQlyZXQgPSB2Zmlv X2luZm9fYWRkX2NhcGFiaWxpdHkoJmNhcHMsICZjYXBfdHlwZS5oZWFkZXIsCi0JCQkJCQkgICAg ICAgc2l6ZW9mKGNhcF90eXBlKSk7Ci0JCQlpZiAocmV0KQotCQkJCXJldHVybiByZXQ7Ci0KLQkJ CWlmICh2ZGV2LT5yZWdpb25baV0ub3BzLT5hZGRfY2FwYWJpbGl0eSkgewotCQkJCXJldCA9IHZk ZXYtPnJlZ2lvbltpXS5vcHMtPmFkZF9jYXBhYmlsaXR5KHZkZXYsCi0JCQkJCQkmdmRldi0+cmVn aW9uW2ldLCAmY2Fwcyk7Ci0JCQkJaWYgKHJldCkKLQkJCQkJcmV0dXJuIHJldDsKLQkJCX0KLQkJ fQotCQl9Ci0KLQkJaWYgKGNhcHMuc2l6ZSkgewotCQkJaW5mby5mbGFncyB8PSBWRklPX1JFR0lP Tl9JTkZPX0ZMQUdfQ0FQUzsKLQkJCWlmIChpbmZvLmFyZ3N6IDwgc2l6ZW9mKGluZm8pICsgY2Fw cy5zaXplKSB7Ci0JCQkJaW5mby5hcmdzeiA9IHNpemVvZihpbmZvKSArIGNhcHMuc2l6ZTsKLQkJ CQlpbmZvLmNhcF9vZmZzZXQgPSAwOwotCQkJfSBlbHNlIHsKLQkJCQl2ZmlvX2luZm9fY2FwX3No aWZ0KCZjYXBzLCBzaXplb2YoaW5mbykpOwotCQkJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191 c2VyICopYXJnICsKLQkJCQkJCSAgc2l6ZW9mKGluZm8pLCBjYXBzLmJ1ZiwKLQkJCQkJCSAgY2Fw cy5zaXplKSkgewotCQkJCQlrZnJlZShjYXBzLmJ1Zik7Ci0JCQkJCXJldHVybiAtRUZBVUxUOwot CQkJCX0KLQkJCQlpbmZvLmNhcF9vZmZzZXQgPSBzaXplb2YoaW5mbyk7Ci0JCQl9Ci0KLQkJCWtm cmVlKGNhcHMuYnVmKTsKLQkJfQotCi0JCXJldHVybiBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2Vy ICopYXJnLCAmaW5mbywgbWluc3opID8KLQkJCS1FRkFVTFQgOiAwOwotCi0JfSBlbHNlIGlmIChj bWQgPT0gVkZJT19ERVZJQ0VfR0VUX0lSUV9JTkZPKSB7Ci0JCXN0cnVjdCB2ZmlvX2lycV9pbmZv IGluZm87Ci0KLQkJbWluc3ogPSBvZmZzZXRvZmVuZChzdHJ1Y3QgdmZpb19pcnFfaW5mbywgY291 bnQpOwotCi0JCWlmIChjb3B5X2Zyb21fdXNlcigmaW5mbywgKHZvaWQgX191c2VyICopYXJnLCBt aW5zeikpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQlpZiAoaW5mby5hcmdzeiA8IG1pbnN6IHx8 IGluZm8uaW5kZXggPj0gVkZJT19QQ0lfTlVNX0lSUVMpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQot CQlzd2l0Y2ggKGluZm8uaW5kZXgpIHsKLQkJY2FzZSBWRklPX1BDSV9JTlRYX0lSUV9JTkRFWCAu Li4gVkZJT19QQ0lfTVNJWF9JUlFfSU5ERVg6Ci0JCWNhc2UgVkZJT19QQ0lfUkVRX0lSUV9JTkRF WDoKLQkJCWJyZWFrOwotCQljYXNlIFZGSU9fUENJX0VSUl9JUlFfSU5ERVg6Ci0JCQlpZiAocGNp X2lzX3BjaWUodmRldi0+cGRldikpCi0JCQkJYnJlYWs7Ci0JCS8qIGZhbGwgdGhyb3VnaCAqLwot CQlkZWZhdWx0OgotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQotCQlpbmZvLmZsYWdzID0gVkZJ T19JUlFfSU5GT19FVkVOVEZEOwotCi0JCWluZm8uY291bnQgPSB2ZmlvX3BjaV9nZXRfaXJxX2Nv dW50KHZkZXYsIGluZm8uaW5kZXgpOwotCi0JCWlmIChpbmZvLmluZGV4ID09IFZGSU9fUENJX0lO VFhfSVJRX0lOREVYKQotCQkJaW5mby5mbGFncyB8PSAoVkZJT19JUlFfSU5GT19NQVNLQUJMRSB8 Ci0JCQkJICAgICAgIFZGSU9fSVJRX0lORk9fQVVUT01BU0tFRCk7Ci0JCWVsc2UKLQkJCWluZm8u ZmxhZ3MgfD0gVkZJT19JUlFfSU5GT19OT1JFU0laRTsKLQotCQlyZXR1cm4gY29weV90b191c2Vy KCh2b2lkIF9fdXNlciAqKWFyZywgJmluZm8sIG1pbnN6KSA/Ci0JCQktRUZBVUxUIDogMDsKLQot CX0gZWxzZSBpZiAoY21kID09IFZGSU9fREVWSUNFX1NFVF9JUlFTKSB7Ci0JCXN0cnVjdCB2Zmlv X2lycV9zZXQgaGRyOwotCQl1OCAqZGF0YSA9IE5VTEw7Ci0JCWludCBtYXgsIHJldCA9IDA7Ci0J CXNpemVfdCBkYXRhX3NpemUgPSAwOwotCi0JCW1pbnN6ID0gb2Zmc2V0b2ZlbmQoc3RydWN0IHZm aW9faXJxX3NldCwgY291bnQpOwotCi0JCWlmIChjb3B5X2Zyb21fdXNlcigmaGRyLCAodm9pZCBf X3VzZXIgKilhcmcsIG1pbnN6KSkKLQkJCXJldHVybiAtRUZBVUxUOwotCi0JCW1heCA9IHZmaW9f cGNpX2dldF9pcnFfY291bnQodmRldiwgaGRyLmluZGV4KTsKLQotCQlyZXQgPSB2ZmlvX3NldF9p cnFzX3ZhbGlkYXRlX2FuZF9wcmVwYXJlKCZoZHIsIG1heCwKLQkJCQkJCSBWRklPX1BDSV9OVU1f SVJRUywgJmRhdGFfc2l6ZSk7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OwotCi0JCWlmIChk YXRhX3NpemUpIHsKLQkJCWRhdGEgPSBtZW1kdXBfdXNlcigodm9pZCBfX3VzZXIgKikoYXJnICsg bWluc3opLAotCQkJCQkgICAgZGF0YV9zaXplKTsKLQkJCWlmIChJU19FUlIoZGF0YSkpCi0JCQkJ cmV0dXJuIFBUUl9FUlIoZGF0YSk7Ci0JCX0KLQotCQltdXRleF9sb2NrKCZ2ZGV2LT5pZ2F0ZSk7 Ci0KLQkJcmV0ID0gdmZpb19wY2lfc2V0X2lycXNfaW9jdGwodmRldiwgaGRyLmZsYWdzLCBoZHIu aW5kZXgsCi0JCQkJCSAgICAgIGhkci5zdGFydCwgaGRyLmNvdW50LCBkYXRhKTsKLQotCQltdXRl eF91bmxvY2soJnZkZXYtPmlnYXRlKTsKLQkJa2ZyZWUoZGF0YSk7Ci0KLQkJcmV0dXJuIHJldDsK LQotCX0gZWxzZSBpZiAoY21kID09IFZGSU9fREVWSUNFX1JFU0VUKSB7Ci0JCXJldHVybiB2ZGV2 LT5yZXNldF93b3JrcyA/Ci0JCQlwY2lfdHJ5X3Jlc2V0X2Z1bmN0aW9uKHZkZXYtPnBkZXYpIDog LUVJTlZBTDsKLQotCX0gZWxzZSBpZiAoY21kID09IFZGSU9fREVWSUNFX0dFVF9QQ0lfSE9UX1JF U0VUX0lORk8pIHsKLQkJc3RydWN0IHZmaW9fcGNpX2hvdF9yZXNldF9pbmZvIGhkcjsKLQkJc3Ry dWN0IHZmaW9fcGNpX2ZpbGxfaW5mbyBmaWxsID0geyAwIH07Ci0JCXN0cnVjdCB2ZmlvX3BjaV9k ZXBlbmRlbnRfZGV2aWNlICpkZXZpY2VzID0gTlVMTDsKLQkJYm9vbCBzbG90ID0gZmFsc2U7Ci0J CWludCByZXQgPSAwOwotCi0JCW1pbnN6ID0gb2Zmc2V0b2ZlbmQoc3RydWN0IHZmaW9fcGNpX2hv dF9yZXNldF9pbmZvLCBjb3VudCk7Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZoZHIsICh2b2lk IF9fdXNlciAqKWFyZywgbWluc3opKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJaWYgKGhkci5h cmdzeiA8IG1pbnN6KQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJaGRyLmZsYWdzID0gMDsKLQot CQkvKiBDYW4gd2UgZG8gYSBzbG90IG9yIGJ1cyByZXNldCBvciBuZWl0aGVyPyAqLwotCQlpZiAo IXBjaV9wcm9iZV9yZXNldF9zbG90KHZkZXYtPnBkZXYtPnNsb3QpKQotCQkJc2xvdCA9IHRydWU7 Ci0JCWVsc2UgaWYgKHBjaV9wcm9iZV9yZXNldF9idXModmRldi0+cGRldi0+YnVzKSkKLQkJCXJl dHVybiAtRU5PREVWOwotCi0JCS8qIEhvdyBtYW55IGRldmljZXMgYXJlIGFmZmVjdGVkPyAqLwot CQlyZXQgPSB2ZmlvX3BjaV9mb3JfZWFjaF9zbG90X29yX2J1cyh2ZGV2LT5wZGV2LAotCQkJCQkJ ICAgIHZmaW9fcGNpX2NvdW50X2RldnMsCi0JCQkJCQkgICAgJmZpbGwubWF4LCBzbG90KTsKLQkJ aWYgKHJldCkKLQkJCXJldHVybiByZXQ7Ci0KLQkJV0FSTl9PTighZmlsbC5tYXgpOyAvKiBTaG91 bGQgYWx3YXlzIGJlIGF0IGxlYXN0IG9uZSAqLwotCi0JCS8qCi0JCSAqIElmIHRoZXJlJ3MgZW5v dWdoIHNwYWNlLCBmaWxsIGl0IG5vdywgb3RoZXJ3aXNlIHJldHVybgotCQkgKiAtRU5PU1BDIGFu ZCB0aGUgbnVtYmVyIG9mIGRldmljZXMgYWZmZWN0ZWQuCi0JCSAqLwotCQlpZiAoaGRyLmFyZ3N6 IDwgc2l6ZW9mKGhkcikgKyAoZmlsbC5tYXggKiBzaXplb2YoKmRldmljZXMpKSkgewotCQkJcmV0 ID0gLUVOT1NQQzsKLQkJCWhkci5jb3VudCA9IGZpbGwubWF4OwotCQkJZ290byByZXNldF9pbmZv X2V4aXQ7Ci0JCX0KLQotCQlkZXZpY2VzID0ga2NhbGxvYyhmaWxsLm1heCwgc2l6ZW9mKCpkZXZp Y2VzKSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghZGV2aWNlcykKLQkJCXJldHVybiAtRU5PTUVNOwot Ci0JCWZpbGwuZGV2aWNlcyA9IGRldmljZXM7Ci0KLQkJcmV0ID0gdmZpb19wY2lfZm9yX2VhY2hf c2xvdF9vcl9idXModmRldi0+cGRldiwKLQkJCQkJCSAgICB2ZmlvX3BjaV9maWxsX2RldnMsCi0J CQkJCQkgICAgJmZpbGwsIHNsb3QpOwotCi0JCS8qCi0JCSAqIElmIGEgZGV2aWNlIHdhcyByZW1v dmVkIGJldHdlZW4gY291bnRpbmcgYW5kIGZpbGxpbmcsCi0JCSAqIHdlIG1heSBjb21lIHVwIHNo b3J0IG9mIGZpbGwubWF4LiAgSWYgYSBkZXZpY2Ugd2FzCi0JCSAqIGFkZGVkLCB3ZSdsbCBoYXZl IGEgcmV0dXJuIG9mIC1FQUdBSU4gYWJvdmUuCi0JCSAqLwotCQlpZiAoIXJldCkKLQkJCWhkci5j b3VudCA9IGZpbGwuY3VyOwotCi1yZXNldF9pbmZvX2V4aXQ6Ci0JCWlmIChjb3B5X3RvX3VzZXIo KHZvaWQgX191c2VyICopYXJnLCAmaGRyLCBtaW5zeikpCi0JCQlyZXQgPSAtRUZBVUxUOwotCi0J CWlmICghcmV0KSB7Ci0JCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKShhcmcgKyBt aW5zeiksIGRldmljZXMsCi0JCQkJCSBoZHIuY291bnQgKiBzaXplb2YoKmRldmljZXMpKSkKLQkJ CQlyZXQgPSAtRUZBVUxUOwotCQl9Ci0KLQkJa2ZyZWUoZGV2aWNlcyk7Ci0JCXJldHVybiByZXQ7 Ci0KLQl9IGVsc2UgaWYgKGNtZCA9PSBWRklPX0RFVklDRV9QQ0lfSE9UX1JFU0VUKSB7Ci0JCXN0 cnVjdCB2ZmlvX3BjaV9ob3RfcmVzZXQgaGRyOwotCQlpbnQzMl90ICpncm91cF9mZHM7Ci0JCXN0 cnVjdCB2ZmlvX3BjaV9ncm91cF9lbnRyeSAqZ3JvdXBzOwotCQlzdHJ1Y3QgdmZpb19wY2lfZ3Jv dXBfaW5mbyBpbmZvOwotCQlib29sIHNsb3QgPSBmYWxzZTsKLQkJaW50IGksIGNvdW50ID0gMCwg cmV0ID0gMDsKLQotCQltaW5zeiA9IG9mZnNldG9mZW5kKHN0cnVjdCB2ZmlvX3BjaV9ob3RfcmVz ZXQsIGNvdW50KTsKLQotCQlpZiAoY29weV9mcm9tX3VzZXIoJmhkciwgKHZvaWQgX191c2VyICop YXJnLCBtaW5zeikpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQlpZiAoaGRyLmFyZ3N6IDwgbWlu c3ogfHwgaGRyLmZsYWdzKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJLyogQ2FuIHdlIGRvIGEg c2xvdCBvciBidXMgcmVzZXQgb3IgbmVpdGhlcj8gKi8KLQkJaWYgKCFwY2lfcHJvYmVfcmVzZXRf c2xvdCh2ZGV2LT5wZGV2LT5zbG90KSkKLQkJCXNsb3QgPSB0cnVlOwotCQllbHNlIGlmIChwY2lf cHJvYmVfcmVzZXRfYnVzKHZkZXYtPnBkZXYtPmJ1cykpCi0JCQlyZXR1cm4gLUVOT0RFVjsKLQot CQkvKgotCQkgKiBXZSBjYW4ndCBsZXQgdXNlcnNwYWNlIGdpdmUgdXMgYW4gYXJiaXRyYXJpbHkg bGFyZ2UKLQkJICogYnVmZmVyIHRvIGNvcHksIHNvIHZlcmlmeSBob3cgbWFueSB3ZSB0aGluayB0 aGVyZQotCQkgKiBjb3VsZCBiZS4gIE5vdGUgZ3JvdXBzIGNhbiBoYXZlIG11bHRpcGxlIGRldmlj ZXMgc28KLQkJICogb25lIGdyb3VwIHBlciBkZXZpY2UgaXMgdGhlIG1heC4KLQkJICovCi0JCXJl dCA9IHZmaW9fcGNpX2Zvcl9lYWNoX3Nsb3Rfb3JfYnVzKHZkZXYtPnBkZXYsCi0JCQkJCQkgICAg dmZpb19wY2lfY291bnRfZGV2cywKLQkJCQkJCSAgICAmY291bnQsIHNsb3QpOwotCQlpZiAocmV0 KQotCQkJcmV0dXJuIHJldDsKLQotCQkvKiBTb21ld2hlcmUgYmV0d2VlbiAxIGFuZCBjb3VudCBp cyBPSyAqLwotCQlpZiAoIWhkci5jb3VudCB8fCBoZHIuY291bnQgPiBjb3VudCkKLQkJCXJldHVy biAtRUlOVkFMOwotCi0JCWdyb3VwX2ZkcyA9IGtjYWxsb2MoaGRyLmNvdW50LCBzaXplb2YoKmdy b3VwX2ZkcyksIEdGUF9LRVJORUwpOwotCQlncm91cHMgPSBrY2FsbG9jKGhkci5jb3VudCwgc2l6 ZW9mKCpncm91cHMpLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFncm91cF9mZHMgfHwgIWdyb3Vwcykg ewotCQkJa2ZyZWUoZ3JvdXBfZmRzKTsKLQkJCWtmcmVlKGdyb3Vwcyk7Ci0JCQlyZXR1cm4gLUVO T01FTTsKLQkJfQotCi0JCWlmIChjb3B5X2Zyb21fdXNlcihncm91cF9mZHMsICh2b2lkIF9fdXNl ciAqKShhcmcgKyBtaW5zeiksCi0JCQkJICAgaGRyLmNvdW50ICogc2l6ZW9mKCpncm91cF9mZHMp KSkgewotCQkJa2ZyZWUoZ3JvdXBfZmRzKTsKLQkJCWtmcmVlKGdyb3Vwcyk7Ci0JCQlyZXR1cm4g LUVGQVVMVDsKLQkJfQotCi0JCS8qCi0JCSAqIEZvciBlYWNoIGdyb3VwX2ZkLCBnZXQgdGhlIGdy b3VwIHRocm91Z2ggdGhlIHZmaW8gZXh0ZXJuYWwKLQkJICogdXNlciBpbnRlcmZhY2UgYW5kIHN0 b3JlIHRoZSBncm91cCBhbmQgaW9tbXUgSUQuICBUaGlzCi0JCSAqIGVuc3VyZXMgdGhlIGdyb3Vw IGlzIGhlbGQgYWNyb3NzIHRoZSByZXNldC4KLQkJICovCi0JCWZvciAoaSA9IDA7IGkgPCBoZHIu Y291bnQ7IGkrKykgewotCQkJc3RydWN0IHZmaW9fZ3JvdXAgKmdyb3VwOwotCQkJc3RydWN0IGZk IGYgPSBmZGdldChncm91cF9mZHNbaV0pOwotCQkJaWYgKCFmLmZpbGUpIHsKLQkJCQlyZXQgPSAt RUJBREY7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWdyb3VwID0gdmZpb19ncm91cF9nZXRfZXh0 ZXJuYWxfdXNlcihmLmZpbGUpOwotCQkJZmRwdXQoZik7Ci0JCQlpZiAoSVNfRVJSKGdyb3VwKSkg ewotCQkJCXJldCA9IFBUUl9FUlIoZ3JvdXApOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlncm91 cHNbaV0uZ3JvdXAgPSBncm91cDsKLQkJCWdyb3Vwc1tpXS5pZCA9IHZmaW9fZXh0ZXJuYWxfdXNl cl9pb21tdV9pZChncm91cCk7Ci0JCX0KLQotCQlrZnJlZShncm91cF9mZHMpOwotCi0JCS8qIHJl bGVhc2UgcmVmZXJlbmNlIHRvIGdyb3VwcyBvbiBlcnJvciAqLwotCQlpZiAocmV0KQotCQkJZ290 byBob3RfcmVzZXRfcmVsZWFzZTsKLQotCQlpbmZvLmNvdW50ID0gaGRyLmNvdW50OwotCQlpbmZv Lmdyb3VwcyA9IGdyb3VwczsKLQotCQkvKgotCQkgKiBUZXN0IHdoZXRoZXIgYWxsIHRoZSBhZmZl Y3RlZCBkZXZpY2VzIGFyZSBjb250YWluZWQKLQkJICogYnkgdGhlIHNldCBvZiBncm91cHMgcHJv dmlkZWQgYnkgdGhlIHVzZXIuCi0JCSAqLwotCQlyZXQgPSB2ZmlvX3BjaV9mb3JfZWFjaF9zbG90 X29yX2J1cyh2ZGV2LT5wZGV2LAotCQkJCQkJICAgIHZmaW9fcGNpX3ZhbGlkYXRlX2RldnMsCi0J CQkJCQkgICAgJmluZm8sIHNsb3QpOwotCQlpZiAoIXJldCkKLQkJCS8qIFVzZXIgaGFzIGFjY2Vz cywgZG8gdGhlIHJlc2V0ICovCi0JCQlyZXQgPSBwY2lfcmVzZXRfYnVzKHZkZXYtPnBkZXYpOwot Ci1ob3RfcmVzZXRfcmVsZWFzZToKLQkJZm9yIChpLS07IGkgPj0gMDsgaS0tKQotCQkJdmZpb19n cm91cF9wdXRfZXh0ZXJuYWxfdXNlcihncm91cHNbaV0uZ3JvdXApOwotCi0JCWtmcmVlKGdyb3Vw cyk7Ci0JCXJldHVybiByZXQ7Ci0JfSBlbHNlIGlmIChjbWQgPT0gVkZJT19ERVZJQ0VfSU9FVkVO VEZEKSB7Ci0JCXN0cnVjdCB2ZmlvX2RldmljZV9pb2V2ZW50ZmQgaW9ldmVudGZkOwotCQlpbnQg Y291bnQ7Ci0KLQkJbWluc3ogPSBvZmZzZXRvZmVuZChzdHJ1Y3QgdmZpb19kZXZpY2VfaW9ldmVu dGZkLCBmZCk7Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZpb2V2ZW50ZmQsICh2b2lkIF9fdXNl ciAqKWFyZywgbWluc3opKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJaWYgKGlvZXZlbnRmZC5h cmdzeiA8IG1pbnN6KQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJaWYgKGlvZXZlbnRmZC5mbGFn cyAmIH5WRklPX0RFVklDRV9JT0VWRU5URkRfU0laRV9NQVNLKQotCQkJcmV0dXJuIC1FSU5WQUw7 Ci0KLQkJY291bnQgPSBpb2V2ZW50ZmQuZmxhZ3MgJiBWRklPX0RFVklDRV9JT0VWRU5URkRfU0la RV9NQVNLOwotCi0JCWlmIChod2VpZ2h0OChjb3VudCkgIT0gMSB8fCBpb2V2ZW50ZmQuZmQgPCAt MSkKLQkJCXJldHVybiAtRUlOVkFMOwotCi0JCXJldHVybiB2ZmlvX3BjaV9pb2V2ZW50ZmQodmRl diwgaW9ldmVudGZkLm9mZnNldCwKLQkJCQkJICBpb2V2ZW50ZmQuZGF0YSwgY291bnQsIGlvZXZl bnRmZC5mZCk7Ci0JfQotCi0JcmV0dXJuIC1FTk9UVFk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHZm aW9fcGNpX3J3KHZvaWQgKmRldmljZV9kYXRhLCBjaGFyIF9fdXNlciAqYnVmLAotCQkJICAgc2l6 ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MsIGJvb2wgaXN3cml0ZSkKLXsKLQl1bnNpZ25lZCBpbnQg aW5kZXggPSBWRklPX1BDSV9PRkZTRVRfVE9fSU5ERVgoKnBwb3MpOwotCXN0cnVjdCB2ZmlvX3Bj aV9kZXZpY2UgKnZkZXYgPSBkZXZpY2VfZGF0YTsKLQotCWlmIChpbmRleCA+PSBWRklPX1BDSV9O VU1fUkVHSU9OUyArIHZkZXYtPm51bV9yZWdpb25zKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXN3 aXRjaCAoaW5kZXgpIHsKLQljYXNlIFZGSU9fUENJX0NPTkZJR19SRUdJT05fSU5ERVg6Ci0JCXJl dHVybiB2ZmlvX3BjaV9jb25maWdfcncodmRldiwgYnVmLCBjb3VudCwgcHBvcywgaXN3cml0ZSk7 Ci0KLQljYXNlIFZGSU9fUENJX1JPTV9SRUdJT05fSU5ERVg6Ci0JCWlmIChpc3dyaXRlKQotCQkJ cmV0dXJuIC1FSU5WQUw7Ci0JCXJldHVybiB2ZmlvX3BjaV9iYXJfcncodmRldiwgYnVmLCBjb3Vu dCwgcHBvcywgZmFsc2UpOwotCi0JY2FzZSBWRklPX1BDSV9CQVIwX1JFR0lPTl9JTkRFWCAuLi4g VkZJT19QQ0lfQkFSNV9SRUdJT05fSU5ERVg6Ci0JCXJldHVybiB2ZmlvX3BjaV9iYXJfcncodmRl diwgYnVmLCBjb3VudCwgcHBvcywgaXN3cml0ZSk7Ci0KLQljYXNlIFZGSU9fUENJX1ZHQV9SRUdJ T05fSU5ERVg6Ci0JCXJldHVybiB2ZmlvX3BjaV92Z2FfcncodmRldiwgYnVmLCBjb3VudCwgcHBv cywgaXN3cml0ZSk7Ci0JZGVmYXVsdDoKLQkJaW5kZXggLT0gVkZJT19QQ0lfTlVNX1JFR0lPTlM7 Ci0JCXJldHVybiB2ZGV2LT5yZWdpb25baW5kZXhdLm9wcy0+cncodmRldiwgYnVmLAotCQkJCQkJ ICAgY291bnQsIHBwb3MsIGlzd3JpdGUpOwotCX0KLQotCXJldHVybiAtRUlOVkFMOwotfQotCi1z dGF0aWMgc3NpemVfdCB2ZmlvX3BjaV9yZWFkKHZvaWQgKmRldmljZV9kYXRhLCBjaGFyIF9fdXNl ciAqYnVmLAotCQkJICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLQlpZiAoIWNv dW50KQotCQlyZXR1cm4gMDsKLQotCXJldHVybiB2ZmlvX3BjaV9ydyhkZXZpY2VfZGF0YSwgYnVm LCBjb3VudCwgcHBvcywgZmFsc2UpOwotfQotCi1zdGF0aWMgc3NpemVfdCB2ZmlvX3BjaV93cml0 ZSh2b2lkICpkZXZpY2VfZGF0YSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKLQkJCSAgICAgIHNp emVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQotewotCWlmICghY291bnQpCi0JCXJldHVybiAwOwot Ci0JcmV0dXJuIHZmaW9fcGNpX3J3KGRldmljZV9kYXRhLCAoY2hhciBfX3VzZXIgKilidWYsIGNv dW50LCBwcG9zLCB0cnVlKTsKLX0KLQotc3RhdGljIGludCB2ZmlvX3BjaV9tbWFwKHZvaWQgKmRl dmljZV9kYXRhLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKLXsKLQlzdHJ1Y3QgdmZpb19w Y2lfZGV2aWNlICp2ZGV2ID0gZGV2aWNlX2RhdGE7Ci0Jc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB2 ZGV2LT5wZGV2OwotCXVuc2lnbmVkIGludCBpbmRleDsKLQl1NjQgcGh5c19sZW4sIHJlcV9sZW4s IHBnb2ZmLCByZXFfc3RhcnQ7Ci0JaW50IHJldDsKLQotCWluZGV4ID0gdm1hLT52bV9wZ29mZiA+ PiAoVkZJT19QQ0lfT0ZGU0VUX1NISUZUIC0gUEFHRV9TSElGVCk7Ci0KLQlpZiAodm1hLT52bV9l bmQgPCB2bWEtPnZtX3N0YXJ0KQotCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoKHZtYS0+dm1fZmxh Z3MgJiBWTV9TSEFSRUQpID09IDApCi0JCXJldHVybiAtRUlOVkFMOwotCWlmIChpbmRleCA+PSBW RklPX1BDSV9OVU1fUkVHSU9OUykgewotCQlpbnQgcmVnbnVtID0gaW5kZXggLSBWRklPX1BDSV9O VU1fUkVHSU9OUzsKLQkJc3RydWN0IHZmaW9fcGNpX3JlZ2lvbiAqcmVnaW9uID0gdmRldi0+cmVn aW9uICsgcmVnbnVtOwotCi0JCWlmIChyZWdpb24gJiYgcmVnaW9uLT5vcHMgJiYgcmVnaW9uLT5v cHMtPm1tYXAgJiYKLQkJICAgIChyZWdpb24tPmZsYWdzICYgVkZJT19SRUdJT05fSU5GT19GTEFH X01NQVApKQotCQkJcmV0dXJuIHJlZ2lvbi0+b3BzLT5tbWFwKHZkZXYsIHJlZ2lvbiwgdm1hKTsK LQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWlmIChpbmRleCA+PSBWRklPX1BDSV9ST01fUkVHSU9O X0lOREVYKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoIXZkZXYtPmJhcl9tbWFwX3N1cHBvcnRl ZFtpbmRleF0pCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcGh5c19sZW4gPSBQQUdFX0FMSUdOKHBj aV9yZXNvdXJjZV9sZW4ocGRldiwgaW5kZXgpKTsKLQlyZXFfbGVuID0gdm1hLT52bV9lbmQgLSB2 bWEtPnZtX3N0YXJ0OwotCXBnb2ZmID0gdm1hLT52bV9wZ29mZiAmCi0JCSgoMVUgPDwgKFZGSU9f UENJX09GRlNFVF9TSElGVCAtIFBBR0VfU0hJRlQpKSAtIDEpOwotCXJlcV9zdGFydCA9IHBnb2Zm IDw8IFBBR0VfU0hJRlQ7Ci0KLQlpZiAocmVxX3N0YXJ0ICsgcmVxX2xlbiA+IHBoeXNfbGVuKQot CQlyZXR1cm4gLUVJTlZBTDsKLQotCS8qCi0JICogRXZlbiB0aG91Z2ggd2UgZG9uJ3QgbWFrZSB1 c2Ugb2YgdGhlIGJhcm1hcCBmb3IgdGhlIG1tYXAsCi0JICogd2UgbmVlZCB0byByZXF1ZXN0IHRo ZSByZWdpb24gYW5kIHRoZSBiYXJtYXAgdHJhY2tzIHRoYXQuCi0JICovCi0JaWYgKCF2ZGV2LT5i YXJtYXBbaW5kZXhdKSB7Ci0JCXJldCA9IHBjaV9yZXF1ZXN0X3NlbGVjdGVkX3JlZ2lvbnMocGRl diwKLQkJCQkJCSAgIDEgPDwgaW5kZXgsICJ2ZmlvLXBjaSIpOwotCQlpZiAocmV0KQotCQkJcmV0 dXJuIHJldDsKLQotCQl2ZGV2LT5iYXJtYXBbaW5kZXhdID0gcGNpX2lvbWFwKHBkZXYsIGluZGV4 LCAwKTsKLQkJaWYgKCF2ZGV2LT5iYXJtYXBbaW5kZXhdKSB7Ci0JCQlwY2lfcmVsZWFzZV9zZWxl Y3RlZF9yZWdpb25zKHBkZXYsIDEgPDwgaW5kZXgpOwotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0K LQl9Ci0KLQl2bWEtPnZtX3ByaXZhdGVfZGF0YSA9IHZkZXY7Ci0Jdm1hLT52bV9wYWdlX3Byb3Qg PSBwZ3Byb3Rfbm9uY2FjaGVkKHZtYS0+dm1fcGFnZV9wcm90KTsKLQl2bWEtPnZtX3Bnb2ZmID0g KHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCBpbmRleCkgPj4gUEFHRV9TSElGVCkgKyBwZ29mZjsK LQotCXJldHVybiByZW1hcF9wZm5fcmFuZ2Uodm1hLCB2bWEtPnZtX3N0YXJ0LCB2bWEtPnZtX3Bn b2ZmLAotCQkJICAgICAgIHJlcV9sZW4sIHZtYS0+dm1fcGFnZV9wcm90KTsKLX0KLQotc3RhdGlj IHZvaWQgdmZpb19wY2lfcmVxdWVzdCh2b2lkICpkZXZpY2VfZGF0YSwgdW5zaWduZWQgaW50IGNv dW50KQotewotCXN0cnVjdCB2ZmlvX3BjaV9kZXZpY2UgKnZkZXYgPSBkZXZpY2VfZGF0YTsKLQot CW11dGV4X2xvY2soJnZkZXYtPmlnYXRlKTsKLQotCWlmICh2ZGV2LT5yZXFfdHJpZ2dlcikgewot CQlpZiAoIShjb3VudCAlIDEwKSkKLQkJCWRldl9ub3RpY2VfcmF0ZWxpbWl0ZWQoJnZkZXYtPnBk ZXYtPmRldiwKLQkJCQkiUmVsYXlpbmcgZGV2aWNlIHJlcXVlc3QgdG8gdXNlciAoIyV1KVxuIiwK LQkJCQljb3VudCk7Ci0JCWV2ZW50ZmRfc2lnbmFsKHZkZXYtPnJlcV90cmlnZ2VyLCAxKTsKLQl9 IGVsc2UgaWYgKGNvdW50ID09IDApIHsKLQkJZGV2X3dhcm4oJnZkZXYtPnBkZXYtPmRldiwKLQkJ CSJObyBkZXZpY2UgcmVxdWVzdCBjaGFubmVsIHJlZ2lzdGVyZWQsIGJsb2NrZWQgdW50aWwgcmVs ZWFzZWQgYnkgdXNlclxuIik7Ci0JfQotCi0JbXV0ZXhfdW5sb2NrKCZ2ZGV2LT5pZ2F0ZSk7Ci19 Ci0KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdmZpb19kZXZpY2Vfb3BzIHZmaW9fcGNpX29wcyA9IHsK IAkubmFtZQkJPSAidmZpby1wY2kiLAogCS5vcGVuCQk9IHZmaW9fcGNpX29wZW4sCkBAIC0xMjgz LDggKzEwOCw2IEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdmZpb19kZXZpY2Vfb3BzIHZmaW9fcGNp X29wcyA9IHsKIAkucmVxdWVzdAk9IHZmaW9fcGNpX3JlcXVlc3QsCiB9OwogCi1zdGF0aWMgaW50 IHZmaW9fcGNpX3JlZmxja19hdHRhY2goc3RydWN0IHZmaW9fcGNpX2RldmljZSAqdmRldik7Ci1z dGF0aWMgdm9pZCB2ZmlvX3BjaV9yZWZsY2tfcHV0KHN0cnVjdCB2ZmlvX3BjaV9yZWZsY2sgKnJl Zmxjayk7CiAKIHN0YXRpYyBpbnQgdmZpb19wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYs IGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKIHsKQEAgLTEzMjQsNiArMTQ3LDExIEBA IHN0YXRpYyBpbnQgdmZpb19wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0 cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKIAlzcGluX2xvY2tfaW5pdCgmdmRldi0+aXJxbG9jayk7 CiAJbXV0ZXhfaW5pdCgmdmRldi0+aW9ldmVudGZkc19sb2NrKTsKIAlJTklUX0xJU1RfSEVBRCgm dmRldi0+aW9ldmVudGZkc19saXN0KTsKKwl2ZGV2LT5ub2ludHhtYXNrID0gbm9pbnR4bWFzazsK KyNpZmRlZiBDT05GSUdfVkZJT19QQ0lfVkdBCisJdmRldi0+ZGlzYWJsZV92Z2EgPSBkaXNhYmxl X3ZnYTsKKyNlbmRpZgorCXZkZXYtPmRpc2FibGVfaWRsZV9kMyA9IGRpc2FibGVfaWRsZV9kMzsK IAogCXJldCA9IHZmaW9fYWRkX2dyb3VwX2RldigmcGRldi0+ZGV2LCAmdmZpb19wY2lfb3BzLCB2 ZGV2KTsKIAlpZiAocmV0KSB7CkBAIC0xMzQwLDI3ICsxNjgsMTMgQEAgc3RhdGljIGludCB2Zmlv X3BjaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2Vf aWQgKmlkKQogCQlyZXR1cm4gcmV0OwogCX0KIAotCWlmICh2ZmlvX3BjaV9pc192Z2EocGRldikp IHsKLQkJdmdhX2NsaWVudF9yZWdpc3RlcihwZGV2LCB2ZGV2LCBOVUxMLCB2ZmlvX3BjaV9zZXRf dmdhX2RlY29kZSk7Ci0JCXZnYV9zZXRfbGVnYWN5X2RlY29kaW5nKHBkZXYsCi0JCQkJCXZmaW9f cGNpX3NldF92Z2FfZGVjb2RlKHZkZXYsIGZhbHNlKSk7Ci0JfQorCWlmICh2ZmlvX3BjaV9pc192 Z2EocGRldikpCisJCXZmaW9fcGNpX3ZnYV9wcm9iZSh2ZGV2KTsKIAogCXZmaW9fcGNpX3Byb2Jl X3Bvd2VyX3N0YXRlKHZkZXYpOwogCi0JaWYgKCFkaXNhYmxlX2lkbGVfZDMpIHsKLQkJLyoKLQkJ ICogcGNpLWNvcmUgc2V0cyB0aGUgZGV2aWNlIHBvd2VyIHN0YXRlIHRvIGFuIHVua25vd24gdmFs dWUgYXQKLQkJICogYm9vdHVwIGFuZCBhZnRlciBiZWluZyByZW1vdmVkIGZyb20gYSBkcml2ZXIu ICBUaGUgb25seQotCQkgKiB0cmFuc2l0aW9uIGl0IGFsbG93cyBmcm9tIHRoaXMgdW5rbm93biBz dGF0ZSBpcyB0byBEMCwgd2hpY2gKLQkJICogdHlwaWNhbGx5IGhhcHBlbnMgd2hlbiBhIGRyaXZl ciBjYWxscyBwY2lfZW5hYmxlX2RldmljZSgpLgotCQkgKiBXZSdyZSBub3QgcmVhZHkgdG8gZW5h YmxlIHRoZSBkZXZpY2UgeWV0LCBidXQgd2UgZG8gd2FudCB0bwotCQkgKiBiZSBhYmxlIHRvIGdl dCB0byBEMy4gIFRoZXJlZm9yZSBmaXJzdCBkbyBhIEQwIHRyYW5zaXRpb24KLQkJICogYmVmb3Jl IGdvaW5nIHRvIEQzLgotCQkgKi8KLQkJdmZpb19wY2lfc2V0X3Bvd2VyX3N0YXRlKHZkZXYsIFBD SV9EMCk7Ci0JCXZmaW9fcGNpX3NldF9wb3dlcl9zdGF0ZSh2ZGV2LCBQQ0lfRDNob3QpOwotCX0K KwlpZiAoIWRpc2FibGVfaWRsZV9kMykKKwkJdmZpb19wY2lfcHJvYmVfaWRsZV9kMyh2ZGV2KTsK IAogCXJldHVybiByZXQ7CiB9CkBAIC0xMzgzLDQ4ICsxOTcsMTQgQEAgc3RhdGljIHZvaWQgdmZp b19wY2lfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogCQl2ZmlvX3BjaV9zZXRfcG93ZXJf c3RhdGUodmRldiwgUENJX0QwKTsKIAogCWtmcmVlKHZkZXYtPnBtX3NhdmUpOwotCWtmcmVlKHZk ZXYpOwogCiAJaWYgKHZmaW9fcGNpX2lzX3ZnYShwZGV2KSkgewotCQl2Z2FfY2xpZW50X3JlZ2lz dGVyKHBkZXYsIE5VTEwsIE5VTEwsIE5VTEwpOwotCQl2Z2Ffc2V0X2xlZ2FjeV9kZWNvZGluZyhw ZGV2LAotCQkJCVZHQV9SU1JDX05PUk1BTF9JTyB8IFZHQV9SU1JDX05PUk1BTF9NRU0gfAotCQkJ CVZHQV9SU1JDX0xFR0FDWV9JTyB8IFZHQV9SU1JDX0xFR0FDWV9NRU0pOwotCX0KLX0KLQotc3Rh dGljIHBjaV9lcnNfcmVzdWx0X3QgdmZpb19wY2lfYWVyX2Vycl9kZXRlY3RlZChzdHJ1Y3QgcGNp X2RldiAqcGRldiwKLQkJCQkJCSAgcGNpX2NoYW5uZWxfc3RhdGVfdCBzdGF0ZSkKLXsKLQlzdHJ1 Y3QgdmZpb19wY2lfZGV2aWNlICp2ZGV2OwotCXN0cnVjdCB2ZmlvX2RldmljZSAqZGV2aWNlOwot Ci0JZGV2aWNlID0gdmZpb19kZXZpY2VfZ2V0X2Zyb21fZGV2KCZwZGV2LT5kZXYpOwotCWlmIChk ZXZpY2UgPT0gTlVMTCkKLQkJcmV0dXJuIFBDSV9FUlNfUkVTVUxUX0RJU0NPTk5FQ1Q7Ci0KLQl2 ZGV2ID0gdmZpb19kZXZpY2VfZGF0YShkZXZpY2UpOwotCWlmICh2ZGV2ID09IE5VTEwpIHsKLQkJ dmZpb19kZXZpY2VfcHV0KGRldmljZSk7Ci0JCXJldHVybiBQQ0lfRVJTX1JFU1VMVF9ESVNDT05O RUNUOworCQl2ZmlvX3BjaV92Z2FfcmVtb3ZlKHZkZXYpOwogCX0KIAotCW11dGV4X2xvY2soJnZk ZXYtPmlnYXRlKTsKLQotCWlmICh2ZGV2LT5lcnJfdHJpZ2dlcikKLQkJZXZlbnRmZF9zaWduYWwo dmRldi0+ZXJyX3RyaWdnZXIsIDEpOwotCi0JbXV0ZXhfdW5sb2NrKCZ2ZGV2LT5pZ2F0ZSk7Ci0K LQl2ZmlvX2RldmljZV9wdXQoZGV2aWNlKTsKLQotCXJldHVybiBQQ0lfRVJTX1JFU1VMVF9DQU5f UkVDT1ZFUjsKKwlrZnJlZSh2ZGV2KTsKIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZXJy b3JfaGFuZGxlcnMgdmZpb19lcnJfaGFuZGxlcnMgPSB7Ci0JLmVycm9yX2RldGVjdGVkID0gdmZp b19wY2lfYWVyX2Vycl9kZXRlY3RlZCwKLX07Ci0KIHN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciB2 ZmlvX3BjaV9kcml2ZXIgPSB7CiAJLm5hbWUJCT0gInZmaW8tcGNpIiwKIAkuaWRfdGFibGUJPSBO VUxMLCAvKiBvbmx5IGR5bmFtaWMgaWRzICovCkBAIC0xNDMzLDI0NCArMjEzLDEyIEBAIHN0YXRp YyBzdHJ1Y3QgcGNpX2RyaXZlciB2ZmlvX3BjaV9kcml2ZXIgPSB7CiAJLmVycl9oYW5kbGVyCT0g JnZmaW9fZXJyX2hhbmRsZXJzLAogfTsKIAotc3RhdGljIERFRklORV9NVVRFWChyZWZsY2tfbG9j ayk7Ci0KLXN0YXRpYyBzdHJ1Y3QgdmZpb19wY2lfcmVmbGNrICp2ZmlvX3BjaV9yZWZsY2tfYWxs b2Modm9pZCkKLXsKLQlzdHJ1Y3QgdmZpb19wY2lfcmVmbGNrICpyZWZsY2s7Ci0KLQlyZWZsY2sg PSBremFsbG9jKHNpemVvZigqcmVmbGNrKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFyZWZsY2spCi0J CXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwotCi0Ja3JlZl9pbml0KCZyZWZsY2stPmtyZWYpOwot CW11dGV4X2luaXQoJnJlZmxjay0+bG9jayk7Ci0KLQlyZXR1cm4gcmVmbGNrOwotfQotCi1zdGF0 aWMgdm9pZCB2ZmlvX3BjaV9yZWZsY2tfZ2V0KHN0cnVjdCB2ZmlvX3BjaV9yZWZsY2sgKnJlZmxj aykKLXsKLQlrcmVmX2dldCgmcmVmbGNrLT5rcmVmKTsKLX0KLQotc3RhdGljIGludCB2ZmlvX3Bj aV9yZWZsY2tfZmluZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1 Y3QgdmZpb19wY2lfcmVmbGNrICoqcHJlZmxjayA9IGRhdGE7Ci0Jc3RydWN0IHZmaW9fZGV2aWNl ICpkZXZpY2U7Ci0Jc3RydWN0IHZmaW9fcGNpX2RldmljZSAqdmRldjsKLQotCWRldmljZSA9IHZm aW9fZGV2aWNlX2dldF9mcm9tX2RldigmcGRldi0+ZGV2KTsKLQlpZiAoIWRldmljZSkKLQkJcmV0 dXJuIDA7Ci0KLQlpZiAocGNpX2Rldl9kcml2ZXIocGRldikgIT0gJnZmaW9fcGNpX2RyaXZlcikg ewotCQl2ZmlvX2RldmljZV9wdXQoZGV2aWNlKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JdmRldiA9 IHZmaW9fZGV2aWNlX2RhdGEoZGV2aWNlKTsKLQotCWlmICh2ZGV2LT5yZWZsY2spIHsKLQkJdmZp b19wY2lfcmVmbGNrX2dldCh2ZGV2LT5yZWZsY2spOwotCQkqcHJlZmxjayA9IHZkZXYtPnJlZmxj azsKLQkJdmZpb19kZXZpY2VfcHV0KGRldmljZSk7Ci0JCXJldHVybiAxOwotCX0KLQotCXZmaW9f ZGV2aWNlX3B1dChkZXZpY2UpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHZmaW9fcGNp X3JlZmxja19hdHRhY2goc3RydWN0IHZmaW9fcGNpX2RldmljZSAqdmRldikKLXsKLQlib29sIHNs b3QgPSAhcGNpX3Byb2JlX3Jlc2V0X3Nsb3QodmRldi0+cGRldi0+c2xvdCk7Ci0KLQltdXRleF9s b2NrKCZyZWZsY2tfbG9jayk7Ci0KLQlpZiAocGNpX2lzX3Jvb3RfYnVzKHZkZXYtPnBkZXYtPmJ1 cykgfHwKLQkgICAgdmZpb19wY2lfZm9yX2VhY2hfc2xvdF9vcl9idXModmRldi0+cGRldiwgdmZp b19wY2lfcmVmbGNrX2ZpbmQsCi0JCQkJCSAgJnZkZXYtPnJlZmxjaywgc2xvdCkgPD0gMCkKLQkJ dmRldi0+cmVmbGNrID0gdmZpb19wY2lfcmVmbGNrX2FsbG9jKCk7Ci0KLQltdXRleF91bmxvY2so JnJlZmxja19sb2NrKTsKLQotCXJldHVybiBQVFJfRVJSX09SX1pFUk8odmRldi0+cmVmbGNrKTsK LX0KLQotc3RhdGljIHZvaWQgdmZpb19wY2lfcmVmbGNrX3JlbGVhc2Uoc3RydWN0IGtyZWYgKmty ZWYpCi17Ci0Jc3RydWN0IHZmaW9fcGNpX3JlZmxjayAqcmVmbGNrID0gY29udGFpbmVyX29mKGty ZWYsCi0JCQkJCQkgICAgICBzdHJ1Y3QgdmZpb19wY2lfcmVmbGNrLAotCQkJCQkJICAgICAga3Jl Zik7Ci0KLQlrZnJlZShyZWZsY2spOwotCW11dGV4X3VubG9jaygmcmVmbGNrX2xvY2spOwotfQot Ci1zdGF0aWMgdm9pZCB2ZmlvX3BjaV9yZWZsY2tfcHV0KHN0cnVjdCB2ZmlvX3BjaV9yZWZsY2sg KnJlZmxjaykKLXsKLQlrcmVmX3B1dF9tdXRleCgmcmVmbGNrLT5rcmVmLCB2ZmlvX3BjaV9yZWZs Y2tfcmVsZWFzZSwgJnJlZmxja19sb2NrKTsKLX0KLQotc3RydWN0IHZmaW9fZGV2aWNlcyB7Ci0J c3RydWN0IHZmaW9fZGV2aWNlICoqZGV2aWNlczsKLQlpbnQgY3VyX2luZGV4OwotCWludCBtYXhf aW5kZXg7Ci19OwotCi1zdGF0aWMgaW50IHZmaW9fcGNpX2dldF91bnVzZWRfZGV2cyhzdHJ1Y3Qg cGNpX2RldiAqcGRldiwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgdmZpb19kZXZpY2VzICpkZXZz ID0gZGF0YTsKLQlzdHJ1Y3QgdmZpb19kZXZpY2UgKmRldmljZTsKLQlzdHJ1Y3QgdmZpb19wY2lf ZGV2aWNlICp2ZGV2OwotCi0JaWYgKGRldnMtPmN1cl9pbmRleCA9PSBkZXZzLT5tYXhfaW5kZXgp Ci0JCXJldHVybiAtRU5PU1BDOwotCi0JZGV2aWNlID0gdmZpb19kZXZpY2VfZ2V0X2Zyb21fZGV2 KCZwZGV2LT5kZXYpOwotCWlmICghZGV2aWNlKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChw Y2lfZGV2X2RyaXZlcihwZGV2KSAhPSAmdmZpb19wY2lfZHJpdmVyKSB7Ci0JCXZmaW9fZGV2aWNl X3B1dChkZXZpY2UpOwotCQlyZXR1cm4gLUVCVVNZOwotCX0KLQotCXZkZXYgPSB2ZmlvX2Rldmlj ZV9kYXRhKGRldmljZSk7Ci0KLQkvKiBGYXVsdCBpZiB0aGUgZGV2aWNlIGlzIG5vdCB1bnVzZWQg Ki8KLQlpZiAodmRldi0+cmVmY250KSB7Ci0JCXZmaW9fZGV2aWNlX3B1dChkZXZpY2UpOwotCQly ZXR1cm4gLUVCVVNZOwotCX0KLQotCWRldnMtPmRldmljZXNbZGV2cy0+Y3VyX2luZGV4KytdID0g ZGV2aWNlOwotCXJldHVybiAwOwotfQotCi0vKgotICogSWYgYSBidXMgb3Igc2xvdCByZXNldCBp cyBhdmFpbGFibGUgZm9yIHRoZSBwcm92aWRlZCBkZXZpY2UgYW5kOgotICogIC0gQWxsIG9mIHRo ZSBkZXZpY2VzIGFmZmVjdGVkIGJ5IHRoYXQgYnVzIG9yIHNsb3QgcmVzZXQgYXJlIHVudXNlZAot ICogICAgKCFyZWZjbnQpCi0gKiAgLSBBdCBsZWFzdCBvbmUgb2YgdGhlIGFmZmVjdGVkIGRldmlj ZXMgaXMgbWFya2VkIGRpcnR5IHZpYQotICogICAgbmVlZHNfcmVzZXQgKHN1Y2ggYXMgYnkgbGFj ayBvZiBGTFIgc3VwcG9ydCkKLSAqIFRoZW4gYXR0ZW1wdCB0byBwZXJmb3JtIHRoYXQgYnVzIG9y IHNsb3QgcmVzZXQuICBDYWxsZXJzIGFyZSByZXF1aXJlZAotICogdG8gaG9sZCB2ZGV2LT5yZWZs Y2stPmxvY2ssIHByb3RlY3RpbmcgdGhlIGJ1cy9zbG90IHJlc2V0IGdyb3VwIGZyb20KLSAqIGNv bmN1cnJlbnQgb3BlbnMuICBBIHZmaW9fZGV2aWNlIHJlZmVyZW5jZSBpcyBhY3F1aXJlZCBmb3Ig ZWFjaCBkZXZpY2UKLSAqIHRvIHByZXZlbnQgdW5iaW5kcyBkdXJpbmcgdGhlIHJlc2V0IG9wZXJh dGlvbi4KLSAqCi0gKiBOQjogdmZpby1jb3JlIGNvbnNpZGVycyBhIGdyb3VwIHRvIGJlIHZpYWJs ZSBldmVuIGlmIHNvbWUgZGV2aWNlcyBhcmUKLSAqIGJvdW5kIHRvIGRyaXZlcnMgbGlrZSBwY2kt c3R1YiBvciBwY2llcG9ydC4gIEhlcmUgd2UgcmVxdWlyZSBhbGwgZGV2aWNlcwotICogdG8gYmUg Ym91bmQgdG8gdmZpb19wY2kgc2luY2UgdGhhdCdzIHRoZSBvbmx5IHdheSB3ZSBjYW4gYmUgc3Vy ZSB0aGV5Ci0gKiBzdGF5IHB1dC4KLSAqLwotc3RhdGljIHZvaWQgdmZpb19wY2lfdHJ5X2J1c19y ZXNldChzdHJ1Y3QgdmZpb19wY2lfZGV2aWNlICp2ZGV2KQotewotCXN0cnVjdCB2ZmlvX2Rldmlj ZXMgZGV2cyA9IHsgLmN1cl9pbmRleCA9IDAgfTsKLQlpbnQgaSA9IDAsIHJldCA9IC1FSU5WQUw7 Ci0JYm9vbCBzbG90ID0gZmFsc2U7Ci0Jc3RydWN0IHZmaW9fcGNpX2RldmljZSAqdG1wOwotCi0J aWYgKCFwY2lfcHJvYmVfcmVzZXRfc2xvdCh2ZGV2LT5wZGV2LT5zbG90KSkKLQkJc2xvdCA9IHRy dWU7Ci0JZWxzZSBpZiAocGNpX3Byb2JlX3Jlc2V0X2J1cyh2ZGV2LT5wZGV2LT5idXMpKQotCQly ZXR1cm47Ci0KLQlpZiAodmZpb19wY2lfZm9yX2VhY2hfc2xvdF9vcl9idXModmRldi0+cGRldiwg dmZpb19wY2lfY291bnRfZGV2cywKLQkJCQkJICAmaSwgc2xvdCkgfHwgIWkpCi0JCXJldHVybjsK LQotCWRldnMubWF4X2luZGV4ID0gaTsKLQlkZXZzLmRldmljZXMgPSBrY2FsbG9jKGksIHNpemVv ZihzdHJ1Y3QgdmZpb19kZXZpY2UgKiksIEdGUF9LRVJORUwpOwotCWlmICghZGV2cy5kZXZpY2Vz KQotCQlyZXR1cm47Ci0KLQlpZiAodmZpb19wY2lfZm9yX2VhY2hfc2xvdF9vcl9idXModmRldi0+ cGRldiwKLQkJCQkJICB2ZmlvX3BjaV9nZXRfdW51c2VkX2RldnMsCi0JCQkJCSAgJmRldnMsIHNs b3QpKQotCQlnb3RvIHB1dF9kZXZzOwotCi0JLyogRG9lcyBhdCBsZWFzdCBvbmUgbmVlZCBhIHJl c2V0PyAqLwotCWZvciAoaSA9IDA7IGkgPCBkZXZzLmN1cl9pbmRleDsgaSsrKSB7Ci0JCXRtcCA9 IHZmaW9fZGV2aWNlX2RhdGEoZGV2cy5kZXZpY2VzW2ldKTsKLQkJaWYgKHRtcC0+bmVlZHNfcmVz ZXQpIHsKLQkJCXJldCA9IHBjaV9yZXNldF9idXModmRldi0+cGRldik7Ci0JCQlicmVhazsKLQkJ fQotCX0KLQotcHV0X2RldnM6Ci0JZm9yIChpID0gMDsgaSA8IGRldnMuY3VyX2luZGV4OyBpKysp IHsKLQkJdG1wID0gdmZpb19kZXZpY2VfZGF0YShkZXZzLmRldmljZXNbaV0pOwotCi0JCS8qCi0J CSAqIElmIHJlc2V0IHdhcyBzdWNjZXNzZnVsLCBhZmZlY3RlZCBkZXZpY2VzIG5vIGxvbmdlciBu ZWVkCi0JCSAqIGEgcmVzZXQgYW5kIHdlIHNob3VsZCByZXR1cm4gYWxsIHRoZSBjb2xsYXRlcmFs IGRldmljZXMKLQkJICogdG8gbG93IHBvd2VyLiAgSWYgbm90IHN1Y2Nlc3NmdWwsIHdlIGVpdGhl ciBkaWRuJ3QgcmVzZXQKLQkJICogdGhlIGJ1cyBvciB0aW1lZCBvdXQgd2FpdGluZyBmb3IgaXQs IHNvIGxldCdzIG5vdCB0b3VjaAotCQkgKiB0aGUgcG93ZXIgc3RhdGUuCi0JCSAqLwotCQlpZiAo IXJldCkgewotCQkJdG1wLT5uZWVkc19yZXNldCA9IGZhbHNlOwotCi0JCQlpZiAodG1wICE9IHZk ZXYgJiYgIWRpc2FibGVfaWRsZV9kMykKLQkJCQl2ZmlvX3BjaV9zZXRfcG93ZXJfc3RhdGUodG1w LCBQQ0lfRDNob3QpOwotCQl9Ci0KLQkJdmZpb19kZXZpY2VfcHV0KGRldnMuZGV2aWNlc1tpXSk7 Ci0JfQotCi0Ja2ZyZWUoZGV2cy5kZXZpY2VzKTsKLX0KLQogc3RhdGljIHZvaWQgX19leGl0IHZm aW9fcGNpX2NsZWFudXAodm9pZCkKIHsKIAlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnZmaW9fcGNp X2RyaXZlcik7CiAJdmZpb19wY2lfdW5pbml0X3Blcm1fYml0cygpOwogfQogCi1zdGF0aWMgdm9p ZCBfX2luaXQgdmZpb19wY2lfZmlsbF9pZHModm9pZCkKLXsKLQljaGFyICpwLCAqaWQ7Ci0JaW50 IHJjOwotCi0JLyogbm8gaWRzIHBhc3NlZCBhY3R1YWxseSAqLwotCWlmIChpZHNbMF0gPT0gJ1ww JykKLQkJcmV0dXJuOwotCi0JLyogYWRkIGlkcyBzcGVjaWZpZWQgaW4gdGhlIG1vZHVsZSBwYXJh bWV0ZXIgKi8KLQlwID0gaWRzOwotCXdoaWxlICgoaWQgPSBzdHJzZXAoJnAsICIsIikpKSB7Ci0J CXVuc2lnbmVkIGludCB2ZW5kb3IsIGRldmljZSwgc3VidmVuZG9yID0gUENJX0FOWV9JRCwKLQkJ CXN1YmRldmljZSA9IFBDSV9BTllfSUQsIGNsYXNzID0gMCwgY2xhc3NfbWFzayA9IDA7Ci0JCWlu dCBmaWVsZHM7Ci0KLQkJaWYgKCFzdHJsZW4oaWQpKQotCQkJY29udGludWU7Ci0KLQkJZmllbGRz ID0gc3NjYW5mKGlkLCAiJXg6JXg6JXg6JXg6JXg6JXgiLAotCQkJCSZ2ZW5kb3IsICZkZXZpY2Us ICZzdWJ2ZW5kb3IsICZzdWJkZXZpY2UsCi0JCQkJJmNsYXNzLCAmY2xhc3NfbWFzayk7Ci0KLQkJ aWYgKGZpZWxkcyA8IDIpIHsKLQkJCXByX3dhcm4oImludmFsaWQgaWQgc3RyaW5nIFwiJXNcIlxu IiwgaWQpOwotCQkJY29udGludWU7Ci0JCX0KLQotCQlyYyA9IHBjaV9hZGRfZHluaWQoJnZmaW9f cGNpX2RyaXZlciwgdmVuZG9yLCBkZXZpY2UsCi0JCQkJICAgc3VidmVuZG9yLCBzdWJkZXZpY2Us IGNsYXNzLCBjbGFzc19tYXNrLCAwKTsKLQkJaWYgKHJjKQotCQkJcHJfd2FybigiZmFpbGVkIHRv IGFkZCBkeW5hbWljIGlkIFslMDR4OiUwNHhbJTA0eDolMDR4XV0gY2xhc3MgJSMwOHgvJTA4eCAo JWQpXG4iLAotCQkJCXZlbmRvciwgZGV2aWNlLCBzdWJ2ZW5kb3IsIHN1YmRldmljZSwKLQkJCQlj bGFzcywgY2xhc3NfbWFzaywgcmMpOwotCQllbHNlCi0JCQlwcl9pbmZvKCJhZGQgWyUwNHg6JTA0 eFslMDR4OiUwNHhdXSBjbGFzcyAlIzA4eC8lMDh4XG4iLAotCQkJCXZlbmRvciwgZGV2aWNlLCBz dWJ2ZW5kb3IsIHN1YmRldmljZSwKLQkJCQljbGFzcywgY2xhc3NfbWFzayk7Ci0JfQotfQotCiBz dGF0aWMgaW50IF9faW5pdCB2ZmlvX3BjaV9pbml0KHZvaWQpCiB7CiAJaW50IHJldDsKQEAgLTE2 ODUsNyArMjMzLDcgQEAgc3RhdGljIGludCBfX2luaXQgdmZpb19wY2lfaW5pdCh2b2lkKQogCWlm IChyZXQpCiAJCWdvdG8gb3V0X2RyaXZlcjsKIAotCXZmaW9fcGNpX2ZpbGxfaWRzKCk7CisJdmZp b19wY2lfZmlsbF9pZHMoJmlkc1swXSwgJnZmaW9fcGNpX2RyaXZlcik7CiAKIAlyZXR1cm4gMDsK IApkaWZmIC0tZ2l0IGEvZHJpdmVycy92ZmlvL3BjaS92ZmlvX3BjaV9wcml2YXRlLmggYi9kcml2 ZXJzL3ZmaW8vcGNpL3ZmaW9fcGNpX3ByaXZhdGUuaAppbmRleCAxODEyY2YyLi45YmJmMjJjIDEw MDY0NAotLS0gYS9kcml2ZXJzL3ZmaW8vcGNpL3ZmaW9fcGNpX3ByaXZhdGUuaAorKysgYi9kcml2 ZXJzL3ZmaW8vcGNpL3ZmaW9fcGNpX3ByaXZhdGUuaApAQCAtMTI1LDYgKzEyNSwxMSBAQCBzdHJ1 Y3QgdmZpb19wY2lfZGV2aWNlIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkCWR1bW15X3Jlc291cmNlc19s aXN0OwogCXN0cnVjdCBtdXRleAkJaW9ldmVudGZkc19sb2NrOwogCXN0cnVjdCBsaXN0X2hlYWQJ aW9ldmVudGZkc19saXN0OworCWJvb2wJCQlub2ludHhtYXNrOworI2lmZGVmIENPTkZJR19WRklP X1BDSV9WR0EKKwlib29sCQkJZGlzYWJsZV92Z2E7CisjZW5kaWYKKwlib29sCQkJZGlzYWJsZV9p ZGxlX2QzOwogfTsKIAogI2RlZmluZSBpc19pbnR4KHZkZXYpICh2ZGV2LT5pcnFfdHlwZSA9PSBW RklPX1BDSV9JTlRYX0lSUV9JTkRFWCkKQEAgLTEzMyw2ICsxMzgsOCBAQCBzdHJ1Y3QgdmZpb19w Y2lfZGV2aWNlIHsKICNkZWZpbmUgaXNfaXJxX25vbmUodmRldikgKCEoaXNfaW50eCh2ZGV2KSB8 fCBpc19tc2kodmRldikgfHwgaXNfbXNpeCh2ZGV2KSkpCiAjZGVmaW5lIGlycV9pcyh2ZGV2LCB0 eXBlKSAodmRldi0+aXJxX3R5cGUgPT0gdHlwZSkKIAorZXh0ZXJuIGNvbnN0IHN0cnVjdCBwY2lf ZXJyb3JfaGFuZGxlcnMgdmZpb19lcnJfaGFuZGxlcnM7CisKIGV4dGVybiB2b2lkIHZmaW9fcGNp X2ludHhfbWFzayhzdHJ1Y3QgdmZpb19wY2lfZGV2aWNlICp2ZGV2KTsKIGV4dGVybiB2b2lkIHZm aW9fcGNpX2ludHhfdW5tYXNrKHN0cnVjdCB2ZmlvX3BjaV9kZXZpY2UgKnZkZXYpOwogCkBAIC0x NjcsNiArMTc0LDI2IEBAIGV4dGVybiBpbnQgdmZpb19wY2lfcmVnaXN0ZXJfZGV2X3JlZ2lvbihz dHJ1Y3QgdmZpb19wY2lfZGV2aWNlICp2ZGV2LAogZXh0ZXJuIGludCB2ZmlvX3BjaV9zZXRfcG93 ZXJfc3RhdGUoc3RydWN0IHZmaW9fcGNpX2RldmljZSAqdmRldiwKIAkJCQkgICAgcGNpX3Bvd2Vy X3Qgc3RhdGUpOwogCitleHRlcm4gaW50IHZmaW9fcGNpX2VuYWJsZShzdHJ1Y3QgdmZpb19wY2lf ZGV2aWNlICp2ZGV2KTsKK2V4dGVybiB2b2lkIHZmaW9fcGNpX2Rpc2FibGUoc3RydWN0IHZmaW9f cGNpX2RldmljZSAqdmRldik7CitleHRlcm4gbG9uZyB2ZmlvX3BjaV9pb2N0bCh2b2lkICpkZXZp Y2VfZGF0YSwKKwkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKK2V4dGVy biBzc2l6ZV90IHZmaW9fcGNpX3JlYWQodm9pZCAqZGV2aWNlX2RhdGEsIGNoYXIgX191c2VyICpi dWYsCisJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcyk7CitleHRlcm4gc3NpemVfdCB2Zmlv X3BjaV93cml0ZSh2b2lkICpkZXZpY2VfZGF0YSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJ CXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKTsKK2V4dGVybiBpbnQgdmZpb19wY2lfbW1hcCh2 b2lkICpkZXZpY2VfZGF0YSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpOworZXh0ZXJuIHZv aWQgdmZpb19wY2lfcmVxdWVzdCh2b2lkICpkZXZpY2VfZGF0YSwgdW5zaWduZWQgaW50IGNvdW50 KTsKK2V4dGVybiB2b2lkIHZmaW9fcGNpX2ZpbGxfaWRzKGNoYXIgKmlkcywgc3RydWN0IHBjaV9k cml2ZXIgKmRyaXZlcik7CitleHRlcm4gaW50IHZmaW9fcGNpX3JlZmxja19hdHRhY2goc3RydWN0 IHZmaW9fcGNpX2RldmljZSAqdmRldik7CitleHRlcm4gdm9pZCB2ZmlvX3BjaV9yZWZsY2tfcHV0 KHN0cnVjdCB2ZmlvX3BjaV9yZWZsY2sgKnJlZmxjayk7CitleHRlcm4gaW5saW5lIGJvb2wgdmZp b192Z2FfZGlzYWJsZWQoc3RydWN0IHZmaW9fcGNpX2RldmljZSAqdmRldik7CitleHRlcm4gdm9p ZCB2ZmlvX3BjaV9wcm9iZV9wb3dlcl9zdGF0ZShzdHJ1Y3QgdmZpb19wY2lfZGV2aWNlICp2ZGV2 KTsKK2V4dGVybiB2b2lkIHZmaW9fcGNpX3Byb2JlX2lkbGVfZDMoc3RydWN0IHZmaW9fcGNpX2Rl dmljZSAqdmRldik7CitleHRlcm4gdm9pZCB2ZmlvX3BjaV92Z2FfcHJvYmUoc3RydWN0IHZmaW9f cGNpX2RldmljZSAqdmRldik7CitleHRlcm4gdm9pZCB2ZmlvX3BjaV92Z2FfcmVtb3ZlKHN0cnVj dCB2ZmlvX3BjaV9kZXZpY2UgKnZkZXYpOworZXh0ZXJuIGJvb2wgdmZpb19wY2lfaXNfdmdhKHN0 cnVjdCBwY2lfZGV2ICpwZGV2KTsKKwogI2lmZGVmIENPTkZJR19WRklPX1BDSV9JR0QKIGV4dGVy biBpbnQgdmZpb19wY2lfaWdkX2luaXQoc3RydWN0IHZmaW9fcGNpX2RldmljZSAqdmRldik7CiAj ZWxzZQotLSAKMi43LjQKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fCmlvbW11IG1haWxpbmcgbGlzdAppb21tdUBsaXN0cy5saW51eC1mb3VuZGF0aW9uLm9y ZwpodHRwczovL2xpc3RzLmxpbnV4Zm91bmRhdGlvbi5vcmcvbWFpbG1hbi9saXN0aW5mby9pb21t dQ== From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.5 required=3.0 tests=DATE_IN_PAST_24_48, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8FB91C282CE for ; Wed, 24 Apr 2019 12:31:09 +0000 (UTC) Received: from mail.linuxfoundation.org (mail.linuxfoundation.org [140.211.169.12]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 65844218D3 for ; Wed, 24 Apr 2019 12:31:09 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 65844218D3 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=intel.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=iommu-bounces@lists.linux-foundation.org Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id C1032FD2; Wed, 24 Apr 2019 12:31:05 +0000 (UTC) Received: from smtp1.linuxfoundation.org (smtp1.linux-foundation.org [172.17.192.35]) by mail.linuxfoundation.org (Postfix) with ESMTPS id E1212FCF for ; Wed, 24 Apr 2019 12:31:04 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) by smtp1.linuxfoundation.org (Postfix) with ESMTPS id D66F2786 for ; Wed, 24 Apr 2019 12:30:59 +0000 (UTC) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by orsmga104.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 24 Apr 2019 05:30:59 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.60,389,1549958400"; d="scan'208";a="167475668" Received: from yiliu-dev.bj.intel.com ([10.238.156.125]) by fmsmga001.fm.intel.com with ESMTP; 24 Apr 2019 05:30:55 -0700 From: "Liu, Yi L" To: alex.williamson@redhat.com, kwankhede@nvidia.com Subject: [RFC v3 1/3] vfio_pci: split vfio_pci.c into two source files Date: Tue, 23 Apr 2019 20:14:38 +0800 Message-Id: <1556021680-2911-2-git-send-email-yi.l.liu@intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1556021680-2911-1-git-send-email-yi.l.liu@intel.com> References: <1556021680-2911-1-git-send-email-yi.l.liu@intel.com> MIME-Version: 1.0 Cc: kevin.tian@intel.com, kvm@vger.kernel.org, Liu@mail.linuxfoundation.org, jean-philippe.brucker@arm.com, linux-kernel@vger.kernel.org, yamada.masahiro@socionext.com, yi.y.sun@intel.com, iommu@lists.linux-foundation.org X-BeenThere: iommu@lists.linux-foundation.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: Development issues for Linux IOMMU support List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: base64 Sender: iommu-bounces@lists.linux-foundation.org Errors-To: iommu-bounces@lists.linux-foundation.org Message-ID: <20190423121438.fiElApFvyra1McdUMQn86OnAS-81KQpj-Q6PpEiCGbU@z> VGhpcyBwYXRjaCBzcGxpdHMgdGhlIG5vbi1tb2R1bGUgc3BlY2lmaWMgY29kZXMgZnJvbSBvcmln aW5hbApkcml2ZXJzL3ZmaW8vcGNpL3ZmaW9fcGNpLmMgaW50byBhIGNvbW1vbi5jIHVuZGVyIGRy aXZlcnMvdmZpby9wY2kuClRoaXMgaXMgZm9yIHBvdGVudGlhbCBjb2RlIHNoYXJpbmcuIGUuZy4g dmZpby1tZGV2LXBjaSBkcml2ZXIKCkNjOiBLZXZpbiBUaWFuIDxrZXZpbi50aWFuQGludGVsLmNv bT4KQ2M6IEx1IEJhb2x1IDxiYW9sdS5sdUBsaW51eC5pbnRlbC5jb20+ClNpZ25lZC1vZmYtYnk6 IExpdSwgWWkgTCA8eWkubC5saXVAaW50ZWwuY29tPgotLS0KIGRyaXZlcnMvdmZpby9wY2kvTWFr ZWZpbGUgICAgICAgICAgIHwgICAgMiArLQogZHJpdmVycy92ZmlvL3BjaS9jb21tb24uYyAgICAg ICAgICAgfCAxNTExICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCiBkcml2ZXJz L3ZmaW8vcGNpL3ZmaW9fcGNpLmMgICAgICAgICB8IDE0NzYgKy0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLQogZHJpdmVycy92ZmlvL3BjaS92ZmlvX3BjaV9wcml2YXRlLmggfCAgIDI3 ICsKIDQgZmlsZXMgY2hhbmdlZCwgMTU1MSBpbnNlcnRpb25zKCspLCAxNDY1IGRlbGV0aW9ucygt KQogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvdmZpby9wY2kvY29tbW9uLmMKCmRpZmYgLS1n aXQgYS9kcml2ZXJzL3ZmaW8vcGNpL01ha2VmaWxlIGIvZHJpdmVycy92ZmlvL3BjaS9NYWtlZmls ZQppbmRleCA5NjYyYzA2Li44MTNmNmIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZmaW8vcGNpL01h a2VmaWxlCisrKyBiL2RyaXZlcnMvdmZpby9wY2kvTWFrZWZpbGUKQEAgLTEsNSArMSw1IEBACiAK LXZmaW8tcGNpLXkgOj0gdmZpb19wY2kubyB2ZmlvX3BjaV9pbnRycy5vIHZmaW9fcGNpX3Jkd3Iu byB2ZmlvX3BjaV9jb25maWcubwordmZpby1wY2kteSA6PSB2ZmlvX3BjaS5vIGNvbW1vbi5vIHZm aW9fcGNpX2ludHJzLm8gdmZpb19wY2lfcmR3ci5vIHZmaW9fcGNpX2NvbmZpZy5vCiB2ZmlvLXBj aS0kKENPTkZJR19WRklPX1BDSV9JR0QpICs9IHZmaW9fcGNpX2lnZC5vCiB2ZmlvLXBjaS0kKENP TkZJR19WRklPX1BDSV9OVkxJTksyKSArPSB2ZmlvX3BjaV9udmxpbmsyLm8KIApkaWZmIC0tZ2l0 IGEvZHJpdmVycy92ZmlvL3BjaS9jb21tb24uYyBiL2RyaXZlcnMvdmZpby9wY2kvY29tbW9uLmMK bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ3ZTJlNAotLS0gL2Rldi9udWxs CisrKyBiL2RyaXZlcnMvdmZpby9wY2kvY29tbW9uLmMKQEAgLTAsMCArMSwxNTExIEBACisvKgor ICogQ29weXJpZ2h0IMKpIDIwMTkgSW50ZWwgQ29ycG9yYXRpb24uCisgKiAgICAgQXV0aG9yOiBM aXUsIFlpIEwgPHlpLmwubGl1QGludGVsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJl ZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQg dW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9u IDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoK KyAqIERlcml2ZWQgZnJvbSBvcmlnaW5hbCB2ZmlvX3BjaS5jOgorICogQ29weXJpZ2h0IChDKSAy MDEyIFJlZCBIYXQsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAgICAgQXV0aG9yOiBB bGV4IFdpbGxpYW1zb24gPGFsZXgud2lsbGlhbXNvbkByZWRoYXQuY29tPgorICoKKyAqIERlcml2 ZWQgZnJvbSBvcmlnaW5hbCB2ZmlvOgorICogQ29weXJpZ2h0IDIwMTAgQ2lzY28gU3lzdGVtcywg SW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIEF1dGhvcjogVG9tIEx5b24sIHB1Z3NAY2lz Y28uY29tCisgKi8KKworI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZt dAorCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXZlbnRmZC5o PgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4K KyNpbmNsdWRlIDxsaW51eC9pb21tdS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2lu Y2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNs dWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CisjaW5jbHVk ZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGlu dXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZmaW8uaD4KKyNpbmNsdWRlIDxsaW51eC92 Z2FhcmIuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3NwZWMuaD4KKworI2luY2x1ZGUgInZmaW9fcGNp X3ByaXZhdGUuaCIKKworaW5saW5lIGJvb2wgdmZpb192Z2FfZGlzYWJsZWQoc3RydWN0IHZmaW9f cGNpX2RldmljZSAqdmRldikKK3sKKyNpZmRlZiBDT05GSUdfVkZJT19QQ0lfVkdBCisJcmV0dXJu IHZkZXYtPmRpc2FibGVfdmdhOworI2Vsc2UKKwlyZXR1cm4gdHJ1ZTsKKyNlbmRpZgorfQorCisv KgorICogT3VyIFZHQSBhcmJpdGVyIHBhcnRpY2lwYXRpb24gaXMgbGltaXRlZCBzaW5jZSB3ZSBk b24ndCBrbm93IGFueXRoaW5nCisgKiBhYm91dCB0aGUgZGV2aWNlIGl0c2VsZi4gIEhvd2V2ZXIs IGlmIHRoZSBkZXZpY2UgaXMgdGhlIG9ubHkgVkdBIGRldmljZQorICogZG93bnN0cmVhbSBvZiBh IGJyaWRnZSBhbmQgVkZJTyBWR0Egc3VwcG9ydCBpcyBkaXNhYmxlZCwgdGhlbiB3ZSBjYW4KKyAq IHNhZmVseSByZXR1cm4gbGVnYWN5IFZHQSBJTyBhbmQgbWVtb3J5IGFzIG5vdCBkZWNvZGVkIHNp bmNlIHRoZSB1c2VyCisgKiBoYXMgbm8gd2F5IHRvIGdldCB0byBpdCBhbmQgcm91dGluZyBjYW4g YmUgZGlzYWJsZWQgZXh0ZXJuYWxseSBhdCB0aGUKKyAqIGJyaWRnZS4KKyAqLworc3RhdGljIHVu c2lnbmVkIGludCB2ZmlvX3BjaV9zZXRfdmdhX2RlY29kZSh2b2lkICpvcGFxdWUsIGJvb2wgc2lu Z2xlX3ZnYSkKK3sKKwlzdHJ1Y3QgdmZpb19wY2lfZGV2aWNlICp2ZGV2ID0gb3BhcXVlOworCXN0 cnVjdCBwY2lfZGV2ICp0bXAgPSBOVUxMLCAqcGRldiA9IHZkZXYtPnBkZXY7CisJdW5zaWduZWQg Y2hhciBtYXhfYnVzbnI7CisJdW5zaWduZWQgaW50IGRlY29kZXM7CisKKwlpZiAoc2luZ2xlX3Zn YSB8fCAhdmZpb192Z2FfZGlzYWJsZWQodmRldikgfHwKKwkgICAgcGNpX2lzX3Jvb3RfYnVzKHBk ZXYtPmJ1cykpCisJCXJldHVybiBWR0FfUlNSQ19OT1JNQUxfSU8gfCBWR0FfUlNSQ19OT1JNQUxf TUVNIHwKKwkJICAgICAgIFZHQV9SU1JDX0xFR0FDWV9JTyB8IFZHQV9SU1JDX0xFR0FDWV9NRU07 CisKKwltYXhfYnVzbnIgPSBwY2lfYnVzX21heF9idXNucihwZGV2LT5idXMpOworCWRlY29kZXMg PSBWR0FfUlNSQ19OT1JNQUxfSU8gfCBWR0FfUlNSQ19OT1JNQUxfTUVNOworCisJd2hpbGUgKCh0 bXAgPSBwY2lfZ2V0X2NsYXNzKFBDSV9DTEFTU19ESVNQTEFZX1ZHQSA8PCA4LCB0bXApKSAhPSBO VUxMKSB7CisJCWlmICh0bXAgPT0gcGRldiB8fAorCQkgICAgcGNpX2RvbWFpbl9ucih0bXAtPmJ1 cykgIT0gcGNpX2RvbWFpbl9ucihwZGV2LT5idXMpIHx8CisJCSAgICBwY2lfaXNfcm9vdF9idXMo dG1wLT5idXMpKQorCQkJY29udGludWU7CisKKwkJaWYgKHRtcC0+YnVzLT5udW1iZXIgPj0gcGRl di0+YnVzLT5udW1iZXIgJiYKKwkJICAgIHRtcC0+YnVzLT5udW1iZXIgPD0gbWF4X2J1c25yKSB7 CisJCQlwY2lfZGV2X3B1dCh0bXApOworCQkJZGVjb2RlcyB8PSBWR0FfUlNSQ19MRUdBQ1lfSU8g fCBWR0FfUlNSQ19MRUdBQ1lfTUVNOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gZGVj b2RlczsKK30KKworaW5saW5lIGJvb2wgdmZpb19wY2lfaXNfdmdhKHN0cnVjdCBwY2lfZGV2ICpw ZGV2KQoreworCXJldHVybiAocGRldi0+Y2xhc3MgPj4gOCkgPT0gUENJX0NMQVNTX0RJU1BMQVlf VkdBOworfQorCit2b2lkIHZmaW9fcGNpX3ZnYV9wcm9iZShzdHJ1Y3QgdmZpb19wY2lfZGV2aWNl ICp2ZGV2KQoreworCXZnYV9jbGllbnRfcmVnaXN0ZXIodmRldi0+cGRldiwgdmRldiwgTlVMTCwg dmZpb19wY2lfc2V0X3ZnYV9kZWNvZGUpOworCXZnYV9zZXRfbGVnYWN5X2RlY29kaW5nKHZkZXYt PnBkZXYsCisJCQkJdmZpb19wY2lfc2V0X3ZnYV9kZWNvZGUodmRldiwgZmFsc2UpKTsKK30KKwor dm9pZCB2ZmlvX3BjaV92Z2FfcmVtb3ZlKHN0cnVjdCB2ZmlvX3BjaV9kZXZpY2UgKnZkZXYpCit7 CisJdmdhX2NsaWVudF9yZWdpc3Rlcih2ZGV2LT5wZGV2LCBOVUxMLCBOVUxMLCBOVUxMKTsKKwl2 Z2Ffc2V0X2xlZ2FjeV9kZWNvZGluZyh2ZGV2LT5wZGV2LAorCQkJVkdBX1JTUkNfTk9STUFMX0lP IHwgVkdBX1JTUkNfTk9STUFMX01FTSB8CisJCQlWR0FfUlNSQ19MRUdBQ1lfSU8gfCBWR0FfUlNS Q19MRUdBQ1lfTUVNKTsKK30KKworc3RhdGljIHZvaWQgdmZpb19wY2lfcHJvYmVfbW1hcHMoc3Ry dWN0IHZmaW9fcGNpX2RldmljZSAqdmRldikKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlp bnQgYmFyOworCXN0cnVjdCB2ZmlvX3BjaV9kdW1teV9yZXNvdXJjZSAqZHVtbXlfcmVzOworCisJ SU5JVF9MSVNUX0hFQUQoJnZkZXYtPmR1bW15X3Jlc291cmNlc19saXN0KTsKKworCWZvciAoYmFy ID0gUENJX1NURF9SRVNPVVJDRVM7IGJhciA8PSBQQ0lfU1REX1JFU09VUkNFX0VORDsgYmFyKysp IHsKKwkJcmVzID0gdmRldi0+cGRldi0+cmVzb3VyY2UgKyBiYXI7CisKKwkJaWYgKCFJU19FTkFC TEVEKENPTkZJR19WRklPX1BDSV9NTUFQKSkKKwkJCWdvdG8gbm9fbW1hcDsKKworCQlpZiAoIShy ZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9NRU0pKQorCQkJZ290byBub19tbWFwOworCisJCS8qCisJ CSAqIFRoZSBQQ0kgY29yZSBzaG91bGRuJ3Qgc2V0IHVwIGEgcmVzb3VyY2Ugd2l0aCBhCisJCSAq IHR5cGUgYnV0IHplcm8gc2l6ZS4gQnV0IHRoZXJlIG1heSBiZSBidWdzIHRoYXQKKwkJICogY2F1 c2UgdXMgdG8gZG8gdGhhdC4KKwkJICovCisJCWlmICghcmVzb3VyY2Vfc2l6ZShyZXMpKQorCQkJ Z290byBub19tbWFwOworCisJCWlmIChyZXNvdXJjZV9zaXplKHJlcykgPj0gUEFHRV9TSVpFKSB7 CisJCQl2ZGV2LT5iYXJfbW1hcF9zdXBwb3J0ZWRbYmFyXSA9IHRydWU7CisJCQljb250aW51ZTsK KwkJfQorCisJCWlmICghKHJlcy0+c3RhcnQgJiB+UEFHRV9NQVNLKSkgeworCQkJLyoKKwkJCSAq IEFkZCBhIGR1bW15IHJlc291cmNlIHRvIHJlc2VydmUgdGhlIHJlbWFpbmRlcgorCQkJICogb2Yg dGhlIGV4Y2x1c2l2ZSBwYWdlIGluIGNhc2UgdGhhdCBob3QtYWRkCisJCQkgKiBkZXZpY2UncyBi YXIgaXMgYXNzaWduZWQgaW50byBpdC4KKwkJCSAqLworCQkJZHVtbXlfcmVzID0ga3phbGxvYyhz aXplb2YoKmR1bW15X3JlcyksIEdGUF9LRVJORUwpOworCQkJaWYgKGR1bW15X3JlcyA9PSBOVUxM KQorCQkJCWdvdG8gbm9fbW1hcDsKKworCQkJZHVtbXlfcmVzLT5yZXNvdXJjZS5uYW1lID0gInZm aW8gc3ViLXBhZ2UgcmVzZXJ2ZWQiOworCQkJZHVtbXlfcmVzLT5yZXNvdXJjZS5zdGFydCA9IHJl cy0+ZW5kICsgMTsKKwkJCWR1bW15X3Jlcy0+cmVzb3VyY2UuZW5kID0gcmVzLT5zdGFydCArIFBB R0VfU0laRSAtIDE7CisJCQlkdW1teV9yZXMtPnJlc291cmNlLmZsYWdzID0gcmVzLT5mbGFnczsK KwkJCWlmIChyZXF1ZXN0X3Jlc291cmNlKHJlcy0+cGFyZW50LAorCQkJCQkJJmR1bW15X3Jlcy0+ cmVzb3VyY2UpKSB7CisJCQkJa2ZyZWUoZHVtbXlfcmVzKTsKKwkJCQlnb3RvIG5vX21tYXA7CisJ CQl9CisJCQlkdW1teV9yZXMtPmluZGV4ID0gYmFyOworCQkJbGlzdF9hZGQoJmR1bW15X3Jlcy0+ cmVzX25leHQsCisJCQkJCSZ2ZGV2LT5kdW1teV9yZXNvdXJjZXNfbGlzdCk7CisJCQl2ZGV2LT5i YXJfbW1hcF9zdXBwb3J0ZWRbYmFyXSA9IHRydWU7CisJCQljb250aW51ZTsKKwkJfQorCQkvKgor CQkgKiBIZXJlIHdlIGRvbid0IGhhbmRsZSB0aGUgY2FzZSB3aGVuIHRoZSBCQVIgaXMgbm90IHBh Z2UKKwkJICogYWxpZ25lZCBiZWNhdXNlIHdlIGNhbid0IGV4cGVjdCB0aGUgQkFSIHdpbGwgYmUK KwkJICogYXNzaWduZWQgaW50byB0aGUgc2FtZSBsb2NhdGlvbiBpbiBhIHBhZ2UgaW4gZ3Vlc3QK KwkJICogd2hlbiB3ZSBwYXNzdGhyb3VnaCB0aGUgQkFSLiBBbmQgaXQncyBoYXJkIHRvIGFjY2Vz cworCQkgKiB0aGlzIEJBUiBpbiB1c2Vyc3BhY2UgYmVjYXVzZSB3ZSBoYXZlIG5vIHdheSB0byBn ZXQKKwkJICogdGhlIEJBUidzIGxvY2F0aW9uIGluIGEgcGFnZS4KKwkJICovCitub19tbWFwOgor CQl2ZGV2LT5iYXJfbW1hcF9zdXBwb3J0ZWRbYmFyXSA9IGZhbHNlOworCX0KK30KKworc3RhdGlj IHZvaWQgdmZpb19wY2lfdHJ5X2J1c19yZXNldChzdHJ1Y3QgdmZpb19wY2lfZGV2aWNlICp2ZGV2 KTsKKworLyoKKyAqIElOVHggbWFza2luZyByZXF1aXJlcyB0aGUgYWJpbGl0eSB0byBkaXNhYmxl IElOVHggc2lnbmFsaW5nIHZpYSBQQ0lfQ09NTUFORAorICogX2FuZF8gdGhlIGFiaWxpdHkgZGV0 ZWN0IHdoZW4gdGhlIGRldmljZSBpcyBhc3NlcnRpbmcgSU5UeCB2aWEgUENJX1NUQVRVUy4KKyAq IElmIGEgZGV2aWNlIGltcGxlbWVudHMgdGhlIGZvcm1lciBidXQgbm90IHRoZSBsYXR0ZXIgd2Ug d291bGQgdHlwaWNhbGx5CisgKiBleHBlY3QgYnJva2VuX2ludHhfbWFza2luZyBiZSBzZXQgYW5k IHJlcXVpcmUgYW4gZXhjbHVzaXZlIGludGVycnVwdC4KKyAqIEhvd2V2ZXIgc2luY2Ugd2UgZG8g aGF2ZSBjb250cm9sIG9mIHRoZSBkZXZpY2UncyBhYmlsaXR5IHRvIGFzc2VydCBJTlR4LAorICog d2UgY2FuIGluc3RlYWQgcHJldGVuZCB0aGF0IHRoZSBkZXZpY2UgZG9lcyBub3QgaW1wbGVtZW50 IElOVHgsIHZpcnR1YWxpemluZworICogdGhlIHBpbiByZWdpc3RlciB0byByZXBvcnQgemVybyBh bmQgbWFpbnRhaW5pbmcgRGlzSU5UeCBzZXQgb24gdGhlIGhvc3QuCisgKi8KK3N0YXRpYyBib29s IHZmaW9fcGNpX25vaW50eChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzd2l0Y2ggKHBkZXYt PnZlbmRvcikgeworCWNhc2UgUENJX1ZFTkRPUl9JRF9JTlRFTDoKKwkJc3dpdGNoIChwZGV2LT5k ZXZpY2UpIHsKKwkJLyogQWxsIGk0MGUgKFhMNzEwL1g3MTAvWFhWNzEwKSAxMC8yMC8yNS80MEdi RSBOSUNzICovCisJCWNhc2UgMHgxNTcyOgorCQljYXNlIDB4MTU3NDoKKwkJY2FzZSAweDE1ODAg Li4uIDB4MTU4MToKKwkJY2FzZSAweDE1ODMgLi4uIDB4MTU4YjoKKwkJY2FzZSAweDM3ZDAgLi4u IDB4MzdkMjoKKwkJCXJldHVybiB0cnVlOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIGZhbHNlOwor CQl9CisJfQorCisJcmV0dXJuIGZhbHNlOworfQorCit2b2lkIHZmaW9fcGNpX3Byb2JlX3Bvd2Vy X3N0YXRlKHN0cnVjdCB2ZmlvX3BjaV9kZXZpY2UgKnZkZXYpCit7CisJc3RydWN0IHBjaV9kZXYg KnBkZXYgPSB2ZGV2LT5wZGV2OworCXUxNiBwbWNzcjsKKworCWlmICghcGRldi0+cG1fY2FwKQor CQlyZXR1cm47CisKKwlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBwZGV2LT5wbV9jYXAgKyBQ Q0lfUE1fQ1RSTCwgJnBtY3NyKTsKKworCXZkZXYtPm5lZWRzX3BtX3Jlc3RvcmUgPSAhKHBtY3Ny ICYgUENJX1BNX0NUUkxfTk9fU09GVF9SRVNFVCk7Cit9CisKKy8qCisgKiBwY2lfc2V0X3Bvd2Vy X3N0YXRlKCkgd3JhcHBlciBoYW5kbGluZyBkZXZpY2VzIHdoaWNoIHBlcmZvcm0gYSBzb2Z0IHJl c2V0IG9uCisgKiBEMy0+RDAgdHJhbnNpdGlvbi4gIFNhdmUgc3RhdGUgcHJpb3IgdG8gRDAvMS8y LT5EMywgc3Rhc2ggaXQgb24gdGhlIHZkZXYsCisgKiByZXN0b3JlIHdoZW4gcmV0dXJuZWQgdG8g RDAuICBTYXZlZCBzZXBhcmF0ZWx5IGZyb20gcGNpX3NhdmVkX3N0YXRlIGZvciB1c2UKKyAqIGJ5 IFBNIGNhcGFiaWxpdHkgZW11bGF0aW9uIGFuZCBzZXBhcmF0ZWx5IGZyb20gcGNpX2RldiBpbnRl cm5hbCBzYXZlZCBzdGF0ZQorICogdG8gYXZvaWQgaXQgYmVpbmcgb3ZlcndyaXR0ZW4gYW5kIGNv bnN1bWVkIGFyb3VuZCBvdGhlciByZXNldHMuCisgKi8KK2ludCB2ZmlvX3BjaV9zZXRfcG93ZXJf c3RhdGUoc3RydWN0IHZmaW9fcGNpX2RldmljZSAqdmRldiwgcGNpX3Bvd2VyX3Qgc3RhdGUpCit7 CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB2ZGV2LT5wZGV2OworCWJvb2wgbmVlZHNfcmVzdG9y ZSA9IGZhbHNlLCBuZWVkc19zYXZlID0gZmFsc2U7CisJaW50IHJldDsKKworCWlmICh2ZGV2LT5u ZWVkc19wbV9yZXN0b3JlKSB7CisJCWlmIChwZGV2LT5jdXJyZW50X3N0YXRlIDwgUENJX0QzaG90 ICYmIHN0YXRlID49IFBDSV9EM2hvdCkgeworCQkJcGNpX3NhdmVfc3RhdGUocGRldik7CisJCQlu ZWVkc19zYXZlID0gdHJ1ZTsKKwkJfQorCisJCWlmIChwZGV2LT5jdXJyZW50X3N0YXRlID49IFBD SV9EM2hvdCAmJiBzdGF0ZSA8PSBQQ0lfRDApCisJCQluZWVkc19yZXN0b3JlID0gdHJ1ZTsKKwl9 CisKKwlyZXQgPSBwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIHN0YXRlKTsKKworCWlmICghcmV0 KSB7CisJCS8qIEQzIG1pZ2h0IGJlIHVuc3VwcG9ydGVkIHZpYSBxdWlyaywgc2tpcCB1bmxlc3Mg aW4gRDMgKi8KKwkJaWYgKG5lZWRzX3NhdmUgJiYgcGRldi0+Y3VycmVudF9zdGF0ZSA+PSBQQ0lf RDNob3QpIHsKKwkJCXZkZXYtPnBtX3NhdmUgPSBwY2lfc3RvcmVfc2F2ZWRfc3RhdGUocGRldik7 CisJCX0gZWxzZSBpZiAobmVlZHNfcmVzdG9yZSkgeworCQkJcGNpX2xvYWRfYW5kX2ZyZWVfc2F2 ZWRfc3RhdGUocGRldiwgJnZkZXYtPnBtX3NhdmUpOworCQkJcGNpX3Jlc3RvcmVfc3RhdGUocGRl dik7CisJCX0KKwl9CisKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIHZmaW9fcGNpX3Byb2JlX2lk bGVfZDMoc3RydWN0IHZmaW9fcGNpX2RldmljZSAqdmRldikKK3sKKworCS8qCisJICogcGNpLWNv cmUgc2V0cyB0aGUgZGV2aWNlIHBvd2VyIHN0YXRlIHRvIGFuIHVua25vd24gdmFsdWUgYXQKKwkg KiBib290dXAgYW5kIGFmdGVyIGJlaW5nIHJlbW92ZWQgZnJvbSBhIGRyaXZlci4gIFRoZSBvbmx5 CisJICogdHJhbnNpdGlvbiBpdCBhbGxvd3MgZnJvbSB0aGlzIHVua25vd24gc3RhdGUgaXMgdG8g RDAsIHdoaWNoCisJICogdHlwaWNhbGx5IGhhcHBlbnMgd2hlbiBhIGRyaXZlciBjYWxscyBwY2lf ZW5hYmxlX2RldmljZSgpLgorCSAqIFdlJ3JlIG5vdCByZWFkeSB0byBlbmFibGUgdGhlIGRldmlj ZSB5ZXQsIGJ1dCB3ZSBkbyB3YW50IHRvCisJICogYmUgYWJsZSB0byBnZXQgdG8gRDMuICBUaGVy ZWZvcmUgZmlyc3QgZG8gYSBEMCB0cmFuc2l0aW9uCisJICogYmVmb3JlIGdvaW5nIHRvIEQzLgor CSAqLworCXZmaW9fcGNpX3NldF9wb3dlcl9zdGF0ZSh2ZGV2LCBQQ0lfRDApOworCXZmaW9fcGNp X3NldF9wb3dlcl9zdGF0ZSh2ZGV2LCBQQ0lfRDNob3QpOworfQorCitpbnQgdmZpb19wY2lfZW5h YmxlKHN0cnVjdCB2ZmlvX3BjaV9kZXZpY2UgKnZkZXYpCit7CisJc3RydWN0IHBjaV9kZXYgKnBk ZXYgPSB2ZGV2LT5wZGV2OworCWludCByZXQ7CisJdTE2IGNtZDsKKwl1OCBtc2l4X3BvczsKKwor CXZmaW9fcGNpX3NldF9wb3dlcl9zdGF0ZSh2ZGV2LCBQQ0lfRDApOworCisJLyogRG9uJ3QgYWxs b3cgb3VyIGluaXRpYWwgc2F2ZWQgc3RhdGUgdG8gaW5jbHVkZSBidXNtYXN0ZXIgKi8KKwlwY2lf Y2xlYXJfbWFzdGVyKHBkZXYpOworCisJcmV0ID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJ aWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qIElmIHJlc2V0IGZhaWxzIGJlY2F1c2Ugb2Yg dGhlIGRldmljZSBsb2NrLCBmYWlsIHRoaXMgcGF0aCBlbnRpcmVseSAqLworCXJldCA9IHBjaV90 cnlfcmVzZXRfZnVuY3Rpb24ocGRldik7CisJaWYgKHJldCA9PSAtRUFHQUlOKSB7CisJCXBjaV9k aXNhYmxlX2RldmljZShwZGV2KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwl2ZGV2LT5yZXNldF93 b3JrcyA9ICFyZXQ7CisJcGNpX3NhdmVfc3RhdGUocGRldik7CisJdmRldi0+cGNpX3NhdmVkX3N0 YXRlID0gcGNpX3N0b3JlX3NhdmVkX3N0YXRlKHBkZXYpOworCWlmICghdmRldi0+cGNpX3NhdmVk X3N0YXRlKQorCQlwcl9kZWJ1ZygiJXM6IENvdWxkbid0IHN0b3JlICVzIHNhdmVkIHN0YXRlXG4i LAorCQkJIF9fZnVuY19fLCBkZXZfbmFtZSgmcGRldi0+ZGV2KSk7CisKKwlpZiAobGlrZWx5KCF2 ZGV2LT5ub2ludHhtYXNrKSkgeworCQlpZiAodmZpb19wY2lfbm9pbnR4KHBkZXYpKSB7CisJCQlk ZXZfaW5mbygmcGRldi0+ZGV2LCAiTWFza2luZyBicm9rZW4gSU5UeCBzdXBwb3J0XG4iKTsKKwkJ CXZkZXYtPm5vaW50eCA9IHRydWU7CisJCQlwY2lfaW50eChwZGV2LCAwKTsKKwkJfSBlbHNlCisJ CQl2ZGV2LT5wY2lfMl8zID0gcGNpX2ludHhfbWFza19zdXBwb3J0ZWQocGRldik7CisJfQorCisJ cGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgUENJX0NPTU1BTkQsICZjbWQpOworCWlmICh2ZGV2 LT5wY2lfMl8zICYmIChjbWQgJiBQQ0lfQ09NTUFORF9JTlRYX0RJU0FCTEUpKSB7CisJCWNtZCAm PSB+UENJX0NPTU1BTkRfSU5UWF9ESVNBQkxFOworCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQocGRl diwgUENJX0NPTU1BTkQsIGNtZCk7CisJfQorCisJcmV0ID0gdmZpb19jb25maWdfaW5pdCh2ZGV2 KTsKKwlpZiAocmV0KSB7CisJCWtmcmVlKHZkZXYtPnBjaV9zYXZlZF9zdGF0ZSk7CisJCXZkZXYt PnBjaV9zYXZlZF9zdGF0ZSA9IE5VTEw7CisJCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwkJ cmV0dXJuIHJldDsKKwl9CisKKwltc2l4X3BvcyA9IHBkZXYtPm1zaXhfY2FwOworCWlmIChtc2l4 X3BvcykgeworCQl1MTYgZmxhZ3M7CisJCXUzMiB0YWJsZTsKKworCQlwY2lfcmVhZF9jb25maWdf d29yZChwZGV2LCBtc2l4X3BvcyArIFBDSV9NU0lYX0ZMQUdTLCAmZmxhZ3MpOworCQlwY2lfcmVh ZF9jb25maWdfZHdvcmQocGRldiwgbXNpeF9wb3MgKyBQQ0lfTVNJWF9UQUJMRSwgJnRhYmxlKTsK KworCQl2ZGV2LT5tc2l4X2JhciA9IHRhYmxlICYgUENJX01TSVhfVEFCTEVfQklSOworCQl2ZGV2 LT5tc2l4X29mZnNldCA9IHRhYmxlICYgUENJX01TSVhfVEFCTEVfT0ZGU0VUOworCQl2ZGV2LT5t c2l4X3NpemUgPSAoKGZsYWdzICYgUENJX01TSVhfRkxBR1NfUVNJWkUpICsgMSkgKiAxNjsKKwl9 IGVsc2UKKwkJdmRldi0+bXNpeF9iYXIgPSAweEZGOworCisJaWYgKCF2ZmlvX3ZnYV9kaXNhYmxl ZCh2ZGV2KSAmJiB2ZmlvX3BjaV9pc192Z2EocGRldikpCisJCXZkZXYtPmhhc192Z2EgPSB0cnVl OworCisKKwlpZiAodmZpb19wY2lfaXNfdmdhKHBkZXYpICYmCisJICAgIHBkZXYtPnZlbmRvciA9 PSBQQ0lfVkVORE9SX0lEX0lOVEVMICYmCisJICAgIElTX0VOQUJMRUQoQ09ORklHX1ZGSU9fUENJ X0lHRCkpIHsKKwkJcmV0ID0gdmZpb19wY2lfaWdkX2luaXQodmRldik7CisJCWlmIChyZXQpIHsK KwkJCWRldl93YXJuKCZ2ZGV2LT5wZGV2LT5kZXYsCisJCQkJICJGYWlsZWQgdG8gc2V0dXAgSW50 ZWwgSUdEIHJlZ2lvbnNcbiIpOworCQkJZ290byBkaXNhYmxlX2V4aXQ7CisJCX0KKwl9CisKKwlp ZiAocGRldi0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfTlZJRElBICYmCisJICAgIElTX0VOQUJM RUQoQ09ORklHX1ZGSU9fUENJX05WTElOSzIpKSB7CisJCXJldCA9IHZmaW9fcGNpX252ZGlhX3Yx MDBfbnZsaW5rMl9pbml0KHZkZXYpOworCQlpZiAocmV0ICYmIHJldCAhPSAtRU5PREVWKSB7CisJ CQlkZXZfd2FybigmdmRldi0+cGRldi0+ZGV2LAorCQkJCSAiRmFpbGVkIHRvIHNldHVwIE5WSURJ QSBOVjIgUkFNIHJlZ2lvblxuIik7CisJCQlnb3RvIGRpc2FibGVfZXhpdDsKKwkJfQorCX0KKwor CWlmIChwZGV2LT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9JQk0gJiYKKwkgICAgSVNfRU5BQkxF RChDT05GSUdfVkZJT19QQ0lfTlZMSU5LMikpIHsKKwkJcmV0ID0gdmZpb19wY2lfaWJtX25wdTJf aW5pdCh2ZGV2KTsKKwkJaWYgKHJldCAmJiByZXQgIT0gLUVOT0RFVikgeworCQkJZGV2X3dhcm4o JnZkZXYtPnBkZXYtPmRldiwKKwkJCQkJIkZhaWxlZCB0byBzZXR1cCBOVklESUEgTlYyIEFUU0Qg cmVnaW9uXG4iKTsKKwkJCWdvdG8gZGlzYWJsZV9leGl0OworCQl9CisJfQorCisJdmZpb19wY2lf cHJvYmVfbW1hcHModmRldik7CisKKwlyZXR1cm4gMDsKKworZGlzYWJsZV9leGl0OgorCXZmaW9f cGNpX2Rpc2FibGUodmRldik7CisJcmV0dXJuIHJldDsKK30KKwordm9pZCB2ZmlvX3BjaV9kaXNh YmxlKHN0cnVjdCB2ZmlvX3BjaV9kZXZpY2UgKnZkZXYpCit7CisJc3RydWN0IHBjaV9kZXYgKnBk ZXYgPSB2ZGV2LT5wZGV2OworCXN0cnVjdCB2ZmlvX3BjaV9kdW1teV9yZXNvdXJjZSAqZHVtbXlf cmVzLCAqdG1wOworCXN0cnVjdCB2ZmlvX3BjaV9pb2V2ZW50ZmQgKmlvZXZlbnRmZCwgKmlvZXZl bnRmZF90bXA7CisJaW50IGksIGJhcjsKKworCS8qIFN0b3AgdGhlIGRldmljZSBmcm9tIGZ1cnRo ZXIgRE1BICovCisJcGNpX2NsZWFyX21hc3RlcihwZGV2KTsKKworCXZmaW9fcGNpX3NldF9pcnFz X2lvY3RsKHZkZXYsIFZGSU9fSVJRX1NFVF9EQVRBX05PTkUgfAorCQkJCVZGSU9fSVJRX1NFVF9B Q1RJT05fVFJJR0dFUiwKKwkJCQl2ZGV2LT5pcnFfdHlwZSwgMCwgMCwgTlVMTCk7CisKKwkvKiBE ZXZpY2UgY2xvc2VkLCBkb24ndCBuZWVkIG11dGV4IGhlcmUgKi8KKwlsaXN0X2Zvcl9lYWNoX2Vu dHJ5X3NhZmUoaW9ldmVudGZkLCBpb2V2ZW50ZmRfdG1wLAorCQkJCSAmdmRldi0+aW9ldmVudGZk c19saXN0LCBuZXh0KSB7CisJCXZmaW9fdmlycWZkX2Rpc2FibGUoJmlvZXZlbnRmZC0+dmlycWZk KTsKKwkJbGlzdF9kZWwoJmlvZXZlbnRmZC0+bmV4dCk7CisJCWtmcmVlKGlvZXZlbnRmZCk7CisJ fQorCXZkZXYtPmlvZXZlbnRmZHNfbnIgPSAwOworCisJdmRldi0+dmlycV9kaXNhYmxlZCA9IGZh bHNlOworCisJZm9yIChpID0gMDsgaSA8IHZkZXYtPm51bV9yZWdpb25zOyBpKyspCisJCXZkZXYt PnJlZ2lvbltpXS5vcHMtPnJlbGVhc2UodmRldiwgJnZkZXYtPnJlZ2lvbltpXSk7CisKKwl2ZGV2 LT5udW1fcmVnaW9ucyA9IDA7CisJa2ZyZWUodmRldi0+cmVnaW9uKTsKKwl2ZGV2LT5yZWdpb24g PSBOVUxMOyAvKiBkb24ndCBrcmVhbGxvYyBhIGZyZWVkIHBvaW50ZXIgKi8KKworCXZmaW9fY29u ZmlnX2ZyZWUodmRldik7CisKKwlmb3IgKGJhciA9IFBDSV9TVERfUkVTT1VSQ0VTOyBiYXIgPD0g UENJX1NURF9SRVNPVVJDRV9FTkQ7IGJhcisrKSB7CisJCWlmICghdmRldi0+YmFybWFwW2Jhcl0p CisJCQljb250aW51ZTsKKwkJcGNpX2lvdW5tYXAocGRldiwgdmRldi0+YmFybWFwW2Jhcl0pOwor CQlwY2lfcmVsZWFzZV9zZWxlY3RlZF9yZWdpb25zKHBkZXYsIDEgPDwgYmFyKTsKKwkJdmRldi0+ YmFybWFwW2Jhcl0gPSBOVUxMOworCX0KKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkdW1t eV9yZXMsIHRtcCwKKwkJCQkgJnZkZXYtPmR1bW15X3Jlc291cmNlc19saXN0LCByZXNfbmV4dCkg eworCQlsaXN0X2RlbCgmZHVtbXlfcmVzLT5yZXNfbmV4dCk7CisJCXJlbGVhc2VfcmVzb3VyY2Uo JmR1bW15X3Jlcy0+cmVzb3VyY2UpOworCQlrZnJlZShkdW1teV9yZXMpOworCX0KKworCXZkZXYt Pm5lZWRzX3Jlc2V0ID0gdHJ1ZTsKKworCS8qCisJICogSWYgd2UgaGF2ZSBzYXZlZCBzdGF0ZSwg cmVzdG9yZSBpdC4gIElmIHdlIGNhbiByZXNldCB0aGUgZGV2aWNlLAorCSAqIGV2ZW4gYmV0dGVy LiAgUmVzZXR0aW5nIHdpdGggY3VycmVudCBzdGF0ZSBzZWVtcyBiZXR0ZXIgdGhhbgorCSAqIG5v dGhpbmcsIGJ1dCBzYXZpbmcgYW5kIHJlc3RvcmluZyBjdXJyZW50IHN0YXRlIHdpdGhvdXQgcmVz ZXQKKwkgKiBpcyBqdXN0IGJ1c3kgd29yay4KKwkgKi8KKwlpZiAocGNpX2xvYWRfYW5kX2ZyZWVf c2F2ZWRfc3RhdGUocGRldiwgJnZkZXYtPnBjaV9zYXZlZF9zdGF0ZSkpIHsKKwkJcHJfaW5mbygi JXM6IENvdWxkbid0IHJlbG9hZCAlcyBzYXZlZCBzdGF0ZVxuIiwKKwkJCV9fZnVuY19fLCBkZXZf bmFtZSgmcGRldi0+ZGV2KSk7CisKKwkJaWYgKCF2ZGV2LT5yZXNldF93b3JrcykKKwkJCWdvdG8g b3V0OworCisJCXBjaV9zYXZlX3N0YXRlKHBkZXYpOworCX0KKworCS8qCisJICogRGlzYWJsZSBJ TlR4IGFuZCBNU0ksIHByZXN1bWFibHkgdG8gYXZvaWQgc3B1cmlvdXMgaW50ZXJydXB0cworCSAq IGR1cmluZyByZXNldC4gIFN0b2xlbiBmcm9tIHBjaV9yZXNldF9mdW5jdGlvbigpCisJICovCisJ cGNpX3dyaXRlX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9DT01NQU5ELCBQQ0lfQ09NTUFORF9JTlRY X0RJU0FCTEUpOworCisJLyoKKwkgKiBUcnkgdG8gcmVzZXQgdGhlIGRldmljZS4gIFRoZSBzdWNj ZXNzIG9mIHRoaXMgaXMgZGVwZW5kZW50IG9uCisJICogYmVpbmcgYWJsZSB0byBsb2NrIHRoZSBk ZXZpY2UsIHdoaWNoIGlzIG5vdCBhbHdheXMgcG9zc2libGUuCisJICovCisJaWYgKHZkZXYtPnJl c2V0X3dvcmtzICYmICFwY2lfdHJ5X3Jlc2V0X2Z1bmN0aW9uKHBkZXYpKQorCQl2ZGV2LT5uZWVk c19yZXNldCA9IGZhbHNlOworCisJcGNpX3Jlc3RvcmVfc3RhdGUocGRldik7CitvdXQ6CisJcGNp X2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCisJdmZpb19wY2lfdHJ5X2J1c19yZXNldCh2ZGV2KTsK KworCWlmICghdmRldi0+ZGlzYWJsZV9pZGxlX2QzKQorCQl2ZmlvX3BjaV9zZXRfcG93ZXJfc3Rh dGUodmRldiwgUENJX0QzaG90KTsKK30KKworc3RhdGljIGludCB2ZmlvX3BjaV9nZXRfaXJxX2Nv dW50KHN0cnVjdCB2ZmlvX3BjaV9kZXZpY2UgKnZkZXYsIGludCBpcnFfdHlwZSkKK3sKKwlpZiAo aXJxX3R5cGUgPT0gVkZJT19QQ0lfSU5UWF9JUlFfSU5ERVgpIHsKKwkJdTggcGluOworCisJCWlm ICghSVNfRU5BQkxFRChDT05GSUdfVkZJT19QQ0lfSU5UWCkgfHwKKwkJICAgIHZkZXYtPm5vaW50 eCB8fCB2ZGV2LT5wZGV2LT5pc192aXJ0Zm4pCisJCQlyZXR1cm4gMDsKKworCQlwY2lfcmVhZF9j b25maWdfYnl0ZSh2ZGV2LT5wZGV2LCBQQ0lfSU5URVJSVVBUX1BJTiwgJnBpbik7CisKKwkJcmV0 dXJuIHBpbiA/IDEgOiAwOworCX0gZWxzZSBpZiAoaXJxX3R5cGUgPT0gVkZJT19QQ0lfTVNJX0lS UV9JTkRFWCkgeworCQl1OCBwb3M7CisJCXUxNiBmbGFnczsKKworCQlwb3MgPSB2ZGV2LT5wZGV2 LT5tc2lfY2FwOworCQlpZiAocG9zKSB7CisJCQlwY2lfcmVhZF9jb25maWdfd29yZCh2ZGV2LT5w ZGV2LAorCQkJCQkgICAgIHBvcyArIFBDSV9NU0lfRkxBR1MsICZmbGFncyk7CisJCQlyZXR1cm4g MSA8PCAoKGZsYWdzICYgUENJX01TSV9GTEFHU19RTUFTSykgPj4gMSk7CisJCX0KKwl9IGVsc2Ug aWYgKGlycV90eXBlID09IFZGSU9fUENJX01TSVhfSVJRX0lOREVYKSB7CisJCXU4IHBvczsKKwkJ dTE2IGZsYWdzOworCisJCXBvcyA9IHZkZXYtPnBkZXYtPm1zaXhfY2FwOworCQlpZiAocG9zKSB7 CisJCQlwY2lfcmVhZF9jb25maWdfd29yZCh2ZGV2LT5wZGV2LAorCQkJCQkgICAgIHBvcyArIFBD SV9NU0lYX0ZMQUdTLCAmZmxhZ3MpOworCisJCQlyZXR1cm4gKGZsYWdzICYgUENJX01TSVhfRkxB R1NfUVNJWkUpICsgMTsKKwkJfQorCX0gZWxzZSBpZiAoaXJxX3R5cGUgPT0gVkZJT19QQ0lfRVJS X0lSUV9JTkRFWCkgeworCQlpZiAocGNpX2lzX3BjaWUodmRldi0+cGRldikpCisJCQlyZXR1cm4g MTsKKwl9IGVsc2UgaWYgKGlycV90eXBlID09IFZGSU9fUENJX1JFUV9JUlFfSU5ERVgpIHsKKwkJ cmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmZpb19wY2lfY291 bnRfZGV2cyhzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdm9pZCAqZGF0YSkKK3sKKwkoKihpbnQgKilk YXRhKSsrOworCXJldHVybiAwOworfQorCitzdHJ1Y3QgdmZpb19wY2lfZmlsbF9pbmZvIHsKKwlp bnQgbWF4OworCWludCBjdXI7CisJc3RydWN0IHZmaW9fcGNpX2RlcGVuZGVudF9kZXZpY2UgKmRl dmljZXM7Cit9OworCitzdGF0aWMgaW50IHZmaW9fcGNpX2ZpbGxfZGV2cyhzdHJ1Y3QgcGNpX2Rl diAqcGRldiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgdmZpb19wY2lfZmlsbF9pbmZvICpmaWxs ID0gZGF0YTsKKwlzdHJ1Y3QgaW9tbXVfZ3JvdXAgKmlvbW11X2dyb3VwOworCisJaWYgKGZpbGwt PmN1ciA9PSBmaWxsLT5tYXgpCisJCXJldHVybiAtRUFHQUlOOyAvKiBTb21ldGhpbmcgY2hhbmdl ZCwgdHJ5IGFnYWluICovCisKKwlpb21tdV9ncm91cCA9IGlvbW11X2dyb3VwX2dldCgmcGRldi0+ ZGV2KTsKKwlpZiAoIWlvbW11X2dyb3VwKQorCQlyZXR1cm4gLUVQRVJNOyAvKiBDYW5ub3QgcmVz ZXQgbm9uLWlzb2xhdGVkIGRldmljZXMgKi8KKworCWZpbGwtPmRldmljZXNbZmlsbC0+Y3VyXS5n cm91cF9pZCA9IGlvbW11X2dyb3VwX2lkKGlvbW11X2dyb3VwKTsKKwlmaWxsLT5kZXZpY2VzW2Zp bGwtPmN1cl0uc2VnbWVudCA9IHBjaV9kb21haW5fbnIocGRldi0+YnVzKTsKKwlmaWxsLT5kZXZp Y2VzW2ZpbGwtPmN1cl0uYnVzID0gcGRldi0+YnVzLT5udW1iZXI7CisJZmlsbC0+ZGV2aWNlc1tm aWxsLT5jdXJdLmRldmZuID0gcGRldi0+ZGV2Zm47CisJZmlsbC0+Y3VyKys7CisJaW9tbXVfZ3Jv dXBfcHV0KGlvbW11X2dyb3VwKTsKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IHZmaW9fcGNpX2dy b3VwX2VudHJ5IHsKKwlzdHJ1Y3QgdmZpb19ncm91cCAqZ3JvdXA7CisJaW50IGlkOworfTsKKwor c3RydWN0IHZmaW9fcGNpX2dyb3VwX2luZm8geworCWludCBjb3VudDsKKwlzdHJ1Y3QgdmZpb19w Y2lfZ3JvdXBfZW50cnkgKmdyb3VwczsKK307CisKK3N0YXRpYyBpbnQgdmZpb19wY2lfdmFsaWRh dGVfZGV2cyhzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgdmZp b19wY2lfZ3JvdXBfaW5mbyAqaW5mbyA9IGRhdGE7CisJc3RydWN0IGlvbW11X2dyb3VwICpncm91 cDsKKwlpbnQgaWQsIGk7CisKKwlncm91cCA9IGlvbW11X2dyb3VwX2dldCgmcGRldi0+ZGV2KTsK KwlpZiAoIWdyb3VwKQorCQlyZXR1cm4gLUVQRVJNOworCisJaWQgPSBpb21tdV9ncm91cF9pZChn cm91cCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgaW5mby0+Y291bnQ7IGkrKykKKwkJaWYgKGluZm8t Pmdyb3Vwc1tpXS5pZCA9PSBpZCkKKwkJCWJyZWFrOworCisJaW9tbXVfZ3JvdXBfcHV0KGdyb3Vw KTsKKworCXJldHVybiAoaSA9PSBpbmZvLT5jb3VudCkgPyAtRUlOVkFMIDogMDsKK30KKworc3Rh dGljIGJvb2wgdmZpb19wY2lfZGV2X2JlbG93X3Nsb3Qoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0 cnVjdCBwY2lfc2xvdCAqc2xvdCkKK3sKKwlmb3IgKDsgcGRldjsgcGRldiA9IHBkZXYtPmJ1cy0+ c2VsZikKKwkJaWYgKHBkZXYtPmJ1cyA9PSBzbG90LT5idXMpCisJCQlyZXR1cm4gKHBkZXYtPnNs b3QgPT0gc2xvdCk7CisJcmV0dXJuIGZhbHNlOworfQorCitzdHJ1Y3QgdmZpb19wY2lfd2Fsa19p bmZvIHsKKwlpbnQgKCpmbikoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHZvaWQgKmRhdGEpOworCXZv aWQgKmRhdGE7CisJc3RydWN0IHBjaV9kZXYgKnBkZXY7CisJYm9vbCBzbG90OworCWludCByZXQ7 Cit9OworCitzdGF0aWMgaW50IHZmaW9fcGNpX3dhbGtfd3JhcHBlcihzdHJ1Y3QgcGNpX2RldiAq cGRldiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgdmZpb19wY2lfd2Fsa19pbmZvICp3YWxrID0g ZGF0YTsKKworCWlmICghd2Fsay0+c2xvdCB8fCB2ZmlvX3BjaV9kZXZfYmVsb3dfc2xvdChwZGV2 LCB3YWxrLT5wZGV2LT5zbG90KSkKKwkJd2Fsay0+cmV0ID0gd2Fsay0+Zm4ocGRldiwgd2Fsay0+ ZGF0YSk7CisKKwlyZXR1cm4gd2Fsay0+cmV0OworfQorCitzdGF0aWMgaW50IHZmaW9fcGNpX2Zv cl9lYWNoX3Nsb3Rfb3JfYnVzKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCQkgaW50ICgqZm4p KHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCQkJICAgdm9pZCAqZGF0YSksIHZvaWQgKmRhdGEs CisJCQkJCSBib29sIHNsb3QpCit7CisJc3RydWN0IHZmaW9fcGNpX3dhbGtfaW5mbyB3YWxrID0g eworCQkuZm4gPSBmbiwgLmRhdGEgPSBkYXRhLCAucGRldiA9IHBkZXYsIC5zbG90ID0gc2xvdCwg LnJldCA9IDAsCisJfTsKKworCXBjaV93YWxrX2J1cyhwZGV2LT5idXMsIHZmaW9fcGNpX3dhbGtf d3JhcHBlciwgJndhbGspOworCisJcmV0dXJuIHdhbGsucmV0OworfQorCitzdGF0aWMgaW50IG1z aXhfbW1hcHBhYmxlX2NhcChzdHJ1Y3QgdmZpb19wY2lfZGV2aWNlICp2ZGV2LAorCQkJICAgICAg c3RydWN0IHZmaW9faW5mb19jYXAgKmNhcHMpCit7CisJc3RydWN0IHZmaW9faW5mb19jYXBfaGVh ZGVyIGhlYWRlciA9IHsKKwkJLmlkID0gVkZJT19SRUdJT05fSU5GT19DQVBfTVNJWF9NQVBQQUJM RSwKKwkJLnZlcnNpb24gPSAxCisJfTsKKworCXJldHVybiB2ZmlvX2luZm9fYWRkX2NhcGFiaWxp dHkoY2FwcywgJmhlYWRlciwgc2l6ZW9mKGhlYWRlcikpOworfQorCitpbnQgdmZpb19wY2lfcmVn aXN0ZXJfZGV2X3JlZ2lvbihzdHJ1Y3QgdmZpb19wY2lfZGV2aWNlICp2ZGV2LAorCQkJCSB1bnNp Z25lZCBpbnQgdHlwZSwgdW5zaWduZWQgaW50IHN1YnR5cGUsCisJCQkJIGNvbnN0IHN0cnVjdCB2 ZmlvX3BjaV9yZWdvcHMgKm9wcywKKwkJCQkgc2l6ZV90IHNpemUsIHUzMiBmbGFncywgdm9pZCAq ZGF0YSkKK3sKKwlzdHJ1Y3QgdmZpb19wY2lfcmVnaW9uICpyZWdpb247CisKKwlyZWdpb24gPSBr cmVhbGxvYyh2ZGV2LT5yZWdpb24sCisJCQkgICh2ZGV2LT5udW1fcmVnaW9ucyArIDEpICogc2l6 ZW9mKCpyZWdpb24pLAorCQkJICBHRlBfS0VSTkVMKTsKKwlpZiAoIXJlZ2lvbikKKwkJcmV0dXJu IC1FTk9NRU07CisKKwl2ZGV2LT5yZWdpb24gPSByZWdpb247CisJdmRldi0+cmVnaW9uW3ZkZXYt Pm51bV9yZWdpb25zXS50eXBlID0gdHlwZTsKKwl2ZGV2LT5yZWdpb25bdmRldi0+bnVtX3JlZ2lv bnNdLnN1YnR5cGUgPSBzdWJ0eXBlOworCXZkZXYtPnJlZ2lvblt2ZGV2LT5udW1fcmVnaW9uc10u b3BzID0gb3BzOworCXZkZXYtPnJlZ2lvblt2ZGV2LT5udW1fcmVnaW9uc10uc2l6ZSA9IHNpemU7 CisJdmRldi0+cmVnaW9uW3ZkZXYtPm51bV9yZWdpb25zXS5mbGFncyA9IGZsYWdzOworCXZkZXYt PnJlZ2lvblt2ZGV2LT5udW1fcmVnaW9uc10uZGF0YSA9IGRhdGE7CisKKwl2ZGV2LT5udW1fcmVn aW9ucysrOworCisJcmV0dXJuIDA7Cit9CisKK2xvbmcgdmZpb19wY2lfaW9jdGwodm9pZCAqZGV2 aWNlX2RhdGEsCisJCSAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQorewor CXN0cnVjdCB2ZmlvX3BjaV9kZXZpY2UgKnZkZXYgPSBkZXZpY2VfZGF0YTsKKwl1bnNpZ25lZCBs b25nIG1pbnN6OworCisJaWYgKGNtZCA9PSBWRklPX0RFVklDRV9HRVRfSU5GTykgeworCQlzdHJ1 Y3QgdmZpb19kZXZpY2VfaW5mbyBpbmZvOworCisJCW1pbnN6ID0gb2Zmc2V0b2ZlbmQoc3RydWN0 IHZmaW9fZGV2aWNlX2luZm8sIG51bV9pcnFzKTsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJmlu Zm8sICh2b2lkIF9fdXNlciAqKWFyZywgbWluc3opKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJ aWYgKGluZm8uYXJnc3ogPCBtaW5zeikKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWluZm8uZmxh Z3MgPSBWRklPX0RFVklDRV9GTEFHU19QQ0k7CisKKwkJaWYgKHZkZXYtPnJlc2V0X3dvcmtzKQor CQkJaW5mby5mbGFncyB8PSBWRklPX0RFVklDRV9GTEFHU19SRVNFVDsKKworCQlpbmZvLm51bV9y ZWdpb25zID0gVkZJT19QQ0lfTlVNX1JFR0lPTlMgKyB2ZGV2LT5udW1fcmVnaW9uczsKKwkJaW5m by5udW1faXJxcyA9IFZGSU9fUENJX05VTV9JUlFTOworCisJCXJldHVybiBjb3B5X3RvX3VzZXIo KHZvaWQgX191c2VyICopYXJnLCAmaW5mbywgbWluc3opID8KKwkJCS1FRkFVTFQgOiAwOworCisJ fSBlbHNlIGlmIChjbWQgPT0gVkZJT19ERVZJQ0VfR0VUX1JFR0lPTl9JTkZPKSB7CisJCXN0cnVj dCBwY2lfZGV2ICpwZGV2ID0gdmRldi0+cGRldjsKKwkJc3RydWN0IHZmaW9fcmVnaW9uX2luZm8g aW5mbzsKKwkJc3RydWN0IHZmaW9faW5mb19jYXAgY2FwcyA9IHsgLmJ1ZiA9IE5VTEwsIC5zaXpl ID0gMCB9OworCQlpbnQgaSwgcmV0OworCisJCW1pbnN6ID0gb2Zmc2V0b2ZlbmQoc3RydWN0IHZm aW9fcmVnaW9uX2luZm8sIG9mZnNldCk7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZpbmZvLCAo dm9pZCBfX3VzZXIgKilhcmcsIG1pbnN6KSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWlmIChp bmZvLmFyZ3N6IDwgbWluc3opCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlzd2l0Y2ggKGluZm8u aW5kZXgpIHsKKwkJY2FzZSBWRklPX1BDSV9DT05GSUdfUkVHSU9OX0lOREVYOgorCQkJaW5mby5v ZmZzZXQgPSBWRklPX1BDSV9JTkRFWF9UT19PRkZTRVQoaW5mby5pbmRleCk7CisJCQlpbmZvLnNp emUgPSBwZGV2LT5jZmdfc2l6ZTsKKwkJCWluZm8uZmxhZ3MgPSBWRklPX1JFR0lPTl9JTkZPX0ZM QUdfUkVBRCB8CisJCQkJICAgICBWRklPX1JFR0lPTl9JTkZPX0ZMQUdfV1JJVEU7CisJCQlicmVh azsKKwkJY2FzZSBWRklPX1BDSV9CQVIwX1JFR0lPTl9JTkRFWCAuLi4gVkZJT19QQ0lfQkFSNV9S RUdJT05fSU5ERVg6CisJCQlpbmZvLm9mZnNldCA9IFZGSU9fUENJX0lOREVYX1RPX09GRlNFVChp bmZvLmluZGV4KTsKKwkJCWluZm8uc2l6ZSA9IHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgaW5mby5p bmRleCk7CisJCQlpZiAoIWluZm8uc2l6ZSkgeworCQkJCWluZm8uZmxhZ3MgPSAwOworCQkJCWJy ZWFrOworCQkJfQorCisJCQlpbmZvLmZsYWdzID0gVkZJT19SRUdJT05fSU5GT19GTEFHX1JFQUQg fAorCQkJCSAgICAgVkZJT19SRUdJT05fSU5GT19GTEFHX1dSSVRFOworCQkJaWYgKHZkZXYtPmJh cl9tbWFwX3N1cHBvcnRlZFtpbmZvLmluZGV4XSkgeworCQkJCWluZm8uZmxhZ3MgfD0gVkZJT19S RUdJT05fSU5GT19GTEFHX01NQVA7CisJCQkJaWYgKGluZm8uaW5kZXggPT0gdmRldi0+bXNpeF9i YXIpIHsKKwkJCQkJcmV0ID0gbXNpeF9tbWFwcGFibGVfY2FwKHZkZXYsICZjYXBzKTsKKwkJCQkJ aWYgKHJldCkKKwkJCQkJCXJldHVybiByZXQ7CisJCQkJfQorCQkJfQorCisJCQlicmVhazsKKwkJ Y2FzZSBWRklPX1BDSV9ST01fUkVHSU9OX0lOREVYOgorCQl7CisJCQl2b2lkIF9faW9tZW0gKmlv OworCQkJc2l6ZV90IHNpemU7CisJCQl1MTYgb3JpZ19jbWQ7CisKKwkJCWluZm8ub2Zmc2V0ID0g VkZJT19QQ0lfSU5ERVhfVE9fT0ZGU0VUKGluZm8uaW5kZXgpOworCQkJaW5mby5mbGFncyA9IDA7 CisKKwkJCS8qIFJlcG9ydCB0aGUgQkFSIHNpemUsIG5vdCB0aGUgUk9NIHNpemUgKi8KKwkJCWlu Zm8uc2l6ZSA9IHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgaW5mby5pbmRleCk7CisJCQlpZiAoIWlu Zm8uc2l6ZSkgeworCQkJCS8qIFNoYWRvdyBST01zIGFwcGVhciBhcyBQQ0kgb3B0aW9uIFJPTXMg Ki8KKwkJCQlpZiAocGRldi0+cmVzb3VyY2VbUENJX1JPTV9SRVNPVVJDRV0uZmxhZ3MgJgorCQkJ CQkJCUlPUkVTT1VSQ0VfUk9NX1NIQURPVykKKwkJCQkJaW5mby5zaXplID0gMHgyMDAwMDsKKwkJ CQllbHNlCisJCQkJCWJyZWFrOworCQkJfQorCisJCQkvKgorCQkJICogSXMgaXQgcmVhbGx5IHRo ZXJlPyAgRW5hYmxlIG1lbW9yeSBkZWNvZGUgZm9yCisJCQkgKiBpbXBsaWNpdCBhY2Nlc3MgaW4g cGNpX21hcF9yb20oKS4KKwkJCSAqLworCQkJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgUENJ X0NPTU1BTkQsICZvcmlnX2NtZCk7CisJCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQocGRldiwgUENJ X0NPTU1BTkQsCisJCQkJCSAgICAgIG9yaWdfY21kIHwgUENJX0NPTU1BTkRfTUVNT1JZKTsKKwor CQkJaW8gPSBwY2lfbWFwX3JvbShwZGV2LCAmc2l6ZSk7CisJCQlpZiAoaW8pIHsKKwkJCQlpbmZv LmZsYWdzID0gVkZJT19SRUdJT05fSU5GT19GTEFHX1JFQUQ7CisJCQkJcGNpX3VubWFwX3JvbShw ZGV2LCBpbyk7CisJCQl9IGVsc2UgeworCQkJCWluZm8uc2l6ZSA9IDA7CisJCQl9CisKKwkJCXBj aV93cml0ZV9jb25maWdfd29yZChwZGV2LCBQQ0lfQ09NTUFORCwgb3JpZ19jbWQpOworCQkJYnJl YWs7CisJCX0KKwkJY2FzZSBWRklPX1BDSV9WR0FfUkVHSU9OX0lOREVYOgorCQkJaWYgKCF2ZGV2 LT5oYXNfdmdhKQorCQkJCXJldHVybiAtRUlOVkFMOworCisJCQlpbmZvLm9mZnNldCA9IFZGSU9f UENJX0lOREVYX1RPX09GRlNFVChpbmZvLmluZGV4KTsKKwkJCWluZm8uc2l6ZSA9IDB4YzAwMDA7 CisJCQlpbmZvLmZsYWdzID0gVkZJT19SRUdJT05fSU5GT19GTEFHX1JFQUQgfAorCQkJCSAgICAg VkZJT19SRUdJT05fSU5GT19GTEFHX1dSSVRFOworCisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJ eworCQkJc3RydWN0IHZmaW9fcmVnaW9uX2luZm9fY2FwX3R5cGUgY2FwX3R5cGUgPSB7CisJCQkJ CS5oZWFkZXIuaWQgPSBWRklPX1JFR0lPTl9JTkZPX0NBUF9UWVBFLAorCQkJCQkuaGVhZGVyLnZl cnNpb24gPSAxIH07CisKKwkJCWlmIChpbmZvLmluZGV4ID49CisJCQkgICAgVkZJT19QQ0lfTlVN X1JFR0lPTlMgKyB2ZGV2LT5udW1fcmVnaW9ucykKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWlu Zm8uaW5kZXggPSBhcnJheV9pbmRleF9ub3NwZWMoaW5mby5pbmRleCwKKwkJCQkJCQlWRklPX1BD SV9OVU1fUkVHSU9OUyArCisJCQkJCQkJdmRldi0+bnVtX3JlZ2lvbnMpOworCisJCQlpID0gaW5m by5pbmRleCAtIFZGSU9fUENJX05VTV9SRUdJT05TOworCisJCQlpbmZvLm9mZnNldCA9IFZGSU9f UENJX0lOREVYX1RPX09GRlNFVChpbmZvLmluZGV4KTsKKwkJCWluZm8uc2l6ZSA9IHZkZXYtPnJl Z2lvbltpXS5zaXplOworCQkJaW5mby5mbGFncyA9IHZkZXYtPnJlZ2lvbltpXS5mbGFnczsKKwor CQkJY2FwX3R5cGUudHlwZSA9IHZkZXYtPnJlZ2lvbltpXS50eXBlOworCQkJY2FwX3R5cGUuc3Vi dHlwZSA9IHZkZXYtPnJlZ2lvbltpXS5zdWJ0eXBlOworCisJCQlyZXQgPSB2ZmlvX2luZm9fYWRk X2NhcGFiaWxpdHkoJmNhcHMsICZjYXBfdHlwZS5oZWFkZXIsCisJCQkJCQkgICAgICAgc2l6ZW9m KGNhcF90eXBlKSk7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiByZXQ7CisKKwkJCWlmICh2ZGV2 LT5yZWdpb25baV0ub3BzLT5hZGRfY2FwYWJpbGl0eSkgeworCQkJCXJldCA9IHZkZXYtPnJlZ2lv bltpXS5vcHMtPmFkZF9jYXBhYmlsaXR5KHZkZXYsCisJCQkJCQkmdmRldi0+cmVnaW9uW2ldLCAm Y2Fwcyk7CisJCQkJaWYgKHJldCkKKwkJCQkJcmV0dXJuIHJldDsKKwkJCX0KKwkJfQorCQl9CisK KwkJaWYgKGNhcHMuc2l6ZSkgeworCQkJaW5mby5mbGFncyB8PSBWRklPX1JFR0lPTl9JTkZPX0ZM QUdfQ0FQUzsKKwkJCWlmIChpbmZvLmFyZ3N6IDwgc2l6ZW9mKGluZm8pICsgY2Fwcy5zaXplKSB7 CisJCQkJaW5mby5hcmdzeiA9IHNpemVvZihpbmZvKSArIGNhcHMuc2l6ZTsKKwkJCQlpbmZvLmNh cF9vZmZzZXQgPSAwOworCQkJfSBlbHNlIHsKKwkJCQl2ZmlvX2luZm9fY2FwX3NoaWZ0KCZjYXBz LCBzaXplb2YoaW5mbykpOworCQkJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJn ICsKKwkJCQkJCSAgc2l6ZW9mKGluZm8pLCBjYXBzLmJ1ZiwKKwkJCQkJCSAgY2Fwcy5zaXplKSkg eworCQkJCQlrZnJlZShjYXBzLmJ1Zik7CisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCX0KKwkJ CQlpbmZvLmNhcF9vZmZzZXQgPSBzaXplb2YoaW5mbyk7CisJCQl9CisKKwkJCWtmcmVlKGNhcHMu YnVmKTsKKwkJfQorCisJCXJldHVybiBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAm aW5mbywgbWluc3opID8KKwkJCS1FRkFVTFQgOiAwOworCisJfSBlbHNlIGlmIChjbWQgPT0gVkZJ T19ERVZJQ0VfR0VUX0lSUV9JTkZPKSB7CisJCXN0cnVjdCB2ZmlvX2lycV9pbmZvIGluZm87CisK KwkJbWluc3ogPSBvZmZzZXRvZmVuZChzdHJ1Y3QgdmZpb19pcnFfaW5mbywgY291bnQpOworCisJ CWlmIChjb3B5X2Zyb21fdXNlcigmaW5mbywgKHZvaWQgX191c2VyICopYXJnLCBtaW5zeikpCisJ CQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiAoaW5mby5hcmdzeiA8IG1pbnN6IHx8IGluZm8uaW5k ZXggPj0gVkZJT19QQ0lfTlVNX0lSUVMpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlzd2l0Y2gg KGluZm8uaW5kZXgpIHsKKwkJY2FzZSBWRklPX1BDSV9JTlRYX0lSUV9JTkRFWCAuLi4gVkZJT19Q Q0lfTVNJWF9JUlFfSU5ERVg6CisJCWNhc2UgVkZJT19QQ0lfUkVRX0lSUV9JTkRFWDoKKwkJCWJy ZWFrOworCQljYXNlIFZGSU9fUENJX0VSUl9JUlFfSU5ERVg6CisJCQlpZiAocGNpX2lzX3BjaWUo dmRldi0+cGRldikpCisJCQkJYnJlYWs7CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCQlkZWZhdWx0 OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlpbmZvLmZsYWdzID0gVkZJT19JUlFfSU5G T19FVkVOVEZEOworCisJCWluZm8uY291bnQgPSB2ZmlvX3BjaV9nZXRfaXJxX2NvdW50KHZkZXYs IGluZm8uaW5kZXgpOworCisJCWlmIChpbmZvLmluZGV4ID09IFZGSU9fUENJX0lOVFhfSVJRX0lO REVYKQorCQkJaW5mby5mbGFncyB8PSAoVkZJT19JUlFfSU5GT19NQVNLQUJMRSB8CisJCQkJICAg ICAgIFZGSU9fSVJRX0lORk9fQVVUT01BU0tFRCk7CisJCWVsc2UKKwkJCWluZm8uZmxhZ3MgfD0g VkZJT19JUlFfSU5GT19OT1JFU0laRTsKKworCQlyZXR1cm4gY29weV90b191c2VyKCh2b2lkIF9f dXNlciAqKWFyZywgJmluZm8sIG1pbnN6KSA/CisJCQktRUZBVUxUIDogMDsKKworCX0gZWxzZSBp ZiAoY21kID09IFZGSU9fREVWSUNFX1NFVF9JUlFTKSB7CisJCXN0cnVjdCB2ZmlvX2lycV9zZXQg aGRyOworCQl1OCAqZGF0YSA9IE5VTEw7CisJCWludCBtYXgsIHJldCA9IDA7CisJCXNpemVfdCBk YXRhX3NpemUgPSAwOworCisJCW1pbnN6ID0gb2Zmc2V0b2ZlbmQoc3RydWN0IHZmaW9faXJxX3Nl dCwgY291bnQpOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmaGRyLCAodm9pZCBfX3VzZXIgKilh cmcsIG1pbnN6KSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCW1heCA9IHZmaW9fcGNpX2dldF9p cnFfY291bnQodmRldiwgaGRyLmluZGV4KTsKKworCQlyZXQgPSB2ZmlvX3NldF9pcnFzX3ZhbGlk YXRlX2FuZF9wcmVwYXJlKCZoZHIsIG1heCwKKwkJCQkJCSBWRklPX1BDSV9OVU1fSVJRUywgJmRh dGFfc2l6ZSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCWlmIChkYXRhX3NpemUp IHsKKwkJCWRhdGEgPSBtZW1kdXBfdXNlcigodm9pZCBfX3VzZXIgKikoYXJnICsgbWluc3opLAor CQkJCQkgICAgZGF0YV9zaXplKTsKKwkJCWlmIChJU19FUlIoZGF0YSkpCisJCQkJcmV0dXJuIFBU Ul9FUlIoZGF0YSk7CisJCX0KKworCQltdXRleF9sb2NrKCZ2ZGV2LT5pZ2F0ZSk7CisKKwkJcmV0 ID0gdmZpb19wY2lfc2V0X2lycXNfaW9jdGwodmRldiwgaGRyLmZsYWdzLCBoZHIuaW5kZXgsCisJ CQkJCSAgICAgIGhkci5zdGFydCwgaGRyLmNvdW50LCBkYXRhKTsKKworCQltdXRleF91bmxvY2so JnZkZXYtPmlnYXRlKTsKKwkJa2ZyZWUoZGF0YSk7CisKKwkJcmV0dXJuIHJldDsKKworCX0gZWxz ZSBpZiAoY21kID09IFZGSU9fREVWSUNFX1JFU0VUKSB7CisJCXJldHVybiB2ZGV2LT5yZXNldF93 b3JrcyA/CisJCQlwY2lfdHJ5X3Jlc2V0X2Z1bmN0aW9uKHZkZXYtPnBkZXYpIDogLUVJTlZBTDsK KworCX0gZWxzZSBpZiAoY21kID09IFZGSU9fREVWSUNFX0dFVF9QQ0lfSE9UX1JFU0VUX0lORk8p IHsKKwkJc3RydWN0IHZmaW9fcGNpX2hvdF9yZXNldF9pbmZvIGhkcjsKKwkJc3RydWN0IHZmaW9f cGNpX2ZpbGxfaW5mbyBmaWxsID0geyAwIH07CisJCXN0cnVjdCB2ZmlvX3BjaV9kZXBlbmRlbnRf ZGV2aWNlICpkZXZpY2VzID0gTlVMTDsKKwkJYm9vbCBzbG90ID0gZmFsc2U7CisJCWludCByZXQg PSAwOworCisJCW1pbnN6ID0gb2Zmc2V0b2ZlbmQoc3RydWN0IHZmaW9fcGNpX2hvdF9yZXNldF9p bmZvLCBjb3VudCk7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZoZHIsICh2b2lkIF9fdXNlciAq KWFyZywgbWluc3opKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJaWYgKGhkci5hcmdzeiA8IG1p bnN6KQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJaGRyLmZsYWdzID0gMDsKKworCQkvKiBDYW4g d2UgZG8gYSBzbG90IG9yIGJ1cyByZXNldCBvciBuZWl0aGVyPyAqLworCQlpZiAoIXBjaV9wcm9i ZV9yZXNldF9zbG90KHZkZXYtPnBkZXYtPnNsb3QpKQorCQkJc2xvdCA9IHRydWU7CisJCWVsc2Ug aWYgKHBjaV9wcm9iZV9yZXNldF9idXModmRldi0+cGRldi0+YnVzKSkKKwkJCXJldHVybiAtRU5P REVWOworCisJCS8qIEhvdyBtYW55IGRldmljZXMgYXJlIGFmZmVjdGVkPyAqLworCQlyZXQgPSB2 ZmlvX3BjaV9mb3JfZWFjaF9zbG90X29yX2J1cyh2ZGV2LT5wZGV2LAorCQkJCQkJICAgIHZmaW9f cGNpX2NvdW50X2RldnMsCisJCQkJCQkgICAgJmZpbGwubWF4LCBzbG90KTsKKwkJaWYgKHJldCkK KwkJCXJldHVybiByZXQ7CisKKwkJV0FSTl9PTighZmlsbC5tYXgpOyAvKiBTaG91bGQgYWx3YXlz IGJlIGF0IGxlYXN0IG9uZSAqLworCisJCS8qCisJCSAqIElmIHRoZXJlJ3MgZW5vdWdoIHNwYWNl LCBmaWxsIGl0IG5vdywgb3RoZXJ3aXNlIHJldHVybgorCQkgKiAtRU5PU1BDIGFuZCB0aGUgbnVt YmVyIG9mIGRldmljZXMgYWZmZWN0ZWQuCisJCSAqLworCQlpZiAoaGRyLmFyZ3N6IDwgc2l6ZW9m KGhkcikgKyAoZmlsbC5tYXggKiBzaXplb2YoKmRldmljZXMpKSkgeworCQkJcmV0ID0gLUVOT1NQ QzsKKwkJCWhkci5jb3VudCA9IGZpbGwubWF4OworCQkJZ290byByZXNldF9pbmZvX2V4aXQ7CisJ CX0KKworCQlkZXZpY2VzID0ga2NhbGxvYyhmaWxsLm1heCwgc2l6ZW9mKCpkZXZpY2VzKSwgR0ZQ X0tFUk5FTCk7CisJCWlmICghZGV2aWNlcykKKwkJCXJldHVybiAtRU5PTUVNOworCisJCWZpbGwu ZGV2aWNlcyA9IGRldmljZXM7CisKKwkJcmV0ID0gdmZpb19wY2lfZm9yX2VhY2hfc2xvdF9vcl9i dXModmRldi0+cGRldiwKKwkJCQkJCSAgICB2ZmlvX3BjaV9maWxsX2RldnMsCisJCQkJCQkgICAg JmZpbGwsIHNsb3QpOworCisJCS8qCisJCSAqIElmIGEgZGV2aWNlIHdhcyByZW1vdmVkIGJldHdl ZW4gY291bnRpbmcgYW5kIGZpbGxpbmcsCisJCSAqIHdlIG1heSBjb21lIHVwIHNob3J0IG9mIGZp bGwubWF4LiAgSWYgYSBkZXZpY2Ugd2FzCisJCSAqIGFkZGVkLCB3ZSdsbCBoYXZlIGEgcmV0dXJu IG9mIC1FQUdBSU4gYWJvdmUuCisJCSAqLworCQlpZiAoIXJldCkKKwkJCWhkci5jb3VudCA9IGZp bGwuY3VyOworCityZXNldF9pbmZvX2V4aXQ6CisJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191 c2VyICopYXJnLCAmaGRyLCBtaW5zeikpCisJCQlyZXQgPSAtRUZBVUxUOworCisJCWlmICghcmV0 KSB7CisJCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKShhcmcgKyBtaW5zeiksIGRl dmljZXMsCisJCQkJCSBoZHIuY291bnQgKiBzaXplb2YoKmRldmljZXMpKSkKKwkJCQlyZXQgPSAt RUZBVUxUOworCQl9CisKKwkJa2ZyZWUoZGV2aWNlcyk7CisJCXJldHVybiByZXQ7CisKKwl9IGVs c2UgaWYgKGNtZCA9PSBWRklPX0RFVklDRV9QQ0lfSE9UX1JFU0VUKSB7CisJCXN0cnVjdCB2Zmlv X3BjaV9ob3RfcmVzZXQgaGRyOworCQlpbnQzMl90ICpncm91cF9mZHM7CisJCXN0cnVjdCB2Zmlv X3BjaV9ncm91cF9lbnRyeSAqZ3JvdXBzOworCQlzdHJ1Y3QgdmZpb19wY2lfZ3JvdXBfaW5mbyBp bmZvOworCQlib29sIHNsb3QgPSBmYWxzZTsKKwkJaW50IGksIGNvdW50ID0gMCwgcmV0ID0gMDsK KworCQltaW5zeiA9IG9mZnNldG9mZW5kKHN0cnVjdCB2ZmlvX3BjaV9ob3RfcmVzZXQsIGNvdW50 KTsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJmhkciwgKHZvaWQgX191c2VyICopYXJnLCBtaW5z eikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiAoaGRyLmFyZ3N6IDwgbWluc3ogfHwgaGRy LmZsYWdzKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJLyogQ2FuIHdlIGRvIGEgc2xvdCBvciBi dXMgcmVzZXQgb3IgbmVpdGhlcj8gKi8KKwkJaWYgKCFwY2lfcHJvYmVfcmVzZXRfc2xvdCh2ZGV2 LT5wZGV2LT5zbG90KSkKKwkJCXNsb3QgPSB0cnVlOworCQllbHNlIGlmIChwY2lfcHJvYmVfcmVz ZXRfYnVzKHZkZXYtPnBkZXYtPmJ1cykpCisJCQlyZXR1cm4gLUVOT0RFVjsKKworCQkvKgorCQkg KiBXZSBjYW4ndCBsZXQgdXNlcnNwYWNlIGdpdmUgdXMgYW4gYXJiaXRyYXJpbHkgbGFyZ2UKKwkJ ICogYnVmZmVyIHRvIGNvcHksIHNvIHZlcmlmeSBob3cgbWFueSB3ZSB0aGluayB0aGVyZQorCQkg KiBjb3VsZCBiZS4gIE5vdGUgZ3JvdXBzIGNhbiBoYXZlIG11bHRpcGxlIGRldmljZXMgc28KKwkJ ICogb25lIGdyb3VwIHBlciBkZXZpY2UgaXMgdGhlIG1heC4KKwkJICovCisJCXJldCA9IHZmaW9f cGNpX2Zvcl9lYWNoX3Nsb3Rfb3JfYnVzKHZkZXYtPnBkZXYsCisJCQkJCQkgICAgdmZpb19wY2lf Y291bnRfZGV2cywKKwkJCQkJCSAgICAmY291bnQsIHNsb3QpOworCQlpZiAocmV0KQorCQkJcmV0 dXJuIHJldDsKKworCQkvKiBTb21ld2hlcmUgYmV0d2VlbiAxIGFuZCBjb3VudCBpcyBPSyAqLwor CQlpZiAoIWhkci5jb3VudCB8fCBoZHIuY291bnQgPiBjb3VudCkKKwkJCXJldHVybiAtRUlOVkFM OworCisJCWdyb3VwX2ZkcyA9IGtjYWxsb2MoaGRyLmNvdW50LCBzaXplb2YoKmdyb3VwX2Zkcyks IEdGUF9LRVJORUwpOworCQlncm91cHMgPSBrY2FsbG9jKGhkci5jb3VudCwgc2l6ZW9mKCpncm91 cHMpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFncm91cF9mZHMgfHwgIWdyb3VwcykgeworCQkJa2Zy ZWUoZ3JvdXBfZmRzKTsKKwkJCWtmcmVlKGdyb3Vwcyk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJ fQorCisJCWlmIChjb3B5X2Zyb21fdXNlcihncm91cF9mZHMsICh2b2lkIF9fdXNlciAqKShhcmcg KyBtaW5zeiksCisJCQkJICAgaGRyLmNvdW50ICogc2l6ZW9mKCpncm91cF9mZHMpKSkgeworCQkJ a2ZyZWUoZ3JvdXBfZmRzKTsKKwkJCWtmcmVlKGdyb3Vwcyk7CisJCQlyZXR1cm4gLUVGQVVMVDsK KwkJfQorCisJCS8qCisJCSAqIEZvciBlYWNoIGdyb3VwX2ZkLCBnZXQgdGhlIGdyb3VwIHRocm91 Z2ggdGhlIHZmaW8gZXh0ZXJuYWwKKwkJICogdXNlciBpbnRlcmZhY2UgYW5kIHN0b3JlIHRoZSBn cm91cCBhbmQgaW9tbXUgSUQuICBUaGlzCisJCSAqIGVuc3VyZXMgdGhlIGdyb3VwIGlzIGhlbGQg YWNyb3NzIHRoZSByZXNldC4KKwkJICovCisJCWZvciAoaSA9IDA7IGkgPCBoZHIuY291bnQ7IGkr KykgeworCQkJc3RydWN0IHZmaW9fZ3JvdXAgKmdyb3VwOworCQkJc3RydWN0IGZkIGYgPSBmZGdl dChncm91cF9mZHNbaV0pOworCisJCQlpZiAoIWYuZmlsZSkgeworCQkJCXJldCA9IC1FQkFERjsK KwkJCQlicmVhazsKKwkJCX0KKworCQkJZ3JvdXAgPSB2ZmlvX2dyb3VwX2dldF9leHRlcm5hbF91 c2VyKGYuZmlsZSk7CisJCQlmZHB1dChmKTsKKwkJCWlmIChJU19FUlIoZ3JvdXApKSB7CisJCQkJ cmV0ID0gUFRSX0VSUihncm91cCk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWdyb3Vwc1tpXS5n cm91cCA9IGdyb3VwOworCQkJZ3JvdXBzW2ldLmlkID0gdmZpb19leHRlcm5hbF91c2VyX2lvbW11 X2lkKGdyb3VwKTsKKwkJfQorCisJCWtmcmVlKGdyb3VwX2Zkcyk7CisKKwkJLyogcmVsZWFzZSBy ZWZlcmVuY2UgdG8gZ3JvdXBzIG9uIGVycm9yICovCisJCWlmIChyZXQpCisJCQlnb3RvIGhvdF9y ZXNldF9yZWxlYXNlOworCisJCWluZm8uY291bnQgPSBoZHIuY291bnQ7CisJCWluZm8uZ3JvdXBz ID0gZ3JvdXBzOworCisJCS8qCisJCSAqIFRlc3Qgd2hldGhlciBhbGwgdGhlIGFmZmVjdGVkIGRl dmljZXMgYXJlIGNvbnRhaW5lZAorCQkgKiBieSB0aGUgc2V0IG9mIGdyb3VwcyBwcm92aWRlZCBi eSB0aGUgdXNlci4KKwkJICovCisJCXJldCA9IHZmaW9fcGNpX2Zvcl9lYWNoX3Nsb3Rfb3JfYnVz KHZkZXYtPnBkZXYsCisJCQkJCQkgICAgdmZpb19wY2lfdmFsaWRhdGVfZGV2cywKKwkJCQkJCSAg ICAmaW5mbywgc2xvdCk7CisJCWlmICghcmV0KQorCQkJLyogVXNlciBoYXMgYWNjZXNzLCBkbyB0 aGUgcmVzZXQgKi8KKwkJCXJldCA9IHBjaV9yZXNldF9idXModmRldi0+cGRldik7CisKK2hvdF9y ZXNldF9yZWxlYXNlOgorCQlmb3IgKGktLTsgaSA+PSAwOyBpLS0pCisJCQl2ZmlvX2dyb3VwX3B1 dF9leHRlcm5hbF91c2VyKGdyb3Vwc1tpXS5ncm91cCk7CisKKwkJa2ZyZWUoZ3JvdXBzKTsKKwkJ cmV0dXJuIHJldDsKKwl9IGVsc2UgaWYgKGNtZCA9PSBWRklPX0RFVklDRV9JT0VWRU5URkQpIHsK KwkJc3RydWN0IHZmaW9fZGV2aWNlX2lvZXZlbnRmZCBpb2V2ZW50ZmQ7CisJCWludCBjb3VudDsK KworCQltaW5zeiA9IG9mZnNldG9mZW5kKHN0cnVjdCB2ZmlvX2RldmljZV9pb2V2ZW50ZmQsIGZk KTsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJmlvZXZlbnRmZCwgKHZvaWQgX191c2VyICopYXJn LCBtaW5zeikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiAoaW9ldmVudGZkLmFyZ3N6IDwg bWluc3opCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlpZiAoaW9ldmVudGZkLmZsYWdzICYgflZG SU9fREVWSUNFX0lPRVZFTlRGRF9TSVpFX01BU0spCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlj b3VudCA9IGlvZXZlbnRmZC5mbGFncyAmIFZGSU9fREVWSUNFX0lPRVZFTlRGRF9TSVpFX01BU0s7 CisKKwkJaWYgKGh3ZWlnaHQ4KGNvdW50KSAhPSAxIHx8IGlvZXZlbnRmZC5mZCA8IC0xKQorCQkJ cmV0dXJuIC1FSU5WQUw7CisKKwkJcmV0dXJuIHZmaW9fcGNpX2lvZXZlbnRmZCh2ZGV2LCBpb2V2 ZW50ZmQub2Zmc2V0LAorCQkJCQkgIGlvZXZlbnRmZC5kYXRhLCBjb3VudCwgaW9ldmVudGZkLmZk KTsKKwl9CisKKwlyZXR1cm4gLUVOT1RUWTsKK30KKworc3RhdGljIHNzaXplX3QgdmZpb19wY2lf cncodm9pZCAqZGV2aWNlX2RhdGEsIGNoYXIgX191c2VyICpidWYsCisJCQkgICBzaXplX3QgY291 bnQsIGxvZmZfdCAqcHBvcywgYm9vbCBpc3dyaXRlKQoreworCXVuc2lnbmVkIGludCBpbmRleCA9 IFZGSU9fUENJX09GRlNFVF9UT19JTkRFWCgqcHBvcyk7CisJc3RydWN0IHZmaW9fcGNpX2Rldmlj ZSAqdmRldiA9IGRldmljZV9kYXRhOworCisJaWYgKGluZGV4ID49IFZGSU9fUENJX05VTV9SRUdJ T05TICsgdmRldi0+bnVtX3JlZ2lvbnMpCisJCXJldHVybiAtRUlOVkFMOworCisJc3dpdGNoIChp bmRleCkgeworCWNhc2UgVkZJT19QQ0lfQ09ORklHX1JFR0lPTl9JTkRFWDoKKwkJcmV0dXJuIHZm aW9fcGNpX2NvbmZpZ19ydyh2ZGV2LCBidWYsIGNvdW50LCBwcG9zLCBpc3dyaXRlKTsKKworCWNh c2UgVkZJT19QQ0lfUk9NX1JFR0lPTl9JTkRFWDoKKwkJaWYgKGlzd3JpdGUpCisJCQlyZXR1cm4g LUVJTlZBTDsKKwkJcmV0dXJuIHZmaW9fcGNpX2Jhcl9ydyh2ZGV2LCBidWYsIGNvdW50LCBwcG9z LCBmYWxzZSk7CisKKwljYXNlIFZGSU9fUENJX0JBUjBfUkVHSU9OX0lOREVYIC4uLiBWRklPX1BD SV9CQVI1X1JFR0lPTl9JTkRFWDoKKwkJcmV0dXJuIHZmaW9fcGNpX2Jhcl9ydyh2ZGV2LCBidWYs IGNvdW50LCBwcG9zLCBpc3dyaXRlKTsKKworCWNhc2UgVkZJT19QQ0lfVkdBX1JFR0lPTl9JTkRF WDoKKwkJcmV0dXJuIHZmaW9fcGNpX3ZnYV9ydyh2ZGV2LCBidWYsIGNvdW50LCBwcG9zLCBpc3dy aXRlKTsKKwlkZWZhdWx0OgorCQlpbmRleCAtPSBWRklPX1BDSV9OVU1fUkVHSU9OUzsKKwkJcmV0 dXJuIHZkZXYtPnJlZ2lvbltpbmRleF0ub3BzLT5ydyh2ZGV2LCBidWYsCisJCQkJCQkgICBjb3Vu dCwgcHBvcywgaXN3cml0ZSk7CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3NzaXplX3Qg dmZpb19wY2lfcmVhZCh2b2lkICpkZXZpY2VfZGF0YSwgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCSAg ICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJaWYgKCFjb3VudCkKKwkJcmV0dXJu IDA7CisKKwlyZXR1cm4gdmZpb19wY2lfcncoZGV2aWNlX2RhdGEsIGJ1ZiwgY291bnQsIHBwb3Ms IGZhbHNlKTsKK30KKworc3NpemVfdCB2ZmlvX3BjaV93cml0ZSh2b2lkICpkZXZpY2VfZGF0YSwg Y29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCSAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpw cG9zKQoreworCWlmICghY291bnQpCisJCXJldHVybiAwOworCisJcmV0dXJuIHZmaW9fcGNpX3J3 KGRldmljZV9kYXRhLCAoY2hhciBfX3VzZXIgKilidWYsIGNvdW50LCBwcG9zLCB0cnVlKTsKK30K KworaW50IHZmaW9fcGNpX21tYXAodm9pZCAqZGV2aWNlX2RhdGEsIHN0cnVjdCB2bV9hcmVhX3N0 cnVjdCAqdm1hKQoreworCXN0cnVjdCB2ZmlvX3BjaV9kZXZpY2UgKnZkZXYgPSBkZXZpY2VfZGF0 YTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHZkZXYtPnBkZXY7CisJdW5zaWduZWQgaW50IGlu ZGV4OworCXU2NCBwaHlzX2xlbiwgcmVxX2xlbiwgcGdvZmYsIHJlcV9zdGFydDsKKwlpbnQgcmV0 OworCisJaW5kZXggPSB2bWEtPnZtX3Bnb2ZmID4+IChWRklPX1BDSV9PRkZTRVRfU0hJRlQgLSBQ QUdFX1NISUZUKTsKKworCWlmICh2bWEtPnZtX2VuZCA8IHZtYS0+dm1fc3RhcnQpCisJCXJldHVy biAtRUlOVkFMOworCWlmICgodm1hLT52bV9mbGFncyAmIFZNX1NIQVJFRCkgPT0gMCkKKwkJcmV0 dXJuIC1FSU5WQUw7CisJaWYgKGluZGV4ID49IFZGSU9fUENJX05VTV9SRUdJT05TKSB7CisJCWlu dCByZWdudW0gPSBpbmRleCAtIFZGSU9fUENJX05VTV9SRUdJT05TOworCQlzdHJ1Y3QgdmZpb19w Y2lfcmVnaW9uICpyZWdpb24gPSB2ZGV2LT5yZWdpb24gKyByZWdudW07CisKKwkJaWYgKHJlZ2lv biAmJiByZWdpb24tPm9wcyAmJiByZWdpb24tPm9wcy0+bW1hcCAmJgorCQkgICAgKHJlZ2lvbi0+ ZmxhZ3MgJiBWRklPX1JFR0lPTl9JTkZPX0ZMQUdfTU1BUCkpCisJCQlyZXR1cm4gcmVnaW9uLT5v cHMtPm1tYXAodmRldiwgcmVnaW9uLCB2bWEpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYg KGluZGV4ID49IFZGSU9fUENJX1JPTV9SRUdJT05fSU5ERVgpCisJCXJldHVybiAtRUlOVkFMOwor CWlmICghdmRldi0+YmFyX21tYXBfc3VwcG9ydGVkW2luZGV4XSkKKwkJcmV0dXJuIC1FSU5WQUw7 CisKKwlwaHlzX2xlbiA9IFBBR0VfQUxJR04ocGNpX3Jlc291cmNlX2xlbihwZGV2LCBpbmRleCkp OworCXJlcV9sZW4gPSB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQ7CisJcGdvZmYgPSB2bWEt PnZtX3Bnb2ZmICYKKwkJKCgxVSA8PCAoVkZJT19QQ0lfT0ZGU0VUX1NISUZUIC0gUEFHRV9TSElG VCkpIC0gMSk7CisJcmVxX3N0YXJ0ID0gcGdvZmYgPDwgUEFHRV9TSElGVDsKKworCWlmIChyZXFf c3RhcnQgKyByZXFfbGVuID4gcGh5c19sZW4pCisJCXJldHVybiAtRUlOVkFMOworCisJLyoKKwkg KiBFdmVuIHRob3VnaCB3ZSBkb24ndCBtYWtlIHVzZSBvZiB0aGUgYmFybWFwIGZvciB0aGUgbW1h cCwKKwkgKiB3ZSBuZWVkIHRvIHJlcXVlc3QgdGhlIHJlZ2lvbiBhbmQgdGhlIGJhcm1hcCB0cmFj a3MgdGhhdC4KKwkgKi8KKwlpZiAoIXZkZXYtPmJhcm1hcFtpbmRleF0pIHsKKwkJcmV0ID0gcGNp X3JlcXVlc3Rfc2VsZWN0ZWRfcmVnaW9ucyhwZGV2LAorCQkJCQkJICAgMSA8PCBpbmRleCwKKwkJ CQkJCSAgIHBjaV9kZXZfZHJpdmVyKHBkZXYpLT5uYW1lKTsKKwkJaWYgKHJldCkKKwkJCXJldHVy biByZXQ7CisKKwkJdmRldi0+YmFybWFwW2luZGV4XSA9IHBjaV9pb21hcChwZGV2LCBpbmRleCwg MCk7CisJCWlmICghdmRldi0+YmFybWFwW2luZGV4XSkgeworCQkJcGNpX3JlbGVhc2Vfc2VsZWN0 ZWRfcmVnaW9ucyhwZGV2LCAxIDw8IGluZGV4KTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJ fQorCisJdm1hLT52bV9wcml2YXRlX2RhdGEgPSB2ZGV2OworCXZtYS0+dm1fcGFnZV9wcm90ID0g cGdwcm90X25vbmNhY2hlZCh2bWEtPnZtX3BhZ2VfcHJvdCk7CisJdm1hLT52bV9wZ29mZiA9IChw Y2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgaW5kZXgpID4+IFBBR0VfU0hJRlQpICsgcGdvZmY7CisK KwlyZXR1cm4gcmVtYXBfcGZuX3JhbmdlKHZtYSwgdm1hLT52bV9zdGFydCwgdm1hLT52bV9wZ29m ZiwKKwkJCSAgICAgICByZXFfbGVuLCB2bWEtPnZtX3BhZ2VfcHJvdCk7Cit9CisKK3ZvaWQgdmZp b19wY2lfcmVxdWVzdCh2b2lkICpkZXZpY2VfZGF0YSwgdW5zaWduZWQgaW50IGNvdW50KQorewor CXN0cnVjdCB2ZmlvX3BjaV9kZXZpY2UgKnZkZXYgPSBkZXZpY2VfZGF0YTsKKworCW11dGV4X2xv Y2soJnZkZXYtPmlnYXRlKTsKKworCWlmICh2ZGV2LT5yZXFfdHJpZ2dlcikgeworCQlpZiAoIShj b3VudCAlIDEwKSkKKwkJCWRldl9ub3RpY2VfcmF0ZWxpbWl0ZWQoJnZkZXYtPnBkZXYtPmRldiwK KwkJCQkiUmVsYXlpbmcgZGV2aWNlIHJlcXVlc3QgdG8gdXNlciAoIyV1KVxuIiwKKwkJCQljb3Vu dCk7CisJCWV2ZW50ZmRfc2lnbmFsKHZkZXYtPnJlcV90cmlnZ2VyLCAxKTsKKwl9IGVsc2UgaWYg KGNvdW50ID09IDApIHsKKwkJZGV2X3dhcm4oJnZkZXYtPnBkZXYtPmRldiwKKwkJCSJObyBkZXZp Y2UgcmVxdWVzdCBjaGFubmVsIHJlZ2lzdGVyZWQsIGJsb2NrZWQgdW50aWwgcmVsZWFzZWQgYnkg dXNlclxuIik7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZ2ZGV2LT5pZ2F0ZSk7Cit9CisKK3N0YXRp YyBwY2lfZXJzX3Jlc3VsdF90IHZmaW9fcGNpX2Flcl9lcnJfZGV0ZWN0ZWQoc3RydWN0IHBjaV9k ZXYgKnBkZXYsCisJCQkJCQkgIHBjaV9jaGFubmVsX3N0YXRlX3Qgc3RhdGUpCit7CisJc3RydWN0 IHZmaW9fcGNpX2RldmljZSAqdmRldjsKKwlzdHJ1Y3QgdmZpb19kZXZpY2UgKmRldmljZTsKKwor CWRldmljZSA9IHZmaW9fZGV2aWNlX2dldF9mcm9tX2RldigmcGRldi0+ZGV2KTsKKwlpZiAoZGV2 aWNlID09IE5VTEwpCisJCXJldHVybiBQQ0lfRVJTX1JFU1VMVF9ESVNDT05ORUNUOworCisJdmRl diA9IHZmaW9fZGV2aWNlX2RhdGEoZGV2aWNlKTsKKwlpZiAodmRldiA9PSBOVUxMKSB7CisJCXZm aW9fZGV2aWNlX3B1dChkZXZpY2UpOworCQlyZXR1cm4gUENJX0VSU19SRVNVTFRfRElTQ09OTkVD VDsKKwl9CisKKwltdXRleF9sb2NrKCZ2ZGV2LT5pZ2F0ZSk7CisKKwlpZiAodmRldi0+ZXJyX3Ry aWdnZXIpCisJCWV2ZW50ZmRfc2lnbmFsKHZkZXYtPmVycl90cmlnZ2VyLCAxKTsKKworCW11dGV4 X3VubG9jaygmdmRldi0+aWdhdGUpOworCisJdmZpb19kZXZpY2VfcHV0KGRldmljZSk7CisKKwly ZXR1cm4gUENJX0VSU19SRVNVTFRfQ0FOX1JFQ09WRVI7Cit9CisKK2NvbnN0IHN0cnVjdCBwY2lf ZXJyb3JfaGFuZGxlcnMgdmZpb19lcnJfaGFuZGxlcnMgPSB7CisJLmVycm9yX2RldGVjdGVkID0g dmZpb19wY2lfYWVyX2Vycl9kZXRlY3RlZCwKK307CisKK3N0YXRpYyBERUZJTkVfTVVURVgocmVm bGNrX2xvY2spOworCitzdGF0aWMgc3RydWN0IHZmaW9fcGNpX3JlZmxjayAqdmZpb19wY2lfcmVm bGNrX2FsbG9jKHZvaWQpCit7CisJc3RydWN0IHZmaW9fcGNpX3JlZmxjayAqcmVmbGNrOworCisJ cmVmbGNrID0ga3phbGxvYyhzaXplb2YoKnJlZmxjayksIEdGUF9LRVJORUwpOworCWlmICghcmVm bGNrKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCWtyZWZfaW5pdCgmcmVmbGNrLT5r cmVmKTsKKwltdXRleF9pbml0KCZyZWZsY2stPmxvY2spOworCisJcmV0dXJuIHJlZmxjazsKK30K Kworc3RhdGljIHZvaWQgdmZpb19wY2lfcmVmbGNrX2dldChzdHJ1Y3QgdmZpb19wY2lfcmVmbGNr ICpyZWZsY2spCit7CisJa3JlZl9nZXQoJnJlZmxjay0+a3JlZik7Cit9CisKK3N0YXRpYyBpbnQg dmZpb19wY2lfcmVmbGNrX2ZpbmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHZvaWQgKmRhdGEpCit7 CisJc3RydWN0IHZmaW9fcGNpX2RldmljZSAqdmRldiA9IGRhdGE7CisJc3RydWN0IHZmaW9fcGNp X3JlZmxjayAqKnByZWZsY2sgPSAmdmRldi0+cmVmbGNrOworCXN0cnVjdCB2ZmlvX2RldmljZSAq ZGV2aWNlOworCXN0cnVjdCB2ZmlvX3BjaV9kZXZpY2UgKnRtcDsKKworCWRldmljZSA9IHZmaW9f ZGV2aWNlX2dldF9mcm9tX2RldigmcGRldi0+ZGV2KTsKKwlpZiAoIWRldmljZSkKKwkJcmV0dXJu IDA7CisKKwlpZiAocGNpX2Rldl9kcml2ZXIocGRldikgIT0gcGNpX2Rldl9kcml2ZXIodmRldi0+ cGRldikpIHsKKwkJdmZpb19kZXZpY2VfcHV0KGRldmljZSk7CisJCXJldHVybiAwOworCX0KKwor CXRtcCA9IHZmaW9fZGV2aWNlX2RhdGEoZGV2aWNlKTsKKworCWlmICh0bXAtPnJlZmxjaykgewor CQl2ZmlvX3BjaV9yZWZsY2tfZ2V0KHRtcC0+cmVmbGNrKTsKKwkJKnByZWZsY2sgPSB0bXAtPnJl ZmxjazsKKwkJdmZpb19kZXZpY2VfcHV0KGRldmljZSk7CisJCXJldHVybiAxOworCX0KKworCXZm aW9fZGV2aWNlX3B1dChkZXZpY2UpOworCXJldHVybiAwOworfQorCitpbnQgdmZpb19wY2lfcmVm bGNrX2F0dGFjaChzdHJ1Y3QgdmZpb19wY2lfZGV2aWNlICp2ZGV2KQoreworCWJvb2wgc2xvdCA9 ICFwY2lfcHJvYmVfcmVzZXRfc2xvdCh2ZGV2LT5wZGV2LT5zbG90KTsKKworCW11dGV4X2xvY2so JnJlZmxja19sb2NrKTsKKworCWlmIChwY2lfaXNfcm9vdF9idXModmRldi0+cGRldi0+YnVzKSB8 fAorCSAgICB2ZmlvX3BjaV9mb3JfZWFjaF9zbG90X29yX2J1cyh2ZGV2LT5wZGV2LCB2ZmlvX3Bj aV9yZWZsY2tfZmluZCwKKwkJCQkJICB2ZGV2LCBzbG90KSA8PSAwKQorCQl2ZGV2LT5yZWZsY2sg PSB2ZmlvX3BjaV9yZWZsY2tfYWxsb2MoKTsKKworCW11dGV4X3VubG9jaygmcmVmbGNrX2xvY2sp OworCisJcmV0dXJuIFBUUl9FUlJfT1JfWkVSTyh2ZGV2LT5yZWZsY2spOworfQorCitzdGF0aWMg dm9pZCB2ZmlvX3BjaV9yZWZsY2tfcmVsZWFzZShzdHJ1Y3Qga3JlZiAqa3JlZikKK3sKKwlzdHJ1 Y3QgdmZpb19wY2lfcmVmbGNrICpyZWZsY2sgPSBjb250YWluZXJfb2Yoa3JlZiwKKwkJCQkJCSAg ICAgIHN0cnVjdCB2ZmlvX3BjaV9yZWZsY2ssCisJCQkJCQkgICAgICBrcmVmKTsKKworCWtmcmVl KHJlZmxjayk7CisJbXV0ZXhfdW5sb2NrKCZyZWZsY2tfbG9jayk7Cit9CisKK3ZvaWQgdmZpb19w Y2lfcmVmbGNrX3B1dChzdHJ1Y3QgdmZpb19wY2lfcmVmbGNrICpyZWZsY2spCit7CisJa3JlZl9w dXRfbXV0ZXgoJnJlZmxjay0+a3JlZiwgdmZpb19wY2lfcmVmbGNrX3JlbGVhc2UsICZyZWZsY2tf bG9jayk7Cit9CisKK3N0cnVjdCB2ZmlvX2RldmljZXMgeworCXN0cnVjdCB2ZmlvX2RldmljZSAq KmRldmljZXM7CisJc3RydWN0IHZmaW9fcGNpX2RldmljZSAqdmRldjsKKwlpbnQgY3VyX2luZGV4 OworCWludCBtYXhfaW5kZXg7Cit9OworCitzdGF0aWMgaW50IHZmaW9fcGNpX2dldF91bnVzZWRf ZGV2cyhzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgdmZpb19k ZXZpY2VzICpkZXZzID0gZGF0YTsKKwlzdHJ1Y3QgdmZpb19kZXZpY2UgKmRldmljZTsKKwlzdHJ1 Y3QgdmZpb19wY2lfZGV2aWNlICp0bXA7CisKKwlpZiAoZGV2cy0+Y3VyX2luZGV4ID09IGRldnMt Pm1heF9pbmRleCkKKwkJcmV0dXJuIC1FTk9TUEM7CisKKwlkZXZpY2UgPSB2ZmlvX2RldmljZV9n ZXRfZnJvbV9kZXYoJnBkZXYtPmRldik7CisJaWYgKCFkZXZpY2UpCisJCXJldHVybiAtRUlOVkFM OworCisJaWYgKHBjaV9kZXZfZHJpdmVyKHBkZXYpICE9IHBjaV9kZXZfZHJpdmVyKGRldnMtPnZk ZXYtPnBkZXYpKSB7CisJCXZmaW9fZGV2aWNlX3B1dChkZXZpY2UpOworCQlyZXR1cm4gLUVCVVNZ OworCX0KKworCXRtcCA9IHZmaW9fZGV2aWNlX2RhdGEoZGV2aWNlKTsKKworCS8qIEZhdWx0IGlm IHRoZSBkZXZpY2UgaXMgbm90IHVudXNlZCAqLworCWlmICh0bXAtPnJlZmNudCkgeworCQl2Zmlv X2RldmljZV9wdXQoZGV2aWNlKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlkZXZzLT5kZXZp Y2VzW2RldnMtPmN1cl9pbmRleCsrXSA9IGRldmljZTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAq IElmIGEgYnVzIG9yIHNsb3QgcmVzZXQgaXMgYXZhaWxhYmxlIGZvciB0aGUgcHJvdmlkZWQgZGV2 aWNlIGFuZDoKKyAqICAtIEFsbCBvZiB0aGUgZGV2aWNlcyBhZmZlY3RlZCBieSB0aGF0IGJ1cyBv ciBzbG90IHJlc2V0IGFyZSB1bnVzZWQKKyAqICAgICghcmVmY250KQorICogIC0gQXQgbGVhc3Qg b25lIG9mIHRoZSBhZmZlY3RlZCBkZXZpY2VzIGlzIG1hcmtlZCBkaXJ0eSB2aWEKKyAqICAgIG5l ZWRzX3Jlc2V0IChzdWNoIGFzIGJ5IGxhY2sgb2YgRkxSIHN1cHBvcnQpCisgKiBUaGVuIGF0dGVt cHQgdG8gcGVyZm9ybSB0aGF0IGJ1cyBvciBzbG90IHJlc2V0LiAgQ2FsbGVycyBhcmUgcmVxdWly ZWQKKyAqIHRvIGhvbGQgdmRldi0+cmVmbGNrLT5sb2NrLCBwcm90ZWN0aW5nIHRoZSBidXMvc2xv dCByZXNldCBncm91cCBmcm9tCisgKiBjb25jdXJyZW50IG9wZW5zLiAgQSB2ZmlvX2RldmljZSBy ZWZlcmVuY2UgaXMgYWNxdWlyZWQgZm9yIGVhY2ggZGV2aWNlCisgKiB0byBwcmV2ZW50IHVuYmlu ZHMgZHVyaW5nIHRoZSByZXNldCBvcGVyYXRpb24uCisgKgorICogTkI6IHZmaW8tY29yZSBjb25z aWRlcnMgYSBncm91cCB0byBiZSB2aWFibGUgZXZlbiBpZiBzb21lIGRldmljZXMgYXJlCisgKiBi b3VuZCB0byBkcml2ZXJzIGxpa2UgcGNpLXN0dWIgb3IgcGNpZXBvcnQuICBIZXJlIHdlIHJlcXVp cmUgYWxsIGRldmljZXMKKyAqIHRvIGJlIGJvdW5kIHRvIHZmaW9fcGNpIHNpbmNlIHRoYXQncyB0 aGUgb25seSB3YXkgd2UgY2FuIGJlIHN1cmUgdGhleQorICogc3RheSBwdXQuCisgKi8KK3N0YXRp YyB2b2lkIHZmaW9fcGNpX3RyeV9idXNfcmVzZXQoc3RydWN0IHZmaW9fcGNpX2RldmljZSAqdmRl dikKK3sKKwlzdHJ1Y3QgdmZpb19kZXZpY2VzIGRldnMgPSB7IC5jdXJfaW5kZXggPSAwIH07CisJ aW50IGkgPSAwLCByZXQgPSAtRUlOVkFMOworCWJvb2wgc2xvdCA9IGZhbHNlOworCXN0cnVjdCB2 ZmlvX3BjaV9kZXZpY2UgKnRtcDsKKworCWlmICghcGNpX3Byb2JlX3Jlc2V0X3Nsb3QodmRldi0+ cGRldi0+c2xvdCkpCisJCXNsb3QgPSB0cnVlOworCWVsc2UgaWYgKHBjaV9wcm9iZV9yZXNldF9i dXModmRldi0+cGRldi0+YnVzKSkKKwkJcmV0dXJuOworCisJaWYgKHZmaW9fcGNpX2Zvcl9lYWNo X3Nsb3Rfb3JfYnVzKHZkZXYtPnBkZXYsIHZmaW9fcGNpX2NvdW50X2RldnMsCisJCQkJCSAgJmks IHNsb3QpIHx8ICFpKQorCQlyZXR1cm47CisKKwlkZXZzLm1heF9pbmRleCA9IGk7CisJZGV2cy5k ZXZpY2VzID0ga2NhbGxvYyhpLCBzaXplb2Yoc3RydWN0IHZmaW9fZGV2aWNlICopLCBHRlBfS0VS TkVMKTsKKwlpZiAoIWRldnMuZGV2aWNlcykKKwkJcmV0dXJuOworCisJaWYgKHZmaW9fcGNpX2Zv cl9lYWNoX3Nsb3Rfb3JfYnVzKHZkZXYtPnBkZXYsCisJCQkJCSAgdmZpb19wY2lfZ2V0X3VudXNl ZF9kZXZzLAorCQkJCQkgICZkZXZzLCBzbG90KSkKKwkJZ290byBwdXRfZGV2czsKKworCS8qIERv ZXMgYXQgbGVhc3Qgb25lIG5lZWQgYSByZXNldD8gKi8KKwlmb3IgKGkgPSAwOyBpIDwgZGV2cy5j dXJfaW5kZXg7IGkrKykgeworCQl0bXAgPSB2ZmlvX2RldmljZV9kYXRhKGRldnMuZGV2aWNlc1tp XSk7CisJCWlmICh0bXAtPm5lZWRzX3Jlc2V0KSB7CisJCQlyZXQgPSBwY2lfcmVzZXRfYnVzKHZk ZXYtPnBkZXYpOworCQkJYnJlYWs7CisJCX0KKwl9CisKK3B1dF9kZXZzOgorCWZvciAoaSA9IDA7 IGkgPCBkZXZzLmN1cl9pbmRleDsgaSsrKSB7CisJCXRtcCA9IHZmaW9fZGV2aWNlX2RhdGEoZGV2 cy5kZXZpY2VzW2ldKTsKKworCQkvKgorCQkgKiBJZiByZXNldCB3YXMgc3VjY2Vzc2Z1bCwgYWZm ZWN0ZWQgZGV2aWNlcyBubyBsb25nZXIgbmVlZAorCQkgKiBhIHJlc2V0IGFuZCB3ZSBzaG91bGQg cmV0dXJuIGFsbCB0aGUgY29sbGF0ZXJhbCBkZXZpY2VzCisJCSAqIHRvIGxvdyBwb3dlci4gIElm IG5vdCBzdWNjZXNzZnVsLCB3ZSBlaXRoZXIgZGlkbid0IHJlc2V0CisJCSAqIHRoZSBidXMgb3Ig dGltZWQgb3V0IHdhaXRpbmcgZm9yIGl0LCBzbyBsZXQncyBub3QgdG91Y2gKKwkJICogdGhlIHBv d2VyIHN0YXRlLgorCQkgKi8KKwkJaWYgKCFyZXQpIHsKKwkJCXRtcC0+bmVlZHNfcmVzZXQgPSBm YWxzZTsKKworCQkJaWYgKHRtcCAhPSB2ZGV2ICYmICF2ZGV2LT5kaXNhYmxlX2lkbGVfZDMpCisJ CQkJdmZpb19wY2lfc2V0X3Bvd2VyX3N0YXRlKHRtcCwgUENJX0QzaG90KTsKKwkJfQorCisJCXZm aW9fZGV2aWNlX3B1dChkZXZzLmRldmljZXNbaV0pOworCX0KKworCWtmcmVlKGRldnMuZGV2aWNl cyk7Cit9CisKK3ZvaWQgX19pbml0IHZmaW9fcGNpX2ZpbGxfaWRzKGNoYXIgKmlkcywgc3RydWN0 IHBjaV9kcml2ZXIgKmRyaXZlcikKK3sKKwljaGFyICpwLCAqaWQ7CisJaW50IHJjOworCisJLyog bm8gaWRzIHBhc3NlZCBhY3R1YWxseSAqLworCWlmIChpZHNbMF0gPT0gJ1wwJykKKwkJcmV0dXJu OworCisJLyogYWRkIGlkcyBzcGVjaWZpZWQgaW4gdGhlIG1vZHVsZSBwYXJhbWV0ZXIgKi8KKwlw ID0gaWRzOworCXdoaWxlICgoaWQgPSBzdHJzZXAoJnAsICIsIikpKSB7CisJCXVuc2lnbmVkIGlu dCB2ZW5kb3IsIGRldmljZSwgc3VidmVuZG9yID0gUENJX0FOWV9JRCwKKwkJCXN1YmRldmljZSA9 IFBDSV9BTllfSUQsIGNsYXNzID0gMCwgY2xhc3NfbWFzayA9IDA7CisJCWludCBmaWVsZHM7CisK KwkJaWYgKCFzdHJsZW4oaWQpKQorCQkJY29udGludWU7CisKKwkJZmllbGRzID0gc3NjYW5mKGlk LCAiJXg6JXg6JXg6JXg6JXg6JXgiLAorCQkJCSZ2ZW5kb3IsICZkZXZpY2UsICZzdWJ2ZW5kb3Is ICZzdWJkZXZpY2UsCisJCQkJJmNsYXNzLCAmY2xhc3NfbWFzayk7CisKKwkJaWYgKGZpZWxkcyA8 IDIpIHsKKwkJCXByX3dhcm4oImludmFsaWQgaWQgc3RyaW5nIFwiJXNcIlxuIiwgaWQpOworCQkJ Y29udGludWU7CisJCX0KKworCQlyYyA9IHBjaV9hZGRfZHluaWQoZHJpdmVyLCB2ZW5kb3IsIGRl dmljZSwKKwkJCQkgICBzdWJ2ZW5kb3IsIHN1YmRldmljZSwgY2xhc3MsIGNsYXNzX21hc2ssIDAp OworCQlpZiAocmMpCisJCQlwcl93YXJuKCJmYWlsZWQgdG8gYWRkIGR5bmFtaWMgaWQgWyUwNHg6 JTA0eFslMDR4OiUwNHhdXSBjbGFzcyAlIzA4eC8lMDh4ICglZClcbiIsCisJCQkJdmVuZG9yLCBk ZXZpY2UsIHN1YnZlbmRvciwgc3ViZGV2aWNlLAorCQkJCWNsYXNzLCBjbGFzc19tYXNrLCByYyk7 CisJCWVsc2UKKwkJCXByX2luZm8oImFkZCBbJTA0eDolMDR4WyUwNHg6JTA0eF1dIGNsYXNzICUj MDh4LyUwOHhcbiIsCisJCQkJdmVuZG9yLCBkZXZpY2UsIHN1YnZlbmRvciwgc3ViZGV2aWNlLAor CQkJCWNsYXNzLCBjbGFzc19tYXNrKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZmaW8v cGNpL3ZmaW9fcGNpLmMgYi9kcml2ZXJzL3ZmaW8vcGNpL3ZmaW9fcGNpLmMKaW5kZXggM2ZhMjBl OS4uNmNlMWE4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy92ZmlvL3BjaS92ZmlvX3BjaS5jCisrKyBi L2RyaXZlcnMvdmZpby9wY2kvdmZpb19wY2kuYwpAQCAtNTYsNDExICs1Niw2IEBAIG1vZHVsZV9w YXJhbShkaXNhYmxlX2lkbGVfZDMsIGJvb2wsIFNfSVJVR08gfCBTX0lXVVNSKTsKIE1PRFVMRV9Q QVJNX0RFU0MoZGlzYWJsZV9pZGxlX2QzLAogCQkgIkRpc2FibGUgdXNpbmcgdGhlIFBDSSBEMyBs b3cgcG93ZXIgc3RhdGUgZm9yIGlkbGUsIHVudXNlZCBkZXZpY2VzIik7CiAKLXN0YXRpYyBpbmxp bmUgYm9vbCB2ZmlvX3ZnYV9kaXNhYmxlZCh2b2lkKQotewotI2lmZGVmIENPTkZJR19WRklPX1BD SV9WR0EKLQlyZXR1cm4gZGlzYWJsZV92Z2E7Ci0jZWxzZQotCXJldHVybiB0cnVlOwotI2VuZGlm Ci19Ci0KLS8qCi0gKiBPdXIgVkdBIGFyYml0ZXIgcGFydGljaXBhdGlvbiBpcyBsaW1pdGVkIHNp bmNlIHdlIGRvbid0IGtub3cgYW55dGhpbmcKLSAqIGFib3V0IHRoZSBkZXZpY2UgaXRzZWxmLiAg SG93ZXZlciwgaWYgdGhlIGRldmljZSBpcyB0aGUgb25seSBWR0EgZGV2aWNlCi0gKiBkb3duc3Ry ZWFtIG9mIGEgYnJpZGdlIGFuZCBWRklPIFZHQSBzdXBwb3J0IGlzIGRpc2FibGVkLCB0aGVuIHdl IGNhbgotICogc2FmZWx5IHJldHVybiBsZWdhY3kgVkdBIElPIGFuZCBtZW1vcnkgYXMgbm90IGRl Y29kZWQgc2luY2UgdGhlIHVzZXIKLSAqIGhhcyBubyB3YXkgdG8gZ2V0IHRvIGl0IGFuZCByb3V0 aW5nIGNhbiBiZSBkaXNhYmxlZCBleHRlcm5hbGx5IGF0IHRoZQotICogYnJpZGdlLgotICovCi1z dGF0aWMgdW5zaWduZWQgaW50IHZmaW9fcGNpX3NldF92Z2FfZGVjb2RlKHZvaWQgKm9wYXF1ZSwg Ym9vbCBzaW5nbGVfdmdhKQotewotCXN0cnVjdCB2ZmlvX3BjaV9kZXZpY2UgKnZkZXYgPSBvcGFx dWU7Ci0Jc3RydWN0IHBjaV9kZXYgKnRtcCA9IE5VTEwsICpwZGV2ID0gdmRldi0+cGRldjsKLQl1 bnNpZ25lZCBjaGFyIG1heF9idXNucjsKLQl1bnNpZ25lZCBpbnQgZGVjb2RlczsKLQotCWlmIChz aW5nbGVfdmdhIHx8ICF2ZmlvX3ZnYV9kaXNhYmxlZCgpIHx8IHBjaV9pc19yb290X2J1cyhwZGV2 LT5idXMpKQotCQlyZXR1cm4gVkdBX1JTUkNfTk9STUFMX0lPIHwgVkdBX1JTUkNfTk9STUFMX01F TSB8Ci0JCSAgICAgICBWR0FfUlNSQ19MRUdBQ1lfSU8gfCBWR0FfUlNSQ19MRUdBQ1lfTUVNOwot Ci0JbWF4X2J1c25yID0gcGNpX2J1c19tYXhfYnVzbnIocGRldi0+YnVzKTsKLQlkZWNvZGVzID0g VkdBX1JTUkNfTk9STUFMX0lPIHwgVkdBX1JTUkNfTk9STUFMX01FTTsKLQotCXdoaWxlICgodG1w ID0gcGNpX2dldF9jbGFzcyhQQ0lfQ0xBU1NfRElTUExBWV9WR0EgPDwgOCwgdG1wKSkgIT0gTlVM TCkgewotCQlpZiAodG1wID09IHBkZXYgfHwKLQkJICAgIHBjaV9kb21haW5fbnIodG1wLT5idXMp ICE9IHBjaV9kb21haW5fbnIocGRldi0+YnVzKSB8fAotCQkgICAgcGNpX2lzX3Jvb3RfYnVzKHRt cC0+YnVzKSkKLQkJCWNvbnRpbnVlOwotCi0JCWlmICh0bXAtPmJ1cy0+bnVtYmVyID49IHBkZXYt PmJ1cy0+bnVtYmVyICYmCi0JCSAgICB0bXAtPmJ1cy0+bnVtYmVyIDw9IG1heF9idXNucikgewot CQkJcGNpX2Rldl9wdXQodG1wKTsKLQkJCWRlY29kZXMgfD0gVkdBX1JTUkNfTEVHQUNZX0lPIHwg VkdBX1JTUkNfTEVHQUNZX01FTTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcmV0dXJuIGRlY29k ZXM7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbCB2ZmlvX3BjaV9pc192Z2Eoc3RydWN0IHBjaV9k ZXYgKnBkZXYpCi17Ci0JcmV0dXJuIChwZGV2LT5jbGFzcyA+PiA4KSA9PSBQQ0lfQ0xBU1NfRElT UExBWV9WR0E7Ci19Ci0KLXN0YXRpYyB2b2lkIHZmaW9fcGNpX3Byb2JlX21tYXBzKHN0cnVjdCB2 ZmlvX3BjaV9kZXZpY2UgKnZkZXYpCi17Ci0Jc3RydWN0IHJlc291cmNlICpyZXM7Ci0JaW50IGJh cjsKLQlzdHJ1Y3QgdmZpb19wY2lfZHVtbXlfcmVzb3VyY2UgKmR1bW15X3JlczsKLQotCUlOSVRf TElTVF9IRUFEKCZ2ZGV2LT5kdW1teV9yZXNvdXJjZXNfbGlzdCk7Ci0KLQlmb3IgKGJhciA9IFBD SV9TVERfUkVTT1VSQ0VTOyBiYXIgPD0gUENJX1NURF9SRVNPVVJDRV9FTkQ7IGJhcisrKSB7Ci0J CXJlcyA9IHZkZXYtPnBkZXYtPnJlc291cmNlICsgYmFyOwotCi0JCWlmICghSVNfRU5BQkxFRChD T05GSUdfVkZJT19QQ0lfTU1BUCkpCi0JCQlnb3RvIG5vX21tYXA7Ci0KLQkJaWYgKCEocmVzLT5m bGFncyAmIElPUkVTT1VSQ0VfTUVNKSkKLQkJCWdvdG8gbm9fbW1hcDsKLQotCQkvKgotCQkgKiBU aGUgUENJIGNvcmUgc2hvdWxkbid0IHNldCB1cCBhIHJlc291cmNlIHdpdGggYQotCQkgKiB0eXBl IGJ1dCB6ZXJvIHNpemUuIEJ1dCB0aGVyZSBtYXkgYmUgYnVncyB0aGF0Ci0JCSAqIGNhdXNlIHVz IHRvIGRvIHRoYXQuCi0JCSAqLwotCQlpZiAoIXJlc291cmNlX3NpemUocmVzKSkKLQkJCWdvdG8g bm9fbW1hcDsKLQotCQlpZiAocmVzb3VyY2Vfc2l6ZShyZXMpID49IFBBR0VfU0laRSkgewotCQkJ dmRldi0+YmFyX21tYXBfc3VwcG9ydGVkW2Jhcl0gPSB0cnVlOwotCQkJY29udGludWU7Ci0JCX0K LQotCQlpZiAoIShyZXMtPnN0YXJ0ICYgflBBR0VfTUFTSykpIHsKLQkJCS8qCi0JCQkgKiBBZGQg YSBkdW1teSByZXNvdXJjZSB0byByZXNlcnZlIHRoZSByZW1haW5kZXIKLQkJCSAqIG9mIHRoZSBl eGNsdXNpdmUgcGFnZSBpbiBjYXNlIHRoYXQgaG90LWFkZAotCQkJICogZGV2aWNlJ3MgYmFyIGlz IGFzc2lnbmVkIGludG8gaXQuCi0JCQkgKi8KLQkJCWR1bW15X3JlcyA9IGt6YWxsb2Moc2l6ZW9m KCpkdW1teV9yZXMpLCBHRlBfS0VSTkVMKTsKLQkJCWlmIChkdW1teV9yZXMgPT0gTlVMTCkKLQkJ CQlnb3RvIG5vX21tYXA7Ci0KLQkJCWR1bW15X3Jlcy0+cmVzb3VyY2UubmFtZSA9ICJ2ZmlvIHN1 Yi1wYWdlIHJlc2VydmVkIjsKLQkJCWR1bW15X3Jlcy0+cmVzb3VyY2Uuc3RhcnQgPSByZXMtPmVu ZCArIDE7Ci0JCQlkdW1teV9yZXMtPnJlc291cmNlLmVuZCA9IHJlcy0+c3RhcnQgKyBQQUdFX1NJ WkUgLSAxOwotCQkJZHVtbXlfcmVzLT5yZXNvdXJjZS5mbGFncyA9IHJlcy0+ZmxhZ3M7Ci0JCQlp ZiAocmVxdWVzdF9yZXNvdXJjZShyZXMtPnBhcmVudCwKLQkJCQkJCSZkdW1teV9yZXMtPnJlc291 cmNlKSkgewotCQkJCWtmcmVlKGR1bW15X3Jlcyk7Ci0JCQkJZ290byBub19tbWFwOwotCQkJfQot CQkJZHVtbXlfcmVzLT5pbmRleCA9IGJhcjsKLQkJCWxpc3RfYWRkKCZkdW1teV9yZXMtPnJlc19u ZXh0LAotCQkJCQkmdmRldi0+ZHVtbXlfcmVzb3VyY2VzX2xpc3QpOwotCQkJdmRldi0+YmFyX21t YXBfc3VwcG9ydGVkW2Jhcl0gPSB0cnVlOwotCQkJY29udGludWU7Ci0JCX0KLQkJLyoKLQkJICog SGVyZSB3ZSBkb24ndCBoYW5kbGUgdGhlIGNhc2Ugd2hlbiB0aGUgQkFSIGlzIG5vdCBwYWdlCi0J CSAqIGFsaWduZWQgYmVjYXVzZSB3ZSBjYW4ndCBleHBlY3QgdGhlIEJBUiB3aWxsIGJlCi0JCSAq IGFzc2lnbmVkIGludG8gdGhlIHNhbWUgbG9jYXRpb24gaW4gYSBwYWdlIGluIGd1ZXN0Ci0JCSAq IHdoZW4gd2UgcGFzc3Rocm91Z2ggdGhlIEJBUi4gQW5kIGl0J3MgaGFyZCB0byBhY2Nlc3MKLQkJ ICogdGhpcyBCQVIgaW4gdXNlcnNwYWNlIGJlY2F1c2Ugd2UgaGF2ZSBubyB3YXkgdG8gZ2V0Ci0J CSAqIHRoZSBCQVIncyBsb2NhdGlvbiBpbiBhIHBhZ2UuCi0JCSAqLwotbm9fbW1hcDoKLQkJdmRl di0+YmFyX21tYXBfc3VwcG9ydGVkW2Jhcl0gPSBmYWxzZTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lk IHZmaW9fcGNpX3RyeV9idXNfcmVzZXQoc3RydWN0IHZmaW9fcGNpX2RldmljZSAqdmRldik7Ci1z dGF0aWMgdm9pZCB2ZmlvX3BjaV9kaXNhYmxlKHN0cnVjdCB2ZmlvX3BjaV9kZXZpY2UgKnZkZXYp OwotCi0vKgotICogSU5UeCBtYXNraW5nIHJlcXVpcmVzIHRoZSBhYmlsaXR5IHRvIGRpc2FibGUg SU5UeCBzaWduYWxpbmcgdmlhIFBDSV9DT01NQU5ECi0gKiBfYW5kXyB0aGUgYWJpbGl0eSBkZXRl Y3Qgd2hlbiB0aGUgZGV2aWNlIGlzIGFzc2VydGluZyBJTlR4IHZpYSBQQ0lfU1RBVFVTLgotICog SWYgYSBkZXZpY2UgaW1wbGVtZW50cyB0aGUgZm9ybWVyIGJ1dCBub3QgdGhlIGxhdHRlciB3ZSB3 b3VsZCB0eXBpY2FsbHkKLSAqIGV4cGVjdCBicm9rZW5faW50eF9tYXNraW5nIGJlIHNldCBhbmQg cmVxdWlyZSBhbiBleGNsdXNpdmUgaW50ZXJydXB0LgotICogSG93ZXZlciBzaW5jZSB3ZSBkbyBo YXZlIGNvbnRyb2wgb2YgdGhlIGRldmljZSdzIGFiaWxpdHkgdG8gYXNzZXJ0IElOVHgsCi0gKiB3 ZSBjYW4gaW5zdGVhZCBwcmV0ZW5kIHRoYXQgdGhlIGRldmljZSBkb2VzIG5vdCBpbXBsZW1lbnQg SU5UeCwgdmlydHVhbGl6aW5nCi0gKiB0aGUgcGluIHJlZ2lzdGVyIHRvIHJlcG9ydCB6ZXJvIGFu ZCBtYWludGFpbmluZyBEaXNJTlR4IHNldCBvbiB0aGUgaG9zdC4KLSAqLwotc3RhdGljIGJvb2wg dmZpb19wY2lfbm9pbnR4KHN0cnVjdCBwY2lfZGV2ICpwZGV2KQotewotCXN3aXRjaCAocGRldi0+ dmVuZG9yKSB7Ci0JY2FzZSBQQ0lfVkVORE9SX0lEX0lOVEVMOgotCQlzd2l0Y2ggKHBkZXYtPmRl dmljZSkgewotCQkvKiBBbGwgaTQwZSAoWEw3MTAvWDcxMC9YWFY3MTApIDEwLzIwLzI1LzQwR2JF IE5JQ3MgKi8KLQkJY2FzZSAweDE1NzI6Ci0JCWNhc2UgMHgxNTc0OgotCQljYXNlIDB4MTU4MCAu Li4gMHgxNTgxOgotCQljYXNlIDB4MTU4MyAuLi4gMHgxNThiOgotCQljYXNlIDB4MzdkMCAuLi4g MHgzN2QyOgotCQkJcmV0dXJuIHRydWU7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gZmFsc2U7Ci0J CX0KLQl9Ci0KLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyB2b2lkIHZmaW9fcGNpX3Byb2Jl X3Bvd2VyX3N0YXRlKHN0cnVjdCB2ZmlvX3BjaV9kZXZpY2UgKnZkZXYpCi17Ci0Jc3RydWN0IHBj aV9kZXYgKnBkZXYgPSB2ZGV2LT5wZGV2OwotCXUxNiBwbWNzcjsKLQotCWlmICghcGRldi0+cG1f Y2FwKQotCQlyZXR1cm47Ci0KLQlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBwZGV2LT5wbV9j YXAgKyBQQ0lfUE1fQ1RSTCwgJnBtY3NyKTsKLQotCXZkZXYtPm5lZWRzX3BtX3Jlc3RvcmUgPSAh KHBtY3NyICYgUENJX1BNX0NUUkxfTk9fU09GVF9SRVNFVCk7Ci19Ci0KLS8qCi0gKiBwY2lfc2V0 X3Bvd2VyX3N0YXRlKCkgd3JhcHBlciBoYW5kbGluZyBkZXZpY2VzIHdoaWNoIHBlcmZvcm0gYSBz b2Z0IHJlc2V0IG9uCi0gKiBEMy0+RDAgdHJhbnNpdGlvbi4gIFNhdmUgc3RhdGUgcHJpb3IgdG8g RDAvMS8yLT5EMywgc3Rhc2ggaXQgb24gdGhlIHZkZXYsCi0gKiByZXN0b3JlIHdoZW4gcmV0dXJu ZWQgdG8gRDAuICBTYXZlZCBzZXBhcmF0ZWx5IGZyb20gcGNpX3NhdmVkX3N0YXRlIGZvciB1c2UK LSAqIGJ5IFBNIGNhcGFiaWxpdHkgZW11bGF0aW9uIGFuZCBzZXBhcmF0ZWx5IGZyb20gcGNpX2Rl diBpbnRlcm5hbCBzYXZlZCBzdGF0ZQotICogdG8gYXZvaWQgaXQgYmVpbmcgb3ZlcndyaXR0ZW4g YW5kIGNvbnN1bWVkIGFyb3VuZCBvdGhlciByZXNldHMuCi0gKi8KLWludCB2ZmlvX3BjaV9zZXRf cG93ZXJfc3RhdGUoc3RydWN0IHZmaW9fcGNpX2RldmljZSAqdmRldiwgcGNpX3Bvd2VyX3Qgc3Rh dGUpCi17Ci0Jc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB2ZGV2LT5wZGV2OwotCWJvb2wgbmVlZHNf cmVzdG9yZSA9IGZhbHNlLCBuZWVkc19zYXZlID0gZmFsc2U7Ci0JaW50IHJldDsKLQotCWlmICh2 ZGV2LT5uZWVkc19wbV9yZXN0b3JlKSB7Ci0JCWlmIChwZGV2LT5jdXJyZW50X3N0YXRlIDwgUENJ X0QzaG90ICYmIHN0YXRlID49IFBDSV9EM2hvdCkgewotCQkJcGNpX3NhdmVfc3RhdGUocGRldik7 Ci0JCQluZWVkc19zYXZlID0gdHJ1ZTsKLQkJfQotCi0JCWlmIChwZGV2LT5jdXJyZW50X3N0YXRl ID49IFBDSV9EM2hvdCAmJiBzdGF0ZSA8PSBQQ0lfRDApCi0JCQluZWVkc19yZXN0b3JlID0gdHJ1 ZTsKLQl9Ci0KLQlyZXQgPSBwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIHN0YXRlKTsKLQotCWlm ICghcmV0KSB7Ci0JCS8qIEQzIG1pZ2h0IGJlIHVuc3VwcG9ydGVkIHZpYSBxdWlyaywgc2tpcCB1 bmxlc3MgaW4gRDMgKi8KLQkJaWYgKG5lZWRzX3NhdmUgJiYgcGRldi0+Y3VycmVudF9zdGF0ZSA+ PSBQQ0lfRDNob3QpIHsKLQkJCXZkZXYtPnBtX3NhdmUgPSBwY2lfc3RvcmVfc2F2ZWRfc3RhdGUo cGRldik7Ci0JCX0gZWxzZSBpZiAobmVlZHNfcmVzdG9yZSkgewotCQkJcGNpX2xvYWRfYW5kX2Zy ZWVfc2F2ZWRfc3RhdGUocGRldiwgJnZkZXYtPnBtX3NhdmUpOwotCQkJcGNpX3Jlc3RvcmVfc3Rh dGUocGRldik7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHZmaW9f cGNpX2VuYWJsZShzdHJ1Y3QgdmZpb19wY2lfZGV2aWNlICp2ZGV2KQotewotCXN0cnVjdCBwY2lf ZGV2ICpwZGV2ID0gdmRldi0+cGRldjsKLQlpbnQgcmV0OwotCXUxNiBjbWQ7Ci0JdTggbXNpeF9w b3M7Ci0KLQl2ZmlvX3BjaV9zZXRfcG93ZXJfc3RhdGUodmRldiwgUENJX0QwKTsKLQotCS8qIERv bid0IGFsbG93IG91ciBpbml0aWFsIHNhdmVkIHN0YXRlIHRvIGluY2x1ZGUgYnVzbWFzdGVyICov Ci0JcGNpX2NsZWFyX21hc3RlcihwZGV2KTsKLQotCXJldCA9IHBjaV9lbmFibGVfZGV2aWNlKHBk ZXYpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQkvKiBJZiByZXNldCBmYWlscyBiZWNh dXNlIG9mIHRoZSBkZXZpY2UgbG9jaywgZmFpbCB0aGlzIHBhdGggZW50aXJlbHkgKi8KLQlyZXQg PSBwY2lfdHJ5X3Jlc2V0X2Z1bmN0aW9uKHBkZXYpOwotCWlmIChyZXQgPT0gLUVBR0FJTikgewot CQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JdmRldi0+ cmVzZXRfd29ya3MgPSAhcmV0OwotCXBjaV9zYXZlX3N0YXRlKHBkZXYpOwotCXZkZXYtPnBjaV9z YXZlZF9zdGF0ZSA9IHBjaV9zdG9yZV9zYXZlZF9zdGF0ZShwZGV2KTsKLQlpZiAoIXZkZXYtPnBj aV9zYXZlZF9zdGF0ZSkKLQkJcHJfZGVidWcoIiVzOiBDb3VsZG4ndCBzdG9yZSAlcyBzYXZlZCBz dGF0ZVxuIiwKLQkJCSBfX2Z1bmNfXywgZGV2X25hbWUoJnBkZXYtPmRldikpOwotCi0JaWYgKGxp a2VseSghbm9pbnR4bWFzaykpIHsKLQkJaWYgKHZmaW9fcGNpX25vaW50eChwZGV2KSkgewotCQkJ ZGV2X2luZm8oJnBkZXYtPmRldiwgIk1hc2tpbmcgYnJva2VuIElOVHggc3VwcG9ydFxuIik7Ci0J CQl2ZGV2LT5ub2ludHggPSB0cnVlOwotCQkJcGNpX2ludHgocGRldiwgMCk7Ci0JCX0gZWxzZQot CQkJdmRldi0+cGNpXzJfMyA9IHBjaV9pbnR4X21hc2tfc3VwcG9ydGVkKHBkZXYpOwotCX0KLQot CXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9DT01NQU5ELCAmY21kKTsKLQlpZiAodmRl di0+cGNpXzJfMyAmJiAoY21kICYgUENJX0NPTU1BTkRfSU5UWF9ESVNBQkxFKSkgewotCQljbWQg Jj0gflBDSV9DT01NQU5EX0lOVFhfRElTQUJMRTsKLQkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBk ZXYsIFBDSV9DT01NQU5ELCBjbWQpOwotCX0KLQotCXJldCA9IHZmaW9fY29uZmlnX2luaXQodmRl dik7Ci0JaWYgKHJldCkgewotCQlrZnJlZSh2ZGV2LT5wY2lfc2F2ZWRfc3RhdGUpOwotCQl2ZGV2 LT5wY2lfc2F2ZWRfc3RhdGUgPSBOVUxMOwotCQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7Ci0J CXJldHVybiByZXQ7Ci0JfQotCi0JbXNpeF9wb3MgPSBwZGV2LT5tc2l4X2NhcDsKLQlpZiAobXNp eF9wb3MpIHsKLQkJdTE2IGZsYWdzOwotCQl1MzIgdGFibGU7Ci0KLQkJcGNpX3JlYWRfY29uZmln X3dvcmQocGRldiwgbXNpeF9wb3MgKyBQQ0lfTVNJWF9GTEFHUywgJmZsYWdzKTsKLQkJcGNpX3Jl YWRfY29uZmlnX2R3b3JkKHBkZXYsIG1zaXhfcG9zICsgUENJX01TSVhfVEFCTEUsICZ0YWJsZSk7 Ci0KLQkJdmRldi0+bXNpeF9iYXIgPSB0YWJsZSAmIFBDSV9NU0lYX1RBQkxFX0JJUjsKLQkJdmRl di0+bXNpeF9vZmZzZXQgPSB0YWJsZSAmIFBDSV9NU0lYX1RBQkxFX09GRlNFVDsKLQkJdmRldi0+ bXNpeF9zaXplID0gKChmbGFncyAmIFBDSV9NU0lYX0ZMQUdTX1FTSVpFKSArIDEpICogMTY7Ci0J fSBlbHNlCi0JCXZkZXYtPm1zaXhfYmFyID0gMHhGRjsKLQotCWlmICghdmZpb192Z2FfZGlzYWJs ZWQoKSAmJiB2ZmlvX3BjaV9pc192Z2EocGRldikpCi0JCXZkZXYtPmhhc192Z2EgPSB0cnVlOwot Ci0KLQlpZiAodmZpb19wY2lfaXNfdmdhKHBkZXYpICYmCi0JICAgIHBkZXYtPnZlbmRvciA9PSBQ Q0lfVkVORE9SX0lEX0lOVEVMICYmCi0JICAgIElTX0VOQUJMRUQoQ09ORklHX1ZGSU9fUENJX0lH RCkpIHsKLQkJcmV0ID0gdmZpb19wY2lfaWdkX2luaXQodmRldik7Ci0JCWlmIChyZXQpIHsKLQkJ CWRldl93YXJuKCZ2ZGV2LT5wZGV2LT5kZXYsCi0JCQkJICJGYWlsZWQgdG8gc2V0dXAgSW50ZWwg SUdEIHJlZ2lvbnNcbiIpOwotCQkJZ290byBkaXNhYmxlX2V4aXQ7Ci0JCX0KLQl9Ci0KLQlpZiAo cGRldi0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfTlZJRElBICYmCi0JICAgIElTX0VOQUJMRUQo Q09ORklHX1ZGSU9fUENJX05WTElOSzIpKSB7Ci0JCXJldCA9IHZmaW9fcGNpX252ZGlhX3YxMDBf bnZsaW5rMl9pbml0KHZkZXYpOwotCQlpZiAocmV0ICYmIHJldCAhPSAtRU5PREVWKSB7Ci0JCQlk ZXZfd2FybigmdmRldi0+cGRldi0+ZGV2LAotCQkJCSAiRmFpbGVkIHRvIHNldHVwIE5WSURJQSBO VjIgUkFNIHJlZ2lvblxuIik7Ci0JCQlnb3RvIGRpc2FibGVfZXhpdDsKLQkJfQotCX0KLQotCWlm IChwZGV2LT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9JQk0gJiYKLQkgICAgSVNfRU5BQkxFRChD T05GSUdfVkZJT19QQ0lfTlZMSU5LMikpIHsKLQkJcmV0ID0gdmZpb19wY2lfaWJtX25wdTJfaW5p dCh2ZGV2KTsKLQkJaWYgKHJldCAmJiByZXQgIT0gLUVOT0RFVikgewotCQkJZGV2X3dhcm4oJnZk ZXYtPnBkZXYtPmRldiwKLQkJCQkJIkZhaWxlZCB0byBzZXR1cCBOVklESUEgTlYyIEFUU0QgcmVn aW9uXG4iKTsKLQkJCWdvdG8gZGlzYWJsZV9leGl0OwotCQl9Ci0JfQotCi0JdmZpb19wY2lfcHJv YmVfbW1hcHModmRldik7Ci0KLQlyZXR1cm4gMDsKLQotZGlzYWJsZV9leGl0OgotCXZmaW9fcGNp X2Rpc2FibGUodmRldik7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgdmZpb19wY2lf ZGlzYWJsZShzdHJ1Y3QgdmZpb19wY2lfZGV2aWNlICp2ZGV2KQotewotCXN0cnVjdCBwY2lfZGV2 ICpwZGV2ID0gdmRldi0+cGRldjsKLQlzdHJ1Y3QgdmZpb19wY2lfZHVtbXlfcmVzb3VyY2UgKmR1 bW15X3JlcywgKnRtcDsKLQlzdHJ1Y3QgdmZpb19wY2lfaW9ldmVudGZkICppb2V2ZW50ZmQsICpp b2V2ZW50ZmRfdG1wOwotCWludCBpLCBiYXI7Ci0KLQkvKiBTdG9wIHRoZSBkZXZpY2UgZnJvbSBm dXJ0aGVyIERNQSAqLwotCXBjaV9jbGVhcl9tYXN0ZXIocGRldik7Ci0KLQl2ZmlvX3BjaV9zZXRf aXJxc19pb2N0bCh2ZGV2LCBWRklPX0lSUV9TRVRfREFUQV9OT05FIHwKLQkJCQlWRklPX0lSUV9T RVRfQUNUSU9OX1RSSUdHRVIsCi0JCQkJdmRldi0+aXJxX3R5cGUsIDAsIDAsIE5VTEwpOwotCi0J LyogRGV2aWNlIGNsb3NlZCwgZG9uJ3QgbmVlZCBtdXRleCBoZXJlICovCi0JbGlzdF9mb3JfZWFj aF9lbnRyeV9zYWZlKGlvZXZlbnRmZCwgaW9ldmVudGZkX3RtcCwKLQkJCQkgJnZkZXYtPmlvZXZl bnRmZHNfbGlzdCwgbmV4dCkgewotCQl2ZmlvX3ZpcnFmZF9kaXNhYmxlKCZpb2V2ZW50ZmQtPnZp cnFmZCk7Ci0JCWxpc3RfZGVsKCZpb2V2ZW50ZmQtPm5leHQpOwotCQlrZnJlZShpb2V2ZW50ZmQp OwotCX0KLQl2ZGV2LT5pb2V2ZW50ZmRzX25yID0gMDsKLQotCXZkZXYtPnZpcnFfZGlzYWJsZWQg PSBmYWxzZTsKLQotCWZvciAoaSA9IDA7IGkgPCB2ZGV2LT5udW1fcmVnaW9uczsgaSsrKQotCQl2 ZGV2LT5yZWdpb25baV0ub3BzLT5yZWxlYXNlKHZkZXYsICZ2ZGV2LT5yZWdpb25baV0pOwotCi0J dmRldi0+bnVtX3JlZ2lvbnMgPSAwOwotCWtmcmVlKHZkZXYtPnJlZ2lvbik7Ci0JdmRldi0+cmVn aW9uID0gTlVMTDsgLyogZG9uJ3Qga3JlYWxsb2MgYSBmcmVlZCBwb2ludGVyICovCi0KLQl2Zmlv X2NvbmZpZ19mcmVlKHZkZXYpOwotCi0JZm9yIChiYXIgPSBQQ0lfU1REX1JFU09VUkNFUzsgYmFy IDw9IFBDSV9TVERfUkVTT1VSQ0VfRU5EOyBiYXIrKykgewotCQlpZiAoIXZkZXYtPmJhcm1hcFti YXJdKQotCQkJY29udGludWU7Ci0JCXBjaV9pb3VubWFwKHBkZXYsIHZkZXYtPmJhcm1hcFtiYXJd KTsKLQkJcGNpX3JlbGVhc2Vfc2VsZWN0ZWRfcmVnaW9ucyhwZGV2LCAxIDw8IGJhcik7Ci0JCXZk ZXYtPmJhcm1hcFtiYXJdID0gTlVMTDsKLQl9Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUo ZHVtbXlfcmVzLCB0bXAsCi0JCQkJICZ2ZGV2LT5kdW1teV9yZXNvdXJjZXNfbGlzdCwgcmVzX25l eHQpIHsKLQkJbGlzdF9kZWwoJmR1bW15X3Jlcy0+cmVzX25leHQpOwotCQlyZWxlYXNlX3Jlc291 cmNlKCZkdW1teV9yZXMtPnJlc291cmNlKTsKLQkJa2ZyZWUoZHVtbXlfcmVzKTsKLQl9Ci0KLQl2 ZGV2LT5uZWVkc19yZXNldCA9IHRydWU7Ci0KLQkvKgotCSAqIElmIHdlIGhhdmUgc2F2ZWQgc3Rh dGUsIHJlc3RvcmUgaXQuICBJZiB3ZSBjYW4gcmVzZXQgdGhlIGRldmljZSwKLQkgKiBldmVuIGJl dHRlci4gIFJlc2V0dGluZyB3aXRoIGN1cnJlbnQgc3RhdGUgc2VlbXMgYmV0dGVyIHRoYW4KLQkg KiBub3RoaW5nLCBidXQgc2F2aW5nIGFuZCByZXN0b3JpbmcgY3VycmVudCBzdGF0ZSB3aXRob3V0 IHJlc2V0Ci0JICogaXMganVzdCBidXN5IHdvcmsuCi0JICovCi0JaWYgKHBjaV9sb2FkX2FuZF9m cmVlX3NhdmVkX3N0YXRlKHBkZXYsICZ2ZGV2LT5wY2lfc2F2ZWRfc3RhdGUpKSB7Ci0JCXByX2lu Zm8oIiVzOiBDb3VsZG4ndCByZWxvYWQgJXMgc2F2ZWQgc3RhdGVcbiIsCi0JCQlfX2Z1bmNfXywg ZGV2X25hbWUoJnBkZXYtPmRldikpOwotCi0JCWlmICghdmRldi0+cmVzZXRfd29ya3MpCi0JCQln b3RvIG91dDsKLQotCQlwY2lfc2F2ZV9zdGF0ZShwZGV2KTsKLQl9Ci0KLQkvKgotCSAqIERpc2Fi bGUgSU5UeCBhbmQgTVNJLCBwcmVzdW1hYmx5IHRvIGF2b2lkIHNwdXJpb3VzIGludGVycnVwdHMK LQkgKiBkdXJpbmcgcmVzZXQuICBTdG9sZW4gZnJvbSBwY2lfcmVzZXRfZnVuY3Rpb24oKQotCSAq LwotCXBjaV93cml0ZV9jb25maWdfd29yZChwZGV2LCBQQ0lfQ09NTUFORCwgUENJX0NPTU1BTkRf SU5UWF9ESVNBQkxFKTsKLQotCS8qCi0JICogVHJ5IHRvIHJlc2V0IHRoZSBkZXZpY2UuICBUaGUg c3VjY2VzcyBvZiB0aGlzIGlzIGRlcGVuZGVudCBvbgotCSAqIGJlaW5nIGFibGUgdG8gbG9jayB0 aGUgZGV2aWNlLCB3aGljaCBpcyBub3QgYWx3YXlzIHBvc3NpYmxlLgotCSAqLwotCWlmICh2ZGV2 LT5yZXNldF93b3JrcyAmJiAhcGNpX3RyeV9yZXNldF9mdW5jdGlvbihwZGV2KSkKLQkJdmRldi0+ bmVlZHNfcmVzZXQgPSBmYWxzZTsKLQotCXBjaV9yZXN0b3JlX3N0YXRlKHBkZXYpOwotb3V0Ogot CXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKLQotCXZmaW9fcGNpX3RyeV9idXNfcmVzZXQodmRl dik7Ci0KLQlpZiAoIWRpc2FibGVfaWRsZV9kMykKLQkJdmZpb19wY2lfc2V0X3Bvd2VyX3N0YXRl KHZkZXYsIFBDSV9EM2hvdCk7Ci19Ci0KIHN0YXRpYyB2b2lkIHZmaW9fcGNpX3JlbGVhc2Uodm9p ZCAqZGV2aWNlX2RhdGEpCiB7CiAJc3RydWN0IHZmaW9fcGNpX2RldmljZSAqdmRldiA9IGRldmlj ZV9kYXRhOwpAQCAtNTAyLDc3NiArOTcsNiBAQCBzdGF0aWMgaW50IHZmaW9fcGNpX29wZW4odm9p ZCAqZGV2aWNlX2RhdGEpCiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCB2ZmlvX3BjaV9n ZXRfaXJxX2NvdW50KHN0cnVjdCB2ZmlvX3BjaV9kZXZpY2UgKnZkZXYsIGludCBpcnFfdHlwZSkK LXsKLQlpZiAoaXJxX3R5cGUgPT0gVkZJT19QQ0lfSU5UWF9JUlFfSU5ERVgpIHsKLQkJdTggcGlu OwotCi0JCWlmICghSVNfRU5BQkxFRChDT05GSUdfVkZJT19QQ0lfSU5UWCkgfHwKLQkJICAgIHZk ZXYtPm5vaW50eCB8fCB2ZGV2LT5wZGV2LT5pc192aXJ0Zm4pCi0JCQlyZXR1cm4gMDsKLQotCQlw Y2lfcmVhZF9jb25maWdfYnl0ZSh2ZGV2LT5wZGV2LCBQQ0lfSU5URVJSVVBUX1BJTiwgJnBpbik7 Ci0KLQkJcmV0dXJuIHBpbiA/IDEgOiAwOwotCX0gZWxzZSBpZiAoaXJxX3R5cGUgPT0gVkZJT19Q Q0lfTVNJX0lSUV9JTkRFWCkgewotCQl1OCBwb3M7Ci0JCXUxNiBmbGFnczsKLQotCQlwb3MgPSB2 ZGV2LT5wZGV2LT5tc2lfY2FwOwotCQlpZiAocG9zKSB7Ci0JCQlwY2lfcmVhZF9jb25maWdfd29y ZCh2ZGV2LT5wZGV2LAotCQkJCQkgICAgIHBvcyArIFBDSV9NU0lfRkxBR1MsICZmbGFncyk7Ci0J CQlyZXR1cm4gMSA8PCAoKGZsYWdzICYgUENJX01TSV9GTEFHU19RTUFTSykgPj4gMSk7Ci0JCX0K LQl9IGVsc2UgaWYgKGlycV90eXBlID09IFZGSU9fUENJX01TSVhfSVJRX0lOREVYKSB7Ci0JCXU4 IHBvczsKLQkJdTE2IGZsYWdzOwotCi0JCXBvcyA9IHZkZXYtPnBkZXYtPm1zaXhfY2FwOwotCQlp ZiAocG9zKSB7Ci0JCQlwY2lfcmVhZF9jb25maWdfd29yZCh2ZGV2LT5wZGV2LAotCQkJCQkgICAg IHBvcyArIFBDSV9NU0lYX0ZMQUdTLCAmZmxhZ3MpOwotCi0JCQlyZXR1cm4gKGZsYWdzICYgUENJ X01TSVhfRkxBR1NfUVNJWkUpICsgMTsKLQkJfQotCX0gZWxzZSBpZiAoaXJxX3R5cGUgPT0gVkZJ T19QQ0lfRVJSX0lSUV9JTkRFWCkgewotCQlpZiAocGNpX2lzX3BjaWUodmRldi0+cGRldikpCi0J CQlyZXR1cm4gMTsKLQl9IGVsc2UgaWYgKGlycV90eXBlID09IFZGSU9fUENJX1JFUV9JUlFfSU5E RVgpIHsKLQkJcmV0dXJuIDE7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdmZp b19wY2lfY291bnRfZGV2cyhzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdm9pZCAqZGF0YSkKLXsKLQko KihpbnQgKilkYXRhKSsrOwotCXJldHVybiAwOwotfQotCi1zdHJ1Y3QgdmZpb19wY2lfZmlsbF9p bmZvIHsKLQlpbnQgbWF4OwotCWludCBjdXI7Ci0Jc3RydWN0IHZmaW9fcGNpX2RlcGVuZGVudF9k ZXZpY2UgKmRldmljZXM7Ci19OwotCi1zdGF0aWMgaW50IHZmaW9fcGNpX2ZpbGxfZGV2cyhzdHJ1 Y3QgcGNpX2RldiAqcGRldiwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgdmZpb19wY2lfZmlsbF9p bmZvICpmaWxsID0gZGF0YTsKLQlzdHJ1Y3QgaW9tbXVfZ3JvdXAgKmlvbW11X2dyb3VwOwotCi0J aWYgKGZpbGwtPmN1ciA9PSBmaWxsLT5tYXgpCi0JCXJldHVybiAtRUFHQUlOOyAvKiBTb21ldGhp bmcgY2hhbmdlZCwgdHJ5IGFnYWluICovCi0KLQlpb21tdV9ncm91cCA9IGlvbW11X2dyb3VwX2dl dCgmcGRldi0+ZGV2KTsKLQlpZiAoIWlvbW11X2dyb3VwKQotCQlyZXR1cm4gLUVQRVJNOyAvKiBD YW5ub3QgcmVzZXQgbm9uLWlzb2xhdGVkIGRldmljZXMgKi8KLQotCWZpbGwtPmRldmljZXNbZmls bC0+Y3VyXS5ncm91cF9pZCA9IGlvbW11X2dyb3VwX2lkKGlvbW11X2dyb3VwKTsKLQlmaWxsLT5k ZXZpY2VzW2ZpbGwtPmN1cl0uc2VnbWVudCA9IHBjaV9kb21haW5fbnIocGRldi0+YnVzKTsKLQlm aWxsLT5kZXZpY2VzW2ZpbGwtPmN1cl0uYnVzID0gcGRldi0+YnVzLT5udW1iZXI7Ci0JZmlsbC0+ ZGV2aWNlc1tmaWxsLT5jdXJdLmRldmZuID0gcGRldi0+ZGV2Zm47Ci0JZmlsbC0+Y3VyKys7Ci0J aW9tbXVfZ3JvdXBfcHV0KGlvbW11X2dyb3VwKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RydWN0IHZm aW9fcGNpX2dyb3VwX2VudHJ5IHsKLQlzdHJ1Y3QgdmZpb19ncm91cCAqZ3JvdXA7Ci0JaW50IGlk OwotfTsKLQotc3RydWN0IHZmaW9fcGNpX2dyb3VwX2luZm8gewotCWludCBjb3VudDsKLQlzdHJ1 Y3QgdmZpb19wY2lfZ3JvdXBfZW50cnkgKmdyb3VwczsKLX07Ci0KLXN0YXRpYyBpbnQgdmZpb19w Y2lfdmFsaWRhdGVfZGV2cyhzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdm9pZCAqZGF0YSkKLXsKLQlz dHJ1Y3QgdmZpb19wY2lfZ3JvdXBfaW5mbyAqaW5mbyA9IGRhdGE7Ci0Jc3RydWN0IGlvbW11X2dy b3VwICpncm91cDsKLQlpbnQgaWQsIGk7Ci0KLQlncm91cCA9IGlvbW11X2dyb3VwX2dldCgmcGRl di0+ZGV2KTsKLQlpZiAoIWdyb3VwKQotCQlyZXR1cm4gLUVQRVJNOwotCi0JaWQgPSBpb21tdV9n cm91cF9pZChncm91cCk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgaW5mby0+Y291bnQ7IGkrKykKLQkJ aWYgKGluZm8tPmdyb3Vwc1tpXS5pZCA9PSBpZCkKLQkJCWJyZWFrOwotCi0JaW9tbXVfZ3JvdXBf cHV0KGdyb3VwKTsKLQotCXJldHVybiAoaSA9PSBpbmZvLT5jb3VudCkgPyAtRUlOVkFMIDogMDsK LX0KLQotc3RhdGljIGJvb2wgdmZpb19wY2lfZGV2X2JlbG93X3Nsb3Qoc3RydWN0IHBjaV9kZXYg KnBkZXYsIHN0cnVjdCBwY2lfc2xvdCAqc2xvdCkKLXsKLQlmb3IgKDsgcGRldjsgcGRldiA9IHBk ZXYtPmJ1cy0+c2VsZikKLQkJaWYgKHBkZXYtPmJ1cyA9PSBzbG90LT5idXMpCi0JCQlyZXR1cm4g KHBkZXYtPnNsb3QgPT0gc2xvdCk7Ci0JcmV0dXJuIGZhbHNlOwotfQotCi1zdHJ1Y3QgdmZpb19w Y2lfd2Fsa19pbmZvIHsKLQlpbnQgKCpmbikoc3RydWN0IHBjaV9kZXYgKiwgdm9pZCAqZGF0YSk7 Ci0Jdm9pZCAqZGF0YTsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKLQlib29sIHNsb3Q7Ci0JaW50 IHJldDsKLX07Ci0KLXN0YXRpYyBpbnQgdmZpb19wY2lfd2Fsa193cmFwcGVyKHN0cnVjdCBwY2lf ZGV2ICpwZGV2LCB2b2lkICpkYXRhKQotewotCXN0cnVjdCB2ZmlvX3BjaV93YWxrX2luZm8gKndh bGsgPSBkYXRhOwotCi0JaWYgKCF3YWxrLT5zbG90IHx8IHZmaW9fcGNpX2Rldl9iZWxvd19zbG90 KHBkZXYsIHdhbGstPnBkZXYtPnNsb3QpKQotCQl3YWxrLT5yZXQgPSB3YWxrLT5mbihwZGV2LCB3 YWxrLT5kYXRhKTsKLQotCXJldHVybiB3YWxrLT5yZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdmZpb19w Y2lfZm9yX2VhY2hfc2xvdF9vcl9idXMoc3RydWN0IHBjaV9kZXYgKnBkZXYsCi0JCQkJCSBpbnQg KCpmbikoc3RydWN0IHBjaV9kZXYgKiwKLQkJCQkJCSAgIHZvaWQgKmRhdGEpLCB2b2lkICpkYXRh LAotCQkJCQkgYm9vbCBzbG90KQotewotCXN0cnVjdCB2ZmlvX3BjaV93YWxrX2luZm8gd2FsayA9 IHsKLQkJLmZuID0gZm4sIC5kYXRhID0gZGF0YSwgLnBkZXYgPSBwZGV2LCAuc2xvdCA9IHNsb3Qs IC5yZXQgPSAwLAotCX07Ci0KLQlwY2lfd2Fsa19idXMocGRldi0+YnVzLCB2ZmlvX3BjaV93YWxr X3dyYXBwZXIsICZ3YWxrKTsKLQotCXJldHVybiB3YWxrLnJldDsKLX0KLQotc3RhdGljIGludCBt c2l4X21tYXBwYWJsZV9jYXAoc3RydWN0IHZmaW9fcGNpX2RldmljZSAqdmRldiwKLQkJCSAgICAg IHN0cnVjdCB2ZmlvX2luZm9fY2FwICpjYXBzKQotewotCXN0cnVjdCB2ZmlvX2luZm9fY2FwX2hl YWRlciBoZWFkZXIgPSB7Ci0JCS5pZCA9IFZGSU9fUkVHSU9OX0lORk9fQ0FQX01TSVhfTUFQUEFC TEUsCi0JCS52ZXJzaW9uID0gMQotCX07Ci0KLQlyZXR1cm4gdmZpb19pbmZvX2FkZF9jYXBhYmls aXR5KGNhcHMsICZoZWFkZXIsIHNpemVvZihoZWFkZXIpKTsKLX0KLQotaW50IHZmaW9fcGNpX3Jl Z2lzdGVyX2Rldl9yZWdpb24oc3RydWN0IHZmaW9fcGNpX2RldmljZSAqdmRldiwKLQkJCQkgdW5z aWduZWQgaW50IHR5cGUsIHVuc2lnbmVkIGludCBzdWJ0eXBlLAotCQkJCSBjb25zdCBzdHJ1Y3Qg dmZpb19wY2lfcmVnb3BzICpvcHMsCi0JCQkJIHNpemVfdCBzaXplLCB1MzIgZmxhZ3MsIHZvaWQg KmRhdGEpCi17Ci0Jc3RydWN0IHZmaW9fcGNpX3JlZ2lvbiAqcmVnaW9uOwotCi0JcmVnaW9uID0g a3JlYWxsb2ModmRldi0+cmVnaW9uLAotCQkJICAodmRldi0+bnVtX3JlZ2lvbnMgKyAxKSAqIHNp emVvZigqcmVnaW9uKSwKLQkJCSAgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFyZWdpb24pCi0JCXJldHVy biAtRU5PTUVNOwotCi0JdmRldi0+cmVnaW9uID0gcmVnaW9uOwotCXZkZXYtPnJlZ2lvblt2ZGV2 LT5udW1fcmVnaW9uc10udHlwZSA9IHR5cGU7Ci0JdmRldi0+cmVnaW9uW3ZkZXYtPm51bV9yZWdp b25zXS5zdWJ0eXBlID0gc3VidHlwZTsKLQl2ZGV2LT5yZWdpb25bdmRldi0+bnVtX3JlZ2lvbnNd Lm9wcyA9IG9wczsKLQl2ZGV2LT5yZWdpb25bdmRldi0+bnVtX3JlZ2lvbnNdLnNpemUgPSBzaXpl OwotCXZkZXYtPnJlZ2lvblt2ZGV2LT5udW1fcmVnaW9uc10uZmxhZ3MgPSBmbGFnczsKLQl2ZGV2 LT5yZWdpb25bdmRldi0+bnVtX3JlZ2lvbnNdLmRhdGEgPSBkYXRhOwotCi0JdmRldi0+bnVtX3Jl Z2lvbnMrKzsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgbG9uZyB2ZmlvX3BjaV9pb2N0bCh2 b2lkICpkZXZpY2VfZGF0YSwKLQkJCSAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcg YXJnKQotewotCXN0cnVjdCB2ZmlvX3BjaV9kZXZpY2UgKnZkZXYgPSBkZXZpY2VfZGF0YTsKLQl1 bnNpZ25lZCBsb25nIG1pbnN6OwotCi0JaWYgKGNtZCA9PSBWRklPX0RFVklDRV9HRVRfSU5GTykg ewotCQlzdHJ1Y3QgdmZpb19kZXZpY2VfaW5mbyBpbmZvOwotCi0JCW1pbnN6ID0gb2Zmc2V0b2Zl bmQoc3RydWN0IHZmaW9fZGV2aWNlX2luZm8sIG51bV9pcnFzKTsKLQotCQlpZiAoY29weV9mcm9t X3VzZXIoJmluZm8sICh2b2lkIF9fdXNlciAqKWFyZywgbWluc3opKQotCQkJcmV0dXJuIC1FRkFV TFQ7Ci0KLQkJaWYgKGluZm8uYXJnc3ogPCBtaW5zeikKLQkJCXJldHVybiAtRUlOVkFMOwotCi0J CWluZm8uZmxhZ3MgPSBWRklPX0RFVklDRV9GTEFHU19QQ0k7Ci0KLQkJaWYgKHZkZXYtPnJlc2V0 X3dvcmtzKQotCQkJaW5mby5mbGFncyB8PSBWRklPX0RFVklDRV9GTEFHU19SRVNFVDsKLQotCQlp bmZvLm51bV9yZWdpb25zID0gVkZJT19QQ0lfTlVNX1JFR0lPTlMgKyB2ZGV2LT5udW1fcmVnaW9u czsKLQkJaW5mby5udW1faXJxcyA9IFZGSU9fUENJX05VTV9JUlFTOwotCi0JCXJldHVybiBjb3B5 X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmaW5mbywgbWluc3opID8KLQkJCS1FRkFVTFQg OiAwOwotCi0JfSBlbHNlIGlmIChjbWQgPT0gVkZJT19ERVZJQ0VfR0VUX1JFR0lPTl9JTkZPKSB7 Ci0JCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdmRldi0+cGRldjsKLQkJc3RydWN0IHZmaW9fcmVn aW9uX2luZm8gaW5mbzsKLQkJc3RydWN0IHZmaW9faW5mb19jYXAgY2FwcyA9IHsgLmJ1ZiA9IE5V TEwsIC5zaXplID0gMCB9OwotCQlpbnQgaSwgcmV0OwotCi0JCW1pbnN6ID0gb2Zmc2V0b2ZlbmQo c3RydWN0IHZmaW9fcmVnaW9uX2luZm8sIG9mZnNldCk7Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2Vy KCZpbmZvLCAodm9pZCBfX3VzZXIgKilhcmcsIG1pbnN6KSkKLQkJCXJldHVybiAtRUZBVUxUOwot Ci0JCWlmIChpbmZvLmFyZ3N6IDwgbWluc3opCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQotCQlzd2l0 Y2ggKGluZm8uaW5kZXgpIHsKLQkJY2FzZSBWRklPX1BDSV9DT05GSUdfUkVHSU9OX0lOREVYOgot CQkJaW5mby5vZmZzZXQgPSBWRklPX1BDSV9JTkRFWF9UT19PRkZTRVQoaW5mby5pbmRleCk7Ci0J CQlpbmZvLnNpemUgPSBwZGV2LT5jZmdfc2l6ZTsKLQkJCWluZm8uZmxhZ3MgPSBWRklPX1JFR0lP Tl9JTkZPX0ZMQUdfUkVBRCB8Ci0JCQkJICAgICBWRklPX1JFR0lPTl9JTkZPX0ZMQUdfV1JJVEU7 Ci0JCQlicmVhazsKLQkJY2FzZSBWRklPX1BDSV9CQVIwX1JFR0lPTl9JTkRFWCAuLi4gVkZJT19Q Q0lfQkFSNV9SRUdJT05fSU5ERVg6Ci0JCQlpbmZvLm9mZnNldCA9IFZGSU9fUENJX0lOREVYX1RP X09GRlNFVChpbmZvLmluZGV4KTsKLQkJCWluZm8uc2l6ZSA9IHBjaV9yZXNvdXJjZV9sZW4ocGRl diwgaW5mby5pbmRleCk7Ci0JCQlpZiAoIWluZm8uc2l6ZSkgewotCQkJCWluZm8uZmxhZ3MgPSAw OwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlpbmZvLmZsYWdzID0gVkZJT19SRUdJT05fSU5GT19G TEFHX1JFQUQgfAotCQkJCSAgICAgVkZJT19SRUdJT05fSU5GT19GTEFHX1dSSVRFOwotCQkJaWYg KHZkZXYtPmJhcl9tbWFwX3N1cHBvcnRlZFtpbmZvLmluZGV4XSkgewotCQkJCWluZm8uZmxhZ3Mg fD0gVkZJT19SRUdJT05fSU5GT19GTEFHX01NQVA7Ci0JCQkJaWYgKGluZm8uaW5kZXggPT0gdmRl di0+bXNpeF9iYXIpIHsKLQkJCQkJcmV0ID0gbXNpeF9tbWFwcGFibGVfY2FwKHZkZXYsICZjYXBz KTsKLQkJCQkJaWYgKHJldCkKLQkJCQkJCXJldHVybiByZXQ7Ci0JCQkJfQotCQkJfQotCi0JCQli cmVhazsKLQkJY2FzZSBWRklPX1BDSV9ST01fUkVHSU9OX0lOREVYOgotCQl7Ci0JCQl2b2lkIF9f aW9tZW0gKmlvOwotCQkJc2l6ZV90IHNpemU7Ci0JCQl1MTYgb3JpZ19jbWQ7Ci0KLQkJCWluZm8u b2Zmc2V0ID0gVkZJT19QQ0lfSU5ERVhfVE9fT0ZGU0VUKGluZm8uaW5kZXgpOwotCQkJaW5mby5m bGFncyA9IDA7Ci0KLQkJCS8qIFJlcG9ydCB0aGUgQkFSIHNpemUsIG5vdCB0aGUgUk9NIHNpemUg Ki8KLQkJCWluZm8uc2l6ZSA9IHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgaW5mby5pbmRleCk7Ci0J CQlpZiAoIWluZm8uc2l6ZSkgewotCQkJCS8qIFNoYWRvdyBST01zIGFwcGVhciBhcyBQQ0kgb3B0 aW9uIFJPTXMgKi8KLQkJCQlpZiAocGRldi0+cmVzb3VyY2VbUENJX1JPTV9SRVNPVVJDRV0uZmxh Z3MgJgotCQkJCQkJCUlPUkVTT1VSQ0VfUk9NX1NIQURPVykKLQkJCQkJaW5mby5zaXplID0gMHgy MDAwMDsKLQkJCQllbHNlCi0JCQkJCWJyZWFrOwotCQkJfQotCi0JCQkvKgotCQkJICogSXMgaXQg cmVhbGx5IHRoZXJlPyAgRW5hYmxlIG1lbW9yeSBkZWNvZGUgZm9yCi0JCQkgKiBpbXBsaWNpdCBh Y2Nlc3MgaW4gcGNpX21hcF9yb20oKS4KLQkJCSAqLwotCQkJcGNpX3JlYWRfY29uZmlnX3dvcmQo cGRldiwgUENJX0NPTU1BTkQsICZvcmlnX2NtZCk7Ci0JCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQo cGRldiwgUENJX0NPTU1BTkQsCi0JCQkJCSAgICAgIG9yaWdfY21kIHwgUENJX0NPTU1BTkRfTUVN T1JZKTsKLQotCQkJaW8gPSBwY2lfbWFwX3JvbShwZGV2LCAmc2l6ZSk7Ci0JCQlpZiAoaW8pIHsK LQkJCQlpbmZvLmZsYWdzID0gVkZJT19SRUdJT05fSU5GT19GTEFHX1JFQUQ7Ci0JCQkJcGNpX3Vu bWFwX3JvbShwZGV2LCBpbyk7Ci0JCQl9IGVsc2UgewotCQkJCWluZm8uc2l6ZSA9IDA7Ci0JCQl9 Ci0KLQkJCXBjaV93cml0ZV9jb25maWdfd29yZChwZGV2LCBQQ0lfQ09NTUFORCwgb3JpZ19jbWQp OwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBWRklPX1BDSV9WR0FfUkVHSU9OX0lOREVYOgotCQkJ aWYgKCF2ZGV2LT5oYXNfdmdhKQotCQkJCXJldHVybiAtRUlOVkFMOwotCi0JCQlpbmZvLm9mZnNl dCA9IFZGSU9fUENJX0lOREVYX1RPX09GRlNFVChpbmZvLmluZGV4KTsKLQkJCWluZm8uc2l6ZSA9 IDB4YzAwMDA7Ci0JCQlpbmZvLmZsYWdzID0gVkZJT19SRUdJT05fSU5GT19GTEFHX1JFQUQgfAot CQkJCSAgICAgVkZJT19SRUdJT05fSU5GT19GTEFHX1dSSVRFOwotCi0JCQlicmVhazsKLQkJZGVm YXVsdDoKLQkJewotCQkJc3RydWN0IHZmaW9fcmVnaW9uX2luZm9fY2FwX3R5cGUgY2FwX3R5cGUg PSB7Ci0JCQkJCS5oZWFkZXIuaWQgPSBWRklPX1JFR0lPTl9JTkZPX0NBUF9UWVBFLAotCQkJCQku aGVhZGVyLnZlcnNpb24gPSAxIH07Ci0KLQkJCWlmIChpbmZvLmluZGV4ID49Ci0JCQkgICAgVkZJ T19QQ0lfTlVNX1JFR0lPTlMgKyB2ZGV2LT5udW1fcmVnaW9ucykKLQkJCQlyZXR1cm4gLUVJTlZB TDsKLQkJCWluZm8uaW5kZXggPSBhcnJheV9pbmRleF9ub3NwZWMoaW5mby5pbmRleCwKLQkJCQkJ CQlWRklPX1BDSV9OVU1fUkVHSU9OUyArCi0JCQkJCQkJdmRldi0+bnVtX3JlZ2lvbnMpOwotCi0J CQlpID0gaW5mby5pbmRleCAtIFZGSU9fUENJX05VTV9SRUdJT05TOwotCi0JCQlpbmZvLm9mZnNl dCA9IFZGSU9fUENJX0lOREVYX1RPX09GRlNFVChpbmZvLmluZGV4KTsKLQkJCWluZm8uc2l6ZSA9 IHZkZXYtPnJlZ2lvbltpXS5zaXplOwotCQkJaW5mby5mbGFncyA9IHZkZXYtPnJlZ2lvbltpXS5m bGFnczsKLQotCQkJY2FwX3R5cGUudHlwZSA9IHZkZXYtPnJlZ2lvbltpXS50eXBlOwotCQkJY2Fw X3R5cGUuc3VidHlwZSA9IHZkZXYtPnJlZ2lvbltpXS5zdWJ0eXBlOwotCi0JCQlyZXQgPSB2Zmlv X2luZm9fYWRkX2NhcGFiaWxpdHkoJmNhcHMsICZjYXBfdHlwZS5oZWFkZXIsCi0JCQkJCQkgICAg ICAgc2l6ZW9mKGNhcF90eXBlKSk7Ci0JCQlpZiAocmV0KQotCQkJCXJldHVybiByZXQ7Ci0KLQkJ CWlmICh2ZGV2LT5yZWdpb25baV0ub3BzLT5hZGRfY2FwYWJpbGl0eSkgewotCQkJCXJldCA9IHZk ZXYtPnJlZ2lvbltpXS5vcHMtPmFkZF9jYXBhYmlsaXR5KHZkZXYsCi0JCQkJCQkmdmRldi0+cmVn aW9uW2ldLCAmY2Fwcyk7Ci0JCQkJaWYgKHJldCkKLQkJCQkJcmV0dXJuIHJldDsKLQkJCX0KLQkJ fQotCQl9Ci0KLQkJaWYgKGNhcHMuc2l6ZSkgewotCQkJaW5mby5mbGFncyB8PSBWRklPX1JFR0lP Tl9JTkZPX0ZMQUdfQ0FQUzsKLQkJCWlmIChpbmZvLmFyZ3N6IDwgc2l6ZW9mKGluZm8pICsgY2Fw cy5zaXplKSB7Ci0JCQkJaW5mby5hcmdzeiA9IHNpemVvZihpbmZvKSArIGNhcHMuc2l6ZTsKLQkJ CQlpbmZvLmNhcF9vZmZzZXQgPSAwOwotCQkJfSBlbHNlIHsKLQkJCQl2ZmlvX2luZm9fY2FwX3No aWZ0KCZjYXBzLCBzaXplb2YoaW5mbykpOwotCQkJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191 c2VyICopYXJnICsKLQkJCQkJCSAgc2l6ZW9mKGluZm8pLCBjYXBzLmJ1ZiwKLQkJCQkJCSAgY2Fw cy5zaXplKSkgewotCQkJCQlrZnJlZShjYXBzLmJ1Zik7Ci0JCQkJCXJldHVybiAtRUZBVUxUOwot CQkJCX0KLQkJCQlpbmZvLmNhcF9vZmZzZXQgPSBzaXplb2YoaW5mbyk7Ci0JCQl9Ci0KLQkJCWtm cmVlKGNhcHMuYnVmKTsKLQkJfQotCi0JCXJldHVybiBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2Vy ICopYXJnLCAmaW5mbywgbWluc3opID8KLQkJCS1FRkFVTFQgOiAwOwotCi0JfSBlbHNlIGlmIChj bWQgPT0gVkZJT19ERVZJQ0VfR0VUX0lSUV9JTkZPKSB7Ci0JCXN0cnVjdCB2ZmlvX2lycV9pbmZv IGluZm87Ci0KLQkJbWluc3ogPSBvZmZzZXRvZmVuZChzdHJ1Y3QgdmZpb19pcnFfaW5mbywgY291 bnQpOwotCi0JCWlmIChjb3B5X2Zyb21fdXNlcigmaW5mbywgKHZvaWQgX191c2VyICopYXJnLCBt aW5zeikpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQlpZiAoaW5mby5hcmdzeiA8IG1pbnN6IHx8 IGluZm8uaW5kZXggPj0gVkZJT19QQ0lfTlVNX0lSUVMpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQot CQlzd2l0Y2ggKGluZm8uaW5kZXgpIHsKLQkJY2FzZSBWRklPX1BDSV9JTlRYX0lSUV9JTkRFWCAu Li4gVkZJT19QQ0lfTVNJWF9JUlFfSU5ERVg6Ci0JCWNhc2UgVkZJT19QQ0lfUkVRX0lSUV9JTkRF WDoKLQkJCWJyZWFrOwotCQljYXNlIFZGSU9fUENJX0VSUl9JUlFfSU5ERVg6Ci0JCQlpZiAocGNp X2lzX3BjaWUodmRldi0+cGRldikpCi0JCQkJYnJlYWs7Ci0JCS8qIGZhbGwgdGhyb3VnaCAqLwot CQlkZWZhdWx0OgotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQotCQlpbmZvLmZsYWdzID0gVkZJ T19JUlFfSU5GT19FVkVOVEZEOwotCi0JCWluZm8uY291bnQgPSB2ZmlvX3BjaV9nZXRfaXJxX2Nv dW50KHZkZXYsIGluZm8uaW5kZXgpOwotCi0JCWlmIChpbmZvLmluZGV4ID09IFZGSU9fUENJX0lO VFhfSVJRX0lOREVYKQotCQkJaW5mby5mbGFncyB8PSAoVkZJT19JUlFfSU5GT19NQVNLQUJMRSB8 Ci0JCQkJICAgICAgIFZGSU9fSVJRX0lORk9fQVVUT01BU0tFRCk7Ci0JCWVsc2UKLQkJCWluZm8u ZmxhZ3MgfD0gVkZJT19JUlFfSU5GT19OT1JFU0laRTsKLQotCQlyZXR1cm4gY29weV90b191c2Vy KCh2b2lkIF9fdXNlciAqKWFyZywgJmluZm8sIG1pbnN6KSA/Ci0JCQktRUZBVUxUIDogMDsKLQot CX0gZWxzZSBpZiAoY21kID09IFZGSU9fREVWSUNFX1NFVF9JUlFTKSB7Ci0JCXN0cnVjdCB2Zmlv X2lycV9zZXQgaGRyOwotCQl1OCAqZGF0YSA9IE5VTEw7Ci0JCWludCBtYXgsIHJldCA9IDA7Ci0J CXNpemVfdCBkYXRhX3NpemUgPSAwOwotCi0JCW1pbnN6ID0gb2Zmc2V0b2ZlbmQoc3RydWN0IHZm aW9faXJxX3NldCwgY291bnQpOwotCi0JCWlmIChjb3B5X2Zyb21fdXNlcigmaGRyLCAodm9pZCBf X3VzZXIgKilhcmcsIG1pbnN6KSkKLQkJCXJldHVybiAtRUZBVUxUOwotCi0JCW1heCA9IHZmaW9f cGNpX2dldF9pcnFfY291bnQodmRldiwgaGRyLmluZGV4KTsKLQotCQlyZXQgPSB2ZmlvX3NldF9p cnFzX3ZhbGlkYXRlX2FuZF9wcmVwYXJlKCZoZHIsIG1heCwKLQkJCQkJCSBWRklPX1BDSV9OVU1f SVJRUywgJmRhdGFfc2l6ZSk7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OwotCi0JCWlmIChk YXRhX3NpemUpIHsKLQkJCWRhdGEgPSBtZW1kdXBfdXNlcigodm9pZCBfX3VzZXIgKikoYXJnICsg bWluc3opLAotCQkJCQkgICAgZGF0YV9zaXplKTsKLQkJCWlmIChJU19FUlIoZGF0YSkpCi0JCQkJ cmV0dXJuIFBUUl9FUlIoZGF0YSk7Ci0JCX0KLQotCQltdXRleF9sb2NrKCZ2ZGV2LT5pZ2F0ZSk7 Ci0KLQkJcmV0ID0gdmZpb19wY2lfc2V0X2lycXNfaW9jdGwodmRldiwgaGRyLmZsYWdzLCBoZHIu aW5kZXgsCi0JCQkJCSAgICAgIGhkci5zdGFydCwgaGRyLmNvdW50LCBkYXRhKTsKLQotCQltdXRl eF91bmxvY2soJnZkZXYtPmlnYXRlKTsKLQkJa2ZyZWUoZGF0YSk7Ci0KLQkJcmV0dXJuIHJldDsK LQotCX0gZWxzZSBpZiAoY21kID09IFZGSU9fREVWSUNFX1JFU0VUKSB7Ci0JCXJldHVybiB2ZGV2 LT5yZXNldF93b3JrcyA/Ci0JCQlwY2lfdHJ5X3Jlc2V0X2Z1bmN0aW9uKHZkZXYtPnBkZXYpIDog LUVJTlZBTDsKLQotCX0gZWxzZSBpZiAoY21kID09IFZGSU9fREVWSUNFX0dFVF9QQ0lfSE9UX1JF U0VUX0lORk8pIHsKLQkJc3RydWN0IHZmaW9fcGNpX2hvdF9yZXNldF9pbmZvIGhkcjsKLQkJc3Ry dWN0IHZmaW9fcGNpX2ZpbGxfaW5mbyBmaWxsID0geyAwIH07Ci0JCXN0cnVjdCB2ZmlvX3BjaV9k ZXBlbmRlbnRfZGV2aWNlICpkZXZpY2VzID0gTlVMTDsKLQkJYm9vbCBzbG90ID0gZmFsc2U7Ci0J CWludCByZXQgPSAwOwotCi0JCW1pbnN6ID0gb2Zmc2V0b2ZlbmQoc3RydWN0IHZmaW9fcGNpX2hv dF9yZXNldF9pbmZvLCBjb3VudCk7Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZoZHIsICh2b2lk IF9fdXNlciAqKWFyZywgbWluc3opKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJaWYgKGhkci5h cmdzeiA8IG1pbnN6KQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJaGRyLmZsYWdzID0gMDsKLQot CQkvKiBDYW4gd2UgZG8gYSBzbG90IG9yIGJ1cyByZXNldCBvciBuZWl0aGVyPyAqLwotCQlpZiAo IXBjaV9wcm9iZV9yZXNldF9zbG90KHZkZXYtPnBkZXYtPnNsb3QpKQotCQkJc2xvdCA9IHRydWU7 Ci0JCWVsc2UgaWYgKHBjaV9wcm9iZV9yZXNldF9idXModmRldi0+cGRldi0+YnVzKSkKLQkJCXJl dHVybiAtRU5PREVWOwotCi0JCS8qIEhvdyBtYW55IGRldmljZXMgYXJlIGFmZmVjdGVkPyAqLwot CQlyZXQgPSB2ZmlvX3BjaV9mb3JfZWFjaF9zbG90X29yX2J1cyh2ZGV2LT5wZGV2LAotCQkJCQkJ ICAgIHZmaW9fcGNpX2NvdW50X2RldnMsCi0JCQkJCQkgICAgJmZpbGwubWF4LCBzbG90KTsKLQkJ aWYgKHJldCkKLQkJCXJldHVybiByZXQ7Ci0KLQkJV0FSTl9PTighZmlsbC5tYXgpOyAvKiBTaG91 bGQgYWx3YXlzIGJlIGF0IGxlYXN0IG9uZSAqLwotCi0JCS8qCi0JCSAqIElmIHRoZXJlJ3MgZW5v dWdoIHNwYWNlLCBmaWxsIGl0IG5vdywgb3RoZXJ3aXNlIHJldHVybgotCQkgKiAtRU5PU1BDIGFu ZCB0aGUgbnVtYmVyIG9mIGRldmljZXMgYWZmZWN0ZWQuCi0JCSAqLwotCQlpZiAoaGRyLmFyZ3N6 IDwgc2l6ZW9mKGhkcikgKyAoZmlsbC5tYXggKiBzaXplb2YoKmRldmljZXMpKSkgewotCQkJcmV0 ID0gLUVOT1NQQzsKLQkJCWhkci5jb3VudCA9IGZpbGwubWF4OwotCQkJZ290byByZXNldF9pbmZv X2V4aXQ7Ci0JCX0KLQotCQlkZXZpY2VzID0ga2NhbGxvYyhmaWxsLm1heCwgc2l6ZW9mKCpkZXZp Y2VzKSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghZGV2aWNlcykKLQkJCXJldHVybiAtRU5PTUVNOwot Ci0JCWZpbGwuZGV2aWNlcyA9IGRldmljZXM7Ci0KLQkJcmV0ID0gdmZpb19wY2lfZm9yX2VhY2hf c2xvdF9vcl9idXModmRldi0+cGRldiwKLQkJCQkJCSAgICB2ZmlvX3BjaV9maWxsX2RldnMsCi0J CQkJCQkgICAgJmZpbGwsIHNsb3QpOwotCi0JCS8qCi0JCSAqIElmIGEgZGV2aWNlIHdhcyByZW1v dmVkIGJldHdlZW4gY291bnRpbmcgYW5kIGZpbGxpbmcsCi0JCSAqIHdlIG1heSBjb21lIHVwIHNo b3J0IG9mIGZpbGwubWF4LiAgSWYgYSBkZXZpY2Ugd2FzCi0JCSAqIGFkZGVkLCB3ZSdsbCBoYXZl IGEgcmV0dXJuIG9mIC1FQUdBSU4gYWJvdmUuCi0JCSAqLwotCQlpZiAoIXJldCkKLQkJCWhkci5j b3VudCA9IGZpbGwuY3VyOwotCi1yZXNldF9pbmZvX2V4aXQ6Ci0JCWlmIChjb3B5X3RvX3VzZXIo KHZvaWQgX191c2VyICopYXJnLCAmaGRyLCBtaW5zeikpCi0JCQlyZXQgPSAtRUZBVUxUOwotCi0J CWlmICghcmV0KSB7Ci0JCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKShhcmcgKyBt aW5zeiksIGRldmljZXMsCi0JCQkJCSBoZHIuY291bnQgKiBzaXplb2YoKmRldmljZXMpKSkKLQkJ CQlyZXQgPSAtRUZBVUxUOwotCQl9Ci0KLQkJa2ZyZWUoZGV2aWNlcyk7Ci0JCXJldHVybiByZXQ7 Ci0KLQl9IGVsc2UgaWYgKGNtZCA9PSBWRklPX0RFVklDRV9QQ0lfSE9UX1JFU0VUKSB7Ci0JCXN0 cnVjdCB2ZmlvX3BjaV9ob3RfcmVzZXQgaGRyOwotCQlpbnQzMl90ICpncm91cF9mZHM7Ci0JCXN0 cnVjdCB2ZmlvX3BjaV9ncm91cF9lbnRyeSAqZ3JvdXBzOwotCQlzdHJ1Y3QgdmZpb19wY2lfZ3Jv dXBfaW5mbyBpbmZvOwotCQlib29sIHNsb3QgPSBmYWxzZTsKLQkJaW50IGksIGNvdW50ID0gMCwg cmV0ID0gMDsKLQotCQltaW5zeiA9IG9mZnNldG9mZW5kKHN0cnVjdCB2ZmlvX3BjaV9ob3RfcmVz ZXQsIGNvdW50KTsKLQotCQlpZiAoY29weV9mcm9tX3VzZXIoJmhkciwgKHZvaWQgX191c2VyICop YXJnLCBtaW5zeikpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQlpZiAoaGRyLmFyZ3N6IDwgbWlu c3ogfHwgaGRyLmZsYWdzKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJLyogQ2FuIHdlIGRvIGEg c2xvdCBvciBidXMgcmVzZXQgb3IgbmVpdGhlcj8gKi8KLQkJaWYgKCFwY2lfcHJvYmVfcmVzZXRf c2xvdCh2ZGV2LT5wZGV2LT5zbG90KSkKLQkJCXNsb3QgPSB0cnVlOwotCQllbHNlIGlmIChwY2lf cHJvYmVfcmVzZXRfYnVzKHZkZXYtPnBkZXYtPmJ1cykpCi0JCQlyZXR1cm4gLUVOT0RFVjsKLQot CQkvKgotCQkgKiBXZSBjYW4ndCBsZXQgdXNlcnNwYWNlIGdpdmUgdXMgYW4gYXJiaXRyYXJpbHkg bGFyZ2UKLQkJICogYnVmZmVyIHRvIGNvcHksIHNvIHZlcmlmeSBob3cgbWFueSB3ZSB0aGluayB0 aGVyZQotCQkgKiBjb3VsZCBiZS4gIE5vdGUgZ3JvdXBzIGNhbiBoYXZlIG11bHRpcGxlIGRldmlj ZXMgc28KLQkJICogb25lIGdyb3VwIHBlciBkZXZpY2UgaXMgdGhlIG1heC4KLQkJICovCi0JCXJl dCA9IHZmaW9fcGNpX2Zvcl9lYWNoX3Nsb3Rfb3JfYnVzKHZkZXYtPnBkZXYsCi0JCQkJCQkgICAg dmZpb19wY2lfY291bnRfZGV2cywKLQkJCQkJCSAgICAmY291bnQsIHNsb3QpOwotCQlpZiAocmV0 KQotCQkJcmV0dXJuIHJldDsKLQotCQkvKiBTb21ld2hlcmUgYmV0d2VlbiAxIGFuZCBjb3VudCBp cyBPSyAqLwotCQlpZiAoIWhkci5jb3VudCB8fCBoZHIuY291bnQgPiBjb3VudCkKLQkJCXJldHVy biAtRUlOVkFMOwotCi0JCWdyb3VwX2ZkcyA9IGtjYWxsb2MoaGRyLmNvdW50LCBzaXplb2YoKmdy b3VwX2ZkcyksIEdGUF9LRVJORUwpOwotCQlncm91cHMgPSBrY2FsbG9jKGhkci5jb3VudCwgc2l6 ZW9mKCpncm91cHMpLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFncm91cF9mZHMgfHwgIWdyb3Vwcykg ewotCQkJa2ZyZWUoZ3JvdXBfZmRzKTsKLQkJCWtmcmVlKGdyb3Vwcyk7Ci0JCQlyZXR1cm4gLUVO T01FTTsKLQkJfQotCi0JCWlmIChjb3B5X2Zyb21fdXNlcihncm91cF9mZHMsICh2b2lkIF9fdXNl ciAqKShhcmcgKyBtaW5zeiksCi0JCQkJICAgaGRyLmNvdW50ICogc2l6ZW9mKCpncm91cF9mZHMp KSkgewotCQkJa2ZyZWUoZ3JvdXBfZmRzKTsKLQkJCWtmcmVlKGdyb3Vwcyk7Ci0JCQlyZXR1cm4g LUVGQVVMVDsKLQkJfQotCi0JCS8qCi0JCSAqIEZvciBlYWNoIGdyb3VwX2ZkLCBnZXQgdGhlIGdy b3VwIHRocm91Z2ggdGhlIHZmaW8gZXh0ZXJuYWwKLQkJICogdXNlciBpbnRlcmZhY2UgYW5kIHN0 b3JlIHRoZSBncm91cCBhbmQgaW9tbXUgSUQuICBUaGlzCi0JCSAqIGVuc3VyZXMgdGhlIGdyb3Vw IGlzIGhlbGQgYWNyb3NzIHRoZSByZXNldC4KLQkJICovCi0JCWZvciAoaSA9IDA7IGkgPCBoZHIu Y291bnQ7IGkrKykgewotCQkJc3RydWN0IHZmaW9fZ3JvdXAgKmdyb3VwOwotCQkJc3RydWN0IGZk IGYgPSBmZGdldChncm91cF9mZHNbaV0pOwotCQkJaWYgKCFmLmZpbGUpIHsKLQkJCQlyZXQgPSAt RUJBREY7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWdyb3VwID0gdmZpb19ncm91cF9nZXRfZXh0 ZXJuYWxfdXNlcihmLmZpbGUpOwotCQkJZmRwdXQoZik7Ci0JCQlpZiAoSVNfRVJSKGdyb3VwKSkg ewotCQkJCXJldCA9IFBUUl9FUlIoZ3JvdXApOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlncm91 cHNbaV0uZ3JvdXAgPSBncm91cDsKLQkJCWdyb3Vwc1tpXS5pZCA9IHZmaW9fZXh0ZXJuYWxfdXNl cl9pb21tdV9pZChncm91cCk7Ci0JCX0KLQotCQlrZnJlZShncm91cF9mZHMpOwotCi0JCS8qIHJl bGVhc2UgcmVmZXJlbmNlIHRvIGdyb3VwcyBvbiBlcnJvciAqLwotCQlpZiAocmV0KQotCQkJZ290 byBob3RfcmVzZXRfcmVsZWFzZTsKLQotCQlpbmZvLmNvdW50ID0gaGRyLmNvdW50OwotCQlpbmZv Lmdyb3VwcyA9IGdyb3VwczsKLQotCQkvKgotCQkgKiBUZXN0IHdoZXRoZXIgYWxsIHRoZSBhZmZl Y3RlZCBkZXZpY2VzIGFyZSBjb250YWluZWQKLQkJICogYnkgdGhlIHNldCBvZiBncm91cHMgcHJv dmlkZWQgYnkgdGhlIHVzZXIuCi0JCSAqLwotCQlyZXQgPSB2ZmlvX3BjaV9mb3JfZWFjaF9zbG90 X29yX2J1cyh2ZGV2LT5wZGV2LAotCQkJCQkJICAgIHZmaW9fcGNpX3ZhbGlkYXRlX2RldnMsCi0J CQkJCQkgICAgJmluZm8sIHNsb3QpOwotCQlpZiAoIXJldCkKLQkJCS8qIFVzZXIgaGFzIGFjY2Vz cywgZG8gdGhlIHJlc2V0ICovCi0JCQlyZXQgPSBwY2lfcmVzZXRfYnVzKHZkZXYtPnBkZXYpOwot Ci1ob3RfcmVzZXRfcmVsZWFzZToKLQkJZm9yIChpLS07IGkgPj0gMDsgaS0tKQotCQkJdmZpb19n cm91cF9wdXRfZXh0ZXJuYWxfdXNlcihncm91cHNbaV0uZ3JvdXApOwotCi0JCWtmcmVlKGdyb3Vw cyk7Ci0JCXJldHVybiByZXQ7Ci0JfSBlbHNlIGlmIChjbWQgPT0gVkZJT19ERVZJQ0VfSU9FVkVO VEZEKSB7Ci0JCXN0cnVjdCB2ZmlvX2RldmljZV9pb2V2ZW50ZmQgaW9ldmVudGZkOwotCQlpbnQg Y291bnQ7Ci0KLQkJbWluc3ogPSBvZmZzZXRvZmVuZChzdHJ1Y3QgdmZpb19kZXZpY2VfaW9ldmVu dGZkLCBmZCk7Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZpb2V2ZW50ZmQsICh2b2lkIF9fdXNl ciAqKWFyZywgbWluc3opKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJaWYgKGlvZXZlbnRmZC5h cmdzeiA8IG1pbnN6KQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJaWYgKGlvZXZlbnRmZC5mbGFn cyAmIH5WRklPX0RFVklDRV9JT0VWRU5URkRfU0laRV9NQVNLKQotCQkJcmV0dXJuIC1FSU5WQUw7 Ci0KLQkJY291bnQgPSBpb2V2ZW50ZmQuZmxhZ3MgJiBWRklPX0RFVklDRV9JT0VWRU5URkRfU0la RV9NQVNLOwotCi0JCWlmIChod2VpZ2h0OChjb3VudCkgIT0gMSB8fCBpb2V2ZW50ZmQuZmQgPCAt MSkKLQkJCXJldHVybiAtRUlOVkFMOwotCi0JCXJldHVybiB2ZmlvX3BjaV9pb2V2ZW50ZmQodmRl diwgaW9ldmVudGZkLm9mZnNldCwKLQkJCQkJICBpb2V2ZW50ZmQuZGF0YSwgY291bnQsIGlvZXZl bnRmZC5mZCk7Ci0JfQotCi0JcmV0dXJuIC1FTk9UVFk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHZm aW9fcGNpX3J3KHZvaWQgKmRldmljZV9kYXRhLCBjaGFyIF9fdXNlciAqYnVmLAotCQkJICAgc2l6 ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MsIGJvb2wgaXN3cml0ZSkKLXsKLQl1bnNpZ25lZCBpbnQg aW5kZXggPSBWRklPX1BDSV9PRkZTRVRfVE9fSU5ERVgoKnBwb3MpOwotCXN0cnVjdCB2ZmlvX3Bj aV9kZXZpY2UgKnZkZXYgPSBkZXZpY2VfZGF0YTsKLQotCWlmIChpbmRleCA+PSBWRklPX1BDSV9O VU1fUkVHSU9OUyArIHZkZXYtPm51bV9yZWdpb25zKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXN3 aXRjaCAoaW5kZXgpIHsKLQljYXNlIFZGSU9fUENJX0NPTkZJR19SRUdJT05fSU5ERVg6Ci0JCXJl dHVybiB2ZmlvX3BjaV9jb25maWdfcncodmRldiwgYnVmLCBjb3VudCwgcHBvcywgaXN3cml0ZSk7 Ci0KLQljYXNlIFZGSU9fUENJX1JPTV9SRUdJT05fSU5ERVg6Ci0JCWlmIChpc3dyaXRlKQotCQkJ cmV0dXJuIC1FSU5WQUw7Ci0JCXJldHVybiB2ZmlvX3BjaV9iYXJfcncodmRldiwgYnVmLCBjb3Vu dCwgcHBvcywgZmFsc2UpOwotCi0JY2FzZSBWRklPX1BDSV9CQVIwX1JFR0lPTl9JTkRFWCAuLi4g VkZJT19QQ0lfQkFSNV9SRUdJT05fSU5ERVg6Ci0JCXJldHVybiB2ZmlvX3BjaV9iYXJfcncodmRl diwgYnVmLCBjb3VudCwgcHBvcywgaXN3cml0ZSk7Ci0KLQljYXNlIFZGSU9fUENJX1ZHQV9SRUdJ T05fSU5ERVg6Ci0JCXJldHVybiB2ZmlvX3BjaV92Z2FfcncodmRldiwgYnVmLCBjb3VudCwgcHBv cywgaXN3cml0ZSk7Ci0JZGVmYXVsdDoKLQkJaW5kZXggLT0gVkZJT19QQ0lfTlVNX1JFR0lPTlM7 Ci0JCXJldHVybiB2ZGV2LT5yZWdpb25baW5kZXhdLm9wcy0+cncodmRldiwgYnVmLAotCQkJCQkJ ICAgY291bnQsIHBwb3MsIGlzd3JpdGUpOwotCX0KLQotCXJldHVybiAtRUlOVkFMOwotfQotCi1z dGF0aWMgc3NpemVfdCB2ZmlvX3BjaV9yZWFkKHZvaWQgKmRldmljZV9kYXRhLCBjaGFyIF9fdXNl ciAqYnVmLAotCQkJICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLQlpZiAoIWNv dW50KQotCQlyZXR1cm4gMDsKLQotCXJldHVybiB2ZmlvX3BjaV9ydyhkZXZpY2VfZGF0YSwgYnVm LCBjb3VudCwgcHBvcywgZmFsc2UpOwotfQotCi1zdGF0aWMgc3NpemVfdCB2ZmlvX3BjaV93cml0 ZSh2b2lkICpkZXZpY2VfZGF0YSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKLQkJCSAgICAgIHNp emVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQotewotCWlmICghY291bnQpCi0JCXJldHVybiAwOwot Ci0JcmV0dXJuIHZmaW9fcGNpX3J3KGRldmljZV9kYXRhLCAoY2hhciBfX3VzZXIgKilidWYsIGNv dW50LCBwcG9zLCB0cnVlKTsKLX0KLQotc3RhdGljIGludCB2ZmlvX3BjaV9tbWFwKHZvaWQgKmRl dmljZV9kYXRhLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKLXsKLQlzdHJ1Y3QgdmZpb19w Y2lfZGV2aWNlICp2ZGV2ID0gZGV2aWNlX2RhdGE7Ci0Jc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB2 ZGV2LT5wZGV2OwotCXVuc2lnbmVkIGludCBpbmRleDsKLQl1NjQgcGh5c19sZW4sIHJlcV9sZW4s IHBnb2ZmLCByZXFfc3RhcnQ7Ci0JaW50IHJldDsKLQotCWluZGV4ID0gdm1hLT52bV9wZ29mZiA+ PiAoVkZJT19QQ0lfT0ZGU0VUX1NISUZUIC0gUEFHRV9TSElGVCk7Ci0KLQlpZiAodm1hLT52bV9l bmQgPCB2bWEtPnZtX3N0YXJ0KQotCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoKHZtYS0+dm1fZmxh Z3MgJiBWTV9TSEFSRUQpID09IDApCi0JCXJldHVybiAtRUlOVkFMOwotCWlmIChpbmRleCA+PSBW RklPX1BDSV9OVU1fUkVHSU9OUykgewotCQlpbnQgcmVnbnVtID0gaW5kZXggLSBWRklPX1BDSV9O VU1fUkVHSU9OUzsKLQkJc3RydWN0IHZmaW9fcGNpX3JlZ2lvbiAqcmVnaW9uID0gdmRldi0+cmVn aW9uICsgcmVnbnVtOwotCi0JCWlmIChyZWdpb24gJiYgcmVnaW9uLT5vcHMgJiYgcmVnaW9uLT5v cHMtPm1tYXAgJiYKLQkJICAgIChyZWdpb24tPmZsYWdzICYgVkZJT19SRUdJT05fSU5GT19GTEFH X01NQVApKQotCQkJcmV0dXJuIHJlZ2lvbi0+b3BzLT5tbWFwKHZkZXYsIHJlZ2lvbiwgdm1hKTsK LQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWlmIChpbmRleCA+PSBWRklPX1BDSV9ST01fUkVHSU9O X0lOREVYKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoIXZkZXYtPmJhcl9tbWFwX3N1cHBvcnRl ZFtpbmRleF0pCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcGh5c19sZW4gPSBQQUdFX0FMSUdOKHBj aV9yZXNvdXJjZV9sZW4ocGRldiwgaW5kZXgpKTsKLQlyZXFfbGVuID0gdm1hLT52bV9lbmQgLSB2 bWEtPnZtX3N0YXJ0OwotCXBnb2ZmID0gdm1hLT52bV9wZ29mZiAmCi0JCSgoMVUgPDwgKFZGSU9f UENJX09GRlNFVF9TSElGVCAtIFBBR0VfU0hJRlQpKSAtIDEpOwotCXJlcV9zdGFydCA9IHBnb2Zm IDw8IFBBR0VfU0hJRlQ7Ci0KLQlpZiAocmVxX3N0YXJ0ICsgcmVxX2xlbiA+IHBoeXNfbGVuKQot CQlyZXR1cm4gLUVJTlZBTDsKLQotCS8qCi0JICogRXZlbiB0aG91Z2ggd2UgZG9uJ3QgbWFrZSB1 c2Ugb2YgdGhlIGJhcm1hcCBmb3IgdGhlIG1tYXAsCi0JICogd2UgbmVlZCB0byByZXF1ZXN0IHRo ZSByZWdpb24gYW5kIHRoZSBiYXJtYXAgdHJhY2tzIHRoYXQuCi0JICovCi0JaWYgKCF2ZGV2LT5i YXJtYXBbaW5kZXhdKSB7Ci0JCXJldCA9IHBjaV9yZXF1ZXN0X3NlbGVjdGVkX3JlZ2lvbnMocGRl diwKLQkJCQkJCSAgIDEgPDwgaW5kZXgsICJ2ZmlvLXBjaSIpOwotCQlpZiAocmV0KQotCQkJcmV0 dXJuIHJldDsKLQotCQl2ZGV2LT5iYXJtYXBbaW5kZXhdID0gcGNpX2lvbWFwKHBkZXYsIGluZGV4 LCAwKTsKLQkJaWYgKCF2ZGV2LT5iYXJtYXBbaW5kZXhdKSB7Ci0JCQlwY2lfcmVsZWFzZV9zZWxl Y3RlZF9yZWdpb25zKHBkZXYsIDEgPDwgaW5kZXgpOwotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0K LQl9Ci0KLQl2bWEtPnZtX3ByaXZhdGVfZGF0YSA9IHZkZXY7Ci0Jdm1hLT52bV9wYWdlX3Byb3Qg PSBwZ3Byb3Rfbm9uY2FjaGVkKHZtYS0+dm1fcGFnZV9wcm90KTsKLQl2bWEtPnZtX3Bnb2ZmID0g KHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCBpbmRleCkgPj4gUEFHRV9TSElGVCkgKyBwZ29mZjsK LQotCXJldHVybiByZW1hcF9wZm5fcmFuZ2Uodm1hLCB2bWEtPnZtX3N0YXJ0LCB2bWEtPnZtX3Bn b2ZmLAotCQkJICAgICAgIHJlcV9sZW4sIHZtYS0+dm1fcGFnZV9wcm90KTsKLX0KLQotc3RhdGlj IHZvaWQgdmZpb19wY2lfcmVxdWVzdCh2b2lkICpkZXZpY2VfZGF0YSwgdW5zaWduZWQgaW50IGNv dW50KQotewotCXN0cnVjdCB2ZmlvX3BjaV9kZXZpY2UgKnZkZXYgPSBkZXZpY2VfZGF0YTsKLQot CW11dGV4X2xvY2soJnZkZXYtPmlnYXRlKTsKLQotCWlmICh2ZGV2LT5yZXFfdHJpZ2dlcikgewot CQlpZiAoIShjb3VudCAlIDEwKSkKLQkJCWRldl9ub3RpY2VfcmF0ZWxpbWl0ZWQoJnZkZXYtPnBk ZXYtPmRldiwKLQkJCQkiUmVsYXlpbmcgZGV2aWNlIHJlcXVlc3QgdG8gdXNlciAoIyV1KVxuIiwK LQkJCQljb3VudCk7Ci0JCWV2ZW50ZmRfc2lnbmFsKHZkZXYtPnJlcV90cmlnZ2VyLCAxKTsKLQl9 IGVsc2UgaWYgKGNvdW50ID09IDApIHsKLQkJZGV2X3dhcm4oJnZkZXYtPnBkZXYtPmRldiwKLQkJ CSJObyBkZXZpY2UgcmVxdWVzdCBjaGFubmVsIHJlZ2lzdGVyZWQsIGJsb2NrZWQgdW50aWwgcmVs ZWFzZWQgYnkgdXNlclxuIik7Ci0JfQotCi0JbXV0ZXhfdW5sb2NrKCZ2ZGV2LT5pZ2F0ZSk7Ci19 Ci0KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdmZpb19kZXZpY2Vfb3BzIHZmaW9fcGNpX29wcyA9IHsK IAkubmFtZQkJPSAidmZpby1wY2kiLAogCS5vcGVuCQk9IHZmaW9fcGNpX29wZW4sCkBAIC0xMjgz LDggKzEwOCw2IEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdmZpb19kZXZpY2Vfb3BzIHZmaW9fcGNp X29wcyA9IHsKIAkucmVxdWVzdAk9IHZmaW9fcGNpX3JlcXVlc3QsCiB9OwogCi1zdGF0aWMgaW50 IHZmaW9fcGNpX3JlZmxja19hdHRhY2goc3RydWN0IHZmaW9fcGNpX2RldmljZSAqdmRldik7Ci1z dGF0aWMgdm9pZCB2ZmlvX3BjaV9yZWZsY2tfcHV0KHN0cnVjdCB2ZmlvX3BjaV9yZWZsY2sgKnJl Zmxjayk7CiAKIHN0YXRpYyBpbnQgdmZpb19wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYs IGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKIHsKQEAgLTEzMjQsNiArMTQ3LDExIEBA IHN0YXRpYyBpbnQgdmZpb19wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0 cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKIAlzcGluX2xvY2tfaW5pdCgmdmRldi0+aXJxbG9jayk7 CiAJbXV0ZXhfaW5pdCgmdmRldi0+aW9ldmVudGZkc19sb2NrKTsKIAlJTklUX0xJU1RfSEVBRCgm dmRldi0+aW9ldmVudGZkc19saXN0KTsKKwl2ZGV2LT5ub2ludHhtYXNrID0gbm9pbnR4bWFzazsK KyNpZmRlZiBDT05GSUdfVkZJT19QQ0lfVkdBCisJdmRldi0+ZGlzYWJsZV92Z2EgPSBkaXNhYmxl X3ZnYTsKKyNlbmRpZgorCXZkZXYtPmRpc2FibGVfaWRsZV9kMyA9IGRpc2FibGVfaWRsZV9kMzsK IAogCXJldCA9IHZmaW9fYWRkX2dyb3VwX2RldigmcGRldi0+ZGV2LCAmdmZpb19wY2lfb3BzLCB2 ZGV2KTsKIAlpZiAocmV0KSB7CkBAIC0xMzQwLDI3ICsxNjgsMTMgQEAgc3RhdGljIGludCB2Zmlv X3BjaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2Vf aWQgKmlkKQogCQlyZXR1cm4gcmV0OwogCX0KIAotCWlmICh2ZmlvX3BjaV9pc192Z2EocGRldikp IHsKLQkJdmdhX2NsaWVudF9yZWdpc3RlcihwZGV2LCB2ZGV2LCBOVUxMLCB2ZmlvX3BjaV9zZXRf dmdhX2RlY29kZSk7Ci0JCXZnYV9zZXRfbGVnYWN5X2RlY29kaW5nKHBkZXYsCi0JCQkJCXZmaW9f cGNpX3NldF92Z2FfZGVjb2RlKHZkZXYsIGZhbHNlKSk7Ci0JfQorCWlmICh2ZmlvX3BjaV9pc192 Z2EocGRldikpCisJCXZmaW9fcGNpX3ZnYV9wcm9iZSh2ZGV2KTsKIAogCXZmaW9fcGNpX3Byb2Jl X3Bvd2VyX3N0YXRlKHZkZXYpOwogCi0JaWYgKCFkaXNhYmxlX2lkbGVfZDMpIHsKLQkJLyoKLQkJ ICogcGNpLWNvcmUgc2V0cyB0aGUgZGV2aWNlIHBvd2VyIHN0YXRlIHRvIGFuIHVua25vd24gdmFs dWUgYXQKLQkJICogYm9vdHVwIGFuZCBhZnRlciBiZWluZyByZW1vdmVkIGZyb20gYSBkcml2ZXIu ICBUaGUgb25seQotCQkgKiB0cmFuc2l0aW9uIGl0IGFsbG93cyBmcm9tIHRoaXMgdW5rbm93biBz dGF0ZSBpcyB0byBEMCwgd2hpY2gKLQkJICogdHlwaWNhbGx5IGhhcHBlbnMgd2hlbiBhIGRyaXZl ciBjYWxscyBwY2lfZW5hYmxlX2RldmljZSgpLgotCQkgKiBXZSdyZSBub3QgcmVhZHkgdG8gZW5h YmxlIHRoZSBkZXZpY2UgeWV0LCBidXQgd2UgZG8gd2FudCB0bwotCQkgKiBiZSBhYmxlIHRvIGdl dCB0byBEMy4gIFRoZXJlZm9yZSBmaXJzdCBkbyBhIEQwIHRyYW5zaXRpb24KLQkJICogYmVmb3Jl IGdvaW5nIHRvIEQzLgotCQkgKi8KLQkJdmZpb19wY2lfc2V0X3Bvd2VyX3N0YXRlKHZkZXYsIFBD SV9EMCk7Ci0JCXZmaW9fcGNpX3NldF9wb3dlcl9zdGF0ZSh2ZGV2LCBQQ0lfRDNob3QpOwotCX0K KwlpZiAoIWRpc2FibGVfaWRsZV9kMykKKwkJdmZpb19wY2lfcHJvYmVfaWRsZV9kMyh2ZGV2KTsK IAogCXJldHVybiByZXQ7CiB9CkBAIC0xMzgzLDQ4ICsxOTcsMTQgQEAgc3RhdGljIHZvaWQgdmZp b19wY2lfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogCQl2ZmlvX3BjaV9zZXRfcG93ZXJf c3RhdGUodmRldiwgUENJX0QwKTsKIAogCWtmcmVlKHZkZXYtPnBtX3NhdmUpOwotCWtmcmVlKHZk ZXYpOwogCiAJaWYgKHZmaW9fcGNpX2lzX3ZnYShwZGV2KSkgewotCQl2Z2FfY2xpZW50X3JlZ2lz dGVyKHBkZXYsIE5VTEwsIE5VTEwsIE5VTEwpOwotCQl2Z2Ffc2V0X2xlZ2FjeV9kZWNvZGluZyhw ZGV2LAotCQkJCVZHQV9SU1JDX05PUk1BTF9JTyB8IFZHQV9SU1JDX05PUk1BTF9NRU0gfAotCQkJ CVZHQV9SU1JDX0xFR0FDWV9JTyB8IFZHQV9SU1JDX0xFR0FDWV9NRU0pOwotCX0KLX0KLQotc3Rh dGljIHBjaV9lcnNfcmVzdWx0X3QgdmZpb19wY2lfYWVyX2Vycl9kZXRlY3RlZChzdHJ1Y3QgcGNp X2RldiAqcGRldiwKLQkJCQkJCSAgcGNpX2NoYW5uZWxfc3RhdGVfdCBzdGF0ZSkKLXsKLQlzdHJ1 Y3QgdmZpb19wY2lfZGV2aWNlICp2ZGV2OwotCXN0cnVjdCB2ZmlvX2RldmljZSAqZGV2aWNlOwot Ci0JZGV2aWNlID0gdmZpb19kZXZpY2VfZ2V0X2Zyb21fZGV2KCZwZGV2LT5kZXYpOwotCWlmIChk ZXZpY2UgPT0gTlVMTCkKLQkJcmV0dXJuIFBDSV9FUlNfUkVTVUxUX0RJU0NPTk5FQ1Q7Ci0KLQl2 ZGV2ID0gdmZpb19kZXZpY2VfZGF0YShkZXZpY2UpOwotCWlmICh2ZGV2ID09IE5VTEwpIHsKLQkJ dmZpb19kZXZpY2VfcHV0KGRldmljZSk7Ci0JCXJldHVybiBQQ0lfRVJTX1JFU1VMVF9ESVNDT05O RUNUOworCQl2ZmlvX3BjaV92Z2FfcmVtb3ZlKHZkZXYpOwogCX0KIAotCW11dGV4X2xvY2soJnZk ZXYtPmlnYXRlKTsKLQotCWlmICh2ZGV2LT5lcnJfdHJpZ2dlcikKLQkJZXZlbnRmZF9zaWduYWwo dmRldi0+ZXJyX3RyaWdnZXIsIDEpOwotCi0JbXV0ZXhfdW5sb2NrKCZ2ZGV2LT5pZ2F0ZSk7Ci0K LQl2ZmlvX2RldmljZV9wdXQoZGV2aWNlKTsKLQotCXJldHVybiBQQ0lfRVJTX1JFU1VMVF9DQU5f UkVDT1ZFUjsKKwlrZnJlZSh2ZGV2KTsKIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZXJy b3JfaGFuZGxlcnMgdmZpb19lcnJfaGFuZGxlcnMgPSB7Ci0JLmVycm9yX2RldGVjdGVkID0gdmZp b19wY2lfYWVyX2Vycl9kZXRlY3RlZCwKLX07Ci0KIHN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciB2 ZmlvX3BjaV9kcml2ZXIgPSB7CiAJLm5hbWUJCT0gInZmaW8tcGNpIiwKIAkuaWRfdGFibGUJPSBO VUxMLCAvKiBvbmx5IGR5bmFtaWMgaWRzICovCkBAIC0xNDMzLDI0NCArMjEzLDEyIEBAIHN0YXRp YyBzdHJ1Y3QgcGNpX2RyaXZlciB2ZmlvX3BjaV9kcml2ZXIgPSB7CiAJLmVycl9oYW5kbGVyCT0g JnZmaW9fZXJyX2hhbmRsZXJzLAogfTsKIAotc3RhdGljIERFRklORV9NVVRFWChyZWZsY2tfbG9j ayk7Ci0KLXN0YXRpYyBzdHJ1Y3QgdmZpb19wY2lfcmVmbGNrICp2ZmlvX3BjaV9yZWZsY2tfYWxs b2Modm9pZCkKLXsKLQlzdHJ1Y3QgdmZpb19wY2lfcmVmbGNrICpyZWZsY2s7Ci0KLQlyZWZsY2sg PSBremFsbG9jKHNpemVvZigqcmVmbGNrKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFyZWZsY2spCi0J CXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwotCi0Ja3JlZl9pbml0KCZyZWZsY2stPmtyZWYpOwot CW11dGV4X2luaXQoJnJlZmxjay0+bG9jayk7Ci0KLQlyZXR1cm4gcmVmbGNrOwotfQotCi1zdGF0 aWMgdm9pZCB2ZmlvX3BjaV9yZWZsY2tfZ2V0KHN0cnVjdCB2ZmlvX3BjaV9yZWZsY2sgKnJlZmxj aykKLXsKLQlrcmVmX2dldCgmcmVmbGNrLT5rcmVmKTsKLX0KLQotc3RhdGljIGludCB2ZmlvX3Bj aV9yZWZsY2tfZmluZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1 Y3QgdmZpb19wY2lfcmVmbGNrICoqcHJlZmxjayA9IGRhdGE7Ci0Jc3RydWN0IHZmaW9fZGV2aWNl ICpkZXZpY2U7Ci0Jc3RydWN0IHZmaW9fcGNpX2RldmljZSAqdmRldjsKLQotCWRldmljZSA9IHZm aW9fZGV2aWNlX2dldF9mcm9tX2RldigmcGRldi0+ZGV2KTsKLQlpZiAoIWRldmljZSkKLQkJcmV0 dXJuIDA7Ci0KLQlpZiAocGNpX2Rldl9kcml2ZXIocGRldikgIT0gJnZmaW9fcGNpX2RyaXZlcikg ewotCQl2ZmlvX2RldmljZV9wdXQoZGV2aWNlKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JdmRldiA9 IHZmaW9fZGV2aWNlX2RhdGEoZGV2aWNlKTsKLQotCWlmICh2ZGV2LT5yZWZsY2spIHsKLQkJdmZp b19wY2lfcmVmbGNrX2dldCh2ZGV2LT5yZWZsY2spOwotCQkqcHJlZmxjayA9IHZkZXYtPnJlZmxj azsKLQkJdmZpb19kZXZpY2VfcHV0KGRldmljZSk7Ci0JCXJldHVybiAxOwotCX0KLQotCXZmaW9f ZGV2aWNlX3B1dChkZXZpY2UpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHZmaW9fcGNp X3JlZmxja19hdHRhY2goc3RydWN0IHZmaW9fcGNpX2RldmljZSAqdmRldikKLXsKLQlib29sIHNs b3QgPSAhcGNpX3Byb2JlX3Jlc2V0X3Nsb3QodmRldi0+cGRldi0+c2xvdCk7Ci0KLQltdXRleF9s b2NrKCZyZWZsY2tfbG9jayk7Ci0KLQlpZiAocGNpX2lzX3Jvb3RfYnVzKHZkZXYtPnBkZXYtPmJ1 cykgfHwKLQkgICAgdmZpb19wY2lfZm9yX2VhY2hfc2xvdF9vcl9idXModmRldi0+cGRldiwgdmZp b19wY2lfcmVmbGNrX2ZpbmQsCi0JCQkJCSAgJnZkZXYtPnJlZmxjaywgc2xvdCkgPD0gMCkKLQkJ dmRldi0+cmVmbGNrID0gdmZpb19wY2lfcmVmbGNrX2FsbG9jKCk7Ci0KLQltdXRleF91bmxvY2so JnJlZmxja19sb2NrKTsKLQotCXJldHVybiBQVFJfRVJSX09SX1pFUk8odmRldi0+cmVmbGNrKTsK LX0KLQotc3RhdGljIHZvaWQgdmZpb19wY2lfcmVmbGNrX3JlbGVhc2Uoc3RydWN0IGtyZWYgKmty ZWYpCi17Ci0Jc3RydWN0IHZmaW9fcGNpX3JlZmxjayAqcmVmbGNrID0gY29udGFpbmVyX29mKGty ZWYsCi0JCQkJCQkgICAgICBzdHJ1Y3QgdmZpb19wY2lfcmVmbGNrLAotCQkJCQkJICAgICAga3Jl Zik7Ci0KLQlrZnJlZShyZWZsY2spOwotCW11dGV4X3VubG9jaygmcmVmbGNrX2xvY2spOwotfQot Ci1zdGF0aWMgdm9pZCB2ZmlvX3BjaV9yZWZsY2tfcHV0KHN0cnVjdCB2ZmlvX3BjaV9yZWZsY2sg KnJlZmxjaykKLXsKLQlrcmVmX3B1dF9tdXRleCgmcmVmbGNrLT5rcmVmLCB2ZmlvX3BjaV9yZWZs Y2tfcmVsZWFzZSwgJnJlZmxja19sb2NrKTsKLX0KLQotc3RydWN0IHZmaW9fZGV2aWNlcyB7Ci0J c3RydWN0IHZmaW9fZGV2aWNlICoqZGV2aWNlczsKLQlpbnQgY3VyX2luZGV4OwotCWludCBtYXhf aW5kZXg7Ci19OwotCi1zdGF0aWMgaW50IHZmaW9fcGNpX2dldF91bnVzZWRfZGV2cyhzdHJ1Y3Qg cGNpX2RldiAqcGRldiwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgdmZpb19kZXZpY2VzICpkZXZz ID0gZGF0YTsKLQlzdHJ1Y3QgdmZpb19kZXZpY2UgKmRldmljZTsKLQlzdHJ1Y3QgdmZpb19wY2lf ZGV2aWNlICp2ZGV2OwotCi0JaWYgKGRldnMtPmN1cl9pbmRleCA9PSBkZXZzLT5tYXhfaW5kZXgp Ci0JCXJldHVybiAtRU5PU1BDOwotCi0JZGV2aWNlID0gdmZpb19kZXZpY2VfZ2V0X2Zyb21fZGV2 KCZwZGV2LT5kZXYpOwotCWlmICghZGV2aWNlKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChw Y2lfZGV2X2RyaXZlcihwZGV2KSAhPSAmdmZpb19wY2lfZHJpdmVyKSB7Ci0JCXZmaW9fZGV2aWNl X3B1dChkZXZpY2UpOwotCQlyZXR1cm4gLUVCVVNZOwotCX0KLQotCXZkZXYgPSB2ZmlvX2Rldmlj ZV9kYXRhKGRldmljZSk7Ci0KLQkvKiBGYXVsdCBpZiB0aGUgZGV2aWNlIGlzIG5vdCB1bnVzZWQg Ki8KLQlpZiAodmRldi0+cmVmY250KSB7Ci0JCXZmaW9fZGV2aWNlX3B1dChkZXZpY2UpOwotCQly ZXR1cm4gLUVCVVNZOwotCX0KLQotCWRldnMtPmRldmljZXNbZGV2cy0+Y3VyX2luZGV4KytdID0g ZGV2aWNlOwotCXJldHVybiAwOwotfQotCi0vKgotICogSWYgYSBidXMgb3Igc2xvdCByZXNldCBp cyBhdmFpbGFibGUgZm9yIHRoZSBwcm92aWRlZCBkZXZpY2UgYW5kOgotICogIC0gQWxsIG9mIHRo ZSBkZXZpY2VzIGFmZmVjdGVkIGJ5IHRoYXQgYnVzIG9yIHNsb3QgcmVzZXQgYXJlIHVudXNlZAot ICogICAgKCFyZWZjbnQpCi0gKiAgLSBBdCBsZWFzdCBvbmUgb2YgdGhlIGFmZmVjdGVkIGRldmlj ZXMgaXMgbWFya2VkIGRpcnR5IHZpYQotICogICAgbmVlZHNfcmVzZXQgKHN1Y2ggYXMgYnkgbGFj ayBvZiBGTFIgc3VwcG9ydCkKLSAqIFRoZW4gYXR0ZW1wdCB0byBwZXJmb3JtIHRoYXQgYnVzIG9y IHNsb3QgcmVzZXQuICBDYWxsZXJzIGFyZSByZXF1aXJlZAotICogdG8gaG9sZCB2ZGV2LT5yZWZs Y2stPmxvY2ssIHByb3RlY3RpbmcgdGhlIGJ1cy9zbG90IHJlc2V0IGdyb3VwIGZyb20KLSAqIGNv bmN1cnJlbnQgb3BlbnMuICBBIHZmaW9fZGV2aWNlIHJlZmVyZW5jZSBpcyBhY3F1aXJlZCBmb3Ig ZWFjaCBkZXZpY2UKLSAqIHRvIHByZXZlbnQgdW5iaW5kcyBkdXJpbmcgdGhlIHJlc2V0IG9wZXJh dGlvbi4KLSAqCi0gKiBOQjogdmZpby1jb3JlIGNvbnNpZGVycyBhIGdyb3VwIHRvIGJlIHZpYWJs ZSBldmVuIGlmIHNvbWUgZGV2aWNlcyBhcmUKLSAqIGJvdW5kIHRvIGRyaXZlcnMgbGlrZSBwY2kt c3R1YiBvciBwY2llcG9ydC4gIEhlcmUgd2UgcmVxdWlyZSBhbGwgZGV2aWNlcwotICogdG8gYmUg Ym91bmQgdG8gdmZpb19wY2kgc2luY2UgdGhhdCdzIHRoZSBvbmx5IHdheSB3ZSBjYW4gYmUgc3Vy ZSB0aGV5Ci0gKiBzdGF5IHB1dC4KLSAqLwotc3RhdGljIHZvaWQgdmZpb19wY2lfdHJ5X2J1c19y ZXNldChzdHJ1Y3QgdmZpb19wY2lfZGV2aWNlICp2ZGV2KQotewotCXN0cnVjdCB2ZmlvX2Rldmlj ZXMgZGV2cyA9IHsgLmN1cl9pbmRleCA9IDAgfTsKLQlpbnQgaSA9IDAsIHJldCA9IC1FSU5WQUw7 Ci0JYm9vbCBzbG90ID0gZmFsc2U7Ci0Jc3RydWN0IHZmaW9fcGNpX2RldmljZSAqdG1wOwotCi0J aWYgKCFwY2lfcHJvYmVfcmVzZXRfc2xvdCh2ZGV2LT5wZGV2LT5zbG90KSkKLQkJc2xvdCA9IHRy dWU7Ci0JZWxzZSBpZiAocGNpX3Byb2JlX3Jlc2V0X2J1cyh2ZGV2LT5wZGV2LT5idXMpKQotCQly ZXR1cm47Ci0KLQlpZiAodmZpb19wY2lfZm9yX2VhY2hfc2xvdF9vcl9idXModmRldi0+cGRldiwg dmZpb19wY2lfY291bnRfZGV2cywKLQkJCQkJICAmaSwgc2xvdCkgfHwgIWkpCi0JCXJldHVybjsK LQotCWRldnMubWF4X2luZGV4ID0gaTsKLQlkZXZzLmRldmljZXMgPSBrY2FsbG9jKGksIHNpemVv ZihzdHJ1Y3QgdmZpb19kZXZpY2UgKiksIEdGUF9LRVJORUwpOwotCWlmICghZGV2cy5kZXZpY2Vz KQotCQlyZXR1cm47Ci0KLQlpZiAodmZpb19wY2lfZm9yX2VhY2hfc2xvdF9vcl9idXModmRldi0+ cGRldiwKLQkJCQkJICB2ZmlvX3BjaV9nZXRfdW51c2VkX2RldnMsCi0JCQkJCSAgJmRldnMsIHNs b3QpKQotCQlnb3RvIHB1dF9kZXZzOwotCi0JLyogRG9lcyBhdCBsZWFzdCBvbmUgbmVlZCBhIHJl c2V0PyAqLwotCWZvciAoaSA9IDA7IGkgPCBkZXZzLmN1cl9pbmRleDsgaSsrKSB7Ci0JCXRtcCA9 IHZmaW9fZGV2aWNlX2RhdGEoZGV2cy5kZXZpY2VzW2ldKTsKLQkJaWYgKHRtcC0+bmVlZHNfcmVz ZXQpIHsKLQkJCXJldCA9IHBjaV9yZXNldF9idXModmRldi0+cGRldik7Ci0JCQlicmVhazsKLQkJ fQotCX0KLQotcHV0X2RldnM6Ci0JZm9yIChpID0gMDsgaSA8IGRldnMuY3VyX2luZGV4OyBpKysp IHsKLQkJdG1wID0gdmZpb19kZXZpY2VfZGF0YShkZXZzLmRldmljZXNbaV0pOwotCi0JCS8qCi0J CSAqIElmIHJlc2V0IHdhcyBzdWNjZXNzZnVsLCBhZmZlY3RlZCBkZXZpY2VzIG5vIGxvbmdlciBu ZWVkCi0JCSAqIGEgcmVzZXQgYW5kIHdlIHNob3VsZCByZXR1cm4gYWxsIHRoZSBjb2xsYXRlcmFs IGRldmljZXMKLQkJICogdG8gbG93IHBvd2VyLiAgSWYgbm90IHN1Y2Nlc3NmdWwsIHdlIGVpdGhl ciBkaWRuJ3QgcmVzZXQKLQkJICogdGhlIGJ1cyBvciB0aW1lZCBvdXQgd2FpdGluZyBmb3IgaXQs IHNvIGxldCdzIG5vdCB0b3VjaAotCQkgKiB0aGUgcG93ZXIgc3RhdGUuCi0JCSAqLwotCQlpZiAo IXJldCkgewotCQkJdG1wLT5uZWVkc19yZXNldCA9IGZhbHNlOwotCi0JCQlpZiAodG1wICE9IHZk ZXYgJiYgIWRpc2FibGVfaWRsZV9kMykKLQkJCQl2ZmlvX3BjaV9zZXRfcG93ZXJfc3RhdGUodG1w LCBQQ0lfRDNob3QpOwotCQl9Ci0KLQkJdmZpb19kZXZpY2VfcHV0KGRldnMuZGV2aWNlc1tpXSk7 Ci0JfQotCi0Ja2ZyZWUoZGV2cy5kZXZpY2VzKTsKLX0KLQogc3RhdGljIHZvaWQgX19leGl0IHZm aW9fcGNpX2NsZWFudXAodm9pZCkKIHsKIAlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnZmaW9fcGNp X2RyaXZlcik7CiAJdmZpb19wY2lfdW5pbml0X3Blcm1fYml0cygpOwogfQogCi1zdGF0aWMgdm9p ZCBfX2luaXQgdmZpb19wY2lfZmlsbF9pZHModm9pZCkKLXsKLQljaGFyICpwLCAqaWQ7Ci0JaW50 IHJjOwotCi0JLyogbm8gaWRzIHBhc3NlZCBhY3R1YWxseSAqLwotCWlmIChpZHNbMF0gPT0gJ1ww JykKLQkJcmV0dXJuOwotCi0JLyogYWRkIGlkcyBzcGVjaWZpZWQgaW4gdGhlIG1vZHVsZSBwYXJh bWV0ZXIgKi8KLQlwID0gaWRzOwotCXdoaWxlICgoaWQgPSBzdHJzZXAoJnAsICIsIikpKSB7Ci0J CXVuc2lnbmVkIGludCB2ZW5kb3IsIGRldmljZSwgc3VidmVuZG9yID0gUENJX0FOWV9JRCwKLQkJ CXN1YmRldmljZSA9IFBDSV9BTllfSUQsIGNsYXNzID0gMCwgY2xhc3NfbWFzayA9IDA7Ci0JCWlu dCBmaWVsZHM7Ci0KLQkJaWYgKCFzdHJsZW4oaWQpKQotCQkJY29udGludWU7Ci0KLQkJZmllbGRz ID0gc3NjYW5mKGlkLCAiJXg6JXg6JXg6JXg6JXg6JXgiLAotCQkJCSZ2ZW5kb3IsICZkZXZpY2Us ICZzdWJ2ZW5kb3IsICZzdWJkZXZpY2UsCi0JCQkJJmNsYXNzLCAmY2xhc3NfbWFzayk7Ci0KLQkJ aWYgKGZpZWxkcyA8IDIpIHsKLQkJCXByX3dhcm4oImludmFsaWQgaWQgc3RyaW5nIFwiJXNcIlxu IiwgaWQpOwotCQkJY29udGludWU7Ci0JCX0KLQotCQlyYyA9IHBjaV9hZGRfZHluaWQoJnZmaW9f cGNpX2RyaXZlciwgdmVuZG9yLCBkZXZpY2UsCi0JCQkJICAgc3VidmVuZG9yLCBzdWJkZXZpY2Us IGNsYXNzLCBjbGFzc19tYXNrLCAwKTsKLQkJaWYgKHJjKQotCQkJcHJfd2FybigiZmFpbGVkIHRv IGFkZCBkeW5hbWljIGlkIFslMDR4OiUwNHhbJTA0eDolMDR4XV0gY2xhc3MgJSMwOHgvJTA4eCAo JWQpXG4iLAotCQkJCXZlbmRvciwgZGV2aWNlLCBzdWJ2ZW5kb3IsIHN1YmRldmljZSwKLQkJCQlj bGFzcywgY2xhc3NfbWFzaywgcmMpOwotCQllbHNlCi0JCQlwcl9pbmZvKCJhZGQgWyUwNHg6JTA0 eFslMDR4OiUwNHhdXSBjbGFzcyAlIzA4eC8lMDh4XG4iLAotCQkJCXZlbmRvciwgZGV2aWNlLCBz dWJ2ZW5kb3IsIHN1YmRldmljZSwKLQkJCQljbGFzcywgY2xhc3NfbWFzayk7Ci0JfQotfQotCiBz dGF0aWMgaW50IF9faW5pdCB2ZmlvX3BjaV9pbml0KHZvaWQpCiB7CiAJaW50IHJldDsKQEAgLTE2 ODUsNyArMjMzLDcgQEAgc3RhdGljIGludCBfX2luaXQgdmZpb19wY2lfaW5pdCh2b2lkKQogCWlm IChyZXQpCiAJCWdvdG8gb3V0X2RyaXZlcjsKIAotCXZmaW9fcGNpX2ZpbGxfaWRzKCk7CisJdmZp b19wY2lfZmlsbF9pZHMoJmlkc1swXSwgJnZmaW9fcGNpX2RyaXZlcik7CiAKIAlyZXR1cm4gMDsK IApkaWZmIC0tZ2l0IGEvZHJpdmVycy92ZmlvL3BjaS92ZmlvX3BjaV9wcml2YXRlLmggYi9kcml2 ZXJzL3ZmaW8vcGNpL3ZmaW9fcGNpX3ByaXZhdGUuaAppbmRleCAxODEyY2YyLi45YmJmMjJjIDEw MDY0NAotLS0gYS9kcml2ZXJzL3ZmaW8vcGNpL3ZmaW9fcGNpX3ByaXZhdGUuaAorKysgYi9kcml2 ZXJzL3ZmaW8vcGNpL3ZmaW9fcGNpX3ByaXZhdGUuaApAQCAtMTI1LDYgKzEyNSwxMSBAQCBzdHJ1 Y3QgdmZpb19wY2lfZGV2aWNlIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkCWR1bW15X3Jlc291cmNlc19s aXN0OwogCXN0cnVjdCBtdXRleAkJaW9ldmVudGZkc19sb2NrOwogCXN0cnVjdCBsaXN0X2hlYWQJ aW9ldmVudGZkc19saXN0OworCWJvb2wJCQlub2ludHhtYXNrOworI2lmZGVmIENPTkZJR19WRklP X1BDSV9WR0EKKwlib29sCQkJZGlzYWJsZV92Z2E7CisjZW5kaWYKKwlib29sCQkJZGlzYWJsZV9p ZGxlX2QzOwogfTsKIAogI2RlZmluZSBpc19pbnR4KHZkZXYpICh2ZGV2LT5pcnFfdHlwZSA9PSBW RklPX1BDSV9JTlRYX0lSUV9JTkRFWCkKQEAgLTEzMyw2ICsxMzgsOCBAQCBzdHJ1Y3QgdmZpb19w Y2lfZGV2aWNlIHsKICNkZWZpbmUgaXNfaXJxX25vbmUodmRldikgKCEoaXNfaW50eCh2ZGV2KSB8 fCBpc19tc2kodmRldikgfHwgaXNfbXNpeCh2ZGV2KSkpCiAjZGVmaW5lIGlycV9pcyh2ZGV2LCB0 eXBlKSAodmRldi0+aXJxX3R5cGUgPT0gdHlwZSkKIAorZXh0ZXJuIGNvbnN0IHN0cnVjdCBwY2lf ZXJyb3JfaGFuZGxlcnMgdmZpb19lcnJfaGFuZGxlcnM7CisKIGV4dGVybiB2b2lkIHZmaW9fcGNp X2ludHhfbWFzayhzdHJ1Y3QgdmZpb19wY2lfZGV2aWNlICp2ZGV2KTsKIGV4dGVybiB2b2lkIHZm aW9fcGNpX2ludHhfdW5tYXNrKHN0cnVjdCB2ZmlvX3BjaV9kZXZpY2UgKnZkZXYpOwogCkBAIC0x NjcsNiArMTc0LDI2IEBAIGV4dGVybiBpbnQgdmZpb19wY2lfcmVnaXN0ZXJfZGV2X3JlZ2lvbihz dHJ1Y3QgdmZpb19wY2lfZGV2aWNlICp2ZGV2LAogZXh0ZXJuIGludCB2ZmlvX3BjaV9zZXRfcG93 ZXJfc3RhdGUoc3RydWN0IHZmaW9fcGNpX2RldmljZSAqdmRldiwKIAkJCQkgICAgcGNpX3Bvd2Vy X3Qgc3RhdGUpOwogCitleHRlcm4gaW50IHZmaW9fcGNpX2VuYWJsZShzdHJ1Y3QgdmZpb19wY2lf ZGV2aWNlICp2ZGV2KTsKK2V4dGVybiB2b2lkIHZmaW9fcGNpX2Rpc2FibGUoc3RydWN0IHZmaW9f cGNpX2RldmljZSAqdmRldik7CitleHRlcm4gbG9uZyB2ZmlvX3BjaV9pb2N0bCh2b2lkICpkZXZp Y2VfZGF0YSwKKwkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKK2V4dGVy biBzc2l6ZV90IHZmaW9fcGNpX3JlYWQodm9pZCAqZGV2aWNlX2RhdGEsIGNoYXIgX191c2VyICpi dWYsCisJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcyk7CitleHRlcm4gc3NpemVfdCB2Zmlv X3BjaV93cml0ZSh2b2lkICpkZXZpY2VfZGF0YSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJ CXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKTsKK2V4dGVybiBpbnQgdmZpb19wY2lfbW1hcCh2 b2lkICpkZXZpY2VfZGF0YSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpOworZXh0ZXJuIHZv aWQgdmZpb19wY2lfcmVxdWVzdCh2b2lkICpkZXZpY2VfZGF0YSwgdW5zaWduZWQgaW50IGNvdW50 KTsKK2V4dGVybiB2b2lkIHZmaW9fcGNpX2ZpbGxfaWRzKGNoYXIgKmlkcywgc3RydWN0IHBjaV9k cml2ZXIgKmRyaXZlcik7CitleHRlcm4gaW50IHZmaW9fcGNpX3JlZmxja19hdHRhY2goc3RydWN0 IHZmaW9fcGNpX2RldmljZSAqdmRldik7CitleHRlcm4gdm9pZCB2ZmlvX3BjaV9yZWZsY2tfcHV0 KHN0cnVjdCB2ZmlvX3BjaV9yZWZsY2sgKnJlZmxjayk7CitleHRlcm4gaW5saW5lIGJvb2wgdmZp b192Z2FfZGlzYWJsZWQoc3RydWN0IHZmaW9fcGNpX2RldmljZSAqdmRldik7CitleHRlcm4gdm9p ZCB2ZmlvX3BjaV9wcm9iZV9wb3dlcl9zdGF0ZShzdHJ1Y3QgdmZpb19wY2lfZGV2aWNlICp2ZGV2 KTsKK2V4dGVybiB2b2lkIHZmaW9fcGNpX3Byb2JlX2lkbGVfZDMoc3RydWN0IHZmaW9fcGNpX2Rl dmljZSAqdmRldik7CitleHRlcm4gdm9pZCB2ZmlvX3BjaV92Z2FfcHJvYmUoc3RydWN0IHZmaW9f cGNpX2RldmljZSAqdmRldik7CitleHRlcm4gdm9pZCB2ZmlvX3BjaV92Z2FfcmVtb3ZlKHN0cnVj dCB2ZmlvX3BjaV9kZXZpY2UgKnZkZXYpOworZXh0ZXJuIGJvb2wgdmZpb19wY2lfaXNfdmdhKHN0 cnVjdCBwY2lfZGV2ICpwZGV2KTsKKwogI2lmZGVmIENPTkZJR19WRklPX1BDSV9JR0QKIGV4dGVy biBpbnQgdmZpb19wY2lfaWdkX2luaXQoc3RydWN0IHZmaW9fcGNpX2RldmljZSAqdmRldik7CiAj ZWxzZQotLSAKMi43LjQKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fCmlvbW11IG1haWxpbmcgbGlzdAppb21tdUBsaXN0cy5saW51eC1mb3VuZGF0aW9uLm9y ZwpodHRwczovL2xpc3RzLmxpbnV4Zm91bmRhdGlvbi5vcmcvbWFpbG1hbi9saXN0aW5mby9pb21t dQ==