From mboxrd@z Thu Jan 1 00:00:00 1970 From: Alex Deucher Subject: [PATCH 10/13] ASoC: AMD: add ACP 2.x IP DMA abstraction layer Date: Fri, 4 Dec 2015 18:40:37 -0500 Message-ID: <1449272440-8735-10-git-send-email-alexander.deucher@amd.com> References: <1449272440-8735-1-git-send-email-alexander.deucher@amd.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <1449272440-8735-1-git-send-email-alexander.deucher@amd.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: broonie@kernel.org, airlied@gmail.com, dri-devel@lists.freedesktop.org, alsa-devel@alsa-project.org, maruthi.bayyavarapu@amd.com, rajeevkumar.linux@gmail.com Cc: Alex Deucher , Maruthi Srinivas Bayyavarapu , lgirdwood@gmail.com, perex@perex.cz List-Id: alsa-devel@alsa-project.org RnJvbTogTWFydXRoaSBTcmluaXZhcyBCYXl5YXZhcmFwdSA8TWFydXRoaS5CYXl5YXZhcmFwdUBh bWQuY29tPgoKQUNQIElQIGhhcyBpbnRlcm5hbCBETUEgY29udHJvbGxlciB3aXRoIG11bHRpcGxl IGNoYW5uZWxzIHdoaWNoCmNhbiBiZSBwcm9ncmFtbWVkIGluIGN5Y2xpYy9ub24gY3ljbGljIG1h bm5lci4gQUNQIGNhbiBnZW5lcmF0ZQppbnRlcnJ1cHQgdXBvbiBjb21wbGV0aW9uIG9mIERNQSB0 cmFuc2ZlciwgaWYgcmVxdWlyZWQuCgpTaWduZWQtb2ZmLWJ5OiBNYXJ1dGhpIEJheXlhdmFyYXB1 IDxtYXJ1dGhpLmJheXlhdmFyYXB1QGFtZC5jb20+ClJldmlld2VkLWJ5OiBBbGV4IERldWNoZXIg PGFsZXhhbmRlci5kZXVjaGVyQGFtZC5jb20+ClNpZ25lZC1vZmYtYnk6IEFsZXggRGV1Y2hlciA8 YWxleGFuZGVyLmRldWNoZXJAYW1kLmNvbT4KLS0tCiBzb3VuZC9zb2MvYW1kL2FjcC5jIHwgNTg3 ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKIHNv dW5kL3NvYy9hbWQvYWNwLmggfCAxMzkgKysrKysrKysrKysrKwogMiBmaWxlcyBjaGFuZ2VkLCA3 MjYgaW5zZXJ0aW9ucygrKQogY3JlYXRlIG1vZGUgMTAwNjQ0IHNvdW5kL3NvYy9hbWQvYWNwLmMK IGNyZWF0ZSBtb2RlIDEwMDY0NCBzb3VuZC9zb2MvYW1kL2FjcC5oCgpkaWZmIC0tZ2l0IGEvc291 bmQvc29jL2FtZC9hY3AuYyBiL3NvdW5kL3NvYy9hbWQvYWNwLmMKbmV3IGZpbGUgbW9kZSAxMDA2 NDQKaW5kZXggMDAwMDAwMC4uMGQ1OWJlNAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9h bWQvYWNwLmMKQEAgLTAsMCArMSw1ODcgQEAKKy8qCisgKiBBTUQgQUNQIG1vZHVsZQorICoKKyAq IENvcHlyaWdodCAyMDE1IEFkdmFuY2VkIE1pY3JvIERldmljZXMsIEluYy4KKyAqCisgKiBUaGlz IHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29y IG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUg R2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRo ZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3Ry aWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5Z IFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRB QklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUg R05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisqLworCisj aW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8 bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9k ZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8c291bmQvYXNvdW5k Lmg+CisjaW5jbHVkZSAiYWNwLmgiCisKK3UzMiBhY3BfcmVnX3JlYWQodm9pZCBfX2lvbWVtICph Y3BfbW1pbywgdTMyIHJlZykKK3sKKwlyZXR1cm4gcmVhZGwoYWNwX21taW8gKyAocmVnICogNCkp OworfQorCit2b2lkIGFjcF9yZWdfd3JpdGUodTMyIHZhbCwgdm9pZCBfX2lvbWVtICphY3BfbW1p bywgdTMyIHJlZykKK3sKKwl3cml0ZWwodmFsLCBhY3BfbW1pbyArIChyZWcgKiA0KSk7Cit9CisK Ky8qIENvbmZpZ3VyZSBhIGdpdmVuIGRtYSBjaGFubmVsIHBhcmFtZXRlcnMgLSBlbmFibGUvZGlz YmxlLAorICogbnVtYmVyIG9mIGRlc2NyaXB0b3JzLCBwcmlvcml0eQorICovCit2b2lkIGNvbmZp Z19hY3BfZG1hX2NoYW5uZWwodm9pZCBfX2lvbWVtICphY3BfbW1pbywgdTggY2hfbnVtLAorCQkJ CSAgIHUxNiBkc2NyX3N0cnRfaWR4LCB1MTYgbnVtX2RzY3JzLAorCQkJCSAgIGVudW0gYWNwX2Rt YV9wcmlvcml0eV9sZXZlbCBwcmlvcml0eV9sZXZlbCkKK3sKKwl1MzIgZG1hX2N0cmw7CisKKwkv KiBkaXNhYmxlIHRoZSBjaGFubmVsIHJ1biBmaWVsZCAqLworCWRtYV9jdHJsID0gYWNwX3JlZ19y ZWFkKGFjcF9tbWlvLCBtbUFDUF9ETUFfQ05UTF8wICsgY2hfbnVtKTsKKwlkbWFfY3RybCAmPSB+ QUNQX0RNQV9DTlRMXzBfX0RNQUNoUnVuX01BU0s7CisJYWNwX3JlZ193cml0ZShkbWFfY3RybCwg YWNwX21taW8sIG1tQUNQX0RNQV9DTlRMXzAgKyBjaF9udW0pOworCisJLyogcHJvZ3JhbSBhIERN QSBjaGFubmVsIHdpdGggZmlyc3QgZGVzY3JpcHRvciB0byBiZSBwcm9jZXNzZWQuICovCisJYWNw X3JlZ193cml0ZSgoQUNQX0RNQV9EU0NSX1NUUlRfSURYXzBfX0RNQUNoRHNjclN0cnRJZHhfTUFT SworCQkJJiBkc2NyX3N0cnRfaWR4KSwKKwkJCWFjcF9tbWlvLCBtbUFDUF9ETUFfRFNDUl9TVFJU X0lEWF8wICsgY2hfbnVtKTsKKworCS8qIHByb2dyYW0gYSBETUEgY2hhbm5lbCB3aXRoIHRoZSBu dW1iZXIgb2YgZGVzY3JpcHRvcnMgdG8gYmUKKwkgKiBwcm9jZXNzZWQgaW4gdGhlIHRyYW5zZmVy CisJKi8KKwlhY3BfcmVnX3dyaXRlKEFDUF9ETUFfRFNDUl9DTlRfMF9fRE1BQ2hEc2NyQ250X01B U0sgJiBudW1fZHNjcnMsCisJCWFjcF9tbWlvLCBtbUFDUF9ETUFfRFNDUl9DTlRfMCArIGNoX251 bSk7CisKKwkvKiBzZXQgRE1BIGNoYW5uZWwgcHJpb3JpdHkgKi8KKwlhY3BfcmVnX3dyaXRlKHBy aW9yaXR5X2xldmVsLCBhY3BfbW1pbywgbW1BQ1BfRE1BX1BSSU9fMCArIGNoX251bSk7Cit9CisK Ky8qIEluaXRpYWxpemUgdGhlIGRtYSBkZXNjcmlwdG9ycyBsb2NhdGlvbiBpbiBTUkFNIGFuZCBw YWdlIHNpemUgKi8KK3N0YXRpYyB2b2lkIGFjcF9kbWFfZGVzY3JfaW5pdCh2b2lkIF9faW9tZW0g KmFjcF9tbWlvKQoreworCXUzMiBzcmFtX3B0ZV9vZmZzZXQgPSAwOworCisJLyogU1JBTSBzdGFy dHMgYXQgMHgwNDAwMDAwMC4gRnJvbSB0aGF0IG9mZnNldCBvbmUgcGFnZSAoNEtCKSBsZWZ0IGZv cgorCSAqIGZpbGxpbmcgRE1BIGRlc2NyaXB0b3JzLnNyYW1fcHRlX29mZnNldCA9IDB4MDQwMDEw MDAgLCB1c2VkIGZvcgorCSAqIGZpbGxpbmcgc3lzdGVtIFJBTSdzIHBoeXNpY2FsIHBhZ2VzLgor CSAqIFRoaXMgYmVjb21lcyB0aGUgQUxTQSdzIFJpbmcgYnVmZmVyIHN0YXJ0IGFkZHJlc3MKKwkq LworCXNyYW1fcHRlX29mZnNldCA9IEFDUF9EQUdCX0dSUF9TUkFNX0JBU0VfQUREUkVTUzsKKwor CS8qIHNub29wYWJsZSAqLworCXNyYW1fcHRlX29mZnNldCB8PSBBQ1BfREFHQl9CQVNFX0FERFJf R1JQXzFfX0FYSTJEQUdCU25vb3BTZWxfTUFTSzsKKwkvKiBNZW1tb3J5IGlzIHN5c3RlbSBtbWVt b3J5ICovCisJc3JhbV9wdGVfb2Zmc2V0IHw9IEFDUF9EQUdCX0JBU0VfQUREUl9HUlBfMV9fQVhJ MkRBR0JUYXJnZXRNZW1TZWxfTUFTSzsKKwkvKiBQYWdlIEVuYWJsZWQgKi8KKwlzcmFtX3B0ZV9v ZmZzZXQgfD0gQUNQX0RBR0JfQkFTRV9BRERSX0dSUF8xX19BWEkyREFHQkdycEVuYWJsZV9NQVNL OworCisJYWNwX3JlZ193cml0ZShzcmFtX3B0ZV9vZmZzZXQsCWFjcF9tbWlvLCBtbUFDUF9EQUdC X0JBU0VfQUREUl9HUlBfMSk7CisJYWNwX3JlZ193cml0ZShQQUdFX1NJWkVfNEtfRU5BQkxFLCBh Y3BfbW1pbywKKwkJCQkJCW1tQUNQX0RBR0JfUEFHRV9TSVpFX0dSUF8xKTsKK30KKworLyogSW5p dGlhbGl6ZSBhIGRtYSBkZXNjcmlwdG9yIGluIFNSQU0gYmFzZWQgb24gZGVzY3JpdG9yIGluZm9y bWF0aW9uIHBhc3NlZCAqLworc3RhdGljIHZvaWQgY29uZmlnX2RtYV9kZXNjcmlwdG9yX2luX3Ny YW0odm9pZCBfX2lvbWVtICphY3BfbW1pbywKKwkJCQkJICB1MTYgZGVzY3JfaWR4LAorCQkJCQkg IGFjcF9kbWFfZHNjcl90cmFuc2Zlcl90ICpkZXNjcl9pbmZvKQoreworCXUzMiBzcmFtX29mZnNl dDsKKworCXNyYW1fb2Zmc2V0ID0gKGRlc2NyX2lkeCAqIHNpemVvZihhY3BfZG1hX2RzY3JfdHJh bnNmZXJfdCkpOworCisJLyogcHJvZ3JhbSB0aGUgc291cmNlIGJhc2UgYWRkcmVzcy4gKi8KKwlh Y3BfcmVnX3dyaXRlKHNyYW1fb2Zmc2V0LCBhY3BfbW1pbywgbW1BQ1BfU1JCTV9UYXJnX0lkeF9B ZGRyKTsKKwlhY3BfcmVnX3dyaXRlKGRlc2NyX2luZm8tPnNyYywJYWNwX21taW8sIG1tQUNQX1NS Qk1fVGFyZ19JZHhfRGF0YSk7CisJLyogcHJvZ3JhbSB0aGUgZGVzdGluYXRpb24gYmFzZSBhZGRy ZXNzLiAqLworCWFjcF9yZWdfd3JpdGUoc3JhbV9vZmZzZXQgKyA0LAlhY3BfbW1pbywgbW1BQ1Bf U1JCTV9UYXJnX0lkeF9BZGRyKTsKKwlhY3BfcmVnX3dyaXRlKGRlc2NyX2luZm8tPmRlc3QsIGFj cF9tbWlvLCBtbUFDUF9TUkJNX1RhcmdfSWR4X0RhdGEpOworCisJLyogcHJvZ3JhbSB0aGUgbnVt YmVyIG9mIGJ5dGVzIHRvIGJlIHRyYW5zZmVycmVkIGZvciB0aGlzIGRlc2NyaXB0b3IuICovCisJ YWNwX3JlZ193cml0ZShzcmFtX29mZnNldCArIDgsCWFjcF9tbWlvLCBtbUFDUF9TUkJNX1Rhcmdf SWR4X0FkZHIpOworCWFjcF9yZWdfd3JpdGUoZGVzY3JfaW5mby0+eGZlcl92YWwsIGFjcF9tbWlv LCBtbUFDUF9TUkJNX1RhcmdfSWR4X0RhdGEpOworfQorCisvKiBJbml0aWFsaXplIHRoZSBETUEg ZGVzY3JpcHRvciBpbmZvcm1hdGlvbiBmb3IgdHJhbnNmZXIgYmV0d2VlbgorICogc3lzdGVtIG1l bW9yeSA8LT4gQUNQIFNSQU0KKyAqLworc3RhdGljIHZvaWQgc2V0X2FjcF9zeXNtZW1fZG1hX2Rl c2NyaXB0b3JzKHZvaWQgX19pb21lbSAqYWNwX21taW8sCisJCQkJCSAgIHUzMiBzaXplLCBpbnQg ZGlyZWN0aW9uLAorCQkJCQkgICB1MzIgcHRlX29mZnNldCkKK3sKKwl1MTYgbnVtX2Rlc2NyOwor CXUxNiBkbWFfZHNjcl9pZHggPSBQTEFZQkFDS19TVEFSVF9ETUFfREVTQ1JfQ0gxMjsKKwlhY3Bf ZG1hX2RzY3JfdHJhbnNmZXJfdCBkbWFkc2NyWzJdOworCisJbnVtX2Rlc2NyID0gMjsKKworCWRt YWRzY3JbMF0ueGZlcl92YWwgPSAwOworCWlmIChkaXJlY3Rpb24gPT0gU05EUlZfUENNX1NUUkVB TV9QTEFZQkFDSykgeworCQlkbWFfZHNjcl9pZHggPSBQTEFZQkFDS19TVEFSVF9ETUFfREVTQ1Jf Q0gxMjsKKwkJZG1hZHNjclswXS5kZXN0ID0gQUNQX1NIQVJFRF9SQU1fQkFOS18xX0FERFJFU1Mg KyAoc2l6ZSAvIDIpOworCQlkbWFkc2NyWzBdLnNyYyA9IEFDUF9JTlRFUk5BTF9BUEVSVFVSRV9X SU5ET1dfMF9BRERSRVNTICsKKwkJCShwdGVfb2Zmc2V0ICogUEFHRV9TSVpFXzRLKTsKKwkJZG1h ZHNjclswXS54ZmVyX3ZhbCB8PQorCQkJKEFDUF9ETUFfQVRUUklCVVRFU19EQUdCX09OSU9OX1RP X1NIQVJFRE1FTSA8PCAxNikgfAorCQkJKHNpemUgLyAyKTsKKwl9IGVsc2UgeworCQlkbWFfZHNj cl9pZHggPSBDQVBUVVJFX1NUQVJUX0RNQV9ERVNDUl9DSDE0OworCQlkbWFkc2NyWzBdLnNyYyA9 IEFDUF9TSEFSRURfUkFNX0JBTktfNV9BRERSRVNTOworCQlkbWFkc2NyWzBdLmRlc3QgPSBBQ1Bf SU5URVJOQUxfQVBFUlRVUkVfV0lORE9XXzBfQUREUkVTUyArCisJCQkocHRlX29mZnNldCAqIFBB R0VfU0laRV80Syk7CisJCWRtYWRzY3JbMF0ueGZlcl92YWwgfD0KKwkJCUJJVCgyMikgfAorCQkJ KEFDUF9ETUFfQVRUUklCVVRFU19TSEFSRURNRU1fVE9fREFHQl9PTklPTiA8PCAxNikgfAorCQkJ KHNpemUgLyAyKTsKKwl9CisKKwljb25maWdfZG1hX2Rlc2NyaXB0b3JfaW5fc3JhbShhY3BfbW1p bywgZG1hX2RzY3JfaWR4LCAmZG1hZHNjclswXSk7CisKKwlkbWFkc2NyWzFdLnhmZXJfdmFsID0g MDsKKwlpZiAoZGlyZWN0aW9uID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spIHsKKwkJZG1h X2RzY3JfaWR4ID0gUExBWUJBQ0tfRU5EX0RNQV9ERVNDUl9DSDEyOworCQlkbWFkc2NyWzFdLmRl c3QgPSBBQ1BfU0hBUkVEX1JBTV9CQU5LXzFfQUREUkVTUzsKKwkJZG1hZHNjclsxXS5zcmMgPSBB Q1BfSU5URVJOQUxfQVBFUlRVUkVfV0lORE9XXzBfQUREUkVTUyArCisJCQkocHRlX29mZnNldCAq IFBBR0VfU0laRV80SykgKyAoc2l6ZSAvIDIpOworCQlkbWFkc2NyWzFdLnhmZXJfdmFsIHw9CisJ CQkoQUNQX0RNQV9BVFRSSUJVVEVTX0RBR0JfT05JT05fVE9fU0hBUkVETUVNIDw8IDE2KSB8CisJ CQkoc2l6ZSAvIDIpOworCX0gZWxzZSB7CisJCWRtYV9kc2NyX2lkeCA9IENBUFRVUkVfRU5EX0RN QV9ERVNDUl9DSDE0OworCQlkbWFkc2NyWzFdLmRlc3QgPSBkbWFkc2NyWzBdLmRlc3QgKyAoc2l6 ZSAvIDIpOworCQlkbWFkc2NyWzFdLnNyYyA9IGRtYWRzY3JbMF0uc3JjICsgKHNpemUgLyAyKTsK KwkJZG1hZHNjclsxXS54ZmVyX3ZhbCB8PSBCSVQoMjIpIHwKKwkJCShBQ1BfRE1BX0FUVFJJQlVU RVNfU0hBUkVETUVNX1RPX0RBR0JfT05JT04gPDwgMTYpIHwKKwkJCShzaXplIC8gMik7CisJfQor CisJY29uZmlnX2RtYV9kZXNjcmlwdG9yX2luX3NyYW0oYWNwX21taW8sIGRtYV9kc2NyX2lkeCwg JmRtYWRzY3JbMV0pOworCisJaWYgKGRpcmVjdGlvbiA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlC QUNLKSB7CisJCS8qIHN0YXJ0aW5nIGRlc2NyaXB0b3IgZm9yIHRoaXMgY2hhbm5lbCAqLworCQlk bWFfZHNjcl9pZHggPSBQTEFZQkFDS19TVEFSVF9ETUFfREVTQ1JfQ0gxMjsKKwkJY29uZmlnX2Fj cF9kbWFfY2hhbm5lbChhY3BfbW1pbywgU1lTUkFNX1RPX0FDUF9DSF9OVU0sCisJCQkJCWRtYV9k c2NyX2lkeCwgbnVtX2Rlc2NyLAorCQkJCQlBQ1BfRE1BX1BSSU9SSVRZX0xFVkVMX05PUk1BTCk7 CisJfSBlbHNlIHsKKwkJLyogc3RhcnRpbmcgZGVzY3JpcHRvciBmb3IgdGhpcyBjaGFubmVsICov CisJCWRtYV9kc2NyX2lkeCA9IENBUFRVUkVfU1RBUlRfRE1BX0RFU0NSX0NIMTQ7CisJCWNvbmZp Z19hY3BfZG1hX2NoYW5uZWwoYWNwX21taW8sIEFDUF9UT19TWVNSQU1fQ0hfTlVNLAorCQkJCQlk bWFfZHNjcl9pZHgsIG51bV9kZXNjciwKKwkJCQkJQUNQX0RNQV9QUklPUklUWV9MRVZFTF9OT1JN QUwpOworCX0KK30KKworLyogSW5pdGlhbGl6ZSB0aGUgRE1BIGRlc2NyaXB0b3IgaW5mb3JtYXRp b24gZm9yIHRyYW5zZmVyIGJldHdlZW4KKyAqIEFDUCBTUkFNIDwtPiBJMlMKKyAqLworc3RhdGlj IHZvaWQgc2V0X2FjcF90b19pMnNfZG1hX2Rlc2NyaXB0b3JzKHZvaWQgX19pb21lbSAqYWNwX21t aW8sCisJCQkJCSAgIHUzMiBzaXplLCBpbnQgZGlyZWN0aW9uKQoreworCisJdTE2IG51bV9kZXNj cjsKKwl1MTYgZG1hX2RzY3JfaWR4ID0gUExBWUJBQ0tfU1RBUlRfRE1BX0RFU0NSX0NIMTM7CisJ YWNwX2RtYV9kc2NyX3RyYW5zZmVyX3QgZG1hZHNjclsyXTsKKworCW51bV9kZXNjciA9IDI7CisK KwlkbWFkc2NyWzBdLnhmZXJfdmFsID0gMDsKKwlpZiAoZGlyZWN0aW9uID09IFNORFJWX1BDTV9T VFJFQU1fUExBWUJBQ0spIHsKKwkJZG1hX2RzY3JfaWR4ID0gUExBWUJBQ0tfU1RBUlRfRE1BX0RF U0NSX0NIMTM7CisJCWRtYWRzY3JbMF0uc3JjID0gQUNQX1NIQVJFRF9SQU1fQkFOS18xX0FERFJF U1M7CisJCS8qIGRtYWRzY3JbMF0uZGVzdCBpcyB1bnVzZWQgYnkgaGFyZHdhcmUuIEFzc2duZWQg dG8gMCB0bworCQkgKiByZW1vdmUgY29tcGlsZXIgd2FybmluZworCQkqLworCQlkbWFkc2NyWzBd LmRlc3QgPSAwOworCQlkbWFkc2NyWzBdLnhmZXJfdmFsIHw9IEJJVCgyMikgfCAoVE9fQUNQX0ky U18xIDw8IDE2KSB8CisJCQkJCShzaXplIC8gMik7CisJfSBlbHNlIHsKKwkJZG1hX2RzY3JfaWR4 ID0gQ0FQVFVSRV9TVEFSVF9ETUFfREVTQ1JfQ0gxNTsKKwkJLyogZG1hZHNjclswXS5zcmMgaXMg dW51c2VkIGJ5IGhhcmR3YXJlLiBBc3NnbmVkIHRvIDAgdG8KKwkJICogcmVtb3ZlIGNvbXBpbGVy IHdhcm5pbmcKKwkJKi8KKwkJZG1hZHNjclswXS5zcmMgPSAwOworCQlkbWFkc2NyWzBdLmRlc3Qg PSBBQ1BfU0hBUkVEX1JBTV9CQU5LXzVfQUREUkVTUzsKKwkJZG1hZHNjclswXS54ZmVyX3ZhbCB8 PSBCSVQoMjIpIHwKKwkJCQkJKEZST01fQUNQX0kyU18xIDw8IDE2KSB8IChzaXplIC8gMik7CisJ fQorCisJY29uZmlnX2RtYV9kZXNjcmlwdG9yX2luX3NyYW0oYWNwX21taW8sIGRtYV9kc2NyX2lk eCwgJmRtYWRzY3JbMF0pOworCisJZG1hZHNjclsxXS54ZmVyX3ZhbCA9IDA7CisJaWYgKGRpcmVj dGlvbiA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKSB7CisJCWRtYV9kc2NyX2lkeCA9IFBM QVlCQUNLX0VORF9ETUFfREVTQ1JfQ0gxMzsKKwkJZG1hZHNjclsxXS5zcmMgPSBkbWFkc2NyWzBd LnNyYyArIChzaXplIC8gMik7CisJCS8qIGRtYWRzY3JbMV0uZGVzdCBpcyB1bnVzZWQgYnkgaGFy ZHdhcmUuIEFzc2duZWQgdG8gMCB0bworCQkgKiByZW1vdmUgY29tcGlsZXIgd2FybmluZworCQkq LworCQlkbWFkc2NyWzFdLmRlc3QgPSAwOworCQlkbWFkc2NyWzFdLnhmZXJfdmFsIHw9IEJJVCgy MikgfCAoVE9fQUNQX0kyU18xIDw8IDE2KSB8CisJCQkJCShzaXplIC8gMik7CisJfSBlbHNlIHsK KwkJZG1hX2RzY3JfaWR4ID0gQ0FQVFVSRV9FTkRfRE1BX0RFU0NSX0NIMTU7CisJCS8qIGRtYWRz Y3JbMV0uc3JjIGlzIHVudXNlZCBieSBoYXJkd2FyZS4gQXNzZ25lZCB0byAwIHRvCisJCSAqIHJl bW92ZSBjb21waWxlciB3YXJuaW5nCisJCSovCisJCWRtYWRzY3JbMV0uc3JjID0gMDsKKwkJZG1h ZHNjclsxXS5kZXN0ID0gZG1hZHNjclswXS5kZXN0ICsgKHNpemUgLyAyKTsKKwkJZG1hZHNjclsx XS54ZmVyX3ZhbCB8PSBCSVQoMjIpIHwKKwkJCQkJKEZST01fQUNQX0kyU18xIDw8IDE2KSB8IChz aXplIC8gMik7CisJfQorCisJY29uZmlnX2RtYV9kZXNjcmlwdG9yX2luX3NyYW0oYWNwX21taW8s IGRtYV9kc2NyX2lkeCwgJmRtYWRzY3JbMV0pOworCisJLyogQ29uZmlndXJlIHRoZSBETUEgY2hh bm5lbCB3aXRoIHRoZSBhYm92ZSBkZXNjcmlwdG9yZSAqLworCWlmIChkaXJlY3Rpb24gPT0gU05E UlZfUENNX1NUUkVBTV9QTEFZQkFDSykgeworCQkvKiBzdGFydGluZyBkZXNjcmlwdG9yIGZvciB0 aGlzIGNoYW5uZWwgKi8KKwkJZG1hX2RzY3JfaWR4ID0gUExBWUJBQ0tfU1RBUlRfRE1BX0RFU0NS X0NIMTM7CisJCWNvbmZpZ19hY3BfZG1hX2NoYW5uZWwoYWNwX21taW8sIEFDUF9UT19JMlNfRE1B X0NIX05VTSwKKwkJCQkJZG1hX2RzY3JfaWR4LCBudW1fZGVzY3IsCisJCQkJCUFDUF9ETUFfUFJJ T1JJVFlfTEVWRUxfTk9STUFMKTsKKwl9IGVsc2UgeworCQkvKiBzdGFydGluZyBkZXNjcmlwdG9y IGZvciB0aGlzIGNoYW5uZWwgKi8KKwkJZG1hX2RzY3JfaWR4ID0gQ0FQVFVSRV9TVEFSVF9ETUFf REVTQ1JfQ0gxNTsKKwkJY29uZmlnX2FjcF9kbWFfY2hhbm5lbChhY3BfbW1pbywgSTJTX1RPX0FD UF9ETUFfQ0hfTlVNLAorCQkJCQlkbWFfZHNjcl9pZHgsIG51bV9kZXNjciwKKwkJCQkJQUNQX0RN QV9QUklPUklUWV9MRVZFTF9OT1JNQUwpOworCX0KKworfQorCit1MTYgZ2V0X2RzY3JfaWR4KHZv aWQgX19pb21lbSAqYWNwX21taW8sIGludCBkaXJlY3Rpb24pCit7CisJdTE2IGRzY3JfaWR4Owor CisJaWYgKGRpcmVjdGlvbiA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKSB7CisJCWRzY3Jf aWR4ID0gYWNwX3JlZ19yZWFkKGFjcF9tbWlvLCBtbUFDUF9ETUFfQ1VSX0RTQ1JfMTMpOworCQlp ZiAoZHNjcl9pZHggPT0gUExBWUJBQ0tfU1RBUlRfRE1BX0RFU0NSX0NIMTMpCisJCQlkc2NyX2lk eCA9IFBMQVlCQUNLX1NUQVJUX0RNQV9ERVNDUl9DSDEyOworCQllbHNlCisJCQlkc2NyX2lkeCA9 IFBMQVlCQUNLX0VORF9ETUFfREVTQ1JfQ0gxMjsKKwl9IGVsc2UgeworCQlkc2NyX2lkeCA9IGFj cF9yZWdfcmVhZChhY3BfbW1pbywgbW1BQ1BfRE1BX0NVUl9EU0NSXzE1KTsKKwkJaWYgKGRzY3Jf aWR4ID09IENBUFRVUkVfU1RBUlRfRE1BX0RFU0NSX0NIMTUpCisJCQlkc2NyX2lkeCA9IENBUFRV UkVfRU5EX0RNQV9ERVNDUl9DSDE0OworCQllbHNlCisJCQlkc2NyX2lkeCA9IENBUFRVUkVfU1RB UlRfRE1BX0RFU0NSX0NIMTQ7CisJfQorCisJcmV0dXJuIGRzY3JfaWR4OworfQorCisvKiBDcmVh dGUgcGFnZSB0YWJsZSBlbnRyaWVzIGluIEFDUCBTUkFNIGZvciB0aGUgYWxsb2NhdGVkIG1lbW9y eSAqLworc3RhdGljIHZvaWQgYWNwX3B0ZV9jb25maWcodm9pZCBfX2lvbWVtICphY3BfbW1pbywg c3RydWN0IHBhZ2UgKnBnLAorCQkJICAgdTE2IG51bV9vZl9wYWdlcywgdTMyIHB0ZV9vZmZzZXQp Cit7CisJdTE2IHBhZ2VfaWR4OworCXU2NCBhZGRyOworCXUzMiBsb3c7CisJdTMyIGhpZ2g7CisJ dTMyIG9mZnNldDsKKworCW9mZnNldAk9IEFDUF9EQUdCX0dSUF9TUkJNX1NSQU1fQkFTRV9PRkZT RVQgKyAocHRlX29mZnNldCAqIDgpOworCWZvciAocGFnZV9pZHggPSAwOyBwYWdlX2lkeCA8IChu dW1fb2ZfcGFnZXMpOyBwYWdlX2lkeCsrKSB7CisJCS8qIExvYWQgdGhlIGxvdyBhZGRyZXNzIG9m IHBhZ2UgaW50IEFDUCBTUkFNIHRocm91Z2ggU1JCTSAqLworCQlhY3BfcmVnX3dyaXRlKChvZmZz ZXQgKyAocGFnZV9pZHggKiA4KSksCisJCQlhY3BfbW1pbywgbW1BQ1BfU1JCTV9UYXJnX0lkeF9B ZGRyKTsKKwkJYWRkciA9IHBhZ2VfdG9fcGh5cyhwZyk7CisKKwkJbG93ID0gbG93ZXJfMzJfYml0 cyhhZGRyKTsKKwkJaGlnaCA9IHVwcGVyXzMyX2JpdHMoYWRkcik7CisKKwkJYWNwX3JlZ193cml0 ZShsb3csIGFjcF9tbWlvLCBtbUFDUF9TUkJNX1RhcmdfSWR4X0RhdGEpOworCisJCS8qIExvYWQg dGhlIEhpZ2ggYWRkcmVzcyBvZiBwYWdlIGludCBBQ1AgU1JBTSB0aHJvdWdoIFNSQk0gKi8KKwkJ YWNwX3JlZ193cml0ZSgob2Zmc2V0ICsgKHBhZ2VfaWR4ICogOCkgKyA0KSwKKwkJCWFjcF9tbWlv LCBtbUFDUF9TUkJNX1RhcmdfSWR4X0FkZHIpOworCisJCS8qIHBhZ2UgZW5hYmxlIGluIEFDUCAq LworCQloaWdoIHw9IEJJVCgzMSk7CisJCWFjcF9yZWdfd3JpdGUoaGlnaCwgYWNwX21taW8sIG1t QUNQX1NSQk1fVGFyZ19JZHhfRGF0YSk7CisKKwkJLyogTW92ZSB0byBuZXh0IHBoeXNpY2FsbHkg Y29udGlndW9zIHBhZ2UgKi8KKwkJcGcrKzsKKwl9Cit9CisKKy8qIGVuYWJsZXMvZGlzYWJsZXMg QUNQJ3MgZXh0ZXJuYWwgaW50ZXJydXB0ICovCit2b2lkIGFjcF9lbmFibGVfZXh0ZXJuYWxfaW50 ZXJydXB0cyh2b2lkIF9faW9tZW0gKmFjcF9tbWlvLAorCQkJCQkgICBpbnQgZW5hYmxlKQorewor CXUzMiBhY3BfZXh0X2ludHJfZW5iOworCisJYWNwX2V4dF9pbnRyX2VuYiA9IGVuYWJsZSA/CisJ CQkJQUNQX0VYVEVSTkFMX0lOVFJfRU5CX19BQ1BFeHRJbnRyRW5iX01BU0sgOiAwOworCisJLyog V3JpdGUgdGhlIFNvZnR3YXJlIEV4dGVybmFsIEludGVycnVwdCBFbmFibGUgcmVnaXN0ZXIgKi8K KwlhY3BfcmVnX3dyaXRlKGFjcF9leHRfaW50cl9lbmIsIGFjcF9tbWlvLCBtbUFDUF9FWFRFUk5B TF9JTlRSX0VOQik7Cit9CisKKy8qIENsZWFyIChhY2tub3dsZWRnZSkgRE1BICdJbnRlcnJ1cHQg b24gQ29tcGxldGUnIChJT0MpIGluIEFDUAorICogZXh0ZXJuYWwgaW50ZXJydXB0IHN0YXR1cyBy ZWdpc3RlcgorICovCit2b2lkIGFjcF9leHRfc3RhdF9jbGVhcl9kbWFpb2Modm9pZCBfX2lvbWVt ICphY3BfbW1pbywgdTggY2hfbnVtKQoreworCXUzMiBleHRfaW50cl9zdGF0OworCXUzMiBjaG1h c2sgPSBCSVQoY2hfbnVtKTsKKworCWV4dF9pbnRyX3N0YXQgPSBhY3BfcmVnX3JlYWQoYWNwX21t aW8sIG1tQUNQX0VYVEVSTkFMX0lOVFJfU1RBVCk7CisJaWYgKGV4dF9pbnRyX3N0YXQgJiAoY2ht YXNrIDw8CisJCQkgICAgIEFDUF9FWFRFUk5BTF9JTlRSX1NUQVRfX0RNQUlPQ1N0YXRfX1NISUZU KSkgeworCisJCWV4dF9pbnRyX3N0YXQgJj0gKGNobWFzayA8PAorCQkJCSAgQUNQX0VYVEVSTkFM X0lOVFJfU1RBVF9fRE1BSU9DQWNrX19TSElGVCk7CisJCWFjcF9yZWdfd3JpdGUoZXh0X2ludHJf c3RhdCwgYWNwX21taW8sCisJCQkJCQltbUFDUF9FWFRFUk5BTF9JTlRSX1NUQVQpOworCX0KK30K KworLyogQ2hlY2sgd2hldGhlciBBQ1AgRE1BIGludGVycnVwdCAoSU9DKSBpcyBnZW5lcmF0ZWQg b3Igbm90ICovCit1MzIgYWNwX2dldF9pbnRyX2ZsYWcodm9pZCBfX2lvbWVtICphY3BfbW1pbykK K3sKKwl1MzIgZXh0X2ludHJfc3RhdHVzOworCXUzMiBpbnRyX2dlbjsKKworCWV4dF9pbnRyX3N0 YXR1cyA9IGFjcF9yZWdfcmVhZChhY3BfbW1pbywgbW1BQ1BfRVhURVJOQUxfSU5UUl9TVEFUKTsK KwlpbnRyX2dlbiA9ICgoKGV4dF9pbnRyX3N0YXR1cyAmCisJCSAgICAgIEFDUF9FWFRFUk5BTF9J TlRSX1NUQVRfX0RNQUlPQ1N0YXRfTUFTSykgPj4KKwkJICAgICBBQ1BfRVhURVJOQUxfSU5UUl9T VEFUX19ETUFJT0NTdGF0X19TSElGVCkpOworCisJcmV0dXJuIGludHJfZ2VuOworfQorCit2b2lk IGNvbmZpZ19hY3BfZG1hKHZvaWQgX19pb21lbSAqYWNwX21taW8sCisJCQkgICBzdHJ1Y3QgYXVk aW9fc3Vic3RyZWFtX2RhdGEgKmF1ZGlvX2NvbmZpZykKK3sKKwl1MzIgcHRlX29mZnNldDsKKwor CWlmIChhdWRpb19jb25maWctPmRpcmVjdGlvbiA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNL KQorCQlwdGVfb2Zmc2V0ID0gUExBWUJBQ0tfUFRFX09GRlNFVDsKKwllbHNlCisJCXB0ZV9vZmZz ZXQgPSBDQVBUVVJFX1BURV9PRkZTRVQ7CisKKwlhY3BfcHRlX2NvbmZpZyhhY3BfbW1pbywgYXVk aW9fY29uZmlnLT5wZywgYXVkaW9fY29uZmlnLT5udW1fb2ZfcGFnZXMsCisJCQlwdGVfb2Zmc2V0 KTsKKworCS8qIENvbmZpZ3VyZSBTeXN0ZW0gbWVtb3J5IDwtPiBBQ1AgU1JBTSBETUEgZGVzY3Jp cHRvcnMgKi8KKwlzZXRfYWNwX3N5c21lbV9kbWFfZGVzY3JpcHRvcnMoYWNwX21taW8sIGF1ZGlv X2NvbmZpZy0+c2l6ZSwKKwkJCQkgICAgICAgYXVkaW9fY29uZmlnLT5kaXJlY3Rpb24sIHB0ZV9v ZmZzZXQpOworCisJLyogQ29uZmlndXJlIEFDUCBTUkFNIDwtPiBJMlMgRE1BIGRlc2NyaXB0b3Jz ICovCisJc2V0X2FjcF90b19pMnNfZG1hX2Rlc2NyaXB0b3JzKGFjcF9tbWlvLCBhdWRpb19jb25m aWctPnNpemUsCisJCQkJCWF1ZGlvX2NvbmZpZy0+ZGlyZWN0aW9uKTsKK30KKworLyogU3RhcnQg YSBnaXZlbiBETUEgY2hhbm5lbCB0cmFuc2ZlciAqLwordm9pZCBhY3BfZG1hX3N0YXJ0KHZvaWQg X19pb21lbSAqYWNwX21taW8sCisJCQkgdTE2IGNoX251bSwgYm9vbCBpc19jaXJjdWxhcikKK3sK Kwl1MzIgZG1hX2N0cmw7CisKKwkvKiByZWFkIHRoZSBkbWEgY29udHJvbCByZWdpc3RlciBhbmQg ZGlzYWJsZSB0aGUgY2hhbm5lbCBydW4gZmllbGQgKi8KKwlkbWFfY3RybCA9IGFjcF9yZWdfcmVh ZChhY3BfbW1pbywgbW1BQ1BfRE1BX0NOVExfMCArIGNoX251bSk7CisKKwkvKiBJbnZhbGlkYXRp bmcgdGhlIERBR0IgY2FjaGUgKi8KKwlhY3BfcmVnX3dyaXRlKDEsIGFjcF9tbWlvLCBtbUFDUF9E QUdCX0FUVV9DVFJMKTsKKworCS8qIGNvbmZpZ3VyZSB0aGUgRE1BIGNoYW5uZWwgYW5kIHN0YXJ0 IHRoZSBETUEgdHJhbnNmZXIKKwkgKiBzZXQgZG1hY2hydW4gYml0IHRvIHN0YXJ0IHRoZSB0cmFu c2ZlciBhbmQgZW5hYmxlIHRoZQorCSAqIGludGVycnVwdCBvbiBjb21wbGV0aW9uIG9mIHRoZSBk bWEgdHJhbnNmZXIKKwkgKi8KKwlkbWFfY3RybCB8PSBBQ1BfRE1BX0NOVExfMF9fRE1BQ2hSdW5f TUFTSzsKKworCXN3aXRjaCAoY2hfbnVtKSB7CisJY2FzZSBBQ1BfVE9fSTJTX0RNQV9DSF9OVU06 CisJY2FzZSBBQ1BfVE9fU1lTUkFNX0NIX05VTToKKwljYXNlIEkyU19UT19BQ1BfRE1BX0NIX05V TToKKwkJZG1hX2N0cmwgfD0gQUNQX0RNQV9DTlRMXzBfX0RNQUNoSU9DRW5fTUFTSzsKKwkJYnJl YWs7CisJZGVmYXVsdDoKKwkJZG1hX2N0cmwgJj0gfkFDUF9ETUFfQ05UTF8wX19ETUFDaElPQ0Vu X01BU0s7CisJCWJyZWFrOworCX0KKworCS8qIGVuYWJsZSAgZm9yIEFDUCBTUkFNIHRvL2Zyb20g STJTIERNQSBjaGFubmVsICovCisJaWYgKGlzX2NpcmN1bGFyID09IHRydWUpCisJCWRtYV9jdHJs IHw9IEFDUF9ETUFfQ05UTF8wX19DaXJjdWxhcl9ETUFfRW5fTUFTSzsKKwllbHNlCisJCWRtYV9j dHJsICY9IH5BQ1BfRE1BX0NOVExfMF9fQ2lyY3VsYXJfRE1BX0VuX01BU0s7CisKKwlhY3BfcmVn X3dyaXRlKGRtYV9jdHJsLCBhY3BfbW1pbywgbW1BQ1BfRE1BX0NOVExfMCArIGNoX251bSk7Cit9 CisKKy8qIFN0b3AgYSBnaXZlbiBETUEgY2hhbm5lbCB0cmFuc2ZlciAqLworaW50IGFjcF9kbWFf c3RvcCh2b2lkIF9faW9tZW0gKmFjcF9tbWlvLCB1OCBjaF9udW0pCit7CisJdTMyIGRtYV9jdHJs OworCXUzMiBkbWFfY2hfc3RzOworCXUzMiBjb3VudCA9IEFDUF9ETUFfUkVTRVRfVElNRTsKKwor CWRtYV9jdHJsID0gYWNwX3JlZ19yZWFkKGFjcF9tbWlvLCBtbUFDUF9ETUFfQ05UTF8wICsgY2hf bnVtKTsKKworCS8qIGNsZWFyIHRoZSBkbWEgY29udHJvbCByZWdpc3RlciBmaWVsZHMgYmVmb3Jl IHdyaXRpbmcgemVybworCSAqIGluIHJlc2V0IGJpdAorCSovCisJZG1hX2N0cmwgJj0gfkFDUF9E TUFfQ05UTF8wX19ETUFDaFJ1bl9NQVNLOworCWRtYV9jdHJsICY9IH5BQ1BfRE1BX0NOVExfMF9f RE1BQ2hJT0NFbl9NQVNLOworCisJYWNwX3JlZ193cml0ZShkbWFfY3RybCwgYWNwX21taW8sIG1t QUNQX0RNQV9DTlRMXzAgKyBjaF9udW0pOworCWRtYV9jaF9zdHMgPSBhY3BfcmVnX3JlYWQoYWNw X21taW8sIG1tQUNQX0RNQV9DSF9TVFMpOworCisJaWYgKGRtYV9jaF9zdHMgJiBCSVQoY2hfbnVt KSkgeworCQkvKiBzZXQgdGhlIHJlc2V0IGJpdCBmb3IgdGhpcyBjaGFubmVsIHRvIHN0b3AgdGhl IGRtYQorCQkqICB0cmFuc2ZlcgorCQkqLworCQlkbWFfY3RybCB8PSBBQ1BfRE1BX0NOVExfMF9f RE1BQ2hSc3RfTUFTSzsKKwkJYWNwX3JlZ193cml0ZShkbWFfY3RybCwgYWNwX21taW8sIG1tQUNQ X0RNQV9DTlRMXzAgKyBjaF9udW0pOworCX0KKworCS8qIGNoZWNrIHRoZSBjaGFubmVsIHN0YXR1 cyBiaXQgZm9yIHNvbWUgdGltZSBhbmQgcmV0dXJuIHRoZSBzdGF0dXMgKi8KKwl3aGlsZSAodHJ1 ZSkgeworCQlkbWFfY2hfc3RzID0gYWNwX3JlZ19yZWFkKGFjcF9tbWlvLCBtbUFDUF9ETUFfQ0hf U1RTKTsKKwkJaWYgKCEoZG1hX2NoX3N0cyAmIEJJVChjaF9udW0pKSkgeworCQkJLyogY2xlYXIg dGhlIHJlc2V0IGZsYWcgYWZ0ZXIgc3VjY2Vzc2Z1bGx5IHN0b3BwaW5nCisJCQkqIHRoZSBkbWEg dHJhbnNmZXIgYW5kIGJyZWFrIGZyb20gdGhlIGxvb3AKKwkJCSovCisJCQlkbWFfY3RybCAmPSB+ QUNQX0RNQV9DTlRMXzBfX0RNQUNoUnN0X01BU0s7CisKKwkJCWFjcF9yZWdfd3JpdGUoZG1hX2N0 cmwsIGFjcF9tbWlvLCBtbUFDUF9ETUFfQ05UTF8wCisJCQkJCQkJCSsgY2hfbnVtKTsKKwkJCWJy ZWFrOworCQl9CisJCWlmICgtLWNvdW50ID09IDApIHsKKwkJCXByX2VycigiRmFpbGVkIHRvIHN0 b3AgQUNQIERNQSBjaGFubmVsIDogJWRcbiIsIGNoX251bSk7CisJCQlyZXR1cm4gLUVUSU1FRE9V VDsKKwkJfQorCQl1ZGVsYXkoMTAwKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIEluaXRpYWxp emUgYW5kIGJyaW5nIEFDUCBoYXJkd2FyZSB0byBkZWZhdWx0IHN0YXRlLiAqLworaW50IGFjcF9p bml0KHZvaWQgX19pb21lbSAqYWNwX21taW8pCit7CisJdTMyIHZhbDsKKwl1MzIgY291bnQ7CisK KwkvKiBBc3NlcnQgU29mdCByZXNldCBvZiBBQ1AgKi8KKwl2YWwgPSBhY3BfcmVnX3JlYWQoYWNw X21taW8sIG1tQUNQX1NPRlRfUkVTRVQpOworCisJdmFsIHw9IEFDUF9TT0ZUX1JFU0VUX19Tb2Z0 UmVzZXRBdWRfTUFTSzsKKwlhY3BfcmVnX3dyaXRlKHZhbCwgYWNwX21taW8sIG1tQUNQX1NPRlRf UkVTRVQpOworCisJY291bnQgPSBBQ1BfU09GVF9SRVNFVF9ET05FX1RJTUVfT1VUX1ZBTFVFOwor CXdoaWxlICh0cnVlKSB7CisJCXZhbCA9IGFjcF9yZWdfcmVhZChhY3BfbW1pbywgbW1BQ1BfU09G VF9SRVNFVCk7CisJCWlmIChBQ1BfU09GVF9SRVNFVF9fU29mdFJlc2V0QXVkRG9uZV9NQVNLID09 CisJCSAgICAodmFsICYgQUNQX1NPRlRfUkVTRVRfX1NvZnRSZXNldEF1ZERvbmVfTUFTSykpCisJ CQlicmVhazsKKwkJaWYgKC0tY291bnQgPT0gMCkgeworCQkJcHJfZXJyKCJGYWlsZWQgdG8gcmVz ZXQgQUNQXG4iKTsKKwkJCXJldHVybiAtRVRJTUVET1VUOworCQl9CisJCXVkZWxheSgxMDApOwor CX0KKworCS8qIEVuYWJsZSBjbG9jayB0byBBQ1AgYW5kIHdhaXQgdW50aWwgdGhlIGNsb2NrIGlz IGVuYWJsZWQgKi8KKwl2YWwgPSBhY3BfcmVnX3JlYWQoYWNwX21taW8sIG1tQUNQX0NPTlRST0wp OworCXZhbCA9IHZhbCB8IEFDUF9DT05UUk9MX19DbGtFbl9NQVNLOworCWFjcF9yZWdfd3JpdGUo dmFsLCBhY3BfbW1pbywgbW1BQ1BfQ09OVFJPTCk7CisKKwljb3VudCA9IEFDUF9DTE9DS19FTl9U SU1FX09VVF9WQUxVRTsKKworCXdoaWxlICh0cnVlKSB7CisJCXZhbCA9IGFjcF9yZWdfcmVhZChh Y3BfbW1pbywgbW1BQ1BfU1RBVFVTKTsKKwkJaWYgKHZhbCAmICh1MzIpIDB4MSkKKwkJCWJyZWFr OworCQlpZiAoLS1jb3VudCA9PSAwKSB7CisJCQlwcl9lcnIoIkZhaWxlZCB0byByZXNldCBBQ1Bc biIpOworCQkJcmV0dXJuIC1FVElNRURPVVQ7CisJCX0KKwkJdWRlbGF5KDEwMCk7CisJfQorCisJ LyogRGVhc3NlcnQgdGhlIFNPRlQgUkVTRVQgZmxhZ3MgKi8KKwl2YWwgPSBhY3BfcmVnX3JlYWQo YWNwX21taW8sIG1tQUNQX1NPRlRfUkVTRVQpOworCXZhbCAmPSB+QUNQX1NPRlRfUkVTRVRfX1Nv ZnRSZXNldEF1ZF9NQVNLOworCWFjcF9yZWdfd3JpdGUodmFsLCBhY3BfbW1pbywgbW1BQ1BfU09G VF9SRVNFVCk7CisKKwkvKiBpbml0aWFpbGl6ZSBPbmlvbiBjb250cm9sIERBR0IgcmVnaXN0ZXIg Ki8KKwlhY3BfcmVnX3dyaXRlKE9OSU9OX0NOVExfREVGQVVMVCwgYWNwX21taW8sIG1tQUNQX0FY STJEQUdCX09OSU9OX0NOVEwpOworCisJLyogaW5pdGlhaWxpemUgR2FybGljIGNvbnRyb2wgREFH QiByZWdpc3RlcnMgKi8KKwlhY3BfcmVnX3dyaXRlKEdBUkxJQ19DTlRMX0RFRkFVTFQsIGFjcF9t bWlvLAorCQkJbW1BQ1BfQVhJMkRBR0JfR0FSTElDX0NOVEwpOworCisJYWNwX2RtYV9kZXNjcl9p bml0KGFjcF9tbWlvKTsKKworCWFjcF9yZWdfd3JpdGUoQUNQX1NSQU1fQkFTRV9BRERSRVNTLCBh Y3BfbW1pbywKKwkJCW1tQUNQX0RNQV9ERVNDX0JBU0VfQUREUik7CisKKwkvKiBOdW0gb2YgZGVz Y3JpcHRpb3JzIGluIFNSQU0gMHg0LCBtZWFucyAyNTYgZGVzY3JpcHRvcnM7KDY0ICogNCkgKi8K KwlhY3BfcmVnX3dyaXRlKDB4NCwgYWNwX21taW8sIG1tQUNQX0RNQV9ERVNDX01BWF9OVU1fRFND Uik7CisJYWNwX3JlZ193cml0ZShBQ1BfRVhURVJOQUxfSU5UUl9DTlRMX19ETUFJT0NNYXNrX01B U0ssCisJCWFjcF9tbWlvLCBtbUFDUF9FWFRFUk5BTF9JTlRSX0NOVEwpOworCisJLyogRGVzaWdu d2FyZSBJMlMgZHJpdmVyIHJlcXVyaWVzIHByb3BlciBjYXBhYmlsaXRpZXMKKwkgKiBmcm9tIG1t QUNQX0kyU01JQ1NQX0NPTVBfUEFSQU1fMSByZWdpc3Rlci4gVGhlIHJlZ2lzdGVyCisJICogcmVw b3J0cyBwbGF5YmFjayBhbmQgY2FwdHVyZSBjYXBhYmlsaXRpZXMgdGhvdWdoIHRoZQorCSAqIE1J QyBpbnN0YW5jZSBvZiBEVyBJMlMgY29udHJvbGxlciBzdXBwb3J0cyBjYXB0dXJlIG9ubHkKKwkg KiBQcm92aWRlIGEgd29ya2Fyb3VuZCBieSBtYXNraW5nIHRoZSBjYXBhYmlsaXR5IGludG8gYQor CSAqIHNjcmF0Y2ggcmVnaXN0ZXIgYW5kIHByb3ZpZGUgc2NyYXRjaCByZWdpc3RlciBvZmZzZXQg YXMKKwkgKiB0aG91Z2ggaXQgaXMgbW1BQ1BfSTJTTUlDU1BfQ09NUF9QQVJBTV8xCisJICovCisK Kwl2YWwgPSBhY3BfcmVnX3JlYWQoYWNwX21taW8sIG1tQUNQX0kyU01JQ1NQX0NPTVBfUEFSQU1f MSk7CisJdmFsID0gdmFsICYgfkJJVCg1KTsKKwlhY3BfcmVnX3dyaXRlKHZhbCwgYWNwX21taW8s IG1tQUNQX1NDUkFUQ0hfUkVHXzApOworCXJldHVybiAwOworfQorCisvKiBEZWludGlhbGl6ZSBB Q1AgKi8KK2ludCBhY3BfZGVpbml0KHZvaWQgX19pb21lbSAqYWNwX21taW8pCit7CisJdTMyIHZh bDsKKwl1MzIgY291bnQ7CisKKwkvKiBBc3NlcnQgU29mdCByZXNldCBvZiBBQ1AgKi8KKwl2YWwg PSBhY3BfcmVnX3JlYWQoYWNwX21taW8sIG1tQUNQX1NPRlRfUkVTRVQpOworCisJdmFsIHw9IEFD UF9TT0ZUX1JFU0VUX19Tb2Z0UmVzZXRBdWRfTUFTSzsKKwlhY3BfcmVnX3dyaXRlKHZhbCwgYWNw X21taW8sIG1tQUNQX1NPRlRfUkVTRVQpOworCisJY291bnQgPSBBQ1BfU09GVF9SRVNFVF9ET05F X1RJTUVfT1VUX1ZBTFVFOworCXdoaWxlICh0cnVlKSB7CisJCXZhbCA9IGFjcF9yZWdfcmVhZChh Y3BfbW1pbywgbW1BQ1BfU09GVF9SRVNFVCk7CisJCWlmIChBQ1BfU09GVF9SRVNFVF9fU29mdFJl c2V0QXVkRG9uZV9NQVNLID09CisJCSAgICAodmFsICYgQUNQX1NPRlRfUkVTRVRfX1NvZnRSZXNl dEF1ZERvbmVfTUFTSykpCisJCQlicmVhazsKKwkJaWYgKC0tY291bnQgPT0gMCkgeworCQkJcHJf ZXJyKCJGYWlsZWQgdG8gcmVzZXQgQUNQXG4iKTsKKwkJCXJldHVybiAtRVRJTUVET1VUOworCQl9 CisJCXVkZWxheSgxMDApOworCX0KKwkvKiogRGlzYWJsZSBBQ1AgY2xvY2sgKi8KKwl2YWwgPSBh Y3BfcmVnX3JlYWQoYWNwX21taW8sIG1tQUNQX0NPTlRST0wpOworCXZhbCAmPSB+QUNQX0NPTlRS T0xfX0Nsa0VuX01BU0s7CisJYWNwX3JlZ193cml0ZSh2YWwsIGFjcF9tbWlvLCBtbUFDUF9DT05U Uk9MKTsKKworCWNvdW50ID0gQUNQX0NMT0NLX0VOX1RJTUVfT1VUX1ZBTFVFOworCisJd2hpbGUg KHRydWUpIHsKKwkJdmFsID0gYWNwX3JlZ19yZWFkKGFjcF9tbWlvLCBtbUFDUF9TVEFUVVMpOwor CQlpZiAoISh2YWwgJiAodTMyKSAweDEpKQorCQkJYnJlYWs7CisJCWlmICgtLWNvdW50ID09IDAp IHsKKwkJCXByX2VycigiRmFpbGVkIHRvIHJlc2V0IEFDUFxuIik7CisJCQlyZXR1cm4gLUVUSU1F RE9VVDsKKwkJfQorCQl1ZGVsYXkoMTAwKTsKKwl9CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQg YS9zb3VuZC9zb2MvYW1kL2FjcC5oIGIvc291bmQvc29jL2FtZC9hY3AuaApuZXcgZmlsZSBtb2Rl IDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2MzMGVhCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQv c29jL2FtZC9hY3AuaApAQCAtMCwwICsxLDEzOSBAQAorI2lmbmRlZiBfX0FDUF9IV19ICisjZGVm aW5lIF9fQUNQX0hXX0gKKworI2luY2x1ZGUgImluY2x1ZGUvYWNwXzJfMl9kLmgiCisjaW5jbHVk ZSAiaW5jbHVkZS9hY3BfMl8yX3NoX21hc2suaCIKKworI2RlZmluZSBQQUdFX1NJWkVfNEsJCQkJ NDA5NgorI2RlZmluZSBQQUdFX1NJWkVfNEtfRU5BQkxFCQkJMHgwMgorCisjZGVmaW5lIFBMQVlC QUNLX1BURV9PRkZTRVQJCQkxMAorI2RlZmluZSBDQVBUVVJFX1BURV9PRkZTRVQJCQkwCisKKyNk ZWZpbmUgR0FSTElDX0NOVExfREVGQVVMVAkJCTB4MDAwMDBGQjQKKyNkZWZpbmUgT05JT05fQ05U TF9ERUZBVUxUCQkJMHgwMDAwMEZCNAorCisjZGVmaW5lIEFDUF9QSFlTSUNBTF9CQVNFCQkJMHgx NDAwMAorCisvKiBQbGF5YmFjayBTUkFNIGFkZHJlc3MgKGFzIGEgZGVzdGluYXRpb24gaW4gZG1h IGRlc2NyaXB0b3IpICovCisjZGVmaW5lIEFDUF9TSEFSRURfUkFNX0JBTktfMV9BRERSRVNTCQkw eDQwMDIwMDAKKworLyogQ2FwdHVyZSBTUkFNIGFkZHJlc3MgKGFzIGEgc291cmNlIGluIGRtYSBk ZXNjcmlwdG9yKSAqLworI2RlZmluZSBBQ1BfU0hBUkVEX1JBTV9CQU5LXzVfQUREUkVTUwkJMHg0 MDBBMDAwCisKKyNkZWZpbmUgQUNQX0RNQV9SRVNFVF9USU1FCQkJMTAwMDAKKyNkZWZpbmUgQUNQ X0NMT0NLX0VOX1RJTUVfT1VUX1ZBTFVFCQkweDAwMDAwMEZGCisjZGVmaW5lIEFDUF9TT0ZUX1JF U0VUX0RPTkVfVElNRV9PVVRfVkFMVUUJMHgwMDAwMDBGRgorI2RlZmluZSBBQ1BfRE1BX0NPTVBM RVRFX1RJTUVfT1VUX1ZBTFVFCQkweDAwMDAwMEZGCisKKyNkZWZpbmUgQUNQX1NSQU1fQkFTRV9B RERSRVNTCQkJMHg0MDAwMDAwCisjZGVmaW5lIEFDUF9EQUdCX0dSUF9TUkFNX0JBU0VfQUREUkVT UwkJMHg0MDAxMDAwCisjZGVmaW5lIEFDUF9EQUdCX0dSUF9TUkJNX1NSQU1fQkFTRV9PRkZTRVQJ MHgxMDAwCisjZGVmaW5lIEFDUF9JTlRFUk5BTF9BUEVSVFVSRV9XSU5ET1dfMF9BRERSRVNTCTB4 MDAwMDAwMDAKKyNkZWZpbmUgQUNQX0lOVEVSTkFMX0FQRVJUVVJFX1dJTkRPV180X0FERFJFU1MJ MHgwMTgwMDAwMAorCisjZGVmaW5lIFRPX0FDUF9JMlNfMSAgIDB4MgorI2RlZmluZSBUT19BQ1Bf STJTXzIgICAweDQKKyNkZWZpbmUgRlJPTV9BQ1BfSTJTXzEgMHhhCisjZGVmaW5lIEZST01fQUNQ X0kyU18yIDB4YgorCisjZGVmaW5lIEFDUF9USUxFX09OX01BU0sgICAgICAgICAgICAgICAgMHgw MworI2RlZmluZSBBQ1BfVElMRV9PRkZfTUFTSyAgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUg QUNQX1RJTEVfT05fUkVUQUlOX1JFR19NQVNLICAgICAweDFmCisjZGVmaW5lIEFDUF9USUxFX09G Rl9SRVRBSU5fUkVHX01BU0sgICAgMHgyMAorCisjZGVmaW5lIEFDUF9USUxFX1AxX01BU0sgICAg ICAgICAgICAgICAgMHgzZQorI2RlZmluZSBBQ1BfVElMRV9QMl9NQVNLICAgICAgICAgICAgICAg IDB4M2QKKyNkZWZpbmUgQUNQX1RJTEVfRFNQMF9NQVNLICAgICAgICAgICAgICAweDNiCisjZGVm aW5lIEFDUF9USUxFX0RTUDFfTUFTSyAgICAgICAgICAgICAgMHgzNworCisjZGVmaW5lIEFDUF9U SUxFX0RTUDJfTUFTSyAgICAgICAgICAgICAgMHgyZgorLyogUGxheWJhY2sgRE1BIGNoYW5uZWxz ICovCisjZGVmaW5lIFNZU1JBTV9UT19BQ1BfQ0hfTlVNIDEyCisjZGVmaW5lIEFDUF9UT19JMlNf RE1BX0NIX05VTSAxMworCisvKiBDYXB0dXJlIERNQSBjaGFubmVscyAqLworI2RlZmluZSBBQ1Bf VE9fU1lTUkFNX0NIX05VTSAxNAorI2RlZmluZSBJMlNfVE9fQUNQX0RNQV9DSF9OVU0gMTUKKwor I2RlZmluZSBQTEFZQkFDS19TVEFSVF9ETUFfREVTQ1JfQ0gxMiAwCisjZGVmaW5lIFBMQVlCQUNL X0VORF9ETUFfREVTQ1JfQ0gxMiAxCisKKyNkZWZpbmUgUExBWUJBQ0tfU1RBUlRfRE1BX0RFU0NS X0NIMTMgMgorI2RlZmluZSBQTEFZQkFDS19FTkRfRE1BX0RFU0NSX0NIMTMgMworCisKKyNkZWZp bmUgQ0FQVFVSRV9TVEFSVF9ETUFfREVTQ1JfQ0gxNCA0CisjZGVmaW5lIENBUFRVUkVfRU5EX0RN QV9ERVNDUl9DSDE0IDUKKworI2RlZmluZSBDQVBUVVJFX1NUQVJUX0RNQV9ERVNDUl9DSDE1IDYK KyNkZWZpbmUgQ0FQVFVSRV9FTkRfRE1BX0RFU0NSX0NIMTUgNworCitlbnVtIGFjcF9kbWFfcHJp b3JpdHlfbGV2ZWwgeworCS8qIDB4MCBTcGVjaWZpZXMgdGhlIERNQSBjaGFubmVsIGlzIGdpdmVu IG5vcm1hbCBwcmlvcml0eSAqLworCUFDUF9ETUFfUFJJT1JJVFlfTEVWRUxfTk9STUFMID0gMHgw LAorCS8qIDB4MSBTcGVjaWZpZXMgdGhlIERNQSBjaGFubmVsIGlzIGdpdmVuIGhpZ2ggcHJpb3Jp dHkgKi8KKwlBQ1BfRE1BX1BSSU9SSVRZX0xFVkVMX0hJR0ggPSAweDEsCisJQUNQX0RNQV9QUklP UklUWV9MRVZFTF9GT1JDRVNJWkUgPSAweEZGCit9OworCitzdHJ1Y3QgYXVkaW9fc3Vic3RyZWFt X2RhdGEgeworCXN0cnVjdCBwYWdlICpwZzsKKwl1bnNpZ25lZCBpbnQgb3JkZXI7CisJdTE2IG51 bV9vZl9wYWdlczsKKwl1MTYgZGlyZWN0aW9uOworCXVpbnQ2NF90IHNpemU7CisJdm9pZCBfX2lv bWVtICphY3BfbW1pbzsKK307CisKK2VudW0geworCUFDUF9USUxFX1AxID0gMCwKKwlBQ1BfVElM RV9QMiwKKwlBQ1BfVElMRV9EU1AwLAorCUFDUF9USUxFX0RTUDEsCisJQUNQX1RJTEVfRFNQMiwK K307CisKK2VudW0geworCUFDUF9ETUFfQVRUUklCVVRFU19TSEFSRURNRU1fVE9fREFHQl9PTklP TiA9IDB4MCwKKwlBQ1BfRE1BX0FUVFJJQlVURVNfU0hBUkVEX01FTV9UT19EQUdCX0dBUkxJQyA9 IDB4MSwKKwlBQ1BfRE1BX0FUVFJJQlVURVNfREFHQl9PTklPTl9UT19TSEFSRURNRU0gPSAweDgs CisJQUNQX0RNQV9BVFRSSUJVVEVTX0RBR0JfR0FSTElDX1RPX1NIQVJFRE1FTSA9IDB4OSwKKwlB Q1BfRE1BX0FUVFJJQlVURVNfRk9SQ0VfU0laRSA9IDB4RgorfTsKKwordHlwZWRlZiBzdHJ1Y3Qg YWNwX2RtYV9kc2NyX3RyYW5zZmVyIHsKKwkvKiBTcGVjaWZpZXMgdGhlIHNvdXJjZSBtZW1vcnkg bG9jYXRpb24gZm9yIHRoZSBETUEgZGF0YSB0cmFuc2Zlci4gKi8KKwl1MzIgc3JjOworCS8qIFNw ZWNpZmllcyB0aGUgZGVzdGluYXRpb24gbWVtb3J5IGxvY2F0aW9uIHRvIHdoZXJlIHRoZSBkYXRh IHdpbGwKKwkgKiBiZSB0cmFuc2ZlcnJlZC4KKwkqLworCXUzMiBkZXN0OworCS8qIFNwZWNpZmll cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIG5lZWQgdG8gYmUgdHJhbnNmZXJyZWQKKwkqIGZyb20gc291 cmNlIHRvIGRlc3RpbmF0aW9uIG1lbW9yeS5UcmFuc2ZlciBkaXJlY3Rpb24gJiBJT0MgZW5hYmxl CisJKi8KKwl1MzIgeGZlcl92YWw7CisJLyogUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgKi8KKwl1 MzIgcmVzZXJ2ZWQ7Cit9IGFjcF9kbWFfZHNjcl90cmFuc2Zlcl90OworCitleHRlcm4gdTMyIGFj cF9yZWdfcmVhZCh2b2lkIF9faW9tZW0gKmFjcF9tbWlvLCB1MzIgcmVnKTsKK2V4dGVybiB2b2lk IGFjcF9yZWdfd3JpdGUodTMyIHZhbCwgdm9pZCBfX2lvbWVtICphY3BfbW1pbywgdTMyIHJlZyk7 CitleHRlcm4gaW50IGFjcF9pbml0KHZvaWQgX19pb21lbSAqYWNwX21taW8pOworZXh0ZXJuIGlu dCBhY3BfZGVpbml0KHZvaWQgX19pb21lbSAqYWNwX21taW8pOworZXh0ZXJuIHZvaWQgY29uZmln X2FjcF9kbWFfY2hhbm5lbCh2b2lkIF9faW9tZW0gKmFjcF9tbWlvLCB1OCBjaF9udW0sCisJCQkJ ICAgdTE2IGRzY3Jfc3RydF9pZHgsIHUxNiBudW1fZHNjcnMsCisJCQkJICAgZW51bSBhY3BfZG1h X3ByaW9yaXR5X2xldmVsIHByaW9yaXR5X2xldmVsKTsKK2V4dGVybiB2b2lkIGNvbmZpZ19hY3Bf ZG1hKHZvaWQgX19pb21lbSAqYWNwX21taW8sCisJCQkgICBzdHJ1Y3QgYXVkaW9fc3Vic3RyZWFt X2RhdGEgKmF1ZGlvX2NvbmZpZyk7CitleHRlcm4gdm9pZCBhY3BfZG1hX3N0YXJ0KHZvaWQgX19p b21lbSAqYWNwX21taW8sCisJCQkgdTE2IGNoX251bSwgYm9vbCBpc19jaXJjdWxhcik7CitleHRl cm4gaW50IGFjcF9kbWFfc3RvcCh2b2lkIF9faW9tZW0gKmFjcF9tbWlvLCB1OCBjaF9udW0pOwor ZXh0ZXJuIHZvaWQgYWNwX3Jlc3VtZSh2b2lkIF9faW9tZW0gKmFjcF9tbWlvKTsKK2V4dGVybiB2 b2lkIGFjcF9lbmFibGVfZXh0ZXJuYWxfaW50ZXJydXB0cyh2b2lkIF9faW9tZW0gKmFjcF9tbWlv LAorCQkJCQkgICBpbnQgZW5hYmxlKTsKK2V4dGVybiB1MzIgYWNwX2dldF9pbnRyX2ZsYWcodm9p ZCBfX2lvbWVtICphY3BfbW1pbyk7CitleHRlcm4gdTE2IGdldF9kc2NyX2lkeCh2b2lkIF9faW9t ZW0gKmFjcF9tbWlvLCBpbnQgZGlyZWN0aW9uKTsKK2V4dGVybiB2b2lkIGFjcF9leHRfc3RhdF9j bGVhcl9kbWFpb2Modm9pZCBfX2lvbWVtICphY3BfbW1pbywgdTggY2hfbnVtKTsKKworI2VuZGlm IC8qX19BQ1BfSFdfSCAqLwotLSAKMS44LjMuMQoKX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX18KZHJpLWRldmVsIG1haWxpbmcgbGlzdApkcmktZGV2ZWxAbGlz dHMuZnJlZWRlc2t0b3Aub3JnCmh0dHA6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9s aXN0aW5mby9kcmktZGV2ZWwK