From mboxrd@z Thu Jan 1 00:00:00 1970 From: Daniel Kurtz Subject: [PATCH v2 1/3] iommu/rockchip: rk3288 iommu driver Date: Wed, 8 Oct 2014 10:19:55 +0800 Message-ID: <1412734798-11116-2-git-send-email-djkurtz@chromium.org> References: <1412734798-11116-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: <1412734798-11116-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 bGwgZGV2aWNlcwpoYXZlIGRldGFjaGVkIGJlZm9yZSBkZXN0cm95aW5nIGEgZG9tYWluLgoKQ2hh bmdlcyBpbiB2MjoKIC0gQWxsb2NhdGUgcGFnZSB0YWJsZXMgdXNpbmcgR0ZQX0RNQTMyCiAtIFJl b3JkZXIgc3RydWN0cyB0byBwdXQgc3BpbmxvY2tzIHRvZ2V0aGVyCiAtIFJld29yZCBjb21tZW50 IGluIG1hcC91bm1hcCBhYm91dCA+IDRNQiBtYXBwaW5ncwoKU2lnbmVkLW9mZi1ieTogRGFuaWVs IEt1cnR6IDxkamt1cnR6QGNocm9taXVtLm9yZz4KU2lnbmVkLW9mZi1ieTogU2ltb24gWHVlIDx4 eG1Acm9jay1jaGlwcy5jb20+ClJldmlld2VkLWJ5OiBHcmFudCBHcnVuZGxlciA8Z3J1bmRsZXJA Y2hyb21pdW0ub3JnPgpSZXZpZXdlZC1ieTogU3TDqXBoYW5lIE1hcmNoZXNpbiA8bWFyY2hldUBj aHJvbWl1bS5vcmc+Ci0tLQogZHJpdmVycy9pb21tdS9LY29uZmlnICAgICAgICAgIHwgIDExICsK IGRyaXZlcnMvaW9tbXUvTWFrZWZpbGUgICAgICAgICB8ICAgMSArCiBkcml2ZXJzL2lvbW11L3Jv Y2tjaGlwLWlvbW11LmMgfCA5MjQgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysKIDMgZmlsZXMgY2hhbmdlZCwgOTM2IGluc2VydGlvbnMoKykKIGNyZWF0ZSBtb2RlIDEw MDY0NCBkcml2ZXJzL2lvbW11L3JvY2tjaGlwLWlvbW11LmMKCmRpZmYgLS1naXQgYS9kcml2ZXJz L2lvbW11L0tjb25maWcgYi9kcml2ZXJzL2lvbW11L0tjb25maWcKaW5kZXggZGQ1MTEyMi4uYjgw NDU0YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pb21tdS9LY29uZmlnCisrKyBiL2RyaXZlcnMvaW9t bXUvS2NvbmZpZwpAQCAtMTUyLDYgKzE1MiwxNyBAQCBjb25maWcgT01BUF9JT01NVV9ERUJVRwog CiAgICAgICAgICBTYXkgTiB1bmxlc3MgeW91IGtub3cgeW91IG5lZWQgdGhpcy4KIAorY29uZmln IFJPQ0tDSElQX0lPTU1VCisJYm9vbCAiUm9ja2NoaXAgSU9NTVUgU3VwcG9ydCIKKwlkZXBlbmRz IG9uIEFSQ0hfUk9DS0NISVAKKwlzZWxlY3QgSU9NTVVfQVBJCisJaGVscAorCSAgU3VwcG9ydCBm b3IgSU9NTVVzIGZvdW5kIG9uIFJvY2tjaGlwIHJrMzJ4eCBTT0NzLgorCSAgVGhlc2UgSU9NTVVz IGFsbG93IHZpcnR1YWxpemF0aW9uIG9mIHRoZSBhZGRyZXNzIHNwYWNlIHVzZWQgYnkgbW9zdAor CSAgY29yZXMgd2l0aGluIHRoZSBtdWx0aW1lZGlhIHN1YnN5c3RlbS4KKwkgIFNheSBZIGhlcmUg aWYgeW91IGFyZSB1c2luZyBhIFJvY2tjaGlwIFNvQyB0aGF0IGluY2x1ZGVzIGFuIElPTU1VCisJ ICBkZXZpY2UuCisKIGNvbmZpZyBURUdSQV9JT01NVV9HQVJUCiAJYm9vbCAiVGVncmEgR0FSVCBJ T01NVSBTdXBwb3J0IgogCWRlcGVuZHMgb24gQVJDSF9URUdSQV8yeF9TT0MKZGlmZiAtLWdpdCBh L2RyaXZlcnMvaW9tbXUvTWFrZWZpbGUgYi9kcml2ZXJzL2lvbW11L01ha2VmaWxlCmluZGV4IDE2 ZWRlZjcuLjNlNDdlZjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW9tbXUvTWFrZWZpbGUKKysrIGIv ZHJpdmVycy9pb21tdS9NYWtlZmlsZQpAQCAtMTMsNiArMTMsNyBAQCBvYmotJChDT05GSUdfSVJR X1JFTUFQKSArPSBpbnRlbF9pcnFfcmVtYXBwaW5nLm8gaXJxX3JlbWFwcGluZy5vCiBvYmotJChD T05GSUdfT01BUF9JT01NVSkgKz0gb21hcC1pb21tdS5vCiBvYmotJChDT05GSUdfT01BUF9JT01N VSkgKz0gb21hcC1pb21tdTIubwogb2JqLSQoQ09ORklHX09NQVBfSU9NTVVfREVCVUcpICs9IG9t YXAtaW9tbXUtZGVidWcubworb2JqLSQoQ09ORklHX1JPQ0tDSElQX0lPTU1VKSArPSByb2NrY2hp cC1pb21tdS5vCiBvYmotJChDT05GSUdfVEVHUkFfSU9NTVVfR0FSVCkgKz0gdGVncmEtZ2FydC5v CiBvYmotJChDT05GSUdfVEVHUkFfSU9NTVVfU01NVSkgKz0gdGVncmEtc21tdS5vCiBvYmotJChD T05GSUdfRVhZTk9TX0lPTU1VKSArPSBleHlub3MtaW9tbXUubwpkaWZmIC0tZ2l0IGEvZHJpdmVy cy9pb21tdS9yb2NrY2hpcC1pb21tdS5jIGIvZHJpdmVycy9pb21tdS9yb2NrY2hpcC1pb21tdS5j Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4ZTUwZmMKLS0tIC9kZXYvbnVs bAorKysgYi9kcml2ZXJzL2lvbW11L3JvY2tjaGlwLWlvbW11LmMKQEAgLTAsMCArMSw5MjQgQEAK Ky8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1 dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2Vu ZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJl ZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5o PgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4K KyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2lu Y2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5j bHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pb21tdS5oPgorI2luY2x1ZGUgPGxp bnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgv bW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgor I2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIu aD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorCisvKiogTU1VIHJlZ2lzdGVyIG9mZnNl dHMgKi8KKyNkZWZpbmUgUktfTU1VX0RURV9BRERSCQkweDAwCS8qIERpcmVjdG9yeSB0YWJsZSBh ZGRyZXNzICovCisjZGVmaW5lIFJLX01NVV9TVEFUVVMJCTB4MDQKKyNkZWZpbmUgUktfTU1VX0NP TU1BTkQJCTB4MDgKKyNkZWZpbmUgUktfTU1VX1BBR0VfRkFVTFRfQUREUgkweDBDCS8qIElPVkEg b2YgbGFzdCBwYWdlIGZhdWx0ICovCisjZGVmaW5lIFJLX01NVV9aQVBfT05FX0xJTkUJMHgxMAkv KiBTaG9vdGRvd24gb25lIElPVExCIGVudHJ5ICovCisjZGVmaW5lIFJLX01NVV9JTlRfUkFXU1RB VAkweDE0CS8qIElSUSBzdGF0dXMgaWdub3JpbmcgbWFzayAqLworI2RlZmluZSBSS19NTVVfSU5U X0NMRUFSCTB4MTgJLyogQWNrbm93bGVkZ2UgYW5kIHJlLWFybSBpcnEgKi8KKyNkZWZpbmUgUktf TU1VX0lOVF9NQVNLCQkweDFDCS8qIElSUSBlbmFibGUgKi8KKyNkZWZpbmUgUktfTU1VX0lOVF9T VEFUVVMJMHgyMAkvKiBJUlEgc3RhdHVzIGFmdGVyIG1hc2tpbmcgKi8KKyNkZWZpbmUgUktfTU1V X0FVVE9fR0FUSU5HCTB4MjQKKworI2RlZmluZSBEVEVfQUREUl9EVU1NWQkJMHhDQUZFQkFCRQor I2RlZmluZSBGT1JDRV9SRVNFVF9USU1FT1VUCTEwMAkvKiBtcyAqLworCisvKiBSS19NTVVfU1RB VFVTIGZpZWxkcyAqLworI2RlZmluZSBSS19NTVVfU1RBVFVTX1BBR0lOR19FTkFCTEVEICAgICAg IEJJVCgwKQorI2RlZmluZSBSS19NTVVfU1RBVFVTX1BBR0VfRkFVTFRfQUNUSVZFICAgIEJJVCgx KQorI2RlZmluZSBSS19NTVVfU1RBVFVTX1NUQUxMX0FDVElWRSAgICAgICAgIEJJVCgyKQorI2Rl ZmluZSBSS19NTVVfU1RBVFVTX0lETEUgICAgICAgICAgICAgICAgIEJJVCgzKQorI2RlZmluZSBS S19NTVVfU1RBVFVTX1JFUExBWV9CVUZGRVJfRU1QVFkgIEJJVCg0KQorI2RlZmluZSBSS19NTVVf U1RBVFVTX1BBR0VfRkFVTFRfSVNfV1JJVEUgIEJJVCg1KQorI2RlZmluZSBSS19NTVVfU1RBVFVT X1NUQUxMX05PVF9BQ1RJVkUgICAgIEJJVCgzMSkKKworLyogUktfTU1VX0NPTU1BTkQgY29tbWFu ZCB2YWx1ZXMgKi8KKyNkZWZpbmUgUktfTU1VX0NNRF9FTkFCTEVfUEFHSU5HICAgIDAgIC8qIEVu YWJsZSBtZW1vcnkgdHJhbnNsYXRpb24gKi8KKyNkZWZpbmUgUktfTU1VX0NNRF9ESVNBQkxFX1BB R0lORyAgIDEgIC8qIERpc2FibGUgbWVtb3J5IHRyYW5zbGF0aW9uICovCisjZGVmaW5lIFJLX01N VV9DTURfRU5BQkxFX1NUQUxMICAgICAyICAvKiBTdGFsbCBwYWdpbmcgdG8gYWxsb3cgb3RoZXIg Y21kcyAqLworI2RlZmluZSBSS19NTVVfQ01EX0RJU0FCTEVfU1RBTEwgICAgMyAgLyogU3RvcCBz dGFsbCByZS1lbmFibGVzIHBhZ2luZyAqLworI2RlZmluZSBSS19NTVVfQ01EX1pBUF9DQUNIRSAg ICAgICAgNCAgLyogU2hvb3QgZG93biBlbnRpcmUgSU9UTEIgKi8KKyNkZWZpbmUgUktfTU1VX0NN RF9QQUdFX0ZBVUxUX0RPTkUgIDUgIC8qIENsZWFyIHBhZ2UgZmF1bHQgKi8KKyNkZWZpbmUgUktf TU1VX0NNRF9GT1JDRV9SRVNFVCAgICAgIDYgIC8qIFJlc2V0IGFsbCByZWdpc3RlcnMgKi8KKwor LyogUktfTU1VX0lOVF8qIHJlZ2lzdGVyIGZpZWxkcyAqLworI2RlZmluZSBSS19NTVVfSVJRX1BB R0VfRkFVTFQgICAgMHgwMSAgLyogcGFnZSBmYXVsdCAqLworI2RlZmluZSBSS19NTVVfSVJRX0JV U19FUlJPUiAgICAgMHgwMiAgLyogYnVzIHJlYWQgZXJyb3IgKi8KKyNkZWZpbmUgUktfTU1VX0lS UV9NQVNLICAgICAgICAgIChSS19NTVVfSVJRX1BBR0VfRkFVTFQgfCBSS19NTVVfSVJRX0JVU19F UlJPUikKKworI2RlZmluZSBOVU1fRFRfRU5UUklFUyAxMDI0CisjZGVmaW5lIE5VTV9QVF9FTlRS SUVTIDEwMjQKKworI2RlZmluZSBTUEFHRV9PUkRFUiAxMgorI2RlZmluZSBTUEFHRV9TSVpFICgx IDw8IFNQQUdFX09SREVSKQorCisgLyoKKyAgKiBTdXBwb3J0IG1hcHBpbmcgYW55IHNpemUgdGhh dCBmaXRzIGluIG9uZSBwYWdlIHRhYmxlOgorICAqICAgNCBLaUIgdG8gNCBNaUIKKyAgKi8KKyNk ZWZpbmUgUktfSU9NTVVfUEdTSVpFX0JJVE1BUCAweDAwN2ZmMDAwCisKKyNkZWZpbmUgSU9NTVVf UkVHX1BPTExfQ09VTlRfRkFTVCAxMDAwCisKK3N0cnVjdCBya19pb21tdV9kb21haW4geworCXN0 cnVjdCBsaXN0X2hlYWQgaW9tbXVzOworCXUzMiAqZHQ7IC8qIHBhZ2UgZGlyZWN0b3J5IHRhYmxl ICovCisJc3BpbmxvY2tfdCBpb21tdXNfbG9jazsgLyogbG9jayBmb3IgaW9tbXVzIGxpc3QgKi8K KwlzcGlubG9ja190IGR0X2xvY2s7IC8qIGxvY2sgZm9yIG1vZGlmeWluZyBwYWdlIGRpcmVjdG9y eSB0YWJsZSAqLworfTsKKworc3RydWN0IHJrX2lvbW11IHsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7 CisJdm9pZCBfX2lvbWVtICpiYXNlOworCWludCBpcnE7CisJc3RydWN0IGxpc3RfaGVhZCBub2Rl OyAvKiBlbnRyeSBpbiBya19pb21tdV9kb21haW4uaW9tbXVzICovCisJc3RydWN0IGlvbW11X2Rv bWFpbiAqZG9tYWluOyAvKiBkb21haW4gdG8gd2hpY2ggaW9tbXUgaXMgYXR0YWNoZWQgKi8KK307 CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBya190YWJsZV9mbHVzaCh1MzIgKnZhLCB1bnNpZ25lZCBp bnQgY291bnQpCit7CisJcGh5c19hZGRyX3QgcGFfc3RhcnQgPSB2aXJ0X3RvX3BoeXModmEpOwor CXBoeXNfYWRkcl90IHBhX2VuZCA9IHZpcnRfdG9fcGh5cyh2YSArIGNvdW50KTsKKwlzaXplX3Qg c2l6ZSA9IHBhX2VuZCAtIHBhX3N0YXJ0OworCisJX19jcHVjX2ZsdXNoX2RjYWNoZV9hcmVhKHZh LCBzaXplKTsKKwlvdXRlcl9mbHVzaF9yYW5nZShwYV9zdGFydCwgcGFfZW5kKTsKK30KKworLyoq CisgKiBJbnNwaXJlZCBieSBfd2FpdF9mb3IgaW4gaW50ZWxfZHJ2LmgKKyAqIFRoaXMgaXMgTk9U IHNhZmUgZm9yIHVzZSBpbiBpbnRlcnJ1cHQgY29udGV4dC4KKyAqCisgKiBOb3RlIHRoYXQgaXQn cyBpbXBvcnRhbnQgdGhhdCB3ZSBjaGVjayB0aGUgY29uZGl0aW9uIGFnYWluIGFmdGVyIGhhdmlu ZworICogdGltZWQgb3V0LCBzaW5jZSB0aGUgdGltZW91dCBjb3VsZCBiZSBkdWUgdG8gcHJlZW1w dGlvbiBvciBzaW1pbGFyIGFuZAorICogd2UndmUgbmV2ZXIgaGFkIGEgY2hhbmNlIHRvIGNoZWNr IHRoZSBjb25kaXRpb24gYmVmb3JlIHRoZSB0aW1lb3V0LgorICovCisjZGVmaW5lIHJrX3dhaXRf Zm9yKENPTkQsIE1TKSAoeyBcCisJdW5zaWduZWQgbG9uZyB0aW1lb3V0X18gPSBqaWZmaWVzICsg bXNlY3NfdG9famlmZmllcyhNUykgKyAxOwlcCisJaW50IHJldF9fID0gMDsJCQkJCQkJXAorCXdo aWxlICghKENPTkQpKSB7CQkJCQkJXAorCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0 X18pKSB7CQkJXAorCQkJcmV0X18gPSAoQ09ORCkgPyAwIDogLUVUSU1FRE9VVDsJCVwKKwkJCWJy ZWFrOwkJCQkJCVwKKwkJfQkJCQkJCQlcCisJCXVzbGVlcF9yYW5nZSg1MCwgMTAwKTsJCQkJCVwK Kwl9CQkJCQkJCQlcCisJcmV0X187CQkJCQkJCQlcCit9KQorCisvKgorICogVGhlIFJvY2tjaGlw IHJrMzI4OCBpb21tdSB1c2VzIGEgMi1sZXZlbCBwYWdlIHRhYmxlLgorICogVGhlIGZpcnN0IGxl dmVsIGlzIHRoZSAiRGlyZWN0b3J5IFRhYmxlIiAoRFQpLgorICogVGhlIERUIGNvbnNpc3RzIG9m IDEwMjQgNC1ieXRlIERpcmVjdG9yeSBUYWJsZSBFbnRyaWVzIChEVEVzKSwgZWFjaCBwb2ludGlu ZworICogdG8gYSAiUGFnZSBUYWJsZSIuCisgKiBUaGUgc2Vjb25kIGxldmVsIGlzIHRoZSAxMDI0 IFBhZ2UgVGFibGVzIChQVCkuCisgKiBFYWNoIFBUIGNvbnNpc3RzIG9mIDEwMjQgNC1ieXRlIFBh Z2UgVGFibGUgRW50cmllcyAoUFRFcyksIGVhY2ggcG9pbnRpbmcgdG8KKyAqIGEgNCBLQiBwYWdl IG9mIHBoeXNpY2FsIG1lbW9yeS4KKyAqCisgKiBUaGUgRFQgYW5kIGVhY2ggUFQgZml0cyBpbiBh IHNpbmdsZSA0IEtCIHBhZ2UgKDQtYnl0ZXMgKiAxMDI0IGVudHJpZXMpLgorICogRWFjaCBpb21t dSBkZXZpY2UgaGFzIGEgTU1VX0RURV9BRERSIHJlZ2lzdGVyIHRoYXQgY29udGFpbnMgdGhlIHBo eXNpY2FsCisgKiBhZGRyZXNzIG9mIHRoZSBzdGFydCBvZiB0aGUgRFQgcGFnZS4KKyAqCisgKiBU aGUgc3RydWN0dXJlIG9mIHRoZSBwYWdlIHRhYmxlIGlzIGFzIGZvbGxvd3M6CisgKgorICogICAg ICAgICAgICAgICAgICAgRFQKKyAqIE1NVV9EVEVfQUREUiAtPiArLS0tLS0rCisgKiAgICAgICAg ICAgICAgICAgfCAgICAgfAorICogICAgICAgICAgICAgICAgICstLS0tLSsgICAgIFBUCisgKiAg ICAgICAgICAgICAgICAgfCBEVEUgfCAtPiArLS0tLS0rCisgKiAgICAgICAgICAgICAgICAgKy0t LS0tKyAgICB8ICAgICB8ICAgICBNZW1vcnkKKyAqICAgICAgICAgICAgICAgICB8ICAgICB8ICAg ICstLS0tLSsgICAgIFBhZ2UKKyAqICAgICAgICAgICAgICAgICB8ICAgICB8ICAgIHwgUFRFIHwg LT4gKy0tLS0tKworICogICAgICAgICAgICAgICAgICstLS0tLSsgICAgKy0tLS0tKyAgICB8ICAg ICB8CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8ICAgIHwgICAgIHwKKyAq ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgICAgfCAgICAgfAorICogICAgICAg ICAgICAgICAgICAgICAgICAgICAgKy0tLS0tKyAgICB8ICAgICB8CisgKiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwKKyAqICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgfCAgICAgfAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICArLS0tLS0rCisgKi8KKworLyoKKyAqIEVhY2ggRFRFIGhhcyBhIFBUIGFkZHJl c3MgYW5kIGEgdmFsaWQgYml0OgorICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0t LSstKworICogfCBQVCBhZGRyZXNzICAgICAgICAgIHwgUmVzZXJ2ZWQgIHxWfAorICogKy0tLS0t LS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstKworICogIDMxOjEyIC0gUFQgYWRkcmVzcyAo UFRzIGFsd2F5cyBzdGFydHMgb24gYSA0IEtCIGJvdW5kYXJ5KQorICogIDExOiAxIC0gUmVzZXJ2 ZWQKKyAqICAgICAgMCAtIDEgaWYgUFQgQCBQVCBhZGRyZXNzIGlzIHZhbGlkCisgKi8KKyNkZWZp bmUgUktfRFRFX1BUX0FERFJFU1NfTUFTSyAgICAweGZmZmZmMDAwCisjZGVmaW5lIFJLX0RURV9Q VF9WQUxJRCAgICAgICAgICAgQklUKDApCisKK3N0YXRpYyBpbmxpbmUgcGh5c19hZGRyX3Qgcmtf ZHRlX3B0X2FkZHJlc3ModTMyIGR0ZSkKK3sKKwlyZXR1cm4gKHBoeXNfYWRkcl90KWR0ZSAmIFJL X0RURV9QVF9BRERSRVNTX01BU0s7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBya19kdGVfaXNf cHRfdmFsaWQodTMyIGR0ZSkKK3sKKwlyZXR1cm4gZHRlICYgUktfRFRFX1BUX1ZBTElEOworfQor CitzdGF0aWMgdTMyIHJrX21rX2R0ZSh1MzIgKnB0KQoreworCXBoeXNfYWRkcl90IHB0X3BoeXMg PSB2aXJ0X3RvX3BoeXMocHQpOworCXJldHVybiAocHRfcGh5cyAmIFJLX0RURV9QVF9BRERSRVNT X01BU0spIHwgUktfRFRFX1BUX1ZBTElEOworfQorCisvKgorICogRWFjaCBQVEUgaGFzIGEgUGFn ZSBhZGRyZXNzLCBzb21lIGZsYWdzIGFuZCBhIHZhbGlkIGJpdDoKKyAqICstLS0tLS0tLS0tLS0t LS0tLS0tLS0rLS0tKy0tLS0tLS0rLSsKKyAqIHwgUGFnZSBhZGRyZXNzICAgICAgICB8UnN2fCBG bGFncyB8VnwKKyAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tKy0tLS0tLS0rLSsKKyAqICAz MToxMiAtIFBhZ2UgYWRkcmVzcyAoUGFnZXMgYWx3YXlzIHN0YXJ0IG9uIGEgNCBLQiBib3VuZGFy eSkKKyAqICAxMTogOSAtIFJlc2VydmVkCisgKiAgIDg6IDEgLSBGbGFncworICogICAgICA4IC0g UmVhZCBhbGxvY2F0ZSAtIGFsbG9jYXRlIGNhY2hlIHNwYWNlIG9uIHJlYWQgbWlzc2VzCisgKiAg ICAgIDcgLSBSZWFkIGNhY2hlIC0gZW5hYmxlIGNhY2hlICYgcHJlZmV0Y2ggb2YgZGF0YQorICog ICAgICA2IC0gV3JpdGUgYnVmZmVyIC0gZW5hYmxlIGRlbGF5aW5nIHdyaXRlcyBvbiB0aGVpciB3 YXkgdG8gbWVtb3J5CisgKiAgICAgIDUgLSBXcml0ZSBhbGxvY2F0ZSAtIGFsbG9jYXRlIGNhY2hl IHNwYWNlIG9uIHdyaXRlIG1pc3NlcworICogICAgICA0IC0gV3JpdGUgY2FjaGUgLSBkaWZmZXJl bnQgd3JpdGVzIGNhbiBiZSBtZXJnZWQgdG9nZXRoZXIKKyAqICAgICAgMyAtIE92ZXJyaWRlIGNh Y2hlIGF0dHJpYnV0ZXMKKyAqICAgICAgICAgIGlmIDEsIGJpdHMgNC04IGNvbnRyb2wgY2FjaGUg YXR0cmlidXRlcworICogICAgICAgICAgaWYgMCwgdGhlIHN5c3RlbSBidXMgZGVmYXVsdHMgYXJl IHVzZWQKKyAqICAgICAgMiAtIFdyaXRhYmxlCisgKiAgICAgIDEgLSBSZWFkYWJsZQorICogICAg ICAwIC0gMSBpZiBQYWdlIEAgUGFnZSBhZGRyZXNzIGlzIHZhbGlkCisgKi8KKyNkZWZpbmUgUktf UFRFX1BBR0VfQUREUkVTU19NQVNLICAweGZmZmZmMDAwCisjZGVmaW5lIFJLX1BURV9QQUdFX0ZM QUdTX01BU0sgICAgMHgwMDAwMDFmZQorI2RlZmluZSBSS19QVEVfUEFHRV9XUklUQUJMRSAgICAg IEJJVCgyKQorI2RlZmluZSBSS19QVEVfUEFHRV9SRUFEQUJMRSAgICAgIEJJVCgxKQorI2RlZmlu ZSBSS19QVEVfUEFHRV9WQUxJRCAgICAgICAgIEJJVCgwKQorCitzdGF0aWMgaW5saW5lIHBoeXNf YWRkcl90IHJrX3B0ZV9wYWdlX2FkZHJlc3ModTMyIHB0ZSkKK3sKKwlyZXR1cm4gKHBoeXNfYWRk cl90KXB0ZSAmIFJLX1BURV9QQUdFX0FERFJFU1NfTUFTSzsKK30KKworc3RhdGljIGlubGluZSBi b29sIHJrX3B0ZV9pc19wYWdlX3ZhbGlkKHUzMiBwdGUpCit7CisJcmV0dXJuIHB0ZSAmIFJLX1BU RV9QQUdFX1ZBTElEOworfQorCisvKiBUT0RPOiBzZXQgY2FjaGUgZmxhZ3MgcGVyIHByb3QgSU9N TVVfQ0FDSEUgKi8KK3N0YXRpYyB1MzIgcmtfbWtfcHRlKHBoeXNfYWRkcl90IHBhZ2UsIGludCBw cm90KQoreworCXUzMiBmbGFncyA9IDA7CisJZmxhZ3MgfD0gKHByb3QgJiBJT01NVV9SRUFEKSA/ IFJLX1BURV9QQUdFX1JFQURBQkxFIDogMDsKKwlmbGFncyB8PSAocHJvdCAmIElPTU1VX1dSSVRF KSA/IFJLX1BURV9QQUdFX1dSSVRBQkxFIDogMDsKKwlwYWdlICY9IFJLX1BURV9QQUdFX0FERFJF U1NfTUFTSzsKKwlyZXR1cm4gcGFnZSB8IGZsYWdzIHwgUktfUFRFX1BBR0VfVkFMSUQ7Cit9CisK K3N0YXRpYyB1MzIgcmtfbWtfcHRlX2ludmFsaWQodTMyIHB0ZSkKK3sKKwlyZXR1cm4gcHRlICYg flJLX1BURV9QQUdFX1ZBTElEOworfQorCisvKgorICogcmszMjg4IGlvdmEgKElPTU1VIFZpcnR1 YWwgQWRkcmVzcykgZm9ybWF0CisgKiAgMzEgICAgICAgMjIuMjEgICAgICAgMTIuMTEgICAgICAg ICAgMAorICogKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rCisgKiB8IERU RSBpbmRleCB8IFBURSBpbmRleCB8IFBhZ2Ugb2Zmc2V0IHwKKyAqICstLS0tLS0tLS0tLSstLS0t LS0tLS0tLSstLS0tLS0tLS0tLS0tKworICogIDMxOjIyIC0gRFRFIGluZGV4ICAgLSBpbmRleCBv ZiBEVEUgaW4gRFQKKyAqICAyMToxMiAtIFBURSBpbmRleCAgIC0gaW5kZXggb2YgUFRFIGluIFBU IEAgRFRFLnB0X2FkZHJlc3MKKyAqICAxMTogMCAtIFBhZ2Ugb2Zmc2V0IC0gb2Zmc2V0IGludG8g cGFnZSBAIFBURS5wYWdlX2FkZHJlc3MKKyAqLworI2RlZmluZSBSS19JT1ZBX0RURV9NQVNLICAg IDB4ZmZjMDAwMDAKKyNkZWZpbmUgUktfSU9WQV9EVEVfU0hJRlQgICAyMgorI2RlZmluZSBSS19J T1ZBX1BURV9NQVNLICAgIDB4MDAzZmYwMDAKKyNkZWZpbmUgUktfSU9WQV9QVEVfU0hJRlQgICAx MgorI2RlZmluZSBSS19JT1ZBX1BBR0VfTUFTSyAgIDB4MDAwMDBmZmYKKyNkZWZpbmUgUktfSU9W QV9QQUdFX1NISUZUICAwCisKK3N0YXRpYyB1MzIgcmtfaW92YV9kdGVfaW5kZXgoZG1hX2FkZHJf dCBpb3ZhKQoreworCXJldHVybiAodTMyKShpb3ZhICYgUktfSU9WQV9EVEVfTUFTSykgPj4gUktf SU9WQV9EVEVfU0hJRlQ7Cit9CisKK3N0YXRpYyB1MzIgcmtfaW92YV9wdGVfaW5kZXgoZG1hX2Fk ZHJfdCBpb3ZhKQoreworCXJldHVybiAodTMyKShpb3ZhICYgUktfSU9WQV9QVEVfTUFTSykgPj4g UktfSU9WQV9QVEVfU0hJRlQ7Cit9CisKK3N0YXRpYyB1MzIgcmtfaW92YV9wYWdlX29mZnNldChk bWFfYWRkcl90IGlvdmEpCit7CisJcmV0dXJuICh1MzIpKGlvdmEgJiBSS19JT1ZBX1BBR0VfTUFT SykgPj4gUktfSU9WQV9QQUdFX1NISUZUOworfQorCitzdGF0aWMgdTMyIHJrX2lvbW11X3JlYWQo c3RydWN0IHJrX2lvbW11ICppb21tdSwgdTMyIG9mZnNldCkKK3sKKwlyZXR1cm4gcmVhZGwoaW9t bXUtPmJhc2UgKyBvZmZzZXQpOworfQorCitzdGF0aWMgdm9pZCBya19pb21tdV93cml0ZShzdHJ1 Y3QgcmtfaW9tbXUgKmlvbW11LCB1MzIgb2Zmc2V0LCB1MzIgdmFsdWUpCit7CisJd3JpdGVsKHZh bHVlLCBpb21tdS0+YmFzZSArIG9mZnNldCk7Cit9CisKK3N0YXRpYyB2b2lkIHJrX2lvbW11X2Nv bW1hbmQoc3RydWN0IHJrX2lvbW11ICppb21tdSwgdTMyIGNvbW1hbmQpCit7CisJd3JpdGVsKGNv bW1hbmQsIGlvbW11LT5iYXNlICsgUktfTU1VX0NPTU1BTkQpOworfQorCitzdGF0aWMgdm9pZCBy a19pb21tdV96YXBfbGluZXMoc3RydWN0IHJrX2lvbW11ICppb21tdSwgZG1hX2FkZHJfdCBpb3Zh LAorCQkJICAgICAgIHNpemVfdCBzaXplKQoreworCWRtYV9hZGRyX3QgaW92YV9lbmQgPSBpb3Zh ICsgc2l6ZTsKKwkvKgorCSAqIFRPRE8oZGprdXJ0eik6IEZpZ3VyZSBvdXQgd2hlbiBpdCBpcyBt b3JlIGVmZmljaWVudCB0byBzaG9vdGRvd24gdGhlCisJICogZW50aXJlIGlvdGxiIHJhdGhlciB0 aGFuIGl0ZXJhdGUgb3ZlciBpbmRpdmlkdWFsIGlvdmFzLgorCSAqLworCWZvciAoOyBpb3ZhIDwg aW92YV9lbmQ7IGlvdmEgKz0gU1BBR0VfU0laRSkKKwkJcmtfaW9tbXVfd3JpdGUoaW9tbXUsIFJL X01NVV9aQVBfT05FX0xJTkUsIGlvdmEpOworfQorCitzdGF0aWMgYm9vbCBya19pb21tdV9pc19z dGFsbF9hY3RpdmUoc3RydWN0IHJrX2lvbW11ICppb21tdSkKK3sKKwlyZXR1cm4gcmtfaW9tbXVf cmVhZChpb21tdSwgUktfTU1VX1NUQVRVUykgJiBSS19NTVVfU1RBVFVTX1NUQUxMX0FDVElWRTsK K30KKworc3RhdGljIGJvb2wgcmtfaW9tbXVfaXNfcGFnaW5nX2VuYWJsZWQoc3RydWN0IHJrX2lv bW11ICppb21tdSkKK3sKKwlyZXR1cm4gcmtfaW9tbXVfcmVhZChpb21tdSwgUktfTU1VX1NUQVRV UykgJgorCQkJICAgICBSS19NTVVfU1RBVFVTX1BBR0lOR19FTkFCTEVEOworfQorCitzdGF0aWMg aW50IHJrX2lvbW11X2VuYWJsZV9zdGFsbChzdHJ1Y3QgcmtfaW9tbXUgKmlvbW11KQoreworCWlu dCByZXQ7CisKKwlpZiAocmtfaW9tbXVfaXNfc3RhbGxfYWN0aXZlKGlvbW11KSkKKwkJcmV0dXJu IDA7CisKKwkvKiBTdGFsbCBjYW4gb25seSBiZSBlbmFibGVkIGlmIHBhZ2luZyBpcyBlbmFibGVk ICovCisJaWYgKCFya19pb21tdV9pc19wYWdpbmdfZW5hYmxlZChpb21tdSkpCisJCXJldHVybiAw OworCisJcmtfaW9tbXVfY29tbWFuZChpb21tdSwgUktfTU1VX0NNRF9FTkFCTEVfU1RBTEwpOwor CisJcmV0ID0gcmtfd2FpdF9mb3IocmtfaW9tbXVfaXNfc3RhbGxfYWN0aXZlKGlvbW11KSwgMSk7 CisJaWYgKHJldCkKKwkJZGV2X2Vycihpb21tdS0+ZGV2LCAiRW5hYmxlIHN0YWxsIHJlcXVlc3Qg dGltZWQgb3V0LCBzdGF0dXM6ICUjMDh4XG4iLAorCQkJcmtfaW9tbXVfcmVhZChpb21tdSwgUktf TU1VX1NUQVRVUykpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBya19pb21tdV9k aXNhYmxlX3N0YWxsKHN0cnVjdCBya19pb21tdSAqaW9tbXUpCit7CisJaW50IHJldDsKKworCWlm ICghcmtfaW9tbXVfaXNfc3RhbGxfYWN0aXZlKGlvbW11KSkKKwkJcmV0dXJuIDA7CisKKwlya19p b21tdV9jb21tYW5kKGlvbW11LCBSS19NTVVfQ01EX0RJU0FCTEVfU1RBTEwpOworCisJcmV0ID0g cmtfd2FpdF9mb3IoIXJrX2lvbW11X2lzX3N0YWxsX2FjdGl2ZShpb21tdSksIDEpOworCWlmIChy ZXQpCisJCWRldl9lcnIoaW9tbXUtPmRldiwgIkRpc2FibGUgc3RhbGwgcmVxdWVzdCB0aW1lZCBv dXQsIHN0YXR1czogJSMwOHhcbiIsCisJCQlya19pb21tdV9yZWFkKGlvbW11LCBSS19NTVVfU1RB VFVTKSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHJrX2lvbW11X2VuYWJsZV9w YWdpbmcoc3RydWN0IHJrX2lvbW11ICppb21tdSkKK3sKKwlpbnQgcmV0OworCisJaWYgKHJrX2lv bW11X2lzX3BhZ2luZ19lbmFibGVkKGlvbW11KSkKKwkJcmV0dXJuIDA7CisKKwlya19pb21tdV9j b21tYW5kKGlvbW11LCBSS19NTVVfQ01EX0VOQUJMRV9QQUdJTkcpOworCisJcmV0ID0gcmtfd2Fp dF9mb3IocmtfaW9tbXVfaXNfcGFnaW5nX2VuYWJsZWQoaW9tbXUpLCAxKTsKKwlpZiAocmV0KQor CQlkZXZfZXJyKGlvbW11LT5kZXYsICJFbmFibGUgcGFnaW5nIHJlcXVlc3QgdGltZWQgb3V0LCBz dGF0dXM6ICUjMDh4XG4iLAorCQkJcmtfaW9tbXVfcmVhZChpb21tdSwgUktfTU1VX1NUQVRVUykp OworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBya19pb21tdV9kaXNhYmxlX3BhZ2lu ZyhzdHJ1Y3QgcmtfaW9tbXUgKmlvbW11KQoreworCWludCByZXQ7CisKKwlpZiAoIXJrX2lvbW11 X2lzX3BhZ2luZ19lbmFibGVkKGlvbW11KSkKKwkJcmV0dXJuIDA7CisKKwlya19pb21tdV9jb21t YW5kKGlvbW11LCBSS19NTVVfQ01EX0RJU0FCTEVfUEFHSU5HKTsKKworCXJldCA9IHJrX3dhaXRf Zm9yKCFya19pb21tdV9pc19wYWdpbmdfZW5hYmxlZChpb21tdSksIDEpOworCWlmIChyZXQpCisJ CWRldl9lcnIoaW9tbXUtPmRldiwgIkRpc2FibGUgcGFnaW5nIHJlcXVlc3QgdGltZWQgb3V0LCBz dGF0dXM6ICMlMDh4XG4iLAorCQkJcmtfaW9tbXVfcmVhZChpb21tdSwgUktfTU1VX1NUQVRVUykp OworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBya19pb21tdV9mb3JjZV9yZXNldChz dHJ1Y3QgcmtfaW9tbXUgKmlvbW11KQoreworCWludCByZXQ7CisJdTMyIGR0ZV9hZGRyOworCisJ LyoKKwkgKiBDaGVjayBpZiByZWdpc3RlciBEVEVfQUREUiBpcyB3b3JraW5nIGJ5IHdyaXRpbmcg RFRFX0FERFJfRFVNTVkKKwkgKiBhbmQgdmVyaWZ5aW5nIHRoYXQgdXBwZXIgNSBueWJibGVzIGFy ZSByZWFkIGJhY2suCisJICovCisJcmtfaW9tbXVfd3JpdGUoaW9tbXUsIFJLX01NVV9EVEVfQURE UiwgRFRFX0FERFJfRFVNTVkpOworCisJZHRlX2FkZHIgPSBya19pb21tdV9yZWFkKGlvbW11LCBS S19NTVVfRFRFX0FERFIpOworCWlmIChkdGVfYWRkciAhPSAoRFRFX0FERFJfRFVNTVkgJiBSS19E VEVfUFRfQUREUkVTU19NQVNLKSkgeworCQlkZXZfZXJyKGlvbW11LT5kZXYsICJFcnJvciBkdXJp bmcgcmF3IHJlc2V0LiBNTVVfRFRFX0FERFIgaXMgbm90IGZ1bmN0aW9uaW5nXG4iKTsKKwkJcmV0 dXJuIC1FRkFVTFQ7CisJfQorCisJcmtfaW9tbXVfY29tbWFuZChpb21tdSwgUktfTU1VX0NNRF9G T1JDRV9SRVNFVCk7CisKKwlyZXQgPSBya193YWl0X2Zvcihya19pb21tdV9yZWFkKGlvbW11LCBS S19NTVVfRFRFX0FERFIpID09IDB4MDAwMDAwMDAsCisJCQkgIEZPUkNFX1JFU0VUX1RJTUVPVVQp OworCWlmIChyZXQpCisJCWRldl9lcnIoaW9tbXUtPmRldiwgIkZPUkNFX1JFU0VUIGNvbW1hbmQg dGltZWQgb3V0XG4iKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGxvZ19pb3Zh KHN0cnVjdCBya19pb21tdSAqaW9tbXUsIGRtYV9hZGRyX3QgaW92YSkKK3sKKwl1MzIgZHRlX2lu ZGV4LCBwdGVfaW5kZXgsIHBhZ2Vfb2Zmc2V0OworCXUzMiBtbXVfZHRlX2FkZHI7CisJcGh5c19h ZGRyX3QgbW11X2R0ZV9hZGRyX3BoeXMsIGR0ZV9hZGRyX3BoeXM7CisJdTMyICpkdGVfYWRkcjsK Kwl1MzIgZHRlOworCXBoeXNfYWRkcl90IHB0ZV9hZGRyX3BoeXMgPSAwOworCXUzMiAqcHRlX2Fk ZHIgPSBOVUxMOworCXUzMiBwdGUgPSAwOworCXBoeXNfYWRkcl90IHBhZ2VfYWRkcl9waHlzID0g MDsKKwl1MzIgcGFnZV9mbGFncyA9IDA7CisKKwlkdGVfaW5kZXggPSBya19pb3ZhX2R0ZV9pbmRl eChpb3ZhKTsKKwlwdGVfaW5kZXggPSBya19pb3ZhX3B0ZV9pbmRleChpb3ZhKTsKKwlwYWdlX29m ZnNldCA9IHJrX2lvdmFfcGFnZV9vZmZzZXQoaW92YSk7CisKKwltbXVfZHRlX2FkZHIgPSBya19p b21tdV9yZWFkKGlvbW11LCBSS19NTVVfRFRFX0FERFIpOworCW1tdV9kdGVfYWRkcl9waHlzID0g KHBoeXNfYWRkcl90KW1tdV9kdGVfYWRkcjsKKworCWR0ZV9hZGRyX3BoeXMgPSBtbXVfZHRlX2Fk ZHJfcGh5cyArICg0ICogZHRlX2luZGV4KTsKKwlkdGVfYWRkciA9IHBoeXNfdG9fdmlydChkdGVf YWRkcl9waHlzKTsKKwlkdGUgPSAqZHRlX2FkZHI7CisKKwlpZiAoIXJrX2R0ZV9pc19wdF92YWxp ZChkdGUpKQorCQlnb3RvIHByaW50X2l0OworCisJcHRlX2FkZHJfcGh5cyA9IHJrX2R0ZV9wdF9h ZGRyZXNzKGR0ZSkgKyAocHRlX2luZGV4ICogNCk7CisJcHRlX2FkZHIgPSBwaHlzX3RvX3ZpcnQo cHRlX2FkZHJfcGh5cyk7CisJcHRlID0gKnB0ZV9hZGRyOworCisJaWYgKCFya19wdGVfaXNfcGFn ZV92YWxpZChwdGUpKQorCQlnb3RvIHByaW50X2l0OworCisJcGFnZV9hZGRyX3BoeXMgPSBya19w dGVfcGFnZV9hZGRyZXNzKHB0ZSkgKyBwYWdlX29mZnNldDsKKwlwYWdlX2ZsYWdzID0gcHRlICYg UktfUFRFX1BBR0VfRkxBR1NfTUFTSzsKKworcHJpbnRfaXQ6CisJZGV2X2Vycihpb21tdS0+ZGV2 LCAiaW92YSA9ICVwYWQ6IGR0ZV9pbmRleDogMHglMDN4IHB0ZV9pbmRleDogMHglMDN4IHBhZ2Vf b2Zmc2V0OiAweCUwM3hcbiIsCisJCSZpb3ZhLCBkdGVfaW5kZXgsIHB0ZV9pbmRleCwgcGFnZV9v ZmZzZXQpOworCWRldl9lcnIoaW9tbXUtPmRldiwgIm1tdV9kdGVfYWRkcjogJXBhIGR0ZUAlcGE6 ICUjMDh4IHZhbGlkOiAldSBwdGVAJXBhOiAlIzA4eCB2YWxpZDogJXUgcGFnZUAlcGEgZmxhZ3M6 ICUjMDN4XG4iLAorCQkmbW11X2R0ZV9hZGRyX3BoeXMsICZkdGVfYWRkcl9waHlzLCBkdGUsCisJ CXJrX2R0ZV9pc19wdF92YWxpZChkdGUpLCAmcHRlX2FkZHJfcGh5cywgcHRlLAorCQlya19wdGVf aXNfcGFnZV92YWxpZChwdGUpLCAmcGFnZV9hZGRyX3BoeXMsIHBhZ2VfZmxhZ3MpOworfQorCitz dGF0aWMgaXJxcmV0dXJuX3QgcmtfaW9tbXVfaXJxKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sK KwlzdHJ1Y3QgcmtfaW9tbXUgKmlvbW11ID0gZGV2X2lkOworCXUzMiBzdGF0dXM7CisJdTMyIGlu dF9zdGF0dXM7CisJZG1hX2FkZHJfdCBpb3ZhOworCisJaW50X3N0YXR1cyA9IHJrX2lvbW11X3Jl YWQoaW9tbXUsIFJLX01NVV9JTlRfU1RBVFVTKTsKKwlpZiAoaW50X3N0YXR1cyA9PSAwKQorCQly ZXR1cm4gSVJRX05PTkU7CisKKwlpb3ZhID0gcmtfaW9tbXVfcmVhZChpb21tdSwgUktfTU1VX1BB R0VfRkFVTFRfQUREUik7CisKKwlpZiAoaW50X3N0YXR1cyAmIFJLX01NVV9JUlFfUEFHRV9GQVVM VCkgeworCQlpbnQgZmxhZ3M7CisKKwkJc3RhdHVzID0gcmtfaW9tbXVfcmVhZChpb21tdSwgUktf TU1VX1NUQVRVUyk7CisJCWZsYWdzID0gKHN0YXR1cyAmIFJLX01NVV9TVEFUVVNfUEFHRV9GQVVM VF9JU19XUklURSkgPworCQkJCUlPTU1VX0ZBVUxUX1dSSVRFIDogSU9NTVVfRkFVTFRfUkVBRDsK KworCQlkZXZfZXJyKGlvbW11LT5kZXYsICJQYWdlIGZhdWx0IGF0ICVwYWQgb2YgdHlwZSAlc1xu IiwKKwkJCSZpb3ZhLAorCQkJKGZsYWdzID09IElPTU1VX0ZBVUxUX1dSSVRFKSA/ICJ3cml0ZSIg OiAicmVhZCIpOworCisJCWxvZ19pb3ZhKGlvbW11LCBpb3ZhKTsKKworCQkvKgorCQkgKiBSZXBv cnQgcGFnZSBmYXVsdCB0byBhbnkgaW5zdGFsbGVkIGhhbmRsZXJzLgorCQkgKiBJZ25vcmUgdGhl IHJldHVybiBjb2RlLCB0aG91Z2gsIHNpbmNlIHdlIGFsd2F5cyB6YXAgY2FjaGUKKwkJICogYW5k IGNsZWFyIHRoZSBwYWdlIGZhdWx0IGFueXdheS4KKwkJICovCisJCWlmIChpb21tdS0+ZG9tYWlu KQorCQkJcmVwb3J0X2lvbW11X2ZhdWx0KGlvbW11LT5kb21haW4sIGlvbW11LT5kZXYsIGlvdmEs CisJCQkJCSAgIGZsYWdzKTsKKwkJZWxzZQorCQkJZGV2X2Vycihpb21tdS0+ZGV2LCAiUGFnZSBm YXVsdCB3aGlsZSBpb21tdSBub3QgYXR0YWNoZWQgdG8gZG9tYWluP1xuIik7CisKKwkJcmtfaW9t bXVfY29tbWFuZChpb21tdSwgUktfTU1VX0NNRF9aQVBfQ0FDSEUpOworCQlya19pb21tdV9jb21t YW5kKGlvbW11LCBSS19NTVVfQ01EX1BBR0VfRkFVTFRfRE9ORSk7CisJfQorCisJaWYgKGludF9z dGF0dXMgJiBSS19NTVVfSVJRX0JVU19FUlJPUikKKwkJZGV2X2Vycihpb21tdS0+ZGV2LCAiQlVT X0VSUk9SIG9jY3VycmVkIGF0ICVwYWRcbiIsICZpb3ZhKTsKKworCWlmIChpbnRfc3RhdHVzICYg flJLX01NVV9JUlFfTUFTSykKKwkJZGV2X2Vycihpb21tdS0+ZGV2LCAidW5leHBlY3RlZCBpbnRf c3RhdHVzOiAlIzA4eFxuIiwKKwkJCWludF9zdGF0dXMpOworCisJcmtfaW9tbXVfd3JpdGUoaW9t bXUsIFJLX01NVV9JTlRfQ0xFQVIsIGludF9zdGF0dXMpOworCisJcmV0dXJuIElSUV9IQU5ETEVE OworfQorCitzdGF0aWMgcGh5c19hZGRyX3QgcmtfaW9tbXVfaW92YV90b19waHlzKHN0cnVjdCBp b21tdV9kb21haW4gKmRvbWFpbiwKKwkJCQkJIGRtYV9hZGRyX3QgaW92YSkKK3sKKwlzdHJ1Y3Qg cmtfaW9tbXVfZG9tYWluICpya19kb21haW4gPSBkb21haW4tPnByaXY7CisJdW5zaWduZWQgbG9u ZyBmbGFnczsKKwlwaHlzX2FkZHJfdCBwdF9waHlzLCBwaHlzID0gMDsKKwl1MzIgZHRlLCBwdGU7 CisJdTMyICpwYWdlX3RhYmxlOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnJrX2RvbWFpbi0+ZHRf bG9jaywgZmxhZ3MpOworCisJZHRlID0gcmtfZG9tYWluLT5kdFtya19pb3ZhX2R0ZV9pbmRleChp b3ZhKV07CisJaWYgKCFya19kdGVfaXNfcHRfdmFsaWQoZHRlKSkKKwkJZ290byBvdXQ7CisKKwlw dF9waHlzID0gcmtfZHRlX3B0X2FkZHJlc3MoZHRlKTsKKwlwYWdlX3RhYmxlID0gKHUzMiAqKXBo eXNfdG9fdmlydChwdF9waHlzKTsKKwlwdGUgPSBwYWdlX3RhYmxlW3JrX2lvdmFfcHRlX2luZGV4 KGlvdmEpXTsKKwlpZiAoIXJrX3B0ZV9pc19wYWdlX3ZhbGlkKHB0ZSkpCisJCWdvdG8gb3V0Owor CisJcGh5cyA9IHJrX3B0ZV9wYWdlX2FkZHJlc3MocHRlKSArIHJrX2lvdmFfcGFnZV9vZmZzZXQo aW92YSk7CitvdXQ6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcmtfZG9tYWluLT5kdF9sb2Nr LCBmbGFncyk7CisKKwlyZXR1cm4gcGh5czsKK30KKworc3RhdGljIHZvaWQgcmtfaW9tbXVfemFw X2lvdmEoc3RydWN0IHJrX2lvbW11X2RvbWFpbiAqcmtfZG9tYWluLAorCQkJICAgICAgZG1hX2Fk ZHJfdCBpb3ZhLCBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7CisJdW5z aWduZWQgbG9uZyBmbGFnczsKKworCS8qIHNob290ZG93biB0aGVzZSBpb3ZhIGZyb20gYWxsIGlv bW11cyB1c2luZyB0aGlzIGRvbWFpbiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZya19kb21haW4t PmlvbW11c19sb2NrLCBmbGFncyk7CisJbGlzdF9mb3JfZWFjaChwb3MsICZya19kb21haW4tPmlv bW11cykgeworCQlzdHJ1Y3QgcmtfaW9tbXUgKmlvbW11OworCQlpb21tdSA9IGxpc3RfZW50cnko cG9zLCBzdHJ1Y3QgcmtfaW9tbXUsIG5vZGUpOworCQlya19pb21tdV96YXBfbGluZXMoaW9tbXUs IGlvdmEsIHNpemUpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZya19kb21haW4tPmlv bW11c19sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB1MzIgKnJrX2R0ZV9nZXRfcGFnZV90YWJs ZShzdHJ1Y3QgcmtfaW9tbXVfZG9tYWluICpya19kb21haW4sCisJCQkJICBkbWFfYWRkcl90IGlv dmEpCit7CisJdTMyICpwYWdlX3RhYmxlLCAqZHRlX2FkZHI7CisJdTMyIGR0ZTsKKwlwaHlzX2Fk ZHJfdCBwdF9waHlzOworCisJYXNzZXJ0X3NwaW5fbG9ja2VkKCZya19kb21haW4tPmR0X2xvY2sp OworCisJZHRlX2FkZHIgPSAmcmtfZG9tYWluLT5kdFtya19pb3ZhX2R0ZV9pbmRleChpb3ZhKV07 CisJZHRlID0gKmR0ZV9hZGRyOworCWlmIChya19kdGVfaXNfcHRfdmFsaWQoZHRlKSkKKwkJZ290 byBkb25lOworCisJcGFnZV90YWJsZSA9ICh1MzIgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0FUT01J QyB8IEdGUF9ETUEzMik7CisJaWYgKCFwYWdlX3RhYmxlKQorCQlyZXR1cm4gRVJSX1BUUigtRU5P TUVNKTsKKworCWR0ZSA9IHJrX21rX2R0ZShwYWdlX3RhYmxlKTsKKwkqZHRlX2FkZHIgPSBkdGU7 CisKKwlya190YWJsZV9mbHVzaChwYWdlX3RhYmxlLCBOVU1fUFRfRU5UUklFUyk7CisJcmtfdGFi bGVfZmx1c2goZHRlX2FkZHIsIDEpOworCisJLyoKKwkgKiBaYXAgdGhlIGZpcnN0IGlvdmEgb2Yg bmV3bHkgYWxsb2NhdGVkIHBhZ2UgdGFibGUgc28gaW9tbXUgZXZpY3RzCisJICogb2xkIGNhY2hl ZCB2YWx1ZSBvZiBuZXcgZHRlIGZyb20gdGhlIGlvdGxiLgorCSAqLworCXJrX2lvbW11X3phcF9p b3ZhKHJrX2RvbWFpbiwgaW92YSwgU1BBR0VfU0laRSk7CisKK2RvbmU6CisJcHRfcGh5cyA9IHJr X2R0ZV9wdF9hZGRyZXNzKGR0ZSk7CisJcmV0dXJuICh1MzIgKilwaHlzX3RvX3ZpcnQocHRfcGh5 cyk7Cit9CisKK3N0YXRpYyBzaXplX3QgcmtfaW9tbXVfdW5tYXBfaW92YShzdHJ1Y3QgcmtfaW9t bXVfZG9tYWluICpya19kb21haW4sCisJCQkJICB1MzIgKnB0ZV9hZGRyLCBkbWFfYWRkcl90IGlv dmEsIHNpemVfdCBzaXplKQoreworCXVuc2lnbmVkIGludCBwdGVfY291bnQ7CisJdW5zaWduZWQg aW50IHB0ZV90b3RhbCA9IHNpemUgLyBTUEFHRV9TSVpFOworCisJYXNzZXJ0X3NwaW5fbG9ja2Vk KCZya19kb21haW4tPmR0X2xvY2spOworCisJZm9yIChwdGVfY291bnQgPSAwOyBwdGVfY291bnQg PCBwdGVfdG90YWw7IHB0ZV9jb3VudCsrKSB7CisJCXUzMiBwdGUgPSBwdGVfYWRkcltwdGVfY291 bnRdOworCQlpZiAoIXJrX3B0ZV9pc19wYWdlX3ZhbGlkKHB0ZSkpCisJCQlicmVhazsKKworCQlw dGVfYWRkcltwdGVfY291bnRdID0gcmtfbWtfcHRlX2ludmFsaWQocHRlKTsKKwl9CisKKwlya190 YWJsZV9mbHVzaChwdGVfYWRkciwgcHRlX2NvdW50KTsKKworCXJldHVybiBwdGVfY291bnQgKiBT UEFHRV9TSVpFOworfQorCitzdGF0aWMgaW50IHJrX2lvbW11X21hcF9pb3ZhKHN0cnVjdCBya19p b21tdV9kb21haW4gKnJrX2RvbWFpbiwgdTMyICpwdGVfYWRkciwKKwkJCSAgICAgZG1hX2FkZHJf dCBpb3ZhLCBwaHlzX2FkZHJfdCBwYWRkciwgc2l6ZV90IHNpemUsCisJCQkgICAgIGludCBwcm90 KQoreworCXVuc2lnbmVkIGludCBwdGVfY291bnQ7CisJdW5zaWduZWQgaW50IHB0ZV90b3RhbCA9 IHNpemUgLyBTUEFHRV9TSVpFOworCXBoeXNfYWRkcl90IHBhZ2VfcGh5czsKKworCWFzc2VydF9z cGluX2xvY2tlZCgmcmtfZG9tYWluLT5kdF9sb2NrKTsKKworCWZvciAocHRlX2NvdW50ID0gMDsg cHRlX2NvdW50IDwgcHRlX3RvdGFsOyBwdGVfY291bnQrKykgeworCQl1MzIgcHRlID0gcHRlX2Fk ZHJbcHRlX2NvdW50XTsKKworCQlpZiAocmtfcHRlX2lzX3BhZ2VfdmFsaWQocHRlKSkKKwkJCWdv dG8gdW53aW5kOworCisJCXB0ZV9hZGRyW3B0ZV9jb3VudF0gPSBya19ta19wdGUocGFkZHIsIHBy b3QpOworCisJCXBhZGRyICs9IFNQQUdFX1NJWkU7CisJfQorCisJcmtfdGFibGVfZmx1c2gocHRl X2FkZHIsIHB0ZV9jb3VudCk7CisKKwlyZXR1cm4gMDsKK3Vud2luZDoKKwkvKiBVbm1hcCB0aGUg cmFuZ2Ugb2YgaW92YXMgdGhhdCB3ZSBqdXN0IG1hcHBlZCAqLworCXJrX2lvbW11X3VubWFwX2lv dmEocmtfZG9tYWluLCBwdGVfYWRkciwgaW92YSwgcHRlX2NvdW50ICogU1BBR0VfU0laRSk7CisK Kwlpb3ZhICs9IHB0ZV9jb3VudCAqIFNQQUdFX1NJWkU7CisJcGFnZV9waHlzID0gcmtfcHRlX3Bh Z2VfYWRkcmVzcyhwdGVfYWRkcltwdGVfY291bnRdKTsKKwlwcl9lcnIoImlvdmE6ICVwYWQgYWxy ZWFkeSBtYXBwZWQgdG8gJXBhIGNhbm5vdCByZW1hcCB0byBwaHlzOiAlcGEgcHJvdDolI3hcbiIs CisJICAgICAgICZpb3ZhLCAmcGFnZV9waHlzLCAmcGFkZHIsIHByb3QpOworCisJcmV0dXJuIC1F QUREUklOVVNFOworfQorCitzdGF0aWMgaW50IHJrX2lvbW11X21hcChzdHJ1Y3QgaW9tbXVfZG9t YWluICpkb21haW4sIHVuc2lnbmVkIGxvbmcgX2lvdmEsCisJCQlwaHlzX2FkZHJfdCBwYWRkciwg c2l6ZV90IHNpemUsIGludCBwcm90KQoreworCXN0cnVjdCBya19pb21tdV9kb21haW4gKnJrX2Rv bWFpbiA9IGRvbWFpbi0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWRtYV9hZGRyX3Qg aW92YSA9IChkbWFfYWRkcl90KV9pb3ZhOworCXUzMiAqcGFnZV90YWJsZSwgKnB0ZV9hZGRyOwor CWludCByZXQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcmtfZG9tYWluLT5kdF9sb2NrLCBmbGFn cyk7CisKKwkvKgorCSAqIHBnc2l6ZV9iaXRtYXAgc3BlY2lmaWVzIGlvdmEgc2l6ZXMgdGhhdCBm aXQgaW4gb25lIHBhZ2UgdGFibGUKKwkgKiAoMTAyNCA0LUtpQiBwYWdlcyA9IDQgTWlCKS4KKwkg KiBTbywgc2l6ZSB3aWxsIGFsd2F5cyBiZSA0MDk2IDw9IHNpemUgPD0gNDE5NDMwNC4KKwkgKiBT aW5jZSBpb21tdV9tYXAoKSBndWFyYW50ZWVzIHRoYXQgYm90aCBpb3ZhIGFuZCBzaXplIHdpbGwg YmUKKwkgKiBhbGlnbmVkLCB3ZSB3aWxsIGFsd2F5cyBvbmx5IGJlIG1hcHBpbmcgZnJvbSBhIHNp bmdsZSBkdGUgaGVyZS4KKwkgKi8KKwlwYWdlX3RhYmxlID0gcmtfZHRlX2dldF9wYWdlX3RhYmxl KHJrX2RvbWFpbiwgaW92YSk7CisJaWYgKElTX0VSUihwYWdlX3RhYmxlKSkgeworCQlzcGluX3Vu bG9ja19pcnFyZXN0b3JlKCZya19kb21haW4tPmR0X2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIFBU Ul9FUlIocGFnZV90YWJsZSk7CisJfQorCisJcHRlX2FkZHIgPSAmcGFnZV90YWJsZVtya19pb3Zh X3B0ZV9pbmRleChpb3ZhKV07CisJcmV0ID0gcmtfaW9tbXVfbWFwX2lvdmEocmtfZG9tYWluLCBw dGVfYWRkciwgaW92YSwgcGFkZHIsIHNpemUsIHByb3QpOworCXNwaW5fdW5sb2NrX2lycXJlc3Rv cmUoJnJrX2RvbWFpbi0+ZHRfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKworc3Rh dGljIHNpemVfdCBya19pb21tdV91bm1hcChzdHJ1Y3QgaW9tbXVfZG9tYWluICpkb21haW4sIHVu c2lnbmVkIGxvbmcgX2lvdmEsCisJCQkgICAgIHNpemVfdCBzaXplKQoreworCXN0cnVjdCBya19p b21tdV9kb21haW4gKnJrX2RvbWFpbiA9IGRvbWFpbi0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIGZs YWdzOworCWRtYV9hZGRyX3QgaW92YSA9IChkbWFfYWRkcl90KV9pb3ZhOworCXBoeXNfYWRkcl90 IHB0X3BoeXM7CisJdTMyIGR0ZTsKKwl1MzIgKnB0ZV9hZGRyOworCXNpemVfdCB1bm1hcF9zaXpl OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnJrX2RvbWFpbi0+ZHRfbG9jaywgZmxhZ3MpOworCisJ LyoKKwkgKiBwZ3NpemVfYml0bWFwIHNwZWNpZmllcyBpb3ZhIHNpemVzIHRoYXQgZml0IGluIG9u ZSBwYWdlIHRhYmxlCisJICogKDEwMjQgNC1LaUIgcGFnZXMgPSA0IE1pQikuCisJICogU28sIHNp emUgd2lsbCBhbHdheXMgYmUgNDA5NiA8PSBzaXplIDw9IDQxOTQzMDQuCisJICogU2luY2UgaW9t bXVfdW5tYXAoKSBndWFyYW50ZWVzIHRoYXQgYm90aCBpb3ZhIGFuZCBzaXplIHdpbGwgYmUKKwkg KiBhbGlnbmVkLCB3ZSB3aWxsIGFsd2F5cyBvbmx5IGJlIHVubWFwcGluZyBmcm9tIGEgc2luZ2xl IGR0ZSBoZXJlLgorCSAqLworCWR0ZSA9IHJrX2RvbWFpbi0+ZHRbcmtfaW92YV9kdGVfaW5kZXgo aW92YSldOworCS8qIEp1c3QgcmV0dXJuIDAgaWYgaW92YSBpcyB1bm1hcHBlZCAqLworCWlmICgh cmtfZHRlX2lzX3B0X3ZhbGlkKGR0ZSkpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcmtf ZG9tYWluLT5kdF9sb2NrLCBmbGFncyk7CisJCXJldHVybiAwOworCX0KKworCXB0X3BoeXMgPSBy a19kdGVfcHRfYWRkcmVzcyhkdGUpOworCXB0ZV9hZGRyID0gKHUzMiAqKXBoeXNfdG9fdmlydChw dF9waHlzKSArIHJrX2lvdmFfcHRlX2luZGV4KGlvdmEpOworCXVubWFwX3NpemUgPSBya19pb21t dV91bm1hcF9pb3ZhKHJrX2RvbWFpbiwgcHRlX2FkZHIsIGlvdmEsIHNpemUpOworCisJc3Bpbl91 bmxvY2tfaXJxcmVzdG9yZSgmcmtfZG9tYWluLT5kdF9sb2NrLCBmbGFncyk7CisKKwkvKiBTaG9v dGRvd24gaW90bGIgZW50cmllcyBmb3IgaW92YSByYW5nZSB0aGF0IHdhcyBqdXN0IHVubWFwcGVk ICovCisJcmtfaW9tbXVfemFwX2lvdmEocmtfZG9tYWluLCBpb3ZhLCB1bm1hcF9zaXplKTsKKwor CXJldHVybiB1bm1hcF9zaXplOworfQorCitzdGF0aWMgaW50IHJrX2lvbW11X2F0dGFjaF9kZXZp Y2Uoc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tYWluLAorCQkJCSAgc3RydWN0IGRldmljZSAqZGV2 KQoreworCXN0cnVjdCBya19pb21tdSAqaW9tbXUgPSBkZXZfZ2V0X2RydmRhdGEoZGV2LT5hcmNo ZGF0YS5pb21tdSk7CisJc3RydWN0IHJrX2lvbW11X2RvbWFpbiAqcmtfZG9tYWluID0gZG9tYWlu LT5wcml2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldDsKKwlwaHlzX2FkZHJfdCBk dGVfYWRkcjsKKworCS8qCisJICogQWxsb3cgJ3ZpcnR1YWwgZGV2aWNlcycgKGUuZy4sIGRybSkg dG8gYXR0YWNoIHRvIGRvbWFpbi4KKwkgKiBTdWNoIGEgZGV2aWNlIGhhcyBhIE5VTEwgYXJjaGRh dGEuaW9tbXUuCisJICovCisJaWYgKCFpb21tdSkKKwkJcmV0dXJuIDA7CisKKwlyZXQgPSBya19p b21tdV9lbmFibGVfc3RhbGwoaW9tbXUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwly ZXQgPSBya19pb21tdV9mb3JjZV9yZXNldChpb21tdSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJl dDsKKworCWlvbW11LT5kb21haW4gPSBkb21haW47CisKKwlyZXQgPSBkZXZtX3JlcXVlc3RfaXJx KGRldiwgaW9tbXUtPmlycSwgcmtfaW9tbXVfaXJxLAorCQkJICAgICAgIElSUUZfU0hBUkVELCBk ZXZfbmFtZShkZXYpLCBpb21tdSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWR0ZV9h ZGRyID0gdmlydF90b19waHlzKHJrX2RvbWFpbi0+ZHQpOworCXJrX2lvbW11X3dyaXRlKGlvbW11 LCBSS19NTVVfRFRFX0FERFIsIGR0ZV9hZGRyKTsKKwlya19pb21tdV9jb21tYW5kKGlvbW11LCBS S19NTVVfQ01EX1pBUF9DQUNIRSk7CisJcmtfaW9tbXVfd3JpdGUoaW9tbXUsIFJLX01NVV9JTlRf TUFTSywgUktfTU1VX0lSUV9NQVNLKTsKKworCXJldCA9IHJrX2lvbW11X2VuYWJsZV9wYWdpbmco aW9tbXUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgm cmtfZG9tYWluLT5pb21tdXNfbG9jaywgZmxhZ3MpOworCWxpc3RfYWRkX3RhaWwoJmlvbW11LT5u b2RlLCAmcmtfZG9tYWluLT5pb21tdXMpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJrX2Rv bWFpbi0+aW9tbXVzX2xvY2ssIGZsYWdzKTsKKworCWRldl9pbmZvKGRldiwgIkF0dGFjaGVkIHRv IGlvbW11IGRvbWFpblxuIik7CisKKwlya19pb21tdV9kaXNhYmxlX3N0YWxsKGlvbW11KTsKKwor CXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBya19pb21tdV9kZXRhY2hfZGV2aWNlKHN0cnVj dCBpb21tdV9kb21haW4gKmRvbWFpbiwKKwkJCQkgICBzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJ c3RydWN0IHJrX2lvbW11ICppb21tdSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYtPmFyY2hkYXRhLmlv bW11KTsKKwlzdHJ1Y3QgcmtfaW9tbXVfZG9tYWluICpya19kb21haW4gPSBkb21haW4tPnByaXY7 CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIEFsbG93ICd2aXJ0dWFsIGRldmljZXMnIChl ZyBkcm0pIHRvIGRldGFjaCBmcm9tIGRvbWFpbiAqLworCWlmICghaW9tbXUpCisJCXJldHVybjsK KworCWlvbW11LT5kb21haW4gPSBOVUxMOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnJrX2RvbWFp bi0+aW9tbXVzX2xvY2ssIGZsYWdzKTsKKwlsaXN0X2RlbF9pbml0KCZpb21tdS0+bm9kZSk7CisJ c3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcmtfZG9tYWluLT5pb21tdXNfbG9jaywgZmxhZ3MpOwor CisJZGV2bV9mcmVlX2lycShkZXYsIGlvbW11LT5pcnEsIGlvbW11KTsKKworCWlvbW11LT5kb21h aW4gPSBOVUxMOworCisJLyogSWdub3JlIGVycm9yIHdoaWxlIGRpc2FibGluZywganVzdCBrZWVw IGdvaW5nICovCisJcmtfaW9tbXVfZW5hYmxlX3N0YWxsKGlvbW11KTsKKwlya19pb21tdV9kaXNh YmxlX3BhZ2luZyhpb21tdSk7CisJcmtfaW9tbXVfd3JpdGUoaW9tbXUsIFJLX01NVV9JTlRfTUFT SywgMCk7CisJcmtfaW9tbXVfd3JpdGUoaW9tbXUsIFJLX01NVV9EVEVfQUREUiwgMCk7CisJcmtf aW9tbXVfZGlzYWJsZV9zdGFsbChpb21tdSk7CisKKwlkZXZfaW5mbyhkZXYsICJEZXRhY2hlZCBm cm9tIGlvbW11IGRvbWFpblxuIik7Cit9CisKK3N0YXRpYyBpbnQgcmtfaW9tbXVfZG9tYWluX2lu aXQoc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tYWluKQoreworCXN0cnVjdCBya19pb21tdV9kb21h aW4gKnJrX2RvbWFpbjsKKworCXJrX2RvbWFpbiA9IGt6YWxsb2Moc2l6ZW9mKCpya19kb21haW4p LCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJrX2RvbWFpbikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkv KgorCSAqIHJrMzJ4eCBpb21tdXMgdXNlIGEgMiBsZXZlbCBwYWdldGFibGUuCisJICogRWFjaCBs ZXZlbDEgKGR0KSBhbmQgbGV2ZWwyIChwdCkgdGFibGUgaGFzIDEwMjQgNC1ieXRlIGVudHJpZXMu CisJICogQWxsb2NhdGUgb25lIDQgS2lCIHBhZ2UgZm9yIGVhY2ggdGFibGUuCisJICovCisJcmtf ZG9tYWluLT5kdCA9ICh1MzIgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCB8IEdGUF9ETUEz Mik7CisJaWYgKCFya19kb21haW4tPmR0KQorCQlnb3RvIGVycl9kdDsKKworCXJrX3RhYmxlX2Zs dXNoKHJrX2RvbWFpbi0+ZHQsIE5VTV9EVF9FTlRSSUVTKTsKKworCXNwaW5fbG9ja19pbml0KCZy a19kb21haW4tPmlvbW11c19sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmcmtfZG9tYWluLT5kdF9s b2NrKTsKKwlJTklUX0xJU1RfSEVBRCgmcmtfZG9tYWluLT5pb21tdXMpOworCisJZG9tYWluLT5w cml2ID0gcmtfZG9tYWluOworCisJcmV0dXJuIDA7CitlcnJfZHQ6CisJa2ZyZWUocmtfZG9tYWlu KTsKKwlyZXR1cm4gLUVOT01FTTsKK30KKworc3RhdGljIHZvaWQgcmtfaW9tbXVfZG9tYWluX2Rl c3Ryb3koc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tYWluKQoreworCXN0cnVjdCBya19pb21tdV9k b21haW4gKnJrX2RvbWFpbiA9IGRvbWFpbi0+cHJpdjsKKwlpbnQgaTsKKworCVdBUk5fT04oIWxp c3RfZW1wdHkoJnJrX2RvbWFpbi0+aW9tbXVzKSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0RU X0VOVFJJRVM7IGkrKykgeworCQl1MzIgZHRlID0gcmtfZG9tYWluLT5kdFtpXTsKKwkJaWYgKHJr X2R0ZV9pc19wdF92YWxpZChkdGUpKSB7CisJCQlwaHlzX2FkZHJfdCBwdF9waHlzID0gcmtfZHRl X3B0X2FkZHJlc3MoZHRlKTsKKwkJCXUzMiAqcGFnZV90YWJsZSA9IHBoeXNfdG9fdmlydChwdF9w aHlzKTsKKwkJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylwYWdlX3RhYmxlKTsKKwkJfQorCX0K KworCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylya19kb21haW4tPmR0KTsKKwlrZnJlZShkb21h aW4tPnByaXYpOworCWRvbWFpbi0+cHJpdiA9IE5VTEw7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1 Y3QgaW9tbXVfb3BzIHJrX2lvbW11X29wcyA9IHsKKwkuZG9tYWluX2luaXQgPSBya19pb21tdV9k b21haW5faW5pdCwKKwkuZG9tYWluX2Rlc3Ryb3kgPSBya19pb21tdV9kb21haW5fZGVzdHJveSwK KwkuYXR0YWNoX2RldiA9IHJrX2lvbW11X2F0dGFjaF9kZXZpY2UsCisJLmRldGFjaF9kZXYgPSBy a19pb21tdV9kZXRhY2hfZGV2aWNlLAorCS5tYXAgPSBya19pb21tdV9tYXAsCisJLnVubWFwID0g cmtfaW9tbXVfdW5tYXAsCisJLmlvdmFfdG9fcGh5cyA9IHJrX2lvbW11X2lvdmFfdG9fcGh5cywK KwkucGdzaXplX2JpdG1hcCA9IFJLX0lPTU1VX1BHU0laRV9CSVRNQVAsCit9OworCitzdGF0aWMg aW50IHJrX2lvbW11X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3Ry dWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKwlzdHJ1Y3QgcmtfaW9tbXUgKmlvbW11Owor CXN0cnVjdCByZXNvdXJjZSAqcmVzOworCisJaW9tbXUgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXpl b2YoKmlvbW11KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpb21tdSkKKwkJcmV0dXJuIC1FTk9NRU07 CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBpb21tdSk7CisJaW9tbXUtPmRldiA9IGRl djsKKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwg MCk7CisJaW9tbXUtPmJhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVz KTsKKwlpZiAoSVNfRVJSKGlvbW11LT5iYXNlKSkKKwkJcmV0dXJuIFBUUl9FUlIoaW9tbXUtPmJh c2UpOworCisJaW9tbXUtPmlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJaWYgKGlv bW11LT5pcnEgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIGdldCBJUlEsICVkXG4i LCBpb21tdS0+aXJxKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwor c3RhdGljIGludCBya19pb21tdV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikK K3sKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19PRgorc3RhdGljIGNvbnN0IHN0cnVj dCBvZl9kZXZpY2VfaWQgcmtfaW9tbXVfZHRfaWRzW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJy b2NrY2hpcCxpb21tdSIgfSwKKwl7IC8qIHNlbnRpbmVsICovIH0KK307CitNT0RVTEVfREVWSUNF X1RBQkxFKG9mLCBya19pb21tdV9kdF9pZHMpOworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgcGxh dGZvcm1fZHJpdmVyIHJrX2lvbW11X2RyaXZlciA9IHsKKwkucHJvYmUgPSBya19pb21tdV9wcm9i ZSwKKwkucmVtb3ZlID0gcmtfaW9tbXVfcmVtb3ZlLAorCS5kcml2ZXIgPSB7CisJCSAgIC5uYW1l ID0gInJrX2lvbW11IiwKKwkJICAgLm93bmVyID0gVEhJU19NT0RVTEUsCisJCSAgIC5vZl9tYXRj aF90YWJsZSA9IG9mX21hdGNoX3B0cihya19pb21tdV9kdF9pZHMpLAorCX0sCit9OworCitzdGF0 aWMgaW50IF9faW5pdCBya19pb21tdV9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCXJldCA9 IGJ1c19zZXRfaW9tbXUoJnBsYXRmb3JtX2J1c190eXBlLCAmcmtfaW9tbXVfb3BzKTsKKwlpZiAo cmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigm cmtfaW9tbXVfZHJpdmVyKTsKK30KK3N0YXRpYyB2b2lkIF9fZXhpdCBya19pb21tdV9leGl0KHZv aWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnJrX2lvbW11X2RyaXZlcik7Cit9 CisKK3N1YnN5c19pbml0Y2FsbChya19pb21tdV9pbml0KTsKK21vZHVsZV9leGl0KHJrX2lvbW11 X2V4aXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIklPTU1VIEFQSSBmb3IgUm9ja2NoaXAiKTsK K01PRFVMRV9BVVRIT1IoIlNpbW9uIFh1ZSA8eHhtQHJvY2stY2hpcHMuY29tPiBhbmQgRGFuaWVs IEt1cnR6IDxkamt1cnR6QGNocm9taXVtLm9yZz4iKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06 cm9ja2NoaXAtaW9tbXUiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKLS0gCjIuMS4wLnJj Mi4yMDYuZ2VkYjAzZTUKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fCmlvbW11IG1haWxpbmcgbGlzdAppb21tdUBsaXN0cy5saW51eC1mb3VuZGF0aW9uLm9y ZwpodHRwczovL2xpc3RzLmxpbnV4Zm91bmRhdGlvbi5vcmcvbWFpbG1hbi9saXN0aW5mby9pb21t dQ==