From mboxrd@z Thu Jan 1 00:00:00 1970 From: Hai Li Subject: [PATCH] drm/msm: Initial add DSI connector support (v2) Date: Tue, 24 Mar 2015 16:31:21 -0400 Message-ID: <1427229081-30845-1-git-send-email-hali@codeaurora.org> References: <1426289058-6663-4-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-4-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 dmVyLgoKdjE6IEluaXRpYWwgY2hhbmdlCnYyOiBBZGRyZXNzIGNvbW1lbnRzIGZyb20gQXJjaGl0 ICsgbWlub3IgY2xlYW4tdXBzCgpTaWduZWQtb2ZmLWJ5OiBIYWkgTGkgPGhhbGlAY29kZWF1cm9y YS5vcmc+Ci0tLQogZHJpdmVycy9ncHUvZHJtL21zbS9LY29uZmlnICAgICAgICAgICB8ICAgMTEg KwogZHJpdmVycy9ncHUvZHJtL21zbS9NYWtlZmlsZSAgICAgICAgICB8ICAgIDQgKwogZHJpdmVy cy9ncHUvZHJtL21zbS9kc2kvZHNpLmMgICAgICAgICB8ICAyMTQgKysrKwogZHJpdmVycy9ncHUv ZHJtL21zbS9kc2kvZHNpLmggICAgICAgICB8ICAxMTggKysKIGRyaXZlcnMvZ3B1L2RybS9tc20v ZHNpL2RzaV9ob3N0LmMgICAgfCAxOTkyICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KwogZHJpdmVycy9ncHUvZHJtL21zbS9kc2kvZHNpX21hbmFnZXIuYyB8ICA2OTkgKysrKysrKysr KysrCiBkcml2ZXJzL2dwdS9kcm0vbXNtL2RzaS9kc2lfcGh5LmMgICAgIHwgIDM1MiArKysrKysK IGRyaXZlcnMvZ3B1L2RybS9tc20vbXNtX2Rydi5oICAgICAgICAgfCAgIDIwICsKIDggZmlsZXMg Y2hhbmdlZCwgMzQxMCBpbnNlcnRpb25zKCspCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9n cHUvZHJtL21zbS9kc2kvZHNpLmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dwdS9kcm0v bXNtL2RzaS9kc2kuaAogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1L2RybS9tc20vZHNp L2RzaV9ob3N0LmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dwdS9kcm0vbXNtL2RzaS9k c2lfbWFuYWdlci5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL21zbS9kc2kv ZHNpX3BoeS5jCgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9LY29uZmlnIGIvZHJp dmVycy9ncHUvZHJtL21zbS9LY29uZmlnCmluZGV4IDFlNmE5MDcuLjViYTU2MzEgMTAwNjQ0Ci0t LSBhL2RyaXZlcnMvZ3B1L2RybS9tc20vS2NvbmZpZworKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNt L0tjb25maWcKQEAgLTM1LDMgKzM1LDE0IEBAIGNvbmZpZyBEUk1fTVNNX1JFR0lTVEVSX0xPR0dJ TkcKIAkgIENvbXBpbGUgaW4gc3VwcG9ydCBmb3IgbG9nZ2luZyByZWdpc3RlciByZWFkcy93cml0 ZXMgaW4gYSBmb3JtYXQKIAkgIHRoYXQgY2FuIGJlIHBhcnNlZCBieSBlbnZ5dG9vbHMgZGVtc20g dG9vbC4gIElmIGVuYWJsZWQsIHJlZ2lzdGVyCiAJICBsb2dnaW5nIGNhbiBiZSBzd2l0Y2hlZCBv biB2aWEgbXNtLnJlZ2xvZz15IG1vZHVsZSBwYXJhbS4KKworY29uZmlnIERSTV9NU01fRFNJCisJ Ym9vbCAiRW5hYmxlIERTSSBzdXBwb3J0IGluIE1TTSBEUk0gZHJpdmVyIgorCWRlcGVuZHMgb24g RFJNX01TTQorCXNlbGVjdCBEUk1fUEFORUwKKwlzZWxlY3QgRFJNX01JUElfRFNJCisJZGVmYXVs dCB5CisJaGVscAorCSAgQ2hvb3NlIHRoaXMgb3B0aW9uIGlmIHlvdSBoYXZlIGEgbmVlZCBmb3Ig TUlQSSBEU0kgY29ubmVjdG9yCisJICBzdXBwb3J0LgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dw dS9kcm0vbXNtL01ha2VmaWxlIGIvZHJpdmVycy9ncHUvZHJtL21zbS9NYWtlZmlsZQppbmRleCA2 NzRhMTMyLi41YzE0NGNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbXNtL01ha2VmaWxl CisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vTWFrZWZpbGUKQEAgLTUwLDUgKzUwLDkgQEAgbXNt LXkgOj0gXAogCiBtc20tJChDT05GSUdfRFJNX01TTV9GQkRFVikgKz0gbXNtX2ZiZGV2Lm8KIG1z bS0kKENPTkZJR19DT01NT05fQ0xLKSArPSBtZHAvbWRwNC9tZHA0X2x2ZHNfcGxsLm8KK21zbS0k KENPTkZJR19EUk1fTVNNX0RTSSkgKz0gZHNpL2RzaS5vIFwKKwkJCWRzaS9kc2lfaG9zdC5vIFwK KwkJCWRzaS9kc2lfbWFuYWdlci5vIFwKKwkJCWRzaS9kc2lfcGh5Lm8KIAogb2JqLSQoQ09ORklH X0RSTV9NU00pCSs9IG1zbS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL2RzaS9k c2kuYyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vZHNpL2RzaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0 CmluZGV4IDAwMDAwMDAuLjExMjUyNjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9k cm0vbXNtL2RzaS9kc2kuYwpAQCAtMCwwICsxLDIxNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykg MjAxNSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICog VGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFu ZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVi bGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVk IGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlz IGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQg V0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBv ZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NF LiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWls cy4KKyAqLworCisjaW5jbHVkZSAiZHNpLmgiCisKK3N0cnVjdCBkcm1fZW5jb2RlciAqbXNtX2Rz aV9nZXRfZW5jb2RlcihzdHJ1Y3QgbXNtX2RzaSAqbXNtX2RzaSkKK3sKKwlpZiAoIW1zbV9kc2kg fHwgIW1zbV9kc2ktPnBhbmVsKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiAobXNtX2RzaS0+ cGFuZWxfZmxhZ3MgJiBNSVBJX0RTSV9NT0RFX1ZJREVPKSA/CisJCW1zbV9kc2ktPmJhc2UuZW5j b2RlcnNbTVNNX0RTSV9WSURFT19FTkNPREVSX0lEXSA6CisJCW1zbV9kc2ktPmJhc2UuZW5jb2Rl cnNbTVNNX0RTSV9DTURfRU5DT0RFUl9JRF07Cit9CisKK3N0YXRpYyBpbnQgZHNpX21vZGVzZXRf aW5pdChzdHJ1Y3QgbXNtX2RybV9zdWJfZGV2ICpiYXNlLAorCQkJc3RydWN0IGRybV9kZXZpY2Ug KmRldikKK3sKKwlzdHJ1Y3QgbXNtX2RzaSAqbXNtX2RzaSA9IGNvbnRhaW5lcl9vZihiYXNlLCBz dHJ1Y3QgbXNtX2RzaSwgYmFzZSk7CisJc3RydWN0IG1zbV9kcm1fcHJpdmF0ZSAqcHJpdiA9IGRl di0+ZGV2X3ByaXZhdGU7CisJaW50IHJldCwgaTsKKworCWlmIChXQVJOX09OKChiYXNlLT5udW1f ZW5jb2RlcnMgIT0gTVNNX0RTSV9FTkNPREVSX05VTSkgfHwKKwkJIWJhc2UtPmVuY29kZXJzW01T TV9EU0lfVklERU9fRU5DT0RFUl9JRF0gfHwKKwkJIWJhc2UtPmVuY29kZXJzW01TTV9EU0lfQ01E X0VOQ09ERVJfSURdKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltc21fZHNpLT5kZXYgPSBkZXY7 CisKKwlyZXQgPSBtc21fZHNpX2hvc3RfbW9kZXNldF9pbml0KG1zbV9kc2ktPmhvc3QsIGRldik7 CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldi0+ZGV2LCAiZmFpbGVkIHRvIG1vZGVzZXQgaW5p dCBob3N0OiAlZFxuIiwgcmV0KTsKKwkJZ290byBmYWlsOworCX0KKworCW1zbV9kc2ktPmJyaWRn ZSA9IG1zbV9kc2lfbWFuYWdlcl9icmlkZ2VfaW5pdChtc21fZHNpLT5pZCk7CisJaWYgKElTX0VS Uihtc21fZHNpLT5icmlkZ2UpKSB7CisJCXJldCA9IFBUUl9FUlIobXNtX2RzaS0+YnJpZGdlKTsK KwkJZGV2X2VycihkZXYtPmRldiwgImZhaWxlZCB0byBjcmVhdGUgZHNpIGJyaWRnZTogJWRcbiIs IHJldCk7CisJCW1zbV9kc2ktPmJyaWRnZSA9IE5VTEw7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlt c21fZHNpLT5jb25uZWN0b3IgPSBtc21fZHNpX21hbmFnZXJfY29ubmVjdG9yX2luaXQobXNtX2Rz aS0+aWQpOworCWlmIChJU19FUlIobXNtX2RzaS0+Y29ubmVjdG9yKSkgeworCQlyZXQgPSBQVFJf RVJSKG1zbV9kc2ktPmNvbm5lY3Rvcik7CisJCWRldl9lcnIoZGV2LT5kZXYsICJmYWlsZWQgdG8g Y3JlYXRlIGRzaSBjb25uZWN0b3I6ICVkXG4iLCByZXQpOworCQltc21fZHNpLT5jb25uZWN0b3Ig PSBOVUxMOworCQlnb3RvIGZhaWw7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGJhc2UtPm51bV9l bmNvZGVyczsgaSsrKQorCQliYXNlLT5lbmNvZGVyc1tpXS0+YnJpZGdlID0gbXNtX2RzaS0+YnJp ZGdlOworCisJcHJpdi0+YnJpZGdlc1twcml2LT5udW1fYnJpZGdlcysrXSAgICAgICA9IG1zbV9k c2ktPmJyaWRnZTsKKwlwcml2LT5jb25uZWN0b3JzW3ByaXYtPm51bV9jb25uZWN0b3JzKytdID0g bXNtX2RzaS0+Y29ubmVjdG9yOworCisJcmV0dXJuIDA7CitmYWlsOgorCWlmIChtc21fZHNpKSB7 CisJCS8qIGJyaWRnZS9jb25uZWN0b3IgYXJlIG5vcm1hbGx5IGRlc3Ryb3llZCBieSBkcm06ICov CisJCWlmIChtc21fZHNpLT5icmlkZ2UpIHsKKwkJCW1zbV9kc2lfbWFuYWdlcl9icmlkZ2VfZGVz dHJveShtc21fZHNpLT5icmlkZ2UpOworCQkJbXNtX2RzaS0+YnJpZGdlID0gTlVMTDsKKwkJfQor CQlpZiAobXNtX2RzaS0+Y29ubmVjdG9yKSB7CisJCQltc21fZHNpLT5jb25uZWN0b3ItPmZ1bmNz LT5kZXN0cm95KG1zbV9kc2ktPmNvbm5lY3Rvcik7CisJCQltc21fZHNpLT5jb25uZWN0b3IgPSBO VUxMOworCQl9CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgZHNpX2Rlc3Ry b3koc3RydWN0IG1zbV9kc2kgKm1zbV9kc2kpCit7CisJaWYgKCFtc21fZHNpKQorCQlyZXR1cm47 CisKKwltc21fZHNpX21hbmFnZXJfdW5yZWdpc3Rlcihtc21fZHNpKTsKKwlpZiAobXNtX2RzaS0+ aG9zdCkgeworCQltc21fZHNpX2hvc3RfZGVzdHJveShtc21fZHNpLT5ob3N0KTsKKwkJbXNtX2Rz aS0+aG9zdCA9IE5VTEw7CisJfQorCisJcGxhdGZvcm1fc2V0X2RydmRhdGEobXNtX2RzaS0+cGRl diwgTlVMTCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbXNtX2RzaSAqZHNpX2luaXQoc3RydWN0IHBs YXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgbXNtX2RzaSAqbXNtX2RzaSA9IE5VTEw7 CisJaW50IHJldDsKKworCWlmICghcGRldikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJubyBk c2kgZGV2aWNlXG4iKTsKKwkJcmV0ID0gLUVOWElPOworCQlnb3RvIGZhaWw7CisJfQorCisJbXNt X2RzaSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKm1zbV9kc2kpLCBHRlBfS0VS TkVMKTsKKwlpZiAoIW1zbV9kc2kpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBmYWlsOwor CX0KKwlEQkcoImRzaSBwcm9iZWQ9JXAiLCBtc21fZHNpKTsKKworCW1zbV9kc2ktPnBkZXYgPSBw ZGV2OworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIG1zbV9kc2kpOworCisJLyogSW5pdCBk c2kgaG9zdCAqLworCXJldCA9IG1zbV9kc2lfaG9zdF9pbml0KG1zbV9kc2kpOworCWlmIChyZXQp CisJCWdvdG8gZmFpbDsKKworCS8qIFJlZ2lzdGVyIHRvIGRzaSBtYW5hZ2VyICovCisJcmV0ID0g bXNtX2RzaV9tYW5hZ2VyX3JlZ2lzdGVyKG1zbV9kc2kpOworCWlmIChyZXQpCisJCWdvdG8gZmFp bDsKKworCW1zbV9kc2ktPmJhc2UubW9kZXNldF9pbml0ID0gZHNpX21vZGVzZXRfaW5pdDsKKwor CXJldHVybiBtc21fZHNpOworCitmYWlsOgorCWlmIChtc21fZHNpKQorCQlkc2lfZGVzdHJveSht c21fZHNpKTsKKworCXJldHVybiBFUlJfUFRSKHJldCk7Cit9CisKK3N0YXRpYyBpbnQgZHNpX2Jp bmQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlICptYXN0ZXIsIHZvaWQgKmRhdGEp Cit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRybSA9IGRldl9nZXRfZHJ2ZGF0YShtYXN0ZXIpOwor CXN0cnVjdCBtc21fZHJtX3ByaXZhdGUgKnByaXYgPSBkcm0tPmRldl9wcml2YXRlOworCXN0cnVj dCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1 Y3QgbXNtX2RzaSAqbXNtX2RzaTsKKworCURCRygiIik7CisJbXNtX2RzaSA9IGRzaV9pbml0KHBk ZXYpOworCWlmIChJU19FUlIobXNtX2RzaSkpCisJCXJldHVybiBQVFJfRVJSKG1zbV9kc2kpOwor CisJcHJpdi0+ZHNpW21zbV9kc2ktPmlkXSA9ICZtc21fZHNpLT5iYXNlOworCisJcmV0dXJuIDA7 Cit9CisKK3N0YXRpYyB2b2lkIGRzaV91bmJpbmQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qg ZGV2aWNlICptYXN0ZXIsCisJCXZvaWQgKmRhdGEpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRy bSA9IGRldl9nZXRfZHJ2ZGF0YShtYXN0ZXIpOworCXN0cnVjdCBtc21fZHJtX3ByaXZhdGUgKnBy aXYgPSBkcm0tPmRldl9wcml2YXRlOworCXN0cnVjdCBtc21fZHNpICptc21fZHNpID0gZGV2X2dl dF9kcnZkYXRhKGRldik7CisJaW50IGlkID0gbXNtX2RzaS0+aWQ7CisKKwlpZiAocHJpdi0+ZHNp W2lkXSkgeworCQlkc2lfZGVzdHJveShtc21fZHNpKTsKKwkJcHJpdi0+ZHNpW2lkXSA9IE5VTEw7 CisJfQorfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGNvbXBvbmVudF9vcHMgZHNpX29wcyA9IHsK KwkuYmluZCAgID0gZHNpX2JpbmQsCisJLnVuYmluZCA9IGRzaV91bmJpbmQsCit9OworCitzdGF0 aWMgaW50IGRzaV9kZXZfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwly ZXR1cm4gY29tcG9uZW50X2FkZCgmcGRldi0+ZGV2LCAmZHNpX29wcyk7Cit9CisKK3N0YXRpYyBp bnQgZHNpX2Rldl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlEQkco IiIpOworCWNvbXBvbmVudF9kZWwoJnBkZXYtPmRldiwgJmRzaV9vcHMpOworCXJldHVybiAwOwor fQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBkdF9tYXRjaFtdID0geworCXsg LmNvbXBhdGlibGUgPSAicWNvbSxtZHNzLWRzaS1jdHJsIiB9LAorCXt9Cit9OworCitzdGF0aWMg c3RydWN0IHBsYXRmb3JtX2RyaXZlciBkc2lfZHJpdmVyID0geworCS5wcm9iZSA9IGRzaV9kZXZf cHJvYmUsCisJLnJlbW92ZSA9IGRzaV9kZXZfcmVtb3ZlLAorCS5kcml2ZXIgPSB7CisJCS5uYW1l ID0gIm1zbV9kc2kiLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBkdF9tYXRjaCwKKwl9LAorfTsKKwor dm9pZCBfX2luaXQgbXNtX2RzaV9yZWdpc3Rlcih2b2lkKQoreworCURCRygiIik7CisJcGxhdGZv cm1fZHJpdmVyX3JlZ2lzdGVyKCZkc2lfZHJpdmVyKTsKK30KKwordm9pZCBfX2V4aXQgbXNtX2Rz aV91bnJlZ2lzdGVyKHZvaWQpCit7CisJREJHKCIiKTsKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdp c3RlcigmZHNpX2RyaXZlcik7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20v ZHNpL2RzaS5oIGIvZHJpdmVycy9ncHUvZHJtL21zbS9kc2kvZHNpLmgKbmV3IGZpbGUgbW9kZSAx MDA2NDQKaW5kZXggMDAwMDAwMC4uZjBlMjMyYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMv Z3B1L2RybS9tc20vZHNpL2RzaS5oCkBAIC0wLDAgKzEsMTE4IEBACisvKgorICogQ29weXJpZ2h0 IChjKSAyMDE1LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq CisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUg aXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJh bCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJs aXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dy YW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAq IGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJh bnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBV UlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBk ZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19EU0lfQ09OTkVDVE9SX0hfXworI2RlZmluZSBfX0RT SV9DT05ORUNUT1JfSF9fCisKKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKwor I2luY2x1ZGUgImRybV9jcnRjLmgiCisjaW5jbHVkZSAiZHJtX21pcGlfZHNpLmgiCisjaW5jbHVk ZSAiZHJtX3BhbmVsLmgiCisKKyNpbmNsdWRlICJtc21fZHJ2LmgiCisKKyNkZWZpbmUgRFNJXzAJ MAorI2RlZmluZSBEU0lfMQkxCisjZGVmaW5lIERTSV9NQVgJMgorCisjZGVmaW5lIERTSV9DTE9D S19NQVNURVIJRFNJXzAKKyNkZWZpbmUgRFNJX0NMT0NLX1NMQVZFCQlEU0lfMQorCisjZGVmaW5l IERTSV9MRUZUCQlEU0lfMAorI2RlZmluZSBEU0lfUklHSFQJCURTSV8xCisKKy8qIEFjY29yZGlu ZyB0byB0aGUgY3VycmVudCBkcm0gZnJhbWV3b3JrIHNlcXVlbmNlLCB0YWtlIHRoZSBlbmNvZGVy IG9mCisgKiBEU0lfMSBhcyBtYXN0ZXIgZW5jb2RlcgorICovCisjZGVmaW5lIERTSV9FTkNPREVS X01BU1RFUglEU0lfMQorI2RlZmluZSBEU0lfRU5DT0RFUl9TTEFWRQlEU0lfMAorCitzdHJ1Y3Qg bXNtX2RzaSB7CisJc3RydWN0IG1zbV9kcm1fc3ViX2RldiBiYXNlOworCXN0cnVjdCBkcm1fZGV2 aWNlICpkZXY7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKKworCXN0cnVjdCBkcm1f Y29ubmVjdG9yICpjb25uZWN0b3I7CisJc3RydWN0IGRybV9icmlkZ2UgKmJyaWRnZTsKKworCXN0 cnVjdCBtaXBpX2RzaV9ob3N0ICpob3N0OworCXN0cnVjdCBtc21fZHNpX3BoeSAqcGh5OworCXN0 cnVjdCBkcm1fcGFuZWwgKnBhbmVsOworCXVuc2lnbmVkIGxvbmcgcGFuZWxfZmxhZ3M7CisJYm9v bCBwaHlfZW5hYmxlZDsKKworCS8qIHRoZSBlbmNvZGVyIHdlIGFyZSBob29rZWQgdG8gKG91dHNp ZGUgb2YgZHNpIGJsb2NrKSAqLworCXN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcjsKKworCWlu dCBpZDsKK307CisKKy8qIGRzaSBtYW5hZ2VyICovCitzdHJ1Y3QgZHJtX2JyaWRnZSAqbXNtX2Rz aV9tYW5hZ2VyX2JyaWRnZV9pbml0KHU4IGlkKTsKK3ZvaWQgbXNtX2RzaV9tYW5hZ2VyX2JyaWRn ZV9kZXN0cm95KHN0cnVjdCBkcm1fYnJpZGdlICpicmlkZ2UpOworc3RydWN0IGRybV9jb25uZWN0 b3IgKm1zbV9kc2lfbWFuYWdlcl9jb25uZWN0b3JfaW5pdCh1OCBpZCk7CitpbnQgbXNtX2RzaV9t YW5hZ2VyX3BoeV9lbmFibGUoaW50IGlkLAorCQljb25zdCB1bnNpZ25lZCBsb25nIGJpdF9yYXRl LCBjb25zdCB1bnNpZ25lZCBsb25nIGVzY19yYXRlLAorCQl1MzIgKmNsa19wcmUsIHUzMiAqY2xr X3Bvc3QpOwordm9pZCBtc21fZHNpX21hbmFnZXJfcGh5X2Rpc2FibGUoaW50IGlkKTsKK2ludCBt c21fZHNpX21hbmFnZXJfY21kX3hmZXIoaW50IGlkLCBjb25zdCBzdHJ1Y3QgbWlwaV9kc2lfbXNn ICptc2cpOworYm9vbCBtc21fZHNpX21hbmFnZXJfY21kX3hmZXJfdHJpZ2dlcihpbnQgaWQsIHUz MiBpb3ZhLCB1MzIgbGVuKTsKK2ludCBtc21fZHNpX21hbmFnZXJfcmVnaXN0ZXIoc3RydWN0IG1z bV9kc2kgKm1zbV9kc2kpOwordm9pZCBtc21fZHNpX21hbmFnZXJfdW5yZWdpc3RlcihzdHJ1Y3Qg bXNtX2RzaSAqbXNtX2RzaSk7CisKKy8qIG1zbSBkc2kgKi8KK3N0cnVjdCBkcm1fZW5jb2RlciAq bXNtX2RzaV9nZXRfZW5jb2RlcihzdHJ1Y3QgbXNtX2RzaSAqbXNtX2RzaSk7CisKKy8qIGRzaSBo b3N0ICovCitpbnQgbXNtX2RzaV9ob3N0X3hmZXJfcHJlcGFyZShzdHJ1Y3QgbWlwaV9kc2lfaG9z dCAqaG9zdCwKKwkJCQkJY29uc3Qgc3RydWN0IG1pcGlfZHNpX21zZyAqbXNnKTsKK3ZvaWQgbXNt X2RzaV9ob3N0X3hmZXJfcmVzdG9yZShzdHJ1Y3QgbWlwaV9kc2lfaG9zdCAqaG9zdCwKKwkJCQkJ Y29uc3Qgc3RydWN0IG1pcGlfZHNpX21zZyAqbXNnKTsKK2ludCBtc21fZHNpX2hvc3RfY21kX3R4 KHN0cnVjdCBtaXBpX2RzaV9ob3N0ICpob3N0LAorCQkJCQljb25zdCBzdHJ1Y3QgbWlwaV9kc2lf bXNnICptc2cpOworaW50IG1zbV9kc2lfaG9zdF9jbWRfcngoc3RydWN0IG1pcGlfZHNpX2hvc3Qg Kmhvc3QsCisJCQkJCWNvbnN0IHN0cnVjdCBtaXBpX2RzaV9tc2cgKm1zZyk7Cit2b2lkIG1zbV9k c2lfaG9zdF9jbWRfeGZlcl9jb21taXQoc3RydWN0IG1pcGlfZHNpX2hvc3QgKmhvc3QsCisJCQkJ CXUzMiBpb3ZhLCB1MzIgbGVuKTsKK2ludCBtc21fZHNpX2hvc3RfZW5hYmxlKHN0cnVjdCBtaXBp X2RzaV9ob3N0ICpob3N0KTsKK2ludCBtc21fZHNpX2hvc3RfZGlzYWJsZShzdHJ1Y3QgbWlwaV9k c2lfaG9zdCAqaG9zdCk7CitpbnQgbXNtX2RzaV9ob3N0X3Bvd2VyX29uKHN0cnVjdCBtaXBpX2Rz aV9ob3N0ICpob3N0KTsKK2ludCBtc21fZHNpX2hvc3RfcG93ZXJfb2ZmKHN0cnVjdCBtaXBpX2Rz aV9ob3N0ICpob3N0KTsKK2ludCBtc21fZHNpX2hvc3Rfc2V0X2Rpc3BsYXlfbW9kZShzdHJ1Y3Qg bWlwaV9kc2lfaG9zdCAqaG9zdCwKKwkJCQkJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUp Oworc3RydWN0IGRybV9wYW5lbCAqbXNtX2RzaV9ob3N0X2dldF9wYW5lbChzdHJ1Y3QgbWlwaV9k c2lfaG9zdCAqaG9zdCwKKwkJCQkJdW5zaWduZWQgbG9uZyAqcGFuZWxfZmxhZ3MpOworaW50IG1z bV9kc2lfaG9zdF9yZWdpc3RlcihzdHJ1Y3QgbWlwaV9kc2lfaG9zdCAqaG9zdCwgYm9vbCBjaGVj a19kZWZlcik7Cit2b2lkIG1zbV9kc2lfaG9zdF91bnJlZ2lzdGVyKHN0cnVjdCBtaXBpX2RzaV9o b3N0ICpob3N0KTsKK3ZvaWQgbXNtX2RzaV9ob3N0X2Rlc3Ryb3koc3RydWN0IG1pcGlfZHNpX2hv c3QgKmhvc3QpOworaW50IG1zbV9kc2lfaG9zdF9tb2Rlc2V0X2luaXQoc3RydWN0IG1pcGlfZHNp X2hvc3QgKmhvc3QsCisJCQkJCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworaW50IG1zbV9kc2lf aG9zdF9pbml0KHN0cnVjdCBtc21fZHNpICptc21fZHNpKTsKKworLyogZHNpIHBoeSAqLworc3Ry dWN0IG1zbV9kc2lfcGh5OworZW51bSBtc21fZHNpX3BoeV90eXBlIHsKKwlNU01fRFNJX1BIWV9V TktOT1dOLAorCU1TTV9EU0lfUEhZXzI4Tk0sCisJTVNNX0RTSV9QSFlfTUFYCit9Oworc3RydWN0 IG1zbV9kc2lfcGh5ICptc21fZHNpX3BoeV9pbml0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBk ZXYsCisJCQllbnVtIG1zbV9kc2lfcGh5X3R5cGUgdHlwZSwgaW50IGlkKTsKK2ludCBtc21fZHNp X3BoeV9lbmFibGUoc3RydWN0IG1zbV9kc2lfcGh5ICpwaHksIGJvb2wgaXNfZHVhbF9wYW5lbCwK Kwljb25zdCB1bnNpZ25lZCBsb25nIGJpdF9yYXRlLCBjb25zdCB1bnNpZ25lZCBsb25nIGVzY19y YXRlKTsKK2ludCBtc21fZHNpX3BoeV9kaXNhYmxlKHN0cnVjdCBtc21fZHNpX3BoeSAqcGh5KTsK K3ZvaWQgbXNtX2RzaV9waHlfZ2V0X2Nsa19wcmVfcG9zdChzdHJ1Y3QgbXNtX2RzaV9waHkgKnBo eSwKKwkJCQkJdTMyICpjbGtfcHJlLCB1MzIgKmNsa19wb3N0KTsKKyNlbmRpZiAvKiBfX0RTSV9D T05ORUNUT1JfSF9fICovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vZHNpL2Rz aV9ob3N0LmMgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2RzaS9kc2lfaG9zdC5jCm5ldyBmaWxlIG1v ZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMmQ0ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2 ZXJzL2dwdS9kcm0vbXNtL2RzaS9kc2lfaG9zdC5jCkBAIC0wLDAgKzEsMTk5MiBAQAorLyoKKyAq IENvcHlyaWdodCAoYykgMjAxNSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVz ZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVk aXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUg R05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9u IDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICog VGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1 c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1w bGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFS VElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ug Zm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVk ZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51 eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgv b2ZfZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4 L29mX2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgorI2luY2x1 ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8dmlkZW8vbWlwaV9kaXNwbGF5Lmg+CisK KyNpbmNsdWRlICJkc2kuaCIKKyNpbmNsdWRlICJkc2kueG1sLmgiCisKKyNkZWZpbmUgTVNNX0RT SV9WRVJfTUFKT1JfVjIJMHgwMgorI2RlZmluZSBNU01fRFNJX1ZFUl9NQUpPUl82RwkweDAzCisj ZGVmaW5lIE1TTV9EU0lfNkdfVkVSX01JTk9SX1YxXzAJMHgxMDAwMDAwMAorI2RlZmluZSBNU01f RFNJXzZHX1ZFUl9NSU5PUl9WMV8xCTB4MTAwMTAwMDAKKyNkZWZpbmUgTVNNX0RTSV82R19WRVJf TUlOT1JfVjFfMV8xCTB4MTAwMTAwMDEKKyNkZWZpbmUgTVNNX0RTSV82R19WRVJfTUlOT1JfVjFf MgkweDEwMDIwMDAwCisjZGVmaW5lIE1TTV9EU0lfNkdfVkVSX01JTk9SX1YxXzNfMQkweDEwMDMw MDAxCisKKyNkZWZpbmUgRFNJXzZHX1JFR19TSElGVAk0CisKKyNkZWZpbmUgRFNJX1JFR1VMQVRP Ul9NQVgJOAorc3RydWN0IGRzaV9yZWdfZW50cnkgeworCWNoYXIgbmFtZVszMl07CisJaW50IG1p bl92b2x0YWdlOworCWludCBtYXhfdm9sdGFnZTsKKwlpbnQgZW5hYmxlX2xvYWQ7CisJaW50IGRp c2FibGVfbG9hZDsKK307CisKK3N0cnVjdCBkc2lfcmVnX2NvbmZpZyB7CisJaW50IG51bTsKKwlz dHJ1Y3QgZHNpX3JlZ19lbnRyeSByZWdzW0RTSV9SRUdVTEFUT1JfTUFYXTsKK307CisKK3N0cnVj dCBkc2lfY29uZmlnIHsKKwl1MzIgbWFqb3I7CisJdTMyIG1pbm9yOworCXUzMiBpb19vZmZzZXQ7 CisJZW51bSBtc21fZHNpX3BoeV90eXBlIHBoeV90eXBlOworCXN0cnVjdCBkc2lfcmVnX2NvbmZp ZyByZWdfY2ZnOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBkc2lfY29uZmlnIGRzaV9jZmdz W10gPSB7CisJe01TTV9EU0lfVkVSX01BSk9SX1YyLCAwLCAwLCBNU01fRFNJX1BIWV9VTktOT1dO fSwKKwl7IC8qIDg5NzQgdjEgKi8KKwkJLm1ham9yID0gTVNNX0RTSV9WRVJfTUFKT1JfNkcsCisJ CS5taW5vciA9IE1TTV9EU0lfNkdfVkVSX01JTk9SX1YxXzAsCisJCS5pb19vZmZzZXQgPSBEU0lf NkdfUkVHX1NISUZULAorCQkucGh5X3R5cGUgPSBNU01fRFNJX1BIWV8yOE5NLAorCQkucmVnX2Nm ZyA9IHsKKwkJCS5udW0gPSA0LAorCQkJLnJlZ3MgPSB7CisJCQkJeyJnZHNjIiwgLTEsIC0xLCAt MSwgLTF9LAorCQkJCXsidmRkIiwgMzAwMDAwMCwgMzAwMDAwMCwgMTUwMDAwLCAxMDB9LAorCQkJ CXsidmRkYSIsIDEyMDAwMDAsIDEyMDAwMDAsIDEwMDAwMCwgMTAwfSwKKwkJCQl7InZkZGlvIiwg MTgwMDAwMCwgMTgwMDAwMCwgMTAwMDAwLCAxMDB9LAorCQkJfSwKKwkJfSwKKwl9LAorCXsgLyog ODk3NCB2MiAqLworCQkubWFqb3IgPSBNU01fRFNJX1ZFUl9NQUpPUl82RywKKwkJLm1pbm9yID0g TVNNX0RTSV82R19WRVJfTUlOT1JfVjFfMSwKKwkJLmlvX29mZnNldCA9IERTSV82R19SRUdfU0hJ RlQsCisJCS5waHlfdHlwZSA9IE1TTV9EU0lfUEhZXzI4Tk0sCisJCS5yZWdfY2ZnID0geworCQkJ Lm51bSA9IDQsCisJCQkucmVncyA9IHsKKwkJCQl7Imdkc2MiLCAtMSwgLTEsIC0xLCAtMX0sCisJ CQkJeyJ2ZGQiLCAzMDAwMDAwLCAzMDAwMDAwLCAxNTAwMDAsIDEwMH0sCisJCQkJeyJ2ZGRhIiwg MTIwMDAwMCwgMTIwMDAwMCwgMTAwMDAwLCAxMDB9LAorCQkJCXsidmRkaW8iLCAxODAwMDAwLCAx ODAwMDAwLCAxMDAwMDAsIDEwMH0sCisJCQl9LAorCQl9LAorCX0sCisJeyAvKiA4OTc0IHYzICov CisJCS5tYWpvciA9IE1TTV9EU0lfVkVSX01BSk9SXzZHLAorCQkubWlub3IgPSBNU01fRFNJXzZH X1ZFUl9NSU5PUl9WMV8xXzEsCisJCS5pb19vZmZzZXQgPSBEU0lfNkdfUkVHX1NISUZULAorCQku cGh5X3R5cGUgPSBNU01fRFNJX1BIWV8yOE5NLAorCQkucmVnX2NmZyA9IHsKKwkJCS5udW0gPSA0 LAorCQkJLnJlZ3MgPSB7CisJCQkJeyJnZHNjIiwgLTEsIC0xLCAtMSwgLTF9LAorCQkJCXsidmRk IiwgMzAwMDAwMCwgMzAwMDAwMCwgMTUwMDAwLCAxMDB9LAorCQkJCXsidmRkYSIsIDEyMDAwMDAs IDEyMDAwMDAsIDEwMDAwMCwgMTAwfSwKKwkJCQl7InZkZGlvIiwgMTgwMDAwMCwgMTgwMDAwMCwg MTAwMDAwLCAxMDB9LAorCQkJfSwKKwkJfSwKKwl9LAorCXsgLyogODA4NCAqLworCQkubWFqb3Ig PSBNU01fRFNJX1ZFUl9NQUpPUl82RywKKwkJLm1pbm9yID0gTVNNX0RTSV82R19WRVJfTUlOT1Jf VjFfMiwKKwkJLmlvX29mZnNldCA9IERTSV82R19SRUdfU0hJRlQsCisJCS5waHlfdHlwZSA9IE1T TV9EU0lfUEhZXzI4Tk0sCisJCS5yZWdfY2ZnID0geworCQkJLm51bSA9IDQsCisJCQkucmVncyA9 IHsKKwkJCQl7Imdkc2MiLCAtMSwgLTEsIC0xLCAtMX0sCisJCQkJeyJ2ZGQiLCAzMDAwMDAwLCAz MDAwMDAwLCAxNTAwMDAsIDEwMH0sCisJCQkJeyJ2ZGRhIiwgMTIwMDAwMCwgMTIwMDAwMCwgMTAw MDAwLCAxMDB9LAorCQkJCXsidmRkaW8iLCAxODAwMDAwLCAxODAwMDAwLCAxMDAwMDAsIDEwMH0s CisJCQl9LAorCQl9LAorCX0sCisJeyAvKiA4OTE2ICovCisJCS5tYWpvciA9IE1TTV9EU0lfVkVS X01BSk9SXzZHLAorCQkubWlub3IgPSBNU01fRFNJXzZHX1ZFUl9NSU5PUl9WMV8zXzEsCisJCS5p b19vZmZzZXQgPSBEU0lfNkdfUkVHX1NISUZULAorCQkucGh5X3R5cGUgPSBNU01fRFNJX1BIWV8y OE5NLAorCQkucmVnX2NmZyA9IHsKKwkJCS5udW0gPSA0LAorCQkJLnJlZ3MgPSB7CisJCQkJeyJn ZHNjIiwgLTEsIC0xLCAtMSwgLTF9LAorCQkJCXsidmRkIiwgMjg1MDAwMCwgMjg1MDAwMCwgMTAw MDAwLCAxMDB9LAorCQkJCXsidmRkYSIsIDEyMDAwMDAsIDEyMDAwMDAsIDEwMDAwMCwgMTAwfSwK KwkJCQl7InZkZGlvIiwgMTgwMDAwMCwgMTgwMDAwMCwgMTAwMDAwLCAxMDB9LAorCQkJfSwKKwkJ fSwKKwl9LAorfTsKKworc3RhdGljIGludCBkc2lfZ2V0X3ZlcnNpb24oY29uc3Qgdm9pZCBfX2lv bWVtICpiYXNlLCB1MzIgKm1ham9yLCB1MzIgKm1pbm9yKQoreworCXUzMiB2ZXI7CisJdTMyIHZl cl82ZzsKKworCWlmICghbWFqb3IgfHwgIW1pbm9yKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8q IEZyb20gRFNJNkcodjMpLCBhZGRpdGlvbiBvZiBhIDZHX0hXX1ZFUlNJT04gcmVnaXN0ZXIgYXQg b2Zmc2V0IDAKKwkgKiBtYWtlcyBhbGwgb3RoZXIgcmVnaXN0ZXJzIDQtYnl0ZSBzaGlmdGVkIGRv d24uCisJICovCisJdmVyXzZnID0gbXNtX3JlYWRsKGJhc2UgKyBSRUdfRFNJXzZHX0hXX1ZFUlNJ T04pOworCWlmICh2ZXJfNmcgPT0gMCkgeworCQl2ZXIgPSBtc21fcmVhZGwoYmFzZSArIFJFR19E U0lfVkVSU0lPTik7CisJCXZlciA9IEZJRUxEKHZlciwgRFNJX1ZFUlNJT05fTUFKT1IpOworCQlp ZiAodmVyIDw9IE1TTV9EU0lfVkVSX01BSk9SX1YyKSB7CisJCQkvKiBvbGQgdmVyc2lvbnMgKi8K KwkJCSptYWpvciA9IHZlcjsKKwkJCSptaW5vciA9IDA7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNl IHsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfSBlbHNlIHsKKwkJdmVyID0gbXNtX3JlYWRs KGJhc2UgKyBEU0lfNkdfUkVHX1NISUZUICsgUkVHX0RTSV9WRVJTSU9OKTsKKwkJdmVyID0gRklF TEQodmVyLCBEU0lfVkVSU0lPTl9NQUpPUik7CisJCWlmICh2ZXIgPT0gTVNNX0RTSV9WRVJfTUFK T1JfNkcpIHsKKwkJCS8qIDZHIHZlcnNpb24gKi8KKwkJCSptYWpvciA9IHZlcjsKKwkJCSptaW5v ciA9IHZlcl82ZzsKKwkJCXJldHVybiAwOworCQl9IGVsc2UgeworCQkJcmV0dXJuIC1FSU5WQUw7 CisJCX0KKwl9Cit9CisKKyNkZWZpbmUgRFNJX0VSUl9TVEFURV9BQ0sJCQkweDAwMDAKKyNkZWZp bmUgRFNJX0VSUl9TVEFURV9USU1FT1VUCQkJMHgwMDAxCisjZGVmaW5lIERTSV9FUlJfU1RBVEVf RExOMF9QSFkJCQkweDAwMDIKKyNkZWZpbmUgRFNJX0VSUl9TVEFURV9GSUZPCQkJMHgwMDA0Cisj ZGVmaW5lIERTSV9FUlJfU1RBVEVfTURQX0ZJRk9fVU5ERVJGTE9XCTB4MDAwOAorI2RlZmluZSBE U0lfRVJSX1NUQVRFX0lOVEVSTEVBVkVfT1BfQ09OVEVOVElPTgkweDAwMTAKKyNkZWZpbmUgRFNJ X0VSUl9TVEFURV9QTExfVU5MT0NLRUQJCTB4MDAyMAorCisjZGVmaW5lIERTSV9DTEtfQ1RSTF9F TkFCTEVfQ0xLUwlcCisJCShEU0lfQ0xLX0NUUkxfQUhCU19IQ0xLX09OIHwgRFNJX0NMS19DVFJM X0FIQk1fU0NMS19PTiB8IFwKKwkJRFNJX0NMS19DVFJMX1BDTEtfT04gfCBEU0lfQ0xLX0NUUkxf RFNJQ0xLX09OIHwgXAorCQlEU0lfQ0xLX0NUUkxfQllURUNMS19PTiB8IERTSV9DTEtfQ1RSTF9F U0NDTEtfT04gfCBcCisJCURTSV9DTEtfQ1RSTF9GT1JDRV9PTl9EWU5fQUhCTV9IQ0xLKQorCitz dHJ1Y3QgbXNtX2RzaV9ob3N0IHsKKwlzdHJ1Y3QgbWlwaV9kc2lfaG9zdCBiYXNlOworCisJc3Ry dWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2OworCisJ aW50IGlkOworCisJdm9pZCBfX2lvbWVtICpjdHJsX2Jhc2U7CisJc3RydWN0IHJlZ3VsYXRvcl9i dWxrX2RhdGEgc3VwcGxpZXNbRFNJX1JFR1VMQVRPUl9NQVhdOworCXN0cnVjdCBjbGsgKm1kcF9j b3JlX2NsazsKKwlzdHJ1Y3QgY2xrICphaGJfY2xrOworCXN0cnVjdCBjbGsgKmF4aV9jbGs7CisJ c3RydWN0IGNsayAqbW1zc19taXNjX2FoYl9jbGs7CisJc3RydWN0IGNsayAqYnl0ZV9jbGs7CisJ c3RydWN0IGNsayAqZXNjX2NsazsKKwlzdHJ1Y3QgY2xrICpwaXhlbF9jbGs7CisJdTMyIGJ5dGVf Y2xrX3JhdGU7CisKKwlzdHJ1Y3QgZ3Bpb19kZXNjICpkaXNwX2VuX2dwaW87CisJc3RydWN0IGdw aW9fZGVzYyAqdGVfZ3BpbzsKKworCWNvbnN0IHN0cnVjdCBkc2lfY29uZmlnICpjZmc7CisKKwlz dHJ1Y3QgY29tcGxldGlvbiBkbWFfY29tcDsKKwlzdHJ1Y3QgY29tcGxldGlvbiB2aWRlb19jb21w OworCXN0cnVjdCBtdXRleCBkZXZfbXV0ZXg7CisJc3RydWN0IG11dGV4IGNtZF9tdXRleDsKKwlz dHJ1Y3QgbXV0ZXggY2xrX211dGV4OworCXNwaW5sb2NrX3QgaW50cl9sb2NrOyAvKiBQcm90ZWN0 IGludGVycnVwdCBjdHJsIHJlZ2lzdGVyICovCisKKwl1MzIgZXJyX3dvcmtfc3RhdGU7CisJc3Ry dWN0IHdvcmtfc3RydWN0IGVycl93b3JrOworCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3b3Jr cXVldWU7CisKKwlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKnR4X2dlbV9vYmo7CisJdTggKnJ4X2J1 ZjsKKworCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlOworCisJLyogUGFuZWwgaW5mbyAq LworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcGFuZWxfbm9kZTsKKwl1bnNpZ25lZCBpbnQgY2hhbm5l bDsKKwl1bnNpZ25lZCBpbnQgbGFuZXM7CisJZW51bSBtaXBpX2RzaV9waXhlbF9mb3JtYXQgZm9y bWF0OworCXVuc2lnbmVkIGxvbmcgbW9kZV9mbGFnczsKKworCXUzMiBkbWFfY21kX2N0cmxfcmVz dG9yZTsKKworCWJvb2wgcmVnaXN0ZXJlZDsKKwlib29sIHBvd2VyX29uOworCWludCBpcnE7Cit9 OworCitzdGF0aWMgdTMyIGRzaV9nZXRfYnBwKGNvbnN0IGVudW0gbWlwaV9kc2lfcGl4ZWxfZm9y bWF0IGZtdCkKK3sKKwlzd2l0Y2ggKGZtdCkgeworCWNhc2UgTUlQSV9EU0lfRk1UX1JHQjU2NToJ CXJldHVybiAxNjsKKwljYXNlIE1JUElfRFNJX0ZNVF9SR0I2NjZfUEFDS0VEOglyZXR1cm4gMTg7 CisJY2FzZSBNSVBJX0RTSV9GTVRfUkdCNjY2OgorCWNhc2UgTUlQSV9EU0lfRk1UX1JHQjg4ODoK KwlkZWZhdWx0OgkJCQlyZXR1cm4gMjQ7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHUzMiBkc2lf cmVhZChzdHJ1Y3QgbXNtX2RzaV9ob3N0ICptc21faG9zdCwgdTMyIHJlZykKK3sKKwlyZXR1cm4g bXNtX3JlYWRsKG1zbV9ob3N0LT5jdHJsX2Jhc2UgKyBtc21faG9zdC0+Y2ZnLT5pb19vZmZzZXQg KyByZWcpOworfQorc3RhdGljIGlubGluZSB2b2lkIGRzaV93cml0ZShzdHJ1Y3QgbXNtX2RzaV9o b3N0ICptc21faG9zdCwgdTMyIHJlZywgdTMyIGRhdGEpCit7CisJbXNtX3dyaXRlbChkYXRhLCBt c21faG9zdC0+Y3RybF9iYXNlICsgbXNtX2hvc3QtPmNmZy0+aW9fb2Zmc2V0ICsgcmVnKTsKK30K Kworc3RhdGljIGludCBkc2lfaG9zdF9yZWd1bGF0b3JfZW5hYmxlKHN0cnVjdCBtc21fZHNpX2hv c3QgKm1zbV9ob3N0KTsKK3N0YXRpYyB2b2lkIGRzaV9ob3N0X3JlZ3VsYXRvcl9kaXNhYmxlKHN0 cnVjdCBtc21fZHNpX2hvc3QgKm1zbV9ob3N0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBkc2lf Y29uZmlnICpkc2lfZ2V0X2NvbmZpZyhzdHJ1Y3QgbXNtX2RzaV9ob3N0ICptc21faG9zdCkKK3sK Kwljb25zdCBzdHJ1Y3QgZHNpX2NvbmZpZyAqY2ZnOworCXN0cnVjdCByZWd1bGF0b3IgKmdkc2Nf cmVnOworCWludCBpLCByZXQ7CisJdTMyIG1ham9yLCBtaW5vcjsKKworCWdkc2NfcmVnID0gcmVn dWxhdG9yX2dldCgmbXNtX2hvc3QtPnBkZXYtPmRldiwgImdkc2MiKTsKKwlpZiAoSVNfRVJSX09S X05VTEwoZ2RzY19yZWcpKSB7CisJCXByX2VycigiJXM6IGNhbm5vdCBnZXQgZ2RzY1xuIiwgX19m dW5jX18pOworCQlnb3RvIGZhaWw7CisJfQorCXJldCA9IHJlZ3VsYXRvcl9lbmFibGUoZ2RzY19y ZWcpOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCIlczogdW5hYmxlIHRvIGVuYWJsZSBnZHNjXG4i LCBfX2Z1bmNfXyk7CisJCXJlZ3VsYXRvcl9wdXQoZ2RzY19yZWcpOworCQlnb3RvIGZhaWw7CisJ fQorCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShtc21faG9zdC0+YWhiX2Nsayk7CisJaWYgKHJl dCkgeworCQlwcl9lcnIoIiVzOiB1bmFibGUgdG8gZW5hYmxlIGFoYl9jbGtcbiIsIF9fZnVuY19f KTsKKwkJcmVndWxhdG9yX2Rpc2FibGUoZ2RzY19yZWcpOworCQlyZWd1bGF0b3JfcHV0KGdkc2Nf cmVnKTsKKwkJZ290byBmYWlsOworCX0KKworCXJldCA9IGRzaV9nZXRfdmVyc2lvbihtc21faG9z dC0+Y3RybF9iYXNlLCAmbWFqb3IsICZtaW5vcik7CisKKwljbGtfZGlzYWJsZV91bnByZXBhcmUo bXNtX2hvc3QtPmFoYl9jbGspOworCXJlZ3VsYXRvcl9kaXNhYmxlKGdkc2NfcmVnKTsKKwlyZWd1 bGF0b3JfcHV0KGdkc2NfcmVnKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiJXM6IEludmFsaWQg dmVyc2lvblxuIiwgX19mdW5jX18pOworCQlnb3RvIGZhaWw7CisJfQorCisJZm9yIChpID0gMDsg aSA8IEFSUkFZX1NJWkUoZHNpX2NmZ3MpOyBpKyspIHsKKwkJY2ZnID0gZHNpX2NmZ3MgKyBpOwor CQlpZiAoKGNmZy0+bWFqb3IgPT0gbWFqb3IpICYmIChjZmctPm1pbm9yID09IG1pbm9yKSkKKwkJ CXJldHVybiBjZmc7CisJfQorCXByX2VycigiJXM6IFZlcnNpb24gJXg6JXggbm90IHN1cHBvcnRc biIsIF9fZnVuY19fLCBtYWpvciwgbWlub3IpOworCitmYWlsOgorCXJldHVybiBOVUxMOworfQor CitzdGF0aWMgaW5saW5lIHN0cnVjdCBtc21fZHNpX2hvc3QgKnRvX21zbV9kc2lfaG9zdChzdHJ1 Y3QgbWlwaV9kc2lfaG9zdCAqaG9zdCkKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKGhvc3QsIHN0 cnVjdCBtc21fZHNpX2hvc3QsIGJhc2UpOworfQorCitzdGF0aWMgdm9pZCBkc2lfaG9zdF9yZWd1 bGF0b3JfZGlzYWJsZShzdHJ1Y3QgbXNtX2RzaV9ob3N0ICptc21faG9zdCkKK3sKKwlzdHJ1Y3Qg cmVndWxhdG9yX2J1bGtfZGF0YSAqcyA9IG1zbV9ob3N0LT5zdXBwbGllczsKKwljb25zdCBzdHJ1 Y3QgZHNpX3JlZ19lbnRyeSAqcmVncyA9IG1zbV9ob3N0LT5jZmctPnJlZ19jZmcucmVnczsKKwlp bnQgbnVtID0gbXNtX2hvc3QtPmNmZy0+cmVnX2NmZy5udW07CisJaW50IGk7CisKKwlEQkcoIiIp OworCWZvciAoaSA9IG51bSAtIDE7IGkgPj0gMDsgaS0tKQorCQlpZiAocmVnc1tpXS5kaXNhYmxl X2xvYWQgPj0gMCkKKwkJCXJlZ3VsYXRvcl9zZXRfb3B0aW11bV9tb2RlKHNbaV0uY29uc3VtZXIs CisJCQkJCQlyZWdzW2ldLmRpc2FibGVfbG9hZCk7CisKKwlyZWd1bGF0b3JfYnVsa19kaXNhYmxl KG51bSwgcyk7Cit9CisKK3N0YXRpYyBpbnQgZHNpX2hvc3RfcmVndWxhdG9yX2VuYWJsZShzdHJ1 Y3QgbXNtX2RzaV9ob3N0ICptc21faG9zdCkKK3sKKwlzdHJ1Y3QgcmVndWxhdG9yX2J1bGtfZGF0 YSAqcyA9IG1zbV9ob3N0LT5zdXBwbGllczsKKwljb25zdCBzdHJ1Y3QgZHNpX3JlZ19lbnRyeSAq cmVncyA9IG1zbV9ob3N0LT5jZmctPnJlZ19jZmcucmVnczsKKwlpbnQgbnVtID0gbXNtX2hvc3Qt PmNmZy0+cmVnX2NmZy5udW07CisJaW50IHJldCwgaTsKKworCURCRygiIik7CisJZm9yIChpID0g MDsgaSA8IG51bTsgaSsrKSB7CisJCWlmIChyZWdzW2ldLmVuYWJsZV9sb2FkID49IDApIHsKKwkJ CXJldCA9IHJlZ3VsYXRvcl9zZXRfb3B0aW11bV9tb2RlKHNbaV0uY29uc3VtZXIsCisJCQkJCQkJ cmVnc1tpXS5lbmFibGVfbG9hZCk7CisJCQlpZiAocmV0IDwgMCkgeworCQkJCXByX2VycigicmVn dWxhdG9yICVkIHNldCBvcCBtb2RlIGZhaWxlZCwgJWRcbiIsCisJCQkJCWksIHJldCk7CisJCQkJ Z290byBmYWlsOworCQkJfQorCQl9CisJfQorCisJcmV0ID0gcmVndWxhdG9yX2J1bGtfZW5hYmxl KG51bSwgcyk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCJyZWd1bGF0b3IgZW5hYmxlIGZh aWxlZCwgJWRcbiIsIHJldCk7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlyZXR1cm4gMDsKKworZmFp bDoKKwlmb3IgKGktLTsgaSA+PSAwOyBpLS0pCisJCXJlZ3VsYXRvcl9zZXRfb3B0aW11bV9tb2Rl KHNbaV0uY29uc3VtZXIsIHJlZ3NbaV0uZGlzYWJsZV9sb2FkKTsKKwlyZXR1cm4gcmV0OworfQor CitzdGF0aWMgaW50IGRzaV9yZWd1bGF0b3JfaW5pdChzdHJ1Y3QgbXNtX2RzaV9ob3N0ICptc21f aG9zdCkKK3sKKwlzdHJ1Y3QgcmVndWxhdG9yX2J1bGtfZGF0YSAqcyA9IG1zbV9ob3N0LT5zdXBw bGllczsKKwljb25zdCBzdHJ1Y3QgZHNpX3JlZ19lbnRyeSAqcmVncyA9IG1zbV9ob3N0LT5jZmct PnJlZ19jZmcucmVnczsKKwlpbnQgbnVtID0gbXNtX2hvc3QtPmNmZy0+cmVnX2NmZy5udW07CisJ aW50IGksIHJldDsKKworCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykKKwkJc1tpXS5zdXBwbHkg PSByZWdzW2ldLm5hbWU7CisKKwlyZXQgPSBkZXZtX3JlZ3VsYXRvcl9idWxrX2dldCgmbXNtX2hv c3QtPnBkZXYtPmRldiwgbnVtLCBzKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoIiVzOiBm YWlsZWQgdG8gaW5pdCByZWd1bGF0b3IsIHJldD0lZFxuIiwKKwkJCQkJCV9fZnVuY19fLCByZXQp OworCQlyZXR1cm4gcmV0OworCX0KKworCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgeworCQlp ZiAoKHJlZ3NbaV0ubWluX3ZvbHRhZ2UgPj0gMCkgJiYgKHJlZ3NbaV0ubWF4X3ZvbHRhZ2UgPj0g MCkpIHsKKwkJCXJldCA9IHJlZ3VsYXRvcl9zZXRfdm9sdGFnZShzW2ldLmNvbnN1bWVyLAorCQkJ CXJlZ3NbaV0ubWluX3ZvbHRhZ2UsIHJlZ3NbaV0ubWF4X3ZvbHRhZ2UpOworCQkJaWYgKHJldCA8 IDApIHsKKwkJCQlwcl9lcnIoInJlZ3VsYXRvciAlZCBzZXQgdm9sdGFnZSBmYWlsZWQsICVkXG4i LAorCQkJCQlpLCByZXQpOworCQkJCXJldHVybiByZXQ7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1 cm4gMDsKK30KKworc3RhdGljIGludCBkc2lfY2xrX2luaXQoc3RydWN0IG1zbV9kc2lfaG9zdCAq bXNtX2hvc3QpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJm1zbV9ob3N0LT5wZGV2LT5kZXY7 CisJaW50IHJldCA9IDA7CisKKwltc21faG9zdC0+bWRwX2NvcmVfY2xrID0gZGV2bV9jbGtfZ2V0 KGRldiwgIm1kcF9jb3JlX2NsayIpOworCWlmIChJU19FUlIobXNtX2hvc3QtPm1kcF9jb3JlX2Ns aykpIHsKKwkJcmV0ID0gUFRSX0VSUihtc21faG9zdC0+bWRwX2NvcmVfY2xrKTsKKwkJcHJfZXJy KCIlczogVW5hYmxlIHRvIGdldCBtZHAgY29yZSBjbGsuIHJldD0lZFxuIiwKKwkJCV9fZnVuY19f LCByZXQpOworCQlnb3RvIGV4aXQ7CisJfQorCisJbXNtX2hvc3QtPmFoYl9jbGsgPSBkZXZtX2Ns a19nZXQoZGV2LCAiaWZhY2VfY2xrIik7CisJaWYgKElTX0VSUihtc21faG9zdC0+YWhiX2Nsaykp IHsKKwkJcmV0ID0gUFRSX0VSUihtc21faG9zdC0+YWhiX2Nsayk7CisJCXByX2VycigiJXM6IFVu YWJsZSB0byBnZXQgbWRzcyBhaGIgY2xrLiByZXQ9JWRcbiIsCisJCQlfX2Z1bmNfXywgcmV0KTsK KwkJZ290byBleGl0OworCX0KKworCW1zbV9ob3N0LT5heGlfY2xrID0gZGV2bV9jbGtfZ2V0KGRl diwgImJ1c19jbGsiKTsKKwlpZiAoSVNfRVJSKG1zbV9ob3N0LT5heGlfY2xrKSkgeworCQlyZXQg PSBQVFJfRVJSKG1zbV9ob3N0LT5heGlfY2xrKTsKKwkJcHJfZXJyKCIlczogVW5hYmxlIHRvIGdl dCBheGkgYnVzIGNsay4gcmV0PSVkXG4iLAorCQkJX19mdW5jX18sIHJldCk7CisJCWdvdG8gZXhp dDsKKwl9CisKKwltc21faG9zdC0+bW1zc19taXNjX2FoYl9jbGsgPSBkZXZtX2Nsa19nZXQoZGV2 LCAiY29yZV9tbXNzX2NsayIpOworCWlmIChJU19FUlIobXNtX2hvc3QtPm1tc3NfbWlzY19haGJf Y2xrKSkgeworCQlyZXQgPSBQVFJfRVJSKG1zbV9ob3N0LT5tbXNzX21pc2NfYWhiX2Nsayk7CisJ CXByX2VycigiJXM6IFVuYWJsZSB0byBnZXQgbW1zcyBtaXNjIGFoYiBjbGsuIHJldD0lZFxuIiwK KwkJCV9fZnVuY19fLCByZXQpOworCQlnb3RvIGV4aXQ7CisJfQorCisJbXNtX2hvc3QtPmJ5dGVf Y2xrID0gZGV2bV9jbGtfZ2V0KGRldiwgImJ5dGVfY2xrIik7CisJaWYgKElTX0VSUihtc21faG9z dC0+Ynl0ZV9jbGspKSB7CisJCXJldCA9IFBUUl9FUlIobXNtX2hvc3QtPmJ5dGVfY2xrKTsKKwkJ cHJfZXJyKCIlczogY2FuJ3QgZmluZCBkc2lfYnl0ZV9jbGsuIHJldD0lZFxuIiwKKwkJCV9fZnVu Y19fLCByZXQpOworCQltc21faG9zdC0+Ynl0ZV9jbGsgPSBOVUxMOworCQlnb3RvIGV4aXQ7CisJ fQorCisJbXNtX2hvc3QtPnBpeGVsX2NsayA9IGRldm1fY2xrX2dldChkZXYsICJwaXhlbF9jbGsi KTsKKwlpZiAoSVNfRVJSKG1zbV9ob3N0LT5waXhlbF9jbGspKSB7CisJCXJldCA9IFBUUl9FUlIo bXNtX2hvc3QtPnBpeGVsX2Nsayk7CisJCXByX2VycigiJXM6IGNhbid0IGZpbmQgZHNpX3BpeGVs X2Nsay4gcmV0PSVkXG4iLAorCQkJX19mdW5jX18sIHJldCk7CisJCW1zbV9ob3N0LT5waXhlbF9j bGsgPSBOVUxMOworCQlnb3RvIGV4aXQ7CisJfQorCisJbXNtX2hvc3QtPmVzY19jbGsgPSBkZXZt X2Nsa19nZXQoZGV2LCAiY29yZV9jbGsiKTsKKwlpZiAoSVNfRVJSKG1zbV9ob3N0LT5lc2NfY2xr KSkgeworCQlyZXQgPSBQVFJfRVJSKG1zbV9ob3N0LT5lc2NfY2xrKTsKKwkJcHJfZXJyKCIlczog Y2FuJ3QgZmluZCBkc2lfZXNjX2Nsay4gcmV0PSVkXG4iLAorCQkJX19mdW5jX18sIHJldCk7CisJ CW1zbV9ob3N0LT5lc2NfY2xrID0gTlVMTDsKKwkJZ290byBleGl0OworCX0KKworZXhpdDoKKwly ZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGRzaV9idXNfY2xrX2VuYWJsZShzdHJ1Y3QgbXNt X2RzaV9ob3N0ICptc21faG9zdCkKK3sKKwlpbnQgcmV0OworCisJREJHKCJpZD0lZCIsIG1zbV9o b3N0LT5pZCk7CisKKwlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUobXNtX2hvc3QtPm1kcF9jb3Jl X2Nsayk7CisJaWYgKHJldCkgeworCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gZW5hYmxlIG1kcF9j b3JlX2Nsb2NrLCAlZFxuIiwKKwkJCQkJCQkgX19mdW5jX18sIHJldCk7CisJCWdvdG8gY29yZV9j bGtfZXJyOworCX0KKworCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShtc21faG9zdC0+YWhiX2Ns ayk7CisJaWYgKHJldCkgeworCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gZW5hYmxlIGFoYiBjbG9j aywgJWRcbiIsIF9fZnVuY19fLCByZXQpOworCQlnb3RvIGFoYl9jbGtfZXJyOworCX0KKworCXJl dCA9IGNsa19wcmVwYXJlX2VuYWJsZShtc21faG9zdC0+YXhpX2Nsayk7CisJaWYgKHJldCkgewor CQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gZW5hYmxlIGFoYiBjbG9jaywgJWRcbiIsIF9fZnVuY19f LCByZXQpOworCQlnb3RvIGF4aV9jbGtfZXJyOworCX0KKworCXJldCA9IGNsa19wcmVwYXJlX2Vu YWJsZShtc21faG9zdC0+bW1zc19taXNjX2FoYl9jbGspOworCWlmIChyZXQpIHsKKwkJcHJfZXJy KCIlczogZmFpbGVkIHRvIGVuYWJsZSBtbXNzIG1pc2MgYWhiIGNsaywgJWRcbiIsCisJCQlfX2Z1 bmNfXywgcmV0KTsKKwkJZ290byBtaXNjX2FoYl9jbGtfZXJyOworCX0KKworCXJldHVybiAwOwor CittaXNjX2FoYl9jbGtfZXJyOgorCWNsa19kaXNhYmxlX3VucHJlcGFyZShtc21faG9zdC0+YXhp X2Nsayk7CitheGlfY2xrX2VycjoKKwljbGtfZGlzYWJsZV91bnByZXBhcmUobXNtX2hvc3QtPmFo Yl9jbGspOworYWhiX2Nsa19lcnI6CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKG1zbV9ob3N0LT5t ZHBfY29yZV9jbGspOworY29yZV9jbGtfZXJyOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2 b2lkIGRzaV9idXNfY2xrX2Rpc2FibGUoc3RydWN0IG1zbV9kc2lfaG9zdCAqbXNtX2hvc3QpCit7 CisJREJHKCIiKTsKKwljbGtfZGlzYWJsZV91bnByZXBhcmUobXNtX2hvc3QtPm1tc3NfbWlzY19h aGJfY2xrKTsKKwljbGtfZGlzYWJsZV91bnByZXBhcmUobXNtX2hvc3QtPmF4aV9jbGspOworCWNs a19kaXNhYmxlX3VucHJlcGFyZShtc21faG9zdC0+YWhiX2Nsayk7CisJY2xrX2Rpc2FibGVfdW5w cmVwYXJlKG1zbV9ob3N0LT5tZHBfY29yZV9jbGspOworfQorCitzdGF0aWMgaW50IGRzaV9saW5r X2Nsa19lbmFibGUoc3RydWN0IG1zbV9kc2lfaG9zdCAqbXNtX2hvc3QpCit7CisJaW50IHJldDsK KworCURCRygiU2V0IGNsayByYXRlczogcGNsaz0lZCwgYnl0ZWNsaz0lZCIsCisJCW1zbV9ob3N0 LT5tb2RlLT5jbG9jaywgbXNtX2hvc3QtPmJ5dGVfY2xrX3JhdGUpOworCisJcmV0ID0gY2xrX3Nl dF9yYXRlKG1zbV9ob3N0LT5ieXRlX2NsaywgbXNtX2hvc3QtPmJ5dGVfY2xrX3JhdGUpOworCWlm IChyZXQpIHsKKwkJcHJfZXJyKCIlczogRmFpbGVkIHRvIHNldCByYXRlIGJ5dGUgY2xrLCAlZFxu IiwgX19mdW5jX18sIHJldCk7CisJCWdvdG8gZXJyb3I7CisJfQorCisJcmV0ID0gY2xrX3NldF9y YXRlKG1zbV9ob3N0LT5waXhlbF9jbGssIG1zbV9ob3N0LT5tb2RlLT5jbG9jayAqIDEwMDApOwor CWlmIChyZXQpIHsKKwkJcHJfZXJyKCIlczogRmFpbGVkIHRvIHNldCByYXRlIHBpeGVsIGNsaywg JWRcbiIsIF9fZnVuY19fLCByZXQpOworCQlnb3RvIGVycm9yOworCX0KKworCXJldCA9IGNsa19w cmVwYXJlX2VuYWJsZShtc21faG9zdC0+ZXNjX2Nsayk7CisJaWYgKHJldCkgeworCQlwcl9lcnIo IiVzOiBGYWlsZWQgdG8gZW5hYmxlIGRzaSBlc2MgY2xrXG4iLCBfX2Z1bmNfXyk7CisJCWdvdG8g ZXJyb3I7CisJfQorCisJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKG1zbV9ob3N0LT5ieXRlX2Ns ayk7CisJaWYgKHJldCkgeworCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gZW5hYmxlIGRzaSBieXRl IGNsa1xuIiwgX19mdW5jX18pOworCQlnb3RvIGJ5dGVfY2xrX2VycjsKKwl9CisKKwlyZXQgPSBj bGtfcHJlcGFyZV9lbmFibGUobXNtX2hvc3QtPnBpeGVsX2Nsayk7CisJaWYgKHJldCkgeworCQlw cl9lcnIoIiVzOiBGYWlsZWQgdG8gZW5hYmxlIGRzaSBwaXhlbCBjbGtcbiIsIF9fZnVuY19fKTsK KwkJZ290byBwaXhlbF9jbGtfZXJyOworCX0KKworCXJldHVybiAwOworCitwaXhlbF9jbGtfZXJy OgorCWNsa19kaXNhYmxlX3VucHJlcGFyZShtc21faG9zdC0+Ynl0ZV9jbGspOworYnl0ZV9jbGtf ZXJyOgorCWNsa19kaXNhYmxlX3VucHJlcGFyZShtc21faG9zdC0+ZXNjX2Nsayk7CitlcnJvcjoK KwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBkc2lfbGlua19jbGtfZGlzYWJsZShzdHJ1 Y3QgbXNtX2RzaV9ob3N0ICptc21faG9zdCkKK3sKKwljbGtfZGlzYWJsZV91bnByZXBhcmUobXNt X2hvc3QtPmVzY19jbGspOworCWNsa19kaXNhYmxlX3VucHJlcGFyZShtc21faG9zdC0+cGl4ZWxf Y2xrKTsKKwljbGtfZGlzYWJsZV91bnByZXBhcmUobXNtX2hvc3QtPmJ5dGVfY2xrKTsKK30KKwor c3RhdGljIGludCBkc2lfY2xrX2N0cmwoc3RydWN0IG1zbV9kc2lfaG9zdCAqbXNtX2hvc3QsIGJv b2wgZW5hYmxlKQoreworCWludCByZXQgPSAwOworCisJbXV0ZXhfbG9jaygmbXNtX2hvc3QtPmNs a19tdXRleCk7CisJaWYgKGVuYWJsZSkgeworCQlyZXQgPSBkc2lfYnVzX2Nsa19lbmFibGUobXNt X2hvc3QpOworCQlpZiAocmV0KSB7CisJCQlwcl9lcnIoIiVzOiBDYW4gbm90IGVuYWJsZSBidXMg Y2xrLCAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJCWdvdG8gdW5sb2NrX3JldDsKKwkJ fQorCQlyZXQgPSBkc2lfbGlua19jbGtfZW5hYmxlKG1zbV9ob3N0KTsKKwkJaWYgKHJldCkgewor CQkJcHJfZXJyKCIlczogQ2FuIG5vdCBlbmFibGUgbGluayBjbGssICVkXG4iLAorCQkJCV9fZnVu Y19fLCByZXQpOworCQkJZHNpX2J1c19jbGtfZGlzYWJsZShtc21faG9zdCk7CisJCQlnb3RvIHVu bG9ja19yZXQ7CisJCX0KKwl9IGVsc2UgeworCQlkc2lfbGlua19jbGtfZGlzYWJsZShtc21faG9z dCk7CisJCWRzaV9idXNfY2xrX2Rpc2FibGUobXNtX2hvc3QpOworCX0KKwordW5sb2NrX3JldDoK KwltdXRleF91bmxvY2soJm1zbV9ob3N0LT5jbGtfbXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisK K3N0YXRpYyBpbnQgZHNpX2NhbGNfY2xrX3JhdGUoc3RydWN0IG1zbV9kc2lfaG9zdCAqbXNtX2hv c3QpCit7CisJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUgPSBtc21faG9zdC0+bW9kZTsK Kwl1OCBsYW5lcyA9IG1zbV9ob3N0LT5sYW5lczsKKwl1MzIgYnBwID0gZHNpX2dldF9icHAobXNt X2hvc3QtPmZvcm1hdCk7CisJdTMyIHBjbGtfcmF0ZTsKKworCWlmICghbW9kZSkgeworCQlwcl9l cnIoIiVzOiBtb2RlIG5vdCBzZXRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJ fQorCisJcGNsa19yYXRlID0gbW9kZS0+Y2xvY2sgKiAxMDAwOworCWlmIChsYW5lcyA+IDApIHsK KwkJbXNtX2hvc3QtPmJ5dGVfY2xrX3JhdGUgPSAocGNsa19yYXRlICogYnBwKSAvICg4ICogbGFu ZXMpOworCX0gZWxzZSB7CisJCXByX2VycigiJXM6IGZvcmNpbmcgbWRzc19kc2kgbGFuZXMgdG8g MVxuIiwgX19mdW5jX18pOworCQltc21faG9zdC0+Ynl0ZV9jbGtfcmF0ZSA9IChwY2xrX3JhdGUg KiBicHApIC8gODsKKwl9CisKKwlEQkcoInBjbGs9JWQsIGJjbGs9JWQiLCBwY2xrX3JhdGUsIG1z bV9ob3N0LT5ieXRlX2Nsa19yYXRlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBk c2lfcGh5X3N3X3Jlc2V0KHN0cnVjdCBtc21fZHNpX2hvc3QgKm1zbV9ob3N0KQoreworCURCRygi Iik7CisJZHNpX3dyaXRlKG1zbV9ob3N0LCBSRUdfRFNJX1BIWV9SRVNFVCwgRFNJX1BIWV9SRVNF VF9SRVNFVCk7CisJLyogTWFrZSBzdXJlIGZ1bGx5IHJlc2V0ICovCisJd21iKCk7CisJdWRlbGF5 KDEwMDApOworCWRzaV93cml0ZShtc21faG9zdCwgUkVHX0RTSV9QSFlfUkVTRVQsIDApOworCXVk ZWxheSgxMDApOworfQorCitzdGF0aWMgdm9pZCBkc2lfaW50cl9jdHJsKHN0cnVjdCBtc21fZHNp X2hvc3QgKm1zbV9ob3N0LCB1MzIgbWFzaywgaW50IGVuYWJsZSkKK3sKKwl1MzIgaW50cjsKKwl1 bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm1zbV9ob3N0LT5pbnRy X2xvY2ssIGZsYWdzKTsKKwlpbnRyID0gZHNpX3JlYWQobXNtX2hvc3QsIFJFR19EU0lfSU5UUl9D VFJMKTsKKworCWlmIChlbmFibGUpCisJCWludHIgfD0gbWFzazsKKwllbHNlCisJCWludHIgJj0g fm1hc2s7CisKKwlEQkcoImludHI9JXggZW5hYmxlPSVkIiwgaW50ciwgZW5hYmxlKTsKKworCWRz aV93cml0ZShtc21faG9zdCwgUkVHX0RTSV9JTlRSX0NUUkwsIGludHIpOworCXNwaW5fdW5sb2Nr X2lycXJlc3RvcmUoJm1zbV9ob3N0LT5pbnRyX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGlu bGluZSBlbnVtIGRzaV90cmFmZmljX21vZGUgZHNpX2dldF90cmFmZmljX21vZGUoY29uc3QgdTMy IG1vZGVfZmxhZ3MpCit7CisJaWYgKG1vZGVfZmxhZ3MgJiBNSVBJX0RTSV9NT0RFX1ZJREVPX0JV UlNUKQorCQlyZXR1cm4gQlVSU1RfTU9ERTsKKwllbHNlIGlmIChtb2RlX2ZsYWdzICYgTUlQSV9E U0lfTU9ERV9WSURFT19TWU5DX1BVTFNFKQorCQlyZXR1cm4gTk9OX0JVUlNUX1NZTkNIX1BVTFNF OworCisJcmV0dXJuIE5PTl9CVVJTVF9TWU5DSF9FVkVOVDsKK30KKworc3RhdGljIGlubGluZSBl bnVtIGRzaV92aWRfZHN0X2Zvcm1hdCBkc2lfZ2V0X3ZpZF9mbXQoCisJCQkJY29uc3QgZW51bSBt aXBpX2RzaV9waXhlbF9mb3JtYXQgbWlwaV9mbXQpCit7CisJc3dpdGNoIChtaXBpX2ZtdCkgewor CWNhc2UgTUlQSV9EU0lfRk1UX1JHQjg4ODoJcmV0dXJuIFZJRF9EU1RfRk9STUFUX1JHQjg4ODsK KwljYXNlIE1JUElfRFNJX0ZNVF9SR0I2NjY6CXJldHVybiBWSURfRFNUX0ZPUk1BVF9SR0I2NjZf TE9PU0U7CisJY2FzZSBNSVBJX0RTSV9GTVRfUkdCNjY2X1BBQ0tFRDoJcmV0dXJuIFZJRF9EU1Rf Rk9STUFUX1JHQjY2NjsKKwljYXNlIE1JUElfRFNJX0ZNVF9SR0I1NjU6CXJldHVybiBWSURfRFNU X0ZPUk1BVF9SR0I1NjU7CisJZGVmYXVsdDoJCQlyZXR1cm4gVklEX0RTVF9GT1JNQVRfUkdCODg4 OworCX0KK30KKworc3RhdGljIGlubGluZSBlbnVtIGRzaV9jbWRfZHN0X2Zvcm1hdCBkc2lfZ2V0 X2NtZF9mbXQoCisJCQkJY29uc3QgZW51bSBtaXBpX2RzaV9waXhlbF9mb3JtYXQgbWlwaV9mbXQp Cit7CisJc3dpdGNoIChtaXBpX2ZtdCkgeworCWNhc2UgTUlQSV9EU0lfRk1UX1JHQjg4ODoJcmV0 dXJuIENNRF9EU1RfRk9STUFUX1JHQjg4ODsKKwljYXNlIE1JUElfRFNJX0ZNVF9SR0I2NjZfUEFD S0VEOgorCWNhc2UgTUlQSV9EU0lfRk1UX1JHQjY2NjoJcmV0dXJuIFZJRF9EU1RfRk9STUFUX1JH QjY2NjsKKwljYXNlIE1JUElfRFNJX0ZNVF9SR0I1NjU6CXJldHVybiBDTURfRFNUX0ZPUk1BVF9S R0I1NjU7CisJZGVmYXVsdDoJCQlyZXR1cm4gQ01EX0RTVF9GT1JNQVRfUkdCODg4OworCX0KK30K Kworc3RhdGljIHZvaWQgZHNpX2N0cmxfY29uZmlnKHN0cnVjdCBtc21fZHNpX2hvc3QgKm1zbV9o b3N0LCBib29sIGVuYWJsZSwKKwkJCQl1MzIgY2xrX3ByZSwgdTMyIGNsa19wb3N0KQoreworCXUz MiBmbGFncyA9IG1zbV9ob3N0LT5tb2RlX2ZsYWdzOworCWVudW0gbWlwaV9kc2lfcGl4ZWxfZm9y bWF0IG1pcGlfZm10ID0gbXNtX2hvc3QtPmZvcm1hdDsKKwl1MzIgZGF0YSA9IDA7CisKKwlpZiAo IWVuYWJsZSkgeworCQlkc2lfd3JpdGUobXNtX2hvc3QsIFJFR19EU0lfQ1RSTCwgMCk7CisJCXJl dHVybjsKKwl9CisKKwlpZiAoZmxhZ3MgJiBNSVBJX0RTSV9NT0RFX1ZJREVPKSB7CisJCWlmIChm bGFncyAmIE1JUElfRFNJX01PREVfVklERU9fSFNFKQorCQkJZGF0YSB8PSBEU0lfVklEX0NGRzBf UFVMU0VfTU9ERV9IU0FfSEU7CisJCWlmIChmbGFncyAmIE1JUElfRFNJX01PREVfVklERU9fSEZQ KQorCQkJZGF0YSB8PSBEU0lfVklEX0NGRzBfSEZQX1BPV0VSX1NUT1A7CisJCWlmIChmbGFncyAm IE1JUElfRFNJX01PREVfVklERU9fSEJQKQorCQkJZGF0YSB8PSBEU0lfVklEX0NGRzBfSEJQX1BP V0VSX1NUT1A7CisJCWlmIChmbGFncyAmIE1JUElfRFNJX01PREVfVklERU9fSFNBKQorCQkJZGF0 YSB8PSBEU0lfVklEX0NGRzBfSFNBX1BPV0VSX1NUT1A7CisJCS8qIEFsd2F5cyBzZXQgbG93IHBv d2VyIHN0b3AgbW9kZSBmb3IgQkxMUAorCQkgKiB0byBsZXQgY29tbWFuZCBlbmdpbmUgc2VuZCBw YWNrZXRzCisJCSAqLworCQlkYXRhIHw9IERTSV9WSURfQ0ZHMF9FT0ZfQkxMUF9QT1dFUl9TVE9Q IHwKKwkJCURTSV9WSURfQ0ZHMF9CTExQX1BPV0VSX1NUT1A7CisJCWRhdGEgfD0gRFNJX1ZJRF9D RkcwX1RSQUZGSUNfTU9ERShkc2lfZ2V0X3RyYWZmaWNfbW9kZShmbGFncykpOworCQlkYXRhIHw9 IERTSV9WSURfQ0ZHMF9EU1RfRk9STUFUKGRzaV9nZXRfdmlkX2ZtdChtaXBpX2ZtdCkpOworCQlk YXRhIHw9IERTSV9WSURfQ0ZHMF9WSVJUX0NIQU5ORUwobXNtX2hvc3QtPmNoYW5uZWwpOworCQlk c2lfd3JpdGUobXNtX2hvc3QsIFJFR19EU0lfVklEX0NGRzAsIGRhdGEpOworCisJCS8qIERvIG5v dCBzd2FwIFJHQiBjb2xvcnMgKi8KKwkJZGF0YSA9IERTSV9WSURfQ0ZHMV9SR0JfU1dBUChTV0FQ X1JHQik7CisJCWRzaV93cml0ZShtc21faG9zdCwgUkVHX0RTSV9WSURfQ0ZHMSwgMCk7CisJfSBl bHNlIHsKKwkJLyogRG8gbm90IHN3YXAgUkdCIGNvbG9ycyAqLworCQlkYXRhID0gRFNJX0NNRF9D RkcwX1JHQl9TV0FQKFNXQVBfUkdCKTsKKwkJZGF0YSB8PSBEU0lfQ01EX0NGRzBfRFNUX0ZPUk1B VChkc2lfZ2V0X2NtZF9mbXQobWlwaV9mbXQpKTsKKwkJZHNpX3dyaXRlKG1zbV9ob3N0LCBSRUdf RFNJX0NNRF9DRkcwLCBkYXRhKTsKKworCQlkYXRhID0gRFNJX0NNRF9DRkcxX1dSX01FTV9TVEFS VChNSVBJX0RDU19XUklURV9NRU1PUllfU1RBUlQpIHwKKwkJCURTSV9DTURfQ0ZHMV9XUl9NRU1f Q09OVElOVUUoCisJCQkJCU1JUElfRENTX1dSSVRFX01FTU9SWV9DT05USU5VRSk7CisJCS8qIEFs d2F5cyBpbnNlcnQgRENTIGNvbW1hbmQgKi8KKwkJZGF0YSB8PSBEU0lfQ01EX0NGRzFfSU5TRVJU X0RDU19DT01NQU5EOworCQlkc2lfd3JpdGUobXNtX2hvc3QsIFJFR19EU0lfQ01EX0NGRzEsIGRh dGEpOworCX0KKworCWRzaV93cml0ZShtc21faG9zdCwgUkVHX0RTSV9DTURfRE1BX0NUUkwsCisJ CQlEU0lfQ01EX0RNQV9DVFJMX0ZST01fRlJBTUVfQlVGRkVSIHwKKwkJCURTSV9DTURfRE1BX0NU UkxfTE9XX1BPV0VSKTsKKworCWRhdGEgPSAwOworCS8qIEFsd2F5cyBhc3N1bWUgZGVkaWNhdGVk IFRFIHBpbiAqLworCWRhdGEgfD0gRFNJX1RSSUdfQ1RSTF9URTsKKwlkYXRhIHw9IERTSV9UUklH X0NUUkxfTURQX1RSSUdHRVIoVFJJR0dFUl9OT05FKTsKKwlkYXRhIHw9IERTSV9UUklHX0NUUkxf RE1BX1RSSUdHRVIoVFJJR0dFUl9TVyk7CisJZGF0YSB8PSBEU0lfVFJJR19DVFJMX1NUUkVBTSht c21faG9zdC0+Y2hhbm5lbCk7CisJaWYgKChtc21faG9zdC0+Y2ZnLT5tYWpvciA9PSBNU01fRFNJ X1ZFUl9NQUpPUl82RykgJiYKKwkJKG1zbV9ob3N0LT5jZmctPm1pbm9yID49IE1TTV9EU0lfNkdf VkVSX01JTk9SX1YxXzIpKQorCQlkYXRhIHw9IERTSV9UUklHX0NUUkxfQkxPQ0tfRE1BX1dJVEhJ Tl9GUkFNRTsKKwlkc2lfd3JpdGUobXNtX2hvc3QsIFJFR19EU0lfVFJJR19DVFJMLCBkYXRhKTsK KworCWRhdGEgPSBEU0lfQ0xLT1VUX1RJTUlOR19DVFJMX1RfQ0xLX1BPU1QoY2xrX3Bvc3QpIHwK KwkJRFNJX0NMS09VVF9USU1JTkdfQ1RSTF9UX0NMS19QUkUoY2xrX3ByZSk7CisJZHNpX3dyaXRl KG1zbV9ob3N0LCBSRUdfRFNJX0NMS09VVF9USU1JTkdfQ1RSTCwgZGF0YSk7CisKKwlkYXRhID0g MDsKKwlpZiAoIShmbGFncyAmIE1JUElfRFNJX01PREVfRU9UX1BBQ0tFVCkpCisJCWRhdGEgfD0g RFNJX0VPVF9QQUNLRVRfQ1RSTF9UWF9FT1RfQVBQRU5EOworCWRzaV93cml0ZShtc21faG9zdCwg UkVHX0RTSV9FT1RfUEFDS0VUX0NUUkwsIGRhdGEpOworCisJLyogYWxsb3cgb25seSBhY2stZXJy LXN0YXR1cyB0byBnZW5lcmF0ZSBpbnRlcnJ1cHQgKi8KKwlkc2lfd3JpdGUobXNtX2hvc3QsIFJF R19EU0lfRVJSX0lOVF9NQVNLMCwgMHgxM2ZmM2ZlMCk7CisKKwlkc2lfaW50cl9jdHJsKG1zbV9o b3N0LCBEU0lfSVJRX01BU0tfRVJST1IsIDEpOworCisJZHNpX3dyaXRlKG1zbV9ob3N0LCBSRUdf RFNJX0NMS19DVFJMLCBEU0lfQ0xLX0NUUkxfRU5BQkxFX0NMS1MpOworCisJZGF0YSA9IERTSV9D VFJMX0NMS19FTjsKKworCURCRygibGFuZSBudW1iZXI9JWQiLCBtc21faG9zdC0+bGFuZXMpOwor CWlmIChtc21faG9zdC0+bGFuZXMgPT0gMikgeworCQlkYXRhIHw9IERTSV9DVFJMX0xBTkUxIHwg RFNJX0NUUkxfTEFORTI7CisJCS8qIHN3YXAgbGFuZXMgZm9yIDItbGFuZSBwYW5lbCBmb3IgYmV0 dGVyIHBlcmZvcm1hbmNlICovCisJCWRzaV93cml0ZShtc21faG9zdCwgUkVHX0RTSV9MQU5FX1NX QVBfQ1RSTCwKKwkJCURTSV9MQU5FX1NXQVBfQ1RSTF9ETE5fU1dBUF9TRUwoTEFORV9TV0FQXzEy MzApKTsKKwl9IGVsc2UgeworCQkvKiBUYWtlIDQgbGFuZXMgYXMgZGVmYXVsdCAqLworCQlkYXRh IHw9IERTSV9DVFJMX0xBTkUwIHwgRFNJX0NUUkxfTEFORTEgfCBEU0lfQ1RSTF9MQU5FMiB8CisJ CQlEU0lfQ1RSTF9MQU5FMzsKKwkJLyogRG8gbm90IHN3YXAgbGFuZXMgZm9yIDQtbGFuZSBwYW5l bCAqLworCQlkc2lfd3JpdGUobXNtX2hvc3QsIFJFR19EU0lfTEFORV9TV0FQX0NUUkwsCisJCQlE U0lfTEFORV9TV0FQX0NUUkxfRExOX1NXQVBfU0VMKExBTkVfU1dBUF8wMTIzKSk7CisJfQorCWRh dGEgfD0gRFNJX0NUUkxfRU5BQkxFOworCisJZHNpX3dyaXRlKG1zbV9ob3N0LCBSRUdfRFNJX0NU UkwsIGRhdGEpOworfQorCitzdGF0aWMgdm9pZCBkc2lfdGltaW5nX3NldHVwKHN0cnVjdCBtc21f ZHNpX2hvc3QgKm1zbV9ob3N0KQoreworCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlID0g bXNtX2hvc3QtPm1vZGU7CisJdTMyIGhzX3N0YXJ0ID0gMCwgdnNfc3RhcnQgPSAwOyAvKiB0YWtl IHN5bmMgc3RhcnQgYXMgMCAqLworCXUzMiBoX3RvdGFsID0gbW9kZS0+aHRvdGFsOworCXUzMiB2 X3RvdGFsID0gbW9kZS0+dnRvdGFsOworCXUzMiBoc19lbmQgPSBtb2RlLT5oc3luY19lbmQgLSBt b2RlLT5oc3luY19zdGFydDsKKwl1MzIgdnNfZW5kID0gbW9kZS0+dnN5bmNfZW5kIC0gbW9kZS0+ dnN5bmNfc3RhcnQ7CisJdTMyIGhhX3N0YXJ0ID0gaF90b3RhbCAtIG1vZGUtPmhzeW5jX3N0YXJ0 OworCXUzMiBoYV9lbmQgPSBoYV9zdGFydCArIG1vZGUtPmhkaXNwbGF5OworCXUzMiB2YV9zdGFy dCA9IHZfdG90YWwgLSBtb2RlLT52c3luY19zdGFydDsKKwl1MzIgdmFfZW5kID0gdmFfc3RhcnQg KyBtb2RlLT52ZGlzcGxheTsKKwl1MzIgd2M7CisKKwlEQkcoIiIpOworCisJaWYgKG1zbV9ob3N0 LT5tb2RlX2ZsYWdzICYgTUlQSV9EU0lfTU9ERV9WSURFTykgeworCQlkc2lfd3JpdGUobXNtX2hv c3QsIFJFR19EU0lfQUNUSVZFX0gsCisJCQlEU0lfQUNUSVZFX0hfU1RBUlQoaGFfc3RhcnQpIHwK KwkJCURTSV9BQ1RJVkVfSF9FTkQoaGFfZW5kKSk7CisJCWRzaV93cml0ZShtc21faG9zdCwgUkVH X0RTSV9BQ1RJVkVfViwKKwkJCURTSV9BQ1RJVkVfVl9TVEFSVCh2YV9zdGFydCkgfAorCQkJRFNJ X0FDVElWRV9WX0VORCh2YV9lbmQpKTsKKwkJZHNpX3dyaXRlKG1zbV9ob3N0LCBSRUdfRFNJX1RP VEFMLAorCQkJRFNJX1RPVEFMX0hfVE9UQUwoaF90b3RhbCAtIDEpIHwKKwkJCURTSV9UT1RBTF9W X1RPVEFMKHZfdG90YWwgLSAxKSk7CisKKwkJZHNpX3dyaXRlKG1zbV9ob3N0LCBSRUdfRFNJX0FD VElWRV9IU1lOQywKKwkJCURTSV9BQ1RJVkVfSFNZTkNfU1RBUlQoaHNfc3RhcnQpIHwKKwkJCURT SV9BQ1RJVkVfSFNZTkNfRU5EKGhzX2VuZCkpOworCQlkc2lfd3JpdGUobXNtX2hvc3QsIFJFR19E U0lfQUNUSVZFX1ZTWU5DX0hQT1MsIDApOworCQlkc2lfd3JpdGUobXNtX2hvc3QsIFJFR19EU0lf QUNUSVZFX1ZTWU5DX1ZQT1MsCisJCQlEU0lfQUNUSVZFX1ZTWU5DX1ZQT1NfU1RBUlQodnNfc3Rh cnQpIHwKKwkJCURTSV9BQ1RJVkVfVlNZTkNfVlBPU19FTkQodnNfZW5kKSk7CisJfSBlbHNlIHsJ CS8qIGNvbW1hbmQgbW9kZSAqLworCQkvKiBpbWFnZSBkYXRhIGFuZCAxIGJ5dGUgd3JpdGVfbWVt b3J5X3N0YXJ0IGNtZCAqLworCQl3YyA9IG1vZGUtPmhkaXNwbGF5ICogZHNpX2dldF9icHAobXNt X2hvc3QtPmZvcm1hdCkgLyA4ICsgMTsKKworCQlkc2lfd3JpdGUobXNtX2hvc3QsIFJFR19EU0lf Q01EX01EUF9TVFJFQU1fQ1RSTCwKKwkJCURTSV9DTURfTURQX1NUUkVBTV9DVFJMX1dPUkRfQ09V TlQod2MpIHwKKwkJCURTSV9DTURfTURQX1NUUkVBTV9DVFJMX1ZJUlRVQUxfQ0hBTk5FTCgKKwkJ CQkJbXNtX2hvc3QtPmNoYW5uZWwpIHwKKwkJCURTSV9DTURfTURQX1NUUkVBTV9DVFJMX0RBVEFf VFlQRSgKKwkJCQkJTUlQSV9EU0lfRENTX0xPTkdfV1JJVEUpKTsKKworCQlkc2lfd3JpdGUobXNt X2hvc3QsIFJFR19EU0lfQ01EX01EUF9TVFJFQU1fVE9UQUwsCisJCQlEU0lfQ01EX01EUF9TVFJF QU1fVE9UQUxfSF9UT1RBTChtb2RlLT5oZGlzcGxheSkgfAorCQkJRFNJX0NNRF9NRFBfU1RSRUFN X1RPVEFMX1ZfVE9UQUwobW9kZS0+dmRpc3BsYXkpKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGRz aV9zd19yZXNldChzdHJ1Y3QgbXNtX2RzaV9ob3N0ICptc21faG9zdCkKK3sKKwlkc2lfd3JpdGUo bXNtX2hvc3QsIFJFR19EU0lfQ0xLX0NUUkwsIERTSV9DTEtfQ1RSTF9FTkFCTEVfQ0xLUyk7CisJ d21iKCk7IC8qIGNsb2NrcyBuZWVkIHRvIGJlIGVuYWJsZWQgYmVmb3JlIHJlc2V0ICovCisKKwlk c2lfd3JpdGUobXNtX2hvc3QsIFJFR19EU0lfUkVTRVQsIDEpOworCXdtYigpOyAvKiBtYWtlIHN1 cmUgcmVzZXQgaGFwcGVuICovCisJZHNpX3dyaXRlKG1zbV9ob3N0LCBSRUdfRFNJX1JFU0VULCAw KTsKK30KKworc3RhdGljIHZvaWQgZHNpX29wX21vZGVfY29uZmlnKHN0cnVjdCBtc21fZHNpX2hv c3QgKm1zbV9ob3N0LAorCQkJCQlib29sIHZpZGVvX21vZGUsIGJvb2wgZW5hYmxlKQoreworCXUz MiBkc2lfY3RybDsKKworCWRzaV9jdHJsID0gZHNpX3JlYWQobXNtX2hvc3QsIFJFR19EU0lfQ1RS TCk7CisKKwlpZiAoIWVuYWJsZSkgeworCQlkc2lfY3RybCAmPSB+KERTSV9DVFJMX0VOQUJMRSB8 IERTSV9DVFJMX1ZJRF9NT0RFX0VOIHwKKwkJCQlEU0lfQ1RSTF9DTURfTU9ERV9FTik7CisJCWRz aV9pbnRyX2N0cmwobXNtX2hvc3QsIERTSV9JUlFfTUFTS19DTURfTURQX0RPTkUgfAorCQkJCQlE U0lfSVJRX01BU0tfVklERU9fRE9ORSwgMCk7CisJfSBlbHNlIHsKKwkJaWYgKHZpZGVvX21vZGUp IHsKKwkJCWRzaV9jdHJsIHw9IERTSV9DVFJMX1ZJRF9NT0RFX0VOOworCQl9IGVsc2UgewkJLyog Y29tbWFuZCBtb2RlICovCisJCQlkc2lfY3RybCB8PSBEU0lfQ1RSTF9DTURfTU9ERV9FTjsKKwkJ CWRzaV9pbnRyX2N0cmwobXNtX2hvc3QsIERTSV9JUlFfTUFTS19DTURfTURQX0RPTkUsIDEpOwor CQl9CisJCWRzaV9jdHJsIHw9IERTSV9DVFJMX0VOQUJMRTsKKwl9CisKKwlkc2lfd3JpdGUobXNt X2hvc3QsIFJFR19EU0lfQ1RSTCwgZHNpX2N0cmwpOworfQorCitzdGF0aWMgdm9pZCBkc2lfc2V0 X3R4X3Bvd2VyX21vZGUoaW50IG1vZGUsIHN0cnVjdCBtc21fZHNpX2hvc3QgKm1zbV9ob3N0KQor eworCXUzMiBkYXRhOworCisJZGF0YSA9IGRzaV9yZWFkKG1zbV9ob3N0LCBSRUdfRFNJX0NNRF9E TUFfQ1RSTCk7CisKKwlpZiAobW9kZSA9PSAwKQorCQlkYXRhICY9IH5EU0lfQ01EX0RNQV9DVFJM X0xPV19QT1dFUjsKKwllbHNlCisJCWRhdGEgfD0gRFNJX0NNRF9ETUFfQ1RSTF9MT1dfUE9XRVI7 CisKKwlkc2lfd3JpdGUobXNtX2hvc3QsIFJFR19EU0lfQ01EX0RNQV9DVFJMLCBkYXRhKTsKK30K Kworc3RhdGljIHZvaWQgZHNpX3dhaXQ0dmlkZW9fZG9uZShzdHJ1Y3QgbXNtX2RzaV9ob3N0ICpt c21faG9zdCkKK3sKKwlkc2lfaW50cl9jdHJsKG1zbV9ob3N0LCBEU0lfSVJRX01BU0tfVklERU9f RE9ORSwgMSk7CisKKwlyZWluaXRfY29tcGxldGlvbigmbXNtX2hvc3QtPnZpZGVvX2NvbXApOwor CisJd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZtc21faG9zdC0+dmlkZW9fY29tcCwKKwkJ CW1zZWNzX3RvX2ppZmZpZXMoNzApKTsKKworCWRzaV9pbnRyX2N0cmwobXNtX2hvc3QsIERTSV9J UlFfTUFTS19WSURFT19ET05FLCAwKTsKK30KKworc3RhdGljIHZvaWQgZHNpX3dhaXQ0dmlkZW9f ZW5nX2J1c3koc3RydWN0IG1zbV9kc2lfaG9zdCAqbXNtX2hvc3QpCit7CisJaWYgKCEobXNtX2hv c3QtPm1vZGVfZmxhZ3MgJiBNSVBJX0RTSV9NT0RFX1ZJREVPKSkKKwkJcmV0dXJuOworCisJaWYg KG1zbV9ob3N0LT5wb3dlcl9vbikgeworCQlkc2lfd2FpdDR2aWRlb19kb25lKG1zbV9ob3N0KTsK KwkJLyogZGVsYXkgNCBtcyB0byBza2lwIEJMTFAgKi8KKwkJdXNsZWVwX3JhbmdlKDIwMDAsIDQw MDApOworCX0KK30KKworLyogZHNpX2NtZCAqLworc3RhdGljIGludCBkc2lfdHhfYnVmX2FsbG9j KHN0cnVjdCBtc21fZHNpX2hvc3QgKm1zbV9ob3N0LCBpbnQgc2l6ZSkKK3sKKwlzdHJ1Y3QgZHJt X2RldmljZSAqZGV2ID0gbXNtX2hvc3QtPmRldjsKKwlpbnQgcmV0OworCXUzMiBpb3ZhOworCisJ bXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCW1zbV9ob3N0LT50eF9nZW1fb2JqID0g bXNtX2dlbV9uZXcoZGV2LCBzaXplLCBNU01fQk9fVU5DQUNIRUQpOworCWlmIChJU19FUlIobXNt X2hvc3QtPnR4X2dlbV9vYmopKSB7CisJCXJldCA9IFBUUl9FUlIobXNtX2hvc3QtPnR4X2dlbV9v YmopOworCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gYWxsb2NhdGUgZ2VtLCAlZFxuIiwgX19mdW5j X18sIHJldCk7CisJCW1zbV9ob3N0LT50eF9nZW1fb2JqID0gTlVMTDsKKwkJbXV0ZXhfdW5sb2Nr KCZkZXYtPnN0cnVjdF9tdXRleCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gbXNtX2dl bV9nZXRfaW92YV9sb2NrZWQobXNtX2hvc3QtPnR4X2dlbV9vYmosIDAsICZpb3ZhKTsKKwlpZiAo cmV0KSB7CisJCXByX2VycigiJXM6IGZhaWxlZCB0byBnZXQgaW92YSwgJWRcbiIsIF9fZnVuY19f LCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKwltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211 dGV4KTsKKworCWlmIChpb3ZhICYgMHgwNykgeworCQlwcl9lcnIoIiVzOiBidWYgTk9UIDggYnl0 ZXMgYWxpZ25lZFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1 cm4gMDsKK30KKworc3RhdGljIHZvaWQgZHNpX3R4X2J1Zl9mcmVlKHN0cnVjdCBtc21fZHNpX2hv c3QgKm1zbV9ob3N0KQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBtc21faG9zdC0+ZGV2 OworCisJaWYgKG1zbV9ob3N0LT50eF9nZW1fb2JqKSB7CisJCW1zbV9nZW1fcHV0X2lvdmEobXNt X2hvc3QtPnR4X2dlbV9vYmosIDApOworCQltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7 CisJCW1zbV9nZW1fZnJlZV9vYmplY3QobXNtX2hvc3QtPnR4X2dlbV9vYmopOworCQltc21faG9z dC0+dHhfZ2VtX29iaiA9IE5VTEw7CisJCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgp OworCX0KK30KKworLyoKKyAqIHByZXBhcmUgY21kIGJ1ZmZlciB0byBiZSB0eGVkCisgKi8KK3N0 YXRpYyBpbnQgZHNpX2NtZF9kbWFfYWRkKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqdHhfZ2VtLAor CQkJY29uc3Qgc3RydWN0IG1pcGlfZHNpX21zZyAqbXNnKQoreworCXN0cnVjdCBtaXBpX2RzaV9w YWNrZXQgcGFja2V0OworCWludCBsZW47CisJaW50IHJldDsKKwl1OCAqZGF0YTsKKworCXJldCA9 IG1pcGlfZHNpX2NyZWF0ZV9wYWNrZXQoJnBhY2tldCwgbXNnKTsKKwlpZiAocmV0KSB7CisJCXBy X2VycigiJXM6IGNyZWF0ZSBwYWNrZXQgZmFpbGVkLCAlZFxuIiwgX19mdW5jX18sIHJldCk7CisJ CXJldHVybiByZXQ7CisJfQorCWxlbiA9IChwYWNrZXQuc2l6ZSArIDMpICYgKH4weDMpOworCisJ aWYgKGxlbiA+IHR4X2dlbS0+c2l6ZSkgeworCQlwcl9lcnIoIiVzOiBwYWNrZXQgc2l6ZSBpcyB0 b28gYmlnXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWRhdGEgPSBt c21fZ2VtX3ZhZGRyKHR4X2dlbSk7CisKKwlpZiAoSVNfRVJSKGRhdGEpKSB7CisJCXJldCA9IFBU Ul9FUlIoZGF0YSk7CisJCXByX2VycigiJXM6IGdldCB2YWRkciBmYWlsZWQsICVkXG4iLCBfX2Z1 bmNfXywgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBNU00gc3BlY2lmaWMgY29tbWFu ZCBmb3JtYXQgaW4gbWVtb3J5ICovCisJZGF0YVswXSA9IHBhY2tldC5oZWFkZXJbMV07CisJZGF0 YVsxXSA9IHBhY2tldC5oZWFkZXJbMl07CisJZGF0YVsyXSA9IHBhY2tldC5oZWFkZXJbMF07CisJ ZGF0YVszXSA9IEJJVCg3KTsgLyogTGFzdCBwYWNrZXQgKi8KKwlpZiAobWlwaV9kc2lfcGFja2V0 X2Zvcm1hdF9pc19sb25nKG1zZy0+dHlwZSkpCisJCWRhdGFbM10gfD0gQklUKDYpOworCWlmICht c2ctPnJ4X2J1ZiAmJiBtc2ctPnJ4X2xlbikKKwkJZGF0YVszXSB8PSBCSVQoNSk7CisKKwkvKiBM b25nIHBhY2tldCAqLworCWlmIChwYWNrZXQucGF5bG9hZCAmJiBwYWNrZXQucGF5bG9hZF9sZW5n dGgpCisJCW1lbWNweShkYXRhICsgNCwgcGFja2V0LnBheWxvYWQsIHBhY2tldC5wYXlsb2FkX2xl bmd0aCk7CisKKwkvKiBBcHBlbmQgMHhmZiB0byB0aGUgZW5kICovCisJaWYgKHBhY2tldC5zaXpl IDwgbGVuKQorCQltZW1zZXQoZGF0YSArIHBhY2tldC5zaXplLCAweGZmLCBsZW4gLSBwYWNrZXQu c2l6ZSk7CisKKwlyZXR1cm4gbGVuOworfQorCisvKgorICogZHNpX3Nob3J0X3JlYWQxX3Jlc3A6 IDEgcGFyYW1ldGVyCisgKi8KK3N0YXRpYyBpbnQgZHNpX3Nob3J0X3JlYWQxX3Jlc3AodTggKmJ1 ZiwgY29uc3Qgc3RydWN0IG1pcGlfZHNpX21zZyAqbXNnKQoreworCXU4ICpkYXRhID0gbXNnLT5y eF9idWY7CisJaWYgKGRhdGEgJiYgKG1zZy0+cnhfbGVuID49IDEpKSB7CisJCSpkYXRhID0gYnVm WzFdOyAvKiBzdHJpcCBvdXQgZGNzIHR5cGUgKi8KKwkJcmV0dXJuIDE7CisJfSBlbHNlIHsKKwkJ cHJfZXJyKCIlczogcmVhZCBkYXRhIGRvZXMgbm90IG1hdGNoIHdpdGggcnhfYnVmIGxlbiAlZFxu IiwKKwkJCV9fZnVuY19fLCBtc2ctPnJ4X2xlbik7CisJCXJldHVybiAtRUlOVkFMOworCX0KK30K KworLyoKKyAqIGRzaV9zaG9ydF9yZWFkMl9yZXNwOiAyIHBhcmFtZXRlcgorICovCitzdGF0aWMg aW50IGRzaV9zaG9ydF9yZWFkMl9yZXNwKHU4ICpidWYsIGNvbnN0IHN0cnVjdCBtaXBpX2RzaV9t c2cgKm1zZykKK3sKKwl1OCAqZGF0YSA9IG1zZy0+cnhfYnVmOworCWlmIChkYXRhICYmIChtc2ct PnJ4X2xlbiA+PSAyKSkgeworCQlkYXRhWzBdID0gYnVmWzFdOyAvKiBzdHJpcCBvdXQgZGNzIHR5 cGUgKi8KKwkJZGF0YVsxXSA9IGJ1ZlsyXTsKKwkJcmV0dXJuIDI7CisJfSBlbHNlIHsKKwkJcHJf ZXJyKCIlczogcmVhZCBkYXRhIGRvZXMgbm90IG1hdGNoIHdpdGggcnhfYnVmIGxlbiAlZFxuIiwK KwkJCV9fZnVuY19fLCBtc2ctPnJ4X2xlbik7CisJCXJldHVybiAtRUlOVkFMOworCX0KK30KKwor c3RhdGljIGludCBkc2lfbG9uZ19yZWFkX3Jlc3AodTggKmJ1ZiwgY29uc3Qgc3RydWN0IG1pcGlf ZHNpX21zZyAqbXNnKQoreworCS8qIHN0cmlwIG91dCA0IGJ5dGUgZGNzIGhlYWRlciAqLworCWlm IChtc2ctPnJ4X2J1ZiAmJiBtc2ctPnJ4X2xlbikKKwkJbWVtY3B5KG1zZy0+cnhfYnVmLCBidWYg KyA0LCBtc2ctPnJ4X2xlbik7CisKKwlyZXR1cm4gbXNnLT5yeF9sZW47Cit9CisKKworc3RhdGlj IGludCBkc2lfY21kX2RtYV90eChzdHJ1Y3QgbXNtX2RzaV9ob3N0ICptc21faG9zdCwgaW50IGxl bikKK3sKKwlpbnQgcmV0OworCXUzMiBpb3ZhOworCWJvb2wgdHJpZ2dlcmVkOworCisJcmV0ID0g bXNtX2dlbV9nZXRfaW92YShtc21faG9zdC0+dHhfZ2VtX29iaiwgMCwgJmlvdmEpOworCWlmIChy ZXQpIHsKKwkJcHJfZXJyKCIlczogZmFpbGVkIHRvIGdldCBpb3ZhOiAlZFxuIiwgX19mdW5jX18s IHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmVpbml0X2NvbXBsZXRpb24oJm1zbV9ob3N0 LT5kbWFfY29tcCk7CisKKwlkc2lfd2FpdDR2aWRlb19lbmdfYnVzeShtc21faG9zdCk7CisKKwl0 cmlnZ2VyZWQgPSBtc21fZHNpX21hbmFnZXJfY21kX3hmZXJfdHJpZ2dlcigKKwkJCQkJCW1zbV9o b3N0LT5pZCwgaW92YSwgbGVuKTsKKwlpZiAodHJpZ2dlcmVkKSB7CisJCXJldCA9IHdhaXRfZm9y X2NvbXBsZXRpb25fdGltZW91dCgmbXNtX2hvc3QtPmRtYV9jb21wLAorCQkJCQltc2Vjc190b19q aWZmaWVzKDIwMCkpOworCQlEQkcoInJldD0lZCIsIHJldCk7CisJCWlmIChyZXQgPT0gMCkKKwkJ CXJldCA9IC1FVElNRURPVVQ7CisJCWVsc2UKKwkJCXJldCA9IGxlbjsKKwl9IGVsc2UKKwkJcmV0 ID0gbGVuOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBkc2lfY21kX2RtYV9yeChz dHJ1Y3QgbXNtX2RzaV9ob3N0ICptc21faG9zdCwKKwkJCXU4ICpidWYsIGludCByeF9ieXRlLCBp bnQgcGt0X3NpemUpCit7CisJdTMyICpscCwgKnRlbXAsIGRhdGE7CisJaW50IGksIGogPSAwLCBj bnQ7CisJYm9vbCBhY2tfZXJyb3IgPSBmYWxzZTsKKwl1MzIgcmVhZF9jbnQ7CisJdTggcmVnWzE2 XTsKKwlpbnQgcmVwZWF0ZWRfYnl0ZXMgPSAwOworCWludCBidWZfb2Zmc2V0ID0gYnVmIC0gbXNt X2hvc3QtPnJ4X2J1ZjsKKworCWxwID0gKHUzMiAqKWJ1ZjsKKwl0ZW1wID0gKHUzMiAqKXJlZzsK KwljbnQgPSAocnhfYnl0ZSArIDMpID4+IDI7CisJaWYgKGNudCA+IDQpCisJCWNudCA9IDQ7IC8q IDQgeCAzMiBiaXRzIHJlZ2lzdGVycyBvbmx5ICovCisKKwkvKiBDYWxjdWxhdGUgcmVhbCByZWFk IGRhdGEgY291bnQgKi8KKwlyZWFkX2NudCA9IGRzaV9yZWFkKG1zbV9ob3N0LCAweDFkNCkgPj4g MTY7CisKKwlhY2tfZXJyb3IgPSAocnhfYnl0ZSA9PSA0KSA/CisJCShyZWFkX2NudCA9PSA4KSA6 IC8qIHNob3J0IHBrdCArIDQtYnl0ZSBlcnJvciBwa3QgKi8KKwkJKHJlYWRfY250ID09IChwa3Rf c2l6ZSArIDYgKyA0KSk7IC8qIGxvbmcgcGt0KzQtYnl0ZSBlcnJvciBwa3QqLworCisJaWYgKGFj a19lcnJvcikKKwkJcmVhZF9jbnQgLT0gNDsgLyogUmVtb3ZlIDQgYnl0ZSBlcnJvciBwa3QgKi8K KworCS8qCisJICogSW4gY2FzZSBvZiBtdWx0aXBsZSByZWFkcyBmcm9tIHRoZSBwYW5lbCwgYWZ0 ZXIgdGhlIGZpcnN0IHJlYWQsIHRoZXJlCisJICogaXMgcG9zc2liaWxpdHkgdGhhdCB0aGVyZSBh cmUgc29tZSBieXRlcyBpbiB0aGUgcGF5bG9hZCByZXBlYXRpbmcgaW4KKwkgKiB0aGUgUkRCS19E QVRBIHJlZ2lzdGVycy4gU2luY2Ugd2UgcmVhZCBhbGwgdGhlIHBhcmFtZXRlcnMgZnJvbSB0aGUK KwkgKiBwYW5lbCByaWdodCBmcm9tIHRoZSBmaXJzdCBieXRlIGZvciBldmVyeSBwYXNzLiBXZSBu ZWVkIHRvIHNraXAgdGhlCisJICogcmVwZWF0aW5nIGJ5dGVzIGFuZCB0aGVuIGFwcGVuZCB0aGUg bmV3IHBhcmFtZXRlcnMgdG8gdGhlIHJ4IGJ1ZmZlci4KKwkgKi8KKwlpZiAocmVhZF9jbnQgPiAx NikgeworCQlpbnQgYnl0ZXNfc2hpZnRlZDsKKwkJLyogQW55IGRhdGEgbW9yZSB0aGFuIDE2IGJ5 dGVzIHdpbGwgYmUgc2hpZnRlZCBvdXQuCisJCSAqIFRoZSB0ZW1wIHJlYWQgYnVmZmVyIHNob3Vs ZCBhbHJlYWR5IGNvbnRhaW4gdGhlc2UgYnl0ZXMuCisJCSAqIFRoZSByZW1haW5pbmcgYnl0ZXMg aW4gcmVhZCBidWZmZXIgYXJlIHRoZSByZXBlYXRlZCBieXRlcy4KKwkJICovCisJCWJ5dGVzX3No aWZ0ZWQgPSByZWFkX2NudCAtIDE2OworCQlyZXBlYXRlZF9ieXRlcyA9IGJ1Zl9vZmZzZXQgLSBi eXRlc19zaGlmdGVkOworCX0KKworCWZvciAoaSA9IGNudCAtIDE7IGkgPj0gMDsgaS0tKSB7CisJ CWRhdGEgPSBkc2lfcmVhZChtc21faG9zdCwgUkVHX0RTSV9SREJLX0RBVEEoaSkpOworCQkqdGVt cCsrID0gbnRvaGwoZGF0YSk7IC8qIHRvIGhvc3QgYnl0ZSBvcmRlciAqLworCQlEQkcoImRhdGEg PSAweCV4IGFuZCBudG9obChkYXRhKSA9IDB4JXgiLCBkYXRhLCBudG9obChkYXRhKSk7CisJfQor CisJZm9yIChpID0gcmVwZWF0ZWRfYnl0ZXM7IGkgPCAxNjsgaSsrKQorCQlidWZbaisrXSA9IHJl Z1tpXTsKKworCXJldHVybiBqOworfQorCitzdGF0aWMgaW50IGRzaV9jbWRzMmJ1Zl90eChzdHJ1 Y3QgbXNtX2RzaV9ob3N0ICptc21faG9zdCwKKwkJCQljb25zdCBzdHJ1Y3QgbWlwaV9kc2lfbXNn ICptc2cpCit7CisJaW50IGxlbiwgcmV0OworCWludCBibGxwX2xlbiA9IG1zbV9ob3N0LT5tb2Rl LT5oZGlzcGxheSAqCisJCQlkc2lfZ2V0X2JwcChtc21faG9zdC0+Zm9ybWF0KSAvIDg7CisKKwls ZW4gPSBkc2lfY21kX2RtYV9hZGQobXNtX2hvc3QtPnR4X2dlbV9vYmosIG1zZyk7CisJaWYgKCFs ZW4pIHsKKwkJcHJfZXJyKCIlczogZmFpbGVkIHRvIGFkZCBjbWQgdHlwZSA9IDB4JXhcbiIsCisJ CQlfX2Z1bmNfXywgIG1zZy0+dHlwZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIGZv ciB2aWRlbyBtb2RlLCBkbyBub3Qgc2VuZCBjbWRzIG1vcmUgdGhhbgorCSogb25lIHBpeGVsIGxp bmUsIHNpbmNlIGl0IG9ubHkgdHJhbnNtaXQgaXQKKwkqIGR1cmluZyBCTExQLgorCSovCisJLyog VE9ETzogaWYgdGhlIGNvbW1hbmQgaXMgc2VudCBpbiBMUCBtb2RlLCB0aGUgYml0IHJhdGUgaXMg b25seQorCSAqIGhhbGYgb2YgZXNjIGNsayByYXRlLiBJbiB0aGlzIGNhc2UsIGlmIHRoZSB2aWRl byBpcyBhbHJlYWR5CisJICogYWN0aXZlbHkgc3RyZWFtaW5nLCB3ZSBuZWVkIHRvIGNoZWNrIG1v cmUgY2FyZWZ1bGx5IGlmIHRoZQorCSAqIGNvbW1hbmQgY2FuIGJlIGZpdCBpbnRvIG9uZSBCTExQ LgorCSAqLworCWlmICgobXNtX2hvc3QtPm1vZGVfZmxhZ3MgJiBNSVBJX0RTSV9NT0RFX1ZJREVP KSAmJiAobGVuID4gYmxscF9sZW4pKSB7CisJCXByX2VycigiJXM6IGNtZCBjYW5ub3QgZml0IGlu dG8gQkxMUCBwZXJpb2QsIGxlbj0lZFxuIiwKKwkJCV9fZnVuY19fLCBsZW4pOworCQlyZXR1cm4g LUVJTlZBTDsKKwl9CisKKwlyZXQgPSBkc2lfY21kX2RtYV90eChtc21faG9zdCwgbGVuKTsKKwlp ZiAocmV0IDwgbGVuKSB7CisJCXByX2VycigiJXM6IGNtZCBkbWEgdHggZmFpbGVkLCB0eXBlPTB4 JXgsIGRhdGEwPTB4JXgsIGxlbj0lZFxuIiwKKwkJCV9fZnVuY19fLCBtc2ctPnR5cGUsICgqKHU4 ICopKG1zZy0+dHhfYnVmKSksIGxlbik7CisJCXJldHVybiAtRUNPTU07CisJfQorCisJcmV0dXJu IGxlbjsKK30KKworc3RhdGljIHZvaWQgZHNpX3N3X3Jlc2V0X3Jlc3RvcmUoc3RydWN0IG1zbV9k c2lfaG9zdCAqbXNtX2hvc3QpCit7CisJdTMyIGRhdGEwLCBkYXRhMTsKKworCWRhdGEwID0gZHNp X3JlYWQobXNtX2hvc3QsIFJFR19EU0lfQ1RSTCk7CisJZGF0YTEgPSBkYXRhMDsKKwlkYXRhMSAm PSB+RFNJX0NUUkxfRU5BQkxFOworCWRzaV93cml0ZShtc21faG9zdCwgUkVHX0RTSV9DVFJMLCBk YXRhMSk7CisJLyoKKwkgKiBkc2kgY29udHJvbGxlciBuZWVkIHRvIGJlIGRpc2FibGVkIGJlZm9y ZQorCSAqIGNsb2NrcyB0dXJuZWQgb24KKwkgKi8KKwl3bWIoKTsKKworCWRzaV93cml0ZShtc21f aG9zdCwgUkVHX0RTSV9DTEtfQ1RSTCwgRFNJX0NMS19DVFJMX0VOQUJMRV9DTEtTKTsKKwl3bWIo KTsJLyogbWFrZSBzdXJlIGNsb2NrcyBlbmFibGVkICovCisKKwkvKiBkc2kgY29udHJvbGxlciBj YW4gb25seSBiZSByZXNldCB3aGlsZSBjbG9ja3MgYXJlIHJ1bm5pbmcgKi8KKwlkc2lfd3JpdGUo bXNtX2hvc3QsIFJFR19EU0lfUkVTRVQsIDEpOworCXdtYigpOwkvKiBtYWtlIHN1cmUgcmVzZXQg aGFwcGVuICovCisJZHNpX3dyaXRlKG1zbV9ob3N0LCBSRUdfRFNJX1JFU0VULCAwKTsKKwl3bWIo KTsJLyogY29udHJvbGxlciBvdXQgb2YgcmVzZXQgKi8KKwlkc2lfd3JpdGUobXNtX2hvc3QsIFJF R19EU0lfQ1RSTCwgZGF0YTApOworCXdtYigpOwkvKiBtYWtlIHN1cmUgZHNpIGNvbnRyb2xsZXIg ZW5hYmxlZCBhZ2FpbiAqLworfQorCitzdGF0aWMgdm9pZCBkc2lfZXJyX3dvcmtlcihzdHJ1Y3Qg d29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IG1zbV9kc2lfaG9zdCAqbXNtX2hvc3QgPQor CQljb250YWluZXJfb2Yod29yaywgc3RydWN0IG1zbV9kc2lfaG9zdCwgZXJyX3dvcmspOworCXUz MiBzdGF0dXMgPSBtc21faG9zdC0+ZXJyX3dvcmtfc3RhdGU7CisKKwlwcl9lcnIoIiVzOiBzdGF0 dXM9JXhcbiIsIF9fZnVuY19fLCBzdGF0dXMpOworCWlmIChzdGF0dXMgJiBEU0lfRVJSX1NUQVRF X01EUF9GSUZPX1VOREVSRkxPVykKKwkJZHNpX3N3X3Jlc2V0X3Jlc3RvcmUobXNtX2hvc3QpOwor CisJLyogSXQgaXMgc2FmZSB0byBjbGVhciBoZXJlIGJlY2F1c2UgZXJyb3IgaXJxIGlzIGRpc2Fi bGVkLiAqLworCW1zbV9ob3N0LT5lcnJfd29ya19zdGF0ZSA9IDA7CisKKwkvKiBlbmFibGUgZHNp IGVycm9yIGludGVycnVwdCAqLworCWRzaV9pbnRyX2N0cmwobXNtX2hvc3QsIERTSV9JUlFfTUFT S19FUlJPUiwgMSk7Cit9CisKK3N0YXRpYyB2b2lkIGRzaV9hY2tfZXJyX3N0YXR1cyhzdHJ1Y3Qg bXNtX2RzaV9ob3N0ICptc21faG9zdCkKK3sKKwl1MzIgc3RhdHVzOworCisJc3RhdHVzID0gZHNp X3JlYWQobXNtX2hvc3QsIFJFR19EU0lfQUNLX0VSUl9TVEFUVVMpOworCisJaWYgKHN0YXR1cykg eworCQlkc2lfd3JpdGUobXNtX2hvc3QsIFJFR19EU0lfQUNLX0VSUl9TVEFUVVMsIHN0YXR1cyk7 CisJCS8qIFdyaXRpbmcgb2YgYW4gZXh0cmEgMCBuZWVkZWQgdG8gY2xlYXIgZXJyb3IgYml0cyAq LworCQlkc2lfd3JpdGUobXNtX2hvc3QsIFJFR19EU0lfQUNLX0VSUl9TVEFUVVMsIDApOworCQlt c21faG9zdC0+ZXJyX3dvcmtfc3RhdGUgfD0gRFNJX0VSUl9TVEFURV9BQ0s7CisJfQorfQorCitz dGF0aWMgdm9pZCBkc2lfdGltZW91dF9zdGF0dXMoc3RydWN0IG1zbV9kc2lfaG9zdCAqbXNtX2hv c3QpCit7CisJdTMyIHN0YXR1czsKKworCXN0YXR1cyA9IGRzaV9yZWFkKG1zbV9ob3N0LCBSRUdf RFNJX1RJTUVPVVRfU1RBVFVTKTsKKworCWlmIChzdGF0dXMpIHsKKwkJZHNpX3dyaXRlKG1zbV9o b3N0LCBSRUdfRFNJX1RJTUVPVVRfU1RBVFVTLCBzdGF0dXMpOworCQltc21faG9zdC0+ZXJyX3dv cmtfc3RhdGUgfD0gRFNJX0VSUl9TVEFURV9USU1FT1VUOworCX0KK30KKworc3RhdGljIHZvaWQg ZHNpX2RsbjBfcGh5X2VycihzdHJ1Y3QgbXNtX2RzaV9ob3N0ICptc21faG9zdCkKK3sKKwl1MzIg c3RhdHVzOworCisJc3RhdHVzID0gZHNpX3JlYWQobXNtX2hvc3QsIFJFR19EU0lfRExOMF9QSFlf RVJSKTsKKworCWlmIChzdGF0dXMpIHsKKwkJZHNpX3dyaXRlKG1zbV9ob3N0LCBSRUdfRFNJX0RM TjBfUEhZX0VSUiwgc3RhdHVzKTsKKwkJbXNtX2hvc3QtPmVycl93b3JrX3N0YXRlIHw9IERTSV9F UlJfU1RBVEVfRExOMF9QSFk7CisJfQorfQorCitzdGF0aWMgdm9pZCBkc2lfZmlmb19zdGF0dXMo c3RydWN0IG1zbV9kc2lfaG9zdCAqbXNtX2hvc3QpCit7CisJdTMyIHN0YXR1czsKKworCXN0YXR1 cyA9IGRzaV9yZWFkKG1zbV9ob3N0LCBSRUdfRFNJX0ZJRk9fU1RBVFVTKTsKKworCS8qIGZpZm8g dW5kZXJmbG93LCBvdmVyZmxvdyAqLworCWlmIChzdGF0dXMpIHsKKwkJZHNpX3dyaXRlKG1zbV9o b3N0LCBSRUdfRFNJX0ZJRk9fU1RBVFVTLCBzdGF0dXMpOworCQltc21faG9zdC0+ZXJyX3dvcmtf c3RhdGUgfD0gRFNJX0VSUl9TVEFURV9GSUZPOworCQlpZiAoc3RhdHVzICYgRFNJX0ZJRk9fU1RB VFVTX0NNRF9NRFBfRklGT19VTkRFUkZMT1cpCisJCQltc21faG9zdC0+ZXJyX3dvcmtfc3RhdGUg fD0KKwkJCQkJRFNJX0VSUl9TVEFURV9NRFBfRklGT19VTkRFUkZMT1c7CisJfQorfQorCitzdGF0 aWMgdm9pZCBkc2lfc3RhdHVzKHN0cnVjdCBtc21fZHNpX2hvc3QgKm1zbV9ob3N0KQoreworCXUz MiBzdGF0dXM7CisKKwlzdGF0dXMgPSBkc2lfcmVhZChtc21faG9zdCwgUkVHX0RTSV9TVEFUVVMw KTsKKworCWlmIChzdGF0dXMgJiBEU0lfU1RBVFVTMF9JTlRFUkxFQVZFX09QX0NPTlRFTlRJT04p IHsKKwkJZHNpX3dyaXRlKG1zbV9ob3N0LCBSRUdfRFNJX1NUQVRVUzAsIHN0YXR1cyk7CisJCW1z bV9ob3N0LT5lcnJfd29ya19zdGF0ZSB8PQorCQkJRFNJX0VSUl9TVEFURV9JTlRFUkxFQVZFX09Q X0NPTlRFTlRJT047CisJfQorfQorCitzdGF0aWMgdm9pZCBkc2lfY2xrX3N0YXR1cyhzdHJ1Y3Qg bXNtX2RzaV9ob3N0ICptc21faG9zdCkKK3sKKwl1MzIgc3RhdHVzOworCisJc3RhdHVzID0gZHNp X3JlYWQobXNtX2hvc3QsIFJFR19EU0lfQ0xLX1NUQVRVUyk7CisKKwlpZiAoc3RhdHVzICYgRFNJ X0NMS19TVEFUVVNfUExMX1VOTE9DS0VEKSB7CisJCWRzaV93cml0ZShtc21faG9zdCwgUkVHX0RT SV9DTEtfU1RBVFVTLCBzdGF0dXMpOworCQltc21faG9zdC0+ZXJyX3dvcmtfc3RhdGUgfD0gRFNJ X0VSUl9TVEFURV9QTExfVU5MT0NLRUQ7CisJfQorfQorCitzdGF0aWMgdm9pZCBkc2lfZXJyb3Io c3RydWN0IG1zbV9kc2lfaG9zdCAqbXNtX2hvc3QpCit7CisJLyogZGlzYWJsZSBkc2kgZXJyb3Ig aW50ZXJydXB0ICovCisJZHNpX2ludHJfY3RybChtc21faG9zdCwgRFNJX0lSUV9NQVNLX0VSUk9S LCAwKTsKKworCWRzaV9jbGtfc3RhdHVzKG1zbV9ob3N0KTsKKwlkc2lfZmlmb19zdGF0dXMobXNt X2hvc3QpOworCWRzaV9hY2tfZXJyX3N0YXR1cyhtc21faG9zdCk7CisJZHNpX3RpbWVvdXRfc3Rh dHVzKG1zbV9ob3N0KTsKKwlkc2lfc3RhdHVzKG1zbV9ob3N0KTsKKwlkc2lfZGxuMF9waHlfZXJy KG1zbV9ob3N0KTsKKworCXF1ZXVlX3dvcmsobXNtX2hvc3QtPndvcmtxdWV1ZSwgJm1zbV9ob3N0 LT5lcnJfd29yayk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBkc2lfaG9zdF9pcnEoaW50IGly cSwgdm9pZCAqcHRyKQoreworCXN0cnVjdCBtc21fZHNpX2hvc3QgKm1zbV9ob3N0ID0gcHRyOwor CXUzMiBpc3I7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghbXNtX2hvc3QtPmN0cmxf YmFzZSkKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm1zbV9o b3N0LT5pbnRyX2xvY2ssIGZsYWdzKTsKKwlpc3IgPSBkc2lfcmVhZChtc21faG9zdCwgUkVHX0RT SV9JTlRSX0NUUkwpOworCWRzaV93cml0ZShtc21faG9zdCwgUkVHX0RTSV9JTlRSX0NUUkwsIGlz cik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXNtX2hvc3QtPmludHJfbG9jaywgZmxhZ3Mp OworCisJREJHKCJpc3I9MHgleCwgaWQ9JWQiLCBpc3IsIG1zbV9ob3N0LT5pZCk7CisKKwlpZiAo aXNyICYgRFNJX0lSUV9FUlJPUikKKwkJZHNpX2Vycm9yKG1zbV9ob3N0KTsKKworCWlmIChpc3Ig JiBEU0lfSVJRX1ZJREVPX0RPTkUpCisJCWNvbXBsZXRlKCZtc21faG9zdC0+dmlkZW9fY29tcCk7 CisKKwlpZiAoaXNyICYgRFNJX0lSUV9DTURfRE1BX0RPTkUpCisJCWNvbXBsZXRlKCZtc21faG9z dC0+ZG1hX2NvbXApOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IGRz aV9ob3N0X2luaXRfcGFuZWxfZ3Bpb3Moc3RydWN0IG1zbV9kc2lfaG9zdCAqbXNtX2hvc3QsCisJ CQlzdHJ1Y3QgZGV2aWNlICpwYW5lbF9kZXZpY2UpCit7CisJaW50IHJldDsKKworCW1zbV9ob3N0 LT5kaXNwX2VuX2dwaW8gPSBkZXZtX2dwaW9kX2dldChwYW5lbF9kZXZpY2UsCisJCQkJCQkiZGlz cC1lbmFibGUiKTsKKwlpZiAoSVNfRVJSKG1zbV9ob3N0LT5kaXNwX2VuX2dwaW8pKSB7CisJCURC RygiY2Fubm90IGdldCBkaXNwLWVuYWJsZS1ncGlvcyAlbGQiLAorCQkJCVBUUl9FUlIobXNtX2hv c3QtPmRpc3BfZW5fZ3BpbykpOworCQltc21faG9zdC0+ZGlzcF9lbl9ncGlvID0gTlVMTDsKKwl9 CisJaWYgKG1zbV9ob3N0LT5kaXNwX2VuX2dwaW8pIHsKKwkJcmV0ID0gZ3Bpb2RfZGlyZWN0aW9u X291dHB1dChtc21faG9zdC0+ZGlzcF9lbl9ncGlvLCAwKTsKKwkJaWYgKHJldCkgeworCQkJcHJf ZXJyKCJjYW5ub3Qgc2V0IGRpciB0byBkaXNwLWVuLWdwaW9zICVkXG4iLCByZXQpOworCQkJcmV0 dXJuIHJldDsKKwkJfQorCX0KKworCW1zbV9ob3N0LT50ZV9ncGlvID0gZGV2bV9ncGlvZF9nZXQo cGFuZWxfZGV2aWNlLCAiZGlzcC10ZSIpOworCWlmIChJU19FUlIobXNtX2hvc3QtPnRlX2dwaW8p KSB7CisJCURCRygiY2Fubm90IGdldCBkaXNwLXRlLWdwaW9zICVsZCIsIFBUUl9FUlIobXNtX2hv c3QtPnRlX2dwaW8pKTsKKwkJbXNtX2hvc3QtPnRlX2dwaW8gPSBOVUxMOworCX0KKworCWlmICht c21faG9zdC0+dGVfZ3BpbykgeworCQlyZXQgPSBncGlvZF9kaXJlY3Rpb25faW5wdXQobXNtX2hv c3QtPnRlX2dwaW8pOworCQlpZiAocmV0KSB7CisJCQlwcl9lcnIoIiVzOiBjYW5ub3Qgc2V0IGRp ciB0byBkaXNwLXRlLWdwaW9zLCAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJCXJldHVy biByZXQ7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkc2lfaG9zdF9h dHRhY2goc3RydWN0IG1pcGlfZHNpX2hvc3QgKmhvc3QsCisJCQkJCXN0cnVjdCBtaXBpX2RzaV9k ZXZpY2UgKmRzaSkKK3sKKwlzdHJ1Y3QgbXNtX2RzaV9ob3N0ICptc21faG9zdCA9IHRvX21zbV9k c2lfaG9zdChob3N0KTsKKwlpbnQgcmV0OworCisJbXNtX2hvc3QtPmNoYW5uZWwgPSBkc2ktPmNo YW5uZWw7CisJbXNtX2hvc3QtPmxhbmVzID0gZHNpLT5sYW5lczsKKwltc21faG9zdC0+Zm9ybWF0 ID0gZHNpLT5mb3JtYXQ7CisJbXNtX2hvc3QtPm1vZGVfZmxhZ3MgPSBkc2ktPm1vZGVfZmxhZ3M7 CisKKwltc21faG9zdC0+cGFuZWxfbm9kZSA9IGRzaS0+ZGV2Lm9mX25vZGU7CisKKwkvKiBTb21l IGdwaW9zIGRlZmluZWQgaW4gcGFuZWwgRFQgbmVlZCB0byBiZSBjb250cm9sbGVkIGJ5IGhvc3Qg Ki8KKwlyZXQgPSBkc2lfaG9zdF9pbml0X3BhbmVsX2dwaW9zKG1zbV9ob3N0LCAmZHNpLT5kZXYp OworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlEQkcoImlkPSVkIiwgbXNtX2hvc3QtPmlk KTsKKwlpZiAobXNtX2hvc3QtPmRldikKKwkJZHJtX2hlbHBlcl9ocGRfaXJxX2V2ZW50KG1zbV9o b3N0LT5kZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHNpX2hvc3RfZGV0YWNo KHN0cnVjdCBtaXBpX2RzaV9ob3N0ICpob3N0LAorCQkJCQlzdHJ1Y3QgbWlwaV9kc2lfZGV2aWNl ICpkc2kpCit7CisJc3RydWN0IG1zbV9kc2lfaG9zdCAqbXNtX2hvc3QgPSB0b19tc21fZHNpX2hv c3QoaG9zdCk7CisKKwltc21faG9zdC0+cGFuZWxfbm9kZSA9IE5VTEw7CisKKwlEQkcoImlkPSVk IiwgbXNtX2hvc3QtPmlkKTsKKwlpZiAobXNtX2hvc3QtPmRldikKKwkJZHJtX2hlbHBlcl9ocGRf aXJxX2V2ZW50KG1zbV9ob3N0LT5kZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6 ZV90IGRzaV9ob3N0X3RyYW5zZmVyKHN0cnVjdCBtaXBpX2RzaV9ob3N0ICpob3N0LAorCQkJCQlj b25zdCBzdHJ1Y3QgbWlwaV9kc2lfbXNnICptc2cpCit7CisJc3RydWN0IG1zbV9kc2lfaG9zdCAq bXNtX2hvc3QgPSB0b19tc21fZHNpX2hvc3QoaG9zdCk7CisJaW50IHJldDsKKworCWlmICghbXNn IHx8ICFtc21faG9zdC0+cG93ZXJfb24pCisJCXJldHVybiAtRUlOVkFMOworCisJbXV0ZXhfbG9j aygmbXNtX2hvc3QtPmNtZF9tdXRleCk7CisJcmV0ID0gbXNtX2RzaV9tYW5hZ2VyX2NtZF94ZmVy KG1zbV9ob3N0LT5pZCwgbXNnKTsKKwltdXRleF91bmxvY2soJm1zbV9ob3N0LT5jbWRfbXV0ZXgp OworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBtaXBpX2RzaV9ob3N0X29wcyBk c2lfaG9zdF9vcHMgPSB7CisJLmF0dGFjaCA9IGRzaV9ob3N0X2F0dGFjaCwKKwkuZGV0YWNoID0g ZHNpX2hvc3RfZGV0YWNoLAorCS50cmFuc2ZlciA9IGRzaV9ob3N0X3RyYW5zZmVyLAorfTsKKwor aW50IG1zbV9kc2lfaG9zdF9pbml0KHN0cnVjdCBtc21fZHNpICptc21fZHNpKQoreworCXN0cnVj dCBtc21fZHNpX2hvc3QgKm1zbV9ob3N0ID0gTlVMTDsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNl ICpwZGV2ID0gbXNtX2RzaS0+cGRldjsKKwlpbnQgcmV0OworCisJbXNtX2hvc3QgPSBkZXZtX2t6 YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCptc21faG9zdCksIEdGUF9LRVJORUwpOworCWlmICgh bXNtX2hvc3QpIHsKKwkJcHJfZXJyKCIlczogRkFJTEVEOiBjYW5ub3QgYWxsb2MgZHNpIGhvc3Rc biIsCisJCSAgICAgICBfX2Z1bmNfXyk7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZmFpbDsK Kwl9CisKKwlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihwZGV2LT5kZXYub2Zfbm9kZSwKKwkJ CQkicWNvbSxkc2ktaG9zdC1pbmRleCIsICZtc21faG9zdC0+aWQpOworCWlmIChyZXQpIHsKKwkJ ZGV2X2VycigmcGRldi0+ZGV2LAorCQkJIiVzOiBob3N0IGluZGV4IG5vdCBzcGVjaWZpZWQsIHJl dD0lZFxuIiwKKwkJCV9fZnVuY19fLCByZXQpOworCQlnb3RvIGZhaWw7CisJfQorCW1zbV9ob3N0 LT5wZGV2ID0gcGRldjsKKworCXJldCA9IGRzaV9jbGtfaW5pdChtc21faG9zdCk7CisJaWYgKHJl dCkgeworCQlwcl9lcnIoIiVzOiB1bmFibGUgdG8gaW5pdGlhbGl6ZSBkc2kgY2xrc1xuIiwgX19m dW5jX18pOworCQlnb3RvIGZhaWw7CisJfQorCisJbXNtX2hvc3QtPmN0cmxfYmFzZSA9IG1zbV9p b3JlbWFwKHBkZXYsICJkc2lfY3RybCIsICJEU0kgQ1RSTCIpOworCWlmIChJU19FUlIobXNtX2hv c3QtPmN0cmxfYmFzZSkpIHsKKwkJcHJfZXJyKCIlczogdW5hYmxlIHRvIG1hcCBEc2kgY3RybCBi YXNlXG4iLCBfX2Z1bmNfXyk7CisJCXJldCA9IFBUUl9FUlIobXNtX2hvc3QtPmN0cmxfYmFzZSk7 CisJCWdvdG8gZmFpbDsKKwl9CisKKwltc21faG9zdC0+Y2ZnID0gZHNpX2dldF9jb25maWcobXNt X2hvc3QpOworCWlmICghbXNtX2hvc3QtPmNmZykgeworCQlyZXQgPSAtRUlOVkFMOworCQlwcl9l cnIoIiVzOiBnZXQgY29uZmlnIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlnb3RvIGZhaWw7CisJ fQorCisJcmV0ID0gZHNpX3JlZ3VsYXRvcl9pbml0KG1zbV9ob3N0KTsKKwlpZiAocmV0KSB7CisJ CXByX2VycigiJXM6IHJlZ3VsYXRvciBpbml0IGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlnb3Rv IGZhaWw7CisJfQorCisJbXNtX2hvc3QtPnJ4X2J1ZiA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2 LCBTWl80SywgR0ZQX0tFUk5FTCk7CisJaWYgKCFtc21faG9zdC0+cnhfYnVmKSB7CisJCXByX2Vy cigiJXM6IGFsbG9jIHJ4IHRlbXAgYnVmIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlnb3RvIGZh aWw7CisJfQorCisJaW5pdF9jb21wbGV0aW9uKCZtc21faG9zdC0+ZG1hX2NvbXApOworCWluaXRf Y29tcGxldGlvbigmbXNtX2hvc3QtPnZpZGVvX2NvbXApOworCW11dGV4X2luaXQoJm1zbV9ob3N0 LT5kZXZfbXV0ZXgpOworCW11dGV4X2luaXQoJm1zbV9ob3N0LT5jbWRfbXV0ZXgpOworCW11dGV4 X2luaXQoJm1zbV9ob3N0LT5jbGtfbXV0ZXgpOworCXNwaW5fbG9ja19pbml0KCZtc21faG9zdC0+ aW50cl9sb2NrKTsKKworCS8qIHNldHVwIHdvcmtxdWV1ZSAqLworCW1zbV9ob3N0LT53b3JrcXVl dWUgPSBhbGxvY19vcmRlcmVkX3dvcmtxdWV1ZSgiZHNpX2RybV93b3JrIiwgMCk7CisJSU5JVF9X T1JLKCZtc21faG9zdC0+ZXJyX3dvcmssIGRzaV9lcnJfd29ya2VyKTsKKworCW1zbV9kc2ktPnBo eSA9IG1zbV9kc2lfcGh5X2luaXQocGRldiwgbXNtX2hvc3QtPmNmZy0+cGh5X3R5cGUsCisJCQkJ CW1zbV9ob3N0LT5pZCk7CisJaWYgKCFtc21fZHNpLT5waHkpIHsKKwkJcHJfZXJyKCIlczogcGh5 IGluaXQgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCWdvdG8gZmFpbDsKKwl9CisJbXNtX2RzaS0+ aG9zdCA9ICZtc21faG9zdC0+YmFzZTsKKwltc21fZHNpLT5pZCA9IG1zbV9ob3N0LT5pZDsKKwor CURCRygiRHNpIEhvc3QgJWQgaW5pdGlhbGl6ZWQiLCBtc21faG9zdC0+aWQpOworCXJldHVybiAw OworCitmYWlsOgorCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgbXNtX2RzaV9ob3N0X2Rlc3Ryb3ko c3RydWN0IG1pcGlfZHNpX2hvc3QgKmhvc3QpCit7CisJc3RydWN0IG1zbV9kc2lfaG9zdCAqbXNt X2hvc3QgPSB0b19tc21fZHNpX2hvc3QoaG9zdCk7CisKKwlEQkcoIiIpOworCWRzaV90eF9idWZf ZnJlZShtc21faG9zdCk7CisJaWYgKG1zbV9ob3N0LT53b3JrcXVldWUpIHsKKwkJZmx1c2hfd29y a3F1ZXVlKG1zbV9ob3N0LT53b3JrcXVldWUpOworCQlkZXN0cm95X3dvcmtxdWV1ZShtc21faG9z dC0+d29ya3F1ZXVlKTsKKwkJbXNtX2hvc3QtPndvcmtxdWV1ZSA9IE5VTEw7CisJfQorCisJbXV0 ZXhfZGVzdHJveSgmbXNtX2hvc3QtPmNsa19tdXRleCk7CisJbXV0ZXhfZGVzdHJveSgmbXNtX2hv c3QtPmNtZF9tdXRleCk7CisJbXV0ZXhfZGVzdHJveSgmbXNtX2hvc3QtPmRldl9tdXRleCk7Cit9 CisKK2ludCBtc21fZHNpX2hvc3RfbW9kZXNldF9pbml0KHN0cnVjdCBtaXBpX2RzaV9ob3N0ICpo b3N0LAorCQkJCQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBtc21fZHNpX2hv c3QgKm1zbV9ob3N0ID0gdG9fbXNtX2RzaV9ob3N0KGhvc3QpOworCXN0cnVjdCBwbGF0Zm9ybV9k ZXZpY2UgKnBkZXYgPSBtc21faG9zdC0+cGRldjsKKwlpbnQgcmV0OworCisJbXNtX2hvc3QtPmly cSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKHBkZXYtPmRldi5vZl9ub2RlLCAwKTsKKwlpZiAobXNt X2hvc3QtPmlycSA8IDApIHsKKwkJcmV0ID0gbXNtX2hvc3QtPmlycTsKKwkJZGV2X2VycihkZXYt PmRldiwgImZhaWxlZCB0byBnZXQgaXJxOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9 CisKKwlyZXQgPSBkZXZtX3JlcXVlc3RfaXJxKCZwZGV2LT5kZXYsIG1zbV9ob3N0LT5pcnEsCisJ CQlkc2lfaG9zdF9pcnEsIElSUUZfVFJJR0dFUl9ISUdIIHwgSVJRRl9PTkVTSE9ULAorCQkJImRz aV9pc3IiLCBtc21faG9zdCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2 LCAiZmFpbGVkIHRvIHJlcXVlc3QgSVJRJXU6ICVkXG4iLAorCQkJCW1zbV9ob3N0LT5pcnEsIHJl dCk7CisJCXJldHVybiByZXQ7CisJfQorCisJbXNtX2hvc3QtPmRldiA9IGRldjsKKwlyZXQgPSBk c2lfdHhfYnVmX2FsbG9jKG1zbV9ob3N0LCBTWl80Syk7CisJaWYgKHJldCkgeworCQlwcl9lcnIo IiVzOiBhbGxvYyB0eCBnZW0gb2JqIGZhaWxlZCwgJWRcbiIsIF9fZnVuY19fLCByZXQpOworCQly ZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitpbnQgbXNtX2RzaV9ob3N0X3JlZ2lz dGVyKHN0cnVjdCBtaXBpX2RzaV9ob3N0ICpob3N0LCBib29sIGNoZWNrX2RlZmVyKQoreworCXN0 cnVjdCBtc21fZHNpX2hvc3QgKm1zbV9ob3N0ID0gdG9fbXNtX2RzaV9ob3N0KGhvc3QpOworCXN0 cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZTsKKwlpbnQgcmV0OworCisJLyogUmVnaXN0ZXIgbWlwaSBk c2kgaG9zdCAqLworCWlmICghbXNtX2hvc3QtPnJlZ2lzdGVyZWQpIHsKKwkJaG9zdC0+ZGV2ID0g Jm1zbV9ob3N0LT5wZGV2LT5kZXY7CisJCWhvc3QtPm9wcyA9ICZkc2lfaG9zdF9vcHM7CisJCXJl dCA9IG1pcGlfZHNpX2hvc3RfcmVnaXN0ZXIoaG9zdCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4g cmV0OworCisJCW1zbV9ob3N0LT5yZWdpc3RlcmVkID0gdHJ1ZTsKKworCQkvKiBJZiB0aGUgcGFu ZWwgZHJpdmVyIGhhcyBub3QgYmVlbiBwcm9iZWQgYWZ0ZXIgaG9zdCByZWdpc3RlciwKKwkJICog d2Ugc2hvdWxkIGRlZmVyIHRoZSBob3N0J3MgcHJvYmUuCisJCSAqIEl0IG1ha2VzIHN1cmUgcGFu ZWwgaXMgY29ubmVjdGVkIHdoZW4gZmJjb24gZGV0ZWN0cworCQkgKiBjb25uZWN0b3Igc3RhdHVz IGFuZCBnZXRzIHRoZSBwcm9wZXIgZGlzcGxheSBtb2RlIHRvCisJCSAqIGNyZWF0ZSBmcmFtZWJ1 ZmZlci4KKwkJICovCisJCWlmIChjaGVja19kZWZlcikgeworCQkJbm9kZSA9IG9mX2dldF9jaGls ZF9ieV9uYW1lKG1zbV9ob3N0LT5wZGV2LT5kZXYub2Zfbm9kZSwKKwkJCQkJCQkicGFuZWwiKTsK KwkJCWlmIChub2RlKSB7CisJCQkJaWYgKCFvZl9kcm1fZmluZF9wYW5lbChub2RlKSkKKwkJCQkJ cmV0dXJuIC1FUFJPQkVfREVGRVI7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKwor dm9pZCBtc21fZHNpX2hvc3RfdW5yZWdpc3RlcihzdHJ1Y3QgbWlwaV9kc2lfaG9zdCAqaG9zdCkK K3sKKwlzdHJ1Y3QgbXNtX2RzaV9ob3N0ICptc21faG9zdCA9IHRvX21zbV9kc2lfaG9zdChob3N0 KTsKKworCWlmIChtc21faG9zdC0+cmVnaXN0ZXJlZCkgeworCQltaXBpX2RzaV9ob3N0X3VucmVn aXN0ZXIoaG9zdCk7CisJCWhvc3QtPmRldiA9IE5VTEw7CisJCWhvc3QtPm9wcyA9IE5VTEw7CisJ CW1zbV9ob3N0LT5yZWdpc3RlcmVkID0gZmFsc2U7CisJfQorfQorCitpbnQgbXNtX2RzaV9ob3N0 X3hmZXJfcHJlcGFyZShzdHJ1Y3QgbWlwaV9kc2lfaG9zdCAqaG9zdCwKKwkJCQljb25zdCBzdHJ1 Y3QgbWlwaV9kc2lfbXNnICptc2cpCit7CisJc3RydWN0IG1zbV9kc2lfaG9zdCAqbXNtX2hvc3Qg PSB0b19tc21fZHNpX2hvc3QoaG9zdCk7CisKKwkvKiBUT0RPOiBtYWtlIHN1cmUgZHNpX2NtZF9t ZHAgaXMgaWRsZS4KKwkgKiBTaW5jZSBEU0k2RyB2MS4yLjAsIHdlIGNhbiBzZXQgRFNJX1RSSUdf Q1RSTC5CTE9DS19ETUFfV0lUSElOX0ZSQU1FCisJICogdG8gYXNrIEgvVyB0byB3YWl0IHVudGls IGNtZCBtZHAgaXMgaWRsZS4gUy9XIHdhaXQgaXMgbm90IG5lZWRlZC4KKwkgKiBIb3cgdG8gaGFu ZGxlIHRoZSBvbGQgdmVyc2lvbnM/IFdhaXQgZm9yIG1kcCBjbWQgZG9uZT8KKwkgKi8KKworCS8q CisJICogbWRzcyBpbnRlcnJ1cHQgaXMgZ2VuZXJhdGVkIGluIG1kcCBjb3JlIGNsb2NrIGRvbWFp bgorCSAqIG1kcCBjbG9jayBuZWVkIHRvIGJlIGVuYWJsZWQgdG8gcmVjZWl2ZSBkc2kgaW50ZXJy dXB0CisJICovCisJZHNpX2Nsa19jdHJsKG1zbV9ob3N0LCAxKTsKKworCS8qIFRPRE86IHZvdGUg Zm9yIGJ1cyBiYW5kd2lkdGggKi8KKworCWlmICghKG1zZy0+ZmxhZ3MgJiBNSVBJX0RTSV9NU0df VVNFX0xQTSkpCisJCWRzaV9zZXRfdHhfcG93ZXJfbW9kZSgwLCBtc21faG9zdCk7CisKKwltc21f aG9zdC0+ZG1hX2NtZF9jdHJsX3Jlc3RvcmUgPSBkc2lfcmVhZChtc21faG9zdCwgUkVHX0RTSV9D VFJMKTsKKwlkc2lfd3JpdGUobXNtX2hvc3QsIFJFR19EU0lfQ1RSTCwKKwkJbXNtX2hvc3QtPmRt YV9jbWRfY3RybF9yZXN0b3JlIHwKKwkJRFNJX0NUUkxfQ01EX01PREVfRU4gfAorCQlEU0lfQ1RS TF9FTkFCTEUpOworCWRzaV9pbnRyX2N0cmwobXNtX2hvc3QsIERTSV9JUlFfTUFTS19DTURfRE1B X0RPTkUsIDEpOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgbXNtX2RzaV9ob3N0X3hmZXJfcmVz dG9yZShzdHJ1Y3QgbWlwaV9kc2lfaG9zdCAqaG9zdCwKKwkJCQljb25zdCBzdHJ1Y3QgbWlwaV9k c2lfbXNnICptc2cpCit7CisJc3RydWN0IG1zbV9kc2lfaG9zdCAqbXNtX2hvc3QgPSB0b19tc21f ZHNpX2hvc3QoaG9zdCk7CisKKwlkc2lfaW50cl9jdHJsKG1zbV9ob3N0LCBEU0lfSVJRX01BU0tf Q01EX0RNQV9ET05FLCAwKTsKKwlkc2lfd3JpdGUobXNtX2hvc3QsIFJFR19EU0lfQ1RSTCwgbXNt X2hvc3QtPmRtYV9jbWRfY3RybF9yZXN0b3JlKTsKKworCWlmICghKG1zZy0+ZmxhZ3MgJiBNSVBJ X0RTSV9NU0dfVVNFX0xQTSkpCisJCWRzaV9zZXRfdHhfcG93ZXJfbW9kZSgxLCBtc21faG9zdCk7 CisKKwkvKiBUT0RPOiB1bnZvdGUgZm9yIGJ1cyBiYW5kd2lkdGggKi8KKworCWRzaV9jbGtfY3Ry bChtc21faG9zdCwgMCk7Cit9CisKK2ludCBtc21fZHNpX2hvc3RfY21kX3R4KHN0cnVjdCBtaXBp X2RzaV9ob3N0ICpob3N0LAorCQkJCWNvbnN0IHN0cnVjdCBtaXBpX2RzaV9tc2cgKm1zZykKK3sK KwlzdHJ1Y3QgbXNtX2RzaV9ob3N0ICptc21faG9zdCA9IHRvX21zbV9kc2lfaG9zdChob3N0KTsK KworCXJldHVybiBkc2lfY21kczJidWZfdHgobXNtX2hvc3QsIG1zZyk7Cit9CisKK2ludCBtc21f ZHNpX2hvc3RfY21kX3J4KHN0cnVjdCBtaXBpX2RzaV9ob3N0ICpob3N0LAorCQkJCWNvbnN0IHN0 cnVjdCBtaXBpX2RzaV9tc2cgKm1zZykKK3sKKwlzdHJ1Y3QgbXNtX2RzaV9ob3N0ICptc21faG9z dCA9IHRvX21zbV9kc2lfaG9zdChob3N0KTsKKwlpbnQgZGF0YV9ieXRlLCByeF9ieXRlLCBkbGVu LCBlbmQ7CisJaW50IHNob3J0X3Jlc3BvbnNlLCBkaWZmLCBwa3Rfc2l6ZSwgcmV0ID0gMDsKKwlj aGFyIGNtZDsKKwlpbnQgcmxlbiA9IG1zZy0+cnhfbGVuOworCXU4ICpidWY7CisKKwlpZiAocmxl biA8PSAyKSB7CisJCXNob3J0X3Jlc3BvbnNlID0gMTsKKwkJcGt0X3NpemUgPSBybGVuOworCQly eF9ieXRlID0gNDsKKwl9IGVsc2UgeworCQlzaG9ydF9yZXNwb25zZSA9IDA7CisJCWRhdGFfYnl0 ZSA9IDEwOwkvKiBmaXJzdCByZWFkICovCisJCWlmIChybGVuIDwgZGF0YV9ieXRlKQorCQkJcGt0 X3NpemUgPSBybGVuOworCQllbHNlCisJCQlwa3Rfc2l6ZSA9IGRhdGFfYnl0ZTsKKwkJcnhfYnl0 ZSA9IGRhdGFfYnl0ZSArIDY7IC8qIDQgaGVhZGVyICsgMiBjcmMgKi8KKwl9CisKKwlidWYgPSBt c21faG9zdC0+cnhfYnVmOworCWVuZCA9IDA7CisJd2hpbGUgKCFlbmQpIHsKKwkJdTggdHhbMl0g PSB7cGt0X3NpemUgJiAweGZmLCBwa3Rfc2l6ZSA+PiA4fTsKKwkJc3RydWN0IG1pcGlfZHNpX21z ZyBtYXhfcGt0X3NpemVfbXNnID0geworCQkJLmNoYW5uZWwgPSBtc2ctPmNoYW5uZWwsCisJCQku dHlwZSA9IE1JUElfRFNJX1NFVF9NQVhJTVVNX1JFVFVSTl9QQUNLRVRfU0laRSwKKwkJCS50eF9s ZW4gPSAyLAorCQkJLnR4X2J1ZiA9IHR4LAorCQl9OworCisJCURCRygicmxlbj0lZCBwa3Rfc2l6 ZT0lZCByeF9ieXRlPSVkIiwKKwkJCXJsZW4sIHBrdF9zaXplLCByeF9ieXRlKTsKKworCQlyZXQg PSBkc2lfY21kczJidWZfdHgobXNtX2hvc3QsICZtYXhfcGt0X3NpemVfbXNnKTsKKwkJaWYgKHJl dCA8IDIpIHsKKwkJCXByX2VycigiJXM6IFNldCBtYXggcGt0IHNpemUgZmFpbGVkLCAlZFxuIiwK KwkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJaWYgKCht c21faG9zdC0+Y2ZnLT5tYWpvciA9PSBNU01fRFNJX1ZFUl9NQUpPUl82RykgJiYKKwkJCShtc21f aG9zdC0+Y2ZnLT5taW5vciA+PSBNU01fRFNJXzZHX1ZFUl9NSU5PUl9WMV8xKSkgeworCQkJLyog Q2xlYXIgdGhlIFJEQktfREFUQSByZWdpc3RlcnMgKi8KKwkJCWRzaV93cml0ZShtc21faG9zdCwg UkVHX0RTSV9SREJLX0RBVEFfQ1RSTCwKKwkJCQkJRFNJX1JEQktfREFUQV9DVFJMX0NMUik7CisJ CQl3bWIoKTsgLyogbWFrZSBzdXJlIHRoZSBSREJLIHJlZ2lzdGVycyBhcmUgY2xlYXJlZCAqLwor CQkJZHNpX3dyaXRlKG1zbV9ob3N0LCBSRUdfRFNJX1JEQktfREFUQV9DVFJMLCAwKTsKKwkJCXdt YigpOyAvKiByZWxlYXNlIGNsZWFyZWQgc3RhdHVzIGJlZm9yZSB0cmFuc2ZlciAqLworCQl9CisK KwkJcmV0ID0gZHNpX2NtZHMyYnVmX3R4KG1zbV9ob3N0LCBtc2cpOworCQlpZiAocmV0IDwgbXNn LT50eF9sZW4pIHsKKwkJCXByX2VycigiJXM6IFJlYWQgY21kIFR4IGZhaWxlZCwgJWRcbiIsIF9f ZnVuY19fLCByZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCS8qCisJCSAqIG9uY2UgY21k X2RtYV9kb25lIGludGVycnVwdCByZWNlaXZlZCwKKwkJICogcmV0dXJuIGRhdGEgZnJvbSBjbGll bnQgaXMgcmVhZHkgYW5kIHN0b3JlZAorCQkgKiBhdCBSREJLX0RBVEEgcmVnaXN0ZXIgYWxyZWFk eQorCQkgKiBzaW5jZSByeCBmaWZvIGlzIDE2IGJ5dGVzLCBkY3MgaGVhZGVyIGlzIGtlcHQgYXQg Zmlyc3QgbG9vcCwKKwkJICogYWZ0ZXIgdGhhdCBkY3MgaGVhZGVyIGxvc3QgZHVyaW5nIHNoaWZ0 IGludG8gcmVnaXN0ZXJzCisJCSAqLworCQlkbGVuID0gZHNpX2NtZF9kbWFfcngobXNtX2hvc3Qs IGJ1ZiwgcnhfYnl0ZSwgcGt0X3NpemUpOworCisJCWlmIChkbGVuIDw9IDApCisJCQlyZXR1cm4g MDsKKworCQlpZiAoc2hvcnRfcmVzcG9uc2UpCisJCQlicmVhazsKKworCQlpZiAocmxlbiA8PSBk YXRhX2J5dGUpIHsKKwkJCWRpZmYgPSBkYXRhX2J5dGUgLSBybGVuOworCQkJZW5kID0gMTsKKwkJ fSBlbHNlIHsKKwkJCWRpZmYgPSAwOworCQkJcmxlbiAtPSBkYXRhX2J5dGU7CisJCX0KKworCQlp ZiAoIWVuZCkgeworCQkJZGxlbiAtPSAyOyAvKiAyIGNyYyAqLworCQkJZGxlbiAtPSBkaWZmOwor CQkJYnVmICs9IGRsZW47CS8qIG5leHQgc3RhcnQgcG9zaXRpb24gKi8KKwkJCWRhdGFfYnl0ZSA9 IDE0OwkvKiBOT1QgZmlyc3QgcmVhZCAqLworCQkJaWYgKHJsZW4gPCBkYXRhX2J5dGUpCisJCQkJ cGt0X3NpemUgKz0gcmxlbjsKKwkJCWVsc2UKKwkJCQlwa3Rfc2l6ZSArPSBkYXRhX2J5dGU7CisJ CQlEQkcoImJ1Zj0lcCBkbGVuPSVkIGRpZmY9JWQiLCBidWYsIGRsZW4sIGRpZmYpOworCQl9CisJ fQorCisJLyoKKwkgKiBGb3Igc2luZ2xlIExvbmcgcmVhZCwgaWYgdGhlIHJlcXVlc3RlZCBybGVu IDwgMTAsCisJICogd2UgbmVlZCB0byBzaGlmdCB0aGUgc3RhcnQgcG9zaXRpb24gb2YgcngKKwkg KiBkYXRhIGJ1ZmZlciB0byBza2lwIHRoZSBieXRlcyB3aGljaCBhcmUgbm90CisJICogdXBkYXRl ZC4KKwkgKi8KKwlpZiAocGt0X3NpemUgPCAxMCAmJiAhc2hvcnRfcmVzcG9uc2UpCisJCWJ1ZiA9 IG1zbV9ob3N0LT5yeF9idWYgKyAoMTAgLSBybGVuKTsKKwllbHNlCisJCWJ1ZiA9IG1zbV9ob3N0 LT5yeF9idWY7CisKKwljbWQgPSBidWZbMF07CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIE1JUElf RFNJX1JYX0FDS05PV0xFREdFX0FORF9FUlJPUl9SRVBPUlQ6CisJCXByX2VycigiJXM6IHJ4IEFD S19FUlJfUEFDTEFHRVxuIiwgX19mdW5jX18pOworCQlyZXQgPSAwOworCWNhc2UgTUlQSV9EU0lf UlhfR0VORVJJQ19TSE9SVF9SRUFEX1JFU1BPTlNFXzFCWVRFOgorCWNhc2UgTUlQSV9EU0lfUlhf RENTX1NIT1JUX1JFQURfUkVTUE9OU0VfMUJZVEU6CisJCXJldCA9IGRzaV9zaG9ydF9yZWFkMV9y ZXNwKGJ1ZiwgbXNnKTsKKwkJYnJlYWs7CisJY2FzZSBNSVBJX0RTSV9SWF9HRU5FUklDX1NIT1JU X1JFQURfUkVTUE9OU0VfMkJZVEU6CisJY2FzZSBNSVBJX0RTSV9SWF9EQ1NfU0hPUlRfUkVBRF9S RVNQT05TRV8yQllURToKKwkJcmV0ID0gZHNpX3Nob3J0X3JlYWQyX3Jlc3AoYnVmLCBtc2cpOwor CQlicmVhazsKKwljYXNlIE1JUElfRFNJX1JYX0dFTkVSSUNfTE9OR19SRUFEX1JFU1BPTlNFOgor CWNhc2UgTUlQSV9EU0lfUlhfRENTX0xPTkdfUkVBRF9SRVNQT05TRToKKwkJcmV0ID0gZHNpX2xv bmdfcmVhZF9yZXNwKGJ1ZiwgbXNnKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJfd2Fybigi JXM6SW52YWxpZCByZXNwb25zZSBjbWRcbiIsIF9fZnVuY19fKTsKKwkJcmV0ID0gMDsKKwl9CisK KwlyZXR1cm4gcmV0OworfQorCit2b2lkIG1zbV9kc2lfaG9zdF9jbWRfeGZlcl9jb21taXQoc3Ry dWN0IG1pcGlfZHNpX2hvc3QgKmhvc3QsIHUzMiBpb3ZhLCB1MzIgbGVuKQoreworCXN0cnVjdCBt c21fZHNpX2hvc3QgKm1zbV9ob3N0ID0gdG9fbXNtX2RzaV9ob3N0KGhvc3QpOworCisJZHNpX3dy aXRlKG1zbV9ob3N0LCBSRUdfRFNJX0RNQV9CQVNFLCBpb3ZhKTsKKwlkc2lfd3JpdGUobXNtX2hv c3QsIFJFR19EU0lfRE1BX0xFTiwgbGVuKTsKKwlkc2lfd3JpdGUobXNtX2hvc3QsIFJFR19EU0lf VFJJR19ETUEsIDEpOworCisJLyogTWFrZSBzdXJlIHRyaWdnZXIgaGFwcGVucyAqLworCXdtYigp OworfQorCitpbnQgbXNtX2RzaV9ob3N0X2VuYWJsZShzdHJ1Y3QgbWlwaV9kc2lfaG9zdCAqaG9z dCkKK3sKKwlzdHJ1Y3QgbXNtX2RzaV9ob3N0ICptc21faG9zdCA9IHRvX21zbV9kc2lfaG9zdCho b3N0KTsKKworCWRzaV9vcF9tb2RlX2NvbmZpZyhtc21faG9zdCwKKwkJISEobXNtX2hvc3QtPm1v ZGVfZmxhZ3MgJiBNSVBJX0RTSV9NT0RFX1ZJREVPKSwgdHJ1ZSk7CisKKwkvKiBUT0RPOiBjbG9j ayBzaG91bGQgYmUgdHVybmVkIG9mZiBmb3IgY29tbWFuZCBtb2RlLAorCSAqIGFuZCBvbmx5IHR1 cm5lZCBvbiBiZWZvcmUgTURQIFNUQVJULgorCSAqIFRoaXMgcGFydCBvZiBjb2RlIHNob3VsZCBi ZSBlbmFibGVkIG9uY2UgbWRwIGRyaXZlciBzdXBwb3J0IGl0LgorCSAqLworCS8qIGlmIChtc21f cGFuZWwtPm1vZGUgPT0gTVNNX0RTSV9DTURfTU9ERSkKKwkJZHNpX2Nsa19jdHJsKG1zbV9ob3N0 LCAwKTsgKi8KKworCXJldHVybiAwOworfQorCitpbnQgbXNtX2RzaV9ob3N0X2Rpc2FibGUoc3Ry dWN0IG1pcGlfZHNpX2hvc3QgKmhvc3QpCit7CisJc3RydWN0IG1zbV9kc2lfaG9zdCAqbXNtX2hv c3QgPSB0b19tc21fZHNpX2hvc3QoaG9zdCk7CisKKwlkc2lfb3BfbW9kZV9jb25maWcobXNtX2hv c3QsCisJCSEhKG1zbV9ob3N0LT5tb2RlX2ZsYWdzICYgTUlQSV9EU0lfTU9ERV9WSURFTyksIGZh bHNlKTsKKworCS8qIFNpbmNlIHdlIGhhdmUgZGlzYWJsZWQgSU5URiwgdGhlIHZpZGVvIGVuZ2lu ZSB3b24ndCBzdG9wIHNvIHRoYXQKKwkgKiB0aGUgY21kIGVuZ2luZSB3aWxsIGJlIGJsb2NrZWQu CisJICogUmVzZXQgdG8gZGlzYWJsZSB2aWRlbyBlbmdpbmUgc28gdGhhdCB3ZSBjYW4gc2VuZCBv ZmYgY21kLgorCSAqLworCWRzaV9zd19yZXNldChtc21faG9zdCk7CisKKwlyZXR1cm4gMDsKK30K KworaW50IG1zbV9kc2lfaG9zdF9wb3dlcl9vbihzdHJ1Y3QgbWlwaV9kc2lfaG9zdCAqaG9zdCkK K3sKKwlzdHJ1Y3QgbXNtX2RzaV9ob3N0ICptc21faG9zdCA9IHRvX21zbV9kc2lfaG9zdChob3N0 KTsKKwl1MzIgY2xrX3ByZSA9IDAsIGNsa19wb3N0ID0gMDsKKwlpbnQgcmV0ID0gMDsKKworCW11 dGV4X2xvY2soJm1zbV9ob3N0LT5kZXZfbXV0ZXgpOworCWlmIChtc21faG9zdC0+cG93ZXJfb24p IHsKKwkJREJHKCJkc2kgaG9zdCBhbHJlYWR5IG9uIik7CisJCWdvdG8gdW5sb2NrX3JldDsKKwl9 CisKKwlyZXQgPSBkc2lfY2FsY19jbGtfcmF0ZShtc21faG9zdCk7CisJaWYgKHJldCkgeworCQlw cl9lcnIoIiVzOiB1bmFibGUgdG8gY2FsYyBjbGsgcmF0ZSwgJWRcbiIsIF9fZnVuY19fLCByZXQp OworCQlnb3RvIHVubG9ja19yZXQ7CisJfQorCisJcmV0ID0gZHNpX2hvc3RfcmVndWxhdG9yX2Vu YWJsZShtc21faG9zdCk7CisJaWYgKHJldCkgeworCQlwcl9lcnIoIiVzOkZhaWxlZCB0byBlbmFi bGUgdnJlZ3MucmV0PSVkXG4iLAorCQkJX19mdW5jX18sIHJldCk7CisJCWdvdG8gdW5sb2NrX3Jl dDsKKwl9CisKKwlyZXQgPSBkc2lfYnVzX2Nsa19lbmFibGUobXNtX2hvc3QpOworCWlmIChyZXQp IHsKKwkJcHJfZXJyKCIlczogZmFpbGVkIHRvIGVuYWJsZSBidXMgY2xvY2tzLCAlZFxuIiwgX19m dW5jX18sIHJldCk7CisJCWdvdG8gZmFpbF9kaXNhYmxlX3JlZzsKKwl9CisKKwlkc2lfcGh5X3N3 X3Jlc2V0KG1zbV9ob3N0KTsKKwlyZXQgPSBtc21fZHNpX21hbmFnZXJfcGh5X2VuYWJsZShtc21f aG9zdC0+aWQsCisJCQkJCW1zbV9ob3N0LT5ieXRlX2Nsa19yYXRlICogOCwKKwkJCQkJY2xrX2dl dF9yYXRlKG1zbV9ob3N0LT5lc2NfY2xrKSwKKwkJCQkJJmNsa19wcmUsICZjbGtfcG9zdCk7CisJ ZHNpX2J1c19jbGtfZGlzYWJsZShtc21faG9zdCk7CisJaWYgKHJldCkgeworCQlwcl9lcnIoIiVz OiBmYWlsZWQgdG8gZW5hYmxlIHBoeSwgJWRcbiIsIF9fZnVuY19fLCByZXQpOworCQlnb3RvIGZh aWxfZGlzYWJsZV9yZWc7CisJfQorCisJcmV0ID0gZHNpX2Nsa19jdHJsKG1zbV9ob3N0LCAxKTsK KwlpZiAocmV0KSB7CisJCXByX2VycigiJXM6IGZhaWxlZCB0byBlbmFibGUgY2xvY2tzLiByZXQ9 JWRcbiIsIF9fZnVuY19fLCByZXQpOworCQlnb3RvIGZhaWxfZGlzYWJsZV9yZWc7CisJfQorCisJ ZHNpX3RpbWluZ19zZXR1cChtc21faG9zdCk7CisJZHNpX3N3X3Jlc2V0KG1zbV9ob3N0KTsKKwlk c2lfY3RybF9jb25maWcobXNtX2hvc3QsIHRydWUsIGNsa19wcmUsIGNsa19wb3N0KTsKKworCWlm IChtc21faG9zdC0+ZGlzcF9lbl9ncGlvKQorCQlncGlvZF9zZXRfdmFsdWUobXNtX2hvc3QtPmRp c3BfZW5fZ3BpbywgMSk7CisKKwltc21faG9zdC0+cG93ZXJfb24gPSB0cnVlOworCW11dGV4X3Vu bG9jaygmbXNtX2hvc3QtPmRldl9tdXRleCk7CisKKwlyZXR1cm4gMDsKKworZmFpbF9kaXNhYmxl X3JlZzoKKwlkc2lfaG9zdF9yZWd1bGF0b3JfZGlzYWJsZShtc21faG9zdCk7Cit1bmxvY2tfcmV0 OgorCW11dGV4X3VubG9jaygmbXNtX2hvc3QtPmRldl9tdXRleCk7CisJcmV0dXJuIHJldDsKK30K KworaW50IG1zbV9kc2lfaG9zdF9wb3dlcl9vZmYoc3RydWN0IG1pcGlfZHNpX2hvc3QgKmhvc3Qp Cit7CisJc3RydWN0IG1zbV9kc2lfaG9zdCAqbXNtX2hvc3QgPSB0b19tc21fZHNpX2hvc3QoaG9z dCk7CisKKwltdXRleF9sb2NrKCZtc21faG9zdC0+ZGV2X211dGV4KTsKKwlpZiAoIW1zbV9ob3N0 LT5wb3dlcl9vbikgeworCQlEQkcoImRzaSBob3N0IGFscmVhZHkgb2ZmIik7CisJCWdvdG8gdW5s b2NrX3JldDsKKwl9CisKKwlkc2lfY3RybF9jb25maWcobXNtX2hvc3QsIGZhbHNlLCAwLCAwKTsK KworCWlmIChtc21faG9zdC0+ZGlzcF9lbl9ncGlvKQorCQlncGlvZF9zZXRfdmFsdWUobXNtX2hv c3QtPmRpc3BfZW5fZ3BpbywgMCk7CisKKwltc21fZHNpX21hbmFnZXJfcGh5X2Rpc2FibGUobXNt X2hvc3QtPmlkKTsKKworCWRzaV9jbGtfY3RybChtc21faG9zdCwgMCk7CisKKwlkc2lfaG9zdF9y ZWd1bGF0b3JfZGlzYWJsZShtc21faG9zdCk7CisKKwlEQkcoIi0iKTsKKworCW1zbV9ob3N0LT5w b3dlcl9vbiA9IGZhbHNlOworCit1bmxvY2tfcmV0OgorCW11dGV4X3VubG9jaygmbXNtX2hvc3Qt PmRldl9tdXRleCk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBtc21fZHNpX2hvc3Rfc2V0X2Rpc3Bs YXlfbW9kZShzdHJ1Y3QgbWlwaV9kc2lfaG9zdCAqaG9zdCwKKwkJCQkJc3RydWN0IGRybV9kaXNw bGF5X21vZGUgKm1vZGUpCit7CisJc3RydWN0IG1zbV9kc2lfaG9zdCAqbXNtX2hvc3QgPSB0b19t c21fZHNpX2hvc3QoaG9zdCk7CisKKwlpZiAobXNtX2hvc3QtPm1vZGUpIHsKKwkJZHJtX21vZGVf ZGVzdHJveShtc21faG9zdC0+ZGV2LCBtc21faG9zdC0+bW9kZSk7CisJCW1zbV9ob3N0LT5tb2Rl ID0gTlVMTDsKKwl9CisKKwltc21faG9zdC0+bW9kZSA9IGRybV9tb2RlX2R1cGxpY2F0ZShtc21f aG9zdC0+ZGV2LCBtb2RlKTsKKwlpZiAoSVNfRVJSKG1zbV9ob3N0LT5tb2RlKSkgeworCQlwcl9l cnIoIiVzOiBjYW5ub3QgZHVwbGljYXRlIG1vZGVcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIFBU Ul9FUlIobXNtX2hvc3QtPm1vZGUpOworCX0KKworCXJldHVybiAwOworfQorCitzdHJ1Y3QgZHJt X3BhbmVsICptc21fZHNpX2hvc3RfZ2V0X3BhbmVsKHN0cnVjdCBtaXBpX2RzaV9ob3N0ICpob3N0 LAorCQkJCXVuc2lnbmVkIGxvbmcgKnBhbmVsX2ZsYWdzKQoreworCXN0cnVjdCBtc21fZHNpX2hv c3QgKm1zbV9ob3N0ID0gdG9fbXNtX2RzaV9ob3N0KGhvc3QpOworCXN0cnVjdCBkcm1fcGFuZWwg KnBhbmVsOworCisJcGFuZWwgPSBvZl9kcm1fZmluZF9wYW5lbChtc21faG9zdC0+cGFuZWxfbm9k ZSk7CisJaWYgKHBhbmVsX2ZsYWdzKQorCQkJKnBhbmVsX2ZsYWdzID0gbXNtX2hvc3QtPm1vZGVf ZmxhZ3M7CisKKwlyZXR1cm4gcGFuZWw7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2Ry bS9tc20vZHNpL2RzaV9tYW5hZ2VyLmMgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2RzaS9kc2lfbWFu YWdlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2NmQ1NmMKLS0tIC9k ZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2RzaS9kc2lfbWFuYWdlci5jCkBAIC0w LDAgKzEsNjk5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCBUaGUgTGludXggRm91bmRh dGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBz b2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5k ZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIg YW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUg Rm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhv cGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsg d2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkg b3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2Vu ZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlICJt c21fa21zLmgiCisjaW5jbHVkZSAiZHNpLmgiCisKK3N0cnVjdCBtc21fZHNpX21hbmFnZXIgewor CXN0cnVjdCBtc21fZHNpICpkc2lbRFNJX01BWF07CisKKwlib29sIGlzX2R1YWxfcGFuZWw7CisJ Ym9vbCBpc19zeW5jX25lZWRlZDsKKwlpbnQgbWFzdGVyX3BhbmVsX2lkOworfTsKKworc3RhdGlj IHN0cnVjdCBtc21fZHNpX21hbmFnZXIgbXNtX2RzaW1fZ2xiOworCisjZGVmaW5lIElTX0RVQUxf UEFORUwoKQkJKG1zbV9kc2ltX2dsYi5pc19kdWFsX3BhbmVsKQorI2RlZmluZSBJU19TWU5DX05F RURFRCgpCShtc21fZHNpbV9nbGIuaXNfc3luY19uZWVkZWQpCisjZGVmaW5lIElTX01BU1RFUl9Q QU5FTChpZCkJKG1zbV9kc2ltX2dsYi5tYXN0ZXJfcGFuZWxfaWQgPT0gaWQpCisKK3N0YXRpYyBp bmxpbmUgc3RydWN0IG1zbV9kc2kgKmRzaV9tZ3JfZ2V0X2RzaShpbnQgaWQpCit7CisJcmV0dXJu IG1zbV9kc2ltX2dsYi5kc2lbaWRdOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBtc21fZHNp ICpkc2lfbWdyX2dldF9vdGhlcl9kc2koaW50IGlkKQoreworCXJldHVybiBtc21fZHNpbV9nbGIu ZHNpWyhpZCArIDEpICUgRFNJX01BWF07Cit9CisKK3N0YXRpYyBpbnQgZHNpX21ncl9wYXJzZV9k dWFsX3BhbmVsKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsIGludCBpZCkKK3sKKwlzdHJ1Y3QgbXNt X2RzaV9tYW5hZ2VyICptc21fZHNpbSA9ICZtc21fZHNpbV9nbGI7CisKKwkvKiBXZSBhc3N1bWUg MiBkc2kgbm9kZXMgaGF2ZSB0aGUgc2FtZSBpbmZvcm1hdGlvbiBvZiBkdWFsLXBhbmVsIGFuZAor CSAqIHN5bmMtbW9kZSwgYW5kIG9ubHkgb25lIG5vZGUgc3BlY2lmaWVzIG1hc3RlciBpbiBjYXNl IG9mIGR1YWwgbW9kZS4KKwkgKi8KKwlpZiAoIW1zbV9kc2ltLT5pc19kdWFsX3BhbmVsKQorCQlt c21fZHNpbS0+aXNfZHVhbF9wYW5lbCA9IG9mX3Byb3BlcnR5X3JlYWRfYm9vbCgKKwkJCQkJCW5w LCAicWNvbSxkdWFsLXBhbmVsLW1vZGUiKTsKKworCWlmIChtc21fZHNpbS0+aXNfZHVhbF9wYW5l bCkgeworCQlpZiAob2ZfcHJvcGVydHlfcmVhZF9ib29sKG5wLCAicWNvbSxtYXN0ZXItcGFuZWwi KSkKKwkJCW1zbV9kc2ltLT5tYXN0ZXJfcGFuZWxfaWQgPSBpZDsKKwkJaWYgKCFtc21fZHNpbS0+ aXNfc3luY19uZWVkZWQpCisJCQltc21fZHNpbS0+aXNfc3luY19uZWVkZWQgPSBvZl9wcm9wZXJ0 eV9yZWFkX2Jvb2woCisJCQkJCW5wLCAicWNvbSxzeW5jLWR1YWwtcGFuZWwiKTsKKwl9CisKKwly ZXR1cm4gMDsKK30KKworc3RydWN0IGRzaV9jb25uZWN0b3IgeworCXN0cnVjdCBkcm1fY29ubmVj dG9yIGJhc2U7CisJaW50IGlkOworfTsKKworc3RydWN0IGRzaV9icmlkZ2UgeworCXN0cnVjdCBk cm1fYnJpZGdlIGJhc2U7CisJaW50IGlkOworfTsKKworI2RlZmluZSB0b19kc2lfY29ubmVjdG9y KHgpIGNvbnRhaW5lcl9vZih4LCBzdHJ1Y3QgZHNpX2Nvbm5lY3RvciwgYmFzZSkKKyNkZWZpbmUg dG9fZHNpX2JyaWRnZSh4KSBjb250YWluZXJfb2YoeCwgc3RydWN0IGRzaV9icmlkZ2UsIGJhc2Up CisKK3N0YXRpYyBpbmxpbmUgaW50IGRzaV9tZ3JfY29ubmVjdG9yX2dldF9pZChzdHJ1Y3QgZHJt X2Nvbm5lY3RvciAqY29ubmVjdG9yKQoreworCXN0cnVjdCBkc2lfY29ubmVjdG9yICpkc2lfY29u bmVjdG9yID0gdG9fZHNpX2Nvbm5lY3Rvcihjb25uZWN0b3IpOworCXJldHVybiBkc2lfY29ubmVj dG9yLT5pZDsKK30KKworc3RhdGljIGludCBkc2lfbWdyX2JyaWRnZV9nZXRfaWQoc3RydWN0IGRy bV9icmlkZ2UgKmJyaWRnZSkKK3sKKwlzdHJ1Y3QgZHNpX2JyaWRnZSAqZHNpX2JyaWRnZSA9IHRv X2RzaV9icmlkZ2UoYnJpZGdlKTsKKwlyZXR1cm4gZHNpX2JyaWRnZS0+aWQ7Cit9CisKK3N0YXRp YyBlbnVtIGRybV9jb25uZWN0b3Jfc3RhdHVzIGRzaV9tZ3JfY29ubmVjdG9yX2RldGVjdCgKKwkJ c3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwgYm9vbCBmb3JjZSkKK3sKKwlpbnQgaWQg PSBkc2lfbWdyX2Nvbm5lY3Rvcl9nZXRfaWQoY29ubmVjdG9yKTsKKwlzdHJ1Y3QgbXNtX2RzaSAq bXNtX2RzaSA9IGRzaV9tZ3JfZ2V0X2RzaShpZCk7CisJc3RydWN0IG1zbV9kc2kgKm90aGVyX2Rz aSA9IGRzaV9tZ3JfZ2V0X290aGVyX2RzaShpZCk7CisJc3RydWN0IG1zbV9kcm1fcHJpdmF0ZSAq cHJpdiA9IGNvbm5lY3Rvci0+ZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgbXNtX2ttcyAqa21z ID0gcHJpdi0+a21zOworCisJREJHKCJpZD0lZCIsIGlkKTsKKwlpZiAoIW1zbV9kc2ktPnBhbmVs KSB7CisJCW1zbV9kc2ktPnBhbmVsID0gbXNtX2RzaV9ob3N0X2dldF9wYW5lbChtc21fZHNpLT5o b3N0LAorCQkJCQkJJm1zbV9kc2ktPnBhbmVsX2ZsYWdzKTsKKworCQkvKiBUaGVyZSBpcyBvbmx5 IDEgcGFuZWwgaW4gdGhlIGdsb2JhbCBwYW5lbCBsaXN0CisJCSAqIGZvciBkdWFsIHBhbmVsIG1v ZGUuIFRoZXJlZm9yZSBzbGF2ZSBkc2kgc2hvdWxkIGdldAorCQkgKiB0aGUgZHJtX3BhbmVsIGlu c3RhbmNlIGZyb20gbWFzdGVyIGRzaSwgYW5kCisJCSAqIGtlZXAgdXNpbmcgdGhlIHBhbmVsIGZs YWdzIGdvdCBmcm9tIHRoZSBjdXJyZW50IERTSSBsaW5rLgorCQkgKi8KKwkJaWYgKCFtc21fZHNp LT5wYW5lbCAmJiBJU19EVUFMX1BBTkVMKCkgJiYKKwkJCSFJU19NQVNURVJfUEFORUwoaWQpICYm IG90aGVyX2RzaSkKKwkJCW1zbV9kc2ktPnBhbmVsID0gbXNtX2RzaV9ob3N0X2dldF9wYW5lbCgK KwkJCQkJb3RoZXJfZHNpLT5ob3N0LCBOVUxMKTsKKworCQlpZiAobXNtX2RzaS0+cGFuZWwgJiYg SVNfRFVBTF9QQU5FTCgpKQorCQkJZHJtX29iamVjdF9hdHRhY2hfcHJvcGVydHkoJmNvbm5lY3Rv ci0+YmFzZSwKKwkJCQljb25uZWN0b3ItPmRldi0+bW9kZV9jb25maWcudGlsZV9wcm9wZXJ0eSwg MCk7CisKKwkJLyogU2V0IHNwbGl0IGRpc3BsYXkgaW5mbyB0byBrbXMgb25jZSBkdWFsIHBhbmVs IGlzIGNvbm5lY3RlZAorCQkgKiB0byBib3RoIGhvc3RzCisJCSAqLworCQlpZiAobXNtX2RzaS0+ cGFuZWwgJiYgSVNfRFVBTF9QQU5FTCgpICYmCisJCQlvdGhlcl9kc2kgJiYgb3RoZXJfZHNpLT5w YW5lbCkgeworCQkJYm9vbCBjbWRfbW9kZSA9ICEobXNtX2RzaS0+cGFuZWxfZmxhZ3MgJgorCQkJ CQkJTUlQSV9EU0lfTU9ERV9WSURFTyk7CisJCQlzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIg PSBtc21fZHNpX2dldF9lbmNvZGVyKAorCQkJCQlkc2lfbWdyX2dldF9kc2koRFNJX0VOQ09ERVJf TUFTVEVSKSk7CisJCQlzdHJ1Y3QgZHJtX2VuY29kZXIgKnNsYXZlX2VuYyA9IG1zbV9kc2lfZ2V0 X2VuY29kZXIoCisJCQkJCWRzaV9tZ3JfZ2V0X2RzaShEU0lfRU5DT0RFUl9TTEFWRSkpOworCisJ CQlpZiAoa21zLT5mdW5jcy0+c2V0X3NwbGl0X2Rpc3BsYXkpCisJCQkJa21zLT5mdW5jcy0+c2V0 X3NwbGl0X2Rpc3BsYXkoa21zLCBlbmNvZGVyLAorCQkJCQkJCXNsYXZlX2VuYywgY21kX21vZGUp OworCQkJZWxzZQorCQkJCXByX2VycigibWRwIGRvZXMgbm90IHN1cHBvcnQgZHVhbCBwYW5lbFxu Iik7CisJCX0KKwl9CisKKwlyZXR1cm4gbXNtX2RzaS0+cGFuZWwgPyBjb25uZWN0b3Jfc3RhdHVz X2Nvbm5lY3RlZCA6CisJCWNvbm5lY3Rvcl9zdGF0dXNfZGlzY29ubmVjdGVkOworfQorCitzdGF0 aWMgdm9pZCBkc2lfbWdyX2Nvbm5lY3Rvcl9kZXN0cm95KHN0cnVjdCBkcm1fY29ubmVjdG9yICpj b25uZWN0b3IpCit7CisJREJHKCIiKTsKKwlkcm1fY29ubmVjdG9yX3VucmVnaXN0ZXIoY29ubmVj dG9yKTsKKwlkcm1fY29ubmVjdG9yX2NsZWFudXAoY29ubmVjdG9yKTsKK30KKworc3RhdGljIHZv aWQgZHNpX2R1YWxfY29ubmVjdG9yX2ZpeF9tb2RlcyhzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29u bmVjdG9yKQoreworCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlLCAqbTsKKworCS8qIE9u bHkgc3VwcG9ydCBsZWZ0LXJpZ2h0IG1vZGUgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUo bW9kZSwgbSwgJmNvbm5lY3Rvci0+cHJvYmVkX21vZGVzLCBoZWFkKSB7CisJCW1vZGUtPmNsb2Nr ID4+PSAxOworCQltb2RlLT5oZGlzcGxheSA+Pj0gMTsKKwkJbW9kZS0+aHN5bmNfc3RhcnQgPj49 IDE7CisJCW1vZGUtPmhzeW5jX2VuZCA+Pj0gMTsKKwkJbW9kZS0+aHRvdGFsID4+PSAxOworCQlk cm1fbW9kZV9zZXRfbmFtZShtb2RlKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZHNpX2R1YWxfY29u bmVjdG9yX3RpbGVfaW5pdCgKKwkJCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsIGlu dCBpZCkKK3sKKwlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZTsKKwkvKiBGYWtlIHRvcG9s b2d5IGlkICovCisJY2hhciB0b3BvX2lkWzhdID0geydNJywgJ1MnLCAnTScsICdEJywgJ1UnLCAn RCcsICdTJywgJ0knfTsKKworCS8qIFVzZSB0aGUgZmlyc3QgbW9kZSBvbmx5IGZvciBub3cgKi8K Kwltb2RlID0gbGlzdF9maXJzdF9lbnRyeSgmY29ubmVjdG9yLT5wcm9iZWRfbW9kZXMsCisJCQkJ c3RydWN0IGRybV9kaXNwbGF5X21vZGUsCisJCQkJaGVhZCk7CisJaWYgKCFtb2RlKQorCQlyZXR1 cm4gLUVJTlZBTDsKKworCWNvbm5lY3Rvci0+aGFzX3RpbGUgPSB0cnVlOworCWNvbm5lY3Rvci0+ dGlsZV9ncm91cCA9IGRybV9tb2RlX2dldF90aWxlX2dyb3VwKAorCQkJCQljb25uZWN0b3ItPmRl diwgdG9wb19pZCk7CisJaWYgKCFjb25uZWN0b3ItPnRpbGVfZ3JvdXApCisJCWNvbm5lY3Rvci0+ dGlsZV9ncm91cCA9IGRybV9tb2RlX2NyZWF0ZV90aWxlX2dyb3VwKAorCQkJCQljb25uZWN0b3It PmRldiwgdG9wb19pZCk7CisJaWYgKCFjb25uZWN0b3ItPnRpbGVfZ3JvdXApIHsKKwkJcHJfZXJy KCIlczogZmFpbGVkIHRvIGNyZWF0ZSB0aWxlIGdyb3VwXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVy biAtRU5PTUVNOworCX0KKworCWNvbm5lY3Rvci0+dGlsZV9pc19zaW5nbGVfbW9uaXRvciA9IHRy dWU7CisKKwkvKiBtb2RlIGhhcyBiZWVuIGZpeGVkICovCisJY29ubmVjdG9yLT50aWxlX2hfc2l6 ZSA9IG1vZGUtPmhkaXNwbGF5OworCWNvbm5lY3Rvci0+dGlsZV92X3NpemUgPSBtb2RlLT52ZGlz cGxheTsKKworCS8qIE9ubHkgc3VwcG9ydCBsZWZ0LXJpZ2h0IG1vZGUgKi8KKwljb25uZWN0b3It Pm51bV9oX3RpbGUgPSAyOworCWNvbm5lY3Rvci0+bnVtX3ZfdGlsZSA9IDE7CisKKwljb25uZWN0 b3ItPnRpbGVfdl9sb2MgPSAwOworCWNvbm5lY3Rvci0+dGlsZV9oX2xvYyA9IChpZCA9PSBEU0lf UklHSFQpID8gMSA6IDA7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkc2lfbWdyX2Nv bm5lY3Rvcl9nZXRfbW9kZXMoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKK3sKKwlp bnQgaWQgPSBkc2lfbWdyX2Nvbm5lY3Rvcl9nZXRfaWQoY29ubmVjdG9yKTsKKwlzdHJ1Y3QgbXNt X2RzaSAqbXNtX2RzaSA9IGRzaV9tZ3JfZ2V0X2RzaShpZCk7CisJc3RydWN0IGRybV9wYW5lbCAq cGFuZWwgPSBtc21fZHNpLT5wYW5lbDsKKwlpbnQgcmV0LCBudW07CisKKwlpZiAoIXBhbmVsKQor CQlyZXR1cm4gMDsKKworCS8qIFNpbmNlIHdlIGhhdmUgMiBjb25uZWN0b3JzLCBidXQgb25seSAx IGRybV9wYW5lbCBpbiBkdWFsIERTSSBtb2RlLAorCSAqIHBhbmVsIHNob3VsZCBub3QgYXR0YWNo IHRvIGFueSBjb25uZWN0b3IuCisJICogT25seSB0ZW1wb3JhcmlseSBhdHRhY2ggcGFuZWwgdG8g dGhlIGN1cnJlbnQgY29ubmVjdG9yIGhlcmUsCisJICogdG8gbGV0IHBhbmVsIHNldCBtb2RlIHRv IHRoaXMgY29ubmVjdG9yLgorCSAqLworCWRybV9wYW5lbF9hdHRhY2gocGFuZWwsIGNvbm5lY3Rv cik7CisJbnVtID0gZHJtX3BhbmVsX2dldF9tb2RlcyhwYW5lbCk7CisJZHJtX3BhbmVsX2RldGFj aChwYW5lbCk7CisJaWYgKCFudW0pCisJCXJldHVybiAwOworCisJaWYgKElTX0RVQUxfUEFORUwo KSkgeworCQkvKiByZXBvcnQgaGFsZiByZXNvbHV0aW9uIHRvIHVzZXIgKi8KKwkJZHNpX2R1YWxf Y29ubmVjdG9yX2ZpeF9tb2Rlcyhjb25uZWN0b3IpOworCQlyZXQgPSBkc2lfZHVhbF9jb25uZWN0 b3JfdGlsZV9pbml0KGNvbm5lY3RvciwgaWQpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsK KwkJcmV0ID0gZHJtX21vZGVfY29ubmVjdG9yX3NldF90aWxlX3Byb3BlcnR5KGNvbm5lY3Rvcik7 CisJCWlmIChyZXQpIHsKKwkJCXByX2VycigiJXM6IHNldCB0aWxlIHByb3BlcnR5IGZhaWxlZCwg JWRcbiIsCisJCQkJCV9fZnVuY19fLCByZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKwor CXJldHVybiBudW07Cit9CisKK3N0YXRpYyBpbnQgZHNpX21ncl9jb25uZWN0b3JfbW9kZV92YWxp ZChzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLAorCQkJCXN0cnVjdCBkcm1fZGlzcGxh eV9tb2RlICptb2RlKQoreworCWludCBpZCA9IGRzaV9tZ3JfY29ubmVjdG9yX2dldF9pZChjb25u ZWN0b3IpOworCXN0cnVjdCBtc21fZHNpICptc21fZHNpID0gZHNpX21ncl9nZXRfZHNpKGlkKTsK KwlzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIgPSBtc21fZHNpX2dldF9lbmNvZGVyKG1zbV9k c2kpOworCXN0cnVjdCBtc21fZHJtX3ByaXZhdGUgKnByaXYgPSBjb25uZWN0b3ItPmRldi0+ZGV2 X3ByaXZhdGU7CisJc3RydWN0IG1zbV9rbXMgKmttcyA9IHByaXYtPmttczsKKwlsb25nIGFjdHVh bCwgcmVxdWVzdGVkOworCisJREJHKCIiKTsKKwlyZXF1ZXN0ZWQgPSAxMDAwICogbW9kZS0+Y2xv Y2s7CisJYWN0dWFsID0ga21zLT5mdW5jcy0+cm91bmRfcGl4Y2xrKGttcywgcmVxdWVzdGVkLCBl bmNvZGVyKTsKKworCURCRygicmVxdWVzdGVkPSVsZCwgYWN0dWFsPSVsZCIsIHJlcXVlc3RlZCwg YWN0dWFsKTsKKwlpZiAoYWN0dWFsICE9IHJlcXVlc3RlZCkKKwkJcmV0dXJuIE1PREVfQ0xPQ0tf UkFOR0U7CisKKwlyZXR1cm4gTU9ERV9PSzsKK30KKworc3RhdGljIHN0cnVjdCBkcm1fZW5jb2Rl ciAqCitkc2lfbWdyX2Nvbm5lY3Rvcl9iZXN0X2VuY29kZXIoc3RydWN0IGRybV9jb25uZWN0b3Ig KmNvbm5lY3RvcikKK3sKKwlpbnQgaWQgPSBkc2lfbWdyX2Nvbm5lY3Rvcl9nZXRfaWQoY29ubmVj dG9yKTsKKwlzdHJ1Y3QgbXNtX2RzaSAqbXNtX2RzaSA9IGRzaV9tZ3JfZ2V0X2RzaShpZCk7CisK KwlEQkcoIiIpOworCXJldHVybiBtc21fZHNpX2dldF9lbmNvZGVyKG1zbV9kc2kpOworfQorCitz dGF0aWMgdm9pZCBkc2lfbWdyX2JyaWRnZV9wcmVfZW5hYmxlKHN0cnVjdCBkcm1fYnJpZGdlICpi cmlkZ2UpCit7CisJaW50IGlkID0gZHNpX21ncl9icmlkZ2VfZ2V0X2lkKGJyaWRnZSk7CisJc3Ry dWN0IG1zbV9kc2kgKm1zbV9kc2kgPSBkc2lfbWdyX2dldF9kc2koaWQpOworCXN0cnVjdCBtc21f ZHNpICptc21fZHNpMSA9IGRzaV9tZ3JfZ2V0X2RzaShEU0lfMSk7CisJc3RydWN0IG1pcGlfZHNp X2hvc3QgKmhvc3QgPSBtc21fZHNpLT5ob3N0OworCXN0cnVjdCBkcm1fcGFuZWwgKnBhbmVsID0g bXNtX2RzaS0+cGFuZWw7CisJYm9vbCBpc19kdWFsX3BhbmVsID0gSVNfRFVBTF9QQU5FTCgpOwor CWludCByZXQ7CisKKwlEQkcoImlkPSVkIiwgaWQpOworCWlmICghcGFuZWwgfHwgKGlzX2R1YWxf cGFuZWwgJiYgKERTSV8xID09IGlkKSkpCisJCXJldHVybjsKKworCXJldCA9IG1zbV9kc2lfaG9z dF9wb3dlcl9vbihob3N0KTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiJXM6IHBvd2VyIG9uIGhv c3QgJWQgZmFpbGVkLCAlZFxuIiwgX19mdW5jX18sIGlkLCByZXQpOworCQlnb3RvIGhvc3Rfb25f ZmFpbDsKKwl9CisKKwlpZiAoaXNfZHVhbF9wYW5lbCAmJiBtc21fZHNpMSkgeworCQlyZXQgPSBt c21fZHNpX2hvc3RfcG93ZXJfb24obXNtX2RzaTEtPmhvc3QpOworCQlpZiAocmV0KSB7CisJCQlw cl9lcnIoIiVzOiBwb3dlciBvbiBob3N0MSBmYWlsZWQsICVkXG4iLAorCQkJCQkJCV9fZnVuY19f LCByZXQpOworCQkJZ290byBob3N0MV9vbl9mYWlsOworCQl9CisJfQorCisJLyogQWx3YXlzIGNh bGwgcGFuZWwgZnVuY3Rpb25zIG9uY2UsIGJlY2F1c2UgZXZlbiBmb3IgZHVhbCBwYW5lbHMsCisJ ICogdGhlcmUgaXMgb25seSBvbmUgZHJtX3BhbmVsIGluc3RhbmNlLgorCSAqLworCXJldCA9IGRy bV9wYW5lbF9wcmVwYXJlKHBhbmVsKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiJXM6IHByZXBh cmUgcGFuZWwgJWQgZmFpbGVkLCAlZFxuIiwgX19mdW5jX18sIGlkLCByZXQpOworCQlnb3RvIHBh bmVsX3ByZXBfZmFpbDsKKwl9CisKKwlyZXQgPSBtc21fZHNpX2hvc3RfZW5hYmxlKGhvc3QpOwor CWlmIChyZXQpIHsKKwkJcHJfZXJyKCIlczogZW5hYmxlIGhvc3QgJWQgZmFpbGVkLCAlZFxuIiwg X19mdW5jX18sIGlkLCByZXQpOworCQlnb3RvIGhvc3RfZW5fZmFpbDsKKwl9CisKKwlpZiAoaXNf ZHVhbF9wYW5lbCAmJiBtc21fZHNpMSkgeworCQlyZXQgPSBtc21fZHNpX2hvc3RfZW5hYmxlKG1z bV9kc2kxLT5ob3N0KTsKKwkJaWYgKHJldCkgeworCQkJcHJfZXJyKCIlczogZW5hYmxlIGhvc3Qx IGZhaWxlZCwgJWRcbiIsIF9fZnVuY19fLCByZXQpOworCQkJZ290byBob3N0MV9lbl9mYWlsOwor CQl9CisJfQorCisJcmV0ID0gZHJtX3BhbmVsX2VuYWJsZShwYW5lbCk7CisJaWYgKHJldCkgewor CQlwcl9lcnIoIiVzOiBlbmFibGUgcGFuZWwgJWQgZmFpbGVkLCAlZFxuIiwgX19mdW5jX18sIGlk LCByZXQpOworCQlnb3RvIHBhbmVsX2VuX2ZhaWw7CisJfQorCisJcmV0dXJuOworCitwYW5lbF9l bl9mYWlsOgorCWlmIChpc19kdWFsX3BhbmVsICYmIG1zbV9kc2kxKQorCQltc21fZHNpX2hvc3Rf ZGlzYWJsZShtc21fZHNpMS0+aG9zdCk7Citob3N0MV9lbl9mYWlsOgorCW1zbV9kc2lfaG9zdF9k aXNhYmxlKGhvc3QpOworaG9zdF9lbl9mYWlsOgorCWRybV9wYW5lbF91bnByZXBhcmUocGFuZWwp OworcGFuZWxfcHJlcF9mYWlsOgorCWlmIChpc19kdWFsX3BhbmVsICYmIG1zbV9kc2kxKQorCQlt c21fZHNpX2hvc3RfcG93ZXJfb2ZmKG1zbV9kc2kxLT5ob3N0KTsKK2hvc3QxX29uX2ZhaWw6CisJ bXNtX2RzaV9ob3N0X3Bvd2VyX29mZihob3N0KTsKK2hvc3Rfb25fZmFpbDoKKwlyZXR1cm47Cit9 CisKK3N0YXRpYyB2b2lkIGRzaV9tZ3JfYnJpZGdlX2VuYWJsZShzdHJ1Y3QgZHJtX2JyaWRnZSAq YnJpZGdlKQoreworCURCRygiIik7Cit9CisKK3N0YXRpYyB2b2lkIGRzaV9tZ3JfYnJpZGdlX2Rp c2FibGUoc3RydWN0IGRybV9icmlkZ2UgKmJyaWRnZSkKK3sKKwlEQkcoIiIpOworfQorCitzdGF0 aWMgdm9pZCBkc2lfbWdyX2JyaWRnZV9wb3N0X2Rpc2FibGUoc3RydWN0IGRybV9icmlkZ2UgKmJy aWRnZSkKK3sKKwlpbnQgaWQgPSBkc2lfbWdyX2JyaWRnZV9nZXRfaWQoYnJpZGdlKTsKKwlzdHJ1 Y3QgbXNtX2RzaSAqbXNtX2RzaSA9IGRzaV9tZ3JfZ2V0X2RzaShpZCk7CisJc3RydWN0IG1zbV9k c2kgKm1zbV9kc2kxID0gZHNpX21ncl9nZXRfZHNpKERTSV8xKTsKKwlzdHJ1Y3QgbWlwaV9kc2lf aG9zdCAqaG9zdCA9IG1zbV9kc2ktPmhvc3Q7CisJc3RydWN0IGRybV9wYW5lbCAqcGFuZWwgPSBt c21fZHNpLT5wYW5lbDsKKwlib29sIGlzX2R1YWxfcGFuZWwgPSBJU19EVUFMX1BBTkVMKCk7CisJ aW50IHJldDsKKworCURCRygiaWQ9JWQiLCBpZCk7CisKKwlpZiAoIXBhbmVsIHx8IChpc19kdWFs X3BhbmVsICYmIChEU0lfMSA9PSBpZCkpKQorCQlyZXR1cm47CisKKwlyZXQgPSBkcm1fcGFuZWxf ZGlzYWJsZShwYW5lbCk7CisJaWYgKHJldCkKKwkJcHJfZXJyKCIlczogUGFuZWwgJWQgT0ZGIGZh aWxlZCwgJWRcbiIsIF9fZnVuY19fLCBpZCwgcmV0KTsKKworCXJldCA9IG1zbV9kc2lfaG9zdF9k aXNhYmxlKGhvc3QpOworCWlmIChyZXQpCisJCXByX2VycigiJXM6IGhvc3QgJWQgZGlzYWJsZSBm YWlsZWQsICVkXG4iLCBfX2Z1bmNfXywgaWQsIHJldCk7CisKKwlpZiAoaXNfZHVhbF9wYW5lbCAm JiBtc21fZHNpMSkgeworCQlyZXQgPSBtc21fZHNpX2hvc3RfZGlzYWJsZShtc21fZHNpMS0+aG9z dCk7CisJCWlmIChyZXQpCisJCQlwcl9lcnIoIiVzOiBob3N0MSBkaXNhYmxlIGZhaWxlZCwgJWRc biIsIF9fZnVuY19fLCByZXQpOworCX0KKworCXJldCA9IGRybV9wYW5lbF91bnByZXBhcmUocGFu ZWwpOworCWlmIChyZXQpCisJCXByX2VycigiJXM6IFBhbmVsICVkIHVucHJlcGFyZSBmYWlsZWQs JWRcbiIsIF9fZnVuY19fLCBpZCwgcmV0KTsKKworCXJldCA9IG1zbV9kc2lfaG9zdF9wb3dlcl9v ZmYoaG9zdCk7CisJaWYgKHJldCkKKwkJcHJfZXJyKCIlczogaG9zdCAlZCBwb3dlciBvZmYgZmFp bGVkLCVkXG4iLCBfX2Z1bmNfXywgaWQsIHJldCk7CisKKwlpZiAoaXNfZHVhbF9wYW5lbCAmJiBt c21fZHNpMSkgeworCQlyZXQgPSBtc21fZHNpX2hvc3RfcG93ZXJfb2ZmKG1zbV9kc2kxLT5ob3N0 KTsKKwkJaWYgKHJldCkKKwkJCXByX2VycigiJXM6IGhvc3QxIHBvd2VyIG9mZiBmYWlsZWQsICVk XG4iLAorCQkJCQkJCQlfX2Z1bmNfXywgcmV0KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGRzaV9t Z3JfYnJpZGdlX21vZGVfc2V0KHN0cnVjdCBkcm1fYnJpZGdlICpicmlkZ2UsCisJCXN0cnVjdCBk cm1fZGlzcGxheV9tb2RlICptb2RlLAorCQlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqYWRqdXN0 ZWRfbW9kZSkKK3sKKwlpbnQgaWQgPSBkc2lfbWdyX2JyaWRnZV9nZXRfaWQoYnJpZGdlKTsKKwlz dHJ1Y3QgbXNtX2RzaSAqbXNtX2RzaSA9IGRzaV9tZ3JfZ2V0X2RzaShpZCk7CisJc3RydWN0IG1z bV9kc2kgKm90aGVyX2RzaSA9IGRzaV9tZ3JfZ2V0X290aGVyX2RzaShpZCk7CisJc3RydWN0IG1p cGlfZHNpX2hvc3QgKmhvc3QgPSBtc21fZHNpLT5ob3N0OworCWJvb2wgaXNfZHVhbF9wYW5lbCA9 IElTX0RVQUxfUEFORUwoKTsKKworCURCRygic2V0IG1vZGU6ICVkOlwiJXNcIiAlZCAlZCAlZCAl ZCAlZCAlZCAlZCAlZCAlZCAlZCAweCV4IDB4JXgiLAorCQkJbW9kZS0+YmFzZS5pZCwgbW9kZS0+ bmFtZSwKKwkJCW1vZGUtPnZyZWZyZXNoLCBtb2RlLT5jbG9jaywKKwkJCW1vZGUtPmhkaXNwbGF5 LCBtb2RlLT5oc3luY19zdGFydCwKKwkJCW1vZGUtPmhzeW5jX2VuZCwgbW9kZS0+aHRvdGFsLAor CQkJbW9kZS0+dmRpc3BsYXksIG1vZGUtPnZzeW5jX3N0YXJ0LAorCQkJbW9kZS0+dnN5bmNfZW5k LCBtb2RlLT52dG90YWwsCisJCQltb2RlLT50eXBlLCBtb2RlLT5mbGFncyk7CisKKwlpZiAoaXNf ZHVhbF9wYW5lbCAmJiAoRFNJXzEgPT0gaWQpKQorCQlyZXR1cm47CisKKwltc21fZHNpX2hvc3Rf c2V0X2Rpc3BsYXlfbW9kZShob3N0LCBhZGp1c3RlZF9tb2RlKTsKKwlpZiAoaXNfZHVhbF9wYW5l bCAmJiBvdGhlcl9kc2kpCisJCW1zbV9kc2lfaG9zdF9zZXRfZGlzcGxheV9tb2RlKG90aGVyX2Rz aS0+aG9zdCwgYWRqdXN0ZWRfbW9kZSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2Nv bm5lY3Rvcl9mdW5jcyBkc2lfbWdyX2Nvbm5lY3Rvcl9mdW5jcyA9IHsKKwkuZHBtcyA9IGRybV9h dG9taWNfaGVscGVyX2Nvbm5lY3Rvcl9kcG1zLAorCS5kZXRlY3QgPSBkc2lfbWdyX2Nvbm5lY3Rv cl9kZXRlY3QsCisJLmZpbGxfbW9kZXMgPSBkcm1faGVscGVyX3Byb2JlX3NpbmdsZV9jb25uZWN0 b3JfbW9kZXMsCisJLmRlc3Ryb3kgPSBkc2lfbWdyX2Nvbm5lY3Rvcl9kZXN0cm95LAorCS5yZXNl dCA9IGRybV9hdG9taWNfaGVscGVyX2Nvbm5lY3Rvcl9yZXNldCwKKwkuYXRvbWljX2R1cGxpY2F0 ZV9zdGF0ZSA9IGRybV9hdG9taWNfaGVscGVyX2Nvbm5lY3Rvcl9kdXBsaWNhdGVfc3RhdGUsCisJ LmF0b21pY19kZXN0cm95X3N0YXRlID0gZHJtX2F0b21pY19oZWxwZXJfY29ubmVjdG9yX2Rlc3Ry b3lfc3RhdGUsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9jb25uZWN0b3JfaGVscGVy X2Z1bmNzIGRzaV9tZ3JfY29ubl9oZWxwZXJfZnVuY3MgPSB7CisJLmdldF9tb2RlcyA9IGRzaV9t Z3JfY29ubmVjdG9yX2dldF9tb2RlcywKKwkubW9kZV92YWxpZCA9IGRzaV9tZ3JfY29ubmVjdG9y X21vZGVfdmFsaWQsCisJLmJlc3RfZW5jb2RlciA9IGRzaV9tZ3JfY29ubmVjdG9yX2Jlc3RfZW5j b2RlciwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2JyaWRnZV9mdW5jcyBkc2lfbWdy X2JyaWRnZV9mdW5jcyA9IHsKKwkucHJlX2VuYWJsZSA9IGRzaV9tZ3JfYnJpZGdlX3ByZV9lbmFi bGUsCisJLmVuYWJsZSA9IGRzaV9tZ3JfYnJpZGdlX2VuYWJsZSwKKwkuZGlzYWJsZSA9IGRzaV9t Z3JfYnJpZGdlX2Rpc2FibGUsCisJLnBvc3RfZGlzYWJsZSA9IGRzaV9tZ3JfYnJpZGdlX3Bvc3Rf ZGlzYWJsZSwKKwkubW9kZV9zZXQgPSBkc2lfbWdyX2JyaWRnZV9tb2RlX3NldCwKK307CisKKy8q IGluaXRpYWxpemUgY29ubmVjdG9yICovCitzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqbXNtX2RzaV9t YW5hZ2VyX2Nvbm5lY3Rvcl9pbml0KHU4IGlkKQoreworCXN0cnVjdCBtc21fZHNpICptc21fZHNp ID0gZHNpX21ncl9nZXRfZHNpKGlkKTsKKwlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9y ID0gTlVMTDsKKwlzdHJ1Y3QgZHNpX2Nvbm5lY3RvciAqZHNpX2Nvbm5lY3RvcjsKKwlpbnQgcmV0 OworCisJZHNpX2Nvbm5lY3RvciA9IGRldm1fa3phbGxvYyhtc21fZHNpLT5kZXYtPmRldiwKKwkJ CQlzaXplb2YoKmRzaV9jb25uZWN0b3IpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRzaV9jb25uZWN0 b3IpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBmYWlsOworCX0KKworCWRzaV9jb25uZWN0 b3ItPmlkID0gaWQ7CisKKwljb25uZWN0b3IgPSAmZHNpX2Nvbm5lY3Rvci0+YmFzZTsKKworCXJl dCA9IGRybV9jb25uZWN0b3JfaW5pdChtc21fZHNpLT5kZXYsIGNvbm5lY3RvciwKKwkJCSZkc2lf bWdyX2Nvbm5lY3Rvcl9mdW5jcywgRFJNX01PREVfQ09OTkVDVE9SX0RTSSk7CisJaWYgKHJldCkK KwkJZ290byBmYWlsOworCisJZHJtX2Nvbm5lY3Rvcl9oZWxwZXJfYWRkKGNvbm5lY3RvciwgJmRz aV9tZ3JfY29ubl9oZWxwZXJfZnVuY3MpOworCisJLyogRW5hYmxlIEhQRCB0byBsZXQgaHBkIGV2 ZW50IGlzIGhhbmRsZWQKKwkgKiB3aGVuIHBhbmVsIGlzIGF0dGFjaGVkIHRvIHRoZSBob3N0Lgor CSAqLworCWNvbm5lY3Rvci0+cG9sbGVkID0gRFJNX0NPTk5FQ1RPUl9QT0xMX0hQRDsKKworCS8q IERpc3BsYXkgZHJpdmVyIGRvZXNuJ3Qgc3VwcG9ydCBpbnRlcmxhY2Ugbm93LiAqLworCWNvbm5l Y3Rvci0+aW50ZXJsYWNlX2FsbG93ZWQgPSAwOworCWNvbm5lY3Rvci0+ZG91Ymxlc2Nhbl9hbGxv d2VkID0gMDsKKworCXJldCA9IGRybV9jb25uZWN0b3JfcmVnaXN0ZXIoY29ubmVjdG9yKTsKKwlp ZiAocmV0KQorCQlnb3RvIGZhaWw7CisKKwlyZXR1cm4gY29ubmVjdG9yOworCitmYWlsOgorCWlm IChjb25uZWN0b3IpCisJCWRzaV9tZ3JfY29ubmVjdG9yX2Rlc3Ryb3koY29ubmVjdG9yKTsKKwor CXJldHVybiBFUlJfUFRSKHJldCk7Cit9CisKKy8qIGluaXRpYWxpemUgYnJpZGdlICovCitzdHJ1 Y3QgZHJtX2JyaWRnZSAqbXNtX2RzaV9tYW5hZ2VyX2JyaWRnZV9pbml0KHU4IGlkKQoreworCXN0 cnVjdCBtc21fZHNpICptc21fZHNpID0gZHNpX21ncl9nZXRfZHNpKGlkKTsKKwlzdHJ1Y3QgZHJt X2JyaWRnZSAqYnJpZGdlID0gTlVMTDsKKwlzdHJ1Y3QgZHNpX2JyaWRnZSAqZHNpX2JyaWRnZTsK KwlpbnQgcmV0OworCisJZHNpX2JyaWRnZSA9IGRldm1fa3phbGxvYyhtc21fZHNpLT5kZXYtPmRl diwKKwkJCQlzaXplb2YoKmRzaV9icmlkZ2UpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRzaV9icmlk Z2UpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBmYWlsOworCX0KKworCWRzaV9icmlkZ2Ut PmlkID0gaWQ7CisKKwlicmlkZ2UgPSAmZHNpX2JyaWRnZS0+YmFzZTsKKwlicmlkZ2UtPmZ1bmNz ID0gJmRzaV9tZ3JfYnJpZGdlX2Z1bmNzOworCisJcmV0ID0gZHJtX2JyaWRnZV9hdHRhY2gobXNt X2RzaS0+ZGV2LCBicmlkZ2UpOworCWlmIChyZXQpCisJCWdvdG8gZmFpbDsKKworCXJldHVybiBi cmlkZ2U7CisKK2ZhaWw6CisJaWYgKGJyaWRnZSkKKwkJbXNtX2RzaV9tYW5hZ2VyX2JyaWRnZV9k ZXN0cm95KGJyaWRnZSk7CisKKwlyZXR1cm4gRVJSX1BUUihyZXQpOworfQorCit2b2lkIG1zbV9k c2lfbWFuYWdlcl9icmlkZ2VfZGVzdHJveShzdHJ1Y3QgZHJtX2JyaWRnZSAqYnJpZGdlKQorewor fQorCitpbnQgbXNtX2RzaV9tYW5hZ2VyX3BoeV9lbmFibGUoaW50IGlkLAorCQljb25zdCB1bnNp Z25lZCBsb25nIGJpdF9yYXRlLCBjb25zdCB1bnNpZ25lZCBsb25nIGVzY19yYXRlLAorCQl1MzIg KmNsa19wcmUsIHUzMiAqY2xrX3Bvc3QpCit7CisJc3RydWN0IG1zbV9kc2kgKm1zbV9kc2kgPSBk c2lfbWdyX2dldF9kc2koaWQpOworCXN0cnVjdCBtc21fZHNpX3BoeSAqcGh5ID0gbXNtX2RzaS0+ cGh5OworCWludCByZXQ7CisKKwlyZXQgPSBtc21fZHNpX3BoeV9lbmFibGUocGh5LCBJU19EVUFM X1BBTkVMKCksIGJpdF9yYXRlLCBlc2NfcmF0ZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsK KworCW1zbV9kc2ktPnBoeV9lbmFibGVkID0gdHJ1ZTsKKwltc21fZHNpX3BoeV9nZXRfY2xrX3By ZV9wb3N0KHBoeSwgY2xrX3ByZSwgY2xrX3Bvc3QpOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQg bXNtX2RzaV9tYW5hZ2VyX3BoeV9kaXNhYmxlKGludCBpZCkKK3sKKwlzdHJ1Y3QgbXNtX2RzaSAq bXNtX2RzaSA9IGRzaV9tZ3JfZ2V0X2RzaShpZCk7CisJc3RydWN0IG1zbV9kc2kgKm1kc2kgPSBk c2lfbWdyX2dldF9kc2koRFNJX0NMT0NLX01BU1RFUik7CisJc3RydWN0IG1zbV9kc2kgKnNkc2kg PSBkc2lfbWdyX2dldF9kc2koRFNJX0NMT0NLX1NMQVZFKTsKKwlzdHJ1Y3QgbXNtX2RzaV9waHkg KnBoeSA9IG1zbV9kc2ktPnBoeTsKKworCS8qIGRpc2FibGUgRFNJIHBoeQorCSAqIEluIGR1YWwt ZHNpIGNvbmZpZ3VyYXRpb24sIHRoZSBwaHkgc2hvdWxkIGJlIGRpc2FibGVkIGZvciB0aGUKKwkg KiBmaXJzdCBjb250cm9sbGVyIG9ubHkgd2hlbiB0aGUgc2Vjb25kIGNvbnRyb2xsZXIgaXMgZGlz YWJsZWQuCisJICovCisJbXNtX2RzaS0+cGh5X2VuYWJsZWQgPSBmYWxzZTsKKwlpZiAoSVNfRFVB TF9QQU5FTCgpICYmIG1kc2kgJiYgc2RzaSkgeworCQlpZiAoIW1kc2ktPnBoeV9lbmFibGVkICYm ICFzZHNpLT5waHlfZW5hYmxlZCkgeworCQkJbXNtX2RzaV9waHlfZGlzYWJsZShzZHNpLT5waHkp OworCQkJbXNtX2RzaV9waHlfZGlzYWJsZShtZHNpLT5waHkpOworCQl9CisJfSBlbHNlIHsKKwkJ bXNtX2RzaV9waHlfZGlzYWJsZShwaHkpOworCX0KK30KKworaW50IG1zbV9kc2lfbWFuYWdlcl9j bWRfeGZlcihpbnQgaWQsIGNvbnN0IHN0cnVjdCBtaXBpX2RzaV9tc2cgKm1zZykKK3sKKwlzdHJ1 Y3QgbXNtX2RzaSAqbXNtX2RzaSA9IGRzaV9tZ3JfZ2V0X2RzaShpZCk7CisJc3RydWN0IG1zbV9k c2kgKm1zbV9kc2kwID0gZHNpX21ncl9nZXRfZHNpKERTSV8wKTsKKwlzdHJ1Y3QgbWlwaV9kc2lf aG9zdCAqaG9zdCA9IG1zbV9kc2ktPmhvc3Q7CisJYm9vbCBpc19yZWFkID0gKG1zZy0+cnhfYnVm ICYmIG1zZy0+cnhfbGVuKTsKKwlib29sIG5lZWRfc3luYyA9IChJU19TWU5DX05FRURFRCgpICYm ICFpc19yZWFkKTsKKwlpbnQgcmV0OworCisJaWYgKCFtc2ctPnR4X2J1ZiB8fCAhbXNnLT50eF9s ZW4pCisJCXJldHVybiAwOworCisJLyogSW4gZHVhbCBtYXN0ZXIgY2FzZSwgcGFuZWwgcmVxdWly ZXMgdGhlIHNhbWUgY29tbWFuZHMgc2VudCB0bworCSAqIGJvdGggRFNJIGxpbmtzLiBIb3N0IGlz c3VlcyB0aGUgY29tbWFuZCB0cmlnZ2VyIHRvIGJvdGggbGlua3MKKwkgKiB3aGVuIERTSV8xIGNh bGxzIHRoZSBjbWQgdHJhbnNmZXIgZnVuY3Rpb24sIG5vIG1hdHRlciBpdCBoYXBwZW5zCisJICog YmVmb3JlIG9yIGFmdGVyIERTSV8wIGNtZCB0cmFuc2Zlci4KKwkgKi8KKwlpZiAobmVlZF9zeW5j ICYmIChpZCA9PSBEU0lfMCkpCisJCXJldHVybiBpc19yZWFkID8gbXNnLT5yeF9sZW4gOiBtc2ct PnR4X2xlbjsKKworCWlmIChuZWVkX3N5bmMgJiYgbXNtX2RzaTApIHsKKwkJcmV0ID0gbXNtX2Rz aV9ob3N0X3hmZXJfcHJlcGFyZShtc21fZHNpMC0+aG9zdCwgbXNnKTsKKwkJaWYgKHJldCkgewor CQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIHByZXBhcmUgbm9uLXRyaWdnZXIgaG9zdCwgJWRcbiIs CisJCQkJX19mdW5jX18sIHJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCXJldCA9IG1z bV9kc2lfaG9zdF94ZmVyX3ByZXBhcmUoaG9zdCwgbXNnKTsKKwlpZiAocmV0KSB7CisJCXByX2Vy cigiJXM6IGZhaWxlZCB0byBwcmVwYXJlIGhvc3QsICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKKwkJ Z290byByZXN0b3JlX2hvc3QwOworCX0KKworCXJldCA9IGlzX3JlYWQgPyBtc21fZHNpX2hvc3Rf Y21kX3J4KGhvc3QsIG1zZykgOgorCQkJbXNtX2RzaV9ob3N0X2NtZF90eChob3N0LCBtc2cpOwor CisJbXNtX2RzaV9ob3N0X3hmZXJfcmVzdG9yZShob3N0LCBtc2cpOworCityZXN0b3JlX2hvc3Qw OgorCWlmIChuZWVkX3N5bmMgJiYgbXNtX2RzaTApCisJCW1zbV9kc2lfaG9zdF94ZmVyX3Jlc3Rv cmUobXNtX2RzaTAtPmhvc3QsIG1zZyk7CisKKwlyZXR1cm4gcmV0OworfQorCitib29sIG1zbV9k c2lfbWFuYWdlcl9jbWRfeGZlcl90cmlnZ2VyKGludCBpZCwgdTMyIGlvdmEsIHUzMiBsZW4pCit7 CisJc3RydWN0IG1zbV9kc2kgKm1zbV9kc2kgPSBkc2lfbWdyX2dldF9kc2koaWQpOworCXN0cnVj dCBtc21fZHNpICptc21fZHNpMCA9IGRzaV9tZ3JfZ2V0X2RzaShEU0lfMCk7CisJc3RydWN0IG1p cGlfZHNpX2hvc3QgKmhvc3QgPSBtc21fZHNpLT5ob3N0OworCisJaWYgKElTX1NZTkNfTkVFREVE KCkgJiYgKGlkID09IERTSV8wKSkKKwkJcmV0dXJuIGZhbHNlOworCisJaWYgKElTX1NZTkNfTkVF REVEKCkgJiYgbXNtX2RzaTApCisJCW1zbV9kc2lfaG9zdF9jbWRfeGZlcl9jb21taXQobXNtX2Rz aTAtPmhvc3QsIGlvdmEsIGxlbik7CisKKwltc21fZHNpX2hvc3RfY21kX3hmZXJfY29tbWl0KGhv c3QsIGlvdmEsIGxlbik7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworaW50IG1zbV9kc2lfbWFuYWdl cl9yZWdpc3RlcihzdHJ1Y3QgbXNtX2RzaSAqbXNtX2RzaSkKK3sKKwlzdHJ1Y3QgbXNtX2RzaV9t YW5hZ2VyICptc21fZHNpbSA9ICZtc21fZHNpbV9nbGI7CisJaW50IGlkID0gbXNtX2RzaS0+aWQ7 CisJc3RydWN0IG1zbV9kc2kgKm90aGVyX2RzaSA9IGRzaV9tZ3JfZ2V0X290aGVyX2RzaShpZCk7 CisJaW50IHJldDsKKworCWlmIChpZCA+IERTSV9NQVgpIHsKKwkJcHJfZXJyKCIlczogaW52YWxp ZCBpZCAlZFxuIiwgX19mdW5jX18sIGlkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYg KG1zbV9kc2ltLT5kc2lbaWRdKSB7CisJCXByX2VycigiJXM6IGRzaSVkIGFscmVhZHkgcmVnaXN0 ZXJlZFxuIiwgX19mdW5jX18sIGlkKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwltc21fZHNp bS0+ZHNpW2lkXSA9IG1zbV9kc2k7CisKKwlyZXQgPSBkc2lfbWdyX3BhcnNlX2R1YWxfcGFuZWwo bXNtX2RzaS0+cGRldi0+ZGV2Lm9mX25vZGUsIGlkKTsKKwlpZiAocmV0KSB7CisJCXByX2Vycigi JXM6IGZhaWxlZCB0byBwYXJzZSBkdWFsIHBhbmVsIGluZm9cbiIsIF9fZnVuY19fKTsKKwkJcmV0 dXJuIHJldDsKKwl9CisKKwlpZiAoIUlTX0RVQUxfUEFORUwoKSkgeworCQlyZXQgPSBtc21fZHNp X2hvc3RfcmVnaXN0ZXIobXNtX2RzaS0+aG9zdCwgdHJ1ZSk7CisJfSBlbHNlIGlmICghb3RoZXJf ZHNpKSB7CisJCXJldHVybiAwOworCX0gZWxzZSB7CisJCXN0cnVjdCBtc21fZHNpICptZHNpID0g SVNfTUFTVEVSX1BBTkVMKGlkKSA/CisJCQkJCW1zbV9kc2kgOiBvdGhlcl9kc2k7CisJCXN0cnVj dCBtc21fZHNpICpzZHNpID0gSVNfTUFTVEVSX1BBTkVMKGlkKSA/CisJCQkJCW90aGVyX2RzaSA6 IG1zbV9kc2k7CisJCS8qIFJlZ2lzdGVyIHNsYXZlIGhvc3QgZmlyc3QsIHNvIHRoYXQgc2xhdmUg RFNJIGRldmljZQorCQkgKiBoYXMgYSBjaGFuY2UgdG8gcHJvYmUsIGFuZCBkbyBub3QgYmxvY2sg dGhlIG1hc3RlcgorCQkgKiBEU0kgZGV2aWNlJ3MgcHJvYmUuCisJCSAqIEFsc28sIGRvIG5vdCBj aGVjayBkZWZlciBmb3IgdGhlIHNsYXZlIGhvc3QsCisJCSAqIGJlY2F1c2Ugb25seSBtYXN0ZXIg RFNJIGRldmljZSBhZGRzIHRoZSBwYW5lbCB0byBnbG9iYWwKKwkJICogcGFuZWwgbGlzdC4gVGhl IHBhbmVsJ3MgZGV2aWNlIGlzIHRoZSBtYXN0ZXIgRFNJIGRldmljZS4KKwkJICovCisJCXJldCA9 IG1zbV9kc2lfaG9zdF9yZWdpc3RlcihzZHNpLT5ob3N0LCBmYWxzZSk7CisJCWlmIChyZXQpCisJ CQlyZXR1cm4gcmV0OworCQlyZXQgPSBtc21fZHNpX2hvc3RfcmVnaXN0ZXIobWRzaS0+aG9zdCwg dHJ1ZSk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKwordm9pZCBtc21fZHNpX21hbmFnZXJfdW5y ZWdpc3RlcihzdHJ1Y3QgbXNtX2RzaSAqbXNtX2RzaSkKK3sKKwlzdHJ1Y3QgbXNtX2RzaV9tYW5h Z2VyICptc21fZHNpbSA9ICZtc21fZHNpbV9nbGI7CisKKwltc21fZHNpX2hvc3RfdW5yZWdpc3Rl cihtc21fZHNpLT5ob3N0KTsKKwltc21fZHNpbS0+ZHNpW21zbV9kc2ktPmlkXSA9IE5VTEw7Cit9 CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vZHNpL2RzaV9waHkuYyBiL2RyaXZl cnMvZ3B1L2RybS9tc20vZHNpL2RzaV9waHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw MDAwMDAwLi5mMGNlYTg5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9k c2kvZHNpX3BoeS5jCkBAIC0wLDAgKzEsMzUyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1 LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlz IHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29y IG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMg TGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkg dGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlz dHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRI T1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisg KiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBT ZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgor ICovCisKKyNpbmNsdWRlICJkc2kuaCIKKyNpbmNsdWRlICJkc2kueG1sLmgiCisKKyNkZWZpbmUg ZHNpX3BoeV9yZWFkKG9mZnNldCkgbXNtX3JlYWRsKChvZmZzZXQpKQorI2RlZmluZSBkc2lfcGh5 X3dyaXRlKG9mZnNldCwgZGF0YSkgbXNtX3dyaXRlbCgoZGF0YSksIChvZmZzZXQpKQorCitzdHJ1 Y3QgZHNpX2RwaHlfdGltaW5nIHsKKwl1MzIgY2xrX3ByZTsKKwl1MzIgY2xrX3Bvc3Q7CisJdTMy IGNsa196ZXJvOworCXUzMiBjbGtfdHJhaWw7CisJdTMyIGNsa19wcmVwYXJlOworCXUzMiBoc19l eGl0OworCXUzMiBoc196ZXJvOworCXUzMiBoc19wcmVwYXJlOworCXUzMiBoc190cmFpbDsKKwl1 MzIgaHNfcnFzdDsKKwl1MzIgdGFfZ287CisJdTMyIHRhX3N1cmU7CisJdTMyIHRhX2dldDsKK307 CisKK3N0cnVjdCBtc21fZHNpX3BoeSB7CisJdm9pZCBfX2lvbWVtICpiYXNlOworCXZvaWQgX19p b21lbSAqcmVnX2Jhc2U7CisJaW50IGlkOworCXN0cnVjdCBkc2lfZHBoeV90aW1pbmcgdGltaW5n OworCWludCAoKmVuYWJsZSkoc3RydWN0IG1zbV9kc2lfcGh5ICpwaHksIGJvb2wgaXNfZHVhbF9w YW5lbCwKKwkJY29uc3QgdW5zaWduZWQgbG9uZyBiaXRfcmF0ZSwgY29uc3QgdW5zaWduZWQgbG9u ZyBlc2NfcmF0ZSk7CisJaW50ICgqZGlzYWJsZSkoc3RydWN0IG1zbV9kc2lfcGh5ICpwaHkpOwor fTsKKworI2RlZmluZSBTX0RJVl9ST1VORF9VUChuLCBkKQlcCisJKCgobikgPj0gMCkgPyAoKChu KSArIChkKSAtIDEpIC8gKGQpKSA6ICgoKG4pIC0gKGQpICsgMSkgLyAoZCkpKQorCitzdGF0aWMg aW5saW5lIHMzMiBsaW5lYXJfaW50ZXIoczMyIHRtYXgsIHMzMiB0bWluLCBzMzIgcGVyY2VudCwK KwkJCQlzMzIgbWluX3Jlc3VsdCwgYm9vbCBldmVuKQoreworCXMzMiB2OworCXYgPSAodG1heCAt IHRtaW4pICogcGVyY2VudDsKKwl2ID0gU19ESVZfUk9VTkRfVVAodiwgMTAwKSArIHRtaW47CisJ aWYgKGV2ZW4gJiYgKHYgJiAweDEpKQorCQlyZXR1cm4gbWF4X3QoczMyLCBtaW5fcmVzdWx0LCB2 IC0gMSk7CisJZWxzZQorCQlyZXR1cm4gbWF4X3QoczMyLCBtaW5fcmVzdWx0LCB2KTsKK30KKwor c3RhdGljIHZvaWQgZHNpX2RwaHlfdGltaW5nX2NhbGNfY2xrX3plcm8oc3RydWN0IGRzaV9kcGh5 X3RpbWluZyAqdGltaW5nLAorCQkJCQlzMzIgdWksIHMzMiBjb2VmZiwgczMyIHBjbnQpCit7CisJ czMyIHRtYXgsIHRtaW4sIGNsa196OworCXMzMiB0ZW1wOworCisJLyogcmVzZXQgKi8KKwl0ZW1w ID0gMzAwICogY29lZmYgLSAoKHRpbWluZy0+Y2xrX3ByZXBhcmUgPj4gMSkgKyAxKSAqIDIgKiB1 aTsKKwl0bWluID0gU19ESVZfUk9VTkRfVVAodGVtcCwgdWkpIC0gMjsKKwlpZiAodG1pbiA+IDI1 NSkgeworCQl0bWF4ID0gNTExOworCQljbGtfeiA9IGxpbmVhcl9pbnRlcigyICogdG1pbiwgdG1p biwgcGNudCwgMCwgdHJ1ZSk7CisJfSBlbHNlIHsKKwkJdG1heCA9IDI1NTsKKwkJY2xrX3ogPSBs aW5lYXJfaW50ZXIodG1heCwgdG1pbiwgcGNudCwgMCwgdHJ1ZSk7CisJfQorCisJLyogYWRqdXN0 ICovCisJdGVtcCA9ICh0aW1pbmctPmhzX3Jxc3QgKyB0aW1pbmctPmNsa19wcmVwYXJlICsgY2xr X3opICYgMHg3OworCXRpbWluZy0+Y2xrX3plcm8gPSBjbGtfeiArIDggLSB0ZW1wOworfQorCitz dGF0aWMgaW50IGRzaV9kcGh5X3RpbWluZ19jYWxjKHN0cnVjdCBkc2lfZHBoeV90aW1pbmcgKnRp bWluZywKKwljb25zdCB1bnNpZ25lZCBsb25nIGJpdF9yYXRlLCBjb25zdCB1bnNpZ25lZCBsb25n IGVzY19yYXRlKQoreworCXMzMiB1aSwgbHB4OworCXMzMiB0bWF4LCB0bWluOworCXMzMiBwY250 MCA9IDEwOworCXMzMiBwY250MSA9IChiaXRfcmF0ZSA+IDEyMDAwMDAwMDApID8gMTUgOiAxMDsK KwlzMzIgcGNudDIgPSAxMDsKKwlzMzIgcGNudDMgPSAoYml0X3JhdGUgPiAxODAwMDAwMDApID8g MTAgOiA0MDsKKwlzMzIgY29lZmYgPSAxMDAwOyAvKiBQcmVjaXNpb24sIHNob3VsZCBhdm9pZCBv dmVyZmxvdyAqLworCXMzMiB0ZW1wOworCisJaWYgKCFiaXRfcmF0ZSB8fCAhZXNjX3JhdGUpCisJ CXJldHVybiAtRUlOVkFMOworCisJdWkgPSBtdWx0X2ZyYWMoTlNFQ19QRVJfTVNFQywgY29lZmYs IGJpdF9yYXRlIC8gMTAwMCk7CisJbHB4ID0gbXVsdF9mcmFjKE5TRUNfUEVSX01TRUMsIGNvZWZm LCBlc2NfcmF0ZSAvIDEwMDApOworCisJdG1heCA9IFNfRElWX1JPVU5EX1VQKDk1ICogY29lZmYs IHVpKSAtIDI7CisJdG1pbiA9IFNfRElWX1JPVU5EX1VQKDM4ICogY29lZmYsIHVpKSAtIDI7CisJ dGltaW5nLT5jbGtfcHJlcGFyZSA9IGxpbmVhcl9pbnRlcih0bWF4LCB0bWluLCBwY250MCwgMCwg dHJ1ZSk7CisKKwl0ZW1wID0gbHB4IC8gdWk7CisJaWYgKHRlbXAgJiAweDEpCisJCXRpbWluZy0+ aHNfcnFzdCA9IHRlbXA7CisJZWxzZQorCQl0aW1pbmctPmhzX3Jxc3QgPSBtYXhfdChzMzIsIDAs IHRlbXAgLSAyKTsKKworCS8qIENhbGN1bGF0ZSBjbGtfemVybyBhZnRlciBjbGtfcHJlcGFyZSBh bmQgaHNfcnFzdCAqLworCWRzaV9kcGh5X3RpbWluZ19jYWxjX2Nsa196ZXJvKHRpbWluZywgdWks IGNvZWZmLCBwY250Mik7CisKKwl0ZW1wID0gMTA1ICogY29lZmYgKyAxMiAqIHVpIC0gMjAgKiBj b2VmZjsKKwl0bWF4ID0gU19ESVZfUk9VTkRfVVAodGVtcCwgdWkpIC0gMjsKKwl0bWluID0gU19E SVZfUk9VTkRfVVAoNjAgKiBjb2VmZiwgdWkpIC0gMjsKKwl0aW1pbmctPmNsa190cmFpbCA9IGxp bmVhcl9pbnRlcih0bWF4LCB0bWluLCBwY250MywgMCwgdHJ1ZSk7CisKKwl0ZW1wID0gODUgKiBj b2VmZiArIDYgKiB1aTsKKwl0bWF4ID0gU19ESVZfUk9VTkRfVVAodGVtcCwgdWkpIC0gMjsKKwl0 ZW1wID0gNDAgKiBjb2VmZiArIDQgKiB1aTsKKwl0bWluID0gU19ESVZfUk9VTkRfVVAodGVtcCwg dWkpIC0gMjsKKwl0aW1pbmctPmhzX3ByZXBhcmUgPSBsaW5lYXJfaW50ZXIodG1heCwgdG1pbiwg cGNudDEsIDAsIHRydWUpOworCisJdG1heCA9IDI1NTsKKwl0ZW1wID0gKCh0aW1pbmctPmhzX3By ZXBhcmUgPj4gMSkgKyAxKSAqIDIgKiB1aSArIDIgKiB1aTsKKwl0ZW1wID0gMTQ1ICogY29lZmYg KyAxMCAqIHVpIC0gdGVtcDsKKwl0bWluID0gU19ESVZfUk9VTkRfVVAodGVtcCwgdWkpIC0gMjsK Kwl0aW1pbmctPmhzX3plcm8gPSBsaW5lYXJfaW50ZXIodG1heCwgdG1pbiwgcGNudDIsIDI0LCB0 cnVlKTsKKworCXRlbXAgPSAxMDUgKiBjb2VmZiArIDEyICogdWkgLSAyMCAqIGNvZWZmOworCXRt YXggPSBTX0RJVl9ST1VORF9VUCh0ZW1wLCB1aSkgLSAyOworCXRlbXAgPSA2MCAqIGNvZWZmICsg NCAqIHVpOworCXRtaW4gPSBESVZfUk9VTkRfVVAodGVtcCwgdWkpIC0gMjsKKwl0aW1pbmctPmhz X3RyYWlsID0gbGluZWFyX2ludGVyKHRtYXgsIHRtaW4sIHBjbnQzLCAwLCB0cnVlKTsKKworCXRt YXggPSAyNTU7CisJdG1pbiA9IFNfRElWX1JPVU5EX1VQKDEwMCAqIGNvZWZmLCB1aSkgLSAyOwor CXRpbWluZy0+aHNfZXhpdCA9IGxpbmVhcl9pbnRlcih0bWF4LCB0bWluLCBwY250MiwgMCwgdHJ1 ZSk7CisKKwl0bWF4ID0gNjM7CisJdGVtcCA9ICgodGltaW5nLT5oc19leGl0ID4+IDEpICsgMSkg KiAyICogdWk7CisJdGVtcCA9IDYwICogY29lZmYgKyA1MiAqIHVpIC0gMjQgKiB1aSAtIHRlbXA7 CisJdG1pbiA9IFNfRElWX1JPVU5EX1VQKHRlbXAsIDggKiB1aSkgLSAxOworCXRpbWluZy0+Y2xr X3Bvc3QgPSBsaW5lYXJfaW50ZXIodG1heCwgdG1pbiwgcGNudDIsIDAsIGZhbHNlKTsKKworCXRt YXggPSA2MzsKKwl0ZW1wID0gKCh0aW1pbmctPmNsa19wcmVwYXJlID4+IDEpICsgMSkgKiAyICog dWk7CisJdGVtcCArPSAoKHRpbWluZy0+Y2xrX3plcm8gPj4gMSkgKyAxKSAqIDIgKiB1aTsKKwl0 ZW1wICs9IDggKiB1aSArIGxweDsKKwl0bWluID0gU19ESVZfUk9VTkRfVVAodGVtcCwgOCAqIHVp KSAtIDE7CisJaWYgKHRtaW4gPiB0bWF4KSB7CisJCXRlbXAgPSBsaW5lYXJfaW50ZXIoMiAqIHRt YXgsIHRtaW4sIHBjbnQyLCAwLCBmYWxzZSkgPj4gMTsKKwkJdGltaW5nLT5jbGtfcHJlID0gdGVt cCA+PiAxOworCQl0ZW1wID0gKDIgKiB0bWF4IC0gdG1pbikgKiBwY250MjsKKwl9IGVsc2Ugewor CQl0aW1pbmctPmNsa19wcmUgPSBsaW5lYXJfaW50ZXIodG1heCwgdG1pbiwgcGNudDIsIDAsIGZh bHNlKTsKKwl9CisKKwl0aW1pbmctPnRhX2dvID0gMzsKKwl0aW1pbmctPnRhX3N1cmUgPSAwOwor CXRpbWluZy0+dGFfZ2V0ID0gNDsKKworCURCRygiUEhZIHRpbWluZ3M6ICVkLCAlZCwgJWQsICVk LCAlZCwgJWQsICVkLCAlZCwgJWQsICVkIiwKKwkJdGltaW5nLT5jbGtfcHJlLCB0aW1pbmctPmNs a19wb3N0LCB0aW1pbmctPmNsa196ZXJvLAorCQl0aW1pbmctPmNsa190cmFpbCwgdGltaW5nLT5j bGtfcHJlcGFyZSwgdGltaW5nLT5oc19leGl0LAorCQl0aW1pbmctPmhzX3plcm8sIHRpbWluZy0+ aHNfcHJlcGFyZSwgdGltaW5nLT5oc190cmFpbCwKKwkJdGltaW5nLT5oc19ycXN0KTsKKworCXJl dHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkc2lfMjhubV9waHlfcmVndWxhdG9yX2N0cmwoc3Ry dWN0IG1zbV9kc2lfcGh5ICpwaHksIGJvb2wgZW5hYmxlKQoreworCXZvaWQgX19pb21lbSAqYmFz ZSA9IHBoeS0+cmVnX2Jhc2U7CisKKwlpZiAoIWVuYWJsZSkgeworCQlkc2lfcGh5X3dyaXRlKGJh c2UgKyBSRUdfRFNJXzI4bm1fUEhZX1JFR1VMQVRPUl9DQUxfUFdSX0NGRywgMCk7CisJCXJldHVy bjsKKwl9CisKKwlkc2lfcGh5X3dyaXRlKGJhc2UgKyBSRUdfRFNJXzI4bm1fUEhZX1JFR1VMQVRP Ul9DVFJMXzAsIDB4MCk7CisJZHNpX3BoeV93cml0ZShiYXNlICsgUkVHX0RTSV8yOG5tX1BIWV9S RUdVTEFUT1JfQ0FMX1BXUl9DRkcsIDEpOworCWRzaV9waHlfd3JpdGUoYmFzZSArIFJFR19EU0lf MjhubV9QSFlfUkVHVUxBVE9SX0NUUkxfNSwgMCk7CisJZHNpX3BoeV93cml0ZShiYXNlICsgUkVH X0RTSV8yOG5tX1BIWV9SRUdVTEFUT1JfQ1RSTF8zLCAwKTsKKwlkc2lfcGh5X3dyaXRlKGJhc2Ug KyBSRUdfRFNJXzI4bm1fUEhZX1JFR1VMQVRPUl9DVFJMXzIsIDB4Myk7CisJZHNpX3BoeV93cml0 ZShiYXNlICsgUkVHX0RTSV8yOG5tX1BIWV9SRUdVTEFUT1JfQ1RSTF8xLCAweDkpOworCWRzaV9w aHlfd3JpdGUoYmFzZSArIFJFR19EU0lfMjhubV9QSFlfUkVHVUxBVE9SX0NUUkxfMCwgMHg3KTsK Kwlkc2lfcGh5X3dyaXRlKGJhc2UgKyBSRUdfRFNJXzI4bm1fUEhZX1JFR1VMQVRPUl9DVFJMXzQs IDB4MjApOworfQorCitzdGF0aWMgaW50IGRzaV8yOG5tX3BoeV9lbmFibGUoc3RydWN0IG1zbV9k c2lfcGh5ICpwaHksIGJvb2wgaXNfZHVhbF9wYW5lbCwKKwkJY29uc3QgdW5zaWduZWQgbG9uZyBi aXRfcmF0ZSwgY29uc3QgdW5zaWduZWQgbG9uZyBlc2NfcmF0ZSkKK3sKKwlzdHJ1Y3QgZHNpX2Rw aHlfdGltaW5nICp0aW1pbmcgPSAmcGh5LT50aW1pbmc7CisJaW50IGk7CisJdm9pZCBfX2lvbWVt ICpiYXNlID0gcGh5LT5iYXNlOworCisJREJHKCIiKTsKKworCWlmIChkc2lfZHBoeV90aW1pbmdf Y2FsYyh0aW1pbmcsIGJpdF9yYXRlLCBlc2NfcmF0ZSkpIHsKKwkJcHJfZXJyKCIlczogRC1QSFkg dGltaW5nIGNhbGN1bGF0aW9uIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZB TDsKKwl9CisKKwlkc2lfcGh5X3dyaXRlKGJhc2UgKyBSRUdfRFNJXzI4bm1fUEhZX1NUUkVOR1RI XzAsIDB4ZmYpOworCisJZHNpXzI4bm1fcGh5X3JlZ3VsYXRvcl9jdHJsKHBoeSwgdHJ1ZSk7CisK Kwlkc2lfcGh5X3dyaXRlKGJhc2UgKyBSRUdfRFNJXzI4bm1fUEhZX0xET19DTlRSTCwgMHgwMCk7 CisKKwlkc2lfcGh5X3dyaXRlKGJhc2UgKyBSRUdfRFNJXzI4bm1fUEhZX1RJTUlOR19DVFJMXzAs CisJCURTSV8yOG5tX1BIWV9USU1JTkdfQ1RSTF8wX0NMS19aRVJPKHRpbWluZy0+Y2xrX3plcm8p KTsKKwlkc2lfcGh5X3dyaXRlKGJhc2UgKyBSRUdfRFNJXzI4bm1fUEhZX1RJTUlOR19DVFJMXzEs CisJCURTSV8yOG5tX1BIWV9USU1JTkdfQ1RSTF8xX0NMS19UUkFJTCh0aW1pbmctPmNsa190cmFp bCkpOworCWRzaV9waHlfd3JpdGUoYmFzZSArIFJFR19EU0lfMjhubV9QSFlfVElNSU5HX0NUUkxf MiwKKwkJRFNJXzI4bm1fUEhZX1RJTUlOR19DVFJMXzJfQ0xLX1BSRVBBUkUodGltaW5nLT5jbGtf cHJlcGFyZSkpOworCWlmICh0aW1pbmctPmNsa196ZXJvICYgQklUKDgpKQorCQlkc2lfcGh5X3dy aXRlKGJhc2UgKyBSRUdfRFNJXzI4bm1fUEhZX1RJTUlOR19DVFJMXzMsCisJCQlEU0lfMjhubV9Q SFlfVElNSU5HX0NUUkxfM19DTEtfWkVST184KTsKKwlkc2lfcGh5X3dyaXRlKGJhc2UgKyBSRUdf RFNJXzI4bm1fUEhZX1RJTUlOR19DVFJMXzQsCisJCURTSV8yOG5tX1BIWV9USU1JTkdfQ1RSTF80 X0hTX0VYSVQodGltaW5nLT5oc19leGl0KSk7CisJZHNpX3BoeV93cml0ZShiYXNlICsgUkVHX0RT SV8yOG5tX1BIWV9USU1JTkdfQ1RSTF81LAorCQlEU0lfMjhubV9QSFlfVElNSU5HX0NUUkxfNV9I U19aRVJPKHRpbWluZy0+aHNfemVybykpOworCWRzaV9waHlfd3JpdGUoYmFzZSArIFJFR19EU0lf MjhubV9QSFlfVElNSU5HX0NUUkxfNiwKKwkJRFNJXzI4bm1fUEhZX1RJTUlOR19DVFJMXzZfSFNf UFJFUEFSRSh0aW1pbmctPmhzX3ByZXBhcmUpKTsKKwlkc2lfcGh5X3dyaXRlKGJhc2UgKyBSRUdf RFNJXzI4bm1fUEhZX1RJTUlOR19DVFJMXzcsCisJCURTSV8yOG5tX1BIWV9USU1JTkdfQ1RSTF83 X0hTX1RSQUlMKHRpbWluZy0+aHNfdHJhaWwpKTsKKwlkc2lfcGh5X3dyaXRlKGJhc2UgKyBSRUdf RFNJXzI4bm1fUEhZX1RJTUlOR19DVFJMXzgsCisJCURTSV8yOG5tX1BIWV9USU1JTkdfQ1RSTF84 X0hTX1JRU1QodGltaW5nLT5oc19ycXN0KSk7CisJZHNpX3BoeV93cml0ZShiYXNlICsgUkVHX0RT SV8yOG5tX1BIWV9USU1JTkdfQ1RSTF85LAorCQlEU0lfMjhubV9QSFlfVElNSU5HX0NUUkxfOV9U QV9HTyh0aW1pbmctPnRhX2dvKSB8CisJCURTSV8yOG5tX1BIWV9USU1JTkdfQ1RSTF85X1RBX1NV UkUodGltaW5nLT50YV9zdXJlKSk7CisJZHNpX3BoeV93cml0ZShiYXNlICsgUkVHX0RTSV8yOG5t X1BIWV9USU1JTkdfQ1RSTF8xMCwKKwkJRFNJXzI4bm1fUEhZX1RJTUlOR19DVFJMXzEwX1RBX0dF VCh0aW1pbmctPnRhX2dldCkpOworCWRzaV9waHlfd3JpdGUoYmFzZSArIFJFR19EU0lfMjhubV9Q SFlfVElNSU5HX0NUUkxfMTEsCisJCURTSV8yOG5tX1BIWV9USU1JTkdfQ1RSTF8xMV9UUklHM19D TUQoMCkpOworCisJZHNpX3BoeV93cml0ZShiYXNlICsgUkVHX0RTSV8yOG5tX1BIWV9DVFJMXzEs IDB4MDApOworCWRzaV9waHlfd3JpdGUoYmFzZSArIFJFR19EU0lfMjhubV9QSFlfQ1RSTF8wLCAw eDVmKTsKKworCWRzaV9waHlfd3JpdGUoYmFzZSArIFJFR19EU0lfMjhubV9QSFlfU1RSRU5HVEhf MSwgMHg2KTsKKworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJZHNpX3BoeV93cml0ZShi YXNlICsgUkVHX0RTSV8yOG5tX1BIWV9MTl9DRkdfMChpKSwgMCk7CisJCWRzaV9waHlfd3JpdGUo YmFzZSArIFJFR19EU0lfMjhubV9QSFlfTE5fQ0ZHXzEoaSksIDApOworCQlkc2lfcGh5X3dyaXRl KGJhc2UgKyBSRUdfRFNJXzI4bm1fUEhZX0xOX0NGR18yKGkpLCAwKTsKKwkJZHNpX3BoeV93cml0 ZShiYXNlICsgUkVHX0RTSV8yOG5tX1BIWV9MTl9DRkdfMyhpKSwgMCk7CisJCWRzaV9waHlfd3Jp dGUoYmFzZSArIFJFR19EU0lfMjhubV9QSFlfTE5fVEVTVF9EQVRBUEFUSChpKSwgMCk7CisJCWRz aV9waHlfd3JpdGUoYmFzZSArIFJFR19EU0lfMjhubV9QSFlfTE5fREVCVUdfU0VMKGkpLCAwKTsK KwkJZHNpX3BoeV93cml0ZShiYXNlICsgUkVHX0RTSV8yOG5tX1BIWV9MTl9URVNUX1NUUl8wKGkp LCAweDEpOworCQlkc2lfcGh5X3dyaXRlKGJhc2UgKyBSRUdfRFNJXzI4bm1fUEhZX0xOX1RFU1Rf U1RSXzEoaSksIDB4OTcpOworCX0KKwlkc2lfcGh5X3dyaXRlKGJhc2UgKyBSRUdfRFNJXzI4bm1f UEhZX0xOX0NGR180KDApLCAwKTsKKwlkc2lfcGh5X3dyaXRlKGJhc2UgKyBSRUdfRFNJXzI4bm1f UEhZX0xOX0NGR180KDEpLCAweDUpOworCWRzaV9waHlfd3JpdGUoYmFzZSArIFJFR19EU0lfMjhu bV9QSFlfTE5fQ0ZHXzQoMiksIDB4YSk7CisJZHNpX3BoeV93cml0ZShiYXNlICsgUkVHX0RTSV8y OG5tX1BIWV9MTl9DRkdfNCgzKSwgMHhmKTsKKworCWRzaV9waHlfd3JpdGUoYmFzZSArIFJFR19E U0lfMjhubV9QSFlfTE5DS19DRkdfMSwgMHhjMCk7CisJZHNpX3BoeV93cml0ZShiYXNlICsgUkVH X0RTSV8yOG5tX1BIWV9MTkNLX1RFU1RfU1RSMCwgMHgxKTsKKwlkc2lfcGh5X3dyaXRlKGJhc2Ug KyBSRUdfRFNJXzI4bm1fUEhZX0xOQ0tfVEVTVF9TVFIxLCAweGJiKTsKKworCWRzaV9waHlfd3Jp dGUoYmFzZSArIFJFR19EU0lfMjhubV9QSFlfQ1RSTF8wLCAweDVmKTsKKworCWlmIChpc19kdWFs X3BhbmVsICYmIChwaHktPmlkICE9IERTSV9DTE9DS19NQVNURVIpKQorCQlkc2lfcGh5X3dyaXRl KGJhc2UgKyBSRUdfRFNJXzI4bm1fUEhZX0dMQkxfVEVTVF9DVFJMLCAweDAwKTsKKwllbHNlCisJ CWRzaV9waHlfd3JpdGUoYmFzZSArIFJFR19EU0lfMjhubV9QSFlfR0xCTF9URVNUX0NUUkwsIDB4 MDEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHNpXzI4bm1fcGh5X2Rpc2FibGUo c3RydWN0IG1zbV9kc2lfcGh5ICpwaHkpCit7CisJZHNpX3BoeV93cml0ZShwaHktPmJhc2UgKyBS RUdfRFNJXzI4bm1fUEhZX0NUUkxfMCwgMCk7CisJZHNpXzI4bm1fcGh5X3JlZ3VsYXRvcl9jdHJs KHBoeSwgZmFsc2UpOworCisJLyoKKwkgKiBXYWl0IGZvciB0aGUgcmVnaXN0ZXJzIHdyaXRlcyB0 byBjb21wbGV0ZSBpbiBvcmRlciB0bworCSAqIGVuc3VyZSB0aGF0IHRoZSBwaHkgaXMgY29tcGxl dGVseSBkaXNhYmxlZAorCSAqLworCXdtYigpOworCisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUg ZHNpX3BoeV9mdW5jX2luaXQobmFtZSkJXAorCWRvIHsJXAorCQlwaHktPmVuYWJsZSA9IGRzaV8j I25hbWUjI19waHlfZW5hYmxlOwlcCisJCXBoeS0+ZGlzYWJsZSA9IGRzaV8jI25hbWUjI19waHlf ZGlzYWJsZTsJXAorCX0gd2hpbGUgKDApCisKK3N0cnVjdCBtc21fZHNpX3BoeSAqbXNtX2RzaV9w aHlfaW5pdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCQkJZW51bSBtc21fZHNpX3Bo eV90eXBlIHR5cGUsIGludCBpZCkKK3sKKwlzdHJ1Y3QgbXNtX2RzaV9waHkgKnBoeTsKKworCXBo eSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKnBoeSksIEdGUF9LRVJORUwpOwor CWlmICghcGh5KQorCQlyZXR1cm4gTlVMTDsKKworCXBoeS0+YmFzZSA9IG1zbV9pb3JlbWFwKHBk ZXYsICJkc2lfcGh5IiwgIkRTSV9QSFkiKTsKKwlpZiAoSVNfRVJSX09SX05VTEwocGh5LT5iYXNl KSkgeworCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gbWFwIHBoeSBiYXNlXG4iLCBfX2Z1bmNfXyk7 CisJCXJldHVybiBOVUxMOworCX0KKwlwaHktPnJlZ19iYXNlID0gbXNtX2lvcmVtYXAocGRldiwg ImRzaV9waHlfcmVndWxhdG9yIiwgIkRTSV9QSFlfUkVHIik7CisJaWYgKElTX0VSUl9PUl9OVUxM KHBoeS0+cmVnX2Jhc2UpKSB7CisJCXByX2VycigiJXM6IGZhaWxlZCB0byBtYXAgcGh5IHJlZ3Vs YXRvciBiYXNlXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiBOVUxMOworCX0KKworCXN3aXRjaCAo dHlwZSkgeworCWNhc2UgTVNNX0RTSV9QSFlfMjhOTToKKwkJZHNpX3BoeV9mdW5jX2luaXQoMjhu bSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByX2VycigiJXM6IHVuc3VwcG9ydGVkIHR5cGUs ICVkXG4iLCBfX2Z1bmNfXywgdHlwZSk7CisJCXJldHVybiBOVUxMOworCX0KKworCXBoeS0+aWQg PSBpZDsKKworCXJldHVybiBwaHk7Cit9CisKK2ludCBtc21fZHNpX3BoeV9lbmFibGUoc3RydWN0 IG1zbV9kc2lfcGh5ICpwaHksIGJvb2wgaXNfZHVhbF9wYW5lbCwKKwljb25zdCB1bnNpZ25lZCBs b25nIGJpdF9yYXRlLCBjb25zdCB1bnNpZ25lZCBsb25nIGVzY19yYXRlKQoreworCWlmICghcGh5 IHx8ICFwaHktPmVuYWJsZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIHBoeS0+ZW5hYmxl KHBoeSwgaXNfZHVhbF9wYW5lbCwgYml0X3JhdGUsIGVzY19yYXRlKTsKK30KKworaW50IG1zbV9k c2lfcGh5X2Rpc2FibGUoc3RydWN0IG1zbV9kc2lfcGh5ICpwaHkpCit7CisJaWYgKCFwaHkgfHwg IXBoeS0+ZGlzYWJsZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIHBoeS0+ZGlzYWJsZShw aHkpOworfQorCit2b2lkIG1zbV9kc2lfcGh5X2dldF9jbGtfcHJlX3Bvc3Qoc3RydWN0IG1zbV9k c2lfcGh5ICpwaHksCisJdTMyICpjbGtfcHJlLCB1MzIgKmNsa19wb3N0KQoreworCWlmICghcGh5 KQorCQlyZXR1cm47CisJaWYgKGNsa19wcmUpCisJCSpjbGtfcHJlID0gcGh5LT50aW1pbmcuY2xr X3ByZTsKKwlpZiAoY2xrX3Bvc3QpCisJCSpjbGtfcG9zdCA9IHBoeS0+dGltaW5nLmNsa19wb3N0 OworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL21zbV9kcnYuaCBiL2RyaXZl cnMvZ3B1L2RybS9tc20vbXNtX2Rydi5oCmluZGV4IDdiNDY0ZGIuLmExODY4M2YgMTAwNjQ0Ci0t LSBhL2RyaXZlcnMvZ3B1L2RybS9tc20vbXNtX2Rydi5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9t c20vbXNtX2Rydi5oCkBAIC05NSw2ICs5NSw5IEBAIHN0cnVjdCBtc21fZHJtX3ByaXZhdGUgewog CSAqLwogCXN0cnVjdCBtc21fZHJtX3N1Yl9kZXYgKmVkcDsKIAorCS8qIERTSSBpcyBzaGFyZWQg YnkgbWRwNCBhbmQgbWRwNSAqLworCXN0cnVjdCBtc21fZHJtX3N1Yl9kZXYgKmRzaVsyXTsKKwog CS8qIHdoZW4gd2UgaGF2ZSBtb3JlIHRoYW4gb25lICdtc21fZ3B1JyB0aGVzZSBuZWVkIHRvIGJl IGFuIGFycmF5OiAqLwogCXN0cnVjdCBtc21fZ3B1ICpncHU7CiAJc3RydWN0IG1zbV9maWxlX3By aXZhdGUgKmxhc3RjdHg7CkBAIC0yNDMsNiArMjQ2LDIzIEBAIHZvaWQgX19leGl0IGhkbWlfdW5y ZWdpc3Rlcih2b2lkKTsKIHZvaWQgX19pbml0IG1zbV9lZHBfcmVnaXN0ZXIodm9pZCk7CiB2b2lk IF9fZXhpdCBtc21fZWRwX3VucmVnaXN0ZXIodm9pZCk7CiAKK2VudW0gbXNtX2RzaV9lbmNvZGVy X2lkIHsKKwlNU01fRFNJX1ZJREVPX0VOQ09ERVJfSUQgPSAwLAorCU1TTV9EU0lfQ01EX0VOQ09E RVJfSUQgPSAxLAorCU1TTV9EU0lfRU5DT0RFUl9OVU0gPSAyCit9OworI2lmZGVmIENPTkZJR19E Uk1fTVNNX0RTSQordm9pZCBfX2luaXQgbXNtX2RzaV9yZWdpc3Rlcih2b2lkKTsKK3ZvaWQgX19l eGl0IG1zbV9kc2lfdW5yZWdpc3Rlcih2b2lkKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQg X19pbml0IG1zbV9kc2lfcmVnaXN0ZXIodm9pZCkKK3sKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBf X2V4aXQgbXNtX2RzaV91bnJlZ2lzdGVyKHZvaWQpCit7Cit9CisjZW5kaWYKKwogI2lmZGVmIENP TkZJR19ERUJVR19GUwogdm9pZCBtc21fZ2VtX2Rlc2NyaWJlKHN0cnVjdCBkcm1fZ2VtX29iamVj dCAqb2JqLCBzdHJ1Y3Qgc2VxX2ZpbGUgKm0pOwogdm9pZCBtc21fZ2VtX2Rlc2NyaWJlX29iamVj dHMoc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgc3RydWN0IHNlcV9maWxlICptKTsKLS0gClRoZSBR dWFsY29tbSBJbm5vdmF0aW9uIENlbnRlciwgSW5jLiBpcyBhIG1lbWJlciBvZiB0aGUgQ29kZSBB dXJvcmEgRm9ydW0sCmhvc3RlZCBieSBUaGUgTGludXggRm91bmRhdGlvbgoKX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KZHJpLWRldmVsIG1haWxpbmcgbGlz dApkcmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHA6Ly9saXN0cy5mcmVlZGVza3Rv cC5vcmcvbWFpbG1hbi9saXN0aW5mby9kcmktZGV2ZWwK