From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-9.8 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 3EEBAC3F68F for ; Wed, 12 Feb 2020 14:41:09 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 1E33F20724 for ; Wed, 12 Feb 2020 14:41:09 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 1E33F20724 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=intel.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=intel-gfx-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id A70466F518; Wed, 12 Feb 2020 14:41:08 +0000 (UTC) Received: from mga17.intel.com (mga17.intel.com [192.55.52.151]) by gabe.freedesktop.org (Postfix) with ESMTPS id 2D7036F513 for ; Wed, 12 Feb 2020 14:41:07 +0000 (UTC) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga006.jf.intel.com ([10.7.209.51]) by fmsmga107.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 12 Feb 2020 06:41:06 -0800 X-IronPort-AV: E=Sophos;i="5.70,433,1574150400"; d="scan'208";a="237725628" Received: from jnikula-mobl3.fi.intel.com (HELO localhost) ([10.237.66.161]) by orsmga006-auth.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 12 Feb 2020 06:41:03 -0800 From: Jani Nikula To: intel-gfx@lists.freedesktop.org Date: Wed, 12 Feb 2020 16:40:57 +0200 Message-Id: <20200212144058.5686-1-jani.nikula@intel.com> X-Mailer: git-send-email 2.20.1 MIME-Version: 1.0 Organization: Intel Finland Oy - BIC 0357606-4 - Westendinkatu 7, 02160 Espoo Subject: [Intel-gfx] [PATCH 1/2] drm/i915: split out vlv/chv specific suspend/resume code X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: jani.nikula@intel.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" aTkxNV9kcnYuYyBpcyBhIGZhaXJseSBiaWcgZmlsZSwgYW5kIGhhdmluZyB2ZXJ5IHNwZWNpZmlj IHZsdi9jaHYKc3VzcGVuZC9yZXN1bWUgY29kZSBpbiBpdCBpcyBhIGRpc3RyYWN0aW9uLiBTcGxp dCBpdCBvdXQgdG8gYSBuZXcKdmx2X3N1c3BlbmQuW2NoXSBmaWxlLgoKU2lnbmVkLW9mZi1ieTog SmFuaSBOaWt1bGEgPGphbmkubmlrdWxhQGludGVsLmNvbT4KLS0tCiBkcml2ZXJzL2dwdS9kcm0v aTkxNS9NYWtlZmlsZSAgICAgIHwgICAzICstCiBkcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Ry di5jICAgIHwgNDk4ICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBkcml2ZXJzL2dwdS9k cm0vaTkxNS9pOTE1X2Rydi5oICAgIHwgICAyIC0KIGRyaXZlcnMvZ3B1L2RybS9pOTE1L3Zsdl9z dXNwZW5kLmMgfCA0ODQgKysrKysrKysrKysrKysrKysrKysrKysrKysrKwogZHJpdmVycy9ncHUv ZHJtL2k5MTUvdmx2X3N1c3BlbmQuaCB8ICAxOCArKwogNSBmaWxlcyBjaGFuZ2VkLCA1MTYgaW5z ZXJ0aW9ucygrKSwgNDg5IGRlbGV0aW9ucygtKQogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMv Z3B1L2RybS9pOTE1L3Zsdl9zdXNwZW5kLmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dw dS9kcm0vaTkxNS92bHZfc3VzcGVuZC5oCgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5 MTUvTWFrZWZpbGUgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9NYWtlZmlsZQppbmRleCA0OWVlZDUw ZWYwYTQuLjg2ZTg4OWE4MmM1NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvTWFr ZWZpbGUKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvTWFrZWZpbGUKQEAgLTU0LDcgKzU0LDgg QEAgaTkxNS15ICs9IGk5MTVfZHJ2Lm8gXAogCSAgaW50ZWxfcnVudGltZV9wbS5vIFwKIAkgIGlu dGVsX3NpZGViYW5kLm8gXAogCSAgaW50ZWxfdW5jb3JlLm8gXAotCSAgaW50ZWxfd2FrZXJlZi5v CisJICBpbnRlbF93YWtlcmVmLm8gXAorCSAgdmx2X3N1c3BlbmQubwogCiAjIGNvcmUgbGlicmFy eSBjb2RlCiBpOTE1LXkgKz0gXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkx NV9kcnYuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZHJ2LmMKaW5kZXggNTE2NTM2MjM0 ZTk3Li5hZmM2ODU5MWU0OGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVf ZHJ2LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuYwpAQCAtODAsNzEgKzgw LDEwIEBACiAjaW5jbHVkZSAiaW50ZWxfY3NyLmgiCiAjaW5jbHVkZSAiaW50ZWxfbWVtb3J5X3Jl Z2lvbi5oIgogI2luY2x1ZGUgImludGVsX3BtLmgiCisjaW5jbHVkZSAidmx2X3N1c3BlbmQuaCIK IAogc3RhdGljIHN0cnVjdCBkcm1fZHJpdmVyIGRyaXZlcjsKIAotc3RydWN0IHZsdl9zMGl4X3N0 YXRlIHsKLQkvKiBHQU0gKi8KLQl1MzIgd3Jfd2F0ZXJtYXJrOwotCXUzMiBnZnhfcHJpb19jdHJs OwotCXUzMiBhcmJfbW9kZTsKLQl1MzIgZ2Z4X3BlbmRfdGxiMDsKLQl1MzIgZ2Z4X3BlbmRfdGxi MTsKLQl1MzIgbHJhX2xpbWl0c1tHRU43X0xSQV9MSU1JVFNfUkVHX05VTV07Ci0JdTMyIG1lZGlh X21heF9yZXFfY291bnQ7Ci0JdTMyIGdmeF9tYXhfcmVxX2NvdW50OwotCXUzMiByZW5kZXJfaHdz cDsKLQl1MzIgZWNvY2hrOwotCXUzMiBic2RfaHdzcDsKLQl1MzIgYmx0X2h3c3A7Ci0JdTMyIHRs Yl9yZF9hZGRyOwotCi0JLyogTUJDICovCi0JdTMyIGczZGN0bDsKLQl1MzIgZ3Nja2djdGw7Ci0J dTMyIG1iY3RsOwotCi0JLyogR0NQICovCi0JdTMyIHVjZ2N0bDE7Ci0JdTMyIHVjZ2N0bDM7Ci0J dTMyIHJjZ2N0bDE7Ci0JdTMyIHJjZ2N0bDI7Ci0JdTMyIHJzdGN0bDsKLQl1MzIgbWlzY2NwY3Rs OwotCi0JLyogR1BNICovCi0JdTMyIGdmeHBhdXNlOwotCXUzMiBycGRldWh3dGM7Ci0JdTMyIHJw ZGV1YzsKLQl1MzIgZWNvYnVzOwotCXUzMiBwd3Jkd251cGN0bDsKLQl1MzIgcnBfZG93bl90aW1l b3V0OwotCXUzMiBycF9kZXVjc3c7Ci0JdTMyIHJjdWJtYWJkdG1yOwotCXUzMiByY2VkYXRhOwot CXUzMiBzcGFyZTJnaDsKLQotCS8qIERpc3BsYXkgMSBDWiBkb21haW4gKi8KLQl1MzIgZ3RfaW1y OwotCXUzMiBndF9pZXI7Ci0JdTMyIHBtX2ltcjsKLQl1MzIgcG1faWVyOwotCXUzMiBndF9zY3Jh dGNoW0dFTjdfR1RfU0NSQVRDSF9SRUdfTlVNXTsKLQotCS8qIEdUIFNBIENaIGRvbWFpbiAqLwot CXUzMiB0aWxlY3RsOwotCXUzMiBndF9maWZvY3RsOwotCXUzMiBndGxjX3dha2VfY3RybDsKLQl1 MzIgZ3RsY19zdXJ2aXZlOwotCXUzMiBwbXdnaWN6OwotCi0JLyogRGlzcGxheSAyIENaIGRvbWFp biAqLwotCXUzMiBndV9jdGwwOwotCXUzMiBndV9jdGwxOwotCXUzMiBwY2JyOwotCXUzMiBjbG9j a19nYXRlX2RpczI7Ci19OwotCiBzdGF0aWMgaW50IGk5MTVfZ2V0X2JyaWRnZV9kZXYoc3RydWN0 IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQogewogCWludCBkb21haW4gPSBwY2lfZG9tYWlu X25yKGRldl9wcml2LT5kcm0ucGRldi0+YnVzKTsKQEAgLTQ0NiwyOSArMzg1LDYgQEAgc3RhdGlj IHZvaWQgaW50ZWxfZGV0ZWN0X3ByZXByb2R1Y3Rpb25faHcoc3RydWN0IGRybV9pOTE1X3ByaXZh dGUgKmRldl9wcml2KQogCX0KIH0KIAotc3RhdGljIGludCB2bHZfYWxsb2NfczBpeF9zdGF0ZShz dHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSkKLXsKLQlpZiAoIUlTX1ZBTExFWVZJRVcoaTkx NSkpCi0JCXJldHVybiAwOwotCi0JLyogd2Ugd3JpdGUgYWxsIHRoZSB2YWx1ZXMgaW4gdGhlIHN0 cnVjdCwgc28gbm8gbmVlZCB0byB6ZXJvIGl0IG91dCAqLwotCWk5MTUtPnZsdl9zMGl4X3N0YXRl ID0ga21hbGxvYyhzaXplb2YoKmk5MTUtPnZsdl9zMGl4X3N0YXRlKSwKLQkJCQkgICAgICAgR0ZQ X0tFUk5FTCk7Ci0JaWYgKCFpOTE1LT52bHZfczBpeF9zdGF0ZSkKLQkJcmV0dXJuIC1FTk9NRU07 Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgdmx2X2ZyZWVfczBpeF9zdGF0ZShzdHJ1 Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSkKLXsKLQlpZiAoIWk5MTUtPnZsdl9zMGl4X3N0YXRl KQotCQlyZXR1cm47Ci0KLQlrZnJlZShpOTE1LT52bHZfczBpeF9zdGF0ZSk7Ci0JaTkxNS0+dmx2 X3MwaXhfc3RhdGUgPSBOVUxMOwotfQotCiBzdGF0aWMgdm9pZCBzYW5pdGl6ZV9ncHUoc3RydWN0 IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUpCiB7CiAJaWYgKCFJTlRFTF9JTkZPKGk5MTUpLT5ncHVf cmVzZXRfY2xvYmJlcnNfZGlzcGxheSkKQEAgLTUxNyw3ICs0MzMsNyBAQCBzdGF0aWMgaW50IGk5 MTVfZHJpdmVyX2Vhcmx5X3Byb2JlKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikK IAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAotCXJldCA9IHZsdl9hbGxvY19zMGl4X3N0 YXRlKGRldl9wcml2KTsKKwlyZXQgPSB2bHZfc3VzcGVuZF9pbml0KGRldl9wcml2KTsKIAlpZiAo cmV0IDwgMCkKIAkJZ290byBlcnJfd29ya3F1ZXVlczsKIApAQCAtNTQ4LDcgKzQ2NCw3IEBAIHN0 YXRpYyBpbnQgaTkxNV9kcml2ZXJfZWFybHlfcHJvYmUoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUg KmRldl9wcml2KQogZXJyX2dlbToKIAlpOTE1X2dlbV9jbGVhbnVwX2Vhcmx5KGRldl9wcml2KTsK IAlpbnRlbF9ndF9kcml2ZXJfbGF0ZV9yZWxlYXNlKCZkZXZfcHJpdi0+Z3QpOwotCXZsdl9mcmVl X3MwaXhfc3RhdGUoZGV2X3ByaXYpOworCXZsdl9zdXNwZW5kX2NsZWFudXAoZGV2X3ByaXYpOwog ZXJyX3dvcmtxdWV1ZXM6CiAJaTkxNV93b3JrcXVldWVzX2NsZWFudXAoZGV2X3ByaXYpOwogCXJl dHVybiByZXQ7CkBAIC01NjUsNyArNDgxLDcgQEAgc3RhdGljIHZvaWQgaTkxNV9kcml2ZXJfbGF0 ZV9yZWxlYXNlKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikKIAlpbnRlbF9wb3dl cl9kb21haW5zX2NsZWFudXAoZGV2X3ByaXYpOwogCWk5MTVfZ2VtX2NsZWFudXBfZWFybHkoZGV2 X3ByaXYpOwogCWludGVsX2d0X2RyaXZlcl9sYXRlX3JlbGVhc2UoJmRldl9wcml2LT5ndCk7Ci0J dmx2X2ZyZWVfczBpeF9zdGF0ZShkZXZfcHJpdik7CisJdmx2X3N1c3BlbmRfY2xlYW51cChkZXZf cHJpdik7CiAJaTkxNV93b3JrcXVldWVzX2NsZWFudXAoZGV2X3ByaXYpOwogCiAJcG1fcW9zX3Jl bW92ZV9yZXF1ZXN0KCZkZXZfcHJpdi0+c2JfcW9zKTsKQEAgLTE2NzMsMTAgKzE1ODksNiBAQCBz dGF0aWMgdm9pZCBpbnRlbF9zdXNwZW5kX2VuY29kZXJzKHN0cnVjdCBkcm1faTkxNV9wcml2YXRl ICpkZXZfcHJpdikKIAlkcm1fbW9kZXNldF91bmxvY2tfYWxsKGRldik7CiB9CiAKLXN0YXRpYyBp bnQgdmx2X3Jlc3VtZV9wcmVwYXJlKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwK LQkJCSAgICAgIGJvb2wgcnBtX3Jlc3VtZSk7Ci1zdGF0aWMgaW50IHZsdl9zdXNwZW5kX2NvbXBs ZXRlKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdik7Ci0KIHN0YXRpYyBib29sIHN1 c3BlbmRfdG9faWRsZShzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCiB7CiAjaWYg SVNfRU5BQkxFRChDT05GSUdfQUNQSV9TTEVFUCkKQEAgLTE3NjMsNyArMTY3NSw3IEBAIHN0YXRp YyBpbnQgaTkxNV9kcm1fc3VzcGVuZF9sYXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGJvb2wg aGliZXJuYXRpb24pCiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gdG9faTkx NShkZXYpOwogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gZGV2X3ByaXYtPmRybS5wZGV2OwogCXN0 cnVjdCBpbnRlbF9ydW50aW1lX3BtICpycG0gPSAmZGV2X3ByaXYtPnJ1bnRpbWVfcG07Ci0JaW50 IHJldCA9IDA7CisJaW50IHJldDsKIAogCWRpc2FibGVfcnBtX3dha2VyZWZfYXNzZXJ0cyhycG0p OwogCkBAIC0xNzc2LDkgKzE2ODgsNyBAQCBzdGF0aWMgaW50IGk5MTVfZHJtX3N1c3BlbmRfbGF0 ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBib29sIGhpYmVybmF0aW9uKQogCiAJaW50ZWxfZGlz cGxheV9wb3dlcl9zdXNwZW5kX2xhdGUoZGV2X3ByaXYpOwogCi0JaWYgKElTX1ZBTExFWVZJRVco ZGV2X3ByaXYpIHx8IElTX0NIRVJSWVZJRVcoZGV2X3ByaXYpKQotCQlyZXQgPSB2bHZfc3VzcGVu ZF9jb21wbGV0ZShkZXZfcHJpdik7Ci0KKwlyZXQgPSB2bHZfc3VzcGVuZF9jb21wbGV0ZShkZXZf cHJpdik7CiAJaWYgKHJldCkgewogCQlkcm1fZXJyKCZkZXZfcHJpdi0+ZHJtLCAiU3VzcGVuZCBj b21wbGV0ZSBmYWlsZWQ6ICVkXG4iLCByZXQpOwogCQlpbnRlbF9wb3dlcl9kb21haW5zX3Jlc3Vt ZShkZXZfcHJpdik7CkBAIC0xOTUzLDEyICsxODYzLDEwIEBAIHN0YXRpYyBpbnQgaTkxNV9kcm1f cmVzdW1lX2Vhcmx5KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiAKIAlkaXNhYmxlX3JwbV93YWtl cmVmX2Fzc2VydHMoJmRldl9wcml2LT5ydW50aW1lX3BtKTsKIAotCWlmIChJU19WQUxMRVlWSUVX KGRldl9wcml2KSB8fCBJU19DSEVSUllWSUVXKGRldl9wcml2KSkKLQkJcmV0ID0gdmx2X3Jlc3Vt ZV9wcmVwYXJlKGRldl9wcml2LCBmYWxzZSk7CisJcmV0ID0gdmx2X3Jlc3VtZV9wcmVwYXJlKGRl dl9wcml2LCBmYWxzZSk7CiAJaWYgKHJldCkKIAkJZHJtX2VycigmZGV2X3ByaXYtPmRybSwKLQkJ CSJSZXN1bWUgcHJlcGFyZSBmYWlsZWQ6ICVkLCBjb250aW51aW5nIGFueXdheVxuIiwKLQkJCXJl dCk7CisJCQkiUmVzdW1lIHByZXBhcmUgZmFpbGVkOiAlZCwgY29udGludWluZyBhbnl3YXlcbiIs IHJldCk7CiAKIAlpbnRlbF91bmNvcmVfcmVzdW1lX2Vhcmx5KCZkZXZfcHJpdi0+dW5jb3JlKTsK IApAQCAtMjEyNSwzOTAgKzIwMzMsMTEgQEAgc3RhdGljIGludCBpOTE1X3BtX3Jlc3RvcmUoc3Ry dWN0IGRldmljZSAqa2RldikKIAlyZXR1cm4gaTkxNV9wbV9yZXN1bWUoa2Rldik7CiB9CiAKLS8q Ci0gKiBTYXZlIGFsbCBHdW5pdCByZWdpc3RlcnMgdGhhdCBtYXkgYmUgbG9zdCBhZnRlciBhIEQz IGFuZCBhIHN1YnNlcXVlbnQKLSAqIFMwaVtSMTIzXSB0cmFuc2l0aW9uLiBUaGUgbGlzdCBvZiBy ZWdpc3RlcnMgbmVlZGluZyBhIHNhdmUvcmVzdG9yZSBpcwotICogZGVmaW5lZCBpbiB0aGUgVkxW Ml9TMElYUmVncyBkb2N1bWVudC4gVGhpcyBkb2N1bWVudHMgbWFya3MgYWxsIEd1bml0Ci0gKiBy ZWdpc3RlcnMgaW4gdGhlIGZvbGxvd2luZyB3YXk6Ci0gKiAtIERyaXZlcjogc2F2ZWQvcmVzdG9y ZWQgYnkgdGhlIGRyaXZlcgotICogLSBQdW5pdCA6IHNhdmVkL3Jlc3RvcmVkIGJ5IHRoZSBQdW5p dCBmaXJtd2FyZQotICogLSBObywgdy9vIG1hcmtpbmc6IG5vIG5lZWQgdG8gc2F2ZS9yZXN0b3Jl LCBzaW5jZSB0aGUgcmVnaXN0ZXIgaXMgUi9PIG9yCi0gKiAgICAgICAgICAgICAgICAgICAgdXNl ZCBpbnRlcm5hbGx5IGJ5IHRoZSBIVyBpbiBhIHdheSB0aGF0IGRvZXNuJ3QgZGVwZW5kCi0gKiAg ICAgICAgICAgICAgICAgICAga2VlcGluZyB0aGUgY29udGVudCBhY3Jvc3MgYSBzdXNwZW5kL3Jl c3VtZS4KLSAqIC0gRGVidWcgOiB1c2VkIGZvciBkZWJ1Z2dpbmcKLSAqCi0gKiBXZSBzYXZlL3Jl c3RvcmUgYWxsIHJlZ2lzdGVycyBtYXJrZWQgd2l0aCAnRHJpdmVyJywgd2l0aCB0aGUgZm9sbG93 aW5nCi0gKiBleGNlcHRpb25zOgotICogLSBSZWdpc3RlcnMgb3V0IG9mIHVzZSwgaW5jbHVkaW5n IGFsc28gcmVnaXN0ZXJzIG1hcmtlZCB3aXRoICdEZWJ1ZycuCi0gKiAgIFRoZXNlIGhhdmUgbm8g ZWZmZWN0IG9uIHRoZSBkcml2ZXIncyBvcGVyYXRpb24sIHNvIHdlIGRvbid0IHNhdmUvcmVzdG9y ZQotICogICB0aGVtIHRvIHJlZHVjZSB0aGUgb3ZlcmhlYWQuCi0gKiAtIFJlZ2lzdGVycyB0aGF0 IGFyZSBmdWxseSBzZXR1cCBieSBhbiBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiBjYWxsZWQgZnJv bQotICogICB0aGUgcmVzdW1lIHBhdGguIEZvciBleGFtcGxlIG1hbnkgY2xvY2sgZ2F0aW5nIGFu ZCBSUFMvUkM2IHJlZ2lzdGVycy4KLSAqIC0gUmVnaXN0ZXJzIHRoYXQgcHJvdmlkZSB0aGUgcmln aHQgZnVuY3Rpb25hbGl0eSB3aXRoIHRoZWlyIHJlc2V0IGRlZmF1bHRzLgotICoKLSAqIFRPRE86 IEV4Y2VwdCBmb3IgcmVnaXN0ZXJzIHRoYXQgYmFzZWQgb24gdGhlIGFib3ZlIDMgY3JpdGVyaWEg Y2FuIGJlIHNhZmVseQotICogaWdub3JlZCwgd2Ugc2F2ZS9yZXN0b3JlIGFsbCBvdGhlcnMsIHBy YWN0aWNhbGx5IHRyZWF0aW5nIHRoZSBIVyBjb250ZXh0IGFzCi0gKiBhIGJsYWNrLWJveCBmb3Ig dGhlIGRyaXZlci4gRnVydGhlciBpbnZlc3RpZ2F0aW9uIGlzIG5lZWRlZCB0byByZWR1Y2UgdGhl Ci0gKiBzYXZlZC9yZXN0b3JlZCByZWdpc3RlcnMgZXZlbiBmdXJ0aGVyLCBieSBmb2xsb3dpbmcg dGhlIHNhbWUgMyBjcml0ZXJpYS4KLSAqLwotc3RhdGljIHZvaWQgdmx2X3NhdmVfZ3VuaXRfczBp eF9zdGF0ZShzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCi17Ci0Jc3RydWN0IHZs dl9zMGl4X3N0YXRlICpzID0gZGV2X3ByaXYtPnZsdl9zMGl4X3N0YXRlOwotCWludCBpOwotCi0J aWYgKCFzKQotCQlyZXR1cm47Ci0KLQkvKiBHQU0gMHg0MDAwLTB4NDc3MCAqLwotCXMtPndyX3dh dGVybWFyawkJPSBJOTE1X1JFQUQoR0VON19XUl9XQVRFUk1BUkspOwotCXMtPmdmeF9wcmlvX2N0 cmwJPSBJOTE1X1JFQUQoR0VON19HRlhfUFJJT19DVFJMKTsKLQlzLT5hcmJfbW9kZQkJPSBJOTE1 X1JFQUQoQVJCX01PREUpOwotCXMtPmdmeF9wZW5kX3RsYjAJPSBJOTE1X1JFQUQoR0VON19HRlhf UEVORF9UTEIwKTsKLQlzLT5nZnhfcGVuZF90bGIxCT0gSTkxNV9SRUFEKEdFTjdfR0ZYX1BFTkRf VExCMSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzLT5scmFfbGltaXRzKTsgaSsr KQotCQlzLT5scmFfbGltaXRzW2ldID0gSTkxNV9SRUFEKEdFTjdfTFJBX0xJTUlUUyhpKSk7Ci0K LQlzLT5tZWRpYV9tYXhfcmVxX2NvdW50CT0gSTkxNV9SRUFEKEdFTjdfTUVESUFfTUFYX1JFUV9D T1VOVCk7Ci0Jcy0+Z2Z4X21heF9yZXFfY291bnQJPSBJOTE1X1JFQUQoR0VON19HRlhfTUFYX1JF UV9DT1VOVCk7Ci0KLQlzLT5yZW5kZXJfaHdzcAkJPSBJOTE1X1JFQUQoUkVOREVSX0hXU19QR0Ff R0VONyk7Ci0Jcy0+ZWNvY2hrCQk9IEk5MTVfUkVBRChHQU1fRUNPQ0hLKTsKLQlzLT5ic2RfaHdz cAkJPSBJOTE1X1JFQUQoQlNEX0hXU19QR0FfR0VONyk7Ci0Jcy0+Ymx0X2h3c3AJCT0gSTkxNV9S RUFEKEJMVF9IV1NfUEdBX0dFTjcpOwotCi0Jcy0+dGxiX3JkX2FkZHIJCT0gSTkxNV9SRUFEKEdF TjdfVExCX1JEX0FERFIpOwotCi0JLyogTUJDIDB4OTAyNC0weDkxRDAsIDB4ODUwMCAqLwotCXMt PmczZGN0bAkJPSBJOTE1X1JFQUQoVkxWX0czRENUTCk7Ci0Jcy0+Z3Nja2djdGwJCT0gSTkxNV9S RUFEKFZMVl9HU0NLR0NUTCk7Ci0Jcy0+bWJjdGwJCT0gSTkxNV9SRUFEKEdFTjZfTUJDVEwpOwot Ci0JLyogR0NQIDB4OTQwMC0weDk0MjQsIDB4ODEwMC0weDgxMEMgKi8KLQlzLT51Y2djdGwxCQk9 IEk5MTVfUkVBRChHRU42X1VDR0NUTDEpOwotCXMtPnVjZ2N0bDMJCT0gSTkxNV9SRUFEKEdFTjZf VUNHQ1RMMyk7Ci0Jcy0+cmNnY3RsMQkJPSBJOTE1X1JFQUQoR0VONl9SQ0dDVEwxKTsKLQlzLT5y Y2djdGwyCQk9IEk5MTVfUkVBRChHRU42X1JDR0NUTDIpOwotCXMtPnJzdGN0bAkJPSBJOTE1X1JF QUQoR0VONl9SU1RDVEwpOwotCXMtPm1pc2NjcGN0bAkJPSBJOTE1X1JFQUQoR0VON19NSVNDQ1BD VEwpOwotCi0JLyogR1BNIDB4QTAwMC0weEFBODQsIDB4ODAwMC0weDgwRkMgKi8KLQlzLT5nZnhw YXVzZQkJPSBJOTE1X1JFQUQoR0VONl9HRlhQQVVTRSk7Ci0Jcy0+cnBkZXVod3RjCQk9IEk5MTVf UkVBRChHRU42X1JQREVVSFdUQyk7Ci0Jcy0+cnBkZXVjCQk9IEk5MTVfUkVBRChHRU42X1JQREVV Qyk7Ci0Jcy0+ZWNvYnVzCQk9IEk5MTVfUkVBRChFQ09CVVMpOwotCXMtPnB3cmR3bnVwY3RsCQk9 IEk5MTVfUkVBRChWTFZfUFdSRFdOVVBDVEwpOwotCXMtPnJwX2Rvd25fdGltZW91dAk9IEk5MTVf UkVBRChHRU42X1JQX0RPV05fVElNRU9VVCk7Ci0Jcy0+cnBfZGV1Y3N3CQk9IEk5MTVfUkVBRChH RU42X1JQREVVQ1NXKTsKLQlzLT5yY3VibWFiZHRtcgkJPSBJOTE1X1JFQUQoR0VONl9SQ1VCTUFC RFRNUik7Ci0Jcy0+cmNlZGF0YQkJPSBJOTE1X1JFQUQoVkxWX1JDRURBVEEpOwotCXMtPnNwYXJl MmdoCQk9IEk5MTVfUkVBRChWTFZfU1BBUkVHMkgpOwotCi0JLyogRGlzcGxheSBDWiBkb21haW4s IDB4NDQwMEMtMHg0NDAyQywgMHg0RjAwMC0weDRGMTFGICovCi0Jcy0+Z3RfaW1yCQk9IEk5MTVf UkVBRChHVElNUik7Ci0Jcy0+Z3RfaWVyCQk9IEk5MTVfUkVBRChHVElFUik7Ci0Jcy0+cG1faW1y CQk9IEk5MTVfUkVBRChHRU42X1BNSU1SKTsKLQlzLT5wbV9pZXIJCT0gSTkxNV9SRUFEKEdFTjZf UE1JRVIpOwotCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocy0+Z3Rfc2NyYXRjaCk7IGkr KykKLQkJcy0+Z3Rfc2NyYXRjaFtpXSA9IEk5MTVfUkVBRChHRU43X0dUX1NDUkFUQ0goaSkpOwot Ci0JLyogR1QgU0EgQ1ogZG9tYWluLCAweDEwMDAwMC0weDEzODEyNCAqLwotCXMtPnRpbGVjdGwJ CT0gSTkxNV9SRUFEKFRJTEVDVEwpOwotCXMtPmd0X2ZpZm9jdGwJCT0gSTkxNV9SRUFEKEdURklG T0NUTCk7Ci0Jcy0+Z3RsY193YWtlX2N0cmwJPSBJOTE1X1JFQUQoVkxWX0dUTENfV0FLRV9DVFJM KTsKLQlzLT5ndGxjX3N1cnZpdmUJCT0gSTkxNV9SRUFEKFZMVl9HVExDX1NVUlZJVkFCSUxJVFlf UkVHKTsKLQlzLT5wbXdnaWN6CQk9IEk5MTVfUkVBRChWTFZfUE1XR0lDWik7Ci0KLQkvKiBHdW5p dC1EaXNwbGF5IENaIGRvbWFpbiwgMHgxODIwMjgtMHgxODIxQ0YgKi8KLQlzLT5ndV9jdGwwCQk9 IEk5MTVfUkVBRChWTFZfR1VfQ1RMMCk7Ci0Jcy0+Z3VfY3RsMQkJPSBJOTE1X1JFQUQoVkxWX0dV X0NUTDEpOwotCXMtPnBjYnIJCQk9IEk5MTVfUkVBRChWTFZfUENCUik7Ci0Jcy0+Y2xvY2tfZ2F0 ZV9kaXMyCT0gSTkxNV9SRUFEKFZMVl9HVU5JVF9DTE9DS19HQVRFMik7Ci0KLQkvKgotCSAqIE5v dCBzYXZpbmcgYW55IG9mOgotCSAqIERGVCwJCTB4OTgwMC0weDlFQzAKLQkgKiBTQVJCLAkweEIw MDAtMHhCMUZDCi0JICogR0FDLAkJMHg1MjA4LTB4NTI0QywgMHgxNDAwMC0weDE0QzAwMAotCSAq IFBDSSBDRkcKLQkgKi8KLX0KLQotc3RhdGljIHZvaWQgdmx2X3Jlc3RvcmVfZ3VuaXRfczBpeF9z dGF0ZShzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCi17Ci0Jc3RydWN0IHZsdl9z MGl4X3N0YXRlICpzID0gZGV2X3ByaXYtPnZsdl9zMGl4X3N0YXRlOwotCXUzMiB2YWw7Ci0JaW50 IGk7Ci0KLQlpZiAoIXMpCi0JCXJldHVybjsKLQotCS8qIEdBTSAweDQwMDAtMHg0NzcwICovCi0J STkxNV9XUklURShHRU43X1dSX1dBVEVSTUFSSywJcy0+d3Jfd2F0ZXJtYXJrKTsKLQlJOTE1X1dS SVRFKEdFTjdfR0ZYX1BSSU9fQ1RSTCwJcy0+Z2Z4X3ByaW9fY3RybCk7Ci0JSTkxNV9XUklURShB UkJfTU9ERSwJCXMtPmFyYl9tb2RlIHwgKDB4ZmZmZiA8PCAxNikpOwotCUk5MTVfV1JJVEUoR0VO N19HRlhfUEVORF9UTEIwLAlzLT5nZnhfcGVuZF90bGIwKTsKLQlJOTE1X1dSSVRFKEdFTjdfR0ZY X1BFTkRfVExCMSwJcy0+Z2Z4X3BlbmRfdGxiMSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlf U0laRShzLT5scmFfbGltaXRzKTsgaSsrKQotCQlJOTE1X1dSSVRFKEdFTjdfTFJBX0xJTUlUUyhp KSwgcy0+bHJhX2xpbWl0c1tpXSk7Ci0KLQlJOTE1X1dSSVRFKEdFTjdfTUVESUFfTUFYX1JFUV9D T1VOVCwgcy0+bWVkaWFfbWF4X3JlcV9jb3VudCk7Ci0JSTkxNV9XUklURShHRU43X0dGWF9NQVhf UkVRX0NPVU5ULCBzLT5nZnhfbWF4X3JlcV9jb3VudCk7Ci0KLQlJOTE1X1dSSVRFKFJFTkRFUl9I V1NfUEdBX0dFTjcsCXMtPnJlbmRlcl9od3NwKTsKLQlJOTE1X1dSSVRFKEdBTV9FQ09DSEssCQlz LT5lY29jaGspOwotCUk5MTVfV1JJVEUoQlNEX0hXU19QR0FfR0VONywJcy0+YnNkX2h3c3ApOwot CUk5MTVfV1JJVEUoQkxUX0hXU19QR0FfR0VONywJcy0+Ymx0X2h3c3ApOwotCi0JSTkxNV9XUklU RShHRU43X1RMQl9SRF9BRERSLAlzLT50bGJfcmRfYWRkcik7Ci0KLQkvKiBNQkMgMHg5MDI0LTB4 OTFEMCwgMHg4NTAwICovCi0JSTkxNV9XUklURShWTFZfRzNEQ1RMLAkJcy0+ZzNkY3RsKTsKLQlJ OTE1X1dSSVRFKFZMVl9HU0NLR0NUTCwJcy0+Z3Nja2djdGwpOwotCUk5MTVfV1JJVEUoR0VONl9N QkNUTCwJCXMtPm1iY3RsKTsKLQotCS8qIEdDUCAweDk0MDAtMHg5NDI0LCAweDgxMDAtMHg4MTBD ICovCi0JSTkxNV9XUklURShHRU42X1VDR0NUTDEsCXMtPnVjZ2N0bDEpOwotCUk5MTVfV1JJVEUo R0VONl9VQ0dDVEwzLAlzLT51Y2djdGwzKTsKLQlJOTE1X1dSSVRFKEdFTjZfUkNHQ1RMMSwJcy0+ cmNnY3RsMSk7Ci0JSTkxNV9XUklURShHRU42X1JDR0NUTDIsCXMtPnJjZ2N0bDIpOwotCUk5MTVf V1JJVEUoR0VONl9SU1RDVEwsCQlzLT5yc3RjdGwpOwotCUk5MTVfV1JJVEUoR0VON19NSVNDQ1BD VEwsCXMtPm1pc2NjcGN0bCk7Ci0KLQkvKiBHUE0gMHhBMDAwLTB4QUE4NCwgMHg4MDAwLTB4ODBG QyAqLwotCUk5MTVfV1JJVEUoR0VONl9HRlhQQVVTRSwJcy0+Z2Z4cGF1c2UpOwotCUk5MTVfV1JJ VEUoR0VONl9SUERFVUhXVEMsCXMtPnJwZGV1aHd0Yyk7Ci0JSTkxNV9XUklURShHRU42X1JQREVV QywJCXMtPnJwZGV1Yyk7Ci0JSTkxNV9XUklURShFQ09CVVMsCQlzLT5lY29idXMpOwotCUk5MTVf V1JJVEUoVkxWX1BXUkRXTlVQQ1RMLAlzLT5wd3Jkd251cGN0bCk7Ci0JSTkxNV9XUklURShHRU42 X1JQX0RPV05fVElNRU9VVCxzLT5ycF9kb3duX3RpbWVvdXQpOwotCUk5MTVfV1JJVEUoR0VONl9S UERFVUNTVywJcy0+cnBfZGV1Y3N3KTsKLQlJOTE1X1dSSVRFKEdFTjZfUkNVQk1BQkRUTVIsCXMt PnJjdWJtYWJkdG1yKTsKLQlJOTE1X1dSSVRFKFZMVl9SQ0VEQVRBLAkJcy0+cmNlZGF0YSk7Ci0J STkxNV9XUklURShWTFZfU1BBUkVHMkgsCXMtPnNwYXJlMmdoKTsKLQotCS8qIERpc3BsYXkgQ1og ZG9tYWluLCAweDQ0MDBDLTB4NDQwMkMsIDB4NEYwMDAtMHg0RjExRiAqLwotCUk5MTVfV1JJVEUo R1RJTVIsCQlzLT5ndF9pbXIpOwotCUk5MTVfV1JJVEUoR1RJRVIsCQlzLT5ndF9pZXIpOwotCUk5 MTVfV1JJVEUoR0VONl9QTUlNUiwJCXMtPnBtX2ltcik7Ci0JSTkxNV9XUklURShHRU42X1BNSUVS LAkJcy0+cG1faWVyKTsKLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHMtPmd0X3NjcmF0 Y2gpOyBpKyspCi0JCUk5MTVfV1JJVEUoR0VON19HVF9TQ1JBVENIKGkpLCBzLT5ndF9zY3JhdGNo W2ldKTsKLQotCS8qIEdUIFNBIENaIGRvbWFpbiwgMHgxMDAwMDAtMHgxMzgxMjQgKi8KLQlJOTE1 X1dSSVRFKFRJTEVDVEwsCQkJcy0+dGlsZWN0bCk7Ci0JSTkxNV9XUklURShHVEZJRk9DVEwsCQkJ cy0+Z3RfZmlmb2N0bCk7Ci0JLyoKLQkgKiBQcmVzZXJ2ZSB0aGUgR1QgYWxsb3cgd2FrZSBhbmQg R0ZYIGZvcmNlIGNsb2NrIGJpdCwgdGhleSBhcmUgbm90Ci0JICogYmUgcmVzdG9yZWQsIGFzIHRo ZXkgYXJlIHVzZWQgdG8gY29udHJvbCB0aGUgczBpeCBzdXNwZW5kL3Jlc3VtZQotCSAqIHNlcXVl bmNlIGJ5IHRoZSBjYWxsZXIuCi0JICovCi0JdmFsID0gSTkxNV9SRUFEKFZMVl9HVExDX1dBS0Vf Q1RSTCk7Ci0JdmFsICY9IFZMVl9HVExDX0FMTE9XV0FLRVJFUTsKLQl2YWwgfD0gcy0+Z3RsY193 YWtlX2N0cmwgJiB+VkxWX0dUTENfQUxMT1dXQUtFUkVROwotCUk5MTVfV1JJVEUoVkxWX0dUTENf V0FLRV9DVFJMLCB2YWwpOwotCi0JdmFsID0gSTkxNV9SRUFEKFZMVl9HVExDX1NVUlZJVkFCSUxJ VFlfUkVHKTsKLQl2YWwgJj0gVkxWX0dGWF9DTEtfRk9SQ0VfT05fQklUOwotCXZhbCB8PSBzLT5n dGxjX3N1cnZpdmUgJiB+VkxWX0dGWF9DTEtfRk9SQ0VfT05fQklUOwotCUk5MTVfV1JJVEUoVkxW X0dUTENfU1VSVklWQUJJTElUWV9SRUcsIHZhbCk7Ci0KLQlJOTE1X1dSSVRFKFZMVl9QTVdHSUNa LAkJCXMtPnBtd2dpY3opOwotCi0JLyogR3VuaXQtRGlzcGxheSBDWiBkb21haW4sIDB4MTgyMDI4 LTB4MTgyMUNGICovCi0JSTkxNV9XUklURShWTFZfR1VfQ1RMMCwJCQlzLT5ndV9jdGwwKTsKLQlJ OTE1X1dSSVRFKFZMVl9HVV9DVEwxLAkJCXMtPmd1X2N0bDEpOwotCUk5MTVfV1JJVEUoVkxWX1BD QlIsCQkJcy0+cGNicik7Ci0JSTkxNV9XUklURShWTFZfR1VOSVRfQ0xPQ0tfR0FURTIsCXMtPmNs b2NrX2dhdGVfZGlzMik7Ci19Ci0KLXN0YXRpYyBpbnQgdmx2X3dhaXRfZm9yX3B3X3N0YXR1cyhz dHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSwKLQkJCQkgIHUzMiBtYXNrLCB1MzIgdmFsKQot ewotCWk5MTVfcmVnX3QgcmVnID0gVkxWX0dUTENfUFdfU1RBVFVTOwotCXUzMiByZWdfdmFsdWU7 Ci0JaW50IHJldDsKLQotCS8qIFRoZSBIVyBkb2VzIG5vdCBsaWtlIHVzIHBvbGxpbmcgZm9yIFBX X1NUQVRVUyBmcmVxdWVudGx5LCBzbwotCSAqIHVzZSB0aGUgc2xlZXBpbmcgbG9vcCByYXRoZXIg dGhhbiByaXNrIHRoZSBidXN5IHNwaW4gd2l0aGluCi0JICogaW50ZWxfd2FpdF9mb3JfcmVnaXN0 ZXIoKS4KLQkgKgotCSAqIFRyYW5zaXRpb25pbmcgYmV0d2VlbiBSQzYgc3RhdGVzIHNob3VsZCBi ZSBhdCBtb3N0IDJtcyAoc2VlCi0JICogdmFsbGV5dmlld19lbmFibGVfcnBzKSBzbyB1c2UgYSAz bXMgdGltZW91dC4KLQkgKi8KLQlyZXQgPSB3YWl0X2ZvcigoKHJlZ192YWx1ZSA9Ci0JCQkgaW50 ZWxfdW5jb3JlX3JlYWRfbm90cmFjZSgmaTkxNS0+dW5jb3JlLCByZWcpKSAmIG1hc2spCi0JCSAg ICAgICA9PSB2YWwsIDMpOwotCi0JLyoganVzdCB0cmFjZSB0aGUgZmluYWwgdmFsdWUgKi8KLQl0 cmFjZV9pOTE1X3JlZ19ydyhmYWxzZSwgcmVnLCByZWdfdmFsdWUsIHNpemVvZihyZWdfdmFsdWUp LCB0cnVlKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLWludCB2bHZfZm9yY2VfZ2Z4X2Nsb2NrKHN0 cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwgYm9vbCBmb3JjZV9vbikKLXsKLQl1MzIg dmFsOwotCWludCBlcnI7Ci0KLQl2YWwgPSBJOTE1X1JFQUQoVkxWX0dUTENfU1VSVklWQUJJTElU WV9SRUcpOwotCXZhbCAmPSB+VkxWX0dGWF9DTEtfRk9SQ0VfT05fQklUOwotCWlmIChmb3JjZV9v bikKLQkJdmFsIHw9IFZMVl9HRlhfQ0xLX0ZPUkNFX09OX0JJVDsKLQlJOTE1X1dSSVRFKFZMVl9H VExDX1NVUlZJVkFCSUxJVFlfUkVHLCB2YWwpOwotCi0JaWYgKCFmb3JjZV9vbikKLQkJcmV0dXJu IDA7Ci0KLQllcnIgPSBpbnRlbF93YWl0X2Zvcl9yZWdpc3RlcigmZGV2X3ByaXYtPnVuY29yZSwK LQkJCQkgICAgICBWTFZfR1RMQ19TVVJWSVZBQklMSVRZX1JFRywKLQkJCQkgICAgICBWTFZfR0ZY X0NMS19TVEFUVVNfQklULAotCQkJCSAgICAgIFZMVl9HRlhfQ0xLX1NUQVRVU19CSVQsCi0JCQkJ ICAgICAgMjApOwotCWlmIChlcnIpCi0JCWRybV9lcnIoJmRldl9wcml2LT5kcm0sCi0JCQkidGlt ZW91dCB3YWl0aW5nIGZvciBHRlggY2xvY2sgZm9yY2Utb24gKCUwOHgpXG4iLAotCQkJSTkxNV9S RUFEKFZMVl9HVExDX1NVUlZJVkFCSUxJVFlfUkVHKSk7Ci0KLQlyZXR1cm4gZXJyOwotfQotCi1z dGF0aWMgaW50IHZsdl9hbGxvd19ndF93YWtlKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZf cHJpdiwgYm9vbCBhbGxvdykKLXsKLQl1MzIgbWFzazsKLQl1MzIgdmFsOwotCWludCBlcnI7Ci0K LQl2YWwgPSBJOTE1X1JFQUQoVkxWX0dUTENfV0FLRV9DVFJMKTsKLQl2YWwgJj0gflZMVl9HVExD X0FMTE9XV0FLRVJFUTsKLQlpZiAoYWxsb3cpCi0JCXZhbCB8PSBWTFZfR1RMQ19BTExPV1dBS0VS RVE7Ci0JSTkxNV9XUklURShWTFZfR1RMQ19XQUtFX0NUUkwsIHZhbCk7Ci0JUE9TVElOR19SRUFE KFZMVl9HVExDX1dBS0VfQ1RSTCk7Ci0KLQltYXNrID0gVkxWX0dUTENfQUxMT1dXQUtFQUNLOwot CXZhbCA9IGFsbG93ID8gbWFzayA6IDA7Ci0KLQllcnIgPSB2bHZfd2FpdF9mb3JfcHdfc3RhdHVz KGRldl9wcml2LCBtYXNrLCB2YWwpOwotCWlmIChlcnIpCi0JCWRybV9lcnIoJmRldl9wcml2LT5k cm0sICJ0aW1lb3V0IGRpc2FibGluZyBHVCB3YWtpbmdcbiIpOwotCi0JcmV0dXJuIGVycjsKLX0K LQotc3RhdGljIHZvaWQgdmx2X3dhaXRfZm9yX2d0X3dlbGxzKHN0cnVjdCBkcm1faTkxNV9wcml2 YXRlICpkZXZfcHJpdiwKLQkJCQkgIGJvb2wgd2FpdF9mb3Jfb24pCi17Ci0JdTMyIG1hc2s7Ci0J dTMyIHZhbDsKLQotCW1hc2sgPSBWTFZfR1RMQ19QV19NRURJQV9TVEFUVVNfTUFTSyB8IFZMVl9H VExDX1BXX1JFTkRFUl9TVEFUVVNfTUFTSzsKLQl2YWwgPSB3YWl0X2Zvcl9vbiA/IG1hc2sgOiAw OwotCi0JLyoKLQkgKiBSQzYgdHJhbnNpdGlvbmluZyBjYW4gYmUgZGVsYXllZCB1cCB0byAyIG1z ZWMgKHNlZQotCSAqIHZhbGxleXZpZXdfZW5hYmxlX3JwcyksIHVzZSAzIG1zZWMgZm9yIHNhZmV0 eS4KLQkgKgotCSAqIFRoaXMgY2FuIGZhaWwgdG8gdHVybiBvZmYgdGhlIHJjNiBpZiB0aGUgR1BV IGlzIHN0dWNrIGFmdGVyIGEgZmFpbGVkCi0JICogcmVzZXQgYW5kIHdlIGFyZSB0cnlpbmcgdG8g Zm9yY2UgdGhlIG1hY2hpbmUgdG8gc2xlZXAuCi0JICovCi0JaWYgKHZsdl93YWl0X2Zvcl9wd19z dGF0dXMoZGV2X3ByaXYsIG1hc2ssIHZhbCkpCi0JCWRybV9kYmcoJmRldl9wcml2LT5kcm0sCi0J CQkidGltZW91dCB3YWl0aW5nIGZvciBHVCB3ZWxscyB0byBnbyAlc1xuIiwKLQkJCW9ub2ZmKHdh aXRfZm9yX29uKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHZsdl9jaGVja19ub19ndF9hY2Nlc3Moc3Ry dWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQotewotCWlmICghKEk5MTVfUkVBRChWTFZf R1RMQ19QV19TVEFUVVMpICYgVkxWX0dUTENfQUxMT1dXQUtFRVJSKSkKLQkJcmV0dXJuOwotCi0J ZHJtX2RiZygmZGV2X3ByaXYtPmRybSwKLQkJIkdUIHJlZ2lzdGVyIGFjY2VzcyB3aGlsZSBHVCB3 YWtpbmcgZGlzYWJsZWRcbiIpOwotCUk5MTVfV1JJVEUoVkxWX0dUTENfUFdfU1RBVFVTLCBWTFZf R1RMQ19BTExPV1dBS0VFUlIpOwotfQotCi1zdGF0aWMgaW50IHZsdl9zdXNwZW5kX2NvbXBsZXRl KHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikKLXsKLQl1MzIgbWFzazsKLQlpbnQg ZXJyOwotCi0JLyoKLQkgKiBCc3BlYyBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgR1Qgd2VsbCBvbiBm bGFncyBhcyBkZWJ1ZyBvbmx5LCBzbwotCSAqIGRvbid0IHRyZWF0IHRoZW0gYXMgaGFyZCBmYWls dXJlcy4KLQkgKi8KLQl2bHZfd2FpdF9mb3JfZ3Rfd2VsbHMoZGV2X3ByaXYsIGZhbHNlKTsKLQot CW1hc2sgPSBWTFZfR1RMQ19SRU5ERVJfQ1RYX0VYSVNUUyB8IFZMVl9HVExDX01FRElBX0NUWF9F WElTVFM7Ci0JZHJtX1dBUk5fT04oJmRldl9wcml2LT5kcm0sCi0JCSAgICAoSTkxNV9SRUFEKFZM Vl9HVExDX1dBS0VfQ1RSTCkgJiBtYXNrKSAhPSBtYXNrKTsKLQotCXZsdl9jaGVja19ub19ndF9h Y2Nlc3MoZGV2X3ByaXYpOwotCi0JZXJyID0gdmx2X2ZvcmNlX2dmeF9jbG9jayhkZXZfcHJpdiwg dHJ1ZSk7Ci0JaWYgKGVycikKLQkJZ290byBlcnIxOwotCi0JZXJyID0gdmx2X2FsbG93X2d0X3dh a2UoZGV2X3ByaXYsIGZhbHNlKTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycjI7Ci0KLQl2bHZfc2F2 ZV9ndW5pdF9zMGl4X3N0YXRlKGRldl9wcml2KTsKLQotCWVyciA9IHZsdl9mb3JjZV9nZnhfY2xv Y2soZGV2X3ByaXYsIGZhbHNlKTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycjI7Ci0KLQlyZXR1cm4g MDsKLQotZXJyMjoKLQkvKiBGb3Igc2FmZXR5IGFsd2F5cyByZS1lbmFibGUgd2FraW5nIGFuZCBk aXNhYmxlIGdmeCBjbG9jayBmb3JjaW5nICovCi0Jdmx2X2FsbG93X2d0X3dha2UoZGV2X3ByaXYs IHRydWUpOwotZXJyMToKLQl2bHZfZm9yY2VfZ2Z4X2Nsb2NrKGRldl9wcml2LCBmYWxzZSk7Ci0K LQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgaW50IHZsdl9yZXN1bWVfcHJlcGFyZShzdHJ1Y3Qg ZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsCi0JCQkJYm9vbCBycG1fcmVzdW1lKQotewotCWlu dCBlcnI7Ci0JaW50IHJldDsKLQotCS8qCi0JICogSWYgYW55IG9mIHRoZSBzdGVwcyBmYWlsIGp1 c3QgdHJ5IHRvIGNvbnRpbnVlLCB0aGF0J3MgdGhlIGJlc3Qgd2UKLQkgKiBjYW4gZG8gYXQgdGhp cyBwb2ludC4gUmV0dXJuIHRoZSBmaXJzdCBlcnJvciBjb2RlICh3aGljaCB3aWxsIGFsc28KLQkg KiBsZWF2ZSBSUE0gcGVybWFuZW50bHkgZGlzYWJsZWQpLgotCSAqLwotCXJldCA9IHZsdl9mb3Jj ZV9nZnhfY2xvY2soZGV2X3ByaXYsIHRydWUpOwotCi0Jdmx2X3Jlc3RvcmVfZ3VuaXRfczBpeF9z dGF0ZShkZXZfcHJpdik7Ci0KLQllcnIgPSB2bHZfYWxsb3dfZ3Rfd2FrZShkZXZfcHJpdiwgdHJ1 ZSk7Ci0JaWYgKCFyZXQpCi0JCXJldCA9IGVycjsKLQotCWVyciA9IHZsdl9mb3JjZV9nZnhfY2xv Y2soZGV2X3ByaXYsIGZhbHNlKTsKLQlpZiAoIXJldCkKLQkJcmV0ID0gZXJyOwotCi0Jdmx2X2No ZWNrX25vX2d0X2FjY2VzcyhkZXZfcHJpdik7Ci0KLQlpZiAocnBtX3Jlc3VtZSkKLQkJaW50ZWxf aW5pdF9jbG9ja19nYXRpbmcoZGV2X3ByaXYpOwotCi0JcmV0dXJuIHJldDsKLX0KLQogc3RhdGlj IGludCBpbnRlbF9ydW50aW1lX3N1c3BlbmQoc3RydWN0IGRldmljZSAqa2RldikKIHsKIAlzdHJ1 Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBrZGV2X3RvX2k5MTUoa2Rldik7CiAJc3Ry dWN0IGludGVsX3J1bnRpbWVfcG0gKnJwbSA9ICZkZXZfcHJpdi0+cnVudGltZV9wbTsKLQlpbnQg cmV0ID0gMDsKKwlpbnQgcmV0OwogCiAJaWYgKGRybV9XQVJOX09OX09OQ0UoJmRldl9wcml2LT5k cm0sICFIQVNfUlVOVElNRV9QTShkZXZfcHJpdikpKQogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTI1 MzEsOSArMjA2MCw3IEBAIHN0YXRpYyBpbnQgaW50ZWxfcnVudGltZV9zdXNwZW5kKHN0cnVjdCBk ZXZpY2UgKmtkZXYpCiAKIAlpbnRlbF9kaXNwbGF5X3Bvd2VyX3N1c3BlbmQoZGV2X3ByaXYpOwog Ci0JaWYgKElTX1ZBTExFWVZJRVcoZGV2X3ByaXYpIHx8IElTX0NIRVJSWVZJRVcoZGV2X3ByaXYp KQotCQlyZXQgPSB2bHZfc3VzcGVuZF9jb21wbGV0ZShkZXZfcHJpdik7Ci0KKwlyZXQgPSB2bHZf c3VzcGVuZF9jb21wbGV0ZShkZXZfcHJpdik7CiAJaWYgKHJldCkgewogCQlkcm1fZXJyKCZkZXZf cHJpdi0+ZHJtLAogCQkJIlJ1bnRpbWUgc3VzcGVuZCBmYWlsZWQsIGRpc2FibGluZyBpdCAoJWQp XG4iLCByZXQpOwpAQCAtMjU5NSw3ICsyMTIyLDcgQEAgc3RhdGljIGludCBpbnRlbF9ydW50aW1l X3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICprZGV2KQogewogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRl ICpkZXZfcHJpdiA9IGtkZXZfdG9faTkxNShrZGV2KTsKIAlzdHJ1Y3QgaW50ZWxfcnVudGltZV9w bSAqcnBtID0gJmRldl9wcml2LT5ydW50aW1lX3BtOwotCWludCByZXQgPSAwOworCWludCByZXQ7 CiAKIAlpZiAoZHJtX1dBUk5fT05fT05DRSgmZGV2X3ByaXYtPmRybSwgIUhBU19SVU5USU1FX1BN KGRldl9wcml2KSkpCiAJCXJldHVybiAtRU5PREVWOwpAQCAtMjYxMyw4ICsyMTQwLDcgQEAgc3Rh dGljIGludCBpbnRlbF9ydW50aW1lX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICprZGV2KQogCiAJaW50 ZWxfZGlzcGxheV9wb3dlcl9yZXN1bWUoZGV2X3ByaXYpOwogCi0JaWYgKElTX1ZBTExFWVZJRVco ZGV2X3ByaXYpIHx8IElTX0NIRVJSWVZJRVcoZGV2X3ByaXYpKQotCQlyZXQgPSB2bHZfcmVzdW1l X3ByZXBhcmUoZGV2X3ByaXYsIHRydWUpOworCXJldCA9IHZsdl9yZXN1bWVfcHJlcGFyZShkZXZf cHJpdiwgdHJ1ZSk7CiAKIAlpbnRlbF91bmNvcmVfcnVudGltZV9yZXN1bWUoJmRldl9wcml2LT51 bmNvcmUpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5oIGIv ZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuaAppbmRleCBkYTUwOWQ5Yjg4OTUuLjMzMzBi NTM4ZDM3OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuaAorKysg Yi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5oCkBAIC0xNzU1LDggKzE3NTUsNiBAQCB2 b2lkIGk5MTVfZHJpdmVyX3JlbW92ZShzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSk7CiBp bnQgaTkxNV9yZXN1bWVfc3dpdGNoZXJvbyhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSk7 CiBpbnQgaTkxNV9zdXNwZW5kX3N3aXRjaGVyb28oc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5 MTUsIHBtX21lc3NhZ2VfdCBzdGF0ZSk7CiAKLWludCB2bHZfZm9yY2VfZ2Z4X2Nsb2NrKHN0cnVj dCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwgYm9vbCBvbik7Ci0KIHN0YXRpYyBpbmxpbmUg Ym9vbCBpbnRlbF9ndnRfYWN0aXZlKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikK IHsKIAlyZXR1cm4gZGV2X3ByaXYtPmd2dDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9p OTE1L3Zsdl9zdXNwZW5kLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS92bHZfc3VzcGVuZC5jCm5l dyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMC4uMDUwNDdmZTc3NjVmCi0tLSAv ZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvdmx2X3N1c3BlbmQuYwpAQCAtMCww ICsxLDQ4NCBAQAorLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVAorLyoKKyAqIENvcHly aWdodCDCqSAyMDIwIEludGVsIENvcnBvcmF0aW9uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tl cm5lbC5oPgorCisjaW5jbHVkZSA8ZHJtL2RybV9wcmludC5oPgorCisjaW5jbHVkZSAiaTkxNV9k cnYuaCIKKyNpbmNsdWRlICJpOTE1X3JlZy5oIgorI2luY2x1ZGUgImk5MTVfdHJhY2UuaCIKKyNp bmNsdWRlICJpOTE1X3V0aWxzLmgiCisjaW5jbHVkZSAiaW50ZWxfcG0uaCIKKyNpbmNsdWRlICJ2 bHZfc3VzcGVuZC5oIgorCitzdHJ1Y3Qgdmx2X3MwaXhfc3RhdGUgeworCS8qIEdBTSAqLworCXUz MiB3cl93YXRlcm1hcms7CisJdTMyIGdmeF9wcmlvX2N0cmw7CisJdTMyIGFyYl9tb2RlOworCXUz MiBnZnhfcGVuZF90bGIwOworCXUzMiBnZnhfcGVuZF90bGIxOworCXUzMiBscmFfbGltaXRzW0dF TjdfTFJBX0xJTUlUU19SRUdfTlVNXTsKKwl1MzIgbWVkaWFfbWF4X3JlcV9jb3VudDsKKwl1MzIg Z2Z4X21heF9yZXFfY291bnQ7CisJdTMyIHJlbmRlcl9od3NwOworCXUzMiBlY29jaGs7CisJdTMy IGJzZF9od3NwOworCXUzMiBibHRfaHdzcDsKKwl1MzIgdGxiX3JkX2FkZHI7CisKKwkvKiBNQkMg Ki8KKwl1MzIgZzNkY3RsOworCXUzMiBnc2NrZ2N0bDsKKwl1MzIgbWJjdGw7CisKKwkvKiBHQ1Ag Ki8KKwl1MzIgdWNnY3RsMTsKKwl1MzIgdWNnY3RsMzsKKwl1MzIgcmNnY3RsMTsKKwl1MzIgcmNn Y3RsMjsKKwl1MzIgcnN0Y3RsOworCXUzMiBtaXNjY3BjdGw7CisKKwkvKiBHUE0gKi8KKwl1MzIg Z2Z4cGF1c2U7CisJdTMyIHJwZGV1aHd0YzsKKwl1MzIgcnBkZXVjOworCXUzMiBlY29idXM7CisJ dTMyIHB3cmR3bnVwY3RsOworCXUzMiBycF9kb3duX3RpbWVvdXQ7CisJdTMyIHJwX2RldWNzdzsK Kwl1MzIgcmN1Ym1hYmR0bXI7CisJdTMyIHJjZWRhdGE7CisJdTMyIHNwYXJlMmdoOworCisJLyog RGlzcGxheSAxIENaIGRvbWFpbiAqLworCXUzMiBndF9pbXI7CisJdTMyIGd0X2llcjsKKwl1MzIg cG1faW1yOworCXUzMiBwbV9pZXI7CisJdTMyIGd0X3NjcmF0Y2hbR0VON19HVF9TQ1JBVENIX1JF R19OVU1dOworCisJLyogR1QgU0EgQ1ogZG9tYWluICovCisJdTMyIHRpbGVjdGw7CisJdTMyIGd0 X2ZpZm9jdGw7CisJdTMyIGd0bGNfd2FrZV9jdHJsOworCXUzMiBndGxjX3N1cnZpdmU7CisJdTMy IHBtd2dpY3o7CisKKwkvKiBEaXNwbGF5IDIgQ1ogZG9tYWluICovCisJdTMyIGd1X2N0bDA7CisJ dTMyIGd1X2N0bDE7CisJdTMyIHBjYnI7CisJdTMyIGNsb2NrX2dhdGVfZGlzMjsKK307CisKKy8q CisgKiBTYXZlIGFsbCBHdW5pdCByZWdpc3RlcnMgdGhhdCBtYXkgYmUgbG9zdCBhZnRlciBhIEQz IGFuZCBhIHN1YnNlcXVlbnQKKyAqIFMwaVtSMTIzXSB0cmFuc2l0aW9uLiBUaGUgbGlzdCBvZiBy ZWdpc3RlcnMgbmVlZGluZyBhIHNhdmUvcmVzdG9yZSBpcworICogZGVmaW5lZCBpbiB0aGUgVkxW Ml9TMElYUmVncyBkb2N1bWVudC4gVGhpcyBkb2N1bWVudHMgbWFya3MgYWxsIEd1bml0CisgKiBy ZWdpc3RlcnMgaW4gdGhlIGZvbGxvd2luZyB3YXk6CisgKiAtIERyaXZlcjogc2F2ZWQvcmVzdG9y ZWQgYnkgdGhlIGRyaXZlcgorICogLSBQdW5pdCA6IHNhdmVkL3Jlc3RvcmVkIGJ5IHRoZSBQdW5p dCBmaXJtd2FyZQorICogLSBObywgdy9vIG1hcmtpbmc6IG5vIG5lZWQgdG8gc2F2ZS9yZXN0b3Jl LCBzaW5jZSB0aGUgcmVnaXN0ZXIgaXMgUi9PIG9yCisgKiAgICAgICAgICAgICAgICAgICAgdXNl ZCBpbnRlcm5hbGx5IGJ5IHRoZSBIVyBpbiBhIHdheSB0aGF0IGRvZXNuJ3QgZGVwZW5kCisgKiAg ICAgICAgICAgICAgICAgICAga2VlcGluZyB0aGUgY29udGVudCBhY3Jvc3MgYSBzdXNwZW5kL3Jl c3VtZS4KKyAqIC0gRGVidWcgOiB1c2VkIGZvciBkZWJ1Z2dpbmcKKyAqCisgKiBXZSBzYXZlL3Jl c3RvcmUgYWxsIHJlZ2lzdGVycyBtYXJrZWQgd2l0aCAnRHJpdmVyJywgd2l0aCB0aGUgZm9sbG93 aW5nCisgKiBleGNlcHRpb25zOgorICogLSBSZWdpc3RlcnMgb3V0IG9mIHVzZSwgaW5jbHVkaW5n IGFsc28gcmVnaXN0ZXJzIG1hcmtlZCB3aXRoICdEZWJ1ZycuCisgKiAgIFRoZXNlIGhhdmUgbm8g ZWZmZWN0IG9uIHRoZSBkcml2ZXIncyBvcGVyYXRpb24sIHNvIHdlIGRvbid0IHNhdmUvcmVzdG9y ZQorICogICB0aGVtIHRvIHJlZHVjZSB0aGUgb3ZlcmhlYWQuCisgKiAtIFJlZ2lzdGVycyB0aGF0 IGFyZSBmdWxseSBzZXR1cCBieSBhbiBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiBjYWxsZWQgZnJv bQorICogICB0aGUgcmVzdW1lIHBhdGguIEZvciBleGFtcGxlIG1hbnkgY2xvY2sgZ2F0aW5nIGFu ZCBSUFMvUkM2IHJlZ2lzdGVycy4KKyAqIC0gUmVnaXN0ZXJzIHRoYXQgcHJvdmlkZSB0aGUgcmln aHQgZnVuY3Rpb25hbGl0eSB3aXRoIHRoZWlyIHJlc2V0IGRlZmF1bHRzLgorICoKKyAqIFRPRE86 IEV4Y2VwdCBmb3IgcmVnaXN0ZXJzIHRoYXQgYmFzZWQgb24gdGhlIGFib3ZlIDMgY3JpdGVyaWEg Y2FuIGJlIHNhZmVseQorICogaWdub3JlZCwgd2Ugc2F2ZS9yZXN0b3JlIGFsbCBvdGhlcnMsIHBy YWN0aWNhbGx5IHRyZWF0aW5nIHRoZSBIVyBjb250ZXh0IGFzCisgKiBhIGJsYWNrLWJveCBmb3Ig dGhlIGRyaXZlci4gRnVydGhlciBpbnZlc3RpZ2F0aW9uIGlzIG5lZWRlZCB0byByZWR1Y2UgdGhl CisgKiBzYXZlZC9yZXN0b3JlZCByZWdpc3RlcnMgZXZlbiBmdXJ0aGVyLCBieSBmb2xsb3dpbmcg dGhlIHNhbWUgMyBjcml0ZXJpYS4KKyAqLworc3RhdGljIHZvaWQgdmx2X3NhdmVfZ3VuaXRfczBp eF9zdGF0ZShzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCit7CisJc3RydWN0IHZs dl9zMGl4X3N0YXRlICpzID0gZGV2X3ByaXYtPnZsdl9zMGl4X3N0YXRlOworCWludCBpOworCisJ aWYgKCFzKQorCQlyZXR1cm47CisKKwkvKiBHQU0gMHg0MDAwLTB4NDc3MCAqLworCXMtPndyX3dh dGVybWFyawkJPSBJOTE1X1JFQUQoR0VON19XUl9XQVRFUk1BUkspOworCXMtPmdmeF9wcmlvX2N0 cmwJPSBJOTE1X1JFQUQoR0VON19HRlhfUFJJT19DVFJMKTsKKwlzLT5hcmJfbW9kZQkJPSBJOTE1 X1JFQUQoQVJCX01PREUpOworCXMtPmdmeF9wZW5kX3RsYjAJPSBJOTE1X1JFQUQoR0VON19HRlhf UEVORF9UTEIwKTsKKwlzLT5nZnhfcGVuZF90bGIxCT0gSTkxNV9SRUFEKEdFTjdfR0ZYX1BFTkRf VExCMSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzLT5scmFfbGltaXRzKTsgaSsr KQorCQlzLT5scmFfbGltaXRzW2ldID0gSTkxNV9SRUFEKEdFTjdfTFJBX0xJTUlUUyhpKSk7CisK KwlzLT5tZWRpYV9tYXhfcmVxX2NvdW50CT0gSTkxNV9SRUFEKEdFTjdfTUVESUFfTUFYX1JFUV9D T1VOVCk7CisJcy0+Z2Z4X21heF9yZXFfY291bnQJPSBJOTE1X1JFQUQoR0VON19HRlhfTUFYX1JF UV9DT1VOVCk7CisKKwlzLT5yZW5kZXJfaHdzcAkJPSBJOTE1X1JFQUQoUkVOREVSX0hXU19QR0Ff R0VONyk7CisJcy0+ZWNvY2hrCQk9IEk5MTVfUkVBRChHQU1fRUNPQ0hLKTsKKwlzLT5ic2RfaHdz cAkJPSBJOTE1X1JFQUQoQlNEX0hXU19QR0FfR0VONyk7CisJcy0+Ymx0X2h3c3AJCT0gSTkxNV9S RUFEKEJMVF9IV1NfUEdBX0dFTjcpOworCisJcy0+dGxiX3JkX2FkZHIJCT0gSTkxNV9SRUFEKEdF TjdfVExCX1JEX0FERFIpOworCisJLyogTUJDIDB4OTAyNC0weDkxRDAsIDB4ODUwMCAqLworCXMt PmczZGN0bAkJPSBJOTE1X1JFQUQoVkxWX0czRENUTCk7CisJcy0+Z3Nja2djdGwJCT0gSTkxNV9S RUFEKFZMVl9HU0NLR0NUTCk7CisJcy0+bWJjdGwJCT0gSTkxNV9SRUFEKEdFTjZfTUJDVEwpOwor CisJLyogR0NQIDB4OTQwMC0weDk0MjQsIDB4ODEwMC0weDgxMEMgKi8KKwlzLT51Y2djdGwxCQk9 IEk5MTVfUkVBRChHRU42X1VDR0NUTDEpOworCXMtPnVjZ2N0bDMJCT0gSTkxNV9SRUFEKEdFTjZf VUNHQ1RMMyk7CisJcy0+cmNnY3RsMQkJPSBJOTE1X1JFQUQoR0VONl9SQ0dDVEwxKTsKKwlzLT5y Y2djdGwyCQk9IEk5MTVfUkVBRChHRU42X1JDR0NUTDIpOworCXMtPnJzdGN0bAkJPSBJOTE1X1JF QUQoR0VONl9SU1RDVEwpOworCXMtPm1pc2NjcGN0bAkJPSBJOTE1X1JFQUQoR0VON19NSVNDQ1BD VEwpOworCisJLyogR1BNIDB4QTAwMC0weEFBODQsIDB4ODAwMC0weDgwRkMgKi8KKwlzLT5nZnhw YXVzZQkJPSBJOTE1X1JFQUQoR0VONl9HRlhQQVVTRSk7CisJcy0+cnBkZXVod3RjCQk9IEk5MTVf UkVBRChHRU42X1JQREVVSFdUQyk7CisJcy0+cnBkZXVjCQk9IEk5MTVfUkVBRChHRU42X1JQREVV Qyk7CisJcy0+ZWNvYnVzCQk9IEk5MTVfUkVBRChFQ09CVVMpOworCXMtPnB3cmR3bnVwY3RsCQk9 IEk5MTVfUkVBRChWTFZfUFdSRFdOVVBDVEwpOworCXMtPnJwX2Rvd25fdGltZW91dAk9IEk5MTVf UkVBRChHRU42X1JQX0RPV05fVElNRU9VVCk7CisJcy0+cnBfZGV1Y3N3CQk9IEk5MTVfUkVBRChH RU42X1JQREVVQ1NXKTsKKwlzLT5yY3VibWFiZHRtcgkJPSBJOTE1X1JFQUQoR0VONl9SQ1VCTUFC RFRNUik7CisJcy0+cmNlZGF0YQkJPSBJOTE1X1JFQUQoVkxWX1JDRURBVEEpOworCXMtPnNwYXJl MmdoCQk9IEk5MTVfUkVBRChWTFZfU1BBUkVHMkgpOworCisJLyogRGlzcGxheSBDWiBkb21haW4s IDB4NDQwMEMtMHg0NDAyQywgMHg0RjAwMC0weDRGMTFGICovCisJcy0+Z3RfaW1yCQk9IEk5MTVf UkVBRChHVElNUik7CisJcy0+Z3RfaWVyCQk9IEk5MTVfUkVBRChHVElFUik7CisJcy0+cG1faW1y CQk9IEk5MTVfUkVBRChHRU42X1BNSU1SKTsKKwlzLT5wbV9pZXIJCT0gSTkxNV9SRUFEKEdFTjZf UE1JRVIpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocy0+Z3Rfc2NyYXRjaCk7IGkr KykKKwkJcy0+Z3Rfc2NyYXRjaFtpXSA9IEk5MTVfUkVBRChHRU43X0dUX1NDUkFUQ0goaSkpOwor CisJLyogR1QgU0EgQ1ogZG9tYWluLCAweDEwMDAwMC0weDEzODEyNCAqLworCXMtPnRpbGVjdGwJ CT0gSTkxNV9SRUFEKFRJTEVDVEwpOworCXMtPmd0X2ZpZm9jdGwJCT0gSTkxNV9SRUFEKEdURklG T0NUTCk7CisJcy0+Z3RsY193YWtlX2N0cmwJPSBJOTE1X1JFQUQoVkxWX0dUTENfV0FLRV9DVFJM KTsKKwlzLT5ndGxjX3N1cnZpdmUJCT0gSTkxNV9SRUFEKFZMVl9HVExDX1NVUlZJVkFCSUxJVFlf UkVHKTsKKwlzLT5wbXdnaWN6CQk9IEk5MTVfUkVBRChWTFZfUE1XR0lDWik7CisKKwkvKiBHdW5p dC1EaXNwbGF5IENaIGRvbWFpbiwgMHgxODIwMjgtMHgxODIxQ0YgKi8KKwlzLT5ndV9jdGwwCQk9 IEk5MTVfUkVBRChWTFZfR1VfQ1RMMCk7CisJcy0+Z3VfY3RsMQkJPSBJOTE1X1JFQUQoVkxWX0dV X0NUTDEpOworCXMtPnBjYnIJCQk9IEk5MTVfUkVBRChWTFZfUENCUik7CisJcy0+Y2xvY2tfZ2F0 ZV9kaXMyCT0gSTkxNV9SRUFEKFZMVl9HVU5JVF9DTE9DS19HQVRFMik7CisKKwkvKgorCSAqIE5v dCBzYXZpbmcgYW55IG9mOgorCSAqIERGVCwJCTB4OTgwMC0weDlFQzAKKwkgKiBTQVJCLAkweEIw MDAtMHhCMUZDCisJICogR0FDLAkJMHg1MjA4LTB4NTI0QywgMHgxNDAwMC0weDE0QzAwMAorCSAq IFBDSSBDRkcKKwkgKi8KK30KKworc3RhdGljIHZvaWQgdmx2X3Jlc3RvcmVfZ3VuaXRfczBpeF9z dGF0ZShzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCit7CisJc3RydWN0IHZsdl9z MGl4X3N0YXRlICpzID0gZGV2X3ByaXYtPnZsdl9zMGl4X3N0YXRlOworCXUzMiB2YWw7CisJaW50 IGk7CisKKwlpZiAoIXMpCisJCXJldHVybjsKKworCS8qIEdBTSAweDQwMDAtMHg0NzcwICovCisJ STkxNV9XUklURShHRU43X1dSX1dBVEVSTUFSSywJcy0+d3Jfd2F0ZXJtYXJrKTsKKwlJOTE1X1dS SVRFKEdFTjdfR0ZYX1BSSU9fQ1RSTCwJcy0+Z2Z4X3ByaW9fY3RybCk7CisJSTkxNV9XUklURShB UkJfTU9ERSwJCXMtPmFyYl9tb2RlIHwgKDB4ZmZmZiA8PCAxNikpOworCUk5MTVfV1JJVEUoR0VO N19HRlhfUEVORF9UTEIwLAlzLT5nZnhfcGVuZF90bGIwKTsKKwlJOTE1X1dSSVRFKEdFTjdfR0ZY X1BFTkRfVExCMSwJcy0+Z2Z4X3BlbmRfdGxiMSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlf U0laRShzLT5scmFfbGltaXRzKTsgaSsrKQorCQlJOTE1X1dSSVRFKEdFTjdfTFJBX0xJTUlUUyhp KSwgcy0+bHJhX2xpbWl0c1tpXSk7CisKKwlJOTE1X1dSSVRFKEdFTjdfTUVESUFfTUFYX1JFUV9D T1VOVCwgcy0+bWVkaWFfbWF4X3JlcV9jb3VudCk7CisJSTkxNV9XUklURShHRU43X0dGWF9NQVhf UkVRX0NPVU5ULCBzLT5nZnhfbWF4X3JlcV9jb3VudCk7CisKKwlJOTE1X1dSSVRFKFJFTkRFUl9I V1NfUEdBX0dFTjcsCXMtPnJlbmRlcl9od3NwKTsKKwlJOTE1X1dSSVRFKEdBTV9FQ09DSEssCQlz LT5lY29jaGspOworCUk5MTVfV1JJVEUoQlNEX0hXU19QR0FfR0VONywJcy0+YnNkX2h3c3ApOwor CUk5MTVfV1JJVEUoQkxUX0hXU19QR0FfR0VONywJcy0+Ymx0X2h3c3ApOworCisJSTkxNV9XUklU RShHRU43X1RMQl9SRF9BRERSLAlzLT50bGJfcmRfYWRkcik7CisKKwkvKiBNQkMgMHg5MDI0LTB4 OTFEMCwgMHg4NTAwICovCisJSTkxNV9XUklURShWTFZfRzNEQ1RMLAkJcy0+ZzNkY3RsKTsKKwlJ OTE1X1dSSVRFKFZMVl9HU0NLR0NUTCwJcy0+Z3Nja2djdGwpOworCUk5MTVfV1JJVEUoR0VONl9N QkNUTCwJCXMtPm1iY3RsKTsKKworCS8qIEdDUCAweDk0MDAtMHg5NDI0LCAweDgxMDAtMHg4MTBD ICovCisJSTkxNV9XUklURShHRU42X1VDR0NUTDEsCXMtPnVjZ2N0bDEpOworCUk5MTVfV1JJVEUo R0VONl9VQ0dDVEwzLAlzLT51Y2djdGwzKTsKKwlJOTE1X1dSSVRFKEdFTjZfUkNHQ1RMMSwJcy0+ cmNnY3RsMSk7CisJSTkxNV9XUklURShHRU42X1JDR0NUTDIsCXMtPnJjZ2N0bDIpOworCUk5MTVf V1JJVEUoR0VONl9SU1RDVEwsCQlzLT5yc3RjdGwpOworCUk5MTVfV1JJVEUoR0VON19NSVNDQ1BD VEwsCXMtPm1pc2NjcGN0bCk7CisKKwkvKiBHUE0gMHhBMDAwLTB4QUE4NCwgMHg4MDAwLTB4ODBG QyAqLworCUk5MTVfV1JJVEUoR0VONl9HRlhQQVVTRSwJcy0+Z2Z4cGF1c2UpOworCUk5MTVfV1JJ VEUoR0VONl9SUERFVUhXVEMsCXMtPnJwZGV1aHd0Yyk7CisJSTkxNV9XUklURShHRU42X1JQREVV QywJCXMtPnJwZGV1Yyk7CisJSTkxNV9XUklURShFQ09CVVMsCQlzLT5lY29idXMpOworCUk5MTVf V1JJVEUoVkxWX1BXUkRXTlVQQ1RMLAlzLT5wd3Jkd251cGN0bCk7CisJSTkxNV9XUklURShHRU42 X1JQX0RPV05fVElNRU9VVCxzLT5ycF9kb3duX3RpbWVvdXQpOworCUk5MTVfV1JJVEUoR0VONl9S UERFVUNTVywJcy0+cnBfZGV1Y3N3KTsKKwlJOTE1X1dSSVRFKEdFTjZfUkNVQk1BQkRUTVIsCXMt PnJjdWJtYWJkdG1yKTsKKwlJOTE1X1dSSVRFKFZMVl9SQ0VEQVRBLAkJcy0+cmNlZGF0YSk7CisJ STkxNV9XUklURShWTFZfU1BBUkVHMkgsCXMtPnNwYXJlMmdoKTsKKworCS8qIERpc3BsYXkgQ1og ZG9tYWluLCAweDQ0MDBDLTB4NDQwMkMsIDB4NEYwMDAtMHg0RjExRiAqLworCUk5MTVfV1JJVEUo R1RJTVIsCQlzLT5ndF9pbXIpOworCUk5MTVfV1JJVEUoR1RJRVIsCQlzLT5ndF9pZXIpOworCUk5 MTVfV1JJVEUoR0VONl9QTUlNUiwJCXMtPnBtX2ltcik7CisJSTkxNV9XUklURShHRU42X1BNSUVS LAkJcy0+cG1faWVyKTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHMtPmd0X3NjcmF0 Y2gpOyBpKyspCisJCUk5MTVfV1JJVEUoR0VON19HVF9TQ1JBVENIKGkpLCBzLT5ndF9zY3JhdGNo W2ldKTsKKworCS8qIEdUIFNBIENaIGRvbWFpbiwgMHgxMDAwMDAtMHgxMzgxMjQgKi8KKwlJOTE1 X1dSSVRFKFRJTEVDVEwsCQkJcy0+dGlsZWN0bCk7CisJSTkxNV9XUklURShHVEZJRk9DVEwsCQkJ cy0+Z3RfZmlmb2N0bCk7CisJLyoKKwkgKiBQcmVzZXJ2ZSB0aGUgR1QgYWxsb3cgd2FrZSBhbmQg R0ZYIGZvcmNlIGNsb2NrIGJpdCwgdGhleSBhcmUgbm90CisJICogYmUgcmVzdG9yZWQsIGFzIHRo ZXkgYXJlIHVzZWQgdG8gY29udHJvbCB0aGUgczBpeCBzdXNwZW5kL3Jlc3VtZQorCSAqIHNlcXVl bmNlIGJ5IHRoZSBjYWxsZXIuCisJICovCisJdmFsID0gSTkxNV9SRUFEKFZMVl9HVExDX1dBS0Vf Q1RSTCk7CisJdmFsICY9IFZMVl9HVExDX0FMTE9XV0FLRVJFUTsKKwl2YWwgfD0gcy0+Z3RsY193 YWtlX2N0cmwgJiB+VkxWX0dUTENfQUxMT1dXQUtFUkVROworCUk5MTVfV1JJVEUoVkxWX0dUTENf V0FLRV9DVFJMLCB2YWwpOworCisJdmFsID0gSTkxNV9SRUFEKFZMVl9HVExDX1NVUlZJVkFCSUxJ VFlfUkVHKTsKKwl2YWwgJj0gVkxWX0dGWF9DTEtfRk9SQ0VfT05fQklUOworCXZhbCB8PSBzLT5n dGxjX3N1cnZpdmUgJiB+VkxWX0dGWF9DTEtfRk9SQ0VfT05fQklUOworCUk5MTVfV1JJVEUoVkxW X0dUTENfU1VSVklWQUJJTElUWV9SRUcsIHZhbCk7CisKKwlJOTE1X1dSSVRFKFZMVl9QTVdHSUNa LAkJCXMtPnBtd2dpY3opOworCisJLyogR3VuaXQtRGlzcGxheSBDWiBkb21haW4sIDB4MTgyMDI4 LTB4MTgyMUNGICovCisJSTkxNV9XUklURShWTFZfR1VfQ1RMMCwJCQlzLT5ndV9jdGwwKTsKKwlJ OTE1X1dSSVRFKFZMVl9HVV9DVEwxLAkJCXMtPmd1X2N0bDEpOworCUk5MTVfV1JJVEUoVkxWX1BD QlIsCQkJcy0+cGNicik7CisJSTkxNV9XUklURShWTFZfR1VOSVRfQ0xPQ0tfR0FURTIsCXMtPmNs b2NrX2dhdGVfZGlzMik7Cit9CisKK3N0YXRpYyBpbnQgdmx2X3dhaXRfZm9yX3B3X3N0YXR1cyhz dHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSwKKwkJCQkgIHUzMiBtYXNrLCB1MzIgdmFsKQor eworCWk5MTVfcmVnX3QgcmVnID0gVkxWX0dUTENfUFdfU1RBVFVTOworCXUzMiByZWdfdmFsdWU7 CisJaW50IHJldDsKKworCS8qIFRoZSBIVyBkb2VzIG5vdCBsaWtlIHVzIHBvbGxpbmcgZm9yIFBX X1NUQVRVUyBmcmVxdWVudGx5LCBzbworCSAqIHVzZSB0aGUgc2xlZXBpbmcgbG9vcCByYXRoZXIg dGhhbiByaXNrIHRoZSBidXN5IHNwaW4gd2l0aGluCisJICogaW50ZWxfd2FpdF9mb3JfcmVnaXN0 ZXIoKS4KKwkgKgorCSAqIFRyYW5zaXRpb25pbmcgYmV0d2VlbiBSQzYgc3RhdGVzIHNob3VsZCBi ZSBhdCBtb3N0IDJtcyAoc2VlCisJICogdmFsbGV5dmlld19lbmFibGVfcnBzKSBzbyB1c2UgYSAz bXMgdGltZW91dC4KKwkgKi8KKwlyZXQgPSB3YWl0X2ZvcigoKHJlZ192YWx1ZSA9CisJCQkgaW50 ZWxfdW5jb3JlX3JlYWRfbm90cmFjZSgmaTkxNS0+dW5jb3JlLCByZWcpKSAmIG1hc2spCisJCSAg ICAgICA9PSB2YWwsIDMpOworCisJLyoganVzdCB0cmFjZSB0aGUgZmluYWwgdmFsdWUgKi8KKwl0 cmFjZV9pOTE1X3JlZ19ydyhmYWxzZSwgcmVnLCByZWdfdmFsdWUsIHNpemVvZihyZWdfdmFsdWUp LCB0cnVlKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdmx2X2ZvcmNlX2dmeF9j bG9jayhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsIGJvb2wgZm9yY2Vfb24pCit7 CisJdTMyIHZhbDsKKwlpbnQgZXJyOworCisJdmFsID0gSTkxNV9SRUFEKFZMVl9HVExDX1NVUlZJ VkFCSUxJVFlfUkVHKTsKKwl2YWwgJj0gflZMVl9HRlhfQ0xLX0ZPUkNFX09OX0JJVDsKKwlpZiAo Zm9yY2Vfb24pCisJCXZhbCB8PSBWTFZfR0ZYX0NMS19GT1JDRV9PTl9CSVQ7CisJSTkxNV9XUklU RShWTFZfR1RMQ19TVVJWSVZBQklMSVRZX1JFRywgdmFsKTsKKworCWlmICghZm9yY2Vfb24pCisJ CXJldHVybiAwOworCisJZXJyID0gaW50ZWxfd2FpdF9mb3JfcmVnaXN0ZXIoJmRldl9wcml2LT51 bmNvcmUsCisJCQkJICAgICAgVkxWX0dUTENfU1VSVklWQUJJTElUWV9SRUcsCisJCQkJICAgICAg VkxWX0dGWF9DTEtfU1RBVFVTX0JJVCwKKwkJCQkgICAgICBWTFZfR0ZYX0NMS19TVEFUVVNfQklU LAorCQkJCSAgICAgIDIwKTsKKwlpZiAoZXJyKQorCQlkcm1fZXJyKCZkZXZfcHJpdi0+ZHJtLAor CQkJInRpbWVvdXQgd2FpdGluZyBmb3IgR0ZYIGNsb2NrIGZvcmNlLW9uICglMDh4KVxuIiwKKwkJ CUk5MTVfUkVBRChWTFZfR1RMQ19TVVJWSVZBQklMSVRZX1JFRykpOworCisJcmV0dXJuIGVycjsK K30KKworc3RhdGljIGludCB2bHZfYWxsb3dfZ3Rfd2FrZShzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0 ZSAqZGV2X3ByaXYsIGJvb2wgYWxsb3cpCit7CisJdTMyIG1hc2s7CisJdTMyIHZhbDsKKwlpbnQg ZXJyOworCisJdmFsID0gSTkxNV9SRUFEKFZMVl9HVExDX1dBS0VfQ1RSTCk7CisJdmFsICY9IH5W TFZfR1RMQ19BTExPV1dBS0VSRVE7CisJaWYgKGFsbG93KQorCQl2YWwgfD0gVkxWX0dUTENfQUxM T1dXQUtFUkVROworCUk5MTVfV1JJVEUoVkxWX0dUTENfV0FLRV9DVFJMLCB2YWwpOworCVBPU1RJ TkdfUkVBRChWTFZfR1RMQ19XQUtFX0NUUkwpOworCisJbWFzayA9IFZMVl9HVExDX0FMTE9XV0FL RUFDSzsKKwl2YWwgPSBhbGxvdyA/IG1hc2sgOiAwOworCisJZXJyID0gdmx2X3dhaXRfZm9yX3B3 X3N0YXR1cyhkZXZfcHJpdiwgbWFzaywgdmFsKTsKKwlpZiAoZXJyKQorCQlkcm1fZXJyKCZkZXZf cHJpdi0+ZHJtLCAidGltZW91dCBkaXNhYmxpbmcgR1Qgd2FraW5nXG4iKTsKKworCXJldHVybiBl cnI7Cit9CisKK3N0YXRpYyB2b2lkIHZsdl93YWl0X2Zvcl9ndF93ZWxscyhzdHJ1Y3QgZHJtX2k5 MTVfcHJpdmF0ZSAqZGV2X3ByaXYsCisJCQkJICBib29sIHdhaXRfZm9yX29uKQoreworCXUzMiBt YXNrOworCXUzMiB2YWw7CisKKwltYXNrID0gVkxWX0dUTENfUFdfTUVESUFfU1RBVFVTX01BU0sg fCBWTFZfR1RMQ19QV19SRU5ERVJfU1RBVFVTX01BU0s7CisJdmFsID0gd2FpdF9mb3Jfb24gPyBt YXNrIDogMDsKKworCS8qCisJICogUkM2IHRyYW5zaXRpb25pbmcgY2FuIGJlIGRlbGF5ZWQgdXAg dG8gMiBtc2VjIChzZWUKKwkgKiB2YWxsZXl2aWV3X2VuYWJsZV9ycHMpLCB1c2UgMyBtc2VjIGZv ciBzYWZldHkuCisJICoKKwkgKiBUaGlzIGNhbiBmYWlsIHRvIHR1cm4gb2ZmIHRoZSByYzYgaWYg dGhlIEdQVSBpcyBzdHVjayBhZnRlciBhIGZhaWxlZAorCSAqIHJlc2V0IGFuZCB3ZSBhcmUgdHJ5 aW5nIHRvIGZvcmNlIHRoZSBtYWNoaW5lIHRvIHNsZWVwLgorCSAqLworCWlmICh2bHZfd2FpdF9m b3JfcHdfc3RhdHVzKGRldl9wcml2LCBtYXNrLCB2YWwpKQorCQlkcm1fZGJnKCZkZXZfcHJpdi0+ ZHJtLAorCQkJInRpbWVvdXQgd2FpdGluZyBmb3IgR1Qgd2VsbHMgdG8gZ28gJXNcbiIsCisJCQlv bm9mZih3YWl0X2Zvcl9vbikpOworfQorCitzdGF0aWMgdm9pZCB2bHZfY2hlY2tfbm9fZ3RfYWNj ZXNzKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikKK3sKKwlpZiAoIShJOTE1X1JF QUQoVkxWX0dUTENfUFdfU1RBVFVTKSAmIFZMVl9HVExDX0FMTE9XV0FLRUVSUikpCisJCXJldHVy bjsKKworCWRybV9kYmcoJmRldl9wcml2LT5kcm0sCisJCSJHVCByZWdpc3RlciBhY2Nlc3Mgd2hp bGUgR1Qgd2FraW5nIGRpc2FibGVkXG4iKTsKKwlJOTE1X1dSSVRFKFZMVl9HVExDX1BXX1NUQVRV UywgVkxWX0dUTENfQUxMT1dXQUtFRVJSKTsKK30KKworaW50IHZsdl9zdXNwZW5kX2NvbXBsZXRl KHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikKK3sKKwl1MzIgbWFzazsKKwlpbnQg ZXJyOworCisJaWYgKCFJU19WQUxMRVlWSUVXKGRldl9wcml2KSAmJiAhSVNfQ0hFUlJZVklFVyhk ZXZfcHJpdikpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBCc3BlYyBkZWZpbmVzIHRoZSBmb2xs b3dpbmcgR1Qgd2VsbCBvbiBmbGFncyBhcyBkZWJ1ZyBvbmx5LCBzbworCSAqIGRvbid0IHRyZWF0 IHRoZW0gYXMgaGFyZCBmYWlsdXJlcy4KKwkgKi8KKwl2bHZfd2FpdF9mb3JfZ3Rfd2VsbHMoZGV2 X3ByaXYsIGZhbHNlKTsKKworCW1hc2sgPSBWTFZfR1RMQ19SRU5ERVJfQ1RYX0VYSVNUUyB8IFZM Vl9HVExDX01FRElBX0NUWF9FWElTVFM7CisJZHJtX1dBUk5fT04oJmRldl9wcml2LT5kcm0sCisJ CSAgICAoSTkxNV9SRUFEKFZMVl9HVExDX1dBS0VfQ1RSTCkgJiBtYXNrKSAhPSBtYXNrKTsKKwor CXZsdl9jaGVja19ub19ndF9hY2Nlc3MoZGV2X3ByaXYpOworCisJZXJyID0gdmx2X2ZvcmNlX2dm eF9jbG9jayhkZXZfcHJpdiwgdHJ1ZSk7CisJaWYgKGVycikKKwkJZ290byBlcnIxOworCisJZXJy ID0gdmx2X2FsbG93X2d0X3dha2UoZGV2X3ByaXYsIGZhbHNlKTsKKwlpZiAoZXJyKQorCQlnb3Rv IGVycjI7CisKKwl2bHZfc2F2ZV9ndW5pdF9zMGl4X3N0YXRlKGRldl9wcml2KTsKKworCWVyciA9 IHZsdl9mb3JjZV9nZnhfY2xvY2soZGV2X3ByaXYsIGZhbHNlKTsKKwlpZiAoZXJyKQorCQlnb3Rv IGVycjI7CisKKwlyZXR1cm4gMDsKKworZXJyMjoKKwkvKiBGb3Igc2FmZXR5IGFsd2F5cyByZS1l bmFibGUgd2FraW5nIGFuZCBkaXNhYmxlIGdmeCBjbG9jayBmb3JjaW5nICovCisJdmx2X2FsbG93 X2d0X3dha2UoZGV2X3ByaXYsIHRydWUpOworZXJyMToKKwl2bHZfZm9yY2VfZ2Z4X2Nsb2NrKGRl dl9wcml2LCBmYWxzZSk7CisKKwlyZXR1cm4gZXJyOworfQorCitpbnQgdmx2X3Jlc3VtZV9wcmVw YXJlKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwgYm9vbCBycG1fcmVzdW1lKQor eworCWludCBlcnI7CisJaW50IHJldDsKKworCWlmICghSVNfVkFMTEVZVklFVyhkZXZfcHJpdikg JiYgIUlTX0NIRVJSWVZJRVcoZGV2X3ByaXYpKQorCQlyZXR1cm4gMDsKKworCS8qCisJICogSWYg YW55IG9mIHRoZSBzdGVwcyBmYWlsIGp1c3QgdHJ5IHRvIGNvbnRpbnVlLCB0aGF0J3MgdGhlIGJl c3Qgd2UKKwkgKiBjYW4gZG8gYXQgdGhpcyBwb2ludC4gUmV0dXJuIHRoZSBmaXJzdCBlcnJvciBj b2RlICh3aGljaCB3aWxsIGFsc28KKwkgKiBsZWF2ZSBSUE0gcGVybWFuZW50bHkgZGlzYWJsZWQp LgorCSAqLworCXJldCA9IHZsdl9mb3JjZV9nZnhfY2xvY2soZGV2X3ByaXYsIHRydWUpOworCisJ dmx2X3Jlc3RvcmVfZ3VuaXRfczBpeF9zdGF0ZShkZXZfcHJpdik7CisKKwllcnIgPSB2bHZfYWxs b3dfZ3Rfd2FrZShkZXZfcHJpdiwgdHJ1ZSk7CisJaWYgKCFyZXQpCisJCXJldCA9IGVycjsKKwor CWVyciA9IHZsdl9mb3JjZV9nZnhfY2xvY2soZGV2X3ByaXYsIGZhbHNlKTsKKwlpZiAoIXJldCkK KwkJcmV0ID0gZXJyOworCisJdmx2X2NoZWNrX25vX2d0X2FjY2VzcyhkZXZfcHJpdik7CisKKwlp ZiAocnBtX3Jlc3VtZSkKKwkJaW50ZWxfaW5pdF9jbG9ja19nYXRpbmcoZGV2X3ByaXYpOworCisJ cmV0dXJuIHJldDsKK30KKworaW50IHZsdl9zdXNwZW5kX2luaXQoc3RydWN0IGRybV9pOTE1X3By aXZhdGUgKmk5MTUpCit7CisJaWYgKCFJU19WQUxMRVlWSUVXKGk5MTUpKQorCQlyZXR1cm4gMDsK KworCS8qIHdlIHdyaXRlIGFsbCB0aGUgdmFsdWVzIGluIHRoZSBzdHJ1Y3QsIHNvIG5vIG5lZWQg dG8gemVybyBpdCBvdXQgKi8KKwlpOTE1LT52bHZfczBpeF9zdGF0ZSA9IGttYWxsb2Moc2l6ZW9m KCppOTE1LT52bHZfczBpeF9zdGF0ZSksCisJCQkJICAgICAgIEdGUF9LRVJORUwpOworCWlmICgh aTkxNS0+dmx2X3MwaXhfc3RhdGUpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0dXJuIDA7Cit9 CisKK3ZvaWQgdmx2X3N1c3BlbmRfY2xlYW51cChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkx NSkKK3sKKwlpZiAoIWk5MTUtPnZsdl9zMGl4X3N0YXRlKQorCQlyZXR1cm47CisKKwlrZnJlZShp OTE1LT52bHZfczBpeF9zdGF0ZSk7CisJaTkxNS0+dmx2X3MwaXhfc3RhdGUgPSBOVUxMOworfQpk aWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvdmx2X3N1c3BlbmQuaCBiL2RyaXZlcnMv Z3B1L2RybS9pOTE1L3Zsdl9zdXNwZW5kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAw MDAwMDAwMDAwLi44OTUwOTFjYjFmNjIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9k cm0vaTkxNS92bHZfc3VzcGVuZC5oCkBAIC0wLDAgKzEsMTggQEAKKy8qIFNQRFgtTGljZW5zZS1J ZGVudGlmaWVyOiBNSVQgKi8KKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAyMCBJbnRlbCBDb3Jwb3Jh dGlvbgorICovCisKKyNpZm5kZWYgX19WTFZfU1VTUEVORF9IX18KKyNkZWZpbmUgX19WTFZfU1VT UEVORF9IX18KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK3N0cnVjdCBkcm1faTkxNV9w cml2YXRlOworCitpbnQgdmx2X3N1c3BlbmRfaW5pdChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAq aTkxNSk7Cit2b2lkIHZsdl9zdXNwZW5kX2NsZWFudXAoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUg Kmk5MTUpOworaW50IHZsdl9zdXNwZW5kX2NvbXBsZXRlKHN0cnVjdCBkcm1faTkxNV9wcml2YXRl ICppOTE1KTsKK2ludCB2bHZfcmVzdW1lX3ByZXBhcmUoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUg Kmk5MTUsIGJvb2wgcnBtX3Jlc3VtZSk7CisKKyNlbmRpZiAvKiBfX1ZMVl9TVVNQRU5EX0hfXyAq LwotLSAKMi4yMC4xCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fXwpJbnRlbC1nZnggbWFpbGluZyBsaXN0CkludGVsLWdmeEBsaXN0cy5mcmVlZGVza3RvcC5v cmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9pbnRlbC1n ZngK