From mboxrd@z Thu Jan 1 00:00:00 1970 From: Daniel Kurtz Subject: [PATCH v4 1/3] iommu/rockchip: rk3288 iommu driver Date: Tue, 14 Oct 2014 15:45:03 +0800 Message-ID: <1413272705-9111-2-git-send-email-djkurtz@chromium.org> References: <1413272705-9111-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: <1413272705-9111-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 Cc: "open list:OPEN FIRMWARE AND..." , Simon Xue , Grant Grundler , open list , Daniel Kurtz , "open list:ARM/Rockchip SoC..." , "open list:IOMMU DRIVERS" , Rob Herring , Grant Likely , =?UTF-8?q?St=C3=A9phane=20Marchesin?= , "moderated list:ARM/Rockchip SoC..." , Heiko Stuebner 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 bGwgZGV2aWNlcwpoYXZlIGRldGFjaGVkIGJlZm9yZSBkZXN0cm95aW5nIGEgZG9tYWluLgoKU2ln bmVkLW9mZi1ieTogRGFuaWVsIEt1cnR6IDxkamt1cnR6QGNocm9taXVtLm9yZz4KU2lnbmVkLW9m Zi1ieTogU2ltb24gWHVlIDx4eG1Acm9jay1jaGlwcy5jb20+ClJldmlld2VkLWJ5OiBHcmFudCBH cnVuZGxlciA8Z3J1bmRsZXJAY2hyb21pdW0ub3JnPgpSZXZpZXdlZC1ieTogU3TDqXBoYW5lIE1h cmNoZXNpbiA8bWFyY2hldUBjaHJvbWl1bS5vcmc+Ci0tLQogZHJpdmVycy9pb21tdS9LY29uZmln ICAgICAgICAgIHwgIDEyICsKIGRyaXZlcnMvaW9tbXUvTWFrZWZpbGUgICAgICAgICB8ICAgMSAr CiBkcml2ZXJzL2lvbW11L3JvY2tjaGlwLWlvbW11LmMgfCA5MjQgKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysKIDMgZmlsZXMgY2hhbmdlZCwgOTM3IGluc2VydGlvbnMo KykKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2lvbW11L3JvY2tjaGlwLWlvbW11LmMKCmRp ZmYgLS1naXQgYS9kcml2ZXJzL2lvbW11L0tjb25maWcgYi9kcml2ZXJzL2lvbW11L0tjb25maWcK aW5kZXggZGQ1MTEyMi4uZDBhMTI2MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pb21tdS9LY29uZmln CisrKyBiL2RyaXZlcnMvaW9tbXUvS2NvbmZpZwpAQCAtMTUyLDYgKzE1MiwxOCBAQCBjb25maWcg T01BUF9JT01NVV9ERUJVRwogCiAgICAgICAgICBTYXkgTiB1bmxlc3MgeW91IGtub3cgeW91IG5l ZWQgdGhpcy4KIAorY29uZmlnIFJPQ0tDSElQX0lPTU1VCisJYm9vbCAiUm9ja2NoaXAgSU9NTVUg U3VwcG9ydCIKKwlkZXBlbmRzIG9uIEFSQ0hfUk9DS0NISVAKKwlzZWxlY3QgSU9NTVVfQVBJCisJ c2VsZWN0IEFSTV9ETUFfVVNFX0lPTU1VCisJaGVscAorCSAgU3VwcG9ydCBmb3IgSU9NTVVzIGZv dW5kIG9uIFJvY2tjaGlwIHJrMzJ4eCBTT0NzLgorCSAgVGhlc2UgSU9NTVVzIGFsbG93IHZpcnR1 YWxpemF0aW9uIG9mIHRoZSBhZGRyZXNzIHNwYWNlIHVzZWQgYnkgbW9zdAorCSAgY29yZXMgd2l0 aGluIHRoZSBtdWx0aW1lZGlhIHN1YnN5c3RlbS4KKwkgIFNheSBZIGhlcmUgaWYgeW91IGFyZSB1 c2luZyBhIFJvY2tjaGlwIFNvQyB0aGF0IGluY2x1ZGVzIGFuIElPTU1VCisJICBkZXZpY2UuCisK IGNvbmZpZyBURUdSQV9JT01NVV9HQVJUCiAJYm9vbCAiVGVncmEgR0FSVCBJT01NVSBTdXBwb3J0 IgogCWRlcGVuZHMgb24gQVJDSF9URUdSQV8yeF9TT0MKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW9t bXUvTWFrZWZpbGUgYi9kcml2ZXJzL2lvbW11L01ha2VmaWxlCmluZGV4IDE2ZWRlZjcuLjNlNDdl ZjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW9tbXUvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9pb21t dS9NYWtlZmlsZQpAQCAtMTMsNiArMTMsNyBAQCBvYmotJChDT05GSUdfSVJRX1JFTUFQKSArPSBp bnRlbF9pcnFfcmVtYXBwaW5nLm8gaXJxX3JlbWFwcGluZy5vCiBvYmotJChDT05GSUdfT01BUF9J T01NVSkgKz0gb21hcC1pb21tdS5vCiBvYmotJChDT05GSUdfT01BUF9JT01NVSkgKz0gb21hcC1p b21tdTIubwogb2JqLSQoQ09ORklHX09NQVBfSU9NTVVfREVCVUcpICs9IG9tYXAtaW9tbXUtZGVi dWcubworb2JqLSQoQ09ORklHX1JPQ0tDSElQX0lPTU1VKSArPSByb2NrY2hpcC1pb21tdS5vCiBv YmotJChDT05GSUdfVEVHUkFfSU9NTVVfR0FSVCkgKz0gdGVncmEtZ2FydC5vCiBvYmotJChDT05G SUdfVEVHUkFfSU9NTVVfU01NVSkgKz0gdGVncmEtc21tdS5vCiBvYmotJChDT05GSUdfRVhZTk9T X0lPTU1VKSArPSBleHlub3MtaW9tbXUubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pb21tdS9yb2Nr Y2hpcC1pb21tdS5jIGIvZHJpdmVycy9pb21tdS9yb2NrY2hpcC1pb21tdS5jCm5ldyBmaWxlIG1v ZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4ZTUwZmMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2 ZXJzL2lvbW11L3JvY2tjaGlwLWlvbW11LmMKQEAgLTAsMCArMSw5MjQgQEAKKy8qCisgKiBUaGlz IHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29y IG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMg TGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBG b3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgorI2luY2x1ZGUg PGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxs aW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4 L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgv aW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pb21tdS5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMu aD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNs dWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxp bnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRl IDxsaW51eC9zcGlubG9jay5oPgorCisvKiogTU1VIHJlZ2lzdGVyIG9mZnNldHMgKi8KKyNkZWZp bmUgUktfTU1VX0RURV9BRERSCQkweDAwCS8qIERpcmVjdG9yeSB0YWJsZSBhZGRyZXNzICovCisj ZGVmaW5lIFJLX01NVV9TVEFUVVMJCTB4MDQKKyNkZWZpbmUgUktfTU1VX0NPTU1BTkQJCTB4MDgK KyNkZWZpbmUgUktfTU1VX1BBR0VfRkFVTFRfQUREUgkweDBDCS8qIElPVkEgb2YgbGFzdCBwYWdl IGZhdWx0ICovCisjZGVmaW5lIFJLX01NVV9aQVBfT05FX0xJTkUJMHgxMAkvKiBTaG9vdGRvd24g b25lIElPVExCIGVudHJ5ICovCisjZGVmaW5lIFJLX01NVV9JTlRfUkFXU1RBVAkweDE0CS8qIElS USBzdGF0dXMgaWdub3JpbmcgbWFzayAqLworI2RlZmluZSBSS19NTVVfSU5UX0NMRUFSCTB4MTgJ LyogQWNrbm93bGVkZ2UgYW5kIHJlLWFybSBpcnEgKi8KKyNkZWZpbmUgUktfTU1VX0lOVF9NQVNL CQkweDFDCS8qIElSUSBlbmFibGUgKi8KKyNkZWZpbmUgUktfTU1VX0lOVF9TVEFUVVMJMHgyMAkv KiBJUlEgc3RhdHVzIGFmdGVyIG1hc2tpbmcgKi8KKyNkZWZpbmUgUktfTU1VX0FVVE9fR0FUSU5H CTB4MjQKKworI2RlZmluZSBEVEVfQUREUl9EVU1NWQkJMHhDQUZFQkFCRQorI2RlZmluZSBGT1JD RV9SRVNFVF9USU1FT1VUCTEwMAkvKiBtcyAqLworCisvKiBSS19NTVVfU1RBVFVTIGZpZWxkcyAq LworI2RlZmluZSBSS19NTVVfU1RBVFVTX1BBR0lOR19FTkFCTEVEICAgICAgIEJJVCgwKQorI2Rl ZmluZSBSS19NTVVfU1RBVFVTX1BBR0VfRkFVTFRfQUNUSVZFICAgIEJJVCgxKQorI2RlZmluZSBS S19NTVVfU1RBVFVTX1NUQUxMX0FDVElWRSAgICAgICAgIEJJVCgyKQorI2RlZmluZSBSS19NTVVf U1RBVFVTX0lETEUgICAgICAgICAgICAgICAgIEJJVCgzKQorI2RlZmluZSBSS19NTVVfU1RBVFVT X1JFUExBWV9CVUZGRVJfRU1QVFkgIEJJVCg0KQorI2RlZmluZSBSS19NTVVfU1RBVFVTX1BBR0Vf RkFVTFRfSVNfV1JJVEUgIEJJVCg1KQorI2RlZmluZSBSS19NTVVfU1RBVFVTX1NUQUxMX05PVF9B Q1RJVkUgICAgIEJJVCgzMSkKKworLyogUktfTU1VX0NPTU1BTkQgY29tbWFuZCB2YWx1ZXMgKi8K KyNkZWZpbmUgUktfTU1VX0NNRF9FTkFCTEVfUEFHSU5HICAgIDAgIC8qIEVuYWJsZSBtZW1vcnkg dHJhbnNsYXRpb24gKi8KKyNkZWZpbmUgUktfTU1VX0NNRF9ESVNBQkxFX1BBR0lORyAgIDEgIC8q IERpc2FibGUgbWVtb3J5IHRyYW5zbGF0aW9uICovCisjZGVmaW5lIFJLX01NVV9DTURfRU5BQkxF X1NUQUxMICAgICAyICAvKiBTdGFsbCBwYWdpbmcgdG8gYWxsb3cgb3RoZXIgY21kcyAqLworI2Rl ZmluZSBSS19NTVVfQ01EX0RJU0FCTEVfU1RBTEwgICAgMyAgLyogU3RvcCBzdGFsbCByZS1lbmFi bGVzIHBhZ2luZyAqLworI2RlZmluZSBSS19NTVVfQ01EX1pBUF9DQUNIRSAgICAgICAgNCAgLyog U2hvb3QgZG93biBlbnRpcmUgSU9UTEIgKi8KKyNkZWZpbmUgUktfTU1VX0NNRF9QQUdFX0ZBVUxU X0RPTkUgIDUgIC8qIENsZWFyIHBhZ2UgZmF1bHQgKi8KKyNkZWZpbmUgUktfTU1VX0NNRF9GT1JD RV9SRVNFVCAgICAgIDYgIC8qIFJlc2V0IGFsbCByZWdpc3RlcnMgKi8KKworLyogUktfTU1VX0lO VF8qIHJlZ2lzdGVyIGZpZWxkcyAqLworI2RlZmluZSBSS19NTVVfSVJRX1BBR0VfRkFVTFQgICAg MHgwMSAgLyogcGFnZSBmYXVsdCAqLworI2RlZmluZSBSS19NTVVfSVJRX0JVU19FUlJPUiAgICAg MHgwMiAgLyogYnVzIHJlYWQgZXJyb3IgKi8KKyNkZWZpbmUgUktfTU1VX0lSUV9NQVNLICAgICAg ICAgIChSS19NTVVfSVJRX1BBR0VfRkFVTFQgfCBSS19NTVVfSVJRX0JVU19FUlJPUikKKworI2Rl ZmluZSBOVU1fRFRfRU5UUklFUyAxMDI0CisjZGVmaW5lIE5VTV9QVF9FTlRSSUVTIDEwMjQKKwor I2RlZmluZSBTUEFHRV9PUkRFUiAxMgorI2RlZmluZSBTUEFHRV9TSVpFICgxIDw8IFNQQUdFX09S REVSKQorCisgLyoKKyAgKiBTdXBwb3J0IG1hcHBpbmcgYW55IHNpemUgdGhhdCBmaXRzIGluIG9u ZSBwYWdlIHRhYmxlOgorICAqICAgNCBLaUIgdG8gNCBNaUIKKyAgKi8KKyNkZWZpbmUgUktfSU9N TVVfUEdTSVpFX0JJVE1BUCAweDAwN2ZmMDAwCisKKyNkZWZpbmUgSU9NTVVfUkVHX1BPTExfQ09V TlRfRkFTVCAxMDAwCisKK3N0cnVjdCBya19pb21tdV9kb21haW4geworCXN0cnVjdCBsaXN0X2hl YWQgaW9tbXVzOworCXUzMiAqZHQ7IC8qIHBhZ2UgZGlyZWN0b3J5IHRhYmxlICovCisJc3Bpbmxv Y2tfdCBpb21tdXNfbG9jazsgLyogbG9jayBmb3IgaW9tbXVzIGxpc3QgKi8KKwlzcGlubG9ja190 IGR0X2xvY2s7IC8qIGxvY2sgZm9yIG1vZGlmeWluZyBwYWdlIGRpcmVjdG9yeSB0YWJsZSAqLwor fTsKKworc3RydWN0IHJrX2lvbW11IHsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJdm9pZCBfX2lv bWVtICpiYXNlOworCWludCBpcnE7CisJc3RydWN0IGxpc3RfaGVhZCBub2RlOyAvKiBlbnRyeSBp biBya19pb21tdV9kb21haW4uaW9tbXVzICovCisJc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tYWlu OyAvKiBkb21haW4gdG8gd2hpY2ggaW9tbXUgaXMgYXR0YWNoZWQgKi8KK307CisKK3N0YXRpYyBp bmxpbmUgdm9pZCBya190YWJsZV9mbHVzaCh1MzIgKnZhLCB1bnNpZ25lZCBpbnQgY291bnQpCit7 CisJcGh5c19hZGRyX3QgcGFfc3RhcnQgPSB2aXJ0X3RvX3BoeXModmEpOworCXBoeXNfYWRkcl90 IHBhX2VuZCA9IHZpcnRfdG9fcGh5cyh2YSArIGNvdW50KTsKKwlzaXplX3Qgc2l6ZSA9IHBhX2Vu ZCAtIHBhX3N0YXJ0OworCisJX19jcHVjX2ZsdXNoX2RjYWNoZV9hcmVhKHZhLCBzaXplKTsKKwlv dXRlcl9mbHVzaF9yYW5nZShwYV9zdGFydCwgcGFfZW5kKTsKK30KKworLyoqCisgKiBJbnNwaXJl ZCBieSBfd2FpdF9mb3IgaW4gaW50ZWxfZHJ2LmgKKyAqIFRoaXMgaXMgTk9UIHNhZmUgZm9yIHVz ZSBpbiBpbnRlcnJ1cHQgY29udGV4dC4KKyAqCisgKiBOb3RlIHRoYXQgaXQncyBpbXBvcnRhbnQg dGhhdCB3ZSBjaGVjayB0aGUgY29uZGl0aW9uIGFnYWluIGFmdGVyIGhhdmluZworICogdGltZWQg b3V0LCBzaW5jZSB0aGUgdGltZW91dCBjb3VsZCBiZSBkdWUgdG8gcHJlZW1wdGlvbiBvciBzaW1p bGFyIGFuZAorICogd2UndmUgbmV2ZXIgaGFkIGEgY2hhbmNlIHRvIGNoZWNrIHRoZSBjb25kaXRp b24gYmVmb3JlIHRoZSB0aW1lb3V0LgorICovCisjZGVmaW5lIHJrX3dhaXRfZm9yKENPTkQsIE1T KSAoeyBcCisJdW5zaWduZWQgbG9uZyB0aW1lb3V0X18gPSBqaWZmaWVzICsgbXNlY3NfdG9famlm ZmllcyhNUykgKyAxOwlcCisJaW50IHJldF9fID0gMDsJCQkJCQkJXAorCXdoaWxlICghKENPTkQp KSB7CQkJCQkJXAorCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0X18pKSB7CQkJXAor CQkJcmV0X18gPSAoQ09ORCkgPyAwIDogLUVUSU1FRE9VVDsJCVwKKwkJCWJyZWFrOwkJCQkJCVwK KwkJfQkJCQkJCQlcCisJCXVzbGVlcF9yYW5nZSg1MCwgMTAwKTsJCQkJCVwKKwl9CQkJCQkJCQlc CisJcmV0X187CQkJCQkJCQlcCit9KQorCisvKgorICogVGhlIFJvY2tjaGlwIHJrMzI4OCBpb21t dSB1c2VzIGEgMi1sZXZlbCBwYWdlIHRhYmxlLgorICogVGhlIGZpcnN0IGxldmVsIGlzIHRoZSAi RGlyZWN0b3J5IFRhYmxlIiAoRFQpLgorICogVGhlIERUIGNvbnNpc3RzIG9mIDEwMjQgNC1ieXRl IERpcmVjdG9yeSBUYWJsZSBFbnRyaWVzIChEVEVzKSwgZWFjaCBwb2ludGluZworICogdG8gYSAi UGFnZSBUYWJsZSIuCisgKiBUaGUgc2Vjb25kIGxldmVsIGlzIHRoZSAxMDI0IFBhZ2UgVGFibGVz IChQVCkuCisgKiBFYWNoIFBUIGNvbnNpc3RzIG9mIDEwMjQgNC1ieXRlIFBhZ2UgVGFibGUgRW50 cmllcyAoUFRFcyksIGVhY2ggcG9pbnRpbmcgdG8KKyAqIGEgNCBLQiBwYWdlIG9mIHBoeXNpY2Fs IG1lbW9yeS4KKyAqCisgKiBUaGUgRFQgYW5kIGVhY2ggUFQgZml0cyBpbiBhIHNpbmdsZSA0IEtC IHBhZ2UgKDQtYnl0ZXMgKiAxMDI0IGVudHJpZXMpLgorICogRWFjaCBpb21tdSBkZXZpY2UgaGFz IGEgTU1VX0RURV9BRERSIHJlZ2lzdGVyIHRoYXQgY29udGFpbnMgdGhlIHBoeXNpY2FsCisgKiBh ZGRyZXNzIG9mIHRoZSBzdGFydCBvZiB0aGUgRFQgcGFnZS4KKyAqCisgKiBUaGUgc3RydWN0dXJl IG9mIHRoZSBwYWdlIHRhYmxlIGlzIGFzIGZvbGxvd3M6CisgKgorICogICAgICAgICAgICAgICAg ICAgRFQKKyAqIE1NVV9EVEVfQUREUiAtPiArLS0tLS0rCisgKiAgICAgICAgICAgICAgICAgfCAg ICAgfAorICogICAgICAgICAgICAgICAgICstLS0tLSsgICAgIFBUCisgKiAgICAgICAgICAgICAg ICAgfCBEVEUgfCAtPiArLS0tLS0rCisgKiAgICAgICAgICAgICAgICAgKy0tLS0tKyAgICB8ICAg ICB8ICAgICBNZW1vcnkKKyAqICAgICAgICAgICAgICAgICB8ICAgICB8ICAgICstLS0tLSsgICAg IFBhZ2UKKyAqICAgICAgICAgICAgICAgICB8ICAgICB8ICAgIHwgUFRFIHwgLT4gKy0tLS0tKwor ICogICAgICAgICAgICAgICAgICstLS0tLSsgICAgKy0tLS0tKyAgICB8ICAgICB8CisgKiAgICAg ICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8ICAgIHwgICAgIHwKKyAqICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHwgICAgIHwgICAgfCAgICAgfAorICogICAgICAgICAgICAgICAgICAg ICAgICAgICAgKy0tLS0tKyAgICB8ICAgICB8CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwgICAgIHwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgfCAgICAgfAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAr LS0tLS0rCisgKi8KKworLyoKKyAqIEVhY2ggRFRFIGhhcyBhIFBUIGFkZHJlc3MgYW5kIGEgdmFs aWQgYml0OgorICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstKworICogfCBQ VCBhZGRyZXNzICAgICAgICAgIHwgUmVzZXJ2ZWQgIHxWfAorICogKy0tLS0tLS0tLS0tLS0tLS0t LS0tLSstLS0tLS0tLS0tLSstKworICogIDMxOjEyIC0gUFQgYWRkcmVzcyAoUFRzIGFsd2F5cyBz dGFydHMgb24gYSA0IEtCIGJvdW5kYXJ5KQorICogIDExOiAxIC0gUmVzZXJ2ZWQKKyAqICAgICAg MCAtIDEgaWYgUFQgQCBQVCBhZGRyZXNzIGlzIHZhbGlkCisgKi8KKyNkZWZpbmUgUktfRFRFX1BU X0FERFJFU1NfTUFTSyAgICAweGZmZmZmMDAwCisjZGVmaW5lIFJLX0RURV9QVF9WQUxJRCAgICAg ICAgICAgQklUKDApCisKK3N0YXRpYyBpbmxpbmUgcGh5c19hZGRyX3QgcmtfZHRlX3B0X2FkZHJl c3ModTMyIGR0ZSkKK3sKKwlyZXR1cm4gKHBoeXNfYWRkcl90KWR0ZSAmIFJLX0RURV9QVF9BRERS RVNTX01BU0s7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBya19kdGVfaXNfcHRfdmFsaWQodTMy IGR0ZSkKK3sKKwlyZXR1cm4gZHRlICYgUktfRFRFX1BUX1ZBTElEOworfQorCitzdGF0aWMgdTMy IHJrX21rX2R0ZSh1MzIgKnB0KQoreworCXBoeXNfYWRkcl90IHB0X3BoeXMgPSB2aXJ0X3RvX3Bo eXMocHQpOworCXJldHVybiAocHRfcGh5cyAmIFJLX0RURV9QVF9BRERSRVNTX01BU0spIHwgUktf RFRFX1BUX1ZBTElEOworfQorCisvKgorICogRWFjaCBQVEUgaGFzIGEgUGFnZSBhZGRyZXNzLCBz b21lIGZsYWdzIGFuZCBhIHZhbGlkIGJpdDoKKyAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0t Ky0tLS0tLS0rLSsKKyAqIHwgUGFnZSBhZGRyZXNzICAgICAgICB8UnN2fCBGbGFncyB8VnwKKyAq ICstLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tKy0tLS0tLS0rLSsKKyAqICAzMToxMiAtIFBhZ2Ug YWRkcmVzcyAoUGFnZXMgYWx3YXlzIHN0YXJ0IG9uIGEgNCBLQiBib3VuZGFyeSkKKyAqICAxMTog OSAtIFJlc2VydmVkCisgKiAgIDg6IDEgLSBGbGFncworICogICAgICA4IC0gUmVhZCBhbGxvY2F0 ZSAtIGFsbG9jYXRlIGNhY2hlIHNwYWNlIG9uIHJlYWQgbWlzc2VzCisgKiAgICAgIDcgLSBSZWFk IGNhY2hlIC0gZW5hYmxlIGNhY2hlICYgcHJlZmV0Y2ggb2YgZGF0YQorICogICAgICA2IC0gV3Jp dGUgYnVmZmVyIC0gZW5hYmxlIGRlbGF5aW5nIHdyaXRlcyBvbiB0aGVpciB3YXkgdG8gbWVtb3J5 CisgKiAgICAgIDUgLSBXcml0ZSBhbGxvY2F0ZSAtIGFsbG9jYXRlIGNhY2hlIHNwYWNlIG9uIHdy aXRlIG1pc3NlcworICogICAgICA0IC0gV3JpdGUgY2FjaGUgLSBkaWZmZXJlbnQgd3JpdGVzIGNh biBiZSBtZXJnZWQgdG9nZXRoZXIKKyAqICAgICAgMyAtIE92ZXJyaWRlIGNhY2hlIGF0dHJpYnV0 ZXMKKyAqICAgICAgICAgIGlmIDEsIGJpdHMgNC04IGNvbnRyb2wgY2FjaGUgYXR0cmlidXRlcwor ICogICAgICAgICAgaWYgMCwgdGhlIHN5c3RlbSBidXMgZGVmYXVsdHMgYXJlIHVzZWQKKyAqICAg ICAgMiAtIFdyaXRhYmxlCisgKiAgICAgIDEgLSBSZWFkYWJsZQorICogICAgICAwIC0gMSBpZiBQ YWdlIEAgUGFnZSBhZGRyZXNzIGlzIHZhbGlkCisgKi8KKyNkZWZpbmUgUktfUFRFX1BBR0VfQURE UkVTU19NQVNLICAweGZmZmZmMDAwCisjZGVmaW5lIFJLX1BURV9QQUdFX0ZMQUdTX01BU0sgICAg MHgwMDAwMDFmZQorI2RlZmluZSBSS19QVEVfUEFHRV9XUklUQUJMRSAgICAgIEJJVCgyKQorI2Rl ZmluZSBSS19QVEVfUEFHRV9SRUFEQUJMRSAgICAgIEJJVCgxKQorI2RlZmluZSBSS19QVEVfUEFH RV9WQUxJRCAgICAgICAgIEJJVCgwKQorCitzdGF0aWMgaW5saW5lIHBoeXNfYWRkcl90IHJrX3B0 ZV9wYWdlX2FkZHJlc3ModTMyIHB0ZSkKK3sKKwlyZXR1cm4gKHBoeXNfYWRkcl90KXB0ZSAmIFJL X1BURV9QQUdFX0FERFJFU1NfTUFTSzsKK30KKworc3RhdGljIGlubGluZSBib29sIHJrX3B0ZV9p c19wYWdlX3ZhbGlkKHUzMiBwdGUpCit7CisJcmV0dXJuIHB0ZSAmIFJLX1BURV9QQUdFX1ZBTElE OworfQorCisvKiBUT0RPOiBzZXQgY2FjaGUgZmxhZ3MgcGVyIHByb3QgSU9NTVVfQ0FDSEUgKi8K K3N0YXRpYyB1MzIgcmtfbWtfcHRlKHBoeXNfYWRkcl90IHBhZ2UsIGludCBwcm90KQoreworCXUz MiBmbGFncyA9IDA7CisJZmxhZ3MgfD0gKHByb3QgJiBJT01NVV9SRUFEKSA/IFJLX1BURV9QQUdF X1JFQURBQkxFIDogMDsKKwlmbGFncyB8PSAocHJvdCAmIElPTU1VX1dSSVRFKSA/IFJLX1BURV9Q QUdFX1dSSVRBQkxFIDogMDsKKwlwYWdlICY9IFJLX1BURV9QQUdFX0FERFJFU1NfTUFTSzsKKwly ZXR1cm4gcGFnZSB8IGZsYWdzIHwgUktfUFRFX1BBR0VfVkFMSUQ7Cit9CisKK3N0YXRpYyB1MzIg cmtfbWtfcHRlX2ludmFsaWQodTMyIHB0ZSkKK3sKKwlyZXR1cm4gcHRlICYgflJLX1BURV9QQUdF X1ZBTElEOworfQorCisvKgorICogcmszMjg4IGlvdmEgKElPTU1VIFZpcnR1YWwgQWRkcmVzcykg Zm9ybWF0CisgKiAgMzEgICAgICAgMjIuMjEgICAgICAgMTIuMTEgICAgICAgICAgMAorICogKy0t LS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rCisgKiB8IERURSBpbmRleCB8IFBU RSBpbmRleCB8IFBhZ2Ugb2Zmc2V0IHwKKyAqICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0t LS0tLS0tLS0tKworICogIDMxOjIyIC0gRFRFIGluZGV4ICAgLSBpbmRleCBvZiBEVEUgaW4gRFQK KyAqICAyMToxMiAtIFBURSBpbmRleCAgIC0gaW5kZXggb2YgUFRFIGluIFBUIEAgRFRFLnB0X2Fk ZHJlc3MKKyAqICAxMTogMCAtIFBhZ2Ugb2Zmc2V0IC0gb2Zmc2V0IGludG8gcGFnZSBAIFBURS5w YWdlX2FkZHJlc3MKKyAqLworI2RlZmluZSBSS19JT1ZBX0RURV9NQVNLICAgIDB4ZmZjMDAwMDAK KyNkZWZpbmUgUktfSU9WQV9EVEVfU0hJRlQgICAyMgorI2RlZmluZSBSS19JT1ZBX1BURV9NQVNL ICAgIDB4MDAzZmYwMDAKKyNkZWZpbmUgUktfSU9WQV9QVEVfU0hJRlQgICAxMgorI2RlZmluZSBS S19JT1ZBX1BBR0VfTUFTSyAgIDB4MDAwMDBmZmYKKyNkZWZpbmUgUktfSU9WQV9QQUdFX1NISUZU ICAwCisKK3N0YXRpYyB1MzIgcmtfaW92YV9kdGVfaW5kZXgoZG1hX2FkZHJfdCBpb3ZhKQorewor CXJldHVybiAodTMyKShpb3ZhICYgUktfSU9WQV9EVEVfTUFTSykgPj4gUktfSU9WQV9EVEVfU0hJ RlQ7Cit9CisKK3N0YXRpYyB1MzIgcmtfaW92YV9wdGVfaW5kZXgoZG1hX2FkZHJfdCBpb3ZhKQor eworCXJldHVybiAodTMyKShpb3ZhICYgUktfSU9WQV9QVEVfTUFTSykgPj4gUktfSU9WQV9QVEVf U0hJRlQ7Cit9CisKK3N0YXRpYyB1MzIgcmtfaW92YV9wYWdlX29mZnNldChkbWFfYWRkcl90IGlv dmEpCit7CisJcmV0dXJuICh1MzIpKGlvdmEgJiBSS19JT1ZBX1BBR0VfTUFTSykgPj4gUktfSU9W QV9QQUdFX1NISUZUOworfQorCitzdGF0aWMgdTMyIHJrX2lvbW11X3JlYWQoc3RydWN0IHJrX2lv bW11ICppb21tdSwgdTMyIG9mZnNldCkKK3sKKwlyZXR1cm4gcmVhZGwoaW9tbXUtPmJhc2UgKyBv ZmZzZXQpOworfQorCitzdGF0aWMgdm9pZCBya19pb21tdV93cml0ZShzdHJ1Y3QgcmtfaW9tbXUg KmlvbW11LCB1MzIgb2Zmc2V0LCB1MzIgdmFsdWUpCit7CisJd3JpdGVsKHZhbHVlLCBpb21tdS0+ YmFzZSArIG9mZnNldCk7Cit9CisKK3N0YXRpYyB2b2lkIHJrX2lvbW11X2NvbW1hbmQoc3RydWN0 IHJrX2lvbW11ICppb21tdSwgdTMyIGNvbW1hbmQpCit7CisJd3JpdGVsKGNvbW1hbmQsIGlvbW11 LT5iYXNlICsgUktfTU1VX0NPTU1BTkQpOworfQorCitzdGF0aWMgdm9pZCBya19pb21tdV96YXBf bGluZXMoc3RydWN0IHJrX2lvbW11ICppb21tdSwgZG1hX2FkZHJfdCBpb3ZhLAorCQkJICAgICAg IHNpemVfdCBzaXplKQoreworCWRtYV9hZGRyX3QgaW92YV9lbmQgPSBpb3ZhICsgc2l6ZTsKKwkv KgorCSAqIFRPRE8oZGprdXJ0eik6IEZpZ3VyZSBvdXQgd2hlbiBpdCBpcyBtb3JlIGVmZmljaWVu dCB0byBzaG9vdGRvd24gdGhlCisJICogZW50aXJlIGlvdGxiIHJhdGhlciB0aGFuIGl0ZXJhdGUg b3ZlciBpbmRpdmlkdWFsIGlvdmFzLgorCSAqLworCWZvciAoOyBpb3ZhIDwgaW92YV9lbmQ7IGlv dmEgKz0gU1BBR0VfU0laRSkKKwkJcmtfaW9tbXVfd3JpdGUoaW9tbXUsIFJLX01NVV9aQVBfT05F X0xJTkUsIGlvdmEpOworfQorCitzdGF0aWMgYm9vbCBya19pb21tdV9pc19zdGFsbF9hY3RpdmUo c3RydWN0IHJrX2lvbW11ICppb21tdSkKK3sKKwlyZXR1cm4gcmtfaW9tbXVfcmVhZChpb21tdSwg UktfTU1VX1NUQVRVUykgJiBSS19NTVVfU1RBVFVTX1NUQUxMX0FDVElWRTsKK30KKworc3RhdGlj IGJvb2wgcmtfaW9tbXVfaXNfcGFnaW5nX2VuYWJsZWQoc3RydWN0IHJrX2lvbW11ICppb21tdSkK K3sKKwlyZXR1cm4gcmtfaW9tbXVfcmVhZChpb21tdSwgUktfTU1VX1NUQVRVUykgJgorCQkJICAg ICBSS19NTVVfU1RBVFVTX1BBR0lOR19FTkFCTEVEOworfQorCitzdGF0aWMgaW50IHJrX2lvbW11 X2VuYWJsZV9zdGFsbChzdHJ1Y3QgcmtfaW9tbXUgKmlvbW11KQoreworCWludCByZXQ7CisKKwlp ZiAocmtfaW9tbXVfaXNfc3RhbGxfYWN0aXZlKGlvbW11KSkKKwkJcmV0dXJuIDA7CisKKwkvKiBT dGFsbCBjYW4gb25seSBiZSBlbmFibGVkIGlmIHBhZ2luZyBpcyBlbmFibGVkICovCisJaWYgKCFy a19pb21tdV9pc19wYWdpbmdfZW5hYmxlZChpb21tdSkpCisJCXJldHVybiAwOworCisJcmtfaW9t bXVfY29tbWFuZChpb21tdSwgUktfTU1VX0NNRF9FTkFCTEVfU1RBTEwpOworCisJcmV0ID0gcmtf d2FpdF9mb3IocmtfaW9tbXVfaXNfc3RhbGxfYWN0aXZlKGlvbW11KSwgMSk7CisJaWYgKHJldCkK KwkJZGV2X2Vycihpb21tdS0+ZGV2LCAiRW5hYmxlIHN0YWxsIHJlcXVlc3QgdGltZWQgb3V0LCBz dGF0dXM6ICUjMDh4XG4iLAorCQkJcmtfaW9tbXVfcmVhZChpb21tdSwgUktfTU1VX1NUQVRVUykp OworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBya19pb21tdV9kaXNhYmxlX3N0YWxs KHN0cnVjdCBya19pb21tdSAqaW9tbXUpCit7CisJaW50IHJldDsKKworCWlmICghcmtfaW9tbXVf aXNfc3RhbGxfYWN0aXZlKGlvbW11KSkKKwkJcmV0dXJuIDA7CisKKwlya19pb21tdV9jb21tYW5k KGlvbW11LCBSS19NTVVfQ01EX0RJU0FCTEVfU1RBTEwpOworCisJcmV0ID0gcmtfd2FpdF9mb3Io IXJrX2lvbW11X2lzX3N0YWxsX2FjdGl2ZShpb21tdSksIDEpOworCWlmIChyZXQpCisJCWRldl9l cnIoaW9tbXUtPmRldiwgIkRpc2FibGUgc3RhbGwgcmVxdWVzdCB0aW1lZCBvdXQsIHN0YXR1czog JSMwOHhcbiIsCisJCQlya19pb21tdV9yZWFkKGlvbW11LCBSS19NTVVfU1RBVFVTKSk7CisKKwly ZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHJrX2lvbW11X2VuYWJsZV9wYWdpbmcoc3RydWN0 IHJrX2lvbW11ICppb21tdSkKK3sKKwlpbnQgcmV0OworCisJaWYgKHJrX2lvbW11X2lzX3BhZ2lu Z19lbmFibGVkKGlvbW11KSkKKwkJcmV0dXJuIDA7CisKKwlya19pb21tdV9jb21tYW5kKGlvbW11 LCBSS19NTVVfQ01EX0VOQUJMRV9QQUdJTkcpOworCisJcmV0ID0gcmtfd2FpdF9mb3IocmtfaW9t bXVfaXNfcGFnaW5nX2VuYWJsZWQoaW9tbXUpLCAxKTsKKwlpZiAocmV0KQorCQlkZXZfZXJyKGlv bW11LT5kZXYsICJFbmFibGUgcGFnaW5nIHJlcXVlc3QgdGltZWQgb3V0LCBzdGF0dXM6ICUjMDh4 XG4iLAorCQkJcmtfaW9tbXVfcmVhZChpb21tdSwgUktfTU1VX1NUQVRVUykpOworCisJcmV0dXJu IHJldDsKK30KKworc3RhdGljIGludCBya19pb21tdV9kaXNhYmxlX3BhZ2luZyhzdHJ1Y3Qgcmtf aW9tbXUgKmlvbW11KQoreworCWludCByZXQ7CisKKwlpZiAoIXJrX2lvbW11X2lzX3BhZ2luZ19l bmFibGVkKGlvbW11KSkKKwkJcmV0dXJuIDA7CisKKwlya19pb21tdV9jb21tYW5kKGlvbW11LCBS S19NTVVfQ01EX0RJU0FCTEVfUEFHSU5HKTsKKworCXJldCA9IHJrX3dhaXRfZm9yKCFya19pb21t dV9pc19wYWdpbmdfZW5hYmxlZChpb21tdSksIDEpOworCWlmIChyZXQpCisJCWRldl9lcnIoaW9t bXUtPmRldiwgIkRpc2FibGUgcGFnaW5nIHJlcXVlc3QgdGltZWQgb3V0LCBzdGF0dXM6ICMlMDh4 XG4iLAorCQkJcmtfaW9tbXVfcmVhZChpb21tdSwgUktfTU1VX1NUQVRVUykpOworCisJcmV0dXJu IHJldDsKK30KKworc3RhdGljIGludCBya19pb21tdV9mb3JjZV9yZXNldChzdHJ1Y3QgcmtfaW9t bXUgKmlvbW11KQoreworCWludCByZXQ7CisJdTMyIGR0ZV9hZGRyOworCisJLyoKKwkgKiBDaGVj ayBpZiByZWdpc3RlciBEVEVfQUREUiBpcyB3b3JraW5nIGJ5IHdyaXRpbmcgRFRFX0FERFJfRFVN TVkKKwkgKiBhbmQgdmVyaWZ5aW5nIHRoYXQgdXBwZXIgNSBueWJibGVzIGFyZSByZWFkIGJhY2su CisJICovCisJcmtfaW9tbXVfd3JpdGUoaW9tbXUsIFJLX01NVV9EVEVfQUREUiwgRFRFX0FERFJf RFVNTVkpOworCisJZHRlX2FkZHIgPSBya19pb21tdV9yZWFkKGlvbW11LCBSS19NTVVfRFRFX0FE RFIpOworCWlmIChkdGVfYWRkciAhPSAoRFRFX0FERFJfRFVNTVkgJiBSS19EVEVfUFRfQUREUkVT U19NQVNLKSkgeworCQlkZXZfZXJyKGlvbW11LT5kZXYsICJFcnJvciBkdXJpbmcgcmF3IHJlc2V0 LiBNTVVfRFRFX0FERFIgaXMgbm90IGZ1bmN0aW9uaW5nXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7 CisJfQorCisJcmtfaW9tbXVfY29tbWFuZChpb21tdSwgUktfTU1VX0NNRF9GT1JDRV9SRVNFVCk7 CisKKwlyZXQgPSBya193YWl0X2Zvcihya19pb21tdV9yZWFkKGlvbW11LCBSS19NTVVfRFRFX0FE RFIpID09IDB4MDAwMDAwMDAsCisJCQkgIEZPUkNFX1JFU0VUX1RJTUVPVVQpOworCWlmIChyZXQp CisJCWRldl9lcnIoaW9tbXUtPmRldiwgIkZPUkNFX1JFU0VUIGNvbW1hbmQgdGltZWQgb3V0XG4i KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGxvZ19pb3ZhKHN0cnVjdCBya19p b21tdSAqaW9tbXUsIGRtYV9hZGRyX3QgaW92YSkKK3sKKwl1MzIgZHRlX2luZGV4LCBwdGVfaW5k ZXgsIHBhZ2Vfb2Zmc2V0OworCXUzMiBtbXVfZHRlX2FkZHI7CisJcGh5c19hZGRyX3QgbW11X2R0 ZV9hZGRyX3BoeXMsIGR0ZV9hZGRyX3BoeXM7CisJdTMyICpkdGVfYWRkcjsKKwl1MzIgZHRlOwor CXBoeXNfYWRkcl90IHB0ZV9hZGRyX3BoeXMgPSAwOworCXUzMiAqcHRlX2FkZHIgPSBOVUxMOwor CXUzMiBwdGUgPSAwOworCXBoeXNfYWRkcl90IHBhZ2VfYWRkcl9waHlzID0gMDsKKwl1MzIgcGFn ZV9mbGFncyA9IDA7CisKKwlkdGVfaW5kZXggPSBya19pb3ZhX2R0ZV9pbmRleChpb3ZhKTsKKwlw dGVfaW5kZXggPSBya19pb3ZhX3B0ZV9pbmRleChpb3ZhKTsKKwlwYWdlX29mZnNldCA9IHJrX2lv dmFfcGFnZV9vZmZzZXQoaW92YSk7CisKKwltbXVfZHRlX2FkZHIgPSBya19pb21tdV9yZWFkKGlv bW11LCBSS19NTVVfRFRFX0FERFIpOworCW1tdV9kdGVfYWRkcl9waHlzID0gKHBoeXNfYWRkcl90 KW1tdV9kdGVfYWRkcjsKKworCWR0ZV9hZGRyX3BoeXMgPSBtbXVfZHRlX2FkZHJfcGh5cyArICg0 ICogZHRlX2luZGV4KTsKKwlkdGVfYWRkciA9IHBoeXNfdG9fdmlydChkdGVfYWRkcl9waHlzKTsK KwlkdGUgPSAqZHRlX2FkZHI7CisKKwlpZiAoIXJrX2R0ZV9pc19wdF92YWxpZChkdGUpKQorCQln b3RvIHByaW50X2l0OworCisJcHRlX2FkZHJfcGh5cyA9IHJrX2R0ZV9wdF9hZGRyZXNzKGR0ZSkg KyAocHRlX2luZGV4ICogNCk7CisJcHRlX2FkZHIgPSBwaHlzX3RvX3ZpcnQocHRlX2FkZHJfcGh5 cyk7CisJcHRlID0gKnB0ZV9hZGRyOworCisJaWYgKCFya19wdGVfaXNfcGFnZV92YWxpZChwdGUp KQorCQlnb3RvIHByaW50X2l0OworCisJcGFnZV9hZGRyX3BoeXMgPSBya19wdGVfcGFnZV9hZGRy ZXNzKHB0ZSkgKyBwYWdlX29mZnNldDsKKwlwYWdlX2ZsYWdzID0gcHRlICYgUktfUFRFX1BBR0Vf RkxBR1NfTUFTSzsKKworcHJpbnRfaXQ6CisJZGV2X2Vycihpb21tdS0+ZGV2LCAiaW92YSA9ICVw YWQ6IGR0ZV9pbmRleDogMHglMDN4IHB0ZV9pbmRleDogMHglMDN4IHBhZ2Vfb2Zmc2V0OiAweCUw M3hcbiIsCisJCSZpb3ZhLCBkdGVfaW5kZXgsIHB0ZV9pbmRleCwgcGFnZV9vZmZzZXQpOworCWRl dl9lcnIoaW9tbXUtPmRldiwgIm1tdV9kdGVfYWRkcjogJXBhIGR0ZUAlcGE6ICUjMDh4IHZhbGlk OiAldSBwdGVAJXBhOiAlIzA4eCB2YWxpZDogJXUgcGFnZUAlcGEgZmxhZ3M6ICUjMDN4XG4iLAor CQkmbW11X2R0ZV9hZGRyX3BoeXMsICZkdGVfYWRkcl9waHlzLCBkdGUsCisJCXJrX2R0ZV9pc19w dF92YWxpZChkdGUpLCAmcHRlX2FkZHJfcGh5cywgcHRlLAorCQlya19wdGVfaXNfcGFnZV92YWxp ZChwdGUpLCAmcGFnZV9hZGRyX3BoeXMsIHBhZ2VfZmxhZ3MpOworfQorCitzdGF0aWMgaXJxcmV0 dXJuX3QgcmtfaW9tbXVfaXJxKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3Qgcmtf aW9tbXUgKmlvbW11ID0gZGV2X2lkOworCXUzMiBzdGF0dXM7CisJdTMyIGludF9zdGF0dXM7CisJ ZG1hX2FkZHJfdCBpb3ZhOworCisJaW50X3N0YXR1cyA9IHJrX2lvbW11X3JlYWQoaW9tbXUsIFJL X01NVV9JTlRfU1RBVFVTKTsKKwlpZiAoaW50X3N0YXR1cyA9PSAwKQorCQlyZXR1cm4gSVJRX05P TkU7CisKKwlpb3ZhID0gcmtfaW9tbXVfcmVhZChpb21tdSwgUktfTU1VX1BBR0VfRkFVTFRfQURE Uik7CisKKwlpZiAoaW50X3N0YXR1cyAmIFJLX01NVV9JUlFfUEFHRV9GQVVMVCkgeworCQlpbnQg ZmxhZ3M7CisKKwkJc3RhdHVzID0gcmtfaW9tbXVfcmVhZChpb21tdSwgUktfTU1VX1NUQVRVUyk7 CisJCWZsYWdzID0gKHN0YXR1cyAmIFJLX01NVV9TVEFUVVNfUEFHRV9GQVVMVF9JU19XUklURSkg PworCQkJCUlPTU1VX0ZBVUxUX1dSSVRFIDogSU9NTVVfRkFVTFRfUkVBRDsKKworCQlkZXZfZXJy KGlvbW11LT5kZXYsICJQYWdlIGZhdWx0IGF0ICVwYWQgb2YgdHlwZSAlc1xuIiwKKwkJCSZpb3Zh LAorCQkJKGZsYWdzID09IElPTU1VX0ZBVUxUX1dSSVRFKSA/ICJ3cml0ZSIgOiAicmVhZCIpOwor CisJCWxvZ19pb3ZhKGlvbW11LCBpb3ZhKTsKKworCQkvKgorCQkgKiBSZXBvcnQgcGFnZSBmYXVs dCB0byBhbnkgaW5zdGFsbGVkIGhhbmRsZXJzLgorCQkgKiBJZ25vcmUgdGhlIHJldHVybiBjb2Rl LCB0aG91Z2gsIHNpbmNlIHdlIGFsd2F5cyB6YXAgY2FjaGUKKwkJICogYW5kIGNsZWFyIHRoZSBw YWdlIGZhdWx0IGFueXdheS4KKwkJICovCisJCWlmIChpb21tdS0+ZG9tYWluKQorCQkJcmVwb3J0 X2lvbW11X2ZhdWx0KGlvbW11LT5kb21haW4sIGlvbW11LT5kZXYsIGlvdmEsCisJCQkJCSAgIGZs YWdzKTsKKwkJZWxzZQorCQkJZGV2X2Vycihpb21tdS0+ZGV2LCAiUGFnZSBmYXVsdCB3aGlsZSBp b21tdSBub3QgYXR0YWNoZWQgdG8gZG9tYWluP1xuIik7CisKKwkJcmtfaW9tbXVfY29tbWFuZChp b21tdSwgUktfTU1VX0NNRF9aQVBfQ0FDSEUpOworCQlya19pb21tdV9jb21tYW5kKGlvbW11LCBS S19NTVVfQ01EX1BBR0VfRkFVTFRfRE9ORSk7CisJfQorCisJaWYgKGludF9zdGF0dXMgJiBSS19N TVVfSVJRX0JVU19FUlJPUikKKwkJZGV2X2Vycihpb21tdS0+ZGV2LCAiQlVTX0VSUk9SIG9jY3Vy cmVkIGF0ICVwYWRcbiIsICZpb3ZhKTsKKworCWlmIChpbnRfc3RhdHVzICYgflJLX01NVV9JUlFf TUFTSykKKwkJZGV2X2Vycihpb21tdS0+ZGV2LCAidW5leHBlY3RlZCBpbnRfc3RhdHVzOiAlIzA4 eFxuIiwKKwkJCWludF9zdGF0dXMpOworCisJcmtfaW9tbXVfd3JpdGUoaW9tbXUsIFJLX01NVV9J TlRfQ0xFQVIsIGludF9zdGF0dXMpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0 aWMgcGh5c19hZGRyX3QgcmtfaW9tbXVfaW92YV90b19waHlzKHN0cnVjdCBpb21tdV9kb21haW4g KmRvbWFpbiwKKwkJCQkJIGRtYV9hZGRyX3QgaW92YSkKK3sKKwlzdHJ1Y3QgcmtfaW9tbXVfZG9t YWluICpya19kb21haW4gPSBkb21haW4tPnByaXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlw aHlzX2FkZHJfdCBwdF9waHlzLCBwaHlzID0gMDsKKwl1MzIgZHRlLCBwdGU7CisJdTMyICpwYWdl X3RhYmxlOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnJrX2RvbWFpbi0+ZHRfbG9jaywgZmxhZ3Mp OworCisJZHRlID0gcmtfZG9tYWluLT5kdFtya19pb3ZhX2R0ZV9pbmRleChpb3ZhKV07CisJaWYg KCFya19kdGVfaXNfcHRfdmFsaWQoZHRlKSkKKwkJZ290byBvdXQ7CisKKwlwdF9waHlzID0gcmtf ZHRlX3B0X2FkZHJlc3MoZHRlKTsKKwlwYWdlX3RhYmxlID0gKHUzMiAqKXBoeXNfdG9fdmlydChw dF9waHlzKTsKKwlwdGUgPSBwYWdlX3RhYmxlW3JrX2lvdmFfcHRlX2luZGV4KGlvdmEpXTsKKwlp ZiAoIXJrX3B0ZV9pc19wYWdlX3ZhbGlkKHB0ZSkpCisJCWdvdG8gb3V0OworCisJcGh5cyA9IHJr X3B0ZV9wYWdlX2FkZHJlc3MocHRlKSArIHJrX2lvdmFfcGFnZV9vZmZzZXQoaW92YSk7CitvdXQ6 CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcmtfZG9tYWluLT5kdF9sb2NrLCBmbGFncyk7CisK KwlyZXR1cm4gcGh5czsKK30KKworc3RhdGljIHZvaWQgcmtfaW9tbXVfemFwX2lvdmEoc3RydWN0 IHJrX2lvbW11X2RvbWFpbiAqcmtfZG9tYWluLAorCQkJICAgICAgZG1hX2FkZHJfdCBpb3ZhLCBz aXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7CisJdW5zaWduZWQgbG9uZyBm bGFnczsKKworCS8qIHNob290ZG93biB0aGVzZSBpb3ZhIGZyb20gYWxsIGlvbW11cyB1c2luZyB0 aGlzIGRvbWFpbiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZya19kb21haW4tPmlvbW11c19sb2Nr LCBmbGFncyk7CisJbGlzdF9mb3JfZWFjaChwb3MsICZya19kb21haW4tPmlvbW11cykgeworCQlz dHJ1Y3QgcmtfaW9tbXUgKmlvbW11OworCQlpb21tdSA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3Qg cmtfaW9tbXUsIG5vZGUpOworCQlya19pb21tdV96YXBfbGluZXMoaW9tbXUsIGlvdmEsIHNpemUp OworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZya19kb21haW4tPmlvbW11c19sb2NrLCBm bGFncyk7Cit9CisKK3N0YXRpYyB1MzIgKnJrX2R0ZV9nZXRfcGFnZV90YWJsZShzdHJ1Y3Qgcmtf aW9tbXVfZG9tYWluICpya19kb21haW4sCisJCQkJICBkbWFfYWRkcl90IGlvdmEpCit7CisJdTMy ICpwYWdlX3RhYmxlLCAqZHRlX2FkZHI7CisJdTMyIGR0ZTsKKwlwaHlzX2FkZHJfdCBwdF9waHlz OworCisJYXNzZXJ0X3NwaW5fbG9ja2VkKCZya19kb21haW4tPmR0X2xvY2spOworCisJZHRlX2Fk ZHIgPSAmcmtfZG9tYWluLT5kdFtya19pb3ZhX2R0ZV9pbmRleChpb3ZhKV07CisJZHRlID0gKmR0 ZV9hZGRyOworCWlmIChya19kdGVfaXNfcHRfdmFsaWQoZHRlKSkKKwkJZ290byBkb25lOworCisJ cGFnZV90YWJsZSA9ICh1MzIgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0FUT01JQyB8IEdGUF9ETUEz Mik7CisJaWYgKCFwYWdlX3RhYmxlKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCWR0 ZSA9IHJrX21rX2R0ZShwYWdlX3RhYmxlKTsKKwkqZHRlX2FkZHIgPSBkdGU7CisKKwlya190YWJs ZV9mbHVzaChwYWdlX3RhYmxlLCBOVU1fUFRfRU5UUklFUyk7CisJcmtfdGFibGVfZmx1c2goZHRl X2FkZHIsIDEpOworCisJLyoKKwkgKiBaYXAgdGhlIGZpcnN0IGlvdmEgb2YgbmV3bHkgYWxsb2Nh dGVkIHBhZ2UgdGFibGUgc28gaW9tbXUgZXZpY3RzCisJICogb2xkIGNhY2hlZCB2YWx1ZSBvZiBu ZXcgZHRlIGZyb20gdGhlIGlvdGxiLgorCSAqLworCXJrX2lvbW11X3phcF9pb3ZhKHJrX2RvbWFp biwgaW92YSwgU1BBR0VfU0laRSk7CisKK2RvbmU6CisJcHRfcGh5cyA9IHJrX2R0ZV9wdF9hZGRy ZXNzKGR0ZSk7CisJcmV0dXJuICh1MzIgKilwaHlzX3RvX3ZpcnQocHRfcGh5cyk7Cit9CisKK3N0 YXRpYyBzaXplX3QgcmtfaW9tbXVfdW5tYXBfaW92YShzdHJ1Y3QgcmtfaW9tbXVfZG9tYWluICpy a19kb21haW4sCisJCQkJICB1MzIgKnB0ZV9hZGRyLCBkbWFfYWRkcl90IGlvdmEsIHNpemVfdCBz aXplKQoreworCXVuc2lnbmVkIGludCBwdGVfY291bnQ7CisJdW5zaWduZWQgaW50IHB0ZV90b3Rh bCA9IHNpemUgLyBTUEFHRV9TSVpFOworCisJYXNzZXJ0X3NwaW5fbG9ja2VkKCZya19kb21haW4t PmR0X2xvY2spOworCisJZm9yIChwdGVfY291bnQgPSAwOyBwdGVfY291bnQgPCBwdGVfdG90YWw7 IHB0ZV9jb3VudCsrKSB7CisJCXUzMiBwdGUgPSBwdGVfYWRkcltwdGVfY291bnRdOworCQlpZiAo IXJrX3B0ZV9pc19wYWdlX3ZhbGlkKHB0ZSkpCisJCQlicmVhazsKKworCQlwdGVfYWRkcltwdGVf Y291bnRdID0gcmtfbWtfcHRlX2ludmFsaWQocHRlKTsKKwl9CisKKwlya190YWJsZV9mbHVzaChw dGVfYWRkciwgcHRlX2NvdW50KTsKKworCXJldHVybiBwdGVfY291bnQgKiBTUEFHRV9TSVpFOwor fQorCitzdGF0aWMgaW50IHJrX2lvbW11X21hcF9pb3ZhKHN0cnVjdCBya19pb21tdV9kb21haW4g KnJrX2RvbWFpbiwgdTMyICpwdGVfYWRkciwKKwkJCSAgICAgZG1hX2FkZHJfdCBpb3ZhLCBwaHlz X2FkZHJfdCBwYWRkciwgc2l6ZV90IHNpemUsCisJCQkgICAgIGludCBwcm90KQoreworCXVuc2ln bmVkIGludCBwdGVfY291bnQ7CisJdW5zaWduZWQgaW50IHB0ZV90b3RhbCA9IHNpemUgLyBTUEFH RV9TSVpFOworCXBoeXNfYWRkcl90IHBhZ2VfcGh5czsKKworCWFzc2VydF9zcGluX2xvY2tlZCgm cmtfZG9tYWluLT5kdF9sb2NrKTsKKworCWZvciAocHRlX2NvdW50ID0gMDsgcHRlX2NvdW50IDwg cHRlX3RvdGFsOyBwdGVfY291bnQrKykgeworCQl1MzIgcHRlID0gcHRlX2FkZHJbcHRlX2NvdW50 XTsKKworCQlpZiAocmtfcHRlX2lzX3BhZ2VfdmFsaWQocHRlKSkKKwkJCWdvdG8gdW53aW5kOwor CisJCXB0ZV9hZGRyW3B0ZV9jb3VudF0gPSBya19ta19wdGUocGFkZHIsIHByb3QpOworCisJCXBh ZGRyICs9IFNQQUdFX1NJWkU7CisJfQorCisJcmtfdGFibGVfZmx1c2gocHRlX2FkZHIsIHB0ZV9j b3VudCk7CisKKwlyZXR1cm4gMDsKK3Vud2luZDoKKwkvKiBVbm1hcCB0aGUgcmFuZ2Ugb2YgaW92 YXMgdGhhdCB3ZSBqdXN0IG1hcHBlZCAqLworCXJrX2lvbW11X3VubWFwX2lvdmEocmtfZG9tYWlu LCBwdGVfYWRkciwgaW92YSwgcHRlX2NvdW50ICogU1BBR0VfU0laRSk7CisKKwlpb3ZhICs9IHB0 ZV9jb3VudCAqIFNQQUdFX1NJWkU7CisJcGFnZV9waHlzID0gcmtfcHRlX3BhZ2VfYWRkcmVzcyhw dGVfYWRkcltwdGVfY291bnRdKTsKKwlwcl9lcnIoImlvdmE6ICVwYWQgYWxyZWFkeSBtYXBwZWQg dG8gJXBhIGNhbm5vdCByZW1hcCB0byBwaHlzOiAlcGEgcHJvdDolI3hcbiIsCisJICAgICAgICZp b3ZhLCAmcGFnZV9waHlzLCAmcGFkZHIsIHByb3QpOworCisJcmV0dXJuIC1FQUREUklOVVNFOwor fQorCitzdGF0aWMgaW50IHJrX2lvbW11X21hcChzdHJ1Y3QgaW9tbXVfZG9tYWluICpkb21haW4s IHVuc2lnbmVkIGxvbmcgX2lvdmEsCisJCQlwaHlzX2FkZHJfdCBwYWRkciwgc2l6ZV90IHNpemUs IGludCBwcm90KQoreworCXN0cnVjdCBya19pb21tdV9kb21haW4gKnJrX2RvbWFpbiA9IGRvbWFp bi0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWRtYV9hZGRyX3QgaW92YSA9IChkbWFf YWRkcl90KV9pb3ZhOworCXUzMiAqcGFnZV90YWJsZSwgKnB0ZV9hZGRyOworCWludCByZXQ7CisK KwlzcGluX2xvY2tfaXJxc2F2ZSgmcmtfZG9tYWluLT5kdF9sb2NrLCBmbGFncyk7CisKKwkvKgor CSAqIHBnc2l6ZV9iaXRtYXAgc3BlY2lmaWVzIGlvdmEgc2l6ZXMgdGhhdCBmaXQgaW4gb25lIHBh Z2UgdGFibGUKKwkgKiAoMTAyNCA0LUtpQiBwYWdlcyA9IDQgTWlCKS4KKwkgKiBTbywgc2l6ZSB3 aWxsIGFsd2F5cyBiZSA0MDk2IDw9IHNpemUgPD0gNDE5NDMwNC4KKwkgKiBTaW5jZSBpb21tdV9t YXAoKSBndWFyYW50ZWVzIHRoYXQgYm90aCBpb3ZhIGFuZCBzaXplIHdpbGwgYmUKKwkgKiBhbGln bmVkLCB3ZSB3aWxsIGFsd2F5cyBvbmx5IGJlIG1hcHBpbmcgZnJvbSBhIHNpbmdsZSBkdGUgaGVy ZS4KKwkgKi8KKwlwYWdlX3RhYmxlID0gcmtfZHRlX2dldF9wYWdlX3RhYmxlKHJrX2RvbWFpbiwg aW92YSk7CisJaWYgKElTX0VSUihwYWdlX3RhYmxlKSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0 b3JlKCZya19kb21haW4tPmR0X2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIFBUUl9FUlIocGFnZV90 YWJsZSk7CisJfQorCisJcHRlX2FkZHIgPSAmcGFnZV90YWJsZVtya19pb3ZhX3B0ZV9pbmRleChp b3ZhKV07CisJcmV0ID0gcmtfaW9tbXVfbWFwX2lvdmEocmtfZG9tYWluLCBwdGVfYWRkciwgaW92 YSwgcGFkZHIsIHNpemUsIHByb3QpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJrX2RvbWFp bi0+ZHRfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNpemVfdCBy a19pb21tdV91bm1hcChzdHJ1Y3QgaW9tbXVfZG9tYWluICpkb21haW4sIHVuc2lnbmVkIGxvbmcg X2lvdmEsCisJCQkgICAgIHNpemVfdCBzaXplKQoreworCXN0cnVjdCBya19pb21tdV9kb21haW4g KnJrX2RvbWFpbiA9IGRvbWFpbi0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWRtYV9h ZGRyX3QgaW92YSA9IChkbWFfYWRkcl90KV9pb3ZhOworCXBoeXNfYWRkcl90IHB0X3BoeXM7CisJ dTMyIGR0ZTsKKwl1MzIgKnB0ZV9hZGRyOworCXNpemVfdCB1bm1hcF9zaXplOworCisJc3Bpbl9s b2NrX2lycXNhdmUoJnJrX2RvbWFpbi0+ZHRfbG9jaywgZmxhZ3MpOworCisJLyoKKwkgKiBwZ3Np emVfYml0bWFwIHNwZWNpZmllcyBpb3ZhIHNpemVzIHRoYXQgZml0IGluIG9uZSBwYWdlIHRhYmxl CisJICogKDEwMjQgNC1LaUIgcGFnZXMgPSA0IE1pQikuCisJICogU28sIHNpemUgd2lsbCBhbHdh eXMgYmUgNDA5NiA8PSBzaXplIDw9IDQxOTQzMDQuCisJICogU2luY2UgaW9tbXVfdW5tYXAoKSBn dWFyYW50ZWVzIHRoYXQgYm90aCBpb3ZhIGFuZCBzaXplIHdpbGwgYmUKKwkgKiBhbGlnbmVkLCB3 ZSB3aWxsIGFsd2F5cyBvbmx5IGJlIHVubWFwcGluZyBmcm9tIGEgc2luZ2xlIGR0ZSBoZXJlLgor CSAqLworCWR0ZSA9IHJrX2RvbWFpbi0+ZHRbcmtfaW92YV9kdGVfaW5kZXgoaW92YSldOworCS8q IEp1c3QgcmV0dXJuIDAgaWYgaW92YSBpcyB1bm1hcHBlZCAqLworCWlmICghcmtfZHRlX2lzX3B0 X3ZhbGlkKGR0ZSkpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcmtfZG9tYWluLT5kdF9s b2NrLCBmbGFncyk7CisJCXJldHVybiAwOworCX0KKworCXB0X3BoeXMgPSBya19kdGVfcHRfYWRk cmVzcyhkdGUpOworCXB0ZV9hZGRyID0gKHUzMiAqKXBoeXNfdG9fdmlydChwdF9waHlzKSArIHJr X2lvdmFfcHRlX2luZGV4KGlvdmEpOworCXVubWFwX3NpemUgPSBya19pb21tdV91bm1hcF9pb3Zh KHJrX2RvbWFpbiwgcHRlX2FkZHIsIGlvdmEsIHNpemUpOworCisJc3Bpbl91bmxvY2tfaXJxcmVz dG9yZSgmcmtfZG9tYWluLT5kdF9sb2NrLCBmbGFncyk7CisKKwkvKiBTaG9vdGRvd24gaW90bGIg ZW50cmllcyBmb3IgaW92YSByYW5nZSB0aGF0IHdhcyBqdXN0IHVubWFwcGVkICovCisJcmtfaW9t bXVfemFwX2lvdmEocmtfZG9tYWluLCBpb3ZhLCB1bm1hcF9zaXplKTsKKworCXJldHVybiB1bm1h cF9zaXplOworfQorCitzdGF0aWMgaW50IHJrX2lvbW11X2F0dGFjaF9kZXZpY2Uoc3RydWN0IGlv bW11X2RvbWFpbiAqZG9tYWluLAorCQkJCSAgc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVj dCBya19pb21tdSAqaW9tbXUgPSBkZXZfZ2V0X2RydmRhdGEoZGV2LT5hcmNoZGF0YS5pb21tdSk7 CisJc3RydWN0IHJrX2lvbW11X2RvbWFpbiAqcmtfZG9tYWluID0gZG9tYWluLT5wcml2OworCXVu c2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldDsKKwlwaHlzX2FkZHJfdCBkdGVfYWRkcjsKKwor CS8qCisJICogQWxsb3cgJ3ZpcnR1YWwgZGV2aWNlcycgKGUuZy4sIGRybSkgdG8gYXR0YWNoIHRv IGRvbWFpbi4KKwkgKiBTdWNoIGEgZGV2aWNlIGhhcyBhIE5VTEwgYXJjaGRhdGEuaW9tbXUuCisJ ICovCisJaWYgKCFpb21tdSkKKwkJcmV0dXJuIDA7CisKKwlyZXQgPSBya19pb21tdV9lbmFibGVf c3RhbGwoaW9tbXUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBya19pb21t dV9mb3JjZV9yZXNldChpb21tdSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlvbW11 LT5kb21haW4gPSBkb21haW47CisKKwlyZXQgPSBkZXZtX3JlcXVlc3RfaXJxKGRldiwgaW9tbXUt PmlycSwgcmtfaW9tbXVfaXJxLAorCQkJICAgICAgIElSUUZfU0hBUkVELCBkZXZfbmFtZShkZXYp LCBpb21tdSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWR0ZV9hZGRyID0gdmlydF90 b19waHlzKHJrX2RvbWFpbi0+ZHQpOworCXJrX2lvbW11X3dyaXRlKGlvbW11LCBSS19NTVVfRFRF X0FERFIsIGR0ZV9hZGRyKTsKKwlya19pb21tdV9jb21tYW5kKGlvbW11LCBSS19NTVVfQ01EX1pB UF9DQUNIRSk7CisJcmtfaW9tbXVfd3JpdGUoaW9tbXUsIFJLX01NVV9JTlRfTUFTSywgUktfTU1V X0lSUV9NQVNLKTsKKworCXJldCA9IHJrX2lvbW11X2VuYWJsZV9wYWdpbmcoaW9tbXUpOworCWlm IChyZXQpCisJCXJldHVybiByZXQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcmtfZG9tYWluLT5p b21tdXNfbG9jaywgZmxhZ3MpOworCWxpc3RfYWRkX3RhaWwoJmlvbW11LT5ub2RlLCAmcmtfZG9t YWluLT5pb21tdXMpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJrX2RvbWFpbi0+aW9tbXVz X2xvY2ssIGZsYWdzKTsKKworCWRldl9pbmZvKGRldiwgIkF0dGFjaGVkIHRvIGlvbW11IGRvbWFp blxuIik7CisKKwlya19pb21tdV9kaXNhYmxlX3N0YWxsKGlvbW11KTsKKworCXJldHVybiAwOwor fQorCitzdGF0aWMgdm9pZCBya19pb21tdV9kZXRhY2hfZGV2aWNlKHN0cnVjdCBpb21tdV9kb21h aW4gKmRvbWFpbiwKKwkJCQkgICBzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHJrX2lv bW11ICppb21tdSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYtPmFyY2hkYXRhLmlvbW11KTsKKwlzdHJ1 Y3QgcmtfaW9tbXVfZG9tYWluICpya19kb21haW4gPSBkb21haW4tPnByaXY7CisJdW5zaWduZWQg bG9uZyBmbGFnczsKKworCS8qIEFsbG93ICd2aXJ0dWFsIGRldmljZXMnIChlZyBkcm0pIHRvIGRl dGFjaCBmcm9tIGRvbWFpbiAqLworCWlmICghaW9tbXUpCisJCXJldHVybjsKKworCWlvbW11LT5k b21haW4gPSBOVUxMOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnJrX2RvbWFpbi0+aW9tbXVzX2xv Y2ssIGZsYWdzKTsKKwlsaXN0X2RlbF9pbml0KCZpb21tdS0+bm9kZSk7CisJc3Bpbl91bmxvY2tf aXJxcmVzdG9yZSgmcmtfZG9tYWluLT5pb21tdXNfbG9jaywgZmxhZ3MpOworCisJZGV2bV9mcmVl X2lycShkZXYsIGlvbW11LT5pcnEsIGlvbW11KTsKKworCWlvbW11LT5kb21haW4gPSBOVUxMOwor CisJLyogSWdub3JlIGVycm9yIHdoaWxlIGRpc2FibGluZywganVzdCBrZWVwIGdvaW5nICovCisJ cmtfaW9tbXVfZW5hYmxlX3N0YWxsKGlvbW11KTsKKwlya19pb21tdV9kaXNhYmxlX3BhZ2luZyhp b21tdSk7CisJcmtfaW9tbXVfd3JpdGUoaW9tbXUsIFJLX01NVV9JTlRfTUFTSywgMCk7CisJcmtf aW9tbXVfd3JpdGUoaW9tbXUsIFJLX01NVV9EVEVfQUREUiwgMCk7CisJcmtfaW9tbXVfZGlzYWJs ZV9zdGFsbChpb21tdSk7CisKKwlkZXZfaW5mbyhkZXYsICJEZXRhY2hlZCBmcm9tIGlvbW11IGRv bWFpblxuIik7Cit9CisKK3N0YXRpYyBpbnQgcmtfaW9tbXVfZG9tYWluX2luaXQoc3RydWN0IGlv bW11X2RvbWFpbiAqZG9tYWluKQoreworCXN0cnVjdCBya19pb21tdV9kb21haW4gKnJrX2RvbWFp bjsKKworCXJrX2RvbWFpbiA9IGt6YWxsb2Moc2l6ZW9mKCpya19kb21haW4pLCBHRlBfS0VSTkVM KTsKKwlpZiAoIXJrX2RvbWFpbikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKgorCSAqIHJrMzJ4 eCBpb21tdXMgdXNlIGEgMiBsZXZlbCBwYWdldGFibGUuCisJICogRWFjaCBsZXZlbDEgKGR0KSBh bmQgbGV2ZWwyIChwdCkgdGFibGUgaGFzIDEwMjQgNC1ieXRlIGVudHJpZXMuCisJICogQWxsb2Nh dGUgb25lIDQgS2lCIHBhZ2UgZm9yIGVhY2ggdGFibGUuCisJICovCisJcmtfZG9tYWluLT5kdCA9 ICh1MzIgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCB8IEdGUF9ETUEzMik7CisJaWYgKCFy a19kb21haW4tPmR0KQorCQlnb3RvIGVycl9kdDsKKworCXJrX3RhYmxlX2ZsdXNoKHJrX2RvbWFp bi0+ZHQsIE5VTV9EVF9FTlRSSUVTKTsKKworCXNwaW5fbG9ja19pbml0KCZya19kb21haW4tPmlv bW11c19sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmcmtfZG9tYWluLT5kdF9sb2NrKTsKKwlJTklU X0xJU1RfSEVBRCgmcmtfZG9tYWluLT5pb21tdXMpOworCisJZG9tYWluLT5wcml2ID0gcmtfZG9t YWluOworCisJcmV0dXJuIDA7CitlcnJfZHQ6CisJa2ZyZWUocmtfZG9tYWluKTsKKwlyZXR1cm4g LUVOT01FTTsKK30KKworc3RhdGljIHZvaWQgcmtfaW9tbXVfZG9tYWluX2Rlc3Ryb3koc3RydWN0 IGlvbW11X2RvbWFpbiAqZG9tYWluKQoreworCXN0cnVjdCBya19pb21tdV9kb21haW4gKnJrX2Rv bWFpbiA9IGRvbWFpbi0+cHJpdjsKKwlpbnQgaTsKKworCVdBUk5fT04oIWxpc3RfZW1wdHkoJnJr X2RvbWFpbi0+aW9tbXVzKSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0RUX0VOVFJJRVM7IGkr KykgeworCQl1MzIgZHRlID0gcmtfZG9tYWluLT5kdFtpXTsKKwkJaWYgKHJrX2R0ZV9pc19wdF92 YWxpZChkdGUpKSB7CisJCQlwaHlzX2FkZHJfdCBwdF9waHlzID0gcmtfZHRlX3B0X2FkZHJlc3Mo ZHRlKTsKKwkJCXUzMiAqcGFnZV90YWJsZSA9IHBoeXNfdG9fdmlydChwdF9waHlzKTsKKwkJCWZy ZWVfcGFnZSgodW5zaWduZWQgbG9uZylwYWdlX3RhYmxlKTsKKwkJfQorCX0KKworCWZyZWVfcGFn ZSgodW5zaWduZWQgbG9uZylya19kb21haW4tPmR0KTsKKwlrZnJlZShkb21haW4tPnByaXYpOwor CWRvbWFpbi0+cHJpdiA9IE5VTEw7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaW9tbXVfb3Bz IHJrX2lvbW11X29wcyA9IHsKKwkuZG9tYWluX2luaXQgPSBya19pb21tdV9kb21haW5faW5pdCwK KwkuZG9tYWluX2Rlc3Ryb3kgPSBya19pb21tdV9kb21haW5fZGVzdHJveSwKKwkuYXR0YWNoX2Rl diA9IHJrX2lvbW11X2F0dGFjaF9kZXZpY2UsCisJLmRldGFjaF9kZXYgPSBya19pb21tdV9kZXRh Y2hfZGV2aWNlLAorCS5tYXAgPSBya19pb21tdV9tYXAsCisJLnVubWFwID0gcmtfaW9tbXVfdW5t YXAsCisJLmlvdmFfdG9fcGh5cyA9IHJrX2lvbW11X2lvdmFfdG9fcGh5cywKKwkucGdzaXplX2Jp dG1hcCA9IFJLX0lPTU1VX1BHU0laRV9CSVRNQVAsCit9OworCitzdGF0aWMgaW50IHJrX2lvbW11 X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGRldmljZSAq ZGV2ID0gJnBkZXYtPmRldjsKKwlzdHJ1Y3QgcmtfaW9tbXUgKmlvbW11OworCXN0cnVjdCByZXNv dXJjZSAqcmVzOworCisJaW9tbXUgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmlvbW11KSwg R0ZQX0tFUk5FTCk7CisJaWYgKCFpb21tdSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwbGF0Zm9y bV9zZXRfZHJ2ZGF0YShwZGV2LCBpb21tdSk7CisJaW9tbXUtPmRldiA9IGRldjsKKworCXJlcyA9 IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaW9tbXUt PmJhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKKwlpZiAoSVNf RVJSKGlvbW11LT5iYXNlKSkKKwkJcmV0dXJuIFBUUl9FUlIoaW9tbXUtPmJhc2UpOworCisJaW9t bXUtPmlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJaWYgKGlvbW11LT5pcnEgPCAw KSB7CisJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIGdldCBJUlEsICVkXG4iLCBpb21tdS0+aXJx KTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBy a19pb21tdV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlyZXR1cm4g MDsKK30KKworI2lmZGVmIENPTkZJR19PRgorc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2Vf aWQgcmtfaW9tbXVfZHRfaWRzW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJyb2NrY2hpcCxpb21t dSIgfSwKKwl7IC8qIHNlbnRpbmVsICovIH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBy a19pb21tdV9kdF9pZHMpOworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVy IHJrX2lvbW11X2RyaXZlciA9IHsKKwkucHJvYmUgPSBya19pb21tdV9wcm9iZSwKKwkucmVtb3Zl ID0gcmtfaW9tbXVfcmVtb3ZlLAorCS5kcml2ZXIgPSB7CisJCSAgIC5uYW1lID0gInJrX2lvbW11 IiwKKwkJICAgLm93bmVyID0gVEhJU19NT0RVTEUsCisJCSAgIC5vZl9tYXRjaF90YWJsZSA9IG9m X21hdGNoX3B0cihya19pb21tdV9kdF9pZHMpLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5p dCBya19pb21tdV9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCXJldCA9IGJ1c19zZXRfaW9t bXUoJnBsYXRmb3JtX2J1c190eXBlLCAmcmtfaW9tbXVfb3BzKTsKKwlpZiAocmV0KQorCQlyZXR1 cm4gcmV0OworCisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmcmtfaW9tbXVfZHJp dmVyKTsKK30KK3N0YXRpYyB2b2lkIF9fZXhpdCBya19pb21tdV9leGl0KHZvaWQpCit7CisJcGxh dGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnJrX2lvbW11X2RyaXZlcik7Cit9CisKK3N1YnN5c19p bml0Y2FsbChya19pb21tdV9pbml0KTsKK21vZHVsZV9leGl0KHJrX2lvbW11X2V4aXQpOworCitN T0RVTEVfREVTQ1JJUFRJT04oIklPTU1VIEFQSSBmb3IgUm9ja2NoaXAiKTsKK01PRFVMRV9BVVRI T1IoIlNpbW9uIFh1ZSA8eHhtQHJvY2stY2hpcHMuY29tPiBhbmQgRGFuaWVsIEt1cnR6IDxkamt1 cnR6QGNocm9taXVtLm9yZz4iKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06cm9ja2NoaXAtaW9t bXUiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKLS0gCjIuMS4wLnJjMi4yMDYuZ2VkYjAz ZTUKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmlvbW11 IG1haWxpbmcgbGlzdAppb21tdUBsaXN0cy5saW51eC1mb3VuZGF0aW9uLm9yZwpodHRwczovL2xp c3RzLmxpbnV4Zm91bmRhdGlvbi5vcmcvbWFpbG1hbi9saXN0aW5mby9pb21tdQ==