From mboxrd@z Thu Jan 1 00:00:00 1970 From: Daniel Kurtz Subject: [PATCH v6 1/3] iommu/rockchip: rk3288 iommu driver Date: Mon, 27 Oct 2014 20:37:26 +0800 Message-ID: <1414413448-15819-2-git-send-email-djkurtz@chromium.org> References: <1414413448-15819-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: <1414413448-15819-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: Joerg Roedel , Heiko Stuebner Cc: "open list:OPEN FIRMWARE AND..." , Simon Xue , Grant Grundler , open list , Daniel Kurtz , "open list:IOMMU DRIVERS" , Rob Herring , Grant Likely , =?UTF-8?q?St=C3=A9phane=20Marchesin?= , "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 bGwgZGV2aWNlcwpoYXZlIGRldGFjaGVkIGJlZm9yZSBkZXN0cm95aW5nIGEgZG9tYWluLgoKQ2hh bmdlcyBpbiB2NjoKICAtIGFkZCAuYWRkL3JlbW92ZV9kZXZpY2UoKSBjYWxsYmFja3MuCiAgLSBw YXJzZSBwbGF0Zm9ybV9kZXZpY2UgZGV2aWNlIHRyZWUgbm9kZXMgZm9yICJpb21tdXMiIHByb3Bl cnR5CiAgLSBzdG9yZSBwbGF0Zm9ybSBkZXZpY2UgcG9pbnRlciBhcyBncm91cCBpb21tdWRhdGEK ICAtIENoZWNrIGZvciBleGlzdGVuY2Ugb2YgaW9tbXUgZ3JvdXAgaW5zdGVhZCBvZiByZWx5aW5n IG9uIGEKICAgIGRldl9nZXRfZHJ2ZGF0YSgpIHRvIHJldHVybiBOVUxMIGZvciBhIE5VTEwgZGV2 aWNlLgoKU2lnbmVkLW9mZi1ieTogRGFuaWVsIEt1cnR6IDxkamt1cnR6QGNocm9taXVtLm9yZz4K U2lnbmVkLW9mZi1ieTogU2ltb24gWHVlIDx4eG1Acm9jay1jaGlwcy5jb20+ClJldmlld2VkLWJ5 OiBHcmFudCBHcnVuZGxlciA8Z3J1bmRsZXJAY2hyb21pdW0ub3JnPgpSZXZpZXdlZC1ieTogU3TD qXBoYW5lIE1hcmNoZXNpbiA8bWFyY2hldUBjaHJvbWl1bS5vcmc+Ci0tLQogZHJpdmVycy9pb21t dS9LY29uZmlnICAgICAgICAgIHwgICAxMiArCiBkcml2ZXJzL2lvbW11L01ha2VmaWxlICAgICAg ICAgfCAgICAxICsKIGRyaXZlcnMvaW9tbXUvcm9ja2NoaXAtaW9tbXUuYyB8IDEwMzggKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwogMyBmaWxlcyBjaGFuZ2VkLCAxMDUx IGluc2VydGlvbnMoKykKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2lvbW11L3JvY2tjaGlw LWlvbW11LmMKCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lvbW11L0tjb25maWcgYi9kcml2ZXJzL2lv bW11L0tjb25maWcKaW5kZXggZGQ1MTEyMi4uZDBhMTI2MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9p b21tdS9LY29uZmlnCisrKyBiL2RyaXZlcnMvaW9tbXUvS2NvbmZpZwpAQCAtMTUyLDYgKzE1Miwx OCBAQCBjb25maWcgT01BUF9JT01NVV9ERUJVRwogCiAgICAgICAgICBTYXkgTiB1bmxlc3MgeW91 IGtub3cgeW91IG5lZWQgdGhpcy4KIAorY29uZmlnIFJPQ0tDSElQX0lPTU1VCisJYm9vbCAiUm9j a2NoaXAgSU9NTVUgU3VwcG9ydCIKKwlkZXBlbmRzIG9uIEFSQ0hfUk9DS0NISVAKKwlzZWxlY3Qg SU9NTVVfQVBJCisJc2VsZWN0IEFSTV9ETUFfVVNFX0lPTU1VCisJaGVscAorCSAgU3VwcG9ydCBm b3IgSU9NTVVzIGZvdW5kIG9uIFJvY2tjaGlwIHJrMzJ4eCBTT0NzLgorCSAgVGhlc2UgSU9NTVVz IGFsbG93IHZpcnR1YWxpemF0aW9uIG9mIHRoZSBhZGRyZXNzIHNwYWNlIHVzZWQgYnkgbW9zdAor CSAgY29yZXMgd2l0aGluIHRoZSBtdWx0aW1lZGlhIHN1YnN5c3RlbS4KKwkgIFNheSBZIGhlcmUg aWYgeW91IGFyZSB1c2luZyBhIFJvY2tjaGlwIFNvQyB0aGF0IGluY2x1ZGVzIGFuIElPTU1VCisJ ICBkZXZpY2UuCisKIGNvbmZpZyBURUdSQV9JT01NVV9HQVJUCiAJYm9vbCAiVGVncmEgR0FSVCBJ T01NVSBTdXBwb3J0IgogCWRlcGVuZHMgb24gQVJDSF9URUdSQV8yeF9TT0MKZGlmZiAtLWdpdCBh L2RyaXZlcnMvaW9tbXUvTWFrZWZpbGUgYi9kcml2ZXJzL2lvbW11L01ha2VmaWxlCmluZGV4IDE2 ZWRlZjcuLjNlNDdlZjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW9tbXUvTWFrZWZpbGUKKysrIGIv ZHJpdmVycy9pb21tdS9NYWtlZmlsZQpAQCAtMTMsNiArMTMsNyBAQCBvYmotJChDT05GSUdfSVJR X1JFTUFQKSArPSBpbnRlbF9pcnFfcmVtYXBwaW5nLm8gaXJxX3JlbWFwcGluZy5vCiBvYmotJChD T05GSUdfT01BUF9JT01NVSkgKz0gb21hcC1pb21tdS5vCiBvYmotJChDT05GSUdfT01BUF9JT01N VSkgKz0gb21hcC1pb21tdTIubwogb2JqLSQoQ09ORklHX09NQVBfSU9NTVVfREVCVUcpICs9IG9t YXAtaW9tbXUtZGVidWcubworb2JqLSQoQ09ORklHX1JPQ0tDSElQX0lPTU1VKSArPSByb2NrY2hp cC1pb21tdS5vCiBvYmotJChDT05GSUdfVEVHUkFfSU9NTVVfR0FSVCkgKz0gdGVncmEtZ2FydC5v CiBvYmotJChDT05GSUdfVEVHUkFfSU9NTVVfU01NVSkgKz0gdGVncmEtc21tdS5vCiBvYmotJChD T05GSUdfRVhZTk9TX0lPTU1VKSArPSBleHlub3MtaW9tbXUubwpkaWZmIC0tZ2l0IGEvZHJpdmVy cy9pb21tdS9yb2NrY2hpcC1pb21tdS5jIGIvZHJpdmVycy9pb21tdS9yb2NrY2hpcC1pb21tdS5j Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxZDZmODcKLS0tIC9kZXYvbnVs bAorKysgYi9kcml2ZXJzL2lvbW11L3JvY2tjaGlwLWlvbW11LmMKQEAgLTAsMCArMSwxMDM4IEBA CisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmli dXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdl bmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZy ZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2gu aD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+ CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNp bmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2lu Y2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvaW9tbXUuaD4KKyNpbmNsdWRlIDxs aW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4 L21tLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4K KyNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3Jt X2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlu bG9jay5oPgorCisvKiogTU1VIHJlZ2lzdGVyIG9mZnNldHMgKi8KKyNkZWZpbmUgUktfTU1VX0RU RV9BRERSCQkweDAwCS8qIERpcmVjdG9yeSB0YWJsZSBhZGRyZXNzICovCisjZGVmaW5lIFJLX01N VV9TVEFUVVMJCTB4MDQKKyNkZWZpbmUgUktfTU1VX0NPTU1BTkQJCTB4MDgKKyNkZWZpbmUgUktf TU1VX1BBR0VfRkFVTFRfQUREUgkweDBDCS8qIElPVkEgb2YgbGFzdCBwYWdlIGZhdWx0ICovCisj ZGVmaW5lIFJLX01NVV9aQVBfT05FX0xJTkUJMHgxMAkvKiBTaG9vdGRvd24gb25lIElPVExCIGVu dHJ5ICovCisjZGVmaW5lIFJLX01NVV9JTlRfUkFXU1RBVAkweDE0CS8qIElSUSBzdGF0dXMgaWdu b3JpbmcgbWFzayAqLworI2RlZmluZSBSS19NTVVfSU5UX0NMRUFSCTB4MTgJLyogQWNrbm93bGVk Z2UgYW5kIHJlLWFybSBpcnEgKi8KKyNkZWZpbmUgUktfTU1VX0lOVF9NQVNLCQkweDFDCS8qIElS USBlbmFibGUgKi8KKyNkZWZpbmUgUktfTU1VX0lOVF9TVEFUVVMJMHgyMAkvKiBJUlEgc3RhdHVz IGFmdGVyIG1hc2tpbmcgKi8KKyNkZWZpbmUgUktfTU1VX0FVVE9fR0FUSU5HCTB4MjQKKworI2Rl ZmluZSBEVEVfQUREUl9EVU1NWQkJMHhDQUZFQkFCRQorI2RlZmluZSBGT1JDRV9SRVNFVF9USU1F T1VUCTEwMAkvKiBtcyAqLworCisvKiBSS19NTVVfU1RBVFVTIGZpZWxkcyAqLworI2RlZmluZSBS S19NTVVfU1RBVFVTX1BBR0lOR19FTkFCTEVEICAgICAgIEJJVCgwKQorI2RlZmluZSBSS19NTVVf U1RBVFVTX1BBR0VfRkFVTFRfQUNUSVZFICAgIEJJVCgxKQorI2RlZmluZSBSS19NTVVfU1RBVFVT X1NUQUxMX0FDVElWRSAgICAgICAgIEJJVCgyKQorI2RlZmluZSBSS19NTVVfU1RBVFVTX0lETEUg ICAgICAgICAgICAgICAgIEJJVCgzKQorI2RlZmluZSBSS19NTVVfU1RBVFVTX1JFUExBWV9CVUZG RVJfRU1QVFkgIEJJVCg0KQorI2RlZmluZSBSS19NTVVfU1RBVFVTX1BBR0VfRkFVTFRfSVNfV1JJ VEUgIEJJVCg1KQorI2RlZmluZSBSS19NTVVfU1RBVFVTX1NUQUxMX05PVF9BQ1RJVkUgICAgIEJJ VCgzMSkKKworLyogUktfTU1VX0NPTU1BTkQgY29tbWFuZCB2YWx1ZXMgKi8KKyNkZWZpbmUgUktf TU1VX0NNRF9FTkFCTEVfUEFHSU5HICAgIDAgIC8qIEVuYWJsZSBtZW1vcnkgdHJhbnNsYXRpb24g Ki8KKyNkZWZpbmUgUktfTU1VX0NNRF9ESVNBQkxFX1BBR0lORyAgIDEgIC8qIERpc2FibGUgbWVt b3J5IHRyYW5zbGF0aW9uICovCisjZGVmaW5lIFJLX01NVV9DTURfRU5BQkxFX1NUQUxMICAgICAy ICAvKiBTdGFsbCBwYWdpbmcgdG8gYWxsb3cgb3RoZXIgY21kcyAqLworI2RlZmluZSBSS19NTVVf Q01EX0RJU0FCTEVfU1RBTEwgICAgMyAgLyogU3RvcCBzdGFsbCByZS1lbmFibGVzIHBhZ2luZyAq LworI2RlZmluZSBSS19NTVVfQ01EX1pBUF9DQUNIRSAgICAgICAgNCAgLyogU2hvb3QgZG93biBl bnRpcmUgSU9UTEIgKi8KKyNkZWZpbmUgUktfTU1VX0NNRF9QQUdFX0ZBVUxUX0RPTkUgIDUgIC8q IENsZWFyIHBhZ2UgZmF1bHQgKi8KKyNkZWZpbmUgUktfTU1VX0NNRF9GT1JDRV9SRVNFVCAgICAg IDYgIC8qIFJlc2V0IGFsbCByZWdpc3RlcnMgKi8KKworLyogUktfTU1VX0lOVF8qIHJlZ2lzdGVy IGZpZWxkcyAqLworI2RlZmluZSBSS19NTVVfSVJRX1BBR0VfRkFVTFQgICAgMHgwMSAgLyogcGFn ZSBmYXVsdCAqLworI2RlZmluZSBSS19NTVVfSVJRX0JVU19FUlJPUiAgICAgMHgwMiAgLyogYnVz IHJlYWQgZXJyb3IgKi8KKyNkZWZpbmUgUktfTU1VX0lSUV9NQVNLICAgICAgICAgIChSS19NTVVf SVJRX1BBR0VfRkFVTFQgfCBSS19NTVVfSVJRX0JVU19FUlJPUikKKworI2RlZmluZSBOVU1fRFRf RU5UUklFUyAxMDI0CisjZGVmaW5lIE5VTV9QVF9FTlRSSUVTIDEwMjQKKworI2RlZmluZSBTUEFH RV9PUkRFUiAxMgorI2RlZmluZSBTUEFHRV9TSVpFICgxIDw8IFNQQUdFX09SREVSKQorCisgLyoK KyAgKiBTdXBwb3J0IG1hcHBpbmcgYW55IHNpemUgdGhhdCBmaXRzIGluIG9uZSBwYWdlIHRhYmxl OgorICAqICAgNCBLaUIgdG8gNCBNaUIKKyAgKi8KKyNkZWZpbmUgUktfSU9NTVVfUEdTSVpFX0JJ VE1BUCAweDAwN2ZmMDAwCisKKyNkZWZpbmUgSU9NTVVfUkVHX1BPTExfQ09VTlRfRkFTVCAxMDAw CisKK3N0cnVjdCBya19pb21tdV9kb21haW4geworCXN0cnVjdCBsaXN0X2hlYWQgaW9tbXVzOwor CXUzMiAqZHQ7IC8qIHBhZ2UgZGlyZWN0b3J5IHRhYmxlICovCisJc3BpbmxvY2tfdCBpb21tdXNf bG9jazsgLyogbG9jayBmb3IgaW9tbXVzIGxpc3QgKi8KKwlzcGlubG9ja190IGR0X2xvY2s7IC8q IGxvY2sgZm9yIG1vZGlmeWluZyBwYWdlIGRpcmVjdG9yeSB0YWJsZSAqLworfTsKKworc3RydWN0 IHJrX2lvbW11IHsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJdm9pZCBfX2lvbWVtICpiYXNlOwor CWludCBpcnE7CisJc3RydWN0IGxpc3RfaGVhZCBub2RlOyAvKiBlbnRyeSBpbiBya19pb21tdV9k b21haW4uaW9tbXVzICovCisJc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tYWluOyAvKiBkb21haW4g dG8gd2hpY2ggaW9tbXUgaXMgYXR0YWNoZWQgKi8KK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBy a190YWJsZV9mbHVzaCh1MzIgKnZhLCB1bnNpZ25lZCBpbnQgY291bnQpCit7CisJcGh5c19hZGRy X3QgcGFfc3RhcnQgPSB2aXJ0X3RvX3BoeXModmEpOworCXBoeXNfYWRkcl90IHBhX2VuZCA9IHZp cnRfdG9fcGh5cyh2YSArIGNvdW50KTsKKwlzaXplX3Qgc2l6ZSA9IHBhX2VuZCAtIHBhX3N0YXJ0 OworCisJX19jcHVjX2ZsdXNoX2RjYWNoZV9hcmVhKHZhLCBzaXplKTsKKwlvdXRlcl9mbHVzaF9y YW5nZShwYV9zdGFydCwgcGFfZW5kKTsKK30KKworLyoqCisgKiBJbnNwaXJlZCBieSBfd2FpdF9m b3IgaW4gaW50ZWxfZHJ2LmgKKyAqIFRoaXMgaXMgTk9UIHNhZmUgZm9yIHVzZSBpbiBpbnRlcnJ1 cHQgY29udGV4dC4KKyAqCisgKiBOb3RlIHRoYXQgaXQncyBpbXBvcnRhbnQgdGhhdCB3ZSBjaGVj ayB0aGUgY29uZGl0aW9uIGFnYWluIGFmdGVyIGhhdmluZworICogdGltZWQgb3V0LCBzaW5jZSB0 aGUgdGltZW91dCBjb3VsZCBiZSBkdWUgdG8gcHJlZW1wdGlvbiBvciBzaW1pbGFyIGFuZAorICog d2UndmUgbmV2ZXIgaGFkIGEgY2hhbmNlIHRvIGNoZWNrIHRoZSBjb25kaXRpb24gYmVmb3JlIHRo ZSB0aW1lb3V0LgorICovCisjZGVmaW5lIHJrX3dhaXRfZm9yKENPTkQsIE1TKSAoeyBcCisJdW5z aWduZWQgbG9uZyB0aW1lb3V0X18gPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhNUykgKyAx OwlcCisJaW50IHJldF9fID0gMDsJCQkJCQkJXAorCXdoaWxlICghKENPTkQpKSB7CQkJCQkJXAor CQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0X18pKSB7CQkJXAorCQkJcmV0X18gPSAo Q09ORCkgPyAwIDogLUVUSU1FRE9VVDsJCVwKKwkJCWJyZWFrOwkJCQkJCVwKKwkJfQkJCQkJCQlc CisJCXVzbGVlcF9yYW5nZSg1MCwgMTAwKTsJCQkJCVwKKwl9CQkJCQkJCQlcCisJcmV0X187CQkJ CQkJCQlcCit9KQorCisvKgorICogVGhlIFJvY2tjaGlwIHJrMzI4OCBpb21tdSB1c2VzIGEgMi1s ZXZlbCBwYWdlIHRhYmxlLgorICogVGhlIGZpcnN0IGxldmVsIGlzIHRoZSAiRGlyZWN0b3J5IFRh YmxlIiAoRFQpLgorICogVGhlIERUIGNvbnNpc3RzIG9mIDEwMjQgNC1ieXRlIERpcmVjdG9yeSBU YWJsZSBFbnRyaWVzIChEVEVzKSwgZWFjaCBwb2ludGluZworICogdG8gYSAiUGFnZSBUYWJsZSIu CisgKiBUaGUgc2Vjb25kIGxldmVsIGlzIHRoZSAxMDI0IFBhZ2UgVGFibGVzIChQVCkuCisgKiBF YWNoIFBUIGNvbnNpc3RzIG9mIDEwMjQgNC1ieXRlIFBhZ2UgVGFibGUgRW50cmllcyAoUFRFcyks IGVhY2ggcG9pbnRpbmcgdG8KKyAqIGEgNCBLQiBwYWdlIG9mIHBoeXNpY2FsIG1lbW9yeS4KKyAq CisgKiBUaGUgRFQgYW5kIGVhY2ggUFQgZml0cyBpbiBhIHNpbmdsZSA0IEtCIHBhZ2UgKDQtYnl0 ZXMgKiAxMDI0IGVudHJpZXMpLgorICogRWFjaCBpb21tdSBkZXZpY2UgaGFzIGEgTU1VX0RURV9B RERSIHJlZ2lzdGVyIHRoYXQgY29udGFpbnMgdGhlIHBoeXNpY2FsCisgKiBhZGRyZXNzIG9mIHRo ZSBzdGFydCBvZiB0aGUgRFQgcGFnZS4KKyAqCisgKiBUaGUgc3RydWN0dXJlIG9mIHRoZSBwYWdl IHRhYmxlIGlzIGFzIGZvbGxvd3M6CisgKgorICogICAgICAgICAgICAgICAgICAgRFQKKyAqIE1N VV9EVEVfQUREUiAtPiArLS0tLS0rCisgKiAgICAgICAgICAgICAgICAgfCAgICAgfAorICogICAg ICAgICAgICAgICAgICstLS0tLSsgICAgIFBUCisgKiAgICAgICAgICAgICAgICAgfCBEVEUgfCAt PiArLS0tLS0rCisgKiAgICAgICAgICAgICAgICAgKy0tLS0tKyAgICB8ICAgICB8ICAgICBNZW1v cnkKKyAqICAgICAgICAgICAgICAgICB8ICAgICB8ICAgICstLS0tLSsgICAgIFBhZ2UKKyAqICAg ICAgICAgICAgICAgICB8ICAgICB8ICAgIHwgUFRFIHwgLT4gKy0tLS0tKworICogICAgICAgICAg ICAgICAgICstLS0tLSsgICAgKy0tLS0tKyAgICB8ICAgICB8CisgKiAgICAgICAgICAgICAgICAg ICAgICAgICAgICB8ICAgICB8ICAgIHwgICAgIHwKKyAqICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHwgICAgIHwgICAgfCAgICAgfAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0t LS0tKyAgICB8ICAgICB8CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHwgICAgIHwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAg fAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0rCisgKi8K KworLyoKKyAqIEVhY2ggRFRFIGhhcyBhIFBUIGFkZHJlc3MgYW5kIGEgdmFsaWQgYml0OgorICog Ky0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstKworICogfCBQVCBhZGRyZXNzICAg ICAgICAgIHwgUmVzZXJ2ZWQgIHxWfAorICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0t LS0tLSstKworICogIDMxOjEyIC0gUFQgYWRkcmVzcyAoUFRzIGFsd2F5cyBzdGFydHMgb24gYSA0 IEtCIGJvdW5kYXJ5KQorICogIDExOiAxIC0gUmVzZXJ2ZWQKKyAqICAgICAgMCAtIDEgaWYgUFQg QCBQVCBhZGRyZXNzIGlzIHZhbGlkCisgKi8KKyNkZWZpbmUgUktfRFRFX1BUX0FERFJFU1NfTUFT SyAgICAweGZmZmZmMDAwCisjZGVmaW5lIFJLX0RURV9QVF9WQUxJRCAgICAgICAgICAgQklUKDAp CisKK3N0YXRpYyBpbmxpbmUgcGh5c19hZGRyX3QgcmtfZHRlX3B0X2FkZHJlc3ModTMyIGR0ZSkK K3sKKwlyZXR1cm4gKHBoeXNfYWRkcl90KWR0ZSAmIFJLX0RURV9QVF9BRERSRVNTX01BU0s7Cit9 CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBya19kdGVfaXNfcHRfdmFsaWQodTMyIGR0ZSkKK3sKKwly ZXR1cm4gZHRlICYgUktfRFRFX1BUX1ZBTElEOworfQorCitzdGF0aWMgdTMyIHJrX21rX2R0ZSh1 MzIgKnB0KQoreworCXBoeXNfYWRkcl90IHB0X3BoeXMgPSB2aXJ0X3RvX3BoeXMocHQpOworCXJl dHVybiAocHRfcGh5cyAmIFJLX0RURV9QVF9BRERSRVNTX01BU0spIHwgUktfRFRFX1BUX1ZBTElE OworfQorCisvKgorICogRWFjaCBQVEUgaGFzIGEgUGFnZSBhZGRyZXNzLCBzb21lIGZsYWdzIGFu ZCBhIHZhbGlkIGJpdDoKKyAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tKy0tLS0tLS0rLSsK KyAqIHwgUGFnZSBhZGRyZXNzICAgICAgICB8UnN2fCBGbGFncyB8VnwKKyAqICstLS0tLS0tLS0t LS0tLS0tLS0tLS0rLS0tKy0tLS0tLS0rLSsKKyAqICAzMToxMiAtIFBhZ2UgYWRkcmVzcyAoUGFn ZXMgYWx3YXlzIHN0YXJ0IG9uIGEgNCBLQiBib3VuZGFyeSkKKyAqICAxMTogOSAtIFJlc2VydmVk CisgKiAgIDg6IDEgLSBGbGFncworICogICAgICA4IC0gUmVhZCBhbGxvY2F0ZSAtIGFsbG9jYXRl IGNhY2hlIHNwYWNlIG9uIHJlYWQgbWlzc2VzCisgKiAgICAgIDcgLSBSZWFkIGNhY2hlIC0gZW5h YmxlIGNhY2hlICYgcHJlZmV0Y2ggb2YgZGF0YQorICogICAgICA2IC0gV3JpdGUgYnVmZmVyIC0g ZW5hYmxlIGRlbGF5aW5nIHdyaXRlcyBvbiB0aGVpciB3YXkgdG8gbWVtb3J5CisgKiAgICAgIDUg LSBXcml0ZSBhbGxvY2F0ZSAtIGFsbG9jYXRlIGNhY2hlIHNwYWNlIG9uIHdyaXRlIG1pc3Nlcwor ICogICAgICA0IC0gV3JpdGUgY2FjaGUgLSBkaWZmZXJlbnQgd3JpdGVzIGNhbiBiZSBtZXJnZWQg dG9nZXRoZXIKKyAqICAgICAgMyAtIE92ZXJyaWRlIGNhY2hlIGF0dHJpYnV0ZXMKKyAqICAgICAg ICAgIGlmIDEsIGJpdHMgNC04IGNvbnRyb2wgY2FjaGUgYXR0cmlidXRlcworICogICAgICAgICAg aWYgMCwgdGhlIHN5c3RlbSBidXMgZGVmYXVsdHMgYXJlIHVzZWQKKyAqICAgICAgMiAtIFdyaXRh YmxlCisgKiAgICAgIDEgLSBSZWFkYWJsZQorICogICAgICAwIC0gMSBpZiBQYWdlIEAgUGFnZSBh ZGRyZXNzIGlzIHZhbGlkCisgKi8KKyNkZWZpbmUgUktfUFRFX1BBR0VfQUREUkVTU19NQVNLICAw eGZmZmZmMDAwCisjZGVmaW5lIFJLX1BURV9QQUdFX0ZMQUdTX01BU0sgICAgMHgwMDAwMDFmZQor I2RlZmluZSBSS19QVEVfUEFHRV9XUklUQUJMRSAgICAgIEJJVCgyKQorI2RlZmluZSBSS19QVEVf UEFHRV9SRUFEQUJMRSAgICAgIEJJVCgxKQorI2RlZmluZSBSS19QVEVfUEFHRV9WQUxJRCAgICAg ICAgIEJJVCgwKQorCitzdGF0aWMgaW5saW5lIHBoeXNfYWRkcl90IHJrX3B0ZV9wYWdlX2FkZHJl c3ModTMyIHB0ZSkKK3sKKwlyZXR1cm4gKHBoeXNfYWRkcl90KXB0ZSAmIFJLX1BURV9QQUdFX0FE RFJFU1NfTUFTSzsKK30KKworc3RhdGljIGlubGluZSBib29sIHJrX3B0ZV9pc19wYWdlX3ZhbGlk KHUzMiBwdGUpCit7CisJcmV0dXJuIHB0ZSAmIFJLX1BURV9QQUdFX1ZBTElEOworfQorCisvKiBU T0RPOiBzZXQgY2FjaGUgZmxhZ3MgcGVyIHByb3QgSU9NTVVfQ0FDSEUgKi8KK3N0YXRpYyB1MzIg cmtfbWtfcHRlKHBoeXNfYWRkcl90IHBhZ2UsIGludCBwcm90KQoreworCXUzMiBmbGFncyA9IDA7 CisJZmxhZ3MgfD0gKHByb3QgJiBJT01NVV9SRUFEKSA/IFJLX1BURV9QQUdFX1JFQURBQkxFIDog MDsKKwlmbGFncyB8PSAocHJvdCAmIElPTU1VX1dSSVRFKSA/IFJLX1BURV9QQUdFX1dSSVRBQkxF IDogMDsKKwlwYWdlICY9IFJLX1BURV9QQUdFX0FERFJFU1NfTUFTSzsKKwlyZXR1cm4gcGFnZSB8 IGZsYWdzIHwgUktfUFRFX1BBR0VfVkFMSUQ7Cit9CisKK3N0YXRpYyB1MzIgcmtfbWtfcHRlX2lu dmFsaWQodTMyIHB0ZSkKK3sKKwlyZXR1cm4gcHRlICYgflJLX1BURV9QQUdFX1ZBTElEOworfQor CisvKgorICogcmszMjg4IGlvdmEgKElPTU1VIFZpcnR1YWwgQWRkcmVzcykgZm9ybWF0CisgKiAg MzEgICAgICAgMjIuMjEgICAgICAgMTIuMTEgICAgICAgICAgMAorICogKy0tLS0tLS0tLS0tKy0t LS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rCisgKiB8IERURSBpbmRleCB8IFBURSBpbmRleCB8IFBh Z2Ugb2Zmc2V0IHwKKyAqICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tKwor ICogIDMxOjIyIC0gRFRFIGluZGV4ICAgLSBpbmRleCBvZiBEVEUgaW4gRFQKKyAqICAyMToxMiAt IFBURSBpbmRleCAgIC0gaW5kZXggb2YgUFRFIGluIFBUIEAgRFRFLnB0X2FkZHJlc3MKKyAqICAx MTogMCAtIFBhZ2Ugb2Zmc2V0IC0gb2Zmc2V0IGludG8gcGFnZSBAIFBURS5wYWdlX2FkZHJlc3MK KyAqLworI2RlZmluZSBSS19JT1ZBX0RURV9NQVNLICAgIDB4ZmZjMDAwMDAKKyNkZWZpbmUgUktf SU9WQV9EVEVfU0hJRlQgICAyMgorI2RlZmluZSBSS19JT1ZBX1BURV9NQVNLICAgIDB4MDAzZmYw MDAKKyNkZWZpbmUgUktfSU9WQV9QVEVfU0hJRlQgICAxMgorI2RlZmluZSBSS19JT1ZBX1BBR0Vf TUFTSyAgIDB4MDAwMDBmZmYKKyNkZWZpbmUgUktfSU9WQV9QQUdFX1NISUZUICAwCisKK3N0YXRp YyB1MzIgcmtfaW92YV9kdGVfaW5kZXgoZG1hX2FkZHJfdCBpb3ZhKQoreworCXJldHVybiAodTMy KShpb3ZhICYgUktfSU9WQV9EVEVfTUFTSykgPj4gUktfSU9WQV9EVEVfU0hJRlQ7Cit9CisKK3N0 YXRpYyB1MzIgcmtfaW92YV9wdGVfaW5kZXgoZG1hX2FkZHJfdCBpb3ZhKQoreworCXJldHVybiAo dTMyKShpb3ZhICYgUktfSU9WQV9QVEVfTUFTSykgPj4gUktfSU9WQV9QVEVfU0hJRlQ7Cit9CisK K3N0YXRpYyB1MzIgcmtfaW92YV9wYWdlX29mZnNldChkbWFfYWRkcl90IGlvdmEpCit7CisJcmV0 dXJuICh1MzIpKGlvdmEgJiBSS19JT1ZBX1BBR0VfTUFTSykgPj4gUktfSU9WQV9QQUdFX1NISUZU OworfQorCitzdGF0aWMgdTMyIHJrX2lvbW11X3JlYWQoc3RydWN0IHJrX2lvbW11ICppb21tdSwg dTMyIG9mZnNldCkKK3sKKwlyZXR1cm4gcmVhZGwoaW9tbXUtPmJhc2UgKyBvZmZzZXQpOworfQor CitzdGF0aWMgdm9pZCBya19pb21tdV93cml0ZShzdHJ1Y3QgcmtfaW9tbXUgKmlvbW11LCB1MzIg b2Zmc2V0LCB1MzIgdmFsdWUpCit7CisJd3JpdGVsKHZhbHVlLCBpb21tdS0+YmFzZSArIG9mZnNl dCk7Cit9CisKK3N0YXRpYyB2b2lkIHJrX2lvbW11X2NvbW1hbmQoc3RydWN0IHJrX2lvbW11ICpp b21tdSwgdTMyIGNvbW1hbmQpCit7CisJd3JpdGVsKGNvbW1hbmQsIGlvbW11LT5iYXNlICsgUktf TU1VX0NPTU1BTkQpOworfQorCitzdGF0aWMgdm9pZCBya19pb21tdV96YXBfbGluZXMoc3RydWN0 IHJrX2lvbW11ICppb21tdSwgZG1hX2FkZHJfdCBpb3ZhLAorCQkJICAgICAgIHNpemVfdCBzaXpl KQoreworCWRtYV9hZGRyX3QgaW92YV9lbmQgPSBpb3ZhICsgc2l6ZTsKKwkvKgorCSAqIFRPRE8o ZGprdXJ0eik6IEZpZ3VyZSBvdXQgd2hlbiBpdCBpcyBtb3JlIGVmZmljaWVudCB0byBzaG9vdGRv d24gdGhlCisJICogZW50aXJlIGlvdGxiIHJhdGhlciB0aGFuIGl0ZXJhdGUgb3ZlciBpbmRpdmlk dWFsIGlvdmFzLgorCSAqLworCWZvciAoOyBpb3ZhIDwgaW92YV9lbmQ7IGlvdmEgKz0gU1BBR0Vf U0laRSkKKwkJcmtfaW9tbXVfd3JpdGUoaW9tbXUsIFJLX01NVV9aQVBfT05FX0xJTkUsIGlvdmEp OworfQorCitzdGF0aWMgYm9vbCBya19pb21tdV9pc19zdGFsbF9hY3RpdmUoc3RydWN0IHJrX2lv bW11ICppb21tdSkKK3sKKwlyZXR1cm4gcmtfaW9tbXVfcmVhZChpb21tdSwgUktfTU1VX1NUQVRV UykgJiBSS19NTVVfU1RBVFVTX1NUQUxMX0FDVElWRTsKK30KKworc3RhdGljIGJvb2wgcmtfaW9t bXVfaXNfcGFnaW5nX2VuYWJsZWQoc3RydWN0IHJrX2lvbW11ICppb21tdSkKK3sKKwlyZXR1cm4g cmtfaW9tbXVfcmVhZChpb21tdSwgUktfTU1VX1NUQVRVUykgJgorCQkJICAgICBSS19NTVVfU1RB VFVTX1BBR0lOR19FTkFCTEVEOworfQorCitzdGF0aWMgaW50IHJrX2lvbW11X2VuYWJsZV9zdGFs bChzdHJ1Y3QgcmtfaW9tbXUgKmlvbW11KQoreworCWludCByZXQ7CisKKwlpZiAocmtfaW9tbXVf aXNfc3RhbGxfYWN0aXZlKGlvbW11KSkKKwkJcmV0dXJuIDA7CisKKwkvKiBTdGFsbCBjYW4gb25s eSBiZSBlbmFibGVkIGlmIHBhZ2luZyBpcyBlbmFibGVkICovCisJaWYgKCFya19pb21tdV9pc19w YWdpbmdfZW5hYmxlZChpb21tdSkpCisJCXJldHVybiAwOworCisJcmtfaW9tbXVfY29tbWFuZChp b21tdSwgUktfTU1VX0NNRF9FTkFCTEVfU1RBTEwpOworCisJcmV0ID0gcmtfd2FpdF9mb3Iocmtf aW9tbXVfaXNfc3RhbGxfYWN0aXZlKGlvbW11KSwgMSk7CisJaWYgKHJldCkKKwkJZGV2X2Vycihp b21tdS0+ZGV2LCAiRW5hYmxlIHN0YWxsIHJlcXVlc3QgdGltZWQgb3V0LCBzdGF0dXM6ICUjMDh4 XG4iLAorCQkJcmtfaW9tbXVfcmVhZChpb21tdSwgUktfTU1VX1NUQVRVUykpOworCisJcmV0dXJu IHJldDsKK30KKworc3RhdGljIGludCBya19pb21tdV9kaXNhYmxlX3N0YWxsKHN0cnVjdCBya19p b21tdSAqaW9tbXUpCit7CisJaW50IHJldDsKKworCWlmICghcmtfaW9tbXVfaXNfc3RhbGxfYWN0 aXZlKGlvbW11KSkKKwkJcmV0dXJuIDA7CisKKwlya19pb21tdV9jb21tYW5kKGlvbW11LCBSS19N TVVfQ01EX0RJU0FCTEVfU1RBTEwpOworCisJcmV0ID0gcmtfd2FpdF9mb3IoIXJrX2lvbW11X2lz X3N0YWxsX2FjdGl2ZShpb21tdSksIDEpOworCWlmIChyZXQpCisJCWRldl9lcnIoaW9tbXUtPmRl diwgIkRpc2FibGUgc3RhbGwgcmVxdWVzdCB0aW1lZCBvdXQsIHN0YXR1czogJSMwOHhcbiIsCisJ CQlya19pb21tdV9yZWFkKGlvbW11LCBSS19NTVVfU1RBVFVTKSk7CisKKwlyZXR1cm4gcmV0Owor fQorCitzdGF0aWMgaW50IHJrX2lvbW11X2VuYWJsZV9wYWdpbmcoc3RydWN0IHJrX2lvbW11ICpp b21tdSkKK3sKKwlpbnQgcmV0OworCisJaWYgKHJrX2lvbW11X2lzX3BhZ2luZ19lbmFibGVkKGlv bW11KSkKKwkJcmV0dXJuIDA7CisKKwlya19pb21tdV9jb21tYW5kKGlvbW11LCBSS19NTVVfQ01E X0VOQUJMRV9QQUdJTkcpOworCisJcmV0ID0gcmtfd2FpdF9mb3IocmtfaW9tbXVfaXNfcGFnaW5n X2VuYWJsZWQoaW9tbXUpLCAxKTsKKwlpZiAocmV0KQorCQlkZXZfZXJyKGlvbW11LT5kZXYsICJF bmFibGUgcGFnaW5nIHJlcXVlc3QgdGltZWQgb3V0LCBzdGF0dXM6ICUjMDh4XG4iLAorCQkJcmtf aW9tbXVfcmVhZChpb21tdSwgUktfTU1VX1NUQVRVUykpOworCisJcmV0dXJuIHJldDsKK30KKwor c3RhdGljIGludCBya19pb21tdV9kaXNhYmxlX3BhZ2luZyhzdHJ1Y3QgcmtfaW9tbXUgKmlvbW11 KQoreworCWludCByZXQ7CisKKwlpZiAoIXJrX2lvbW11X2lzX3BhZ2luZ19lbmFibGVkKGlvbW11 KSkKKwkJcmV0dXJuIDA7CisKKwlya19pb21tdV9jb21tYW5kKGlvbW11LCBSS19NTVVfQ01EX0RJ U0FCTEVfUEFHSU5HKTsKKworCXJldCA9IHJrX3dhaXRfZm9yKCFya19pb21tdV9pc19wYWdpbmdf ZW5hYmxlZChpb21tdSksIDEpOworCWlmIChyZXQpCisJCWRldl9lcnIoaW9tbXUtPmRldiwgIkRp c2FibGUgcGFnaW5nIHJlcXVlc3QgdGltZWQgb3V0LCBzdGF0dXM6ICMlMDh4XG4iLAorCQkJcmtf aW9tbXVfcmVhZChpb21tdSwgUktfTU1VX1NUQVRVUykpOworCisJcmV0dXJuIHJldDsKK30KKwor c3RhdGljIGludCBya19pb21tdV9mb3JjZV9yZXNldChzdHJ1Y3QgcmtfaW9tbXUgKmlvbW11KQor eworCWludCByZXQ7CisJdTMyIGR0ZV9hZGRyOworCisJLyoKKwkgKiBDaGVjayBpZiByZWdpc3Rl ciBEVEVfQUREUiBpcyB3b3JraW5nIGJ5IHdyaXRpbmcgRFRFX0FERFJfRFVNTVkKKwkgKiBhbmQg dmVyaWZ5aW5nIHRoYXQgdXBwZXIgNSBueWJibGVzIGFyZSByZWFkIGJhY2suCisJICovCisJcmtf aW9tbXVfd3JpdGUoaW9tbXUsIFJLX01NVV9EVEVfQUREUiwgRFRFX0FERFJfRFVNTVkpOworCisJ ZHRlX2FkZHIgPSBya19pb21tdV9yZWFkKGlvbW11LCBSS19NTVVfRFRFX0FERFIpOworCWlmIChk dGVfYWRkciAhPSAoRFRFX0FERFJfRFVNTVkgJiBSS19EVEVfUFRfQUREUkVTU19NQVNLKSkgewor CQlkZXZfZXJyKGlvbW11LT5kZXYsICJFcnJvciBkdXJpbmcgcmF3IHJlc2V0LiBNTVVfRFRFX0FE RFIgaXMgbm90IGZ1bmN0aW9uaW5nXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcmtf aW9tbXVfY29tbWFuZChpb21tdSwgUktfTU1VX0NNRF9GT1JDRV9SRVNFVCk7CisKKwlyZXQgPSBy a193YWl0X2Zvcihya19pb21tdV9yZWFkKGlvbW11LCBSS19NTVVfRFRFX0FERFIpID09IDB4MDAw MDAwMDAsCisJCQkgIEZPUkNFX1JFU0VUX1RJTUVPVVQpOworCWlmIChyZXQpCisJCWRldl9lcnIo aW9tbXUtPmRldiwgIkZPUkNFX1JFU0VUIGNvbW1hbmQgdGltZWQgb3V0XG4iKTsKKworCXJldHVy biByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGxvZ19pb3ZhKHN0cnVjdCBya19pb21tdSAqaW9tbXUs IGRtYV9hZGRyX3QgaW92YSkKK3sKKwl1MzIgZHRlX2luZGV4LCBwdGVfaW5kZXgsIHBhZ2Vfb2Zm c2V0OworCXUzMiBtbXVfZHRlX2FkZHI7CisJcGh5c19hZGRyX3QgbW11X2R0ZV9hZGRyX3BoeXMs IGR0ZV9hZGRyX3BoeXM7CisJdTMyICpkdGVfYWRkcjsKKwl1MzIgZHRlOworCXBoeXNfYWRkcl90 IHB0ZV9hZGRyX3BoeXMgPSAwOworCXUzMiAqcHRlX2FkZHIgPSBOVUxMOworCXUzMiBwdGUgPSAw OworCXBoeXNfYWRkcl90IHBhZ2VfYWRkcl9waHlzID0gMDsKKwl1MzIgcGFnZV9mbGFncyA9IDA7 CisKKwlkdGVfaW5kZXggPSBya19pb3ZhX2R0ZV9pbmRleChpb3ZhKTsKKwlwdGVfaW5kZXggPSBy a19pb3ZhX3B0ZV9pbmRleChpb3ZhKTsKKwlwYWdlX29mZnNldCA9IHJrX2lvdmFfcGFnZV9vZmZz ZXQoaW92YSk7CisKKwltbXVfZHRlX2FkZHIgPSBya19pb21tdV9yZWFkKGlvbW11LCBSS19NTVVf RFRFX0FERFIpOworCW1tdV9kdGVfYWRkcl9waHlzID0gKHBoeXNfYWRkcl90KW1tdV9kdGVfYWRk cjsKKworCWR0ZV9hZGRyX3BoeXMgPSBtbXVfZHRlX2FkZHJfcGh5cyArICg0ICogZHRlX2luZGV4 KTsKKwlkdGVfYWRkciA9IHBoeXNfdG9fdmlydChkdGVfYWRkcl9waHlzKTsKKwlkdGUgPSAqZHRl X2FkZHI7CisKKwlpZiAoIXJrX2R0ZV9pc19wdF92YWxpZChkdGUpKQorCQlnb3RvIHByaW50X2l0 OworCisJcHRlX2FkZHJfcGh5cyA9IHJrX2R0ZV9wdF9hZGRyZXNzKGR0ZSkgKyAocHRlX2luZGV4 ICogNCk7CisJcHRlX2FkZHIgPSBwaHlzX3RvX3ZpcnQocHRlX2FkZHJfcGh5cyk7CisJcHRlID0g KnB0ZV9hZGRyOworCisJaWYgKCFya19wdGVfaXNfcGFnZV92YWxpZChwdGUpKQorCQlnb3RvIHBy aW50X2l0OworCisJcGFnZV9hZGRyX3BoeXMgPSBya19wdGVfcGFnZV9hZGRyZXNzKHB0ZSkgKyBw YWdlX29mZnNldDsKKwlwYWdlX2ZsYWdzID0gcHRlICYgUktfUFRFX1BBR0VfRkxBR1NfTUFTSzsK KworcHJpbnRfaXQ6CisJZGV2X2Vycihpb21tdS0+ZGV2LCAiaW92YSA9ICVwYWQ6IGR0ZV9pbmRl eDogMHglMDN4IHB0ZV9pbmRleDogMHglMDN4IHBhZ2Vfb2Zmc2V0OiAweCUwM3hcbiIsCisJCSZp b3ZhLCBkdGVfaW5kZXgsIHB0ZV9pbmRleCwgcGFnZV9vZmZzZXQpOworCWRldl9lcnIoaW9tbXUt PmRldiwgIm1tdV9kdGVfYWRkcjogJXBhIGR0ZUAlcGE6ICUjMDh4IHZhbGlkOiAldSBwdGVAJXBh OiAlIzA4eCB2YWxpZDogJXUgcGFnZUAlcGEgZmxhZ3M6ICUjMDN4XG4iLAorCQkmbW11X2R0ZV9h ZGRyX3BoeXMsICZkdGVfYWRkcl9waHlzLCBkdGUsCisJCXJrX2R0ZV9pc19wdF92YWxpZChkdGUp LCAmcHRlX2FkZHJfcGh5cywgcHRlLAorCQlya19wdGVfaXNfcGFnZV92YWxpZChwdGUpLCAmcGFn ZV9hZGRyX3BoeXMsIHBhZ2VfZmxhZ3MpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgcmtfaW9t bXVfaXJxKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgcmtfaW9tbXUgKmlvbW11 ID0gZGV2X2lkOworCXUzMiBzdGF0dXM7CisJdTMyIGludF9zdGF0dXM7CisJZG1hX2FkZHJfdCBp b3ZhOworCisJaW50X3N0YXR1cyA9IHJrX2lvbW11X3JlYWQoaW9tbXUsIFJLX01NVV9JTlRfU1RB VFVTKTsKKwlpZiAoaW50X3N0YXR1cyA9PSAwKQorCQlyZXR1cm4gSVJRX05PTkU7CisKKwlpb3Zh ID0gcmtfaW9tbXVfcmVhZChpb21tdSwgUktfTU1VX1BBR0VfRkFVTFRfQUREUik7CisKKwlpZiAo aW50X3N0YXR1cyAmIFJLX01NVV9JUlFfUEFHRV9GQVVMVCkgeworCQlpbnQgZmxhZ3M7CisKKwkJ c3RhdHVzID0gcmtfaW9tbXVfcmVhZChpb21tdSwgUktfTU1VX1NUQVRVUyk7CisJCWZsYWdzID0g KHN0YXR1cyAmIFJLX01NVV9TVEFUVVNfUEFHRV9GQVVMVF9JU19XUklURSkgPworCQkJCUlPTU1V X0ZBVUxUX1dSSVRFIDogSU9NTVVfRkFVTFRfUkVBRDsKKworCQlkZXZfZXJyKGlvbW11LT5kZXYs ICJQYWdlIGZhdWx0IGF0ICVwYWQgb2YgdHlwZSAlc1xuIiwKKwkJCSZpb3ZhLAorCQkJKGZsYWdz ID09IElPTU1VX0ZBVUxUX1dSSVRFKSA/ICJ3cml0ZSIgOiAicmVhZCIpOworCisJCWxvZ19pb3Zh KGlvbW11LCBpb3ZhKTsKKworCQkvKgorCQkgKiBSZXBvcnQgcGFnZSBmYXVsdCB0byBhbnkgaW5z dGFsbGVkIGhhbmRsZXJzLgorCQkgKiBJZ25vcmUgdGhlIHJldHVybiBjb2RlLCB0aG91Z2gsIHNp bmNlIHdlIGFsd2F5cyB6YXAgY2FjaGUKKwkJICogYW5kIGNsZWFyIHRoZSBwYWdlIGZhdWx0IGFu eXdheS4KKwkJICovCisJCWlmIChpb21tdS0+ZG9tYWluKQorCQkJcmVwb3J0X2lvbW11X2ZhdWx0 KGlvbW11LT5kb21haW4sIGlvbW11LT5kZXYsIGlvdmEsCisJCQkJCSAgIGZsYWdzKTsKKwkJZWxz ZQorCQkJZGV2X2Vycihpb21tdS0+ZGV2LCAiUGFnZSBmYXVsdCB3aGlsZSBpb21tdSBub3QgYXR0 YWNoZWQgdG8gZG9tYWluP1xuIik7CisKKwkJcmtfaW9tbXVfY29tbWFuZChpb21tdSwgUktfTU1V X0NNRF9aQVBfQ0FDSEUpOworCQlya19pb21tdV9jb21tYW5kKGlvbW11LCBSS19NTVVfQ01EX1BB R0VfRkFVTFRfRE9ORSk7CisJfQorCisJaWYgKGludF9zdGF0dXMgJiBSS19NTVVfSVJRX0JVU19F UlJPUikKKwkJZGV2X2Vycihpb21tdS0+ZGV2LCAiQlVTX0VSUk9SIG9jY3VycmVkIGF0ICVwYWRc biIsICZpb3ZhKTsKKworCWlmIChpbnRfc3RhdHVzICYgflJLX01NVV9JUlFfTUFTSykKKwkJZGV2 X2Vycihpb21tdS0+ZGV2LCAidW5leHBlY3RlZCBpbnRfc3RhdHVzOiAlIzA4eFxuIiwKKwkJCWlu dF9zdGF0dXMpOworCisJcmtfaW9tbXVfd3JpdGUoaW9tbXUsIFJLX01NVV9JTlRfQ0xFQVIsIGlu dF9zdGF0dXMpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgcGh5c19hZGRy X3QgcmtfaW9tbXVfaW92YV90b19waHlzKHN0cnVjdCBpb21tdV9kb21haW4gKmRvbWFpbiwKKwkJ CQkJIGRtYV9hZGRyX3QgaW92YSkKK3sKKwlzdHJ1Y3QgcmtfaW9tbXVfZG9tYWluICpya19kb21h aW4gPSBkb21haW4tPnByaXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlwaHlzX2FkZHJfdCBw dF9waHlzLCBwaHlzID0gMDsKKwl1MzIgZHRlLCBwdGU7CisJdTMyICpwYWdlX3RhYmxlOworCisJ c3Bpbl9sb2NrX2lycXNhdmUoJnJrX2RvbWFpbi0+ZHRfbG9jaywgZmxhZ3MpOworCisJZHRlID0g cmtfZG9tYWluLT5kdFtya19pb3ZhX2R0ZV9pbmRleChpb3ZhKV07CisJaWYgKCFya19kdGVfaXNf cHRfdmFsaWQoZHRlKSkKKwkJZ290byBvdXQ7CisKKwlwdF9waHlzID0gcmtfZHRlX3B0X2FkZHJl c3MoZHRlKTsKKwlwYWdlX3RhYmxlID0gKHUzMiAqKXBoeXNfdG9fdmlydChwdF9waHlzKTsKKwlw dGUgPSBwYWdlX3RhYmxlW3JrX2lvdmFfcHRlX2luZGV4KGlvdmEpXTsKKwlpZiAoIXJrX3B0ZV9p c19wYWdlX3ZhbGlkKHB0ZSkpCisJCWdvdG8gb3V0OworCisJcGh5cyA9IHJrX3B0ZV9wYWdlX2Fk ZHJlc3MocHRlKSArIHJrX2lvdmFfcGFnZV9vZmZzZXQoaW92YSk7CitvdXQ6CisJc3Bpbl91bmxv Y2tfaXJxcmVzdG9yZSgmcmtfZG9tYWluLT5kdF9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcGh5 czsKK30KKworc3RhdGljIHZvaWQgcmtfaW9tbXVfemFwX2lvdmEoc3RydWN0IHJrX2lvbW11X2Rv bWFpbiAqcmtfZG9tYWluLAorCQkJICAgICAgZG1hX2FkZHJfdCBpb3ZhLCBzaXplX3Qgc2l6ZSkK K3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8q IHNob290ZG93biB0aGVzZSBpb3ZhIGZyb20gYWxsIGlvbW11cyB1c2luZyB0aGlzIGRvbWFpbiAq LworCXNwaW5fbG9ja19pcnFzYXZlKCZya19kb21haW4tPmlvbW11c19sb2NrLCBmbGFncyk7CisJ bGlzdF9mb3JfZWFjaChwb3MsICZya19kb21haW4tPmlvbW11cykgeworCQlzdHJ1Y3QgcmtfaW9t bXUgKmlvbW11OworCQlpb21tdSA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3QgcmtfaW9tbXUsIG5v ZGUpOworCQlya19pb21tdV96YXBfbGluZXMoaW9tbXUsIGlvdmEsIHNpemUpOworCX0KKwlzcGlu X3VubG9ja19pcnFyZXN0b3JlKCZya19kb21haW4tPmlvbW11c19sb2NrLCBmbGFncyk7Cit9CisK K3N0YXRpYyB1MzIgKnJrX2R0ZV9nZXRfcGFnZV90YWJsZShzdHJ1Y3QgcmtfaW9tbXVfZG9tYWlu ICpya19kb21haW4sCisJCQkJICBkbWFfYWRkcl90IGlvdmEpCit7CisJdTMyICpwYWdlX3RhYmxl LCAqZHRlX2FkZHI7CisJdTMyIGR0ZTsKKwlwaHlzX2FkZHJfdCBwdF9waHlzOworCisJYXNzZXJ0 X3NwaW5fbG9ja2VkKCZya19kb21haW4tPmR0X2xvY2spOworCisJZHRlX2FkZHIgPSAmcmtfZG9t YWluLT5kdFtya19pb3ZhX2R0ZV9pbmRleChpb3ZhKV07CisJZHRlID0gKmR0ZV9hZGRyOworCWlm IChya19kdGVfaXNfcHRfdmFsaWQoZHRlKSkKKwkJZ290byBkb25lOworCisJcGFnZV90YWJsZSA9 ICh1MzIgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0FUT01JQyB8IEdGUF9ETUEzMik7CisJaWYgKCFw YWdlX3RhYmxlKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCWR0ZSA9IHJrX21rX2R0 ZShwYWdlX3RhYmxlKTsKKwkqZHRlX2FkZHIgPSBkdGU7CisKKwlya190YWJsZV9mbHVzaChwYWdl X3RhYmxlLCBOVU1fUFRfRU5UUklFUyk7CisJcmtfdGFibGVfZmx1c2goZHRlX2FkZHIsIDEpOwor CisJLyoKKwkgKiBaYXAgdGhlIGZpcnN0IGlvdmEgb2YgbmV3bHkgYWxsb2NhdGVkIHBhZ2UgdGFi bGUgc28gaW9tbXUgZXZpY3RzCisJICogb2xkIGNhY2hlZCB2YWx1ZSBvZiBuZXcgZHRlIGZyb20g dGhlIGlvdGxiLgorCSAqLworCXJrX2lvbW11X3phcF9pb3ZhKHJrX2RvbWFpbiwgaW92YSwgU1BB R0VfU0laRSk7CisKK2RvbmU6CisJcHRfcGh5cyA9IHJrX2R0ZV9wdF9hZGRyZXNzKGR0ZSk7CisJ cmV0dXJuICh1MzIgKilwaHlzX3RvX3ZpcnQocHRfcGh5cyk7Cit9CisKK3N0YXRpYyBzaXplX3Qg cmtfaW9tbXVfdW5tYXBfaW92YShzdHJ1Y3QgcmtfaW9tbXVfZG9tYWluICpya19kb21haW4sCisJ CQkJICB1MzIgKnB0ZV9hZGRyLCBkbWFfYWRkcl90IGlvdmEsIHNpemVfdCBzaXplKQoreworCXVu c2lnbmVkIGludCBwdGVfY291bnQ7CisJdW5zaWduZWQgaW50IHB0ZV90b3RhbCA9IHNpemUgLyBT UEFHRV9TSVpFOworCisJYXNzZXJ0X3NwaW5fbG9ja2VkKCZya19kb21haW4tPmR0X2xvY2spOwor CisJZm9yIChwdGVfY291bnQgPSAwOyBwdGVfY291bnQgPCBwdGVfdG90YWw7IHB0ZV9jb3VudCsr KSB7CisJCXUzMiBwdGUgPSBwdGVfYWRkcltwdGVfY291bnRdOworCQlpZiAoIXJrX3B0ZV9pc19w YWdlX3ZhbGlkKHB0ZSkpCisJCQlicmVhazsKKworCQlwdGVfYWRkcltwdGVfY291bnRdID0gcmtf bWtfcHRlX2ludmFsaWQocHRlKTsKKwl9CisKKwlya190YWJsZV9mbHVzaChwdGVfYWRkciwgcHRl X2NvdW50KTsKKworCXJldHVybiBwdGVfY291bnQgKiBTUEFHRV9TSVpFOworfQorCitzdGF0aWMg aW50IHJrX2lvbW11X21hcF9pb3ZhKHN0cnVjdCBya19pb21tdV9kb21haW4gKnJrX2RvbWFpbiwg dTMyICpwdGVfYWRkciwKKwkJCSAgICAgZG1hX2FkZHJfdCBpb3ZhLCBwaHlzX2FkZHJfdCBwYWRk ciwgc2l6ZV90IHNpemUsCisJCQkgICAgIGludCBwcm90KQoreworCXVuc2lnbmVkIGludCBwdGVf Y291bnQ7CisJdW5zaWduZWQgaW50IHB0ZV90b3RhbCA9IHNpemUgLyBTUEFHRV9TSVpFOworCXBo eXNfYWRkcl90IHBhZ2VfcGh5czsKKworCWFzc2VydF9zcGluX2xvY2tlZCgmcmtfZG9tYWluLT5k dF9sb2NrKTsKKworCWZvciAocHRlX2NvdW50ID0gMDsgcHRlX2NvdW50IDwgcHRlX3RvdGFsOyBw dGVfY291bnQrKykgeworCQl1MzIgcHRlID0gcHRlX2FkZHJbcHRlX2NvdW50XTsKKworCQlpZiAo cmtfcHRlX2lzX3BhZ2VfdmFsaWQocHRlKSkKKwkJCWdvdG8gdW53aW5kOworCisJCXB0ZV9hZGRy W3B0ZV9jb3VudF0gPSBya19ta19wdGUocGFkZHIsIHByb3QpOworCisJCXBhZGRyICs9IFNQQUdF X1NJWkU7CisJfQorCisJcmtfdGFibGVfZmx1c2gocHRlX2FkZHIsIHB0ZV9jb3VudCk7CisKKwly ZXR1cm4gMDsKK3Vud2luZDoKKwkvKiBVbm1hcCB0aGUgcmFuZ2Ugb2YgaW92YXMgdGhhdCB3ZSBq dXN0IG1hcHBlZCAqLworCXJrX2lvbW11X3VubWFwX2lvdmEocmtfZG9tYWluLCBwdGVfYWRkciwg aW92YSwgcHRlX2NvdW50ICogU1BBR0VfU0laRSk7CisKKwlpb3ZhICs9IHB0ZV9jb3VudCAqIFNQ QUdFX1NJWkU7CisJcGFnZV9waHlzID0gcmtfcHRlX3BhZ2VfYWRkcmVzcyhwdGVfYWRkcltwdGVf Y291bnRdKTsKKwlwcl9lcnIoImlvdmE6ICVwYWQgYWxyZWFkeSBtYXBwZWQgdG8gJXBhIGNhbm5v dCByZW1hcCB0byBwaHlzOiAlcGEgcHJvdDolI3hcbiIsCisJICAgICAgICZpb3ZhLCAmcGFnZV9w aHlzLCAmcGFkZHIsIHByb3QpOworCisJcmV0dXJuIC1FQUREUklOVVNFOworfQorCitzdGF0aWMg aW50IHJrX2lvbW11X21hcChzdHJ1Y3QgaW9tbXVfZG9tYWluICpkb21haW4sIHVuc2lnbmVkIGxv bmcgX2lvdmEsCisJCQlwaHlzX2FkZHJfdCBwYWRkciwgc2l6ZV90IHNpemUsIGludCBwcm90KQor eworCXN0cnVjdCBya19pb21tdV9kb21haW4gKnJrX2RvbWFpbiA9IGRvbWFpbi0+cHJpdjsKKwl1 bnNpZ25lZCBsb25nIGZsYWdzOworCWRtYV9hZGRyX3QgaW92YSA9IChkbWFfYWRkcl90KV9pb3Zh OworCXUzMiAqcGFnZV90YWJsZSwgKnB0ZV9hZGRyOworCWludCByZXQ7CisKKwlzcGluX2xvY2tf aXJxc2F2ZSgmcmtfZG9tYWluLT5kdF9sb2NrLCBmbGFncyk7CisKKwkvKgorCSAqIHBnc2l6ZV9i aXRtYXAgc3BlY2lmaWVzIGlvdmEgc2l6ZXMgdGhhdCBmaXQgaW4gb25lIHBhZ2UgdGFibGUKKwkg KiAoMTAyNCA0LUtpQiBwYWdlcyA9IDQgTWlCKS4KKwkgKiBTbywgc2l6ZSB3aWxsIGFsd2F5cyBi ZSA0MDk2IDw9IHNpemUgPD0gNDE5NDMwNC4KKwkgKiBTaW5jZSBpb21tdV9tYXAoKSBndWFyYW50 ZWVzIHRoYXQgYm90aCBpb3ZhIGFuZCBzaXplIHdpbGwgYmUKKwkgKiBhbGlnbmVkLCB3ZSB3aWxs IGFsd2F5cyBvbmx5IGJlIG1hcHBpbmcgZnJvbSBhIHNpbmdsZSBkdGUgaGVyZS4KKwkgKi8KKwlw YWdlX3RhYmxlID0gcmtfZHRlX2dldF9wYWdlX3RhYmxlKHJrX2RvbWFpbiwgaW92YSk7CisJaWYg KElTX0VSUihwYWdlX3RhYmxlKSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZya19kb21h aW4tPmR0X2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIFBUUl9FUlIocGFnZV90YWJsZSk7CisJfQor CisJcHRlX2FkZHIgPSAmcGFnZV90YWJsZVtya19pb3ZhX3B0ZV9pbmRleChpb3ZhKV07CisJcmV0 ID0gcmtfaW9tbXVfbWFwX2lvdmEocmtfZG9tYWluLCBwdGVfYWRkciwgaW92YSwgcGFkZHIsIHNp emUsIHByb3QpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJrX2RvbWFpbi0+ZHRfbG9jaywg ZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNpemVfdCBya19pb21tdV91bm1h cChzdHJ1Y3QgaW9tbXVfZG9tYWluICpkb21haW4sIHVuc2lnbmVkIGxvbmcgX2lvdmEsCisJCQkg ICAgIHNpemVfdCBzaXplKQoreworCXN0cnVjdCBya19pb21tdV9kb21haW4gKnJrX2RvbWFpbiA9 IGRvbWFpbi0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWRtYV9hZGRyX3QgaW92YSA9 IChkbWFfYWRkcl90KV9pb3ZhOworCXBoeXNfYWRkcl90IHB0X3BoeXM7CisJdTMyIGR0ZTsKKwl1 MzIgKnB0ZV9hZGRyOworCXNpemVfdCB1bm1hcF9zaXplOworCisJc3Bpbl9sb2NrX2lycXNhdmUo JnJrX2RvbWFpbi0+ZHRfbG9jaywgZmxhZ3MpOworCisJLyoKKwkgKiBwZ3NpemVfYml0bWFwIHNw ZWNpZmllcyBpb3ZhIHNpemVzIHRoYXQgZml0IGluIG9uZSBwYWdlIHRhYmxlCisJICogKDEwMjQg NC1LaUIgcGFnZXMgPSA0IE1pQikuCisJICogU28sIHNpemUgd2lsbCBhbHdheXMgYmUgNDA5NiA8 PSBzaXplIDw9IDQxOTQzMDQuCisJICogU2luY2UgaW9tbXVfdW5tYXAoKSBndWFyYW50ZWVzIHRo YXQgYm90aCBpb3ZhIGFuZCBzaXplIHdpbGwgYmUKKwkgKiBhbGlnbmVkLCB3ZSB3aWxsIGFsd2F5 cyBvbmx5IGJlIHVubWFwcGluZyBmcm9tIGEgc2luZ2xlIGR0ZSBoZXJlLgorCSAqLworCWR0ZSA9 IHJrX2RvbWFpbi0+ZHRbcmtfaW92YV9kdGVfaW5kZXgoaW92YSldOworCS8qIEp1c3QgcmV0dXJu IDAgaWYgaW92YSBpcyB1bm1hcHBlZCAqLworCWlmICghcmtfZHRlX2lzX3B0X3ZhbGlkKGR0ZSkp IHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcmtfZG9tYWluLT5kdF9sb2NrLCBmbGFncyk7 CisJCXJldHVybiAwOworCX0KKworCXB0X3BoeXMgPSBya19kdGVfcHRfYWRkcmVzcyhkdGUpOwor CXB0ZV9hZGRyID0gKHUzMiAqKXBoeXNfdG9fdmlydChwdF9waHlzKSArIHJrX2lvdmFfcHRlX2lu ZGV4KGlvdmEpOworCXVubWFwX3NpemUgPSBya19pb21tdV91bm1hcF9pb3ZhKHJrX2RvbWFpbiwg cHRlX2FkZHIsIGlvdmEsIHNpemUpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcmtfZG9t YWluLT5kdF9sb2NrLCBmbGFncyk7CisKKwkvKiBTaG9vdGRvd24gaW90bGIgZW50cmllcyBmb3Ig aW92YSByYW5nZSB0aGF0IHdhcyBqdXN0IHVubWFwcGVkICovCisJcmtfaW9tbXVfemFwX2lvdmEo cmtfZG9tYWluLCBpb3ZhLCB1bm1hcF9zaXplKTsKKworCXJldHVybiB1bm1hcF9zaXplOworfQor CitzdGF0aWMgc3RydWN0IHJrX2lvbW11ICpya19pb21tdV9mcm9tX2RldihzdHJ1Y3QgZGV2aWNl ICpkZXYpCit7CisJc3RydWN0IGlvbW11X2dyb3VwICpncm91cDsKKwlzdHJ1Y3QgZGV2aWNlICpp b21tdV9kZXY7CisJc3RydWN0IHJrX2lvbW11ICpya19pb21tdTsKKworCWdyb3VwID0gaW9tbXVf Z3JvdXBfZ2V0KGRldik7CisJaWYgKCFncm91cCkKKwkJcmV0dXJuIE5VTEw7CisJaW9tbXVfZGV2 ID0gaW9tbXVfZ3JvdXBfZ2V0X2lvbW11ZGF0YShncm91cCk7CisJcmtfaW9tbXUgPSBkZXZfZ2V0 X2RydmRhdGEoaW9tbXVfZGV2KTsKKwlpb21tdV9ncm91cF9wdXQoZ3JvdXApOworCisJcmV0dXJu IHJrX2lvbW11OworfQorCitzdGF0aWMgaW50IHJrX2lvbW11X2F0dGFjaF9kZXZpY2Uoc3RydWN0 IGlvbW11X2RvbWFpbiAqZG9tYWluLAorCQkJCSAgc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0 cnVjdCBya19pb21tdSAqaW9tbXU7CisJc3RydWN0IHJrX2lvbW11X2RvbWFpbiAqcmtfZG9tYWlu ID0gZG9tYWluLT5wcml2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldDsKKwlwaHlz X2FkZHJfdCBkdGVfYWRkcjsKKworCS8qCisJICogQWxsb3cgJ3ZpcnR1YWwgZGV2aWNlcycgKGUu Zy4sIGRybSkgdG8gYXR0YWNoIHRvIGRvbWFpbi4KKwkgKiBTdWNoIGEgZGV2aWNlIGRvZXMgbm90 IGJlbG9uZyB0byBhbiBpb21tdSBncm91cC4KKwkgKi8KKwlpb21tdSA9IHJrX2lvbW11X2Zyb21f ZGV2KGRldik7CisJaWYgKCFpb21tdSkKKwkJcmV0dXJuIDA7CisKKwlyZXQgPSBya19pb21tdV9l bmFibGVfc3RhbGwoaW9tbXUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBy a19pb21tdV9mb3JjZV9yZXNldChpb21tdSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwor CWlvbW11LT5kb21haW4gPSBkb21haW47CisKKwlyZXQgPSBkZXZtX3JlcXVlc3RfaXJxKGRldiwg aW9tbXUtPmlycSwgcmtfaW9tbXVfaXJxLAorCQkJICAgICAgIElSUUZfU0hBUkVELCBkZXZfbmFt ZShkZXYpLCBpb21tdSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWR0ZV9hZGRyID0g dmlydF90b19waHlzKHJrX2RvbWFpbi0+ZHQpOworCXJrX2lvbW11X3dyaXRlKGlvbW11LCBSS19N TVVfRFRFX0FERFIsIGR0ZV9hZGRyKTsKKwlya19pb21tdV9jb21tYW5kKGlvbW11LCBSS19NTVVf Q01EX1pBUF9DQUNIRSk7CisJcmtfaW9tbXVfd3JpdGUoaW9tbXUsIFJLX01NVV9JTlRfTUFTSywg UktfTU1VX0lSUV9NQVNLKTsKKworCXJldCA9IHJrX2lvbW11X2VuYWJsZV9wYWdpbmcoaW9tbXUp OworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcmtfZG9t YWluLT5pb21tdXNfbG9jaywgZmxhZ3MpOworCWxpc3RfYWRkX3RhaWwoJmlvbW11LT5ub2RlLCAm cmtfZG9tYWluLT5pb21tdXMpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJrX2RvbWFpbi0+ aW9tbXVzX2xvY2ssIGZsYWdzKTsKKworCWRldl9pbmZvKGRldiwgIkF0dGFjaGVkIHRvIGlvbW11 IGRvbWFpblxuIik7CisKKwlya19pb21tdV9kaXNhYmxlX3N0YWxsKGlvbW11KTsKKworCXJldHVy biAwOworfQorCitzdGF0aWMgdm9pZCBya19pb21tdV9kZXRhY2hfZGV2aWNlKHN0cnVjdCBpb21t dV9kb21haW4gKmRvbWFpbiwKKwkJCQkgICBzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0 IHJrX2lvbW11ICppb21tdTsKKwlzdHJ1Y3QgcmtfaW9tbXVfZG9tYWluICpya19kb21haW4gPSBk b21haW4tPnByaXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIEFsbG93ICd2aXJ0dWFs IGRldmljZXMnIChlZyBkcm0pIHRvIGRldGFjaCBmcm9tIGRvbWFpbiAqLworCWlvbW11ID0gcmtf aW9tbXVfZnJvbV9kZXYoZGV2KTsKKwlpZiAoIWlvbW11KQorCQlyZXR1cm47CisKKwlzcGluX2xv Y2tfaXJxc2F2ZSgmcmtfZG9tYWluLT5pb21tdXNfbG9jaywgZmxhZ3MpOworCWxpc3RfZGVsX2lu aXQoJmlvbW11LT5ub2RlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZya19kb21haW4tPmlv bW11c19sb2NrLCBmbGFncyk7CisKKwkvKiBJZ25vcmUgZXJyb3Igd2hpbGUgZGlzYWJsaW5nLCBq dXN0IGtlZXAgZ29pbmcgKi8KKwlya19pb21tdV9lbmFibGVfc3RhbGwoaW9tbXUpOworCXJrX2lv bW11X2Rpc2FibGVfcGFnaW5nKGlvbW11KTsKKwlya19pb21tdV93cml0ZShpb21tdSwgUktfTU1V X0lOVF9NQVNLLCAwKTsKKwlya19pb21tdV93cml0ZShpb21tdSwgUktfTU1VX0RURV9BRERSLCAw KTsKKwlya19pb21tdV9kaXNhYmxlX3N0YWxsKGlvbW11KTsKKworCWRldm1fZnJlZV9pcnEoZGV2 LCBpb21tdS0+aXJxLCBpb21tdSk7CisKKwlpb21tdS0+ZG9tYWluID0gTlVMTDsKKworCWRldl9p bmZvKGRldiwgIkRldGFjaGVkIGZyb20gaW9tbXUgZG9tYWluXG4iKTsKK30KKworc3RhdGljIGlu dCBya19pb21tdV9kb21haW5faW5pdChzdHJ1Y3QgaW9tbXVfZG9tYWluICpkb21haW4pCit7CisJ c3RydWN0IHJrX2lvbW11X2RvbWFpbiAqcmtfZG9tYWluOworCisJcmtfZG9tYWluID0ga3phbGxv YyhzaXplb2YoKnJrX2RvbWFpbiksIEdGUF9LRVJORUwpOworCWlmICghcmtfZG9tYWluKQorCQly ZXR1cm4gLUVOT01FTTsKKworCS8qCisJICogcmszMnh4IGlvbW11cyB1c2UgYSAyIGxldmVsIHBh Z2V0YWJsZS4KKwkgKiBFYWNoIGxldmVsMSAoZHQpIGFuZCBsZXZlbDIgKHB0KSB0YWJsZSBoYXMg MTAyNCA0LWJ5dGUgZW50cmllcy4KKwkgKiBBbGxvY2F0ZSBvbmUgNCBLaUIgcGFnZSBmb3IgZWFj aCB0YWJsZS4KKwkgKi8KKwlya19kb21haW4tPmR0ID0gKHUzMiAqKWdldF96ZXJvZWRfcGFnZShH RlBfS0VSTkVMIHwgR0ZQX0RNQTMyKTsKKwlpZiAoIXJrX2RvbWFpbi0+ZHQpCisJCWdvdG8gZXJy X2R0OworCisJcmtfdGFibGVfZmx1c2gocmtfZG9tYWluLT5kdCwgTlVNX0RUX0VOVFJJRVMpOwor CisJc3Bpbl9sb2NrX2luaXQoJnJrX2RvbWFpbi0+aW9tbXVzX2xvY2spOworCXNwaW5fbG9ja19p bml0KCZya19kb21haW4tPmR0X2xvY2spOworCUlOSVRfTElTVF9IRUFEKCZya19kb21haW4tPmlv bW11cyk7CisKKwlkb21haW4tPnByaXYgPSBya19kb21haW47CisKKwlyZXR1cm4gMDsKK2Vycl9k dDoKKwlrZnJlZShya19kb21haW4pOworCXJldHVybiAtRU5PTUVNOworfQorCitzdGF0aWMgdm9p ZCBya19pb21tdV9kb21haW5fZGVzdHJveShzdHJ1Y3QgaW9tbXVfZG9tYWluICpkb21haW4pCit7 CisJc3RydWN0IHJrX2lvbW11X2RvbWFpbiAqcmtfZG9tYWluID0gZG9tYWluLT5wcml2OworCWlu dCBpOworCisJV0FSTl9PTighbGlzdF9lbXB0eSgmcmtfZG9tYWluLT5pb21tdXMpKTsKKworCWZv ciAoaSA9IDA7IGkgPCBOVU1fRFRfRU5UUklFUzsgaSsrKSB7CisJCXUzMiBkdGUgPSBya19kb21h aW4tPmR0W2ldOworCQlpZiAocmtfZHRlX2lzX3B0X3ZhbGlkKGR0ZSkpIHsKKwkJCXBoeXNfYWRk cl90IHB0X3BoeXMgPSBya19kdGVfcHRfYWRkcmVzcyhkdGUpOworCQkJdTMyICpwYWdlX3RhYmxl ID0gcGh5c190b192aXJ0KHB0X3BoeXMpOworCQkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXBh Z2VfdGFibGUpOworCQl9CisJfQorCisJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXJrX2RvbWFp bi0+ZHQpOworCWtmcmVlKGRvbWFpbi0+cHJpdik7CisJZG9tYWluLT5wcml2ID0gTlVMTDsKK30K Kworc3RhdGljIGJvb2wgcmtfaW9tbXVfaXNfZGV2X2lvbW11X21hc3RlcihzdHJ1Y3QgZGV2aWNl ICpkZXYpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IGRldi0+b2Zfbm9kZTsKKwlpbnQg cmV0OworCisJLyoKKwkgKiBBbiBpb21tdSBtYXN0ZXIgaGFzIGFuIGlvbW11cyBwcm9wZXJ0eSBj b250YWluaW5nIGEgbGlzdCBvZiBwaGFuZGxlcworCSAqIHRvIGlvbW11IG5vZGVzLCBlYWNoIHdp dGggYW4gI2lvbW11LWNlbGxzIHByb3BlcnR5IHdpdGggdmFsdWUgMC4KKwkgKi8KKwlyZXQgPSBv Zl9jb3VudF9waGFuZGxlX3dpdGhfYXJncyhucCwgImlvbW11cyIsICIjaW9tbXUtY2VsbHMiKTsK KwlyZXR1cm4gKHJldCA+IDApOworfQorCitzdGF0aWMgaW50IHJrX2lvbW11X2dyb3VwX3NldF9p b21tdWRhdGEoc3RydWN0IGlvbW11X2dyb3VwICpncm91cCwKKwkJCQkJc3RydWN0IGRldmljZSAq ZGV2KQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBkZXYtPm9mX25vZGU7CisJc3RydWN0 IHBsYXRmb3JtX2RldmljZSAqcGQ7CisJaW50IHJldDsKKwlzdHJ1Y3Qgb2ZfcGhhbmRsZV9hcmdz IGFyZ3M7CisKKwkvKgorCSAqIEFuIGlvbW11IG1hc3RlciBoYXMgYW4gaW9tbXVzIHByb3BlcnR5 IGNvbnRhaW5pbmcgYSBsaXN0IG9mIHBoYW5kbGVzCisJICogdG8gaW9tbXUgbm9kZXMsIGVhY2gg d2l0aCBhbiAjaW9tbXUtY2VsbHMgcHJvcGVydHkgd2l0aCB2YWx1ZSAwLgorCSAqLworCXJldCA9 IG9mX3BhcnNlX3BoYW5kbGVfd2l0aF9hcmdzKG5wLCAiaW9tbXVzIiwgIiNpb21tdS1jZWxscyIs IDAsCisJCQkJCSAmYXJncyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgIm9mX3BhcnNl X3BoYW5kbGVfd2l0aF9hcmdzKCVzKSA9PiAlZFxuIiwKKwkJCW5wLT5mdWxsX25hbWUsIHJldCk7 CisJCXJldHVybiByZXQ7CisJfQorCWlmIChhcmdzLmFyZ3NfY291bnQgIT0gMCkgeworCQlkZXZf ZXJyKGRldiwgImluY29ycmVjdCBudW1iZXIgb2YgaW9tbXUgcGFyYW1zIGZvdW5kIGZvciAlcyAo Zm91bmQgJWQsIGV4cGVjdGVkIDApXG4iLAorCQkJYXJncy5ucC0+ZnVsbF9uYW1lLCBhcmdzLmFy Z3NfY291bnQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlwZCA9IG9mX2ZpbmRfZGV2aWNl X2J5X25vZGUoYXJncy5ucCk7CisJb2Zfbm9kZV9wdXQoYXJncy5ucCk7CisJaWYgKCFwZCkgewor CQlkZXZfZXJyKGRldiwgImlvbW11ICVzIG5vdCBmb3VuZFxuIiwgYXJncy5ucC0+ZnVsbF9uYW1l KTsKKwkJcmV0dXJuIC1FUFJPQkVfREVGRVI7CisJfQorCisJLyogVE9ETyhkamt1cnR6KTogaGFu ZGxlIG11bHRpcGxlIHNsYXZlIGlvbW11cyBmb3IgYSBzaW5nbGUgbWFzdGVyICovCisJaW9tbXVf Z3JvdXBfc2V0X2lvbW11ZGF0YShncm91cCwgJnBkLT5kZXYsIE5VTEwpOworCisJcmV0dXJuIDA7 Cit9CisKK3N0YXRpYyBpbnQgcmtfaW9tbXVfYWRkX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYp Cit7CisJc3RydWN0IGlvbW11X2dyb3VwICpncm91cDsKKwlpbnQgcmV0OworCisJaWYgKCFya19p b21tdV9pc19kZXZfaW9tbXVfbWFzdGVyKGRldikpCisJCXJldHVybiAtRU5PREVWOworCisJZ3Jv dXAgPSBpb21tdV9ncm91cF9nZXQoZGV2KTsKKwlpZiAoIWdyb3VwKSB7CisJCWdyb3VwID0gaW9t bXVfZ3JvdXBfYWxsb2MoKTsKKwkJaWYgKElTX0VSUihncm91cCkpIHsKKwkJCWRldl9lcnIoZGV2 LCAiRmFpbGVkIHRvIGFsbG9jYXRlIElPTU1VIGdyb3VwXG4iKTsKKwkJCXJldHVybiBQVFJfRVJS KGdyb3VwKTsKKwkJfQorCX0KKworCXJldCA9IGlvbW11X2dyb3VwX2FkZF9kZXZpY2UoZ3JvdXAs IGRldik7CisJaWYgKHJldCkKKwkJZ290byBlcnJfcHV0X2dyb3VwOworCisJcmV0ID0gcmtfaW9t bXVfZ3JvdXBfc2V0X2lvbW11ZGF0YShncm91cCwgZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVy cl9yZW1vdmVfZGV2aWNlOworCisJaW9tbXVfZ3JvdXBfcHV0KGdyb3VwKTsKKworCXJldHVybiAw OworCitlcnJfcmVtb3ZlX2RldmljZToKKwlpb21tdV9ncm91cF9yZW1vdmVfZGV2aWNlKGRldik7 CitlcnJfcHV0X2dyb3VwOgorCWlvbW11X2dyb3VwX3B1dChncm91cCk7CisJcmV0dXJuIHJldDsK K30KKworc3RhdGljIHZvaWQgcmtfaW9tbXVfcmVtb3ZlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpk ZXYpCit7CisJaWYgKCFya19pb21tdV9pc19kZXZfaW9tbXVfbWFzdGVyKGRldikpCisJCXJldHVy bjsKKworCWlvbW11X2dyb3VwX3JlbW92ZV9kZXZpY2UoZGV2KTsKK30KKworc3RhdGljIGNvbnN0 IHN0cnVjdCBpb21tdV9vcHMgcmtfaW9tbXVfb3BzID0geworCS5kb21haW5faW5pdCA9IHJrX2lv bW11X2RvbWFpbl9pbml0LAorCS5kb21haW5fZGVzdHJveSA9IHJrX2lvbW11X2RvbWFpbl9kZXN0 cm95LAorCS5hdHRhY2hfZGV2ID0gcmtfaW9tbXVfYXR0YWNoX2RldmljZSwKKwkuZGV0YWNoX2Rl diA9IHJrX2lvbW11X2RldGFjaF9kZXZpY2UsCisJLm1hcCA9IHJrX2lvbW11X21hcCwKKwkudW5t YXAgPSBya19pb21tdV91bm1hcCwKKwkuYWRkX2RldmljZSA9IHJrX2lvbW11X2FkZF9kZXZpY2Us CisJLnJlbW92ZV9kZXZpY2UgPSBya19pb21tdV9yZW1vdmVfZGV2aWNlLAorCS5pb3ZhX3RvX3Bo eXMgPSBya19pb21tdV9pb3ZhX3RvX3BoeXMsCisJLnBnc2l6ZV9iaXRtYXAgPSBSS19JT01NVV9Q R1NJWkVfQklUTUFQLAorfTsKKworc3RhdGljIGludCBya19pb21tdV9wcm9iZShzdHJ1Y3QgcGxh dGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7 CisJc3RydWN0IHJrX2lvbW11ICppb21tdTsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKworCWlv bW11ID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCppb21tdSksIEdGUF9LRVJORUwpOworCWlm ICghaW9tbXUpCisJCXJldHVybiAtRU5PTUVNOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRl diwgaW9tbXUpOworCWlvbW11LT5kZXYgPSBkZXY7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVz b3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlvbW11LT5iYXNlID0gZGV2bV9pb3Jl bWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIHJlcyk7CisJaWYgKElTX0VSUihpb21tdS0+YmFzZSkp CisJCXJldHVybiBQVFJfRVJSKGlvbW11LT5iYXNlKTsKKworCWlvbW11LT5pcnEgPSBwbGF0Zm9y bV9nZXRfaXJxKHBkZXYsIDApOworCWlmIChpb21tdS0+aXJxIDwgMCkgeworCQlkZXZfZXJyKGRl diwgIkZhaWxlZCB0byBnZXQgSVJRLCAlZFxuIiwgaW9tbXUtPmlycSk7CisJCXJldHVybiAtRU5Y SU87CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmtfaW9tbXVfcmVtb3ZlKHN0 cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBD T05GSUdfT0YKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHJrX2lvbW11X2R0X2lk c1tdID0geworCXsgLmNvbXBhdGlibGUgPSAicm9ja2NoaXAsaW9tbXUiIH0sCisJeyAvKiBzZW50 aW5lbCAqLyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgcmtfaW9tbXVfZHRfaWRzKTsK KyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBya19pb21tdV9kcml2ZXIg PSB7CisJLnByb2JlID0gcmtfaW9tbXVfcHJvYmUsCisJLnJlbW92ZSA9IHJrX2lvbW11X3JlbW92 ZSwKKwkuZHJpdmVyID0geworCQkgICAubmFtZSA9ICJya19pb21tdSIsCisJCSAgIC5vd25lciA9 IFRISVNfTU9EVUxFLAorCQkgICAub2ZfbWF0Y2hfdGFibGUgPSBvZl9tYXRjaF9wdHIocmtfaW9t bXVfZHRfaWRzKSwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgcmtfaW9tbXVfaW5pdCh2 b2lkKQoreworCWludCByZXQ7CisKKwlyZXQgPSBidXNfc2V0X2lvbW11KCZwbGF0Zm9ybV9idXNf dHlwZSwgJnJrX2lvbW11X29wcyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVy biBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnJrX2lvbW11X2RyaXZlcik7Cit9CitzdGF0aWMg dm9pZCBfX2V4aXQgcmtfaW9tbXVfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJl Z2lzdGVyKCZya19pb21tdV9kcml2ZXIpOworfQorCitzdWJzeXNfaW5pdGNhbGwocmtfaW9tbXVf aW5pdCk7Cittb2R1bGVfZXhpdChya19pb21tdV9leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9O KCJJT01NVSBBUEkgZm9yIFJvY2tjaGlwIik7CitNT0RVTEVfQVVUSE9SKCJTaW1vbiBYdWUgPHh4 bUByb2NrLWNoaXBzLmNvbT4gYW5kIERhbmllbCBLdXJ0eiA8ZGprdXJ0ekBjaHJvbWl1bS5vcmc+ Iik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOnJvY2tjaGlwLWlvbW11Iik7CitNT0RVTEVfTElD RU5TRSgiR1BMIHYyIik7Ci0tIAoyLjEuMC5yYzIuMjA2LmdlZGIwM2U1CgpfX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwppb21tdSBtYWlsaW5nIGxpc3QKaW9t bXVAbGlzdHMubGludXgtZm91bmRhdGlvbi5vcmcKaHR0cHM6Ly9saXN0cy5saW51eGZvdW5kYXRp b24ub3JnL21haWxtYW4vbGlzdGluZm8vaW9tbXU=