From mboxrd@z Thu Jan 1 00:00:00 1970 From: =?UTF-8?q?Noralf=20Tr=C3=B8nnes?= Subject: [PATCH v5 10/11] drm/fb-helper: Move out modeset config code Date: Mon, 6 May 2019 20:01:38 +0200 Message-ID: <20190506180139.6913-11-noralf@tronnes.org> References: <20190506180139.6913-1-noralf@tronnes.org> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <20190506180139.6913-1-noralf@tronnes.org> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: dri-devel@lists.freedesktop.org Cc: Maxime Ripard , intel-gfx@lists.freedesktop.org, =?UTF-8?q?Noralf=20Tr=C3=B8nnes?= List-Id: dri-devel@lists.freedesktop.org Tm8gZnVuY3Rpb25hbCBjaGFuZ2VzLCBqdXN0IG1vdmluZyBjb2RlIGFzLWlzIGFuZCBmaXhpbmcg aW5jbHVkZXMuCgpTaWduZWQtb2ZmLWJ5OiBOb3JhbGYgVHLDuG5uZXMgPG5vcmFsZkB0cm9ubmVz Lm9yZz4KUmV2aWV3ZWQtYnk6IE1heGltZSBSaXBhcmQgPG1heGltZS5yaXBhcmRAYm9vdGxpbi5j b20+Ci0tLQogZHJpdmVycy9ncHUvZHJtL2RybV9jbGllbnRfbW9kZXNldC5jIHwgNzA3ICsrKysr KysrKysrKysrKysrKysrKysrKysrLQogZHJpdmVycy9ncHUvZHJtL2RybV9mYl9oZWxwZXIuYyAg ICAgIHwgNjkyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBpbmNsdWRlL2RybS9kcm1fY2xp ZW50LmggICAgICAgICAgICAgfCAgIDUgKy0KIDMgZmlsZXMgY2hhbmdlZCwgNzAyIGluc2VydGlv bnMoKyksIDcwMiBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJt X2NsaWVudF9tb2Rlc2V0LmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2NsaWVudF9tb2Rlc2V0LmMK aW5kZXggYjJhZWRlYzY1NjM3Li5lOGI1YzU0ZDZjMDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1 L2RybS9kcm1fY2xpZW50X21vZGVzZXQuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2NsaWVu dF9tb2Rlc2V0LmMKQEAgLTEzLDEzICsxMywyMiBAQAogCiAjaW5jbHVkZSA8ZHJtL2RybV9hdG9t aWMuaD4KICNpbmNsdWRlIDxkcm0vZHJtX2NsaWVudC5oPgorI2luY2x1ZGUgPGRybS9kcm1fY29u bmVjdG9yLmg+CiAjaW5jbHVkZSA8ZHJtL2RybV9jcnRjLmg+CiAjaW5jbHVkZSA8ZHJtL2RybV9k ZXZpY2UuaD4KICNpbmNsdWRlIDxkcm0vZHJtX2Rydi5oPgorI2luY2x1ZGUgPGRybS9kcm1fZW5j b2Rlci5oPgorI2luY2x1ZGUgPGRybS9kcm1fcHJpbnQuaD4KIAogI2luY2x1ZGUgImRybV9jcnRj X2ludGVybmFsLmgiCiAjaW5jbHVkZSAiZHJtX2ludGVybmFsLmgiCiAKKyNkZWZpbmUgRFJNX0NM SUVOVF9NQVhfQ0xPTkVEX0NPTk5FQ1RPUlMJOAorCitzdHJ1Y3QgZHJtX2NsaWVudF9vZmZzZXQg eworCWludCB4LCB5OworfTsKKwogaW50IGRybV9jbGllbnRfbW9kZXNldF9jcmVhdGUoc3RydWN0 IGRybV9jbGllbnRfZGV2ICpjbGllbnQpCiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNs aWVudC0+ZGV2OwpAQCAtNTgsNyArNjcsNyBAQCBpbnQgZHJtX2NsaWVudF9tb2Rlc2V0X2NyZWF0 ZShzdHJ1Y3QgZHJtX2NsaWVudF9kZXYgKmNsaWVudCkKIAlyZXR1cm4gLUVOT01FTTsKIH0KIAot dm9pZCBkcm1fY2xpZW50X21vZGVzZXRfcmVsZWFzZShzdHJ1Y3QgZHJtX2NsaWVudF9kZXYgKmNs aWVudCkKK3N0YXRpYyB2b2lkIGRybV9jbGllbnRfbW9kZXNldF9yZWxlYXNlKHN0cnVjdCBkcm1f Y2xpZW50X2RldiAqY2xpZW50KQogewogCXN0cnVjdCBkcm1fbW9kZV9zZXQgKm1vZGVzZXQ7CiAJ dW5zaWduZWQgaW50IGk7CkBAIC03NSw4ICs4NCw2IEBAIHZvaWQgZHJtX2NsaWVudF9tb2Rlc2V0 X3JlbGVhc2Uoc3RydWN0IGRybV9jbGllbnRfZGV2ICpjbGllbnQpCiAJCW1vZGVzZXQtPm51bV9j b25uZWN0b3JzID0gMDsKIAl9CiB9Ci0vKiBUT0RPOiBSZW1vdmUgZXhwb3J0IHdoZW4gbW9kZXNl dCBjb2RlIGhhcyBiZWVuIG1vdmVkIG92ZXIgKi8KLUVYUE9SVF9TWU1CT0woZHJtX2NsaWVudF9t b2Rlc2V0X3JlbGVhc2UpOwogCiB2b2lkIGRybV9jbGllbnRfbW9kZXNldF9mcmVlKHN0cnVjdCBk cm1fY2xpZW50X2RldiAqY2xpZW50KQogewpAQCAtOTUsNyArMTAyLDggQEAgdm9pZCBkcm1fY2xp ZW50X21vZGVzZXRfZnJlZShzdHJ1Y3QgZHJtX2NsaWVudF9kZXYgKmNsaWVudCkKIAlrZnJlZShj bGllbnQtPm1vZGVzZXRzKTsKIH0KIAotc3RydWN0IGRybV9tb2RlX3NldCAqZHJtX2NsaWVudF9m aW5kX21vZGVzZXQoc3RydWN0IGRybV9jbGllbnRfZGV2ICpjbGllbnQsIHN0cnVjdCBkcm1fY3J0 YyAqY3J0YykKK3N0YXRpYyBzdHJ1Y3QgZHJtX21vZGVfc2V0ICoKK2RybV9jbGllbnRfZmluZF9t b2Rlc2V0KHN0cnVjdCBkcm1fY2xpZW50X2RldiAqY2xpZW50LCBzdHJ1Y3QgZHJtX2NydGMgKmNy dGMpCiB7CiAJc3RydWN0IGRybV9tb2RlX3NldCAqbW9kZXNldDsKIApAQCAtMTA1LDggKzExMyw2 OTUgQEAgc3RydWN0IGRybV9tb2RlX3NldCAqZHJtX2NsaWVudF9maW5kX21vZGVzZXQoc3RydWN0 IGRybV9jbGllbnRfZGV2ICpjbGllbnQsIHN0cnUKIAogCXJldHVybiBOVUxMOwogfQotLyogVE9E TzogUmVtb3ZlIGV4cG9ydCB3aGVuIG1vZGVzZXQgY29kZSBoYXMgYmVlbiBtb3ZlZCBvdmVyICov Ci1FWFBPUlRfU1lNQk9MKGRybV9jbGllbnRfZmluZF9tb2Rlc2V0KTsKKworc3RhdGljIHN0cnVj dCBkcm1fZGlzcGxheV9tb2RlICoKK2RybV9jb25uZWN0b3JfaGFzX3ByZWZlcnJlZF9tb2RlKHN0 cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsIGludCB3aWR0aCwgaW50IGhlaWdodCkKK3sK KwlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnko bW9kZSwgJmNvbm5lY3Rvci0+bW9kZXMsIGhlYWQpIHsKKwkJaWYgKG1vZGUtPmhkaXNwbGF5ID4g d2lkdGggfHwKKwkJICAgIG1vZGUtPnZkaXNwbGF5ID4gaGVpZ2h0KQorCQkJY29udGludWU7CisJ CWlmIChtb2RlLT50eXBlICYgRFJNX01PREVfVFlQRV9QUkVGRVJSRUQpCisJCQlyZXR1cm4gbW9k ZTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9k ZSAqCitkcm1fY29ubmVjdG9yX3BpY2tfY21kbGluZV9tb2RlKHN0cnVjdCBkcm1fY29ubmVjdG9y ICpjb25uZWN0b3IpCit7CisJc3RydWN0IGRybV9jbWRsaW5lX21vZGUgKmNtZGxpbmVfbW9kZTsK KwlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZTsKKwlib29sIHByZWZlcl9ub25faW50ZXJs YWNlOworCisJY21kbGluZV9tb2RlID0gJmNvbm5lY3Rvci0+Y21kbGluZV9tb2RlOworCWlmIChj bWRsaW5lX21vZGUtPnNwZWNpZmllZCA9PSBmYWxzZSkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBh dHRlbXB0IHRvIGZpbmQgYSBtYXRjaGluZyBtb2RlIGluIHRoZSBsaXN0IG9mIG1vZGVzCisJICog IHdlIGhhdmUgZ290dGVuIHNvIGZhciwgaWYgbm90IGFkZCBhIENWVCBtb2RlIHRoYXQgY29uZm9y bXMKKwkgKi8KKwlpZiAoY21kbGluZV9tb2RlLT5yYiB8fCBjbWRsaW5lX21vZGUtPm1hcmdpbnMp CisJCWdvdG8gY3JlYXRlX21vZGU7CisKKwlwcmVmZXJfbm9uX2ludGVybGFjZSA9ICFjbWRsaW5l X21vZGUtPmludGVybGFjZTsKK2FnYWluOgorCWxpc3RfZm9yX2VhY2hfZW50cnkobW9kZSwgJmNv bm5lY3Rvci0+bW9kZXMsIGhlYWQpIHsKKwkJLyogY2hlY2sgd2lkdGgvaGVpZ2h0ICovCisJCWlm IChtb2RlLT5oZGlzcGxheSAhPSBjbWRsaW5lX21vZGUtPnhyZXMgfHwKKwkJICAgIG1vZGUtPnZk aXNwbGF5ICE9IGNtZGxpbmVfbW9kZS0+eXJlcykKKwkJCWNvbnRpbnVlOworCisJCWlmIChjbWRs aW5lX21vZGUtPnJlZnJlc2hfc3BlY2lmaWVkKSB7CisJCQlpZiAobW9kZS0+dnJlZnJlc2ggIT0g Y21kbGluZV9tb2RlLT5yZWZyZXNoKQorCQkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKGNtZGxp bmVfbW9kZS0+aW50ZXJsYWNlKSB7CisJCQlpZiAoIShtb2RlLT5mbGFncyAmIERSTV9NT0RFX0ZM QUdfSU5URVJMQUNFKSkKKwkJCQljb250aW51ZTsKKwkJfSBlbHNlIGlmIChwcmVmZXJfbm9uX2lu dGVybGFjZSkgeworCQkJaWYgKG1vZGUtPmZsYWdzICYgRFJNX01PREVfRkxBR19JTlRFUkxBQ0Up CisJCQkJY29udGludWU7CisJCX0KKwkJcmV0dXJuIG1vZGU7CisJfQorCisJaWYgKHByZWZlcl9u b25faW50ZXJsYWNlKSB7CisJCXByZWZlcl9ub25faW50ZXJsYWNlID0gZmFsc2U7CisJCWdvdG8g YWdhaW47CisJfQorCitjcmVhdGVfbW9kZToKKwltb2RlID0gZHJtX21vZGVfY3JlYXRlX2Zyb21f Y21kbGluZV9tb2RlKGNvbm5lY3Rvci0+ZGV2LCBjbWRsaW5lX21vZGUpOworCWxpc3RfYWRkKCZt b2RlLT5oZWFkLCAmY29ubmVjdG9yLT5tb2Rlcyk7CisKKwlyZXR1cm4gbW9kZTsKK30KKworc3Rh dGljIGJvb2wgZHJtX2Nvbm5lY3Rvcl9lbmFibGVkKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25u ZWN0b3IsIGJvb2wgc3RyaWN0KQoreworCWJvb2wgZW5hYmxlOworCisJaWYgKGNvbm5lY3Rvci0+ ZGlzcGxheV9pbmZvLm5vbl9kZXNrdG9wKQorCQlyZXR1cm4gZmFsc2U7CisKKwlpZiAoc3RyaWN0 KQorCQllbmFibGUgPSBjb25uZWN0b3ItPnN0YXR1cyA9PSBjb25uZWN0b3Jfc3RhdHVzX2Nvbm5l Y3RlZDsKKwllbHNlCisJCWVuYWJsZSA9IGNvbm5lY3Rvci0+c3RhdHVzICE9IGNvbm5lY3Rvcl9z dGF0dXNfZGlzY29ubmVjdGVkOworCisJcmV0dXJuIGVuYWJsZTsKK30KKworc3RhdGljIHZvaWQg ZHJtX2NsaWVudF9jb25uZWN0b3JzX2VuYWJsZWQoc3RydWN0IGRybV9jb25uZWN0b3IgKipjb25u ZWN0b3JzLAorCQkJCQkgIHVuc2lnbmVkIGludCBjb25uZWN0b3JfY291bnQsCisJCQkJCSAgYm9v bCAqZW5hYmxlZCkKK3sKKwlib29sIGFueV9lbmFibGVkID0gZmFsc2U7CisJc3RydWN0IGRybV9j b25uZWN0b3IgKmNvbm5lY3RvcjsKKwlpbnQgaSA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgY29u bmVjdG9yX2NvdW50OyBpKyspIHsKKwkJY29ubmVjdG9yID0gY29ubmVjdG9yc1tpXTsKKwkJZW5h YmxlZFtpXSA9IGRybV9jb25uZWN0b3JfZW5hYmxlZChjb25uZWN0b3IsIHRydWUpOworCQlEUk1f REVCVUdfS01TKCJjb25uZWN0b3IgJWQgZW5hYmxlZD8gJXNcbiIsIGNvbm5lY3Rvci0+YmFzZS5p ZCwKKwkJCSAgICAgIGNvbm5lY3Rvci0+ZGlzcGxheV9pbmZvLm5vbl9kZXNrdG9wID8gIm5vbiBk ZXNrdG9wIiA6IGVuYWJsZWRbaV0gPyAieWVzIiA6ICJubyIpOworCisJCWFueV9lbmFibGVkIHw9 IGVuYWJsZWRbaV07CisJfQorCisJaWYgKGFueV9lbmFibGVkKQorCQlyZXR1cm47CisKKwlmb3Ig KGkgPSAwOyBpIDwgY29ubmVjdG9yX2NvdW50OyBpKyspCisJCWVuYWJsZWRbaV0gPSBkcm1fY29u bmVjdG9yX2VuYWJsZWQoY29ubmVjdG9yc1tpXSwgZmFsc2UpOworfQorCitzdGF0aWMgYm9vbCBk cm1fY2xpZW50X3RhcmdldF9jbG9uZWQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCQkgICAg IHN0cnVjdCBkcm1fY29ubmVjdG9yICoqY29ubmVjdG9ycywKKwkJCQkgICAgIHVuc2lnbmVkIGlu dCBjb25uZWN0b3JfY291bnQsCisJCQkJICAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqKm1v ZGVzLAorCQkJCSAgICAgc3RydWN0IGRybV9jbGllbnRfb2Zmc2V0ICpvZmZzZXRzLAorCQkJCSAg ICAgYm9vbCAqZW5hYmxlZCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQoreworCWludCBjb3VudCwg aSwgajsKKwlib29sIGNhbl9jbG9uZSA9IGZhbHNlOworCXN0cnVjdCBkcm1fZGlzcGxheV9tb2Rl ICpkbXRfbW9kZSwgKm1vZGU7CisKKwkvKiBvbmx5IGNvbnRlbXBsYXRlIGNsb25pbmcgaW4gdGhl IHNpbmdsZSBjcnRjIGNhc2UgKi8KKwlpZiAoZGV2LT5tb2RlX2NvbmZpZy5udW1fY3J0YyA+IDEp CisJCXJldHVybiBmYWxzZTsKKworCWNvdW50ID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgY29ubmVj dG9yX2NvdW50OyBpKyspIHsKKwkJaWYgKGVuYWJsZWRbaV0pCisJCQljb3VudCsrOworCX0KKwor CS8qIG9ubHkgY29udGVtcGxhdGUgY2xvbmluZyBpZiBtb3JlIHRoYW4gb25lIGNvbm5lY3RvciBp cyBlbmFibGVkICovCisJaWYgKGNvdW50IDw9IDEpCisJCXJldHVybiBmYWxzZTsKKworCS8qIGNo ZWNrIHRoZSBjb21tYW5kIGxpbmUgb3IgaWYgbm90aGluZyBjb21tb24gcGljayAxMDI0eDc2OCAq LworCWNhbl9jbG9uZSA9IHRydWU7CisJZm9yIChpID0gMDsgaSA8IGNvbm5lY3Rvcl9jb3VudDsg aSsrKSB7CisJCWlmICghZW5hYmxlZFtpXSkKKwkJCWNvbnRpbnVlOworCQltb2Rlc1tpXSA9IGRy bV9jb25uZWN0b3JfcGlja19jbWRsaW5lX21vZGUoY29ubmVjdG9yc1tpXSk7CisJCWlmICghbW9k ZXNbaV0pIHsKKwkJCWNhbl9jbG9uZSA9IGZhbHNlOworCQkJYnJlYWs7CisJCX0KKwkJZm9yIChq ID0gMDsgaiA8IGk7IGorKykgeworCQkJaWYgKCFlbmFibGVkW2pdKQorCQkJCWNvbnRpbnVlOwor CQkJaWYgKCFkcm1fbW9kZV9tYXRjaChtb2Rlc1tqXSwgbW9kZXNbaV0sCisJCQkJCSAgICBEUk1f TU9ERV9NQVRDSF9USU1JTkdTIHwKKwkJCQkJICAgIERSTV9NT0RFX01BVENIX0NMT0NLIHwKKwkJ CQkJICAgIERSTV9NT0RFX01BVENIX0ZMQUdTIHwKKwkJCQkJICAgIERSTV9NT0RFX01BVENIXzNE X0ZMQUdTKSkKKwkJCQljYW5fY2xvbmUgPSBmYWxzZTsKKwkJfQorCX0KKworCWlmIChjYW5fY2xv bmUpIHsKKwkJRFJNX0RFQlVHX0tNUygiY2FuIGNsb25lIHVzaW5nIGNvbW1hbmQgbGluZVxuIik7 CisJCXJldHVybiB0cnVlOworCX0KKworCS8qIHRyeSBhbmQgZmluZCBhIDEwMjR4NzY4IG1vZGUg b24gZWFjaCBjb25uZWN0b3IgKi8KKwljYW5fY2xvbmUgPSB0cnVlOworCWRtdF9tb2RlID0gZHJt X21vZGVfZmluZF9kbXQoZGV2LCAxMDI0LCA3NjgsIDYwLCBmYWxzZSk7CisKKwlmb3IgKGkgPSAw OyBpIDwgY29ubmVjdG9yX2NvdW50OyBpKyspIHsKKwkJaWYgKCFlbmFibGVkW2ldKQorCQkJY29u dGludWU7CisKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShtb2RlLCAmY29ubmVjdG9yc1tpXS0+bW9k ZXMsIGhlYWQpIHsKKwkJCWlmIChkcm1fbW9kZV9tYXRjaChtb2RlLCBkbXRfbW9kZSwKKwkJCQkJ ICAgRFJNX01PREVfTUFUQ0hfVElNSU5HUyB8CisJCQkJCSAgIERSTV9NT0RFX01BVENIX0NMT0NL IHwKKwkJCQkJICAgRFJNX01PREVfTUFUQ0hfRkxBR1MgfAorCQkJCQkgICBEUk1fTU9ERV9NQVRD SF8zRF9GTEFHUykpCisJCQkJbW9kZXNbaV0gPSBtb2RlOworCQl9CisJCWlmICghbW9kZXNbaV0p CisJCQljYW5fY2xvbmUgPSBmYWxzZTsKKwl9CisKKwlpZiAoY2FuX2Nsb25lKSB7CisJCURSTV9E RUJVR19LTVMoImNhbiBjbG9uZSB1c2luZyAxMDI0eDc2OFxuIik7CisJCXJldHVybiB0cnVlOwor CX0KKwlEUk1fSU5GTygia21zOiBjYW4ndCBlbmFibGUgY2xvbmluZyB3aGVuIHdlIHByb2JhYmx5 IHdhbnRlZCB0by5cbiIpOworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGludCBkcm1fY2xp ZW50X2dldF90aWxlX29mZnNldHMoc3RydWN0IGRybV9jb25uZWN0b3IgKipjb25uZWN0b3JzLAor CQkJCSAgICAgICB1bnNpZ25lZCBpbnQgY29ubmVjdG9yX2NvdW50LAorCQkJCSAgICAgICBzdHJ1 Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqKm1vZGVzLAorCQkJCSAgICAgICBzdHJ1Y3QgZHJtX2NsaWVu dF9vZmZzZXQgKm9mZnNldHMsCisJCQkJICAgICAgIGludCBpZHgsCisJCQkJICAgICAgIGludCBo X2lkeCwgaW50IHZfaWR4KQoreworCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3I7CisJ aW50IGk7CisJaW50IGhvZmZzZXQgPSAwLCB2b2Zmc2V0ID0gMDsKKworCWZvciAoaSA9IDA7IGkg PCBjb25uZWN0b3JfY291bnQ7IGkrKykgeworCQljb25uZWN0b3IgPSBjb25uZWN0b3JzW2ldOwor CQlpZiAoIWNvbm5lY3Rvci0+aGFzX3RpbGUpCisJCQljb250aW51ZTsKKworCQlpZiAoIW1vZGVz W2ldICYmIChoX2lkeCB8fCB2X2lkeCkpIHsKKwkJCURSTV9ERUJVR19LTVMoIm5vIG1vZGVzIGZv ciBjb25uZWN0b3IgdGlsZWQgJWQgJWRcbiIsIGksCisJCQkJICAgICAgY29ubmVjdG9yLT5iYXNl LmlkKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChjb25uZWN0b3ItPnRpbGVfaF9sb2MgPCBo X2lkeCkKKwkJCWhvZmZzZXQgKz0gbW9kZXNbaV0tPmhkaXNwbGF5OworCisJCWlmIChjb25uZWN0 b3ItPnRpbGVfdl9sb2MgPCB2X2lkeCkKKwkJCXZvZmZzZXQgKz0gbW9kZXNbaV0tPnZkaXNwbGF5 OworCX0KKwlvZmZzZXRzW2lkeF0ueCA9IGhvZmZzZXQ7CisJb2Zmc2V0c1tpZHhdLnkgPSB2b2Zm c2V0OworCURSTV9ERUJVR19LTVMoInJldHVybmVkICVkICVkIGZvciAlZCAlZFxuIiwgaG9mZnNl dCwgdm9mZnNldCwgaF9pZHgsIHZfaWR4KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGJvb2wg ZHJtX2NsaWVudF90YXJnZXRfcHJlZmVycmVkKHN0cnVjdCBkcm1fY29ubmVjdG9yICoqY29ubmVj dG9ycywKKwkJCQkJdW5zaWduZWQgaW50IGNvbm5lY3Rvcl9jb3VudCwKKwkJCQkJc3RydWN0IGRy bV9kaXNwbGF5X21vZGUgKiptb2RlcywKKwkJCQkJc3RydWN0IGRybV9jbGllbnRfb2Zmc2V0ICpv ZmZzZXRzLAorCQkJCQlib29sICplbmFibGVkLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisJ Y29uc3QgdTY0IG1hc2sgPSBCSVRfVUxMKGNvbm5lY3Rvcl9jb3VudCkgLSAxOworCXN0cnVjdCBk cm1fY29ubmVjdG9yICpjb25uZWN0b3I7CisJdTY0IGNvbm5fY29uZmlndXJlZCA9IDA7CisJaW50 IHRpbGVfcGFzcyA9IDA7CisJaW50IGk7CisKK3JldHJ5OgorCWZvciAoaSA9IDA7IGkgPCBjb25u ZWN0b3JfY291bnQ7IGkrKykgeworCQljb25uZWN0b3IgPSBjb25uZWN0b3JzW2ldOworCisJCWlm IChjb25uX2NvbmZpZ3VyZWQgJiBCSVRfVUxMKGkpKQorCQkJY29udGludWU7CisKKwkJaWYgKGVu YWJsZWRbaV0gPT0gZmFsc2UpIHsKKwkJCWNvbm5fY29uZmlndXJlZCB8PSBCSVRfVUxMKGkpOwor CQkJY29udGludWU7CisJCX0KKworCQkvKiBmaXJzdCBwYXNzIG92ZXIgYWxsIHRoZSB1bnRpbGVk IGNvbm5lY3RvcnMgKi8KKwkJaWYgKHRpbGVfcGFzcyA9PSAwICYmIGNvbm5lY3Rvci0+aGFzX3Rp bGUpCisJCQljb250aW51ZTsKKworCQlpZiAodGlsZV9wYXNzID09IDEpIHsKKwkJCWlmIChjb25u ZWN0b3ItPnRpbGVfaF9sb2MgIT0gMCB8fAorCQkJICAgIGNvbm5lY3Rvci0+dGlsZV92X2xvYyAh PSAwKQorCQkJCWNvbnRpbnVlOworCisJCX0gZWxzZSB7CisJCQlpZiAoY29ubmVjdG9yLT50aWxl X2hfbG9jICE9IHRpbGVfcGFzcyAtIDEgJiYKKwkJCSAgICBjb25uZWN0b3ItPnRpbGVfdl9sb2Mg IT0gdGlsZV9wYXNzIC0gMSkKKwkJCS8qIGlmIHRoaXMgdGlsZV9wYXNzIGRvZXNuJ3QgY292ZXIg YW55IG9mIHRoZSB0aWxlcyAtIGtlZXAgZ29pbmcgKi8KKwkJCQljb250aW51ZTsKKworCQkJLyoK KwkJCSAqIGZpbmQgdGhlIHRpbGUgb2Zmc2V0cyBmb3IgdGhpcyBwYXNzIC0gbmVlZCB0byBmaW5k CisJCQkgKiBhbGwgdGlsZXMgbGVmdCBhbmQgYWJvdmUKKwkJCSAqLworCQkJZHJtX2NsaWVudF9n ZXRfdGlsZV9vZmZzZXRzKGNvbm5lY3RvcnMsIGNvbm5lY3Rvcl9jb3VudCwgbW9kZXMsIG9mZnNl dHMsIGksCisJCQkJCQkgICAgY29ubmVjdG9yLT50aWxlX2hfbG9jLCBjb25uZWN0b3ItPnRpbGVf dl9sb2MpOworCQl9CisJCURSTV9ERUJVR19LTVMoImxvb2tpbmcgZm9yIGNtZGxpbmUgbW9kZSBv biBjb25uZWN0b3IgJWRcbiIsCisJCQkgICAgICBjb25uZWN0b3ItPmJhc2UuaWQpOworCisJCS8q IGdvdCBmb3IgY29tbWFuZCBsaW5lIG1vZGUgZmlyc3QgKi8KKwkJbW9kZXNbaV0gPSBkcm1fY29u bmVjdG9yX3BpY2tfY21kbGluZV9tb2RlKGNvbm5lY3Rvcik7CisJCWlmICghbW9kZXNbaV0pIHsK KwkJCURSTV9ERUJVR19LTVMoImxvb2tpbmcgZm9yIHByZWZlcnJlZCBtb2RlIG9uIGNvbm5lY3Rv ciAlZCAlZFxuIiwKKwkJCQkgICAgICBjb25uZWN0b3ItPmJhc2UuaWQsIGNvbm5lY3Rvci0+dGls ZV9ncm91cCA/IGNvbm5lY3Rvci0+dGlsZV9ncm91cC0+aWQgOiAwKTsKKwkJCW1vZGVzW2ldID0g ZHJtX2Nvbm5lY3Rvcl9oYXNfcHJlZmVycmVkX21vZGUoY29ubmVjdG9yLCB3aWR0aCwgaGVpZ2h0 KTsKKwkJfQorCQkvKiBObyBwcmVmZXJyZWQgbW9kZXMsIHBpY2sgb25lIG9mZiB0aGUgbGlzdCAq LworCQlpZiAoIW1vZGVzW2ldICYmICFsaXN0X2VtcHR5KCZjb25uZWN0b3ItPm1vZGVzKSkgewor CQkJbGlzdF9mb3JfZWFjaF9lbnRyeShtb2Rlc1tpXSwgJmNvbm5lY3Rvci0+bW9kZXMsIGhlYWQp CisJCQkJYnJlYWs7CisJCX0KKwkJRFJNX0RFQlVHX0tNUygiZm91bmQgbW9kZSAlc1xuIiwgbW9k ZXNbaV0gPyBtb2Rlc1tpXS0+bmFtZSA6CisJCQkgICJub25lIik7CisJCWNvbm5fY29uZmlndXJl ZCB8PSBCSVRfVUxMKGkpOworCX0KKworCWlmICgoY29ubl9jb25maWd1cmVkICYgbWFzaykgIT0g bWFzaykgeworCQl0aWxlX3Bhc3MrKzsKKwkJZ290byByZXRyeTsKKwl9CisJcmV0dXJuIHRydWU7 Cit9CisKK3N0YXRpYyBib29sIGNvbm5lY3Rvcl9oYXNfcG9zc2libGVfY3J0YyhzdHJ1Y3QgZHJt X2Nvbm5lY3RvciAqY29ubmVjdG9yLAorCQkJCQlzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCit7CisJ c3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyOworCWludCBpOworCisJZHJtX2Nvbm5lY3Rvcl9m b3JfZWFjaF9wb3NzaWJsZV9lbmNvZGVyKGNvbm5lY3RvciwgZW5jb2RlciwgaSkgeworCQlpZiAo ZW5jb2Rlci0+cG9zc2libGVfY3J0Y3MgJiBkcm1fY3J0Y19tYXNrKGNydGMpKQorCQkJcmV0dXJu IHRydWU7CisJfQorCisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW50IGRybV9jbGllbnRf cGlja19jcnRjcyhzdHJ1Y3QgZHJtX2NsaWVudF9kZXYgKmNsaWVudCwKKwkJCQkgc3RydWN0IGRy bV9jb25uZWN0b3IgKipjb25uZWN0b3JzLAorCQkJCSB1bnNpZ25lZCBpbnQgY29ubmVjdG9yX2Nv dW50LAorCQkJCSBzdHJ1Y3QgZHJtX2NydGMgKipiZXN0X2NydGNzLAorCQkJCSBzdHJ1Y3QgZHJt X2Rpc3BsYXlfbW9kZSAqKm1vZGVzLAorCQkJCSBpbnQgbiwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0 KQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjbGllbnQtPmRldjsKKwlzdHJ1Y3QgZHJt X2Nvbm5lY3RvciAqY29ubmVjdG9yOworCWludCBteV9zY29yZSwgYmVzdF9zY29yZSwgc2NvcmU7 CisJc3RydWN0IGRybV9jcnRjICoqY3J0Y3MsICpjcnRjOworCXN0cnVjdCBkcm1fbW9kZV9zZXQg Km1vZGVzZXQ7CisJaW50IG87CisKKwlpZiAobiA9PSBjb25uZWN0b3JfY291bnQpCisJCXJldHVy biAwOworCisJY29ubmVjdG9yID0gY29ubmVjdG9yc1tuXTsKKworCWJlc3RfY3J0Y3Nbbl0gPSBO VUxMOworCWJlc3Rfc2NvcmUgPSBkcm1fY2xpZW50X3BpY2tfY3J0Y3MoY2xpZW50LCBjb25uZWN0 b3JzLCBjb25uZWN0b3JfY291bnQsCisJCQkJCSAgIGJlc3RfY3J0Y3MsIG1vZGVzLCBuICsgMSwg d2lkdGgsIGhlaWdodCk7CisJaWYgKG1vZGVzW25dID09IE5VTEwpCisJCXJldHVybiBiZXN0X3Nj b3JlOworCisJY3J0Y3MgPSBrY2FsbG9jKGNvbm5lY3Rvcl9jb3VudCwgc2l6ZW9mKCpjcnRjcyks IEdGUF9LRVJORUwpOworCWlmICghY3J0Y3MpCisJCXJldHVybiBiZXN0X3Njb3JlOworCisJbXlf c2NvcmUgPSAxOworCWlmIChjb25uZWN0b3ItPnN0YXR1cyA9PSBjb25uZWN0b3Jfc3RhdHVzX2Nv bm5lY3RlZCkKKwkJbXlfc2NvcmUrKzsKKwlpZiAoY29ubmVjdG9yLT5jbWRsaW5lX21vZGUuc3Bl Y2lmaWVkKQorCQlteV9zY29yZSsrOworCWlmIChkcm1fY29ubmVjdG9yX2hhc19wcmVmZXJyZWRf bW9kZShjb25uZWN0b3IsIHdpZHRoLCBoZWlnaHQpKQorCQlteV9zY29yZSsrOworCisJLyoKKwkg KiBzZWxlY3QgYSBjcnRjIGZvciB0aGlzIGNvbm5lY3RvciBhbmQgdGhlbiBhdHRlbXB0IHRvIGNv bmZpZ3VyZQorCSAqIHJlbWFpbmluZyBjb25uZWN0b3JzCisJICovCisJZHJtX2NsaWVudF9mb3Jf ZWFjaF9tb2Rlc2V0KG1vZGVzZXQsIGNsaWVudCkgeworCQljcnRjID0gbW9kZXNldC0+Y3J0YzsK KworCQlpZiAoIWNvbm5lY3Rvcl9oYXNfcG9zc2libGVfY3J0Yyhjb25uZWN0b3IsIGNydGMpKQor CQkJY29udGludWU7CisKKwkJZm9yIChvID0gMDsgbyA8IG47IG8rKykKKwkJCWlmIChiZXN0X2Ny dGNzW29dID09IGNydGMpCisJCQkJYnJlYWs7CisKKwkJaWYgKG8gPCBuKSB7CisJCQkvKiBpZ25v cmUgY2xvbmluZyB1bmxlc3Mgb25seSBhIHNpbmdsZSBjcnRjICovCisJCQlpZiAoZGV2LT5tb2Rl X2NvbmZpZy5udW1fY3J0YyA+IDEpCisJCQkJY29udGludWU7CisKKwkJCWlmICghZHJtX21vZGVf ZXF1YWwobW9kZXNbb10sIG1vZGVzW25dKSkKKwkJCQljb250aW51ZTsKKwkJfQorCisJCWNydGNz W25dID0gY3J0YzsKKwkJbWVtY3B5KGNydGNzLCBiZXN0X2NydGNzLCBuICogc2l6ZW9mKCpjcnRj cykpOworCQlzY29yZSA9IG15X3Njb3JlICsgZHJtX2NsaWVudF9waWNrX2NydGNzKGNsaWVudCwg Y29ubmVjdG9ycywgY29ubmVjdG9yX2NvdW50LAorCQkJCQkJCSBjcnRjcywgbW9kZXMsIG4gKyAx LCB3aWR0aCwgaGVpZ2h0KTsKKwkJaWYgKHNjb3JlID4gYmVzdF9zY29yZSkgeworCQkJYmVzdF9z Y29yZSA9IHNjb3JlOworCQkJbWVtY3B5KGJlc3RfY3J0Y3MsIGNydGNzLCBjb25uZWN0b3JfY291 bnQgKiBzaXplb2YoKmNydGNzKSk7CisJCX0KKwl9CisKKwlrZnJlZShjcnRjcyk7CisJcmV0dXJu IGJlc3Rfc2NvcmU7Cit9CisKKy8qIFRyeSB0byByZWFkIHRoZSBCSU9TIGRpc3BsYXkgY29uZmln dXJhdGlvbiBhbmQgdXNlIGl0IGZvciB0aGUgaW5pdGlhbCBjb25maWcgKi8KK3N0YXRpYyBib29s IGRybV9jbGllbnRfZmlybXdhcmVfY29uZmlnKHN0cnVjdCBkcm1fY2xpZW50X2RldiAqY2xpZW50 LAorCQkJCSAgICAgICBzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqKmNvbm5lY3RvcnMsCisJCQkJICAg ICAgIHVuc2lnbmVkIGludCBjb25uZWN0b3JfY291bnQsCisJCQkJICAgICAgIHN0cnVjdCBkcm1f Y3J0YyAqKmNydGNzLAorCQkJCSAgICAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqKm1vZGVz LAorCQkJCSAgICAgICBzdHJ1Y3QgZHJtX2NsaWVudF9vZmZzZXQgKm9mZnNldHMsCisJCQkJICAg ICAgIGJvb2wgKmVuYWJsZWQsIGludCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKwl1bnNpZ25lZCBp bnQgY291bnQgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGNvbm5lY3Rvcl9jb3VudCwgQklUU19QRVJf TE9ORyk7CisJdW5zaWduZWQgbG9uZyBjb25uX2NvbmZpZ3VyZWQsIGNvbm5fc2VxLCBtYXNrOwor CXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjbGllbnQtPmRldjsKKwlpbnQgaSwgajsKKwlib29s ICpzYXZlX2VuYWJsZWQ7CisJYm9vbCBmYWxsYmFjayA9IHRydWUsIHJldCA9IHRydWU7CisJaW50 IG51bV9jb25uZWN0b3JzX2VuYWJsZWQgPSAwOworCWludCBudW1fY29ubmVjdG9yc19kZXRlY3Rl ZCA9IDA7CisJc3RydWN0IGRybV9tb2Rlc2V0X2FjcXVpcmVfY3R4IGN0eDsKKworCWlmICghZHJt X2Rydl91c2VzX2F0b21pY19tb2Rlc2V0KGRldikpCisJCXJldHVybiBmYWxzZTsKKworCXNhdmVf ZW5hYmxlZCA9IGtjYWxsb2MoY291bnQsIHNpemVvZihib29sKSwgR0ZQX0tFUk5FTCk7CisJaWYg KCFzYXZlX2VuYWJsZWQpCisJCXJldHVybiBmYWxzZTsKKworCWRybV9tb2Rlc2V0X2FjcXVpcmVf aW5pdCgmY3R4LCAwKTsKKworCXdoaWxlIChkcm1fbW9kZXNldF9sb2NrX2FsbF9jdHgoZGV2LCAm Y3R4KSAhPSAwKQorCQlkcm1fbW9kZXNldF9iYWNrb2ZmKCZjdHgpOworCisJbWVtY3B5KHNhdmVf ZW5hYmxlZCwgZW5hYmxlZCwgY291bnQpOworCW1hc2sgPSBHRU5NQVNLKGNvdW50IC0gMSwgMCk7 CisJY29ubl9jb25maWd1cmVkID0gMDsKK3JldHJ5OgorCWNvbm5fc2VxID0gY29ubl9jb25maWd1 cmVkOworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCXN0cnVjdCBkcm1fY29ubmVj dG9yICpjb25uZWN0b3I7CisJCXN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcjsKKwkJc3RydWN0 IGRybV9jcnRjICpuZXdfY3J0YzsKKworCQljb25uZWN0b3IgPSBjb25uZWN0b3JzW2ldOworCisJ CWlmIChjb25uX2NvbmZpZ3VyZWQgJiBCSVQoaSkpCisJCQljb250aW51ZTsKKworCQlpZiAoY29u bl9zZXEgPT0gMCAmJiAhY29ubmVjdG9yLT5oYXNfdGlsZSkKKwkJCWNvbnRpbnVlOworCisJCWlm IChjb25uZWN0b3ItPnN0YXR1cyA9PSBjb25uZWN0b3Jfc3RhdHVzX2Nvbm5lY3RlZCkKKwkJCW51 bV9jb25uZWN0b3JzX2RldGVjdGVkKys7CisKKwkJaWYgKCFlbmFibGVkW2ldKSB7CisJCQlEUk1f REVCVUdfS01TKCJjb25uZWN0b3IgJXMgbm90IGVuYWJsZWQsIHNraXBwaW5nXG4iLAorCQkJCSAg ICAgIGNvbm5lY3Rvci0+bmFtZSk7CisJCQljb25uX2NvbmZpZ3VyZWQgfD0gQklUKGkpOworCQkJ Y29udGludWU7CisJCX0KKworCQlpZiAoY29ubmVjdG9yLT5mb3JjZSA9PSBEUk1fRk9SQ0VfT0ZG KSB7CisJCQlEUk1fREVCVUdfS01TKCJjb25uZWN0b3IgJXMgaXMgZGlzYWJsZWQgYnkgdXNlciwg c2tpcHBpbmdcbiIsCisJCQkJICAgICAgY29ubmVjdG9yLT5uYW1lKTsKKwkJCWVuYWJsZWRbaV0g PSBmYWxzZTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJZW5jb2RlciA9IGNvbm5lY3Rvci0+c3Rh dGUtPmJlc3RfZW5jb2RlcjsKKwkJaWYgKCFlbmNvZGVyIHx8IFdBUk5fT04oIWNvbm5lY3Rvci0+ c3RhdGUtPmNydGMpKSB7CisJCQlpZiAoY29ubmVjdG9yLT5mb3JjZSA+IERSTV9GT1JDRV9PRkYp CisJCQkJZ290byBiYWlsOworCisJCQlEUk1fREVCVUdfS01TKCJjb25uZWN0b3IgJXMgaGFzIG5v IGVuY29kZXIgb3IgY3J0Yywgc2tpcHBpbmdcbiIsCisJCQkJICAgICAgY29ubmVjdG9yLT5uYW1l KTsKKwkJCWVuYWJsZWRbaV0gPSBmYWxzZTsKKwkJCWNvbm5fY29uZmlndXJlZCB8PSBCSVQoaSk7 CisJCQljb250aW51ZTsKKwkJfQorCisJCW51bV9jb25uZWN0b3JzX2VuYWJsZWQrKzsKKworCQlu ZXdfY3J0YyA9IGNvbm5lY3Rvci0+c3RhdGUtPmNydGM7CisKKwkJLyoKKwkJICogTWFrZSBzdXJl IHdlJ3JlIG5vdCB0cnlpbmcgdG8gZHJpdmUgbXVsdGlwbGUgY29ubmVjdG9ycworCQkgKiB3aXRo IGEgc2luZ2xlIENSVEMsIHNpbmNlIG91ciBjbG9uaW5nIHN1cHBvcnQgbWF5IG5vdAorCQkgKiBt YXRjaCB0aGUgQklPUy4KKwkJICovCisJCWZvciAoaiA9IDA7IGogPCBjb3VudDsgaisrKSB7CisJ CQlpZiAoY3J0Y3Nbal0gPT0gbmV3X2NydGMpIHsKKwkJCQlEUk1fREVCVUdfS01TKCJmYWxsYmFj azogY2xvbmVkIGNvbmZpZ3VyYXRpb25cbiIpOworCQkJCWdvdG8gYmFpbDsKKwkJCX0KKwkJfQor CisJCURSTV9ERUJVR19LTVMoImxvb2tpbmcgZm9yIGNtZGxpbmUgbW9kZSBvbiBjb25uZWN0b3Ig JXNcbiIsCisJCQkgICAgICBjb25uZWN0b3ItPm5hbWUpOworCisJCS8qIGdvIGZvciBjb21tYW5k IGxpbmUgbW9kZSBmaXJzdCAqLworCQltb2Rlc1tpXSA9IGRybV9jb25uZWN0b3JfcGlja19jbWRs aW5lX21vZGUoY29ubmVjdG9yKTsKKworCQkvKiB0cnkgZm9yIHByZWZlcnJlZCBuZXh0ICovCisJ CWlmICghbW9kZXNbaV0pIHsKKwkJCURSTV9ERUJVR19LTVMoImxvb2tpbmcgZm9yIHByZWZlcnJl ZCBtb2RlIG9uIGNvbm5lY3RvciAlcyAlZFxuIiwKKwkJCQkgICAgICBjb25uZWN0b3ItPm5hbWUs IGNvbm5lY3Rvci0+aGFzX3RpbGUpOworCQkJbW9kZXNbaV0gPSBkcm1fY29ubmVjdG9yX2hhc19w cmVmZXJyZWRfbW9kZShjb25uZWN0b3IsIHdpZHRoLCBoZWlnaHQpOworCQl9CisKKwkJLyogTm8g cHJlZmVycmVkIG1vZGUgbWFya2VkIGJ5IHRoZSBFRElEPyBBcmUgdGhlcmUgYW55IG1vZGVzPyAq LworCQlpZiAoIW1vZGVzW2ldICYmICFsaXN0X2VtcHR5KCZjb25uZWN0b3ItPm1vZGVzKSkgewor CQkJRFJNX0RFQlVHX0tNUygidXNpbmcgZmlyc3QgbW9kZSBsaXN0ZWQgb24gY29ubmVjdG9yICVz XG4iLAorCQkJCSAgICAgIGNvbm5lY3Rvci0+bmFtZSk7CisJCQltb2Rlc1tpXSA9IGxpc3RfZmly c3RfZW50cnkoJmNvbm5lY3Rvci0+bW9kZXMsCisJCQkJCQkgICAgc3RydWN0IGRybV9kaXNwbGF5 X21vZGUsCisJCQkJCQkgICAgaGVhZCk7CisJCX0KKworCQkvKiBsYXN0IHJlc29ydDogdXNlIGN1 cnJlbnQgbW9kZSAqLworCQlpZiAoIW1vZGVzW2ldKSB7CisJCQkvKgorCQkJICogSU1QT1JUQU5U OiBXZSB3YW50IHRvIHVzZSB0aGUgYWRqdXN0ZWQgbW9kZSAoaS5lLgorCQkJICogYWZ0ZXIgdGhl IHBhbmVsIGZpdHRlciB1cHNjYWxpbmcpIGFzIHRoZSBpbml0aWFsCisJCQkgKiBjb25maWcsIG5v dCB0aGUgaW5wdXQgbW9kZSwgd2hpY2ggaXMgd2hhdCBjcnRjLT5tb2RlCisJCQkgKiB1c3VhbGx5 IGNvbnRhaW5zLiBCdXQgc2luY2Ugb3VyIGN1cnJlbnQKKwkJCSAqIGNvZGUgcHV0cyBhIG1vZGUg ZGVyaXZlZCBmcm9tIHRoZSBwb3N0LXBmaXQgdGltaW5ncworCQkJICogaW50byBjcnRjLT5tb2Rl IHRoaXMgd29ya3Mgb3V0IGNvcnJlY3RseS4KKwkJCSAqCisJCQkgKiBUaGlzIGlzIGNydGMtPm1v ZGUgYW5kIG5vdCBjcnRjLT5zdGF0ZS0+bW9kZSBmb3IgdGhlCisJCQkgKiBmYXN0Ym9vdCBjaGVj ayB0byB3b3JrIGNvcnJlY3RseS4KKwkJCSAqLworCQkJRFJNX0RFQlVHX0tNUygibG9va2luZyBm b3IgY3VycmVudCBtb2RlIG9uIGNvbm5lY3RvciAlc1xuIiwKKwkJCQkgICAgICBjb25uZWN0b3It Pm5hbWUpOworCQkJbW9kZXNbaV0gPSAmY29ubmVjdG9yLT5zdGF0ZS0+Y3J0Yy0+bW9kZTsKKwkJ fQorCQljcnRjc1tpXSA9IG5ld19jcnRjOworCisJCURSTV9ERUJVR19LTVMoImNvbm5lY3RvciAl cyBvbiBbQ1JUQzolZDolc106ICVkeCVkJXNcbiIsCisJCQkgICAgICBjb25uZWN0b3ItPm5hbWUs CisJCQkgICAgICBjb25uZWN0b3ItPnN0YXRlLT5jcnRjLT5iYXNlLmlkLAorCQkJICAgICAgY29u bmVjdG9yLT5zdGF0ZS0+Y3J0Yy0+bmFtZSwKKwkJCSAgICAgIG1vZGVzW2ldLT5oZGlzcGxheSwg bW9kZXNbaV0tPnZkaXNwbGF5LAorCQkJICAgICAgbW9kZXNbaV0tPmZsYWdzICYgRFJNX01PREVf RkxBR19JTlRFUkxBQ0UgPyAiaSIgOiAiIik7CisKKwkJZmFsbGJhY2sgPSBmYWxzZTsKKwkJY29u bl9jb25maWd1cmVkIHw9IEJJVChpKTsKKwl9CisKKwlpZiAoKGNvbm5fY29uZmlndXJlZCAmIG1h c2spICE9IG1hc2sgJiYgY29ubl9jb25maWd1cmVkICE9IGNvbm5fc2VxKQorCQlnb3RvIHJldHJ5 OworCisJLyoKKwkgKiBJZiB0aGUgQklPUyBkaWRuJ3QgZW5hYmxlIGV2ZXJ5dGhpbmcgaXQgY291 bGQsIGZhbGwgYmFjayB0byBoYXZlIHRoZQorCSAqIHNhbWUgdXNlciBleHBlcmllbmNpbmcgb2Yg bGlnaHRpbmcgdXAgYXMgbXVjaCBhcyBwb3NzaWJsZSBsaWtlIHRoZQorCSAqIGZiZGV2IGhlbHBl ciBsaWJyYXJ5LgorCSAqLworCWlmIChudW1fY29ubmVjdG9yc19lbmFibGVkICE9IG51bV9jb25u ZWN0b3JzX2RldGVjdGVkICYmCisJICAgIG51bV9jb25uZWN0b3JzX2VuYWJsZWQgPCBkZXYtPm1v ZGVfY29uZmlnLm51bV9jcnRjKSB7CisJCURSTV9ERUJVR19LTVMoImZhbGxiYWNrOiBOb3QgYWxs IG91dHB1dHMgZW5hYmxlZFxuIik7CisJCURSTV9ERUJVR19LTVMoIkVuYWJsZWQ6ICVpLCBkZXRl Y3RlZDogJWlcbiIsIG51bV9jb25uZWN0b3JzX2VuYWJsZWQsCisJCQkgICAgICBudW1fY29ubmVj dG9yc19kZXRlY3RlZCk7CisJCWZhbGxiYWNrID0gdHJ1ZTsKKwl9CisKKwlpZiAoZmFsbGJhY2sp IHsKK2JhaWw6CisJCURSTV9ERUJVR19LTVMoIk5vdCB1c2luZyBmaXJtd2FyZSBjb25maWd1cmF0 aW9uXG4iKTsKKwkJbWVtY3B5KGVuYWJsZWQsIHNhdmVfZW5hYmxlZCwgY291bnQpOworCQlyZXQg PSBmYWxzZTsKKwl9CisKKwlkcm1fbW9kZXNldF9kcm9wX2xvY2tzKCZjdHgpOworCWRybV9tb2Rl c2V0X2FjcXVpcmVfZmluaSgmY3R4KTsKKworCWtmcmVlKHNhdmVfZW5hYmxlZCk7CisJcmV0dXJu IHJldDsKK30KKworLyoqCisgKiBkcm1fY2xpZW50X21vZGVzZXRfcHJvYmUoKSAtIFByb2JlIGZv ciBkaXNwbGF5cworICogQGNsaWVudDogRFJNIGNsaWVudAorICogQHdpZHRoOiBNYXhpbXVtIGRp c3BsYXkgbW9kZSB3aWR0aCAob3B0aW9uYWwpCisgKiBAaGVpZ2h0OiBNYXhpbXVtIGRpc3BsYXkg bW9kZSBoZWlnaHQgKG9wdGlvbmFsKQorICoKKyAqIFRoaXMgZnVuY3Rpb24gc2V0cyB1cCBkaXNw bGF5IHBpcGVsaW5lcyBmb3IgZW5hYmxlZCBjb25uZWN0b3JzIGFuZCBzdG9yZXMgdGhlCisgKiBj b25maWcgaW4gdGhlIGNsaWVudCdzIG1vZGVzZXQgYXJyYXkuCisgKgorICogUmV0dXJuczoKKyAq IFplcm8gb24gc3VjY2VzcyBvciBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgKi8K K2ludCBkcm1fY2xpZW50X21vZGVzZXRfcHJvYmUoc3RydWN0IGRybV9jbGllbnRfZGV2ICpjbGll bnQsIHVuc2lnbmVkIGludCB3aWR0aCwgdW5zaWduZWQgaW50IGhlaWdodCkKK3sKKwlzdHJ1Y3Qg ZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLCAqKmNvbm5lY3RvcnMgPSBOVUxMOworCXN0cnVjdCBk cm1fY29ubmVjdG9yX2xpc3RfaXRlciBjb25uX2l0ZXI7CisJc3RydWN0IGRybV9kZXZpY2UgKmRl diA9IGNsaWVudC0+ZGV2OworCXVuc2lnbmVkIGludCB0b3RhbF9tb2Rlc19jb3VudCA9IDA7CisJ c3RydWN0IGRybV9jbGllbnRfb2Zmc2V0ICpvZmZzZXRzOworCXVuc2lnbmVkIGludCBjb25uZWN0 b3JfY291bnQgPSAwOworCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICoqbW9kZXM7CisJc3RydWN0 IGRybV9jcnRjICoqY3J0Y3M7CisJaW50IGksIHJldCA9IDA7CisJYm9vbCAqZW5hYmxlZDsKKwor CURSTV9ERUJVR19LTVMoIlxuIik7CisKKwlpZiAoIXdpZHRoKQorCQl3aWR0aCA9IGRldi0+bW9k ZV9jb25maWcubWF4X3dpZHRoOworCWlmICghaGVpZ2h0KQorCQloZWlnaHQgPSBkZXYtPm1vZGVf Y29uZmlnLm1heF9oZWlnaHQ7CisKKwlkcm1fY29ubmVjdG9yX2xpc3RfaXRlcl9iZWdpbihkZXYs ICZjb25uX2l0ZXIpOworCWRybV9jbGllbnRfZm9yX2VhY2hfY29ubmVjdG9yX2l0ZXIoY29ubmVj dG9yLCAmY29ubl9pdGVyKSB7CisJCXN0cnVjdCBkcm1fY29ubmVjdG9yICoqdG1wOworCisJCXRt cCA9IGtyZWFsbG9jKGNvbm5lY3RvcnMsIChjb25uZWN0b3JfY291bnQgKyAxKSAqIHNpemVvZigq Y29ubmVjdG9ycyksIEdGUF9LRVJORUwpOworCQlpZiAoIXRtcCkgeworCQkJcmV0ID0gLUVOT01F TTsKKwkJCWdvdG8gZnJlZV9jb25uZWN0b3JzOworCQl9CisKKwkJY29ubmVjdG9ycyA9IHRtcDsK KwkJZHJtX2Nvbm5lY3Rvcl9nZXQoY29ubmVjdG9yKTsKKwkJY29ubmVjdG9yc1tjb25uZWN0b3Jf Y291bnQrK10gPSBjb25uZWN0b3I7CisJfQorCWRybV9jb25uZWN0b3JfbGlzdF9pdGVyX2VuZCgm Y29ubl9pdGVyKTsKKworCWlmICghY29ubmVjdG9yX2NvdW50KQorCQlyZXR1cm4gMDsKKworCWNy dGNzID0ga2NhbGxvYyhjb25uZWN0b3JfY291bnQsIHNpemVvZigqY3J0Y3MpLCBHRlBfS0VSTkVM KTsKKwltb2RlcyA9IGtjYWxsb2MoY29ubmVjdG9yX2NvdW50LCBzaXplb2YoKm1vZGVzKSwgR0ZQ X0tFUk5FTCk7CisJb2Zmc2V0cyA9IGtjYWxsb2MoY29ubmVjdG9yX2NvdW50LCBzaXplb2YoKm9m ZnNldHMpLCBHRlBfS0VSTkVMKTsKKwllbmFibGVkID0ga2NhbGxvYyhjb25uZWN0b3JfY291bnQs IHNpemVvZihib29sKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjcnRjcyB8fCAhbW9kZXMgfHwgIWVu YWJsZWQgfHwgIW9mZnNldHMpIHsKKwkJRFJNX0VSUk9SKCJNZW1vcnkgYWxsb2NhdGlvbiBmYWls ZWRcbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisKKwltdXRleF9sb2Nr KCZjbGllbnQtPm1vZGVzZXRfbXV0ZXgpOworCisJbXV0ZXhfbG9jaygmZGV2LT5tb2RlX2NvbmZp Zy5tdXRleCk7CisJZm9yIChpID0gMDsgaSA8IGNvbm5lY3Rvcl9jb3VudDsgaSsrKQorCQl0b3Rh bF9tb2Rlc19jb3VudCArPSBjb25uZWN0b3JzW2ldLT5mdW5jcy0+ZmlsbF9tb2Rlcyhjb25uZWN0 b3JzW2ldLCB3aWR0aCwgaGVpZ2h0KTsKKwlpZiAoIXRvdGFsX21vZGVzX2NvdW50KQorCQlEUk1f REVCVUdfS01TKCJObyBjb25uZWN0b3JzIHJlcG9ydGVkIGNvbm5lY3RlZCB3aXRoIG1vZGVzXG4i KTsKKwlkcm1fY2xpZW50X2Nvbm5lY3RvcnNfZW5hYmxlZChjb25uZWN0b3JzLCBjb25uZWN0b3Jf Y291bnQsIGVuYWJsZWQpOworCisJaWYgKCFkcm1fY2xpZW50X2Zpcm13YXJlX2NvbmZpZyhjbGll bnQsIGNvbm5lY3RvcnMsIGNvbm5lY3Rvcl9jb3VudCwgY3J0Y3MsCisJCQkJCW1vZGVzLCBvZmZz ZXRzLCBlbmFibGVkLCB3aWR0aCwgaGVpZ2h0KSkgeworCQltZW1zZXQobW9kZXMsIDAsIGNvbm5l Y3Rvcl9jb3VudCAqIHNpemVvZigqbW9kZXMpKTsKKwkJbWVtc2V0KGNydGNzLCAwLCBjb25uZWN0 b3JfY291bnQgKiBzaXplb2YoKmNydGNzKSk7CisJCW1lbXNldChvZmZzZXRzLCAwLCBjb25uZWN0 b3JfY291bnQgKiBzaXplb2YoKm9mZnNldHMpKTsKKworCQlpZiAoIWRybV9jbGllbnRfdGFyZ2V0 X2Nsb25lZChkZXYsIGNvbm5lY3RvcnMsIGNvbm5lY3Rvcl9jb3VudCwgbW9kZXMsCisJCQkJCSAg ICAgIG9mZnNldHMsIGVuYWJsZWQsIHdpZHRoLCBoZWlnaHQpICYmCisJCSAgICAhZHJtX2NsaWVu dF90YXJnZXRfcHJlZmVycmVkKGNvbm5lY3RvcnMsIGNvbm5lY3Rvcl9jb3VudCwgbW9kZXMsCisJ CQkJCQkgb2Zmc2V0cywgZW5hYmxlZCwgd2lkdGgsIGhlaWdodCkpCisJCQlEUk1fRVJST1IoIlVu YWJsZSB0byBmaW5kIGluaXRpYWwgbW9kZXNcbiIpOworCisJCURSTV9ERUJVR19LTVMoInBpY2tp bmcgQ1JUQ3MgZm9yICVkeCVkIGNvbmZpZ1xuIiwKKwkJCSAgICAgIHdpZHRoLCBoZWlnaHQpOwor CisJCWRybV9jbGllbnRfcGlja19jcnRjcyhjbGllbnQsIGNvbm5lY3RvcnMsIGNvbm5lY3Rvcl9j b3VudCwKKwkJCQkgICAgICBjcnRjcywgbW9kZXMsIDAsIHdpZHRoLCBoZWlnaHQpOworCX0KKwlt dXRleF91bmxvY2soJmRldi0+bW9kZV9jb25maWcubXV0ZXgpOworCisJZHJtX2NsaWVudF9tb2Rl c2V0X3JlbGVhc2UoY2xpZW50KTsKKworCWZvciAoaSA9IDA7IGkgPCBjb25uZWN0b3JfY291bnQ7 IGkrKykgeworCQlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSA9IG1vZGVzW2ldOworCQlz dHJ1Y3QgZHJtX2NydGMgKmNydGMgPSBjcnRjc1tpXTsKKwkJc3RydWN0IGRybV9jbGllbnRfb2Zm c2V0ICpvZmZzZXQgPSAmb2Zmc2V0c1tpXTsKKworCQlpZiAobW9kZSAmJiBjcnRjKSB7CisJCQlz dHJ1Y3QgZHJtX21vZGVfc2V0ICptb2Rlc2V0ID0gZHJtX2NsaWVudF9maW5kX21vZGVzZXQoY2xp ZW50LCBjcnRjKTsKKwkJCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IgPSBjb25uZWN0 b3JzW2ldOworCisJCQlEUk1fREVCVUdfS01TKCJkZXNpcmVkIG1vZGUgJXMgc2V0IG9uIGNydGMg JWQgKCVkLCVkKVxuIiwKKwkJCQkgICAgICBtb2RlLT5uYW1lLCBjcnRjLT5iYXNlLmlkLCBvZmZz ZXQtPngsIG9mZnNldC0+eSk7CisKKwkJCWlmIChXQVJOX09OX09OQ0UobW9kZXNldC0+bnVtX2Nv bm5lY3RvcnMgPT0gRFJNX0NMSUVOVF9NQVhfQ0xPTkVEX0NPTk5FQ1RPUlMgfHwKKwkJCQkJIChk ZXYtPm1vZGVfY29uZmlnLm51bV9jcnRjID4gMSAmJiBtb2Rlc2V0LT5udW1fY29ubmVjdG9ycyA9 PSAxKSkpIHsKKwkJCQlyZXQgPSAtRUlOVkFMOworCQkJCWJyZWFrOworCQkJfQorCisJCQltb2Rl c2V0LT5tb2RlID0gZHJtX21vZGVfZHVwbGljYXRlKGRldiwgbW9kZSk7CisJCQlkcm1fY29ubmVj dG9yX2dldChjb25uZWN0b3IpOworCQkJbW9kZXNldC0+Y29ubmVjdG9yc1ttb2Rlc2V0LT5udW1f Y29ubmVjdG9ycysrXSA9IGNvbm5lY3RvcjsKKwkJCW1vZGVzZXQtPnggPSBvZmZzZXQtPng7CisJ CQltb2Rlc2V0LT55ID0gb2Zmc2V0LT55OworCQl9CisJfQorCisJbXV0ZXhfdW5sb2NrKCZjbGll bnQtPm1vZGVzZXRfbXV0ZXgpOworb3V0OgorCWtmcmVlKGNydGNzKTsKKwlrZnJlZShtb2Rlcyk7 CisJa2ZyZWUob2Zmc2V0cyk7CisJa2ZyZWUoZW5hYmxlZCk7CitmcmVlX2Nvbm5lY3RvcnM6CisJ Zm9yIChpID0gMDsgaSA8IGNvbm5lY3Rvcl9jb3VudDsgaSsrKQorCQlkcm1fY29ubmVjdG9yX3B1 dChjb25uZWN0b3JzW2ldKTsKKwlrZnJlZShjb25uZWN0b3JzKTsKKworCXJldHVybiByZXQ7Cit9 CitFWFBPUlRfU1lNQk9MKGRybV9jbGllbnRfbW9kZXNldF9wcm9iZSk7CiAKIC8qKgogICogZHJt X2NsaWVudF9wYW5lbF9yb3RhdGlvbigpIC0gQ2hlY2sgcGFuZWwgb3JpZW50YXRpb24KZGlmZiAt LWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fZmJfaGVscGVyLmMgYi9kcml2ZXJzL2dwdS9kcm0v ZHJtX2ZiX2hlbHBlci5jCmluZGV4IDgwMmI1MDM2ZjM0Ni4uNWI4ZjFiYTEwYTNiIDEwMDY0NAot LS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2ZiX2hlbHBlci5jCisrKyBiL2RyaXZlcnMvZ3B1L2Ry bS9kcm1fZmJfaGVscGVyLmMKQEAgLTQzLDEwICs0Myw2IEBACiAKICNpbmNsdWRlICJkcm1faW50 ZXJuYWwuaCIKIAotc3RydWN0IGRybV9jbGllbnRfb2Zmc2V0IHsKLQlpbnQgeCwgeTsKLX07Ci0K IHN0YXRpYyBib29sIGRybV9mYmRldl9lbXVsYXRpb24gPSB0cnVlOwogbW9kdWxlX3BhcmFtX25h bWVkKGZiZGV2X2VtdWxhdGlvbiwgZHJtX2ZiZGV2X2VtdWxhdGlvbiwgYm9vbCwgMDYwMCk7CiBN T0RVTEVfUEFSTV9ERVNDKGZiZGV2X2VtdWxhdGlvbiwKQEAgLTE2OTgsNjk0ICsxNjk0LDYgQEAg dm9pZCBkcm1fZmJfaGVscGVyX2ZpbGxfaW5mbyhzdHJ1Y3QgZmJfaW5mbyAqaW5mbywKIH0KIEVY UE9SVF9TWU1CT0woZHJtX2ZiX2hlbHBlcl9maWxsX2luZm8pOwogCi1zdGF0aWMgc3RydWN0IGRy bV9kaXNwbGF5X21vZGUgKgotZHJtX2Nvbm5lY3Rvcl9oYXNfcHJlZmVycmVkX21vZGUoc3RydWN0 IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQotewotCXN0 cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShtb2Rl LCAmY29ubmVjdG9yLT5tb2RlcywgaGVhZCkgewotCQlpZiAobW9kZS0+aGRpc3BsYXkgPiB3aWR0 aCB8fAotCQkgICAgbW9kZS0+dmRpc3BsYXkgPiBoZWlnaHQpCi0JCQljb250aW51ZTsKLQkJaWYg KG1vZGUtPnR5cGUgJiBEUk1fTU9ERV9UWVBFX1BSRUZFUlJFRCkKLQkJCXJldHVybiBtb2RlOwot CX0KLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICoK LWRybV9jb25uZWN0b3JfcGlja19jbWRsaW5lX21vZGUoc3RydWN0IGRybV9jb25uZWN0b3IgKmNv bm5lY3RvcikKLXsKLQlzdHJ1Y3QgZHJtX2NtZGxpbmVfbW9kZSAqY21kbGluZV9tb2RlOwotCXN0 cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlOwotCWJvb2wgcHJlZmVyX25vbl9pbnRlcmxhY2U7 Ci0KLQljbWRsaW5lX21vZGUgPSAmY29ubmVjdG9yLT5jbWRsaW5lX21vZGU7Ci0JaWYgKGNtZGxp bmVfbW9kZS0+c3BlY2lmaWVkID09IGZhbHNlKQotCQlyZXR1cm4gTlVMTDsKLQotCS8qIGF0dGVt cHQgdG8gZmluZCBhIG1hdGNoaW5nIG1vZGUgaW4gdGhlIGxpc3Qgb2YgbW9kZXMKLQkgKiAgd2Ug aGF2ZSBnb3R0ZW4gc28gZmFyLCBpZiBub3QgYWRkIGEgQ1ZUIG1vZGUgdGhhdCBjb25mb3Jtcwot CSAqLwotCWlmIChjbWRsaW5lX21vZGUtPnJiIHx8IGNtZGxpbmVfbW9kZS0+bWFyZ2lucykKLQkJ Z290byBjcmVhdGVfbW9kZTsKLQotCXByZWZlcl9ub25faW50ZXJsYWNlID0gIWNtZGxpbmVfbW9k ZS0+aW50ZXJsYWNlOwotYWdhaW46Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShtb2RlLCAmY29ubmVj dG9yLT5tb2RlcywgaGVhZCkgewotCQkvKiBjaGVjayB3aWR0aC9oZWlnaHQgKi8KLQkJaWYgKG1v ZGUtPmhkaXNwbGF5ICE9IGNtZGxpbmVfbW9kZS0+eHJlcyB8fAotCQkgICAgbW9kZS0+dmRpc3Bs YXkgIT0gY21kbGluZV9tb2RlLT55cmVzKQotCQkJY29udGludWU7Ci0KLQkJaWYgKGNtZGxpbmVf bW9kZS0+cmVmcmVzaF9zcGVjaWZpZWQpIHsKLQkJCWlmIChtb2RlLT52cmVmcmVzaCAhPSBjbWRs aW5lX21vZGUtPnJlZnJlc2gpCi0JCQkJY29udGludWU7Ci0JCX0KLQotCQlpZiAoY21kbGluZV9t b2RlLT5pbnRlcmxhY2UpIHsKLQkJCWlmICghKG1vZGUtPmZsYWdzICYgRFJNX01PREVfRkxBR19J TlRFUkxBQ0UpKQotCQkJCWNvbnRpbnVlOwotCQl9IGVsc2UgaWYgKHByZWZlcl9ub25faW50ZXJs YWNlKSB7Ci0JCQlpZiAobW9kZS0+ZmxhZ3MgJiBEUk1fTU9ERV9GTEFHX0lOVEVSTEFDRSkKLQkJ CQljb250aW51ZTsKLQkJfQotCQlyZXR1cm4gbW9kZTsKLQl9Ci0KLQlpZiAocHJlZmVyX25vbl9p bnRlcmxhY2UpIHsKLQkJcHJlZmVyX25vbl9pbnRlcmxhY2UgPSBmYWxzZTsKLQkJZ290byBhZ2Fp bjsKLQl9Ci0KLWNyZWF0ZV9tb2RlOgotCW1vZGUgPSBkcm1fbW9kZV9jcmVhdGVfZnJvbV9jbWRs aW5lX21vZGUoY29ubmVjdG9yLT5kZXYsIGNtZGxpbmVfbW9kZSk7Ci0JbGlzdF9hZGQoJm1vZGUt PmhlYWQsICZjb25uZWN0b3ItPm1vZGVzKTsKLQotCXJldHVybiBtb2RlOwotfQotCi1zdGF0aWMg Ym9vbCBkcm1fY29ubmVjdG9yX2VuYWJsZWQoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3Rv ciwgYm9vbCBzdHJpY3QpCi17Ci0JYm9vbCBlbmFibGU7Ci0KLQlpZiAoY29ubmVjdG9yLT5kaXNw bGF5X2luZm8ubm9uX2Rlc2t0b3ApCi0JCXJldHVybiBmYWxzZTsKLQotCWlmIChzdHJpY3QpCi0J CWVuYWJsZSA9IGNvbm5lY3Rvci0+c3RhdHVzID09IGNvbm5lY3Rvcl9zdGF0dXNfY29ubmVjdGVk OwotCWVsc2UKLQkJZW5hYmxlID0gY29ubmVjdG9yLT5zdGF0dXMgIT0gY29ubmVjdG9yX3N0YXR1 c19kaXNjb25uZWN0ZWQ7Ci0KLQlyZXR1cm4gZW5hYmxlOwotfQotCi1zdGF0aWMgdm9pZCBkcm1f Y2xpZW50X2Nvbm5lY3RvcnNfZW5hYmxlZChzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqKmNvbm5lY3Rv cnMsCi0JCQkJCSAgdW5zaWduZWQgaW50IGNvbm5lY3Rvcl9jb3VudCwKLQkJCQkJICBib29sICpl bmFibGVkKQotewotCWJvb2wgYW55X2VuYWJsZWQgPSBmYWxzZTsKLQlzdHJ1Y3QgZHJtX2Nvbm5l Y3RvciAqY29ubmVjdG9yOwotCWludCBpID0gMDsKLQotCWZvciAoaSA9IDA7IGkgPCBjb25uZWN0 b3JfY291bnQ7IGkrKykgewotCQljb25uZWN0b3IgPSBjb25uZWN0b3JzW2ldOwotCQllbmFibGVk W2ldID0gZHJtX2Nvbm5lY3Rvcl9lbmFibGVkKGNvbm5lY3RvciwgdHJ1ZSk7Ci0JCURSTV9ERUJV R19LTVMoImNvbm5lY3RvciAlZCBlbmFibGVkPyAlc1xuIiwgY29ubmVjdG9yLT5iYXNlLmlkLAot CQkJICAgICAgY29ubmVjdG9yLT5kaXNwbGF5X2luZm8ubm9uX2Rlc2t0b3AgPyAibm9uIGRlc2t0 b3AiIDogZW5hYmxlZFtpXSA/ICJ5ZXMiIDogIm5vIik7Ci0KLQkJYW55X2VuYWJsZWQgfD0gZW5h YmxlZFtpXTsKLQl9Ci0KLQlpZiAoYW55X2VuYWJsZWQpCi0JCXJldHVybjsKLQotCWZvciAoaSA9 IDA7IGkgPCBjb25uZWN0b3JfY291bnQ7IGkrKykKLQkJZW5hYmxlZFtpXSA9IGRybV9jb25uZWN0 b3JfZW5hYmxlZChjb25uZWN0b3JzW2ldLCBmYWxzZSk7Ci19Ci0KLXN0YXRpYyBib29sIGRybV9j bGllbnRfdGFyZ2V0X2Nsb25lZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAotCQkJCSAgICAgc3Ry dWN0IGRybV9jb25uZWN0b3IgKipjb25uZWN0b3JzLAotCQkJCSAgICAgdW5zaWduZWQgaW50IGNv bm5lY3Rvcl9jb3VudCwKLQkJCQkgICAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICoqbW9kZXMs Ci0JCQkJICAgICBzdHJ1Y3QgZHJtX2NsaWVudF9vZmZzZXQgKm9mZnNldHMsCi0JCQkJICAgICBi b29sICplbmFibGVkLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCi17Ci0JaW50IGNvdW50LCBpLCBq OwotCWJvb2wgY2FuX2Nsb25lID0gZmFsc2U7Ci0Jc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmRt dF9tb2RlLCAqbW9kZTsKLQotCS8qIG9ubHkgY29udGVtcGxhdGUgY2xvbmluZyBpbiB0aGUgc2lu Z2xlIGNydGMgY2FzZSAqLwotCWlmIChkZXYtPm1vZGVfY29uZmlnLm51bV9jcnRjID4gMSkKLQkJ cmV0dXJuIGZhbHNlOwotCi0JY291bnQgPSAwOwotCWZvciAoaSA9IDA7IGkgPCBjb25uZWN0b3Jf Y291bnQ7IGkrKykgewotCQlpZiAoZW5hYmxlZFtpXSkKLQkJCWNvdW50Kys7Ci0JfQotCi0JLyog b25seSBjb250ZW1wbGF0ZSBjbG9uaW5nIGlmIG1vcmUgdGhhbiBvbmUgY29ubmVjdG9yIGlzIGVu YWJsZWQgKi8KLQlpZiAoY291bnQgPD0gMSkKLQkJcmV0dXJuIGZhbHNlOwotCi0JLyogY2hlY2sg dGhlIGNvbW1hbmQgbGluZSBvciBpZiBub3RoaW5nIGNvbW1vbiBwaWNrIDEwMjR4NzY4ICovCi0J Y2FuX2Nsb25lID0gdHJ1ZTsKLQlmb3IgKGkgPSAwOyBpIDwgY29ubmVjdG9yX2NvdW50OyBpKysp IHsKLQkJaWYgKCFlbmFibGVkW2ldKQotCQkJY29udGludWU7Ci0JCW1vZGVzW2ldID0gZHJtX2Nv bm5lY3Rvcl9waWNrX2NtZGxpbmVfbW9kZShjb25uZWN0b3JzW2ldKTsKLQkJaWYgKCFtb2Rlc1tp XSkgewotCQkJY2FuX2Nsb25lID0gZmFsc2U7Ci0JCQlicmVhazsKLQkJfQotCQlmb3IgKGogPSAw OyBqIDwgaTsgaisrKSB7Ci0JCQlpZiAoIWVuYWJsZWRbal0pCi0JCQkJY29udGludWU7Ci0JCQlp ZiAoIWRybV9tb2RlX21hdGNoKG1vZGVzW2pdLCBtb2Rlc1tpXSwKLQkJCQkJICAgIERSTV9NT0RF X01BVENIX1RJTUlOR1MgfAotCQkJCQkgICAgRFJNX01PREVfTUFUQ0hfQ0xPQ0sgfAotCQkJCQkg ICAgRFJNX01PREVfTUFUQ0hfRkxBR1MgfAotCQkJCQkgICAgRFJNX01PREVfTUFUQ0hfM0RfRkxB R1MpKQotCQkJCWNhbl9jbG9uZSA9IGZhbHNlOwotCQl9Ci0JfQotCi0JaWYgKGNhbl9jbG9uZSkg ewotCQlEUk1fREVCVUdfS01TKCJjYW4gY2xvbmUgdXNpbmcgY29tbWFuZCBsaW5lXG4iKTsKLQkJ cmV0dXJuIHRydWU7Ci0JfQotCi0JLyogdHJ5IGFuZCBmaW5kIGEgMTAyNHg3NjggbW9kZSBvbiBl YWNoIGNvbm5lY3RvciAqLwotCWNhbl9jbG9uZSA9IHRydWU7Ci0JZG10X21vZGUgPSBkcm1fbW9k ZV9maW5kX2RtdChkZXYsIDEwMjQsIDc2OCwgNjAsIGZhbHNlKTsKLQotCWZvciAoaSA9IDA7IGkg PCBjb25uZWN0b3JfY291bnQ7IGkrKykgewotCQlpZiAoIWVuYWJsZWRbaV0pCi0JCQljb250aW51 ZTsKLQotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG1vZGUsICZjb25uZWN0b3JzW2ldLT5tb2Rlcywg aGVhZCkgewotCQkJaWYgKGRybV9tb2RlX21hdGNoKG1vZGUsIGRtdF9tb2RlLAotCQkJCQkgICBE Uk1fTU9ERV9NQVRDSF9USU1JTkdTIHwKLQkJCQkJICAgRFJNX01PREVfTUFUQ0hfQ0xPQ0sgfAot CQkJCQkgICBEUk1fTU9ERV9NQVRDSF9GTEFHUyB8Ci0JCQkJCSAgIERSTV9NT0RFX01BVENIXzNE X0ZMQUdTKSkKLQkJCQltb2Rlc1tpXSA9IG1vZGU7Ci0JCX0KLQkJaWYgKCFtb2Rlc1tpXSkKLQkJ CWNhbl9jbG9uZSA9IGZhbHNlOwotCX0KLQotCWlmIChjYW5fY2xvbmUpIHsKLQkJRFJNX0RFQlVH X0tNUygiY2FuIGNsb25lIHVzaW5nIDEwMjR4NzY4XG4iKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQot CURSTV9JTkZPKCJrbXM6IGNhbid0IGVuYWJsZSBjbG9uaW5nIHdoZW4gd2UgcHJvYmFibHkgd2Fu dGVkIHRvLlxuIik7Ci0JcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgaW50IGRybV9jbGllbnRf Z2V0X3RpbGVfb2Zmc2V0cyhzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqKmNvbm5lY3RvcnMsCi0JCQkJ ICAgICAgIHVuc2lnbmVkIGludCBjb25uZWN0b3JfY291bnQsCi0JCQkJICAgICAgIHN0cnVjdCBk cm1fZGlzcGxheV9tb2RlICoqbW9kZXMsCi0JCQkJICAgICAgIHN0cnVjdCBkcm1fY2xpZW50X29m ZnNldCAqb2Zmc2V0cywKLQkJCQkgICAgICAgaW50IGlkeCwKLQkJCQkgICAgICAgaW50IGhfaWR4 LCBpbnQgdl9pZHgpCi17Ci0Jc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcjsKLQlpbnQg aTsKLQlpbnQgaG9mZnNldCA9IDAsIHZvZmZzZXQgPSAwOwotCi0JZm9yIChpID0gMDsgaSA8IGNv bm5lY3Rvcl9jb3VudDsgaSsrKSB7Ci0JCWNvbm5lY3RvciA9IGNvbm5lY3RvcnNbaV07Ci0JCWlm ICghY29ubmVjdG9yLT5oYXNfdGlsZSkKLQkJCWNvbnRpbnVlOwotCi0JCWlmICghbW9kZXNbaV0g JiYgKGhfaWR4IHx8IHZfaWR4KSkgewotCQkJRFJNX0RFQlVHX0tNUygibm8gbW9kZXMgZm9yIGNv bm5lY3RvciB0aWxlZCAlZCAlZFxuIiwgaSwKLQkJCQkgICAgICBjb25uZWN0b3ItPmJhc2UuaWQp OwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKGNvbm5lY3Rvci0+dGlsZV9oX2xvYyA8IGhfaWR4 KQotCQkJaG9mZnNldCArPSBtb2Rlc1tpXS0+aGRpc3BsYXk7Ci0KLQkJaWYgKGNvbm5lY3Rvci0+ dGlsZV92X2xvYyA8IHZfaWR4KQotCQkJdm9mZnNldCArPSBtb2Rlc1tpXS0+dmRpc3BsYXk7Ci0J fQotCW9mZnNldHNbaWR4XS54ID0gaG9mZnNldDsKLQlvZmZzZXRzW2lkeF0ueSA9IHZvZmZzZXQ7 Ci0JRFJNX0RFQlVHX0tNUygicmV0dXJuZWQgJWQgJWQgZm9yICVkICVkXG4iLCBob2Zmc2V0LCB2 b2Zmc2V0LCBoX2lkeCwgdl9pZHgpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgYm9vbCBkcm1f Y2xpZW50X3RhcmdldF9wcmVmZXJyZWQoc3RydWN0IGRybV9jb25uZWN0b3IgKipjb25uZWN0b3Jz LAotCQkJCQl1bnNpZ25lZCBpbnQgY29ubmVjdG9yX2NvdW50LAotCQkJCQlzdHJ1Y3QgZHJtX2Rp c3BsYXlfbW9kZSAqKm1vZGVzLAotCQkJCQlzdHJ1Y3QgZHJtX2NsaWVudF9vZmZzZXQgKm9mZnNl dHMsCi0JCQkJCWJvb2wgKmVuYWJsZWQsIGludCB3aWR0aCwgaW50IGhlaWdodCkKLXsKLQljb25z dCB1NjQgbWFzayA9IEJJVF9VTEwoY29ubmVjdG9yX2NvdW50KSAtIDE7Ci0Jc3RydWN0IGRybV9j b25uZWN0b3IgKmNvbm5lY3RvcjsKLQl1NjQgY29ubl9jb25maWd1cmVkID0gMDsKLQlpbnQgdGls ZV9wYXNzID0gMDsKLQlpbnQgaTsKLQotcmV0cnk6Ci0JZm9yIChpID0gMDsgaSA8IGNvbm5lY3Rv cl9jb3VudDsgaSsrKSB7Ci0JCWNvbm5lY3RvciA9IGNvbm5lY3RvcnNbaV07Ci0KLQkJaWYgKGNv bm5fY29uZmlndXJlZCAmIEJJVF9VTEwoaSkpCi0JCQljb250aW51ZTsKLQotCQlpZiAoZW5hYmxl ZFtpXSA9PSBmYWxzZSkgewotCQkJY29ubl9jb25maWd1cmVkIHw9IEJJVF9VTEwoaSk7Ci0JCQlj b250aW51ZTsKLQkJfQotCi0JCS8qIGZpcnN0IHBhc3Mgb3ZlciBhbGwgdGhlIHVudGlsZWQgY29u bmVjdG9ycyAqLwotCQlpZiAodGlsZV9wYXNzID09IDAgJiYgY29ubmVjdG9yLT5oYXNfdGlsZSkK LQkJCWNvbnRpbnVlOwotCi0JCWlmICh0aWxlX3Bhc3MgPT0gMSkgewotCQkJaWYgKGNvbm5lY3Rv ci0+dGlsZV9oX2xvYyAhPSAwIHx8Ci0JCQkgICAgY29ubmVjdG9yLT50aWxlX3ZfbG9jICE9IDAp Ci0JCQkJY29udGludWU7Ci0KLQkJfSBlbHNlIHsKLQkJCWlmIChjb25uZWN0b3ItPnRpbGVfaF9s b2MgIT0gdGlsZV9wYXNzIC0gMSAmJgotCQkJICAgIGNvbm5lY3Rvci0+dGlsZV92X2xvYyAhPSB0 aWxlX3Bhc3MgLSAxKQotCQkJLyogaWYgdGhpcyB0aWxlX3Bhc3MgZG9lc24ndCBjb3ZlciBhbnkg b2YgdGhlIHRpbGVzIC0ga2VlcCBnb2luZyAqLwotCQkJCWNvbnRpbnVlOwotCi0JCQkvKgotCQkJ ICogZmluZCB0aGUgdGlsZSBvZmZzZXRzIGZvciB0aGlzIHBhc3MgLSBuZWVkIHRvIGZpbmQKLQkJ CSAqIGFsbCB0aWxlcyBsZWZ0IGFuZCBhYm92ZQotCQkJICovCi0JCQlkcm1fY2xpZW50X2dldF90 aWxlX29mZnNldHMoY29ubmVjdG9ycywgY29ubmVjdG9yX2NvdW50LCBtb2Rlcywgb2Zmc2V0cywg aSwKLQkJCQkJCSAgICBjb25uZWN0b3ItPnRpbGVfaF9sb2MsIGNvbm5lY3Rvci0+dGlsZV92X2xv Yyk7Ci0JCX0KLQkJRFJNX0RFQlVHX0tNUygibG9va2luZyBmb3IgY21kbGluZSBtb2RlIG9uIGNv bm5lY3RvciAlZFxuIiwKLQkJCSAgICAgIGNvbm5lY3Rvci0+YmFzZS5pZCk7Ci0KLQkJLyogZ290 IGZvciBjb21tYW5kIGxpbmUgbW9kZSBmaXJzdCAqLwotCQltb2Rlc1tpXSA9IGRybV9jb25uZWN0 b3JfcGlja19jbWRsaW5lX21vZGUoY29ubmVjdG9yKTsKLQkJaWYgKCFtb2Rlc1tpXSkgewotCQkJ RFJNX0RFQlVHX0tNUygibG9va2luZyBmb3IgcHJlZmVycmVkIG1vZGUgb24gY29ubmVjdG9yICVk ICVkXG4iLAotCQkJCSAgICAgIGNvbm5lY3Rvci0+YmFzZS5pZCwgY29ubmVjdG9yLT50aWxlX2dy b3VwID8gY29ubmVjdG9yLT50aWxlX2dyb3VwLT5pZCA6IDApOwotCQkJbW9kZXNbaV0gPSBkcm1f Y29ubmVjdG9yX2hhc19wcmVmZXJyZWRfbW9kZShjb25uZWN0b3IsIHdpZHRoLCBoZWlnaHQpOwot CQl9Ci0JCS8qIE5vIHByZWZlcnJlZCBtb2RlcywgcGljayBvbmUgb2ZmIHRoZSBsaXN0ICovCi0J CWlmICghbW9kZXNbaV0gJiYgIWxpc3RfZW1wdHkoJmNvbm5lY3Rvci0+bW9kZXMpKSB7Ci0JCQls aXN0X2Zvcl9lYWNoX2VudHJ5KG1vZGVzW2ldLCAmY29ubmVjdG9yLT5tb2RlcywgaGVhZCkKLQkJ CQlicmVhazsKLQkJfQotCQlEUk1fREVCVUdfS01TKCJmb3VuZCBtb2RlICVzXG4iLCBtb2Rlc1tp XSA/IG1vZGVzW2ldLT5uYW1lIDoKLQkJCSAgIm5vbmUiKTsKLQkJY29ubl9jb25maWd1cmVkIHw9 IEJJVF9VTEwoaSk7Ci0JfQotCi0JaWYgKChjb25uX2NvbmZpZ3VyZWQgJiBtYXNrKSAhPSBtYXNr KSB7Ci0JCXRpbGVfcGFzcysrOwotCQlnb3RvIHJldHJ5OwotCX0KLQlyZXR1cm4gdHJ1ZTsKLX0K LQotc3RhdGljIGJvb2wgY29ubmVjdG9yX2hhc19wb3NzaWJsZV9jcnRjKHN0cnVjdCBkcm1fY29u bmVjdG9yICpjb25uZWN0b3IsCi0JCQkJCXN0cnVjdCBkcm1fY3J0YyAqY3J0YykKLXsKLQlzdHJ1 Y3QgZHJtX2VuY29kZXIgKmVuY29kZXI7Ci0JaW50IGk7Ci0KLQlkcm1fY29ubmVjdG9yX2Zvcl9l YWNoX3Bvc3NpYmxlX2VuY29kZXIoY29ubmVjdG9yLCBlbmNvZGVyLCBpKSB7Ci0JCWlmIChlbmNv ZGVyLT5wb3NzaWJsZV9jcnRjcyAmIGRybV9jcnRjX21hc2soY3J0YykpCi0JCQlyZXR1cm4gdHJ1 ZTsKLQl9Ci0KLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyBpbnQgZHJtX2NsaWVudF9waWNr X2NydGNzKHN0cnVjdCBkcm1fY2xpZW50X2RldiAqY2xpZW50LAotCQkJCSBzdHJ1Y3QgZHJtX2Nv bm5lY3RvciAqKmNvbm5lY3RvcnMsCi0JCQkJIHVuc2lnbmVkIGludCBjb25uZWN0b3JfY291bnQs Ci0JCQkJIHN0cnVjdCBkcm1fY3J0YyAqKmJlc3RfY3J0Y3MsCi0JCQkJIHN0cnVjdCBkcm1fZGlz cGxheV9tb2RlICoqbW9kZXMsCi0JCQkJIGludCBuLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCi17 Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNsaWVudC0+ZGV2OwotCXN0cnVjdCBkcm1fY29u bmVjdG9yICpjb25uZWN0b3I7Ci0JaW50IG15X3Njb3JlLCBiZXN0X3Njb3JlLCBzY29yZTsKLQlz dHJ1Y3QgZHJtX2NydGMgKipjcnRjcywgKmNydGM7Ci0Jc3RydWN0IGRybV9tb2RlX3NldCAqbW9k ZXNldDsKLQlpbnQgbzsKLQotCWlmIChuID09IGNvbm5lY3Rvcl9jb3VudCkKLQkJcmV0dXJuIDA7 Ci0KLQljb25uZWN0b3IgPSBjb25uZWN0b3JzW25dOwotCi0JYmVzdF9jcnRjc1tuXSA9IE5VTEw7 Ci0JYmVzdF9zY29yZSA9IGRybV9jbGllbnRfcGlja19jcnRjcyhjbGllbnQsIGNvbm5lY3RvcnMs IGNvbm5lY3Rvcl9jb3VudCwKLQkJCQkJICAgYmVzdF9jcnRjcywgbW9kZXMsIG4gKyAxLCB3aWR0 aCwgaGVpZ2h0KTsKLQlpZiAobW9kZXNbbl0gPT0gTlVMTCkKLQkJcmV0dXJuIGJlc3Rfc2NvcmU7 Ci0KLQljcnRjcyA9IGtjYWxsb2MoY29ubmVjdG9yX2NvdW50LCBzaXplb2YoKmNydGNzKSwgR0ZQ X0tFUk5FTCk7Ci0JaWYgKCFjcnRjcykKLQkJcmV0dXJuIGJlc3Rfc2NvcmU7Ci0KLQlteV9zY29y ZSA9IDE7Ci0JaWYgKGNvbm5lY3Rvci0+c3RhdHVzID09IGNvbm5lY3Rvcl9zdGF0dXNfY29ubmVj dGVkKQotCQlteV9zY29yZSsrOwotCWlmIChjb25uZWN0b3ItPmNtZGxpbmVfbW9kZS5zcGVjaWZp ZWQpCi0JCW15X3Njb3JlKys7Ci0JaWYgKGRybV9jb25uZWN0b3JfaGFzX3ByZWZlcnJlZF9tb2Rl KGNvbm5lY3Rvciwgd2lkdGgsIGhlaWdodCkpCi0JCW15X3Njb3JlKys7Ci0KLQkvKgotCSAqIHNl bGVjdCBhIGNydGMgZm9yIHRoaXMgY29ubmVjdG9yIGFuZCB0aGVuIGF0dGVtcHQgdG8gY29uZmln dXJlCi0JICogcmVtYWluaW5nIGNvbm5lY3RvcnMKLQkgKi8KLQlkcm1fY2xpZW50X2Zvcl9lYWNo X21vZGVzZXQobW9kZXNldCwgY2xpZW50KSB7Ci0JCWNydGMgPSBtb2Rlc2V0LT5jcnRjOwotCi0J CWlmICghY29ubmVjdG9yX2hhc19wb3NzaWJsZV9jcnRjKGNvbm5lY3RvciwgY3J0YykpCi0JCQlj b250aW51ZTsKLQotCQlmb3IgKG8gPSAwOyBvIDwgbjsgbysrKQotCQkJaWYgKGJlc3RfY3J0Y3Nb b10gPT0gY3J0YykKLQkJCQlicmVhazsKLQotCQlpZiAobyA8IG4pIHsKLQkJCS8qIGlnbm9yZSBj bG9uaW5nIHVubGVzcyBvbmx5IGEgc2luZ2xlIGNydGMgKi8KLQkJCWlmIChkZXYtPm1vZGVfY29u ZmlnLm51bV9jcnRjID4gMSkKLQkJCQljb250aW51ZTsKLQotCQkJaWYgKCFkcm1fbW9kZV9lcXVh bChtb2Rlc1tvXSwgbW9kZXNbbl0pKQotCQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJY3J0Y3Nbbl0g PSBjcnRjOwotCQltZW1jcHkoY3J0Y3MsIGJlc3RfY3J0Y3MsIG4gKiBzaXplb2YoKmNydGNzKSk7 Ci0JCXNjb3JlID0gbXlfc2NvcmUgKyBkcm1fY2xpZW50X3BpY2tfY3J0Y3MoY2xpZW50LCBjb25u ZWN0b3JzLCBjb25uZWN0b3JfY291bnQsCi0JCQkJCQkJIGNydGNzLCBtb2RlcywgbiArIDEsIHdp ZHRoLCBoZWlnaHQpOwotCQlpZiAoc2NvcmUgPiBiZXN0X3Njb3JlKSB7Ci0JCQliZXN0X3Njb3Jl ID0gc2NvcmU7Ci0JCQltZW1jcHkoYmVzdF9jcnRjcywgY3J0Y3MsIGNvbm5lY3Rvcl9jb3VudCAq IHNpemVvZigqY3J0Y3MpKTsKLQkJfQotCX0KLQotCWtmcmVlKGNydGNzKTsKLQlyZXR1cm4gYmVz dF9zY29yZTsKLX0KLQotLyogVHJ5IHRvIHJlYWQgdGhlIEJJT1MgZGlzcGxheSBjb25maWd1cmF0 aW9uIGFuZCB1c2UgaXQgZm9yIHRoZSBpbml0aWFsIGNvbmZpZyAqLwotc3RhdGljIGJvb2wgZHJt X2NsaWVudF9maXJtd2FyZV9jb25maWcoc3RydWN0IGRybV9jbGllbnRfZGV2ICpjbGllbnQsCi0J CQkJICAgICAgIHN0cnVjdCBkcm1fY29ubmVjdG9yICoqY29ubmVjdG9ycywKLQkJCQkgICAgICAg dW5zaWduZWQgaW50IGNvbm5lY3Rvcl9jb3VudCwKLQkJCQkgICAgICAgc3RydWN0IGRybV9jcnRj ICoqY3J0Y3MsCi0JCQkJICAgICAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICoqbW9kZXMsCi0J CQkJICAgICAgIHN0cnVjdCBkcm1fY2xpZW50X29mZnNldCAqb2Zmc2V0cywKLQkJCQkgICAgICAg Ym9vbCAqZW5hYmxlZCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQotewotCXVuc2lnbmVkIGludCBj b3VudCA9IG1pbl90KHVuc2lnbmVkIGludCwgY29ubmVjdG9yX2NvdW50LCBCSVRTX1BFUl9MT05H KTsKLQl1bnNpZ25lZCBsb25nIGNvbm5fY29uZmlndXJlZCwgY29ubl9zZXEsIG1hc2s7Ci0Jc3Ry dWN0IGRybV9kZXZpY2UgKmRldiA9IGNsaWVudC0+ZGV2OwotCWludCBpLCBqOwotCWJvb2wgKnNh dmVfZW5hYmxlZDsKLQlib29sIGZhbGxiYWNrID0gdHJ1ZSwgcmV0ID0gdHJ1ZTsKLQlpbnQgbnVt X2Nvbm5lY3RvcnNfZW5hYmxlZCA9IDA7Ci0JaW50IG51bV9jb25uZWN0b3JzX2RldGVjdGVkID0g MDsKLQlzdHJ1Y3QgZHJtX21vZGVzZXRfYWNxdWlyZV9jdHggY3R4OwotCi0JaWYgKCFkcm1fZHJ2 X3VzZXNfYXRvbWljX21vZGVzZXQoZGV2KSkKLQkJcmV0dXJuIGZhbHNlOwotCi0Jc2F2ZV9lbmFi bGVkID0ga2NhbGxvYyhjb3VudCwgc2l6ZW9mKGJvb2wpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXNh dmVfZW5hYmxlZCkKLQkJcmV0dXJuIGZhbHNlOwotCi0JZHJtX21vZGVzZXRfYWNxdWlyZV9pbml0 KCZjdHgsIDApOwotCi0Jd2hpbGUgKGRybV9tb2Rlc2V0X2xvY2tfYWxsX2N0eChkZXYsICZjdHgp ICE9IDApCi0JCWRybV9tb2Rlc2V0X2JhY2tvZmYoJmN0eCk7Ci0KLQltZW1jcHkoc2F2ZV9lbmFi bGVkLCBlbmFibGVkLCBjb3VudCk7Ci0JbWFzayA9IEdFTk1BU0soY291bnQgLSAxLCAwKTsKLQlj b25uX2NvbmZpZ3VyZWQgPSAwOwotcmV0cnk6Ci0JY29ubl9zZXEgPSBjb25uX2NvbmZpZ3VyZWQ7 Ci0JZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJc3RydWN0IGRybV9jb25uZWN0b3Ig KmNvbm5lY3RvcjsKLQkJc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyOwotCQlzdHJ1Y3QgZHJt X2NydGMgKm5ld19jcnRjOwotCi0JCWNvbm5lY3RvciA9IGNvbm5lY3RvcnNbaV07Ci0KLQkJaWYg KGNvbm5fY29uZmlndXJlZCAmIEJJVChpKSkKLQkJCWNvbnRpbnVlOwotCi0JCWlmIChjb25uX3Nl cSA9PSAwICYmICFjb25uZWN0b3ItPmhhc190aWxlKQotCQkJY29udGludWU7Ci0KLQkJaWYgKGNv bm5lY3Rvci0+c3RhdHVzID09IGNvbm5lY3Rvcl9zdGF0dXNfY29ubmVjdGVkKQotCQkJbnVtX2Nv bm5lY3RvcnNfZGV0ZWN0ZWQrKzsKLQotCQlpZiAoIWVuYWJsZWRbaV0pIHsKLQkJCURSTV9ERUJV R19LTVMoImNvbm5lY3RvciAlcyBub3QgZW5hYmxlZCwgc2tpcHBpbmdcbiIsCi0JCQkJICAgICAg Y29ubmVjdG9yLT5uYW1lKTsKLQkJCWNvbm5fY29uZmlndXJlZCB8PSBCSVQoaSk7Ci0JCQljb250 aW51ZTsKLQkJfQotCi0JCWlmIChjb25uZWN0b3ItPmZvcmNlID09IERSTV9GT1JDRV9PRkYpIHsK LQkJCURSTV9ERUJVR19LTVMoImNvbm5lY3RvciAlcyBpcyBkaXNhYmxlZCBieSB1c2VyLCBza2lw cGluZ1xuIiwKLQkJCQkgICAgICBjb25uZWN0b3ItPm5hbWUpOwotCQkJZW5hYmxlZFtpXSA9IGZh bHNlOwotCQkJY29udGludWU7Ci0JCX0KLQotCQllbmNvZGVyID0gY29ubmVjdG9yLT5zdGF0ZS0+ YmVzdF9lbmNvZGVyOwotCQlpZiAoIWVuY29kZXIgfHwgV0FSTl9PTighY29ubmVjdG9yLT5zdGF0 ZS0+Y3J0YykpIHsKLQkJCWlmIChjb25uZWN0b3ItPmZvcmNlID4gRFJNX0ZPUkNFX09GRikKLQkJ CQlnb3RvIGJhaWw7Ci0KLQkJCURSTV9ERUJVR19LTVMoImNvbm5lY3RvciAlcyBoYXMgbm8gZW5j b2RlciBvciBjcnRjLCBza2lwcGluZ1xuIiwKLQkJCQkgICAgICBjb25uZWN0b3ItPm5hbWUpOwot CQkJZW5hYmxlZFtpXSA9IGZhbHNlOwotCQkJY29ubl9jb25maWd1cmVkIHw9IEJJVChpKTsKLQkJ CWNvbnRpbnVlOwotCQl9Ci0KLQkJbnVtX2Nvbm5lY3RvcnNfZW5hYmxlZCsrOwotCi0JCW5ld19j cnRjID0gY29ubmVjdG9yLT5zdGF0ZS0+Y3J0YzsKLQotCQkvKgotCQkgKiBNYWtlIHN1cmUgd2Un cmUgbm90IHRyeWluZyB0byBkcml2ZSBtdWx0aXBsZSBjb25uZWN0b3JzCi0JCSAqIHdpdGggYSBz aW5nbGUgQ1JUQywgc2luY2Ugb3VyIGNsb25pbmcgc3VwcG9ydCBtYXkgbm90Ci0JCSAqIG1hdGNo IHRoZSBCSU9TLgotCQkgKi8KLQkJZm9yIChqID0gMDsgaiA8IGNvdW50OyBqKyspIHsKLQkJCWlm IChjcnRjc1tqXSA9PSBuZXdfY3J0YykgewotCQkJCURSTV9ERUJVR19LTVMoImZhbGxiYWNrOiBj bG9uZWQgY29uZmlndXJhdGlvblxuIik7Ci0JCQkJZ290byBiYWlsOwotCQkJfQotCQl9Ci0KLQkJ RFJNX0RFQlVHX0tNUygibG9va2luZyBmb3IgY21kbGluZSBtb2RlIG9uIGNvbm5lY3RvciAlc1xu IiwKLQkJCSAgICAgIGNvbm5lY3Rvci0+bmFtZSk7Ci0KLQkJLyogZ28gZm9yIGNvbW1hbmQgbGlu ZSBtb2RlIGZpcnN0ICovCi0JCW1vZGVzW2ldID0gZHJtX2Nvbm5lY3Rvcl9waWNrX2NtZGxpbmVf bW9kZShjb25uZWN0b3IpOwotCi0JCS8qIHRyeSBmb3IgcHJlZmVycmVkIG5leHQgKi8KLQkJaWYg KCFtb2Rlc1tpXSkgewotCQkJRFJNX0RFQlVHX0tNUygibG9va2luZyBmb3IgcHJlZmVycmVkIG1v ZGUgb24gY29ubmVjdG9yICVzICVkXG4iLAotCQkJCSAgICAgIGNvbm5lY3Rvci0+bmFtZSwgY29u bmVjdG9yLT5oYXNfdGlsZSk7Ci0JCQltb2Rlc1tpXSA9IGRybV9jb25uZWN0b3JfaGFzX3ByZWZl cnJlZF9tb2RlKGNvbm5lY3Rvciwgd2lkdGgsIGhlaWdodCk7Ci0JCX0KLQotCQkvKiBObyBwcmVm ZXJyZWQgbW9kZSBtYXJrZWQgYnkgdGhlIEVESUQ/IEFyZSB0aGVyZSBhbnkgbW9kZXM/ICovCi0J CWlmICghbW9kZXNbaV0gJiYgIWxpc3RfZW1wdHkoJmNvbm5lY3Rvci0+bW9kZXMpKSB7Ci0JCQlE Uk1fREVCVUdfS01TKCJ1c2luZyBmaXJzdCBtb2RlIGxpc3RlZCBvbiBjb25uZWN0b3IgJXNcbiIs Ci0JCQkJICAgICAgY29ubmVjdG9yLT5uYW1lKTsKLQkJCW1vZGVzW2ldID0gbGlzdF9maXJzdF9l bnRyeSgmY29ubmVjdG9yLT5tb2RlcywKLQkJCQkJCSAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9k ZSwKLQkJCQkJCSAgICBoZWFkKTsKLQkJfQotCi0JCS8qIGxhc3QgcmVzb3J0OiB1c2UgY3VycmVu dCBtb2RlICovCi0JCWlmICghbW9kZXNbaV0pIHsKLQkJCS8qCi0JCQkgKiBJTVBPUlRBTlQ6IFdl IHdhbnQgdG8gdXNlIHRoZSBhZGp1c3RlZCBtb2RlIChpLmUuCi0JCQkgKiBhZnRlciB0aGUgcGFu ZWwgZml0dGVyIHVwc2NhbGluZykgYXMgdGhlIGluaXRpYWwKLQkJCSAqIGNvbmZpZywgbm90IHRo ZSBpbnB1dCBtb2RlLCB3aGljaCBpcyB3aGF0IGNydGMtPm1vZGUKLQkJCSAqIHVzdWFsbHkgY29u dGFpbnMuIEJ1dCBzaW5jZSBvdXIgY3VycmVudAotCQkJICogY29kZSBwdXRzIGEgbW9kZSBkZXJp dmVkIGZyb20gdGhlIHBvc3QtcGZpdCB0aW1pbmdzCi0JCQkgKiBpbnRvIGNydGMtPm1vZGUgdGhp cyB3b3JrcyBvdXQgY29ycmVjdGx5LgotCQkJICoKLQkJCSAqIFRoaXMgaXMgY3J0Yy0+bW9kZSBh bmQgbm90IGNydGMtPnN0YXRlLT5tb2RlIGZvciB0aGUKLQkJCSAqIGZhc3Rib290IGNoZWNrIHRv IHdvcmsgY29ycmVjdGx5LgotCQkJICovCi0JCQlEUk1fREVCVUdfS01TKCJsb29raW5nIGZvciBj dXJyZW50IG1vZGUgb24gY29ubmVjdG9yICVzXG4iLAotCQkJCSAgICAgIGNvbm5lY3Rvci0+bmFt ZSk7Ci0JCQltb2Rlc1tpXSA9ICZjb25uZWN0b3ItPnN0YXRlLT5jcnRjLT5tb2RlOwotCQl9Ci0J CWNydGNzW2ldID0gbmV3X2NydGM7Ci0KLQkJRFJNX0RFQlVHX0tNUygiY29ubmVjdG9yICVzIG9u IFtDUlRDOiVkOiVzXTogJWR4JWQlc1xuIiwKLQkJCSAgICAgIGNvbm5lY3Rvci0+bmFtZSwKLQkJ CSAgICAgIGNvbm5lY3Rvci0+c3RhdGUtPmNydGMtPmJhc2UuaWQsCi0JCQkgICAgICBjb25uZWN0 b3ItPnN0YXRlLT5jcnRjLT5uYW1lLAotCQkJICAgICAgbW9kZXNbaV0tPmhkaXNwbGF5LCBtb2Rl c1tpXS0+dmRpc3BsYXksCi0JCQkgICAgICBtb2Rlc1tpXS0+ZmxhZ3MgJiBEUk1fTU9ERV9GTEFH X0lOVEVSTEFDRSA/ICJpIiA6ICIiKTsKLQotCQlmYWxsYmFjayA9IGZhbHNlOwotCQljb25uX2Nv bmZpZ3VyZWQgfD0gQklUKGkpOwotCX0KLQotCWlmICgoY29ubl9jb25maWd1cmVkICYgbWFzaykg IT0gbWFzayAmJiBjb25uX2NvbmZpZ3VyZWQgIT0gY29ubl9zZXEpCi0JCWdvdG8gcmV0cnk7Ci0K LQkvKgotCSAqIElmIHRoZSBCSU9TIGRpZG4ndCBlbmFibGUgZXZlcnl0aGluZyBpdCBjb3VsZCwg ZmFsbCBiYWNrIHRvIGhhdmUgdGhlCi0JICogc2FtZSB1c2VyIGV4cGVyaWVuY2luZyBvZiBsaWdo dGluZyB1cCBhcyBtdWNoIGFzIHBvc3NpYmxlIGxpa2UgdGhlCi0JICogZmJkZXYgaGVscGVyIGxp YnJhcnkuCi0JICovCi0JaWYgKG51bV9jb25uZWN0b3JzX2VuYWJsZWQgIT0gbnVtX2Nvbm5lY3Rv cnNfZGV0ZWN0ZWQgJiYKLQkgICAgbnVtX2Nvbm5lY3RvcnNfZW5hYmxlZCA8IGRldi0+bW9kZV9j b25maWcubnVtX2NydGMpIHsKLQkJRFJNX0RFQlVHX0tNUygiZmFsbGJhY2s6IE5vdCBhbGwgb3V0 cHV0cyBlbmFibGVkXG4iKTsKLQkJRFJNX0RFQlVHX0tNUygiRW5hYmxlZDogJWksIGRldGVjdGVk OiAlaVxuIiwgbnVtX2Nvbm5lY3RvcnNfZW5hYmxlZCwKLQkJCSAgICAgIG51bV9jb25uZWN0b3Jz X2RldGVjdGVkKTsKLQkJZmFsbGJhY2sgPSB0cnVlOwotCX0KLQotCWlmIChmYWxsYmFjaykgewot YmFpbDoKLQkJRFJNX0RFQlVHX0tNUygiTm90IHVzaW5nIGZpcm13YXJlIGNvbmZpZ3VyYXRpb25c biIpOwotCQltZW1jcHkoZW5hYmxlZCwgc2F2ZV9lbmFibGVkLCBjb3VudCk7Ci0JCXJldCA9IGZh bHNlOwotCX0KLQotCWRybV9tb2Rlc2V0X2Ryb3BfbG9ja3MoJmN0eCk7Ci0JZHJtX21vZGVzZXRf YWNxdWlyZV9maW5pKCZjdHgpOwotCi0Ja2ZyZWUoc2F2ZV9lbmFibGVkKTsKLQlyZXR1cm4gcmV0 OwotfQotCi0vKioKLSAqIGRybV9jbGllbnRfbW9kZXNldF9wcm9iZSgpIC0gUHJvYmUgZm9yIGRp c3BsYXlzCi0gKiBAY2xpZW50OiBEUk0gY2xpZW50Ci0gKiBAd2lkdGg6IE1heGltdW0gZGlzcGxh eSBtb2RlIHdpZHRoIChvcHRpb25hbCkKLSAqIEBoZWlnaHQ6IE1heGltdW0gZGlzcGxheSBtb2Rl IGhlaWdodCAob3B0aW9uYWwpCi0gKgotICogVGhpcyBmdW5jdGlvbiBzZXRzIHVwIGRpc3BsYXkg cGlwZWxpbmVzIGZvciBlbmFibGVkIGNvbm5lY3RvcnMgYW5kIHN0b3JlcyB0aGUKLSAqIGNvbmZp ZyBpbiB0aGUgY2xpZW50J3MgbW9kZXNldCBhcnJheS4KLSAqCi0gKiBSZXR1cm5zOgotICogWmVy byBvbiBzdWNjZXNzIG9yIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KLSAqLwotaW50 IGRybV9jbGllbnRfbW9kZXNldF9wcm9iZShzdHJ1Y3QgZHJtX2NsaWVudF9kZXYgKmNsaWVudCwg dW5zaWduZWQgaW50IHdpZHRoLCB1bnNpZ25lZCBpbnQgaGVpZ2h0KQotewotCXN0cnVjdCBkcm1f Y29ubmVjdG9yICpjb25uZWN0b3IsICoqY29ubmVjdG9ycyA9IE5VTEw7Ci0Jc3RydWN0IGRybV9j b25uZWN0b3JfbGlzdF9pdGVyIGNvbm5faXRlcjsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0g Y2xpZW50LT5kZXY7Ci0JdW5zaWduZWQgaW50IHRvdGFsX21vZGVzX2NvdW50ID0gMDsKLQlzdHJ1 Y3QgZHJtX2NsaWVudF9vZmZzZXQgKm9mZnNldHM7Ci0JdW5zaWduZWQgaW50IGNvbm5lY3Rvcl9j b3VudCA9IDA7Ci0Jc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKiptb2RlczsKLQlzdHJ1Y3QgZHJt X2NydGMgKipjcnRjczsKLQlpbnQgaSwgcmV0ID0gMDsKLQlib29sICplbmFibGVkOwotCi0JRFJN X0RFQlVHX0tNUygiXG4iKTsKLQotCWlmICghd2lkdGgpCi0JCXdpZHRoID0gZGV2LT5tb2RlX2Nv bmZpZy5tYXhfd2lkdGg7Ci0JaWYgKCFoZWlnaHQpCi0JCWhlaWdodCA9IGRldi0+bW9kZV9jb25m aWcubWF4X2hlaWdodDsKLQotCWRybV9jb25uZWN0b3JfbGlzdF9pdGVyX2JlZ2luKGRldiwgJmNv bm5faXRlcik7Ci0JZHJtX2NsaWVudF9mb3JfZWFjaF9jb25uZWN0b3JfaXRlcihjb25uZWN0b3Is ICZjb25uX2l0ZXIpIHsKLQkJc3RydWN0IGRybV9jb25uZWN0b3IgKip0bXA7Ci0KLQkJdG1wID0g a3JlYWxsb2MoY29ubmVjdG9ycywgKGNvbm5lY3Rvcl9jb3VudCArIDEpICogc2l6ZW9mKCpjb25u ZWN0b3JzKSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghdG1wKSB7Ci0JCQlyZXQgPSAtRU5PTUVNOwot CQkJZ290byBmcmVlX2Nvbm5lY3RvcnM7Ci0JCX0KLQotCQljb25uZWN0b3JzID0gdG1wOwotCQlk cm1fY29ubmVjdG9yX2dldChjb25uZWN0b3IpOwotCQljb25uZWN0b3JzW2Nvbm5lY3Rvcl9jb3Vu dCsrXSA9IGNvbm5lY3RvcjsKLQl9Ci0JZHJtX2Nvbm5lY3Rvcl9saXN0X2l0ZXJfZW5kKCZjb25u X2l0ZXIpOwotCi0JaWYgKCFjb25uZWN0b3JfY291bnQpCi0JCXJldHVybiAwOwotCi0JY3J0Y3Mg PSBrY2FsbG9jKGNvbm5lY3Rvcl9jb3VudCwgc2l6ZW9mKCpjcnRjcyksIEdGUF9LRVJORUwpOwot CW1vZGVzID0ga2NhbGxvYyhjb25uZWN0b3JfY291bnQsIHNpemVvZigqbW9kZXMpLCBHRlBfS0VS TkVMKTsKLQlvZmZzZXRzID0ga2NhbGxvYyhjb25uZWN0b3JfY291bnQsIHNpemVvZigqb2Zmc2V0 cyksIEdGUF9LRVJORUwpOwotCWVuYWJsZWQgPSBrY2FsbG9jKGNvbm5lY3Rvcl9jb3VudCwgc2l6 ZW9mKGJvb2wpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWNydGNzIHx8ICFtb2RlcyB8fCAhZW5hYmxl ZCB8fCAhb2Zmc2V0cykgewotCQlEUk1fRVJST1IoIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZFxu Iik7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0OwotCX0KLQotCW11dGV4X2xvY2soJmNs aWVudC0+bW9kZXNldF9tdXRleCk7Ci0KLQltdXRleF9sb2NrKCZkZXYtPm1vZGVfY29uZmlnLm11 dGV4KTsKLQlmb3IgKGkgPSAwOyBpIDwgY29ubmVjdG9yX2NvdW50OyBpKyspCi0JCXRvdGFsX21v ZGVzX2NvdW50ICs9IGNvbm5lY3RvcnNbaV0tPmZ1bmNzLT5maWxsX21vZGVzKGNvbm5lY3RvcnNb aV0sIHdpZHRoLCBoZWlnaHQpOwotCWlmICghdG90YWxfbW9kZXNfY291bnQpCi0JCURSTV9ERUJV R19LTVMoIk5vIGNvbm5lY3RvcnMgcmVwb3J0ZWQgY29ubmVjdGVkIHdpdGggbW9kZXNcbiIpOwot CWRybV9jbGllbnRfY29ubmVjdG9yc19lbmFibGVkKGNvbm5lY3RvcnMsIGNvbm5lY3Rvcl9jb3Vu dCwgZW5hYmxlZCk7Ci0KLQlpZiAoIWRybV9jbGllbnRfZmlybXdhcmVfY29uZmlnKGNsaWVudCwg Y29ubmVjdG9ycywgY29ubmVjdG9yX2NvdW50LCBjcnRjcywKLQkJCQkJbW9kZXMsIG9mZnNldHMs IGVuYWJsZWQsIHdpZHRoLCBoZWlnaHQpKSB7Ci0JCW1lbXNldChtb2RlcywgMCwgY29ubmVjdG9y X2NvdW50ICogc2l6ZW9mKCptb2RlcykpOwotCQltZW1zZXQoY3J0Y3MsIDAsIGNvbm5lY3Rvcl9j b3VudCAqIHNpemVvZigqY3J0Y3MpKTsKLQkJbWVtc2V0KG9mZnNldHMsIDAsIGNvbm5lY3Rvcl9j b3VudCAqIHNpemVvZigqb2Zmc2V0cykpOwotCi0JCWlmICghZHJtX2NsaWVudF90YXJnZXRfY2xv bmVkKGRldiwgY29ubmVjdG9ycywgY29ubmVjdG9yX2NvdW50LCBtb2RlcywKLQkJCQkJICAgICAg b2Zmc2V0cywgZW5hYmxlZCwgd2lkdGgsIGhlaWdodCkgJiYKLQkJICAgICFkcm1fY2xpZW50X3Rh cmdldF9wcmVmZXJyZWQoY29ubmVjdG9ycywgY29ubmVjdG9yX2NvdW50LCBtb2RlcywKLQkJCQkJ CSBvZmZzZXRzLCBlbmFibGVkLCB3aWR0aCwgaGVpZ2h0KSkKLQkJCURSTV9FUlJPUigiVW5hYmxl IHRvIGZpbmQgaW5pdGlhbCBtb2Rlc1xuIik7Ci0KLQkJRFJNX0RFQlVHX0tNUygicGlja2luZyBD UlRDcyBmb3IgJWR4JWQgY29uZmlnXG4iLAotCQkJICAgICAgd2lkdGgsIGhlaWdodCk7Ci0KLQkJ ZHJtX2NsaWVudF9waWNrX2NydGNzKGNsaWVudCwgY29ubmVjdG9ycywgY29ubmVjdG9yX2NvdW50 LAotCQkJCSAgICAgIGNydGNzLCBtb2RlcywgMCwgd2lkdGgsIGhlaWdodCk7Ci0JfQotCW11dGV4 X3VubG9jaygmZGV2LT5tb2RlX2NvbmZpZy5tdXRleCk7Ci0KLQlkcm1fY2xpZW50X21vZGVzZXRf cmVsZWFzZShjbGllbnQpOwotCi0JZm9yIChpID0gMDsgaSA8IGNvbm5lY3Rvcl9jb3VudDsgaSsr KSB7Ci0JCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlID0gbW9kZXNbaV07Ci0JCXN0cnVj dCBkcm1fY3J0YyAqY3J0YyA9IGNydGNzW2ldOwotCQlzdHJ1Y3QgZHJtX2NsaWVudF9vZmZzZXQg Km9mZnNldCA9ICZvZmZzZXRzW2ldOwotCi0JCWlmIChtb2RlICYmIGNydGMpIHsKLQkJCXN0cnVj dCBkcm1fbW9kZV9zZXQgKm1vZGVzZXQgPSBkcm1fY2xpZW50X2ZpbmRfbW9kZXNldChjbGllbnQs IGNydGMpOwotCQkJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciA9IGNvbm5lY3RvcnNb aV07Ci0KLQkJCURSTV9ERUJVR19LTVMoImRlc2lyZWQgbW9kZSAlcyBzZXQgb24gY3J0YyAlZCAo JWQsJWQpXG4iLAotCQkJCSAgICAgIG1vZGUtPm5hbWUsIGNydGMtPmJhc2UuaWQsIG9mZnNldC0+ eCwgb2Zmc2V0LT55KTsKLQotCQkJaWYgKFdBUk5fT05fT05DRShtb2Rlc2V0LT5udW1fY29ubmVj dG9ycyA9PSBEUk1fQ0xJRU5UX01BWF9DTE9ORURfQ09OTkVDVE9SUyB8fAotCQkJCQkgKGRldi0+ bW9kZV9jb25maWcubnVtX2NydGMgPiAxICYmIG1vZGVzZXQtPm51bV9jb25uZWN0b3JzID09IDEp KSkgewotCQkJCXJldCA9IC1FSU5WQUw7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCW1vZGVzZXQt Pm1vZGUgPSBkcm1fbW9kZV9kdXBsaWNhdGUoZGV2LCBtb2RlKTsKLQkJCWRybV9jb25uZWN0b3Jf Z2V0KGNvbm5lY3Rvcik7Ci0JCQltb2Rlc2V0LT5jb25uZWN0b3JzW21vZGVzZXQtPm51bV9jb25u ZWN0b3JzKytdID0gY29ubmVjdG9yOwotCQkJbW9kZXNldC0+eCA9IG9mZnNldC0+eDsKLQkJCW1v ZGVzZXQtPnkgPSBvZmZzZXQtPnk7Ci0JCX0KLQl9Ci0KLQltdXRleF91bmxvY2soJmNsaWVudC0+ bW9kZXNldF9tdXRleCk7Ci1vdXQ6Ci0Ja2ZyZWUoY3J0Y3MpOwotCWtmcmVlKG1vZGVzKTsKLQlr ZnJlZShvZmZzZXRzKTsKLQlrZnJlZShlbmFibGVkKTsKLWZyZWVfY29ubmVjdG9yczoKLQlmb3Ig KGkgPSAwOyBpIDwgY29ubmVjdG9yX2NvdW50OyBpKyspCi0JCWRybV9jb25uZWN0b3JfcHV0KGNv bm5lY3RvcnNbaV0pOwotCWtmcmVlKGNvbm5lY3RvcnMpOwotCi0JcmV0dXJuIHJldDsKLX0KLQog LyoKICAqIFRoaXMgaXMgYSBjb250aW51YXRpb24gb2YgZHJtX3NldHVwX2NydGNzKCkgdGhhdCBz ZXRzIHVwIGFueXRoaW5nIHJlbGF0ZWQKICAqIHRvIHRoZSBmcmFtZWJ1ZmZlci4gRHVyaW5nIGlu aXRpYWxpemF0aW9uLCBkcm1fc2V0dXBfY3J0Y3MoKSBpcyBjYWxsZWQgYmVmb3JlCmRpZmYgLS1n aXQgYS9pbmNsdWRlL2RybS9kcm1fY2xpZW50LmggYi9pbmNsdWRlL2RybS9kcm1fY2xpZW50LmgK aW5kZXggOGQ5NDg4MGJiZTI1Li5mMmQ1ZWQ3NDU3MzMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZHJt L2RybV9jbGllbnQuaAorKysgYi9pbmNsdWRlL2RybS9kcm1fY2xpZW50LmgKQEAgLTE4LDggKzE4 LDYgQEAgc3RydWN0IGRybV9nZW1fb2JqZWN0Owogc3RydWN0IGRybV9taW5vcjsKIHN0cnVjdCBt b2R1bGU7CiAKLSNkZWZpbmUgRFJNX0NMSUVOVF9NQVhfQ0xPTkVEX0NPTk5FQ1RPUlMJOAotCiAv KioKICAqIHN0cnVjdCBkcm1fY2xpZW50X2Z1bmNzIC0gRFJNIGNsaWVudCBjYWxsYmFja3MKICAq LwpAQCAtMTU0LDggKzE1Miw3IEBAIHZvaWQgZHJtX2NsaWVudF9mcmFtZWJ1ZmZlcl9kZWxldGUo c3RydWN0IGRybV9jbGllbnRfYnVmZmVyICpidWZmZXIpOwogCiBpbnQgZHJtX2NsaWVudF9tb2Rl c2V0X2NyZWF0ZShzdHJ1Y3QgZHJtX2NsaWVudF9kZXYgKmNsaWVudCk7CiB2b2lkIGRybV9jbGll bnRfbW9kZXNldF9mcmVlKHN0cnVjdCBkcm1fY2xpZW50X2RldiAqY2xpZW50KTsKLXZvaWQgZHJt X2NsaWVudF9tb2Rlc2V0X3JlbGVhc2Uoc3RydWN0IGRybV9jbGllbnRfZGV2ICpjbGllbnQpOwot c3RydWN0IGRybV9tb2RlX3NldCAqZHJtX2NsaWVudF9maW5kX21vZGVzZXQoc3RydWN0IGRybV9j bGllbnRfZGV2ICpjbGllbnQsIHN0cnVjdCBkcm1fY3J0YyAqY3J0Yyk7CitpbnQgZHJtX2NsaWVu dF9tb2Rlc2V0X3Byb2JlKHN0cnVjdCBkcm1fY2xpZW50X2RldiAqY2xpZW50LCB1bnNpZ25lZCBp bnQgd2lkdGgsIHVuc2lnbmVkIGludCBoZWlnaHQpOwogYm9vbCBkcm1fY2xpZW50X3BhbmVsX3Jv dGF0aW9uKHN0cnVjdCBkcm1fbW9kZV9zZXQgKm1vZGVzZXQsIHVuc2lnbmVkIGludCAqcm90YXRp b24pOwogaW50IGRybV9jbGllbnRfbW9kZXNldF9jb21taXRfZm9yY2Uoc3RydWN0IGRybV9jbGll bnRfZGV2ICpjbGllbnQpOwogaW50IGRybV9jbGllbnRfbW9kZXNldF9jb21taXQoc3RydWN0IGRy bV9jbGllbnRfZGV2ICpjbGllbnQpOwotLSAKMi4yMC4xCgpfX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fXwpJbnRlbC1nZnggbWFpbGluZyBsaXN0CkludGVsLWdm eEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFp bG1hbi9saXN0aW5mby9pbnRlbC1nZng=