From mboxrd@z Thu Jan 1 00:00:00 1970 From: Daniel Kurtz Subject: [PATCH v7 1/3] iommu/rockchip: rk3288 iommu driver Date: Mon, 3 Nov 2014 10:53:27 +0800 Message-ID: <1414983209-2472-2-git-send-email-djkurtz@chromium.org> References: <1414983209-2472-1-git-send-email-djkurtz@chromium.org> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <1414983209-2472-1-git-send-email-djkurtz-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: iommu-bounces-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org Errors-To: iommu-bounces-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org To: =?UTF-8?q?Heiko=20St=C3=BCbner?= , Joerg Roedel Cc: "open list:OPEN FIRMWARE AND..." , Simon Xue , open list , Daniel Kurtz , "open list:ARM/Rockchip SoC..." , "open list:IOMMU DRIVERS" , Rob Herring , Grant Likely , "moderated list:ARM/Rockchip SoC..." List-Id: devicetree@vger.kernel.org VGhlIHJrMzI4OCBoYXMgc2V2ZXJhbCBpb21tdXMuICBFYWNoIGlvbW11IGJlbG9uZ3MgdG8gYSBz aW5nbGUgbWFzdGVyCmRldmljZS4gIFRoZXJlIGlzIG9uZSBkZXZpY2UgKElTUCkgdGhhdCBoYXMg dHdvIHNsYXZlIGlvbW11cywgYnV0IHRoYXQKY2FzZSBpcyBub3QgeWV0IHN1cHBvcnRlZCBieSB0 aGlzIGRyaXZlci4KCkF0IHN1YnN5cyBpbml0LCB0aGUgaW9tbXUgZHJpdmVyIHJlZ2lzdGVycyBp dHNlbGYgYXMgdGhlIGlvbW11IGRyaXZlciBmb3IKdGhlIHBsYXRmb3JtIGJ1cy4gIFRoZSBtYXN0 ZXIgZGV2aWNlcyBmaW5kIHRoZWlyIHNsYXZlIGlvbW11cyB1c2luZyB0aGUKImlvbW11cyIgZmll bGQgaW4gdGhlaXIgZGV2aWNldHJlZSBkZXNjcmlwdGlvbi4gIFNpbmNlIGVhY2ggc2xhdmUgaW9t bXUKYmVsb25ncyB0byBleGFjdGx5IG9uZSBtYXN0ZXIsIHRoZWlyIGlzIG5vIGFkZGl0aW9uYWwg ZGF0YSBuZWVkZWQgYXQgcHJvYmUKdG8gYXNzb2NpYXRlIGEgc2xhdmUgd2l0aCBpdHMgbWFzdGVy LgoKQW4gaW9tbXUgZGV2aWNlJ3MgcG93ZXIgZG9tYWluLCBjbG9jayBhbmQgaXJxIGFyZSBhbGwg c2hhcmVkIHdpdGggaXRzCm1hc3RlciBkZXZpY2UsIGFuZCB0aGUgbWFzdGVyIGRldmljZSBtdXN0 IGJlIGNhcmVmdWwgdG8gYXR0YWNoIGZyb20gdGhlCmlvbW11IG9ubHkgYWZ0ZXIgcG93ZXJpbmcg YW5kIGNsb2NraW5nIGl0IChhbmQgbGVhdmUgaXQgcG93ZXJlZCBhbmQKY2xvY2tlZCBiZWZvcmUg ZGV0YWNoaW5nKS4gIEJlY2F1c2UgdGhlaXIgaXMgbm8gZ3VhcmFudGVlIHdoYXQgdGhlIHN0YXR1 cwpvZiB0aGUgaW9tbXUgaXMgYXQgcHJvYmUsIGFuZCBzaW5jZSB0aGUgZHJpdmVyIGRvZXMgbm90 IGV2ZW4ga25vdyBpZiB0aGUKZGV2aWNlIGlzIHBvd2VyZWQsIHdlIGRlbGF5IHJlcXVlc3Rpbmcg aXRzIGlycSB1bnRpbCB0aGUgbWFzdGVyIGRldmljZQphdHRhY2hlcywgYXQgd2hpY2ggcG9pbnQg d2UgaGF2ZSBhIGd1YXJhbnRlZSB0aGF0IHRoZSBkZXZpY2UgaXMgcG93ZXJlZAphbmQgY2xvY2tl ZCBhbmQgd2UgY2FuIHJlc2V0IGl0IGFuZCBkaXNhYmxlIGl0cyBpbnRlcnJ1cHQgbWFzay4KCkFu IGlvbW11X2RvbWFpbiBkZXNjcmliZXMgYSB2aXJ0dWFsIGlvdmEgYWRkcmVzcyBzcGFjZS4gIEVh Y2ggaW9tbXVfZG9tYWluCmhhcyBhIGNvcnJlc3BvbmRpbmcgcGFnZSB0YWJsZSB0aGF0IGxpc3Rz IHRoZSBtYXBwaW5ncyBmcm9tIGlvdmEgdG8KcGh5c2ljYWwgYWRkcmVzcy4KCkZvciB0aGUgcmsz Mjg4IGlvbW11LCB0aGUgcGFnZSB0YWJsZSBoYXMgdHdvIGxldmVsczoKIFRoZSBMZXZlbCAxICJk aXJlY3RvcnlfdGFibGUiIGhhcyAxMDI0IDQtYnl0ZSBkdGUgZW50cmllcy4KIEVhY2ggZHRlIHBv aW50cyB0byBhIGxldmVsIDIgInBhZ2VfdGFibGUiLgogRWFjaCBsZXZlbCAyIHBhZ2VfdGFibGUg aGFzIDEwMjQgNC1ieXRlIHB0ZSBlbnRyaWVzLgogRWFjaCBwdGUgcG9pbnRzIHRvIGEgNCBLaUIg cGFnZSBvZiBtZW1vcnkuCgpBbiBpb21tdV9kb21haW4gaXMgY3JlYXRlZCB3aGVuIGEgZG1hX2lv bW11X21hcHBpbmcgaXMgY3JlYXRlZCB2aWEKYXJtX2lvbW11X2NyZWF0ZV9tYXBwaW5nLiAgTWFz dGVyIGRldmljZXMgY2FuIHRoZW4gYXR0YWNoIHRoZW1zZWx2ZXMgdG8KdGhpcyBtYXBwaW5nIChv ciBhdHRhY2ggdGhlIG1hcHBpbmcgdG8gdGhlbXNlbHZlcz8pIGJ5IGNhbGxpbmcKYXJtX2lvbW11 X2F0dGFjaF9kZXZpY2UoKS4gIFRoaXMgaW4gdHVybiBpbnN0cnVjdHMgdGhlIGlvbW11IGRyaXZl ciB0bwp3cml0ZSB0aGUgcGFnZSB0YWJsZSdzIHBoeXNpY2FsIGFkZHJlc3MgaW50byB0aGUgc2xh dmUgaW9tbXUncyAiRGlyZWN0b3J5ClRhYmxlIEVudHJ5IiAoRFRFKSByZWdpc3Rlci4KCkluIGZh Y3QgbXVsdGlwbGUgbWFzdGVyIGRldmljZXMsIGVhY2ggd2l0aCB0aGVpciBvd24gc2xhdmUgaW9t bXUgZGV2aWNlLApjYW4gYWxsIGF0dGFjaCB0byB0aGUgc2FtZSBtYXBwaW5nLiAgVGhlIGlvbW11 cyBmb3IgdGhlc2UgZGV2aWNlcyB3aWxsCnNoYXJlIHRoZSBzYW1lIGlvbW11X2RvbWFpbiBhbmQg dGhlcmVmb3JlIHBvaW50IHRvIHRoZSBzYW1lIHBhZ2UgdGFibGUuClRodXMsIHRoZSBpb21tdSBk b21haW4gbWFpbnRhaW5zIGEgbGlzdCBvZiBpb21tdSBkZXZpY2VzIHdoaWNoIGFyZQphdHRhY2hl ZC4gIFRoaXMgZHJpdmVyIHJlbGllcyBvbiB0aGUgaW9tbXUgY29yZSB0byBlbnN1cmUgdGhhdCBh bGwgZGV2aWNlcwpoYXZlIGRldGFjaGVkIGJlZm9yZSBkZXN0cm95aW5nIGEgZG9tYWluLgoKdjY6 IC0gYWRkIC5hZGQvcmVtb3ZlX2RldmljZSgpIGNhbGxiYWNrcy4KICAgIC0gcGFyc2UgcGxhdGZv cm1fZGV2aWNlIGRldmljZSB0cmVlIG5vZGVzIGZvciAiaW9tbXVzIiBwcm9wZXJ0eQogICAgLSBz dG9yZSBwbGF0Zm9ybSBkZXZpY2UgcG9pbnRlciBhcyBncm91cCBpb21tdWRhdGEKICAgIC0gQ2hl Y2sgZm9yIGV4aXN0ZW5jZSBvZiBpb21tdSBncm91cCBpbnN0ZWFkIG9mIHJlbHlpbmcgb24gYQog ICAgICBkZXZfZ2V0X2RydmRhdGEoKSB0byByZXR1cm4gTlVMTCBmb3IgYSBOVUxMIGRldmljZS4K CnY3OiAtIGZpeHVwIHNvbWUgc3RyaW5ncy4KICAgIC0gSW4gcmtfaW9tbXVfZGlzYWJsZV9wYWdp bmcoKSAjIGFuZCAlIHdlcmUgcmV2ZXJzZWQuCgpTaWduZWQtb2ZmLWJ5OiBEYW5pZWwgS3VydHog PGRqa3VydHpAY2hyb21pdW0ub3JnPgpTaWduZWQtb2ZmLWJ5OiBTaW1vbiBYdWUgPHh4bUByb2Nr LWNoaXBzLmNvbT4KUmV2aWV3ZWQtYnk6IEdyYW50IEdydW5kbGVyIDxncnVuZGxlckBjaHJvbWl1 bS5vcmc+ClJldmlld2VkLWJ5OiBTdMOpcGhhbmUgTWFyY2hlc2luIDxtYXJjaGV1QGNocm9taXVt Lm9yZz4KVGVzdGVkLWJ5OiBIZWlrbyBTdHVlYm5lciA8aGVpa29Ac250ZWNoLmRlPgotLS0KIGRy aXZlcnMvaW9tbXUvS2NvbmZpZyAgICAgICAgICB8ICAgMTIgKwogZHJpdmVycy9pb21tdS9NYWtl ZmlsZSAgICAgICAgIHwgICAgMSArCiBkcml2ZXJzL2lvbW11L3JvY2tjaGlwLWlvbW11LmMgfCAx MDM4ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKIDMgZmlsZXMgY2hh bmdlZCwgMTA1MSBpbnNlcnRpb25zKCspCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9pb21t dS9yb2NrY2hpcC1pb21tdS5jCgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pb21tdS9LY29uZmlnIGIv ZHJpdmVycy9pb21tdS9LY29uZmlnCmluZGV4IGRkNTExMjIuLmQwYTEyNjEgMTAwNjQ0Ci0tLSBh L2RyaXZlcnMvaW9tbXUvS2NvbmZpZworKysgYi9kcml2ZXJzL2lvbW11L0tjb25maWcKQEAgLTE1 Miw2ICsxNTIsMTggQEAgY29uZmlnIE9NQVBfSU9NTVVfREVCVUcKIAogICAgICAgICAgU2F5IE4g dW5sZXNzIHlvdSBrbm93IHlvdSBuZWVkIHRoaXMuCiAKK2NvbmZpZyBST0NLQ0hJUF9JT01NVQor CWJvb2wgIlJvY2tjaGlwIElPTU1VIFN1cHBvcnQiCisJZGVwZW5kcyBvbiBBUkNIX1JPQ0tDSElQ CisJc2VsZWN0IElPTU1VX0FQSQorCXNlbGVjdCBBUk1fRE1BX1VTRV9JT01NVQorCWhlbHAKKwkg IFN1cHBvcnQgZm9yIElPTU1VcyBmb3VuZCBvbiBSb2NrY2hpcCByazMyeHggU09Dcy4KKwkgIFRo ZXNlIElPTU1VcyBhbGxvdyB2aXJ0dWFsaXphdGlvbiBvZiB0aGUgYWRkcmVzcyBzcGFjZSB1c2Vk IGJ5IG1vc3QKKwkgIGNvcmVzIHdpdGhpbiB0aGUgbXVsdGltZWRpYSBzdWJzeXN0ZW0uCisJICBT YXkgWSBoZXJlIGlmIHlvdSBhcmUgdXNpbmcgYSBSb2NrY2hpcCBTb0MgdGhhdCBpbmNsdWRlcyBh biBJT01NVQorCSAgZGV2aWNlLgorCiBjb25maWcgVEVHUkFfSU9NTVVfR0FSVAogCWJvb2wgIlRl Z3JhIEdBUlQgSU9NTVUgU3VwcG9ydCIKIAlkZXBlbmRzIG9uIEFSQ0hfVEVHUkFfMnhfU09DCmRp ZmYgLS1naXQgYS9kcml2ZXJzL2lvbW11L01ha2VmaWxlIGIvZHJpdmVycy9pb21tdS9NYWtlZmls ZQppbmRleCAxNmVkZWY3Li4zZTQ3ZWYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lvbW11L01ha2Vm aWxlCisrKyBiL2RyaXZlcnMvaW9tbXUvTWFrZWZpbGUKQEAgLTEzLDYgKzEzLDcgQEAgb2JqLSQo Q09ORklHX0lSUV9SRU1BUCkgKz0gaW50ZWxfaXJxX3JlbWFwcGluZy5vIGlycV9yZW1hcHBpbmcu bwogb2JqLSQoQ09ORklHX09NQVBfSU9NTVUpICs9IG9tYXAtaW9tbXUubwogb2JqLSQoQ09ORklH X09NQVBfSU9NTVUpICs9IG9tYXAtaW9tbXUyLm8KIG9iai0kKENPTkZJR19PTUFQX0lPTU1VX0RF QlVHKSArPSBvbWFwLWlvbW11LWRlYnVnLm8KK29iai0kKENPTkZJR19ST0NLQ0hJUF9JT01NVSkg Kz0gcm9ja2NoaXAtaW9tbXUubwogb2JqLSQoQ09ORklHX1RFR1JBX0lPTU1VX0dBUlQpICs9IHRl Z3JhLWdhcnQubwogb2JqLSQoQ09ORklHX1RFR1JBX0lPTU1VX1NNTVUpICs9IHRlZ3JhLXNtbXUu bwogb2JqLSQoQ09ORklHX0VYWU5PU19JT01NVSkgKz0gZXh5bm9zLWlvbW11Lm8KZGlmZiAtLWdp dCBhL2RyaXZlcnMvaW9tbXUvcm9ja2NoaXAtaW9tbXUuYyBiL2RyaXZlcnMvaW9tbXUvcm9ja2No aXAtaW9tbXUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjAyM2FmCi0t LSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pb21tdS9yb2NrY2hpcC1pb21tdS5jCkBAIC0wLDAg KzEsMTAzOCBAQAorLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2Fu IHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2Yg dGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVk IGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGFzbS9j YWNoZWZsdXNoLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxsaW51eC9j b21waWxlci5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2 aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1 cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvbW11Lmg+Cisj aW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNs dWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxp bnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KKyNpbmNsdWRlIDxsaW51 eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8 bGludXgvc3BpbmxvY2suaD4KKworLyoqIE1NVSByZWdpc3RlciBvZmZzZXRzICovCisjZGVmaW5l IFJLX01NVV9EVEVfQUREUgkJMHgwMAkvKiBEaXJlY3RvcnkgdGFibGUgYWRkcmVzcyAqLworI2Rl ZmluZSBSS19NTVVfU1RBVFVTCQkweDA0CisjZGVmaW5lIFJLX01NVV9DT01NQU5ECQkweDA4Cisj ZGVmaW5lIFJLX01NVV9QQUdFX0ZBVUxUX0FERFIJMHgwQwkvKiBJT1ZBIG9mIGxhc3QgcGFnZSBm YXVsdCAqLworI2RlZmluZSBSS19NTVVfWkFQX09ORV9MSU5FCTB4MTAJLyogU2hvb3Rkb3duIG9u ZSBJT1RMQiBlbnRyeSAqLworI2RlZmluZSBSS19NTVVfSU5UX1JBV1NUQVQJMHgxNAkvKiBJUlEg c3RhdHVzIGlnbm9yaW5nIG1hc2sgKi8KKyNkZWZpbmUgUktfTU1VX0lOVF9DTEVBUgkweDE4CS8q IEFja25vd2xlZGdlIGFuZCByZS1hcm0gaXJxICovCisjZGVmaW5lIFJLX01NVV9JTlRfTUFTSwkJ MHgxQwkvKiBJUlEgZW5hYmxlICovCisjZGVmaW5lIFJLX01NVV9JTlRfU1RBVFVTCTB4MjAJLyog SVJRIHN0YXR1cyBhZnRlciBtYXNraW5nICovCisjZGVmaW5lIFJLX01NVV9BVVRPX0dBVElORwkw eDI0CisKKyNkZWZpbmUgRFRFX0FERFJfRFVNTVkJCTB4Q0FGRUJBQkUKKyNkZWZpbmUgRk9SQ0Vf UkVTRVRfVElNRU9VVAkxMDAJLyogbXMgKi8KKworLyogUktfTU1VX1NUQVRVUyBmaWVsZHMgKi8K KyNkZWZpbmUgUktfTU1VX1NUQVRVU19QQUdJTkdfRU5BQkxFRCAgICAgICBCSVQoMCkKKyNkZWZp bmUgUktfTU1VX1NUQVRVU19QQUdFX0ZBVUxUX0FDVElWRSAgICBCSVQoMSkKKyNkZWZpbmUgUktf TU1VX1NUQVRVU19TVEFMTF9BQ1RJVkUgICAgICAgICBCSVQoMikKKyNkZWZpbmUgUktfTU1VX1NU QVRVU19JRExFICAgICAgICAgICAgICAgICBCSVQoMykKKyNkZWZpbmUgUktfTU1VX1NUQVRVU19S RVBMQVlfQlVGRkVSX0VNUFRZICBCSVQoNCkKKyNkZWZpbmUgUktfTU1VX1NUQVRVU19QQUdFX0ZB VUxUX0lTX1dSSVRFICBCSVQoNSkKKyNkZWZpbmUgUktfTU1VX1NUQVRVU19TVEFMTF9OT1RfQUNU SVZFICAgICBCSVQoMzEpCisKKy8qIFJLX01NVV9DT01NQU5EIGNvbW1hbmQgdmFsdWVzICovCisj ZGVmaW5lIFJLX01NVV9DTURfRU5BQkxFX1BBR0lORyAgICAwICAvKiBFbmFibGUgbWVtb3J5IHRy YW5zbGF0aW9uICovCisjZGVmaW5lIFJLX01NVV9DTURfRElTQUJMRV9QQUdJTkcgICAxICAvKiBE aXNhYmxlIG1lbW9yeSB0cmFuc2xhdGlvbiAqLworI2RlZmluZSBSS19NTVVfQ01EX0VOQUJMRV9T VEFMTCAgICAgMiAgLyogU3RhbGwgcGFnaW5nIHRvIGFsbG93IG90aGVyIGNtZHMgKi8KKyNkZWZp bmUgUktfTU1VX0NNRF9ESVNBQkxFX1NUQUxMICAgIDMgIC8qIFN0b3Agc3RhbGwgcmUtZW5hYmxl cyBwYWdpbmcgKi8KKyNkZWZpbmUgUktfTU1VX0NNRF9aQVBfQ0FDSEUgICAgICAgIDQgIC8qIFNo b290IGRvd24gZW50aXJlIElPVExCICovCisjZGVmaW5lIFJLX01NVV9DTURfUEFHRV9GQVVMVF9E T05FICA1ICAvKiBDbGVhciBwYWdlIGZhdWx0ICovCisjZGVmaW5lIFJLX01NVV9DTURfRk9SQ0Vf UkVTRVQgICAgICA2ICAvKiBSZXNldCBhbGwgcmVnaXN0ZXJzICovCisKKy8qIFJLX01NVV9JTlRf KiByZWdpc3RlciBmaWVsZHMgKi8KKyNkZWZpbmUgUktfTU1VX0lSUV9QQUdFX0ZBVUxUICAgIDB4 MDEgIC8qIHBhZ2UgZmF1bHQgKi8KKyNkZWZpbmUgUktfTU1VX0lSUV9CVVNfRVJST1IgICAgIDB4 MDIgIC8qIGJ1cyByZWFkIGVycm9yICovCisjZGVmaW5lIFJLX01NVV9JUlFfTUFTSyAgICAgICAg ICAoUktfTU1VX0lSUV9QQUdFX0ZBVUxUIHwgUktfTU1VX0lSUV9CVVNfRVJST1IpCisKKyNkZWZp bmUgTlVNX0RUX0VOVFJJRVMgMTAyNAorI2RlZmluZSBOVU1fUFRfRU5UUklFUyAxMDI0CisKKyNk ZWZpbmUgU1BBR0VfT1JERVIgMTIKKyNkZWZpbmUgU1BBR0VfU0laRSAoMSA8PCBTUEFHRV9PUkRF UikKKworIC8qCisgICogU3VwcG9ydCBtYXBwaW5nIGFueSBzaXplIHRoYXQgZml0cyBpbiBvbmUg cGFnZSB0YWJsZToKKyAgKiAgIDQgS2lCIHRvIDQgTWlCCisgICovCisjZGVmaW5lIFJLX0lPTU1V X1BHU0laRV9CSVRNQVAgMHgwMDdmZjAwMAorCisjZGVmaW5lIElPTU1VX1JFR19QT0xMX0NPVU5U X0ZBU1QgMTAwMAorCitzdHJ1Y3QgcmtfaW9tbXVfZG9tYWluIHsKKwlzdHJ1Y3QgbGlzdF9oZWFk IGlvbW11czsKKwl1MzIgKmR0OyAvKiBwYWdlIGRpcmVjdG9yeSB0YWJsZSAqLworCXNwaW5sb2Nr X3QgaW9tbXVzX2xvY2s7IC8qIGxvY2sgZm9yIGlvbW11cyBsaXN0ICovCisJc3BpbmxvY2tfdCBk dF9sb2NrOyAvKiBsb2NrIGZvciBtb2RpZnlpbmcgcGFnZSBkaXJlY3RvcnkgdGFibGUgKi8KK307 CisKK3N0cnVjdCBya19pb21tdSB7CisJc3RydWN0IGRldmljZSAqZGV2OworCXZvaWQgX19pb21l bSAqYmFzZTsKKwlpbnQgaXJxOworCXN0cnVjdCBsaXN0X2hlYWQgbm9kZTsgLyogZW50cnkgaW4g cmtfaW9tbXVfZG9tYWluLmlvbW11cyAqLworCXN0cnVjdCBpb21tdV9kb21haW4gKmRvbWFpbjsg LyogZG9tYWluIHRvIHdoaWNoIGlvbW11IGlzIGF0dGFjaGVkICovCit9OworCitzdGF0aWMgaW5s aW5lIHZvaWQgcmtfdGFibGVfZmx1c2godTMyICp2YSwgdW5zaWduZWQgaW50IGNvdW50KQorewor CXBoeXNfYWRkcl90IHBhX3N0YXJ0ID0gdmlydF90b19waHlzKHZhKTsKKwlwaHlzX2FkZHJfdCBw YV9lbmQgPSB2aXJ0X3RvX3BoeXModmEgKyBjb3VudCk7CisJc2l6ZV90IHNpemUgPSBwYV9lbmQg LSBwYV9zdGFydDsKKworCV9fY3B1Y19mbHVzaF9kY2FjaGVfYXJlYSh2YSwgc2l6ZSk7CisJb3V0 ZXJfZmx1c2hfcmFuZ2UocGFfc3RhcnQsIHBhX2VuZCk7Cit9CisKKy8qKgorICogSW5zcGlyZWQg YnkgX3dhaXRfZm9yIGluIGludGVsX2Rydi5oCisgKiBUaGlzIGlzIE5PVCBzYWZlIGZvciB1c2Ug aW4gaW50ZXJydXB0IGNvbnRleHQuCisgKgorICogTm90ZSB0aGF0IGl0J3MgaW1wb3J0YW50IHRo YXQgd2UgY2hlY2sgdGhlIGNvbmRpdGlvbiBhZ2FpbiBhZnRlciBoYXZpbmcKKyAqIHRpbWVkIG91 dCwgc2luY2UgdGhlIHRpbWVvdXQgY291bGQgYmUgZHVlIHRvIHByZWVtcHRpb24gb3Igc2ltaWxh ciBhbmQKKyAqIHdlJ3ZlIG5ldmVyIGhhZCBhIGNoYW5jZSB0byBjaGVjayB0aGUgY29uZGl0aW9u IGJlZm9yZSB0aGUgdGltZW91dC4KKyAqLworI2RlZmluZSBya193YWl0X2ZvcihDT05ELCBNUykg KHsgXAorCXVuc2lnbmVkIGxvbmcgdGltZW91dF9fID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZp ZXMoTVMpICsgMTsJXAorCWludCByZXRfXyA9IDA7CQkJCQkJCVwKKwl3aGlsZSAoIShDT05EKSkg ewkJCQkJCVwKKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dF9fKSkgewkJCVwKKwkJ CXJldF9fID0gKENPTkQpID8gMCA6IC1FVElNRURPVVQ7CQlcCisJCQlicmVhazsJCQkJCQlcCisJ CX0JCQkJCQkJXAorCQl1c2xlZXBfcmFuZ2UoNTAsIDEwMCk7CQkJCQlcCisJfQkJCQkJCQkJXAor CXJldF9fOwkJCQkJCQkJXAorfSkKKworLyoKKyAqIFRoZSBSb2NrY2hpcCByazMyODggaW9tbXUg dXNlcyBhIDItbGV2ZWwgcGFnZSB0YWJsZS4KKyAqIFRoZSBmaXJzdCBsZXZlbCBpcyB0aGUgIkRp cmVjdG9yeSBUYWJsZSIgKERUKS4KKyAqIFRoZSBEVCBjb25zaXN0cyBvZiAxMDI0IDQtYnl0ZSBE aXJlY3RvcnkgVGFibGUgRW50cmllcyAoRFRFcyksIGVhY2ggcG9pbnRpbmcKKyAqIHRvIGEgIlBh Z2UgVGFibGUiLgorICogVGhlIHNlY29uZCBsZXZlbCBpcyB0aGUgMTAyNCBQYWdlIFRhYmxlcyAo UFQpLgorICogRWFjaCBQVCBjb25zaXN0cyBvZiAxMDI0IDQtYnl0ZSBQYWdlIFRhYmxlIEVudHJp ZXMgKFBURXMpLCBlYWNoIHBvaW50aW5nIHRvCisgKiBhIDQgS0IgcGFnZSBvZiBwaHlzaWNhbCBt ZW1vcnkuCisgKgorICogVGhlIERUIGFuZCBlYWNoIFBUIGZpdHMgaW4gYSBzaW5nbGUgNCBLQiBw YWdlICg0LWJ5dGVzICogMTAyNCBlbnRyaWVzKS4KKyAqIEVhY2ggaW9tbXUgZGV2aWNlIGhhcyBh IE1NVV9EVEVfQUREUiByZWdpc3RlciB0aGF0IGNvbnRhaW5zIHRoZSBwaHlzaWNhbAorICogYWRk cmVzcyBvZiB0aGUgc3RhcnQgb2YgdGhlIERUIHBhZ2UuCisgKgorICogVGhlIHN0cnVjdHVyZSBv ZiB0aGUgcGFnZSB0YWJsZSBpcyBhcyBmb2xsb3dzOgorICoKKyAqICAgICAgICAgICAgICAgICAg IERUCisgKiBNTVVfRFRFX0FERFIgLT4gKy0tLS0tKworICogICAgICAgICAgICAgICAgIHwgICAg IHwKKyAqICAgICAgICAgICAgICAgICArLS0tLS0rICAgICBQVAorICogICAgICAgICAgICAgICAg IHwgRFRFIHwgLT4gKy0tLS0tKworICogICAgICAgICAgICAgICAgICstLS0tLSsgICAgfCAgICAg fCAgICAgTWVtb3J5CisgKiAgICAgICAgICAgICAgICAgfCAgICAgfCAgICArLS0tLS0rICAgICBQ YWdlCisgKiAgICAgICAgICAgICAgICAgfCAgICAgfCAgICB8IFBURSB8IC0+ICstLS0tLSsKKyAq ICAgICAgICAgICAgICAgICArLS0tLS0rICAgICstLS0tLSsgICAgfCAgICAgfAorICogICAgICAg ICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCAgICB8ICAgICB8CisgKiAgICAgICAgICAgICAg ICAgICAgICAgICAgICB8ICAgICB8ICAgIHwgICAgIHwKKyAqICAgICAgICAgICAgICAgICAgICAg ICAgICAgICstLS0tLSsgICAgfCAgICAgfAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICB8ICAgICB8CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHwgICAgIHwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0t LS0tKworICovCisKKy8qCisgKiBFYWNoIERURSBoYXMgYSBQVCBhZGRyZXNzIGFuZCBhIHZhbGlk IGJpdDoKKyAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLSsKKyAqIHwgUFQg YWRkcmVzcyAgICAgICAgICB8IFJlc2VydmVkICB8VnwKKyAqICstLS0tLS0tLS0tLS0tLS0tLS0t LS0rLS0tLS0tLS0tLS0rLSsKKyAqICAzMToxMiAtIFBUIGFkZHJlc3MgKFBUcyBhbHdheXMgc3Rh cnRzIG9uIGEgNCBLQiBib3VuZGFyeSkKKyAqICAxMTogMSAtIFJlc2VydmVkCisgKiAgICAgIDAg LSAxIGlmIFBUIEAgUFQgYWRkcmVzcyBpcyB2YWxpZAorICovCisjZGVmaW5lIFJLX0RURV9QVF9B RERSRVNTX01BU0sgICAgMHhmZmZmZjAwMAorI2RlZmluZSBSS19EVEVfUFRfVkFMSUQgICAgICAg ICAgIEJJVCgwKQorCitzdGF0aWMgaW5saW5lIHBoeXNfYWRkcl90IHJrX2R0ZV9wdF9hZGRyZXNz KHUzMiBkdGUpCit7CisJcmV0dXJuIChwaHlzX2FkZHJfdClkdGUgJiBSS19EVEVfUFRfQUREUkVT U19NQVNLOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgcmtfZHRlX2lzX3B0X3ZhbGlkKHUzMiBk dGUpCit7CisJcmV0dXJuIGR0ZSAmIFJLX0RURV9QVF9WQUxJRDsKK30KKworc3RhdGljIHUzMiBy a19ta19kdGUodTMyICpwdCkKK3sKKwlwaHlzX2FkZHJfdCBwdF9waHlzID0gdmlydF90b19waHlz KHB0KTsKKwlyZXR1cm4gKHB0X3BoeXMgJiBSS19EVEVfUFRfQUREUkVTU19NQVNLKSB8IFJLX0RU RV9QVF9WQUxJRDsKK30KKworLyoKKyAqIEVhY2ggUFRFIGhhcyBhIFBhZ2UgYWRkcmVzcywgc29t ZSBmbGFncyBhbmQgYSB2YWxpZCBiaXQ6CisgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLSst LS0tLS0tKy0rCisgKiB8IFBhZ2UgYWRkcmVzcyAgICAgICAgfFJzdnwgRmxhZ3MgfFZ8CisgKiAr LS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLSstLS0tLS0tKy0rCisgKiAgMzE6MTIgLSBQYWdlIGFk ZHJlc3MgKFBhZ2VzIGFsd2F5cyBzdGFydCBvbiBhIDQgS0IgYm91bmRhcnkpCisgKiAgMTE6IDkg LSBSZXNlcnZlZAorICogICA4OiAxIC0gRmxhZ3MKKyAqICAgICAgOCAtIFJlYWQgYWxsb2NhdGUg LSBhbGxvY2F0ZSBjYWNoZSBzcGFjZSBvbiByZWFkIG1pc3NlcworICogICAgICA3IC0gUmVhZCBj YWNoZSAtIGVuYWJsZSBjYWNoZSAmIHByZWZldGNoIG9mIGRhdGEKKyAqICAgICAgNiAtIFdyaXRl IGJ1ZmZlciAtIGVuYWJsZSBkZWxheWluZyB3cml0ZXMgb24gdGhlaXIgd2F5IHRvIG1lbW9yeQor ICogICAgICA1IC0gV3JpdGUgYWxsb2NhdGUgLSBhbGxvY2F0ZSBjYWNoZSBzcGFjZSBvbiB3cml0 ZSBtaXNzZXMKKyAqICAgICAgNCAtIFdyaXRlIGNhY2hlIC0gZGlmZmVyZW50IHdyaXRlcyBjYW4g YmUgbWVyZ2VkIHRvZ2V0aGVyCisgKiAgICAgIDMgLSBPdmVycmlkZSBjYWNoZSBhdHRyaWJ1dGVz CisgKiAgICAgICAgICBpZiAxLCBiaXRzIDQtOCBjb250cm9sIGNhY2hlIGF0dHJpYnV0ZXMKKyAq ICAgICAgICAgIGlmIDAsIHRoZSBzeXN0ZW0gYnVzIGRlZmF1bHRzIGFyZSB1c2VkCisgKiAgICAg IDIgLSBXcml0YWJsZQorICogICAgICAxIC0gUmVhZGFibGUKKyAqICAgICAgMCAtIDEgaWYgUGFn ZSBAIFBhZ2UgYWRkcmVzcyBpcyB2YWxpZAorICovCisjZGVmaW5lIFJLX1BURV9QQUdFX0FERFJF U1NfTUFTSyAgMHhmZmZmZjAwMAorI2RlZmluZSBSS19QVEVfUEFHRV9GTEFHU19NQVNLICAgIDB4 MDAwMDAxZmUKKyNkZWZpbmUgUktfUFRFX1BBR0VfV1JJVEFCTEUgICAgICBCSVQoMikKKyNkZWZp bmUgUktfUFRFX1BBR0VfUkVBREFCTEUgICAgICBCSVQoMSkKKyNkZWZpbmUgUktfUFRFX1BBR0Vf VkFMSUQgICAgICAgICBCSVQoMCkKKworc3RhdGljIGlubGluZSBwaHlzX2FkZHJfdCBya19wdGVf cGFnZV9hZGRyZXNzKHUzMiBwdGUpCit7CisJcmV0dXJuIChwaHlzX2FkZHJfdClwdGUgJiBSS19Q VEVfUEFHRV9BRERSRVNTX01BU0s7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBya19wdGVfaXNf cGFnZV92YWxpZCh1MzIgcHRlKQoreworCXJldHVybiBwdGUgJiBSS19QVEVfUEFHRV9WQUxJRDsK K30KKworLyogVE9ETzogc2V0IGNhY2hlIGZsYWdzIHBlciBwcm90IElPTU1VX0NBQ0hFICovCitz dGF0aWMgdTMyIHJrX21rX3B0ZShwaHlzX2FkZHJfdCBwYWdlLCBpbnQgcHJvdCkKK3sKKwl1MzIg ZmxhZ3MgPSAwOworCWZsYWdzIHw9IChwcm90ICYgSU9NTVVfUkVBRCkgPyBSS19QVEVfUEFHRV9S RUFEQUJMRSA6IDA7CisJZmxhZ3MgfD0gKHByb3QgJiBJT01NVV9XUklURSkgPyBSS19QVEVfUEFH RV9XUklUQUJMRSA6IDA7CisJcGFnZSAmPSBSS19QVEVfUEFHRV9BRERSRVNTX01BU0s7CisJcmV0 dXJuIHBhZ2UgfCBmbGFncyB8IFJLX1BURV9QQUdFX1ZBTElEOworfQorCitzdGF0aWMgdTMyIHJr X21rX3B0ZV9pbnZhbGlkKHUzMiBwdGUpCit7CisJcmV0dXJuIHB0ZSAmIH5SS19QVEVfUEFHRV9W QUxJRDsKK30KKworLyoKKyAqIHJrMzI4OCBpb3ZhIChJT01NVSBWaXJ0dWFsIEFkZHJlc3MpIGZv cm1hdAorICogIDMxICAgICAgIDIyLjIxICAgICAgIDEyLjExICAgICAgICAgIDAKKyAqICstLS0t LS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tKworICogfCBEVEUgaW5kZXggfCBQVEUg aW5kZXggfCBQYWdlIG9mZnNldCB8CisgKiArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0t LS0tLS0tLSsKKyAqICAzMToyMiAtIERURSBpbmRleCAgIC0gaW5kZXggb2YgRFRFIGluIERUCisg KiAgMjE6MTIgLSBQVEUgaW5kZXggICAtIGluZGV4IG9mIFBURSBpbiBQVCBAIERURS5wdF9hZGRy ZXNzCisgKiAgMTE6IDAgLSBQYWdlIG9mZnNldCAtIG9mZnNldCBpbnRvIHBhZ2UgQCBQVEUucGFn ZV9hZGRyZXNzCisgKi8KKyNkZWZpbmUgUktfSU9WQV9EVEVfTUFTSyAgICAweGZmYzAwMDAwCisj ZGVmaW5lIFJLX0lPVkFfRFRFX1NISUZUICAgMjIKKyNkZWZpbmUgUktfSU9WQV9QVEVfTUFTSyAg ICAweDAwM2ZmMDAwCisjZGVmaW5lIFJLX0lPVkFfUFRFX1NISUZUICAgMTIKKyNkZWZpbmUgUktf SU9WQV9QQUdFX01BU0sgICAweDAwMDAwZmZmCisjZGVmaW5lIFJLX0lPVkFfUEFHRV9TSElGVCAg MAorCitzdGF0aWMgdTMyIHJrX2lvdmFfZHRlX2luZGV4KGRtYV9hZGRyX3QgaW92YSkKK3sKKwly ZXR1cm4gKHUzMikoaW92YSAmIFJLX0lPVkFfRFRFX01BU0spID4+IFJLX0lPVkFfRFRFX1NISUZU OworfQorCitzdGF0aWMgdTMyIHJrX2lvdmFfcHRlX2luZGV4KGRtYV9hZGRyX3QgaW92YSkKK3sK KwlyZXR1cm4gKHUzMikoaW92YSAmIFJLX0lPVkFfUFRFX01BU0spID4+IFJLX0lPVkFfUFRFX1NI SUZUOworfQorCitzdGF0aWMgdTMyIHJrX2lvdmFfcGFnZV9vZmZzZXQoZG1hX2FkZHJfdCBpb3Zh KQoreworCXJldHVybiAodTMyKShpb3ZhICYgUktfSU9WQV9QQUdFX01BU0spID4+IFJLX0lPVkFf UEFHRV9TSElGVDsKK30KKworc3RhdGljIHUzMiBya19pb21tdV9yZWFkKHN0cnVjdCBya19pb21t dSAqaW9tbXUsIHUzMiBvZmZzZXQpCit7CisJcmV0dXJuIHJlYWRsKGlvbW11LT5iYXNlICsgb2Zm c2V0KTsKK30KKworc3RhdGljIHZvaWQgcmtfaW9tbXVfd3JpdGUoc3RydWN0IHJrX2lvbW11ICpp b21tdSwgdTMyIG9mZnNldCwgdTMyIHZhbHVlKQoreworCXdyaXRlbCh2YWx1ZSwgaW9tbXUtPmJh c2UgKyBvZmZzZXQpOworfQorCitzdGF0aWMgdm9pZCBya19pb21tdV9jb21tYW5kKHN0cnVjdCBy a19pb21tdSAqaW9tbXUsIHUzMiBjb21tYW5kKQoreworCXdyaXRlbChjb21tYW5kLCBpb21tdS0+ YmFzZSArIFJLX01NVV9DT01NQU5EKTsKK30KKworc3RhdGljIHZvaWQgcmtfaW9tbXVfemFwX2xp bmVzKHN0cnVjdCBya19pb21tdSAqaW9tbXUsIGRtYV9hZGRyX3QgaW92YSwKKwkJCSAgICAgICBz aXplX3Qgc2l6ZSkKK3sKKwlkbWFfYWRkcl90IGlvdmFfZW5kID0gaW92YSArIHNpemU7CisJLyoK KwkgKiBUT0RPKGRqa3VydHopOiBGaWd1cmUgb3V0IHdoZW4gaXQgaXMgbW9yZSBlZmZpY2llbnQg dG8gc2hvb3Rkb3duIHRoZQorCSAqIGVudGlyZSBpb3RsYiByYXRoZXIgdGhhbiBpdGVyYXRlIG92 ZXIgaW5kaXZpZHVhbCBpb3Zhcy4KKwkgKi8KKwlmb3IgKDsgaW92YSA8IGlvdmFfZW5kOyBpb3Zh ICs9IFNQQUdFX1NJWkUpCisJCXJrX2lvbW11X3dyaXRlKGlvbW11LCBSS19NTVVfWkFQX09ORV9M SU5FLCBpb3ZhKTsKK30KKworc3RhdGljIGJvb2wgcmtfaW9tbXVfaXNfc3RhbGxfYWN0aXZlKHN0 cnVjdCBya19pb21tdSAqaW9tbXUpCit7CisJcmV0dXJuIHJrX2lvbW11X3JlYWQoaW9tbXUsIFJL X01NVV9TVEFUVVMpICYgUktfTU1VX1NUQVRVU19TVEFMTF9BQ1RJVkU7Cit9CisKK3N0YXRpYyBi b29sIHJrX2lvbW11X2lzX3BhZ2luZ19lbmFibGVkKHN0cnVjdCBya19pb21tdSAqaW9tbXUpCit7 CisJcmV0dXJuIHJrX2lvbW11X3JlYWQoaW9tbXUsIFJLX01NVV9TVEFUVVMpICYKKwkJCSAgICAg UktfTU1VX1NUQVRVU19QQUdJTkdfRU5BQkxFRDsKK30KKworc3RhdGljIGludCBya19pb21tdV9l bmFibGVfc3RhbGwoc3RydWN0IHJrX2lvbW11ICppb21tdSkKK3sKKwlpbnQgcmV0OworCisJaWYg KHJrX2lvbW11X2lzX3N0YWxsX2FjdGl2ZShpb21tdSkpCisJCXJldHVybiAwOworCisJLyogU3Rh bGwgY2FuIG9ubHkgYmUgZW5hYmxlZCBpZiBwYWdpbmcgaXMgZW5hYmxlZCAqLworCWlmICghcmtf aW9tbXVfaXNfcGFnaW5nX2VuYWJsZWQoaW9tbXUpKQorCQlyZXR1cm4gMDsKKworCXJrX2lvbW11 X2NvbW1hbmQoaW9tbXUsIFJLX01NVV9DTURfRU5BQkxFX1NUQUxMKTsKKworCXJldCA9IHJrX3dh aXRfZm9yKHJrX2lvbW11X2lzX3N0YWxsX2FjdGl2ZShpb21tdSksIDEpOworCWlmIChyZXQpCisJ CWRldl9lcnIoaW9tbXUtPmRldiwgIkVuYWJsZSBzdGFsbCByZXF1ZXN0IHRpbWVkIG91dCwgc3Rh dHVzOiAlIzA4eFxuIiwKKwkJCXJrX2lvbW11X3JlYWQoaW9tbXUsIFJLX01NVV9TVEFUVVMpKTsK KworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcmtfaW9tbXVfZGlzYWJsZV9zdGFsbChz dHJ1Y3QgcmtfaW9tbXUgKmlvbW11KQoreworCWludCByZXQ7CisKKwlpZiAoIXJrX2lvbW11X2lz X3N0YWxsX2FjdGl2ZShpb21tdSkpCisJCXJldHVybiAwOworCisJcmtfaW9tbXVfY29tbWFuZChp b21tdSwgUktfTU1VX0NNRF9ESVNBQkxFX1NUQUxMKTsKKworCXJldCA9IHJrX3dhaXRfZm9yKCFy a19pb21tdV9pc19zdGFsbF9hY3RpdmUoaW9tbXUpLCAxKTsKKwlpZiAocmV0KQorCQlkZXZfZXJy KGlvbW11LT5kZXYsICJEaXNhYmxlIHN0YWxsIHJlcXVlc3QgdGltZWQgb3V0LCBzdGF0dXM6ICUj MDh4XG4iLAorCQkJcmtfaW9tbXVfcmVhZChpb21tdSwgUktfTU1VX1NUQVRVUykpOworCisJcmV0 dXJuIHJldDsKK30KKworc3RhdGljIGludCBya19pb21tdV9lbmFibGVfcGFnaW5nKHN0cnVjdCBy a19pb21tdSAqaW9tbXUpCit7CisJaW50IHJldDsKKworCWlmIChya19pb21tdV9pc19wYWdpbmdf ZW5hYmxlZChpb21tdSkpCisJCXJldHVybiAwOworCisJcmtfaW9tbXVfY29tbWFuZChpb21tdSwg UktfTU1VX0NNRF9FTkFCTEVfUEFHSU5HKTsKKworCXJldCA9IHJrX3dhaXRfZm9yKHJrX2lvbW11 X2lzX3BhZ2luZ19lbmFibGVkKGlvbW11KSwgMSk7CisJaWYgKHJldCkKKwkJZGV2X2Vycihpb21t dS0+ZGV2LCAiRW5hYmxlIHBhZ2luZyByZXF1ZXN0IHRpbWVkIG91dCwgc3RhdHVzOiAlIzA4eFxu IiwKKwkJCXJrX2lvbW11X3JlYWQoaW9tbXUsIFJLX01NVV9TVEFUVVMpKTsKKworCXJldHVybiBy ZXQ7Cit9CisKK3N0YXRpYyBpbnQgcmtfaW9tbXVfZGlzYWJsZV9wYWdpbmcoc3RydWN0IHJrX2lv bW11ICppb21tdSkKK3sKKwlpbnQgcmV0OworCisJaWYgKCFya19pb21tdV9pc19wYWdpbmdfZW5h YmxlZChpb21tdSkpCisJCXJldHVybiAwOworCisJcmtfaW9tbXVfY29tbWFuZChpb21tdSwgUktf TU1VX0NNRF9ESVNBQkxFX1BBR0lORyk7CisKKwlyZXQgPSBya193YWl0X2ZvcighcmtfaW9tbXVf aXNfcGFnaW5nX2VuYWJsZWQoaW9tbXUpLCAxKTsKKwlpZiAocmV0KQorCQlkZXZfZXJyKGlvbW11 LT5kZXYsICJEaXNhYmxlIHBhZ2luZyByZXF1ZXN0IHRpbWVkIG91dCwgc3RhdHVzOiAlIzA4eFxu IiwKKwkJCXJrX2lvbW11X3JlYWQoaW9tbXUsIFJLX01NVV9TVEFUVVMpKTsKKworCXJldHVybiBy ZXQ7Cit9CisKK3N0YXRpYyBpbnQgcmtfaW9tbXVfZm9yY2VfcmVzZXQoc3RydWN0IHJrX2lvbW11 ICppb21tdSkKK3sKKwlpbnQgcmV0OworCXUzMiBkdGVfYWRkcjsKKworCS8qCisJICogQ2hlY2sg aWYgcmVnaXN0ZXIgRFRFX0FERFIgaXMgd29ya2luZyBieSB3cml0aW5nIERURV9BRERSX0RVTU1Z CisJICogYW5kIHZlcmlmeWluZyB0aGF0IHVwcGVyIDUgbnliYmxlcyBhcmUgcmVhZCBiYWNrLgor CSAqLworCXJrX2lvbW11X3dyaXRlKGlvbW11LCBSS19NTVVfRFRFX0FERFIsIERURV9BRERSX0RV TU1ZKTsKKworCWR0ZV9hZGRyID0gcmtfaW9tbXVfcmVhZChpb21tdSwgUktfTU1VX0RURV9BRERS KTsKKwlpZiAoZHRlX2FkZHIgIT0gKERURV9BRERSX0RVTU1ZICYgUktfRFRFX1BUX0FERFJFU1Nf TUFTSykpIHsKKwkJZGV2X2Vycihpb21tdS0+ZGV2LCAiRXJyb3IgZHVyaW5nIHJhdyByZXNldC4g TU1VX0RURV9BRERSIGlzIG5vdCBmdW5jdGlvbmluZ1xuIik7CisJCXJldHVybiAtRUZBVUxUOwor CX0KKworCXJrX2lvbW11X2NvbW1hbmQoaW9tbXUsIFJLX01NVV9DTURfRk9SQ0VfUkVTRVQpOwor CisJcmV0ID0gcmtfd2FpdF9mb3IocmtfaW9tbXVfcmVhZChpb21tdSwgUktfTU1VX0RURV9BRERS KSA9PSAweDAwMDAwMDAwLAorCQkJICBGT1JDRV9SRVNFVF9USU1FT1VUKTsKKwlpZiAocmV0KQor CQlkZXZfZXJyKGlvbW11LT5kZXYsICJGT1JDRV9SRVNFVCBjb21tYW5kIHRpbWVkIG91dFxuIik7 CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBsb2dfaW92YShzdHJ1Y3QgcmtfaW9t bXUgKmlvbW11LCBkbWFfYWRkcl90IGlvdmEpCit7CisJdTMyIGR0ZV9pbmRleCwgcHRlX2luZGV4 LCBwYWdlX29mZnNldDsKKwl1MzIgbW11X2R0ZV9hZGRyOworCXBoeXNfYWRkcl90IG1tdV9kdGVf YWRkcl9waHlzLCBkdGVfYWRkcl9waHlzOworCXUzMiAqZHRlX2FkZHI7CisJdTMyIGR0ZTsKKwlw aHlzX2FkZHJfdCBwdGVfYWRkcl9waHlzID0gMDsKKwl1MzIgKnB0ZV9hZGRyID0gTlVMTDsKKwl1 MzIgcHRlID0gMDsKKwlwaHlzX2FkZHJfdCBwYWdlX2FkZHJfcGh5cyA9IDA7CisJdTMyIHBhZ2Vf ZmxhZ3MgPSAwOworCisJZHRlX2luZGV4ID0gcmtfaW92YV9kdGVfaW5kZXgoaW92YSk7CisJcHRl X2luZGV4ID0gcmtfaW92YV9wdGVfaW5kZXgoaW92YSk7CisJcGFnZV9vZmZzZXQgPSBya19pb3Zh X3BhZ2Vfb2Zmc2V0KGlvdmEpOworCisJbW11X2R0ZV9hZGRyID0gcmtfaW9tbXVfcmVhZChpb21t dSwgUktfTU1VX0RURV9BRERSKTsKKwltbXVfZHRlX2FkZHJfcGh5cyA9IChwaHlzX2FkZHJfdClt bXVfZHRlX2FkZHI7CisKKwlkdGVfYWRkcl9waHlzID0gbW11X2R0ZV9hZGRyX3BoeXMgKyAoNCAq IGR0ZV9pbmRleCk7CisJZHRlX2FkZHIgPSBwaHlzX3RvX3ZpcnQoZHRlX2FkZHJfcGh5cyk7CisJ ZHRlID0gKmR0ZV9hZGRyOworCisJaWYgKCFya19kdGVfaXNfcHRfdmFsaWQoZHRlKSkKKwkJZ290 byBwcmludF9pdDsKKworCXB0ZV9hZGRyX3BoeXMgPSBya19kdGVfcHRfYWRkcmVzcyhkdGUpICsg KHB0ZV9pbmRleCAqIDQpOworCXB0ZV9hZGRyID0gcGh5c190b192aXJ0KHB0ZV9hZGRyX3BoeXMp OworCXB0ZSA9ICpwdGVfYWRkcjsKKworCWlmICghcmtfcHRlX2lzX3BhZ2VfdmFsaWQocHRlKSkK KwkJZ290byBwcmludF9pdDsKKworCXBhZ2VfYWRkcl9waHlzID0gcmtfcHRlX3BhZ2VfYWRkcmVz cyhwdGUpICsgcGFnZV9vZmZzZXQ7CisJcGFnZV9mbGFncyA9IHB0ZSAmIFJLX1BURV9QQUdFX0ZM QUdTX01BU0s7CisKK3ByaW50X2l0OgorCWRldl9lcnIoaW9tbXUtPmRldiwgImlvdmEgPSAlcGFk OiBkdGVfaW5kZXg6ICUjMDN4IHB0ZV9pbmRleDogJSMwM3ggcGFnZV9vZmZzZXQ6ICUjMDN4XG4i LAorCQkmaW92YSwgZHRlX2luZGV4LCBwdGVfaW5kZXgsIHBhZ2Vfb2Zmc2V0KTsKKwlkZXZfZXJy KGlvbW11LT5kZXYsICJtbXVfZHRlX2FkZHI6ICVwYSBkdGVAJXBhOiAlIzA4eCB2YWxpZDogJXUg cHRlQCVwYTogJSMwOHggdmFsaWQ6ICV1IHBhZ2VAJXBhIGZsYWdzOiAlIzAzeFxuIiwKKwkJJm1t dV9kdGVfYWRkcl9waHlzLCAmZHRlX2FkZHJfcGh5cywgZHRlLAorCQlya19kdGVfaXNfcHRfdmFs aWQoZHRlKSwgJnB0ZV9hZGRyX3BoeXMsIHB0ZSwKKwkJcmtfcHRlX2lzX3BhZ2VfdmFsaWQocHRl KSwgJnBhZ2VfYWRkcl9waHlzLCBwYWdlX2ZsYWdzKTsKK30KKworc3RhdGljIGlycXJldHVybl90 IHJrX2lvbW11X2lycShpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IHJrX2lvbW11 ICppb21tdSA9IGRldl9pZDsKKwl1MzIgc3RhdHVzOworCXUzMiBpbnRfc3RhdHVzOworCWRtYV9h ZGRyX3QgaW92YTsKKworCWludF9zdGF0dXMgPSBya19pb21tdV9yZWFkKGlvbW11LCBSS19NTVVf SU5UX1NUQVRVUyk7CisJaWYgKGludF9zdGF0dXMgPT0gMCkKKwkJcmV0dXJuIElSUV9OT05FOwor CisJaW92YSA9IHJrX2lvbW11X3JlYWQoaW9tbXUsIFJLX01NVV9QQUdFX0ZBVUxUX0FERFIpOwor CisJaWYgKGludF9zdGF0dXMgJiBSS19NTVVfSVJRX1BBR0VfRkFVTFQpIHsKKwkJaW50IGZsYWdz OworCisJCXN0YXR1cyA9IHJrX2lvbW11X3JlYWQoaW9tbXUsIFJLX01NVV9TVEFUVVMpOworCQlm bGFncyA9IChzdGF0dXMgJiBSS19NTVVfU1RBVFVTX1BBR0VfRkFVTFRfSVNfV1JJVEUpID8KKwkJ CQlJT01NVV9GQVVMVF9XUklURSA6IElPTU1VX0ZBVUxUX1JFQUQ7CisKKwkJZGV2X2Vycihpb21t dS0+ZGV2LCAiUGFnZSBmYXVsdCBhdCAlcGFkIG9mIHR5cGUgJXNcbiIsCisJCQkmaW92YSwKKwkJ CShmbGFncyA9PSBJT01NVV9GQVVMVF9XUklURSkgPyAid3JpdGUiIDogInJlYWQiKTsKKworCQls b2dfaW92YShpb21tdSwgaW92YSk7CisKKwkJLyoKKwkJICogUmVwb3J0IHBhZ2UgZmF1bHQgdG8g YW55IGluc3RhbGxlZCBoYW5kbGVycy4KKwkJICogSWdub3JlIHRoZSByZXR1cm4gY29kZSwgdGhv dWdoLCBzaW5jZSB3ZSBhbHdheXMgemFwIGNhY2hlCisJCSAqIGFuZCBjbGVhciB0aGUgcGFnZSBm YXVsdCBhbnl3YXkuCisJCSAqLworCQlpZiAoaW9tbXUtPmRvbWFpbikKKwkJCXJlcG9ydF9pb21t dV9mYXVsdChpb21tdS0+ZG9tYWluLCBpb21tdS0+ZGV2LCBpb3ZhLAorCQkJCQkgICBmbGFncyk7 CisJCWVsc2UKKwkJCWRldl9lcnIoaW9tbXUtPmRldiwgIlBhZ2UgZmF1bHQgd2hpbGUgaW9tbXUg bm90IGF0dGFjaGVkIHRvIGRvbWFpbj9cbiIpOworCisJCXJrX2lvbW11X2NvbW1hbmQoaW9tbXUs IFJLX01NVV9DTURfWkFQX0NBQ0hFKTsKKwkJcmtfaW9tbXVfY29tbWFuZChpb21tdSwgUktfTU1V X0NNRF9QQUdFX0ZBVUxUX0RPTkUpOworCX0KKworCWlmIChpbnRfc3RhdHVzICYgUktfTU1VX0lS UV9CVVNfRVJST1IpCisJCWRldl9lcnIoaW9tbXUtPmRldiwgIkJVU19FUlJPUiBvY2N1cnJlZCBh dCAlcGFkXG4iLCAmaW92YSk7CisKKwlpZiAoaW50X3N0YXR1cyAmIH5SS19NTVVfSVJRX01BU0sp CisJCWRldl9lcnIoaW9tbXUtPmRldiwgInVuZXhwZWN0ZWQgaW50X3N0YXR1czogJSMwOHhcbiIs CisJCQlpbnRfc3RhdHVzKTsKKworCXJrX2lvbW11X3dyaXRlKGlvbW11LCBSS19NTVVfSU5UX0NM RUFSLCBpbnRfc3RhdHVzKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHBo eXNfYWRkcl90IHJrX2lvbW11X2lvdmFfdG9fcGh5cyhzdHJ1Y3QgaW9tbXVfZG9tYWluICpkb21h aW4sCisJCQkJCSBkbWFfYWRkcl90IGlvdmEpCit7CisJc3RydWN0IHJrX2lvbW11X2RvbWFpbiAq cmtfZG9tYWluID0gZG9tYWluLT5wcml2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJcGh5c19h ZGRyX3QgcHRfcGh5cywgcGh5cyA9IDA7CisJdTMyIGR0ZSwgcHRlOworCXUzMiAqcGFnZV90YWJs ZTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZya19kb21haW4tPmR0X2xvY2ssIGZsYWdzKTsKKwor CWR0ZSA9IHJrX2RvbWFpbi0+ZHRbcmtfaW92YV9kdGVfaW5kZXgoaW92YSldOworCWlmICghcmtf ZHRlX2lzX3B0X3ZhbGlkKGR0ZSkpCisJCWdvdG8gb3V0OworCisJcHRfcGh5cyA9IHJrX2R0ZV9w dF9hZGRyZXNzKGR0ZSk7CisJcGFnZV90YWJsZSA9ICh1MzIgKilwaHlzX3RvX3ZpcnQocHRfcGh5 cyk7CisJcHRlID0gcGFnZV90YWJsZVtya19pb3ZhX3B0ZV9pbmRleChpb3ZhKV07CisJaWYgKCFy a19wdGVfaXNfcGFnZV92YWxpZChwdGUpKQorCQlnb3RvIG91dDsKKworCXBoeXMgPSBya19wdGVf cGFnZV9hZGRyZXNzKHB0ZSkgKyBya19pb3ZhX3BhZ2Vfb2Zmc2V0KGlvdmEpOworb3V0OgorCXNw aW5fdW5sb2NrX2lycXJlc3RvcmUoJnJrX2RvbWFpbi0+ZHRfbG9jaywgZmxhZ3MpOworCisJcmV0 dXJuIHBoeXM7Cit9CisKK3N0YXRpYyB2b2lkIHJrX2lvbW11X3phcF9pb3ZhKHN0cnVjdCBya19p b21tdV9kb21haW4gKnJrX2RvbWFpbiwKKwkJCSAgICAgIGRtYV9hZGRyX3QgaW92YSwgc2l6ZV90 IHNpemUpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcG9zOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7 CisKKwkvKiBzaG9vdGRvd24gdGhlc2UgaW92YSBmcm9tIGFsbCBpb21tdXMgdXNpbmcgdGhpcyBk b21haW4gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmcmtfZG9tYWluLT5pb21tdXNfbG9jaywgZmxh Z3MpOworCWxpc3RfZm9yX2VhY2gocG9zLCAmcmtfZG9tYWluLT5pb21tdXMpIHsKKwkJc3RydWN0 IHJrX2lvbW11ICppb21tdTsKKwkJaW9tbXUgPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IHJrX2lv bW11LCBub2RlKTsKKwkJcmtfaW9tbXVfemFwX2xpbmVzKGlvbW11LCBpb3ZhLCBzaXplKTsKKwl9 CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcmtfZG9tYWluLT5pb21tdXNfbG9jaywgZmxhZ3Mp OworfQorCitzdGF0aWMgdTMyICpya19kdGVfZ2V0X3BhZ2VfdGFibGUoc3RydWN0IHJrX2lvbW11 X2RvbWFpbiAqcmtfZG9tYWluLAorCQkJCSAgZG1hX2FkZHJfdCBpb3ZhKQoreworCXUzMiAqcGFn ZV90YWJsZSwgKmR0ZV9hZGRyOworCXUzMiBkdGU7CisJcGh5c19hZGRyX3QgcHRfcGh5czsKKwor CWFzc2VydF9zcGluX2xvY2tlZCgmcmtfZG9tYWluLT5kdF9sb2NrKTsKKworCWR0ZV9hZGRyID0g JnJrX2RvbWFpbi0+ZHRbcmtfaW92YV9kdGVfaW5kZXgoaW92YSldOworCWR0ZSA9ICpkdGVfYWRk cjsKKwlpZiAocmtfZHRlX2lzX3B0X3ZhbGlkKGR0ZSkpCisJCWdvdG8gZG9uZTsKKworCXBhZ2Vf dGFibGUgPSAodTMyICopZ2V0X3plcm9lZF9wYWdlKEdGUF9BVE9NSUMgfCBHRlBfRE1BMzIpOwor CWlmICghcGFnZV90YWJsZSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlkdGUgPSBy a19ta19kdGUocGFnZV90YWJsZSk7CisJKmR0ZV9hZGRyID0gZHRlOworCisJcmtfdGFibGVfZmx1 c2gocGFnZV90YWJsZSwgTlVNX1BUX0VOVFJJRVMpOworCXJrX3RhYmxlX2ZsdXNoKGR0ZV9hZGRy LCAxKTsKKworCS8qCisJICogWmFwIHRoZSBmaXJzdCBpb3ZhIG9mIG5ld2x5IGFsbG9jYXRlZCBw YWdlIHRhYmxlIHNvIGlvbW11IGV2aWN0cworCSAqIG9sZCBjYWNoZWQgdmFsdWUgb2YgbmV3IGR0 ZSBmcm9tIHRoZSBpb3RsYi4KKwkgKi8KKwlya19pb21tdV96YXBfaW92YShya19kb21haW4sIGlv dmEsIFNQQUdFX1NJWkUpOworCitkb25lOgorCXB0X3BoeXMgPSBya19kdGVfcHRfYWRkcmVzcyhk dGUpOworCXJldHVybiAodTMyICopcGh5c190b192aXJ0KHB0X3BoeXMpOworfQorCitzdGF0aWMg c2l6ZV90IHJrX2lvbW11X3VubWFwX2lvdmEoc3RydWN0IHJrX2lvbW11X2RvbWFpbiAqcmtfZG9t YWluLAorCQkJCSAgdTMyICpwdGVfYWRkciwgZG1hX2FkZHJfdCBpb3ZhLCBzaXplX3Qgc2l6ZSkK K3sKKwl1bnNpZ25lZCBpbnQgcHRlX2NvdW50OworCXVuc2lnbmVkIGludCBwdGVfdG90YWwgPSBz aXplIC8gU1BBR0VfU0laRTsKKworCWFzc2VydF9zcGluX2xvY2tlZCgmcmtfZG9tYWluLT5kdF9s b2NrKTsKKworCWZvciAocHRlX2NvdW50ID0gMDsgcHRlX2NvdW50IDwgcHRlX3RvdGFsOyBwdGVf Y291bnQrKykgeworCQl1MzIgcHRlID0gcHRlX2FkZHJbcHRlX2NvdW50XTsKKwkJaWYgKCFya19w dGVfaXNfcGFnZV92YWxpZChwdGUpKQorCQkJYnJlYWs7CisKKwkJcHRlX2FkZHJbcHRlX2NvdW50 XSA9IHJrX21rX3B0ZV9pbnZhbGlkKHB0ZSk7CisJfQorCisJcmtfdGFibGVfZmx1c2gocHRlX2Fk ZHIsIHB0ZV9jb3VudCk7CisKKwlyZXR1cm4gcHRlX2NvdW50ICogU1BBR0VfU0laRTsKK30KKwor c3RhdGljIGludCBya19pb21tdV9tYXBfaW92YShzdHJ1Y3QgcmtfaW9tbXVfZG9tYWluICpya19k b21haW4sIHUzMiAqcHRlX2FkZHIsCisJCQkgICAgIGRtYV9hZGRyX3QgaW92YSwgcGh5c19hZGRy X3QgcGFkZHIsIHNpemVfdCBzaXplLAorCQkJICAgICBpbnQgcHJvdCkKK3sKKwl1bnNpZ25lZCBp bnQgcHRlX2NvdW50OworCXVuc2lnbmVkIGludCBwdGVfdG90YWwgPSBzaXplIC8gU1BBR0VfU0la RTsKKwlwaHlzX2FkZHJfdCBwYWdlX3BoeXM7CisKKwlhc3NlcnRfc3Bpbl9sb2NrZWQoJnJrX2Rv bWFpbi0+ZHRfbG9jayk7CisKKwlmb3IgKHB0ZV9jb3VudCA9IDA7IHB0ZV9jb3VudCA8IHB0ZV90 b3RhbDsgcHRlX2NvdW50KyspIHsKKwkJdTMyIHB0ZSA9IHB0ZV9hZGRyW3B0ZV9jb3VudF07CisK KwkJaWYgKHJrX3B0ZV9pc19wYWdlX3ZhbGlkKHB0ZSkpCisJCQlnb3RvIHVud2luZDsKKworCQlw dGVfYWRkcltwdGVfY291bnRdID0gcmtfbWtfcHRlKHBhZGRyLCBwcm90KTsKKworCQlwYWRkciAr PSBTUEFHRV9TSVpFOworCX0KKworCXJrX3RhYmxlX2ZsdXNoKHB0ZV9hZGRyLCBwdGVfY291bnQp OworCisJcmV0dXJuIDA7Cit1bndpbmQ6CisJLyogVW5tYXAgdGhlIHJhbmdlIG9mIGlvdmFzIHRo YXQgd2UganVzdCBtYXBwZWQgKi8KKwlya19pb21tdV91bm1hcF9pb3ZhKHJrX2RvbWFpbiwgcHRl X2FkZHIsIGlvdmEsIHB0ZV9jb3VudCAqIFNQQUdFX1NJWkUpOworCisJaW92YSArPSBwdGVfY291 bnQgKiBTUEFHRV9TSVpFOworCXBhZ2VfcGh5cyA9IHJrX3B0ZV9wYWdlX2FkZHJlc3MocHRlX2Fk ZHJbcHRlX2NvdW50XSk7CisJcHJfZXJyKCJpb3ZhOiAlcGFkIGFscmVhZHkgbWFwcGVkIHRvICVw YSBjYW5ub3QgcmVtYXAgdG8gcGh5czogJXBhIHByb3Q6ICUjeFxuIiwKKwkgICAgICAgJmlvdmEs ICZwYWdlX3BoeXMsICZwYWRkciwgcHJvdCk7CisKKwlyZXR1cm4gLUVBRERSSU5VU0U7Cit9CisK K3N0YXRpYyBpbnQgcmtfaW9tbXVfbWFwKHN0cnVjdCBpb21tdV9kb21haW4gKmRvbWFpbiwgdW5z aWduZWQgbG9uZyBfaW92YSwKKwkJCXBoeXNfYWRkcl90IHBhZGRyLCBzaXplX3Qgc2l6ZSwgaW50 IHByb3QpCit7CisJc3RydWN0IHJrX2lvbW11X2RvbWFpbiAqcmtfZG9tYWluID0gZG9tYWluLT5w cml2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJZG1hX2FkZHJfdCBpb3ZhID0gKGRtYV9hZGRy X3QpX2lvdmE7CisJdTMyICpwYWdlX3RhYmxlLCAqcHRlX2FkZHI7CisJaW50IHJldDsKKworCXNw aW5fbG9ja19pcnFzYXZlKCZya19kb21haW4tPmR0X2xvY2ssIGZsYWdzKTsKKworCS8qCisJICog cGdzaXplX2JpdG1hcCBzcGVjaWZpZXMgaW92YSBzaXplcyB0aGF0IGZpdCBpbiBvbmUgcGFnZSB0 YWJsZQorCSAqICgxMDI0IDQtS2lCIHBhZ2VzID0gNCBNaUIpLgorCSAqIFNvLCBzaXplIHdpbGwg YWx3YXlzIGJlIDQwOTYgPD0gc2l6ZSA8PSA0MTk0MzA0LgorCSAqIFNpbmNlIGlvbW11X21hcCgp IGd1YXJhbnRlZXMgdGhhdCBib3RoIGlvdmEgYW5kIHNpemUgd2lsbCBiZQorCSAqIGFsaWduZWQs IHdlIHdpbGwgYWx3YXlzIG9ubHkgYmUgbWFwcGluZyBmcm9tIGEgc2luZ2xlIGR0ZSBoZXJlLgor CSAqLworCXBhZ2VfdGFibGUgPSBya19kdGVfZ2V0X3BhZ2VfdGFibGUocmtfZG9tYWluLCBpb3Zh KTsKKwlpZiAoSVNfRVJSKHBhZ2VfdGFibGUpKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUo JnJrX2RvbWFpbi0+ZHRfbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gUFRSX0VSUihwYWdlX3RhYmxl KTsKKwl9CisKKwlwdGVfYWRkciA9ICZwYWdlX3RhYmxlW3JrX2lvdmFfcHRlX2luZGV4KGlvdmEp XTsKKwlyZXQgPSBya19pb21tdV9tYXBfaW92YShya19kb21haW4sIHB0ZV9hZGRyLCBpb3ZhLCBw YWRkciwgc2l6ZSwgcHJvdCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcmtfZG9tYWluLT5k dF9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc2l6ZV90IHJrX2lv bW11X3VubWFwKHN0cnVjdCBpb21tdV9kb21haW4gKmRvbWFpbiwgdW5zaWduZWQgbG9uZyBfaW92 YSwKKwkJCSAgICAgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IHJrX2lvbW11X2RvbWFpbiAqcmtf ZG9tYWluID0gZG9tYWluLT5wcml2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJZG1hX2FkZHJf dCBpb3ZhID0gKGRtYV9hZGRyX3QpX2lvdmE7CisJcGh5c19hZGRyX3QgcHRfcGh5czsKKwl1MzIg ZHRlOworCXUzMiAqcHRlX2FkZHI7CisJc2l6ZV90IHVubWFwX3NpemU7CisKKwlzcGluX2xvY2tf aXJxc2F2ZSgmcmtfZG9tYWluLT5kdF9sb2NrLCBmbGFncyk7CisKKwkvKgorCSAqIHBnc2l6ZV9i aXRtYXAgc3BlY2lmaWVzIGlvdmEgc2l6ZXMgdGhhdCBmaXQgaW4gb25lIHBhZ2UgdGFibGUKKwkg KiAoMTAyNCA0LUtpQiBwYWdlcyA9IDQgTWlCKS4KKwkgKiBTbywgc2l6ZSB3aWxsIGFsd2F5cyBi ZSA0MDk2IDw9IHNpemUgPD0gNDE5NDMwNC4KKwkgKiBTaW5jZSBpb21tdV91bm1hcCgpIGd1YXJh bnRlZXMgdGhhdCBib3RoIGlvdmEgYW5kIHNpemUgd2lsbCBiZQorCSAqIGFsaWduZWQsIHdlIHdp bGwgYWx3YXlzIG9ubHkgYmUgdW5tYXBwaW5nIGZyb20gYSBzaW5nbGUgZHRlIGhlcmUuCisJICov CisJZHRlID0gcmtfZG9tYWluLT5kdFtya19pb3ZhX2R0ZV9pbmRleChpb3ZhKV07CisJLyogSnVz dCByZXR1cm4gMCBpZiBpb3ZhIGlzIHVubWFwcGVkICovCisJaWYgKCFya19kdGVfaXNfcHRfdmFs aWQoZHRlKSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZya19kb21haW4tPmR0X2xvY2ss IGZsYWdzKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcHRfcGh5cyA9IHJrX2R0ZV9wdF9hZGRyZXNz KGR0ZSk7CisJcHRlX2FkZHIgPSAodTMyICopcGh5c190b192aXJ0KHB0X3BoeXMpICsgcmtfaW92 YV9wdGVfaW5kZXgoaW92YSk7CisJdW5tYXBfc2l6ZSA9IHJrX2lvbW11X3VubWFwX2lvdmEocmtf ZG9tYWluLCBwdGVfYWRkciwgaW92YSwgc2l6ZSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3Jl KCZya19kb21haW4tPmR0X2xvY2ssIGZsYWdzKTsKKworCS8qIFNob290ZG93biBpb3RsYiBlbnRy aWVzIGZvciBpb3ZhIHJhbmdlIHRoYXQgd2FzIGp1c3QgdW5tYXBwZWQgKi8KKwlya19pb21tdV96 YXBfaW92YShya19kb21haW4sIGlvdmEsIHVubWFwX3NpemUpOworCisJcmV0dXJuIHVubWFwX3Np emU7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcmtfaW9tbXUgKnJrX2lvbW11X2Zyb21fZGV2KHN0cnVj dCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaW9tbXVfZ3JvdXAgKmdyb3VwOworCXN0cnVjdCBk ZXZpY2UgKmlvbW11X2RldjsKKwlzdHJ1Y3QgcmtfaW9tbXUgKnJrX2lvbW11OworCisJZ3JvdXAg PSBpb21tdV9ncm91cF9nZXQoZGV2KTsKKwlpZiAoIWdyb3VwKQorCQlyZXR1cm4gTlVMTDsKKwlp b21tdV9kZXYgPSBpb21tdV9ncm91cF9nZXRfaW9tbXVkYXRhKGdyb3VwKTsKKwlya19pb21tdSA9 IGRldl9nZXRfZHJ2ZGF0YShpb21tdV9kZXYpOworCWlvbW11X2dyb3VwX3B1dChncm91cCk7CisK KwlyZXR1cm4gcmtfaW9tbXU7Cit9CisKK3N0YXRpYyBpbnQgcmtfaW9tbXVfYXR0YWNoX2Rldmlj ZShzdHJ1Y3QgaW9tbXVfZG9tYWluICpkb21haW4sCisJCQkJICBzdHJ1Y3QgZGV2aWNlICpkZXYp Cit7CisJc3RydWN0IHJrX2lvbW11ICppb21tdTsKKwlzdHJ1Y3QgcmtfaW9tbXVfZG9tYWluICpy a19kb21haW4gPSBkb21haW4tPnByaXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0 OworCXBoeXNfYWRkcl90IGR0ZV9hZGRyOworCisJLyoKKwkgKiBBbGxvdyAndmlydHVhbCBkZXZp Y2VzJyAoZS5nLiwgZHJtKSB0byBhdHRhY2ggdG8gZG9tYWluLgorCSAqIFN1Y2ggYSBkZXZpY2Ug ZG9lcyBub3QgYmVsb25nIHRvIGFuIGlvbW11IGdyb3VwLgorCSAqLworCWlvbW11ID0gcmtfaW9t bXVfZnJvbV9kZXYoZGV2KTsKKwlpZiAoIWlvbW11KQorCQlyZXR1cm4gMDsKKworCXJldCA9IHJr X2lvbW11X2VuYWJsZV9zdGFsbChpb21tdSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwor CXJldCA9IHJrX2lvbW11X2ZvcmNlX3Jlc2V0KGlvbW11KTsKKwlpZiAocmV0KQorCQlyZXR1cm4g cmV0OworCisJaW9tbXUtPmRvbWFpbiA9IGRvbWFpbjsKKworCXJldCA9IGRldm1fcmVxdWVzdF9p cnEoZGV2LCBpb21tdS0+aXJxLCBya19pb21tdV9pcnEsCisJCQkgICAgICAgSVJRRl9TSEFSRUQs IGRldl9uYW1lKGRldiksIGlvbW11KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJZHRl X2FkZHIgPSB2aXJ0X3RvX3BoeXMocmtfZG9tYWluLT5kdCk7CisJcmtfaW9tbXVfd3JpdGUoaW9t bXUsIFJLX01NVV9EVEVfQUREUiwgZHRlX2FkZHIpOworCXJrX2lvbW11X2NvbW1hbmQoaW9tbXUs IFJLX01NVV9DTURfWkFQX0NBQ0hFKTsKKwlya19pb21tdV93cml0ZShpb21tdSwgUktfTU1VX0lO VF9NQVNLLCBSS19NTVVfSVJRX01BU0spOworCisJcmV0ID0gcmtfaW9tbXVfZW5hYmxlX3BhZ2lu Zyhpb21tdSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXNwaW5fbG9ja19pcnFzYXZl KCZya19kb21haW4tPmlvbW11c19sb2NrLCBmbGFncyk7CisJbGlzdF9hZGRfdGFpbCgmaW9tbXUt Pm5vZGUsICZya19kb21haW4tPmlvbW11cyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcmtf ZG9tYWluLT5pb21tdXNfbG9jaywgZmxhZ3MpOworCisJZGV2X2luZm8oZGV2LCAiQXR0YWNoZWQg dG8gaW9tbXUgZG9tYWluXG4iKTsKKworCXJrX2lvbW11X2Rpc2FibGVfc3RhbGwoaW9tbXUpOwor CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHJrX2lvbW11X2RldGFjaF9kZXZpY2Uoc3Ry dWN0IGlvbW11X2RvbWFpbiAqZG9tYWluLAorCQkJCSAgIHN0cnVjdCBkZXZpY2UgKmRldikKK3sK KwlzdHJ1Y3QgcmtfaW9tbXUgKmlvbW11OworCXN0cnVjdCBya19pb21tdV9kb21haW4gKnJrX2Rv bWFpbiA9IGRvbWFpbi0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogQWxsb3cg J3ZpcnR1YWwgZGV2aWNlcycgKGVnIGRybSkgdG8gZGV0YWNoIGZyb20gZG9tYWluICovCisJaW9t bXUgPSBya19pb21tdV9mcm9tX2RldihkZXYpOworCWlmICghaW9tbXUpCisJCXJldHVybjsKKwor CXNwaW5fbG9ja19pcnFzYXZlKCZya19kb21haW4tPmlvbW11c19sb2NrLCBmbGFncyk7CisJbGlz dF9kZWxfaW5pdCgmaW9tbXUtPm5vZGUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJrX2Rv bWFpbi0+aW9tbXVzX2xvY2ssIGZsYWdzKTsKKworCS8qIElnbm9yZSBlcnJvciB3aGlsZSBkaXNh YmxpbmcsIGp1c3Qga2VlcCBnb2luZyAqLworCXJrX2lvbW11X2VuYWJsZV9zdGFsbChpb21tdSk7 CisJcmtfaW9tbXVfZGlzYWJsZV9wYWdpbmcoaW9tbXUpOworCXJrX2lvbW11X3dyaXRlKGlvbW11 LCBSS19NTVVfSU5UX01BU0ssIDApOworCXJrX2lvbW11X3dyaXRlKGlvbW11LCBSS19NTVVfRFRF X0FERFIsIDApOworCXJrX2lvbW11X2Rpc2FibGVfc3RhbGwoaW9tbXUpOworCisJZGV2bV9mcmVl X2lycShkZXYsIGlvbW11LT5pcnEsIGlvbW11KTsKKworCWlvbW11LT5kb21haW4gPSBOVUxMOwor CisJZGV2X2luZm8oZGV2LCAiRGV0YWNoZWQgZnJvbSBpb21tdSBkb21haW5cbiIpOworfQorCitz dGF0aWMgaW50IHJrX2lvbW11X2RvbWFpbl9pbml0KHN0cnVjdCBpb21tdV9kb21haW4gKmRvbWFp bikKK3sKKwlzdHJ1Y3QgcmtfaW9tbXVfZG9tYWluICpya19kb21haW47CisKKwlya19kb21haW4g PSBremFsbG9jKHNpemVvZigqcmtfZG9tYWluKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFya19kb21h aW4pCisJCXJldHVybiAtRU5PTUVNOworCisJLyoKKwkgKiByazMyeHggaW9tbXVzIHVzZSBhIDIg bGV2ZWwgcGFnZXRhYmxlLgorCSAqIEVhY2ggbGV2ZWwxIChkdCkgYW5kIGxldmVsMiAocHQpIHRh YmxlIGhhcyAxMDI0IDQtYnl0ZSBlbnRyaWVzLgorCSAqIEFsbG9jYXRlIG9uZSA0IEtpQiBwYWdl IGZvciBlYWNoIHRhYmxlLgorCSAqLworCXJrX2RvbWFpbi0+ZHQgPSAodTMyICopZ2V0X3plcm9l ZF9wYWdlKEdGUF9LRVJORUwgfCBHRlBfRE1BMzIpOworCWlmICghcmtfZG9tYWluLT5kdCkKKwkJ Z290byBlcnJfZHQ7CisKKwlya190YWJsZV9mbHVzaChya19kb21haW4tPmR0LCBOVU1fRFRfRU5U UklFUyk7CisKKwlzcGluX2xvY2tfaW5pdCgmcmtfZG9tYWluLT5pb21tdXNfbG9jayk7CisJc3Bp bl9sb2NrX2luaXQoJnJrX2RvbWFpbi0+ZHRfbG9jayk7CisJSU5JVF9MSVNUX0hFQUQoJnJrX2Rv bWFpbi0+aW9tbXVzKTsKKworCWRvbWFpbi0+cHJpdiA9IHJrX2RvbWFpbjsKKworCXJldHVybiAw OworZXJyX2R0OgorCWtmcmVlKHJrX2RvbWFpbik7CisJcmV0dXJuIC1FTk9NRU07Cit9CisKK3N0 YXRpYyB2b2lkIHJrX2lvbW11X2RvbWFpbl9kZXN0cm95KHN0cnVjdCBpb21tdV9kb21haW4gKmRv bWFpbikKK3sKKwlzdHJ1Y3QgcmtfaW9tbXVfZG9tYWluICpya19kb21haW4gPSBkb21haW4tPnBy aXY7CisJaW50IGk7CisKKwlXQVJOX09OKCFsaXN0X2VtcHR5KCZya19kb21haW4tPmlvbW11cykp OworCisJZm9yIChpID0gMDsgaSA8IE5VTV9EVF9FTlRSSUVTOyBpKyspIHsKKwkJdTMyIGR0ZSA9 IHJrX2RvbWFpbi0+ZHRbaV07CisJCWlmIChya19kdGVfaXNfcHRfdmFsaWQoZHRlKSkgeworCQkJ cGh5c19hZGRyX3QgcHRfcGh5cyA9IHJrX2R0ZV9wdF9hZGRyZXNzKGR0ZSk7CisJCQl1MzIgKnBh Z2VfdGFibGUgPSBwaHlzX3RvX3ZpcnQocHRfcGh5cyk7CisJCQlmcmVlX3BhZ2UoKHVuc2lnbmVk IGxvbmcpcGFnZV90YWJsZSk7CisJCX0KKwl9CisKKwlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcp cmtfZG9tYWluLT5kdCk7CisJa2ZyZWUoZG9tYWluLT5wcml2KTsKKwlkb21haW4tPnByaXYgPSBO VUxMOworfQorCitzdGF0aWMgYm9vbCBya19pb21tdV9pc19kZXZfaW9tbXVfbWFzdGVyKHN0cnVj dCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gZGV2LT5vZl9ub2Rl OworCWludCByZXQ7CisKKwkvKgorCSAqIEFuIGlvbW11IG1hc3RlciBoYXMgYW4gaW9tbXVzIHBy b3BlcnR5IGNvbnRhaW5pbmcgYSBsaXN0IG9mIHBoYW5kbGVzCisJICogdG8gaW9tbXUgbm9kZXMs IGVhY2ggd2l0aCBhbiAjaW9tbXUtY2VsbHMgcHJvcGVydHkgd2l0aCB2YWx1ZSAwLgorCSAqLwor CXJldCA9IG9mX2NvdW50X3BoYW5kbGVfd2l0aF9hcmdzKG5wLCAiaW9tbXVzIiwgIiNpb21tdS1j ZWxscyIpOworCXJldHVybiAocmV0ID4gMCk7Cit9CisKK3N0YXRpYyBpbnQgcmtfaW9tbXVfZ3Jv dXBfc2V0X2lvbW11ZGF0YShzdHJ1Y3QgaW9tbXVfZ3JvdXAgKmdyb3VwLAorCQkJCQlzdHJ1Y3Qg ZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IGRldi0+b2Zfbm9kZTsK KwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZDsKKwlpbnQgcmV0OworCXN0cnVjdCBvZl9waGFu ZGxlX2FyZ3MgYXJnczsKKworCS8qCisJICogQW4gaW9tbXUgbWFzdGVyIGhhcyBhbiBpb21tdXMg cHJvcGVydHkgY29udGFpbmluZyBhIGxpc3Qgb2YgcGhhbmRsZXMKKwkgKiB0byBpb21tdSBub2Rl cywgZWFjaCB3aXRoIGFuICNpb21tdS1jZWxscyBwcm9wZXJ0eSB3aXRoIHZhbHVlIDAuCisJICov CisJcmV0ID0gb2ZfcGFyc2VfcGhhbmRsZV93aXRoX2FyZ3MobnAsICJpb21tdXMiLCAiI2lvbW11 LWNlbGxzIiwgMCwKKwkJCQkJICZhcmdzKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAi b2ZfcGFyc2VfcGhhbmRsZV93aXRoX2FyZ3MoJXMpID0+ICVkXG4iLAorCQkJbnAtPmZ1bGxfbmFt ZSwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisJaWYgKGFyZ3MuYXJnc19jb3VudCAhPSAwKSB7 CisJCWRldl9lcnIoZGV2LCAiaW5jb3JyZWN0IG51bWJlciBvZiBpb21tdSBwYXJhbXMgZm91bmQg Zm9yICVzIChmb3VuZCAlZCwgZXhwZWN0ZWQgMClcbiIsCisJCQlhcmdzLm5wLT5mdWxsX25hbWUs IGFyZ3MuYXJnc19jb3VudCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXBkID0gb2ZfZmlu ZF9kZXZpY2VfYnlfbm9kZShhcmdzLm5wKTsKKwlvZl9ub2RlX3B1dChhcmdzLm5wKTsKKwlpZiAo IXBkKSB7CisJCWRldl9lcnIoZGV2LCAiaW9tbXUgJXMgbm90IGZvdW5kXG4iLCBhcmdzLm5wLT5m dWxsX25hbWUpOworCQlyZXR1cm4gLUVQUk9CRV9ERUZFUjsKKwl9CisKKwkvKiBUT0RPKGRqa3Vy dHopOiBoYW5kbGUgbXVsdGlwbGUgc2xhdmUgaW9tbXVzIGZvciBhIHNpbmdsZSBtYXN0ZXIgKi8K Kwlpb21tdV9ncm91cF9zZXRfaW9tbXVkYXRhKGdyb3VwLCAmcGQtPmRldiwgTlVMTCk7CisKKwly ZXR1cm4gMDsKK30KKworc3RhdGljIGludCBya19pb21tdV9hZGRfZGV2aWNlKHN0cnVjdCBkZXZp Y2UgKmRldikKK3sKKwlzdHJ1Y3QgaW9tbXVfZ3JvdXAgKmdyb3VwOworCWludCByZXQ7CisKKwlp ZiAoIXJrX2lvbW11X2lzX2Rldl9pb21tdV9tYXN0ZXIoZGV2KSkKKwkJcmV0dXJuIC1FTk9ERVY7 CisKKwlncm91cCA9IGlvbW11X2dyb3VwX2dldChkZXYpOworCWlmICghZ3JvdXApIHsKKwkJZ3Jv dXAgPSBpb21tdV9ncm91cF9hbGxvYygpOworCQlpZiAoSVNfRVJSKGdyb3VwKSkgeworCQkJZGV2 X2VycihkZXYsICJGYWlsZWQgdG8gYWxsb2NhdGUgSU9NTVUgZ3JvdXBcbiIpOworCQkJcmV0dXJu IFBUUl9FUlIoZ3JvdXApOworCQl9CisJfQorCisJcmV0ID0gaW9tbXVfZ3JvdXBfYWRkX2Rldmlj ZShncm91cCwgZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9wdXRfZ3JvdXA7CisKKwlyZXQg PSBya19pb21tdV9ncm91cF9zZXRfaW9tbXVkYXRhKGdyb3VwLCBkZXYpOworCWlmIChyZXQpCisJ CWdvdG8gZXJyX3JlbW92ZV9kZXZpY2U7CisKKwlpb21tdV9ncm91cF9wdXQoZ3JvdXApOworCisJ cmV0dXJuIDA7CisKK2Vycl9yZW1vdmVfZGV2aWNlOgorCWlvbW11X2dyb3VwX3JlbW92ZV9kZXZp Y2UoZGV2KTsKK2Vycl9wdXRfZ3JvdXA6CisJaW9tbXVfZ3JvdXBfcHV0KGdyb3VwKTsKKwlyZXR1 cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBya19pb21tdV9yZW1vdmVfZGV2aWNlKHN0cnVjdCBk ZXZpY2UgKmRldikKK3sKKwlpZiAoIXJrX2lvbW11X2lzX2Rldl9pb21tdV9tYXN0ZXIoZGV2KSkK KwkJcmV0dXJuOworCisJaW9tbXVfZ3JvdXBfcmVtb3ZlX2RldmljZShkZXYpOworfQorCitzdGF0 aWMgY29uc3Qgc3RydWN0IGlvbW11X29wcyBya19pb21tdV9vcHMgPSB7CisJLmRvbWFpbl9pbml0 ID0gcmtfaW9tbXVfZG9tYWluX2luaXQsCisJLmRvbWFpbl9kZXN0cm95ID0gcmtfaW9tbXVfZG9t YWluX2Rlc3Ryb3ksCisJLmF0dGFjaF9kZXYgPSBya19pb21tdV9hdHRhY2hfZGV2aWNlLAorCS5k ZXRhY2hfZGV2ID0gcmtfaW9tbXVfZGV0YWNoX2RldmljZSwKKwkubWFwID0gcmtfaW9tbXVfbWFw LAorCS51bm1hcCA9IHJrX2lvbW11X3VubWFwLAorCS5hZGRfZGV2aWNlID0gcmtfaW9tbXVfYWRk X2RldmljZSwKKwkucmVtb3ZlX2RldmljZSA9IHJrX2lvbW11X3JlbW92ZV9kZXZpY2UsCisJLmlv dmFfdG9fcGh5cyA9IHJrX2lvbW11X2lvdmFfdG9fcGh5cywKKwkucGdzaXplX2JpdG1hcCA9IFJL X0lPTU1VX1BHU0laRV9CSVRNQVAsCit9OworCitzdGF0aWMgaW50IHJrX2lvbW11X3Byb2JlKHN0 cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBk ZXYtPmRldjsKKwlzdHJ1Y3QgcmtfaW9tbXUgKmlvbW11OworCXN0cnVjdCByZXNvdXJjZSAqcmVz OworCisJaW9tbXUgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmlvbW11KSwgR0ZQX0tFUk5F TCk7CisJaWYgKCFpb21tdSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwbGF0Zm9ybV9zZXRfZHJ2 ZGF0YShwZGV2LCBpb21tdSk7CisJaW9tbXUtPmRldiA9IGRldjsKKworCXJlcyA9IHBsYXRmb3Jt X2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaW9tbXUtPmJhc2UgPSBk ZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKKwlpZiAoSVNfRVJSKGlvbW11 LT5iYXNlKSkKKwkJcmV0dXJuIFBUUl9FUlIoaW9tbXUtPmJhc2UpOworCisJaW9tbXUtPmlycSA9 IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJaWYgKGlvbW11LT5pcnEgPCAwKSB7CisJCWRl dl9lcnIoZGV2LCAiRmFpbGVkIHRvIGdldCBJUlEsICVkXG4iLCBpb21tdS0+aXJxKTsKKwkJcmV0 dXJuIC1FTlhJTzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBya19pb21tdV9y ZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlyZXR1cm4gMDsKK30KKwor I2lmZGVmIENPTkZJR19PRgorc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgcmtfaW9t bXVfZHRfaWRzW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJyb2NrY2hpcCxpb21tdSIgfSwKKwl7 IC8qIHNlbnRpbmVsICovIH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBya19pb21tdV9k dF9pZHMpOworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHJrX2lvbW11 X2RyaXZlciA9IHsKKwkucHJvYmUgPSBya19pb21tdV9wcm9iZSwKKwkucmVtb3ZlID0gcmtfaW9t bXVfcmVtb3ZlLAorCS5kcml2ZXIgPSB7CisJCSAgIC5uYW1lID0gInJrX2lvbW11IiwKKwkJICAg Lm93bmVyID0gVEhJU19NT0RVTEUsCisJCSAgIC5vZl9tYXRjaF90YWJsZSA9IG9mX21hdGNoX3B0 cihya19pb21tdV9kdF9pZHMpLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBya19pb21t dV9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCXJldCA9IGJ1c19zZXRfaW9tbXUoJnBsYXRm b3JtX2J1c190eXBlLCAmcmtfaW9tbXVfb3BzKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0Owor CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmcmtfaW9tbXVfZHJpdmVyKTsKK30K K3N0YXRpYyB2b2lkIF9fZXhpdCBya19pb21tdV9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJp dmVyX3VucmVnaXN0ZXIoJnJrX2lvbW11X2RyaXZlcik7Cit9CisKK3N1YnN5c19pbml0Y2FsbChy a19pb21tdV9pbml0KTsKK21vZHVsZV9leGl0KHJrX2lvbW11X2V4aXQpOworCitNT0RVTEVfREVT Q1JJUFRJT04oIklPTU1VIEFQSSBmb3IgUm9ja2NoaXAiKTsKK01PRFVMRV9BVVRIT1IoIlNpbW9u IFh1ZSA8eHhtQHJvY2stY2hpcHMuY29tPiBhbmQgRGFuaWVsIEt1cnR6IDxkamt1cnR6QGNocm9t aXVtLm9yZz4iKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06cm9ja2NoaXAtaW9tbXUiKTsKK01P RFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKLS0gCjIuMS4wLnJjMi4yMDYuZ2VkYjAzZTUKCl9fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmlvbW11IG1haWxpbmcg bGlzdAppb21tdUBsaXN0cy5saW51eC1mb3VuZGF0aW9uLm9yZwpodHRwczovL2xpc3RzLmxpbnV4 Zm91bmRhdGlvbi5vcmcvbWFpbG1hbi9saXN0aW5mby9pb21tdQ==