From mboxrd@z Thu Jan 1 00:00:00 1970 Return-path: Received: from metis.ext.pengutronix.de ([2001:67c:670:201:290:27ff:fe1d:cc33]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1jH5Br-0004P3-JT for barebox@lists.infradead.org; Wed, 25 Mar 2020 12:31:26 +0000 From: Sascha Hauer Date: Wed, 25 Mar 2020 13:31:10 +0100 Message-Id: <20200325123111.9612-24-s.hauer@pengutronix.de> In-Reply-To: <20200325123111.9612-1-s.hauer@pengutronix.de> References: <20200325123111.9612-1-s.hauer@pengutronix.de> MIME-Version: 1.0 List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "barebox" Errors-To: barebox-bounces+u.kleine-koenig=pengutronix.de@lists.infradead.org Subject: [PATCH 23/24] usb: host: remove xhci driver To: Barebox List VGhlIGN1cnJlbnQgeGhjaSBkcml2ZXIgc3VwcG9ydCBVU0IgMi4wIG9ubHkuIFRoZSBVLUJvb3Qg ZHJpdmVyIGlzIGJldHRlcgpkZXZlbG9wZWQgYW5kIHN1cHBvcnRzIFVTQiAzLjAgZGV2aWNlcy4g UmVtb3ZlIHRoZSB4aGNpIGRyaXZlciBmaXJzdCBhcwphIHNlcGFyYXRlIHBhdGNoIHRvIG1ha2Ug dGhlIHBhdGNoIGFkZGluZyB0aGUgbmV3IFUtQm9vdCBiYXNlZCBkcml2ZXIKYmV0dGVyIHJlYWRh YmxlLgoKU2lnbmVkLW9mZi1ieTogU2FzY2hhIEhhdWVyIDxzLmhhdWVyQHBlbmd1dHJvbml4LmRl PgotLS0KIGRyaXZlcnMvdXNiL2hvc3QveGhjaS1oY2QuYyB8IDE2NzUgLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0KIGRyaXZlcnMvdXNiL2hvc3QveGhjaS1odWIuYyB8ICA2NDYg LS0tLS0tLS0tLS0tLS0KIGRyaXZlcnMvdXNiL2hvc3QveGhjaS1wY2kuYyB8ICAgNDAgLQogZHJp dmVycy91c2IvaG9zdC94aGNpLmggICAgIHwgMTI4MiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0KIDQgZmlsZXMgY2hhbmdlZCwgMzY0MyBkZWxldGlvbnMoLSkKIGRlbGV0ZSBtb2RlIDEwMDY0 NCBkcml2ZXJzL3VzYi9ob3N0L3hoY2ktaGNkLmMKIGRlbGV0ZSBtb2RlIDEwMDY0NCBkcml2ZXJz L3VzYi9ob3N0L3hoY2ktaHViLmMKIGRlbGV0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL3VzYi9ob3N0 L3hoY2ktcGNpLmMKIGRlbGV0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL3VzYi9ob3N0L3hoY2kuaAoK ZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1oY2QuYyBiL2RyaXZlcnMvdXNiL2hv c3QveGhjaS1oY2QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJhNmNjZDVjZC4u MDAwMDAwMDAwMAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktaGNkLmMKKysrIC9kZXYvbnVs bApAQCAtMSwxNjc1ICswLDAgQEAKLS8qCi0gKiB4SENJIEhDRCBkcml2ZXIKLSAqCi0gKiBTZWJh c3RpYW4gSGVzc2VsYmFydGggPHNlYmFzdGlhbi5oZXNzZWxiYXJ0aEBnbWFpbC5jb20+Ci0gKgot ICogU29tZSBjb2RlIGJvcnJvd2VkIGZyb20gdGhlIExpbnV4IHhIQ0kgZHJpdmVyCi0gKiAgIEF1 dGhvcjogU2FyYWggU2hhcnAKLSAqICAgQ29weXJpZ2h0IChDKSAyMDA4IEludGVsIENvcnAuCi0g KgotICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdl bmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIHZlcnNpb24gMi4gIFRoaXMgcHJvZ3JhbSBpcyBsaWNl bnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55Ci0gKiB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhl ciBleHByZXNzIG9yIGltcGxpZWQuCi0gKi8KLS8vI2RlZmluZSBERUJVRwotI2luY2x1ZGUgPGNs b2NrLmg+Ci0jaW5jbHVkZSA8Y29tbW9uLmg+Ci0jaW5jbHVkZSA8ZG1hLmg+Ci0jaW5jbHVkZSA8 aW5pdC5oPgotI2luY2x1ZGUgPGlvLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0jaW5jbHVk ZSA8dXNiL3VzYi5oPgotI2luY2x1ZGUgPHVzYi94aGNpLmg+Ci0KLSNpbmNsdWRlICJ4aGNpLmgi Ci0KLQotc3RhdGljIHN0cnVjdCB4aGNpX2lucHV0X2NvbnRyb2xfY3R4ICoKLXhoY2lfZ2V0X2lu cHV0X2NvbnRyb2xfY3R4KHN0cnVjdCB4aGNpX2NvbnRhaW5lcl9jdHggKmN0eCkKLXsKLQlpZiAo Y3R4LT50eXBlICE9IFhIQ0lfQ1RYX1RZUEVfSU5QVVQpCi0JCXJldHVybiBOVUxMOwotCi0JcmV0 dXJuIChzdHJ1Y3QgeGhjaV9pbnB1dF9jb250cm9sX2N0eCAqKWN0eC0+Ynl0ZXM7Ci19Ci0KLXN0 YXRpYyBzdHJ1Y3QgeGhjaV9zbG90X2N0eCAqeGhjaV9nZXRfc2xvdF9jdHgoc3RydWN0IHhoY2lf aGNkICp4aGNpLAotCQkJCQkgICAgICAgc3RydWN0IHhoY2lfY29udGFpbmVyX2N0eCAqY3R4KQot ewotCWlmIChjdHgtPnR5cGUgPT0gWEhDSV9DVFhfVFlQRV9ERVZJQ0UpCi0JCXJldHVybiAoc3Ry dWN0IHhoY2lfc2xvdF9jdHggKiljdHgtPmJ5dGVzOwotCi0JcmV0dXJuIChzdHJ1Y3QgeGhjaV9z bG90X2N0eCAqKQotCQkoY3R4LT5ieXRlcyArIEhDQ19DVFhfU0laRSh4aGNpLT5oY2NfcGFyYW1z KSk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgeGhjaV9lcF9jdHggKnhoY2lfZ2V0X2VwX2N0eChzdHJ1 Y3QgeGhjaV9oY2QgKnhoY2ksCi0JCQkJCSAgIHN0cnVjdCB4aGNpX2NvbnRhaW5lcl9jdHggKmN0 eCwKLQkJCQkJICAgdW5zaWduZWQgaW50IGVwX2luZGV4KQotewotCS8qIGluY3JlbWVudCBlcCBp bmRleCBieSBvZmZzZXQgb2Ygc3RhcnQgb2YgZXAgY3R4IGFycmF5ICovCi0JZXBfaW5kZXgrKzsK LQlpZiAoY3R4LT50eXBlID09IFhIQ0lfQ1RYX1RZUEVfSU5QVVQpCi0JCWVwX2luZGV4Kys7Ci0K LQlyZXR1cm4gKHN0cnVjdCB4aGNpX2VwX2N0eCAqKQotCQkoY3R4LT5ieXRlcyArIChlcF9pbmRl eCAqIEhDQ19DVFhfU0laRSh4aGNpLT5oY2NfcGFyYW1zKSkpOwotfQotCi0vKgotICogeEhDSSBy aW5nIGhhbmRsaW5nCi0gKi8KLQotc3RhdGljIGludCB4aGNpX3JpbmdfaXNfbGFzdF90cmIoc3Ry dWN0IHhoY2lfcmluZyAqcmluZywgdW5pb24geGhjaV90cmIgKnRyYikKLXsKLQlpZiAocmluZy0+ dHlwZSA9PSBUWVBFX0VWRU5UKQotCQlyZXR1cm4gdHJiID09ICZyaW5nLT50cmJzW05VTV9FVkVO VF9UUkJTXTsKLQllbHNlCi0JCXJldHVybiBUUkJfVFlQRV9MSU5LKGxlMzJfdG9fY3B1KHRyYi0+ bGluay5jb250cm9sKSk7Ci19Ci0KLXN0YXRpYyBpbnQgeGhjaV9yaW5nX2luY3JlbWVudChzdHJ1 Y3QgeGhjaV9yaW5nICpyaW5nLCBib29sIGVucXVldWUpCi17Ci0JdW5pb24geGhjaV90cmIgKipx dWV1ZSA9IChlbnF1ZXVlKSA/ICZyaW5nLT5lbnF1ZXVlIDogJnJpbmctPmRlcXVldWU7Ci0KLQko KnF1ZXVlKSsrOwotCi0JaWYgKCF4aGNpX3JpbmdfaXNfbGFzdF90cmIocmluZywgKnF1ZXVlKSkK LQkJcmV0dXJuIDA7Ci0KLQlpZiAocmluZy0+dHlwZSA9PSBUWVBFX0VWRU5UKSB7Ci0JCSpxdWV1 ZSA9ICZyaW5nLT50cmJzWzBdOwotCQlyaW5nLT5jeWNsZV9zdGF0ZSBePSAxOwotCX0gZWxzZSB7 Ci0JCXUzMiBjdHJsID0gbGUzMl90b19jcHUoKCpxdWV1ZSktPmxpbmsuY29udHJvbCk7Ci0JCXZv aWQgKnAgPSAodm9pZCAqKShkbWFfYWRkcl90KQotCQkJbGU2NF90b19jcHUoKCpxdWV1ZSktPmxp bmsuc2VnbWVudF9wdHIpOwotCi0JCWN0cmwgPSAoY3RybCAmIH5UUkJfQ1lDTEUpIHwgcmluZy0+ Y3ljbGVfc3RhdGU7Ci0JCSgqcXVldWUpLT5saW5rLmNvbnRyb2wgPSBjcHVfdG9fbGUzMihjdHJs KTsKLQotCQlpZiAoZW5xdWV1ZSkKLQkJCXJpbmctPmVucXVldWUgPSBwOwotCQllbHNlCi0JCQly aW5nLT5kZXF1ZXVlID0gcDsKLQotCQlpZiAoY3RybCAmIExJTktfVE9HR0xFKQotCQkJcmluZy0+ Y3ljbGVfc3RhdGUgXj0gMTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB4aGNp X3JpbmdfaXNzdWVfdHJiKHN0cnVjdCB4aGNpX3JpbmcgKnJpbmcsIHVuaW9uIHhoY2lfdHJiICp0 cmIpCi17Ci0JdW5pb24geGhjaV90cmIgKmVucSA9IHJpbmctPmVucXVldWU7Ci0JaW50IGk7Ci0K LQkvKiBQYXNzIFRSQiB0byBoYXJkd2FyZSAqLwotCXRyYi0+Z2VuZXJpYy5maWVsZFszXSAmPSB+ VFJCX0NZQ0xFOwotCXRyYi0+Z2VuZXJpYy5maWVsZFszXSB8PSByaW5nLT5jeWNsZV9zdGF0ZTsK LQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotCQllbnEtPmdlbmVyaWMuZmllbGRbaV0gPSBjcHVf dG9fbGUzMih0cmItPmdlbmVyaWMuZmllbGRbaV0pOwotCi0JeGhjaV9yaW5nX2luY3JlbWVudChy aW5nLCAxKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCB4aGNpX3JpbmdfaW5pdChz dHJ1Y3QgeGhjaV9yaW5nICpyaW5nLCBpbnQgbnVtX3RyYnMsCi0JCQkgICBlbnVtIHhoY2lfcmlu Z190eXBlIHR5cGUpCi17Ci0JcmluZy0+dHlwZSA9IHR5cGU7Ci0JcmluZy0+Y3ljbGVfc3RhdGUg PSAxOwotCXJpbmctPm51bV90cmJzID0gbnVtX3RyYnM7Ci0JcmluZy0+ZW5xdWV1ZSA9IHJpbmct PmRlcXVldWUgPSAmcmluZy0+dHJic1swXTsKLQotCS8qIEV2ZW50IHJpbmcgaXMgbm90IGxpbmtl ZCAqLwotCWlmICh0eXBlID09IFRZUEVfRVZFTlQpCi0JCXJldHVybjsKLQotCXJpbmctPnRyYnNb bnVtX3RyYnMtMV0ubGluay5zZWdtZW50X3B0ciA9Ci0JCWNwdV90b19sZTY0KChkbWFfYWRkcl90 KSZyaW5nLT50cmJzWzBdKTsKLQlyaW5nLT50cmJzW251bV90cmJzLTFdLmxpbmsuY29udHJvbCA9 Ci0JCWNwdV90b19sZTMyKFRSQl9UWVBFKFRSQl9MSU5LKSB8IExJTktfVE9HR0xFKTsKLX0KLQot c3RhdGljIHN0cnVjdCB4aGNpX3JpbmcgKnhoY2lfZ2V0X2VuZHBvaW50X3Jpbmcoc3RydWN0IHho Y2lfaGNkICp4aGNpKQotewotCXN0cnVjdCB4aGNpX3JpbmcgKnJpbmc7Ci0KLQlpZiAobGlzdF9l bXB0eSgmeGhjaS0+cmluZ3NfbGlzdCkpIHsKLQkJZGV2X2Vycih4aGNpLT5kZXYsICJubyBtb3Jl IGVuZHBvaW50IHJpbmdzIGF2YWlsYWJsZVxuIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCXJp bmcgPSBsaXN0X2xhc3RfZW50cnkoJnhoY2ktPnJpbmdzX2xpc3QsIHN0cnVjdCB4aGNpX3Jpbmcs IGxpc3QpOwotCWxpc3RfZGVsX2luaXQoJnJpbmctPmxpc3QpOwotCi0JcmV0dXJuIHJpbmc7Ci19 Ci0KLXN0YXRpYyB2b2lkIHhoY2lfcHV0X2VuZHBvaW50X3Jpbmcoc3RydWN0IHhoY2lfaGNkICp4 aGNpLCBzdHJ1Y3QgeGhjaV9yaW5nICpyaW5nKQotewotCWlmICghcmluZykKLQkJcmV0dXJuOwot Ci0JbWVtc2V0KHJpbmctPnRyYnMsIDAsIHJpbmctPm51bV90cmJzICogc2l6ZW9mKHVuaW9uIHho Y2lfdHJiKSk7Ci0JbGlzdF9hZGRfdGFpbCgmcmluZy0+bGlzdCwgJnhoY2ktPnJpbmdzX2xpc3Qp OwotfQotCi0vKgotICogeGhjaV9nZXRfZW5kcG9pbnRfaW5kZXggLSBVc2VkIGZvciBwYXNzaW5n IGVuZHBvaW50IGJpdG1hc2tzIGJldHdlZW4gdGhlCi0gKiBjb3JlIGFuZCBIQ0RzLiAgRmluZCB0 aGUgaW5kZXggZm9yIGFuIGVuZHBvaW50IGdpdmVuIGl0cyBkZXNjcmlwdG9yLgotICogVXNlIHRo ZSByZXR1cm4gdmFsdWUgdG8gcmlnaHQgc2hpZnQgMSBmb3IgdGhlIGJpdG1hc2suCi0gKgotICog SW5kZXggID0gKGVwbnVtICogMikgKyBkaXJlY3Rpb24gLSAxLAotICogd2hlcmUgZGlyZWN0aW9u ID0gMCBmb3IgT1VULCAxIGZvciBJTi4KLSAqIEZvciBjb250cm9sIGVuZHBvaW50cywgdGhlIElO IGluZGV4IGlzIHVzZWQgKE9VVCBpbmRleCBpcyB1bnVzZWQpLCBzbwotICogaW5kZXggPSAoZXBu dW0gKiAyKSArIGRpcmVjdGlvbiAtIDEgPSAoZXBudW0gKiAyKSArIDEgLSAxID0gKGVwbnVtICog MikKLSAqLwotc3RhdGljIHVuc2lnbmVkIGludCB4aGNpX2dldF9lbmRwb2ludF9pbmRleCh1OCBl cGFkZHJlc3MsIHU4IGVwYXR0cmlidXRlcykKLXsKLQl1OCBlcG51bSA9IGVwYWRkcmVzcyAmIFVT Ql9FTkRQT0lOVF9OVU1CRVJfTUFTSzsKLQl1OCB4ZmVyID0gZXBhdHRyaWJ1dGVzICYgVVNCX0VO RFBPSU5UX1hGRVJUWVBFX01BU0s7Ci0JdW5zaWduZWQgaW50IGluZGV4OwotCi0JaWYgKHhmZXIg PT0gVVNCX0VORFBPSU5UX1hGRVJfQ09OVFJPTCkKLQkJaW5kZXggPSAodW5zaWduZWQgaW50KShl cG51bSAqIDIpOwotCWVsc2UKLQkJaW5kZXggPSAodW5zaWduZWQgaW50KShlcG51bSAqIDIpICsK LQkJCSgoZXBhZGRyZXNzICYgVVNCX0RJUl9JTikgPyAxIDogMCkgLSAxOwotCi0JcmV0dXJuIGlu ZGV4OwotfQotCi1zdGF0aWMgdTggeGhjaV9nZXRfZW5kcG9pbnRfdHlwZSh1OCBlcGFkZHJlc3Ms IHU4IGVwYXR0cmlidXRlcykKLXsKLQlpbnQgaW4gPSBlcGFkZHJlc3MgJiBVU0JfRU5EUE9JTlRf RElSX01BU0s7Ci0JdTggeGZlciA9IGVwYXR0cmlidXRlcyAmIFVTQl9FTkRQT0lOVF9YRkVSVFlQ RV9NQVNLOwotCXU4IHR5cGU7Ci0KLQlzd2l0Y2ggKHhmZXIpIHsKLQljYXNlIFVTQl9FTkRQT0lO VF9YRkVSX0NPTlRST0w6Ci0JCXR5cGUgPSBDVFJMX0VQOwotCQlicmVhazsKLQljYXNlIFVTQl9F TkRQT0lOVF9YRkVSX0lTT0M6Ci0JCXR5cGUgPSAoaW4pID8gSVNPQ19JTl9FUCA6IElTT0NfT1VU X0VQOwotCQlicmVhazsKLQljYXNlIFVTQl9FTkRQT0lOVF9YRkVSX0JVTEs6Ci0JCXR5cGUgPSAo aW4pID8gQlVMS19JTl9FUCA6IEJVTEtfT1VUX0VQOwotCQlicmVhazsKLQljYXNlIFVTQl9FTkRQ T0lOVF9YRkVSX0lOVDoKLQkJdHlwZSA9IChpbikgPyBJTlRfSU5fRVAgOiBJTlRfT1VUX0VQOwot CQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gdHlwZTsKLX0KLQotLyoKLSAqIENvbnZlcnQgaW50ZXJ2 YWwgZXhwcmVzc2VkIGFzIDJeKGJJbnRlcnZhbCAtIDEpID09IGludGVydmFsIGludG8KLSAqIHN0 cmFpZ2h0IGV4cG9uZW50IHZhbHVlIDJebiA9PSBpbnRlcnZhbC4KLSAqCi0gKi8KLXN0YXRpYyB1 MzIgeGhjaV9wYXJzZV9leHBvbmVudF9pbnRlcnZhbChzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwK LQkJCQkJc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcCkKLXsKLQl1MzIgaW50ZXJ2 YWw7Ci0KLQlpbnRlcnZhbCA9IGNsYW1wX3ZhbChlcC0+YkludGVydmFsLCAxLCAxNikgLSAxOwot CS8qCi0JICogRnVsbCBzcGVlZCBpc29jIGVuZHBvaW50cyBzcGVjaWZ5IGludGVydmFsIGluIGZy YW1lcywKLQkgKiBub3QgbWljcm9mcmFtZXMuIFdlIGFyZSB1c2luZyBtaWNyb2ZyYW1lcyBldmVy eXdoZXJlLAotCSAqIHNvIGFkanVzdCBhY2NvcmRpbmdseS4KLQkgKi8KLQlpZiAodWRldi0+c3Bl ZWQgPT0gVVNCX1NQRUVEX0ZVTEwpCi0JCWludGVydmFsICs9IDM7CS8qIDEgZnJhbWUgPSAyXjMg dWZyYW1lcyAqLwotCi0JcmV0dXJuIGludGVydmFsOwotfQotCi0vKgotICogQ29udmVydCBiSW50 ZXJ2YWwgZXhwcmVzc2VkIGluIG1pY3JvZnJhbWVzIChpbiAxLTI1NSByYW5nZSkgdG8gZXhwb25l bnQgb2YKLSAqIG1pY3JvZnJhbWVzLCByb3VuZGVkIGRvd24gdG8gbmVhcmVzdCBwb3dlciBvZiAy LgotICovCi1zdGF0aWMgdTMyIHhoY2lfbWljcm9mcmFtZXNfdG9fZXhwb25lbnQoc3RydWN0IHVz Yl9kZXZpY2UgKnVkZXYsCi0JCQlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwLCB1 MzIgZGVzY19pbnRlcnZhbCwKLQkJCXUzMiBtaW5fZXhwb25lbnQsIHUzMiBtYXhfZXhwb25lbnQp Ci17Ci0JdTMyIGludGVydmFsOwotCi0JaW50ZXJ2YWwgPSBmbHMoZGVzY19pbnRlcnZhbCkgLSAx OwotCXJldHVybiBjbGFtcF92YWwoaW50ZXJ2YWwsIG1pbl9leHBvbmVudCwgbWF4X2V4cG9uZW50 KTsKLX0KLQotc3RhdGljIGlubGluZSB1MzIgeGhjaV9wYXJzZV9taWNyb2ZyYW1lX2ludGVydmFs KHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LAotCQkJCQkgIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVz Y3JpcHRvciAqZXApCi17Ci0JaWYgKGVwLT5iSW50ZXJ2YWwgPT0gMCkKLQkJcmV0dXJuIDA7Ci0J cmV0dXJuIHhoY2lfbWljcm9mcmFtZXNfdG9fZXhwb25lbnQodWRldiwgZXAsIGVwLT5iSW50ZXJ2 YWwsIDAsIDE1KTsKLX0KLQotCi1zdGF0aWMgaW5saW5lIHUzMiB4aGNpX3BhcnNlX2ZyYW1lX2lu dGVydmFsKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LAotCQkJCSAgICAgc3RydWN0IHVzYl9lbmRw b2ludF9kZXNjcmlwdG9yICplcCkKLXsKLQlyZXR1cm4geGhjaV9taWNyb2ZyYW1lc190b19leHBv bmVudCh1ZGV2LCBlcCwgZXAtPmJJbnRlcnZhbCAqIDgsIDMsIDEwKTsKLX0KLQotc3RhdGljIHUz MiB4aGNpX2dldF9lbmRwb2ludF9pbnRlcnZhbChzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwKLQkJ CQkgICAgICBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwKQotewotCXU4IHR5cGUg PSBlcC0+Ym1BdHRyaWJ1dGVzICYgVVNCX0VORFBPSU5UX1hGRVJUWVBFX01BU0s7Ci0JdTMyIGlu dGVydmFsID0gMDsKLQotCXN3aXRjaCAodWRldi0+c3BlZWQpIHsKLQljYXNlIFVTQl9TUEVFRF9I SUdIOgotCQkvKiBNYXggTkFLIHJhdGUgKi8KLQkJaWYgKHR5cGUgPT0gVVNCX0VORFBPSU5UX1hG RVJfQ09OVFJPTCB8fAotCQkgICAgdHlwZSA9PSBVU0JfRU5EUE9JTlRfWEZFUl9CVUxLKSB7Ci0J CQlpbnRlcnZhbCA9IHhoY2lfcGFyc2VfbWljcm9mcmFtZV9pbnRlcnZhbCh1ZGV2LCBlcCk7Ci0J CQlicmVhazsKLQkJfQotCQkvKiBGYWxsIHRocm91Z2ggLSBTUyBhbmQgSFMgaXNvYy9pbnQgaGF2 ZSBzYW1lIGRlY29kaW5nICovCi0JY2FzZSBVU0JfU1BFRURfU1VQRVI6Ci0JCWlmICh0eXBlID09 IFVTQl9FTkRQT0lOVF9YRkVSX0lTT0MgfHwKLQkJICAgIHR5cGUgPT0gVVNCX0VORFBPSU5UX1hG RVJfSU5UKQotCQkJaW50ZXJ2YWwgPSB4aGNpX3BhcnNlX2V4cG9uZW50X2ludGVydmFsKHVkZXYs IGVwKTsKLQkJYnJlYWs7Ci0JY2FzZSBVU0JfU1BFRURfRlVMTDoKLQkJaWYgKHR5cGUgPT0gVVNC X0VORFBPSU5UX1hGRVJfSVNPQykgewotCQkJaW50ZXJ2YWwgPSB4aGNpX3BhcnNlX2V4cG9uZW50 X2ludGVydmFsKHVkZXYsIGVwKTsKLQkJCWJyZWFrOwotCQl9Ci0JCS8qCi0JCSAqIEZhbGwgdGhy b3VnaCBmb3IgaW50ZXJydXB0IGVuZHBvaW50IGludGVydmFsIGRlY29kaW5nCi0JCSAqIHNpbmNl IGl0IHVzZXMgdGhlIHNhbWUgcnVsZXMgYXMgbG93IHNwZWVkIGludGVycnVwdAotCQkgKiBlbmRw b2ludHMuCi0JCSAqLwotCWNhc2UgVVNCX1NQRUVEX0xPVzoKLQkJaWYgKHR5cGUgPT0gVVNCX0VO RFBPSU5UX1hGRVJfSVNPQyB8fAotCQkgICAgdHlwZSA9PSBVU0JfRU5EUE9JTlRfWEZFUl9JTlQp Ci0JCQlpbnRlcnZhbCA9IHhoY2lfcGFyc2VfZnJhbWVfaW50ZXJ2YWwodWRldiwgZXApOwotCQli cmVhazsKLQl9Ci0KLQlyZXR1cm4gaW50ZXJ2YWw7Ci19Ci0KLS8qIFRoZSAiTXVsdCIgZmllbGQg aW4gdGhlIGVuZHBvaW50IGNvbnRleHQgaXMgb25seSBzZXQgZm9yIFN1cGVyU3BlZWQgaXNvYyBl cHMuCi0gKiBIaWdoIHNwZWVkIGVuZHBvaW50IGRlc2NyaXB0b3JzIGNhbiBkZWZpbmUgInRoZSBu dW1iZXIgb2YgYWRkaXRpb25hbAotICogdHJhbnNhY3Rpb24gb3Bwb3J0dW5pdGllcyBwZXIgbWlj cm9mcmFtZSIsIGJ1dCB0aGF0IGdvZXMgaW4gdGhlIE1heCBCdXJzdAotICogZW5kcG9pbnQgY29u dGV4dCBmaWVsZC4KLSAqLwotc3RhdGljIHUzMiB4aGNpX2dldF9lbmRwb2ludF9tdWx0KHN0cnVj dCB1c2JfZGV2aWNlICp1ZGV2LAotCQkJCSAgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9y ICplcCkKLXsKLQl1OCB0eXBlID0gZXAtPmJtQXR0cmlidXRlcyAmIFVTQl9FTkRQT0lOVF9YRkVS VFlQRV9NQVNLOwotCi0JaWYgKHVkZXYtPnNwZWVkICE9IFVTQl9TUEVFRF9TVVBFUiB8fCB0eXBl ICE9IFVTQl9FTkRQT0lOVF9YRkVSX0lTT0MpCi0JCXJldHVybiAwOwotCS8qIEZJWE1FOiByZXR1 cm4gc3NfZXBfY29tcF9kZXNjcmlwdG9yLmJtQXR0cmlidXRlcyAqLwotCXJldHVybiAwOwotfQot Ci0vKiBSZXR1cm4gdGhlIG1heGltdW0gZW5kcG9pbnQgc2VydmljZSBpbnRlcnZhbCB0aW1lIChF U0lUKSBwYXlsb2FkLgotICogQmFzaWNhbGx5LCB0aGlzIGlzIHRoZSBtYXhwYWNrZXQgc2l6ZSwg bXVsdGlwbGllZCBieSB0aGUgYnVyc3Qgc2l6ZQotICogYW5kIG11bHQgc2l6ZS4KLSAqLwotc3Rh dGljIHUzMiB4aGNpX2dldF9tYXhfZXNpdF9wYXlsb2FkKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2 LAotCQkJCSAgICAgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcCkKLXsKLQl1OCB0 eXBlID0gZXAtPmJtQXR0cmlidXRlcyAmIFVTQl9FTkRQT0lOVF9YRkVSVFlQRV9NQVNLOwotCWlu dCBtYXhfYnVyc3Q7Ci0JaW50IG1heF9wYWNrZXQ7Ci0JdTE2IG1wczsKLQotCS8qIE9ubHkgYXBw bGllcyBmb3IgaW50ZXJydXB0IG9yIGlzb2Nocm9ub3VzIGVuZHBvaW50cyAqLwotCWlmICh0eXBl ICE9IFVTQl9FTkRQT0lOVF9YRkVSX0lOVCAmJiB0eXBlICE9IFVTQl9FTkRQT0lOVF9YRkVSX0lT T0MpCi0JCXJldHVybiAwOwotCi0JLyogRklYTUU6IHJldHVybiBzc19lcF9jb21wX2Rlc2NyaXB0 b3Iud0J5dGVzUGVySW50ZXJ2YWwgKi8KLQlpZiAodWRldi0+c3BlZWQgPT0gVVNCX1NQRUVEX1NV UEVSKQotCQlyZXR1cm4gMDsKLQotCW1wcyA9IGxlMTZfdG9fY3B1KGVwLT53TWF4UGFja2V0U2l6 ZSk7Ci0JbWF4X3BhY2tldCA9IEdFVF9NQVhfUEFDS0VUKG1wcyk7Ci0JbWF4X2J1cnN0ID0gKG1w cyAmIDB4MTgwMCkgPj4gMTE7Ci0JLyogQSAwIGluIG1heCBidXJzdCBtZWFucyAxIHRyYW5zZmVy IHBlciBFU0lUICovCi0JcmV0dXJuIG1heF9wYWNrZXQgKiAobWF4X2J1cnN0ICsgMSk7Ci19Ci0K LWludCB4aGNpX2hhbmRzaGFrZSh2b2lkIF9faW9tZW0gKnAsIHUzMiBtYXNrLCB1MzIgZG9uZSwg aW50IHVzZWMpCi17Ci0JdTMyIHJlc3VsdDsKLQl1NjQgc3RhcnQ7Ci0KLQlzdGFydCA9IGdldF90 aW1lX25zKCk7Ci0KLQl3aGlsZSAoMSkgewotCQlyZXN1bHQgPSByZWFkbChwKSAmIG1hc2s7Ci0J CWlmIChyZXN1bHQgPT0gZG9uZSkKLQkJCXJldHVybiAwOwotCQlpZiAoaXNfdGltZW91dChzdGFy dCwgdXNlYyAqIFVTRUNPTkQpKQotCQkJcmV0dXJuIC1FVElNRURPVVQ7Ci0JfQotfQotCi1pbnQg eGhjaV9pc3N1ZV9jb21tYW5kKHN0cnVjdCB4aGNpX2hjZCAqeGhjaSwgdW5pb24geGhjaV90cmIg KnRyYikKLXsKLQlpbnQgcmV0OwotCi0JcmV0ID0geGhjaV9yaW5nX2lzc3VlX3RyYigmeGhjaS0+ Y21kX3JpbmcsIHRyYik7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCS8qIFJpbmcgdGhl IGJlbGwgKi8KLQl3cml0ZWwoREJfVkFMVUVfSE9TVCwgJnhoY2ktPmRiYS0+ZG9vcmJlbGxbMF0p OwotCXJlYWRsKCZ4aGNpLT5kYmEtPmRvb3JiZWxsWzBdKTsKLQotCXJldHVybiAwOwotfQotCi1z dGF0aWMgdm9pZCB4aGNpX3NldF9ldmVudF9kZXF1ZXVlKHN0cnVjdCB4aGNpX2hjZCAqeGhjaSkK LXsKLQl1NjQgcmVnNjQ7Ci0KLQlyZWc2NCA9IHhoY2lfcmVhZF82NCgmeGhjaS0+aXJfc2V0LT5l cnN0X2RlcXVldWUpOwotCXJlZzY0ICY9IEVSU1RfUFRSX01BU0s7Ci0JLyoKLQkgKiBEb24ndCBj bGVhciB0aGUgRUhCIGJpdCAod2hpY2ggaXMgUlcxQykgYmVjYXVzZQotCSAqIHRoZXJlIG1pZ2h0 IGJlIG1vcmUgZXZlbnRzIHRvIHNlcnZpY2UuCi0JICovCi0JcmVnNjQgJj0gfkVSU1RfRUhCOwot CXJlZzY0IHw9IChkbWFfYWRkcl90KXhoY2ktPmV2ZW50X3JpbmcuZGVxdWV1ZSAmCi0JCX4oZG1h X2FkZHJfdClFUlNUX1BUUl9NQVNLOwotCi0JLyogVXBkYXRlIEhDIGV2ZW50IHJpbmcgZGVxdWV1 ZSBwb2ludGVyICovCi0JeGhjaV93cml0ZV82NChyZWc2NCwgJnhoY2ktPmlyX3NldC0+ZXJzdF9k ZXF1ZXVlKTsKLX0KLQotaW50IHhoY2lfd2FpdF9mb3JfZXZlbnQoc3RydWN0IHhoY2lfaGNkICp4 aGNpLCB1OCB0eXBlLCB1bmlvbiB4aGNpX3RyYiAqdHJiKQotewotCXdoaWxlICh0cnVlKSB7Ci0J CXVuaW9uIHhoY2lfdHJiICpkZXEgPSB4aGNpLT5ldmVudF9yaW5nLmRlcXVldWU7Ci0JCXU4IGV2 ZW50X3R5cGU7Ci0JCWludCBpLCByZXQ7Ci0KLQkJcmV0ID0geGhjaV9oYW5kc2hha2UoJmRlcS0+ ZXZlbnRfY21kLmZsYWdzLAotCQkJCSAgICAgY3B1X3RvX2xlMzIoVFJCX0NZQ0xFKSwKLQkJCQkg ICAgIGNwdV90b19sZTMyKHhoY2ktPmV2ZW50X3JpbmcuY3ljbGVfc3RhdGUpLAotCQkJCSAgICAg WEhDSV9DTURfREVGQVVMVF9USU1FT1VUIC8gVVNFQ09ORCk7Ci0JCWlmIChyZXQpIHsKLQkJCWRl dl9lcnIoeGhjaS0+ZGV2LCAiVGltZW91dCB3aGlsZSB3YWl0aW5nIGZvciBldmVudFxuIik7Ci0J CQlyZXR1cm4gcmV0OwotCQl9Ci0KLQkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLQkJCXRyYi0+ Z2VuZXJpYy5maWVsZFtpXSA9Ci0JCQkJbGUzMl90b19jcHUoZGVxLT5nZW5lcmljLmZpZWxkW2ld KTsKLQotCQl4aGNpX3NldF9ldmVudF9kZXF1ZXVlKHhoY2kpOwotCQl4aGNpX3JpbmdfaW5jcmVt ZW50KCZ4aGNpLT5ldmVudF9yaW5nLCAwKTsKLQotCQlldmVudF90eXBlID0gVFJCX0ZJRUxEX1RP X1RZUEUodHJiLT5ldmVudF9jbWQuZmxhZ3MpOwotCi0JCXN3aXRjaCAoZXZlbnRfdHlwZSkgewot CQljYXNlIFRSQl9QT1JUX1NUQVRVUzoKLQkJCWRldl9kYmcoeGhjaS0+ZGV2LCAiRXZlbnQgUG9y dFN0YXR1c0NoYW5nZSAldVxuIiwKLQkJCQlHRVRfUE9SVF9JRCh0cmItPmdlbmVyaWMuZmllbGRb MF0pKTsKLQkJCWJyZWFrOwotCQljYXNlIFRSQl9UUkFOU0ZFUjoKLQkJCWRldl9kYmcoeGhjaS0+ ZGV2LCAiRXZlbnQgVHJhbnNmZXIgJXVcbiIsCi0JCQkJR0VUX0NPTVBfQ09ERSh0cmItPmV2ZW50 X2NtZC5zdGF0dXMpKTsKLQkJCXJldCA9IC1HRVRfQ09NUF9DT0RFKHRyYi0+ZXZlbnRfY21kLnN0 YXR1cyk7Ci0JCQlpZiAocmV0ID09IC1DT01QX1NVQ0NFU1MpCi0JCQkJcmV0ID0gMDsKLQkJCWJy ZWFrOwotCQljYXNlIFRSQl9DT01QTEVUSU9OOgotCQkJZGV2X2RiZyh4aGNpLT5kZXYsICJFdmVu dCBDb21tYW5kQ29tcGxldGlvbiAldVxuIiwKLQkJCQlHRVRfQ09NUF9DT0RFKHRyYi0+ZXZlbnRf Y21kLnN0YXR1cykpOwotCQkJcmV0ID0gLUdFVF9DT01QX0NPREUodHJiLT5ldmVudF9jbWQuc3Rh dHVzKTsKLQkJCWlmIChyZXQgPT0gLUNPTVBfU1VDQ0VTUykKLQkJCQlyZXQgPSAwOwotCQkJYnJl YWs7Ci0JCWRlZmF1bHQ6Ci0JCQlkZXZfZXJyKHhoY2ktPmRldiwgInVuaGFuZGxlZCBldmVudCAl dSAoJTAyeCkgWyUwOHggJTA4eCAlMDh4ICUwOHhdXG4iLAotCQkJCWV2ZW50X3R5cGUsIGV2ZW50 X3R5cGUsCi0JCQkJdHJiLT5nZW5lcmljLmZpZWxkWzBdLCB0cmItPmdlbmVyaWMuZmllbGRbMV0s Ci0JCQkJdHJiLT5nZW5lcmljLmZpZWxkWzJdLCB0cmItPmdlbmVyaWMuZmllbGRbM10pOwotCQl9 Ci0KLQkJaWYgKGV2ZW50X3R5cGUgPT0gdHlwZSkKLQkJCXJldHVybiByZXQ7Ci0JfQotCXJldHVy biAtRU5PU1lTOwotfQotCi1zdGF0aWMgc3RydWN0IHhoY2lfdmlydHVhbF9kZXZpY2UgKnhoY2lf ZmluZF92aXJ0ZGV2KHN0cnVjdCB4aGNpX2hjZCAqeGhjaSwKLQkJCQkJCSAgICAgc3RydWN0IHVz Yl9kZXZpY2UgKnVkZXYpCi17Ci0Jc3RydWN0IHhoY2lfdmlydHVhbF9kZXZpY2UgKnZkZXY7Ci0K LQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHZkZXYsICZ4aGNpLT52ZGV2X2xpc3QsIGxpc3QpCi0JCWlm ICh2ZGV2LT51ZGV2ID09IHVkZXYpCi0JCQlyZXR1cm4gdmRldjsKLQotCXJldHVybiBOVUxMOwot fQotCi1zdGF0aWMgc3RydWN0IHhoY2lfY29udGFpbmVyX2N0eCAqCi14aGNpX2FsbG9jX2NvbnRh aW5lcl9jdHgoc3RydWN0IHhoY2lfaGNkICp4aGNpLCBpbnQgdHlwZSkKLXsKLQlzdHJ1Y3QgeGhj aV9jb250YWluZXJfY3R4ICpjdHg7Ci0KLQlpZiAoKHR5cGUgIT0gWEhDSV9DVFhfVFlQRV9ERVZJ Q0UpICYmICh0eXBlICE9IFhIQ0lfQ1RYX1RZUEVfSU5QVVQpKQotCQlyZXR1cm4gTlVMTDsKLQot CWN0eCA9IHh6YWxsb2Moc2l6ZW9mKCpjdHgpKTsKLQljdHgtPnR5cGUgPSB0eXBlOwotCWN0eC0+ c2l6ZSA9IEhDQ182NEJZVEVfQ09OVEVYVCh4aGNpLT5oY2NfcGFyYW1zKSA/IDIwNDggOiAxMDI0 OwotCWlmICh0eXBlID09IFhIQ0lfQ1RYX1RZUEVfSU5QVVQpCi0JCWN0eC0+c2l6ZSArPSBIQ0Nf Q1RYX1NJWkUoeGhjaS0+aGNjX3BhcmFtcyk7Ci0KLQljdHgtPmJ5dGVzID0gZG1hX2FsbG9jX2Nv aGVyZW50KGN0eC0+c2l6ZSwgJmN0eC0+ZG1hKTsKLQlpZiAoV0FSTl9PTighY3R4LT5ieXRlcykp IHsKLQkJa2ZyZWUoY3R4KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBjdHg7Ci19Ci0K LXN0YXRpYyB2b2lkIHhoY2lfZnJlZV9jb250YWluZXJfY3R4KHN0cnVjdCB4aGNpX2hjZCAqeGhj aSwKLQkJCQkgICAgc3RydWN0IHhoY2lfY29udGFpbmVyX2N0eCAqY3R4KQotewotCWlmICghY3R4 KQotCQlyZXR1cm47Ci0JZG1hX2ZyZWVfY29oZXJlbnQoY3R4LT5ieXRlcywgY3R4LT5kbWEsIGN0 eC0+c2l6ZSk7Ci0Ja2ZyZWUoY3R4KTsKLX0KLQotc3RhdGljIHN0cnVjdCB4aGNpX3ZpcnR1YWxf ZGV2aWNlICp4aGNpX2FsbG9jX3ZpcnRkZXYoc3RydWN0IHhoY2lfaGNkICp4aGNpLAotCQkJCQkJ ICAgICAgc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpCi17Ci0Jc3RydWN0IHhoY2lfdmlydHVhbF9k ZXZpY2UgKnZkZXY7Ci0KLQl2ZGV2ID0geHphbGxvYyhzaXplb2YoKnZkZXYpKTsKLQl2ZGV2LT51 ZGV2ID0gdWRldjsKLQlsaXN0X2FkZF90YWlsKCZ2ZGV2LT5saXN0LCAmeGhjaS0+dmRldl9saXN0 KTsKLQotCXZkZXYtPm91dF9jdHggPSB4aGNpX2FsbG9jX2NvbnRhaW5lcl9jdHgoeGhjaSwgWEhD SV9DVFhfVFlQRV9ERVZJQ0UpOwotCXZkZXYtPmluX2N0eCA9IHhoY2lfYWxsb2NfY29udGFpbmVy X2N0eCh4aGNpLCBYSENJX0NUWF9UWVBFX0lOUFVUKTsKLQotCXJldHVybiB2ZGV2OwotfQotCi1z dGF0aWMgdm9pZCB4aGNpX2ZyZWVfdmlydGRldihzdHJ1Y3QgeGhjaV92aXJ0dWFsX2RldmljZSAq dmRldikKLXsKLQlzdHJ1Y3QgeGhjaV9oY2QgKnhoY2kgPSB0b194aGNpX2hjZCh2ZGV2LT51ZGV2 LT5ob3N0KTsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBVU0JfTUFYRU5EUE9JTlRTOyBp KyspCi0JCWlmICh2ZGV2LT5lcFtpXSkKLQkJCXhoY2lfcHV0X2VuZHBvaW50X3JpbmcoeGhjaSwg dmRldi0+ZXBbaV0pOwotCi0JbGlzdF9kZWwoJnZkZXYtPmxpc3QpOwotCXhoY2lfZnJlZV9jb250 YWluZXJfY3R4KHhoY2ksIHZkZXYtPm91dF9jdHgpOwotCXhoY2lfZnJlZV9jb250YWluZXJfY3R4 KHhoY2ksIHZkZXYtPmluX2N0eCk7Ci0JZnJlZSh2ZGV2KTsKLX0KLQotc3RhdGljIGludCB4aGNp X3ZpcnRkZXZfaXNzdWVfdHJhbnNmZXIoc3RydWN0IHhoY2lfdmlydHVhbF9kZXZpY2UgKnZkZXYs Ci0JCQkJIHU4IGVwLCB1bmlvbiB4aGNpX3RyYiAqdHJiLCBib29sIHJpbmdiZWxsKQotewotCXN0 cnVjdCB4aGNpX2hjZCAqeGhjaSA9IHRvX3hoY2lfaGNkKHZkZXYtPnVkZXYtPmhvc3QpOwotCXN0 cnVjdCB4aGNpX3JpbmcgKnJpbmcgPSB2ZGV2LT5lcFtlcF07Ci0JaW50IHJldDsKLQotCXJldCA9 IHhoY2lfcmluZ19pc3N1ZV90cmIocmluZywgdHJiKTsKLQlpZiAocmV0IHx8ICFyaW5nYmVsbCkK LQkJcmV0dXJuIHJldDsKLQotCS8qIFJpbmcgdGhlIGJlbGwgKi8KLQl3cml0ZWwoREJfVkFMVUUo ZXAsIDApLCAmeGhjaS0+ZGJhLT5kb29yYmVsbFt2ZGV2LT5zbG90X2lkXSk7Ci0JcmVhZGwoJnho Y2ktPmRiYS0+ZG9vcmJlbGxbdmRldi0+c2xvdF9pZF0pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0 YXRpYyB2b2lkIHhoY2lfdmlydGRldl96ZXJvX2luX2N0eChzdHJ1Y3QgeGhjaV92aXJ0dWFsX2Rl dmljZSAqdmRldikKLXsKLQlzdHJ1Y3QgeGhjaV9oY2QgKnhoY2kgPSB0b194aGNpX2hjZCh2ZGV2 LT51ZGV2LT5ob3N0KTsKLQlzdHJ1Y3QgeGhjaV9pbnB1dF9jb250cm9sX2N0eCAqaW5faWNjOwot CXN0cnVjdCB4aGNpX3Nsb3RfY3R4ICppbl9zbG90OwotCXN0cnVjdCB4aGNpX2VwX2N0eCAqaW5f ZXA7Ci0JaW50IGk7Ci0KLQlpbl9pY2MgPSB4aGNpX2dldF9pbnB1dF9jb250cm9sX2N0eCh2ZGV2 LT5pbl9jdHgpOwotCWluX3Nsb3QgPSB4aGNpX2dldF9zbG90X2N0eCh4aGNpLCB2ZGV2LT5pbl9j dHgpOwotCi0JLyogV2hlbiBhIGRldmljZSdzIGFkZCBmbGFnIGFuZCBkcm9wIGZsYWcgYXJlIHpl cm8sIGFueSBzdWJzZXF1ZW50Ci0JICogY29uZmlndXJlIGVuZHBvaW50IGNvbW1hbmQgd2lsbCBs ZWF2ZSB0aGF0IGVuZHBvaW50J3Mgc3RhdGUKLQkgKiB1bnRvdWNoZWQuICBNYWtlIHN1cmUgd2Ug ZG9uJ3QgbGVhdmUgYW55IG9sZCBzdGF0ZSBpbiB0aGUgaW5wdXQKLQkgKiBlbmRwb2ludCBjb250 ZXh0cy4KLQkgKi8KLQlpbl9pY2MtPmRyb3BfZmxhZ3MgPSAwOwotCWluX2ljYy0+YWRkX2ZsYWdz ID0gMDsKLQlpbl9zbG90LT5kZXZfaW5mbyAmPSBjcHVfdG9fbGUzMih+TEFTVF9DVFhfTUFTSyk7 Ci0JLyogRW5kcG9pbnQgMCBpcyBhbHdheXMgdmFsaWQgKi8KLQlpbl9zbG90LT5kZXZfaW5mbyB8 PSBjcHVfdG9fbGUzMihMQVNUX0NUWCgxKSk7Ci0JZm9yIChpID0gMTsgaSA8IDMxOyBpKyspIHsK LQkJaW5fZXAgPSB4aGNpX2dldF9lcF9jdHgoeGhjaSwgdmRldi0+aW5fY3R4LCBpKTsKLQotCQlp bl9lcC0+ZXBfaW5mbyA9IDA7Ci0JCWluX2VwLT5lcF9pbmZvMiA9IDA7Ci0JCWluX2VwLT5kZXEg PSAwOwotCQlpbl9lcC0+dHhfaW5mbyA9IDA7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCB4aGNpX2lu aXRfZXZlbnRfY21kX3RyYih1bmlvbiB4aGNpX3RyYiAqdHJiLAotCQkJCSAgICB1NjQgY21kX3Ry YiwgdTMyIHN0YXR1cywgdTMyIGZsYWdzKQotewotCXhoY2lfd3JpdGVfNjQoY21kX3RyYiwgJnRy Yi0+ZXZlbnRfY21kLmNtZF90cmIpOwotCXdyaXRlbChzdGF0dXMsICZ0cmItPmV2ZW50X2NtZC5z dGF0dXMpOwotCXdyaXRlbChmbGFncywgJnRyYi0+ZXZlbnRfY21kLmZsYWdzKTsKLX0KLQotc3Rh dGljIGludCB4aGNpX3ZpcnRkZXZfZGlzYWJsZV9zbG90KHN0cnVjdCB4aGNpX3ZpcnR1YWxfZGV2 aWNlICp2ZGV2KQotewotCXN0cnVjdCB4aGNpX2hjZCAqeGhjaSA9IHRvX3hoY2lfaGNkKHZkZXYt PnVkZXYtPmhvc3QpOwotCXVuaW9uIHhoY2lfdHJiIHRyYjsKLQlpbnQgcmV0OwotCi0JLyogSXNz dWUgRGlzYWJsZSBTbG90IENvbW1hbmQgKi8KLQl4aGNpX2luaXRfZXZlbnRfY21kX3RyYigmdHJi LAotCQkJCTAsCi0JCQkJMCwKLQkJCQlUUkJfVFlQRShUUkJfRElTQUJMRV9TTE9UKSB8Ci0JCQkJ U0xPVF9JRF9GT1JfVFJCKHZkZXYtPnNsb3RfaWQpKTsKLQl4aGNpX3ByaW50X3RyYih4aGNpLCAm dHJiLCAiUmVxdWVzdCAgRGlzYWJsZVNsb3QiKTsKLQl4aGNpX2lzc3VlX2NvbW1hbmQoeGhjaSwg JnRyYik7Ci0JcmV0ID0geGhjaV93YWl0X2Zvcl9ldmVudCh4aGNpLCBUUkJfQ09NUExFVElPTiwg JnRyYik7Ci0JeGhjaV9wcmludF90cmIoeGhjaSwgJnRyYiwgIlJlc3BvbnNlIERpc2FibGVTbG90 Iik7Ci0KLQkvKiBDbGVhciBEZXZpY2UgQ29udGV4dCBCYXNlIEFkZHJlc3MgQXJyYXkgKi8KLQl4 aGNpLT5kY2JhYVt2ZGV2LT5zbG90X2lkXSA9IDA7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0 aWMgaW50IHhoY2lfdmlydGRldl9lbmFibGVfc2xvdChzdHJ1Y3QgeGhjaV92aXJ0dWFsX2Rldmlj ZSAqdmRldikKLXsKLQlzdHJ1Y3QgeGhjaV9oY2QgKnhoY2kgPSB0b194aGNpX2hjZCh2ZGV2LT51 ZGV2LT5ob3N0KTsKLQl1bmlvbiB4aGNpX3RyYiB0cmI7Ci0JaW50IHNsb3RfaWQ7Ci0JaW50IHJl dDsKLQotCS8qIElzc3VlIEVuYWJsZSBTbG90IENvbW1hbmQgKi8KLQl4aGNpX2luaXRfZXZlbnRf Y21kX3RyYigmdHJiLAotCQkJCTAsCi0JCQkJMCwKLQkJCQlUUkJfVFlQRShUUkJfRU5BQkxFX1NM T1QpKTsKLQl4aGNpX3ByaW50X3RyYih4aGNpLCAmdHJiLCAiUmVxdWVzdCAgRW5hYmxlU2xvdCIp OwotCXhoY2lfaXNzdWVfY29tbWFuZCh4aGNpLCAmdHJiKTsKLQlyZXQgPSB4aGNpX3dhaXRfZm9y X2V2ZW50KHhoY2ksIFRSQl9DT01QTEVUSU9OLCAmdHJiKTsKLQl4aGNpX3ByaW50X3RyYih4aGNp LCAmdHJiLCAiUmVzcG9uc2UgRW5hYmxlU2xvdCIpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7 Ci0KLQlzbG90X2lkID0gVFJCX1RPX1NMT1RfSUQodHJiLmV2ZW50X2NtZC5mbGFncyk7Ci0JaWYg KHNsb3RfaWQgPT0gMCkgewotCQlkZXZfZXJyKHhoY2ktPmRldiwgIkVuYWJsZVNsb3QgcmV0dXJu ZWQgcmVzZXJ2ZWQgc2xvdCBJRCAwXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JdmRl di0+c2xvdF9pZCA9IHNsb3RfaWQ7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IHhoY2lfdmlydGRl dl9yZXNldChzdHJ1Y3QgeGhjaV92aXJ0dWFsX2RldmljZSAqdmRldikKLXsKLQlzdHJ1Y3QgeGhj aV9oY2QgKnhoY2kgPSB0b194aGNpX2hjZCh2ZGV2LT51ZGV2LT5ob3N0KTsKLQlzdHJ1Y3QgeGhj aV9zbG90X2N0eCAqb3V0X3Nsb3Q7Ci0JdW5pb24geGhjaV90cmIgdHJiOwotCWludCByZXQ7Ci0K LQlvdXRfc2xvdCA9IHhoY2lfZ2V0X3Nsb3RfY3R4KHhoY2ksIHZkZXYtPm91dF9jdHgpOwotCi0J LyogSWYgZGV2aWNlIGlzIG5vdCBzZXR1cCwgdGhlcmUgaXMgbm8gcG9pbnQgaW4gcmVzZXR0aW5n IGl0ICovCi0JaWYgKEdFVF9TTE9UX1NUQVRFKGxlMzJfdG9fY3B1KG91dF9zbG90LT5kZXZfc3Rh dGUpKSA9PQotCSAgICBTTE9UX1NUQVRFX0RJU0FCTEVEKQotCQlyZXR1cm4gMDsKLQotCXhoY2lf aW5pdF9ldmVudF9jbWRfdHJiKCZ0cmIsCi0JCQkJMCwKLQkJCQkwLAotCQkJCVRSQl9UWVBFKFRS Ql9SRVNFVF9ERVYpIHwKLQkJCQlTTE9UX0lEX0ZPUl9UUkIodmRldi0+c2xvdF9pZCkpOwotCXho Y2lfcHJpbnRfdHJiKHhoY2ksICZ0cmIsICJSZXF1ZXN0ICBSZXNldCIpOwotCXhoY2lfaXNzdWVf Y29tbWFuZCh4aGNpLCAmdHJiKTsKLQlyZXQgPSB4aGNpX3dhaXRfZm9yX2V2ZW50KHhoY2ksIFRS Ql9DT01QTEVUSU9OLCAmdHJiKTsKLQl4aGNpX3ByaW50X3RyYih4aGNpLCAmdHJiLCAiUmVzcG9u c2UgUmVzZXQiKTsKLQotCS8qCi0JICogVGhlIFJlc2V0IERldmljZSBjb21tYW5kIGNhbid0IGZh aWwsIGFjY29yZGluZyB0byB0aGUgMC45NS8wLjk2IHNwZWMsCi0JICogdW5sZXNzIHdlIHRyaWVk IHRvIHJlc2V0IGEgc2xvdCBJRCB0aGF0IHdhc24ndCBlbmFibGVkLAotCSAqIG9yIHRoZSBkZXZp Y2Ugd2Fzbid0IGluIHRoZSBhZGRyZXNzZWQgb3IgY29uZmlndXJlZCBzdGF0ZS4KLQkgKi8KLQlz d2l0Y2ggKEdFVF9DT01QX0NPREUodHJiLmV2ZW50X2NtZC5zdGF0dXMpKSB7Ci0JY2FzZSBDT01Q X0NNRF9BQk9SVDoKLQljYXNlIENPTVBfQ01EX1NUT1A6Ci0JCWRldl93YXJuKHhoY2ktPmRldiwg IlRpbWVvdXQgd2FpdGluZyBmb3IgcmVzZXQgZGV2aWNlIGNvbW1hbmRcbiIpOwotCQlyZXQgPSAt RVRJTUVET1VUOwotCQlicmVhazsKLQljYXNlIENPTVBfRUJBRFNMVDogLyogMC45NSBjb21wbGV0 aW9uIGNvZGUgZm9yIGJhZCBzbG90IElEICovCi0JY2FzZSBDT01QX0NUWF9TVEFURTogLyogMC45 NiBjb21wbGV0aW9uIGNvZGUgZm9yIHNhbWUgdGhpbmcgKi8KLQkJLyogRG9uJ3QgdHJlYXQgdGhp cyBhcyBhbiBlcnJvci4gIE1heSBjaGFuZ2UgbXkgbWluZCBsYXRlci4gKi8KLQkJcmV0ID0gMDsK LQljYXNlIENPTVBfU1VDQ0VTUzoKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0ID0gLUVJTlZB TDsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0vKgotICogT25jZSBhIGh1YiBkZXNjcmlwdG9y IGlzIGZldGNoZWQgZm9yIGEgZGV2aWNlLCB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgeEhDJ3MKLSAq IGludGVybmFsIGRhdGEgc3RydWN0dXJlcyBmb3IgdGhlIGRldmljZS4KLSAqLwotc3RhdGljIGlu dCB4aGNpX3ZpcnRkZXZfdXBkYXRlX2h1Yl9kZXZpY2Uoc3RydWN0IHhoY2lfdmlydHVhbF9kZXZp Y2UgKnZkZXYsCi0JCQkJCSAgdm9pZCAqYnVmZmVyLCBpbnQgbGVuZ3RoKQotewotCXN0cnVjdCB4 aGNpX2hjZCAqeGhjaSA9IHRvX3hoY2lfaGNkKHZkZXYtPnVkZXYtPmhvc3QpOwotCXN0cnVjdCB1 c2JfaHViX2Rlc2NyaXB0b3IgKmRlc2MgPSBidWZmZXI7Ci0Jc3RydWN0IHhoY2lfaW5wdXRfY29u dHJvbF9jdHggKmluX2ljYzsKLQlzdHJ1Y3QgeGhjaV9zbG90X2N0eCAqaW5fc2xvdCwgKm91dF9z bG90OwotCXVuaW9uIHhoY2lfdHJiIHRyYjsKLQl1MzIgZGV2X2luZm8sIGRldl9pbmZvMiwgdHRf aW5mbzsKLQl1OCBtYXhjaGlsZDsKLQl1MTYgaHViY2hhcjsKLQl1MzIgZmxhZ3M7Ci0JaW50IHJl dDsKLQotCW91dF9zbG90ID0geGhjaV9nZXRfc2xvdF9jdHgoeGhjaSwgdmRldi0+b3V0X2N0eCk7 Ci0KLQkvKiBOZWVkIGF0IGxlYXN0IGZpcnN0IGJ5dGUgb2Ygd0h1YkNoYXJhY3RlcmlzdGljcyAq LwotCWlmIChsZW5ndGggPCA0KQotCQlyZXR1cm4gMDsKLQkvKiBTa2lwIGFscmVhZHkgY29uZmln dXJlZCBodWIgZGV2aWNlICovCi0JaWYgKG91dF9zbG90LT5kZXZfaW5mbyAmIERFVl9IVUIpCi0J CXJldHVybiAwOwotCi0JbWF4Y2hpbGQgPSBkZXNjLT5iTmJyUG9ydHM7Ci0JaHViY2hhciA9IGxl MTZfdG9fY3B1KGRlc2MtPndIdWJDaGFyYWN0ZXJpc3RpY3MpOwotCi0JaW5fc2xvdCA9IHhoY2lf Z2V0X3Nsb3RfY3R4KHhoY2ksIHZkZXYtPmluX2N0eCk7Ci0JaW5faWNjID0geGhjaV9nZXRfaW5w dXRfY29udHJvbF9jdHgodmRldi0+aW5fY3R4KTsKLQotCS8qIHVwZGF0ZSBzbG90IGNvbnRleHQg Ki8KLQltZW1jcHkoaW5fc2xvdCwgb3V0X3Nsb3QsIHNpemVvZihzdHJ1Y3QgeGhjaV9zbG90X2N0 eCkpOwotCWluX2ljYy0+YWRkX2ZsYWdzIHw9IGNwdV90b19sZTMyKFNMT1RfRkxBRyk7Ci0JaW5f aWNjLT5kcm9wX2ZsYWdzID0gMDsKLQlpbl9zbG90LT5kZXZfc3RhdGUgPSAwOwotCWRldl9pbmZv ID0gbGUzMl90b19jcHUoaW5fc2xvdC0+ZGV2X2luZm8pOwotCWRldl9pbmZvMiA9IGxlMzJfdG9f Y3B1KGluX3Nsb3QtPmRldl9pbmZvMik7Ci0JdHRfaW5mbyA9IGxlMzJfdG9fY3B1KGluX3Nsb3Qt PnR0X2luZm8pOwotCi0JZGV2X2luZm8gfD0gREVWX0hVQjsKLQkvKiBIUyBNdWx0aS1UVCBpbiBi RGV2aWNlUHJvdG9jb2wgKi8KLQlpZiAodmRldi0+dWRldi0+c3BlZWQgPT0gVVNCX1NQRUVEX0hJ R0ggJiYKLQkgICAgdmRldi0+dWRldi0+ZGVzY3JpcHRvci0+YkRldmljZVByb3RvY29sID09IFVT Ql9IVUJfUFJfSFNfTVVMVElfVFQpCi0JCWRldl9pbmZvIHw9IERFVl9NVFQ7Ci0JaWYgKHhoY2kt PmhjaV92ZXJzaW9uID4gMHg5NSkgewotCQlkZXZfaW5mbzIgfD0gWEhDSV9NQVhfUE9SVFMobWF4 Y2hpbGQpOwotCQkvKiBTZXQgVFQgdGhpbmsgdGltZSAtIGNvbnZlcnQgZnJvbSBucyB0byBGUyBi aXQgdGltZXMuCi0JCSAqIDAgPSA4IEZTIGJpdCB0aW1lcywgMSA9IDE2IEZTIGJpdCB0aW1lcywK LQkJICogMiA9IDI0IEZTIGJpdCB0aW1lcywgMyA9IDMyIEZTIGJpdCB0aW1lcy4KLQkJICoKLQkJ ICogeEhDSSAxLjA6IHRoaXMgZmllbGQgc2hhbGwgYmUgMCBpZiB0aGUgZGV2aWNlIGlzIG5vdCBh Ci0JCSAqIEhpZ2gtc3BlZWQgaHViLgotCQkgKi8KLQkJaWYgKHhoY2ktPmhjaV92ZXJzaW9uIDwg MHgxMDAgfHwKLQkJICAgIHZkZXYtPnVkZXYtPnNwZWVkID09IFVTQl9TUEVFRF9ISUdIKSB7Ci0J CQl1MzIgdGhpbmtfdGltZSA9IChodWJjaGFyICYgSFVCX0NIQVJfVFRUVCkgPj4gNTsKLQkJCXR0 X2luZm8gfD0gVFRfVEhJTktfVElNRSh0aGlua190aW1lKTsKLQkJfQotCX0KLQlpbl9zbG90LT5k ZXZfaW5mbyA9IGNwdV90b19sZTMyKGRldl9pbmZvKTsKLQlpbl9zbG90LT5kZXZfaW5mbzIgPSBj cHVfdG9fbGUzMihkZXZfaW5mbzIpOwotCWluX3Nsb3QtPnR0X2luZm8gPSBjcHVfdG9fbGUzMih0 dF9pbmZvKTsKLQotCS8qIElzc3VlIENvbmZpZ3VyZSBFbmRwb2ludCBvciBFdmFsdWF0ZSBDb250 ZXh0IENvbW1hbmQgKi8KLQlmbGFncyA9IFNMT1RfSURfRk9SX1RSQih2ZGV2LT5zbG90X2lkKTsK LQlpZiAoeGhjaS0+aGNpX3ZlcnNpb24gPiAweDk1KQotCQlmbGFncyB8PSBUUkJfVFlQRShUUkJf Q09ORklHX0VQKTsKLQllbHNlCi0JCWZsYWdzIHw9IFRSQl9UWVBFKFRSQl9FVkFMX0NPTlRFWFQp OwotCXhoY2lfaW5pdF9ldmVudF9jbWRfdHJiKCZ0cmIsCi0JCQkJdmRldi0+aW5fY3R4LT5kbWEs Ci0JCQkJMCwKLQkJCQlmbGFncyk7Ci0JeGhjaV9wcmludF90cmIoeGhjaSwgJnRyYiwgIlJlcXVl c3QgIENvbmZpZ3VyZUVuZHBvaW50Iik7Ci0JeGhjaV9pc3N1ZV9jb21tYW5kKHhoY2ksICZ0cmIp OwotCXJldCA9IHhoY2lfd2FpdF9mb3JfZXZlbnQoeGhjaSwgVFJCX0NPTVBMRVRJT04sICZ0cmIp OwotCXhoY2lfcHJpbnRfdHJiKHhoY2ksICZ0cmIsICJSZXNwb25zZSBDb25maWd1cmVFbmRwb2lu dCIpOwotCXhoY2lfdmlydGRldl96ZXJvX2luX2N0eCh2ZGV2KTsKLQotCXJldHVybiByZXQ7Ci19 Ci0KLXN0YXRpYyBpbnQgeGhjaV92aXJ0ZGV2X3VwZGF0ZV9odWJfc3RhdHVzKHN0cnVjdCB4aGNp X3ZpcnR1YWxfZGV2aWNlICp2aHViLAotCQkJCQkgIGludCBwb3J0KQotewotCXN0cnVjdCB4aGNp X2hjZCAqeGhjaSA9IHRvX3hoY2lfaGNkKHZodWItPnVkZXYtPmhvc3QpOwotCXN0cnVjdCB1c2Jf ZGV2aWNlICp1ZGV2ID0gdmh1Yi0+dWRldi0+Y2hpbGRyZW5bcG9ydCAtIDFdOwotCXN0cnVjdCB4 aGNpX3ZpcnR1YWxfZGV2aWNlICp2ZGV2OwotCi0JaWYgKCF1ZGV2KQotCQlyZXR1cm4gMDsKLQot CS8qIENoZWNrIGlmIHdlIGhhdmUgYSB2aXJ0dWFsIGRldmljZSBmb3IgaXQgKi8KLQl2ZGV2ID0g eGhjaV9maW5kX3ZpcnRkZXYoeGhjaSwgdWRldik7Ci0JaWYgKHZkZXYpCi0JCXhoY2lfdmlydGRl dl9kZXRhY2godmRldik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB4aGNpX3ZpcnRk ZXZfY29uZmlndXJlKHN0cnVjdCB4aGNpX3ZpcnR1YWxfZGV2aWNlICp2ZGV2LCBpbnQgY29uZmln KQotewotCXN0cnVjdCB4aGNpX2hjZCAqeGhjaSA9IHRvX3hoY2lfaGNkKHZkZXYtPnVkZXYtPmhv c3QpOwotCXN0cnVjdCB4aGNpX2lucHV0X2NvbnRyb2xfY3R4ICppbl9pY2M7Ci0Jc3RydWN0IHho Y2lfc2xvdF9jdHggKmluX3Nsb3Q7Ci0Jc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSB2ZGV2LT51 ZGV2OwotCXVuaW9uIHhoY2lfdHJiIHRyYjsKLQl1MzIgYWRkX2ZsYWdzID0gMCwgbGFzdF9jdHg7 Ci0JaW50IGksIGo7Ci0JaW50IHJldDsKLQotCWZvciAoaSA9IDA7IGkgPCB1ZGV2LT5jb25maWcu bm9fb2ZfaWY7IGkrKykgewotCQlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiA9ICZ1ZGV2LT5j b25maWcuaW50ZXJmYWNlW2ldOwotCi0JCWZvciAoaiA9IDA7IGogPCBpbnRmLT5ub19vZl9lcDsg aisrKSB7Ci0JCQlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwID0gJmludGYtPmVw X2Rlc2Nbal07Ci0JCQl1OCB0eXBlID0gZXAtPmJtQXR0cmlidXRlcyAmIFVTQl9FTkRQT0lOVF9Y RkVSVFlQRV9NQVNLOwotCQkJdTggZXB0eXBlID0geGhjaV9nZXRfZW5kcG9pbnRfdHlwZShlcC0+ YkVuZHBvaW50QWRkcmVzcywKLQkJCQkJCQkgICBlcC0+Ym1BdHRyaWJ1dGVzKTsKLQkJCXU4IGVw aSA9IHhoY2lfZ2V0X2VuZHBvaW50X2luZGV4KGVwLT5iRW5kcG9pbnRBZGRyZXNzLAotCQkJCQkJ CSBlcC0+Ym1BdHRyaWJ1dGVzKTsKLQkJCXN0cnVjdCB4aGNpX2VwX2N0eCAqY3R4OwotCQkJdTMy IG1wcywgaW50ZXJ2YWwsIG11bHQsIGVzaXQsIG1heF9wYWNrZXQsIG1heF9idXJzdDsKLQkJCXUz MiBlcF9pbmZvLCBlcF9pbmZvMiwgdHhfaW5mbzsKLQotCQkJY3R4ID0geGhjaV9nZXRfZXBfY3R4 KHhoY2ksIHZkZXYtPmluX2N0eCwgZXBpKTsKLQotCQkJdmRldi0+ZXBbZXBpXSA9IHhoY2lfZ2V0 X2VuZHBvaW50X3JpbmcoeGhjaSk7Ci0JCQlpZiAoIXZkZXYtPmVwW2VwaV0pCi0JCQkJcmV0dXJu IC1FTk9NRU07Ci0JCQkvKiBGSVhNRTogc2V0IGNvcnJlY3QgcmluZyB0eXBlICovCi0JCQl4aGNp X3JpbmdfaW5pdCh2ZGV2LT5lcFtlcGldLCBOVU1fVFJBTlNGRVJfVFJCUywKLQkJCQkgICAgICAg VFlQRV9CVUxLKTsKLQkJCWFkZF9mbGFncyB8PSBCSVQoZXBpKzEpOwotCi0JCQltcHMgPSBsZTE2 X3RvX2NwdShlcC0+d01heFBhY2tldFNpemUpOwotCQkJaW50ZXJ2YWwgPSB4aGNpX2dldF9lbmRw b2ludF9pbnRlcnZhbCh2ZGV2LT51ZGV2LCBlcCk7Ci0JCQltdWx0ID0geGhjaV9nZXRfZW5kcG9p bnRfbXVsdCh2ZGV2LT51ZGV2LCBlcCk7Ci0JCQllc2l0ID0geGhjaV9nZXRfbWF4X2VzaXRfcGF5 bG9hZCh2ZGV2LT51ZGV2LCBlcCk7Ci0JCQltYXhfcGFja2V0ID0gR0VUX01BWF9QQUNLRVQobXBz KTsKLQkJCW1heF9idXJzdCA9IDA7Ci0KLQkJCWVwX2luZm8gPSBFUF9JTlRFUlZBTChpbnRlcnZh bCkgfCBFUF9NVUxUKG11bHQpOwotCQkJZXBfaW5mbzIgPSBFUF9UWVBFKGVwdHlwZSk7Ci0JCQlp ZiAodHlwZSA9PSBVU0JfRU5EUE9JTlRfWEZFUl9JU09DKQotCQkJCWVwX2luZm8yIHw9IEVSUk9S X0NPVU5UKDApOwotCQkJZWxzZQotCQkJCWVwX2luZm8yIHw9IEVSUk9SX0NPVU5UKDMpOwotCi0J CQlzd2l0Y2ggKHVkZXYtPnNwZWVkKSB7Ci0JCQljYXNlIFVTQl9TUEVFRF9TVVBFUjoKLQkJCQkv KiBGSVhNRTogbWF4X2J1cnN0ID0gc3NfZXBfY29tcC5iTWF4QnVyc3QgKi8KLQkJCQltYXhfYnVy c3QgPSAwOwotCQkJCWJyZWFrOwotCQkJY2FzZSBVU0JfU1BFRURfSElHSDoKLQkJCQkvKiBTb21l IGRldmljZXMgZ2V0IHRoaXMgd3JvbmcgKi8KLQkJCQlpZiAodHlwZSA9PSBVU0JfRU5EUE9JTlRf WEZFUl9CVUxLKQotCQkJCQltYXhfcGFja2V0ID0gNTEyOwotCQkJCWlmICh0eXBlID09IFVTQl9F TkRQT0lOVF9YRkVSX0lTT0MgfHwKLQkJCQkgICAgdHlwZSA9PSBVU0JfRU5EUE9JTlRfWEZFUl9J TlQpCi0JCQkJCW1heF9idXJzdCA9IChtcHMgJiAweDE4MDApID4+IDExOwotCQkJCWJyZWFrOwot CQkJY2FzZSBVU0JfU1BFRURfRlVMTDoKLQkJCWNhc2UgVVNCX1NQRUVEX0xPVzoKLQkJCQlicmVh azsKLQkJCX0KLQkJCWVwX2luZm8yIHw9IE1BWF9QQUNLRVQobWF4X3BhY2tldCkgfCBNQVhfQlVS U1QobWF4X2J1cnN0KTsKLQotCQkJdHhfaW5mbyA9IE1BWF9FU0lUX1BBWUxPQURfRk9SX0VQKGVz aXQpOwotCQkJc3dpdGNoICh0eXBlKSB7Ci0JCQljYXNlIFVTQl9FTkRQT0lOVF9YRkVSX0NPTlRS T0w6Ci0JCQkJdHhfaW5mbyB8PSBBVkdfVFJCX0xFTkdUSF9GT1JfRVAoOCk7Ci0JCQkJYnJlYWs7 Ci0JCQljYXNlIFVTQl9FTkRQT0lOVF9YRkVSX0lTT0M6Ci0JCQljYXNlIFVTQl9FTkRQT0lOVF9Y RkVSX0JVTEs6Ci0JCQkJdHhfaW5mbyB8PSBBVkdfVFJCX0xFTkdUSF9GT1JfRVAoMyAqIDEwMjQp OwotCQkJCWJyZWFrOwotCQkJY2FzZSBVU0JfRU5EUE9JTlRfWEZFUl9JTlQ6Ci0JCQkJdHhfaW5m byB8PSBBVkdfVFJCX0xFTkdUSF9GT1JfRVAoMSAqIDEwMjQpOwotCQkJCWJyZWFrOwotCQkJfQot Ci0JCQljdHgtPmVwX2luZm8gPSBjcHVfdG9fbGUzMihlcF9pbmZvKTsKLQkJCWN0eC0+ZXBfaW5m bzIgPSBjcHVfdG9fbGUzMihlcF9pbmZvMik7Ci0JCQljdHgtPnR4X2luZm8gPSBjcHVfdG9fbGUz Mih0eF9pbmZvKTsKLQkJCWN0eC0+ZGVxID0KLQkJCQljcHVfdG9fbGU2NCgoZG1hX2FkZHJfdCl2 ZGV2LT5lcFtlcGldLT5lbnF1ZXVlIHwKLQkJCQkJICAgIHZkZXYtPmVwW2VwaV0tPmN5Y2xlX3N0 YXRlKTsKLQkJfQotCX0KLQotCWxhc3RfY3R4ID0gZmxzKGFkZF9mbGFncykgLSAxOwotCi0JaW5f c2xvdCA9IHhoY2lfZ2V0X3Nsb3RfY3R4KHhoY2ksIHZkZXYtPmluX2N0eCk7Ci0JaW5faWNjID0g eGhjaV9nZXRfaW5wdXRfY29udHJvbF9jdHgodmRldi0+aW5fY3R4KTsKLQotCS8qIFNlZSBzZWN0 aW9uIDQuNi42IC0gQTAgPSAxOyBBMSA9IEQwID0gRDEgPSAwICovCi0JaW5faWNjLT5hZGRfZmxh Z3MgPSBjcHVfdG9fbGUzMihhZGRfZmxhZ3MpOwotCWluX2ljYy0+YWRkX2ZsYWdzIHw9IGNwdV90 b19sZTMyKFNMT1RfRkxBRyk7Ci0JaW5faWNjLT5hZGRfZmxhZ3MgJj0gY3B1X3RvX2xlMzIofkVQ MF9GTEFHKTsKLQlpbl9pY2MtPmRyb3BfZmxhZ3MgJj0gY3B1X3RvX2xlMzIofihTTE9UX0ZMQUcg fCBFUDBfRkxBRykpOwotCi0JLyogRG9uJ3QgaXNzdWUgdGhlIGNvbW1hbmQgaWYgdGhlcmUncyBu byBlbmRwb2ludHMgdG8gdXBkYXRlLiAqLwotCWlmIChpbl9pY2MtPmFkZF9mbGFncyA9PSBjcHVf dG9fbGUzMihTTE9UX0ZMQUcpICYmCi0JICAgIGluX2ljYy0+ZHJvcF9mbGFncyA9PSAwKQotCQly ZXR1cm4gMDsKLQotCWluX3Nsb3QtPmRldl9pbmZvICY9IGNwdV90b19sZTMyKH5MQVNUX0NUWF9N QVNLKTsKLQlpbl9zbG90LT5kZXZfaW5mbyB8PSBjcHVfdG9fbGUzMihMQVNUX0NUWChsYXN0X2N0 eCkpOwotCi0JLyogSXNzdWUgQ29uZmlndXJlIEVuZHBvaW50IENvbW1hbmQgKi8KLQl4aGNpX2lu aXRfZXZlbnRfY21kX3RyYigmdHJiLAotCQkJCXZkZXYtPmluX2N0eC0+ZG1hLAotCQkJCTAsCi0J CQkJVFJCX1RZUEUoVFJCX0NPTkZJR19FUCkgfAotCQkJCVNMT1RfSURfRk9SX1RSQih2ZGV2LT5z bG90X2lkKSk7Ci0JeGhjaV9wcmludF90cmIoeGhjaSwgJnRyYiwgIlJlcXVlc3QgIENvbmZpZ3Vy ZUVuZHBvaW50Iik7Ci0JeGhjaV9pc3N1ZV9jb21tYW5kKHhoY2ksICZ0cmIpOwotCXJldCA9IHho Y2lfd2FpdF9mb3JfZXZlbnQoeGhjaSwgVFJCX0NPTVBMRVRJT04sICZ0cmIpOwotCXhoY2lfcHJp bnRfdHJiKHhoY2ksICZ0cmIsICJSZXNwb25zZSBDb25maWd1cmVFbmRwb2ludCIpOwotCXhoY2lf dmlydGRldl96ZXJvX2luX2N0eCh2ZGV2KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBp bnQgeGhjaV92aXJ0ZGV2X2RlY29uZmlndXJlKHN0cnVjdCB4aGNpX3ZpcnR1YWxfZGV2aWNlICp2 ZGV2KQotewotCXN0cnVjdCB4aGNpX2hjZCAqeGhjaSA9IHRvX3hoY2lfaGNkKHZkZXYtPnVkZXYt Pmhvc3QpOwotCXVuaW9uIHhoY2lfdHJiIHRyYjsKLQlpbnQgcmV0OwotCi0JLyogSXNzdWUgRGVj b25maWd1cmUgRW5kcG9pbnQgQ29tbWFuZCAqLwotCXhoY2lfaW5pdF9ldmVudF9jbWRfdHJiKCZ0 cmIsCi0JCQkJdmRldi0+aW5fY3R4LT5kbWEsCi0JCQkJMCwKLQkJCQlUUkJfVFlQRShUUkJfQ09O RklHX0VQKSB8IFRSQl9EQyB8Ci0JCQkJU0xPVF9JRF9GT1JfVFJCKHZkZXYtPnNsb3RfaWQpKTsK LQl4aGNpX3ByaW50X3RyYih4aGNpLCAmdHJiLCAiUmVxdWVzdCAgRGVjb25maWd1cmVFbmRwb2lu dCIpOwotCXhoY2lfaXNzdWVfY29tbWFuZCh4aGNpLCAmdHJiKTsKLQlyZXQgPSB4aGNpX3dhaXRf Zm9yX2V2ZW50KHhoY2ksIFRSQl9DT01QTEVUSU9OLCAmdHJiKTsKLQl4aGNpX3ByaW50X3RyYih4 aGNpLCAmdHJiLCAiUmVzcG9uc2UgRGVjb25maWd1cmVFbmRwb2ludCIpOwotCXhoY2lfdmlydGRl dl96ZXJvX2luX2N0eCh2ZGV2KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgeGhj aV92aXJ0ZGV2X2luaXQoc3RydWN0IHhoY2lfdmlydHVhbF9kZXZpY2UgKnZkZXYpCi17Ci0Jc3Ry dWN0IHhoY2lfaGNkICp4aGNpID0gdG9feGhjaV9oY2QodmRldi0+dWRldi0+aG9zdCk7Ci0Jc3Ry dWN0IHVzYl9kZXZpY2UgKnRvcF9kZXY7Ci0Jc3RydWN0IHhoY2lfc2xvdF9jdHggKmluX3Nsb3Q7 Ci0Jc3RydWN0IHhoY2lfZXBfY3R4ICppbl9lcDsKLQlpbnQgbWF4X3BhY2tldHM7Ci0JdTMyIHJv dXRlID0gMCwgZGV2X2luZm8sIGRldl9pbmZvMiwgdHRfaW5mbywgZXBfaW5mbzIsIHR4X2luZm87 Ci0JYm9vbCBvbl9oc19odWIgPSBmYWxzZTsKLQlpbnQgaHNfc2xvdF9pZCA9IDA7Ci0KLQlpbl9l cCA9IHhoY2lfZ2V0X2VwX2N0eCh4aGNpLCB2ZGV2LT5pbl9jdHgsIDApOwotCWluX3Nsb3QgPSB4 aGNpX2dldF9zbG90X2N0eCh4aGNpLCB2ZGV2LT5pbl9jdHgpOwotCi0JLyoKLQkgKiBGaW5kIHRo ZSByb290IGh1YiBwb3J0IHRoaXMgZGV2aWNlIGlzIHVuZGVyLCBhbHNvIGRldGVybWluZSBTbG90 SUQKLQkgKiBvZiBwb3NzaWJsZSBleHRlcm5hbCBIUyBodWIgYSBMUy9GUyBkZXZpY2UgY291bGQg YmUgY29ubmVjdGVkIHRvLgotCSAqLwotCWZvciAodG9wX2RldiA9IHZkZXYtPnVkZXY7IHRvcF9k ZXYtPnBhcmVudCAmJiB0b3BfZGV2LT5wYXJlbnQtPnBhcmVudDsKLQkgICAgIHRvcF9kZXYgPSB0 b3BfZGV2LT5wYXJlbnQpIHsKLQkJaWYgKHRvcF9kZXYtPnBhcmVudC0+ZGVzY3JpcHRvci0+YkRl dmljZUNsYXNzICE9IFVTQl9DTEFTU19IVUIpCi0JCQljb250aW51ZTsKLQotCQlyb3V0ZSA9IChy b3V0ZSA8PCA0KSB8ICh0b3BfZGV2LT5wb3J0bnIgJiAweGYpOwotCi0JCWlmICh0b3BfZGV2LT5w YXJlbnQtPnNwZWVkICE9IFVTQl9TUEVFRF9MT1cgJiYKLQkJICAgIHRvcF9kZXYtPnBhcmVudC0+ c3BlZWQgIT0gVVNCX1NQRUVEX0ZVTEwpIHsKLQkJCW9uX2hzX2h1YiA9IHRydWU7Ci0JCQlpZiAo IWhzX3Nsb3RfaWQpIHsKLQkJCQlzdHJ1Y3QgeGhjaV92aXJ0dWFsX2RldmljZSAqdmh1YiA9Ci0J CQkJCXhoY2lfZmluZF92aXJ0ZGV2KHhoY2ksIHRvcF9kZXYtPnBhcmVudCk7Ci0JCQkJaHNfc2xv dF9pZCA9IHZodWItPnNsb3RfaWQ7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiA0LjMuMyAzKSBJbml0 YWxpemUgSW5wdXQgU2xvdCBDb250ZXh0ICovCi0JZGV2X2luZm8gPSBMQVNUX0NUWCgxKTsKLQlz d2l0Y2ggKHZkZXYtPnVkZXYtPnNwZWVkKSB7Ci0JY2FzZSBVU0JfU1BFRURfU1VQRVI6Ci0JCWRl dl9pbmZvIHw9IFNMT1RfU1BFRURfU1M7Ci0JCW1heF9wYWNrZXRzID0gNTEyOwotCQlicmVhazsK LQljYXNlIFVTQl9TUEVFRF9ISUdIOgotCQlkZXZfaW5mbyB8PSBTTE9UX1NQRUVEX0hTOwotCQlt YXhfcGFja2V0cyA9IDY0OwotCQlicmVhazsKLQljYXNlIFVTQl9TUEVFRF9GVUxMOgotCQlkZXZf aW5mbyB8PSBTTE9UX1NQRUVEX0ZTOwotCQltYXhfcGFja2V0cyA9IDY0OwotCQlicmVhazsKLQlj YXNlIFVTQl9TUEVFRF9MT1c6Ci0JCWRldl9pbmZvIHw9IFNMT1RfU1BFRURfTFM7Ci0JCW1heF9w YWNrZXRzID0gODsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJbWF4X3BhY2tldHMgPSAwOwotCQli cmVhazsKLQl9Ci0JZGV2X2luZm8gfD0gcm91dGU7Ci0JZGV2X2luZm8yID0gUk9PVF9IVUJfUE9S VCh0b3BfZGV2LT5wb3J0bnIpOwotCXR0X2luZm8gPSAwOwotCi0JLyogSXMgdGhpcyBhIExTL0ZT IGRldmljZSB1bmRlciBhbiBleHRlcm5hbCBIUyBodWI/ICovCi0JaWYgKG9uX2hzX2h1YiAmJiAo dmRldi0+dWRldi0+c3BlZWQgPT0gVVNCX1NQRUVEX0ZVTEwgfHwKLQkJCSAgdmRldi0+dWRldi0+ c3BlZWQgPT0gVVNCX1NQRUVEX0xPVykpIHsKLQkJZGV2X2luZm8gfD0gREVWX01UVDsKLQkJdHRf aW5mbyB8PSAodG9wX2Rldi0+cG9ydG5yIDw8IDgpIHwgaHNfc2xvdF9pZDsKLQl9Ci0KLQlpbl9z bG90LT5kZXZfaW5mbyA9IGNwdV90b19sZTMyKGRldl9pbmZvKTsKLQlpbl9zbG90LT5kZXZfaW5m bzIgPSBjcHVfdG9fbGUzMihkZXZfaW5mbzIpOwotCWluX3Nsb3QtPnR0X2luZm8gPSBjcHVfdG9f bGUzMih0dF9pbmZvKTsKLQotCS8qIDQuMy4zIDQpIEluaXRhbGl6ZSBUcmFuc2ZlciBSaW5nICov Ci0JdmRldi0+ZXBbMF0gPSB4aGNpX2dldF9lbmRwb2ludF9yaW5nKHhoY2kpOwotCWlmICghdmRl di0+ZXBbMF0pCi0JCXJldHVybiAtRU5PTUVNOwotCXhoY2lfcmluZ19pbml0KHZkZXYtPmVwWzBd LCBOVU1fVFJBTlNGRVJfVFJCUywgVFlQRV9DVFJMKTsKLQotCS8qIDQuMy4zIDUpIEluaXRpYWxp emUgSW5wdXQgQ29udHJvbCBFbmRwb2ludCAwIENvbnRleHQgKi8KLQllcF9pbmZvMiA9IEVQX1RZ UEUoQ1RSTF9FUCkgfCBNQVhfQlVSU1QoMCkgfCBFUlJPUl9DT1VOVCgzKTsKLQllcF9pbmZvMiB8 PSBNQVhfUEFDS0VUKG1heF9wYWNrZXRzKTsKLQl0eF9pbmZvID0gQVZHX1RSQl9MRU5HVEhfRk9S X0VQKDgpOwotCWluX2VwLT5lcF9pbmZvMiA9IGNwdV90b19sZTMyKGVwX2luZm8yKTsKLQlpbl9l cC0+dHhfaW5mbyA9IGNwdV90b19sZTMyKHR4X2luZm8pOwotCWluX2VwLT5kZXEgPSBjcHVfdG9f bGU2NCgoZG1hX2FkZHJfdCl2ZGV2LT5lcFswXS0+ZW5xdWV1ZSB8Ci0JCQkJIHZkZXYtPmVwWzBd LT5jeWNsZV9zdGF0ZSk7Ci0KLQkvKiA0LjMuMyA2KzcpIEluaXRhbGl6ZSBhbmQgU2V0IERldmlj ZSBDb250ZXh0IEJhc2UgQWRkcmVzcyBBcnJheSAqLwotCXhoY2ktPmRjYmFhW3ZkZXYtPnNsb3Rf aWRdID0gY3B1X3RvX2xlNjQodmRldi0+b3V0X2N0eC0+ZG1hKTsKLQotCXJldHVybiAwOwotfQot Ci1zdGF0aWMgaW50IHhoY2lfdmlydGRldl9zZXR1cChzdHJ1Y3QgeGhjaV92aXJ0dWFsX2Rldmlj ZSAqdmRldiwKLQkJCSAgICAgIGVudW0geGhjaV9zZXR1cF9kZXYgc2V0dXApCi17Ci0Jc3RydWN0 IHhoY2lfaGNkICp4aGNpID0gdG9feGhjaV9oY2QodmRldi0+dWRldi0+aG9zdCk7Ci0Jc3RhdGlj IHN0cnVjdCB4aGNpX2lucHV0X2NvbnRyb2xfY3R4ICppbl9pY2M7Ci0Jc3RydWN0IHhoY2lfc2xv dF9jdHggKmluX3Nsb3Q7Ci0Jc3RydWN0IHhoY2lfZXBfY3R4ICppbl9lcDsKLQl1bmlvbiB4aGNp X3RyYiB0cmI7Ci0JdTMyIGZsYWdzOwotCWludCByZXQ7Ci0KLQlpbl9zbG90ID0geGhjaV9nZXRf c2xvdF9jdHgoeGhjaSwgdmRldi0+aW5fY3R4KTsKLQlpbl9pY2MgPSB4aGNpX2dldF9pbnB1dF9j b250cm9sX2N0eCh2ZGV2LT5pbl9jdHgpOwotCi0JLyoKLQkgKiBJZiB0aGlzIGlzIHRoZSBmaXJz dCBTZXQgQWRkcmVzcyBzaW5jZSBkZXZpY2UKLQkgKiBwbHVnLWluIHRoZW4gaW5pdGlhbGl6ZSBT bG90IENvbnRleHQKLQkgKi8KLQlpZiAoIWluX3Nsb3QtPmRldl9pbmZvKQotCQl4aGNpX3ZpcnRk ZXZfaW5pdCh2ZGV2KTsKLQllbHNlIHsKLQkJaW5fZXAgPSB4aGNpX2dldF9lcF9jdHgoeGhjaSwg dmRldi0+aW5fY3R4LCAwKTsKLQotCQkvKiBPdGhlcndpc2UsIHVwZGF0ZSBDb250cm9sIFJpbmcg RGVxdWV1ZSBwb2ludGVyICovCi0JCWluX2VwLT5kZXEgPSBjcHVfdG9fbGU2NCgoZG1hX2FkZHJf dCl2ZGV2LT5lcFswXS0+ZW5xdWV1ZSB8Ci0JCQkJCSB2ZGV2LT5lcFswXS0+Y3ljbGVfc3RhdGUp OwotCQkvKgotCQkgKiBGUyBkZXZpY2VzIGhhdmUgTWF4UGFja2V0U2l6ZTAgb2YgOCBvciA2NCwg d2Ugc3RhcnQKLQkJICogd2l0aCA2NC4gSWYgYXNzdW10aW9uIHdhcyB3cm9uZywgZml4IGl0IHVw IGhlcmUuCi0JCSAqLwotCQlpZiAodmRldi0+dWRldi0+c3BlZWQgPT0gVVNCX1NQRUVEX0ZVTEwg JiYKLQkJICAgIHZkZXYtPnVkZXYtPm1heHBhY2tldHNpemUgPT0gUEFDS0VUX1NJWkVfOCkgewot CQkJdTMyIGluZm8gPSBsZTMyX3RvX2NwdShpbl9lcC0+ZXBfaW5mbzIpOwotCQkJaW5mbyAmPSB+ TUFYX1BBQ0tFVF9NQVNLOwotCQkJaW5mbyB8PSBNQVhfUEFDS0VUKDgpOwotCQkJaW5fZXAtPmVw X2luZm8yID0gY3B1X3RvX2xlMzIoaW5mbyk7Ci0JCX0KLQl9Ci0KLQlpbl9pY2MtPmFkZF9mbGFn cyA9IGNwdV90b19sZTMyKFNMT1RfRkxBRyB8IEVQMF9GTEFHKTsKLQlpbl9pY2MtPmRyb3BfZmxh Z3MgPSAwOwotCi0JLyogSXNzdWUgQWRkcmVzcyBEZXZpY2UgQ29tbWFuZCAqLwotCWZsYWdzID0g VFJCX1RZUEUoVFJCX0FERFJfREVWKSB8Ci0JCVNMT1RfSURfRk9SX1RSQih2ZGV2LT5zbG90X2lk KTsKLQlpZiAoc2V0dXAgPT0gU0VUVVBfQ09OVEVYVF9PTkxZKQotCQlmbGFncyB8PSBUUkJfQlNS OwotCXhoY2lfaW5pdF9ldmVudF9jbWRfdHJiKCZ0cmIsCi0JCQkJdmRldi0+aW5fY3R4LT5kbWEs Ci0JCQkJMCwKLQkJCQlmbGFncyk7Ci0JeGhjaV9wcmludF90cmIoeGhjaSwgJnRyYiwgIlJlcXVl c3QgIEFkZHJlc3NEZXZpY2UiKTsKLQl4aGNpX2lzc3VlX2NvbW1hbmQoeGhjaSwgJnRyYik7Ci0J cmV0ID0geGhjaV93YWl0X2Zvcl9ldmVudCh4aGNpLCBUUkJfQ09NUExFVElPTiwgJnRyYik7Ci0J eGhjaV9wcmludF90cmIoeGhjaSwgJnRyYiwgIlJlc3BvbnNlIEFkZHJlc3NEZXZpY2UiKTsKLQl4 aGNpX3ZpcnRkZXZfemVyb19pbl9jdHgodmRldik7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0 aWMgaW50IHhoY2lfdmlydGRldl9zZXRfYWRkcmVzcyhzdHJ1Y3QgeGhjaV92aXJ0dWFsX2Rldmlj ZSAqdmRldikKLXsKLQlyZXR1cm4geGhjaV92aXJ0ZGV2X3NldHVwKHZkZXYsIFNFVFVQX0NPTlRF WFRfQUREUkVTUyk7Ci19Ci0KLXN0YXRpYyBpbnQgeGhjaV92aXJ0ZGV2X2VuYWJsZShzdHJ1Y3Qg eGhjaV92aXJ0dWFsX2RldmljZSAqdmRldikKLXsKLQlyZXR1cm4geGhjaV92aXJ0ZGV2X3NldHVw KHZkZXYsIFNFVFVQX0NPTlRFWFRfT05MWSk7Ci19Ci0KLXN0YXRpYyBpbnQgeGhjaV92aXJ0ZGV2 X2F0dGFjaChzdHJ1Y3QgeGhjaV9oY2QgKnhoY2ksIHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2KQot ewotCXN0cnVjdCB4aGNpX3ZpcnR1YWxfZGV2aWNlICp2ZGV2OwotCWludCByZXQ7Ci0KLQl2ZGV2 ID0geGhjaV9hbGxvY192aXJ0ZGV2KHhoY2ksIHVkZXYpOwotCWlmIChJU19FUlIodmRldikpCi0J CXJldHVybiBQVFJfRVJSKHZkZXYpOwotCi0JcmV0ID0geGhjaV92aXJ0ZGV2X2VuYWJsZV9zbG90 KHZkZXYpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlyZXR1cm4geGhjaV92aXJ0ZGV2 X2VuYWJsZSh2ZGV2KTsKLX0KLQotaW50IHhoY2lfdmlydGRldl9kZXRhY2goc3RydWN0IHhoY2lf dmlydHVhbF9kZXZpY2UgKnZkZXYpCi17Ci0JeGhjaV92aXJ0ZGV2X2RlY29uZmlndXJlKHZkZXYp OwotCXhoY2lfdmlydGRldl9kaXNhYmxlX3Nsb3QodmRldik7Ci0JeGhjaV9mcmVlX3ZpcnRkZXYo dmRldik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB4aGNpX3N1Ym1pdF9ub3JtYWwo c3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsIHVuc2lnbmVkIGxvbmcgcGlwZSwKLQkJCSAgICAgIHZv aWQgKmJ1ZmZlciwgaW50IGxlbmd0aCkKLXsKLQlzdHJ1Y3QgdXNiX2hvc3QgKmhvc3QgPSB1ZGV2 LT5ob3N0OwotCXN0cnVjdCB4aGNpX2hjZCAqeGhjaSA9IHRvX3hoY2lfaGNkKGhvc3QpOwotCWVu dW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRtYV9kaXJlY3Rpb247Ci0Jc3RydWN0IHhoY2lfdmlydHVh bF9kZXZpY2UgKnZkZXY7Ci0Jc3RydWN0IHhoY2lfc2xvdF9jdHggKm91dF9zbG90OwotCWRtYV9h ZGRyX3QgYnVmZmVyX2RtYTsKLQl1bmlvbiB4aGNpX3RyYiB0cmI7Ci0JdTggZXBhZGRyID0gdXNi X3BpcGVlbmRwb2ludChwaXBlKTsKLQl1OCBlcGk7Ci0JdTMyIGZsYWdzID0gVFJCX1RZUEUoVFJC X05PUk1BTCkgfCBUUkJfSU9DOwotCWludCByZXQ7Ci0KLQlpZiAodXNiX3BpcGVpbihwaXBlKSkg ewotCQllcGFkZHIgfD0gVVNCX0RJUl9JTjsKLQkJZmxhZ3MgfD0gVFJCX0lTUDsKLQkJZG1hX2Rp cmVjdGlvbiA9IERNQV9GUk9NX0RFVklDRTsKLQl9IGVsc2UgewotCQllcGFkZHIgfD0gVVNCX0RJ Ul9PVVQ7Ci0JCWRtYV9kaXJlY3Rpb24gPSBETUFfVE9fREVWSUNFOwotCX0KLQotCWVwaSA9IHho Y2lfZ2V0X2VuZHBvaW50X2luZGV4KGVwYWRkciwgdXNiX3BpcGV0eXBlKHBpcGUpKTsKLQl2ZGV2 ID0geGhjaV9maW5kX3ZpcnRkZXYoeGhjaSwgdWRldik7Ci0JaWYgKCF2ZGV2KQotCQlyZXR1cm4g LUVOT0RFVjsKLQotCW91dF9zbG90ID0geGhjaV9nZXRfc2xvdF9jdHgoeGhjaSwgdmRldi0+b3V0 X2N0eCk7Ci0KLQlkZXZfZGJnKHhoY2ktPmRldiwgIiVzIHVkZXYgJXAgdmRldiAlcCBzbG90ICV1 IHN0YXRlICV1IGVwaSAldSBpbl9jdHggJXAgb3V0X2N0eCAlcFxuIiwKLQkJX19mdW5jX18sIHVk ZXYsIHZkZXYsIHZkZXYtPnNsb3RfaWQsCi0JCUdFVF9TTE9UX1NUQVRFKGxlMzJfdG9fY3B1KG91 dF9zbG90LT5kZXZfc3RhdGUpKSwgZXBpLAotCQl2ZGV2LT5pbl9jdHgtPmJ5dGVzLCB2ZGV2LT5v dXRfY3R4LT5ieXRlcyk7Ci0KLQkvKiBwYXNzIG93bmVyc2hpcCBvZiBkYXRhIGJ1ZmZlciB0byBk ZXZpY2UgKi8KLQlidWZmZXJfZG1hID0gZG1hX21hcF9zaW5nbGUoeGhjaS0+ZGV2LCBidWZmZXIs IGxlbmd0aCwKLQkJCQkgICAgZG1hX2RpcmVjdGlvbik7Ci0JaWYgKGRtYV9tYXBwaW5nX2Vycm9y KHhoY2ktPmRldiwgYnVmZmVyX2RtYSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JLyogTm9ybWFs IFRSQiAqLwotCS8qIEZJWE1FOiBURCByZW1haW5kZXIgKi8KLQl4aGNpX2luaXRfZXZlbnRfY21k X3RyYigmdHJiLAotCQkJCWJ1ZmZlcl9kbWEsCi0JCQkJVFJCX0xFTihsZW5ndGgpIHwgVFJCX0lO VFJfVEFSR0VUKDApLAotCQkJCWZsYWdzKTsKLQl4aGNpX3ByaW50X3RyYih4aGNpLCAmdHJiLCAi UmVxdWVzdCAgTm9ybWFsIik7Ci0JeGhjaV92aXJ0ZGV2X2lzc3VlX3RyYW5zZmVyKHZkZXYsIGVw aSwgJnRyYiwgdHJ1ZSk7Ci0JcmV0ID0geGhjaV93YWl0X2Zvcl9ldmVudCh4aGNpLCBUUkJfVFJB TlNGRVIsICZ0cmIpOwotCXhoY2lfcHJpbnRfdHJiKHhoY2ksICZ0cmIsICJSZXNwb25zZSBOb3Jt YWwiKTsKLQotCS8qIFJlZ2FpbiBvd25lcnNoaXAgb2YgZGF0YSBidWZmZXIgZnJvbSBkZXZpY2Ug Ki8KLQlkbWFfdW5tYXBfc2luZ2xlKHhoY2ktPmRldiwgYnVmZmVyX2RtYSwgbGVuZ3RoLAotCQkJ IGRtYV9kaXJlY3Rpb24pOwotCXN3aXRjaCAocmV0KSB7Ci0JY2FzZSAtQ09NUF9TSE9SVF9UWDoK LQkJdWRldi0+c3RhdHVzID0gMDsKLQkJdWRldi0+YWN0X2xlbiA9IGxlbmd0aCAtIEVWRU5UX1RS Ql9MRU4odHJiLmV2ZW50X2NtZC5zdGF0dXMpOwotCQlyZXR1cm4gMDsKLQljYXNlIDA6Ci0JCXVk ZXYtPnN0YXR1cyA9IDA7Ci0JCXVkZXYtPmFjdF9sZW4gPSAwOwotCQlyZXR1cm4gMDsKLQljYXNl IC1FVElNRURPVVQ6Ci0JCXVkZXYtPnN0YXR1cyA9IFVTQl9TVF9DUkNfRVJSOwotCQlyZXR1cm4g LTE7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIC0xOwotCX0KLX0KLQotc3RhdGljIGludCB4aGNpX3N1 Ym1pdF9jb250cm9sKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LCB1bnNpZ25lZCBsb25nIHBpcGUs Ci0JCQkgICAgICAgdm9pZCAqYnVmZmVyLCBpbnQgbGVuZ3RoLCBzdHJ1Y3QgZGV2cmVxdWVzdCAq cmVxKQotewotCXN0cnVjdCB1c2JfaG9zdCAqaG9zdCA9IHVkZXYtPmhvc3Q7Ci0Jc3RydWN0IHho Y2lfaGNkICp4aGNpID0gdG9feGhjaV9oY2QoaG9zdCk7Ci0Jc3RydWN0IHhoY2lfdmlydHVhbF9k ZXZpY2UgKnZkZXY7Ci0Jc3RydWN0IHhoY2lfc2xvdF9jdHggKm91dF9zbG90OwotCWRtYV9hZGRy X3QgYnVmZmVyX2RtYSA9IDA7Ci0JdW5pb24geGhjaV90cmIgdHJiOwotCXUxNiB0eXBlUmVxID0g KHJlcS0+cmVxdWVzdHR5cGUgPDwgOCkgfCByZXEtPnJlcXVlc3Q7Ci0JdTY0IGZpZWxkWzJdOwot CXUzMiBmbGFnczsKLQlpbnQgcmV0OwotCi0JZGV2X2RiZyh4aGNpLT5kZXYsICIlcyByZXEgJXUg KCUjeCksIHR5cGUgJXUgKCUjeCksIHZhbHVlICV1ICglI3gpLCBpbmRleCAldSAoJSN4KSwgbGVu Z3RoICV1ICglI3gpXG4iLAotCQlfX2Z1bmNfXywgcmVxLT5yZXF1ZXN0LCByZXEtPnJlcXVlc3Qs Ci0JCXJlcS0+cmVxdWVzdHR5cGUsIHJlcS0+cmVxdWVzdHR5cGUsCi0JCWxlMTZfdG9fY3B1KHJl cS0+dmFsdWUpLCBsZTE2X3RvX2NwdShyZXEtPnZhbHVlKSwKLQkJbGUxNl90b19jcHUocmVxLT5p bmRleCksIGxlMTZfdG9fY3B1KHJlcS0+aW5kZXgpLAotCQlsZTE2X3RvX2NwdShyZXEtPmxlbmd0 aCksIGxlMTZfdG9fY3B1KHJlcS0+bGVuZ3RoKSk7Ci0KLQl2ZGV2ID0geGhjaV9maW5kX3ZpcnRk ZXYoeGhjaSwgdWRldik7Ci0JaWYgKCF2ZGV2KSB7Ci0JCXJldCA9IHhoY2lfdmlydGRldl9hdHRh Y2goeGhjaSwgdWRldik7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OwotCQl2ZGV2ID0geGhj aV9maW5kX3ZpcnRkZXYoeGhjaSwgdWRldik7Ci0JfQotCWlmICghdmRldikKLQkJcmV0dXJuIC1F Tk9ERVY7Ci0KLQlvdXRfc2xvdCA9IHhoY2lfZ2V0X3Nsb3RfY3R4KHhoY2ksIHZkZXYtPm91dF9j dHgpOwotCi0JZGV2X2RiZyh4aGNpLT5kZXYsICIlcyB1ZGV2ICVwIHZkZXYgJXAgc2xvdCAldSBz dGF0ZSAldSBlcGkgJXUgaW5fY3R4ICVwIG91dF9jdHggJXBcbiIsCi0JCV9fZnVuY19fLCB1ZGV2 LCB2ZGV2LCB2ZGV2LT5zbG90X2lkLAotCQlHRVRfU0xPVF9TVEFURShsZTMyX3RvX2NwdShvdXRf c2xvdC0+ZGV2X3N0YXRlKSksIDAsCi0JCXZkZXYtPmluX2N0eC0+Ynl0ZXMsIHZkZXYtPm91dF9j dHgtPmJ5dGVzKTsKLQotCWlmIChyZXEtPnJlcXVlc3QgPT0gVVNCX1JFUV9TRVRfQUREUkVTUykK LQkJcmV0dXJuIHhoY2lfdmlydGRldl9zZXRfYWRkcmVzcyh2ZGV2KTsKLQlpZiAocmVxLT5yZXF1 ZXN0ID09IFVTQl9SRVFfU0VUX0NPTkZJR1VSQVRJT04pIHsKLQkJcmV0ID0geGhjaV92aXJ0ZGV2 X2NvbmZpZ3VyZSh2ZGV2LCBsZTE2X3RvX2NwdShyZXEtPnZhbHVlKSk7Ci0JCWlmIChyZXQpCi0J CQlyZXR1cm4gcmV0OwotCX0KLQotCWlmIChsZW5ndGggPiAwKSB7Ci0JCS8qIFBhc3Mgb3duZXJz aGlwIG9mIGRhdGEgYnVmZmVyIHRvIGRldmljZSAqLwotCQlidWZmZXJfZG1hID0gZG1hX21hcF9z aW5nbGUoeGhjaS0+ZGV2LCBidWZmZXIsIGxlbmd0aCwKLQkJCQkJICAgIChyZXEtPnJlcXVlc3R0 eXBlICYgVVNCX0RJUl9JTikgPwotCQkJCQkgICAgRE1BX0ZST01fREVWSUNFIDogRE1BX1RPX0RF VklDRSk7Ci0JCWlmIChkbWFfbWFwcGluZ19lcnJvcih4aGNpLT5kZXYsIGJ1ZmZlcl9kbWEpKQot CQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCS8qIFNldHVwIFRSQiAqLwotCWZpZWxkWzBdID0gbGUx Nl90b19jcHUocmVxLT52YWx1ZSkgPDwgMTYgfAotCQlyZXEtPnJlcXVlc3QgPDwgOCB8IHJlcS0+ cmVxdWVzdHR5cGU7Ci0JZmllbGRbMV0gPSBsZTE2X3RvX2NwdShyZXEtPmxlbmd0aCkgPDwgMTYg fAotCQlsZTE2X3RvX2NwdShyZXEtPmluZGV4KTsKLQlmbGFncyA9IFRSQl9UWVBFKFRSQl9TRVRV UCkgfCBUUkJfSURUOwotCWlmICh4aGNpLT5oY2lfdmVyc2lvbiA+PSAweDEwMCAmJiBsZW5ndGgg PiAwKSB7Ci0JCWlmIChyZXEtPnJlcXVlc3R0eXBlICYgVVNCX0RJUl9JTikKLQkJCWZsYWdzIHw9 IFRSQl9UWF9UWVBFKFRSQl9EQVRBX0lOKTsKLQkJZWxzZQotCQkJZmxhZ3MgfD0gVFJCX1RYX1RZ UEUoVFJCX0RBVEFfT1VUKTsKLQl9Ci0JeGhjaV9pbml0X2V2ZW50X2NtZF90cmIoJnRyYiwKLQkJ CQlmaWVsZFsxXSA8PCAzMiB8IGZpZWxkWzBdLAotCQkJCVRSQl9MRU4oOCkgfCBUUkJfSU5UUl9U QVJHRVQoMCksCi0JCQkJZmxhZ3MpOwotCXhoY2lfcHJpbnRfdHJiKHhoY2ksICZ0cmIsICJSZXF1 ZXN0ICBTZXR1cCAiKTsKLQl4aGNpX3ZpcnRkZXZfaXNzdWVfdHJhbnNmZXIodmRldiwgMCwgJnRy YiwgZmFsc2UpOwotCi0JLyogRGF0YSBUUkIgKi8KLQlpZiAobGVuZ3RoID4gMCkgewotCQkvKiBG SVhNRTogVEQgcmVtYWluZGVyICovCi0JCWZsYWdzID0gVFJCX1RZUEUoVFJCX0RBVEEpIHwgVFJC X0lPQzsKLQkJaWYgKHJlcS0+cmVxdWVzdHR5cGUgJiBVU0JfRElSX0lOKQotCQkJZmxhZ3MgfD0g VFJCX0lTUCB8IFRSQl9ESVJfSU47Ci0JCXhoY2lfaW5pdF9ldmVudF9jbWRfdHJiKCZ0cmIsCi0J CQkJCWJ1ZmZlcl9kbWEsCi0JCQkJCVRSQl9MRU4obGVuZ3RoKSB8IFRSQl9JTlRSX1RBUkdFVCgw KSwKLQkJCQkJZmxhZ3MpOwotCQl4aGNpX3ByaW50X3RyYih4aGNpLCAmdHJiLCAiUmVxdWVzdCAg RGF0YSAgIik7Ci0JCXhoY2lfdmlydGRldl9pc3N1ZV90cmFuc2Zlcih2ZGV2LCAwLCAmdHJiLCBm YWxzZSk7Ci0JfQotCi0JLyogU3RhdHVzIFRSQiAqLwotCWZsYWdzID0gVFJCX1RZUEUoVFJCX1NU QVRVUykgfCBUUkJfSU9DOwotCWlmICghKGxlbmd0aCA+IDAgJiYgcmVxLT5yZXF1ZXN0dHlwZSAm IFVTQl9ESVJfSU4pKQotCQlmbGFncyB8PSBUUkJfRElSX0lOOwotCXhoY2lfaW5pdF9ldmVudF9j bWRfdHJiKCZ0cmIsCi0JCQkJMCwKLQkJCQlUUkJfSU5UUl9UQVJHRVQoMCksCi0JCQkJZmxhZ3Mp OwotCXhoY2lfcHJpbnRfdHJiKHhoY2ksICZ0cmIsICJSZXF1ZXN0ICBTdGF0dXMiKTsKLQl4aGNp X3ZpcnRkZXZfaXNzdWVfdHJhbnNmZXIodmRldiwgMCwgJnRyYiwgdHJ1ZSk7Ci0KLQlpZiAobGVu Z3RoID4gMCkgewotCQlyZXQgPSB4aGNpX3dhaXRfZm9yX2V2ZW50KHhoY2ksIFRSQl9UUkFOU0ZF UiwgJnRyYik7Ci0JCXhoY2lfcHJpbnRfdHJiKHhoY2ksICZ0cmIsICJSZXNwb25zZSBEYXRhICAi KTsKLQkJaWYgKHJldCA9PSAtQ09NUF9TSE9SVF9UWCkKLQkJCWxlbmd0aCAtPSBFVkVOVF9UUkJf TEVOKHRyYi5ldmVudF9jbWQuc3RhdHVzKTsKLQkJZWxzZSBpZiAocmV0IDwgMCkKLQkJCWdvdG8g ZG1hX3JlZ2FpbjsKLQl9Ci0KLQlyZXQgPSB4aGNpX3dhaXRfZm9yX2V2ZW50KHhoY2ksIFRSQl9U UkFOU0ZFUiwgJnRyYik7Ci0JeGhjaV9wcmludF90cmIoeGhjaSwgJnRyYiwgIlJlc3BvbnNlIFN0 YXR1cyIpOwotCi1kbWFfcmVnYWluOgotCWlmIChsZW5ndGggPiAwKSB7Ci0JCS8qIFJlZ2FpbiBv d25lcnNoaXAgb2YgZGF0YSBidWZmZXIgZnJvbSBkZXZpY2UgKi8KLQkJZG1hX3VubWFwX3Npbmds ZSh4aGNpLT5kZXYsIGJ1ZmZlcl9kbWEsIGxlbmd0aCwKLQkJCQkgKHJlcS0+cmVxdWVzdHR5cGUg JiBVU0JfRElSX0lOKSA/Ci0JCQkJIERNQV9GUk9NX0RFVklDRSA6IERNQV9UT19ERVZJQ0UpOwot CX0KLQotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JLyoKLQkgKiB1c2IgY29yZSBk b2Vzbid0IG5vdGlmeSB1cyBhYm91dCBkZXZpY2UgZXZlbnRzIG9uCi0JICogZXh0ZXJuYWwgSHVi cywgdHJhY2sgaXQgb3Vyc2VsdmVzLgotCSAqLwotCWlmICh0eXBlUmVxID09IEdldEh1YkRlc2Ny aXB0b3IpCi0JCXhoY2lfdmlydGRldl91cGRhdGVfaHViX2RldmljZSh2ZGV2LCBidWZmZXIsIGxl bmd0aCk7Ci0JaWYgKHR5cGVSZXEgPT0gQ2xlYXJQb3J0RmVhdHVyZSAmJgotCSAgICBjcHVfdG9f bGUxNihyZXEtPnZhbHVlKSA9PSBVU0JfUE9SVF9GRUFUX0NfQ09OTkVDVElPTikKLQkJeGhjaV92 aXJ0ZGV2X3VwZGF0ZV9odWJfc3RhdHVzKHZkZXYsIGxlMTZfdG9fY3B1KHJlcS0+aW5kZXgpKTsK LQotCXJldHVybiBsZW5ndGg7Ci19Ci0KLS8qCi0gKiB4SENJIGhvc3QgY29udHJvbGxlciBkcml2 ZXIKLSAqLwotCi1zdGF0aWMgdm9pZCB4aGNpX2RtYV9hbGxvYyhzdHJ1Y3QgeGhjaV9oY2QgKnho Y2kpCi17Ci0Jc2l6ZV90IHN6X3NwLCBzel9zcGEsIHN6X2RjYSwgc3pfY21kLCBzel9ldnQsIHN6 X2Vyc3QsIHN6X2VwOwotCXU2NCByZWc2NDsKLQl2b2lkICpwOwotCWludCBpLCBudW1fZXA7Ci0K LQkvKiBTY3JhdGNocGFkIGJ1ZmZlcnM6IFBBR0VfU0laRSBhbGlnbmVkICovCi0Jc3pfc3AgPSBB TElHTih4aGNpLT5udW1fc3AgKiB4aGNpLT5wYWdlX3NpemUsIHhoY2ktPnBhZ2Vfc2l6ZSk7Ci0J LyogRGV2aWNlIENvbnRleHQgQXJyYXk6IDY0QiBhbGlnbmVkICovCi0Jc3pfZGNhID0gQUxJR04o eGhjaS0+bWF4X3Nsb3RzICogc2l6ZW9mKHU2NCksIDY0KTsKLQkvKiBDb21tYW5kIFJpbmc6IDY0 QiBhbGlnbmVkICovCi0Jc3pfY21kID0gQUxJR04oTlVNX0NPTU1BTkRfVFJCUyAqIHNpemVvZih1 bmlvbiB4aGNpX3RyYiksIDY0KTsKLQkvKiBFdmVudCBSaW5nOiA2NEIgYWxpZ25lZCAqLwotCXN6 X2V2dCA9IE5VTV9FVkVOVF9TRUdNICoKLQkJQUxJR04oTlVNX0VWRU5UX1RSQlMgKiBzaXplb2Yo dW5pb24geGhjaV90cmIpLCA2NCk7Ci0JLyogRXZlbnQgUmluZyBTZWdtZW50IFRhYmxlOiA2NEIg YWxpZ25lZCAqLwotCXN6X2Vyc3QgPSBBTElHTihOVU1fRVZFTlRfU0VHTSAqIHNpemVvZihzdHJ1 Y3QgeGhjaV9lcnN0X2VudHJ5KSwgNjQpOwotCS8qIFNjcmF0Y2hwYWQgQnVmZmVyIEFycmF5OiA2 NEIgYWxpZ25lZCAqLwotCXN6X3NwYSA9IEFMSUdOKHhoY2ktPm51bV9zcCAqIHNpemVvZih1NjQp LCA2NCk7Ci0KLQl4aGNpLT5kbWFfc2l6ZSA9IHN6X3NwICsgc3pfc3BhICsgc3pfZGNhICsgc3pf Y21kICsgc3pfZXZ0ICsgc3pfZXJzdDsKLQotCS8qCi0JICogRW5kcG9pbnQgVHJhbnNmZXIgUmlu ZzogMTZCIGFsaWduZWQKLQkgKgotCSAqIFdlIGFsbG9jYXRlIHVwIHRvIE1BWF9FUF9SSU5HUyBm cm9tIHRoZSByZXN0IG9mIHRoZSBQQUdFCi0JICogZm9yIHZpcnR1YWwgZGV2aWNlcyB0byBwaWNr LXVwIChhbmQgcmV0dXJuKSBmb3IgZW5kcG9pbnQgdHJicy4KLQkgKi8KLQlzel9lcCA9IEFMSUdO KE5VTV9UUkFOU0ZFUl9UUkJTICogc2l6ZW9mKHVuaW9uIHhoY2lfdHJiKSwgMTYpOwotCi0JbnVt X2VwID0gUEFHRV9BTElHTih4aGNpLT5kbWFfc2l6ZSkgLQotCQlNSU5fRVBfUklOR1MgKiBzel9l cCAtIHhoY2ktPmRtYV9zaXplOwotCW51bV9lcCAvPSBzel9lcDsKLQludW1fZXAgPSBtYXgoTUFY X0VQX1JJTkdTLCBNSU5fRVBfUklOR1MgKyBudW1fZXApOwotCXhoY2ktPmRtYV9zaXplICs9IG51 bV9lcCAqIHN6X2VwOwotCi0JcCA9IGRtYV9hbGxvY19jb2hlcmVudCh4aGNpLT5kbWFfc2l6ZSwg RE1BX0FERFJFU1NfQlJPS0VOKTsKLQotCXhoY2ktPnNwID0gcDsgcCArPSBzel9zcDsKLQl4aGNp LT5kY2JhYSA9IHA7IHAgKz0gc3pfZGNhOwotCXhoY2ktPmNtZF9yaW5nLnRyYnMgPSBwOyBwICs9 IHN6X2NtZDsKLQl4aGNpLT5ldmVudF9yaW5nLnRyYnMgPSBwOyBwICs9IHN6X2V2dDsKLQl4aGNp LT5ldmVudF9lcnN0ID0gcDsgcCArPSBzel9lcnN0OwotCXhoY2ktPnNwX2FycmF5ID0gcDsgcCAr PSBzel9zcGE7Ci0KLQl4aGNpLT5yaW5ncyA9IHh6YWxsb2MobnVtX2VwICogc2l6ZW9mKCp4aGNp LT5yaW5ncykpOwotCWZvciAoaSA9IDA7IGkgPCBudW1fZXA7IGkrKykgewotCQl4aGNpLT5yaW5n c1tpXS50cmJzID0gcDsKLQkJcCArPSBzel9lcDsKLQkJeGhjaV9wdXRfZW5kcG9pbnRfcmluZyh4 aGNpLCAmeGhjaS0+cmluZ3NbaV0pOwotCX0KLQotCS8qIFNldHVwIFNjcmF0Y2hwYWQgQnVmZmVy IEFycmF5IGFuZCBCYXNlIEFkZHJlc3MgaW4gRGV2aWNlIENvbnRleHQgKi8KLQlyZWc2NCA9IGNw dV90b19sZTY0KChkbWFfYWRkcl90KXhoY2ktPnNwKTsKLQlmb3IgKGkgPSAwOyBpIDwgeGhjaS0+ bnVtX3NwOyBpKyssIHJlZzY0ICs9IHhoY2ktPnBhZ2Vfc2l6ZSkKLQkJeGhjaS0+c3BfYXJyYXlb aV0gPSBjcHVfdG9fbGU2NChyZWc2NCk7Ci0JaWYgKHhoY2ktPm51bV9zcCkKLQkJeGhjaS0+ZGNi YWFbMF0gPSBjcHVfdG9fbGU2NCgoZG1hX2FkZHJfdCl4aGNpLT5zcF9hcnJheSk7Ci0KLQkvKiBT ZXR1cCBFdmVudCBSaW5nIFNlZ21lbnQgVGFibGUgYW5kIEV2ZW50IFJpbmcgKi8KLQlyZWc2NCA9 IChkbWFfYWRkcl90KSZ4aGNpLT5ldmVudF9yaW5nLnRyYnNbMF07Ci0JeGhjaS0+ZXZlbnRfZXJz dFswXS5zZWdfYWRkciA9IGNwdV90b19sZTY0KHJlZzY0KTsKLQl4aGNpLT5ldmVudF9lcnN0WzBd LnNlZ19zaXplID0gY3B1X3RvX2xlMzIoTlVNX0VWRU5UX1RSQlMpOwotCXhoY2lfcmluZ19pbml0 KCZ4aGNpLT5ldmVudF9yaW5nLCBOVU1fRVZFTlRfVFJCUywgVFlQRV9FVkVOVCk7Ci0KLQkvKiBT ZXR1cCBDb21tYW5kIFJpbmcgKi8KLQl4aGNpX3JpbmdfaW5pdCgmeGhjaS0+Y21kX3JpbmcsIE5V TV9DT01NQU5EX1RSQlMsIFRZUEVfQ09NTUFORCk7Ci19Ci0KLXN0YXRpYyBpbnQgeGhjaV9oYWx0 KHN0cnVjdCB4aGNpX2hjZCAqeGhjaSkKLXsKLQl1MzIgcmVnID0gcmVhZGwoJnhoY2ktPm9wX3Jl Z3MtPnN0YXR1cyk7Ci0JdTMyIG1hc2sgPSAodTMyKX5YSENJX0lSUVM7Ci0KLQlpZiAoIShyZWcg JiBTVFNfSEFMVCkpCi0JCW1hc2sgJj0gfkNNRF9SVU47Ci0KLQkvKiBkaXNhYmxlIGFueSBJUlFz IGFuZCBiZWdpbiBoYWx0aW5nIHByb2Nlc3MgKi8KLQlyZWcgPSByZWFkbCgmeGhjaS0+b3BfcmVn cy0+Y29tbWFuZCk7Ci0JcmVnICY9IG1hc2s7Ci0Jd3JpdGVsKHJlZywgJnhoY2ktPm9wX3JlZ3Mt PmNvbW1hbmQpOwotCi0JcmV0dXJuIHhoY2lfaGFuZHNoYWtlKCZ4aGNpLT5vcF9yZWdzLT5zdGF0 dXMsCi0JCQkgICAgICBTVFNfSEFMVCwgU1RTX0hBTFQsIFhIQ0lfTUFYX0hBTFRfVVNFQyk7Ci19 Ci0KLXN0YXRpYyBpbnQgeGhjaV9yZXNldChzdHJ1Y3QgeGhjaV9oY2QgKnhoY2kpCi17Ci0JdTMy IHJlZzsKLQlpbnQgcmV0OwotCi0JcmVnID0gcmVhZGwoJnhoY2ktPm9wX3JlZ3MtPmNvbW1hbmQp OwotCXJlZyB8PSBDTURfUkVTRVQ7Ci0Jd3JpdGVsKHJlZywgJnhoY2ktPm9wX3JlZ3MtPmNvbW1h bmQpOwotCi0JcmV0ID0geGhjaV9oYW5kc2hha2UoJnhoY2ktPm9wX3JlZ3MtPmNvbW1hbmQsCi0J CQkgICAgIENNRF9SRVNFVCwgMCwgMTAgKiBTRUNPTkQgLyBVU0VDT05EKTsKLQlpZiAocmV0KSB7 Ci0JCWRldl9lcnIoeGhjaS0+ZGV2LCAiZmFpbGVkIHRvIHJlc2V0XG4iKTsKLQkJcmV0dXJuIHJl dDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB4aGNpX3N0YXJ0KHN0cnVjdCB4 aGNpX2hjZCAqeGhjaSkKLXsKLQl1MzIgcmVnOwotCWludCByZXQsIGk7Ci0KLQlyZWcgPSByZWFk bCgmeGhjaS0+b3BfcmVncy0+Y29tbWFuZCk7Ci0JcmVnIHw9IENNRF9SVU47Ci0Jd3JpdGVsKHJl ZywgJnhoY2ktPm9wX3JlZ3MtPmNvbW1hbmQpOwotCi0JcmV0ID0geGhjaV9oYW5kc2hha2UoJnho Y2ktPm9wX3JlZ3MtPnN0YXR1cywKLQkJCSAgICAgU1RTX0hBTFQsIDAsIFhIQ0lfTUFYX0hBTFRf VVNFQyk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKHhoY2ktPmRldiwgImZhaWxlZCB0byBzdGFy dFxuIik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JLyogRW5zdXJlIHBvcnRzIGFyZSBwb3dlcmVk LW9mZiAqLwotCWZvciAoaSA9IDA7IGkgPCB4aGNpLT5udW1fdXNiX3BvcnRzOyBpKyspCi0JCXho Y2lfaHViX3BvcnRfcG93ZXIoeGhjaSwgaSwgZmFsc2UpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0 YXRpYyBpbnQgeGhjaV9pbml0KHN0cnVjdCB1c2JfaG9zdCAqaG9zdCkKLXsKLQlzdHJ1Y3QgeGhj aV9oY2QgKnhoY2kgPSB0b194aGNpX2hjZChob3N0KTsKLQl1MzIgcmVnOwotCXU2NCByZWc2NDsK LQlpbnQgaSwgdG1wLCByZXQ7Ci0KLQlyZXQgPSB4aGNpX2hhbHQoeGhjaSk7Ci0JaWYgKHJldCkK LQkJcmV0dXJuIHJldDsKLQotCXJldCA9IHhoY2lfcmVzZXQoeGhjaSk7Ci0JaWYgKHJldCkKLQkJ cmV0dXJuIHJldDsKLQotCXRtcCA9IHJlYWRsKCZ4aGNpLT5vcF9yZWdzLT5wYWdlX3NpemUpOwot CWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7Ci0JCWlmICgoMHgxICYgdG1wKSAhPSAwKQotCQkJ YnJlYWs7Ci0JCXRtcCA+Pj0gMTsKLQl9Ci0JaWYgKGkgPCAxNikKLQkJdG1wID0gKDEgPDwgKGkr MTIpKTsKLQllbHNlCi0JCWRldl93YXJuKHhoY2ktPmRldiwgInVuc3VwcG9ydGVkIHBhZ2Ugc2l6 ZSAlZFxuIiwgdG1wKTsKLQkvKiBVc2UgNEsgcGFnZXMsIHNpbmNlIHRoYXQncyBjb21tb24gYW5k IHRoZSBtaW5pbXVtIHRoZSBIQyBzdXBwb3J0cyAqLwotCXhoY2ktPnBhZ2Vfc2hpZnQgPSAxMjsK LQl4aGNpLT5wYWdlX3NpemUgPSAxIDw8IHhoY2ktPnBhZ2Vfc2hpZnQ7Ci0KLQl4aGNpLT5yb290 ZGV2ID0gMDsKLQl4aGNpLT5udW1fc3AgPSBIQ1NfTUFYX1NDUkFUQ0hQQUQoeGhjaS0+aGNzX3Bh cmFtczIpOwotCXhoY2ktPm1heF9zbG90cyA9IEhDU19NQVhfU0xPVFMoeGhjaS0+aGNzX3BhcmFt czEpOwotCXhoY2lfZG1hX2FsbG9jKHhoY2kpOwotCi0JcmV0ID0geGhjaV9odWJfc2V0dXBfcG9y dHMoeGhjaSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCS8qCi0JICogUHJvZ3JhbSB0 aGUgTWF4IERldmljZSBTbG90cyBFbmFibGVkIChNYXhTbG90c0VuKSBmaWVsZCBpbiB0aGUKLQkg KiBDT05GSUcgcmVnaXN0ZXIgKDUuNC43KSB3aXRoIHRoZSBtYXggbnVtYmVyIG9mIHNsb3RzIEhD IGNhbiBoYW5kbGUuCi0JICovCi0JcmVnID0gcmVhZGwoJnhoY2ktPm9wX3JlZ3MtPmNvbmZpZ19y ZWcpOwotCXJlZyB8PSAoeGhjaS0+bWF4X3Nsb3RzICYgSENTX1NMT1RTX01BU0spOwotCXdyaXRl bChyZWcsICZ4aGNpLT5vcF9yZWdzLT5jb25maWdfcmVnKTsKLQotCS8qCi0JICogUHJvZ3JhbSB0 aGUgRGV2aWNlIENvbnRleHQgQmFzZSBBZGRyZXNzIEFycmF5IFBvaW50ZXIgKERDQkFBUCkKLQkg KiByZWdpc3RlciAoNS40LjYpIHdpdGggYSA2NC1iaXQgYWRkcmVzcyBwb2ludGluZyB0byB3aGVy ZSB0aGUKLQkgKiBEZXZpY2UgQ29udGV4dCBCYXNlIEFkZHJlc3MgQXJyYXkgaXMgbG9jYXRlZC4K LQkgKi8KLQl4aGNpX3dyaXRlXzY0KChkbWFfYWRkcl90KXhoY2ktPmRjYmFhLCAmeGhjaS0+b3Bf cmVncy0+ZGNiYWFfcHRyKTsKLQotCS8qCi0JICogRGVmaW5lIHRoZSBDb21tYW5kIFJpbmcgRGVx dWV1ZSBQb2ludGVyIGJ5IHByb2dyYW1taW5nIHRoZQotCSAqIENvbW1hbmQgUmluZyBDb250cm9s IFJlZ2lzdGVyICg1LjQuNSkgd2l0aCBhIDY0LWJpdCBhZGRyZXNzCi0JICogcG9pbnRpbmcgdG8g dGhlIHN0YXJ0aW5nIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IFRSQiBvZiB0aGUgQ29tbWFuZAotCSAq IFJpbmcuCi0JICovCi0JcmVnNjQgPSB4aGNpX3JlYWRfNjQoJnhoY2ktPm9wX3JlZ3MtPmNtZF9y aW5nKTsKLQlyZWc2NCA9IChyZWc2NCAmICh1NjQpQ01EX1JJTkdfUlNWRF9CSVRTKSB8Ci0JCSgo ZG1hX2FkZHJfdCkmeGhjaS0+Y21kX3JpbmcudHJic1swXSAmCi0JCSB+KGRtYV9hZGRyX3QpQ01E X1JJTkdfUlNWRF9CSVRTKSB8Ci0JCXhoY2ktPmNtZF9yaW5nLmN5Y2xlX3N0YXRlOwotCXhoY2lf d3JpdGVfNjQocmVnNjQsICZ4aGNpLT5vcF9yZWdzLT5jbWRfcmluZyk7Ci0KLQlyZWcgPSByZWFk bCgmeGhjaS0+Y2FwX3JlZ3MtPmRiX29mZikgJiBEQk9GRl9NQVNLOwotCXhoY2ktPmRiYSA9ICh2 b2lkIF9faW9tZW0gKil4aGNpLT5jYXBfcmVncyArIHJlZzsKLQl4aGNpLT5pcl9zZXQgPSAmeGhj aS0+cnVuX3JlZ3MtPmlyX3NldFswXTsKLQotCXJlZzY0ID0gKGRtYV9hZGRyX3QpJnhoY2ktPmV2 ZW50X3JpbmcudHJic1swXSAmCi0JCX4oZG1hX2FkZHJfdClDTURfUklOR19SU1ZEX0JJVFM7Ci0J eGhjaS0+ZXZlbnRfZXJzdFtpXS5zZWdfYWRkciA9IGNwdV90b19sZTY0KHJlZzY0KTsKLQl4aGNp LT5ldmVudF9lcnN0W2ldLnNlZ19zaXplID0gY3B1X3RvX2xlMzIoTlVNX0VWRU5UX1RSQlMpOwot CXJlZyA9IHJlYWRsKCZ4aGNpLT5pcl9zZXQtPmVyc3Rfc2l6ZSkgJiB+RVJTVF9TSVpFX01BU0s7 Ci0Jd3JpdGVsKHJlZyB8IE5VTV9FVkVOVF9TRUdNLCAmeGhjaS0+aXJfc2V0LT5lcnN0X3NpemUp OwotCXhoY2lfc2V0X2V2ZW50X2RlcXVldWUoeGhjaSk7Ci0KLQlyZWc2NCA9IHhoY2lfcmVhZF82 NCgmeGhjaS0+aXJfc2V0LT5lcnN0X2Jhc2UpOwotCXJlZzY0ICY9IEVSU1RfUFRSX01BU0s7Ci0J cmVnNjQgfD0gKGRtYV9hZGRyX3QpeGhjaS0+ZXZlbnRfZXJzdCAmCi0JCX4oZG1hX2FkZHJfdClD TURfUklOR19SU1ZEX0JJVFM7Ci0JeGhjaV93cml0ZV82NChyZWc2NCwgJnhoY2ktPmlyX3NldC0+ ZXJzdF9iYXNlKTsKLQotCS8qCi0JICogV3JpdGUgdGhlIFVTQkNNRCAoNS40LjEpIHRvIHR1cm4g dGhlIGhvc3QgY29udHJvbGxlciBPTiB2aWEKLQkgKiBzZXR0aW5nIHRoZSBSdW4vU3RvcCAoUi9T KSBiaXQgdG8g4oCYMeKAmS4gVGhpcyBvcGVyYXRpb24gYWxsb3dzIHRoZQotCSAqIHhIQyB0byBi ZWdpbiBhY2NlcHRpbmcgZG9vcmJlbGwgcmVmZXJlbmNlcy4KLQkgKi8KLQotCXJldHVybiB4aGNp X3N0YXJ0KHhoY2kpOwotCi0JLyoKLQkgKiBBdCB0aGlzIHBvaW50LCB0aGUgaG9zdCBjb250cm9s bGVyIGlzIHVwIGFuZCBydW5uaW5nIGFuZCB0aGUgUm9vdAotCSAqIEh1YiBwb3J0cyAoNS40Ljgp IHdpbGwgYmVnaW4gcmVwb3J0aW5nIGRldmljZSBjb25uZWN0cywgZXRjLiwKLQkgKiBhbmQgc3lz dGVtIHNvZnR3YXJlIG1heSBiZWdpbiBlbnVtZXJhdGluZyBkZXZpY2VzLgotCSAqIFN5c3RlbSBz b2Z0d2FyZSBtYXkgZm9sbG93IHRoZSBwcm9jZWR1cmVzIGRlc2NyaWJlZCBpbiBzZWN0aW9uIDQu MywKLQkgKiB0byBlbnVtZXJhdGUgYXR0YWNoZWQgZGV2aWNlcy4KLQkgKgotCSAqIFVTQjIgKExT L0ZTL0hTKSBkZXZpY2VzIHJlcXVpcmUgdGhlIHBvcnQgcmVzZXQgcHJvY2VzcyB0byBhZHZhbmNl Ci0JICogdGhlIHBvcnQgdG8gdGhlIEVuYWJsZWQgc3RhdGUuIE9uY2UgVVNCMiBwb3J0cyBhcmUg RW5hYmxlZCwgdGhlIHBvcnQKLQkgKiBpcyBhY3RpdmUgd2l0aCBTT0ZzIG9jY3VycmluZyBvbiB0 aGUgcG9ydCwgYnV0IHRoZSBQaXBlIFNjaGVkdWxlcwotCSAqIGhhdmUgbm90IHlldCBiZWVuIGVu YWJsZWQuCi0JICoKLQkgKiBTUyBwb3J0cyBhdXRvbWF0aWNhbGx5IGFkdmFuY2UgdG8gdGhlIEVu YWJsZWQgc3RhdGUgaWYgYSBzdWNjZXNzZnVsCi0JICogZGV2aWNlIGF0dGFjaCBpcyBkZXRlY3Rl ZC4KLQkgKi8KLX0KLQotc3RhdGljIGludCB4aGNpX3N1Ym1pdF9idWxrX21zZyhzdHJ1Y3QgdXNi X2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIHBpcGUsCi0JCQkJdm9pZCAqYnVmZmVyLCBpbnQg bGVuZ3RoLCBpbnQgdGltZW91dCkKLXsKLQlyZXR1cm4geGhjaV9zdWJtaXRfbm9ybWFsKGRldiwg cGlwZSwgYnVmZmVyLCBsZW5ndGgpOwotfQotCi1zdGF0aWMgaW50IHhoY2lfc3VibWl0X2NvbnRy b2xfbXNnKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgcGlwZSwKLQkgICB2 b2lkICpidWZmZXIsIGludCBsZW5ndGgsIHN0cnVjdCBkZXZyZXF1ZXN0ICpzZXR1cCwgaW50IHRp bWVvdXQpCi17Ci0Jc3RydWN0IHhoY2lfaGNkICp4aGNpID0gdG9feGhjaV9oY2QoZGV2LT5ob3N0 KTsKLQotCS8qIENhdGNoIFJvb3QgSHViIHJlcXVlc3RzICovCi0JaWYgKHVzYl9waXBlZGV2aWNl KHBpcGUpID09IHhoY2ktPnJvb3RkZXYpIHsKLQkJaWYgKHhoY2ktPnJvb3RkZXYgPT0gMCkKLQkJ CWRldi0+c3BlZWQgPSBVU0JfU1BFRURfSElHSDsKLQkJcmV0dXJuIHhoY2lfaHViX2NvbnRyb2wo ZGV2LCBwaXBlLCBidWZmZXIsIGxlbmd0aCwgc2V0dXApOwotCX0KLQotCXJldHVybiB4aGNpX3N1 Ym1pdF9jb250cm9sKGRldiwgcGlwZSwgYnVmZmVyLCBsZW5ndGgsIHNldHVwKTsKLX0KLQotc3Rh dGljIGludCB4aGNpX3N1Ym1pdF9pbnRfbXNnKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIHVuc2ln bmVkIGxvbmcgcGlwZSwKLQkJCSAgICAgICB2b2lkICpidWZmZXIsIGludCBsZW5ndGgsIGludCBp bnRlcnZhbCkKLXsKLQlzdHJ1Y3QgeGhjaV9oY2QgKnhoY2kgPSB0b194aGNpX2hjZChkZXYtPmhv c3QpOwotCi0JZGV2X2Vycih4aGNpLT5kZXYsICJJbnRlcnJ1cHQgbWVzc2FnZXMgbm90IHN1cHBv cnRlZFxuIik7Ci0KLQlyZXR1cm4gLUVOT1RTVVBQOwotfQotCi1zdGF0aWMgaW50IHhoY2lfZGV0 ZWN0KHN0cnVjdCBkZXZpY2VfZCAqZGV2KQotewotCXN0cnVjdCB4aGNpX2hjZCAqeGhjaSA9IGRl di0+cHJpdjsKLQotCXJldHVybiB1c2JfaG9zdF9kZXRlY3QoJnhoY2ktPmhvc3QpOwotfQotCi1p bnQgeGhjaV9yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlX2QgKmRldiwgc3RydWN0IHhoY2lfZGF0YSAq ZGF0YSkKLXsKLQlzdHJ1Y3QgdXNiX2hvc3QJKmhvc3Q7Ci0Jc3RydWN0IHhoY2lfaGNkICp4aGNp OwotCi0JeGhjaSA9IHh6YWxsb2Moc2l6ZW9mKCp4aGNpKSk7Ci0JaG9zdCA9ICZ4aGNpLT5ob3N0 OwotCUlOSVRfTElTVF9IRUFEKCZ4aGNpLT52ZGV2X2xpc3QpOwotCUlOSVRfTElTVF9IRUFEKCZ4 aGNpLT5yaW5nc19saXN0KTsKLQl4aGNpLT5kZXYgPSBkZXY7Ci0JeGhjaS0+Y2FwX3JlZ3MgPSBk YXRhLT5yZWdzOwotCXhoY2ktPm9wX3JlZ3MgPSAodm9pZCBfX2lvbWVtICopeGhjaS0+Y2FwX3Jl Z3MgKwotCQlIQ19MRU5HVEgocmVhZGwoJnhoY2ktPmNhcF9yZWdzLT5oY19jYXBiYXNlKSk7Ci0J eGhjaS0+cnVuX3JlZ3MgPSAodm9pZCBfX2lvbWVtICopeGhjaS0+Y2FwX3JlZ3MgKwotCQkocmVh ZGwoJnhoY2ktPmNhcF9yZWdzLT5ydW5fcmVnc19vZmYpICYgUlRTT0ZGX01BU0spOwotCS8qIENh Y2hlIHJlYWQtb25seSBjYXBhYmlsaXR5IHJlZ2lzdGVycyAqLwotCXhoY2ktPmhjc19wYXJhbXMx ID0gcmVhZGwoJnhoY2ktPmNhcF9yZWdzLT5oY3NfcGFyYW1zMSk7Ci0JeGhjaS0+aGNzX3BhcmFt czIgPSByZWFkbCgmeGhjaS0+Y2FwX3JlZ3MtPmhjc19wYXJhbXMyKTsKLQl4aGNpLT5oY3NfcGFy YW1zMyA9IHJlYWRsKCZ4aGNpLT5jYXBfcmVncy0+aGNzX3BhcmFtczMpOwotCXhoY2ktPmhjY19j YXBiYXNlID0gcmVhZGwoJnhoY2ktPmNhcF9yZWdzLT5oY19jYXBiYXNlKTsKLQl4aGNpLT5oY2lf dmVyc2lvbiA9IEhDX1ZFUlNJT04oeGhjaS0+aGNjX2NhcGJhc2UpOwotCXhoY2ktPmhjY19wYXJh bXMgPSByZWFkbCgmeGhjaS0+Y2FwX3JlZ3MtPmhjY19wYXJhbXMpOwotCi0JaG9zdC0+aHdfZGV2 ID0gZGV2OwotCWhvc3QtPmluaXQgPSB4aGNpX2luaXQ7Ci0JaG9zdC0+c3VibWl0X2ludF9tc2cg PSB4aGNpX3N1Ym1pdF9pbnRfbXNnOwotCWhvc3QtPnN1Ym1pdF9jb250cm9sX21zZyA9IHhoY2lf c3VibWl0X2NvbnRyb2xfbXNnOwotCWhvc3QtPnN1Ym1pdF9idWxrX21zZyA9IHhoY2lfc3VibWl0 X2J1bGtfbXNnOwotCi0JZGV2LT5wcml2ID0geGhjaTsKLQlkZXYtPmRldGVjdCA9IHhoY2lfZGV0 ZWN0OwotCi0JdXNiX3JlZ2lzdGVyX2hvc3QoaG9zdCk7Ci0KLQlkZXZfaW5mbyhkZXYsICJVU0Ig eEhDSSAleC4lMDJ4XG4iLAotCQkgeGhjaS0+aGNpX3ZlcnNpb24gPj4gOCwgeGhjaS0+aGNpX3Zl cnNpb24gJiAweGZmKTsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogeEhDSSBwbGF0Zm9ybSBk cml2ZXIKLSAqLwotCi1zdGF0aWMgaW50IHhoY2lfcHJvYmUoc3RydWN0IGRldmljZV9kICpkZXYp Ci17Ci0Jc3RydWN0IHJlc291cmNlICppb3JlczsKLQlzdHJ1Y3QgeGhjaV9kYXRhIGRhdGEgPSB7 fTsKLQotCWlvcmVzID0gZGV2X3JlcXVlc3RfbWVtX3Jlc291cmNlKGRldiwgMCk7Ci0JaWYgKElT X0VSUihpb3JlcykpCi0JCXJldHVybiBQVFJfRVJSKGlvcmVzKTsKLQlkYXRhLnJlZ3MgPSBJT01F TShpb3Jlcy0+c3RhcnQpOwotCi0JcmV0dXJuIHhoY2lfcmVnaXN0ZXIoZGV2LCAmZGF0YSk7Ci19 Ci0KLXN0YXRpYyB2b2lkIHhoY2lfcmVtb3ZlKHN0cnVjdCBkZXZpY2VfZCAqZGV2KQotewotCXN0 cnVjdCB4aGNpX2hjZCAqeGhjaSA9IGRldi0+cHJpdjsKLQl4aGNpX2hhbHQoeGhjaSk7Ci19Ci0K LXN0YXRpYyBzdHJ1Y3QgZHJpdmVyX2QgeGhjaV9kcml2ZXIgPSB7Ci0JLm5hbWUgID0gInhIQ0ki LAotCS5wcm9iZSA9IHhoY2lfcHJvYmUsCi0JLnJlbW92ZSA9IHhoY2lfcmVtb3ZlLAotfTsKLWRl dmljZV9wbGF0Zm9ybV9kcml2ZXIoeGhjaV9kcml2ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91 c2IvaG9zdC94aGNpLWh1Yi5jIGIvZHJpdmVycy91c2IvaG9zdC94aGNpLWh1Yi5jCmRlbGV0ZWQg ZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWUxNmY1Y2E1Li4wMDAwMDAwMDAwCi0tLSBhL2RyaXZl cnMvdXNiL2hvc3QveGhjaS1odWIuYworKysgL2Rldi9udWxsCkBAIC0xLDY0NiArMCwwIEBACi0v KgotICogeEhDSSBVU0IgMy4wIFJvb3QgSHViCi0gKgotICogU2ViYXN0aWFuIEhlc3NlbGJhcnRo IDxzZWJhc3RpYW4uaGVzc2VsYmFydGhAZ21haWwuY29tPgotICoKLSAqIFRoaXMgY3VycmVudGx5 IGRvZXMgbm90IHN1cHBvcnQgYW55IFN1cGVyU3BlZWQgY2FwYWJpbGl0aWVzLgotICoKLSAqIFNv bWUgY29kZSBib3Jyb3dlZCBmcm9tIHRoZSBMaW51eCB4SENJIGRyaXZlcgotICogICBBdXRob3I6 IFNhcmFoIFNoYXJwCi0gKiAgIENvcHlyaWdodCAoQykgMjAwOCBJbnRlbCBDb3JwLgotICoKLSAq IFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFs IFB1YmxpYwotICogTGljZW5zZSB2ZXJzaW9uIDIuICBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQg ImFzIGlzIiB3aXRob3V0IGFueQotICogd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhw cmVzcyBvciBpbXBsaWVkLgotICovCi0vLyNkZWZpbmUgREVCVUcKLSNpbmNsdWRlIDxjbG9jay5o PgotI2luY2x1ZGUgPGNvbW1vbi5oPgotI2luY2x1ZGUgPGlvLmg+Ci0jaW5jbHVkZSA8bGludXgv ZXJyLmg+Ci0jaW5jbHVkZSA8dXNiL3VzYi5oPgotI2luY2x1ZGUgPHVzYi94aGNpLmg+Ci0KLSNp bmNsdWRlICJ4aGNpLmgiCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX3Jvb3RfaHViX2luZm8g dXNiX3JoX2luZm8gPSB7Ci0JLmh1YiA9IHsKLQkJLmJMZW5ndGgJCT0gVVNCX0RUX0hVQl9OT05W QVJfU0laRSArCi0JCQkJCSAgKChVU0JfTUFYQ0hJTERSRU4gKyAxICsgNykgLyA4KSwKLQkJLmJE ZXNjcmlwdG9yVHlwZQk9IFVTQl9EVF9IVUIsCi0JCS5iTmJyUG9ydHMJCT0gMCwJLyogcnVudGlt ZSBtb2RpZmllZCAqLwotCQkud0h1YkNoYXJhY3RlcmlzdGljcwk9IDAsCi0JCS5iUHdyT24yUHdy R29vZAkJPSAxMCwKLQkJLmJIdWJDb250ckN1cnJlbnQJPSAwLAotCQkudS5ocy5EZXZpY2VSZW1v dmFibGUJPSB7fSwKLQkJLnUuaHMuUG9ydFB3ckN0cmxNYXNrCT0ge30KLQl9LAotCS5kZXZpY2Ug PSB7Ci0JCS5iTGVuZ3RoCQk9IFVTQl9EVF9ERVZJQ0VfU0laRSwKLQkJLmJEZXNjcmlwdG9yVHlw ZQk9IFVTQl9EVF9ERVZJQ0UsCi0JCS5iY2RVU0IJCQk9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYo MHgwMDAyKSwgLyogdjIuMCAqLwotCQkuYkRldmljZUNsYXNzCQk9IFVTQl9DTEFTU19IVUIsCi0J CS5iRGV2aWNlU3ViQ2xhc3MJPSAwLAotCQkuYkRldmljZVByb3RvY29sCT0gVVNCX0hVQl9QUl9I U19NVUxUSV9UVCwKLQkJLmJNYXhQYWNrZXRTaXplMAk9IDY0LAotCQkuaWRWZW5kb3IJCT0gMHgw MDAwLAotCQkuaWRQcm9kdWN0CQk9IDB4MDAwMCwKLQkJLmJjZERldmljZQkJPSBfX2NvbnN0YW50 X2NwdV90b19sZTE2KDB4MDAwMSksCi0JCS5pTWFudWZhY3R1cmVyCQk9IDEsCi0JCS5pUHJvZHVj dAkJPSAyLAotCQkuaVNlcmlhbE51bWJlcgkJPSAwLAotCQkuYk51bUNvbmZpZ3VyYXRpb25zCT0g MQotCX0sCi0JLmNvbmZpZyA9IHsKLQkJLmJMZW5ndGgJCT0gVVNCX0RUX0NPTkZJR19TSVpFLAot CQkuYkRlc2NyaXB0b3JUeXBlCT0gVVNCX0RUX0NPTkZJRywKLQkJLndUb3RhbExlbmd0aAkJPSBf X2NvbnN0YW50X2NwdV90b19sZTE2KFVTQl9EVF9DT05GSUdfU0laRSArCi0JCQkJCSBVU0JfRFRf SU5URVJGQUNFX1NJWkUgKyBVU0JfRFRfRU5EUE9JTlRfU0laRSksCi0JCS5iTnVtSW50ZXJmYWNl cwkJPSAxLAotCQkuYkNvbmZpZ3VyYXRpb25WYWx1ZQk9IDEsCi0JCS5pQ29uZmlndXJhdGlvbgkJ PSAwLAotCQkuYm1BdHRyaWJ1dGVzCQk9IFVTQl9DT05GSUdfQVRUX1NFTEZQT1dFUiwKLQkJLmJN YXhQb3dlcgkJPSAwCi0JfSwKLQkuaW50ZXJmYWNlID0gewotCQkuYkxlbmd0aAkJPSBVU0JfRFRf SU5URVJGQUNFX1NJWkUsCi0JCS5iRGVzY3JpcHRvclR5cGUJPSBVU0JfRFRfSU5URVJGQUNFLAot CQkuYkludGVyZmFjZU51bWJlcgk9IDAsCi0JCS5iQWx0ZXJuYXRlU2V0dGluZwk9IDAsCi0JCS5i TnVtRW5kcG9pbnRzCQk9IDEsCi0JCS5iSW50ZXJmYWNlQ2xhc3MJPSBVU0JfQ0xBU1NfSFVCLAot CQkuYkludGVyZmFjZVN1YkNsYXNzCT0gMCwKLQkJLmJJbnRlcmZhY2VQcm90b2NvbAk9IDAsCi0J CS5pSW50ZXJmYWNlCQk9IDAKLQl9LAotCS5lbmRwb2ludCA9IHsKLQkJLmJMZW5ndGgJCT0gVVNC X0RUX0VORFBPSU5UX1NJWkUsCi0JCS5iRGVzY3JpcHRvclR5cGUJPSBVU0JfRFRfRU5EUE9JTlQs Ci0JCS5iRW5kcG9pbnRBZGRyZXNzCT0gMHg4MSwJLyogVUVfRElSX0lOIHwgRUhDSV9JTlRSX0VO RFBUICovCi0JCS5ibUF0dHJpYnV0ZXMJCT0gVVNCX0VORFBPSU5UX1hGRVJfSU5ULAotCQkud01h eFBhY2tldFNpemUJCT0gX19jb25zdGFudF9jcHVfdG9fbGUxNigoVVNCX01BWENISUxEUkVOICsg MSArIDcpIC8gOCksCi0JCS5iSW50ZXJ2YWwJCT0gMjU1Ci0JfQotfTsKLQotc3RhdGljIHZvaWQg eGhjaV9zZXR1cF9jb21tb25faHViX2Rlc2NyaXB0b3Ioc3RydWN0IHhoY2lfaGNkICp4aGNpLAot CQkJCSAgICAgc3RydWN0IHVzYl9odWJfZGVzY3JpcHRvciAqZGVzYywgaW50IHBvcnRzKQotewot CXUxNiB2YWw7Ci0KLQkvKiB4aGNpIHNlY3Rpb24gNS40Ljkgc2F5cyAyMG1zIG1heCAqLwotCWRl c2MtPmJQd3JPbjJQd3JHb29kID0gMTA7Ci0JZGVzYy0+Ykh1YkNvbnRyQ3VycmVudCA9IDA7Ci0J ZGVzYy0+Yk5iclBvcnRzID0geGhjaS0+bnVtX3VzYl9wb3J0czsKLQotCXZhbCA9IDA7Ci0JLyog Qml0cyAxOjAgLSBzdXBwb3J0IHBlci1wb3J0IHBvd2VyIHN3aXRjaGluZywgb3IgcG93ZXIgYWx3 YXlzIG9uICovCi0JaWYgKEhDQ19QUEMoeGhjaS0+aGNjX3BhcmFtcykpCi0JCXZhbCB8PSBIVUJf Q0hBUl9JTkRWX1BPUlRfTFBTTTsKLQllbHNlCi0JCXZhbCB8PSBIVUJfQ0hBUl9OT19MUFNNOwot CS8qIEJpdCAgMiAtIHJvb3QgaHVicyBhcmUgbm90IHBhcnQgb2YgYSBjb21wb3VuZCBkZXZpY2Ug Ki8KLQkvKiBCaXRzIDQ6MyAtIGluZGl2aWR1YWwgcG9ydCBvdmVyIGN1cnJlbnQgcHJvdGVjdGlv biAqLwotCXZhbCB8PSBIVUJfQ0hBUl9JTkRWX1BPUlRfT0NQTTsKLQkvKiBCaXRzIDY6NSAtIG5v IFRUcyBpbiByb290IHBvcnRzICovCi0JLyogQml0ICA3IC0gbm8gcG9ydCBpbmRpY2F0b3JzICov Ci0JZGVzYy0+d0h1YkNoYXJhY3RlcmlzdGljcyA9IGNwdV90b19sZTE2KHZhbCk7Ci19Ci0KLXN0 YXRpYyB2b2lkIHhoY2lfc2V0dXBfdXNiMl9odWJfZGVzY3JpcHRvcihzdHJ1Y3QgeGhjaV9oY2Qg KnhoY2kpCi17Ci0Jc3RydWN0IHVzYl9odWJfZGVzY3JpcHRvciAqZGVzYyA9ICZ4aGNpLT51c2Jf aW5mby5odWI7Ci0JX191OCBwb3J0X3JlbW92YWJsZVsoVVNCX01BWENISUxEUkVOICsgMSArIDcp IC8gOF07Ci0JaW50IHBvcnRzOwotCXUzMiBwb3J0c2M7Ci0JdTE2IHZhbDsKLQlpbnQgaTsKLQot CXBvcnRzID0geGhjaS0+bnVtX3VzYl9wb3J0czsKLQl4aGNpX3NldHVwX2NvbW1vbl9odWJfZGVz Y3JpcHRvcih4aGNpLCBkZXNjLCBwb3J0cyk7Ci0JZGVzYy0+YkRlc2NyaXB0b3JUeXBlID0gVVNC X0RUX0hVQjsKLQl2YWwgPSAxICsgKHBvcnRzIC8gOCk7Ci0JZGVzYy0+Ykxlbmd0aCA9IFVTQl9E VF9IVUJfTk9OVkFSX1NJWkUgKyAyICogdmFsOwotCi0JLyogVGhlIERldmljZSBSZW1vdmFibGUg Yml0cyBhcmUgcmVwb3J0ZWQgb24gYSBieXRlIGdyYW51bGFyaXR5LgotCSAqIElmIHRoZSBwb3J0 IGRvZXNuJ3QgZXhpc3Qgd2l0aGluIHRoYXQgYnl0ZSwgdGhlIGJpdCBpcyBzZXQgdG8gMC4KLQkg Ki8KLQltZW1zZXQocG9ydF9yZW1vdmFibGUsIDAsIHNpemVvZihwb3J0X3JlbW92YWJsZSkpOwot CWZvciAoaSA9IDA7IGkgPCBwb3J0czsgaSsrKSB7Ci0JCXBvcnRzYyA9IHJlYWRsKHhoY2ktPnVz Yl9wb3J0c1tpXSk7Ci0JCS8qIElmIGEgZGV2aWNlIGlzIHJlbW92YWJsZSwgUE9SVFNDIHJlcG9y dHMgYSAwLCBzYW1lIGFzIGluIHRoZQotCQkgKiBodWIgZGVzY3JpcHRvciBEZXZpY2VSZW1vdmFi bGUgYml0cy4KLQkJICovCi0JCWlmIChwb3J0c2MgJiBQT1JUX0RFVl9SRU1PVkUpCi0JCQkvKiBU aGlzIG1hdGggaXMgaGFpcnkgYmVjYXVzZSBiaXQgMCBvZiBEZXZpY2VSZW1vdmFibGUKLQkJCSAq IGlzIHJlc2VydmVkLCBhbmQgYml0IDEgaXMgZm9yIHBvcnQgMSwgZXRjLgotCQkJICovCi0JCQlw b3J0X3JlbW92YWJsZVsoaSArIDEpIC8gOF0gfD0gMSA8PCAoKGkgKyAxKSAlIDgpOwotCX0KLQot CS8qIGNoMTEuaCBkZWZpbmVzIGEgaHViIGRlc2NyaXB0b3IgdGhhdCBoYXMgcm9vbSBmb3IgVVNC X01BWENISUxEUkVOCi0JICogcG9ydHMgb24gaXQuICBUaGUgVVNCIDIuMCBzcGVjaWZpY2F0aW9u IHNheXMgdGhhdCB0aGVyZSBhcmUgdHdvCi0JICogdmFyaWFibGUgbGVuZ3RoIGZpZWxkcyBhdCB0 aGUgZW5kIG9mIHRoZSBodWIgZGVzY3JpcHRvcjoKLQkgKiBEZXZpY2VSZW1vdmFibGUgYW5kIFBv cnRQd3JDdHJsTWFzay4gIEJ1dCBzaW5jZSB3ZSBjYW4gaGF2ZSBsZXNzIHRoYW4KLQkgKiBVU0Jf TUFYQ0hJTERSRU4gcG9ydHMsIHdlIG1heSBuZWVkIHRvIHVzZSB0aGUgRGV2aWNlUmVtb3ZhYmxl IGFycmF5Ci0JICogdG8gc2V0IFBvcnRQd3JDdHJsTWFzayBiaXRzLiAgUG9ydFB3ckN0cmxNYXNr IG11c3QgYWx3YXlzIGJlIHNldCB0bwotCSAqIDB4RkYsIHNvIHdlIGluaXRpYWxpemUgdGhlIGJv dGggYXJyYXlzIChEZXZpY2VSZW1vdmFibGUgYW5kCi0JICogUG9ydFB3ckN0cmxNYXNrKSB0byAw eEZGLiAgVGhlbiB3ZSBzZXQgdGhlIERldmljZVJlbW92YWJsZSBmb3IgZWFjaAotCSAqIHNldCBv ZiBwb3J0cyB0aGF0IGFjdHVhbGx5IGV4aXN0LgotCSAqLwotCW1lbXNldChkZXNjLT51LmhzLkRl dmljZVJlbW92YWJsZSwgMHhmZiwKLQkgICAgICAgc2l6ZW9mKGRlc2MtPnUuaHMuRGV2aWNlUmVt b3ZhYmxlKSk7Ci0JbWVtc2V0KGRlc2MtPnUuaHMuUG9ydFB3ckN0cmxNYXNrLCAweGZmLAotCSAg ICAgICBzaXplb2YoZGVzYy0+dS5ocy5Qb3J0UHdyQ3RybE1hc2spKTsKLQotCWZvciAoaSA9IDA7 IGkgPCAocG9ydHMgKyAxICsgNykgLyA4OyBpKyspCi0JCW1lbXNldCgmZGVzYy0+dS5ocy5EZXZp Y2VSZW1vdmFibGVbaV0sIHBvcnRfcmVtb3ZhYmxlW2ldLAotCQkgICAgICAgc2l6ZW9mKF9fdTgp KTsKLX0KLQotLyogRklYTUU6IHVzYiBjb3JlIGRvZXMgbm90IGtub3cgYWJvdXQgVVNCX1NQRUVE X1NVUEVSIGF0IGFsbCAqLwotc3RhdGljIF9fbWF5YmVfdW51c2VkIHZvaWQgeGhjaV9zZXR1cF91 c2IzX2h1Yl9kZXNjcmlwdG9yKHN0cnVjdCB4aGNpX2hjZCAqeGhjaSkKLXsKLQlzdHJ1Y3QgdXNi X2h1Yl9kZXNjcmlwdG9yICpkZXNjID0gJnhoY2ktPnVzYl9pbmZvLmh1YjsKLQlpbnQgcG9ydHM7 Ci0JdTE2IHBvcnRfcmVtb3ZhYmxlOwotCXUzMiBwb3J0c2M7Ci0JaW50IGk7Ci0KLQlwb3J0cyA9 IHhoY2ktPm51bV91c2JfcG9ydHM7Ci0JeGhjaV9zZXR1cF9jb21tb25faHViX2Rlc2NyaXB0b3Io eGhjaSwgZGVzYywgcG9ydHMpOwotCWRlc2MtPmJEZXNjcmlwdG9yVHlwZSA9IFVTQl9EVF9TU19I VUI7Ci0JZGVzYy0+Ykxlbmd0aCA9IFVTQl9EVF9TU19IVUJfU0laRTsKLQkvKgotCSAqIGhlYWRl ciBkZWNvZGUgbGF0ZW5jeSBzaG91bGQgYmUgemVybyBmb3Igcm9vdGh1YnMsCi0JICogc2VlIHNl Y3Rpb24gNC4yMy41LjIuCi0JICovCi0JZGVzYy0+dS5zcy5iSHViSGRyRGVjTGF0ID0gMDsKLQlk ZXNjLT51LnNzLndIdWJEZWxheSA9IDA7Ci0JcG9ydF9yZW1vdmFibGUgPSAwOwotCS8qIGJpdCAw IGlzIHJlc2VydmVkLCBiaXQgMSBpcyBmb3IgcG9ydCAxLCBldGMuICovCi0JZm9yIChpID0gMDsg aSA8IHBvcnRzOyBpKyspIHsKLQkJcG9ydHNjID0gcmVhZGwoeGhjaS0+dXNiX3BvcnRzW2ldKTsK LQkJaWYgKHBvcnRzYyAmIFBPUlRfREVWX1JFTU9WRSkKLQkJCXBvcnRfcmVtb3ZhYmxlIHw9IDEg PDwgKGkgKyAxKTsKLQl9Ci0JZGVzYy0+dS5zcy5EZXZpY2VSZW1vdmFibGUgPSBjcHVfdG9fbGUx Nihwb3J0X3JlbW92YWJsZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHhoY2lfYWRkX2luX3BvcnQoc3Ry dWN0IHhoY2lfaGNkICp4aGNpLCB1bnNpZ25lZCBpbnQgbnVtX3BvcnRzLAotCQkgICAgIF9fbGUz MiBfX2lvbWVtICphZGRyLCB1OCBtYWpvcl9yZXZpc2lvbiwgaW50IG1heF9jYXBzKQotewotCXUz MiByZWcsIHBvcnRfb2Zmc2V0LCBwb3J0X2NvdW50OwotCWludCBpOwotCi0JaWYgKG1ham9yX3Jl dmlzaW9uID4gMHgwMykgewotCQlkZXZfd2Fybih4aGNpLT5kZXYsICJJZ25vcmluZyB1bmtub3du IHBvcnQgc3BlZWQsIEV4dCBDYXAgJXAsIHJldiAlMDJ4XG4iLAotCQkJIGFkZHIsIG1ham9yX3Jl dmlzaW9uKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIFBvcnQgb2Zmc2V0IGFuZCBjb3VudCBpbiB0 aGUgdGhpcmQgZHdvcmQsIHNlZSBzZWN0aW9uIDcuMiAqLwotCXJlZyA9IHJlYWRsKGFkZHIgKyAy KTsKLQlwb3J0X29mZnNldCA9IFhIQ0lfRVhUX1BPUlRfT0ZGKHJlZyk7Ci0JcG9ydF9jb3VudCA9 IFhIQ0lfRVhUX1BPUlRfQ09VTlQocmVnKTsKLQotCS8qIFBvcnQgY291bnQgaW5jbHVkZXMgdGhl IGN1cnJlbnQgcG9ydCBvZmZzZXQgKi8KLQlpZiAocG9ydF9vZmZzZXQgPT0gMCB8fCAocG9ydF9v ZmZzZXQgKyBwb3J0X2NvdW50IC0gMSkgPiBudW1fcG9ydHMpCi0JCS8qIFdURj8gIlZhbGlkIHZh bHVlcyBhcmUg4oCYMeKAmSB0byBNYXhQb3J0cyIgKi8KLQkJcmV0dXJuOwotCi0JLyogY2FjaGUg dXNiMiBwb3J0IGNhcGFiaWxpdGllcyAqLwotCWlmIChtYWpvcl9yZXZpc2lvbiA8IDB4MDMgJiYg eGhjaS0+bnVtX2V4dF9jYXBzIDwgbWF4X2NhcHMpCi0JCXhoY2ktPmV4dF9jYXBzW3hoY2ktPm51 bV9leHRfY2FwcysrXSA9IHJlZzsKLQotCXBvcnRfb2Zmc2V0LS07Ci0JZm9yIChpID0gcG9ydF9v ZmZzZXQ7IGkgPCAocG9ydF9vZmZzZXQgKyBwb3J0X2NvdW50KTsgaSsrKSB7Ci0JCS8qIER1cGxp Y2F0ZSBlbnRyeS4gIElnbm9yZSB0aGUgcG9ydCBpZiB0aGUgcmV2aXNpb25zIGRpZmZlci4gKi8K LQkJaWYgKHhoY2ktPnBvcnRfYXJyYXlbaV0gIT0gMCkgewotCQkJZGV2X3dhcm4oeGhjaS0+ZGV2 LCAiRHVwbGljYXRlIHBvcnQgZW50cnksIEV4dCBDYXAgJXAsIHBvcnQgJXVcbiIsCi0JCQkJIGFk ZHIsIGkpOwotCQkJZGV2X3dhcm4oeGhjaS0+ZGV2LCAiUG9ydCB3YXMgbWFya2VkIGFzIFVTQiAl dSwgZHVwbGljYXRlZCBhcyBVU0IgJXVcbiIsCi0JCQkJIHhoY2ktPnBvcnRfYXJyYXlbaV0sIG1h am9yX3JldmlzaW9uKTsKLQkJCS8qCi0JCQkgKiBPbmx5IGFkanVzdCB0aGUgcm9vdGh1YiBwb3J0 IGNvdW50cyBpZiB3ZSBoYXZlbid0Ci0JCQkgKiBmb3VuZCBhIHNpbWlsYXIgZHVwbGljYXRlLgot CQkJICovCi0JCQlpZiAoeGhjaS0+cG9ydF9hcnJheVtpXSAhPSBtYWpvcl9yZXZpc2lvbiAmJgot CQkJICAgIHhoY2ktPnBvcnRfYXJyYXlbaV0gIT0gRFVQTElDQVRFX0VOVFJZKSB7Ci0JCQkJeGhj aS0+bnVtX3VzYl9wb3J0cy0tOwotCQkJCXhoY2ktPnBvcnRfYXJyYXlbaV0gPSBEVVBMSUNBVEVf RU5UUlk7Ci0JCQl9Ci0JCQljb250aW51ZTsKLQkJfQotCQl4aGNpLT5wb3J0X2FycmF5W2ldID0g bWFqb3JfcmV2aXNpb247Ci0JCXhoY2ktPm51bV91c2JfcG9ydHMrKzsKLQl9Ci19Ci0KLWludCB4 aGNpX2h1Yl9zZXR1cF9wb3J0cyhzdHJ1Y3QgeGhjaV9oY2QgKnhoY2kpCi17Ci0JdTMyIG9mZnNl dCwgdG1wX29mZnNldDsKLQlfX2xlMzIgX19pb21lbSAqYWRkciwgKnRtcF9hZGRyOwotCXVuc2ln bmVkIGludCBudW1fcG9ydHM7Ci0JaW50IGksIGNhcF9jb3VudCA9IDA7Ci0KLQlvZmZzZXQgPSBI Q0NfRVhUX0NBUFMoeGhjaS0+aGNjX3BhcmFtcyk7Ci0JaWYgKG9mZnNldCA9PSAwKSB7Ci0JCWRl dl9lcnIoeGhjaS0+ZGV2LCAiTm8gRXh0ZW5kZWQgQ2FwYWJpbGl0eSBSZWdpc3RlcnNcbiIpOwot CQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlhZGRyID0gJnhoY2ktPmNhcF9yZWdzLT5oY19jYXBi YXNlICsgb2Zmc2V0OwotCi0JLyogY291bnQgZXh0ZW5kZWQgcHJvdG9jb2wgY2FwYWJpbGl0eSBl bnRyaWVzIGZvciBsYXRlciBjYWNoaW5nICovCi0JdG1wX2FkZHIgPSBhZGRyOwotCXRtcF9vZmZz ZXQgPSBvZmZzZXQ7Ci0JZG8gewotCQl1MzIgY2FwX2lkID0gcmVhZGwodG1wX2FkZHIpOwotCi0J CWlmIChYSENJX0VYVF9DQVBTX0lEKGNhcF9pZCkgPT0gWEhDSV9FWFRfQ0FQU19QUk9UT0NPTCkK LQkJCWNhcF9jb3VudCsrOwotCi0JCXRtcF9vZmZzZXQgPSBYSENJX0VYVF9DQVBTX05FWFQoY2Fw X2lkKTsKLQkJdG1wX2FkZHIgKz0gdG1wX29mZnNldDsKLQl9IHdoaWxlICh0bXBfb2Zmc2V0KTsK LQotCW51bV9wb3J0cyA9IEhDU19NQVhfUE9SVFMoeGhjaS0+aGNzX3BhcmFtczEpOwotCXhoY2kt PnBvcnRfYXJyYXkgPSB4emFsbG9jKG51bV9wb3J0cyAqIHNpemVvZigqeGhjaS0+cG9ydF9hcnJh eSkpOwotCXhoY2ktPmV4dF9jYXBzID0geHphbGxvYyhjYXBfY291bnQgKiBzaXplb2YoKnhoY2kt PmV4dF9jYXBzKSk7Ci0KLQl3aGlsZSAoMSkgewotCQl1MzIgY2FwX2lkID0gcmVhZGwoYWRkcik7 Ci0KLQkJaWYgKFhIQ0lfRVhUX0NBUFNfSUQoY2FwX2lkKSA9PSBYSENJX0VYVF9DQVBTX1BST1RP Q09MKQotCQkJeGhjaV9hZGRfaW5fcG9ydCh4aGNpLCBudW1fcG9ydHMsIGFkZHIsCi0JCQkJCSAo dTgpWEhDSV9FWFRfUE9SVF9NQUpPUihjYXBfaWQpLAotCQkJCQkgY2FwX2NvdW50KTsKLQkJb2Zm c2V0ID0gWEhDSV9FWFRfQ0FQU19ORVhUKGNhcF9pZCk7Ci0JCWlmICghb2Zmc2V0IHx8IHhoY2kt Pm51bV91c2JfcG9ydHMgPT0gbnVtX3BvcnRzKQotICAgICAgICAgICAgICAgICAgICAgICAgYnJl YWs7Ci0JCWFkZHIgKz0gb2Zmc2V0OwotCX0KLQotCWlmICh4aGNpLT5udW1fdXNiX3BvcnRzID09 IDApIHsKLQkJZGV2X2Vycih4aGNpLT5kZXYsICJObyBwb3J0cyBvbiB0aGUgcm9vdGh1YnM/XG4i KTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JeGhjaS0+dXNiX3BvcnRzID0geHphbGxvYyhu dW1fcG9ydHMgKiBzaXplb2YoKnhoY2ktPnVzYl9wb3J0cykpOwotCWZvciAoaSA9IDA7IGkgPCBu dW1fcG9ydHM7IGkrKykKLQkJeGhjaS0+dXNiX3BvcnRzW2ldID0gJnhoY2ktPm9wX3JlZ3MtPnBv cnRfc3RhdHVzX2Jhc2UgKwotCQkJTlVNX1BPUlRfUkVHUyAqIGk7Ci0JbWVtY3B5KCZ4aGNpLT51 c2JfaW5mbywgJnVzYl9yaF9pbmZvLCBzaXplb2YodXNiX3JoX2luZm8pKTsKLQl4aGNpX3NldHVw X3VzYjJfaHViX2Rlc2NyaXB0b3IoeGhjaSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIFRo ZXNlIGJpdHMgYXJlIFJlYWQgT25seSAoUk8pIGFuZCBzaG91bGQgYmUgc2F2ZWQgYW5kIHdyaXR0 ZW4gdG8gdGhlCi0gKiByZWdpc3RlcnM6IDAsIDMsIDEwOjEzLCAzMAotICogY29ubmVjdCBzdGF0 dXMsIG92ZXItY3VycmVudCBzdGF0dXMsIHBvcnQgc3BlZWQsIGFuZCBkZXZpY2UgcmVtb3ZhYmxl LgotICogY29ubmVjdCBzdGF0dXMgYW5kIHBvcnQgc3BlZWQgYXJlIGFsc28gc3RpY2t5IC0gbWVh bmluZyB0aGV5J3JlIGluCi0gKiB0aGUgQVVYIHdlbGwgYW5kIHRoZXkgYXJlbid0IGNoYW5nZWQg YnkgYSBob3QsIHdhcm0sIG9yIGNvbGQgcmVzZXQuCi0gKi8KLSNkZWZpbmUgWEhDSV9QT1JUX1JP CShQT1JUX0NPTk5FQ1QgfCBQT1JUX09DIHwgREVWX1NQRUVEX01BU0sgfCBcCi0JCQkgUE9SVF9E RVZfUkVNT1ZFKQotLyoKLSAqIFRoZXNlIGJpdHMgYXJlIFJXOyB3cml0aW5nIGEgMCBjbGVhcnMg dGhlIGJpdCwgd3JpdGluZyBhIDEgc2V0cyB0aGUgYml0OgotICogYml0cyA1OjgsIDksIDE0OjE1 LCAyNToyNwotICogbGluayBzdGF0ZSwgcG9ydCBwb3dlciwgcG9ydCBpbmRpY2F0b3Igc3RhdGUs ICJ3YWtlIG9uIiBlbmFibGUgc3RhdGUKLSAqLwotI2RlZmluZSBYSENJX1BPUlRfUldTCShQT1JU X1BMU19NQVNLIHwgUE9SVF9QT1dFUiB8IFBPUlRfTEVEX01BU0sgfCBcCi0JCQkgUE9SVF9XS0NP Tk5fRSB8IFBPUlRfV0tESVNDX0UgfCBQT1JUX1dLT0NfRSkKLS8qCi0gKiBUaGVzZSBiaXRzIGFy ZSBSVzsgd3JpdGluZyBhIDEgc2V0cyB0aGUgYml0LCB3cml0aW5nIGEgMCBoYXMgbm8gZWZmZWN0 OgotICogYml0IDQgKHBvcnQgcmVzZXQpCi0gKi8KLSNkZWZpbmUgWEhDSV9QT1JUX1JXMVMJKFBP UlRfUkVTRVQpCi0vKgotICogVGhlc2UgYml0cyBhcmUgUlc7IHdyaXRpbmcgYSAxIGNsZWFycyB0 aGUgYml0LCB3cml0aW5nIGEgMCBoYXMgbm8gZWZmZWN0OgotICogYml0cyAxLCAxNywgMTgsIDE5 LCAyMCwgMjEsIDIyLCAyMwotICogcG9ydCBlbmFibGUvZGlzYWJsZSwgYW5kCi0gKiBjaGFuZ2Ug Yml0czogY29ubmVjdCwgUEVELCB3YXJtIHBvcnQgcmVzZXQgY2hhbmdlZCAocmVzZXJ2ZWQgMCBm b3IgVVNCIDIuMCksCi0gKiBvdmVyLWN1cnJlbnQsIHJlc2V0LCBsaW5rIHN0YXRlLCBhbmQgTDEg Y2hhbmdlCi0gKi8KLSNkZWZpbmUgWEhDSV9QT1JUX1JXMUNTCShQT1JUX1BFIHwgUE9SVF9DU0Mg fCBQT1JUX1BFQyB8IFBPUlRfV1JDIHwgXAotCQkJIFBPUlRfT0NDIHwgUE9SVF9SQyB8IFBPUlRf UExDIHwgUE9SVF9DRUMpCi0vKgotICogQml0IDE2IGlzIFJXLCBhbmQgd3JpdGluZyBhICcxJyB0 byBpdCBjYXVzZXMgdGhlIGxpbmsgc3RhdGUgY29udHJvbCB0byBiZQotICogbGF0Y2hlZCBpbgot ICovCi0jZGVmaW5lIFhIQ0lfUE9SVF9SVwkoUE9SVF9MSU5LX1NUUk9CRSkKLS8qCi0gKiBUaGVz ZSBiaXRzIGFyZSBSZXNlcnZlZCBaZXJvIChSc3ZkWikgYW5kIHplcm8gc2hvdWxkIGJlIHdyaXR0 ZW4gdG8gdGhlbToKLSAqIGJpdHMgMiwgMjQsIDI4OjMxCi0gKi8KLSNkZWZpbmUgWEhDSV9QT1JU X1JaCShCSVQoMikgfCBCSVQoMjQpIHwgKDB4Zjw8MjgpKQotCi0vKgotICogR2l2ZW4gYSBwb3J0 IHN0YXRlLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYSB2YWx1ZSB0aGF0IHdvdWxkIHJlc3VsdCBp biB0aGUKLSAqIHBvcnQgYmVpbmcgaW4gdGhlIHNhbWUgc3RhdGUsIGlmIHRoZSB2YWx1ZSB3YXMg d3JpdHRlbiB0byB0aGUgcG9ydCBzdGF0dXMKLSAqIGNvbnRyb2wgcmVnaXN0ZXIuCi0gKiBTYXZl IFJlYWQgT25seSAoUk8pIGJpdHMgYW5kIHNhdmUgcmVhZC93cml0ZSBiaXRzIHdoZXJlCi0gKiB3 cml0aW5nIGEgMCBjbGVhcnMgdGhlIGJpdCBhbmQgd3JpdGluZyBhIDEgc2V0cyB0aGUgYml0IChS V1MpLgotICogRm9yIGFsbCBvdGhlciB0eXBlcyAoUlcxUywgUlcxQ1MsIFJXLCBhbmQgUlopLCB3 cml0aW5nIGEgJzAnIGhhcyBubyBlZmZlY3QuCi0gKi8KLXN0YXRpYyB1MzIgaW5saW5lIHhoY2lf cG9ydF9zdGF0ZV90b19uZXV0cmFsKHUzMiBzdGF0ZSkKLXsKLQkvKiBTYXZlIHJlYWQtb25seSBz dGF0dXMgYW5kIHBvcnQgc3RhdGUgKi8KLSAgICAgICAgcmV0dXJuIChzdGF0ZSAmIFhIQ0lfUE9S VF9STykgfCAoc3RhdGUgJiBYSENJX1BPUlRfUldTKTsKLX0KLQotc3RhdGljIGludCB4aGNpX2h1 Yl9maW5pc2hfcG9ydF9kZXRhY2goc3RydWN0IHhoY2lfaGNkICp4aGNpLCBpbnQgcG9ydCkKLXsK LQlzdHJ1Y3QgeGhjaV92aXJ0dWFsX2RldmljZSAqdmRldiwgKnRlbXA7Ci0JdW5pb24geGhjaV90 cmIgdHJiOwotCWludCByZXQ7Ci0KLQlyZXQgPSB4aGNpX3dhaXRfZm9yX2V2ZW50KHhoY2ksIFRS Ql9QT1JUX1NUQVRVUywgJnRyYik7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCS8qIFRl YXItZG93biBhbnkgYXR0YWNoZWQgdmlydHVhbCBkZXZpY2VzICovCi0JbGlzdF9mb3JfZWFjaF9l bnRyeV9zYWZlKHZkZXYsIHRlbXAsICZ4aGNpLT52ZGV2X2xpc3QsIGxpc3QpCi0JCWlmICh2ZGV2 LT51ZGV2ICYmIHZkZXYtPnVkZXYtPnBvcnRuciA9PSBwb3J0KQotCQkJeGhjaV92aXJ0ZGV2X2Rl dGFjaCh2ZGV2KTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHhoY2lfaHViX2Zpbmlz aF9wb3J0X3Jlc2V0KHN0cnVjdCB4aGNpX2hjZCAqeGhjaSwgaW50IHBvcnQpCi17Ci0Jc3RydWN0 IHhoY2lfdmlydHVhbF9kZXZpY2UgKnZkZXY7Ci0JdW5pb24geGhjaV90cmIgdHJiOwotCWludCBy ZXQ7Ci0KLQlyZXQgPSB4aGNpX3dhaXRfZm9yX2V2ZW50KHhoY2ksIFRSQl9QT1JUX1NUQVRVUywg JnRyYik7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCS8qIFJlc2V0IGFueSBhdHRhY2hl ZCB2aXJ0dWFsIGRldmljZXMgKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHZkZXYsICZ4aGNpLT52 ZGV2X2xpc3QsIGxpc3QpCi0JCWlmICh2ZGV2LT51ZGV2ICYmIHZkZXYtPnVkZXYtPnBvcnRuciA9 PSBwb3J0KQotCQkJeGhjaV92aXJ0ZGV2X3Jlc2V0KHZkZXYpOwotCi0JcmV0dXJuIDA7Ci19Ci0K LXZvaWQgeGhjaV9odWJfcG9ydF9wb3dlcihzdHJ1Y3QgeGhjaV9oY2QgKnhoY2ksIGludCBwb3J0 LAotCQkJIGJvb2wgZW5hYmxlKQotewotCXUzMiByZWcgPSByZWFkbCh4aGNpLT51c2JfcG9ydHNb cG9ydF0pOwotCi0JcmVnID0geGhjaV9wb3J0X3N0YXRlX3RvX25ldXRyYWwocmVnKTsKLQlpZiAo ZW5hYmxlKQotCQlyZWcgfD0gUE9SVF9QT1dFUjsKLQllbHNlCi0JCXJlZyAmPSB+UE9SVF9QT1dF UjsKLQl3cml0ZWwocmVnLCB4aGNpLT51c2JfcG9ydHNbcG9ydF0pOwotfQotCi1zdGF0aWMgX19t YXliZV91bnVzZWQgaW50IHhoY2lfaHViX3BvcnRfd2FybV9yZXNldChzdHJ1Y3QgeGhjaV9oY2Qg KnhoY2ksIGludCBwb3J0KQotewotCXZvaWQgX19pb21lbSAqcG9ydHNjID0geGhjaS0+dXNiX3Bv cnRzW3BvcnRdOwotCXUzMiByZWc7Ci0KLQlyZWcgPSB4aGNpX3BvcnRfc3RhdGVfdG9fbmV1dHJh bChyZWFkbChwb3J0c2MpKTsKLQl3cml0ZWwocmVnIHwgUE9SVF9XUiwgcG9ydHNjKTsKLQlyZXR1 cm4geGhjaV9oYW5kc2hha2UocG9ydHNjLCBQT1JUX1JFU0VULCAwLCAxMCAqIFNFQ09ORC9VU0VD T05EKTsKLX0KLQotaW50IHhoY2lfaHViX2NvbnRyb2woc3RydWN0IHVzYl9kZXZpY2UgKmRldiwg dW5zaWduZWQgbG9uZyBwaXBlLAotCQkgICAgIHZvaWQgKmJ1ZmZlciwgaW50IGxlbmd0aCwgc3Ry dWN0IGRldnJlcXVlc3QgKnJlcSkKLXsKLQlzdHJ1Y3QgdXNiX2hvc3QgKmhvc3QgPSBkZXYtPmhv c3Q7Ci0Jc3RydWN0IHhoY2lfaGNkICp4aGNpID0gdG9feGhjaV9oY2QoaG9zdCk7Ci0Jc3RydWN0 IHVzYl9yb290X2h1Yl9pbmZvICppbmZvOwotCV9fbGUzMiBfX2lvbWVtICoqcG9ydF9hcnJheTsK LQlpbnQgbWF4X3BvcnRzOwotCXZvaWQgKnNyY3B0ciA9IE5VTEw7Ci0JdTggdG1wYnVmWzRdOwot CXUxNiB0eXBlUmVxOwotCWludCBsZW4sIHBvcnQsIHNyY2xlbiA9IDA7Ci0JdTMyIHJlZzsKLQot CWRldl9kYmcoeGhjaS0+ZGV2LCAiJXMgcmVxICV1ICglI3gpLCB0eXBlICV1ICglI3gpLCB2YWx1 ZSAldSAoJSN4KSwgaW5kZXggJXUgKCUjeCksIGxlbmd0aCAldSAoJSN4KVxuIiwKLQkJX19mdW5j X18sIHJlcS0+cmVxdWVzdCwgcmVxLT5yZXF1ZXN0LAotCQlyZXEtPnJlcXVlc3R0eXBlLCByZXEt PnJlcXVlc3R0eXBlLAotCQlsZTE2X3RvX2NwdShyZXEtPnZhbHVlKSwgbGUxNl90b19jcHUocmVx LT52YWx1ZSksCi0JCWxlMTZfdG9fY3B1KHJlcS0+aW5kZXgpLCBsZTE2X3RvX2NwdShyZXEtPmlu ZGV4KSwKLQkJbGUxNl90b19jcHUocmVxLT5sZW5ndGgpLCBsZTE2X3RvX2NwdShyZXEtPmxlbmd0 aCkpOwotCi0JaW5mbyA9ICZ4aGNpLT51c2JfaW5mbzsKLQlwb3J0X2FycmF5ID0geGhjaS0+dXNi X3BvcnRzOwotCW1heF9wb3J0cyA9IHhoY2ktPm51bV91c2JfcG9ydHM7Ci0KLQl0eXBlUmVxID0g KHJlcS0+cmVxdWVzdHR5cGUgPDwgOCkgfCByZXEtPnJlcXVlc3Q7Ci0Jc3dpdGNoICh0eXBlUmVx KSB7Ci0JY2FzZSBEZXZpY2VSZXF1ZXN0IHwgVVNCX1JFUV9HRVRfREVTQ1JJUFRPUjoKLQkJZGV2 X2RiZyh4aGNpLT5kZXYsICJHZXREZXZpY2VEZXNjcmlwdG9yICV1XG4iLAotCQkJbGUxNl90b19j cHUocmVxLT52YWx1ZSkgPj4gOCk7Ci0KLQkJc3dpdGNoIChsZTE2X3RvX2NwdShyZXEtPnZhbHVl KSA+PiA4KSB7Ci0JCWNhc2UgVVNCX0RUX0RFVklDRToKLQkJCXNyY3B0ciA9ICZpbmZvLT5kZXZp Y2U7Ci0JCQlzcmNsZW4gPSBpbmZvLT5kZXZpY2UuYkxlbmd0aDsKLQkJCWJyZWFrOwotCQljYXNl IFVTQl9EVF9DT05GSUc6Ci0JCQlzcmNwdHIgPSAmaW5mby0+Y29uZmlnOwotCQkJc3JjbGVuID0g bGUxNl90b19jcHUoaW5mby0+Y29uZmlnLndUb3RhbExlbmd0aCk7Ci0JCQlicmVhazsKLQkJY2Fz ZSBVU0JfRFRfU1RSSU5HOgotCQkJc3dpdGNoIChsZTE2X3RvX2NwdShyZXEtPnZhbHVlKSAmIDB4 ZmYpIHsKLQkJCWNhc2UgMDoJLyogTGFuZ3VhZ2UgKi8KLQkJCQlzcmNwdHIgPSAiXDRcM1wxXDAi OwotCQkJCXNyY2xlbiA9IDQ7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDE6CS8qIFZlbmRvcjogImJh cmVib3giICovCi0JCQkJc3JjcHRyID0gIlwyMFwzYlwwYVwwclwwZVwwYlwwb1wweFwwIjsKLQkJ CQlzcmNsZW4gPSAxNjsKLQkJCQlicmVhazsKLQkJCWNhc2UgMjoJLyogUHJvZHVjdDogIlVTQiAz LjAgUm9vdCBIdWIiICovCi0JCQkJc3JjcHRyID0gIlw0MlwzVVwwU1wwQlwwIFwwXDYzXDAuXDBc NjBcMCBcMFJcMG9cMG9cMHRcMCBcMEhcMHVcMGIiOwotCQkJCXNyY2xlbiA9IDM0OwotCQkJCWJy ZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlkZXZfd2Fybih4aGNpLT5kZXYsICJ1bmtub3duIHN0cmlu ZyBkZXNjcmlwdG9yICV4XG4iLAotCQkJCQkgbGUxNl90b19jcHUocmVxLT52YWx1ZSkgPj4gOCk7 Ci0JCQkJZ290byB1bmtub3duOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQkJYnJlYWs7Ci0JY2Fz ZSBEZXZpY2VPdXRSZXF1ZXN0IHwgVVNCX1JFUV9TRVRfQ09ORklHVVJBVElPTjoKLQkJZGV2X2Ri Zyh4aGNpLT5kZXYsICJTZXREZXZpY2VDb25maWd1cmF0aW9uXG4iKTsKLQkJLyogTm90aGluZyB0 byBkbyAqLwotCQlicmVhazsKLQljYXNlIERldmljZU91dFJlcXVlc3QgfCBVU0JfUkVRX1NFVF9B RERSRVNTOgotCQlkZXZfZGJnKHhoY2ktPmRldiwgIlNldERldmljZUFkZHJlc3MgJXVcbiIsCi0J CQlsZTE2X3RvX2NwdShyZXEtPnZhbHVlKSk7Ci0KLQkJeGhjaS0+cm9vdGRldiA9IGxlMTZfdG9f Y3B1KHJlcS0+dmFsdWUpOwotCQlicmVhazsKLQljYXNlIEdldEh1YkRlc2NyaXB0b3I6Ci0JCWRl dl9kYmcoeGhjaS0+ZGV2LCAiR2V0SHViRGVzY3JpcHRvciAldVxuIiwKLQkJCWxlMTZfdG9fY3B1 KHJlcS0+dmFsdWUpID4+IDgpOwotCi0JCXN3aXRjaCAobGUxNl90b19jcHUocmVxLT52YWx1ZSkg Pj4gOCkgewotCQljYXNlIFVTQl9EVF9IVUI6Ci0JCQlzcmNwdHIgPSAmaW5mby0+aHViOwotCQkJ c3JjbGVuID0gaW5mby0+aHViLmJMZW5ndGg7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWRl dl93YXJuKHhoY2ktPmRldiwgInVua25vd24gZGVzY3JpcHRvciAleFxuIiwKLQkJCQkgbGUxNl90 b19jcHUocmVxLT52YWx1ZSkgPj4gOCk7Ci0JCQlnb3RvIHVua25vd247Ci0JCX0KLQkJYnJlYWs7 Ci0JY2FzZSBHZXRIdWJTdGF0dXM6Ci0JCWRldl9kYmcoeGhjaS0+ZGV2LCAiR2V0SHViU3RhdHVz XG4iKTsKLQotCQkvKiBObyBwb3dlciBzb3VyY2UsIG92ZXItY3VycmVudCByZXBvcnRlZCBwZXIg cG9ydCAqLwotCQl0bXBidWZbMF0gPSAweDAwOwotCQl0bXBidWZbMV0gPSAweDAwOwotCQlzcmNw dHIgPSB0bXBidWY7Ci0JCXNyY2xlbiA9IDI7Ci0JCWJyZWFrOwotCWNhc2UgR2V0UG9ydFN0YXR1 czoKLQkJZGV2X2RiZyh4aGNpLT5kZXYsICJHZXRQb3J0U3RhdHVzICV1XG4iLAotCQkJbGUxNl90 b19jcHUocmVxLT5pbmRleCkpOwotCi0JCW1lbXNldCh0bXBidWYsIDAsIDQpOwotCi0JCXBvcnQg PSBsZTE2X3RvX2NwdShyZXEtPmluZGV4KTsKLQkJaWYgKCFwb3J0IHx8IHBvcnQgPiBtYXhfcG9y dHMpCi0JCQlnb3RvIHVua25vd247Ci0JCXBvcnQtLTsKLQotCQkvKiByZWFkIFBPUlRTQyByZWdp c3RlciAqLwotCQlyZWcgPSByZWFkbChwb3J0X2FycmF5W3BvcnRdKTsKLQotCQlpZiAocmVnICYg UE9SVF9DT05ORUNUKSB7Ci0JCQl0bXBidWZbMF0gfD0gVVNCX1BPUlRfU1RBVF9DT05ORUNUSU9O OwotCQkJaWYgKERFVl9MT1dTUEVFRChyZWcpKQotCQkJCXRtcGJ1ZlsxXSB8PSBVU0JfUE9SVF9T VEFUX0xPV19TUEVFRCA+PiA4OwotCQkJZWxzZSBpZiAoREVWX0hJR0hTUEVFRChyZWcpKQotCQkJ CXRtcGJ1ZlsxXSB8PSBVU0JfUE9SVF9TVEFUX0hJR0hfU1BFRUQgPj4gODsKLQkJfQotCQlpZiAo cmVnICYgUE9SVF9QRSkKLQkJCXRtcGJ1ZlswXSB8PSBVU0JfUE9SVF9TVEFUX0VOQUJMRTsKLQkJ aWYgKHJlZyAmIFBPUlRfT0MpCi0JCQl0bXBidWZbMF0gfD0gVVNCX1BPUlRfU1RBVF9PVkVSQ1VS UkVOVDsKLQkJaWYgKHJlZyAmIFBPUlRfUkVTRVQpCi0JCQl0bXBidWZbMF0gfD0gVVNCX1BPUlRf U1RBVF9SRVNFVDsKLQkJLyogVVNCIDIuMCBvbmx5ICovCi0JCWlmICgocmVnICYgUE9SVF9QTFNf TUFTSykgPT0gWERFVl9VMyAmJiByZWcgJiBQT1JUX1BPV0VSKQotICAgICAgICAgICAgICAgICAg ICAgICAgdG1wYnVmWzBdIHw9IFVTQl9QT1JUX1NUQVRfU1VTUEVORDsKLQkJLyogVVNCIDIuMCBv bmx5ICovCi0JCWlmIChyZWcgJiBQT1JUX1BPV0VSKQotCQkJdG1wYnVmWzFdIHw9IFVTQl9QT1JU X1NUQVRfUE9XRVIgPj4gODsKLQkJaWYgKHJlZyAmIFBPUlRfQ1NDKQotCQkJdG1wYnVmWzJdIHw9 IFVTQl9QT1JUX1NUQVRfQ19DT05ORUNUSU9OOwotCQlpZiAocmVnICYgUE9SVF9QRUMpCi0JCQl0 bXBidWZbMl0gfD0gVVNCX1BPUlRfU1RBVF9DX0VOQUJMRTsKLQkJaWYgKHJlZyAmIFBPUlRfT0ND KQotCQkJdG1wYnVmWzJdIHw9IFVTQl9QT1JUX1NUQVRfQ19PVkVSQ1VSUkVOVDsKLQkJaWYgKHJl ZyAmIFBPUlRfUkMpCi0JCQl0bXBidWZbMl0gfD0gVVNCX1BPUlRfU1RBVF9DX1JFU0VUOwotCQlz cmNwdHIgPSB0bXBidWY7Ci0JCXNyY2xlbiA9IDQ7Ci0JCWJyZWFrOwotCWNhc2UgQ2xlYXJQb3J0 RmVhdHVyZToKLQkJZGV2X2RiZyh4aGNpLT5kZXYsICJDbGVhclBvcnRGZWF0dXJlICV1ICV1XG4i LAotCQkJbGUxNl90b19jcHUocmVxLT5pbmRleCksIGxlMTZfdG9fY3B1KHJlcS0+dmFsdWUpKTsK LQotCQlwb3J0ID0gbGUxNl90b19jcHUocmVxLT5pbmRleCk7Ci0JCWlmICghcG9ydCB8fCBwb3J0 ID4gbWF4X3BvcnRzKQotCQkJZ290byB1bmtub3duOwotCQlwb3J0LS07Ci0KLQkJcmVnID0geGhj aV9wb3J0X3N0YXRlX3RvX25ldXRyYWwocmVhZGwocG9ydF9hcnJheVtwb3J0XSkpOwotCi0JCXN3 aXRjaCAobGUxNl90b19jcHUocmVxLT52YWx1ZSkpIHsKLQkJY2FzZSBVU0JfUE9SVF9GRUFUX0VO QUJMRToKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlZyAmPSB+UE9SVF9QRTsKLQkJCWJyZWFr OwotCQljYXNlIFVTQl9QT1JUX0ZFQVRfUE9XRVI6Ci0gICAgICAgICAgICAgICAgICAgICAgICBy ZWcgJj0gflBPUlRfUE9XRVI7Ci0JCQlicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFVTQl9Q T1JUX0ZFQVRfQ19DT05ORUNUSU9OOgotCQkJcmVnIHw9IFBPUlRfQ1NDOwotCQkJYnJlYWs7Ci0g ICAgICAgICAgICAgICAgY2FzZSBVU0JfUE9SVF9GRUFUX0NfRU5BQkxFOgotCQkJcmVnIHw9IFBP UlRfUEVDOwotCQkJYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBVU0JfUE9SVF9GRUFUX0Nf T1ZFUl9DVVJSRU5UOgotCQkJcmVnIHw9IFBPUlRfT0NDOwotCQkJYnJlYWs7Ci0gICAgICAgICAg ICAgICAgY2FzZSBVU0JfUE9SVF9GRUFUX0NfUkVTRVQ6Ci0JCQlyZWcgfD0gUE9SVF9SQzsKLQkJ CWJyZWFrOwotCQlkZWZhdWx0OgotCQkJZGV2X3dhcm4oeGhjaS0+ZGV2LCAidW5rbm93biBmZWF0 dXJlICV1XG4iLAotCQkJCSBsZTE2X3RvX2NwdShyZXEtPnZhbHVlKSk7Ci0JCQlnb3RvIHVua25v d247Ci0JCX0KLQkJd3JpdGVsKHJlZywgcG9ydF9hcnJheVtwb3J0XSk7Ci0JCXJlYWRsKHBvcnRf YXJyYXlbcG9ydF0pOwotCi0JCWlmICgocmVnICYgUE9SVF9DT05ORUNUKSA9PSAwICYmCi0JCSAg ICBsZTE2X3RvX2NwdShyZXEtPnZhbHVlKSA9PSBVU0JfUE9SVF9GRUFUX0NfQ09OTkVDVElPTikK LQkJCXhoY2lfaHViX2ZpbmlzaF9wb3J0X2RldGFjaCh4aGNpLCBwb3J0ICsgMSk7Ci0KLQkJYnJl YWs7Ci0JY2FzZSBTZXRQb3J0RmVhdHVyZToKLQkJZGV2X2RiZyh4aGNpLT5kZXYsICJTZXRQb3J0 RmVhdHVyZSAldSAldVxuIiwKLQkJCWxlMTZfdG9fY3B1KHJlcS0+aW5kZXgpLCBsZTE2X3RvX2Nw dShyZXEtPnZhbHVlKSk7Ci0KLQkJcG9ydCA9IGxlMTZfdG9fY3B1KHJlcS0+aW5kZXgpOwotCQlp ZiAoIXBvcnQgfHwgcG9ydCA+IG1heF9wb3J0cykKLQkJCWdvdG8gdW5rbm93bjsKLQkJcG9ydC0t OwotCi0JCXJlZyA9IHhoY2lfcG9ydF9zdGF0ZV90b19uZXV0cmFsKHJlYWRsKHBvcnRfYXJyYXlb cG9ydF0pKTsKLQotCQlzd2l0Y2ggKGxlMTZfdG9fY3B1KHJlcS0+dmFsdWUpKSB7Ci0JCWNhc2Ug VVNCX1BPUlRfRkVBVF9QT1dFUjoKLQkJCXJlZyB8PSBQT1JUX1BPV0VSOwotCQkJYnJlYWs7Ci0J CWNhc2UgVVNCX1BPUlRfRkVBVF9SRVNFVDoKLQkJCXJlZyB8PSBQT1JUX1JFU0VUOwotCQkJYnJl YWs7Ci0JCWRlZmF1bHQ6Ci0JCQlkZXZfd2Fybih4aGNpLT5kZXYsICJ1bmtub3duIGZlYXR1cmUg JXVcbiIsCi0JCQkJIGxlMTZfdG9fY3B1KHJlcS0+dmFsdWUpKTsKLQkJCWdvdG8gdW5rbm93bjsK LQkJfQotCQl3cml0ZWwocmVnLCBwb3J0X2FycmF5W3BvcnRdKTsKLQkJcmVhZGwocG9ydF9hcnJh eVtwb3J0XSk7Ci0KLQkJaWYgKGxlMTZfdG9fY3B1KHJlcS0+dmFsdWUpID09IFVTQl9QT1JUX0ZF QVRfUkVTRVQpCi0JCQl4aGNpX2h1Yl9maW5pc2hfcG9ydF9yZXNldCh4aGNpLCBwb3J0ICsgMSk7 Ci0KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZGV2X3dhcm4oeGhjaS0+ZGV2LCAidW5rbm93biBy b290IGh1YiByZXF1ZXN0ICV1ICglI3gpIHR5cGUgJXUgKCUjeClcbiIsCi0JCQkgcmVxLT5yZXF1 ZXN0LCByZXEtPnJlcXVlc3QsCi0JCQkgcmVxLT5yZXF1ZXN0dHlwZSwgcmVxLT5yZXF1ZXN0dHlw ZSk7Ci0JCWdvdG8gdW5rbm93bjsKLQl9Ci0KLQlsZW4gPSBtaW4zKHNyY2xlbiwgKGludClsZTE2 X3RvX2NwdShyZXEtPmxlbmd0aCksIGxlbmd0aCk7Ci0JaWYgKHNyY3B0ciAmJiBsZW4pCi0JCW1l bWNweShidWZmZXIsIHNyY3B0ciwgbGVuKTsKLQlkZXYtPmFjdF9sZW4gPSBsZW47Ci0JZGV2LT5z dGF0dXMgPSAwOwotCi0JcmV0dXJuIDA7Ci0KLXVua25vd246Ci0JZGV2LT5hY3RfbGVuID0gMDsK LQlkZXYtPnN0YXR1cyA9IFVTQl9TVF9TVEFMTEVEOwotCXJldHVybiAtRU5PVFNVUFA7Ci19CmRp ZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktcGNpLmMgYi9kcml2ZXJzL3VzYi9ob3N0 L3hoY2ktcGNpLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhOTMxNWEwYjYuLjAw MDAwMDAwMDAKLS0tIGEvZHJpdmVycy91c2IvaG9zdC94aGNpLXBjaS5jCisrKyAvZGV2L251bGwK QEAgLTEsNDAgKzAsMCBAQAotLyoKLSAqIFBDSSBkcml2ZXIgZm9yIHhIQ0kgY29udHJvbGxlcnMK LSAqCi0gKiBTZWJhc3RpYW4gSGVzc2VsYmFydGggPHNlYmFzdGlhbi5oZXNzZWxiYXJ0aEBnbWFp bC5jb20+Ci0gKgotICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0 aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIHZlcnNpb24gMi4gIFRoaXMgcHJvZ3Jh bSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55Ci0gKiB3YXJyYW50eSBvZiBhbnkga2lu ZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKi8KLQotI2luY2x1ZGUgPGNvbW1vbi5o PgotI2luY2x1ZGUgPGluaXQuaD4KLSNpbmNsdWRlIDxpby5oPgotI2luY2x1ZGUgPGxpbnV4L3Bj aS5oPgotI2luY2x1ZGUgPHVzYi94aGNpLmg+Ci0KLXN0YXRpYyBpbnQgeGhjaV9wY2lfcHJvYmUo c3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKLXsK LQlzdHJ1Y3QgeGhjaV9kYXRhIGRhdGEgPSB7fTsKLQotCXBjaV9lbmFibGVfZGV2aWNlKHBkZXYp OwotCXBjaV9zZXRfbWFzdGVyKHBkZXYpOwotCi0JZGF0YS5yZWdzID0gcGNpX2lvbWFwKHBkZXYs IDApOwotCi0JcmV0dXJuIHhoY2lfcmVnaXN0ZXIoJnBkZXYtPmRldiwgJmRhdGEpOwotfQotCi1z dGF0aWMgREVGSU5FX1BDSV9ERVZJQ0VfVEFCTEUoeGhjaV9wY2lfdGJsKSA9IHsKLQkvKiBoYW5k bGUgYW55IFVTQiAzLjAgeEhDSSBjb250cm9sbGVyICovCi0JeyBQQ0lfREVWSUNFX0NMQVNTKFBD SV9DTEFTU19TRVJJQUxfVVNCX1hIQ0ksIH4wKSwgfSwKLQl7IH0sCi19OwotCi1zdGF0aWMgc3Ry dWN0IHBjaV9kcml2ZXIgeGhjaV9wY2lfZHJpdmVyID0gewotCS5uYW1lID0gInhIQ0kgUENJIiwK LQkuaWRfdGFibGUgPSB4aGNpX3BjaV90YmwsCi0JLnByb2JlID0geGhjaV9wY2lfcHJvYmUsCi19 OwotZGV2aWNlX3BjaV9kcml2ZXIoeGhjaV9wY2lfZHJpdmVyKTsKZGlmZiAtLWdpdCBhL2RyaXZl cnMvdXNiL2hvc3QveGhjaS5oIGIvZHJpdmVycy91c2IvaG9zdC94aGNpLmgKZGVsZXRlZCBmaWxl IG1vZGUgMTAwNjQ0CmluZGV4IDg0YTE0ZGQxZmMuLjAwMDAwMDAwMDAKLS0tIGEvZHJpdmVycy91 c2IvaG9zdC94aGNpLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjgyICswLDAgQEAKLS8qCi0gKiB4 SENJIFVTQiAzLjAgU3BlY2lmaWNhdGlvbgotICoKLSAqIFNlYmFzdGlhbiBIZXNzZWxiYXJ0aCA8 c2ViYXN0aWFuLmhlc3NlbGJhcnRoQGdtYWlsLmNvbT4KLSAqCi0gKiBTb21lIGNvZGUgYm9ycm93 ZWQgZnJvbSB0aGUgTGludXggeEhDSSBkcml2ZXIKLSAqICAgQXV0aG9yOiBTYXJhaCBTaGFycAot ICogICBDb3B5cmlnaHQgKEMpIDIwMDggSW50ZWwgQ29ycC4KLSAqCi0gKiBUaGlzIHByb2dyYW0g aXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQot ICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2 ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9u LgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0 IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2 ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCi0gKiBvciBGSVRORVNT IEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExp Y2Vuc2UKLSAqIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2Vp dmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdp dGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5k YXRpb24sCi0gKiBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4K LSAqLwotCi0jaWZuZGVmIF9fWEhDSV9ICi0jZGVmaW5lIF9fWEhDSV9ICi0KLSNpbmNsdWRlIDxp by02NC1ub25hdG9taWMtbG8taGkuaD4KLQotI2RlZmluZSBOVU1fQ09NTUFORF9UUkJTCTgKLSNk ZWZpbmUgTlVNX1RSQU5TRkVSX1RSQlMJOAotI2RlZmluZSBOVU1fRVZFTlRfU0VHTQkJMQkvKiBv bmx5IG9uZSBzdXBwb3J0ZWQgKi8KLSNkZWZpbmUgTlVNX0VWRU5UX1RSQlMJCTE2CS8qIG1pbmlt dW0gMTYgVFJCUyAqLwotI2RlZmluZSBNSU5fRVBfUklOR1MJCTMJLyogQ29udHJvbCArIEJ1bGsg SW4vT3V0ICovCi0jZGVmaW5lIE1BWF9FUF9SSU5HUwkJKE1JTl9FUF9SSU5HUyAqIFVTQl9NQVhD SElMRFJFTikKLQotLyogVXAgdG8gMTYgbXMgdG8gaGFsdCBhbiBIQyAqLwotI2RlZmluZSBYSENJ X01BWF9IQUxUX1VTRUMJKDE2ICogMTAwMCkKLQotLyogQ29tbWFuZCBhbmQgU3RhdHVzIHJlZ2lz dGVycyBvZmZzZXQgZnJvbSB0aGUgT3BlcmF0aW9uYWwgUmVnaXN0ZXJzIGFkZHJlc3MgKi8KLSNk ZWZpbmUgWEhDSV9DTURfT0ZGU0VUCQkweDAwCi0jZGVmaW5lIFhIQ0lfU1RTX09GRlNFVAkJMHgw NAotLyogSENDUEFSQU1TIG9mZnNldCBmcm9tIFBDSSBiYXNlIGFkZHJlc3MgKi8KLSNkZWZpbmUg WEhDSV9IQ0NfUEFSQU1TX09GRlNFVAkweDEwCi0vKiB4SENJIFBDSSBDb25maWd1cmF0aW9uIFJl Z2lzdGVycyAqLwotI2RlZmluZSBYSENJX1NCUk5fT0ZGU0VUCTB4NjAKLQotLyogTWF4IG51bWJl ciBvZiBVU0IgZGV2aWNlcyBmb3IgYW55IGhvc3QgY29udHJvbGxlciAtIGxpbWl0IGluIHNlY3Rp b24gNi4xICovCi0jZGVmaW5lIE1BWF9IQ19TTE9UUwkJMjU2Ci0vKiBTZWN0aW9uIDUuMy4zIC0g TWF4UG9ydHMgKi8KLSNkZWZpbmUgTUFYX0hDX1BPUlRTCQkxMjcKLQotLyoKLSAqIHhIQ0kgcmVn aXN0ZXIgaW50ZXJmYWNlLgotICogVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgZVh0ZW5zaWJsZSBI b3N0IENvbnRyb2xsZXIgSW50ZXJmYWNlICh4SENJKQotICogUmV2aXNpb24gMC45NSBzcGVjaWZp Y2F0aW9uCi0gKi8KLQotLyoqCi0gKiBzdHJ1Y3QgeGhjaV9jYXBfcmVncyAtIHhIQ0kgSG9zdCBD b250cm9sbGVyIENhcGFiaWxpdHkgUmVnaXN0ZXJzLgotICogQGhjX2NhcGJhc2U6CQlsZW5ndGgg b2YgdGhlIGNhcGFiaWxpdGllcyByZWdpc3RlciBhbmQgSEMgdmVyc2lvbiBudW1iZXIKLSAqIEBo Y3NfcGFyYW1zMToJSENTUEFSQU1TMSAtIFN0cnVjdHVyYWwgUGFyYW1ldGVycyAxCi0gKiBAaGNz X3BhcmFtczI6CUhDU1BBUkFNUzIgLSBTdHJ1Y3R1cmFsIFBhcmFtZXRlcnMgMgotICogQGhjc19w YXJhbXMzOglIQ1NQQVJBTVMzIC0gU3RydWN0dXJhbCBQYXJhbWV0ZXJzIDMKLSAqIEBoY2NfcGFy YW1zOgkJSENDUEFSQU1TIC0gQ2FwYWJpbGl0eSBQYXJhbWV0ZXJzCi0gKiBAZGJfb2ZmOgkJREJP RkYgLSBEb29yYmVsbCBhcnJheSBvZmZzZXQKLSAqIEBydW5fcmVnc19vZmY6CVJUU09GRiAtIFJ1 bnRpbWUgcmVnaXN0ZXIgc3BhY2Ugb2Zmc2V0Ci0gKi8KLXN0cnVjdCB4aGNpX2NhcF9yZWdzIHsK LQlfX2xlMzIJaGNfY2FwYmFzZTsKLQlfX2xlMzIJaGNzX3BhcmFtczE7Ci0JX19sZTMyCWhjc19w YXJhbXMyOwotCV9fbGUzMgloY3NfcGFyYW1zMzsKLQlfX2xlMzIJaGNjX3BhcmFtczsKLQlfX2xl MzIJZGJfb2ZmOwotCV9fbGUzMglydW5fcmVnc19vZmY7Ci0JLyogUmVzZXJ2ZWQgdXAgdG8gKENB UExFTkdUSCAtIDB4MUMpICovCi19OwotCi0vKiBoY19jYXBiYXNlIGJpdG1hc2tzICovCi0vKiBi aXRzIDc6MCAtIGhvdyBsb25nIGlzIHRoZSBDYXBhYmlsaXRpZXMgcmVnaXN0ZXIgKi8KLSNkZWZp bmUgSENfTEVOR1RIKHApCQkoKHApICYgMHgwMGZmKQotLyogYml0cyAzMToxNiAgICovCi0jZGVm aW5lIEhDX1ZFUlNJT04ocCkJCSgoKHApID4+IDE2KSAmIDB4ZmZmZikKLQotLyogSENTUEFSQU1T MSAtIGhjc19wYXJhbXMxIC0gYml0bWFza3MgKi8KLS8qIGJpdHMgMDo3LCBNYXggRGV2aWNlIFNs b3RzICovCi0jZGVmaW5lIEhDU19NQVhfU0xPVFMocCkJKCgocCkgPj4gMCkgJiAweGZmKQotI2Rl ZmluZSBIQ1NfU0xPVFNfTUFTSwkJMHhmZgotLyogYml0cyA4OjE4LCBNYXggSW50ZXJydXB0ZXJz ICovCi0jZGVmaW5lIEhDU19NQVhfSU5UUlMocCkJKCgocCkgPj4gOCkgJiAweDdmZikKLS8qIGJp dHMgMjQ6MzEsIE1heCBQb3J0cyAtIG1heCB2YWx1ZSBpcyAweDdGID0gMTI3IHBvcnRzICovCi0j ZGVmaW5lIEhDU19NQVhfUE9SVFMocCkJKCgocCkgPj4gMjQpICYgMHg3ZikKLQotLyogSENTUEFS QU1TMiAtIGhjc19wYXJhbXMyIC0gYml0bWFza3MgKi8KLS8qIGJpdHMgMDozLCBmcmFtZXMgb3Ig dWZyYW1lcyB0aGF0IFNXIG5lZWRzIHRvIHF1ZXVlIHRyYW5zYWN0aW9ucwotICogYWhlYWQgb2Yg dGhlIEhXIHRvIG1lZXQgcGVyaW9kaWMgZGVhZGxpbmVzICovCi0jZGVmaW5lIEhDU19JU1QocCkJ CSgoKHApID4+IDApICYgMHhmKQotLyogYml0cyA0OjcsIG1heCBudW1iZXIgb2YgRXZlbnQgUmlu ZyBzZWdtZW50cyAqLwotI2RlZmluZSBIQ1NfRVJTVF9NQVgocCkJCSgoKHApID4+IDQpICYgMHhm KQotLyogYml0IDI2IFNjcmF0Y2hwYWQgcmVzdG9yZSAtIGZvciBzYXZlL3Jlc3RvcmUgSFcgc3Rh dGUgLSBub3QgdXNlZCB5ZXQgKi8KLS8qIGJpdHMgMjc6MzEgbnVtYmVyIG9mIFNjcmF0Y2hwYWQg YnVmZmVycyBTVyBtdXN0IGFsbG9jYXRlIGZvciB0aGUgSFcgKi8KLSNkZWZpbmUgSENTX01BWF9T Q1JBVENIUEFEKHApCSgoKHApID4+IDI3KSAmIDB4MWYpCi0KLS8qIEhDU1BBUkFNUzMgLSBoY3Nf cGFyYW1zMyAtIGJpdG1hc2tzICovCi0vKiBiaXRzIDA6NywgTWF4IFUxIHRvIFUwIGxhdGVuY3kg Zm9yIHRoZSByb290aHViIHBvcnRzICovCi0jZGVmaW5lIEhDU19VMV9MQVRFTkNZKHApCSgoKHAp ID4+IDApICYgMHhmZikKLS8qIGJpdHMgMTY6MzEsIE1heCBVMiB0byBVMCBsYXRlbmN5IGZvciB0 aGUgcm9vdGh1YiBwb3J0cyAqLwotI2RlZmluZSBIQ1NfVTJfTEFURU5DWShwKQkoKChwKSA+PiAx NikgJiAweGZmZmYpCi0KLS8qIEhDQ1BBUkFNUyAtIGhjY19wYXJhbXMgLSBiaXRtYXNrcyAqLwot LyogdHJ1ZTogSEMgY2FuIHVzZSA2NC1iaXQgYWRkcmVzcyBwb2ludGVycyAqLwotI2RlZmluZSBI Q0NfNjRCSVRfQUREUihwKQkoKHApICYgQklUKDApKQotLyogdHJ1ZTogSEMgY2FuIGRvIGJhbmR3 aWR0aCBuZWdvdGlhdGlvbiAqLwotI2RlZmluZSBIQ0NfQkFORFdJRFRIX05FRyhwKQkoKHApICYg QklUKDEpKQotLyogdHJ1ZTogSEMgdXNlcyA2NC1ieXRlIERldmljZSBDb250ZXh0IHN0cnVjdHVy ZXMKLSAqIEZJWE1FIDY0LWJ5dGUgY29udGV4dCBzdHJ1Y3R1cmVzIGFyZW4ndCBzdXBwb3J0ZWQg eWV0LgotICovCi0jZGVmaW5lIEhDQ182NEJZVEVfQ09OVEVYVChwKQkoKHApICYgQklUKDIpKQot I2RlZmluZSBIQ0NfQ1RYX1NJWkUocCkJCShIQ0NfNjRCWVRFX0NPTlRFWFQocCkgPyA2NCA6IDMy KQotLyogdHJ1ZTogSEMgaGFzIHBvcnQgcG93ZXIgc3dpdGNoZXMgKi8KLSNkZWZpbmUgSENDX1BQ QyhwKQkJKChwKSAmIEJJVCgzKSkKLS8qIHRydWU6IEhDIGhhcyBwb3J0IGluZGljYXRvcnMgKi8K LSNkZWZpbmUgSENDX0lORElDQVRPUihwKQkoKHApICYgQklUKDQpKQotLyogdHJ1ZTogSEMgaGFz IExpZ2h0IEhDIFJlc2V0IENhcGFiaWxpdHkgKi8KLSNkZWZpbmUgSENDX0xJR0hUX1JFU0VUKHAp CSgocCkgJiBCSVQoNSkpCi0vKiB0cnVlOiBIQyBzdXBwb3J0cyBsYXRlbmN5IHRvbGVyYW5jZSBt ZXNzYWdpbmcgKi8KLSNkZWZpbmUgSENDX0xUQyhwKQkJKChwKSAmIEJJVCg2KSkKLS8qIHRydWU6 IG5vIHNlY29uZGFyeSBTdHJlYW0gSUQgU3VwcG9ydCAqLwotI2RlZmluZSBIQ0NfTlNTKHApCQko KHApICYgQklUKDcpKQotLyogTWF4IHNpemUgZm9yIFByaW1hcnkgU3RyZWFtIEFycmF5cyAtIDJe KG4rMSksIHdoZXJlIG4gaXMgYml0cyAxMjoxNSAqLwotI2RlZmluZSBIQ0NfTUFYX1BTQShwKQkJ KDEgPDwgKCgoKHApID4+IDEyKSAmIDB4ZikgKyAxKSkKLS8qIEV4dGVuZGVkIENhcGFiaWxpdGll cyBwb2ludGVyIGZyb20gUENJIGJhc2UgLSBzZWN0aW9uIDUuMy42ICovCi0jZGVmaW5lIEhDQ19F WFRfQ0FQUyhwKQkJKCgocCkgPj4gMTYpICYgMHhmZmZmKQotCi0vKiBkYl9vZmYgYml0bWFzayAt IGJpdHMgMDoxIHJlc2VydmVkICovCi0jZGVmaW5lIERCT0ZGX01BU0sJCSh+MHgzKQotCi0vKiBy dW5fcmVnc19vZmYgYml0bWFzayAtIGJpdHMgMDo0IHJlc2VydmVkICovCi0jZGVmaW5lIFJUU09G Rl9NQVNLCQkofjB4MWYpCi0KLS8qIE51bWJlciBvZiByZWdpc3RlcnMgcGVyIHBvcnQgKi8KLSNk ZWZpbmUgTlVNX1BPUlRfUkVHUwk0Ci0KLSNkZWZpbmUgUE9SVFNDCQkwCi0jZGVmaW5lIFBPUlRQ TVNDCTEKLSNkZWZpbmUgUE9SVExJCQkyCi0jZGVmaW5lIFBPUlRITFBNQwkzCi0KLS8qKgotICog c3RydWN0IHhoY2lfb3BfcmVncyAtIHhIQ0kgSG9zdCBDb250cm9sbGVyIE9wZXJhdGlvbmFsIFJl Z2lzdGVycy4KLSAqIEBjb21tYW5kOiAgICAgICAgICAgIFVTQkNNRCAtIHhIQyBjb21tYW5kIHJl Z2lzdGVyCi0gKiBAc3RhdHVzOiAgICAgICAgICAgICBVU0JTVFMgLSB4SEMgc3RhdHVzIHJlZ2lz dGVyCi0gKiBAcGFnZV9zaXplOiAgICAgICAgICBUaGlzIGluZGljYXRlcyB0aGUgcGFnZSBzaXpl IHRoYXQgdGhlIGhvc3QgY29udHJvbGxlcgotICogICAgICAgICAgICAgICAgICAgICAgc3VwcG9y dHMuICBJZiBiaXQgbiBpcyBzZXQsIHRoZSBIQyBzdXBwb3J0cyBhIHBhZ2Ugc2l6ZQotICogICAg ICAgICAgICAgICAgICAgICAgb2YgMl4obisxMiksIHVwIHRvIGEgMTI4TUIgcGFnZSBzaXplLgot ICogICAgICAgICAgICAgICAgICAgICAgNEsgaXMgdGhlIG1pbmltdW0gcGFnZSBzaXplLgotICog QGNtZF9yaW5nOiAgICAgICAgICAgQ1JQIC0gNjQtYml0IENvbW1hbmQgUmluZyBQb2ludGVyCi0g KiBAZGNiYWFfcHRyOiAgICAgICAgICBEQ0JBQVAgLSA2NC1iaXQgRGV2aWNlIENvbnRleHQgQmFz ZSBBZGRyZXNzIEFycmF5IFBvaW50ZXIKLSAqIEBjb25maWdfcmVnOiAgICAgICAgIENPTkZJRyAt IENvbmZpZ3VyZSBSZWdpc3RlcgotICogQHBvcnRfc3RhdHVzX2Jhc2U6ICAgUE9SVFNDbiAtIGJh c2UgYWRkcmVzcyBmb3IgUG9ydCBTdGF0dXMgYW5kIENvbnRyb2wKLSAqICAgICAgICAgICAgICAg ICAgICAgIEVhY2ggcG9ydCBoYXMgYSBQb3J0IFN0YXR1cyBhbmQgQ29udHJvbCByZWdpc3RlciwK LSAqICAgICAgICAgICAgICAgICAgICAgIGZvbGxvd2VkIGJ5IGEgUG9ydCBQb3dlciBNYW5hZ2Vt ZW50IFN0YXR1cyBhbmQgQ29udHJvbAotICogICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIs IGEgUG9ydCBMaW5rIEluZm8gcmVnaXN0ZXIsIGFuZCBhIHJlc2VydmVkCi0gKiAgICAgICAgICAg ICAgICAgICAgICByZWdpc3Rlci4KLSAqIEBwb3J0X3Bvd2VyX2Jhc2U6ICAgIFBPUlRQTVNDbiAt IGJhc2UgYWRkcmVzcyBmb3IKLSAqICAgICAgICAgICAgICAgICAgICAgIFBvcnQgUG93ZXIgTWFu YWdlbWVudCBTdGF0dXMgYW5kIENvbnRyb2wKLSAqIEBwb3J0X2xpbmtfYmFzZTogICAgIFBPUlRM SW4gLSBiYXNlIGFkZHJlc3MgZm9yIFBvcnQgTGluayBJbmZvIChjdXJyZW50Ci0gKiAgICAgICAg ICAgICAgICAgICAgICBMaW5rIFBNIHN0YXRlIGFuZCBjb250cm9sKSBmb3IgVVNCIDIuMSBhbmQg VVNCIDMuMAotICogICAgICAgICAgICAgICAgICAgICAgZGV2aWNlcy4KLSAqLwotc3RydWN0IHho Y2lfb3BfcmVncyB7Ci0JX19sZTMyCWNvbW1hbmQ7Ci0JX19sZTMyCXN0YXR1czsKLQlfX2xlMzIJ cGFnZV9zaXplOwotCV9fbGUzMglyZXNlcnZlZDE7Ci0JX19sZTMyCXJlc2VydmVkMjsKLQlfX2xl MzIJZGV2X25vdGlmaWNhdGlvbjsKLQlfX2xlNjQJY21kX3Jpbmc7Ci0JLyogcnN2ZDogb2Zmc2V0 IDB4MjAtMkYgKi8KLQlfX2xlMzIJcmVzZXJ2ZWQzWzRdOwotCV9fbGU2NAlkY2JhYV9wdHI7Ci0J X19sZTMyCWNvbmZpZ19yZWc7Ci0JLyogcnN2ZDogb2Zmc2V0IDB4M0MtM0ZGICovCi0JX19sZTMy CXJlc2VydmVkNFsyNDFdOwotCS8qIHBvcnQgMSByZWdpc3RlcnMsIHdoaWNoIHNlcnZlIGFzIGEg YmFzZSBhZGRyZXNzIGZvciBvdGhlciBwb3J0cyAqLwotCV9fbGUzMglwb3J0X3N0YXR1c19iYXNl OwotCV9fbGUzMglwb3J0X3Bvd2VyX2Jhc2U7Ci0JX19sZTMyCXBvcnRfbGlua19iYXNlOwotCV9f bGUzMglyZXNlcnZlZDU7Ci0JLyogcmVnaXN0ZXJzIGZvciBwb3J0cyAyLTI1NSAqLwotCV9fbGUz MglyZXNlcnZlZDZbTlVNX1BPUlRfUkVHUyoyNTRdOwotfTsKLQotLyogVVNCQ01EIC0gVVNCIGNv bW1hbmQgLSBjb21tYW5kIGJpdG1hc2tzICovCi0vKiBzdGFydC9zdG9wIEhDIGV4ZWN1dGlvbiAt IGRvIG5vdCB3cml0ZSB1bmxlc3MgSEMgaXMgaGFsdGVkKi8KLSNkZWZpbmUgQ01EX1JVTgkJQklU KDApCi0vKiBSZXNldCBIQyAtIHJlc2V0cyBpbnRlcm5hbCBIQyBzdGF0ZSBtYWNoaW5lIGFuZCBh bGwgcmVnaXN0ZXJzIChleGNlcHQKLSAqIFBDSSBjb25maWcgcmVncykuICBIQyBkb2VzIE5PVCBk cml2ZSBhIFVTQiByZXNldCBvbiB0aGUgZG93bnN0cmVhbSBwb3J0cy4KLSAqIFRoZSB4SENJIGRy aXZlciBtdXN0IHJlaW5pdGlhbGl6ZSB0aGUgeEhDIGFmdGVyIHNldHRpbmcgdGhpcyBiaXQuCi0g Ki8KLSNkZWZpbmUgQ01EX1JFU0VUCUJJVCgxKQotLyogRXZlbnQgSW50ZXJydXB0IEVuYWJsZSAt IGEgJzEnIGFsbG93cyBpbnRlcnJ1cHRzIGZyb20gdGhlIGhvc3QgY29udHJvbGxlciAqLwotI2Rl ZmluZSBDTURfRUlFCQlCSVQoMikKLS8qIEhvc3QgU3lzdGVtIEVycm9yIEludGVycnVwdCBFbmFi bGUgLSBnZXQgb3V0LW9mLWJhbmQgc2lnbmFsIGZvciBIQyBlcnJvcnMgKi8KLSNkZWZpbmUgQ01E X0hTRUlFCUJJVCgzKQotLyogYml0cyA0OjYgYXJlIHJlc2VydmVkIChhbmQgc2hvdWxkIGJlIHBy ZXNlcnZlZCBvbiB3cml0ZXMpLiAqLwotLyogbGlnaHQgcmVzZXQgKHBvcnQgc3RhdHVzIHN0YXlz IHVuY2hhbmdlZCkgLSByZXNldCBjb21wbGV0ZWQgd2hlbiB0aGlzIGlzIDAgKi8KLSNkZWZpbmUg Q01EX0xSRVNFVAlCSVQoNykKLS8qIGhvc3QgY29udHJvbGxlciBzYXZlL3Jlc3RvcmUgc3RhdGUu ICovCi0jZGVmaW5lIENNRF9DU1MJCUJJVCg4KQotI2RlZmluZSBDTURfQ1JTCQlCSVQoOSkKLS8q IEVuYWJsZSBXcmFwIEV2ZW50IC0gJzEnIG1lYW5zIHhIQyBnZW5lcmF0ZXMgYW4gZXZlbnQgd2hl biBNRklOREVYIHdyYXBzLiAqLwotI2RlZmluZSBDTURfRVdFCQlCSVQoMTApCi0vKiBNRklOREVY IHBvd2VyIG1hbmFnZW1lbnQgLSAnMScgbWVhbnMgeEhDIGNhbiBzdG9wIE1GSU5ERVggY291bnRl ciBpZiBhbGwgcm9vdAotICogaHVicyBhcmUgaW4gVTMgKHNlbGVjdGl2ZSBzdXNwZW5kKSwgZGlz Y29ubmVjdCwgZGlzYWJsZWQsIG9yIHBvd2VyZWQtb2ZmLgotICogJzAnIG1lYW5zIHRoZSB4SEMg Y2FuIHBvd2VyIGl0IG9mZiBpZiBhbGwgcG9ydHMgYXJlIGluIHRoZSBkaXNjb25uZWN0LAotICog ZGlzYWJsZWQsIG9yIHBvd2VyZWQtb2ZmIHN0YXRlLgotICovCi0jZGVmaW5lIENNRF9QTV9JTkRF WAlCSVQoMTEpCi0vKiBiaXRzIDEyOjMxIGFyZSByZXNlcnZlZCAoYW5kIHNob3VsZCBiZSBwcmVz ZXJ2ZWQgb24gd3JpdGVzKS4gKi8KLSNkZWZpbmUgWEhDSV9JUlFTCShDTURfRUlFIHwgQ01EX0hT RUlFIHwgQ01EX0VXRSkKLQotLyogSU1BTiAtIEludGVycnVwdCBNYW5hZ2VtZW50IFJlZ2lzdGVy ICovCi0jZGVmaW5lIElNQU5fSUUJCUJJVCgxKQotI2RlZmluZSBJTUFOX0lQCQlCSVQoMCkKLQot LyogVVNCU1RTIC0gVVNCIHN0YXR1cyAtIHN0YXR1cyBiaXRtYXNrcyAqLwotLyogSEMgbm90IHJ1 bm5pbmcgLSBzZXQgdG8gMSB3aGVuIHJ1bi9zdG9wIGJpdCBpcyBjbGVhcmVkLiAqLwotI2RlZmlu ZSBTVFNfSEFMVAlCSVQoMCkKLS8qIHNlcmlvdXMgZXJyb3IsIGUuZy4gUENJIHBhcml0eSBlcnJv ci4gIFRoZSBIQyB3aWxsIGNsZWFyIHRoZSBydW4vc3RvcCBiaXQuICovCi0jZGVmaW5lIFNUU19G QVRBTAlCSVQoMikKLS8qIGV2ZW50IGludGVycnVwdCAtIGNsZWFyIHRoaXMgcHJpb3IgdG8gY2xl YXJpbmcgYW55IElQIGZsYWdzIGluIElSIHNldCovCi0jZGVmaW5lIFNUU19FSU5UCUJJVCgzKQot LyogcG9ydCBjaGFuZ2UgZGV0ZWN0ICovCi0jZGVmaW5lIFNUU19QT1JUCUJJVCg0KQotLyogYml0 cyA1OjcgcmVzZXJ2ZWQgYW5kIHplcm9lZCAqLwotLyogc2F2ZSBzdGF0ZSBzdGF0dXMgLSAnMScg bWVhbnMgeEhDIGlzIHNhdmluZyBzdGF0ZSAqLwotI2RlZmluZSBTVFNfU0FWRQlCSVQoOCkKLS8q IHJlc3RvcmUgc3RhdGUgc3RhdHVzIC0gJzEnIG1lYW5zIHhIQyBpcyByZXN0b3Jpbmcgc3RhdGUg Ki8KLSNkZWZpbmUgU1RTX1JFU1RPUkUJQklUKDkpCi0vKiB0cnVlOiBzYXZlIG9yIHJlc3RvcmUg ZXJyb3IgKi8KLSNkZWZpbmUgU1RTX1NSRQkJQklUKDEwKQotLyogdHJ1ZTogQ29udHJvbGxlciBO b3QgUmVhZHkgdG8gYWNjZXB0IGRvb3JiZWxsIG9yIG9wIHJlZyB3cml0ZXMgYWZ0ZXIgcmVzZXQg Ki8KLSNkZWZpbmUgU1RTX0NOUgkJQklUKDExKQotLyogdHJ1ZTogaW50ZXJuYWwgSG9zdCBDb250 cm9sbGVyIEVycm9yIC0gU1cgbmVlZHMgdG8gcmVzZXQgYW5kIHJlaW5pdGlhbGl6ZSAqLwotI2Rl ZmluZSBTVFNfSENFCQlCSVQoMTIpCi0vKiBiaXRzIDEzOjMxIHJlc2VydmVkIGFuZCBzaG91bGQg YmUgcHJlc2VydmVkICovCi0KLS8qCi0gKiBETkNUUkwgLSBEZXZpY2UgTm90aWZpY2F0aW9uIENv bnRyb2wgUmVnaXN0ZXIgLSBkZXZfbm90aWZpY2F0aW9uIGJpdG1hc2tzCi0gKiBHZW5lcmF0ZSBh IGRldmljZSBub3RpZmljYXRpb24gZXZlbnQgd2hlbiB0aGUgSEMgc2VlcyBhIHRyYW5zYWN0aW9u IHdpdGggYQotICogbm90aWZpY2F0aW9uIHR5cGUgdGhhdCBtYXRjaGVzIGEgYml0IHNldCBpbiB0 aGlzIGJpdCBmaWVsZC4KLSAqLwotI2RlZmluZSBERVZfTk9URV9NQVNLCQkoMHhmZmZmKQotI2Rl ZmluZSBFTkFCTEVfREVWX05PVEUoeCkJQklUKHgpCi0vKiBNb3N0IG9mIHRoZSBkZXZpY2Ugbm90 aWZpY2F0aW9uIHR5cGVzIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIGRlYnVnLgotICogU1cgZG9l cyBuZWVkIHRvIHBheSBhdHRlbnRpb24gdG8gZnVuY3Rpb24gd2FrZSBub3RpZmljYXRpb25zLgot ICovCi0jZGVmaW5lIERFVl9OT1RFX0ZXQUtFCQlFTkFCTEVfREVWX05PVEUoMSkKLQotLyogQ1JD UiAtIENvbW1hbmQgUmluZyBDb250cm9sIFJlZ2lzdGVyIC0gY21kX3JpbmcgYml0bWFza3MgKi8K LS8qIGJpdCAwIGlzIHRoZSBjb21tYW5kIHJpbmcgY3ljbGUgc3RhdGUgKi8KLS8qIHN0b3Agcmlu ZyBvcGVyYXRpb24gYWZ0ZXIgY29tcGxldGlvbiBvZiB0aGUgY3VycmVudGx5IGV4ZWN1dGluZyBj b21tYW5kICovCi0jZGVmaW5lIENNRF9SSU5HX1BBVVNFCQlCSVQoMSkKLS8qIHN0b3AgcmluZyBp bW1lZGlhdGVseSAtIGFib3J0IHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nIGNvbW1hbmQgKi8KLSNk ZWZpbmUgQ01EX1JJTkdfQUJPUlQJCUJJVCgyKQotLyogdHJ1ZTogY29tbWFuZCByaW5nIGlzIHJ1 bm5pbmcgKi8KLSNkZWZpbmUgQ01EX1JJTkdfUlVOTklORwlCSVQoMykKLS8qIGJpdHMgNDo1IHJl c2VydmVkIGFuZCBzaG91bGQgYmUgcHJlc2VydmVkICovCi0vKiBDb21tYW5kIFJpbmcgcG9pbnRl ciAtIGJpdCBtYXNrIGZvciB0aGUgbG93ZXIgMzIgYml0cy4gKi8KLSNkZWZpbmUgQ01EX1JJTkdf UlNWRF9CSVRTCSgweDNmKQotCi0vKiBDT05GSUcgLSBDb25maWd1cmUgUmVnaXN0ZXIgLSBjb25m aWdfcmVnIGJpdG1hc2tzICovCi0vKiBiaXRzIDA6NyAtIG1heGltdW0gbnVtYmVyIG9mIGRldmlj ZSBzbG90cyBlbmFibGVkIChOdW1TbG90c0VuKSAqLwotI2RlZmluZSBNQVhfREVWUyhwKQkJKChw KSAmIDB4ZmYpCi0vKiBiaXRzIDg6MzEgLSByZXNlcnZlZCBhbmQgc2hvdWxkIGJlIHByZXNlcnZl ZCAqLwotCi0vKiBQT1JUU0MgLSBQb3J0IFN0YXR1cyBhbmQgQ29udHJvbCBSZWdpc3RlciAtIHBv cnRfc3RhdHVzX2Jhc2UgYml0bWFza3MgKi8KLS8qIHRydWU6IGRldmljZSBjb25uZWN0ZWQgKi8K LSNkZWZpbmUgUE9SVF9DT05ORUNUCQlCSVQoMCkKLS8qIHRydWU6IHBvcnQgZW5hYmxlZCAqLwot I2RlZmluZSBQT1JUX1BFCQkJQklUKDEpCi0vKiBiaXQgMiByZXNlcnZlZCBhbmQgemVyb2VkICov Ci0vKiB0cnVlOiBwb3J0IGhhcyBhbiBvdmVyLWN1cnJlbnQgY29uZGl0aW9uICovCi0jZGVmaW5l IFBPUlRfT0MJCQlCSVQoMykKLS8qIHRydWU6IHBvcnQgcmVzZXQgc2lnbmFsaW5nIGFzc2VydGVk ICovCi0jZGVmaW5lIFBPUlRfUkVTRVQJCUJJVCg0KQotLyogUG9ydCBMaW5rIFN0YXRlIC0gYml0 cyA1OjgKLSAqIEEgcmVhZCBnaXZlcyB0aGUgY3VycmVudCBsaW5rIFBNIHN0YXRlIG9mIHRoZSBw b3J0LAotICogYSB3cml0ZSB3aXRoIExpbmsgU3RhdGUgV3JpdGUgU3Ryb2JlIHNldCBzZXRzIHRo ZSBsaW5rIHN0YXRlLgotICovCi0jZGVmaW5lIFBPUlRfUExTX01BU0sJCSgweGYgPDwgNSkKLSNk ZWZpbmUgWERFVl9VMAkJCSgweDAgPDwgNSkKLSNkZWZpbmUgWERFVl9VMgkJCSgweDIgPDwgNSkK LSNkZWZpbmUgWERFVl9VMwkJCSgweDMgPDwgNSkKLSNkZWZpbmUgWERFVl9SRVNVTUUJCSgweGYg PDwgNSkKLS8qIHRydWU6IHBvcnQgaGFzIHBvd2VyIChzZWUgSENDX1BQQykgKi8KLSNkZWZpbmUg UE9SVF9QT1dFUgkJQklUKDkpCi0vKiBiaXRzIDEwOjEzIGluZGljYXRlIGRldmljZSBzcGVlZDoK LSAqIDAgLSB1bmRlZmluZWQgc3BlZWQgLSBwb3J0IGhhc24ndCBiZSBpbml0aWFsaXplZCBieSBh IHJlc2V0IHlldAotICogMSAtIGZ1bGwgc3BlZWQKLSAqIDIgLSBsb3cgc3BlZWQKLSAqIDMgLSBo aWdoIHNwZWVkCi0gKiA0IC0gc3VwZXIgc3BlZWQKLSAqIDUtMTUgcmVzZXJ2ZWQKLSAqLwotI2Rl ZmluZSBERVZfU1BFRURfTUFTSwkJKDB4ZiA8PCAxMCkKLSNkZWZpbmUgWERFVl9GUwkJCSgweDEg PDwgMTApCi0jZGVmaW5lIFhERVZfTFMJCQkoMHgyIDw8IDEwKQotI2RlZmluZSBYREVWX0hTCQkJ KDB4MyA8PCAxMCkKLSNkZWZpbmUgWERFVl9TUwkJCSgweDQgPDwgMTApCi0jZGVmaW5lIERFVl9V TkRFRlNQRUVEKHApCSgoKHApICYgREVWX1NQRUVEX01BU0spID09ICgweDA8PDEwKSkKLSNkZWZp bmUgREVWX0ZVTExTUEVFRChwKQkoKChwKSAmIERFVl9TUEVFRF9NQVNLKSA9PSBYREVWX0ZTKQot I2RlZmluZSBERVZfTE9XU1BFRUQocCkJCSgoKHApICYgREVWX1NQRUVEX01BU0spID09IFhERVZf TFMpCi0jZGVmaW5lIERFVl9ISUdIU1BFRUQocCkJKCgocCkgJiBERVZfU1BFRURfTUFTSykgPT0g WERFVl9IUykKLSNkZWZpbmUgREVWX1NVUEVSU1BFRUQocCkJKCgocCkgJiBERVZfU1BFRURfTUFT SykgPT0gWERFVl9TUykKLS8qIEJpdHMgMjA6MjMgaW4gdGhlIFNsb3QgQ29udGV4dCBhcmUgdGhl IHNwZWVkIGZvciB0aGUgZGV2aWNlICovCi0jZGVmaW5lIFNMT1RfU1BFRURfRlMJCShYREVWX0ZT IDw8IDEwKQotI2RlZmluZSBTTE9UX1NQRUVEX0xTCQkoWERFVl9MUyA8PCAxMCkKLSNkZWZpbmUg U0xPVF9TUEVFRF9IUwkJKFhERVZfSFMgPDwgMTApCi0jZGVmaW5lIFNMT1RfU1BFRURfU1MJCShY REVWX1NTIDw8IDEwKQotLyogUG9ydCBJbmRpY2F0b3IgQ29udHJvbCAqLwotI2RlZmluZSBQT1JU X0xFRF9PRkYJCSgwIDw8IDE0KQotI2RlZmluZSBQT1JUX0xFRF9BTUJFUgkJKDEgPDwgMTQpCi0j ZGVmaW5lIFBPUlRfTEVEX0dSRUVOCQkoMiA8PCAxNCkKLSNkZWZpbmUgUE9SVF9MRURfTUFTSwkJ KDMgPDwgMTQpCi0vKiBQb3J0IExpbmsgU3RhdGUgV3JpdGUgU3Ryb2JlIC0gc2V0IHRoaXMgd2hl biBjaGFuZ2luZyBsaW5rIHN0YXRlICovCi0jZGVmaW5lIFBPUlRfTElOS19TVFJPQkUJQklUKDE2 KQotLyogdHJ1ZTogY29ubmVjdCBzdGF0dXMgY2hhbmdlICovCi0jZGVmaW5lIFBPUlRfQ1NDCQlC SVQoMTcpCi0vKiB0cnVlOiBwb3J0IGVuYWJsZSBjaGFuZ2UgKi8KLSNkZWZpbmUgUE9SVF9QRUMJ CUJJVCgxOCkKLS8qIHRydWU6IHdhcm0gcmVzZXQgZm9yIGEgVVNCIDMuMCBkZXZpY2UgaXMgZG9u ZS4gIEEgImhvdCIgcmVzZXQgcHV0cyB0aGUgcG9ydAotICogaW50byBhbiBlbmFibGVkIHN0YXRl LCBhbmQgdGhlIGRldmljZSBpbnRvIHRoZSBkZWZhdWx0IHN0YXRlLiAgQSAid2FybSIgcmVzZXQK LSAqIGFsc28gcmVzZXRzIHRoZSBsaW5rLCBmb3JjaW5nIHRoZSBkZXZpY2UgdGhyb3VnaCB0aGUg bGluayB0cmFpbmluZyBzZXF1ZW5jZS4KLSAqIFNXIGNhbiBhbHNvIGxvb2sgYXQgdGhlIFBvcnQg UmVzZXQgcmVnaXN0ZXIgdG8gc2VlIHdoZW4gd2FybSByZXNldCBpcyBkb25lLgotICovCi0jZGVm aW5lIFBPUlRfV1JDCQlCSVQoMTkpCi0vKiB0cnVlOiBvdmVyLWN1cnJlbnQgY2hhbmdlICovCi0j ZGVmaW5lIFBPUlRfT0NDCQlCSVQoMjApCi0vKiB0cnVlOiByZXNldCBjaGFuZ2UgLSAxIHRvIDAg dHJhbnNpdGlvbiBvZiBQT1JUX1JFU0VUICovCi0jZGVmaW5lIFBPUlRfUkMJCQlCSVQoMjEpCi0v KiBwb3J0IGxpbmsgc3RhdHVzIGNoYW5nZSAtIHNldCBvbiBzb21lIHBvcnQgbGluayBzdGF0ZSB0 cmFuc2l0aW9uczoKLSAqICBUcmFuc2l0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICBSZWFz b24KLSAqICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqICAtIFUzIHRvIFJlc3VtZSAgICAgICAg ICAgICAgICAgICAgICBXYWtldXAgc2lnbmFsaW5nIGZyb20gYSBkZXZpY2UKLSAqICAtIFJlc3Vt ZSB0byBSZWNvdmVyeSB0byBVMCAgICAgICAgICBVU0IgMy4wIGRldmljZSByZXN1bWUKLSAqICAt IFJlc3VtZSB0byBVMCAgICAgICAgICAgICAgICAgICAgICBVU0IgMi4wIGRldmljZSByZXN1bWUK LSAqICAtIFUzIHRvIFJlY292ZXJ5IHRvIFUwICAgICAgICAgICAgICBTb2Z0d2FyZSByZXN1bWUg b2YgVVNCIDMuMCBkZXZpY2UgY29tcGxldGUKLSAqICAtIFUzIHRvIFUwICAgICAgICAgICAgICAg ICAgICAgICAgICBTb2Z0d2FyZSByZXN1bWUgb2YgVVNCIDIuMCBkZXZpY2UgY29tcGxldGUKLSAq ICAtIFUyIHRvIFUwICAgICAgICAgICAgICAgICAgICAgICAgICBMMSByZXN1bWUgb2YgVVNCIDIu MSBkZXZpY2UgY29tcGxldGUKLSAqICAtIFUwIHRvIFUwICg/Pz8pICAgICAgICAgICAgICAgICAg ICBMMSBlbnRyeSByZWplY3Rpb24gYnkgVVNCIDIuMSBkZXZpY2UKLSAqICAtIFUwIHRvIGRpc2Fi bGVkICAgICAgICAgICAgICAgICAgICBMMSBlbnRyeSBlcnJvciB3aXRoIFVTQiAyLjEgZGV2aWNl Ci0gKiAgLSBBbnkgc3RhdGUgdG8gaW5hY3RpdmUgICAgICAgICAgICAgRXJyb3Igb24gVVNCIDMu MCBwb3J0Ci0gKi8KLSNkZWZpbmUgUE9SVF9QTEMJCUJJVCgyMikKLS8qIHBvcnQgY29uZmlndXJl IGVycm9yIGNoYW5nZSAtIHBvcnQgZmFpbGVkIHRvIGNvbmZpZ3VyZSBpdHMgbGluayBwYXJ0bmVy ICovCi0jZGVmaW5lIFBPUlRfQ0VDCQlCSVQoMjMpCi0vKiBDb2xkIEF0dGFjaCBTdGF0dXMgLSB4 SEMgY2FuIHNldCB0aGlzIGJpdCB0byByZXBvcnQgZGV2aWNlIGF0dGFjaGVkIGR1cmluZwotICog U3ggc3RhdGUuIFdhcm0gcG9ydCByZXNldCBzaG91bGQgYmUgcGVyZm9tZWQgdG8gY2xlYXIgdGhp cyBiaXQgYW5kIG1vdmUgcG9ydAotICogdG8gY29ubmVjdGVkIHN0YXRlLgotICovCi0jZGVmaW5l IFBPUlRfQ0FTCQlCSVQoMjQpCi0vKiB3YWtlIG9uIGNvbm5lY3QgKGVuYWJsZSkgKi8KLSNkZWZp bmUgUE9SVF9XS0NPTk5fRQkJQklUKDI1KQotLyogd2FrZSBvbiBkaXNjb25uZWN0IChlbmFibGUp ICovCi0jZGVmaW5lIFBPUlRfV0tESVNDX0UJCUJJVCgyNikKLS8qIHdha2Ugb24gb3Zlci1jdXJy ZW50IChlbmFibGUpICovCi0jZGVmaW5lIFBPUlRfV0tPQ19FCQlCSVQoMjcpCi0vKiBiaXRzIDI4 OjI5IHJlc2VydmVkICovCi0vKiB0cnVlOiBkZXZpY2UgaXMgcmVtb3ZhYmxlIC0gZm9yIFVTQiAz LjAgcm9vdGh1YiBlbXVsYXRpb24gKi8KLSNkZWZpbmUgUE9SVF9ERVZfUkVNT1ZFCQlCSVQoMzAp Ci0vKiBJbml0aWF0ZSBhIHdhcm0gcG9ydCByZXNldCAtIGNvbXBsZXRlIHdoZW4gUE9SVF9XUkMg aXMgJzEnICovCi0jZGVmaW5lIFBPUlRfV1IJCQlCSVQoMzEpCi0KLS8qIFdlIG1hcmsgZHVwbGlj YXRlIGVudHJpZXMgd2l0aCAtMSAqLwotI2RlZmluZSBEVVBMSUNBVEVfRU5UUlkJCSgodTgpKC0x KSkKLQotLyogUG9ydCBQb3dlciBNYW5hZ2VtZW50IFN0YXR1cyBhbmQgQ29udHJvbCAtIHBvcnRf cG93ZXJfYmFzZSBiaXRtYXNrcyAqLwotLyogSW5hY3Rpdml0eSB0aW1lciB2YWx1ZSBmb3IgdHJh bnNpdGlvbnMgaW50byBVMSwgaW4gbWljcm9zZWNvbmRzLgotICogVGltZW91dCBjYW4gYmUgdXAg dG8gMTI3dXMuICAweEZGIG1lYW5zIGFuIGluZmluaXRlIHRpbWVvdXQuCi0gKi8KLSNkZWZpbmUg UE9SVF9VMV9USU1FT1VUKHApCSgocCkgJiAweGZmKQotI2RlZmluZSBQT1JUX1UxX1RJTUVPVVRf TUFTSwkweGZmCi0vKiBJbmFjdGl2aXR5IHRpbWVyIHZhbHVlIGZvciB0cmFuc2l0aW9ucyBpbnRv IFUyICovCi0jZGVmaW5lIFBPUlRfVTJfVElNRU9VVChwKQkoKChwKSAmIDB4ZmYpIDw8IDgpCi0j ZGVmaW5lIFBPUlRfVTJfVElNRU9VVF9NQVNLCSgweGZmIDw8IDgpCi0vKiBCaXRzIDI0OjMxIGZv ciBwb3J0IHRlc3RpbmcgKi8KLQotLyogVVNCMiBQcm90b2NvbCBQT1JUU1BNU0MgKi8KLSNkZWZp bmUgUE9SVF9MMVNfTUFTSwkJMHg3Ci0jZGVmaW5lIFBPUlRfTDFTX1NVQ0NFU1MJMHgxCi0jZGVm aW5lIFBPUlRfUldFCQlCSVQoMykKLSNkZWZpbmUgUE9SVF9ISVJEKHApCQkoKChwKSAmIDB4Zikg PDwgNCkKLSNkZWZpbmUgUE9SVF9ISVJEX01BU0sJCSgweGYgPDwgNCkKLSNkZWZpbmUgUE9SVF9M MURTX01BU0sJCSgweGZmIDw8IDgpCi0jZGVmaW5lIFBPUlRfTDFEUyhwKQkJKCgocCkgJiAweGZm KSA8PCA4KQotI2RlZmluZSBQT1JUX0hMRQkJQklUKDE2KQotCi0vKiBVU0IyIFByb3RvY29sIFBP UlRITFBNQyAqLwotI2RlZmluZSBQT1JUX0hJUkRNKHApCQkoKHApICYgMykKLSNkZWZpbmUgUE9S VF9MMV9USU1FT1VUKHApCSgoKHApICYgMHhmZikgPDwgMikKLSNkZWZpbmUgUE9SVF9CRVNMRChw KQkJKCgocCkgJiAweGYpIDw8IDEwKQotCi0vKiB1c2UgNTEyIG1pY3Jvc2Vjb25kcyBhcyBVU0Iy IExQTSBMMSBkZWZhdWx0IHRpbWVvdXQuICovCi0jZGVmaW5lIFhIQ0lfTDFfVElNRU9VVAkJNTEy Ci0KLS8qIFNldCBkZWZhdWx0IEhJUkQvQkVTTCB2YWx1ZSB0byA0ICgzNTAvNDAwdXMpIGZvciBV U0IyIEwxIExQTSByZXN1bWUgbGF0ZW5jeS4KLSAqIFNhZmUgdG8gdXNlIHdpdGggbWl4ZWQgSElS RCBhbmQgQkVTTCBzeXN0ZW1zIChob3N0IGFuZCBkZXZpY2UpIGFuZCBpcyB1c2VkCi0gKiBieSBv dGhlciBvcGVyYXRpbmcgc3lzdGVtcy4KLSAqCi0gKiBYSENJIDEuMCBlcnJhdGEgOC8xNC8xMiBU YWJsZSAxMyBub3RlczoKLSAqICJTb2Z0d2FyZSBzaG91bGQgY2hvb3NlIHhIQyBCRVNML0JFU0xE IGZpZWxkIHZhbHVlcyB0aGF0IGRvIG5vdCB2aW9sYXRlIGEKLSAqIGRldmljZSdzIHJlc3VtZSBs YXRlbmN5IHJlcXVpcmVtZW50cywKLSAqIGUuZy4gbm90IHByb2dyYW0gdmFsdWVzID4gJzQnIGlm IEJMQyA9ICcxJyBhbmQgYSBISVJEIGRldmljZSBpcyBhdHRhY2hlZCwKLSAqIG9yIG5vdCBwcm9n cmFtIHZhbHVlcyA8ICc0JyBpZiBCTEMgPSAnMCcgYW5kIGEgQkVTTCBkZXZpY2UgaXMgYXR0YWNo ZWQuCi0gKi8KLSNkZWZpbmUgWEhDSV9ERUZBVUxUX0JFU0wJNAotCi0vKioKLSAqIHN0cnVjdCB4 aGNpX2ludHJfcmVnIC0gSW50ZXJydXB0IFJlZ2lzdGVyIFNldAotICogQGlycV9wZW5kaW5nOglJ TUFOIC0gSW50ZXJydXB0IE1hbmFnZW1lbnQgUmVnaXN0ZXIuICBVc2VkIHRvIGVuYWJsZQotICog CQkJaW50ZXJydXB0cyBhbmQgY2hlY2sgZm9yIHBlbmRpbmcgaW50ZXJydXB0cy4KLSAqIEBpcnFf Y29udHJvbDoJSU1PRCAtIEludGVycnVwdCBNb2RlcmF0aW9uIFJlZ2lzdGVyLgotICogCQkJVXNl ZCB0byB0aHJvdHRsZSBpbnRlcnJ1cHRzLgotICogQGVyc3Rfc2l6ZToJCU51bWJlciBvZiBzZWdt ZW50cyBpbiB0aGUgRXZlbnQgUmluZyBTZWdtZW50IFRhYmxlIChFUlNUKS4KLSAqIEBlcnN0X2Jh c2U6CQlFUlNUIGJhc2UgYWRkcmVzcy4KLSAqIEBlcnN0X2RlcXVldWU6CUV2ZW50IHJpbmcgZGVx dWV1ZSBwb2ludGVyLgotICoKLSAqIEVhY2ggaW50ZXJydXB0ZXIgKGRlZmluZWQgYnkgYSBNU0kt WCB2ZWN0b3IpIGhhcyBhbiBldmVudCByaW5nIGFuZCBhbiBFdmVudAotICogUmluZyBTZWdtZW50 IFRhYmxlIChFUlNUKSBhc3NvY2lhdGVkIHdpdGggaXQuICBUaGUgZXZlbnQgcmluZyBpcyBjb21w cmlzZWQgb2YKLSAqIG11bHRpcGxlIHNlZ21lbnRzIG9mIHRoZSBzYW1lIHNpemUuICBUaGUgSEMg cGxhY2VzIGV2ZW50cyBvbiB0aGUgcmluZyBhbmQKLSAqICJ1cGRhdGVzIHRoZSBDeWNsZSBiaXQg aW4gdGhlIFRSQnMgdG8gaW5kaWNhdGUgdG8gc29mdHdhcmUgdGhlIGN1cnJlbnQKLSAqIHBvc2l0 aW9uIG9mIHRoZSBFbnF1ZXVlIFBvaW50ZXIuIiBUaGUgSENEIChMaW51eCkgcHJvY2Vzc2VzIHRo b3NlIGV2ZW50cyBhbmQKLSAqIHVwZGF0ZXMgdGhlIGRlcXVldWUgcG9pbnRlci4KLSAqLwotc3Ry dWN0IHhoY2lfaW50cl9yZWcgewotCV9fbGUzMglpcnFfcGVuZGluZzsKLQlfX2xlMzIJaXJxX2Nv bnRyb2w7Ci0JX19sZTMyCWVyc3Rfc2l6ZTsKLQlfX2xlMzIJcnN2ZDsKLQlfX2xlNjQJZXJzdF9i YXNlOwotCV9fbGU2NAllcnN0X2RlcXVldWU7Ci19OwotCi0vKiBpcnFfcGVuZGluZyBiaXRtYXNr cyAqLwotI2RlZmluZSBFUl9JUlFfUEVORElORyhwKQkoKHApICYgMHgxKQotLyogYml0cyAyOjMx IG5lZWQgdG8gYmUgcHJlc2VydmVkICovCi0vKiBUSElTIElTIEJVR0dZIC0gRklYTUUgLSBJUCBJ UyBXUklURSAxIFRPIENMRUFSICovCi0jZGVmaW5lIEVSX0lSUV9DTEVBUihwKQkJKChwKSAmIDB4 ZmZmZmZmZmUpCi0jZGVmaW5lIEVSX0lSUV9FTkFCTEUocCkJKChFUl9JUlFfQ0xFQVIocCkpIHwg MHgyKQotI2RlZmluZSBFUl9JUlFfRElTQUJMRShwKQkoKEVSX0lSUV9DTEVBUihwKSkgJiB+KDB4 MikpCi0KLS8qIGlycV9jb250cm9sIGJpdG1hc2tzICovCi0vKiBNaW5pbXVtIGludGVydmFsIGJl dHdlZW4gaW50ZXJydXB0cyAoaW4gMjUwbnMgaW50ZXJ2YWxzKS4gIFRoZSBpbnRlcnZhbAotICog YmV0d2VlbiBpbnRlcnJ1cHRzIHdpbGwgYmUgbG9uZ2VyIGlmIHRoZXJlIGFyZSBubyBldmVudHMg b24gdGhlIGV2ZW50IHJpbmcuCi0gKiBEZWZhdWx0IGlzIDQwMDAgKDEgbXMpLgotICovCi0jZGVm aW5lIEVSX0lSUV9JTlRFUlZBTF9NQVNLCTB4ZmZmZgotLyogQ291bnRlciB1c2VkIHRvIGNvdW50 IGRvd24gdGhlIHRpbWUgdG8gdGhlIG5leHQgaW50ZXJydXB0IC0gSFcgdXNlIG9ubHkgKi8KLSNk ZWZpbmUgRVJfSVJRX0NPVU5URVJfTUFTSwkoMHhmZmZmIDw8IDE2KQotCi0vKiBlcnN0X3NpemUg Yml0bWFza3MgKi8KLS8qIFByZXNlcnZlIGJpdHMgMTY6MzEgb2YgZXJzdF9zaXplICovCi0jZGVm aW5lIEVSU1RfU0laRV9NQVNLCQkoMHhmZmZmIDw8IDE2KQotCi0vKiBlcnN0X2RlcXVldWUgYml0 bWFza3MgKi8KLS8qIERlcXVldWUgRVJTVCBTZWdtZW50IEluZGV4IChERVNJKSAtIFNlZ21lbnQg bnVtYmVyIChvciBhbGlhcykKLSAqIHdoZXJlIHRoZSBjdXJyZW50IGRlcXVldWUgcG9pbnRlciBs aWVzLiAgVGhpcyBpcyBhbiBvcHRpb25hbCBIVyBoaW50LgotICovCi0jZGVmaW5lIEVSU1RfREVT SV9NQVNLCQkweDcKLS8qIEV2ZW50IEhhbmRsZXIgQnVzeSAoRUhCKSAtIGlzIHRoZSBldmVudCBy aW5nIHNjaGVkdWxlZCB0byBiZSBzZXJ2aWNlZCBieQotICogYSB3b3JrIHF1ZXVlIChvciBkZWxh eWVkIHNlcnZpY2Ugcm91dGluZSk/Ci0gKi8KLSNkZWZpbmUgRVJTVF9FSEIJCUJJVCgzKQotI2Rl ZmluZSBFUlNUX1BUUl9NQVNLCQkweGYKLQotLyoqCi0gKiBzdHJ1Y3QgeGhjaV9ydW5fcmVncwot ICogQG1pY3JvZnJhbWVfaW5kZXg6IE1GSU5ERVggLSBjdXJyZW50IG1pY3JvZnJhbWUgbnVtYmVy Ci0gKgotICogU2VjdGlvbiA1LjUgSG9zdCBDb250cm9sbGVyIFJ1bnRpbWUgUmVnaXN0ZXJzOgot ICogIlNvZnR3YXJlIHNob3VsZCByZWFkIGFuZCB3cml0ZSB0aGVzZSByZWdpc3RlcnMgdXNpbmcg b25seSBEd29yZCAoMzIgYml0KQotICogb3IgbGFyZ2VyIGFjY2Vzc2VzIgotICovCi1zdHJ1Y3Qg eGhjaV9ydW5fcmVncyB7Ci0JX19sZTMyCQkJbWljcm9mcmFtZV9pbmRleDsKLQlfX2xlMzIJCQly c3ZkWzddOwotCXN0cnVjdCB4aGNpX2ludHJfcmVnCWlyX3NldFsxMjhdOwotfTsKLQotLyoqCi0g KiBzdHJ1Y3QgZG9vcmJlbGxfYXJyYXkKLSAqCi0gKiBCaXRzICAwIC0gIDc6IEVuZHBvaW50IHRh cmdldAotICogQml0cyAgOCAtIDE1OiBSc3ZkWgotICogQml0cyAxNiAtIDMxOiBTdHJlYW0gSUQK LSAqCi0gKiBTZWN0aW9uIDUuNgotICovCi1zdHJ1Y3QgeGhjaV9kb29yYmVsbF9hcnJheSB7Ci0J X19sZTMyCWRvb3JiZWxsWzI1Nl07Ci19OwotCi0jZGVmaW5lIERCX1ZBTFVFKGVwLCBzdHJlYW0p CSgoKChlcCkgKyAxKSAmIDB4ZmYpIHwgKChzdHJlYW0pIDw8IDE2KSkKLSNkZWZpbmUgREJfVkFM VUVfSE9TVAkJMHgwMDAwMDAwMAotCi0vKioKLSAqIHN0cnVjdCB4aGNpX2NvbnRhaW5lcl9jdHgK LSAqIEB0eXBlOiBUeXBlIG9mIGNvbnRleHQuICBVc2VkIHRvIGNhbGN1bGF0ZWQgb2Zmc2V0cyB0 byBjb250YWluZWQgY29udGV4dHMuCi0gKiBAc2l6ZTogU2l6ZSBvZiB0aGUgY29udGV4dCBkYXRh Ci0gKiBAYnl0ZXM6IFRoZSByYXcgY29udGV4dCBkYXRhIGdpdmVuIHRvIEhXCi0gKiBAZG1hOiBk bWEgYWRkcmVzcyBvZiB0aGUgYnl0ZXMKLSAqCi0gKiBSZXByZXNlbnRzIGVpdGhlciBhIERldmlj ZSBvciBJbnB1dCBjb250ZXh0LiAgSG9sZHMgYSBwb2ludGVyIHRvIHRoZSByYXcKLSAqIG1lbW9y eSB1c2VkIGZvciB0aGUgY29udGV4dCAoYnl0ZXMpIGFuZCBkbWEgYWRkcmVzcyBvZiBpdCAoZG1h KS4KLSAqLwotc3RydWN0IHhoY2lfY29udGFpbmVyX2N0eCB7Ci0JdW5zaWduZWQgdHlwZTsKLSNk ZWZpbmUgWEhDSV9DVFhfVFlQRV9ERVZJQ0UgIDB4MQotI2RlZmluZSBYSENJX0NUWF9UWVBFX0lO UFVUICAgMHgyCi0KLQlpbnQgc2l6ZTsKLQotCXU4ICpieXRlczsKLQlkbWFfYWRkcl90IGRtYTsK LX07Ci0KLS8qKgotICogc3RydWN0IHhoY2lfc2xvdF9jdHgKLSAqIEBkZXZfaW5mbzoJUm91dGUg c3RyaW5nLCBkZXZpY2Ugc3BlZWQsIGh1YiBpbmZvLCBhbmQgbGFzdCB2YWxpZCBlbmRwb2ludAot ICogQGRldl9pbmZvMjoJTWF4IGV4aXQgbGF0ZW5jeSBmb3IgZGV2aWNlIG51bWJlciwgcm9vdCBo dWIgcG9ydCBudW1iZXIKLSAqIEB0dF9pbmZvOgl0dF9pbmZvIGlzIHVzZWQgdG8gY29uc3RydWN0 IHNwbGl0IHRyYW5zYWN0aW9uIHRva2VucwotICogQGRldl9zdGF0ZToJc2xvdCBzdGF0ZSBhbmQg ZGV2aWNlIGFkZHJlc3MKLSAqCi0gKiBTbG90IENvbnRleHQgLSBzZWN0aW9uIDYuMi4xLjEuICBU aGlzIGFzc3VtZXMgdGhlIEhDIHVzZXMgMzItYnl0ZSBjb250ZXh0Ci0gKiBzdHJ1Y3R1cmVzLiAg SWYgdGhlIEhDIHVzZXMgNjQtYnl0ZSBjb250ZXh0cywgdGhlcmUgaXMgYW4gYWRkaXRpb25hbCAz MiBieXRlcwotICogcmVzZXJ2ZWQgYXQgdGhlIGVuZCBvZiB0aGUgc2xvdCBjb250ZXh0IGZvciBI QyBpbnRlcm5hbCB1c2UuCi0gKi8KLXN0cnVjdCB4aGNpX3Nsb3RfY3R4IHsKLQlfX2xlMzIJZGV2 X2luZm87Ci0JX19sZTMyCWRldl9pbmZvMjsKLQlfX2xlMzIJdHRfaW5mbzsKLQlfX2xlMzIJZGV2 X3N0YXRlOwotCS8qIG9mZnNldCAweDEwIHRvIDB4MWYgcmVzZXJ2ZWQgZm9yIEhDIGludGVybmFs IHVzZSAqLwotCV9fbGUzMglyZXNlcnZlZFs0XTsKLX07Ci0KLS8qIGRldl9pbmZvIGJpdG1hc2tz ICovCi0vKiBSb3V0ZSBTdHJpbmcgLSAwOjE5ICovCi0jZGVmaW5lIFJPVVRFX1NUUklOR19NQVNL CTB4ZmZmZmYKLS8qIERldmljZSBzcGVlZCAtIHZhbHVlcyBkZWZpbmVkIGJ5IFBPUlRTQyBEZXZp Y2UgU3BlZWQgZmllbGQgLSAyMDoyMyAqLwotI2RlZmluZSBERVZfU1BFRUQJCSgweGYgPDwgMjAp Ci0vKiBiaXQgMjQgcmVzZXJ2ZWQgKi8KLS8qIElzIHRoaXMgTFMvRlMgZGV2aWNlIGNvbm5lY3Rl ZCB0aHJvdWdoIGEgSFMgaHViPyAtIGJpdCAyNSAqLwotI2RlZmluZSBERVZfTVRUCQkJQklUKDI1 KQotLyogU2V0IGlmIHRoZSBkZXZpY2UgaXMgYSBodWIgLSBiaXQgMjYgKi8KLSNkZWZpbmUgREVW X0hVQgkJCUJJVCgyNikKLS8qIEluZGV4IG9mIHRoZSBsYXN0IHZhbGlkIGVuZHBvaW50IGNvbnRl eHQgaW4gdGhpcyBkZXZpY2UgY29udGV4dCAtIDI3OjMxICovCi0jZGVmaW5lIExBU1RfQ1RYX01B U0sJCSgweDFmIDw8IDI3KQotI2RlZmluZSBMQVNUX0NUWChwKQkJKChwKSA8PCAyNykKLSNkZWZp bmUgTEFTVF9DVFhfVE9fRVBfTlVNKHApCSgoKHApID4+IDI3KSAtIDEpCi0jZGVmaW5lIFNMT1Rf RkxBRwkJQklUKDApCi0jZGVmaW5lIEVQMF9GTEFHCQlCSVQoMSkKLQotLyogZGV2X2luZm8yIGJp dG1hc2tzICovCi0vKiBNYXggRXhpdCBMYXRlbmN5IChtcykgLSB3b3JzdCBjYXNlIHRpbWUgdG8g d2FrZSB1cCBhbGwgbGlua3MgaW4gZGV2IHBhdGggKi8KLSNkZWZpbmUgTUFYX0VYSVQJCTB4ZmZm ZgotLyogUm9vdCBodWIgcG9ydCBudW1iZXIgdGhhdCBpcyBuZWVkZWQgdG8gYWNjZXNzIHRoZSBV U0IgZGV2aWNlICovCi0jZGVmaW5lIFJPT1RfSFVCX1BPUlQocCkJKCgocCkgJiAweGZmKSA8PCAx NikKLSNkZWZpbmUgREVWSU5GT19UT19ST09UX0hVQl9QT1JUKHApCSgoKHApID4+IDE2KSAmIDB4 ZmYpCi0vKiBNYXhpbXVtIG51bWJlciBvZiBwb3J0cyB1bmRlciBhIGh1YiBkZXZpY2UgKi8KLSNk ZWZpbmUgWEhDSV9NQVhfUE9SVFMocCkJKCgocCkgJiAweGZmKSA8PCAyNCkKLQotLyogdHRfaW5m byBiaXRtYXNrcyAqLwotLyoKLSAqIFRUIEh1YiBTbG90IElEIC0gZm9yIGxvdyBvciBmdWxsIHNw ZWVkIGRldmljZXMgYXR0YWNoZWQgdG8gYSBoaWdoLXNwZWVkIGh1YgotICogVGhlIFNsb3QgSUQg b2YgdGhlIGh1YiB0aGF0IGlzb2xhdGVzIHRoZSBoaWdoIHNwZWVkIHNpZ25hbGluZyBmcm9tCi0g KiB0aGlzIGxvdyBvciBmdWxsLXNwZWVkIGRldmljZS4gICcwJyBpZiBhdHRhY2hlZCB0byByb290 IGh1YiBwb3J0LgotICovCi0jZGVmaW5lIFRUX1NMT1QJCQkweGZmCi0vKgotICogVGhlIG51bWJl ciBvZiB0aGUgZG93bnN0cmVhbSBmYWNpbmcgcG9ydCBvZiB0aGUgaGlnaC1zcGVlZCBodWIKLSAq ICcwJyBpZiB0aGUgZGV2aWNlIGlzIG5vdCBsb3cgb3IgZnVsbCBzcGVlZC4KLSAqLwotI2RlZmlu ZSBUVF9QT1JUCQkJKDB4ZmYgPDwgOCkKLSNkZWZpbmUgVFRfVEhJTktfVElNRShwKQkoKChwKSAm IDB4MykgPDwgMTYpCi0KLS8qIGRldl9zdGF0ZSBiaXRtYXNrcyAqLwotLyogVVNCIGRldmljZSBh ZGRyZXNzIC0gYXNzaWduZWQgYnkgdGhlIEhDICovCi0jZGVmaW5lIERFVl9BRERSX01BU0sJCTB4 ZmYKLS8qIGJpdHMgODoyNiByZXNlcnZlZCAqLwotLyogU2xvdCBzdGF0ZSAqLwotI2RlZmluZSBT TE9UX1NUQVRFCQkoMHgxZiA8PCAyNykKLSNkZWZpbmUgR0VUX1NMT1RfU1RBVEUocCkJKCgocCkg JiAoMHgxZiA8PCAyNykpID4+IDI3KQotCi0jZGVmaW5lIFNMT1RfU1RBVEVfRElTQUJMRUQJMHgw Ci0jZGVmaW5lIFNMT1RfU1RBVEVfRU5BQkxFRAlTTE9UX1NUQVRFX0RJU0FCTEVECi0jZGVmaW5l IFNMT1RfU1RBVEVfREVGQVVMVAkweDEKLSNkZWZpbmUgU0xPVF9TVEFURV9BRERSRVNTRUQJMHgy Ci0jZGVmaW5lIFNMT1RfU1RBVEVfQ09ORklHVVJFRCAgIDB4MwotCi0vKioKLSAqIHN0cnVjdCB4 aGNpX2VwX2N0eAotICogQGVwX2luZm86CWVuZHBvaW50IHN0YXRlLCBzdHJlYW1zLCBtdWx0LCBh bmQgaW50ZXJ2YWwgaW5mb3JtYXRpb24uCi0gKiBAZXBfaW5mbzI6CWluZm9ybWF0aW9uIG9uIGVu ZHBvaW50IHR5cGUsIG1heCBwYWNrZXQgc2l6ZSwgbWF4IGJ1cnN0IHNpemUsCi0gKiAJCWVycm9y IGNvdW50LCBhbmQgd2hldGhlciB0aGUgSEMgd2lsbCBmb3JjZSBhbiBldmVudCBmb3IgYWxsCi0g KiAJCXRyYW5zYWN0aW9ucy4KLSAqIEBkZXE6CTY0LWJpdCByaW5nIGRlcXVldWUgcG9pbnRlciBh ZGRyZXNzLiAgSWYgdGhlIGVuZHBvaW50IG9ubHkKLSAqIAkJZGVmaW5lcyBvbmUgc3RyZWFtLCB0 aGlzIHBvaW50cyB0byB0aGUgZW5kcG9pbnQgdHJhbnNmZXIgcmluZy4KLSAqIAkJT3RoZXJ3aXNl LCBpdCBwb2ludHMgdG8gYSBzdHJlYW0gY29udGV4dCBhcnJheSwgd2hpY2ggaGFzIGEKLSAqIAkJ cmluZyBwb2ludGVyIGZvciBlYWNoIGZsb3cuCi0gKiBAdHhfaW5mbzoJQXZlcmFnZSBUUkIgbGVu Z3RocyBmb3IgdGhlIGVuZHBvaW50IHJpbmcgYW5kCi0gKiAJCW1heCBwYXlsb2FkIHdpdGhpbiBh biBFbmRwb2ludCBTZXJ2aWNlIEludGVydmFsIFRpbWUgKEVTSVQpLgotICoKLSAqIEVuZHBvaW50 IENvbnRleHQgLSBzZWN0aW9uIDYuMi4xLjIuICBUaGlzIGFzc3VtZXMgdGhlIEhDIHVzZXMgMzIt Ynl0ZSBjb250ZXh0Ci0gKiBzdHJ1Y3R1cmVzLiAgSWYgdGhlIEhDIHVzZXMgNjQtYnl0ZSBjb250 ZXh0cywgdGhlcmUgaXMgYW4gYWRkaXRpb25hbCAzMiBieXRlcwotICogcmVzZXJ2ZWQgYXQgdGhl IGVuZCBvZiB0aGUgZW5kcG9pbnQgY29udGV4dCBmb3IgSEMgaW50ZXJuYWwgdXNlLgotICovCi1z dHJ1Y3QgeGhjaV9lcF9jdHggewotCV9fbGUzMgllcF9pbmZvOwotCV9fbGUzMgllcF9pbmZvMjsK LQlfX2xlNjQJZGVxOwotCV9fbGUzMgl0eF9pbmZvOwotCS8qIG9mZnNldCAweDE0IC0gMHgxZiBy ZXNlcnZlZCBmb3IgSEMgaW50ZXJuYWwgdXNlICovCi0JX19sZTMyCXJlc2VydmVkWzNdOwotfTsK LQotLyogZXBfaW5mbyBiaXRtYXNrcyAqLwotLyoKLSAqIEVuZHBvaW50IFN0YXRlIC0gYml0cyAw OjIKLSAqIDAgLSBkaXNhYmxlZAotICogMSAtIHJ1bm5pbmcKLSAqIDIgLSBoYWx0ZWQgZHVlIHRv IGhhbHQgY29uZGl0aW9uIC0gb2sgdG8gbWFuaXB1bGF0ZSBlbmRwb2ludCByaW5nCi0gKiAzIC0g c3RvcHBlZAotICogNCAtIFRSQiBlcnJvcgotICogNS03IC0gcmVzZXJ2ZWQKLSAqLwotI2RlZmlu ZSBFUF9TVEFURV9NQVNLCQkweGYKLSNkZWZpbmUgRVBfU1RBVEVfRElTQUJMRUQJMHgwCi0jZGVm aW5lIEVQX1NUQVRFX1JVTk5JTkcJMHgxCi0jZGVmaW5lIEVQX1NUQVRFX0hBTFRFRAkJMHgyCi0j ZGVmaW5lIEVQX1NUQVRFX1NUT1BQRUQJMHgzCi0jZGVmaW5lIEVQX1NUQVRFX0VSUk9SCQkweDQK LS8qIE11bHQgLSBNYXggbnVtYmVyIG9mIGJ1cnRzdCB3aXRoaW4gYW4gaW50ZXJ2YWwsIGluIEVQ IGNvbXBhbmlvbiBkZXNjLiAqLwotI2RlZmluZSBFUF9NVUxUKHApCQkoKChwKSAmIDB4MykgPDwg OCkKLSNkZWZpbmUgQ1RYX1RPX0VQX01VTFQocCkJKCgocCkgPj4gOCkgJiAweDMpCi0vKiBiaXRz IDEwOjE0IGFyZSBNYXggUHJpbWFyeSBTdHJlYW1zICovCi0vKiBiaXQgMTUgaXMgTGluZWFyIFN0 cmVhbSBBcnJheSAqLwotLyogSW50ZXJ2YWwgLSBwZXJpb2QgYmV0d2VlbiByZXF1ZXN0cyB0byBh biBlbmRwb2ludCAtIDEyNXUgaW5jcmVtZW50cy4gKi8KLSNkZWZpbmUgRVBfSU5URVJWQUwocCkJ CSgoKHApICYgMHhmZikgPDwgMTYpCi0jZGVmaW5lIEVQX0lOVEVSVkFMX1RPX1VGUkFNRVMocCkJ KDEgPDwgKCgocCkgPj4gMTYpICYgMHhmZikpCi0jZGVmaW5lIENUWF9UT19FUF9JTlRFUlZBTChw KQkoKChwKSA+PiAxNikgJiAweGZmKQotI2RlZmluZSBFUF9NQVhQU1RSRUFNU19NQVNLCSgweDFm IDw8IDEwKQotI2RlZmluZSBFUF9NQVhQU1RSRUFNUyhwKQkoKChwKSA8PCAxMCkgJiBFUF9NQVhQ U1RSRUFNU19NQVNLKQotLyogRW5kcG9pbnQgaXMgc2V0IHVwIHdpdGggYSBMaW5lYXIgU3RyZWFt IEFycmF5ICh2cy4gU2Vjb25kYXJ5IFN0cmVhbSBBcnJheSkgKi8KLSNkZWZpbmUgRVBfSEFTX0xT QQkJQklUKDE1KQotCi0vKiBlcF9pbmZvMiBiaXRtYXNrcyAqLwotLyoKLSAqIEZvcmNlIEV2ZW50 IC0gZ2VuZXJhdGUgdHJhbnNmZXIgZXZlbnRzIGZvciBhbGwgVFJCcyBmb3IgdGhpcyBlbmRwb2lu dAotICogVGhpcyB3aWxsIHRlbGwgdGhlIEhDIHRvIGlnbm9yZSB0aGUgSU9DIGFuZCBJU1AgZmxh Z3MgKGZvciBkZWJ1Z2dpbmcgb25seSkuCi0gKi8KLSNkZWZpbmUgRk9SQ0VfRVZFTlQJCUJJVCgw KQotI2RlZmluZSBFUlJPUl9DT1VOVChwKQkJKCgocCkgJiAweDMpIDw8IDEpCi0jZGVmaW5lIENU WF9UT19FUF9UWVBFKHApCSgoKHApID4+IDMpICYgMHg3KQotI2RlZmluZSBFUF9UWVBFKHApCQko KHApIDw8IDMpCi0jZGVmaW5lIElTT0NfT1VUX0VQCQkweDEKLSNkZWZpbmUgQlVMS19PVVRfRVAJ CTB4MgotI2RlZmluZSBJTlRfT1VUX0VQCQkweDMKLSNkZWZpbmUgQ1RSTF9FUAkJCTB4NAotI2Rl ZmluZSBJU09DX0lOX0VQCQkweDUKLSNkZWZpbmUgQlVMS19JTl9FUAkJMHg2Ci0jZGVmaW5lIElO VF9JTl9FUAkJMHg3Ci0vKiBiaXQgNiByZXNlcnZlZCAqLwotLyogYml0IDcgaXMgSG9zdCBJbml0 aWF0ZSBEaXNhYmxlIC0gZm9yIGRpc2FibGluZyBzdHJlYW0gc2VsZWN0aW9uICovCi0jZGVmaW5l IE1BWF9CVVJTVChwKQkJKCgocCkgJiAweGZmKSA8PCA4KQotI2RlZmluZSBDVFhfVE9fTUFYX0JV UlNUKHApCSgoKHApID4+IDgpICYgMHhmZikKLSNkZWZpbmUgTUFYX1BBQ0tFVChwKQkJKCgocCkg JiAweGZmZmYpIDw8IDE2KQotI2RlZmluZSBNQVhfUEFDS0VUX01BU0sJCSgweGZmZmYgPDwgMTYp Ci0jZGVmaW5lIE1BWF9QQUNLRVRfREVDT0RFRChwKQkoKChwKSA+PiAxNikgJiAweGZmZmYpCi0K LS8qIEdldCBtYXggcGFja2V0IHNpemUgZnJvbSBlcCBkZXNjLiBCaXQgMTAuLjAgc3BlY2lmeSB0 aGUgbWF4IHBhY2tldCBzaXplLgotICogVVNCMi4wIHNwZWMgOS42LjYuCi0gKi8KLSNkZWZpbmUg R0VUX01BWF9QQUNLRVQocCkJKChwKSAmIDB4N2ZmKQotCi0vKiB0eF9pbmZvIGJpdG1hc2tzICov Ci0jZGVmaW5lIEFWR19UUkJfTEVOR1RIX0ZPUl9FUChwKQkoKHApICYgMHhmZmZmKQotI2RlZmlu ZSBNQVhfRVNJVF9QQVlMT0FEX0ZPUl9FUChwKQkoKChwKSAmIDB4ZmZmZikgPDwgMTYpCi0jZGVm aW5lIENUWF9UT19NQVhfRVNJVF9QQVlMT0FEKHApCSgoKHApID4+IDE2KSAmIDB4ZmZmZikKLQot LyogZGVxIGJpdG1hc2tzICovCi0jZGVmaW5lIEVQX0NUWF9DWUNMRV9NQVNLCUJJVCgwKQotI2Rl ZmluZSBTQ1RYX0RFUV9NQVNLCQkofjB4ZkwpCi0KLS8qKgotICogc3RydWN0IHhoY2lfaW5wdXRf Y29udHJvbF9jb250ZXh0Ci0gKiBJbnB1dCBjb250cm9sIGNvbnRleHQ7IHNlZSBzZWN0aW9uIDYu Mi41LgotICoKLSAqIEBkcm9wX2NvbnRleHQ6CXNldCB0aGUgYml0IG9mIHRoZSBlbmRwb2ludCBj b250ZXh0IHlvdSB3YW50IHRvIGRpc2FibGUKLSAqIEBhZGRfY29udGV4dDoJc2V0IHRoZSBiaXQg b2YgdGhlIGVuZHBvaW50IGNvbnRleHQgeW91IHdhbnQgdG8gZW5hYmxlCi0gKi8KLXN0cnVjdCB4 aGNpX2lucHV0X2NvbnRyb2xfY3R4IHsKLQlfX2xlMzIJZHJvcF9mbGFnczsKLQlfX2xlMzIJYWRk X2ZsYWdzOwotCV9fbGUzMglyc3ZkMls2XTsKLX07Ci0KLSNkZWZpbmUgRVBfSVNfQURERUQoY3Ry bF9jdHgsIGkpCVwKLQkobGUzMl90b19jcHUoY3RybF9jdHgtPmFkZF9mbGFncykgJiAoMSA8PCAo aSArIDEpKSkKLSNkZWZpbmUgRVBfSVNfRFJPUFBFRChjdHJsX2N0eCwgaSkJXAotCShsZTMyX3Rv X2NwdShjdHJsX2N0eC0+ZHJvcF9mbGFncykgJiAoMSA8PCAoaSArIDEpKSkKLQotLyogZHJvcCBj b250ZXh0IGJpdG1hc2tzICovCi0jZGVmaW5lIERST1BfRVAoeCkJQklUKHgpCi0vKiBhZGQgY29u dGV4dCBiaXRtYXNrcyAqLwotI2RlZmluZSBBRERfRVAoeCkJQklUKHgpCi0KLXN0cnVjdCB4aGNp X3N0cmVhbV9jdHggewotCS8qIDY0LWJpdCBzdHJlYW0gcmluZyBhZGRyZXNzLCBjeWNsZSBzdGF0 ZSwgYW5kIHN0cmVhbSB0eXBlICovCi0JX19sZTY0CXN0cmVhbV9yaW5nOwotCS8qIG9mZnNldCAw eDE0IC0gMHgxZiByZXNlcnZlZCBmb3IgSEMgaW50ZXJuYWwgdXNlICovCi0JX19sZTMyCXJlc2Vy dmVkWzJdOwotfTsKLQotLyogU3RyZWFtIENvbnRleHQgVHlwZXMgKHNlY3Rpb24gNi40LjEpIC0g Yml0cyAzOjEgb2Ygc3RyZWFtIGN0eCBkZXEgcHRyICovCi0jZGVmaW5lIFNDVF9GT1JfQ1RYKHAp CQkoKChwKSAmIDB4NykgPDwgMSkKLS8qIFNlY29uZGFyeSBzdHJlYW0gYXJyYXkgdHlwZSwgZGVx dWV1ZSBwb2ludGVyIGlzIHRvIGEgdHJhbnNmZXIgcmluZyAqLwotI2RlZmluZSBTQ1RfU0VDX1RS CQkweDAKLS8qIFByaW1hcnkgc3RyZWFtIGFycmF5IHR5cGUsIGRlcXVldWUgcG9pbnRlciBpcyB0 byBhIHRyYW5zZmVyIHJpbmcgKi8KLSNkZWZpbmUgU0NUX1BSSV9UUgkJMHgxCi0vKiBEZXF1ZXVl IHBvaW50ZXIgaXMgZm9yIGEgc2Vjb25kYXJ5IHN0cmVhbSBhcnJheSAoU1NBKSB3aXRoIDggZW50 cmllcyAqLwotI2RlZmluZSBTQ1RfU1NBXzgJCTB4MgotI2RlZmluZSBTQ1RfU1NBXzE2CQkweDMK LSNkZWZpbmUgU0NUX1NTQV8zMgkJMHg0Ci0jZGVmaW5lIFNDVF9TU0FfNjQJCTB4NQotI2RlZmlu ZSBTQ1RfU1NBXzEyOAkJMHg2Ci0jZGVmaW5lIFNDVF9TU0FfMjU2CQkweDcKLQotI2RlZmluZSBT TUFMTF9TVFJFQU1fQVJSQVlfU0laRQkJMjU2Ci0jZGVmaW5lIE1FRElVTV9TVFJFQU1fQVJSQVlf U0laRQkxMDI0Ci0KLS8qICJCbG9jayIgc2l6ZXMgaW4gYnl0ZXMgdGhlIGhhcmR3YXJlIHVzZXMg Zm9yIGRpZmZlcmVudCBkZXZpY2Ugc3BlZWRzLgotICogVGhlIGxvZ2ljIGluIHRoaXMgcGFydCBv ZiB0aGUgaGFyZHdhcmUgbGltaXRzIHRoZSBudW1iZXIgb2YgYml0cyB0aGUgaGFyZHdhcmUKLSAq IGNhbiB1c2UsIHNvIG11c3QgcmVwcmVzZW50IGJhbmR3aWR0aCBpbiBhIGxlc3MgcHJlY2lzZSBt YW5uZXIgdG8gbWltaWMgd2hhdAotICogdGhlIHNjaGVkdWxlciBoYXJkd2FyZSBjb21wdXRlcy4K LSAqLwotI2RlZmluZSBGU19CTE9DSwkJMQotI2RlZmluZSBIU19CTE9DSwkJNAotI2RlZmluZSBT U19CTE9DSwkJMTYKLSNkZWZpbmUgRE1JX0JMT0NLCQkzMgotCi0vKiBFYWNoIGRldmljZSBzcGVl ZCBoYXMgYSBwcm90b2NvbCBvdmVyaGVhZCAoQ1JDLCBiaXQgc3R1ZmZpbmcsIGV0YykgYXNzb2Np YXRlZAotICogd2l0aCBlYWNoIGJ5dGUgdHJhbnNmZXJyZWQuICBTdXBlclNwZWVkIGRldmljZXMg aGF2ZSBhbiBpbml0aWFsIG92ZXJoZWFkIHRvCi0gKiBzZXQgdXAgYnVyc3RzLiAgVGhlc2UgYXJl IGluIGJsb2Nrcywgc2VlIGFib3ZlLiAgTFMgb3ZlcmhlYWQgaGFzIGFscmVhZHkgYmVlbgotICog dHJhbnNsYXRlZCBpbnRvIEZTIGJsb2Nrcy4KLSAqLwotI2RlZmluZSBETUlfT1ZFUkhFQUQJCTgK LSNkZWZpbmUgRE1JX09WRVJIRUFEX0JVUlNUCTQKLSNkZWZpbmUgU1NfT1ZFUkhFQUQJCTgKLSNk ZWZpbmUgU1NfT1ZFUkhFQURfQlVSU1QJMzIKLSNkZWZpbmUgSFNfT1ZFUkhFQUQJCTI2Ci0jZGVm aW5lIEZTX09WRVJIRUFECQkyMAotI2RlZmluZSBMU19PVkVSSEVBRAkJMTI4Ci0KLS8qIFRoZSBU VHMgbmVlZCB0byBjbGFpbSByb3VnaGx5IHR3aWNlIGFzIG11Y2ggYmFuZHdpZHRoICg5NCBieXRl cyBwZXIKLSAqIG1pY3JvZnJhbWUgfj0gMjRNYnBzKSBvZiB0aGUgSFMgYnVzIGFzIHRoZSBkZXZp Y2VzIGNhbiBhY3R1YWxseSB1c2UgYmVjYXVzZQotICogb2Ygb3ZlcmhlYWQgYXNzb2NpYXRlZCB3 aXRoIHNwbGl0IHRyYW5zZmVycyBjcm9zc2luZyBtaWNyb2ZyYW1lIGJvdW5kYXJpZXMuCi0gKiAz MSBibG9ja3MgaXMgcHVyZSBwcm90b2NvbCBvdmVyaGVhZC4KLSAqLwotI2RlZmluZSBUVF9IU19P VkVSSEVBRAkJKDMxICsgOTQpCi0jZGVmaW5lIFRUX0RNSV9PVkVSSEVBRAkJKDI1ICsgMTIpCi0K LS8qIEJhbmR3aWR0aCBsaW1pdHMgaW4gYmxvY2tzICovCi0jZGVmaW5lIEZTX0JXX0xJTUlUCQkx Mjg1Ci0jZGVmaW5lIFRUX0JXX0xJTUlUCQkxMzIwCi0jZGVmaW5lIEhTX0JXX0xJTUlUCQkxNjA3 Ci0jZGVmaW5lIFNTX0JXX0xJTUlUX0lOCQkzOTA2Ci0jZGVmaW5lIERNSV9CV19MSU1JVF9JTgkJ MzkwNgotI2RlZmluZSBTU19CV19MSU1JVF9PVVQJCTM5MDYKLSNkZWZpbmUgRE1JX0JXX0xJTUlU X09VVAkzOTA2Ci0KLS8qIFBlcmNlbnRhZ2Ugb2YgYnVzIGJhbmR3aWR0aCByZXNlcnZlZCBmb3Ig bm9uLXBlcmlvZGljIHRyYW5zZmVycyAqLwotI2RlZmluZSBGU19CV19SRVNFUlZFRAkJMTAKLSNk ZWZpbmUgSFNfQldfUkVTRVJWRUQJCTIwCi0jZGVmaW5lIFNTX0JXX1JFU0VSVkVECQkxMAotCi1l bnVtIHhoY2lfb3ZlcmhlYWRfdHlwZSB7Ci0JTFNfT1ZFUkhFQURfVFlQRSA9IDAsCi0JRlNfT1ZF UkhFQURfVFlQRSwKLQlIU19PVkVSSEVBRF9UWVBFLAotfTsKLQotc3RydWN0IHhoY2lfdHJhbnNm ZXJfZXZlbnQgewotCS8qIDY0LWJpdCBidWZmZXIgYWRkcmVzcywgb3IgaW1tZWRpYXRlIGRhdGEg Ki8KLQlfX2xlNjQJYnVmZmVyOwotCV9fbGUzMgl0cmFuc2Zlcl9sZW47Ci0JLyogVGhpcyBmaWVs ZCBpcyBpbnRlcnByZXRlZCBkaWZmZXJlbnRseSBiYXNlZCBvbiB0aGUgdHlwZSBvZiBUUkIgKi8K LQlfX2xlMzIJZmxhZ3M7Ci19OwotCi0vKiBUcmFuc2ZlciBldmVudCBUUkIgbGVuZ3RoIGJpdCBt YXNrICovCi0vKiBiaXRzIDA6MjMgKi8KLSNkZWZpbmUgRVZFTlRfVFJCX0xFTihwKQkoKHApICYg MHhmZmZmZmYpCi0KLS8qKiBUcmFuc2ZlciBFdmVudCBiaXQgZmllbGRzICoqLwotI2RlZmluZSBU UkJfVE9fRVBfSUQocCkJCSgoKHApID4+IDE2KSAmIDB4MWYpCi0KLS8qIENvbXBsZXRpb24gQ29k ZSAtIG9ubHkgYXBwbGljYWJsZSBmb3Igc29tZSB0eXBlcyBvZiBUUkJzICovCi0jZGVmaW5lIENP TVBfQ09ERV9NQVNLCQkoMHhmZiA8PCAyNCkKLSNkZWZpbmUgR0VUX0NPTVBfQ09ERShwKQkoKChw KSAmIENPTVBfQ09ERV9NQVNLKSA+PiAyNCkKLSNkZWZpbmUgQ09NUF9TVUNDRVNTCQkxCi0vKiBE YXRhIEJ1ZmZlciBFcnJvciAqLwotI2RlZmluZSBDT01QX0RCX0VSUgkJMgotLyogQmFiYmxlIERl dGVjdGVkIEVycm9yICovCi0jZGVmaW5lIENPTVBfQkFCQkxFCQkzCi0vKiBVU0IgVHJhbnNhY3Rp b24gRXJyb3IgKi8KLSNkZWZpbmUgQ09NUF9UWF9FUlIJCTQKLS8qIFRSQiBFcnJvciAtIHNvbWUg VFJCIGZpZWxkIGlzIGludmFsaWQgKi8KLSNkZWZpbmUgQ09NUF9UUkJfRVJSCQk1Ci0vKiBTdGFs bCBFcnJvciAtIFVTQiBkZXZpY2UgaXMgc3RhbGxlZCAqLwotI2RlZmluZSBDT01QX1NUQUxMCQk2 Ci0vKiBSZXNvdXJjZSBFcnJvciAtIEhDIGRvZXNuJ3QgaGF2ZSBtZW1vcnkgZm9yIHRoYXQgZGV2 aWNlIGNvbmZpZ3VyYXRpb24gKi8KLSNkZWZpbmUgQ09NUF9FTk9NRU0JCTcKLS8qIEJhbmR3aWR0 aCBFcnJvciAtIG5vdCBlbm91Z2ggcm9vbSBpbiBzY2hlZHVsZSBmb3IgdGhpcyBkZXYgY29uZmln ICovCi0jZGVmaW5lIENPTVBfQldfRVJSCQk4Ci0vKiBObyBTbG90cyBBdmFpbGFibGUgRXJyb3Ig LSBIQyByYW4gb3V0IG9mIGRldmljZSBzbG90cyAqLwotI2RlZmluZSBDT01QX0VOT1NMT1RTCQk5 Ci0vKiBJbnZhbGlkIFN0cmVhbSBUeXBlIEVycm9yICovCi0jZGVmaW5lIENPTVBfU1RSRUFNX0VS UgkJMTAKLS8qIFNsb3QgTm90IEVuYWJsZWQgRXJyb3IgLSBkb29yYmVsbCBydW5nIGZvciBkaXNh YmxlZCBkZXZpY2Ugc2xvdCAqLwotI2RlZmluZSBDT01QX0VCQURTTFQJCTExCi0vKiBFbmRwb2lu dCBOb3QgRW5hYmxlZCBFcnJvciAqLwotI2RlZmluZSBDT01QX0VCQURFUAkJMTIKLS8qIFNob3J0 IFBhY2tldCAqLwotI2RlZmluZSBDT01QX1NIT1JUX1RYCQkxMwotLyogUmluZyBVbmRlcnJ1biAt IGRvb3JiZWxsIHJ1bmcgZm9yIGFuIGVtcHR5IGlzb2MgT1VUIGVwIHJpbmcgKi8KLSNkZWZpbmUg Q09NUF9VTkRFUlJVTgkJMTQKLS8qIFJpbmcgT3ZlcnJ1biAtIGlzb2MgSU4gZXAgcmluZyBpcyBl bXB0eSB3aGVuIGVwIGlzIHNjaGVkdWxlZCB0byBSWCAqLwotI2RlZmluZSBDT01QX09WRVJSVU4J CTE1Ci0vKiBWaXJ0dWFsIEZ1bmN0aW9uIEV2ZW50IFJpbmcgRnVsbCBFcnJvciAqLwotI2RlZmlu ZSBDT01QX1ZGX0ZVTEwJCTE2Ci0vKiBQYXJhbWV0ZXIgRXJyb3IgLSBDb250ZXh0IHBhcmFtZXRl ciBpcyBpbnZhbGlkICovCi0jZGVmaW5lIENPTVBfRUlOVkFMCQkxNwotLyogQmFuZHdpZHRoIE92 ZXJydW4gRXJyb3IgLSBpc29jIGVwIGV4Y2VlZGVkIGl0cyBhbGxvY2F0ZWQgYmFuZHdpZHRoICov Ci0jZGVmaW5lIENPTVBfQldfT1ZFUgkJMTgKLS8qIENvbnRleHQgU3RhdGUgRXJyb3IgLSBpbGxl Z2FsIGNvbnRleHQgc3RhdGUgdHJhbnNpdGlvbiByZXF1ZXN0ZWQgKi8KLSNkZWZpbmUgQ09NUF9D VFhfU1RBVEUJCTE5Ci0vKiBObyBQaW5nIFJlc3BvbnNlIEVycm9yIC0gSEMgZGlkbid0IGdldCBQ SU5HX1JFU1BPTlNFIGluIHRpbWUgdG8gVFggKi8KLSNkZWZpbmUgQ09NUF9QSU5HX0VSUgkJMjAK LS8qIEV2ZW50IFJpbmcgaXMgZnVsbCAqLwotI2RlZmluZSBDT01QX0VSX0ZVTEwJCTIxCi0vKiBJ bmNvbXBhdGlibGUgRGV2aWNlIEVycm9yICovCi0jZGVmaW5lIENPTVBfREVWX0VSUgkJMjIKLS8q IE1pc3NlZCBTZXJ2aWNlIEVycm9yIC0gSEMgY291bGRuJ3Qgc2VydmljZSBhbiBpc29jIGVwIHdp dGhpbiBpbnRlcnZhbCAqLwotI2RlZmluZSBDT01QX01JU1NFRF9JTlQJCTIzCi0vKiBTdWNjZXNz ZnVsbHkgc3RvcHBlZCBjb21tYW5kIHJpbmcgKi8KLSNkZWZpbmUgQ09NUF9DTURfU1RPUAkJMjQK LS8qIFN1Y2Nlc3NmdWxseSBhYm9ydGVkIGN1cnJlbnQgY29tbWFuZCBhbmQgc3RvcHBlZCBjb21t YW5kIHJpbmcgKi8KLSNkZWZpbmUgQ09NUF9DTURfQUJPUlQJCTI1Ci0vKiBTdG9wcGVkIC0gdHJh bnNmZXIgd2FzIHRlcm1pbmF0ZWQgYnkgYSBzdG9wIGVuZHBvaW50IGNvbW1hbmQgKi8KLSNkZWZp bmUgQ09NUF9TVE9QCQkyNgotLyogU2FtZSBhcyBDT01QX0VQX1NUT1BQRUQsIGJ1dCB0aGUgdHJh bnNmZXJyZWQgbGVuZ3RoIGluIHRoZSBldmVudCBpcyBpbnZhbGlkICovCi0jZGVmaW5lIENPTVBf U1RPUF9JTlZBTAkJMjcKLS8qIENvbnRyb2wgQWJvcnQgRXJyb3IgLSBEZWJ1ZyBDYXBhYmlsaXR5 IC0gY29udHJvbCBwaXBlIGFib3J0ZWQgKi8KLSNkZWZpbmUgQ09NUF9EQkdfQUJPUlQJCTI4Ci0v KiBNYXggRXhpdCBMYXRlbmN5IFRvbyBMYXJnZSBFcnJvciAqLwotI2RlZmluZSBDT01QX01FTF9F UlIJCTI5Ci0vKiBUUkIgdHlwZSAzMCByZXNlcnZlZCAqLwotLyogSXNvYyBCdWZmZXIgT3ZlcnJ1 biAtIGFuIGlzb2MgSU4gZXAgc2VudCBtb3JlIGRhdGEgdGhhbiBjb3VsZCBmaXQgaW4gVEQgKi8K LSNkZWZpbmUgQ09NUF9CVUZGX09WRVIJCTMxCi0vKiBFdmVudCBMb3N0IEVycm9yIC0geEhDIGhh cyBhbiAiaW50ZXJuYWwgZXZlbnQgb3ZlcnJ1biBjb25kaXRpb24iICovCi0jZGVmaW5lIENPTVBf SVNTVUVTCQkzMgotLyogVW5kZWZpbmVkIEVycm9yIC0gcmVwb3J0ZWQgd2hlbiBvdGhlciBlcnJv ciBjb2RlcyBkb24ndCBhcHBseSAqLwotI2RlZmluZSBDT01QX1VOS05PV04JCTMzCi0vKiBJbnZh bGlkIFN0cmVhbSBJRCBFcnJvciAqLwotI2RlZmluZSBDT01QX1NUUklEX0VSUgkJMzQKLS8qIFNl Y29uZGFyeSBCYW5kd2lkdGggRXJyb3IgLSBtYXkgYmUgcmV0dXJuZWQgYnkgYSBDb25maWd1cmUg RW5kcG9pbnQgY21kICovCi0jZGVmaW5lIENPTVBfMk5EX0JXX0VSUgkJMzUKLS8qIFNwbGl0IFRy YW5zYWN0aW9uIEVycm9yICovCi0jZGVmaW5lIENPTVBfU1BMSVRfRVJSCQkzNgotCi1zdHJ1Y3Qg eGhjaV9saW5rX3RyYiB7Ci0JLyogNjQtYml0IHNlZ21lbnQgcG9pbnRlciovCi0JX19sZTY0CXNl Z21lbnRfcHRyOwotCV9fbGUzMglpbnRyX3RhcmdldDsKLQlfX2xlMzIJY29udHJvbDsKLX07Ci0K LS8qIGNvbnRyb2wgYml0ZmllbGRzICovCi0jZGVmaW5lIExJTktfVE9HR0xFCQlCSVQoMSkKLQot LyogQ29tbWFuZCBjb21wbGV0aW9uIGV2ZW50IFRSQiAqLwotc3RydWN0IHhoY2lfZXZlbnRfY21k IHsKLQkvKiBQb2ludGVyIHRvIGNvbW1hbmQgVFJCLCBvciB0aGUgdmFsdWUgcGFzc2VkIGJ5IHRo ZSBldmVudCBkYXRhIHRyYiAqLwotCV9fbGU2NAljbWRfdHJiOwotCV9fbGUzMglzdGF0dXM7Ci0J X19sZTMyCWZsYWdzOwotfTsKLQotLyogZmxhZ3MgYml0bWFza3MgKi8KLQotLyogQWRkcmVzcyBk ZXZpY2UgLSBkaXNhYmxlIFNldEFkZHJlc3MgKi8KLSNkZWZpbmUgVFJCX0JTUgkJCUJJVCg5KQot ZW51bSB4aGNpX3NldHVwX2RldiB7Ci0JU0VUVVBfQ09OVEVYVF9PTkxZLAotCVNFVFVQX0NPTlRF WFRfQUREUkVTUywKLX07Ci0KLS8qIGJpdHMgMTY6MjMgYXJlIHRoZSB2aXJ0dWFsIGZ1bmN0aW9u IElEICovCi0vKiBiaXRzIDI0OjMxIGFyZSB0aGUgc2xvdCBJRCAqLwotI2RlZmluZSBUUkJfVE9f U0xPVF9JRChwKQkoKChwKSAmICgweGZmPDwyNCkpID4+IDI0KQotI2RlZmluZSBTTE9UX0lEX0ZP Ul9UUkIocCkJKCgocCkgJiAweGZmKSA8PCAyNCkKLQotLyogQ29uZmlndXJlIEVuZHBvaW50IENv bW1hbmQgVFJCIC0gZGVjb25maWd1cmUgKi8KLSNkZWZpbmUgVFJCX0RDCQkJQklUKDkpCi0KLS8q IFN0b3AgRW5kcG9pbnQgVFJCIC0gZXBfaW5kZXggdG8gZW5kcG9pbnQgSUQgZm9yIHRoaXMgVFJC ICovCi0jZGVmaW5lIFRSQl9UT19FUF9JTkRFWChwKQkoKCgocCkgJiAoMHgxZiA8PCAxNikpID4+ IDE2KSAtIDEpCi0jZGVmaW5lIEVQX0lEX0ZPUl9UUkIocCkJKCgoKHApICsgMSkgJiAweDFmKSA8 PCAxNikKLQotI2RlZmluZSBTVVNQRU5EX1BPUlRfRk9SX1RSQihwKQkoKChwKSAmIDEpIDw8IDIz KQotI2RlZmluZSBUUkJfVE9fU1VTUEVORF9QT1JUKHApCSgoKHApICYgKDEgPDwgMjMpKSA+PiAy MykKLSNkZWZpbmUgTEFTVF9FUF9JTkRFWAkJMzAKLQotLyogU2V0IFRSIERlcXVldWUgUG9pbnRl ciBjb21tYW5kIFRSQiBmaWVsZHMsIDYuNC4zLjkgKi8KLSNkZWZpbmUgVFJCX1RPX1NUUkVBTV9J RChwKQkoKCgocCkgJiAoMHhmZmZmIDw8IDE2KSkgPj4gMTYpKQotI2RlZmluZSBTVFJFQU1fSURf Rk9SX1RSQihwKQkoKCgocCkpICYgMHhmZmZmKSA8PCAxNikKLSNkZWZpbmUgU0NUX0ZPUl9UUkIo cCkJCSgoKHApIDw8IDEpICYgMHg3KQotCi0vKiBQb3J0IFN0YXR1cyBDaGFuZ2UgRXZlbnQgVFJC IGZpZWxkcyAqLwotLyogUG9ydCBJRCAtIGJpdHMgMzE6MjQgKi8KLSNkZWZpbmUgR0VUX1BPUlRf SUQocCkJCSgoKHApICYgKDB4ZmYgPDwgMjQpKSA+PiAyNCkKLQotLyogTm9ybWFsIFRSQiBmaWVs ZHMgKi8KLS8qIHRyYW5zZmVyX2xlbiBiaXRtYXNrcyAtIGJpdHMgMDoxNiAqLwotI2RlZmluZSBU UkJfTEVOKHApCQkoKHApICYgMHgxZmZmZikKLS8qIEludGVycnVwdGVyIFRhcmdldCAtIHdoaWNo IE1TSS1YIHZlY3RvciB0byB0YXJnZXQgdGhlIGNvbXBsZXRpb24gZXZlbnQgYXQgKi8KLSNkZWZp bmUgVFJCX0lOVFJfVEFSR0VUKHApCSgoKHApICYgMHgzZmYpIDw8IDIyKQotI2RlZmluZSBHRVRf SU5UUl9UQVJHRVQocCkJKCgocCkgPj4gMjIpICYgMHgzZmYpCi0jZGVmaW5lIFRSQl9UQkMocCkJ CSgoKHApICYgMHgzKSA8PCA3KQotI2RlZmluZSBUUkJfVExCUEMocCkJCSgoKHApICYgMHhmKSA8 PCAxNikKLQotLyogQ3ljbGUgYml0IC0gaW5kaWNhdGVzIFRSQiBvd25lcnNoaXAgYnkgSEMgb3Ig SENEICovCi0jZGVmaW5lIFRSQl9DWUNMRQkJQklUKDApCi0vKgotICogRm9yY2UgbmV4dCBldmVu dCBkYXRhIFRSQiB0byBiZSBldmFsdWF0ZWQgYmVmb3JlIHRhc2sgc3dpdGNoLgotICogVXNlZCB0 byBwYXNzIE9TIGRhdGEgYmFjayBhZnRlciBhIFREIGNvbXBsZXRlcy4KLSAqLwotI2RlZmluZSBU UkJfRU5UCQkJQklUKDEpCi0vKiBJbnRlcnJ1cHQgb24gc2hvcnQgcGFja2V0ICovCi0jZGVmaW5l IFRSQl9JU1AJCQlCSVQoMikKLS8qIFNldCBQQ0llIG5vIHNub29wIGF0dHJpYnV0ZSAqLwotI2Rl ZmluZSBUUkJfTk9fU05PT1AJCUJJVCgzKQotLyogQ2hhaW4gbXVsdGlwbGUgVFJCcyBpbnRvIGEg VEQgKi8KLSNkZWZpbmUgVFJCX0NIQUlOCQlCSVQoNCkKLS8qIEludGVycnVwdCBvbiBjb21wbGV0 aW9uICovCi0jZGVmaW5lIFRSQl9JT0MJCQlCSVQoNSkKLS8qIFRoZSBidWZmZXIgcG9pbnRlciBj b250YWlucyBpbW1lZGlhdGUgZGF0YSAqLwotI2RlZmluZSBUUkJfSURUCQkJQklUKDYpCi0KLS8q IEJsb2NrIEV2ZW50IEludGVycnVwdCAqLwotI2RlZmluZSBUUkJfQkVJCQkJQklUKDkpCi0KLS8q IENvbnRyb2wgdHJhbnNmZXIgVFJCIHNwZWNpZmljIGZpZWxkcyAqLwotI2RlZmluZSBUUkJfRElS X0lOCQlCSVQoMTYpCi0jZGVmaW5lIFRSQl9UWF9UWVBFKHApCQkoKHApIDw8IDE2KQotI2RlZmlu ZSBUUkJfREFUQV9PVVQJCTIKLSNkZWZpbmUgVFJCX0RBVEFfSU4JCTMKLQotLyogSXNvY2hyb25v dXMgVFJCIHNwZWNpZmljIGZpZWxkcyAqLwotI2RlZmluZSBUUkJfU0lBCQkJQklUKDMxKQotCi1z dHJ1Y3QgeGhjaV9nZW5lcmljX3RyYiB7Ci0JX19sZTMyCWZpZWxkWzRdOwotfTsKLQotdW5pb24g eGhjaV90cmIgewotCXN0cnVjdCB4aGNpX2xpbmtfdHJiCQlsaW5rOwotCXN0cnVjdCB4aGNpX3Ry YW5zZmVyX2V2ZW50CXRyYW5zX2V2ZW50OwotCXN0cnVjdCB4aGNpX2V2ZW50X2NtZAkJZXZlbnRf Y21kOwotCXN0cnVjdCB4aGNpX2dlbmVyaWNfdHJiCQlnZW5lcmljOwotfTsKLQotLyogVFJCIGJp dCBtYXNrICovCi0jZGVmaW5lIFRSQl9UWVBFX0JJVE1BU0sJKDB4ZmMwMCkKLSNkZWZpbmUgVFJC X1RZUEUocCkJCSgocCkgPDwgMTApCi0jZGVmaW5lIFRSQl9GSUVMRF9UT19UWVBFKHApCSgoKHAp ICYgVFJCX1RZUEVfQklUTUFTSykgPj4gMTApCi0vKiBUUkIgdHlwZSBJRHMgKi8KLS8qIGJ1bGss IGludGVycnVwdCwgaXNvYyBzY2F0dGVyL2dhdGhlciwgYW5kIGNvbnRyb2wgZGF0YSBzdGFnZSAq LwotI2RlZmluZSBUUkJfTk9STUFMCQkxCi0vKiBzZXR1cCBzdGFnZSBmb3IgY29udHJvbCB0cmFu c2ZlcnMgKi8KLSNkZWZpbmUgVFJCX1NFVFVQCQkyCi0vKiBkYXRhIHN0YWdlIGZvciBjb250cm9s IHRyYW5zZmVycyAqLwotI2RlZmluZSBUUkJfREFUQQkJMwotLyogc3RhdHVzIHN0YWdlIGZvciBj b250cm9sIHRyYW5zZmVycyAqLwotI2RlZmluZSBUUkJfU1RBVFVTCQk0Ci0vKiBpc29jIHRyYW5z ZmVycyAqLwotI2RlZmluZSBUUkJfSVNPQwkJNQotLyogVFJCIGZvciBsaW5raW5nIHJpbmcgc2Vn bWVudHMgKi8KLSNkZWZpbmUgVFJCX0xJTksJCTYKLSNkZWZpbmUgVFJCX0VWRU5UX0RBVEEJCTcK LS8qIFRyYW5zZmVyIFJpbmcgTm8tb3AgKG5vdCBmb3IgdGhlIGNvbW1hbmQgcmluZykgKi8KLSNk ZWZpbmUgVFJCX1RSX05PT1AJCTgKLS8qIENvbW1hbmQgVFJCcyAqLwotLyogRW5hYmxlIFNsb3Qg Q29tbWFuZCAqLwotI2RlZmluZSBUUkJfRU5BQkxFX1NMT1QJCTkKLS8qIERpc2FibGUgU2xvdCBD b21tYW5kICovCi0jZGVmaW5lIFRSQl9ESVNBQkxFX1NMT1QJMTAKLS8qIEFkZHJlc3MgRGV2aWNl IENvbW1hbmQgKi8KLSNkZWZpbmUgVFJCX0FERFJfREVWCQkxMQotLyogQ29uZmlndXJlIEVuZHBv aW50IENvbW1hbmQgKi8KLSNkZWZpbmUgVFJCX0NPTkZJR19FUAkJMTIKLS8qIEV2YWx1YXRlIENv bnRleHQgQ29tbWFuZCAqLwotI2RlZmluZSBUUkJfRVZBTF9DT05URVhUCTEzCi0vKiBSZXNldCBF bmRwb2ludCBDb21tYW5kICovCi0jZGVmaW5lIFRSQl9SRVNFVF9FUAkJMTQKLS8qIFN0b3AgVHJh bnNmZXIgUmluZyBDb21tYW5kICovCi0jZGVmaW5lIFRSQl9TVE9QX1JJTkcJCTE1Ci0vKiBTZXQg VHJhbnNmZXIgUmluZyBEZXF1ZXVlIFBvaW50ZXIgQ29tbWFuZCAqLwotI2RlZmluZSBUUkJfU0VU X0RFUQkJMTYKLS8qIFJlc2V0IERldmljZSBDb21tYW5kICovCi0jZGVmaW5lIFRSQl9SRVNFVF9E RVYJCTE3Ci0vKiBGb3JjZSBFdmVudCBDb21tYW5kIChvcHQpICovCi0jZGVmaW5lIFRSQl9GT1JD RV9FVkVOVAkJMTgKLS8qIE5lZ290aWF0ZSBCYW5kd2lkdGggQ29tbWFuZCAob3B0KSAqLwotI2Rl ZmluZSBUUkJfTkVHX0JBTkRXSURUSAkxOQotLyogU2V0IExhdGVuY3kgVG9sZXJhbmNlIFZhbHVl IENvbW1hbmQgKG9wdCkgKi8KLSNkZWZpbmUgVFJCX1NFVF9MVAkJMjAKLS8qIEdldCBwb3J0IGJh bmR3aWR0aCBDb21tYW5kICovCi0jZGVmaW5lIFRSQl9HRVRfQlcJCTIxCi0vKiBGb3JjZSBIZWFk ZXIgQ29tbWFuZCAtIGdlbmVyYXRlIGEgdHJhbnNhY3Rpb24gb3IgbGluayBtYW5hZ2VtZW50IHBh Y2tldCAqLwotI2RlZmluZSBUUkJfRk9SQ0VfSEVBREVSCTIyCi0vKiBOby1vcCBDb21tYW5kIC0g bm90IGZvciB0cmFuc2ZlciByaW5ncyAqLwotI2RlZmluZSBUUkJfQ01EX05PT1AJCTIzCi0vKiBU UkIgSURzIDI0LTMxIHJlc2VydmVkICovCi0vKiBFdmVudCBUUkJTICovCi0vKiBUcmFuc2ZlciBF dmVudCAqLwotI2RlZmluZSBUUkJfVFJBTlNGRVIJCTMyCi0vKiBDb21tYW5kIENvbXBsZXRpb24g RXZlbnQgKi8KLSNkZWZpbmUgVFJCX0NPTVBMRVRJT04JCTMzCi0vKiBQb3J0IFN0YXR1cyBDaGFu Z2UgRXZlbnQgKi8KLSNkZWZpbmUgVFJCX1BPUlRfU1RBVFVTCQkzNAotLyogQmFuZHdpZHRoIFJl cXVlc3QgRXZlbnQgKG9wdCkgKi8KLSNkZWZpbmUgVFJCX0JBTkRXSURUSF9FVkVOVAkzNQotLyog RG9vcmJlbGwgRXZlbnQgKG9wdCkgKi8KLSNkZWZpbmUgVFJCX0RPT1JCRUxMCQkzNgotLyogSG9z dCBDb250cm9sbGVyIEV2ZW50ICovCi0jZGVmaW5lIFRSQl9IQ19FVkVOVAkJMzcKLS8qIERldmlj ZSBOb3RpZmljYXRpb24gRXZlbnQgLSBkZXZpY2Ugc2VudCBmdW5jdGlvbiB3YWtlIG5vdGlmaWNh dGlvbiAqLwotI2RlZmluZSBUUkJfREVWX05PVEUJCTM4Ci0vKiBNRklOREVYIFdyYXAgRXZlbnQg LSBtaWNyb2ZyYW1lIGNvdW50ZXIgd3JhcHBlZCAqLwotI2RlZmluZSBUUkJfTUZJTkRFWF9XUkFQ CTM5Ci0vKiBUUkIgSURzIDQwLTQ3IHJlc2VydmVkLCA0OC02MyBpcyB2ZW5kb3ItZGVmaW5lZCAq LwotCi0vKiBOZWMgdmVuZG9yLXNwZWNpZmljIGNvbW1hbmQgY29tcGxldGlvbiBldmVudC4gKi8K LSNkZWZpbmUgVFJCX05FQ19DTURfQ09NUAk0OAotLyogR2V0IE5FQyBmaXJtd2FyZSByZXZpc2lv bi4gKi8KLSNkZWZpbmUgVFJCX05FQ19HRVRfRlcJCTQ5Ci0KLSNkZWZpbmUgVFJCX1RZUEVfTElO Syh4KQkoKCh4KSAmIFRSQl9UWVBFX0JJVE1BU0spID09IFRSQl9UWVBFKFRSQl9MSU5LKSkKLS8q IEFib3ZlLCBidXQgZm9yIF9fbGUzMiB0eXBlcyAtLSBjYW4gYXZvaWQgd29yayBieSBzd2FwcGlu ZyBjb25zdGFudHM6ICovCi0jZGVmaW5lIFRSQl9UWVBFX0xJTktfTEUzMih4KQlcCi0JKCgoeCkg JiBjcHVfdG9fbGUzMihUUkJfVFlQRV9CSVRNQVNLKSkgPT0gY3B1X3RvX2xlMzIoVFJCX1RZUEUo VFJCX0xJTkspKSkKLSNkZWZpbmUgVFJCX1RZUEVfTk9PUF9MRTMyKHgpCVwKLQkoKCh4KSAmIGNw dV90b19sZTMyKFRSQl9UWVBFX0JJVE1BU0spKSA9PSBjcHVfdG9fbGUzMihUUkJfVFlQRShUUkJf VFJfTk9PUCkpKQotCi0jZGVmaW5lIE5FQ19GV19NSU5PUihwKQkJKCgocCkgPj4gMCkgJiAweGZm KQotI2RlZmluZSBORUNfRldfTUFKT1IocCkJCSgoKHApID4+IDgpICYgMHhmZikKLQotLyoKLSAq IFRSQlNfUEVSX1NFR01FTlQgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQsCi0gKiBzaW5jZSB0aGUg Y29tbWFuZCByaW5nIGlzIDY0LWJ5dGUgYWxpZ25lZC4KLSAqIEl0IG11c3QgYWxzbyBiZSBncmVh dGVyIHRoYW4gMTYuCi0gKi8KLSNkZWZpbmUgVFJCU19QRVJfU0VHTUVOVAk2NAotLyogQWxsb3cg dHdvIGNvbW1hbmRzICsgYSBsaW5rIFRSQiwgYWxvbmcgd2l0aCBhbnkgcmVzZXJ2ZWQgY29tbWFu ZCBUUkJzICovCi0jZGVmaW5lIE1BWF9SU1ZEX0NNRF9UUkJTCShUUkJTX1BFUl9TRUdNRU5UIC0g MykKLSNkZWZpbmUgVFJCX1NFR01FTlRfU0laRQkoVFJCU19QRVJfU0VHTUVOVCAqIDE2KQotI2Rl ZmluZSBUUkJfU0VHTUVOVF9TSElGVAkoaWxvZzIoVFJCX1NFR01FTlRfU0laRSkpCi0vKiBUUkIg YnVmZmVyIHBvaW50ZXJzIGNhbid0IGNyb3NzIDY0S0IgYm91bmRhcmllcyAqLwotI2RlZmluZSBU UkJfTUFYX0JVRkZfU0hJRlQJMTYKLSNkZWZpbmUgVFJCX01BWF9CVUZGX1NJWkUJKDEgPDwgVFJC X01BWF9CVUZGX1NISUZUKQotCi0vKiB4SENJIGNvbW1hbmQgZGVmYXVsdCB0aW1lb3V0IHZhbHVl ICovCi0jZGVmaW5lIFhIQ0lfQ01EX0RFRkFVTFRfVElNRU9VVAkoNSAqIFNFQ09ORCkKLQotc3Ry dWN0IHhoY2lfZXJzdF9lbnRyeSB7Ci0JLyogNjQtYml0IGV2ZW50IHJpbmcgc2VnbWVudCBhZGRy ZXNzICovCi0JX19sZTY0CXNlZ19hZGRyOwotCV9fbGUzMglzZWdfc2l6ZTsKLQkvKiBTZXQgdG8g emVybyAqLwotCV9fbGUzMglyc3ZkOwotfTsKLQotLyoKLSAqIEVhY2ggc2VnbWVudCB0YWJsZSBl bnRyeSBpcyA0KjMyYml0cyBsb25nLiAgMUsgc2VlbXMgbGlrZSBhbiBvayBzaXplOgotICogKDFL IGJ5dGVzICogOGJ5dGVzL2JpdCkgLyAoNCozMiBiaXRzKSA9IDY0IHNlZ21lbnQgZW50cmllcyBp biB0aGUgdGFibGUsCi0gKiBtZWFuaW5nIDY0IHJpbmcgc2VnbWVudHMuCi0gKiBJbml0aWFsIGFs bG9jYXRlZCBzaXplIG9mIHRoZSBFUlNULCBpbiBudW1iZXIgb2YgZW50cmllcyAqLwotI2RlZmlu ZSBFUlNUX05VTV9TRUdTCQkJMQotLyogSW5pdGlhbCBhbGxvY2F0ZWQgc2l6ZSBvZiB0aGUgRVJT VCwgaW4gbnVtYmVyIG9mIGVudHJpZXMgKi8KLSNkZWZpbmUgRVJTVF9TSVpFCQkJNjQKLS8qIElu aXRpYWwgbnVtYmVyIG9mIGV2ZW50IHNlZ21lbnQgcmluZ3MgYWxsb2NhdGVkICovCi0jZGVmaW5l IEVSU1RfRU5UUklFUwkJCTEKLS8qIFBvbGwgZXZlcnkgNjAgc2Vjb25kcyAqLwotI2RlZmluZSBQ T0xMX1RJTUVPVVQJCQk2MAotLyogU3RvcCBlbmRwb2ludCBjb21tYW5kIHRpbWVvdXQgKHNlY3Mp IGZvciBVUkIgY2FuY2VsbGF0aW9uIHdhdGNoZG9nIHRpbWVyICovCi0jZGVmaW5lIFhIQ0lfU1RP UF9FUF9DTURfVElNRU9VVAk1Ci0vKiBYWFg6IE1ha2UgdGhlc2UgbW9kdWxlIHBhcmFtZXRlcnMg Ki8KLQotLyoKLSAqIEl0IGNhbiB0YWtlIHVwIHRvIDIwIG1zIHRvIHRyYW5zaXRpb24gZnJvbSBS RXhpdCB0byBVMCBvbiB0aGUKLSAqIEludGVsIEx5bnggUG9pbnQgTFAgeEhDSSBob3N0LgotICov Ci0jZGVmaW5lIFhIQ0lfTUFYX1JFWElUX1RJTUVPVVQJKDIwICogTVNFQ09ORFMpCi0KLSNkZWZp bmUgWEhDSV9NQVhfRVhUX0NBUFMJNTAKLQotI2RlZmluZSBYSENJX0VYVF9QT1JUX01BSk9SKHgp CSgoKHgpID4+IDI0KSAmIDB4ZmYpCi0jZGVmaW5lIFhIQ0lfRVhUX1BPUlRfT0ZGKHgpCSgoeCkg JiAweGZmKQotI2RlZmluZSBYSENJX0VYVF9QT1JUX0NPVU5UKHgpCSgoKHgpID4+IDgpICYgMHhm ZikKLQotLyogRXh0ZW5kZWQgY2FwYWJpbGl0eSByZWdpc3RlciBmaWVsZHMgKi8KLSNkZWZpbmUg WEhDSV9FWFRfQ0FQU19JRChwKQkoKChwKT4+MCkmMHhmZikKLSNkZWZpbmUgWEhDSV9FWFRfQ0FQ U19ORVhUKHApCSgoKHApPj44KSYweGZmKQotI2RlZmluZSBYSENJX0VYVF9DQVBTX1ZBTChwKQko KHApPj4xNikKLS8qIEV4dGVuZGVkIGNhcGFiaWxpdHkgSURzIC0gSUQgMCByZXNlcnZlZCAqLwot I2RlZmluZSBYSENJX0VYVF9DQVBTX0xFR0FDWQkxCi0jZGVmaW5lIFhIQ0lfRVhUX0NBUFNfUFJP VE9DT0wJMgotI2RlZmluZSBYSENJX0VYVF9DQVBTX1BNCTMKLSNkZWZpbmUgWEhDSV9FWFRfQ0FQ U19WSVJUCTQKLSNkZWZpbmUgWEhDSV9FWFRfQ0FQU19ST1VURQk1Ci0vKiBJRHMgNi05IHJlc2Vy dmVkICovCi0jZGVmaW5lIFhIQ0lfRVhUX0NBUFNfREVCVUcJMTAKLS8qIFVTQiBMZWdhY3kgU3Vw cG9ydCBDYXBhYmlsaXR5IC0gc2VjdGlvbiA3LjEuMSAqLwotI2RlZmluZSBYSENJX0hDX0JJT1Nf T1dORUQJQklUKDE2KQotI2RlZmluZSBYSENJX0hDX09TX09XTkVECUJJVCgyNCkKLQotLyogVVNC IExlZ2FjeSBTdXBwb3J0IENhcGFiaWxpdHkgLSBzZWN0aW9uIDcuMS4xICovCi0vKiBBZGQgdGhp cyBvZmZzZXQsIHBsdXMgdGhlIHZhbHVlIG9mIHhFQ1AgaW4gSENDUEFSQU1TIHRvIHRoZSBiYXNl IGFkZHJlc3MgKi8KLSNkZWZpbmUgWEhDSV9MRUdBQ1lfU1VQUE9SVF9PRkZTRVQJMHgwMAotCi0v KiBVU0IgTGVnYWN5IFN1cHBvcnQgQ29udHJvbCBhbmQgU3RhdHVzIFJlZ2lzdGVyICAtIHNlY3Rp b24gNy4xLjIgKi8KLS8qIEFkZCB0aGlzIG9mZnNldCwgcGx1cyB0aGUgdmFsdWUgb2YgeEVDUCBp biBIQ0NQQVJBTVMgdG8gdGhlIGJhc2UgYWRkcmVzcyAqLwotI2RlZmluZSBYSENJX0xFR0FDWV9D T05UUk9MX09GRlNFVAkweDA0Ci0vKiBiaXRzIDE6MywgNToxMiwgYW5kIDE3OjE5IG5lZWQgdG8g YmUgcHJlc2VydmVkOyBiaXRzIDIxOjI4IHNob3VsZCBiZSB6ZXJvICovCi0jZGVmaW5lIFhIQ0lf TEVHQUNZX0RJU0FCTEVfU01JCQkoKDB4NyA8PCAxKSArICgweGZmIDw8IDUpICsgKDB4NyA8PCAx NykpCi0jZGVmaW5lIFhIQ0lfTEVHQUNZX1NNSV9FVkVOVFMJCSgweDcgPDwgMjkpCi0KLS8qIFVT QiAyLjAgeEhDSSAwLjk2IEwxQyBjYXBhYmlsaXR5IC0gc2VjdGlvbiA3LjIuMi4xLjMuMiAqLwot I2RlZmluZSBYSENJX0wxQwkJQklUKDE2KQotCi0vKiBVU0IgMi4wIHhIQ0kgMS4wIGhhcmR3YXJl IExNUCBjYXBhYmlsaXR5IC0gc2VjdGlvbiA3LjIuMi4xLjMuMiAqLwotI2RlZmluZSBYSENJX0hM QwkJQklUKDE5KQotI2RlZmluZSBYSENJX0JMQwkJQklUKDIwKQotCi0vKgotICogUmVnaXN0ZXJz IHNob3VsZCBhbHdheXMgYmUgYWNjZXNzZWQgd2l0aCBkb3VibGUgd29yZCBvciBxdWFkIHdvcmQg YWNjZXNzZXMuCi0gKgotICogU29tZSB4SENJIGltcGxlbWVudGF0aW9ucyBtYXkgc3VwcG9ydCA2 NC1iaXQgYWRkcmVzcyBwb2ludGVycy4gIFJlZ2lzdGVycwotICogd2l0aCA2NC1iaXQgYWRkcmVz cyBwb2ludGVycyBzaG91bGQgYmUgd3JpdHRlbiB0byB3aXRoIGR3b3JkIGFjY2Vzc2VzIGJ5Ci0g KiB3cml0aW5nIHRoZSBsb3cgZHdvcmQgZmlyc3QgKHB0clswXSksIHRoZW4gdGhlIGhpZ2ggZHdv cmQgKHB0clsxXSkgc2Vjb25kLgotICogeEhDSSBpbXBsZW1lbnRhdGlvbnMgdGhhdCBkbyBub3Qg c3VwcG9ydCA2NC1iaXQgYWRkcmVzcyBwb2ludGVycyB3aWxsIGlnbm9yZQotICogdGhlIGhpZ2gg ZHdvcmQsIGFuZCB3cml0ZSBvcmRlciBpcyBpcnJlbGV2YW50LgotICovCi1zdGF0aWMgaW5saW5l IHU2NCB4aGNpX3JlYWRfNjQoX19sZTY0IF9faW9tZW0gKnJlZ3MpCi17Ci0JcmV0dXJuIGxvX2hp X3JlYWRxKHJlZ3MpOwotfQotc3RhdGljIGlubGluZSB2b2lkIHhoY2lfd3JpdGVfNjQoY29uc3Qg dTY0IHZhbCwgX19sZTY0IF9faW9tZW0gKnJlZ3MpCi17Ci0JbG9faGlfd3JpdGVxKHZhbCwgcmVn cyk7Ci19Ci0KLS8qCi0gKiBCYXJlYm94IHhIQ0kgaG91c2VrZWVwaW5nIHN0cnVjdHMKLSAqLwot Ci1lbnVtIHhoY2lfcmluZ190eXBlIHsKLSAgICAgICAgVFlQRV9DVFJMID0gMCwKLSAgICAgICAg VFlQRV9JU09DLAotICAgICAgICBUWVBFX0JVTEssCi0gICAgICAgIFRZUEVfSU5UUiwKLSAgICAg ICAgVFlQRV9TVFJFQU0sCi0gICAgICAgIFRZUEVfQ09NTUFORCwKLSAgICAgICAgVFlQRV9FVkVO VCwKLX07Ci0KLXN0cnVjdCB4aGNpX3JpbmcgewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQl1 bmlvbiB4aGNpX3RyYiAqdHJiczsKLQl1bmlvbiB4aGNpX3RyYiAqZW5xdWV1ZTsKLQl1bmlvbiB4 aGNpX3RyYiAqZGVxdWV1ZTsKLQllbnVtIHhoY2lfcmluZ190eXBlIHR5cGU7Ci0JaW50IG51bV90 cmJzOwotCWludCBjeWNsZV9zdGF0ZTsKLX07Ci0KLXN0cnVjdCB4aGNpX3ZpcnR1YWxfZGV2aWNl IHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci0Jc3RydWN0IHVzYl9kZXZpY2UgKnVkZXY7Ci0J dm9pZCAqZG1hOwotCXNpemVfdCBkbWFfc2l6ZTsKLQlpbnQgc2xvdF9pZDsKLQlzdHJ1Y3QgeGhj aV9yaW5nICplcFtVU0JfTUFYRU5EUE9JTlRTXTsKLQlzdHJ1Y3QgeGhjaV9jb250YWluZXJfY3R4 ICppbl9jdHg7Ci0Jc3RydWN0IHhoY2lfY29udGFpbmVyX2N0eCAqb3V0X2N0eDsKLX07Ci0KLXN0 cnVjdCB1c2Jfcm9vdF9odWJfaW5mbyB7Ci0Jc3RydWN0IHVzYl9odWJfZGVzY3JpcHRvciBodWI7 Ci0Jc3RydWN0IHVzYl9kZXZpY2VfZGVzY3JpcHRvciBkZXZpY2U7Ci0Jc3RydWN0IHVzYl9jb25m aWdfZGVzY3JpcHRvciBjb25maWc7Ci0Jc3RydWN0IHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvciBp bnRlcmZhY2U7Ci0Jc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yIGVuZHBvaW50OwotfSBf X2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLXN0cnVjdCB4aGNpX2hjZCB7Ci0Jc3RydWN0IHVz Yl9ob3N0IGhvc3Q7Ci0Jc3RydWN0IGRldmljZV9kICpkZXY7Ci0Jc3RydWN0IHhoY2lfY2FwX3Jl Z3MgX19pb21lbSAqY2FwX3JlZ3M7Ci0Jc3RydWN0IHhoY2lfb3BfcmVncyBfX2lvbWVtICpvcF9y ZWdzOwotCXN0cnVjdCB4aGNpX3J1bl9yZWdzIF9faW9tZW0gKnJ1bl9yZWdzOwotCXN0cnVjdCB4 aGNpX2Rvb3JiZWxsX2FycmF5IF9faW9tZW0gKmRiYTsKLQlzdHJ1Y3QgeGhjaV9pbnRyX3JlZyBf X2lvbWVtICppcl9zZXQ7Ci0JLyogQ2FjaGVkIHJlZ2lzdGVyIGNvcGllcyBvZiByZWFkLW9ubHkg SEMgZGF0YSAqLwotCXUzMiBoY3NfcGFyYW1zMTsKLQl1MzIgaGNzX3BhcmFtczI7Ci0JdTMyIGhj c19wYXJhbXMzOwotCXUzMiBoY2NfY2FwYmFzZTsKLQl1MzIgaGNjX3BhcmFtczsKLQl1MTYgaGNp X3ZlcnNpb247Ci0JaW50IG1heF9zbG90czsKLQlpbnQgbnVtX3NwOwotCWludCBwYWdlX3NpemU7 Ci0JaW50IHBhZ2Vfc2hpZnQ7Ci0Jc2l6ZV90IGRtYV9zaXplOwotCV9fbGU2NCAqZGNiYWE7Ci0J dm9pZCAqc3A7Ci0JX19sZTY0ICpzcF9hcnJheTsKLQlzdHJ1Y3QgeGhjaV9yaW5nIGNtZF9yaW5n OwotCXN0cnVjdCB4aGNpX3JpbmcgZXZlbnRfcmluZzsKLQlzdHJ1Y3QgeGhjaV9yaW5nICpyaW5n czsKLQlzdHJ1Y3QgbGlzdF9oZWFkIHJpbmdzX2xpc3Q7Ci0Jc3RydWN0IHhoY2lfZXJzdF9lbnRy eSAqZXZlbnRfZXJzdDsKLQl1OCAqcG9ydF9hcnJheTsKLQlpbnQgcm9vdGRldjsKLQlzdHJ1Y3Qg bGlzdF9oZWFkIHZkZXZfbGlzdDsKLQl1MzIgKmV4dF9jYXBzOwotCXVuc2lnbmVkIGludCBudW1f ZXh0X2NhcHM7Ci0JX19sZTMyIF9faW9tZW0gKip1c2JfcG9ydHM7Ci0JdW5zaWduZWQgaW50IG51 bV91c2JfcG9ydHM7Ci0Jc3RydWN0IHVzYl9yb290X2h1Yl9pbmZvIHVzYl9pbmZvOwotfTsKLQot I2RlZmluZSB0b194aGNpX2hjZChfaCkJXAotCWNvbnRhaW5lcl9vZihfaCwgc3RydWN0IHhoY2lf aGNkLCBob3N0KQotCi1pbnQgeGhjaV9oYW5kc2hha2Uodm9pZCBfX2lvbWVtICpwLCB1MzIgbWFz aywgdTMyIGRvbmUsIGludCB1c2VjKTsKLQotaW50IHhoY2lfaXNzdWVfY29tbWFuZChzdHJ1Y3Qg eGhjaV9oY2QgKnhoY2ksIHVuaW9uIHhoY2lfdHJiICp0cmIpOwotaW50IHhoY2lfd2FpdF9mb3Jf ZXZlbnQoc3RydWN0IHhoY2lfaGNkICp4aGNpLCB1OCB0eXBlLCB1bmlvbiB4aGNpX3RyYiAqdHJi KTsKLQotaW50IHhoY2lfdmlydGRldl9yZXNldChzdHJ1Y3QgeGhjaV92aXJ0dWFsX2RldmljZSAq dmRldik7Ci1pbnQgeGhjaV92aXJ0ZGV2X2RldGFjaChzdHJ1Y3QgeGhjaV92aXJ0dWFsX2Rldmlj ZSAqdmRldik7Ci0KLWludCB4aGNpX2h1Yl9zZXR1cF9wb3J0cyhzdHJ1Y3QgeGhjaV9oY2QgKnho Y2kpOwotdm9pZCB4aGNpX2h1Yl9wb3J0X3Bvd2VyKHN0cnVjdCB4aGNpX2hjZCAqeGhjaSwgaW50 IHBvcnQsIGJvb2wgZW5hYmxlKTsKLWludCB4aGNpX2h1Yl9jb250cm9sKHN0cnVjdCB1c2JfZGV2 aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgcGlwZSwKLQkJICAgICB2b2lkICpidWZmZXIsIGludCBs ZW5ndGgsIHN0cnVjdCBkZXZyZXF1ZXN0ICpyZXEpOwotCi1zdGF0aWMgaW5saW5lIHZvaWQgeGhj aV9wcmludF90cmIoc3RydWN0IHhoY2lfaGNkICp4aGNpLAotCQkJCSAgdW5pb24geGhjaV90cmIg KnRyYiwgY29uc3QgY2hhciAqZGVzYykKLXsKLQlkZXZfZGJnKHhoY2ktPmRldiwgIiVzIFslMDh4 ICUwOHggJTA4eCAlMDh4XVxuIiwgZGVzYywKLQkJdHJiLT5nZW5lcmljLmZpZWxkWzBdLCB0cmIt PmdlbmVyaWMuZmllbGRbMV0sCi0JCXRyYi0+Z2VuZXJpYy5maWVsZFsyXSwgdHJiLT5nZW5lcmlj LmZpZWxkWzNdKTsKLX0KLQotI2VuZGlmCi0tIAoyLjI2LjAucmMyCgoKX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KYmFyZWJveCBtYWlsaW5nIGxpc3QKYmFy ZWJveEBsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxt YW4vbGlzdGluZm8vYmFyZWJveAo=