From mboxrd@z Thu Jan 1 00:00:00 1970 From: =?UTF-8?q?Noralf=20Tr=C3=B8nnes?= Subject: [PATCH v2 11/12] drm/fb-helper: Move out modeset config code Date: Sun, 7 Apr 2019 18:52:42 +0200 Message-ID: <20190407165243.54043-12-noralf@tronnes.org> References: <20190407165243.54043-1-noralf@tronnes.org> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <20190407165243.54043-1-noralf@tronnes.org> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: dri-devel@lists.freedesktop.org Cc: daniel.vetter@ffwll.ch, intel-gfx@lists.freedesktop.org List-Id: dri-devel@lists.freedesktop.org Tm8gZnVuY3Rpb25hbCBjaGFuZ2VzLCBqdXN0IG1vdmluZyBjb2RlIGFzLWlzIGFuZCBmaXhpbmcg aW5jbHVkZXMuCgpTaWduZWQtb2ZmLWJ5OiBOb3JhbGYgVHLDuG5uZXMgPG5vcmFsZkB0cm9ubmVz Lm9yZz4KLS0tCiBkcml2ZXJzL2dwdS9kcm0vZHJtX2NsaWVudF9tb2Rlc2V0LmMgfCA3MDMgKysr KysrKysrKysrKysrKysrKysrKysrKystCiBkcml2ZXJzL2dwdS9kcm0vZHJtX2ZiX2hlbHBlci5j ICAgICAgfCA2OTIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIGluY2x1ZGUvZHJtL2RybV9j bGllbnQuaCAgICAgICAgICAgICB8ICAgNCArLQogMyBmaWxlcyBjaGFuZ2VkLCA3MDEgaW5zZXJ0 aW9ucygrKSwgNjk4IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9k cm1fY2xpZW50X21vZGVzZXQuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fY2xpZW50X21vZGVzZXQu YwppbmRleCA5NGI1MmY5N2MwNmIuLjJhNDI4YWMwMDkzMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9n cHUvZHJtL2RybV9jbGllbnRfbW9kZXNldC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fY2xp ZW50X21vZGVzZXQuYwpAQCAtMTMsMTMgKzEzLDIyIEBACiAKICNpbmNsdWRlIDxkcm0vZHJtX2F0 b21pYy5oPgogI2luY2x1ZGUgPGRybS9kcm1fY2xpZW50Lmg+CisjaW5jbHVkZSA8ZHJtL2RybV9j b25uZWN0b3IuaD4KICNpbmNsdWRlIDxkcm0vZHJtX2NydGMuaD4KICNpbmNsdWRlIDxkcm0vZHJt X2RldmljZS5oPgogI2luY2x1ZGUgPGRybS9kcm1fZHJ2Lmg+CisjaW5jbHVkZSA8ZHJtL2RybV9l bmNvZGVyLmg+CisjaW5jbHVkZSA8ZHJtL2RybV9wcmludC5oPgogCiAjaW5jbHVkZSAiZHJtX2Ny dGNfaW50ZXJuYWwuaCIKICNpbmNsdWRlICJkcm1faW50ZXJuYWwuaCIKIAorI2RlZmluZSBEUk1f Q0xJRU5UX01BWF9DTE9ORURfQ09OTkVDVE9SUwk4CisKK3N0cnVjdCBkcm1fY2xpZW50X29mZnNl dCB7CisJaW50IHgsIHk7Cit9OworCiAvKiBVc2VkIGJ5IGRybV9jbGllbnQgYW5kIGRybV9mYl9o ZWxwZXIgKi8KIGludCBkcm1fY2xpZW50X21vZGVzZXRfY3JlYXRlKHN0cnVjdCBkcm1fY2xpZW50 X2RldiAqY2xpZW50KQogewpAQCAtOTMsNyArMTAyLDggQEAgdm9pZCBkcm1fY2xpZW50X21vZGVz ZXRfcmVsZWFzZShzdHJ1Y3QgZHJtX2NsaWVudF9kZXYgKmNsaWVudCkKIH0KIEVYUE9SVF9TWU1C T0woZHJtX2NsaWVudF9tb2Rlc2V0X3JlbGVhc2UpOwogCi1zdHJ1Y3QgZHJtX21vZGVfc2V0ICpk cm1fY2xpZW50X2ZpbmRfbW9kZXNldChzdHJ1Y3QgZHJtX2NsaWVudF9kZXYgKmNsaWVudCwgc3Ry dWN0IGRybV9jcnRjICpjcnRjKQorc3RhdGljIHN0cnVjdCBkcm1fbW9kZV9zZXQgKgorZHJtX2Ns aWVudF9maW5kX21vZGVzZXQoc3RydWN0IGRybV9jbGllbnRfZGV2ICpjbGllbnQsIHN0cnVjdCBk cm1fY3J0YyAqY3J0YykKIHsKIAlzdHJ1Y3QgZHJtX21vZGVfc2V0ICptb2Rlc2V0OwogCkBAIC0x MDMsOCArMTEzLDY5NSBAQCBzdHJ1Y3QgZHJtX21vZGVfc2V0ICpkcm1fY2xpZW50X2ZpbmRfbW9k ZXNldChzdHJ1Y3QgZHJtX2NsaWVudF9kZXYgKmNsaWVudCwgc3RydQogCiAJcmV0dXJuIE5VTEw7 CiB9Ci0vKiBUT0RPOiBSZW1vdmUgZXhwb3J0IHdoZW4gbW9kZXNldCBjb2RlIGhhcyBiZWVuIG1v dmVkIG92ZXIgKi8KLUVYUE9SVF9TWU1CT0woZHJtX2NsaWVudF9maW5kX21vZGVzZXQpOworCitz dGF0aWMgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKgorZHJtX2Nvbm5lY3Rvcl9oYXNfcHJlZmVy cmVkX21vZGUoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwgaW50IHdpZHRoLCBpbnQg aGVpZ2h0KQoreworCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlOworCisJbGlzdF9mb3Jf ZWFjaF9lbnRyeShtb2RlLCAmY29ubmVjdG9yLT5tb2RlcywgaGVhZCkgeworCQlpZiAobW9kZS0+ aGRpc3BsYXkgPiB3aWR0aCB8fAorCQkgICAgbW9kZS0+dmRpc3BsYXkgPiBoZWlnaHQpCisJCQlj b250aW51ZTsKKwkJaWYgKG1vZGUtPnR5cGUgJiBEUk1fTU9ERV9UWVBFX1BSRUZFUlJFRCkKKwkJ CXJldHVybiBtb2RlOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBkcm1f ZGlzcGxheV9tb2RlICoKK2RybV9jb25uZWN0b3JfcGlja19jbWRsaW5lX21vZGUoc3RydWN0IGRy bV9jb25uZWN0b3IgKmNvbm5lY3RvcikKK3sKKwlzdHJ1Y3QgZHJtX2NtZGxpbmVfbW9kZSAqY21k bGluZV9tb2RlOworCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlOworCWJvb2wgcHJlZmVy X25vbl9pbnRlcmxhY2U7CisKKwljbWRsaW5lX21vZGUgPSAmY29ubmVjdG9yLT5jbWRsaW5lX21v ZGU7CisJaWYgKGNtZGxpbmVfbW9kZS0+c3BlY2lmaWVkID09IGZhbHNlKQorCQlyZXR1cm4gTlVM TDsKKworCS8qIGF0dGVtcHQgdG8gZmluZCBhIG1hdGNoaW5nIG1vZGUgaW4gdGhlIGxpc3Qgb2Yg bW9kZXMKKwkgKiAgd2UgaGF2ZSBnb3R0ZW4gc28gZmFyLCBpZiBub3QgYWRkIGEgQ1ZUIG1vZGUg dGhhdCBjb25mb3JtcworCSAqLworCWlmIChjbWRsaW5lX21vZGUtPnJiIHx8IGNtZGxpbmVfbW9k ZS0+bWFyZ2lucykKKwkJZ290byBjcmVhdGVfbW9kZTsKKworCXByZWZlcl9ub25faW50ZXJsYWNl ID0gIWNtZGxpbmVfbW9kZS0+aW50ZXJsYWNlOworYWdhaW46CisJbGlzdF9mb3JfZWFjaF9lbnRy eShtb2RlLCAmY29ubmVjdG9yLT5tb2RlcywgaGVhZCkgeworCQkvKiBjaGVjayB3aWR0aC9oZWln aHQgKi8KKwkJaWYgKG1vZGUtPmhkaXNwbGF5ICE9IGNtZGxpbmVfbW9kZS0+eHJlcyB8fAorCQkg ICAgbW9kZS0+dmRpc3BsYXkgIT0gY21kbGluZV9tb2RlLT55cmVzKQorCQkJY29udGludWU7CisK KwkJaWYgKGNtZGxpbmVfbW9kZS0+cmVmcmVzaF9zcGVjaWZpZWQpIHsKKwkJCWlmIChtb2RlLT52 cmVmcmVzaCAhPSBjbWRsaW5lX21vZGUtPnJlZnJlc2gpCisJCQkJY29udGludWU7CisJCX0KKwor CQlpZiAoY21kbGluZV9tb2RlLT5pbnRlcmxhY2UpIHsKKwkJCWlmICghKG1vZGUtPmZsYWdzICYg RFJNX01PREVfRkxBR19JTlRFUkxBQ0UpKQorCQkJCWNvbnRpbnVlOworCQl9IGVsc2UgaWYgKHBy ZWZlcl9ub25faW50ZXJsYWNlKSB7CisJCQlpZiAobW9kZS0+ZmxhZ3MgJiBEUk1fTU9ERV9GTEFH X0lOVEVSTEFDRSkKKwkJCQljb250aW51ZTsKKwkJfQorCQlyZXR1cm4gbW9kZTsKKwl9CisKKwlp ZiAocHJlZmVyX25vbl9pbnRlcmxhY2UpIHsKKwkJcHJlZmVyX25vbl9pbnRlcmxhY2UgPSBmYWxz ZTsKKwkJZ290byBhZ2FpbjsKKwl9CisKK2NyZWF0ZV9tb2RlOgorCW1vZGUgPSBkcm1fbW9kZV9j cmVhdGVfZnJvbV9jbWRsaW5lX21vZGUoY29ubmVjdG9yLT5kZXYsIGNtZGxpbmVfbW9kZSk7CisJ bGlzdF9hZGQoJm1vZGUtPmhlYWQsICZjb25uZWN0b3ItPm1vZGVzKTsKKworCXJldHVybiBtb2Rl OworfQorCitzdGF0aWMgYm9vbCBkcm1fY29ubmVjdG9yX2VuYWJsZWQoc3RydWN0IGRybV9jb25u ZWN0b3IgKmNvbm5lY3RvciwgYm9vbCBzdHJpY3QpCit7CisJYm9vbCBlbmFibGU7CisKKwlpZiAo Y29ubmVjdG9yLT5kaXNwbGF5X2luZm8ubm9uX2Rlc2t0b3ApCisJCXJldHVybiBmYWxzZTsKKwor CWlmIChzdHJpY3QpCisJCWVuYWJsZSA9IGNvbm5lY3Rvci0+c3RhdHVzID09IGNvbm5lY3Rvcl9z dGF0dXNfY29ubmVjdGVkOworCWVsc2UKKwkJZW5hYmxlID0gY29ubmVjdG9yLT5zdGF0dXMgIT0g Y29ubmVjdG9yX3N0YXR1c19kaXNjb25uZWN0ZWQ7CisKKwlyZXR1cm4gZW5hYmxlOworfQorCitz dGF0aWMgdm9pZCBkcm1fY2xpZW50X2Nvbm5lY3RvcnNfZW5hYmxlZChzdHJ1Y3QgZHJtX2Nvbm5l Y3RvciAqKmNvbm5lY3RvcnMsCisJCQkJCSAgdW5zaWduZWQgaW50IGNvbm5lY3Rvcl9jb3VudCwK KwkJCQkJICBib29sICplbmFibGVkKQoreworCWJvb2wgYW55X2VuYWJsZWQgPSBmYWxzZTsKKwlz dHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yOworCWludCBpID0gMDsKKworCWZvciAoaSA9 IDA7IGkgPCBjb25uZWN0b3JfY291bnQ7IGkrKykgeworCQljb25uZWN0b3IgPSBjb25uZWN0b3Jz W2ldOworCQllbmFibGVkW2ldID0gZHJtX2Nvbm5lY3Rvcl9lbmFibGVkKGNvbm5lY3RvciwgdHJ1 ZSk7CisJCURSTV9ERUJVR19LTVMoImNvbm5lY3RvciAlZCBlbmFibGVkPyAlc1xuIiwgY29ubmVj dG9yLT5iYXNlLmlkLAorCQkJICAgICAgY29ubmVjdG9yLT5kaXNwbGF5X2luZm8ubm9uX2Rlc2t0 b3AgPyAibm9uIGRlc2t0b3AiIDogZW5hYmxlZFtpXSA/ICJ5ZXMiIDogIm5vIik7CisKKwkJYW55 X2VuYWJsZWQgfD0gZW5hYmxlZFtpXTsKKwl9CisKKwlpZiAoYW55X2VuYWJsZWQpCisJCXJldHVy bjsKKworCWZvciAoaSA9IDA7IGkgPCBjb25uZWN0b3JfY291bnQ7IGkrKykKKwkJZW5hYmxlZFtp XSA9IGRybV9jb25uZWN0b3JfZW5hYmxlZChjb25uZWN0b3JzW2ldLCBmYWxzZSk7Cit9CisKK3N0 YXRpYyBib29sIGRybV9jbGllbnRfdGFyZ2V0X2Nsb25lZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2 LAorCQkJCSAgICAgc3RydWN0IGRybV9jb25uZWN0b3IgKipjb25uZWN0b3JzLAorCQkJCSAgICAg dW5zaWduZWQgaW50IGNvbm5lY3Rvcl9jb3VudCwKKwkJCQkgICAgIHN0cnVjdCBkcm1fZGlzcGxh eV9tb2RlICoqbW9kZXMsCisJCQkJICAgICBzdHJ1Y3QgZHJtX2NsaWVudF9vZmZzZXQgKm9mZnNl dHMsCisJCQkJICAgICBib29sICplbmFibGVkLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisJ aW50IGNvdW50LCBpLCBqOworCWJvb2wgY2FuX2Nsb25lID0gZmFsc2U7CisJc3RydWN0IGRybV9k aXNwbGF5X21vZGUgKmRtdF9tb2RlLCAqbW9kZTsKKworCS8qIG9ubHkgY29udGVtcGxhdGUgY2xv bmluZyBpbiB0aGUgc2luZ2xlIGNydGMgY2FzZSAqLworCWlmIChkZXYtPm1vZGVfY29uZmlnLm51 bV9jcnRjID4gMSkKKwkJcmV0dXJuIGZhbHNlOworCisJY291bnQgPSAwOworCWZvciAoaSA9IDA7 IGkgPCBjb25uZWN0b3JfY291bnQ7IGkrKykgeworCQlpZiAoZW5hYmxlZFtpXSkKKwkJCWNvdW50 Kys7CisJfQorCisJLyogb25seSBjb250ZW1wbGF0ZSBjbG9uaW5nIGlmIG1vcmUgdGhhbiBvbmUg Y29ubmVjdG9yIGlzIGVuYWJsZWQgKi8KKwlpZiAoY291bnQgPD0gMSkKKwkJcmV0dXJuIGZhbHNl OworCisJLyogY2hlY2sgdGhlIGNvbW1hbmQgbGluZSBvciBpZiBub3RoaW5nIGNvbW1vbiBwaWNr IDEwMjR4NzY4ICovCisJY2FuX2Nsb25lID0gdHJ1ZTsKKwlmb3IgKGkgPSAwOyBpIDwgY29ubmVj dG9yX2NvdW50OyBpKyspIHsKKwkJaWYgKCFlbmFibGVkW2ldKQorCQkJY29udGludWU7CisJCW1v ZGVzW2ldID0gZHJtX2Nvbm5lY3Rvcl9waWNrX2NtZGxpbmVfbW9kZShjb25uZWN0b3JzW2ldKTsK KwkJaWYgKCFtb2Rlc1tpXSkgeworCQkJY2FuX2Nsb25lID0gZmFsc2U7CisJCQlicmVhazsKKwkJ fQorCQlmb3IgKGogPSAwOyBqIDwgaTsgaisrKSB7CisJCQlpZiAoIWVuYWJsZWRbal0pCisJCQkJ Y29udGludWU7CisJCQlpZiAoIWRybV9tb2RlX21hdGNoKG1vZGVzW2pdLCBtb2Rlc1tpXSwKKwkJ CQkJICAgIERSTV9NT0RFX01BVENIX1RJTUlOR1MgfAorCQkJCQkgICAgRFJNX01PREVfTUFUQ0hf Q0xPQ0sgfAorCQkJCQkgICAgRFJNX01PREVfTUFUQ0hfRkxBR1MgfAorCQkJCQkgICAgRFJNX01P REVfTUFUQ0hfM0RfRkxBR1MpKQorCQkJCWNhbl9jbG9uZSA9IGZhbHNlOworCQl9CisJfQorCisJ aWYgKGNhbl9jbG9uZSkgeworCQlEUk1fREVCVUdfS01TKCJjYW4gY2xvbmUgdXNpbmcgY29tbWFu ZCBsaW5lXG4iKTsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJLyogdHJ5IGFuZCBmaW5kIGEgMTAy NHg3NjggbW9kZSBvbiBlYWNoIGNvbm5lY3RvciAqLworCWNhbl9jbG9uZSA9IHRydWU7CisJZG10 X21vZGUgPSBkcm1fbW9kZV9maW5kX2RtdChkZXYsIDEwMjQsIDc2OCwgNjAsIGZhbHNlKTsKKwor CWZvciAoaSA9IDA7IGkgPCBjb25uZWN0b3JfY291bnQ7IGkrKykgeworCQlpZiAoIWVuYWJsZWRb aV0pCisJCQljb250aW51ZTsKKworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG1vZGUsICZjb25uZWN0 b3JzW2ldLT5tb2RlcywgaGVhZCkgeworCQkJaWYgKGRybV9tb2RlX21hdGNoKG1vZGUsIGRtdF9t b2RlLAorCQkJCQkgICBEUk1fTU9ERV9NQVRDSF9USU1JTkdTIHwKKwkJCQkJICAgRFJNX01PREVf TUFUQ0hfQ0xPQ0sgfAorCQkJCQkgICBEUk1fTU9ERV9NQVRDSF9GTEFHUyB8CisJCQkJCSAgIERS TV9NT0RFX01BVENIXzNEX0ZMQUdTKSkKKwkJCQltb2Rlc1tpXSA9IG1vZGU7CisJCX0KKwkJaWYg KCFtb2Rlc1tpXSkKKwkJCWNhbl9jbG9uZSA9IGZhbHNlOworCX0KKworCWlmIChjYW5fY2xvbmUp IHsKKwkJRFJNX0RFQlVHX0tNUygiY2FuIGNsb25lIHVzaW5nIDEwMjR4NzY4XG4iKTsKKwkJcmV0 dXJuIHRydWU7CisJfQorCURSTV9JTkZPKCJrbXM6IGNhbid0IGVuYWJsZSBjbG9uaW5nIHdoZW4g d2UgcHJvYmFibHkgd2FudGVkIHRvLlxuIik7CisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMg aW50IGRybV9jbGllbnRfZ2V0X3RpbGVfb2Zmc2V0cyhzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqKmNv bm5lY3RvcnMsCisJCQkJICAgICAgIHVuc2lnbmVkIGludCBjb25uZWN0b3JfY291bnQsCisJCQkJ ICAgICAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICoqbW9kZXMsCisJCQkJICAgICAgIHN0cnVj dCBkcm1fY2xpZW50X29mZnNldCAqb2Zmc2V0cywKKwkJCQkgICAgICAgaW50IGlkeCwKKwkJCQkg ICAgICAgaW50IGhfaWR4LCBpbnQgdl9pZHgpCit7CisJc3RydWN0IGRybV9jb25uZWN0b3IgKmNv bm5lY3RvcjsKKwlpbnQgaTsKKwlpbnQgaG9mZnNldCA9IDAsIHZvZmZzZXQgPSAwOworCisJZm9y IChpID0gMDsgaSA8IGNvbm5lY3Rvcl9jb3VudDsgaSsrKSB7CisJCWNvbm5lY3RvciA9IGNvbm5l Y3RvcnNbaV07CisJCWlmICghY29ubmVjdG9yLT5oYXNfdGlsZSkKKwkJCWNvbnRpbnVlOworCisJ CWlmICghbW9kZXNbaV0gJiYgKGhfaWR4IHx8IHZfaWR4KSkgeworCQkJRFJNX0RFQlVHX0tNUygi bm8gbW9kZXMgZm9yIGNvbm5lY3RvciB0aWxlZCAlZCAlZFxuIiwgaSwKKwkJCQkgICAgICBjb25u ZWN0b3ItPmJhc2UuaWQpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGNvbm5lY3Rvci0+dGls ZV9oX2xvYyA8IGhfaWR4KQorCQkJaG9mZnNldCArPSBtb2Rlc1tpXS0+aGRpc3BsYXk7CisKKwkJ aWYgKGNvbm5lY3Rvci0+dGlsZV92X2xvYyA8IHZfaWR4KQorCQkJdm9mZnNldCArPSBtb2Rlc1tp XS0+dmRpc3BsYXk7CisJfQorCW9mZnNldHNbaWR4XS54ID0gaG9mZnNldDsKKwlvZmZzZXRzW2lk eF0ueSA9IHZvZmZzZXQ7CisJRFJNX0RFQlVHX0tNUygicmV0dXJuZWQgJWQgJWQgZm9yICVkICVk XG4iLCBob2Zmc2V0LCB2b2Zmc2V0LCBoX2lkeCwgdl9pZHgpOworCXJldHVybiAwOworfQorCitz dGF0aWMgYm9vbCBkcm1fY2xpZW50X3RhcmdldF9wcmVmZXJyZWQoc3RydWN0IGRybV9jb25uZWN0 b3IgKipjb25uZWN0b3JzLAorCQkJCQl1bnNpZ25lZCBpbnQgY29ubmVjdG9yX2NvdW50LAorCQkJ CQlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqKm1vZGVzLAorCQkJCQlzdHJ1Y3QgZHJtX2NsaWVu dF9vZmZzZXQgKm9mZnNldHMsCisJCQkJCWJvb2wgKmVuYWJsZWQsIGludCB3aWR0aCwgaW50IGhl aWdodCkKK3sKKwljb25zdCB1NjQgbWFzayA9IEJJVF9VTEwoY29ubmVjdG9yX2NvdW50KSAtIDE7 CisJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcjsKKwl1NjQgY29ubl9jb25maWd1cmVk ID0gMDsKKwlpbnQgdGlsZV9wYXNzID0gMDsKKwlpbnQgaTsKKworcmV0cnk6CisJZm9yIChpID0g MDsgaSA8IGNvbm5lY3Rvcl9jb3VudDsgaSsrKSB7CisJCWNvbm5lY3RvciA9IGNvbm5lY3RvcnNb aV07CisKKwkJaWYgKGNvbm5fY29uZmlndXJlZCAmIEJJVF9VTEwoaSkpCisJCQljb250aW51ZTsK KworCQlpZiAoZW5hYmxlZFtpXSA9PSBmYWxzZSkgeworCQkJY29ubl9jb25maWd1cmVkIHw9IEJJ VF9VTEwoaSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIGZpcnN0IHBhc3Mgb3ZlciBhbGwg dGhlIHVudGlsZWQgY29ubmVjdG9ycyAqLworCQlpZiAodGlsZV9wYXNzID09IDAgJiYgY29ubmVj dG9yLT5oYXNfdGlsZSkKKwkJCWNvbnRpbnVlOworCisJCWlmICh0aWxlX3Bhc3MgPT0gMSkgewor CQkJaWYgKGNvbm5lY3Rvci0+dGlsZV9oX2xvYyAhPSAwIHx8CisJCQkgICAgY29ubmVjdG9yLT50 aWxlX3ZfbG9jICE9IDApCisJCQkJY29udGludWU7CisKKwkJfSBlbHNlIHsKKwkJCWlmIChjb25u ZWN0b3ItPnRpbGVfaF9sb2MgIT0gdGlsZV9wYXNzIC0gMSAmJgorCQkJICAgIGNvbm5lY3Rvci0+ dGlsZV92X2xvYyAhPSB0aWxlX3Bhc3MgLSAxKQorCQkJLyogaWYgdGhpcyB0aWxlX3Bhc3MgZG9l c24ndCBjb3ZlciBhbnkgb2YgdGhlIHRpbGVzIC0ga2VlcCBnb2luZyAqLworCQkJCWNvbnRpbnVl OworCisJCQkvKgorCQkJICogZmluZCB0aGUgdGlsZSBvZmZzZXRzIGZvciB0aGlzIHBhc3MgLSBu ZWVkIHRvIGZpbmQKKwkJCSAqIGFsbCB0aWxlcyBsZWZ0IGFuZCBhYm92ZQorCQkJICovCisJCQlk cm1fY2xpZW50X2dldF90aWxlX29mZnNldHMoY29ubmVjdG9ycywgY29ubmVjdG9yX2NvdW50LCBt b2Rlcywgb2Zmc2V0cywgaSwKKwkJCQkJCSAgICBjb25uZWN0b3ItPnRpbGVfaF9sb2MsIGNvbm5l Y3Rvci0+dGlsZV92X2xvYyk7CisJCX0KKwkJRFJNX0RFQlVHX0tNUygibG9va2luZyBmb3IgY21k bGluZSBtb2RlIG9uIGNvbm5lY3RvciAlZFxuIiwKKwkJCSAgICAgIGNvbm5lY3Rvci0+YmFzZS5p ZCk7CisKKwkJLyogZ290IGZvciBjb21tYW5kIGxpbmUgbW9kZSBmaXJzdCAqLworCQltb2Rlc1tp XSA9IGRybV9jb25uZWN0b3JfcGlja19jbWRsaW5lX21vZGUoY29ubmVjdG9yKTsKKwkJaWYgKCFt b2Rlc1tpXSkgeworCQkJRFJNX0RFQlVHX0tNUygibG9va2luZyBmb3IgcHJlZmVycmVkIG1vZGUg b24gY29ubmVjdG9yICVkICVkXG4iLAorCQkJCSAgICAgIGNvbm5lY3Rvci0+YmFzZS5pZCwgY29u bmVjdG9yLT50aWxlX2dyb3VwID8gY29ubmVjdG9yLT50aWxlX2dyb3VwLT5pZCA6IDApOworCQkJ bW9kZXNbaV0gPSBkcm1fY29ubmVjdG9yX2hhc19wcmVmZXJyZWRfbW9kZShjb25uZWN0b3IsIHdp ZHRoLCBoZWlnaHQpOworCQl9CisJCS8qIE5vIHByZWZlcnJlZCBtb2RlcywgcGljayBvbmUgb2Zm IHRoZSBsaXN0ICovCisJCWlmICghbW9kZXNbaV0gJiYgIWxpc3RfZW1wdHkoJmNvbm5lY3Rvci0+ bW9kZXMpKSB7CisJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG1vZGVzW2ldLCAmY29ubmVjdG9yLT5t b2RlcywgaGVhZCkKKwkJCQlicmVhazsKKwkJfQorCQlEUk1fREVCVUdfS01TKCJmb3VuZCBtb2Rl ICVzXG4iLCBtb2Rlc1tpXSA/IG1vZGVzW2ldLT5uYW1lIDoKKwkJCSAgIm5vbmUiKTsKKwkJY29u bl9jb25maWd1cmVkIHw9IEJJVF9VTEwoaSk7CisJfQorCisJaWYgKChjb25uX2NvbmZpZ3VyZWQg JiBtYXNrKSAhPSBtYXNrKSB7CisJCXRpbGVfcGFzcysrOworCQlnb3RvIHJldHJ5OworCX0KKwly ZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgY29ubmVjdG9yX2hhc19wb3NzaWJsZV9jcnRj KHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCisJCQkJCXN0cnVjdCBkcm1fY3J0YyAq Y3J0YykKK3sKKwlzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXI7CisJaW50IGk7CisKKwlkcm1f Y29ubmVjdG9yX2Zvcl9lYWNoX3Bvc3NpYmxlX2VuY29kZXIoY29ubmVjdG9yLCBlbmNvZGVyLCBp KSB7CisJCWlmIChlbmNvZGVyLT5wb3NzaWJsZV9jcnRjcyAmIGRybV9jcnRjX21hc2soY3J0Yykp CisJCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbnQg ZHJtX2NsaWVudF9waWNrX2NydGNzKHN0cnVjdCBkcm1fY2xpZW50X2RldiAqY2xpZW50LAorCQkJ CSBzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqKmNvbm5lY3RvcnMsCisJCQkJIHVuc2lnbmVkIGludCBj b25uZWN0b3JfY291bnQsCisJCQkJIHN0cnVjdCBkcm1fY3J0YyAqKmJlc3RfY3J0Y3MsCisJCQkJ IHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICoqbW9kZXMsCisJCQkJIGludCBuLCBpbnQgd2lkdGgs IGludCBoZWlnaHQpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNsaWVudC0+ZGV2Owor CXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3I7CisJaW50IG15X3Njb3JlLCBiZXN0X3Nj b3JlLCBzY29yZTsKKwlzdHJ1Y3QgZHJtX2NydGMgKipjcnRjcywgKmNydGM7CisJc3RydWN0IGRy bV9tb2RlX3NldCAqbW9kZXNldDsKKwlpbnQgbzsKKworCWlmIChuID09IGNvbm5lY3Rvcl9jb3Vu dCkKKwkJcmV0dXJuIDA7CisKKwljb25uZWN0b3IgPSBjb25uZWN0b3JzW25dOworCisJYmVzdF9j cnRjc1tuXSA9IE5VTEw7CisJYmVzdF9zY29yZSA9IGRybV9jbGllbnRfcGlja19jcnRjcyhjbGll bnQsIGNvbm5lY3RvcnMsIGNvbm5lY3Rvcl9jb3VudCwKKwkJCQkJICAgYmVzdF9jcnRjcywgbW9k ZXMsIG4gKyAxLCB3aWR0aCwgaGVpZ2h0KTsKKwlpZiAobW9kZXNbbl0gPT0gTlVMTCkKKwkJcmV0 dXJuIGJlc3Rfc2NvcmU7CisKKwljcnRjcyA9IGtjYWxsb2MoY29ubmVjdG9yX2NvdW50LCBzaXpl b2YoKmNydGNzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjcnRjcykKKwkJcmV0dXJuIGJlc3Rfc2Nv cmU7CisKKwlteV9zY29yZSA9IDE7CisJaWYgKGNvbm5lY3Rvci0+c3RhdHVzID09IGNvbm5lY3Rv cl9zdGF0dXNfY29ubmVjdGVkKQorCQlteV9zY29yZSsrOworCWlmIChjb25uZWN0b3ItPmNtZGxp bmVfbW9kZS5zcGVjaWZpZWQpCisJCW15X3Njb3JlKys7CisJaWYgKGRybV9jb25uZWN0b3JfaGFz X3ByZWZlcnJlZF9tb2RlKGNvbm5lY3Rvciwgd2lkdGgsIGhlaWdodCkpCisJCW15X3Njb3JlKys7 CisKKwkvKgorCSAqIHNlbGVjdCBhIGNydGMgZm9yIHRoaXMgY29ubmVjdG9yIGFuZCB0aGVuIGF0 dGVtcHQgdG8gY29uZmlndXJlCisJICogcmVtYWluaW5nIGNvbm5lY3RvcnMKKwkgKi8KKwlkcm1f Y2xpZW50X2Zvcl9lYWNoX21vZGVzZXQobW9kZXNldCwgY2xpZW50KSB7CisJCWNydGMgPSBtb2Rl c2V0LT5jcnRjOworCisJCWlmICghY29ubmVjdG9yX2hhc19wb3NzaWJsZV9jcnRjKGNvbm5lY3Rv ciwgY3J0YykpCisJCQljb250aW51ZTsKKworCQlmb3IgKG8gPSAwOyBvIDwgbjsgbysrKQorCQkJ aWYgKGJlc3RfY3J0Y3Nbb10gPT0gY3J0YykKKwkJCQlicmVhazsKKworCQlpZiAobyA8IG4pIHsK KwkJCS8qIGlnbm9yZSBjbG9uaW5nIHVubGVzcyBvbmx5IGEgc2luZ2xlIGNydGMgKi8KKwkJCWlm IChkZXYtPm1vZGVfY29uZmlnLm51bV9jcnRjID4gMSkKKwkJCQljb250aW51ZTsKKworCQkJaWYg KCFkcm1fbW9kZV9lcXVhbChtb2Rlc1tvXSwgbW9kZXNbbl0pKQorCQkJCWNvbnRpbnVlOworCQl9 CisKKwkJY3J0Y3Nbbl0gPSBjcnRjOworCQltZW1jcHkoY3J0Y3MsIGJlc3RfY3J0Y3MsIG4gKiBz aXplb2YoKmNydGNzKSk7CisJCXNjb3JlID0gbXlfc2NvcmUgKyBkcm1fY2xpZW50X3BpY2tfY3J0 Y3MoY2xpZW50LCBjb25uZWN0b3JzLCBjb25uZWN0b3JfY291bnQsCisJCQkJCQkJIGNydGNzLCBt b2RlcywgbiArIDEsIHdpZHRoLCBoZWlnaHQpOworCQlpZiAoc2NvcmUgPiBiZXN0X3Njb3JlKSB7 CisJCQliZXN0X3Njb3JlID0gc2NvcmU7CisJCQltZW1jcHkoYmVzdF9jcnRjcywgY3J0Y3MsIGNv bm5lY3Rvcl9jb3VudCAqIHNpemVvZigqY3J0Y3MpKTsKKwkJfQorCX0KKworCWtmcmVlKGNydGNz KTsKKwlyZXR1cm4gYmVzdF9zY29yZTsKK30KKworLyogVHJ5IHRvIHJlYWQgdGhlIEJJT1MgZGlz cGxheSBjb25maWd1cmF0aW9uIGFuZCB1c2UgaXQgZm9yIHRoZSBpbml0aWFsIGNvbmZpZyAqLwor c3RhdGljIGJvb2wgZHJtX2NsaWVudF9maXJtd2FyZV9jb25maWcoc3RydWN0IGRybV9jbGllbnRf ZGV2ICpjbGllbnQsCisJCQkJICAgICAgIHN0cnVjdCBkcm1fY29ubmVjdG9yICoqY29ubmVjdG9y cywKKwkJCQkgICAgICAgdW5zaWduZWQgaW50IGNvbm5lY3Rvcl9jb3VudCwKKwkJCQkgICAgICAg c3RydWN0IGRybV9jcnRjICoqY3J0Y3MsCisJCQkJICAgICAgIHN0cnVjdCBkcm1fZGlzcGxheV9t b2RlICoqbW9kZXMsCisJCQkJICAgICAgIHN0cnVjdCBkcm1fY2xpZW50X29mZnNldCAqb2Zmc2V0 cywKKwkJCQkgICAgICAgYm9vbCAqZW5hYmxlZCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQorewor CXVuc2lnbmVkIGludCBjb3VudCA9IG1pbl90KHVuc2lnbmVkIGludCwgY29ubmVjdG9yX2NvdW50 LCBCSVRTX1BFUl9MT05HKTsKKwl1bnNpZ25lZCBsb25nIGNvbm5fY29uZmlndXJlZCwgY29ubl9z ZXE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNsaWVudC0+ZGV2OworCWludCBpLCBqOwor CWJvb2wgKnNhdmVfZW5hYmxlZDsKKwlib29sIGZhbGxiYWNrID0gdHJ1ZSwgcmV0ID0gdHJ1ZTsK KwlpbnQgbnVtX2Nvbm5lY3RvcnNfZW5hYmxlZCA9IDA7CisJaW50IG51bV9jb25uZWN0b3JzX2Rl dGVjdGVkID0gMDsKKwlzdHJ1Y3QgZHJtX21vZGVzZXRfYWNxdWlyZV9jdHggY3R4OworCisJc2F2 ZV9lbmFibGVkID0ga2NhbGxvYyhjb3VudCwgc2l6ZW9mKGJvb2wpLCBHRlBfS0VSTkVMKTsKKwlp ZiAoIXNhdmVfZW5hYmxlZCkKKwkJcmV0dXJuIGZhbHNlOworCisJZHJtX21vZGVzZXRfYWNxdWly ZV9pbml0KCZjdHgsIDApOworCisJd2hpbGUgKGRybV9tb2Rlc2V0X2xvY2tfYWxsX2N0eChkZXYs ICZjdHgpICE9IDApCisJCWRybV9tb2Rlc2V0X2JhY2tvZmYoJmN0eCk7CisKKwltZW1jcHkoc2F2 ZV9lbmFibGVkLCBlbmFibGVkLCBjb3VudCk7CisJY29ubl9zZXEgPSBHRU5NQVNLKGNvdW50IC0g MSwgMCk7CisJY29ubl9jb25maWd1cmVkID0gMDsKK3JldHJ5OgorCWZvciAoaSA9IDA7IGkgPCBj b3VudDsgaSsrKSB7CisJCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3I7CisJCXN0cnVj dCBkcm1fZW5jb2RlciAqZW5jb2RlcjsKKwkJc3RydWN0IGRybV9jcnRjICpuZXdfY3J0YzsKKwor CQljb25uZWN0b3IgPSBjb25uZWN0b3JzW2ldOworCisJCWlmIChjb25uX2NvbmZpZ3VyZWQgJiBC SVQoaSkpCisJCQljb250aW51ZTsKKworCQkvKiBGaXJzdCBwYXNzLCBvbmx5IGNvbnNpZGVyIHRp bGVkIGNvbm5lY3RvcnMgKi8KKwkJaWYgKGNvbm5fc2VxID09IEdFTk1BU0soY291bnQgLSAxLCAw KSAmJiAhY29ubmVjdG9yLT5oYXNfdGlsZSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChjb25uZWN0 b3ItPnN0YXR1cyA9PSBjb25uZWN0b3Jfc3RhdHVzX2Nvbm5lY3RlZCkKKwkJCW51bV9jb25uZWN0 b3JzX2RldGVjdGVkKys7CisKKwkJaWYgKCFlbmFibGVkW2ldKSB7CisJCQlEUk1fREVCVUdfS01T KCJjb25uZWN0b3IgJXMgbm90IGVuYWJsZWQsIHNraXBwaW5nXG4iLAorCQkJCSAgICAgIGNvbm5l Y3Rvci0+bmFtZSk7CisJCQljb25uX2NvbmZpZ3VyZWQgfD0gQklUKGkpOworCQkJY29udGludWU7 CisJCX0KKworCQlpZiAoY29ubmVjdG9yLT5mb3JjZSA9PSBEUk1fRk9SQ0VfT0ZGKSB7CisJCQlE Uk1fREVCVUdfS01TKCJjb25uZWN0b3IgJXMgaXMgZGlzYWJsZWQgYnkgdXNlciwgc2tpcHBpbmdc biIsCisJCQkJICAgICAgY29ubmVjdG9yLT5uYW1lKTsKKwkJCWVuYWJsZWRbaV0gPSBmYWxzZTsK KwkJCWNvbnRpbnVlOworCQl9CisKKwkJZW5jb2RlciA9IGNvbm5lY3Rvci0+c3RhdGUtPmJlc3Rf ZW5jb2RlcjsKKwkJaWYgKCFlbmNvZGVyIHx8IFdBUk5fT04oIWNvbm5lY3Rvci0+c3RhdGUtPmNy dGMpKSB7CisJCQlpZiAoY29ubmVjdG9yLT5mb3JjZSA+IERSTV9GT1JDRV9PRkYpCisJCQkJZ290 byBiYWlsOworCisJCQlEUk1fREVCVUdfS01TKCJjb25uZWN0b3IgJXMgaGFzIG5vIGVuY29kZXIg b3IgY3J0Yywgc2tpcHBpbmdcbiIsCisJCQkJICAgICAgY29ubmVjdG9yLT5uYW1lKTsKKwkJCWVu YWJsZWRbaV0gPSBmYWxzZTsKKwkJCWNvbm5fY29uZmlndXJlZCB8PSBCSVQoaSk7CisJCQljb250 aW51ZTsKKwkJfQorCisJCW51bV9jb25uZWN0b3JzX2VuYWJsZWQrKzsKKworCQluZXdfY3J0YyA9 IGNvbm5lY3Rvci0+c3RhdGUtPmNydGM7CisKKwkJLyoKKwkJICogTWFrZSBzdXJlIHdlJ3JlIG5v dCB0cnlpbmcgdG8gZHJpdmUgbXVsdGlwbGUgY29ubmVjdG9ycworCQkgKiB3aXRoIGEgc2luZ2xl IENSVEMsIHNpbmNlIG91ciBjbG9uaW5nIHN1cHBvcnQgbWF5IG5vdAorCQkgKiBtYXRjaCB0aGUg QklPUy4KKwkJICovCisJCWZvciAoaiA9IDA7IGogPCBjb3VudDsgaisrKSB7CisJCQlpZiAoY3J0 Y3Nbal0gPT0gbmV3X2NydGMpIHsKKwkJCQlEUk1fREVCVUdfS01TKCJmYWxsYmFjazogY2xvbmVk IGNvbmZpZ3VyYXRpb25cbiIpOworCQkJCWdvdG8gYmFpbDsKKwkJCX0KKwkJfQorCisJCURSTV9E RUJVR19LTVMoImxvb2tpbmcgZm9yIGNtZGxpbmUgbW9kZSBvbiBjb25uZWN0b3IgJXNcbiIsCisJ CQkgICAgICBjb25uZWN0b3ItPm5hbWUpOworCisJCS8qIGdvIGZvciBjb21tYW5kIGxpbmUgbW9k ZSBmaXJzdCAqLworCQltb2Rlc1tpXSA9IGRybV9jb25uZWN0b3JfcGlja19jbWRsaW5lX21vZGUo Y29ubmVjdG9yKTsKKworCQkvKiB0cnkgZm9yIHByZWZlcnJlZCBuZXh0ICovCisJCWlmICghbW9k ZXNbaV0pIHsKKwkJCURSTV9ERUJVR19LTVMoImxvb2tpbmcgZm9yIHByZWZlcnJlZCBtb2RlIG9u IGNvbm5lY3RvciAlcyAlZFxuIiwKKwkJCQkgICAgICBjb25uZWN0b3ItPm5hbWUsIGNvbm5lY3Rv ci0+aGFzX3RpbGUpOworCQkJbW9kZXNbaV0gPSBkcm1fY29ubmVjdG9yX2hhc19wcmVmZXJyZWRf bW9kZShjb25uZWN0b3IsIHdpZHRoLCBoZWlnaHQpOworCQl9CisKKwkJLyogTm8gcHJlZmVycmVk IG1vZGUgbWFya2VkIGJ5IHRoZSBFRElEPyBBcmUgdGhlcmUgYW55IG1vZGVzPyAqLworCQlpZiAo IW1vZGVzW2ldICYmICFsaXN0X2VtcHR5KCZjb25uZWN0b3ItPm1vZGVzKSkgeworCQkJRFJNX0RF QlVHX0tNUygidXNpbmcgZmlyc3QgbW9kZSBsaXN0ZWQgb24gY29ubmVjdG9yICVzXG4iLAorCQkJ CSAgICAgIGNvbm5lY3Rvci0+bmFtZSk7CisJCQltb2Rlc1tpXSA9IGxpc3RfZmlyc3RfZW50cnko JmNvbm5lY3Rvci0+bW9kZXMsCisJCQkJCQkgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUsCisJ CQkJCQkgICAgaGVhZCk7CisJCX0KKworCQkvKiBsYXN0IHJlc29ydDogdXNlIGN1cnJlbnQgbW9k ZSAqLworCQlpZiAoIW1vZGVzW2ldKSB7CisJCQkvKgorCQkJICogSU1QT1JUQU5UOiBXZSB3YW50 IHRvIHVzZSB0aGUgYWRqdXN0ZWQgbW9kZSAoaS5lLgorCQkJICogYWZ0ZXIgdGhlIHBhbmVsIGZp dHRlciB1cHNjYWxpbmcpIGFzIHRoZSBpbml0aWFsCisJCQkgKiBjb25maWcsIG5vdCB0aGUgaW5w dXQgbW9kZSwgd2hpY2ggaXMgd2hhdCBjcnRjLT5tb2RlCisJCQkgKiB1c3VhbGx5IGNvbnRhaW5z LiBCdXQgc2luY2Ugb3VyIGN1cnJlbnQKKwkJCSAqIGNvZGUgcHV0cyBhIG1vZGUgZGVyaXZlZCBm cm9tIHRoZSBwb3N0LXBmaXQgdGltaW5ncworCQkJICogaW50byBjcnRjLT5tb2RlIHRoaXMgd29y a3Mgb3V0IGNvcnJlY3RseS4KKwkJCSAqCisJCQkgKiBUaGlzIGlzIGNydGMtPm1vZGUgYW5kIG5v dCBjcnRjLT5zdGF0ZS0+bW9kZSBmb3IgdGhlCisJCQkgKiBmYXN0Ym9vdCBjaGVjayB0byB3b3Jr IGNvcnJlY3RseS4KKwkJCSAqLworCQkJRFJNX0RFQlVHX0tNUygibG9va2luZyBmb3IgY3VycmVu dCBtb2RlIG9uIGNvbm5lY3RvciAlc1xuIiwKKwkJCQkgICAgICBjb25uZWN0b3ItPm5hbWUpOwor CQkJbW9kZXNbaV0gPSAmY29ubmVjdG9yLT5zdGF0ZS0+Y3J0Yy0+bW9kZTsKKwkJfQorCQljcnRj c1tpXSA9IG5ld19jcnRjOworCisJCURSTV9ERUJVR19LTVMoImNvbm5lY3RvciAlcyBvbiBbQ1JU QzolZDolc106ICVkeCVkJXNcbiIsCisJCQkgICAgICBjb25uZWN0b3ItPm5hbWUsCisJCQkgICAg ICBjb25uZWN0b3ItPnN0YXRlLT5jcnRjLT5iYXNlLmlkLAorCQkJICAgICAgY29ubmVjdG9yLT5z dGF0ZS0+Y3J0Yy0+bmFtZSwKKwkJCSAgICAgIG1vZGVzW2ldLT5oZGlzcGxheSwgbW9kZXNbaV0t PnZkaXNwbGF5LAorCQkJICAgICAgbW9kZXNbaV0tPmZsYWdzICYgRFJNX01PREVfRkxBR19JTlRF UkxBQ0UgPyAiaSIgOiAiIik7CisKKwkJZmFsbGJhY2sgPSBmYWxzZTsKKwkJY29ubl9jb25maWd1 cmVkIHw9IEJJVChpKTsKKwl9CisKKwlpZiAoY29ubl9jb25maWd1cmVkICE9IGNvbm5fc2VxKSB7 IC8qIHJlcGVhdCB1bnRpbCBubyBtb3JlIGFyZSBmb3VuZCAqLworCQljb25uX3NlcSA9IGNvbm5f Y29uZmlndXJlZDsKKwkJZ290byByZXRyeTsKKwl9CisKKwkvKgorCSAqIElmIHRoZSBCSU9TIGRp ZG4ndCBlbmFibGUgZXZlcnl0aGluZyBpdCBjb3VsZCwgZmFsbCBiYWNrIHRvIGhhdmUgdGhlCisJ ICogc2FtZSB1c2VyIGV4cGVyaWVuY2luZyBvZiBsaWdodGluZyB1cCBhcyBtdWNoIGFzIHBvc3Np YmxlIGxpa2UgdGhlCisJICogZmJkZXYgaGVscGVyIGxpYnJhcnkuCisJICovCisJaWYgKG51bV9j b25uZWN0b3JzX2VuYWJsZWQgIT0gbnVtX2Nvbm5lY3RvcnNfZGV0ZWN0ZWQgJiYKKwkgICAgbnVt X2Nvbm5lY3RvcnNfZW5hYmxlZCA8IGRldi0+bW9kZV9jb25maWcubnVtX2NydGMpIHsKKwkJRFJN X0RFQlVHX0tNUygiZmFsbGJhY2s6IE5vdCBhbGwgb3V0cHV0cyBlbmFibGVkXG4iKTsKKwkJRFJN X0RFQlVHX0tNUygiRW5hYmxlZDogJWksIGRldGVjdGVkOiAlaVxuIiwgbnVtX2Nvbm5lY3RvcnNf ZW5hYmxlZCwKKwkJCSAgICAgIG51bV9jb25uZWN0b3JzX2RldGVjdGVkKTsKKwkJZmFsbGJhY2sg PSB0cnVlOworCX0KKworCWlmIChmYWxsYmFjaykgeworYmFpbDoKKwkJRFJNX0RFQlVHX0tNUygi Tm90IHVzaW5nIGZpcm13YXJlIGNvbmZpZ3VyYXRpb25cbiIpOworCQltZW1jcHkoZW5hYmxlZCwg c2F2ZV9lbmFibGVkLCBjb3VudCk7CisJCXJldCA9IGZhbHNlOworCX0KKworCWRybV9tb2Rlc2V0 X2Ryb3BfbG9ja3MoJmN0eCk7CisJZHJtX21vZGVzZXRfYWNxdWlyZV9maW5pKCZjdHgpOworCisJ a2ZyZWUoc2F2ZV9lbmFibGVkKTsKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGRybV9jbGll bnRfbW9kZXNldF9wcm9iZSgpIC0gUHJvYmUgZm9yIGRpc3BsYXlzCisgKiBAY2xpZW50OiBEUk0g Y2xpZW50CisgKiBAd2lkdGg6IE1heGltdW0gZGlzcGxheSBtb2RlIHdpZHRoIChvcHRpb25hbCkK KyAqIEBoZWlnaHQ6IE1heGltdW0gZGlzcGxheSBtb2RlIGhlaWdodCAob3B0aW9uYWwpCisgKgor ICogVGhpcyBmdW5jdGlvbiBzZXRzIHVwIGRpc3BsYXkgcGlwZWxpbmVzIGZvciBlbmFibGVkIGNv bm5lY3RvcnMgYW5kIHN0b3JlcyB0aGUKKyAqIGNvbmZpZyBpbiB0aGUgY2xpZW50J3MgbW9kZXNl dCBhcnJheS4KKyAqCisgKiBSZXR1cm5zOgorICogWmVybyBvbiBzdWNjZXNzIG9yIG5lZ2F0aXZl IGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAqLworCitpbnQgZHJtX2NsaWVudF9tb2Rlc2V0X3By b2JlKHN0cnVjdCBkcm1fY2xpZW50X2RldiAqY2xpZW50LCB1bnNpZ25lZCBpbnQgd2lkdGgsIHVu c2lnbmVkIGludCBoZWlnaHQpCit7CisJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3Rvciwg Kipjb25uZWN0b3JzID0gTlVMTDsKKwlzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9saXN0X2l0ZXIgY29u bl9pdGVyOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjbGllbnQtPmRldjsKKwl1bnNpZ25l ZCBpbnQgdG90YWxfbW9kZXNfY291bnQgPSAwOworCXN0cnVjdCBkcm1fY2xpZW50X29mZnNldCAq b2Zmc2V0czsKKwl1bnNpZ25lZCBpbnQgY29ubmVjdG9yX2NvdW50ID0gMDsKKwlzdHJ1Y3QgZHJt X2Rpc3BsYXlfbW9kZSAqKm1vZGVzOworCXN0cnVjdCBkcm1fY3J0YyAqKmNydGNzOworCWludCBp LCByZXQgPSAwOworCWJvb2wgKmVuYWJsZWQ7CisKKwlEUk1fREVCVUdfS01TKCJcbiIpOworCisJ aWYgKCF3aWR0aCkKKwkJd2lkdGggPSBkZXYtPm1vZGVfY29uZmlnLm1heF93aWR0aDsKKwlpZiAo IWhlaWdodCkKKwkJaGVpZ2h0ID0gZGV2LT5tb2RlX2NvbmZpZy5tYXhfaGVpZ2h0OworCisJZHJt X2Nvbm5lY3Rvcl9saXN0X2l0ZXJfYmVnaW4oZGV2LCAmY29ubl9pdGVyKTsKKwlkcm1fY2xpZW50 X2Zvcl9lYWNoX2Nvbm5lY3Rvcl9pdGVyKGNvbm5lY3RvciwgJmNvbm5faXRlcikgeworCQlzdHJ1 Y3QgZHJtX2Nvbm5lY3RvciAqKnRtcDsKKworCQl0bXAgPSBrcmVhbGxvYyhjb25uZWN0b3JzLCAo Y29ubmVjdG9yX2NvdW50ICsgMSkgKiBzaXplb2YoKmNvbm5lY3RvcnMpLCBHRlBfS0VSTkVMKTsK KwkJaWYgKCF0bXApIHsKKwkJCXJldCA9IC1FTk9NRU07CisJCQlnb3RvIGZyZWVfY29ubmVjdG9y czsKKwkJfQorCisJCWNvbm5lY3RvcnMgPSB0bXA7CisJCWRybV9jb25uZWN0b3JfZ2V0KGNvbm5l Y3Rvcik7CisJCWNvbm5lY3RvcnNbY29ubmVjdG9yX2NvdW50KytdID0gY29ubmVjdG9yOworCX0K Kwlkcm1fY29ubmVjdG9yX2xpc3RfaXRlcl9lbmQoJmNvbm5faXRlcik7CisKKwlpZiAoIWNvbm5l Y3Rvcl9jb3VudCkKKwkJcmV0dXJuIDA7CisKKwljcnRjcyA9IGtjYWxsb2MoY29ubmVjdG9yX2Nv dW50LCBzaXplb2YoKmNydGNzKSwgR0ZQX0tFUk5FTCk7CisJbW9kZXMgPSBrY2FsbG9jKGNvbm5l Y3Rvcl9jb3VudCwgc2l6ZW9mKCptb2RlcyksIEdGUF9LRVJORUwpOworCW9mZnNldHMgPSBrY2Fs bG9jKGNvbm5lY3Rvcl9jb3VudCwgc2l6ZW9mKCpvZmZzZXRzKSwgR0ZQX0tFUk5FTCk7CisJZW5h YmxlZCA9IGtjYWxsb2MoY29ubmVjdG9yX2NvdW50LCBzaXplb2YoYm9vbCksIEdGUF9LRVJORUwp OworCWlmICghY3J0Y3MgfHwgIW1vZGVzIHx8ICFlbmFibGVkIHx8ICFvZmZzZXRzKSB7CisJCURS TV9FUlJPUigiTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJcmV0ID0gLUVOT01FTTsK KwkJZ290byBvdXQ7CisJfQorCisJbXV0ZXhfbG9jaygmY2xpZW50LT5tb2Rlc2V0X211dGV4KTsK KworCW11dGV4X2xvY2soJmRldi0+bW9kZV9jb25maWcubXV0ZXgpOworCWZvciAoaSA9IDA7IGkg PCBjb25uZWN0b3JfY291bnQ7IGkrKykKKwkJdG90YWxfbW9kZXNfY291bnQgKz0gY29ubmVjdG9y c1tpXS0+ZnVuY3MtPmZpbGxfbW9kZXMoY29ubmVjdG9yc1tpXSwgd2lkdGgsIGhlaWdodCk7CisJ aWYgKCF0b3RhbF9tb2Rlc19jb3VudCkKKwkJRFJNX0RFQlVHX0tNUygiTm8gY29ubmVjdG9ycyBy ZXBvcnRlZCBjb25uZWN0ZWQgd2l0aCBtb2Rlc1xuIik7CisJZHJtX2NsaWVudF9jb25uZWN0b3Jz X2VuYWJsZWQoY29ubmVjdG9ycywgY29ubmVjdG9yX2NvdW50LCBlbmFibGVkKTsKKworCWlmICgh ZHJtX2NsaWVudF9maXJtd2FyZV9jb25maWcoY2xpZW50LCBjb25uZWN0b3JzLCBjb25uZWN0b3Jf Y291bnQsIGNydGNzLAorCQkJCQltb2Rlcywgb2Zmc2V0cywgZW5hYmxlZCwgd2lkdGgsIGhlaWdo dCkpIHsKKwkJbWVtc2V0KG1vZGVzLCAwLCBjb25uZWN0b3JfY291bnQgKiBzaXplb2YoKm1vZGVz KSk7CisJCW1lbXNldChjcnRjcywgMCwgY29ubmVjdG9yX2NvdW50ICogc2l6ZW9mKCpjcnRjcykp OworCQltZW1zZXQob2Zmc2V0cywgMCwgY29ubmVjdG9yX2NvdW50ICogc2l6ZW9mKCpvZmZzZXRz KSk7CisKKwkJaWYgKCFkcm1fY2xpZW50X3RhcmdldF9jbG9uZWQoZGV2LCBjb25uZWN0b3JzLCBj b25uZWN0b3JfY291bnQsIG1vZGVzLAorCQkJCQkgICAgICBvZmZzZXRzLCBlbmFibGVkLCB3aWR0 aCwgaGVpZ2h0KSAmJgorCQkgICAgIWRybV9jbGllbnRfdGFyZ2V0X3ByZWZlcnJlZChjb25uZWN0 b3JzLCBjb25uZWN0b3JfY291bnQsIG1vZGVzLAorCQkJCQkJIG9mZnNldHMsIGVuYWJsZWQsIHdp ZHRoLCBoZWlnaHQpKQorCQkJRFJNX0VSUk9SKCJVbmFibGUgdG8gZmluZCBpbml0aWFsIG1vZGVz XG4iKTsKKworCQlEUk1fREVCVUdfS01TKCJwaWNraW5nIENSVENzIGZvciAlZHglZCBjb25maWdc biIsCisJCQkgICAgICB3aWR0aCwgaGVpZ2h0KTsKKworCQlkcm1fY2xpZW50X3BpY2tfY3J0Y3Mo Y2xpZW50LCBjb25uZWN0b3JzLCBjb25uZWN0b3JfY291bnQsCisJCQkJICAgICAgY3J0Y3MsIG1v ZGVzLCAwLCB3aWR0aCwgaGVpZ2h0KTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZkZXYtPm1vZGVfY29u ZmlnLm11dGV4KTsKKworCWRybV9jbGllbnRfbW9kZXNldF9yZWxlYXNlKGNsaWVudCk7CisKKwlm b3IgKGkgPSAwOyBpIDwgY29ubmVjdG9yX2NvdW50OyBpKyspIHsKKwkJc3RydWN0IGRybV9kaXNw bGF5X21vZGUgKm1vZGUgPSBtb2Rlc1tpXTsKKwkJc3RydWN0IGRybV9jcnRjICpjcnRjID0gY3J0 Y3NbaV07CisJCXN0cnVjdCBkcm1fY2xpZW50X29mZnNldCAqb2Zmc2V0ID0gJm9mZnNldHNbaV07 CisKKwkJaWYgKG1vZGUgJiYgY3J0YykgeworCQkJc3RydWN0IGRybV9tb2RlX3NldCAqbW9kZXNl dCA9IGRybV9jbGllbnRfZmluZF9tb2Rlc2V0KGNsaWVudCwgY3J0Yyk7CisJCQlzdHJ1Y3QgZHJt X2Nvbm5lY3RvciAqY29ubmVjdG9yID0gY29ubmVjdG9yc1tpXTsKKworCQkJRFJNX0RFQlVHX0tN UygiZGVzaXJlZCBtb2RlICVzIHNldCBvbiBjcnRjICVkICglZCwlZClcbiIsCisJCQkJICAgICAg bW9kZS0+bmFtZSwgY3J0Yy0+YmFzZS5pZCwgb2Zmc2V0LT54LCBvZmZzZXQtPnkpOworCisJCQlp ZiAoV0FSTl9PTl9PTkNFKG1vZGVzZXQtPm51bV9jb25uZWN0b3JzID09IERSTV9DTElFTlRfTUFY X0NMT05FRF9DT05ORUNUT1JTIHx8CisJCQkJCSAoZGV2LT5tb2RlX2NvbmZpZy5udW1fY3J0YyA+ IDEgJiYgbW9kZXNldC0+bnVtX2Nvbm5lY3RvcnMgPT0gMSkpKSB7CisJCQkJcmV0ID0gLUVJTlZB TDsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJbW9kZXNldC0+bW9kZSA9IGRybV9tb2RlX2R1cGxp Y2F0ZShkZXYsIG1vZGUpOworCQkJZHJtX2Nvbm5lY3Rvcl9nZXQoY29ubmVjdG9yKTsKKwkJCW1v ZGVzZXQtPmNvbm5lY3RvcnNbbW9kZXNldC0+bnVtX2Nvbm5lY3RvcnMrK10gPSBjb25uZWN0b3I7 CisJCQltb2Rlc2V0LT54ID0gb2Zmc2V0LT54OworCQkJbW9kZXNldC0+eSA9IG9mZnNldC0+eTsK KwkJfQorCX0KKworCW11dGV4X3VubG9jaygmY2xpZW50LT5tb2Rlc2V0X211dGV4KTsKK291dDoK KwlrZnJlZShjcnRjcyk7CisJa2ZyZWUobW9kZXMpOworCWtmcmVlKG9mZnNldHMpOworCWtmcmVl KGVuYWJsZWQpOworZnJlZV9jb25uZWN0b3JzOgorCWZvciAoaSA9IDA7IGkgPCBjb25uZWN0b3Jf Y291bnQ7IGkrKykKKwkJZHJtX2Nvbm5lY3Rvcl9wdXQoY29ubmVjdG9yc1tpXSk7CisJa2ZyZWUo Y29ubmVjdG9ycyk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChkcm1fY2xpZW50 X21vZGVzZXRfcHJvYmUpOwogCiAvKioKICAqIGRybV9jbGllbnRfcGFuZWxfcm90YXRpb24oKSAt IENoZWNrIHBhbmVsIG9yaWVudGF0aW9uCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJt X2ZiX2hlbHBlci5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9mYl9oZWxwZXIuYwppbmRleCA5Mjg3 ZmY0YWUyZDguLmU2NDg2ZDljMDM4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9m Yl9oZWxwZXIuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2ZiX2hlbHBlci5jCkBAIC00Mywx MCArNDMsNiBAQAogCiAjaW5jbHVkZSAiZHJtX2ludGVybmFsLmgiCiAKLXN0cnVjdCBkcm1fY2xp ZW50X29mZnNldCB7Ci0JaW50IHgsIHk7Ci19OwotCiBzdGF0aWMgYm9vbCBkcm1fZmJkZXZfZW11 bGF0aW9uID0gdHJ1ZTsKIG1vZHVsZV9wYXJhbV9uYW1lZChmYmRldl9lbXVsYXRpb24sIGRybV9m YmRldl9lbXVsYXRpb24sIGJvb2wsIDA2MDApOwogTU9EVUxFX1BBUk1fREVTQyhmYmRldl9lbXVs YXRpb24sCkBAIC0xNjg4LDY5NCArMTY4NCw2IEBAIHZvaWQgZHJtX2ZiX2hlbHBlcl9maWxsX2lu Zm8oc3RydWN0IGZiX2luZm8gKmluZm8sCiB9CiBFWFBPUlRfU1lNQk9MKGRybV9mYl9oZWxwZXJf ZmlsbF9pbmZvKTsKIAotc3RhdGljIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICoKLWRybV9jb25u ZWN0b3JfaGFzX3ByZWZlcnJlZF9tb2RlKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3Is IGludCB3aWR0aCwgaW50IGhlaWdodCkKLXsKLQlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9k ZTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkobW9kZSwgJmNvbm5lY3Rvci0+bW9kZXMsIGhlYWQp IHsKLQkJaWYgKG1vZGUtPmhkaXNwbGF5ID4gd2lkdGggfHwKLQkJICAgIG1vZGUtPnZkaXNwbGF5 ID4gaGVpZ2h0KQotCQkJY29udGludWU7Ci0JCWlmIChtb2RlLT50eXBlICYgRFJNX01PREVfVFlQ RV9QUkVGRVJSRUQpCi0JCQlyZXR1cm4gbW9kZTsKLQl9Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0 YXRpYyBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqCi1kcm1fY29ubmVjdG9yX3BpY2tfY21kbGlu ZV9tb2RlKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCi17Ci0Jc3RydWN0IGRybV9j bWRsaW5lX21vZGUgKmNtZGxpbmVfbW9kZTsKLQlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9k ZTsKLQlib29sIHByZWZlcl9ub25faW50ZXJsYWNlOwotCi0JY21kbGluZV9tb2RlID0gJmNvbm5l Y3Rvci0+Y21kbGluZV9tb2RlOwotCWlmIChjbWRsaW5lX21vZGUtPnNwZWNpZmllZCA9PSBmYWxz ZSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQkvKiBhdHRlbXB0IHRvIGZpbmQgYSBtYXRjaGluZyBtb2Rl IGluIHRoZSBsaXN0IG9mIG1vZGVzCi0JICogIHdlIGhhdmUgZ290dGVuIHNvIGZhciwgaWYgbm90 IGFkZCBhIENWVCBtb2RlIHRoYXQgY29uZm9ybXMKLQkgKi8KLQlpZiAoY21kbGluZV9tb2RlLT5y YiB8fCBjbWRsaW5lX21vZGUtPm1hcmdpbnMpCi0JCWdvdG8gY3JlYXRlX21vZGU7Ci0KLQlwcmVm ZXJfbm9uX2ludGVybGFjZSA9ICFjbWRsaW5lX21vZGUtPmludGVybGFjZTsKLWFnYWluOgotCWxp c3RfZm9yX2VhY2hfZW50cnkobW9kZSwgJmNvbm5lY3Rvci0+bW9kZXMsIGhlYWQpIHsKLQkJLyog Y2hlY2sgd2lkdGgvaGVpZ2h0ICovCi0JCWlmIChtb2RlLT5oZGlzcGxheSAhPSBjbWRsaW5lX21v ZGUtPnhyZXMgfHwKLQkJICAgIG1vZGUtPnZkaXNwbGF5ICE9IGNtZGxpbmVfbW9kZS0+eXJlcykK LQkJCWNvbnRpbnVlOwotCi0JCWlmIChjbWRsaW5lX21vZGUtPnJlZnJlc2hfc3BlY2lmaWVkKSB7 Ci0JCQlpZiAobW9kZS0+dnJlZnJlc2ggIT0gY21kbGluZV9tb2RlLT5yZWZyZXNoKQotCQkJCWNv bnRpbnVlOwotCQl9Ci0KLQkJaWYgKGNtZGxpbmVfbW9kZS0+aW50ZXJsYWNlKSB7Ci0JCQlpZiAo IShtb2RlLT5mbGFncyAmIERSTV9NT0RFX0ZMQUdfSU5URVJMQUNFKSkKLQkJCQljb250aW51ZTsK LQkJfSBlbHNlIGlmIChwcmVmZXJfbm9uX2ludGVybGFjZSkgewotCQkJaWYgKG1vZGUtPmZsYWdz ICYgRFJNX01PREVfRkxBR19JTlRFUkxBQ0UpCi0JCQkJY29udGludWU7Ci0JCX0KLQkJcmV0dXJu IG1vZGU7Ci0JfQotCi0JaWYgKHByZWZlcl9ub25faW50ZXJsYWNlKSB7Ci0JCXByZWZlcl9ub25f aW50ZXJsYWNlID0gZmFsc2U7Ci0JCWdvdG8gYWdhaW47Ci0JfQotCi1jcmVhdGVfbW9kZToKLQlt b2RlID0gZHJtX21vZGVfY3JlYXRlX2Zyb21fY21kbGluZV9tb2RlKGNvbm5lY3Rvci0+ZGV2LCBj bWRsaW5lX21vZGUpOwotCWxpc3RfYWRkKCZtb2RlLT5oZWFkLCAmY29ubmVjdG9yLT5tb2Rlcyk7 Ci0KLQlyZXR1cm4gbW9kZTsKLX0KLQotc3RhdGljIGJvb2wgZHJtX2Nvbm5lY3Rvcl9lbmFibGVk KHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsIGJvb2wgc3RyaWN0KQotewotCWJvb2wg ZW5hYmxlOwotCi0JaWYgKGNvbm5lY3Rvci0+ZGlzcGxheV9pbmZvLm5vbl9kZXNrdG9wKQotCQly ZXR1cm4gZmFsc2U7Ci0KLQlpZiAoc3RyaWN0KQotCQllbmFibGUgPSBjb25uZWN0b3ItPnN0YXR1 cyA9PSBjb25uZWN0b3Jfc3RhdHVzX2Nvbm5lY3RlZDsKLQllbHNlCi0JCWVuYWJsZSA9IGNvbm5l Y3Rvci0+c3RhdHVzICE9IGNvbm5lY3Rvcl9zdGF0dXNfZGlzY29ubmVjdGVkOwotCi0JcmV0dXJu IGVuYWJsZTsKLX0KLQotc3RhdGljIHZvaWQgZHJtX2NsaWVudF9jb25uZWN0b3JzX2VuYWJsZWQo c3RydWN0IGRybV9jb25uZWN0b3IgKipjb25uZWN0b3JzLAotCQkJCQkgIHVuc2lnbmVkIGludCBj b25uZWN0b3JfY291bnQsCi0JCQkJCSAgYm9vbCAqZW5hYmxlZCkKLXsKLQlib29sIGFueV9lbmFi bGVkID0gZmFsc2U7Ci0Jc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcjsKLQlpbnQgaSA9 IDA7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgY29ubmVjdG9yX2NvdW50OyBpKyspIHsKLQkJY29ubmVj dG9yID0gY29ubmVjdG9yc1tpXTsKLQkJZW5hYmxlZFtpXSA9IGRybV9jb25uZWN0b3JfZW5hYmxl ZChjb25uZWN0b3IsIHRydWUpOwotCQlEUk1fREVCVUdfS01TKCJjb25uZWN0b3IgJWQgZW5hYmxl ZD8gJXNcbiIsIGNvbm5lY3Rvci0+YmFzZS5pZCwKLQkJCSAgICAgIGNvbm5lY3Rvci0+ZGlzcGxh eV9pbmZvLm5vbl9kZXNrdG9wID8gIm5vbiBkZXNrdG9wIiA6IGVuYWJsZWRbaV0gPyAieWVzIiA6 ICJubyIpOwotCi0JCWFueV9lbmFibGVkIHw9IGVuYWJsZWRbaV07Ci0JfQotCi0JaWYgKGFueV9l bmFibGVkKQotCQlyZXR1cm47Ci0KLQlmb3IgKGkgPSAwOyBpIDwgY29ubmVjdG9yX2NvdW50OyBp KyspCi0JCWVuYWJsZWRbaV0gPSBkcm1fY29ubmVjdG9yX2VuYWJsZWQoY29ubmVjdG9yc1tpXSwg ZmFsc2UpOwotfQotCi1zdGF0aWMgYm9vbCBkcm1fY2xpZW50X3RhcmdldF9jbG9uZWQoc3RydWN0 IGRybV9kZXZpY2UgKmRldiwKLQkJCQkgICAgIHN0cnVjdCBkcm1fY29ubmVjdG9yICoqY29ubmVj dG9ycywKLQkJCQkgICAgIHVuc2lnbmVkIGludCBjb25uZWN0b3JfY291bnQsCi0JCQkJICAgICBz dHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqKm1vZGVzLAotCQkJCSAgICAgc3RydWN0IGRybV9jbGll bnRfb2Zmc2V0ICpvZmZzZXRzLAotCQkJCSAgICAgYm9vbCAqZW5hYmxlZCwgaW50IHdpZHRoLCBp bnQgaGVpZ2h0KQotewotCWludCBjb3VudCwgaSwgajsKLQlib29sIGNhbl9jbG9uZSA9IGZhbHNl OwotCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICpkbXRfbW9kZSwgKm1vZGU7Ci0KLQkvKiBvbmx5 IGNvbnRlbXBsYXRlIGNsb25pbmcgaW4gdGhlIHNpbmdsZSBjcnRjIGNhc2UgKi8KLQlpZiAoZGV2 LT5tb2RlX2NvbmZpZy5udW1fY3J0YyA+IDEpCi0JCXJldHVybiBmYWxzZTsKLQotCWNvdW50ID0g MDsKLQlmb3IgKGkgPSAwOyBpIDwgY29ubmVjdG9yX2NvdW50OyBpKyspIHsKLQkJaWYgKGVuYWJs ZWRbaV0pCi0JCQljb3VudCsrOwotCX0KLQotCS8qIG9ubHkgY29udGVtcGxhdGUgY2xvbmluZyBp ZiBtb3JlIHRoYW4gb25lIGNvbm5lY3RvciBpcyBlbmFibGVkICovCi0JaWYgKGNvdW50IDw9IDEp Ci0JCXJldHVybiBmYWxzZTsKLQotCS8qIGNoZWNrIHRoZSBjb21tYW5kIGxpbmUgb3IgaWYgbm90 aGluZyBjb21tb24gcGljayAxMDI0eDc2OCAqLwotCWNhbl9jbG9uZSA9IHRydWU7Ci0JZm9yIChp ID0gMDsgaSA8IGNvbm5lY3Rvcl9jb3VudDsgaSsrKSB7Ci0JCWlmICghZW5hYmxlZFtpXSkKLQkJ CWNvbnRpbnVlOwotCQltb2Rlc1tpXSA9IGRybV9jb25uZWN0b3JfcGlja19jbWRsaW5lX21vZGUo Y29ubmVjdG9yc1tpXSk7Ci0JCWlmICghbW9kZXNbaV0pIHsKLQkJCWNhbl9jbG9uZSA9IGZhbHNl OwotCQkJYnJlYWs7Ci0JCX0KLQkJZm9yIChqID0gMDsgaiA8IGk7IGorKykgewotCQkJaWYgKCFl bmFibGVkW2pdKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKCFkcm1fbW9kZV9tYXRjaChtb2Rlc1tq XSwgbW9kZXNbaV0sCi0JCQkJCSAgICBEUk1fTU9ERV9NQVRDSF9USU1JTkdTIHwKLQkJCQkJICAg IERSTV9NT0RFX01BVENIX0NMT0NLIHwKLQkJCQkJICAgIERSTV9NT0RFX01BVENIX0ZMQUdTIHwK LQkJCQkJICAgIERSTV9NT0RFX01BVENIXzNEX0ZMQUdTKSkKLQkJCQljYW5fY2xvbmUgPSBmYWxz ZTsKLQkJfQotCX0KLQotCWlmIChjYW5fY2xvbmUpIHsKLQkJRFJNX0RFQlVHX0tNUygiY2FuIGNs b25lIHVzaW5nIGNvbW1hbmQgbGluZVxuIik7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qIHRy eSBhbmQgZmluZCBhIDEwMjR4NzY4IG1vZGUgb24gZWFjaCBjb25uZWN0b3IgKi8KLQljYW5fY2xv bmUgPSB0cnVlOwotCWRtdF9tb2RlID0gZHJtX21vZGVfZmluZF9kbXQoZGV2LCAxMDI0LCA3Njgs IDYwLCBmYWxzZSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgY29ubmVjdG9yX2NvdW50OyBpKyspIHsK LQkJaWYgKCFlbmFibGVkW2ldKQotCQkJY29udGludWU7Ci0KLQkJbGlzdF9mb3JfZWFjaF9lbnRy eShtb2RlLCAmY29ubmVjdG9yc1tpXS0+bW9kZXMsIGhlYWQpIHsKLQkJCWlmIChkcm1fbW9kZV9t YXRjaChtb2RlLCBkbXRfbW9kZSwKLQkJCQkJICAgRFJNX01PREVfTUFUQ0hfVElNSU5HUyB8Ci0J CQkJCSAgIERSTV9NT0RFX01BVENIX0NMT0NLIHwKLQkJCQkJICAgRFJNX01PREVfTUFUQ0hfRkxB R1MgfAotCQkJCQkgICBEUk1fTU9ERV9NQVRDSF8zRF9GTEFHUykpCi0JCQkJbW9kZXNbaV0gPSBt b2RlOwotCQl9Ci0JCWlmICghbW9kZXNbaV0pCi0JCQljYW5fY2xvbmUgPSBmYWxzZTsKLQl9Ci0K LQlpZiAoY2FuX2Nsb25lKSB7Ci0JCURSTV9ERUJVR19LTVMoImNhbiBjbG9uZSB1c2luZyAxMDI0 eDc2OFxuIik7Ci0JCXJldHVybiB0cnVlOwotCX0KLQlEUk1fSU5GTygia21zOiBjYW4ndCBlbmFi bGUgY2xvbmluZyB3aGVuIHdlIHByb2JhYmx5IHdhbnRlZCB0by5cbiIpOwotCXJldHVybiBmYWxz ZTsKLX0KLQotc3RhdGljIGludCBkcm1fY2xpZW50X2dldF90aWxlX29mZnNldHMoc3RydWN0IGRy bV9jb25uZWN0b3IgKipjb25uZWN0b3JzLAotCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgY29ubmVj dG9yX2NvdW50LAotCQkJCSAgICAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqKm1vZGVzLAot CQkJCSAgICAgICBzdHJ1Y3QgZHJtX2NsaWVudF9vZmZzZXQgKm9mZnNldHMsCi0JCQkJICAgICAg IGludCBpZHgsCi0JCQkJICAgICAgIGludCBoX2lkeCwgaW50IHZfaWR4KQotewotCXN0cnVjdCBk cm1fY29ubmVjdG9yICpjb25uZWN0b3I7Ci0JaW50IGk7Ci0JaW50IGhvZmZzZXQgPSAwLCB2b2Zm c2V0ID0gMDsKLQotCWZvciAoaSA9IDA7IGkgPCBjb25uZWN0b3JfY291bnQ7IGkrKykgewotCQlj b25uZWN0b3IgPSBjb25uZWN0b3JzW2ldOwotCQlpZiAoIWNvbm5lY3Rvci0+aGFzX3RpbGUpCi0J CQljb250aW51ZTsKLQotCQlpZiAoIW1vZGVzW2ldICYmIChoX2lkeCB8fCB2X2lkeCkpIHsKLQkJ CURSTV9ERUJVR19LTVMoIm5vIG1vZGVzIGZvciBjb25uZWN0b3IgdGlsZWQgJWQgJWRcbiIsIGks Ci0JCQkJICAgICAgY29ubmVjdG9yLT5iYXNlLmlkKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlm IChjb25uZWN0b3ItPnRpbGVfaF9sb2MgPCBoX2lkeCkKLQkJCWhvZmZzZXQgKz0gbW9kZXNbaV0t PmhkaXNwbGF5OwotCi0JCWlmIChjb25uZWN0b3ItPnRpbGVfdl9sb2MgPCB2X2lkeCkKLQkJCXZv ZmZzZXQgKz0gbW9kZXNbaV0tPnZkaXNwbGF5OwotCX0KLQlvZmZzZXRzW2lkeF0ueCA9IGhvZmZz ZXQ7Ci0Jb2Zmc2V0c1tpZHhdLnkgPSB2b2Zmc2V0OwotCURSTV9ERUJVR19LTVMoInJldHVybmVk ICVkICVkIGZvciAlZCAlZFxuIiwgaG9mZnNldCwgdm9mZnNldCwgaF9pZHgsIHZfaWR4KTsKLQly ZXR1cm4gMDsKLX0KLQotc3RhdGljIGJvb2wgZHJtX2NsaWVudF90YXJnZXRfcHJlZmVycmVkKHN0 cnVjdCBkcm1fY29ubmVjdG9yICoqY29ubmVjdG9ycywKLQkJCQkJdW5zaWduZWQgaW50IGNvbm5l Y3Rvcl9jb3VudCwKLQkJCQkJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKiptb2RlcywKLQkJCQkJ c3RydWN0IGRybV9jbGllbnRfb2Zmc2V0ICpvZmZzZXRzLAotCQkJCQlib29sICplbmFibGVkLCBp bnQgd2lkdGgsIGludCBoZWlnaHQpCi17Ci0JY29uc3QgdTY0IG1hc2sgPSBCSVRfVUxMKGNvbm5l Y3Rvcl9jb3VudCkgLSAxOwotCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3I7Ci0JdTY0 IGNvbm5fY29uZmlndXJlZCA9IDA7Ci0JaW50IHRpbGVfcGFzcyA9IDA7Ci0JaW50IGk7Ci0KLXJl dHJ5OgotCWZvciAoaSA9IDA7IGkgPCBjb25uZWN0b3JfY291bnQ7IGkrKykgewotCQljb25uZWN0 b3IgPSBjb25uZWN0b3JzW2ldOwotCi0JCWlmIChjb25uX2NvbmZpZ3VyZWQgJiBCSVRfVUxMKGkp KQotCQkJY29udGludWU7Ci0KLQkJaWYgKGVuYWJsZWRbaV0gPT0gZmFsc2UpIHsKLQkJCWNvbm5f Y29uZmlndXJlZCB8PSBCSVRfVUxMKGkpOwotCQkJY29udGludWU7Ci0JCX0KLQotCQkvKiBmaXJz dCBwYXNzIG92ZXIgYWxsIHRoZSB1bnRpbGVkIGNvbm5lY3RvcnMgKi8KLQkJaWYgKHRpbGVfcGFz cyA9PSAwICYmIGNvbm5lY3Rvci0+aGFzX3RpbGUpCi0JCQljb250aW51ZTsKLQotCQlpZiAodGls ZV9wYXNzID09IDEpIHsKLQkJCWlmIChjb25uZWN0b3ItPnRpbGVfaF9sb2MgIT0gMCB8fAotCQkJ ICAgIGNvbm5lY3Rvci0+dGlsZV92X2xvYyAhPSAwKQotCQkJCWNvbnRpbnVlOwotCi0JCX0gZWxz ZSB7Ci0JCQlpZiAoY29ubmVjdG9yLT50aWxlX2hfbG9jICE9IHRpbGVfcGFzcyAtIDEgJiYKLQkJ CSAgICBjb25uZWN0b3ItPnRpbGVfdl9sb2MgIT0gdGlsZV9wYXNzIC0gMSkKLQkJCS8qIGlmIHRo aXMgdGlsZV9wYXNzIGRvZXNuJ3QgY292ZXIgYW55IG9mIHRoZSB0aWxlcyAtIGtlZXAgZ29pbmcg Ki8KLQkJCQljb250aW51ZTsKLQotCQkJLyoKLQkJCSAqIGZpbmQgdGhlIHRpbGUgb2Zmc2V0cyBm b3IgdGhpcyBwYXNzIC0gbmVlZCB0byBmaW5kCi0JCQkgKiBhbGwgdGlsZXMgbGVmdCBhbmQgYWJv dmUKLQkJCSAqLwotCQkJZHJtX2NsaWVudF9nZXRfdGlsZV9vZmZzZXRzKGNvbm5lY3RvcnMsIGNv bm5lY3Rvcl9jb3VudCwgbW9kZXMsIG9mZnNldHMsIGksCi0JCQkJCQkgICAgY29ubmVjdG9yLT50 aWxlX2hfbG9jLCBjb25uZWN0b3ItPnRpbGVfdl9sb2MpOwotCQl9Ci0JCURSTV9ERUJVR19LTVMo Imxvb2tpbmcgZm9yIGNtZGxpbmUgbW9kZSBvbiBjb25uZWN0b3IgJWRcbiIsCi0JCQkgICAgICBj b25uZWN0b3ItPmJhc2UuaWQpOwotCi0JCS8qIGdvdCBmb3IgY29tbWFuZCBsaW5lIG1vZGUgZmly c3QgKi8KLQkJbW9kZXNbaV0gPSBkcm1fY29ubmVjdG9yX3BpY2tfY21kbGluZV9tb2RlKGNvbm5l Y3Rvcik7Ci0JCWlmICghbW9kZXNbaV0pIHsKLQkJCURSTV9ERUJVR19LTVMoImxvb2tpbmcgZm9y IHByZWZlcnJlZCBtb2RlIG9uIGNvbm5lY3RvciAlZCAlZFxuIiwKLQkJCQkgICAgICBjb25uZWN0 b3ItPmJhc2UuaWQsIGNvbm5lY3Rvci0+dGlsZV9ncm91cCA/IGNvbm5lY3Rvci0+dGlsZV9ncm91 cC0+aWQgOiAwKTsKLQkJCW1vZGVzW2ldID0gZHJtX2Nvbm5lY3Rvcl9oYXNfcHJlZmVycmVkX21v ZGUoY29ubmVjdG9yLCB3aWR0aCwgaGVpZ2h0KTsKLQkJfQotCQkvKiBObyBwcmVmZXJyZWQgbW9k ZXMsIHBpY2sgb25lIG9mZiB0aGUgbGlzdCAqLwotCQlpZiAoIW1vZGVzW2ldICYmICFsaXN0X2Vt cHR5KCZjb25uZWN0b3ItPm1vZGVzKSkgewotCQkJbGlzdF9mb3JfZWFjaF9lbnRyeShtb2Rlc1tp XSwgJmNvbm5lY3Rvci0+bW9kZXMsIGhlYWQpCi0JCQkJYnJlYWs7Ci0JCX0KLQkJRFJNX0RFQlVH X0tNUygiZm91bmQgbW9kZSAlc1xuIiwgbW9kZXNbaV0gPyBtb2Rlc1tpXS0+bmFtZSA6Ci0JCQkg ICJub25lIik7Ci0JCWNvbm5fY29uZmlndXJlZCB8PSBCSVRfVUxMKGkpOwotCX0KLQotCWlmICgo Y29ubl9jb25maWd1cmVkICYgbWFzaykgIT0gbWFzaykgewotCQl0aWxlX3Bhc3MrKzsKLQkJZ290 byByZXRyeTsKLQl9Ci0JcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sIGNvbm5lY3Rvcl9o YXNfcG9zc2libGVfY3J0YyhzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLAotCQkJCQlz dHJ1Y3QgZHJtX2NydGMgKmNydGMpCi17Ci0Jc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyOwot CWludCBpOwotCi0JZHJtX2Nvbm5lY3Rvcl9mb3JfZWFjaF9wb3NzaWJsZV9lbmNvZGVyKGNvbm5l Y3RvciwgZW5jb2RlciwgaSkgewotCQlpZiAoZW5jb2Rlci0+cG9zc2libGVfY3J0Y3MgJiBkcm1f Y3J0Y19tYXNrKGNydGMpKQotCQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcmV0dXJuIGZhbHNlOwot fQotCi1zdGF0aWMgaW50IGRybV9jbGllbnRfcGlja19jcnRjcyhzdHJ1Y3QgZHJtX2NsaWVudF9k ZXYgKmNsaWVudCwKLQkJCQkgc3RydWN0IGRybV9jb25uZWN0b3IgKipjb25uZWN0b3JzLAotCQkJ CSB1bnNpZ25lZCBpbnQgY29ubmVjdG9yX2NvdW50LAotCQkJCSBzdHJ1Y3QgZHJtX2NydGMgKipi ZXN0X2NydGNzLAotCQkJCSBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqKm1vZGVzLAotCQkJCSBp bnQgbiwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQotewotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYg PSBjbGllbnQtPmRldjsKLQlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yOwotCWludCBt eV9zY29yZSwgYmVzdF9zY29yZSwgc2NvcmU7Ci0Jc3RydWN0IGRybV9jcnRjICoqY3J0Y3MsICpj cnRjOwotCXN0cnVjdCBkcm1fbW9kZV9zZXQgKm1vZGVzZXQ7Ci0JaW50IG87Ci0KLQlpZiAobiA9 PSBjb25uZWN0b3JfY291bnQpCi0JCXJldHVybiAwOwotCi0JY29ubmVjdG9yID0gY29ubmVjdG9y c1tuXTsKLQotCWJlc3RfY3J0Y3Nbbl0gPSBOVUxMOwotCWJlc3Rfc2NvcmUgPSBkcm1fY2xpZW50 X3BpY2tfY3J0Y3MoY2xpZW50LCBjb25uZWN0b3JzLCBjb25uZWN0b3JfY291bnQsCi0JCQkJCSAg IGJlc3RfY3J0Y3MsIG1vZGVzLCBuICsgMSwgd2lkdGgsIGhlaWdodCk7Ci0JaWYgKG1vZGVzW25d ID09IE5VTEwpCi0JCXJldHVybiBiZXN0X3Njb3JlOwotCi0JY3J0Y3MgPSBrY2FsbG9jKGNvbm5l Y3Rvcl9jb3VudCwgc2l6ZW9mKCpjcnRjcyksIEdGUF9LRVJORUwpOwotCWlmICghY3J0Y3MpCi0J CXJldHVybiBiZXN0X3Njb3JlOwotCi0JbXlfc2NvcmUgPSAxOwotCWlmIChjb25uZWN0b3ItPnN0 YXR1cyA9PSBjb25uZWN0b3Jfc3RhdHVzX2Nvbm5lY3RlZCkKLQkJbXlfc2NvcmUrKzsKLQlpZiAo Y29ubmVjdG9yLT5jbWRsaW5lX21vZGUuc3BlY2lmaWVkKQotCQlteV9zY29yZSsrOwotCWlmIChk cm1fY29ubmVjdG9yX2hhc19wcmVmZXJyZWRfbW9kZShjb25uZWN0b3IsIHdpZHRoLCBoZWlnaHQp KQotCQlteV9zY29yZSsrOwotCi0JLyoKLQkgKiBzZWxlY3QgYSBjcnRjIGZvciB0aGlzIGNvbm5l Y3RvciBhbmQgdGhlbiBhdHRlbXB0IHRvIGNvbmZpZ3VyZQotCSAqIHJlbWFpbmluZyBjb25uZWN0 b3JzCi0JICovCi0JZHJtX2NsaWVudF9mb3JfZWFjaF9tb2Rlc2V0KG1vZGVzZXQsIGNsaWVudCkg ewotCQljcnRjID0gbW9kZXNldC0+Y3J0YzsKLQotCQlpZiAoIWNvbm5lY3Rvcl9oYXNfcG9zc2li bGVfY3J0Yyhjb25uZWN0b3IsIGNydGMpKQotCQkJY29udGludWU7Ci0KLQkJZm9yIChvID0gMDsg byA8IG47IG8rKykKLQkJCWlmIChiZXN0X2NydGNzW29dID09IGNydGMpCi0JCQkJYnJlYWs7Ci0K LQkJaWYgKG8gPCBuKSB7Ci0JCQkvKiBpZ25vcmUgY2xvbmluZyB1bmxlc3Mgb25seSBhIHNpbmds ZSBjcnRjICovCi0JCQlpZiAoZGV2LT5tb2RlX2NvbmZpZy5udW1fY3J0YyA+IDEpCi0JCQkJY29u dGludWU7Ci0KLQkJCWlmICghZHJtX21vZGVfZXF1YWwobW9kZXNbb10sIG1vZGVzW25dKSkKLQkJ CQljb250aW51ZTsKLQkJfQotCi0JCWNydGNzW25dID0gY3J0YzsKLQkJbWVtY3B5KGNydGNzLCBi ZXN0X2NydGNzLCBuICogc2l6ZW9mKCpjcnRjcykpOwotCQlzY29yZSA9IG15X3Njb3JlICsgZHJt X2NsaWVudF9waWNrX2NydGNzKGNsaWVudCwgY29ubmVjdG9ycywgY29ubmVjdG9yX2NvdW50LAot CQkJCQkJCSBjcnRjcywgbW9kZXMsIG4gKyAxLCB3aWR0aCwgaGVpZ2h0KTsKLQkJaWYgKHNjb3Jl ID4gYmVzdF9zY29yZSkgewotCQkJYmVzdF9zY29yZSA9IHNjb3JlOwotCQkJbWVtY3B5KGJlc3Rf Y3J0Y3MsIGNydGNzLCBjb25uZWN0b3JfY291bnQgKiBzaXplb2YoKmNydGNzKSk7Ci0JCX0KLQl9 Ci0KLQlrZnJlZShjcnRjcyk7Ci0JcmV0dXJuIGJlc3Rfc2NvcmU7Ci19Ci0KLS8qIFRyeSB0byBy ZWFkIHRoZSBCSU9TIGRpc3BsYXkgY29uZmlndXJhdGlvbiBhbmQgdXNlIGl0IGZvciB0aGUgaW5p dGlhbCBjb25maWcgKi8KLXN0YXRpYyBib29sIGRybV9jbGllbnRfZmlybXdhcmVfY29uZmlnKHN0 cnVjdCBkcm1fY2xpZW50X2RldiAqY2xpZW50LAotCQkJCSAgICAgICBzdHJ1Y3QgZHJtX2Nvbm5l Y3RvciAqKmNvbm5lY3RvcnMsCi0JCQkJICAgICAgIHVuc2lnbmVkIGludCBjb25uZWN0b3JfY291 bnQsCi0JCQkJICAgICAgIHN0cnVjdCBkcm1fY3J0YyAqKmNydGNzLAotCQkJCSAgICAgICBzdHJ1 Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqKm1vZGVzLAotCQkJCSAgICAgICBzdHJ1Y3QgZHJtX2NsaWVu dF9vZmZzZXQgKm9mZnNldHMsCi0JCQkJICAgICAgIGJvb2wgKmVuYWJsZWQsIGludCB3aWR0aCwg aW50IGhlaWdodCkKLXsKLQl1bnNpZ25lZCBpbnQgY291bnQgPSBtaW5fdCh1bnNpZ25lZCBpbnQs IGNvbm5lY3Rvcl9jb3VudCwgQklUU19QRVJfTE9ORyk7Ci0JdW5zaWduZWQgbG9uZyBjb25uX2Nv bmZpZ3VyZWQsIGNvbm5fc2VxOwotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjbGllbnQtPmRl djsKLQlpbnQgaSwgajsKLQlib29sICpzYXZlX2VuYWJsZWQ7Ci0JYm9vbCBmYWxsYmFjayA9IHRy dWUsIHJldCA9IHRydWU7Ci0JaW50IG51bV9jb25uZWN0b3JzX2VuYWJsZWQgPSAwOwotCWludCBu dW1fY29ubmVjdG9yc19kZXRlY3RlZCA9IDA7Ci0Jc3RydWN0IGRybV9tb2Rlc2V0X2FjcXVpcmVf Y3R4IGN0eDsKLQotCXNhdmVfZW5hYmxlZCA9IGtjYWxsb2MoY291bnQsIHNpemVvZihib29sKSwg R0ZQX0tFUk5FTCk7Ci0JaWYgKCFzYXZlX2VuYWJsZWQpCi0JCXJldHVybiBmYWxzZTsKLQotCWRy bV9tb2Rlc2V0X2FjcXVpcmVfaW5pdCgmY3R4LCAwKTsKLQotCXdoaWxlIChkcm1fbW9kZXNldF9s b2NrX2FsbF9jdHgoZGV2LCAmY3R4KSAhPSAwKQotCQlkcm1fbW9kZXNldF9iYWNrb2ZmKCZjdHgp OwotCi0JbWVtY3B5KHNhdmVfZW5hYmxlZCwgZW5hYmxlZCwgY291bnQpOwotCWNvbm5fc2VxID0g R0VOTUFTSyhjb3VudCAtIDEsIDApOwotCWNvbm5fY29uZmlndXJlZCA9IDA7Ci1yZXRyeToKLQlm b3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29u bmVjdG9yOwotCQlzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXI7Ci0JCXN0cnVjdCBkcm1fY3J0 YyAqbmV3X2NydGM7Ci0KLQkJY29ubmVjdG9yID0gY29ubmVjdG9yc1tpXTsKLQotCQlpZiAoY29u bl9jb25maWd1cmVkICYgQklUKGkpKQotCQkJY29udGludWU7Ci0KLQkJLyogRmlyc3QgcGFzcywg b25seSBjb25zaWRlciB0aWxlZCBjb25uZWN0b3JzICovCi0JCWlmIChjb25uX3NlcSA9PSBHRU5N QVNLKGNvdW50IC0gMSwgMCkgJiYgIWNvbm5lY3Rvci0+aGFzX3RpbGUpCi0JCQljb250aW51ZTsK LQotCQlpZiAoY29ubmVjdG9yLT5zdGF0dXMgPT0gY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQp Ci0JCQludW1fY29ubmVjdG9yc19kZXRlY3RlZCsrOwotCi0JCWlmICghZW5hYmxlZFtpXSkgewot CQkJRFJNX0RFQlVHX0tNUygiY29ubmVjdG9yICVzIG5vdCBlbmFibGVkLCBza2lwcGluZ1xuIiwK LQkJCQkgICAgICBjb25uZWN0b3ItPm5hbWUpOwotCQkJY29ubl9jb25maWd1cmVkIHw9IEJJVChp KTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJaWYgKGNvbm5lY3Rvci0+Zm9yY2UgPT0gRFJNX0ZP UkNFX09GRikgewotCQkJRFJNX0RFQlVHX0tNUygiY29ubmVjdG9yICVzIGlzIGRpc2FibGVkIGJ5 IHVzZXIsIHNraXBwaW5nXG4iLAotCQkJCSAgICAgIGNvbm5lY3Rvci0+bmFtZSk7Ci0JCQllbmFi bGVkW2ldID0gZmFsc2U7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCWVuY29kZXIgPSBjb25uZWN0 b3ItPnN0YXRlLT5iZXN0X2VuY29kZXI7Ci0JCWlmICghZW5jb2RlciB8fCBXQVJOX09OKCFjb25u ZWN0b3ItPnN0YXRlLT5jcnRjKSkgewotCQkJaWYgKGNvbm5lY3Rvci0+Zm9yY2UgPiBEUk1fRk9S Q0VfT0ZGKQotCQkJCWdvdG8gYmFpbDsKLQotCQkJRFJNX0RFQlVHX0tNUygiY29ubmVjdG9yICVz IGhhcyBubyBlbmNvZGVyIG9yIGNydGMsIHNraXBwaW5nXG4iLAotCQkJCSAgICAgIGNvbm5lY3Rv ci0+bmFtZSk7Ci0JCQllbmFibGVkW2ldID0gZmFsc2U7Ci0JCQljb25uX2NvbmZpZ3VyZWQgfD0g QklUKGkpOwotCQkJY29udGludWU7Ci0JCX0KLQotCQludW1fY29ubmVjdG9yc19lbmFibGVkKys7 Ci0KLQkJbmV3X2NydGMgPSBjb25uZWN0b3ItPnN0YXRlLT5jcnRjOwotCi0JCS8qCi0JCSAqIE1h a2Ugc3VyZSB3ZSdyZSBub3QgdHJ5aW5nIHRvIGRyaXZlIG11bHRpcGxlIGNvbm5lY3RvcnMKLQkJ ICogd2l0aCBhIHNpbmdsZSBDUlRDLCBzaW5jZSBvdXIgY2xvbmluZyBzdXBwb3J0IG1heSBub3QK LQkJICogbWF0Y2ggdGhlIEJJT1MuCi0JCSAqLwotCQlmb3IgKGogPSAwOyBqIDwgY291bnQ7IGor KykgewotCQkJaWYgKGNydGNzW2pdID09IG5ld19jcnRjKSB7Ci0JCQkJRFJNX0RFQlVHX0tNUygi ZmFsbGJhY2s6IGNsb25lZCBjb25maWd1cmF0aW9uXG4iKTsKLQkJCQlnb3RvIGJhaWw7Ci0JCQl9 Ci0JCX0KLQotCQlEUk1fREVCVUdfS01TKCJsb29raW5nIGZvciBjbWRsaW5lIG1vZGUgb24gY29u bmVjdG9yICVzXG4iLAotCQkJICAgICAgY29ubmVjdG9yLT5uYW1lKTsKLQotCQkvKiBnbyBmb3Ig Y29tbWFuZCBsaW5lIG1vZGUgZmlyc3QgKi8KLQkJbW9kZXNbaV0gPSBkcm1fY29ubmVjdG9yX3Bp Y2tfY21kbGluZV9tb2RlKGNvbm5lY3Rvcik7Ci0KLQkJLyogdHJ5IGZvciBwcmVmZXJyZWQgbmV4 dCAqLwotCQlpZiAoIW1vZGVzW2ldKSB7Ci0JCQlEUk1fREVCVUdfS01TKCJsb29raW5nIGZvciBw cmVmZXJyZWQgbW9kZSBvbiBjb25uZWN0b3IgJXMgJWRcbiIsCi0JCQkJICAgICAgY29ubmVjdG9y LT5uYW1lLCBjb25uZWN0b3ItPmhhc190aWxlKTsKLQkJCW1vZGVzW2ldID0gZHJtX2Nvbm5lY3Rv cl9oYXNfcHJlZmVycmVkX21vZGUoY29ubmVjdG9yLCB3aWR0aCwgaGVpZ2h0KTsKLQkJfQotCi0J CS8qIE5vIHByZWZlcnJlZCBtb2RlIG1hcmtlZCBieSB0aGUgRURJRD8gQXJlIHRoZXJlIGFueSBt b2Rlcz8gKi8KLQkJaWYgKCFtb2Rlc1tpXSAmJiAhbGlzdF9lbXB0eSgmY29ubmVjdG9yLT5tb2Rl cykpIHsKLQkJCURSTV9ERUJVR19LTVMoInVzaW5nIGZpcnN0IG1vZGUgbGlzdGVkIG9uIGNvbm5l Y3RvciAlc1xuIiwKLQkJCQkgICAgICBjb25uZWN0b3ItPm5hbWUpOwotCQkJbW9kZXNbaV0gPSBs aXN0X2ZpcnN0X2VudHJ5KCZjb25uZWN0b3ItPm1vZGVzLAotCQkJCQkJICAgIHN0cnVjdCBkcm1f ZGlzcGxheV9tb2RlLAotCQkJCQkJICAgIGhlYWQpOwotCQl9Ci0KLQkJLyogbGFzdCByZXNvcnQ6 IHVzZSBjdXJyZW50IG1vZGUgKi8KLQkJaWYgKCFtb2Rlc1tpXSkgewotCQkJLyoKLQkJCSAqIElN UE9SVEFOVDogV2Ugd2FudCB0byB1c2UgdGhlIGFkanVzdGVkIG1vZGUgKGkuZS4KLQkJCSAqIGFm dGVyIHRoZSBwYW5lbCBmaXR0ZXIgdXBzY2FsaW5nKSBhcyB0aGUgaW5pdGlhbAotCQkJICogY29u ZmlnLCBub3QgdGhlIGlucHV0IG1vZGUsIHdoaWNoIGlzIHdoYXQgY3J0Yy0+bW9kZQotCQkJICog dXN1YWxseSBjb250YWlucy4gQnV0IHNpbmNlIG91ciBjdXJyZW50Ci0JCQkgKiBjb2RlIHB1dHMg YSBtb2RlIGRlcml2ZWQgZnJvbSB0aGUgcG9zdC1wZml0IHRpbWluZ3MKLQkJCSAqIGludG8gY3J0 Yy0+bW9kZSB0aGlzIHdvcmtzIG91dCBjb3JyZWN0bHkuCi0JCQkgKgotCQkJICogVGhpcyBpcyBj cnRjLT5tb2RlIGFuZCBub3QgY3J0Yy0+c3RhdGUtPm1vZGUgZm9yIHRoZQotCQkJICogZmFzdGJv b3QgY2hlY2sgdG8gd29yayBjb3JyZWN0bHkuCi0JCQkgKi8KLQkJCURSTV9ERUJVR19LTVMoImxv b2tpbmcgZm9yIGN1cnJlbnQgbW9kZSBvbiBjb25uZWN0b3IgJXNcbiIsCi0JCQkJICAgICAgY29u bmVjdG9yLT5uYW1lKTsKLQkJCW1vZGVzW2ldID0gJmNvbm5lY3Rvci0+c3RhdGUtPmNydGMtPm1v ZGU7Ci0JCX0KLQkJY3J0Y3NbaV0gPSBuZXdfY3J0YzsKLQotCQlEUk1fREVCVUdfS01TKCJjb25u ZWN0b3IgJXMgb24gW0NSVEM6JWQ6JXNdOiAlZHglZCVzXG4iLAotCQkJICAgICAgY29ubmVjdG9y LT5uYW1lLAotCQkJICAgICAgY29ubmVjdG9yLT5zdGF0ZS0+Y3J0Yy0+YmFzZS5pZCwKLQkJCSAg ICAgIGNvbm5lY3Rvci0+c3RhdGUtPmNydGMtPm5hbWUsCi0JCQkgICAgICBtb2Rlc1tpXS0+aGRp c3BsYXksIG1vZGVzW2ldLT52ZGlzcGxheSwKLQkJCSAgICAgIG1vZGVzW2ldLT5mbGFncyAmIERS TV9NT0RFX0ZMQUdfSU5URVJMQUNFID8gImkiIDogIiIpOwotCi0JCWZhbGxiYWNrID0gZmFsc2U7 Ci0JCWNvbm5fY29uZmlndXJlZCB8PSBCSVQoaSk7Ci0JfQotCi0JaWYgKGNvbm5fY29uZmlndXJl ZCAhPSBjb25uX3NlcSkgeyAvKiByZXBlYXQgdW50aWwgbm8gbW9yZSBhcmUgZm91bmQgKi8KLQkJ Y29ubl9zZXEgPSBjb25uX2NvbmZpZ3VyZWQ7Ci0JCWdvdG8gcmV0cnk7Ci0JfQotCi0JLyoKLQkg KiBJZiB0aGUgQklPUyBkaWRuJ3QgZW5hYmxlIGV2ZXJ5dGhpbmcgaXQgY291bGQsIGZhbGwgYmFj ayB0byBoYXZlIHRoZQotCSAqIHNhbWUgdXNlciBleHBlcmllbmNpbmcgb2YgbGlnaHRpbmcgdXAg YXMgbXVjaCBhcyBwb3NzaWJsZSBsaWtlIHRoZQotCSAqIGZiZGV2IGhlbHBlciBsaWJyYXJ5Lgot CSAqLwotCWlmIChudW1fY29ubmVjdG9yc19lbmFibGVkICE9IG51bV9jb25uZWN0b3JzX2RldGVj dGVkICYmCi0JICAgIG51bV9jb25uZWN0b3JzX2VuYWJsZWQgPCBkZXYtPm1vZGVfY29uZmlnLm51 bV9jcnRjKSB7Ci0JCURSTV9ERUJVR19LTVMoImZhbGxiYWNrOiBOb3QgYWxsIG91dHB1dHMgZW5h YmxlZFxuIik7Ci0JCURSTV9ERUJVR19LTVMoIkVuYWJsZWQ6ICVpLCBkZXRlY3RlZDogJWlcbiIs IG51bV9jb25uZWN0b3JzX2VuYWJsZWQsCi0JCQkgICAgICBudW1fY29ubmVjdG9yc19kZXRlY3Rl ZCk7Ci0JCWZhbGxiYWNrID0gdHJ1ZTsKLQl9Ci0KLQlpZiAoZmFsbGJhY2spIHsKLWJhaWw6Ci0J CURSTV9ERUJVR19LTVMoIk5vdCB1c2luZyBmaXJtd2FyZSBjb25maWd1cmF0aW9uXG4iKTsKLQkJ bWVtY3B5KGVuYWJsZWQsIHNhdmVfZW5hYmxlZCwgY291bnQpOwotCQlyZXQgPSBmYWxzZTsKLQl9 Ci0KLQlkcm1fbW9kZXNldF9kcm9wX2xvY2tzKCZjdHgpOwotCWRybV9tb2Rlc2V0X2FjcXVpcmVf ZmluaSgmY3R4KTsKLQotCWtmcmVlKHNhdmVfZW5hYmxlZCk7Ci0JcmV0dXJuIHJldDsKLX0KLQot LyoqCi0gKiBkcm1fY2xpZW50X21vZGVzZXRfcHJvYmUoKSAtIFByb2JlIGZvciBkaXNwbGF5cwot ICogQGNsaWVudDogRFJNIGNsaWVudAotICogQHdpZHRoOiBNYXhpbXVtIGRpc3BsYXkgbW9kZSB3 aWR0aCAob3B0aW9uYWwpCi0gKiBAaGVpZ2h0OiBNYXhpbXVtIGRpc3BsYXkgbW9kZSBoZWlnaHQg KG9wdGlvbmFsKQotICoKLSAqIFRoaXMgZnVuY3Rpb24gc2V0cyB1cCBkaXNwbGF5IHBpcGVsaW5l cyBmb3IgZW5hYmxlZCBjb25uZWN0b3JzIGFuZCBzdG9yZXMgdGhlCi0gKiBjb25maWcgaW4gdGhl IGNsaWVudCdzIG1vZGVzZXQgYXJyYXkuCi0gKgotICogUmV0dXJuczoKLSAqIFplcm8gb24gc3Vj Y2VzcyBvciBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCi0gKi8KLQotaW50IGRybV9j bGllbnRfbW9kZXNldF9wcm9iZShzdHJ1Y3QgZHJtX2NsaWVudF9kZXYgKmNsaWVudCwgdW5zaWdu ZWQgaW50IHdpZHRoLCB1bnNpZ25lZCBpbnQgaGVpZ2h0KQotewotCXN0cnVjdCBkcm1fY29ubmVj dG9yICpjb25uZWN0b3IsICoqY29ubmVjdG9ycyA9IE5VTEw7Ci0Jc3RydWN0IGRybV9jb25uZWN0 b3JfbGlzdF9pdGVyIGNvbm5faXRlcjsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY2xpZW50 LT5kZXY7Ci0JdW5zaWduZWQgaW50IHRvdGFsX21vZGVzX2NvdW50ID0gMDsKLQlzdHJ1Y3QgZHJt X2NsaWVudF9vZmZzZXQgKm9mZnNldHM7Ci0JdW5zaWduZWQgaW50IGNvbm5lY3Rvcl9jb3VudCA9 IDA7Ci0Jc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKiptb2RlczsKLQlzdHJ1Y3QgZHJtX2NydGMg KipjcnRjczsKLQlpbnQgaSwgcmV0ID0gMDsKLQlib29sICplbmFibGVkOwotCi0JRFJNX0RFQlVH X0tNUygiXG4iKTsKLQotCWlmICghd2lkdGgpCi0JCXdpZHRoID0gZGV2LT5tb2RlX2NvbmZpZy5t YXhfd2lkdGg7Ci0JaWYgKCFoZWlnaHQpCi0JCWhlaWdodCA9IGRldi0+bW9kZV9jb25maWcubWF4 X2hlaWdodDsKLQotCWRybV9jb25uZWN0b3JfbGlzdF9pdGVyX2JlZ2luKGRldiwgJmNvbm5faXRl cik7Ci0JZHJtX2NsaWVudF9mb3JfZWFjaF9jb25uZWN0b3JfaXRlcihjb25uZWN0b3IsICZjb25u X2l0ZXIpIHsKLQkJc3RydWN0IGRybV9jb25uZWN0b3IgKip0bXA7Ci0KLQkJdG1wID0ga3JlYWxs b2MoY29ubmVjdG9ycywgKGNvbm5lY3Rvcl9jb3VudCArIDEpICogc2l6ZW9mKCpjb25uZWN0b3Jz KSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghdG1wKSB7Ci0JCQlyZXQgPSAtRU5PTUVNOwotCQkJZ290 byBmcmVlX2Nvbm5lY3RvcnM7Ci0JCX0KLQotCQljb25uZWN0b3JzID0gdG1wOwotCQlkcm1fY29u bmVjdG9yX2dldChjb25uZWN0b3IpOwotCQljb25uZWN0b3JzW2Nvbm5lY3Rvcl9jb3VudCsrXSA9 IGNvbm5lY3RvcjsKLQl9Ci0JZHJtX2Nvbm5lY3Rvcl9saXN0X2l0ZXJfZW5kKCZjb25uX2l0ZXIp OwotCi0JaWYgKCFjb25uZWN0b3JfY291bnQpCi0JCXJldHVybiAwOwotCi0JY3J0Y3MgPSBrY2Fs bG9jKGNvbm5lY3Rvcl9jb3VudCwgc2l6ZW9mKCpjcnRjcyksIEdGUF9LRVJORUwpOwotCW1vZGVz ID0ga2NhbGxvYyhjb25uZWN0b3JfY291bnQsIHNpemVvZigqbW9kZXMpLCBHRlBfS0VSTkVMKTsK LQlvZmZzZXRzID0ga2NhbGxvYyhjb25uZWN0b3JfY291bnQsIHNpemVvZigqb2Zmc2V0cyksIEdG UF9LRVJORUwpOwotCWVuYWJsZWQgPSBrY2FsbG9jKGNvbm5lY3Rvcl9jb3VudCwgc2l6ZW9mKGJv b2wpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWNydGNzIHx8ICFtb2RlcyB8fCAhZW5hYmxlZCB8fCAh b2Zmc2V0cykgewotCQlEUk1fRVJST1IoIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7Ci0J CXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0OwotCX0KLQotCW11dGV4X2xvY2soJmNsaWVudC0+ bW9kZXNldF9tdXRleCk7Ci0KLQltdXRleF9sb2NrKCZkZXYtPm1vZGVfY29uZmlnLm11dGV4KTsK LQlmb3IgKGkgPSAwOyBpIDwgY29ubmVjdG9yX2NvdW50OyBpKyspCi0JCXRvdGFsX21vZGVzX2Nv dW50ICs9IGNvbm5lY3RvcnNbaV0tPmZ1bmNzLT5maWxsX21vZGVzKGNvbm5lY3RvcnNbaV0sIHdp ZHRoLCBoZWlnaHQpOwotCWlmICghdG90YWxfbW9kZXNfY291bnQpCi0JCURSTV9ERUJVR19LTVMo Ik5vIGNvbm5lY3RvcnMgcmVwb3J0ZWQgY29ubmVjdGVkIHdpdGggbW9kZXNcbiIpOwotCWRybV9j bGllbnRfY29ubmVjdG9yc19lbmFibGVkKGNvbm5lY3RvcnMsIGNvbm5lY3Rvcl9jb3VudCwgZW5h YmxlZCk7Ci0KLQlpZiAoIWRybV9jbGllbnRfZmlybXdhcmVfY29uZmlnKGNsaWVudCwgY29ubmVj dG9ycywgY29ubmVjdG9yX2NvdW50LCBjcnRjcywKLQkJCQkJbW9kZXMsIG9mZnNldHMsIGVuYWJs ZWQsIHdpZHRoLCBoZWlnaHQpKSB7Ci0JCW1lbXNldChtb2RlcywgMCwgY29ubmVjdG9yX2NvdW50 ICogc2l6ZW9mKCptb2RlcykpOwotCQltZW1zZXQoY3J0Y3MsIDAsIGNvbm5lY3Rvcl9jb3VudCAq IHNpemVvZigqY3J0Y3MpKTsKLQkJbWVtc2V0KG9mZnNldHMsIDAsIGNvbm5lY3Rvcl9jb3VudCAq IHNpemVvZigqb2Zmc2V0cykpOwotCi0JCWlmICghZHJtX2NsaWVudF90YXJnZXRfY2xvbmVkKGRl diwgY29ubmVjdG9ycywgY29ubmVjdG9yX2NvdW50LCBtb2RlcywKLQkJCQkJICAgICAgb2Zmc2V0 cywgZW5hYmxlZCwgd2lkdGgsIGhlaWdodCkgJiYKLQkJICAgICFkcm1fY2xpZW50X3RhcmdldF9w cmVmZXJyZWQoY29ubmVjdG9ycywgY29ubmVjdG9yX2NvdW50LCBtb2RlcywKLQkJCQkJCSBvZmZz ZXRzLCBlbmFibGVkLCB3aWR0aCwgaGVpZ2h0KSkKLQkJCURSTV9FUlJPUigiVW5hYmxlIHRvIGZp bmQgaW5pdGlhbCBtb2Rlc1xuIik7Ci0KLQkJRFJNX0RFQlVHX0tNUygicGlja2luZyBDUlRDcyBm b3IgJWR4JWQgY29uZmlnXG4iLAotCQkJICAgICAgd2lkdGgsIGhlaWdodCk7Ci0KLQkJZHJtX2Ns aWVudF9waWNrX2NydGNzKGNsaWVudCwgY29ubmVjdG9ycywgY29ubmVjdG9yX2NvdW50LAotCQkJ CSAgICAgIGNydGNzLCBtb2RlcywgMCwgd2lkdGgsIGhlaWdodCk7Ci0JfQotCW11dGV4X3VubG9j aygmZGV2LT5tb2RlX2NvbmZpZy5tdXRleCk7Ci0KLQlkcm1fY2xpZW50X21vZGVzZXRfcmVsZWFz ZShjbGllbnQpOwotCi0JZm9yIChpID0gMDsgaSA8IGNvbm5lY3Rvcl9jb3VudDsgaSsrKSB7Ci0J CXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlID0gbW9kZXNbaV07Ci0JCXN0cnVjdCBkcm1f Y3J0YyAqY3J0YyA9IGNydGNzW2ldOwotCQlzdHJ1Y3QgZHJtX2NsaWVudF9vZmZzZXQgKm9mZnNl dCA9ICZvZmZzZXRzW2ldOwotCi0JCWlmIChtb2RlICYmIGNydGMpIHsKLQkJCXN0cnVjdCBkcm1f bW9kZV9zZXQgKm1vZGVzZXQgPSBkcm1fY2xpZW50X2ZpbmRfbW9kZXNldChjbGllbnQsIGNydGMp OwotCQkJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciA9IGNvbm5lY3RvcnNbaV07Ci0K LQkJCURSTV9ERUJVR19LTVMoImRlc2lyZWQgbW9kZSAlcyBzZXQgb24gY3J0YyAlZCAoJWQsJWQp XG4iLAotCQkJCSAgICAgIG1vZGUtPm5hbWUsIGNydGMtPmJhc2UuaWQsIG9mZnNldC0+eCwgb2Zm c2V0LT55KTsKLQotCQkJaWYgKFdBUk5fT05fT05DRShtb2Rlc2V0LT5udW1fY29ubmVjdG9ycyA9 PSBEUk1fQ0xJRU5UX01BWF9DTE9ORURfQ09OTkVDVE9SUyB8fAotCQkJCQkgKGRldi0+bW9kZV9j b25maWcubnVtX2NydGMgPiAxICYmIG1vZGVzZXQtPm51bV9jb25uZWN0b3JzID09IDEpKSkgewot CQkJCXJldCA9IC1FSU5WQUw7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCW1vZGVzZXQtPm1vZGUg PSBkcm1fbW9kZV9kdXBsaWNhdGUoZGV2LCBtb2RlKTsKLQkJCWRybV9jb25uZWN0b3JfZ2V0KGNv bm5lY3Rvcik7Ci0JCQltb2Rlc2V0LT5jb25uZWN0b3JzW21vZGVzZXQtPm51bV9jb25uZWN0b3Jz KytdID0gY29ubmVjdG9yOwotCQkJbW9kZXNldC0+eCA9IG9mZnNldC0+eDsKLQkJCW1vZGVzZXQt PnkgPSBvZmZzZXQtPnk7Ci0JCX0KLQl9Ci0KLQltdXRleF91bmxvY2soJmNsaWVudC0+bW9kZXNl dF9tdXRleCk7Ci1vdXQ6Ci0Ja2ZyZWUoY3J0Y3MpOwotCWtmcmVlKG1vZGVzKTsKLQlrZnJlZShv ZmZzZXRzKTsKLQlrZnJlZShlbmFibGVkKTsKLWZyZWVfY29ubmVjdG9yczoKLQlmb3IgKGkgPSAw OyBpIDwgY29ubmVjdG9yX2NvdW50OyBpKyspCi0JCWRybV9jb25uZWN0b3JfcHV0KGNvbm5lY3Rv cnNbaV0pOwotCWtmcmVlKGNvbm5lY3RvcnMpOwotCi0JcmV0dXJuIHJldDsKLX0KLQogLyoKICAq IFRoaXMgaXMgYSBjb250aW51YXRpb24gb2YgZHJtX3NldHVwX2NydGNzKCkgdGhhdCBzZXRzIHVw IGFueXRoaW5nIHJlbGF0ZWQKICAqIHRvIHRoZSBmcmFtZWJ1ZmZlci4gRHVyaW5nIGluaXRpYWxp emF0aW9uLCBkcm1fc2V0dXBfY3J0Y3MoKSBpcyBjYWxsZWQgYmVmb3JlCmRpZmYgLS1naXQgYS9p bmNsdWRlL2RybS9kcm1fY2xpZW50LmggYi9pbmNsdWRlL2RybS9kcm1fY2xpZW50LmgKaW5kZXgg NmJiNWUwNDEyODc3Li41MTVmMGY3ODNmZjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZHJtL2RybV9j bGllbnQuaAorKysgYi9pbmNsdWRlL2RybS9kcm1fY2xpZW50LmgKQEAgLTE3LDggKzE3LDYgQEAg c3RydWN0IGRybV9nZW1fb2JqZWN0Owogc3RydWN0IGRybV9taW5vcjsKIHN0cnVjdCBtb2R1bGU7 CiAKLSNkZWZpbmUgRFJNX0NMSUVOVF9NQVhfQ0xPTkVEX0NPTk5FQ1RPUlMJOAotCiAvKioKICAq IHN0cnVjdCBkcm1fY2xpZW50X2Z1bmNzIC0gRFJNIGNsaWVudCBjYWxsYmFja3MKICAqLwpAQCAt MTU0LDcgKzE1Miw3IEBAIHZvaWQgZHJtX2NsaWVudF9mcmFtZWJ1ZmZlcl9kZWxldGUoc3RydWN0 IGRybV9jbGllbnRfYnVmZmVyICpidWZmZXIpOwogaW50IGRybV9jbGllbnRfbW9kZXNldF9jcmVh dGUoc3RydWN0IGRybV9jbGllbnRfZGV2ICpjbGllbnQpOwogdm9pZCBkcm1fY2xpZW50X21vZGVz ZXRfZnJlZShzdHJ1Y3QgZHJtX2NsaWVudF9kZXYgKmNsaWVudCk7CiB2b2lkIGRybV9jbGllbnRf bW9kZXNldF9yZWxlYXNlKHN0cnVjdCBkcm1fY2xpZW50X2RldiAqY2xpZW50KTsKLXN0cnVjdCBk cm1fbW9kZV9zZXQgKmRybV9jbGllbnRfZmluZF9tb2Rlc2V0KHN0cnVjdCBkcm1fY2xpZW50X2Rl diAqY2xpZW50LCBzdHJ1Y3QgZHJtX2NydGMgKmNydGMpOworaW50IGRybV9jbGllbnRfbW9kZXNl dF9wcm9iZShzdHJ1Y3QgZHJtX2NsaWVudF9kZXYgKmNsaWVudCwgdW5zaWduZWQgaW50IHdpZHRo LCB1bnNpZ25lZCBpbnQgaGVpZ2h0KTsKIGJvb2wgZHJtX2NsaWVudF9wYW5lbF9yb3RhdGlvbihz dHJ1Y3QgZHJtX21vZGVfc2V0ICptb2Rlc2V0LCB1bnNpZ25lZCBpbnQgKnJvdGF0aW9uKTsKIGlu dCBkcm1fY2xpZW50X21vZGVzZXRfY29tbWl0X2ZvcmNlKHN0cnVjdCBkcm1fY2xpZW50X2RldiAq Y2xpZW50KTsKIGludCBkcm1fY2xpZW50X21vZGVzZXRfY29tbWl0KHN0cnVjdCBkcm1fY2xpZW50 X2RldiAqY2xpZW50KTsKLS0gCjIuMjAuMQoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX18KZHJpLWRldmVsIG1haWxpbmcgbGlzdApkcmktZGV2ZWxAbGlzdHMu ZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlz dGluZm8vZHJpLWRldmVs