From mboxrd@z Thu Jan 1 00:00:00 1970 From: Hai Li Subject: [PATCH 3/4] drm/msm: Initial add DSI connector support Date: Fri, 13 Mar 2015 19:24:17 -0400 Message-ID: <1426289058-6663-4-git-send-email-hali@codeaurora.org> References: <1426289058-6663-1-git-send-email-hali@codeaurora.org> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <1426289058-6663-1-git-send-email-hali@codeaurora.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: linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org List-Id: linux-arm-msm@vger.kernel.org VGhpcyBjaGFuZ2UgYWRkcyB0aGUgRFNJIGNvbm5lY3RvciBzdXBwb3J0IGluIG1zbSBkcm0gZHJp dmVyLgoKU2lnbmVkLW9mZi1ieTogSGFpIExpIDxoYWxpQGNvZGVhdXJvcmEub3JnPgotLS0KIGRy aXZlcnMvZ3B1L2RybS9tc20vS2NvbmZpZyAgICAgICAgICAgfCAgIDExICsKIGRyaXZlcnMvZ3B1 L2RybS9tc20vTWFrZWZpbGUgICAgICAgICAgfCAgICA0ICsKIGRyaXZlcnMvZ3B1L2RybS9tc20v ZHNpL2RzaS5jICAgICAgICAgfCAgMjAzICsrKysKIGRyaXZlcnMvZ3B1L2RybS9tc20vZHNpL2Rz aS5oICAgICAgICAgfCAgMTE1ICsrCiBkcml2ZXJzL2dwdS9kcm0vbXNtL2RzaS9kc2lfaG9zdC5j ICAgIHwgMTk5NyArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKIGRyaXZlcnMvZ3B1 L2RybS9tc20vZHNpL2RzaV9tYW5hZ2VyLmMgfCAgNzA2ICsrKysrKysrKysrKwogZHJpdmVycy9n cHUvZHJtL21zbS9kc2kvZHNpX3BoeS5jICAgICB8ICAzNTIgKysrKysrCiBkcml2ZXJzL2dwdS9k cm0vbXNtL21zbV9kcnYuaCAgICAgICAgIHwgICAyMCArCiA4IGZpbGVzIGNoYW5nZWQsIDM0MDgg aW5zZXJ0aW9ucygrKQogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1L2RybS9tc20vZHNp L2RzaS5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL21zbS9kc2kvZHNpLmgK IGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dwdS9kcm0vbXNtL2RzaS9kc2lfaG9zdC5jCiBj cmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL21zbS9kc2kvZHNpX21hbmFnZXIuYwog Y3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1L2RybS9tc20vZHNpL2RzaV9waHkuYwoKZGlm ZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vS2NvbmZpZyBiL2RyaXZlcnMvZ3B1L2RybS9t c20vS2NvbmZpZwppbmRleCAxZTZhOTA3Li41YmE1NjMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dw dS9kcm0vbXNtL0tjb25maWcKKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9LY29uZmlnCkBAIC0z NSwzICszNSwxNCBAQCBjb25maWcgRFJNX01TTV9SRUdJU1RFUl9MT0dHSU5HCiAJICBDb21waWxl IGluIHN1cHBvcnQgZm9yIGxvZ2dpbmcgcmVnaXN0ZXIgcmVhZHMvd3JpdGVzIGluIGEgZm9ybWF0 CiAJICB0aGF0IGNhbiBiZSBwYXJzZWQgYnkgZW52eXRvb2xzIGRlbXNtIHRvb2wuICBJZiBlbmFi bGVkLCByZWdpc3RlcgogCSAgbG9nZ2luZyBjYW4gYmUgc3dpdGNoZWQgb24gdmlhIG1zbS5yZWds b2c9eSBtb2R1bGUgcGFyYW0uCisKK2NvbmZpZyBEUk1fTVNNX0RTSQorCWJvb2wgIkVuYWJsZSBE U0kgc3VwcG9ydCBpbiBNU00gRFJNIGRyaXZlciIKKwlkZXBlbmRzIG9uIERSTV9NU00KKwlzZWxl Y3QgRFJNX1BBTkVMCisJc2VsZWN0IERSTV9NSVBJX0RTSQorCWRlZmF1bHQgeQorCWhlbHAKKwkg IENob29zZSB0aGlzIG9wdGlvbiBpZiB5b3UgaGF2ZSBhIG5lZWQgZm9yIE1JUEkgRFNJIGNvbm5l Y3RvcgorCSAgc3VwcG9ydC4KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9NYWtl ZmlsZSBiL2RyaXZlcnMvZ3B1L2RybS9tc20vTWFrZWZpbGUKaW5kZXggNjc0YTEzMi4uNWMxNDRj YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL21zbS9NYWtlZmlsZQorKysgYi9kcml2ZXJz L2dwdS9kcm0vbXNtL01ha2VmaWxlCkBAIC01MCw1ICs1MCw5IEBAIG1zbS15IDo9IFwKIAogbXNt LSQoQ09ORklHX0RSTV9NU01fRkJERVYpICs9IG1zbV9mYmRldi5vCiBtc20tJChDT05GSUdfQ09N TU9OX0NMSykgKz0gbWRwL21kcDQvbWRwNF9sdmRzX3BsbC5vCittc20tJChDT05GSUdfRFJNX01T TV9EU0kpICs9IGRzaS9kc2kubyBcCisJCQlkc2kvZHNpX2hvc3QubyBcCisJCQlkc2kvZHNpX21h bmFnZXIubyBcCisJCQlkc2kvZHNpX3BoeS5vCiAKIG9iai0kKENPTkZJR19EUk1fTVNNKQkrPSBt c20ubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9kc2kvZHNpLmMgYi9kcml2ZXJz L2dwdS9kcm0vbXNtL2RzaS9kc2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw Li5kZTc3MjYwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9kc2kvZHNp LmMKQEAgLTAsMCArMSwyMDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIFRoZSBMaW51 eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBp cyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Cisg KiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZl cnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBT b2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBp biB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdB UlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5U QUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAq IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lu Y2x1ZGUgImRzaS5oIgorCitpbnQgbXNtX2RzaV9tb2Rlc2V0X2luaXQoc3RydWN0IG1zbV9kcm1f c3ViX2RldiAqYmFzZSwgc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbXNtX2Rz aSAqbXNtX2RzaSA9IGNvbnRhaW5lcl9vZihiYXNlLCBzdHJ1Y3QgbXNtX2RzaSwgYmFzZSk7CisJ c3RydWN0IG1zbV9kcm1fcHJpdmF0ZSAqcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJaW50IHJl dCwgaTsKKworCWlmIChXQVJOX09OKChiYXNlLT5udW1fZW5jb2RlcnMgIT0gTVNNX0RTSV9FTkNP REVSX05VTSkgfHwKKwkJIWJhc2UtPmVuY29kZXJzW01TTV9EU0lfVklERU9fRU5DT0RFUl9JRF0g fHwKKwkJIWJhc2UtPmVuY29kZXJzW01TTV9EU0lfQ01EX0VOQ09ERVJfSURdKSkKKwkJcmV0dXJu IC1FSU5WQUw7CisKKwltc21fZHNpLT5kZXYgPSBkZXY7CisKKwlyZXQgPSBtc21fZHNpX2hvc3Rf bW9kZXNldF9pbml0KG1zbV9kc2ktPmhvc3QsIGRldik7CisJaWYgKHJldCkgeworCQlkZXZfZXJy KGRldi0+ZGV2LCAiZmFpbGVkIHRvIG1vZGVzZXQgaW5pdCBob3N0OiAlZFxuIiwgcmV0KTsKKwkJ Z290byBmYWlsOworCX0KKworCW1zbV9kc2ktPmJyaWRnZSA9IG1zbV9kc2lfbWFuYWdlcl9icmlk Z2VfaW5pdChtc21fZHNpLT5pZCk7CisJaWYgKElTX0VSUihtc21fZHNpLT5icmlkZ2UpKSB7CisJ CXJldCA9IFBUUl9FUlIobXNtX2RzaS0+YnJpZGdlKTsKKwkJZGV2X2VycihkZXYtPmRldiwgImZh aWxlZCB0byBjcmVhdGUgZHNpIGJyaWRnZTogJWRcbiIsIHJldCk7CisJCW1zbV9kc2ktPmJyaWRn ZSA9IE5VTEw7CisJCWdvdG8gZmFpbDsKKwl9CisKKwltc21fZHNpLT5jb25uZWN0b3IgPSBtc21f ZHNpX21hbmFnZXJfY29ubmVjdG9yX2luaXQobXNtX2RzaS0+aWQpOworCWlmIChJU19FUlIobXNt X2RzaS0+Y29ubmVjdG9yKSkgeworCQlyZXQgPSBQVFJfRVJSKG1zbV9kc2ktPmNvbm5lY3Rvcik7 CisJCWRldl9lcnIoZGV2LT5kZXYsICJmYWlsZWQgdG8gY3JlYXRlIGRzaSBjb25uZWN0b3I6ICVk XG4iLCByZXQpOworCQltc21fZHNpLT5jb25uZWN0b3IgPSBOVUxMOworCQlnb3RvIGZhaWw7CisJ fQorCisJZm9yIChpID0gMDsgaSA8IGJhc2UtPm51bV9lbmNvZGVyczsgaSsrKQorCQliYXNlLT5l bmNvZGVyc1tpXS0+YnJpZGdlID0gbXNtX2RzaS0+YnJpZGdlOworCisJcHJpdi0+YnJpZGdlc1tw cml2LT5udW1fYnJpZGdlcysrXSAgICAgICA9IG1zbV9kc2ktPmJyaWRnZTsKKwlwcml2LT5jb25u ZWN0b3JzW3ByaXYtPm51bV9jb25uZWN0b3JzKytdID0gbXNtX2RzaS0+Y29ubmVjdG9yOworCisJ cmV0dXJuIDA7CitmYWlsOgorCWlmIChtc21fZHNpKSB7CisJCS8qIGJyaWRnZS9jb25uZWN0b3Ig YXJlIG5vcm1hbGx5IGRlc3Ryb3llZCBieSBkcm06ICovCisJCWlmIChtc21fZHNpLT5icmlkZ2Up IHsKKwkJCW1zbV9kc2lfbWFuYWdlcl9icmlkZ2VfZGVzdHJveShtc21fZHNpLT5icmlkZ2UpOwor CQkJbXNtX2RzaS0+YnJpZGdlID0gTlVMTDsKKwkJfQorCQlpZiAobXNtX2RzaS0+Y29ubmVjdG9y KSB7CisJCQltc21fZHNpLT5jb25uZWN0b3ItPmZ1bmNzLT5kZXN0cm95KG1zbV9kc2ktPmNvbm5l Y3Rvcik7CisJCQltc21fZHNpLT5jb25uZWN0b3IgPSBOVUxMOworCQl9CisJfQorCisJcmV0dXJu IHJldDsKK30KKworc3RhdGljIHZvaWQgZHNpX2Rlc3Ryb3koc3RydWN0IG1zbV9kc2kgKm1zbV9k c2kpCit7CisJaWYgKCFtc21fZHNpKQorCQlyZXR1cm47CisKKwltc21fZHNpX21hbmFnZXJfdW5y ZWdpc3Rlcihtc21fZHNpKTsKKwlpZiAobXNtX2RzaS0+aG9zdCkgeworCQltc21fZHNpX2hvc3Rf ZGVzdHJveShtc21fZHNpLT5ob3N0KTsKKwkJbXNtX2RzaS0+aG9zdCA9IE5VTEw7CisJfQorCisJ cGxhdGZvcm1fc2V0X2RydmRhdGEobXNtX2RzaS0+cGRldiwgTlVMTCk7Cit9CisKK3N0YXRpYyBz dHJ1Y3QgbXNtX2RzaSAqZHNpX2luaXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sK KwlzdHJ1Y3QgbXNtX2RzaSAqbXNtX2RzaSA9IE5VTEw7CisJaW50IHJldDsKKworCWlmICghcGRl dikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJubyBkc2kgZGV2aWNlXG4iKTsKKwkJcmV0ID0g LUVOWElPOworCQlnb3RvIGZhaWw7CisJfQorCisJbXNtX2RzaSA9IGRldm1fa3phbGxvYygmcGRl di0+ZGV2LCBzaXplb2YoKm1zbV9kc2kpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW1zbV9kc2kpIHsK KwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBmYWlsOworCX0KKwlEQkcoImRzaSBwcm9iZWQ9JXAi LCBtc21fZHNpKTsKKworCW1zbV9kc2ktPnBkZXYgPSBwZGV2OworCXBsYXRmb3JtX3NldF9kcnZk YXRhKHBkZXYsIG1zbV9kc2kpOworCisJLyogSW5pdCBkc2kgaG9zdCAqLworCXJldCA9IG1zbV9k c2lfaG9zdF9pbml0KG1zbV9kc2kpOworCWlmIChyZXQpCisJCWdvdG8gZmFpbDsKKworCS8qIFJl Z2lzdGVyIHRvIGRzaSBtYW5hZ2VyICovCisJcmV0ID0gbXNtX2RzaV9tYW5hZ2VyX3JlZ2lzdGVy KG1zbV9kc2kpOworCWlmIChyZXQpCisJCWdvdG8gZmFpbDsKKworCW1zbV9kc2ktPmJhc2UubW9k ZXNldF9pbml0ID0gbXNtX2RzaV9tb2Rlc2V0X2luaXQ7CisKKwlyZXR1cm4gbXNtX2RzaTsKKwor ZmFpbDoKKwlpZiAobXNtX2RzaSkKKwkJZHNpX2Rlc3Ryb3kobXNtX2RzaSk7CisKKwlyZXR1cm4g RVJSX1BUUihyZXQpOworfQorCitzdGF0aWMgaW50IGRzaV9iaW5kKHN0cnVjdCBkZXZpY2UgKmRl diwgc3RydWN0IGRldmljZSAqbWFzdGVyLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBkcm1fZGV2 aWNlICpkcm0gPSBkZXZfZ2V0X2RydmRhdGEobWFzdGVyKTsKKwlzdHJ1Y3QgbXNtX2RybV9wcml2 YXRlICpwcml2ID0gZHJtLT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpw ZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IG1zbV9kc2kgKm1zbV9kc2k7 CisKKwlEQkcoIiIpOworCW1zbV9kc2kgPSBkc2lfaW5pdChwZGV2KTsKKwlpZiAoSVNfRVJSKG1z bV9kc2kpKQorCQlyZXR1cm4gUFRSX0VSUihtc21fZHNpKTsKKworCXByaXYtPmRzaVttc21fZHNp LT5pZF0gPSAmbXNtX2RzaS0+YmFzZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBk c2lfdW5iaW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZSAqbWFzdGVyLAorCQl2 b2lkICpkYXRhKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkcm0gPSBkZXZfZ2V0X2RydmRhdGEo bWFzdGVyKTsKKwlzdHJ1Y3QgbXNtX2RybV9wcml2YXRlICpwcml2ID0gZHJtLT5kZXZfcHJpdmF0 ZTsKKwlzdHJ1Y3QgbXNtX2RzaSAqbXNtX2RzaSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWlu dCBpZCA9IG1zbV9kc2ktPmlkOworCisJaWYgKHByaXYtPmRzaVtpZF0pIHsKKwkJZHNpX2Rlc3Ry b3kobXNtX2RzaSk7CisJCXByaXYtPmRzaVtpZF0gPSBOVUxMOworCX0KK30KKworc3RhdGljIGNv bnN0IHN0cnVjdCBjb21wb25lbnRfb3BzIGRzaV9vcHMgPSB7CisJLmJpbmQgICA9IGRzaV9iaW5k LAorCS51bmJpbmQgPSBkc2lfdW5iaW5kLAorfTsKKworc3RhdGljIGludCBkc2lfZGV2X3Byb2Jl KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJcmV0dXJuIGNvbXBvbmVudF9hZGQo JnBkZXYtPmRldiwgJmRzaV9vcHMpOworfQorCitzdGF0aWMgaW50IGRzaV9kZXZfcmVtb3ZlKHN0 cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJREJHKCIiKTsKKwljb21wb25lbnRfZGVs KCZwZGV2LT5kZXYsICZkc2lfb3BzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0 cnVjdCBvZl9kZXZpY2VfaWQgZHRfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gInFjb20s bWRzcy1kc2ktY3RybCIgfSwKKwl7fQorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2 ZXIgZHNpX2RyaXZlciA9IHsKKwkucHJvYmUgPSBkc2lfZGV2X3Byb2JlLAorCS5yZW1vdmUgPSBk c2lfZGV2X3JlbW92ZSwKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJtc21fZHNpIiwKKwkJLm9m X21hdGNoX3RhYmxlID0gZHRfbWF0Y2gsCisJfSwKK307CisKK3ZvaWQgX19pbml0IG1zbV9kc2lf cmVnaXN0ZXIodm9pZCkKK3sKKwlEQkcoIiIpOworCXBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigm ZHNpX2RyaXZlcik7Cit9CisKK3ZvaWQgX19leGl0IG1zbV9kc2lfdW5yZWdpc3Rlcih2b2lkKQor eworCURCRygiIik7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmRzaV9kcml2ZXIpOwor fQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL2RzaS9kc2kuaCBiL2RyaXZlcnMv Z3B1L2RybS9tc20vZHNpL2RzaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAu LjFkMjQ0MDkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2RzaS9kc2ku aApAQCAtMCwwICsxLDExNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgVGhlIExpbnV4 IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlz IGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAq IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVy c2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNv ZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGlu IHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FS UkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRB QklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICog R05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZu ZGVmIF9fRFNJX0NPTk5FQ1RPUl9IX18KKyNkZWZpbmUgX19EU0lfQ09OTkVDVE9SX0hfXworCisj aW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisKKyNpbmNsdWRlICJkcm1fY3J0Yy5o IgorI2luY2x1ZGUgImRybV9taXBpX2RzaS5oIgorI2luY2x1ZGUgImRybV9wYW5lbC5oIgorCisj aW5jbHVkZSAibXNtX2Rydi5oIgorCisjZGVmaW5lIERTSV8wCTAKKyNkZWZpbmUgRFNJXzEJMQor I2RlZmluZSBEU0lfTUFYCTIKKworI2RlZmluZSBEU0lfQ0xPQ0tfTUFTVEVSCURTSV8wCisjZGVm aW5lIERTSV9DTE9DS19TTEFWRQkJRFNJXzEKKworI2RlZmluZSBEU0lfTEVGVAkJRFNJXzAKKyNk ZWZpbmUgRFNJX1JJR0hUCQlEU0lfMQorCisvKiBBY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgZHJt IGZyYW1ld29yayBzZXF1ZW5jZSwgdGFrZSB0aGUgZW5jb2RlciBvZgorICogRFNJXzEgYXMgbWFz dGVyIGVuY29kZXIKKyAqLworI2RlZmluZSBEU0lfRU5DT0RFUl9NQVNURVIJRFNJXzEKKyNkZWZp bmUgRFNJX0VOQ09ERVJfU0xBVkUJRFNJXzAKKworc3RydWN0IG1zbV9kc2kgeworCXN0cnVjdCBt c21fZHJtX3N1Yl9kZXYgYmFzZTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2OworCXN0cnVjdCBw bGF0Zm9ybV9kZXZpY2UgKnBkZXY7CisKKwlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9y OworCXN0cnVjdCBkcm1fYnJpZGdlICpicmlkZ2U7CisKKwlzdHJ1Y3QgbWlwaV9kc2lfaG9zdCAq aG9zdDsKKwlzdHJ1Y3QgbXNtX2RzaV9waHkgKnBoeTsKKwlzdHJ1Y3QgZHJtX3BhbmVsICpwYW5l bDsKKwl1bnNpZ25lZCBsb25nIHBhbmVsX2ZsYWdzOworCWJvb2wgcGh5X2VuYWJsZWQ7CisKKwkv KiB0aGUgZW5jb2RlciB3ZSBhcmUgaG9va2VkIHRvIChvdXRzaWRlIG9mIGRzaSBibG9jaykgKi8K KwlzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXI7CisKKwlpbnQgaWQ7Cit9OworCisvKiBkc2kg bWFuYWdlciAqLworc3RydWN0IGRybV9icmlkZ2UgKm1zbV9kc2lfbWFuYWdlcl9icmlkZ2VfaW5p dCh1OCBpZCk7Cit2b2lkIG1zbV9kc2lfbWFuYWdlcl9icmlkZ2VfZGVzdHJveShzdHJ1Y3QgZHJt X2JyaWRnZSAqYnJpZGdlKTsKK3N0cnVjdCBkcm1fY29ubmVjdG9yICptc21fZHNpX21hbmFnZXJf Y29ubmVjdG9yX2luaXQodTggaWQpOworaW50IG1zbV9kc2lfbWFuYWdlcl9waHlfZW5hYmxlKGlu dCBpZCwKKwkJY29uc3QgdW5zaWduZWQgbG9uZyBiaXRfcmF0ZSwgY29uc3QgdW5zaWduZWQgbG9u ZyBlc2NfcmF0ZSwKKwkJdTMyICpjbGtfcHJlLCB1MzIgKmNsa19wb3N0KTsKK3ZvaWQgbXNtX2Rz aV9tYW5hZ2VyX3BoeV9kaXNhYmxlKGludCBpZCk7CitpbnQgbXNtX2RzaV9tYW5hZ2VyX2NtZF94 ZmVyKGludCBpZCwgY29uc3Qgc3RydWN0IG1pcGlfZHNpX21zZyAqbXNnKTsKK2Jvb2wgbXNtX2Rz aV9tYW5hZ2VyX2NtZF94ZmVyX3RyaWdnZXIoaW50IGlkLCB1MzIgaW92YSwgdTMyIGxlbik7Citp bnQgbXNtX2RzaV9tYW5hZ2VyX3JlZ2lzdGVyKHN0cnVjdCBtc21fZHNpICptc21fZHNpKTsKK3Zv aWQgbXNtX2RzaV9tYW5hZ2VyX3VucmVnaXN0ZXIoc3RydWN0IG1zbV9kc2kgKm1zbV9kc2kpOwor CisvKiBkc2kgaG9zdCAqLworaW50IG1zbV9kc2lfaG9zdF94ZmVyX3ByZXBhcmUoc3RydWN0IG1p cGlfZHNpX2hvc3QgKmhvc3QsCisJCQkJCWNvbnN0IHN0cnVjdCBtaXBpX2RzaV9tc2cgKm1zZyk7 Cit2b2lkIG1zbV9kc2lfaG9zdF94ZmVyX3Jlc3RvcmUoc3RydWN0IG1pcGlfZHNpX2hvc3QgKmhv c3QsCisJCQkJCWNvbnN0IHN0cnVjdCBtaXBpX2RzaV9tc2cgKm1zZyk7CitpbnQgbXNtX2RzaV9o b3N0X2NtZF90eChzdHJ1Y3QgbWlwaV9kc2lfaG9zdCAqaG9zdCwKKwkJCQkJY29uc3Qgc3RydWN0 IG1pcGlfZHNpX21zZyAqbXNnKTsKK2ludCBtc21fZHNpX2hvc3RfY21kX3J4KHN0cnVjdCBtaXBp X2RzaV9ob3N0ICpob3N0LAorCQkJCQljb25zdCBzdHJ1Y3QgbWlwaV9kc2lfbXNnICptc2cpOwor dm9pZCBtc21fZHNpX2hvc3RfY21kX3hmZXJfY29tbWl0KHN0cnVjdCBtaXBpX2RzaV9ob3N0ICpo b3N0LAorCQkJCQl1MzIgaW92YSwgdTMyIGxlbik7CitpbnQgbXNtX2RzaV9ob3N0X2VuYWJsZShz dHJ1Y3QgbWlwaV9kc2lfaG9zdCAqaG9zdCk7CitpbnQgbXNtX2RzaV9ob3N0X2Rpc2FibGUoc3Ry dWN0IG1pcGlfZHNpX2hvc3QgKmhvc3QpOworaW50IG1zbV9kc2lfaG9zdF9wb3dlcl9vbihzdHJ1 Y3QgbWlwaV9kc2lfaG9zdCAqaG9zdCk7CitpbnQgbXNtX2RzaV9ob3N0X3Bvd2VyX29mZihzdHJ1 Y3QgbWlwaV9kc2lfaG9zdCAqaG9zdCk7CitpbnQgbXNtX2RzaV9ob3N0X3NldF9kaXNwbGF5X21v ZGUoc3RydWN0IG1pcGlfZHNpX2hvc3QgKmhvc3QsCisJCQkJCXN0cnVjdCBkcm1fZGlzcGxheV9t b2RlICptb2RlKTsKK3N0cnVjdCBkcm1fcGFuZWwgKm1zbV9kc2lfaG9zdF9nZXRfcGFuZWwoc3Ry dWN0IG1pcGlfZHNpX2hvc3QgKmhvc3QsCisJCQkJCXVuc2lnbmVkIGxvbmcgKnBhbmVsX2ZsYWdz KTsKK2ludCBtc21fZHNpX2hvc3RfcmVnaXN0ZXIoc3RydWN0IG1pcGlfZHNpX2hvc3QgKmhvc3Qs IGJvb2wgY2hlY2tfZGVmZXIpOwordm9pZCBtc21fZHNpX2hvc3RfdW5yZWdpc3RlcihzdHJ1Y3Qg bWlwaV9kc2lfaG9zdCAqaG9zdCk7Cit2b2lkIG1zbV9kc2lfaG9zdF9kZXN0cm95KHN0cnVjdCBt aXBpX2RzaV9ob3N0ICpob3N0KTsKK2ludCBtc21fZHNpX2hvc3RfbW9kZXNldF9pbml0KHN0cnVj dCBtaXBpX2RzaV9ob3N0ICpob3N0LAorCQkJCQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK2lu dCBtc21fZHNpX2hvc3RfaW5pdChzdHJ1Y3QgbXNtX2RzaSAqbXNtX2RzaSk7CisKKy8qIGRzaSBw aHkgKi8KK3N0cnVjdCBtc21fZHNpX3BoeTsKK2VudW0gbXNtX2RzaV9waHlfdHlwZSB7CisJTVNN X0RTSV9QSFlfVU5LTk9XTiwKKwlNU01fRFNJX1BIWV8yOE5NLAorCU1TTV9EU0lfUEhZX01BWAor fTsKK3N0cnVjdCBtc21fZHNpX3BoeSAqbXNtX2RzaV9waHlfaW5pdChzdHJ1Y3QgcGxhdGZvcm1f ZGV2aWNlICpwZGV2LAorCQkJZW51bSBtc21fZHNpX3BoeV90eXBlIHR5cGUsIGludCBpZCk7Citp bnQgbXNtX2RzaV9waHlfZW5hYmxlKHN0cnVjdCBtc21fZHNpX3BoeSAqcGh5LCBib29sIGlzX2R1 YWxfcGFuZWwsCisJY29uc3QgdW5zaWduZWQgbG9uZyBiaXRfcmF0ZSwgY29uc3QgdW5zaWduZWQg bG9uZyBlc2NfcmF0ZSk7CitpbnQgbXNtX2RzaV9waHlfZGlzYWJsZShzdHJ1Y3QgbXNtX2RzaV9w aHkgKnBoeSk7Cit2b2lkIG1zbV9kc2lfcGh5X2dldF9jbGtfcHJlX3Bvc3Qoc3RydWN0IG1zbV9k c2lfcGh5ICpwaHksCisJCQkJCXUzMiAqY2xrX3ByZSwgdTMyICpjbGtfcG9zdCk7CisjZW5kaWYg LyogX19EU0lfQ09OTkVDVE9SX0hfXyAqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0v bXNtL2RzaS9kc2lfaG9zdC5jIGIvZHJpdmVycy9ncHUvZHJtL21zbS9kc2kvZHNpX2hvc3QuYwpu ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGIxMWViCi0tLSAvZGV2L251bGwK KysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9kc2kvZHNpX2hvc3QuYwpAQCAtMCwwICsxLDE5OTcg QEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwg cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5 b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVy bXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9u bHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9u LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0 IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2 ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNT IEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1Ymxp YyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Nsay5o PgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5j bHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1 ZGUgPGxpbnV4L29mX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2dwaW8uaD4KKyNpbmNs dWRlIDxsaW51eC9vZl9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIu aD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPHZpZGVvL21pcGlfZGlz cGxheS5oPgorCisjaW5jbHVkZSAiZHNpLmgiCisjaW5jbHVkZSAiZHNpLnhtbC5oIgorCisjZGVm aW5lIE1TTV9EU0lfVkVSX01BSk9SX1YyCTB4MDIKKyNkZWZpbmUgTVNNX0RTSV9WRVJfTUFKT1Jf NkcJMHgwMworI2RlZmluZSBNU01fRFNJXzZHX1ZFUl9NSU5PUl9WMV8wCTB4MTAwMDAwMDAKKyNk ZWZpbmUgTVNNX0RTSV82R19WRVJfTUlOT1JfVjFfMQkweDEwMDEwMDAwCisjZGVmaW5lIE1TTV9E U0lfNkdfVkVSX01JTk9SX1YxXzFfMQkweDEwMDEwMDAxCisjZGVmaW5lIE1TTV9EU0lfNkdfVkVS X01JTk9SX1YxXzIJMHgxMDAyMDAwMAorI2RlZmluZSBNU01fRFNJXzZHX1ZFUl9NSU5PUl9WMV8z XzEJMHgxMDAzMDAwMQorCisjZGVmaW5lIERTSV82R19SRUdfU0hJRlQJNAorCisjZGVmaW5lIERT SV9SRUdVTEFUT1JfTUFYCTgKK3N0cnVjdCBkc2lfcmVnX2VudHJ5IHsKKwljaGFyIG5hbWVbMzJd OworCWludCBtaW5fdm9sdGFnZTsKKwlpbnQgbWF4X3ZvbHRhZ2U7CisJaW50IGVuYWJsZV9sb2Fk OworCWludCBkaXNhYmxlX2xvYWQ7Cit9OworCitzdHJ1Y3QgZHNpX3JlZ19jb25maWcgeworCWlu dCBudW07CisJc3RydWN0IGRzaV9yZWdfZW50cnkgcmVnc1tEU0lfUkVHVUxBVE9SX01BWF07Cit9 OworCitzdHJ1Y3QgZHNpX2NvbmZpZyB7CisJdTMyIG1ham9yOworCXUzMiBtaW5vcjsKKwl1MzIg aW9fb2Zmc2V0OworCWVudW0gbXNtX2RzaV9waHlfdHlwZSBwaHlfdHlwZTsKKwlzdHJ1Y3QgZHNp X3JlZ19jb25maWcgcmVnX2NmZzsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHNpX2NvbmZp ZyBkc2lfY2Znc1tdID0geworCXtNU01fRFNJX1ZFUl9NQUpPUl9WMiwgMCwgMCwgTVNNX0RTSV9Q SFlfVU5LTk9XTn0sCisJeyAvKiA4OTc0IHYxICovCisJCS5tYWpvciA9IE1TTV9EU0lfVkVSX01B Sk9SXzZHLAorCQkubWlub3IgPSBNU01fRFNJXzZHX1ZFUl9NSU5PUl9WMV8wLAorCQkuaW9fb2Zm c2V0ID0gRFNJXzZHX1JFR19TSElGVCwKKwkJLnBoeV90eXBlID0gTVNNX0RTSV9QSFlfMjhOTSwK KwkJLnJlZ19jZmcgPSB7CisJCQkubnVtID0gNCwKKwkJCS5yZWdzID0geworCQkJCXsiZ2RzYyIs IC0xLCAtMSwgLTEsIC0xfSwKKwkJCQl7InZkZCIsIDMwMDAwMDAsIDMwMDAwMDAsIDE1MDAwMCwg MTAwfSwKKwkJCQl7InZkZGEiLCAxMjAwMDAwLCAxMjAwMDAwLCAxMDAwMDAsIDEwMH0sCisJCQkJ eyJ2ZGRpbyIsIDE4MDAwMDAsIDE4MDAwMDAsIDEwMDAwMCwgMTAwfSwKKwkJCX0sCisJCX0sCisJ fSwKKwl7IC8qIDg5NzQgdjIgKi8KKwkJLm1ham9yID0gTVNNX0RTSV9WRVJfTUFKT1JfNkcsCisJ CS5taW5vciA9IE1TTV9EU0lfNkdfVkVSX01JTk9SX1YxXzEsCisJCS5pb19vZmZzZXQgPSBEU0lf NkdfUkVHX1NISUZULAorCQkucGh5X3R5cGUgPSBNU01fRFNJX1BIWV8yOE5NLAorCQkucmVnX2Nm ZyA9IHsKKwkJCS5udW0gPSA0LAorCQkJLnJlZ3MgPSB7CisJCQkJeyJnZHNjIiwgLTEsIC0xLCAt MSwgLTF9LAorCQkJCXsidmRkIiwgMzAwMDAwMCwgMzAwMDAwMCwgMTUwMDAwLCAxMDB9LAorCQkJ CXsidmRkYSIsIDEyMDAwMDAsIDEyMDAwMDAsIDEwMDAwMCwgMTAwfSwKKwkJCQl7InZkZGlvIiwg MTgwMDAwMCwgMTgwMDAwMCwgMTAwMDAwLCAxMDB9LAorCQkJfSwKKwkJfSwKKwl9LAorCXsgLyog ODk3NCB2MyAqLworCQkubWFqb3IgPSBNU01fRFNJX1ZFUl9NQUpPUl82RywKKwkJLm1pbm9yID0g TVNNX0RTSV82R19WRVJfTUlOT1JfVjFfMV8xLAorCQkuaW9fb2Zmc2V0ID0gRFNJXzZHX1JFR19T SElGVCwKKwkJLnBoeV90eXBlID0gTVNNX0RTSV9QSFlfMjhOTSwKKwkJLnJlZ19jZmcgPSB7CisJ CQkubnVtID0gNCwKKwkJCS5yZWdzID0geworCQkJCXsiZ2RzYyIsIC0xLCAtMSwgLTEsIC0xfSwK KwkJCQl7InZkZCIsIDMwMDAwMDAsIDMwMDAwMDAsIDE1MDAwMCwgMTAwfSwKKwkJCQl7InZkZGEi LCAxMjAwMDAwLCAxMjAwMDAwLCAxMDAwMDAsIDEwMH0sCisJCQkJeyJ2ZGRpbyIsIDE4MDAwMDAs IDE4MDAwMDAsIDEwMDAwMCwgMTAwfSwKKwkJCX0sCisJCX0sCisJfSwKKwl7IC8qIDgwODQgKi8K KwkJLm1ham9yID0gTVNNX0RTSV9WRVJfTUFKT1JfNkcsCisJCS5taW5vciA9IE1TTV9EU0lfNkdf VkVSX01JTk9SX1YxXzIsCisJCS5pb19vZmZzZXQgPSBEU0lfNkdfUkVHX1NISUZULAorCQkucGh5 X3R5cGUgPSBNU01fRFNJX1BIWV8yOE5NLAorCQkucmVnX2NmZyA9IHsKKwkJCS5udW0gPSA0LAor CQkJLnJlZ3MgPSB7CisJCQkJeyJnZHNjIiwgLTEsIC0xLCAtMSwgLTF9LAorCQkJCXsidmRkIiwg MzAwMDAwMCwgMzAwMDAwMCwgMTUwMDAwLCAxMDB9LAorCQkJCXsidmRkYSIsIDEyMDAwMDAsIDEy MDAwMDAsIDEwMDAwMCwgMTAwfSwKKwkJCQl7InZkZGlvIiwgMTgwMDAwMCwgMTgwMDAwMCwgMTAw MDAwLCAxMDB9LAorCQkJfSwKKwkJfSwKKwl9LAorCXsgLyogODkxNiAqLworCQkubWFqb3IgPSBN U01fRFNJX1ZFUl9NQUpPUl82RywKKwkJLm1pbm9yID0gTVNNX0RTSV82R19WRVJfTUlOT1JfVjFf M18xLAorCQkuaW9fb2Zmc2V0ID0gRFNJXzZHX1JFR19TSElGVCwKKwkJLnBoeV90eXBlID0gTVNN X0RTSV9QSFlfMjhOTSwKKwkJLnJlZ19jZmcgPSB7CisJCQkubnVtID0gNCwKKwkJCS5yZWdzID0g eworCQkJCXsiZ2RzYyIsIC0xLCAtMSwgLTEsIC0xfSwKKwkJCQl7InZkZCIsIDI4NTAwMDAsIDI4 NTAwMDAsIDEwMDAwMCwgMTAwfSwKKwkJCQl7InZkZGEiLCAxMjAwMDAwLCAxMjAwMDAwLCAxMDAw MDAsIDEwMH0sCisJCQkJeyJ2ZGRpbyIsIDE4MDAwMDAsIDE4MDAwMDAsIDEwMDAwMCwgMTAwfSwK KwkJCX0sCisJCX0sCisJfSwKK307CisKK3N0YXRpYyBpbnQgZHNpX2dldF92ZXJzaW9uKGNvbnN0 IHZvaWQgX19pb21lbSAqYmFzZSwgdTMyICptYWpvciwgdTMyICptaW5vcikKK3sKKwl1MzIgdmVy OworCXUzMiB2ZXJfNmc7CisKKwlpZiAoIW1ham9yIHx8ICFtaW5vcikKKwkJcmV0dXJuIC1FSU5W QUw7CisKKwkvKiBGcm9tIERTSTZHKHYzKSwgYWRkaXRpb24gb2YgYSA2R19IV19WRVJTSU9OIHJl Z2lzdGVyIGF0IG9mZnNldCAwCisJICogbWFrZXMgYWxsIG90aGVyIHJlZ2lzdGVycyA0LWJ5dGUg c2hpZnRlZCBkb3duLgorCSAqLworCXZlcl82ZyA9IG1zbV9yZWFkbChiYXNlICsgUkVHX0RTSV82 R19IV19WRVJTSU9OKTsKKwlpZiAodmVyXzZnID09IDApIHsKKwkJdmVyID0gbXNtX3JlYWRsKGJh c2UgKyBSRUdfRFNJX1ZFUlNJT04pOworCQl2ZXIgPSBGSUVMRCh2ZXIsIERTSV9WRVJTSU9OX01B Sk9SKTsKKwkJaWYgKHZlciA8PSBNU01fRFNJX1ZFUl9NQUpPUl9WMikgeworCQkJLyogb2xkIHZl cnNpb25zICovCisJCQkqbWFqb3IgPSB2ZXI7CisJCQkqbWlub3IgPSAwOworCQkJcmV0dXJuIDA7 CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0gZWxzZSB7CisJCXZlciA9 IG1zbV9yZWFkbChiYXNlICsgRFNJXzZHX1JFR19TSElGVCArIFJFR19EU0lfVkVSU0lPTik7CisJ CXZlciA9IEZJRUxEKHZlciwgRFNJX1ZFUlNJT05fTUFKT1IpOworCQlpZiAodmVyID09IE1TTV9E U0lfVkVSX01BSk9SXzZHKSB7CisJCQkvKiA2RyB2ZXJzaW9uICovCisJCQkqbWFqb3IgPSB2ZXI7 CisJCQkqbWlub3IgPSB2ZXJfNmc7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIHsKKwkJCXJldHVy biAtRUlOVkFMOworCQl9CisJfQorfQorCisjZGVmaW5lIERTSV9FUlJfU1RBVEVfQUNLCQkJMHgw MDAwCisjZGVmaW5lIERTSV9FUlJfU1RBVEVfVElNRU9VVAkJCTB4MDAwMQorI2RlZmluZSBEU0lf RVJSX1NUQVRFX0RMTjBfUEhZCQkJMHgwMDAyCisjZGVmaW5lIERTSV9FUlJfU1RBVEVfRklGTwkJ CTB4MDAwNAorI2RlZmluZSBEU0lfRVJSX1NUQVRFX01EUF9GSUZPX1VOREVSRkxPVwkweDAwMDgK KyNkZWZpbmUgRFNJX0VSUl9TVEFURV9JTlRFUkxFQVZFX09QX0NPTlRFTlRJT04JMHgwMDEwCisj ZGVmaW5lIERTSV9FUlJfU1RBVEVfUExMX1VOTE9DS0VECQkweDAwMjAKKworc3RydWN0IG1zbV9k c2lfaG9zdCB7CisJc3RydWN0IG1pcGlfZHNpX2hvc3QgYmFzZTsKKworCXN0cnVjdCBwbGF0Zm9y bV9kZXZpY2UgKnBkZXY7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldjsKKworCWludCBpZDsKKwor CXZvaWQgX19pb21lbSAqY3RybF9iYXNlOworCXN0cnVjdCByZWd1bGF0b3JfYnVsa19kYXRhIHN1 cHBsaWVzW0RTSV9SRUdVTEFUT1JfTUFYXTsKKwlzdHJ1Y3QgY2xrICptZHBfY29yZV9jbGs7CisJ c3RydWN0IGNsayAqYWhiX2NsazsKKwlzdHJ1Y3QgY2xrICpheGlfY2xrOworCXN0cnVjdCBjbGsg Km1tc3NfbWlzY19haGJfY2xrOworCXN0cnVjdCBjbGsgKmJ5dGVfY2xrOworCXN0cnVjdCBjbGsg KmVzY19jbGs7CisJc3RydWN0IGNsayAqcGl4ZWxfY2xrOworCXUzMiBieXRlX2Nsa19yYXRlOwor CisJc3RydWN0IGdwaW9fZGVzYyAqZGlzcF9lbl9ncGlvOworCXN0cnVjdCBncGlvX2Rlc2MgKnRl X2dwaW87CisKKwljb25zdCBzdHJ1Y3QgZHNpX2NvbmZpZyAqY2ZnOworCisJc3RydWN0IGNvbXBs ZXRpb24gZG1hX2NvbXA7CisJc3RydWN0IGNvbXBsZXRpb24gdmlkZW9fY29tcDsKKwlzdHJ1Y3Qg bXV0ZXggZGV2X211dGV4OworCXN0cnVjdCBtdXRleCBjbWRfbXV0ZXg7CisJc3RydWN0IG11dGV4 IGNsa19tdXRleDsKKwlzcGlubG9ja190IGludHJfbG9jazsgLyogUHJvdGVjdCBpbnRlcnJ1cHQg Y3RybCByZWdpc3RlciAqLworCisJdTMyIGVycl93b3JrX3N0YXRlOworCXN0cnVjdCB3b3JrX3N0 cnVjdCBlcnJfd29yazsKKwlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd29ya3F1ZXVlOworCisJ c3RydWN0IGRybV9nZW1fb2JqZWN0ICp0eF9nZW1fb2JqOworCXU4ICpyeF9idWY7CisKKwlzdHJ1 Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZTsKKworCS8qIFBhbmVsIGluZm8gKi8KKwlzdHJ1Y3Qg ZGV2aWNlX25vZGUgKnBhbmVsX25vZGU7CisJdW5zaWduZWQgaW50IGNoYW5uZWw7CisJdW5zaWdu ZWQgaW50IGxhbmVzOworCWVudW0gbWlwaV9kc2lfcGl4ZWxfZm9ybWF0IGZvcm1hdDsKKwl1bnNp Z25lZCBsb25nIG1vZGVfZmxhZ3M7CisKKwl1MzIgZG1hX2NtZF9jdHJsX3Jlc3RvcmU7CisKKwli b29sIHJlZ2lzdGVyZWQ7CisJYm9vbCBwb3dlcl9vbjsKKwlpbnQgaXJxOworfTsKKworc3RhdGlj IHUzMiBkc2lfZ2V0X2JwcChjb25zdCBlbnVtIG1pcGlfZHNpX3BpeGVsX2Zvcm1hdCBmbXQpCit7 CisJc3dpdGNoIChmbXQpIHsKKwljYXNlIE1JUElfRFNJX0ZNVF9SR0I1NjU6CQlyZXR1cm4gMTY7 CisJY2FzZSBNSVBJX0RTSV9GTVRfUkdCNjY2X1BBQ0tFRDoJcmV0dXJuIDE4OworCWNhc2UgTUlQ SV9EU0lfRk1UX1JHQjY2NjoKKwljYXNlIE1JUElfRFNJX0ZNVF9SR0I4ODg6CisJZGVmYXVsdDoJ CQkJcmV0dXJuIDI0OworCX0KK30KKworc3RhdGljIGlubGluZSB1MzIgZHNpX3JlYWQoc3RydWN0 IG1zbV9kc2lfaG9zdCAqbXNtX2hvc3QsIHUzMiByZWcpCit7CisJcmV0dXJuIG1zbV9yZWFkbCht c21faG9zdC0+Y3RybF9iYXNlICsgbXNtX2hvc3QtPmNmZy0+aW9fb2Zmc2V0ICsgcmVnKTsKK30K K3N0YXRpYyBpbmxpbmUgdm9pZCBkc2lfd3JpdGUoc3RydWN0IG1zbV9kc2lfaG9zdCAqbXNtX2hv c3QsIHUzMiByZWcsIHUzMiBkYXRhKQoreworCW1zbV93cml0ZWwoZGF0YSwgbXNtX2hvc3QtPmN0 cmxfYmFzZSArIG1zbV9ob3N0LT5jZmctPmlvX29mZnNldCArIHJlZyk7Cit9CisKK3N0YXRpYyBp bnQgZHNpX2hvc3RfcmVndWxhdG9yX2VuYWJsZShzdHJ1Y3QgbXNtX2RzaV9ob3N0ICptc21faG9z dCk7CitzdGF0aWMgdm9pZCBkc2lfaG9zdF9yZWd1bGF0b3JfZGlzYWJsZShzdHJ1Y3QgbXNtX2Rz aV9ob3N0ICptc21faG9zdCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHNpX2NvbmZpZyAqZHNp X2dldF9jb25maWcoc3RydWN0IG1zbV9kc2lfaG9zdCAqbXNtX2hvc3QpCit7CisJY29uc3Qgc3Ry dWN0IGRzaV9jb25maWcgKmNmZzsKKwlzdHJ1Y3QgcmVndWxhdG9yICpnZHNjX3JlZzsKKwlpbnQg aSwgcmV0OworCXUzMiBtYWpvciwgbWlub3I7CisKKwlnZHNjX3JlZyA9IHJlZ3VsYXRvcl9nZXQo Jm1zbV9ob3N0LT5wZGV2LT5kZXYsICJnZHNjIik7CisJaWYgKElTX0VSUl9PUl9OVUxMKGdkc2Nf cmVnKSkgeworCQlwcl9lcnIoIiVzOiBjYW5ub3QgZ2V0IGdkc2NcbiIsIF9fZnVuY19fKTsKKwkJ Z290byBmYWlsOworCX0KKwlyZXQgPSByZWd1bGF0b3JfZW5hYmxlKGdkc2NfcmVnKTsKKwlpZiAo cmV0KSB7CisJCXByX2VycigiJXM6IHVuYWJsZSB0byBlbmFibGUgZ2RzY1xuIiwgX19mdW5jX18p OworCQlyZWd1bGF0b3JfcHV0KGdkc2NfcmVnKTsKKwkJZ290byBmYWlsOworCX0KKwlyZXQgPSBj bGtfcHJlcGFyZV9lbmFibGUobXNtX2hvc3QtPmFoYl9jbGspOworCWlmIChyZXQpIHsKKwkJcHJf ZXJyKCIlczogdW5hYmxlIHRvIGVuYWJsZSBhaGJfY2xrXG4iLCBfX2Z1bmNfXyk7CisJCXJlZ3Vs YXRvcl9kaXNhYmxlKGdkc2NfcmVnKTsKKwkJcmVndWxhdG9yX3B1dChnZHNjX3JlZyk7CisJCWdv dG8gZmFpbDsKKwl9CisKKwlyZXQgPSBkc2lfZ2V0X3ZlcnNpb24obXNtX2hvc3QtPmN0cmxfYmFz ZSwgJm1ham9yLCAmbWlub3IpOworCisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKG1zbV9ob3N0LT5h aGJfY2xrKTsKKwlyZWd1bGF0b3JfZGlzYWJsZShnZHNjX3JlZyk7CisJcmVndWxhdG9yX3B1dChn ZHNjX3JlZyk7CisJaWYgKHJldCkgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHZlcnNpb25cbiIs IF9fZnVuY19fKTsKKwkJZ290byBmYWlsOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9T SVpFKGRzaV9jZmdzKTsgaSsrKSB7CisJCWNmZyA9IGRzaV9jZmdzICsgaTsKKwkJaWYgKChjZmct Pm1ham9yID09IG1ham9yKSAmJiAoY2ZnLT5taW5vciA9PSBtaW5vcikpCisJCQlyZXR1cm4gY2Zn OworCX0KKwlwcl9lcnIoIiVzOiBWZXJzaW9uICV4OiV4IG5vdCBzdXBwb3J0XG4iLCBfX2Z1bmNf XywgbWFqb3IsIG1pbm9yKTsKKworZmFpbDoKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGlu bGluZSBzdHJ1Y3QgbXNtX2RzaV9ob3N0ICp0b19tc21fZHNpX2hvc3Qoc3RydWN0IG1pcGlfZHNp X2hvc3QgKmhvc3QpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihob3N0LCBzdHJ1Y3QgbXNtX2Rz aV9ob3N0LCBiYXNlKTsKK30KKworc3RhdGljIHZvaWQgZHNpX2hvc3RfcmVndWxhdG9yX2Rpc2Fi bGUoc3RydWN0IG1zbV9kc2lfaG9zdCAqbXNtX2hvc3QpCit7CisJc3RydWN0IHJlZ3VsYXRvcl9i dWxrX2RhdGEgKnMgPSBtc21faG9zdC0+c3VwcGxpZXM7CisJY29uc3Qgc3RydWN0IGRzaV9yZWdf ZW50cnkgKnJlZ3MgPSBtc21faG9zdC0+Y2ZnLT5yZWdfY2ZnLnJlZ3M7CisJaW50IG51bSA9IG1z bV9ob3N0LT5jZmctPnJlZ19jZmcubnVtOworCWludCBpOworCisJREJHKCIiKTsKKwlmb3IgKGkg PSBudW0gLSAxOyBpID49IDA7IGktLSkKKwkJaWYgKHJlZ3NbaV0uZGlzYWJsZV9sb2FkID49IDAp CisJCQlyZWd1bGF0b3Jfc2V0X29wdGltdW1fbW9kZShzW2ldLmNvbnN1bWVyLAorCQkJCQkJcmVn c1tpXS5kaXNhYmxlX2xvYWQpOworCisJcmVndWxhdG9yX2J1bGtfZGlzYWJsZShudW0sIHMpOwor fQorCitzdGF0aWMgaW50IGRzaV9ob3N0X3JlZ3VsYXRvcl9lbmFibGUoc3RydWN0IG1zbV9kc2lf aG9zdCAqbXNtX2hvc3QpCit7CisJc3RydWN0IHJlZ3VsYXRvcl9idWxrX2RhdGEgKnMgPSBtc21f aG9zdC0+c3VwcGxpZXM7CisJY29uc3Qgc3RydWN0IGRzaV9yZWdfZW50cnkgKnJlZ3MgPSBtc21f aG9zdC0+Y2ZnLT5yZWdfY2ZnLnJlZ3M7CisJaW50IG51bSA9IG1zbV9ob3N0LT5jZmctPnJlZ19j ZmcubnVtOworCWludCByZXQsIGk7CisKKwlEQkcoIiIpOworCWZvciAoaSA9IDA7IGkgPCBudW07 IGkrKykgeworCQlpZiAocmVnc1tpXS5lbmFibGVfbG9hZCA+PSAwKSB7CisJCQlyZXQgPSByZWd1 bGF0b3Jfc2V0X29wdGltdW1fbW9kZShzW2ldLmNvbnN1bWVyLAorCQkJCQkJCXJlZ3NbaV0uZW5h YmxlX2xvYWQpOworCQkJaWYgKHJldCA8IDApIHsKKwkJCQlwcl9lcnIoInJlZ3VsYXRvciAlZCBz ZXQgb3AgbW9kZSBmYWlsZWQsICVkXG4iLAorCQkJCQlpLCByZXQpOworCQkJCWdvdG8gZmFpbDsK KwkJCX0KKwkJfQorCX0KKworCXJldCA9IHJlZ3VsYXRvcl9idWxrX2VuYWJsZShudW0sIHMpOwor CWlmIChyZXQgPCAwKSB7CisJCXByX2VycigicmVndWxhdG9yIGVuYWJsZSBmYWlsZWQsICVkXG4i LCByZXQpOworCQlnb3RvIGZhaWw7CisJfQorCisJcmV0dXJuIDA7CisKK2ZhaWw6CisJZm9yIChp LS07IGkgPj0gMDsgaS0tKQorCQlyZWd1bGF0b3Jfc2V0X29wdGltdW1fbW9kZShzW2ldLmNvbnN1 bWVyLCByZWdzW2ldLmRpc2FibGVfbG9hZCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlu dCBkc2lfcmVndWxhdG9yX2luaXQoc3RydWN0IG1zbV9kc2lfaG9zdCAqbXNtX2hvc3QpCit7CisJ c3RydWN0IHJlZ3VsYXRvcl9idWxrX2RhdGEgKnMgPSBtc21faG9zdC0+c3VwcGxpZXM7CisJY29u c3Qgc3RydWN0IGRzaV9yZWdfZW50cnkgKnJlZ3MgPSBtc21faG9zdC0+Y2ZnLT5yZWdfY2ZnLnJl Z3M7CisJaW50IG51bSA9IG1zbV9ob3N0LT5jZmctPnJlZ19jZmcubnVtOworCWludCBpLCByZXQ7 CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspCisJCXNbaV0uc3VwcGx5ID0gcmVnc1tpXS5u YW1lOworCisJcmV0ID0gZGV2bV9yZWd1bGF0b3JfYnVsa19nZXQoJm1zbV9ob3N0LT5wZGV2LT5k ZXYsIG51bSwgcyk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCIlczogZmFpbGVkIHRvIGlu aXQgcmVndWxhdG9yLCByZXQ9JWRcbiIsCisJCQkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJcmV0dXJu IHJldDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKKwkJaWYgKChyZWdzW2ld Lm1pbl92b2x0YWdlID49IDApICYmIChyZWdzW2ldLm1heF92b2x0YWdlID49IDApKSB7CisJCQly ZXQgPSByZWd1bGF0b3Jfc2V0X3ZvbHRhZ2Uoc1tpXS5jb25zdW1lciwKKwkJCQlyZWdzW2ldLm1p bl92b2x0YWdlLCByZWdzW2ldLm1heF92b2x0YWdlKTsKKwkJCWlmIChyZXQgPCAwKSB7CisJCQkJ cHJfZXJyKCJyZWd1bGF0b3IgJWQgc2V0IHZvbHRhZ2UgZmFpbGVkLCAlZFxuIiwKKwkJCQkJaSwg cmV0KTsKKwkJCQlyZXR1cm4gcmV0OworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisK K3N0YXRpYyBpbnQgZHNpX2Nsa19pbml0KHN0cnVjdCBtc21fZHNpX2hvc3QgKm1zbV9ob3N0KQor eworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZtc21faG9zdC0+cGRldi0+ZGV2OworCWludCByZXQg PSAwOworCisJbXNtX2hvc3QtPm1kcF9jb3JlX2NsayA9IGRldm1fY2xrX2dldChkZXYsICJtZHBf Y29yZV9jbGsiKTsKKwlpZiAoSVNfRVJSKG1zbV9ob3N0LT5tZHBfY29yZV9jbGspKSB7CisJCXJl dCA9IFBUUl9FUlIobXNtX2hvc3QtPm1kcF9jb3JlX2Nsayk7CisJCXByX2VycigiJXM6IFVuYWJs ZSB0byBnZXQgbWRwIGNvcmUgY2xrLiByZXQ9JWRcbiIsCisJCQlfX2Z1bmNfXywgcmV0KTsKKwkJ Z290byBleGl0OworCX0KKworCW1zbV9ob3N0LT5haGJfY2xrID0gZGV2bV9jbGtfZ2V0KGRldiwg ImlmYWNlX2NsayIpOworCWlmIChJU19FUlIobXNtX2hvc3QtPmFoYl9jbGspKSB7CisJCXJldCA9 IFBUUl9FUlIobXNtX2hvc3QtPmFoYl9jbGspOworCQlwcl9lcnIoIiVzOiBVbmFibGUgdG8gZ2V0 IG1kc3MgYWhiIGNsay4gcmV0PSVkXG4iLAorCQkJX19mdW5jX18sIHJldCk7CisJCWdvdG8gZXhp dDsKKwl9CisKKwltc21faG9zdC0+YXhpX2NsayA9IGRldm1fY2xrX2dldChkZXYsICJidXNfY2xr Iik7CisJaWYgKElTX0VSUihtc21faG9zdC0+YXhpX2NsaykpIHsKKwkJcmV0ID0gUFRSX0VSUiht c21faG9zdC0+YXhpX2Nsayk7CisJCXByX2VycigiJXM6IFVuYWJsZSB0byBnZXQgYXhpIGJ1cyBj bGsuIHJldD0lZFxuIiwKKwkJCV9fZnVuY19fLCByZXQpOworCQlnb3RvIGV4aXQ7CisJfQorCisJ bXNtX2hvc3QtPm1tc3NfbWlzY19haGJfY2xrID0gZGV2bV9jbGtfZ2V0KGRldiwgImNvcmVfbW1z c19jbGsiKTsKKwlpZiAoSVNfRVJSKG1zbV9ob3N0LT5tbXNzX21pc2NfYWhiX2NsaykpIHsKKwkJ cmV0ID0gUFRSX0VSUihtc21faG9zdC0+bW1zc19taXNjX2FoYl9jbGspOworCQlwcl9lcnIoIiVz OiBVbmFibGUgdG8gZ2V0IG1tc3MgbWlzYyBhaGIgY2xrLiByZXQ9JWRcbiIsCisJCQlfX2Z1bmNf XywgcmV0KTsKKwkJZ290byBleGl0OworCX0KKworCW1zbV9ob3N0LT5ieXRlX2NsayA9IGRldm1f Y2xrX2dldChkZXYsICJieXRlX2NsayIpOworCWlmIChJU19FUlIobXNtX2hvc3QtPmJ5dGVfY2xr KSkgeworCQlyZXQgPSBQVFJfRVJSKG1zbV9ob3N0LT5ieXRlX2Nsayk7CisJCXByX2VycigiJXM6 IGNhbid0IGZpbmQgZHNpX2J5dGVfY2xrLiByZXQ9JWRcbiIsCisJCQlfX2Z1bmNfXywgcmV0KTsK KwkJbXNtX2hvc3QtPmJ5dGVfY2xrID0gTlVMTDsKKwkJZ290byBleGl0OworCX0KKworCW1zbV9o b3N0LT5waXhlbF9jbGsgPSBkZXZtX2Nsa19nZXQoZGV2LCAicGl4ZWxfY2xrIik7CisJaWYgKElT X0VSUihtc21faG9zdC0+cGl4ZWxfY2xrKSkgeworCQlyZXQgPSBQVFJfRVJSKG1zbV9ob3N0LT5w aXhlbF9jbGspOworCQlwcl9lcnIoIiVzOiBjYW4ndCBmaW5kIGRzaV9waXhlbF9jbGsuIHJldD0l ZFxuIiwKKwkJCV9fZnVuY19fLCByZXQpOworCQltc21faG9zdC0+cGl4ZWxfY2xrID0gTlVMTDsK KwkJZ290byBleGl0OworCX0KKworCW1zbV9ob3N0LT5lc2NfY2xrID0gZGV2bV9jbGtfZ2V0KGRl diwgImNvcmVfY2xrIik7CisJaWYgKElTX0VSUihtc21faG9zdC0+ZXNjX2NsaykpIHsKKwkJcmV0 ID0gUFRSX0VSUihtc21faG9zdC0+ZXNjX2Nsayk7CisJCXByX2VycigiJXM6IGNhbid0IGZpbmQg ZHNpX2VzY19jbGsuIHJldD0lZFxuIiwKKwkJCV9fZnVuY19fLCByZXQpOworCQltc21faG9zdC0+ ZXNjX2NsayA9IE5VTEw7CisJCWdvdG8gZXhpdDsKKwl9CisKK2V4aXQ6CisJcmV0dXJuIHJldDsK K30KKworc3RhdGljIGludCBkc2lfYnVzX2Nsa19lbmFibGUoc3RydWN0IG1zbV9kc2lfaG9zdCAq bXNtX2hvc3QpCit7CisJaW50IHJldCA9IDA7CisKKwlEQkcoIiVzOiBpZD0lZFxuIiwgX19mdW5j X18sIG1zbV9ob3N0LT5pZCk7CisKKwlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUobXNtX2hvc3Qt Pm1kcF9jb3JlX2Nsayk7CisJaWYgKHJldCkgeworCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gZW5h YmxlIG1kcF9jb3JlX2Nsb2NrLCAlZFxuIiwKKwkJCQkJCQkgX19mdW5jX18sIHJldCk7CisJCWdv dG8gY29yZV9jbGtfZXJyOworCX0KKworCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShtc21faG9z dC0+YWhiX2Nsayk7CisJaWYgKHJldCkgeworCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gZW5hYmxl IGFoYiBjbG9jaywgJWRcbiIsIF9fZnVuY19fLCByZXQpOworCQlnb3RvIGFoYl9jbGtfZXJyOwor CX0KKworCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShtc21faG9zdC0+YXhpX2Nsayk7CisJaWYg KHJldCkgeworCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gZW5hYmxlIGFoYiBjbG9jaywgJWRcbiIs IF9fZnVuY19fLCByZXQpOworCQlnb3RvIGF4aV9jbGtfZXJyOworCX0KKworCXJldCA9IGNsa19w cmVwYXJlX2VuYWJsZShtc21faG9zdC0+bW1zc19taXNjX2FoYl9jbGspOworCWlmIChyZXQpIHsK KwkJcHJfZXJyKCIlczogZmFpbGVkIHRvIGVuYWJsZSBtbXNzIG1pc2MgYWhiIGNsaywgJWRcbiIs CisJCQlfX2Z1bmNfXywgcmV0KTsKKwkJZ290byBtaXNjX2FoYl9jbGtfZXJyOworCX0KKworCXJl dHVybiAwOworCittaXNjX2FoYl9jbGtfZXJyOgorCWNsa19kaXNhYmxlX3VucHJlcGFyZShtc21f aG9zdC0+YXhpX2Nsayk7CitheGlfY2xrX2VycjoKKwljbGtfZGlzYWJsZV91bnByZXBhcmUobXNt X2hvc3QtPmFoYl9jbGspOworYWhiX2Nsa19lcnI6CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKG1z bV9ob3N0LT5tZHBfY29yZV9jbGspOworY29yZV9jbGtfZXJyOgorCXJldHVybiByZXQ7Cit9CisK K3N0YXRpYyB2b2lkIGRzaV9idXNfY2xrX2Rpc2FibGUoc3RydWN0IG1zbV9kc2lfaG9zdCAqbXNt X2hvc3QpCit7CisJREJHKCIiKTsKKwljbGtfZGlzYWJsZV91bnByZXBhcmUobXNtX2hvc3QtPm1t c3NfbWlzY19haGJfY2xrKTsKKwljbGtfZGlzYWJsZV91bnByZXBhcmUobXNtX2hvc3QtPmF4aV9j bGspOworCWNsa19kaXNhYmxlX3VucHJlcGFyZShtc21faG9zdC0+YWhiX2Nsayk7CisJY2xrX2Rp c2FibGVfdW5wcmVwYXJlKG1zbV9ob3N0LT5tZHBfY29yZV9jbGspOworfQorCitzdGF0aWMgaW50 IGRzaV9saW5rX2Nsa19lbmFibGUoc3RydWN0IG1zbV9kc2lfaG9zdCAqbXNtX2hvc3QpCit7CisJ aW50IHJldCA9IDA7CisKKwlEQkcoIlNldCBjbGsgcmF0ZXM6IHBjbGs9JWQsIGJ5dGVjbGs9JWRc biIsCisJCW1zbV9ob3N0LT5tb2RlLT5jbG9jaywgbXNtX2hvc3QtPmJ5dGVfY2xrX3JhdGUpOwor CisJcmV0ID0gIGNsa19zZXRfcmF0ZShtc21faG9zdC0+Ynl0ZV9jbGssIG1zbV9ob3N0LT5ieXRl X2Nsa19yYXRlKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiJXM6IEZhaWxlZCB0byBzZXQgcmF0 ZSBieXRlIGNsaywgJWRcbiIsIF9fZnVuY19fLCByZXQpOworCQlnb3RvIGVycm9yOworCX0KKwor CXJldCA9IGNsa19zZXRfcmF0ZShtc21faG9zdC0+cGl4ZWxfY2xrLCBtc21faG9zdC0+bW9kZS0+ Y2xvY2sgKiAxMDAwKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiJXM6IEZhaWxlZCB0byBzZXQg cmF0ZSBwaXhlbCBjbGssICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKKwkJZ290byBlcnJvcjsKKwl9 CisKKwlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUobXNtX2hvc3QtPmVzY19jbGspOworCWlmIChy ZXQpIHsKKwkJcHJfZXJyKCIlczogRmFpbGVkIHRvIGVuYWJsZSBkc2kgZXNjIGNsa1xuIiwgX19m dW5jX18pOworCQlnb3RvIGVycm9yOworCX0KKworCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZSht c21faG9zdC0+Ynl0ZV9jbGspOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCIlczogRmFpbGVkIHRv IGVuYWJsZSBkc2kgYnl0ZSBjbGtcbiIsIF9fZnVuY19fKTsKKwkJZ290byBieXRlX2Nsa19lcnI7 CisJfQorCisJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKG1zbV9ob3N0LT5waXhlbF9jbGspOwor CWlmIChyZXQpIHsKKwkJcHJfZXJyKCIlczogRmFpbGVkIHRvIGVuYWJsZSBkc2kgcGl4ZWwgY2xr XG4iLCBfX2Z1bmNfXyk7CisJCWdvdG8gcGl4ZWxfY2xrX2VycjsKKwl9CisKKwlyZXR1cm4gcmV0 OworCitwaXhlbF9jbGtfZXJyOgorCWNsa19kaXNhYmxlX3VucHJlcGFyZShtc21faG9zdC0+Ynl0 ZV9jbGspOworYnl0ZV9jbGtfZXJyOgorCWNsa19kaXNhYmxlX3VucHJlcGFyZShtc21faG9zdC0+ ZXNjX2Nsayk7CitlcnJvcjoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBkc2lfbGlu a19jbGtfZGlzYWJsZShzdHJ1Y3QgbXNtX2RzaV9ob3N0ICptc21faG9zdCkKK3sKKwljbGtfZGlz YWJsZV91bnByZXBhcmUobXNtX2hvc3QtPmVzY19jbGspOworCWNsa19kaXNhYmxlX3VucHJlcGFy ZShtc21faG9zdC0+cGl4ZWxfY2xrKTsKKwljbGtfZGlzYWJsZV91bnByZXBhcmUobXNtX2hvc3Qt PmJ5dGVfY2xrKTsKK30KKworc3RhdGljIGludCBkc2lfY2xrX2N0cmwoc3RydWN0IG1zbV9kc2lf aG9zdCAqbXNtX2hvc3QsIGJvb2wgZW5hYmxlKQoreworCWludCByZXQ7CisKKwltdXRleF9sb2Nr KCZtc21faG9zdC0+Y2xrX211dGV4KTsKKwlpZiAoZW5hYmxlKSB7CisJCXJldCA9IGRzaV9idXNf Y2xrX2VuYWJsZShtc21faG9zdCk7CisJCWlmIChyZXQpIHsKKwkJCXByX2VycigiJXM6IENhbiBu b3QgZW5hYmxlIGJ1cyBjbGssICVkXG4iLAorCQkJCV9fZnVuY19fLCByZXQpOworCQkJZ290byB1 bmxvY2tfcmV0OworCQl9CisJCXJldCA9IGRzaV9saW5rX2Nsa19lbmFibGUobXNtX2hvc3QpOwor CQlpZiAocmV0KSB7CisJCQlwcl9lcnIoIiVzOiBDYW4gbm90IGVuYWJsZSBsaW5rIGNsaywgJWRc biIsCisJCQkJX19mdW5jX18sIHJldCk7CisJCQlkc2lfYnVzX2Nsa19kaXNhYmxlKG1zbV9ob3N0 KTsKKwkJCWdvdG8gdW5sb2NrX3JldDsKKwkJfQorCX0gZWxzZSB7CisJCWRzaV9saW5rX2Nsa19k aXNhYmxlKG1zbV9ob3N0KTsKKwkJZHNpX2J1c19jbGtfZGlzYWJsZShtc21faG9zdCk7CisJfQor Cit1bmxvY2tfcmV0OgorCW11dGV4X3VubG9jaygmbXNtX2hvc3QtPmNsa19tdXRleCk7CisJcmV0 dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHNpX2dwaW9faW5pdChzdHJ1Y3QgbXNtX2RzaV9ob3N0 ICptc21faG9zdCkKK3sKKwlpbnQgcmV0OworCisJbXNtX2hvc3QtPmRpc3BfZW5fZ3BpbyA9IGRl dm1fZ3Bpb2RfZ2V0KCZtc21faG9zdC0+cGRldi0+ZGV2LAorCQkJCQkJImRpc3AtZW5hYmxlIik7 CisJaWYgKElTX0VSUihtc21faG9zdC0+ZGlzcF9lbl9ncGlvKSkgeworCQlwcl93YXJuKCIlczog Y2Fubm90IGdldCBkaXNwLWVuYWJsZS1ncGlvcyAlbGRcbiIsCisJCQlfX2Z1bmNfXywgUFRSX0VS Uihtc21faG9zdC0+ZGlzcF9lbl9ncGlvKSk7CisJCW1zbV9ob3N0LT5kaXNwX2VuX2dwaW8gPSBO VUxMOworCX0KKwlpZiAobXNtX2hvc3QtPmRpc3BfZW5fZ3BpbykgeworCQlyZXQgPSBncGlvZF9k aXJlY3Rpb25fb3V0cHV0KG1zbV9ob3N0LT5kaXNwX2VuX2dwaW8sIDApOworCQlpZiAocmV0KSB7 CisJCQlwcl9lcnIoImNhbm5vdCBzZXQgZGlyIHRvIGRpc3AtZW4tZ3Bpb3MgJWRcbiIsIHJldCk7 CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJbXNtX2hvc3QtPnRlX2dwaW8gPSBkZXZtX2dw aW9kX2dldCgmbXNtX2hvc3QtPnBkZXYtPmRldiwgImRpc3AtdGUiKTsKKwlpZiAoSVNfRVJSKG1z bV9ob3N0LT50ZV9ncGlvKSkgeworCQlwcl93YXJuKCIlczogY2Fubm90IGdldCBkaXNwLXRlLWdw aW9zICVsZFxuIiwKKwkJCV9fZnVuY19fLCBQVFJfRVJSKG1zbV9ob3N0LT50ZV9ncGlvKSk7CisJ CW1zbV9ob3N0LT50ZV9ncGlvID0gTlVMTDsKKwl9CisKKwlpZiAobXNtX2hvc3QtPnRlX2dwaW8p IHsKKwkJcmV0ID0gZ3Bpb2RfZGlyZWN0aW9uX2lucHV0KG1zbV9ob3N0LT50ZV9ncGlvKTsKKwkJ aWYgKHJldCkgeworCQkJcHJfZXJyKCIlczogY2Fubm90IHNldCBkaXIgdG8gZGlzcC10ZS1ncGlv cywgJWRcbiIsCisJCQkJX19mdW5jX18sIHJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQor CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBkc2lfY2FsY19jbGtfcmF0ZShzdHJ1Y3Qg bXNtX2RzaV9ob3N0ICptc21faG9zdCkKK3sKKwlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9k ZSA9IG1zbV9ob3N0LT5tb2RlOworCXU4IGxhbmVzID0gbXNtX2hvc3QtPmxhbmVzOworCXUzMiBi cHAgPSBkc2lfZ2V0X2JwcChtc21faG9zdC0+Zm9ybWF0KTsKKwl1MzIgcGNsa19yYXRlOworCisJ aWYgKCFtb2RlKSB7CisJCXByX2VycigiJXM6IG1vZGUgbm90IHNldFxuIiwgX19mdW5jX18pOwor CQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlwY2xrX3JhdGUgPSBtb2RlLT5jbG9jayAqIDEwMDA7 CisJaWYgKGxhbmVzID4gMCkgeworCQltc21faG9zdC0+Ynl0ZV9jbGtfcmF0ZSA9IChwY2xrX3Jh dGUgKiBicHApIC8gKDggKiBsYW5lcyk7CisJfSBlbHNlIHsKKwkJcHJfZXJyKCIlczogZm9yY2lu ZyBtZHNzX2RzaSBsYW5lcyB0byAxXG4iLCBfX2Z1bmNfXyk7CisJCW1zbV9ob3N0LT5ieXRlX2Ns a19yYXRlID0gKHBjbGtfcmF0ZSAqIGJwcCkgLyA4OworCX0KKworCURCRygicGNsaz0lZCwgYmNs az0lZFxuIiwgcGNsa19yYXRlLCBtc21faG9zdC0+Ynl0ZV9jbGtfcmF0ZSk7CisKKwlyZXR1cm4g MDsKK30KKworc3RhdGljIHZvaWQgZHNpX3BoeV9zd19yZXNldChzdHJ1Y3QgbXNtX2RzaV9ob3N0 ICptc21faG9zdCkKK3sKKwlEQkcoIiIpOworCWRzaV93cml0ZShtc21faG9zdCwgUkVHX0RTSV9Q SFlfUkVTRVQsIERTSV9QSFlfUkVTRVRfUkVTRVQpOworCS8qIE1ha2Ugc3VyZSBmdWxseSByZXNl dCAqLworCXdtYigpOworCXVkZWxheSgxMDAwKTsKKwlkc2lfd3JpdGUobXNtX2hvc3QsIFJFR19E U0lfUEhZX1JFU0VULCAwKTsKKwl1ZGVsYXkoMTAwKTsKK30KKworc3RhdGljIHZvaWQgZHNpX2lu dHJfY3RybChzdHJ1Y3QgbXNtX2RzaV9ob3N0ICptc21faG9zdCwgdTMyIG1hc2ssIGludCBlbmFi bGUpCit7CisJdTMyIGludHI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19p cnFzYXZlKCZtc21faG9zdC0+aW50cl9sb2NrLCBmbGFncyk7CisJaW50ciA9IGRzaV9yZWFkKG1z bV9ob3N0LCBSRUdfRFNJX0lOVFJfQ1RSTCk7CisKKwlpZiAoZW5hYmxlKQorCQlpbnRyIHw9IG1h c2s7CisJZWxzZQorCQlpbnRyICY9IH5tYXNrOworCisJREJHKCJpbnRyPSV4IGVuYWJsZT0lZCIs IGludHIsIGVuYWJsZSk7CisKKwlkc2lfd3JpdGUobXNtX2hvc3QsIFJFR19EU0lfSU5UUl9DVFJM LCBpbnRyKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtc21faG9zdC0+aW50cl9sb2NrLCBm bGFncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgZW51bSBkc2lfdHJhZmZpY19tb2RlIGRzaV9nZXRf dHJhZmZpY19tb2RlKGNvbnN0IHUzMiBtb2RlX2ZsYWdzKQoreworCWlmIChtb2RlX2ZsYWdzICYg TUlQSV9EU0lfTU9ERV9WSURFT19CVVJTVCkKKwkJcmV0dXJuIEJVUlNUX01PREU7CisJZWxzZSBp ZiAobW9kZV9mbGFncyAmIE1JUElfRFNJX01PREVfVklERU9fU1lOQ19QVUxTRSkKKwkJcmV0dXJu IE5PTl9CVVJTVF9TWU5DSF9QVUxTRTsKKworCXJldHVybiBOT05fQlVSU1RfU1lOQ0hfRVZFTlQ7 Cit9CisKK3N0YXRpYyBpbmxpbmUgZW51bSBkc2lfdmlkX2RzdF9mb3JtYXQgZHNpX2dldF92aWRf Zm10KAorCQkJCWNvbnN0IGVudW0gbWlwaV9kc2lfcGl4ZWxfZm9ybWF0IG1pcGlfZm10KQorewor CXN3aXRjaCAobWlwaV9mbXQpIHsKKwljYXNlIE1JUElfRFNJX0ZNVF9SR0I4ODg6CXJldHVybiBW SURfRFNUX0ZPUk1BVF9SR0I4ODg7CisJY2FzZSBNSVBJX0RTSV9GTVRfUkdCNjY2OglyZXR1cm4g VklEX0RTVF9GT1JNQVRfUkdCNjY2X0xPT1NFOworCWNhc2UgTUlQSV9EU0lfRk1UX1JHQjY2Nl9Q QUNLRUQ6CXJldHVybiBWSURfRFNUX0ZPUk1BVF9SR0I2NjY7CisJY2FzZSBNSVBJX0RTSV9GTVRf UkdCNTY1OglyZXR1cm4gVklEX0RTVF9GT1JNQVRfUkdCNTY1OworCWRlZmF1bHQ6CQkJcmV0dXJu IFZJRF9EU1RfRk9STUFUX1JHQjg4ODsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgZW51bSBkc2lf Y21kX2RzdF9mb3JtYXQgZHNpX2dldF9jbWRfZm10KAorCQkJCWNvbnN0IGVudW0gbWlwaV9kc2lf cGl4ZWxfZm9ybWF0IG1pcGlfZm10KQoreworCXN3aXRjaCAobWlwaV9mbXQpIHsKKwljYXNlIE1J UElfRFNJX0ZNVF9SR0I4ODg6CXJldHVybiBDTURfRFNUX0ZPUk1BVF9SR0I4ODg7CisJY2FzZSBN SVBJX0RTSV9GTVRfUkdCNjY2X1BBQ0tFRDoKKwljYXNlIE1JUElfRFNJX0ZNVF9SR0I2NjY6CXJl dHVybiBWSURfRFNUX0ZPUk1BVF9SR0I2NjY7CisJY2FzZSBNSVBJX0RTSV9GTVRfUkdCNTY1Ogly ZXR1cm4gQ01EX0RTVF9GT1JNQVRfUkdCNTY1OworCWRlZmF1bHQ6CQkJcmV0dXJuIENNRF9EU1Rf Rk9STUFUX1JHQjg4ODsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGRzaV9jdHJsX2NvbmZpZyhzdHJ1 Y3QgbXNtX2RzaV9ob3N0ICptc21faG9zdCwgYm9vbCBlbmFibGUsCisJCQkJdTMyIGNsa19wcmUs IHUzMiBjbGtfcG9zdCkKK3sKKwl1MzIgZmxhZ3MgPSBtc21faG9zdC0+bW9kZV9mbGFnczsKKwll bnVtIG1pcGlfZHNpX3BpeGVsX2Zvcm1hdCBtaXBpX2ZtdCA9IG1zbV9ob3N0LT5mb3JtYXQ7CisJ dTMyIGRhdGEgPSAwOworCisJaWYgKCFlbmFibGUpIHsKKwkJZHNpX3dyaXRlKG1zbV9ob3N0LCBS RUdfRFNJX0NUUkwsIDApOworCQlyZXR1cm47CisJfQorCisJaWYgKGZsYWdzICYgTUlQSV9EU0lf TU9ERV9WSURFTykgeworCQlpZiAoZmxhZ3MgJiBNSVBJX0RTSV9NT0RFX1ZJREVPX0hTRSkKKwkJ CWRhdGEgfD0gRFNJX1ZJRF9DRkcwX1BVTFNFX01PREVfSFNBX0hFOworCQlpZiAoZmxhZ3MgJiBN SVBJX0RTSV9NT0RFX1ZJREVPX0hGUCkKKwkJCWRhdGEgfD0gRFNJX1ZJRF9DRkcwX0hGUF9QT1dF Ul9TVE9QOworCQlpZiAoZmxhZ3MgJiBNSVBJX0RTSV9NT0RFX1ZJREVPX0hCUCkKKwkJCWRhdGEg fD0gRFNJX1ZJRF9DRkcwX0hCUF9QT1dFUl9TVE9QOworCQlpZiAoZmxhZ3MgJiBNSVBJX0RTSV9N T0RFX1ZJREVPX0hTQSkKKwkJCWRhdGEgfD0gRFNJX1ZJRF9DRkcwX0hTQV9QT1dFUl9TVE9QOwor CQkvKiBBbHdheXMgc2V0IGxvdyBwb3dlciBzdG9wIG1vZGUgZm9yIEJMTFAKKwkJICogdG8gbGV0 IGNvbW1hbmQgZW5naW5lIHNlbmQgcGFja2V0cworCQkgKi8KKwkJZGF0YSB8PSBEU0lfVklEX0NG RzBfRU9GX0JMTFBfUE9XRVJfU1RPUCB8CisJCQlEU0lfVklEX0NGRzBfQkxMUF9QT1dFUl9TVE9Q OworCQlkYXRhIHw9IERTSV9WSURfQ0ZHMF9UUkFGRklDX01PREUoZHNpX2dldF90cmFmZmljX21v ZGUoZmxhZ3MpKTsKKwkJZGF0YSB8PSBEU0lfVklEX0NGRzBfRFNUX0ZPUk1BVChkc2lfZ2V0X3Zp ZF9mbXQobWlwaV9mbXQpKTsKKwkJZGF0YSB8PSBEU0lfVklEX0NGRzBfVklSVF9DSEFOTkVMKG1z bV9ob3N0LT5jaGFubmVsKTsKKwkJZHNpX3dyaXRlKG1zbV9ob3N0LCBSRUdfRFNJX1ZJRF9DRkcw LCBkYXRhKTsKKworCQkvKiBEbyBub3Qgc3dhcCBSR0IgY29sb3JzICovCisJCWRhdGEgPSBEU0lf VklEX0NGRzFfUkdCX1NXQVAoU1dBUF9SR0IpOworCQlkc2lfd3JpdGUobXNtX2hvc3QsIFJFR19E U0lfVklEX0NGRzEsIDApOworCX0gZWxzZSB7CisJCS8qIERvIG5vdCBzd2FwIFJHQiBjb2xvcnMg Ki8KKwkJZGF0YSA9IERTSV9DTURfQ0ZHMF9SR0JfU1dBUChTV0FQX1JHQik7CisJCWRhdGEgfD0g RFNJX0NNRF9DRkcwX0RTVF9GT1JNQVQoZHNpX2dldF9jbWRfZm10KG1pcGlfZm10KSk7CisJCWRz aV93cml0ZShtc21faG9zdCwgUkVHX0RTSV9DTURfQ0ZHMCwgZGF0YSk7CisKKwkJZGF0YSA9IERT SV9DTURfQ0ZHMV9XUl9NRU1fU1RBUlQoTUlQSV9EQ1NfV1JJVEVfTUVNT1JZX1NUQVJUKSB8CisJ CQlEU0lfQ01EX0NGRzFfV1JfTUVNX0NPTlRJTlVFKAorCQkJCQlNSVBJX0RDU19XUklURV9NRU1P UllfQ09OVElOVUUpOworCQkvKiBBbHdheXMgaW5zZXJ0IERDUyBjb21tYW5kICovCisJCWRhdGEg fD0gRFNJX0NNRF9DRkcxX0lOU0VSVF9EQ1NfQ09NTUFORDsKKwkJZHNpX3dyaXRlKG1zbV9ob3N0 LCBSRUdfRFNJX0NNRF9DRkcxLCBkYXRhKTsKKwl9CisKKwlkc2lfd3JpdGUobXNtX2hvc3QsIFJF R19EU0lfQ01EX0RNQV9DVFJMLAorCQkJRFNJX0NNRF9ETUFfQ1RSTF9GUk9NX0ZSQU1FX0JVRkZF UiB8CisJCQlEU0lfQ01EX0RNQV9DVFJMX0xPV19QT1dFUik7CisKKwlkYXRhID0gMDsKKwkvKiBB bHdheXMgYXNzdW1lIGRlZGljYXRlZCBURSBwaW4gKi8KKwlkYXRhIHw9IERTSV9UUklHX0NUUkxf VEU7CisJZGF0YSB8PSBEU0lfVFJJR19DVFJMX01EUF9UUklHR0VSKFRSSUdHRVJfTk9ORSk7CisJ ZGF0YSB8PSBEU0lfVFJJR19DVFJMX0RNQV9UUklHR0VSKFRSSUdHRVJfU1cpOworCWRhdGEgfD0g RFNJX1RSSUdfQ1RSTF9TVFJFQU0obXNtX2hvc3QtPmNoYW5uZWwpOworCWlmICgobXNtX2hvc3Qt PmNmZy0+bWFqb3IgPT0gTVNNX0RTSV9WRVJfTUFKT1JfNkcpICYmCisJCShtc21faG9zdC0+Y2Zn LT5taW5vciA+PSBNU01fRFNJXzZHX1ZFUl9NSU5PUl9WMV8yKSkKKwkJZGF0YSB8PSBEU0lfVFJJ R19DVFJMX0JMT0NLX0RNQV9XSVRISU5fRlJBTUU7CisJZHNpX3dyaXRlKG1zbV9ob3N0LCBSRUdf RFNJX1RSSUdfQ1RSTCwgZGF0YSk7CisKKwlkYXRhID0gRFNJX0NMS09VVF9USU1JTkdfQ1RSTF9U X0NMS19QT1NUKGNsa19wb3N0KSB8CisJCURTSV9DTEtPVVRfVElNSU5HX0NUUkxfVF9DTEtfUFJF KGNsa19wcmUpOworCWRzaV93cml0ZShtc21faG9zdCwgUkVHX0RTSV9DTEtPVVRfVElNSU5HX0NU UkwsIGRhdGEpOworCisJZGF0YSA9IDA7CisJaWYgKCEoZmxhZ3MgJiBNSVBJX0RTSV9NT0RFX0VP VF9QQUNLRVQpKQorCQlkYXRhIHw9IERTSV9FT1RfUEFDS0VUX0NUUkxfVFhfRU9UX0FQUEVORDsK Kwlkc2lfd3JpdGUobXNtX2hvc3QsIFJFR19EU0lfRU9UX1BBQ0tFVF9DVFJMLCBkYXRhKTsKKwor CS8qIGFsbG93IG9ubHkgYWNrLWVyci1zdGF0dXMgdG8gZ2VuZXJhdGUgaW50ZXJydXB0ICovCisJ ZHNpX3dyaXRlKG1zbV9ob3N0LCBSRUdfRFNJX0VSUl9JTlRfTUFTSzAsIDB4MTNmZjNmZTApOwor CisJZHNpX2ludHJfY3RybChtc21faG9zdCwgRFNJX0lSUV9NQVNLX0VSUk9SLCAxKTsKKworCWRz aV93cml0ZShtc21faG9zdCwgUkVHX0RTSV9DTEtfQ1RSTCwKKwkJRFNJX0NMS19DVFJMX0FIQlNf SENMS19PTiB8IERTSV9DTEtfQ1RSTF9BSEJNX1NDTEtfT04gfAorCQlEU0lfQ0xLX0NUUkxfUENM S19PTiB8IERTSV9DTEtfQ1RSTF9EU0lDTEtfT04gfAorCQlEU0lfQ0xLX0NUUkxfQllURUNMS19P TiB8IERTSV9DTEtfQ1RSTF9FU0NDTEtfT04gfAorCQlEU0lfQ0xLX0NUUkxfRk9SQ0VfT05fRFlO X0FIQk1fSENMSyk7CisKKwlkYXRhID0gRFNJX0NUUkxfQ0xLX0VOOworCisJREJHKCJsYW5lIG51 bWJlcj0lZCIsIG1zbV9ob3N0LT5sYW5lcyk7CisJaWYgKG1zbV9ob3N0LT5sYW5lcyA9PSAyKSB7 CisJCWRhdGEgfD0gRFNJX0NUUkxfTEFORTEgfCBEU0lfQ1RSTF9MQU5FMjsKKwkJLyogc3dhcCBs YW5lcyBmb3IgMi1sYW5lIHBhbmVsIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2UgKi8KKwkJZHNpX3dy aXRlKG1zbV9ob3N0LCBSRUdfRFNJX0xBTkVfU1dBUF9DVFJMLAorCQkJRFNJX0xBTkVfU1dBUF9D VFJMX0RMTl9TV0FQX1NFTChMQU5FX1NXQVBfMTIzMCkpOworCX0gZWxzZSB7CisJCS8qIFRha2Ug NCBsYW5lcyBhcyBkZWZhdWx0ICovCisJCWRhdGEgfD0gRFNJX0NUUkxfTEFORTAgfCBEU0lfQ1RS TF9MQU5FMSB8IERTSV9DVFJMX0xBTkUyIHwKKwkJCURTSV9DVFJMX0xBTkUzOworCQkvKiBEbyBu b3Qgc3dhcCBsYW5lcyBmb3IgNC1sYW5lIHBhbmVsICovCisJCWRzaV93cml0ZShtc21faG9zdCwg UkVHX0RTSV9MQU5FX1NXQVBfQ1RSTCwKKwkJCURTSV9MQU5FX1NXQVBfQ1RSTF9ETE5fU1dBUF9T RUwoTEFORV9TV0FQXzAxMjMpKTsKKwl9CisJZGF0YSB8PSBEU0lfQ1RSTF9FTkFCTEU7CisKKwlk c2lfd3JpdGUobXNtX2hvc3QsIFJFR19EU0lfQ1RSTCwgZGF0YSk7Cit9CisKK3N0YXRpYyB2b2lk IGRzaV90aW1pbmdfc2V0dXAoc3RydWN0IG1zbV9kc2lfaG9zdCAqbXNtX2hvc3QpCit7CisJc3Ry dWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUgPSBtc21faG9zdC0+bW9kZTsKKwl1MzIgaHNfc3Rh cnQgPSAwLCB2c19zdGFydCA9IDA7IC8qIHRha2Ugc3luYyBzdGFydCBhcyAwICovCisJdTMyIGhf dG90YWwgPSBtb2RlLT5odG90YWw7CisJdTMyIHZfdG90YWwgPSBtb2RlLT52dG90YWw7CisJdTMy IGhzX2VuZCA9IG1vZGUtPmhzeW5jX2VuZCAtIG1vZGUtPmhzeW5jX3N0YXJ0OworCXUzMiB2c19l bmQgPSBtb2RlLT52c3luY19lbmQgLSBtb2RlLT52c3luY19zdGFydDsKKwl1MzIgaGFfc3RhcnQg PSBoX3RvdGFsIC0gbW9kZS0+aHN5bmNfc3RhcnQ7CisJdTMyIGhhX2VuZCA9IGhhX3N0YXJ0ICsg bW9kZS0+aGRpc3BsYXk7CisJdTMyIHZhX3N0YXJ0ID0gdl90b3RhbCAtIG1vZGUtPnZzeW5jX3N0 YXJ0OworCXUzMiB2YV9lbmQgPSB2YV9zdGFydCArIG1vZGUtPnZkaXNwbGF5OworCXUzMiB3YzsK KworCURCRygiIik7CisKKwlpZiAobXNtX2hvc3QtPm1vZGVfZmxhZ3MgJiBNSVBJX0RTSV9NT0RF X1ZJREVPKSB7CisJCWRzaV93cml0ZShtc21faG9zdCwgUkVHX0RTSV9BQ1RJVkVfSCwKKwkJCURT SV9BQ1RJVkVfSF9TVEFSVChoYV9zdGFydCkgfAorCQkJRFNJX0FDVElWRV9IX0VORChoYV9lbmQp KTsKKwkJZHNpX3dyaXRlKG1zbV9ob3N0LCBSRUdfRFNJX0FDVElWRV9WLAorCQkJRFNJX0FDVElW RV9WX1NUQVJUKHZhX3N0YXJ0KSB8CisJCQlEU0lfQUNUSVZFX1ZfRU5EKHZhX2VuZCkpOworCQlk c2lfd3JpdGUobXNtX2hvc3QsIFJFR19EU0lfVE9UQUwsCisJCQlEU0lfVE9UQUxfSF9UT1RBTCho X3RvdGFsIC0gMSkgfAorCQkJRFNJX1RPVEFMX1ZfVE9UQUwodl90b3RhbCAtIDEpKTsKKworCQlk c2lfd3JpdGUobXNtX2hvc3QsIFJFR19EU0lfQUNUSVZFX0hTWU5DLAorCQkJRFNJX0FDVElWRV9I U1lOQ19TVEFSVChoc19zdGFydCkgfAorCQkJRFNJX0FDVElWRV9IU1lOQ19FTkQoaHNfZW5kKSk7 CisJCWRzaV93cml0ZShtc21faG9zdCwgUkVHX0RTSV9BQ1RJVkVfVlNZTkNfSFBPUywgMCk7CisJ CWRzaV93cml0ZShtc21faG9zdCwgUkVHX0RTSV9BQ1RJVkVfVlNZTkNfVlBPUywKKwkJCURTSV9B Q1RJVkVfVlNZTkNfVlBPU19TVEFSVCh2c19zdGFydCkgfAorCQkJRFNJX0FDVElWRV9WU1lOQ19W UE9TX0VORCh2c19lbmQpKTsKKwl9IGVsc2UgewkJLyogY29tbWFuZCBtb2RlICovCisJCS8qIGlt YWdlIGRhdGEgYW5kIDEgYnl0ZSB3cml0ZV9tZW1vcnlfc3RhcnQgY21kICovCisJCXdjID0gbW9k ZS0+aGRpc3BsYXkgKiBkc2lfZ2V0X2JwcChtc21faG9zdC0+Zm9ybWF0KSAvIDggKyAxOworCisJ CWRzaV93cml0ZShtc21faG9zdCwgUkVHX0RTSV9DTURfTURQX1NUUkVBTV9DVFJMLAorCQkJRFNJ X0NNRF9NRFBfU1RSRUFNX0NUUkxfV09SRF9DT1VOVCh3YykgfAorCQkJRFNJX0NNRF9NRFBfU1RS RUFNX0NUUkxfVklSVFVBTF9DSEFOTkVMKAorCQkJCQltc21faG9zdC0+Y2hhbm5lbCkgfAorCQkJ RFNJX0NNRF9NRFBfU1RSRUFNX0NUUkxfREFUQV9UWVBFKAorCQkJCQlNSVBJX0RTSV9EQ1NfTE9O R19XUklURSkpOworCisJCWRzaV93cml0ZShtc21faG9zdCwgUkVHX0RTSV9DTURfTURQX1NUUkVB TV9UT1RBTCwKKwkJCURTSV9DTURfTURQX1NUUkVBTV9UT1RBTF9IX1RPVEFMKG1vZGUtPmhkaXNw bGF5KSB8CisJCQlEU0lfQ01EX01EUF9TVFJFQU1fVE9UQUxfVl9UT1RBTChtb2RlLT52ZGlzcGxh eSkpOworCX0KK30KKworc3RhdGljIHZvaWQgZHNpX3N3X3Jlc2V0KHN0cnVjdCBtc21fZHNpX2hv c3QgKm1zbV9ob3N0KQoreworCWRzaV93cml0ZShtc21faG9zdCwgUkVHX0RTSV9DTEtfQ1RSTCwK KwkJRFNJX0NMS19DVFJMX0FIQlNfSENMS19PTiB8IERTSV9DTEtfQ1RSTF9BSEJNX1NDTEtfT04g fAorCQlEU0lfQ0xLX0NUUkxfUENMS19PTiB8IERTSV9DTEtfQ1RSTF9EU0lDTEtfT04gfAorCQlE U0lfQ0xLX0NUUkxfQllURUNMS19PTiB8IERTSV9DTEtfQ1RSTF9FU0NDTEtfT04gfAorCQlEU0lf Q0xLX0NUUkxfRk9SQ0VfT05fRFlOX0FIQk1fSENMSyk7CisJd21iKCk7IC8qIGNsb2NrcyBuZWVk IHRvIGJlIGVuYWJsZWQgYmVmb3JlIHJlc2V0ICovCisKKwlkc2lfd3JpdGUobXNtX2hvc3QsIFJF R19EU0lfUkVTRVQsIDEpOworCXdtYigpOyAvKiBtYWtlIHN1cmUgcmVzZXQgaGFwcGVuICovCisJ ZHNpX3dyaXRlKG1zbV9ob3N0LCBSRUdfRFNJX1JFU0VULCAwKTsKK30KKworc3RhdGljIHZvaWQg ZHNpX29wX21vZGVfY29uZmlnKHN0cnVjdCBtc21fZHNpX2hvc3QgKm1zbV9ob3N0LAorCQkJCQli b29sIHZpZGVvX21vZGUsIGJvb2wgZW5hYmxlKQoreworCXUzMiBkc2lfY3RybDsKKworCWRzaV9j dHJsID0gZHNpX3JlYWQobXNtX2hvc3QsIFJFR19EU0lfQ1RSTCk7CisKKwlpZiAoIWVuYWJsZSkg eworCQlkc2lfY3RybCAmPSB+KERTSV9DVFJMX0VOQUJMRSB8IERTSV9DVFJMX1ZJRF9NT0RFX0VO IHwKKwkJCQlEU0lfQ1RSTF9DTURfTU9ERV9FTik7CisJCWRzaV9pbnRyX2N0cmwobXNtX2hvc3Qs IERTSV9JUlFfTUFTS19DTURfTURQX0RPTkUgfAorCQkJCQlEU0lfSVJRX01BU0tfVklERU9fRE9O RSwgMCk7CisJfSBlbHNlIHsKKwkJaWYgKHZpZGVvX21vZGUpIHsKKwkJCWRzaV9jdHJsIHw9IERT SV9DVFJMX1ZJRF9NT0RFX0VOOworCQl9IGVsc2UgewkJLyogY29tbWFuZCBtb2RlICovCisJCQlk c2lfY3RybCB8PSBEU0lfQ1RSTF9DTURfTU9ERV9FTjsKKwkJCWRzaV9pbnRyX2N0cmwobXNtX2hv c3QsIERTSV9JUlFfTUFTS19DTURfTURQX0RPTkUsIDEpOworCQl9CisJCWRzaV9jdHJsIHw9IERT SV9DVFJMX0VOQUJMRTsKKwl9CisKKwlkc2lfd3JpdGUobXNtX2hvc3QsIFJFR19EU0lfQ1RSTCwg ZHNpX2N0cmwpOworfQorCitzdGF0aWMgdm9pZCBkc2lfc2V0X3R4X3Bvd2VyX21vZGUoaW50IG1v ZGUsIHN0cnVjdCBtc21fZHNpX2hvc3QgKm1zbV9ob3N0KQoreworCXUzMiBkYXRhOworCisJZGF0 YSA9IGRzaV9yZWFkKG1zbV9ob3N0LCBSRUdfRFNJX0NNRF9ETUFfQ1RSTCk7CisKKwlpZiAobW9k ZSA9PSAwKQorCQlkYXRhICY9IH5EU0lfQ01EX0RNQV9DVFJMX0xPV19QT1dFUjsKKwllbHNlCisJ CWRhdGEgfD0gRFNJX0NNRF9ETUFfQ1RSTF9MT1dfUE9XRVI7CisKKwlkc2lfd3JpdGUobXNtX2hv c3QsIFJFR19EU0lfQ01EX0RNQV9DVFJMLCBkYXRhKTsKK30KKworc3RhdGljIHZvaWQgZHNpX3dh aXQ0dmlkZW9fZG9uZShzdHJ1Y3QgbXNtX2RzaV9ob3N0ICptc21faG9zdCkKK3sKKwlkc2lfaW50 cl9jdHJsKG1zbV9ob3N0LCBEU0lfSVJRX01BU0tfVklERU9fRE9ORSwgMSk7CisKKwlyZWluaXRf Y29tcGxldGlvbigmbXNtX2hvc3QtPnZpZGVvX2NvbXApOworCisJd2FpdF9mb3JfY29tcGxldGlv bl90aW1lb3V0KCZtc21faG9zdC0+dmlkZW9fY29tcCwKKwkJCW1zZWNzX3RvX2ppZmZpZXMoNzAp KTsKKworCWRzaV9pbnRyX2N0cmwobXNtX2hvc3QsIERTSV9JUlFfTUFTS19WSURFT19ET05FLCAw KTsKK30KKworc3RhdGljIHZvaWQgZHNpX3dhaXQ0dmlkZW9fZW5nX2J1c3koc3RydWN0IG1zbV9k c2lfaG9zdCAqbXNtX2hvc3QpCit7CisJaWYgKCEobXNtX2hvc3QtPm1vZGVfZmxhZ3MgJiBNSVBJ X0RTSV9NT0RFX1ZJREVPKSkKKwkJcmV0dXJuOworCisJaWYgKG1zbV9ob3N0LT5wb3dlcl9vbikg eworCQlkc2lfd2FpdDR2aWRlb19kb25lKG1zbV9ob3N0KTsKKwkJLyogZGVsYXkgNCBtcyB0byBz a2lwIEJMTFAgKi8KKwkJdXNsZWVwX3JhbmdlKDIwMDAsIDQwMDApOworCX0KK30KKworLyogZHNp X2NtZCAqLworc3RhdGljIGludCBkc2lfdHhfYnVmX2FsbG9jKHN0cnVjdCBtc21fZHNpX2hvc3Qg Km1zbV9ob3N0LCBpbnQgc2l6ZSkKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gbXNtX2hv c3QtPmRldjsKKwlpbnQgcmV0OworCXUzMiBpb3ZhOworCisJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1 Y3RfbXV0ZXgpOworCW1zbV9ob3N0LT50eF9nZW1fb2JqID0gbXNtX2dlbV9uZXcoZGV2LCBzaXpl LCBNU01fQk9fVU5DQUNIRUQpOworCWlmIChJU19FUlIobXNtX2hvc3QtPnR4X2dlbV9vYmopKSB7 CisJCXJldCA9IFBUUl9FUlIobXNtX2hvc3QtPnR4X2dlbV9vYmopOworCQlwcl9lcnIoIiVzOiBm YWlsZWQgdG8gYWxsb2NhdGUgZ2VtLCAlZFxuIiwgX19mdW5jX18sIHJldCk7CisJCW1zbV9ob3N0 LT50eF9nZW1fb2JqID0gTlVMTDsKKwkJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7 CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gbXNtX2dlbV9nZXRfaW92YV9sb2NrZWQobXNt X2hvc3QtPnR4X2dlbV9vYmosIDAsICZpb3ZhKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiJXM6 IGZhaWxlZCB0byBnZXQgaW92YSwgJWRcbiIsIF9fZnVuY19fLCByZXQpOworCQlyZXR1cm4gcmV0 OworCX0KKwltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKKworCWlmIChpb3ZhICYg MHgwNykgeworCQlwcl9lcnIoIiVzOiBidWYgTk9UIDggYnl0ZXMgYWxpZ25lZFxuIiwgX19mdW5j X18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZv aWQgZHNpX3R4X2J1Zl9mcmVlKHN0cnVjdCBtc21fZHNpX2hvc3QgKm1zbV9ob3N0KQoreworCXN0 cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBtc21faG9zdC0+ZGV2OworCisJaWYgKG1zbV9ob3N0LT50 eF9nZW1fb2JqKSB7CisJCW1zbV9nZW1fcHV0X2lvdmEobXNtX2hvc3QtPnR4X2dlbV9vYmosIDAp OworCQltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisJCW1zbV9nZW1fZnJlZV9vYmpl Y3QobXNtX2hvc3QtPnR4X2dlbV9vYmopOworCQltc21faG9zdC0+dHhfZ2VtX29iaiA9IE5VTEw7 CisJCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCX0KK30KKworLyoKKyAqIHBy ZXBhcmUgY21kIGJ1ZmZlciB0byBiZSB0eGVkCisgKi8KK3N0YXRpYyBpbnQgZHNpX2NtZF9kbWFf YWRkKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqdHhfZ2VtLAorCQkJY29uc3Qgc3RydWN0IG1pcGlf ZHNpX21zZyAqbXNnKQoreworCXN0cnVjdCBtaXBpX2RzaV9wYWNrZXQgcGFja2V0OworCWludCBs ZW47CisJaW50IHJldCA9IDA7CisJdTggKmRhdGE7CisKKwlyZXQgPSBtaXBpX2RzaV9jcmVhdGVf cGFja2V0KCZwYWNrZXQsIG1zZyk7CisJaWYgKHJldCkgeworCQlwcl9lcnIoIiVzOiBjcmVhdGUg cGFja2V0IGZhaWxlZCwgJWRcbiIsIF9fZnVuY19fLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0K KwlsZW4gPSAocGFja2V0LnNpemUgKyAzKSAmICh+MHgzKTsKKworCWlmIChsZW4gPiB0eF9nZW0t PnNpemUpIHsKKwkJcHJfZXJyKCIlczogcGFja2V0IHNpemUgaXMgdG9vIGJpZ1xuIiwgX19mdW5j X18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkYXRhID0gbXNtX2dlbV92YWRkcih0eF9n ZW0pOworCisJaWYgKElTX0VSUihkYXRhKSkgeworCQlyZXQgPSBQVFJfRVJSKGRhdGEpOworCQlw cl9lcnIoIiVzOiBnZXQgdmFkZHIgZmFpbGVkLCAlZFxuIiwgX19mdW5jX18sIHJldCk7CisJCXJl dHVybiByZXQ7CisJfQorCisJLyogTVNNIHNwZWNpZmljIGNvbW1hbmQgZm9ybWF0IGluIG1lbW9y eSAqLworCWRhdGFbMF0gPSBwYWNrZXQuaGVhZGVyWzFdOworCWRhdGFbMV0gPSBwYWNrZXQuaGVh ZGVyWzJdOworCWRhdGFbMl0gPSBwYWNrZXQuaGVhZGVyWzBdOworCWRhdGFbM10gPSBCSVQoNyk7 IC8qIExhc3QgcGFja2V0ICovCisJaWYgKG1pcGlfZHNpX3BhY2tldF9mb3JtYXRfaXNfbG9uZyht c2ctPnR5cGUpKQorCQlkYXRhWzNdIHw9IEJJVCg2KTsKKwlpZiAobXNnLT5yeF9idWYgJiYgbXNn LT5yeF9sZW4pCisJCWRhdGFbM10gfD0gQklUKDUpOworCisJLyogTG9uZyBwYWNrZXQgKi8KKwlp ZiAocGFja2V0LnBheWxvYWQgJiYgcGFja2V0LnBheWxvYWRfbGVuZ3RoKQorCQltZW1jcHkoZGF0 YSArIDQsIHBhY2tldC5wYXlsb2FkLCBwYWNrZXQucGF5bG9hZF9sZW5ndGgpOworCisJLyogQXBw ZW5kIDB4ZmYgdG8gdGhlIGVuZCAqLworCWlmIChwYWNrZXQuc2l6ZSA8IGxlbikKKwkJbWVtc2V0 KGRhdGEgKyBwYWNrZXQuc2l6ZSwgMHhmZiwgbGVuIC0gcGFja2V0LnNpemUpOworCisJcmV0dXJu IGxlbjsKK30KKworLyoKKyAqIGRzaV9zaG9ydF9yZWFkMV9yZXNwOiAxIHBhcmFtZXRlcgorICov CitzdGF0aWMgaW50IGRzaV9zaG9ydF9yZWFkMV9yZXNwKHU4ICpidWYsIGNvbnN0IHN0cnVjdCBt aXBpX2RzaV9tc2cgKm1zZykKK3sKKwl1OCAqZGF0YSA9IG1zZy0+cnhfYnVmOworCWlmIChkYXRh ICYmIChtc2ctPnJ4X2xlbiA+PSAxKSkgeworCQkqZGF0YSA9IGJ1ZlsxXTsgLyogc3RyaXAgb3V0 IGRjcyB0eXBlICovCisJCXJldHVybiAxOworCX0gZWxzZSB7CisJCXByX2VycigiJXM6IHJlYWQg ZGF0YSBkb2VzIG5vdCBtYXRjaCB3aXRoIHJ4X2J1ZiBsZW4gJWRcbiIsCisJCQlfX2Z1bmNfXywg bXNnLT5yeF9sZW4pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisKKy8qCisgKiBkc2lfc2hv cnRfcmVhZDJfcmVzcDogMiBwYXJhbWV0ZXIKKyAqLworc3RhdGljIGludCBkc2lfc2hvcnRfcmVh ZDJfcmVzcCh1OCAqYnVmLCBjb25zdCBzdHJ1Y3QgbWlwaV9kc2lfbXNnICptc2cpCit7CisJdTgg KmRhdGEgPSBtc2ctPnJ4X2J1ZjsKKwlpZiAoZGF0YSAmJiAobXNnLT5yeF9sZW4gPj0gMikpIHsK KwkJZGF0YVswXSA9IGJ1ZlsxXTsgLyogc3RyaXAgb3V0IGRjcyB0eXBlICovCisJCWRhdGFbMV0g PSBidWZbMl07CisJCXJldHVybiAyOworCX0gZWxzZSB7CisJCXByX2VycigiJXM6IHJlYWQgZGF0 YSBkb2VzIG5vdCBtYXRjaCB3aXRoIHJ4X2J1ZiBsZW4gJWRcbiIsCisJCQlfX2Z1bmNfXywgbXNn LT5yeF9sZW4pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZHNpX2xv bmdfcmVhZF9yZXNwKHU4ICpidWYsIGNvbnN0IHN0cnVjdCBtaXBpX2RzaV9tc2cgKm1zZykKK3sK KwkvKiBzdHJpcCBvdXQgNCBieXRlIGRjcyBoZWFkZXIgKi8KKwlpZiAobXNnLT5yeF9idWYgJiYg bXNnLT5yeF9sZW4pCisJCW1lbWNweShtc2ctPnJ4X2J1ZiwgYnVmICsgNCwgbXNnLT5yeF9sZW4p OworCisJcmV0dXJuIG1zZy0+cnhfbGVuOworfQorCisKK3N0YXRpYyBpbnQgZHNpX2NtZF9kbWFf dHgoc3RydWN0IG1zbV9kc2lfaG9zdCAqbXNtX2hvc3QsIGludCBsZW4pCit7CisJaW50IHJldCA9 IDA7CisJdTMyIGlvdmE7CisJYm9vbCB0cmlnZ2VyZWQ7CisKKwlyZXQgPSBtc21fZ2VtX2dldF9p b3ZhKG1zbV9ob3N0LT50eF9nZW1fb2JqLCAwLCAmaW92YSk7CisJaWYgKHJldCkgeworCQlwcl9l cnIoIiVzOiBmYWlsZWQgdG8gZ2V0IGlvdmE6ICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKKwkJcmV0 dXJuIHJldDsKKwl9CisKKwlyZWluaXRfY29tcGxldGlvbigmbXNtX2hvc3QtPmRtYV9jb21wKTsK KworCWRzaV93YWl0NHZpZGVvX2VuZ19idXN5KG1zbV9ob3N0KTsKKworCXRyaWdnZXJlZCA9IG1z bV9kc2lfbWFuYWdlcl9jbWRfeGZlcl90cmlnZ2VyKAorCQkJCQkJbXNtX2hvc3QtPmlkLCBpb3Zh LCBsZW4pOworCWlmICh0cmlnZ2VyZWQpIHsKKwkJcmV0ID0gd2FpdF9mb3JfY29tcGxldGlvbl90 aW1lb3V0KCZtc21faG9zdC0+ZG1hX2NvbXAsCisJCQkJCW1zZWNzX3RvX2ppZmZpZXMoMjAwKSk7 CisJCURCRygicmV0PSVkIiwgcmV0KTsKKwkJaWYgKHJldCA9PSAwKQorCQkJcmV0ID0gLUVUSU1F RE9VVDsKKwkJZWxzZQorCQkJcmV0ID0gbGVuOworCX0gZWxzZQorCQlyZXQgPSBsZW47CisKKwly ZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGRzaV9jbWRfZG1hX3J4KHN0cnVjdCBtc21fZHNp X2hvc3QgKm1zbV9ob3N0LAorCQkJdTggKmJ1ZiwgaW50IHJ4X2J5dGUsIGludCBwa3Rfc2l6ZSkK K3sKKwl1MzIgKmxwLCAqdGVtcCwgZGF0YTsKKwlpbnQgaSwgaiA9IDAsIGNudDsKKwlib29sIGFj a19lcnJvciA9IGZhbHNlOworCXUzMiByZWFkX2NudDsKKwl1OCByZWdbMTZdOworCWludCByZXBl YXRlZF9ieXRlcyA9IDA7CisJaW50IGJ1Zl9vZmZzZXQgPSBidWYgLSBtc21faG9zdC0+cnhfYnVm OworCisJbHAgPSAodTMyICopYnVmOworCXRlbXAgPSAodTMyICopcmVnOworCWNudCA9IChyeF9i eXRlICsgMykgPj4gMjsKKwlpZiAoY250ID4gNCkKKwkJY250ID0gNDsgLyogNCB4IDMyIGJpdHMg cmVnaXN0ZXJzIG9ubHkgKi8KKworCS8qIENhbGN1bGF0ZSByZWFsIHJlYWQgZGF0YSBjb3VudCAq LworCXJlYWRfY250ID0gZHNpX3JlYWQobXNtX2hvc3QsIDB4MWQ0KSA+PiAxNjsKKworCWFja19l cnJvciA9IChyeF9ieXRlID09IDQpID8KKwkJKHJlYWRfY250ID09IDgpIDogLyogc2hvcnQgcGt0 ICsgNC1ieXRlIGVycm9yIHBrdCAqLworCQkocmVhZF9jbnQgPT0gKHBrdF9zaXplICsgNiArIDQp KTsgLyogbG9uZyBwa3QrNC1ieXRlIGVycm9yIHBrdCovCisKKwlpZiAoYWNrX2Vycm9yKQorCQly ZWFkX2NudCAtPSA0OyAvKiBSZW1vdmUgNCBieXRlIGVycm9yIHBrdCAqLworCisJLyoKKwkgKiBJ biBjYXNlIG9mIG11bHRpcGxlIHJlYWRzIGZyb20gdGhlIHBhbmVsLCBhZnRlciB0aGUgZmlyc3Qg cmVhZCwgdGhlcmUKKwkgKiBpcyBwb3NzaWJpbGl0eSB0aGF0IHRoZXJlIGFyZSBzb21lIGJ5dGVz IGluIHRoZSBwYXlsb2FkIHJlcGVhdGluZyBpbgorCSAqIHRoZSBSREJLX0RBVEEgcmVnaXN0ZXJz LiBTaW5jZSB3ZSByZWFkIGFsbCB0aGUgcGFyYW1ldGVycyBmcm9tIHRoZQorCSAqIHBhbmVsIHJp Z2h0IGZyb20gdGhlIGZpcnN0IGJ5dGUgZm9yIGV2ZXJ5IHBhc3MuIFdlIG5lZWQgdG8gc2tpcCB0 aGUKKwkgKiByZXBlYXRpbmcgYnl0ZXMgYW5kIHRoZW4gYXBwZW5kIHRoZSBuZXcgcGFyYW1ldGVy cyB0byB0aGUgcnggYnVmZmVyLgorCSAqLworCWlmIChyZWFkX2NudCA+IDE2KSB7CisJCWludCBi eXRlc19zaGlmdGVkOworCQkvKiBBbnkgZGF0YSBtb3JlIHRoYW4gMTYgYnl0ZXMgd2lsbCBiZSBz aGlmdGVkIG91dC4KKwkJICogVGhlIHRlbXAgcmVhZCBidWZmZXIgc2hvdWxkIGFscmVhZHkgY29u dGFpbiB0aGVzZSBieXRlcy4KKwkJICogVGhlIHJlbWFpbmluZyBieXRlcyBpbiByZWFkIGJ1ZmZl ciBhcmUgdGhlIHJlcGVhdGVkIGJ5dGVzLgorCQkgKi8KKwkJYnl0ZXNfc2hpZnRlZCA9IHJlYWRf Y250IC0gMTY7CisJCXJlcGVhdGVkX2J5dGVzID0gYnVmX29mZnNldCAtIGJ5dGVzX3NoaWZ0ZWQ7 CisJfQorCisJZm9yIChpID0gY250IC0gMTsgaSA+PSAwOyBpLS0pIHsKKwkJZGF0YSA9IGRzaV9y ZWFkKG1zbV9ob3N0LCBSRUdfRFNJX1JEQktfREFUQShpKSk7CisJCSp0ZW1wKysgPSBudG9obChk YXRhKTsgLyogdG8gaG9zdCBieXRlIG9yZGVyICovCisJCURCRygiZGF0YSA9IDB4JXggYW5kIG50 b2hsKGRhdGEpID0gMHgleFxuIiwgZGF0YSwgbnRvaGwoZGF0YSkpOworCX0KKworCWZvciAoaSA9 IHJlcGVhdGVkX2J5dGVzOyBpIDwgMTY7IGkrKykKKwkJYnVmW2orK10gPSByZWdbaV07CisKKwly ZXR1cm4gajsKK30KKworc3RhdGljIGludCBkc2lfY21kczJidWZfdHgoc3RydWN0IG1zbV9kc2lf aG9zdCAqbXNtX2hvc3QsCisJCQkJY29uc3Qgc3RydWN0IG1pcGlfZHNpX21zZyAqbXNnKQorewor CWludCBsZW4sIHJldDsKKwlpbnQgYmxscF9sZW4gPSBtc21faG9zdC0+bW9kZS0+aGRpc3BsYXkg KgorCQkJZHNpX2dldF9icHAobXNtX2hvc3QtPmZvcm1hdCkgLyA4OworCisJbGVuID0gZHNpX2Nt ZF9kbWFfYWRkKG1zbV9ob3N0LT50eF9nZW1fb2JqLCBtc2cpOworCWlmICghbGVuKSB7CisJCXBy X2VycigiJXM6IGZhaWxlZCB0byBhZGQgY21kIHR5cGUgPSAweCV4XG4iLAorCQkJX19mdW5jX18s ICBtc2ctPnR5cGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBmb3IgdmlkZW8gbW9k ZSwgZG8gbm90IHNlbmQgY21kcyBtb3JlIHRoYW4KKwkqIG9uZSBwaXhlbCBsaW5lLCBzaW5jZSBp dCBvbmx5IHRyYW5zbWl0IGl0CisJKiBkdXJpbmcgQkxMUC4KKwkqLworCS8qIFRPRE86IGlmIHRo ZSBjb21tYW5kIGlzIHNlbnQgaW4gTFAgbW9kZSwgdGhlIGJpdCByYXRlIGlzIG9ubHkKKwkgKiBo YWxmIG9mIGVzYyBjbGsgcmF0ZS4gSW4gdGhpcyBjYXNlLCBpZiB0aGUgdmlkZW8gaXMgYWxyZWFk eQorCSAqIGFjdGl2ZWx5IHN0cmVhbWluZywgd2UgbmVlZCB0byBjaGVjayBtb3JlIGNhcmVmdWxs eSBpZiB0aGUKKwkgKiBjb21tYW5kIGNhbiBiZSBmaXQgaW50byBvbmUgQkxMUC4KKwkgKi8KKwlp ZiAoKG1zbV9ob3N0LT5tb2RlX2ZsYWdzICYgTUlQSV9EU0lfTU9ERV9WSURFTykgJiYgKGxlbiA+ IGJsbHBfbGVuKSkgeworCQlwcl9lcnIoIiVzOiBjbWQgY2Fubm90IGZpdCBpbnRvIEJMTFAgcGVy aW9kLCBsZW49JWRcbiIsCisJCQlfX2Z1bmNfXywgbGVuKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJ fQorCisJcmV0ID0gZHNpX2NtZF9kbWFfdHgobXNtX2hvc3QsIGxlbik7CisJaWYgKHJldCA8IGxl bikgeworCQlwcl9lcnIoIiVzOiBjbWQgZG1hIHR4IGZhaWxlZCwgdHlwZT0weCV4LCBkYXRhMD0w eCV4LCBsZW49JWRcbiIsCisJCQlfX2Z1bmNfXywgbXNnLT50eXBlLCAoKih1OCAqKShtc2ctPnR4 X2J1ZikpLCBsZW4pOworCQlyZXR1cm4gLUVDT01NOworCX0KKworCXJldHVybiBsZW47Cit9CisK K3N0YXRpYyB2b2lkIGRzaV9zd19yZXNldF9yZXN0b3JlKHN0cnVjdCBtc21fZHNpX2hvc3QgKm1z bV9ob3N0KQoreworCXUzMiBkYXRhMCwgZGF0YTE7CisKKwlkYXRhMCA9IGRzaV9yZWFkKG1zbV9o b3N0LCBSRUdfRFNJX0NUUkwpOworCWRhdGExID0gZGF0YTA7CisJZGF0YTEgJj0gfkRTSV9DVFJM X0VOQUJMRTsKKwlkc2lfd3JpdGUobXNtX2hvc3QsIFJFR19EU0lfQ1RSTCwgZGF0YTEpOworCS8q CisJICogZHNpIGNvbnRyb2xsZXIgbmVlZCB0byBiZSBkaXNhYmxlZCBiZWZvcmUKKwkgKiBjbG9j a3MgdHVybmVkIG9uCisJICovCisJd21iKCk7CisKKwlkc2lfd3JpdGUobXNtX2hvc3QsIFJFR19E U0lfQ0xLX0NUUkwsCisJCURTSV9DTEtfQ1RSTF9BSEJTX0hDTEtfT04gfCBEU0lfQ0xLX0NUUkxf QUhCTV9TQ0xLX09OIHwKKwkJRFNJX0NMS19DVFJMX1BDTEtfT04gfCBEU0lfQ0xLX0NUUkxfRFNJ Q0xLX09OIHwKKwkJRFNJX0NMS19DVFJMX0JZVEVDTEtfT04gfCBEU0lfQ0xLX0NUUkxfRVNDQ0xL X09OIHwKKwkJRFNJX0NMS19DVFJMX0ZPUkNFX09OX0RZTl9BSEJNX0hDTEspOworCXdtYigpOwkv KiBtYWtlIHN1cmUgY2xvY2tzIGVuYWJsZWQgKi8KKworCS8qIGRzaSBjb250cm9sbGVyIGNhbiBv bmx5IGJlIHJlc2V0IHdoaWxlIGNsb2NrcyBhcmUgcnVubmluZyAqLworCWRzaV93cml0ZShtc21f aG9zdCwgUkVHX0RTSV9SRVNFVCwgMSk7CisJd21iKCk7CS8qIG1ha2Ugc3VyZSByZXNldCBoYXBw ZW4gKi8KKwlkc2lfd3JpdGUobXNtX2hvc3QsIFJFR19EU0lfUkVTRVQsIDApOworCXdtYigpOwkv KiBjb250cm9sbGVyIG91dCBvZiByZXNldCAqLworCWRzaV93cml0ZShtc21faG9zdCwgUkVHX0RT SV9DVFJMLCBkYXRhMCk7CisJd21iKCk7CS8qIG1ha2Ugc3VyZSBkc2kgY29udHJvbGxlciBlbmFi bGVkIGFnYWluICovCit9CisKK3N0YXRpYyB2b2lkIGRzaV9lcnJfd29ya2VyKHN0cnVjdCB3b3Jr X3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgbXNtX2RzaV9ob3N0ICptc21faG9zdCA9CisJCWNv bnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgbXNtX2RzaV9ob3N0LCBlcnJfd29yayk7CisJdTMyIHN0 YXR1cyA9IG1zbV9ob3N0LT5lcnJfd29ya19zdGF0ZTsKKworCXByX2VycigiJXM6IHN0YXR1cz0l eFxuIiwgX19mdW5jX18sIHN0YXR1cyk7CisJaWYgKHN0YXR1cyAmIERTSV9FUlJfU1RBVEVfTURQ X0ZJRk9fVU5ERVJGTE9XKQorCQlkc2lfc3dfcmVzZXRfcmVzdG9yZShtc21faG9zdCk7CisKKwkv KiBJdCBpcyBzYWZlIHRvIGNsZWFyIGhlcmUgYmVjYXVzZSBlcnJvciBpcnEgaXMgZGlzYWJsZWQu ICovCisJbXNtX2hvc3QtPmVycl93b3JrX3N0YXRlID0gMDsKKworCS8qIGVuYWJsZSBkc2kgZXJy b3IgaW50ZXJydXB0ICovCisJZHNpX2ludHJfY3RybChtc21faG9zdCwgRFNJX0lSUV9NQVNLX0VS Uk9SLCAxKTsKK30KKworc3RhdGljIHZvaWQgZHNpX2Fja19lcnJfc3RhdHVzKHN0cnVjdCBtc21f ZHNpX2hvc3QgKm1zbV9ob3N0KQoreworCXUzMiBzdGF0dXM7CisKKwlzdGF0dXMgPSBkc2lfcmVh ZChtc21faG9zdCwgUkVHX0RTSV9BQ0tfRVJSX1NUQVRVUyk7CisKKwlpZiAoc3RhdHVzKSB7CisJ CWRzaV93cml0ZShtc21faG9zdCwgUkVHX0RTSV9BQ0tfRVJSX1NUQVRVUywgc3RhdHVzKTsKKwkJ LyogV3JpdGluZyBvZiBhbiBleHRyYSAwIG5lZWRlZCB0byBjbGVhciBlcnJvciBiaXRzICovCisJ CWRzaV93cml0ZShtc21faG9zdCwgUkVHX0RTSV9BQ0tfRVJSX1NUQVRVUywgMCk7CisJCW1zbV9o b3N0LT5lcnJfd29ya19zdGF0ZSB8PSBEU0lfRVJSX1NUQVRFX0FDSzsKKwl9Cit9CisKK3N0YXRp YyB2b2lkIGRzaV90aW1lb3V0X3N0YXR1cyhzdHJ1Y3QgbXNtX2RzaV9ob3N0ICptc21faG9zdCkK K3sKKwl1MzIgc3RhdHVzOworCisJc3RhdHVzID0gZHNpX3JlYWQobXNtX2hvc3QsIFJFR19EU0lf VElNRU9VVF9TVEFUVVMpOworCisJaWYgKHN0YXR1cykgeworCQlkc2lfd3JpdGUobXNtX2hvc3Qs IFJFR19EU0lfVElNRU9VVF9TVEFUVVMsIHN0YXR1cyk7CisJCW1zbV9ob3N0LT5lcnJfd29ya19z dGF0ZSB8PSBEU0lfRVJSX1NUQVRFX1RJTUVPVVQ7CisJfQorfQorCitzdGF0aWMgdm9pZCBkc2lf ZGxuMF9waHlfZXJyKHN0cnVjdCBtc21fZHNpX2hvc3QgKm1zbV9ob3N0KQoreworCXUzMiBzdGF0 dXM7CisKKwlzdGF0dXMgPSBkc2lfcmVhZChtc21faG9zdCwgUkVHX0RTSV9ETE4wX1BIWV9FUlIp OworCisJaWYgKHN0YXR1cykgeworCQlkc2lfd3JpdGUobXNtX2hvc3QsIFJFR19EU0lfRExOMF9Q SFlfRVJSLCBzdGF0dXMpOworCQltc21faG9zdC0+ZXJyX3dvcmtfc3RhdGUgfD0gRFNJX0VSUl9T VEFURV9ETE4wX1BIWTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGRzaV9maWZvX3N0YXR1cyhzdHJ1 Y3QgbXNtX2RzaV9ob3N0ICptc21faG9zdCkKK3sKKwl1MzIgc3RhdHVzOworCisJc3RhdHVzID0g ZHNpX3JlYWQobXNtX2hvc3QsIFJFR19EU0lfRklGT19TVEFUVVMpOworCisJLyogZmlmbyB1bmRl cmZsb3csIG92ZXJmbG93ICovCisJaWYgKHN0YXR1cykgeworCQlkc2lfd3JpdGUobXNtX2hvc3Qs IFJFR19EU0lfRklGT19TVEFUVVMsIHN0YXR1cyk7CisJCW1zbV9ob3N0LT5lcnJfd29ya19zdGF0 ZSB8PSBEU0lfRVJSX1NUQVRFX0ZJRk87CisJCWlmIChzdGF0dXMgJiBEU0lfRklGT19TVEFUVVNf Q01EX01EUF9GSUZPX1VOREVSRkxPVykKKwkJCW1zbV9ob3N0LT5lcnJfd29ya19zdGF0ZSB8PQor CQkJCQlEU0lfRVJSX1NUQVRFX01EUF9GSUZPX1VOREVSRkxPVzsKKwl9Cit9CisKK3N0YXRpYyB2 b2lkIGRzaV9zdGF0dXMoc3RydWN0IG1zbV9kc2lfaG9zdCAqbXNtX2hvc3QpCit7CisJdTMyIHN0 YXR1czsKKworCXN0YXR1cyA9IGRzaV9yZWFkKG1zbV9ob3N0LCBSRUdfRFNJX1NUQVRVUzApOwor CisJaWYgKHN0YXR1cyAmIERTSV9TVEFUVVMwX0lOVEVSTEVBVkVfT1BfQ09OVEVOVElPTikgewor CQlkc2lfd3JpdGUobXNtX2hvc3QsIFJFR19EU0lfU1RBVFVTMCwgc3RhdHVzKTsKKwkJbXNtX2hv c3QtPmVycl93b3JrX3N0YXRlIHw9CisJCQlEU0lfRVJSX1NUQVRFX0lOVEVSTEVBVkVfT1BfQ09O VEVOVElPTjsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGRzaV9jbGtfc3RhdHVzKHN0cnVjdCBtc21f ZHNpX2hvc3QgKm1zbV9ob3N0KQoreworCXUzMiBzdGF0dXM7CisKKwlzdGF0dXMgPSBkc2lfcmVh ZChtc21faG9zdCwgUkVHX0RTSV9DTEtfU1RBVFVTKTsKKworCWlmIChzdGF0dXMgJiBEU0lfQ0xL X1NUQVRVU19QTExfVU5MT0NLRUQpIHsKKwkJZHNpX3dyaXRlKG1zbV9ob3N0LCBSRUdfRFNJX0NM S19TVEFUVVMsIHN0YXR1cyk7CisJCW1zbV9ob3N0LT5lcnJfd29ya19zdGF0ZSB8PSBEU0lfRVJS X1NUQVRFX1BMTF9VTkxPQ0tFRDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGRzaV9lcnJvcihzdHJ1 Y3QgbXNtX2RzaV9ob3N0ICptc21faG9zdCkKK3sKKwkvKiBkaXNhYmxlIGRzaSBlcnJvciBpbnRl cnJ1cHQgKi8KKwlkc2lfaW50cl9jdHJsKG1zbV9ob3N0LCBEU0lfSVJRX01BU0tfRVJST1IsIDAp OworCisJZHNpX2Nsa19zdGF0dXMobXNtX2hvc3QpOworCWRzaV9maWZvX3N0YXR1cyhtc21faG9z dCk7CisJZHNpX2Fja19lcnJfc3RhdHVzKG1zbV9ob3N0KTsKKwlkc2lfdGltZW91dF9zdGF0dXMo bXNtX2hvc3QpOworCWRzaV9zdGF0dXMobXNtX2hvc3QpOworCWRzaV9kbG4wX3BoeV9lcnIobXNt X2hvc3QpOworCisJcXVldWVfd29yayhtc21faG9zdC0+d29ya3F1ZXVlLCAmbXNtX2hvc3QtPmVy cl93b3JrKTsKK30KKworc3RhdGljIGlycXJldHVybl90IGRzaV9ob3N0X2lycShpbnQgaXJxLCB2 b2lkICpwdHIpCit7CisJc3RydWN0IG1zbV9kc2lfaG9zdCAqbXNtX2hvc3QgPSBwdHI7CisJdTMy IGlzcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCFtc21faG9zdC0+Y3RybF9iYXNl KQorCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbXNtX2hvc3Qt PmludHJfbG9jaywgZmxhZ3MpOworCWlzciA9IGRzaV9yZWFkKG1zbV9ob3N0LCBSRUdfRFNJX0lO VFJfQ1RSTCk7CisJZHNpX3dyaXRlKG1zbV9ob3N0LCBSRUdfRFNJX0lOVFJfQ1RSTCwgaXNyKTsK KwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtc21faG9zdC0+aW50cl9sb2NrLCBmbGFncyk7CisK KwlEQkcoImlzcj0weCV4LCBpZD0lZFxuIiwgaXNyLCBtc21faG9zdC0+aWQpOworCisJaWYgKGlz ciAmIERTSV9JUlFfRVJST1IpCisJCWRzaV9lcnJvcihtc21faG9zdCk7CisKKwlpZiAoaXNyICYg RFNJX0lSUV9WSURFT19ET05FKQorCQljb21wbGV0ZSgmbXNtX2hvc3QtPnZpZGVvX2NvbXApOwor CisJaWYgKGlzciAmIERTSV9JUlFfQ01EX0RNQV9ET05FKQorCQljb21wbGV0ZSgmbXNtX2hvc3Qt PmRtYV9jb21wKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworaW50IGRzaV9ob3N0X2F0 dGFjaChzdHJ1Y3QgbWlwaV9kc2lfaG9zdCAqaG9zdCwKKwkJCQkJc3RydWN0IG1pcGlfZHNpX2Rl dmljZSAqZHNpKQoreworCXN0cnVjdCBtc21fZHNpX2hvc3QgKm1zbV9ob3N0ID0gdG9fbXNtX2Rz aV9ob3N0KGhvc3QpOworCisJbXNtX2hvc3QtPmNoYW5uZWwgPSBkc2ktPmNoYW5uZWw7CisJbXNt X2hvc3QtPmxhbmVzID0gZHNpLT5sYW5lczsKKwltc21faG9zdC0+Zm9ybWF0ID0gZHNpLT5mb3Jt YXQ7CisJbXNtX2hvc3QtPm1vZGVfZmxhZ3MgPSBkc2ktPm1vZGVfZmxhZ3M7CisKKwltc21faG9z dC0+cGFuZWxfbm9kZSA9IGRzaS0+ZGV2Lm9mX25vZGU7CisKKwlEQkcoImlkPSVkIiwgbXNtX2hv c3QtPmlkKTsKKwlpZiAobXNtX2hvc3QtPmRldikKKwkJZHJtX2hlbHBlcl9ocGRfaXJxX2V2ZW50 KG1zbV9ob3N0LT5kZXYpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBkc2lfaG9zdF9kZXRhY2go c3RydWN0IG1pcGlfZHNpX2hvc3QgKmhvc3QsCisJCQkJCXN0cnVjdCBtaXBpX2RzaV9kZXZpY2Ug KmRzaSkKK3sKKwlzdHJ1Y3QgbXNtX2RzaV9ob3N0ICptc21faG9zdCA9IHRvX21zbV9kc2lfaG9z dChob3N0KTsKKworCW1zbV9ob3N0LT5wYW5lbF9ub2RlID0gTlVMTDsKKworCURCRygiaWQ9JWQi LCBtc21faG9zdC0+aWQpOworCWlmIChtc21faG9zdC0+ZGV2KQorCQlkcm1faGVscGVyX2hwZF9p cnFfZXZlbnQobXNtX2hvc3QtPmRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3NpemVfdCBkc2lf aG9zdF90cmFuc2ZlcihzdHJ1Y3QgbWlwaV9kc2lfaG9zdCAqaG9zdCwKKwkJCQkJY29uc3Qgc3Ry dWN0IG1pcGlfZHNpX21zZyAqbXNnKQoreworCXN0cnVjdCBtc21fZHNpX2hvc3QgKm1zbV9ob3N0 ID0gdG9fbXNtX2RzaV9ob3N0KGhvc3QpOworCWludCByZXQgPSAtRUlOVkFMOworCisJaWYgKCFt c2cgfHwgIW1zbV9ob3N0LT5wb3dlcl9vbikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltdXRleF9s b2NrKCZtc21faG9zdC0+Y21kX211dGV4KTsKKwlyZXQgPSBtc21fZHNpX21hbmFnZXJfY21kX3hm ZXIobXNtX2hvc3QtPmlkLCBtc2cpOworCW11dGV4X3VubG9jaygmbXNtX2hvc3QtPmNtZF9tdXRl eCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IG1pcGlfZHNpX2hvc3Rfb3Bz IGRzaV9ob3N0X29wcyA9IHsKKwkuYXR0YWNoID0gZHNpX2hvc3RfYXR0YWNoLAorCS5kZXRhY2gg PSBkc2lfaG9zdF9kZXRhY2gsCisJLnRyYW5zZmVyID0gZHNpX2hvc3RfdHJhbnNmZXIsCit9Owor CitpbnQgbXNtX2RzaV9ob3N0X2luaXQoc3RydWN0IG1zbV9kc2kgKm1zbV9kc2kpCit7CisJc3Ry dWN0IG1zbV9kc2lfaG9zdCAqbXNtX2hvc3QgPSBOVUxMOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZp Y2UgKnBkZXYgPSBtc21fZHNpLT5wZGV2OworCWludCByZXQgPSAwOworCisJbXNtX2hvc3QgPSBk ZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCptc21faG9zdCksIEdGUF9LRVJORUwpOwor CWlmICghbXNtX2hvc3QpIHsKKwkJcHJfZXJyKCIlczogRkFJTEVEOiBjYW5ub3QgYWxsb2MgZHNp IGhvc3RcbiIsCisJCSAgICAgICBfX2Z1bmNfXyk7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8g ZmFpbDsKKwl9CisKKwlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihwZGV2LT5kZXYub2Zfbm9k ZSwKKwkJCQkiY2VsbC1pbmRleCIsICZtc21faG9zdC0+aWQpOworCWlmIChyZXQpIHsKKwkJZGV2 X2VycigmcGRldi0+ZGV2LAorCQkJIiVzOiBDZWxsLWluZGV4IG5vdCBzcGVjaWZpZWQsIHJldD0l ZFxuIiwKKwkJCV9fZnVuY19fLCByZXQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJbXNtX2hv c3QtPnBkZXYgPSBwZGV2OworCisJcmV0ID0gZHNpX2Nsa19pbml0KG1zbV9ob3N0KTsKKwlpZiAo cmV0KSB7CisJCXByX2VycigiJXM6IHVuYWJsZSB0byBpbml0aWFsaXplIGRzaSBjbGtzXG4iLCBf X2Z1bmNfXyk7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlyZXQgPSBkc2lfZ3Bpb19pbml0KG1zbV9o b3N0KTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiJXM6IHVuYWJsZSB0byBpbml0aWFsaXplIGRz aSBncGlvc1xuIiwgX19mdW5jX18pOworCQlnb3RvIGZhaWw7CisJfQorCisJbXNtX2hvc3QtPmN0 cmxfYmFzZSA9IG1zbV9pb3JlbWFwKHBkZXYsICJkc2lfY3RybCIsICJEU0kgQ1RSTCIpOworCWlm IChJU19FUlIobXNtX2hvc3QtPmN0cmxfYmFzZSkpIHsKKwkJcHJfZXJyKCIlczogdW5hYmxlIHRv IG1hcCBEc2kgY3RybCBiYXNlXG4iLCBfX2Z1bmNfXyk7CisJCXJldCA9IFBUUl9FUlIobXNtX2hv c3QtPmN0cmxfYmFzZSk7CisJCWdvdG8gZmFpbDsKKwl9CisKKwltc21faG9zdC0+Y2ZnID0gZHNp X2dldF9jb25maWcobXNtX2hvc3QpOworCWlmICghbXNtX2hvc3QtPmNmZykgeworCQlyZXQgPSAt RUlOVkFMOworCQlwcl9lcnIoIiVzOiBnZXQgY29uZmlnIGZhaWxlZFxuIiwgX19mdW5jX18pOwor CQlnb3RvIGZhaWw7CisJfQorCisJcmV0ID0gZHNpX3JlZ3VsYXRvcl9pbml0KG1zbV9ob3N0KTsK KwlpZiAocmV0KQorCQlnb3RvIGZhaWw7CisKKwltc21faG9zdC0+cnhfYnVmID0gZGV2bV9remFs bG9jKCZwZGV2LT5kZXYsIFNaXzRLLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW1zbV9ob3N0LT5yeF9i dWYpIHsKKwkJcHJfZXJyKCIlczogYWxsb2MgcnggdGVtcCBidWYgZmFpbGVkXG4iLCBfX2Z1bmNf Xyk7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlpbml0X2NvbXBsZXRpb24oJm1zbV9ob3N0LT5kbWFf Y29tcCk7CisJaW5pdF9jb21wbGV0aW9uKCZtc21faG9zdC0+dmlkZW9fY29tcCk7CisJbXV0ZXhf aW5pdCgmbXNtX2hvc3QtPmRldl9tdXRleCk7CisJbXV0ZXhfaW5pdCgmbXNtX2hvc3QtPmNtZF9t dXRleCk7CisJbXV0ZXhfaW5pdCgmbXNtX2hvc3QtPmNsa19tdXRleCk7CisJc3Bpbl9sb2NrX2lu aXQoJm1zbV9ob3N0LT5pbnRyX2xvY2spOworCisJLyogc2V0dXAgd29ya3F1ZXVlICovCisJbXNt X2hvc3QtPndvcmtxdWV1ZSA9IGFsbG9jX29yZGVyZWRfd29ya3F1ZXVlKCJkc2lfZHJtX3dvcmsi LCAwKTsKKwlJTklUX1dPUksoJm1zbV9ob3N0LT5lcnJfd29yaywgZHNpX2Vycl93b3JrZXIpOwor CisJbXNtX2RzaS0+cGh5ID0gbXNtX2RzaV9waHlfaW5pdChwZGV2LCBtc21faG9zdC0+Y2ZnLT5w aHlfdHlwZSwKKwkJCQkJbXNtX2hvc3QtPmlkKTsKKwlpZiAoIW1zbV9kc2ktPnBoeSkgeworCQlw cl9lcnIoIiVzOiBwaHkgaW5pdCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJZ290byBmYWlsOwor CX0KKwltc21fZHNpLT5ob3N0ID0gJm1zbV9ob3N0LT5iYXNlOworCW1zbV9kc2ktPmlkID0gbXNt X2hvc3QtPmlkOworCisJREJHKCJEc2kgSG9zdCAlZCBpbml0aWFsaXplZFxuIiwgbXNtX2hvc3Qt PmlkKTsKKwlyZXR1cm4gMDsKKworZmFpbDoKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIG1zbV9k c2lfaG9zdF9kZXN0cm95KHN0cnVjdCBtaXBpX2RzaV9ob3N0ICpob3N0KQoreworCXN0cnVjdCBt c21fZHNpX2hvc3QgKm1zbV9ob3N0ID0gdG9fbXNtX2RzaV9ob3N0KGhvc3QpOworCisJREJHKCIi KTsKKwlkc2lfdHhfYnVmX2ZyZWUobXNtX2hvc3QpOworCWlmIChtc21faG9zdC0+d29ya3F1ZXVl KSB7CisJCWZsdXNoX3dvcmtxdWV1ZShtc21faG9zdC0+d29ya3F1ZXVlKTsKKwkJZGVzdHJveV93 b3JrcXVldWUobXNtX2hvc3QtPndvcmtxdWV1ZSk7CisJCW1zbV9ob3N0LT53b3JrcXVldWUgPSBO VUxMOworCX0KKworCW11dGV4X2Rlc3Ryb3koJm1zbV9ob3N0LT5jbGtfbXV0ZXgpOworCW11dGV4 X2Rlc3Ryb3koJm1zbV9ob3N0LT5jbWRfbXV0ZXgpOworCW11dGV4X2Rlc3Ryb3koJm1zbV9ob3N0 LT5kZXZfbXV0ZXgpOworfQorCitpbnQgbXNtX2RzaV9ob3N0X21vZGVzZXRfaW5pdChzdHJ1Y3Qg bWlwaV9kc2lfaG9zdCAqaG9zdCwKKwkJCQkJc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlz dHJ1Y3QgbXNtX2RzaV9ob3N0ICptc21faG9zdCA9IHRvX21zbV9kc2lfaG9zdChob3N0KTsKKwlz dHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gbXNtX2hvc3QtPnBkZXY7CisJaW50IHJldDsK KworCW1zbV9ob3N0LT5pcnEgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChwZGV2LT5kZXYub2Zfbm9k ZSwgMCk7CisJaWYgKG1zbV9ob3N0LT5pcnEgPCAwKSB7CisJCXJldCA9IG1zbV9ob3N0LT5pcnE7 CisJCWRldl9lcnIoZGV2LT5kZXYsICJmYWlsZWQgdG8gZ2V0IGlycTogJWRcbiIsIHJldCk7CisJ CXJldHVybiAtRUlOVkFMOworCX0KKworCXJldCA9IGRldm1fcmVxdWVzdF9pcnEoJnBkZXYtPmRl diwgbXNtX2hvc3QtPmlycSwKKwkJCWRzaV9ob3N0X2lycSwgSVJRRl9UUklHR0VSX0hJR0ggfCBJ UlFGX09ORVNIT1QsCisJCQkiZHNpX2lzciIsIG1zbV9ob3N0KTsKKwlpZiAocmV0IDwgMCkgewor CQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gcmVxdWVzdCBJUlEldTogJWRcbiIsCisJ CQkJbXNtX2hvc3QtPmlycSwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwltc21faG9zdC0+ ZGV2ID0gZGV2OworCXJldCA9IGRzaV90eF9idWZfYWxsb2MobXNtX2hvc3QsIFNaXzRLKTsKKwlp ZiAocmV0KSB7CisJCXByX2VycigiJXM6IGFsbG9jIHR4IGdlbSBvYmogZmFpbGVkLCAlZFxuIiwg X19mdW5jX18sIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIHJldDsKK30KKwor aW50IG1zbV9kc2lfaG9zdF9yZWdpc3RlcihzdHJ1Y3QgbWlwaV9kc2lfaG9zdCAqaG9zdCwgYm9v bCBjaGVja19kZWZlcikKK3sKKwlzdHJ1Y3QgbXNtX2RzaV9ob3N0ICptc21faG9zdCA9IHRvX21z bV9kc2lfaG9zdChob3N0KTsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGU7CisJaW50IHJldDsK KworCS8qIFJlZ2lzdGVyIG1pcGkgZHNpIGhvc3QgKi8KKwlpZiAoIW1zbV9ob3N0LT5yZWdpc3Rl cmVkKSB7CisJCWhvc3QtPmRldiA9ICZtc21faG9zdC0+cGRldi0+ZGV2OworCQlob3N0LT5vcHMg PSAmZHNpX2hvc3Rfb3BzOworCQlyZXQgPSBtaXBpX2RzaV9ob3N0X3JlZ2lzdGVyKGhvc3QpOwor CQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQltc21faG9zdC0+cmVnaXN0ZXJlZCA9IHRy dWU7CisKKwkJLyogSWYgdGhlIHBhbmVsIGRyaXZlciBoYXMgbm90IGJlZW4gcHJvYmVkIGFmdGVy IGhvc3QgcmVnaXN0ZXIsCisJCSAqIHdlIHNob3VsZCBkZWZlciB0aGUgaG9zdCdzIHByb2JlLgor CQkgKiBJdCBtYWtlcyBzdXJlIHBhbmVsIGlzIGNvbm5lY3RlZCB3aGVuIGZiY29uIGRldGVjdHMK KwkJICogY29ubmVjdG9yIHN0YXR1cyBhbmQgZ2V0cyB0aGUgcHJvcGVyIGRpc3BsYXkgbW9kZSB0 bworCQkgKiBjcmVhdGUgZnJhbWVidWZmZXIuCisJCSAqLworCQlpZiAoY2hlY2tfZGVmZXIpIHsK KwkJCW5vZGUgPSBvZl9wYXJzZV9waGFuZGxlKG1zbV9ob3N0LT5wZGV2LT5kZXYub2Zfbm9kZSwK KwkJCQkJCSJxY29tLHBhbmVsIiwgMCk7CisJCQlpZiAobm9kZSkgeworCQkJCWlmICghb2ZfZHJt X2ZpbmRfcGFuZWwobm9kZSkpCisJCQkJCXJldHVybiAtRVBST0JFX0RFRkVSOworCQkJfQorCQl9 CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgbXNtX2RzaV9ob3N0X3VucmVnaXN0ZXIoc3Ry dWN0IG1pcGlfZHNpX2hvc3QgKmhvc3QpCit7CisJc3RydWN0IG1zbV9kc2lfaG9zdCAqbXNtX2hv c3QgPSB0b19tc21fZHNpX2hvc3QoaG9zdCk7CisKKwlpZiAobXNtX2hvc3QtPnJlZ2lzdGVyZWQp IHsKKwkJbWlwaV9kc2lfaG9zdF91bnJlZ2lzdGVyKGhvc3QpOworCQlob3N0LT5kZXYgPSBOVUxM OworCQlob3N0LT5vcHMgPSBOVUxMOworCQltc21faG9zdC0+cmVnaXN0ZXJlZCA9IGZhbHNlOwor CX0KK30KKworaW50IG1zbV9kc2lfaG9zdF94ZmVyX3ByZXBhcmUoc3RydWN0IG1pcGlfZHNpX2hv c3QgKmhvc3QsCisJCQkJY29uc3Qgc3RydWN0IG1pcGlfZHNpX21zZyAqbXNnKQoreworCXN0cnVj dCBtc21fZHNpX2hvc3QgKm1zbV9ob3N0ID0gdG9fbXNtX2RzaV9ob3N0KGhvc3QpOworCisJLyog VE9ETzogbWFrZSBzdXJlIGRzaV9jbWRfbWRwIGlzIGlkbGUuCisJICogU2luY2UgRFNJNkcgdjEu Mi4wLCB3ZSBjYW4gc2V0IERTSV9UUklHX0NUUkwuQkxPQ0tfRE1BX1dJVEhJTl9GUkFNRQorCSAq IHRvIGFzayBIL1cgdG8gd2FpdCB1bnRpbCBjbWQgbWRwIGlzIGlkbGUuIFMvVyB3YWl0IGlzIG5v dCBuZWVkZWQuCisJICogSG93IHRvIGhhbmRsZSB0aGUgb2xkIHZlcnNpb25zPyBXYWl0IGZvciBt ZHAgY21kIGRvbmU/CisJICovCisKKwkvKgorCSAqIG1kc3MgaW50ZXJydXB0IGlzIGdlbmVyYXRl ZCBpbiBtZHAgY29yZSBjbG9jayBkb21haW4KKwkgKiBtZHAgY2xvY2sgbmVlZCB0byBiZSBlbmFi bGVkIHRvIHJlY2VpdmUgZHNpIGludGVycnVwdAorCSAqLworCWRzaV9jbGtfY3RybChtc21faG9z dCwgMSk7CisKKwkvKiBUT0RPOiB2b3RlIGZvciBidXMgYmFuZHdpZHRoICovCisKKwlpZiAoISht c2ctPmZsYWdzICYgTUlQSV9EU0lfTVNHX1VTRV9MUE0pKQorCQlkc2lfc2V0X3R4X3Bvd2VyX21v ZGUoMCwgbXNtX2hvc3QpOworCisJbXNtX2hvc3QtPmRtYV9jbWRfY3RybF9yZXN0b3JlID0gZHNp X3JlYWQobXNtX2hvc3QsIFJFR19EU0lfQ1RSTCk7CisJZHNpX3dyaXRlKG1zbV9ob3N0LCBSRUdf RFNJX0NUUkwsCisJCW1zbV9ob3N0LT5kbWFfY21kX2N0cmxfcmVzdG9yZSB8CisJCURTSV9DVFJM X0NNRF9NT0RFX0VOIHwKKwkJRFNJX0NUUkxfRU5BQkxFKTsKKwlkc2lfaW50cl9jdHJsKG1zbV9o b3N0LCBEU0lfSVJRX01BU0tfQ01EX0RNQV9ET05FLCAxKTsKKworCXJldHVybiAwOworfQorCit2 b2lkIG1zbV9kc2lfaG9zdF94ZmVyX3Jlc3RvcmUoc3RydWN0IG1pcGlfZHNpX2hvc3QgKmhvc3Qs CisJCQkJY29uc3Qgc3RydWN0IG1pcGlfZHNpX21zZyAqbXNnKQoreworCXN0cnVjdCBtc21fZHNp X2hvc3QgKm1zbV9ob3N0ID0gdG9fbXNtX2RzaV9ob3N0KGhvc3QpOworCisJZHNpX2ludHJfY3Ry bChtc21faG9zdCwgRFNJX0lSUV9NQVNLX0NNRF9ETUFfRE9ORSwgMCk7CisJZHNpX3dyaXRlKG1z bV9ob3N0LCBSRUdfRFNJX0NUUkwsIG1zbV9ob3N0LT5kbWFfY21kX2N0cmxfcmVzdG9yZSk7CisK KwlpZiAoIShtc2ctPmZsYWdzICYgTUlQSV9EU0lfTVNHX1VTRV9MUE0pKQorCQlkc2lfc2V0X3R4 X3Bvd2VyX21vZGUoMSwgbXNtX2hvc3QpOworCisJLyogVE9ETzogdW52b3RlIGZvciBidXMgYmFu ZHdpZHRoICovCisKKwlkc2lfY2xrX2N0cmwobXNtX2hvc3QsIDApOworfQorCitpbnQgbXNtX2Rz aV9ob3N0X2NtZF90eChzdHJ1Y3QgbWlwaV9kc2lfaG9zdCAqaG9zdCwKKwkJCQljb25zdCBzdHJ1 Y3QgbWlwaV9kc2lfbXNnICptc2cpCit7CisJc3RydWN0IG1zbV9kc2lfaG9zdCAqbXNtX2hvc3Qg PSB0b19tc21fZHNpX2hvc3QoaG9zdCk7CisKKwlyZXR1cm4gZHNpX2NtZHMyYnVmX3R4KG1zbV9o b3N0LCBtc2cpOworfQorCitpbnQgbXNtX2RzaV9ob3N0X2NtZF9yeChzdHJ1Y3QgbWlwaV9kc2lf aG9zdCAqaG9zdCwKKwkJCQljb25zdCBzdHJ1Y3QgbWlwaV9kc2lfbXNnICptc2cpCit7CisJc3Ry dWN0IG1zbV9kc2lfaG9zdCAqbXNtX2hvc3QgPSB0b19tc21fZHNpX2hvc3QoaG9zdCk7CisJaW50 IGRhdGFfYnl0ZSwgcnhfYnl0ZSwgZGxlbiwgZW5kOworCWludCBzaG9ydF9yZXNwb25zZSwgZGlm ZiwgcGt0X3NpemUsIHJldCA9IDA7CisJY2hhciBjbWQ7CisJaW50IHJsZW4gPSBtc2ctPnJ4X2xl bjsKKwl1OCAqYnVmOworCisJaWYgKHJsZW4gPD0gMikgeworCQlzaG9ydF9yZXNwb25zZSA9IDE7 CisJCXBrdF9zaXplID0gcmxlbjsKKwkJcnhfYnl0ZSA9IDQ7CisJfSBlbHNlIHsKKwkJc2hvcnRf cmVzcG9uc2UgPSAwOworCQlkYXRhX2J5dGUgPSAxMDsJLyogZmlyc3QgcmVhZCAqLworCQlpZiAo cmxlbiA8IGRhdGFfYnl0ZSkKKwkJCXBrdF9zaXplID0gcmxlbjsKKwkJZWxzZQorCQkJcGt0X3Np emUgPSBkYXRhX2J5dGU7CisJCXJ4X2J5dGUgPSBkYXRhX2J5dGUgKyA2OyAvKiA0IGhlYWRlciAr IDIgY3JjICovCisJfQorCisJYnVmID0gbXNtX2hvc3QtPnJ4X2J1ZjsKKwllbmQgPSAwOworCXdo aWxlICghZW5kKSB7CisJCXU4IHR4WzJdID0ge3BrdF9zaXplICYgMHhmZiwgcGt0X3NpemUgPj4g OH07CisJCXN0cnVjdCBtaXBpX2RzaV9tc2cgbWF4X3BrdF9zaXplX21zZyA9IHsKKwkJCS5jaGFu bmVsID0gbXNnLT5jaGFubmVsLAorCQkJLnR5cGUgPSBNSVBJX0RTSV9TRVRfTUFYSU1VTV9SRVRV Uk5fUEFDS0VUX1NJWkUsCisJCQkudHhfbGVuID0gMiwKKwkJCS50eF9idWYgPSB0eCwKKwkJfTsK KworCQlEQkcoInJsZW49JWQgcGt0X3NpemU9JWQgcnhfYnl0ZT0lZCIsCisJCQlybGVuLCBwa3Rf c2l6ZSwgcnhfYnl0ZSk7CisKKwkJcmV0ID0gZHNpX2NtZHMyYnVmX3R4KG1zbV9ob3N0LCAmbWF4 X3BrdF9zaXplX21zZyk7CisJCWlmIChyZXQgPCAyKSB7CisJCQlwcl9lcnIoIiVzOiBTZXQgbWF4 IHBrdCBzaXplIGZhaWxlZCwgJWRcbiIsCisJCQkJX19mdW5jX18sIHJldCk7CisJCQlyZXR1cm4g LUVJTlZBTDsKKwkJfQorCisJCWlmICgobXNtX2hvc3QtPmNmZy0+bWFqb3IgPT0gTVNNX0RTSV9W RVJfTUFKT1JfNkcpICYmCisJCQkobXNtX2hvc3QtPmNmZy0+bWlub3IgPj0gTVNNX0RTSV82R19W RVJfTUlOT1JfVjFfMSkpIHsKKwkJCS8qIENsZWFyIHRoZSBSREJLX0RBVEEgcmVnaXN0ZXJzICov CisJCQlkc2lfd3JpdGUobXNtX2hvc3QsIFJFR19EU0lfUkRCS19EQVRBX0NUUkwsCisJCQkJCURT SV9SREJLX0RBVEFfQ1RSTF9DTFIpOworCQkJd21iKCk7IC8qIG1ha2Ugc3VyZSB0aGUgUkRCSyBy ZWdpc3RlcnMgYXJlIGNsZWFyZWQgKi8KKwkJCWRzaV93cml0ZShtc21faG9zdCwgUkVHX0RTSV9S REJLX0RBVEFfQ1RSTCwgMCk7CisJCQl3bWIoKTsgLyogcmVsZWFzZSBjbGVhcmVkIHN0YXR1cyBi ZWZvcmUgdHJhbnNmZXIgKi8KKwkJfQorCisJCXJldCA9IGRzaV9jbWRzMmJ1Zl90eChtc21faG9z dCwgbXNnKTsKKwkJaWYgKHJldCA8IG1zZy0+dHhfbGVuKSB7CisJCQlwcl9lcnIoIiVzOiBSZWFk IGNtZCBUeCBmYWlsZWQsICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJ CX0KKworCQkvKgorCQkgKiBvbmNlIGNtZF9kbWFfZG9uZSBpbnRlcnJ1cHQgcmVjZWl2ZWQsCisJ CSAqIHJldHVybiBkYXRhIGZyb20gY2xpZW50IGlzIHJlYWR5IGFuZCBzdG9yZWQKKwkJICogYXQg UkRCS19EQVRBIHJlZ2lzdGVyIGFscmVhZHkKKwkJICogc2luY2UgcnggZmlmbyBpcyAxNiBieXRl cywgZGNzIGhlYWRlciBpcyBrZXB0IGF0IGZpcnN0IGxvb3AsCisJCSAqIGFmdGVyIHRoYXQgZGNz IGhlYWRlciBsb3N0IGR1cmluZyBzaGlmdCBpbnRvIHJlZ2lzdGVycworCQkgKi8KKwkJZGxlbiA9 IGRzaV9jbWRfZG1hX3J4KG1zbV9ob3N0LCBidWYsIHJ4X2J5dGUsIHBrdF9zaXplKTsKKworCQlp ZiAoZGxlbiA8PSAwKQorCQkJcmV0dXJuIDA7CisKKwkJaWYgKHNob3J0X3Jlc3BvbnNlKQorCQkJ YnJlYWs7CisKKwkJaWYgKHJsZW4gPD0gZGF0YV9ieXRlKSB7CisJCQlkaWZmID0gZGF0YV9ieXRl IC0gcmxlbjsKKwkJCWVuZCA9IDE7CisJCX0gZWxzZSB7CisJCQlkaWZmID0gMDsKKwkJCXJsZW4g LT0gZGF0YV9ieXRlOworCQl9CisKKwkJaWYgKCFlbmQpIHsKKwkJCWRsZW4gLT0gMjsgLyogMiBj cmMgKi8KKwkJCWRsZW4gLT0gZGlmZjsKKwkJCWJ1ZiArPSBkbGVuOwkvKiBuZXh0IHN0YXJ0IHBv c2l0aW9uICovCisJCQlkYXRhX2J5dGUgPSAxNDsJLyogTk9UIGZpcnN0IHJlYWQgKi8KKwkJCWlm IChybGVuIDwgZGF0YV9ieXRlKQorCQkJCXBrdF9zaXplICs9IHJsZW47CisJCQllbHNlCisJCQkJ cGt0X3NpemUgKz0gZGF0YV9ieXRlOworCQkJREJHKCJidWY9JXggZGxlbj0lZCBkaWZmPSVkXG4i LCAoaW50KWJ1ZiwgZGxlbiwgZGlmZik7CisJCX0KKwl9CisKKwkvKgorCSAqIEZvciBzaW5nbGUg TG9uZyByZWFkLCBpZiB0aGUgcmVxdWVzdGVkIHJsZW4gPCAxMCwKKwkgKiB3ZSBuZWVkIHRvIHNo aWZ0IHRoZSBzdGFydCBwb3NpdGlvbiBvZiByeAorCSAqIGRhdGEgYnVmZmVyIHRvIHNraXAgdGhl IGJ5dGVzIHdoaWNoIGFyZSBub3QKKwkgKiB1cGRhdGVkLgorCSAqLworCWlmIChwa3Rfc2l6ZSA8 IDEwICYmICFzaG9ydF9yZXNwb25zZSkKKwkJYnVmID0gbXNtX2hvc3QtPnJ4X2J1ZiArICgxMCAt IHJsZW4pOworCWVsc2UKKwkJYnVmID0gbXNtX2hvc3QtPnJ4X2J1ZjsKKworCWNtZCA9IGJ1Zlsw XTsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgTUlQSV9EU0lfUlhfQUNLTk9XTEVER0VfQU5EX0VS Uk9SX1JFUE9SVDoKKwkJcHJfZXJyKCIlczogcnggQUNLX0VSUl9QQUNMQUdFXG4iLCBfX2Z1bmNf Xyk7CisJCXJldCA9IDA7CisJY2FzZSBNSVBJX0RTSV9SWF9HRU5FUklDX1NIT1JUX1JFQURfUkVT UE9OU0VfMUJZVEU6CisJY2FzZSBNSVBJX0RTSV9SWF9EQ1NfU0hPUlRfUkVBRF9SRVNQT05TRV8x QllURToKKwkJcmV0ID0gZHNpX3Nob3J0X3JlYWQxX3Jlc3AoYnVmLCBtc2cpOworCQlicmVhazsK KwljYXNlIE1JUElfRFNJX1JYX0dFTkVSSUNfU0hPUlRfUkVBRF9SRVNQT05TRV8yQllURToKKwlj YXNlIE1JUElfRFNJX1JYX0RDU19TSE9SVF9SRUFEX1JFU1BPTlNFXzJCWVRFOgorCQlyZXQgPSBk c2lfc2hvcnRfcmVhZDJfcmVzcChidWYsIG1zZyk7CisJCWJyZWFrOworCWNhc2UgTUlQSV9EU0lf UlhfR0VORVJJQ19MT05HX1JFQURfUkVTUE9OU0U6CisJY2FzZSBNSVBJX0RTSV9SWF9EQ1NfTE9O R19SRUFEX1JFU1BPTlNFOgorCQlyZXQgPSBkc2lfbG9uZ19yZWFkX3Jlc3AoYnVmLCBtc2cpOwor CQlicmVhazsKKwlkZWZhdWx0OgorCQlwcl93YXJuKCIlczpJbnZhbGlkIHJlc3BvbnNlIGNtZFxu IiwgX19mdW5jX18pOworCQlyZXQgPSAwOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQg bXNtX2RzaV9ob3N0X2NtZF94ZmVyX2NvbW1pdChzdHJ1Y3QgbWlwaV9kc2lfaG9zdCAqaG9zdCwg dTMyIGlvdmEsIHUzMiBsZW4pCit7CisJc3RydWN0IG1zbV9kc2lfaG9zdCAqbXNtX2hvc3QgPSB0 b19tc21fZHNpX2hvc3QoaG9zdCk7CisKKwlkc2lfd3JpdGUobXNtX2hvc3QsIFJFR19EU0lfRE1B X0JBU0UsIGlvdmEpOworCWRzaV93cml0ZShtc21faG9zdCwgUkVHX0RTSV9ETUFfTEVOLCBsZW4p OworCWRzaV93cml0ZShtc21faG9zdCwgUkVHX0RTSV9UUklHX0RNQSwgMSk7CisKKwkvKiBNYWtl IHN1cmUgdHJpZ2dlciBoYXBwZW5zICovCisJd21iKCk7Cit9CisKK2ludCBtc21fZHNpX2hvc3Rf ZW5hYmxlKHN0cnVjdCBtaXBpX2RzaV9ob3N0ICpob3N0KQoreworCXN0cnVjdCBtc21fZHNpX2hv c3QgKm1zbV9ob3N0ID0gdG9fbXNtX2RzaV9ob3N0KGhvc3QpOworCisJZHNpX29wX21vZGVfY29u ZmlnKG1zbV9ob3N0LAorCQkhIShtc21faG9zdC0+bW9kZV9mbGFncyAmIE1JUElfRFNJX01PREVf VklERU8pLCB0cnVlKTsKKworCS8qIFRPRE86IGNsb2NrIHNob3VsZCBiZSB0dXJuZWQgb2ZmIGZv ciBjb21tYW5kIG1vZGUsCisJICogYW5kIG9ubHkgdHVybmVkIG9uIGJlZm9yZSBNRFAgU1RBUlQu CisJICogVGhpcyBwYXJ0IG9mIGNvZGUgc2hvdWxkIGJlIGVuYWJsZWQgb25jZSBtZHAgZHJpdmVy IHN1cHBvcnQgaXQuCisJICovCisJLyogaWYgKG1zbV9wYW5lbC0+bW9kZSA9PSBNU01fRFNJX0NN RF9NT0RFKQorCQlkc2lfY2xrX2N0cmwobXNtX2hvc3QsIDApOyAqLworCisJcmV0dXJuIDA7Cit9 CisKK2ludCBtc21fZHNpX2hvc3RfZGlzYWJsZShzdHJ1Y3QgbWlwaV9kc2lfaG9zdCAqaG9zdCkK K3sKKwlzdHJ1Y3QgbXNtX2RzaV9ob3N0ICptc21faG9zdCA9IHRvX21zbV9kc2lfaG9zdChob3N0 KTsKKworCWRzaV9vcF9tb2RlX2NvbmZpZyhtc21faG9zdCwKKwkJISEobXNtX2hvc3QtPm1vZGVf ZmxhZ3MgJiBNSVBJX0RTSV9NT0RFX1ZJREVPKSwgZmFsc2UpOworCisJLyogU2luY2Ugd2UgaGF2 ZSBkaXNhYmxlZCBJTlRGLCB0aGUgdmlkZW8gZW5naW5lIHdvbid0IHN0b3Agc28gdGhhdAorCSAq IHRoZSBjbWQgZW5naW5lIHdpbGwgYmUgYmxvY2tlZC4KKwkgKiBSZXNldCB0byBkaXNhYmxlIHZp ZGVvIGVuZ2luZSBzbyB0aGF0IHdlIGNhbiBzZW5kIG9mZiBjbWQuCisJICovCisJZHNpX3N3X3Jl c2V0KG1zbV9ob3N0KTsKKworCXJldHVybiAwOworfQorCitpbnQgbXNtX2RzaV9ob3N0X3Bvd2Vy X29uKHN0cnVjdCBtaXBpX2RzaV9ob3N0ICpob3N0KQoreworCXN0cnVjdCBtc21fZHNpX2hvc3Qg Km1zbV9ob3N0ID0gdG9fbXNtX2RzaV9ob3N0KGhvc3QpOworCXUzMiBjbGtfcHJlLCBjbGtfcG9z dDsKKwlpbnQgcmV0ID0gMDsKKworCW11dGV4X2xvY2soJm1zbV9ob3N0LT5kZXZfbXV0ZXgpOwor CWlmIChtc21faG9zdC0+cG93ZXJfb24pIHsKKwkJREJHKCJkc2kgaG9zdCBhbHJlYWR5IG9uIik7 CisJCWdvdG8gdW5sb2NrX3JldDsKKwl9CisKKwlyZXQgPSBkc2lfY2FsY19jbGtfcmF0ZShtc21f aG9zdCk7CisJaWYgKHJldCkgeworCQlwcl9lcnIoIiVzOiB1bmFibGUgdG8gY2FsYyBjbGsgcmF0 ZSwgJWRcbiIsIF9fZnVuY19fLCByZXQpOworCQlnb3RvIHVubG9ja19yZXQ7CisJfQorCisJcmV0 ID0gZHNpX2hvc3RfcmVndWxhdG9yX2VuYWJsZShtc21faG9zdCk7CisJaWYgKHJldCkgeworCQlw cl9lcnIoIiVzOkZhaWxlZCB0byBlbmFibGUgdnJlZ3MucmV0PSVkXG4iLAorCQkJX19mdW5jX18s IHJldCk7CisJCWdvdG8gdW5sb2NrX3JldDsKKwl9CisKKwlyZXQgPSBkc2lfYnVzX2Nsa19lbmFi bGUobXNtX2hvc3QpOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCIlczogZmFpbGVkIHRvIGVuYWJs ZSBidXMgY2xvY2tzLCAlZFxuIiwgX19mdW5jX18sIHJldCk7CisJCWdvdG8gZmFpbF9kaXNhYmxl X3JlZzsKKwl9CisKKwlkc2lfcGh5X3N3X3Jlc2V0KG1zbV9ob3N0KTsKKwlyZXQgPSBtc21fZHNp X21hbmFnZXJfcGh5X2VuYWJsZShtc21faG9zdC0+aWQsCisJCQkJCW1zbV9ob3N0LT5ieXRlX2Ns a19yYXRlICogOCwKKwkJCQkJY2xrX2dldF9yYXRlKG1zbV9ob3N0LT5lc2NfY2xrKSwKKwkJCQkJ JmNsa19wcmUsICZjbGtfcG9zdCk7CisJZHNpX2J1c19jbGtfZGlzYWJsZShtc21faG9zdCk7CisJ aWYgKHJldCkgeworCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gZW5hYmxlIHBoeSwgJWRcbiIsIF9f ZnVuY19fLCByZXQpOworCQlnb3RvIGZhaWxfZGlzYWJsZV9yZWc7CisJfQorCisJcmV0ID0gZHNp X2Nsa19jdHJsKG1zbV9ob3N0LCAxKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiJXM6IGZhaWxl ZCB0byBlbmFibGUgY2xvY2tzLiByZXQ9JWRcbiIsIF9fZnVuY19fLCByZXQpOworCQlnb3RvIGZh aWxfZGlzYWJsZV9yZWc7CisJfQorCisJZHNpX3RpbWluZ19zZXR1cChtc21faG9zdCk7CisJZHNp X3N3X3Jlc2V0KG1zbV9ob3N0KTsKKwlkc2lfY3RybF9jb25maWcobXNtX2hvc3QsIHRydWUsIGNs a19wcmUsIGNsa19wb3N0KTsKKworCWlmIChtc21faG9zdC0+ZGlzcF9lbl9ncGlvKQorCQlncGlv ZF9zZXRfdmFsdWUobXNtX2hvc3QtPmRpc3BfZW5fZ3BpbywgMSk7CisKKwltc21faG9zdC0+cG93 ZXJfb24gPSB0cnVlOworCW11dGV4X3VubG9jaygmbXNtX2hvc3QtPmRldl9tdXRleCk7CisKKwly ZXR1cm4gcmV0OworCitmYWlsX2Rpc2FibGVfcmVnOgorCWRzaV9ob3N0X3JlZ3VsYXRvcl9kaXNh YmxlKG1zbV9ob3N0KTsKK3VubG9ja19yZXQ6CisJbXV0ZXhfdW5sb2NrKCZtc21faG9zdC0+ZGV2 X211dGV4KTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgbXNtX2RzaV9ob3N0X3Bvd2VyX29mZihz dHJ1Y3QgbWlwaV9kc2lfaG9zdCAqaG9zdCkKK3sKKwlzdHJ1Y3QgbXNtX2RzaV9ob3N0ICptc21f aG9zdCA9IHRvX21zbV9kc2lfaG9zdChob3N0KTsKKwlpbnQgcmV0ID0gMDsKKworCW11dGV4X2xv Y2soJm1zbV9ob3N0LT5kZXZfbXV0ZXgpOworCWlmICghbXNtX2hvc3QtPnBvd2VyX29uKSB7CisJ CURCRygiZHNpIGhvc3QgYWxyZWFkeSBvZmYiKTsKKwkJZ290byB1bmxvY2tfcmV0OworCX0KKwor CWRzaV9jdHJsX2NvbmZpZyhtc21faG9zdCwgZmFsc2UsIDAsIDApOworCisJaWYgKG1zbV9ob3N0 LT5kaXNwX2VuX2dwaW8pCisJCWdwaW9kX3NldF92YWx1ZShtc21faG9zdC0+ZGlzcF9lbl9ncGlv LCAwKTsKKworCW1zbV9kc2lfbWFuYWdlcl9waHlfZGlzYWJsZShtc21faG9zdC0+aWQpOworCisJ ZHNpX2Nsa19jdHJsKG1zbV9ob3N0LCAwKTsKKworCWRzaV9ob3N0X3JlZ3VsYXRvcl9kaXNhYmxl KG1zbV9ob3N0KTsKKworCURCRygiLSIpOworCisJbXNtX2hvc3QtPnBvd2VyX29uID0gZmFsc2U7 CisKK3VubG9ja19yZXQ6CisJbXV0ZXhfdW5sb2NrKCZtc21faG9zdC0+ZGV2X211dGV4KTsKKwly ZXR1cm4gcmV0OworfQorCitpbnQgbXNtX2RzaV9ob3N0X3NldF9kaXNwbGF5X21vZGUoc3RydWN0 IG1pcGlfZHNpX2hvc3QgKmhvc3QsCisJCQkJCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2Rl KQoreworCXN0cnVjdCBtc21fZHNpX2hvc3QgKm1zbV9ob3N0ID0gdG9fbXNtX2RzaV9ob3N0KGhv c3QpOworCisJaWYgKG1zbV9ob3N0LT5tb2RlKSB7CisJCWRybV9tb2RlX2Rlc3Ryb3kobXNtX2hv c3QtPmRldiwgbXNtX2hvc3QtPm1vZGUpOworCQltc21faG9zdC0+bW9kZSA9IE5VTEw7CisJfQor CisJbXNtX2hvc3QtPm1vZGUgPSBkcm1fbW9kZV9kdXBsaWNhdGUobXNtX2hvc3QtPmRldiwgbW9k ZSk7CisJaWYgKElTX0VSUihtc21faG9zdC0+bW9kZSkpIHsKKwkJcHJfZXJyKCIlczogY2Fubm90 IGR1cGxpY2F0ZSBtb2RlIiwgX19mdW5jX18pOworCQlyZXR1cm4gUFRSX0VSUihtc21faG9zdC0+ bW9kZSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBkcm1fcGFuZWwgKm1zbV9kc2lf aG9zdF9nZXRfcGFuZWwoc3RydWN0IG1pcGlfZHNpX2hvc3QgKmhvc3QsCisJCQkJdW5zaWduZWQg bG9uZyAqcGFuZWxfZmxhZ3MpCit7CisJc3RydWN0IG1zbV9kc2lfaG9zdCAqbXNtX2hvc3QgPSB0 b19tc21fZHNpX2hvc3QoaG9zdCk7CisJc3RydWN0IGRybV9wYW5lbCAqcGFuZWw7CisKKwlwYW5l bCA9IG9mX2RybV9maW5kX3BhbmVsKG1zbV9ob3N0LT5wYW5lbF9ub2RlKTsKKwlpZiAocGFuZWxf ZmxhZ3MpCisJCQkqcGFuZWxfZmxhZ3MgPSBtc21faG9zdC0+bW9kZV9mbGFnczsKKworCXJldHVy biBwYW5lbDsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9kc2kvZHNpX21h bmFnZXIuYyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vZHNpL2RzaV9tYW5hZ2VyLmMKbmV3IGZpbGUg bW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVhYTg4NQotLS0gL2Rldi9udWxsCisrKyBiL2Ry aXZlcnMvZ3B1L2RybS9tc20vZHNpL2RzaV9tYW5hZ2VyLmMKQEAgLTAsMCArMSw3MDYgQEAKKy8q CisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRz IHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2Fu IHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2Yg dGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVy c2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoK KyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwg YmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhl IGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBB IFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNl bnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgIm1zbV9rbXMuaCIKKyNpbmNs dWRlICJkc2kuaCIKKworc3RydWN0IG1zbV9kc2lfbWFuYWdlciB7CisJc3RydWN0IG1zbV9kc2kg KmRzaVtEU0lfTUFYXTsKKworCWJvb2wgaXNfZHVhbF9wYW5lbDsKKwlib29sIGlzX3N5bmNfbmVl ZGVkOworCWludCBtYXN0ZXJfcGFuZWxfaWQ7Cit9OworCitzdGF0aWMgc3RydWN0IG1zbV9kc2lf bWFuYWdlciBtc21fZHNpbV9nbGI7CisKKyNkZWZpbmUgSVNfRFVBTF9QQU5FTCgpCQkobXNtX2Rz aW1fZ2xiLmlzX2R1YWxfcGFuZWwpCisjZGVmaW5lIElTX1NZTkNfTkVFREVEKCkJKG1zbV9kc2lt X2dsYi5pc19zeW5jX25lZWRlZCkKKyNkZWZpbmUgSVNfTUFTVEVSX1BBTkVMKGlkKQkobXNtX2Rz aW1fZ2xiLm1hc3Rlcl9wYW5lbF9pZCA9PSBpZCkKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgbXNt X2RzaSAqZHNpX21ncl9nZXRfZHNpKGludCBpZCkKK3sKKwlyZXR1cm4gbXNtX2RzaW1fZ2xiLmRz aVtpZF07Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG1zbV9kc2kgKmRzaV9tZ3JfZ2V0X290 aGVyX2RzaShpbnQgaWQpCit7CisJcmV0dXJuIG1zbV9kc2ltX2dsYi5kc2lbKGlkICsgMSkgJSBE U0lfTUFYXTsKK30KKworc3RhdGljIGludCBkc2lfbWdyX3BhcnNlX2R1YWxfcGFuZWwoc3RydWN0 IGRldmljZV9ub2RlICpucCwgaW50IGlkKQoreworCXN0cnVjdCBtc21fZHNpX21hbmFnZXIgKm1z bV9kc2ltID0gJm1zbV9kc2ltX2dsYjsKKworCS8qIFdlIGFzc3VtZSAyIGRzaSBub2RlcyBoYXZl IHRoZSBzYW1lIGluZm9ybWF0aW9uIG9mIGR1YWwtcGFuZWwgYW5kCisJICogc3luYy1tb2RlLCBh bmQgb25seSBvbmUgbm9kZSBzcGVjaWZpZXMgbWFzdGVyIGluIGNhc2Ugb2YgZHVhbCBtb2RlLgor CSAqLworCWlmICghbXNtX2RzaW0tPmlzX2R1YWxfcGFuZWwpCisJCW1zbV9kc2ltLT5pc19kdWFs X3BhbmVsID0gb2ZfcHJvcGVydHlfcmVhZF9ib29sKAorCQkJCQkJbnAsICJxY29tLGR1YWwtcGFu ZWwtbW9kZSIpOworCisJaWYgKG1zbV9kc2ltLT5pc19kdWFsX3BhbmVsKSB7CisJCWlmIChvZl9w cm9wZXJ0eV9yZWFkX2Jvb2wobnAsICJxY29tLG1hc3Rlci1wYW5lbCIpKQorCQkJbXNtX2RzaW0t Pm1hc3Rlcl9wYW5lbF9pZCA9IGlkOworCQlpZiAoIW1zbV9kc2ltLT5pc19zeW5jX25lZWRlZCkK KwkJCW1zbV9kc2ltLT5pc19zeW5jX25lZWRlZCA9IG9mX3Byb3BlcnR5X3JlYWRfYm9vbCgKKwkJ CQkJbnAsICJxY29tLHN5bmMtZHVhbC1wYW5lbCIpOworCX0KKworCXJldHVybiAwOworfQorCitz dHJ1Y3QgZHNpX2Nvbm5lY3RvciB7CisJc3RydWN0IGRybV9jb25uZWN0b3IgYmFzZTsKKwlpbnQg aWQ7Cit9OworCitzdHJ1Y3QgZHNpX2JyaWRnZSB7CisJc3RydWN0IGRybV9icmlkZ2UgYmFzZTsK KwlpbnQgaWQ7Cit9OworCisjZGVmaW5lIHRvX2RzaV9jb25uZWN0b3IoeCkgY29udGFpbmVyX29m KHgsIHN0cnVjdCBkc2lfY29ubmVjdG9yLCBiYXNlKQorI2RlZmluZSB0b19kc2lfYnJpZGdlKHgp IGNvbnRhaW5lcl9vZih4LCBzdHJ1Y3QgZHNpX2JyaWRnZSwgYmFzZSkKKworc3RhdGljIGlubGlu ZSBpbnQgZHNpX21ncl9jb25uZWN0b3JfZ2V0X2lkKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25u ZWN0b3IpCit7CisJc3RydWN0IGRzaV9jb25uZWN0b3IgKmRzaV9jb25uZWN0b3IgPSB0b19kc2lf Y29ubmVjdG9yKGNvbm5lY3Rvcik7CisJcmV0dXJuIGRzaV9jb25uZWN0b3ItPmlkOworfQorCitz dGF0aWMgaW50IGRzaV9tZ3JfYnJpZGdlX2dldF9pZChzdHJ1Y3QgZHJtX2JyaWRnZSAqYnJpZGdl KQoreworCXN0cnVjdCBkc2lfYnJpZGdlICpkc2lfYnJpZGdlID0gdG9fZHNpX2JyaWRnZShicmlk Z2UpOworCXJldHVybiBkc2lfYnJpZGdlLT5pZDsKK30KKworc3RhdGljIGVudW0gZHJtX2Nvbm5l Y3Rvcl9zdGF0dXMgZHNpX21ncl9jb25uZWN0b3JfZGV0ZWN0KAorCQlzdHJ1Y3QgZHJtX2Nvbm5l Y3RvciAqY29ubmVjdG9yLCBib29sIGZvcmNlKQoreworCWludCBpZCA9IGRzaV9tZ3JfY29ubmVj dG9yX2dldF9pZChjb25uZWN0b3IpOworCXN0cnVjdCBtc21fZHNpICptc21fZHNpID0gZHNpX21n cl9nZXRfZHNpKGlkKTsKKwlzdHJ1Y3QgbXNtX2RzaSAqb3RoZXJfZHNpID0gZHNpX21ncl9nZXRf b3RoZXJfZHNpKGlkKTsKKwlzdHJ1Y3QgbXNtX2RybV9wcml2YXRlICpwcml2ID0gY29ubmVjdG9y LT5kZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBtc21fa21zICprbXMgPSBwcml2LT5rbXM7CisK KwlEQkcoImlkPSVkIiwgaWQpOworCWlmICghbXNtX2RzaS0+cGFuZWwpIHsKKwkJbXNtX2RzaS0+ cGFuZWwgPSBtc21fZHNpX2hvc3RfZ2V0X3BhbmVsKG1zbV9kc2ktPmhvc3QsCisJCQkJCQkmbXNt X2RzaS0+cGFuZWxfZmxhZ3MpOworCisJCS8qIFRoZXJlIGlzIG9ubHkgMSBwYW5lbCBpbiB0aGUg Z2xvYmFsIHBhbmVsIGxpc3QKKwkJICogZm9yIGR1YWwgcGFuZWwgbW9kZS4gVGhlcmVmb3JlIHNs YXZlIGRzaSBzaG91bGQgZ2V0CisJCSAqIHRoZSBkcm1fcGFuZWwgaW5zdGFuY2UgZnJvbSBtYXN0 ZXIgZHNpLCBhbmQKKwkJICoga2VlcCB1c2luZyB0aGUgcGFuZWwgZmxhZ3MgZ290IGZyb20gdGhl IGN1cnJlbnQgRFNJIGxpbmsuCisJCSAqLworCQlpZiAoIW1zbV9kc2ktPnBhbmVsICYmIElTX0RV QUxfUEFORUwoKSAmJgorCQkJIUlTX01BU1RFUl9QQU5FTChpZCkgJiYgb3RoZXJfZHNpKQorCQkJ bXNtX2RzaS0+cGFuZWwgPSBtc21fZHNpX2hvc3RfZ2V0X3BhbmVsKAorCQkJCQlvdGhlcl9kc2kt Pmhvc3QsIE5VTEwpOworCisJCWlmIChtc21fZHNpLT5wYW5lbCAmJiBJU19EVUFMX1BBTkVMKCkp CisJCQlkcm1fb2JqZWN0X2F0dGFjaF9wcm9wZXJ0eSgmY29ubmVjdG9yLT5iYXNlLAorCQkJCWNv bm5lY3Rvci0+ZGV2LT5tb2RlX2NvbmZpZy50aWxlX3Byb3BlcnR5LCAwKTsKKworCQkvKiBTZXQg c3BsaXQgZGlzcGxheSBpbmZvIHRvIGttcyBvbmx5IG9uY2UgKi8KKwkJaWYgKG1zbV9kc2ktPnBh bmVsICYmIElTX0RVQUxfUEFORUwoKSAmJgorCQkJKGlkID09IERTSV9FTkNPREVSX01BU1RFUikg JiYgb3RoZXJfZHNpKSB7CisJCQlpbnQgdmlkX2VuY19pZCA9IE1TTV9EU0lfVklERU9fRU5DT0RF Ul9JRDsKKwkJCWludCBjbWRfZW5jX2lkID0gTVNNX0RTSV9DTURfRU5DT0RFUl9JRDsKKwkJCWJv b2wgdmlkX3BhbmVsID0KKwkJCQltc21fZHNpLT5wYW5lbF9mbGFncyAmIE1JUElfRFNJX01PREVf VklERU87CisJCQlzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIgPSB2aWRfcGFuZWwgPworCQkJ CW1zbV9kc2ktPmJhc2UuZW5jb2RlcnNbdmlkX2VuY19pZF0gOgorCQkJCW1zbV9kc2ktPmJhc2Uu ZW5jb2RlcnNbY21kX2VuY19pZF07CisJCQlzdHJ1Y3QgZHJtX2VuY29kZXIgKnNsYXZlX2VuYyA9 IHZpZF9wYW5lbCA/CisJCQkJb3RoZXJfZHNpLT5iYXNlLmVuY29kZXJzW3ZpZF9lbmNfaWRdIDoK KwkJCQlvdGhlcl9kc2ktPmJhc2UuZW5jb2RlcnNbY21kX2VuY19pZF07CisKKwkJCWlmIChrbXMt PmZ1bmNzLT5zZXRfc3BsaXRfZGlzcGxheSkKKwkJCQlrbXMtPmZ1bmNzLT5zZXRfc3BsaXRfZGlz cGxheShrbXMsIGVuY29kZXIsCisJCQkJCQlzbGF2ZV9lbmMsICF2aWRfcGFuZWwpOworCQkJZWxz ZQorCQkJCXByX2VycigibWRwIGRvZXMgbm90IHN1cHBvcnQgZHVhbCBwYW5lbFxuIik7CisJCX0K Kwl9CisKKwlyZXR1cm4gbXNtX2RzaS0+cGFuZWwgPyBjb25uZWN0b3Jfc3RhdHVzX2Nvbm5lY3Rl ZCA6CisJCWNvbm5lY3Rvcl9zdGF0dXNfZGlzY29ubmVjdGVkOworfQorCitzdGF0aWMgdm9pZCBk c2lfbWdyX2Nvbm5lY3Rvcl9kZXN0cm95KHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3Ip Cit7CisJREJHKCIiKTsKKwlkcm1fY29ubmVjdG9yX3VucmVnaXN0ZXIoY29ubmVjdG9yKTsKKwlk cm1fY29ubmVjdG9yX2NsZWFudXAoY29ubmVjdG9yKTsKK30KKworc3RhdGljIHZvaWQgZHNpX2R1 YWxfY29ubmVjdG9yX2ZpeF9tb2RlcyhzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQor eworCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlLCAqbTsKKworCS8qIE9ubHkgc3VwcG9y dCBsZWZ0LXJpZ2h0IG1vZGUgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobW9kZSwgbSwg JmNvbm5lY3Rvci0+cHJvYmVkX21vZGVzLCBoZWFkKSB7CisJCW1vZGUtPmNsb2NrID4+PSAxOwor CQltb2RlLT5oZGlzcGxheSA+Pj0gMTsKKwkJbW9kZS0+aHN5bmNfc3RhcnQgPj49IDE7CisJCW1v ZGUtPmhzeW5jX2VuZCA+Pj0gMTsKKwkJbW9kZS0+aHRvdGFsID4+PSAxOworCQlkcm1fbW9kZV9z ZXRfbmFtZShtb2RlKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZHNpX2R1YWxfY29ubmVjdG9yX3Rp bGVfaW5pdCgKKwkJCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsIGludCBpZCkKK3sK KwlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZTsKKwkvKiBGYWtlIHRvcG9sb2d5IGlkICov CisJY2hhciB0b3BvX2lkWzhdID0geydNJywgJ1MnLCAnTScsICdEJywgJ1UnLCAnRCcsICdTJywg J0knfTsKKworCS8qIFVzZSB0aGUgZmlyc3QgbW9kZSBvbmx5IGZvciBub3cgKi8KKwltb2RlID0g bGlzdF9maXJzdF9lbnRyeSgmY29ubmVjdG9yLT5wcm9iZWRfbW9kZXMsCisJCQkJc3RydWN0IGRy bV9kaXNwbGF5X21vZGUsCisJCQkJaGVhZCk7CisJaWYgKCFtb2RlKQorCQlyZXR1cm4gLUVJTlZB TDsKKworCWNvbm5lY3Rvci0+aGFzX3RpbGUgPSB0cnVlOworCWNvbm5lY3Rvci0+dGlsZV9ncm91 cCA9IGRybV9tb2RlX2dldF90aWxlX2dyb3VwKAorCQkJCQljb25uZWN0b3ItPmRldiwgdG9wb19p ZCk7CisJaWYgKCFjb25uZWN0b3ItPnRpbGVfZ3JvdXApCisJCWNvbm5lY3Rvci0+dGlsZV9ncm91 cCA9IGRybV9tb2RlX2NyZWF0ZV90aWxlX2dyb3VwKAorCQkJCQljb25uZWN0b3ItPmRldiwgdG9w b19pZCk7CisJaWYgKCFjb25uZWN0b3ItPnRpbGVfZ3JvdXApIHsKKwkJcHJfZXJyKCIlczogZmFp bGVkIHRvIGNyZWF0ZSB0aWxlIGdyb3VwXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRU5PTUVN OworCX0KKworCWNvbm5lY3Rvci0+dGlsZV9pc19zaW5nbGVfbW9uaXRvciA9IHRydWU7CisKKwkv KiBtb2RlIGhhcyBiZWVuIGZpeGVkICovCisJY29ubmVjdG9yLT50aWxlX2hfc2l6ZSA9IG1vZGUt PmhkaXNwbGF5OworCWNvbm5lY3Rvci0+dGlsZV92X3NpemUgPSBtb2RlLT52ZGlzcGxheTsKKwor CS8qIE9ubHkgc3VwcG9ydCBsZWZ0LXJpZ2h0IG1vZGUgKi8KKwljb25uZWN0b3ItPm51bV9oX3Rp bGUgPSAyOworCWNvbm5lY3Rvci0+bnVtX3ZfdGlsZSA9IDE7CisKKwljb25uZWN0b3ItPnRpbGVf dl9sb2MgPSAwOworCWNvbm5lY3Rvci0+dGlsZV9oX2xvYyA9IChpZCA9PSBEU0lfUklHSFQpID8g MSA6IDA7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkc2lfbWdyX2Nvbm5lY3Rvcl9n ZXRfbW9kZXMoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKK3sKKwlpbnQgaWQgPSBk c2lfbWdyX2Nvbm5lY3Rvcl9nZXRfaWQoY29ubmVjdG9yKTsKKwlzdHJ1Y3QgbXNtX2RzaSAqbXNt X2RzaSA9IGRzaV9tZ3JfZ2V0X2RzaShpZCk7CisJc3RydWN0IGRybV9wYW5lbCAqcGFuZWwgPSBt c21fZHNpLT5wYW5lbDsKKwlpbnQgcmV0LCBudW07CisKKwlpZiAoIXBhbmVsKQorCQlyZXR1cm4g MDsKKworCS8qIFNpbmNlIHdlIGhhdmUgMiBjb25uZWN0b3JzLCBidXQgb25seSAxIGRybV9wYW5l bCBpbiBkdWFsIERTSSBtb2RlLAorCSAqIHBhbmVsIHNob3VsZCBub3QgYXR0YWNoIHRvIGFueSBj b25uZWN0b3IuCisJICogT25seSB0ZW1wb3JhcmlseSBhdHRhY2ggcGFuZWwgdG8gdGhlIGN1cnJl bnQgY29ubmVjdG9yIGhlcmUsCisJICogdG8gbGV0IHBhbmVsIHNldCBtb2RlIHRvIHRoaXMgY29u bmVjdG9yLgorCSAqLworCWRybV9wYW5lbF9hdHRhY2gocGFuZWwsIGNvbm5lY3Rvcik7CisJbnVt ID0gZHJtX3BhbmVsX2dldF9tb2RlcyhwYW5lbCk7CisJZHJtX3BhbmVsX2RldGFjaChwYW5lbCk7 CisJaWYgKCFudW0pCisJCXJldHVybiAwOworCisJaWYgKElTX0RVQUxfUEFORUwoKSkgeworCQkv KiByZXBvcnQgaGFsZiByZXNvbHV0aW9uIHRvIHVzZXIgKi8KKwkJZHNpX2R1YWxfY29ubmVjdG9y X2ZpeF9tb2Rlcyhjb25uZWN0b3IpOworCQlyZXQgPSBkc2lfZHVhbF9jb25uZWN0b3JfdGlsZV9p bml0KGNvbm5lY3RvciwgaWQpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwkJcmV0ID0g ZHJtX21vZGVfY29ubmVjdG9yX3NldF90aWxlX3Byb3BlcnR5KGNvbm5lY3Rvcik7CisJCWlmIChy ZXQpIHsKKwkJCXByX2VycigiJXM6IHNldCB0aWxlIHByb3BlcnR5IGZhaWxlZCwgJWRcbiIsCisJ CQkJCV9fZnVuY19fLCByZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCXJldHVybiBu dW07Cit9CisKK3N0YXRpYyBpbnQgZHNpX21ncl9jb25uZWN0b3JfbW9kZV92YWxpZChzdHJ1Y3Qg ZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLAorCQkJCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICpt b2RlKQoreworCWludCBpZCA9IGRzaV9tZ3JfY29ubmVjdG9yX2dldF9pZChjb25uZWN0b3IpOwor CXN0cnVjdCBtc21fZHNpICptc21fZHNpID0gZHNpX21ncl9nZXRfZHNpKGlkKTsKKwlzdHJ1Y3Qg ZHJtX2VuY29kZXIgKmVuY29kZXIgPQorCQkobXNtX2RzaS0+cGFuZWxfZmxhZ3MgJiBNSVBJX0RT SV9NT0RFX1ZJREVPKSA/CisJCW1zbV9kc2ktPmJhc2UuZW5jb2RlcnNbTVNNX0RTSV9WSURFT19F TkNPREVSX0lEXSA6CisJCW1zbV9kc2ktPmJhc2UuZW5jb2RlcnNbTVNNX0RTSV9DTURfRU5DT0RF Ul9JRF07CisJc3RydWN0IG1zbV9kcm1fcHJpdmF0ZSAqcHJpdiA9IGNvbm5lY3Rvci0+ZGV2LT5k ZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgbXNtX2ttcyAqa21zID0gcHJpdi0+a21zOworCWxvbmcgYWN0 dWFsLCByZXF1ZXN0ZWQ7CisKKwlEQkcoIiIpOworCXJlcXVlc3RlZCA9IDEwMDAgKiBtb2RlLT5j bG9jazsKKwlhY3R1YWwgPSBrbXMtPmZ1bmNzLT5yb3VuZF9waXhjbGsoa21zLCByZXF1ZXN0ZWQs IGVuY29kZXIpOworCisJREJHKCJyZXF1ZXN0ZWQ9JWxkLCBhY3R1YWw9JWxkIiwgcmVxdWVzdGVk LCBhY3R1YWwpOworCWlmIChhY3R1YWwgIT0gcmVxdWVzdGVkKQorCQlyZXR1cm4gTU9ERV9DTE9D S19SQU5HRTsKKworCXJldHVybiBNT0RFX09LOworfQorCitzdGF0aWMgc3RydWN0IGRybV9lbmNv ZGVyICoKK2RzaV9tZ3JfY29ubmVjdG9yX2Jlc3RfZW5jb2RlcihzdHJ1Y3QgZHJtX2Nvbm5lY3Rv ciAqY29ubmVjdG9yKQoreworCWludCBpZCA9IGRzaV9tZ3JfY29ubmVjdG9yX2dldF9pZChjb25u ZWN0b3IpOworCXN0cnVjdCBtc21fZHNpICptc21fZHNpID0gZHNpX21ncl9nZXRfZHNpKGlkKTsK KworCURCRygiIik7CisJcmV0dXJuIChtc21fZHNpLT5wYW5lbF9mbGFncyAmIE1JUElfRFNJX01P REVfVklERU8pID8KKwkJbXNtX2RzaS0+YmFzZS5lbmNvZGVyc1tNU01fRFNJX1ZJREVPX0VOQ09E RVJfSURdIDoKKwkJbXNtX2RzaS0+YmFzZS5lbmNvZGVyc1tNU01fRFNJX0NNRF9FTkNPREVSX0lE XTsKK30KKworc3RhdGljIHZvaWQgZHNpX21ncl9icmlkZ2VfcHJlX2VuYWJsZShzdHJ1Y3QgZHJt X2JyaWRnZSAqYnJpZGdlKQoreworCWludCBpZCA9IGRzaV9tZ3JfYnJpZGdlX2dldF9pZChicmlk Z2UpOworCXN0cnVjdCBtc21fZHNpICptc21fZHNpID0gZHNpX21ncl9nZXRfZHNpKGlkKTsKKwlz dHJ1Y3QgbXNtX2RzaSAqbXNtX2RzaTEgPSBkc2lfbWdyX2dldF9kc2koRFNJXzEpOworCXN0cnVj dCBtaXBpX2RzaV9ob3N0ICpob3N0ID0gbXNtX2RzaS0+aG9zdDsKKwlzdHJ1Y3QgZHJtX3BhbmVs ICpwYW5lbCA9IG1zbV9kc2ktPnBhbmVsOworCWJvb2wgaXNfZHVhbF9wYW5lbCA9IElTX0RVQUxf UEFORUwoKTsKKwlpbnQgcmV0OworCisJREJHKCJpZD0lZCIsIGlkKTsKKwlpZiAoIXBhbmVsIHx8 IChpc19kdWFsX3BhbmVsICYmIChEU0lfMSA9PSBpZCkpKQorCQlyZXR1cm47CisKKwlyZXQgPSBt c21fZHNpX2hvc3RfcG93ZXJfb24oaG9zdCk7CisJaWYgKHJldCkgeworCQlwcl9lcnIoIiVzOiBw b3dlciBvbiBob3N0ICVkIGZhaWxlZCwgJWRcbiIsIF9fZnVuY19fLCBpZCwgcmV0KTsKKwkJZ290 byBob3N0X29uX2ZhaWw7CisJfQorCisJaWYgKGlzX2R1YWxfcGFuZWwgJiYgbXNtX2RzaTEpIHsK KwkJcmV0ID0gbXNtX2RzaV9ob3N0X3Bvd2VyX29uKG1zbV9kc2kxLT5ob3N0KTsKKwkJaWYgKHJl dCkgeworCQkJcHJfZXJyKCIlczogcG93ZXIgb24gaG9zdDEgZmFpbGVkLCAlZFxuIiwKKwkJCQkJ CQlfX2Z1bmNfXywgcmV0KTsKKwkJCWdvdG8gaG9zdDFfb25fZmFpbDsKKwkJfQorCX0KKworCS8q IEFsd2F5cyBjYWxsIHBhbmVsIGZ1bmN0aW9ucyBvbmNlLCBiZWNhdXNlIGV2ZW4gZm9yIGR1YWwg cGFuZWxzLAorCSAqIHRoZXJlIGlzIG9ubHkgb25lIGRybV9wYW5lbCBpbnN0YW5jZS4KKwkgKi8K KwlyZXQgPSBkcm1fcGFuZWxfcHJlcGFyZShwYW5lbCk7CisJaWYgKHJldCkgeworCQlwcl9lcnIo IiVzOiBwcmVwYXJlIHBhbmVsICVkIGZhaWxlZCwgJWRcbiIsIF9fZnVuY19fLCBpZCwgcmV0KTsK KwkJZ290byBwYW5lbF9wcmVwX2ZhaWw7CisJfQorCisJcmV0ID0gbXNtX2RzaV9ob3N0X2VuYWJs ZShob3N0KTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiJXM6IGVuYWJsZSBob3N0ICVkIGZhaWxl ZCwgJWRcbiIsIF9fZnVuY19fLCBpZCwgcmV0KTsKKwkJZ290byBob3N0X2VuX2ZhaWw7CisJfQor CisJaWYgKGlzX2R1YWxfcGFuZWwgJiYgbXNtX2RzaTEpIHsKKwkJcmV0ID0gbXNtX2RzaV9ob3N0 X2VuYWJsZShtc21fZHNpMS0+aG9zdCk7CisJCWlmIChyZXQpIHsKKwkJCXByX2VycigiJXM6IGVu YWJsZSBob3N0MSBmYWlsZWQsICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKKwkJCWdvdG8gaG9zdDFf ZW5fZmFpbDsKKwkJfQorCX0KKworCXJldCA9IGRybV9wYW5lbF9lbmFibGUocGFuZWwpOworCWlm IChyZXQpIHsKKwkJcHJfZXJyKCIlczogZW5hYmxlIHBhbmVsICVkIGZhaWxlZCwgJWRcbiIsIF9f ZnVuY19fLCBpZCwgcmV0KTsKKwkJZ290byBwYW5lbF9lbl9mYWlsOworCX0KKworCXJldHVybjsK KworcGFuZWxfZW5fZmFpbDoKKwlpZiAoaXNfZHVhbF9wYW5lbCAmJiBtc21fZHNpMSkKKwkJbXNt X2RzaV9ob3N0X2Rpc2FibGUobXNtX2RzaTEtPmhvc3QpOworaG9zdDFfZW5fZmFpbDoKKwltc21f ZHNpX2hvc3RfZGlzYWJsZShob3N0KTsKK2hvc3RfZW5fZmFpbDoKKwlkcm1fcGFuZWxfdW5wcmVw YXJlKHBhbmVsKTsKK3BhbmVsX3ByZXBfZmFpbDoKKwlpZiAoaXNfZHVhbF9wYW5lbCAmJiBtc21f ZHNpMSkKKwkJbXNtX2RzaV9ob3N0X3Bvd2VyX29mZihtc21fZHNpMS0+aG9zdCk7Citob3N0MV9v bl9mYWlsOgorCW1zbV9kc2lfaG9zdF9wb3dlcl9vZmYoaG9zdCk7Citob3N0X29uX2ZhaWw6CisJ cmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBkc2lfbWdyX2JyaWRnZV9lbmFibGUoc3RydWN0IGRy bV9icmlkZ2UgKmJyaWRnZSkKK3sKKwlEQkcoIiIpOworfQorCitzdGF0aWMgdm9pZCBkc2lfbWdy X2JyaWRnZV9kaXNhYmxlKHN0cnVjdCBkcm1fYnJpZGdlICpicmlkZ2UpCit7CisJREJHKCIiKTsK K30KKworc3RhdGljIHZvaWQgZHNpX21ncl9icmlkZ2VfcG9zdF9kaXNhYmxlKHN0cnVjdCBkcm1f YnJpZGdlICpicmlkZ2UpCit7CisJaW50IGlkID0gZHNpX21ncl9icmlkZ2VfZ2V0X2lkKGJyaWRn ZSk7CisJc3RydWN0IG1zbV9kc2kgKm1zbV9kc2kgPSBkc2lfbWdyX2dldF9kc2koaWQpOworCXN0 cnVjdCBtc21fZHNpICptc21fZHNpMSA9IGRzaV9tZ3JfZ2V0X2RzaShEU0lfMSk7CisJc3RydWN0 IG1pcGlfZHNpX2hvc3QgKmhvc3QgPSBtc21fZHNpLT5ob3N0OworCXN0cnVjdCBkcm1fcGFuZWwg KnBhbmVsID0gbXNtX2RzaS0+cGFuZWw7CisJYm9vbCBpc19kdWFsX3BhbmVsID0gSVNfRFVBTF9Q QU5FTCgpOworCWludCByZXQ7CisKKwlEQkcoImlkPSVkIiwgaWQpOworCisJaWYgKCFwYW5lbCB8 fCAoaXNfZHVhbF9wYW5lbCAmJiAoRFNJXzEgPT0gaWQpKSkKKwkJcmV0dXJuOworCisJcmV0ID0g ZHJtX3BhbmVsX2Rpc2FibGUocGFuZWwpOworCWlmIChyZXQpCisJCXByX2VycigiJXM6IFBhbmVs ICVkIE9GRiBmYWlsZWQsICVkXG4iLCBfX2Z1bmNfXywgaWQsIHJldCk7CisKKwlyZXQgPSBtc21f ZHNpX2hvc3RfZGlzYWJsZShob3N0KTsKKwlpZiAocmV0KQorCQlwcl9lcnIoIiVzOiBob3N0ICVk IGRpc2FibGUgZmFpbGVkLCAlZFxuIiwgX19mdW5jX18sIGlkLCByZXQpOworCisJaWYgKGlzX2R1 YWxfcGFuZWwgJiYgbXNtX2RzaTEpIHsKKwkJcmV0ID0gbXNtX2RzaV9ob3N0X2Rpc2FibGUobXNt X2RzaTEtPmhvc3QpOworCQlpZiAocmV0KQorCQkJcHJfZXJyKCIlczogaG9zdDEgZGlzYWJsZSBm YWlsZWQsICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKKwl9CisKKwlyZXQgPSBkcm1fcGFuZWxfdW5w cmVwYXJlKHBhbmVsKTsKKwlpZiAocmV0KQorCQlwcl9lcnIoIiVzOiBQYW5lbCAlZCB1bnByZXBh cmUgZmFpbGVkLCVkXG4iLCBfX2Z1bmNfXywgaWQsIHJldCk7CisKKwlyZXQgPSBtc21fZHNpX2hv c3RfcG93ZXJfb2ZmKGhvc3QpOworCWlmIChyZXQpCisJCXByX2VycigiJXM6IGhvc3QgJWQgcG93 ZXIgb2ZmIGZhaWxlZCwlZFxuIiwgX19mdW5jX18sIGlkLCByZXQpOworCisJaWYgKGlzX2R1YWxf cGFuZWwgJiYgbXNtX2RzaTEpIHsKKwkJcmV0ID0gbXNtX2RzaV9ob3N0X3Bvd2VyX29mZihtc21f ZHNpMS0+aG9zdCk7CisJCWlmIChyZXQpCisJCQlwcl9lcnIoIiVzOiBob3N0MSBwb3dlciBvZmYg ZmFpbGVkLCAlZFxuIiwKKwkJCQkJCQkJX19mdW5jX18sIHJldCk7CisJfQorfQorCitzdGF0aWMg dm9pZCBkc2lfbWdyX2JyaWRnZV9tb2RlX3NldChzdHJ1Y3QgZHJtX2JyaWRnZSAqYnJpZGdlLAor CQlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSwKKwkJc3RydWN0IGRybV9kaXNwbGF5X21v ZGUgKmFkanVzdGVkX21vZGUpCit7CisJaW50IGlkID0gZHNpX21ncl9icmlkZ2VfZ2V0X2lkKGJy aWRnZSk7CisJc3RydWN0IG1zbV9kc2kgKm1zbV9kc2kgPSBkc2lfbWdyX2dldF9kc2koaWQpOwor CXN0cnVjdCBtc21fZHNpICpvdGhlcl9kc2kgPSBkc2lfbWdyX2dldF9vdGhlcl9kc2koaWQpOwor CXN0cnVjdCBtaXBpX2RzaV9ob3N0ICpob3N0ID0gbXNtX2RzaS0+aG9zdDsKKwlib29sIGlzX2R1 YWxfcGFuZWwgPSBJU19EVUFMX1BBTkVMKCk7CisKKwlEQkcoInNldCBtb2RlOiAlZDpcIiVzXCIg JWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgMHgleCAweCV4IiwKKwkJCW1vZGUtPmJhc2Uu aWQsIG1vZGUtPm5hbWUsCisJCQltb2RlLT52cmVmcmVzaCwgbW9kZS0+Y2xvY2ssCisJCQltb2Rl LT5oZGlzcGxheSwgbW9kZS0+aHN5bmNfc3RhcnQsCisJCQltb2RlLT5oc3luY19lbmQsIG1vZGUt Pmh0b3RhbCwKKwkJCW1vZGUtPnZkaXNwbGF5LCBtb2RlLT52c3luY19zdGFydCwKKwkJCW1vZGUt PnZzeW5jX2VuZCwgbW9kZS0+dnRvdGFsLAorCQkJbW9kZS0+dHlwZSwgbW9kZS0+ZmxhZ3MpOwor CisJaWYgKGlzX2R1YWxfcGFuZWwgJiYgKERTSV8xID09IGlkKSkKKwkJcmV0dXJuOworCisJbXNt X2RzaV9ob3N0X3NldF9kaXNwbGF5X21vZGUoaG9zdCwgYWRqdXN0ZWRfbW9kZSk7CisJaWYgKGlz X2R1YWxfcGFuZWwgJiYgb3RoZXJfZHNpKQorCQltc21fZHNpX2hvc3Rfc2V0X2Rpc3BsYXlfbW9k ZShvdGhlcl9kc2ktPmhvc3QsIGFkanVzdGVkX21vZGUpOworfQorCitzdGF0aWMgY29uc3Qgc3Ry dWN0IGRybV9jb25uZWN0b3JfZnVuY3MgZHNpX21ncl9jb25uZWN0b3JfZnVuY3MgPSB7CisJLmRw bXMgPSBkcm1fYXRvbWljX2hlbHBlcl9jb25uZWN0b3JfZHBtcywKKwkuZGV0ZWN0ID0gZHNpX21n cl9jb25uZWN0b3JfZGV0ZWN0LAorCS5maWxsX21vZGVzID0gZHJtX2hlbHBlcl9wcm9iZV9zaW5n bGVfY29ubmVjdG9yX21vZGVzLAorCS5kZXN0cm95ID0gZHNpX21ncl9jb25uZWN0b3JfZGVzdHJv eSwKKwkucmVzZXQgPSBkcm1fYXRvbWljX2hlbHBlcl9jb25uZWN0b3JfcmVzZXQsCisJLmF0b21p Y19kdXBsaWNhdGVfc3RhdGUgPSBkcm1fYXRvbWljX2hlbHBlcl9jb25uZWN0b3JfZHVwbGljYXRl X3N0YXRlLAorCS5hdG9taWNfZGVzdHJveV9zdGF0ZSA9IGRybV9hdG9taWNfaGVscGVyX2Nvbm5l Y3Rvcl9kZXN0cm95X3N0YXRlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fY29ubmVj dG9yX2hlbHBlcl9mdW5jcyBkc2lfbWdyX2Nvbm5faGVscGVyX2Z1bmNzID0geworCS5nZXRfbW9k ZXMgPSBkc2lfbWdyX2Nvbm5lY3Rvcl9nZXRfbW9kZXMsCisJLm1vZGVfdmFsaWQgPSBkc2lfbWdy X2Nvbm5lY3Rvcl9tb2RlX3ZhbGlkLAorCS5iZXN0X2VuY29kZXIgPSBkc2lfbWdyX2Nvbm5lY3Rv cl9iZXN0X2VuY29kZXIsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9icmlkZ2VfZnVu Y3MgZHNpX21ncl9icmlkZ2VfZnVuY3MgPSB7CisJLnByZV9lbmFibGUgPSBkc2lfbWdyX2JyaWRn ZV9wcmVfZW5hYmxlLAorCS5lbmFibGUgPSBkc2lfbWdyX2JyaWRnZV9lbmFibGUsCisJLmRpc2Fi bGUgPSBkc2lfbWdyX2JyaWRnZV9kaXNhYmxlLAorCS5wb3N0X2Rpc2FibGUgPSBkc2lfbWdyX2Jy aWRnZV9wb3N0X2Rpc2FibGUsCisJLm1vZGVfc2V0ID0gZHNpX21ncl9icmlkZ2VfbW9kZV9zZXQs Cit9OworCisvKiBpbml0aWFsaXplIGNvbm5lY3RvciAqLworc3RydWN0IGRybV9jb25uZWN0b3Ig Km1zbV9kc2lfbWFuYWdlcl9jb25uZWN0b3JfaW5pdCh1OCBpZCkKK3sKKwlzdHJ1Y3QgbXNtX2Rz aSAqbXNtX2RzaSA9IGRzaV9tZ3JfZ2V0X2RzaShpZCk7CisJc3RydWN0IGRybV9jb25uZWN0b3Ig KmNvbm5lY3RvciA9IE5VTEw7CisJc3RydWN0IGRzaV9jb25uZWN0b3IgKmRzaV9jb25uZWN0b3I7 CisJaW50IHJldDsKKworCWRzaV9jb25uZWN0b3IgPSBkZXZtX2t6YWxsb2MobXNtX2RzaS0+ZGV2 LT5kZXYsCisJCQkJc2l6ZW9mKCpkc2lfY29ubmVjdG9yKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFk c2lfY29ubmVjdG9yKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZmFpbDsKKwl9CisKKwlk c2lfY29ubmVjdG9yLT5pZCA9IGlkOworCisJY29ubmVjdG9yID0gJmRzaV9jb25uZWN0b3ItPmJh c2U7CisKKwlyZXQgPSBkcm1fY29ubmVjdG9yX2luaXQobXNtX2RzaS0+ZGV2LCBjb25uZWN0b3Is CisJCQkmZHNpX21ncl9jb25uZWN0b3JfZnVuY3MsIERSTV9NT0RFX0NPTk5FQ1RPUl9EU0kpOwor CWlmIChyZXQpCisJCWdvdG8gZmFpbDsKKworCWRybV9jb25uZWN0b3JfaGVscGVyX2FkZChjb25u ZWN0b3IsICZkc2lfbWdyX2Nvbm5faGVscGVyX2Z1bmNzKTsKKworCS8qIEVuYWJsZSBIUEQgdG8g bGV0IGhwZCBldmVudCBpcyBoYW5kbGVkCisJICogd2hlbiBwYW5lbCBpcyBhdHRhY2hlZCB0byB0 aGUgaG9zdC4KKwkgKi8KKwljb25uZWN0b3ItPnBvbGxlZCA9IERSTV9DT05ORUNUT1JfUE9MTF9I UEQ7CisKKwkvKiBEaXNwbGF5IGRyaXZlciBkb2Vzbid0IHN1cHBvcnQgaW50ZXJsYWNlIG5vdy4g Ki8KKwljb25uZWN0b3ItPmludGVybGFjZV9hbGxvd2VkID0gMDsKKwljb25uZWN0b3ItPmRvdWJs ZXNjYW5fYWxsb3dlZCA9IDA7CisKKwlyZXQgPSBkcm1fY29ubmVjdG9yX3JlZ2lzdGVyKGNvbm5l Y3Rvcik7CisJaWYgKHJldCkKKwkJZ290byBmYWlsOworCisJcmV0dXJuIGNvbm5lY3RvcjsKKwor ZmFpbDoKKwlpZiAoY29ubmVjdG9yKQorCQlkc2lfbWdyX2Nvbm5lY3Rvcl9kZXN0cm95KGNvbm5l Y3Rvcik7CisKKwlyZXR1cm4gRVJSX1BUUihyZXQpOworfQorCisvKiBpbml0aWFsaXplIGJyaWRn ZSAqLworc3RydWN0IGRybV9icmlkZ2UgKm1zbV9kc2lfbWFuYWdlcl9icmlkZ2VfaW5pdCh1OCBp ZCkKK3sKKwlzdHJ1Y3QgbXNtX2RzaSAqbXNtX2RzaSA9IGRzaV9tZ3JfZ2V0X2RzaShpZCk7CisJ c3RydWN0IGRybV9icmlkZ2UgKmJyaWRnZSA9IE5VTEw7CisJc3RydWN0IGRzaV9icmlkZ2UgKmRz aV9icmlkZ2U7CisJaW50IHJldDsKKworCWRzaV9icmlkZ2UgPSBkZXZtX2t6YWxsb2MobXNtX2Rz aS0+ZGV2LT5kZXYsCisJCQkJc2l6ZW9mKCpkc2lfYnJpZGdlKSwgR0ZQX0tFUk5FTCk7CisJaWYg KCFkc2lfYnJpZGdlKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZmFpbDsKKwl9CisKKwlk c2lfYnJpZGdlLT5pZCA9IGlkOworCisJYnJpZGdlID0gJmRzaV9icmlkZ2UtPmJhc2U7CisJYnJp ZGdlLT5mdW5jcyA9ICZkc2lfbWdyX2JyaWRnZV9mdW5jczsKKworCXJldCA9IGRybV9icmlkZ2Vf YXR0YWNoKG1zbV9kc2ktPmRldiwgYnJpZGdlKTsKKwlpZiAocmV0KQorCQlnb3RvIGZhaWw7CisK KwlyZXR1cm4gYnJpZGdlOworCitmYWlsOgorCWlmIChicmlkZ2UpCisJCW1zbV9kc2lfbWFuYWdl cl9icmlkZ2VfZGVzdHJveShicmlkZ2UpOworCisJcmV0dXJuIEVSUl9QVFIocmV0KTsKK30KKwor dm9pZCBtc21fZHNpX21hbmFnZXJfYnJpZGdlX2Rlc3Ryb3koc3RydWN0IGRybV9icmlkZ2UgKmJy aWRnZSkKK3sKK30KKworaW50IG1zbV9kc2lfbWFuYWdlcl9waHlfZW5hYmxlKGludCBpZCwKKwkJ Y29uc3QgdW5zaWduZWQgbG9uZyBiaXRfcmF0ZSwgY29uc3QgdW5zaWduZWQgbG9uZyBlc2NfcmF0 ZSwKKwkJdTMyICpjbGtfcHJlLCB1MzIgKmNsa19wb3N0KQoreworCXN0cnVjdCBtc21fZHNpICpt c21fZHNpID0gZHNpX21ncl9nZXRfZHNpKGlkKTsKKwlzdHJ1Y3QgbXNtX2RzaV9waHkgKnBoeSA9 IG1zbV9kc2ktPnBoeTsKKwlpbnQgcmV0OworCisJcmV0ID0gbXNtX2RzaV9waHlfZW5hYmxlKHBo eSwgSVNfRFVBTF9QQU5FTCgpLCBiaXRfcmF0ZSwgZXNjX3JhdGUpOworCWlmIChyZXQpCisJCXJl dHVybiByZXQ7CisKKwltc21fZHNpLT5waHlfZW5hYmxlZCA9IHRydWU7CisJbXNtX2RzaV9waHlf Z2V0X2Nsa19wcmVfcG9zdChwaHksIGNsa19wcmUsIGNsa19wb3N0KTsKKworCXJldHVybiAwOwor fQorCit2b2lkIG1zbV9kc2lfbWFuYWdlcl9waHlfZGlzYWJsZShpbnQgaWQpCit7CisJc3RydWN0 IG1zbV9kc2kgKm1zbV9kc2kgPSBkc2lfbWdyX2dldF9kc2koaWQpOworCXN0cnVjdCBtc21fZHNp ICptZHNpID0gZHNpX21ncl9nZXRfZHNpKERTSV9DTE9DS19NQVNURVIpOworCXN0cnVjdCBtc21f ZHNpICpzZHNpID0gZHNpX21ncl9nZXRfZHNpKERTSV9DTE9DS19TTEFWRSk7CisJc3RydWN0IG1z bV9kc2lfcGh5ICpwaHkgPSBtc21fZHNpLT5waHk7CisKKwkvKiBkaXNhYmxlIERTSSBwaHkKKwkg KiBJbiBkdWFsLWRzaSBjb25maWd1cmF0aW9uLCB0aGUgcGh5IHNob3VsZCBiZSBkaXNhYmxlZCBm b3IgdGhlCisJICogZmlyc3QgY29udHJvbGxlciBvbmx5IHdoZW4gdGhlIHNlY29uZCBjb250cm9s bGVyIGlzIGRpc2FibGVkLgorCSAqLworCW1zbV9kc2ktPnBoeV9lbmFibGVkID0gZmFsc2U7CisJ aWYgKElTX0RVQUxfUEFORUwoKSAmJiBtZHNpICYmIHNkc2kpIHsKKwkJaWYgKCFtZHNpLT5waHlf ZW5hYmxlZCAmJiAhc2RzaS0+cGh5X2VuYWJsZWQpIHsKKwkJCW1zbV9kc2lfcGh5X2Rpc2FibGUo c2RzaS0+cGh5KTsKKwkJCW1zbV9kc2lfcGh5X2Rpc2FibGUobWRzaS0+cGh5KTsKKwkJfQorCX0g ZWxzZSB7CisJCW1zbV9kc2lfcGh5X2Rpc2FibGUocGh5KTsKKwl9Cit9CisKK2ludCBtc21fZHNp X21hbmFnZXJfY21kX3hmZXIoaW50IGlkLCBjb25zdCBzdHJ1Y3QgbWlwaV9kc2lfbXNnICptc2cp Cit7CisJc3RydWN0IG1zbV9kc2kgKm1zbV9kc2kgPSBkc2lfbWdyX2dldF9kc2koaWQpOworCXN0 cnVjdCBtc21fZHNpICptc21fZHNpMCA9IGRzaV9tZ3JfZ2V0X2RzaShEU0lfMCk7CisJc3RydWN0 IG1pcGlfZHNpX2hvc3QgKmhvc3QgPSBtc21fZHNpLT5ob3N0OworCWJvb2wgaXNfcmVhZCA9ICht c2ctPnJ4X2J1ZiAmJiBtc2ctPnJ4X2xlbik7CisJYm9vbCBuZWVkX3N5bmMgPSAoSVNfU1lOQ19O RUVERUQoKSAmJiAhaXNfcmVhZCk7CisJaW50IHJldDsKKworCWlmICghbXNnLT50eF9idWYgfHwg IW1zZy0+dHhfbGVuKQorCQlyZXR1cm4gMDsKKworCS8qIEluIGR1YWwgbWFzdGVyIGNhc2UsIHBh bmVsIHJlcXVpcmVzIHRoZSBzYW1lIGNvbW1hbmRzIHNlbnQgdG8KKwkgKiBib3RoIERTSSBsaW5r cy4gSG9zdCBpc3N1ZXMgdGhlIGNvbW1hbmQgdHJpZ2dlciB0byBib3RoIGxpbmtzCisJICogd2hl biBEU0lfMSBjYWxscyB0aGUgY21kIHRyYW5zZmVyIGZ1bmN0aW9uLCBubyBtYXR0ZXIgaXQgaGFw cGVucworCSAqIGJlZm9yZSBvciBhZnRlciBEU0lfMCBjbWQgdHJhbnNmZXIuCisJICovCisJaWYg KG5lZWRfc3luYyAmJiAoaWQgPT0gRFNJXzApKQorCQlyZXR1cm4gaXNfcmVhZCA/IG1zZy0+cnhf bGVuIDogbXNnLT50eF9sZW47CisKKwlpZiAobmVlZF9zeW5jICYmIG1zbV9kc2kwKSB7CisJCXJl dCA9IG1zbV9kc2lfaG9zdF94ZmVyX3ByZXBhcmUobXNtX2RzaTAtPmhvc3QsIG1zZyk7CisJCWlm IChyZXQpIHsKKwkJCXByX2VycigiJXM6IGZhaWxlZCB0byBwcmVwYXJlIG5vbi10cmlnZ2VyIGhv c3QsICVkXG4iLAorCQkJCV9fZnVuY19fLCByZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0K KwlyZXQgPSBtc21fZHNpX2hvc3RfeGZlcl9wcmVwYXJlKGhvc3QsIG1zZyk7CisJaWYgKHJldCkg eworCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gcHJlcGFyZSBob3N0LCAlZFxuIiwgX19mdW5jX18s IHJldCk7CisJCWdvdG8gcmVzdG9yZV9ob3N0MDsKKwl9CisKKwlyZXQgPSBpc19yZWFkID8gbXNt X2RzaV9ob3N0X2NtZF9yeChob3N0LCBtc2cpIDoKKwkJCW1zbV9kc2lfaG9zdF9jbWRfdHgoaG9z dCwgbXNnKTsKKworCW1zbV9kc2lfaG9zdF94ZmVyX3Jlc3RvcmUoaG9zdCwgbXNnKTsKKworcmVz dG9yZV9ob3N0MDoKKwlpZiAobmVlZF9zeW5jICYmIG1zbV9kc2kwKQorCQltc21fZHNpX2hvc3Rf eGZlcl9yZXN0b3JlKG1zbV9kc2kwLT5ob3N0LCBtc2cpOworCisJcmV0dXJuIHJldDsKK30KKwor Ym9vbCBtc21fZHNpX21hbmFnZXJfY21kX3hmZXJfdHJpZ2dlcihpbnQgaWQsIHUzMiBpb3ZhLCB1 MzIgbGVuKQoreworCXN0cnVjdCBtc21fZHNpICptc21fZHNpID0gZHNpX21ncl9nZXRfZHNpKGlk KTsKKwlzdHJ1Y3QgbXNtX2RzaSAqbXNtX2RzaTAgPSBkc2lfbWdyX2dldF9kc2koRFNJXzApOwor CXN0cnVjdCBtaXBpX2RzaV9ob3N0ICpob3N0ID0gbXNtX2RzaS0+aG9zdDsKKworCWlmIChJU19T WU5DX05FRURFRCgpICYmIChpZCA9PSBEU0lfMCkpCisJCXJldHVybiBmYWxzZTsKKworCWlmIChJ U19TWU5DX05FRURFRCgpICYmIG1zbV9kc2kwKQorCQltc21fZHNpX2hvc3RfY21kX3hmZXJfY29t bWl0KG1zbV9kc2kwLT5ob3N0LCBpb3ZhLCBsZW4pOworCisJbXNtX2RzaV9ob3N0X2NtZF94ZmVy X2NvbW1pdChob3N0LCBpb3ZhLCBsZW4pOworCisJcmV0dXJuIHRydWU7Cit9CisKK2ludCBtc21f ZHNpX21hbmFnZXJfcmVnaXN0ZXIoc3RydWN0IG1zbV9kc2kgKm1zbV9kc2kpCit7CisJc3RydWN0 IG1zbV9kc2lfbWFuYWdlciAqbXNtX2RzaW0gPSAmbXNtX2RzaW1fZ2xiOworCWludCBpZCA9IG1z bV9kc2ktPmlkOworCXN0cnVjdCBtc21fZHNpICpvdGhlcl9kc2kgPSBkc2lfbWdyX2dldF9vdGhl cl9kc2koaWQpOworCWludCByZXQ7CisKKwlpZiAoaWQgPiBEU0lfTUFYKSB7CisJCXByX2Vycigi JXM6IGludmFsaWQgaWQgJWRcbiIsIF9fZnVuY19fLCBpZCk7CisJCXJldHVybiAtRUlOVkFMOwor CX0KKworCWlmIChtc21fZHNpbS0+ZHNpW2lkXSkgeworCQlwcl9lcnIoIiVzOiBkc2klZCBhbHJl YWR5IHJlZ2lzdGVyZWRcbiIsIF9fZnVuY19fLCBpZCk7CisJCXJldHVybiAtRUJVU1k7CisJfQor CisJbXNtX2RzaW0tPmRzaVtpZF0gPSBtc21fZHNpOworCisJcmV0ID0gZHNpX21ncl9wYXJzZV9k dWFsX3BhbmVsKG1zbV9kc2ktPnBkZXYtPmRldi5vZl9ub2RlLCBpZCk7CisJaWYgKHJldCkgewor CQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gcGFyc2UgZHVhbCBwYW5lbCBpbmZvXG4iLCBfX2Z1bmNf Xyk7CisJCXJldHVybiByZXQ7CisJfQorCisJaWYgKCFJU19EVUFMX1BBTkVMKCkpIHsKKwkJcmV0 ID0gbXNtX2RzaV9ob3N0X3JlZ2lzdGVyKG1zbV9kc2ktPmhvc3QsIHRydWUpOworCX0gZWxzZSBp ZiAoIW90aGVyX2RzaSkgeworCQlyZXR1cm4gMDsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgbXNtX2Rz aSAqbWRzaSA9IElTX01BU1RFUl9QQU5FTChpZCkgPworCQkJCQltc21fZHNpIDogb3RoZXJfZHNp OworCQlzdHJ1Y3QgbXNtX2RzaSAqc2RzaSA9IElTX01BU1RFUl9QQU5FTChpZCkgPworCQkJCQlv dGhlcl9kc2kgOiBtc21fZHNpOworCQkvKiBSZWdpc3RlciBzbGF2ZSBob3N0IGZpcnN0LCBzbyB0 aGF0IHNsYXZlIERTSSBkZXZpY2UKKwkJICogaGFzIGEgY2hhbmNlIHRvIHByb2JlLCBhbmQgZG8g bm90IGJsb2NrIHRoZSBtYXN0ZXIKKwkJICogRFNJIGRldmljZSdzIHByb2JlLgorCQkgKiBBbHNv LCBkbyBub3QgY2hlY2sgZGVmZXIgZm9yIHRoZSBzbGF2ZSBob3N0LAorCQkgKiBiZWNhdXNlIG9u bHkgbWFzdGVyIERTSSBkZXZpY2UgYWRkcyB0aGUgcGFuZWwgdG8gZ2xvYmFsCisJCSAqIHBhbmVs IGxpc3QuIFRoZSBwYW5lbCdzIGRldmljZSBpcyB0aGUgbWFzdGVyIERTSSBkZXZpY2UuCisJCSAq LworCQlyZXQgPSBtc21fZHNpX2hvc3RfcmVnaXN0ZXIoc2RzaS0+aG9zdCwgZmFsc2UpOworCQlp ZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwkJcmV0ID0gbXNtX2RzaV9ob3N0X3JlZ2lzdGVyKG1k c2ktPmhvc3QsIHRydWUpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgbXNtX2RzaV9t YW5hZ2VyX3VucmVnaXN0ZXIoc3RydWN0IG1zbV9kc2kgKm1zbV9kc2kpCit7CisJc3RydWN0IG1z bV9kc2lfbWFuYWdlciAqbXNtX2RzaW0gPSAmbXNtX2RzaW1fZ2xiOworCisJbXNtX2RzaV9ob3N0 X3VucmVnaXN0ZXIobXNtX2RzaS0+aG9zdCk7CisJbXNtX2RzaW0tPmRzaVttc21fZHNpLT5pZF0g PSBOVUxMOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL2RzaS9kc2lfcGh5 LmMgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2RzaS9kc2lfcGh5LmMKbmV3IGZpbGUgbW9kZSAxMDA2 NDQKaW5kZXggMDAwMDAwMC4uZjBjZWE4OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1 L2RybS9tc20vZHNpL2RzaV9waHkuYwpAQCAtMCwwICsxLDM1MiBAQAorLyoKKyAqIENvcHlyaWdo dCAoYykgMjAxNSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg KgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRl IGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVy YWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVi bGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9n cmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisg KiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJy YW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQ VVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUg ZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSAiZHNpLmgiCisjaW5jbHVkZSAiZHNpLnhtbC5oIgor CisjZGVmaW5lIGRzaV9waHlfcmVhZChvZmZzZXQpIG1zbV9yZWFkbCgob2Zmc2V0KSkKKyNkZWZp bmUgZHNpX3BoeV93cml0ZShvZmZzZXQsIGRhdGEpIG1zbV93cml0ZWwoKGRhdGEpLCAob2Zmc2V0 KSkKKworc3RydWN0IGRzaV9kcGh5X3RpbWluZyB7CisJdTMyIGNsa19wcmU7CisJdTMyIGNsa19w b3N0OworCXUzMiBjbGtfemVybzsKKwl1MzIgY2xrX3RyYWlsOworCXUzMiBjbGtfcHJlcGFyZTsK Kwl1MzIgaHNfZXhpdDsKKwl1MzIgaHNfemVybzsKKwl1MzIgaHNfcHJlcGFyZTsKKwl1MzIgaHNf dHJhaWw7CisJdTMyIGhzX3Jxc3Q7CisJdTMyIHRhX2dvOworCXUzMiB0YV9zdXJlOworCXUzMiB0 YV9nZXQ7Cit9OworCitzdHJ1Y3QgbXNtX2RzaV9waHkgeworCXZvaWQgX19pb21lbSAqYmFzZTsK Kwl2b2lkIF9faW9tZW0gKnJlZ19iYXNlOworCWludCBpZDsKKwlzdHJ1Y3QgZHNpX2RwaHlfdGlt aW5nIHRpbWluZzsKKwlpbnQgKCplbmFibGUpKHN0cnVjdCBtc21fZHNpX3BoeSAqcGh5LCBib29s IGlzX2R1YWxfcGFuZWwsCisJCWNvbnN0IHVuc2lnbmVkIGxvbmcgYml0X3JhdGUsIGNvbnN0IHVu c2lnbmVkIGxvbmcgZXNjX3JhdGUpOworCWludCAoKmRpc2FibGUpKHN0cnVjdCBtc21fZHNpX3Bo eSAqcGh5KTsKK307CisKKyNkZWZpbmUgU19ESVZfUk9VTkRfVVAobiwgZCkJXAorCSgoKG4pID49 IDApID8gKCgobikgKyAoZCkgLSAxKSAvIChkKSkgOiAoKChuKSAtIChkKSArIDEpIC8gKGQpKSkK Kworc3RhdGljIGlubGluZSBzMzIgbGluZWFyX2ludGVyKHMzMiB0bWF4LCBzMzIgdG1pbiwgczMy IHBlcmNlbnQsCisJCQkJczMyIG1pbl9yZXN1bHQsIGJvb2wgZXZlbikKK3sKKwlzMzIgdjsKKwl2 ID0gKHRtYXggLSB0bWluKSAqIHBlcmNlbnQ7CisJdiA9IFNfRElWX1JPVU5EX1VQKHYsIDEwMCkg KyB0bWluOworCWlmIChldmVuICYmICh2ICYgMHgxKSkKKwkJcmV0dXJuIG1heF90KHMzMiwgbWlu X3Jlc3VsdCwgdiAtIDEpOworCWVsc2UKKwkJcmV0dXJuIG1heF90KHMzMiwgbWluX3Jlc3VsdCwg dik7Cit9CisKK3N0YXRpYyB2b2lkIGRzaV9kcGh5X3RpbWluZ19jYWxjX2Nsa196ZXJvKHN0cnVj dCBkc2lfZHBoeV90aW1pbmcgKnRpbWluZywKKwkJCQkJczMyIHVpLCBzMzIgY29lZmYsIHMzMiBw Y250KQoreworCXMzMiB0bWF4LCB0bWluLCBjbGtfejsKKwlzMzIgdGVtcDsKKworCS8qIHJlc2V0 ICovCisJdGVtcCA9IDMwMCAqIGNvZWZmIC0gKCh0aW1pbmctPmNsa19wcmVwYXJlID4+IDEpICsg MSkgKiAyICogdWk7CisJdG1pbiA9IFNfRElWX1JPVU5EX1VQKHRlbXAsIHVpKSAtIDI7CisJaWYg KHRtaW4gPiAyNTUpIHsKKwkJdG1heCA9IDUxMTsKKwkJY2xrX3ogPSBsaW5lYXJfaW50ZXIoMiAq IHRtaW4sIHRtaW4sIHBjbnQsIDAsIHRydWUpOworCX0gZWxzZSB7CisJCXRtYXggPSAyNTU7CisJ CWNsa196ID0gbGluZWFyX2ludGVyKHRtYXgsIHRtaW4sIHBjbnQsIDAsIHRydWUpOworCX0KKwor CS8qIGFkanVzdCAqLworCXRlbXAgPSAodGltaW5nLT5oc19ycXN0ICsgdGltaW5nLT5jbGtfcHJl cGFyZSArIGNsa196KSAmIDB4NzsKKwl0aW1pbmctPmNsa196ZXJvID0gY2xrX3ogKyA4IC0gdGVt cDsKK30KKworc3RhdGljIGludCBkc2lfZHBoeV90aW1pbmdfY2FsYyhzdHJ1Y3QgZHNpX2RwaHlf dGltaW5nICp0aW1pbmcsCisJY29uc3QgdW5zaWduZWQgbG9uZyBiaXRfcmF0ZSwgY29uc3QgdW5z aWduZWQgbG9uZyBlc2NfcmF0ZSkKK3sKKwlzMzIgdWksIGxweDsKKwlzMzIgdG1heCwgdG1pbjsK KwlzMzIgcGNudDAgPSAxMDsKKwlzMzIgcGNudDEgPSAoYml0X3JhdGUgPiAxMjAwMDAwMDAwKSA/ IDE1IDogMTA7CisJczMyIHBjbnQyID0gMTA7CisJczMyIHBjbnQzID0gKGJpdF9yYXRlID4gMTgw MDAwMDAwKSA/IDEwIDogNDA7CisJczMyIGNvZWZmID0gMTAwMDsgLyogUHJlY2lzaW9uLCBzaG91 bGQgYXZvaWQgb3ZlcmZsb3cgKi8KKwlzMzIgdGVtcDsKKworCWlmICghYml0X3JhdGUgfHwgIWVz Y19yYXRlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXVpID0gbXVsdF9mcmFjKE5TRUNfUEVSX01T RUMsIGNvZWZmLCBiaXRfcmF0ZSAvIDEwMDApOworCWxweCA9IG11bHRfZnJhYyhOU0VDX1BFUl9N U0VDLCBjb2VmZiwgZXNjX3JhdGUgLyAxMDAwKTsKKworCXRtYXggPSBTX0RJVl9ST1VORF9VUCg5 NSAqIGNvZWZmLCB1aSkgLSAyOworCXRtaW4gPSBTX0RJVl9ST1VORF9VUCgzOCAqIGNvZWZmLCB1 aSkgLSAyOworCXRpbWluZy0+Y2xrX3ByZXBhcmUgPSBsaW5lYXJfaW50ZXIodG1heCwgdG1pbiwg cGNudDAsIDAsIHRydWUpOworCisJdGVtcCA9IGxweCAvIHVpOworCWlmICh0ZW1wICYgMHgxKQor CQl0aW1pbmctPmhzX3Jxc3QgPSB0ZW1wOworCWVsc2UKKwkJdGltaW5nLT5oc19ycXN0ID0gbWF4 X3QoczMyLCAwLCB0ZW1wIC0gMik7CisKKwkvKiBDYWxjdWxhdGUgY2xrX3plcm8gYWZ0ZXIgY2xr X3ByZXBhcmUgYW5kIGhzX3Jxc3QgKi8KKwlkc2lfZHBoeV90aW1pbmdfY2FsY19jbGtfemVybyh0 aW1pbmcsIHVpLCBjb2VmZiwgcGNudDIpOworCisJdGVtcCA9IDEwNSAqIGNvZWZmICsgMTIgKiB1 aSAtIDIwICogY29lZmY7CisJdG1heCA9IFNfRElWX1JPVU5EX1VQKHRlbXAsIHVpKSAtIDI7CisJ dG1pbiA9IFNfRElWX1JPVU5EX1VQKDYwICogY29lZmYsIHVpKSAtIDI7CisJdGltaW5nLT5jbGtf dHJhaWwgPSBsaW5lYXJfaW50ZXIodG1heCwgdG1pbiwgcGNudDMsIDAsIHRydWUpOworCisJdGVt cCA9IDg1ICogY29lZmYgKyA2ICogdWk7CisJdG1heCA9IFNfRElWX1JPVU5EX1VQKHRlbXAsIHVp KSAtIDI7CisJdGVtcCA9IDQwICogY29lZmYgKyA0ICogdWk7CisJdG1pbiA9IFNfRElWX1JPVU5E X1VQKHRlbXAsIHVpKSAtIDI7CisJdGltaW5nLT5oc19wcmVwYXJlID0gbGluZWFyX2ludGVyKHRt YXgsIHRtaW4sIHBjbnQxLCAwLCB0cnVlKTsKKworCXRtYXggPSAyNTU7CisJdGVtcCA9ICgodGlt aW5nLT5oc19wcmVwYXJlID4+IDEpICsgMSkgKiAyICogdWkgKyAyICogdWk7CisJdGVtcCA9IDE0 NSAqIGNvZWZmICsgMTAgKiB1aSAtIHRlbXA7CisJdG1pbiA9IFNfRElWX1JPVU5EX1VQKHRlbXAs IHVpKSAtIDI7CisJdGltaW5nLT5oc196ZXJvID0gbGluZWFyX2ludGVyKHRtYXgsIHRtaW4sIHBj bnQyLCAyNCwgdHJ1ZSk7CisKKwl0ZW1wID0gMTA1ICogY29lZmYgKyAxMiAqIHVpIC0gMjAgKiBj b2VmZjsKKwl0bWF4ID0gU19ESVZfUk9VTkRfVVAodGVtcCwgdWkpIC0gMjsKKwl0ZW1wID0gNjAg KiBjb2VmZiArIDQgKiB1aTsKKwl0bWluID0gRElWX1JPVU5EX1VQKHRlbXAsIHVpKSAtIDI7CisJ dGltaW5nLT5oc190cmFpbCA9IGxpbmVhcl9pbnRlcih0bWF4LCB0bWluLCBwY250MywgMCwgdHJ1 ZSk7CisKKwl0bWF4ID0gMjU1OworCXRtaW4gPSBTX0RJVl9ST1VORF9VUCgxMDAgKiBjb2VmZiwg dWkpIC0gMjsKKwl0aW1pbmctPmhzX2V4aXQgPSBsaW5lYXJfaW50ZXIodG1heCwgdG1pbiwgcGNu dDIsIDAsIHRydWUpOworCisJdG1heCA9IDYzOworCXRlbXAgPSAoKHRpbWluZy0+aHNfZXhpdCA+ PiAxKSArIDEpICogMiAqIHVpOworCXRlbXAgPSA2MCAqIGNvZWZmICsgNTIgKiB1aSAtIDI0ICog dWkgLSB0ZW1wOworCXRtaW4gPSBTX0RJVl9ST1VORF9VUCh0ZW1wLCA4ICogdWkpIC0gMTsKKwl0 aW1pbmctPmNsa19wb3N0ID0gbGluZWFyX2ludGVyKHRtYXgsIHRtaW4sIHBjbnQyLCAwLCBmYWxz ZSk7CisKKwl0bWF4ID0gNjM7CisJdGVtcCA9ICgodGltaW5nLT5jbGtfcHJlcGFyZSA+PiAxKSAr IDEpICogMiAqIHVpOworCXRlbXAgKz0gKCh0aW1pbmctPmNsa196ZXJvID4+IDEpICsgMSkgKiAy ICogdWk7CisJdGVtcCArPSA4ICogdWkgKyBscHg7CisJdG1pbiA9IFNfRElWX1JPVU5EX1VQKHRl bXAsIDggKiB1aSkgLSAxOworCWlmICh0bWluID4gdG1heCkgeworCQl0ZW1wID0gbGluZWFyX2lu dGVyKDIgKiB0bWF4LCB0bWluLCBwY250MiwgMCwgZmFsc2UpID4+IDE7CisJCXRpbWluZy0+Y2xr X3ByZSA9IHRlbXAgPj4gMTsKKwkJdGVtcCA9ICgyICogdG1heCAtIHRtaW4pICogcGNudDI7CisJ fSBlbHNlIHsKKwkJdGltaW5nLT5jbGtfcHJlID0gbGluZWFyX2ludGVyKHRtYXgsIHRtaW4sIHBj bnQyLCAwLCBmYWxzZSk7CisJfQorCisJdGltaW5nLT50YV9nbyA9IDM7CisJdGltaW5nLT50YV9z dXJlID0gMDsKKwl0aW1pbmctPnRhX2dldCA9IDQ7CisKKwlEQkcoIlBIWSB0aW1pbmdzOiAlZCwg JWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZCIsCisJCXRpbWluZy0+Y2xrX3ByZSwg dGltaW5nLT5jbGtfcG9zdCwgdGltaW5nLT5jbGtfemVybywKKwkJdGltaW5nLT5jbGtfdHJhaWws IHRpbWluZy0+Y2xrX3ByZXBhcmUsIHRpbWluZy0+aHNfZXhpdCwKKwkJdGltaW5nLT5oc196ZXJv LCB0aW1pbmctPmhzX3ByZXBhcmUsIHRpbWluZy0+aHNfdHJhaWwsCisJCXRpbWluZy0+aHNfcnFz dCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZHNpXzI4bm1fcGh5X3JlZ3VsYXRv cl9jdHJsKHN0cnVjdCBtc21fZHNpX3BoeSAqcGh5LCBib29sIGVuYWJsZSkKK3sKKwl2b2lkIF9f aW9tZW0gKmJhc2UgPSBwaHktPnJlZ19iYXNlOworCisJaWYgKCFlbmFibGUpIHsKKwkJZHNpX3Bo eV93cml0ZShiYXNlICsgUkVHX0RTSV8yOG5tX1BIWV9SRUdVTEFUT1JfQ0FMX1BXUl9DRkcsIDAp OworCQlyZXR1cm47CisJfQorCisJZHNpX3BoeV93cml0ZShiYXNlICsgUkVHX0RTSV8yOG5tX1BI WV9SRUdVTEFUT1JfQ1RSTF8wLCAweDApOworCWRzaV9waHlfd3JpdGUoYmFzZSArIFJFR19EU0lf MjhubV9QSFlfUkVHVUxBVE9SX0NBTF9QV1JfQ0ZHLCAxKTsKKwlkc2lfcGh5X3dyaXRlKGJhc2Ug KyBSRUdfRFNJXzI4bm1fUEhZX1JFR1VMQVRPUl9DVFJMXzUsIDApOworCWRzaV9waHlfd3JpdGUo YmFzZSArIFJFR19EU0lfMjhubV9QSFlfUkVHVUxBVE9SX0NUUkxfMywgMCk7CisJZHNpX3BoeV93 cml0ZShiYXNlICsgUkVHX0RTSV8yOG5tX1BIWV9SRUdVTEFUT1JfQ1RSTF8yLCAweDMpOworCWRz aV9waHlfd3JpdGUoYmFzZSArIFJFR19EU0lfMjhubV9QSFlfUkVHVUxBVE9SX0NUUkxfMSwgMHg5 KTsKKwlkc2lfcGh5X3dyaXRlKGJhc2UgKyBSRUdfRFNJXzI4bm1fUEhZX1JFR1VMQVRPUl9DVFJM XzAsIDB4Nyk7CisJZHNpX3BoeV93cml0ZShiYXNlICsgUkVHX0RTSV8yOG5tX1BIWV9SRUdVTEFU T1JfQ1RSTF80LCAweDIwKTsKK30KKworc3RhdGljIGludCBkc2lfMjhubV9waHlfZW5hYmxlKHN0 cnVjdCBtc21fZHNpX3BoeSAqcGh5LCBib29sIGlzX2R1YWxfcGFuZWwsCisJCWNvbnN0IHVuc2ln bmVkIGxvbmcgYml0X3JhdGUsIGNvbnN0IHVuc2lnbmVkIGxvbmcgZXNjX3JhdGUpCit7CisJc3Ry dWN0IGRzaV9kcGh5X3RpbWluZyAqdGltaW5nID0gJnBoeS0+dGltaW5nOworCWludCBpOworCXZv aWQgX19pb21lbSAqYmFzZSA9IHBoeS0+YmFzZTsKKworCURCRygiIik7CisKKwlpZiAoZHNpX2Rw aHlfdGltaW5nX2NhbGModGltaW5nLCBiaXRfcmF0ZSwgZXNjX3JhdGUpKSB7CisJCXByX2Vycigi JXM6IEQtUEhZIHRpbWluZyBjYWxjdWxhdGlvbiBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJcmV0 dXJuIC1FSU5WQUw7CisJfQorCisJZHNpX3BoeV93cml0ZShiYXNlICsgUkVHX0RTSV8yOG5tX1BI WV9TVFJFTkdUSF8wLCAweGZmKTsKKworCWRzaV8yOG5tX3BoeV9yZWd1bGF0b3JfY3RybChwaHks IHRydWUpOworCisJZHNpX3BoeV93cml0ZShiYXNlICsgUkVHX0RTSV8yOG5tX1BIWV9MRE9fQ05U UkwsIDB4MDApOworCisJZHNpX3BoeV93cml0ZShiYXNlICsgUkVHX0RTSV8yOG5tX1BIWV9USU1J TkdfQ1RSTF8wLAorCQlEU0lfMjhubV9QSFlfVElNSU5HX0NUUkxfMF9DTEtfWkVSTyh0aW1pbmct PmNsa196ZXJvKSk7CisJZHNpX3BoeV93cml0ZShiYXNlICsgUkVHX0RTSV8yOG5tX1BIWV9USU1J TkdfQ1RSTF8xLAorCQlEU0lfMjhubV9QSFlfVElNSU5HX0NUUkxfMV9DTEtfVFJBSUwodGltaW5n LT5jbGtfdHJhaWwpKTsKKwlkc2lfcGh5X3dyaXRlKGJhc2UgKyBSRUdfRFNJXzI4bm1fUEhZX1RJ TUlOR19DVFJMXzIsCisJCURTSV8yOG5tX1BIWV9USU1JTkdfQ1RSTF8yX0NMS19QUkVQQVJFKHRp bWluZy0+Y2xrX3ByZXBhcmUpKTsKKwlpZiAodGltaW5nLT5jbGtfemVybyAmIEJJVCg4KSkKKwkJ ZHNpX3BoeV93cml0ZShiYXNlICsgUkVHX0RTSV8yOG5tX1BIWV9USU1JTkdfQ1RSTF8zLAorCQkJ RFNJXzI4bm1fUEhZX1RJTUlOR19DVFJMXzNfQ0xLX1pFUk9fOCk7CisJZHNpX3BoeV93cml0ZShi YXNlICsgUkVHX0RTSV8yOG5tX1BIWV9USU1JTkdfQ1RSTF80LAorCQlEU0lfMjhubV9QSFlfVElN SU5HX0NUUkxfNF9IU19FWElUKHRpbWluZy0+aHNfZXhpdCkpOworCWRzaV9waHlfd3JpdGUoYmFz ZSArIFJFR19EU0lfMjhubV9QSFlfVElNSU5HX0NUUkxfNSwKKwkJRFNJXzI4bm1fUEhZX1RJTUlO R19DVFJMXzVfSFNfWkVSTyh0aW1pbmctPmhzX3plcm8pKTsKKwlkc2lfcGh5X3dyaXRlKGJhc2Ug KyBSRUdfRFNJXzI4bm1fUEhZX1RJTUlOR19DVFJMXzYsCisJCURTSV8yOG5tX1BIWV9USU1JTkdf Q1RSTF82X0hTX1BSRVBBUkUodGltaW5nLT5oc19wcmVwYXJlKSk7CisJZHNpX3BoeV93cml0ZShi YXNlICsgUkVHX0RTSV8yOG5tX1BIWV9USU1JTkdfQ1RSTF83LAorCQlEU0lfMjhubV9QSFlfVElN SU5HX0NUUkxfN19IU19UUkFJTCh0aW1pbmctPmhzX3RyYWlsKSk7CisJZHNpX3BoeV93cml0ZShi YXNlICsgUkVHX0RTSV8yOG5tX1BIWV9USU1JTkdfQ1RSTF84LAorCQlEU0lfMjhubV9QSFlfVElN SU5HX0NUUkxfOF9IU19SUVNUKHRpbWluZy0+aHNfcnFzdCkpOworCWRzaV9waHlfd3JpdGUoYmFz ZSArIFJFR19EU0lfMjhubV9QSFlfVElNSU5HX0NUUkxfOSwKKwkJRFNJXzI4bm1fUEhZX1RJTUlO R19DVFJMXzlfVEFfR08odGltaW5nLT50YV9nbykgfAorCQlEU0lfMjhubV9QSFlfVElNSU5HX0NU UkxfOV9UQV9TVVJFKHRpbWluZy0+dGFfc3VyZSkpOworCWRzaV9waHlfd3JpdGUoYmFzZSArIFJF R19EU0lfMjhubV9QSFlfVElNSU5HX0NUUkxfMTAsCisJCURTSV8yOG5tX1BIWV9USU1JTkdfQ1RS TF8xMF9UQV9HRVQodGltaW5nLT50YV9nZXQpKTsKKwlkc2lfcGh5X3dyaXRlKGJhc2UgKyBSRUdf RFNJXzI4bm1fUEhZX1RJTUlOR19DVFJMXzExLAorCQlEU0lfMjhubV9QSFlfVElNSU5HX0NUUkxf MTFfVFJJRzNfQ01EKDApKTsKKworCWRzaV9waHlfd3JpdGUoYmFzZSArIFJFR19EU0lfMjhubV9Q SFlfQ1RSTF8xLCAweDAwKTsKKwlkc2lfcGh5X3dyaXRlKGJhc2UgKyBSRUdfRFNJXzI4bm1fUEhZ X0NUUkxfMCwgMHg1Zik7CisKKwlkc2lfcGh5X3dyaXRlKGJhc2UgKyBSRUdfRFNJXzI4bm1fUEhZ X1NUUkVOR1RIXzEsIDB4Nik7CisKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCWRzaV9w aHlfd3JpdGUoYmFzZSArIFJFR19EU0lfMjhubV9QSFlfTE5fQ0ZHXzAoaSksIDApOworCQlkc2lf cGh5X3dyaXRlKGJhc2UgKyBSRUdfRFNJXzI4bm1fUEhZX0xOX0NGR18xKGkpLCAwKTsKKwkJZHNp X3BoeV93cml0ZShiYXNlICsgUkVHX0RTSV8yOG5tX1BIWV9MTl9DRkdfMihpKSwgMCk7CisJCWRz aV9waHlfd3JpdGUoYmFzZSArIFJFR19EU0lfMjhubV9QSFlfTE5fQ0ZHXzMoaSksIDApOworCQlk c2lfcGh5X3dyaXRlKGJhc2UgKyBSRUdfRFNJXzI4bm1fUEhZX0xOX1RFU1RfREFUQVBBVEgoaSks IDApOworCQlkc2lfcGh5X3dyaXRlKGJhc2UgKyBSRUdfRFNJXzI4bm1fUEhZX0xOX0RFQlVHX1NF TChpKSwgMCk7CisJCWRzaV9waHlfd3JpdGUoYmFzZSArIFJFR19EU0lfMjhubV9QSFlfTE5fVEVT VF9TVFJfMChpKSwgMHgxKTsKKwkJZHNpX3BoeV93cml0ZShiYXNlICsgUkVHX0RTSV8yOG5tX1BI WV9MTl9URVNUX1NUUl8xKGkpLCAweDk3KTsKKwl9CisJZHNpX3BoeV93cml0ZShiYXNlICsgUkVH X0RTSV8yOG5tX1BIWV9MTl9DRkdfNCgwKSwgMCk7CisJZHNpX3BoeV93cml0ZShiYXNlICsgUkVH X0RTSV8yOG5tX1BIWV9MTl9DRkdfNCgxKSwgMHg1KTsKKwlkc2lfcGh5X3dyaXRlKGJhc2UgKyBS RUdfRFNJXzI4bm1fUEhZX0xOX0NGR180KDIpLCAweGEpOworCWRzaV9waHlfd3JpdGUoYmFzZSAr IFJFR19EU0lfMjhubV9QSFlfTE5fQ0ZHXzQoMyksIDB4Zik7CisKKwlkc2lfcGh5X3dyaXRlKGJh c2UgKyBSRUdfRFNJXzI4bm1fUEhZX0xOQ0tfQ0ZHXzEsIDB4YzApOworCWRzaV9waHlfd3JpdGUo YmFzZSArIFJFR19EU0lfMjhubV9QSFlfTE5DS19URVNUX1NUUjAsIDB4MSk7CisJZHNpX3BoeV93 cml0ZShiYXNlICsgUkVHX0RTSV8yOG5tX1BIWV9MTkNLX1RFU1RfU1RSMSwgMHhiYik7CisKKwlk c2lfcGh5X3dyaXRlKGJhc2UgKyBSRUdfRFNJXzI4bm1fUEhZX0NUUkxfMCwgMHg1Zik7CisKKwlp ZiAoaXNfZHVhbF9wYW5lbCAmJiAocGh5LT5pZCAhPSBEU0lfQ0xPQ0tfTUFTVEVSKSkKKwkJZHNp X3BoeV93cml0ZShiYXNlICsgUkVHX0RTSV8yOG5tX1BIWV9HTEJMX1RFU1RfQ1RSTCwgMHgwMCk7 CisJZWxzZQorCQlkc2lfcGh5X3dyaXRlKGJhc2UgKyBSRUdfRFNJXzI4bm1fUEhZX0dMQkxfVEVT VF9DVFJMLCAweDAxKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRzaV8yOG5tX3Bo eV9kaXNhYmxlKHN0cnVjdCBtc21fZHNpX3BoeSAqcGh5KQoreworCWRzaV9waHlfd3JpdGUocGh5 LT5iYXNlICsgUkVHX0RTSV8yOG5tX1BIWV9DVFJMXzAsIDApOworCWRzaV8yOG5tX3BoeV9yZWd1 bGF0b3JfY3RybChwaHksIGZhbHNlKTsKKworCS8qCisJICogV2FpdCBmb3IgdGhlIHJlZ2lzdGVy cyB3cml0ZXMgdG8gY29tcGxldGUgaW4gb3JkZXIgdG8KKwkgKiBlbnN1cmUgdGhhdCB0aGUgcGh5 IGlzIGNvbXBsZXRlbHkgZGlzYWJsZWQKKwkgKi8KKwl3bWIoKTsKKworCXJldHVybiAwOworfQor CisjZGVmaW5lIGRzaV9waHlfZnVuY19pbml0KG5hbWUpCVwKKwlkbyB7CVwKKwkJcGh5LT5lbmFi bGUgPSBkc2lfIyNuYW1lIyNfcGh5X2VuYWJsZTsJXAorCQlwaHktPmRpc2FibGUgPSBkc2lfIyNu YW1lIyNfcGh5X2Rpc2FibGU7CVwKKwl9IHdoaWxlICgwKQorCitzdHJ1Y3QgbXNtX2RzaV9waHkg Km1zbV9kc2lfcGh5X2luaXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJCWVudW0g bXNtX2RzaV9waHlfdHlwZSB0eXBlLCBpbnQgaWQpCit7CisJc3RydWN0IG1zbV9kc2lfcGh5ICpw aHk7CisKKwlwaHkgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpwaHkpLCBHRlBf S0VSTkVMKTsKKwlpZiAoIXBoeSkKKwkJcmV0dXJuIE5VTEw7CisKKwlwaHktPmJhc2UgPSBtc21f aW9yZW1hcChwZGV2LCAiZHNpX3BoeSIsICJEU0lfUEhZIik7CisJaWYgKElTX0VSUl9PUl9OVUxM KHBoeS0+YmFzZSkpIHsKKwkJcHJfZXJyKCIlczogZmFpbGVkIHRvIG1hcCBwaHkgYmFzZVxuIiwg X19mdW5jX18pOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcGh5LT5yZWdfYmFzZSA9IG1zbV9pb3Jl bWFwKHBkZXYsICJkc2lfcGh5X3JlZ3VsYXRvciIsICJEU0lfUEhZX1JFRyIpOworCWlmIChJU19F UlJfT1JfTlVMTChwaHktPnJlZ19iYXNlKSkgeworCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gbWFw IHBoeSByZWd1bGF0b3IgYmFzZVxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gTlVMTDsKKwl9CisK Kwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIE1TTV9EU0lfUEhZXzI4Tk06CisJCWRzaV9waHlfZnVu Y19pbml0KDI4bm0pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcl9lcnIoIiVzOiB1bnN1cHBv cnRlZCB0eXBlLCAlZFxuIiwgX19mdW5jX18sIHR5cGUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisK KwlwaHktPmlkID0gaWQ7CisKKwlyZXR1cm4gcGh5OworfQorCitpbnQgbXNtX2RzaV9waHlfZW5h YmxlKHN0cnVjdCBtc21fZHNpX3BoeSAqcGh5LCBib29sIGlzX2R1YWxfcGFuZWwsCisJY29uc3Qg dW5zaWduZWQgbG9uZyBiaXRfcmF0ZSwgY29uc3QgdW5zaWduZWQgbG9uZyBlc2NfcmF0ZSkKK3sK KwlpZiAoIXBoeSB8fCAhcGh5LT5lbmFibGUpCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiBw aHktPmVuYWJsZShwaHksIGlzX2R1YWxfcGFuZWwsIGJpdF9yYXRlLCBlc2NfcmF0ZSk7Cit9CisK K2ludCBtc21fZHNpX3BoeV9kaXNhYmxlKHN0cnVjdCBtc21fZHNpX3BoeSAqcGh5KQoreworCWlm ICghcGh5IHx8ICFwaHktPmRpc2FibGUpCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiBwaHkt PmRpc2FibGUocGh5KTsKK30KKwordm9pZCBtc21fZHNpX3BoeV9nZXRfY2xrX3ByZV9wb3N0KHN0 cnVjdCBtc21fZHNpX3BoeSAqcGh5LAorCXUzMiAqY2xrX3ByZSwgdTMyICpjbGtfcG9zdCkKK3sK KwlpZiAoIXBoeSkKKwkJcmV0dXJuOworCWlmIChjbGtfcHJlKQorCQkqY2xrX3ByZSA9IHBoeS0+ dGltaW5nLmNsa19wcmU7CisJaWYgKGNsa19wb3N0KQorCQkqY2xrX3Bvc3QgPSBwaHktPnRpbWlu Zy5jbGtfcG9zdDsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9tc21fZHJ2 LmggYi9kcml2ZXJzL2dwdS9kcm0vbXNtL21zbV9kcnYuaAppbmRleCA3YjQ2NGRiLi5hMTg2ODNm IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbXNtL21zbV9kcnYuaAorKysgYi9kcml2ZXJz L2dwdS9kcm0vbXNtL21zbV9kcnYuaApAQCAtOTUsNiArOTUsOSBAQCBzdHJ1Y3QgbXNtX2RybV9w cml2YXRlIHsKIAkgKi8KIAlzdHJ1Y3QgbXNtX2RybV9zdWJfZGV2ICplZHA7CiAKKwkvKiBEU0kg aXMgc2hhcmVkIGJ5IG1kcDQgYW5kIG1kcDUgKi8KKwlzdHJ1Y3QgbXNtX2RybV9zdWJfZGV2ICpk c2lbMl07CisKIAkvKiB3aGVuIHdlIGhhdmUgbW9yZSB0aGFuIG9uZSAnbXNtX2dwdScgdGhlc2Ug bmVlZCB0byBiZSBhbiBhcnJheTogKi8KIAlzdHJ1Y3QgbXNtX2dwdSAqZ3B1OwogCXN0cnVjdCBt c21fZmlsZV9wcml2YXRlICpsYXN0Y3R4OwpAQCAtMjQzLDYgKzI0NiwyMyBAQCB2b2lkIF9fZXhp dCBoZG1pX3VucmVnaXN0ZXIodm9pZCk7CiB2b2lkIF9faW5pdCBtc21fZWRwX3JlZ2lzdGVyKHZv aWQpOwogdm9pZCBfX2V4aXQgbXNtX2VkcF91bnJlZ2lzdGVyKHZvaWQpOwogCitlbnVtIG1zbV9k c2lfZW5jb2Rlcl9pZCB7CisJTVNNX0RTSV9WSURFT19FTkNPREVSX0lEID0gMCwKKwlNU01fRFNJ X0NNRF9FTkNPREVSX0lEID0gMSwKKwlNU01fRFNJX0VOQ09ERVJfTlVNID0gMgorfTsKKyNpZmRl ZiBDT05GSUdfRFJNX01TTV9EU0kKK3ZvaWQgX19pbml0IG1zbV9kc2lfcmVnaXN0ZXIodm9pZCk7 Cit2b2lkIF9fZXhpdCBtc21fZHNpX3VucmVnaXN0ZXIodm9pZCk7CisjZWxzZQorc3RhdGljIGlu bGluZSB2b2lkIF9faW5pdCBtc21fZHNpX3JlZ2lzdGVyKHZvaWQpCit7Cit9CitzdGF0aWMgaW5s aW5lIHZvaWQgX19leGl0IG1zbV9kc2lfdW5yZWdpc3Rlcih2b2lkKQoreworfQorI2VuZGlmCisK ICNpZmRlZiBDT05GSUdfREVCVUdfRlMKIHZvaWQgbXNtX2dlbV9kZXNjcmliZShzdHJ1Y3QgZHJt X2dlbV9vYmplY3QgKm9iaiwgc3RydWN0IHNlcV9maWxlICptKTsKIHZvaWQgbXNtX2dlbV9kZXNj cmliZV9vYmplY3RzKHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsIHN0cnVjdCBzZXFfZmlsZSAqbSk7 Ci0tIApUaGUgUXVhbGNvbW0gSW5ub3ZhdGlvbiBDZW50ZXIsIEluYy4gaXMgYSBtZW1iZXIgb2Yg dGhlIENvZGUgQXVyb3JhIEZvcnVtLApob3N0ZWQgYnkgVGhlIExpbnV4IEZvdW5kYXRpb24KCl9f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmRyaS1kZXZlbCBt YWlsaW5nIGxpc3QKZHJpLWRldmVsQGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwOi8vbGlzdHMu ZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vZHJpLWRldmVsCg==