From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Langsdorf, Mark" Subject: RE: [PATCH] Use lib/swiotlb code for x86_64 SWIOTLB Date: Wed, 21 Feb 2007 18:09:34 -0600 Message-ID: <1449F58C868D8D4E9C72945771150BDFD9664B@SAUSEXMB1.amd.com> References: <1449F58C868D8D4E9C72945771150BDFD9660C@SAUSEXMB1.amd.com> <45D57BD5.76E4.0078.0@novell.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="----_=_NextPart_001_01C75615.BBB6B2A7" Return-path: Content-class: urn:content-classes:message In-Reply-To: <45D57BD5.76E4.0078.0@novell.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xensource.com Errors-To: xen-devel-bounces@lists.xensource.com To: xen-devel@lists.xensource.com List-Id: xen-devel@lists.xenproject.org This is a multi-part message in MIME format. ------_=_NextPart_001_01C75615.BBB6B2A7 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: quoted-printable > I can't see how this can work: First, the way the change is=20 > done i386 will also use that file (and then > arch/i386/kernel/swiotlb.c should also be deleted by > the patch). That wasn't intentional. i386 can still use the=20 arch/i386 code. > Second, there's nothing Xen specific anymore in that file, not > even the contiguous region creation (the sole difference to=20 > plain 2.6.20 is the use of virt_to_bus/bus_to_virt). I think > the first patch should be really just a move of > arch/i386/kernel/swiotlb.c to lib/swiotlb-xen.c, nothing else. This should be an improved version of lib/swiotlb.c as=20 lib/swiotlb-xen.c, with correct code to make the mappings contiguous. -Mark Langsdorf AMD, Inc. ------_=_NextPart_001_01C75615.BBB6B2A7 Content-Type: application/octet-stream; name=lib-swiotlb-on-x86_64.patch Content-Transfer-Encoding: base64 Content-Description: lib-swiotlb-on-x86_64.patch Content-Disposition: attachment; filename=lib-swiotlb-on-x86_64.patch ZGlmZiAtciBiOTAxODBjMmEwNTcgbGludXgtMi42LXhlbi1zcGFyc2UvYXJjaC9pMzg2L21tL2h5 cGVydmlzb3IuYwotLS0gYS9saW51eC0yLjYteGVuLXNwYXJzZS9hcmNoL2kzODYvbW0vaHlwZXJ2 aXNvci5jCU1vbiBGZWIgMTkgMTU6NDY6MDEgMjAwNyArMDAwMAorKysgYi9saW51eC0yLjYteGVu LXNwYXJzZS9hcmNoL2kzODYvbW0vaHlwZXJ2aXNvci5jCVdlZCBGZWIgMjEgMTk6MzQ6MjYgMjAw NyAtMDYwMApAQCAtMjUyLDcgKzI1Miw3IEBAIHN0YXRpYyB2b2lkIGNvbnRpZ3VvdXNfYml0bWFw X2NsZWFyKAogfQogCiAvKiBQcm90ZWN0ZWQgYnkgYmFsbG9vbl9sb2NrLiAqLwotI2RlZmluZSBN QVhfQ09OVElHX09SREVSIDkgLyogMk1CICovCisjZGVmaW5lIE1BWF9DT05USUdfT1JERVIgMTYg LyogMjU2TUIgKi8KIHN0YXRpYyB1bnNpZ25lZCBsb25nIGRpc2NvbnRpZ19mcmFtZXNbMTw8TUFY X0NPTlRJR19PUkRFUl07CiBzdGF0aWMgbXVsdGljYWxsX2VudHJ5X3QgY3JfbWNsWzE8PE1BWF9D T05USUdfT1JERVJdOwogCmRpZmYgLXIgYjkwMTgwYzJhMDU3IGxpbnV4LTIuNi14ZW4tc3BhcnNl L2FyY2gveDg2XzY0L2tlcm5lbC9lODIwLXhlbi5jCi0tLSBhL2xpbnV4LTIuNi14ZW4tc3BhcnNl L2FyY2gveDg2XzY0L2tlcm5lbC9lODIwLXhlbi5jCU1vbiBGZWIgMTkgMTU6NDY6MDEgMjAwNyAr MDAwMAorKysgYi9saW51eC0yLjYteGVuLXNwYXJzZS9hcmNoL3g4Nl82NC9rZXJuZWwvZTgyMC14 ZW4uYwlXZWQgRmViIDIxIDE5OjM0OjI2IDIwMDcgLTA2MDAKQEAgLTk3LDcgKzk3LDYgQEAgc3Rh dGljIGlubGluZSBpbnQgYmFkX2FkZHIodW5zaWduZWQgbG9uZwogCXJldHVybiAwOwogfSAKIAot I2lmbmRlZiBDT05GSUdfWEVOCiAvKgogICogVGhpcyBmdW5jdGlvbiBjaGVja3MgaWYgYW55IHBh cnQgb2YgdGhlIHJhbmdlIDxzdGFydCxlbmQ+IGlzIG1hcHBlZAogICogd2l0aCB0eXBlLgpAQCAt MTE2LDcgKzExNSw2IEBAIGU4MjBfYW55X21hcHBlZCh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnMK IAl9IAogCXJldHVybiAwOwogfQotI2VuZGlmCiAKIC8qCiAgKiBUaGlzIGZ1bmN0aW9uIGNoZWNr cyBpZiB0aGUgZW50aXJlIHJhbmdlIDxzdGFydCxlbmQ+IGlzIG1hcHBlZCB3aXRoIHR5cGUuCmRp ZmYgLXIgYjkwMTgwYzJhMDU3IGxpbnV4LTIuNi14ZW4tc3BhcnNlL2FyY2gveDg2XzY0L2tlcm5l bC9pb19hcGljLXhlbi5jCi0tLSBhL2xpbnV4LTIuNi14ZW4tc3BhcnNlL2FyY2gveDg2XzY0L2tl cm5lbC9pb19hcGljLXhlbi5jCU1vbiBGZWIgMTkgMTU6NDY6MDEgMjAwNyArMDAwMAorKysgYi9s aW51eC0yLjYteGVuLXNwYXJzZS9hcmNoL3g4Nl82NC9rZXJuZWwvaW9fYXBpYy14ZW4uYwlXZWQg RmViIDIxIDE5OjM0OjI2IDIwMDcgLTA2MDAKQEAgLTM2OSw3ICszNjksNyBAQCB2b2lkIF9faW5p dCBjaGVja19pb2FwaWModm9pZCkKIAkJCQlzd2l0Y2ggKHZlbmRvcikgeyAKIAkJCQljYXNlIFBD SV9WRU5ET1JfSURfVklBOgogI2lmZGVmIENPTkZJR19JT01NVQotCQkJCQlpZiAoKGVuZF9wZm4g PiBNQVhfRE1BMzJfUEZOIHx8CisJCQkJCWlmICgoZ2xvYmFsX25lZWRfaW9tbXUoKSB8fAogCQkJ CQkgICAgIGZvcmNlX2lvbW11KSAmJgogCQkJCQkgICAgIWlvbW11X2FwZXJ0dXJlX2FsbG93ZWQp IHsKIAkJCQkJCXByaW50ayhLRVJOX0lORk8KZGlmZiAtciBiOTAxODBjMmEwNTcgbGludXgtMi42 LXhlbi1zcGFyc2UvYXJjaC94ODZfNjQva2VybmVsL3BjaS1zd2lvdGxiLXhlbi5jCi0tLSBhL2xp bnV4LTIuNi14ZW4tc3BhcnNlL2FyY2gveDg2XzY0L2tlcm5lbC9wY2ktc3dpb3RsYi14ZW4uYwlN b24gRmViIDE5IDE1OjQ2OjAxIDIwMDcgKzAwMDAKKysrIGIvbGludXgtMi42LXhlbi1zcGFyc2Uv YXJjaC94ODZfNjQva2VybmVsL3BjaS1zd2lvdGxiLXhlbi5jCVdlZCBGZWIgMjEgMTk6MzQ6MjYg MjAwNyAtMDYwMApAQCAtOCwxMyArOCwxMCBAQAogI2luY2x1ZGUgPGFzbS9zd2lvdGxiLmg+CiAj aW5jbHVkZSA8YXNtL2RtYS5oPgogCi0jaWYgMAogaW50IHN3aW90bGIgX19yZWFkX21vc3RseTsK IEVYUE9SVF9TWU1CT0woc3dpb3RsYik7Ci0jZW5kaWYKIAogc3RydWN0IGRtYV9tYXBwaW5nX29w cyBzd2lvdGxiX2RtYV9vcHMgPSB7Ci0jaWYgMAogCS5tYXBwaW5nX2Vycm9yID0gc3dpb3RsYl9k bWFfbWFwcGluZ19lcnJvciwKIAkuYWxsb2NfY29oZXJlbnQgPSBzd2lvdGxiX2FsbG9jX2NvaGVy ZW50LAogCS5mcmVlX2NvaGVyZW50ID0gc3dpb3RsYl9mcmVlX2NvaGVyZW50LApAQCAtMjksMTQg KzI2LDEyIEBAIHN0cnVjdCBkbWFfbWFwcGluZ19vcHMgc3dpb3RsYl9kbWFfb3BzID0KIAkubWFw X3NnID0gc3dpb3RsYl9tYXBfc2csCiAJLnVubWFwX3NnID0gc3dpb3RsYl91bm1hcF9zZywKIAku ZG1hX3N1cHBvcnRlZCA9IE5VTEwsCi0jZW5kaWYKIH07CiAKIHZvaWQgcGNpX3N3aW90bGJfaW5p dCh2b2lkKQogewotI2lmIDAKIAkvKiBkb24ndCBpbml0aWFsaXplIHN3aW90bGIgaWYgaW9tbXU9 b2ZmIChub19pb21tdT0xKSAqLwotCWlmICghaW9tbXVfZGV0ZWN0ZWQgJiYgIW5vX2lvbW11ICYm IGVuZF9wZm4gPiBNQVhfRE1BMzJfUEZOKQorCWlmICghaW9tbXVfZGV0ZWN0ZWQgJiYgIW5vX2lv bW11KQogCSAgICAgICBzd2lvdGxiID0gMTsKIAlpZiAoc3dpb3RsYl9mb3JjZSkKIAkJc3dpb3Rs YiA9IDE7CkBAIC00NSwxMSArNDAsNCBAQCB2b2lkIHBjaV9zd2lvdGxiX2luaXQodm9pZCkKIAkJ c3dpb3RsYl9pbml0KCk7CiAJCWRtYV9vcHMgPSAmc3dpb3RsYl9kbWFfb3BzOwogCX0KLSNlbHNl Ci0Jc3dpb3RsYl9pbml0KCk7Ci0JaWYgKHN3aW90bGIpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAi UENJLURNQTogVXNpbmcgc29mdHdhcmUgYm91bmNlIGJ1ZmZlcmluZyBmb3IgSU8gKFNXSU9UTEIp XG4iKTsKLQkJZG1hX29wcyA9ICZzd2lvdGxiX2RtYV9vcHM7Ci0JfQotI2VuZGlmCiB9CmRpZmYg LXIgYjkwMTgwYzJhMDU3IGxpbnV4LTIuNi14ZW4tc3BhcnNlL2luY2x1ZGUvYXNtLXg4Nl82NC9t YWNoLXhlbi9hc20vZG1hLW1hcHBpbmcuaAotLS0gYS9saW51eC0yLjYteGVuLXNwYXJzZS9pbmNs dWRlL2FzbS14ODZfNjQvbWFjaC14ZW4vYXNtL2RtYS1tYXBwaW5nLmgJTW9uIEZlYiAxOSAxNTo0 NjowMSAyMDA3ICswMDAwCisrKyBiL2xpbnV4LTIuNi14ZW4tc3BhcnNlL2luY2x1ZGUvYXNtLXg4 Nl82NC9tYWNoLXhlbi9hc20vZG1hLW1hcHBpbmcuaAlXZWQgRmViIDIxIDE5OjM0OjI2IDIwMDcg LTA2MDAKQEAgLTYyLDcgKzYyLDEyIEBAIHN0YXRpYyBpbmxpbmUgaW50IHZhbGlkX2RtYV9kaXJl Y3Rpb24oaW4KIAkJKGRtYV9kaXJlY3Rpb24gPT0gRE1BX0ZST01fREVWSUNFKSk7CiB9CiAKLSNp ZiAwCisjaWZkZWYgQ09ORklHX1hFTgorI2RlZmluZSBnbG9iYWxfbmVlZF9pb21tdSgpIDEKKyNl bHNlCisjZGVmaW5lIGdsb2JhbF9uZWVkX2lvbW11KCkgKEhZUEVSVklTT1JfbWVtb3J5X29wKFhF Tk1FTV9tYXhpbXVtX3JhbV9wYWdlLCBOVUxMKT5NQVhfRE1BMzJfUEZOKQorI2VuZGlmCisKIHN0 YXRpYyBpbmxpbmUgaW50IGRtYV9tYXBwaW5nX2Vycm9yKGRtYV9hZGRyX3QgZG1hX2FkZHIpCiB7 CiAJaWYgKGRtYV9vcHMtPm1hcHBpbmdfZXJyb3IpCkBAIC0yMDAsOCArMjA1LDUgQEAgZG1hX2Nh Y2hlX3N5bmModm9pZCAqdmFkZHIsIHNpemVfdCBzaXplLAogCiBleHRlcm4gc3RydWN0IGRldmlj ZSBmYWxsYmFja19kZXY7CiBleHRlcm4gaW50IHBhbmljX29uX292ZXJmbG93OwotI2VuZGlmCiAK ICNlbmRpZiAvKiBfWDg2NjRfRE1BX01BUFBJTkdfSCAqLwotCi0jaW5jbHVkZSA8YXNtLWkzODYv bWFjaC14ZW4vYXNtL2RtYS1tYXBwaW5nLmg+CmRpZmYgLXIgYjkwMTgwYzJhMDU3IGxpbnV4LTIu Ni14ZW4tc3BhcnNlL2xpYi9NYWtlZmlsZQotLS0gYS9saW51eC0yLjYteGVuLXNwYXJzZS9saWIv TWFrZWZpbGUJTW9uIEZlYiAxOSAxNTo0NjowMSAyMDA3ICswMDAwCisrKyBiL2xpbnV4LTIuNi14 ZW4tc3BhcnNlL2xpYi9NYWtlZmlsZQlXZWQgRmViIDIxIDE5OjM0OjI2IDIwMDcgLTA2MDAKQEAg LTUyLDcgKzUyLDkgQEAgb2JqLSQoQ09ORklHX0FVRElUX0dFTkVSSUMpICs9IGF1ZGl0Lm8KIG9i ai0kKENPTkZJR19BVURJVF9HRU5FUklDKSArPSBhdWRpdC5vCiAKIG9iai0kKENPTkZJR19TV0lP VExCKSArPSBzd2lvdGxiLm8KK2lmbmRlZiBDT05GSUdfWDg2XzY0X1hFTgogc3dpb3RsYi0kKENP TkZJR19YRU4pIDo9IC4uL2FyY2gvaTM4Ni9rZXJuZWwvc3dpb3RsYi5vCitlbmRpZgogCiBob3N0 cHJvZ3MteQk6PSBnZW5fY3JjMzJ0YWJsZQogY2xlYW4tZmlsZXMJOj0gY3JjMzJ0YWJsZS5oCkBA IC02NCwzICs2NiwxMiBAQCBxdWlldF9jbWRfY3JjMzIgPSBHRU4gICAgICRACiAKICQob2JqKS9j cmMzMnRhYmxlLmg6ICQob2JqKS9nZW5fY3JjMzJ0YWJsZQogCSQoY2FsbCBjbWQsY3JjMzIpCisK K2lmZGVmIENPTkZJR19YRU4KKworaW5jbHVkZSAkKHNyY3RyZWUpL3NjcmlwdHMvTWFrZWZpbGUu eGVuCisKK29iai15IDo9ICQoY2FsbCBmaWx0ZXJ4ZW4sICQob2JqLXkpLCAkKG4tb2JqLXhlbikp CitvYmoteSA6PSAkKGNhbGwgY2hlcnJ5cGlja3hlbiwgJChvYmoteSkpCitleHRyYS15IDo9ICQo Y2FsbCBjaGVycnlwaWNreGVuLCAkKGV4dHJhLXkpKQorZW5kaWYKZGlmZiAtciBiOTAxODBjMmEw NTcgbGludXgtMi42LXhlbi1zcGFyc2UvYXJjaC94ODZfNjQva2VybmVsL3BjaS1kbWEteGVuLmMK LS0tIC9kZXYvbnVsbAlUaHUgSmFuIDAxIDAwOjAwOjAwIDE5NzAgKzAwMDAKKysrIGIvbGludXgt Mi42LXhlbi1zcGFyc2UvYXJjaC94ODZfNjQva2VybmVsL3BjaS1kbWEteGVuLmMJV2VkIEZlYiAy MSAxOTozNDoyNiAyMDA3IC0wNjAwCkBAIC0wLDAgKzEsMzI4IEBACisvKgorICogRHluYW1pYyBE TUEgbWFwcGluZyBzdXBwb3J0LgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2lu Y2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8 bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8YXNtL2lv Lmg+CisjaW5jbHVkZSA8YXNtL3Byb3RvLmg+CisjaW5jbHVkZSA8YXNtL2NhbGdhcnkuaD4KKyNp bmNsdWRlIDx4ZW4vYmFsbG9vbi5oPgorI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgorCitpbnQg aW9tbXVfbWVyZ2UgX19yZWFkX21vc3RseSA9IDA7CitFWFBPUlRfU1lNQk9MKGlvbW11X21lcmdl KTsKKworZG1hX2FkZHJfdCBiYWRfZG1hX2FkZHJlc3MgX19yZWFkX21vc3RseTsKK0VYUE9SVF9T WU1CT0woYmFkX2RtYV9hZGRyZXNzKTsKKworLyogVGhpcyB0ZWxscyB0aGUgQklPIGJsb2NrIGxh eWVyIHRvIGFzc3VtZSBtZXJnaW5nLiBEZWZhdWx0IHRvIG9mZgorICAgYmVjYXVzZSB3ZSBjYW5u b3QgZ3VhcmFudGVlIG1lcmdpbmcgbGF0ZXIuICovCitpbnQgaW9tbXVfYmlvX21lcmdlIF9fcmVh ZF9tb3N0bHkgPSAwOworRVhQT1JUX1NZTUJPTChpb21tdV9iaW9fbWVyZ2UpOworCitpbnQgaW9t bXVfc2FjX2ZvcmNlIF9fcmVhZF9tb3N0bHkgPSAwOworRVhQT1JUX1NZTUJPTChpb21tdV9zYWNf Zm9yY2UpOworCitpbnQgbm9faW9tbXUgX19yZWFkX21vc3RseTsKKyNpZmRlZiBDT05GSUdfSU9N TVVfREVCVUcKK2ludCBwYW5pY19vbl9vdmVyZmxvdyBfX3JlYWRfbW9zdGx5ID0gMTsKK2ludCBm b3JjZV9pb21tdSBfX3JlYWRfbW9zdGx5ID0gMTsKKyNlbHNlCitpbnQgcGFuaWNfb25fb3ZlcmZs b3cgX19yZWFkX21vc3RseSA9IDA7CitpbnQgZm9yY2VfaW9tbXUgX19yZWFkX21vc3RseT0gMDsK KyNlbmRpZgorCisvKiBTZXQgdGhpcyB0byAxIGlmIHRoZXJlIGlzIGEgSFcgSU9NTVUgaW4gdGhl IHN5c3RlbSAqLworaW50IGlvbW11X2RldGVjdGVkIF9fcmVhZF9tb3N0bHkgPSAwOworCisvKiBE dW1teSBkZXZpY2UgdXNlZCBmb3IgTlVMTCBhcmd1bWVudHMgKG5vcm1hbGx5IElTQSkuIEJldHRl ciB3b3VsZAorICAgYmUgcHJvYmFibHkgYSBzbWFsbGVyIERNQSBtYXNrLCBidXQgdGhpcyBpcyBi dWctdG8tYnVnIGNvbXBhdGlibGUKKyAgIHRvIGkzODYuICovCitzdHJ1Y3QgZGV2aWNlIGZhbGxi YWNrX2RldiA9IHsKKwkuYnVzX2lkID0gImZhbGxiYWNrIGRldmljZSIsCisJLmNvaGVyZW50X2Rt YV9tYXNrID0gRE1BXzMyQklUX01BU0ssCisJLmRtYV9tYXNrID0gJmZhbGxiYWNrX2Rldi5jb2hl cmVudF9kbWFfbWFzaywKK307CisKKy8qIEFsbG9jYXRlIERNQSBtZW1vcnkgb24gbm9kZSBuZWFy IGRldmljZSAqLworbm9pbmxpbmUgc3RhdGljIHZvaWQgKgorZG1hX2FsbG9jX3BhZ2VzKHN0cnVj dCBkZXZpY2UgKmRldiwgZ2ZwX3QgZ2ZwLCB1bnNpZ25lZCBvcmRlcikKK3sKKwlzdHJ1Y3QgcGFn ZSAqcGFnZTsKKwlpbnQgbm9kZTsKKyNpZmRlZiBDT05GSUdfUENJCisJaWYgKGRldi0+YnVzID09 ICZwY2lfYnVzX3R5cGUpCisJCW5vZGUgPSBwY2lidXNfdG9fbm9kZSh0b19wY2lfZGV2KGRldikt PmJ1cyk7CisJZWxzZQorI2VuZGlmCisJCW5vZGUgPSBudW1hX25vZGVfaWQoKTsKKworCWlmIChu b2RlIDwgZmlyc3Rfbm9kZShub2RlX29ubGluZV9tYXApKQorCQlub2RlID0gZmlyc3Rfbm9kZShu b2RlX29ubGluZV9tYXApOworCisJcGFnZSA9IGFsbG9jX3BhZ2VzX25vZGUobm9kZSwgZ2ZwLCBv cmRlcik7CisJcmV0dXJuIHBhZ2UgPyBwYWdlX2FkZHJlc3MocGFnZSkgOiBOVUxMOworfQorCisv KgorICogQWxsb2NhdGUgbWVtb3J5IGZvciBhIGNvaGVyZW50IG1hcHBpbmcuCisgKi8KK3ZvaWQg KgorZG1hX2FsbG9jX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsIGRt YV9hZGRyX3QgKmRtYV9oYW5kbGUsCisJCSAgIGdmcF90IGdmcCkKK3sKKwl2b2lkICptZW1vcnk7 CisJdW5zaWduZWQgbG9uZyBkbWFfbWFzayA9IDA7CisJdTY0IGJ1czsKKworCWlmICghZGV2KQor CQlkZXYgPSAmZmFsbGJhY2tfZGV2OworCWRtYV9tYXNrID0gZGV2LT5jb2hlcmVudF9kbWFfbWFz azsKKwlpZiAoZG1hX21hc2sgPT0gMCkKKwkJZG1hX21hc2sgPSBETUFfMzJCSVRfTUFTSzsKKwor CS8qIERvbid0IGludm9rZSBPT00ga2lsbGVyICovCisJZ2ZwIHw9IF9fR0ZQX05PUkVUUlk7CisK KwkvKiBLbHVkZ2UgdG8gbWFrZSBpdCBidWctdG8tYnVnIGNvbXBhdGlibGUgd2l0aCBpMzg2LiBp Mzg2CisJICAgdXNlcyB0aGUgbm9ybWFsIGRtYV9tYXNrIGZvciBhbGxvY19jb2hlcmVudC4gKi8K KwlkbWFfbWFzayAmPSAqZGV2LT5kbWFfbWFzazsKKworCS8qIFdoeSA8PT8gRXZlbiB3aGVuIHRo ZSBtYXNrIGlzIHNtYWxsZXIgdGhhbiA0R0IgaXQgaXMgb2Z0ZW4KKwkgICBsYXJnZXIgdGhhbiAx Nk1CIGFuZCBpbiB0aGlzIGNhc2Ugd2UgaGF2ZSBhIGNoYW5jZSBvZgorCSAgIGZpbmRpbmcgZml0 dGluZyBtZW1vcnkgaW4gdGhlIG5leHQgaGlnaGVyIHpvbmUgZmlyc3QuIElmCisJICAgbm90IHJl dHJ5IHdpdGggdHJ1ZSBHRlBfRE1BLiAtQUsgKi8KKwlpZiAoZG1hX21hc2sgPD0gRE1BXzMyQklU X01BU0spCisJCWdmcCB8PSBHRlBfRE1BMzI7CisKKyBhZ2FpbjoKKwltZW1vcnkgPSBkbWFfYWxs b2NfcGFnZXMoZGV2LCBnZnAsIGdldF9vcmRlcihzaXplKSk7CisJaWYgKG1lbW9yeSA9PSBOVUxM KQorCQlyZXR1cm4gTlVMTDsKKworCXsKKwkJaW50IGhpZ2gsIG1tdTsKKwkJYnVzID0gdmlydF90 b19idXMobWVtb3J5KTsKKwkgICAgICAgIGhpZ2ggPSAoYnVzICsgc2l6ZSkgPj0gZG1hX21hc2s7 CisJCW1tdSA9IGhpZ2g7CisJCWlmIChmb3JjZV9pb21tdSAmJiAhKGdmcCAmIEdGUF9ETUEpKQor CQkJbW11ID0gMTsKKwkJZWxzZSBpZiAoaGlnaCkgeworCQkJZnJlZV9wYWdlcygodW5zaWduZWQg bG9uZyltZW1vcnksCisJCQkJICAgZ2V0X29yZGVyKHNpemUpKTsKKworCQkJLyogRG9uJ3QgdXNl IHRoZSAxNk1CIFpPTkVfRE1BIHVubGVzcyBhYnNvbHV0ZWx5CisJCQkgICBuZWVkZWQuIEl0J3Mg YmV0dGVyIHRvIHVzZSByZW1hcHBpbmcgZmlyc3QuICovCisJCQlpZiAoZG1hX21hc2sgPCBETUFf MzJCSVRfTUFTSyAmJiAhKGdmcCAmIEdGUF9ETUEpKSB7CisJCQkJZ2ZwID0gKGdmcCAmIH5HRlBf RE1BMzIpIHwgR0ZQX0RNQTsKKwkJCQlnb3RvIGFnYWluOworCQkJfQorCisJCQkvKiBMZXQgbG93 IGxldmVsIG1ha2UgaXRzIG93biB6b25lIGRlY2lzaW9ucyAqLworCQkJZ2ZwICY9IH4oR0ZQX0RN QTMyfEdGUF9ETUEpOworCisJCQlpZiAoZG1hX29wcy0+YWxsb2NfY29oZXJlbnQpCisJCQkJcmV0 dXJuIGRtYV9vcHMtPmFsbG9jX2NvaGVyZW50KGRldiwgc2l6ZSwKKwkJCQkJCQkgICBkbWFfaGFu ZGxlLCBnZnApOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQkvKiBIYXJkY29kZSAzMSBhZGRy ZXNzIGJpdHMgZm9yIG5vdzogYWFjcmFpZCBsaW1pdGF0aW9uLiAqLworCQlpZiAoeGVuX2NyZWF0 ZV9jb250aWd1b3VzX3JlZ2lvbigodW5zaWduZWQgbG9uZyltZW1vcnksIGdldF9vcmRlcihzaXpl KSwgMzEpICE9IDApIHsKKwkJCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpbWVtb3J5LCBnZXRf b3JkZXIoc2l6ZSkpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQltZW1zZXQobWVtb3J5LCAw LCBzaXplKTsKKwkJaWYgKCFtbXUpIHsKKwkJCSpkbWFfaGFuZGxlID0gdmlydF90b19idXMobWVt b3J5KTsKKwkJCXJldHVybiBtZW1vcnk7CisJCX0KKwl9CisKKwlpZiAoZG1hX29wcy0+YWxsb2Nf Y29oZXJlbnQpIHsKKwkJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZyltZW1vcnksIGdldF9vcmRl cihzaXplKSk7CisJCWdmcCAmPSB+KEdGUF9ETUF8R0ZQX0RNQTMyKTsKKwkJcmV0dXJuIGRtYV9v cHMtPmFsbG9jX2NvaGVyZW50KGRldiwgc2l6ZSwgZG1hX2hhbmRsZSwgZ2ZwKTsKKwl9CisKKwlp ZiAoZG1hX29wcy0+bWFwX3NpbXBsZSkgeworCQkqZG1hX2hhbmRsZSA9IGRtYV9vcHMtPm1hcF9z aW1wbGUoZGV2LCBtZW1vcnksCisJCQkJCSAgICAgIHNpemUsCisJCQkJCSAgICAgIFBDSV9ETUFf QklESVJFQ1RJT05BTCk7CisJCWlmICgqZG1hX2hhbmRsZSAhPSBiYWRfZG1hX2FkZHJlc3MpCisJ CQlyZXR1cm4gbWVtb3J5OworCX0KKworCWlmIChwYW5pY19vbl9vdmVyZmxvdykKKwkJcGFuaWMo ImRtYV9hbGxvY19jb2hlcmVudDogSU9NTVUgb3ZlcmZsb3cgYnkgJWx1IGJ5dGVzXG4iLHNpemUp OworCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpbWVtb3J5LCBnZXRfb3JkZXIoc2l6ZSkpOwor CXJldHVybiBOVUxMOworfQorRVhQT1JUX1NZTUJPTChkbWFfYWxsb2NfY29oZXJlbnQpOworCisv KgorICogVW5tYXAgY29oZXJlbnQgbWVtb3J5LgorICogVGhlIGNhbGxlciBtdXN0IGVuc3VyZSB0 aGF0IHRoZSBkZXZpY2UgaGFzIGZpbmlzaGVkIGFjY2Vzc2luZyB0aGUgbWFwcGluZy4KKyAqLwor dm9pZCBkbWFfZnJlZV9jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLAor CQkJIHZvaWQgKnZhZGRyLCBkbWFfYWRkcl90IGJ1cykKK3sKKwlpZiAoZG1hX29wcy0+dW5tYXBf c2luZ2xlKQorCQlkbWFfb3BzLT51bm1hcF9zaW5nbGUoZGV2LCBidXMsIHNpemUsIDApOworCXhl bl9kZXN0cm95X2NvbnRpZ3VvdXNfcmVnaW9uKCh1bnNpZ25lZCBsb25nKSB2YWRkciwgZ2V0X29y ZGVyKHNpemUpKTsKKwlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKXZhZGRyLCBnZXRfb3JkZXIo c2l6ZSkpOworfQorRVhQT1JUX1NZTUJPTChkbWFfZnJlZV9jb2hlcmVudCk7CisKK2ludCBkbWFf c3VwcG9ydGVkKHN0cnVjdCBkZXZpY2UgKmRldiwgdTY0IG1hc2spCit7CisJaWYgKGRtYV9vcHMt PmRtYV9zdXBwb3J0ZWQpCisJCXJldHVybiBkbWFfb3BzLT5kbWFfc3VwcG9ydGVkKGRldiwgbWFz ayk7CisKKwkvKiBDb3BpZWQgZnJvbSBpMzg2LiBEb2Vzbid0IG1ha2UgbXVjaCBzZW5zZSwgYmVj YXVzZSBpdCB3aWxsCisJICAgb25seSB3b3JrIGZvciBwY2lfYWxsb2NfY29oZXJlbnQuCisJICAg VGhlIGNhbGxlciBqdXN0IGhhcyB0byB1c2UgR0ZQX0RNQSBpbiB0aGlzIGNhc2UuICovCisgICAg ICAgIGlmIChtYXNrIDwgRE1BXzI0QklUX01BU0spCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7 CisKKwkvKiBUZWxsIHRoZSBkZXZpY2UgdG8gdXNlIFNBQyB3aGVuIElPTU1VIGZvcmNlIGlzIG9u LiAgVGhpcworCSAgIGFsbG93cyB0aGUgZHJpdmVyIHRvIHVzZSBjaGVhcGVyIGFjY2Vzc2VzIGlu IHNvbWUgY2FzZXMuCisKKwkgICBQcm9ibGVtIHdpdGggdGhpcyBpcyB0aGF0IGlmIHdlIG92ZXJm bG93IHRoZSBJT01NVSBhcmVhIGFuZAorCSAgIHJldHVybiBEQUMgYXMgZmFsbGJhY2sgYWRkcmVz cyB0aGUgZGV2aWNlIG1heSBub3QgaGFuZGxlIGl0CisJICAgY29ycmVjdGx5LgorCisJICAgQXMg YSBzcGVjaWFsIGNhc2Ugc29tZSBjb250cm9sbGVycyBoYXZlIGEgMzliaXQgYWRkcmVzcworCSAg IG1vZGUgdGhhdCBpcyBhcyBlZmZpY2llbnQgYXMgMzJiaXQgKGFpYzc5eHgpLiBEb24ndCBmb3Jj ZQorCSAgIFNBQyBmb3IgdGhlc2UuICBBc3N1bWUgYWxsIG1hc2tzIDw9IDQwIGJpdHMgYXJlIG9m IHRoaXMKKwkgICB0eXBlLiBOb3JtYWxseSB0aGlzIGRvZXNuJ3QgbWFrZSBhbnkgZGlmZmVyZW5j ZSwgYnV0IGdpdmVzCisJICAgbW9yZSBnZW50bGUgaGFuZGxpbmcgb2YgSU9NTVUgb3ZlcmZsb3cu ICovCisJaWYgKGlvbW11X3NhY19mb3JjZSAmJiAobWFzayA+PSBETUFfNDBCSVRfTUFTSykpIHsK KwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEZvcmNlIFNBQyB3aXRoIG1hc2sgJUx4XG4iLCBkZXYt PmJ1c19pZCxtYXNrKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CitFWFBPUlRf U1lNQk9MKGRtYV9zdXBwb3J0ZWQpOworCitpbnQgZG1hX3NldF9tYXNrKHN0cnVjdCBkZXZpY2Ug KmRldiwgdTY0IG1hc2spCit7CisJaWYgKCFkZXYtPmRtYV9tYXNrIHx8ICFkbWFfc3VwcG9ydGVk KGRldiwgbWFzaykpCisJCXJldHVybiAtRUlPOworCSpkZXYtPmRtYV9tYXNrID0gbWFzazsKKwly ZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woZG1hX3NldF9tYXNrKTsKKworLyogaW9tbXU9W3Np emVdWyxub2FncF1bLG9mZl1bLGZvcmNlXVssbm9mb3JjZV1bLGxlYWtdWyxtZW1hcGVyWz1vcmRl cl1dWyxtZXJnZV0KKyAgICAgICAgIFssZm9yY2VzYWNdWyxmdWxsZmx1c2hdWyxub21lcmdlXVss YmlvbWVyZ2VdCisgICBzaXplICBzZXQgc2l6ZSBvZiBpb21tdSAoaW4gYnl0ZXMpCisgICBub2Fn cCBkb24ndCBpbml0aWFsaXplIHRoZSBBR1AgZHJpdmVyIGFuZCB1c2UgZnVsbCBhcGVydHVyZS4K KyAgIG9mZiAgIGRvbid0IHVzZSB0aGUgSU9NTVUKKyAgIGxlYWsgIHR1cm4gb24gc2ltcGxlIGlv bW11IGxlYWsgdHJhY2luZyAob25seSB3aGVuIENPTkZJR19JT01NVV9MRUFLIGlzIG9uKQorICAg bWVtYXBlcls9b3JkZXJdIGFsbG9jYXRlIGFuIG93biBhcGVydHVyZSBvdmVyIFJBTSB3aXRoIHNp emUgMzJNQl5vcmRlci4KKyAgIG5vZm9yY2UgZG9uJ3QgZm9yY2UgSU9NTVUgdXNhZ2UuIERlZmF1 bHQuCisgICBmb3JjZSAgRm9yY2UgSU9NTVUuCisgICBtZXJnZSAgRG8gbGF6eSBtZXJnaW5nLiBU aGlzIG1heSBpbXByb3ZlIHBlcmZvcm1hbmNlIG9uIHNvbWUgYmxvY2sgZGV2aWNlcy4KKyAgICAg ICAgICBJbXBsaWVzIGZvcmNlIChleHBlcmltZW50YWwpCisgICBiaW9tZXJnZSBEbyBtZXJnaW5n IGF0IHRoZSBCSU8gbGF5ZXIuIFRoaXMgaXMgbW9yZSBlZmZpY2llbnQgdGhhbiBtZXJnZSwKKyAg ICAgICAgICAgIGJ1dCBzaG91bGQgYmUgb25seSBkb25lIHdpdGggdmVyeSBiaWcgSU9NTVVzLiBJ bXBsaWVzIG1lcmdlLGZvcmNlLgorICAgbm9tZXJnZSBEb24ndCBkbyBTRyBtZXJnaW5nLgorICAg Zm9yY2VzYWMgRm9yIFNBQyBtb2RlIGZvciBtYXNrcyA8NDBiaXRzICAoZXhwZXJpbWVudGFsKQor ICAgZnVsbGZsdXNoIEZsdXNoIElPTU1VIG9uIGVhY2ggYWxsb2NhdGlvbiAoZGVmYXVsdCkKKyAg IG5vZnVsbGZsdXNoIERvbid0IHVzZSBJT01NVSBmdWxsZmx1c2gKKyAgIGFsbG93ZWQgIG92ZXJ3 cml0ZSBpb21tdSBvZmYgd29ya2Fyb3VuZHMgZm9yIHNwZWNpZmljIGNoaXBzZXRzLgorICAgc29m dAkgVXNlIHNvZnR3YXJlIGJvdW5jZSBidWZmZXJpbmcgKGRlZmF1bHQgZm9yIEludGVsIG1hY2hp bmVzKQorICAgbm9hcGVydHVyZSBEb24ndCB0b3VjaCB0aGUgYXBlcnR1cmUgZm9yIEFHUC4KKyov CitfX2luaXQgaW50IGlvbW11X3NldHVwKGNoYXIgKnApCit7CisgICAgaW9tbXVfbWVyZ2UgPSAx OworCisgICAgd2hpbGUgKCpwKSB7CisJICAgIGlmICghc3RybmNtcChwLCJvZmYiLDMpKQorCQkg ICAgbm9faW9tbXUgPSAxOworCSAgICAvKiBnYXJ0X3BhcnNlX29wdGlvbnMgaGFzIG1vcmUgZm9y Y2Ugc3VwcG9ydCAqLworCSAgICBpZiAoIXN0cm5jbXAocCwiZm9yY2UiLDUpKQorCQkgICAgZm9y Y2VfaW9tbXUgPSAxOworCSAgICBpZiAoIXN0cm5jbXAocCwibm9mb3JjZSIsNykpIHsKKwkJICAg IGlvbW11X21lcmdlID0gMDsKKwkJICAgIGZvcmNlX2lvbW11ID0gMDsKKwkgICAgfQorCisJICAg IGlmICghc3RybmNtcChwLCAiYmlvbWVyZ2UiLDgpKSB7CisJCSAgICBpb21tdV9iaW9fbWVyZ2Ug PSA0MDk2OworCQkgICAgaW9tbXVfbWVyZ2UgPSAxOworCQkgICAgZm9yY2VfaW9tbXUgPSAxOwor CSAgICB9CisJICAgIGlmICghc3RybmNtcChwLCAicGFuaWMiLDUpKQorCQkgICAgcGFuaWNfb25f b3ZlcmZsb3cgPSAxOworCSAgICBpZiAoIXN0cm5jbXAocCwgIm5vcGFuaWMiLDcpKQorCQkgICAg cGFuaWNfb25fb3ZlcmZsb3cgPSAwOworCSAgICBpZiAoIXN0cm5jbXAocCwgIm1lcmdlIiw1KSkg eworCQkgICAgaW9tbXVfbWVyZ2UgPSAxOworCQkgICAgZm9yY2VfaW9tbXUgPSAxOworCSAgICB9 CisJICAgIGlmICghc3RybmNtcChwLCAibm9tZXJnZSIsNykpCisJCSAgICBpb21tdV9tZXJnZSA9 IDA7CisJICAgIGlmICghc3RybmNtcChwLCAiZm9yY2VzYWMiLDgpKQorCQkgICAgaW9tbXVfc2Fj X2ZvcmNlID0gMTsKKworI2lmZGVmIENPTkZJR19TV0lPVExCCisJICAgIGlmICghc3RybmNtcChw LCAic29mdCIsNCkpCisJCSAgICBzd2lvdGxiID0gMTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklH X0lPTU1VCisJICAgIGdhcnRfcGFyc2Vfb3B0aW9ucyhwKTsKKyNlbmRpZgorCisJICAgIHAgKz0g c3RyY3NwbihwLCAiLCIpOworCSAgICBpZiAoKnAgPT0gJywnKQorCQkgICAgKytwOworICAgIH0K KyAgICByZXR1cm4gMTsKK30KK19fc2V0dXAoImlvbW11PSIsIGlvbW11X3NldHVwKTsKKwordm9p ZCBfX2luaXQgcGNpX2lvbW11X2FsbG9jKHZvaWQpCit7CisJLyoKKwkgKiBUaGUgb3JkZXIgb2Yg dGhlc2UgZnVuY3Rpb25zIGlzIGltcG9ydGFudCBmb3IKKwkgKiBmYWxsLWJhY2svZmFpbC1vdmVy IHJlYXNvbnMKKwkgKi8KKyNpZmRlZiBDT05GSUdfSU9NTVUKKwlpb21tdV9ob2xlX2luaXQoKTsK KyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0NBTEdBUllfSU9NTVUKKwlkZXRlY3RfY2FsZ2FyeSgp OworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfU1dJT1RMQgorCXBjaV9zd2lvdGxiX2luaXQoKTsK KyNlbmRpZgorfQorCitzdGF0aWMgaW50IF9faW5pdCBwY2lfaW9tbXVfaW5pdCh2b2lkKQorewor I2lmZGVmIENPTkZJR19DQUxHQVJZX0lPTU1VCisJY2FsZ2FyeV9pb21tdV9pbml0KCk7CisjZW5k aWYKKworI2lmZGVmIENPTkZJR19JT01NVQorCWdhcnRfaW9tbXVfaW5pdCgpOworI2VuZGlmCisK Kwlub19pb21tdV9pbml0KCk7CisJcmV0dXJuIDA7Cit9CisKKy8qIE11c3QgZXhlY3V0ZSBhZnRl ciBQQ0kgc3Vic3lzdGVtICovCitmc19pbml0Y2FsbChwY2lfaW9tbXVfaW5pdCk7CmRpZmYgLXIg YjkwMTgwYzJhMDU3IGxpbnV4LTIuNi14ZW4tc3BhcnNlL2xpYi9zd2lvdGxiLXhlbi5jCi0tLSAv ZGV2L251bGwJVGh1IEphbiAwMSAwMDowMDowMCAxOTcwICswMDAwCisrKyBiL2xpbnV4LTIuNi14 ZW4tc3BhcnNlL2xpYi9zd2lvdGxiLXhlbi5jCVdlZCBGZWIgMjEgMTk6MzQ6MjYgMjAwNyAtMDYw MApAQCAtMCwwICsxLDgyMCBAQAorLyoKKyAqIER5bmFtaWMgRE1BIG1hcHBpbmcgc3VwcG9ydC4K KyAqCisgKiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIGZvciBJQS02NCBhbmQgRU02NFQgcGxhdGZv cm1zIHRoYXQgZG8gbm90IHN1cHBvcnQKKyAqIEkvTyBUTEJzIChha2EgRE1BIGFkZHJlc3MgdHJh bnNsYXRpb24gaGFyZHdhcmUpLgorICogQ29weXJpZ2h0IChDKSAyMDAwIEFzaXQgTWFsbGljayA8 QXNpdC5LLk1hbGxpY2tAaW50ZWwuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDAwIEdvdXRoYW0g UmFvIDxnb3V0aGFtLnJhb0BpbnRlbC5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDMg SGV3bGV0dC1QYWNrYXJkIENvCisgKglEYXZpZCBNb3NiZXJnZXItVGFuZyA8ZGF2aWRtQGhwbC5o cC5jb20+CisgKgorICogMDMvMDUvMDcgZGF2aWRtCVN3aXRjaCBmcm9tIFBDSS1ETUEgdG8gZ2Vu ZXJpYyBkZXZpY2UgRE1BIEFQSS4KKyAqIDAwLzEyLzEzIGRhdmlkbQlSZW5hbWUgdG8gc3dpb3Rs Yi5jIGFuZCBhZGQgbWFya19jbGVhbigpIHRvIGF2b2lkCisgKgkJCXVubmVjZXNzYXJ5IGktY2Fj aGUgZmx1c2hpbmcuCisgKiAwNC8wNy8uLiBhawkJQmV0dGVyIG92ZXJmbG93IGhhbmRsaW5nLiBB c3NvcnRlZCBmaXhlcy4KKyAqIDA1LzA5LzEwIGxpbnZpbGxlCUFkZCBzdXBwb3J0IGZvciBzeW5j aW5nIHJhbmdlcywgc3VwcG9ydCBzeW5jaW5nIGZvcgorICoJCQlETUFfQklESVJFQ1RJT05BTCBt YXBwaW5ncywgbWlzY2VsbGFuZW91cyBjbGVhbnVwLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9j YWNoZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgv bW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9j ay5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+ CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1 ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vc2NhdHRlcmxpc3QuaD4KKworI2luY2x1ZGUg PGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CisKKyNkZWZpbmUgT0ZG U0VUKHZhbCxhbGlnbikgKCh1bnNpZ25lZCBsb25nKQlcCisJICAgICAgICAgICAgICAgICAgICgg KHZhbCkgJiAoIChhbGlnbikgLSAxKSkpCisKKyNkZWZpbmUgU0dfRU5UX1ZJUlRfQUREUkVTUyhz ZykJKHBhZ2VfYWRkcmVzcygoc2cpLT5wYWdlKSArIChzZyktPm9mZnNldCkKKyNkZWZpbmUgU0df RU5UX1BIWVNfQUREUkVTUyhTRykJdmlydF90b19idXMoU0dfRU5UX1ZJUlRfQUREUkVTUyhTRykp CisKKy8qCisgKiBNYXhpbXVtIGFsbG93YWJsZSBudW1iZXIgb2YgY29udGlndW91cyBzbGFicyB0 byBtYXAsCisgKiBtdXN0IGJlIGEgcG93ZXIgb2YgMi4gIFdoYXQgaXMgdGhlIGFwcHJvcHJpYXRl IHZhbHVlID8KKyAqIFRoZSBjb21wbGV4aXR5IG9mIHttYXAsdW5tYXB9X3NpbmdsZSBpcyBsaW5l YXJseSBkZXBlbmRlbnQgb24gdGhpcyB2YWx1ZS4KKyAqLworI2RlZmluZSBJT19UTEJfU0VHU0la RQkxMjgKKworLyoKKyAqIGxvZyBvZiB0aGUgc2l6ZSBvZiBlYWNoIElPIFRMQiBzbGFiLiAgVGhl IG51bWJlciBvZiBzbGFicyBpcyBjb21tYW5kIGxpbmUKKyAqIGNvbnRyb2xsYWJsZS4KKyAqLwor I2RlZmluZSBJT19UTEJfU0hJRlQgMTEKKworI2RlZmluZSBTTEFCU19QRVJfUEFHRSAoMSA8PCAo UEFHRV9TSElGVCAtIElPX1RMQl9TSElGVCkpCisKKy8qCisgKiBNaW5pbXVtIElPIFRMQiBzaXpl IHRvIGJvdGhlciBib290aW5nIHdpdGguICBTeXN0ZW1zIHdpdGggbWFpbmx5CisgKiA2NGJpdCBj YXBhYmxlIGNhcmRzIHdpbGwgb25seSBsaWdodGx5IHVzZSB0aGUgc3dpb3RsYi4gIElmIHdlIGNh bid0CisgKiBhbGxvY2F0ZSBhIGNvbnRpZ3VvdXMgMU1CLCB3ZSdyZSBwcm9iYWJseSBpbiB0cm91 YmxlIGFueXdheS4KKyAqLworI2RlZmluZSBJT19UTEJfTUlOX1NMQUJTICgoMTw8MjApID4+IElP X1RMQl9TSElGVCkKKworLyoKKyAqIEVudW1lcmF0aW9uIGZvciBzeW5jIHRhcmdldHMKKyAqLwor ZW51bSBkbWFfc3luY190YXJnZXQgeworCVNZTkNfRk9SX0NQVSA9IDAsCisJU1lOQ19GT1JfREVW SUNFID0gMSwKK307CisKK2ludCBzd2lvdGxiX2ZvcmNlOworCisvKgorICogVXNlZCB0byBkbyBh IHF1aWNrIHJhbmdlIGNoZWNrIGluIHN3aW90bGJfdW5tYXBfc2luZ2xlIGFuZAorICogc3dpb3Rs Yl9zeW5jX3NpbmdsZV8qLCB0byBzZWUgaWYgdGhlIG1lbW9yeSB3YXMgaW4gZmFjdCBhbGxvY2F0 ZWQgYnkgdGhpcworICogQVBJLgorICovCitzdGF0aWMgY2hhciAqaW9fdGxiX3N0YXJ0LCAqaW9f dGxiX2VuZDsKKworLyoKKyAqIFRoZSBudW1iZXIgb2YgSU8gVExCIGJsb2NrcyAoaW4gZ3JvdXBz IG9mIDY0KSBiZXR3ZWVlbiBpb190bGJfc3RhcnQgYW5kCisgKiBpb190bGJfZW5kLiAgVGhpcyBp cyBjb21tYW5kIGxpbmUgYWRqdXN0YWJsZSB2aWEgc2V0dXBfaW9fdGxiX25wYWdlcy4KKyAqLwor c3RhdGljIHVuc2lnbmVkIGxvbmcgaW9fdGxiX25zbGFiczsKKworLyoKKyAqIFdoZW4gdGhlIElP TU1VIG92ZXJmbG93cyB3ZSByZXR1cm4gYSBmYWxsYmFjayBidWZmZXIuIFRoaXMgc2V0cyB0aGUg c2l6ZS4KKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgaW9fdGxiX292ZXJmbG93ID0gMzIqMTAy NDsKKwordm9pZCAqaW9fdGxiX292ZXJmbG93X2J1ZmZlcjsKKworLyoKKyAqIFRoaXMgaXMgYSBm cmVlIGxpc3QgZGVzY3JpYmluZyB0aGUgbnVtYmVyIG9mIGZyZWUgZW50cmllcyBhdmFpbGFibGUg ZnJvbQorICogZWFjaCBpbmRleAorICovCitzdGF0aWMgdW5zaWduZWQgaW50ICppb190bGJfbGlz dDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaW9fdGxiX2luZGV4OworCisvKgorICogV2UgbmVlZCB0 byBzYXZlIGF3YXkgdGhlIG9yaWdpbmFsIGFkZHJlc3MgY29ycmVzcG9uZGluZyB0byBhIG1hcHBl ZCBlbnRyeQorICogZm9yIHRoZSBzeW5jIG9wZXJhdGlvbnMuCisgKi8KK3N0YXRpYyB1bnNpZ25l ZCBjaGFyICoqaW9fdGxiX29yaWdfYWRkcjsKKworLyoKKyAqIFByb3RlY3QgdGhlIGFib3ZlIGRh dGEgc3RydWN0dXJlcyBpbiB0aGUgbWFwIGFuZCB1bm1hcCBjYWxscworICovCitzdGF0aWMgREVG SU5FX1NQSU5MT0NLKGlvX3RsYl9sb2NrKTsKKworc3RhdGljIGludCBfX2luaXQKK3NldHVwX2lv X3RsYl9ucGFnZXMoY2hhciAqc3RyKQoreworCWlmIChpc2RpZ2l0KCpzdHIpKSB7CisJCWlvX3Rs Yl9uc2xhYnMgPSBzaW1wbGVfc3RydG91bChzdHIsICZzdHIsIDApOworCQkvKiBhdm9pZCB0YWls IHNlZ21lbnQgb2Ygc2l6ZSA8IElPX1RMQl9TRUdTSVpFICovCisJCWlvX3RsYl9uc2xhYnMgPSBB TElHTihpb190bGJfbnNsYWJzLCBJT19UTEJfU0VHU0laRSk7CisJfQorCWlmICgqc3RyID09ICcs JykKKwkJKytzdHI7CisJaWYgKCFzdHJjbXAoc3RyLCAiZm9yY2UiKSkKKwkJc3dpb3RsYl9mb3Jj ZSA9IDE7CisJcmV0dXJuIDE7Cit9CitfX3NldHVwKCJzd2lvdGxiPSIsIHNldHVwX2lvX3RsYl9u cGFnZXMpOworLyogbWFrZSBpb190bGJfb3ZlcmZsb3cgdHVuYWJsZSB0b28/ICovCisKKy8qCisg KiBTdGF0aWNhbGx5IHJlc2VydmUgYm91bmNlIGJ1ZmZlciBzcGFjZSBhbmQgaW5pdGlhbGl6ZSBi b3VuY2UgYnVmZmVyIGRhdGEKKyAqIHN0cnVjdHVyZXMgZm9yIHRoZSBzb2Z0d2FyZSBJTyBUTEIg dXNlZCB0byBpbXBsZW1lbnQgdGhlIERNQSBBUEkuCisgKi8KK3ZvaWQKK3N3aW90bGJfaW5pdF93 aXRoX2RlZmF1bHRfc2l6ZSAoc2l6ZV90IGRlZmF1bHRfc2l6ZSkKK3sKKwl1bnNpZ25lZCBsb25n IGk7CisKKwlpZiAoIWlvX3RsYl9uc2xhYnMpIHsKKwkJaW9fdGxiX25zbGFicyA9IChkZWZhdWx0 X3NpemUgPj4gSU9fVExCX1NISUZUKTsKKwkJaW9fdGxiX25zbGFicyA9IEFMSUdOKGlvX3RsYl9u c2xhYnMsIElPX1RMQl9TRUdTSVpFKTsKKwl9CisKKwkvKgorCSAqIEdldCBJTyBUTEIgbWVtb3J5 IGZyb20gdGhlIGxvdyBwYWdlcworCSAqLworCWlvX3RsYl9zdGFydCA9IGFsbG9jX2Jvb3RtZW1f bG93X3BhZ2VzKGlvX3RsYl9uc2xhYnMgKiAoMSA8PCBJT19UTEJfU0hJRlQpKTsKKwlpZiAoIWlv X3RsYl9zdGFydCkKKwkJcGFuaWMoIkNhbm5vdCBhbGxvY2F0ZSBTV0lPVExCIGJ1ZmZlciIpOwor CWlmICh4ZW5fY3JlYXRlX2NvbnRpZ3VvdXNfcmVnaW9uKCh1bnNpZ25lZCBsb25nKWlvX3RsYl9z dGFydCwgZ2V0X29yZGVyKGlvX3RsYl9uc2xhYnMgKiAoMSA8PCBJT19UTEJfU0hJRlQpKSwgMzEp KQoreworcHJpbnRrKEtFUk5fRVJSICJ1Z2x5IGxvY2t1cFxuIik7Citmb3IgKDs7KSA7CisJCXBh bmljKCJDYW5ub3QgY3JlYXRlIGEgY29udGlndW91cyBtZW1vcnkgcmVnaW9uIGJlbG93IDRHQiBm b3IgdGhlIFNXSU9UTEIgYnVmZmVyIik7Cit9CisJaW9fdGxiX2VuZCA9IGlvX3RsYl9zdGFydCAr IGlvX3RsYl9uc2xhYnMgKiAoMSA8PCBJT19UTEJfU0hJRlQpOworCisJLyoKKwkgKiBBbGxvY2F0 ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgZnJlZSBsaXN0IGFycmF5LiAgVGhpcyBhcnJheSBpcyB1c2Vk CisJICogdG8gZmluZCBjb250aWd1b3VzIGZyZWUgbWVtb3J5IHJlZ2lvbnMgb2Ygc2l6ZSB1cCB0 byBJT19UTEJfU0VHU0laRQorCSAqIGJldHdlZW4gaW9fdGxiX3N0YXJ0IGFuZCBpb190bGJfZW5k LgorCSAqLworCWlvX3RsYl9saXN0ID0gYWxsb2NfYm9vdG1lbShpb190bGJfbnNsYWJzICogc2l6 ZW9mKGludCkpOworCWZvciAoaSA9IDA7IGkgPCBpb190bGJfbnNsYWJzOyBpKyspCisgCQlpb190 bGJfbGlzdFtpXSA9IElPX1RMQl9TRUdTSVpFIC0gT0ZGU0VUKGksIElPX1RMQl9TRUdTSVpFKTsK Kwlpb190bGJfaW5kZXggPSAwOworCWlvX3RsYl9vcmlnX2FkZHIgPSBhbGxvY19ib290bWVtKGlv X3RsYl9uc2xhYnMgKiBzaXplb2YoY2hhciAqKSk7CisKKwkvKgorCSAqIEdldCB0aGUgb3ZlcmZs b3cgZW1lcmdlbmN5IGJ1ZmZlcgorCSAqLworCWlvX3RsYl9vdmVyZmxvd19idWZmZXIgPSBhbGxv Y19ib290bWVtX2xvdyhpb190bGJfb3ZlcmZsb3cpOworCWlmIChpb190bGJfb3ZlcmZsb3dfYnVm ZmVyKQorCQl4ZW5fY3JlYXRlX2NvbnRpZ3VvdXNfcmVnaW9uKCh1bnNpZ25lZCBsb25nKWlvX3Rs Yl9vdmVyZmxvd19idWZmZXIsIGdldF9vcmRlcihpb190bGJfb3ZlcmZsb3cpLCAzMSk7CisJcHJp bnRrKEtFUk5fSU5GTyAiUGxhY2luZyBzb2Z0d2FyZSBJTyBUTEIgYmV0d2VlbiAweCVseCAtIDB4 JWx4XG4iLAorCSAgICAgICB2aXJ0X3RvX2J1cyhpb190bGJfc3RhcnQpLCB2aXJ0X3RvX2J1cyhp b190bGJfZW5kKSk7Cit9CisKK3ZvaWQKK3N3aW90bGJfaW5pdCAodm9pZCkKK3sKKwlzd2lvdGxi X2luaXRfd2l0aF9kZWZhdWx0X3NpemUoNjQgKiAoMTw8MjApKTsJLyogZGVmYXVsdCB0byA2NE1C ICovCit9CisKKy8qCisgKiBTeXN0ZW1zIHdpdGggbGFyZ2VyIERNQSB6b25lcyAodGhvc2UgdGhh dCBkb24ndCBzdXBwb3J0IElTQSkgY2FuCisgKiBpbml0aWFsaXplIHRoZSBzd2lvdGxiIGxhdGVy IHVzaW5nIHRoZSBzbGFiIGFsbG9jYXRvciBpZiBuZWVkZWQuCisgKiBUaGlzIHNob3VsZCBiZSBq dXN0IGxpa2UgYWJvdmUsIGJ1dCB3aXRoIHNvbWUgZXJyb3IgY2F0Y2hpbmcuCisgKi8KK2ludAor c3dpb3RsYl9sYXRlX2luaXRfd2l0aF9kZWZhdWx0X3NpemUgKHNpemVfdCBkZWZhdWx0X3NpemUp Cit7CisJdW5zaWduZWQgbG9uZyBpLCByZXFfbnNsYWJzID0gaW9fdGxiX25zbGFiczsKKwl1bnNp Z25lZCBpbnQgb3JkZXI7CisKKwlpZiAoIWlvX3RsYl9uc2xhYnMpIHsKKwkJaW9fdGxiX25zbGFi cyA9IChkZWZhdWx0X3NpemUgPj4gSU9fVExCX1NISUZUKTsKKwkJaW9fdGxiX25zbGFicyA9IEFM SUdOKGlvX3RsYl9uc2xhYnMsIElPX1RMQl9TRUdTSVpFKTsKKwl9CisKKwkvKgorCSAqIEdldCBJ TyBUTEIgbWVtb3J5IGZyb20gdGhlIGxvdyBwYWdlcworCSAqLworCW9yZGVyID0gZ2V0X29yZGVy KGlvX3RsYl9uc2xhYnMgKiAoMSA8PCBJT19UTEJfU0hJRlQpKTsKKwlpb190bGJfbnNsYWJzID0g U0xBQlNfUEVSX1BBR0UgPDwgb3JkZXI7CisKKwl3aGlsZSAoKFNMQUJTX1BFUl9QQUdFIDw8IG9y ZGVyKSA+IElPX1RMQl9NSU5fU0xBQlMpIHsKKwkJaW9fdGxiX3N0YXJ0ID0gKGNoYXIgKilfX2dl dF9mcmVlX3BhZ2VzKEdGUF9ETUEgfCBfX0dGUF9OT1dBUk4sCisJCSAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBvcmRlcik7CisJaWYgKGlvX3RsYl9zdGFydCYmIXhlbl9j cmVhdGVfY29udGlndW91c19yZWdpb24oKHVuc2lnbmVkIGxvbmcpaW9fdGxiX3N0YXJ0LCBvcmRl ciwgMzEpKSB7CisJCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpaW9fdGxiX3N0YXJ0LCBvcmRl cik7CisJCWlvX3RsYl9zdGFydCA9IE5VTEw7CisJfQorCQlpZiAoaW9fdGxiX3N0YXJ0KQorCQkJ YnJlYWs7CisJCW9yZGVyLS07CisJfQorCisJaWYgKCFpb190bGJfc3RhcnQpCisJCWdvdG8gY2xl YW51cDE7CisKKwlpZiAob3JkZXIgIT0gZ2V0X29yZGVyKGlvX3RsYl9uc2xhYnMgKiAoMSA8PCBJ T19UTEJfU0hJRlQpKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJXYXJuaW5nOiBvbmx5IGFi bGUgdG8gYWxsb2NhdGUgJWxkIE1CICIKKwkJICAgICAgICJmb3Igc29mdHdhcmUgSU8gVExCXG4i LCAoUEFHRV9TSVpFIDw8IG9yZGVyKSA+PiAyMCk7CisJCWlvX3RsYl9uc2xhYnMgPSBTTEFCU19Q RVJfUEFHRSA8PCBvcmRlcjsKKwl9CisJaW9fdGxiX2VuZCA9IGlvX3RsYl9zdGFydCArIGlvX3Rs Yl9uc2xhYnMgKiAoMSA8PCBJT19UTEJfU0hJRlQpOworCW1lbXNldChpb190bGJfc3RhcnQsIDAs IGlvX3RsYl9uc2xhYnMgKiAoMSA8PCBJT19UTEJfU0hJRlQpKTsKKworCS8qCisJICogQWxsb2Nh dGUgYW5kIGluaXRpYWxpemUgdGhlIGZyZWUgbGlzdCBhcnJheS4gIFRoaXMgYXJyYXkgaXMgdXNl ZAorCSAqIHRvIGZpbmQgY29udGlndW91cyBmcmVlIG1lbW9yeSByZWdpb25zIG9mIHNpemUgdXAg dG8gSU9fVExCX1NFR1NJWkUKKwkgKiBiZXR3ZWVuIGlvX3RsYl9zdGFydCBhbmQgaW9fdGxiX2Vu ZC4KKwkgKi8KKwlpb190bGJfbGlzdCA9ICh1bnNpZ25lZCBpbnQgKilfX2dldF9mcmVlX3BhZ2Vz KEdGUF9LRVJORUwsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X29yZGVyKGlv X3RsYl9uc2xhYnMgKiBzaXplb2YoaW50KSkpOworCWlmICghaW9fdGxiX2xpc3QpCisJCWdvdG8g Y2xlYW51cDI7CisKKwlmb3IgKGkgPSAwOyBpIDwgaW9fdGxiX25zbGFiczsgaSsrKQorIAkJaW9f dGxiX2xpc3RbaV0gPSBJT19UTEJfU0VHU0laRSAtIE9GRlNFVChpLCBJT19UTEJfU0VHU0laRSk7 CisJaW9fdGxiX2luZGV4ID0gMDsKKworCWlvX3RsYl9vcmlnX2FkZHIgPSAodW5zaWduZWQgY2hh ciAqKilfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwsCisJICAgICAgICAgICAgICAgICAgICAg ICAgICAgZ2V0X29yZGVyKGlvX3RsYl9uc2xhYnMgKiBzaXplb2YoY2hhciAqKSkpOworCWlmICgh aW9fdGxiX29yaWdfYWRkcikKKwkJZ290byBjbGVhbnVwMzsKKworCW1lbXNldChpb190bGJfb3Jp Z19hZGRyLCAwLCBpb190bGJfbnNsYWJzICogc2l6ZW9mKGNoYXIgKikpOworCisJLyoKKwkgKiBH ZXQgdGhlIG92ZXJmbG93IGVtZXJnZW5jeSBidWZmZXIKKwkgKi8KKwlpb190bGJfb3ZlcmZsb3df YnVmZmVyID0gKHZvaWQgKilfX2dldF9mcmVlX3BhZ2VzKEdGUF9ETUEsCisJICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X29yZGVyKGlvX3RsYl9vdmVyZmxvdykp OworCWlmIChpb190bGJfb3ZlcmZsb3dfYnVmZmVyJiYheGVuX2NyZWF0ZV9jb250aWd1b3VzX3Jl Z2lvbigodW5zaWduZWQgbG9uZylpb190bGJfb3ZlcmZsb3dfYnVmZmVyLCBnZXRfb3JkZXIoaW9f dGxiX292ZXJmbG93KSwgMzEpKSB7CisJCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpaW9fdGxi X292ZXJmbG93X2J1ZmZlciwgb3JkZXIpOworCQlpb190bGJfb3ZlcmZsb3dfYnVmZmVyID0gTlVM TDsKKwl9CisJaWYgKCFpb190bGJfb3ZlcmZsb3dfYnVmZmVyKQorCQlnb3RvIGNsZWFudXA0Owor CisJcHJpbnRrKEtFUk5fSU5GTyAiUGxhY2luZyAlbGRNQiBzb2Z0d2FyZSBJTyBUTEIgYmV0d2Vl biAweCVseCAtICIKKwkgICAgICAgIjB4JWx4XG4iLCAoaW9fdGxiX25zbGFicyAqICgxIDw8IElP X1RMQl9TSElGVCkpID4+IDIwLAorCSAgICAgICB2aXJ0X3RvX2J1cyhpb190bGJfc3RhcnQpLCB2 aXJ0X3RvX2J1cyhpb190bGJfZW5kKSk7CisKKwlyZXR1cm4gMDsKKworY2xlYW51cDQ6CisJZnJl ZV9wYWdlcygodW5zaWduZWQgbG9uZylpb190bGJfb3JpZ19hZGRyLCBnZXRfb3JkZXIoaW9fdGxi X25zbGFicyAqCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgc2l6ZW9mKGNoYXIgKikpKTsKKwlpb190bGJfb3JpZ19hZGRyID0gTlVMTDsKK2Ns ZWFudXAzOgorCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpaW9fdGxiX2xpc3QsIGdldF9vcmRl cihpb190bGJfbnNsYWJzICoKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgc2l6ZW9mKGludCkpKTsKKwlpb190bGJfbGlzdCA9IE5VTEw7CisJaW9fdGxi X2VuZCA9IE5VTEw7CitjbGVhbnVwMjoKKwl4ZW5fZGVzdHJveV9jb250aWd1b3VzX3JlZ2lvbigo dW5zaWduZWQgbG9uZylpb190bGJfc3RhcnQsIG9yZGVyKTsKKwlmcmVlX3BhZ2VzKCh1bnNpZ25l ZCBsb25nKWlvX3RsYl9zdGFydCwgb3JkZXIpOworCWlvX3RsYl9zdGFydCA9IE5VTEw7CitjbGVh bnVwMToKKwlpb190bGJfbnNsYWJzID0gcmVxX25zbGFiczsKKwlyZXR1cm4gLUVOT01FTTsKK30K Kworc3RhdGljIGlubGluZSBpbnQKK2FkZHJlc3NfbmVlZHNfbWFwcGluZyhzdHJ1Y3QgZGV2aWNl ICpod2RldiwgZG1hX2FkZHJfdCBhZGRyKQoreworCWRtYV9hZGRyX3QgbWFzayA9IDB4ZmZmZmZm ZmY7CisJLyogSWYgdGhlIGRldmljZSBoYXMgYSBtYXNrLCB1c2UgaXQsIG90aGVyd2lzZSBkZWZh dWx0IHRvIDMyIGJpdHMgKi8KKwlpZiAoaHdkZXYgJiYgaHdkZXYtPmRtYV9tYXNrKQorCQltYXNr ID0gKmh3ZGV2LT5kbWFfbWFzazsKKwlyZXR1cm4gKGFkZHIgJiB+bWFzaykgIT0gMDsKK30KKwor LyoKKyAqIEFsbG9jYXRlcyBib3VuY2UgYnVmZmVyIGFuZCByZXR1cm5zIGl0cyBrZXJuZWwgdmly dHVhbCBhZGRyZXNzLgorICovCitzdGF0aWMgdm9pZCAqCittYXBfc2luZ2xlKHN0cnVjdCBkZXZp Y2UgKmh3ZGV2LCBjaGFyICpidWZmZXIsIHNpemVfdCBzaXplLCBpbnQgZGlyKQoreworCXVuc2ln bmVkIGxvbmcgZmxhZ3M7CisJY2hhciAqZG1hX2FkZHI7CisJdW5zaWduZWQgaW50IG5zbG90cywg c3RyaWRlLCBpbmRleCwgd3JhcDsKKwlpbnQgaTsKKworCS8qCisJICogRm9yIG1hcHBpbmdzIGdy ZWF0ZXIgdGhhbiBhIHBhZ2UsIHdlIGxpbWl0IHRoZSBzdHJpZGUgKGFuZAorCSAqIGhlbmNlIGFs aWdubWVudCkgdG8gYSBwYWdlIHNpemUuCisJICovCisJbnNsb3RzID0gQUxJR04oc2l6ZSwgMSA8 PCBJT19UTEJfU0hJRlQpID4+IElPX1RMQl9TSElGVDsKKwlpZiAoc2l6ZSA+IFBBR0VfU0laRSkK KwkJc3RyaWRlID0gKDEgPDwgKFBBR0VfU0hJRlQgLSBJT19UTEJfU0hJRlQpKTsKKwllbHNlCisJ CXN0cmlkZSA9IDE7CisKKwlCVUdfT04oIW5zbG90cyk7CisKKwkvKgorCSAqIEZpbmQgc3VpdGFi bGUgbnVtYmVyIG9mIElPIFRMQiBlbnRyaWVzIHNpemUgdGhhdCB3aWxsIGZpdCB0aGlzCisJICog cmVxdWVzdCBhbmQgYWxsb2NhdGUgYSBidWZmZXIgZnJvbSB0aGF0IElPIFRMQiBwb29sLgorCSAq LworCXNwaW5fbG9ja19pcnFzYXZlKCZpb190bGJfbG9jaywgZmxhZ3MpOworCXsKKwkJd3JhcCA9 IGluZGV4ID0gQUxJR04oaW9fdGxiX2luZGV4LCBzdHJpZGUpOworCisJCWlmIChpbmRleCA+PSBp b190bGJfbnNsYWJzKQorCQkJd3JhcCA9IGluZGV4ID0gMDsKKworCQlkbyB7CisJCQkvKgorCQkJ ICogSWYgd2UgZmluZCBhIHNsb3QgdGhhdCBpbmRpY2F0ZXMgd2UgaGF2ZSAnbnNsb3RzJworCQkJ ICogbnVtYmVyIG9mIGNvbnRpZ3VvdXMgYnVmZmVycywgd2UgYWxsb2NhdGUgdGhlCisJCQkgKiBi dWZmZXJzIGZyb20gdGhhdCBzbG90IGFuZCBtYXJrIHRoZSBlbnRyaWVzIGFzICcwJworCQkJICog aW5kaWNhdGluZyB1bmF2YWlsYWJsZS4KKwkJCSAqLworCQkJaWYgKGlvX3RsYl9saXN0W2luZGV4 XSA+PSBuc2xvdHMpIHsKKwkJCQlpbnQgY291bnQgPSAwOworCisJCQkJZm9yIChpID0gaW5kZXg7 IGkgPCAoaW50KSAoaW5kZXggKyBuc2xvdHMpOyBpKyspCisJCQkJCWlvX3RsYl9saXN0W2ldID0g MDsKKwkJCQlmb3IgKGkgPSBpbmRleCAtIDE7IChPRkZTRVQoaSwgSU9fVExCX1NFR1NJWkUpICE9 IElPX1RMQl9TRUdTSVpFIC0xKSAmJiBpb190bGJfbGlzdFtpXTsgaS0tKQorCQkJCQlpb190bGJf bGlzdFtpXSA9ICsrY291bnQ7CisJCQkJZG1hX2FkZHIgPSBpb190bGJfc3RhcnQgKyAoaW5kZXgg PDwgSU9fVExCX1NISUZUKTsKKworCQkJCS8qCisJCQkJICogVXBkYXRlIHRoZSBpbmRpY2VzIHRv IGF2b2lkIHNlYXJjaGluZyBpbgorCQkJCSAqIHRoZSBuZXh0IHJvdW5kLgorCQkJCSAqLworCQkJ CWlvX3RsYl9pbmRleCA9ICgoaW5kZXggKyBuc2xvdHMpIDwgaW9fdGxiX25zbGFicworCQkJCQkJ PyAoaW5kZXggKyBuc2xvdHMpIDogMCk7CisKKwkJCQlnb3RvIGZvdW5kOworCQkJfQorCQkJaW5k ZXggKz0gc3RyaWRlOworCQkJaWYgKGluZGV4ID49IGlvX3RsYl9uc2xhYnMpCisJCQkJaW5kZXgg PSAwOworCQl9IHdoaWxlIChpbmRleCAhPSB3cmFwKTsKKworCQlzcGluX3VubG9ja19pcnFyZXN0 b3JlKCZpb190bGJfbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gTlVMTDsKKwl9CisgIGZvdW5kOgor CXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvX3RsYl9sb2NrLCBmbGFncyk7CisKKwkvKgorCSAq IFNhdmUgYXdheSB0aGUgbWFwcGluZyBmcm9tIHRoZSBvcmlnaW5hbCBhZGRyZXNzIHRvIHRoZSBE TUEgYWRkcmVzcy4KKwkgKiBUaGlzIGlzIG5lZWRlZCB3aGVuIHdlIHN5bmMgdGhlIG1lbW9yeS4g IFRoZW4gd2Ugc3luYyB0aGUgYnVmZmVyIGlmCisJICogbmVlZGVkLgorCSAqLworCWlvX3RsYl9v cmlnX2FkZHJbaW5kZXhdID0gYnVmZmVyOworCWlmIChkaXIgPT0gRE1BX1RPX0RFVklDRSB8fCBk aXIgPT0gRE1BX0JJRElSRUNUSU9OQUwpCisJCW1lbWNweShkbWFfYWRkciwgYnVmZmVyLCBzaXpl KTsKKworCXJldHVybiBkbWFfYWRkcjsKK30KKworLyoKKyAqIGRtYV9hZGRyIGlzIHRoZSBrZXJu ZWwgdmlydHVhbCBhZGRyZXNzIG9mIHRoZSBib3VuY2UgYnVmZmVyIHRvIHVubWFwLgorICovCitz dGF0aWMgdm9pZAordW5tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCBjaGFyICpkbWFf YWRkciwgc2l6ZV90IHNpemUsIGludCBkaXIpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlp bnQgaSwgY291bnQsIG5zbG90cyA9IEFMSUdOKHNpemUsIDEgPDwgSU9fVExCX1NISUZUKSA+PiBJ T19UTEJfU0hJRlQ7CisJaW50IGluZGV4ID0gKGRtYV9hZGRyIC0gaW9fdGxiX3N0YXJ0KSA+PiBJ T19UTEJfU0hJRlQ7CisJY2hhciAqYnVmZmVyID0gaW9fdGxiX29yaWdfYWRkcltpbmRleF07CisK KwkvKgorCSAqIEZpcnN0LCBzeW5jIHRoZSBtZW1vcnkgYmVmb3JlIHVubWFwcGluZyB0aGUgZW50 cnkKKwkgKi8KKwlpZiAoYnVmZmVyICYmICgoZGlyID09IERNQV9GUk9NX0RFVklDRSkgfHwgKGRp ciA9PSBETUFfQklESVJFQ1RJT05BTCkpKQorCQkvKgorCQkgKiBib3VuY2UuLi4gY29weSB0aGUg ZGF0YSBiYWNrIGludG8gdGhlIG9yaWdpbmFsIGJ1ZmZlciAqIGFuZAorCQkgKiBkZWxldGUgdGhl IGJvdW5jZSBidWZmZXIuCisJCSAqLworCQltZW1jcHkoYnVmZmVyLCBkbWFfYWRkciwgc2l6ZSk7 CisKKwkvKgorCSAqIFJldHVybiB0aGUgYnVmZmVyIHRvIHRoZSBmcmVlIGxpc3QgYnkgc2V0dGlu ZyB0aGUgY29ycmVzcG9uZGluZworCSAqIGVudHJpZXMgdG8gaW5kaWNhdGUgdGhlIG51bWJlciBv ZiBjb250aWdvdXMgZW50cmllcyBhdmFpbGFibGUuCisJICogV2hpbGUgcmV0dXJuaW5nIHRoZSBl bnRyaWVzIHRvIHRoZSBmcmVlIGxpc3QsIHdlIG1lcmdlIHRoZSBlbnRyaWVzCisJICogd2l0aCBz bG90cyBiZWxvdyBhbmQgYWJvdmUgdGhlIHBvb2wgYmVpbmcgcmV0dXJuZWQuCisJICovCisJc3Bp bl9sb2NrX2lycXNhdmUoJmlvX3RsYl9sb2NrLCBmbGFncyk7CisJeworCQljb3VudCA9ICgoaW5k ZXggKyBuc2xvdHMpIDwgQUxJR04oaW5kZXggKyAxLCBJT19UTEJfU0VHU0laRSkgPworCQkJIGlv X3RsYl9saXN0W2luZGV4ICsgbnNsb3RzXSA6IDApOworCQkvKgorCQkgKiBTdGVwIDE6IHJldHVy biB0aGUgc2xvdHMgdG8gdGhlIGZyZWUgbGlzdCwgbWVyZ2luZyB0aGUKKwkJICogc2xvdHMgd2l0 aCBzdXBlcmNlZWRpbmcgc2xvdHMKKwkJICovCisJCWZvciAoaSA9IGluZGV4ICsgbnNsb3RzIC0g MTsgaSA+PSBpbmRleDsgaS0tKQorCQkJaW9fdGxiX2xpc3RbaV0gPSArK2NvdW50OworCQkvKgor CQkgKiBTdGVwIDI6IG1lcmdlIHRoZSByZXR1cm5lZCBzbG90cyB3aXRoIHRoZSBwcmVjZWRpbmcg c2xvdHMsCisJCSAqIGlmIGF2YWlsYWJsZSAobm9uIHplcm8pCisJCSAqLworCQlmb3IgKGkgPSBp bmRleCAtIDE7IChPRkZTRVQoaSwgSU9fVExCX1NFR1NJWkUpICE9IElPX1RMQl9TRUdTSVpFIC0x KSAmJiBpb190bGJfbGlzdFtpXTsgaS0tKQorCQkJaW9fdGxiX2xpc3RbaV0gPSArK2NvdW50Owor CX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb190bGJfbG9jaywgZmxhZ3MpOworfQorCitz dGF0aWMgdm9pZAorc3luY19zaW5nbGUoc3RydWN0IGRldmljZSAqaHdkZXYsIGNoYXIgKmRtYV9h ZGRyLCBzaXplX3Qgc2l6ZSwKKwkgICAgaW50IGRpciwgaW50IHRhcmdldCkKK3sKKwlpbnQgaW5k ZXggPSAoZG1hX2FkZHIgLSBpb190bGJfc3RhcnQpID4+IElPX1RMQl9TSElGVDsKKwljaGFyICpi dWZmZXIgPSBpb190bGJfb3JpZ19hZGRyW2luZGV4XTsKKworCXN3aXRjaCAodGFyZ2V0KSB7CisJ Y2FzZSBTWU5DX0ZPUl9DUFU6CisJCWlmIChsaWtlbHkoZGlyID09IERNQV9GUk9NX0RFVklDRSB8 fCBkaXIgPT0gRE1BX0JJRElSRUNUSU9OQUwpKQorCQkJbWVtY3B5KGJ1ZmZlciwgZG1hX2FkZHIs IHNpemUpOworCQllbHNlCisJCQlCVUdfT04oZGlyICE9IERNQV9UT19ERVZJQ0UpOworCQlicmVh azsKKwljYXNlIFNZTkNfRk9SX0RFVklDRToKKwkJaWYgKGxpa2VseShkaXIgPT0gRE1BX1RPX0RF VklDRSB8fCBkaXIgPT0gRE1BX0JJRElSRUNUSU9OQUwpKQorCQkJbWVtY3B5KGRtYV9hZGRyLCBi dWZmZXIsIHNpemUpOworCQllbHNlCisJCQlCVUdfT04oZGlyICE9IERNQV9GUk9NX0RFVklDRSk7 CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCX0KK30KKwordm9pZCAqCitzd2lvdGxi X2FsbG9jX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCBzaXplX3Qgc2l6ZSwKKwkJICAg ICAgIGRtYV9hZGRyX3QgKmRtYV9oYW5kbGUsIGdmcF90IGZsYWdzKQoreworCXVuc2lnbmVkIGxv bmcgZGV2X2FkZHI7CisJdm9pZCAqcmV0OworCWludCBvcmRlciA9IGdldF9vcmRlcihzaXplKTsK KworCS8qCisJICogWFhYIGZpeCBtZTogdGhlIERNQSBBUEkgc2hvdWxkIHBhc3MgdXMgYW4gZXhw bGljaXQgRE1BIG1hc2sKKwkgKiBpbnN0ZWFkLCBvciB1c2UgWk9ORV9ETUEzMiAoaWE2NCBvdmVy bG9hZHMgWk9ORV9ETUEgdG8gYmUgYSB+MzIKKwkgKiBiaXQgcmFuZ2UgaW5zdGVhZCBvZiBhIDE2 TUIgb25lKS4KKwkgKi8KKwlmbGFncyB8PSBHRlBfRE1BOworCisJcmV0ID0gKHZvaWQgKilfX2dl dF9mcmVlX3BhZ2VzKGZsYWdzLCBvcmRlcik7CisJaWYgKHJldCAmJiBhZGRyZXNzX25lZWRzX21h cHBpbmcoaHdkZXYsIHZpcnRfdG9fYnVzKHJldCkpKSB7CisJCS8qCisJCSAqIFRoZSBhbGxvY2F0 ZWQgbWVtb3J5IGlzbid0IHJlYWNoYWJsZSBieSB0aGUgZGV2aWNlLgorCQkgKiBGYWxsIGJhY2sg b24gc3dpb3RsYl9tYXBfc2luZ2xlKCkuCisJCSAqLworCQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBs b25nKSByZXQsIG9yZGVyKTsKKwkJcmV0ID0gTlVMTDsKKwl9CisJaWYgKCFyZXQpIHsKKwkJLyoK KwkJICogV2UgYXJlIGVpdGhlciBvdXQgb2YgbWVtb3J5IG9yIHRoZSBkZXZpY2UgY2FuJ3QgRE1B CisJCSAqIHRvIEdGUF9ETUEgbWVtb3J5OyBmYWxsIGJhY2sgb24KKwkJICogc3dpb3RsYl9tYXBf c2luZ2xlKCksIHdoaWNoIHdpbGwgZ3JhYiBtZW1vcnkgZnJvbQorCQkgKiB0aGUgbG93ZXN0IGF2 YWlsYWJsZSBhZGRyZXNzIHJhbmdlLgorCQkgKi8KKwkJZG1hX2FkZHJfdCBoYW5kbGU7CisJCWhh bmRsZSA9IHN3aW90bGJfbWFwX3NpbmdsZShOVUxMLCBOVUxMLCBzaXplLCBETUFfRlJPTV9ERVZJ Q0UpOworCQlpZiAoc3dpb3RsYl9kbWFfbWFwcGluZ19lcnJvcihoYW5kbGUpKQorCQkJcmV0dXJu IE5VTEw7CisKKwkJcmV0ID0gYnVzX3RvX3ZpcnQoaGFuZGxlKTsKKwl9CisKKwltZW1zZXQocmV0 LCAwLCBzaXplKTsKKwlkZXZfYWRkciA9IHZpcnRfdG9fYnVzKHJldCk7CisKKwkvKiBDb25maXJt IGFkZHJlc3MgY2FuIGJlIERNQSdkIGJ5IGRldmljZSAqLworCWlmIChhZGRyZXNzX25lZWRzX21h cHBpbmcoaHdkZXYsIGRldl9hZGRyKSkgeworCQlwcmludGsoImh3ZGV2IERNQSBtYXNrID0gMHgl MDE2THgsIGRldl9hZGRyID0gMHglMDE2bHhcbiIsCisJCSAgICAgICAodW5zaWduZWQgbG9uZyBs b25nKSpod2Rldi0+ZG1hX21hc2ssIGRldl9hZGRyKTsKKwkJcGFuaWMoInN3aW90bGJfYWxsb2Nf Y29oZXJlbnQ6IGFsbG9jYXRlZCBtZW1vcnkgaXMgb3V0IG9mICIKKwkJICAgICAgInJhbmdlIGZv ciBkZXZpY2UiKTsKKwl9CisJKmRtYV9oYW5kbGUgPSBkZXZfYWRkcjsKKwlyZXR1cm4gcmV0Owor fQorCit2b2lkCitzd2lvdGxiX2ZyZWVfY29oZXJlbnQoc3RydWN0IGRldmljZSAqaHdkZXYsIHNp emVfdCBzaXplLCB2b2lkICp2YWRkciwKKwkJICAgICAgZG1hX2FkZHJfdCBkbWFfaGFuZGxlKQor eworCWlmICghKHZhZGRyID49ICh2b2lkICopaW9fdGxiX3N0YXJ0CisgICAgICAgICAgICAgICAg ICAgICYmIHZhZGRyIDwgKHZvaWQgKilpb190bGJfZW5kKSkKKwkJZnJlZV9wYWdlcygodW5zaWdu ZWQgbG9uZykgdmFkZHIsIGdldF9vcmRlcihzaXplKSk7CisJZWxzZQorCQkvKiBETUFfVE9fREVW SUNFIHRvIGF2b2lkIG1lbWNweSBpbiB1bm1hcF9zaW5nbGUgKi8KKwkJc3dpb3RsYl91bm1hcF9z aW5nbGUgKGh3ZGV2LCBkbWFfaGFuZGxlLCBzaXplLCBETUFfVE9fREVWSUNFKTsKK30KKworc3Rh dGljIHZvaWQKK3N3aW90bGJfZnVsbChzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLCBp bnQgZGlyLCBpbnQgZG9fcGFuaWMpCit7CisJLyoKKwkgKiBSYW4gb3V0IG9mIElPTU1VIHNwYWNl IGZvciB0aGlzIG9wZXJhdGlvbi4gVGhpcyBpcyB2ZXJ5IGJhZC4KKwkgKiBVbmZvcnR1bmF0ZWx5 IHRoZSBkcml2ZXJzIGNhbm5vdCBoYW5kbGUgdGhpcyBvcGVyYXRpb24gcHJvcGVybHkuCisJICog dW5sZXNzIHRoZXkgY2hlY2sgZm9yIGRtYV9tYXBwaW5nX2Vycm9yIChtb3N0IGRvbid0KQorCSAq IFdoZW4gdGhlIG1hcHBpbmcgaXMgc21hbGwgZW5vdWdoIHJldHVybiBhIHN0YXRpYyBidWZmZXIg dG8gbGltaXQKKwkgKiB0aGUgZGFtYWdlLCBvciBwYW5pYyB3aGVuIHRoZSB0cmFuc2ZlciBpcyB0 b28gYmlnLgorCSAqLworCXByaW50ayhLRVJOX0VSUiAiRE1BOiBPdXQgb2YgU1ctSU9NTVUgc3Bh Y2UgZm9yICVsdSBieXRlcyBhdCAiCisJICAgICAgICJkZXZpY2UgJXNcbiIsIHNpemUsIGRldiA/ IGRldi0+YnVzX2lkIDogIj8iKTsKKworCWlmIChzaXplID4gaW9fdGxiX292ZXJmbG93ICYmIGRv X3BhbmljKSB7CisJCWlmIChkaXIgPT0gRE1BX0ZST01fREVWSUNFIHx8IGRpciA9PSBETUFfQklE SVJFQ1RJT05BTCkKKwkJCXBhbmljKCJETUE6IE1lbW9yeSB3b3VsZCBiZSBjb3JydXB0ZWRcbiIp OworCQlpZiAoZGlyID09IERNQV9UT19ERVZJQ0UgfHwgZGlyID09IERNQV9CSURJUkVDVElPTkFM KQorCQkJcGFuaWMoIkRNQTogUmFuZG9tIG1lbW9yeSB3b3VsZCBiZSBETUFlZFxuIik7CisJfQor fQorCisvKgorICogTWFwIGEgc2luZ2xlIGJ1ZmZlciBvZiB0aGUgaW5kaWNhdGVkIHNpemUgZm9y IERNQSBpbiBzdHJlYW1pbmcgbW9kZS4gIFRoZQorICogcGh5c2ljYWwgYWRkcmVzcyB0byB1c2Ug aXMgcmV0dXJuZWQuCisgKgorICogT25jZSB0aGUgZGV2aWNlIGlzIGdpdmVuIHRoZSBkbWEgYWRk cmVzcywgdGhlIGRldmljZSBvd25zIHRoaXMgbWVtb3J5IHVudGlsCisgKiBlaXRoZXIgc3dpb3Rs Yl91bm1hcF9zaW5nbGUgb3Igc3dpb3RsYl9kbWFfc3luY19zaW5nbGUgaXMgcGVyZm9ybWVkLgor ICovCitkbWFfYWRkcl90Citzd2lvdGxiX21hcF9zaW5nbGUoc3RydWN0IGRldmljZSAqaHdkZXYs IHZvaWQgKnB0ciwgc2l6ZV90IHNpemUsIGludCBkaXIpCit7CisJdW5zaWduZWQgbG9uZyBkZXZf YWRkciA9IHZpcnRfdG9fYnVzKHB0cik7CisJdm9pZCAqbWFwOworCisJQlVHX09OKGRpciA9PSBE TUFfTk9ORSk7CisJLyoKKwkgKiBJZiB0aGUgcG9pbnRlciBwYXNzZWQgaW4gaGFwcGVucyB0byBi ZSBpbiB0aGUgZGV2aWNlJ3MgRE1BIHdpbmRvdywKKwkgKiB3ZSBjYW4gc2FmZWx5IHJldHVybiB0 aGUgZGV2aWNlIGFkZHIgYW5kIG5vdCB3b3JyeSBhYm91dCBib3VuY2UKKwkgKiBidWZmZXJpbmcg aXQuCisJICovCisJaWYgKCFhZGRyZXNzX25lZWRzX21hcHBpbmcoaHdkZXYsIGRldl9hZGRyKSAm JiAhc3dpb3RsYl9mb3JjZSkKKwkJcmV0dXJuIGRldl9hZGRyOworCisJLyoKKwkgKiBPaCB3ZWxs LCBoYXZlIHRvIGFsbG9jYXRlIGFuZCBtYXAgYSBib3VuY2UgYnVmZmVyLgorCSAqLworCW1hcCA9 IG1hcF9zaW5nbGUoaHdkZXYsIHB0ciwgc2l6ZSwgZGlyKTsKKwlpZiAoIW1hcCkgeworCQlzd2lv dGxiX2Z1bGwoaHdkZXYsIHNpemUsIGRpciwgMSk7CisJCW1hcCA9IGlvX3RsYl9vdmVyZmxvd19i dWZmZXI7CisJfQorCisJZGV2X2FkZHIgPSB2aXJ0X3RvX2J1cyhtYXApOworCisJLyoKKwkgKiBF bnN1cmUgdGhhdCB0aGUgYWRkcmVzcyByZXR1cm5lZCBpcyBETUEnYmxlCisJICovCisJaWYgKGFk ZHJlc3NfbmVlZHNfbWFwcGluZyhod2RldiwgZGV2X2FkZHIpKQorCQlwYW5pYygibWFwX3Npbmds ZTogYm91bmNlIGJ1ZmZlciBpcyBub3QgRE1BJ2JsZSIpOworCisJcmV0dXJuIGRldl9hZGRyOwor fQorCisvKgorICogU2luY2UgRE1BIGlzIGktY2FjaGUgY29oZXJlbnQsIGFueSAoY29tcGxldGUp IHBhZ2VzIHRoYXQgd2VyZSB3cml0dGVuIHZpYQorICogRE1BIGNhbiBiZSBtYXJrZWQgYXMgImNs ZWFuIiBzbyB0aGF0IGxhenlfbW11X3Byb3RfdXBkYXRlKCkgZG9lc24ndCBoYXZlIHRvCisgKiBm bHVzaCB0aGVtIHdoZW4gdGhleSBnZXQgbWFwcGVkIGludG8gYW4gZXhlY3V0YWJsZSB2bS1hcmVh LgorICovCitzdGF0aWMgdm9pZAorbWFya19jbGVhbih2b2lkICphZGRyLCBzaXplX3Qgc2l6ZSkK K3sKKwl1bnNpZ25lZCBsb25nIHBnX2FkZHIsIGVuZDsKKworCXBnX2FkZHIgPSBQQUdFX0FMSUdO KCh1bnNpZ25lZCBsb25nKSBhZGRyKTsKKwllbmQgPSAodW5zaWduZWQgbG9uZykgYWRkciArIHNp emU7CisJd2hpbGUgKHBnX2FkZHIgKyBQQUdFX1NJWkUgPD0gZW5kKSB7CisJCXN0cnVjdCBwYWdl ICpwYWdlID0gdmlydF90b19wYWdlKHBnX2FkZHIpOworCQlzZXRfYml0KFBHX2FyY2hfMSwgJnBh Z2UtPmZsYWdzKTsKKwkJcGdfYWRkciArPSBQQUdFX1NJWkU7CisJfQorfQorCisvKgorICogVW5t YXAgYSBzaW5nbGUgc3RyZWFtaW5nIG1vZGUgRE1BIHRyYW5zbGF0aW9uLiAgVGhlIGRtYV9hZGRy IGFuZCBzaXplIG11c3QKKyAqIG1hdGNoIHdoYXQgd2FzIHByb3ZpZGVkIGZvciBpbiBhIHByZXZp b3VzIHN3aW90bGJfbWFwX3NpbmdsZSBjYWxsLiAgQWxsCisgKiBvdGhlciB1c2FnZXMgYXJlIHVu ZGVmaW5lZC4KKyAqCisgKiBBZnRlciB0aGlzIGNhbGwsIHJlYWRzIGJ5IHRoZSBjcHUgdG8gdGhl IGJ1ZmZlciBhcmUgZ3VhcmFudGVlZCB0byBzZWUKKyAqIHdoYXRldmVyIHRoZSBkZXZpY2Ugd3Jv dGUgdGhlcmUuCisgKi8KK3ZvaWQKK3N3aW90bGJfdW5tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2Ug Kmh3ZGV2LCBkbWFfYWRkcl90IGRldl9hZGRyLCBzaXplX3Qgc2l6ZSwKKwkJICAgICBpbnQgZGly KQoreworCWNoYXIgKmRtYV9hZGRyID0gYnVzX3RvX3ZpcnQoZGV2X2FkZHIpOworCisJQlVHX09O KGRpciA9PSBETUFfTk9ORSk7CisJaWYgKGRtYV9hZGRyID49IGlvX3RsYl9zdGFydCAmJiBkbWFf YWRkciA8IGlvX3RsYl9lbmQpCisJCXVubWFwX3NpbmdsZShod2RldiwgZG1hX2FkZHIsIHNpemUs IGRpcik7CisJZWxzZSBpZiAoZGlyID09IERNQV9GUk9NX0RFVklDRSkKKwkJbWFya19jbGVhbihk bWFfYWRkciwgc2l6ZSk7Cit9CisKKy8qCisgKiBNYWtlIHBoeXNpY2FsIG1lbW9yeSBjb25zaXN0 ZW50IGZvciBhIHNpbmdsZSBzdHJlYW1pbmcgbW9kZSBETUEgdHJhbnNsYXRpb24KKyAqIGFmdGVy IGEgdHJhbnNmZXIuCisgKgorICogSWYgeW91IHBlcmZvcm0gYSBzd2lvdGxiX21hcF9zaW5nbGUo KSBidXQgd2lzaCB0byBpbnRlcnJvZ2F0ZSB0aGUgYnVmZmVyCisgKiB1c2luZyB0aGUgY3B1LCB5 ZXQgZG8gbm90IHdpc2ggdG8gdGVhcmRvd24gdGhlIGRtYSBtYXBwaW5nLCB5b3UgbXVzdAorICog Y2FsbCB0aGlzIGZ1bmN0aW9uIGJlZm9yZSBkb2luZyBzby4gIEF0IHRoZSBuZXh0IHBvaW50IHlv dSBnaXZlIHRoZSBkbWEKKyAqIGFkZHJlc3MgYmFjayB0byB0aGUgY2FyZCwgeW91IG11c3QgZmly c3QgcGVyZm9ybSBhCisgKiBzd2lvdGxiX2RtYV9zeW5jX2Zvcl9kZXZpY2UsIGFuZCB0aGVuIHRo ZSBkZXZpY2UgYWdhaW4gb3ducyB0aGUgYnVmZmVyCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAor c3dpb3RsYl9zeW5jX3NpbmdsZShzdHJ1Y3QgZGV2aWNlICpod2RldiwgZG1hX2FkZHJfdCBkZXZf YWRkciwKKwkJICAgIHNpemVfdCBzaXplLCBpbnQgZGlyLCBpbnQgdGFyZ2V0KQoreworCWNoYXIg KmRtYV9hZGRyID0gYnVzX3RvX3ZpcnQoZGV2X2FkZHIpOworCisJQlVHX09OKGRpciA9PSBETUFf Tk9ORSk7CisJaWYgKGRtYV9hZGRyID49IGlvX3RsYl9zdGFydCAmJiBkbWFfYWRkciA8IGlvX3Rs Yl9lbmQpCisJCXN5bmNfc2luZ2xlKGh3ZGV2LCBkbWFfYWRkciwgc2l6ZSwgZGlyLCB0YXJnZXQp OworCWVsc2UgaWYgKGRpciA9PSBETUFfRlJPTV9ERVZJQ0UpCisJCW1hcmtfY2xlYW4oZG1hX2Fk ZHIsIHNpemUpOworfQorCit2b2lkCitzd2lvdGxiX3N5bmNfc2luZ2xlX2Zvcl9jcHUoc3RydWN0 IGRldmljZSAqaHdkZXYsIGRtYV9hZGRyX3QgZGV2X2FkZHIsCisJCQkgICAgc2l6ZV90IHNpemUs IGludCBkaXIpCit7CisJc3dpb3RsYl9zeW5jX3NpbmdsZShod2RldiwgZGV2X2FkZHIsIHNpemUs IGRpciwgU1lOQ19GT1JfQ1BVKTsKK30KKwordm9pZAorc3dpb3RsYl9zeW5jX3NpbmdsZV9mb3Jf ZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCBkbWFfYWRkcl90IGRldl9hZGRyLAorCQkJICAg ICAgIHNpemVfdCBzaXplLCBpbnQgZGlyKQoreworCXN3aW90bGJfc3luY19zaW5nbGUoaHdkZXYs IGRldl9hZGRyLCBzaXplLCBkaXIsIFNZTkNfRk9SX0RFVklDRSk7Cit9CisKKy8qCisgKiBTYW1l IGFzIGFib3ZlLCBidXQgZm9yIGEgc3ViLXJhbmdlIG9mIHRoZSBtYXBwaW5nLgorICovCitzdGF0 aWMgaW5saW5lIHZvaWQKK3N3aW90bGJfc3luY19zaW5nbGVfcmFuZ2Uoc3RydWN0IGRldmljZSAq aHdkZXYsIGRtYV9hZGRyX3QgZGV2X2FkZHIsCisJCQkgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBz aXplX3Qgc2l6ZSwKKwkJCSAgaW50IGRpciwgaW50IHRhcmdldCkKK3sKKwljaGFyICpkbWFfYWRk ciA9IGJ1c190b192aXJ0KGRldl9hZGRyKSArIG9mZnNldDsKKworCUJVR19PTihkaXIgPT0gRE1B X05PTkUpOworCWlmIChkbWFfYWRkciA+PSBpb190bGJfc3RhcnQgJiYgZG1hX2FkZHIgPCBpb190 bGJfZW5kKQorCQlzeW5jX3NpbmdsZShod2RldiwgZG1hX2FkZHIsIHNpemUsIGRpciwgdGFyZ2V0 KTsKKwllbHNlIGlmIChkaXIgPT0gRE1BX0ZST01fREVWSUNFKQorCQltYXJrX2NsZWFuKGRtYV9h ZGRyLCBzaXplKTsKK30KKwordm9pZAorc3dpb3RsYl9zeW5jX3NpbmdsZV9yYW5nZV9mb3JfY3B1 KHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCBkbWFfYWRkcl90IGRldl9hZGRyLAorCQkJCSAgdW5zaWdu ZWQgbG9uZyBvZmZzZXQsIHNpemVfdCBzaXplLCBpbnQgZGlyKQoreworCXN3aW90bGJfc3luY19z aW5nbGVfcmFuZ2UoaHdkZXYsIGRldl9hZGRyLCBvZmZzZXQsIHNpemUsIGRpciwKKwkJCQkgIFNZ TkNfRk9SX0NQVSk7Cit9CisKK3ZvaWQKK3N3aW90bGJfc3luY19zaW5nbGVfcmFuZ2VfZm9yX2Rl dmljZShzdHJ1Y3QgZGV2aWNlICpod2RldiwgZG1hX2FkZHJfdCBkZXZfYWRkciwKKwkJCQkgICAg IHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgaW50IGRpcikKK3sKKwlzd2lvdGxi X3N5bmNfc2luZ2xlX3JhbmdlKGh3ZGV2LCBkZXZfYWRkciwgb2Zmc2V0LCBzaXplLCBkaXIsCisJ CQkJICBTWU5DX0ZPUl9ERVZJQ0UpOworfQorCisvKgorICogTWFwIGEgc2V0IG9mIGJ1ZmZlcnMg ZGVzY3JpYmVkIGJ5IHNjYXR0ZXJsaXN0IGluIHN0cmVhbWluZyBtb2RlIGZvciBETUEuCisgKiBU aGlzIGlzIHRoZSBzY2F0dGVyLWdhdGhlciB2ZXJzaW9uIG9mIHRoZSBhYm92ZSBzd2lvdGxiX21h cF9zaW5nbGUKKyAqIGludGVyZmFjZS4gIEhlcmUgdGhlIHNjYXR0ZXIgZ2F0aGVyIGxpc3QgZWxl bWVudHMgYXJlIGVhY2ggdGFnZ2VkIHdpdGggdGhlCisgKiBhcHByb3ByaWF0ZSBkbWEgYWRkcmVz cyBhbmQgbGVuZ3RoLiAgVGhleSBhcmUgb2J0YWluZWQgdmlhCisgKiBzZ19kbWFfe2FkZHJlc3Ms bGVuZ3RofShTRykuCisgKgorICogTk9URTogQW4gaW1wbGVtZW50YXRpb24gbWF5IGJlIGFibGUg dG8gdXNlIGEgc21hbGxlciBudW1iZXIgb2YKKyAqICAgICAgIERNQSBhZGRyZXNzL2xlbmd0aCBw YWlycyB0aGFuIHRoZXJlIGFyZSBTRyB0YWJsZSBlbGVtZW50cy4KKyAqICAgICAgIChmb3IgZXhh bXBsZSB2aWEgdmlydHVhbCBtYXBwaW5nIGNhcGFiaWxpdGllcykKKyAqICAgICAgIFRoZSByb3V0 aW5lIHJldHVybnMgdGhlIG51bWJlciBvZiBhZGRyL2xlbmd0aCBwYWlycyBhY3R1YWxseQorICog ICAgICAgdXNlZCwgYXQgbW9zdCBuZW50cy4KKyAqCisgKiBEZXZpY2Ugb3duZXJzaGlwIGlzc3Vl cyBhcyBtZW50aW9uZWQgYWJvdmUgZm9yIHN3aW90bGJfbWFwX3NpbmdsZSBhcmUgdGhlCisgKiBz YW1lIGhlcmUuCisgKi8KK2ludAorc3dpb3RsYl9tYXBfc2coc3RydWN0IGRldmljZSAqaHdkZXYs IHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBuZWxlbXMsCisJICAgICAgIGludCBkaXIpCit7 CisJdm9pZCAqYWRkcjsKKwl1bnNpZ25lZCBsb25nIGRldl9hZGRyOworCWludCBpOworCisJQlVH X09OKGRpciA9PSBETUFfTk9ORSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbmVsZW1zOyBpKyssIHNn KyspIHsKKwkJYWRkciA9IFNHX0VOVF9WSVJUX0FERFJFU1Moc2cpOworCQlkZXZfYWRkciA9IHZp cnRfdG9fYnVzKGFkZHIpOworCQlpZiAoc3dpb3RsYl9mb3JjZSB8fCBhZGRyZXNzX25lZWRzX21h cHBpbmcoaHdkZXYsIGRldl9hZGRyKSkgeworCQkJdm9pZCAqbWFwID0gbWFwX3NpbmdsZShod2Rl diwgYWRkciwgc2ctPmxlbmd0aCwgZGlyKTsKKwkJCXNnLT5kbWFfYWRkcmVzcyA9IHZpcnRfdG9f YnVzKG1hcCk7CisJCQlpZiAoIW1hcCkgeworCQkJCS8qIERvbid0IHBhbmljIGhlcmUsIHdlIGV4 cGVjdCBtYXBfc2cgdXNlcnMKKwkJCQkgICB0byBkbyBwcm9wZXIgZXJyb3IgaGFuZGxpbmcuICov CisJCQkJc3dpb3RsYl9mdWxsKGh3ZGV2LCBzZy0+bGVuZ3RoLCBkaXIsIDApOworCQkJCXN3aW90 bGJfdW5tYXBfc2coaHdkZXYsIHNnIC0gaSwgaSwgZGlyKTsKKwkJCQlzZ1swXS5kbWFfbGVuZ3Ro ID0gMDsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfSBlbHNlCisJCQlzZy0+ZG1hX2FkZHJlc3Mg PSBkZXZfYWRkcjsKKwkJc2ctPmRtYV9sZW5ndGggPSBzZy0+bGVuZ3RoOworCX0KKwlyZXR1cm4g bmVsZW1zOworfQorCisvKgorICogVW5tYXAgYSBzZXQgb2Ygc3RyZWFtaW5nIG1vZGUgRE1BIHRy YW5zbGF0aW9ucy4gIEFnYWluLCBjcHUgcmVhZCBydWxlcworICogY29uY2VybmluZyBjYWxscyBo ZXJlIGFyZSB0aGUgc2FtZSBhcyBmb3Igc3dpb3RsYl91bm1hcF9zaW5nbGUoKSBhYm92ZS4KKyAq Lwordm9pZAorc3dpb3RsYl91bm1hcF9zZyhzdHJ1Y3QgZGV2aWNlICpod2Rldiwgc3RydWN0IHNj YXR0ZXJsaXN0ICpzZywgaW50IG5lbGVtcywKKwkJIGludCBkaXIpCit7CisJaW50IGk7CisKKwlC VUdfT04oZGlyID09IERNQV9OT05FKTsKKworCWZvciAoaSA9IDA7IGkgPCBuZWxlbXM7IGkrKywg c2crKykKKwkJaWYgKHNnLT5kbWFfYWRkcmVzcyAhPSBTR19FTlRfUEhZU19BRERSRVNTKHNnKSkK KwkJCXVubWFwX3NpbmdsZShod2RldiwgKHZvaWQgKikgYnVzX3RvX3ZpcnQoc2ctPmRtYV9hZGRy ZXNzKSwgc2ctPmRtYV9sZW5ndGgsIGRpcik7CisJCWVsc2UgaWYgKGRpciA9PSBETUFfRlJPTV9E RVZJQ0UpCisJCQltYXJrX2NsZWFuKFNHX0VOVF9WSVJUX0FERFJFU1Moc2cpLCBzZy0+ZG1hX2xl bmd0aCk7Cit9CisKKy8qCisgKiBNYWtlIHBoeXNpY2FsIG1lbW9yeSBjb25zaXN0ZW50IGZvciBh IHNldCBvZiBzdHJlYW1pbmcgbW9kZSBETUEgdHJhbnNsYXRpb25zCisgKiBhZnRlciBhIHRyYW5z ZmVyLgorICoKKyAqIFRoZSBzYW1lIGFzIHN3aW90bGJfc3luY19zaW5nbGVfKiBidXQgZm9yIGEg c2NhdHRlci1nYXRoZXIgbGlzdCwgc2FtZSBydWxlcworICogYW5kIHVzYWdlLgorICovCitzdGF0 aWMgaW5saW5lIHZvaWQKK3N3aW90bGJfc3luY19zZyhzdHJ1Y3QgZGV2aWNlICpod2Rldiwgc3Ry dWN0IHNjYXR0ZXJsaXN0ICpzZywKKwkJaW50IG5lbGVtcywgaW50IGRpciwgaW50IHRhcmdldCkK K3sKKwlpbnQgaTsKKworCUJVR19PTihkaXIgPT0gRE1BX05PTkUpOworCisJZm9yIChpID0gMDsg aSA8IG5lbGVtczsgaSsrLCBzZysrKQorCQlpZiAoc2ctPmRtYV9hZGRyZXNzICE9IFNHX0VOVF9Q SFlTX0FERFJFU1Moc2cpKQorCQkJc3luY19zaW5nbGUoaHdkZXYsICh2b2lkICopIHNnLT5kbWFf YWRkcmVzcywKKwkJCQkgICAgc2ctPmRtYV9sZW5ndGgsIGRpciwgdGFyZ2V0KTsKK30KKwordm9p ZAorc3dpb3RsYl9zeW5jX3NnX2Zvcl9jcHUoc3RydWN0IGRldmljZSAqaHdkZXYsIHN0cnVjdCBz Y2F0dGVybGlzdCAqc2csCisJCQlpbnQgbmVsZW1zLCBpbnQgZGlyKQoreworCXN3aW90bGJfc3lu Y19zZyhod2Rldiwgc2csIG5lbGVtcywgZGlyLCBTWU5DX0ZPUl9DUFUpOworfQorCit2b2lkCitz d2lvdGxiX3N5bmNfc2dfZm9yX2RldmljZShzdHJ1Y3QgZGV2aWNlICpod2Rldiwgc3RydWN0IHNj YXR0ZXJsaXN0ICpzZywKKwkJCSAgIGludCBuZWxlbXMsIGludCBkaXIpCit7CisJc3dpb3RsYl9z eW5jX3NnKGh3ZGV2LCBzZywgbmVsZW1zLCBkaXIsIFNZTkNfRk9SX0RFVklDRSk7Cit9CisKK2lu dAorc3dpb3RsYl9kbWFfbWFwcGluZ19lcnJvcihkbWFfYWRkcl90IGRtYV9hZGRyKQoreworCXJl dHVybiAoZG1hX2FkZHIgPT0gdmlydF90b19idXMoaW9fdGxiX292ZXJmbG93X2J1ZmZlcikpOwor fQorCisvKgorICogUmV0dXJuIHdoZXRoZXIgdGhlIGdpdmVuIGRldmljZSBETUEgYWRkcmVzcyBt YXNrIGNhbiBiZSBzdXBwb3J0ZWQKKyAqIHByb3Blcmx5LiAgRm9yIGV4YW1wbGUsIGlmIHlvdXIg ZGV2aWNlIGNhbiBvbmx5IGRyaXZlIHRoZSBsb3cgMjQtYml0cworICogZHVyaW5nIGJ1cyBtYXN0 ZXJpbmcsIHRoZW4geW91IHdvdWxkIHBhc3MgMHgwMGZmZmZmZiBhcyB0aGUgbWFzayB0bworICog dGhpcyBmdW5jdGlvbi4KKyAqLworaW50Citzd2lvdGxiX2RtYV9zdXBwb3J0ZWQgKHN0cnVjdCBk ZXZpY2UgKmh3ZGV2LCB1NjQgbWFzaykKK3sKKwlyZXR1cm4gKHZpcnRfdG9fYnVzIChpb190bGJf ZW5kKSAtIDEpIDw9IG1hc2s7Cit9CisKK0VYUE9SVF9TWU1CT0woc3dpb3RsYl9pbml0KTsKK0VY UE9SVF9TWU1CT0woc3dpb3RsYl9tYXBfc2luZ2xlKTsKK0VYUE9SVF9TWU1CT0woc3dpb3RsYl91 bm1hcF9zaW5nbGUpOworRVhQT1JUX1NZTUJPTChzd2lvdGxiX21hcF9zZyk7CitFWFBPUlRfU1lN Qk9MKHN3aW90bGJfdW5tYXBfc2cpOworRVhQT1JUX1NZTUJPTChzd2lvdGxiX3N5bmNfc2luZ2xl X2Zvcl9jcHUpOworRVhQT1JUX1NZTUJPTChzd2lvdGxiX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2Up OworRVhQT1JUX1NZTUJPTF9HUEwoc3dpb3RsYl9zeW5jX3NpbmdsZV9yYW5nZV9mb3JfY3B1KTsK K0VYUE9SVF9TWU1CT0xfR1BMKHN3aW90bGJfc3luY19zaW5nbGVfcmFuZ2VfZm9yX2RldmljZSk7 CitFWFBPUlRfU1lNQk9MKHN3aW90bGJfc3luY19zZ19mb3JfY3B1KTsKK0VYUE9SVF9TWU1CT0wo c3dpb3RsYl9zeW5jX3NnX2Zvcl9kZXZpY2UpOworRVhQT1JUX1NZTUJPTChzd2lvdGxiX2RtYV9t YXBwaW5nX2Vycm9yKTsKK0VYUE9SVF9TWU1CT0woc3dpb3RsYl9hbGxvY19jb2hlcmVudCk7CitF WFBPUlRfU1lNQk9MKHN3aW90bGJfZnJlZV9jb2hlcmVudCk7CitFWFBPUlRfU1lNQk9MKHN3aW90 bGJfZG1hX3N1cHBvcnRlZCk7Cg== ------_=_NextPart_001_01C75615.BBB6B2A7 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel ------_=_NextPart_001_01C75615.BBB6B2A7--