From mboxrd@z Thu Jan 1 00:00:00 1970 From: Daniel Kurtz Subject: [PATCH v3 1/3] iommu/rockchip: rk3288 iommu driver Date: Sat, 11 Oct 2014 02:30:46 +0800 Message-ID: <1412965848-18663-2-git-send-email-djkurtz@chromium.org> References: <1412965848-18663-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: <1412965848-18663-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+IDRNQiBtYXBwaW5ncwoKQ2hhbmdlcyBpbiB2MzoKIC0gc2Vs ZWN0IEFSTV9ETUFfVVNFX0lPTU1VCgpTaWduZWQtb2ZmLWJ5OiBEYW5pZWwgS3VydHogPGRqa3Vy dHpAY2hyb21pdW0ub3JnPgpTaWduZWQtb2ZmLWJ5OiBTaW1vbiBYdWUgPHh4bUByb2NrLWNoaXBz LmNvbT4KUmV2aWV3ZWQtYnk6IEdyYW50IEdydW5kbGVyIDxncnVuZGxlckBjaHJvbWl1bS5vcmc+ ClJldmlld2VkLWJ5OiBTdMOpcGhhbmUgTWFyY2hlc2luIDxtYXJjaGV1QGNocm9taXVtLm9yZz4K LS0tCiBkcml2ZXJzL2lvbW11L0tjb25maWcgICAgICAgICAgfCAgMTIgKwogZHJpdmVycy9pb21t dS9NYWtlZmlsZSAgICAgICAgIHwgICAxICsKIGRyaXZlcnMvaW9tbXUvcm9ja2NoaXAtaW9tbXUu YyB8IDkyNCArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwogMyBmaWxl cyBjaGFuZ2VkLCA5MzcgaW5zZXJ0aW9ucygrKQogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMv aW9tbXUvcm9ja2NoaXAtaW9tbXUuYwoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW9tbXUvS2NvbmZp ZyBiL2RyaXZlcnMvaW9tbXUvS2NvbmZpZwppbmRleCBkZDUxMTIyLi5kMGExMjYxIDEwMDY0NAot LS0gYS9kcml2ZXJzL2lvbW11L0tjb25maWcKKysrIGIvZHJpdmVycy9pb21tdS9LY29uZmlnCkBA IC0xNTIsNiArMTUyLDE4IEBAIGNvbmZpZyBPTUFQX0lPTU1VX0RFQlVHCiAKICAgICAgICAgIFNh eSBOIHVubGVzcyB5b3Uga25vdyB5b3UgbmVlZCB0aGlzLgogCitjb25maWcgUk9DS0NISVBfSU9N TVUKKwlib29sICJSb2NrY2hpcCBJT01NVSBTdXBwb3J0IgorCWRlcGVuZHMgb24gQVJDSF9ST0NL Q0hJUAorCXNlbGVjdCBJT01NVV9BUEkKKwlzZWxlY3QgQVJNX0RNQV9VU0VfSU9NTVUKKwloZWxw CisJICBTdXBwb3J0IGZvciBJT01NVXMgZm91bmQgb24gUm9ja2NoaXAgcmszMnh4IFNPQ3MuCisJ ICBUaGVzZSBJT01NVXMgYWxsb3cgdmlydHVhbGl6YXRpb24gb2YgdGhlIGFkZHJlc3Mgc3BhY2Ug dXNlZCBieSBtb3N0CisJICBjb3JlcyB3aXRoaW4gdGhlIG11bHRpbWVkaWEgc3Vic3lzdGVtLgor CSAgU2F5IFkgaGVyZSBpZiB5b3UgYXJlIHVzaW5nIGEgUm9ja2NoaXAgU29DIHRoYXQgaW5jbHVk ZXMgYW4gSU9NTVUKKwkgIGRldmljZS4KKwogY29uZmlnIFRFR1JBX0lPTU1VX0dBUlQKIAlib29s ICJUZWdyYSBHQVJUIElPTU1VIFN1cHBvcnQiCiAJZGVwZW5kcyBvbiBBUkNIX1RFR1JBXzJ4X1NP QwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pb21tdS9NYWtlZmlsZSBiL2RyaXZlcnMvaW9tbXUvTWFr ZWZpbGUKaW5kZXggMTZlZGVmNy4uM2U0N2VmMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pb21tdS9N YWtlZmlsZQorKysgYi9kcml2ZXJzL2lvbW11L01ha2VmaWxlCkBAIC0xMyw2ICsxMyw3IEBAIG9i ai0kKENPTkZJR19JUlFfUkVNQVApICs9IGludGVsX2lycV9yZW1hcHBpbmcubyBpcnFfcmVtYXBw aW5nLm8KIG9iai0kKENPTkZJR19PTUFQX0lPTU1VKSArPSBvbWFwLWlvbW11Lm8KIG9iai0kKENP TkZJR19PTUFQX0lPTU1VKSArPSBvbWFwLWlvbW11Mi5vCiBvYmotJChDT05GSUdfT01BUF9JT01N VV9ERUJVRykgKz0gb21hcC1pb21tdS1kZWJ1Zy5vCitvYmotJChDT05GSUdfUk9DS0NISVBfSU9N TVUpICs9IHJvY2tjaGlwLWlvbW11Lm8KIG9iai0kKENPTkZJR19URUdSQV9JT01NVV9HQVJUKSAr PSB0ZWdyYS1nYXJ0Lm8KIG9iai0kKENPTkZJR19URUdSQV9JT01NVV9TTU1VKSArPSB0ZWdyYS1z bW11Lm8KIG9iai0kKENPTkZJR19FWFlOT1NfSU9NTVUpICs9IGV4eW5vcy1pb21tdS5vCmRpZmYg LS1naXQgYS9kcml2ZXJzL2lvbW11L3JvY2tjaGlwLWlvbW11LmMgYi9kcml2ZXJzL2lvbW11L3Jv Y2tjaGlwLWlvbW11LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhlNTBm YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaW9tbXUvcm9ja2NoaXAtaW9tbXUuYwpAQCAt MCwwICsxLDkyNCBAQAorLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3Ug Y2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMg b2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlz aGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGFz bS9jYWNoZWZsdXNoLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxsaW51 eC9jb21waWxlci5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgv ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRl cnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvbW11Lmg+ CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNp bmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUg PGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVk ZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisKKy8qKiBNTVUg cmVnaXN0ZXIgb2Zmc2V0cyAqLworI2RlZmluZSBSS19NTVVfRFRFX0FERFIJCTB4MDAJLyogRGly ZWN0b3J5IHRhYmxlIGFkZHJlc3MgKi8KKyNkZWZpbmUgUktfTU1VX1NUQVRVUwkJMHgwNAorI2Rl ZmluZSBSS19NTVVfQ09NTUFORAkJMHgwOAorI2RlZmluZSBSS19NTVVfUEFHRV9GQVVMVF9BRERS CTB4MEMJLyogSU9WQSBvZiBsYXN0IHBhZ2UgZmF1bHQgKi8KKyNkZWZpbmUgUktfTU1VX1pBUF9P TkVfTElORQkweDEwCS8qIFNob290ZG93biBvbmUgSU9UTEIgZW50cnkgKi8KKyNkZWZpbmUgUktf TU1VX0lOVF9SQVdTVEFUCTB4MTQJLyogSVJRIHN0YXR1cyBpZ25vcmluZyBtYXNrICovCisjZGVm aW5lIFJLX01NVV9JTlRfQ0xFQVIJMHgxOAkvKiBBY2tub3dsZWRnZSBhbmQgcmUtYXJtIGlycSAq LworI2RlZmluZSBSS19NTVVfSU5UX01BU0sJCTB4MUMJLyogSVJRIGVuYWJsZSAqLworI2RlZmlu ZSBSS19NTVVfSU5UX1NUQVRVUwkweDIwCS8qIElSUSBzdGF0dXMgYWZ0ZXIgbWFza2luZyAqLwor I2RlZmluZSBSS19NTVVfQVVUT19HQVRJTkcJMHgyNAorCisjZGVmaW5lIERURV9BRERSX0RVTU1Z CQkweENBRkVCQUJFCisjZGVmaW5lIEZPUkNFX1JFU0VUX1RJTUVPVVQJMTAwCS8qIG1zICovCisK Ky8qIFJLX01NVV9TVEFUVVMgZmllbGRzICovCisjZGVmaW5lIFJLX01NVV9TVEFUVVNfUEFHSU5H X0VOQUJMRUQgICAgICAgQklUKDApCisjZGVmaW5lIFJLX01NVV9TVEFUVVNfUEFHRV9GQVVMVF9B Q1RJVkUgICAgQklUKDEpCisjZGVmaW5lIFJLX01NVV9TVEFUVVNfU1RBTExfQUNUSVZFICAgICAg ICAgQklUKDIpCisjZGVmaW5lIFJLX01NVV9TVEFUVVNfSURMRSAgICAgICAgICAgICAgICAgQklU KDMpCisjZGVmaW5lIFJLX01NVV9TVEFUVVNfUkVQTEFZX0JVRkZFUl9FTVBUWSAgQklUKDQpCisj ZGVmaW5lIFJLX01NVV9TVEFUVVNfUEFHRV9GQVVMVF9JU19XUklURSAgQklUKDUpCisjZGVmaW5l IFJLX01NVV9TVEFUVVNfU1RBTExfTk9UX0FDVElWRSAgICAgQklUKDMxKQorCisvKiBSS19NTVVf Q09NTUFORCBjb21tYW5kIHZhbHVlcyAqLworI2RlZmluZSBSS19NTVVfQ01EX0VOQUJMRV9QQUdJ TkcgICAgMCAgLyogRW5hYmxlIG1lbW9yeSB0cmFuc2xhdGlvbiAqLworI2RlZmluZSBSS19NTVVf Q01EX0RJU0FCTEVfUEFHSU5HICAgMSAgLyogRGlzYWJsZSBtZW1vcnkgdHJhbnNsYXRpb24gKi8K KyNkZWZpbmUgUktfTU1VX0NNRF9FTkFCTEVfU1RBTEwgICAgIDIgIC8qIFN0YWxsIHBhZ2luZyB0 byBhbGxvdyBvdGhlciBjbWRzICovCisjZGVmaW5lIFJLX01NVV9DTURfRElTQUJMRV9TVEFMTCAg ICAzICAvKiBTdG9wIHN0YWxsIHJlLWVuYWJsZXMgcGFnaW5nICovCisjZGVmaW5lIFJLX01NVV9D TURfWkFQX0NBQ0hFICAgICAgICA0ICAvKiBTaG9vdCBkb3duIGVudGlyZSBJT1RMQiAqLworI2Rl ZmluZSBSS19NTVVfQ01EX1BBR0VfRkFVTFRfRE9ORSAgNSAgLyogQ2xlYXIgcGFnZSBmYXVsdCAq LworI2RlZmluZSBSS19NTVVfQ01EX0ZPUkNFX1JFU0VUICAgICAgNiAgLyogUmVzZXQgYWxsIHJl Z2lzdGVycyAqLworCisvKiBSS19NTVVfSU5UXyogcmVnaXN0ZXIgZmllbGRzICovCisjZGVmaW5l IFJLX01NVV9JUlFfUEFHRV9GQVVMVCAgICAweDAxICAvKiBwYWdlIGZhdWx0ICovCisjZGVmaW5l IFJLX01NVV9JUlFfQlVTX0VSUk9SICAgICAweDAyICAvKiBidXMgcmVhZCBlcnJvciAqLworI2Rl ZmluZSBSS19NTVVfSVJRX01BU0sgICAgICAgICAgKFJLX01NVV9JUlFfUEFHRV9GQVVMVCB8IFJL X01NVV9JUlFfQlVTX0VSUk9SKQorCisjZGVmaW5lIE5VTV9EVF9FTlRSSUVTIDEwMjQKKyNkZWZp bmUgTlVNX1BUX0VOVFJJRVMgMTAyNAorCisjZGVmaW5lIFNQQUdFX09SREVSIDEyCisjZGVmaW5l IFNQQUdFX1NJWkUgKDEgPDwgU1BBR0VfT1JERVIpCisKKyAvKgorICAqIFN1cHBvcnQgbWFwcGlu ZyBhbnkgc2l6ZSB0aGF0IGZpdHMgaW4gb25lIHBhZ2UgdGFibGU6CisgICogICA0IEtpQiB0byA0 IE1pQgorICAqLworI2RlZmluZSBSS19JT01NVV9QR1NJWkVfQklUTUFQIDB4MDA3ZmYwMDAKKwor I2RlZmluZSBJT01NVV9SRUdfUE9MTF9DT1VOVF9GQVNUIDEwMDAKKworc3RydWN0IHJrX2lvbW11 X2RvbWFpbiB7CisJc3RydWN0IGxpc3RfaGVhZCBpb21tdXM7CisJdTMyICpkdDsgLyogcGFnZSBk aXJlY3RvcnkgdGFibGUgKi8KKwlzcGlubG9ja190IGlvbW11c19sb2NrOyAvKiBsb2NrIGZvciBp b21tdXMgbGlzdCAqLworCXNwaW5sb2NrX3QgZHRfbG9jazsgLyogbG9jayBmb3IgbW9kaWZ5aW5n IHBhZ2UgZGlyZWN0b3J5IHRhYmxlICovCit9OworCitzdHJ1Y3QgcmtfaW9tbXUgeworCXN0cnVj dCBkZXZpY2UgKmRldjsKKwl2b2lkIF9faW9tZW0gKmJhc2U7CisJaW50IGlycTsKKwlzdHJ1Y3Qg bGlzdF9oZWFkIG5vZGU7IC8qIGVudHJ5IGluIHJrX2lvbW11X2RvbWFpbi5pb21tdXMgKi8KKwlz dHJ1Y3QgaW9tbXVfZG9tYWluICpkb21haW47IC8qIGRvbWFpbiB0byB3aGljaCBpb21tdSBpcyBh dHRhY2hlZCAqLworfTsKKworc3RhdGljIGlubGluZSB2b2lkIHJrX3RhYmxlX2ZsdXNoKHUzMiAq dmEsIHVuc2lnbmVkIGludCBjb3VudCkKK3sKKwlwaHlzX2FkZHJfdCBwYV9zdGFydCA9IHZpcnRf dG9fcGh5cyh2YSk7CisJcGh5c19hZGRyX3QgcGFfZW5kID0gdmlydF90b19waHlzKHZhICsgY291 bnQpOworCXNpemVfdCBzaXplID0gcGFfZW5kIC0gcGFfc3RhcnQ7CisKKwlfX2NwdWNfZmx1c2hf ZGNhY2hlX2FyZWEodmEsIHNpemUpOworCW91dGVyX2ZsdXNoX3JhbmdlKHBhX3N0YXJ0LCBwYV9l bmQpOworfQorCisvKioKKyAqIEluc3BpcmVkIGJ5IF93YWl0X2ZvciBpbiBpbnRlbF9kcnYuaAor ICogVGhpcyBpcyBOT1Qgc2FmZSBmb3IgdXNlIGluIGludGVycnVwdCBjb250ZXh0LgorICoKKyAq IE5vdGUgdGhhdCBpdCdzIGltcG9ydGFudCB0aGF0IHdlIGNoZWNrIHRoZSBjb25kaXRpb24gYWdh aW4gYWZ0ZXIgaGF2aW5nCisgKiB0aW1lZCBvdXQsIHNpbmNlIHRoZSB0aW1lb3V0IGNvdWxkIGJl IGR1ZSB0byBwcmVlbXB0aW9uIG9yIHNpbWlsYXIgYW5kCisgKiB3ZSd2ZSBuZXZlciBoYWQgYSBj aGFuY2UgdG8gY2hlY2sgdGhlIGNvbmRpdGlvbiBiZWZvcmUgdGhlIHRpbWVvdXQuCisgKi8KKyNk ZWZpbmUgcmtfd2FpdF9mb3IoQ09ORCwgTVMpICh7IFwKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXRf XyA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKE1TKSArIDE7CVwKKwlpbnQgcmV0X18gPSAw OwkJCQkJCQlcCisJd2hpbGUgKCEoQ09ORCkpIHsJCQkJCQlcCisJCWlmICh0aW1lX2FmdGVyKGpp ZmZpZXMsIHRpbWVvdXRfXykpIHsJCQlcCisJCQlyZXRfXyA9IChDT05EKSA/IDAgOiAtRVRJTUVE T1VUOwkJXAorCQkJYnJlYWs7CQkJCQkJXAorCQl9CQkJCQkJCVwKKwkJdXNsZWVwX3JhbmdlKDUw LCAxMDApOwkJCQkJXAorCX0JCQkJCQkJCVwKKwlyZXRfXzsJCQkJCQkJCVwKK30pCisKKy8qCisg KiBUaGUgUm9ja2NoaXAgcmszMjg4IGlvbW11IHVzZXMgYSAyLWxldmVsIHBhZ2UgdGFibGUuCisg KiBUaGUgZmlyc3QgbGV2ZWwgaXMgdGhlICJEaXJlY3RvcnkgVGFibGUiIChEVCkuCisgKiBUaGUg RFQgY29uc2lzdHMgb2YgMTAyNCA0LWJ5dGUgRGlyZWN0b3J5IFRhYmxlIEVudHJpZXMgKERURXMp LCBlYWNoIHBvaW50aW5nCisgKiB0byBhICJQYWdlIFRhYmxlIi4KKyAqIFRoZSBzZWNvbmQgbGV2 ZWwgaXMgdGhlIDEwMjQgUGFnZSBUYWJsZXMgKFBUKS4KKyAqIEVhY2ggUFQgY29uc2lzdHMgb2Yg MTAyNCA0LWJ5dGUgUGFnZSBUYWJsZSBFbnRyaWVzIChQVEVzKSwgZWFjaCBwb2ludGluZyB0bwor ICogYSA0IEtCIHBhZ2Ugb2YgcGh5c2ljYWwgbWVtb3J5LgorICoKKyAqIFRoZSBEVCBhbmQgZWFj aCBQVCBmaXRzIGluIGEgc2luZ2xlIDQgS0IgcGFnZSAoNC1ieXRlcyAqIDEwMjQgZW50cmllcyku CisgKiBFYWNoIGlvbW11IGRldmljZSBoYXMgYSBNTVVfRFRFX0FERFIgcmVnaXN0ZXIgdGhhdCBj b250YWlucyB0aGUgcGh5c2ljYWwKKyAqIGFkZHJlc3Mgb2YgdGhlIHN0YXJ0IG9mIHRoZSBEVCBw YWdlLgorICoKKyAqIFRoZSBzdHJ1Y3R1cmUgb2YgdGhlIHBhZ2UgdGFibGUgaXMgYXMgZm9sbG93 czoKKyAqCisgKiAgICAgICAgICAgICAgICAgICBEVAorICogTU1VX0RURV9BRERSIC0+ICstLS0t LSsKKyAqICAgICAgICAgICAgICAgICB8ICAgICB8CisgKiAgICAgICAgICAgICAgICAgKy0tLS0t KyAgICAgUFQKKyAqICAgICAgICAgICAgICAgICB8IERURSB8IC0+ICstLS0tLSsKKyAqICAgICAg ICAgICAgICAgICArLS0tLS0rICAgIHwgICAgIHwgICAgIE1lbW9yeQorICogICAgICAgICAgICAg ICAgIHwgICAgIHwgICAgKy0tLS0tKyAgICAgUGFnZQorICogICAgICAgICAgICAgICAgIHwgICAg IHwgICAgfCBQVEUgfCAtPiArLS0tLS0rCisgKiAgICAgICAgICAgICAgICAgKy0tLS0tKyAgICAr LS0tLS0rICAgIHwgICAgIHwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwg ICAgfCAgICAgfAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCAgICB8ICAg ICB8CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0rICAgIHwgICAgIHwKKyAq ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfAorICogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8CisgKiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLSsKKyAqLworCisvKgorICogRWFjaCBEVEUg aGFzIGEgUFQgYWRkcmVzcyBhbmQgYSB2YWxpZCBiaXQ6CisgKiArLS0tLS0tLS0tLS0tLS0tLS0t LS0tKy0tLS0tLS0tLS0tKy0rCisgKiB8IFBUIGFkZHJlc3MgICAgICAgICAgfCBSZXNlcnZlZCAg fFZ8CisgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0rCisgKiAgMzE6MTIg LSBQVCBhZGRyZXNzIChQVHMgYWx3YXlzIHN0YXJ0cyBvbiBhIDQgS0IgYm91bmRhcnkpCisgKiAg MTE6IDEgLSBSZXNlcnZlZAorICogICAgICAwIC0gMSBpZiBQVCBAIFBUIGFkZHJlc3MgaXMgdmFs aWQKKyAqLworI2RlZmluZSBSS19EVEVfUFRfQUREUkVTU19NQVNLICAgIDB4ZmZmZmYwMDAKKyNk ZWZpbmUgUktfRFRFX1BUX1ZBTElEICAgICAgICAgICBCSVQoMCkKKworc3RhdGljIGlubGluZSBw aHlzX2FkZHJfdCBya19kdGVfcHRfYWRkcmVzcyh1MzIgZHRlKQoreworCXJldHVybiAocGh5c19h ZGRyX3QpZHRlICYgUktfRFRFX1BUX0FERFJFU1NfTUFTSzsKK30KKworc3RhdGljIGlubGluZSBi b29sIHJrX2R0ZV9pc19wdF92YWxpZCh1MzIgZHRlKQoreworCXJldHVybiBkdGUgJiBSS19EVEVf UFRfVkFMSUQ7Cit9CisKK3N0YXRpYyB1MzIgcmtfbWtfZHRlKHUzMiAqcHQpCit7CisJcGh5c19h ZGRyX3QgcHRfcGh5cyA9IHZpcnRfdG9fcGh5cyhwdCk7CisJcmV0dXJuIChwdF9waHlzICYgUktf RFRFX1BUX0FERFJFU1NfTUFTSykgfCBSS19EVEVfUFRfVkFMSUQ7Cit9CisKKy8qCisgKiBFYWNo IFBURSBoYXMgYSBQYWdlIGFkZHJlc3MsIHNvbWUgZmxhZ3MgYW5kIGEgdmFsaWQgYml0OgorICog Ky0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0rLS0tLS0tLSstKworICogfCBQYWdlIGFkZHJlc3Mg ICAgICAgIHxSc3Z8IEZsYWdzIHxWfAorICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0rLS0t LS0tLSstKworICogIDMxOjEyIC0gUGFnZSBhZGRyZXNzIChQYWdlcyBhbHdheXMgc3RhcnQgb24g YSA0IEtCIGJvdW5kYXJ5KQorICogIDExOiA5IC0gUmVzZXJ2ZWQKKyAqICAgODogMSAtIEZsYWdz CisgKiAgICAgIDggLSBSZWFkIGFsbG9jYXRlIC0gYWxsb2NhdGUgY2FjaGUgc3BhY2Ugb24gcmVh ZCBtaXNzZXMKKyAqICAgICAgNyAtIFJlYWQgY2FjaGUgLSBlbmFibGUgY2FjaGUgJiBwcmVmZXRj aCBvZiBkYXRhCisgKiAgICAgIDYgLSBXcml0ZSBidWZmZXIgLSBlbmFibGUgZGVsYXlpbmcgd3Jp dGVzIG9uIHRoZWlyIHdheSB0byBtZW1vcnkKKyAqICAgICAgNSAtIFdyaXRlIGFsbG9jYXRlIC0g YWxsb2NhdGUgY2FjaGUgc3BhY2Ugb24gd3JpdGUgbWlzc2VzCisgKiAgICAgIDQgLSBXcml0ZSBj YWNoZSAtIGRpZmZlcmVudCB3cml0ZXMgY2FuIGJlIG1lcmdlZCB0b2dldGhlcgorICogICAgICAz IC0gT3ZlcnJpZGUgY2FjaGUgYXR0cmlidXRlcworICogICAgICAgICAgaWYgMSwgYml0cyA0LTgg Y29udHJvbCBjYWNoZSBhdHRyaWJ1dGVzCisgKiAgICAgICAgICBpZiAwLCB0aGUgc3lzdGVtIGJ1 cyBkZWZhdWx0cyBhcmUgdXNlZAorICogICAgICAyIC0gV3JpdGFibGUKKyAqICAgICAgMSAtIFJl YWRhYmxlCisgKiAgICAgIDAgLSAxIGlmIFBhZ2UgQCBQYWdlIGFkZHJlc3MgaXMgdmFsaWQKKyAq LworI2RlZmluZSBSS19QVEVfUEFHRV9BRERSRVNTX01BU0sgIDB4ZmZmZmYwMDAKKyNkZWZpbmUg UktfUFRFX1BBR0VfRkxBR1NfTUFTSyAgICAweDAwMDAwMWZlCisjZGVmaW5lIFJLX1BURV9QQUdF X1dSSVRBQkxFICAgICAgQklUKDIpCisjZGVmaW5lIFJLX1BURV9QQUdFX1JFQURBQkxFICAgICAg QklUKDEpCisjZGVmaW5lIFJLX1BURV9QQUdFX1ZBTElEICAgICAgICAgQklUKDApCisKK3N0YXRp YyBpbmxpbmUgcGh5c19hZGRyX3QgcmtfcHRlX3BhZ2VfYWRkcmVzcyh1MzIgcHRlKQoreworCXJl dHVybiAocGh5c19hZGRyX3QpcHRlICYgUktfUFRFX1BBR0VfQUREUkVTU19NQVNLOworfQorCitz dGF0aWMgaW5saW5lIGJvb2wgcmtfcHRlX2lzX3BhZ2VfdmFsaWQodTMyIHB0ZSkKK3sKKwlyZXR1 cm4gcHRlICYgUktfUFRFX1BBR0VfVkFMSUQ7Cit9CisKKy8qIFRPRE86IHNldCBjYWNoZSBmbGFn cyBwZXIgcHJvdCBJT01NVV9DQUNIRSAqLworc3RhdGljIHUzMiBya19ta19wdGUocGh5c19hZGRy X3QgcGFnZSwgaW50IHByb3QpCit7CisJdTMyIGZsYWdzID0gMDsKKwlmbGFncyB8PSAocHJvdCAm IElPTU1VX1JFQUQpID8gUktfUFRFX1BBR0VfUkVBREFCTEUgOiAwOworCWZsYWdzIHw9IChwcm90 ICYgSU9NTVVfV1JJVEUpID8gUktfUFRFX1BBR0VfV1JJVEFCTEUgOiAwOworCXBhZ2UgJj0gUktf UFRFX1BBR0VfQUREUkVTU19NQVNLOworCXJldHVybiBwYWdlIHwgZmxhZ3MgfCBSS19QVEVfUEFH RV9WQUxJRDsKK30KKworc3RhdGljIHUzMiBya19ta19wdGVfaW52YWxpZCh1MzIgcHRlKQorewor CXJldHVybiBwdGUgJiB+UktfUFRFX1BBR0VfVkFMSUQ7Cit9CisKKy8qCisgKiByazMyODggaW92 YSAoSU9NTVUgVmlydHVhbCBBZGRyZXNzKSBmb3JtYXQKKyAqICAzMSAgICAgICAyMi4yMSAgICAg ICAxMi4xMSAgICAgICAgICAwCisgKiArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0t LS0tLSsKKyAqIHwgRFRFIGluZGV4IHwgUFRFIGluZGV4IHwgUGFnZSBvZmZzZXQgfAorICogKy0t LS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rCisgKiAgMzE6MjIgLSBEVEUgaW5k ZXggICAtIGluZGV4IG9mIERURSBpbiBEVAorICogIDIxOjEyIC0gUFRFIGluZGV4ICAgLSBpbmRl eCBvZiBQVEUgaW4gUFQgQCBEVEUucHRfYWRkcmVzcworICogIDExOiAwIC0gUGFnZSBvZmZzZXQg LSBvZmZzZXQgaW50byBwYWdlIEAgUFRFLnBhZ2VfYWRkcmVzcworICovCisjZGVmaW5lIFJLX0lP VkFfRFRFX01BU0sgICAgMHhmZmMwMDAwMAorI2RlZmluZSBSS19JT1ZBX0RURV9TSElGVCAgIDIy CisjZGVmaW5lIFJLX0lPVkFfUFRFX01BU0sgICAgMHgwMDNmZjAwMAorI2RlZmluZSBSS19JT1ZB X1BURV9TSElGVCAgIDEyCisjZGVmaW5lIFJLX0lPVkFfUEFHRV9NQVNLICAgMHgwMDAwMGZmZgor I2RlZmluZSBSS19JT1ZBX1BBR0VfU0hJRlQgIDAKKworc3RhdGljIHUzMiBya19pb3ZhX2R0ZV9p bmRleChkbWFfYWRkcl90IGlvdmEpCit7CisJcmV0dXJuICh1MzIpKGlvdmEgJiBSS19JT1ZBX0RU RV9NQVNLKSA+PiBSS19JT1ZBX0RURV9TSElGVDsKK30KKworc3RhdGljIHUzMiBya19pb3ZhX3B0 ZV9pbmRleChkbWFfYWRkcl90IGlvdmEpCit7CisJcmV0dXJuICh1MzIpKGlvdmEgJiBSS19JT1ZB X1BURV9NQVNLKSA+PiBSS19JT1ZBX1BURV9TSElGVDsKK30KKworc3RhdGljIHUzMiBya19pb3Zh X3BhZ2Vfb2Zmc2V0KGRtYV9hZGRyX3QgaW92YSkKK3sKKwlyZXR1cm4gKHUzMikoaW92YSAmIFJL X0lPVkFfUEFHRV9NQVNLKSA+PiBSS19JT1ZBX1BBR0VfU0hJRlQ7Cit9CisKK3N0YXRpYyB1MzIg cmtfaW9tbXVfcmVhZChzdHJ1Y3QgcmtfaW9tbXUgKmlvbW11LCB1MzIgb2Zmc2V0KQoreworCXJl dHVybiByZWFkbChpb21tdS0+YmFzZSArIG9mZnNldCk7Cit9CisKK3N0YXRpYyB2b2lkIHJrX2lv bW11X3dyaXRlKHN0cnVjdCBya19pb21tdSAqaW9tbXUsIHUzMiBvZmZzZXQsIHUzMiB2YWx1ZSkK K3sKKwl3cml0ZWwodmFsdWUsIGlvbW11LT5iYXNlICsgb2Zmc2V0KTsKK30KKworc3RhdGljIHZv aWQgcmtfaW9tbXVfY29tbWFuZChzdHJ1Y3QgcmtfaW9tbXUgKmlvbW11LCB1MzIgY29tbWFuZCkK K3sKKwl3cml0ZWwoY29tbWFuZCwgaW9tbXUtPmJhc2UgKyBSS19NTVVfQ09NTUFORCk7Cit9CisK K3N0YXRpYyB2b2lkIHJrX2lvbW11X3phcF9saW5lcyhzdHJ1Y3QgcmtfaW9tbXUgKmlvbW11LCBk bWFfYWRkcl90IGlvdmEsCisJCQkgICAgICAgc2l6ZV90IHNpemUpCit7CisJZG1hX2FkZHJfdCBp b3ZhX2VuZCA9IGlvdmEgKyBzaXplOworCS8qCisJICogVE9ETyhkamt1cnR6KTogRmlndXJlIG91 dCB3aGVuIGl0IGlzIG1vcmUgZWZmaWNpZW50IHRvIHNob290ZG93biB0aGUKKwkgKiBlbnRpcmUg aW90bGIgcmF0aGVyIHRoYW4gaXRlcmF0ZSBvdmVyIGluZGl2aWR1YWwgaW92YXMuCisJICovCisJ Zm9yICg7IGlvdmEgPCBpb3ZhX2VuZDsgaW92YSArPSBTUEFHRV9TSVpFKQorCQlya19pb21tdV93 cml0ZShpb21tdSwgUktfTU1VX1pBUF9PTkVfTElORSwgaW92YSk7Cit9CisKK3N0YXRpYyBib29s IHJrX2lvbW11X2lzX3N0YWxsX2FjdGl2ZShzdHJ1Y3QgcmtfaW9tbXUgKmlvbW11KQoreworCXJl dHVybiBya19pb21tdV9yZWFkKGlvbW11LCBSS19NTVVfU1RBVFVTKSAmIFJLX01NVV9TVEFUVVNf U1RBTExfQUNUSVZFOworfQorCitzdGF0aWMgYm9vbCBya19pb21tdV9pc19wYWdpbmdfZW5hYmxl ZChzdHJ1Y3QgcmtfaW9tbXUgKmlvbW11KQoreworCXJldHVybiBya19pb21tdV9yZWFkKGlvbW11 LCBSS19NTVVfU1RBVFVTKSAmCisJCQkgICAgIFJLX01NVV9TVEFUVVNfUEFHSU5HX0VOQUJMRUQ7 Cit9CisKK3N0YXRpYyBpbnQgcmtfaW9tbXVfZW5hYmxlX3N0YWxsKHN0cnVjdCBya19pb21tdSAq aW9tbXUpCit7CisJaW50IHJldDsKKworCWlmIChya19pb21tdV9pc19zdGFsbF9hY3RpdmUoaW9t bXUpKQorCQlyZXR1cm4gMDsKKworCS8qIFN0YWxsIGNhbiBvbmx5IGJlIGVuYWJsZWQgaWYgcGFn aW5nIGlzIGVuYWJsZWQgKi8KKwlpZiAoIXJrX2lvbW11X2lzX3BhZ2luZ19lbmFibGVkKGlvbW11 KSkKKwkJcmV0dXJuIDA7CisKKwlya19pb21tdV9jb21tYW5kKGlvbW11LCBSS19NTVVfQ01EX0VO QUJMRV9TVEFMTCk7CisKKwlyZXQgPSBya193YWl0X2Zvcihya19pb21tdV9pc19zdGFsbF9hY3Rp dmUoaW9tbXUpLCAxKTsKKwlpZiAocmV0KQorCQlkZXZfZXJyKGlvbW11LT5kZXYsICJFbmFibGUg c3RhbGwgcmVxdWVzdCB0aW1lZCBvdXQsIHN0YXR1czogJSMwOHhcbiIsCisJCQlya19pb21tdV9y ZWFkKGlvbW11LCBSS19NTVVfU1RBVFVTKSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMg aW50IHJrX2lvbW11X2Rpc2FibGVfc3RhbGwoc3RydWN0IHJrX2lvbW11ICppb21tdSkKK3sKKwlp bnQgcmV0OworCisJaWYgKCFya19pb21tdV9pc19zdGFsbF9hY3RpdmUoaW9tbXUpKQorCQlyZXR1 cm4gMDsKKworCXJrX2lvbW11X2NvbW1hbmQoaW9tbXUsIFJLX01NVV9DTURfRElTQUJMRV9TVEFM TCk7CisKKwlyZXQgPSBya193YWl0X2ZvcighcmtfaW9tbXVfaXNfc3RhbGxfYWN0aXZlKGlvbW11 KSwgMSk7CisJaWYgKHJldCkKKwkJZGV2X2Vycihpb21tdS0+ZGV2LCAiRGlzYWJsZSBzdGFsbCBy ZXF1ZXN0IHRpbWVkIG91dCwgc3RhdHVzOiAlIzA4eFxuIiwKKwkJCXJrX2lvbW11X3JlYWQoaW9t bXUsIFJLX01NVV9TVEFUVVMpKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcmtf aW9tbXVfZW5hYmxlX3BhZ2luZyhzdHJ1Y3QgcmtfaW9tbXUgKmlvbW11KQoreworCWludCByZXQ7 CisKKwlpZiAocmtfaW9tbXVfaXNfcGFnaW5nX2VuYWJsZWQoaW9tbXUpKQorCQlyZXR1cm4gMDsK KworCXJrX2lvbW11X2NvbW1hbmQoaW9tbXUsIFJLX01NVV9DTURfRU5BQkxFX1BBR0lORyk7CisK KwlyZXQgPSBya193YWl0X2Zvcihya19pb21tdV9pc19wYWdpbmdfZW5hYmxlZChpb21tdSksIDEp OworCWlmIChyZXQpCisJCWRldl9lcnIoaW9tbXUtPmRldiwgIkVuYWJsZSBwYWdpbmcgcmVxdWVz dCB0aW1lZCBvdXQsIHN0YXR1czogJSMwOHhcbiIsCisJCQlya19pb21tdV9yZWFkKGlvbW11LCBS S19NTVVfU1RBVFVTKSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHJrX2lvbW11 X2Rpc2FibGVfcGFnaW5nKHN0cnVjdCBya19pb21tdSAqaW9tbXUpCit7CisJaW50IHJldDsKKwor CWlmICghcmtfaW9tbXVfaXNfcGFnaW5nX2VuYWJsZWQoaW9tbXUpKQorCQlyZXR1cm4gMDsKKwor CXJrX2lvbW11X2NvbW1hbmQoaW9tbXUsIFJLX01NVV9DTURfRElTQUJMRV9QQUdJTkcpOworCisJ cmV0ID0gcmtfd2FpdF9mb3IoIXJrX2lvbW11X2lzX3BhZ2luZ19lbmFibGVkKGlvbW11KSwgMSk7 CisJaWYgKHJldCkKKwkJZGV2X2Vycihpb21tdS0+ZGV2LCAiRGlzYWJsZSBwYWdpbmcgcmVxdWVz dCB0aW1lZCBvdXQsIHN0YXR1czogIyUwOHhcbiIsCisJCQlya19pb21tdV9yZWFkKGlvbW11LCBS S19NTVVfU1RBVFVTKSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHJrX2lvbW11 X2ZvcmNlX3Jlc2V0KHN0cnVjdCBya19pb21tdSAqaW9tbXUpCit7CisJaW50IHJldDsKKwl1MzIg ZHRlX2FkZHI7CisKKwkvKgorCSAqIENoZWNrIGlmIHJlZ2lzdGVyIERURV9BRERSIGlzIHdvcmtp bmcgYnkgd3JpdGluZyBEVEVfQUREUl9EVU1NWQorCSAqIGFuZCB2ZXJpZnlpbmcgdGhhdCB1cHBl ciA1IG55YmJsZXMgYXJlIHJlYWQgYmFjay4KKwkgKi8KKwlya19pb21tdV93cml0ZShpb21tdSwg UktfTU1VX0RURV9BRERSLCBEVEVfQUREUl9EVU1NWSk7CisKKwlkdGVfYWRkciA9IHJrX2lvbW11 X3JlYWQoaW9tbXUsIFJLX01NVV9EVEVfQUREUik7CisJaWYgKGR0ZV9hZGRyICE9IChEVEVfQURE Ul9EVU1NWSAmIFJLX0RURV9QVF9BRERSRVNTX01BU0spKSB7CisJCWRldl9lcnIoaW9tbXUtPmRl diwgIkVycm9yIGR1cmluZyByYXcgcmVzZXQuIE1NVV9EVEVfQUREUiBpcyBub3QgZnVuY3Rpb25p bmdcbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlya19pb21tdV9jb21tYW5kKGlvbW11 LCBSS19NTVVfQ01EX0ZPUkNFX1JFU0VUKTsKKworCXJldCA9IHJrX3dhaXRfZm9yKHJrX2lvbW11 X3JlYWQoaW9tbXUsIFJLX01NVV9EVEVfQUREUikgPT0gMHgwMDAwMDAwMCwKKwkJCSAgRk9SQ0Vf UkVTRVRfVElNRU9VVCk7CisJaWYgKHJldCkKKwkJZGV2X2Vycihpb21tdS0+ZGV2LCAiRk9SQ0Vf UkVTRVQgY29tbWFuZCB0aW1lZCBvdXRcbiIpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGlj IHZvaWQgbG9nX2lvdmEoc3RydWN0IHJrX2lvbW11ICppb21tdSwgZG1hX2FkZHJfdCBpb3ZhKQor eworCXUzMiBkdGVfaW5kZXgsIHB0ZV9pbmRleCwgcGFnZV9vZmZzZXQ7CisJdTMyIG1tdV9kdGVf YWRkcjsKKwlwaHlzX2FkZHJfdCBtbXVfZHRlX2FkZHJfcGh5cywgZHRlX2FkZHJfcGh5czsKKwl1 MzIgKmR0ZV9hZGRyOworCXUzMiBkdGU7CisJcGh5c19hZGRyX3QgcHRlX2FkZHJfcGh5cyA9IDA7 CisJdTMyICpwdGVfYWRkciA9IE5VTEw7CisJdTMyIHB0ZSA9IDA7CisJcGh5c19hZGRyX3QgcGFn ZV9hZGRyX3BoeXMgPSAwOworCXUzMiBwYWdlX2ZsYWdzID0gMDsKKworCWR0ZV9pbmRleCA9IHJr X2lvdmFfZHRlX2luZGV4KGlvdmEpOworCXB0ZV9pbmRleCA9IHJrX2lvdmFfcHRlX2luZGV4KGlv dmEpOworCXBhZ2Vfb2Zmc2V0ID0gcmtfaW92YV9wYWdlX29mZnNldChpb3ZhKTsKKworCW1tdV9k dGVfYWRkciA9IHJrX2lvbW11X3JlYWQoaW9tbXUsIFJLX01NVV9EVEVfQUREUik7CisJbW11X2R0 ZV9hZGRyX3BoeXMgPSAocGh5c19hZGRyX3QpbW11X2R0ZV9hZGRyOworCisJZHRlX2FkZHJfcGh5 cyA9IG1tdV9kdGVfYWRkcl9waHlzICsgKDQgKiBkdGVfaW5kZXgpOworCWR0ZV9hZGRyID0gcGh5 c190b192aXJ0KGR0ZV9hZGRyX3BoeXMpOworCWR0ZSA9ICpkdGVfYWRkcjsKKworCWlmICghcmtf ZHRlX2lzX3B0X3ZhbGlkKGR0ZSkpCisJCWdvdG8gcHJpbnRfaXQ7CisKKwlwdGVfYWRkcl9waHlz ID0gcmtfZHRlX3B0X2FkZHJlc3MoZHRlKSArIChwdGVfaW5kZXggKiA0KTsKKwlwdGVfYWRkciA9 IHBoeXNfdG9fdmlydChwdGVfYWRkcl9waHlzKTsKKwlwdGUgPSAqcHRlX2FkZHI7CisKKwlpZiAo IXJrX3B0ZV9pc19wYWdlX3ZhbGlkKHB0ZSkpCisJCWdvdG8gcHJpbnRfaXQ7CisKKwlwYWdlX2Fk ZHJfcGh5cyA9IHJrX3B0ZV9wYWdlX2FkZHJlc3MocHRlKSArIHBhZ2Vfb2Zmc2V0OworCXBhZ2Vf ZmxhZ3MgPSBwdGUgJiBSS19QVEVfUEFHRV9GTEFHU19NQVNLOworCitwcmludF9pdDoKKwlkZXZf ZXJyKGlvbW11LT5kZXYsICJpb3ZhID0gJXBhZDogZHRlX2luZGV4OiAweCUwM3ggcHRlX2luZGV4 OiAweCUwM3ggcGFnZV9vZmZzZXQ6IDB4JTAzeFxuIiwKKwkJJmlvdmEsIGR0ZV9pbmRleCwgcHRl X2luZGV4LCBwYWdlX29mZnNldCk7CisJZGV2X2Vycihpb21tdS0+ZGV2LCAibW11X2R0ZV9hZGRy OiAlcGEgZHRlQCVwYTogJSMwOHggdmFsaWQ6ICV1IHB0ZUAlcGE6ICUjMDh4IHZhbGlkOiAldSBw YWdlQCVwYSBmbGFnczogJSMwM3hcbiIsCisJCSZtbXVfZHRlX2FkZHJfcGh5cywgJmR0ZV9hZGRy X3BoeXMsIGR0ZSwKKwkJcmtfZHRlX2lzX3B0X3ZhbGlkKGR0ZSksICZwdGVfYWRkcl9waHlzLCBw dGUsCisJCXJrX3B0ZV9pc19wYWdlX3ZhbGlkKHB0ZSksICZwYWdlX2FkZHJfcGh5cywgcGFnZV9m bGFncyk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBya19pb21tdV9pcnEoaW50IGlycSwgdm9p ZCAqZGV2X2lkKQoreworCXN0cnVjdCBya19pb21tdSAqaW9tbXUgPSBkZXZfaWQ7CisJdTMyIHN0 YXR1czsKKwl1MzIgaW50X3N0YXR1czsKKwlkbWFfYWRkcl90IGlvdmE7CisKKwlpbnRfc3RhdHVz ID0gcmtfaW9tbXVfcmVhZChpb21tdSwgUktfTU1VX0lOVF9TVEFUVVMpOworCWlmIChpbnRfc3Rh dHVzID09IDApCisJCXJldHVybiBJUlFfTk9ORTsKKworCWlvdmEgPSBya19pb21tdV9yZWFkKGlv bW11LCBSS19NTVVfUEFHRV9GQVVMVF9BRERSKTsKKworCWlmIChpbnRfc3RhdHVzICYgUktfTU1V X0lSUV9QQUdFX0ZBVUxUKSB7CisJCWludCBmbGFnczsKKworCQlzdGF0dXMgPSBya19pb21tdV9y ZWFkKGlvbW11LCBSS19NTVVfU1RBVFVTKTsKKwkJZmxhZ3MgPSAoc3RhdHVzICYgUktfTU1VX1NU QVRVU19QQUdFX0ZBVUxUX0lTX1dSSVRFKSA/CisJCQkJSU9NTVVfRkFVTFRfV1JJVEUgOiBJT01N VV9GQVVMVF9SRUFEOworCisJCWRldl9lcnIoaW9tbXUtPmRldiwgIlBhZ2UgZmF1bHQgYXQgJXBh ZCBvZiB0eXBlICVzXG4iLAorCQkJJmlvdmEsCisJCQkoZmxhZ3MgPT0gSU9NTVVfRkFVTFRfV1JJ VEUpID8gIndyaXRlIiA6ICJyZWFkIik7CisKKwkJbG9nX2lvdmEoaW9tbXUsIGlvdmEpOworCisJ CS8qCisJCSAqIFJlcG9ydCBwYWdlIGZhdWx0IHRvIGFueSBpbnN0YWxsZWQgaGFuZGxlcnMuCisJ CSAqIElnbm9yZSB0aGUgcmV0dXJuIGNvZGUsIHRob3VnaCwgc2luY2Ugd2UgYWx3YXlzIHphcCBj YWNoZQorCQkgKiBhbmQgY2xlYXIgdGhlIHBhZ2UgZmF1bHQgYW55d2F5LgorCQkgKi8KKwkJaWYg KGlvbW11LT5kb21haW4pCisJCQlyZXBvcnRfaW9tbXVfZmF1bHQoaW9tbXUtPmRvbWFpbiwgaW9t bXUtPmRldiwgaW92YSwKKwkJCQkJICAgZmxhZ3MpOworCQllbHNlCisJCQlkZXZfZXJyKGlvbW11 LT5kZXYsICJQYWdlIGZhdWx0IHdoaWxlIGlvbW11IG5vdCBhdHRhY2hlZCB0byBkb21haW4/XG4i KTsKKworCQlya19pb21tdV9jb21tYW5kKGlvbW11LCBSS19NTVVfQ01EX1pBUF9DQUNIRSk7CisJ CXJrX2lvbW11X2NvbW1hbmQoaW9tbXUsIFJLX01NVV9DTURfUEFHRV9GQVVMVF9ET05FKTsKKwl9 CisKKwlpZiAoaW50X3N0YXR1cyAmIFJLX01NVV9JUlFfQlVTX0VSUk9SKQorCQlkZXZfZXJyKGlv bW11LT5kZXYsICJCVVNfRVJST1Igb2NjdXJyZWQgYXQgJXBhZFxuIiwgJmlvdmEpOworCisJaWYg KGludF9zdGF0dXMgJiB+UktfTU1VX0lSUV9NQVNLKQorCQlkZXZfZXJyKGlvbW11LT5kZXYsICJ1 bmV4cGVjdGVkIGludF9zdGF0dXM6ICUjMDh4XG4iLAorCQkJaW50X3N0YXR1cyk7CisKKwlya19p b21tdV93cml0ZShpb21tdSwgUktfTU1VX0lOVF9DTEVBUiwgaW50X3N0YXR1cyk7CisKKwlyZXR1 cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBwaHlzX2FkZHJfdCBya19pb21tdV9pb3ZhX3Rv X3BoeXMoc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tYWluLAorCQkJCQkgZG1hX2FkZHJfdCBpb3Zh KQoreworCXN0cnVjdCBya19pb21tdV9kb21haW4gKnJrX2RvbWFpbiA9IGRvbWFpbi0+cHJpdjsK Kwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXBoeXNfYWRkcl90IHB0X3BoeXMsIHBoeXMgPSAwOwor CXUzMiBkdGUsIHB0ZTsKKwl1MzIgKnBhZ2VfdGFibGU7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgm cmtfZG9tYWluLT5kdF9sb2NrLCBmbGFncyk7CisKKwlkdGUgPSBya19kb21haW4tPmR0W3JrX2lv dmFfZHRlX2luZGV4KGlvdmEpXTsKKwlpZiAoIXJrX2R0ZV9pc19wdF92YWxpZChkdGUpKQorCQln b3RvIG91dDsKKworCXB0X3BoeXMgPSBya19kdGVfcHRfYWRkcmVzcyhkdGUpOworCXBhZ2VfdGFi bGUgPSAodTMyICopcGh5c190b192aXJ0KHB0X3BoeXMpOworCXB0ZSA9IHBhZ2VfdGFibGVbcmtf aW92YV9wdGVfaW5kZXgoaW92YSldOworCWlmICghcmtfcHRlX2lzX3BhZ2VfdmFsaWQocHRlKSkK KwkJZ290byBvdXQ7CisKKwlwaHlzID0gcmtfcHRlX3BhZ2VfYWRkcmVzcyhwdGUpICsgcmtfaW92 YV9wYWdlX29mZnNldChpb3ZhKTsKK291dDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZya19k b21haW4tPmR0X2xvY2ssIGZsYWdzKTsKKworCXJldHVybiBwaHlzOworfQorCitzdGF0aWMgdm9p ZCBya19pb21tdV96YXBfaW92YShzdHJ1Y3QgcmtfaW9tbXVfZG9tYWluICpya19kb21haW4sCisJ CQkgICAgICBkbWFfYWRkcl90IGlvdmEsIHNpemVfdCBzaXplKQoreworCXN0cnVjdCBsaXN0X2hl YWQgKnBvczsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogc2hvb3Rkb3duIHRoZXNlIGlv dmEgZnJvbSBhbGwgaW9tbXVzIHVzaW5nIHRoaXMgZG9tYWluICovCisJc3Bpbl9sb2NrX2lycXNh dmUoJnJrX2RvbWFpbi0+aW9tbXVzX2xvY2ssIGZsYWdzKTsKKwlsaXN0X2Zvcl9lYWNoKHBvcywg JnJrX2RvbWFpbi0+aW9tbXVzKSB7CisJCXN0cnVjdCBya19pb21tdSAqaW9tbXU7CisJCWlvbW11 ID0gbGlzdF9lbnRyeShwb3MsIHN0cnVjdCBya19pb21tdSwgbm9kZSk7CisJCXJrX2lvbW11X3ph cF9saW5lcyhpb21tdSwgaW92YSwgc2l6ZSk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUo JnJrX2RvbWFpbi0+aW9tbXVzX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHUzMiAqcmtfZHRl X2dldF9wYWdlX3RhYmxlKHN0cnVjdCBya19pb21tdV9kb21haW4gKnJrX2RvbWFpbiwKKwkJCQkg IGRtYV9hZGRyX3QgaW92YSkKK3sKKwl1MzIgKnBhZ2VfdGFibGUsICpkdGVfYWRkcjsKKwl1MzIg ZHRlOworCXBoeXNfYWRkcl90IHB0X3BoeXM7CisKKwlhc3NlcnRfc3Bpbl9sb2NrZWQoJnJrX2Rv bWFpbi0+ZHRfbG9jayk7CisKKwlkdGVfYWRkciA9ICZya19kb21haW4tPmR0W3JrX2lvdmFfZHRl X2luZGV4KGlvdmEpXTsKKwlkdGUgPSAqZHRlX2FkZHI7CisJaWYgKHJrX2R0ZV9pc19wdF92YWxp ZChkdGUpKQorCQlnb3RvIGRvbmU7CisKKwlwYWdlX3RhYmxlID0gKHUzMiAqKWdldF96ZXJvZWRf cGFnZShHRlBfQVRPTUlDIHwgR0ZQX0RNQTMyKTsKKwlpZiAoIXBhZ2VfdGFibGUpCisJCXJldHVy biBFUlJfUFRSKC1FTk9NRU0pOworCisJZHRlID0gcmtfbWtfZHRlKHBhZ2VfdGFibGUpOworCSpk dGVfYWRkciA9IGR0ZTsKKworCXJrX3RhYmxlX2ZsdXNoKHBhZ2VfdGFibGUsIE5VTV9QVF9FTlRS SUVTKTsKKwlya190YWJsZV9mbHVzaChkdGVfYWRkciwgMSk7CisKKwkvKgorCSAqIFphcCB0aGUg Zmlyc3QgaW92YSBvZiBuZXdseSBhbGxvY2F0ZWQgcGFnZSB0YWJsZSBzbyBpb21tdSBldmljdHMK KwkgKiBvbGQgY2FjaGVkIHZhbHVlIG9mIG5ldyBkdGUgZnJvbSB0aGUgaW90bGIuCisJICovCisJ cmtfaW9tbXVfemFwX2lvdmEocmtfZG9tYWluLCBpb3ZhLCBTUEFHRV9TSVpFKTsKKworZG9uZToK KwlwdF9waHlzID0gcmtfZHRlX3B0X2FkZHJlc3MoZHRlKTsKKwlyZXR1cm4gKHUzMiAqKXBoeXNf dG9fdmlydChwdF9waHlzKTsKK30KKworc3RhdGljIHNpemVfdCBya19pb21tdV91bm1hcF9pb3Zh KHN0cnVjdCBya19pb21tdV9kb21haW4gKnJrX2RvbWFpbiwKKwkJCQkgIHUzMiAqcHRlX2FkZHIs IGRtYV9hZGRyX3QgaW92YSwgc2l6ZV90IHNpemUpCit7CisJdW5zaWduZWQgaW50IHB0ZV9jb3Vu dDsKKwl1bnNpZ25lZCBpbnQgcHRlX3RvdGFsID0gc2l6ZSAvIFNQQUdFX1NJWkU7CisKKwlhc3Nl cnRfc3Bpbl9sb2NrZWQoJnJrX2RvbWFpbi0+ZHRfbG9jayk7CisKKwlmb3IgKHB0ZV9jb3VudCA9 IDA7IHB0ZV9jb3VudCA8IHB0ZV90b3RhbDsgcHRlX2NvdW50KyspIHsKKwkJdTMyIHB0ZSA9IHB0 ZV9hZGRyW3B0ZV9jb3VudF07CisJCWlmICghcmtfcHRlX2lzX3BhZ2VfdmFsaWQocHRlKSkKKwkJ CWJyZWFrOworCisJCXB0ZV9hZGRyW3B0ZV9jb3VudF0gPSBya19ta19wdGVfaW52YWxpZChwdGUp OworCX0KKworCXJrX3RhYmxlX2ZsdXNoKHB0ZV9hZGRyLCBwdGVfY291bnQpOworCisJcmV0dXJu IHB0ZV9jb3VudCAqIFNQQUdFX1NJWkU7Cit9CisKK3N0YXRpYyBpbnQgcmtfaW9tbXVfbWFwX2lv dmEoc3RydWN0IHJrX2lvbW11X2RvbWFpbiAqcmtfZG9tYWluLCB1MzIgKnB0ZV9hZGRyLAorCQkJ ICAgICBkbWFfYWRkcl90IGlvdmEsIHBoeXNfYWRkcl90IHBhZGRyLCBzaXplX3Qgc2l6ZSwKKwkJ CSAgICAgaW50IHByb3QpCit7CisJdW5zaWduZWQgaW50IHB0ZV9jb3VudDsKKwl1bnNpZ25lZCBp bnQgcHRlX3RvdGFsID0gc2l6ZSAvIFNQQUdFX1NJWkU7CisJcGh5c19hZGRyX3QgcGFnZV9waHlz OworCisJYXNzZXJ0X3NwaW5fbG9ja2VkKCZya19kb21haW4tPmR0X2xvY2spOworCisJZm9yIChw dGVfY291bnQgPSAwOyBwdGVfY291bnQgPCBwdGVfdG90YWw7IHB0ZV9jb3VudCsrKSB7CisJCXUz MiBwdGUgPSBwdGVfYWRkcltwdGVfY291bnRdOworCisJCWlmIChya19wdGVfaXNfcGFnZV92YWxp ZChwdGUpKQorCQkJZ290byB1bndpbmQ7CisKKwkJcHRlX2FkZHJbcHRlX2NvdW50XSA9IHJrX21r X3B0ZShwYWRkciwgcHJvdCk7CisKKwkJcGFkZHIgKz0gU1BBR0VfU0laRTsKKwl9CisKKwlya190 YWJsZV9mbHVzaChwdGVfYWRkciwgcHRlX2NvdW50KTsKKworCXJldHVybiAwOwordW53aW5kOgor CS8qIFVubWFwIHRoZSByYW5nZSBvZiBpb3ZhcyB0aGF0IHdlIGp1c3QgbWFwcGVkICovCisJcmtf aW9tbXVfdW5tYXBfaW92YShya19kb21haW4sIHB0ZV9hZGRyLCBpb3ZhLCBwdGVfY291bnQgKiBT UEFHRV9TSVpFKTsKKworCWlvdmEgKz0gcHRlX2NvdW50ICogU1BBR0VfU0laRTsKKwlwYWdlX3Bo eXMgPSBya19wdGVfcGFnZV9hZGRyZXNzKHB0ZV9hZGRyW3B0ZV9jb3VudF0pOworCXByX2Vycigi aW92YTogJXBhZCBhbHJlYWR5IG1hcHBlZCB0byAlcGEgY2Fubm90IHJlbWFwIHRvIHBoeXM6ICVw YSBwcm90OiUjeFxuIiwKKwkgICAgICAgJmlvdmEsICZwYWdlX3BoeXMsICZwYWRkciwgcHJvdCk7 CisKKwlyZXR1cm4gLUVBRERSSU5VU0U7Cit9CisKK3N0YXRpYyBpbnQgcmtfaW9tbXVfbWFwKHN0 cnVjdCBpb21tdV9kb21haW4gKmRvbWFpbiwgdW5zaWduZWQgbG9uZyBfaW92YSwKKwkJCXBoeXNf YWRkcl90IHBhZGRyLCBzaXplX3Qgc2l6ZSwgaW50IHByb3QpCit7CisJc3RydWN0IHJrX2lvbW11 X2RvbWFpbiAqcmtfZG9tYWluID0gZG9tYWluLT5wcml2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7 CisJZG1hX2FkZHJfdCBpb3ZhID0gKGRtYV9hZGRyX3QpX2lvdmE7CisJdTMyICpwYWdlX3RhYmxl LCAqcHRlX2FkZHI7CisJaW50IHJldDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZya19kb21haW4t PmR0X2xvY2ssIGZsYWdzKTsKKworCS8qCisJICogcGdzaXplX2JpdG1hcCBzcGVjaWZpZXMgaW92 YSBzaXplcyB0aGF0IGZpdCBpbiBvbmUgcGFnZSB0YWJsZQorCSAqICgxMDI0IDQtS2lCIHBhZ2Vz ID0gNCBNaUIpLgorCSAqIFNvLCBzaXplIHdpbGwgYWx3YXlzIGJlIDQwOTYgPD0gc2l6ZSA8PSA0 MTk0MzA0LgorCSAqIFNpbmNlIGlvbW11X21hcCgpIGd1YXJhbnRlZXMgdGhhdCBib3RoIGlvdmEg YW5kIHNpemUgd2lsbCBiZQorCSAqIGFsaWduZWQsIHdlIHdpbGwgYWx3YXlzIG9ubHkgYmUgbWFw cGluZyBmcm9tIGEgc2luZ2xlIGR0ZSBoZXJlLgorCSAqLworCXBhZ2VfdGFibGUgPSBya19kdGVf Z2V0X3BhZ2VfdGFibGUocmtfZG9tYWluLCBpb3ZhKTsKKwlpZiAoSVNfRVJSKHBhZ2VfdGFibGUp KSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJrX2RvbWFpbi0+ZHRfbG9jaywgZmxhZ3Mp OworCQlyZXR1cm4gUFRSX0VSUihwYWdlX3RhYmxlKTsKKwl9CisKKwlwdGVfYWRkciA9ICZwYWdl X3RhYmxlW3JrX2lvdmFfcHRlX2luZGV4KGlvdmEpXTsKKwlyZXQgPSBya19pb21tdV9tYXBfaW92 YShya19kb21haW4sIHB0ZV9hZGRyLCBpb3ZhLCBwYWRkciwgc2l6ZSwgcHJvdCk7CisJc3Bpbl91 bmxvY2tfaXJxcmVzdG9yZSgmcmtfZG9tYWluLT5kdF9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4g cmV0OworfQorCitzdGF0aWMgc2l6ZV90IHJrX2lvbW11X3VubWFwKHN0cnVjdCBpb21tdV9kb21h aW4gKmRvbWFpbiwgdW5zaWduZWQgbG9uZyBfaW92YSwKKwkJCSAgICAgc2l6ZV90IHNpemUpCit7 CisJc3RydWN0IHJrX2lvbW11X2RvbWFpbiAqcmtfZG9tYWluID0gZG9tYWluLT5wcml2OworCXVu c2lnbmVkIGxvbmcgZmxhZ3M7CisJZG1hX2FkZHJfdCBpb3ZhID0gKGRtYV9hZGRyX3QpX2lvdmE7 CisJcGh5c19hZGRyX3QgcHRfcGh5czsKKwl1MzIgZHRlOworCXUzMiAqcHRlX2FkZHI7CisJc2l6 ZV90IHVubWFwX3NpemU7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcmtfZG9tYWluLT5kdF9sb2Nr LCBmbGFncyk7CisKKwkvKgorCSAqIHBnc2l6ZV9iaXRtYXAgc3BlY2lmaWVzIGlvdmEgc2l6ZXMg dGhhdCBmaXQgaW4gb25lIHBhZ2UgdGFibGUKKwkgKiAoMTAyNCA0LUtpQiBwYWdlcyA9IDQgTWlC KS4KKwkgKiBTbywgc2l6ZSB3aWxsIGFsd2F5cyBiZSA0MDk2IDw9IHNpemUgPD0gNDE5NDMwNC4K KwkgKiBTaW5jZSBpb21tdV91bm1hcCgpIGd1YXJhbnRlZXMgdGhhdCBib3RoIGlvdmEgYW5kIHNp emUgd2lsbCBiZQorCSAqIGFsaWduZWQsIHdlIHdpbGwgYWx3YXlzIG9ubHkgYmUgdW5tYXBwaW5n IGZyb20gYSBzaW5nbGUgZHRlIGhlcmUuCisJICovCisJZHRlID0gcmtfZG9tYWluLT5kdFtya19p b3ZhX2R0ZV9pbmRleChpb3ZhKV07CisJLyogSnVzdCByZXR1cm4gMCBpZiBpb3ZhIGlzIHVubWFw cGVkICovCisJaWYgKCFya19kdGVfaXNfcHRfdmFsaWQoZHRlKSkgeworCQlzcGluX3VubG9ja19p cnFyZXN0b3JlKCZya19kb21haW4tPmR0X2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIDA7CisJfQor CisJcHRfcGh5cyA9IHJrX2R0ZV9wdF9hZGRyZXNzKGR0ZSk7CisJcHRlX2FkZHIgPSAodTMyICop cGh5c190b192aXJ0KHB0X3BoeXMpICsgcmtfaW92YV9wdGVfaW5kZXgoaW92YSk7CisJdW5tYXBf c2l6ZSA9IHJrX2lvbW11X3VubWFwX2lvdmEocmtfZG9tYWluLCBwdGVfYWRkciwgaW92YSwgc2l6 ZSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZya19kb21haW4tPmR0X2xvY2ssIGZsYWdz KTsKKworCS8qIFNob290ZG93biBpb3RsYiBlbnRyaWVzIGZvciBpb3ZhIHJhbmdlIHRoYXQgd2Fz IGp1c3QgdW5tYXBwZWQgKi8KKwlya19pb21tdV96YXBfaW92YShya19kb21haW4sIGlvdmEsIHVu bWFwX3NpemUpOworCisJcmV0dXJuIHVubWFwX3NpemU7Cit9CisKK3N0YXRpYyBpbnQgcmtfaW9t bXVfYXR0YWNoX2RldmljZShzdHJ1Y3QgaW9tbXVfZG9tYWluICpkb21haW4sCisJCQkJICBzdHJ1 Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHJrX2lvbW11ICppb21tdSA9IGRldl9nZXRfZHJ2 ZGF0YShkZXYtPmFyY2hkYXRhLmlvbW11KTsKKwlzdHJ1Y3QgcmtfaW9tbXVfZG9tYWluICpya19k b21haW4gPSBkb21haW4tPnByaXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0Owor CXBoeXNfYWRkcl90IGR0ZV9hZGRyOworCisJLyoKKwkgKiBBbGxvdyAndmlydHVhbCBkZXZpY2Vz JyAoZS5nLiwgZHJtKSB0byBhdHRhY2ggdG8gZG9tYWluLgorCSAqIFN1Y2ggYSBkZXZpY2UgaGFz IGEgTlVMTCBhcmNoZGF0YS5pb21tdS4KKwkgKi8KKwlpZiAoIWlvbW11KQorCQlyZXR1cm4gMDsK KworCXJldCA9IHJrX2lvbW11X2VuYWJsZV9zdGFsbChpb21tdSk7CisJaWYgKHJldCkKKwkJcmV0 dXJuIHJldDsKKworCXJldCA9IHJrX2lvbW11X2ZvcmNlX3Jlc2V0KGlvbW11KTsKKwlpZiAocmV0 KQorCQlyZXR1cm4gcmV0OworCisJaW9tbXUtPmRvbWFpbiA9IGRvbWFpbjsKKworCXJldCA9IGRl dm1fcmVxdWVzdF9pcnEoZGV2LCBpb21tdS0+aXJxLCBya19pb21tdV9pcnEsCisJCQkgICAgICAg SVJRRl9TSEFSRUQsIGRldl9uYW1lKGRldiksIGlvbW11KTsKKwlpZiAocmV0KQorCQlyZXR1cm4g cmV0OworCisJZHRlX2FkZHIgPSB2aXJ0X3RvX3BoeXMocmtfZG9tYWluLT5kdCk7CisJcmtfaW9t bXVfd3JpdGUoaW9tbXUsIFJLX01NVV9EVEVfQUREUiwgZHRlX2FkZHIpOworCXJrX2lvbW11X2Nv bW1hbmQoaW9tbXUsIFJLX01NVV9DTURfWkFQX0NBQ0hFKTsKKwlya19pb21tdV93cml0ZShpb21t dSwgUktfTU1VX0lOVF9NQVNLLCBSS19NTVVfSVJRX01BU0spOworCisJcmV0ID0gcmtfaW9tbXVf ZW5hYmxlX3BhZ2luZyhpb21tdSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXNwaW5f bG9ja19pcnFzYXZlKCZya19kb21haW4tPmlvbW11c19sb2NrLCBmbGFncyk7CisJbGlzdF9hZGRf dGFpbCgmaW9tbXUtPm5vZGUsICZya19kb21haW4tPmlvbW11cyk7CisJc3Bpbl91bmxvY2tfaXJx cmVzdG9yZSgmcmtfZG9tYWluLT5pb21tdXNfbG9jaywgZmxhZ3MpOworCisJZGV2X2luZm8oZGV2 LCAiQXR0YWNoZWQgdG8gaW9tbXUgZG9tYWluXG4iKTsKKworCXJrX2lvbW11X2Rpc2FibGVfc3Rh bGwoaW9tbXUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHJrX2lvbW11X2RldGFj aF9kZXZpY2Uoc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tYWluLAorCQkJCSAgIHN0cnVjdCBkZXZp Y2UgKmRldikKK3sKKwlzdHJ1Y3QgcmtfaW9tbXUgKmlvbW11ID0gZGV2X2dldF9kcnZkYXRhKGRl di0+YXJjaGRhdGEuaW9tbXUpOworCXN0cnVjdCBya19pb21tdV9kb21haW4gKnJrX2RvbWFpbiA9 IGRvbWFpbi0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogQWxsb3cgJ3ZpcnR1 YWwgZGV2aWNlcycgKGVnIGRybSkgdG8gZGV0YWNoIGZyb20gZG9tYWluICovCisJaWYgKCFpb21t dSkKKwkJcmV0dXJuOworCisJaW9tbXUtPmRvbWFpbiA9IE5VTEw7CisKKwlzcGluX2xvY2tfaXJx c2F2ZSgmcmtfZG9tYWluLT5pb21tdXNfbG9jaywgZmxhZ3MpOworCWxpc3RfZGVsX2luaXQoJmlv bW11LT5ub2RlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZya19kb21haW4tPmlvbW11c19s b2NrLCBmbGFncyk7CisKKwlkZXZtX2ZyZWVfaXJxKGRldiwgaW9tbXUtPmlycSwgaW9tbXUpOwor CisJaW9tbXUtPmRvbWFpbiA9IE5VTEw7CisKKwkvKiBJZ25vcmUgZXJyb3Igd2hpbGUgZGlzYWJs aW5nLCBqdXN0IGtlZXAgZ29pbmcgKi8KKwlya19pb21tdV9lbmFibGVfc3RhbGwoaW9tbXUpOwor CXJrX2lvbW11X2Rpc2FibGVfcGFnaW5nKGlvbW11KTsKKwlya19pb21tdV93cml0ZShpb21tdSwg UktfTU1VX0lOVF9NQVNLLCAwKTsKKwlya19pb21tdV93cml0ZShpb21tdSwgUktfTU1VX0RURV9B RERSLCAwKTsKKwlya19pb21tdV9kaXNhYmxlX3N0YWxsKGlvbW11KTsKKworCWRldl9pbmZvKGRl diwgIkRldGFjaGVkIGZyb20gaW9tbXUgZG9tYWluXG4iKTsKK30KKworc3RhdGljIGludCBya19p b21tdV9kb21haW5faW5pdChzdHJ1Y3QgaW9tbXVfZG9tYWluICpkb21haW4pCit7CisJc3RydWN0 IHJrX2lvbW11X2RvbWFpbiAqcmtfZG9tYWluOworCisJcmtfZG9tYWluID0ga3phbGxvYyhzaXpl b2YoKnJrX2RvbWFpbiksIEdGUF9LRVJORUwpOworCWlmICghcmtfZG9tYWluKQorCQlyZXR1cm4g LUVOT01FTTsKKworCS8qCisJICogcmszMnh4IGlvbW11cyB1c2UgYSAyIGxldmVsIHBhZ2V0YWJs ZS4KKwkgKiBFYWNoIGxldmVsMSAoZHQpIGFuZCBsZXZlbDIgKHB0KSB0YWJsZSBoYXMgMTAyNCA0 LWJ5dGUgZW50cmllcy4KKwkgKiBBbGxvY2F0ZSBvbmUgNCBLaUIgcGFnZSBmb3IgZWFjaCB0YWJs ZS4KKwkgKi8KKwlya19kb21haW4tPmR0ID0gKHUzMiAqKWdldF96ZXJvZWRfcGFnZShHRlBfS0VS TkVMIHwgR0ZQX0RNQTMyKTsKKwlpZiAoIXJrX2RvbWFpbi0+ZHQpCisJCWdvdG8gZXJyX2R0Owor CisJcmtfdGFibGVfZmx1c2gocmtfZG9tYWluLT5kdCwgTlVNX0RUX0VOVFJJRVMpOworCisJc3Bp bl9sb2NrX2luaXQoJnJrX2RvbWFpbi0+aW9tbXVzX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZy a19kb21haW4tPmR0X2xvY2spOworCUlOSVRfTElTVF9IRUFEKCZya19kb21haW4tPmlvbW11cyk7 CisKKwlkb21haW4tPnByaXYgPSBya19kb21haW47CisKKwlyZXR1cm4gMDsKK2Vycl9kdDoKKwlr ZnJlZShya19kb21haW4pOworCXJldHVybiAtRU5PTUVNOworfQorCitzdGF0aWMgdm9pZCBya19p b21tdV9kb21haW5fZGVzdHJveShzdHJ1Y3QgaW9tbXVfZG9tYWluICpkb21haW4pCit7CisJc3Ry dWN0IHJrX2lvbW11X2RvbWFpbiAqcmtfZG9tYWluID0gZG9tYWluLT5wcml2OworCWludCBpOwor CisJV0FSTl9PTighbGlzdF9lbXB0eSgmcmtfZG9tYWluLT5pb21tdXMpKTsKKworCWZvciAoaSA9 IDA7IGkgPCBOVU1fRFRfRU5UUklFUzsgaSsrKSB7CisJCXUzMiBkdGUgPSBya19kb21haW4tPmR0 W2ldOworCQlpZiAocmtfZHRlX2lzX3B0X3ZhbGlkKGR0ZSkpIHsKKwkJCXBoeXNfYWRkcl90IHB0 X3BoeXMgPSBya19kdGVfcHRfYWRkcmVzcyhkdGUpOworCQkJdTMyICpwYWdlX3RhYmxlID0gcGh5 c190b192aXJ0KHB0X3BoeXMpOworCQkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXBhZ2VfdGFi bGUpOworCQl9CisJfQorCisJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXJrX2RvbWFpbi0+ZHQp OworCWtmcmVlKGRvbWFpbi0+cHJpdik7CisJZG9tYWluLT5wcml2ID0gTlVMTDsKK30KKworc3Rh dGljIGNvbnN0IHN0cnVjdCBpb21tdV9vcHMgcmtfaW9tbXVfb3BzID0geworCS5kb21haW5faW5p dCA9IHJrX2lvbW11X2RvbWFpbl9pbml0LAorCS5kb21haW5fZGVzdHJveSA9IHJrX2lvbW11X2Rv bWFpbl9kZXN0cm95LAorCS5hdHRhY2hfZGV2ID0gcmtfaW9tbXVfYXR0YWNoX2RldmljZSwKKwku ZGV0YWNoX2RldiA9IHJrX2lvbW11X2RldGFjaF9kZXZpY2UsCisJLm1hcCA9IHJrX2lvbW11X21h cCwKKwkudW5tYXAgPSBya19pb21tdV91bm1hcCwKKwkuaW92YV90b19waHlzID0gcmtfaW9tbXVf aW92YV90b19waHlzLAorCS5wZ3NpemVfYml0bWFwID0gUktfSU9NTVVfUEdTSVpFX0JJVE1BUCwK K307CisKK3N0YXRpYyBpbnQgcmtfaW9tbXVfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAq cGRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCXN0cnVjdCBya19p b21tdSAqaW9tbXU7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisKKwlpb21tdSA9IGRldm1fa3ph bGxvYyhkZXYsIHNpemVvZigqaW9tbXUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWlvbW11KQorCQly ZXR1cm4gLUVOT01FTTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGlvbW11KTsKKwlp b21tdS0+ZGV2ID0gZGV2OworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElP UkVTT1VSQ0VfTUVNLCAwKTsKKwlpb21tdS0+YmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgm cGRldi0+ZGV2LCByZXMpOworCWlmIChJU19FUlIoaW9tbXUtPmJhc2UpKQorCQlyZXR1cm4gUFRS X0VSUihpb21tdS0+YmFzZSk7CisKKwlpb21tdS0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2 LCAwKTsKKwlpZiAoaW9tbXUtPmlycSA8IDApIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8g Z2V0IElSUSwgJWRcbiIsIGlvbW11LT5pcnEpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCXJl dHVybiAwOworfQorCitzdGF0aWMgaW50IHJrX2lvbW11X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1f ZGV2aWNlICpwZGV2KQoreworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX09GCitzdGF0 aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBya19pb21tdV9kdF9pZHNbXSA9IHsKKwl7IC5j b21wYXRpYmxlID0gInJvY2tjaGlwLGlvbW11IiB9LAorCXsgLyogc2VudGluZWwgKi8gfQorfTsK K01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHJrX2lvbW11X2R0X2lkcyk7CisjZW5kaWYKKworc3Rh dGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgcmtfaW9tbXVfZHJpdmVyID0geworCS5wcm9iZSA9 IHJrX2lvbW11X3Byb2JlLAorCS5yZW1vdmUgPSBya19pb21tdV9yZW1vdmUsCisJLmRyaXZlciA9 IHsKKwkJICAgLm5hbWUgPSAicmtfaW9tbXUiLAorCQkgICAub3duZXIgPSBUSElTX01PRFVMRSwK KwkJICAgLm9mX21hdGNoX3RhYmxlID0gb2ZfbWF0Y2hfcHRyKHJrX2lvbW11X2R0X2lkcyksCisJ fSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHJrX2lvbW11X2luaXQodm9pZCkKK3sKKwlpbnQg cmV0OworCisJcmV0ID0gYnVzX3NldF9pb21tdSgmcGxhdGZvcm1fYnVzX3R5cGUsICZya19pb21t dV9vcHMpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gcGxhdGZvcm1fZHJp dmVyX3JlZ2lzdGVyKCZya19pb21tdV9kcml2ZXIpOworfQorc3RhdGljIHZvaWQgX19leGl0IHJr X2lvbW11X2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmcmtfaW9t bXVfZHJpdmVyKTsKK30KKworc3Vic3lzX2luaXRjYWxsKHJrX2lvbW11X2luaXQpOworbW9kdWxl X2V4aXQocmtfaW9tbXVfZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiSU9NTVUgQVBJIGZv ciBSb2NrY2hpcCIpOworTU9EVUxFX0FVVEhPUigiU2ltb24gWHVlIDx4eG1Acm9jay1jaGlwcy5j b20+IGFuZCBEYW5pZWwgS3VydHogPGRqa3VydHpAY2hyb21pdW0ub3JnPiIpOworTU9EVUxFX0FM SUFTKCJwbGF0Zm9ybTpyb2NrY2hpcC1pb21tdSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIp OwotLSAKMi4xLjAucmMyLjIwNi5nZWRiMDNlNQoKX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX18KaW9tbXUgbWFpbGluZyBsaXN0CmlvbW11QGxpc3RzLmxpbnV4 LWZvdW5kYXRpb24ub3JnCmh0dHBzOi8vbGlzdHMubGludXhmb3VuZGF0aW9uLm9yZy9tYWlsbWFu L2xpc3RpbmZvL2lvbW11