From mboxrd@z Thu Jan 1 00:00:00 1970 From: Philipp Zabel Subject: [PATCH v2 2/5] gpu: ipu-v3: Add mem2mem image conversion support to IC Date: Wed, 18 Mar 2015 11:22:50 +0100 Message-ID: <1426674173-17088-3-git-send-email-p.zabel@pengutronix.de> References: <1426674173-17088-1-git-send-email-p.zabel@pengutronix.de> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from metis.ext.pengutronix.de (metis.ext.pengutronix.de [92.198.50.35]) by gabe.freedesktop.org (Postfix) with ESMTP id 113426E7F6 for ; Wed, 18 Mar 2015 03:23:01 -0700 (PDT) In-Reply-To: <1426674173-17088-1-git-send-email-p.zabel@pengutronix.de> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: linux-media@vger.kernel.org Cc: Mauro Carvalho Chehab , dri-devel@lists.freedesktop.org, Hans Verkuil , kernel@pengutronix.de, Steve Longerbeam , Jean-Michel Hautbois List-Id: dri-devel@lists.freedesktop.org VGhpcyBwYXRjaCBhZGRzIHN1cHBvcnQgZm9yIG1lbTJtZW0gc2NhbGluZyBhbmQgY29sb3JzcGFj ZSBjb252ZXJzaW9uCnVzaW5nIHRoZSBJQyBtb2R1bGUncyBwb3N0LXByb2Nlc3NpbmcgdGFzay4K ClNjYWxpbmcgaW1hZ2VzIGxhcmdlciB0aGFuIDEwMjR4MTAyNCBpcyBzdXBwb3J0ZWQgYnkgdGls aW5nIG92ZXIgbXVsdGlwbGUKSUMgc2NhbGluZyBydW5zLiBTaW5jZSB0aGUgSURNQUMgYW5kIElD IHVuaXRzIGhhdmUgaW50ZXJlc3RpbmcgYW5kIGRpZmZlcmVudAphbGlnbm1lbnQgbGltaXRhdGlv bnMgZm9yIGJ1ZmZlciBiYXNlIGFkZHJlc3NlcyAobGVmdCBlZGdlcykgYW5kIGJ1cnN0IHNpemUK KHJvdyBsZW5ndGhzKSwgZGVwZW5kaW5nIG9uIGlucHV0IGFuZCBvdXRwdXQgcGl4ZWwgZm9ybWF0 cywgdGhlIHRpbGUgcmVjdGFuZ2xlcwphbmQgc2NhbGluZyBjb2VmZmljaWVudHMgYXJlIGNob3Nl biB0byBtaW5pbWl6ZSBkaXN0b3J0aW9uLiBEdWUgdG8gcG9zc2libGUKb3ZlcmxhcCwgdGhlIHRp bGVzIGhhdmUgdG8gYmUgcmVuZGVyZWQgcmlnaHQgdG8gbGVmdCBhbmQgYm90dG9tIHRvIHRvcC4K VXAgdG8gNyBwaXhlbHMgKGRlcGVuZGluZyBvbiBmcmFtZSBzaXplcyBhbmQgc2NhbGluZyBmYWN0 b3IpIGhhdmUgdG8gYmUKYXZhaWxhYmxlIGFmdGVyIHRoZSBlbmQgb2YgdGhlIGZyYW1lIGlmIHRo ZSB3aWR0aCBpcyBub3QgYnVyc3Qgc2l6ZSBhbGlnbmVkLgpUaGUgdGlsaW5nIGNvZGUgaGFzIGEg cGFyYW1ldGVyIHRvIG9wdGlvbmFsbHkgcm91bmQgZnJhbWUgc2l6ZXMgdXAgb3IgZG93bgphbmQg YXZvaWQgb3ZlcmRyYXcgaW4gY29tcG9zaXRpbmcgc2NlbmFyaW9zLgoKU2lnbmVkLW9mZi1ieTog U2FzY2hhIEhhdWVyIDxzLmhhdWVyQHBlbmd1dHJvbml4LmRlPgpTaWduZWQtb2ZmLWJ5OiBMdWNh cyBTdGFjaCA8bC5zdGFjaEBwZW5ndXRyb25peC5kZT4KU2lnbmVkLW9mZi1ieTogUGhpbGlwcCBa YWJlbCA8cC56YWJlbEBwZW5ndXRyb25peC5kZT4KLS0tCkNoYW5nZXMgc2luY2UgdjE6CiAtIFJl bW92ZWQgZGVpbnRlcmxhY2VyIHN1cHBvcnQgbGVmdC1vdmVycwotLS0KIGRyaXZlcnMvZ3B1L2lw dS12My9pcHUtaWMuYyB8IDc4NyArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrLQogaW5jbHVkZS92aWRlby9pbXgtaXB1LXYzLmggIHwgIDM0ICstCiAyIGZpbGVzIGNo YW5nZWQsIDgwNCBpbnNlcnRpb25zKCspLCAxNyBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9k cml2ZXJzL2dwdS9pcHUtdjMvaXB1LWljLmMgYi9kcml2ZXJzL2dwdS9pcHUtdjMvaXB1LWljLmMK aW5kZXggYWQ3NTU4OC4uOTg0ZjY4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvaXB1LXYzL2lw dS1pYy5jCisrKyBiL2RyaXZlcnMvZ3B1L2lwdS12My9pcHUtaWMuYwpAQCAtMTUsNiArMTUsNyBA QAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4K ICNpbmNsdWRlIDxsaW51eC9iaXRyZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4K ICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUg ImlwdS1wcnYuaCIKQEAgLTk2LDYgKzk3LDE1IEBAIHN0cnVjdCBpY190YXNrX2JpdGZpZWxkcyB7 CiAJdTMyIGljX2NtYl9nYWxwaGFfYml0OwogfTsKIAorc3RydWN0IGljX3Rhc2tfY2hhbm5lbHMg eworCXU4IGluOworCXU4IG91dDsKKwl1OCByb3RfaW47CisJdTggcm90X291dDsKKwl1OCBpbl9w cmV2OworCXU4IGluX25leHQ7Cit9OworCiBzdGF0aWMgY29uc3Qgc3RydWN0IGljX3Rhc2tfcmVn b2ZmcyBpY190YXNrX3JlZ1tJQ19OVU1fVEFTS1NdID0gewogCVtJQ19UQVNLX0VOQ09ERVJdID0g ewogCQkucnNjID0gSUNfUFJQX0VOQ19SU0MsCkBAIC0xMzgsMTIgKzE0OCw1MyBAQCBzdGF0aWMg Y29uc3Qgc3RydWN0IGljX3Rhc2tfYml0ZmllbGRzIGljX3Rhc2tfYml0W0lDX05VTV9UQVNLU10g PSB7CiAJfSwKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWNfdGFza19jaGFubmVscyBpY190 YXNrX2NoW0lDX05VTV9UQVNLU10gPSB7CisJW0lDX1RBU0tfRU5DT0RFUl0gPSB7CisJCS5pbiA9 IElQVVYzX0NIQU5ORUxfTUVNX0lDX1BSUF9WRiwKKwkJLm91dCA9IElQVVYzX0NIQU5ORUxfSUNf UFJQX0VOQ19NRU0sCisJCS5yb3RfaW4gPSBJUFVWM19DSEFOTkVMX01FTV9ST1RfRU5DLAorCQku cm90X291dCA9IElQVVYzX0NIQU5ORUxfUk9UX0VOQ19NRU0sCisJfSwKKwlbSUNfVEFTS19WSUVX RklOREVSXSA9IHsKKwkJLmluID0gSVBVVjNfQ0hBTk5FTF9NRU1fVkRJX0NVUiwKKwkJLm91dCA9 IElQVVYzX0NIQU5ORUxfSUNfUFJQX1ZGX01FTSwKKwkJLnJvdF9pbiA9IElQVVYzX0NIQU5ORUxf TUVNX1JPVF9WRiwKKwkJLnJvdF9vdXQgPSBJUFVWM19DSEFOTkVMX1JPVF9WRl9NRU0sCisJCS5p bl9wcmV2ID0gSVBVVjNfQ0hBTk5FTF9NRU1fVkRJX1BSRVYsCisJCS5pbl9uZXh0ID0gSVBVVjNf Q0hBTk5FTF9NRU1fVkRJX05FWFQsCisJfSwKKwlbSUNfVEFTS19QT1NUX1BST0NFU1NPUl0gPSB7 CisJCS5pbiA9IElQVVYzX0NIQU5ORUxfTUVNX0lDX1BQLAorCQkub3V0ID0gSVBVVjNfQ0hBTk5F TF9JQ19QUF9NRU0sCisJCS5yb3RfaW4gPSBJUFVWM19DSEFOTkVMX01FTV9ST1RfUFAsCisJCS5y b3Rfb3V0ID0gSVBVVjNfQ0hBTk5FTF9ST1RfUFBfTUVNLAorCX0sCit9OworCitzdHJ1Y3QgaW1h Z2VfY29udmVydF9jdHggeworCXZvaWQgKCpjb21wbGV0ZSkodm9pZCAqY3R4LCBpbnQgZXJyKTsK Kwl2b2lkICpjb21wbGV0ZV9jb250ZXh0OworCisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXN0 cnVjdCBpcHVfaW1hZ2UgaW47CisJc3RydWN0IGlwdV9pbWFnZSBpbl9uOworCXN0cnVjdCBpcHVf aW1hZ2UgaW5fcDsKKwlzdHJ1Y3QgaXB1X2ltYWdlIG91dDsKKworCXZvaWQgKmZyZWVwOworCisJ Ym9vbCByb3RhdGU6MTsKKworCXUzMiByc2M7Cit9OworCiBzdHJ1Y3QgaXB1X2ljX3ByaXY7CiAK IHN0cnVjdCBpcHVfaWMgewogCWVudW0gaXB1X2ljX3Rhc2sgdGFzazsKIAljb25zdCBzdHJ1Y3Qg aWNfdGFza19yZWdvZmZzICpyZWc7CiAJY29uc3Qgc3RydWN0IGljX3Rhc2tfYml0ZmllbGRzICpi aXQ7CisJY29uc3Qgc3RydWN0IGljX3Rhc2tfY2hhbm5lbHMgKmNoOwogCiAJZW51bSBpcHVfY29s b3Jfc3BhY2UgaW5fY3MsIGdfaW5fY3M7CiAJZW51bSBpcHVfY29sb3Jfc3BhY2Ugb3V0X2NzOwpA QCAtMTUyLDYgKzIwMywxOSBAQCBzdHJ1Y3QgaXB1X2ljIHsKIAlib29sIGluX3VzZTsKIAogCXN0 cnVjdCBpcHVfaWNfcHJpdiAqcHJpdjsKKworCXN0cnVjdCBpcHV2M19jaGFubmVsICppbnB1dF9j aGFubmVsX3A7CisJc3RydWN0IGlwdXYzX2NoYW5uZWwgKmlucHV0X2NoYW5uZWw7CisJc3RydWN0 IGlwdXYzX2NoYW5uZWwgKmlucHV0X2NoYW5uZWxfbjsKKwlzdHJ1Y3QgaXB1djNfY2hhbm5lbCAq b3V0cHV0X2NoYW5uZWw7CisJc3RydWN0IGlwdXYzX2NoYW5uZWwgKnJvdGF0aW9uX2lucHV0X2No YW5uZWw7CisJc3RydWN0IGlwdXYzX2NoYW5uZWwgKnJvdGF0aW9uX291dHB1dF9jaGFubmVsOwor CisJc3RydWN0IGxpc3RfaGVhZCBpbWFnZV9saXN0OworCisJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1 Y3QgKndvcmtxdWV1ZTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKKwlzdHJ1Y3QgY29tcGxl dGlvbiBjb21wbGV0ZTsKIH07CiAKIHN0cnVjdCBpcHVfaWNfcHJpdiB7CkBAIC0xNjgsNyArMjMy LDggQEAgc3RhdGljIGlubGluZSB1MzIgaXB1X2ljX3JlYWQoc3RydWN0IGlwdV9pYyAqaWMsIHVu c2lnbmVkIG9mZnNldCkKIAlyZXR1cm4gcmVhZGwoaWMtPnByaXYtPmJhc2UgKyBvZmZzZXQpOwog fQogCi1zdGF0aWMgaW5saW5lIHZvaWQgaXB1X2ljX3dyaXRlKHN0cnVjdCBpcHVfaWMgKmljLCB1 MzIgdmFsdWUsIHVuc2lnbmVkIG9mZnNldCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBpcHVfaWNfd3Jp dGUoc3RydWN0IGlwdV9pYyAqaWMsIHUzMiB2YWx1ZSwKKwkJCQl1bnNpZ25lZCBvZmZzZXQpCiB7 CiAJd3JpdGVsKHZhbHVlLCBpYy0+cHJpdi0+YmFzZSArIG9mZnNldCk7CiB9CkBAIC00NDYsMzIg KzUxMSwzNSBAQCBpbnQgaXB1X2ljX3Rhc2tfaW5pdChzdHJ1Y3QgaXB1X2ljICppYywKIAkJICAg ICBpbnQgaW5fd2lkdGgsIGludCBpbl9oZWlnaHQsCiAJCSAgICAgaW50IG91dF93aWR0aCwgaW50 IG91dF9oZWlnaHQsCiAJCSAgICAgZW51bSBpcHVfY29sb3Jfc3BhY2UgaW5fY3MsCi0JCSAgICAg ZW51bSBpcHVfY29sb3Jfc3BhY2Ugb3V0X2NzKQorCQkgICAgIGVudW0gaXB1X2NvbG9yX3NwYWNl IG91dF9jcywKKwkJICAgICB1MzIgcnNjKQogewogCXN0cnVjdCBpcHVfaWNfcHJpdiAqcHJpdiA9 IGljLT5wcml2OwotCXUzMiByZWcsIGRvd25zaXplX2NvZWZmLCByZXNpemVfY29lZmY7CisJdTMy IGRvd25zaXplX2NvZWZmLCByZXNpemVfY29lZmY7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlp bnQgcmV0ID0gMDsKIAotCS8qIFNldHVwIHZlcnRpY2FsIHJlc2l6aW5nICovCi0JcmV0ID0gY2Fs Y19yZXNpemVfY29lZmZzKGljLCBpbl9oZWlnaHQsIG91dF9oZWlnaHQsCi0JCQkJICZyZXNpemVf Y29lZmYsICZkb3duc2l6ZV9jb2VmZik7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKKwlpZiAo IXJzYykgeworCQkvKiBTZXR1cCB2ZXJ0aWNhbCByZXNpemluZyAqLworCQlyZXQgPSBjYWxjX3Jl c2l6ZV9jb2VmZnMoaWMsIGluX2hlaWdodCwgb3V0X2hlaWdodCwKKwkJCQkJICZyZXNpemVfY29l ZmYsICZkb3duc2l6ZV9jb2VmZik7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OwogCi0JcmVn ID0gKGRvd25zaXplX2NvZWZmIDw8IDMwKSB8IChyZXNpemVfY29lZmYgPDwgMTYpOworCQlyc2Mg PSAoZG93bnNpemVfY29lZmYgPDwgMzApIHwgKHJlc2l6ZV9jb2VmZiA8PCAxNik7CiAKLQkvKiBT ZXR1cCBob3Jpem9udGFsIHJlc2l6aW5nICovCi0JcmV0ID0gY2FsY19yZXNpemVfY29lZmZzKGlj LCBpbl93aWR0aCwgb3V0X3dpZHRoLAotCQkJCSAmcmVzaXplX2NvZWZmLCAmZG93bnNpemVfY29l ZmYpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7CisJCS8qIFNldHVwIGhvcml6b250YWwgcmVz aXppbmcgKi8KKwkJcmV0ID0gY2FsY19yZXNpemVfY29lZmZzKGljLCBpbl93aWR0aCwgb3V0X3dp ZHRoLAorCQkJCQkgJnJlc2l6ZV9jb2VmZiwgJmRvd25zaXplX2NvZWZmKTsKKwkJaWYgKHJldCkK KwkJCXJldHVybiByZXQ7CiAKLQlyZWcgfD0gKGRvd25zaXplX2NvZWZmIDw8IDE0KSB8IHJlc2l6 ZV9jb2VmZjsKKwkJcnNjIHw9IChkb3duc2l6ZV9jb2VmZiA8PCAxNCkgfCByZXNpemVfY29lZmY7 CisJfQogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAotCWlwdV9p Y193cml0ZShpYywgcmVnLCBpYy0+cmVnLT5yc2MpOworCWlwdV9pY193cml0ZShpYywgcnNjLCBp Yy0+cmVnLT5yc2MpOwogCiAJLyogU2V0dXAgY29sb3Igc3BhY2UgY29udmVyc2lvbiAqLwogCWlj LT5pbl9jcyA9IGluX2NzOwpAQCAtNjI5LDYgKzY5Nyw2NzUgQEAgdW5sb2NrOgogfQogRVhQT1JU X1NZTUJPTF9HUEwoaXB1X2ljX3Rhc2tfaWRtYV9pbml0KTsKIAorc3RhdGljIHN0cnVjdCBpbWFn ZV9jb252ZXJ0X2N0eCAqaXB1X2ltYWdlX2NvbnZlcnRfbmV4dChzdHJ1Y3QgaXB1X2ljICppYykK K3sKKwlzdHJ1Y3QgaXB1X2ljX3ByaXYgKnByaXYgPSBpYy0+cHJpdjsKKwlzdHJ1Y3QgaXB1djNf Y2hhbm5lbCAqY2hfaW4gPSBpYy0+aW5wdXRfY2hhbm5lbDsKKwlzdHJ1Y3QgaXB1djNfY2hhbm5l bCAqY2hfb3V0ID0gaWMtPm91dHB1dF9jaGFubmVsOworCXN0cnVjdCBpbWFnZV9jb252ZXJ0X2N0 eCAqY3R4OworCXN0cnVjdCBpcHVfaW1hZ2UgKmluX3AsICppbiwgKmluX247CisJc3RydWN0IGlw dV9pbWFnZSAqb3V0OworCWludCByZXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25l ZCBpbnQgaW5idXJzdCwgb3V0YnVyc3Q7CisJdW5zaWduZWQgaW50IGluX2hlaWdodDsKKworCXNw aW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CisKKwlpZiAobGlzdF9lbXB0eSgm aWMtPmltYWdlX2xpc3QpKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ss IGZsYWdzKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJY3R4ID0gbGlzdF9maXJzdF9lbnRyeSgm aWMtPmltYWdlX2xpc3QsIHN0cnVjdCBpbWFnZV9jb252ZXJ0X2N0eCwgbGlzdCk7CisKKwlsaXN0 X2RlbCgmY3R4LT5saXN0KTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ss IGZsYWdzKTsKKworCWluX3AgPSAmY3R4LT5pbl9wOworCWluID0gJmN0eC0+aW47CisJaW5fbiA9 ICZjdHgtPmluX247CisJb3V0ID0gJmN0eC0+b3V0OworCisJaXB1X2NwbWVtX3plcm8oY2hfaW4p OworCWlwdV9jcG1lbV96ZXJvKGNoX291dCk7CisKKwlpbmJ1cnN0ID0gaW4tPnJlY3Qud2lkdGgg JiAweGYgPyA4IDogMTY7CisJb3V0YnVyc3QgPSBvdXQtPnJlY3Qud2lkdGggJiAweGYgPyA4IDog MTY7CisKKwlpcHVfaWNfZW5hYmxlKGljKTsKKworCWlwdV9pY190YXNrX2lkbWFfaW5pdChpYywg aWMtPmlucHV0X2NoYW5uZWwsIGluLT5yZWN0LndpZHRoLAorCQkJICAgICAgaW4tPnJlY3QuaGVp Z2h0LCBpbmJ1cnN0LCBJUFVfUk9UQVRFX05PTkUpOworCWlwdV9pY190YXNrX2lkbWFfaW5pdChp YywgaWMtPm91dHB1dF9jaGFubmVsLCBvdXQtPnJlY3Qud2lkdGgsCisJCQkgICAgICBvdXQtPnJl Y3QuaGVpZ2h0LCBvdXRidXJzdCwgSVBVX1JPVEFURV9OT05FKTsKKworCWlwdV9jcG1lbV9zZXRf aW1hZ2UoY2hfaW4sICZjdHgtPmluKTsKKwlpcHVfY3BtZW1fc2V0X2ltYWdlKGNoX291dCwgJmN0 eC0+b3V0KTsKKworCWlwdV9jcG1lbV9zZXRfYnVyc3RzaXplKGNoX2luLCBpbmJ1cnN0KTsKKwlp cHVfY3BtZW1fc2V0X2J1cnN0c2l6ZShjaF9vdXQsIG91dGJ1cnN0KTsKKworCWluX2hlaWdodCA9 IGluLT5yZWN0LmhlaWdodDsKKworCWRldl9kYmcocHJpdi0+aXB1LT5kZXYsICIlczogJWR4JWQo JWR4JWRAJWQsJWQpIC0+ICVkeCVkKCVkeCVkQCVkLCVkKVxuIiwKKwkJX19mdW5jX18sIGluLT5w aXgud2lkdGgsIGluLT5waXguaGVpZ2h0LAorCQlpbi0+cmVjdC53aWR0aCwgaW4tPnJlY3QuaGVp Z2h0LCBpbi0+cmVjdC5sZWZ0LCBpbi0+cmVjdC50b3AsCisJCW91dC0+cGl4LndpZHRoLCBvdXQt PnBpeC5oZWlnaHQsCisJCW91dC0+cmVjdC53aWR0aCwgb3V0LT5yZWN0LmhlaWdodCwKKwkJb3V0 LT5yZWN0LmxlZnQsIG91dC0+cmVjdC50b3ApOworCisJZGV2X2RiZyhwcml2LT5pcHUtPmRldiwK KwkJIiVzOiBoc2NhbGU6ID4+JWQsICo4MTkyLyVkIHZzY2FsZTogPj4lZCwgKjgxOTIvJWRcbiIs CisJCV9fZnVuY19fLCAoY3R4LT5yc2MgPj4gMTQpICYgMHgzLCAoY3R4LT5yc2MgJiAweDNmZmYp LAorCQljdHgtPnJzYyA+PiAzMCwgKGN0eC0+cnNjID4+IDE2KSAmIDB4M2ZmZik7CisKKwlyZXQg PSBpcHVfaWNfdGFza19pbml0KGljLCBpbi0+cmVjdC53aWR0aCwgaW5faGVpZ2h0LAorCQkJb3V0 LT5yZWN0LndpZHRoLCBvdXQtPnJlY3QuaGVpZ2h0LAorCQkJaXB1X3BpeGVsZm9ybWF0X3RvX2Nv bG9yc3BhY2UoaW4tPnBpeC5waXhlbGZvcm1hdCksCisJCQlpcHVfcGl4ZWxmb3JtYXRfdG9fY29s b3JzcGFjZShvdXQtPnBpeC5waXhlbGZvcm1hdCksCisJCQljdHgtPnJzYyk7CisJaWYgKHJldCkg eworCQlpcHVfaWNfZGlzYWJsZShpYyk7CisJCXJldHVybiBFUlJfUFRSKHJldCk7CisJfQorCisJ aXB1X2lkbWFjX2VuYWJsZV9jaGFubmVsKGljLT5pbnB1dF9jaGFubmVsKTsKKwlpcHVfaWRtYWNf ZW5hYmxlX2NoYW5uZWwoaWMtPm91dHB1dF9jaGFubmVsKTsKKworCWlwdV9pY190YXNrX2VuYWJs ZShpYyk7CisKKwlpcHVfaWRtYWNfc2VsZWN0X2J1ZmZlcihpYy0+aW5wdXRfY2hhbm5lbCwgMCk7 CisJaXB1X2lkbWFjX3NlbGVjdF9idWZmZXIoaWMtPm91dHB1dF9jaGFubmVsLCAwKTsKKworCXJl dHVybiBjdHg7Cit9CisKK3N0YXRpYyB2b2lkIGlwdV9pbWFnZV9jb252ZXJ0X3dvcmsoc3RydWN0 IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBpcHVfaWMgKmljID0gY29udGFpbmVyX29m KHdvcmssIHN0cnVjdCBpcHVfaWMsIHdvcmspOworCXN0cnVjdCBpbWFnZV9jb252ZXJ0X2N0eCAq Y3R4OworCWludCByZXQ7CisKKwl3aGlsZSAoMSkgeworCQlpbnQgdGFza19lcnJvciA9IDA7CisK KwkJY3R4ID0gaXB1X2ltYWdlX2NvbnZlcnRfbmV4dChpYyk7CisJCWlmICghY3R4KQorCQkJcmV0 dXJuOworCisJCWlmIChJU19FUlIoY3R4KSkgeworCQkJdGFza19lcnJvciA9IFBUUl9FUlIoY3R4 KTsKKwkJfSBlbHNlIHsKKwkJCXJldCA9IHdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJs ZV90aW1lb3V0KAorCQkJCQkJJmljLT5jb21wbGV0ZSwgMTAwICogSFopOworCQkJaWYgKCFyZXQp CisJCQkJdGFza19lcnJvciA9IC1FVElNRURPVVQ7CisJCX0KKworCQlpcHVfaWNfdGFza19kaXNh YmxlKGljKTsKKwkJaXB1X2ljX2Rpc2FibGUoaWMpOworCisJCWlmIChjdHgtPmNvbXBsZXRlKQor CQkJY3R4LT5jb21wbGV0ZShjdHgtPmNvbXBsZXRlX2NvbnRleHQsIHRhc2tfZXJyb3IpOworCQlr ZnJlZShjdHgtPmZyZWVwKTsKKwl9Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBpcHVfaW1hZ2Vf Y29udmVydF9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmNvbnRleHQpCit7CisJc3RydWN0IGlwdV9p YyAqaWMgPSBjb250ZXh0OworCisJY29tcGxldGUoJmljLT5jb21wbGV0ZSk7CisKKwlyZXR1cm4g SVJRX0hBTkRMRUQ7Cit9CisKKworLyoKKyAqIElETUFDIGJhc2UgYWRkcmVzc2VzIGFyZSA4LWJ5 dGUgYWxpZ25lZAorICovCitzdGF0aWMgaW50IGlwdV9pbWFnZV9oYWxpZ24odTMyIHBpeGZtdCkK K3sKKwlzd2l0Y2ggKHBpeGZtdCkgeworCS8qIDIgUkdCMzIgcGl4ZWxzIGNvcnJlc3BvbmQgdG8g OCBieXRlcyAqLworCWNhc2UgVjRMMl9QSVhfRk1UX1JHQjMyOgorCWNhc2UgVjRMMl9QSVhfRk1U X0JHUjMyOgorCQlyZXR1cm4gMjsKKwkvKiA0IFJHQjU2NSBvciBZVVlWIHBpeGVscyBjb3JyZXNw b25kIHRvIDggYnl0ZXMgKi8KKwljYXNlIFY0TDJfUElYX0ZNVF9SR0I1NjU6CisJY2FzZSBWNEwy X1BJWF9GTVRfVVlWWToKKwljYXNlIFY0TDJfUElYX0ZNVF9ZVVlWOgorCQlyZXR1cm4gNDsKKwkv KgorCSAqIDggUkdCMjQgcGl4ZWxzIGNvcnJlc3BvbmQgdG8gMjQgYnl0ZXMsCisJICogOCBOVjEy IHBpeGVscyBjb3JyZXNwb25kIHRvIDggYnl0ZXMsIGJvdGggaW4gbHVtYSBhbmQgY2hyb21hCisJ ICovCisJY2FzZSBWNEwyX1BJWF9GTVRfUkdCMjQ6CisJY2FzZSBWNEwyX1BJWF9GTVRfQkdSMjQ6 CisJY2FzZSBWNEwyX1BJWF9GTVRfTlYxMjoKKwkJcmV0dXJuIDg7CisJLyogMTYgWVVWNDIwIHBp eGVscyBjb3JyZXNwb25kIHRvIDE2IGJ5dGVzIGluIGx1bWEsIDggYnl0ZXMgaW4gY2hyb21hICov CisJY2FzZSBWNEwyX1BJWF9GTVRfWVVWNDIwOgorCWNhc2UgVjRMMl9QSVhfRk1UX1lWVTQyMDoK KwljYXNlIFY0TDJfUElYX0ZNVF9ZVVY0MjJQOgorCQlyZXR1cm4gMTY7CisJZGVmYXVsdDoKKwkJ cmV0dXJuIC1FSU5WQUw7CisJfQorfQorCisvKgorICogVmVydGljYWxseSBjaHJvbWEtc3Vic2Ft cGxlZCBmb3JtYXRzIGFyZSBsaW1pdGVkIHRvIGV2ZW4gaGVpZ2h0cyBhbmQgdmVydGljYWwKKyAq IHBvc2l0aW9ucworICovCitzdGF0aWMgaW50IGlwdV9pbWFnZV92YWxpZ24odTMyIHBpeGZtdCkK K3sKKwlzd2l0Y2ggKHBpeGZtdCkgeworCWNhc2UgVjRMMl9QSVhfRk1UX1JHQjI0OgorCWNhc2Ug VjRMMl9QSVhfRk1UX0JHUjI0OgorCWNhc2UgVjRMMl9QSVhfRk1UX1JHQjMyOgorCWNhc2UgVjRM Ml9QSVhfRk1UX0JHUjMyOgorCWNhc2UgVjRMMl9QSVhfRk1UX1JHQjU2NToKKwljYXNlIFY0TDJf UElYX0ZNVF9VWVZZOgorCWNhc2UgVjRMMl9QSVhfRk1UX1lVWVY6CisJY2FzZSBWNEwyX1BJWF9G TVRfWVVWNDIyUDoKKwkJcmV0dXJuIDE7CisJY2FzZSBWNEwyX1BJWF9GTVRfTlYxMjoKKwljYXNl IFY0TDJfUElYX0ZNVF9ZVVY0MjA6CisJY2FzZSBWNEwyX1BJWF9GTVRfWVZVNDIwOgorCQlyZXR1 cm4gMjsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisKKyNkZWZpbmUgcm91 bmRfY2xvc2VzdCh4LCB5KSByb3VuZF9kb3duKCh4KSArICh5KS8yLCAoeSkpCisKK3N0cnVjdCBp bWFnZV9jb252ZXJ0X2N0eCAqaXB1X2ltYWdlX2NvbnZlcnRfcHJlcGFyZShzdHJ1Y3QgaXB1X3Nv YyAqaXB1LAorCQlzdHJ1Y3QgaXB1X2ltYWdlICppbiwgc3RydWN0IGlwdV9pbWFnZSAqb3V0LAor CQllbnVtIGlwdV9pbWFnZV9zY2FsZV9jdHJsIGN0cmwsIGludCAqbnVtX3RpbGVzKQoreworCXN0 cnVjdCBpbWFnZV9jb252ZXJ0X2N0eCAqY3R4LCAqYzsKKwlpbnQgaHRpbGVzLCB2dGlsZXM7CisJ aW50IGluX3ZhbGlnbiwgaW5faGFsaWduLCBpbl9idXJzdCwgb3V0X3ZhbGlnbiwgb3V0X2hhbGln biwgb3V0X2J1cnN0OworCWludCBsZWZ0LCB0b3A7CisJaW50IHgsIHk7CisJaW50IGhfcmVzaXpl X29wdCwgdl9yZXNpemVfb3B0OworCXUzMiB2X2Rvd25zaXplX2NvZWZmID0gMCwgaF9kb3duc2l6 ZV9jb2VmZiA9IDA7CisJdTMyIHZfcmVzaXplX2NvZWZmLCBoX3Jlc2l6ZV9jb2VmZjsKKworCS8q IHZhbGlkYXRlIGlucHV0ICovCisJaWYgKGluLT5yZWN0LndpZHRoIDwgMTYgfHwgb3V0LT5yZWN0 LndpZHRoIDwgMTYgfHwKKwkgICAgKGluLT5yZWN0LndpZHRoIC8gOCkgPiBvdXQtPnJlY3Qud2lk dGgpCisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCisJLyogdGlsZSBzZXR1cCAqLworCWh0 aWxlcyA9IERJVl9ST1VORF9VUChvdXQtPnJlY3Qud2lkdGgsIDEwMjQpOworCXZ0aWxlcyA9IERJ Vl9ST1VORF9VUChvdXQtPnJlY3QuaGVpZ2h0LCAxMDI0KTsKKworCWluX3ZhbGlnbiA9IGlwdV9p bWFnZV92YWxpZ24oaW4tPnBpeC5waXhlbGZvcm1hdCk7CisJaW5faGFsaWduID0gaXB1X2ltYWdl X2hhbGlnbihpbi0+cGl4LnBpeGVsZm9ybWF0KTsKKwlvdXRfdmFsaWduID0gaXB1X2ltYWdlX3Zh bGlnbihvdXQtPnBpeC5waXhlbGZvcm1hdCk7CisJb3V0X2hhbGlnbiA9IGlwdV9pbWFnZV9oYWxp Z24ob3V0LT5waXgucGl4ZWxmb3JtYXQpOworCisJLyogSUMgYnVyc3RzIGFyZSBsaW1pdGVkIHRv IGVpdGhlciA4IG9yIDE2IHBpeGVscyAqLworCWluX2J1cnN0ID0gODsKKwlvdXRfYnVyc3QgPSA4 OworCisJaWYgKGluX3ZhbGlnbiA8IDAgfHwgaW5faGFsaWduIDwgMCB8fAorCSAgICBvdXRfdmFs aWduIDwgMCB8fCBvdXRfaGFsaWduIDwgMCkgeworCQlkZXZfZXJyKGlwdS0+ZGV2LCAidW5zdXBw b3J0ZWQgaW4vb3V0IGZvcm1hdFxuIik7CisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCX0K KworCS8qIGNvbXB1dGUgc3RhdGljIGRlY2ltYXRvciBjb2VmZmljaWVudHMgKi8KKwl3aGlsZSAo KGluLT5yZWN0LndpZHRoID4+IGhfZG93bnNpemVfY29lZmYpID4gb3V0LT5yZWN0LndpZHRoKQor CQloX2Rvd25zaXplX2NvZWZmKys7CisJd2hpbGUgKChpbi0+cmVjdC5oZWlnaHQgPj4gdl9kb3du c2l6ZV9jb2VmZikgPiBvdXQtPnJlY3QuaGVpZ2h0KQorCQl2X2Rvd25zaXplX2NvZWZmKys7CisK KwkvKiBtb3ZlIGFuZCBjcm9wIHRoZSBvdXRwdXQgaW1hZ2UgYWNjb3JkaW5nIHRvIElETUFDIGxp bWl0YXRpb25zICovCisJc3dpdGNoIChjdHJsKSB7CisJY2FzZSBJUFVfSU1BR0VfU0NBTEVfUk9V TkRfRE9XTjoKKwkJbGVmdCA9IHJvdW5kX3VwKGluLT5yZWN0LmxlZnQsIGluX2hhbGlnbik7CisJ CXRvcCA9IHJvdW5kX3VwKGluLT5yZWN0LnRvcCwgaW5fdmFsaWduKTsKKwkJaW4tPnJlY3Qud2lk dGggPSBpbi0+cmVjdC53aWR0aCAtIChsZWZ0IC0gaW4tPnJlY3QubGVmdCk7CisJCWluLT5yZWN0 LmhlaWdodCA9IGluLT5yZWN0LmhlaWdodCAtICh0b3AgLSBpbi0+cmVjdC50b3ApOworCQlpbi0+ cmVjdC5sZWZ0ID0gbGVmdDsKKwkJaW4tPnJlY3QudG9wID0gdG9wOworCQlsZWZ0ID0gcm91bmRf dXAob3V0LT5yZWN0LmxlZnQsIG91dF9oYWxpZ24pOworCQl0b3AgPSByb3VuZF91cChvdXQtPnJl Y3QudG9wLCBvdXRfdmFsaWduKTsKKwkJb3V0LT5yZWN0LndpZHRoID0gcm91bmRfZG93bihvdXQt PnJlY3Qud2lkdGggLSAobGVmdCAtCisJCQkJCSAgICAgb3V0LT5yZWN0LmxlZnQpLCBvdXRfYnVy c3QpOworCQlvdXQtPnJlY3QuaGVpZ2h0ID0gcm91bmRfZG93bihvdXQtPnJlY3QuaGVpZ2h0IC0g KHRvcCAtCisJCQkJCSAgICAgIG91dC0+cmVjdC50b3ApLCBvdXRfdmFsaWduKTsKKwkJYnJlYWs7 CisJY2FzZSBJUFVfSU1BR0VfU0NBTEVfUk9VTkRfVVA6CisJCWxlZnQgPSByb3VuZF9kb3duKGlu LT5yZWN0LmxlZnQsIGluX2hhbGlnbik7CisJCXRvcCA9IHJvdW5kX2Rvd24oaW4tPnJlY3QudG9w LCBpbl92YWxpZ24pOworCQlpbi0+cmVjdC53aWR0aCA9IGluLT5yZWN0LndpZHRoICsgaW4tPnJl Y3QubGVmdCAtIGxlZnQ7CisJCWluLT5yZWN0LmhlaWdodCA9IGluLT5yZWN0LmhlaWdodCArIGlu LT5yZWN0LnRvcCAtIHRvcDsKKwkJaW4tPnJlY3QubGVmdCA9IGxlZnQ7CisJCWluLT5yZWN0LnRv cCA9IHRvcDsKKwkJbGVmdCA9IHJvdW5kX2Rvd24ob3V0LT5yZWN0LmxlZnQsIG91dF9oYWxpZ24p OworCQl0b3AgPSByb3VuZF9kb3duKG91dC0+cmVjdC50b3AsIG91dF92YWxpZ24pOworCQlvdXQt PnJlY3Qud2lkdGggPSByb3VuZF91cChvdXQtPnJlY3Qud2lkdGggKyBvdXQtPnJlY3QubGVmdCAt CisJCQkJCSAgIGxlZnQsIG91dF9idXJzdCk7CisJCW91dC0+cmVjdC5oZWlnaHQgPSByb3VuZF91 cChvdXQtPnJlY3QuaGVpZ2h0ICsgb3V0LT5yZWN0LnRvcCAtCisJCQkJCSAgICB0b3AsIG91dF92 YWxpZ24pOworCQlicmVhazsKKwljYXNlIElQVV9JTUFHRV9TQ0FMRV9QSVhFTFBFUkZFQ1Q6CisJ CWxlZnQgPSByb3VuZF9kb3duKGluLT5yZWN0LmxlZnQsIGluX2hhbGlnbik7CisJCXRvcCA9IHJv dW5kX2Rvd24oaW4tPnJlY3QudG9wLCBpbl92YWxpZ24pOworCQlpbi0+cmVjdC53aWR0aCA9IGlu LT5yZWN0LndpZHRoICsgaW4tPnJlY3QubGVmdCAtIGxlZnQ7CisJCWluLT5yZWN0LmhlaWdodCA9 IGluLT5yZWN0LmhlaWdodCArIGluLT5yZWN0LnRvcCAtIHRvcDsKKwkJaW4tPnJlY3QubGVmdCA9 IGxlZnQ7CisJCWluLT5yZWN0LnRvcCA9IHRvcDsKKwkJbGVmdCA9IHJvdW5kX2Rvd24ob3V0LT5y ZWN0LmxlZnQgKyBvdXRfaGFsaWduIC8gMiwgb3V0X2hhbGlnbik7CisJCXRvcCA9IHJvdW5kX2Rv d24ob3V0LT5yZWN0LnRvcCArIG91dF92YWxpZ24gLyAyLCBvdXRfdmFsaWduKTsKKwkJLyoKKwkJ ICogZG9uJ3Qgcm91bmQgd2lkdGggYW5kIGhlaWdodCB0byBidXJzdCBzaXplIC8gcGl4ZWwgZm9y bWF0CisJCSAqIGxpbWl0YXRpb25zIHlldCwgd2UgZG8gaXQgYWZ0ZXIgZGV0ZXJtaW5pbmcgdGhl IHNjYWxpbmcKKwkJICogY29lZmZpY2llbnRzCisJCSAqLworCQlvdXQtPnJlY3Qud2lkdGggPSBv dXQtPnJlY3Qud2lkdGggKyBvdXQtPnJlY3QubGVmdCAtIGxlZnQ7CisJCW91dC0+cmVjdC5oZWln aHQgPSBvdXQtPnJlY3QuaGVpZ2h0ICsgb3V0LT5yZWN0LnRvcCAtIHRvcDsKKwkJYnJlYWs7CisJ ZGVmYXVsdDoKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJfQorCW91dC0+cmVjdC5sZWZ0 ID0gbGVmdDsKKwlvdXQtPnJlY3QudG9wID0gdG9wOworCisJLyogUm91bmQgaW5wdXQgd2lkdGgg YW5kIGhlaWdodCBhY2NvcmRpbmcgdG8gZGVjaW1hdGlvbiAqLworCWluLT5yZWN0LndpZHRoID0g cm91bmRfZG93bihpbi0+cmVjdC53aWR0aCwgMSA8PCBoX2Rvd25zaXplX2NvZWZmKTsKKwlpbi0+ cmVjdC5oZWlnaHQgPSByb3VuZF9kb3duKGluLT5yZWN0LmhlaWdodCwgMSA8PCB2X2Rvd25zaXpl X2NvZWZmKTsKKworCWRldl9kYmcoaXB1LT5kZXYsCisJCSIlczogaW46ICVkeCVkKCVkeCVkQCVk LCVkKSAtPiBvdXQ6ICVkeCVkKCVkeCVkQCVkLCVkKVxuIiwKKwkJX19mdW5jX18sIGluLT5waXgu d2lkdGgsIGluLT5waXguaGVpZ2h0LCBpbi0+cmVjdC53aWR0aCwKKwkJaW4tPnJlY3QuaGVpZ2h0 LCBpbi0+cmVjdC5sZWZ0LCBpbi0+cmVjdC50b3AsIG91dC0+cGl4LndpZHRoLAorCQlvdXQtPnBp eC5oZWlnaHQsIG91dC0+cmVjdC53aWR0aCwgb3V0LT5yZWN0LmhlaWdodCwKKwkJb3V0LT5yZWN0 LmxlZnQsIG91dC0+cmVjdC50b3ApOworCisJLyoKKwkgKiBDb21wdXRlIHRoZSBiaWxpbmVhciBy ZXNpemluZyBjb2VmZmljaWVudHMgdGhhdCBjYW4vY291bGQgYmUgdXNlZCBpZgorCSAqIHNjYWxp bmcgdXNpbmcgYSBzaW5nbGUgdGlsZS4gVGhlIGJvdHRvbSByaWdodCBwaXhlbCBzaG91bGQgc2Ft cGxlIHRoZQorCSAqIGlucHV0IGFzIGNsb3NlIGFzIHBvc3NpYmxlIHRvIGJ1dCBub3QgYmV5b25k IHRoZSBib3R0b20gcmlnaHQgaW5wdXQKKwkgKiBwaXhlbCBvdXQgb2YgdGhlIGRlY2ltYXRvcjoK KwkgKgorCSAqIChvdXQtPnJlY3Qud2lkdGggLSAxKSAqIGhfcmVzaXplIC8gODE5Mi4wIDw9IChp bi0+cmVjdC53aWR0aCA+PgorCSAqCQkJCQkJIGhfZG93bnNpemVfY29lZmYpIC0gMQorCSAqIChv dXQtPnJlY3QuaGVpZ2h0IC0gMSkgKiB2X3Jlc2l6ZSAvIDgxOTIuMCA8PSAoaW4tPnJlY3QuaGVp Z2h0ID4+CisJICoJCQkJCQkgIHZfZG93bnNpemVfY29lZmYpIC0gMQorCSAqLworCWhfcmVzaXpl X29wdCA9IDgxOTIgKiAoKGluLT5yZWN0LndpZHRoID4+IGhfZG93bnNpemVfY29lZmYpIC0gMSkg LworCQkgICAgICAgKG91dC0+cmVjdC53aWR0aCAtIDEpOworCXZfcmVzaXplX29wdCA9IDgxOTIg KiAoKGluLT5yZWN0LmhlaWdodCA+PiB2X2Rvd25zaXplX2NvZWZmKSAtIDEpIC8KKwkJICAgICAg IChvdXQtPnJlY3QuaGVpZ2h0IC0gMSk7CisKKwlkZXZfZGJnKGlwdS0+ZGV2LAorCQkiJXM6IGhz Y2FsZTogPj4lZCwgKjgxOTIvJWQgdnNjYWxlOiA+PiVkLCAqODE5Mi8lZCwgJWR4JWQgdGlsZXNc biIsCisJCV9fZnVuY19fLCBoX2Rvd25zaXplX2NvZWZmLCBoX3Jlc2l6ZV9vcHQsIHZfZG93bnNp emVfY29lZmYsCisJCXZfcmVzaXplX29wdCwgaHRpbGVzLCB2dGlsZXMpOworCisJY3R4ID0ga2Nh bGxvYyhodGlsZXMgKiB2dGlsZXMsIHNpemVvZigqY3R4KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFj dHgpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJYyA9IGN0eDsKKworCWZvciAoeCA9 IGh0aWxlcyAtIDE7IHggPj0gMDsgeC0tKSB7CisJCWludCBpbl9yaWdodCwgb3V0X3JpZ2h0Owor CisJCS8qCisJCSAqIFNpbmNlIHdlIHJlbmRlciB0aWxlcyByaWdodCB0byBsZWZ0LCB0aGUgcmln aHQgZWRnZQorCQkgKiBpcyBhbHJlYWR5IGtub3duLiBEZXBlbmRpbmcgb24gdGlsZSBwb3NpdGlv biBhbmQKKwkJICogc2NhbGluZyBtb2RlLCB3ZSBtYXkgb3ZlcnNob290IGl0LgorCQkgKi8KKwkJ aWYgKHggPT0gaHRpbGVzIC0gMSkgeworCQkJb3V0X3JpZ2h0ID0gb3V0LT5yZWN0LmxlZnQgKyBv dXQtPnJlY3Qud2lkdGg7CisJCQlpbl9yaWdodCA9IGluLT5yZWN0LmxlZnQgKyBpbi0+cmVjdC53 aWR0aDsKKwkJfSBlbHNlIHsKKwkJCXN0cnVjdCBpbWFnZV9jb252ZXJ0X2N0eCAqY19yaWdodCA9 IGMgLSB2dGlsZXM7CisKKwkJCW91dF9yaWdodCA9IGNfcmlnaHQtPm91dC5yZWN0LmxlZnQ7CisJ CQlpbl9yaWdodCA9IGNfcmlnaHQtPmluLnJlY3QubGVmdDsKKwkJfQorCisJCS8qIE5vdyBkZXRl cm1pbmUgdGhlIGxlZnQgZWRnZSBvZiB0aGlzIHRpbGUgY29sdW1uICovCisJCWlmICh4ID09IDAp IHsKKwkJCS8qIEZvciB0aGUgbGVmdG1vc3QgY29sdW1uIHRoaXMgaXMgdHJpdmlhbCAqLworCQkJ Yy0+b3V0LnJlY3QubGVmdCA9IG91dC0+cmVjdC5sZWZ0OworCQkJYy0+aW4ucmVjdC5sZWZ0ID0g aW4tPnJlY3QubGVmdDsKKwkJfSBlbHNlIHsKKwkJCWludCBiZXN0X2xlZnQsIGJlc3RfaW5fbGVm dDsKKwkJCWludCBtaW5fbGVmdCwgbWF4X2xlZnQ7CisJCQlpbnQgbWluX2RpZmYgPSBJTlRfTUFY OworCisJCQkvKgorCQkJICogRmluZCB0aGUgYmVzdCBwb3NzaWJsZSBsZWZ0IGVkZ2UuIEl0IG11 c3QgYmUgYWRqdXN0ZWQKKwkJCSAqIGFjY29yZGluZyB0byBJRE1BQyBsaW1pdGF0aW9ucywgYW5k IHNob3VsZCBiZQorCQkJICogY2hvc2VuIHNvIHRoYXQKKwkJCSAqIChpbi0+cmVjdC5sZWZ0ICsg KGMtPm91dC5yZWN0LmxlZnQgLSBvdXQtPnJlY3QubGVmdCkKKwkJCSAqICAqIGhfcmVzaXplX29w dCAvICg4MTkyID4+IGhfZG93bnNpemVfY29lZmYpKQorCQkJICogaXMgYXMgY2xvc2UgYXMgcG9z c2libGUgdG8gYSB2YWxpZCBsZWZ0IGVkZ2UgaW4gdGhlCisJCQkgKiBpbnB1dC4KKwkJCSAqLwor CQkJbWluX2xlZnQgPSBtYXgoMCwKKwkJCQkgICAgICAgcm91bmRfdXAob3V0X3JpZ2h0IC0gMTAy NCwgb3V0X2hhbGlnbikpOworCQkJbWF4X2xlZnQgPSBtaW4ocm91bmRfZG93bihvdXRfcmlnaHQs IG91dF9oYWxpZ24pLAorCQkJCSAgICAgICB4ICogMTAyNCk7CisJCQliZXN0X2xlZnQgPSBtaW5f bGVmdDsKKwkJCWJlc3RfaW5fbGVmdCA9IChiZXN0X2xlZnQgLSBvdXQtPnJlY3QubGVmdCkgKgor CQkJCSAgICAgICBoX3Jlc2l6ZV9vcHQ7CisJCQlmb3IgKGxlZnQgPSBtaW5fbGVmdDsgbGVmdCA8 IG1heF9sZWZ0OworCQkJICAgICBsZWZ0ICs9IG91dF9oYWxpZ24pIHsKKwkJCQlpbnQgZGlmZiwg aW5fbGVmdDsKKworCQkJCS8qCisJCQkJICogSW4gUk9VTkRfVVAgYW5kIFJPVU5EX0RPV04gbW9k ZXMsIGZvciB0aGUKKwkJCQkgKiByaWdodG1vc3QgY29sdW1uLCBvbmx5IGNvbnNpZGVyIGxlZnQg ZWRnZXMKKwkJCQkgKiB0aGF0IGFyZSBhIG11bHRpcGxlIG9mIHRoZSBidXJzdCBzaXplIGF3YXkK KwkJCQkgKiBmcm9tIHRoZSByaWdodCBlZGdlLgorCQkJCSAqLworCQkJCWlmICgoY3RybCAhPSBJ UFVfSU1BR0VfU0NBTEVfUElYRUxQRVJGRUNUKSAmJgorCQkJCSAgICAoeCA9PSBodGlsZXMgLSAx KSAmJgorCQkJCSAgICAoKG91dF9yaWdodCAtIGxlZnQpICUgb3V0X2J1cnN0KSkKKwkJCQkJY29u dGludWU7CisJCQkJaW5fbGVmdCA9IGluLT5yZWN0LmxlZnQgKworCQkJCQkgICgoKGxlZnQgLSBv dXQtPnJlY3QubGVmdCkgKgorCQkJCQkgICAgaF9yZXNpemVfb3B0KSA8PCBoX2Rvd25zaXplX2Nv ZWZmKTsKKwkJCQlkaWZmID0gYWJzKGluX2xlZnQgLQorCQkJCQkgICByb3VuZF9jbG9zZXN0KGlu X2xlZnQsCisJCQkJCQkJIDgxOTIgKiBpbl9oYWxpZ24pKTsKKworCQkJCWlmIChkaWZmIDwgbWlu X2RpZmYpIHsKKwkJCQkJbWluX2RpZmYgPSBkaWZmOworCQkJCQliZXN0X2xlZnQgPSBsZWZ0Owor CQkJCQliZXN0X2luX2xlZnQgPSBpbl9sZWZ0OworCQkJCX0KKwkJCX0KKworCQkJYy0+b3V0LnJl Y3QubGVmdCA9IGJlc3RfbGVmdDsKKwkJCWMtPmluLnJlY3QubGVmdCA9IERJVl9ST1VORF9DTE9T RVNUKGJlc3RfaW5fbGVmdCwgODE5Mik7CisKKwkJCWRldl9kYmcoaXB1LT5kZXYsCisJCQkJIiVz OiB0aWxlKCVkLHkpOlx0bGVmdDogJWQgLT4gJWQgKGluc3RlYWQgb2YgJWQuJTA0ZCAtPiAlZCki LAorCQkJCV9fZnVuY19fLCB4LCBjLT5pbi5yZWN0LmxlZnQsCisJCQkJYy0+b3V0LnJlY3QubGVm dCwgYmVzdF9pbl9sZWZ0IC8gODE5MiwKKwkJCQkoYmVzdF9pbl9sZWZ0ICUgODE5MikgKiAxMDAw MCAvIDgxOTIsCisJCQkJb3V0LT5yZWN0LmxlZnQgKworCQkJCURJVl9ST1VORF9DTE9TRVNUKChj LT5pbi5yZWN0LmxlZnQgLQorCQkJCQkJICAgaW4tPnJlY3QubGVmdCkgKgorCQkJCQkJICAoODE5 MiA+PiBoX2Rvd25zaXplX2NvZWZmKSwKKwkJCQkJCSAgaF9yZXNpemVfb3B0KSk7CisJCX0KKwor CQkvKiBEZXRlcm1pbmUgdGlsZSB3aWR0aCBmcm9tIGxlZnQgYW5kIHJpZ2h0IGVkZ2VzICovCisJ CWMtPm91dC5yZWN0LndpZHRoID0gb3V0X3JpZ2h0IC0gYy0+b3V0LnJlY3QubGVmdDsKKwkJYy0+ aW4ucmVjdC53aWR0aCA9IGluX3JpZ2h0IC0gYy0+aW4ucmVjdC5sZWZ0OworCisJCS8qIE5vdyB3 ZSBjYW4gZGV0ZXJtaW5lIHRoZSBhY3R1YWwgcGVyLXRpbGUgc2NhbGluZyBmYWN0b3IgKi8KKwkJ aWYgKHggPT0gaHRpbGVzIC0gMSkgeworCQkJLyoKKwkJCSAqIFJvdW5kIGRvd24gZm9yIHRoZSBy aWdodCBjb2x1bW4sIHNpbmNlIHdlCisJCQkgKiBkb24ndCB3YW50IHRvIHJlYWQgYmV5b25kIHRo ZSByaWdodCBlZGdlLgorCQkJICovCisJCQloX3Jlc2l6ZV9jb2VmZiA9IDgxOTIgKiAoKGMtPmlu LnJlY3Qud2lkdGggPj4KKwkJCQkJCSBoX2Rvd25zaXplX2NvZWZmKSAtIDEpIC8KKwkJCQkJIChj LT5vdXQucmVjdC53aWR0aCAtIDEpOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIFJvdW5kIHRv IGNsb3Nlc3QgZm9yIHNlYW1zIGJldHdlZW4gdGlsZXMgZm9yCisJCQkgKiBtaW5pbWFsIGRpc3Rv cnRpb24uCisJCQkgKi8KKwkJCWhfcmVzaXplX2NvZWZmID0gRElWX1JPVU5EX0NMT1NFU1QoODE5 MiAqCisJCQkJCQkJICAgKGMtPmluLnJlY3Qud2lkdGggPj4KKwkJCQkJCQkgICAgaF9kb3duc2l6 ZV9jb2VmZiksCisJCQkJCQkJICAgYy0+b3V0LnJlY3Qud2lkdGgpOworCQl9CisKKwkJLyoKKwkJ ICogV2l0aCB0aGUgc2NhbGluZyBmYWN0b3Iga25vd24sIHJvdW5kIHVwIG91dHB1dCB3aWR0aAor CQkgKiB0byBidXJzdCBzaXplLiBJbiBST1VORF9VUCBhbmQgUk9VTkRfRE9XTiBzY2FsaW5nIG1v ZGUKKwkJICogdGhpcyBpcyBhIG5vLW9wIGZvciB0aGUgcmlnaHQgY29sdW1uLgorCQkgKi8KKwkJ Yy0+b3V0LnJlY3Qud2lkdGggPSByb3VuZF91cChjLT5vdXQucmVjdC53aWR0aCwgb3V0X2J1cnN0 KTsKKworCQkvKgorCQkgKiBDYWxjdWxhdGUgaW5wdXQgd2lkdGggZnJvbSB0aGUgbGFzdCBhY2Nl c3NlZCBpbnB1dCBwaXhlbAorCQkgKiBnaXZlbiBvdXRwdXQgd2lkdGggYW5kIHNjYWxpbmcgY29l ZmZpY2llbnRzLiBSb3VuZCB0bworCQkgKiBidXJzdCBzaXplLgorCQkgKi8KKwkJYy0+aW4ucmVj dC53aWR0aCA9IChESVZfUk9VTkRfVVAoKGMtPm91dC5yZWN0LndpZHRoIC0gMSkgKgorCQkJCQkJ IGhfcmVzaXplX2NvZWZmLCA4MTkyKSArIDEpCisJCQkJICAgPDwgaF9kb3duc2l6ZV9jb2VmZjsK KwkJYy0+aW4ucmVjdC53aWR0aCA9IHJvdW5kX3VwKGMtPmluLnJlY3Qud2lkdGgsIGluX2J1cnN0 KTsKKworCQlmb3IgKHkgPSB2dGlsZXMgLSAxOyB5ID49IDA7IHktLSkgeworCQkJaW50IGluX2Jv dHRvbSwgb3V0X2JvdHRvbTsKKworCQkJbWVtY3B5KCZjLT5pbi5waXgsICZpbi0+cGl4LAorCQkJ ICAgICAgc2l6ZW9mKHN0cnVjdCB2NGwyX3BpeF9mb3JtYXQpKTsKKworCQkJaWYgKHkgPT0gdnRp bGVzIC0gMSkgeworCQkJCW91dF9ib3R0b20gPSBvdXQtPnJlY3QudG9wICsgb3V0LT5yZWN0Lmhl aWdodDsKKwkJCQlpbl9ib3R0b20gPSBpbi0+cmVjdC50b3AgKyBpbi0+cmVjdC5oZWlnaHQ7CisJ CQl9IGVsc2UgeworCQkJCXN0cnVjdCBpbWFnZV9jb252ZXJ0X2N0eCAqY19iZWxvdyA9IGMgLSAx OworCisJCQkJb3V0X2JvdHRvbSA9IGNfYmVsb3ctPm91dC5yZWN0LnRvcDsKKwkJCQlpbl9ib3R0 b20gPSBjX2JlbG93LT5pbi5yZWN0LnRvcDsKKworCQkJCS8qCisJCQkJICogQ29weSBob3Jpem9u dGFsIHBhcmFtZXRlcnMgZnJvbSB0aGUgdGlsZQorCQkJCSAqIGJlbG93CisJCQkJICovCisJCQkJ Yy0+b3V0LnJlY3QubGVmdCA9IGNfYmVsb3ctPm91dC5yZWN0LmxlZnQ7CisJCQkJYy0+b3V0LnJl Y3Qud2lkdGggPSBjX2JlbG93LT5vdXQucmVjdC53aWR0aDsKKwkJCQljLT5pbi5yZWN0LmxlZnQg PSBjX2JlbG93LT5pbi5yZWN0LmxlZnQ7CisJCQkJYy0+aW4ucmVjdC53aWR0aCA9IGNfYmVsb3ct PmluLnJlY3Qud2lkdGg7CisJCQl9CisKKwkJCWlmICh5ID09IDApIHsKKwkJCQljLT5vdXQucmVj dC50b3AgPSBvdXQtPnJlY3QudG9wOworCQkJCWMtPmluLnJlY3QudG9wID0gaW4tPnJlY3QudG9w OworCQkJfSBlbHNlIHsKKwkJCQlpbnQgYmVzdF90b3AsIGJlc3RfaW5fdG9wOworCQkJCWludCBt aW5fdG9wLCBtYXhfdG9wOworCQkJCWludCBtaW5fZGlmZiA9IElOVF9NQVg7CisKKwkJCQkvKgor CQkJCSAqIEZpbmQgdGhlIGJlc3QgcG9zc2libGUgdG9wIGVkZ2UuIEl0IG11c3QgYmUKKwkJCQkg KiBhZGp1c3RlZCBhY2NvcmRpbmcgdG8gSURNQUMgbGltaXRhdGlvbnMsIGFuZAorCQkJCSAqIHNo b3VsZCBiZSBjaG9zZW4gc28gdGhhdAorCQkJCSAqIChpbi0+cmVjdC50b3AgKyAoYy0+b3V0LnJl Y3QudG9wIC0KKwkJCQkgKiAgb3V0LT5yZWN0LnRvcCkgKiB2X3Jlc2l6ZV9vcHQgLworCQkJCSAq ICg4MTkyID4+IHZfZG93bnNpemVfY29lZmYpKQorCQkJCSAqIGlzIGFzIGNsb3NlIGFzIHBvc3Np YmxlIHRvIGEgdmFsaWQgdG9wIGVkZ2UKKwkJCQkgKiBpbiB0aGUgaW5wdXQuCisJCQkJICovCisJ CQkJbWluX3RvcCA9IG1heCgwLAorCQkJCQkgICAgICByb3VuZF91cChvdXRfYm90dG9tIC0gMTAy NCwKKwkJCQkJCSAgICAgICBvdXRfdmFsaWduKSk7CisJCQkJbWF4X3RvcCA9IG1pbihyb3VuZF9k b3duKG91dF9ib3R0b20sCisJCQkJCQkJIG91dF9oYWxpZ24pLCB5ICogMTAyNCk7CisJCQkJYmVz dF90b3AgPSBtaW5fdG9wOworCQkJCWJlc3RfaW5fdG9wID0gKGJlc3RfdG9wIC0gb3V0LT5yZWN0 LnRvcCkgKgorCQkJCQkgICAgICAgdl9yZXNpemVfb3B0OworCQkJCWZvciAodG9wID0gbWluX3Rv cDsgdG9wIDwgbWF4X3RvcDsKKwkJCQkgICAgIHRvcCArPSBvdXRfdmFsaWduKSB7CisJCQkJCWlu dCBkaWZmLCBpbl90b3A7CisKKwkJCQkJaW5fdG9wID0gaW4tPnJlY3QudG9wICsKKwkJCQkJCSAo KCh0b3AgLSBvdXQtPnJlY3QudG9wKSAqCisJCQkJCQkgICB2X3Jlc2l6ZV9vcHQpIDw8CisJCQkJ CQkgIHZfZG93bnNpemVfY29lZmYpOworCQkJCQlkaWZmID0gYWJzKGluX3RvcCAtCisJCQkJCQkg ICByb3VuZF9jbG9zZXN0KGluX3RvcCwgODE5MiAqCisJCQkJCQkJCSBpbl92YWxpZ24pKTsKKwor CQkJCQlpZiAoZGlmZiA8IG1pbl9kaWZmKSB7CisJCQkJCQltaW5fZGlmZiA9IGRpZmY7CisJCQkJ CQliZXN0X3RvcCA9IHRvcDsKKwkJCQkJCWJlc3RfaW5fdG9wID0gaW5fdG9wOworCQkJCQl9CisJ CQkJfQorCisJCQkJYy0+b3V0LnJlY3QudG9wID0gYmVzdF90b3A7CisJCQkJYy0+aW4ucmVjdC50 b3AgPSBESVZfUk9VTkRfQ0xPU0VTVChiZXN0X2luX3RvcCwKKwkJCQkJCQkJICAgODE5Mik7CisK KwkJCQlkZXZfZGJnKGlwdS0+ZGV2LAorCQkJCQkiJXM6IHRpbGUoJWQsJWQpOlx0dG9wOiAlZCAt PiAlZCAoaW5zdGVhZCBvZiAlZC4lMDRkIC0+ICVkKSIsCisJCQkJCV9fZnVuY19fLCB4LCB5LCBj LT5pbi5yZWN0LnRvcCwKKwkJCQkJYy0+b3V0LnJlY3QudG9wLCBiZXN0X2luX3RvcCAvIDgxOTIs CisJCQkJCShiZXN0X2luX3RvcCAlIDgxOTIpICogMTAwMDAgLyA4MTkyLAorCQkJCQlvdXQtPnJl Y3QudG9wICsKKwkJCQkJRElWX1JPVU5EX0NMT1NFU1QoKGMtPmluLnJlY3QudG9wIC0KKwkJCQkJ CQkgICBpbi0+cmVjdC50b3ApICogKDgxOTIKKwkJCQkJCQkgID4+IHZfZG93bnNpemVfY29lZmYp LAorCQkJCQkJCSAgdl9yZXNpemVfb3B0KSk7CisJCQl9CisKKwkJCS8qIERldGVybWluZSB0aWxl IGhlaWdodCBmcm9tIHRvcCBhbmQgYm90dG9tIGVkZ2VzICovCisJCQljLT5vdXQucmVjdC5oZWln aHQgPSBvdXRfYm90dG9tIC0gYy0+b3V0LnJlY3QudG9wOworCQkJYy0+aW4ucmVjdC5oZWlnaHQg PSBpbl9ib3R0b20gLSBjLT5pbi5yZWN0LnRvcDsKKworCQkJLyoKKwkJCSAqIE5vdyB3ZSBjYW4g ZGV0ZXJtaW5lIHRoZSBhY3R1YWwgdmVydGljYWwgcGVyLXRpbGUKKwkJCSAqIHNjYWxpbmcgZmFj dG9yCisJCQkgKi8KKwkJCWlmICh5ID09IHZ0aWxlcyAtIDEpIHsKKwkJCQkvKgorCQkJCSAqIFJv dW5kIGRvd24gZm9yIHRoZSBib3R0b20gcm93LCBzaW5jZSB3ZQorCQkJCSAqIGRvbid0IHdhbnQg dG8gcmVhZCBiZXlvbmQgdGhlIGxvd2VyIGJvcmRlci4KKwkJCQkgKi8KKwkJCQl2X3Jlc2l6ZV9j b2VmZiA9IDgxOTIgKiAoKGMtPmluLnJlY3QuaGVpZ2h0ID4+CisJCQkJCQkJIHZfZG93bnNpemVf Y29lZmYpIC0gMSkKKwkJCQkJCSAvIChjLT5vdXQucmVjdC5oZWlnaHQgLSAxKTsKKwkJCX0gZWxz ZSB7CisJCQkJLyoKKwkJCQkgKiBSb3VuZCB0byBjbG9zZXN0IGZvciBzZWFtcyBiZXR3ZWVuIHRp bGVzIGZvcgorCQkJCSAqIG1pbmltYWwgZGlzdG9ydGlvbi4KKwkJCQkgKi8KKwkJCQl2X3Jlc2l6 ZV9jb2VmZiA9IERJVl9ST1VORF9DTE9TRVNUKDgxOTIgKgorCQkJCQkJCShjLT5pbi5yZWN0Lmhl aWdodCA+PgorCQkJCQkJCSB2X2Rvd25zaXplX2NvZWZmKSwKKwkJCQkJCQljLT5vdXQucmVjdC5o ZWlnaHQpOworCQkJfQorCisJCQkvKgorCQkJICogV2l0aCB0aGUgc2NhbGluZyBmYWN0b3Iga25v d24sIHJvdW5kIHVwIG91dHB1dCBoZWlnaHQKKwkJCSAqIHRvIElETUFDIGxpbWl0YXRpb25zCisJ CQkgKi8KKwkJCWMtPm91dC5yZWN0LmhlaWdodCA9IHJvdW5kX3VwKGMtPm91dC5yZWN0LmhlaWdo dCwKKwkJCQkJCSAgICAgIG91dF92YWxpZ24pOworCisJCQkvKgorCQkJICogQ2FsY3VsYXRlIGlu cHV0IGhlaWdodCBmcm9tIHRoZSBsYXN0IGFjY2Vzc2VkIGlucHV0CisJCQkgKiBsaW5lIGdpdmVu IG91dHB1dCBoZWlnaHQgYW5kIHNjYWxpbmcgY29lZmZpY2llbnRzLgorCQkJICovCisJCQljLT5p bi5yZWN0LmhlaWdodCA9IChESVZfUk9VTkRfVVAoCisJCQkJCQkoYy0+b3V0LnJlY3QuaGVpZ2h0 IC0gMSkgKgorCQkJCQkJdl9yZXNpemVfY29lZmYsIDgxOTIpICsgMSkKKwkJCQkJICAgIDw8IHZf ZG93bnNpemVfY29lZmY7CisKKwkJCS8qIGFsaWduIGhlaWdodCBhY2NvcmRpbmcgdG8gSURNQUMg cmVzdHJpY3Rpb25zICovCisJCQljLT5pbi5yZWN0LmhlaWdodCA9IHJvdW5kX3VwKGMtPmluLnJl Y3QuaGVpZ2h0LAorCQkJCWluX3ZhbGlnbik7CisKKwkJCW1lbWNweSgmYy0+b3V0LnBpeCwgJm91 dC0+cGl4LAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0KSk7CisKKwkJ CWRldl9kYmcoaXB1LT5kZXYsCisJCQkJIiVzOiB0aWxlKCVkLCVkKTogJWR4JWQoJWR4JWRAJWQs JWQpIC0+ICVkeCVkKCVkeCVkQCVkLCVkKSwgcmVzaXplOiAlZHglZFxuIiwKKwkJCQlfX2Z1bmNf XywgeCwgeSwKKwkJCQljLT5pbi5waXgud2lkdGgsIGMtPmluLnBpeC5oZWlnaHQsCisJCQkJYy0+ aW4ucmVjdC53aWR0aCwgYy0+aW4ucmVjdC5oZWlnaHQsCisJCQkJYy0+aW4ucmVjdC5sZWZ0LCBj LT5pbi5yZWN0LnRvcCwKKwkJCQljLT5vdXQucGl4LndpZHRoLCBjLT5vdXQucGl4LmhlaWdodCwK KwkJCQljLT5vdXQucmVjdC53aWR0aCwgYy0+b3V0LnJlY3QuaGVpZ2h0LAorCQkJCWMtPm91dC5y ZWN0LmxlZnQsIGMtPm91dC5yZWN0LnRvcCwKKwkJCQloX3Jlc2l6ZV9jb2VmZiwgdl9yZXNpemVf Y29lZmYpOworCisJCQljLT5yc2MgPSAodl9kb3duc2l6ZV9jb2VmZiA8PCAzMCkgfAorCQkJCSAo dl9yZXNpemVfY29lZmYgPDwgMTYpIHwKKwkJCQkgKGhfZG93bnNpemVfY29lZmYgPDwgMTQpIHwK KwkJCQkgaF9yZXNpemVfY29lZmY7CisKKwkJCWMrKzsKKwkJfQorCX0KKworCSpudW1fdGlsZXMg PSBodGlsZXMgKiB2dGlsZXM7CisKKwlyZXR1cm4gY3R4OworfQorRVhQT1JUX1NZTUJPTF9HUEwo aXB1X2ltYWdlX2NvbnZlcnRfcHJlcGFyZSk7CisKK2ludCBpcHVfaW1hZ2VfY29udmVydF9ydW4o c3RydWN0IGlwdV9zb2MgKmlwdSwgc3RydWN0IGlwdV9pbWFnZSAqaW4sCisJCQkgIHN0cnVjdCBp cHVfaW1hZ2UgKm91dCwgc3RydWN0IGltYWdlX2NvbnZlcnRfY3R4ICpjdHgsCisJCQkgIGludCBu dW1fdGlsZXMsIHZvaWQgKCpjb21wbGV0ZSkodm9pZCAqY3R4LCBpbnQgZXJyKSwKKwkJCSAgdm9p ZCAqY29tcGxldGVfY29udGV4dCwgYm9vbCBmcmVlX2N0eCkKK3sKKwlzdHJ1Y3QgaXB1X2ljX3By aXYgKnByaXYgPSBpcHUtPmljX3ByaXY7CisJc3RydWN0IGlwdV9pYyAqaWMgPSAmcHJpdi0+dGFz a1tJQ19UQVNLX1BPU1RfUFJPQ0VTU09SXTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBp OworCisJZm9yIChpID0gMDsgaSA8IG51bV90aWxlczsgaSsrKSB7CisJCWN0eFtpXS5pbi5waHlz MCA9IGluLT5waHlzMDsKKwkJY3R4W2ldLm91dC5waHlzMCA9IG91dC0+cGh5czA7CisJfQorCWN0 eFtudW1fdGlsZXMgLSAxXS5jb21wbGV0ZSA9IGNvbXBsZXRlOworCWN0eFtudW1fdGlsZXMgLSAx XS5jb21wbGV0ZV9jb250ZXh0ID0gY29tcGxldGVfY29udGV4dDsKKwlpZiAoZnJlZV9jdHgpCisJ CWN0eFtudW1fdGlsZXMgLSAxXS5mcmVlcCA9IGN0eDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZw cml2LT5sb2NrLCBmbGFncyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3RpbGVzOyBpKyspCisJ CWxpc3RfYWRkX3RhaWwoJmN0eFtpXS5saXN0LCAmaWMtPmltYWdlX2xpc3QpOworCisJcXVldWVf d29yayhpYy0+d29ya3F1ZXVlLCAmaWMtPndvcmspOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9y ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQ TChpcHVfaW1hZ2VfY29udmVydF9ydW4pOworCitzdGF0aWMgaW50IGlwdV9pbWFnZV9jb252ZXJ0 X2luaXQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgaXB1X3NvYyAqaXB1LAorCQlzdHJ1Y3Qg aXB1X2ljX3ByaXYgKnByaXYpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgaXB1X2ljICppYyA9IGlw dV9pY19nZXQoaXB1LCBJQ19UQVNLX1BPU1RfUFJPQ0VTU09SKTsKKwlpbnQgaXJxID0gaXB1X2lk bWFjX2NoYW5uZWxfaXJxKGlwdSwgaWMtPm91dHB1dF9jaGFubmVsLAorCQkJCQlJUFVfSVJRX0VP Rik7CisKKwlpYy0+d29ya3F1ZXVlID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoZGV2 X25hbWUoaXB1LT5kZXYpKTsKKwlpZiAoIWljLT53b3JrcXVldWUpCisJCXJldHVybiAtRU5PTUVN OworCisJSU5JVF9XT1JLKCZpYy0+d29yaywgaXB1X2ltYWdlX2NvbnZlcnRfd29yayk7CisJaW5p dF9jb21wbGV0aW9uKCZpYy0+Y29tcGxldGUpOworCisJcmV0ID0gZGV2bV9yZXF1ZXN0X3RocmVh ZGVkX2lycShkZXYsIGlycSwgTlVMTCwKKwkJCQlpcHVfaW1hZ2VfY29udmVydF9oYW5kbGVyLAor CQkJCUlSUUZfT05FU0hPVCwgIklDIFBQIiwgaWMpOworCWlmIChyZXQpCisJCWdvdG8gZXJyOwor CisJcmV0dXJuIDA7CitlcnI6CisJZGVzdHJveV93b3JrcXVldWUoaWMtPndvcmtxdWV1ZSk7CisJ cmV0dXJuIHJldDsKK30KKwogaW50IGlwdV9pY19lbmFibGUoc3RydWN0IGlwdV9pYyAqaWMpCiB7 CiAJc3RydWN0IGlwdV9pY19wcml2ICpwcml2ID0gaWMtPnByaXY7CkBAIC03MzYsMTIgKzE0NzMs MzAgQEAgaW50IGlwdV9pY19pbml0KHN0cnVjdCBpcHVfc29jICppcHUsIHN0cnVjdCBkZXZpY2Ug KmRldiwKIAlwcml2LT5pcHUgPSBpcHU7CiAKIAlmb3IgKGkgPSAwOyBpIDwgSUNfTlVNX1RBU0tT OyBpKyspIHsKKwkJSU5JVF9MSVNUX0hFQUQoJnByaXYtPnRhc2tbaV0uaW1hZ2VfbGlzdCk7CiAJ CXByaXYtPnRhc2tbaV0udGFzayA9IGk7CiAJCXByaXYtPnRhc2tbaV0ucHJpdiA9IHByaXY7CiAJ CXByaXYtPnRhc2tbaV0ucmVnID0gJmljX3Rhc2tfcmVnW2ldOwogCQlwcml2LT50YXNrW2ldLmJp dCA9ICZpY190YXNrX2JpdFtpXTsKKworCQlwcml2LT50YXNrW2ldLmlucHV0X2NoYW5uZWwgPSBp cHVfaWRtYWNfZ2V0KGlwdSwKKwkJCQkJCQlpY190YXNrX2NoW2ldLmluKTsKKwkJcHJpdi0+dGFz a1tpXS5vdXRwdXRfY2hhbm5lbCA9IGlwdV9pZG1hY19nZXQoaXB1LAorCQkJCQkJCWljX3Rhc2tf Y2hbaV0ub3V0KTsKKwkJcHJpdi0+dGFza1tpXS5yb3RhdGlvbl9pbnB1dF9jaGFubmVsID0gaXB1 X2lkbWFjX2dldChpcHUsCisJCQkJCQkJaWNfdGFza19jaFtpXS5yb3RfaW4pOworCQlwcml2LT50 YXNrW2ldLnJvdGF0aW9uX291dHB1dF9jaGFubmVsID0gaXB1X2lkbWFjX2dldChpcHUsCisJCQkJ CQkJaWNfdGFza19jaFtpXS5yb3Rfb3V0KTsKKwkJaWYgKGljX3Rhc2tfY2hbaV0uaW5fcHJldikg eworCQkJcHJpdi0+dGFza1tpXS5pbnB1dF9jaGFubmVsX3AgPSBpcHVfaWRtYWNfZ2V0KGlwdSwK KwkJCQkJCQlpY190YXNrX2NoW2ldLmluX3ByZXYpOworCQkJcHJpdi0+dGFza1tpXS5pbnB1dF9j aGFubmVsX24gPSBpcHVfaWRtYWNfZ2V0KGlwdSwKKwkJCQkJCQlpY190YXNrX2NoW2ldLmluX25l eHQpOworCQl9CiAJfQogCisJaXB1X2ltYWdlX2NvbnZlcnRfaW5pdChkZXYsIGlwdSwgcHJpdik7 CisKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS92aWRlby9pbXgtaXB1LXYz LmggYi9pbmNsdWRlL3ZpZGVvL2lteC1pcHUtdjMuaAppbmRleCA0NTk1MDhlLi42ZDk4YTM4IDEw MDY0NAotLS0gYS9pbmNsdWRlL3ZpZGVvL2lteC1pcHUtdjMuaAorKysgYi9pbmNsdWRlL3ZpZGVv L2lteC1pcHUtdjMuaApAQCAtMzE2LDcgKzMxNiw4IEBAIGludCBpcHVfaWNfdGFza19pbml0KHN0 cnVjdCBpcHVfaWMgKmljLAogCQkgICAgIGludCBpbl93aWR0aCwgaW50IGluX2hlaWdodCwKIAkJ ICAgICBpbnQgb3V0X3dpZHRoLCBpbnQgb3V0X2hlaWdodCwKIAkJICAgICBlbnVtIGlwdV9jb2xv cl9zcGFjZSBpbl9jcywKLQkJICAgICBlbnVtIGlwdV9jb2xvcl9zcGFjZSBvdXRfY3MpOworCQkg ICAgIGVudW0gaXB1X2NvbG9yX3NwYWNlIG91dF9jcywKKwkJICAgICB1MzIgcnNjKTsKIGludCBp cHVfaWNfdGFza19ncmFwaGljc19pbml0KHN0cnVjdCBpcHVfaWMgKmljLAogCQkJICAgICAgZW51 bSBpcHVfY29sb3Jfc3BhY2UgaW5fZ19jcywKIAkJCSAgICAgIGJvb2wgZ2FscGhhX2VuLCB1MzIg Z2FscGhhLApAQCAtMzYyLDQgKzM2MywzNSBAQCBzdHJ1Y3QgaXB1X2NsaWVudF9wbGF0Zm9ybWRh dGEgewogCWludCBkbWFbMl07CiB9OwogCitlbnVtIGlwdV9pbWFnZV9zY2FsZV9jdHJsIHsKKwlJ UFVfSU1BR0VfU0NBTEVfUk9VTkRfRE9XTiwKKwlJUFVfSU1BR0VfU0NBTEVfUElYRUxQRVJGRUNU LAorCUlQVV9JTUFHRV9TQ0FMRV9ST1VORF9VUCwKK307CisKK3N0cnVjdCBpbWFnZV9jb252ZXJ0 X2N0eDsKKworc3RydWN0IGltYWdlX2NvbnZlcnRfY3R4ICppcHVfaW1hZ2VfY29udmVydF9wcmVw YXJlKHN0cnVjdCBpcHVfc29jICppcHUsCisJCXN0cnVjdCBpcHVfaW1hZ2UgKmluLCBzdHJ1Y3Qg aXB1X2ltYWdlICpvdXQsCisJCWVudW0gaXB1X2ltYWdlX3NjYWxlX2N0cmwgY3RybCwgaW50ICpu dW1fdGlsZXMpOworaW50IGlwdV9pbWFnZV9jb252ZXJ0X3J1bihzdHJ1Y3QgaXB1X3NvYyAqaXB1 LCBzdHJ1Y3QgaXB1X2ltYWdlICppbiwKKwkJc3RydWN0IGlwdV9pbWFnZSAqb3V0LCBzdHJ1Y3Qg aW1hZ2VfY29udmVydF9jdHggKmN0eCwKKwkJaW50IG51bV90aWxlcywgdm9pZCAoKmNvbXBsZXRl KSh2b2lkICpjdHgsIGludCBlcnIpLAorCQl2b2lkICpjb21wbGV0ZV9jb250ZXh0LCBib29sIGZy ZWVfY3R4KTsKKworc3RhdGljIGlubGluZSBpbnQgaXB1X2ltYWdlX2NvbnZlcnQoc3RydWN0IGlw dV9zb2MgKmlwdSwgc3RydWN0IGlwdV9pbWFnZSAqaW4sCisJCXN0cnVjdCBpcHVfaW1hZ2UgKm91 dCwgdm9pZCAoKmNvbXBsZXRlKSh2b2lkICpjdHgsIGludCBlcnIpLAorCQl2b2lkICpjb21wbGV0 ZV9jb250ZXh0LCBlbnVtIGlwdV9pbWFnZV9zY2FsZV9jdHJsIGN0cmwpCit7CisJc3RydWN0IGlt YWdlX2NvbnZlcnRfY3R4ICpjdHg7CisJaW50IG51bV90aWxlczsKKworCWN0eCA9IGlwdV9pbWFn ZV9jb252ZXJ0X3ByZXBhcmUoaXB1LCBpbiwgb3V0LCBjdHJsLCAmbnVtX3RpbGVzKTsKKwlpZiAo SVNfRVJSKGN0eCkpCisJCXJldHVybiBQVFJfRVJSKGN0eCk7CisKKwlyZXR1cm4gaXB1X2ltYWdl X2NvbnZlcnRfcnVuKGlwdSwgaW4sIG91dCwgY3R4LCBudW1fdGlsZXMsIGNvbXBsZXRlLAorCQkJ CSAgICAgY29tcGxldGVfY29udGV4dCwgdHJ1ZSk7Cit9CisKICNlbmRpZiAvKiBfX0RSTV9JUFVf SF9fICovCi0tIAoyLjEuNAoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX18KZHJpLWRldmVsIG1haWxpbmcgbGlzdApkcmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0 b3Aub3JnCmh0dHA6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9kcmkt ZGV2ZWwK