From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jerome Anand Subject: [PATCH V3 3/5] ALSA: add Intel HDMI LPE audio driver for BYT/CHT-T Date: Tue, 10 Jan 2017 10:38:39 +0530 Message-ID: <20170110050841.31900-4-jerome.anand@intel.com> References: <20170110050841.31900-1-jerome.anand@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <20170110050841.31900-1-jerome.anand@intel.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: intel-gfx@lists.freedesktop.org, alsa-devel@alsa-project.org Cc: tiwai@suse.de, broonie@kernel.org, rakesh.a.ughreja@intel.com List-Id: alsa-devel@alsa-project.org T24gQmF5dHJhaWwgYW5kIENoZXJyeXRyYWlsLCBIRGF1ZGlvIG1heSBiZSBmdXNlZCBvdXQgb3Ig ZGlzYWJsZWQKYnkgdGhlIEJJT1MuIFRoaXMgZHJpdmVyIGVuYWJsZXMgYW4gYWx0ZXJuYXRlIHBh dGggdG8gdGhlIGk5MTUKZGlzcGxheSByZWdpc3RlcnMgYW5kIERNQS4KCkFsdGhvdWdoIHRoZXJl IGlzIG5vIGhhcmR3YXJlIHBhdGggYmV0d2VlbiBpOTE1IGRpc3BsYXkgYW5kIExQRS9TU1QKYXVk aW8gY2x1c3RlcnMsIHRoaXMgSERNSSBjYXBhYmlsaXR5IGlzIHJlZmVycmVkIHRvIGluIHRoZSBk b2N1bWVudGF0aW9uCmFzICJIRE1JIExQRSBBdWRpbyIgc28gd2Uga2VlcCB0aGUgbmFtZSBmb3Ig Y29uc2lzdGVuY3kuIFRoZXJlIGlzIG5vCmhhcmR3YXJlIHBhdGggb3IgY29udHJvbCBkZXBlbmRl bmNpZXMgd2l0aCB0aGUgTFBFL1NTVCBEU1AgZnVuY3Rpb25hbGl0eS4KClRoZSBoZG1pLWxwZS1h dWRpbyBkcml2ZXIgd2lsbCBiZSBwcm9iZWQgd2hlbiB0aGUgaTkxNSBkcml2ZXIgY3JlYXRlcwph IGNoaWxkIHBsYXRmb3JtIGRldmljZS4KClNpbmNlIHRoaXMgZHJpdmVyIGlzIG5laXRoZXIgU29D IG5vciBQQ0ksIGEgbmV3IHg4NiBmb2xkZXIgaXMgYWRkZWQKQWRkaXRpb25hbCBpbmRpcmVjdGlv bnMgaW4gdGhlIGNvZGUgd2lsbCBiZSBjbGVhbmVkIHVwIGluIHRoZSBuZXh0IHNlcmllcwp0byBh aWQgc21vb3RoZXIgRFAgaW50ZWdyYXRpb24KClNpZ25lZC1vZmYtYnk6IFBpZXJyZS1Mb3VpcyBC b3NzYXJ0IDxwaWVycmUtbG91aXMuYm9zc2FydEBsaW51eC5pbnRlbC5jb20+ClNpZ25lZC1vZmYt Ynk6IEplcm9tZSBBbmFuZCA8amVyb21lLmFuYW5kQGludGVsLmNvbT4KLS0tCiBzb3VuZC9LY29u ZmlnICAgICAgICAgICAgICAgICAgICB8ICAgMiArCiBzb3VuZC9NYWtlZmlsZSAgICAgICAgICAg ICAgICAgICB8ICAgMiArLQogc291bmQveDg2L0tjb25maWcgICAgICAgICAgICAgICAgfCAgMTYg Kwogc291bmQveDg2L01ha2VmaWxlICAgICAgICAgICAgICAgfCAgIDYgKwogc291bmQveDg2L2lu dGVsX2hkbWlfbHBlX2F1ZGlvLmMgfCA2MTQgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysKIHNvdW5kL3g4Ni9pbnRlbF9oZG1pX2xwZV9hdWRpby5oIHwgNjg1ICsrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKwogNiBmaWxlcyBjaGFuZ2VkLCAxMzI0IGluc2Vy dGlvbnMoKyksIDEgZGVsZXRpb24oLSkKIGNyZWF0ZSBtb2RlIDEwMDY0NCBzb3VuZC94ODYvS2Nv bmZpZwogY3JlYXRlIG1vZGUgMTAwNjQ0IHNvdW5kL3g4Ni9NYWtlZmlsZQogY3JlYXRlIG1vZGUg MTAwNjQ0IHNvdW5kL3g4Ni9pbnRlbF9oZG1pX2xwZV9hdWRpby5jCiBjcmVhdGUgbW9kZSAxMDA2 NDQgc291bmQveDg2L2ludGVsX2hkbWlfbHBlX2F1ZGlvLmgKCmRpZmYgLS1naXQgYS9zb3VuZC9L Y29uZmlnIGIvc291bmQvS2NvbmZpZwppbmRleCA1YTI0MGUwLi5lZTJlNjlhIDEwMDY0NAotLS0g YS9zb3VuZC9LY29uZmlnCisrKyBiL3NvdW5kL0tjb25maWcKQEAgLTEwOCw2ICsxMDgsOCBAQCBz b3VyY2UgInNvdW5kL3BhcmlzYy9LY29uZmlnIgogCiBzb3VyY2UgInNvdW5kL3NvYy9LY29uZmln IgogCitzb3VyY2UgInNvdW5kL3g4Ni9LY29uZmlnIgorCiBlbmRpZiAjIFNORAogCiBtZW51Y29u ZmlnIFNPVU5EX1BSSU1FCmRpZmYgLS1naXQgYS9zb3VuZC9NYWtlZmlsZSBiL3NvdW5kL01ha2Vm aWxlCmluZGV4IGM0MWJkZjUuLjZkZTQ1ZDIgMTAwNjQ0Ci0tLSBhL3NvdW5kL01ha2VmaWxlCisr KyBiL3NvdW5kL01ha2VmaWxlCkBAIC01LDcgKzUsNyBAQCBvYmotJChDT05GSUdfU09VTkQpICs9 IHNvdW5kY29yZS5vCiBvYmotJChDT05GSUdfU09VTkRfUFJJTUUpICs9IG9zcy8KIG9iai0kKENP TkZJR19ETUFTT1VORCkgKz0gb3NzLwogb2JqLSQoQ09ORklHX1NORCkgKz0gY29yZS8gaTJjLyBk cml2ZXJzLyBpc2EvIHBjaS8gcHBjLyBhcm0vIHNoLyBzeW50aC8gdXNiLyBcCi0JZmlyZXdpcmUv IHNwYXJjLyBzcGkvIHBhcmlzYy8gcGNtY2lhLyBtaXBzLyBzb2MvIGF0bWVsLyBoZGEvCisJZmly ZXdpcmUvIHNwYXJjLyBzcGkvIHBhcmlzYy8gcGNtY2lhLyBtaXBzLyBzb2MvIGF0bWVsLyBoZGEv IHg4Ni8KIG9iai0kKENPTkZJR19TTkRfQU9BKSArPSBhb2EvCiAKICMgVGhpcyBvbmUgbXVzdCBi ZSBjb21waWxhYmxlIGV2ZW4gaWYgc291bmQgaXMgY29uZmlndXJlZCBvdXQKZGlmZiAtLWdpdCBh L3NvdW5kL3g4Ni9LY29uZmlnIGIvc291bmQveDg2L0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2 NDQKaW5kZXggMDAwMDAwMC4uZTkyOTdkMAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3g4Ni9L Y29uZmlnCkBAIC0wLDAgKzEsMTYgQEAKK21lbnVjb25maWcgU05EX1g4NgorCXRyaXN0YXRlICJY ODYgc291bmQgZGV2aWNlcyIKKwktLS1oZWxwLS0tCisKKwkgIFg4NiBzb3VuZCBkZXZpY2VzIHRo YXQgZG9uJ3QgZmFsbCB1bmRlciBTb0Mgb3IgUENJIGNhdGVnb3JpZXMKKworaWYgU05EX1g4Ngor Citjb25maWcgSERNSV9MUEVfQVVESU8KKwl0cmlzdGF0ZSAiSERNSSBhdWRpbyB3aXRob3V0IEhE YXVkaW8gb24gSW50ZWwgQXRvbSBwbGF0Zm9ybXMiCisJZGVwZW5kcyBvbiBEUk1fSTkxNQorCWRl ZmF1bHQgbgorCWhlbHAKKwkgQ2hvb3NlIHRoaXMgb3B0aW9uIHRvIHN1cHBvcnQgSERNSSBMUEUg QXVkaW8gbW9kZQorCitlbmRpZgkjIFNORF9YODYKZGlmZiAtLWdpdCBhL3NvdW5kL3g4Ni9NYWtl ZmlsZSBiL3NvdW5kL3g4Ni9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAw MDAwLi41NGQwMDJkCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQveDg2L01ha2VmaWxlCkBAIC0w LDAgKzEsNiBAQAorY2NmbGFncy15ICs9IC1JaW5jbHVkZS9kcm0KKworc25kLWhkbWktbHBlLWF1 ZGlvLW9ianMgKz0gXAorCWludGVsX2hkbWlfbHBlX2F1ZGlvLm8KKworb2JqLSQoQ09ORklHX0hE TUlfTFBFX0FVRElPKSArPSBzbmQtaGRtaS1scGUtYXVkaW8ubwpkaWZmIC0tZ2l0IGEvc291bmQv eDg2L2ludGVsX2hkbWlfbHBlX2F1ZGlvLmMgYi9zb3VuZC94ODYvaW50ZWxfaGRtaV9scGVfYXVk aW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmViY2UxCi0tLSAvZGV2 L251bGwKKysrIGIvc291bmQveDg2L2ludGVsX2hkbWlfbHBlX2F1ZGlvLmMKQEAgLTAsMCArMSw2 MTQgQEAKKy8qCisgKiAgaW50ZWxfaGRtaV9scGVfYXVkaW8uYyAtIEludGVsIEhETUkgTFBFIGF1 ZGlvIGRyaXZlciBmb3IgQXRvbSBwbGF0Zm9ybXMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDE2 IEludGVsIENvcnAKKyAqICBBdXRob3JzOgorICoJCUplcm9tZSBBbmFuZCA8amVyb21lLmFuYW5k QGludGVsLmNvbT4KKyAqCQlBcmF2aW5kIFNpZGRhcHBhamkgPGFyYXZpbmR4LnNpZGRhcHBhamlA aW50ZWwuY29tPgorICogIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+ fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisgKgorICogIFRoaXMgcHJvZ3JhbSBp cyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Cisg KiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBh cyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9u IDIgb2YgdGhlIExpY2Vuc2UuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBp biB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqICBXSVRIT1VUIEFOWSBX QVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hB TlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBH TlUKKyAqICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICog fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+ fn5+fn5+fn5+fn5+fn5+fn4KKyAqLworCisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNl Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxcmV0dXJuLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJy dXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Cisj aW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVk ZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5k L3BjbV9wYXJhbXMuaD4KKyNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CisjaW5jbHVkZSA8c291 bmQvY29udHJvbC5oPgorI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KKyNpbmNsdWRlIDxkcm0v aW50ZWxfbHBlX2F1ZGlvLmg+CisjaW5jbHVkZSAiaW50ZWxfaGRtaV9scGVfYXVkaW8uaCIKKwor LyogZ2xvYmFscyovCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpobHBlX3BkZXY7CitpbnQgaGxw ZV9zdGF0ZTsKK3VuaW9uIG90bV9oZG1pX2VsZF90IGhscGVfZWxkOworCitzdHJ1Y3QgaGRtaV9s cGVfYXVkaW9fY3R4IHsKKwlpbnQgaXJxOworCXZvaWQgX19pb21lbSAqbW1pb19zdGFydDsKKwlo YWRfZXZlbnRfY2FsbF9iYWNrIGhhZF9ldmVudF9jYWxsYmFja3M7CisJc3RydWN0IHNuZF9pbnRl bF9oYWRfaW50ZXJmYWNlICpoYWRfaW50ZXJmYWNlOworCXZvaWQgKmhhZF9wdnRfZGF0YTsKKwlp bnQgdG1kc19jbG9ja19zcGVlZDsKKwl1bnNpZ25lZCBpbnQgaGFkX2NvbmZpZ19vZmZzZXQ7CisJ aW50IGhkbWlfYXVkaW9faW50ZXJydXB0X21hc2s7CisJc3RydWN0IHdvcmtfc3RydWN0IGhkbWlf YXVkaW9fd3E7Cit9OworCitzdGF0aWMgaW5saW5lIHZvaWQgaGRtaV9zZXRfZWxkKHZvaWQgKmVs ZCkKK3sKKwlpbnQgc2l6ZTsKKworCUJVSUxEX0JVR19PTihzaXplb2YoaGxwZV9lbGQpID4gSERN SV9NQVhfRUxEX0JZVEVTKTsKKworCXNpemUgPSBzaXplb2YoaGxwZV9lbGQpOworCW1lbWNweSgo dm9pZCAqKSZobHBlX2VsZCwgZWxkLCBzaXplKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgaGRt aV9nZXRfZWxkKHZvaWQgKmVsZCkKK3sKKwl1aW50OF90ICplbGRfZGF0YSA9ICh1aW50OF90ICop JmhscGVfZWxkOworCisJbWVtY3B5KGVsZCwgKHZvaWQgKikmaGxwZV9lbGQsIHNpemVvZihobHBl X2VsZCkpOworCisJcHJpbnRfaGV4X2R1bXBfYnl0ZXMoImVsZDogIiwgRFVNUF9QUkVGSVhfTk9O RSwgZWxkX2RhdGEsCisJCQlzaXplb2YoaGxwZV9lbGQpKTsKKwlyZXR1cm4gMDsKK30KKworCitz dGF0aWMgaW5saW5lIHN0cnVjdCBoZG1pX2xwZV9hdWRpb19jdHggKmdldF9oZG1pX2NvbnRleHQo dm9pZCkKK3sKKwlzdHJ1Y3QgaGRtaV9scGVfYXVkaW9fY3R4ICpjdHg7CisKKwljdHggPSBwbGF0 Zm9ybV9nZXRfZHJ2ZGF0YShobHBlX3BkZXYpOworCXJldHVybiBjdHg7Cit9CisKKy8qCisgKiBy ZXR1cm4gd2hldGhlciBIRE1JIGF1ZGlvIGRldmljZSBpcyBidXN5LgorICovCitib29sIG1pZF9o ZG1pX2F1ZGlvX2lzX2J1c3kodm9pZCAqZGRldikKK3sKKwlzdHJ1Y3QgaGRtaV9scGVfYXVkaW9f Y3R4ICpjdHg7CisJaW50IGhkbWlfYXVkaW9fYnVzeSA9IDA7CisJc3RydWN0IGhkbWlfYXVkaW9f ZXZlbnQgaGRtaV9hdWRpb19ldmVudDsKKworCWRldl9kYmcoJmhscGVfcGRldi0+ZGV2LCAiJXM6 IEVudGVyIiwgIF9fZnVuY19fKTsKKworCWN0eCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKGhscGVf cGRldik7CisKKwlpZiAoaGxwZV9zdGF0ZSA9PSBoZG1pX2Nvbm5lY3Rvcl9zdGF0dXNfZGlzY29u bmVjdGVkKSB7CisJCS8qIEhETUkgaXMgbm90IGNvbm5lY3RlZCwgYXNzdW1pbmcgYXVkaW8gZGV2 aWNlIGlzIGlkbGUuICovCisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlpZiAoY3R4LT5oYWRfaW50 ZXJmYWNlKSB7CisJCWhkbWlfYXVkaW9fZXZlbnQudHlwZSA9IEhBRF9FVkVOVF9RVUVSWV9JU19B VURJT19CVVNZOworCQloZG1pX2F1ZGlvX2J1c3kgPSBjdHgtPmhhZF9pbnRlcmZhY2UtPnF1ZXJ5 KAorCQkJCWN0eC0+aGFkX3B2dF9kYXRhLAorCQkJCWhkbWlfYXVkaW9fZXZlbnQpOworCQlyZXR1 cm4gaGRtaV9hdWRpb19idXN5ICE9IDA7CisJfQorCXJldHVybiBmYWxzZTsKK30KKworLyoKKyAq IHJldHVybiB3aGV0aGVyIEhETUkgYXVkaW8gZGV2aWNlIGlzIHN1c3BlbmRlZC4KKyAqLworYm9v bCBtaWRfaGRtaV9hdWRpb19zdXNwZW5kKHZvaWQgKmRkZXYpCit7CisJc3RydWN0IGhkbWlfbHBl X2F1ZGlvX2N0eCAqY3R4OworCXN0cnVjdCBoZG1pX2F1ZGlvX2V2ZW50IGhkbWlfYXVkaW9fZXZl bnQ7CisJaW50IHJldCA9IDA7CisKKwljdHggPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShobHBlX3Bk ZXYpOworCisJaWYgKGhscGVfc3RhdGUgPT0gaGRtaV9jb25uZWN0b3Jfc3RhdHVzX2Rpc2Nvbm5l Y3RlZCkgeworCQkvKiBIRE1JIGlzIG5vdCBjb25uZWN0ZWQsIGFzc3VtaW5nIGF1ZGlvIGRldmlj ZQorCQkgKiBpcyBzdXNwZW5kZWQgYWxyZWFkeS4KKwkJICovCisJCXJldHVybiB0cnVlOworCX0K KworCWRldl9kYmcoJmhscGVfcGRldi0+ZGV2LCAiJXM6IGhscGVfc3RhdGUgJWQiLCAgX19mdW5j X18sCisJCQlobHBlX3N0YXRlKTsKKworCWlmIChjdHgtPmhhZF9pbnRlcmZhY2UpIHsKKwkJaGRt aV9hdWRpb19ldmVudC50eXBlID0gMDsKKwkJcmV0ID0gY3R4LT5oYWRfaW50ZXJmYWNlLT5zdXNw ZW5kKGN0eC0+aGFkX3B2dF9kYXRhLAorCQkJCWhkbWlfYXVkaW9fZXZlbnQpOworCQlyZXR1cm4g KHJldCA9PSAwKSA/IHRydWUgOiBmYWxzZTsKKwl9CisJcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQg bWlkX2hkbWlfYXVkaW9fcmVzdW1lKHZvaWQgKmRkZXYpCit7CisJc3RydWN0IGhkbWlfbHBlX2F1 ZGlvX2N0eCAqY3R4OworCisJY3R4ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoaGxwZV9wZGV2KTsK KworCWlmIChobHBlX3N0YXRlID09IGhkbWlfY29ubmVjdG9yX3N0YXR1c19kaXNjb25uZWN0ZWQp IHsKKwkJLyogSERNSSBpcyBub3QgY29ubmVjdGVkLCB0aGVyZSBpcyBubyBuZWVkCisJCSAqIHRv IHJlc3VtZSBhdWRpbyBkZXZpY2UuCisJCSAqLworCQlyZXR1cm47CisJfQorCisJZGV2X2RiZygm aGxwZV9wZGV2LT5kZXYsICIlczogaGxwZV9zdGF0ZSAlZCIsICBfX2Z1bmNfXywgaGxwZV9zdGF0 ZSk7CisKKwlpZiAoY3R4LT5oYWRfaW50ZXJmYWNlKQorCQljdHgtPmhhZF9pbnRlcmZhY2UtPnJl c3VtZShjdHgtPmhhZF9wdnRfZGF0YSk7Cit9CisKK3ZvaWQgbWlkX2hkbWlfYXVkaW9fc2lnbmFs X2V2ZW50KGVudW0gaGFkX2V2ZW50X3R5cGUgZXZlbnQpCit7CisJc3RydWN0IGhkbWlfbHBlX2F1 ZGlvX2N0eCAqY3R4OworCisJZGV2X2RiZygmaGxwZV9wZGV2LT5kZXYsICIlczogRW50ZXJcbiIs IF9fZnVuY19fKTsKKworCWN0eCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKGhscGVfcGRldik7CisK KwlpZiAoY3R4LT5oYWRfZXZlbnRfY2FsbGJhY2tzKQorCQkoKmN0eC0+aGFkX2V2ZW50X2NhbGxi YWNrcykoZXZlbnQsCisJCQljdHgtPmhhZF9wdnRfZGF0YSk7Cit9CisKKy8qKgorICogaGRtaV9h dWRpb193cml0ZToKKyAqIHVzZWQgdG8gd3JpdGUgaW50byBkaXNwbGF5IGNvbnRyb2xsZXIgSERN SSBhdWRpbyByZWdpc3RlcnMuCisgKgorICovCitzdGF0aWMgaW50IGhkbWlfYXVkaW9fd3JpdGUo dWludDMyX3QgcmVnLCB1aW50MzJfdCB2YWwpCit7CisJc3RydWN0IGhkbWlfbHBlX2F1ZGlvX2N0 eCAqY3R4OworCisJY3R4ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoaGxwZV9wZGV2KTsKKworCWRl dl9kYmcoJmhscGVfcGRldi0+ZGV2LCAiJXM6IHJlZ1sweCV4XSA9IDB4JXhcbiIsIF9fZnVuY19f LCByZWcsIHZhbCk7CisKKwlpb3dyaXRlMzIodmFsLCAoY3R4LT5tbWlvX3N0YXJ0K3JlZykpOwor CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaGRtaV9hdWRpb19yZWFkOgorICogdXNlZCB0byBn ZXQgdGhlIHJlZ2lzdGVyIHZhbHVlIHJlYWQgZnJvbQorICogZGlzcGxheSBjb250cm9sbGVyIEhE TUkgYXVkaW8gcmVnaXN0ZXJzLgorICovCitzdGF0aWMgaW50IGhkbWlfYXVkaW9fcmVhZCh1aW50 MzJfdCByZWcsIHVpbnQzMl90ICp2YWwpCit7CisJc3RydWN0IGhkbWlfbHBlX2F1ZGlvX2N0eCAq Y3R4OworCisJY3R4ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoaGxwZV9wZGV2KTsKKwkqdmFsID0g aW9yZWFkMzIoY3R4LT5tbWlvX3N0YXJ0K3JlZyk7CisJZGV2X2RiZygmaGxwZV9wZGV2LT5kZXYs ICIlczogcmVnWzB4JXhdID0gMHgleFxuIiwgX19mdW5jX18sIHJlZywgKnZhbCk7CisJcmV0dXJu IDA7Cit9CisKKy8qKgorICogaGRtaV9hdWRpb19ybXc6CisgKiB1c2VkIHRvIHVwZGF0ZSB0aGUg bWFza2VkIGJpdHMgaW4gZGlzcGxheSBjb250cm9sbGVyIEhETUkKKyAqIGF1ZGlvIHJlZ2lzdGVy cy4KKyAqLworc3RhdGljIGludCBoZG1pX2F1ZGlvX3Jtdyh1aW50MzJfdCByZWcsIHVpbnQzMl90 IHZhbCwgdWludDMyX3QgbWFzaykKK3sKKwlzdHJ1Y3QgaGRtaV9scGVfYXVkaW9fY3R4ICpjdHg7 CisJdWludDMyX3QgdmFsX3RtcCA9IDA7CisKKwljdHggPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YSho bHBlX3BkZXYpOworCisJdmFsX3RtcCA9ICh2YWwgJiBtYXNrKSB8CisJCQkoKGlvcmVhZDMyKGN0 eC0+bW1pb19zdGFydCArIHJlZykpICYgfm1hc2spOworCisJaW93cml0ZTMyKHZhbF90bXAsIChj dHgtPm1taW9fc3RhcnQrcmVnKSk7CisJZGV2X2RiZygmaGxwZV9wZGV2LT5kZXYsICIlczogcmVn WzB4JXhdID0gMHgleFxuIiwgX19mdW5jX18sIHJlZywgdmFsX3RtcCk7CisKKwlyZXR1cm4gMDsK K30KKworLyoqCisgKiBoZG1pX2F1ZGlvX2dldF9jYXBzOgorICogdXNlZCB0byByZXR1cm4gdGhl IEhETUkgYXVkaW8gY2FwYWJpbGl0aWVzLgorICogZS5nLiByZXNvbHV0aW9uLCBmcmFtZSByYXRl LgorICovCitzdGF0aWMgaW50IGhkbWlfYXVkaW9fZ2V0X2NhcHMoZW51bSBoYWRfY2Fwc19saXN0 IGdldF9lbGVtZW50LAorCQkJdm9pZCAqY2FwYWJpbGl0aWVzKQoreworCXN0cnVjdCBoZG1pX2xw ZV9hdWRpb19jdHggKmN0eDsKKwlpbnQgcmV0ID0gMDsKKworCWN0eCA9IGdldF9oZG1pX2NvbnRl eHQoKTsKKworCWRldl9kYmcoJmhscGVfcGRldi0+ZGV2LCAiJXM6IEVudGVyXG4iLCBfX2Z1bmNf Xyk7CisKKwlzd2l0Y2ggKGdldF9lbGVtZW50KSB7CisJY2FzZSBIQURfR0VUX0VMRDoKKwkJcmV0 ID0gaGRtaV9nZXRfZWxkKGNhcGFiaWxpdGllcyk7CisJCWJyZWFrOworCWNhc2UgSEFEX0dFVF9E SVNQTEFZX1JBVEU6CisJCS8qIFRvRG86IFZlcmlmeSBpZiBzYW1wbGluZyBmcmVxIGxvZ2ljIGlz IGNvcnJlY3QgKi8KKwkJbWVtY3B5KGNhcGFiaWxpdGllcywgJihjdHgtPnRtZHNfY2xvY2tfc3Bl ZWQpLAorCQkJc2l6ZW9mKHVpbnQzMl90KSk7CisJCWRldl9kYmcoJmhscGVfcGRldi0+ZGV2LCAi JXM6IHRtZHNfY2xvY2tfc3BlZWQgPSAweCV4XG4iLCBfX2Z1bmNfXywKKwkJCQljdHgtPnRtZHNf Y2xvY2tfc3BlZWQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1 cm4gcmV0OworfQorCisvKioKKyAqIGhkbWlfYXVkaW9fZ2V0X3JlZ2lzdGVyX2Jhc2UKKyAqIHVz ZWQgdG8gZ2V0IHRoZSBjdXJyZW50IGhkbWkgYmFzZSBhZGRyZXNzCisgKi8KK2ludCBoZG1pX2F1 ZGlvX2dldF9yZWdpc3Rlcl9iYXNlKHVpbnQzMl90ICoqcmVnX2Jhc2UsCisJCXVpbnQzMl90ICpj b25maWdfb2Zmc2V0KQoreworCXN0cnVjdCBoZG1pX2xwZV9hdWRpb19jdHggKmN0eDsKKworCWN0 eCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKGhscGVfcGRldik7CisJKnJlZ19iYXNlID0gKHVpbnQz Ml90ICopKGN0eC0+bW1pb19zdGFydCk7CisJKmNvbmZpZ19vZmZzZXQgPSBjdHgtPmhhZF9jb25m aWdfb2Zmc2V0OworCWRldl9kYmcoJmhscGVfcGRldi0+ZGV2LCAiJXM6IHJlZ19iYXNlID0gMHgl cCwgY2ZnX29mZiA9IDB4JXhcbiIsIF9fZnVuY19fLAorCQkJKnJlZ19iYXNlLCAqY29uZmlnX29m ZnNldCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaGRtaV9hdWRpb19zZXRfY2FwczoKKyAq IHVzZWQgdG8gc2V0IHRoZSBIRE1JIGF1ZGlvIGNhcGFiaWxpdGllcy4KKyAqIGUuZy4gQXVkaW8g SU5ULgorICovCitpbnQgaGRtaV9hdWRpb19zZXRfY2FwcyhlbnVtIGhhZF9jYXBzX2xpc3Qgc2V0 X2VsZW1lbnQsCisJCQl2b2lkICpjYXBhYmlsdGllcykKK3sKKwlzdHJ1Y3QgaGRtaV9scGVfYXVk aW9fY3R4ICpjdHg7CisKKwljdHggPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShobHBlX3BkZXYpOwor CisJZGV2X2RiZygmaGxwZV9wZGV2LT5kZXYsICIlczogY2FwX2lkID0gMHgleFxuIiwgX19mdW5j X18sIHNldF9lbGVtZW50KTsKKworCXN3aXRjaCAoc2V0X2VsZW1lbnQpIHsKKwljYXNlIEhBRF9T RVRfRU5BQkxFX0FVRElPX0lOVDoKKwkJeworCQkJdWludDMyX3Qgc3RhdHVzX3JlZzsKKworCQkJ aGRtaV9hdWRpb19yZWFkKEFVRF9IRE1JX1NUQVRVU192MiArCisJCQkJY3R4LT5oYWRfY29uZmln X29mZnNldCwgJnN0YXR1c19yZWcpOworCQkJc3RhdHVzX3JlZyB8PQorCQkJCUhETUlfQVVESU9f QlVGRkVSX0RPTkUgfCBIRE1JX0FVRElPX1VOREVSUlVOOworCQkJaGRtaV9hdWRpb193cml0ZShB VURfSERNSV9TVEFUVVNfdjIgKworCQkJCWN0eC0+aGFkX2NvbmZpZ19vZmZzZXQsIHN0YXR1c19y ZWcpOworCQkJaGRtaV9hdWRpb19yZWFkKEFVRF9IRE1JX1NUQVRVU192MiArCisJCQkJY3R4LT5o YWRfY29uZmlnX29mZnNldCwgJnN0YXR1c19yZWcpOworCisJCX0KKwkJYnJlYWs7CisJZGVmYXVs dDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgIGhkbWlf YXVkaW9fcmVnaXN0ZXJzX29wcyBoZG1pX2F1ZGlvX3JlZ19vcHMgPSB7CisJLmhkbWlfYXVkaW9f Z2V0X3JlZ2lzdGVyX2Jhc2UgPSBoZG1pX2F1ZGlvX2dldF9yZWdpc3Rlcl9iYXNlLAorCS5oZG1p X2F1ZGlvX3JlYWRfcmVnaXN0ZXIgPSBoZG1pX2F1ZGlvX3JlYWQsCisJLmhkbWlfYXVkaW9fd3Jp dGVfcmVnaXN0ZXIgPSBoZG1pX2F1ZGlvX3dyaXRlLAorCS5oZG1pX2F1ZGlvX3JlYWRfbW9kaWZ5 ID0gaGRtaV9hdWRpb19ybXcsCit9OworCitzdGF0aWMgc3RydWN0IGhkbWlfYXVkaW9fcXVlcnlf c2V0X29wcyBoZG1pX2F1ZGlvX2dldF9zZXRfb3BzID0geworCS5oZG1pX2F1ZGlvX2dldF9jYXBz ID0gaGRtaV9hdWRpb19nZXRfY2FwcywKKwkuaGRtaV9hdWRpb19zZXRfY2FwcyA9IGhkbWlfYXVk aW9fc2V0X2NhcHMsCit9OworCitpbnQgbWlkX2hkbWlfYXVkaW9fc2V0dXAoCisJCWhhZF9ldmVu dF9jYWxsX2JhY2sgYXVkaW9fY2FsbGJhY2tzLAorCQlzdHJ1Y3QgaGRtaV9hdWRpb19yZWdpc3Rl cnNfb3BzICpyZWdfb3BzLAorCQlzdHJ1Y3QgaGRtaV9hdWRpb19xdWVyeV9zZXRfb3BzICpxdWVy eV9vcHMpCit7CisJc3RydWN0IGhkbWlfbHBlX2F1ZGlvX2N0eCAqY3R4OworCisJY3R4ID0gcGxh dGZvcm1fZ2V0X2RydmRhdGEoaGxwZV9wZGV2KTsKKworCWRldl9kYmcoJmhscGVfcGRldi0+ZGV2 LCAiJXM6IGNhbGxlZFxuIiwgIF9fZnVuY19fKTsKKworCXJlZ19vcHMtPmhkbWlfYXVkaW9fZ2V0 X3JlZ2lzdGVyX2Jhc2UgPQorCQkoaGRtaV9hdWRpb19yZWdfb3BzLmhkbWlfYXVkaW9fZ2V0X3Jl Z2lzdGVyX2Jhc2UpOworCXJlZ19vcHMtPmhkbWlfYXVkaW9fcmVhZF9yZWdpc3RlciA9CisJCSho ZG1pX2F1ZGlvX3JlZ19vcHMuaGRtaV9hdWRpb19yZWFkX3JlZ2lzdGVyKTsKKwlyZWdfb3BzLT5o ZG1pX2F1ZGlvX3dyaXRlX3JlZ2lzdGVyID0KKwkJKGhkbWlfYXVkaW9fcmVnX29wcy5oZG1pX2F1 ZGlvX3dyaXRlX3JlZ2lzdGVyKTsKKwlyZWdfb3BzLT5oZG1pX2F1ZGlvX3JlYWRfbW9kaWZ5ID0K KwkJKGhkbWlfYXVkaW9fcmVnX29wcy5oZG1pX2F1ZGlvX3JlYWRfbW9kaWZ5KTsKKwlxdWVyeV9v cHMtPmhkbWlfYXVkaW9fZ2V0X2NhcHMgPQorCQloZG1pX2F1ZGlvX2dldF9zZXRfb3BzLmhkbWlf YXVkaW9fZ2V0X2NhcHM7CisJcXVlcnlfb3BzLT5oZG1pX2F1ZGlvX3NldF9jYXBzID0KKwkJaGRt aV9hdWRpb19nZXRfc2V0X29wcy5oZG1pX2F1ZGlvX3NldF9jYXBzOworCisJY3R4LT5oYWRfZXZl bnRfY2FsbGJhY2tzID0gYXVkaW9fY2FsbGJhY2tzOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQg X2hhZF93cShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJbWlkX2hkbWlfYXVkaW9fc2ln bmFsX2V2ZW50KEhBRF9FVkVOVF9IT1RfUExVRyk7Cit9CisKK2ludCBtaWRfaGRtaV9hdWRpb19y ZWdpc3RlcihzdHJ1Y3Qgc25kX2ludGVsX2hhZF9pbnRlcmZhY2UgKmRyaXZlciwKKwkJCQl2b2lk ICpoYWRfZGF0YSkKK3sKKwlzdHJ1Y3QgaGRtaV9scGVfYXVkaW9fY3R4ICpjdHg7CisKKwljdHgg PSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShobHBlX3BkZXYpOworCisJZGV2X2RiZygmaGxwZV9wZGV2 LT5kZXYsICIlczogY2FsbGVkXG4iLCBfX2Z1bmNfXyk7CisKKwljdHgtPmhhZF9wdnRfZGF0YSA9 IGhhZF9kYXRhOworCWN0eC0+aGFkX2ludGVyZmFjZSA9IGRyaXZlcjsKKworCS8qIFRoZSBBdWRp byBkcml2ZXIgaXMgbG9hZGluZyBub3cgYW5kIHdlIG5lZWQgdG8gbm90aWZ5CisJICogaXQgaWYg dGhlcmUgaXMgYW4gSERNSSBkZXZpY2UgYXR0YWNoZWQKKwkgKi8KKwlJTklUX1dPUksoJmN0eC0+ aGRtaV9hdWRpb193cSwgX2hhZF93cSk7CisJZGV2X2RiZygmaGxwZV9wZGV2LT5kZXYsICIlczog U2NoZWR1bGluZyBIRE1JIGF1ZGlvIHdvcmsgcXVldWVcbiIsIF9fZnVuY19fKTsKKwlzY2hlZHVs ZV93b3JrKCZjdHgtPmhkbWlfYXVkaW9fd3EpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBp cnFyZXR1cm5fdCBkaXNwbGF5X3BpcGVfaW50ZXJydXB0X2hhbmRsZXIoaW50IGlycSwgdm9pZCAq ZGV2X2lkKQoreworCXUzMiBhdWRpb19zdGF0LCBhdWRpb19yZWc7CisKKwlzdHJ1Y3QgaGRtaV9s cGVfYXVkaW9fY3R4ICpjdHg7CisKKwlkZXZfZGJnKCZobHBlX3BkZXYtPmRldiwgIiVzOiBFbnRl clxuIiwgX19mdW5jX18pOworCisJY3R4ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoaGxwZV9wZGV2 KTsKKworCWF1ZGlvX3JlZyA9IGN0eC0+aGFkX2NvbmZpZ19vZmZzZXQgKyBBVURfSERNSV9TVEFU VVNfdjI7CisJaGRtaV9hdWRpb19yZWFkKGF1ZGlvX3JlZywgJmF1ZGlvX3N0YXQpOworCisJaWYg KGF1ZGlvX3N0YXQgJiBIRE1JX0FVRElPX1VOREVSUlVOKSB7CisJCWhkbWlfYXVkaW9fd3JpdGUo YXVkaW9fcmVnLCBIRE1JX0FVRElPX1VOREVSUlVOKTsKKwkJbWlkX2hkbWlfYXVkaW9fc2lnbmFs X2V2ZW50KAorCQkJCUhBRF9FVkVOVF9BVURJT19CVUZGRVJfVU5ERVJSVU4pOworCX0KKworCWlm IChhdWRpb19zdGF0ICYgSERNSV9BVURJT19CVUZGRVJfRE9ORSkgeworCQloZG1pX2F1ZGlvX3dy aXRlKGF1ZGlvX3JlZywgSERNSV9BVURJT19CVUZGRVJfRE9ORSk7CisJCW1pZF9oZG1pX2F1ZGlv X3NpZ25hbF9ldmVudCgKKwkJCQlIQURfRVZFTlRfQVVESU9fQlVGRkVSX0RPTkUpOworCX0KKwor CXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHZvaWQgbm90aWZ5X2F1ZGlvX2xwZSh2 b2lkICphdWRpb19wdHIpCit7CisJc3RydWN0IGhkbWlfbHBlX2F1ZGlvX2N0eCAqY3R4ID0gZ2V0 X2hkbWlfY29udGV4dCgpOworCXN0cnVjdCBpbnRlbF9oZG1pX2xwZV9hdWRpb19wZGF0YSAqcGRh dGEgPSBobHBlX3BkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBpbnRlbF9oZG1pX2xw ZV9hdWRpb19lbGQgKmVsZCA9IGF1ZGlvX3B0cjsKKworCWlmIChwZGF0YS0+aGRtaV9jb25uZWN0 ZWQgIT0gdHJ1ZSkgeworCisJCWRldl9kYmcoJmhscGVfcGRldi0+ZGV2LCAiJXM6IEV2ZW50OiBI QURfTk9USUZZX0hPVF9VTlBMVUdcbiIsCisJCQlfX2Z1bmNfXyk7CisKKwkJaWYgKGhscGVfc3Rh dGUgPT0gaGRtaV9jb25uZWN0b3Jfc3RhdHVzX2Nvbm5lY3RlZCkgeworCisJCQlobHBlX3N0YXRl ID0KKwkJCQloZG1pX2Nvbm5lY3Rvcl9zdGF0dXNfZGlzY29ubmVjdGVkOworCisJCQltaWRfaGRt aV9hdWRpb19zaWduYWxfZXZlbnQoCisJCQkJSEFEX0VWRU5UX0hPVF9VTlBMVUcpOworCQl9IGVs c2UKKwkJCWRldl9kYmcoJmhscGVfcGRldi0+ZGV2LCAiJXM6IEFscmVhZHkgVW5wbHVnZ2VkIVxu IiwgX19mdW5jX18pOworCisJfSBlbHNlIGlmIChlbGQgIT0gTlVMTCkgeworCisJCWhkbWlfc2V0 X2VsZChlbGQtPmVsZF9kYXRhKTsKKworCQltaWRfaGRtaV9hdWRpb19zaWduYWxfZXZlbnQoSEFE X0VWRU5UX0hPVF9QTFVHKTsKKworCQlobHBlX3N0YXRlID0gaGRtaV9jb25uZWN0b3Jfc3RhdHVz X2Nvbm5lY3RlZDsKKworCQlkZXZfZGJnKCZobHBlX3BkZXYtPmRldiwgIiVzOiBIQURfTk9USUZZ X0VMRCA6IHBvcnQgPSAlZCwgdG1kcyA9ICVkXG4iLAorCQkJX19mdW5jX18sIGVsZC0+cG9ydF9p ZCwKKwkJCXBkYXRhLT50bWRzX2Nsb2NrX3NwZWVkKTsKKworCQlpZiAocGRhdGEtPnRtZHNfY2xv Y2tfc3BlZWQpIHsKKwkJCWN0eC0+dG1kc19jbG9ja19zcGVlZCA9IHBkYXRhLT50bWRzX2Nsb2Nr X3NwZWVkOworCQkJbWlkX2hkbWlfYXVkaW9fc2lnbmFsX2V2ZW50KEhBRF9FVkVOVF9NT0RFX0NI QU5HSU5HKTsKKwkJfQorCX0gZWxzZQorCQlkZXZfZGJnKCZobHBlX3BkZXYtPmRldiwgIiVzOiBF dmVudDogTlVMTCBFRElEISFcbiIsIF9fZnVuY19fKTsKK30KKworLyoqCisgKiBoZG1pX2xwZV9h dWRpb19wcm9iZSAtIHN0YXJ0IGJyaWRnZSB3aXRoIGk5MTUKKyAqCisgKiBUaGlzIGZ1bmN0aW9u IGlzIGNhbGxlZCB3aGVuIHRoZSBpOTE1IGRyaXZlciBjcmVhdGVzIHRoZSBoZG1pLWxwZS1hdWRp bworICogcGxhdGZvcm0gZGV2aWNlLiBDYXJkIGNyZWF0aW9uIGlzIGRlZmVycmVkIHVudGlsIGEg aG90IHBsdWcgZXZlbnQgaXMKKyAqIHJlY2VpdmVkCisgKi8KK3N0YXRpYyBpbnQgaGRtaV9scGVf YXVkaW9fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgaGRt aV9scGVfYXVkaW9fY3R4ICpjdHg7CisJc3RydWN0IGludGVsX2hkbWlfbHBlX2F1ZGlvX3BkYXRh ICpwZGF0YTsKKwlpbnQgaXJxOworCXN0cnVjdCByZXNvdXJjZSAqcmVzX21taW87CisJdm9pZCBf X2lvbWVtICptbWlvX3N0YXJ0OworCWludCByZXQgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ19p cnE7CisJc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIGNoZXJyeXZpZXdfaWRzW10g PSB7CisJCXtQQ0lfREVWSUNFKDB4ODA4NiwgMHgyMmIwKX0sCisJCXtQQ0lfREVWSUNFKDB4ODA4 NiwgMHgyMmIxKX0sCisJCXtQQ0lfREVWSUNFKDB4ODA4NiwgMHgyMmIyKX0sCisJCXtQQ0lfREVW SUNFKDB4ODA4NiwgMHgyMmIzKX0sCisJCXt9CisJfTsKKworCWRldl9kYmcoJmhscGVfcGRldi0+ ZGV2LCAiRW50ZXIgJXNcbiIsIF9fZnVuY19fKTsKKworCS8qVEJEOnJlbW92ZSBnbG9iYWxzKi8K KwlobHBlX3BkZXYgPSBwZGV2OworCWhscGVfc3RhdGUgPSBoZG1pX2Nvbm5lY3Rvcl9zdGF0dXNf ZGlzY29ubmVjdGVkOworCisJLyogZ2V0IHJlc291cmNlcyAqLworCWlycSA9IHBsYXRmb3JtX2dl dF9pcnEocGRldiwgMCk7CisJaWYgKGlycSA8IDApIHsKKwkJZGV2X2VycigmaGxwZV9wZGV2LT5k ZXYsICJDb3VsZCBub3QgZ2V0IGlycSByZXNvdXJjZVxuIik7CisJCXJldHVybiAtRU5PREVWOwor CX0KKworCXJlc19tbWlvID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0Vf TUVNLCAwKTsKKwlpZiAoIXJlc19tbWlvKSB7CisJCWRldl9lcnIoJmhscGVfcGRldi0+ZGV2LCAi Q291bGQgbm90IGdldCBJT19NRU0gcmVzb3VyY2VzXG4iKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9 CisKKwlkZXZfZGJnKCZobHBlX3BkZXYtPmRldiwgIiVzOiBtbWlvX3N0YXJ0ID0gMHgleCwgbW1p b19lbmQgPSAweCV4XG4iLCBfX2Z1bmNfXywKKwkJKHVuc2lnbmVkIGludClyZXNfbW1pby0+c3Rh cnQsICh1bnNpZ25lZCBpbnQpcmVzX21taW8tPmVuZCk7CisKKwltbWlvX3N0YXJ0ID0gaW9yZW1h cF9ub2NhY2hlKHJlc19tbWlvLT5zdGFydCwKKwkJCQkoc2l6ZV90KSgocmVzX21taW8tPmVuZCAt IHJlc19tbWlvLT5zdGFydCkKKwkJCQkJCSsgMSkpOworCWlmICghbW1pb19zdGFydCkgeworCQlk ZXZfZXJyKCZobHBlX3BkZXYtPmRldiwgIkNvdWxkIG5vdCBnZXQgaW9yZW1hcFxuIik7CisJCXJl dHVybiAtRUFDQ0VTOworCX0KKworCS8qIHNldHVwIGludGVycnVwdCBoYW5kbGVyICovCisJcmV0 ID0gcmVxdWVzdF9pcnEoaXJxLCBkaXNwbGF5X3BpcGVfaW50ZXJydXB0X2hhbmRsZXIsCisJCQkw LAorCQkJcGRldi0+bmFtZSwKKwkJCU5VTEwpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIo JmhscGVfcGRldi0+ZGV2LCAicmVxdWVzdF9pcnEgZmFpbGVkXG4iKTsKKwkJaW91bm1hcChtbWlv X3N0YXJ0KTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogYWxsb2MgYW5kIHNhdmUgY29u dGV4dCAqLworCWN0eCA9IGt6YWxsb2Moc2l6ZW9mKCpjdHgpLCBHRlBfS0VSTkVMKTsKKwlpZiAo Y3R4ID09IE5VTEwpIHsKKwkJZnJlZV9pcnEoaXJxLCBOVUxMKTsKKwkJaW91bm1hcChtbWlvX3N0 YXJ0KTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJY3R4LT5pcnEgPSBpcnE7CisJZGV2X2Ri ZygmaGxwZV9wZGV2LT5kZXYsICJoZG1pIGxwZSBhdWRpbzogaXJxIG51bSA9ICVkXG4iLCBpcnEp OworCWN0eC0+bW1pb19zdGFydCA9IG1taW9fc3RhcnQ7CisJY3R4LT50bWRzX2Nsb2NrX3NwZWVk ID0gRElTX1NBTVBMRV9SQVRFXzE0OF81OworCisJaWYgKHBjaV9kZXZfcHJlc2VudChjaGVycnl2 aWV3X2lkcykpIHsKKwkJZGV2X2RiZygmaGxwZV9wZGV2LT5kZXYsICIlczogQ2hlcnJ5dHJhaWwg TFBFIC0gRGV0ZWN0ZWRcbiIsIF9fZnVuY19fKTsKKwkJY3R4LT5oYWRfY29uZmlnX29mZnNldCA9 IEFVRElPX0hETUlfQ09ORklHX0M7CisJfSBlbHNlIHsKKwkJZGV2X2RiZygmaGxwZV9wZGV2LT5k ZXYsICIlczogQmF5dHJhaWwgTFBFIC0gQXNzdW1lXG4iLCBfX2Z1bmNfXyk7CisJCWN0eC0+aGFk X2NvbmZpZ19vZmZzZXQgPSBBVURJT19IRE1JX0NPTkZJR19BOworCX0KKworCXBkYXRhID0gcGRl di0+ZGV2LnBsYXRmb3JtX2RhdGE7CisKKwlpZiAocGRhdGEgPT0gTlVMTCkgeworCQlkZXZfZXJy KCZobHBlX3BkZXYtPmRldiwgIiVzOiBxdWl0OiBwZGF0YSBub3QgYWxsb2NhdGVkIGJ5IGk5MTUh IVxuIiwgX19mdW5jX18pOworCQlrZnJlZShjdHgpOworCQlmcmVlX2lycShpcnEsIE5VTEwpOwor CQlpb3VubWFwKG1taW9fc3RhcnQpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlwbGF0Zm9y bV9zZXRfZHJ2ZGF0YShwZGV2LCBjdHgpOworCisJZGV2X2RiZygmaGxwZV9wZGV2LT5kZXYsICJo ZG1pIGxwZSBhdWRpbzogc2V0dGluZyBwaW4gZWxkIG5vdGlmeSBjYWxsYmFja1xuIik7CisKKwlz cGluX2xvY2tfaXJxc2F2ZSgmcGRhdGEtPmxwZV9hdWRpb19zbG9jaywgZmxhZ19pcnEpOworCXBk YXRhLT5ub3RpZnlfYXVkaW9fbHBlID0gbm90aWZ5X2F1ZGlvX2xwZTsKKworCWlmIChwZGF0YS0+ bm90aWZ5X3BlbmRpbmcpIHsKKworCQlkZXZfZGJnKCZobHBlX3BkZXYtPmRldiwgIiVzOiBoYW5k bGUgcGVuZGluZyBub3RpZmljYXRpb25cbiIsIF9fZnVuY19fKTsKKwkJbm90aWZ5X2F1ZGlvX2xw ZSgmcGRhdGEtPmVsZCk7CisJCXBkYXRhLT5ub3RpZnlfcGVuZGluZyA9IGZhbHNlOworCX0KKwlz cGluX3VubG9ja19pcnFyZXN0b3JlKCZwZGF0YS0+bHBlX2F1ZGlvX3Nsb2NrLCBmbGFnX2lycSk7 CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGhkbWlfbHBlX2F1ZGlvX3JlbW92ZSAtIHN0 b3AgYnJpZGdlIHdpdGggaTkxNQorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4g dGhlIHBsYXRmb3JtIGRldmljZSBpcyBkZXN0cm95ZWQuIFRoZSBzb3VuZAorICogY2FyZCBzaG91 bGQgaGF2ZSBiZWVuIHJlbW92ZWQgb24gaG90IHBsdWcgZXZlbnQuCisgKi8KK3N0YXRpYyBpbnQg aGRtaV9scGVfYXVkaW9fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJ c3RydWN0IGhkbWlfbHBlX2F1ZGlvX2N0eCAqY3R4OworCisJZGV2X2RiZygmaGxwZV9wZGV2LT5k ZXYsICJFbnRlciAlc1xuIiwgX19mdW5jX18pOworCisJLyogZ2V0IGNvbnRleHQsIHJlbGVhc2Ug cmVzb3VyY2VzICovCisJY3R4ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJaW91bm1h cChjdHgtPm1taW9fc3RhcnQpOworCWZyZWVfaXJxKGN0eC0+aXJxLCBOVUxMKTsKKwlrZnJlZShj dHgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhkbWlfbHBlX2F1ZGlvX3N1c3BlbmQo c3RydWN0IHBsYXRmb3JtX2RldmljZSAqcHRfZGV2LAorCQkJCXBtX21lc3NhZ2VfdCBzdGF0ZSkK K3sKKwlkZXZfZGJnKCZobHBlX3BkZXYtPmRldiwgIkVudGVyICVzXG4iLCBfX2Z1bmNfXyk7CisJ bWlkX2hkbWlfYXVkaW9fc3VzcGVuZChOVUxMKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlu dCBoZG1pX2xwZV9hdWRpb19yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcHRfZGV2KQor eworCWRldl9kYmcoJmhscGVfcGRldi0+ZGV2LCAiRW50ZXIgJXNcbiIsIF9fZnVuY19fKTsKKwlt aWRfaGRtaV9hdWRpb19yZXN1bWUoTlVMTCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1 Y3QgcGxhdGZvcm1fZHJpdmVyIGhkbWlfbHBlX2F1ZGlvX2RyaXZlciA9IHsKKwkuZHJpdmVyCQk9 IHsKKwkJLm5hbWUgID0gImhkbWktbHBlLWF1ZGlvIiwKKwl9LAorCS5wcm9iZSAgICAgICAgICA9 IGhkbWlfbHBlX2F1ZGlvX3Byb2JlLAorCS5yZW1vdmUJCT0gaGRtaV9scGVfYXVkaW9fcmVtb3Zl LAorCS5zdXNwZW5kCT0gaGRtaV9scGVfYXVkaW9fc3VzcGVuZCwKKwkucmVzdW1lCQk9IGhkbWlf bHBlX2F1ZGlvX3Jlc3VtZQorfTsKKworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihoZG1pX2xwZV9h dWRpb19kcml2ZXIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX0FMSUFTKCJw bGF0Zm9ybTpoZG1pX2xwZV9hdWRpbyIpOwpkaWZmIC0tZ2l0IGEvc291bmQveDg2L2ludGVsX2hk bWlfbHBlX2F1ZGlvLmggYi9zb3VuZC94ODYvaW50ZWxfaGRtaV9scGVfYXVkaW8uaApuZXcgZmls ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDkyOTMxCi0tLSAvZGV2L251bGwKKysrIGIv c291bmQveDg2L2ludGVsX2hkbWlfbHBlX2F1ZGlvLmgKQEAgLTAsMCArMSw2ODUgQEAKKy8qCisg KiAgIGludGVsX2hkbWlfbHBlX2F1ZGlvLmggLSBJbnRlbCBIRE1JIExQRSBhdWRpbyBkcml2ZXIK KyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDE2IEludGVsIENvcnAKKyAqICBBdXRob3JzOglTYWls YWphIEJhbmRhcnVwYWxsaSA8c2FpbGFqYS5iYW5kYXJ1cGFsbGlAaW50ZWwuY29tPgorICoJCVJh bWVzaCBCYWJ1IEsgViA8cmFtZXNoLmJhYnVAaW50ZWwuY29tPgorICoJCVZhaWJoYXYgQWdhcndh bCA8dmFpYmhhdi5hZ2Fyd2FsQGludGVsLmNvbT4KKyAqCQlKZXJvbWUgQW5hbmQgPGplcm9tZS5h bmFuZEBpbnRlbC5jb20+CisgKgkJQXJhdmluZCBTaWRkYXBwYWppIDxhcmF2aW5keC5zaWRkYXBw YWppQGludGVsLmNvbT4KKyAqICB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+ fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMg ZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICog IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMg cHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAy IG9mIHRoZSBMaWNlbnNlLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4g dGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiAgV0lUSE9VVCBBTlkgV0FS UkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5U QUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05V CisgKiAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIH5+ fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+ fn5+fn5+fn5+fgorICovCisjaWZuZGVmIF9fSU5URUxfSERNSV9MUEVfQVVESU9fSAorI2RlZmlu ZSBfX0lOVEVMX0hETUlfTFBFX0FVRElPX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Cisj aW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNp bmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CisjaW5jbHVkZSA8c291bmQvYXNvdW5kZWYuaD4K KyNpbmNsdWRlIDxzb3VuZC9jb250cm9sLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisKKyNk ZWZpbmUgSE1ESV9MUEVfQVVESU9fRFJJVkVSX05BTUUJCSJpbnRlbC1oZG1pLWxwZS1hdWRpbyIK KyNkZWZpbmUgSEFEX01BWF9ERVZJQ0VTCQkxCisjZGVmaW5lIEhBRF9NSU5fQ0hBTk5FTAkJMgor I2RlZmluZSBIQURfTUFYX0NIQU5ORUwJCTgKKyNkZWZpbmUgSEFEX05VTV9PRl9SSU5HX0JVRlMJ NAorCisvKiBBc3N1bWUgMTkyS0h6LCA4Y2hhbm5lbCwgMjVtc2VjIHBlcmlvZCAqLworI2RlZmlu ZSBIQURfTUFYX0JVRkZFUgkJKDYwMCoxMDI0KQorI2RlZmluZSBIQURfTUlOX0JVRkZFUgkJKDMy KjEwMjQpCisjZGVmaW5lIEhBRF9NQVhfUEVSSU9EUwkJNAorI2RlZmluZSBIQURfTUlOX1BFUklP RFMJCTQKKyNkZWZpbmUgSEFEX01BWF9QRVJJT0RfQllURVMJKEhBRF9NQVhfQlVGRkVSL0hBRF9N SU5fUEVSSU9EUykKKyNkZWZpbmUgSEFEX01JTl9QRVJJT0RfQllURVMJMjU2CisjZGVmaW5lIEhB RF9GSUZPX1NJWkUJCTAgLyogZmlmbyBub3QgYmVpbmcgdXNlZCAqLworI2RlZmluZSBNQVhfU1BF QUtFUlMJCTgKKy8qIFRPRE86IEFkZCBvd24gdGx2IHdoZW4gY2hhbm5lbCBtYXAgaXMgcG9ydGVk IGZvciB1c2VyIHNwYWNlICovCisjZGVmaW5lIFVTRV9BTFNBX0RFRkFVTFRfVExWCisKKyNkZWZp bmUgQVVEX1NBTVBMRV9SQVRFXzMyCTMyMDAwCisjZGVmaW5lIEFVRF9TQU1QTEVfUkFURV80NF8x CTQ0MTAwCisjZGVmaW5lIEFVRF9TQU1QTEVfUkFURV80OAk0ODAwMAorI2RlZmluZSBBVURfU0FN UExFX1JBVEVfODhfMgk4ODIwMAorI2RlZmluZSBBVURfU0FNUExFX1JBVEVfOTYJOTYwMDAKKyNk ZWZpbmUgQVVEX1NBTVBMRV9SQVRFXzE3Nl80CTE3NjQwMAorI2RlZmluZSBBVURfU0FNUExFX1JB VEVfMTkyCTE5MjAwMAorCisjZGVmaW5lIEhBRF9NSU5fUkFURQkJQVVEX1NBTVBMRV9SQVRFXzMy CisjZGVmaW5lIEhBRF9NQVhfUkFURQkJQVVEX1NBTVBMRV9SQVRFXzE5MgorCisjZGVmaW5lIERJ U19TQU1QTEVfUkFURV8yNV8yCTI1MjAwCisjZGVmaW5lIERJU19TQU1QTEVfUkFURV8yNwkyNzAw MAorI2RlZmluZSBESVNfU0FNUExFX1JBVEVfNTQJNTQwMDAKKyNkZWZpbmUgRElTX1NBTVBMRV9S QVRFXzc0XzI1CTc0MjUwCisjZGVmaW5lIERJU19TQU1QTEVfUkFURV8xNDhfNQkxNDg1MDAKKyNk ZWZpbmUgSEFEX1JFR19XSURUSAkJMHgwOAorI2RlZmluZSBIQURfTUFYX0hXX0JVRlMJCTB4MDQK KyNkZWZpbmUgSEFEX01BWF9ESVBfV09SRFMJCTE2CisjZGVmaW5lIElOVEVMX0hBRAkJIkludGVs SGRtaUxwZUF1ZGlvIgorCisvKiBfQVVEX0NPTkZJRyByZWdpc3RlciBNQVNLICovCisjZGVmaW5l IEFVRF9DT05GSUdfTUFTS19VTkRFUlJVTgkweEMwMDAwMDAwCisjZGVmaW5lIEFVRF9DT05GSUdf TUFTS19TUkRCRwkJMHgwMDAwMDAwMgorI2RlZmluZSBBVURfQ09ORklHX01BU0tfRlVOQ1JTVAkJ MHgwMDAwMDAwMQorCisjZGVmaW5lIE1BWF9DTlQJCQkweEZGCisjZGVmaW5lIEhBRF9TVVNQRU5E X0RFTEFZCTEwMDAKKworI2RlZmluZSBPVE1fSERNSV9FTERfU0laRSAxMjgKKwordW5pb24gb3Rt X2hkbWlfZWxkX3QgeworCXVuc2lnbmVkIGNoYXIgZWxkX2RhdGFbT1RNX0hETUlfRUxEX1NJWkVd OworCXN0cnVjdCB7CisJCS8qIEJ5dGVbMF0gPSBFTEQgVmVyc2lvbiBOdW1iZXIgKi8KKwkJdW5p b24geworCQkJdW5zaWduZWQgY2hhciAgIGJ5dGUwOworCQkJc3RydWN0IHsKKwkJCQl1bnNpZ25l ZCBjaGFyIHJlc2VydmVkOjM7IC8qIFJlc2VyZiAqLworCQkJCXVuc2lnbmVkIGNoYXIgZWxkX3Zl cjo1OyAvKiBFTEQgVmVyc2lvbiBOdW1iZXIgKi8KKwkJCQkvKiAwMDAwMGIgLSByZXNlcnZlZAor CQkJCSAqIDAwMDAxYiAtIGZpcnN0IHJldiwgb2Jzb2xldGVkCisJCQkJICogMDAwMTBiIC0gdmVy c2lvbiAyLCBzdXBwb3J0aW5nIENFQSB2ZXJzaW9uCisJCQkJICoJCQk4NjFEIG9yIGJlbG93CisJ CQkJICogMDAwMTFiOjExMTExYiAtIHJlc2VydmVkCisJCQkJICogZm9yIGZ1dHVyZQorCQkJCSAq LworCQkJfTsKKwkJfTsKKworCQkvKiBCeXRlWzFdID0gVmVuZG9yIFZlcnNpb24gRmllbGQgKi8K KwkJdW5pb24geworCQkJdW5zaWduZWQgY2hhciB2ZW5kb3JfdmVyc2lvbjsKKwkJCXN0cnVjdCB7 CisJCQkJdW5zaWduZWQgY2hhciByZXNlcnZlZDE6MzsKKwkJCQl1bnNpZ25lZCBjaGFyIHZlbGRf dmVyOjU7IC8qIFZlcnNpb24gbnVtYmVyIG9mIHRoZSBFTEQKKwkJCQkJCSAgICAgKiBleHRlbnNp b24uIFRoaXMgdmFsdWUgaXMKKwkJCQkJCSAgICAgKiBwcm92aXNpb25lZCBhbmQgdW5pcXVlIHRv CisJCQkJCQkgICAgICogZWFjaCB2ZW5kb3IuCisJCQkJCQkgICAgICovCisJCQl9OworCQl9Owor CisJCS8qIEJ5dGVbMl0gPSBCYXNlbGluZSBMZW5ndGggZmllbGQgKi8KKwkJdW5zaWduZWQgY2hh ciBiYXNlbGluZV9lbGRfbGVuZ3RoOyAvKiBMZW5ndGggb2YgdGhlIEJhc2VsaW5lIHN0cnVjdHVy ZQorCQkJCQkgICAgICAqCWRpdmlkZWQgYnkgRm91ci4KKwkJCQkJICAgICAgKi8KKworCQkvKiBC eXRlIFszXSA9IFJlc2VydmVkIGZvciBmdXR1cmUgdXNlICovCisJCXVuc2lnbmVkIGNoYXIgYnl0 ZTM7CisKKwkJLyogU3RhcnRpbmcgb2YgdGhlIEJhc2VMaW5lIEVFTEQgc3RydWN0dXJlCisJCSAq IEJ5dGVbNF0gPSBNb25pdG9yIE5hbWUgTGVuZ3RoCisJCSAqLworCQl1bmlvbiB7CisJCQl1bnNp Z25lZCBjaGFyIGJ5dGU0OworCQkJc3RydWN0IHsKKwkJCQl1bnNpZ25lZCBjaGFyIG1ubDo1Owor CQkJCXVuc2lnbmVkIGNoYXIgY2VhX2VkaWRfcmV2X2lkOjM7CisJCQl9OworCQl9OworCisJCS8q IEJ5dGVbNV0gPSBDYXBhYmlsaXRpZXMgKi8KKwkJdW5pb24geworCQkJdW5zaWduZWQgY2hhciBj YXBhYmlsaXRpZXM7CisJCQlzdHJ1Y3QgeworCQkJCXVuc2lnbmVkIGNoYXIgaGRjcDoxOyAvKiBI RENQIHN1cHBvcnQgKi8KKwkJCQl1bnNpZ25lZCBjaGFyIGFpX3N1cHBvcnQ6MTsgICAvKiBBSSBz dXBwb3J0ICovCisJCQkJdW5zaWduZWQgY2hhciBjb25uZWN0aW9uX3R5cGU6MjsgLyogQ29ubmVj dGlvbiB0eXBlCisJCQkJCQkJICAgICogMDAgLSBIRE1JCisJCQkJCQkJICAgICogMDEgLSBEUAor CQkJCQkJCSAgICAqIDEwIC0xMSAgUmVzZXJ2ZWQKKwkJCQkJCQkgICAgKiBmb3IgZnV0dXJlCisJ CQkJCQkJICAgICogY29ubmVjdGlvbiB0eXBlcworCQkJCQkJCSAgICAqLworCQkJCXVuc2lnbmVk IGNoYXIgc2FkYzo0OyAvKiBJbmRpY2F0ZXMgbnVtYmVyIG9mIDMgYnl0ZXMKKwkJCQkJCSAqIFNo b3J0IEF1ZGlvIERlc2NyaXB0b3JzLgorCQkJCQkJICovCisJCQl9OworCQl9OworCisJCS8qIEJ5 dGVbNl0gPSBBdWRpbyBTeW5jaCBEZWxheSAqLworCQl1bnNpZ25lZCBjaGFyIGF1ZGlvX3N5bmNo X2RlbGF5OyAvKiBBbW91bnQgb2YgdGltZSByZXBvcnRlZCBieSB0aGUKKwkJCQkJICAgICogc2lu ayB0aGF0IHRoZSB2aWRlbyB0cmFpbHMgYXVkaW8KKwkJCQkJICAgICogaW4gbWlsbGlzZWNvbmRz LgorCQkJCQkgICAgKi8KKworCQkvKiBCeXRlWzddID0gU3BlYWtlciBBbGxvY2F0aW9uIEJsb2Nr ICovCisJCXVuaW9uIHsKKwkJCXVuc2lnbmVkIGNoYXIgc3BlYWtlcl9hbGxvY2F0aW9uX2Jsb2Nr OworCQkJc3RydWN0IHsKKwkJCQl1bnNpZ25lZCBjaGFyIGZscjoxOyAvKkZyb250IExlZnQgYW5k IFJpZ2h0IGNoYW5uZWxzKi8KKwkJCQl1bnNpZ25lZCBjaGFyIGxmZToxOyAvKkxvdyBGcmVxdWVu Y3kgRWZmZWN0IGNoYW5uZWwqLworCQkJCXVuc2lnbmVkIGNoYXIgZmM6MTsgIC8qQ2VudGVyIHRy YW5zbWlzc2lvbiBjaGFubmVsKi8KKwkJCQl1bnNpZ25lZCBjaGFyIHJscjoxOyAvKlJlYXIgTGVm dCBhbmQgUmlnaHQgY2hhbm5lbHMqLworCQkJCXVuc2lnbmVkIGNoYXIgcmM6MTsgLypSZWFyIENl bnRlciBjaGFubmVsKi8KKwkJCQl1bnNpZ25lZCBjaGFyIGZscmM6MTsgLypGcm9udCBsZWZ0IGFu ZCBSaWdodCBvZiBDZW50ZXIKKwkJCQkJCSAqdHJhbnNtaXNzaW9uIGNoYW5uZWxzCisJCQkJCQkg Ki8KKwkJCQl1bnNpZ25lZCBjaGFyIHJscmM6MTsgLypSZWFyIGxlZnQgYW5kIFJpZ2h0IG9mIENl bnRlcgorCQkJCQkJICp0cmFuc21pc3Npb24gY2hhbm5lbHMKKwkJCQkJCSAqLworCQkJCXVuc2ln bmVkIGNoYXIgcmVzZXJ2ZWQzOjE7IC8qIFJlc2VydmVkICovCisJCQl9OworCQl9OworCisJCS8q IEJ5dGVbOCAtIDE1XSAtIDggQnl0ZSBwb3J0IGlkZW50aWZpY2F0aW9uIHZhbHVlICovCisJCXVu c2lnbmVkIGNoYXIgcG9ydF9pZF92YWx1ZVs4XTsKKworCQkvKiBCeXRlWzE2IC0gMTddIC0gMiBC eXRlIE1hbnVmYWN0dXJlciBJRCAqLworCQl1bnNpZ25lZCBjaGFyIG1hbnVmYWN0dXJlcl9pZFsy XTsKKworCQkvKiBCeXRlWzE4IC0gMTldIC0gMiBCeXRlIFByb2R1Y3QgSUQgKi8KKwkJdW5zaWdu ZWQgY2hhciBwcm9kdWN0X2lkWzJdOworCisJCS8qIEJ5dGUgWzIwLTgzXSAtIDY0IEJ5dGVzIG9m IEJhc2VMaW5lIERhdGEgKi8KKwkJdW5zaWduZWQgY2hhciBtbl9zYW5kX3NhZHNbNjRdOyAvKiBU aGlzIHdpbGwgaW5jbHVkZQorCQkJCQkgICAqIC0gQVNDSUkgc3RyaW5nIG9mIE1vbml0b3IgbmFt ZQorCQkJCQkgICAqIC0gTGlzdCBvZiAzIGJ5dGUgU0FEcworCQkJCQkgICAqIC0gWmVybyBwYWRk aW5nCisJCQkJCSAgICovCisKKwkJLyogVmVuZG9yIEVMRCBCbG9jayBzaG91bGQgY29udGludWUg aGVyZSEKKwkJICogTm8gVmVuZG9yIEVMRCBibG9jayBkZWZpbmVkIGFzIG9mIG5vdy4KKwkJICov CisJfSBfX3BhY2tlZDsKK307CisKKy8qKgorICogZW51bSBoYWRfc3RhdHVzIC0gQXVkaW8gc3Ry ZWFtIHN0YXRlcworICoKKyAqIEBTVFJFQU1fSU5JVDogU3RyZWFtIGluaXRpYWxpemVkCisgKiBA U1RSRUFNX1JVTk5JTkc6IFN0cmVhbSBydW5uaW5nCisgKiBAU1RSRUFNX1BBVVNFRDogU3RyZWFt IHBhdXNlZAorICogQFNUUkVBTV9EUk9QUEVEOiBTdHJlYW0gZHJvcHBlZAorICovCitlbnVtIGhh ZF9zdHJlYW1fc3RhdHVzIHsKKwlTVFJFQU1fSU5JVCA9IDAsCisJU1RSRUFNX1JVTk5JTkcgPSAx LAorCVNUUkVBTV9QQVVTRUQgPSAyLAorCVNUUkVBTV9EUk9QUEVEID0gMworfTsKKworLyoqCisg KiBlbnVtIGhhZF9zdGF0dXNfc3RyZWFtIC0gSEFEIHN0cmVhbSBzdGF0ZXMKKyAqLworZW51bSBo YWRfc3RhdHVzX3N0cmVhbSB7CisJSEFEX0lOSVQgPSAwLAorCUhBRF9SVU5OSU5HX1NUUkVBTSwK K307CisKK2VudW0gaGFkX2Rydl9zdGF0dXMgeworCUhBRF9EUlZfQ09OTkVDVEVELAorCUhBRF9E UlZfUlVOTklORywKKwlIQURfRFJWX0RJU0NPTk5FQ1RFRCwKKwlIQURfRFJWX1NVU1BFTkRFRCwK KwlIQURfRFJWX0VSUiwKK307CisKKy8qIGVudW0gaW50ZWxfaGFkX2F1ZF9idWZfdHlwZSAtIEhE TUkgY29udHJvbGxlciByaW5nIGJ1ZmZlciB0eXBlcyAqLworZW51bSBpbnRlbF9oYWRfYXVkX2J1 Zl90eXBlIHsKKwlIQURfQlVGX1RZUEVfQSA9IDAsCisJSEFEX0JVRl9UWVBFX0IgPSAxLAorCUhB RF9CVUZfVFlQRV9DID0gMiwKKwlIQURfQlVGX1RZUEVfRCA9IDMsCit9OworCitlbnVtIG51bV9h dWRfY2ggeworCUNIX1NURVJFTyA9IDAsCisJQ0hfVEhSRUVfRk9VUiA9IDEsCisJQ0hfRklWRV9T SVggPSAyLAorCUNIX1NFVkVOX0VJR0hUID0gMworfTsKKworLyogSERNSSBDb250cm9sbGVyIHJl Z2lzdGVyIG9mZnNldHMgLSBhdWRpbyBkb21haW4gY29tbW9uICovCisvKiBCYXNlIGFkZHJlc3Mg Zm9yIGJlbG93IHJlZ3MgPSAweDY1MDAwICovCitlbnVtIGhkbWlfY3RybF9yZWdfb2Zmc2V0X2Nv bW1vbiB7CisJQVVESU9fSERNSV9DT05GSUdfQQk9IDB4MDAwLAorCUFVRElPX0hETUlfQ09ORklH X0IgPSAweDgwMCwKKwlBVURJT19IRE1JX0NPTkZJR19DID0gMHg5MDAsCit9OworLyogSERNSSBj b250cm9sbGVyIHJlZ2lzdGVyIG9mZnNldHMgKi8KK2VudW0gaGRtaV9jdHJsX3JlZ19vZmZzZXRf djEgeworCUFVRF9DT05GSUcJCT0gMHgwLAorCUFVRF9DSF9TVEFUVVNfMAkJPSAweDA4LAorCUFV RF9DSF9TVEFUVVNfMQkJPSAweDBDLAorCUFVRF9IRE1JX0NUUwkJPSAweDEwLAorCUFVRF9OX0VO QUJMRQkJPSAweDE0LAorCUFVRF9TQU1QTEVfUkFURQkJPSAweDE4LAorCUFVRF9CVUZfQ09ORklH CQk9IDB4MjAsCisJQVVEX0JVRl9DSF9TV0FQCQk9IDB4MjQsCisJQVVEX0JVRl9BX0FERFIJCT0g MHg0MCwKKwlBVURfQlVGX0FfTEVOR1RICT0gMHg0NCwKKwlBVURfQlVGX0JfQUREUgkJPSAweDQ4 LAorCUFVRF9CVUZfQl9MRU5HVEgJPSAweDRjLAorCUFVRF9CVUZfQ19BRERSCQk9IDB4NTAsCisJ QVVEX0JVRl9DX0xFTkdUSAk9IDB4NTQsCisJQVVEX0JVRl9EX0FERFIJCT0gMHg1OCwKKwlBVURf QlVGX0RfTEVOR1RICT0gMHg1YywKKwlBVURfQ05UTF9TVAkJPSAweDYwLAorCUFVRF9IRE1JX1NU QVRVUwkJPSAweDY4LAorCUFVRF9IRE1JV19JTkZPRlIJPSAweDExNCwKK307CisKKy8qCisgKiBE ZWx0YSBjaGFuZ2VzIGluIEhETUkgY29udHJvbGxlciByZWdpc3RlciBvZmZzZXRzCisgKiBjb21w YXJlIHRvIHYxIHZlcnNpb24KKyAqLworCitlbnVtIGhkbWlfY3RybF9yZWdfb2Zmc2V0X3YyIHsK KwlBVURfSERNSV9TVEFUVVNfdjIJPSAweDY0LAorCUFVRF9IRE1JV19JTkZPRlJfdjIJPSAweDY4 LAorfTsKKworLyoKKyAqCUNFQSBzcGVha2VyIHBsYWNlbWVudDoKKyAqCisgKglGTCAgRkxDICAg RkMgICBGUkMgICBGUgorICoKKyAqCQkJCQkJTEZFCisgKgorICoJUkwgIFJMQyAgIFJDICAgUlJD ICAgUlIKKyAqCisgKglUaGUgTGVmdC9SaWdodCBTdXJyb3VuZCBjaGFubmVsIF9ub3Rpb25zXyBM Uy9SUyBpbiBTTVBURSAzMjBNCisgKgljb3JyZXNwb25kcyB0byBDRUEgUkwvUlI7IFRoZSBTTVBU RSBjaGFubmVsIF9hc3NpZ25tZW50XyBDL0xGRSBpcworICoJc3dhcHBlZCB0byBDRUEgTEZFL0ZD LgorICovCitlbnVtIGNlYV9zcGVha2VyX3BsYWNlbWVudCB7CisJRkwgID0gKDEgPDwgIDApLCAg ICAgICAgLyogRnJvbnQgTGVmdCAgICAgICAgICAgKi8KKwlGQyAgPSAoMSA8PCAgMSksICAgICAg ICAvKiBGcm9udCBDZW50ZXIgICAgICAgICAqLworCUZSICA9ICgxIDw8ICAyKSwgICAgICAgIC8q IEZyb250IFJpZ2h0ICAgICAgICAgICovCisJRkxDID0gKDEgPDwgIDMpLCAgICAgICAgLyogRnJv bnQgTGVmdCBDZW50ZXIgICAgKi8KKwlGUkMgPSAoMSA8PCAgNCksICAgICAgICAvKiBGcm9udCBS aWdodCBDZW50ZXIgICAqLworCVJMICA9ICgxIDw8ICA1KSwgICAgICAgIC8qIFJlYXIgTGVmdCAg ICAgICAgICAgICovCisJUkMgID0gKDEgPDwgIDYpLCAgICAgICAgLyogUmVhciBDZW50ZXIgICAg ICAgICAgKi8KKwlSUiAgPSAoMSA8PCAgNyksICAgICAgICAvKiBSZWFyIFJpZ2h0ICAgICAgICAg ICAqLworCVJMQyA9ICgxIDw8ICA4KSwgICAgICAgIC8qIFJlYXIgTGVmdCBDZW50ZXIgICAgICov CisJUlJDID0gKDEgPDwgIDkpLCAgICAgICAgLyogUmVhciBSaWdodCBDZW50ZXIgICAgKi8KKwlM RkUgPSAoMSA8PCAxMCksICAgICAgICAvKiBMb3cgRnJlcXVlbmN5IEVmZmVjdCAqLworfTsKKwor c3RydWN0IGNlYV9jaGFubmVsX3NwZWFrZXJfYWxsb2NhdGlvbiB7CisJaW50IGNhX2luZGV4Owor CWludCBzcGVha2Vyc1s4XTsKKworCS8qIGRlcml2ZWQgdmFsdWVzLCBqdXN0IGZvciBjb252ZW5p ZW5jZSAqLworCWludCBjaGFubmVsczsKKwlpbnQgc3BrX21hc2s7Cit9OworCitzdHJ1Y3QgY2hh bm5lbF9tYXBfdGFibGUgeworCXVuc2lnbmVkIGNoYXIgbWFwOyAgICAgICAgICAgICAgLyogQUxT QSBBUEkgY2hhbm5lbCBtYXAgcG9zaXRpb24gKi8KKwl1bnNpZ25lZCBjaGFyIGNlYV9zbG90OyAg ICAgICAgIC8qIENFQSBzbG90IHZhbHVlICovCisJaW50IHNwa19tYXNrOyAgICAgICAgICAgICAg ICAgICAvKiBzcGVha2VyIHBvc2l0aW9uIGJpdCBtYXNrICovCit9OworCisvKioKKyAqIHVuaW9u IGF1ZF9jZmcgLSBBdWRpbyBjb25maWd1cmF0aW9uCisgKgorICogQGNmZ19yZWd4OiBpbmRpdmlk dWFsIHJlZ2lzdGVyIGJpdHMKKyAqIEBjZmdfcmVndmFsOiBmdWxsIHJlZ2lzdGVyIHZhbHVlCisg KgorICovCit1bmlvbiBhdWRfY2ZnIHsKKwlzdHJ1Y3QgeworCQl1MzIgYXVkX2VuOjE7CisJCXUz MiBsYXlvdXQ6MTsKKwkJdTMyIGZtdDoyOworCQl1MzIgbnVtX2NoOjI7CisJCXUzMiByc3ZkMDox OworCQl1MzIgc2V0OjE7CisJCXUzMiBmbGF0OjE7CisJCXUzMiB2YWxfYml0OjE7CisJCXUzMiB1 c2VyX2JpdDoxOworCQl1MzIgdW5kZXJydW46MTsKKwkJdTMyIHJzdmQxOjIwOworCX0gY2ZnX3Jl Z3g7CisJc3RydWN0IHsKKwkJdTMyIGF1ZF9lbjoxOworCQl1MzIgbGF5b3V0OjE7CisJCXUzMiBm bXQ6MjsKKwkJdTMyIG51bV9jaDozOworCQl1MzIgc2V0OjE7CisJCXUzMiBmbGF0OjE7CisJCXUz MiB2YWxfYml0OjE7CisJCXUzMiB1c2VyX2JpdDoxOworCQl1MzIgdW5kZXJydW46MTsKKwkJdTMy IHBhY2tldF9tb2RlOjE7CisJCXUzMiBsZWZ0X2FsaWduOjE7CisJCXUzMiBib2d1c19zYW1wbGU6 MTsKKwkJdTMyIGRwX21vZGVpOjE7CisJCXUzMiByc3ZkOjE2OworCX0gY2ZnX3JlZ3hfdjI7CisJ dTMyIGNmZ19yZWd2YWw7Cit9OworCisvKioKKyAqIHVuaW9uIGF1ZF9jaF9zdGF0dXNfMCAtIEF1 ZGlvIENoYW5uZWwgU3RhdHVzIDAgQXR0cmlidXRlcworICoKKyAqIEBzdGF0dXNfMF9yZWd4Omlu ZGl2aWR1YWwgcmVnaXN0ZXIgYml0cworICogQHN0YXR1c18wX3JlZ3ZhbDpmdWxsIHJlZ2lzdGVy IHZhbHVlCisgKgorICovCit1bmlvbiBhdWRfY2hfc3RhdHVzXzAgeworCXN0cnVjdCB7CisJCXUz MiBjaF9zdGF0dXM6MTsKKwkJdTMyIGxwY21faWQ6MTsKKwkJdTMyIGNwX2luZm86MTsKKwkJdTMy IGZvcm1hdDozOworCQl1MzIgbW9kZToyOworCQl1MzIgY3RnX2NvZGU6ODsKKwkJdTMyIHNyY19u dW06NDsKKwkJdTMyIGNoX251bTo0OworCQl1MzIgc2FtcF9mcmVxOjQ7CisJCXUzMiBjbGtfYWNj OjI7CisJCXUzMiByc3ZkOjI7CisJfSBzdGF0dXNfMF9yZWd4OworCXUzMiBzdGF0dXNfMF9yZWd2 YWw7Cit9OworCisvKioKKyAqIHVuaW9uIGF1ZF9jaF9zdGF0dXNfMSAtIEF1ZGlvIENoYW5uZWwg U3RhdHVzIDEgQXR0cmlidXRlcworICoKKyAqIEBzdGF0dXNfMV9yZWd4OiBpbmRpdmlkdWFsIHJl Z2lzdGVyIGJpdHMKKyAqIEBzdGF0dXNfMV9yZWd2YWw6IGZ1bGwgcmVnaXN0ZXIgdmFsdWUKKyAq CisgKi8KK3VuaW9uIGF1ZF9jaF9zdGF0dXNfMSB7CisJc3RydWN0IHsKKwkJdTMyIG1heF93cmRf bGVuOjE7CisJCXUzMiB3cmRfbGVuOjM7CisJCXUzMiByc3ZkOjI4OworCQl9IHN0YXR1c18xX3Jl Z3g7CisJdTMyIHN0YXR1c18xX3JlZ3ZhbDsKK307CisKKy8qKgorICogdW5pb24gYXVkX2hkbWlf Y3RzIC0gQ1RTIHJlZ2lzdGVyCisgKgorICogQGN0c19yZWd4OiBpbmRpdmlkdWFsIHJlZ2lzdGVy IGJpdHMKKyAqIEBjdHNfcmVndmFsOiBmdWxsIHJlZ2lzdGVyIHZhbHVlCisgKgorICovCit1bmlv biBhdWRfaGRtaV9jdHMgeworCXN0cnVjdCB7CisJCXUzMiBjdHNfdmFsOjIwOworCQl1MzIgZW5f Y3RzX3Byb2c6MTsKKwkJdTMyIHJzdmQ6MTE7CisJfSBjdHNfcmVneDsKKwlzdHJ1Y3QgeworCQl1 MzIgY3RzX3ZhbDoyNDsKKwkJdTMyIGVuX2N0c19wcm9nOjE7CisJCXUzMiByc3ZkOjc7CisJfSBj dHNfcmVneF92MjsKKwl1MzIgY3RzX3JlZ3ZhbDsKK307CisKKy8qKgorICogdW5pb24gYXVkX2hk bWlfbl9lbmFibGUgLSBOIHJlZ2lzdGVyCisgKgorICogQG5fcmVneDogaW5kaXZpZHVhbCByZWdp c3RlciBiaXRzCisgKiBAbl9yZWd2YWw6IGZ1bGwgcmVnaXN0ZXIgdmFsdWUKKyAqCisgKi8KK3Vu aW9uIGF1ZF9oZG1pX25fZW5hYmxlIHsKKwlzdHJ1Y3QgeworCQl1MzIgbl92YWw6MjA7CisJCXUz MiBlbl9uX3Byb2c6MTsKKwkJdTMyIHJzdmQ6MTE7CisJfSBuX3JlZ3g7CisJc3RydWN0IHsKKwkJ dTMyIG5fdmFsOjI0OworCQl1MzIgZW5fbl9wcm9nOjE7CisJCXUzMiByc3ZkOjc7CisJfSBuX3Jl Z3hfdjI7CisJdTMyIG5fcmVndmFsOworfTsKKworLyoqCisgKiB1bmlvbiBhdWRfYnVmX2NvbmZp ZyAtICBBdWRpbyBCdWZmZXIgY29uZmlndXJhdGlvbnMKKyAqCisgKiBAYnVmX2NmZ19yZWd4OiBp bmRpdmlkdWFsIHJlZ2lzdGVyIGJpdHMKKyAqIEBidWZfY2ZndmFsOiBmdWxsIHJlZ2lzdGVyIHZh bHVlCisgKgorICovCit1bmlvbiBhdWRfYnVmX2NvbmZpZyB7CisJc3RydWN0IHsKKwkJdTMyIGZp Zm9fd2lkdGg6ODsKKwkJdTMyIHJzdmQwOjg7CisJCXUzMiBhdWRfZGVsYXk6ODsKKwkJdTMyIHJz dmQxOjg7CisJfSBidWZfY2ZnX3JlZ3g7CisJc3RydWN0IHsKKwkJdTMyIGF1ZGlvX2ZpZm9fd2F0 ZXJtYXJrOjg7CisJCXUzMiBkbWFfZmlmb193YXRlcm1hcms6MzsKKwkJdTMyIHJzdmQwOjU7CisJ CXUzMiBhdWRfZGVsYXk6ODsKKwkJdTMyIHJzdmQxOjg7CisJfSBidWZfY2ZnX3JlZ3hfdjI7CisJ dTMyIGJ1Zl9jZmd2YWw7Cit9OworCisvKioKKyAqIHVuaW9uIGF1ZF9idWZfY2hfc3dhcCAtIEF1 ZGlvIFNhbXBsZSBTd2FwcGluZyBvZmZzZXQKKyAqCisgKiBAYnVmX2NoX3N3YXBfcmVneDogaW5k aXZpZHVhbCByZWdpc3RlciBiaXRzCisgKiBAYnVmX2NoX3N3YXBfdmFsOiBmdWxsIHJlZ2lzdGVy IHZhbHVlCisgKgorICovCit1bmlvbiBhdWRfYnVmX2NoX3N3YXAgeworCXN0cnVjdCB7CisJCXUz MiBmaXJzdF8wOjM7CisJCXUzMiBzZWNvbmRfMDozOworCQl1MzIgZmlyc3RfMTozOworCQl1MzIg c2Vjb25kXzE6MzsKKwkJdTMyIGZpcnN0XzI6MzsKKwkJdTMyIHNlY29uZF8yOjM7CisJCXUzMiBm aXJzdF8zOjM7CisJCXUzMiBzZWNvbmRfMzozOworCQl1MzIgcnN2ZDo4OworCX0gYnVmX2NoX3N3 YXBfcmVneDsKKwl1MzIgYnVmX2NoX3N3YXBfdmFsOworfTsKKworLyoqCisgKiB1bmlvbiBhdWRf YnVmX2FkZHIgLSBBZGRyZXNzIGZvciBBdWRpbyBCdWZmZXIKKyAqCisgKiBAYnVmX2FkZHJfcmVn eDogaW5kaXZpZHVhbCByZWdpc3RlciBiaXRzCisgKiBAYnVmX2FkZHJfdmFsOiBmdWxsIHJlZ2lz dGVyIHZhbHVlCisgKgorICovCit1bmlvbiBhdWRfYnVmX2FkZHIgeworCXN0cnVjdCB7CisJCXUz MiB2YWxpZDoxOworCQl1MzIgaW50cl9lbjoxOworCQl1MzIgcnN2ZDo0OworCQl1MzIgYWRkcjoy NjsKKwl9IGJ1Zl9hZGRyX3JlZ3g7CisJdTMyIGJ1Zl9hZGRyX3ZhbDsKK307CisKKy8qKgorICog dW5pb24gYXVkX2J1Zl9sZW4gLSBMZW5ndGggb2YgQXVkaW8gQnVmZmVyCisgKgorICogQGJ1Zl9s ZW5fcmVneDogaW5kaXZpZHVhbCByZWdpc3RlciBiaXRzCisgKiBAYnVmX2xlbl92YWw6IGZ1bGwg cmVnaXN0ZXIgdmFsdWUKKyAqCisgKi8KK3VuaW9uIGF1ZF9idWZfbGVuIHsKKwlzdHJ1Y3Qgewor CQl1MzIgYnVmX2xlbjoyMDsKKwkJdTMyIHJzdmQ6MTI7CisJfSBidWZfbGVuX3JlZ3g7CisJdTMy IGJ1Zl9sZW5fdmFsOworfTsKKworLyoqCisgKiB1bmlvbiBhdWRfY3RybF9zdCAtIEF1ZGlvIENv bnRyb2wgU3RhdGUgUmVnaXN0ZXIgb2Zmc2V0CisgKgorICogQGN0cmxfcmVneDogaW5kaXZpZHVh bCByZWdpc3RlciBiaXRzCisgKiBAY3RybF92YWw6IGZ1bGwgcmVnaXN0ZXIgdmFsdWUKKyAqCisg Ki8KK3VuaW9uIGF1ZF9jdHJsX3N0IHsKKwlzdHJ1Y3QgeworCQl1MzIgcmFtX2FkZHI6NDsKKwkJ dTMyIGVsZF9hY2s6MTsKKwkJdTMyIGVsZF9hZGRyOjQ7CisJCXUzMiBlbGRfYnVmX3NpemU6NTsK KwkJdTMyIGVsZF92YWxpZDoxOworCQl1MzIgY3BfcmVhZHk6MTsKKwkJdTMyIGRpcF9mcmVxOjI7 CisJCXUzMiBkaXBfaWR4OjM7CisJCXUzMiBkaXBfZW5fc3RhOjQ7CisJCXUzMiByc3ZkOjc7CisJ fSBjdHJsX3JlZ3g7CisJdTMyIGN0cmxfdmFsOworfTsKKworLyoqCisgKiB1bmlvbiBhdWRfaW5m b19mcmFtZTEgLSBBdWRpbyBIRE1JIFdpZGdldCBEYXRhIElzbGFuZCBQYWNrZXQgb2Zmc2V0Cisg KgorICogQGZyMV9yZWd4OiBpbmRpdmlkdWFsIHJlZ2lzdGVyIGJpdHMKKyAqIEBmcjFfdmFsOiBm dWxsIHJlZ2lzdGVyIHZhbHVlCisgKgorICovCit1bmlvbiBhdWRfaW5mb19mcmFtZTEgeworCXN0 cnVjdCB7CisJCXUzMiBwa3RfdHlwZTo4OworCQl1MzIgdmVyX251bTo4OworCQl1MzIgbGVuOjU7 CisJCXUzMiByc3ZkOjExOworCX0gZnIxX3JlZ3g7CisJdTMyIGZyMV92YWw7Cit9OworCisvKioK KyAqIHVuaW9uIGF1ZF9pbmZvX2ZyYW1lMiAtIERJUCBmcmFtZSAyCisgKgorICogQGZyMl9yZWd4 OiBpbmRpdmlkdWFsIHJlZ2lzdGVyIGJpdHMKKyAqIEBmcjJfdmFsOiBmdWxsIHJlZ2lzdGVyIHZh bHVlCisgKgorICovCit1bmlvbiBhdWRfaW5mb19mcmFtZTIgeworCXN0cnVjdCB7CisJCXUzMiBj aGtzdW06ODsKKwkJdTMyIGNobmxfY250OjM7CisJCXUzMiByc3ZkMDoxOworCQl1MzIgY29kaW5n X3R5cGU6NDsKKwkJdTMyIHNtcGxfc2l6ZToyOworCQl1MzIgc21wbF9mcmVxOjM7CisJCXUzMiBy c3ZkMTozOworCQl1MzIgZm9ybWF0Ojg7CisJfSBmcjJfcmVneDsKKwl1MzIgZnIyX3ZhbDsKK307 CisKKy8qKgorICogdW5pb24gYXVkX2luZm9fZnJhbWUzIC0gRElQIGZyYW1lIDMKKyAqCisgKiBA ZnIzX3JlZ3g6IGluZGl2aWR1YWwgcmVnaXN0ZXIgYml0cworICogQGZyM192YWw6IGZ1bGwgcmVn aXN0ZXIgdmFsdWUKKyAqCisgKi8KK3VuaW9uIGF1ZF9pbmZvX2ZyYW1lMyB7CisJc3RydWN0IHsK KwkJdTMyIGNobmxfYWxsb2M6ODsKKwkJdTMyIHJzdmQwOjM7CisJCXUzMiBsc3Y6NDsKKwkJdTMy IGRtX2luaDoxOworCQl1MzIgcnN2ZDE6MTY7CisJfSBmcjNfcmVneDsKKwl1MzIgZnIzX3ZhbDsK K307CisKK2VudW0gaGRtaV9jb25uZWN0b3Jfc3RhdHVzIHsKKwloZG1pX2Nvbm5lY3Rvcl9zdGF0 dXNfY29ubmVjdGVkID0gMSwKKwloZG1pX2Nvbm5lY3Rvcl9zdGF0dXNfZGlzY29ubmVjdGVkID0g MiwKKwloZG1pX2Nvbm5lY3Rvcl9zdGF0dXNfdW5rbm93biA9IDMsCit9OworCisjZGVmaW5lIEhE TUlfQVVESU9fVU5ERVJSVU4gICAgICgxVUw8PDMxKQorI2RlZmluZSBIRE1JX0FVRElPX0JVRkZF Ul9ET05FICAoMVVMPDwyOSkKKworCisjZGVmaW5lIFBPUlRfRU5BQkxFCQkJKDEgPDwgMzEpCisj ZGVmaW5lIFNEVk9fQVVESU9fRU5BQkxFCSgxIDw8IDYpCisKK2VudW0gaGFkX2NhcHNfbGlzdCB7 CisJSEFEX0dFVF9FTEQgPSAxLAorCUhBRF9HRVRfRElTUExBWV9SQVRFLAorCUhBRF9TRVRfRU5B QkxFX0FVRElPLAorCUhBRF9TRVRfRElTQUJMRV9BVURJTywKKwlIQURfU0VUX0VOQUJMRV9BVURJ T19JTlQsCisJSEFEX1NFVF9ESVNBQkxFX0FVRElPX0lOVCwKK307CisKK2VudW0gaGFkX2V2ZW50 X3R5cGUgeworCUhBRF9FVkVOVF9IT1RfUExVRyA9IDEsCisJSEFEX0VWRU5UX0hPVF9VTlBMVUcs CisJSEFEX0VWRU5UX01PREVfQ0hBTkdJTkcsCisJSEFEX0VWRU5UX0FVRElPX0JVRkZFUl9ET05F LAorCUhBRF9FVkVOVF9BVURJT19CVUZGRVJfVU5ERVJSVU4sCisJSEFEX0VWRU5UX1FVRVJZX0lT X0FVRElPX0JVU1ksCisJSEFEX0VWRU5UX1FVRVJZX0lTX0FVRElPX1NVU1BFTkRFRCwKK307CisK Ky8qCisgKiBIRE1JIERpc3BsYXkgQ29udHJvbGxlciBBdWRpbyBJbnRlcmZhY2UKKyAqCisgKi8K K3R5cGVkZWYgaW50ICgqaGFkX2V2ZW50X2NhbGxfYmFjaykgKGVudW0gaGFkX2V2ZW50X3R5cGUg ZXZlbnRfdHlwZSwKKwkJdm9pZCAqY3R4dF9pbmZvKTsKKworc3RydWN0IGhkbWlfYXVkaW9fcmVn aXN0ZXJzX29wcyB7CisJaW50ICgqaGRtaV9hdWRpb19nZXRfcmVnaXN0ZXJfYmFzZSkodWludDMy X3QgKipyZWdfYmFzZSwKKwkJCXVpbnQzMl90ICpjb25maWdfb2Zmc2V0KTsKKwlpbnQgKCpoZG1p X2F1ZGlvX3JlYWRfcmVnaXN0ZXIpKHVpbnQzMl90IHJlZ19hZGRyLCB1aW50MzJfdCAqZGF0YSk7 CisJaW50ICgqaGRtaV9hdWRpb193cml0ZV9yZWdpc3RlcikodWludDMyX3QgcmVnX2FkZHIsIHVp bnQzMl90IGRhdGEpOworCWludCAoKmhkbWlfYXVkaW9fcmVhZF9tb2RpZnkpKHVpbnQzMl90IHJl Z19hZGRyLCB1aW50MzJfdCBkYXRhLAorCQkJdWludDMyX3QgbWFzayk7Cit9OworCitzdHJ1Y3Qg aGRtaV9hdWRpb19xdWVyeV9zZXRfb3BzIHsKKwlpbnQgKCpoZG1pX2F1ZGlvX2dldF9jYXBzKShl bnVtIGhhZF9jYXBzX2xpc3QgcXVlcnlfZWxlbWVudCwKKwkJCXZvaWQgKmNhcGFiaWx0aWVzKTsK KwlpbnQgKCpoZG1pX2F1ZGlvX3NldF9jYXBzKShlbnVtIGhhZF9jYXBzX2xpc3Qgc2V0X2VsZW1l bnQsCisJCQl2b2lkICpjYXBhYmlsdGllcyk7Cit9OworCitzdHJ1Y3QgaGRtaV9hdWRpb19ldmVu dCB7CisJaW50IHR5cGU7Cit9OworCitzdHJ1Y3Qgc25kX2ludGVsX2hhZF9pbnRlcmZhY2Ugewor CWNvbnN0IGNoYXIgKm5hbWU7CisJaW50ICgqcXVlcnkpKHZvaWQgKmhhZF9kYXRhLCBzdHJ1Y3Qg aGRtaV9hdWRpb19ldmVudCBldmVudCk7CisJaW50ICgqc3VzcGVuZCkodm9pZCAqaGFkX2RhdGEs IHN0cnVjdCBoZG1pX2F1ZGlvX2V2ZW50IGV2ZW50KTsKKwlpbnQgKCpyZXN1bWUpKHZvaWQgKmhh ZF9kYXRhKTsKK307CisKK2Jvb2wgbWlkX2hkbWlfYXVkaW9faXNfYnVzeSh2b2lkICpkZXYpOwor Ym9vbCBtaWRfaGRtaV9hdWRpb19zdXNwZW5kKHZvaWQgKmRldik7Cit2b2lkIG1pZF9oZG1pX2F1 ZGlvX3Jlc3VtZSh2b2lkICpkZXYpOwordm9pZCBtaWRfaGRtaV9hdWRpb19zaWduYWxfZXZlbnQo ZW51bSBoYWRfZXZlbnRfdHlwZSBldmVudCk7CitpbnQgbWlkX2hkbWlfYXVkaW9fc2V0dXAoCisJ aGFkX2V2ZW50X2NhbGxfYmFjayBhdWRpb19jYWxsYmFja3MsCisJc3RydWN0IGhkbWlfYXVkaW9f cmVnaXN0ZXJzX29wcyAqcmVnX29wcywKKwlzdHJ1Y3QgaGRtaV9hdWRpb19xdWVyeV9zZXRfb3Bz ICpxdWVyeV9vcHMpOworaW50IG1pZF9oZG1pX2F1ZGlvX3JlZ2lzdGVyKAorCXN0cnVjdCBzbmRf aW50ZWxfaGFkX2ludGVyZmFjZSAqZHJpdmVyLAorCXZvaWQgKmhhZF9kYXRhKTsKKworI2VuZGlm Ci0tIAoyLjkuMwoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X18KSW50ZWwtZ2Z4IG1haWxpbmcgbGlzdApJbnRlbC1nZnhAbGlzdHMuZnJlZWRlc2t0b3Aub3Jn Cmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vaW50ZWwtZ2Z4 Cg==