From mboxrd@z Thu Jan 1 00:00:00 1970 From: Lucas Stach Subject: [PATCH 05/12] drm/etnaviv: add GPU core driver Date: Fri, 4 Dec 2015 14:59:57 +0100 Message-ID: <1449237604-19064-6-git-send-email-l.stach@pengutronix.de> References: <1449237604-19064-1-git-send-email-l.stach@pengutronix.de> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <1449237604-19064-1-git-send-email-l.stach@pengutronix.de> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: David Airlie , Rob Herring , Shawn Guo Cc: devicetree@vger.kernel.org, dri-devel@lists.freedesktop.org, patchwork-lst@pengutronix.de, kernel@pengutronix.de, Russell King List-Id: devicetree@vger.kernel.org RnJvbTogVGhlIGV0bmF2aXYgYXV0aG9ycyA8ZHJpLWRldmVsQGxpc3RzLmZyZWVkZXNrdG9wLm9y Zz4KClRoaXMgYWRkcyB0aGUgR1BVIGNvcmUgZHJpdmVyIHBhcnQgb2YgdGhlIGV0bmF2aXYgRFJN IGRyaXZlci4KClNpZ25lZC1vZmYtYnk6IENocmlzdGlhbiBHbWVpbmVyIDxjaHJpc3RpYW4uZ21l aW5lckBnbWFpbC5jb20+ClNpZ25lZC1vZmYtYnk6IFJ1c3NlbGwgS2luZyA8cm1rK2tlcm5lbEBh cm0ubGludXgub3JnLnVrPgpTaWduZWQtb2ZmLWJ5OiBMdWNhcyBTdGFjaCA8bC5zdGFjaEBwZW5n dXRyb25peC5kZT4KLS0tCiBkcml2ZXJzL2dwdS9kcm0vZXRuYXZpdi9ldG5hdml2X2dwdS5jIHwg MTY0NCArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKIGRyaXZlcnMvZ3B1L2RybS9l dG5hdml2L2V0bmF2aXZfZ3B1LmggfCAgMjA5ICsrKysrCiAyIGZpbGVzIGNoYW5nZWQsIDE4NTMg aW5zZXJ0aW9ucygrKQogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1L2RybS9ldG5hdml2 L2V0bmF2aXZfZ3B1LmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dwdS9kcm0vZXRuYXZp di9ldG5hdml2X2dwdS5oCgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2V0bmF2aXYvZXRu YXZpdl9ncHUuYyBiL2RyaXZlcnMvZ3B1L2RybS9ldG5hdml2L2V0bmF2aXZfZ3B1LmMKbmV3IGZp bGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwLi5kMzkwOTNkYzM3ZTYKLS0tIC9kZXYv bnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vZXRuYXZpdi9ldG5hdml2X2dwdS5jCkBAIC0wLDAg KzEsMTY0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBFdG5hdml2IFByb2plY3QKKyAq CisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUg aXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJh bCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBT b2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBp biB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdB UlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklM SVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05V IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91 IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExp Y2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93 d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb21wb25lbnQu aD4KKyNpbmNsdWRlIDxsaW51eC9mZW5jZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFt Lmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CisjaW5jbHVkZSAiZXRuYXZpdl9kdW1w LmgiCisjaW5jbHVkZSAiZXRuYXZpdl9ncHUuaCIKKyNpbmNsdWRlICJldG5hdml2X2dlbS5oIgor I2luY2x1ZGUgImV0bmF2aXZfbW11LmgiCisjaW5jbHVkZSAiZXRuYXZpdl9pb21tdS5oIgorI2lu Y2x1ZGUgImV0bmF2aXZfaW9tbXVfdjIuaCIKKyNpbmNsdWRlICJjb21tb24ueG1sLmgiCisjaW5j bHVkZSAic3RhdGUueG1sLmgiCisjaW5jbHVkZSAic3RhdGVfaGkueG1sLmgiCisjaW5jbHVkZSAi Y21kc3RyZWFtLnhtbC5oIgorCitzdGF0aWMgY29uc3Qgc3RydWN0IHBsYXRmb3JtX2RldmljZV9p ZCBncHVfaWRzW10gPSB7CisJeyAubmFtZSA9ICJldG5hdml2LWdwdSwyZCIgfSwKKwl7IH0sCit9 OworCitzdGF0aWMgYm9vbCBldG5hdml2X2R1bXBfY29yZSA9IHRydWU7Cittb2R1bGVfcGFyYW1f bmFtZWQoZHVtcF9jb3JlLCBldG5hdml2X2R1bXBfY29yZSwgYm9vbCwgMDYwMCk7CisKKy8qCisg KiBEcml2ZXIgZnVuY3Rpb25zOgorICovCisKK2ludCBldG5hdml2X2dwdV9nZXRfcGFyYW0oc3Ry dWN0IGV0bmF2aXZfZ3B1ICpncHUsIHUzMiBwYXJhbSwgdTY0ICp2YWx1ZSkKK3sKKwlzd2l0Y2gg KHBhcmFtKSB7CisJY2FzZSBFVE5BVklWX1BBUkFNX0dQVV9NT0RFTDoKKwkJKnZhbHVlID0gZ3B1 LT5pZGVudGl0eS5tb2RlbDsKKwkJYnJlYWs7CisKKwljYXNlIEVUTkFWSVZfUEFSQU1fR1BVX1JF VklTSU9OOgorCQkqdmFsdWUgPSBncHUtPmlkZW50aXR5LnJldmlzaW9uOworCQlicmVhazsKKwor CWNhc2UgRVROQVZJVl9QQVJBTV9HUFVfRkVBVFVSRVNfMDoKKwkJKnZhbHVlID0gZ3B1LT5pZGVu dGl0eS5mZWF0dXJlczsKKwkJYnJlYWs7CisKKwljYXNlIEVUTkFWSVZfUEFSQU1fR1BVX0ZFQVRV UkVTXzE6CisJCSp2YWx1ZSA9IGdwdS0+aWRlbnRpdHkubWlub3JfZmVhdHVyZXMwOworCQlicmVh azsKKworCWNhc2UgRVROQVZJVl9QQVJBTV9HUFVfRkVBVFVSRVNfMjoKKwkJKnZhbHVlID0gZ3B1 LT5pZGVudGl0eS5taW5vcl9mZWF0dXJlczE7CisJCWJyZWFrOworCisJY2FzZSBFVE5BVklWX1BB UkFNX0dQVV9GRUFUVVJFU18zOgorCQkqdmFsdWUgPSBncHUtPmlkZW50aXR5Lm1pbm9yX2ZlYXR1 cmVzMjsKKwkJYnJlYWs7CisKKwljYXNlIEVUTkFWSVZfUEFSQU1fR1BVX0ZFQVRVUkVTXzQ6CisJ CSp2YWx1ZSA9IGdwdS0+aWRlbnRpdHkubWlub3JfZmVhdHVyZXMzOworCQlicmVhazsKKworCWNh c2UgRVROQVZJVl9QQVJBTV9HUFVfU1RSRUFNX0NPVU5UOgorCQkqdmFsdWUgPSBncHUtPmlkZW50 aXR5LnN0cmVhbV9jb3VudDsKKwkJYnJlYWs7CisKKwljYXNlIEVUTkFWSVZfUEFSQU1fR1BVX1JF R0lTVEVSX01BWDoKKwkJKnZhbHVlID0gZ3B1LT5pZGVudGl0eS5yZWdpc3Rlcl9tYXg7CisJCWJy ZWFrOworCisJY2FzZSBFVE5BVklWX1BBUkFNX0dQVV9USFJFQURfQ09VTlQ6CisJCSp2YWx1ZSA9 IGdwdS0+aWRlbnRpdHkudGhyZWFkX2NvdW50OworCQlicmVhazsKKworCWNhc2UgRVROQVZJVl9Q QVJBTV9HUFVfVkVSVEVYX0NBQ0hFX1NJWkU6CisJCSp2YWx1ZSA9IGdwdS0+aWRlbnRpdHkudmVy dGV4X2NhY2hlX3NpemU7CisJCWJyZWFrOworCisJY2FzZSBFVE5BVklWX1BBUkFNX0dQVV9TSEFE RVJfQ09SRV9DT1VOVDoKKwkJKnZhbHVlID0gZ3B1LT5pZGVudGl0eS5zaGFkZXJfY29yZV9jb3Vu dDsKKwkJYnJlYWs7CisKKwljYXNlIEVUTkFWSVZfUEFSQU1fR1BVX1BJWEVMX1BJUEVTOgorCQkq dmFsdWUgPSBncHUtPmlkZW50aXR5LnBpeGVsX3BpcGVzOworCQlicmVhazsKKworCWNhc2UgRVRO QVZJVl9QQVJBTV9HUFVfVkVSVEVYX09VVFBVVF9CVUZGRVJfU0laRToKKwkJKnZhbHVlID0gZ3B1 LT5pZGVudGl0eS52ZXJ0ZXhfb3V0cHV0X2J1ZmZlcl9zaXplOworCQlicmVhazsKKworCWNhc2Ug RVROQVZJVl9QQVJBTV9HUFVfQlVGRkVSX1NJWkU6CisJCSp2YWx1ZSA9IGdwdS0+aWRlbnRpdHku YnVmZmVyX3NpemU7CisJCWJyZWFrOworCisJY2FzZSBFVE5BVklWX1BBUkFNX0dQVV9JTlNUUlVD VElPTl9DT1VOVDoKKwkJKnZhbHVlID0gZ3B1LT5pZGVudGl0eS5pbnN0cnVjdGlvbl9jb3VudDsK KwkJYnJlYWs7CisKKwljYXNlIEVUTkFWSVZfUEFSQU1fR1BVX05VTV9DT05TVEFOVFM6CisJCSp2 YWx1ZSA9IGdwdS0+aWRlbnRpdHkubnVtX2NvbnN0YW50czsKKwkJYnJlYWs7CisKKwlkZWZhdWx0 OgorCQlEQkcoIiVzOiBpbnZhbGlkIHBhcmFtOiAldSIsIGRldl9uYW1lKGdwdS0+ZGV2KSwgcGFy YW0pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZv aWQgZXRuYXZpdl9od19zcGVjcyhzdHJ1Y3QgZXRuYXZpdl9ncHUgKmdwdSkKK3sKKwlpZiAoZ3B1 LT5pZGVudGl0eS5taW5vcl9mZWF0dXJlczAgJgorCSAgICBjaGlwTWlub3JGZWF0dXJlczBfTU9S RV9NSU5PUl9GRUFUVVJFUykgeworCQl1MzIgc3BlY3NbMl07CisKKwkJc3BlY3NbMF0gPSBncHVf cmVhZChncHUsIFZJVlNfSElfQ0hJUF9TUEVDUyk7CisJCXNwZWNzWzFdID0gZ3B1X3JlYWQoZ3B1 LCBWSVZTX0hJX0NISVBfU1BFQ1NfMik7CisKKwkJZ3B1LT5pZGVudGl0eS5zdHJlYW1fY291bnQg PQorCQkJKHNwZWNzWzBdICYgVklWU19ISV9DSElQX1NQRUNTX1NUUkVBTV9DT1VOVF9fTUFTSykK KwkJCQk+PiBWSVZTX0hJX0NISVBfU1BFQ1NfU1RSRUFNX0NPVU5UX19TSElGVDsKKwkJZ3B1LT5p ZGVudGl0eS5yZWdpc3Rlcl9tYXggPQorCQkJKHNwZWNzWzBdICYgVklWU19ISV9DSElQX1NQRUNT X1JFR0lTVEVSX01BWF9fTUFTSykKKwkJCQk+PiBWSVZTX0hJX0NISVBfU1BFQ1NfUkVHSVNURVJf TUFYX19TSElGVDsKKwkJZ3B1LT5pZGVudGl0eS50aHJlYWRfY291bnQgPQorCQkJKHNwZWNzWzBd ICYgVklWU19ISV9DSElQX1NQRUNTX1RIUkVBRF9DT1VOVF9fTUFTSykKKwkJCQk+PiBWSVZTX0hJ X0NISVBfU1BFQ1NfVEhSRUFEX0NPVU5UX19TSElGVDsKKwkJZ3B1LT5pZGVudGl0eS52ZXJ0ZXhf Y2FjaGVfc2l6ZSA9CisJCQkoc3BlY3NbMF0gJiBWSVZTX0hJX0NISVBfU1BFQ1NfVkVSVEVYX0NB Q0hFX1NJWkVfX01BU0spCisJCQkJPj4gVklWU19ISV9DSElQX1NQRUNTX1ZFUlRFWF9DQUNIRV9T SVpFX19TSElGVDsKKwkJZ3B1LT5pZGVudGl0eS5zaGFkZXJfY29yZV9jb3VudCA9CisJCQkoc3Bl Y3NbMF0gJiBWSVZTX0hJX0NISVBfU1BFQ1NfU0hBREVSX0NPUkVfQ09VTlRfX01BU0spCisJCQkJ Pj4gVklWU19ISV9DSElQX1NQRUNTX1NIQURFUl9DT1JFX0NPVU5UX19TSElGVDsKKwkJZ3B1LT5p ZGVudGl0eS5waXhlbF9waXBlcyA9CisJCQkoc3BlY3NbMF0gJiBWSVZTX0hJX0NISVBfU1BFQ1Nf UElYRUxfUElQRVNfX01BU0spCisJCQkJPj4gVklWU19ISV9DSElQX1NQRUNTX1BJWEVMX1BJUEVT X19TSElGVDsKKwkJZ3B1LT5pZGVudGl0eS52ZXJ0ZXhfb3V0cHV0X2J1ZmZlcl9zaXplID0KKwkJ CShzcGVjc1swXSAmIFZJVlNfSElfQ0hJUF9TUEVDU19WRVJURVhfT1VUUFVUX0JVRkZFUl9TSVpF X19NQVNLKQorCQkJCT4+IFZJVlNfSElfQ0hJUF9TUEVDU19WRVJURVhfT1VUUFVUX0JVRkZFUl9T SVpFX19TSElGVDsKKworCQlncHUtPmlkZW50aXR5LmJ1ZmZlcl9zaXplID0KKwkJCShzcGVjc1sx XSAmIFZJVlNfSElfQ0hJUF9TUEVDU18yX0JVRkZFUl9TSVpFX19NQVNLKQorCQkJCT4+IFZJVlNf SElfQ0hJUF9TUEVDU18yX0JVRkZFUl9TSVpFX19TSElGVDsKKwkJZ3B1LT5pZGVudGl0eS5pbnN0 cnVjdGlvbl9jb3VudCA9CisJCQkoc3BlY3NbMV0gJiBWSVZTX0hJX0NISVBfU1BFQ1NfMl9JTlNU UlVDVElPTl9DT1VOVF9fTUFTSykKKwkJCQk+PiBWSVZTX0hJX0NISVBfU1BFQ1NfMl9JTlNUUlVD VElPTl9DT1VOVF9fU0hJRlQ7CisJCWdwdS0+aWRlbnRpdHkubnVtX2NvbnN0YW50cyA9CisJCQko c3BlY3NbMV0gJiBWSVZTX0hJX0NISVBfU1BFQ1NfMl9OVU1fQ09OU1RBTlRTX19NQVNLKQorCQkJ CT4+IFZJVlNfSElfQ0hJUF9TUEVDU18yX05VTV9DT05TVEFOVFNfX1NISUZUOworCX0KKworCS8q IEZpbGwgaW4gdGhlIHN0cmVhbSBjb3VudCBpZiBub3Qgc3BlY2lmaWVkICovCisJaWYgKGdwdS0+ aWRlbnRpdHkuc3RyZWFtX2NvdW50ID09IDApIHsKKwkJaWYgKGdwdS0+aWRlbnRpdHkubW9kZWwg Pj0gMHgxMDAwKQorCQkJZ3B1LT5pZGVudGl0eS5zdHJlYW1fY291bnQgPSA0OworCQllbHNlCisJ CQlncHUtPmlkZW50aXR5LnN0cmVhbV9jb3VudCA9IDE7CisJfQorCisJLyogQ29udmVydCB0aGUg cmVnaXN0ZXIgbWF4IHZhbHVlICovCisJaWYgKGdwdS0+aWRlbnRpdHkucmVnaXN0ZXJfbWF4KQor CQlncHUtPmlkZW50aXR5LnJlZ2lzdGVyX21heCA9IDEgPDwgZ3B1LT5pZGVudGl0eS5yZWdpc3Rl cl9tYXg7CisJZWxzZSBpZiAoZ3B1LT5pZGVudGl0eS5tb2RlbCA9PSAweDA0MDApCisJCWdwdS0+ aWRlbnRpdHkucmVnaXN0ZXJfbWF4ID0gMzI7CisJZWxzZQorCQlncHUtPmlkZW50aXR5LnJlZ2lz dGVyX21heCA9IDY0OworCisJLyogQ29udmVydCB0aHJlYWQgY291bnQgKi8KKwlpZiAoZ3B1LT5p ZGVudGl0eS50aHJlYWRfY291bnQpCisJCWdwdS0+aWRlbnRpdHkudGhyZWFkX2NvdW50ID0gMSA8 PCBncHUtPmlkZW50aXR5LnRocmVhZF9jb3VudDsKKwllbHNlIGlmIChncHUtPmlkZW50aXR5Lm1v ZGVsID09IDB4MDQwMCkKKwkJZ3B1LT5pZGVudGl0eS50aHJlYWRfY291bnQgPSA2NDsKKwllbHNl IGlmIChncHUtPmlkZW50aXR5Lm1vZGVsID09IDB4MDUwMCB8fAorCQkgZ3B1LT5pZGVudGl0eS5t b2RlbCA9PSAweDA1MzApCisJCWdwdS0+aWRlbnRpdHkudGhyZWFkX2NvdW50ID0gMTI4OworCWVs c2UKKwkJZ3B1LT5pZGVudGl0eS50aHJlYWRfY291bnQgPSAyNTY7CisKKwlpZiAoZ3B1LT5pZGVu dGl0eS52ZXJ0ZXhfY2FjaGVfc2l6ZSA9PSAwKQorCQlncHUtPmlkZW50aXR5LnZlcnRleF9jYWNo ZV9zaXplID0gODsKKworCWlmIChncHUtPmlkZW50aXR5LnNoYWRlcl9jb3JlX2NvdW50ID09IDAp IHsKKwkJaWYgKGdwdS0+aWRlbnRpdHkubW9kZWwgPj0gMHgxMDAwKQorCQkJZ3B1LT5pZGVudGl0 eS5zaGFkZXJfY29yZV9jb3VudCA9IDI7CisJCWVsc2UKKwkJCWdwdS0+aWRlbnRpdHkuc2hhZGVy X2NvcmVfY291bnQgPSAxOworCX0KKworCWlmIChncHUtPmlkZW50aXR5LnBpeGVsX3BpcGVzID09 IDApCisJCWdwdS0+aWRlbnRpdHkucGl4ZWxfcGlwZXMgPSAxOworCisJLyogQ29udmVydCB2aXJ0 ZXggYnVmZmVyIHNpemUgKi8KKwlpZiAoZ3B1LT5pZGVudGl0eS52ZXJ0ZXhfb3V0cHV0X2J1ZmZl cl9zaXplKSB7CisJCWdwdS0+aWRlbnRpdHkudmVydGV4X291dHB1dF9idWZmZXJfc2l6ZSA9CisJ CQkxIDw8IGdwdS0+aWRlbnRpdHkudmVydGV4X291dHB1dF9idWZmZXJfc2l6ZTsKKwl9IGVsc2Ug aWYgKGdwdS0+aWRlbnRpdHkubW9kZWwgPT0gMHgwNDAwKSB7CisJCWlmIChncHUtPmlkZW50aXR5 LnJldmlzaW9uIDwgMHg0MDAwKQorCQkJZ3B1LT5pZGVudGl0eS52ZXJ0ZXhfb3V0cHV0X2J1ZmZl cl9zaXplID0gNTEyOworCQllbHNlIGlmIChncHUtPmlkZW50aXR5LnJldmlzaW9uIDwgMHg0MjAw KQorCQkJZ3B1LT5pZGVudGl0eS52ZXJ0ZXhfb3V0cHV0X2J1ZmZlcl9zaXplID0gMjU2OworCQll bHNlCisJCQlncHUtPmlkZW50aXR5LnZlcnRleF9vdXRwdXRfYnVmZmVyX3NpemUgPSAxMjg7CisJ fSBlbHNlIHsKKwkJZ3B1LT5pZGVudGl0eS52ZXJ0ZXhfb3V0cHV0X2J1ZmZlcl9zaXplID0gNTEy OworCX0KKworCXN3aXRjaCAoZ3B1LT5pZGVudGl0eS5pbnN0cnVjdGlvbl9jb3VudCkgeworCWNh c2UgMDoKKwkJaWYgKChncHUtPmlkZW50aXR5Lm1vZGVsID09IDB4MjAwMCAmJgorCQkgICAgIGdw dS0+aWRlbnRpdHkucmV2aXNpb24gPT0gMHg1MTA4KSB8fAorCQkgICAgZ3B1LT5pZGVudGl0eS5t b2RlbCA9PSAweDg4MCkKKwkJCWdwdS0+aWRlbnRpdHkuaW5zdHJ1Y3Rpb25fY291bnQgPSA1MTI7 CisJCWVsc2UKKwkJCWdwdS0+aWRlbnRpdHkuaW5zdHJ1Y3Rpb25fY291bnQgPSAyNTY7CisJCWJy ZWFrOworCisJY2FzZSAxOgorCQlncHUtPmlkZW50aXR5Lmluc3RydWN0aW9uX2NvdW50ID0gMTAy NDsKKwkJYnJlYWs7CisKKwljYXNlIDI6CisJCWdwdS0+aWRlbnRpdHkuaW5zdHJ1Y3Rpb25fY291 bnQgPSAyMDQ4OworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWdwdS0+aWRlbnRpdHkuaW5zdHJ1 Y3Rpb25fY291bnQgPSAyNTY7CisJCWJyZWFrOworCX0KKworCWlmIChncHUtPmlkZW50aXR5Lm51 bV9jb25zdGFudHMgPT0gMCkKKwkJZ3B1LT5pZGVudGl0eS5udW1fY29uc3RhbnRzID0gMTY4Owor fQorCitzdGF0aWMgdm9pZCBldG5hdml2X2h3X2lkZW50aWZ5KHN0cnVjdCBldG5hdml2X2dwdSAq Z3B1KQoreworCXUzMiBjaGlwSWRlbnRpdHk7CisKKwljaGlwSWRlbnRpdHkgPSBncHVfcmVhZChn cHUsIFZJVlNfSElfQ0hJUF9JREVOVElUWSk7CisKKwkvKiBTcGVjaWFsIGNhc2UgZm9yIG9sZGVy IGdyYXBoaWMgY29yZXMuICovCisJaWYgKFZJVlNfSElfQ0hJUF9JREVOVElUWV9GQU1JTFkoY2hp cElkZW50aXR5KSA9PSAgMHgwMSkgeworCQlncHUtPmlkZW50aXR5Lm1vZGVsICAgID0gMHg1MDA7 IC8qIGdjNTAwICovCisJCWdwdS0+aWRlbnRpdHkucmV2aXNpb24gPSBWSVZTX0hJX0NISVBfSURF TlRJVFlfUkVWSVNJT04oY2hpcElkZW50aXR5KTsKKwl9IGVsc2UgeworCisJCWdwdS0+aWRlbnRp dHkubW9kZWwgPSBncHVfcmVhZChncHUsIFZJVlNfSElfQ0hJUF9NT0RFTCk7CisJCWdwdS0+aWRl bnRpdHkucmV2aXNpb24gPSBncHVfcmVhZChncHUsIFZJVlNfSElfQ0hJUF9SRVYpOworCisJCS8q CisJCSAqICEhISEgSEFDSyBBTEVSVCAhISEhCisJCSAqIEJlY2F1c2UgcGVvcGxlIGNoYW5nZSBk ZXZpY2UgSURzIHdpdGhvdXQgbGV0dGluZyBzb2Z0d2FyZQorCQkgKiBrbm93IGFib3V0IGl0IC0g aGVyZSBpcyB0aGUgaGFjayB0byBtYWtlIGl0IGFsbCBsb29rIHRoZQorCQkgKiBzYW1lLiAgT25s eSBmb3IgR0M0MDAgZmFtaWx5LgorCQkgKi8KKwkJaWYgKChncHUtPmlkZW50aXR5Lm1vZGVsICYg MHhmZjAwKSA9PSAweDA0MDAgJiYKKwkJICAgIGdwdS0+aWRlbnRpdHkubW9kZWwgIT0gMHgwNDIw KSB7CisJCQlncHUtPmlkZW50aXR5Lm1vZGVsID0gZ3B1LT5pZGVudGl0eS5tb2RlbCAmIDB4MDQw MDsKKwkJfQorCisJCS8qIEFub3RoZXIgc3BlY2lhbCBjYXNlICovCisJCWlmIChncHUtPmlkZW50 aXR5Lm1vZGVsID09IDB4MzAwICYmCisJCSAgICBncHUtPmlkZW50aXR5LnJldmlzaW9uID09IDB4 MjIwMSkgeworCQkJdTMyIGNoaXBEYXRlID0gZ3B1X3JlYWQoZ3B1LCBWSVZTX0hJX0NISVBfREFU RSk7CisJCQl1MzIgY2hpcFRpbWUgPSBncHVfcmVhZChncHUsIFZJVlNfSElfQ0hJUF9USU1FKTsK KworCQkJaWYgKGNoaXBEYXRlID09IDB4MjAwODA4MTQgJiYgY2hpcFRpbWUgPT0gMHgxMjA1MTEw MCkgeworCQkJCS8qCisJCQkJICogVGhpcyBJUCBoYXMgYW4gRUNPOyBwdXQgdGhlIGNvcnJlY3QK KwkJCQkgKiByZXZpc2lvbiBpbiBpdC4KKwkJCQkgKi8KKwkJCQlncHUtPmlkZW50aXR5LnJldmlz aW9uID0gMHgxMDUxOworCQkJfQorCQl9CisJfQorCisJZGV2X2luZm8oZ3B1LT5kZXYsICJtb2Rl bDogR0MleCwgcmV2aXNpb246ICV4XG4iLAorCQkgZ3B1LT5pZGVudGl0eS5tb2RlbCwgZ3B1LT5p ZGVudGl0eS5yZXZpc2lvbik7CisKKwlncHUtPmlkZW50aXR5LmZlYXR1cmVzID0gZ3B1X3JlYWQo Z3B1LCBWSVZTX0hJX0NISVBfRkVBVFVSRSk7CisKKwkvKiBEaXNhYmxlIGZhc3QgY2xlYXIgb24g R0M3MDAuICovCisJaWYgKGdwdS0+aWRlbnRpdHkubW9kZWwgPT0gMHg3MDApCisJCWdwdS0+aWRl bnRpdHkuZmVhdHVyZXMgJj0gfmNoaXBGZWF0dXJlc19GQVNUX0NMRUFSOworCisJaWYgKChncHUt PmlkZW50aXR5Lm1vZGVsID09IDB4NTAwICYmIGdwdS0+aWRlbnRpdHkucmV2aXNpb24gPCAyKSB8 fAorCSAgICAoZ3B1LT5pZGVudGl0eS5tb2RlbCA9PSAweDMwMCAmJiBncHUtPmlkZW50aXR5LnJl dmlzaW9uIDwgMHgyMDAwKSkgeworCisJCS8qCisJCSAqIEdDNTAwIHJldiAxLnggYW5kIEdDMzAw IHJldiA8IDIuMCBkb2Vzbid0IGhhdmUgdGhlc2UKKwkJICogcmVnaXN0ZXJzLgorCQkgKi8KKwkJ Z3B1LT5pZGVudGl0eS5taW5vcl9mZWF0dXJlczAgPSAwOworCQlncHUtPmlkZW50aXR5Lm1pbm9y X2ZlYXR1cmVzMSA9IDA7CisJCWdwdS0+aWRlbnRpdHkubWlub3JfZmVhdHVyZXMyID0gMDsKKwkJ Z3B1LT5pZGVudGl0eS5taW5vcl9mZWF0dXJlczMgPSAwOworCX0gZWxzZQorCQlncHUtPmlkZW50 aXR5Lm1pbm9yX2ZlYXR1cmVzMCA9CisJCQkJZ3B1X3JlYWQoZ3B1LCBWSVZTX0hJX0NISVBfTUlO T1JfRkVBVFVSRV8wKTsKKworCWlmIChncHUtPmlkZW50aXR5Lm1pbm9yX2ZlYXR1cmVzMCAmCisJ ICAgIGNoaXBNaW5vckZlYXR1cmVzMF9NT1JFX01JTk9SX0ZFQVRVUkVTKSB7CisJCWdwdS0+aWRl bnRpdHkubWlub3JfZmVhdHVyZXMxID0KKwkJCQlncHVfcmVhZChncHUsIFZJVlNfSElfQ0hJUF9N SU5PUl9GRUFUVVJFXzEpOworCQlncHUtPmlkZW50aXR5Lm1pbm9yX2ZlYXR1cmVzMiA9CisJCQkJ Z3B1X3JlYWQoZ3B1LCBWSVZTX0hJX0NISVBfTUlOT1JfRkVBVFVSRV8yKTsKKwkJZ3B1LT5pZGVu dGl0eS5taW5vcl9mZWF0dXJlczMgPQorCQkJCWdwdV9yZWFkKGdwdSwgVklWU19ISV9DSElQX01J Tk9SX0ZFQVRVUkVfMyk7CisJfQorCisJLyogR0M2MDAgaWRsZSByZWdpc3RlciByZXBvcnRzIHpl cm8gYml0cyB3aGVyZSBtb2R1bGVzIGFyZW4ndCBwcmVzZW50ICovCisJaWYgKGdwdS0+aWRlbnRp dHkubW9kZWwgPT0gY2hpcE1vZGVsX0dDNjAwKSB7CisJCWdwdS0+aWRsZV9tYXNrID0gVklWU19I SV9JRExFX1NUQVRFX1RYIHwKKwkJCQkgVklWU19ISV9JRExFX1NUQVRFX1JBIHwKKwkJCQkgVklW U19ISV9JRExFX1NUQVRFX1NFIHwKKwkJCQkgVklWU19ISV9JRExFX1NUQVRFX1BBIHwKKwkJCQkg VklWU19ISV9JRExFX1NUQVRFX1NIIHwKKwkJCQkgVklWU19ISV9JRExFX1NUQVRFX1BFIHwKKwkJ CQkgVklWU19ISV9JRExFX1NUQVRFX0RFIHwKKwkJCQkgVklWU19ISV9JRExFX1NUQVRFX0ZFOwor CX0gZWxzZSB7CisJCWdwdS0+aWRsZV9tYXNrID0gflZJVlNfSElfSURMRV9TVEFURV9BWElfTFA7 CisJfQorCisJZXRuYXZpdl9od19zcGVjcyhncHUpOworfQorCitzdGF0aWMgdm9pZCBldG5hdml2 X2dwdV9sb2FkX2Nsb2NrKHN0cnVjdCBldG5hdml2X2dwdSAqZ3B1LCB1MzIgY2xvY2spCit7CisJ Z3B1X3dyaXRlKGdwdSwgVklWU19ISV9DTE9DS19DT05UUk9MLCBjbG9jayB8CisJCSAgVklWU19I SV9DTE9DS19DT05UUk9MX0ZTQ0FMRV9DTURfTE9BRCk7CisJZ3B1X3dyaXRlKGdwdSwgVklWU19I SV9DTE9DS19DT05UUk9MLCBjbG9jayk7Cit9CisKK3N0YXRpYyBpbnQgZXRuYXZpdl9od19yZXNl dChzdHJ1Y3QgZXRuYXZpdl9ncHUgKmdwdSkKK3sKKwl1MzIgY29udHJvbCwgaWRsZTsKKwl1bnNp Z25lZCBsb25nIHRpbWVvdXQ7CisJYm9vbCBmYWlsZWQgPSB0cnVlOworCisJLyogVE9ETworCSAq CisJICogLSBjbG9jayBnYXRpbmcKKwkgKiAtIHB1bHMgZWF0ZXIKKwkgKiAtIHdoYXQgYWJvdXQg Vkc/CisJICovCisKKwkvKiBXZSBob3BlIHRoYXQgdGhlIEdQVSByZXNldHMgaW4gdW5kZXIgb25l IHNlY29uZCAqLworCXRpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygxMDAwKTsK KworCXdoaWxlICh0aW1lX2lzX2FmdGVyX2ppZmZpZXModGltZW91dCkpIHsKKwkJY29udHJvbCA9 IFZJVlNfSElfQ0xPQ0tfQ09OVFJPTF9ESVNBQkxFX0RFQlVHX1JFR0lTVEVSUyB8CisJCQkgIFZJ VlNfSElfQ0xPQ0tfQ09OVFJPTF9GU0NBTEVfVkFMKDB4NDApOworCisJCS8qIGVuYWJsZSBjbG9j ayAqLworCQlldG5hdml2X2dwdV9sb2FkX2Nsb2NrKGdwdSwgY29udHJvbCk7CisKKwkJLyogV2Fp dCBmb3Igc3RhYmxlIGNsb2NrLiAgVml2YW50ZSdzIGNvZGUgd2FpdGVkIGZvciAxbXMgKi8KKwkJ dXNsZWVwX3JhbmdlKDEwMDAsIDEwMDAwKTsKKworCQkvKiBpc29sYXRlIHRoZSBHUFUuICovCisJ CWNvbnRyb2wgfD0gVklWU19ISV9DTE9DS19DT05UUk9MX0lTT0xBVEVfR1BVOworCQlncHVfd3Jp dGUoZ3B1LCBWSVZTX0hJX0NMT0NLX0NPTlRST0wsIGNvbnRyb2wpOworCisJCS8qIHNldCBzb2Z0 IHJlc2V0LiAqLworCQljb250cm9sIHw9IFZJVlNfSElfQ0xPQ0tfQ09OVFJPTF9TT0ZUX1JFU0VU OworCQlncHVfd3JpdGUoZ3B1LCBWSVZTX0hJX0NMT0NLX0NPTlRST0wsIGNvbnRyb2wpOworCisJ CS8qIHdhaXQgZm9yIHJlc2V0LiAqLworCQltc2xlZXAoMSk7CisKKwkJLyogcmVzZXQgc29mdCBy ZXNldCBiaXQuICovCisJCWNvbnRyb2wgJj0gflZJVlNfSElfQ0xPQ0tfQ09OVFJPTF9TT0ZUX1JF U0VUOworCQlncHVfd3JpdGUoZ3B1LCBWSVZTX0hJX0NMT0NLX0NPTlRST0wsIGNvbnRyb2wpOwor CisJCS8qIHJlc2V0IEdQVSBpc29sYXRpb24uICovCisJCWNvbnRyb2wgJj0gflZJVlNfSElfQ0xP Q0tfQ09OVFJPTF9JU09MQVRFX0dQVTsKKwkJZ3B1X3dyaXRlKGdwdSwgVklWU19ISV9DTE9DS19D T05UUk9MLCBjb250cm9sKTsKKworCQkvKiByZWFkIGlkbGUgcmVnaXN0ZXIuICovCisJCWlkbGUg PSBncHVfcmVhZChncHUsIFZJVlNfSElfSURMRV9TVEFURSk7CisKKwkJLyogdHJ5IHJlc2V0aW5n IGFnYWluIGlmIEZFIGl0IG5vdCBpZGxlICovCisJCWlmICgoaWRsZSAmIFZJVlNfSElfSURMRV9T VEFURV9GRSkgPT0gMCkgeworCQkJZGV2X2RiZyhncHUtPmRldiwgIkZFIGlzIG5vdCBpZGxlXG4i KTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogcmVhZCByZXNldCByZWdpc3Rlci4gKi8KKwkJ Y29udHJvbCA9IGdwdV9yZWFkKGdwdSwgVklWU19ISV9DTE9DS19DT05UUk9MKTsKKworCQkvKiBp cyB0aGUgR1BVIGlkbGU/ICovCisJCWlmICgoKGNvbnRyb2wgJiBWSVZTX0hJX0NMT0NLX0NPTlRS T0xfSURMRV8zRCkgPT0gMCkgfHwKKwkJICAgICgoY29udHJvbCAmIFZJVlNfSElfQ0xPQ0tfQ09O VFJPTF9JRExFXzJEKSA9PSAwKSkgeworCQkJZGV2X2RiZyhncHUtPmRldiwgIkdQVSBpcyBub3Qg aWRsZVxuIik7CisJCQljb250aW51ZTsKKwkJfQorCisJCWZhaWxlZCA9IGZhbHNlOworCQlicmVh azsKKwl9CisKKwlpZiAoZmFpbGVkKSB7CisJCWlkbGUgPSBncHVfcmVhZChncHUsIFZJVlNfSElf SURMRV9TVEFURSk7CisJCWNvbnRyb2wgPSBncHVfcmVhZChncHUsIFZJVlNfSElfQ0xPQ0tfQ09O VFJPTCk7CisKKwkJZGV2X2VycihncHUtPmRldiwgIkdQVSBmYWlsZWQgdG8gcmVzZXQ6IEZFICVz aWRsZSwgM0QgJXNpZGxlLCAyRCAlc2lkbGVcbiIsCisJCQlpZGxlICYgVklWU19ISV9JRExFX1NU QVRFX0ZFID8gIiIgOiAibm90ICIsCisJCQljb250cm9sICYgVklWU19ISV9DTE9DS19DT05UUk9M X0lETEVfM0QgPyAiIiA6ICJub3QgIiwKKwkJCWNvbnRyb2wgJiBWSVZTX0hJX0NMT0NLX0NPTlRS T0xfSURMRV8yRCA/ICIiIDogIm5vdCAiKTsKKworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCS8q IFdlIHJlbHkgb24gdGhlIEdQVSBydW5uaW5nLCBzbyBwcm9ncmFtIHRoZSBjbG9jayAqLworCWNv bnRyb2wgPSBWSVZTX0hJX0NMT0NLX0NPTlRST0xfRElTQUJMRV9ERUJVR19SRUdJU1RFUlMgfAor CQkgIFZJVlNfSElfQ0xPQ0tfQ09OVFJPTF9GU0NBTEVfVkFMKDB4NDApOworCisJLyogZW5hYmxl IGNsb2NrICovCisJZXRuYXZpdl9ncHVfbG9hZF9jbG9jayhncHUsIGNvbnRyb2wpOworCisJcmV0 dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGV0bmF2aXZfZ3B1X2h3X2luaXQoc3RydWN0IGV0bmF2 aXZfZ3B1ICpncHUpCit7CisJdTE2IHByZWZldGNoOworCisJaWYgKGdwdS0+aWRlbnRpdHkubW9k ZWwgPT0gY2hpcE1vZGVsX0dDMzIwICYmCisJICAgIGdwdV9yZWFkKGdwdSwgVklWU19ISV9DSElQ X1RJTUUpICE9IDB4MjA2MjQwMCAmJgorCSAgICAoZ3B1LT5pZGVudGl0eS5yZXZpc2lvbiA9PSAw eDUwMDcgfHwKKwkgICAgIGdwdS0+aWRlbnRpdHkucmV2aXNpb24gPT0gMHg1MjIwKSkgeworCQl1 MzIgbWNfbWVtb3J5X2RlYnVnOworCisJCW1jX21lbW9yeV9kZWJ1ZyA9IGdwdV9yZWFkKGdwdSwg VklWU19NQ19ERUJVR19NRU1PUlkpICYgfjB4ZmY7CisKKwkJaWYgKGdwdS0+aWRlbnRpdHkucmV2 aXNpb24gPT0gMHg1MDA3KQorCQkJbWNfbWVtb3J5X2RlYnVnIHw9IDB4MGM7CisJCWVsc2UKKwkJ CW1jX21lbW9yeV9kZWJ1ZyB8PSAweDA4OworCisJCWdwdV93cml0ZShncHUsIFZJVlNfTUNfREVC VUdfTUVNT1JZLCBtY19tZW1vcnlfZGVidWcpOworCX0KKworCS8qCisJICogVXBkYXRlIEdQVSBB WEkgY2FjaGUgYXR0dHJpYnV0ZSB0byAiY2FjaGVhYmxlLCBubyBhbGxvY2F0ZSIuCisJICogVGhp cyBpcyBuZWNlc3NhcnkgdG8gcHJldmVudCB0aGUgaU1YNiBTb0MgbG9ja2luZyB1cC4KKwkgKi8K KwlncHVfd3JpdGUoZ3B1LCBWSVZTX0hJX0FYSV9DT05GSUcsCisJCSAgVklWU19ISV9BWElfQ09O RklHX0FXQ0FDSEUoMikgfAorCQkgIFZJVlNfSElfQVhJX0NPTkZJR19BUkNBQ0hFKDIpKTsKKwor CS8qIEdDMjAwMCByZXYgNTEwOCBuZWVkcyBhIHNwZWNpYWwgYnVzIGNvbmZpZyAqLworCWlmIChn cHUtPmlkZW50aXR5Lm1vZGVsID09IDB4MjAwMCAmJiBncHUtPmlkZW50aXR5LnJldmlzaW9uID09 IDB4NTEwOCkgeworCQl1MzIgYnVzX2NvbmZpZyA9IGdwdV9yZWFkKGdwdSwgVklWU19NQ19CVVNf Q09ORklHKTsKKwkJYnVzX2NvbmZpZyAmPSB+KFZJVlNfTUNfQlVTX0NPTkZJR19GRV9CVVNfQ09O RklHX19NQVNLIHwKKwkJCQlWSVZTX01DX0JVU19DT05GSUdfVFhfQlVTX0NPTkZJR19fTUFTSyk7 CisJCWJ1c19jb25maWcgfD0gVklWU19NQ19CVVNfQ09ORklHX0ZFX0JVU19DT05GSUcoMSkgfAor CQkJICAgICAgVklWU19NQ19CVVNfQ09ORklHX1RYX0JVU19DT05GSUcoMCk7CisJCWdwdV93cml0 ZShncHUsIFZJVlNfTUNfQlVTX0NPTkZJRywgYnVzX2NvbmZpZyk7CisJfQorCisJLyogc2V0IGJh c2UgYWRkcmVzc2VzICovCisJZ3B1X3dyaXRlKGdwdSwgVklWU19NQ19NRU1PUllfQkFTRV9BRERS X1JBLCBncHUtPm1lbW9yeV9iYXNlKTsKKwlncHVfd3JpdGUoZ3B1LCBWSVZTX01DX01FTU9SWV9C QVNFX0FERFJfRkUsIGdwdS0+bWVtb3J5X2Jhc2UpOworCWdwdV93cml0ZShncHUsIFZJVlNfTUNf TUVNT1JZX0JBU0VfQUREUl9UWCwgZ3B1LT5tZW1vcnlfYmFzZSk7CisJZ3B1X3dyaXRlKGdwdSwg VklWU19NQ19NRU1PUllfQkFTRV9BRERSX1BFWiwgZ3B1LT5tZW1vcnlfYmFzZSk7CisJZ3B1X3dy aXRlKGdwdSwgVklWU19NQ19NRU1PUllfQkFTRV9BRERSX1BFLCBncHUtPm1lbW9yeV9iYXNlKTsK KworCS8qIHNldHVwIHRoZSBNTVUgcGFnZSB0YWJsZSBwb2ludGVycyAqLworCWV0bmF2aXZfaW9t bXVfZG9tYWluX3Jlc3RvcmUoZ3B1LCBncHUtPm1tdS0+ZG9tYWluKTsKKworCS8qIFN0YXJ0IGNv bW1hbmQgcHJvY2Vzc29yICovCisJcHJlZmV0Y2ggPSBldG5hdml2X2J1ZmZlcl9pbml0KGdwdSk7 CisKKwlncHVfd3JpdGUoZ3B1LCBWSVZTX0hJX0lOVFJfRU5CTCwgfjBVKTsKKwlncHVfd3JpdGUo Z3B1LCBWSVZTX0ZFX0NPTU1BTkRfQUREUkVTUywKKwkJICBncHUtPmJ1ZmZlci0+cGFkZHIgLSBn cHUtPm1lbW9yeV9iYXNlKTsKKwlncHVfd3JpdGUoZ3B1LCBWSVZTX0ZFX0NPTU1BTkRfQ09OVFJP TCwKKwkJICBWSVZTX0ZFX0NPTU1BTkRfQ09OVFJPTF9FTkFCTEUgfAorCQkgIFZJVlNfRkVfQ09N TUFORF9DT05UUk9MX1BSRUZFVENIKHByZWZldGNoKSk7Cit9CisKK2ludCBldG5hdml2X2dwdV9p bml0KHN0cnVjdCBldG5hdml2X2dwdSAqZ3B1KQoreworCWludCByZXQsIGk7CisJc3RydWN0IGlv bW11X2RvbWFpbiAqaW9tbXU7CisJZW51bSBldG5hdml2X2lvbW11X3ZlcnNpb24gdmVyc2lvbjsK Kwlib29sIG1tdXYyOworCisJcmV0ID0gcG1fcnVudGltZV9nZXRfc3luYyhncHUtPmRldik7CisJ aWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlldG5hdml2X2h3X2lkZW50aWZ5KGdwdSk7 CisKKwlpZiAoZ3B1LT5pZGVudGl0eS5tb2RlbCA9PSAwKSB7CisJCWRldl9lcnIoZ3B1LT5kZXYs ICJVbmtub3duIEdQVSBtb2RlbFxuIik7CisJCXBtX3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKGdw dS0+ZGV2KTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwlyZXQgPSBldG5hdml2X2h3X3Jlc2V0 KGdwdSk7CisJaWYgKHJldCkKKwkJZ290byBmYWlsOworCisJLyogU2V0dXAgSU9NTVUuLiBldmVu dHVhbGx5IHdlIHdpbGwgKEkgdGhpbmspIGRvIHRoaXMgb25jZSBwZXIgY29udGV4dAorCSAqIGFu ZCBoYXZlIHNlcGFyYXRlIHBhZ2UgdGFibGVzIHBlciBjb250ZXh0LiAgRm9yIG5vdywgdG8ga2Vl cCB0aGluZ3MKKwkgKiBzaW1wbGUgYW5kIHRvIGdldCBzb21ldGhpbmcgd29ya2luZywganVzdCB1 c2UgYSBzaW5nbGUgYWRkcmVzcyBzcGFjZToKKwkgKi8KKwltbXV2MiA9IGdwdS0+aWRlbnRpdHku bWlub3JfZmVhdHVyZXMxICYgY2hpcE1pbm9yRmVhdHVyZXMxX01NVV9WRVJTSU9OOworCWRldl9k YmcoZ3B1LT5kZXYsICJtbXV2MjogJWRcbiIsIG1tdXYyKTsKKworCWlmICghbW11djIpIHsKKwkJ aW9tbXUgPSBldG5hdml2X2lvbW11X2RvbWFpbl9hbGxvYyhncHUpOworCQl2ZXJzaW9uID0gRVRO QVZJVl9JT01NVV9WMTsKKwl9IGVsc2UgeworCQlpb21tdSA9IGV0bmF2aXZfaW9tbXVfdjJfZG9t YWluX2FsbG9jKGdwdSk7CisJCXZlcnNpb24gPSBFVE5BVklWX0lPTU1VX1YyOworCX0KKworCWlm ICghaW9tbXUpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBmYWlsOworCX0KKworCS8qIFRP RE86IHdlIHdpbGwgbGVhayBoZXJlIG1lbW9yeSAtIGZpeCBpdCEgKi8KKworCWdwdS0+bW11ID0g ZXRuYXZpdl9pb21tdV9uZXcoZ3B1LCBpb21tdSwgdmVyc2lvbik7CisJaWYgKCFncHUtPm1tdSkg eworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGZhaWw7CisJfQorCisJLyogQ3JlYXRlIGJ1ZmZl cjogKi8KKwlncHUtPmJ1ZmZlciA9IGV0bmF2aXZfZ3B1X2NtZGJ1Zl9uZXcoZ3B1LCBQQUdFX1NJ WkUsIDApOworCWlmICghZ3B1LT5idWZmZXIpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZGV2X2Vy cihncHUtPmRldiwgImNvdWxkIG5vdCBjcmVhdGUgY29tbWFuZCBidWZmZXJcbiIpOworCQlnb3Rv IGZhaWw7CisJfQorCWlmIChncHUtPmJ1ZmZlci0+cGFkZHIgLSBncHUtPm1lbW9yeV9iYXNlID4g MHg4MDAwMDAwMCkgeworCQlyZXQgPSAtRUlOVkFMOworCQlkZXZfZXJyKGdwdS0+ZGV2LAorCQkJ ImNvbW1hbmQgYnVmZmVyIG91dHNpZGUgdmFsaWQgbWVtb3J5IHdpbmRvd1xuIik7CisJCWdvdG8g ZnJlZV9idWZmZXI7CisJfQorCisJLyogU2V0dXAgZXZlbnQgbWFuYWdlbWVudCAqLworCXNwaW5f bG9ja19pbml0KCZncHUtPmV2ZW50X3NwaW5sb2NrKTsKKwlpbml0X2NvbXBsZXRpb24oJmdwdS0+ ZXZlbnRfZnJlZSk7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZ3B1LT5ldmVudCk7IGkr KykgeworCQlncHUtPmV2ZW50W2ldLnVzZWQgPSBmYWxzZTsKKwkJY29tcGxldGUoJmdwdS0+ZXZl bnRfZnJlZSk7CisJfQorCisJLyogTm93IHByb2dyYW0gdGhlIGhhcmR3YXJlICovCisJbXV0ZXhf bG9jaygmZ3B1LT5sb2NrKTsKKwlldG5hdml2X2dwdV9od19pbml0KGdwdSk7CisJbXV0ZXhfdW5s b2NrKCZncHUtPmxvY2spOworCisJcG1fcnVudGltZV9tYXJrX2xhc3RfYnVzeShncHUtPmRldik7 CisJcG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmQoZ3B1LT5kZXYpOworCisJcmV0dXJuIDA7CisK K2ZyZWVfYnVmZmVyOgorCWV0bmF2aXZfZ3B1X2NtZGJ1Zl9mcmVlKGdwdS0+YnVmZmVyKTsKKwln cHUtPmJ1ZmZlciA9IE5VTEw7CitmYWlsOgorCXBtX3J1bnRpbWVfbWFya19sYXN0X2J1c3koZ3B1 LT5kZXYpOworCXBtX3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKGdwdS0+ZGV2KTsKKworCXJldHVy biByZXQ7Cit9CisKKyNpZmRlZiBDT05GSUdfREVCVUdfRlMKK3N0cnVjdCBkbWFfZGVidWcgewor CXUzMiBhZGRyZXNzWzJdOworCXUzMiBzdGF0ZVsyXTsKK307CisKK3N0YXRpYyB2b2lkIHZlcmlm eV9kbWEoc3RydWN0IGV0bmF2aXZfZ3B1ICpncHUsIHN0cnVjdCBkbWFfZGVidWcgKmRlYnVnKQor eworCXUzMiBpOworCisJZGVidWctPmFkZHJlc3NbMF0gPSBncHVfcmVhZChncHUsIFZJVlNfRkVf RE1BX0FERFJFU1MpOworCWRlYnVnLT5zdGF0ZVswXSAgID0gZ3B1X3JlYWQoZ3B1LCBWSVZTX0ZF X0RNQV9ERUJVR19TVEFURSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgNTAwOyBpKyspIHsKKwkJZGVi dWctPmFkZHJlc3NbMV0gPSBncHVfcmVhZChncHUsIFZJVlNfRkVfRE1BX0FERFJFU1MpOworCQlk ZWJ1Zy0+c3RhdGVbMV0gICA9IGdwdV9yZWFkKGdwdSwgVklWU19GRV9ETUFfREVCVUdfU1RBVEUp OworCisJCWlmIChkZWJ1Zy0+YWRkcmVzc1swXSAhPSBkZWJ1Zy0+YWRkcmVzc1sxXSkKKwkJCWJy ZWFrOworCisJCWlmIChkZWJ1Zy0+c3RhdGVbMF0gIT0gZGVidWctPnN0YXRlWzFdKQorCQkJYnJl YWs7CisJfQorfQorCitpbnQgZXRuYXZpdl9ncHVfZGVidWdmcyhzdHJ1Y3QgZXRuYXZpdl9ncHUg KmdwdSwgc3RydWN0IHNlcV9maWxlICptKQoreworCXN0cnVjdCBkbWFfZGVidWcgZGVidWc7CisJ dTMyIGRtYV9sbywgZG1hX2hpLCBheGksIGlkbGU7CisJaW50IHJldDsKKworCXNlcV9wcmludGYo bSwgIiVzIFN0YXR1czpcbiIsIGRldl9uYW1lKGdwdS0+ZGV2KSk7CisKKwlyZXQgPSBwbV9ydW50 aW1lX2dldF9zeW5jKGdwdS0+ZGV2KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwor CWRtYV9sbyA9IGdwdV9yZWFkKGdwdSwgVklWU19GRV9ETUFfTE9XKTsKKwlkbWFfaGkgPSBncHVf cmVhZChncHUsIFZJVlNfRkVfRE1BX0hJR0gpOworCWF4aSA9IGdwdV9yZWFkKGdwdSwgVklWU19I SV9BWElfU1RBVFVTKTsKKwlpZGxlID0gZ3B1X3JlYWQoZ3B1LCBWSVZTX0hJX0lETEVfU1RBVEUp OworCisJdmVyaWZ5X2RtYShncHUsICZkZWJ1Zyk7CisKKwlzZXFfcHV0cyhtLCAiXHRmZWF0dXJl c1xuIik7CisJc2VxX3ByaW50ZihtLCAiXHQgbWlub3JfZmVhdHVyZXMwOiAweCUwOHhcbiIsCisJ CSAgIGdwdS0+aWRlbnRpdHkubWlub3JfZmVhdHVyZXMwKTsKKwlzZXFfcHJpbnRmKG0sICJcdCBt aW5vcl9mZWF0dXJlczE6IDB4JTA4eFxuIiwKKwkJICAgZ3B1LT5pZGVudGl0eS5taW5vcl9mZWF0 dXJlczEpOworCXNlcV9wcmludGYobSwgIlx0IG1pbm9yX2ZlYXR1cmVzMjogMHglMDh4XG4iLAor CQkgICBncHUtPmlkZW50aXR5Lm1pbm9yX2ZlYXR1cmVzMik7CisJc2VxX3ByaW50ZihtLCAiXHQg bWlub3JfZmVhdHVyZXMzOiAweCUwOHhcbiIsCisJCSAgIGdwdS0+aWRlbnRpdHkubWlub3JfZmVh dHVyZXMzKTsKKworCXNlcV9wdXRzKG0sICJcdHNwZWNzXG4iKTsKKwlzZXFfcHJpbnRmKG0sICJc dCBzdHJlYW1fY291bnQ6ICAlZFxuIiwKKwkJCWdwdS0+aWRlbnRpdHkuc3RyZWFtX2NvdW50KTsK KwlzZXFfcHJpbnRmKG0sICJcdCByZWdpc3Rlcl9tYXg6ICVkXG4iLAorCQkJZ3B1LT5pZGVudGl0 eS5yZWdpc3Rlcl9tYXgpOworCXNlcV9wcmludGYobSwgIlx0IHRocmVhZF9jb3VudDogJWRcbiIs CisJCQlncHUtPmlkZW50aXR5LnRocmVhZF9jb3VudCk7CisJc2VxX3ByaW50ZihtLCAiXHQgdmVy dGV4X2NhY2hlX3NpemU6ICVkXG4iLAorCQkJZ3B1LT5pZGVudGl0eS52ZXJ0ZXhfY2FjaGVfc2l6 ZSk7CisJc2VxX3ByaW50ZihtLCAiXHQgc2hhZGVyX2NvcmVfY291bnQ6ICVkXG4iLAorCQkJZ3B1 LT5pZGVudGl0eS5zaGFkZXJfY29yZV9jb3VudCk7CisJc2VxX3ByaW50ZihtLCAiXHQgcGl4ZWxf cGlwZXM6ICVkXG4iLAorCQkJZ3B1LT5pZGVudGl0eS5waXhlbF9waXBlcyk7CisJc2VxX3ByaW50 ZihtLCAiXHQgdmVydGV4X291dHB1dF9idWZmZXJfc2l6ZTogJWRcbiIsCisJCQlncHUtPmlkZW50 aXR5LnZlcnRleF9vdXRwdXRfYnVmZmVyX3NpemUpOworCXNlcV9wcmludGYobSwgIlx0IGJ1ZmZl cl9zaXplOiAlZFxuIiwKKwkJCWdwdS0+aWRlbnRpdHkuYnVmZmVyX3NpemUpOworCXNlcV9wcmlu dGYobSwgIlx0IGluc3RydWN0aW9uX2NvdW50OiAlZFxuIiwKKwkJCWdwdS0+aWRlbnRpdHkuaW5z dHJ1Y3Rpb25fY291bnQpOworCXNlcV9wcmludGYobSwgIlx0IG51bV9jb25zdGFudHM6ICVkXG4i LAorCQkJZ3B1LT5pZGVudGl0eS5udW1fY29uc3RhbnRzKTsKKworCXNlcV9wcmludGYobSwgIlx0 YXhpOiAweCUwOHhcbiIsIGF4aSk7CisJc2VxX3ByaW50ZihtLCAiXHRpZGxlOiAweCUwOHhcbiIs IGlkbGUpOworCWlkbGUgfD0gfmdwdS0+aWRsZV9tYXNrICYgflZJVlNfSElfSURMRV9TVEFURV9B WElfTFA7CisJaWYgKChpZGxlICYgVklWU19ISV9JRExFX1NUQVRFX0ZFKSA9PSAwKQorCQlzZXFf cHV0cyhtLCAiXHQgRkUgaXMgbm90IGlkbGVcbiIpOworCWlmICgoaWRsZSAmIFZJVlNfSElfSURM RV9TVEFURV9ERSkgPT0gMCkKKwkJc2VxX3B1dHMobSwgIlx0IERFIGlzIG5vdCBpZGxlXG4iKTsK KwlpZiAoKGlkbGUgJiBWSVZTX0hJX0lETEVfU1RBVEVfUEUpID09IDApCisJCXNlcV9wdXRzKG0s ICJcdCBQRSBpcyBub3QgaWRsZVxuIik7CisJaWYgKChpZGxlICYgVklWU19ISV9JRExFX1NUQVRF X1NIKSA9PSAwKQorCQlzZXFfcHV0cyhtLCAiXHQgU0ggaXMgbm90IGlkbGVcbiIpOworCWlmICgo aWRsZSAmIFZJVlNfSElfSURMRV9TVEFURV9QQSkgPT0gMCkKKwkJc2VxX3B1dHMobSwgIlx0IFBB IGlzIG5vdCBpZGxlXG4iKTsKKwlpZiAoKGlkbGUgJiBWSVZTX0hJX0lETEVfU1RBVEVfU0UpID09 IDApCisJCXNlcV9wdXRzKG0sICJcdCBTRSBpcyBub3QgaWRsZVxuIik7CisJaWYgKChpZGxlICYg VklWU19ISV9JRExFX1NUQVRFX1JBKSA9PSAwKQorCQlzZXFfcHV0cyhtLCAiXHQgUkEgaXMgbm90 IGlkbGVcbiIpOworCWlmICgoaWRsZSAmIFZJVlNfSElfSURMRV9TVEFURV9UWCkgPT0gMCkKKwkJ c2VxX3B1dHMobSwgIlx0IFRYIGlzIG5vdCBpZGxlXG4iKTsKKwlpZiAoKGlkbGUgJiBWSVZTX0hJ X0lETEVfU1RBVEVfVkcpID09IDApCisJCXNlcV9wdXRzKG0sICJcdCBWRyBpcyBub3QgaWRsZVxu Iik7CisJaWYgKChpZGxlICYgVklWU19ISV9JRExFX1NUQVRFX0lNKSA9PSAwKQorCQlzZXFfcHV0 cyhtLCAiXHQgSU0gaXMgbm90IGlkbGVcbiIpOworCWlmICgoaWRsZSAmIFZJVlNfSElfSURMRV9T VEFURV9GUCkgPT0gMCkKKwkJc2VxX3B1dHMobSwgIlx0IEZQIGlzIG5vdCBpZGxlXG4iKTsKKwlp ZiAoKGlkbGUgJiBWSVZTX0hJX0lETEVfU1RBVEVfVFMpID09IDApCisJCXNlcV9wdXRzKG0sICJc dCBUUyBpcyBub3QgaWRsZVxuIik7CisJaWYgKGlkbGUgJiBWSVZTX0hJX0lETEVfU1RBVEVfQVhJ X0xQKQorCQlzZXFfcHV0cyhtLCAiXHQgQVhJIGxvdyBwb3dlciBtb2RlXG4iKTsKKworCWlmIChn cHUtPmlkZW50aXR5LmZlYXR1cmVzICYgY2hpcEZlYXR1cmVzX0RFQlVHX01PREUpIHsKKwkJdTMy IHJlYWQwID0gZ3B1X3JlYWQoZ3B1LCBWSVZTX01DX0RFQlVHX1JFQUQwKTsKKwkJdTMyIHJlYWQx ID0gZ3B1X3JlYWQoZ3B1LCBWSVZTX01DX0RFQlVHX1JFQUQxKTsKKwkJdTMyIHdyaXRlID0gZ3B1 X3JlYWQoZ3B1LCBWSVZTX01DX0RFQlVHX1dSSVRFKTsKKworCQlzZXFfcHV0cyhtLCAiXHRNQ1xu Iik7CisJCXNlcV9wcmludGYobSwgIlx0IHJlYWQwOiAweCUwOHhcbiIsIHJlYWQwKTsKKwkJc2Vx X3ByaW50ZihtLCAiXHQgcmVhZDE6IDB4JTA4eFxuIiwgcmVhZDEpOworCQlzZXFfcHJpbnRmKG0s ICJcdCB3cml0ZTogMHglMDh4XG4iLCB3cml0ZSk7CisJfQorCisJc2VxX3B1dHMobSwgIlx0RE1B ICIpOworCisJaWYgKGRlYnVnLmFkZHJlc3NbMF0gPT0gZGVidWcuYWRkcmVzc1sxXSAmJgorCSAg ICBkZWJ1Zy5zdGF0ZVswXSA9PSBkZWJ1Zy5zdGF0ZVsxXSkgeworCQlzZXFfcHV0cyhtLCAic2Vl bXMgdG8gYmUgc3R1Y2tcbiIpOworCX0gZWxzZSBpZiAoZGVidWcuYWRkcmVzc1swXSA9PSBkZWJ1 Zy5hZGRyZXNzWzFdKSB7CisJCXNlcV9wdXRzKG0sICJhZHJlc3MgaXMgY29uc3RhbnRcbiIpOwor CX0gZWxzZSB7CisJCXNlcV9wdXRzKG0sICJpcyBydW5pbmdcbiIpOworCX0KKworCXNlcV9wcmlu dGYobSwgIlx0IGFkZHJlc3MgMDogMHglMDh4XG4iLCBkZWJ1Zy5hZGRyZXNzWzBdKTsKKwlzZXFf cHJpbnRmKG0sICJcdCBhZGRyZXNzIDE6IDB4JTA4eFxuIiwgZGVidWcuYWRkcmVzc1sxXSk7CisJ c2VxX3ByaW50ZihtLCAiXHQgc3RhdGUgMDogMHglMDh4XG4iLCBkZWJ1Zy5zdGF0ZVswXSk7CisJ c2VxX3ByaW50ZihtLCAiXHQgc3RhdGUgMTogMHglMDh4XG4iLCBkZWJ1Zy5zdGF0ZVsxXSk7CisJ c2VxX3ByaW50ZihtLCAiXHQgbGFzdCBmZXRjaCA2NCBiaXQgd29yZDogMHglMDh4IDB4JTA4eFxu IiwKKwkJICAgZG1hX2xvLCBkbWFfaGkpOworCisJcmV0ID0gMDsKKworCXBtX3J1bnRpbWVfbWFy a19sYXN0X2J1c3koZ3B1LT5kZXYpOworCXBtX3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKGdwdS0+ ZGV2KTsKKworCXJldHVybiByZXQ7Cit9CisjZW5kaWYKKworLyoKKyAqIFBvd2VyIE1hbmFnZW1l bnQ6CisgKi8KK3N0YXRpYyBpbnQgZW5hYmxlX2NsayhzdHJ1Y3QgZXRuYXZpdl9ncHUgKmdwdSkK K3sKKwlpZiAoZ3B1LT5jbGtfY29yZSkKKwkJY2xrX3ByZXBhcmVfZW5hYmxlKGdwdS0+Y2xrX2Nv cmUpOworCWlmIChncHUtPmNsa19zaGFkZXIpCisJCWNsa19wcmVwYXJlX2VuYWJsZShncHUtPmNs a19zaGFkZXIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGlzYWJsZV9jbGsoc3Ry dWN0IGV0bmF2aXZfZ3B1ICpncHUpCit7CisJaWYgKGdwdS0+Y2xrX2NvcmUpCisJCWNsa19kaXNh YmxlX3VucHJlcGFyZShncHUtPmNsa19jb3JlKTsKKwlpZiAoZ3B1LT5jbGtfc2hhZGVyKQorCQlj bGtfZGlzYWJsZV91bnByZXBhcmUoZ3B1LT5jbGtfc2hhZGVyKTsKKworCXJldHVybiAwOworfQor CitzdGF0aWMgaW50IGVuYWJsZV9heGkoc3RydWN0IGV0bmF2aXZfZ3B1ICpncHUpCit7CisJaWYg KGdwdS0+Y2xrX2J1cykKKwkJY2xrX3ByZXBhcmVfZW5hYmxlKGdwdS0+Y2xrX2J1cyk7CisKKwly ZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkaXNhYmxlX2F4aShzdHJ1Y3QgZXRuYXZpdl9ncHUg KmdwdSkKK3sKKwlpZiAoZ3B1LT5jbGtfYnVzKQorCQljbGtfZGlzYWJsZV91bnByZXBhcmUoZ3B1 LT5jbGtfYnVzKTsKKworCXJldHVybiAwOworfQorCisvKgorICogSGFuZ2NoZWNrIGRldGVjdGlv biBmb3IgbG9ja2VkIGdwdToKKyAqLworc3RhdGljIHZvaWQgcmVjb3Zlcl93b3JrZXIoc3RydWN0 IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBldG5hdml2X2dwdSAqZ3B1ID0gY29udGFp bmVyX29mKHdvcmssIHN0cnVjdCBldG5hdml2X2dwdSwKKwkJCQkJICAgICAgIHJlY292ZXJfd29y ayk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWRldl9lcnIo Z3B1LT5kZXYsICJoYW5nY2hlY2sgcmVjb3ZlciFcbiIpOworCisJaWYgKHBtX3J1bnRpbWVfZ2V0 X3N5bmMoZ3B1LT5kZXYpIDwgMCkKKwkJcmV0dXJuOworCisJbXV0ZXhfbG9jaygmZ3B1LT5sb2Nr KTsKKworCS8qIE9ubHkgY2F0Y2ggdGhlIGZpcnN0IGV2ZW50LCBvciB3aGVuIG1hbnVhbGx5IHJl LWFybWVkICovCisJaWYgKGV0bmF2aXZfZHVtcF9jb3JlKSB7CisJCWV0bmF2aXZfY29yZV9kdW1w KGdwdSk7CisJCWV0bmF2aXZfZHVtcF9jb3JlID0gZmFsc2U7CisJfQorCisJZXRuYXZpdl9od19y ZXNldChncHUpOworCisJLyogY29tcGxldGUgYWxsIGV2ZW50cywgdGhlIEdQVSB3b24ndCBkbyBp dCBhZnRlciB0aGUgcmVzZXQgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ3B1LT5ldmVudF9zcGlu bG9jaywgZmxhZ3MpOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGdwdS0+ZXZlbnQpOyBp KyspIHsKKwkJaWYgKCFncHUtPmV2ZW50W2ldLnVzZWQpCisJCQljb250aW51ZTsKKwkJZmVuY2Vf c2lnbmFsKGdwdS0+ZXZlbnRbaV0uZmVuY2UpOworCQlncHUtPmV2ZW50W2ldLmZlbmNlID0gTlVM TDsKKwkJZ3B1LT5ldmVudFtpXS51c2VkID0gZmFsc2U7CisJCWNvbXBsZXRlKCZncHUtPmV2ZW50 X2ZyZWUpOworCQkvKgorCQkgKiBEZWNyZW1lbnQgdGhlIFBNIGNvdW50IGZvciBlYWNoIHN0dWNr IGV2ZW50LiBUaGlzIGlzIHNhZmUKKwkJICogZXZlbiBpbiBhdG9taWMgY29udGV4dCBhcyB3ZSB1 c2UgQVNZTkMgUlBNIGhlcmUuCisJCSAqLworCQlwbV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChn cHUtPmRldik7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwdS0+ZXZlbnRfc3Bpbmxv Y2ssIGZsYWdzKTsKKwlncHUtPmNvbXBsZXRlZF9mZW5jZSA9IGdwdS0+YWN0aXZlX2ZlbmNlOwor CisJZXRuYXZpdl9ncHVfaHdfaW5pdChncHUpOworCWdwdS0+c3dpdGNoX2NvbnRleHQgPSB0cnVl OworCisJbXV0ZXhfdW5sb2NrKCZncHUtPmxvY2spOworCXBtX3J1bnRpbWVfbWFya19sYXN0X2J1 c3koZ3B1LT5kZXYpOworCXBtX3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKGdwdS0+ZGV2KTsKKwor CS8qIFJldGlyZSB0aGUgYnVmZmVyIG9iamVjdHMgaW4gYSB3b3JrICovCisJZXRuYXZpdl9xdWV1 ZV93b3JrKGdwdS0+ZHJtLCAmZ3B1LT5yZXRpcmVfd29yayk7Cit9CisKK3N0YXRpYyB2b2lkIGhh bmdjaGVja190aW1lcl9yZXNldChzdHJ1Y3QgZXRuYXZpdl9ncHUgKmdwdSkKK3sKKwlEQkcoIiVz IiwgZGV2X25hbWUoZ3B1LT5kZXYpKTsKKwltb2RfdGltZXIoJmdwdS0+aGFuZ2NoZWNrX3RpbWVy LAorCQkgIHJvdW5kX2ppZmZpZXNfdXAoamlmZmllcyArIERSTV9FVE5BVklWX0hBTkdDSEVDS19K SUZGSUVTKSk7Cit9CisKK3N0YXRpYyB2b2lkIGhhbmdjaGVja19oYW5kbGVyKHVuc2lnbmVkIGxv bmcgZGF0YSkKK3sKKwlzdHJ1Y3QgZXRuYXZpdl9ncHUgKmdwdSA9IChzdHJ1Y3QgZXRuYXZpdl9n cHUgKilkYXRhOworCXUzMiBmZW5jZSA9IGdwdS0+Y29tcGxldGVkX2ZlbmNlOworCWJvb2wgcHJv Z3Jlc3MgPSBmYWxzZTsKKworCWlmIChmZW5jZSAhPSBncHUtPmhhbmdjaGVja19mZW5jZSkgewor CQlncHUtPmhhbmdjaGVja19mZW5jZSA9IGZlbmNlOworCQlwcm9ncmVzcyA9IHRydWU7CisJfQor CisJaWYgKCFwcm9ncmVzcykgeworCQl1MzIgZG1hX2FkZHIgPSBncHVfcmVhZChncHUsIFZJVlNf RkVfRE1BX0FERFJFU1MpOworCQlpbnQgY2hhbmdlID0gZG1hX2FkZHIgLSBncHUtPmhhbmdjaGVj a19kbWFfYWRkcjsKKworCQlpZiAoY2hhbmdlIDwgMCB8fCBjaGFuZ2UgPiAxNikgeworCQkJZ3B1 LT5oYW5nY2hlY2tfZG1hX2FkZHIgPSBkbWFfYWRkcjsKKwkJCXByb2dyZXNzID0gdHJ1ZTsKKwkJ fQorCX0KKworCWlmICghcHJvZ3Jlc3MgJiYgZmVuY2VfYWZ0ZXIoZ3B1LT5hY3RpdmVfZmVuY2Us IGZlbmNlKSkgeworCQlkZXZfZXJyKGdwdS0+ZGV2LCAiaGFuZ2NoZWNrIGRldGVjdGVkIGdwdSBs b2NrdXAhXG4iKTsKKwkJZGV2X2VycihncHUtPmRldiwgIiAgICAgY29tcGxldGVkIGZlbmNlOiAl dVxuIiwgZmVuY2UpOworCQlkZXZfZXJyKGdwdS0+ZGV2LCAiICAgICBhY3RpdmUgZmVuY2U6ICV1 XG4iLAorCQkJZ3B1LT5hY3RpdmVfZmVuY2UpOworCQlldG5hdml2X3F1ZXVlX3dvcmsoZ3B1LT5k cm0sICZncHUtPnJlY292ZXJfd29yayk7CisJfQorCisJLyogaWYgc3RpbGwgbW9yZSBwZW5kaW5n IHdvcmssIHJlc2V0IHRoZSBoYW5nY2hlY2sgdGltZXI6ICovCisJaWYgKGZlbmNlX2FmdGVyKGdw dS0+YWN0aXZlX2ZlbmNlLCBncHUtPmhhbmdjaGVja19mZW5jZSkpCisJCWhhbmdjaGVja190aW1l cl9yZXNldChncHUpOworfQorCitzdGF0aWMgdm9pZCBoYW5nY2hlY2tfZGlzYWJsZShzdHJ1Y3Qg ZXRuYXZpdl9ncHUgKmdwdSkKK3sKKwlkZWxfdGltZXJfc3luYygmZ3B1LT5oYW5nY2hlY2tfdGlt ZXIpOworCWNhbmNlbF93b3JrX3N5bmMoJmdwdS0+cmVjb3Zlcl93b3JrKTsKK30KKworLyogZmVu Y2Ugb2JqZWN0IG1hbmFnZW1lbnQgKi8KK3N0cnVjdCBldG5hdml2X2ZlbmNlIHsKKwlzdHJ1Y3Qg ZXRuYXZpdl9ncHUgKmdwdTsKKwlzdHJ1Y3QgZmVuY2UgYmFzZTsKK307CisKK3N0YXRpYyBpbmxp bmUgc3RydWN0IGV0bmF2aXZfZmVuY2UgKnRvX2V0bmF2aXZfZmVuY2Uoc3RydWN0IGZlbmNlICpm ZW5jZSkKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKGZlbmNlLCBzdHJ1Y3QgZXRuYXZpdl9mZW5j ZSwgYmFzZSk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpldG5hdml2X2ZlbmNlX2dldF9kcml2 ZXJfbmFtZShzdHJ1Y3QgZmVuY2UgKmZlbmNlKQoreworCXJldHVybiAiZXRuYXZpdiI7Cit9CisK K3N0YXRpYyBjb25zdCBjaGFyICpldG5hdml2X2ZlbmNlX2dldF90aW1lbGluZV9uYW1lKHN0cnVj dCBmZW5jZSAqZmVuY2UpCit7CisJc3RydWN0IGV0bmF2aXZfZmVuY2UgKmYgPSB0b19ldG5hdml2 X2ZlbmNlKGZlbmNlKTsKKworCXJldHVybiBkZXZfbmFtZShmLT5ncHUtPmRldik7Cit9CisKK3N0 YXRpYyBib29sIGV0bmF2aXZfZmVuY2VfZW5hYmxlX3NpZ25hbGluZyhzdHJ1Y3QgZmVuY2UgKmZl bmNlKQoreworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBldG5hdml2X2ZlbmNlX3Np Z25hbGVkKHN0cnVjdCBmZW5jZSAqZmVuY2UpCit7CisJc3RydWN0IGV0bmF2aXZfZmVuY2UgKmYg PSB0b19ldG5hdml2X2ZlbmNlKGZlbmNlKTsKKworCXJldHVybiBmZW5jZV9jb21wbGV0ZWQoZi0+ Z3B1LCBmLT5iYXNlLnNlcW5vKTsKK30KKworc3RhdGljIHZvaWQgZXRuYXZpdl9mZW5jZV9yZWxl YXNlKHN0cnVjdCBmZW5jZSAqZmVuY2UpCit7CisJc3RydWN0IGV0bmF2aXZfZmVuY2UgKmYgPSB0 b19ldG5hdml2X2ZlbmNlKGZlbmNlKTsKKworCWtmcmVlX3JjdShmLCBiYXNlLnJjdSk7Cit9CisK K3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmVuY2Vfb3BzIGV0bmF2aXZfZmVuY2Vfb3BzID0geworCS5n ZXRfZHJpdmVyX25hbWUgPSBldG5hdml2X2ZlbmNlX2dldF9kcml2ZXJfbmFtZSwKKwkuZ2V0X3Rp bWVsaW5lX25hbWUgPSBldG5hdml2X2ZlbmNlX2dldF90aW1lbGluZV9uYW1lLAorCS5lbmFibGVf c2lnbmFsaW5nID0gZXRuYXZpdl9mZW5jZV9lbmFibGVfc2lnbmFsaW5nLAorCS5zaWduYWxlZCA9 IGV0bmF2aXZfZmVuY2Vfc2lnbmFsZWQsCisJLndhaXQgPSBmZW5jZV9kZWZhdWx0X3dhaXQsCisJ LnJlbGVhc2UgPSBldG5hdml2X2ZlbmNlX3JlbGVhc2UsCit9OworCitzdGF0aWMgc3RydWN0IGZl bmNlICpldG5hdml2X2dwdV9mZW5jZV9hbGxvYyhzdHJ1Y3QgZXRuYXZpdl9ncHUgKmdwdSkKK3sK KwlzdHJ1Y3QgZXRuYXZpdl9mZW5jZSAqZjsKKworCWYgPSBremFsbG9jKHNpemVvZigqZiksIEdG UF9LRVJORUwpOworCWlmICghZikKKwkJcmV0dXJuIE5VTEw7CisKKwlmLT5ncHUgPSBncHU7CisK KwlmZW5jZV9pbml0KCZmLT5iYXNlLCAmZXRuYXZpdl9mZW5jZV9vcHMsICZncHUtPmZlbmNlX3Nw aW5sb2NrLAorCQkgICBncHUtPmZlbmNlX2NvbnRleHQsICsrZ3B1LT5uZXh0X2ZlbmNlKTsKKwor CXJldHVybiAmZi0+YmFzZTsKK30KKworaW50IGV0bmF2aXZfZ3B1X2ZlbmNlX3N5bmNfb2JqKHN0 cnVjdCBldG5hdml2X2dlbV9vYmplY3QgKmV0bmF2aXZfb2JqLAorCXVuc2lnbmVkIGludCBjb250 ZXh0LCBib29sIGV4Y2x1c2l2ZSkKK3sKKwlzdHJ1Y3QgcmVzZXJ2YXRpb25fb2JqZWN0ICpyb2Jq ID0gZXRuYXZpdl9vYmotPnJlc3Y7CisJc3RydWN0IHJlc2VydmF0aW9uX29iamVjdF9saXN0ICpm b2JqOworCXN0cnVjdCBmZW5jZSAqZmVuY2U7CisJaW50IGksIHJldDsKKworCWlmICghZXhjbHVz aXZlKSB7CisJCXJldCA9IHJlc2VydmF0aW9uX29iamVjdF9yZXNlcnZlX3NoYXJlZChyb2JqKTsK KwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJLyoKKwkgKiBJZiB3ZSBoYXZlIGFu eSBzaGFyZWQgZmVuY2VzLCB0aGVuIHRoZSBleGNsdXNpdmUgZmVuY2UKKwkgKiBzaG91bGQgYmUg aWdub3JlZCBhcyBpdCB3aWxsIGFscmVhZHkgaGF2ZSBiZWVuIHNpZ25hbGxlZC4KKwkgKi8KKwlm b2JqID0gcmVzZXJ2YXRpb25fb2JqZWN0X2dldF9saXN0KHJvYmopOworCWlmICghZm9iaiB8fCBm b2JqLT5zaGFyZWRfY291bnQgPT0gMCkgeworCQkvKiBXYWl0IG9uIGFueSBleGlzdGluZyBleGNs dXNpdmUgZmVuY2Ugd2hpY2ggaXNuJ3Qgb3VyIG93biAqLworCQlmZW5jZSA9IHJlc2VydmF0aW9u X29iamVjdF9nZXRfZXhjbChyb2JqKTsKKwkJaWYgKGZlbmNlICYmIGZlbmNlLT5jb250ZXh0ICE9 IGNvbnRleHQpIHsKKwkJCXJldCA9IGZlbmNlX3dhaXQoZmVuY2UsIHRydWUpOworCQkJaWYgKHJl dCkKKwkJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJaWYgKCFleGNsdXNpdmUgfHwgIWZvYmop CisJCXJldHVybiAwOworCisJZm9yIChpID0gMDsgaSA8IGZvYmotPnNoYXJlZF9jb3VudDsgaSsr KSB7CisJCWZlbmNlID0gcmN1X2RlcmVmZXJlbmNlX3Byb3RlY3RlZChmb2JqLT5zaGFyZWRbaV0s CisJCQkJCQlyZXNlcnZhdGlvbl9vYmplY3RfaGVsZChyb2JqKSk7CisJCWlmIChmZW5jZS0+Y29u dGV4dCAhPSBjb250ZXh0KSB7CisJCQlyZXQgPSBmZW5jZV93YWl0KGZlbmNlLCB0cnVlKTsKKwkJ CWlmIChyZXQpCisJCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisv KgorICogZXZlbnQgbWFuYWdlbWVudDoKKyAqLworCitzdGF0aWMgdW5zaWduZWQgaW50IGV2ZW50 X2FsbG9jKHN0cnVjdCBldG5hdml2X2dwdSAqZ3B1KQoreworCXVuc2lnbmVkIGxvbmcgcmV0LCBm bGFnczsKKwl1bnNpZ25lZCBpbnQgaSwgZXZlbnQgPSB+MFU7CisKKwlyZXQgPSB3YWl0X2Zvcl9j b21wbGV0aW9uX3RpbWVvdXQoJmdwdS0+ZXZlbnRfZnJlZSwKKwkJCQkJICBtc2Vjc190b19qaWZm aWVzKDEwICogMTAwMDApKTsKKwlpZiAoIXJldCkKKwkJZGV2X2VycihncHUtPmRldiwgIndhaXRf Zm9yX2NvbXBsZXRpb25fdGltZW91dCBmYWlsZWQiKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZn cHUtPmV2ZW50X3NwaW5sb2NrLCBmbGFncyk7CisKKwkvKiBmaW5kIGZpcnN0IGZyZWUgZXZlbnQg Ki8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShncHUtPmV2ZW50KTsgaSsrKSB7CisJCWlm IChncHUtPmV2ZW50W2ldLnVzZWQgPT0gZmFsc2UpIHsKKwkJCWdwdS0+ZXZlbnRbaV0udXNlZCA9 IHRydWU7CisJCQlldmVudCA9IGk7CisJCQlicmVhazsKKwkJfQorCX0KKworCXNwaW5fdW5sb2Nr X2lycXJlc3RvcmUoJmdwdS0+ZXZlbnRfc3BpbmxvY2ssIGZsYWdzKTsKKworCXJldHVybiBldmVu dDsKK30KKworc3RhdGljIHZvaWQgZXZlbnRfZnJlZShzdHJ1Y3QgZXRuYXZpdl9ncHUgKmdwdSwg dW5zaWduZWQgaW50IGV2ZW50KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xv Y2tfaXJxc2F2ZSgmZ3B1LT5ldmVudF9zcGlubG9jaywgZmxhZ3MpOworCisJaWYgKGdwdS0+ZXZl bnRbZXZlbnRdLnVzZWQgPT0gZmFsc2UpIHsKKwkJZGV2X3dhcm4oZ3B1LT5kZXYsICJldmVudCAl dSBpcyBhbHJlYWR5IG1hcmtlZCBhcyBmcmVlIiwKKwkJCSBldmVudCk7CisJCXNwaW5fdW5sb2Nr X2lycXJlc3RvcmUoJmdwdS0+ZXZlbnRfc3BpbmxvY2ssIGZsYWdzKTsKKwl9IGVsc2UgeworCQln cHUtPmV2ZW50W2V2ZW50XS51c2VkID0gZmFsc2U7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUo JmdwdS0+ZXZlbnRfc3BpbmxvY2ssIGZsYWdzKTsKKworCQljb21wbGV0ZSgmZ3B1LT5ldmVudF9m cmVlKTsKKwl9Cit9CisKKy8qCisgKiBDbWRzdHJlYW0gc3VibWlzc2lvbi9yZXRpcmVtZW50Ogor ICovCisKK3N0cnVjdCBldG5hdml2X2NtZGJ1ZiAqZXRuYXZpdl9ncHVfY21kYnVmX25ldyhzdHJ1 Y3QgZXRuYXZpdl9ncHUgKmdwdSwgdTMyIHNpemUsCisJc2l6ZV90IG5yX2JvcykKK3sKKwlzdHJ1 Y3QgZXRuYXZpdl9jbWRidWYgKmNtZGJ1ZjsKKwlzaXplX3Qgc3ogPSBzaXplX3ZzdHJ1Y3QobnJf Ym9zLCBzaXplb2YoY21kYnVmLT5ib1swXSksCisJCQkJIHNpemVvZigqY21kYnVmKSk7CisKKwlj bWRidWYgPSBremFsbG9jKHN6LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNtZGJ1ZikKKwkJcmV0dXJu IE5VTEw7CisKKwljbWRidWYtPnZhZGRyID0gZG1hX2FsbG9jX3dyaXRlY29tYmluZShncHUtPmRl diwgc2l6ZSwgJmNtZGJ1Zi0+cGFkZHIsCisJCQkJCSAgICAgICBHRlBfS0VSTkVMKTsKKwlpZiAo IWNtZGJ1Zi0+dmFkZHIpIHsKKwkJa2ZyZWUoY21kYnVmKTsKKwkJcmV0dXJuIE5VTEw7CisJfQor CisJY21kYnVmLT5ncHUgPSBncHU7CisJY21kYnVmLT5zaXplID0gc2l6ZTsKKworCXJldHVybiBj bWRidWY7Cit9CisKK3ZvaWQgZXRuYXZpdl9ncHVfY21kYnVmX2ZyZWUoc3RydWN0IGV0bmF2aXZf Y21kYnVmICpjbWRidWYpCit7CisJZG1hX2ZyZWVfd3JpdGVjb21iaW5lKGNtZGJ1Zi0+Z3B1LT5k ZXYsIGNtZGJ1Zi0+c2l6ZSwKKwkJCSAgICAgIGNtZGJ1Zi0+dmFkZHIsIGNtZGJ1Zi0+cGFkZHIp OworCWtmcmVlKGNtZGJ1Zik7Cit9CisKK3N0YXRpYyB2b2lkIHJldGlyZV93b3JrZXIoc3RydWN0 IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBldG5hdml2X2dwdSAqZ3B1ID0gY29udGFp bmVyX29mKHdvcmssIHN0cnVjdCBldG5hdml2X2dwdSwKKwkJCQkJICAgICAgIHJldGlyZV93b3Jr KTsKKwl1MzIgZmVuY2UgPSBncHUtPmNvbXBsZXRlZF9mZW5jZTsKKwlzdHJ1Y3QgZXRuYXZpdl9j bWRidWYgKmNtZGJ1ZiwgKnRtcDsKKwl1bnNpZ25lZCBpbnQgaTsKKworCW11dGV4X2xvY2soJmdw dS0+bG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNtZGJ1ZiwgdG1wLCAmZ3B1LT5h Y3RpdmVfY21kX2xpc3QsIG5vZGUpIHsKKwkJaWYgKCFmZW5jZV9pc19zaWduYWxlZChjbWRidWYt PmZlbmNlKSkKKwkJCWJyZWFrOworCisJCWxpc3RfZGVsKCZjbWRidWYtPm5vZGUpOworCQlmZW5j ZV9wdXQoY21kYnVmLT5mZW5jZSk7CisKKwkJZm9yIChpID0gMDsgaSA8IGNtZGJ1Zi0+bnJfYm9z OyBpKyspIHsKKwkJCXN0cnVjdCBldG5hdml2X2dlbV9vYmplY3QgKmV0bmF2aXZfb2JqID0gY21k YnVmLT5ib1tpXTsKKworCQkJYXRvbWljX2RlYygmZXRuYXZpdl9vYmotPmdwdV9hY3RpdmUpOwor CQkJLyogZHJvcCB0aGUgcmVmY291bnQgdGFrZW4gaW4gZXRuYXZpdl9ncHVfc3VibWl0ICovCisJ CQlldG5hdml2X2dlbV9wdXRfaW92YShncHUsICZldG5hdml2X29iai0+YmFzZSk7CisJCX0KKwor CQlldG5hdml2X2dwdV9jbWRidWZfZnJlZShjbWRidWYpOworCX0KKworCWdwdS0+cmV0aXJlZF9m ZW5jZSA9IGZlbmNlOworCisJbXV0ZXhfdW5sb2NrKCZncHUtPmxvY2spOworCisJd2FrZV91cF9h bGwoJmdwdS0+ZmVuY2VfZXZlbnQpOworfQorCitpbnQgZXRuYXZpdl9ncHVfd2FpdF9mZW5jZV9p bnRlcnJ1cHRpYmxlKHN0cnVjdCBldG5hdml2X2dwdSAqZ3B1LAorCXUzMiBmZW5jZSwgc3RydWN0 IHRpbWVzcGVjICp0aW1lb3V0KQoreworCWludCByZXQ7CisKKwlpZiAoZmVuY2VfYWZ0ZXIoZmVu Y2UsIGdwdS0+bmV4dF9mZW5jZSkpIHsKKwkJRFJNX0VSUk9SKCJ3YWl0aW5nIG9uIGludmFsaWQg ZmVuY2U6ICV1IChvZiAldSlcbiIsCisJCQkJZmVuY2UsIGdwdS0+bmV4dF9mZW5jZSk7CisJCXJl dHVybiAtRUlOVkFMOworCX0KKworCWlmICghdGltZW91dCkgeworCQkvKiBObyB0aW1lb3V0IHdh cyByZXF1ZXN0ZWQ6IGp1c3QgdGVzdCBmb3IgY29tcGxldGlvbiAqLworCQlyZXQgPSBmZW5jZV9j b21wbGV0ZWQoZ3B1LCBmZW5jZSkgPyAwIDogLUVCVVNZOworCX0gZWxzZSB7CisJCXVuc2lnbmVk IGxvbmcgcmVtYWluaW5nID0gZXRuYXZpdl90aW1lb3V0X3RvX2ppZmZpZXModGltZW91dCk7CisK KwkJcmV0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoZ3B1LT5mZW5jZV9ldmVu dCwKKwkJCQkJCWZlbmNlX2NvbXBsZXRlZChncHUsIGZlbmNlKSwKKwkJCQkJCXJlbWFpbmluZyk7 CisJCWlmIChyZXQgPT0gMCkgeworCQkJREJHKCJ0aW1lb3V0IHdhaXRpbmcgZm9yIGZlbmNlOiAl dSAocmV0aXJlZDogJXUgY29tcGxldGVkOiAldSkiLAorCQkJCWZlbmNlLCBncHUtPnJldGlyZWRf ZmVuY2UsCisJCQkJZ3B1LT5jb21wbGV0ZWRfZmVuY2UpOworCQkJcmV0ID0gLUVUSU1FRE9VVDsK KwkJfSBlbHNlIGlmIChyZXQgIT0gLUVSRVNUQVJUU1lTKSB7CisJCQlyZXQgPSAwOworCQl9CisJ fQorCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFdhaXQgZm9yIGFuIG9iamVjdCB0byBiZWNv bWUgaW5hY3RpdmUuICBUaGlzLCBvbiBpdCdzIG93biwgaXMgbm90IHJhY2UKKyAqIGZyZWU6IHRo ZSBvYmplY3QgaXMgbW92ZWQgYnkgdGhlIHJldGlyZSB3b3JrZXIgb2ZmIHRoZSBhY3RpdmUgbGlz dCwgYW5kCisgKiB0aGVuIHRoZSBpb3ZhIGlzIHB1dC4gIE1vcmVvdmVyLCB0aGUgb2JqZWN0IGNv dWxkIGJlIHJlLXN1Ym1pdHRlZCBqdXN0CisgKiBhZnRlciB3ZSBub3RpY2UgdGhhdCBpdCdzIGJl Y29tZSBpbmFjdGl2ZS4KKyAqCisgKiBBbHRob3VnaCB0aGUgcmV0aXJlbWVudCBoYXBwZW5zIHVu ZGVyIHRoZSBncHUgbG9jaywgd2UgZG9uJ3Qgd2FudCB0byBob2xkCisgKiB0aGF0IGxvY2sgaW4g dGhpcyBmdW5jdGlvbiB3aGlsZSB3YWl0aW5nLgorICovCitpbnQgZXRuYXZpdl9ncHVfd2FpdF9v YmpfaW5hY3RpdmUoc3RydWN0IGV0bmF2aXZfZ3B1ICpncHUsCisJc3RydWN0IGV0bmF2aXZfZ2Vt X29iamVjdCAqZXRuYXZpdl9vYmosIHN0cnVjdCB0aW1lc3BlYyAqdGltZW91dCkKK3sKKwl1bnNp Z25lZCBsb25nIHJlbWFpbmluZzsKKwlsb25nIHJldDsKKworCWlmICghdGltZW91dCkKKwkJcmV0 dXJuICFpc19hY3RpdmUoZXRuYXZpdl9vYmopID8gMCA6IC1FQlVTWTsKKworCXJlbWFpbmluZyA9 IGV0bmF2aXZfdGltZW91dF90b19qaWZmaWVzKHRpbWVvdXQpOworCisJcmV0ID0gd2FpdF9ldmVu dF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoZ3B1LT5mZW5jZV9ldmVudCwKKwkJCQkJICAgICAgICFp c19hY3RpdmUoZXRuYXZpdl9vYmopLAorCQkJCQkgICAgICAgcmVtYWluaW5nKTsKKwlpZiAocmV0 ID4gMCkgeworCQlzdHJ1Y3QgZXRuYXZpdl9kcm1fcHJpdmF0ZSAqcHJpdiA9IGdwdS0+ZHJtLT5k ZXZfcHJpdmF0ZTsKKworCQkvKiBTeW5jaHJvbmlzZSB3aXRoIHRoZSByZXRpcmUgd29ya2VyICov CisJCWZsdXNoX3dvcmtxdWV1ZShwcml2LT53cSk7CisJCXJldHVybiAwOworCX0gZWxzZSBpZiAo cmV0ID09IC1FUkVTVEFSVFNZUykgeworCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCX0gZWxzZSB7 CisJCXJldHVybiAtRVRJTUVET1VUOworCX0KK30KKworaW50IGV0bmF2aXZfZ3B1X3BtX2dldF9z eW5jKHN0cnVjdCBldG5hdml2X2dwdSAqZ3B1KQoreworCXJldHVybiBwbV9ydW50aW1lX2dldF9z eW5jKGdwdS0+ZGV2KTsKK30KKwordm9pZCBldG5hdml2X2dwdV9wbV9wdXQoc3RydWN0IGV0bmF2 aXZfZ3B1ICpncHUpCit7CisJcG1fcnVudGltZV9tYXJrX2xhc3RfYnVzeShncHUtPmRldik7CisJ cG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmQoZ3B1LT5kZXYpOworfQorCisvKiBhZGQgYm8ncyB0 byBncHUncyByaW5nLCBhbmQga2ljayBncHU6ICovCitpbnQgZXRuYXZpdl9ncHVfc3VibWl0KHN0 cnVjdCBldG5hdml2X2dwdSAqZ3B1LAorCXN0cnVjdCBldG5hdml2X2dlbV9zdWJtaXQgKnN1Ym1p dCwgc3RydWN0IGV0bmF2aXZfY21kYnVmICpjbWRidWYpCit7CisJc3RydWN0IGZlbmNlICpmZW5j ZTsKKwl1bnNpZ25lZCBpbnQgZXZlbnQsIGk7CisJaW50IHJldDsKKworCXJldCA9IGV0bmF2aXZf Z3B1X3BtX2dldF9zeW5jKGdwdSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlt dXRleF9sb2NrKCZncHUtPmxvY2spOworCisJLyoKKwkgKiBUT0RPCisJICoKKwkgKiAtIGZsdXNo CisJICogLSBkYXRhIGVuZGlhbgorCSAqIC0gcHJlZmV0Y2gKKwkgKgorCSAqLworCisJZXZlbnQg PSBldmVudF9hbGxvYyhncHUpOworCWlmICh1bmxpa2VseShldmVudCA9PSB+MFUpKSB7CisJCURS TV9FUlJPUigibm8gZnJlZSBldmVudFxuIik7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBvdXRf dW5sb2NrOworCX0KKworCWZlbmNlID0gZXRuYXZpdl9ncHVfZmVuY2VfYWxsb2MoZ3B1KTsKKwlp ZiAoIWZlbmNlKSB7CisJCWV2ZW50X2ZyZWUoZ3B1LCBldmVudCk7CisJCXJldCA9IC1FTk9NRU07 CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKwlncHUtPmV2ZW50W2V2ZW50XS5mZW5jZSA9IGZl bmNlOworCXN1Ym1pdC0+ZmVuY2UgPSBmZW5jZS0+c2Vxbm87CisJZ3B1LT5hY3RpdmVfZmVuY2Ug PSBzdWJtaXQtPmZlbmNlOworCisJaWYgKGdwdS0+bGFzdGN0eCAhPSBjbWRidWYtPmN0eCkgewor CQlncHUtPm1tdS0+bmVlZF9mbHVzaCA9IHRydWU7CisJCWdwdS0+c3dpdGNoX2NvbnRleHQgPSB0 cnVlOworCQlncHUtPmxhc3RjdHggPSBjbWRidWYtPmN0eDsKKwl9CisKKwlldG5hdml2X2J1ZmZl cl9xdWV1ZShncHUsIGV2ZW50LCBjbWRidWYpOworCisJY21kYnVmLT5mZW5jZSA9IGZlbmNlOwor CWxpc3RfYWRkX3RhaWwoJmNtZGJ1Zi0+bm9kZSwgJmdwdS0+YWN0aXZlX2NtZF9saXN0KTsKKwor CS8qIFdlJ3JlIGNvbW1pdHRlZCB0byBhZGRpbmcgdGhpcyBjb21tYW5kIGJ1ZmZlciwgaG9sZCBh IFBNIHJlZmVyZW5jZSAqLworCXBtX3J1bnRpbWVfZ2V0X25vcmVzdW1lKGdwdS0+ZGV2KTsKKwor CWZvciAoaSA9IDA7IGkgPCBzdWJtaXQtPm5yX2JvczsgaSsrKSB7CisJCXN0cnVjdCBldG5hdml2 X2dlbV9vYmplY3QgKmV0bmF2aXZfb2JqID0gc3VibWl0LT5ib3NbaV0ub2JqOworCQl1MzIgaW92 YTsKKworCQkvKiBFYWNoIGNtZGJ1ZiB0YWtlcyBhIHJlZmNvdW50IG9uIHRoZSBpb3ZhICovCisJ CWV0bmF2aXZfZ2VtX2dldF9pb3ZhKGdwdSwgJmV0bmF2aXZfb2JqLT5iYXNlLCAmaW92YSk7CisJ CWNtZGJ1Zi0+Ym9baV0gPSBldG5hdml2X29iajsKKwkJYXRvbWljX2luYygmZXRuYXZpdl9vYmot PmdwdV9hY3RpdmUpOworCisJCWlmIChzdWJtaXQtPmJvc1tpXS5mbGFncyAmIEVUTkFfU1VCTUlU X0JPX1dSSVRFKQorCQkJcmVzZXJ2YXRpb25fb2JqZWN0X2FkZF9leGNsX2ZlbmNlKGV0bmF2aXZf b2JqLT5yZXN2LAorCQkJCQkJCSAgZmVuY2UpOworCQllbHNlCisJCQlyZXNlcnZhdGlvbl9vYmpl Y3RfYWRkX3NoYXJlZF9mZW5jZShldG5hdml2X29iai0+cmVzdiwKKwkJCQkJCQkgICAgZmVuY2Up OworCX0KKwljbWRidWYtPm5yX2JvcyA9IHN1Ym1pdC0+bnJfYm9zOworCWhhbmdjaGVja190aW1l cl9yZXNldChncHUpOworCXJldCA9IDA7CisKK291dF91bmxvY2s6CisJbXV0ZXhfdW5sb2NrKCZn cHUtPmxvY2spOworCisJZXRuYXZpdl9ncHVfcG1fcHV0KGdwdSk7CisKKwlyZXR1cm4gcmV0Owor fQorCisvKgorICogSW5pdC9DbGVhbnVwOgorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgaXJxX2hh bmRsZXIoaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZXRuYXZpdl9ncHUgKmdwdSA9 IGRhdGE7CisJaXJxcmV0dXJuX3QgcmV0ID0gSVJRX05PTkU7CisKKwl1MzIgaW50ciA9IGdwdV9y ZWFkKGdwdSwgVklWU19ISV9JTlRSX0FDS05PV0xFREdFKTsKKworCWlmIChpbnRyICE9IDApIHsK KwkJaW50IGV2ZW50OworCisJCXBtX3J1bnRpbWVfbWFya19sYXN0X2J1c3koZ3B1LT5kZXYpOwor CisJCWRldl9kYmcoZ3B1LT5kZXYsICJpbnRyIDB4JTA4eFxuIiwgaW50cik7CisKKwkJaWYgKGlu dHIgJiBWSVZTX0hJX0lOVFJfQUNLTk9XTEVER0VfQVhJX0JVU19FUlJPUikgeworCQkJZGV2X2Vy cihncHUtPmRldiwgIkFYSSBidXMgZXJyb3JcbiIpOworCQkJaW50ciAmPSB+VklWU19ISV9JTlRS X0FDS05PV0xFREdFX0FYSV9CVVNfRVJST1I7CisJCX0KKworCQl3aGlsZSAoKGV2ZW50ID0gZmZz KGludHIpKSAhPSAwKSB7CisJCQlzdHJ1Y3QgZmVuY2UgKmZlbmNlOworCisJCQlldmVudCAtPSAx OworCisJCQlpbnRyICY9IH4oMSA8PCBldmVudCk7CisKKwkJCWRldl9kYmcoZ3B1LT5kZXYsICJl dmVudCAldVxuIiwgZXZlbnQpOworCisJCQlmZW5jZSA9IGdwdS0+ZXZlbnRbZXZlbnRdLmZlbmNl OworCQkJZ3B1LT5ldmVudFtldmVudF0uZmVuY2UgPSBOVUxMOworCQkJZmVuY2Vfc2lnbmFsKGZl bmNlKTsKKworCQkJLyoKKwkJCSAqIEV2ZW50cyBjYW4gYmUgcHJvY2Vzc2VkIG91dCBvZiBvcmRl ci4gIEVnLAorCQkJICogLSBhbGxvY2F0ZSBhbmQgcXVldWUgZXZlbnQgMAorCQkJICogLSBhbGxv Y2F0ZSBldmVudCAxCisJCQkgKiAtIGV2ZW50IDAgY29tcGxldGVzLCB3ZSBwcm9jZXNzIGl0CisJ CQkgKiAtIGFsbG9jYXRlIGFuZCBxdWV1ZSBldmVudCAwCisJCQkgKiAtIGV2ZW50IDEgYW5kIGV2 ZW50IDAgY29tcGxldGUKKwkJCSAqIHdlIGNhbiBlbmQgdXAgcHJvY2Vzc2luZyBldmVudCAwIGZp cnN0LCB0aGVuIDEuCisJCQkgKi8KKwkJCWlmIChmZW5jZV9hZnRlcihmZW5jZS0+c2Vxbm8sIGdw dS0+Y29tcGxldGVkX2ZlbmNlKSkKKwkJCQlncHUtPmNvbXBsZXRlZF9mZW5jZSA9IGZlbmNlLT5z ZXFubzsKKworCQkJZXZlbnRfZnJlZShncHUsIGV2ZW50KTsKKworCQkJLyoKKwkJCSAqIFdlIG5l ZWQgdG8gYmFsYW5jZSB0aGUgcnVudGltZSBQTSBjb3VudCBjYXVzZWQgYnkKKwkJCSAqIGVhY2gg c3VibWlzc2lvbi4gIFVwb24gc3VibWlzc2lvbiwgd2UgaW5jcmVtZW50CisJCQkgKiB0aGUgcnVu dGltZSBQTSBjb3VudGVyLCBhbmQgYWxsb2NhdGUgb25lIGV2ZW50LgorCQkJICogU28gaGVyZSwg d2UgcHV0IHRoZSBydW50aW1lIFBNIGNvdW50IGZvciBlYWNoCisJCQkgKiBjb21wbGV0ZWQgZXZl bnQuCisJCQkgKi8KKwkJCXBtX3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKGdwdS0+ZGV2KTsKKwkJ fQorCisJCS8qIFJldGlyZSB0aGUgYnVmZmVyIG9iamVjdHMgaW4gYSB3b3JrICovCisJCWV0bmF2 aXZfcXVldWVfd29yayhncHUtPmRybSwgJmdwdS0+cmV0aXJlX3dvcmspOworCisJCXJldCA9IElS UV9IQU5ETEVEOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZXRuYXZpdl9n cHVfY2xrX2VuYWJsZShzdHJ1Y3QgZXRuYXZpdl9ncHUgKmdwdSkKK3sKKwlpbnQgcmV0OworCisJ cmV0ID0gZW5hYmxlX2NsayhncHUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQg PSBlbmFibGVfYXhpKGdwdSk7CisJaWYgKHJldCkgeworCQlkaXNhYmxlX2NsayhncHUpOworCQly ZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGV0bmF2aXZfZ3B1 X2Nsa19kaXNhYmxlKHN0cnVjdCBldG5hdml2X2dwdSAqZ3B1KQoreworCWludCByZXQ7CisKKwly ZXQgPSBkaXNhYmxlX2F4aShncHUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQg PSBkaXNhYmxlX2NsayhncHUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4g MDsKK30KKworc3RhdGljIGludCBldG5hdml2X2dwdV9od19zdXNwZW5kKHN0cnVjdCBldG5hdml2 X2dwdSAqZ3B1KQoreworCWlmIChncHUtPmJ1ZmZlcikgeworCQl1bnNpZ25lZCBsb25nIHRpbWVv dXQ7CisKKwkJLyogUmVwbGFjZSB0aGUgbGFzdCBXQUlUIHdpdGggRU5EICovCisJCWV0bmF2aXZf YnVmZmVyX2VuZChncHUpOworCisJCS8qCisJCSAqIFdlIGtub3cgdGhhdCBvbmx5IHRoZSBGRSBp cyBidXN5IGhlcmUsIHRoaXMgc2hvdWxkCisJCSAqIGhhcHBlbiBxdWlja2x5IChhcyB0aGUgV0FJ VCBpcyBvbmx5IDIwMCBjeWNsZXMpLiAgSWYKKwkJICogd2UgZmFpbCwganVzdCB3YXJuIGFuZCBj b250aW51ZS4KKwkJICovCisJCXRpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygx MDApOworCQlkbyB7CisJCQl1MzIgaWRsZSA9IGdwdV9yZWFkKGdwdSwgVklWU19ISV9JRExFX1NU QVRFKTsKKworCQkJaWYgKChpZGxlICYgZ3B1LT5pZGxlX21hc2spID09IGdwdS0+aWRsZV9tYXNr KQorCQkJCWJyZWFrOworCisJCQlpZiAodGltZV9pc19iZWZvcmVfamlmZmllcyh0aW1lb3V0KSkg eworCQkJCWRldl93YXJuKGdwdS0+ZGV2LAorCQkJCQkgInRpbWVkIG91dCB3YWl0aW5nIGZvciBp ZGxlOiBpZGxlPTB4JXhcbiIsCisJCQkJCSBpZGxlKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJ dWRlbGF5KDUpOworCQl9IHdoaWxlICgxKTsKKwl9CisKKwlyZXR1cm4gZXRuYXZpdl9ncHVfY2xr X2Rpc2FibGUoZ3B1KTsKK30KKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBldG5hdml2 X2dwdV9od19yZXN1bWUoc3RydWN0IGV0bmF2aXZfZ3B1ICpncHUpCit7CisJdTMyIGNsb2NrOwor CWludCByZXQ7CisKKwlyZXQgPSBtdXRleF9sb2NrX2tpbGxhYmxlKCZncHUtPmxvY2spOworCWlm IChyZXQpCisJCXJldHVybiByZXQ7CisKKwljbG9jayA9IFZJVlNfSElfQ0xPQ0tfQ09OVFJPTF9E SVNBQkxFX0RFQlVHX1JFR0lTVEVSUyB8CisJCVZJVlNfSElfQ0xPQ0tfQ09OVFJPTF9GU0NBTEVf VkFMKDB4NDApOworCisJZXRuYXZpdl9ncHVfbG9hZF9jbG9jayhncHUsIGNsb2NrKTsKKwlldG5h dml2X2dwdV9od19pbml0KGdwdSk7CisKKwlncHUtPnN3aXRjaF9jb250ZXh0ID0gdHJ1ZTsKKwor CW11dGV4X3VubG9jaygmZ3B1LT5sb2NrKTsKKworCXJldHVybiAwOworfQorI2VuZGlmCisKK3N0 YXRpYyBpbnQgZXRuYXZpdl9ncHVfYmluZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZp Y2UgKm1hc3RlciwKKwl2b2lkICpkYXRhKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkcm0gPSBk YXRhOworCXN0cnVjdCBldG5hdml2X2RybV9wcml2YXRlICpwcml2ID0gZHJtLT5kZXZfcHJpdmF0 ZTsKKwlzdHJ1Y3QgZXRuYXZpdl9ncHUgKmdwdSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWlu dCByZXQ7CisKKyNpZmRlZiBDT05GSUdfUE0KKwlyZXQgPSBwbV9ydW50aW1lX2dldF9zeW5jKGdw dS0+ZGV2KTsKKyNlbHNlCisJcmV0ID0gZXRuYXZpdl9ncHVfY2xrX2VuYWJsZShncHUpOworI2Vu ZGlmCisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlncHUtPmRybSA9IGRybTsKKwln cHUtPmZlbmNlX2NvbnRleHQgPSBmZW5jZV9jb250ZXh0X2FsbG9jKDEpOworCXNwaW5fbG9ja19p bml0KCZncHUtPmZlbmNlX3NwaW5sb2NrKTsKKworCUlOSVRfTElTVF9IRUFEKCZncHUtPmFjdGl2 ZV9jbWRfbGlzdCk7CisJSU5JVF9XT1JLKCZncHUtPnJldGlyZV93b3JrLCByZXRpcmVfd29ya2Vy KTsKKwlJTklUX1dPUksoJmdwdS0+cmVjb3Zlcl93b3JrLCByZWNvdmVyX3dvcmtlcik7CisJaW5p dF93YWl0cXVldWVfaGVhZCgmZ3B1LT5mZW5jZV9ldmVudCk7CisKKwlzZXR1cF90aW1lcigmZ3B1 LT5oYW5nY2hlY2tfdGltZXIsIGhhbmdjaGVja19oYW5kbGVyLAorCQkJKHVuc2lnbmVkIGxvbmcp Z3B1KTsKKworCXByaXYtPmdwdVtwcml2LT5udW1fZ3B1cysrXSA9IGdwdTsKKworCXBtX3J1bnRp bWVfbWFya19sYXN0X2J1c3koZ3B1LT5kZXYpOworCXBtX3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5k KGdwdS0+ZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBldG5hdml2X2dwdV91 bmJpbmQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlICptYXN0ZXIsCisJdm9pZCAq ZGF0YSkKK3sKKwlzdHJ1Y3QgZXRuYXZpdl9ncHUgKmdwdSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYp OworCisJREJHKCIlcyIsIGRldl9uYW1lKGdwdS0+ZGV2KSk7CisKKwloYW5nY2hlY2tfZGlzYWJs ZShncHUpOworCisjaWZkZWYgQ09ORklHX1BNCisJcG1fcnVudGltZV9nZXRfc3luYyhncHUtPmRl dik7CisJcG1fcnVudGltZV9wdXRfc3luY19zdXNwZW5kKGdwdS0+ZGV2KTsKKyNlbHNlCisJZXRu YXZpdl9ncHVfaHdfc3VzcGVuZChncHUpOworI2VuZGlmCisKKwlpZiAoZ3B1LT5idWZmZXIpIHsK KwkJZXRuYXZpdl9ncHVfY21kYnVmX2ZyZWUoZ3B1LT5idWZmZXIpOworCQlncHUtPmJ1ZmZlciA9 IE5VTEw7CisJfQorCisJaWYgKGdwdS0+bW11KSB7CisJCWV0bmF2aXZfaW9tbXVfZGVzdHJveShn cHUtPm1tdSk7CisJCWdwdS0+bW11ID0gTlVMTDsKKwl9CisKKwlncHUtPmRybSA9IE5VTEw7Cit9 CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY29tcG9uZW50X29wcyBncHVfb3BzID0geworCS5iaW5k ID0gZXRuYXZpdl9ncHVfYmluZCwKKwkudW5iaW5kID0gZXRuYXZpdl9ncHVfdW5iaW5kLAorfTsK Kworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgZXRuYXZpdl9ncHVfbWF0Y2hbXSA9 IHsKKwl7CisJCS5jb21wYXRpYmxlID0gInZpdmFudGUsZ2MiCisJfSwKKwl7IC8qIHNlbnRpbmVs ICovIH0KK307CisKK3N0YXRpYyBpbnQgZXRuYXZpdl9ncHVfcGxhdGZvcm1fcHJvYmUoc3RydWN0 IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ ZGV2OworCXN0cnVjdCBldG5hdml2X2dwdSAqZ3B1OworCWludCBlcnIgPSAwOworCisJZ3B1ID0g ZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpncHUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWdwdSkK KwkJcmV0dXJuIC1FTk9NRU07CisKKwlncHUtPmRldiA9ICZwZGV2LT5kZXY7CisJbXV0ZXhfaW5p dCgmZ3B1LT5sb2NrKTsKKworCS8qCisJICogU2V0IHRoZSBHUFUgYmFzZSBhZGRyZXNzIHRvIHRo ZSBzdGFydCBvZiBwaHlzaWNhbCBtZW1vcnkuICBUaGlzCisJICogZW5zdXJlcyB0aGF0IGlmIHdl IGhhdmUgdXAgdG8gMkdCLCB0aGUgdjEgTU1VIGNhbiBhZGRyZXNzIHRoZQorCSAqIGhpZ2hlc3Qg bWVtb3J5LiAgVGhpcyBpcyBpbXBvcnRhbnQgYXMgY29tbWFuZCBidWZmZXJzIG1heSBiZQorCSAq IGFsbG9jYXRlZCBvdXRzaWRlIG9mIHRoaXMgbGltaXQuCisJICovCisJZ3B1LT5tZW1vcnlfYmFz ZSA9IFBIWVNfT0ZGU0VUOworCisJLyogTWFwIHJlZ2lzdGVyczogKi8KKwlncHUtPm1taW8gPSBl dG5hdml2X2lvcmVtYXAocGRldiwgTlVMTCwgZGV2X25hbWUoZ3B1LT5kZXYpKTsKKwlpZiAoSVNf RVJSKGdwdS0+bW1pbykpCisJCXJldHVybiBQVFJfRVJSKGdwdS0+bW1pbyk7CisKKwkvKiBHZXQg SW50ZXJydXB0OiAqLworCWdwdS0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlp ZiAoZ3B1LT5pcnEgPCAwKSB7CisJCWVyciA9IGdwdS0+aXJxOworCQlkZXZfZXJyKGRldiwgImZh aWxlZCB0byBnZXQgaXJxOiAlZFxuIiwgZXJyKTsKKwkJZ290byBmYWlsOworCX0KKworCWVyciA9 IGRldm1fcmVxdWVzdF9pcnEoJnBkZXYtPmRldiwgZ3B1LT5pcnEsIGlycV9oYW5kbGVyLCAwLAor CQkJICAgICAgIGRldl9uYW1lKGdwdS0+ZGV2KSwgZ3B1KTsKKwlpZiAoZXJyKSB7CisJCWRldl9l cnIoZGV2LCAiZmFpbGVkIHRvIHJlcXVlc3QgSVJRJXU6ICVkXG4iLCBncHUtPmlycSwgZXJyKTsK KwkJZ290byBmYWlsOworCX0KKworCS8qIEdldCBDbG9ja3M6ICovCisJZ3B1LT5jbGtfYnVzID0g ZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsICJidXMiKTsKKwlEQkcoImNsa19idXM6ICVwIiwgZ3B1 LT5jbGtfYnVzKTsKKwlpZiAoSVNfRVJSKGdwdS0+Y2xrX2J1cykpCisJCWdwdS0+Y2xrX2J1cyA9 IE5VTEw7CisKKwlncHUtPmNsa19jb3JlID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsICJjb3Jl Iik7CisJREJHKCJjbGtfY29yZTogJXAiLCBncHUtPmNsa19jb3JlKTsKKwlpZiAoSVNfRVJSKGdw dS0+Y2xrX2NvcmUpKQorCQlncHUtPmNsa19jb3JlID0gTlVMTDsKKworCWdwdS0+Y2xrX3NoYWRl ciA9IGRldm1fY2xrX2dldCgmcGRldi0+ZGV2LCAic2hhZGVyIik7CisJREJHKCJjbGtfc2hhZGVy OiAlcCIsIGdwdS0+Y2xrX3NoYWRlcik7CisJaWYgKElTX0VSUihncHUtPmNsa19zaGFkZXIpKQor CQlncHUtPmNsa19zaGFkZXIgPSBOVUxMOworCisJLyogVE9ETzogZmlndXJlIG91dCBtYXggbWFw cGVkIHNpemUgKi8KKwlkZXZfc2V0X2RydmRhdGEoZGV2LCBncHUpOworCisJLyoKKwkgKiBXZSB0 cmVhdCB0aGUgZGV2aWNlIGFzIGluaXRpYWxseSBzdXNwZW5kZWQuICBUaGUgcnVudGltZSBQTQor CSAqIGF1dG9zdXNwZW5kIGRlbGF5IGlzIHJhdGhlciBhcmJpdGFyeTogbm8gbWVhc3VyZW1lbnRz IGhhdmUKKwkgKiB5ZXQgYmVlbiBwZXJmb3JtZWQgdG8gZGV0ZXJtaW5lIGFuIGFwcHJvcHJpYXRl IHZhbHVlLgorCSAqLworCXBtX3J1bnRpbWVfdXNlX2F1dG9zdXNwZW5kKGdwdS0+ZGV2KTsKKwlw bV9ydW50aW1lX3NldF9hdXRvc3VzcGVuZF9kZWxheShncHUtPmRldiwgMjAwKTsKKwlwbV9ydW50 aW1lX2VuYWJsZShncHUtPmRldik7CisKKwllcnIgPSBjb21wb25lbnRfYWRkKCZwZGV2LT5kZXYs ICZncHVfb3BzKTsKKwlpZiAoZXJyIDwgMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWls ZWQgdG8gcmVnaXN0ZXIgY29tcG9uZW50OiAlZFxuIiwgZXJyKTsKKwkJZ290byBmYWlsOworCX0K KworCXJldHVybiAwOworCitmYWlsOgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgZXRu YXZpdl9ncHVfcGxhdGZvcm1fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7 CisJY29tcG9uZW50X2RlbCgmcGRldi0+ZGV2LCAmZ3B1X29wcyk7CisJcG1fcnVudGltZV9kaXNh YmxlKCZwZGV2LT5kZXYpOworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1BNCitzdGF0 aWMgaW50IGV0bmF2aXZfZ3B1X3JwbV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlz dHJ1Y3QgZXRuYXZpdl9ncHUgKmdwdSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXUzMiBpZGxl LCBtYXNrOworCisJLyogSWYgd2UgaGF2ZSBvdXRzdGFuZGluZyBmZW5jZXMsIHdlJ3JlIG5vdCBp ZGxlICovCisJaWYgKGdwdS0+Y29tcGxldGVkX2ZlbmNlICE9IGdwdS0+YWN0aXZlX2ZlbmNlKQor CQlyZXR1cm4gLUVCVVNZOworCisJLyogQ2hlY2sgd2hldGhlciB0aGUgaGFyZHdhcmUgKGV4Y2Vw dCBGRSkgaXMgaWRsZSAqLworCW1hc2sgPSBncHUtPmlkbGVfbWFzayAmIH5WSVZTX0hJX0lETEVf U1RBVEVfRkU7CisJaWRsZSA9IGdwdV9yZWFkKGdwdSwgVklWU19ISV9JRExFX1NUQVRFKSAmIG1h c2s7CisJaWYgKGlkbGUgIT0gbWFzaykKKwkJcmV0dXJuIC1FQlVTWTsKKworCXJldHVybiBldG5h dml2X2dwdV9od19zdXNwZW5kKGdwdSk7Cit9CisKK3N0YXRpYyBpbnQgZXRuYXZpdl9ncHVfcnBt X3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGV0bmF2aXZfZ3B1ICpncHUg PSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgcmV0OworCisJcmV0ID0gZXRuYXZpdl9ncHVf Y2xrX2VuYWJsZShncHUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiBSZS1pbml0 aWFsaXNlIHRoZSBiYXNpYyBoYXJkd2FyZSBzdGF0ZSAqLworCWlmIChncHUtPmRybSAmJiBncHUt PmJ1ZmZlcikgeworCQlyZXQgPSBldG5hdml2X2dwdV9od19yZXN1bWUoZ3B1KTsKKwkJaWYgKHJl dCkgeworCQkJZXRuYXZpdl9ncHVfY2xrX2Rpc2FibGUoZ3B1KTsKKwkJCXJldHVybiByZXQ7CisJ CX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRl dl9wbV9vcHMgZXRuYXZpdl9ncHVfcG1fb3BzID0geworCVNFVF9SVU5USU1FX1BNX09QUyhldG5h dml2X2dwdV9ycG1fc3VzcGVuZCwgZXRuYXZpdl9ncHVfcnBtX3Jlc3VtZSwKKwkJCSAgIE5VTEwp Cit9OworCitzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGV0bmF2aXZfZ3B1X2RyaXZlciA9IHsKKwku ZHJpdmVyID0geworCQkubmFtZSA9ICJldG5hdml2LWdwdSIsCisJCS5vd25lciA9IFRISVNfTU9E VUxFLAorCQkucG0gPSAmZXRuYXZpdl9ncHVfcG1fb3BzLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBl dG5hdml2X2dwdV9tYXRjaCwKKwl9LAorCS5wcm9iZSA9IGV0bmF2aXZfZ3B1X3BsYXRmb3JtX3By b2JlLAorCS5yZW1vdmUgPSBldG5hdml2X2dwdV9wbGF0Zm9ybV9yZW1vdmUsCisJLmlkX3RhYmxl ID0gZ3B1X2lkcywKK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZXRuYXZpdi9ldG5h dml2X2dwdS5oIGIvZHJpdmVycy9ncHUvZHJtL2V0bmF2aXYvZXRuYXZpdl9ncHUuaApuZXcgZmls ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAuLmM3NWQ1MDM1OWFiMAotLS0gL2Rldi9u dWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ldG5hdml2L2V0bmF2aXZfZ3B1LmgKQEAgLTAsMCAr MSwyMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgRXRuYXZpdiBQcm9qZWN0CisgKgor ICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0 IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwg UHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29m dHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4g dGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJS QU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElU WSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBH ZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBz aG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNl bnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3 LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaWZuZGVmIF9fRVROQVZJVl9HUFVfSF9fCisj ZGVmaW5lIF9fRVROQVZJVl9HUFVfSF9fCisKKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNs dWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KKworI2luY2x1ZGUgImV0bmF2aXZfZHJ2 LmgiCisKK3N0cnVjdCBldG5hdml2X2dlbV9zdWJtaXQ7CisKK3N0cnVjdCBldG5hdml2X2NoaXBf aWRlbnRpdHkgeworCS8qIENoaXAgbW9kZWwuICovCisJdTMyIG1vZGVsOworCisJLyogUmV2aXNp b24gdmFsdWUuKi8KKwl1MzIgcmV2aXNpb247CisKKwkvKiBTdXBwb3J0ZWQgZmVhdHVyZSBmaWVs ZHMuICovCisJdTMyIGZlYXR1cmVzOworCisJLyogU3VwcG9ydGVkIG1pbm9yIGZlYXR1cmUgZmll bGRzLiAqLworCXUzMiBtaW5vcl9mZWF0dXJlczA7CisKKwkvKiBTdXBwb3J0ZWQgbWlub3IgZmVh dHVyZSAxIGZpZWxkcy4gKi8KKwl1MzIgbWlub3JfZmVhdHVyZXMxOworCisJLyogU3VwcG9ydGVk IG1pbm9yIGZlYXR1cmUgMiBmaWVsZHMuICovCisJdTMyIG1pbm9yX2ZlYXR1cmVzMjsKKworCS8q IFN1cHBvcnRlZCBtaW5vciBmZWF0dXJlIDMgZmllbGRzLiAqLworCXUzMiBtaW5vcl9mZWF0dXJl czM7CisKKwkvKiBOdW1iZXIgb2Ygc3RyZWFtcyBzdXBwb3J0ZWQuICovCisJdTMyIHN0cmVhbV9j b3VudDsKKworCS8qIFRvdGFsIG51bWJlciBvZiB0ZW1wb3JhcnkgcmVnaXN0ZXJzIHBlciB0aHJl YWQuICovCisJdTMyIHJlZ2lzdGVyX21heDsKKworCS8qIE1heGltdW0gbnVtYmVyIG9mIHRocmVh ZHMuICovCisJdTMyIHRocmVhZF9jb3VudDsKKworCS8qIE51bWJlciBvZiBzaGFkZXIgY29yZXMu ICovCisJdTMyIHNoYWRlcl9jb3JlX2NvdW50OworCisJLyogU2l6ZSBvZiB0aGUgdmVydGV4IGNh Y2hlLiAqLworCXUzMiB2ZXJ0ZXhfY2FjaGVfc2l6ZTsKKworCS8qIE51bWJlciBvZiBlbnRyaWVz IGluIHRoZSB2ZXJ0ZXggb3V0cHV0IGJ1ZmZlci4gKi8KKwl1MzIgdmVydGV4X291dHB1dF9idWZm ZXJfc2l6ZTsKKworCS8qIE51bWJlciBvZiBwaXhlbCBwaXBlcy4gKi8KKwl1MzIgcGl4ZWxfcGlw ZXM7CisKKwkvKiBOdW1iZXIgb2YgaW5zdHJ1Y3Rpb25zLiAqLworCXUzMiBpbnN0cnVjdGlvbl9j b3VudDsKKworCS8qIE51bWJlciBvZiBjb25zdGFudHMuICovCisJdTMyIG51bV9jb25zdGFudHM7 CisKKwkvKiBCdWZmZXIgc2l6ZSAqLworCXUzMiBidWZmZXJfc2l6ZTsKK307CisKK3N0cnVjdCBl dG5hdml2X2V2ZW50IHsKKwlib29sIHVzZWQ7CisJc3RydWN0IGZlbmNlICpmZW5jZTsKK307CisK K3N0cnVjdCBldG5hdml2X2NtZGJ1ZjsKKworc3RydWN0IGV0bmF2aXZfZ3B1IHsKKwlzdHJ1Y3Qg ZHJtX2RldmljZSAqZHJtOworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlzdHJ1Y3QgbXV0ZXggbG9j azsKKwlzdHJ1Y3QgZXRuYXZpdl9jaGlwX2lkZW50aXR5IGlkZW50aXR5OworCXN0cnVjdCBldG5h dml2X2ZpbGVfcHJpdmF0ZSAqbGFzdGN0eDsKKwlib29sIHN3aXRjaF9jb250ZXh0OworCisJLyog J3JpbmcnLWJ1ZmZlcjogKi8KKwlzdHJ1Y3QgZXRuYXZpdl9jbWRidWYgKmJ1ZmZlcjsKKworCS8q IGJ1cyBiYXNlIGFkZHJlc3Mgb2YgbWVtb3J5ICAqLworCXUzMiBtZW1vcnlfYmFzZTsKKworCS8q IGV2ZW50IG1hbmFnZW1lbnQ6ICovCisJc3RydWN0IGV0bmF2aXZfZXZlbnQgZXZlbnRbMzBdOwor CXN0cnVjdCBjb21wbGV0aW9uIGV2ZW50X2ZyZWU7CisJc3BpbmxvY2tfdCBldmVudF9zcGlubG9j azsKKworCS8qIGxpc3Qgb2YgY3VycmVudGx5IGluLWZsaWdodCBjb21tYW5kIGJ1ZmZlcnMgKi8K KwlzdHJ1Y3QgbGlzdF9oZWFkIGFjdGl2ZV9jbWRfbGlzdDsKKworCXUzMiBpZGxlX21hc2s7CisK KwkvKiBGZW5jaW5nIHN1cHBvcnQgKi8KKwl1MzIgbmV4dF9mZW5jZTsKKwl1MzIgYWN0aXZlX2Zl bmNlOworCXUzMiBjb21wbGV0ZWRfZmVuY2U7CisJdTMyIHJldGlyZWRfZmVuY2U7CisJd2FpdF9x dWV1ZV9oZWFkX3QgZmVuY2VfZXZlbnQ7CisJdW5zaWduZWQgaW50IGZlbmNlX2NvbnRleHQ7CisJ c3BpbmxvY2tfdCBmZW5jZV9zcGlubG9jazsKKworCS8qIHdvcmtlciBmb3IgaGFuZGxpbmcgYWN0 aXZlLWxpc3QgcmV0aXJpbmc6ICovCisJc3RydWN0IHdvcmtfc3RydWN0IHJldGlyZV93b3JrOwor CisJdm9pZCBfX2lvbWVtICptbWlvOworCWludCBpcnE7CisKKwlzdHJ1Y3QgZXRuYXZpdl9pb21t dSAqbW11OworCisJLyogUG93ZXIgQ29udHJvbDogKi8KKwlzdHJ1Y3QgY2xrICpjbGtfYnVzOwor CXN0cnVjdCBjbGsgKmNsa19jb3JlOworCXN0cnVjdCBjbGsgKmNsa19zaGFkZXI7CisKKwkvKiBI YW5nIERldGN0aW9uOiAqLworI2RlZmluZSBEUk1fRVROQVZJVl9IQU5HQ0hFQ0tfUEVSSU9EIDUw MCAvKiBpbiBtcyAqLworI2RlZmluZSBEUk1fRVROQVZJVl9IQU5HQ0hFQ0tfSklGRklFUyBtc2Vj c190b19qaWZmaWVzKERSTV9FVE5BVklWX0hBTkdDSEVDS19QRVJJT0QpCisJc3RydWN0IHRpbWVy X2xpc3QgaGFuZ2NoZWNrX3RpbWVyOworCXUzMiBoYW5nY2hlY2tfZmVuY2U7CisJdTMyIGhhbmdj aGVja19kbWFfYWRkcjsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcmVjb3Zlcl93b3JrOworfTsKKwor c3RydWN0IGV0bmF2aXZfY21kYnVmIHsKKwkvKiBkZXZpY2UgdGhpcyBjbWRidWYgaXMgYWxsb2Nh dGVkIGZvciAqLworCXN0cnVjdCBldG5hdml2X2dwdSAqZ3B1OworCS8qIHVzZXIgY29udGV4dCBr ZXksIG11c3QgYmUgdW5pcXVlIGJldHdlZW4gYWxsIGFjdGl2ZSB1c2VycyAqLworCXN0cnVjdCBl dG5hdml2X2ZpbGVfcHJpdmF0ZSAqY3R4OworCS8qIGNtZGJ1ZiBwcm9wZXJ0aWVzICovCisJdm9p ZCAqdmFkZHI7CisJZG1hX2FkZHJfdCBwYWRkcjsKKwl1MzIgc2l6ZTsKKwl1MzIgdXNlcl9zaXpl OworCS8qIGZlbmNlIGFmdGVyIHdoaWNoIHRoaXMgYnVmZmVyIGlzIHRvIGJlIGRpc3Bvc2VkICov CisJc3RydWN0IGZlbmNlICpmZW5jZTsKKwkvKiB0YXJnZXQgZXhlYyBzdGF0ZSAqLworCXUzMiBl eGVjX3N0YXRlOworCS8qIHBlciBHUFUgaW4tZmxpZ2h0IGxpc3QgKi8KKwlzdHJ1Y3QgbGlzdF9o ZWFkIG5vZGU7CisJLyogQk9zIGF0dGFjaGVkIHRvIHRoaXMgY29tbWFuZCBidWZmZXIgKi8KKwl1 bnNpZ25lZCBpbnQgbnJfYm9zOworCXN0cnVjdCBldG5hdml2X2dlbV9vYmplY3QgKmJvWzBdOwor fTsKKworc3RhdGljIGlubGluZSB2b2lkIGdwdV93cml0ZShzdHJ1Y3QgZXRuYXZpdl9ncHUgKmdw dSwgdTMyIHJlZywgdTMyIGRhdGEpCit7CisJZXRuYXZpdl93cml0ZWwoZGF0YSwgZ3B1LT5tbWlv ICsgcmVnKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgZ3B1X3JlYWQoc3RydWN0IGV0bmF2aXZf Z3B1ICpncHUsIHUzMiByZWcpCit7CisJcmV0dXJuIGV0bmF2aXZfcmVhZGwoZ3B1LT5tbWlvICsg cmVnKTsKK30KKworc3RhdGljIGlubGluZSBib29sIGZlbmNlX2NvbXBsZXRlZChzdHJ1Y3QgZXRu YXZpdl9ncHUgKmdwdSwgdTMyIGZlbmNlKQoreworCXJldHVybiBmZW5jZV9hZnRlcl9lcShncHUt PmNvbXBsZXRlZF9mZW5jZSwgZmVuY2UpOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgZmVuY2Vf cmV0aXJlZChzdHJ1Y3QgZXRuYXZpdl9ncHUgKmdwdSwgdTMyIGZlbmNlKQoreworCXJldHVybiBm ZW5jZV9hZnRlcl9lcShncHUtPnJldGlyZWRfZmVuY2UsIGZlbmNlKTsKK30KKworaW50IGV0bmF2 aXZfZ3B1X2dldF9wYXJhbShzdHJ1Y3QgZXRuYXZpdl9ncHUgKmdwdSwgdTMyIHBhcmFtLCB1NjQg KnZhbHVlKTsKKworaW50IGV0bmF2aXZfZ3B1X2luaXQoc3RydWN0IGV0bmF2aXZfZ3B1ICpncHUp OworCisjaWZkZWYgQ09ORklHX0RFQlVHX0ZTCitpbnQgZXRuYXZpdl9ncHVfZGVidWdmcyhzdHJ1 Y3QgZXRuYXZpdl9ncHUgKmdwdSwgc3RydWN0IHNlcV9maWxlICptKTsKKyNlbmRpZgorCitpbnQg ZXRuYXZpdl9ncHVfZmVuY2Vfc3luY19vYmooc3RydWN0IGV0bmF2aXZfZ2VtX29iamVjdCAqZXRu YXZpdl9vYmosCisJdW5zaWduZWQgaW50IGNvbnRleHQsIGJvb2wgZXhjbHVzaXZlKTsKKwordm9p ZCBldG5hdml2X2dwdV9yZXRpcmUoc3RydWN0IGV0bmF2aXZfZ3B1ICpncHUpOworaW50IGV0bmF2 aXZfZ3B1X3dhaXRfZmVuY2VfaW50ZXJydXB0aWJsZShzdHJ1Y3QgZXRuYXZpdl9ncHUgKmdwdSwK Kwl1MzIgZmVuY2UsIHN0cnVjdCB0aW1lc3BlYyAqdGltZW91dCk7CitpbnQgZXRuYXZpdl9ncHVf d2FpdF9vYmpfaW5hY3RpdmUoc3RydWN0IGV0bmF2aXZfZ3B1ICpncHUsCisJc3RydWN0IGV0bmF2 aXZfZ2VtX29iamVjdCAqZXRuYXZpdl9vYmosIHN0cnVjdCB0aW1lc3BlYyAqdGltZW91dCk7Citp bnQgZXRuYXZpdl9ncHVfc3VibWl0KHN0cnVjdCBldG5hdml2X2dwdSAqZ3B1LAorCXN0cnVjdCBl dG5hdml2X2dlbV9zdWJtaXQgKnN1Ym1pdCwgc3RydWN0IGV0bmF2aXZfY21kYnVmICpjbWRidWYp Oworc3RydWN0IGV0bmF2aXZfY21kYnVmICpldG5hdml2X2dwdV9jbWRidWZfbmV3KHN0cnVjdCBl dG5hdml2X2dwdSAqZ3B1LAorCQkJCQkgICAgICB1MzIgc2l6ZSwgc2l6ZV90IG5yX2Jvcyk7Cit2 b2lkIGV0bmF2aXZfZ3B1X2NtZGJ1Zl9mcmVlKHN0cnVjdCBldG5hdml2X2NtZGJ1ZiAqY21kYnVm KTsKK2ludCBldG5hdml2X2dwdV9wbV9nZXRfc3luYyhzdHJ1Y3QgZXRuYXZpdl9ncHUgKmdwdSk7 Cit2b2lkIGV0bmF2aXZfZ3B1X3BtX3B1dChzdHJ1Y3QgZXRuYXZpdl9ncHUgKmdwdSk7CisKK2V4 dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGV0bmF2aXZfZ3B1X2RyaXZlcjsKKworI2VuZGlm IC8qIF9fRVROQVZJVl9HUFVfSF9fICovCi0tIAoyLjYuMgoKX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX18KZHJpLWRldmVsIG1haWxpbmcgbGlzdApkcmktZGV2 ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHA6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFp bG1hbi9saXN0aW5mby9kcmktZGV2ZWwK