From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Langsdorf, Mark" Subject: [PATCH] Enable K8 GART as an IOMMU Date: Mon, 12 Feb 2007 11:47:09 -0600 Message-ID: <1449F58C868D8D4E9C72945771150BDFD965D2@SAUSEXMB1.amd.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="----_=_NextPart_001_01C74ECD.D17A9093" Return-path: Content-class: urn:content-classes:message 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_01C74ECD.D17A9093 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: quoted-printable AMD Opteron and Athlon 64 processors have an AGP aperture and GART built into the processor. Linux has used the AGP GART as an IOMMU to improve the performance of 32-bit only PCI devices when DMA'ing into physical memory above 0xffffffff. This patch provides a similar capability=20 for Xen dom0. Most of the code simply migrates the native Linux aperture.c and pci-gart.c to dom0. A new memory op is added to clear the aperture mapping from the=20 hypervisor's page tables, which is necessary to prevent cache alias issues resulting from processor speculation. My thanks to Ulrich Meis [um@amd64.org], who was=20 instrumental in developing and testing this patch.=20 Signed-off-by: Mark Langsdorf ------_=_NextPart_001_01C74ECD.D17A9093 Content-Type: application/octet-stream; name=xen-gart.patch Content-Transfer-Encoding: base64 Content-Description: xen-gart.patch Content-Disposition: attachment; filename=xen-gart.patch IyBIRyBjaGFuZ2VzZXQgcGF0Y2gKIyBVc2VyIHJvb3RAaXdpbGxub3cuYW1kLmNvbQojIE5vZGUg SUQgNTAyODEwYjExYzc5NzJhYWJlYmQ4ZTg5OGU0NWY2MzE4OWE0OTNlNQojIFBhcmVudCAgZDM5 ZThjNDRkYTM0YWMyNTdiMjZjY2UyOTEyMjg1MmVmM2E5MzBjYwpBZGQgc3VwcG9ydCBmb3IgdGhl IE9wdGVyb24gQUdQIEdBUlQvYXBlcnR1cmUgYXMgYSBzaW1wbGlmaWVkIElPTU1VCgpkaWZmIC1y IGQzOWU4YzQ0ZGEzNCAtciA1MDI4MTBiMTFjNzkgbGludXgtMi42LXhlbi1zcGFyc2UvYXJjaC9p Mzg2L21tL2h5cGVydmlzb3IuYwotLS0gYS9saW51eC0yLjYteGVuLXNwYXJzZS9hcmNoL2kzODYv bW0vaHlwZXJ2aXNvci5jCUZyaSBGZWIgMDkgMTA6NDg6NDEgMjAwNyArMDAwMAorKysgYi9saW51 eC0yLjYteGVuLXNwYXJzZS9hcmNoL2kzODYvbW0vaHlwZXJ2aXNvci5jCUZyaSBGZWIgMDkgMTY6 MzI6MDQgMjAwNyAtMDYwMApAQCAtMjUyLDcgKzI1Miw3IEBAIHN0YXRpYyB2b2lkIGNvbnRpZ3Vv dXNfYml0bWFwX2NsZWFyKAogfQogCiAvKiBQcm90ZWN0ZWQgYnkgYmFsbG9vbl9sb2NrLiAqLwot I2RlZmluZSBNQVhfQ09OVElHX09SREVSIDkgLyogMk1CICovCisjZGVmaW5lIE1BWF9DT05USUdf T1JERVIgMTYgLyogMjU2TUIgKi8KIHN0YXRpYyB1bnNpZ25lZCBsb25nIGRpc2NvbnRpZ19mcmFt ZXNbMTw8TUFYX0NPTlRJR19PUkRFUl07CiBzdGF0aWMgbXVsdGljYWxsX2VudHJ5X3QgY3JfbWNs WzE8PE1BWF9DT05USUdfT1JERVJdOwogCmRpZmYgLXIgZDM5ZThjNDRkYTM0IC1yIDUwMjgxMGIx MWM3OSBsaW51eC0yLjYteGVuLXNwYXJzZS9hcmNoL3g4Nl82NC9LY29uZmlnCi0tLSBhL2xpbnV4 LTIuNi14ZW4tc3BhcnNlL2FyY2gveDg2XzY0L0tjb25maWcJRnJpIEZlYiAwOSAxMDo0ODo0MSAy MDA3ICswMDAwCisrKyBiL2xpbnV4LTIuNi14ZW4tc3BhcnNlL2FyY2gveDg2XzY0L0tjb25maWcJ RnJpIEZlYiAwOSAxNjozMjowNCAyMDA3IC0wNjAwCkBAIC00MzQsNyArNDM0LDcgQEAgY29uZmln IElPTU1VCiAJZGVmYXVsdCB5CiAJc2VsZWN0IFNXSU9UTEIKIAlzZWxlY3QgQUdQCi0JZGVwZW5k cyBvbiBQQ0kgJiYgIVg4Nl82NF9YRU4KKwlkZXBlbmRzIG9uIFBDSQogCWhlbHAKIAkgIFN1cHBv cnQgZm9yIGZ1bGwgRE1BIGFjY2VzcyBvZiBkZXZpY2VzIHdpdGggMzJiaXQgbWVtb3J5IGFjY2Vz cyBvbmx5CiAJICBvbiBzeXN0ZW1zIHdpdGggbW9yZSB0aGFuIDNHQi4gVGhpcyBpcyB1c3VhbGx5 IG5lZWRlZCBmb3IgVVNCLApkaWZmIC1yIGQzOWU4YzQ0ZGEzNCAtciA1MDI4MTBiMTFjNzkgbGlu dXgtMi42LXhlbi1zcGFyc2UvYXJjaC94ODZfNjQva2VybmVsL01ha2VmaWxlCi0tLSBhL2xpbnV4 LTIuNi14ZW4tc3BhcnNlL2FyY2gveDg2XzY0L2tlcm5lbC9NYWtlZmlsZQlGcmkgRmViIDA5IDEw OjQ4OjQxIDIwMDcgKzAwMDAKKysrIGIvbGludXgtMi42LXhlbi1zcGFyc2UvYXJjaC94ODZfNjQv a2VybmVsL01ha2VmaWxlCUZyaSBGZWIgMDkgMTY6MzI6MDQgMjAwNyAtMDYwMApAQCAtNTksNyAr NTksNyBAQCBhbHRlcm5hdGl2ZS15CQkJKz0gLi4vLi4vaTM4Ni9rZXJuZWwvYWx0CiAKIGlmZGVm IENPTkZJR19YRU4KIHRpbWUteQkJCQkrPSAuLi8uLi9pMzg2L2tlcm5lbC90aW1lLXhlbi5vCi1w Y2ktZG1hLXkJCQkrPSAuLi8uLi9pMzg2L2tlcm5lbC9wY2ktZG1hLXhlbi5vCitwY2ktZG1hLXkJ CQkrPSBwY2ktZG1hLXhlbi5vCiBtaWNyb2NvZGUtJChzdWJzdCBtLHksJChDT05GSUdfTUlDUk9D T0RFKSkgIDo9IC4uLy4uL2kzODYva2VybmVsL21pY3JvY29kZS14ZW4ubwogaW50ZWxfY2FjaGVp bmZvLXkJCTo9IC4uLy4uL2kzODYva2VybmVsL2NwdS9pbnRlbF9jYWNoZWluZm8teGVuLm8KIHF1 aXJrcy15CQkJOj0gLi4vLi4vaTM4Ni9rZXJuZWwvcXVpcmtzLXhlbi5vCmRpZmYgLXIgZDM5ZThj NDRkYTM0IC1yIDUwMjgxMGIxMWM3OSBsaW51eC0yLjYteGVuLXNwYXJzZS9hcmNoL3g4Nl82NC9r ZXJuZWwvZTgyMC14ZW4uYwotLS0gYS9saW51eC0yLjYteGVuLXNwYXJzZS9hcmNoL3g4Nl82NC9r ZXJuZWwvZTgyMC14ZW4uYwlGcmkgRmViIDA5IDEwOjQ4OjQxIDIwMDcgKzAwMDAKKysrIGIvbGlu dXgtMi42LXhlbi1zcGFyc2UvYXJjaC94ODZfNjQva2VybmVsL2U4MjAteGVuLmMJRnJpIEZlYiAw OSAxNjozMjowNCAyMDA3IC0wNjAwCkBAIC05Nyw3ICs5Nyw2IEBAIHN0YXRpYyBpbmxpbmUgaW50 IGJhZF9hZGRyKHVuc2lnbmVkIGxvbmcKIAlyZXR1cm4gMDsKIH0gCiAKLSNpZm5kZWYgQ09ORklH X1hFTgogLyoKICAqIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGlmIGFueSBwYXJ0IG9mIHRoZSByYW5n ZSA8c3RhcnQsZW5kPiBpcyBtYXBwZWQKICAqIHdpdGggdHlwZS4KQEAgLTExNiw3ICsxMTUsNiBA QCBlODIwX2FueV9tYXBwZWQodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zCiAJfSAKIAlyZXR1cm4g MDsKIH0KLSNlbmRpZgogCiAvKgogICogVGhpcyBmdW5jdGlvbiBjaGVja3MgaWYgdGhlIGVudGly ZSByYW5nZSA8c3RhcnQsZW5kPiBpcyBtYXBwZWQgd2l0aCB0eXBlLgpkaWZmIC1yIGQzOWU4YzQ0 ZGEzNCAtciA1MDI4MTBiMTFjNzkgbGludXgtMi42LXhlbi1zcGFyc2UvYXJjaC94ODZfNjQva2Vy bmVsL2lvX2FwaWMteGVuLmMKLS0tIGEvbGludXgtMi42LXhlbi1zcGFyc2UvYXJjaC94ODZfNjQv a2VybmVsL2lvX2FwaWMteGVuLmMJRnJpIEZlYiAwOSAxMDo0ODo0MSAyMDA3ICswMDAwCisrKyBi L2xpbnV4LTIuNi14ZW4tc3BhcnNlL2FyY2gveDg2XzY0L2tlcm5lbC9pb19hcGljLXhlbi5jCUZy aSBGZWIgMDkgMTY6MzI6MDQgMjAwNyAtMDYwMApAQCAtMzY5LDcgKzM2OSw3IEBAIHZvaWQgX19p bml0IGNoZWNrX2lvYXBpYyh2b2lkKQogCQkJCXN3aXRjaCAodmVuZG9yKSB7IAogCQkJCWNhc2Ug UENJX1ZFTkRPUl9JRF9WSUE6CiAjaWZkZWYgQ09ORklHX0lPTU1VCi0JCQkJCWlmICgoZW5kX3Bm biA+IE1BWF9ETUEzMl9QRk4gfHwKKwkJCQkJaWYgKChnbG9iYWxfbmVlZF9pb21tdSgpIHx8CiAJ CQkJCSAgICAgZm9yY2VfaW9tbXUpICYmCiAJCQkJCSAgICAhaW9tbXVfYXBlcnR1cmVfYWxsb3dl ZCkgewogCQkJCQkJcHJpbnRrKEtFUk5fSU5GTwpkaWZmIC1yIGQzOWU4YzQ0ZGEzNCAtciA1MDI4 MTBiMTFjNzkgbGludXgtMi42LXhlbi1zcGFyc2UvYXJjaC94ODZfNjQva2VybmVsL3BjaS1zd2lv dGxiLXhlbi5jCi0tLSBhL2xpbnV4LTIuNi14ZW4tc3BhcnNlL2FyY2gveDg2XzY0L2tlcm5lbC9w Y2ktc3dpb3RsYi14ZW4uYwlGcmkgRmViIDA5IDEwOjQ4OjQxIDIwMDcgKzAwMDAKKysrIGIvbGlu dXgtMi42LXhlbi1zcGFyc2UvYXJjaC94ODZfNjQva2VybmVsL3BjaS1zd2lvdGxiLXhlbi5jCUZy aSBGZWIgMDkgMTY6MzI6MDQgMjAwNyAtMDYwMApAQCAtOCwxMyArOCwxMCBAQAogI2luY2x1ZGUg PGFzbS9zd2lvdGxiLmg+CiAjaW5jbHVkZSA8YXNtL2RtYS5oPgogCi0jaWYgMAogaW50IHN3aW90 bGIgX19yZWFkX21vc3RseTsKIEVYUE9SVF9TWU1CT0woc3dpb3RsYik7Ci0jZW5kaWYKIAogc3Ry dWN0IGRtYV9tYXBwaW5nX29wcyBzd2lvdGxiX2RtYV9vcHMgPSB7Ci0jaWYgMAogCS5tYXBwaW5n X2Vycm9yID0gc3dpb3RsYl9kbWFfbWFwcGluZ19lcnJvciwKIAkuYWxsb2NfY29oZXJlbnQgPSBz d2lvdGxiX2FsbG9jX2NvaGVyZW50LAogCS5mcmVlX2NvaGVyZW50ID0gc3dpb3RsYl9mcmVlX2Nv aGVyZW50LApAQCAtMjksMTQgKzI2LDEyIEBAIHN0cnVjdCBkbWFfbWFwcGluZ19vcHMgc3dpb3Rs Yl9kbWFfb3BzID0KIAkubWFwX3NnID0gc3dpb3RsYl9tYXBfc2csCiAJLnVubWFwX3NnID0gc3dp b3RsYl91bm1hcF9zZywKIAkuZG1hX3N1cHBvcnRlZCA9IE5VTEwsCi0jZW5kaWYKIH07CiAKIHZv aWQgcGNpX3N3aW90bGJfaW5pdCh2b2lkKQogewotI2lmIDAKIAkvKiBkb24ndCBpbml0aWFsaXpl IHN3aW90bGIgaWYgaW9tbXU9b2ZmIChub19pb21tdT0xKSAqLwotCWlmICghaW9tbXVfZGV0ZWN0 ZWQgJiYgIW5vX2lvbW11ICYmIGVuZF9wZm4gPiBNQVhfRE1BMzJfUEZOKQorCWlmICghaW9tbXVf ZGV0ZWN0ZWQgJiYgIW5vX2lvbW11KQogCSAgICAgICBzd2lvdGxiID0gMTsKIAlpZiAoc3dpb3Rs Yl9mb3JjZSkKIAkJc3dpb3RsYiA9IDE7CkBAIC00NSwxMSArNDAsNCBAQCB2b2lkIHBjaV9zd2lv dGxiX2luaXQodm9pZCkKIAkJc3dpb3RsYl9pbml0KCk7CiAJCWRtYV9vcHMgPSAmc3dpb3RsYl9k bWFfb3BzOwogCX0KLSNlbHNlCi0Jc3dpb3RsYl9pbml0KCk7Ci0JaWYgKHN3aW90bGIpIHsKLQkJ cHJpbnRrKEtFUk5fSU5GTyAiUENJLURNQTogVXNpbmcgc29mdHdhcmUgYm91bmNlIGJ1ZmZlcmlu ZyBmb3IgSU8gKFNXSU9UTEIpXG4iKTsKLQkJZG1hX29wcyA9ICZzd2lvdGxiX2RtYV9vcHM7Ci0J fQotI2VuZGlmCiB9CmRpZmYgLXIgZDM5ZThjNDRkYTM0IC1yIDUwMjgxMGIxMWM3OSBsaW51eC0y LjYteGVuLXNwYXJzZS9hcmNoL3g4Nl82NC9tbS9pbml0LXhlbi5jCi0tLSBhL2xpbnV4LTIuNi14 ZW4tc3BhcnNlL2FyY2gveDg2XzY0L21tL2luaXQteGVuLmMJRnJpIEZlYiAwOSAxMDo0ODo0MSAy MDA3ICswMDAwCisrKyBiL2xpbnV4LTIuNi14ZW4tc3BhcnNlL2FyY2gveDg2XzY0L21tL2luaXQt eGVuLmMJRnJpIEZlYiAwOSAxNjozMjowNCAyMDA3IC0wNjAwCkBAIC04NDQsNiArODQ0LDcgQEAg dm9pZCBfX2luaXQgcGFnaW5nX2luaXQodm9pZCkKIH0KICNlbmRpZgogCisjaWZuZGVmIENPTkZJ R19YRU4KIC8qIFVubWFwIGEga2VybmVsIG1hcHBpbmcgaWYgaXQgZXhpc3RzLiBUaGlzIGlzIHVz ZWZ1bCB0byBhdm9pZCBwcmVmZXRjaGVzCiAgICBmcm9tIHRoZSBDUFUgbGVhZGluZyB0byBpbmNv bnNpc3RlbnQgY2FjaGUgbGluZXMuIGFkZHJlc3MgYW5kIHNpemUKICAgIG11c3QgYmUgYWxpZ25l ZCB0byAyTUIgYm91bmRhcmllcy4gCkBAIC04NzcsNiArODc4LDM5IEBAIHZvaWQgX19pbml0IGNs ZWFyX2tlcm5lbF9tYXBwaW5nKHVuc2lnbmUKIAl9CiAJX19mbHVzaF90bGJfYWxsKCk7CiB9IAor I2Vsc2UKKy8qIEluIFhlbiB0aGUgZGlyZWN0IG1hcHBpbmcgZG9lc24ndCB1c2Ugc3VwZXIgcGFn ZXMuICovCit2b2lkIF9faW5pdCBjbGVhcl9rZXJuZWxfbWFwcGluZyh1bnNpZ25lZCBsb25nIGFk ZHJlc3MsIHVuc2lnbmVkIGxvbmcgc2l6ZSkgCit7CisJdW5zaWduZWQgbG9uZyBlbmQgPSBhZGRy ZXNzICsgc2l6ZTsKKworCUJVR19PTihhZGRyZXNzICYgflBBR0VfTUFTSyk7CisJQlVHX09OKHNp emUgJiB+UEFHRV9NQVNLKTsgCisKKwlmb3IgKDsgYWRkcmVzcyA8IGVuZDsgYWRkcmVzcyArPSBQ QUdFX1NJWkUpIHsgCisJCXBnZF90ICpwZ2QgPSBwZ2Rfb2Zmc2V0X2soYWRkcmVzcyk7CisJCXB1 ZF90ICpwdWQ7CisJCXBtZF90ICpwbWQ7CisJCXB0ZV90ICpwdGU7CisKKwkJaWYgKHBnZF9ub25l KCpwZ2QpKQorCQkJY29udGludWU7CisJCXB1ZCA9IHB1ZF9vZmZzZXQocGdkLCBhZGRyZXNzKTsK KwkJaWYgKHB1ZF9ub25lKCpwdWQpKQorCQkJY29udGludWU7IAorCQlwbWQgPSBwbWRfb2Zmc2V0 KHB1ZCwgYWRkcmVzcyk7CisJCWlmICghcG1kIHx8IHBtZF9ub25lKCpwbWQpKQorCQkJY29udGlu dWU7IAorCQlwdGUgPSBwdGVfb2Zmc2V0X21hcChwbWQsIGFkZHJlc3MpOworCQlpZiAoIXB0ZSB8 fCBwdGVfbm9uZSgqcHRlKSkKKwkJCWNvbnRpbnVlOworCisJCXB0ZV9jbGVhcigmaW5pdF9tbSxh ZGRyZXNzLHB0ZSk7CisKKwl9CisJX19mbHVzaF90bGJfYWxsKCk7Cit9IAorI2VuZGlmCiAKIC8q CiAgKiBNZW1vcnkgaG90cGx1ZyBzcGVjaWZpYyBmdW5jdGlvbnMKZGlmZiAtciBkMzllOGM0NGRh MzQgLXIgNTAyODEwYjExYzc5IGxpbnV4LTIuNi14ZW4tc3BhcnNlL2luY2x1ZGUvYXNtLXg4Nl82 NC9tYWNoLXhlbi9hc20vZG1hLW1hcHBpbmcuaAotLS0gYS9saW51eC0yLjYteGVuLXNwYXJzZS9p bmNsdWRlL2FzbS14ODZfNjQvbWFjaC14ZW4vYXNtL2RtYS1tYXBwaW5nLmgJRnJpIEZlYiAwOSAx MDo0ODo0MSAyMDA3ICswMDAwCisrKyBiL2xpbnV4LTIuNi14ZW4tc3BhcnNlL2luY2x1ZGUvYXNt LXg4Nl82NC9tYWNoLXhlbi9hc20vZG1hLW1hcHBpbmcuaAlGcmkgRmViIDA5IDE2OjMyOjA0IDIw MDcgLTA2MDAKQEAgLTYyLDcgKzYyLDEyIEBAIHN0YXRpYyBpbmxpbmUgaW50IHZhbGlkX2RtYV9k aXJlY3Rpb24oaW4KIAkJKGRtYV9kaXJlY3Rpb24gPT0gRE1BX0ZST01fREVWSUNFKSk7CiB9CiAK LSNpZiAwCisjaWZkZWYgQ09ORklHX1hFTgorI2RlZmluZSBnbG9iYWxfbmVlZF9pb21tdSgpIDEK KyNlbHNlCisjZGVmaW5lIGdsb2JhbF9uZWVkX2lvbW11KCkgKEhZUEVSVklTT1JfbWVtb3J5X29w KFhFTk1FTV9tYXhpbXVtX3JhbV9wYWdlLCBOVUxMKT5NQVhfRE1BMzJfUEZOKQorI2VuZGlmCisK IHN0YXRpYyBpbmxpbmUgaW50IGRtYV9tYXBwaW5nX2Vycm9yKGRtYV9hZGRyX3QgZG1hX2FkZHIp CiB7CiAJaWYgKGRtYV9vcHMtPm1hcHBpbmdfZXJyb3IpCkBAIC0yMDAsOCArMjA1LDUgQEAgZG1h X2NhY2hlX3N5bmModm9pZCAqdmFkZHIsIHNpemVfdCBzaXplLAogCiBleHRlcm4gc3RydWN0IGRl dmljZSBmYWxsYmFja19kZXY7CiBleHRlcm4gaW50IHBhbmljX29uX292ZXJmbG93OwotI2VuZGlm CiAKICNlbmRpZiAvKiBfWDg2NjRfRE1BX01BUFBJTkdfSCAqLwotCi0jaW5jbHVkZSA8YXNtLWkz ODYvbWFjaC14ZW4vYXNtL2RtYS1tYXBwaW5nLmg+CmRpZmYgLXIgZDM5ZThjNDRkYTM0IC1yIDUw MjgxMGIxMWM3OSBsaW51eC0yLjYteGVuLXNwYXJzZS9saWIvTWFrZWZpbGUKLS0tIGEvbGludXgt Mi42LXhlbi1zcGFyc2UvbGliL01ha2VmaWxlCUZyaSBGZWIgMDkgMTA6NDg6NDEgMjAwNyArMDAw MAorKysgYi9saW51eC0yLjYteGVuLXNwYXJzZS9saWIvTWFrZWZpbGUJRnJpIEZlYiAwOSAxNjoz MjowNCAyMDA3IC0wNjAwCkBAIC01MSw4ICs1MSw3IEBAIG9iai0kKENPTkZJR19TTVApICs9IHBl cmNwdV9jb3VudGVyLm8KIG9iai0kKENPTkZJR19TTVApICs9IHBlcmNwdV9jb3VudGVyLm8KIG9i ai0kKENPTkZJR19BVURJVF9HRU5FUklDKSArPSBhdWRpdC5vCiAKLW9iai0kKENPTkZJR19TV0lP VExCKSArPSBzd2lvdGxiLm8KLXN3aW90bGItJChDT05GSUdfWEVOKSA6PSAuLi9hcmNoL2kzODYv a2VybmVsL3N3aW90bGIubworb2JqLSQoQ09ORklHX1NXSU9UTEIpICs9IHN3aW90bGIteGVuLm8K IAogaG9zdHByb2dzLXkJOj0gZ2VuX2NyYzMydGFibGUKIGNsZWFuLWZpbGVzCTo9IGNyYzMydGFi bGUuaApkaWZmIC1yIGQzOWU4YzQ0ZGEzNCAtciA1MDI4MTBiMTFjNzkgeGVuL2FyY2gveDg2L21t LmMKLS0tIGEveGVuL2FyY2gveDg2L21tLmMJRnJpIEZlYiAwOSAxMDo0ODo0MSAyMDA3ICswMDAw CisrKyBiL3hlbi9hcmNoL3g4Ni9tbS5jCUZyaSBGZWIgMDkgMTY6MzI6MDQgMjAwNyAtMDYwMApA QCAtMjA5NCw2ICsyMDk0LDEyIEBAIGludCBkb19tbXVleHRfb3AoCiAgICAgICAgICAgICAgICAg fQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CisKKwljYXNlIE1NVUVYVF9VTk1B UF9SRUdJT046CisgICAgICAgICAgICBtYXBfcGFnZXNfdG9feGVuKAorICAgICAgICAgICAgICAg IFBBR0VfT0ZGU0VUICsgKG9wLmFyZzEubWZuIDw8IFBBR0VfU0hJRlQpLAorICAgICAgICAgICAg ICAgIG9wLmFyZzEubWZuLCBvcC5hcmcyLm5yX2VudHMsIFBBR0VfSFlQRVJWSVNPUiAmIH5fUEFH RV9QUkVTRU5UKTsKKwkgICAgYnJlYWs7CiAjZW5kaWYKICAgICAgICAgCiAgICAgICAgIGNhc2Ug TU1VRVhUX1RMQl9GTFVTSF9MT0NBTDoKZGlmZiAtciBkMzllOGM0NGRhMzQgLXIgNTAyODEwYjEx Yzc5IHhlbi9pbmNsdWRlL3B1YmxpYy94ZW4uaAotLS0gYS94ZW4vaW5jbHVkZS9wdWJsaWMveGVu LmgJRnJpIEZlYiAwOSAxMDo0ODo0MSAyMDA3ICswMDAwCisrKyBiL3hlbi9pbmNsdWRlL3B1Ymxp Yy94ZW4uaAlGcmkgRmViIDA5IDE2OjMyOjA0IDIwMDcgLTA2MDAKQEAgLTE4OCw2ICsxODgsMTAg QEAKICAqIGNtZDogTU1VRVhUX05FV19VU0VSX0JBU0VQVFIgW3g4Ni82NCBvbmx5XQogICogbWZu OiBNYWNoaW5lIGZyYW1lIG51bWJlciBvZiBuZXcgcGFnZS10YWJsZSBiYXNlIHRvIGluc3RhbGwg aW4gTU1VCiAgKiAgICAgIHdoZW4gaW4gdXNlciBzcGFjZS4KKyAqCisgKiBjbWQ6IE1NVUVYVF9V Tk1BUF9SRUdJT04gW3g4Ni82NCBvbmx5XQorICogbWZuOiBGaXJzdCBtYWNoaW5lIGZyYW1lIG51 bWJlciB0byB1bm1hcCBmcm9tIHRoZSBoeXBlcnZpc29yJ3MgdmlydHVhbCBtZW1vcnkuCisgKiBu cl9lbnRzOiBOdW1iZXIgb2YgbWZucyB0byB1bm1hcC4KICAqIAogICogY21kOiBNTVVFWFRfVExC X0ZMVVNIX0xPQ0FMCiAgKiBObyBhZGRpdGlvbmFsIGFyZ3VtZW50cy4gRmx1c2hlcyBsb2NhbCBU TEIuCkBAIC0yMzAsNiArMjM0LDcgQEAKICNkZWZpbmUgTU1VRVhUX0ZMVVNIX0NBQ0hFICAgICAg MTIKICNkZWZpbmUgTU1VRVhUX1NFVF9MRFQgICAgICAgICAgMTMKICNkZWZpbmUgTU1VRVhUX05F V19VU0VSX0JBU0VQVFIgMTUKKyNkZWZpbmUgTU1VRVhUX1VOTUFQX1JFR0lPTiAgICAgMTYKIAog I2lmbmRlZiBfX0FTU0VNQkxZX18KIHN0cnVjdCBtbXVleHRfb3AgewpkaWZmIC1yIGQzOWU4YzQ0 ZGEzNCAtciA1MDI4MTBiMTFjNzkgbGludXgtMi42LXhlbi1zcGFyc2UvYXJjaC94ODZfNjQva2Vy bmVsL2FwZXJ0dXJlLXhlbi5jCi0tLSAvZGV2L251bGwJVGh1IEphbiAwMSAwMDowMDowMCAxOTcw ICswMDAwCisrKyBiL2xpbnV4LTIuNi14ZW4tc3BhcnNlL2FyY2gveDg2XzY0L2tlcm5lbC9hcGVy dHVyZS14ZW4uYwlGcmkgRmViIDA5IDE2OjMyOjA0IDIwMDcgLTA2MDAKQEAgLTAsMCArMSwyODQg QEAKKy8qIAorICogRmlybXdhcmUgcmVwbGFjZW1lbnQgY29kZS4KKyAqIAorICogV29yayBhcm91 bmQgYnJva2VuIEJJT1NlcyB0aGF0IGRvbid0IHNldCBhbiBhcGVydHVyZSBvciBvbmx5IHNldCB0 aGUKKyAqIGFwZXJ0dXJlIGluIHRoZSBBR1AgYnJpZGdlLiAKKyAqIElmIGFsbCBmYWlscyBtYXAg dGhlIGFwZXJ0dXJlIG92ZXIgc29tZSBsb3cgbWVtb3J5LiAgVGhpcyBpcyBjaGVhcGVyIHRoYW4g CisgKiBkb2luZyBib3VuY2UgYnVmZmVyaW5nLiBUaGUgbWVtb3J5IGlzIGxvc3QuIFRoaXMgaXMg ZG9uZSBhdCBlYXJseSBib290IAorICogYmVjYXVzZSBvbmx5IHRoZSBib290bWVtIGFsbG9jYXRv ciBjYW4gYWxsb2NhdGUgMzIrTUIuIAorICogCisgKiBDb3B5cmlnaHQgMjAwMiBBbmRpIEtsZWVu LCBTdVNFIExhYnMuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxs aW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9i b290bWVtLmg+CisjaW5jbHVkZSA8bGludXgvbW16b25lLmg+CisjaW5jbHVkZSA8bGludXgvcGNp X2lkcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5o PgorI2luY2x1ZGUgPGFzbS9lODIwLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8 YXNtL3Byb3RvLmg+CisjaW5jbHVkZSA8YXNtL3BjaS1kaXJlY3QuaD4KKyNpbmNsdWRlIDxhc20v ZG1hLmg+CisjaW5jbHVkZSA8YXNtL2s4Lmg+CisKK2ludCBpb21tdV9hcGVydHVyZTsKK2ludCBp b21tdV9hcGVydHVyZV9kaXNhYmxlZCBfX2luaXRkYXRhID0gMDsKK2ludCBpb21tdV9hcGVydHVy ZV9hbGxvd2VkIF9faW5pdGRhdGEgPSAwOworCitpbnQgZmFsbGJhY2tfYXBlcl9vcmRlciBfX2lu aXRkYXRhID0gMTsgLyogNjRNQiAqLworaW50IGZhbGxiYWNrX2FwZXJfZm9yY2UgX19pbml0ZGF0 YSA9IDA7IAorCitpbnQgZml4X2FwZXJ0dXJlIF9faW5pdGRhdGEgPSAxOworCisvKiBUaGlzIGNv ZGUgcnVucyBiZWZvcmUgdGhlIFBDSSBzdWJzeXN0ZW0gaXMgaW5pdGlhbGl6ZWQsIHNvIGp1c3QK KyAgIGFjY2VzcyB0aGUgbm9ydGhicmlkZ2UgZGlyZWN0bHkuICovCisKK3N0YXRpYyB1MzIgX19p bml0IGFsbG9jYXRlX2FwZXJ0dXJlKHZvaWQpIAoreworCXBnX2RhdGFfdCAqbmQwID0gTk9ERV9E QVRBKDApOworCXUzMiBhcGVyX3NpemU7CisJdm9pZCAqcDsgCisKKwlpZiAoZmFsbGJhY2tfYXBl cl9vcmRlciA+IDcpIAorCQlmYWxsYmFja19hcGVyX29yZGVyID0gNzsgCisJYXBlcl9zaXplID0g KDMyICogMTAyNCAqIDEwMjQpIDw8IGZhbGxiYWNrX2FwZXJfb3JkZXI7IAorCisJLyogCisJICog QXBlcnR1cmUgaGFzIHRvIGJlIG5hdHVyYWxseSBhbGlnbmVkLiBUaGlzIG1lYW5zIGFuIDJHQiBh cGVydHVyZSB3b24ndAorCSAqIGhhdmUgbXVjaCBjaGFuY2VzIHRvIGZpbmQgYSBwbGFjZSBpbiB0 aGUgbG93ZXIgNEdCIG9mIG1lbW9yeS4KKwkgKiBVbmZvcnR1bmF0ZWx5IHdlIGNhbm5vdCBtb3Zl IGl0IHVwIGJlY2F1c2UgdGhhdCB3b3VsZCBtYWtlIHRoZQorCSAqIElPTU1VIHVzZWxlc3MuCisJ ICovCisJcCA9IF9fYWxsb2NfYm9vdG1lbV9ub2RlKG5kMCwgYXBlcl9zaXplLCBhcGVyX3NpemUs IDApOyAKKyNpZm5kZWYgQ09ORklHX1hFTgorCWlmICghcCB8fCBfX3BhKHApK2FwZXJfc2l6ZSA+ IDB4ZmZmZmZmZmYpIHsKKyNlbHNlCisJaWYgKCFwIHx8ICh4ZW5fY3JlYXRlX2NvbnRpZ3VvdXNf cmVnaW9uKCh1bnNpZ25lZCBsb25nKXAsIGdldF9vcmRlcihhcGVyX3NpemUpLCAzMSkgIT0gMCl8 fHZpcnRfdG9fYnVzKHApK2FwZXJfc2l6ZSA+IDB4ZmZmZmZmZmYpIHsKKyNlbmRpZgorCQlwcmlu dGsoIkNhbm5vdCBhbGxvY2F0ZSBhcGVydHVyZSBtZW1vcnkgaG9sZSAoJXAsJXVLKVxuIiwKKwkJ ICAgICAgIHAsIGFwZXJfc2l6ZT4+MTApOworCQlpZiAocCkKKwkJCWZyZWVfYm9vdG1lbV9ub2Rl KG5kMCwgX19wYShwKSwgYXBlcl9zaXplKTsgCisJCXJldHVybiAwOworCX0KKwlwcmludGsoIk1h cHBpbmcgYXBlcnR1cmUgb3ZlciAlZCBLQiBvZiBSQU0gQCAlbHhcbiIsCisJICAgICAgIGFwZXJf c2l6ZSA+PiAxMCwgdmlydF90b19idXMocCkpOyAKKwlyZXR1cm4gKHUzMil2aXJ0X3RvX2J1cyhw KTsgCit9CisKK3N0YXRpYyBpbnQgX19pbml0IGFwZXJ0dXJlX3ZhbGlkKHU2NCBhcGVyX2Jhc2Us IHUzMiBhcGVyX3NpemUpCit7IAorCWlmICghYXBlcl9iYXNlKSAKKwkJcmV0dXJuIDA7CisJaWYg KGFwZXJfc2l6ZSA8IDY0KjEwMjQqMTAyNCkgeyAKKwkJcHJpbnRrKCJBcGVydHVyZSB0b28gc21h bGwgKCVkIE1CKVxuIiwgYXBlcl9zaXplPj4yMCk7CisJCXJldHVybiAwOworCX0KKwlpZiAoYXBl cl9iYXNlICsgYXBlcl9zaXplID49IDB4ZmZmZmZmZmYpIHsgCisJCXByaW50aygiQXBlcnR1cmUg YmV5b25kIDRHQi4gSWdub3JpbmcuXG4iKTsKKwkJcmV0dXJuIDA7IAorCX0KKwlpZiAoZTgyMF9h bnlfbWFwcGVkKGFwZXJfYmFzZSwgYXBlcl9iYXNlICsgYXBlcl9zaXplLCBFODIwX1JBTSkpIHsK KwkJcHJpbnRrKCJBcGVydHVyZSBwb2ludGluZyB0byBlODIwIFJBTS4gSWdub3JpbmcuXG4iKTsK KwkJcmV0dXJuIDA7IAorCX0gCisJcmV0dXJuIDE7Cit9IAorCisvKiBGaW5kIGEgUENJIGNhcGFi aWxpdHkgKi8KK3N0YXRpYyBfX3UzMiBfX2luaXQgZmluZF9jYXAoaW50IG51bSwgaW50IHNsb3Qs IGludCBmdW5jLCBpbnQgY2FwKSAKK3sgCisJdTggcG9zOworCWludCBieXRlczsKKwlpZiAoIShy ZWFkX3BjaV9jb25maWdfMTYobnVtLHNsb3QsZnVuYyxQQ0lfU1RBVFVTKSAmIFBDSV9TVEFUVVNf Q0FQX0xJU1QpKQorCQlyZXR1cm4gMDsKKwlwb3MgPSByZWFkX3BjaV9jb25maWdfYnl0ZShudW0s c2xvdCxmdW5jLFBDSV9DQVBBQklMSVRZX0xJU1QpOworCWZvciAoYnl0ZXMgPSAwOyBieXRlcyA8 IDQ4ICYmIHBvcyA+PSAweDQwOyBieXRlcysrKSB7IAorCQl1OCBpZDsKKwkJcG9zICY9IH4zOyAK KwkJaWQgPSByZWFkX3BjaV9jb25maWdfYnl0ZShudW0sc2xvdCxmdW5jLHBvcytQQ0lfQ0FQX0xJ U1RfSUQpOworCQlpZiAoaWQgPT0gMHhmZikKKwkJCWJyZWFrOworCQlpZiAoaWQgPT0gY2FwKSAK KwkJCXJldHVybiBwb3M7IAorCQlwb3MgPSByZWFkX3BjaV9jb25maWdfYnl0ZShudW0sc2xvdCxm dW5jLHBvcytQQ0lfQ0FQX0xJU1RfTkVYVCk7IAorCX0gCisJcmV0dXJuIDA7Cit9IAorCisvKiBS ZWFkIGEgc3RhbmRhcmQgQUdQdjMgYnJpZGdlIGhlYWRlciAqLworc3RhdGljIF9fdTMyIF9faW5p dCByZWFkX2FncChpbnQgbnVtLCBpbnQgc2xvdCwgaW50IGZ1bmMsIGludCBjYXAsIHUzMiAqb3Jk ZXIpCit7IAorCXUzMiBhcHNpemU7CisJdTMyIGFwc2l6ZXJlZzsKKwlpbnQgbmJpdHM7CisJdTMy IGFwZXJfbG93LCBhcGVyX2hpOworCXU2NCBhcGVyOworCisJcHJpbnRrKCJBR1AgYnJpZGdlIGF0 ICUwMng6JTAyeDolMDJ4XG4iLCBudW0sIHNsb3QsIGZ1bmMpOworCWFwc2l6ZXJlZyA9IHJlYWRf cGNpX2NvbmZpZ18xNihudW0sc2xvdCxmdW5jLCBjYXAgKyAweDE0KTsKKwlpZiAoYXBzaXplcmVn ID09IDB4ZmZmZmZmZmYpIHsKKwkJcHJpbnRrKCJBUFNJWkUgaW4gQUdQIGJyaWRnZSB1bnJlYWRh YmxlXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJYXBzaXplID0gYXBzaXplcmVnICYgMHhmZmY7 CisJLyogU29tZSBCSU9TIHVzZSB3ZWlyZCBlbmNvZGluZ3Mgbm90IGluIHRoZSBBR1B2MyB0YWJs ZS4gKi8KKwlpZiAoYXBzaXplICYgMHhmZikgCisJCWFwc2l6ZSB8PSAweGYwMDsgCisJbmJpdHMg PSBod2VpZ2h0MTYoYXBzaXplKTsKKwkqb3JkZXIgPSA3IC0gbmJpdHM7CisJaWYgKChpbnQpKm9y ZGVyIDwgMCkgLyogPCAzMk1CICovCisJCSpvcmRlciA9IDA7CisJCisJYXBlcl9sb3cgPSByZWFk X3BjaV9jb25maWcobnVtLHNsb3QsZnVuYywgMHgxMCk7CisJYXBlcl9oaSA9IHJlYWRfcGNpX2Nv bmZpZyhudW0sc2xvdCxmdW5jLDB4MTQpOworCWFwZXIgPSAoYXBlcl9sb3cgJiB+KCgxPDwyMikt MSkpIHwgKCh1NjQpYXBlcl9oaSA8PCAzMik7CisKKwlwcmludGsoIkFwZXJ0dXJlIGZyb20gQUdQ IEAgJUx4IHNpemUgJXUgTUIgKEFQU0laRSAleClcbiIsIAorCSAgICAgICBhcGVyLCAzMiA8PCAq b3JkZXIsIGFwc2l6ZXJlZyk7CisKKwlpZiAoIWFwZXJ0dXJlX3ZhbGlkKGFwZXIsICgzMioxMDI0 KjEwMjQpIDw8ICpvcmRlcikpCisJICAgIHJldHVybiAwOworCXJldHVybiAodTMyKWFwZXI7IAor fSAKKworLyogTG9vayBmb3IgYW4gQUdQIGJyaWRnZS4gV2luZG93cyBvbmx5IGV4cGVjdHMgdGhl IGFwZXJ0dXJlIGluIHRoZQorICAgQUdQIGJyaWRnZSBhbmQgc29tZSBCSU9TIGZvcmdldCB0byBp bml0aWFsaXplIHRoZSBOb3J0aGJyaWRnZSB0b28uCisgICBXb3JrIGFyb3VuZCB0aGlzIGhlcmUu IAorCisgICBEbyBhbiBQQ0kgYnVzIHNjYW4gYnkgaGFuZCBiZWNhdXNlIHdlJ3JlIHJ1bm5pbmcg YmVmb3JlIHRoZSBQQ0kKKyAgIHN1YnN5c3RlbS4gCisKKyAgIEFsbCBLOCBBR1AgYnJpZGdlcyBh cmUgQUdQdjMgY29tcGxpYW50LCBzbyB3ZSBjYW4gZG8gdGhpcyBzY2FuCisgICBnZW5lcmljYWxs eS4gSXQncyBwcm9iYWJseSBvdmVya2lsbCB0byBhbHdheXMgc2NhbiBhbGwgc2xvdHMgYmVjYXVz ZQorICAgdGhlIEFHUCBicmlkZ2VzIHNob3VsZCBiZSBhbHdheXMgYW4gb3duIGJ1cyBvbiB0aGUg SFQgaGllcmFyY2h5LCAKKyAgIGJ1dCBkbyBpdCBoZXJlIGZvciBmdXR1cmUgc2FmZXR5LiAqLwor c3RhdGljIF9fdTMyIF9faW5pdCBzZWFyY2hfYWdwX2JyaWRnZSh1MzIgKm9yZGVyLCBpbnQgKnZh bGlkX2FncCkKK3sKKwlpbnQgbnVtLCBzbG90LCBmdW5jOworCisJLyogUG9vciBtYW4ncyBQQ0kg ZGlzY292ZXJ5ICovCisJZm9yIChudW0gPSAwOyBudW0gPCAyNTY7IG51bSsrKSB7IAorCQlmb3Ig KHNsb3QgPSAwOyBzbG90IDwgMzI7IHNsb3QrKykgeyAKKwkJCWZvciAoZnVuYyA9IDA7IGZ1bmMg PCA4OyBmdW5jKyspIHsgCisJCQkJdTMyIGNsYXNzLCBjYXA7CisJCQkJdTggdHlwZTsKKwkJCQlj bGFzcyA9IHJlYWRfcGNpX2NvbmZpZyhudW0sc2xvdCxmdW5jLAorCQkJCQkJCVBDSV9DTEFTU19S RVZJU0lPTik7CisJCQkJaWYgKGNsYXNzID09IDB4ZmZmZmZmZmYpCisJCQkJCWJyZWFrOyAKKwkJ CQkKKwkJCQlzd2l0Y2ggKGNsYXNzID4+IDE2KSB7IAorCQkJCWNhc2UgUENJX0NMQVNTX0JSSURH RV9IT1NUOgorCQkJCWNhc2UgUENJX0NMQVNTX0JSSURHRV9PVEhFUjogLyogbmVlZGVkPyAqLwor CQkJCQkvKiBBR1AgYnJpZGdlPyAqLworCQkJCQljYXAgPSBmaW5kX2NhcChudW0sc2xvdCxmdW5j LFBDSV9DQVBfSURfQUdQKTsKKwkJCQkJaWYgKCFjYXApCisJCQkJCQlicmVhazsKKwkJCQkJKnZh bGlkX2FncCA9IDE7IAorCQkJCQlyZXR1cm4gcmVhZF9hZ3AobnVtLHNsb3QsZnVuYyxjYXAsb3Jk ZXIpOworCQkJCX0gCisJCQkJCisJCQkJLyogTm8gbXVsdGktZnVuY3Rpb24gZGV2aWNlPyAqLwor CQkJCXR5cGUgPSByZWFkX3BjaV9jb25maWdfYnl0ZShudW0sc2xvdCxmdW5jLAorCQkJCQkJCSAg ICAgICBQQ0lfSEVBREVSX1RZUEUpOworCQkJCWlmICghKHR5cGUgJiAweDgwKSkKKwkJCQkJYnJl YWs7CisJCQl9IAorCQl9IAorCX0KKwlwcmludGsoIk5vIEFHUCBicmlkZ2UgZm91bmRcbiIpOyAK KwlyZXR1cm4gMDsKK30KKwordm9pZCBfX2luaXQgaW9tbXVfaG9sZV9pbml0KHZvaWQpIAoreyAK KwlpbnQgZml4LCBudW07IAorCXUzMiBhcGVyX3NpemUsIGFwZXJfYWxsb2MgPSAwLCBhcGVyX29y ZGVyID0gMCwgbGFzdF9hcGVyX29yZGVyID0gMDsKKwl1NjQgYXBlcl9iYXNlLCBsYXN0X2FwZXJf YmFzZSA9IDA7CisJaW50IHZhbGlkX2FncCA9IDA7CisKKwlpZiAoaW9tbXVfYXBlcnR1cmVfZGlz YWJsZWQgfHwgIWZpeF9hcGVydHVyZSkKKwkJcmV0dXJuOworCisJcHJpbnRrKCJDaGVja2luZyBh cGVydHVyZS4uLlxuIik7IAorCisJZml4ID0gMDsKKwlmb3IgKG51bSA9IDI0OyBudW0gPCAzMjsg bnVtKyspIHsJCQorCQlpZiAoIWVhcmx5X2lzX2s4X25iKHJlYWRfcGNpX2NvbmZpZygwLCBudW0s IDMsIDB4MDApKSkKKwkJCWNvbnRpbnVlOworCisJCWlvbW11X2RldGVjdGVkID0gMTsKKwkJaW9t bXVfYXBlcnR1cmUgPSAxOyAKKworCQlhcGVyX29yZGVyID0gKHJlYWRfcGNpX2NvbmZpZygwLCBu dW0sIDMsIDB4OTApID4+IDEpICYgNzsgCisJCWFwZXJfc2l6ZSA9ICgzMiAqIDEwMjQgKiAxMDI0 KSA8PCBhcGVyX29yZGVyOyAKKwkJYXBlcl9iYXNlID0gcmVhZF9wY2lfY29uZmlnKDAsIG51bSwg MywgMHg5NCkgJiAweDdmZmY7CisJCWFwZXJfYmFzZSA8PD0gMjU7IAorCisJCXByaW50aygiQ1BV ICVkOiBhcGVydHVyZSBAICVMeCBzaXplICV1IE1CXG4iLCBudW0tMjQsIAorCQkgICAgICAgYXBl cl9iYXNlLCBhcGVyX3NpemU+PjIwKTsKKwkJCisJCWlmICghYXBlcnR1cmVfdmFsaWQoYXBlcl9i YXNlLCBhcGVyX3NpemUpKSB7CisJCQlmaXggPSAxOyAKKwkJCWJyZWFrOyAKKwkJfQorCisJCWlm ICgobGFzdF9hcGVyX29yZGVyICYmIGFwZXJfb3JkZXIgIT0gbGFzdF9hcGVyX29yZGVyKSB8fAor CQkgICAgKGxhc3RfYXBlcl9iYXNlICYmIGFwZXJfYmFzZSAhPSBsYXN0X2FwZXJfYmFzZSkpIHsK KwkJCWZpeCA9IDE7CisJCQlicmVhazsKKwkJfQorCQlsYXN0X2FwZXJfb3JkZXIgPSBhcGVyX29y ZGVyOworCQlsYXN0X2FwZXJfYmFzZSA9IGFwZXJfYmFzZTsKKwl9IAorCisJaWYgKCFmaXggJiYg IWZhbGxiYWNrX2FwZXJfZm9yY2UpIAorCQlyZXR1cm47IAorCisJaWYgKCFmYWxsYmFja19hcGVy X2ZvcmNlKQorCQlhcGVyX2FsbG9jID0gc2VhcmNoX2FncF9icmlkZ2UoJmFwZXJfb3JkZXIsICZ2 YWxpZF9hZ3ApOyAKKwkJCisJaWYgKGFwZXJfYWxsb2MpIHsgCisJCS8qIEdvdCB0aGUgYXBlcnR1 cmUgZnJvbSB0aGUgQUdQIGJyaWRnZSAqLworCX0gZWxzZSBpZiAoc3dpb3RsYiAmJiAhdmFsaWRf YWdwKSB7CisJCS8qIERvIG5vdGhpbmcgKi8KKwl9IGVsc2UgaWYgKCghbm9faW9tbXUgJiYgZ2xv YmFsX25lZWRfaW9tbXUoKSkgfHwKKwkJICAgZm9yY2VfaW9tbXUgfHwKKwkJICAgdmFsaWRfYWdw IHx8CisJCSAgIGZhbGxiYWNrX2FwZXJfZm9yY2UpIHsgCisJCXByaW50aygiWW91ciBCSU9TIGRv ZXNuJ3QgbGVhdmUgYSBhcGVydHVyZSBtZW1vcnkgaG9sZVxuIik7CisJCXByaW50aygiUGxlYXNl IGVuYWJsZSB0aGUgSU9NTVUgb3B0aW9uIGluIHRoZSBCSU9TIHNldHVwXG4iKTsKKwkJcHJpbnRr KCJUaGlzIGNvc3RzIHlvdSAlZCBNQiBvZiBSQU1cbiIsCisJCSAgICAgICAzMiA8PCBmYWxsYmFj a19hcGVyX29yZGVyKTsKKworCQlhcGVyX29yZGVyID0gZmFsbGJhY2tfYXBlcl9vcmRlcjsKKwkJ YXBlcl9hbGxvYyA9IGFsbG9jYXRlX2FwZXJ0dXJlKCk7CisJCWlmICghYXBlcl9hbGxvYykgeyAK KwkJCS8qIENvdWxkIGRpc2FibGUgQUdQIGFuZCBJT01NVSBoZXJlLCBidXQgaXQncyBwcm9iYWJs eQorCQkJICAgbm90IHdvcnRoIGl0LiBCdXQgdGhlIGxhdGVyIHVzZXJzIGNhbm5vdCBkZWFsIHdp dGgKKwkJCSAgIGJhZCBhcGVydHVyZXMgYW5kIHR1cm5pbmcgb24gdGhlIGFwZXJ0dXJlIG92ZXIg bWVtb3J5CisJCQkgICBjYXVzZXMgdmVyeSBzdHJhbmdlIHByb2JsZW1zLCBzbyBpdCdzIGJldHRl ciB0byAKKwkJCSAgIHBhbmljIGVhcmx5LiAqLworCQkJcGFuaWMoIk5vdCBlbm91Z2ggbWVtb3J5 IGZvciBhcGVydHVyZSIpOworCQl9CisJfSBlbHNlIHsgCisJCXJldHVybjsgCisJfSAKKworCS8q IEZpeCB1cCB0aGUgbm9ydGggYnJpZGdlcyAqLworCWZvciAobnVtID0gMjQ7IG51bSA8IDMyOyBu dW0rKykgeyAJCQorCQlpZiAoIWVhcmx5X2lzX2s4X25iKHJlYWRfcGNpX2NvbmZpZygwLCBudW0s IDMsIDB4MDApKSkKKwkJCWNvbnRpbnVlOwkKKworCQkvKiBEb24ndCBlbmFibGUgdHJhbnNsYXRp b24geWV0LiBUaGF0IGlzIGRvbmUgbGF0ZXIuIAorCQkgICBBc3N1bWUgdGhpcyBCSU9TIGRpZG4n dCBpbml0aWFsaXNlIHRoZSBHQVJUIHNvIAorCQkgICBqdXN0IG92ZXJ3cml0ZSBhbGwgcHJldmlv dXMgYml0cyAqLyAKKwkJd3JpdGVfcGNpX2NvbmZpZygwLCBudW0sIDMsIDB4OTAsIGFwZXJfb3Jk ZXI8PDEpOyAKKwkJd3JpdGVfcGNpX2NvbmZpZygwLCBudW0sIDMsIDB4OTQsIGFwZXJfYWxsb2M+ PjI1KTsgCisJfSAKK30gCmRpZmYgLXIgZDM5ZThjNDRkYTM0IC1yIDUwMjgxMGIxMWM3OSBsaW51 eC0yLjYteGVuLXNwYXJzZS9hcmNoL3g4Nl82NC9rZXJuZWwvcGNpLWRtYS14ZW4uYwotLS0gL2Rl di9udWxsCVRodSBKYW4gMDEgMDA6MDA6MDAgMTk3MCArMDAwMAorKysgYi9saW51eC0yLjYteGVu LXNwYXJzZS9hcmNoL3g4Nl82NC9rZXJuZWwvcGNpLWRtYS14ZW4uYwlGcmkgRmViIDA5IDE2OjMy OjA0IDIwMDcgLTA2MDAKQEAgLTAsMCArMSwzMjggQEAKKy8qCisgKiBEeW5hbWljIERNQSBtYXBw aW5nIHN1cHBvcnQuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8 bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9w Y2kuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNp bmNsdWRlIDxhc20vcHJvdG8uaD4KKyNpbmNsdWRlIDxhc20vY2FsZ2FyeS5oPgorI2luY2x1ZGUg PHhlbi9iYWxsb29uLmg+CisjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CisKK2ludCBpb21tdV9t ZXJnZSBfX3JlYWRfbW9zdGx5ID0gMDsKK0VYUE9SVF9TWU1CT0woaW9tbXVfbWVyZ2UpOworCitk bWFfYWRkcl90IGJhZF9kbWFfYWRkcmVzcyBfX3JlYWRfbW9zdGx5OworRVhQT1JUX1NZTUJPTChi YWRfZG1hX2FkZHJlc3MpOworCisvKiBUaGlzIHRlbGxzIHRoZSBCSU8gYmxvY2sgbGF5ZXIgdG8g YXNzdW1lIG1lcmdpbmcuIERlZmF1bHQgdG8gb2ZmCisgICBiZWNhdXNlIHdlIGNhbm5vdCBndWFy YW50ZWUgbWVyZ2luZyBsYXRlci4gKi8KK2ludCBpb21tdV9iaW9fbWVyZ2UgX19yZWFkX21vc3Rs eSA9IDA7CitFWFBPUlRfU1lNQk9MKGlvbW11X2Jpb19tZXJnZSk7CisKK2ludCBpb21tdV9zYWNf Zm9yY2UgX19yZWFkX21vc3RseSA9IDA7CitFWFBPUlRfU1lNQk9MKGlvbW11X3NhY19mb3JjZSk7 CisKK2ludCBub19pb21tdSBfX3JlYWRfbW9zdGx5OworI2lmZGVmIENPTkZJR19JT01NVV9ERUJV RworaW50IHBhbmljX29uX292ZXJmbG93IF9fcmVhZF9tb3N0bHkgPSAxOworaW50IGZvcmNlX2lv bW11IF9fcmVhZF9tb3N0bHkgPSAxOworI2Vsc2UKK2ludCBwYW5pY19vbl9vdmVyZmxvdyBfX3Jl YWRfbW9zdGx5ID0gMDsKK2ludCBmb3JjZV9pb21tdSBfX3JlYWRfbW9zdGx5PSAwOworI2VuZGlm CisKKy8qIFNldCB0aGlzIHRvIDEgaWYgdGhlcmUgaXMgYSBIVyBJT01NVSBpbiB0aGUgc3lzdGVt ICovCitpbnQgaW9tbXVfZGV0ZWN0ZWQgX19yZWFkX21vc3RseSA9IDA7CisKKy8qIER1bW15IGRl dmljZSB1c2VkIGZvciBOVUxMIGFyZ3VtZW50cyAobm9ybWFsbHkgSVNBKS4gQmV0dGVyIHdvdWxk CisgICBiZSBwcm9iYWJseSBhIHNtYWxsZXIgRE1BIG1hc2ssIGJ1dCB0aGlzIGlzIGJ1Zy10by1i dWcgY29tcGF0aWJsZQorICAgdG8gaTM4Ni4gKi8KK3N0cnVjdCBkZXZpY2UgZmFsbGJhY2tfZGV2 ID0geworCS5idXNfaWQgPSAiZmFsbGJhY2sgZGV2aWNlIiwKKwkuY29oZXJlbnRfZG1hX21hc2sg PSBETUFfMzJCSVRfTUFTSywKKwkuZG1hX21hc2sgPSAmZmFsbGJhY2tfZGV2LmNvaGVyZW50X2Rt YV9tYXNrLAorfTsKKworLyogQWxsb2NhdGUgRE1BIG1lbW9yeSBvbiBub2RlIG5lYXIgZGV2aWNl ICovCitub2lubGluZSBzdGF0aWMgdm9pZCAqCitkbWFfYWxsb2NfcGFnZXMoc3RydWN0IGRldmlj ZSAqZGV2LCBnZnBfdCBnZnAsIHVuc2lnbmVkIG9yZGVyKQoreworCXN0cnVjdCBwYWdlICpwYWdl OworCWludCBub2RlOworI2lmZGVmIENPTkZJR19QQ0kKKwlpZiAoZGV2LT5idXMgPT0gJnBjaV9i dXNfdHlwZSkKKwkJbm9kZSA9IHBjaWJ1c190b19ub2RlKHRvX3BjaV9kZXYoZGV2KS0+YnVzKTsK KwllbHNlCisjZW5kaWYKKwkJbm9kZSA9IG51bWFfbm9kZV9pZCgpOworCisJaWYgKG5vZGUgPCBm aXJzdF9ub2RlKG5vZGVfb25saW5lX21hcCkpCisJCW5vZGUgPSBmaXJzdF9ub2RlKG5vZGVfb25s aW5lX21hcCk7CisKKwlwYWdlID0gYWxsb2NfcGFnZXNfbm9kZShub2RlLCBnZnAsIG9yZGVyKTsK KwlyZXR1cm4gcGFnZSA/IHBhZ2VfYWRkcmVzcyhwYWdlKSA6IE5VTEw7Cit9CisKKy8qCisgKiBB bGxvY2F0ZSBtZW1vcnkgZm9yIGEgY29oZXJlbnQgbWFwcGluZy4KKyAqLwordm9pZCAqCitkbWFf YWxsb2NfY29oZXJlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwgZG1hX2FkZHJf dCAqZG1hX2hhbmRsZSwKKwkJICAgZ2ZwX3QgZ2ZwKQoreworCXZvaWQgKm1lbW9yeTsKKwl1bnNp Z25lZCBsb25nIGRtYV9tYXNrID0gMDsKKwl1NjQgYnVzOworCisJaWYgKCFkZXYpCisJCWRldiA9 ICZmYWxsYmFja19kZXY7CisJZG1hX21hc2sgPSBkZXYtPmNvaGVyZW50X2RtYV9tYXNrOworCWlm IChkbWFfbWFzayA9PSAwKQorCQlkbWFfbWFzayA9IERNQV8zMkJJVF9NQVNLOworCisJLyogRG9u J3QgaW52b2tlIE9PTSBraWxsZXIgKi8KKwlnZnAgfD0gX19HRlBfTk9SRVRSWTsKKworCS8qIEts dWRnZSB0byBtYWtlIGl0IGJ1Zy10by1idWcgY29tcGF0aWJsZSB3aXRoIGkzODYuIGkzODYKKwkg ICB1c2VzIHRoZSBub3JtYWwgZG1hX21hc2sgZm9yIGFsbG9jX2NvaGVyZW50LiAqLworCWRtYV9t YXNrICY9ICpkZXYtPmRtYV9tYXNrOworCisJLyogV2h5IDw9PyBFdmVuIHdoZW4gdGhlIG1hc2sg aXMgc21hbGxlciB0aGFuIDRHQiBpdCBpcyBvZnRlbgorCSAgIGxhcmdlciB0aGFuIDE2TUIgYW5k IGluIHRoaXMgY2FzZSB3ZSBoYXZlIGEgY2hhbmNlIG9mCisJICAgZmluZGluZyBmaXR0aW5nIG1l bW9yeSBpbiB0aGUgbmV4dCBoaWdoZXIgem9uZSBmaXJzdC4gSWYKKwkgICBub3QgcmV0cnkgd2l0 aCB0cnVlIEdGUF9ETUEuIC1BSyAqLworCWlmIChkbWFfbWFzayA8PSBETUFfMzJCSVRfTUFTSykK KwkJZ2ZwIHw9IEdGUF9ETUEzMjsKKworIGFnYWluOgorCW1lbW9yeSA9IGRtYV9hbGxvY19wYWdl cyhkZXYsIGdmcCwgZ2V0X29yZGVyKHNpemUpKTsKKwlpZiAobWVtb3J5ID09IE5VTEwpCisJCXJl dHVybiBOVUxMOworCisJeworCQlpbnQgaGlnaCwgbW11OworCQlidXMgPSB2aXJ0X3RvX2J1cyht ZW1vcnkpOworCSAgICAgICAgaGlnaCA9IChidXMgKyBzaXplKSA+PSBkbWFfbWFzazsKKwkJbW11 ID0gaGlnaDsKKwkJaWYgKGZvcmNlX2lvbW11ICYmICEoZ2ZwICYgR0ZQX0RNQSkpCisJCQltbXUg PSAxOworCQllbHNlIGlmIChoaWdoKSB7CisJCQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKW1l bW9yeSwKKwkJCQkgICBnZXRfb3JkZXIoc2l6ZSkpOworCisJCQkvKiBEb24ndCB1c2UgdGhlIDE2 TUIgWk9ORV9ETUEgdW5sZXNzIGFic29sdXRlbHkKKwkJCSAgIG5lZWRlZC4gSXQncyBiZXR0ZXIg dG8gdXNlIHJlbWFwcGluZyBmaXJzdC4gKi8KKwkJCWlmIChkbWFfbWFzayA8IERNQV8zMkJJVF9N QVNLICYmICEoZ2ZwICYgR0ZQX0RNQSkpIHsKKwkJCQlnZnAgPSAoZ2ZwICYgfkdGUF9ETUEzMikg fCBHRlBfRE1BOworCQkJCWdvdG8gYWdhaW47CisJCQl9CisKKwkJCS8qIExldCBsb3cgbGV2ZWwg bWFrZSBpdHMgb3duIHpvbmUgZGVjaXNpb25zICovCisJCQlnZnAgJj0gfihHRlBfRE1BMzJ8R0ZQ X0RNQSk7CisKKwkJCWlmIChkbWFfb3BzLT5hbGxvY19jb2hlcmVudCkKKwkJCQlyZXR1cm4gZG1h X29wcy0+YWxsb2NfY29oZXJlbnQoZGV2LCBzaXplLAorCQkJCQkJCSAgIGRtYV9oYW5kbGUsIGdm cCk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCS8qIEhhcmRjb2RlIDMxIGFkZHJlc3MgYml0 cyBmb3Igbm93OiBhYWNyYWlkIGxpbWl0YXRpb24uICovCisJCWlmICh4ZW5fY3JlYXRlX2NvbnRp Z3VvdXNfcmVnaW9uKCh1bnNpZ25lZCBsb25nKW1lbW9yeSwgZ2V0X29yZGVyKHNpemUpLCAzMSkg IT0gMCkgeworCQkJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZyltZW1vcnksIGdldF9vcmRlcihz aXplKSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCW1lbXNldChtZW1vcnksIDAsIHNpemUp OworCQlpZiAoIW1tdSkgeworCQkJKmRtYV9oYW5kbGUgPSB2aXJ0X3RvX2J1cyhtZW1vcnkpOwor CQkJcmV0dXJuIG1lbW9yeTsKKwkJfQorCX0KKworCWlmIChkbWFfb3BzLT5hbGxvY19jb2hlcmVu dCkgeworCQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKW1lbW9yeSwgZ2V0X29yZGVyKHNpemUp KTsKKwkJZ2ZwICY9IH4oR0ZQX0RNQXxHRlBfRE1BMzIpOworCQlyZXR1cm4gZG1hX29wcy0+YWxs b2NfY29oZXJlbnQoZGV2LCBzaXplLCBkbWFfaGFuZGxlLCBnZnApOworCX0KKworCWlmIChkbWFf b3BzLT5tYXBfc2ltcGxlKSB7CisJCSpkbWFfaGFuZGxlID0gZG1hX29wcy0+bWFwX3NpbXBsZShk ZXYsIG1lbW9yeSwKKwkJCQkJICAgICAgc2l6ZSwKKwkJCQkJICAgICAgUENJX0RNQV9CSURJUkVD VElPTkFMKTsKKwkJaWYgKCpkbWFfaGFuZGxlICE9IGJhZF9kbWFfYWRkcmVzcykKKwkJCXJldHVy biBtZW1vcnk7CisJfQorCisJaWYgKHBhbmljX29uX292ZXJmbG93KQorCQlwYW5pYygiZG1hX2Fs bG9jX2NvaGVyZW50OiBJT01NVSBvdmVyZmxvdyBieSAlbHUgYnl0ZXNcbiIsc2l6ZSk7CisJZnJl ZV9wYWdlcygodW5zaWduZWQgbG9uZyltZW1vcnksIGdldF9vcmRlcihzaXplKSk7CisJcmV0dXJu IE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MKGRtYV9hbGxvY19jb2hlcmVudCk7CisKKy8qCisgKiBV bm1hcCBjb2hlcmVudCBtZW1vcnkuCisgKiBUaGUgY2FsbGVyIG11c3QgZW5zdXJlIHRoYXQgdGhl IGRldmljZSBoYXMgZmluaXNoZWQgYWNjZXNzaW5nIHRoZSBtYXBwaW5nLgorICovCit2b2lkIGRt YV9mcmVlX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsCisJCQkgdm9p ZCAqdmFkZHIsIGRtYV9hZGRyX3QgYnVzKQoreworCWlmIChkbWFfb3BzLT51bm1hcF9zaW5nbGUp CisJCWRtYV9vcHMtPnVubWFwX3NpbmdsZShkZXYsIGJ1cywgc2l6ZSwgMCk7CisJeGVuX2Rlc3Ry b3lfY29udGlndW91c19yZWdpb24oKHVuc2lnbmVkIGxvbmcpIHZhZGRyLCBnZXRfb3JkZXIoc2l6 ZSkpOworCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpdmFkZHIsIGdldF9vcmRlcihzaXplKSk7 Cit9CitFWFBPUlRfU1lNQk9MKGRtYV9mcmVlX2NvaGVyZW50KTsKKworaW50IGRtYV9zdXBwb3J0 ZWQoc3RydWN0IGRldmljZSAqZGV2LCB1NjQgbWFzaykKK3sKKwlpZiAoZG1hX29wcy0+ZG1hX3N1 cHBvcnRlZCkKKwkJcmV0dXJuIGRtYV9vcHMtPmRtYV9zdXBwb3J0ZWQoZGV2LCBtYXNrKTsKKwor CS8qIENvcGllZCBmcm9tIGkzODYuIERvZXNuJ3QgbWFrZSBtdWNoIHNlbnNlLCBiZWNhdXNlIGl0 IHdpbGwKKwkgICBvbmx5IHdvcmsgZm9yIHBjaV9hbGxvY19jb2hlcmVudC4KKwkgICBUaGUgY2Fs bGVyIGp1c3QgaGFzIHRvIHVzZSBHRlBfRE1BIGluIHRoaXMgY2FzZS4gKi8KKyAgICAgICAgaWYg KG1hc2sgPCBETUFfMjRCSVRfTUFTSykKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKworCS8q IFRlbGwgdGhlIGRldmljZSB0byB1c2UgU0FDIHdoZW4gSU9NTVUgZm9yY2UgaXMgb24uICBUaGlz CisJICAgYWxsb3dzIHRoZSBkcml2ZXIgdG8gdXNlIGNoZWFwZXIgYWNjZXNzZXMgaW4gc29tZSBj YXNlcy4KKworCSAgIFByb2JsZW0gd2l0aCB0aGlzIGlzIHRoYXQgaWYgd2Ugb3ZlcmZsb3cgdGhl IElPTU1VIGFyZWEgYW5kCisJICAgcmV0dXJuIERBQyBhcyBmYWxsYmFjayBhZGRyZXNzIHRoZSBk ZXZpY2UgbWF5IG5vdCBoYW5kbGUgaXQKKwkgICBjb3JyZWN0bHkuCisKKwkgICBBcyBhIHNwZWNp YWwgY2FzZSBzb21lIGNvbnRyb2xsZXJzIGhhdmUgYSAzOWJpdCBhZGRyZXNzCisJICAgbW9kZSB0 aGF0IGlzIGFzIGVmZmljaWVudCBhcyAzMmJpdCAoYWljNzl4eCkuIERvbid0IGZvcmNlCisJICAg U0FDIGZvciB0aGVzZS4gIEFzc3VtZSBhbGwgbWFza3MgPD0gNDAgYml0cyBhcmUgb2YgdGhpcwor CSAgIHR5cGUuIE5vcm1hbGx5IHRoaXMgZG9lc24ndCBtYWtlIGFueSBkaWZmZXJlbmNlLCBidXQg Z2l2ZXMKKwkgICBtb3JlIGdlbnRsZSBoYW5kbGluZyBvZiBJT01NVSBvdmVyZmxvdy4gKi8KKwlp ZiAoaW9tbXVfc2FjX2ZvcmNlICYmIChtYXNrID49IERNQV80MEJJVF9NQVNLKSkgeworCQlwcmlu dGsoS0VSTl9JTkZPICIlczogRm9yY2UgU0FDIHdpdGggbWFzayAlTHhcbiIsIGRldi0+YnVzX2lk LG1hc2spOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KK0VYUE9SVF9TWU1CT0wo ZG1hX3N1cHBvcnRlZCk7CisKK2ludCBkbWFfc2V0X21hc2soc3RydWN0IGRldmljZSAqZGV2LCB1 NjQgbWFzaykKK3sKKwlpZiAoIWRldi0+ZG1hX21hc2sgfHwgIWRtYV9zdXBwb3J0ZWQoZGV2LCBt YXNrKSkKKwkJcmV0dXJuIC1FSU87CisJKmRldi0+ZG1hX21hc2sgPSBtYXNrOworCXJldHVybiAw OworfQorRVhQT1JUX1NZTUJPTChkbWFfc2V0X21hc2spOworCisvKiBpb21tdT1bc2l6ZV1bLG5v YWdwXVssb2ZmXVssZm9yY2VdWyxub2ZvcmNlXVssbGVha11bLG1lbWFwZXJbPW9yZGVyXV1bLG1l cmdlXQorICAgICAgICAgWyxmb3JjZXNhY11bLGZ1bGxmbHVzaF1bLG5vbWVyZ2VdWyxiaW9tZXJn ZV0KKyAgIHNpemUgIHNldCBzaXplIG9mIGlvbW11IChpbiBieXRlcykKKyAgIG5vYWdwIGRvbid0 IGluaXRpYWxpemUgdGhlIEFHUCBkcml2ZXIgYW5kIHVzZSBmdWxsIGFwZXJ0dXJlLgorICAgb2Zm ICAgZG9uJ3QgdXNlIHRoZSBJT01NVQorICAgbGVhayAgdHVybiBvbiBzaW1wbGUgaW9tbXUgbGVh ayB0cmFjaW5nIChvbmx5IHdoZW4gQ09ORklHX0lPTU1VX0xFQUsgaXMgb24pCisgICBtZW1hcGVy Wz1vcmRlcl0gYWxsb2NhdGUgYW4gb3duIGFwZXJ0dXJlIG92ZXIgUkFNIHdpdGggc2l6ZSAzMk1C Xm9yZGVyLgorICAgbm9mb3JjZSBkb24ndCBmb3JjZSBJT01NVSB1c2FnZS4gRGVmYXVsdC4KKyAg IGZvcmNlICBGb3JjZSBJT01NVS4KKyAgIG1lcmdlICBEbyBsYXp5IG1lcmdpbmcuIFRoaXMgbWF5 IGltcHJvdmUgcGVyZm9ybWFuY2Ugb24gc29tZSBibG9jayBkZXZpY2VzLgorICAgICAgICAgIElt cGxpZXMgZm9yY2UgKGV4cGVyaW1lbnRhbCkKKyAgIGJpb21lcmdlIERvIG1lcmdpbmcgYXQgdGhl IEJJTyBsYXllci4gVGhpcyBpcyBtb3JlIGVmZmljaWVudCB0aGFuIG1lcmdlLAorICAgICAgICAg ICAgYnV0IHNob3VsZCBiZSBvbmx5IGRvbmUgd2l0aCB2ZXJ5IGJpZyBJT01NVXMuIEltcGxpZXMg bWVyZ2UsZm9yY2UuCisgICBub21lcmdlIERvbid0IGRvIFNHIG1lcmdpbmcuCisgICBmb3JjZXNh YyBGb3IgU0FDIG1vZGUgZm9yIG1hc2tzIDw0MGJpdHMgIChleHBlcmltZW50YWwpCisgICBmdWxs Zmx1c2ggRmx1c2ggSU9NTVUgb24gZWFjaCBhbGxvY2F0aW9uIChkZWZhdWx0KQorICAgbm9mdWxs Zmx1c2ggRG9uJ3QgdXNlIElPTU1VIGZ1bGxmbHVzaAorICAgYWxsb3dlZCAgb3ZlcndyaXRlIGlv bW11IG9mZiB3b3JrYXJvdW5kcyBmb3Igc3BlY2lmaWMgY2hpcHNldHMuCisgICBzb2Z0CSBVc2Ug c29mdHdhcmUgYm91bmNlIGJ1ZmZlcmluZyAoZGVmYXVsdCBmb3IgSW50ZWwgbWFjaGluZXMpCisg ICBub2FwZXJ0dXJlIERvbid0IHRvdWNoIHRoZSBhcGVydHVyZSBmb3IgQUdQLgorKi8KK19faW5p dCBpbnQgaW9tbXVfc2V0dXAoY2hhciAqcCkKK3sKKyAgICBpb21tdV9tZXJnZSA9IDE7CisKKyAg ICB3aGlsZSAoKnApIHsKKwkgICAgaWYgKCFzdHJuY21wKHAsIm9mZiIsMykpCisJCSAgICBub19p b21tdSA9IDE7CisJICAgIC8qIGdhcnRfcGFyc2Vfb3B0aW9ucyBoYXMgbW9yZSBmb3JjZSBzdXBw b3J0ICovCisJICAgIGlmICghc3RybmNtcChwLCJmb3JjZSIsNSkpCisJCSAgICBmb3JjZV9pb21t dSA9IDE7CisJICAgIGlmICghc3RybmNtcChwLCJub2ZvcmNlIiw3KSkgeworCQkgICAgaW9tbXVf bWVyZ2UgPSAwOworCQkgICAgZm9yY2VfaW9tbXUgPSAwOworCSAgICB9CisKKwkgICAgaWYgKCFz dHJuY21wKHAsICJiaW9tZXJnZSIsOCkpIHsKKwkJICAgIGlvbW11X2Jpb19tZXJnZSA9IDQwOTY7 CisJCSAgICBpb21tdV9tZXJnZSA9IDE7CisJCSAgICBmb3JjZV9pb21tdSA9IDE7CisJICAgIH0K KwkgICAgaWYgKCFzdHJuY21wKHAsICJwYW5pYyIsNSkpCisJCSAgICBwYW5pY19vbl9vdmVyZmxv dyA9IDE7CisJICAgIGlmICghc3RybmNtcChwLCAibm9wYW5pYyIsNykpCisJCSAgICBwYW5pY19v bl9vdmVyZmxvdyA9IDA7CisJICAgIGlmICghc3RybmNtcChwLCAibWVyZ2UiLDUpKSB7CisJCSAg ICBpb21tdV9tZXJnZSA9IDE7CisJCSAgICBmb3JjZV9pb21tdSA9IDE7CisJICAgIH0KKwkgICAg aWYgKCFzdHJuY21wKHAsICJub21lcmdlIiw3KSkKKwkJICAgIGlvbW11X21lcmdlID0gMDsKKwkg ICAgaWYgKCFzdHJuY21wKHAsICJmb3JjZXNhYyIsOCkpCisJCSAgICBpb21tdV9zYWNfZm9yY2Ug PSAxOworCisjaWZkZWYgQ09ORklHX1NXSU9UTEIKKwkgICAgaWYgKCFzdHJuY21wKHAsICJzb2Z0 Iiw0KSkKKwkJICAgIHN3aW90bGIgPSAxOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfSU9NTVUK KwkgICAgZ2FydF9wYXJzZV9vcHRpb25zKHApOworI2VuZGlmCisKKwkgICAgcCArPSBzdHJjc3Bu KHAsICIsIik7CisJICAgIGlmICgqcCA9PSAnLCcpCisJCSAgICArK3A7CisgICAgfQorICAgIHJl dHVybiAxOworfQorX19zZXR1cCgiaW9tbXU9IiwgaW9tbXVfc2V0dXApOworCit2b2lkIF9faW5p dCBwY2lfaW9tbXVfYWxsb2Modm9pZCkKK3sKKwkvKgorCSAqIFRoZSBvcmRlciBvZiB0aGVzZSBm dW5jdGlvbnMgaXMgaW1wb3J0YW50IGZvcgorCSAqIGZhbGwtYmFjay9mYWlsLW92ZXIgcmVhc29u cworCSAqLworI2lmZGVmIENPTkZJR19JT01NVQorCWlvbW11X2hvbGVfaW5pdCgpOworI2VuZGlm CisKKyNpZmRlZiBDT05GSUdfQ0FMR0FSWV9JT01NVQorCWRldGVjdF9jYWxnYXJ5KCk7CisjZW5k aWYKKworI2lmZGVmIENPTkZJR19TV0lPVExCCisJcGNpX3N3aW90bGJfaW5pdCgpOworI2VuZGlm Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHBjaV9pb21tdV9pbml0KHZvaWQpCit7CisjaWZkZWYg Q09ORklHX0NBTEdBUllfSU9NTVUKKwljYWxnYXJ5X2lvbW11X2luaXQoKTsKKyNlbmRpZgorCisj aWZkZWYgQ09ORklHX0lPTU1VCisJZ2FydF9pb21tdV9pbml0KCk7CisjZW5kaWYKKworCW5vX2lv bW11X2luaXQoKTsKKwlyZXR1cm4gMDsKK30KKworLyogTXVzdCBleGVjdXRlIGFmdGVyIFBDSSBz dWJzeXN0ZW0gKi8KK2ZzX2luaXRjYWxsKHBjaV9pb21tdV9pbml0KTsKZGlmZiAtciBkMzllOGM0 NGRhMzQgLXIgNTAyODEwYjExYzc5IGxpbnV4LTIuNi14ZW4tc3BhcnNlL2FyY2gveDg2XzY0L2tl cm5lbC9wY2ktZ2FydC14ZW4uYwotLS0gL2Rldi9udWxsCVRodSBKYW4gMDEgMDA6MDA6MDAgMTk3 MCArMDAwMAorKysgYi9saW51eC0yLjYteGVuLXNwYXJzZS9hcmNoL3g4Nl82NC9rZXJuZWwvcGNp LWdhcnQteGVuLmMJRnJpIEZlYiAwOSAxNjozMjowNCAyMDA3IC0wNjAwCkBAIC0wLDAgKzEsNzQx IEBACisvKgorICogRHluYW1pYyBETUEgbWFwcGluZyBzdXBwb3J0IGZvciBBTUQgSGFtbWVyLgor ICogCisgKiBVc2UgdGhlIGludGVncmF0ZWQgQUdQIEdBUlQgaW4gdGhlIEhhbW1lciBub3J0aGJy aWRnZSBhcyBhbiBJT01NVSBmb3IgUENJLgorICogVGhpcyBhbGxvd3MgdG8gdXNlIFBDSSBkZXZp Y2VzIHRoYXQgb25seSBzdXBwb3J0IDMyYml0IGFkZHJlc3NlcyBvbiBzeXN0ZW1zCisgKiB3aXRo IG1vcmUgdGhhbiA0R0IuIAorICoKKyAqIFNlZSBEb2N1bWVudGF0aW9uL0RNQS1tYXBwaW5nLnR4 dCBmb3IgdGhlIGludGVyZmFjZSBzcGVjaWZpY2F0aW9uLgorICogCisgKiBDb3B5cmlnaHQgMjAw MiBBbmRpIEtsZWVuLCBTdVNFIExhYnMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+ CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9hZ3BfYmFja2VuZC5o PgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1 ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVk ZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGlu dXgvdG9wb2xvZ3kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxs aW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisjaW5jbHVkZSA8YXNtL2lv Lmg+CisjaW5jbHVkZSA8YXNtL210cnIuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2lu Y2x1ZGUgPGFzbS9wcm90by5oPgorI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CisjaW5jbHVk ZSA8YXNtL2tkZWJ1Zy5oPgorI2luY2x1ZGUgPGFzbS9zd2lvdGxiLmg+CisjaW5jbHVkZSA8YXNt L2RtYS5oPgorI2luY2x1ZGUgPGFzbS9rOC5oPgorCit1bnNpZ25lZCBsb25nIGlvbW11X2J1c19i YXNlOwkvKiBHQVJUIHJlbWFwcGluZyBhcmVhIChwaHlzaWNhbCkgKi8KK3N0YXRpYyB1bnNpZ25l ZCBsb25nIGlvbW11X3NpemU7IAkvKiBzaXplIG9mIHJlbWFwcGluZyBhcmVhIGJ5dGVzICovCitz dGF0aWMgdW5zaWduZWQgbG9uZyBpb21tdV9wYWdlczsJLyogLi4gYW5kIGluIHBhZ2VzICovCisK K3UzMiAqaW9tbXVfZ2F0dF9iYXNlOyAJCS8qIFJlbWFwcGluZyB0YWJsZSAqLworCisvKiBJZiB0 aGlzIGlzIGRpc2FibGVkIHRoZSBJT01NVSB3aWxsIHVzZSBhbiBvcHRpbWl6ZWQgZmx1c2hpbmcg c3RyYXRlZ3kKKyAgIG9mIG9ubHkgZmx1c2hpbmcgd2hlbiBhbiBtYXBwaW5nIGlzIHJldXNlZC4g V2l0aCBpdCB0cnVlIHRoZSBHQVJUIGlzIGZsdXNoZWQgCisgICBmb3IgZXZlcnkgbWFwcGluZy4g UHJvYmxlbSBpcyB0aGF0IGRvaW5nIHRoZSBsYXp5IGZsdXNoIHNlZW1zIHRvIHRyaWdnZXIKKyAg IGJ1Z3Mgd2l0aCBzb21lIHBvcHVsYXIgUENJIGNhcmRzLCBpbiBwYXJ0aWN1bGFyIDN3YXJlIChi dXQgaGFzIGJlZW4gYWxzbworICAgYWxzbyBzZWVuIHdpdGggUWxvZ2ljIGF0IGxlYXN0KS4gKi8K K2ludCBpb21tdV9mdWxsZmx1c2ggPSAxOworCisvKiBBbGxvY2F0aW9uIGJpdG1hcCBmb3IgdGhl IHJlbWFwcGluZyBhcmVhICovIAorc3RhdGljIERFRklORV9TUElOTE9DSyhpb21tdV9iaXRtYXBf bG9jayk7CitzdGF0aWMgdW5zaWduZWQgbG9uZyAqaW9tbXVfZ2FydF9iaXRtYXA7IC8qIGd1YXJk ZWQgYnkgaW9tbXVfYml0bWFwX2xvY2sgKi8KKworc3RhdGljIHUzMiBnYXJ0X3VubWFwcGVkX2Vu dHJ5OyAKKworI2RlZmluZSBHUFRFX1ZBTElEICAgIDEKKyNkZWZpbmUgR1BURV9DT0hFUkVOVCAy CisjZGVmaW5lIEdQVEVfRU5DT0RFKHgpIFwKKwkoKCh4KSAmIDB4ZmZmZmYwMDApIHwgKCgoeCkg Pj4gMzIpIDw8IDQpIHwgR1BURV9WQUxJRCB8IEdQVEVfQ09IRVJFTlQpCisjZGVmaW5lIEdQVEVf REVDT0RFKHgpICgoKHgpICYgMHhmZmZmZjAwMCkgfCAoKCh1NjQpKHgpICYgMHhmZjApIDw8IDI4 KSkKKworI2RlZmluZSB0b19wYWdlcyhhZGRyLHNpemUpIFwKKwkocm91bmRfdXAoKChhZGRyKSAm IH5QQUdFX01BU0spICsgKHNpemUpLCBQQUdFX1NJWkUpID4+IFBBR0VfU0hJRlQpCisKKyNkZWZp bmUgRU1FUkdFTkNZX1BBR0VTIDMyIC8qID0gMTI4S0IgKi8gCisKKyNpZmRlZiBDT05GSUdfQUdQ CisjZGVmaW5lIEFHUEVYVEVSTiBleHRlcm4KKyNlbHNlCisjZGVmaW5lIEFHUEVYVEVSTgorI2Vu ZGlmCisKKy8qIGJhY2tkb29yIGludGVyZmFjZSB0byBBR1AgZHJpdmVyICovCitBR1BFWFRFUk4g aW50IGFncF9tZW1vcnlfcmVzZXJ2ZWQ7CitBR1BFWFRFUk4gX191MzIgKmFncF9nYXR0X3RhYmxl OworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBuZXh0X2JpdDsgIC8qIHByb3RlY3RlZCBieSBpb21t dV9iaXRtYXBfbG9jayAqLworc3RhdGljIGludCBuZWVkX2ZsdXNoOyAJCS8qIGdsb2JhbCBmbHVz aCBzdGF0ZS4gc2V0IGZvciBlYWNoIGdhcnQgd3JhcCAqLworCitzdGF0aWMgdW5zaWduZWQgbG9u ZyBhbGxvY19pb21tdShpbnQgc2l6ZSkgCit7IAkKKwl1bnNpZ25lZCBsb25nIG9mZnNldCwgZmxh Z3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW9tbXVfYml0bWFwX2xvY2ssIGZsYWdzKTsJCisJ b2Zmc2V0ID0gZmluZF9uZXh0X3plcm9fc3RyaW5nKGlvbW11X2dhcnRfYml0bWFwLG5leHRfYml0 LGlvbW11X3BhZ2VzLHNpemUpOworCWlmIChvZmZzZXQgPT0gLTEpIHsKKwkJbmVlZF9mbHVzaCA9 IDE7CisJCW9mZnNldCA9IGZpbmRfbmV4dF96ZXJvX3N0cmluZyhpb21tdV9nYXJ0X2JpdG1hcCww LGlvbW11X3BhZ2VzLHNpemUpOworCX0KKwlpZiAob2Zmc2V0ICE9IC0xKSB7IAorCQlzZXRfYml0 X3N0cmluZyhpb21tdV9nYXJ0X2JpdG1hcCwgb2Zmc2V0LCBzaXplKTsgCisJCW5leHRfYml0ID0g b2Zmc2V0K3NpemU7IAorCQlpZiAobmV4dF9iaXQgPj0gaW9tbXVfcGFnZXMpIHsgCisJCQluZXh0 X2JpdCA9IDA7CisJCQluZWVkX2ZsdXNoID0gMTsKKwkJfSAKKwl9IAorCWlmIChpb21tdV9mdWxs Zmx1c2gpCisJCW5lZWRfZmx1c2ggPSAxOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvbW11 X2JpdG1hcF9sb2NrLCBmbGFncyk7ICAgICAgCisJcmV0dXJuIG9mZnNldDsKK30gCisKK3N0YXRp YyB2b2lkIGZyZWVfaW9tbXUodW5zaWduZWQgbG9uZyBvZmZzZXQsIGludCBzaXplKQoreyAKKwl1 bnNpZ25lZCBsb25nIGZsYWdzOworCXNwaW5fbG9ja19pcnFzYXZlKCZpb21tdV9iaXRtYXBfbG9j aywgZmxhZ3MpOworCV9fY2xlYXJfYml0X3N0cmluZyhpb21tdV9nYXJ0X2JpdG1hcCwgb2Zmc2V0 LCBzaXplKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb21tdV9iaXRtYXBfbG9jaywgZmxh Z3MpOworfSAKKworLyogCisgKiBVc2UgZ2xvYmFsIGZsdXNoIHN0YXRlIHRvIGF2b2lkIHJhY2Vz IHdpdGggbXVsdGlwbGUgZmx1c2hlcnMuCisgKi8KK3N0YXRpYyB2b2lkIGZsdXNoX2dhcnQodm9p ZCkKK3sgCisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW9tbXVf Yml0bWFwX2xvY2ssIGZsYWdzKTsKKwlpZiAobmVlZF9mbHVzaCkgeworCQlrOF9mbHVzaF9nYXJ0 cygpOworCQluZWVkX2ZsdXNoID0gMDsKKwl9IAorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlv bW11X2JpdG1hcF9sb2NrLCBmbGFncyk7Cit9IAorCisjaWZkZWYgQ09ORklHX0lPTU1VX0xFQUsK KworI2RlZmluZSBTRVRfTEVBSyh4KSBpZiAoaW9tbXVfbGVha190YWIpIFwKKwkJCWlvbW11X2xl YWtfdGFiW3hdID0gX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApOworI2RlZmluZSBDTEVBUl9M RUFLKHgpIGlmIChpb21tdV9sZWFrX3RhYikgXAorCQkJaW9tbXVfbGVha190YWJbeF0gPSBOVUxM OworCisvKiBEZWJ1Z2dpbmcgYWlkIGZvciBkcml2ZXJzIHRoYXQgZG9uJ3QgZnJlZSB0aGVpciBJ T01NVSB0YWJsZXMgKi8KK3N0YXRpYyB2b2lkICoqaW9tbXVfbGVha190YWI7IAorc3RhdGljIGlu dCBsZWFrX3RyYWNlOworaW50IGlvbW11X2xlYWtfcGFnZXMgPSAyMDsgCit2b2lkIGR1bXBfbGVh ayh2b2lkKQoreworCWludCBpOworCXN0YXRpYyBpbnQgZHVtcDsgCisJaWYgKGR1bXAgfHwgIWlv bW11X2xlYWtfdGFiKSByZXR1cm47CisJZHVtcCA9IDE7CisJc2hvd19zdGFjayhOVUxMLE5VTEwp OworCS8qIFZlcnkgY3J1ZGUuIGR1bXAgc29tZSBmcm9tIHRoZSBlbmQgb2YgdGhlIHRhYmxlIHRv byAqLyAKKwlwcmludGsoIkR1bXBpbmcgJWQgcGFnZXMgZnJvbSBlbmQgb2YgSU9NTVU6XG4iLCBp b21tdV9sZWFrX3BhZ2VzKTsgCisJZm9yIChpID0gMDsgaSA8IGlvbW11X2xlYWtfcGFnZXM7IGkr PTIpIHsKKwkJcHJpbnRrKCIlbHU6ICIsIGlvbW11X3BhZ2VzLWkpOworCQlwcmludGtfYWRkcmVz cygodW5zaWduZWQgbG9uZykgaW9tbXVfbGVha190YWJbaW9tbXVfcGFnZXMtaV0pOworCQlwcmlu dGsoIiVjIiwgKGkrMSklMiA9PSAwID8gJ1xuJyA6ICcgJyk7IAorCX0gCisJcHJpbnRrKCJcbiIp OworfQorI2Vsc2UKKyNkZWZpbmUgU0VUX0xFQUsoeCkKKyNkZWZpbmUgQ0xFQVJfTEVBSyh4KQor I2VuZGlmCisKK3N0YXRpYyB2b2lkIGlvbW11X2Z1bGwoc3RydWN0IGRldmljZSAqZGV2LCBzaXpl X3Qgc2l6ZSwgaW50IGRpcikKK3sKKwkvKiAKKwkgKiBSYW4gb3V0IG9mIElPTU1VIHNwYWNlIGZv ciB0aGlzIG9wZXJhdGlvbi4gVGhpcyBpcyB2ZXJ5IGJhZC4KKwkgKiBVbmZvcnR1bmF0ZWx5IHRo ZSBkcml2ZXJzIGNhbm5vdCBoYW5kbGUgdGhpcyBvcGVyYXRpb24gcHJvcGVybHkuCisJICogUmV0 dXJuIHNvbWUgbm9uIG1hcHBlZCBwcmVyZXNlcnZlZCBzcGFjZSBpbiB0aGUgYXBlcnR1cmUgYW5k IAorCSAqIGxldCB0aGUgTm9ydGhicmlkZ2UgZGVhbCB3aXRoIGl0LiBUaGlzIHdpbGwgcmVzdWx0 IGluIGdhcmJhZ2UKKwkgKiBpbiB0aGUgSU8gb3BlcmF0aW9uLiBXaGVuIHRoZSBzaXplIGV4Y2Vl ZHMgdGhlIHByZXJlc2VydmVkIHNwYWNlCisJICogbWVtb3J5IGNvcnJ1cHRpb24gd2lsbCBvY2N1 ciBvciByYW5kb20gbWVtb3J5IHdpbGwgYmUgRE1BZWQgCisJICogb3V0LiBIb3BlZnVsbHkgbm8g bmV0d29yayBkZXZpY2VzIHVzZSBzaW5nbGUgbWFwcGluZ3MgdGhhdCBiaWcuCisJICovIAorCQor CXByaW50ayhLRVJOX0VSUiAKKyAgIlBDSS1ETUE6IE91dCBvZiBJT01NVSBzcGFjZSBmb3IgJWx1 IGJ5dGVzIGF0IGRldmljZSAlc1xuIiwKKwkgICAgICAgc2l6ZSwgZGV2LT5idXNfaWQpOworCisJ aWYgKHNpemUgPiBQQUdFX1NJWkUqRU1FUkdFTkNZX1BBR0VTKSB7CisJCWlmIChkaXIgPT0gUENJ X0RNQV9GUk9NREVWSUNFIHx8IGRpciA9PSBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpCisJCQlwYW5p YygiUENJLURNQTogTWVtb3J5IHdvdWxkIGJlIGNvcnJ1cHRlZFxuIik7CisJCWlmIChkaXIgPT0g UENJX0RNQV9UT0RFVklDRSB8fCBkaXIgPT0gUENJX0RNQV9CSURJUkVDVElPTkFMKSAKKwkJCXBh bmljKEtFUk5fRVJSICJQQ0ktRE1BOiBSYW5kb20gbWVtb3J5IHdvdWxkIGJlIERNQWVkXG4iKTsK Kwl9IAorCisjaWZkZWYgQ09ORklHX0lPTU1VX0xFQUsKKwlkdW1wX2xlYWsoKTsgCisjZW5kaWYK K30gCisKK3N0YXRpYyBpbmxpbmUgaW50IG5lZWRfaW9tbXUoc3RydWN0IGRldmljZSAqZGV2LCB1 bnNpZ25lZCBsb25nIGFkZHIsIHNpemVfdCBzaXplKQoreyAKKwl1NjQgbWFzayA9ICpkZXYtPmRt YV9tYXNrOworCWludCBoaWdoID0gYWRkciArIHNpemUgPj0gbWFzazsKKwlpbnQgbW11ID0gaGln aDsKKwlpZiAoZm9yY2VfaW9tbXUpIAorCQltbXUgPSAxOyAKKwlyZXR1cm4gbW11OyAKK30KKwor c3RhdGljIGlubGluZSBpbnQgbm9uZm9yY2VkX2lvbW11KHN0cnVjdCBkZXZpY2UgKmRldiwgdW5z aWduZWQgbG9uZyBhZGRyLCBzaXplX3Qgc2l6ZSkKK3sgCisJdTY0IG1hc2sgPSAqZGV2LT5kbWFf bWFzazsKKwlpbnQgaGlnaCA9IGFkZHIgKyBzaXplID49IG1hc2s7CisJaW50IG1tdSA9IGhpZ2g7 CisJcmV0dXJuIG1tdTsgCit9CisKKy8qIE1hcCBhIHNpbmdsZSBjb250aW51b3VzIHBoeXNpY2Fs IGFyZWEgaW50byB0aGUgSU9NTVUuCisgKiBDYWxsZXIgbmVlZHMgdG8gY2hlY2sgaWYgdGhlIGlv bW11IGlzIG5lZWRlZCBhbmQgZmx1c2guCisgKi8KK3N0YXRpYyBkbWFfYWRkcl90IGRtYV9tYXBf YXJlYShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgcGh5c19tZW0sCisJCQkJc2l6ZV90 IHNpemUsIGludCBkaXIpCit7IAorCXVuc2lnbmVkIGxvbmcgbnBhZ2VzID0gdG9fcGFnZXMocGh5 c19tZW0sIHNpemUpOworCXVuc2lnbmVkIGxvbmcgaW9tbXVfcGFnZSA9IGFsbG9jX2lvbW11KG5w YWdlcyk7CisJaW50IGk7CisJaWYgKGlvbW11X3BhZ2UgPT0gLTEpIHsKKwkJaWYgKCFub25mb3Jj ZWRfaW9tbXUoZGV2LCBwaHlzX21lbSwgc2l6ZSkpCisJCQlyZXR1cm4gcGh5c19tZW07IAorCQlp ZiAocGFuaWNfb25fb3ZlcmZsb3cpCisJCQlwYW5pYygiZG1hX21hcF9hcmVhIG92ZXJmbG93ICVs dSBieXRlc1xuIiwgc2l6ZSk7CisJCWlvbW11X2Z1bGwoZGV2LCBzaXplLCBkaXIpOworCQlyZXR1 cm4gYmFkX2RtYV9hZGRyZXNzOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBucGFnZXM7IGkrKykg eworCQlpb21tdV9nYXR0X2Jhc2VbaW9tbXVfcGFnZSArIGldID0gR1BURV9FTkNPREUocGh5c19t ZW0pOworCQlTRVRfTEVBSyhpb21tdV9wYWdlICsgaSk7CisJCXBoeXNfbWVtICs9IFBBR0VfU0la RTsKKwl9CisJcmV0dXJuIGlvbW11X2J1c19iYXNlICsgaW9tbXVfcGFnZSpQQUdFX1NJWkUgKyAo cGh5c19tZW0gJiB+UEFHRV9NQVNLKTsKK30KKworc3RhdGljIGRtYV9hZGRyX3QgZ2FydF9tYXBf c2ltcGxlKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLAorCQkJCSBzaXplX3Qgc2l6ZSwg aW50IGRpcikKK3sKKwlkbWFfYWRkcl90IG1hcCA9IGRtYV9tYXBfYXJlYShkZXYsIHZpcnRfdG9f YnVzKGJ1ZiksIHNpemUsIGRpcik7CisJZmx1c2hfZ2FydCgpOworCXJldHVybiBtYXA7Cit9CisK Ky8qIE1hcCBhIHNpbmdsZSBhcmVhIGludG8gdGhlIElPTU1VICovCitkbWFfYWRkcl90IGdhcnRf bWFwX3NpbmdsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmFkZHIsIHNpemVfdCBzaXplLCBp bnQgZGlyKQoreworCXVuc2lnbmVkIGxvbmcgcGh5c19tZW0sIGJ1czsKKworCUJVR19PTihkaXIg PT0gRE1BX05PTkUpOworCisJaWYgKCFkZXYpCisJCWRldiA9ICZmYWxsYmFja19kZXY7CisKKwlw aHlzX21lbSA9IHZpcnRfdG9fYnVzKGFkZHIpOyAKKwlpZiAoIW5lZWRfaW9tbXUoZGV2LCBwaHlz X21lbSwgc2l6ZSkpCisJCXJldHVybiBwaHlzX21lbTsgCisKKwlidXMgPSBnYXJ0X21hcF9zaW1w bGUoZGV2LCBhZGRyLCBzaXplLCBkaXIpOworCXJldHVybiBidXM7IAorfQorCisvKgorICogRnJl ZSBhIERNQSBtYXBwaW5nLgorICovCit2b2lkIGdhcnRfdW5tYXBfc2luZ2xlKHN0cnVjdCBkZXZp Y2UgKmRldiwgZG1hX2FkZHJfdCBkbWFfYWRkciwKKwkJICAgICAgc2l6ZV90IHNpemUsIGludCBk aXJlY3Rpb24pCit7CisJdW5zaWduZWQgbG9uZyBpb21tdV9wYWdlOworCWludCBucGFnZXM7CisJ aW50IGk7CisKKwlpZiAoZG1hX2FkZHIgPCBpb21tdV9idXNfYmFzZSArIEVNRVJHRU5DWV9QQUdF UypQQUdFX1NJWkUgfHwKKwkgICAgZG1hX2FkZHIgPj0gaW9tbXVfYnVzX2Jhc2UgKyBpb21tdV9z aXplKQorCQlyZXR1cm47CisJaW9tbXVfcGFnZSA9IChkbWFfYWRkciAtIGlvbW11X2J1c19iYXNl KT4+UEFHRV9TSElGVDsKKwlucGFnZXMgPSB0b19wYWdlcyhkbWFfYWRkciwgc2l6ZSk7CisJZm9y IChpID0gMDsgaSA8IG5wYWdlczsgaSsrKSB7CisJCWlvbW11X2dhdHRfYmFzZVtpb21tdV9wYWdl ICsgaV0gPSBnYXJ0X3VubWFwcGVkX2VudHJ5OworCQlDTEVBUl9MRUFLKGlvbW11X3BhZ2UgKyBp KTsKKwl9CisJZnJlZV9pb21tdShpb21tdV9wYWdlLCBucGFnZXMpOworfQorCisvKgorICogV3Jh cHBlciBmb3IgcGNpX3VubWFwX3NpbmdsZSB3b3JraW5nIHdpdGggc2NhdHRlcmxpc3RzLgorICov Cit2b2lkIGdhcnRfdW5tYXBfc2coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxp c3QgKnNnLCBpbnQgbmVudHMsIGludCBkaXIpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBp IDwgbmVudHM7IGkrKykgeworCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnMgPSAmc2dbaV07CisJCWlm ICghcy0+ZG1hX2xlbmd0aCB8fCAhcy0+bGVuZ3RoKQorCQkJYnJlYWs7CisJCWdhcnRfdW5tYXBf c2luZ2xlKGRldiwgcy0+ZG1hX2FkZHJlc3MsIHMtPmRtYV9sZW5ndGgsIGRpcik7CisJfQorfQor CisvKiBGYWxsYmFjayBmb3IgZG1hX21hcF9zZyBpbiBjYXNlIG9mIG92ZXJmbG93ICovCitzdGF0 aWMgaW50IGRtYV9tYXBfc2dfbm9uZm9yY2Uoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2Nh dHRlcmxpc3QgKnNnLAorCQkJICAgICAgIGludCBuZW50cywgaW50IGRpcikKK3sKKwlpbnQgaTsK KworI2lmZGVmIENPTkZJR19JT01NVV9ERUJVRworCXByaW50ayhLRVJOX0RFQlVHICJkbWFfbWFw X3NnIG92ZXJmbG93XG4iKTsKKyNlbmRpZgorCisgCWZvciAoaSA9IDA7IGkgPCBuZW50czsgaSsr ICkgeworCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnMgPSAmc2dbaV07CisJCXVuc2lnbmVkIGxvbmcg YWRkciA9IHBhZ2VfdG9fcGh5cyhzLT5wYWdlKSArIHMtPm9mZnNldDsgCisJCWlmIChub25mb3Jj ZWRfaW9tbXUoZGV2LCBhZGRyLCBzLT5sZW5ndGgpKSB7IAorCQkJYWRkciA9IGRtYV9tYXBfYXJl YShkZXYsIGFkZHIsIHMtPmxlbmd0aCwgZGlyKTsKKwkJCWlmIChhZGRyID09IGJhZF9kbWFfYWRk cmVzcykgeyAKKwkJCQlpZiAoaSA+IDApIAorCQkJCQlnYXJ0X3VubWFwX3NnKGRldiwgc2csIGks IGRpcik7CisJCQkJbmVudHMgPSAwOyAKKwkJCQlzZ1swXS5kbWFfbGVuZ3RoID0gMDsKKwkJCQli cmVhazsKKwkJCX0KKwkJfQorCQlzLT5kbWFfYWRkcmVzcyA9IGFkZHI7CisJCXMtPmRtYV9sZW5n dGggPSBzLT5sZW5ndGg7CisJfQorCWZsdXNoX2dhcnQoKTsKKwlyZXR1cm4gbmVudHM7Cit9CisK Ky8qIE1hcCBtdWx0aXBsZSBzY2F0dGVybGlzdCBlbnRyaWVzIGNvbnRpbnVvdXMgaW50byB0aGUg Zmlyc3QuICovCitzdGF0aWMgaW50IF9fZG1hX21hcF9jb250KHN0cnVjdCBzY2F0dGVybGlzdCAq c2csIGludCBzdGFydCwgaW50IHN0b3BhdCwKKwkJICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpz b3V0LCB1bnNpZ25lZCBsb25nIHBhZ2VzKQoreworCXVuc2lnbmVkIGxvbmcgaW9tbXVfc3RhcnQg PSBhbGxvY19pb21tdShwYWdlcyk7CisJdW5zaWduZWQgbG9uZyBpb21tdV9wYWdlID0gaW9tbXVf c3RhcnQ7IAorCWludCBpOworCisJaWYgKGlvbW11X3N0YXJ0ID09IC0xKQorCQlyZXR1cm4gLTE7 CisJCisJZm9yIChpID0gc3RhcnQ7IGkgPCBzdG9wYXQ7IGkrKykgeworCQlzdHJ1Y3Qgc2NhdHRl cmxpc3QgKnMgPSAmc2dbaV07CisJCXVuc2lnbmVkIGxvbmcgcGFnZXMsIGFkZHI7CisJCXVuc2ln bmVkIGxvbmcgcGh5c19hZGRyID0gcy0+ZG1hX2FkZHJlc3M7CisJCQorCQlCVUdfT04oaSA+IHN0 YXJ0ICYmIHMtPm9mZnNldCk7CisJCWlmIChpID09IHN0YXJ0KSB7CisJCQkqc291dCA9ICpzOyAK KwkJCXNvdXQtPmRtYV9hZGRyZXNzID0gaW9tbXVfYnVzX2Jhc2U7CisJCQlzb3V0LT5kbWFfYWRk cmVzcyArPSBpb21tdV9wYWdlKlBBR0VfU0laRSArIHMtPm9mZnNldDsKKwkJCXNvdXQtPmRtYV9s ZW5ndGggPSBzLT5sZW5ndGg7CisJCX0gZWxzZSB7IAorCQkJc291dC0+ZG1hX2xlbmd0aCArPSBz LT5sZW5ndGg7IAorCQl9CisKKwkJYWRkciA9IHBoeXNfYWRkcjsKKwkJcGFnZXMgPSB0b19wYWdl cyhzLT5vZmZzZXQsIHMtPmxlbmd0aCk7IAorCQl3aGlsZSAocGFnZXMtLSkgeyAKKwkJCWlvbW11 X2dhdHRfYmFzZVtpb21tdV9wYWdlXSA9IEdQVEVfRU5DT0RFKGFkZHIpOyAKKwkJCVNFVF9MRUFL KGlvbW11X3BhZ2UpOworCQkJYWRkciArPSBQQUdFX1NJWkU7CisJCQlpb21tdV9wYWdlKys7CisJ CX0KKwl9IAorCUJVR19PTihpb21tdV9wYWdlIC0gaW9tbXVfc3RhcnQgIT0gcGFnZXMpOwkKKwly ZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgZG1hX21hcF9jb250KHN0cnVjdCBzY2F0 dGVybGlzdCAqc2csIGludCBzdGFydCwgaW50IHN0b3BhdCwKKwkJICAgICAgc3RydWN0IHNjYXR0 ZXJsaXN0ICpzb3V0LAorCQkgICAgICB1bnNpZ25lZCBsb25nIHBhZ2VzLCBpbnQgbmVlZCkKK3sK KwlpZiAoIW5lZWQpIHsgCisJCUJVR19PTihzdG9wYXQgLSBzdGFydCAhPSAxKTsKKwkJKnNvdXQg PSBzZ1tzdGFydF07IAorCQlzb3V0LT5kbWFfbGVuZ3RoID0gc2dbc3RhcnRdLmxlbmd0aDsgCisJ CXJldHVybiAwOworCX0gCisJcmV0dXJuIF9fZG1hX21hcF9jb250KHNnLCBzdGFydCwgc3RvcGF0 LCBzb3V0LCBwYWdlcyk7Cit9CisJCQorLyoKKyAqIERNQSBtYXAgYWxsIGVudHJpZXMgaW4gYSBz Y2F0dGVybGlzdC4KKyAqIE1lcmdlIGNodW5rcyB0aGF0IGhhdmUgcGFnZSBhbGlnbmVkIHNpemVz IGludG8gYSBjb250aW51b3VzIG1hcHBpbmcuIAorICovCitpbnQgZ2FydF9tYXBfc2coc3RydWN0 IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCBpbnQgbmVudHMsIGludCBkaXIp Cit7CisJaW50IGk7CisJaW50IG91dDsKKwlpbnQgc3RhcnQ7CisJdW5zaWduZWQgbG9uZyBwYWdl cyA9IDA7CisJaW50IG5lZWQgPSAwLCBuZXh0bmVlZDsKKworCUJVR19PTihkaXIgPT0gRE1BX05P TkUpOworCWlmIChuZW50cyA9PSAwKSAKKwkJcmV0dXJuIDA7CisKKwlpZiAoIWRldikKKwkJZGV2 ID0gJmZhbGxiYWNrX2RldjsKKworCW91dCA9IDA7CisJc3RhcnQgPSAwOworCWZvciAoaSA9IDA7 IGkgPCBuZW50czsgaSsrKSB7CisJCXN0cnVjdCBzY2F0dGVybGlzdCAqcyA9ICZzZ1tpXTsKKwkJ ZG1hX2FkZHJfdCBhZGRyID0gcGFnZV90b19waHlzKHMtPnBhZ2UpICsgcy0+b2Zmc2V0OworCQlz LT5kbWFfYWRkcmVzcyA9IGFkZHI7CisJCUJVR19PTihzLT5sZW5ndGggPT0gMCk7IAorCisJCW5l eHRuZWVkID0gbmVlZF9pb21tdShkZXYsIGFkZHIsIHMtPmxlbmd0aCk7IAorCisJCS8qIEhhbmRs ZSB0aGUgcHJldmlvdXMgbm90IHlldCBwcm9jZXNzZWQgZW50cmllcyAqLworCQlpZiAoaSA+IHN0 YXJ0KSB7CisJCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnBzID0gJnNnW2ktMV07CisJCQkvKiBDYW4g b25seSBtZXJnZSB3aGVuIHRoZSBsYXN0IGNodW5rIGVuZHMgb24gYSBwYWdlIAorCQkJICAgYm91 bmRhcnkgYW5kIHRoZSBuZXcgb25lIGRvZXNuJ3QgaGF2ZSBhbiBvZmZzZXQuICovCisJCQlpZiAo IWlvbW11X21lcmdlIHx8ICFuZXh0bmVlZCB8fCAhbmVlZCB8fCBzLT5vZmZzZXQgfHwKKwkJCSAg ICAocHMtPm9mZnNldCArIHBzLT5sZW5ndGgpICUgUEFHRV9TSVpFKSB7IAorCQkJCWlmIChkbWFf bWFwX2NvbnQoc2csIHN0YXJ0LCBpLCBzZytvdXQsIHBhZ2VzLAorCQkJCQkJIG5lZWQpIDwgMCkK KwkJCQkJZ290byBlcnJvcjsKKwkJCQlvdXQrKzsKKwkJCQlwYWdlcyA9IDA7CisJCQkJc3RhcnQg PSBpOwkKKwkJCX0KKwkJfQorCisJCW5lZWQgPSBuZXh0bmVlZDsKKwkJcGFnZXMgKz0gdG9fcGFn ZXMocy0+b2Zmc2V0LCBzLT5sZW5ndGgpOworCX0KKwlpZiAoZG1hX21hcF9jb250KHNnLCBzdGFy dCwgaSwgc2crb3V0LCBwYWdlcywgbmVlZCkgPCAwKQorCQlnb3RvIGVycm9yOworCW91dCsrOwor CWZsdXNoX2dhcnQoKTsKKwlpZiAob3V0IDwgbmVudHMpIAorCQlzZ1tvdXRdLmRtYV9sZW5ndGgg PSAwOyAKKwlyZXR1cm4gb3V0OworCitlcnJvcjoKKwlmbHVzaF9nYXJ0KCk7CisJZ2FydF91bm1h cF9zZyhkZXYsIHNnLCBuZW50cywgZGlyKTsKKwkvKiBXaGVuIGl0IHdhcyBmb3JjZWQgb3IgbWVy Z2VkIHRyeSBhZ2FpbiBpbiBhIGR1bWIgd2F5ICovCisJaWYgKGZvcmNlX2lvbW11IHx8IGlvbW11 X21lcmdlKSB7CisJCW91dCA9IGRtYV9tYXBfc2dfbm9uZm9yY2UoZGV2LCBzZywgbmVudHMsIGRp cik7CisJCWlmIChvdXQgPiAwKQorCQkJcmV0dXJuIG91dDsKKwl9CisJaWYgKHBhbmljX29uX292 ZXJmbG93KQorCQlwYW5pYygiZG1hX21hcF9zZzogb3ZlcmZsb3cgb24gJWx1IHBhZ2VzXG4iLCBw YWdlcyk7CisJaW9tbXVfZnVsbChkZXYsIHBhZ2VzIDw8IFBBR0VfU0hJRlQsIGRpcik7CisJZm9y IChpID0gMDsgaSA8IG5lbnRzOyBpKyspCisJCXNnW2ldLmRtYV9hZGRyZXNzID0gYmFkX2RtYV9h ZGRyZXNzOworCXJldHVybiAwOworfSAKKworc3RhdGljIGludCBub19hZ3A7CisKK3N0YXRpYyBf X2luaXQgdW5zaWduZWQgbG9uZyBjaGVja19pb21tdV9zaXplKHVuc2lnbmVkIGxvbmcgYXBlciwg dTY0IGFwZXJfc2l6ZSkKK3sgCisJdW5zaWduZWQgbG9uZyBhOyAKKwlpZiAoIWlvbW11X3NpemUp IHsgCisJCWlvbW11X3NpemUgPSBhcGVyX3NpemU7IAorCQlpZiAoIW5vX2FncCkgCisJCQlpb21t dV9zaXplIC89IDI7IAorCX0gCisKKwlhID0gYXBlciArIGlvbW11X3NpemU7IAorCWlvbW11X3Np emUgLT0gcm91bmRfdXAoYSwgTEFSR0VfUEFHRV9TSVpFKSAtIGE7CisKKwlpZiAoaW9tbXVfc2l6 ZSA8IDY0KjEwMjQqMTAyNCkgCisJCXByaW50ayhLRVJOX1dBUk5JTkcKKyAgIlBDSS1ETUE6IFdh cm5pbmc6IFNtYWxsIElPTU1VICVsdU1CLiBDb25zaWRlciBpbmNyZWFzaW5nIHRoZSBBR1AgYXBl cnR1cmUgaW4gQklPU1xuIixpb21tdV9zaXplPj4yMCk7IAorCQorCXJldHVybiBpb21tdV9zaXpl OworfSAKKworc3RhdGljIF9faW5pdCB1bnNpZ25lZCByZWFkX2FwZXJ0dXJlKHN0cnVjdCBwY2lf ZGV2ICpkZXYsIHUzMiAqc2l6ZSkgCit7IAorCXVuc2lnbmVkIGFwZXJfc2l6ZSA9IDAsIGFwZXJf YmFzZV8zMjsKKwl1NjQgYXBlcl9iYXNlOworCXVuc2lnbmVkIGFwZXJfb3JkZXI7CisKKwlwY2lf cmVhZF9jb25maWdfZHdvcmQoZGV2LCAweDk0LCAmYXBlcl9iYXNlXzMyKTsgCisJcGNpX3JlYWRf Y29uZmlnX2R3b3JkKGRldiwgMHg5MCwgJmFwZXJfb3JkZXIpOworCWFwZXJfb3JkZXIgPSAoYXBl cl9vcmRlciA+PiAxKSAmIDc7CQorCisJYXBlcl9iYXNlID0gYXBlcl9iYXNlXzMyICYgMHg3ZmZm OyAKKwlhcGVyX2Jhc2UgPDw9IDI1OworCisJYXBlcl9zaXplID0gKDMyICogMTAyNCAqIDEwMjQp IDw8IGFwZXJfb3JkZXI7IAorCWlmIChhcGVyX2Jhc2UgKyBhcGVyX3NpemUgPj0gMHhmZmZmZmZm ZiB8fCAhYXBlcl9zaXplKQorCQlhcGVyX2Jhc2UgPSAwOworCisJKnNpemUgPSBhcGVyX3NpemU7 CisJcmV0dXJuIGFwZXJfYmFzZTsKK30gCisKKy8qIAorICogUHJpdmF0ZSBOb3J0aGJyaWRnZSBH QVRUIGluaXRpYWxpemF0aW9uIGluIGNhc2Ugd2UgY2Fubm90IHVzZSB0aGUKKyAqIEFHUCBkcml2 ZXIgZm9yIHNvbWUgcmVhc29uLiAgCisgKi8KK3N0YXRpYyBfX2luaXQgaW50IGluaXRfazhfZ2F0 dChzdHJ1Y3QgYWdwX2tlcm5faW5mbyAqaW5mbykKK3sgCisJc3RydWN0IHBjaV9kZXYgKmRldjsK Kwl2b2lkICpnYXR0OworCXVuc2lnbmVkIGFwZXJfYmFzZSwgbmV3X2FwZXJfYmFzZTsKKwl1bnNp Z25lZCBhcGVyX3NpemUsIGdhdHRfc2l6ZSwgbmV3X2FwZXJfc2l6ZTsKKwlpbnQgaTsKKworCXBy aW50ayhLRVJOX0lORk8gIlBDSS1ETUE6IERpc2FibGluZyBBR1AuXG4iKTsKKwlhcGVyX3NpemUg PSBhcGVyX2Jhc2UgPSBpbmZvLT5hcGVyX3NpemUgPSAwOworCWRldiA9IE5VTEw7CisJZm9yIChp ID0gMDsgaSA8IG51bV9rOF9ub3J0aGJyaWRnZXM7IGkrKykgeworCQlkZXYgPSBrOF9ub3J0aGJy aWRnZXNbaV07CisJCW5ld19hcGVyX2Jhc2UgPSByZWFkX2FwZXJ0dXJlKGRldiwgJm5ld19hcGVy X3NpemUpOyAKKwkJaWYgKCFuZXdfYXBlcl9iYXNlKSAKKwkJCWdvdG8gbm9tbXU7IAorCQkKKwkJ aWYgKCFhcGVyX2Jhc2UpIHsgCisJCQlhcGVyX3NpemUgPSBuZXdfYXBlcl9zaXplOworCQkJYXBl cl9iYXNlID0gbmV3X2FwZXJfYmFzZTsKKwkJfSAKKwkJaWYgKGFwZXJfc2l6ZSAhPSBuZXdfYXBl cl9zaXplIHx8IGFwZXJfYmFzZSAhPSBuZXdfYXBlcl9iYXNlKSAKKwkJCWdvdG8gbm9tbXU7CisJ fQorCWlmICghYXBlcl9iYXNlKQorCQlnb3RvIG5vbW11OyAKKwlpbmZvLT5hcGVyX2Jhc2UgPSBh cGVyX2Jhc2U7CisJaW5mby0+YXBlcl9zaXplID0gYXBlcl9zaXplPj4yMDsgCisKKwlnYXR0X3Np emUgPSAoYXBlcl9zaXplID4+IFBBR0VfU0hJRlQpICogc2l6ZW9mKHUzMik7IAorCWdhdHQgPSAo dm9pZCAqKV9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCwgZ2V0X29yZGVyKGdhdHRfc2l6ZSkp OyAKKwlpZiAoIWdhdHQpIAorCQlwYW5pYygiQ2Fubm90IGFsbG9jYXRlIEdBVFQgdGFibGUiKTsg CisjaWZkZWYgQ09ORklHX1hFTgorCWlmICh4ZW5fY3JlYXRlX2NvbnRpZ3VvdXNfcmVnaW9uKCh1 bnNpZ25lZCBsb25nKWdhdHQsIGdldF9vcmRlcihnYXR0X3NpemUpLCAzMSkpCisJCXBhbmljKCJD YW5ub3QgY3JlYXRlIGEgY29udGlndW91cyBtZW1vcnkgcmVnaW9uIGJlbG93IDRHQiBmb3IgdGhl IEdBVFQgdGFibGUiKTsKKyNlbmRpZgorCW1lbXNldChnYXR0LCAwLCBnYXR0X3NpemUpOyAKKwlh Z3BfZ2F0dF90YWJsZSA9IGdhdHQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2s4X25vcnRoYnJp ZGdlczsgaSsrKSB7CisJCXUzMiBjdGw7IAorCQl1MzIgZ2F0dF9yZWc7IAorCisJCWRldiA9IGs4 X25vcnRoYnJpZGdlc1tpXTsKKwkJZ2F0dF9yZWcgPSBwaHlzX3RvX21hY2hpbmUoX19wYShnYXR0 KSkgPj4gMTI7CisJCWdhdHRfcmVnIDw8PSA0OyAKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChk ZXYsIDB4OTgsIGdhdHRfcmVnKTsKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgMHg5MCwg JmN0bCk7IAorCisJCWN0bCB8PSAxOworCQljdGwgJj0gfigoMTw8NCkgfCAoMTw8NSkpOworCisJ CXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCAweDkwLCBjdGwpOyAKKwl9CisJZmx1c2hfZ2Fy dCgpOworCQorCXByaW50aygiUENJLURNQTogYXBlcnR1cmUgYmFzZSBAICV4IHNpemUgJXUgS0Jc biIsYXBlcl9iYXNlLCBhcGVyX3NpemU+PjEwKTsgCisJcmV0dXJuIDA7CisKKyBub21tdToKKyAJ LyogU2hvdWxkIG5vdCBoYXBwZW4gYW55bW9yZSAqLworCXByaW50ayhLRVJOX0VSUiAiUENJLURN QTogaW5pdCBrOF9nYXQgTW9yZSB0aGFuIDRHQiBvZiBSQU0gYW5kIG5vIElPTU1VXG4iCisJICAg ICAgIEtFUk5fRVJSICJQQ0ktRE1BOiAzMmJpdCBQQ0kgSU8gbWF5IG1hbGZ1bmN0aW9uLlxuIik7 CisJcmV0dXJuIC0xOyAKK30gCisKK2V4dGVybiBpbnQgYWdwX2FtZDY0X2luaXQodm9pZCk7CisK K3N0YXRpYyBzdHJ1Y3QgZG1hX21hcHBpbmdfb3BzIGdhcnRfZG1hX29wcyA9IHsKKwkubWFwcGlu Z19lcnJvciA9IE5VTEwsCisJLm1hcF9zaW5nbGUgPSBnYXJ0X21hcF9zaW5nbGUsCisJLm1hcF9z aW1wbGUgPSBnYXJ0X21hcF9zaW1wbGUsCisJLnVubWFwX3NpbmdsZSA9IGdhcnRfdW5tYXBfc2lu Z2xlLAorCS5zeW5jX3NpbmdsZV9mb3JfY3B1ID0gTlVMTCwKKwkuc3luY19zaW5nbGVfZm9yX2Rl dmljZSA9IE5VTEwsCisJLnN5bmNfc2luZ2xlX3JhbmdlX2Zvcl9jcHUgPSBOVUxMLAorCS5zeW5j X3NpbmdsZV9yYW5nZV9mb3JfZGV2aWNlID0gTlVMTCwKKwkuc3luY19zZ19mb3JfY3B1ID0gTlVM TCwKKwkuc3luY19zZ19mb3JfZGV2aWNlID0gTlVMTCwKKwkubWFwX3NnID0gZ2FydF9tYXBfc2cs CisJLnVubWFwX3NnID0gZ2FydF91bm1hcF9zZywKK307CisKK3ZvaWQgX19pbml0IGdhcnRfaW9t bXVfaW5pdCh2b2lkKQoreyAKKwlzdHJ1Y3QgYWdwX2tlcm5faW5mbyBpbmZvOworCXVuc2lnbmVk IGxvbmcgYXBlcl9zaXplOworCXVuc2lnbmVkIGxvbmcgaW9tbXVfc3RhcnQ7CisJdW5zaWduZWQg bG9uZyBzY3JhdGNoOworCWxvbmcgaTsKKworCWlmIChjYWNoZV9rOF9ub3J0aGJyaWRnZXMoKSA8 IDAgfHwgbnVtX2s4X25vcnRoYnJpZGdlcyA9PSAwKSB7CisJCXByaW50ayhLRVJOX0lORk8gIlBD SS1HQVJUOiBObyBBTUQgbm9ydGhicmlkZ2UgZm91bmQuXG4iKTsKKwkJcmV0dXJuOworCX0KKwor I2lmbmRlZiBDT05GSUdfQUdQX0FNRDY0CisJbm9fYWdwID0gMTsgCisjZWxzZQorCS8qIE1ha2Vm aWxlIHB1dHMgUENJIGluaXRpYWxpemF0aW9uIHZpYSBzdWJzeXNfaW5pdGNhbGwgZmlyc3QuICov CisJLyogQWRkIG90aGVyIEs4IEFHUCBicmlkZ2UgZHJpdmVycyBoZXJlICovCisJbm9fYWdwID0g bm9fYWdwIHx8IAorCQkoYWdwX2FtZDY0X2luaXQoKSA8IDApIHx8IAorCQkoYWdwX2NvcHlfaW5m byhhZ3BfYnJpZGdlLCAmaW5mbykgPCAwKTsKKyNlbmRpZgkKKworCWlmIChzd2lvdGxiKQorCQly ZXR1cm47CisKKwkvKiBEaWQgd2UgZGV0ZWN0IGEgZGlmZmVyZW50IEhXIElPTU1VPyAqLworCWlm IChpb21tdV9kZXRlY3RlZCAmJiAhaW9tbXVfYXBlcnR1cmUpCisJCXJldHVybjsKKworCWlmIChu b19pb21tdSB8fAorCSAgICAoIWZvcmNlX2lvbW11ICYmICFnbG9iYWxfbmVlZF9pb21tdSgpKSB8 fAorCSAgICAhaW9tbXVfYXBlcnR1cmUgfHwKKwkgICAgKG5vX2FncCAmJiBpbml0X2s4X2dhdHQo JmluZm8pIDwgMCkpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiUENJLURNQTogRGlzYWJsaW5nIElP TU1VLlxuIik7CisJCWlmIChnbG9iYWxfbmVlZF9pb21tdSgpKSB7CisJCQlwcmludGsoS0VSTl9F UlIgIldBUk5JTkcgbW9yZSB0aGFuIDRHQiBvZiBtZW1vcnkgIgorCQkJCQkiYnV0IElPTU1VIG5v dCBhdmFpbGFibGUuXG4iCisJCQkgICAgICAgS0VSTl9FUlIgIldBUk5JTkcgMzJiaXQgUENJIG1h eSBtYWxmdW5jdGlvbi5cbiIpOworCQl9CisJCXJldHVybjsKKwl9CisKKwlwcmludGsoS0VSTl9J TkZPICJQQ0ktRE1BOiB1c2luZyBHQVJUIElPTU1VLlxuIik7CisJYXBlcl9zaXplID0gaW5mby5h cGVyX3NpemUgKiAxMDI0ICogMTAyNDsJCisJaW9tbXVfc2l6ZSA9IGNoZWNrX2lvbW11X3NpemUo aW5mby5hcGVyX2Jhc2UsIGFwZXJfc2l6ZSk7IAorCWlvbW11X3BhZ2VzID0gaW9tbXVfc2l6ZSA+ PiBQQUdFX1NISUZUOyAKKworCWlvbW11X2dhcnRfYml0bWFwID0gKHZvaWQqKV9fZ2V0X2ZyZWVf cGFnZXMoR0ZQX0tFUk5FTCwgCisJCQkJCQkgICAgZ2V0X29yZGVyKGlvbW11X3BhZ2VzLzgpKTsg CisJaWYgKCFpb21tdV9nYXJ0X2JpdG1hcCkgCisJCXBhbmljKCJDYW5ub3QgYWxsb2NhdGUgaW9t bXUgYml0bWFwXG4iKTsgCisJbWVtc2V0KGlvbW11X2dhcnRfYml0bWFwLCAwLCBpb21tdV9wYWdl cy84KTsKKworI2lmZGVmIENPTkZJR19JT01NVV9MRUFLCisJaWYgKGxlYWtfdHJhY2UpIHsgCisJ CWlvbW11X2xlYWtfdGFiID0gKHZvaWQgKilfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwsIAor CQkJCSAgZ2V0X29yZGVyKGlvbW11X3BhZ2VzKnNpemVvZih2b2lkICopKSk7CisJCWlmIChpb21t dV9sZWFrX3RhYikgCisJCQltZW1zZXQoaW9tbXVfbGVha190YWIsIDAsIGlvbW11X3BhZ2VzICog OCk7IAorCQllbHNlCisJCQlwcmludGsoIlBDSS1ETUE6IENhbm5vdCBhbGxvY2F0ZSBsZWFrIHRy YWNlIGFyZWFcbiIpOyAKKwl9IAorI2VuZGlmCisKKwkvKiAKKwkgKiBPdXQgb2YgSU9NTVUgc3Bh Y2UgaGFuZGxpbmcuCisJICogUmVzZXJ2ZSBzb21lIGludmFsaWQgcGFnZXMgYXQgdGhlIGJlZ2lu bmluZyBvZiB0aGUgR0FSVC4gCisJICovIAorCXNldF9iaXRfc3RyaW5nKGlvbW11X2dhcnRfYml0 bWFwLCAwLCBFTUVSR0VOQ1lfUEFHRVMpOyAKKworCWFncF9tZW1vcnlfcmVzZXJ2ZWQgPSBpb21t dV9zaXplOwkKKwlwcmludGsoS0VSTl9JTkZPCisJICAgICAgICJQQ0ktRE1BOiBSZXNlcnZpbmcg JWx1TUIgb2YgSU9NTVUgYXJlYSBpbiB0aGUgQUdQIGFwZXJ0dXJlXG4iLAorCSAgICAgICBpb21t dV9zaXplPj4yMCk7IAorCisJaW9tbXVfc3RhcnQgPSBhcGVyX3NpemUgLSBpb21tdV9zaXplOwkK Kwlpb21tdV9idXNfYmFzZSA9IGluZm8uYXBlcl9iYXNlICsgaW9tbXVfc3RhcnQ7IAorCWJhZF9k bWFfYWRkcmVzcyA9IGlvbW11X2J1c19iYXNlOworCWlvbW11X2dhdHRfYmFzZSA9IGFncF9nYXR0 X3RhYmxlICsgKGlvbW11X3N0YXJ0Pj5QQUdFX1NISUZUKTsKKworCS8qIAorCSAqIFVubWFwIHRo ZSBJT01NVSBwYXJ0IG9mIHRoZSBHQVJULiBUaGUgYWxpYXMgb2YgdGhlIHBhZ2UgaXMKKwkgKiBh bHdheXMgbWFwcGVkIHdpdGggY2FjaGUgZW5hYmxlZCBhbmQgdGhlcmUgaXMgbm8gZnVsbCBjYWNo ZQorCSAqIGNvaGVyZW5jeSBhY3Jvc3MgdGhlIEdBUlQgcmVtYXBwaW5nLiBUaGUgdW5tYXBwaW5n IGF2b2lkcworCSAqIGF1dG9tYXRpYyBwcmVmZXRjaGVzIGZyb20gdGhlIENQVSBhbGxvY2F0aW5n IGNhY2hlIGxpbmVzIGluCisJICogdGhlcmUuIEFsbCBDUFUgYWNjZXNzZXMgYXJlIGRvbmUgdmlh IHRoZSBkaXJlY3QgbWFwcGluZyB0bworCSAqIHRoZSBiYWNraW5nIG1lbW9yeS4gVGhlIEdBUlQg YWRkcmVzcyBpcyBvbmx5IHVzZWQgYnkgUENJCisJICogZGV2aWNlcy4gCisJICovCisjaWZuZGVm IENPTkZJR19YRU4KKyAgICAgICBjbGVhcl9rZXJuZWxfbWFwcGluZygodW5zaWduZWQgbG9uZyli dXNfdG9fdmlydChpb21tdV9idXNfYmFzZSksIGlvbW11X3NpemUpOworI2Vsc2UKKyAgICAgICAv KgorICAgICAgICAqIEluIHhlbiBndWVzdHMgYW5kIGh5cGVydmlzb3IgdGhlIElPTU1VIHJlZ2lv biBpcyBvbmx5IG1hcHBlZCBpbgorICAgICAgICAqIHZpcnR1YWwgbWVtb3J5IGlmIGl0IGhhcyBi ZWVuIGFsbG9jYXRlZCBmcm9tIFJBTS4KKyAgICAgICAgKi8KKwlpZiAobWZuX3RvX2xvY2FsX3Bm bihpb21tdV9idXNfYmFzZT4+UEFHRV9TSElGVCk8ZW5kX3BmbikgeworCQlzdHJ1Y3QgbW11ZXh0 X29wIG9wID0geworCQkJLmNtZCA9IE1NVUVYVF9VTk1BUF9SRUdJT04sCisJCQkuYXJnMS5tZm4g PSBpb21tdV9idXNfYmFzZT4+UEFHRV9TSElGVCwKKwkJCS5hcmcyLm5yX2VudHMgPSBpb21tdV9z aXplPj5QQUdFX1NISUZUCisJCX07CisJCWNsZWFyX2tlcm5lbF9tYXBwaW5nKCh1bnNpZ25lZCBs b25nKWJ1c190b192aXJ0KGlvbW11X2J1c19iYXNlKSwgaW9tbXVfc2l6ZSk7CisJCUJVR19PTihI WVBFUlZJU09SX21tdWV4dF9vcCgmb3AsIDEsIE5VTEwsIERPTUlEX1NFTEYpKTsKKwl9CisjZW5k aWYKKworCS8qIAorCSAqIFRyeSB0byB3b3JrYXJvdW5kIGEgYnVnICh0aGFua3MgdG8gQmVuSCkg CisJICogU2V0IHVubWFwcGVkIGVudHJpZXMgdG8gYSBzY3JhdGNoIHBhZ2UgaW5zdGVhZCBvZiAw LiAKKwkgKiBBbnkgcHJlZmV0Y2hlcyB0aGF0IGhpdCB1bm1hcHBlZCBlbnRyaWVzIHdvbid0IGdl dCBhbiBidXMgYWJvcnQKKwkgKiB0aGVuLgorCSAqLworCXNjcmF0Y2ggPSBnZXRfemVyb2VkX3Bh Z2UoR0ZQX0tFUk5FTCk7IAorCWlmICghc2NyYXRjaCkgCisJCXBhbmljKCJDYW5ub3QgYWxsb2Nh dGUgaW9tbXUgc2NyYXRjaCBwYWdlIik7CisJZ2FydF91bm1hcHBlZF9lbnRyeSA9IEdQVEVfRU5D T0RFKHZpcnRfdG9fYnVzKHNjcmF0Y2gpKTsKKwlmb3IgKGkgPSBFTUVSR0VOQ1lfUEFHRVM7IGkg PCBpb21tdV9wYWdlczsgaSsrKSAKKwkJaW9tbXVfZ2F0dF9iYXNlW2ldID0gZ2FydF91bm1hcHBl ZF9lbnRyeTsKKworCWZsdXNoX2dhcnQoKTsKKwlpb21tdV9kZXRlY3RlZCA9IDE7CisJZG1hX29w cyA9ICZnYXJ0X2RtYV9vcHM7CisJcHJpbnRrKEtFUk5fSU5GTyAiR0FSVDogb3BzIHNldFxuIik7 Cit9IAorCit2b2lkIGdhcnRfcGFyc2Vfb3B0aW9ucyhjaGFyICpwKQoreworCWludCBhcmc7CisK KyNpZmRlZiBDT05GSUdfSU9NTVVfTEVBSworCWlmICghc3RybmNtcChwLCJsZWFrIiw0KSkgewor CQlsZWFrX3RyYWNlID0gMTsKKwkJcCArPSA0OworCQlpZiAoKnAgPT0gJz0nKSArK3A7CisJCWlm IChpc2RpZ2l0KCpwKSAmJiBnZXRfb3B0aW9uKCZwLCAmYXJnKSkKKwkJCWlvbW11X2xlYWtfcGFn ZXMgPSBhcmc7CisJfQorI2VuZGlmCisJaWYgKGlzZGlnaXQoKnApICYmIGdldF9vcHRpb24oJnAs ICZhcmcpKQorCQlpb21tdV9zaXplID0gYXJnOworCWlmICghc3RybmNtcChwLCAiZnVsbGZsdXNo Iiw4KSkKKwkJaW9tbXVfZnVsbGZsdXNoID0gMTsKKwlpZiAoIXN0cm5jbXAocCwgIm5vZnVsbGZs dXNoIiwxMSkpCisJCWlvbW11X2Z1bGxmbHVzaCA9IDA7CisJaWYgKCFzdHJuY21wKHAsIm5vYWdw Iiw1KSkKKwkJbm9fYWdwID0gMTsKKwlpZiAoIXN0cm5jbXAocCwgIm5vYXBlcnR1cmUiLDEwKSkK KwkJZml4X2FwZXJ0dXJlID0gMDsKKwkvKiBkdXBsaWNhdGVkIGZyb20gcGNpLWRtYS5jICovCisJ aWYgKCFzdHJuY21wKHAsImZvcmNlIiw1KSkKKwkJaW9tbXVfYXBlcnR1cmVfYWxsb3dlZCA9IDE7 CisJaWYgKCFzdHJuY21wKHAsImFsbG93ZWQiLDcpKQorCQlpb21tdV9hcGVydHVyZV9hbGxvd2Vk ID0gMTsKKwlpZiAoIXN0cm5jbXAocCwgIm1lbWFwZXIiLCA3KSkgeworCQlmYWxsYmFja19hcGVy X2ZvcmNlID0gMTsKKwkJcCArPSA3OworCQlpZiAoKnAgPT0gJz0nKSB7CisJCQkrK3A7CisJCQlp ZiAoZ2V0X29wdGlvbigmcCwgJmFyZykpCisJCQkJZmFsbGJhY2tfYXBlcl9vcmRlciA9IGFyZzsK KwkJfQorCX0KK30KZGlmZiAtciBkMzllOGM0NGRhMzQgLXIgNTAyODEwYjExYzc5IGxpbnV4LTIu Ni14ZW4tc3BhcnNlL2xpYi9zd2lvdGxiLXhlbi5jCi0tLSAvZGV2L251bGwJVGh1IEphbiAwMSAw MDowMDowMCAxOTcwICswMDAwCisrKyBiL2xpbnV4LTIuNi14ZW4tc3BhcnNlL2xpYi9zd2lvdGxi LXhlbi5jCUZyaSBGZWIgMDkgMTY6MzI6MDQgMjAwNyAtMDYwMApAQCAtMCwwICsxLDgzMSBAQAor LyoKKyAqIER5bmFtaWMgRE1BIG1hcHBpbmcgc3VwcG9ydC4KKyAqCisgKiBUaGlzIGltcGxlbWVu dGF0aW9uIGlzIGZvciBJQS02NCBhbmQgRU02NFQgcGxhdGZvcm1zIHRoYXQgZG8gbm90IHN1cHBv cnQKKyAqIEkvTyBUTEJzIChha2EgRE1BIGFkZHJlc3MgdHJhbnNsYXRpb24gaGFyZHdhcmUpLgor ICogQ29weXJpZ2h0IChDKSAyMDAwIEFzaXQgTWFsbGljayA8QXNpdC5LLk1hbGxpY2tAaW50ZWwu Y29tPgorICogQ29weXJpZ2h0IChDKSAyMDAwIEdvdXRoYW0gUmFvIDxnb3V0aGFtLnJhb0BpbnRl bC5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDMgSGV3bGV0dC1QYWNrYXJkIENvCisg KglEYXZpZCBNb3NiZXJnZXItVGFuZyA8ZGF2aWRtQGhwbC5ocC5jb20+CisgKgorICogMDMvMDUv MDcgZGF2aWRtCVN3aXRjaCBmcm9tIFBDSS1ETUEgdG8gZ2VuZXJpYyBkZXZpY2UgRE1BIEFQSS4K KyAqIDAwLzEyLzEzIGRhdmlkbQlSZW5hbWUgdG8gc3dpb3RsYi5jIGFuZCBhZGQgbWFya19jbGVh bigpIHRvIGF2b2lkCisgKgkJCXVubmVjZXNzYXJ5IGktY2FjaGUgZmx1c2hpbmcuCisgKiAwNC8w Ny8uLiBhawkJQmV0dGVyIG92ZXJmbG93IGhhbmRsaW5nLiBBc3NvcnRlZCBmaXhlcy4KKyAqIDA1 LzA5LzEwIGxpbnZpbGxlCUFkZCBzdXBwb3J0IGZvciBzeW5jaW5nIHJhbmdlcywgc3VwcG9ydCBz eW5jaW5nIGZvcgorICoJCQlETUFfQklESVJFQ1RJT05BTCBtYXBwaW5ncywgbWlzY2VsbGFuZW91 cyBjbGVhbnVwLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jYWNoZS5oPgorI2luY2x1ZGUgPGxp bnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51 eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4 L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvY3R5 cGUuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNs dWRlIDxhc20vc2NhdHRlcmxpc3QuaD4KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNs dWRlIDxsaW51eC9ib290bWVtLmg+CisKKyNkZWZpbmUgT0ZGU0VUKHZhbCxhbGlnbikgKCh1bnNp Z25lZCBsb25nKQlcCisJICAgICAgICAgICAgICAgICAgICggKHZhbCkgJiAoIChhbGlnbikgLSAx KSkpCisKKyNkZWZpbmUgU0dfRU5UX1ZJUlRfQUREUkVTUyhzZykJKHBhZ2VfYWRkcmVzcygoc2cp LT5wYWdlKSArIChzZyktPm9mZnNldCkKKyNkZWZpbmUgU0dfRU5UX1BIWVNfQUREUkVTUyhTRykJ dmlydF90b19idXMoU0dfRU5UX1ZJUlRfQUREUkVTUyhTRykpCisKKy8qCisgKiBNYXhpbXVtIGFs bG93YWJsZSBudW1iZXIgb2YgY29udGlndW91cyBzbGFicyB0byBtYXAsCisgKiBtdXN0IGJlIGEg cG93ZXIgb2YgMi4gIFdoYXQgaXMgdGhlIGFwcHJvcHJpYXRlIHZhbHVlID8KKyAqIFRoZSBjb21w bGV4aXR5IG9mIHttYXAsdW5tYXB9X3NpbmdsZSBpcyBsaW5lYXJseSBkZXBlbmRlbnQgb24gdGhp cyB2YWx1ZS4KKyAqLworI2RlZmluZSBJT19UTEJfU0VHU0laRQkxMjgKKworLyoKKyAqIGxvZyBv ZiB0aGUgc2l6ZSBvZiBlYWNoIElPIFRMQiBzbGFiLiAgVGhlIG51bWJlciBvZiBzbGFicyBpcyBj b21tYW5kIGxpbmUKKyAqIGNvbnRyb2xsYWJsZS4KKyAqLworI2RlZmluZSBJT19UTEJfU0hJRlQg MTEKKworI2RlZmluZSBTTEFCU19QRVJfUEFHRSAoMSA8PCAoUEFHRV9TSElGVCAtIElPX1RMQl9T SElGVCkpCisKKy8qCisgKiBNaW5pbXVtIElPIFRMQiBzaXplIHRvIGJvdGhlciBib290aW5nIHdp dGguICBTeXN0ZW1zIHdpdGggbWFpbmx5CisgKiA2NGJpdCBjYXBhYmxlIGNhcmRzIHdpbGwgb25s eSBsaWdodGx5IHVzZSB0aGUgc3dpb3RsYi4gIElmIHdlIGNhbid0CisgKiBhbGxvY2F0ZSBhIGNv bnRpZ3VvdXMgMU1CLCB3ZSdyZSBwcm9iYWJseSBpbiB0cm91YmxlIGFueXdheS4KKyAqLworI2Rl ZmluZSBJT19UTEJfTUlOX1NMQUJTICgoMTw8MjApID4+IElPX1RMQl9TSElGVCkKKworLyoKKyAq IEVudW1lcmF0aW9uIGZvciBzeW5jIHRhcmdldHMKKyAqLworZW51bSBkbWFfc3luY190YXJnZXQg eworCVNZTkNfRk9SX0NQVSA9IDAsCisJU1lOQ19GT1JfREVWSUNFID0gMSwKK307CisKK2ludCBz d2lvdGxiX2ZvcmNlOworCisvKgorICogVXNlZCB0byBkbyBhIHF1aWNrIHJhbmdlIGNoZWNrIGlu IHN3aW90bGJfdW5tYXBfc2luZ2xlIGFuZAorICogc3dpb3RsYl9zeW5jX3NpbmdsZV8qLCB0byBz ZWUgaWYgdGhlIG1lbW9yeSB3YXMgaW4gZmFjdCBhbGxvY2F0ZWQgYnkgdGhpcworICogQVBJLgor ICovCitzdGF0aWMgY2hhciAqaW9fdGxiX3N0YXJ0LCAqaW9fdGxiX2VuZDsKKworLyoKKyAqIFRo ZSBudW1iZXIgb2YgSU8gVExCIGJsb2NrcyAoaW4gZ3JvdXBzIG9mIDY0KSBiZXR3ZWVlbiBpb190 bGJfc3RhcnQgYW5kCisgKiBpb190bGJfZW5kLiAgVGhpcyBpcyBjb21tYW5kIGxpbmUgYWRqdXN0 YWJsZSB2aWEgc2V0dXBfaW9fdGxiX25wYWdlcy4KKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcg aW9fdGxiX25zbGFiczsKKworLyoKKyAqIFdoZW4gdGhlIElPTU1VIG92ZXJmbG93cyB3ZSByZXR1 cm4gYSBmYWxsYmFjayBidWZmZXIuIFRoaXMgc2V0cyB0aGUgc2l6ZS4KKyAqLworc3RhdGljIHVu c2lnbmVkIGxvbmcgaW9fdGxiX292ZXJmbG93ID0gMzIqMTAyNDsKKwordm9pZCAqaW9fdGxiX292 ZXJmbG93X2J1ZmZlcjsKKworLyoKKyAqIFRoaXMgaXMgYSBmcmVlIGxpc3QgZGVzY3JpYmluZyB0 aGUgbnVtYmVyIG9mIGZyZWUgZW50cmllcyBhdmFpbGFibGUgZnJvbQorICogZWFjaCBpbmRleAor ICovCitzdGF0aWMgdW5zaWduZWQgaW50ICppb190bGJfbGlzdDsKK3N0YXRpYyB1bnNpZ25lZCBp bnQgaW9fdGxiX2luZGV4OworCisvKgorICogV2UgbmVlZCB0byBzYXZlIGF3YXkgdGhlIG9yaWdp bmFsIGFkZHJlc3MgY29ycmVzcG9uZGluZyB0byBhIG1hcHBlZCBlbnRyeQorICogZm9yIHRoZSBz eW5jIG9wZXJhdGlvbnMuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyICoqaW9fdGxiX29yaWdf YWRkcjsKKworLyoKKyAqIFByb3RlY3QgdGhlIGFib3ZlIGRhdGEgc3RydWN0dXJlcyBpbiB0aGUg bWFwIGFuZCB1bm1hcCBjYWxscworICovCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGlvX3RsYl9s b2NrKTsKKworc3RhdGljIGludCBfX2luaXQKK3NldHVwX2lvX3RsYl9ucGFnZXMoY2hhciAqc3Ry KQoreworCWlmIChpc2RpZ2l0KCpzdHIpKSB7CisJCWlvX3RsYl9uc2xhYnMgPSBzaW1wbGVfc3Ry dG91bChzdHIsICZzdHIsIDApOworCQkvKiBhdm9pZCB0YWlsIHNlZ21lbnQgb2Ygc2l6ZSA8IElP X1RMQl9TRUdTSVpFICovCisJCWlvX3RsYl9uc2xhYnMgPSBBTElHTihpb190bGJfbnNsYWJzLCBJ T19UTEJfU0VHU0laRSk7CisJfQorCWlmICgqc3RyID09ICcsJykKKwkJKytzdHI7CisJaWYgKCFz dHJjbXAoc3RyLCAiZm9yY2UiKSkKKwkJc3dpb3RsYl9mb3JjZSA9IDE7CisJcmV0dXJuIDE7Cit9 CitfX3NldHVwKCJzd2lvdGxiPSIsIHNldHVwX2lvX3RsYl9ucGFnZXMpOworLyogbWFrZSBpb190 bGJfb3ZlcmZsb3cgdHVuYWJsZSB0b28/ICovCisKKy8qCisgKiBTdGF0aWNhbGx5IHJlc2VydmUg Ym91bmNlIGJ1ZmZlciBzcGFjZSBhbmQgaW5pdGlhbGl6ZSBib3VuY2UgYnVmZmVyIGRhdGEKKyAq IHN0cnVjdHVyZXMgZm9yIHRoZSBzb2Z0d2FyZSBJTyBUTEIgdXNlZCB0byBpbXBsZW1lbnQgdGhl IERNQSBBUEkuCisgKi8KK3ZvaWQKK3N3aW90bGJfaW5pdF93aXRoX2RlZmF1bHRfc2l6ZSAoc2l6 ZV90IGRlZmF1bHRfc2l6ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGk7CisKKwlpZiAoIWlvX3RsYl9u c2xhYnMpIHsKKwkJaW9fdGxiX25zbGFicyA9IChkZWZhdWx0X3NpemUgPj4gSU9fVExCX1NISUZU KTsKKwkJaW9fdGxiX25zbGFicyA9IEFMSUdOKGlvX3RsYl9uc2xhYnMsIElPX1RMQl9TRUdTSVpF KTsKKwl9CisKKwkvKgorCSAqIEdldCBJTyBUTEIgbWVtb3J5IGZyb20gdGhlIGxvdyBwYWdlcwor CSAqLworCWlvX3RsYl9zdGFydCA9IGFsbG9jX2Jvb3RtZW1fbG93X3BhZ2VzKGlvX3RsYl9uc2xh YnMgKiAoMSA8PCBJT19UTEJfU0hJRlQpKTsKKwlpZiAoIWlvX3RsYl9zdGFydCkKKwkJcGFuaWMo IkNhbm5vdCBhbGxvY2F0ZSBTV0lPVExCIGJ1ZmZlciIpOworI2lmZGVmIENPTkZJR19YRU4KKwlp ZiAoeGVuX2NyZWF0ZV9jb250aWd1b3VzX3JlZ2lvbigodW5zaWduZWQgbG9uZylpb190bGJfc3Rh cnQsIGdldF9vcmRlcihpb190bGJfbnNsYWJzICogKDEgPDwgSU9fVExCX1NISUZUKSksIDMxKSkK KwkJcGFuaWMoIkNhbm5vdCBjcmVhdGUgYSBjb250aWd1b3VzIG1lbW9yeSByZWdpb24gYmVsb3cg NEdCIGZvciB0aGUgU1dJT1RMQiBidWZmZXIiKTsKKyNlbmRpZgorLy9UT0RPIHVsaW06IG1ha2Ug Y29udGlndW91cworCWlvX3RsYl9lbmQgPSBpb190bGJfc3RhcnQgKyBpb190bGJfbnNsYWJzICog KDEgPDwgSU9fVExCX1NISUZUKTsKKworCS8qCisJICogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUg dGhlIGZyZWUgbGlzdCBhcnJheS4gIFRoaXMgYXJyYXkgaXMgdXNlZAorCSAqIHRvIGZpbmQgY29u dGlndW91cyBmcmVlIG1lbW9yeSByZWdpb25zIG9mIHNpemUgdXAgdG8gSU9fVExCX1NFR1NJWkUK KwkgKiBiZXR3ZWVuIGlvX3RsYl9zdGFydCBhbmQgaW9fdGxiX2VuZC4KKwkgKi8KKwlpb190bGJf bGlzdCA9IGFsbG9jX2Jvb3RtZW0oaW9fdGxiX25zbGFicyAqIHNpemVvZihpbnQpKTsKKwlmb3Ig KGkgPSAwOyBpIDwgaW9fdGxiX25zbGFiczsgaSsrKQorIAkJaW9fdGxiX2xpc3RbaV0gPSBJT19U TEJfU0VHU0laRSAtIE9GRlNFVChpLCBJT19UTEJfU0VHU0laRSk7CisJaW9fdGxiX2luZGV4ID0g MDsKKwlpb190bGJfb3JpZ19hZGRyID0gYWxsb2NfYm9vdG1lbShpb190bGJfbnNsYWJzICogc2l6 ZW9mKGNoYXIgKikpOworCisJLyoKKwkgKiBHZXQgdGhlIG92ZXJmbG93IGVtZXJnZW5jeSBidWZm ZXIKKwkgKi8KKwlpb190bGJfb3ZlcmZsb3dfYnVmZmVyID0gYWxsb2NfYm9vdG1lbV9sb3coaW9f dGxiX292ZXJmbG93KTsKKyNpZmRlZiBDT05GSUdfWEVOCisJaWYgKGlvX3RsYl9vdmVyZmxvd19i dWZmZXIpCisJCXhlbl9jcmVhdGVfY29udGlndW91c19yZWdpb24oKHVuc2lnbmVkIGxvbmcpaW9f dGxiX292ZXJmbG93X2J1ZmZlciwgZ2V0X29yZGVyKGlvX3RsYl9vdmVyZmxvdyksIDMxKTsKKyNl bmRpZgorLy9UT0RPIHVsaW06IG1ha2UgY29udGlndW91cworCXByaW50ayhLRVJOX0lORk8gIlBs YWNpbmcgc29mdHdhcmUgSU8gVExCIGJldHdlZW4gMHglbHggLSAweCVseFxuIiwKKwkgICAgICAg dmlydF90b19idXMoaW9fdGxiX3N0YXJ0KSwgdmlydF90b19idXMoaW9fdGxiX2VuZCkpOworfQor Cit2b2lkCitzd2lvdGxiX2luaXQgKHZvaWQpCit7CisJc3dpb3RsYl9pbml0X3dpdGhfZGVmYXVs dF9zaXplKDY0ICogKDE8PDIwKSk7CS8qIGRlZmF1bHQgdG8gNjRNQiAqLworfQorCisvKgorICog U3lzdGVtcyB3aXRoIGxhcmdlciBETUEgem9uZXMgKHRob3NlIHRoYXQgZG9uJ3Qgc3VwcG9ydCBJ U0EpIGNhbgorICogaW5pdGlhbGl6ZSB0aGUgc3dpb3RsYiBsYXRlciB1c2luZyB0aGUgc2xhYiBh bGxvY2F0b3IgaWYgbmVlZGVkLgorICogVGhpcyBzaG91bGQgYmUganVzdCBsaWtlIGFib3ZlLCBi dXQgd2l0aCBzb21lIGVycm9yIGNhdGNoaW5nLgorICovCitpbnQKK3N3aW90bGJfbGF0ZV9pbml0 X3dpdGhfZGVmYXVsdF9zaXplIChzaXplX3QgZGVmYXVsdF9zaXplKQoreworCXVuc2lnbmVkIGxv bmcgaSwgcmVxX25zbGFicyA9IGlvX3RsYl9uc2xhYnM7CisJdW5zaWduZWQgaW50IG9yZGVyOwor CisJaWYgKCFpb190bGJfbnNsYWJzKSB7CisJCWlvX3RsYl9uc2xhYnMgPSAoZGVmYXVsdF9zaXpl ID4+IElPX1RMQl9TSElGVCk7CisJCWlvX3RsYl9uc2xhYnMgPSBBTElHTihpb190bGJfbnNsYWJz LCBJT19UTEJfU0VHU0laRSk7CisJfQorCisJLyoKKwkgKiBHZXQgSU8gVExCIG1lbW9yeSBmcm9t IHRoZSBsb3cgcGFnZXMKKwkgKi8KKwlvcmRlciA9IGdldF9vcmRlcihpb190bGJfbnNsYWJzICog KDEgPDwgSU9fVExCX1NISUZUKSk7CisJaW9fdGxiX25zbGFicyA9IFNMQUJTX1BFUl9QQUdFIDw8 IG9yZGVyOworCisJd2hpbGUgKChTTEFCU19QRVJfUEFHRSA8PCBvcmRlcikgPiBJT19UTEJfTUlO X1NMQUJTKSB7CisvL1RPRE8gdWxpbTogbWFrZSBjb250aWd1b3VzCisJCWlvX3RsYl9zdGFydCA9 IChjaGFyICopX19nZXRfZnJlZV9wYWdlcyhHRlBfRE1BIHwgX19HRlBfTk9XQVJOLAorCQkgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXIpOworI2lmZGVmIENPTkZJ R19YRU4KKwlpZiAoaW9fdGxiX3N0YXJ0JiYheGVuX2NyZWF0ZV9jb250aWd1b3VzX3JlZ2lvbigo dW5zaWduZWQgbG9uZylpb190bGJfc3RhcnQsIG9yZGVyLCAzMSkpIHsKKwkJZnJlZV9wYWdlcygo dW5zaWduZWQgbG9uZylpb190bGJfc3RhcnQsIG9yZGVyKTsKKwkJaW9fdGxiX3N0YXJ0ID0gTlVM TDsKKwl9CisjZW5kaWYKKwkJaWYgKGlvX3RsYl9zdGFydCkKKwkJCWJyZWFrOworCQlvcmRlci0t OworCX0KKworCWlmICghaW9fdGxiX3N0YXJ0KQorCQlnb3RvIGNsZWFudXAxOworCisJaWYgKG9y ZGVyICE9IGdldF9vcmRlcihpb190bGJfbnNsYWJzICogKDEgPDwgSU9fVExCX1NISUZUKSkpIHsK KwkJcHJpbnRrKEtFUk5fV0FSTklORyAiV2FybmluZzogb25seSBhYmxlIHRvIGFsbG9jYXRlICVs ZCBNQiAiCisJCSAgICAgICAiZm9yIHNvZnR3YXJlIElPIFRMQlxuIiwgKFBBR0VfU0laRSA8PCBv cmRlcikgPj4gMjApOworCQlpb190bGJfbnNsYWJzID0gU0xBQlNfUEVSX1BBR0UgPDwgb3JkZXI7 CisJfQorCWlvX3RsYl9lbmQgPSBpb190bGJfc3RhcnQgKyBpb190bGJfbnNsYWJzICogKDEgPDwg SU9fVExCX1NISUZUKTsKKwltZW1zZXQoaW9fdGxiX3N0YXJ0LCAwLCBpb190bGJfbnNsYWJzICog KDEgPDwgSU9fVExCX1NISUZUKSk7CisKKwkvKgorCSAqIEFsbG9jYXRlIGFuZCBpbml0aWFsaXpl IHRoZSBmcmVlIGxpc3QgYXJyYXkuICBUaGlzIGFycmF5IGlzIHVzZWQKKwkgKiB0byBmaW5kIGNv bnRpZ3VvdXMgZnJlZSBtZW1vcnkgcmVnaW9ucyBvZiBzaXplIHVwIHRvIElPX1RMQl9TRUdTSVpF CisJICogYmV0d2VlbiBpb190bGJfc3RhcnQgYW5kIGlvX3RsYl9lbmQuCisJICovCisJaW9fdGxi X2xpc3QgPSAodW5zaWduZWQgaW50ICopX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLAorCSAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9vcmRlcihpb190bGJfbnNsYWJzICogc2l6 ZW9mKGludCkpKTsKKwlpZiAoIWlvX3RsYl9saXN0KQorCQlnb3RvIGNsZWFudXAyOworCisJZm9y IChpID0gMDsgaSA8IGlvX3RsYl9uc2xhYnM7IGkrKykKKyAJCWlvX3RsYl9saXN0W2ldID0gSU9f VExCX1NFR1NJWkUgLSBPRkZTRVQoaSwgSU9fVExCX1NFR1NJWkUpOworCWlvX3RsYl9pbmRleCA9 IDA7CisKKwlpb190bGJfb3JpZ19hZGRyID0gKHVuc2lnbmVkIGNoYXIgKiopX19nZXRfZnJlZV9w YWdlcyhHRlBfS0VSTkVMLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9vcmRlcihp b190bGJfbnNsYWJzICogc2l6ZW9mKGNoYXIgKikpKTsKKwlpZiAoIWlvX3RsYl9vcmlnX2FkZHIp CisJCWdvdG8gY2xlYW51cDM7CisKKwltZW1zZXQoaW9fdGxiX29yaWdfYWRkciwgMCwgaW9fdGxi X25zbGFicyAqIHNpemVvZihjaGFyICopKTsKKworCS8qCisJICogR2V0IHRoZSBvdmVyZmxvdyBl bWVyZ2VuY3kgYnVmZmVyCisJICovCisJaW9fdGxiX292ZXJmbG93X2J1ZmZlciA9ICh2b2lkICop X19nZXRfZnJlZV9wYWdlcyhHRlBfRE1BLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIGdldF9vcmRlcihpb190bGJfb3ZlcmZsb3cpKTsKKyNpZmRlZiBDT05GSUdf WEVOCisJaWYgKGlvX3RsYl9vdmVyZmxvd19idWZmZXImJiF4ZW5fY3JlYXRlX2NvbnRpZ3VvdXNf cmVnaW9uKCh1bnNpZ25lZCBsb25nKWlvX3RsYl9vdmVyZmxvd19idWZmZXIsIGdldF9vcmRlcihp b190bGJfb3ZlcmZsb3cpLCAzMSkpIHsKKwkJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZylpb190 bGJfb3ZlcmZsb3dfYnVmZmVyLCBvcmRlcik7CisJCWlvX3RsYl9vdmVyZmxvd19idWZmZXIgPSBO VUxMOworCX0KKyNlbmRpZgorCWlmICghaW9fdGxiX292ZXJmbG93X2J1ZmZlcikKKwkJZ290byBj bGVhbnVwNDsKKworLy9UT0RPIHVsaW06IG1ha2UgY29udGlndW91cworCXByaW50ayhLRVJOX0lO Rk8gIlBsYWNpbmcgJWxkTUIgc29mdHdhcmUgSU8gVExCIGJldHdlZW4gMHglbHggLSAiCisJICAg ICAgICIweCVseFxuIiwgKGlvX3RsYl9uc2xhYnMgKiAoMSA8PCBJT19UTEJfU0hJRlQpKSA+PiAy MCwKKwkgICAgICAgdmlydF90b19idXMoaW9fdGxiX3N0YXJ0KSwgdmlydF90b19idXMoaW9fdGxi X2VuZCkpOworCisJcmV0dXJuIDA7CisKK2NsZWFudXA0OgorCWZyZWVfcGFnZXMoKHVuc2lnbmVk IGxvbmcpaW9fdGxiX29yaWdfYWRkciwgZ2V0X29yZGVyKGlvX3RsYl9uc2xhYnMgKgorCSAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihj aGFyICopKSk7CisJaW9fdGxiX29yaWdfYWRkciA9IE5VTEw7CitjbGVhbnVwMzoKKwlmcmVlX3Bh Z2VzKCh1bnNpZ25lZCBsb25nKWlvX3RsYl9saXN0LCBnZXRfb3JkZXIoaW9fdGxiX25zbGFicyAq CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVv ZihpbnQpKSk7CisJaW9fdGxiX2xpc3QgPSBOVUxMOworCWlvX3RsYl9lbmQgPSBOVUxMOworY2xl YW51cDI6CisjaWZkZWYgQ09ORklHX1hFTgorCXhlbl9kZXN0cm95X2NvbnRpZ3VvdXNfcmVnaW9u KCh1bnNpZ25lZCBsb25nKWlvX3RsYl9zdGFydCwgb3JkZXIpOworI2VuZGlmCisJZnJlZV9wYWdl cygodW5zaWduZWQgbG9uZylpb190bGJfc3RhcnQsIG9yZGVyKTsKKy8vVE9ETyB1bGltOiBtYWtl IGNvbnRpZ3VvdXMKKwlpb190bGJfc3RhcnQgPSBOVUxMOworY2xlYW51cDE6CisJaW9fdGxiX25z bGFicyA9IHJlcV9uc2xhYnM7CisJcmV0dXJuIC1FTk9NRU07Cit9CisKK3N0YXRpYyBpbmxpbmUg aW50CithZGRyZXNzX25lZWRzX21hcHBpbmcoc3RydWN0IGRldmljZSAqaHdkZXYsIGRtYV9hZGRy X3QgYWRkcikKK3sKKwlkbWFfYWRkcl90IG1hc2sgPSAweGZmZmZmZmZmOworCS8qIElmIHRoZSBk ZXZpY2UgaGFzIGEgbWFzaywgdXNlIGl0LCBvdGhlcndpc2UgZGVmYXVsdCB0byAzMiBiaXRzICov CisJaWYgKGh3ZGV2ICYmIGh3ZGV2LT5kbWFfbWFzaykKKwkJbWFzayA9ICpod2Rldi0+ZG1hX21h c2s7CisJcmV0dXJuIChhZGRyICYgfm1hc2spICE9IDA7Cit9CisKKy8qCisgKiBBbGxvY2F0ZXMg Ym91bmNlIGJ1ZmZlciBhbmQgcmV0dXJucyBpdHMga2VybmVsIHZpcnR1YWwgYWRkcmVzcy4KKyAq Lworc3RhdGljIHZvaWQgKgorbWFwX3NpbmdsZShzdHJ1Y3QgZGV2aWNlICpod2RldiwgY2hhciAq YnVmZmVyLCBzaXplX3Qgc2l6ZSwgaW50IGRpcikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwor CWNoYXIgKmRtYV9hZGRyOworCXVuc2lnbmVkIGludCBuc2xvdHMsIHN0cmlkZSwgaW5kZXgsIHdy YXA7CisJaW50IGk7CisKKwkvKgorCSAqIEZvciBtYXBwaW5ncyBncmVhdGVyIHRoYW4gYSBwYWdl LCB3ZSBsaW1pdCB0aGUgc3RyaWRlIChhbmQKKwkgKiBoZW5jZSBhbGlnbm1lbnQpIHRvIGEgcGFn ZSBzaXplLgorCSAqLworCW5zbG90cyA9IEFMSUdOKHNpemUsIDEgPDwgSU9fVExCX1NISUZUKSA+ PiBJT19UTEJfU0hJRlQ7CisJaWYgKHNpemUgPiBQQUdFX1NJWkUpCisJCXN0cmlkZSA9ICgxIDw8 IChQQUdFX1NISUZUIC0gSU9fVExCX1NISUZUKSk7CisJZWxzZQorCQlzdHJpZGUgPSAxOworCisJ QlVHX09OKCFuc2xvdHMpOworCisJLyoKKwkgKiBGaW5kIHN1aXRhYmxlIG51bWJlciBvZiBJTyBU TEIgZW50cmllcyBzaXplIHRoYXQgd2lsbCBmaXQgdGhpcworCSAqIHJlcXVlc3QgYW5kIGFsbG9j YXRlIGEgYnVmZmVyIGZyb20gdGhhdCBJTyBUTEIgcG9vbC4KKwkgKi8KKwlzcGluX2xvY2tfaXJx c2F2ZSgmaW9fdGxiX2xvY2ssIGZsYWdzKTsKKwl7CisJCXdyYXAgPSBpbmRleCA9IEFMSUdOKGlv X3RsYl9pbmRleCwgc3RyaWRlKTsKKworCQlpZiAoaW5kZXggPj0gaW9fdGxiX25zbGFicykKKwkJ CXdyYXAgPSBpbmRleCA9IDA7CisKKwkJZG8geworCQkJLyoKKwkJCSAqIElmIHdlIGZpbmQgYSBz bG90IHRoYXQgaW5kaWNhdGVzIHdlIGhhdmUgJ25zbG90cycKKwkJCSAqIG51bWJlciBvZiBjb250 aWd1b3VzIGJ1ZmZlcnMsIHdlIGFsbG9jYXRlIHRoZQorCQkJICogYnVmZmVycyBmcm9tIHRoYXQg c2xvdCBhbmQgbWFyayB0aGUgZW50cmllcyBhcyAnMCcKKwkJCSAqIGluZGljYXRpbmcgdW5hdmFp bGFibGUuCisJCQkgKi8KKwkJCWlmIChpb190bGJfbGlzdFtpbmRleF0gPj0gbnNsb3RzKSB7CisJ CQkJaW50IGNvdW50ID0gMDsKKworCQkJCWZvciAoaSA9IGluZGV4OyBpIDwgKGludCkgKGluZGV4 ICsgbnNsb3RzKTsgaSsrKQorCQkJCQlpb190bGJfbGlzdFtpXSA9IDA7CisJCQkJZm9yIChpID0g aW5kZXggLSAxOyAoT0ZGU0VUKGksIElPX1RMQl9TRUdTSVpFKSAhPSBJT19UTEJfU0VHU0laRSAt MSkgJiYgaW9fdGxiX2xpc3RbaV07IGktLSkKKwkJCQkJaW9fdGxiX2xpc3RbaV0gPSArK2NvdW50 OworCQkJCWRtYV9hZGRyID0gaW9fdGxiX3N0YXJ0ICsgKGluZGV4IDw8IElPX1RMQl9TSElGVCk7 CisKKwkJCQkvKgorCQkJCSAqIFVwZGF0ZSB0aGUgaW5kaWNlcyB0byBhdm9pZCBzZWFyY2hpbmcg aW4KKwkJCQkgKiB0aGUgbmV4dCByb3VuZC4KKwkJCQkgKi8KKwkJCQlpb190bGJfaW5kZXggPSAo KGluZGV4ICsgbnNsb3RzKSA8IGlvX3RsYl9uc2xhYnMKKwkJCQkJCT8gKGluZGV4ICsgbnNsb3Rz KSA6IDApOworCisJCQkJZ290byBmb3VuZDsKKwkJCX0KKwkJCWluZGV4ICs9IHN0cmlkZTsKKwkJ CWlmIChpbmRleCA+PSBpb190bGJfbnNsYWJzKQorCQkJCWluZGV4ID0gMDsKKwkJfSB3aGlsZSAo aW5kZXggIT0gd3JhcCk7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9fdGxiX2xvY2ss IGZsYWdzKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorICBmb3VuZDoKKwlzcGluX3VubG9ja19pcnFy ZXN0b3JlKCZpb190bGJfbG9jaywgZmxhZ3MpOworCisJLyoKKwkgKiBTYXZlIGF3YXkgdGhlIG1h cHBpbmcgZnJvbSB0aGUgb3JpZ2luYWwgYWRkcmVzcyB0byB0aGUgRE1BIGFkZHJlc3MuCisJICog VGhpcyBpcyBuZWVkZWQgd2hlbiB3ZSBzeW5jIHRoZSBtZW1vcnkuICBUaGVuIHdlIHN5bmMgdGhl IGJ1ZmZlciBpZgorCSAqIG5lZWRlZC4KKwkgKi8KKwlpb190bGJfb3JpZ19hZGRyW2luZGV4XSA9 IGJ1ZmZlcjsKKwlpZiAoZGlyID09IERNQV9UT19ERVZJQ0UgfHwgZGlyID09IERNQV9CSURJUkVD VElPTkFMKQorCQltZW1jcHkoZG1hX2FkZHIsIGJ1ZmZlciwgc2l6ZSk7CisKKwlyZXR1cm4gZG1h X2FkZHI7Cit9CisKKy8qCisgKiBkbWFfYWRkciBpcyB0aGUga2VybmVsIHZpcnR1YWwgYWRkcmVz cyBvZiB0aGUgYm91bmNlIGJ1ZmZlciB0byB1bm1hcC4KKyAqLworc3RhdGljIHZvaWQKK3VubWFw X3NpbmdsZShzdHJ1Y3QgZGV2aWNlICpod2RldiwgY2hhciAqZG1hX2FkZHIsIHNpemVfdCBzaXpl LCBpbnQgZGlyKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGksIGNvdW50LCBuc2xv dHMgPSBBTElHTihzaXplLCAxIDw8IElPX1RMQl9TSElGVCkgPj4gSU9fVExCX1NISUZUOworCWlu dCBpbmRleCA9IChkbWFfYWRkciAtIGlvX3RsYl9zdGFydCkgPj4gSU9fVExCX1NISUZUOworCWNo YXIgKmJ1ZmZlciA9IGlvX3RsYl9vcmlnX2FkZHJbaW5kZXhdOworCisJLyoKKwkgKiBGaXJzdCwg c3luYyB0aGUgbWVtb3J5IGJlZm9yZSB1bm1hcHBpbmcgdGhlIGVudHJ5CisJICovCisJaWYgKGJ1 ZmZlciAmJiAoKGRpciA9PSBETUFfRlJPTV9ERVZJQ0UpIHx8IChkaXIgPT0gRE1BX0JJRElSRUNU SU9OQUwpKSkKKwkJLyoKKwkJICogYm91bmNlLi4uIGNvcHkgdGhlIGRhdGEgYmFjayBpbnRvIHRo ZSBvcmlnaW5hbCBidWZmZXIgKiBhbmQKKwkJICogZGVsZXRlIHRoZSBib3VuY2UgYnVmZmVyLgor CQkgKi8KKwkJbWVtY3B5KGJ1ZmZlciwgZG1hX2FkZHIsIHNpemUpOworCisJLyoKKwkgKiBSZXR1 cm4gdGhlIGJ1ZmZlciB0byB0aGUgZnJlZSBsaXN0IGJ5IHNldHRpbmcgdGhlIGNvcnJlc3BvbmRp bmcKKwkgKiBlbnRyaWVzIHRvIGluZGljYXRlIHRoZSBudW1iZXIgb2YgY29udGlnb3VzIGVudHJp ZXMgYXZhaWxhYmxlLgorCSAqIFdoaWxlIHJldHVybmluZyB0aGUgZW50cmllcyB0byB0aGUgZnJl ZSBsaXN0LCB3ZSBtZXJnZSB0aGUgZW50cmllcworCSAqIHdpdGggc2xvdHMgYmVsb3cgYW5kIGFi b3ZlIHRoZSBwb29sIGJlaW5nIHJldHVybmVkLgorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZp b190bGJfbG9jaywgZmxhZ3MpOworCXsKKwkJY291bnQgPSAoKGluZGV4ICsgbnNsb3RzKSA8IEFM SUdOKGluZGV4ICsgMSwgSU9fVExCX1NFR1NJWkUpID8KKwkJCSBpb190bGJfbGlzdFtpbmRleCAr IG5zbG90c10gOiAwKTsKKwkJLyoKKwkJICogU3RlcCAxOiByZXR1cm4gdGhlIHNsb3RzIHRvIHRo ZSBmcmVlIGxpc3QsIG1lcmdpbmcgdGhlCisJCSAqIHNsb3RzIHdpdGggc3VwZXJjZWVkaW5nIHNs b3RzCisJCSAqLworCQlmb3IgKGkgPSBpbmRleCArIG5zbG90cyAtIDE7IGkgPj0gaW5kZXg7IGkt LSkKKwkJCWlvX3RsYl9saXN0W2ldID0gKytjb3VudDsKKwkJLyoKKwkJICogU3RlcCAyOiBtZXJn ZSB0aGUgcmV0dXJuZWQgc2xvdHMgd2l0aCB0aGUgcHJlY2VkaW5nIHNsb3RzLAorCQkgKiBpZiBh dmFpbGFibGUgKG5vbiB6ZXJvKQorCQkgKi8KKwkJZm9yIChpID0gaW5kZXggLSAxOyAoT0ZGU0VU KGksIElPX1RMQl9TRUdTSVpFKSAhPSBJT19UTEJfU0VHU0laRSAtMSkgJiYgaW9fdGxiX2xpc3Rb aV07IGktLSkKKwkJCWlvX3RsYl9saXN0W2ldID0gKytjb3VudDsKKwl9CisJc3Bpbl91bmxvY2tf aXJxcmVzdG9yZSgmaW9fdGxiX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQKK3N5bmNf c2luZ2xlKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCBjaGFyICpkbWFfYWRkciwgc2l6ZV90IHNpemUs CisJICAgIGludCBkaXIsIGludCB0YXJnZXQpCit7CisJaW50IGluZGV4ID0gKGRtYV9hZGRyIC0g aW9fdGxiX3N0YXJ0KSA+PiBJT19UTEJfU0hJRlQ7CisJY2hhciAqYnVmZmVyID0gaW9fdGxiX29y aWdfYWRkcltpbmRleF07CisKKwlzd2l0Y2ggKHRhcmdldCkgeworCWNhc2UgU1lOQ19GT1JfQ1BV OgorCQlpZiAobGlrZWx5KGRpciA9PSBETUFfRlJPTV9ERVZJQ0UgfHwgZGlyID09IERNQV9CSURJ UkVDVElPTkFMKSkKKwkJCW1lbWNweShidWZmZXIsIGRtYV9hZGRyLCBzaXplKTsKKwkJZWxzZQor CQkJQlVHX09OKGRpciAhPSBETUFfVE9fREVWSUNFKTsKKwkJYnJlYWs7CisJY2FzZSBTWU5DX0ZP Ul9ERVZJQ0U6CisJCWlmIChsaWtlbHkoZGlyID09IERNQV9UT19ERVZJQ0UgfHwgZGlyID09IERN QV9CSURJUkVDVElPTkFMKSkKKwkJCW1lbWNweShkbWFfYWRkciwgYnVmZmVyLCBzaXplKTsKKwkJ ZWxzZQorCQkJQlVHX09OKGRpciAhPSBETUFfRlJPTV9ERVZJQ0UpOworCQlicmVhazsKKwlkZWZh dWx0OgorCQlCVUcoKTsKKwl9Cit9CisKK3ZvaWQgKgorc3dpb3RsYl9hbGxvY19jb2hlcmVudChz dHJ1Y3QgZGV2aWNlICpod2Rldiwgc2l6ZV90IHNpemUsCisJCSAgICAgICBkbWFfYWRkcl90ICpk bWFfaGFuZGxlLCBnZnBfdCBmbGFncykKK3sKKwl1bnNpZ25lZCBsb25nIGRldl9hZGRyOworCXZv aWQgKnJldDsKKwlpbnQgb3JkZXIgPSBnZXRfb3JkZXIoc2l6ZSk7CisKKwkvKgorCSAqIFhYWCBm aXggbWU6IHRoZSBETUEgQVBJIHNob3VsZCBwYXNzIHVzIGFuIGV4cGxpY2l0IERNQSBtYXNrCisJ ICogaW5zdGVhZCwgb3IgdXNlIFpPTkVfRE1BMzIgKGlhNjQgb3ZlcmxvYWRzIFpPTkVfRE1BIHRv IGJlIGEgfjMyCisJICogYml0IHJhbmdlIGluc3RlYWQgb2YgYSAxNk1CIG9uZSkuCisJICovCisJ ZmxhZ3MgfD0gR0ZQX0RNQTsKKworCXJldCA9ICh2b2lkICopX19nZXRfZnJlZV9wYWdlcyhmbGFn cywgb3JkZXIpOworCWlmIChyZXQgJiYgYWRkcmVzc19uZWVkc19tYXBwaW5nKGh3ZGV2LCB2aXJ0 X3RvX2J1cyhyZXQpKSkgeworCQkvKgorCQkgKiBUaGUgYWxsb2NhdGVkIG1lbW9yeSBpc24ndCBy ZWFjaGFibGUgYnkgdGhlIGRldmljZS4KKwkJICogRmFsbCBiYWNrIG9uIHN3aW90bGJfbWFwX3Np bmdsZSgpLgorCQkgKi8KKwkJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZykgcmV0LCBvcmRlcik7 CisJCXJldCA9IE5VTEw7CisJfQorCWlmICghcmV0KSB7CisJCS8qCisJCSAqIFdlIGFyZSBlaXRo ZXIgb3V0IG9mIG1lbW9yeSBvciB0aGUgZGV2aWNlIGNhbid0IERNQQorCQkgKiB0byBHRlBfRE1B IG1lbW9yeTsgZmFsbCBiYWNrIG9uCisJCSAqIHN3aW90bGJfbWFwX3NpbmdsZSgpLCB3aGljaCB3 aWxsIGdyYWIgbWVtb3J5IGZyb20KKwkJICogdGhlIGxvd2VzdCBhdmFpbGFibGUgYWRkcmVzcyBy YW5nZS4KKwkJICovCisJCWRtYV9hZGRyX3QgaGFuZGxlOworCQloYW5kbGUgPSBzd2lvdGxiX21h cF9zaW5nbGUoTlVMTCwgTlVMTCwgc2l6ZSwgRE1BX0ZST01fREVWSUNFKTsKKwkJaWYgKHN3aW90 bGJfZG1hX21hcHBpbmdfZXJyb3IoaGFuZGxlKSkKKwkJCXJldHVybiBOVUxMOworCisJCXJldCA9 IGJ1c190b192aXJ0KGhhbmRsZSk7CisJfQorCisJbWVtc2V0KHJldCwgMCwgc2l6ZSk7CisJZGV2 X2FkZHIgPSB2aXJ0X3RvX2J1cyhyZXQpOworCisJLyogQ29uZmlybSBhZGRyZXNzIGNhbiBiZSBE TUEnZCBieSBkZXZpY2UgKi8KKwlpZiAoYWRkcmVzc19uZWVkc19tYXBwaW5nKGh3ZGV2LCBkZXZf YWRkcikpIHsKKwkJcHJpbnRrKCJod2RldiBETUEgbWFzayA9IDB4JTAxNkx4LCBkZXZfYWRkciA9 IDB4JTAxNmx4XG4iLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykqaHdkZXYtPmRtYV9t YXNrLCBkZXZfYWRkcik7CisJCXBhbmljKCJzd2lvdGxiX2FsbG9jX2NvaGVyZW50OiBhbGxvY2F0 ZWQgbWVtb3J5IGlzIG91dCBvZiAiCisJCSAgICAgICJyYW5nZSBmb3IgZGV2aWNlIik7CisJfQor CSpkbWFfaGFuZGxlID0gZGV2X2FkZHI7CisJcmV0dXJuIHJldDsKK30KKwordm9pZAorc3dpb3Rs Yl9mcmVlX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCBzaXplX3Qgc2l6ZSwgdm9pZCAq dmFkZHIsCisJCSAgICAgIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSkKK3sKKwlpZiAoISh2YWRkciA+ PSAodm9pZCAqKWlvX3RsYl9zdGFydAorICAgICAgICAgICAgICAgICAgICAmJiB2YWRkciA8ICh2 b2lkICopaW9fdGxiX2VuZCkpCisJCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpIHZhZGRyLCBn ZXRfb3JkZXIoc2l6ZSkpOworCWVsc2UKKwkJLyogRE1BX1RPX0RFVklDRSB0byBhdm9pZCBtZW1j cHkgaW4gdW5tYXBfc2luZ2xlICovCisJCXN3aW90bGJfdW5tYXBfc2luZ2xlIChod2RldiwgZG1h X2hhbmRsZSwgc2l6ZSwgRE1BX1RPX0RFVklDRSk7Cit9CisKK3N0YXRpYyB2b2lkCitzd2lvdGxi X2Z1bGwoc3RydWN0IGRldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwgaW50IGRpciwgaW50IGRvX3Bh bmljKQoreworCS8qCisJICogUmFuIG91dCBvZiBJT01NVSBzcGFjZSBmb3IgdGhpcyBvcGVyYXRp b24uIFRoaXMgaXMgdmVyeSBiYWQuCisJICogVW5mb3J0dW5hdGVseSB0aGUgZHJpdmVycyBjYW5u b3QgaGFuZGxlIHRoaXMgb3BlcmF0aW9uIHByb3Blcmx5LgorCSAqIHVubGVzcyB0aGV5IGNoZWNr IGZvciBkbWFfbWFwcGluZ19lcnJvciAobW9zdCBkb24ndCkKKwkgKiBXaGVuIHRoZSBtYXBwaW5n IGlzIHNtYWxsIGVub3VnaCByZXR1cm4gYSBzdGF0aWMgYnVmZmVyIHRvIGxpbWl0CisJICogdGhl IGRhbWFnZSwgb3IgcGFuaWMgd2hlbiB0aGUgdHJhbnNmZXIgaXMgdG9vIGJpZy4KKwkgKi8KKwlw cmludGsoS0VSTl9FUlIgIkRNQTogT3V0IG9mIFNXLUlPTU1VIHNwYWNlIGZvciAlbHUgYnl0ZXMg YXQgIgorCSAgICAgICAiZGV2aWNlICVzXG4iLCBzaXplLCBkZXYgPyBkZXYtPmJ1c19pZCA6ICI/ Iik7CisKKwlpZiAoc2l6ZSA+IGlvX3RsYl9vdmVyZmxvdyAmJiBkb19wYW5pYykgeworCQlpZiAo ZGlyID09IERNQV9GUk9NX0RFVklDRSB8fCBkaXIgPT0gRE1BX0JJRElSRUNUSU9OQUwpCisJCQlw YW5pYygiRE1BOiBNZW1vcnkgd291bGQgYmUgY29ycnVwdGVkXG4iKTsKKwkJaWYgKGRpciA9PSBE TUFfVE9fREVWSUNFIHx8IGRpciA9PSBETUFfQklESVJFQ1RJT05BTCkKKwkJCXBhbmljKCJETUE6 IFJhbmRvbSBtZW1vcnkgd291bGQgYmUgRE1BZWRcbiIpOworCX0KK30KKworLyoKKyAqIE1hcCBh IHNpbmdsZSBidWZmZXIgb2YgdGhlIGluZGljYXRlZCBzaXplIGZvciBETUEgaW4gc3RyZWFtaW5n IG1vZGUuICBUaGUKKyAqIHBoeXNpY2FsIGFkZHJlc3MgdG8gdXNlIGlzIHJldHVybmVkLgorICoK KyAqIE9uY2UgdGhlIGRldmljZSBpcyBnaXZlbiB0aGUgZG1hIGFkZHJlc3MsIHRoZSBkZXZpY2Ug b3ducyB0aGlzIG1lbW9yeSB1bnRpbAorICogZWl0aGVyIHN3aW90bGJfdW5tYXBfc2luZ2xlIG9y IHN3aW90bGJfZG1hX3N5bmNfc2luZ2xlIGlzIHBlcmZvcm1lZC4KKyAqLworZG1hX2FkZHJfdAor c3dpb3RsYl9tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCB2b2lkICpwdHIsIHNpemVf dCBzaXplLCBpbnQgZGlyKQoreworCXVuc2lnbmVkIGxvbmcgZGV2X2FkZHIgPSB2aXJ0X3RvX2J1 cyhwdHIpOworCXZvaWQgKm1hcDsKKworCUJVR19PTihkaXIgPT0gRE1BX05PTkUpOworCS8qCisJ ICogSWYgdGhlIHBvaW50ZXIgcGFzc2VkIGluIGhhcHBlbnMgdG8gYmUgaW4gdGhlIGRldmljZSdz IERNQSB3aW5kb3csCisJICogd2UgY2FuIHNhZmVseSByZXR1cm4gdGhlIGRldmljZSBhZGRyIGFu ZCBub3Qgd29ycnkgYWJvdXQgYm91bmNlCisJICogYnVmZmVyaW5nIGl0LgorCSAqLworCWlmICgh YWRkcmVzc19uZWVkc19tYXBwaW5nKGh3ZGV2LCBkZXZfYWRkcikgJiYgIXN3aW90bGJfZm9yY2Up CisJCXJldHVybiBkZXZfYWRkcjsKKworCS8qCisJICogT2ggd2VsbCwgaGF2ZSB0byBhbGxvY2F0 ZSBhbmQgbWFwIGEgYm91bmNlIGJ1ZmZlci4KKwkgKi8KKwltYXAgPSBtYXBfc2luZ2xlKGh3ZGV2 LCBwdHIsIHNpemUsIGRpcik7CisJaWYgKCFtYXApIHsKKwkJc3dpb3RsYl9mdWxsKGh3ZGV2LCBz aXplLCBkaXIsIDEpOworCQltYXAgPSBpb190bGJfb3ZlcmZsb3dfYnVmZmVyOworCX0KKworCWRl dl9hZGRyID0gdmlydF90b19idXMobWFwKTsKKworCS8qCisJICogRW5zdXJlIHRoYXQgdGhlIGFk ZHJlc3MgcmV0dXJuZWQgaXMgRE1BJ2JsZQorCSAqLworCWlmIChhZGRyZXNzX25lZWRzX21hcHBp bmcoaHdkZXYsIGRldl9hZGRyKSkKKwkJcGFuaWMoIm1hcF9zaW5nbGU6IGJvdW5jZSBidWZmZXIg aXMgbm90IERNQSdibGUiKTsKKworCXJldHVybiBkZXZfYWRkcjsKK30KKworLyoKKyAqIFNpbmNl IERNQSBpcyBpLWNhY2hlIGNvaGVyZW50LCBhbnkgKGNvbXBsZXRlKSBwYWdlcyB0aGF0IHdlcmUg d3JpdHRlbiB2aWEKKyAqIERNQSBjYW4gYmUgbWFya2VkIGFzICJjbGVhbiIgc28gdGhhdCBsYXp5 X21tdV9wcm90X3VwZGF0ZSgpIGRvZXNuJ3QgaGF2ZSB0bworICogZmx1c2ggdGhlbSB3aGVuIHRo ZXkgZ2V0IG1hcHBlZCBpbnRvIGFuIGV4ZWN1dGFibGUgdm0tYXJlYS4KKyAqLworc3RhdGljIHZv aWQKK21hcmtfY2xlYW4odm9pZCAqYWRkciwgc2l6ZV90IHNpemUpCit7CisJdW5zaWduZWQgbG9u ZyBwZ19hZGRyLCBlbmQ7CisKKwlwZ19hZGRyID0gUEFHRV9BTElHTigodW5zaWduZWQgbG9uZykg YWRkcik7CisJZW5kID0gKHVuc2lnbmVkIGxvbmcpIGFkZHIgKyBzaXplOworCXdoaWxlIChwZ19h ZGRyICsgUEFHRV9TSVpFIDw9IGVuZCkgeworCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHZpcnRfdG9f cGFnZShwZ19hZGRyKTsKKwkJc2V0X2JpdChQR19hcmNoXzEsICZwYWdlLT5mbGFncyk7CisJCXBn X2FkZHIgKz0gUEFHRV9TSVpFOworCX0KK30KKworLyoKKyAqIFVubWFwIGEgc2luZ2xlIHN0cmVh bWluZyBtb2RlIERNQSB0cmFuc2xhdGlvbi4gIFRoZSBkbWFfYWRkciBhbmQgc2l6ZSBtdXN0Cisg KiBtYXRjaCB3aGF0IHdhcyBwcm92aWRlZCBmb3IgaW4gYSBwcmV2aW91cyBzd2lvdGxiX21hcF9z aW5nbGUgY2FsbC4gIEFsbAorICogb3RoZXIgdXNhZ2VzIGFyZSB1bmRlZmluZWQuCisgKgorICog QWZ0ZXIgdGhpcyBjYWxsLCByZWFkcyBieSB0aGUgY3B1IHRvIHRoZSBidWZmZXIgYXJlIGd1YXJh bnRlZWQgdG8gc2VlCisgKiB3aGF0ZXZlciB0aGUgZGV2aWNlIHdyb3RlIHRoZXJlLgorICovCit2 b2lkCitzd2lvdGxiX3VubWFwX3NpbmdsZShzdHJ1Y3QgZGV2aWNlICpod2RldiwgZG1hX2FkZHJf dCBkZXZfYWRkciwgc2l6ZV90IHNpemUsCisJCSAgICAgaW50IGRpcikKK3sKKwljaGFyICpkbWFf YWRkciA9IGJ1c190b192aXJ0KGRldl9hZGRyKTsKKworCUJVR19PTihkaXIgPT0gRE1BX05PTkUp OworCWlmIChkbWFfYWRkciA+PSBpb190bGJfc3RhcnQgJiYgZG1hX2FkZHIgPCBpb190bGJfZW5k KQorCQl1bm1hcF9zaW5nbGUoaHdkZXYsIGRtYV9hZGRyLCBzaXplLCBkaXIpOworCWVsc2UgaWYg KGRpciA9PSBETUFfRlJPTV9ERVZJQ0UpCisJCW1hcmtfY2xlYW4oZG1hX2FkZHIsIHNpemUpOwor fQorCisvKgorICogTWFrZSBwaHlzaWNhbCBtZW1vcnkgY29uc2lzdGVudCBmb3IgYSBzaW5nbGUg c3RyZWFtaW5nIG1vZGUgRE1BIHRyYW5zbGF0aW9uCisgKiBhZnRlciBhIHRyYW5zZmVyLgorICoK KyAqIElmIHlvdSBwZXJmb3JtIGEgc3dpb3RsYl9tYXBfc2luZ2xlKCkgYnV0IHdpc2ggdG8gaW50 ZXJyb2dhdGUgdGhlIGJ1ZmZlcgorICogdXNpbmcgdGhlIGNwdSwgeWV0IGRvIG5vdCB3aXNoIHRv IHRlYXJkb3duIHRoZSBkbWEgbWFwcGluZywgeW91IG11c3QKKyAqIGNhbGwgdGhpcyBmdW5jdGlv biBiZWZvcmUgZG9pbmcgc28uICBBdCB0aGUgbmV4dCBwb2ludCB5b3UgZ2l2ZSB0aGUgZG1hCisg KiBhZGRyZXNzIGJhY2sgdG8gdGhlIGNhcmQsIHlvdSBtdXN0IGZpcnN0IHBlcmZvcm0gYQorICog c3dpb3RsYl9kbWFfc3luY19mb3JfZGV2aWNlLCBhbmQgdGhlbiB0aGUgZGV2aWNlIGFnYWluIG93 bnMgdGhlIGJ1ZmZlcgorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK3N3aW90bGJfc3luY19zaW5n bGUoc3RydWN0IGRldmljZSAqaHdkZXYsIGRtYV9hZGRyX3QgZGV2X2FkZHIsCisJCSAgICBzaXpl X3Qgc2l6ZSwgaW50IGRpciwgaW50IHRhcmdldCkKK3sKKwljaGFyICpkbWFfYWRkciA9IGJ1c190 b192aXJ0KGRldl9hZGRyKTsKKworCUJVR19PTihkaXIgPT0gRE1BX05PTkUpOworCWlmIChkbWFf YWRkciA+PSBpb190bGJfc3RhcnQgJiYgZG1hX2FkZHIgPCBpb190bGJfZW5kKQorCQlzeW5jX3Np bmdsZShod2RldiwgZG1hX2FkZHIsIHNpemUsIGRpciwgdGFyZ2V0KTsKKwllbHNlIGlmIChkaXIg PT0gRE1BX0ZST01fREVWSUNFKQorCQltYXJrX2NsZWFuKGRtYV9hZGRyLCBzaXplKTsKK30KKwor dm9pZAorc3dpb3RsYl9zeW5jX3NpbmdsZV9mb3JfY3B1KHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCBk bWFfYWRkcl90IGRldl9hZGRyLAorCQkJICAgIHNpemVfdCBzaXplLCBpbnQgZGlyKQoreworCXN3 aW90bGJfc3luY19zaW5nbGUoaHdkZXYsIGRldl9hZGRyLCBzaXplLCBkaXIsIFNZTkNfRk9SX0NQ VSk7Cit9CisKK3ZvaWQKK3N3aW90bGJfc3luY19zaW5nbGVfZm9yX2RldmljZShzdHJ1Y3QgZGV2 aWNlICpod2RldiwgZG1hX2FkZHJfdCBkZXZfYWRkciwKKwkJCSAgICAgICBzaXplX3Qgc2l6ZSwg aW50IGRpcikKK3sKKwlzd2lvdGxiX3N5bmNfc2luZ2xlKGh3ZGV2LCBkZXZfYWRkciwgc2l6ZSwg ZGlyLCBTWU5DX0ZPUl9ERVZJQ0UpOworfQorCisvKgorICogU2FtZSBhcyBhYm92ZSwgYnV0IGZv ciBhIHN1Yi1yYW5nZSBvZiB0aGUgbWFwcGluZy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkCitz d2lvdGxiX3N5bmNfc2luZ2xlX3JhbmdlKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCBkbWFfYWRkcl90 IGRldl9hZGRyLAorCQkJICB1bnNpZ25lZCBsb25nIG9mZnNldCwgc2l6ZV90IHNpemUsCisJCQkg IGludCBkaXIsIGludCB0YXJnZXQpCit7CisJY2hhciAqZG1hX2FkZHIgPSBidXNfdG9fdmlydChk ZXZfYWRkcikgKyBvZmZzZXQ7CisKKwlCVUdfT04oZGlyID09IERNQV9OT05FKTsKKwlpZiAoZG1h X2FkZHIgPj0gaW9fdGxiX3N0YXJ0ICYmIGRtYV9hZGRyIDwgaW9fdGxiX2VuZCkKKwkJc3luY19z aW5nbGUoaHdkZXYsIGRtYV9hZGRyLCBzaXplLCBkaXIsIHRhcmdldCk7CisJZWxzZSBpZiAoZGly ID09IERNQV9GUk9NX0RFVklDRSkKKwkJbWFya19jbGVhbihkbWFfYWRkciwgc2l6ZSk7Cit9CisK K3ZvaWQKK3N3aW90bGJfc3luY19zaW5nbGVfcmFuZ2VfZm9yX2NwdShzdHJ1Y3QgZGV2aWNlICpo d2RldiwgZG1hX2FkZHJfdCBkZXZfYWRkciwKKwkJCQkgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBz aXplX3Qgc2l6ZSwgaW50IGRpcikKK3sKKwlzd2lvdGxiX3N5bmNfc2luZ2xlX3JhbmdlKGh3ZGV2 LCBkZXZfYWRkciwgb2Zmc2V0LCBzaXplLCBkaXIsCisJCQkJICBTWU5DX0ZPUl9DUFUpOworfQor Cit2b2lkCitzd2lvdGxiX3N5bmNfc2luZ2xlX3JhbmdlX2Zvcl9kZXZpY2Uoc3RydWN0IGRldmlj ZSAqaHdkZXYsIGRtYV9hZGRyX3QgZGV2X2FkZHIsCisJCQkJICAgICB1bnNpZ25lZCBsb25nIG9m ZnNldCwgc2l6ZV90IHNpemUsIGludCBkaXIpCit7CisJc3dpb3RsYl9zeW5jX3NpbmdsZV9yYW5n ZShod2RldiwgZGV2X2FkZHIsIG9mZnNldCwgc2l6ZSwgZGlyLAorCQkJCSAgU1lOQ19GT1JfREVW SUNFKTsKK30KKworLyoKKyAqIE1hcCBhIHNldCBvZiBidWZmZXJzIGRlc2NyaWJlZCBieSBzY2F0 dGVybGlzdCBpbiBzdHJlYW1pbmcgbW9kZSBmb3IgRE1BLgorICogVGhpcyBpcyB0aGUgc2NhdHRl ci1nYXRoZXIgdmVyc2lvbiBvZiB0aGUgYWJvdmUgc3dpb3RsYl9tYXBfc2luZ2xlCisgKiBpbnRl cmZhY2UuICBIZXJlIHRoZSBzY2F0dGVyIGdhdGhlciBsaXN0IGVsZW1lbnRzIGFyZSBlYWNoIHRh Z2dlZCB3aXRoIHRoZQorICogYXBwcm9wcmlhdGUgZG1hIGFkZHJlc3MgYW5kIGxlbmd0aC4gIFRo ZXkgYXJlIG9idGFpbmVkIHZpYQorICogc2dfZG1hX3thZGRyZXNzLGxlbmd0aH0oU0cpLgorICoK KyAqIE5PVEU6IEFuIGltcGxlbWVudGF0aW9uIG1heSBiZSBhYmxlIHRvIHVzZSBhIHNtYWxsZXIg bnVtYmVyIG9mCisgKiAgICAgICBETUEgYWRkcmVzcy9sZW5ndGggcGFpcnMgdGhhbiB0aGVyZSBh cmUgU0cgdGFibGUgZWxlbWVudHMuCisgKiAgICAgICAoZm9yIGV4YW1wbGUgdmlhIHZpcnR1YWwg bWFwcGluZyBjYXBhYmlsaXRpZXMpCisgKiAgICAgICBUaGUgcm91dGluZSByZXR1cm5zIHRoZSBu dW1iZXIgb2YgYWRkci9sZW5ndGggcGFpcnMgYWN0dWFsbHkKKyAqICAgICAgIHVzZWQsIGF0IG1v c3QgbmVudHMuCisgKgorICogRGV2aWNlIG93bmVyc2hpcCBpc3N1ZXMgYXMgbWVudGlvbmVkIGFi b3ZlIGZvciBzd2lvdGxiX21hcF9zaW5nbGUgYXJlIHRoZQorICogc2FtZSBoZXJlLgorICovCitp bnQKK3N3aW90bGJfbWFwX3NnKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxp c3QgKnNnLCBpbnQgbmVsZW1zLAorCSAgICAgICBpbnQgZGlyKQoreworCXZvaWQgKmFkZHI7CisJ dW5zaWduZWQgbG9uZyBkZXZfYWRkcjsKKwlpbnQgaTsKKworCUJVR19PTihkaXIgPT0gRE1BX05P TkUpOworCisJZm9yIChpID0gMDsgaSA8IG5lbGVtczsgaSsrLCBzZysrKSB7CisJCWFkZHIgPSBT R19FTlRfVklSVF9BRERSRVNTKHNnKTsKKwkJZGV2X2FkZHIgPSB2aXJ0X3RvX2J1cyhhZGRyKTsK KwkJaWYgKHN3aW90bGJfZm9yY2UgfHwgYWRkcmVzc19uZWVkc19tYXBwaW5nKGh3ZGV2LCBkZXZf YWRkcikpIHsKKwkJCXZvaWQgKm1hcCA9IG1hcF9zaW5nbGUoaHdkZXYsIGFkZHIsIHNnLT5sZW5n dGgsIGRpcik7CisJCQlzZy0+ZG1hX2FkZHJlc3MgPSB2aXJ0X3RvX2J1cyhtYXApOworCQkJaWYg KCFtYXApIHsKKwkJCQkvKiBEb24ndCBwYW5pYyBoZXJlLCB3ZSBleHBlY3QgbWFwX3NnIHVzZXJz CisJCQkJICAgdG8gZG8gcHJvcGVyIGVycm9yIGhhbmRsaW5nLiAqLworCQkJCXN3aW90bGJfZnVs bChod2Rldiwgc2ctPmxlbmd0aCwgZGlyLCAwKTsKKwkJCQlzd2lvdGxiX3VubWFwX3NnKGh3ZGV2 LCBzZyAtIGksIGksIGRpcik7CisJCQkJc2dbMF0uZG1hX2xlbmd0aCA9IDA7CisJCQkJcmV0dXJu IDA7CisJCQl9CisJCX0gZWxzZQorCQkJc2ctPmRtYV9hZGRyZXNzID0gZGV2X2FkZHI7CisJCXNn LT5kbWFfbGVuZ3RoID0gc2ctPmxlbmd0aDsKKwl9CisJcmV0dXJuIG5lbGVtczsKK30KKworLyoK KyAqIFVubWFwIGEgc2V0IG9mIHN0cmVhbWluZyBtb2RlIERNQSB0cmFuc2xhdGlvbnMuICBBZ2Fp biwgY3B1IHJlYWQgcnVsZXMKKyAqIGNvbmNlcm5pbmcgY2FsbHMgaGVyZSBhcmUgdGhlIHNhbWUg YXMgZm9yIHN3aW90bGJfdW5tYXBfc2luZ2xlKCkgYWJvdmUuCisgKi8KK3ZvaWQKK3N3aW90bGJf dW5tYXBfc2coc3RydWN0IGRldmljZSAqaHdkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGlu dCBuZWxlbXMsCisJCSBpbnQgZGlyKQoreworCWludCBpOworCisJQlVHX09OKGRpciA9PSBETUFf Tk9ORSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbmVsZW1zOyBpKyssIHNnKyspCisJCWlmIChzZy0+ ZG1hX2FkZHJlc3MgIT0gU0dfRU5UX1BIWVNfQUREUkVTUyhzZykpCisJCQl1bm1hcF9zaW5nbGUo aHdkZXYsICh2b2lkICopIGJ1c190b192aXJ0KHNnLT5kbWFfYWRkcmVzcyksIHNnLT5kbWFfbGVu Z3RoLCBkaXIpOworCQllbHNlIGlmIChkaXIgPT0gRE1BX0ZST01fREVWSUNFKQorCQkJbWFya19j bGVhbihTR19FTlRfVklSVF9BRERSRVNTKHNnKSwgc2ctPmRtYV9sZW5ndGgpOworfQorCisvKgor ICogTWFrZSBwaHlzaWNhbCBtZW1vcnkgY29uc2lzdGVudCBmb3IgYSBzZXQgb2Ygc3RyZWFtaW5n IG1vZGUgRE1BIHRyYW5zbGF0aW9ucworICogYWZ0ZXIgYSB0cmFuc2Zlci4KKyAqCisgKiBUaGUg c2FtZSBhcyBzd2lvdGxiX3N5bmNfc2luZ2xlXyogYnV0IGZvciBhIHNjYXR0ZXItZ2F0aGVyIGxp c3QsIHNhbWUgcnVsZXMKKyAqIGFuZCB1c2FnZS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkCitz d2lvdGxiX3N5bmNfc2coc3RydWN0IGRldmljZSAqaHdkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAq c2csCisJCWludCBuZWxlbXMsIGludCBkaXIsIGludCB0YXJnZXQpCit7CisJaW50IGk7CisKKwlC VUdfT04oZGlyID09IERNQV9OT05FKTsKKworCWZvciAoaSA9IDA7IGkgPCBuZWxlbXM7IGkrKywg c2crKykKKwkJaWYgKHNnLT5kbWFfYWRkcmVzcyAhPSBTR19FTlRfUEhZU19BRERSRVNTKHNnKSkK KwkJCXN5bmNfc2luZ2xlKGh3ZGV2LCAodm9pZCAqKSBzZy0+ZG1hX2FkZHJlc3MsCisJCQkJICAg IHNnLT5kbWFfbGVuZ3RoLCBkaXIsIHRhcmdldCk7Cit9CisKK3ZvaWQKK3N3aW90bGJfc3luY19z Z19mb3JfY3B1KHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAor CQkJaW50IG5lbGVtcywgaW50IGRpcikKK3sKKwlzd2lvdGxiX3N5bmNfc2coaHdkZXYsIHNnLCBu ZWxlbXMsIGRpciwgU1lOQ19GT1JfQ1BVKTsKK30KKwordm9pZAorc3dpb3RsYl9zeW5jX3NnX2Zv cl9kZXZpY2Uoc3RydWN0IGRldmljZSAqaHdkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCisJ CQkgICBpbnQgbmVsZW1zLCBpbnQgZGlyKQoreworCXN3aW90bGJfc3luY19zZyhod2Rldiwgc2cs IG5lbGVtcywgZGlyLCBTWU5DX0ZPUl9ERVZJQ0UpOworfQorCitpbnQKK3N3aW90bGJfZG1hX21h cHBpbmdfZXJyb3IoZG1hX2FkZHJfdCBkbWFfYWRkcikKK3sKKwlyZXR1cm4gKGRtYV9hZGRyID09 IHZpcnRfdG9fYnVzKGlvX3RsYl9vdmVyZmxvd19idWZmZXIpKTsKK30KKworLyoKKyAqIFJldHVy biB3aGV0aGVyIHRoZSBnaXZlbiBkZXZpY2UgRE1BIGFkZHJlc3MgbWFzayBjYW4gYmUgc3VwcG9y dGVkCisgKiBwcm9wZXJseS4gIEZvciBleGFtcGxlLCBpZiB5b3VyIGRldmljZSBjYW4gb25seSBk cml2ZSB0aGUgbG93IDI0LWJpdHMKKyAqIGR1cmluZyBidXMgbWFzdGVyaW5nLCB0aGVuIHlvdSB3 b3VsZCBwYXNzIDB4MDBmZmZmZmYgYXMgdGhlIG1hc2sgdG8KKyAqIHRoaXMgZnVuY3Rpb24uCisg Ki8KK2ludAorc3dpb3RsYl9kbWFfc3VwcG9ydGVkIChzdHJ1Y3QgZGV2aWNlICpod2RldiwgdTY0 IG1hc2spCit7CisJcmV0dXJuICh2aXJ0X3RvX2J1cyAoaW9fdGxiX2VuZCkgLSAxKSA8PSBtYXNr OworfQorCitFWFBPUlRfU1lNQk9MKHN3aW90bGJfaW5pdCk7CitFWFBPUlRfU1lNQk9MKHN3aW90 bGJfbWFwX3NpbmdsZSk7CitFWFBPUlRfU1lNQk9MKHN3aW90bGJfdW5tYXBfc2luZ2xlKTsKK0VY UE9SVF9TWU1CT0woc3dpb3RsYl9tYXBfc2cpOworRVhQT1JUX1NZTUJPTChzd2lvdGxiX3VubWFw X3NnKTsKK0VYUE9SVF9TWU1CT0woc3dpb3RsYl9zeW5jX3NpbmdsZV9mb3JfY3B1KTsKK0VYUE9S VF9TWU1CT0woc3dpb3RsYl9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKTsKK0VYUE9SVF9TWU1CT0xf R1BMKHN3aW90bGJfc3luY19zaW5nbGVfcmFuZ2VfZm9yX2NwdSk7CitFWFBPUlRfU1lNQk9MX0dQ TChzd2lvdGxiX3N5bmNfc2luZ2xlX3JhbmdlX2Zvcl9kZXZpY2UpOworRVhQT1JUX1NZTUJPTChz d2lvdGxiX3N5bmNfc2dfZm9yX2NwdSk7CitFWFBPUlRfU1lNQk9MKHN3aW90bGJfc3luY19zZ19m b3JfZGV2aWNlKTsKK0VYUE9SVF9TWU1CT0woc3dpb3RsYl9kbWFfbWFwcGluZ19lcnJvcik7CitF WFBPUlRfU1lNQk9MKHN3aW90bGJfYWxsb2NfY29oZXJlbnQpOworRVhQT1JUX1NZTUJPTChzd2lv dGxiX2ZyZWVfY29oZXJlbnQpOworRVhQT1JUX1NZTUJPTChzd2lvdGxiX2RtYV9zdXBwb3J0ZWQp Owo= ------_=_NextPart_001_01C74ECD.D17A9093 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_01C74ECD.D17A9093--