From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jilai Wang Subject: [PATCH] drm/msm/hdmi: add hdmi hdcp support (V3) Date: Thu, 2 Apr 2015 17:49:01 -0400 Message-ID: <1428011341-21637-1-git-send-email-jilaiw@codeaurora.org> References: Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: 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 QWRkIEhETUkgSERDUCBzdXBwb3J0IGluY2x1ZGluZyBIRENQIFBhcnRJL0lJL0lJSSBhdXRoZW50 aWNhdGlvbi4KVjE6IEluaXRpYWwgQ2hhbmdlClYyOiBBZGRyZXNzIEJqb3JuJlJvYidzIGNvbW1l bnRzCiAgICBSZWZhY3RvciB0aGUgYXV0aGVudGljYXRpb24gcHJvY2VzcyB0byB1c2Ugc2luZ2xl IHdvcmsgaW5zdGVhZAogICAgb2YgbXVsdGlwbGUgd29yayBmb3IgZGlmZmVyZW50IGF1dGhlbnRp Y2F0aW9uIHN0YWdlcy4KVjM6IFVwZGF0ZSB0byBhbGlnbiB3aXRoIHFjb20gU0NNIGFwaS4KClNp Z25lZC1vZmYtYnk6IEppbGFpIFdhbmcgPGppbGFpd0Bjb2RlYXVyb3JhLm9yZz4KLS0tCiBkcml2 ZXJzL2dwdS9kcm0vbXNtL01ha2VmaWxlICAgICAgICAgICAgICB8ICAgIDEgKwogZHJpdmVycy9n cHUvZHJtL21zbS9oZG1pL2hkbWkuYyAgICAgICAgICAgfCAgIDQ1ICstCiBkcml2ZXJzL2dwdS9k cm0vbXNtL2hkbWkvaGRtaS5oICAgICAgICAgICB8ICAgMzEgKwogZHJpdmVycy9ncHUvZHJtL21z bS9oZG1pL2hkbWlfYXVkaW8uYyAgICAgfCAgICAxIC0KIGRyaXZlcnMvZ3B1L2RybS9tc20vaGRt aS9oZG1pX2JyaWRnZS5jICAgIHwgICAgOCArLQogZHJpdmVycy9ncHUvZHJtL21zbS9oZG1pL2hk bWlfY29ubmVjdG9yLmMgfCAgICA3ICstCiBkcml2ZXJzL2dwdS9kcm0vbXNtL2hkbWkvaGRtaV9o ZGNwLmMgICAgICB8IDE0MzcgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKIDcgZmlsZXMg Y2hhbmdlZCwgMTUyMiBpbnNlcnRpb25zKCspLCA4IGRlbGV0aW9ucygtKQogY3JlYXRlIG1vZGUg MTAwNjQ0IGRyaXZlcnMvZ3B1L2RybS9tc20vaGRtaS9oZG1pX2hkY3AuYwoKZGlmZiAtLWdpdCBh L2RyaXZlcnMvZ3B1L2RybS9tc20vTWFrZWZpbGUgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL01ha2Vm aWxlCmluZGV4IDY3NGExMzIuLmJlMWY3ZmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9t c20vTWFrZWZpbGUKKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9NYWtlZmlsZQpAQCAtOSw2ICs5 LDcgQEAgbXNtLXkgOj0gXAogCWhkbWkvaGRtaV9hdWRpby5vIFwKIAloZG1pL2hkbWlfYnJpZGdl Lm8gXAogCWhkbWkvaGRtaV9jb25uZWN0b3IubyBcCisJaGRtaS9oZG1pX2hkY3AubyBcCiAJaGRt aS9oZG1pX2kyYy5vIFwKIAloZG1pL2hkbWlfcGh5Xzg5NjAubyBcCiAJaGRtaS9oZG1pX3BoeV84 eDYwLm8gXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9oZG1pL2hkbWkuYyBiL2Ry aXZlcnMvZ3B1L2RybS9tc20vaGRtaS9oZG1pLmMKaW5kZXggODE0NTM2Mi4uMDQ5NzIzZCAxMDA2 NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL21zbS9oZG1pL2hkbWkuYworKysgYi9kcml2ZXJzL2dw dS9kcm0vbXNtL2hkbWkvaGRtaS5jCkBAIC0yMiw3ICsyMiw5IEBACiB2b2lkIGhkbWlfc2V0X21v ZGUoc3RydWN0IGhkbWkgKmhkbWksIGJvb2wgcG93ZXJfb24pCiB7CiAJdWludDMyX3QgY3RybCA9 IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAorCXNwaW5fbG9ja19pcnFzYXZlKCZoZG1pLT5y ZWdfbG9jaywgZmxhZ3MpOwogCWlmIChwb3dlcl9vbikgewogCQljdHJsIHw9IEhETUlfQ1RSTF9F TkFCTEU7CiAJCWlmICghaGRtaS0+aGRtaV9tb2RlKSB7CkBAIC0zNyw2ICszOSw3IEBAIHZvaWQg aGRtaV9zZXRfbW9kZShzdHJ1Y3QgaGRtaSAqaGRtaSwgYm9vbCBwb3dlcl9vbikKIAl9CiAKIAlo ZG1pX3dyaXRlKGhkbWksIFJFR19IRE1JX0NUUkwsIGN0cmwpOworCXNwaW5fdW5sb2NrX2lycXJl c3RvcmUoJmhkbWktPnJlZ19sb2NrLCBmbGFncyk7CiAJREJHKCJIRE1JIENvcmU6ICVzLCBIRE1J X0NUUkw9MHglMDh4IiwKIAkJCXBvd2VyX29uID8gIkVuYWJsZSIgOiAiRGlzYWJsZSIsIGN0cmwp OwogfQpAQCAtNTEsNiArNTQsMTAgQEAgc3RhdGljIGlycXJldHVybl90IGhkbWlfaXJxKGludCBp cnEsIHZvaWQgKmRldl9pZCkKIAkvKiBQcm9jZXNzIEREQzogKi8KIAloZG1pX2kyY19pcnEoaGRt aS0+aTJjKTsKIAorCS8qIFByb2Nlc3MgSERDUDogKi8KKwlpZiAoaGRtaS0+aGRjcF9jdHJsKQor CQloZG1pX2hkY3BfaXJxKGhkbWktPmhkY3BfY3RybCk7CisKIAkvKiBUT0RPIGF1ZGlvLi4gKi8K IAogCXJldHVybiBJUlFfSEFORExFRDsKQEAgLTYwLDYgKzY3LDE1IEBAIHN0YXRpYyB2b2lkIGhk bWlfZGVzdHJveShzdHJ1Y3QgaGRtaSAqaGRtaSkKIHsKIAlzdHJ1Y3QgaGRtaV9waHkgKnBoeSA9 IGhkbWktPnBoeTsKIAorCS8qCisJICogYXQgdGhpcyBwb2ludCwgaHBkIGhhcyBiZWVuIGRpc2Fi bGVkLAorCSAqIGFmdGVyIGZsdXNoIHdvcmtxLCBpdCdzIHNhZmUgdG8gZGVpbml0IGhkY3AKKwkg Ki8KKwlpZiAoaGRtaS0+d29ya3EpIHsKKwkJZmx1c2hfd29ya3F1ZXVlKGhkbWktPndvcmtxKTsK KwkJZGVzdHJveV93b3JrcXVldWUoaGRtaS0+d29ya3EpOworCX0KKwloZG1pX2hkY3BfZGVzdHJv eShoZG1pKTsKIAlpZiAocGh5KQogCQlwaHktPmZ1bmNzLT5kZXN0cm95KHBoeSk7CiAKQEAgLTc3 LDYgKzkzLDcgQEAgc3RhdGljIHN0cnVjdCBoZG1pICpoZG1pX2luaXQoc3RydWN0IHBsYXRmb3Jt X2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgaGRtaV9wbGF0Zm9ybV9jb25maWcgKmNvbmZpZyA9 IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwogCXN0cnVjdCBoZG1pICpoZG1pID0gTlVMTDsKKwlz dHJ1Y3QgcmVzb3VyY2UgKnJlczsKIAlpbnQgaSwgcmV0OwogCiAJaGRtaSA9IGRldm1fa3phbGxv YygmcGRldi0+ZGV2LCBzaXplb2YoKmhkbWkpLCBHRlBfS0VSTkVMKTsKQEAgLTg3LDYgKzEwNCw3 IEBAIHN0YXRpYyBzdHJ1Y3QgaGRtaSAqaGRtaV9pbml0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ug KnBkZXYpCiAKIAloZG1pLT5wZGV2ID0gcGRldjsKIAloZG1pLT5jb25maWcgPSBjb25maWc7CisJ c3Bpbl9sb2NrX2luaXQoJmhkbWktPnJlZ19sb2NrKTsKIAogCS8qIG5vdCBzdXJlIGFib3V0IHdo aWNoIHBoeSBtYXBzIHRvIHdoaWNoIG1zbS4uIHByb2JhYmx5IEkgbWlzcyBzb21lICovCiAJaWYg KGNvbmZpZy0+cGh5X2luaXQpCkBAIC0xMDcsNiArMTI1LDE4IEBAIHN0YXRpYyBzdHJ1Y3QgaGRt aSAqaGRtaV9pbml0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiAJCWdvdG8gZmFpbDsK IAl9CiAKKwkvKiBIRENQIG5lZWRzIHBoeXNpY2FsIGFkZHJlc3Mgb2YgaGRtaSByZWdpc3RlciAq LworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwgSU9SRVNPVVJDRV9N RU0sCisJCWNvbmZpZy0+bW1pb19uYW1lKTsKKwloZG1pLT5tbWlvX3BoeV9hZGRyID0gcmVzLT5z dGFydDsKKworCWhkbWktPnFmcHJvbV9tbWlvID0gbXNtX2lvcmVtYXAocGRldiwKKwkJY29uZmln LT5xZnByb21fbW1pb19uYW1lLCAiSERNSV9RRlBST00iKTsKKwlpZiAoSVNfRVJSKGhkbWktPnFm cHJvbV9tbWlvKSkgeworCQlkZXZfaW5mbygmcGRldi0+ZGV2LCAiY2FuJ3QgZmluZCBxZnByb20g cmVzb3VyY2VcbiIpOworCQloZG1pLT5xZnByb21fbW1pbyA9IE5VTEw7CisJfQorCiAJaGRtaS0+ aHBkX3JlZ3MgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKGhkbWktPmhwZF9yZWdz WzBdKSAqCiAJCQljb25maWctPmhwZF9yZWdfY250LCBHRlBfS0VSTkVMKTsKIAlpZiAoIWhkbWkt PmhwZF9yZWdzKSB7CkBAIC0xODksNiArMjE5LDggQEAgc3RhdGljIHN0cnVjdCBoZG1pICpoZG1p X2luaXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIAkJaGRtaS0+cHdyX2Nsa3NbaV0g PSBjbGs7CiAJfQogCisJaGRtaS0+d29ya3EgPSBhbGxvY19vcmRlcmVkX3dvcmtxdWV1ZSgibXNt X2hkbWkiLCAwKTsKKwogCWhkbWktPmkyYyA9IGhkbWlfaTJjX2luaXQoaGRtaSk7CiAJaWYgKElT X0VSUihoZG1pLT5pMmMpKSB7CiAJCXJldCA9IFBUUl9FUlIoaGRtaS0+aTJjKTsKQEAgLTE5Nyw2 ICsyMjksMTIgQEAgc3RhdGljIHN0cnVjdCBoZG1pICpoZG1pX2luaXQoc3RydWN0IHBsYXRmb3Jt X2RldmljZSAqcGRldikKIAkJZ290byBmYWlsOwogCX0KIAorCWhkbWktPmhkY3BfY3RybCA9IGhk bWlfaGRjcF9pbml0KGhkbWkpOworCWlmIChJU19FUlIoaGRtaS0+aGRjcF9jdHJsKSkgeworCQlk ZXZfd2FybigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGluaXQgaGRjcDogZGlzYWJsZWRcbiIpOwor CQloZG1pLT5oZGNwX2N0cmwgPSBOVUxMOworCX0KKwogCXJldHVybiBoZG1pOwogCiBmYWlsOgpA QCAtMzc2LDYgKzQxNCw3IEBAIHN0YXRpYyBpbnQgaGRtaV9iaW5kKHN0cnVjdCBkZXZpY2UgKmRl diwgc3RydWN0IGRldmljZSAqbWFzdGVyLCB2b2lkICpkYXRhKQogCX0KIAogCWhkbWlfY2ZnLT5t bWlvX25hbWUgICAgID0gImNvcmVfcGh5c2ljYWwiOworCWhkbWlfY2ZnLT5xZnByb21fbW1pb19u YW1lID0gInFmcHJvbV9waHlzaWNhbCI7CiAJaGRtaV9jZmctPmRkY19jbGtfZ3BpbyAgPSBnZXRf Z3BpbyhkZXYsIG9mX25vZGUsICJxY29tLGhkbWktdHgtZGRjLWNsayIpOwogCWhkbWlfY2ZnLT5k ZGNfZGF0YV9ncGlvID0gZ2V0X2dwaW8oZGV2LCBvZl9ub2RlLCAicWNvbSxoZG1pLXR4LWRkYy1k YXRhIik7CiAJaGRtaV9jZmctPmhwZF9ncGlvICAgICAgPSBnZXRfZ3BpbyhkZXYsIG9mX25vZGUs ICJxY29tLGhkbWktdHgtaHBkIik7CkBAIC0zOTEsNyArNDMwLDYgQEAgc3RhdGljIGludCBoZG1p X2JpbmQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlICptYXN0ZXIsIHZvaWQgKmRh dGEpCiAJaWYgKGNwdV9pc19hcHE4MDY0KCkpIHsKIAkJc3RhdGljIGNvbnN0IGNoYXIgKmhwZF9y ZWdfbmFtZXNbXSA9IHsiODkyMV9oZG1pX212cyJ9OwogCQljb25maWcucGh5X2luaXQgICAgICA9 IGhkbWlfcGh5Xzg5NjBfaW5pdDsKLQkJY29uZmlnLm1taW9fbmFtZSAgICAgPSAiaGRtaV9tc21f aGRtaV9hZGRyIjsKIAkJY29uZmlnLmhwZF9yZWdfbmFtZXMgPSBocGRfcmVnX25hbWVzOwogCQlj b25maWcuaHBkX3JlZ19jbnQgICA9IEFSUkFZX1NJWkUoaHBkX3JlZ19uYW1lcyk7CiAJCWNvbmZp Zy5ocGRfY2xrX25hbWVzID0gaHBkX2Nsa19uYW1lczsKQEAgLTQwNCw3ICs0NDIsNiBAQCBzdGF0 aWMgaW50IGhkbWlfYmluZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2UgKm1hc3Rl ciwgdm9pZCAqZGF0YSkKIAl9IGVsc2UgaWYgKGNwdV9pc19tc204OTYwKCkgfHwgY3B1X2lzX21z bTg5NjBhYigpKSB7CiAJCXN0YXRpYyBjb25zdCBjaGFyICpocGRfcmVnX25hbWVzW10gPSB7Ijg5 MjFfaGRtaV9tdnMifTsKIAkJY29uZmlnLnBoeV9pbml0ICAgICAgPSBoZG1pX3BoeV84OTYwX2lu aXQ7Ci0JCWNvbmZpZy5tbWlvX25hbWUgICAgID0gImhkbWlfbXNtX2hkbWlfYWRkciI7CiAJCWNv bmZpZy5ocGRfcmVnX25hbWVzID0gaHBkX3JlZ19uYW1lczsKIAkJY29uZmlnLmhwZF9yZWdfY250 ICAgPSBBUlJBWV9TSVpFKGhwZF9yZWdfbmFtZXMpOwogCQljb25maWcuaHBkX2Nsa19uYW1lcyA9 IGhwZF9jbGtfbmFtZXM7CkBAIC00MTksNyArNDU2LDYgQEAgc3RhdGljIGludCBoZG1pX2JpbmQo c3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlICptYXN0ZXIsIHZvaWQgKmRhdGEpCiAJ CQkJIjg5MDFfaGRtaV9tdnMiLCAiODkwMV9tcHAwIgogCQl9OwogCQljb25maWcucGh5X2luaXQg ICAgICA9IGhkbWlfcGh5Xzh4NjBfaW5pdDsKLQkJY29uZmlnLm1taW9fbmFtZSAgICAgPSAiaGRt aV9tc21faGRtaV9hZGRyIjsKIAkJY29uZmlnLmhwZF9yZWdfbmFtZXMgPSBocGRfcmVnX25hbWVz OwogCQljb25maWcuaHBkX3JlZ19jbnQgICA9IEFSUkFZX1NJWkUoaHBkX3JlZ19uYW1lcyk7CiAJ CWNvbmZpZy5ocGRfY2xrX25hbWVzID0gaHBkX2Nsa19uYW1lczsKQEAgLTQzMCw2ICs0NjYsOSBA QCBzdGF0aWMgaW50IGhkbWlfYmluZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2Ug Km1hc3Rlciwgdm9pZCAqZGF0YSkKIAkJY29uZmlnLm11eF9lbl9ncGlvICAgPSAtMTsKIAkJY29u ZmlnLm11eF9zZWxfZ3BpbyAgPSAtMTsKIAl9CisJY29uZmlnLm1taW9fbmFtZSAgICAgPSAiaGRt aV9tc21faGRtaV9hZGRyIjsKKwljb25maWcucWZwcm9tX21taW9fbmFtZSA9ICJoZG1pX21zbV9x ZnByb21fYWRkciI7CisKIAloZG1pX2NmZyA9ICZjb25maWc7CiAjZW5kaWYKIAlkZXYtPnBsYXRm b3JtX2RhdGEgPSBoZG1pX2NmZzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vaGRt aS9oZG1pLmggYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2hkbWkvaGRtaS5oCmluZGV4IDY4ZmRmYjMu LjU4OGY3YTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tc20vaGRtaS9oZG1pLmgKKysr IGIvZHJpdmVycy9ncHUvZHJtL21zbS9oZG1pL2hkbWkuaApAQCAtMzcsNiArMzcsOCBAQCBzdHJ1 Y3QgaGRtaV9hdWRpbyB7CiAJaW50IHJhdGU7CiB9OwogCitzdHJ1Y3QgaGRtaV9oZGNwX2N0cmw7 CisKIHN0cnVjdCBoZG1pIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2OwogCXN0cnVjdCBwbGF0 Zm9ybV9kZXZpY2UgKnBkZXY7CkBAIC01MSw2ICs1Myw4IEBAIHN0cnVjdCBoZG1pIHsKIAl1bnNp Z25lZCBsb25nIGludCBwaXhjbG9jazsKIAogCXZvaWQgX19pb21lbSAqbW1pbzsKKwl2b2lkIF9f aW9tZW0gKnFmcHJvbV9tbWlvOworCXBoeXNfYWRkcl90IG1taW9fcGh5X2FkZHI7CiAKIAlzdHJ1 Y3QgcmVndWxhdG9yICoqaHBkX3JlZ3M7CiAJc3RydWN0IHJlZ3VsYXRvciAqKnB3cl9yZWdzOwpA QCAtNjgsMTIgKzcyLDI1IEBAIHN0cnVjdCBoZG1pIHsKIAlib29sIGhkbWlfbW9kZTsgICAgICAg ICAgICAgICAvKiBhcmUgd2UgaW4gaGRtaSBtb2RlPyAqLwogCiAJaW50IGlycTsKKwlzdHJ1Y3Qg d29ya3F1ZXVlX3N0cnVjdCAqd29ya3E7CisKKwlzdHJ1Y3QgaGRtaV9oZGNwX2N0cmwgKmhkY3Bf Y3RybDsKKworCS8qCisJKiBzcGlubG9jayB0byBwcm90ZWN0IHJlZ2lzdGVycyBzaGFyZWQgYnkg ZGlmZmVyZW50IGV4ZWN1dGlvbgorCSogUkVHX0hETUlfQ1RSTAorCSogUkVHX0hETUlfRERDX0FS QklUUkFUSU9OCisJKiBSRUdfSERNSV9IRENQX0lOVF9DVFJMCisJKiBSRUdfSERNSV9IUERfQ1RS TAorCSovCisJc3BpbmxvY2tfdCByZWdfbG9jazsKIH07CiAKIC8qIHBsYXRmb3JtIGNvbmZpZyBk YXRhIChpZS4gZnJvbSBEVCwgb3IgcGRhdGEpICovCiBzdHJ1Y3QgaGRtaV9wbGF0Zm9ybV9jb25m aWcgewogCXN0cnVjdCBoZG1pX3BoeSAqKCpwaHlfaW5pdCkoc3RydWN0IGhkbWkgKmhkbWkpOwog CWNvbnN0IGNoYXIgKm1taW9fbmFtZTsKKwljb25zdCBjaGFyICpxZnByb21fbW1pb19uYW1lOwog CiAJLyogcmVndWxhdG9ycyB0aGF0IG5lZWQgdG8gYmUgb24gZm9yIGhwZDogKi8KIAljb25zdCBj aGFyICoqaHBkX3JlZ19uYW1lczsKQEAgLTEwOSw2ICsxMjYsMTEgQEAgc3RhdGljIGlubGluZSB1 MzIgaGRtaV9yZWFkKHN0cnVjdCBoZG1pICpoZG1pLCB1MzIgcmVnKQogCXJldHVybiBtc21fcmVh ZGwoaGRtaS0+bW1pbyArIHJlZyk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdTMyIGhkbWlfcWZwcm9t X3JlYWQoc3RydWN0IGhkbWkgKmhkbWksIHUzMiByZWcpCit7CisJcmV0dXJuIG1zbV9yZWFkbCho ZG1pLT5xZnByb21fbW1pbyArIHJlZyk7Cit9CisKIC8qCiAgKiBUaGUgcGh5IGFwcGVhcnMgdG8g YmUgZGlmZmVyZW50LCBmb3IgZXhhbXBsZSBiZXR3ZWVuIDg5NjAgYW5kIDh4NjAsCiAgKiBzbyBz cGxpdCB0aGUgcGh5IHJlbGF0ZWQgZnVuY3Rpb25zIG91dCBhbmQgbG9hZCB0aGUgY29ycmVjdCBv bmUgYXQKQEAgLTE2Myw0ICsxODUsMTMgQEAgdm9pZCBoZG1pX2kyY19pcnEoc3RydWN0IGkyY19h ZGFwdGVyICppMmMpOwogdm9pZCBoZG1pX2kyY19kZXN0cm95KHN0cnVjdCBpMmNfYWRhcHRlciAq aTJjKTsKIHN0cnVjdCBpMmNfYWRhcHRlciAqaGRtaV9pMmNfaW5pdChzdHJ1Y3QgaGRtaSAqaGRt aSk7CiAKKy8qCisgKiBoZGNwCisgKi8KK3N0cnVjdCBoZG1pX2hkY3BfY3RybCAqaGRtaV9oZGNw X2luaXQoc3RydWN0IGhkbWkgKmhkbWkpOwordm9pZCBoZG1pX2hkY3BfZGVzdHJveShzdHJ1Y3Qg aGRtaSAqaGRtaSk7Cit2b2lkIGhkbWlfaGRjcF9vbihzdHJ1Y3QgaGRtaV9oZGNwX2N0cmwgKmhk Y3BfY3RybCk7Cit2b2lkIGhkbWlfaGRjcF9vZmYoc3RydWN0IGhkbWlfaGRjcF9jdHJsICpoZGNw X2N0cmwpOwordm9pZCBoZG1pX2hkY3BfaXJxKHN0cnVjdCBoZG1pX2hkY3BfY3RybCAqaGRjcF9j dHJsKTsKKwogI2VuZGlmIC8qIF9fSERNSV9DT05ORUNUT1JfSF9fICovCmRpZmYgLS1naXQgYS9k cml2ZXJzL2dwdS9kcm0vbXNtL2hkbWkvaGRtaV9hdWRpby5jIGIvZHJpdmVycy9ncHUvZHJtL21z bS9oZG1pL2hkbWlfYXVkaW8uYwppbmRleCA4NzI0ODVmLi5kZjIzMmUyIDEwMDY0NAotLS0gYS9k cml2ZXJzL2dwdS9kcm0vbXNtL2hkbWkvaGRtaV9hdWRpby5jCisrKyBiL2RyaXZlcnMvZ3B1L2Ry bS9tc20vaGRtaS9oZG1pX2F1ZGlvLmMKQEAgLTIwMyw3ICsyMDMsNiBAQCBpbnQgaGRtaV9hdWRp b191cGRhdGUoc3RydWN0IGhkbWkgKmhkbWkpCiAJCWF1ZGlvX2NvbmZpZyB8PSBIRE1JX0FVRElP X0NGR19GSUZPX1dBVEVSTUFSSyg0KTsKIAkJYXVkaW9fY29uZmlnIHw9IEhETUlfQVVESU9fQ0ZH X0VOR0lORV9FTkFCTEU7CiAJfSBlbHNlIHsKLQkJaGRtaV93cml0ZShoZG1pLCBSRUdfSERNSV9H QywgSERNSV9HQ19NVVRFKTsKIAkJYWNyX3BrdF9jdHJsICY9IH5IRE1JX0FDUl9QS1RfQ1RSTF9D T05UOwogCQlhY3JfcGt0X2N0cmwgJj0gfkhETUlfQUNSX1BLVF9DVFJMX1NFTkQ7CiAJCXZiaV9w a3RfY3RybCAmPSB+SERNSV9WQklfUEtUX0NUUkxfR0NfRU5BQkxFOwpkaWZmIC0tZ2l0IGEvZHJp dmVycy9ncHUvZHJtL21zbS9oZG1pL2hkbWlfYnJpZGdlLmMgYi9kcml2ZXJzL2dwdS9kcm0vbXNt L2hkbWkvaGRtaV9icmlkZ2UuYwppbmRleCBhN2ExZDgyLi4xZGQwOTNlIDEwMDY0NAotLS0gYS9k cml2ZXJzL2dwdS9kcm0vbXNtL2hkbWkvaGRtaV9icmlkZ2UuYworKysgYi9kcml2ZXJzL2dwdS9k cm0vbXNtL2hkbWkvaGRtaV9icmlkZ2UuYwpAQCAtMTAyLDYgKzEwMiw5IEBAIHN0YXRpYyB2b2lk IGhkbWlfYnJpZGdlX3ByZV9lbmFibGUoc3RydWN0IGRybV9icmlkZ2UgKmJyaWRnZSkKIAogCXBo eS0+ZnVuY3MtPnBvd2VydXAocGh5LCBoZG1pLT5waXhjbG9jayk7CiAJaGRtaV9zZXRfbW9kZSho ZG1pLCB0cnVlKTsKKworCWlmIChoZG1pLT5oZGNwX2N0cmwpCisJCWhkbWlfaGRjcF9vbihoZG1p LT5oZGNwX2N0cmwpOwogfQogCiBzdGF0aWMgdm9pZCBoZG1pX2JyaWRnZV9lbmFibGUoc3RydWN0 IGRybV9icmlkZ2UgKmJyaWRnZSkKQEAgLTExOCw2ICsxMjEsOSBAQCBzdGF0aWMgdm9pZCBoZG1p X2JyaWRnZV9wb3N0X2Rpc2FibGUoc3RydWN0IGRybV9icmlkZ2UgKmJyaWRnZSkKIAlzdHJ1Y3Qg aGRtaSAqaGRtaSA9IGhkbWlfYnJpZGdlLT5oZG1pOwogCXN0cnVjdCBoZG1pX3BoeSAqcGh5ID0g aGRtaS0+cGh5OwogCisJaWYgKGhkbWktPmhkY3BfY3RybCkKKwkJaGRtaV9oZGNwX29mZihoZG1p LT5oZGNwX2N0cmwpOworCiAJREJHKCJwb3dlciBkb3duIik7CiAJaGRtaV9zZXRfbW9kZShoZG1p LCBmYWxzZSk7CiAJcGh5LT5mdW5jcy0+cG93ZXJkb3duKHBoeSk7CkBAIC0xNDIsOCArMTQ4LDYg QEAgc3RhdGljIHZvaWQgaGRtaV9icmlkZ2VfbW9kZV9zZXQoc3RydWN0IGRybV9icmlkZ2UgKmJy aWRnZSwKIAogCWhkbWktPnBpeGNsb2NrID0gbW9kZS0+Y2xvY2sgKiAxMDAwOwogCi0JaGRtaS0+ aGRtaV9tb2RlID0gZHJtX21hdGNoX2NlYV9tb2RlKG1vZGUpID4gMTsKLQogCWhzdGFydCA9IG1v ZGUtPmh0b3RhbCAtIG1vZGUtPmhzeW5jX3N0YXJ0OwogCWhlbmQgICA9IG1vZGUtPmh0b3RhbCAt IG1vZGUtPmhzeW5jX3N0YXJ0ICsgbW9kZS0+aGRpc3BsYXk7CiAKZGlmZiAtLWdpdCBhL2RyaXZl cnMvZ3B1L2RybS9tc20vaGRtaS9oZG1pX2Nvbm5lY3Rvci5jIGIvZHJpdmVycy9ncHUvZHJtL21z bS9oZG1pL2hkbWlfY29ubmVjdG9yLmMKaW5kZXggYjYyY2RiOS4uMzAyYmE2MyAxMDA2NDQKLS0t IGEvZHJpdmVycy9ncHUvZHJtL21zbS9oZG1pL2hkbWlfY29ubmVjdG9yLmMKKysrIGIvZHJpdmVy cy9ncHUvZHJtL21zbS9oZG1pL2hkbWlfY29ubmVjdG9yLmMKQEAgLTE0MCw2ICsxNDAsNyBAQCBz dGF0aWMgaW50IGhwZF9lbmFibGUoc3RydWN0IGhkbWlfY29ubmVjdG9yICpoZG1pX2Nvbm5lY3Rv cikKIAlzdHJ1Y3QgaGRtaV9waHkgKnBoeSA9IGhkbWktPnBoeTsKIAl1aW50MzJfdCBocGRfY3Ry bDsKIAlpbnQgaSwgcmV0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlmb3IgKGkgPSAwOyBp IDwgY29uZmlnLT5ocGRfcmVnX2NudDsgaSsrKSB7CiAJCXJldCA9IHJlZ3VsYXRvcl9lbmFibGUo aGRtaS0+aHBkX3JlZ3NbaV0pOwpAQCAtMTg1LDYgKzE4Niw3IEBAIHN0YXRpYyBpbnQgaHBkX2Vu YWJsZShzdHJ1Y3QgaGRtaV9jb25uZWN0b3IgKmhkbWlfY29ubmVjdG9yKQogCQkJSERNSV9IUERf SU5UX0NUUkxfSU5UX0VOKTsKIAogCS8qIHNldCB0aW1lb3V0IHRvIDQuMW1zIChtYXgpIGZvciBo YXJkd2FyZSBkZWJvdW5jZSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZoZG1pLT5yZWdfbG9jaywg ZmxhZ3MpOwogCWhwZF9jdHJsID0gaGRtaV9yZWFkKGhkbWksIFJFR19IRE1JX0hQRF9DVFJMKTsK IAlocGRfY3RybCB8PSBIRE1JX0hQRF9DVFJMX1RJTUVPVVQoMHgxZmZmKTsKIApAQCAtMTkzLDYg KzE5NSw3IEBAIHN0YXRpYyBpbnQgaHBkX2VuYWJsZShzdHJ1Y3QgaGRtaV9jb25uZWN0b3IgKmhk bWlfY29ubmVjdG9yKQogCQkJfkhETUlfSFBEX0NUUkxfRU5BQkxFICYgaHBkX2N0cmwpOwogCWhk bWlfd3JpdGUoaGRtaSwgUkVHX0hETUlfSFBEX0NUUkwsCiAJCQlIRE1JX0hQRF9DVFJMX0VOQUJM RSB8IGhwZF9jdHJsKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoZG1pLT5yZWdfbG9jaywg ZmxhZ3MpOwogCiAJcmV0dXJuIDA7CiAKQEAgLTIzOSw3ICsyNDIsNiBAQCBob3RwbHVnX3dvcmso c3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogdm9pZCBoZG1pX2Nvbm5lY3Rvcl9pcnEoc3RydWN0 IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKIHsKIAlzdHJ1Y3QgaGRtaV9jb25uZWN0b3IgKmhk bWlfY29ubmVjdG9yID0gdG9faGRtaV9jb25uZWN0b3IoY29ubmVjdG9yKTsKLQlzdHJ1Y3QgbXNt X2RybV9wcml2YXRlICpwcml2ID0gY29ubmVjdG9yLT5kZXYtPmRldl9wcml2YXRlOwogCXN0cnVj dCBoZG1pICpoZG1pID0gaGRtaV9jb25uZWN0b3ItPmhkbWk7CiAJdWludDMyX3QgaHBkX2ludF9z dGF0dXMsIGhwZF9pbnRfY3RybDsKIApAQCAtMjYzLDcgKzI2NSw3IEBAIHZvaWQgaGRtaV9jb25u ZWN0b3JfaXJxKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCiAJCQlocGRfaW50X2N0 cmwgfD0gSERNSV9IUERfSU5UX0NUUkxfSU5UX0NPTk5FQ1Q7CiAJCWhkbWlfd3JpdGUoaGRtaSwg UkVHX0hETUlfSFBEX0lOVF9DVFJMLCBocGRfaW50X2N0cmwpOwogCi0JCXF1ZXVlX3dvcmsocHJp di0+d3EsICZoZG1pX2Nvbm5lY3Rvci0+aHBkX3dvcmspOworCQlxdWV1ZV93b3JrKGhkbWktPndv cmtxLCAmaGRtaV9jb25uZWN0b3ItPmhwZF93b3JrKTsKIAl9CiB9CiAKQEAgLTMzOSw2ICszNDEs NyBAQCBzdGF0aWMgaW50IGhkbWlfY29ubmVjdG9yX2dldF9tb2RlcyhzdHJ1Y3QgZHJtX2Nvbm5l Y3RvciAqY29ubmVjdG9yKQogCiAJaGRtaV93cml0ZShoZG1pLCBSRUdfSERNSV9DVFJMLCBoZG1p X2N0cmwpOwogCisJaGRtaS0+aGRtaV9tb2RlID0gZHJtX2RldGVjdF9oZG1pX21vbml0b3IoZWRp ZCk7CiAJZHJtX21vZGVfY29ubmVjdG9yX3VwZGF0ZV9lZGlkX3Byb3BlcnR5KGNvbm5lY3Rvciwg ZWRpZCk7CiAKIAlpZiAoZWRpZCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9o ZG1pL2hkbWlfaGRjcC5jIGIvZHJpdmVycy9ncHUvZHJtL21zbS9oZG1pL2hkbWlfaGRjcC5jCm5l dyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkYzljMzQKLS0tIC9kZXYvbnVsbAor KysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2hkbWkvaGRtaV9oZGNwLmMKQEAgLTAsMCArMSwxNDM3 IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxNSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFs bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7 IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0 ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICog b25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRp b24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQg aXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQg ZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5F U1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVi bGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2luY2x1ZGUgImhkbWku aCIKKyNpbmNsdWRlIDxsaW51eC9xY29tX3NjbS5oPgorCisjZGVmaW5lIEhEQ1BfUkVHX0VOQUJM RSAweDAxCisjZGVmaW5lIEhEQ1BfUkVHX0RJU0FCTEUgMHgwMAorI2RlZmluZSBIRENQX1BPUlRf QUREUiAweDc0CisKKyNkZWZpbmUgSERDUF9JTlRfU1RBVFVTX01BU0sgKCBcCisJCUhETUlfSERD UF9JTlRfQ1RSTF9BVVRIX1NVQ0NFU1NfSU5UIHwgXAorCQlIRE1JX0hEQ1BfSU5UX0NUUkxfQVVU SF9GQUlMX0lOVCB8IFwKKwkJSERNSV9IRENQX0lOVF9DVFJMX0FVVEhfWEZFUl9SRVFfSU5UIHwg XAorCQlIRE1JX0hEQ1BfSU5UX0NUUkxfQVVUSF9YRkVSX0RPTkVfSU5UKQorCisjZGVmaW5lIEFV VEhfV09SS19SRVRSSUVTX1RJTUUgMTAwCisjZGVmaW5lIEFVVEhfUkVUUklFU19USU1FIDMwCisK Ky8qIFFGUFJPTSBSZWdpc3RlcnMgZm9yIEhETUkvSERDUCAqLworI2RlZmluZSBRRlBST01fUkFX X0ZFQVRfQ09ORklHX1JPVzBfTFNCICAweDAwMDAwMEY4CisjZGVmaW5lIFFGUFJPTV9SQVdfRkVB VF9DT05GSUdfUk9XMF9NU0IgIDB4MDAwMDAwRkMKKyNkZWZpbmUgSERDUF9LU1ZfTFNCICAgICAg ICAgICAgICAgICAgICAgMHgwMDAwNjBEOAorI2RlZmluZSBIRENQX0tTVl9NU0IgICAgICAgICAg ICAgICAgICAgICAweDAwMDA2MERDCisKK2VudW0gRFNfVFlQRSB7ICAvKiB0eXBlIG9mIGRvd25z dHJlYW0gZGV2aWNlICovCisJRFNfVU5LTk9XTiwKKwlEU19SRUNFSVZFUiwKKwlEU19SRVBFQVRF UiwKK307CisKK2VudW0gaGRtaV9oZGNwX3N0YXRlIHsKKwlIRENQX1NUQVRFX05PX0FLU1YsCisJ SERDUF9TVEFURV9JTkFDVElWRSwKKwlIRENQX1NUQVRFX0FVVEhFTlRJQ0FUSU5HLAorCUhEQ1Bf U1RBVEVfQVVUSEVOVElDQVRFRCwKKwlIRENQX1NUQVRFX0FVVEhfRkFJTEVECit9OworCitzdHJ1 Y3QgaGRtaV9oZGNwX3JlZ19kYXRhIHsKKwl1MzIgcmVnX2lkOworCXUzMiBvZmY7CisJY2hhciAq bmFtZTsKKwl1MzIgcmVnX3ZhbDsKK307CisKK3N0cnVjdCBoZG1pX2hkY3BfY3RybCB7CisJc3Ry dWN0IGhkbWkgKmhkbWk7CisJdTMyIGF1dGhfcmV0cmllczsKKwlib29sIHR6X2hkY3A7CisJZW51 bSBoZG1pX2hkY3Bfc3RhdGUgaGRjcF9zdGF0ZTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgaGRjcF9h dXRoX3dvcms7CisJc3RydWN0IHdvcmtfc3RydWN0IGhkY3BfcmVhdXRoX3dvcms7CisKKyNkZWZp bmUgQVVUSF9BQk9SVF9FViAxCisjZGVmaW5lIEFVVEhfUkVTVUxUX1JEWV9FViAyCisJdW5zaWdu ZWQgbG9uZyBhdXRoX2V2ZW50OworCXdhaXRfcXVldWVfaGVhZF90IGF1dGhfZXZlbnRfcXVldWU7 CisKKwl1MzIga3N2X2ZpZm9fd19pbmRleDsKKwkvKgorCSAqIHN0b3JlIGFrc3YgZnJvbSBxZnBy b20KKwkgKi8KKwl1MzIgYWtzdl9sc2I7CisJdTMyIGFrc3ZfbXNiOworCWJvb2wgYWtzdl92YWxp ZDsKKwl1MzIgZHNfdHlwZTsKKwl1MzIgYmtzdl9sc2I7CisJdTMyIGJrc3ZfbXNiOworCXU4IGRl dl9jb3VudDsKKwl1OCBkZXB0aDsKKwl1OCBrc3ZfbGlzdFs1ICogMTI3XTsKKwlib29sIG1heF9j YXNjYWRlX2V4Y2VlZGVkOworCWJvb2wgbWF4X2Rldl9leGNlZWRlZDsKK307CisKK3N0YXRpYyBp bnQgaGRtaV9kZGNfcmVhZChzdHJ1Y3QgaGRtaSAqaGRtaSwgdTE2IGFkZHIsIHU4IG9mZnNldCwK Kwl1OCAqZGF0YSwgdTE2IGRhdGFfbGVuKQoreworCWludCByYzsKKwlpbnQgcmV0cnkgPSA1Owor CXN0cnVjdCBpMmNfbXNnIG1zZ3NbXSA9IHsKKwkJeworCQkJLmFkZHIJPSBhZGRyID4+IDEsCisJ CQkuZmxhZ3MJPSAwLAorCQkJLmxlbgk9IDEsCisJCQkuYnVmCT0gJm9mZnNldCwKKwkJfSwgewor CQkJLmFkZHIJPSBhZGRyID4+IDEsCisJCQkuZmxhZ3MJPSBJMkNfTV9SRCwKKwkJCS5sZW4JPSBk YXRhX2xlbiwKKwkJCS5idWYJPSBkYXRhLAorCQl9CisJfTsKKworCURCRygiU3RhcnQgRERDIHJl YWQiKTsKK3JldHJ5OgorCXJjID0gaTJjX3RyYW5zZmVyKGhkbWktPmkyYywgbXNncywgMik7CisK KwlyZXRyeS0tOworCWlmIChyYyA9PSAyKQorCQlyYyA9IDA7CisJZWxzZSBpZiAocmV0cnkgPiAw KQorCQlnb3RvIHJldHJ5OworCWVsc2UKKwkJcmMgPSAtRUlPOworCisJREJHKCJFbmQgRERDIHJl YWQgJWQiLCByYyk7CisKKwlyZXR1cm4gcmM7Cit9CisKKyNkZWZpbmUgSERDUF9ERENfV1JJVEVf TUFYX0JZVEVfTlVNIDMyCisKK3N0YXRpYyBpbnQgaGRtaV9kZGNfd3JpdGUoc3RydWN0IGhkbWkg KmhkbWksIHUxNiBhZGRyLCB1OCBvZmZzZXQsCisJdTggKmRhdGEsIHUxNiBkYXRhX2xlbikKK3sK KwlpbnQgcmM7CisJaW50IHJldHJ5ID0gMTA7CisJdTggYnVmW0hEQ1BfRERDX1dSSVRFX01BWF9C WVRFX05VTV07CisJc3RydWN0IGkyY19tc2cgbXNnc1tdID0geworCQl7CisJCQkuYWRkcgk9IGFk ZHIgPj4gMSwKKwkJCS5mbGFncwk9IDAsCisJCQkubGVuCT0gMSwKKwkJfQorCX07CisKKwlEQkco IlN0YXJ0IEREQyB3cml0ZSIpOworCWlmIChkYXRhX2xlbiA+IChIRENQX0REQ19XUklURV9NQVhf QllURV9OVU0gLSAxKSkgeworCQlwcl9lcnIoIiVzOiB3cml0ZSBzaXplIHRvbyBiaWdcbiIsIF9f ZnVuY19fKTsKKwkJcmV0dXJuIC1FUkFOR0U7CisJfQorCisJYnVmWzBdID0gb2Zmc2V0OworCW1l bWNweSgmYnVmWzFdLCBkYXRhLCBkYXRhX2xlbik7CisJbXNnc1swXS5idWYgPSBidWY7CisJbXNn c1swXS5sZW4gPSBkYXRhX2xlbiArIDE7CityZXRyeToKKwlyYyA9IGkyY190cmFuc2ZlcihoZG1p LT5pMmMsIG1zZ3MsIDEpOworCisJcmV0cnktLTsKKwlpZiAocmMgPT0gMSkKKwkJcmMgPSAwOwor CWVsc2UgaWYgKHJldHJ5ID4gMCkKKwkJZ290byByZXRyeTsKKwllbHNlCisJCXJjID0gLUVJTzsK KworCURCRygiRW5kIEREQyB3cml0ZSAlZCIsIHJjKTsKKworCXJldHVybiByYzsKK30KKworc3Rh dGljIGludCBoZG1pX2hkY3Bfc2NtX3dyKHN0cnVjdCBoZG1pX2hkY3BfY3RybCAqaGRjcF9jdHJs LCB1MzIgKnByZWcsCisJdTMyICpwZGF0YSwgdTMyIGNvdW50KQoreworCXN0cnVjdCBoZG1pICpo ZG1pID0gaGRjcF9jdHJsLT5oZG1pOworCXN0cnVjdCBxY29tX3NjbV9oZGNwX3JlcSBzY21fYnVm W1FDT01fU0NNX0hEQ1BfTUFYX1JFUV9DTlRdOworCXUzMiByZXNwLCBwaHlfYWRkciwgaWR4ID0g MDsKKwlpbnQgaSwgcmV0ID0gMDsKKworCVdBUk5fT04oIXBkYXRhIHx8ICFwcmVnIHx8IChjb3Vu dCA9PSAwKSk7CisKKwlpZiAoaGRjcF9jdHJsLT50el9oZGNwKSB7CisJCXBoeV9hZGRyID0gKHUz MiloZG1pLT5tbWlvX3BoeV9hZGRyOworCisJCXdoaWxlIChjb3VudCkgeworCQkJbWVtc2V0KHNj bV9idWYsIDAsIHNpemVvZihzY21fYnVmKSk7CisJCQlmb3IgKGkgPSAwOyBpIDwgY291bnQgJiYg aSA8IFFDT01fU0NNX0hEQ1BfTUFYX1JFUV9DTlQ7CisJCQkJaSsrKSB7CisJCQkJc2NtX2J1Zltp XS5hZGRyID0gcGh5X2FkZHIgKyBwcmVnW2lkeF07CisJCQkJc2NtX2J1ZltpXS52YWwgID0gcGRh dGFbaWR4XTsKKwkJCQlpZHgrKzsKKwkJCX0KKwkJCXJldCA9IHFjb21fc2NtX2hkY3BfcmVxKHNj bV9idWYsIGksICZyZXNwKTsKKworCQkJaWYgKHJldCB8fCByZXNwKSB7CisJCQkJcHJfZXJyKCIl czogZXJyb3I6IHNjbV9jYWxsIHJldD0lZCByZXNwPSV1XG4iLAorCQkJCQlfX2Z1bmNfXywgcmV0 LCByZXNwKTsKKwkJCQlyZXQgPSAtRUlOVkFMOworCQkJCWJyZWFrOworCQkJfQorCisJCQljb3Vu dCAtPSBpOworCQl9CisJfSBlbHNlIHsKKwkJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCisJ CQloZG1pX3dyaXRlKGhkbWksIHByZWdbaV0sIHBkYXRhW2ldKTsKKwl9CisKKwlyZXR1cm4gcmV0 OworfQorCit2b2lkIGhkbWlfaGRjcF9pcnEoc3RydWN0IGhkbWlfaGRjcF9jdHJsICpoZGNwX2N0 cmwpCit7CisJc3RydWN0IGhkbWkgKmhkbWkgPSBoZGNwX2N0cmwtPmhkbWk7CisJdTMyIHJlZ192 YWwsIGhkY3BfaW50X3N0YXR1czsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2Nr X2lycXNhdmUoJmhkbWktPnJlZ19sb2NrLCBmbGFncyk7CisJcmVnX3ZhbCA9IGhkbWlfcmVhZCho ZG1pLCBSRUdfSERNSV9IRENQX0lOVF9DVFJMKTsKKwloZGNwX2ludF9zdGF0dXMgPSByZWdfdmFs ICYgSERDUF9JTlRfU1RBVFVTX01BU0s7CisJaWYgKCFoZGNwX2ludF9zdGF0dXMpIHsKKwkJc3Bp bl91bmxvY2tfaXJxcmVzdG9yZSgmaGRtaS0+cmVnX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOwor CX0KKwkvKiBDbGVhciBJbnRlcnJ1cHRzICovCisJcmVnX3ZhbCB8PSBoZGNwX2ludF9zdGF0dXMg PDwgMTsKKwkvKiBDbGVhciBBVVRIX0ZBSUxfSU5GTyBhcyB3ZWxsICovCisJaWYgKGhkY3BfaW50 X3N0YXR1cyAmIEhETUlfSERDUF9JTlRfQ1RSTF9BVVRIX0ZBSUxfSU5UKQorCQlyZWdfdmFsIHw9 IEhETUlfSERDUF9JTlRfQ1RSTF9BVVRIX0ZBSUxfSU5GT19BQ0s7CisJaGRtaV93cml0ZShoZG1p LCBSRUdfSERNSV9IRENQX0lOVF9DVFJMLCByZWdfdmFsKTsKKwlzcGluX3VubG9ja19pcnFyZXN0 b3JlKCZoZG1pLT5yZWdfbG9jaywgZmxhZ3MpOworCisJREJHKCJoZGNwIGlycSAleCIsIGhkY3Bf aW50X3N0YXR1cyk7CisKKwlpZiAoaGRjcF9pbnRfc3RhdHVzICYgSERNSV9IRENQX0lOVF9DVFJM X0FVVEhfU1VDQ0VTU19JTlQpIHsKKwkJcHJfaW5mbygiJXM6QVVUSF9TVUNDRVNTX0lOVCByZWNl aXZlZFxuIiwgX19mdW5jX18pOworCQlpZiAoSERDUF9TVEFURV9BVVRIRU5USUNBVElORyA9PSBo ZGNwX2N0cmwtPmhkY3Bfc3RhdGUpIHsKKwkJCXNldF9iaXQoQVVUSF9SRVNVTFRfUkRZX0VWLCAm aGRjcF9jdHJsLT5hdXRoX2V2ZW50KTsKKwkJCXdha2VfdXBfYWxsKCZoZGNwX2N0cmwtPmF1dGhf ZXZlbnRfcXVldWUpOworCQl9CisJfQorCisJaWYgKGhkY3BfaW50X3N0YXR1cyAmIEhETUlfSERD UF9JTlRfQ1RSTF9BVVRIX0ZBSUxfSU5UKSB7CisJCXJlZ192YWwgPSBoZG1pX3JlYWQoaGRtaSwg UkVHX0hETUlfSERDUF9MSU5LMF9TVEFUVVMpOworCQlwcl9pbmZvKCIlczogQVVUSF9GQUlMX0lO VCByY3ZkLCBMSU5LMF9TVEFUVVM9MHglMDh4XG4iLAorCQkJX19mdW5jX18sIHJlZ192YWwpOwor CQlpZiAoSERDUF9TVEFURV9BVVRIRU5USUNBVEVEID09IGhkY3BfY3RybC0+aGRjcF9zdGF0ZSkK KwkJCXF1ZXVlX3dvcmsoaGRtaS0+d29ya3EsICZoZGNwX2N0cmwtPmhkY3BfcmVhdXRoX3dvcmsp OworCQllbHNlIGlmIChIRENQX1NUQVRFX0FVVEhFTlRJQ0FUSU5HID09CisJCQkJaGRjcF9jdHJs LT5oZGNwX3N0YXRlKSB7CisJCQlzZXRfYml0KEFVVEhfUkVTVUxUX1JEWV9FViwgJmhkY3BfY3Ry bC0+YXV0aF9ldmVudCk7CisJCQl3YWtlX3VwX2FsbCgmaGRjcF9jdHJsLT5hdXRoX2V2ZW50X3F1 ZXVlKTsKKwkJfQorCX0KK30KKworc3RhdGljIGludCBoZG1pX2hkY3BfbXNsZWVwKHN0cnVjdCBo ZG1pX2hkY3BfY3RybCAqaGRjcF9jdHJsLCB1MzIgbXMsIHUzMiBldikKK3sKKwlpbnQgcmM7CisK KwlyYyA9IHdhaXRfZXZlbnRfdGltZW91dChoZGNwX2N0cmwtPmF1dGhfZXZlbnRfcXVldWUsCisJ CSEhdGVzdF9iaXQoZXYsICZoZGNwX2N0cmwtPmF1dGhfZXZlbnQpLAorCQltc2Vjc190b19qaWZm aWVzKG1zKSk7CisJaWYgKHJjKSB7CisJCXByX2luZm8oIiVzOiBtc2xlZXAgaXMgY2FuY2VsZWQg YnkgZXZlbnQgJWRcbiIsCisJCQkJX19mdW5jX18sIGV2KTsKKwkJY2xlYXJfYml0KGV2LCAmaGRj cF9jdHJsLT5hdXRoX2V2ZW50KTsKKwkJcmV0dXJuIC1FQ0FOQ0VMRUQ7CisJfQorCisJcmV0dXJu IDA7Cit9CisKK3N0YXRpYyBpbnQgaGRtaV9oZGNwX3JlYWRfdmFsaWRhdGVfYWtzdihzdHJ1Y3Qg aGRtaV9oZGNwX2N0cmwgKmhkY3BfY3RybCkKK3sKKwlzdHJ1Y3QgaGRtaSAqaGRtaSA9IGhkY3Bf Y3RybC0+aGRtaTsKKworCS8qIEZldGNoIGFrc3YgZnJvbSBRRlBST00sIHRoaXMgaW5mbyBzaG91 bGQgYmUgcHVibGljLiAqLworCWhkY3BfY3RybC0+YWtzdl9sc2IgPSBoZG1pX3FmcHJvbV9yZWFk KGhkbWksIEhEQ1BfS1NWX0xTQik7CisJaGRjcF9jdHJsLT5ha3N2X21zYiA9IGhkbWlfcWZwcm9t X3JlYWQoaGRtaSwgSERDUF9LU1ZfTVNCKTsKKworCS8qIGNoZWNrIHRoZXJlIGFyZSAyMCBvbmVz IGluIEFLU1YgKi8KKwlpZiAoKGh3ZWlnaHQzMihoZGNwX2N0cmwtPmFrc3ZfbHNiKSArIGh3ZWln aHQzMihoZGNwX2N0cmwtPmFrc3ZfbXNiKSkKKwkJCSE9IDIwKSB7CisJCXByX2VycigiJXM6IEFL U1YgUUZQUk9NIGRvZXNuJ3QgaGF2ZSAyMCAxJ3MsIDIwIDAnc1xuIiwKKwkJCV9fZnVuY19fKTsK KwkJcHJfZXJyKCIlczogUUZQUk9NIEFLU1YgY2hrIGZhaWxlZCAoQUtTVj0lMDJ4JTA4eClcbiIs CisJCQlfX2Z1bmNfXywgaGRjcF9jdHJsLT5ha3N2X21zYiwKKwkJCWhkY3BfY3RybC0+YWtzdl9s c2IpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJREJHKCJBS1NWPSUwMnglMDh4IiwgaGRjcF9j dHJsLT5ha3N2X21zYiwgaGRjcF9jdHJsLT5ha3N2X2xzYik7CisKKwlyZXR1cm4gMDsKK30KKwor c3RhdGljIGludCByZXNldF9oZGNwX2RkY19mYWlsdXJlcyhzdHJ1Y3QgaGRtaV9oZGNwX2N0cmwg KmhkY3BfY3RybCkKK3sKKwlzdHJ1Y3QgaGRtaSAqaGRtaSA9IGhkY3BfY3RybC0+aGRtaTsKKwl1 MzIgcmVnX3ZhbCwgZmFpbHVyZSwgbmFjazA7CisJaW50IHJjID0gMDsKKworCS8qIENoZWNrIGZv ciBhbnkgRERDIHRyYW5zZmVyIGZhaWx1cmVzICovCisJcmVnX3ZhbCA9IGhkbWlfcmVhZChoZG1p LCBSRUdfSERNSV9IRENQX0REQ19TVEFUVVMpOworCWZhaWx1cmUgPSByZWdfdmFsICYgSERNSV9I RENQX0REQ19TVEFUVVNfRkFJTEVEOworCW5hY2swID0gcmVnX3ZhbCAmIEhETUlfSERDUF9ERENf U1RBVFVTX05BQ0swOworCURCRygiSERDUF9ERENfU1RBVFVTPTB4JXgsIEZBSUw9JWQsIE5BQ0sw PSVkIiwKKwkJcmVnX3ZhbCwgZmFpbHVyZSwgbmFjazApOworCisJaWYgKGZhaWx1cmUpIHsKKwkJ LyoKKwkJICogSW5kaWNhdGVzIHRoYXQgdGhlIGxhc3QgSERDUCBIVyBEREMgdHJhbnNmZXIgZmFp bGVkLgorCQkgKiBUaGlzIG9jY3VycyB3aGVuIGEgdHJhbnNmZXIgaXMgYXR0ZW1wdGVkIHdpdGgg SERDUCBEREMKKwkJICogZGlzYWJsZWQgKEhEQ1BfRERDX0RJU0FCTEU9MSkgb3IgdGhlIG51bWJl ciBvZiByZXRyaWVzCisJCSAqIG1hdGNoZXMgSERDUF9ERENfUkVUUllfQ05ULgorCQkgKiBGYWls dXJlIG9jY3VycmVkLCAgbGV0J3MgY2xlYXIgaXQuCisJCSAqLworCQlEQkcoIkREQyBmYWlsdXJl IGRldGVjdGVkIik7CisKKwkJLyogRmlyc3QsIERpc2FibGUgRERDICovCisJCWhkbWlfd3JpdGUo aGRtaSwgUkVHX0hETUlfSERDUF9ERENfQ1RSTF8wLAorCQkJSERNSV9IRENQX0REQ19DVFJMXzBf RElTQUJMRSk7CisKKwkJLyogQUNLIHRoZSBGYWlsdXJlIHRvIENsZWFyIGl0ICovCisJCXJlZ192 YWwgPSBoZG1pX3JlYWQoaGRtaSwgUkVHX0hETUlfSERDUF9ERENfQ1RSTF8xKTsKKwkJcmVnX3Zh bCB8PSBIRE1JX0hEQ1BfRERDX0NUUkxfMV9GQUlMRURfQUNLOworCQloZG1pX3dyaXRlKGhkbWks IFJFR19IRE1JX0hEQ1BfRERDX0NUUkxfMSwgcmVnX3ZhbCk7CisKKwkJLyogQ2hlY2sgaWYgdGhl IEZBSUxVUkUgZ290IENsZWFyZWQgKi8KKwkJcmVnX3ZhbCA9IGhkbWlfcmVhZChoZG1pLCBSRUdf SERNSV9IRENQX0REQ19TVEFUVVMpOworCQlpZiAocmVnX3ZhbCAmIEhETUlfSERDUF9ERENfU1RB VFVTX0ZBSUxFRCkKKwkJCXByX2luZm8oIiVzOiBVbmFibGUgdG8gY2xlYXIgSERDUCBEREMgRmFp bHVyZVxuIiwKKwkJCQlfX2Z1bmNfXyk7CisKKwkJLyogUmUtRW5hYmxlIEhEQ1AgRERDICovCisJ CWhkbWlfd3JpdGUoaGRtaSwgUkVHX0hETUlfSERDUF9ERENfQ1RSTF8wLCAwKTsKKwl9CisKKwlp ZiAobmFjazApIHsKKwkJREJHKCJCZWZvcmU6IEhETUlfRERDX1NXX1NUQVRVUz0weCUwOHgiLAor CQkJaGRtaV9yZWFkKGhkbWksIFJFR19IRE1JX0REQ19TV19TVEFUVVMpKTsKKwkJLyogUmVzZXQg SERNSSBEREMgc29mdHdhcmUgc3RhdHVzICovCisJCXJlZ192YWwgPSBoZG1pX3JlYWQoaGRtaSwg UkVHX0hETUlfRERDX0NUUkwpOworCQlyZWdfdmFsIHw9IEhETUlfRERDX0NUUkxfU1dfU1RBVFVT X1JFU0VUOworCQloZG1pX3dyaXRlKGhkbWksIFJFR19IRE1JX0REQ19DVFJMLCByZWdfdmFsKTsK KworCQlyYyA9IGhkbWlfaGRjcF9tc2xlZXAoaGRjcF9jdHJsLCAyMCwgQVVUSF9BQk9SVF9FVik7 CisKKwkJcmVnX3ZhbCA9IGhkbWlfcmVhZChoZG1pLCBSRUdfSERNSV9ERENfQ1RSTCk7CisJCXJl Z192YWwgJj0gfkhETUlfRERDX0NUUkxfU1dfU1RBVFVTX1JFU0VUOworCQloZG1pX3dyaXRlKGhk bWksIFJFR19IRE1JX0REQ19DVFJMLCByZWdfdmFsKTsKKworCQkvKiBSZXNldCBIRE1JIEREQyBD b250cm9sbGVyICovCisJCXJlZ192YWwgPSBoZG1pX3JlYWQoaGRtaSwgUkVHX0hETUlfRERDX0NU UkwpOworCQlyZWdfdmFsIHw9IEhETUlfRERDX0NUUkxfU09GVF9SRVNFVDsKKwkJaGRtaV93cml0 ZShoZG1pLCBSRUdfSERNSV9ERENfQ1RSTCwgcmVnX3ZhbCk7CisKKwkJLyogSWYgcHJldmlvdXMg bXNsZWVwIGlzIGFib3J0ZWQsIHNraXAgdGhpcyBtc2xlZXAgKi8KKwkJaWYgKCFyYykKKwkJCXJj ID0gaGRtaV9oZGNwX21zbGVlcChoZGNwX2N0cmwsIDIwLCBBVVRIX0FCT1JUX0VWKTsKKworCQly ZWdfdmFsID0gaGRtaV9yZWFkKGhkbWksIFJFR19IRE1JX0REQ19DVFJMKTsKKwkJcmVnX3ZhbCAm PSB+SERNSV9ERENfQ1RSTF9TT0ZUX1JFU0VUOworCQloZG1pX3dyaXRlKGhkbWksIFJFR19IRE1J X0REQ19DVFJMLCByZWdfdmFsKTsKKwkJREJHKCJBZnRlcjogSERNSV9ERENfU1dfU1RBVFVTPTB4 JTA4eCIsCisJCQloZG1pX3JlYWQoaGRtaSwgUkVHX0hETUlfRERDX1NXX1NUQVRVUykpOworCX0K KworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBoZG1pX2hkY3BfaHdfZGRjX2NsZWFuKHN0 cnVjdCBoZG1pX2hkY3BfY3RybCAqaGRjcF9jdHJsKQoreworCWludCByYzsKKwl1MzIgaGRjcF9k ZGNfc3RhdHVzLCBkZGNfaHdfc3RhdHVzOworCXUzMiB4ZmVyX2RvbmUsIHhmZXJfcmVxLCBod19k b25lOworCWJvb2wgaHdfbm90X3JlYWR5OworCXUzMiB0aW1lb3V0X2NvdW50OworCXN0cnVjdCBo ZG1pICpoZG1pID0gaGRjcF9jdHJsLT5oZG1pOworCisJaWYgKGhkbWlfcmVhZChoZG1pLCBSRUdf SERNSV9ERENfSFdfU1RBVFVTKSA9PSAwKQorCQlyZXR1cm4gMDsKKworCS8qIFdhaXQgdG8gYmUg Y2xlYW4gb24gRERDIEhXIGVuZ2luZSAqLworCXRpbWVvdXRfY291bnQgPSAxMDA7CisJZG8gewor CQloZGNwX2RkY19zdGF0dXMgPSBoZG1pX3JlYWQoaGRtaSwgUkVHX0hETUlfSERDUF9ERENfU1RB VFVTKTsKKwkJZGRjX2h3X3N0YXR1cyA9IGhkbWlfcmVhZChoZG1pLCBSRUdfSERNSV9ERENfSFdf U1RBVFVTKTsKKworCQl4ZmVyX2RvbmUgPSBoZGNwX2RkY19zdGF0dXMgJiBIRE1JX0hEQ1BfRERD X1NUQVRVU19YRkVSX0RPTkU7CisJCXhmZXJfcmVxID0gaGRjcF9kZGNfc3RhdHVzICYgSERNSV9I RENQX0REQ19TVEFUVVNfWEZFUl9SRVE7CisJCWh3X2RvbmUgPSBkZGNfaHdfc3RhdHVzICYgSERN SV9ERENfSFdfU1RBVFVTX0RPTkU7CisJCWh3X25vdF9yZWFkeSA9ICF4ZmVyX2RvbmUgfHwgeGZl cl9yZXEgfHwgIWh3X2RvbmU7CisKKwkJaWYgKGh3X25vdF9yZWFkeSkKKwkJCWJyZWFrOworCisJ CXRpbWVvdXRfY291bnQtLTsKKwkJaWYgKCF0aW1lb3V0X2NvdW50KSB7CisJCQlwcl93YXJuKCIl czogaHdfZGRjX2NsZWFuIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQkJcmV0dXJuIC1FVElNRURP VVQ7CisJCX0KKworCQlyYyA9IGhkbWlfaGRjcF9tc2xlZXAoaGRjcF9jdHJsLCAyMCwgQVVUSF9B Qk9SVF9FVik7CisJCWlmIChyYykKKwkJCXJldHVybiByYzsKKwl9IHdoaWxlICgxKTsKKworCXJl dHVybiAwOworfQorCitzdGF0aWMgdm9pZCBoZG1pX2hkY3BfcmVhdXRoX3dvcmsoc3RydWN0IHdv cmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBoZG1pX2hkY3BfY3RybCAqaGRjcF9jdHJsID0g Y29udGFpbmVyX29mKHdvcmssCisJCXN0cnVjdCBoZG1pX2hkY3BfY3RybCwgaGRjcF9yZWF1dGhf d29yayk7CisJc3RydWN0IGhkbWkgKmhkbWkgPSBoZGNwX2N0cmwtPmhkbWk7CisJdW5zaWduZWQg bG9uZyBmbGFnczsKKwl1MzIgcmVnX3ZhbDsKKworCURCRygiSERDUCBSRUFVVEggV09SSyIpOwor CS8qCisJICogRGlzYWJsZSBIUEQgY2lyY3VpdHJ5LgorCSAqIFRoaXMgaXMgbmVlZGVkIHRvIHJl c2V0IHRoZSBIRENQIGNpcGhlciBlbmdpbmUgc28gdGhhdCB3aGVuIHdlCisJICogYXR0ZW1wdCBh IHJlLWF1dGhlbnRpY2F0aW9uLCBIVyB3b3VsZCBjbGVhciB0aGUgQU4wX1JFQURZIGFuZAorCSAq IEFOMV9SRUFEWSBiaXRzIGluIEhETUlfSERDUF9MSU5LMF9TVEFUVVMgcmVnaXN0ZXIKKwkgKi8K KwlzcGluX2xvY2tfaXJxc2F2ZSgmaGRtaS0+cmVnX2xvY2ssIGZsYWdzKTsKKwlyZWdfdmFsID0g aGRtaV9yZWFkKGhkbWksIFJFR19IRE1JX0hQRF9DVFJMKTsKKwlyZWdfdmFsICY9IH5IRE1JX0hQ RF9DVFJMX0VOQUJMRTsKKwloZG1pX3dyaXRlKGhkbWksIFJFR19IRE1JX0hQRF9DVFJMLCByZWdf dmFsKTsKKworCS8qIERpc2FibGUgSERDUCBpbnRlcnJ1cHRzICovCisJaGRtaV93cml0ZShoZG1p LCBSRUdfSERNSV9IRENQX0lOVF9DVFJMLCAwKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZo ZG1pLT5yZWdfbG9jaywgZmxhZ3MpOworCisJaGRtaV93cml0ZShoZG1pLCBSRUdfSERNSV9IRENQ X1JFU0VULAorCQlIRE1JX0hEQ1BfUkVTRVRfTElOSzBfREVBVVRIRU5USUNBVEUpOworCisJLyog V2FpdCB0byBiZSBjbGVhbiBvbiBEREMgSFcgZW5naW5lICovCisJaWYgKGhkbWlfaGRjcF9od19k ZGNfY2xlYW4oaGRjcF9jdHJsKSkgeworCQlwcl9pbmZvKCIlczogcmVhdXRoIHdvcmsgYWJvcnRl ZFxuIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJLyogRGlzYWJsZSBlbmNyeXB0aW9u IGFuZCBkaXNhYmxlIHRoZSBIRENQIGJsb2NrICovCisJaGRtaV93cml0ZShoZG1pLCBSRUdfSERN SV9IRENQX0NUUkwsIDApOworCisJLyogRW5hYmxlIEhQRCBjaXJjdWl0cnkgKi8KKwlzcGluX2xv Y2tfaXJxc2F2ZSgmaGRtaS0+cmVnX2xvY2ssIGZsYWdzKTsKKwlyZWdfdmFsID0gaGRtaV9yZWFk KGhkbWksIFJFR19IRE1JX0hQRF9DVFJMKTsKKwlyZWdfdmFsIHw9IEhETUlfSFBEX0NUUkxfRU5B QkxFOworCWhkbWlfd3JpdGUoaGRtaSwgUkVHX0hETUlfSFBEX0NUUkwsIHJlZ192YWwpOworCXNw aW5fdW5sb2NrX2lycXJlc3RvcmUoJmhkbWktPnJlZ19sb2NrLCBmbGFncyk7CisKKwkvKgorCSAq IE9ubHkgcmV0cnkgZGVmaW5lZCB0aW1lcyB0aGVuIGFib3J0IGN1cnJlbnQgYXV0aGVudGljYXRp bmcgcHJvY2VzcworCSAqLworCWlmICgrK2hkY3BfY3RybC0+YXV0aF9yZXRyaWVzID09IEFVVEhf UkVUUklFU19USU1FKSB7CisJCWhkY3BfY3RybC0+aGRjcF9zdGF0ZSA9IEhEQ1BfU1RBVEVfSU5B Q1RJVkU7CisJCWhkY3BfY3RybC0+YXV0aF9yZXRyaWVzID0gMDsKKwkJcHJfaW5mbygiJXM6IGFi b3J0IHJlYXV0aGVudGljYXRpb24hXG4iLCBfX2Z1bmNfXyk7CisKKwkJcmV0dXJuOworCX0KKwor CURCRygiUXVldWUgQVVUSCBXT1JLIik7CisJaGRjcF9jdHJsLT5oZGNwX3N0YXRlID0gSERDUF9T VEFURV9BVVRIRU5USUNBVElORzsKKwlxdWV1ZV93b3JrKGhkbWktPndvcmtxLCAmaGRjcF9jdHJs LT5oZGNwX2F1dGhfd29yayk7Cit9CisKK3N0YXRpYyBpbnQgaGRtaV9oZGNwX2F1dGhfcHJlcGFy ZShzdHJ1Y3QgaGRtaV9oZGNwX2N0cmwgKmhkY3BfY3RybCkKK3sKKwlzdHJ1Y3QgaGRtaSAqaGRt aSA9IGhkY3BfY3RybC0+aGRtaTsKKwl1MzIgbGluazBfc3RhdHVzOworCXUzMiByZWdfdmFsOwor CXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJjOworCisJaWYgKCFoZGNwX2N0cmwtPmFrc3Zf dmFsaWQpIHsKKwkJcmMgPSBoZG1pX2hkY3BfcmVhZF92YWxpZGF0ZV9ha3N2KGhkY3BfY3RybCk7 CisJCWlmIChyYykgeworCQkJcHJfZXJyKCIlczogQVNLViB2YWxpZGF0aW9uIGZhaWxlZFxuIiwg X19mdW5jX18pOworCQkJaGRjcF9jdHJsLT5oZGNwX3N0YXRlID0gSERDUF9TVEFURV9OT19BS1NW OworCQkJcmV0dXJuIC1FTk9UU1VQUDsKKwkJfQorCQloZGNwX2N0cmwtPmFrc3ZfdmFsaWQgPSB0 cnVlOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZoZG1pLT5yZWdfbG9jaywgZmxhZ3MpOwor CS8qIGRpc2FibGUgSERNSSBFbmNyeXB0ICovCisJcmVnX3ZhbCA9IGhkbWlfcmVhZChoZG1pLCBS RUdfSERNSV9DVFJMKTsKKwlyZWdfdmFsICY9IH5IRE1JX0NUUkxfRU5DUllQVEVEOworCWhkbWlf d3JpdGUoaGRtaSwgUkVHX0hETUlfQ1RSTCwgcmVnX3ZhbCk7CisKKwkvKiBFbmFibGluZyBTb2Z0 d2FyZSBEREMgKi8KKwlyZWdfdmFsID0gaGRtaV9yZWFkKGhkbWksIFJFR19IRE1JX0REQ19BUkJJ VFJBVElPTik7CisJcmVnX3ZhbCAmPSB+SERNSV9ERENfQVJCSVRSQVRJT05fSFdfQVJCSVRSQVRJ T047CisJaGRtaV93cml0ZShoZG1pLCBSRUdfSERNSV9ERENfQVJCSVRSQVRJT04sIHJlZ192YWwp OworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhkbWktPnJlZ19sb2NrLCBmbGFncyk7CisKKwkv KgorCSAqIFdyaXRlIEFLU1YgcmVhZCBmcm9tIFFGUFJPTSB0byB0aGUgSERDUCByZWdpc3RlcnMu CisJICogVGhpcyBzdGVwIGlzIG5lZWRlZCBmb3IgSERDUCBhdXRoZW50aWNhdGlvbiBhbmQgbXVz dCBiZQorCSAqIHdyaXR0ZW4gYmVmb3JlIGVuYWJsaW5nIEhEQ1AuCisJICovCisJaGRtaV93cml0 ZShoZG1pLCBSRUdfSERNSV9IRENQX1NXX0xPV0VSX0FLU1YsIGhkY3BfY3RybC0+YWtzdl9sc2Ip OworCWhkbWlfd3JpdGUoaGRtaSwgUkVHX0hETUlfSERDUF9TV19VUFBFUl9BS1NWLCBoZGNwX2N0 cmwtPmFrc3ZfbXNiKTsKKworCS8qCisJICogSERDUCBzZXR1cCBwcmlvciB0byBlbmFibGluZyBI RENQX0NUUkwuCisJICogU2V0dXAgc2VlZCB2YWx1ZXMgZm9yIHJhbmRvbSBudW1iZXIgQW4uCisJ ICovCisJaGRtaV93cml0ZShoZG1pLCBSRUdfSERNSV9IRENQX0VOVFJPUFlfQ1RSTDAsIDB4QjFG RkIwRkYpOworCWhkbWlfd3JpdGUoaGRtaSwgUkVHX0hETUlfSERDUF9FTlRST1BZX0NUUkwxLCAw eEYwMERGQUNFKTsKKworCS8qIERpc2FibGUgdGhlIFJuZ0NpcGhlciBzdGF0ZSAqLworCXJlZ192 YWwgPSBoZG1pX3JlYWQoaGRtaSwgUkVHX0hETUlfSERDUF9ERUJVR19DVFJMKTsKKwlyZWdfdmFs ICY9IH5IRE1JX0hEQ1BfREVCVUdfQ1RSTF9STkdfQ0lQSEVSOworCWhkbWlfd3JpdGUoaGRtaSwg UkVHX0hETUlfSERDUF9ERUJVR19DVFJMLCByZWdfdmFsKTsKKwlEQkcoIkhEQ1BfREVCVUdfQ1RS TD0weCUwOHgiLAorCQloZG1pX3JlYWQoaGRtaSwgUkVHX0hETUlfSERDUF9ERUJVR19DVFJMKSk7 CisKKwkvKgorCSAqIEVuc3VyZSB0aGF0IGFsbCByZWdpc3RlciB3cml0ZXMgYXJlIGNvbXBsZXRl ZCBiZWZvcmUKKwkgKiBlbmFibGluZyBIRENQIGNpcGhlcgorCSAqLworCXdtYigpOworCisJLyoK KwkgKiBFbmFibGUgSERDUAorCSAqIFRoaXMgbmVlZHMgdG8gYmUgZG9uZSBhcyBlYXJseSBhcyBw b3NzaWJsZSBpbiBvcmRlciBmb3IgdGhlCisJICogaGFyZHdhcmUgdG8gbWFrZSBBbiBhdmFpbGFi bGUgdG8gcmVhZAorCSAqLworCWhkbWlfd3JpdGUoaGRtaSwgUkVHX0hETUlfSERDUF9DVFJMLCBI RE1JX0hEQ1BfQ1RSTF9FTkFCTEUpOworCisJLyoKKwkgKiBJZiB3ZSBoYWQgc3RhbGUgdmFsdWVz IGZvciB0aGUgQW4gcmVhZHkgYml0LCBpdCBzaG91bGQgbW9zdAorCSAqIGxpa2VseSBiZSBjbGVh cmVkIG5vdyBhZnRlciBlbmFibGluZyBIRENQIGNpcGhlcgorCSAqLworCWxpbmswX3N0YXR1cyA9 IGhkbWlfcmVhZChoZG1pLCBSRUdfSERNSV9IRENQX0xJTkswX1NUQVRVUyk7CisJREJHKCJBZnRl ciBlbmFibGluZyBIRENQIExpbmswX1N0YXR1cz0weCUwOHgiLCBsaW5rMF9zdGF0dXMpOworCWlm ICghKGxpbmswX3N0YXR1cyAmCisJCShIRE1JX0hEQ1BfTElOSzBfU1RBVFVTX0FOXzBfUkVBRFkg fAorCQlIRE1JX0hEQ1BfTElOSzBfU1RBVFVTX0FOXzFfUkVBRFkpKSkKKwkJREJHKCJBbiBub3Qg cmVhZHkgYWZ0ZXIgZW5hYmxpbmcgSERDUCIpOworCisJLyogQ2xlYXIgYW55IEREQyBmYWlsdXJl cyBmcm9tIHByZXZpb3VzIHRyaWVzIGJlZm9yZSBlbmFibGUgSERDUCovCisJcmMgPSByZXNldF9o ZGNwX2RkY19mYWlsdXJlcyhoZGNwX2N0cmwpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMg dm9pZCBoZG1pX2hkY3BfYXV0aF9mYWlsKHN0cnVjdCBoZG1pX2hkY3BfY3RybCAqaGRjcF9jdHJs KQoreworCXN0cnVjdCBoZG1pICpoZG1pID0gaGRjcF9jdHJsLT5oZG1pOworCXUzMiByZWdfdmFs OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlEQkcoImhkY3AgYXV0aCBmYWlsZWQsIHF1ZXVl IHJlYXV0aCB3b3JrIik7CisJLyogY2xlYXIgSERNSSBFbmNyeXB0ICovCisJc3Bpbl9sb2NrX2ly cXNhdmUoJmhkbWktPnJlZ19sb2NrLCBmbGFncyk7CisJcmVnX3ZhbCA9IGhkbWlfcmVhZChoZG1p LCBSRUdfSERNSV9DVFJMKTsKKwlyZWdfdmFsICY9IH5IRE1JX0NUUkxfRU5DUllQVEVEOworCWhk bWlfd3JpdGUoaGRtaSwgUkVHX0hETUlfQ1RSTCwgcmVnX3ZhbCk7CisJc3Bpbl91bmxvY2tfaXJx cmVzdG9yZSgmaGRtaS0+cmVnX2xvY2ssIGZsYWdzKTsKKworCWhkY3BfY3RybC0+aGRjcF9zdGF0 ZSA9IEhEQ1BfU1RBVEVfQVVUSF9GQUlMRUQ7CisJcXVldWVfd29yayhoZG1pLT53b3JrcSwgJmhk Y3BfY3RybC0+aGRjcF9yZWF1dGhfd29yayk7Cit9CisKK3N0YXRpYyB2b2lkIGhkbWlfaGRjcF9h dXRoX2RvbmUoc3RydWN0IGhkbWlfaGRjcF9jdHJsICpoZGNwX2N0cmwpCit7CisJc3RydWN0IGhk bWkgKmhkbWkgPSBoZGNwX2N0cmwtPmhkbWk7CisJdTMyIHJlZ192YWw7CisJdW5zaWduZWQgbG9u ZyBmbGFnczsKKworCS8qCisJICogRGlzYWJsZSBzb2Z0d2FyZSBEREMgYmVmb3JlIGdvaW5nIGlu dG8gcGFydDMgdG8gbWFrZSBzdXJlCisJICogdGhlcmUgaXMgbm8gQXJiaXRyYXRpb24gYmV0d2Vl biBzb2Z0d2FyZSBhbmQgaGFyZHdhcmUgZm9yIEREQworCSAqLworCXNwaW5fbG9ja19pcnFzYXZl KCZoZG1pLT5yZWdfbG9jaywgZmxhZ3MpOworCXJlZ192YWwgPSBoZG1pX3JlYWQoaGRtaSwgUkVH X0hETUlfRERDX0FSQklUUkFUSU9OKTsKKwlyZWdfdmFsIHw9IEhETUlfRERDX0FSQklUUkFUSU9O X0hXX0FSQklUUkFUSU9OOworCWhkbWlfd3JpdGUoaGRtaSwgUkVHX0hETUlfRERDX0FSQklUUkFU SU9OLCByZWdfdmFsKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoZG1pLT5yZWdfbG9jaywg ZmxhZ3MpOworCisJLyogZW5hYmxlIEhETUkgRW5jcnlwdCAqLworCXNwaW5fbG9ja19pcnFzYXZl KCZoZG1pLT5yZWdfbG9jaywgZmxhZ3MpOworCXJlZ192YWwgPSBoZG1pX3JlYWQoaGRtaSwgUkVH X0hETUlfQ1RSTCk7CisJcmVnX3ZhbCB8PSBIRE1JX0NUUkxfRU5DUllQVEVEOworCWhkbWlfd3Jp dGUoaGRtaSwgUkVHX0hETUlfQ1RSTCwgcmVnX3ZhbCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9y ZSgmaGRtaS0+cmVnX2xvY2ssIGZsYWdzKTsKKworCWhkY3BfY3RybC0+aGRjcF9zdGF0ZSA9IEhE Q1BfU1RBVEVfQVVUSEVOVElDQVRFRDsKKwloZGNwX2N0cmwtPmF1dGhfcmV0cmllcyA9IDA7Cit9 CisKKy8qCisgKiBoZGNwIGF1dGhlbnRpY2F0aW5nIHBhcnQgMQorICogV2FpdCBLZXkvQW4gcmVh ZHkKKyAqIFJlYWQgQkNBUFMgZnJvbSBzaW5rCisgKiBXcml0ZSBCQ0FQUyBhbmQgQUtTViBpbnRv IEhEQ1AgZW5naW5lCisgKiBXcml0ZSBBbiBhbmQgQUtTViB0byBzaW5rCisgKiBSZWFkIEJLU1Yg ZnJvbSBzaW5rIGFuZCB3cml0ZSBpbnRvIEhEQ1AgZW5naW5lCisgKi8KK3N0YXRpYyBpbnQgaGRt aV9oZGNwX3dhaXRfa2V5X2FuX3JlYWR5KHN0cnVjdCBoZG1pX2hkY3BfY3RybCAqaGRjcF9jdHJs KQoreworCWludCByYzsKKwlzdHJ1Y3QgaGRtaSAqaGRtaSA9IGhkY3BfY3RybC0+aGRtaTsKKwl1 MzIgbGluazBfc3RhdHVzLCBrZXlzX3N0YXRlOworCXUzMiB0aW1lb3V0X2NvdW50OworCWJvb2wg YW5fcmVhZHk7CisKKwkvKiBXYWl0IGZvciBIRENQIGtleXMgdG8gYmUgY2hlY2tlZCBhbmQgdmFs aWRhdGVkICovCisJdGltZW91dF9jb3VudCA9IDEwMDsKKwlkbyB7CisJCWxpbmswX3N0YXR1cyA9 IGhkbWlfcmVhZChoZG1pLCBSRUdfSERNSV9IRENQX0xJTkswX1NUQVRVUyk7CisJCWtleXNfc3Rh dGUgPSAobGluazBfc3RhdHVzID4+IDI4KSAmIDB4NzsKKwkJaWYgKGtleXNfc3RhdGUgPT0gSERD UF9LRVlTX1NUQVRFX1ZBTElEKQorCQkJYnJlYWs7CisKKwkJREJHKCJLZXlzIG5vdCByZWFkeSgl ZCkuIHM9JWQsIGwwPSUweDA4eCIsCisJCQl0aW1lb3V0X2NvdW50LCBrZXlzX3N0YXRlLCBsaW5r MF9zdGF0dXMpOworCisJCXRpbWVvdXRfY291bnQtLTsKKwkJaWYgKCF0aW1lb3V0X2NvdW50KSB7 CisJCQlwcl9lcnIoIiVzOiBXYWl0IGtleSBzdGF0ZSB0aW1lZG91dCIsIF9fZnVuY19fKTsKKwkJ CXJldHVybiAtRVRJTUVET1VUOworCQl9CisKKwkJcmMgPSBoZG1pX2hkY3BfbXNsZWVwKGhkY3Bf Y3RybCwgMjAsIEFVVEhfQUJPUlRfRVYpOworCQlpZiAocmMpCisJCQlyZXR1cm4gcmM7CisJfSB3 aGlsZSAoMSk7CisKKwl0aW1lb3V0X2NvdW50ID0gMTAwOworCWRvIHsKKwkJbGluazBfc3RhdHVz ID0gaGRtaV9yZWFkKGhkbWksIFJFR19IRE1JX0hEQ1BfTElOSzBfU1RBVFVTKTsKKwkJYW5fcmVh ZHkgPSAobGluazBfc3RhdHVzICYgSERNSV9IRENQX0xJTkswX1NUQVRVU19BTl8wX1JFQURZKQor CQkJJiYgKGxpbmswX3N0YXR1cyAmIEhETUlfSERDUF9MSU5LMF9TVEFUVVNfQU5fMV9SRUFEWSk7 CisJCWlmIChhbl9yZWFkeSkKKwkJCWJyZWFrOworCisJCURCRygiQW4gbm90IHJlYWR5KCVkKS4g bDBfc3RhdHVzPTB4JTA4eCIsCisJCQl0aW1lb3V0X2NvdW50LCBsaW5rMF9zdGF0dXMpOworCisJ CXRpbWVvdXRfY291bnQtLTsKKwkJaWYgKCF0aW1lb3V0X2NvdW50KSB7CisJCQlwcl9lcnIoIiVz OiBXYWl0IEFuIHRpbWVkb3V0IiwgX19mdW5jX18pOworCQkJcmV0dXJuIC1FVElNRURPVVQ7CisJ CX0KKworCQlyYyA9IGhkbWlfaGRjcF9tc2xlZXAoaGRjcF9jdHJsLCAyMCwgQVVUSF9BQk9SVF9F Vik7CisJCWlmIChyYykKKwkJCXJldHVybiByYzsKKwl9IHdoaWxlICgxKTsKKworCXJldHVybiAw OworfQorCitzdGF0aWMgaW50IGhkbWlfaGRjcF9zZW5kX2Frc3ZfYW4oc3RydWN0IGhkbWlfaGRj cF9jdHJsICpoZGNwX2N0cmwpCit7CisJaW50IHJjID0gMDsKKwlzdHJ1Y3QgaGRtaSAqaGRtaSA9 IGhkY3BfY3RybC0+aGRtaTsKKwl1MzIgbGluazBfYWtzdl8wLCBsaW5rMF9ha3N2XzE7CisJdTMy IGxpbmswX2FuWzJdOworCXU4IGFrc3ZbNV07CisKKwkvKiBSZWFkIEFuMCBhbmQgQW4xICovCisJ bGluazBfYW5bMF0gPSBoZG1pX3JlYWQoaGRtaSwgUkVHX0hETUlfSERDUF9SQ1ZQT1JUX0RBVEE1 KTsKKwlsaW5rMF9hblsxXSA9IGhkbWlfcmVhZChoZG1pLCBSRUdfSERNSV9IRENQX1JDVlBPUlRf REFUQTYpOworCisJLyogUmVhZCBBS1NWICovCisJbGluazBfYWtzdl8wID0gaGRtaV9yZWFkKGhk bWksIFJFR19IRE1JX0hEQ1BfUkNWUE9SVF9EQVRBMyk7CisJbGluazBfYWtzdl8xID0gaGRtaV9y ZWFkKGhkbWksIFJFR19IRE1JX0hEQ1BfUkNWUE9SVF9EQVRBNCk7CisKKwlEQkcoIkxpbmsgQVNL Vj0lMDh4JTA4eCIsIGxpbmswX2Frc3ZfMCwgbGluazBfYWtzdl8xKTsKKwkvKiBDb3B5IEFuIGFu ZCBBS1NWIHRvIGJ5dGUgYXJyYXlzIGZvciB0cmFuc21pc3Npb24gKi8KKwlha3N2WzBdID0gIGxp bmswX2Frc3ZfMCAgICAgICAgJiAweEZGOworCWFrc3ZbMV0gPSAobGluazBfYWtzdl8wID4+IDgp ICAmIDB4RkY7CisJYWtzdlsyXSA9IChsaW5rMF9ha3N2XzAgPj4gMTYpICYgMHhGRjsKKwlha3N2 WzNdID0gKGxpbmswX2Frc3ZfMCA+PiAyNCkgJiAweEZGOworCWFrc3ZbNF0gPSAgbGluazBfYWtz dl8xICAgICAgICAmIDB4RkY7CisKKwkvKiBXcml0ZSBBbiB0byBvZmZzZXQgMHgxOCAqLworCXJj ID0gaGRtaV9kZGNfd3JpdGUoaGRtaSwgSERDUF9QT1JUX0FERFIsIDB4MTgsICh1OCAqKWxpbmsw X2FuLAorCQkodTE2KXNpemVvZihsaW5rMF9hbikpOworCWlmIChyYykgeworCQlwcl9lcnIoIiVz OkFuIHdyaXRlIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gcmM7CisJfQorCURCRygi TGluazAtQW49JTA4eCUwOHgiLCBsaW5rMF9hblswXSwgbGluazBfYW5bMV0pOworCisJLyogV3Jp dGUgQUtTViB0byBvZmZzZXQgMHgxMCAqLworCXJjID0gaGRtaV9kZGNfd3JpdGUoaGRtaSwgSERD UF9QT1JUX0FERFIsIDB4MTAsIGFrc3YsIDUpOworCWlmIChyYykgeworCQlwcl9lcnIoIiVzOkFL U1Ygd3JpdGUgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiByYzsKKwl9CisJREJHKCJM aW5rMC1BS1NWPSUwMnglMDh4IiwgbGluazBfYWtzdl8xICYgMHhGRiwgbGluazBfYWtzdl8wKTsK KworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhkbWlfaGRjcF9yZWN2X2Jrc3Yoc3RydWN0 IGhkbWlfaGRjcF9jdHJsICpoZGNwX2N0cmwpCit7CisJaW50IHJjID0gMDsKKwlzdHJ1Y3QgaGRt aSAqaGRtaSA9IGhkY3BfY3RybC0+aGRtaTsKKwl1OCBia3N2WzVdOworCXUzMiByZWdbMl0sIGRh dGFbMl07CisKKwkvKiBSZWFkIEJLU1YgYXQgb2Zmc2V0IDB4MDAgKi8KKwlyYyA9IGhkbWlfZGRj X3JlYWQoaGRtaSwgSERDUF9QT1JUX0FERFIsIDB4MDAsIGJrc3YsIDUpOworCWlmIChyYykgewor CQlwcl9lcnIoIiVzOkJLU1YgcmVhZCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIHJj OworCX0KKworCWhkY3BfY3RybC0+Ymtzdl9sc2IgPSBia3N2WzBdIHwgKGJrc3ZbMV0gPDwgOCkg fAorCQkoYmtzdlsyXSA8PCAxNikgfCAoYmtzdlszXSA8PCAyNCk7CisJaGRjcF9jdHJsLT5ia3N2 X21zYiA9IGJrc3ZbNF07CisJREJHKCI6QktTVj0lMDJ4JTA4eCIsIGhkY3BfY3RybC0+Ymtzdl9t c2IsIGhkY3BfY3RybC0+Ymtzdl9sc2IpOworCisJLyogY2hlY2sgdGhlcmUgYXJlIDIwIG9uZXMg aW4gQktTViAqLworCWlmICgoaHdlaWdodDMyKGhkY3BfY3RybC0+Ymtzdl9sc2IpICsgaHdlaWdo dDMyKGhkY3BfY3RybC0+Ymtzdl9tc2IpKQorCQkJIT0gMjApIHsKKwkJcHJfZXJyKCI6IEJLU1Yg ZG9lc24ndCBoYXZlIDIwIDEncyBhbmQgMjAgMCdzXG4iKTsKKwkJcHJfZXJyKCI6IEJLU1YgY2hr IGZhaWwuIEJLU1Y9JTAyeCUwMnglMDJ4JTAyeCUwMnhcbiIsCisJCQlia3N2WzRdLCBia3N2WzNd LCBia3N2WzJdLCBia3N2WzFdLCBia3N2WzBdKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJ LyogV3JpdGUgQktTViByZWFkIGZyb20gc2luayB0byBIRENQIHJlZ2lzdGVycyAqLworCXJlZ1sw XSA9IFJFR19IRE1JX0hEQ1BfUkNWUE9SVF9EQVRBMDsKKwlkYXRhWzBdID0gaGRjcF9jdHJsLT5i a3N2X2xzYjsKKwlyZWdbMV0gPSBSRUdfSERNSV9IRENQX1JDVlBPUlRfREFUQTE7CisJZGF0YVsx XSA9IGhkY3BfY3RybC0+Ymtzdl9tc2I7CisJcmMgPSBoZG1pX2hkY3Bfc2NtX3dyKGhkY3BfY3Ry bCwgcmVnLCBkYXRhLCAyKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBoZG1pX2hk Y3BfcmVjdl9iY2FwcyhzdHJ1Y3QgaGRtaV9oZGNwX2N0cmwgKmhkY3BfY3RybCkKK3sKKwlpbnQg cmMgPSAwOworCXN0cnVjdCBoZG1pICpoZG1pID0gaGRjcF9jdHJsLT5oZG1pOworCXUzMiByZWcs IGRhdGE7CisJdTggYmNhcHM7CisKKwlyYyA9IGhkbWlfZGRjX3JlYWQoaGRtaSwgSERDUF9QT1JU X0FERFIsIDB4NDAsICZiY2FwcywgMSk7CisJaWYgKHJjKSB7CisJCXByX2VycigiJXM6QkNBUFMg cmVhZCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIHJjOworCX0KKwlEQkcoIkJDQVBT PSUwMngiLCBiY2Fwcyk7CisKKwkvKiByZWNlaXZlciAoMCksIHJlcGVhdGVyICgxKSAqLworCWhk Y3BfY3RybC0+ZHNfdHlwZSA9IChiY2FwcyAmIEJJVCg2KSkgPyBEU19SRVBFQVRFUiA6IERTX1JF Q0VJVkVSOworCisJLyogV3JpdGUgQkNBUFMgdG8gdGhlIGhhcmR3YXJlICovCisJcmVnID0gUkVH X0hETUlfSERDUF9SQ1ZQT1JUX0RBVEExMjsKKwlkYXRhID0gKHUzMiliY2FwczsKKwlyYyA9IGhk bWlfaGRjcF9zY21fd3IoaGRjcF9jdHJsLCAmcmVnLCAmZGF0YSwgMSk7CisKKwlyZXR1cm4gcmM7 Cit9CisKK3N0YXRpYyBpbnQgaGRtaV9oZGNwX2F1dGhfcGFydDFfa2V5X2V4Y2hhbmdlKHN0cnVj dCBoZG1pX2hkY3BfY3RybCAqaGRjcF9jdHJsKQoreworCXN0cnVjdCBoZG1pICpoZG1pID0gaGRj cF9jdHJsLT5oZG1pOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJjOworCisJLyogV2Fp dCBmb3IgQUtTViBrZXkgYW5kIEFuIHJlYWR5ICovCisJcmMgPSBoZG1pX2hkY3Bfd2FpdF9rZXlf YW5fcmVhZHkoaGRjcF9jdHJsKTsKKwlpZiAocmMpIHsKKwkJcHJfZXJyKCIlczogd2FpdCBrZXkg YW5kIGFuIHJlYWR5IGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gcmM7CisJfTsKKwor CS8qIFJlYWQgQkNBUFMgYW5kIHNlbmQgdG8gSERDUCBlbmdpbmUgKi8KKwlyYyA9IGhkbWlfaGRj cF9yZWN2X2JjYXBzKGhkY3BfY3RybCk7CisJaWYgKHJjKSB7CisJCXByX2VycigiJXM6IHJlYWQg YmNhcHMgZXJyb3IsIGFib3J0XG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiByYzsKKwl9CisKKwkv KgorCSAqIDEuMV9GZWF0dXJlcyB0dXJuZWQgb2ZmIGJ5IGRlZmF1bHQuCisJICogTm8gbmVlZCB0 byB3cml0ZSBBSW5mbyBzaW5jZSAxLjFfRmVhdHVyZXMgaXMgZGlzYWJsZWQuCisJICovCisJaGRt aV93cml0ZShoZG1pLCBSRUdfSERNSV9IRENQX1JDVlBPUlRfREFUQTQsIDApOworCisJLyogU2Vu ZCBBS1NWIGFuZCBBbiB0byBzaW5rICovCisJcmMgPSBoZG1pX2hkY3Bfc2VuZF9ha3N2X2FuKGhk Y3BfY3RybCk7CisJaWYgKHJjKSB7CisJCXByX2VycigiJXM6QW4vQWtzdiB3cml0ZSBmYWlsZWRc biIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIHJjOworCX0KKworCS8qIFJlYWQgQktTViBhbmQgc2Vu ZCB0byBIRENQIGVuZ2luZSovCisJcmMgPSBoZG1pX2hkY3BfcmVjdl9ia3N2KGhkY3BfY3RybCk7 CisJaWYgKHJjKSB7CisJCXByX2VycigiJXM6QktTViBQcm9jZXNzIGZhaWxlZFxuIiwgX19mdW5j X18pOworCQlyZXR1cm4gcmM7CisJfQorCisJLyogRW5hYmxlIEhEQ1AgaW50ZXJydXB0cyBhbmQg YWNrL2NsZWFyIGFueSBzdGFsZSBpbnRlcnJ1cHRzICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhk bWktPnJlZ19sb2NrLCBmbGFncyk7CisJaGRtaV93cml0ZShoZG1pLCBSRUdfSERNSV9IRENQX0lO VF9DVFJMLAorCQlIRE1JX0hEQ1BfSU5UX0NUUkxfQVVUSF9TVUNDRVNTX0FDSyB8CisJCUhETUlf SERDUF9JTlRfQ1RSTF9BVVRIX1NVQ0NFU1NfTUFTSyB8CisJCUhETUlfSERDUF9JTlRfQ1RSTF9B VVRIX0ZBSUxfQUNLIHwKKwkJSERNSV9IRENQX0lOVF9DVFJMX0FVVEhfRkFJTF9NQVNLIHwKKwkJ SERNSV9IRENQX0lOVF9DVFJMX0FVVEhfRkFJTF9JTkZPX0FDSyk7CisJc3Bpbl91bmxvY2tfaXJx cmVzdG9yZSgmaGRtaS0+cmVnX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCisvKiBy ZWFkIFIwJyBmcm9tIHNpbmsgYW5kIHBhc3MgaXQgdG8gSERDUCBlbmdpbmUgKi8KK3N0YXRpYyBp bnQgaGRtaV9oZGNwX2F1dGhfcGFydDFfcmVjdl9yMChzdHJ1Y3QgaGRtaV9oZGNwX2N0cmwgKmhk Y3BfY3RybCkKK3sKKwlzdHJ1Y3QgaGRtaSAqaGRtaSA9IGhkY3BfY3RybC0+aGRtaTsKKwlpbnQg cmMgPSAwOworCXU4IGJ1ZlsyXTsKKworCS8qCisJICogSERDUCBDb21wbGlhbmNlIFRlc3QgY2Fz ZSAxQS0wMToKKwkgKiBXYWl0IGhlcmUgYXQgbGVhc3QgMTAwbXMgYmVmb3JlIHJlYWRpbmcgUjAn CisJICovCisJcmMgPSBoZG1pX2hkY3BfbXNsZWVwKGhkY3BfY3RybCwgMTI1LCBBVVRIX0FCT1JU X0VWKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCS8qIFJlYWQgUjAnIGF0IG9mZnNldCAw eDA4ICovCisJcmMgPSBoZG1pX2RkY19yZWFkKGhkbWksIEhEQ1BfUE9SVF9BRERSLCAweDA4LCBi dWYsIDIpOworCWlmIChyYykgeworCQlwcl9lcnIoIiVzOlIwJyByZWFkIGZhaWxlZFxuIiwgX19m dW5jX18pOworCQlyZXR1cm4gcmM7CisJfQorCURCRygiUjAnPSUwMnglMDJ4IiwgYnVmWzFdLCBi dWZbMF0pOworCisJLyogV3JpdGUgUjAnIHRvIEhEQ1AgcmVnaXN0ZXJzIGFuZCBjaGVjayB0byBz ZWUgaWYgaXQgaXMgYSBtYXRjaCAqLworCWhkbWlfd3JpdGUoaGRtaSwgUkVHX0hETUlfSERDUF9S Q1ZQT1JUX0RBVEEyXzAsCisJCSgoKHUzMilidWZbMV0pIDw8IDgpIHwgYnVmWzBdKTsKKworCXJl dHVybiAwOworfQorCisvKiBXYWl0IGZvciBhdXRoZW50aWNhdGluZyByZXN1bHQ6IFIwL1IwJyBh cmUgbWF0Y2hlZCBvciBub3QgKi8KK3N0YXRpYyBpbnQgaGRtaV9oZGNwX2F1dGhfcGFydDFfdmVy aWZ5X3IwKHN0cnVjdCBoZG1pX2hkY3BfY3RybCAqaGRjcF9jdHJsKQoreworCXN0cnVjdCBoZG1p ICpoZG1pID0gaGRjcF9jdHJsLT5oZG1pOworCXUzMiBsaW5rMF9zdGF0dXM7CisJaW50IHJjOwor CisJLyogd2FpdCBmb3IgaGRjcCBpcnEsIDEwIHNlYyBzaG91bGQgYmUgbG9uZyBlbm91Z2ggKi8K KwlyYyA9IGhkbWlfaGRjcF9tc2xlZXAoaGRjcF9jdHJsLCAxMDAwMCwgQVVUSF9SRVNVTFRfUkRZ X0VWKTsKKwlpZiAoIXJjKSB7CisJCXByX2VycigiJXM6IFdhaXQgQXV0aCBJUlEgdGltZW91dFxu IiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwl9CisKKwlsaW5rMF9zdGF0dXMg PSBoZG1pX3JlYWQoaGRtaSwgUkVHX0hETUlfSERDUF9MSU5LMF9TVEFUVVMpOworCWlmICghKGxp bmswX3N0YXR1cyAmIEhETUlfSERDUF9MSU5LMF9TVEFUVVNfUklfTUFUQ0hFUykpIHsKKwkJcHJf ZXJyKCIlczogQXV0aGVudGljYXRpb24gUGFydCBJIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQly ZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBFbmFibGUgSERDUCBFbmNyeXB0aW9uICovCisJaGRt aV93cml0ZShoZG1pLCBSRUdfSERNSV9IRENQX0NUUkwsCisJCUhETUlfSERDUF9DVFJMX0VOQUJM RSB8CisJCUhETUlfSERDUF9DVFJMX0VOQ1JZUFRJT05fRU5BQkxFKTsKKworCXJldHVybiAwOwor fQorCitzdGF0aWMgaW50IGhkbWlfaGRjcF9yZWN2X2NoZWNrX2JzdGF0dXMoc3RydWN0IGhkbWlf aGRjcF9jdHJsICpoZGNwX2N0cmwsCisJdTE2ICpwYnN0YXR1cykKK3sKKwlpbnQgcmM7CisJc3Ry dWN0IGhkbWkgKmhkbWkgPSBoZGNwX2N0cmwtPmhkbWk7CisJYm9vbCBtYXhfZGV2c19leGNlZWRl ZCA9IGZhbHNlLCBtYXhfY2FzY2FkZV9leGNlZWRlZCA9IGZhbHNlOworCXUzMiByZXBlYXRlcl9j YXNjYWRlX2RlcHRoID0gMCwgZG93bl9zdHJlYW1fZGV2aWNlcyA9IDA7CisJdTE2IGJzdGF0dXM7 CisJdTggYnVmWzJdOworCisJLyogUmVhZCBCU1RBVFVTIGF0IG9mZnNldCAweDQxICovCisJcmMg PSBoZG1pX2RkY19yZWFkKGhkbWksIEhEQ1BfUE9SVF9BRERSLCAweDQxLCBidWYsIDIpOworCWlm IChyYykgeworCQlwcl9lcnIoIiVzOiBCU1RBVFVTIHJlYWQgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7 CisJCWdvdG8gZXJyb3I7CisJfQorCSpwYnN0YXR1cyA9IGJzdGF0dXMgPSAoYnVmWzFdIDw8IDgp IHwgYnVmWzBdOworCisKKwlkb3duX3N0cmVhbV9kZXZpY2VzID0gYnN0YXR1cyAmIDB4N0Y7CisJ cmVwZWF0ZXJfY2FzY2FkZV9kZXB0aCA9IChic3RhdHVzID4+IDgpICYgMHg3OworCW1heF9kZXZz X2V4Y2VlZGVkID0gKGJzdGF0dXMgJiBCSVQoNykpID8gdHJ1ZSA6IGZhbHNlOworCW1heF9jYXNj YWRlX2V4Y2VlZGVkID0gKGJzdGF0dXMgJiBCSVQoMTEpKSA/IHRydWUgOiBmYWxzZTsKKworCWlm IChkb3duX3N0cmVhbV9kZXZpY2VzID09IDApIHsKKwkJLyoKKwkJICogSWYgbm8gZG93bnN0cmVh bSBkZXZpY2VzIGFyZSBhdHRhY2hlZCB0byB0aGUgcmVwZWF0ZXIKKwkJICogdGhlbiBwYXJ0IElJ IGZhaWxzLgorCQkgKiB0b2RvOiBUaGUgb3RoZXIgYXBwcm9hY2ggd291bGQgYmUgdG8gY29udGlu dWUgUEFSVCBJSS4KKwkJICovCisJCXByX2VycigiJXM6IE5vIGRvd25zdHJlYW0gZGV2aWNlc1xu IiwgX19mdW5jX18pOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZXJyb3I7CisJfQorCisJLyoK KwkgKiBIRENQIENvbXBsaWFuY2UgMUItMDU6CisJICogQ2hlY2sgaWYgbm8uIG9mIGRldmljZXMg Y29ubmVjdGVkIHRvIHJlcGVhdGVyCisJICogZXhjZWVkIG1heF9kZXZpY2VzX2Nvbm5lY3RlZCBm cm9tIGJpdCA3IG9mIEJzdGF0dXMuCisJICovCisJaWYgKG1heF9kZXZzX2V4Y2VlZGVkKSB7CisJ CXByX2VycigiJXM6IG5vLiBvZiBkZXZzIGNvbm5lY3RlZCBleGNlZWRzIG1heCBhbGxvd2VkIiwK KwkJCV9fZnVuY19fKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGVycm9yOworCX0KKworCS8q CisJICogSERDUCBDb21wbGlhbmNlIDFCLTA2OgorCSAqIENoZWNrIGlmIG5vLiBvZiBjYXNjYWRl IGNvbm5lY3RlZCB0byByZXBlYXRlcgorCSAqIGV4Y2VlZCBtYXhfY2FzY2FkZV9jb25uZWN0ZWQg ZnJvbSBiaXQgMTEgb2YgQnN0YXR1cy4KKwkgKi8KKwlpZiAobWF4X2Nhc2NhZGVfZXhjZWVkZWQp IHsKKwkJcHJfZXJyKCIlczogbm8uIG9mIGNhc2NhZGUgY29ubiBleGNlZWRzIG1heCBhbGxvd2Vk IiwKKwkJCV9fZnVuY19fKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGVycm9yOworCX0KKwor ZXJyb3I6CisJaGRjcF9jdHJsLT5kZXZfY291bnQgPSBkb3duX3N0cmVhbV9kZXZpY2VzOworCWhk Y3BfY3RybC0+bWF4X2Nhc2NhZGVfZXhjZWVkZWQgPSBtYXhfY2FzY2FkZV9leGNlZWRlZDsKKwlo ZGNwX2N0cmwtPm1heF9kZXZfZXhjZWVkZWQgPSBtYXhfZGV2c19leGNlZWRlZDsKKwloZGNwX2N0 cmwtPmRlcHRoID0gcmVwZWF0ZXJfY2FzY2FkZV9kZXB0aDsKKwlyZXR1cm4gcmM7Cit9CisKK3N0 YXRpYyBpbnQgaGRtaV9oZGNwX2F1dGhfcGFydDJfd2FpdF9rc3ZfZmlmb19yZWFkeSgKKwlzdHJ1 Y3QgaGRtaV9oZGNwX2N0cmwgKmhkY3BfY3RybCkKK3sKKwlpbnQgcmM7CisJc3RydWN0IGhkbWkg KmhkbWkgPSBoZGNwX2N0cmwtPmhkbWk7CisJdTMyIHJlZywgZGF0YTsKKwl1MzIgdGltZW91dF9j b3VudDsKKwl1MTYgYnN0YXR1czsKKwl1OCBiY2FwczsKKworCS8qCisJICogV2FpdCB1bnRpbCBS RUFEWSBiaXQgaXMgc2V0IGluIEJDQVBTLCBhcyBwZXIgSERDUCBzcGVjaWZpY2F0aW9ucworCSAq IG1heGltdW0gcGVybWl0dGVkIHRpbWUgdG8gY2hlY2sgZm9yIFJFQURZIGJpdCBpcyBmaXZlIHNl Y29uZHMuCisJICovCisJdGltZW91dF9jb3VudCA9IDEwMDsKKwlkbyB7CisJCS8qIFJlYWQgQkNB UFMgYXQgb2Zmc2V0IDB4NDAgKi8KKwkJcmMgPSBoZG1pX2RkY19yZWFkKGhkbWksIEhEQ1BfUE9S VF9BRERSLCAweDQwLCAmYmNhcHMsIDEpOworCQlpZiAocmMpIHsKKwkJCXByX2VycigiJXM6IEJD QVBTIHJlYWQgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gcmM7CisJCX0KKworCQlp ZiAoYmNhcHMgJiBCSVQoNSkpCisJCQlicmVhazsKKworCQl0aW1lb3V0X2NvdW50LS07CisJCWlm ICghdGltZW91dF9jb3VudCkgeworCQkJcHJfZXJyKCIlczogV2FpdCBLU1YgZmlmbyByZWFkeSB0 aW1lZG91dCIsIF9fZnVuY19fKTsKKwkJCXJldHVybiAtRVRJTUVET1VUOworCQl9CisKKwkJcmMg PSBoZG1pX2hkY3BfbXNsZWVwKGhkY3BfY3RybCwgMjAsIEFVVEhfQUJPUlRfRVYpOworCQlpZiAo cmMpCisJCQlyZXR1cm4gcmM7CisJfSB3aGlsZSAoMSk7CisKKwlyYyA9IGhkbWlfaGRjcF9yZWN2 X2NoZWNrX2JzdGF0dXMoaGRjcF9jdHJsLCAmYnN0YXR1cyk7CisJaWYgKHJjKSB7CisJCXByX2Vy cigiJXM6IGJzdGF0dXMgZXJyb3JcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIHJjOworCX0KKwor CS8qIFdyaXRlIEJTVEFUVVMgYW5kIEJDQVBTIHRvIEhEQ1AgcmVnaXN0ZXJzICovCisJcmVnID0g UkVHX0hETUlfSERDUF9SQ1ZQT1JUX0RBVEExMjsKKwlkYXRhID0gYmNhcHMgfCAoYnN0YXR1cyA8 PCA4KTsKKwlyYyA9IGhkbWlfaGRjcF9zY21fd3IoaGRjcF9jdHJsLCAmcmVnLCAmZGF0YSwgMSk7 CisJaWYgKHJjKSB7CisJCXByX2VycigiJXM6IEJTVEFUVVMgd3JpdGUgZmFpbGVkXG4iLCBfX2Z1 bmNfXyk7CisJCXJldHVybiByYzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGhkY3Ag YXV0aGVudGljYXRpbmcgcGFydCAyOiAybmQKKyAqIHJlYWQga3N2IGZpZm8gZnJvbSBzaW5rCisg KiB0cmFuc2ZlciBWJyBmcm9tIHNpbmsgdG8gSERDUCBlbmdpbmUKKyAqIHJlc2V0IFNIQSBlbmdp bmUKKyAqLworc3RhdGljIGludCBoZG1pX2hkY3BfdHJhbnNmZXJfdl9oKHN0cnVjdCBoZG1pX2hk Y3BfY3RybCAqaGRjcF9jdHJsKQoreworCXN0cnVjdCBoZG1pICpoZG1pID0gaGRjcF9jdHJsLT5o ZG1pOworCWludCByYyA9IDA7CisJc3RydWN0IGhkbWlfaGRjcF9yZWdfZGF0YSByZWdfZGF0YVtd ICA9IHsKKwkJe1JFR19IRE1JX0hEQ1BfUkNWUE9SVF9EQVRBNywgIDB4MjAsICJWJyBIMCJ9LAor CQl7UkVHX0hETUlfSERDUF9SQ1ZQT1JUX0RBVEE4LCAgMHgyNCwgIlYnIEgxIn0sCisJCXtSRUdf SERNSV9IRENQX1JDVlBPUlRfREFUQTksICAweDI4LCAiVicgSDIifSwKKwkJe1JFR19IRE1JX0hE Q1BfUkNWUE9SVF9EQVRBMTAsIDB4MkMsICJWJyBIMyJ9LAorCQl7UkVHX0hETUlfSERDUF9SQ1ZQ T1JUX0RBVEExMSwgMHgzMCwgIlYnIEg0In0sCisJfTsKKwlzdHJ1Y3QgaGRtaV9oZGNwX3JlZ19k YXRhICpyZDsKKwl1MzIgc2l6ZSA9IEFSUkFZX1NJWkUocmVnX2RhdGEpOworCXUzMiByZWdbQVJS QVlfU0laRShyZWdfZGF0YSldOworCXUzMiBkYXRhW0FSUkFZX1NJWkUocmVnX2RhdGEpXTsKKwlp bnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJcmQgPSAmcmVnX2RhdGFb aV07CisJCXJjID0gaGRtaV9kZGNfcmVhZChoZG1pLCBIRENQX1BPUlRfQUREUiwKKwkJCXJkLT5v ZmYsICh1OCAqKSZkYXRhW2ldLCAodTE2KXNpemVvZihkYXRhW2ldKSk7CisJCWlmIChyYykgewor CQkJcHJfZXJyKCIlczogUmVhZCAlcyBmYWlsZWRcbiIsIF9fZnVuY19fLCByZC0+bmFtZSk7CisJ CQlnb3RvIGVycm9yOworCQl9CisKKwkJREJHKCIlcyA9JXgiLCByZC0+bmFtZSwgZGF0YVtpXSk7 CisJCXJlZ1tpXSA9IHJlZ19kYXRhW2ldLnJlZ19pZDsKKwl9CisKKwlyYyA9IGhkbWlfaGRjcF9z Y21fd3IoaGRjcF9jdHJsLCByZWcsIGRhdGEsIHNpemUpOworCitlcnJvcjoKKwlyZXR1cm4gcmM7 Cit9CisKK3N0YXRpYyBpbnQgaGRtaV9oZGNwX3JlY3Zfa3N2X2ZpZm8oc3RydWN0IGhkbWlfaGRj cF9jdHJsICpoZGNwX2N0cmwpCit7CisJaW50IHJjOworCXN0cnVjdCBoZG1pICpoZG1pID0gaGRj cF9jdHJsLT5oZG1pOworCXUzMiBrc3ZfYnl0ZXM7CisKKwlrc3ZfYnl0ZXMgPSA1ICogaGRjcF9j dHJsLT5kZXZfY291bnQ7CisKKwlyYyA9IGhkbWlfZGRjX3JlYWQoaGRtaSwgSERDUF9QT1JUX0FE RFIsIDB4NDMsCisJCWhkY3BfY3RybC0+a3N2X2xpc3QsIGtzdl9ieXRlcyk7CisJaWYgKHJjKQor CQlwcl9lcnIoIiVzOiBLU1YgRklGTyByZWFkIGZhaWxlZFxuIiwgX19mdW5jX18pOworCisJcmV0 dXJuIHJjOworfQorCitzdGF0aWMgaW50IGhkbWlfaGRjcF9yZXNldF9zaGFfZW5naW5lKHN0cnVj dCBoZG1pX2hkY3BfY3RybCAqaGRjcF9jdHJsKQoreworCXUzMiByZWdbMl0sIGRhdGFbMl07CisJ dTMyIHJjICA9IDA7CisKKwlyZWdbMF0gPSBSRUdfSERNSV9IRENQX1NIQV9DVFJMOworCWRhdGFb MF0gPSBIRENQX1JFR19FTkFCTEU7CisJcmVnWzFdID0gUkVHX0hETUlfSERDUF9TSEFfQ1RSTDsK KwlkYXRhWzFdID0gSERDUF9SRUdfRElTQUJMRTsKKworCXJjID0gaGRtaV9oZGNwX3NjbV93ciho ZGNwX2N0cmwsIHJlZywgZGF0YSwgMik7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQg aGRtaV9oZGNwX2F1dGhfcGFydDJfcmVjdl9rc3ZfZmlmbygKKwlzdHJ1Y3QgaGRtaV9oZGNwX2N0 cmwgKmhkY3BfY3RybCkKK3sKKwlpbnQgcmM7CisJdTMyIHRpbWVvdXRfY291bnQ7CisKKwkvKgor CSAqIFJlYWQgS1NWIEZJRk8gb3ZlciBEREMKKwkgKiBLZXkgU2VsZWN0aW9uIHZlY3RvciBGSUZP IFVzZWQgdG8gcHVsbCBkb3duc3RyZWFtIEtTVnMKKwkgKiBmcm9tIEhEQ1AgUmVwZWF0ZXJzLgor CSAqIEFsbCBieXRlcyAoREVWSUNFX0NPVU5UICogNSkgbXVzdCBiZSByZWFkIGluIGEgc2luZ2xl LAorCSAqIGF1dG8gaW5jcmVtZW50aW5nIGFjY2Vzcy4KKwkgKiBBbGwgYnl0ZXMgcmVhZCBhcyAw eDAwIGZvciBIRENQIFJlY2VpdmVycyB0aGF0IGFyZSBub3QKKwkgKiBIRENQIFJlcGVhdGVycyAo UkVQRUFURVIgPT0gMCkuCisJICovCisJdGltZW91dF9jb3VudCA9IDEwMDsKKwlkbyB7CisJCXJj ID0gaGRtaV9oZGNwX3JlY3Zfa3N2X2ZpZm8oaGRjcF9jdHJsKTsKKwkJaWYgKCFyYykKKwkJCWJy ZWFrOworCisJCXRpbWVvdXRfY291bnQtLTsKKwkJaWYgKCF0aW1lb3V0X2NvdW50KSB7CisJCQlw cl9lcnIoIiVzOiBSZWN2IGtzdiBmaWZvIHRpbWVkb3V0IiwgX19mdW5jX18pOworCQkJcmV0dXJu IC1FVElNRURPVVQ7CisJCX0KKworCQlyYyA9IGhkbWlfaGRjcF9tc2xlZXAoaGRjcF9jdHJsLCAy NSwgQVVUSF9BQk9SVF9FVik7CisJCWlmIChyYykKKwkJCXJldHVybiByYzsKKwl9IHdoaWxlICgx KTsKKworCXJjID0gaGRtaV9oZGNwX3RyYW5zZmVyX3ZfaChoZGNwX2N0cmwpOworCWlmIChyYykg eworCQlwcl9lcnIoIiVzOiB0cmFuc2ZlciBWIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlyZXR1 cm4gcmM7CisJfQorCisJLyogcmVzZXQgU0hBIGVuZ2luZSBiZWZvcmUgd3JpdGUga3N2IGZpZm8g Ki8KKwlyYyA9IGhkbWlfaGRjcF9yZXNldF9zaGFfZW5naW5lKGhkY3BfY3RybCk7CisJaWYgKHJj KSB7CisJCXByX2VycigiJXM6IGZhaWwgdG8gcmVzZXQgc2hhIGVuZ2luZVxuIiwgX19mdW5jX18p OworCQlyZXR1cm4gcmM7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBXcml0ZSBLU1Yg RklGTyB0byBIRENQX1NIQV9EQVRBLgorICogVGhpcyBpcyBkb25lIDEgYnl0ZSBhdCB0aW1lIHN0 YXJ0aW5nIHdpdGggdGhlIExTQi4KKyAqIE9uY2UgNjQgYnl0ZXMgaGF2ZSBiZWVuIHdyaXR0ZW4s IHdlIG5lZWQgdG8gcG9sbCBmb3IKKyAqIEhEQ1BfU0hBX0JMT0NLX0RPTkUgYmVmb3JlIHdyaXRp bmcgYW55IGZ1cnRoZXIKKyAqIElmIHRoZSBsYXN0IGJ5dGUgaXMgd3JpdHRlbiwgd2UgbmVlZCB0 byBwb2xsIGZvcgorICogSERDUF9TSEFfQ09NUF9ET05FIHRvIHdhaXQgdW50aWwgSFcgZmluaXNo CisgKi8KK3N0YXRpYyBpbnQgaGRtaV9oZGNwX3dyaXRlX2tzdl9maWZvKHN0cnVjdCBoZG1pX2hk Y3BfY3RybCAqaGRjcF9jdHJsKQoreworCWludCBpOworCXN0cnVjdCBoZG1pICpoZG1pID0gaGRj cF9jdHJsLT5oZG1pOworCXUzMiBrc3ZfYnl0ZXMsIGxhc3RfYnl0ZSA9IDA7CisJdTggKmtzdl9m aWZvID0gTlVMTDsKKwl1MzIgcmVnX3ZhbCwgZGF0YSwgcmVnOworCXUzMiByYyAgPSAwOworCisJ a3N2X2J5dGVzICA9IDUgKiBoZGNwX2N0cmwtPmRldl9jb3VudDsKKworCS8qIENoZWNrIGlmIG5l ZWQgdG8gd2FpdCBmb3IgSFcgY29tcGxldGlvbiAqLworCWlmIChoZGNwX2N0cmwtPmtzdl9maWZv X3dfaW5kZXgpIHsKKwkJcmVnX3ZhbCA9IGhkbWlfcmVhZChoZG1pLCBSRUdfSERNSV9IRENQX1NI QV9TVEFUVVMpOworCQlEQkcoIkhEQ1BfU0hBX1NUQVRVUz0lMDh4IiwgcmVnX3ZhbCk7CisJCWlm IChoZGNwX2N0cmwtPmtzdl9maWZvX3dfaW5kZXggPT0ga3N2X2J5dGVzKSB7CisJCQkvKiBjaGVj ayBDT01QX0RPTkUgaWYgbGFzdCB3cml0ZSAqLworCQkJaWYgKHJlZ192YWwgJiBIRE1JX0hEQ1Bf U0hBX1NUQVRVU19DT01QX0RPTkUpIHsKKwkJCQlEQkcoIkNPTVBfRE9ORSIpOworCQkJCXJldHVy biAwOworCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gLUVBR0FJTjsKKwkJCX0KKwkJfSBlbHNlIHsK KwkJCS8qIGNoZWNrIEJMT0NLX0RPTkUgaWYgbm90IGxhc3Qgd3JpdGUgKi8KKwkJCWlmICghKHJl Z192YWwgJiBIRE1JX0hEQ1BfU0hBX1NUQVRVU19CTE9DS19ET05FKSkKKwkJCQlyZXR1cm4gLUVB R0FJTjsKKworCQkJREJHKCJCTE9DS19ET05FIik7CisJCX0KKwl9CisKKwlrc3ZfYnl0ZXMgIC09 IGhkY3BfY3RybC0+a3N2X2ZpZm9fd19pbmRleDsKKwlpZiAoa3N2X2J5dGVzIDw9IDY0KQorCQls YXN0X2J5dGUgPSAxOworCWVsc2UKKwkJa3N2X2J5dGVzID0gNjQ7CisKKwlrc3ZfZmlmbyA9IGhk Y3BfY3RybC0+a3N2X2xpc3Q7CisJa3N2X2ZpZm8gKz0gaGRjcF9jdHJsLT5rc3ZfZmlmb193X2lu ZGV4OworCisJZm9yIChpID0gMDsgaSA8IGtzdl9ieXRlczsgaSsrKSB7CisJCS8qIFdyaXRlIEtT ViBieXRlIGFuZCBzZXQgRE9ORSBiaXRbMF0gZm9yIGxhc3QgYnl0ZSovCisJCXJlZ192YWwgPSBr c3ZfZmlmb1tpXSA8PCAxNjsKKwkJaWYgKChpID09IChrc3ZfYnl0ZXMgLSAxKSkgJiYgbGFzdF9i eXRlKQorCQkJcmVnX3ZhbCB8PSBIRE1JX0hEQ1BfU0hBX0RBVEFfRE9ORTsKKworCQlyZWcgPSBS RUdfSERNSV9IRENQX1NIQV9EQVRBOworCQlkYXRhID0gcmVnX3ZhbDsKKwkJcmMgPSBoZG1pX2hk Y3Bfc2NtX3dyKGhkY3BfY3RybCwgJnJlZywgJmRhdGEsIDEpOworCisJCWlmIChyYykKKwkJCXJl dHVybiByYzsKKwl9CisKKwloZGNwX2N0cmwtPmtzdl9maWZvX3dfaW5kZXggKz0ga3N2X2J5dGVz OworCisJLyoKKwkgKnJldHVybiAtRUFHQUlOIHRvIG5vdGlmeSBjYWxsZXIgdG8gd2FpdCBmb3Ig Q09NUF9ET05FIG9yIEJMT0NLX0RPTkUKKwkgKi8KKwlyZXR1cm4gLUVBR0FJTjsKK30KKworLyog d3JpdGUga3N2IGZpZm8gaW50byBIRENQIGVuZ2luZSAqLworc3RhdGljIGludCBoZG1pX2hkY3Bf YXV0aF9wYXJ0Ml93cml0ZV9rc3ZfZmlmbygKKwlzdHJ1Y3QgaGRtaV9oZGNwX2N0cmwgKmhkY3Bf Y3RybCkKK3sKKwlpbnQgcmM7CisJdTMyIHRpbWVvdXRfY291bnQ7CisKKwloZGNwX2N0cmwtPmtz dl9maWZvX3dfaW5kZXggPSAwOworCXRpbWVvdXRfY291bnQgPSAxMDA7CisJZG8geworCQlyYyA9 IGhkbWlfaGRjcF93cml0ZV9rc3ZfZmlmbyhoZGNwX2N0cmwpOworCQlpZiAoIXJjKQorCQkJYnJl YWs7CisKKwkJaWYgKHJjICE9IC1FQUdBSU4pCisJCQlyZXR1cm4gcmM7CisKKwkJdGltZW91dF9j b3VudC0tOworCQlpZiAoIXRpbWVvdXRfY291bnQpIHsKKwkJCXByX2VycigiJXM6IFdyaXRlIEtT ViBmaWZvIHRpbWVkb3V0IiwgX19mdW5jX18pOworCQkJcmV0dXJuIC1FVElNRURPVVQ7CisJCX0K KworCQlyYyA9IGhkbWlfaGRjcF9tc2xlZXAoaGRjcF9jdHJsLCAyMCwgQVVUSF9BQk9SVF9FVik7 CisJCWlmIChyYykKKwkJCXJldHVybiByYzsKKwl9IHdoaWxlICgxKTsKKworCXJldHVybiAwOwor fQorCitzdGF0aWMgaW50IGhkbWlfaGRjcF9hdXRoX3BhcnQyX2NoZWNrX3ZfbWF0Y2goc3RydWN0 IGhkbWlfaGRjcF9jdHJsICpoZGNwX2N0cmwpCit7CisJaW50IHJjID0gMDsKKwlzdHJ1Y3QgaGRt aSAqaGRtaSA9IGhkY3BfY3RybC0+aGRtaTsKKwl1MzIgbGluazBfc3RhdHVzOworCXUzMiB0aW1l b3V0X2NvdW50ID0gMTAwOworCisJZG8geworCQlsaW5rMF9zdGF0dXMgPSBoZG1pX3JlYWQoaGRt aSwgUkVHX0hETUlfSERDUF9MSU5LMF9TVEFUVVMpOworCQlpZiAobGluazBfc3RhdHVzICYgSERN SV9IRENQX0xJTkswX1NUQVRVU19WX01BVENIRVMpCisJCQlicmVhazsKKworCQl0aW1lb3V0X2Nv dW50LS07CisJCWlmICghdGltZW91dF9jb3VudCkgeworCQkJCXByX2VycigiJXM6IEhEQ1AgViBN YXRjaCB0aW1lZG91dCIsIF9fZnVuY19fKTsKKwkJCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwkJfQor CisJCXJjID0gaGRtaV9oZGNwX21zbGVlcChoZGNwX2N0cmwsIDIwLCBBVVRIX0FCT1JUX0VWKTsK KwkJaWYgKHJjKQorCQkJcmV0dXJuIHJjOworCX0gd2hpbGUgKDEpOworCisJcmV0dXJuIDA7Cit9 CisKK3N0YXRpYyB2b2lkIGhkbWlfaGRjcF9hdXRoX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3 b3JrKQoreworCXN0cnVjdCBoZG1pX2hkY3BfY3RybCAqaGRjcF9jdHJsID0gY29udGFpbmVyX29m KHdvcmssCisJCXN0cnVjdCBoZG1pX2hkY3BfY3RybCwgaGRjcF9hdXRoX3dvcmspOworCWludCBy YzsKKworCXJjID0gaGRtaV9oZGNwX2F1dGhfcHJlcGFyZShoZGNwX2N0cmwpOworCWlmIChyYykg eworCQlwcl9lcnIoIiVzOiBhdXRoIHByZXBhcmUgZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywgcmMp OworCQlnb3RvIGVuZDsKKwl9CisKKwkvKiBIRENQIFBhcnRJICovCisJcmMgPSBoZG1pX2hkY3Bf YXV0aF9wYXJ0MV9rZXlfZXhjaGFuZ2UoaGRjcF9jdHJsKTsKKwlpZiAocmMpIHsKKwkJcHJfZXJy KCIlczoga2V5IGV4Y2hhbmdlIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sIHJjKTsKKwkJZ290byBl bmQ7CisJfQorCisJcmMgPSBoZG1pX2hkY3BfYXV0aF9wYXJ0MV9yZWN2X3IwKGhkY3BfY3RybCk7 CisJaWYgKHJjKSB7CisJCXByX2VycigiJXM6IHJlY2VpdmUgcjAgZmFpbGVkICVkXG4iLCBfX2Z1 bmNfXywgcmMpOworCQlnb3RvIGVuZDsKKwl9CisKKwlyYyA9IGhkbWlfaGRjcF9hdXRoX3BhcnQx X3ZlcmlmeV9yMChoZGNwX2N0cmwpOworCWlmIChyYykgeworCQlwcl9lcnIoIiVzOiB2ZXJpZnkg cjAgZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywgcmMpOworCQlnb3RvIGVuZDsKKwl9CisJcHJfaW5m bygiJXM6IEF1dGhlbnRpY2F0aW9uIFBhcnQgSSBzdWNjZXNzZnVsXG4iLCBfX2Z1bmNfXyk7CisJ aWYgKGhkY3BfY3RybC0+ZHNfdHlwZSA9PSBEU19SRUNFSVZFUikKKwkJZ290byBlbmQ7CisKKwkv KiBIRENQIFBhcnRJSSAqLworCXJjID0gaGRtaV9oZGNwX2F1dGhfcGFydDJfd2FpdF9rc3ZfZmlm b19yZWFkeShoZGNwX2N0cmwpOworCWlmIChyYykgeworCQlwcl9lcnIoIiVzOiB3YWl0IGtzdiBm aWZvIHJlYWR5IGZhaWxlZCAlZFxuIiwgX19mdW5jX18sIHJjKTsKKwkJZ290byBlbmQ7CisJfQor CisJcmMgPSBoZG1pX2hkY3BfYXV0aF9wYXJ0Ml9yZWN2X2tzdl9maWZvKGhkY3BfY3RybCk7CisJ aWYgKHJjKSB7CisJCXByX2VycigiJXM6IHJlY3Yga3N2IGZpZm8gZmFpbGVkICVkXG4iLCBfX2Z1 bmNfXywgcmMpOworCQlnb3RvIGVuZDsKKwl9CisKKwlyYyA9IGhkbWlfaGRjcF9hdXRoX3BhcnQy X3dyaXRlX2tzdl9maWZvKGhkY3BfY3RybCk7CisJaWYgKHJjKSB7CisJCXByX2VycigiJXM6IHdy aXRlIGtzdiBmaWZvIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sIHJjKTsKKwkJZ290byBlbmQ7CisJ fQorCisJcmMgPSBoZG1pX2hkY3BfYXV0aF9wYXJ0Ml9jaGVja192X21hdGNoKGhkY3BfY3RybCk7 CisJaWYgKHJjKQorCQlwcl9lcnIoIiVzOiBjaGVjayB2IG1hdGNoIGZhaWxlZCAlZFxuIiwgX19m dW5jX18sIHJjKTsKKworZW5kOgorCWlmIChyYyA9PSAtRUNBTkNFTEVEKSB7CisJCXByX2luZm8o IiVzOiBoZGNwIGF1dGhlbnRpY2F0aW9uIGNhbmNlbGVkXG4iLCBfX2Z1bmNfXyk7CisJfSBlbHNl IGlmIChyYyA9PSAtRU5PVFNVUFApIHsKKwkJcHJfaW5mbygiJXM6IGhkY3AgaXMgbm90IHN1cHBv cnRlZFxuIiwgX19mdW5jX18pOworCX0gZWxzZSBpZiAocmMpIHsKKwkJcHJfZXJyKCIlczogaGRj cCBhdXRoZW50aWNhdGlvbiBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJaGRtaV9oZGNwX2F1dGhf ZmFpbChoZGNwX2N0cmwpOworCX0gZWxzZSB7CisJCWhkbWlfaGRjcF9hdXRoX2RvbmUoaGRjcF9j dHJsKTsKKwl9Cit9CisKK3ZvaWQgaGRtaV9oZGNwX29uKHN0cnVjdCBoZG1pX2hkY3BfY3RybCAq aGRjcF9jdHJsKQoreworCXN0cnVjdCBoZG1pICpoZG1pID0gaGRjcF9jdHJsLT5oZG1pOworCXUz MiByZWdfdmFsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoKEhEQ1BfU1RBVEVfSU5B Q1RJVkUgIT0gaGRjcF9jdHJsLT5oZGNwX3N0YXRlKSB8fAorCQkoSERDUF9TVEFURV9OT19BS1NW ID09IGhkY3BfY3RybC0+aGRjcF9zdGF0ZSkpIHsKKwkJREJHKCJzdGlsbCBhY3RpdmUgb3IgYWN0 aXZhdGluZyBvciBubyBhc2t2LiByZXR1cm5pbmciKTsKKwkJcmV0dXJuOworCX0KKworCS8qIGNs ZWFyIEhETUkgRW5jcnlwdCAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZoZG1pLT5yZWdfbG9jaywg ZmxhZ3MpOworCXJlZ192YWwgPSBoZG1pX3JlYWQoaGRtaSwgUkVHX0hETUlfQ1RSTCk7CisJcmVn X3ZhbCAmPSB+SERNSV9DVFJMX0VOQ1JZUFRFRDsKKwloZG1pX3dyaXRlKGhkbWksIFJFR19IRE1J X0NUUkwsIHJlZ192YWwpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhkbWktPnJlZ19sb2Nr LCBmbGFncyk7CisKKwloZGNwX2N0cmwtPmF1dGhfZXZlbnQgPSAwOworCWhkY3BfY3RybC0+aGRj cF9zdGF0ZSA9IEhEQ1BfU1RBVEVfQVVUSEVOVElDQVRJTkc7CisJaGRjcF9jdHJsLT5hdXRoX3Jl dHJpZXMgPSAwOworCXF1ZXVlX3dvcmsoaGRtaS0+d29ya3EsICZoZGNwX2N0cmwtPmhkY3BfYXV0 aF93b3JrKTsKK30KKwordm9pZCBoZG1pX2hkY3Bfb2ZmKHN0cnVjdCBoZG1pX2hkY3BfY3RybCAq aGRjcF9jdHJsKQoreworCXN0cnVjdCBoZG1pICpoZG1pID0gaGRjcF9jdHJsLT5oZG1pOworCXVu c2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIHJlZ192YWw7CisKKwlpZiAoKEhEQ1BfU1RBVEVfSU5B Q1RJVkUgPT0gaGRjcF9jdHJsLT5oZGNwX3N0YXRlKSB8fAorCQkoSERDUF9TVEFURV9OT19BS1NW ID09IGhkY3BfY3RybC0+aGRjcF9zdGF0ZSkpIHsKKwkJREJHKCJoZGNwIGluYWN0aXZlIG9yIG5v IGFrc3YuIHJldHVybmluZyIpOworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBEaXNhYmxlIEhQ RCBjaXJjdWl0cnkuCisJICogVGhpcyBpcyBuZWVkZWQgdG8gcmVzZXQgdGhlIEhEQ1AgY2lwaGVy IGVuZ2luZSBzbyB0aGF0IHdoZW4gd2UKKwkgKiBhdHRlbXB0IGEgcmUtYXV0aGVudGljYXRpb24s IEhXIHdvdWxkIGNsZWFyIHRoZSBBTjBfUkVBRFkgYW5kCisJICogQU4xX1JFQURZIGJpdHMgaW4g SERNSV9IRENQX0xJTkswX1NUQVRVUyByZWdpc3RlcgorCSAqLworCXNwaW5fbG9ja19pcnFzYXZl KCZoZG1pLT5yZWdfbG9jaywgZmxhZ3MpOworCXJlZ192YWwgPSBoZG1pX3JlYWQoaGRtaSwgUkVH X0hETUlfSFBEX0NUUkwpOworCXJlZ192YWwgJj0gfkhETUlfSFBEX0NUUkxfRU5BQkxFOworCWhk bWlfd3JpdGUoaGRtaSwgUkVHX0hETUlfSFBEX0NUUkwsIHJlZ192YWwpOworCisJLyoKKwkgKiBE aXNhYmxlIEhEQ1AgaW50ZXJydXB0cy4KKwkgKiBBbHNvLCBuZWVkIHRvIHNldCB0aGUgc3RhdGUg dG8gaW5hY3RpdmUgaGVyZSBzbyB0aGF0IGFueSBvbmdvaW5nCisJICogcmVhdXRoIHdvcmtzIHdp bGwga25vdyB0aGF0IHRoZSBIRENQIHNlc3Npb24gaGFzIGJlZW4gdHVybmVkIG9mZi4KKwkgKi8K KwloZG1pX3dyaXRlKGhkbWksIFJFR19IRE1JX0hEQ1BfSU5UX0NUUkwsIDApOworCXNwaW5fdW5s b2NrX2lycXJlc3RvcmUoJmhkbWktPnJlZ19sb2NrLCBmbGFncyk7CisKKwkvKgorCSAqIENhbmNl bCBhbnkgcGVuZGluZyBhdXRoL3JlYXV0aCBhdHRlbXB0cy4KKwkgKiBJZiBvbmUgaXMgb25nb2lu ZywgdGhpcyB3aWxsIHdhaXQgZm9yIGl0IHRvIGZpbmlzaC4KKwkgKiBObyBtb3JlIHJlYXV0aGVu dGljYXRpb24gYXR0ZW1wdHMgd2lsbCBiZSBzY2hlZHVsZWQgc2luY2Ugd2UKKwkgKiBzZXQgdGhl IGN1cnJlbnQgc3RhdGUgdG8gaW5hY3RpdmUuCisJICovCisJc2V0X2JpdChBVVRIX0FCT1JUX0VW LCAmaGRjcF9jdHJsLT5hdXRoX2V2ZW50KTsKKwl3YWtlX3VwX2FsbCgmaGRjcF9jdHJsLT5hdXRo X2V2ZW50X3F1ZXVlKTsKKwljYW5jZWxfd29ya19zeW5jKCZoZGNwX2N0cmwtPmhkY3BfYXV0aF93 b3JrKTsKKwljYW5jZWxfd29ya19zeW5jKCZoZGNwX2N0cmwtPmhkY3BfcmVhdXRoX3dvcmspOwor CisJaGRtaV93cml0ZShoZG1pLCBSRUdfSERNSV9IRENQX1JFU0VULAorCQlIRE1JX0hEQ1BfUkVT RVRfTElOSzBfREVBVVRIRU5USUNBVEUpOworCisJLyogRGlzYWJsZSBlbmNyeXB0aW9uIGFuZCBk aXNhYmxlIHRoZSBIRENQIGJsb2NrICovCisJaGRtaV93cml0ZShoZG1pLCBSRUdfSERNSV9IRENQ X0NUUkwsIDApOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhkbWktPnJlZ19sb2NrLCBmbGFncyk7 CisJcmVnX3ZhbCA9IGhkbWlfcmVhZChoZG1pLCBSRUdfSERNSV9DVFJMKTsKKwlyZWdfdmFsICY9 IH5IRE1JX0NUUkxfRU5DUllQVEVEOworCWhkbWlfd3JpdGUoaGRtaSwgUkVHX0hETUlfQ1RSTCwg cmVnX3ZhbCk7CisKKwkvKiBFbmFibGUgSFBEIGNpcmN1aXRyeSAqLworCXJlZ192YWwgPSBoZG1p X3JlYWQoaGRtaSwgUkVHX0hETUlfSFBEX0NUUkwpOworCXJlZ192YWwgfD0gSERNSV9IUERfQ1RS TF9FTkFCTEU7CisJaGRtaV93cml0ZShoZG1pLCBSRUdfSERNSV9IUERfQ1RSTCwgcmVnX3ZhbCk7 CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGRtaS0+cmVnX2xvY2ssIGZsYWdzKTsKKworCWhk Y3BfY3RybC0+aGRjcF9zdGF0ZSA9IEhEQ1BfU1RBVEVfSU5BQ1RJVkU7CisKKwlEQkcoIkhEQ1A6 IE9mZiIpOworfQorCitzdHJ1Y3QgaGRtaV9oZGNwX2N0cmwgKmhkbWlfaGRjcF9pbml0KHN0cnVj dCBoZG1pICpoZG1pKQoreworCXN0cnVjdCBoZG1pX2hkY3BfY3RybCAqaGRjcF9jdHJsID0gTlVM TDsKKworCWlmICghaGRtaS0+cWZwcm9tX21taW8pIHsKKwkJcHJfZXJyKCIlczogSERDUCBpcyBu b3Qgc3VwcG9ydGVkIHdpdGhvdXQgcWZwcm9tXG4iLAorCQkJX19mdW5jX18pOworCQlyZXR1cm4g RVJSX1BUUigtRUlOVkFMKTsKKwl9CisKKwloZGNwX2N0cmwgPSBremFsbG9jKHNpemVvZigqaGRj cF9jdHJsKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFoZGNwX2N0cmwpCisJCXJldHVybiBFUlJfUFRS KC1FTk9NRU0pOworCisJSU5JVF9XT1JLKCZoZGNwX2N0cmwtPmhkY3BfYXV0aF93b3JrLCBoZG1p X2hkY3BfYXV0aF93b3JrKTsKKwlJTklUX1dPUksoJmhkY3BfY3RybC0+aGRjcF9yZWF1dGhfd29y aywgaGRtaV9oZGNwX3JlYXV0aF93b3JrKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZoZGNwX2N0 cmwtPmF1dGhfZXZlbnRfcXVldWUpOworCWhkY3BfY3RybC0+aGRtaSA9IGhkbWk7CisJaGRjcF9j dHJsLT5oZGNwX3N0YXRlID0gSERDUF9TVEFURV9JTkFDVElWRTsKKwloZGNwX2N0cmwtPmFrc3Zf dmFsaWQgPSBmYWxzZTsKKworCWlmIChxY29tX3NjbV9oZGNwX2F2YWlsYWJsZSgpKQorCQloZGNw X2N0cmwtPnR6X2hkY3AgPSB0cnVlOworCWVsc2UKKwkJaGRjcF9jdHJsLT50el9oZGNwID0gZmFs c2U7CisKKwlyZXR1cm4gaGRjcF9jdHJsOworfQorCit2b2lkIGhkbWlfaGRjcF9kZXN0cm95KHN0 cnVjdCBoZG1pICpoZG1pKQoreworCWlmIChoZG1pICYmIGhkbWktPmhkY3BfY3RybCkgeworCQlr ZnJlZShoZG1pLT5oZGNwX2N0cmwpOworCQloZG1pLT5oZGNwX2N0cmwgPSBOVUxMOworCX0KK30K LS0gClRoZSBRdWFsY29tbSBJbm5vdmF0aW9uIENlbnRlciwgSW5jLiBpcyBhIG1lbWJlciBvZiB0 aGUgQ29kZSBBdXJvcmEgRm9ydW0sCmEgTGludXggRm91bmRhdGlvbiBDb2xsYWJvcmF0aXZlIFBy b2plY3QKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmRy aS1kZXZlbCBtYWlsaW5nIGxpc3QKZHJpLWRldmVsQGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRw Oi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vZHJpLWRldmVsCg==