From mboxrd@z Thu Jan 1 00:00:00 1970 From: Dave Airlie Subject: [PATCH 5/8] drm/helper: add Displayport multi-stream helper Date: Fri, 2 May 2014 14:39:42 +1000 Message-ID: <1399005585-2396-6-git-send-email-airlied@gmail.com> References: <1399005585-2396-1-git-send-email-airlied@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by gabe.freedesktop.org (Postfix) with ESMTP id 94E326E477 for ; Thu, 1 May 2014 21:39:56 -0700 (PDT) Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s424dtRq001370 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Fri, 2 May 2014 00:39:56 -0400 Received: from dhcp-40-87.bne.redhat.com (dhcp-40-87.bne.redhat.com [10.64.40.87]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s424dm92002495 for ; Fri, 2 May 2014 00:39:54 -0400 In-Reply-To: <1399005585-2396-1-git-send-email-airlied@gmail.com> 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 List-Id: dri-devel@lists.freedesktop.org RnJvbTogRGF2ZSBBaXJsaWUgPGFpcmxpZWRAcmVkaGF0LmNvbT4KClRoaXMgaXMgdGhlIGluaXRp YWwgaW1wb3J0IG9mIHRoZSBoZWxwZXIgZm9yIGRpc3BsYXlwb3J0IG11bHRpc3RyZWFtLgoKSXQg Y29uc2lzdHMgb2YgYSB0b3BvbG9neSBtYW5hZ2VyLCBpbml0L2Rlc3Ryb3kvc2V0IG1zdCBzdGF0 ZQoKSXQgc3VwcG9ydHMgRFAgMS4yIE1TVCBzaWRlYmFuZCBtc2cgcHJvdG9jb2wgaGFuZGxlciAt IHZpYSBocGQgaXJxcwoKY29ubmVjdG9yIGRldGVjdCBhbmQgZWRpZCByZXRyaWV2YWwgaW50ZXJm YWNlLgoKSXQgc3VwcG9ydHMgaTJjIGRldmljZSBvdmVyIERQIDEuMiBzaWRlYmFuZCBtc2cgcHJv dG9jb2wgKEVESUQgcmVhZHMgb25seSkKCmJhbmR3aWR0aCBtYW5hZ2VyIEFQSSB2aWEgdmNwaSBh bGxvY2F0aW9uIGFuZCBwYXlsb2FkIHVwZGF0aW5nLAphbG9uZyB3aXRoIGEgaGVscGVyIHRvIGNo ZWNrIHRoZSBBQ1Qgc3RhdHVzLgoKT2JqZWN0czoKTVNUIHRvcG9sb2d5IG1hbmFnZXIgLSBvbmUg cGVyIHRvcGxldmVsIE1TVCBjYXBhYmxlIEdQVSBwb3J0IC0gbm90IHN1cmUgaWYgdGhpcyBzaG91 bGQgYmUgaGlnaGVyIGxldmVsIGFnYWluCk1TVCBicmFuY2ggdW5pdCAtIG9uZSBpbnN0YW5jZSBw ZXIgcGx1Z2dlZCBicmFuY2hpbmcgdW5pdCAtIG9uZSBhdCB0b3Agb2YgaGllcmFyY2h5IC0gb3Ro ZXJzIGhhbmdpbmcgZnJvbSBwb3J0cwpNU1QgcG9ydCAtIG9uZSBwb3J0IHBlciBwb3J0IHJlcG9y dGVkIGJ5IGJyYW5jaGluZyB1bml0cywgY2FuIGhhdmUgTVNUIHVuaXRzIGhhbmdpbmcgZnJvbSB0 aGVtIGFzIHdlbGwuCgpUT0RPOgpjbGVhbnVwCmxvY2tpbmcgcmV2aWV3CmZpeCBrbm93biBidWcg d2l0aCBVUCBtZXNzYWdlIHdoZW4gYW4gTVNUIGRldmljZSBpcyBjb25uZWN0ZWQgdG8gYW4gTVNU IGRldmljZS4KClNpZ25lZC1vZmYtYnk6IERhdmUgQWlybGllIDxhaXJsaWVkQHJlZGhhdC5jb20+ Ci0tLQogZHJpdmVycy9ncHUvZHJtL01ha2VmaWxlICAgICAgICAgICAgICB8ICAgIDIgKy0KIGRy aXZlcnMvZ3B1L2RybS9kcm1fZHBfbXN0X3RvcG9sb2d5LmMgfCAyMDgxICsrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKwogaW5jbHVkZS9kcm0vZHJtX2RwX21zdF9oZWxwZXIuaCAgICAg ICB8ICA0MDMgKysrKysrKwogMyBmaWxlcyBjaGFuZ2VkLCAyNDg1IGluc2VydGlvbnMoKyksIDEg ZGVsZXRpb24oLSkKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dwdS9kcm0vZHJtX2RwX21z dF90b3BvbG9neS5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgaW5jbHVkZS9kcm0vZHJtX2RwX21zdF9o ZWxwZXIuaAoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9NYWtlZmlsZSBiL2RyaXZlcnMv Z3B1L2RybS9NYWtlZmlsZQppbmRleCA0OGUzOGJhLi43MTJiNzNlIDEwMDY0NAotLS0gYS9kcml2 ZXJzL2dwdS9kcm0vTWFrZWZpbGUKKysrIGIvZHJpdmVycy9ncHUvZHJtL01ha2VmaWxlCkBAIC0y Myw3ICsyMyw3IEBAIGRybS0kKENPTkZJR19EUk1fUEFORUwpICs9IGRybV9wYW5lbC5vCiAKIGRy bS11c2IteSAgIDo9IGRybV91c2IubwogCi1kcm1fa21zX2hlbHBlci15IDo9IGRybV9jcnRjX2hl bHBlci5vIGRybV9kcF9oZWxwZXIubyBkcm1fcHJvYmVfaGVscGVyLm8KK2RybV9rbXNfaGVscGVy LXkgOj0gZHJtX2NydGNfaGVscGVyLm8gZHJtX2RwX2hlbHBlci5vIGRybV9wcm9iZV9oZWxwZXIu byBkcm1fZHBfbXN0X3RvcG9sb2d5Lm8KIGRybV9rbXNfaGVscGVyLSQoQ09ORklHX0RSTV9MT0FE X0VESURfRklSTVdBUkUpICs9IGRybV9lZGlkX2xvYWQubwogZHJtX2ttc19oZWxwZXItJChDT05G SUdfRFJNX0tNU19GQl9IRUxQRVIpICs9IGRybV9mYl9oZWxwZXIubwogZHJtX2ttc19oZWxwZXIt JChDT05GSUdfRFJNX0tNU19DTUFfSEVMUEVSKSArPSBkcm1fZmJfY21hX2hlbHBlci5vCmRpZmYg LS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2RwX21zdF90b3BvbG9neS5jIGIvZHJpdmVycy9n cHUvZHJtL2RybV9kcF9tc3RfdG9wb2xvZ3kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw MDAwMDAwLi5jNmEwODgxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9k cF9tc3RfdG9wb2xvZ3kuYwpAQCAtMCwwICsxLDIwODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkg MjAxNCBSZWQgSGF0CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlz dHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCisgKiBkb2N1bWVudGF0aW9u IGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQg dGhhdAorICogdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMg YW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodAorICogbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Np b24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZAorICogdGhh dCB0aGUgbmFtZSBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm90IGJlIHVzZWQgaW4gYWR2ZXJ0 aXNpbmcgb3IKKyAqIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUg c29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywKKyAqIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4g IFRoZSBjb3B5cmlnaHQgaG9sZGVycyBtYWtlIG5vIHJlcHJlc2VudGF0aW9ucworICogYWJvdXQg dGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQgaXMg cHJvdmlkZWQgImFzCisgKiBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHku CisgKgorICogVEhFIENPUFlSSUdIVCBIT0xERVJTIERJU0NMQUlNIEFMTCBXQVJSQU5USUVTIFdJ VEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCisgKiBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FS UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCisgKiBFVkVOVCBT SEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5E SVJFQ1QgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09F VkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLAorICogREFUQSBPUiBQUk9GSVRTLCBXSEVU SEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9S VElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVT RSBPUiBQRVJGT1JNQU5DRQorICogT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSA8 bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51 eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hl ZC5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGRybS9kcm1fZHBfbXN0X2hl bHBlci5oPgorI2luY2x1ZGUgPGRybS9kcm1QLmg+CisKKyNpbmNsdWRlIDxkcm0vZHJtX2ZpeGVk Lmg+CisKK3N0YXRpYyBpbnQgdGVzdF9jYWxjX3Bibl9tb2RlKHZvaWQpOworCitzdGF0aWMgdm9p ZCBkcm1fZHBfcHV0X3BvcnQoc3RydWN0IGRybV9kcF9tc3RfcG9ydCAqcG9ydCk7CisKK3N0YXRp YyB2b2lkIGRybV9kcF9lbmNvZGVfc2lkZWJhbmRfcmVxKHN0cnVjdCBkcm1fZHBfc2lkZWJhbmRf bXNnX3JlcV9ib2R5ICpyZXEsCisJCQkJICAgICAgIHN0cnVjdCBkcm1fZHBfc2lkZWJhbmRfbXNn X3R4ICpyYXcpOworc3RhdGljIHZvaWQgZHJtX2RwX3F1ZXVlX2Rvd25fdHgoc3RydWN0IGRybV9k cF9tc3RfdG9wb2xvZ3lfbWdyICptZ3IsCisJCQkJIHN0cnVjdCBkcm1fZHBfc2lkZWJhbmRfbXNn X3R4ICp0eG1zZyk7CitzdGF0aWMgaW50IGRybV9kcF9zZW5kX2VudW1fcGF0aF9yZXNvdXJjZXMo c3RydWN0IGRybV9kcF9tc3RfdG9wb2xvZ3lfbWdyICptZ3IsCisJCQkJCSAgIHN0cnVjdCBkcm1f ZHBfbXN0X2JyYW5jaCAqbXN0YiwKKwkJCQkJICAgaW50IHBvcnRfbnVtKTsKKworc3RhdGljIGlu dCBkcm1fZHBfZHBjZF93cml0ZV9wYXlsb2FkKHN0cnVjdCBkcm1fZHBfbXN0X3RvcG9sb2d5X21n ciAqbWdyLAorCQkJCSAgICAgaW50IGlkLAorCQkJCSAgICAgc3RydWN0IGRybV9kcF9wYXlsb2Fk ICpwYXlsb2FkKTsKKworI2lmIDAKK3N0YXRpYyBpbnQgZHJtX2RwX3NlbmRfZHBjZF9yZWFkKHN0 cnVjdCBkcm1fZHBfbXN0X3RvcG9sb2d5X21nciAqbWdyLAorCQkJCSBzdHJ1Y3QgZHJtX2RwX21z dF9wb3J0ICpwb3J0LAorCQkJCSBpbnQgb2Zmc2V0LCBpbnQgc2l6ZSk7CisjZW5kaWYKKworc3Rh dGljIGludCBkcm1fZHBfc2VuZF9kcGNkX3dyaXRlKHN0cnVjdCBkcm1fZHBfbXN0X3RvcG9sb2d5 X21nciAqbWdyLAorCQkJCSAgc3RydWN0IGRybV9kcF9tc3RfcG9ydCAqcG9ydCwKKwkJCQkgIGlu dCBvZmZzZXQsIGludCBzaXplLCB1OCAqYnl0ZXMpOworCitzdGF0aWMgaW50IGRybV9kcF9zZW5k X2xpbmtfYWRkcmVzcyhzdHJ1Y3QgZHJtX2RwX21zdF90b3BvbG9neV9tZ3IgKm1nciwKKwkJCQkg ICAgc3RydWN0IGRybV9kcF9tc3RfYnJhbmNoICptc3RiKTsKK3N0YXRpYyBib29sIGRybV9kcF92 YWxpZGF0ZV9ndWlkKHN0cnVjdCBkcm1fZHBfbXN0X3RvcG9sb2d5X21nciAqbWdyLAorCQkJCSB1 OCAqZ3VpZCk7CisKK3N0YXRpYyBpbnQgZHJtX2RwX21zdF93YWl0X3R4X3JlcGx5KHN0cnVjdCBk cm1fZHBfbXN0X2JyYW5jaCAqbXN0YiwKKwkJCQkgICAgc3RydWN0IGRybV9kcF9zaWRlYmFuZF9t c2dfdHggKnR4bXNnKQoreworCXN0cnVjdCBkcm1fZHBfbXN0X3RvcG9sb2d5X21nciAqbWdyID0g bXN0Yi0+bWdyOworCWludCByZXQ7CisKKwlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQobWdyLT50 eF93YWl0cSwKKwkJCQkgKHR4bXNnLT5zdGF0ZSA9PSBEUk1fRFBfU0lERUJBTkRfVFhfUlggfHwK KwkJCQkgIHR4bXNnLT5zdGF0ZSA9PSBEUk1fRFBfU0lERUJBTkRfVFhfVElNRU9VVCksCisJCQkJ ICg0ICogSFopKTsKKwlpZiAocmV0ID4gMCkgeworCQlpZiAodHhtc2ctPnN0YXRlID09IERSTV9E UF9TSURFQkFORF9UWF9USU1FT1VUKSB7CisJCQlyZXQgPSAtRUlPOworCQkJZ290byBvdXQ7CisJ CX0KKwl9IGVsc2UgeworCQlEUk1fREVCVUdfS01TKCJ0aW1lZG91dCBtc2cgc2VuZCAlcCAlZFxu IiwgdHhtc2csIHR4bXNnLT5zdGF0ZSk7CisJCS8qIHJlbW92ZSBmcm9tIHEgKi8KKwkJaWYgKHR4 bXNnLT5zdGF0ZSA9PSBEUk1fRFBfU0lERUJBTkRfVFhfUVVFVUVEIHx8CisJCSAgICB0eG1zZy0+ c3RhdGUgPT0gRFJNX0RQX1NJREVCQU5EX1RYX1NUQVJUX1NFTkQpIHsKKwkJCW11dGV4X2xvY2so Jm1nci0+bG9jayk7CisJCQlsaXN0X2RlbCgmdHhtc2ctPm5leHQpOworCQkJbXV0ZXhfdW5sb2Nr KCZtZ3ItPmxvY2spOworCQl9CisKKwkJaWYgKHR4bXNnLT5zdGF0ZSA9PSBEUk1fRFBfU0lERUJB TkRfVFhfU1RBUlRfU0VORCB8fAorCQkgICAgdHhtc2ctPnN0YXRlID09IERSTV9EUF9TSURFQkFO RF9UWF9TRU5UKSB7CisJCQlzcGluX2xvY2soJm1zdGItPnNsb3RzX2xvY2spOworCQkJbXN0Yi0+ dHhfc2xvdHNbdHhtc2ctPnNlcW5vXSA9IE5VTEw7CisJCQlzcGluX3VubG9jaygmbXN0Yi0+c2xv dHNfbG9jayk7CisJCX0KKwl9CitvdXQ6CisJcmV0dXJuIHJldDsKK30KK3N0YXRpYyBpbnQgZHJt X2RwX21zdF9pMmNfeGZlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIHN0cnVjdCBpMmNf bXNnICptc2dzLAorCQkJICAgICAgIGludCBudW0pCit7CisJc3RydWN0IGRybV9kcF9hdXggKmF1 eCA9IGFkYXB0ZXItPmFsZ29fZGF0YTsKKwlzdHJ1Y3QgZHJtX2RwX21zdF9wb3J0ICpwb3J0ID0g Y29udGFpbmVyX29mKGF1eCwgc3RydWN0IGRybV9kcF9tc3RfcG9ydCwgYXV4KTsKKwlzdHJ1Y3Qg ZHJtX2RwX21zdF9icmFuY2ggKm1zdGIgPSBwb3J0LT5wYXJlbnQ7CisJc3RydWN0IGRybV9kcF9t c3RfdG9wb2xvZ3lfbWdyICptZ3IgPSBtc3RiLT5tZ3I7CisJdW5zaWduZWQgaW50IGk7CisJYm9v bCByZWFkaW5nID0gZmFsc2U7CisJc3RydWN0IGRybV9kcF9zaWRlYmFuZF9tc2dfcmVxX2JvZHkg bXNnOworCXN0cnVjdCBkcm1fZHBfc2lkZWJhbmRfbXNnX3R4ICp0eG1zZyA9IE5VTEw7CisJaW50 IHJldDsKKwkvKiBjb25zdHJ1Y3QgaTJjIG1zZyAqLworCS8qIHNlZSBpZiBsYXN0IG1zZyBpcyBh IHJlYWQgKi8KKwlpZiAobXNnc1tudW0gLSAxXS5mbGFncyAmIEkyQ19NX1JEKQorCQlyZWFkaW5n ID0gdHJ1ZTsKKworCWlmICghcmVhZGluZykgeworCQlEUk1fREVCVUdfS01TKCJVbnN1cHBvcnRl ZCBJMkMgdHJhbnNhY3Rpb24gZm9yIE1TVCBkZXZpY2VcbiIpOworCQlyZXQgPSAtRUlPOworCQln b3RvIG91dDsKKwl9CisKKwltc2cucmVxX3R5cGUgPSBEUF9SRU1PVEVfSTJDX1JFQUQ7CisJbXNn LnUuaTJjX3JlYWQubnVtX3RyYW5zYWN0aW9ucyA9IG51bSAtIDE7CisJbXNnLnUuaTJjX3JlYWQu cG9ydF9udW1iZXIgPSBwb3J0LT5wb3J0X251bTsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtIC0gMTsg aSsrKSB7CisJCW1zZy51LmkyY19yZWFkLnRyYW5zYWN0aW9uc1tpXS5pMmNfZGV2X2lkID0gbXNn c1tpXS5hZGRyOworCQltc2cudS5pMmNfcmVhZC50cmFuc2FjdGlvbnNbaV0ubnVtX2J5dGVzID0g bXNnc1tpXS5sZW47CisJCW1lbWNweSgmbXNnLnUuaTJjX3JlYWQudHJhbnNhY3Rpb25zW2ldLmJ5 dGVzLCBtc2dzW2ldLmJ1ZiwgbXNnc1tpXS5sZW4pOworCX0KKwltc2cudS5pMmNfcmVhZC5yZWFk X2kyY19kZXZpY2VfaWQgPSBtc2dzW251bSAtIDFdLmFkZHI7CisJbXNnLnUuaTJjX3JlYWQubnVt X2J5dGVzX3JlYWQgPSBtc2dzW251bSAtIDFdLmxlbjsKKworCXR4bXNnID0ga3phbGxvYyhzaXpl b2YoKnR4bXNnKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF0eG1zZykgeworCQlyZXQgPSAtRU5PTUVN OworCQlnb3RvIG91dDsKKwl9CisKKwl0eG1zZy0+ZHN0ID0gbXN0YjsKKwlkcm1fZHBfZW5jb2Rl X3NpZGViYW5kX3JlcSgmbXNnLCB0eG1zZyk7CisKKwltdXRleF9sb2NrKCZtZ3ItPmxvY2spOwor CWRybV9kcF9xdWV1ZV9kb3duX3R4KG1nciwgdHhtc2cpOworCW11dGV4X3VubG9jaygmbWdyLT5s b2NrKTsKKworCXJldCA9IGRybV9kcF9tc3Rfd2FpdF90eF9yZXBseShtc3RiLCB0eG1zZyk7CisJ aWYgKHJldCA+IDApIHsKKworCQlpZiAodHhtc2ctPnJlcGx5LnJlcGx5X3R5cGUgPT0gMSkgeyAv KiBnb3QgYSBOQUsgYmFjayAqLworCQkJcmV0ID0gLUVJTzsKKwkJCWdvdG8gb3V0OworCQl9CisJ CWlmICh0eG1zZy0+cmVwbHkudS5yZW1vdGVfaTJjX3JlYWRfYWNrLm51bV9ieXRlcyAhPSBtc2dz W251bSAtIDFdLmxlbikgeworCQkJcmV0ID0gLUVJTzsKKwkJCWdvdG8gb3V0OworCQl9CisJCW1l bWNweShtc2dzW251bSAtIDFdLmJ1ZiwgdHhtc2ctPnJlcGx5LnUucmVtb3RlX2kyY19yZWFkX2Fj ay5ieXRlcywgbXNnc1tudW0gLSAxXS5sZW4pOworCQlyZXQgPSBudW07CisJfQorb3V0OgorCWtm cmVlKHR4bXNnKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdTMyIGRybV9kcF9tc3RfaTJj X2Z1bmN0aW9uYWxpdHkoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQoreworCXJldHVybiBJ MkNfRlVOQ19JMkMgfCBJMkNfRlVOQ19TTUJVU19FTVVMIHwKKwkgICAgICAgSTJDX0ZVTkNfU01C VVNfUkVBRF9CTE9DS19EQVRBIHwKKwkgICAgICAgSTJDX0ZVTkNfU01CVVNfQkxPQ0tfUFJPQ19D QUxMIHwKKwkgICAgICAgSTJDX0ZVTkNfMTBCSVRfQUREUjsKK30KKworc3RhdGljIGNvbnN0IHN0 cnVjdCBpMmNfYWxnb3JpdGhtIGRybV9kcF9tc3RfaTJjX2FsZ28gPSB7CisJLmZ1bmN0aW9uYWxp dHkgPSBkcm1fZHBfbXN0X2kyY19mdW5jdGlvbmFsaXR5LAorCS5tYXN0ZXJfeGZlciA9IGRybV9k cF9tc3RfaTJjX3hmZXIsCit9OworCisvKioKKyAqIGRybV9kcF9tc3RfcmVnaXN0ZXJfaTJjX2J1 cygpIC0gcmVnaXN0ZXIgYW4gSTJDIGFkYXB0ZXIgZm9yIEkyQy1vdmVyLUFVWAorICogQGF1eDog RGlzcGxheVBvcnQgQVVYIGNoYW5uZWwKKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcyBvciBh IG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAqLworc3RhdGljIGludCBkcm1fZHBf bXN0X3JlZ2lzdGVyX2kyY19idXMoc3RydWN0IGRybV9kcF9hdXggKmF1eCkKK3sKKwlhdXgtPmRk Yy5hbGdvID0gJmRybV9kcF9tc3RfaTJjX2FsZ287CisJYXV4LT5kZGMuYWxnb19kYXRhID0gYXV4 OworCWF1eC0+ZGRjLnJldHJpZXMgPSAzOworCisJYXV4LT5kZGMuY2xhc3MgPSBJMkNfQ0xBU1Nf RERDOworCWF1eC0+ZGRjLm93bmVyID0gVEhJU19NT0RVTEU7CisJYXV4LT5kZGMuZGV2LnBhcmVu dCA9IGF1eC0+ZGV2OworCWF1eC0+ZGRjLmRldi5vZl9ub2RlID0gYXV4LT5kZXYtPm9mX25vZGU7 CisKKwlzdHJsY3B5KGF1eC0+ZGRjLm5hbWUsIGF1eC0+bmFtZSA/IGF1eC0+bmFtZSA6IGRldl9u YW1lKGF1eC0+ZGV2KSwKKwkJc2l6ZW9mKGF1eC0+ZGRjLm5hbWUpKTsKKworCXJldHVybiBpMmNf YWRkX2FkYXB0ZXIoJmF1eC0+ZGRjKTsKK30KKworLyoqCisgKiBkcm1fZHBfbXN0X3VucmVnaXN0 ZXJfaTJjX2J1cygpIC0gdW5yZWdpc3RlciBhbiBJMkMtb3Zlci1BVVggYWRhcHRlcgorICogQGF1 eDogRGlzcGxheVBvcnQgQVVYIGNoYW5uZWwKKyAqLwordm9pZCBkcm1fZHBfbXN0X3VucmVnaXN0 ZXJfaTJjX2J1cyhzdHJ1Y3QgZHJtX2RwX2F1eCAqYXV4KQoreworCWkyY19kZWxfYWRhcHRlcigm YXV4LT5kZGMpOworfQorCitzdGF0aWMgc3RydWN0IGRybV9kcF9tc3RfYnJhbmNoICpkcm1fZHBf YWRkX21zdF9icmFuY2hfZGV2aWNlKHU4IGxjdCwgdTggKnJhZCkKK3sKKwlzdHJ1Y3QgZHJtX2Rw X21zdF9icmFuY2ggKm1zdGI7CisKKwltc3RiID0ga3phbGxvYyhzaXplb2YoKm1zdGIpLCBHRlBf S0VSTkVMKTsKKwlpZiAoIW1zdGIpCisJCXJldHVybiBOVUxMOworCisJbXN0Yi0+bGN0ID0gbGN0 OworCWlmIChsY3QgPiAxKQorCQltZW1jcHkobXN0Yi0+cmFkLCByYWQsIGxjdCAvIDIpOworCUlO SVRfTElTVF9IRUFEKCZtc3RiLT5wb3J0cyk7CisJc3Bpbl9sb2NrX2luaXQoJm1zdGItPnNsb3Rz X2xvY2spOworCWtyZWZfaW5pdCgmbXN0Yi0+a3JlZik7CisJcmV0dXJuIG1zdGI7Cit9CisKK3N0 YXRpYyB2b2lkIGRybV9kcF9kZXN0cm95X21zdF9icmFuY2hfZGV2aWNlKHN0cnVjdCBrcmVmICpr cmVmKQoreworCXN0cnVjdCBkcm1fZHBfbXN0X2JyYW5jaCAqbXN0YiA9IGNvbnRhaW5lcl9vZihr cmVmLCBzdHJ1Y3QgZHJtX2RwX21zdF9icmFuY2gsIGtyZWYpOworCXN0cnVjdCBkcm1fZHBfbXN0 X3BvcnQgKnBvcnQsICp0bXA7CisJYm9vbCB3YWtlX3R4ID0gZmFsc2U7CisJLyogZGVzdHJveSBh bGwgcG9ydHMgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocG9ydCwgdG1wLCAmbXN0Yi0+ cG9ydHMsIG5leHQpIHsKKwkJZHJtX2RwX3B1dF9wb3J0KHBvcnQpOworCX0KKworCS8qIGRyb3Ag YW55IHR4IHNsb3RzIG1zZyAqLworCXNwaW5fbG9jaygmbXN0Yi0+c2xvdHNfbG9jayk7CisJaWYg KG1zdGItPnR4X3Nsb3RzWzBdKSB7CisJCW1zdGItPnR4X3Nsb3RzWzBdLT5zdGF0ZSA9IERSTV9E UF9TSURFQkFORF9UWF9USU1FT1VUOworCQltc3RiLT50eF9zbG90c1swXSA9IE5VTEw7CisJCXdh a2VfdHggPSB0cnVlOworCX0KKwlpZiAobXN0Yi0+dHhfc2xvdHNbMV0pIHsKKwkJbXN0Yi0+dHhf c2xvdHNbMV0tPnN0YXRlID0gRFJNX0RQX1NJREVCQU5EX1RYX1RJTUVPVVQ7CisJCW1zdGItPnR4 X3Nsb3RzWzFdID0gTlVMTDsKKwkJd2FrZV90eCA9IHRydWU7CisJfQorCXNwaW5fdW5sb2NrKCZt c3RiLT5zbG90c19sb2NrKTsKKworCWlmICh3YWtlX3R4KQorCQl3YWtlX3VwKCZtc3RiLT5tZ3It PnR4X3dhaXRxKTsKKwlrZnJlZShtc3RiKTsKK30KKworc3RhdGljIHZvaWQgZHJtX2RwX3B1dF9t c3RfYnJhbmNoX2RldmljZShzdHJ1Y3QgZHJtX2RwX21zdF9icmFuY2ggKm1zdGIpCit7CisJa3Jl Zl9wdXQoJm1zdGItPmtyZWYsIGRybV9kcF9kZXN0cm95X21zdF9icmFuY2hfZGV2aWNlKTsKK30K Kworc3RhdGljIGludCBkcm1fZHBfbXN0X2Fzc2lnbl9wYXlsb2FkX2lkKHN0cnVjdCBkcm1fZHBf bXN0X3RvcG9sb2d5X21nciAqbWdyLCBpbnQgZm9yY2UpCit7CisJaW50IHJldDsKKworCWlmIChm b3JjZSA9PSAtMSkgeworCQlyZXQgPSBmaW5kX2ZpcnN0X3plcm9fYml0KCZtZ3ItPnBheWxvYWRf bWFzaywgRFBfTUFYX1BBWUxPQUQpOworCQlpZiAocmV0ID4gbWdyLT5tYXhfcGF5bG9hZHMpIHsK KwkJCURSTV9ERUJVR19LTVMoIm91dCBvZiBwYXlsb2FkIGlkcyAlZFxuIiwgcmV0KTsKKwkJCXJl dHVybiAtRUlOVkFMOworCQl9CisJfSBlbHNlCisJCXJldCA9IGZvcmNlOworCisJc2V0X2JpdChy ZXQsICZtZ3ItPnBheWxvYWRfbWFzayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQg ZHJtX2RwX21zdF9wdXRfcGF5bG9hZF9pZChzdHJ1Y3QgZHJtX2RwX21zdF90b3BvbG9neV9tZ3Ig Km1nciwKKwkJCQkgICAgICBpbnQgaWQpCit7CisJY2xlYXJfYml0KGlkLCAmbWdyLT5wYXlsb2Fk X21hc2spOworCW1nci0+cHJvcG9zZWRfdmNwaXNbaWRdID0gTlVMTDsKK30KKworc3RhdGljIHZv aWQgZHJtX2RwX2Rlc3Ryb3lfcG9ydChzdHJ1Y3Qga3JlZiAqa3JlZikKK3sKKwlzdHJ1Y3QgZHJt X2RwX21zdF9wb3J0ICpwb3J0ID0gY29udGFpbmVyX29mKGtyZWYsIHN0cnVjdCBkcm1fZHBfbXN0 X3BvcnQsIGtyZWYpOworCisJaWYgKHBvcnQtPmNvbm5lY3RvcikKKwkJKCpwb3J0LT5wYXJlbnQt Pm1nci0+Y2JzLT5kZXN0cm95X2Nvbm5lY3RvcikocG9ydC0+cGFyZW50LT5tZ3IsIHBvcnQtPmNv bm5lY3Rvcik7CisJZHJtX2RwX21zdF91bnJlZ2lzdGVyX2kyY19idXMoJnBvcnQtPmF1eCk7CisJ aWYgKHBvcnQtPm1zdGIpCisJCWRybV9kcF9wdXRfbXN0X2JyYW5jaF9kZXZpY2UocG9ydC0+bXN0 Yik7CisJbGlzdF9kZWwoJnBvcnQtPm5leHQpOworCWtmcmVlKHBvcnQpOworfQorCitzdGF0aWMg dm9pZCBkcm1fZHBfcHV0X3BvcnQoc3RydWN0IGRybV9kcF9tc3RfcG9ydCAqcG9ydCkKK3sKKwlr cmVmX3B1dCgmcG9ydC0+a3JlZiwgZHJtX2RwX2Rlc3Ryb3lfcG9ydCk7Cit9CisKK3N0YXRpYyBz dHJ1Y3QgZHJtX2RwX21zdF9wb3J0ICpkcm1fZHBfZ2V0X3BvcnQoc3RydWN0IGRybV9kcF9tc3Rf YnJhbmNoICptc3RiLCB1OCBwb3J0X251bSkKK3sKKwlzdHJ1Y3QgZHJtX2RwX21zdF9wb3J0ICpw b3J0OworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShwb3J0LCAmbXN0Yi0+cG9ydHMsIG5leHQpIHsK KwkJaWYgKHBvcnQtPnBvcnRfbnVtID09IHBvcnRfbnVtKSB7CisJCQlrcmVmX2dldCgmcG9ydC0+ a3JlZik7CisJCQlyZXR1cm4gcG9ydDsKKwkJfQorCX0KKworCXJldHVybiBOVUxMOworfQorCitz dGF0aWMgdm9pZCBkcm1fZHBfcG9ydF90ZWFyZG93bl9wZHQoc3RydWN0IGRybV9kcF9tc3RfcG9y dCAqcG9ydCwgaW50IG9sZF9wZHQpCit7CisJc3dpdGNoIChvbGRfcGR0KSB7CisJY2FzZSBEUF9Q RUVSX0RFVklDRV9EUF9MRUdBQ1lfQ09OVjoKKwljYXNlIERQX1BFRVJfREVWSUNFX1NTVF9TSU5L OgorCQkvKiByZW1vdmUgaTJjIG92ZXIgc2lkZWJhbmQgKi8KKwkJZHJtX2RwX21zdF91bnJlZ2lz dGVyX2kyY19idXMoJnBvcnQtPmF1eCk7CisJCWJyZWFrOworCWNhc2UgRFBfUEVFUl9ERVZJQ0Vf TVNUX0JSQU5DSElORzoKKwkJZHJtX2RwX3B1dF9tc3RfYnJhbmNoX2RldmljZShwb3J0LT5tc3Ri KTsKKwkJcG9ydC0+bXN0YiA9IE5VTEw7CisJCWJyZWFrOworCX0KK30KKworLyoKKyAqIGNhbGN1 bGF0ZSBhIG5ldyBSQUQgZm9yIHRoaXMgTVNUIGJyYW5jaCBkZXZpY2UKKyAqIGlmIHBhcmVudCBo YXMgYW4gTENUIG9mIDIgdGhlbiBpdCBoYXMgMSBuaWJibGUgb2YgUkFELAorICogaWYgcGFyZW50 IGhhcyBhbiBMQ1Qgb2YgMyB0aGVuIGl0IGhhcyAyIG5pYmJsZXMgb2YgUkFELAorICovCitzdGF0 aWMgdTggZHJtX2RwX2NhbGN1bGF0ZV9yYWQoc3RydWN0IGRybV9kcF9tc3RfcG9ydCAqcG9ydCwK KwkJCQkgdTggKnJhZCkKK3sKKwlpbnQgbGN0ID0gcG9ydC0+cGFyZW50LT5sY3Q7CisJaW50IHNo aWZ0ID0gNDsKKwlpbnQgaWR4ID0gbGN0IC8gMjsKKwlpZiAobGN0ID4gMSkgeworCQltZW1jcHko cmFkLCBwb3J0LT5wYXJlbnQtPnJhZCwgaWR4KTsKKwkJc2hpZnQgPSAobGN0ICUgMikgPyA0IDog MDsKKwl9IGVsc2UKKwkJcmFkWzBdID0gMDsKKworCXJhZFtpZHhdIHw9IHBvcnQtPnBvcnRfbnVt IDw8IHNoaWZ0OworCXJldHVybiBsY3QgKyAxOworfQorCitzdGF0aWMgdm9pZCBkcm1fZHBfcG9y dF9zZXR1cF9wZHQoc3RydWN0IGRybV9kcF9tc3RfcG9ydCAqcG9ydCwgdTggKmd1aWQpCit7CisJ aW50IHJldDsKKwl1OCByYWRbNl0sIGxjdDsKKworCXN3aXRjaCAocG9ydC0+cGR0KSB7CisJY2Fz ZSBEUF9QRUVSX0RFVklDRV9EUF9MRUdBQ1lfQ09OVjoKKwljYXNlIERQX1BFRVJfREVWSUNFX1NT VF9TSU5LOgorCQkvKiBhZGQgaTJjIG92ZXIgc2lkZWJhbmQgKi8KKwkJcmV0ID0gZHJtX2RwX21z dF9yZWdpc3Rlcl9pMmNfYnVzKCZwb3J0LT5hdXgpOworCQlicmVhazsKKwljYXNlIERQX1BFRVJf REVWSUNFX01TVF9CUkFOQ0hJTkc6CisJCWxjdCA9IGRybV9kcF9jYWxjdWxhdGVfcmFkKHBvcnQs IHJhZCk7CisKKwkJcG9ydC0+bXN0YiA9IGRybV9kcF9hZGRfbXN0X2JyYW5jaF9kZXZpY2UobGN0 LCByYWQpOworCQlwb3J0LT5tc3RiLT5tZ3IgPSBwb3J0LT5wYXJlbnQtPm1ncjsKKwkJcG9ydC0+ bXN0Yi0+cGFyZW50X2lzX3BvcnQgPSB0cnVlOworCQlwb3J0LT5tc3RiLT5wb3J0X3BhcmVudCA9 IHBvcnQ7CisKKwkJZHJtX2RwX3NlbmRfbGlua19hZGRyZXNzKHBvcnQtPnBhcmVudC0+bWdyLCBw b3J0LT5tc3RiKTsKKworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGRybV9kcF9hZGRf cG9ydChzdHJ1Y3QgZHJtX2RwX21zdF9icmFuY2ggKm1zdGIsCisJCQkgICAgc3RydWN0IGRldmlj ZSAqZGV2LAorCQkJICAgIHN0cnVjdCBkcm1fZHBfbGlua19hZGRyX3JlcGx5X3BvcnQgKnBvcnRf bXNnKQoreworCXN0cnVjdCBkcm1fZHBfbXN0X3BvcnQgKnBvcnQ7CisJaW50IHJldDsKKwlwb3J0 ID0ga3phbGxvYyhzaXplb2YoKnBvcnQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBvcnQpCisJCXJl dHVybjsKKworCWtyZWZfaW5pdCgmcG9ydC0+a3JlZik7CisJcG9ydC0+cGFyZW50ID0gbXN0YjsK Kwlwb3J0LT5wb3J0X251bSA9IHBvcnRfbXNnLT5wb3J0X251bWJlcjsKKwlwb3J0LT5wZHQgPSBw b3J0X21zZy0+cGVlcl9kZXZpY2VfdHlwZTsKKwlwb3J0LT5pbnB1dCA9IHBvcnRfbXNnLT5pbnB1 dF9wb3J0OworCXBvcnQtPm1jcyA9IHBvcnRfbXNnLT5tY3M7CisJcG9ydC0+ZGRwcyA9IHBvcnRf bXNnLT5kZHBzOworCXBvcnQtPmxkcHMgPSBwb3J0X21zZy0+bGVnYWN5X2RldmljZV9wbHVnX3N0 YXR1czsKKwlwb3J0LT5kcGNkX3JldiA9IHBvcnRfbXNnLT5kcGNkX3JldmlzaW9uOworCW1lbWNw eShwb3J0LT5ndWlkLCBwb3J0X21zZy0+cGVlcl9ndWlkLCAxNik7CisJbGlzdF9hZGQoJnBvcnQt Pm5leHQsICZtc3RiLT5wb3J0cyk7CisKKwlwb3J0LT5hdXgubmFtZSA9ICJEUE1TVCI7CisJcG9y dC0+YXV4LmRldiA9IGRldjsKKworCWlmIChwb3J0LT5kZHBzKSB7CisJCWlmIChwb3J0LT5kcGNk X3JldiA+PSAweDEyKSB7CisJCQlwb3J0LT5ndWlkX3ZhbGlkID0gZHJtX2RwX3ZhbGlkYXRlX2d1 aWQobXN0Yi0+bWdyLCBwb3J0LT5ndWlkKTsKKwkJCWlmICghcG9ydC0+Z3VpZF92YWxpZCkgewor CQkJCXJldCA9IGRybV9kcF9zZW5kX2RwY2Rfd3JpdGUobXN0Yi0+bWdyLAorCQkJCQkJCSAgICAg cG9ydCwKKwkJCQkJCQkgICAgIERQX0dVSUQsCisJCQkJCQkJICAgICAxNiwgcG9ydC0+Z3VpZCk7 CisJCQkJcG9ydC0+Z3VpZF92YWxpZCA9IHRydWU7CisJCQl9CisJCX0KKwl9CisJaWYgKCFwb3J0 LT5pbnB1dCAmJiBwb3J0LT5kZHBzKQorCQlkcm1fZHBfcG9ydF9zZXR1cF9wZHQocG9ydCwgcG9y dF9tc2ctPnBlZXJfZ3VpZCk7CisKKwlpZiAoIXBvcnQtPmlucHV0ICYmIHBvcnQtPmRkcHMpCisJ CWRybV9kcF9zZW5kX2VudW1fcGF0aF9yZXNvdXJjZXMobXN0Yi0+bWdyLCBtc3RiLAorCQkJCQkJ cG9ydC0+cG9ydF9udW0pOworCisJaWYgKCFwb3J0LT5pbnB1dCkKKwkJcG9ydC0+Y29ubmVjdG9y ID0gKCptc3RiLT5tZ3ItPmNicy0+YWRkX2Nvbm5lY3RvcikobXN0Yi0+bWdyLCBwb3J0KTsKKwor fQorCitzdGF0aWMgdm9pZCBkcm1fZHBfdXBkYXRlX3BvcnQoc3RydWN0IGRybV9kcF9tc3RfYnJh bmNoICptc3RiLAorCQkJICAgICAgIHN0cnVjdCBkcm1fZHBfY29ubmVjdGlvbl9zdGF0dXNfbm90 aWZ5ICpjb25uX3N0YXQpCit7CisJc3RydWN0IGRybV9kcF9tc3RfcG9ydCAqcG9ydDsKKwlpbnQg b2xkX3BkdDsKKwlwb3J0ID0gZHJtX2RwX2dldF9wb3J0KG1zdGIsIGNvbm5fc3RhdC0+cG9ydF9u dW1iZXIpOworCWlmICghcG9ydCkKKwkJcmV0dXJuOworCisJb2xkX3BkdCA9IHBvcnQtPnBkdDsK Kwlwb3J0LT5wZHQgPSBjb25uX3N0YXQtPnBlZXJfZGV2aWNlX3R5cGU7CisJcG9ydC0+bWNzID0g Y29ubl9zdGF0LT5tZXNzYWdlX2NhcGFiaWxpdHlfc3RhdHVzOworCXBvcnQtPmxkcHMgPSBjb25u X3N0YXQtPmxlZ2FjeV9kZXZpY2VfcGx1Z19zdGF0dXM7CisJcG9ydC0+ZGRwcyA9IGNvbm5fc3Rh dC0+ZGlzcGxheXBvcnRfZGV2aWNlX3BsdWdfc3RhdHVzOworCisJaWYgKG9sZF9wZHQgIT0gcG9y dC0+cGR0KSB7CisJCWRybV9kcF9wb3J0X3RlYXJkb3duX3BkdChwb3J0LCBvbGRfcGR0KTsKKwkJ ZHJtX2RwX3BvcnRfc2V0dXBfcGR0KHBvcnQsIGNvbm5fc3RhdC0+Z3VpZCk7CisJfQorCisJaWYg KCFwb3J0LT5pbnB1dCAmJiBwb3J0LT5kZHBzKQorCQlkcm1fZHBfc2VuZF9lbnVtX3BhdGhfcmVz b3VyY2VzKG1zdGItPm1nciwgbXN0YiwKKwkJCQkJCXBvcnQtPnBvcnRfbnVtKTsKKworCWRybV9k cF9wdXRfcG9ydChwb3J0KTsKK30KKworc3RhdGljIHZvaWQgZHJtX2RwX3VwZGF0ZV9wb3J0X3Bi bihzdHJ1Y3QgZHJtX2RwX21zdF9icmFuY2ggKm1zdGIsCisJCQkJICAgdWludDhfdCBwb3J0X251 bWJlciwKKwkJCQkgICB1aW50MTZfdCBhdmFpbGFibGVfcGJuKQoreworCXN0cnVjdCBkcm1fZHBf bXN0X3BvcnQgKnBvcnQ7CisKKwlwb3J0ID0gZHJtX2RwX2dldF9wb3J0KG1zdGIsIHBvcnRfbnVt YmVyKTsKKwlpZiAoIXBvcnQpCisJCXJldHVybjsKKworCXBvcnQtPmF2YWlsYWJsZV9wYm4gPSBh dmFpbGFibGVfcGJuOworCWRybV9kcF9wdXRfcG9ydChwb3J0KTsKK30KKworc3RhdGljIHN0cnVj dCBkcm1fZHBfbXN0X2JyYW5jaCAqZHJtX2RwX2dldF9tc3RfYnJhbmNoX2RldmljZShzdHJ1Y3Qg ZHJtX2RwX21zdF90b3BvbG9neV9tZ3IgKm1nciwKKwkJCQkJCQkgICAgICAgdTggbGN0LCB1OCAq cmFkKQoreworCXN0cnVjdCBkcm1fZHBfbXN0X2JyYW5jaCAqbXN0YjsKKwlzdHJ1Y3QgZHJtX2Rw X21zdF9wb3J0ICpwb3J0OworCWludCBpOworCS8qIGZpbmQgdGhlIHBvcnQgYnkgaXRlcmF0aW5n IGRvd24gKi8KKwltc3RiID0gbWdyLT5tc3RfcHJpbWFyeTsKKworCWZvciAoaSA9IDA7IGkgPCBs Y3QgLSAxOyBpKyspIHsKKwkJaW50IHNoaWZ0ID0gKGkgJSAyKSA/IDAgOiA0OworCQlpbnQgcG9y dF9udW0gPSByYWRbaSAvIDJdID4+IHNoaWZ0OworCisJCWxpc3RfZm9yX2VhY2hfZW50cnkocG9y dCwgJm1zdGItPnBvcnRzLCBuZXh0KSB7CisJCQlpZiAocG9ydC0+cG9ydF9udW0gPT0gcG9ydF9u dW0pIHsKKwkJCQlpZiAoIXBvcnQtPm1zdGIpIHsKKwkJCQkJRFJNX0VSUk9SKCJmYWlsZWQgdG8g bG9va3VwIE1TVEIgd2l0aCBsY3QgJWQsIHJhZCAlMDJ4XG4iLCBsY3QsIHJhZFswXSk7CisJCQkJ CXJldHVybiBOVUxMOworCQkJCX0KKworCQkJCW1zdGIgPSBwb3J0LT5tc3RiOworCQkJCWJyZWFr OworCQkJfQorCQl9CisJfQorCWtyZWZfZ2V0KCZtc3RiLT5rcmVmKTsKKwlyZXR1cm4gbXN0YjsK K30KKworc3RhdGljIHU4IGRybV9kcF9tc2dfaGVhZGVyX2NyYzQoY29uc3QgdWludDhfdCAqZGF0 YSwgc2l6ZV90IG51bV9uaWJibGVzKQoreworCXU4IGJpdG1hc2sgPSAweDgwOworCXU4IGJpdHNo aWZ0ID0gNzsKKwl1OCBhcnJheV9pbmRleCA9IDA7CisJaW50IG51bWJlcl9vZl9iaXRzID0gbnVt X25pYmJsZXMgKiA0OworCXU4IHJlbWFpbmRlciA9IDA7CisKKwl3aGlsZSAobnVtYmVyX29mX2Jp dHMgIT0gMCkgeworCQludW1iZXJfb2ZfYml0cy0tOworCQlyZW1haW5kZXIgPDw9IDE7CisJCXJl bWFpbmRlciB8PSAoZGF0YVthcnJheV9pbmRleF0gJiBiaXRtYXNrKSA+PiBiaXRzaGlmdDsKKwkJ Yml0bWFzayA+Pj0gMTsKKwkJYml0c2hpZnQtLTsKKwkJaWYgKGJpdG1hc2sgPT0gMCkgeworCQkJ Yml0bWFzayA9IDB4ODA7CisJCQliaXRzaGlmdCA9IDc7CisJCQlhcnJheV9pbmRleCsrOworCQl9 CisJCWlmICgocmVtYWluZGVyICYgMHgxMCkgPT0gMHgxMCkKKwkJCXJlbWFpbmRlciBePSAweDEz OworCX0KKworCW51bWJlcl9vZl9iaXRzID0gNDsKKwl3aGlsZSAobnVtYmVyX29mX2JpdHMgIT0g MCkgeworCQludW1iZXJfb2ZfYml0cy0tOworCQlyZW1haW5kZXIgPDw9IDE7CisJCWlmICgocmVt YWluZGVyICYgMHgxMCkgIT0gMCkKKwkJCXJlbWFpbmRlciBePSAweDEzOworCX0KKworCXJldHVy biByZW1haW5kZXI7Cit9CisKK3N0YXRpYyB1OCBkcm1fZHBfbXNnX2RhdGFfY3JjNChjb25zdCB1 aW50OF90ICpkYXRhLCB1OCBudW1iZXJfb2ZfYnl0ZXMpCit7CisJdTggYml0bWFzayA9IDB4ODA7 CisJdTggYml0c2hpZnQgPSA3OworCXU4IGFycmF5X2luZGV4ID0gMDsKKwlpbnQgbnVtYmVyX29m X2JpdHMgPSBudW1iZXJfb2ZfYnl0ZXMgKiA4OworCXUxNiByZW1haW5kZXIgPSAwOworCisJd2hp bGUgKG51bWJlcl9vZl9iaXRzICE9IDApIHsKKwkJbnVtYmVyX29mX2JpdHMtLTsKKwkJcmVtYWlu ZGVyIDw8PSAxOworCQlyZW1haW5kZXIgfD0gKGRhdGFbYXJyYXlfaW5kZXhdICYgYml0bWFzaykg Pj4gYml0c2hpZnQ7CisJCWJpdG1hc2sgPj49IDE7CisJCWJpdHNoaWZ0LS07CisJCWlmIChiaXRt YXNrID09IDApIHsKKwkJCWJpdG1hc2sgPSAweDgwOworCQkJYml0c2hpZnQgPSA3OworCQkJYXJy YXlfaW5kZXgrKzsKKwkJfQorCQlpZiAoKHJlbWFpbmRlciAmIDB4MTAwKSA9PSAweDEwMCkKKwkJ CXJlbWFpbmRlciBePSAweGQ1OworCX0KKworCW51bWJlcl9vZl9iaXRzID0gODsKKwl3aGlsZSAo bnVtYmVyX29mX2JpdHMgIT0gMCkgeworCQludW1iZXJfb2ZfYml0cy0tOworCQlyZW1haW5kZXIg PDw9IDE7CisJCWlmICgocmVtYWluZGVyICYgMHgxMDApICE9IDApCisJCQlyZW1haW5kZXIgXj0g MHhkNTsKKwl9CisKKwlyZXR1cm4gcmVtYWluZGVyICYgMHhmZjsKK30KKworc3RhdGljIGlubGlu ZSB1OCBkcm1fZHBfY2FsY19zYl9oZHJfc2l6ZShzdHJ1Y3QgZHJtX2RwX3NpZGViYW5kX21zZ19o ZHIgKmhkcikKK3sKKwl1OCBzaXplID0gMzsKKwlzaXplICs9IChoZHItPmxjdCAvIDIpOworCXJl dHVybiBzaXplOworfQorCitzdGF0aWMgdm9pZCBkcm1fZHBfZW5jb2RlX3NpZGViYW5kX21zZ19o ZHIoc3RydWN0IGRybV9kcF9zaWRlYmFuZF9tc2dfaGRyICpoZHIsCisJCQkJCSAgIHU4ICpidWYs IGludCAqbGVuKQoreworCWludCBpZHggPSAwOworCWludCBpOworCXU4IGNyYzQ7CisJYnVmW2lk eCsrXSA9ICgoaGRyLT5sY3QgJiAweGYpIDw8IDQpIHwgKGhkci0+bGNyICYgMHhmKTsKKwlmb3Ig KGkgPSAwOyBpIDwgKGhkci0+bGN0IC8gMik7IGkrKykKKwkJYnVmW2lkeCsrXSA9IGhkci0+cmFk W2ldOworCWJ1ZltpZHgrK10gPSAoaGRyLT5icm9hZGNhc3QgPDwgNykgfCAoaGRyLT5wYXRoX21z ZyA8PCA2KSB8CisJCShoZHItPm1zZ19sZW4gJiAweDNmKTsKKwlidWZbaWR4KytdID0gKGhkci0+ c29tdCA8PCA3KSB8IChoZHItPmVvbXQgPDwgNikgfCAoaGRyLT5zZXFubyA8PCA0KTsKKworCWNy YzQgPSBkcm1fZHBfbXNnX2hlYWRlcl9jcmM0KGJ1ZiwgKGlkeCAqIDIpIC0gMSk7CisJYnVmW2lk eCAtIDFdIHw9IChjcmM0ICYgMHhmKTsKKworCSpsZW4gPSBpZHg7Cit9CisKK3N0YXRpYyBib29s IGRybV9kcF9kZWNvZGVfc2lkZWJhbmRfbXNnX2hkcihzdHJ1Y3QgZHJtX2RwX3NpZGViYW5kX21z Z19oZHIgKmhkciwKKwkJCQkJICAgdTggKmJ1ZiwgaW50IGJ1ZmxlbiwgdTggKmhkcmxlbikKK3sK Kwl1OCBjcmM0OworCXU4IGxlbjsKKwlpbnQgaTsKKwl1OCBpZHg7CisJaWYgKGJ1ZlswXSA9PSAw KQorCQlyZXR1cm4gZmFsc2U7CisJbGVuID0gMzsKKwlsZW4gKz0gKChidWZbMF0gJiAweGYwKSA+ PiA0KSAvIDI7CisJaWYgKGxlbiA+IGJ1ZmxlbikKKwkJcmV0dXJuIGZhbHNlOworCWNyYzQgPSBk cm1fZHBfbXNnX2hlYWRlcl9jcmM0KGJ1ZiwgKGxlbiAqIDIpIC0gMSk7CisKKwlpZiAoKGNyYzQg JiAweGYpICE9IChidWZbbGVuIC0gMV0gJiAweGYpKSB7CisJCURSTV9ERUJVR19LTVMoImNyYzQg bWlzbWF0Y2ggMHgleCAweCV4XG4iLCBjcmM0LCBidWZbbGVuIC0gMV0pOworCQlyZXR1cm4gZmFs c2U7CisJfQorCisJaGRyLT5sY3QgPSAoYnVmWzBdICYgMHhmMCkgPj4gNDsKKwloZHItPmxjciA9 IChidWZbMF0gJiAweGYpOworCWlkeCA9IDE7CisJZm9yIChpID0gMDsgaSA8IChoZHItPmxjdCAv IDIpOyBpKyspCisJCWhkci0+cmFkW2ldID0gYnVmW2lkeCsrXTsKKwloZHItPmJyb2FkY2FzdCA9 IChidWZbaWR4XSA+PiA3KSAmIDB4MTsKKwloZHItPnBhdGhfbXNnID0gKGJ1ZltpZHhdID4+IDYp ICYgMHgxOworCWhkci0+bXNnX2xlbiA9IGJ1ZltpZHhdICYgMHgzZjsKKwlpZHgrKzsKKwloZHIt PnNvbXQgPSAoYnVmW2lkeF0gPj4gNykgJiAweDE7CisJaGRyLT5lb210ID0gKGJ1ZltpZHhdID4+ IDYpICYgMHgxOworCWhkci0+c2Vxbm8gPSAoYnVmW2lkeF0gPj4gNCkgJiAweDE7CisJaWR4Kys7 CisJKmhkcmxlbiA9IGlkeDsKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgZHJtX2Rw X2VuY29kZV9zaWRlYmFuZF9yZXEoc3RydWN0IGRybV9kcF9zaWRlYmFuZF9tc2dfcmVxX2JvZHkg KnJlcSwKKwkJCQkgICAgICAgc3RydWN0IGRybV9kcF9zaWRlYmFuZF9tc2dfdHggKnJhdykKK3sK KwlpbnQgaWR4ID0gMDsKKwlpbnQgaTsKKwl1OCAqYnVmID0gcmF3LT5tc2c7CisJYnVmW2lkeCsr XSA9IHJlcS0+cmVxX3R5cGUgJiAweDdmOworCisJc3dpdGNoIChyZXEtPnJlcV90eXBlKSB7CisJ Y2FzZSBEUF9FTlVNX1BBVEhfUkVTT1VSQ0VTOgorCQlidWZbaWR4XSA9IChyZXEtPnUucG9ydF9u dW0ucG9ydF9udW1iZXIgJiAweGYpIDw8IDQ7CisJCWlkeCsrOworCQlicmVhazsKKwljYXNlIERQ X0FMTE9DQVRFX1BBWUxPQUQ6CisJCWJ1ZltpZHhdID0gKHJlcS0+dS5hbGxvY2F0ZV9wYXlsb2Fk LnBvcnRfbnVtYmVyICYgMHhmKSA8PCA0IHwKKwkJCShyZXEtPnUuYWxsb2NhdGVfcGF5bG9hZC5u dW1iZXJfc2RwX3N0cmVhbXMgJiAweGYpOworCQlpZHgrKzsKKwkJYnVmW2lkeF0gPSAocmVxLT51 LmFsbG9jYXRlX3BheWxvYWQudmNwaSAmIDB4N2YpOworCQlpZHgrKzsKKwkJYnVmW2lkeF0gPSAo cmVxLT51LmFsbG9jYXRlX3BheWxvYWQucGJuID4+IDgpOworCQlpZHgrKzsKKwkJYnVmW2lkeF0g PSAocmVxLT51LmFsbG9jYXRlX3BheWxvYWQucGJuICYgMHhmZik7CisJCWlkeCsrOworCQlmb3Ig KGkgPSAwOyBpIDwgcmVxLT51LmFsbG9jYXRlX3BheWxvYWQubnVtYmVyX3NkcF9zdHJlYW1zIC8g MjsgaSsrKSB7CisJCQlidWZbaWR4XSA9ICgocmVxLT51LmFsbG9jYXRlX3BheWxvYWQuc2RwX3N0 cmVhbV9zaW5rW2kgKiAyXSAmIDB4ZikgPDwgNCkgfAorCQkJCShyZXEtPnUuYWxsb2NhdGVfcGF5 bG9hZC5zZHBfc3RyZWFtX3NpbmtbaSAqIDIgKyAxXSAmIDB4Zik7CisJCQlpZHgrKzsKKwkJfQor CQlpZiAocmVxLT51LmFsbG9jYXRlX3BheWxvYWQubnVtYmVyX3NkcF9zdHJlYW1zICYgMSkgewor CQkJaSA9IHJlcS0+dS5hbGxvY2F0ZV9wYXlsb2FkLm51bWJlcl9zZHBfc3RyZWFtcyAtIDE7CisJ CQlidWZbaWR4XSA9IChyZXEtPnUuYWxsb2NhdGVfcGF5bG9hZC5zZHBfc3RyZWFtX3NpbmtbaV0g JiAweGYpIDw8IDQ7CisJCQlpZHgrKzsKKwkJfQorCQlicmVhazsKKwljYXNlIERQX1FVRVJZX1BB WUxPQUQ6CisJCWJ1ZltpZHhdID0gKHJlcS0+dS5xdWVyeV9wYXlsb2FkLnBvcnRfbnVtYmVyICYg MHhmKSA8PCA0OworCQlpZHgrKzsKKwkJYnVmW2lkeF0gPSAocmVxLT51LnF1ZXJ5X3BheWxvYWQu dmNwaSAmIDB4N2YpOworCQlpZHgrKzsKKwkJYnJlYWs7CisJY2FzZSBEUF9SRU1PVEVfRFBDRF9S RUFEOgorCQlidWZbaWR4XSA9IChyZXEtPnUuZHBjZF9yZWFkLnBvcnRfbnVtYmVyICYgMHhmKSA8 PCA0OworCQlidWZbaWR4XSB8PSAoKHJlcS0+dS5kcGNkX3JlYWQuZHBjZF9hZGRyZXNzICYgMHhm MDAwMCkgPj4gMTYpICYgMHhmOworCQlpZHgrKzsKKwkJYnVmW2lkeF0gPSAocmVxLT51LmRwY2Rf cmVhZC5kcGNkX2FkZHJlc3MgJiAweGZmMDApID4+IDg7CisJCWlkeCsrOworCQlidWZbaWR4XSA9 IChyZXEtPnUuZHBjZF9yZWFkLmRwY2RfYWRkcmVzcyAmIDB4ZmYpOworCQlpZHgrKzsKKwkJYnVm W2lkeF0gPSAocmVxLT51LmRwY2RfcmVhZC5udW1fYnl0ZXMpOworCQlpZHgrKzsKKwkJYnJlYWs7 CisKKwljYXNlIERQX1JFTU9URV9EUENEX1dSSVRFOgorCQlidWZbaWR4XSA9IChyZXEtPnUuZHBj ZF93cml0ZS5wb3J0X251bWJlciAmIDB4ZikgPDwgNDsKKwkJYnVmW2lkeF0gfD0gKChyZXEtPnUu ZHBjZF93cml0ZS5kcGNkX2FkZHJlc3MgJiAweGYwMDAwKSA+PiAxNikgJiAweGY7CisJCWlkeCsr OworCQlidWZbaWR4XSA9IChyZXEtPnUuZHBjZF93cml0ZS5kcGNkX2FkZHJlc3MgJiAweGZmMDAp ID4+IDg7CisJCWlkeCsrOworCQlidWZbaWR4XSA9IChyZXEtPnUuZHBjZF93cml0ZS5kcGNkX2Fk ZHJlc3MgJiAweGZmKTsKKwkJaWR4Kys7CisJCWJ1ZltpZHhdID0gKHJlcS0+dS5kcGNkX3dyaXRl Lm51bV9ieXRlcyk7CisJCWlkeCsrOworCQltZW1jcHkoJmJ1ZltpZHhdLCByZXEtPnUuZHBjZF93 cml0ZS5ieXRlcywgcmVxLT51LmRwY2Rfd3JpdGUubnVtX2J5dGVzKTsKKwkJaWR4ICs9IHJlcS0+ dS5kcGNkX3dyaXRlLm51bV9ieXRlczsKKwkJYnJlYWs7CisJY2FzZSBEUF9SRU1PVEVfSTJDX1JF QUQ6CisJCWJ1ZltpZHhdID0gKHJlcS0+dS5pMmNfcmVhZC5wb3J0X251bWJlciAmIDB4ZikgPDwg NDsKKwkJYnVmW2lkeF0gfD0gKHJlcS0+dS5pMmNfcmVhZC5udW1fdHJhbnNhY3Rpb25zICYgMHgz KTsKKwkJaWR4Kys7CisJCWZvciAoaSA9IDA7IGkgPCAocmVxLT51LmkyY19yZWFkLm51bV90cmFu c2FjdGlvbnMgJiAweDMpOyBpKyspIHsKKwkJCWJ1ZltpZHhdID0gcmVxLT51LmkyY19yZWFkLnRy YW5zYWN0aW9uc1tpXS5pMmNfZGV2X2lkICYgMHg3ZjsKKwkJCWlkeCsrOworCQkJYnVmW2lkeF0g PSByZXEtPnUuaTJjX3JlYWQudHJhbnNhY3Rpb25zW2ldLm51bV9ieXRlczsKKwkJCWlkeCsrOwor CQkJbWVtY3B5KCZidWZbaWR4XSwgcmVxLT51LmkyY19yZWFkLnRyYW5zYWN0aW9uc1tpXS5ieXRl cywgcmVxLT51LmkyY19yZWFkLnRyYW5zYWN0aW9uc1tpXS5udW1fYnl0ZXMpOworCQkJaWR4ICs9 IHJlcS0+dS5pMmNfcmVhZC50cmFuc2FjdGlvbnNbaV0ubnVtX2J5dGVzOworCisJCQlidWZbaWR4 XSA9IChyZXEtPnUuaTJjX3JlYWQudHJhbnNhY3Rpb25zW2ldLm5vX3N0b3BfYml0ICYgMHgxKSA8 PCA1OworCQkJYnVmW2lkeF0gfD0gKHJlcS0+dS5pMmNfcmVhZC50cmFuc2FjdGlvbnNbaV0uaTJj X3RyYW5zYWN0aW9uX2RlbGF5ICYgMHhmKTsKKwkJCWlkeCsrOworCQl9CisJCWJ1ZltpZHhdID0g KHJlcS0+dS5pMmNfcmVhZC5yZWFkX2kyY19kZXZpY2VfaWQpICYgMHg3ZjsKKwkJaWR4Kys7CisJ CWJ1ZltpZHhdID0gKHJlcS0+dS5pMmNfcmVhZC5udW1fYnl0ZXNfcmVhZCk7CisJCWlkeCsrOwor CQlicmVhazsKKworCWNhc2UgRFBfUkVNT1RFX0kyQ19XUklURToKKwkJYnVmW2lkeF0gPSAocmVx LT51LmkyY193cml0ZS5wb3J0X251bWJlciAmIDB4ZikgPDwgNDsKKwkJaWR4Kys7CisJCWJ1Zltp ZHhdID0gKHJlcS0+dS5pMmNfd3JpdGUud3JpdGVfaTJjX2RldmljZV9pZCkgJiAweDdmOworCQlp ZHgrKzsKKwkJYnVmW2lkeF0gPSAocmVxLT51LmkyY193cml0ZS5udW1fYnl0ZXMpOworCQlpZHgr KzsKKwkJbWVtY3B5KCZidWZbaWR4XSwgcmVxLT51LmkyY193cml0ZS5ieXRlcywgcmVxLT51Lmky Y193cml0ZS5udW1fYnl0ZXMpOworCQlpZHggKz0gcmVxLT51LmkyY193cml0ZS5udW1fYnl0ZXM7 CisJCWJyZWFrOworCX0KKwlyYXctPmN1cl9sZW4gPSBpZHg7Cit9CisKK3N0YXRpYyB2b2lkIGRy bV9kcF9jcmNfc2lkZWJhbmRfY2h1bmtfcmVxKHU4ICptc2csIHU4IGxlbikKK3sKKwl1OCBjcmM0 OworCWNyYzQgPSBkcm1fZHBfbXNnX2RhdGFfY3JjNChtc2csIGxlbik7CisJbXNnW2xlbl0gPSBj cmM0OworfQorCitzdGF0aWMgdm9pZCBkcm1fZHBfZW5jb2RlX3NpZGViYW5kX3JlcGx5KHN0cnVj dCBkcm1fZHBfc2lkZWJhbmRfbXNnX3JlcGx5X2JvZHkgKnJlcCwKKwkJCQkJIHN0cnVjdCBkcm1f ZHBfc2lkZWJhbmRfbXNnX3R4ICpyYXcpCit7CisJaW50IGlkeCA9IDA7CisJdTggKmJ1ZiA9IHJh dy0+bXNnOworCisJYnVmW2lkeCsrXSA9IChyZXAtPnJlcGx5X3R5cGUgJiAweDEpIDw8IDcgfCAo cmVwLT5yZXFfdHlwZSAmIDB4N2YpOworCisJcmF3LT5jdXJfbGVuID0gaWR4OworfQorCisvKiB0 aGlzIGFkZHMgYSBjaHVuayBvZiBtc2cgdG8gdGhlIGJ1aWxkZXIgdG8gZ2V0IHRoZSBmaW5hbCBt c2cgKi8KK3N0YXRpYyBib29sIGRybV9kcF9zaWRlYmFuZF9tc2dfYnVpbGQoc3RydWN0IGRybV9k cF9zaWRlYmFuZF9tc2dfcnggKm1zZywKKwkJCQkgICAgICB1OCAqcmVwbHlidWYsIHU4IHJlcGx5 YnVmbGVuLCBib29sIGhkcikKK3sKKwlpbnQgcmV0OworCXU4IGNyYzQ7CisKKwlpZiAoaGRyKSB7 CisJCXU4IGhkcmxlbjsKKwkJc3RydWN0IGRybV9kcF9zaWRlYmFuZF9tc2dfaGRyIHJlY3ZfaGRy OworCQlyZXQgPSBkcm1fZHBfZGVjb2RlX3NpZGViYW5kX21zZ19oZHIoJnJlY3ZfaGRyLCByZXBs eWJ1ZiwgcmVwbHlidWZsZW4sICZoZHJsZW4pOworCQlpZiAocmV0ID09IGZhbHNlKQorCQkJcmV0 dXJuIGZhbHNlOworCisJCS8qIGdldCBsZW5ndGggY29udGFpbmVkIGluIHRoaXMgcG9ydGlvbiAq LworCQltc2ctPmN1cmNodW5rX2xlbiA9IHJlY3ZfaGRyLm1zZ19sZW47CisJCW1zZy0+Y3VyY2h1 bmtfaGRybGVuID0gaGRybGVuOworCisJCS8qIHdlIGhhdmUgYWxyZWFkeSBnb3R0ZW4gYW4gc29t dCAtIGRvbid0IGJvdGhlciBwYXJzaW5nICovCisJCWlmIChyZWN2X2hkci5zb210ICYmIG1zZy0+ aGF2ZV9zb210KQorCQkJcmV0dXJuIGZhbHNlOworCisJCWlmIChyZWN2X2hkci5zb210KSB7CisJ CQltZW1jcHkoJm1zZy0+aW5pdGlhbF9oZHIsICZyZWN2X2hkciwgc2l6ZW9mKHN0cnVjdCBkcm1f ZHBfc2lkZWJhbmRfbXNnX2hkcikpOworCQkJbXNnLT5oYXZlX3NvbXQgPSB0cnVlOworCQl9CisJ CWlmIChyZWN2X2hkci5lb210KQorCQkJbXNnLT5oYXZlX2VvbXQgPSB0cnVlOworCisJCS8qIGNv cHkgdGhlIGJ5dGVzIGZvciB0aGUgcmVtYWluZGVyIG9mIHRoaXMgaGVhZGVyIGNodW5rICovCisJ CW1zZy0+Y3VyY2h1bmtfaWR4ID0gbWluKG1zZy0+Y3VyY2h1bmtfbGVuLCAodTgpKHJlcGx5YnVm bGVuIC0gaGRybGVuKSk7CisJCW1lbWNweSgmbXNnLT5jaHVua1swXSwgcmVwbHlidWYgKyBoZHJs ZW4sIG1zZy0+Y3VyY2h1bmtfaWR4KTsKKwl9IGVsc2UgeworCQltZW1jcHkoJm1zZy0+Y2h1bmtb bXNnLT5jdXJjaHVua19pZHhdLCByZXBseWJ1ZiwgcmVwbHlidWZsZW4pOworCQltc2ctPmN1cmNo dW5rX2lkeCArPSByZXBseWJ1ZmxlbjsKKwl9CisKKwlpZiAobXNnLT5jdXJjaHVua19pZHggPj0g bXNnLT5jdXJjaHVua19sZW4pIHsKKwkJLyogZG8gQ1JDICovCisJCWNyYzQgPSBkcm1fZHBfbXNn X2RhdGFfY3JjNChtc2ctPmNodW5rLCBtc2ctPmN1cmNodW5rX2xlbiAtIDEpOworCQkvKiBjb3B5 IGNodW5rIGludG8gYmlnZ2VyIG1zZyAqLworCQltZW1jcHkoJm1zZy0+bXNnW21zZy0+Y3VybGVu XSwgbXNnLT5jaHVuaywgbXNnLT5jdXJjaHVua19sZW4gLSAxKTsKKwkJbXNnLT5jdXJsZW4gKz0g bXNnLT5jdXJjaHVua19sZW4gLSAxOworCX0KKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJv b2wgZHJtX2RwX3NpZGViYW5kX3BhcnNlX2xpbmtfYWRkcmVzcyhzdHJ1Y3QgZHJtX2RwX3NpZGVi YW5kX21zZ19yeCAqcmF3LAorCQkJCQkgICAgICAgc3RydWN0IGRybV9kcF9zaWRlYmFuZF9tc2df cmVwbHlfYm9keSAqcmVwbXNnKQoreworCWludCBpZHggPSAxOworCWludCBpOworCW1lbWNweShy ZXBtc2ctPnUubGlua19hZGRyLmd1aWQsICZyYXctPm1zZ1tpZHhdLCAxNik7CisJaWR4ICs9IDE2 OworCXJlcG1zZy0+dS5saW5rX2FkZHIubnBvcnRzID0gcmF3LT5tc2dbaWR4XSAmIDB4ZjsKKwlp ZHgrKzsKKwlpZiAoaWR4ID4gcmF3LT5jdXJsZW4pCisJCWdvdG8gZmFpbF9sZW47CisJZm9yIChp ID0gMDsgaSA8IHJlcG1zZy0+dS5saW5rX2FkZHIubnBvcnRzOyBpKyspIHsKKwkJaWYgKHJhdy0+ bXNnW2lkeF0gJiAweDgwKQorCQkJcmVwbXNnLT51LmxpbmtfYWRkci5wb3J0c1tpXS5pbnB1dF9w b3J0ID0gMTsKKworCQlyZXBtc2ctPnUubGlua19hZGRyLnBvcnRzW2ldLnBlZXJfZGV2aWNlX3R5 cGUgPSAocmF3LT5tc2dbaWR4XSA+PiA0KSAmIDB4NzsKKwkJcmVwbXNnLT51LmxpbmtfYWRkci5w b3J0c1tpXS5wb3J0X251bWJlciA9IChyYXctPm1zZ1tpZHhdICYgMHhmKTsKKworCQlpZHgrKzsK KwkJaWYgKGlkeCA+IHJhdy0+Y3VybGVuKQorCQkJZ290byBmYWlsX2xlbjsKKwkJcmVwbXNnLT51 LmxpbmtfYWRkci5wb3J0c1tpXS5tY3MgPSAocmF3LT5tc2dbaWR4XSA+PiA3KSAmIDB4MTsKKwkJ cmVwbXNnLT51LmxpbmtfYWRkci5wb3J0c1tpXS5kZHBzID0gKHJhdy0+bXNnW2lkeF0gPj4gNikg JiAweDE7CisJCWlmIChyZXBtc2ctPnUubGlua19hZGRyLnBvcnRzW2ldLmlucHV0X3BvcnQgPT0g MCkKKwkJCXJlcG1zZy0+dS5saW5rX2FkZHIucG9ydHNbaV0ubGVnYWN5X2RldmljZV9wbHVnX3N0 YXR1cyA9IChyYXctPm1zZ1tpZHhdID4+IDUpICYgMHgxOworCQlpZHgrKzsKKwkJaWYgKGlkeCA+ IHJhdy0+Y3VybGVuKQorCQkJZ290byBmYWlsX2xlbjsKKwkJaWYgKHJlcG1zZy0+dS5saW5rX2Fk ZHIucG9ydHNbaV0uaW5wdXRfcG9ydCA9PSAwKSB7CisJCQlyZXBtc2ctPnUubGlua19hZGRyLnBv cnRzW2ldLmRwY2RfcmV2aXNpb24gPSAocmF3LT5tc2dbaWR4XSk7CisJCQlpZHgrKzsKKwkJCWlm IChpZHggPiByYXctPmN1cmxlbikKKwkJCQlnb3RvIGZhaWxfbGVuOworCQkJbWVtY3B5KHJlcG1z Zy0+dS5saW5rX2FkZHIucG9ydHNbaV0ucGVlcl9ndWlkLCAmcmF3LT5tc2dbaWR4XSwgMTYpOwor CQkJaWR4ICs9IDE2OworCQkJaWYgKGlkeCA+IHJhdy0+Y3VybGVuKQorCQkJCWdvdG8gZmFpbF9s ZW47CisJCQlyZXBtc2ctPnUubGlua19hZGRyLnBvcnRzW2ldLm51bV9zZHBfc3RyZWFtcyA9IChy YXctPm1zZ1tpZHhdID4+IDQpICYgMHhmOworCQkJcmVwbXNnLT51LmxpbmtfYWRkci5wb3J0c1tp XS5udW1fc2RwX3N0cmVhbV9zaW5rcyA9IChyYXctPm1zZ1tpZHhdICYgMHhmKTsKKwkJCWlkeCsr OworCisJCX0KKwkJaWYgKGlkeCA+IHJhdy0+Y3VybGVuKQorCQkJZ290byBmYWlsX2xlbjsKKwl9 CisKKwlyZXR1cm4gdHJ1ZTsKK2ZhaWxfbGVuOgorCURSTV9ERUJVR19LTVMoImxpbmsgYWRkcmVz cyByZXBseSBwYXJzZSBsZW5ndGggZmFpbCAlZCAlZFxuIiwgaWR4LCByYXctPmN1cmxlbik7CisJ cmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgYm9vbCBkcm1fZHBfc2lkZWJhbmRfcGFyc2VfcmVt b3RlX2RwY2RfcmVhZChzdHJ1Y3QgZHJtX2RwX3NpZGViYW5kX21zZ19yeCAqcmF3LAorCQkJCQkJ ICAgc3RydWN0IGRybV9kcF9zaWRlYmFuZF9tc2dfcmVwbHlfYm9keSAqcmVwbXNnKQoreworCWlu dCBpZHggPSAxOworCXJlcG1zZy0+dS5yZW1vdGVfZHBjZF9yZWFkX2Fjay5wb3J0X251bWJlciA9 IHJhdy0+bXNnW2lkeF0gJiAweGY7CisJaWR4Kys7CisJaWYgKGlkeCA+IHJhdy0+Y3VybGVuKQor CQlnb3RvIGZhaWxfbGVuOworCXJlcG1zZy0+dS5yZW1vdGVfZHBjZF9yZWFkX2Fjay5udW1fYnl0 ZXMgPSByYXctPm1zZ1tpZHhdOworCWlmIChpZHggPiByYXctPmN1cmxlbikKKwkJZ290byBmYWls X2xlbjsKKworCW1lbWNweShyZXBtc2ctPnUucmVtb3RlX2RwY2RfcmVhZF9hY2suYnl0ZXMsICZy YXctPm1zZ1tpZHhdLCByZXBtc2ctPnUucmVtb3RlX2RwY2RfcmVhZF9hY2subnVtX2J5dGVzKTsK KwlyZXR1cm4gdHJ1ZTsKK2ZhaWxfbGVuOgorCURSTV9ERUJVR19LTVMoImxpbmsgYWRkcmVzcyBy ZXBseSBwYXJzZSBsZW5ndGggZmFpbCAlZCAlZFxuIiwgaWR4LCByYXctPmN1cmxlbik7CisJcmV0 dXJuIGZhbHNlOworfQorCitzdGF0aWMgYm9vbCBkcm1fZHBfc2lkZWJhbmRfcGFyc2VfcmVtb3Rl X2RwY2Rfd3JpdGUoc3RydWN0IGRybV9kcF9zaWRlYmFuZF9tc2dfcnggKnJhdywKKwkJCQkJCSAg ICAgIHN0cnVjdCBkcm1fZHBfc2lkZWJhbmRfbXNnX3JlcGx5X2JvZHkgKnJlcG1zZykKK3sKKwlp bnQgaWR4ID0gMTsKKwlyZXBtc2ctPnUucmVtb3RlX2RwY2Rfd3JpdGVfYWNrLnBvcnRfbnVtYmVy ID0gcmF3LT5tc2dbaWR4XSAmIDB4ZjsKKwlpZHgrKzsKKwlpZiAoaWR4ID4gcmF3LT5jdXJsZW4p CisJCWdvdG8gZmFpbF9sZW47CisJcmV0dXJuIHRydWU7CitmYWlsX2xlbjoKKwlEUk1fREVCVUdf S01TKCJwYXJzZSBsZW5ndGggZmFpbCAlZCAlZFxuIiwgaWR4LCByYXctPmN1cmxlbik7CisJcmV0 dXJuIGZhbHNlOworfQorCitzdGF0aWMgYm9vbCBkcm1fZHBfc2lkZWJhbmRfcGFyc2VfcmVtb3Rl X2kyY19yZWFkX2FjayhzdHJ1Y3QgZHJtX2RwX3NpZGViYW5kX21zZ19yeCAqcmF3LAorCQkJCQkJ ICAgICAgc3RydWN0IGRybV9kcF9zaWRlYmFuZF9tc2dfcmVwbHlfYm9keSAqcmVwbXNnKQorewor CWludCBpZHggPSAxOworCisJcmVwbXNnLT51LnJlbW90ZV9pMmNfcmVhZF9hY2sucG9ydF9udW1i ZXIgPSAocmF3LT5tc2dbaWR4XSAmIDB4Zik7CisJaWR4Kys7CisJaWYgKGlkeCA+IHJhdy0+Y3Vy bGVuKQorCQlnb3RvIGZhaWxfbGVuOworCXJlcG1zZy0+dS5yZW1vdGVfaTJjX3JlYWRfYWNrLm51 bV9ieXRlcyA9IHJhdy0+bXNnW2lkeF07CisJaWR4Kys7CisJLyogVE9ETyBjaGVjayAqLworCW1l bWNweShyZXBtc2ctPnUucmVtb3RlX2kyY19yZWFkX2Fjay5ieXRlcywgJnJhdy0+bXNnW2lkeF0s IHJlcG1zZy0+dS5yZW1vdGVfaTJjX3JlYWRfYWNrLm51bV9ieXRlcyk7CisJcmV0dXJuIHRydWU7 CitmYWlsX2xlbjoKKwlEUk1fREVCVUdfS01TKCJyZW1vdGUgaTJjIHJlcGx5IHBhcnNlIGxlbmd0 aCBmYWlsICVkICVkXG4iLCBpZHgsIHJhdy0+Y3VybGVuKTsKKwlyZXR1cm4gZmFsc2U7Cit9CisK K3N0YXRpYyBib29sIGRybV9kcF9zaWRlYmFuZF9wYXJzZV9lbnVtX3BhdGhfcmVzb3VyY2VzX2Fj ayhzdHJ1Y3QgZHJtX2RwX3NpZGViYW5kX21zZ19yeCAqcmF3LAorCQkJCQkJCSAgc3RydWN0IGRy bV9kcF9zaWRlYmFuZF9tc2dfcmVwbHlfYm9keSAqcmVwbXNnKQoreworCWludCBpZHggPSAxOwor CXJlcG1zZy0+dS5wYXRoX3Jlc291cmNlcy5wb3J0X251bWJlciA9IChyYXctPm1zZ1tpZHhdID4+ IDQpICYgMHhmOworCWlkeCsrOworCWlmIChpZHggPiByYXctPmN1cmxlbikKKwkJZ290byBmYWls X2xlbjsKKwlyZXBtc2ctPnUucGF0aF9yZXNvdXJjZXMuZnVsbF9wYXlsb2FkX2J3X251bWJlciA9 IChyYXctPm1zZ1tpZHhdIDw8IDgpIHwgKHJhdy0+bXNnW2lkeCsxXSk7CisJaWR4ICs9IDI7CisJ aWYgKGlkeCA+IHJhdy0+Y3VybGVuKQorCQlnb3RvIGZhaWxfbGVuOworCXJlcG1zZy0+dS5wYXRo X3Jlc291cmNlcy5hdmFpbF9wYXlsb2FkX2J3X251bWJlciA9IChyYXctPm1zZ1tpZHhdIDw8IDgp IHwgKHJhdy0+bXNnW2lkeCsxXSk7CisJaWR4ICs9IDI7CisJaWYgKGlkeCA+IHJhdy0+Y3VybGVu KQorCQlnb3RvIGZhaWxfbGVuOworCXJldHVybiB0cnVlOworZmFpbF9sZW46CisJRFJNX0RFQlVH X0tNUygiZW51bSByZXNvdXJjZSBwYXJzZSBsZW5ndGggZmFpbCAlZCAlZFxuIiwgaWR4LCByYXct PmN1cmxlbik7CisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgYm9vbCBkcm1fZHBfc2lkZWJh bmRfcGFyc2VfYWxsb2NhdGVfcGF5bG9hZF9hY2soc3RydWN0IGRybV9kcF9zaWRlYmFuZF9tc2df cnggKnJhdywKKwkJCQkJCQkgIHN0cnVjdCBkcm1fZHBfc2lkZWJhbmRfbXNnX3JlcGx5X2JvZHkg KnJlcG1zZykKK3sKKwlpbnQgaWR4ID0gMTsKKwlyZXBtc2ctPnUuYWxsb2NhdGVfcGF5bG9hZC5w b3J0X251bWJlciA9IChyYXctPm1zZ1tpZHhdID4+IDQpICYgMHhmOworCWlkeCsrOworCWlmIChp ZHggPiByYXctPmN1cmxlbikKKwkJZ290byBmYWlsX2xlbjsKKwlyZXBtc2ctPnUuYWxsb2NhdGVf cGF5bG9hZC52Y3BpID0gcmF3LT5tc2dbaWR4XTsKKwlpZHgrKzsKKwlpZiAoaWR4ID4gcmF3LT5j dXJsZW4pCisJCWdvdG8gZmFpbF9sZW47CisJcmVwbXNnLT51LmFsbG9jYXRlX3BheWxvYWQuYWxs b2NhdGVkX3BibiA9IChyYXctPm1zZ1tpZHhdIDw8IDgpIHwgKHJhdy0+bXNnW2lkeCsxXSk7CisJ aWR4ICs9IDI7CisJaWYgKGlkeCA+IHJhdy0+Y3VybGVuKQorCQlnb3RvIGZhaWxfbGVuOworCXJl dHVybiB0cnVlOworZmFpbF9sZW46CisJRFJNX0RFQlVHX0tNUygiYWxsb2NhdGUgcGF5bG9hZCBw YXJzZSBsZW5ndGggZmFpbCAlZCAlZFxuIiwgaWR4LCByYXctPmN1cmxlbik7CisJcmV0dXJuIGZh bHNlOworfQorCitzdGF0aWMgYm9vbCBkcm1fZHBfc2lkZWJhbmRfcGFyc2VfcXVlcnlfcGF5bG9h ZF9hY2soc3RydWN0IGRybV9kcF9zaWRlYmFuZF9tc2dfcnggKnJhdywKKwkJCQkJCSAgICBzdHJ1 Y3QgZHJtX2RwX3NpZGViYW5kX21zZ19yZXBseV9ib2R5ICpyZXBtc2cpCit7CisJaW50IGlkeCA9 IDE7CisJcmVwbXNnLT51LnF1ZXJ5X3BheWxvYWQucG9ydF9udW1iZXIgPSAocmF3LT5tc2dbaWR4 XSA+PiA0KSAmIDB4ZjsKKwlpZHgrKzsKKwlpZiAoaWR4ID4gcmF3LT5jdXJsZW4pCisJCWdvdG8g ZmFpbF9sZW47CisJcmVwbXNnLT51LnF1ZXJ5X3BheWxvYWQuYWxsb2NhdGVkX3BibiA9IChyYXct Pm1zZ1tpZHhdIDw8IDgpIHwgKHJhdy0+bXNnW2lkeCArIDFdKTsKKwlpZHggKz0gMjsKKwlpZiAo aWR4ID4gcmF3LT5jdXJsZW4pCisJCWdvdG8gZmFpbF9sZW47CisJcmV0dXJuIHRydWU7CitmYWls X2xlbjoKKwlEUk1fREVCVUdfS01TKCJxdWVyeSBwYXlsb2FkIHBhcnNlIGxlbmd0aCBmYWlsICVk ICVkXG4iLCBpZHgsIHJhdy0+Y3VybGVuKTsKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBi b29sIGRybV9kcF9zaWRlYmFuZF9wYXJzZV9yZXBseShzdHJ1Y3QgZHJtX2RwX3NpZGViYW5kX21z Z19yeCAqcmF3LAorCQkJCQlzdHJ1Y3QgZHJtX2RwX3NpZGViYW5kX21zZ19yZXBseV9ib2R5ICpt c2cpCit7CisJbWVtc2V0KG1zZywgMCwgc2l6ZW9mKCptc2cpKTsKKwltc2ctPnJlcGx5X3R5cGUg PSAocmF3LT5tc2dbMF0gJiAweDgwKSA+PiA3OworCW1zZy0+cmVxX3R5cGUgPSAocmF3LT5tc2db MF0gJiAweDdmKTsKKworCWlmIChtc2ctPnJlcGx5X3R5cGUpIHsKKwkJbWVtY3B5KG1zZy0+dS5u YWsuZ3VpZCwgJnJhdy0+bXNnWzFdLCAxNik7CisJCW1zZy0+dS5uYWsucmVhc29uID0gcmF3LT5t c2dbMTddOworCQltc2ctPnUubmFrLm5ha19kYXRhID0gcmF3LT5tc2dbMThdOworCQlyZXR1cm4g ZmFsc2U7CisJfQorCisJc3dpdGNoIChtc2ctPnJlcV90eXBlKSB7CisJY2FzZSBEUF9MSU5LX0FE RFJFU1M6CisJCXJldHVybiBkcm1fZHBfc2lkZWJhbmRfcGFyc2VfbGlua19hZGRyZXNzKHJhdywg bXNnKTsKKwljYXNlIERQX1FVRVJZX1BBWUxPQUQ6CisJCXJldHVybiBkcm1fZHBfc2lkZWJhbmRf cGFyc2VfcXVlcnlfcGF5bG9hZF9hY2socmF3LCBtc2cpOworCWNhc2UgRFBfUkVNT1RFX0RQQ0Rf UkVBRDoKKwkJcmV0dXJuIGRybV9kcF9zaWRlYmFuZF9wYXJzZV9yZW1vdGVfZHBjZF9yZWFkKHJh dywgbXNnKTsKKwljYXNlIERQX1JFTU9URV9EUENEX1dSSVRFOgorCQlyZXR1cm4gZHJtX2RwX3Np ZGViYW5kX3BhcnNlX3JlbW90ZV9kcGNkX3dyaXRlKHJhdywgbXNnKTsKKwljYXNlIERQX1JFTU9U RV9JMkNfUkVBRDoKKwkJcmV0dXJuIGRybV9kcF9zaWRlYmFuZF9wYXJzZV9yZW1vdGVfaTJjX3Jl YWRfYWNrKHJhdywgbXNnKTsKKwljYXNlIERQX0VOVU1fUEFUSF9SRVNPVVJDRVM6CisJCXJldHVy biBkcm1fZHBfc2lkZWJhbmRfcGFyc2VfZW51bV9wYXRoX3Jlc291cmNlc19hY2socmF3LCBtc2cp OworCWNhc2UgRFBfQUxMT0NBVEVfUEFZTE9BRDoKKwkJcmV0dXJuIGRybV9kcF9zaWRlYmFuZF9w YXJzZV9hbGxvY2F0ZV9wYXlsb2FkX2FjayhyYXcsIG1zZyk7CisJZGVmYXVsdDoKKwkJRFJNX0VS Uk9SKCJHb3QgdW5rbm93biByZXBseSAweCUwMnhcbiIsIG1zZy0+cmVxX3R5cGUpOworCQlyZXR1 cm4gZmFsc2U7CisJfQorfQorCitzdGF0aWMgYm9vbCBkcm1fZHBfc2lkZWJhbmRfcGFyc2VfY29u bmVjdGlvbl9zdGF0dXNfbm90aWZ5KHN0cnVjdCBkcm1fZHBfc2lkZWJhbmRfbXNnX3J4ICpyYXcs CisJCQkJCQkJICAgc3RydWN0IGRybV9kcF9zaWRlYmFuZF9tc2dfcmVxX2JvZHkgKm1zZykKK3sK KwlpbnQgaWR4ID0gMTsKKworCW1zZy0+dS5jb25uX3N0YXQucG9ydF9udW1iZXIgPSAocmF3LT5t c2dbaWR4XSAmIDB4ZjApID4+IDQ7CisJaWR4Kys7CisJaWYgKGlkeCA+IHJhdy0+Y3VybGVuKQor CQlnb3RvIGZhaWxfbGVuOworCisJbWVtY3B5KG1zZy0+dS5jb25uX3N0YXQuZ3VpZCwgJnJhdy0+ bXNnW2lkeF0sIDE2KTsKKwlpZHggKz0gMTY7CisJaWYgKGlkeCA+IHJhdy0+Y3VybGVuKQorCQln b3RvIGZhaWxfbGVuOworCisJbXNnLT51LmNvbm5fc3RhdC5sZWdhY3lfZGV2aWNlX3BsdWdfc3Rh dHVzID0gKHJhdy0+bXNnW2lkeF0gPj4gNikgJiAweDE7CisJbXNnLT51LmNvbm5fc3RhdC5kaXNw bGF5cG9ydF9kZXZpY2VfcGx1Z19zdGF0dXMgPSAocmF3LT5tc2dbaWR4XSA+PiA1KSAmIDB4MTsK Kwltc2ctPnUuY29ubl9zdGF0Lm1lc3NhZ2VfY2FwYWJpbGl0eV9zdGF0dXMgPSAocmF3LT5tc2db aWR4XSA+PiA0KSAmIDB4MTsKKwltc2ctPnUuY29ubl9zdGF0LmlucHV0X3BvcnQgPSAocmF3LT5t c2dbaWR4XSA+PiAzKSAmIDB4MTsKKwltc2ctPnUuY29ubl9zdGF0LnBlZXJfZGV2aWNlX3R5cGUg PSAocmF3LT5tc2dbaWR4XSAmIDB4Nyk7CisJaWR4Kys7CisJcmV0dXJuIHRydWU7CitmYWlsX2xl bjoKKwlEUk1fREVCVUdfS01TKCJjb25uZWN0aW9uIHN0YXR1cyByZXBseSBwYXJzZSBsZW5ndGgg ZmFpbCAlZCAlZFxuIiwgaWR4LCByYXctPmN1cmxlbik7CisJcmV0dXJuIGZhbHNlOworfQorCitz dGF0aWMgYm9vbCBkcm1fZHBfc2lkZWJhbmRfcGFyc2VfcmVzb3VyY2Vfc3RhdHVzX25vdGlmeShz dHJ1Y3QgZHJtX2RwX3NpZGViYW5kX21zZ19yeCAqcmF3LAorCQkJCQkJCSAgIHN0cnVjdCBkcm1f ZHBfc2lkZWJhbmRfbXNnX3JlcV9ib2R5ICptc2cpCit7CisJaW50IGlkeCA9IDE7CisKKwltc2ct PnUucmVzb3VyY2Vfc3RhdC5wb3J0X251bWJlciA9IChyYXctPm1zZ1tpZHhdICYgMHhmMCkgPj4g NDsKKwlpZHgrKzsKKwlpZiAoaWR4ID4gcmF3LT5jdXJsZW4pCisJCWdvdG8gZmFpbF9sZW47CisK KwltZW1jcHkobXNnLT51LnJlc291cmNlX3N0YXQuZ3VpZCwgJnJhdy0+bXNnW2lkeF0sIDE2KTsK KwlpZHggKz0gMTY7CisJaWYgKGlkeCA+IHJhdy0+Y3VybGVuKQorCQlnb3RvIGZhaWxfbGVuOwor CisJbXNnLT51LnJlc291cmNlX3N0YXQuYXZhaWxhYmxlX3BibiA9IChyYXctPm1zZ1tpZHhdIDw8 IDgpIHwgKHJhdy0+bXNnW2lkeCArIDFdKTsKKwlpZHgrKzsKKwlyZXR1cm4gdHJ1ZTsKK2ZhaWxf bGVuOgorCURSTV9ERUJVR19LTVMoInJlc291cmNlIHN0YXR1cyByZXBseSBwYXJzZSBsZW5ndGgg ZmFpbCAlZCAlZFxuIiwgaWR4LCByYXctPmN1cmxlbik7CisJcmV0dXJuIGZhbHNlOworfQorc3Rh dGljIGJvb2wgZHJtX2RwX3NpZGViYW5kX3BhcnNlX3JlcShzdHJ1Y3QgZHJtX2RwX3NpZGViYW5k X21zZ19yeCAqcmF3LAorCQkJCSAgICAgIHN0cnVjdCBkcm1fZHBfc2lkZWJhbmRfbXNnX3JlcV9i b2R5ICptc2cpCit7CisJbWVtc2V0KG1zZywgMCwgc2l6ZW9mKCptc2cpKTsKKwltc2ctPnJlcV90 eXBlID0gKHJhdy0+bXNnWzBdICYgMHg3Zik7CisKKwlzd2l0Y2ggKG1zZy0+cmVxX3R5cGUpIHsK KwljYXNlIERQX0NPTk5FQ1RJT05fU1RBVFVTX05PVElGWToKKwkJcmV0dXJuIGRybV9kcF9zaWRl YmFuZF9wYXJzZV9jb25uZWN0aW9uX3N0YXR1c19ub3RpZnkocmF3LCBtc2cpOworCWNhc2UgRFBf UkVTT1VSQ0VfU1RBVFVTX05PVElGWToKKwkJcmV0dXJuIGRybV9kcF9zaWRlYmFuZF9wYXJzZV9y ZXNvdXJjZV9zdGF0dXNfbm90aWZ5KHJhdywgbXNnKTsKKwlkZWZhdWx0OgorCQlEUk1fRVJST1Io IkdvdCB1bmtub3duIHJlcXVlc3QgMHglMDJ4XG4iLCBtc2ctPnJlcV90eXBlKTsKKwkJcmV0dXJu IGZhbHNlOworCX0KK30KKworc3RhdGljIHZvaWQgZHJtX2RwX21zdF9saW5rX3Byb2JlX3dvcmso c3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBkcm1fZHBfbXN0X3RvcG9sb2d5 X21nciAqbWdyID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBkcm1fZHBfbXN0X3RvcG9sb2d5 X21nciwgd29yayk7CisKKwlkcm1fZHBfc2VuZF9saW5rX2FkZHJlc3MobWdyLCBtZ3ItPm1zdF9w cmltYXJ5KTsKK30KKworaW50IGRybV9kcF9tc3RfdG9wb2xvZ3lfbWdyX2luaXQoc3RydWN0IGRy bV9kcF9tc3RfdG9wb2xvZ3lfbWdyICptZ3IsCisJCQkJIHN0cnVjdCBkZXZpY2UgKmRldiwgc3Ry dWN0IGRybV9kcF9hdXggKmF1eCwKKwkJCQkgaW50IG1heF9kcGNkX3RyYW5zYWN0aW9uX2J5dGVz LAorCQkJCSBpbnQgbWF4X3BheWxvYWRzKQoreworCW11dGV4X2luaXQoJm1nci0+bG9jayk7CisJ c3Bpbl9sb2NrX2luaXQoJm1nci0+cWxvY2spOworCUlOSVRfTElTVF9IRUFEKCZtZ3ItPnR4X21z Z191cHEpOworCUlOSVRfTElTVF9IRUFEKCZtZ3ItPnR4X21zZ19kb3ducSk7CisJSU5JVF9XT1JL KCZtZ3ItPndvcmssIGRybV9kcF9tc3RfbGlua19wcm9iZV93b3JrKTsKKwlpbml0X3dhaXRxdWV1 ZV9oZWFkKCZtZ3ItPnR4X3dhaXRxKTsKKwltZ3ItPmRldiA9IGRldjsKKwltZ3ItPmF1eCA9IGF1 eDsKKwltZ3ItPm1heF9kcGNkX3RyYW5zYWN0aW9uX2J5dGVzID0gbWF4X2RwY2RfdHJhbnNhY3Rp b25fYnl0ZXM7CisJbWdyLT5tYXhfcGF5bG9hZHMgPSBtYXhfcGF5bG9hZHM7CisJbWdyLT5wYXls b2FkcyA9IGtjYWxsb2MobWF4X3BheWxvYWRzLCBzaXplb2Yoc3RydWN0IGRybV9kcF9wYXlsb2Fk KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFtZ3ItPnBheWxvYWRzKQorCQlyZXR1cm4gLUVOT01FTTsK KwltZ3ItPnByb3Bvc2VkX3ZjcGlzID0ga2NhbGxvYyhtYXhfcGF5bG9hZHMsIHNpemVvZihzdHJ1 Y3QgZHJtX2RwX3ZjcGkgKiksIEdGUF9LRVJORUwpOworCWlmICghbWdyLT5wcm9wb3NlZF92Y3Bp cykKKwkJcmV0dXJuIC1FTk9NRU07CisJc2V0X2JpdCgwLCAmbWdyLT5wYXlsb2FkX21hc2spOwor CXRlc3RfY2FsY19wYm5fbW9kZSgpOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChkcm1f ZHBfbXN0X3RvcG9sb2d5X21ncl9pbml0KTsKKwordm9pZCBkcm1fZHBfbXN0X3RvcG9sb2d5X21n cl9kZXN0cm95KHN0cnVjdCBkcm1fZHBfbXN0X3RvcG9sb2d5X21nciAqbWdyKQoreworCWtmcmVl KG1nci0+cGF5bG9hZHMpOworCWtmcmVlKG1nci0+cHJvcG9zZWRfdmNwaXMpOworfQorRVhQT1JU X1NZTUJPTChkcm1fZHBfbXN0X3RvcG9sb2d5X21ncl9kZXN0cm95KTsKKworLyogdGhpcyBpcyBw cmV0dHkgYm9ndXMgKi8KK3N0YXRpYyBib29sIGRybV9kcF92YWxpZGF0ZV9ndWlkKHN0cnVjdCBk cm1fZHBfbXN0X3RvcG9sb2d5X21nciAqbWdyLAorCQkJCSB1OCAqZ3VpZCkKK3sKKwlzdGF0aWMg dTggemVyb19ndWlkWzE2XTsKKworCWlmICghbWVtY21wKGd1aWQsIHplcm9fZ3VpZCwgMTYpKSB7 CisJCXU2NCBzYWx0ID0gZ2V0X2ppZmZpZXNfNjQoKTsKKwkJbWVtY3B5KCZndWlkWzBdLCAmc2Fs dCwgc2l6ZW9mKHU2NCkpOworCQltZW1jcHkoJmd1aWRbOF0sICZzYWx0LCBzaXplb2YodTY0KSk7 CisJCXJldHVybiBmYWxzZTsKKwl9CisJcmV0dXJuIHRydWU7Cit9CisKKyNpZiAwCitzdGF0aWMg aW50IGJ1aWxkX2RwY2RfcmVhZChzdHJ1Y3QgZHJtX2RwX3NpZGViYW5kX21zZ190eCAqbXNnLCB1 OCBwb3J0X251bSwgdTMyIG9mZnNldCwgdTggbnVtX2J5dGVzKQoreworCXN0cnVjdCBkcm1fZHBf c2lkZWJhbmRfbXNnX3JlcV9ib2R5IHJlcTsKKworCXJlcS5yZXFfdHlwZSA9IERQX1JFTU9URV9E UENEX1JFQUQ7CisJcmVxLnUuZHBjZF9yZWFkLnBvcnRfbnVtYmVyID0gcG9ydF9udW07CisJcmVx LnUuZHBjZF9yZWFkLmRwY2RfYWRkcmVzcyA9IG9mZnNldDsKKwlyZXEudS5kcGNkX3JlYWQubnVt X2J5dGVzID0gbnVtX2J5dGVzOworCWRybV9kcF9lbmNvZGVfc2lkZWJhbmRfcmVxKCZyZXEsIG1z Zyk7CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IGJ1aWxkX2RwY2Rfd3Jp dGUoc3RydWN0IGRybV9kcF9zaWRlYmFuZF9tc2dfdHggKm1zZywgdTggcG9ydF9udW0sIHUzMiBv ZmZzZXQsIHU4IG51bV9ieXRlcywgdTggKmJ5dGVzKQoreworCXN0cnVjdCBkcm1fZHBfc2lkZWJh bmRfbXNnX3JlcV9ib2R5IHJlcTsKKworCXJlcS5yZXFfdHlwZSA9IERQX1JFTU9URV9EUENEX1dS SVRFOworCXJlcS51LmRwY2Rfd3JpdGUucG9ydF9udW1iZXIgPSBwb3J0X251bTsKKwlyZXEudS5k cGNkX3dyaXRlLmRwY2RfYWRkcmVzcyA9IG9mZnNldDsKKwlyZXEudS5kcGNkX3dyaXRlLm51bV9i eXRlcyA9IG51bV9ieXRlczsKKwltZW1jcHkocmVxLnUuZHBjZF93cml0ZS5ieXRlcywgYnl0ZXMs IG51bV9ieXRlcyk7CisJZHJtX2RwX2VuY29kZV9zaWRlYmFuZF9yZXEoJnJlcSwgbXNnKTsKKwor CXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJ1aWxkX2xpbmtfYWRkcmVzcyhzdHJ1Y3QgZHJt X2RwX3NpZGViYW5kX21zZ190eCAqbXNnKQoreworCXN0cnVjdCBkcm1fZHBfc2lkZWJhbmRfbXNn X3JlcV9ib2R5IHJlcTsKKworCXJlcS5yZXFfdHlwZSA9IERQX0xJTktfQUREUkVTUzsKKwlkcm1f ZHBfZW5jb2RlX3NpZGViYW5kX3JlcSgmcmVxLCBtc2cpOworCXJldHVybiAwOworfQorCitzdGF0 aWMgaW50IGJ1aWxkX2VudW1fcGF0aF9yZXNvdXJjZXMoc3RydWN0IGRybV9kcF9zaWRlYmFuZF9t c2dfdHggKm1zZywgaW50IHBvcnRfbnVtKQoreworCXN0cnVjdCBkcm1fZHBfc2lkZWJhbmRfbXNn X3JlcV9ib2R5IHJlcTsKKworCXJlcS5yZXFfdHlwZSA9IERQX0VOVU1fUEFUSF9SRVNPVVJDRVM7 CisJcmVxLnUucG9ydF9udW0ucG9ydF9udW1iZXIgPSBwb3J0X251bTsKKwlkcm1fZHBfZW5jb2Rl X3NpZGViYW5kX3JlcSgmcmVxLCBtc2cpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJ1 aWxkX2FsbG9jYXRlX3BheWxvYWQoc3RydWN0IGRybV9kcF9zaWRlYmFuZF9tc2dfdHggKm1zZywg aW50IHBvcnRfbnVtLAorCQkJCSAgdTggdmNwaSwgdWludDE2X3QgcGJuKQoreworCXN0cnVjdCBk cm1fZHBfc2lkZWJhbmRfbXNnX3JlcV9ib2R5IHJlcTsKKwltZW1zZXQoJnJlcSwgMCwgc2l6ZW9m KHJlcSkpOworCXJlcS5yZXFfdHlwZSA9IERQX0FMTE9DQVRFX1BBWUxPQUQ7CisJcmVxLnUuYWxs b2NhdGVfcGF5bG9hZC5wb3J0X251bWJlciA9IHBvcnRfbnVtOworCXJlcS51LmFsbG9jYXRlX3Bh eWxvYWQudmNwaSA9IHZjcGk7CisJcmVxLnUuYWxsb2NhdGVfcGF5bG9hZC5wYm4gPSBwYm47CisJ ZHJtX2RwX2VuY29kZV9zaWRlYmFuZF9yZXEoJnJlcSwgbXNnKTsKKwlyZXR1cm4gMDsKK30KKwor c3RhdGljIGludCBkcm1fZHBfc2VuZF9zaWRlYmFuZF9tc2coc3RydWN0IGRybV9kcF9tc3RfdG9w b2xvZ3lfbWdyICptZ3IsCisJCQkJICAgIGJvb2wgdXAsIHU4ICptc2csIGludCBsZW4pCit7CisJ aW50IHJldDsKKwlpbnQgcmVnYmFzZSA9IHVwID8gRFBfU0lERUJBTkRfTVNHX1VQX1JFUF9CQVNF IDogRFBfU0lERUJBTkRfTVNHX0RPV05fUkVRX0JBU0U7CisJaW50IHRvc2VuZCwgdG90YWwsIG9m ZnNldDsKKworCXRvdGFsID0gbGVuOworCW9mZnNldCA9IDA7CisJZG8geworCQl0b3NlbmQgPSBt aW4zKG1nci0+bWF4X2RwY2RfdHJhbnNhY3Rpb25fYnl0ZXMsIDMyLCB0b3RhbCk7CisKKwkJcmV0 ID0gZHJtX2RwX2RwY2Rfd3JpdGUobWdyLT5hdXgsIHJlZ2Jhc2UgKyBvZmZzZXQsCisJCQkJCSZt c2dbb2Zmc2V0XSwKKwkJCQkJdG9zZW5kKTsKKwkJb2Zmc2V0ICs9IHRvc2VuZDsKKwkJdG90YWwg LT0gdG9zZW5kOworCX0gd2hpbGUgKHRvdGFsID4gMCk7CisJcmV0dXJuIHJldDsKK30KKworc3Rh dGljIGludCBzZXRfaGRyX2Zyb21fZHN0KHN0cnVjdCBkcm1fZHBfc2lkZWJhbmRfbXNnX2hkciAq aGRyLAorCQkJICAgIHN0cnVjdCBkcm1fZHBfc2lkZWJhbmRfbXNnX3R4ICp0eG1zZykKK3sKKwlz dHJ1Y3QgZHJtX2RwX21zdF9icmFuY2ggKm1zdGIgPSB0eG1zZy0+ZHN0OworCisJLyogYm90aCBt c2cgc2xvdHMgYXJlIGZ1bGwgKi8KKwlpZiAodHhtc2ctPnNlcW5vID09IC0xKSB7CisJCXNwaW5f bG9jaygmbXN0Yi0+c2xvdHNfbG9jayk7CisJCWlmIChtc3RiLT50eF9zbG90c1swXSAmJiBtc3Ri LT50eF9zbG90c1sxXSkgeworCQkJRFJNX0RFQlVHX0tNUygiJXM6IGZhaWxlZCB0byBmaW5kIHNs b3RcbiIsIF9fZnVuY19fKTsKKwkJCXNwaW5fdW5sb2NrKCZtc3RiLT5zbG90c19sb2NrKTsKKwkJ CXJldHVybiAtRUFHQUlOOworCQl9CisJCWlmIChtc3RiLT50eF9zbG90c1swXSA9PSBOVUxMKQor CQkJdHhtc2ctPnNlcW5vID0gMDsKKwkJZWxzZQorCQkJdHhtc2ctPnNlcW5vID0gMTsKKwkJbXN0 Yi0+dHhfc2xvdHNbdHhtc2ctPnNlcW5vXSA9IHR4bXNnOworCQlzcGluX3VubG9jaygmbXN0Yi0+ c2xvdHNfbG9jayk7CisJfQorCWhkci0+YnJvYWRjYXN0ID0gMDsKKwloZHItPnBhdGhfbXNnID0g MDsKKwloZHItPmxjdCA9IG1zdGItPmxjdDsKKwloZHItPmxjciA9IG1zdGItPmxjdCAtIDE7CisJ aWYgKG1zdGItPmxjdCA+IDEpCisJCW1lbWNweShoZHItPnJhZCwgbXN0Yi0+cmFkLCBtc3RiLT5s Y3QgLyAyKTsKKwloZHItPnNlcW5vID0gdHhtc2ctPnNlcW5vOworCXJldHVybiAwOworfQorLyoK KyAqIHByb2Nlc3MgYSBzaW5nbGUgYmxvY2sgb2YgdGhlIG5leHQgbWVzc2FnZSBpbiB0aGUgc2lk ZWJhbmQgcXVldWUKKyAqLworc3RhdGljIGludCBwcm9jZXNzX3NpbmdsZV90eChzdHJ1Y3QgZHJt X2RwX21zdF90b3BvbG9neV9tZ3IgKm1nciwKKwkJCSAgICAgIHN0cnVjdCBkcm1fZHBfc2lkZWJh bmRfbXNnX3R4ICp0eG1zZywKKwkJCSAgICAgIGJvb2wgdXApCit7CisJdTggY2h1bmtbNDhdOwor CXN0cnVjdCBkcm1fZHBfc2lkZWJhbmRfbXNnX2hkciBoZHI7CisJaW50IGxlbiwgc3BhY2UsIGlk eCwgdG9zZW5kOworCWludCByZXQ7CisKKwkvKiBtYWtlIGhkciBmcm9tIGRzdCBtc3QgLSBmb3Ig cmVwbGllcyB1c2Ugc2Vxbm8KKwkgICBvdGhlcndpc2UgYXNzaWduIG9uZSAqLworCXJldCA9IHNl dF9oZHJfZnJvbV9kc3QoJmhkciwgdHhtc2cpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0 OworCisJdHhtc2ctPnN0YXRlID0gRFJNX0RQX1NJREVCQU5EX1RYX1NUQVJUX1NFTkQ7CisKKwkv KiBhbW91bnQgbGVmdCB0byBzZW5kIGluIHRoaXMgbWVzc2FnZSAqLworCWxlbiA9IHR4bXNnLT5j dXJfbGVuIC0gdHhtc2ctPmN1cl9vZmZzZXQ7CisKKwkvKiA0OCAtIHNpZGViYW5kIG1zZyBzaXpl IC0gMSBieXRlIGZvciBkYXRhIENSQywgeCBoZWFkZXIgYnl0ZXMgKi8KKwlzcGFjZSA9IDQ4IC0g MSAtIGRybV9kcF9jYWxjX3NiX2hkcl9zaXplKCZoZHIpOworCisJdG9zZW5kID0gbWluKGxlbiwg c3BhY2UpOworCWlmIChsZW4gPT0gdHhtc2ctPmN1cl9sZW4pCisJCWhkci5zb210ID0gMTsKKwlp ZiAoc3BhY2UgPj0gbGVuKQorCQloZHIuZW9tdCA9IDE7CisKKwloZHIubXNnX2xlbiA9IHRvc2Vu ZCArIDE7CisJZHJtX2RwX2VuY29kZV9zaWRlYmFuZF9tc2dfaGRyKCZoZHIsIGNodW5rLCAmaWR4 KTsKKwltZW1jcHkoJmNodW5rW2lkeF0sICZ0eG1zZy0+bXNnW3R4bXNnLT5jdXJfb2Zmc2V0XSwg dG9zZW5kKTsKKwkvKiBhZGQgY3JjIGF0IGVuZCAqLworCWRybV9kcF9jcmNfc2lkZWJhbmRfY2h1 bmtfcmVxKCZjaHVua1tpZHhdLCB0b3NlbmQpOworCWlkeCArPSB0b3NlbmQgKyAxOworCWRybV9k cF9zZW5kX3NpZGViYW5kX21zZyhtZ3IsIHVwLCBjaHVuaywgaWR4KTsKKworCXR4bXNnLT5jdXJf b2Zmc2V0ICs9IHRvc2VuZDsKKwlpZiAodHhtc2ctPmN1cl9vZmZzZXQgPT0gdHhtc2ctPmN1cl9s ZW4pIHsKKwkJdHhtc2ctPnN0YXRlID0gRFJNX0RQX1NJREVCQU5EX1RYX1NFTlQ7CisJCXJldHVy biAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcHJvY2Vzc19zaW5nbGVfZG93 bl90eChzdHJ1Y3QgZHJtX2RwX21zdF90b3BvbG9neV9tZ3IgKm1ncikKK3sKKwlzdHJ1Y3QgZHJt X2RwX3NpZGViYW5kX21zZ190eCAqdHhtc2c7CisJaW50IHJldDsKKworCS8qIGNvbnN0cnVjdCBh IGNodW5rIGZyb20gdGhlIGZpcnN0IG1zZyBpbiB0aGUgdHhfbXNnIHF1ZXVlICovCisJaWYgKGxp c3RfZW1wdHkoJm1nci0+dHhfbXNnX2Rvd25xKSkgeworCQltZ3ItPnR4X2Rvd25faW5fcHJvZ3Jl c3MgPSBmYWxzZTsKKwkJcmV0dXJuOworCX0KKworCXR4bXNnID0gbGlzdF9maXJzdF9lbnRyeSgm bWdyLT50eF9tc2dfZG93bnEsIHN0cnVjdCBkcm1fZHBfc2lkZWJhbmRfbXNnX3R4LCBuZXh0KTsK Kwl0eG1zZy0+c2Vxbm8gPSAtMTsKKwlyZXQgPSBwcm9jZXNzX3NpbmdsZV90eChtZ3IsIHR4bXNn LCBmYWxzZSk7CisJaWYgKHJldCA9PSAxKSB7CisJCS8qIHR4bXNnIGlzIHNlbnQgaXQgc2hvdWxk IGJlIGluIHRoZSBzbG90cyBub3cgKi8KKwkJbGlzdF9kZWwoJnR4bXNnLT5uZXh0KTsKKwl9CisJ bWdyLT50eF9kb3duX2luX3Byb2dyZXNzID0gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgcHJvY2Vz c19zaW5nbGVfdXBfdHgoc3RydWN0IGRybV9kcF9tc3RfdG9wb2xvZ3lfbWdyICptZ3IpCit7CisJ c3RydWN0IGRybV9kcF9zaWRlYmFuZF9tc2dfdHggKnR4bXNnOworCWludCByZXQ7CisJLyogY29u c3RydWN0IGEgY2h1bmsgZnJvbSB0aGUgZmlyc3QgbXNnIGluIHRoZSB0eF9tc2cgcXVldWUgKi8K KwlpZiAobGlzdF9lbXB0eSgmbWdyLT50eF9tc2dfdXBxKSkgeworCQltZ3ItPnR4X3VwX2luX3By b2dyZXNzID0gZmFsc2U7CisJCXJldHVybjsKKwl9CisKKwl0eG1zZyA9IGxpc3RfZmlyc3RfZW50 cnkoJm1nci0+dHhfbXNnX3VwcSwgc3RydWN0IGRybV9kcF9zaWRlYmFuZF9tc2dfdHgsIG5leHQp OworCXJldCA9IHByb2Nlc3Nfc2luZ2xlX3R4KG1nciwgdHhtc2csIHRydWUpOworCWlmIChyZXQg PT0gMSkgeworCQkvKiB1cCB0eG1zZ3MgYXJlbid0IHB1dCBpbiBzbG90cyAtIHNvIGZyZWUgYWZ0 ZXIgd2Ugc2VuZCBpdCAqLworCQlsaXN0X2RlbCgmdHhtc2ctPm5leHQpOworCQlrZnJlZSh0eG1z Zyk7CisJfQorCW1nci0+dHhfdXBfaW5fcHJvZ3Jlc3MgPSB0cnVlOworfQorCitzdGF0aWMgdm9p ZCBkcm1fZHBfcXVldWVfZG93bl90eChzdHJ1Y3QgZHJtX2RwX21zdF90b3BvbG9neV9tZ3IgKm1n ciwKKwkJCQkgc3RydWN0IGRybV9kcF9zaWRlYmFuZF9tc2dfdHggKnR4bXNnKQoreworCWxpc3Rf YWRkX3RhaWwoJnR4bXNnLT5uZXh0LCAmbWdyLT50eF9tc2dfZG93bnEpOworCWlmICghbWdyLT50 eF9kb3duX2luX3Byb2dyZXNzKQorCQlwcm9jZXNzX3NpbmdsZV9kb3duX3R4KG1ncik7CisKK30K Kworc3RhdGljIGludCBkcm1fZHBfc2VuZF9saW5rX2FkZHJlc3Moc3RydWN0IGRybV9kcF9tc3Rf dG9wb2xvZ3lfbWdyICptZ3IsCisJCQkJICAgIHN0cnVjdCBkcm1fZHBfbXN0X2JyYW5jaCAqbXN0 YikKK3sKKwlpbnQgbGVuOworCXN0cnVjdCBkcm1fZHBfc2lkZWJhbmRfbXNnX3R4ICp0eG1zZzsK KwlpbnQgcmV0OworCXR4bXNnID0ga3phbGxvYyhzaXplb2YoKnR4bXNnKSwgR0ZQX0tFUk5FTCk7 CisJaWYgKCF0eG1zZykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl0eG1zZy0+ZHN0ID0gbXN0YjsK KwlsZW4gPSBidWlsZF9saW5rX2FkZHJlc3ModHhtc2cpOworCisJZHJtX2RwX3F1ZXVlX2Rvd25f dHgobWdyLCB0eG1zZyk7CisKKwlyZXQgPSBkcm1fZHBfbXN0X3dhaXRfdHhfcmVwbHkobXN0Yiwg dHhtc2cpOworCWlmIChyZXQgPiAwKSB7CisJCWludCBpOworCisJCWlmICh0eG1zZy0+cmVwbHku cmVwbHlfdHlwZSA9PSAxKQorCQkJRFJNX0RFQlVHX0tNUygibGluayBhZGRyZXNzIG5hayByZWNl aXZlZFxuIik7CisJCWVsc2UgeworCQkJRFJNX0RFQlVHX0tNUygibGluayBhZGRyZXNzIHJlcGx5 OiAlZFxuIiwgdHhtc2ctPnJlcGx5LnUubGlua19hZGRyLm5wb3J0cyk7CisJCQlmb3IgKGkgPSAw OyBpIDwgdHhtc2ctPnJlcGx5LnUubGlua19hZGRyLm5wb3J0czsgaSsrKSB7CisJCQkJRFJNX0RF QlVHX0tNUygicG9ydCAlZDogaW5wdXQgJWQsIHBkdDogJWQsIHBuOiAlZCwgZHBjZF9yZXY6ICUw MngsIG1jczogJWQsIGRkcHM6ICVkLCBsZHBzICVkXG4iLCBpLAorCQkJCSAgICAgICB0eG1zZy0+ cmVwbHkudS5saW5rX2FkZHIucG9ydHNbaV0uaW5wdXRfcG9ydCwKKwkJCQkgICAgICAgdHhtc2ct PnJlcGx5LnUubGlua19hZGRyLnBvcnRzW2ldLnBlZXJfZGV2aWNlX3R5cGUsCisJCQkJICAgICAg IHR4bXNnLT5yZXBseS51LmxpbmtfYWRkci5wb3J0c1tpXS5wb3J0X251bWJlciwKKwkJCQkgICAg ICAgdHhtc2ctPnJlcGx5LnUubGlua19hZGRyLnBvcnRzW2ldLmRwY2RfcmV2aXNpb24sCisJCQkJ ICAgICAgIHR4bXNnLT5yZXBseS51LmxpbmtfYWRkci5wb3J0c1tpXS5tY3MsCisJCQkJICAgICAg IHR4bXNnLT5yZXBseS51LmxpbmtfYWRkci5wb3J0c1tpXS5kZHBzLAorCQkJCSAgICAgICB0eG1z Zy0+cmVwbHkudS5saW5rX2FkZHIucG9ydHNbaV0ubGVnYWN5X2RldmljZV9wbHVnX3N0YXR1cyk7 CisJCQl9CisJCQlmb3IgKGkgPSAwOyBpIDwgdHhtc2ctPnJlcGx5LnUubGlua19hZGRyLm5wb3J0 czsgaSsrKSB7CisJCQkJZHJtX2RwX2FkZF9wb3J0KG1zdGIsIG1nci0+ZGV2LCAmdHhtc2ctPnJl cGx5LnUubGlua19hZGRyLnBvcnRzW2ldKTsKKwkJCX0KKwkJfQorCX0gZWxzZQorCQlEUk1fREVC VUdfS01TKCJsaW5rIGFkZHJlc3MgZmFpbGVkICVkXG4iLCByZXQpOworCisJa2ZyZWUodHhtc2cp OworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRybV9kcF9zZW5kX2VudW1fcGF0aF9yZXNv dXJjZXMoc3RydWN0IGRybV9kcF9tc3RfdG9wb2xvZ3lfbWdyICptZ3IsCisJCQkJCSAgIHN0cnVj dCBkcm1fZHBfbXN0X2JyYW5jaCAqbXN0YiwKKwkJCQkJICAgaW50IHBvcnRfbnVtKQoreworCWlu dCBsZW47CisJc3RydWN0IGRybV9kcF9zaWRlYmFuZF9tc2dfdHggKnR4bXNnOworCisJLyogVE9E TyByZWRvIHRoaXMgcHJvcGVybHkgKi8KKwlyZXR1cm4gMDsKKwl0eG1zZyA9IGt6YWxsb2Moc2l6 ZW9mKCp0eG1zZyksIEdGUF9LRVJORUwpOworCWlmICghdHhtc2cpCisJCXJldHVybiAtRU5PTUVN OworCisJdHhtc2ctPmRzdCA9IG1zdGI7CisJbGVuID0gYnVpbGRfZW51bV9wYXRoX3Jlc291cmNl cyh0eG1zZywgcG9ydF9udW0pOworCisJZHJtX2RwX3F1ZXVlX2Rvd25fdHgobWdyLCB0eG1zZyk7 CisKKwlyZXR1cm4gMDsKK30KKworaW50IGRybV9kcF9wYXlsb2FkX3NlbmRfbXNnKHN0cnVjdCBk cm1fZHBfbXN0X3RvcG9sb2d5X21nciAqbWdyLAorCQkJICAgIHN0cnVjdCBkcm1fZHBfbXN0X3Bv cnQgKnBvcnQsCisJCQkgICAgaW50IGlkLAorCQkJICAgIGludCBwYm4pCit7CisJc3RydWN0IGRy bV9kcF9zaWRlYmFuZF9tc2dfdHggKnR4bXNnOworCWludCBsZW4sIHJldDsKKworCXR4bXNnID0g a3phbGxvYyhzaXplb2YoKnR4bXNnKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF0eG1zZykKKwkJcmV0 dXJuIC1FTk9NRU07CisKKwl0eG1zZy0+ZHN0ID0gcG9ydC0+cGFyZW50OworCWxlbiA9IGJ1aWxk X2FsbG9jYXRlX3BheWxvYWQodHhtc2csIHBvcnQtPnBvcnRfbnVtLAorCQkJCSAgICAgaWQsCisJ CQkJICAgICBwYm4pOworCisJZHJtX2RwX3F1ZXVlX2Rvd25fdHgobWdyLCB0eG1zZyk7CisKKwly ZXQgPSBkcm1fZHBfbXN0X3dhaXRfdHhfcmVwbHkocG9ydC0+cGFyZW50LCB0eG1zZyk7CisKKwlr ZnJlZSh0eG1zZyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHJtX2RwX2NyZWF0ZV9w YXlsb2FkX3N0ZXAxKHN0cnVjdCBkcm1fZHBfbXN0X3RvcG9sb2d5X21nciAqbWdyLAorCQkJCSAg ICAgICBpbnQgaWQsCisJCQkJICAgICAgIHN0cnVjdCBkcm1fZHBfcGF5bG9hZCAqcGF5bG9hZCkK K3sKKwlpbnQgcmV0OworCisJcmV0ID0gZHJtX2RwX2RwY2Rfd3JpdGVfcGF5bG9hZChtZ3IsIGlk LCBwYXlsb2FkKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlwYXlsb2FkLT5wYXls b2FkX3N0YXRlID0gRFBfUEFZTE9BRF9MT0NBTDsKKwlyZXR1cm4gMDsKK30KKworaW50IGRybV9k cF9jcmVhdGVfcGF5bG9hZF9zdGVwMihzdHJ1Y3QgZHJtX2RwX21zdF90b3BvbG9neV9tZ3IgKm1n ciwKKwkJCQlzdHJ1Y3QgZHJtX2RwX21zdF9wb3J0ICpwb3J0LAorCQkJCWludCBpZCwKKwkJCQlz dHJ1Y3QgZHJtX2RwX3BheWxvYWQgKnBheWxvYWQpCit7CisJaW50IHJldDsKKwlyZXQgPSBkcm1f ZHBfcGF5bG9hZF9zZW5kX21zZyhtZ3IsIHBvcnQsIGlkLCBwb3J0LT52Y3BpLnBibik7CisJaWYg KHJldCA8IDApCisJCXJldHVybiByZXQ7CisJcGF5bG9hZC0+cGF5bG9hZF9zdGF0ZSA9IERQX1BB WUxPQURfUkVNT1RFOworCXJldHVybiByZXQ7Cit9CisKK2ludCBkcm1fZHBfZGVzdHJveV9wYXls b2FkKHN0cnVjdCBkcm1fZHBfbXN0X3RvcG9sb2d5X21nciAqbWdyLAorCQkJICAgc3RydWN0IGRy bV9kcF9tc3RfcG9ydCAqcG9ydCwKKwkJCSAgIGludCBpZCwKKwkJCSAgIHN0cnVjdCBkcm1fZHBf cGF5bG9hZCAqcGF5bG9hZCkKK3sKKwlpbnQgcmV0OworCWlmIChwb3J0KQorCQlyZXQgPSBkcm1f ZHBfcGF5bG9hZF9zZW5kX21zZyhtZ3IsIHBvcnQsIGlkLCAwKTsKKworCXJldCA9IGRybV9kcF9k cGNkX3dyaXRlX3BheWxvYWQobWdyLCBpZCwgcGF5bG9hZCk7CisKKwkoKm1nci0+Y2JzLT5nZW5l cmF0ZV9hY3RfZXZlbnQpKG1ncik7CisKKwlyZXQgPSBkcm1fZHBfY2hlY2tfYWN0X3N0YXR1cyht Z3IpOworCXBheWxvYWQtPnBheWxvYWRfc3RhdGUgPSAwOworCXJldHVybiByZXQ7Cit9CisKKy8q IHNlZSBpZiB3ZSBuZWVkIHRvIGNoYW5nZSBhbmQgb2YgdGhlIHBheWxvYWQgYWxsb2NhdGlvbnMg Ki8KKy8qIGl0IGFwcGVhcnMgZm9yIGludGVsIHdlIHNob3VsZCBzZXQgdGhlIHdob2xlIG1vZGUg dXAgYmV0d2VlbgorICAgc2VuZGluZyB0aGUgcmVtb3RlIHBheWxvYWQgc2V0dXAgYW5kIGNvbmZp Z3VyaW5nIHRoZSBsb2NhbCBkcGNkIHRhYmxlICovCisvKiByZXR1cm4gMSBpZiB0aGluZ3MgY2hh bmdlZCBzbyBBQ1QgY2FuIGJlIHNlbnQgKi8KK2ludCBkcm1fZHBfdXBkYXRlX3BheWxvYWRfcGFy dDEoc3RydWN0IGRybV9kcF9tc3RfdG9wb2xvZ3lfbWdyICptZ3IpCit7CisJaW50IGk7CisJaW50 IGN1cl9zbG90cyA9IDE7CisJc3RydWN0IGRybV9kcF9wYXlsb2FkIHJlcV9wYXlsb2FkOworCisJ Zm9yIChpID0gMDsgaSA8IG1nci0+bWF4X3BheWxvYWRzOyBpKyspIHsKKwkJLyogc29sdmUgdGhl IGN1cnJlbnQgcGF5bG9hZHMgLSBjb21wYXJlIHRvIHRoZSBodyBvbmVzCisJCSAgIC0gdXBkYXRl IHRoZSBodyB2aWV3ICovCisJCXJlcV9wYXlsb2FkLnN0YXJ0X3Nsb3QgPSBjdXJfc2xvdHM7CisJ CWlmIChtZ3ItPnByb3Bvc2VkX3ZjcGlzW2ldKQorCQkJcmVxX3BheWxvYWQubnVtX3Nsb3RzID0g bWdyLT5wcm9wb3NlZF92Y3Bpc1tpXS0+bnVtX3Nsb3RzOworCQllbHNlCisJCQlyZXFfcGF5bG9h ZC5udW1fc2xvdHMgPSAwOworCisJCS8qIHdvcmsgb3V0IHdoYXQgaXMgcmVxdWlyZWQgdG8gaGFw cGVuIHdpdGggdGhpcyBwYXlsb2FkICovCisJCWlmIChtZ3ItPnBheWxvYWRzW2ldLnN0YXJ0X3Ns b3QgIT0gcmVxX3BheWxvYWQuc3RhcnRfc2xvdCB8fAorCQkgICAgbWdyLT5wYXlsb2Fkc1tpXS5u dW1fc2xvdHMgIT0gcmVxX3BheWxvYWQubnVtX3Nsb3RzKSB7CisJCQlzdHJ1Y3QgZHJtX2RwX21z dF9wb3J0ICpwb3J0ID0gTlVMTDsKKworCQkJaWYgKG1nci0+cHJvcG9zZWRfdmNwaXNbaV0pCisJ CQkJcG9ydCA9IGNvbnRhaW5lcl9vZihtZ3ItPnByb3Bvc2VkX3ZjcGlzW2ldLCBzdHJ1Y3QgZHJt X2RwX21zdF9wb3J0LCB2Y3BpKTsKKworCQkJLyogbmVlZCB0byBwdXNoIGFuIHVwZGF0ZSBmb3Ig dGhpcyBwYXlsb2FkICovCisJCQlpZiAocmVxX3BheWxvYWQubnVtX3Nsb3RzKQorCQkJCWRybV9k cF9jcmVhdGVfcGF5bG9hZF9zdGVwMShtZ3IsIGksICZyZXFfcGF5bG9hZCk7CisJCQllbHNlIGlm IChtZ3ItPnBheWxvYWRzW2ldLm51bV9zbG90cykgeworCQkJCW1nci0+cGF5bG9hZHNbaV0ubnVt X3Nsb3RzID0gMDsKKwkJCQlkcm1fZHBfZGVzdHJveV9wYXlsb2FkKG1nciwgcG9ydCwgaSwgJm1n ci0+cGF5bG9hZHNbaV0pOworCQkJfQorCQkJbWdyLT5wYXlsb2Fkc1tpXS5zdGFydF9zbG90ID0g cmVxX3BheWxvYWQuc3RhcnRfc2xvdDsKKwkJCW1nci0+cGF5bG9hZHNbaV0ubnVtX3Nsb3RzID0g cmVxX3BheWxvYWQubnVtX3Nsb3RzOworCQkJbWdyLT5wYXlsb2Fkc1tpXS5wYXlsb2FkX3N0YXRl ID0gcmVxX3BheWxvYWQucGF5bG9hZF9zdGF0ZTsKKwkJfQorCQljdXJfc2xvdHMgKz0gcmVxX3Bh eWxvYWQubnVtX3Nsb3RzOworCX0KKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChkcm1f ZHBfdXBkYXRlX3BheWxvYWRfcGFydDEpOworCitpbnQgZHJtX2RwX3VwZGF0ZV9wYXlsb2FkX3Bh cnQyKHN0cnVjdCBkcm1fZHBfbXN0X3RvcG9sb2d5X21nciAqbWdyKQoreworCXN0cnVjdCBkcm1f ZHBfbXN0X3BvcnQgKnBvcnQ7CisJaW50IGk7CisJaW50IHJldDsKKwlmb3IgKGkgPSAwOyBpIDwg bWdyLT5tYXhfcGF5bG9hZHM7IGkrKykgeworCQlpZiAoIW1nci0+cHJvcG9zZWRfdmNwaXNbaV0p CisJCQljb250aW51ZTsKKworCQlpZiAobWdyLT5wYXlsb2Fkc1tpXS5wYXlsb2FkX3N0YXRlICE9 IERQX1BBWUxPQURfTE9DQUwpCisJCQljb250aW51ZTsKKworCQlwb3J0ID0gY29udGFpbmVyX29m KG1nci0+cHJvcG9zZWRfdmNwaXNbaV0sIHN0cnVjdCBkcm1fZHBfbXN0X3BvcnQsIHZjcGkpOwor CQlyZXQgPSBkcm1fZHBfY3JlYXRlX3BheWxvYWRfc3RlcDIobWdyLCBwb3J0LCBpLCAmbWdyLT5w YXlsb2Fkc1tpXSk7CisJfQorCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChkcm1fZHBfdXBk YXRlX3BheWxvYWRfcGFydDIpOworCisjaWYgMCAvKiB1bnVzZWQgYXMgb2YgeWV0ICovCitzdGF0 aWMgaW50IGRybV9kcF9zZW5kX2RwY2RfcmVhZChzdHJ1Y3QgZHJtX2RwX21zdF90b3BvbG9neV9t Z3IgKm1nciwKKwkJCQkgc3RydWN0IGRybV9kcF9tc3RfcG9ydCAqcG9ydCwKKwkJCQkgaW50IG9m ZnNldCwgaW50IHNpemUpCit7CisJaW50IGxlbjsKKwlzdHJ1Y3QgZHJtX2RwX3NpZGViYW5kX21z Z190eCAqdHhtc2c7CisKKwl0eG1zZyA9IGt6YWxsb2Moc2l6ZW9mKCp0eG1zZyksIEdGUF9LRVJO RUwpOworCWlmICghdHhtc2cpCisJCXJldHVybiAtRU5PTUVNOworCisJbGVuID0gYnVpbGRfZHBj ZF9yZWFkKHR4bXNnLCBwb3J0LT5wb3J0X251bSwgMCwgOCk7CisJdHhtc2ctPmRzdCA9IHBvcnQt PnBhcmVudDsKKworCWRybV9kcF9xdWV1ZV9kb3duX3R4KG1nciwgdHhtc2cpOworCisJcmV0dXJu IDA7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBkcm1fZHBfc2VuZF9kcGNkX3dyaXRlKHN0cnVj dCBkcm1fZHBfbXN0X3RvcG9sb2d5X21nciAqbWdyLAorCQkJCSAgc3RydWN0IGRybV9kcF9tc3Rf cG9ydCAqcG9ydCwKKwkJCQkgIGludCBvZmZzZXQsIGludCBzaXplLCB1OCAqYnl0ZXMpCit7CisJ aW50IGxlbjsKKwlpbnQgcmV0OworCXN0cnVjdCBkcm1fZHBfc2lkZWJhbmRfbXNnX3R4ICp0eG1z ZzsKKwlzdHJ1Y3QgZHJtX2RwX21zdF9icmFuY2ggKm1zdGIgPSBwb3J0LT5wYXJlbnQ7CisKKwl0 eG1zZyA9IGt6YWxsb2Moc2l6ZW9mKCp0eG1zZyksIEdGUF9LRVJORUwpOworCWlmICghdHhtc2cp CisJCXJldHVybiAtRU5PTUVNOworCisJbGVuID0gYnVpbGRfZHBjZF93cml0ZSh0eG1zZywgcG9y dC0+cG9ydF9udW0sIG9mZnNldCwgc2l6ZSwgYnl0ZXMpOworCXR4bXNnLT5kc3QgPSBwb3J0LT5w YXJlbnQ7CisKKwlkcm1fZHBfcXVldWVfZG93bl90eChtZ3IsIHR4bXNnKTsKKworCXJldCA9IGRy bV9kcF9tc3Rfd2FpdF90eF9yZXBseShtc3RiLCB0eG1zZyk7CisJaWYgKHJldCA+IDApIHsKKwkJ aWYgKHR4bXNnLT5yZXBseS5yZXBseV90eXBlID09IDEpIHsKKwkJCXJldHVybiAtRUlOVkFMOwor CQl9IGVsc2UKKwkJCXJldHVybiAwOworCX0KKwlrZnJlZSh0eG1zZyk7CisJcmV0dXJuIDA7Cit9 CisKK3N0YXRpYyBpbnQgZHJtX2RwX2VuY29kZV91cF9hY2tfcmVwbHkoc3RydWN0IGRybV9kcF9z aWRlYmFuZF9tc2dfdHggKm1zZywgdTggcmVxX3R5cGUpCit7CisJc3RydWN0IGRybV9kcF9zaWRl YmFuZF9tc2dfcmVwbHlfYm9keSByZXBseTsKKworCXJlcGx5LnJlcGx5X3R5cGUgPSAxOworCXJl cGx5LnJlcV90eXBlID0gcmVxX3R5cGU7CisJZHJtX2RwX2VuY29kZV9zaWRlYmFuZF9yZXBseSgm cmVwbHksIG1zZyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHJtX2RwX3NlbmRfdXBf YWNrX3JlcGx5KHN0cnVjdCBkcm1fZHBfbXN0X3RvcG9sb2d5X21nciAqbWdyLAorCQkJCSAgICBz dHJ1Y3QgZHJtX2RwX21zdF9icmFuY2ggKm1zdGIsCisJCQkJICAgIGludCByZXFfdHlwZSwgaW50 IHNlcW5vLCBib29sIGJyb2FkY2FzdCkKK3sKKwlzdHJ1Y3QgZHJtX2RwX3NpZGViYW5kX21zZ190 eCAqdHhtc2c7CisKKwl0eG1zZyA9IGt6YWxsb2Moc2l6ZW9mKCp0eG1zZyksIEdGUF9LRVJORUwp OworCWlmICghdHhtc2cpCisJCXJldHVybiAtRU5PTUVNOworCisJdHhtc2ctPmRzdCA9IG1zdGI7 CisJdHhtc2ctPnNlcW5vID0gc2Vxbm87CisJZHJtX2RwX2VuY29kZV91cF9hY2tfcmVwbHkodHht c2csIHJlcV90eXBlKTsKKworCWxpc3RfYWRkX3RhaWwoJnR4bXNnLT5uZXh0LCAmbWdyLT50eF9t c2dfdXBxKTsKKwlpZiAoIW1nci0+dHhfdXBfaW5fcHJvZ3Jlc3MpIHsKKwkJcHJvY2Vzc19zaW5n bGVfdXBfdHgobWdyKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHJtX2RwX2dl dF92Y19wYXlsb2FkX2J3KGludCBkcF9saW5rX2J3LCBpbnQgZHBfbGlua19jb3VudCkKK3sKKwlz d2l0Y2ggKGRwX2xpbmtfYncpIHsKKwljYXNlIERQX0xJTktfQldfMV82MjoKKwkJcmV0dXJuIDMg KiBkcF9saW5rX2NvdW50OworCWNhc2UgRFBfTElOS19CV18yXzc6CisJCXJldHVybiA1ICogZHBf bGlua19jb3VudDsKKwljYXNlIERQX0xJTktfQldfNV80OgorCQlyZXR1cm4gMTAgKiBkcF9saW5r X2NvdW50OworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IGRybV9kcF9tc3RfdG9wb2xvZ3lfbWdy X3NldF9tc3Qoc3RydWN0IGRybV9kcF9tc3RfdG9wb2xvZ3lfbWdyICptZ3IsIGJvb2wgbXN0X3N0 YXRlKQoreworCWludCByZXQgPSAwOworCisJbXV0ZXhfbG9jaygmbWdyLT5sb2NrKTsKKwlpZiAo bXN0X3N0YXRlID09IG1nci0+bXN0X3N0YXRlKQorCQlnb3RvIG91dF91bmxvY2s7CisKKwltZ3It Pm1zdF9zdGF0ZSA9IG1zdF9zdGF0ZTsKKwkvKiBzZXQgdGhlIGRldmljZSBpbnRvIE1TVCBtb2Rl ICovCisJaWYgKG1zdF9zdGF0ZSkgeworCQlzdHJ1Y3QgZHJtX2RwX21zdF9icmFuY2ggKm1zdGI7 CisJCVdBUk5fT04obWdyLT5tc3RfcHJpbWFyeSk7CisKKwkJLyogZ2V0IGRwY2QgaW5mbyAqLwor CQlyZXQgPSBkcm1fZHBfZHBjZF9yZWFkKG1nci0+YXV4LCBEUF9EUENEX1JFViwgbWdyLT5kcGNk LCBEUF9SRUNFSVZFUl9DQVBfU0laRSk7CisJCWlmIChyZXQgIT0gRFBfUkVDRUlWRVJfQ0FQX1NJ WkUpIHsKKwkJCURSTV9ERUJVR19LTVMoImZhaWxlZCB0byByZWFkIERQQ0RcbiIpOworCQkJZ290 byBvdXRfdW5sb2NrOworCQl9CisKKwkJbWdyLT5wYm5fZGl2ID0gZHJtX2RwX2dldF92Y19wYXls b2FkX2J3KG1nci0+ZHBjZFsxXSwgbWdyLT5kcGNkWzJdICYgRFBfTUFYX0xBTkVfQ09VTlRfTUFT Syk7CisJCW1nci0+dG90YWxfcGJuID0gMjU2MDsKKwkJbWdyLT50b3RhbF9zbG90cyA9IERJVl9S T1VORF9VUChtZ3ItPnRvdGFsX3BibiwgbWdyLT5wYm5fZGl2KTsKKwkJbWdyLT5hdmFpbF9zbG90 cyA9IG1nci0+dG90YWxfc2xvdHM7CisKKwkJLyogYWRkIGluaXRpYWwgYnJhbmNoIGRldmljZSBh dCBMQ1QgMSAqLworCQltc3RiID0gZHJtX2RwX2FkZF9tc3RfYnJhbmNoX2RldmljZSgxLCBOVUxM KTsKKwkJaWYgKG1zdGIgPT0gTlVMTCkgeworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0 X3VubG9jazsKKwkJfQorCQltc3RiLT5tZ3IgPSBtZ3I7CisJCS8qIGdpdmUgdGhpcyB0aGUgbWFp biByZWZlcmVuY2UgKi8KKwkJbWdyLT5tc3RfcHJpbWFyeSA9IG1zdGI7CisJCWtyZWZfZ2V0KCZt Z3ItPm1zdF9wcmltYXJ5LT5rcmVmKTsKKworCQl7CisJCQlzdHJ1Y3QgZHJtX2RwX3BheWxvYWQg cmVzZXRfcGF5OworCQkJcmVzZXRfcGF5LnN0YXJ0X3Nsb3QgPSAwOworCQkJcmVzZXRfcGF5Lm51 bV9zbG90cyA9IDB4M2Y7CisJCQlkcm1fZHBfZHBjZF93cml0ZV9wYXlsb2FkKG1nciwgMCwgJnJl c2V0X3BheSk7CisJCX0KKworCQlyZXQgPSBkcm1fZHBfZHBjZF93cml0ZWIobWdyLT5hdXgsIERQ X01TVE1fQ1RSTCwKKwkJCQkJIERQX01TVF9FTiB8IERQX1VQX1JFUV9FTiB8IERQX1VQU1RSRUFN X0lTX1NSQyk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBvdXRfdW5sb2NrOworCisJCS8qIHNv cnQgb3V0IGd1aWQgKi8KKwkJcmV0ID0gZHJtX2RwX2RwY2RfcmVhZChtZ3ItPmF1eCwgRFBfR1VJ RCwgbWdyLT5ndWlkLCAxNik7CisJCWlmIChyZXQgIT0gMTYpIHsKKwkJCURSTV9ERUJVR19LTVMo ImZhaWxlZCB0byByZWFkIERQIEdVSUQgJWRcbiIsIHJldCk7CisJCQlnb3RvIG91dF91bmxvY2s7 CisJCX0KKworCQltZ3ItPmd1aWRfdmFsaWQgPSBkcm1fZHBfdmFsaWRhdGVfZ3VpZChtZ3IsIG1n ci0+Z3VpZCk7CisJCWlmICghbWdyLT5ndWlkX3ZhbGlkKSB7CisJCQlyZXQgPSBkcm1fZHBfZHBj ZF93cml0ZShtZ3ItPmF1eCwgRFBfR1VJRCwgbWdyLT5ndWlkLCAxNik7CisJCQltZ3ItPmd1aWRf dmFsaWQgPSB0cnVlOworCQl9CisKKwkJbXV0ZXhfdW5sb2NrKCZtZ3ItPmxvY2spOworCisJCXNj aGVkdWxlX3dvcmsoJm1nci0+d29yayk7CisJCS8qIHdlIG5lZWQgdG8gc2VuZCB0aGUgbGluayBh ZGRyZXNzIGluIGEgd29yayBxdWV1ZQorCQkgICBzbyB3ZSBjYW4gYXZvaWQgcmVjdXNpbmcgdGhl IG1vZGVzZXQgbG9ja3MgaWYgd2UgZ2V0CisJCSAgIG5ldyBjb25uZWN0b3JzICovCisJCWRybV9k cF9wdXRfbXN0X2JyYW5jaF9kZXZpY2UobWdyLT5tc3RfcHJpbWFyeSk7CisKKwkJcmV0ID0gMDsK Kwl9IGVsc2UgeworCQlpZiAobWdyLT5tc3RfcHJpbWFyeSkgeworCQkJY2FuY2VsX3dvcmtfc3lu YygmbWdyLT53b3JrKTsKKwkJCWRybV9kcF9wdXRfbXN0X2JyYW5jaF9kZXZpY2UobWdyLT5tc3Rf cHJpbWFyeSk7CisJCQltZ3ItPm1zdF9wcmltYXJ5ID0gTlVMTDsKKwkJfQorCQkvKiBkaXNhYmxl IE1TVCBvbiB0aGUgZGV2aWNlICovCisJCXJldCA9IGRybV9kcF9kcGNkX3dyaXRlYihtZ3ItPmF1 eCwgRFBfTVNUTV9DVFJMLCAwKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIG91dF91bmxvY2s7 CisJCXJldCA9IDA7CisJCW11dGV4X3VubG9jaygmbWdyLT5sb2NrKTsKKwl9CisKKwlyZXR1cm4g MDsKK291dF91bmxvY2s6CisJbXV0ZXhfdW5sb2NrKCZtZ3ItPmxvY2spOworCXJldHVybiByZXQ7 Cit9CitFWFBPUlRfU1lNQk9MKGRybV9kcF9tc3RfdG9wb2xvZ3lfbWdyX3NldF9tc3QpOworCitz dGF0aWMgdm9pZCBkcm1fZHBfZ2V0X29uZV9zYl9tc2coc3RydWN0IGRybV9kcF9tc3RfdG9wb2xv Z3lfbWdyICptZ3IsIGJvb2wgdXApCit7CisJaW50IGxlbjsKKwl1OCByZXBseWJsb2NrWzMyXTsK KwlpbnQgcmVwbHlsZW4sIG9yaWdsZW4sIGN1cnJlcGx5OworCWludCByZXQ7CisJc3RydWN0IGRy bV9kcF9zaWRlYmFuZF9tc2dfcnggKm1zZzsKKwlpbnQgYmFzZXJlZyA9IHVwID8gRFBfU0lERUJB TkRfTVNHX1VQX1JFUV9CQVNFIDogRFBfU0lERUJBTkRfTVNHX0RPV05fUkVQX0JBU0U7CisJaWYg KHVwKQorCQltc2cgPSAmbWdyLT51cF9yZXFfcmVjdjsKKwllbHNlCisJCW1zZyA9ICZtZ3ItPmRv d25fcmVwX3JlY3Y7CisKKwlsZW4gPSBtaW4obWdyLT5tYXhfZHBjZF90cmFuc2FjdGlvbl9ieXRl cywgMzIpOworCXJldCA9IGRybV9kcF9kcGNkX3JlYWQobWdyLT5hdXgsIGJhc2VyZWcsCisJCQkg ICAgICAgcmVwbHlibG9jaywgbGVuKTsKKwlpZiAocmV0ICE9IGxlbikgeworCQlEUk1fREVCVUdf S01TKCJmYWlsZWQgdG8gcmVhZCBEUENEIGRvd24gcmVwICVkICVkXG4iLCBsZW4sIHJldCk7CisJ CXJldHVybjsKKwl9CisJcmV0ID0gZHJtX2RwX3NpZGViYW5kX21zZ19idWlsZChtc2csIHJlcGx5 YmxvY2ssIGxlbiwgdHJ1ZSk7CisJaWYgKCFyZXQpIHsKKwkJRFJNX0RFQlVHX0tNUygic2lkZWJh bmQgbXNnIGJ1aWxkIGZhaWxlZCAlZFxuIiwgcmVwbHlibG9ja1swXSk7CisJCXJldHVybjsKKwl9 CisJcmVwbHlsZW4gPSBtc2ctPmN1cmNodW5rX2xlbiArIG1zZy0+Y3VyY2h1bmtfaGRybGVuOwor CisJb3JpZ2xlbiA9IHJlcGx5bGVuOworCXJlcGx5bGVuIC09IGxlbjsKKwljdXJyZXBseSA9IGxl bjsKKwl3aGlsZSAocmVwbHlsZW4gPiAwKSB7CisJCWxlbiA9IG1pbjMocmVwbHlsZW4sIG1nci0+ bWF4X2RwY2RfdHJhbnNhY3Rpb25fYnl0ZXMsIDMyKTsKKwkJcmV0ID0gZHJtX2RwX2RwY2RfcmVh ZChtZ3ItPmF1eCwgYmFzZXJlZyArIGN1cnJlcGx5LAorCQkJCSAgICByZXBseWJsb2NrLCBsZW4p OworCisJCWRybV9kcF9zaWRlYmFuZF9tc2dfYnVpbGQobXNnLCByZXBseWJsb2NrLCBsZW4sIGZh bHNlKTsKKwkJY3VycmVwbHkgKz0gbGVuOworCQlyZXBseWxlbiAtPSBsZW47CisJfQorfQorCitz dGF0aWMgaW50IGRybV9kcF9tc3RfaGFuZGxlX2Rvd25fcmVwKHN0cnVjdCBkcm1fZHBfbXN0X3Rv cG9sb2d5X21nciAqbWdyKQoreworCWludCByZXQgPSAwOworCWRybV9kcF9nZXRfb25lX3NiX21z ZyhtZ3IsIGZhbHNlKTsKKworCWlmIChtZ3ItPmRvd25fcmVwX3JlY3YuaGF2ZV9lb210KSB7CisJ CXN0cnVjdCBkcm1fZHBfc2lkZWJhbmRfbXNnX3R4ICp0eG1zZzsKKwkJc3RydWN0IGRybV9kcF9t c3RfYnJhbmNoICptc3RiOworCisJCW1zdGIgPSBkcm1fZHBfZ2V0X21zdF9icmFuY2hfZGV2aWNl KG1nciwKKwkJCQkJCSAgICBtZ3ItPmRvd25fcmVwX3JlY3YuaW5pdGlhbF9oZHIubGN0LAorCQkJ CQkJICAgIG1nci0+ZG93bl9yZXBfcmVjdi5pbml0aWFsX2hkci5yYWQpOworCisJCWlmICghbXN0 YikgeworCQkJRFJNX0RFQlVHX0tNUygiR290IE1TVCByZXBseSBmcm9tIHVua25vd24gZGV2aWNl ICVkXG4iLCBtZ3ItPmRvd25fcmVwX3JlY3YuaW5pdGlhbF9oZHIubGN0KTsKKwkJCW1lbXNldCgm bWdyLT5kb3duX3JlcF9yZWN2LCAwLCBzaXplb2Yoc3RydWN0IGRybV9kcF9zaWRlYmFuZF9tc2df cngpKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJLyogZmluZCB0aGUgbWVzc2FnZSAqLworCQlz cGluX2xvY2soJm1zdGItPnNsb3RzX2xvY2spOworCQl0eG1zZyA9IG1zdGItPnR4X3Nsb3RzW21n ci0+ZG93bl9yZXBfcmVjdi5pbml0aWFsX2hkci5zZXFub107CisJCS8qIHJlbW92ZSBmcm9tIHNs b3RzICovCisJCW1zdGItPnR4X3Nsb3RzW21nci0+ZG93bl9yZXBfcmVjdi5pbml0aWFsX2hkci5z ZXFub10gPSBOVUxMOworCQlzcGluX3VubG9jaygmbXN0Yi0+c2xvdHNfbG9jayk7CisKKwkJaWYg KCF0eG1zZykgeworCQkJRFJNX0RFQlVHX0tNUygiR290IE1TVCByZXBseSB3aXRoIG5vIG1zZyAl cCAlZCAlZCAlMDJ4XG4iLAorCQkJICAgICAgIG1zdGIsCisJCQkgICAgICAgbWdyLT5kb3duX3Jl cF9yZWN2LmluaXRpYWxfaGRyLnNlcW5vLAorCQkJICAgICAgIG1nci0+ZG93bl9yZXBfcmVjdi5p bml0aWFsX2hkci5sY3QsCisJCQkgICAgICAgbWdyLT5kb3duX3JlcF9yZWN2LmluaXRpYWxfaGRy LnJhZFswXSk7CisJCQlkcm1fZHBfcHV0X21zdF9icmFuY2hfZGV2aWNlKG1zdGIpOworCQkJbWVt c2V0KCZtZ3ItPmRvd25fcmVwX3JlY3YsIDAsIHNpemVvZihzdHJ1Y3QgZHJtX2RwX3NpZGViYW5k X21zZ19yeCkpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlkcm1fZHBfc2lkZWJhbmRfcGFyc2Vf cmVwbHkoJm1nci0+ZG93bl9yZXBfcmVjdiwgJnR4bXNnLT5yZXBseSk7CisJCWlmICh0eG1zZy0+ cmVwbHkucmVwbHlfdHlwZSA9PSAxKSB7CisJCQlEUk1fREVCVUdfS01TKCJHb3QgTkFLIHJlcGx5 OiByZXEgMHglMDJ4LCByZWFzb24gMHglMDJ4LCBuYWsgZGF0YSAweCUwMnhcbiIsIHR4bXNnLT5y ZXBseS5yZXFfdHlwZSwgdHhtc2ctPnJlcGx5LnUubmFrLnJlYXNvbiwgdHhtc2ctPnJlcGx5LnUu bmFrLm5ha19kYXRhKTsKKwkJfSBlbHNlIGlmICh0eG1zZy0+cmVwbHkucmVxX3R5cGUgPT0gRFBf RU5VTV9QQVRIX1JFU09VUkNFUykgeworCQkJZHJtX2RwX3VwZGF0ZV9wb3J0X3Bibihtc3RiLCB0 eG1zZy0+cmVwbHkudS5wYXRoX3Jlc291cmNlcy5wb3J0X251bWJlciwgdHhtc2ctPnJlcGx5LnUu cGF0aF9yZXNvdXJjZXMuYXZhaWxfcGF5bG9hZF9id19udW1iZXIpOworCQl9CisKKwkJZHJtX2Rw X3B1dF9tc3RfYnJhbmNoX2RldmljZShtc3RiKTsKKworCQltZW1zZXQoJm1nci0+ZG93bl9yZXBf cmVjdiwgMCwgc2l6ZW9mKHN0cnVjdCBkcm1fZHBfc2lkZWJhbmRfbXNnX3J4KSk7CisJCXR4bXNn LT5zdGF0ZSA9IERSTV9EUF9TSURFQkFORF9UWF9SWDsKKworCQlwcm9jZXNzX3NpbmdsZV9kb3du X3R4KG1ncik7CisKKwkJd2FrZV91cCgmbWdyLT50eF93YWl0cSk7CisJfQorCXJldHVybiByZXQ7 Cit9CisKK3N0YXRpYyBpbnQgZHJtX2RwX21zdF9oYW5kbGVfdXBfcmVxKHN0cnVjdCBkcm1fZHBf bXN0X3RvcG9sb2d5X21nciAqbWdyKQoreworCWludCByZXQgPSAwOworCWRybV9kcF9nZXRfb25l X3NiX21zZyhtZ3IsIHRydWUpOworCisJaWYgKG1nci0+dXBfcmVxX3JlY3YuaGF2ZV9lb210KSB7 CisJCXN0cnVjdCBkcm1fZHBfc2lkZWJhbmRfbXNnX3JlcV9ib2R5IG1zZzsKKwkJc3RydWN0IGRy bV9kcF9tc3RfYnJhbmNoICptc3RiOworCQlib29sIHNlcW5vOworCQltc3RiID0gZHJtX2RwX2dl dF9tc3RfYnJhbmNoX2RldmljZShtZ3IsCisJCQkJCQkgICAgbWdyLT51cF9yZXFfcmVjdi5pbml0 aWFsX2hkci5sY3QsCisJCQkJCQkgICAgbWdyLT51cF9yZXFfcmVjdi5pbml0aWFsX2hkci5yYWQp OworCQlpZiAoIW1zdGIpIHsKKwkJCURSTV9ERUJVR19LTVMoIkdvdCBNU1QgcmVwbHkgZnJvbSB1 bmtub3duIGRldmljZSAlZFxuIiwgbWdyLT51cF9yZXFfcmVjdi5pbml0aWFsX2hkci5sY3QpOwor CQkJbWVtc2V0KCZtZ3ItPnVwX3JlcV9yZWN2LCAwLCBzaXplb2Yoc3RydWN0IGRybV9kcF9zaWRl YmFuZF9tc2dfcngpKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJc2Vxbm8gPSBtZ3ItPnVwX3Jl cV9yZWN2LmluaXRpYWxfaGRyLnNlcW5vOworCQlkcm1fZHBfc2lkZWJhbmRfcGFyc2VfcmVxKCZt Z3ItPnVwX3JlcV9yZWN2LCAmbXNnKTsKKworCQlpZiAobXNnLnJlcV90eXBlID09IERQX0NPTk5F Q1RJT05fU1RBVFVTX05PVElGWSkgeworCQkJZHJtX2RwX3NlbmRfdXBfYWNrX3JlcGx5KG1nciwg bXN0YiwgbXNnLnJlcV90eXBlLCBzZXFubywgZmFsc2UpOworCQkJZHJtX2RwX3VwZGF0ZV9wb3J0 KG1zdGIsICZtc2cudS5jb25uX3N0YXQpOworCQkJRFJNX0RFQlVHX0tNUygiR290IENTTjogcG46 ICVkIGxkcHM6JWQgZGRwczogJWQgbWNzOiAlZCBpcDogJWQgcGR0OiAlZFxuIiwgbXNnLnUuY29u bl9zdGF0LnBvcnRfbnVtYmVyLCBtc2cudS5jb25uX3N0YXQubGVnYWN5X2RldmljZV9wbHVnX3N0 YXR1cywgbXNnLnUuY29ubl9zdGF0LmRpc3BsYXlwb3J0X2RldmljZV9wbHVnX3N0YXR1cywgbXNn LnUuY29ubl9zdGF0Lm1lc3NhZ2VfY2FwYWJpbGl0eV9zdGF0dXMsIG1zZy51LmNvbm5fc3RhdC5p bnB1dF9wb3J0LCBtc2cudS5jb25uX3N0YXQucGVlcl9kZXZpY2VfdHlwZSk7CisJCQlyZXQgPSAx OworCQl9IGVsc2UgaWYgKG1zZy5yZXFfdHlwZSA9PSBEUF9SRVNPVVJDRV9TVEFUVVNfTk9USUZZ KSB7CisJCQlkcm1fZHBfc2VuZF91cF9hY2tfcmVwbHkobWdyLCBtc3RiLCBtc2cucmVxX3R5cGUs IHNlcW5vLCBmYWxzZSk7CisJCQlEUk1fREVCVUdfS01TKCJHb3QgUlNOOiBwbjogJWQgYXZhaWxf cGJuICVkXG4iLCBtc2cudS5yZXNvdXJjZV9zdGF0LnBvcnRfbnVtYmVyLCBtc2cudS5yZXNvdXJj ZV9zdGF0LmF2YWlsYWJsZV9wYm4pOworCQl9CisKKwkJZHJtX2RwX3B1dF9tc3RfYnJhbmNoX2Rl dmljZShtc3RiKTsKKwkJbWVtc2V0KCZtZ3ItPnVwX3JlcV9yZWN2LCAwLCBzaXplb2Yoc3RydWN0 IGRybV9kcF9zaWRlYmFuZF9tc2dfcngpKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworaW50IGRy bV9kcF9tc3RfaHBkX2lycShzdHJ1Y3QgZHJtX2RwX21zdF90b3BvbG9neV9tZ3IgKm1nciwgaW50 IGlycV92ZWN0b3IpCit7CisJaW50IGFja192YWx1ZSA9IDA7CisJaW50IHJldCA9IDA7CisJbXV0 ZXhfbG9jaygmbWdyLT5sb2NrKTsKKworCWlmIChpcnFfdmVjdG9yICYgRFBfRE9XTl9SRVBfTVNH X1JEWSkgeworCQlyZXQgPSBkcm1fZHBfbXN0X2hhbmRsZV9kb3duX3JlcChtZ3IpOworCQlhY2tf dmFsdWUgfD0gRFBfRE9XTl9SRVBfTVNHX1JEWTsKKwl9CisKKwlpZiAoaXJxX3ZlY3RvciAmIERQ X1VQX1JFUV9NU0dfUkRZKSB7CisJCXJldCB8PSBkcm1fZHBfbXN0X2hhbmRsZV91cF9yZXEobWdy KTsKKwkJYWNrX3ZhbHVlIHw9IERQX1VQX1JFUV9NU0dfUkRZOworCX0KKworCWRybV9kcF9kcGNk X3dyaXRlYihtZ3ItPmF1eCwgRFBfREVWSUNFX1NFUlZJQ0VfSVJRX1ZFQ1RPUl9FU0kwLAorCQkJ ICAgYWNrX3ZhbHVlKTsKKworCW11dGV4X3VubG9jaygmbWdyLT5sb2NrKTsKKwlyZXR1cm4gcmV0 OworfQorRVhQT1JUX1NZTUJPTChkcm1fZHBfbXN0X2hwZF9pcnEpOworCisvKiBIQUNLUyAqLwor ZW51bSBkcm1fY29ubmVjdG9yX3N0YXR1cyBkcm1fZHBfbXN0X2RldGVjdF9wb3J0KHN0cnVjdCBk cm1fZHBfbXN0X3RvcG9sb2d5X21nciAqbWdyLCBzdHJ1Y3QgZHJtX2RwX21zdF9wb3J0ICpwb3J0 KQoreworCWVudW0gZHJtX2Nvbm5lY3Rvcl9zdGF0dXMgc3RhdHVzID0gY29ubmVjdG9yX3N0YXR1 c19kaXNjb25uZWN0ZWQ7CisKKwlpZiAoIXBvcnQtPmRkcHMpCisJCWdvdG8gb3V0OworCisJc3dp dGNoIChwb3J0LT5wZHQpIHsKKwljYXNlIERQX1BFRVJfREVWSUNFX05PTkU6CisJY2FzZSBEUF9Q RUVSX0RFVklDRV9NU1RfQlJBTkNISU5HOgorCQlicmVhazsKKworCWNhc2UgRFBfUEVFUl9ERVZJ Q0VfU1NUX1NJTks6CisJCXN0YXR1cyA9IGNvbm5lY3Rvcl9zdGF0dXNfY29ubmVjdGVkOworCQli cmVhazsKKwljYXNlIERQX1BFRVJfREVWSUNFX0RQX0xFR0FDWV9DT05WOgorCQlpZiAocG9ydC0+ bGRwcykKKwkJCXN0YXR1cyA9IGNvbm5lY3Rvcl9zdGF0dXNfY29ubmVjdGVkOworCQlicmVhazsK Kwl9CitvdXQ6CisJcmV0dXJuIHN0YXR1czsKK30KK0VYUE9SVF9TWU1CT0woZHJtX2RwX21zdF9k ZXRlY3RfcG9ydCk7CisKK3N0cnVjdCBlZGlkICpkcm1fZHBfbXN0X2dldF9lZGlkKHN0cnVjdCBk cm1fY29ubmVjdG9yICpjb25uZWN0b3IsIHN0cnVjdCBkcm1fZHBfbXN0X3RvcG9sb2d5X21nciAq bWdyLCBzdHJ1Y3QgZHJtX2RwX21zdF9wb3J0ICpwb3J0KQoreworCXN0cnVjdCBlZGlkICplZGlk ID0gTlVMTDsKKworCWVkaWQgPSBkcm1fZ2V0X2VkaWQoY29ubmVjdG9yLCAmcG9ydC0+YXV4LmRk Yyk7CisJcmV0dXJuIGVkaWQ7Cit9CitFWFBPUlRfU1lNQk9MKGRybV9kcF9tc3RfZ2V0X2VkaWQp OworCitzdGF0aWMgaW50IGRybV9kcF9pbml0X3ZjcGkoc3RydWN0IGRybV9kcF9tc3RfdG9wb2xv Z3lfbWdyICptZ3IsCisJCQkgICAgc3RydWN0IGRybV9kcF92Y3BpICp2Y3BpLCBpbnQgcGJuLCBp bnQgZm9yY2UpCit7CisJaW50IG51bV9zbG90czsKKwlpbnQgcmV0OworCisJbnVtX3Nsb3RzID0g RElWX1JPVU5EX1VQKHBibiwgbWdyLT5wYm5fZGl2KTsKKworCWlmIChudW1fc2xvdHMgPiBtZ3It PmF2YWlsX3Nsb3RzKQorCQlyZXR1cm4gLUVOT1NQQzsKKworCXJldCA9IGRybV9kcF9tc3RfYXNz aWduX3BheWxvYWRfaWQobWdyLCBmb3JjZSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7 CisKKwl2Y3BpLT52Y3BpID0gcmV0OworCXZjcGktPnBibiA9IHBibjsKKwl2Y3BpLT5hbGlnbmVk X3BibiA9IG51bV9zbG90cyAqIG1nci0+cGJuX2RpdjsKKwl2Y3BpLT5udW1fc2xvdHMgPSBudW1f c2xvdHM7CisKKwltZ3ItPnByb3Bvc2VkX3ZjcGlzW3JldF0gPSB2Y3BpOworCXJldHVybiAwOwor fQorCitib29sIGRybV9kcF9tc3RfYWxsb2NhdGVfdmNwaShzdHJ1Y3QgZHJtX2RwX21zdF90b3Bv bG9neV9tZ3IgKm1nciwgc3RydWN0IGRybV9kcF9tc3RfcG9ydCAqcG9ydCwgaW50IHBibiwgaW50 ICpzbG90cywgaW50IGZvcmNlX292ZXJyaWRlKQoreworCWludCByZXQ7CisKKwlpZiAocGJuID09 IHBvcnQtPnZjcGkucGJuKSB7CisJCURSTV9ERUJVR19LTVMoImFscmVhZHkgaGF2ZSB2Y3BpIGFs bG9jYXRlZCBmb3IgcGJuICVkXG4iLCBwYm4pOworCQkqc2xvdHMgPSBwb3J0LT52Y3BpLm51bV9z bG90czsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJcmV0ID0gZHJtX2RwX2luaXRfdmNwaShtZ3Is ICZwb3J0LT52Y3BpLCBwYm4sIGZvcmNlX292ZXJyaWRlKTsKKwlpZiAocmV0KSB7CisJCURSTV9E RUJVR19LTVMoImZhaWxlZCB0byBpbml0IHZjcGkgJWQgJWQgJWRcbiIsIERJVl9ST1VORF9VUChw Ym4sIG1nci0+cGJuX2RpdiksIG1nci0+YXZhaWxfc2xvdHMsIHJldCk7CisJCWdvdG8gb3V0Owor CX0KKwlEUk1fREVCVUdfS01TKCJpbml0aW5nIHZjcGkgZm9yICVkICVkXG4iLCBwYm4sIHBvcnQt PnZjcGkubnVtX3Nsb3RzKTsKKwkqc2xvdHMgPSBwb3J0LT52Y3BpLm51bV9zbG90czsKKworCXJl dHVybiB0cnVlOworb3V0OgorCXJldHVybiBmYWxzZTsKK30KK0VYUE9SVF9TWU1CT0woZHJtX2Rw X21zdF9hbGxvY2F0ZV92Y3BpKTsKKworc3RhdGljIHZvaWQgZHJtX2RwX2Rlc3Ryb3lfdmNwaShz dHJ1Y3QgZHJtX2RwX21zdF90b3BvbG9neV9tZ3IgKm1nciwKKwkJCQlzdHJ1Y3QgZHJtX2RwX3Zj cGkgKnZjcGkpCit7CisKKwlkcm1fZHBfbXN0X3B1dF9wYXlsb2FkX2lkKG1nciwgdmNwaS0+dmNw aSk7CisJdmNwaS0+bnVtX3Nsb3RzID0gdmNwaS0+cGJuID0gdmNwaS0+YWxpZ25lZF9wYm4gPSAw OworfQorCit2b2lkIGRybV9kcF9tc3RfZGVhbGxvY2F0ZV92Y3BpKHN0cnVjdCBkcm1fZHBfbXN0 X3RvcG9sb2d5X21nciAqbWdyLCBzdHJ1Y3QgZHJtX2RwX21zdF9wb3J0ICpwb3J0KQoreworCW1n ci0+cHJvcG9zZWRfdmNwaXNbcG9ydC0+dmNwaS52Y3BpXSA9IE5VTEw7CisJZHJtX2RwX2Rlc3Ry b3lfdmNwaShtZ3IsICZwb3J0LT52Y3BpKTsKKwlwb3J0LT52Y3BpLnZjcGkgPSAtMTsKK30KK0VY UE9SVF9TWU1CT0woZHJtX2RwX21zdF9kZWFsbG9jYXRlX3ZjcGkpOworCitzdGF0aWMgaW50IGRy bV9kcF9kcGNkX3dyaXRlX3BheWxvYWQoc3RydWN0IGRybV9kcF9tc3RfdG9wb2xvZ3lfbWdyICpt Z3IsCisJCQkJICAgICBpbnQgaWQsIHN0cnVjdCBkcm1fZHBfcGF5bG9hZCAqcGF5bG9hZCkKK3sK Kwl1OCBwYXlsb2FkX2FsbG9jWzNdLCBzdGF0dXM7CisJaW50IHJldDsKKwlpbnQgcmV0cmllcyA9 IDA7CisKKwlkcm1fZHBfZHBjZF93cml0ZWIobWdyLT5hdXgsIERQX1BBWUxPQURfVEFCTEVfVVBE QVRFX1NUQVRVUywKKwkJCSAgIERQX1BBWUxPQURfVEFCTEVfVVBEQVRFRCk7CisKKwlwYXlsb2Fk X2FsbG9jWzBdID0gaWQ7CisJcGF5bG9hZF9hbGxvY1sxXSA9IHBheWxvYWQtPnN0YXJ0X3Nsb3Q7 CisJcGF5bG9hZF9hbGxvY1syXSA9IHBheWxvYWQtPm51bV9zbG90czsKKworCXJldCA9IGRybV9k cF9kcGNkX3dyaXRlKG1nci0+YXV4LCBEUF9QQVlMT0FEX0FMTE9DQVRFX1NFVCwgcGF5bG9hZF9h bGxvYywgMyk7CisJaWYgKHJldCAhPSAzKSB7CisJCURSTV9ERUJVR19LTVMoImZhaWxlZCB0byB3 cml0ZSBwYXlsb2FkIGFsbG9jYXRpb24gJWRcbiIsIHJldCk7CisJCWdvdG8gZmFpbDsKKwl9CisK KyByZXRyeToKKwlyZXQgPSBkcm1fZHBfZHBjZF9yZWFkYihtZ3ItPmF1eCwgRFBfUEFZTE9BRF9U QUJMRV9VUERBVEVfU1RBVFVTLCAmc3RhdHVzKTsKKwlpZiAocmV0IDwgMCkgeworCQlEUk1fREVC VUdfS01TKCJmYWlsZWQgdG8gcmVhZCBwYXlsb2FkIHRhYmxlIHN0YXR1cyAlZFxuIiwgcmV0KTsK KwkJZ290byBmYWlsOworCX0KKworCWlmICghKHN0YXR1cyAmIERQX1BBWUxPQURfVEFCTEVfVVBE QVRFRCkpIHsKKwkJaWYgKHJldHJpZXMrKyA8IDUpIHsKKwkJCXVkZWxheSgxMCk7CisJCQlnb3Rv IHJldHJ5OworCQl9CisJCURSTV9ERUJVR19LTVMoInN0YXR1cyBub3Qgc2V0IGFmdGVyIHJlYWQg cGF5bG9hZCB0YWJsZSBzdGF0dXMgJWRcbiIsIHN0YXR1cyk7CisJCXJldCA9IC1FSU5WQUw7CisJ CWdvdG8gZmFpbDsKKwl9CisJcmV0ID0gMDsKK2ZhaWw6CisJcmV0dXJuIHJldDsKK30KKworaW50 IGRybV9kcF9jaGVja19hY3Rfc3RhdHVzKHN0cnVjdCBkcm1fZHBfbXN0X3RvcG9sb2d5X21nciAq bWdyKQoreworCXU4IHN0YXR1czsKKwlpbnQgcmV0OworCWludCBjb3VudCA9IDA7CisKKwlkbyB7 CisJCXJldCA9IGRybV9kcF9kcGNkX3JlYWRiKG1nci0+YXV4LCBEUF9QQVlMT0FEX1RBQkxFX1VQ REFURV9TVEFUVVMsICZzdGF0dXMpOworCQlpZiAocmV0IDwgMCkgeworCQkJRFJNX0RFQlVHX0tN UygiZmFpbGVkIHRvIHJlYWQgcGF5bG9hZCB0YWJsZSBzdGF0dXMgJWRcbiIsIHJldCk7CisJCQln b3RvIGZhaWw7CisJCX0KKworCQlpZiAoc3RhdHVzICYgRFBfUEFZTE9BRF9BQ1RfSEFORExFRCkK KwkJCWJyZWFrOworCQljb3VudCsrOworCQl1ZGVsYXkoMTAwKTsKKworCX0gd2hpbGUgKGNvdW50 IDwgMzApOworCisJaWYgKCEoc3RhdHVzICYgRFBfUEFZTE9BRF9BQ1RfSEFORExFRCkpIHsKKwkJ RFJNX0RFQlVHX0tNUygiZmFpbGVkIHRvIGdldCBBQ1QgYml0ICVkIGFmdGVyICVkIHJldHJpZXNc biIsIHN0YXR1cywgY291bnQpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGZhaWw7CisJfQor CXJldHVybiAwOworZmFpbDoKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChkcm1fZHBf Y2hlY2tfYWN0X3N0YXR1cyk7CisKK2ludCBkcm1fZHBfY2FsY19wYm5fbW9kZShpbnQgY2xvY2ss IGludCBicHApCit7CisJZml4ZWQyMF8xMiBwaXhfYnc7CisJZml4ZWQyMF8xMiBmYnBwOworCWZp eGVkMjBfMTIgcmVzdWx0OworCWZpeGVkMjBfMTIgbWFyZ2luLCB0bXA7CisJdTMyIHJlczsKKwor CXBpeF9idy5mdWxsID0gZGZpeGVkX2NvbnN0KGNsb2NrKTsKKwlmYnBwLmZ1bGwgPSBkZml4ZWRf Y29uc3QoYnBwKTsKKwl0bXAuZnVsbCA9IGRmaXhlZF9jb25zdCg4KTsKKwlmYnBwLmZ1bGwgPSBk Zml4ZWRfZGl2KGZicHAsIHRtcCk7CisKKwlyZXN1bHQuZnVsbCA9IGRmaXhlZF9tdWwocGl4X2J3 LCBmYnBwKTsKKwltYXJnaW4uZnVsbCA9IGRmaXhlZF9jb25zdCg1NCk7CisJdG1wLmZ1bGwgPSBk Zml4ZWRfY29uc3QoNjQpOworCW1hcmdpbi5mdWxsID0gZGZpeGVkX2RpdihtYXJnaW4sIHRtcCk7 CisJcmVzdWx0LmZ1bGwgPSBkZml4ZWRfZGl2KHJlc3VsdCwgbWFyZ2luKTsKKworCW1hcmdpbi5m dWxsID0gZGZpeGVkX2NvbnN0KDEwMDYpOworCXRtcC5mdWxsID0gZGZpeGVkX2NvbnN0KDEwMDAp OworCW1hcmdpbi5mdWxsID0gZGZpeGVkX2RpdihtYXJnaW4sIHRtcCk7CisJcmVzdWx0LmZ1bGwg PSBkZml4ZWRfbXVsKHJlc3VsdCwgbWFyZ2luKTsKKworCXJlc3VsdC5mdWxsID0gZGZpeGVkX2Rp dihyZXN1bHQsIHRtcCk7CisJcmVzdWx0LmZ1bGwgPSBkZml4ZWRfY2VpbChyZXN1bHQpOworCXJl cyA9IGRmaXhlZF90cnVuYyhyZXN1bHQpOworCXJldHVybiByZXM7Cit9CitFWFBPUlRfU1lNQk9M KGRybV9kcF9jYWxjX3Bibl9tb2RlKTsKKworc3RhdGljIGludCB0ZXN0X2NhbGNfcGJuX21vZGUo dm9pZCkKK3sKKwlpbnQgcmV0OworCXJldCA9IGRybV9kcF9jYWxjX3Bibl9tb2RlKDE1NDAwMCwg MzApOworCWlmIChyZXQgIT0gNjg5KQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXQgPSBkcm1fZHBf Y2FsY19wYm5fbW9kZSgyMzQwMDAsIDMwKTsKKwlpZiAocmV0ICE9IDEwNDcpCisJCXJldHVybiAt RUlOVkFMOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vZHJtX2RwX21z dF9oZWxwZXIuaCBiL2luY2x1ZGUvZHJtL2RybV9kcF9tc3RfaGVscGVyLmgKbmV3IGZpbGUgbW9k ZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjkwZjNjZAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1 ZGUvZHJtL2RybV9kcF9tc3RfaGVscGVyLmgKQEAgLTAsMCArMSw0MDMgQEAKKy8qCisgKiBDb3B5 cmlnaHQgwqkgMjAxNCBSZWQgSGF0LgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBt b2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworICogZG9j dW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUs IHByb3ZpZGVkIHRoYXQKKyAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBh bGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQKKyAqIG5vdGljZSBhbmQgdGhp cyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBh bmQKKyAqIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vdCBiZSB1c2Vk IGluIGFkdmVydGlzaW5nIG9yCisgKiBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRp b24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsCisgKiB3cml0dGVuIHByaW9yIHBl cm1pc3Npb24uICBUaGUgY29weXJpZ2h0IGhvbGRlcnMgbWFrZSBubyByZXByZXNlbnRhdGlvbnMK KyAqIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9z ZS4gIEl0IGlzIHByb3ZpZGVkICJhcworICogaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVk IHdhcnJhbnR5LgorICoKKyAqIFRIRSBDT1BZUklHSFQgSE9MREVSUyBESVNDTEFJTSBBTEwgV0FS UkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAorICogSU5DTFVESU5HIEFMTCBJ TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTwor ICogRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIFNQ RUNJQUwsIElORElSRUNUIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFH RVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwKKyAqIERBVEEgT1IgUFJP RklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RI RVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBX SVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UKKyAqIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKyNp Zm5kZWYgX0RSTV9EUF9NU1RfSEVMUEVSX0hfCisjZGVmaW5lIF9EUk1fRFBfTVNUX0hFTFBFUl9I XworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxkcm0vZHJtX2RwX2hlbHBl ci5oPgorCitzdHJ1Y3QgZHJtX2RwX21zdF9icmFuY2g7CisKKy8qIHZwY2kgY2hhbm5lbCBpbmZv ICovCitzdHJ1Y3QgZHJtX2RwX3ZjcGkgeworCWludCB2Y3BpOworCWludCBwYm47CisJaW50IGFs aWduZWRfcGJuOworCWludCBudW1fc2xvdHM7CisJc3RydWN0IGxpc3RfaGVhZCBuZXh0OworfTsK KworLyogZGlzcGxheSBwb3J0IE1TVCBwb3J0ICovCitzdHJ1Y3QgZHJtX2RwX21zdF9wb3J0IHsK KwlzdHJ1Y3Qga3JlZiBrcmVmOworCisJLyogaWYgZHBjZCAxLjIgZGV2aWNlIGlzIG9uIHRoaXMg cG9ydCAtIGl0cyBHVUlEIGluZm8gKi8KKwlib29sIGd1aWRfdmFsaWQ7CisJdTggZ3VpZFsxNl07 CisKKwl1OCBwb3J0X251bTsKKwlib29sIGlucHV0OworCWJvb2wgbWNzOworCWJvb2wgZGRwczsK Kwl1OCBwZHQ7CisJYm9vbCBsZHBzOworCXU4IGRwY2RfcmV2OworCXVpbnQ4X3QgZHBjZFtEUF9S RUNFSVZFUl9DQVBfU0laRV07CisJdWludDE2X3QgYXZhaWxhYmxlX3BibjsKKwlzdHJ1Y3QgbGlz dF9oZWFkIG5leHQ7CisJc3RydWN0IGRybV9kcF9tc3RfYnJhbmNoICptc3RiOyAvKiBwb2ludGVy IHRvIGFuIG1zdGIgaWYgdGhpcyBwb3J0IGhhcyBvbmUgKi8KKwlzdHJ1Y3QgZHJtX2RwX2F1eCBh dXg7IC8qIGkyYyBidXMgZm9yIHRoaXMgcG9ydD8gKi8KKwlzdHJ1Y3QgZHJtX2RwX21zdF9icmFu Y2ggKnBhcmVudDsKKworCXN0cnVjdCBkcm1fZHBfdmNwaSB2Y3BpOworCXN0cnVjdCBkcm1fY29u bmVjdG9yICpjb25uZWN0b3I7Cit9OworCisvKiBsaXN0IG9mIE1TVCBicmFuY2ggZGV2aWNlcyB3 ZSBrbm93IGFib3V0ICovCisvKiB3ZSBjYW4gb25seSBoYXZlIHR3byBvdXRzdGFuZGluZyB1biBh Y2sgbXNncyBmb3IKKyAgIGVhY2ggTVNUIGRldmljZSAqLworc3RydWN0IGRybV9kcF9tc3RfYnJh bmNoIHsKKwlzdHJ1Y3Qga3JlZiBrcmVmOworCXU4IHJhZFs4XTsKKwl1OCBsY3Q7CisJaW50IG51 bV9wb3J0czsKKworCWludCBtc2dfc2xvdHM7CisJc3RydWN0IGxpc3RfaGVhZCBwb3J0czsKKwl1 OCBmYWlsOworCS8qIGxpc3Qgb2YgdHggb3BzIHF1ZXVlIGZvciB0aGlzIHBvcnQgKi8KKwlib29s IHBhcmVudF9pc19wb3J0OworCXN0cnVjdCBkcm1fZHBfbXN0X3BvcnQgKnBvcnRfcGFyZW50Owor CXN0cnVjdCBkcm1fZHBfbXN0X3RvcG9sb2d5X21nciAqbWdyOworCisJc3BpbmxvY2tfdCBzbG90 c19sb2NrOworCXN0cnVjdCBkcm1fZHBfc2lkZWJhbmRfbXNnX3R4ICp0eF9zbG90c1syXTsKK307 CisKKworLyogc2lkZWJhbmQgbXNnIGhlYWRlciAtIG5vdCBiaXQgc3RydWN0ICovCitzdHJ1Y3Qg ZHJtX2RwX3NpZGViYW5kX21zZ19oZHIgeworCXU4IGxjdDsKKwl1OCBsY3I7CisJdTggcmFkWzhd OworCWJvb2wgYnJvYWRjYXN0OworCWJvb2wgcGF0aF9tc2c7CisJdTggbXNnX2xlbjsKKwlib29s IHNvbXQ7CisJYm9vbCBlb210OworCWJvb2wgc2Vxbm87Cit9OworCitzdHJ1Y3QgZHJtX2RwX25h a19yZXBseSB7CisJdTggZ3VpZFsxNl07CisJdTggcmVhc29uOworCXU4IG5ha19kYXRhOworfTsK Kworc3RydWN0IGRybV9kcF9saW5rX2FkZHJlc3NfYWNrX3JlcGx5IHsKKwl1OCBndWlkWzE2XTsK Kwl1OCBucG9ydHM7CisJc3RydWN0IGRybV9kcF9saW5rX2FkZHJfcmVwbHlfcG9ydCB7CisJCWJv b2wgaW5wdXRfcG9ydDsKKwkJdTggcGVlcl9kZXZpY2VfdHlwZTsKKwkJdTggcG9ydF9udW1iZXI7 CisJCWJvb2wgbWNzOworCQlib29sIGRkcHM7CisJCWJvb2wgbGVnYWN5X2RldmljZV9wbHVnX3N0 YXR1czsKKwkJdTggZHBjZF9yZXZpc2lvbjsKKwkJdTggcGVlcl9ndWlkWzE2XTsKKwkJYm9vbCBu dW1fc2RwX3N0cmVhbXM7CisJCWJvb2wgbnVtX3NkcF9zdHJlYW1fc2lua3M7CisJfSBwb3J0c1sx Nl07Cit9OworCitzdHJ1Y3QgZHJtX2RwX3JlbW90ZV9kcGNkX3JlYWRfYWNrX3JlcGx5IHsKKwl1 OCBwb3J0X251bWJlcjsKKwl1OCBudW1fYnl0ZXM7CisJdTggYnl0ZXNbMjU1XTsKK307CisKK3N0 cnVjdCBkcm1fZHBfcmVtb3RlX2RwY2Rfd3JpdGVfYWNrX3JlcGx5IHsKKwl1OCBwb3J0X251bWJl cjsKK307CisKK3N0cnVjdCBkcm1fZHBfcmVtb3RlX2RwY2Rfd3JpdGVfbmFrX3JlcGx5IHsKKwl1 OCBwb3J0X251bWJlcjsKKwl1OCByZWFzb247CisJdTggYnl0ZXNfd3JpdHRlbl9iZWZvcmVfZmFp bHVyZTsKK307CisKK3N0cnVjdCBkcm1fZHBfcmVtb3RlX2kyY19yZWFkX2Fja19yZXBseSB7CisJ dTggcG9ydF9udW1iZXI7CisJdTggbnVtX2J5dGVzOworCXU4IGJ5dGVzWzI1NV07Cit9OworCitz dHJ1Y3QgZHJtX2RwX3JlbW90ZV9pMmNfcmVhZF9uYWtfcmVwbHkgeworCXU4IHBvcnRfbnVtYmVy OworCXU4IG5ha19yZWFzb247CisJdTggaTJjX25ha190cmFuc2FjdGlvbjsKK307CisKK3N0cnVj dCBkcm1fZHBfcmVtb3RlX2kyY193cml0ZV9hY2tfcmVwbHkgeworCXU4IHBvcnRfbnVtYmVyOwor fTsKKworCitzdHJ1Y3QgZHJtX2RwX3NpZGViYW5kX21zZ19yeCB7CisJdTggY2h1bmtbNDhdOwor CXU4IG1zZ1syNTZdOworCXU4IGN1cmNodW5rX2xlbjsKKwl1OCBjdXJjaHVua19pZHg7IC8qIGNo dW5rIHdlIGFyZSBwYXJzaW5nIG5vdyAqLworCXU4IGN1cmNodW5rX2hkcmxlbjsKKwl1OCBjdXJs ZW47IC8qIHRvdGFsIGxlbmd0aCBvZiB0aGUgbXNnICovCisJYm9vbCBoYXZlX3NvbXQ7CisJYm9v bCBoYXZlX2VvbXQ7CisJc3RydWN0IGRybV9kcF9zaWRlYmFuZF9tc2dfaGRyIGluaXRpYWxfaGRy OworfTsKKworCitzdHJ1Y3QgZHJtX2RwX2FsbG9jYXRlX3BheWxvYWQgeworCXU4IHBvcnRfbnVt YmVyOworCXU4IG51bWJlcl9zZHBfc3RyZWFtczsKKwl1OCB2Y3BpOworCXUxNiBwYm47CisJdTgg c2RwX3N0cmVhbV9zaW5rWzhdOworfTsKKworc3RydWN0IGRybV9kcF9hbGxvY2F0ZV9wYXlsb2Fk X2Fja19yZXBseSB7CisJdTggcG9ydF9udW1iZXI7CisJdTggdmNwaTsKKwl1MTYgYWxsb2NhdGVk X3BibjsKK307CisKK3N0cnVjdCBkcm1fZHBfY29ubmVjdGlvbl9zdGF0dXNfbm90aWZ5IHsKKwl1 OCBndWlkWzE2XTsKKwl1OCBwb3J0X251bWJlcjsKKwlib29sIGxlZ2FjeV9kZXZpY2VfcGx1Z19z dGF0dXM7CisJYm9vbCBkaXNwbGF5cG9ydF9kZXZpY2VfcGx1Z19zdGF0dXM7CisJYm9vbCBtZXNz YWdlX2NhcGFiaWxpdHlfc3RhdHVzOworCWJvb2wgaW5wdXRfcG9ydDsKKwl1OCBwZWVyX2Rldmlj ZV90eXBlOworfTsKKworc3RydWN0IGRybV9kcF9yZW1vdGVfZHBjZF9yZWFkIHsKKwl1OCBwb3J0 X251bWJlcjsKKwl1MzIgZHBjZF9hZGRyZXNzOworCXU4IG51bV9ieXRlczsKK307CisKK3N0cnVj dCBkcm1fZHBfcmVtb3RlX2RwY2Rfd3JpdGUgeworCXU4IHBvcnRfbnVtYmVyOworCXUzMiBkcGNk X2FkZHJlc3M7CisJdTggbnVtX2J5dGVzOworCXU4IGJ5dGVzWzI1NV07Cit9OworCitzdHJ1Y3Qg ZHJtX2RwX3JlbW90ZV9pMmNfcmVhZCB7CisJdTggbnVtX3RyYW5zYWN0aW9uczsKKwl1OCBwb3J0 X251bWJlcjsKKwlzdHJ1Y3QgeworCQl1OCBpMmNfZGV2X2lkOworCQl1OCBudW1fYnl0ZXM7CisJ CXU4IGJ5dGVzWzI1NV07CisJCXU4IG5vX3N0b3BfYml0OworCQl1OCBpMmNfdHJhbnNhY3Rpb25f ZGVsYXk7CisJfSB0cmFuc2FjdGlvbnNbNF07CisJdTggcmVhZF9pMmNfZGV2aWNlX2lkOworCXU4 IG51bV9ieXRlc19yZWFkOworfTsKKworc3RydWN0IGRybV9kcF9yZW1vdGVfaTJjX3dyaXRlIHsK Kwl1OCBwb3J0X251bWJlcjsKKwl1OCB3cml0ZV9pMmNfZGV2aWNlX2lkOworCXU4IG51bV9ieXRl czsKKwl1OCBieXRlc1syNTVdOworfTsKKworLyogdGhpcyBjb3ZlcnMgRU5VTV9SRVNPVVJDRVMs IFBPV0VSX0RPV05fUEhZLCBQT1dFUl9VUF9QSFkgKi8KK3N0cnVjdCBkcm1fZHBfcG9ydF9udW1i ZXJfcmVxIHsKKwl1OCBwb3J0X251bWJlcjsKK307CisKK3N0cnVjdCBkcm1fZHBfZW51bV9wYXRo X3Jlc291cmNlc19hY2tfcmVwbHkgeworCXU4IHBvcnRfbnVtYmVyOworCXUxNiBmdWxsX3BheWxv YWRfYndfbnVtYmVyOworCXUxNiBhdmFpbF9wYXlsb2FkX2J3X251bWJlcjsKK307CisKKy8qIGNv dmVycyBQT1dFUl9ET1dOX1BIWSwgUE9XRVJfVVBfUEhZICovCitzdHJ1Y3QgZHJtX2RwX3BvcnRf bnVtYmVyX3JlcCB7CisJdTggcG9ydF9udW1iZXI7Cit9OworCitzdHJ1Y3QgZHJtX2RwX3F1ZXJ5 X3BheWxvYWQgeworCXU4IHBvcnRfbnVtYmVyOworCXU4IHZjcGk7Cit9OworCitzdHJ1Y3QgZHJt X2RwX3Jlc291cmNlX3N0YXR1c19ub3RpZnkgeworCXU4IHBvcnRfbnVtYmVyOworCXU4IGd1aWRb MTZdOworCXUxNiBhdmFpbGFibGVfcGJuOworfTsKKworc3RydWN0IGRybV9kcF9xdWVyeV9wYXls b2FkX2Fja19yZXBseSB7CisJdTggcG9ydF9udW1iZXI7CisJdTggYWxsb2NhdGVkX3BibjsKK307 CisKK3N0cnVjdCBkcm1fZHBfc2lkZWJhbmRfbXNnX3JlcV9ib2R5IHsKKwl1OCByZXFfdHlwZTsK Kwl1bmlvbiBhY2tfcmVxIHsKKwkJc3RydWN0IGRybV9kcF9jb25uZWN0aW9uX3N0YXR1c19ub3Rp ZnkgY29ubl9zdGF0OworCQlzdHJ1Y3QgZHJtX2RwX3BvcnRfbnVtYmVyX3JlcSBwb3J0X251bTsK KwkJc3RydWN0IGRybV9kcF9yZXNvdXJjZV9zdGF0dXNfbm90aWZ5IHJlc291cmNlX3N0YXQ7CisK KwkJc3RydWN0IGRybV9kcF9xdWVyeV9wYXlsb2FkIHF1ZXJ5X3BheWxvYWQ7CisJCXN0cnVjdCBk cm1fZHBfYWxsb2NhdGVfcGF5bG9hZCBhbGxvY2F0ZV9wYXlsb2FkOworCisJCXN0cnVjdCBkcm1f ZHBfcmVtb3RlX2RwY2RfcmVhZCBkcGNkX3JlYWQ7CisJCXN0cnVjdCBkcm1fZHBfcmVtb3RlX2Rw Y2Rfd3JpdGUgZHBjZF93cml0ZTsKKworCQlzdHJ1Y3QgZHJtX2RwX3JlbW90ZV9pMmNfcmVhZCBp MmNfcmVhZDsKKwkJc3RydWN0IGRybV9kcF9yZW1vdGVfaTJjX3dyaXRlIGkyY193cml0ZTsKKwl9 IHU7Cit9OworCitzdHJ1Y3QgZHJtX2RwX3NpZGViYW5kX21zZ19yZXBseV9ib2R5IHsKKwl1OCBy ZXBseV90eXBlOworCXU4IHJlcV90eXBlOworCXVuaW9uIGFja19yZXBsaWVzIHsKKwkJc3RydWN0 IGRybV9kcF9uYWtfcmVwbHkgbmFrOworCQlzdHJ1Y3QgZHJtX2RwX2xpbmtfYWRkcmVzc19hY2tf cmVwbHkgbGlua19hZGRyOworCQlzdHJ1Y3QgZHJtX2RwX3BvcnRfbnVtYmVyX3JlcCBwb3J0X251 bWJlcjsKKworCQlzdHJ1Y3QgZHJtX2RwX2VudW1fcGF0aF9yZXNvdXJjZXNfYWNrX3JlcGx5IHBh dGhfcmVzb3VyY2VzOworCQlzdHJ1Y3QgZHJtX2RwX2FsbG9jYXRlX3BheWxvYWRfYWNrX3JlcGx5 IGFsbG9jYXRlX3BheWxvYWQ7CisJCXN0cnVjdCBkcm1fZHBfcXVlcnlfcGF5bG9hZF9hY2tfcmVw bHkgcXVlcnlfcGF5bG9hZDsKKworCQlzdHJ1Y3QgZHJtX2RwX3JlbW90ZV9kcGNkX3JlYWRfYWNr X3JlcGx5IHJlbW90ZV9kcGNkX3JlYWRfYWNrOworCQlzdHJ1Y3QgZHJtX2RwX3JlbW90ZV9kcGNk X3dyaXRlX2Fja19yZXBseSByZW1vdGVfZHBjZF93cml0ZV9hY2s7CisJCXN0cnVjdCBkcm1fZHBf cmVtb3RlX2RwY2Rfd3JpdGVfbmFrX3JlcGx5IHJlbW90ZV9kcGNkX3dyaXRlX25hY2s7CisKKwkJ c3RydWN0IGRybV9kcF9yZW1vdGVfaTJjX3JlYWRfYWNrX3JlcGx5IHJlbW90ZV9pMmNfcmVhZF9h Y2s7CisJCXN0cnVjdCBkcm1fZHBfcmVtb3RlX2kyY19yZWFkX25ha19yZXBseSByZW1vdGVfaTJj X3JlYWRfbmFjazsKKwkJc3RydWN0IGRybV9kcF9yZW1vdGVfaTJjX3dyaXRlX2Fja19yZXBseSBy ZW1vdGVfaTJjX3dyaXRlX2FjazsKKwl9IHU7Cit9OworCisvKiBtc2cgaXMgcXVldWVkIHRvIGJl IHB1dCBpbnRvIGEgc2xvdCAqLworI2RlZmluZSBEUk1fRFBfU0lERUJBTkRfVFhfUVVFVUVEIDAK Ky8qIG1zZyBoYXMgc3RhcnRlZCB0cmFuc21pdHRpbmcgb24gYSBzbG90IC0gc3RpbGwgb24gbXNn cSAqLworI2RlZmluZSBEUk1fRFBfU0lERUJBTkRfVFhfU1RBUlRfU0VORCAxCisvKiBtc2cgaGFz IGZpbmlzaGVkIHRyYW5zbWl0dGluZyBvbiBhIHNsb3QgLSByZW1vdmVkIGZyb20gbXNncSBvbmx5 IGluIHNsb3QgKi8KKyNkZWZpbmUgRFJNX0RQX1NJREVCQU5EX1RYX1NFTlQgMgorLyogbXNnIGhh cyByZWNlaXZlZCBhIHJlc3BvbnNlIC0gcmVtb3ZlZCBmcm9tIHNsb3QgKi8KKyNkZWZpbmUgRFJN X0RQX1NJREVCQU5EX1RYX1JYIDMKKyNkZWZpbmUgRFJNX0RQX1NJREVCQU5EX1RYX1RJTUVPVVQg NAorCitzdHJ1Y3QgZHJtX2RwX3NpZGViYW5kX21zZ190eCB7CisJdTggbXNnWzI1Nl07CisJdTgg Y2h1bmtbNDhdOworCXU4IGN1cl9vZmZzZXQ7CisJdTggY3VyX2xlbjsKKwlzdHJ1Y3QgZHJtX2Rw X21zdF9icmFuY2ggKmRzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIG5leHQ7CisJaW50IHNlcW5vOwor CWludCBzdGF0ZTsKKwlzdHJ1Y3QgZHJtX2RwX3NpZGViYW5kX21zZ19yZXBseV9ib2R5IHJlcGx5 OworfTsKKworLyogc2lkZWJhbmQgbXNnIGhhbmRsZXIgKi8KK3N0cnVjdCBkcm1fZHBfbXN0X3Rv cG9sb2d5X21ncjsKK3N0cnVjdCBkcm1fZHBfbXN0X3RvcG9sb2d5X2NicyB7CisJLyogY3JlYXRl IGEgY29ubmVjdG9yIGZvciBhIHBvcnQgKi8KKwlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqKCphZGRf Y29ubmVjdG9yKShzdHJ1Y3QgZHJtX2RwX21zdF90b3BvbG9neV9tZ3IgKm1nciwgc3RydWN0IGRy bV9kcF9tc3RfcG9ydCAqcG9ydCk7CisJdm9pZCAoKmRlc3Ryb3lfY29ubmVjdG9yKShzdHJ1Y3Qg ZHJtX2RwX21zdF90b3BvbG9neV9tZ3IgKm1nciwKKwkJCQkgIHN0cnVjdCBkcm1fY29ubmVjdG9y ICpjb25uZWN0b3IpOworCXZvaWQgKCpnZW5lcmF0ZV9hY3RfZXZlbnQpKHN0cnVjdCBkcm1fZHBf bXN0X3RvcG9sb2d5X21nciAqbWdyKTsKK307CisKKyNkZWZpbmUgRFBfTUFYX1BBWUxPQUQgKHNp emVvZih1bnNpZ25lZCBsb25nKSAqIDgpCisKKyNkZWZpbmUgRFBfUEFZTE9BRF9MT0NBTCAxCisj ZGVmaW5lIERQX1BBWUxPQURfUkVNT1RFIDIKKworc3RydWN0IGRybV9kcF9wYXlsb2FkIHsKKwlp bnQgcGF5bG9hZF9zdGF0ZTsKKwlpbnQgc3RhcnRfc2xvdDsKKwlpbnQgbnVtX3Nsb3RzOworCXN0 cnVjdCBkcm1fZHBfbXN0X3BvcnQgKnBvcnQ7Cit9OworCitzdHJ1Y3QgZHJtX2RwX21zdF90b3Bv bG9neV9tZ3IgeworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlzdHJ1Y3QgZHJtX2RwX21zdF90b3Bv bG9neV9jYnMgKmNiczsKKwlib29sIG1zdF9zdGF0ZTsKKwlpbnQgbWF4X2RwY2RfdHJhbnNhY3Rp b25fYnl0ZXM7CisJc3RydWN0IGRybV9kcF9hdXggKmF1eDsgLyogYXV4Y2ggZm9yIHRoaXMgdG9w b2xvZ3kgbWdyIHRvIHVzZSAqLworCisJc3RydWN0IG11dGV4IGxvY2s7CisJc3RydWN0IGRybV9k cF9zaWRlYmFuZF9tc2dfcnggZG93bl9yZXBfcmVjdjsKKwlzdHJ1Y3QgZHJtX2RwX3NpZGViYW5k X21zZ19yeCB1cF9yZXFfcmVjdjsKKworCS8qIHBvaW50ZXIgdG8gaW5mbyBhYm91dCB0aGUgaW5p dGlhbCBNU1QgZGV2aWNlICovCisJc3RydWN0IGRybV9kcF9tc3RfYnJhbmNoICptc3RfcHJpbWFy eTsKKworCS8qIHByaW1hcnkgTVNUIGRldmljZSBHVUlEICovCisJYm9vbCBndWlkX3ZhbGlkOwor CXU4IGd1aWRbMTZdOworCisJLyogbWVzc2FnZXMgdG8gYmUgdHJhbnNtaXR0ZWQgKi8KKwlzdHJ1 Y3QgbGlzdF9oZWFkIHR4X21zZ19kb3ducTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHR4X21zZ191cHE7 CisJYm9vbCB0eF9kb3duX2luX3Byb2dyZXNzOworCWJvb2wgdHhfdXBfaW5fcHJvZ3Jlc3M7CisK KwlzdHJ1Y3QgZHJtX2RwX3ZjcGkgKipwcm9wb3NlZF92Y3BpczsKKwlzdHJ1Y3QgZHJtX2RwX3Bh eWxvYWQgKnBheWxvYWRzOworCisJaW50IG1heF9wYXlsb2FkczsKKwl1bnNpZ25lZCBsb25nIHBh eWxvYWRfbWFzazsKKwkvKiBwcm90ZWN0IHRoZSB1cHEvZG93bnEgYW5kIGluX3Byb2dyZXNzICov CisJc3BpbmxvY2tfdCBxbG9jazsKKworCXdhaXRfcXVldWVfaGVhZF90IHR4X3dhaXRxOworCXN0 cnVjdCB3b3JrX3N0cnVjdCB3b3JrOworCisJdTggZHBjZFtEUF9SRUNFSVZFUl9DQVBfU0laRV07 CisJaW50IHBibl9kaXY7CisJaW50IHRvdGFsX3BibjsKKwlpbnQgdG90YWxfc2xvdHM7CisJaW50 IGF2YWlsX3Nsb3RzOworfTsKKworaW50IGRybV9kcF9tc3RfdG9wb2xvZ3lfbWdyX2luaXQoc3Ry dWN0IGRybV9kcF9tc3RfdG9wb2xvZ3lfbWdyICptZ3IsIHN0cnVjdCBkZXZpY2UgKmRldiwgc3Ry dWN0IGRybV9kcF9hdXggKmF1eCwgaW50IG1heF9kcGNkX3RyYW5zYWN0aW9uX2J5dGVzLCBpbnQg bWF4X3BheWxvYWRzKTsKK3ZvaWQgZHJtX2RwX21zdF90b3BvbG9neV9tZ3JfZGVzdHJveShzdHJ1 Y3QgZHJtX2RwX21zdF90b3BvbG9neV9tZ3IgKm1ncik7CitpbnQgZHJtX2RwX21zdF90b3BvbG9n eV9tZ3Jfc2V0X21zdChzdHJ1Y3QgZHJtX2RwX21zdF90b3BvbG9neV9tZ3IgKm1nciwgYm9vbCBt c3Rfc3RhdGUpOworaW50IGRybV9kcF9tc3RfaHBkX2lycShzdHJ1Y3QgZHJtX2RwX21zdF90b3Bv bG9neV9tZ3IgKm1nciwgaW50IGlycV92ZWN0b3IpOworCisvKiBoYWNreSBpbnRlcmZhY2UgZm9y IG5vdyAqLworZW51bSBkcm1fY29ubmVjdG9yX3N0YXR1cyBkcm1fZHBfbXN0X2RldGVjdF9wb3J0 KHN0cnVjdCBkcm1fZHBfbXN0X3RvcG9sb2d5X21nciAqbWdyLCBzdHJ1Y3QgZHJtX2RwX21zdF9w b3J0ICpwb3J0KTsKK3N0cnVjdCBkcm1fY29ubmVjdG9yOworc3RydWN0IGVkaWQgKmRybV9kcF9t c3RfZ2V0X2VkaWQoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3Rvciwgc3RydWN0IGRybV9k cF9tc3RfdG9wb2xvZ3lfbWdyICptZ3IsIHN0cnVjdCBkcm1fZHBfbXN0X3BvcnQgKnBvcnQpOwor aW50IGRybV9kcF9jYWxjX3Bibl9tb2RlKGludCBjbG9jaywgaW50IGJwcCk7CisKK2Jvb2wgZHJt X2RwX21zdF9hbGxvY2F0ZV92Y3BpKHN0cnVjdCBkcm1fZHBfbXN0X3RvcG9sb2d5X21nciAqbWdy LCBzdHJ1Y3QgZHJtX2RwX21zdF9wb3J0ICpwb3J0LCBpbnQgcGJuLCBpbnQgKnNsb3RzLCBpbnQg Zm9yY2Vfb3ZlcnJpZGUpOwordm9pZCBkcm1fZHBfbXN0X2RlYWxsb2NhdGVfdmNwaShzdHJ1Y3Qg ZHJtX2RwX21zdF90b3BvbG9neV9tZ3IgKm1nciwKKwkJCQlzdHJ1Y3QgZHJtX2RwX21zdF9wb3J0 ICpwb3J0KTsKK2ludCBkcm1fZHBfdXBkYXRlX3BheWxvYWRfcGFydDEoc3RydWN0IGRybV9kcF9t c3RfdG9wb2xvZ3lfbWdyICptZ3IpOworaW50IGRybV9kcF91cGRhdGVfcGF5bG9hZF9wYXJ0Mihz dHJ1Y3QgZHJtX2RwX21zdF90b3BvbG9neV9tZ3IgKm1ncik7CitpbnQgZHJtX2RwX2NoZWNrX2Fj dF9zdGF0dXMoc3RydWN0IGRybV9kcF9tc3RfdG9wb2xvZ3lfbWdyICptZ3IpOworCisjZW5kaWYK LS0gCjEuOS4wCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f XwpkcmktZGV2ZWwgbWFpbGluZyBsaXN0CmRyaS1kZXZlbEBsaXN0cy5mcmVlZGVza3RvcC5vcmcK aHR0cDovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2RyaS1kZXZlbAo=