From mboxrd@z Thu Jan 1 00:00:00 1970 From: Hyun Kwon Subject: [PATCH v6 4/5] drm: xlnx: DRM KMS driver for Xilinx ZynqMP DisplayPort Date: Fri, 16 Mar 2018 18:06:07 -0700 Message-ID: <1521248768-16202-4-git-send-email-hyun.kwon@xilinx.com> References: <1521248768-16202-1-git-send-email-hyun.kwon@xilinx.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from NAM02-BL2-obe.outbound.protection.outlook.com (mail-bl2nam02on0071.outbound.protection.outlook.com [104.47.38.71]) by gabe.freedesktop.org (Postfix) with ESMTPS id 7CC4F6E0F3 for ; Sat, 17 Mar 2018 01:06:33 +0000 (UTC) In-Reply-To: <1521248768-16202-1-git-send-email-hyun.kwon@xilinx.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, devicetree@vger.kernel.org Cc: Daniel Vetter , Rob Herring , Michal Simek , Hyun Kwon , Laurent Pinchart List-Id: dri-devel@lists.freedesktop.org VGhpcyBkcml2ZXIgY3JlYXRlcyBEUk0gZW5jb2RlciBhbmQgY29ubmVjdG9yIGZvciBaeW5xTVAg RGlzcGxheVBvcnQuCgpTaWduZWQtb2ZmLWJ5OiBIeXVuIEt3b24gPGh5dW4ua3dvbkB4aWxpbngu Y29tPgpBY2tlZC1ieTogRGFuaWVsIFZldHRlciA8ZGFuaWVsLnZldHRlckBmZndsbC5jaD4KLS0t CnY2Ci0gQ29uc3RpZnkgYWxsIGZ1bmN0aW9uIHBvaW50ZXJzCi0gQ2xlYW4gdXAgdGhlIGR1cGxp Y2F0ZWQgbGljZW5zZSBwYXJhZ3JhcGhzCi0gRG8gY29tcGxldGUgZm9yd2FyZCBkZWNsYXJhdGlv biBpbiB0aGUgaGVhZGVyCnYyCi0gQ2hhbmdlIHRoZSBTUERYIGlkZW50aWZpZXIgZm9ybWF0Ci0g U3BsaXQgZHJtIHByb3BlcnRpZXMgaW50byBhIHNlcGFyYXRlIHBhdGNoCi0tLQotLS0KIGRyaXZl cnMvZ3B1L2RybS94bG54L3p5bnFtcF9kcC5jIHwgMTczMCArKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKwogZHJpdmVycy9ncHUvZHJtL3hsbngvenlucW1wX2RwLmggfCAgIDMw ICsKIDIgZmlsZXMgY2hhbmdlZCwgMTc2MCBpbnNlcnRpb25zKCspCiBjcmVhdGUgbW9kZSAxMDA2 NDQgZHJpdmVycy9ncHUvZHJtL3hsbngvenlucW1wX2RwLmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBk cml2ZXJzL2dwdS9kcm0veGxueC96eW5xbXBfZHAuaAoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1 L2RybS94bG54L3p5bnFtcF9kcC5jIGIvZHJpdmVycy9ncHUvZHJtL3hsbngvenlucW1wX2RwLmMK bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVkNTVkZAotLS0gL2Rldi9udWxs CisrKyBiL2RyaXZlcnMvZ3B1L2RybS94bG54L3p5bnFtcF9kcC5jCkBAIC0wLDAgKzEsMTczMCBA QAorLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKKy8qCisgKiBaeW5xTVAgRGlz cGxheVBvcnQgRHJpdmVyCisgKgorICogIENvcHlyaWdodCAoQykgMjAxNyAtIDIwMTggWGlsaW54 LCBJbmMuCisgKgorICogIEF1dGhvcjogSHl1biBXb28gS3dvbiA8aHl1bi5rd29uQHhpbGlueC5j b20+CisgKi8KKworI2luY2x1ZGUgPGRybS9kcm1QLmg+CisjaW5jbHVkZSA8ZHJtL2RybV9hdG9t aWNfaGVscGVyLmg+CisjaW5jbHVkZSA8ZHJtL2RybV9jb25uZWN0b3IuaD4KKyNpbmNsdWRlIDxk cm0vZHJtX2NydGMuaD4KKyNpbmNsdWRlIDxkcm0vZHJtX2NydGNfaGVscGVyLmg+CisjaW5jbHVk ZSA8ZHJtL2RybV9kcF9oZWxwZXIuaD4KKyNpbmNsdWRlIDxkcm0vZHJtX29mLmg+CisKKyNpbmNs dWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUg PGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGlu dXgvcGh5L3BoeS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1 ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisKKyNp bmNsdWRlICJ6eW5xbXBfZGlzcC5oIgorI2luY2x1ZGUgInp5bnFtcF9kcHN1Yi5oIgorCitzdGF0 aWMgdWludCB6eW5xbXBfZHBfYXV4X3RpbWVvdXRfbXMgPSA1MDsKK21vZHVsZV9wYXJhbV9uYW1l ZChhdXhfdGltZW91dF9tcywgenlucW1wX2RwX2F1eF90aW1lb3V0X21zLCB1aW50LCAwNDQ0KTsK K01PRFVMRV9QQVJNX0RFU0MoYXV4X3RpbWVvdXRfbXMsICJEUCBhdXggdGltZW91dCB2YWx1ZSBp biBtc2VjIChkZWZhdWx0OiA1MCkiKTsKKworLyoKKyAqIFNvbWUgc2luayByZXF1aXJlcyBhIGRl bGF5IGFmdGVyIHBvd2VyIG9uIHJlcXVlc3QKKyAqLworc3RhdGljIHVpbnQgenlucW1wX2RwX3Bv d2VyX29uX2RlbGF5X21zID0gNDsKK21vZHVsZV9wYXJhbV9uYW1lZChwb3dlcl9vbl9kZWxheV9t cywgenlucW1wX2RwX3Bvd2VyX29uX2RlbGF5X21zLCB1aW50LCAwNDQ0KTsKK01PRFVMRV9QQVJN X0RFU0MoYXV4X3RpbWVvdXRfbXMsICJEUCBwb3dlciBvbiBkZWxheSBpbiBtc2VjIChkZWZhdWx0 OiA0KSIpOworCisvKiBMaW5rIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzICovCisjZGVmaW5lIFpZ TlFNUF9EUF9UWF9MSU5LX0JXX1NFVAkJCTB4MAorI2RlZmluZSBaWU5RTVBfRFBfVFhfTEFORV9D TlRfU0VUCQkJMHg0CisjZGVmaW5lIFpZTlFNUF9EUF9UWF9FTkhBTkNFRF9GUkFNRV9FTgkJCTB4 OAorI2RlZmluZSBaWU5RTVBfRFBfVFhfVFJBSU5JTkdfUEFUVEVSTl9TRVQJCTB4YworI2RlZmlu ZSBaWU5RTVBfRFBfVFhfU0NSQU1CTElOR19ESVNBQkxFCQkJMHgxNAorI2RlZmluZSBaWU5RTVBf RFBfVFhfRE9XTlNQUkVBRF9DVEwJCQkweDE4CisjZGVmaW5lIFpZTlFNUF9EUF9UWF9TV19SRVNF VAkJCQkweDFjCisjZGVmaW5lIFpZTlFNUF9EUF9UWF9TV19SRVNFVF9TVFJFQU0xCQkJQklUKDAp CisjZGVmaW5lIFpZTlFNUF9EUF9UWF9TV19SRVNFVF9TVFJFQU0yCQkJQklUKDEpCisjZGVmaW5l IFpZTlFNUF9EUF9UWF9TV19SRVNFVF9TVFJFQU0zCQkJQklUKDIpCisjZGVmaW5lIFpZTlFNUF9E UF9UWF9TV19SRVNFVF9TVFJFQU00CQkJQklUKDMpCisjZGVmaW5lIFpZTlFNUF9EUF9UWF9TV19S RVNFVF9BVVgJCQlCSVQoNykKKyNkZWZpbmUgWllOUU1QX0RQX1RYX1NXX1JFU0VUX0FMTAkJCSha WU5RTVBfRFBfVFhfU1dfUkVTRVRfU1RSRUFNMSB8IFwKKwkJCQkJCQkgWllOUU1QX0RQX1RYX1NX X1JFU0VUX1NUUkVBTTIgfCBcCisJCQkJCQkJIFpZTlFNUF9EUF9UWF9TV19SRVNFVF9TVFJFQU0z IHwgXAorCQkJCQkJCSBaWU5RTVBfRFBfVFhfU1dfUkVTRVRfU1RSRUFNNCB8IFwKKwkJCQkJCQkg WllOUU1QX0RQX1RYX1NXX1JFU0VUX0FVWCkKKworLyogQ29yZSBlbmFibGUgcmVnaXN0ZXJzICov CisjZGVmaW5lIFpZTlFNUF9EUF9UWF9FTkFCTEUJCQkJMHg4MAorI2RlZmluZSBaWU5RTVBfRFBf VFhfRU5BQkxFX01BSU5fU1RSRUFNCQkJMHg4NAorI2RlZmluZSBaWU5RTVBfRFBfVFhfRk9SQ0Vf U0NSQU1CTEVSX1JFU0VUCQkweGMwCisjZGVmaW5lIFpZTlFNUF9EUF9UWF9WRVJTSU9OCQkJCTB4 ZjgKKyNkZWZpbmUgWllOUU1QX0RQX1RYX1ZFUlNJT05fTUFKT1JfTUFTSwkJCUdFTk1BU0soMzEs IDI0KQorI2RlZmluZSBaWU5RTVBfRFBfVFhfVkVSU0lPTl9NQUpPUl9TSElGVAkJMjQKKyNkZWZp bmUgWllOUU1QX0RQX1RYX1ZFUlNJT05fTUlOT1JfTUFTSwkJCUdFTk1BU0soMjMsIDE2KQorI2Rl ZmluZSBaWU5RTVBfRFBfVFhfVkVSU0lPTl9NSU5PUl9TSElGVAkJMTYKKyNkZWZpbmUgWllOUU1Q X0RQX1RYX1ZFUlNJT05fUkVWSVNJT05fTUFTSwkJR0VOTUFTSygxNSwgMTIpCisjZGVmaW5lIFpZ TlFNUF9EUF9UWF9WRVJTSU9OX1JFVklTSU9OX1NISUZUCQkxMgorI2RlZmluZSBaWU5RTVBfRFBf VFhfVkVSU0lPTl9QQVRDSF9NQVNLCQkJR0VOTUFTSygxMSwgOCkKKyNkZWZpbmUgWllOUU1QX0RQ X1RYX1ZFUlNJT05fUEFUQ0hfU0hJRlQJCTgKKyNkZWZpbmUgWllOUU1QX0RQX1RYX1ZFUlNJT05f SU5URVJOQUxfTUFTSwkJR0VOTUFTSyg3LCAwKQorI2RlZmluZSBaWU5RTVBfRFBfVFhfVkVSU0lP Tl9JTlRFUk5BTF9TSElGVAkJMAorCisvKiBDb3JlIElEIHJlZ2lzdGVycyAqLworI2RlZmluZSBa WU5RTVBfRFBfVFhfQ09SRV9JRAkJCQkweGZjCisjZGVmaW5lIFpZTlFNUF9EUF9UWF9DT1JFX0lE X01BSk9SX01BU0sJCQlHRU5NQVNLKDMxLCAyNCkKKyNkZWZpbmUgWllOUU1QX0RQX1RYX0NPUkVf SURfTUFKT1JfU0hJRlQJCTI0CisjZGVmaW5lIFpZTlFNUF9EUF9UWF9DT1JFX0lEX01JTk9SX01B U0sJCQlHRU5NQVNLKDIzLCAxNikKKyNkZWZpbmUgWllOUU1QX0RQX1RYX0NPUkVfSURfTUlOT1Jf U0hJRlQJCTE2CisjZGVmaW5lIFpZTlFNUF9EUF9UWF9DT1JFX0lEX1JFVklTSU9OX01BU0sJCUdF Tk1BU0soMTUsIDgpCisjZGVmaW5lIFpZTlFNUF9EUF9UWF9DT1JFX0lEX1JFVklTSU9OX1NISUZU CQk4CisjZGVmaW5lIFpZTlFNUF9EUF9UWF9DT1JFX0lEX0RJUkVDVElPTgkJCUdFTk1BU0soMSkK KworLyogQVVYIGNoYW5uZWwgaW50ZXJmYWNlIHJlZ2lzdGVycyAqLworI2RlZmluZSBaWU5RTVBf RFBfVFhfQVVYX0NPTU1BTkQJCQkweDEwMAorI2RlZmluZSBaWU5RTVBfRFBfVFhfQVVYX0NPTU1B TkRfQ01EX1NISUZUCQk4CisjZGVmaW5lIFpZTlFNUF9EUF9UWF9BVVhfQ09NTUFORF9BRERSRVNT X09OTFkJCUJJVCgxMikKKyNkZWZpbmUgWllOUU1QX0RQX1RYX0FVWF9DT01NQU5EX0JZVEVTX1NI SUZUCQkwCisjZGVmaW5lIFpZTlFNUF9EUF9UWF9BVVhfV1JJVEVfRklGTwkJCTB4MTA0CisjZGVm aW5lIFpZTlFNUF9EUF9UWF9BVVhfQUREUkVTUwkJCTB4MTA4CisjZGVmaW5lIFpZTlFNUF9EUF9U WF9DTEtfRElWSURFUgkJCTB4MTBjCisjZGVmaW5lIFpZTlFNUF9EUF9UWF9DTEtfRElWSURFUl9N SFoJCQkxMDAwMDAwCisjZGVmaW5lIFpZTlFNUF9EUF9UWF9DTEtfRElWSURFUl9BVVhfRklMVEVS X1NISUZUCTgKKyNkZWZpbmUgWllOUU1QX0RQX1RYX0lOVFJfU0lHTkFMX1NUQVRFCQkJMHgxMzAK KyNkZWZpbmUgWllOUU1QX0RQX1RYX0lOVFJfU0lHTkFMX1NUQVRFX0hQRAkJQklUKDApCisjZGVm aW5lIFpZTlFNUF9EUF9UWF9JTlRSX1NJR05BTF9TVEFURV9SRVFVRVNUCQlCSVQoMSkKKyNkZWZp bmUgWllOUU1QX0RQX1RYX0lOVFJfU0lHTkFMX1NUQVRFX1JFUExZCQlCSVQoMikKKyNkZWZpbmUg WllOUU1QX0RQX1RYX0lOVFJfU0lHTkFMX1NUQVRFX1JFUExZX1RJTUVPVVQJQklUKDMpCisjZGVm aW5lIFpZTlFNUF9EUF9UWF9BVVhfUkVQTFlfREFUQQkJCTB4MTM0CisjZGVmaW5lIFpZTlFNUF9E UF9UWF9BVVhfUkVQTFlfQ09ERQkJCTB4MTM4CisjZGVmaW5lIFpZTlFNUF9EUF9UWF9BVVhfUkVQ TFlfQ09ERV9BVVhfQUNLCQkoMCkKKyNkZWZpbmUgWllOUU1QX0RQX1RYX0FVWF9SRVBMWV9DT0RF X0FVWF9OQUNLCQlCSVQoMCkKKyNkZWZpbmUgWllOUU1QX0RQX1RYX0FVWF9SRVBMWV9DT0RFX0FV WF9ERUZFUgkJQklUKDEpCisjZGVmaW5lIFpZTlFNUF9EUF9UWF9BVVhfUkVQTFlfQ09ERV9JMkNf QUNLCQkoMCkKKyNkZWZpbmUgWllOUU1QX0RQX1RYX0FVWF9SRVBMWV9DT0RFX0kyQ19OQUNLCQlC SVQoMikKKyNkZWZpbmUgWllOUU1QX0RQX1RYX0FVWF9SRVBMWV9DT0RFX0kyQ19ERUZFUgkJQklU KDMpCisjZGVmaW5lIFpZTlFNUF9EUF9UWF9BVVhfUkVQTFlfQ05UCQkJMHgxM2MKKyNkZWZpbmUg WllOUU1QX0RQX1RYX0FVWF9SRVBMWV9DTlRfTUFTSwkJCTB4ZmYKKyNkZWZpbmUgWllOUU1QX0RQ X1RYX0lOVFJfU1RBVFVTCQkJMHgxNDAKKyNkZWZpbmUgWllOUU1QX0RQX1RYX0lOVFJfTUFTSwkJ CQkweDE0NAorI2RlZmluZSBaWU5RTVBfRFBfVFhfSU5UUl9IUERfSVJRCQkJQklUKDApCisjZGVm aW5lIFpZTlFNUF9EUF9UWF9JTlRSX0hQRF9FVkVOVAkJCUJJVCgxKQorI2RlZmluZSBaWU5RTVBf RFBfVFhfSU5UUl9SRVBMWV9SRUNWCQkJQklUKDIpCisjZGVmaW5lIFpZTlFNUF9EUF9UWF9JTlRS X1JFUExZX1RJTUVPVVQJCQlCSVQoMykKKyNkZWZpbmUgWllOUU1QX0RQX1RYX0lOVFJfSFBEX1BV TFNFCQkJQklUKDQpCisjZGVmaW5lIFpZTlFNUF9EUF9UWF9JTlRSX0VYVF9QS1RfVFhECQkJQklU KDUpCisjZGVmaW5lIFpZTlFNUF9EUF9UWF9JTlRSX0xJVl9BQlVGX1VORFJGTFcJCUJJVCgxMikK KyNkZWZpbmUgWllOUU1QX0RQX1RYX0lOVFJfVkJMQU5LX1NUQVJUCQkJQklUKDEzKQorI2RlZmlu ZSBaWU5RTVBfRFBfVFhfSU5UUl9QSVhFTDBfTUFUQ0gJCQlCSVQoMTQpCisjZGVmaW5lIFpZTlFN UF9EUF9UWF9JTlRSX1BJWEVMMV9NQVRDSAkJCUJJVCgxNSkKKyNkZWZpbmUgWllOUU1QX0RQX1RY X0lOVFJfQ0hCVUZfVU5ERVJGTFdfTUFTSwkJMHgzZjAwMDAKKyNkZWZpbmUgWllOUU1QX0RQX1RY X0lOVFJfQ0hCVUZfT1ZFUkZMV19NQVNLCQkweGZjMDAwMDAKKyNkZWZpbmUgWllOUU1QX0RQX1RY X0lOVFJfQ1VTVF9UU18yCQkJQklUKDI4KQorI2RlZmluZSBaWU5RTVBfRFBfVFhfSU5UUl9DVVNU X1RTCQkJQklUKDI5KQorI2RlZmluZSBaWU5RTVBfRFBfVFhfSU5UUl9FWFRfVlNZTkNfVFMJCQlC SVQoMzApCisjZGVmaW5lIFpZTlFNUF9EUF9UWF9JTlRSX1ZTWU5DX1RTCQkJQklUKDMxKQorI2Rl ZmluZSBaWU5RTVBfRFBfVFhfSU5UUl9BTEwJCQkJKFpZTlFNUF9EUF9UWF9JTlRSX0hQRF9JUlEg fCBcCisJCQkJCQkJIFpZTlFNUF9EUF9UWF9JTlRSX0hQRF9FVkVOVCB8IFwKKwkJCQkJCQkgWllO UU1QX0RQX1RYX0lOVFJfUkVQTFlfUkVDViB8IFwKKwkJCQkJCQkgWllOUU1QX0RQX1RYX0lOVFJf UkVQTFlfVElNRU9VVCB8IFwKKwkJCQkJCQkgWllOUU1QX0RQX1RYX0lOVFJfSFBEX1BVTFNFIHwg XAorCQkJCQkJCSBaWU5RTVBfRFBfVFhfSU5UUl9FWFRfUEtUX1RYRCB8IFwKKwkJCQkJCQkgWllO UU1QX0RQX1RYX0lOVFJfTElWX0FCVUZfVU5EUkZMVyB8IFwKKwkJCQkJCQkgWllOUU1QX0RQX1RY X0lOVFJfQ0hCVUZfVU5ERVJGTFdfTUFTSyB8IFwKKwkJCQkJCQkgWllOUU1QX0RQX1RYX0lOVFJf Q0hCVUZfT1ZFUkZMV19NQVNLKQorI2RlZmluZSBaWU5RTVBfRFBfVFhfTk9fSU5UUl9BTEwJCQko WllOUU1QX0RQX1RYX0lOVFJfUElYRUwwX01BVENIIHwgXAorCQkJCQkJCSBaWU5RTVBfRFBfVFhf SU5UUl9QSVhFTDFfTUFUQ0ggfCBcCisJCQkJCQkJIFpZTlFNUF9EUF9UWF9JTlRSX0NVU1RfVFNf MiB8IFwKKwkJCQkJCQkgWllOUU1QX0RQX1RYX0lOVFJfQ1VTVF9UUyB8IFwKKwkJCQkJCQkgWllO UU1QX0RQX1RYX0lOVFJfRVhUX1ZTWU5DX1RTIHwgXAorCQkJCQkJCSBaWU5RTVBfRFBfVFhfSU5U Ul9WU1lOQ19UUykKKyNkZWZpbmUgWllOUU1QX0RQX1RYX1JFUExZX0RBVEFfQ05UCQkJMHgxNDgK KyNkZWZpbmUgWllOUU1QX0RQX1NVQl9UWF9JTlRSX1NUQVRVUwkJCTB4M2EwCisjZGVmaW5lIFpZ TlFNUF9EUF9TVUJfVFhfSU5UUl9NQVNLCQkJMHgzYTQKKyNkZWZpbmUgWllOUU1QX0RQX1NVQl9U WF9JTlRSX0VOCQkJMHgzYTgKKyNkZWZpbmUgWllOUU1QX0RQX1NVQl9UWF9JTlRSX0RTCQkJMHgz YWMKKworLyogTWFpbiBzdHJlYW0gYXR0cmlidXRlIHJlZ2lzdGVycyAqLworI2RlZmluZSBaWU5R TVBfRFBfVFhfTUFJTl9TVFJFQU1fSFRPVEFMCQkJMHgxODAKKyNkZWZpbmUgWllOUU1QX0RQX1RY X01BSU5fU1RSRUFNX1ZUT1RBTAkJCTB4MTg0CisjZGVmaW5lIFpZTlFNUF9EUF9UWF9NQUlOX1NU UkVBTV9QT0xBUklUWQkJMHgxODgKKyNkZWZpbmUgWllOUU1QX0RQX1RYX01BSU5fU1RSRUFNX1BP TEFSSVRZX0hTWU5DX1NISUZUCTAKKyNkZWZpbmUgWllOUU1QX0RQX1RYX01BSU5fU1RSRUFNX1BP TEFSSVRZX1ZTWU5DX1NISUZUCTEKKyNkZWZpbmUgWllOUU1QX0RQX1RYX01BSU5fU1RSRUFNX0hT V0lEVEgJCTB4MThjCisjZGVmaW5lIFpZTlFNUF9EUF9UWF9NQUlOX1NUUkVBTV9WU1dJRFRICQkw eDE5MAorI2RlZmluZSBaWU5RTVBfRFBfVFhfTUFJTl9TVFJFQU1fSFJFUwkJCTB4MTk0CisjZGVm aW5lIFpZTlFNUF9EUF9UWF9NQUlOX1NUUkVBTV9WUkVTCQkJMHgxOTgKKyNkZWZpbmUgWllOUU1Q X0RQX1RYX01BSU5fU1RSRUFNX0hTVEFSVAkJCTB4MTljCisjZGVmaW5lIFpZTlFNUF9EUF9UWF9N QUlOX1NUUkVBTV9WU1RBUlQJCQkweDFhMAorI2RlZmluZSBaWU5RTVBfRFBfVFhfTUFJTl9TVFJF QU1fTUlTQzAJCQkweDFhNAorI2RlZmluZSBaWU5RTVBfRFBfVFhfTUFJTl9TVFJFQU1fTUlTQzBf U1lOQwkJQklUKDApCisjZGVmaW5lIFpZTlFNUF9EUF9UWF9NQUlOX1NUUkVBTV9NSVNDMF9GT1JN QVRfU0hJRlQJMQorI2RlZmluZSBaWU5RTVBfRFBfVFhfTUFJTl9TVFJFQU1fTUlTQzBfRFlOQU1J Q19SQU5HRQlCSVQoMykKKyNkZWZpbmUgWllOUU1QX0RQX1RYX01BSU5fU1RSRUFNX01JU0MwX1lD QkNSX0NPTFJJTUVUUlkJQklUKDQpCisjZGVmaW5lIFpZTlFNUF9EUF9UWF9NQUlOX1NUUkVBTV9N SVNDMF9CUENfU0hJRlQJNQorI2RlZmluZSBaWU5RTVBfRFBfVFhfTUFJTl9TVFJFQU1fTUlTQzEJ CQkweDFhOAorI2RlZmluZSBaWU5RTVBfRFBfVFhfTUFJTl9TVFJFQU1fTUlTQzBfSU5URVJMQUNF RF9WRVJUCUJJVCgwKQorI2RlZmluZSBaWU5RTVBfRFBfVFhfTUFJTl9TVFJFQU1fTUlTQzBfU1RF UkVPX1ZJRF9TSElGVAkxCisjZGVmaW5lIFpZTlFNUF9EUF9UWF9NX1ZJRAkJCQkweDFhYworI2Rl ZmluZSBaWU5RTVBfRFBfVFhfVFJBTlNGRVJfVU5JVF9TSVpFCQkJMHgxYjAKKyNkZWZpbmUgWllO UU1QX0RQX1RYX0RFRl9UUkFOU0ZFUl9VTklUX1NJWkUJCTY0CisjZGVmaW5lIFpZTlFNUF9EUF9U WF9OX1ZJRAkJCQkweDFiNAorI2RlZmluZSBaWU5RTVBfRFBfVFhfVVNFUl9QSVhFTF9XSURUSAkJ CTB4MWI4CisjZGVmaW5lIFpZTlFNUF9EUF9UWF9VU0VSX0RBVEFfQ05UX1BFUl9MQU5FCQkweDFi YworI2RlZmluZSBaWU5RTVBfRFBfVFhfTUlOX0JZVEVTX1BFUl9UVQkJCTB4MWM0CisjZGVmaW5l IFpZTlFNUF9EUF9UWF9GUkFDX0JZVEVTX1BFUl9UVQkJCTB4MWM4CisjZGVmaW5lIFpZTlFNUF9E UF9UWF9JTklUX1dBSVQJCQkJMHgxY2MKKworLyogUEhZIGNvbmZpZ3VyYXRpb24gYW5kIHN0YXR1 cyByZWdpc3RlcnMgKi8KKyNkZWZpbmUgWllOUU1QX0RQX1RYX1BIWV9DT05GSUcJCQkJMHgyMDAK KyNkZWZpbmUgWllOUU1QX0RQX1RYX1BIWV9DT05GSUdfUEhZX1JFU0VUCQlCSVQoMCkKKyNkZWZp bmUgWllOUU1QX0RQX1RYX1BIWV9DT05GSUdfR1RUWF9SRVNFVAkJQklUKDEpCisjZGVmaW5lIFpZ TlFNUF9EUF9UWF9QSFlfQ09ORklHX1BIWV9QTUFfUkVTRVQJCUJJVCg4KQorI2RlZmluZSBaWU5R TVBfRFBfVFhfUEhZX0NPTkZJR19QSFlfUENTX1JFU0VUCQlCSVQoOSkKKyNkZWZpbmUgWllOUU1Q X0RQX1RYX1BIWV9DT05GSUdfQUxMX1JFU0VUCQkoWllOUU1QX0RQX1RYX1BIWV9DT05GSUdfUEhZ X1JFU0VUIHwgXAorCQkJCQkJCSBaWU5RTVBfRFBfVFhfUEhZX0NPTkZJR19HVFRYX1JFU0VUIHwg XAorCQkJCQkJCSBaWU5RTVBfRFBfVFhfUEhZX0NPTkZJR19QSFlfUE1BX1JFU0VUIHwgXAorCQkJ CQkJCSBaWU5RTVBfRFBfVFhfUEhZX0NPTkZJR19QSFlfUENTX1JFU0VUKQorI2RlZmluZSBaWU5R TVBfRFBfVFhfUEhZX1BSRUVNUEhBU0lTX0xBTkVfMAkJMHgyMTAKKyNkZWZpbmUgWllOUU1QX0RQ X1RYX1BIWV9QUkVFTVBIQVNJU19MQU5FXzEJCTB4MjE0CisjZGVmaW5lIFpZTlFNUF9EUF9UWF9Q SFlfUFJFRU1QSEFTSVNfTEFORV8yCQkweDIxOAorI2RlZmluZSBaWU5RTVBfRFBfVFhfUEhZX1BS RUVNUEhBU0lTX0xBTkVfMwkJMHgyMWMKKyNkZWZpbmUgWllOUU1QX0RQX1RYX1BIWV9WT0xUQUdF X0RJRkZfTEFORV8wCQkweDIyMAorI2RlZmluZSBaWU5RTVBfRFBfVFhfUEhZX1ZPTFRBR0VfRElG Rl9MQU5FXzEJCTB4MjI0CisjZGVmaW5lIFpZTlFNUF9EUF9UWF9QSFlfVk9MVEFHRV9ESUZGX0xB TkVfMgkJMHgyMjgKKyNkZWZpbmUgWllOUU1QX0RQX1RYX1BIWV9WT0xUQUdFX0RJRkZfTEFORV8z CQkweDIyYworI2RlZmluZSBaWU5RTVBfRFBfVFhfUEhZX0NMT0NLX0ZFRURCQUNLX1NFVFRJTkcJ CTB4MjM0CisjZGVmaW5lIFpZTlFNUF9EUF9UWF9QSFlfQ0xPQ0tfRkVFREJBQ0tfU0VUVElOR18x NjIJMHgxCisjZGVmaW5lIFpZTlFNUF9EUF9UWF9QSFlfQ0xPQ0tfRkVFREJBQ0tfU0VUVElOR18y NzAJMHgzCisjZGVmaW5lIFpZTlFNUF9EUF9UWF9QSFlfQ0xPQ0tfRkVFREJBQ0tfU0VUVElOR181 NDAJMHg1CisjZGVmaW5lIFpZTlFNUF9EUF9UWF9QSFlfUE9XRVJfRE9XTgkJCTB4MjM4CisjZGVm aW5lIFpZTlFNUF9EUF9UWF9QSFlfUE9XRVJfRE9XTl9MQU5FXzAJCUJJVCgwKQorI2RlZmluZSBa WU5RTVBfRFBfVFhfUEhZX1BPV0VSX0RPV05fTEFORV8xCQlCSVQoMSkKKyNkZWZpbmUgWllOUU1Q X0RQX1RYX1BIWV9QT1dFUl9ET1dOX0xBTkVfMgkJQklUKDIpCisjZGVmaW5lIFpZTlFNUF9EUF9U WF9QSFlfUE9XRVJfRE9XTl9MQU5FXzMJCUJJVCgzKQorI2RlZmluZSBaWU5RTVBfRFBfVFhfUEhZ X1BPV0VSX0RPV05fQUxMCQkJMHhmCisjZGVmaW5lIFpZTlFNUF9EUF9UWF9QSFlfUFJFQ1VSU09S X0xBTkVfMAkJMHgyM2MKKyNkZWZpbmUgWllOUU1QX0RQX1RYX1BIWV9QUkVDVVJTT1JfTEFORV8x CQkweDI0MAorI2RlZmluZSBaWU5RTVBfRFBfVFhfUEhZX1BSRUNVUlNPUl9MQU5FXzIJCTB4MjQ0 CisjZGVmaW5lIFpZTlFNUF9EUF9UWF9QSFlfUFJFQ1VSU09SX0xBTkVfMwkJMHgyNDgKKyNkZWZp bmUgWllOUU1QX0RQX1RYX1BIWV9QT1NUQ1VSU09SX0xBTkVfMAkJMHgyNGMKKyNkZWZpbmUgWllO UU1QX0RQX1RYX1BIWV9QT1NUQ1VSU09SX0xBTkVfMQkJMHgyNTAKKyNkZWZpbmUgWllOUU1QX0RQ X1RYX1BIWV9QT1NUQ1VSU09SX0xBTkVfMgkJMHgyNTQKKyNkZWZpbmUgWllOUU1QX0RQX1RYX1BI WV9QT1NUQ1VSU09SX0xBTkVfMwkJMHgyNTgKKyNkZWZpbmUgWllOUU1QX0RQX1NVQl9UWF9QSFlf UFJFQ1VSU09SX0xBTkVfMAkJMHgyNGMKKyNkZWZpbmUgWllOUU1QX0RQX1NVQl9UWF9QSFlfUFJF Q1VSU09SX0xBTkVfMQkJMHgyNTAKKyNkZWZpbmUgWllOUU1QX0RQX1RYX1BIWV9TVEFUVVMJCQkJ MHgyODAKKyNkZWZpbmUgWllOUU1QX0RQX1RYX1BIWV9TVEFUVVNfUExMX0xPQ0tFRF9TSElGVAk0 CisjZGVmaW5lIFpZTlFNUF9EUF9UWF9QSFlfU1RBVFVTX0ZQR0FfUExMX0xPQ0tFRAkJQklUKDYp CisKKy8qIEF1ZGlvIHJlZ2lzdGVycyAqLworI2RlZmluZSBaWU5RTVBfRFBfVFhfQVVESU9fQ09O VFJPTAkJCTB4MzAwCisjZGVmaW5lIFpZTlFNUF9EUF9UWF9BVURJT19DSEFOTkVMUwkJCTB4MzA0 CisjZGVmaW5lIFpZTlFNUF9EUF9UWF9BVURJT19JTkZPX0RBVEEJCQkweDMwOAorI2RlZmluZSBa WU5RTVBfRFBfVFhfQVVESU9fTV9BVUQJCQkweDMyOAorI2RlZmluZSBaWU5RTVBfRFBfVFhfQVVE SU9fTl9BVUQJCQkweDMyYworI2RlZmluZSBaWU5RTVBfRFBfVFhfQVVESU9fRVhUX0RBVEEJCQkw eDMzMAorCisjZGVmaW5lIFpZTlFNUF9EUF9NSVNDMF9SR0IJCQkJKDApCisjZGVmaW5lIFpZTlFN UF9EUF9NSVNDMF9ZQ1JDQl80MjIJCQkoNSA8PCAxKQorI2RlZmluZSBaWU5RTVBfRFBfTUlTQzBf WUNSQ0JfNDQ0CQkJKDYgPDwgMSkKKyNkZWZpbmUgWllOUU1QX0RQX01JU0MwX0ZPUk1BVF9NQVNL CQkJMHhlCisjZGVmaW5lIFpZTlFNUF9EUF9NSVNDMF9CUENfNgkJCQkoMCA8PCA1KQorI2RlZmlu ZSBaWU5RTVBfRFBfTUlTQzBfQlBDXzgJCQkJKDEgPDwgNSkKKyNkZWZpbmUgWllOUU1QX0RQX01J U0MwX0JQQ18xMAkJCQkoMiA8PCA1KQorI2RlZmluZSBaWU5RTVBfRFBfTUlTQzBfQlBDXzEyCQkJ CSgzIDw8IDUpCisjZGVmaW5lIFpZTlFNUF9EUF9NSVNDMF9CUENfMTYJCQkJKDQgPDwgNSkKKyNk ZWZpbmUgWllOUU1QX0RQX01JU0MwX0JQQ19NQVNLCQkJMHhlMAorI2RlZmluZSBaWU5RTVBfRFBf TUlTQzFfWV9PTkxZCQkJCSgxIDw8IDcpCisKKyNkZWZpbmUgWllOUU1QX0RQX01BWF9MQU5FUwkJ CQkyCisjZGVmaW5lIFpZTlFNUF9NQVhfRlJFUQkJCQkJMzAwMDAwMAorCisjZGVmaW5lIERQX1JF RFVDRURfQklUX1JBVEUJCQkJMTYyMDAwCisjZGVmaW5lIERQX0hJR0hfQklUX1JBVEUJCQkJMjcw MDAwCisjZGVmaW5lIERQX0hJR0hfQklUX1JBVEUyCQkJCTU0MDAwMAorI2RlZmluZSBEUF9NQVhf VFJBSU5JTkdfVFJJRVMJCQkJNQorI2RlZmluZSBEUF9WMV8yCQkJCQkJMHgxMgorCisvKioKKyAq IHN0cnVjdCB6eW5xbXBfZHBfbGlua19jb25maWcgLSBDb21tb24gbGluayBjb25maWcgYmV0d2Vl biBzb3VyY2UgYW5kIHNpbmsKKyAqIEBtYXhfcmF0ZTogbWF4aW11bSBsaW5rIHJhdGUKKyAqIEBt YXhfbGFuZXM6IG1heGltdW0gbnVtYmVyIG9mIGxhbmVzCisgKi8KK3N0cnVjdCB6eW5xbXBfZHBf bGlua19jb25maWcgeworCWludCBtYXhfcmF0ZTsKKwl1OCBtYXhfbGFuZXM7Cit9OworCisvKioK KyAqIHN0cnVjdCB6eW5xbXBfZHBfbW9kZSAtIENvbmZpZ3VyZWQgbW9kZSBvZiBEaXNwbGF5UG9y dAorICogQGJ3X2NvZGU6IGNvZGUgZm9yIGJhbmR3aWR0aChsaW5rIHJhdGUpCisgKiBAbGFuZV9j bnQ6IG51bWJlciBvZiBsYW5lcworICogQHBjbG9jazogcGl4ZWwgY2xvY2sgZnJlcXVlbmN5IG9m IGN1cnJlbnQgbW9kZQorICogQGZtdDogZm9ybWF0IGlkZW50aWZpZXIgc3RyaW5nCisgKi8KK3N0 cnVjdCB6eW5xbXBfZHBfbW9kZSB7CisJdTggYndfY29kZTsKKwl1OCBsYW5lX2NudDsKKwlpbnQg cGNsb2NrOworCWNvbnN0IGNoYXIgKmZtdDsKK307CisKKy8qKgorICogc3RydWN0IHp5bnFtcF9k cF9jb25maWcgLSBDb25maWd1cmF0aW9uIG9mIERpc3BsYXlQb3J0IGZyb20gRFRTCisgKiBAbWlz YzA6IG1pc2MwIGNvbmZpZ3VyYXRpb24gKHBlciBEUCB2MS4yIHNwZWMpCisgKiBAbWlzYzE6IG1p c2MxIGNvbmZpZ3VyYXRpb24gKHBlciBEUCB2MS4yIHNwZWMpCisgKiBAYnBwOiBiaXRzIHBlciBw aXhlbAorICogQGJwYzogYml0cyBwZXIgY29tcG9uZW50CisgKiBAbnVtX2NvbG9yczogbnVtYmVy IG9mIGNvbG9yIGNvbXBvbmVudHMKKyAqLworc3RydWN0IHp5bnFtcF9kcF9jb25maWcgeworCXU4 IG1pc2MwOworCXU4IG1pc2MxOworCXU4IGJwcDsKKwl1OCBicGM7CisJdTggbnVtX2NvbG9yczsK K307CisKKy8qKgorICogc3RydWN0IHp5bnFtcF9kcCAtIFhpbGlueCBEaXNwbGF5UG9ydCBjb3Jl CisgKiBAZW5jb2RlcjogdGhlIGRybSBlbmNvZGVyIHN0cnVjdHVyZQorICogQGNvbm5lY3Rvcjog dGhlIGRybSBjb25uZWN0b3Igc3RydWN0dXJlCisgKiBAZGV2OiBkZXZpY2Ugc3RydWN0dXJlCisg KiBAZHBzdWI6IERpc3BsYXkgc3Vic3lzdGVtCisgKiBAZHJtOiBEUk0gY29yZQorICogQGlvbWVt OiBkZXZpY2UgSS9PIG1lbW9yeSBmb3IgcmVnaXN0ZXIgYWNjZXNzCisgKiBAaXJxOiBpcnEKKyAq IEBjb25maWc6IElQIGNvcmUgY29uZmlndXJhdGlvbiBmcm9tIERUUworICogQGF1eDogYXV4IGNo YW5uZWwKKyAqIEBwaHk6IFBIWSBoYW5kbGVzIGZvciBEUCBsYW5lcworICogQG51bV9sYW5lczog bnVtYmVyIG9mIGVuYWJsZWQgcGh5IGxhbmVzCisgKiBAaHBkX3dvcms6IGhvdCBwbHVnIGRldGVj dGlvbiB3b3JrZXIKKyAqIEBzdGF0dXM6IGNvbm5lY3Rpb24gc3RhdHVzCisgKiBAZW5hYmxlZDog ZmxhZyB0byBpbmRpY2F0ZSBpZiB0aGUgZGV2aWNlIGlzIGVuYWJsZWQKKyAqIEBkcG1zOiBjdXJy ZW50IGRwbXMgc3RhdGUKKyAqIEBkcGNkOiBEUCBjb25maWd1cmF0aW9uIGRhdGEgZnJvbSBjdXJy ZW50bHkgY29ubmVjdGVkIHNpbmsgZGV2aWNlCisgKiBAbGlua19jb25maWc6IGNvbW1vbiBsaW5r IGNvbmZpZ3VyYXRpb24gYmV0d2VlbiBJUCBjb3JlIGFuZCBzaW5rIGRldmljZQorICogQG1vZGU6 IGN1cnJlbnQgbW9kZSBiZXR3ZWVuIElQIGNvcmUgYW5kIHNpbmsgZGV2aWNlCisgKiBAdHJhaW5f c2V0OiBzZXQgb2YgdHJhaW5pbmcgZGF0YQorICovCitzdHJ1Y3QgenlucW1wX2RwIHsKKwlzdHJ1 Y3QgZHJtX2VuY29kZXIgZW5jb2RlcjsKKwlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciBjb25uZWN0b3I7 CisJc3RydWN0IGRldmljZSAqZGV2OworCXN0cnVjdCB6eW5xbXBfZHBzdWIgKmRwc3ViOworCXN0 cnVjdCBkcm1fZGV2aWNlICpkcm07CisJdm9pZCBfX2lvbWVtICppb21lbTsKKwlpbnQgaXJxOwor CisJc3RydWN0IHp5bnFtcF9kcF9jb25maWcgY29uZmlnOworCXN0cnVjdCBkcm1fZHBfYXV4IGF1 eDsKKwlzdHJ1Y3QgcGh5ICpwaHlbWllOUU1QX0RQX01BWF9MQU5FU107CisJdTggbnVtX2xhbmVz OworCXN0cnVjdCBkZWxheWVkX3dvcmsgaHBkX3dvcms7CisJZW51bSBkcm1fY29ubmVjdG9yX3N0 YXR1cyBzdGF0dXM7CisJYm9vbCBlbmFibGVkOworCisJaW50IGRwbXM7CisJdTggZHBjZFtEUF9S RUNFSVZFUl9DQVBfU0laRV07CisJc3RydWN0IHp5bnFtcF9kcF9saW5rX2NvbmZpZyBsaW5rX2Nv bmZpZzsKKwlzdHJ1Y3QgenlucW1wX2RwX21vZGUgbW9kZTsKKwl1OCB0cmFpbl9zZXRbWllOUU1Q X0RQX01BWF9MQU5FU107Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCB6eW5xbXBfZHAgKmVu Y29kZXJfdG9fZHAoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQoreworCXJldHVybiBjb250 YWluZXJfb2YoZW5jb2Rlciwgc3RydWN0IHp5bnFtcF9kcCwgZW5jb2Rlcik7Cit9CisKK3N0YXRp YyBpbmxpbmUgc3RydWN0IHp5bnFtcF9kcCAqY29ubmVjdG9yX3RvX2RwKHN0cnVjdCBkcm1fY29u bmVjdG9yICpjb25uZWN0b3IpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihjb25uZWN0b3IsIHN0 cnVjdCB6eW5xbXBfZHAsIGNvbm5lY3Rvcik7Cit9CisKK3N0YXRpYyB2b2lkIHp5bnFtcF9kcF93 cml0ZSh2b2lkIF9faW9tZW0gKmJhc2UsIGludCBvZmZzZXQsIHUzMiB2YWwpCit7CisJd3JpdGVs KHZhbCwgYmFzZSArIG9mZnNldCk7Cit9CisKK3N0YXRpYyB1MzIgenlucW1wX2RwX3JlYWQodm9p ZCBfX2lvbWVtICpiYXNlLCBpbnQgb2Zmc2V0KQoreworCXJldHVybiByZWFkbChiYXNlICsgb2Zm c2V0KTsKK30KKworc3RhdGljIHZvaWQgenlucW1wX2RwX2Nscih2b2lkIF9faW9tZW0gKmJhc2Us IGludCBvZmZzZXQsIHUzMiBjbHIpCit7CisJenlucW1wX2RwX3dyaXRlKGJhc2UsIG9mZnNldCwg enlucW1wX2RwX3JlYWQoYmFzZSwgb2Zmc2V0KSAmIH5jbHIpOworfQorCitzdGF0aWMgdm9pZCB6 eW5xbXBfZHBfc2V0KHZvaWQgX19pb21lbSAqYmFzZSwgaW50IG9mZnNldCwgdTMyIHNldCkKK3sK Kwl6eW5xbXBfZHBfd3JpdGUoYmFzZSwgb2Zmc2V0LCB6eW5xbXBfZHBfcmVhZChiYXNlLCBvZmZz ZXQpIHwgc2V0KTsKK30KKworLyoKKyAqIEludGVybmFsIGZ1bmN0aW9uczogdXNlZCBieSB6eW5x bXBfZGlzcC5jCisgKi8KKworLyoqCisgKiB6eW5xbXBfZHBfdXBkYXRlX2JwcCAtIFVwZGF0ZSB0 aGUgY3VycmVudCBicHAgY29uZmlnCisgKiBAZHA6IERpc3BsYXlQb3J0IElQIGNvcmUgc3RydWN0 dXJlCisgKgorICogVXBkYXRlIHRoZSBjdXJyZW50IGJwcCBiYXNlZCBvbiB0aGUgY29sb3IgZm9y bWF0OiBicGMgJiBudW1fY29sb3JzLgorICogQW55IGZ1bmN0aW9uIHRoYXQgY2hhbmdlcyBicGMg b3IgbnVtX2NvbG9ycyBzaG91bGQgY2FsbCB0aGlzCisgKiB0byBrZWVwIHRoZSBicHAgdmFsdWUg aW4gc3luYy4KKyAqLworc3RhdGljIHZvaWQgenlucW1wX2RwX3VwZGF0ZV9icHAoc3RydWN0IHp5 bnFtcF9kcCAqZHApCit7CisJc3RydWN0IHp5bnFtcF9kcF9jb25maWcgKmNvbmZpZyA9ICZkcC0+ Y29uZmlnOworCisJY29uZmlnLT5icHAgPSBkcC0+Y29uZmlnLmJwYyAqIGRwLT5jb25maWcubnVt X2NvbG9yczsKK30KKworLyoqCisgKiB6eW5xbXBfZHBfc2V0X2NvbG9yIC0gU2V0IHRoZSBjb2xv cgorICogQGRwOiBEaXNwbGF5UG9ydCBJUCBjb3JlIHN0cnVjdHVyZQorICogQGNvbG9yOiBjb2xv ciBzdHJpbmcsIGZyb20genlucW1wX2Rpc3BfY29sb3JfZW51bQorICoKKyAqIFVwZGF0ZSBtaXNj IHJlZ2lzdGVyIHZhbHVlcyBiYXNlZCBvbiBAY29sb3Igc3RyaW5nLgorICoKKyAqIFJldHVybjog MCBvbiBzdWNjZXNzLCBvciAtRUlOVkFMLgorICovCitpbnQgenlucW1wX2RwX3NldF9jb2xvcihz dHJ1Y3QgenlucW1wX2RwICpkcCwgY29uc3QgY2hhciAqY29sb3IpCit7CisJc3RydWN0IHp5bnFt cF9kcF9jb25maWcgKmNvbmZpZyA9ICZkcC0+Y29uZmlnOworCisJY29uZmlnLT5taXNjMCAmPSB+ WllOUU1QX0RQX01JU0MwX0ZPUk1BVF9NQVNLOworCWNvbmZpZy0+bWlzYzEgJj0gflpZTlFNUF9E UF9NSVNDMV9ZX09OTFk7CisJaWYgKHN0cmNtcChjb2xvciwgInJnYiIpID09IDApIHsKKwkJY29u ZmlnLT5taXNjMCB8PSBaWU5RTVBfRFBfTUlTQzBfUkdCOworCQljb25maWctPm51bV9jb2xvcnMg PSAzOworCX0gZWxzZSBpZiAoc3RyY21wKGNvbG9yLCAieWNyY2I0MjIiKSA9PSAwKSB7CisJCWNv bmZpZy0+bWlzYzAgfD0gWllOUU1QX0RQX01JU0MwX1lDUkNCXzQyMjsKKwkJY29uZmlnLT5udW1f Y29sb3JzID0gMjsKKwl9IGVsc2UgaWYgKHN0cmNtcChjb2xvciwgInljcmNiNDQ0IikgPT0gMCkg eworCQljb25maWctPm1pc2MwIHw9IFpZTlFNUF9EUF9NSVNDMF9ZQ1JDQl80NDQ7CisJCWNvbmZp Zy0+bnVtX2NvbG9ycyA9IDM7CisJfSBlbHNlIGlmIChzdHJjbXAoY29sb3IsICJ5b25seSIpID09 IDApIHsKKwkJY29uZmlnLT5taXNjMSB8PSBaWU5RTVBfRFBfTUlTQzFfWV9PTkxZOworCQljb25m aWctPm51bV9jb2xvcnMgPSAxOworCX0gZWxzZSB7CisJCWRldl9lcnIoZHAtPmRldiwgIkludmFs aWQgY29sb3JtZXRyeSBpbiBEVFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwl6eW5xbXBf ZHBfdXBkYXRlX2JwcChkcCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB6eW5xbXBfZHBf ZW5hYmxlX3ZibGFuayAtIEVuYWJsZSB2YmxhbmsKKyAqIEBkcDogRGlzcGxheVBvcnQgSVAgY29y ZSBzdHJ1Y3R1cmUKKyAqCisgKiBFbmFibGUgdmJsYW5rIGludGVycnVwdAorICovCit2b2lkIHp5 bnFtcF9kcF9lbmFibGVfdmJsYW5rKHN0cnVjdCB6eW5xbXBfZHAgKmRwKQoreworCXp5bnFtcF9k cF93cml0ZShkcC0+aW9tZW0sIFpZTlFNUF9EUF9TVUJfVFhfSU5UUl9FTiwKKwkJCVpZTlFNUF9E UF9UWF9JTlRSX1ZCTEFOS19TVEFSVCk7Cit9CisKKy8qKgorICogenlucW1wX2RwX2Rpc2FibGVf dmJsYW5rIC0gRGlzYWJsZSB2YmxhbmsKKyAqIEBkcDogRGlzcGxheVBvcnQgSVAgY29yZSBzdHJ1 Y3R1cmUKKyAqCisgKiBEaXNhYmxlIHZibGFuayBpbnRlcnJ1cHQKKyAqLwordm9pZCB6eW5xbXBf ZHBfZGlzYWJsZV92Ymxhbmsoc3RydWN0IHp5bnFtcF9kcCAqZHApCit7CisJenlucW1wX2RwX3dy aXRlKGRwLT5pb21lbSwgWllOUU1QX0RQX1NVQl9UWF9JTlRSX0RTLAorCQkJWllOUU1QX0RQX1RY X0lOVFJfVkJMQU5LX1NUQVJUKTsKK30KKworLyoKKyAqIERQIFBIWSBmdW5jdGlvbnMKKyAqLwor CisvKioKKyAqIHp5bnFtcF9kcF9pbml0X3BoeSAtIEluaXRpYWxpemUgdGhlIHBoeQorICogQGRw OiBEaXNwbGF5UG9ydCBJUCBjb3JlIHN0cnVjdHVyZQorICoKKyAqIEluaXRpYWxpemUgdGhlIHBo eS4KKyAqCisgKiBSZXR1cm46IDAgaWYgdGhlIHBoeSBpbnN0YW5jZXMgYXJlIGluaXRpYWxpemVk IGNvcnJlY3RseSwgb3IgdGhlIGVycm9yIGNvZGUKKyAqIHJldHVybmVkIGZyb20gdGhlIGNhbGxl ZSBmdW5jdGlvbnMuCisgKi8KK3N0YXRpYyBpbnQgenlucW1wX2RwX2luaXRfcGh5KHN0cnVjdCB6 eW5xbXBfZHAgKmRwKQoreworCXVuc2lnbmVkIGludCBpOworCWludCByZXQ7CisKKwlmb3IgKGkg PSAwOyBpIDwgWllOUU1QX0RQX01BWF9MQU5FUzsgaSsrKSB7CisJCXJldCA9IHBoeV9pbml0KGRw LT5waHlbaV0pOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKGRwLT5kZXYsICJmYWlsZWQgdG8g aW5pdCBwaHkgbGFuZSAlZFxuIiwgaSk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJenlu cW1wX2RwX3dyaXRlKGRwLT5pb21lbSwgWllOUU1QX0RQX1NVQl9UWF9JTlRSX0RTLAorCQkJWllO UU1QX0RQX1RYX0lOVFJfQUxMKTsKKwl6eW5xbXBfZHBfY2xyKGRwLT5pb21lbSwgWllOUU1QX0RQ X1RYX1BIWV9DT05GSUcsCisJCSAgICAgIFpZTlFNUF9EUF9UWF9QSFlfQ09ORklHX0FMTF9SRVNF VCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB6eW5xbXBfZHBfZXhpdF9waHkgLSBFeGl0 IHRoZSBwaHkKKyAqIEBkcDogRGlzcGxheVBvcnQgSVAgY29yZSBzdHJ1Y3R1cmUKKyAqCisgKiBF eGl0IHRoZSBwaHkuCisgKi8KK3N0YXRpYyB2b2lkIHp5bnFtcF9kcF9leGl0X3BoeShzdHJ1Y3Qg enlucW1wX2RwICpkcCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgcmV0OworCisJZm9yIChp ID0gMDsgaSA8IFpZTlFNUF9EUF9NQVhfTEFORVM7IGkrKykgeworCQlyZXQgPSBwaHlfZXhpdChk cC0+cGh5W2ldKTsKKwkJaWYgKHJldCkKKwkJCWRldl9lcnIoZHAtPmRldiwgImZhaWxlZCB0byBl eGl0IHBoeSglZCkgJWRcbiIsIGksIHJldCk7CisJfQorfQorCisvKioKKyAqIHp5bnFtcF9kcF9w aHlfcmVhZHkgLSBDaGVjayBpZiBQSFkgaXMgcmVhZHkKKyAqIEBkcDogRGlzcGxheVBvcnQgSVAg Y29yZSBzdHJ1Y3R1cmUKKyAqCisgKiBDaGVjayBpZiBQSFkgaXMgcmVhZHkuIElmIFBIWSBpcyBu b3QgcmVhZHksIHdhaXQgMW1zIHRvIGNoZWNrIGZvciAxMDAgdGltZXMuCisgKiBUaGlzIGFtb3Vu dCBvZiBkZWxheSB3YXMgc3VnZ2VzdGVkIGJ5IElQIGRlc2lnbmVyLgorICoKKyAqIFJldHVybjog MCBpZiBQSFkgaXMgcmVhZHksIG9yIC1FTk9ERVYgaWYgUEhZIGlzIG5vdCByZWFkeS4KKyAqLwor c3RhdGljIGludCB6eW5xbXBfZHBfcGh5X3JlYWR5KHN0cnVjdCB6eW5xbXBfZHAgKmRwKQorewor CXUzMiBpLCByZWcsIHJlYWR5OworCisJcmVhZHkgPSAoMSA8PCBaWU5RTVBfRFBfTUFYX0xBTkVT KSAtIDE7CisKKwkvKiBXYWl0IGZvciAxMDAgKiAxbXMuIFRoaXMgc2hvdWxkIGJlIGVub3VnaCB0 aW1lIGZvciBQSFkgdG8gYmUgcmVhZHkgKi8KKwlmb3IgKGkgPSAwOyA7IGkrKykgeworCQlyZWcg PSB6eW5xbXBfZHBfcmVhZChkcC0+aW9tZW0sIFpZTlFNUF9EUF9UWF9QSFlfU1RBVFVTKTsKKwkJ aWYgKChyZWcgJiByZWFkeSkgPT0gcmVhZHkpCisJCQlyZXR1cm4gMDsKKworCQlpZiAoaSA9PSAx MDApIHsKKwkJCWRldl9lcnIoZHAtPmRldiwgIlBIWSBpc24ndCByZWFkeVxuIik7CisJCQlyZXR1 cm4gLUVOT0RFVjsKKwkJfQorCisJCXVzbGVlcF9yYW5nZSgxMDAwLCAxMTAwKTsKKwl9CisKKwly ZXR1cm4gMDsKK30KKworLyoKKyAqIERQIGZ1bmN0aW9ucworICovCisKKy8qKgorICogenlucW1w X2RwX21heF9yYXRlIC0gQ2FsY3VsYXRlIGFuZCByZXR1cm4gYXZhaWxhYmxlIG1heCBwaXhlbCBj bG9jaworICogQGxpbmtfcmF0ZTogbGluayByYXRlIChLaWxvLWJ5dGVzIC8gc2VjKQorICogQGxh bmVfbnVtOiBudW1iZXIgb2YgbGFuZXMKKyAqIEBicHA6IGJpdHMgcGVyIHBpeGVsCisgKgorICog UmV0dXJuOiBtYXggcGl4ZWwgY2xvY2sgKEtIeikgc3VwcG9ydGVkIGJ5IGN1cnJlbnQgbGluayBj b25maWcuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHp5bnFtcF9kcF9tYXhfcmF0ZShpbnQgbGlu a19yYXRlLCB1OCBsYW5lX251bSwgdTggYnBwKQoreworCXJldHVybiBsaW5rX3JhdGUgKiBsYW5l X251bSAqIDggLyBicHA7Cit9CisKKy8qKgorICogenlucW1wX2RwX21vZGVfY29uZmlndXJlIC0g Q29uZmlndXJlIHRoZSBsaW5rIHZhbHVlcworICogQGRwOiBEaXNwbGF5UG9ydCBJUCBjb3JlIHN0 cnVjdHVyZQorICogQHBjbG9jazogcGl4ZWwgY2xvY2sgZm9yIHJlcXVlc3RlZCBkaXNwbGF5IG1v ZGUKKyAqIEBjdXJyZW50X2J3OiBjdXJyZW50IGxpbmsgcmF0ZQorICoKKyAqIEZpbmQgdGhlIGxp bmsgY29uZmlndXJhdGlvbiB2YWx1ZXMsIHJhdGUgYW5kIGxhbmUgY291bnQgZm9yIHJlcXVlc3Rl ZCBwaXhlbAorICogY2xvY2sgQHBjbG9jay4gVGhlIEBwY2xvY2sgaXMgc3RvcmVkIGluIHRoZSBt b2RlIHRvIGJlIHVzZWQgaW4gb3RoZXIKKyAqIGZ1bmN0aW9ucyBsYXRlci4gVGhlIHJldHVybmVk IHJhdGUgaXMgZG93bnNoaWZ0ZWQgZnJvbSB0aGUgY3VycmVudCByYXRlCisgKiBAY3VycmVudF9i dy4KKyAqCisgKiBSZXR1cm46IEN1cnJlbnQgbGluayByYXRlIGNvZGUsIG9yIC1FSU5WQUwuCisg Ki8KK3N0YXRpYyBpbnQgenlucW1wX2RwX21vZGVfY29uZmlndXJlKHN0cnVjdCB6eW5xbXBfZHAg KmRwLCBpbnQgcGNsb2NrLAorCQkJCSAgICB1OCBjdXJyZW50X2J3KQoreworCWludCBtYXhfcmF0 ZSA9IGRwLT5saW5rX2NvbmZpZy5tYXhfcmF0ZTsKKwl1OCBid3NbM10gPSB7IERQX0xJTktfQldf MV82MiwgRFBfTElOS19CV18yXzcsIERQX0xJTktfQldfNV80IH07CisJdTggbWF4X2xhbmVzID0g ZHAtPmxpbmtfY29uZmlnLm1heF9sYW5lczsKKwl1OCBtYXhfbGlua19yYXRlX2NvZGUgPSBkcm1f ZHBfbGlua19yYXRlX3RvX2J3X2NvZGUobWF4X3JhdGUpOworCXU4IGJwcCA9IGRwLT5jb25maWcu YnBwOworCXU4IGxhbmVfY250OworCXM4IGk7CisKKwlpZiAoY3VycmVudF9idyA9PSBEUF9MSU5L X0JXXzFfNjIpIHsKKwkJZGV2X2VycihkcC0+ZGV2LCAiY2FuJ3QgZG93bnNoaWZ0LiBhbHJlYWR5 IGxvd2VzdCBsaW5rIHJhdGVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlmb3IgKGkg PSBBUlJBWV9TSVpFKGJ3cykgLSAxOyBpID49IDA7IGktLSkgeworCQlpZiAoY3VycmVudF9idyAm JiBid3NbaV0gPj0gY3VycmVudF9idykKKwkJCWNvbnRpbnVlOworCisJCWlmIChid3NbaV0gPD0g bWF4X2xpbmtfcmF0ZV9jb2RlKQorCQkJYnJlYWs7CisJfQorCisJZm9yIChsYW5lX2NudCA9IDE7 IGxhbmVfY250IDw9IG1heF9sYW5lczsgbGFuZV9jbnQgPDw9IDEpIHsKKwkJaW50IGJ3OworCQl1 MzIgcmF0ZTsKKworCQlidyA9IGRybV9kcF9id19jb2RlX3RvX2xpbmtfcmF0ZShid3NbaV0pOwor CQlyYXRlID0genlucW1wX2RwX21heF9yYXRlKGJ3LCBsYW5lX2NudCwgYnBwKTsKKwkJaWYgKHBj bG9jayA8PSByYXRlKSB7CisJCQlkcC0+bW9kZS5id19jb2RlID0gYndzW2ldOworCQkJZHAtPm1v ZGUubGFuZV9jbnQgPSBsYW5lX2NudDsKKwkJCWRwLT5tb2RlLnBjbG9jayA9IHBjbG9jazsKKwkJ CXJldHVybiBkcC0+bW9kZS5id19jb2RlOworCQl9CisJfQorCisJZGV2X2VycihkcC0+ZGV2LCAi ZmFpbGVkIHRvIGNvbmZpZ3VyZSBsaW5rIHZhbHVlc1xuIik7CisKKwlyZXR1cm4gLUVJTlZBTDsK K30KKworLyoqCisgKiB6eW5xbXBfZHBfYWRqdXN0X3RyYWluIC0gQWRqdXN0IHRyYWluIHZhbHVl cworICogQGRwOiBEaXNwbGF5UG9ydCBJUCBjb3JlIHN0cnVjdHVyZQorICogQGxpbmtfc3RhdHVz OiBsaW5rIHN0YXR1cyBmcm9tIHNpbmsgd2hpY2ggY29udGFpbnMgcmVxdWVzdGVkIHRyYWluaW5n IHZhbHVlcworICovCitzdGF0aWMgdm9pZCB6eW5xbXBfZHBfYWRqdXN0X3RyYWluKHN0cnVjdCB6 eW5xbXBfZHAgKmRwLAorCQkJCSAgIHU4IGxpbmtfc3RhdHVzW0RQX0xJTktfU1RBVFVTX1NJWkVd KQoreworCXU4ICp0cmFpbl9zZXQgPSBkcC0+dHJhaW5fc2V0OworCXU4IHZvbHRhZ2UgPSAwLCBw cmVlbXBoYXNpcyA9IDA7CisJdTggaTsKKworCWZvciAoaSA9IDA7IGkgPCBkcC0+bW9kZS5sYW5l X2NudDsgaSsrKSB7CisJCXU4IHYgPSBkcm1fZHBfZ2V0X2FkanVzdF9yZXF1ZXN0X3ZvbHRhZ2Uo bGlua19zdGF0dXMsIGkpOworCQl1OCBwID0gZHJtX2RwX2dldF9hZGp1c3RfcmVxdWVzdF9wcmVf ZW1waGFzaXMobGlua19zdGF0dXMsIGkpOworCisJCWlmICh2ID4gdm9sdGFnZSkKKwkJCXZvbHRh Z2UgPSB2OworCisJCWlmIChwID4gcHJlZW1waGFzaXMpCisJCQlwcmVlbXBoYXNpcyA9IHA7CisJ fQorCisJaWYgKHZvbHRhZ2UgPj0gRFBfVFJBSU5fVk9MVEFHRV9TV0lOR19MRVZFTF8zKQorCQl2 b2x0YWdlIHw9IERQX1RSQUlOX01BWF9TV0lOR19SRUFDSEVEOworCisJaWYgKHByZWVtcGhhc2lz ID49IERQX1RSQUlOX1BSRV9FTVBIX0xFVkVMXzIpCisJCXByZWVtcGhhc2lzIHw9IERQX1RSQUlO X01BWF9QUkVfRU1QSEFTSVNfUkVBQ0hFRDsKKworCWZvciAoaSA9IDA7IGkgPCBkcC0+bW9kZS5s YW5lX2NudDsgaSsrKQorCQl0cmFpbl9zZXRbaV0gPSB2b2x0YWdlIHwgcHJlZW1waGFzaXM7Cit9 CisKKy8qKgorICogenlucW1wX2RwX3VwZGF0ZV92c19lbXBoIC0gVXBkYXRlIHRoZSB0cmFpbmlu ZyB2YWx1ZXMKKyAqIEBkcDogRGlzcGxheVBvcnQgSVAgY29yZSBzdHJ1Y3R1cmUKKyAqCisgKiBV cGRhdGUgdGhlIHRyYWluaW5nIHZhbHVlcyBiYXNlZCBvbiB0aGUgcmVxdWVzdCBmcm9tIHNpbmsu IFRoZSBtYXBwZWQgdmFsdWVzCisgKiBhcmUgcHJlZGVmaW5lZCwgYW5kIHZhbHVlcyh2cywgcGUs IHBjKSBhcmUgZnJvbSB0aGUgZGV2aWNlIG1hbnVhbC4KKyAqCisgKiBSZXR1cm46IDAgaWYgdnMg YW5kIGVtcGggYXJlIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5LCBvciB0aGUgZXJyb3IgY29kZSByZXR1 cm5lZAorICogYnkgZHJtX2RwX2RwY2Rfd3JpdGUoKS4KKyAqLworc3RhdGljIGludCB6eW5xbXBf ZHBfdXBkYXRlX3ZzX2VtcGgoc3RydWN0IHp5bnFtcF9kcCAqZHApCit7CisJdTggKnRyYWluX3Nl dCA9IGRwLT50cmFpbl9zZXQ7CisJdTggaSwgdl9sZXZlbCwgcF9sZXZlbDsKKwlpbnQgcmV0Owor CisJcmV0ID0gZHJtX2RwX2RwY2Rfd3JpdGUoJmRwLT5hdXgsIERQX1RSQUlOSU5HX0xBTkUwX1NF VCwgdHJhaW5fc2V0LAorCQkJCWRwLT5tb2RlLmxhbmVfY250KTsKKwlpZiAocmV0IDwgMCkKKwkJ cmV0dXJuIHJldDsKKworCWZvciAoaSA9IDA7IGkgPCBkcC0+bW9kZS5sYW5lX2NudDsgaSsrKSB7 CisJCXUzMiByZWcgPSBaWU5RTVBfRFBfU1VCX1RYX1BIWV9QUkVDVVJTT1JfTEFORV8wICsgaSAq IDQ7CisKKwkJdl9sZXZlbCA9ICh0cmFpbl9zZXRbaV0gJiBEUF9UUkFJTl9WT0xUQUdFX1NXSU5H X01BU0spID4+CisJCQkgIERQX1RSQUlOX1ZPTFRBR0VfU1dJTkdfU0hJRlQ7CisJCXBfbGV2ZWwg PSAodHJhaW5fc2V0W2ldICYgRFBfVFJBSU5fUFJFX0VNUEhBU0lTX01BU0spID4+CisJCQkgIERQ X1RSQUlOX1BSRV9FTVBIQVNJU19TSElGVDsKKworCQl6eW5xbXBfZHBfd3JpdGUoZHAtPmlvbWVt LCByZWcsIDB4Mik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogenlucW1wX2RwX2xp bmtfdHJhaW5fY3IgLSBUcmFpbiBjbG9jayByZWNvdmVyeQorICogQGRwOiBEaXNwbGF5UG9ydCBJ UCBjb3JlIHN0cnVjdHVyZQorICoKKyAqIFJldHVybjogMCBpZiBjbG9jayByZWNvdmVyeSB0cmFp biBpcyBkb25lIHN1Y2Nlc3NmdWxseSwgb3IgY29ycmVzcG9uZGluZworICogZXJyb3IgY29kZS4K KyAqLworc3RhdGljIGludCB6eW5xbXBfZHBfbGlua190cmFpbl9jcihzdHJ1Y3QgenlucW1wX2Rw ICpkcCkKK3sKKwl1OCBsaW5rX3N0YXR1c1tEUF9MSU5LX1NUQVRVU19TSVpFXTsKKwl1OCBsYW5l X2NudCA9IGRwLT5tb2RlLmxhbmVfY250OworCXU4IHZzID0gMCwgdHJpZXMgPSAwOworCXUxNiBt YXhfdHJpZXMsIGk7CisJYm9vbCBjcl9kb25lOworCWludCByZXQ7CisKKwl6eW5xbXBfZHBfd3Jp dGUoZHAtPmlvbWVtLCBaWU5RTVBfRFBfVFhfVFJBSU5JTkdfUEFUVEVSTl9TRVQsCisJCQlEUF9U UkFJTklOR19QQVRURVJOXzEpOworCXJldCA9IGRybV9kcF9kcGNkX3dyaXRlYigmZHAtPmF1eCwg RFBfVFJBSU5JTkdfUEFUVEVSTl9TRVQsCisJCQkJIERQX1RSQUlOSU5HX1BBVFRFUk5fMSB8CisJ CQkJIERQX0xJTktfU0NSQU1CTElOR19ESVNBQkxFKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJu IHJldDsKKworCS8qCisJICogMjU2IGxvb3BzIHNob3VsZCBiZSBtYXhpbXVtIGl0ZXJhdGlvbnMg Zm9yIDQgbGFuZXMgYW5kIDQgdmFsdWVzLgorCSAqIFNvLCBUaGlzIGxvb3Agc2hvdWxkIGV4aXQg YmVmb3JlIDUxMiBpdGVyYXRpb25zCisJICovCisJZm9yIChtYXhfdHJpZXMgPSAwOyBtYXhfdHJp ZXMgPCA1MTI7IG1heF90cmllcysrKSB7CisJCXJldCA9IHp5bnFtcF9kcF91cGRhdGVfdnNfZW1w aChkcCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCWRybV9kcF9saW5rX3RyYWlu X2Nsb2NrX3JlY292ZXJ5X2RlbGF5KGRwLT5kcGNkKTsKKwkJcmV0ID0gZHJtX2RwX2RwY2RfcmVh ZF9saW5rX3N0YXR1cygmZHAtPmF1eCwgbGlua19zdGF0dXMpOworCQlpZiAocmV0IDwgMCkKKwkJ CXJldHVybiByZXQ7CisKKwkJY3JfZG9uZSA9IGRybV9kcF9jbG9ja19yZWNvdmVyeV9vayhsaW5r X3N0YXR1cywgbGFuZV9jbnQpOworCQlpZiAoY3JfZG9uZSkKKwkJCWJyZWFrOworCisJCWZvciAo aSA9IDA7IGkgPCBsYW5lX2NudDsgaSsrKQorCQkJaWYgKCEoZHAtPnRyYWluX3NldFtpXSAmIERQ X1RSQUlOX01BWF9TV0lOR19SRUFDSEVEKSkKKwkJCQlicmVhazsKKwkJaWYgKGkgPT0gbGFuZV9j bnQpCisJCQlicmVhazsKKworCQlpZiAoKGRwLT50cmFpbl9zZXRbMF0gJiBEUF9UUkFJTl9WT0xU QUdFX1NXSU5HX01BU0spID09IHZzKQorCQkJdHJpZXMrKzsKKwkJZWxzZQorCQkJdHJpZXMgPSAw OworCisJCWlmICh0cmllcyA9PSBEUF9NQVhfVFJBSU5JTkdfVFJJRVMpCisJCQlicmVhazsKKwor CQl2cyA9IGRwLT50cmFpbl9zZXRbMF0gJiBEUF9UUkFJTl9WT0xUQUdFX1NXSU5HX01BU0s7CisJ CXp5bnFtcF9kcF9hZGp1c3RfdHJhaW4oZHAsIGxpbmtfc3RhdHVzKTsKKwl9CisKKwlpZiAoIWNy X2RvbmUpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogenlucW1w X2RwX2xpbmtfdHJhaW5fY2UgLSBUcmFpbiBjaGFubmVsIGVxdWFsaXphdGlvbgorICogQGRwOiBE aXNwbGF5UG9ydCBJUCBjb3JlIHN0cnVjdHVyZQorICoKKyAqIFJldHVybjogMCBpZiBjaGFubmVs IGVxdWFsaXphdGlvbiB0cmFpbiBpcyBkb25lIHN1Y2Nlc3NmdWxseSwgb3IKKyAqIGNvcnJlc3Bv bmRpbmcgZXJyb3IgY29kZS4KKyAqLworc3RhdGljIGludCB6eW5xbXBfZHBfbGlua190cmFpbl9j ZShzdHJ1Y3QgenlucW1wX2RwICpkcCkKK3sKKwl1OCBsaW5rX3N0YXR1c1tEUF9MSU5LX1NUQVRV U19TSVpFXTsKKwl1OCBsYW5lX2NudCA9IGRwLT5tb2RlLmxhbmVfY250OworCXUzMiBwYXQsIHRy aWVzOworCWludCByZXQ7CisJYm9vbCBjZV9kb25lOworCisJaWYgKGRwLT5kcGNkW0RQX0RQQ0Rf UkVWXSA+PSBEUF9WMV8yICYmCisJICAgIGRwLT5kcGNkW0RQX01BWF9MQU5FX0NPVU5UXSAmIERQ X1RQUzNfU1VQUE9SVEVEKQorCQlwYXQgPSBEUF9UUkFJTklOR19QQVRURVJOXzM7CisJZWxzZQor CQlwYXQgPSBEUF9UUkFJTklOR19QQVRURVJOXzI7CisKKwl6eW5xbXBfZHBfd3JpdGUoZHAtPmlv bWVtLCBaWU5RTVBfRFBfVFhfVFJBSU5JTkdfUEFUVEVSTl9TRVQsIHBhdCk7CisJcmV0ID0gZHJt X2RwX2RwY2Rfd3JpdGViKCZkcC0+YXV4LCBEUF9UUkFJTklOR19QQVRURVJOX1NFVCwKKwkJCQkg cGF0IHwgRFBfTElOS19TQ1JBTUJMSU5HX0RJU0FCTEUpOworCWlmIChyZXQgPCAwKQorCQlyZXR1 cm4gcmV0OworCisJZm9yICh0cmllcyA9IDA7IHRyaWVzIDwgRFBfTUFYX1RSQUlOSU5HX1RSSUVT OyB0cmllcysrKSB7CisJCXJldCA9IHp5bnFtcF9kcF91cGRhdGVfdnNfZW1waChkcCk7CisJCWlm IChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCWRybV9kcF9saW5rX3RyYWluX2NoYW5uZWxfZXFf ZGVsYXkoZHAtPmRwY2QpOworCQlyZXQgPSBkcm1fZHBfZHBjZF9yZWFkX2xpbmtfc3RhdHVzKCZk cC0+YXV4LCBsaW5rX3N0YXR1cyk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwor CQljZV9kb25lID0gZHJtX2RwX2NoYW5uZWxfZXFfb2sobGlua19zdGF0dXMsIGxhbmVfY250KTsK KwkJaWYgKGNlX2RvbmUpCisJCQlicmVhazsKKworCQl6eW5xbXBfZHBfYWRqdXN0X3RyYWluKGRw LCBsaW5rX3N0YXR1cyk7CisJfQorCisJaWYgKCFjZV9kb25lKQorCQlyZXR1cm4gLUVJTzsKKwor CXJldHVybiAwOworfQorCisvKioKKyAqIHp5bnFtcF9kcF9saW5rX3RyYWluIC0gVHJhaW4gdGhl IGxpbmsKKyAqIEBkcDogRGlzcGxheVBvcnQgSVAgY29yZSBzdHJ1Y3R1cmUKKyAqCisgKiBSZXR1 cm46IDAgaWYgYWxsIHRyYWlucyBhcmUgZG9uZSBzdWNjZXNzZnVsbHksIG9yIGNvcnJlc3BvbmRp bmcgZXJyb3IgY29kZS4KKyAqLworc3RhdGljIGludCB6eW5xbXBfZHBfdHJhaW4oc3RydWN0IHp5 bnFtcF9kcCAqZHApCit7CisJdTMyIHJlZzsKKwl1OCBid19jb2RlID0gZHAtPm1vZGUuYndfY29k ZTsKKwl1OCBsYW5lX2NudCA9IGRwLT5tb2RlLmxhbmVfY250OworCXU4IGF1eF9sYW5lX2NudCA9 IGxhbmVfY250OworCWJvb2wgZW5oYW5jZWQ7CisJaW50IHJldDsKKworCXp5bnFtcF9kcF93cml0 ZShkcC0+aW9tZW0sIFpZTlFNUF9EUF9UWF9MQU5FX0NOVF9TRVQsIGxhbmVfY250KTsKKwllbmhh bmNlZCA9IGRybV9kcF9lbmhhbmNlZF9mcmFtZV9jYXAoZHAtPmRwY2QpOworCWlmIChlbmhhbmNl ZCkgeworCQl6eW5xbXBfZHBfd3JpdGUoZHAtPmlvbWVtLCBaWU5RTVBfRFBfVFhfRU5IQU5DRURf RlJBTUVfRU4sIDEpOworCQlhdXhfbGFuZV9jbnQgfD0gRFBfTEFORV9DT1VOVF9FTkhBTkNFRF9G UkFNRV9FTjsKKwl9CisKKwlpZiAoZHAtPmRwY2RbM10gJiAweDEpIHsKKwkJenlucW1wX2RwX3dy aXRlKGRwLT5pb21lbSwgWllOUU1QX0RQX1RYX0RPV05TUFJFQURfQ1RMLCAxKTsKKwkJZHJtX2Rw X2RwY2Rfd3JpdGViKCZkcC0+YXV4LCBEUF9ET1dOU1BSRUFEX0NUUkwsCisJCQkJICAgRFBfU1BS RUFEX0FNUF8wXzUpOworCX0gZWxzZSB7CisJCXp5bnFtcF9kcF93cml0ZShkcC0+aW9tZW0sIFpZ TlFNUF9EUF9UWF9ET1dOU1BSRUFEX0NUTCwgMCk7CisJCWRybV9kcF9kcGNkX3dyaXRlYigmZHAt PmF1eCwgRFBfRE9XTlNQUkVBRF9DVFJMLCAwKTsKKwl9CisKKwlyZXQgPSBkcm1fZHBfZHBjZF93 cml0ZWIoJmRwLT5hdXgsIERQX0xBTkVfQ09VTlRfU0VULCBhdXhfbGFuZV9jbnQpOworCWlmIChy ZXQgPCAwKSB7CisJCWRldl9lcnIoZHAtPmRldiwgImZhaWxlZCB0byBzZXQgbGFuZSBjb3VudFxu Iik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gZHJtX2RwX2RwY2Rfd3JpdGViKCZkcC0+ YXV4LCBEUF9NQUlOX0xJTktfQ0hBTk5FTF9DT0RJTkdfU0VULAorCQkJCSBEUF9TRVRfQU5TSV84 QjEwQik7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihkcC0+ZGV2LCAiZmFpbGVkIHRvIHNl dCBBTlNJIDhCLzEwQiBlbmNvZGluZ1xuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0g ZHJtX2RwX2RwY2Rfd3JpdGViKCZkcC0+YXV4LCBEUF9MSU5LX0JXX1NFVCwgYndfY29kZSk7CisJ aWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihkcC0+ZGV2LCAiZmFpbGVkIHRvIHNldCBEUCBiYW5k d2lkdGhcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXp5bnFtcF9kcF93cml0ZShkcC0+aW9t ZW0sIFpZTlFNUF9EUF9UWF9MSU5LX0JXX1NFVCwgYndfY29kZSk7CisJc3dpdGNoIChid19jb2Rl KSB7CisJY2FzZSBEUF9MSU5LX0JXXzFfNjI6CisJCXJlZyA9IFpZTlFNUF9EUF9UWF9QSFlfQ0xP Q0tfRkVFREJBQ0tfU0VUVElOR18xNjI7CisJCWJyZWFrOworCWNhc2UgRFBfTElOS19CV18yXzc6 CisJCXJlZyA9IFpZTlFNUF9EUF9UWF9QSFlfQ0xPQ0tfRkVFREJBQ0tfU0VUVElOR18yNzA7CisJ CWJyZWFrOworCWNhc2UgRFBfTElOS19CV181XzQ6CisJZGVmYXVsdDoKKwkJcmVnID0gWllOUU1Q X0RQX1RYX1BIWV9DTE9DS19GRUVEQkFDS19TRVRUSU5HXzU0MDsKKwkJYnJlYWs7CisJfQorCisJ enlucW1wX2RwX3dyaXRlKGRwLT5pb21lbSwgWllOUU1QX0RQX1RYX1BIWV9DTE9DS19GRUVEQkFD S19TRVRUSU5HLAorCQkJcmVnKTsKKwlyZXQgPSB6eW5xbXBfZHBfcGh5X3JlYWR5KGRwKTsKKwlp ZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXp5bnFtcF9kcF93cml0ZShkcC0+aW9tZW0s IFpZTlFNUF9EUF9UWF9TQ1JBTUJMSU5HX0RJU0FCTEUsIDEpOworCW1lbXNldChkcC0+dHJhaW5f c2V0LCAwLCA0KTsKKwlyZXQgPSB6eW5xbXBfZHBfbGlua190cmFpbl9jcihkcCk7CisJaWYgKHJl dCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHp5bnFtcF9kcF9saW5rX3RyYWluX2NlKGRwKTsK KwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gZHJtX2RwX2RwY2Rfd3JpdGViKCZk cC0+YXV4LCBEUF9UUkFJTklOR19QQVRURVJOX1NFVCwKKwkJCQkgRFBfVFJBSU5JTkdfUEFUVEVS Tl9ESVNBQkxFKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGRwLT5kZXYsICJmYWlsZWQg dG8gZGlzYWJsZSB0cmFpbmluZyBwYXR0ZXJuXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJenlu cW1wX2RwX3dyaXRlKGRwLT5pb21lbSwgWllOUU1QX0RQX1RYX1RSQUlOSU5HX1BBVFRFUk5fU0VU LAorCQkJRFBfVFJBSU5JTkdfUEFUVEVSTl9ESVNBQkxFKTsKKworCXp5bnFtcF9kcF93cml0ZShk cC0+aW9tZW0sIFpZTlFNUF9EUF9UWF9TQ1JBTUJMSU5HX0RJU0FCTEUsIDApOworCisJcmV0dXJu IDA7Cit9CisKKy8qKgorICogenlucW1wX2RwX3RyYWluX2xvb3AgLSBEb3duc2hpZnQgdGhlIGxp bmsgcmF0ZSBkdXJpbmcgdHJhaW5pbmcKKyAqIEBkcDogRGlzcGxheVBvcnQgSVAgY29yZSBzdHJ1 Y3R1cmUKKyAqCisgKiBUcmFpbiB0aGUgbGluayBieSBkb3duc2hpZnRpbmcgdGhlIGxpbmsgcmF0 ZSBpZiB0cmFpbmluZyBpcyBub3Qgc3VjY2Vzc2Z1bC4KKyAqLworc3RhdGljIHZvaWQgenlucW1w X2RwX3RyYWluX2xvb3Aoc3RydWN0IHp5bnFtcF9kcCAqZHApCit7CisJc3RydWN0IHp5bnFtcF9k cF9tb2RlICptb2RlID0gJmRwLT5tb2RlOworCXU4IGJ3ID0gbW9kZS0+YndfY29kZTsKKwlpbnQg cmV0OworCisJZG8geworCQlpZiAoZHAtPnN0YXR1cyA9PSBjb25uZWN0b3Jfc3RhdHVzX2Rpc2Nv bm5lY3RlZCB8fAorCQkgICAgIWRwLT5lbmFibGVkKQorCQkJcmV0dXJuOworCisJCXJldCA9IHp5 bnFtcF9kcF90cmFpbihkcCk7CisJCWlmICghcmV0KQorCQkJcmV0dXJuOworCisJCXJldCA9IHp5 bnFtcF9kcF9tb2RlX2NvbmZpZ3VyZShkcCwgbW9kZS0+cGNsb2NrLCBidyk7CisJCWlmIChyZXQg PCAwKQorCQkJZ290byBlcnJfb3V0OworCisJCWJ3ID0gcmV0OworCX0gd2hpbGUgKGJ3ID49IERQ X0xJTktfQldfMV82Mik7CisKK2Vycl9vdXQ6CisJZGV2X2VycihkcC0+ZGV2LCAiZmFpbGVkIHRv IHRyYWluIHRoZSBEUCBsaW5rXG4iKTsKK30KKworLyoKKyAqIERQIEF1eCBmdW5jdGlvbnMKKyAq LworCisjZGVmaW5lIEFVWF9SRUFEX0JJVAkweDEKKworLyoqCisgKiB6eW5xbXBfZHBfYXV4X2Nt ZF9zdWJtaXQgLSBTdWJtaXQgYXV4IGNvbW1hbmQKKyAqIEBkcDogRGlzcGxheVBvcnQgSVAgY29y ZSBzdHJ1Y3R1cmUKKyAqIEBjbWQ6IGF1eCBjb21tYW5kCisgKiBAYWRkcjogYXV4IGFkZHJlc3MK KyAqIEBidWY6IGJ1ZmZlciBmb3IgY29tbWFuZCBkYXRhCisgKiBAYnl0ZXM6IG51bWJlciBvZiBi eXRlcyBmb3IgQGJ1ZgorICogQHJlcGx5OiByZXBseSBjb2RlIHRvIGJlIHJldHVybmVkCisgKgor ICogU3VibWl0IGFuIGF1eCBjb21tYW5kLiBBbGwgYXV4IHJlbGF0ZWQgY29tbWFuZHMsIG5hdGl2 ZSBvciBpMmMgYXV4CisgKiByZWFkL3dyaXRlLCBhcmUgc3VibWl0dGVkIHRocm91Z2ggdGhpcyBm dW5jdGlvbi4gVGhlIGZ1bmN0aW9uIGlzIG1hcHBlZCB0bworICogdGhlIHRyYW5zZmVyIGZ1bmN0 aW9uIG9mIHN0cnVjdCBkcm1fZHBfYXV4LiBUaGlzIGZ1bmN0aW9uIGludm9sdmVzIGluCisgKiBt dWx0aXBsZSByZWdpc3RlciByZWFkcy93cml0ZXMsIHRodXMgc3luY2hyb25pemF0aW9uIGlzIG5l ZWRlZCwgYW5kIGl0IGlzCisgKiBkb25lIGJ5IGRybV9kcF9oZWxwZXIgdXNpbmcgQGh3X211dGV4 LiBUaGUgY2FsbGluZyB0aHJlYWQgZ29lcyBpbnRvIHNsZWVwCisgKiBpZiB0aGVyZSdzIG5vIGlt bWVkaWF0ZSByZXBseSB0byB0aGUgY29tbWFuZCBzdWJtaXNzaW9uLiBUaGUgcmVwbHkgY29kZSBp cworICogcmV0dXJuZWQgYXQgQHJlcGx5IGlmIEByZXBseSAhPSBOVUxMLgorICoKKyAqIFJldHVy bjogMCBpZiB0aGUgY29tbWFuZCBpcyBzdWJtaXR0ZWQgcHJvcGVybHksIG9yIGNvcnJlc3BvbmRp bmcgZXJyb3IgY29kZToKKyAqIC1FQlVTWSB3aGVuIHRoZXJlIGlzIGFueSByZXF1ZXN0IGFscmVh ZHkgYmVpbmcgcHJvY2Vzc2VkCisgKiAtRVRJTUVET1VUIHdoZW4gcmVjZWl2aW5nIHJlcGx5IGlz IHRpbWVkIG91dAorICogLUVJTyB3aGVuIHJlY2VpdmVkIGJ5dGVzIGFyZSBsZXNzIHRoYW4gcmVx dWVzdGVkCisgKi8KK3N0YXRpYyBpbnQgenlucW1wX2RwX2F1eF9jbWRfc3VibWl0KHN0cnVjdCB6 eW5xbXBfZHAgKmRwLCB1MzIgY21kLCB1MTYgYWRkciwKKwkJCQkgICAgdTggKmJ1ZiwgdTggYnl0 ZXMsIHU4ICpyZXBseSkKK3sKKwlib29sIGlzX3JlYWQgPSAoY21kICYgQVVYX1JFQURfQklUKSA/ IHRydWUgOiBmYWxzZTsKKwl2b2lkIF9faW9tZW0gKmlvbWVtID0gZHAtPmlvbWVtOworCXUzMiBy ZWcsIGk7CisKKwlyZWcgPSB6eW5xbXBfZHBfcmVhZChpb21lbSwgWllOUU1QX0RQX1RYX0lOVFJf U0lHTkFMX1NUQVRFKTsKKwlpZiAocmVnICYgWllOUU1QX0RQX1RYX0lOVFJfU0lHTkFMX1NUQVRF X1JFUVVFU1QpCisJCXJldHVybiAtRUJVU1k7CisKKwl6eW5xbXBfZHBfd3JpdGUoaW9tZW0sIFpZ TlFNUF9EUF9UWF9BVVhfQUREUkVTUywgYWRkcik7CisJaWYgKCFpc19yZWFkKQorCQlmb3IgKGkg PSAwOyBpIDwgYnl0ZXM7IGkrKykKKwkJCXp5bnFtcF9kcF93cml0ZShpb21lbSwgWllOUU1QX0RQ X1RYX0FVWF9XUklURV9GSUZPLAorCQkJCQlidWZbaV0pOworCisJcmVnID0gY21kIDw8IFpZTlFN UF9EUF9UWF9BVVhfQ09NTUFORF9DTURfU0hJRlQ7CisJaWYgKCFidWYgfHwgIWJ5dGVzKQorCQly ZWcgfD0gWllOUU1QX0RQX1RYX0FVWF9DT01NQU5EX0FERFJFU1NfT05MWTsKKwllbHNlCisJCXJl ZyB8PSAoYnl0ZXMgLSAxKSA8PCBaWU5RTVBfRFBfVFhfQVVYX0NPTU1BTkRfQllURVNfU0hJRlQ7 CisJenlucW1wX2RwX3dyaXRlKGlvbWVtLCBaWU5RTVBfRFBfVFhfQVVYX0NPTU1BTkQsIHJlZyk7 CisKKwkvKiBXYWl0IGZvciByZXBseSB0byBiZSBkZWxpdmVyZWQgdXB0byAybXMgKi8KKwlmb3Ig KGkgPSAwOyA7IGkrKykgeworCQlyZWcgPSB6eW5xbXBfZHBfcmVhZChpb21lbSwgWllOUU1QX0RQ X1RYX0lOVFJfU0lHTkFMX1NUQVRFKTsKKwkJaWYgKHJlZyAmIFpZTlFNUF9EUF9UWF9JTlRSX1NJ R05BTF9TVEFURV9SRVBMWSkKKwkJCWJyZWFrOworCisJCWlmIChyZWcgJiBaWU5RTVBfRFBfVFhf SU5UUl9TSUdOQUxfU1RBVEVfUkVQTFlfVElNRU9VVCB8fAorCQkgICAgaSA9PSAyKQorCQkJcmV0 dXJuIC1FVElNRURPVVQ7CisKKwkJdXNsZWVwX3JhbmdlKDEwMDAsIDExMDApOworCX0KKworCXJl ZyA9IHp5bnFtcF9kcF9yZWFkKGlvbWVtLCBaWU5RTVBfRFBfVFhfQVVYX1JFUExZX0NPREUpOwor CWlmIChyZXBseSkKKwkJKnJlcGx5ID0gcmVnOworCisJaWYgKGlzX3JlYWQgJiYKKwkgICAgKHJl ZyA9PSBaWU5RTVBfRFBfVFhfQVVYX1JFUExZX0NPREVfQVVYX0FDSyB8fAorCSAgICAgcmVnID09 IFpZTlFNUF9EUF9UWF9BVVhfUkVQTFlfQ09ERV9JMkNfQUNLKSkgeworCQlyZWcgPSB6eW5xbXBf ZHBfcmVhZChpb21lbSwgWllOUU1QX0RQX1RYX1JFUExZX0RBVEFfQ05UKTsKKwkJaWYgKChyZWcg JiBaWU5RTVBfRFBfVFhfQVVYX1JFUExZX0NOVF9NQVNLKSAhPSBieXRlcykKKwkJCXJldHVybiAt RUlPOworCisJCWZvciAoaSA9IDA7IGkgPCBieXRlczsgaSsrKSB7CisJCQlidWZbaV0gPSB6eW5x bXBfZHBfcmVhZChpb21lbSwKKwkJCQkJCVpZTlFNUF9EUF9UWF9BVVhfUkVQTFlfREFUQSk7CisJ CX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3QKK3p5bnFtcF9kcF9hdXhf dHJhbnNmZXIoc3RydWN0IGRybV9kcF9hdXggKmF1eCwgc3RydWN0IGRybV9kcF9hdXhfbXNnICpt c2cpCit7CisJc3RydWN0IHp5bnFtcF9kcCAqZHAgPSBjb250YWluZXJfb2YoYXV4LCBzdHJ1Y3Qg enlucW1wX2RwLCBhdXgpOworCWludCByZXQ7CisJdW5zaWduZWQgaW50IGksIGl0ZXI7CisKKwkv KiBOdW1iZXIgb2YgbG9vcHMgPSB0aW1lb3V0IGluIG1zZWMgLyBhdXggZGVsYXkgKDQwMCB1c2Vj KSAqLworCWl0ZXIgPSB6eW5xbXBfZHBfYXV4X3RpbWVvdXRfbXMgKiAxMDAwIC8gNDAwOworCWl0 ZXIgPSBpdGVyID8gaXRlciA6IDE7CisKKwlmb3IgKGkgPSAwOyBpIDwgaXRlcjsgaSsrKSB7CisJ CXJldCA9IHp5bnFtcF9kcF9hdXhfY21kX3N1Ym1pdChkcCwgbXNnLT5yZXF1ZXN0LCBtc2ctPmFk ZHJlc3MsCisJCQkJCSAgICAgICBtc2ctPmJ1ZmZlciwgbXNnLT5zaXplLAorCQkJCQkgICAgICAg Jm1zZy0+cmVwbHkpOworCQlpZiAoIXJldCkgeworCQkJZGV2X2RiZyhkcC0+ZGV2LCAiYXV4ICVk IHJldHJpZXNcbiIsIGkpOworCQkJcmV0dXJuIG1zZy0+c2l6ZTsKKwkJfQorCisJCWlmIChkcC0+ c3RhdHVzID09IGNvbm5lY3Rvcl9zdGF0dXNfZGlzY29ubmVjdGVkKSB7CisJCQlkZXZfZGJnKGRw LT5kZXYsICJubyBjb25uZWN0ZWQgYXV4IGRldmljZVxuIik7CisJCQlyZXR1cm4gLUVOT0RFVjsK KwkJfQorCisJCXVzbGVlcF9yYW5nZSg0MDAsIDUwMCk7CisJfQorCisJZGV2X2RiZyhkcC0+ZGV2 LCAiZmFpbGVkIHRvIGRvIGF1eCB0cmFuc2ZlciAoJWQpXG4iLCByZXQpOworCisJcmV0dXJuIHJl dDsKK30KKworLyoqCisgKiB6eW5xbXBfZHBfaW5pdF9hdXggLSBJbml0aWFsaXplIHRoZSBEUCBh dXgKKyAqIEBkcDogRGlzcGxheVBvcnQgSVAgY29yZSBzdHJ1Y3R1cmUKKyAqCisgKiBJbml0aWFs aXplIHRoZSBEUCBhdXguIFRoZSBhdXggY2xvY2sgaXMgZGVyaXZlZCBmcm9tIHRoZSBheGkgY2xv Y2ssIHNvCisgKiB0aGlzIGZ1bmN0aW9uIGdldHMgdGhlIGF4aSBjbG9jayBmcmVxdWVuY3kgYW5k IGNhbGN1bGF0ZXMgdGhlIGZpbHRlcgorICogdmFsdWUuIEFkZGl0aW9uYWxseSwgdGhlIGludGVy cnVwdHMgYW5kIHRyYW5zbWl0dGVyIGFyZSBlbmFibGVkLgorICoKKyAqIFJldHVybjogMCBvbiBz dWNjZXNzLCBlcnJvciB2YWx1ZSBvdGhlcndpc2UKKyAqLworc3RhdGljIGludCB6eW5xbXBfZHBf aW5pdF9hdXgoc3RydWN0IHp5bnFtcF9kcCAqZHApCit7CisJdW5zaWduZWQgaW50IHJhdGU7CisJ dTMyIHJlZywgdzsKKworCXJhdGUgPSB6eW5xbXBfZGlzcF9nZXRfYXBiX2Nsa19yYXRlKGRwLT5k cHN1Yi0+ZGlzcCk7CisJaWYgKHJhdGUgPCBaWU5RTVBfRFBfVFhfQ0xLX0RJVklERVJfTUhaKSB7 CisJCWRldl9lcnIoZHAtPmRldiwgImFjbGsgc2hvdWxkIGJlIGhpZ2hlciB0aGFuIDFNSHpcbiIp OworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBBbGxvd2FibGUgdmFsdWVzIGZvciB0aGlz IHJlZ2lzdGVyIGFyZTogOCwgMTYsIDI0LCAzMiwgNDAsIDQ4ICovCisJZm9yICh3ID0gODsgdyA8 PSA0ODsgdyArPSA4KSB7CisJCS8qIEFVWCBwdWxzZSB3aWR0aCBzaG91bGQgYmUgYmV0d2VlbiAw LjQgdG8gMC42IHVzZWMgKi8KKwkJaWYgKHcgPj0gKDQgKiByYXRlIC8gMTAwMDAwMDApICYmCisJ CSAgICB3IDw9ICg2ICogcmF0ZSAvIDEwMDAwMDAwKSkKKwkJCWJyZWFrOworCX0KKworCWlmICh3 ID4gNDgpIHsKKwkJZGV2X2VycihkcC0+ZGV2LCAiYWNsayBmcmVxdWVuY3kgdG9vIGhpZ2hcbiIp OworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmVnID0gdyA8PCBaWU5RTVBfRFBfVFhfQ0xLX0RJ VklERVJfQVVYX0ZJTFRFUl9TSElGVDsKKwlyZWcgfD0gcmF0ZSAvIFpZTlFNUF9EUF9UWF9DTEtf RElWSURFUl9NSFo7CisJenlucW1wX2RwX3dyaXRlKGRwLT5pb21lbSwgWllOUU1QX0RQX1RYX0NM S19ESVZJREVSLCByZWcpOworCXp5bnFtcF9kcF93cml0ZShkcC0+aW9tZW0sIFpZTlFNUF9EUF9T VUJfVFhfSU5UUl9FTiwKKwkJCVpZTlFNUF9EUF9UWF9JTlRSX0FMTCk7CisJenlucW1wX2RwX3dy aXRlKGRwLT5pb21lbSwgWllOUU1QX0RQX1NVQl9UWF9JTlRSX0RTLAorCQkJWllOUU1QX0RQX1RY X05PX0lOVFJfQUxMKTsKKwl6eW5xbXBfZHBfd3JpdGUoZHAtPmlvbWVtLCBaWU5RTVBfRFBfVFhf RU5BQkxFLCAxKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIHp5bnFtcF9kcF9leGl0X2F1 eCAtIERlLWluaXRpYWxpemUgdGhlIERQIGF1eAorICogQGRwOiBEaXNwbGF5UG9ydCBJUCBjb3Jl IHN0cnVjdHVyZQorICoKKyAqIERlLWluaXRpYWxpemUgdGhlIERQIGF1eC4gRGlzYWJsZSBhbGwg aW50ZXJydXB0cyB3aGljaCBhcmUgZW5hYmxlZAorICogdGhyb3VnaCBhdXggaW5pdGlhbGl6YXRp b24sIGFzIHdlbGwgYXMgdGhlIHRyYW5zbWl0dGVyLgorICovCitzdGF0aWMgdm9pZCB6eW5xbXBf ZHBfZXhpdF9hdXgoc3RydWN0IHp5bnFtcF9kcCAqZHApCit7CisJenlucW1wX2RwX3dyaXRlKGRw LT5pb21lbSwgWllOUU1QX0RQX1RYX0VOQUJMRSwgMCk7CisJenlucW1wX2RwX3dyaXRlKGRwLT5p b21lbSwgWllOUU1QX0RQX1NVQl9UWF9JTlRSX0RTLCAweGZmZmZmZmZmKTsKK30KKworLyoKKyAq IEdlbmVyaWMgRFAgZnVuY3Rpb25zCisgKi8KKworLyoqCisgKiB6eW5xbXBfZHBfdXBkYXRlX21p c2MgLSBXcml0ZSB0aGUgbWlzYyByZWdpc3RlcnMKKyAqIEBkcDogRGlzcGxheVBvcnQgSVAgY29y ZSBzdHJ1Y3R1cmUKKyAqCisgKiBUaGUgbWlzYyByZWdpc3RlciB2YWx1ZXMgYXJlIHN0b3JlZCBp biB0aGUgc3RydWN0dXJlLCBhbmQgdGhpcworICogZnVuY3Rpb24gYXBwbGllcyB0aGUgdmFsdWVz IGludG8gdGhlIHJlZ2lzdGVycy4KKyAqLworc3RhdGljIHZvaWQgenlucW1wX2RwX3VwZGF0ZV9t aXNjKHN0cnVjdCB6eW5xbXBfZHAgKmRwKQoreworCXp5bnFtcF9kcF93cml0ZShkcC0+aW9tZW0s IFpZTlFNUF9EUF9UWF9NQUlOX1NUUkVBTV9NSVNDMCwKKwkJCWRwLT5jb25maWcubWlzYzApOwor CXp5bnFtcF9kcF93cml0ZShkcC0+aW9tZW0sIFpZTlFNUF9EUF9UWF9NQUlOX1NUUkVBTV9NSVND MSwKKwkJCWRwLT5jb25maWcubWlzYzEpOworfQorCisvKioKKyAqIHp5bnFtcF9kcF9zZXRfYnBj IC0gU2V0IGJwYyB2YWx1ZSBpbiBzb2Z0d2FyZSBtaXNjIHN0YXRlCisgKiBAZHA6IERpc3BsYXlQ b3J0IElQIGNvcmUgc3RydWN0dXJlCisgKiBAYnBjOiBiaXRzIHBlciBjb21wb25lbnQKKyAqCisg KiBSZXR1cm46IDAgb24gc3VjY2Vzcywgb3IgdGhlIGZhbGxiYWNrIGJwYyB2YWx1ZQorICovCitz dGF0aWMgdTggenlucW1wX2RwX3NldF9icGMoc3RydWN0IHp5bnFtcF9kcCAqZHAsIHU4IGJwYykK K3sKKwlzdHJ1Y3QgenlucW1wX2RwX2NvbmZpZyAqY29uZmlnID0gJmRwLT5jb25maWc7CisJdTgg cmV0ID0gMDsKKworCWlmIChkcC0+Y29ubmVjdG9yLmRpc3BsYXlfaW5mby5icGMgJiYKKwkgICAg ZHAtPmNvbm5lY3Rvci5kaXNwbGF5X2luZm8uYnBjICE9IGJwYykgeworCQlkZXZfZXJyKGRwLT5k ZXYsICJyZXF1ZXN0ZWQgYnBjICgldSkgIT0gZGlzcGxheSBpbmZvICgldSlcbiIsCisJCQlicGMs IGRwLT5jb25uZWN0b3IuZGlzcGxheV9pbmZvLmJwYyk7CisJCWJwYyA9IGRwLT5jb25uZWN0b3Iu ZGlzcGxheV9pbmZvLmJwYzsKKwl9CisKKwljb25maWctPm1pc2MwICY9IH5aWU5RTVBfRFBfTUlT QzBfQlBDX01BU0s7CisJc3dpdGNoIChicGMpIHsKKwljYXNlIDY6CisJCWNvbmZpZy0+bWlzYzAg fD0gWllOUU1QX0RQX01JU0MwX0JQQ182OworCQlicmVhazsKKwljYXNlIDg6CisJCWNvbmZpZy0+ bWlzYzAgfD0gWllOUU1QX0RQX01JU0MwX0JQQ184OworCQlicmVhazsKKwljYXNlIDEwOgorCQlj b25maWctPm1pc2MwIHw9IFpZTlFNUF9EUF9NSVNDMF9CUENfMTA7CisJCWJyZWFrOworCWNhc2Ug MTI6CisJCWNvbmZpZy0+bWlzYzAgfD0gWllOUU1QX0RQX01JU0MwX0JQQ18xMjsKKwkJYnJlYWs7 CisJY2FzZSAxNjoKKwkJY29uZmlnLT5taXNjMCB8PSBaWU5RTVBfRFBfTUlTQzBfQlBDXzE2Owor CQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGRwLT5kZXYsICJOb3Qgc3VwcG9ydGVkIGJw YyAoJXUpLiBmYWxsIGJhY2sgdG8gOGJwY1xuIiwKKwkJCWJwYyk7CisJCWNvbmZpZy0+bWlzYzAg fD0gWllOUU1QX0RQX01JU0MwX0JQQ184OworCQlyZXQgPSA4OworCQlicmVhazsKKwl9CisJY29u ZmlnLT5icGMgPSBicGM7CisJenlucW1wX2RwX3VwZGF0ZV9icHAoZHApOworCisJcmV0dXJuIHJl dDsKK30KKworLyoqCisgKiB6eW5xbXBfZHBfZW5jb2Rlcl9tb2RlX3NldF90cmFuc2Zlcl91bml0 IC0gU2V0IHRoZSB0cmFuc2ZlciB1bml0IHZhbHVlcworICogQGRwOiBEaXNwbGF5UG9ydCBJUCBj b3JlIHN0cnVjdHVyZQorICogQG1vZGU6IHJlcXVlc3RlZCBkaXNwbGF5IG1vZGUKKyAqCisgKiBT ZXQgdGhlIHRyYW5zZmVyIHVuaXQsIGFuZCBjYWN1bGF0ZSBhbGwgdHJhbnNmZXIgdW5pdCBzaXpl IHJlbGF0ZWQgdmFsdWVzLgorICogQ2FsY3VsYXRpb24gaXMgYmFzZWQgb24gRFAgYW5kIElQIGNv cmUgc3BlY2lmaWNhdGlvbi4KKyAqLworc3RhdGljIHZvaWQKK3p5bnFtcF9kcF9lbmNvZGVyX21v ZGVfc2V0X3RyYW5zZmVyX3VuaXQoc3RydWN0IHp5bnFtcF9kcCAqZHAsCisJCQkJCSBzdHJ1Y3Qg ZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSkKK3sKKwl1MzIgdHUgPSBaWU5RTVBfRFBfVFhfREVGX1RS QU5TRkVSX1VOSVRfU0laRTsKKwl1MzIgYncsIHZpZF9rYnl0ZXMsIGF2Z19ieXRlc19wZXJfdHUs IGluaXRfd2FpdDsKKworCS8qIFVzZSB0aGUgbWF4IHRyYW5zZmVyIHVuaXQgc2l6ZSAoZGVmYXVs dCkgKi8KKwl6eW5xbXBfZHBfd3JpdGUoZHAtPmlvbWVtLCBaWU5RTVBfRFBfVFhfVFJBTlNGRVJf VU5JVF9TSVpFLCB0dSk7CisKKwl2aWRfa2J5dGVzID0gbW9kZS0+Y2xvY2sgKiAoZHAtPmNvbmZp Zy5icHAgLyA4KTsKKwlidyA9IGRybV9kcF9id19jb2RlX3RvX2xpbmtfcmF0ZShkcC0+bW9kZS5i d19jb2RlKTsKKwlhdmdfYnl0ZXNfcGVyX3R1ID0gdmlkX2tieXRlcyAqIHR1IC8gKGRwLT5tb2Rl LmxhbmVfY250ICogYncgLyAxMDAwKTsKKwl6eW5xbXBfZHBfd3JpdGUoZHAtPmlvbWVtLCBaWU5R TVBfRFBfVFhfTUlOX0JZVEVTX1BFUl9UVSwKKwkJCWF2Z19ieXRlc19wZXJfdHUgLyAxMDAwKTsK Kwl6eW5xbXBfZHBfd3JpdGUoZHAtPmlvbWVtLCBaWU5RTVBfRFBfVFhfRlJBQ19CWVRFU19QRVJf VFUsCisJCQlhdmdfYnl0ZXNfcGVyX3R1ICUgMTAwMCk7CisKKwkvKiBDb25maWd1cmUgdGhlIGlu aXRpYWwgd2FpdCBjeWNsZSBiYXNlZCBvbiB0cmFuc2ZlciB1bml0IHNpemUgKi8KKwlpZiAodHUg PCAoYXZnX2J5dGVzX3Blcl90dSAvIDEwMDApKQorCQlpbml0X3dhaXQgPSAwOworCWVsc2UgaWYg KChhdmdfYnl0ZXNfcGVyX3R1IC8gMTAwMCkgPD0gNCkKKwkJaW5pdF93YWl0ID0gdHU7CisJZWxz ZQorCQlpbml0X3dhaXQgPSB0dSAtIGF2Z19ieXRlc19wZXJfdHUgLyAxMDAwOworCisJenlucW1w X2RwX3dyaXRlKGRwLT5pb21lbSwgWllOUU1QX0RQX1RYX0lOSVRfV0FJVCwgaW5pdF93YWl0KTsK K30KKworLyoqCisgKiB6eW5xbXBfZHBfZW5jb2Rlcl9tb2RlX3NldF9zdHJlYW0gLSBDb25maWd1 cmUgdGhlIG1haW4gc3RyZWFtCisgKiBAZHA6IERpc3BsYXlQb3J0IElQIGNvcmUgc3RydWN0dXJl CisgKiBAbW9kZTogcmVxdWVzdGVkIGRpc3BsYXkgbW9kZQorICoKKyAqIENvbmZpZ3VyZSB0aGUg bWFpbiBzdHJlYW0gYmFzZWQgb24gdGhlIHJlcXVlc3RlZCBtb2RlIEBtb2RlLiBDYWxjdWxhdGlv biBpcworICogYmFzZWQgb24gSVAgY29yZSBzcGVjaWZpY2F0aW9uLgorICovCit2b2lkIHp5bnFt cF9kcF9lbmNvZGVyX21vZGVfc2V0X3N0cmVhbShzdHJ1Y3QgenlucW1wX2RwICpkcCwKKwkJCQkg ICAgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUpCit7CisJdm9pZCBfX2lvbWVtICpp b21lbSA9IGRwLT5pb21lbTsKKwl1OCBsYW5lX2NudCA9IGRwLT5tb2RlLmxhbmVfY250OworCXUz MiByZWcsIHdwbDsKKwl1bnNpZ25lZCBpbnQgcmF0ZTsKKworCXp5bnFtcF9kcF93cml0ZShpb21l bSwgWllOUU1QX0RQX1RYX01BSU5fU1RSRUFNX0hUT1RBTCwgbW9kZS0+aHRvdGFsKTsKKwl6eW5x bXBfZHBfd3JpdGUoaW9tZW0sIFpZTlFNUF9EUF9UWF9NQUlOX1NUUkVBTV9WVE9UQUwsIG1vZGUt PnZ0b3RhbCk7CisJenlucW1wX2RwX3dyaXRlKGlvbWVtLCBaWU5RTVBfRFBfVFhfTUFJTl9TVFJF QU1fUE9MQVJJVFksCisJCQkoISEobW9kZS0+ZmxhZ3MgJiBEUk1fTU9ERV9GTEFHX1BWU1lOQykg PDwKKwkJCSBaWU5RTVBfRFBfVFhfTUFJTl9TVFJFQU1fUE9MQVJJVFlfVlNZTkNfU0hJRlQpIHwK KwkJCSghIShtb2RlLT5mbGFncyAmIERSTV9NT0RFX0ZMQUdfUEhTWU5DKSA8PAorCQkJIFpZTlFN UF9EUF9UWF9NQUlOX1NUUkVBTV9QT0xBUklUWV9IU1lOQ19TSElGVCkpOworCXp5bnFtcF9kcF93 cml0ZShpb21lbSwgWllOUU1QX0RQX1RYX01BSU5fU1RSRUFNX0hTV0lEVEgsCisJCQltb2RlLT5o c3luY19lbmQgLSBtb2RlLT5oc3luY19zdGFydCk7CisJenlucW1wX2RwX3dyaXRlKGlvbWVtLCBa WU5RTVBfRFBfVFhfTUFJTl9TVFJFQU1fVlNXSURUSCwKKwkJCW1vZGUtPnZzeW5jX2VuZCAtIG1v ZGUtPnZzeW5jX3N0YXJ0KTsKKwl6eW5xbXBfZHBfd3JpdGUoaW9tZW0sIFpZTlFNUF9EUF9UWF9N QUlOX1NUUkVBTV9IUkVTLCBtb2RlLT5oZGlzcGxheSk7CisJenlucW1wX2RwX3dyaXRlKGlvbWVt LCBaWU5RTVBfRFBfVFhfTUFJTl9TVFJFQU1fVlJFUywgbW9kZS0+dmRpc3BsYXkpOworCXp5bnFt cF9kcF93cml0ZShpb21lbSwgWllOUU1QX0RQX1RYX01BSU5fU1RSRUFNX0hTVEFSVCwKKwkJCW1v ZGUtPmh0b3RhbCAtIG1vZGUtPmhzeW5jX3N0YXJ0KTsKKwl6eW5xbXBfZHBfd3JpdGUoaW9tZW0s IFpZTlFNUF9EUF9UWF9NQUlOX1NUUkVBTV9WU1RBUlQsCisJCQltb2RlLT52dG90YWwgLSBtb2Rl LT52c3luY19zdGFydCk7CisKKwkvKiBJbiBzeW5jaHJvbm91cyBtb2RlLCBzZXQgdGhlIGRpdmll cnMgKi8KKwlpZiAoZHAtPmNvbmZpZy5taXNjMCAmIFpZTlFNUF9EUF9UWF9NQUlOX1NUUkVBTV9N SVNDMF9TWU5DKSB7CisJCXJlZyA9IGRybV9kcF9id19jb2RlX3RvX2xpbmtfcmF0ZShkcC0+bW9k ZS5id19jb2RlKTsKKwkJenlucW1wX2RwX3dyaXRlKGlvbWVtLCBaWU5RTVBfRFBfVFhfTl9WSUQs IHJlZyk7CisJCXp5bnFtcF9kcF93cml0ZShpb21lbSwgWllOUU1QX0RQX1RYX01fVklELCBtb2Rl LT5jbG9jayk7CisJCXJhdGUgPSB6eW5xbXBfZGlzcF9nZXRfYXVkX2Nsa19yYXRlKGRwLT5kcHN1 Yi0+ZGlzcCk7CisJCWlmIChyYXRlKSB7CisJCQlkZXZfZGJnKGRwLT5kZXYsICJBdWRpbyByYXRl OiAlZFxuIiwgcmF0ZSAvIDUxMik7CisJCQl6eW5xbXBfZHBfd3JpdGUoaW9tZW0sIFpZTlFNUF9E UF9UWF9BVURJT19OX0FVRCwgcmVnKTsKKwkJCXp5bnFtcF9kcF93cml0ZShpb21lbSwgWllOUU1Q X0RQX1RYX0FVRElPX01fQVVELAorCQkJCQlyYXRlIC8gMTAwMCk7CisJCX0KKwl9CisKKwkvKiBP bmx5IDIgY2hhbm5lbCBhdWRpbyBpcyBzdXBwb3J0ZWQgbm93ICovCisJaWYgKHp5bnFtcF9kaXNw X2F1ZF9lbmFibGVkKGRwLT5kcHN1Yi0+ZGlzcCkpCisJCXp5bnFtcF9kcF93cml0ZShpb21lbSwg WllOUU1QX0RQX1RYX0FVRElPX0NIQU5ORUxTLCAxKTsKKworCXp5bnFtcF9kcF93cml0ZShpb21l bSwgWllOUU1QX0RQX1RYX1VTRVJfUElYRUxfV0lEVEgsIDEpOworCisJLyogVHJhbnNsYXRlIHRv IHRoZSBuYXRpdmUgMTYgYml0IGRhdGFwYXRoIGJhc2VkIG9uIElQIGNvcmUgc3BlYyAqLworCXdw bCA9IChtb2RlLT5oZGlzcGxheSAqIGRwLT5jb25maWcuYnBwICsgMTUpIC8gMTY7CisJcmVnID0g d3BsICsgd3BsICUgbGFuZV9jbnQgLSBsYW5lX2NudDsKKwl6eW5xbXBfZHBfd3JpdGUoaW9tZW0s IFpZTlFNUF9EUF9UWF9VU0VSX0RBVEFfQ05UX1BFUl9MQU5FLCByZWcpOworfQorCisvKgorICog RFJNIGNvbm5lY3RvciBmdW5jdGlvbnMKKyAqLworCitzdGF0aWMgZW51bSBkcm1fY29ubmVjdG9y X3N0YXR1cworenlucW1wX2RwX2Nvbm5lY3Rvcl9kZXRlY3Qoc3RydWN0IGRybV9jb25uZWN0b3Ig KmNvbm5lY3RvciwgYm9vbCBmb3JjZSkKK3sKKwlzdHJ1Y3QgenlucW1wX2RwICpkcCA9IGNvbm5l Y3Rvcl90b19kcChjb25uZWN0b3IpOworCXN0cnVjdCB6eW5xbXBfZHBfbGlua19jb25maWcgKmxp bmtfY29uZmlnID0gJmRwLT5saW5rX2NvbmZpZzsKKwl1MzIgc3RhdGUsIGk7CisJaW50IHJldDsK KworCS8qCisJICogVGhpcyBpcyBmcm9tIGhldXJpc3RpYy4gSXQgdGFrZXMgc29tZSBkZWxheSAo ZXgsIDEwMCB+IDUwMCBtc2VjKSB0bworCSAqIGdldCB0aGUgSFBEIHNpZ25hbCB3aXRoIHNvbWUg bW9uaXRvcnMuCisJICovCisJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKKwkJc3RhdGUgPSB6 eW5xbXBfZHBfcmVhZChkcC0+aW9tZW0sCisJCQkJICAgICAgIFpZTlFNUF9EUF9UWF9JTlRSX1NJ R05BTF9TVEFURSk7CisJCWlmIChzdGF0ZSAmIFpZTlFNUF9EUF9UWF9JTlRSX1NJR05BTF9TVEFU RV9IUEQpCisJCQlicmVhazsKKwkJbXNsZWVwKDEwMCk7CisJfQorCisJaWYgKHN0YXRlICYgWllO UU1QX0RQX1RYX0lOVFJfU0lHTkFMX1NUQVRFX0hQRCkgeworCQlyZXQgPSBkcm1fZHBfZHBjZF9y ZWFkKCZkcC0+YXV4LCAweDAsIGRwLT5kcGNkLAorCQkJCSAgICAgICBzaXplb2YoZHAtPmRwY2Qp KTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9kYmcoZHAtPmRldiwgIkRQQ0QgcmVhZCBmYWls ZXMiKTsKKwkJCWdvdG8gZGlzY29ubmVjdGVkOworCQl9CisKKwkJbGlua19jb25maWctPm1heF9y YXRlID0gbWluX3QoaW50LAorCQkJCQkgICAgICBkcm1fZHBfbWF4X2xpbmtfcmF0ZShkcC0+ZHBj ZCksCisJCQkJCSAgICAgIERQX0hJR0hfQklUX1JBVEUyKTsKKwkJbGlua19jb25maWctPm1heF9s YW5lcyA9IG1pbl90KHU4LAorCQkJCQkgICAgICAgZHJtX2RwX21heF9sYW5lX2NvdW50KGRwLT5k cGNkKSwKKwkJCQkJICAgICAgIGRwLT5udW1fbGFuZXMpOworCisJCWRwLT5zdGF0dXMgPSBjb25u ZWN0b3Jfc3RhdHVzX2Nvbm5lY3RlZDsKKwkJcmV0dXJuIGNvbm5lY3Rvcl9zdGF0dXNfY29ubmVj dGVkOworCX0KKworZGlzY29ubmVjdGVkOgorCWRwLT5zdGF0dXMgPSBjb25uZWN0b3Jfc3RhdHVz X2Rpc2Nvbm5lY3RlZDsKKwlyZXR1cm4gY29ubmVjdG9yX3N0YXR1c19kaXNjb25uZWN0ZWQ7Cit9 CisKK3N0YXRpYyBpbnQgenlucW1wX2RwX2Nvbm5lY3Rvcl9nZXRfbW9kZXMoc3RydWN0IGRybV9j b25uZWN0b3IgKmNvbm5lY3RvcikKK3sKKwlzdHJ1Y3QgenlucW1wX2RwICpkcCA9IGNvbm5lY3Rv cl90b19kcChjb25uZWN0b3IpOworCXN0cnVjdCBlZGlkICplZGlkOworCWludCByZXQ7CisKKwll ZGlkID0gZHJtX2dldF9lZGlkKGNvbm5lY3RvciwgJmRwLT5hdXguZGRjKTsKKwlpZiAoIWVkaWQp CisJCXJldHVybiAwOworCisJZHJtX21vZGVfY29ubmVjdG9yX3VwZGF0ZV9lZGlkX3Byb3BlcnR5 KGNvbm5lY3RvciwgZWRpZCk7CisJcmV0ID0gZHJtX2FkZF9lZGlkX21vZGVzKGNvbm5lY3Rvciwg ZWRpZCk7CisJa2ZyZWUoZWRpZCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0 IGRybV9lbmNvZGVyICoKK3p5bnFtcF9kcF9jb25uZWN0b3JfYmVzdF9lbmNvZGVyKHN0cnVjdCBk cm1fY29ubmVjdG9yICpjb25uZWN0b3IpCit7CisJc3RydWN0IHp5bnFtcF9kcCAqZHAgPSBjb25u ZWN0b3JfdG9fZHAoY29ubmVjdG9yKTsKKworCXJldHVybiAmZHAtPmVuY29kZXI7Cit9CisKK3N0 YXRpYyBpbnQgenlucW1wX2RwX2Nvbm5lY3Rvcl9tb2RlX3ZhbGlkKHN0cnVjdCBkcm1fY29ubmVj dG9yICpjb25uZWN0b3IsCisJCQkJCSAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUpCit7 CisJc3RydWN0IHp5bnFtcF9kcCAqZHAgPSBjb25uZWN0b3JfdG9fZHAoY29ubmVjdG9yKTsKKwl1 OCBtYXhfbGFuZXMgPSBkcC0+bGlua19jb25maWcubWF4X2xhbmVzOworCXU4IGJwcCA9IGRwLT5j b25maWcuYnBwOworCWludCBtYXhfcmF0ZSA9IGRwLT5saW5rX2NvbmZpZy5tYXhfcmF0ZTsKKwlp bnQgcmF0ZTsKKworCWlmIChtb2RlLT5jbG9jayA+IFpZTlFNUF9NQVhfRlJFUSkgeworCQlkZXZf ZGJnKGRwLT5kZXYsICJmaWx0ZXJlZCB0aGUgbW9kZSwgJXMsZm9yIGhpZ2ggcGl4ZWwgcmF0ZVxu IiwKKwkJCW1vZGUtPm5hbWUpOworCQlkcm1fbW9kZV9kZWJ1Z19wcmludG1vZGVsaW5lKG1vZGUp OworCQlyZXR1cm4gTU9ERV9DTE9DS19ISUdIOworCX0KKworCS8qIENoZWNrIHdpdGggbGluayBy YXRlIGFuZCBsYW5lIGNvdW50ICovCisJcmF0ZSA9IHp5bnFtcF9kcF9tYXhfcmF0ZShtYXhfcmF0 ZSwgbWF4X2xhbmVzLCBicHApOworCWlmIChtb2RlLT5jbG9jayA+IHJhdGUpIHsKKwkJZGV2X2Ri ZyhkcC0+ZGV2LCAiZmlsdGVyZWQgdGhlIG1vZGUsICVzLGZvciBoaWdoIHBpeGVsIHJhdGVcbiIs CisJCQltb2RlLT5uYW1lKTsKKwkJZHJtX21vZGVfZGVidWdfcHJpbnRtb2RlbGluZShtb2RlKTsK KwkJcmV0dXJuIE1PREVfQ0xPQ0tfSElHSDsKKwl9CisKKwlyZXR1cm4gTU9ERV9PSzsKK30KKwor c3RhdGljIHZvaWQgenlucW1wX2RwX2Nvbm5lY3Rvcl9kZXN0cm95KHN0cnVjdCBkcm1fY29ubmVj dG9yICpjb25uZWN0b3IpCit7CisJZHJtX2Nvbm5lY3Rvcl91bnJlZ2lzdGVyKGNvbm5lY3Rvcik7 CisJZHJtX2Nvbm5lY3Rvcl9jbGVhbnVwKGNvbm5lY3Rvcik7Cit9CisKK3N0YXRpYyBjb25zdCBz dHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9mdW5jcyB6eW5xbXBfZHBfY29ubmVjdG9yX2Z1bmNzID0gewor CS5kZXRlY3QJCQk9IHp5bnFtcF9kcF9jb25uZWN0b3JfZGV0ZWN0LAorCS5maWxsX21vZGVzCQk9 IGRybV9oZWxwZXJfcHJvYmVfc2luZ2xlX2Nvbm5lY3Rvcl9tb2RlcywKKwkuZGVzdHJveQkJPSB6 eW5xbXBfZHBfY29ubmVjdG9yX2Rlc3Ryb3ksCisJLmF0b21pY19kdXBsaWNhdGVfc3RhdGUJPSBk cm1fYXRvbWljX2hlbHBlcl9jb25uZWN0b3JfZHVwbGljYXRlX3N0YXRlLAorCS5hdG9taWNfZGVz dHJveV9zdGF0ZQk9IGRybV9hdG9taWNfaGVscGVyX2Nvbm5lY3Rvcl9kZXN0cm95X3N0YXRlLAor CS5yZXNldAkJCT0gZHJtX2F0b21pY19oZWxwZXJfY29ubmVjdG9yX3Jlc2V0LAorfTsKKworc3Rh dGljIGNvbnN0IHN0cnVjdCBkcm1fY29ubmVjdG9yX2hlbHBlcl9mdW5jcworenlucW1wX2RwX2Nv bm5lY3Rvcl9oZWxwZXJfZnVuY3MgPSB7CisJLmdldF9tb2Rlcwk9IHp5bnFtcF9kcF9jb25uZWN0 b3JfZ2V0X21vZGVzLAorCS5iZXN0X2VuY29kZXIJPSB6eW5xbXBfZHBfY29ubmVjdG9yX2Jlc3Rf ZW5jb2RlciwKKwkubW9kZV92YWxpZAk9IHp5bnFtcF9kcF9jb25uZWN0b3JfbW9kZV92YWxpZCwK K307CisKKy8qCisgKiBEUk0gZW5jb2RlciBmdW5jdGlvbnMKKyAqLworCitzdGF0aWMgdm9pZCB6 eW5xbXBfZHBfZW5jb2Rlcl9lbmFibGUoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQorewor CXN0cnVjdCB6eW5xbXBfZHAgKmRwID0gZW5jb2Rlcl90b19kcChlbmNvZGVyKTsKKwl2b2lkIF9f aW9tZW0gKmlvbWVtID0gZHAtPmlvbWVtOworCXVuc2lnbmVkIGludCBpOworCWludCByZXQgPSAw OworCisJcG1fcnVudGltZV9nZXRfc3luYyhkcC0+ZGV2KTsKKwlkcC0+ZW5hYmxlZCA9IHRydWU7 CisJenlucW1wX2RwX2luaXRfYXV4KGRwKTsKKwl6eW5xbXBfZHBfdXBkYXRlX21pc2MoZHApOwor CWlmICh6eW5xbXBfZGlzcF9hdWRfZW5hYmxlZChkcC0+ZHBzdWItPmRpc3ApKQorCQl6eW5xbXBf ZHBfd3JpdGUoaW9tZW0sIFpZTlFNUF9EUF9UWF9BVURJT19DT05UUk9MLCAxKTsKKwl6eW5xbXBf ZHBfd3JpdGUoaW9tZW0sIFpZTlFNUF9EUF9UWF9QSFlfUE9XRVJfRE9XTiwgMCk7CisJaWYgKGRw LT5zdGF0dXMgPT0gY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQpIHsKKwkJZm9yIChpID0gMDsg aSA8IDM7IGkrKykgeworCQkJcmV0ID0gZHJtX2RwX2RwY2Rfd3JpdGViKCZkcC0+YXV4LCBEUF9T RVRfUE9XRVIsCisJCQkJCQkgRFBfU0VUX1BPV0VSX0QwKTsKKwkJCWlmIChyZXQgPT0gMSkKKwkJ CQlicmVhazsKKwkJCXVzbGVlcF9yYW5nZSgzMDAsIDUwMCk7CisJCX0KKwkJLyogU29tZSBtb25p dG9ycyB0YWtlIHRpbWUgdG8gd2FrZSB1cCBwcm9wZXJseSAqLworCQltc2xlZXAoenlucW1wX2Rw X3Bvd2VyX29uX2RlbGF5X21zKTsKKwl9CisJaWYgKHJldCAhPSAxKQorCQlkZXZfZGJnKGRwLT5k ZXYsICJEUCBhdXggZmFpbGVkXG4iKTsKKwllbHNlCisJCXp5bnFtcF9kcF90cmFpbl9sb29wKGRw KTsKKwl6eW5xbXBfZHBfd3JpdGUoaW9tZW0sIFpZTlFNUF9EUF9UWF9TV19SRVNFVCwKKwkJCVpZ TlFNUF9EUF9UWF9TV19SRVNFVF9BTEwpOworCXp5bnFtcF9kcF93cml0ZShpb21lbSwgWllOUU1Q X0RQX1RYX0VOQUJMRV9NQUlOX1NUUkVBTSwgMSk7Cit9CisKK3N0YXRpYyB2b2lkIHp5bnFtcF9k cF9lbmNvZGVyX2Rpc2FibGUoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQoreworCXN0cnVj dCB6eW5xbXBfZHAgKmRwID0gZW5jb2Rlcl90b19kcChlbmNvZGVyKTsKKwl2b2lkIF9faW9tZW0g KmlvbWVtID0gZHAtPmlvbWVtOworCisJZHAtPmVuYWJsZWQgPSBmYWxzZTsKKwljYW5jZWxfZGVs YXllZF93b3JrKCZkcC0+aHBkX3dvcmspOworCXp5bnFtcF9kcF93cml0ZShpb21lbSwgWllOUU1Q X0RQX1RYX0VOQUJMRV9NQUlOX1NUUkVBTSwgMCk7CisJZHJtX2RwX2RwY2Rfd3JpdGViKCZkcC0+ YXV4LCBEUF9TRVRfUE9XRVIsIERQX1NFVF9QT1dFUl9EMyk7CisJenlucW1wX2RwX3dyaXRlKGlv bWVtLCBaWU5RTVBfRFBfVFhfUEhZX1BPV0VSX0RPV04sCisJCQlaWU5RTVBfRFBfVFhfUEhZX1BP V0VSX0RPV05fQUxMKTsKKwlpZiAoenlucW1wX2Rpc3BfYXVkX2VuYWJsZWQoZHAtPmRwc3ViLT5k aXNwKSkKKwkJenlucW1wX2RwX3dyaXRlKGlvbWVtLCBaWU5RTVBfRFBfVFhfQVVESU9fQ09OVFJP TCwgMCk7CisJcG1fcnVudGltZV9wdXRfc3luYyhkcC0+ZGV2KTsKK30KKworc3RhdGljIHZvaWQK K3p5bnFtcF9kcF9lbmNvZGVyX2F0b21pY19tb2RlX3NldChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVu Y29kZXIsCisJCQkJICBzdHJ1Y3QgZHJtX2NydGNfc3RhdGUgKmNydGNfc3RhdGUsCisJCQkJICBz dHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9zdGF0ZSAqY29ubmVjdG9yX3N0YXRlKQoreworCXN0cnVjdCB6 eW5xbXBfZHAgKmRwID0gZW5jb2Rlcl90b19kcChlbmNvZGVyKTsKKwlzdHJ1Y3QgZHJtX2Rpc3Bs YXlfbW9kZSAqbW9kZSA9ICZjcnRjX3N0YXRlLT5tb2RlOworCXN0cnVjdCBkcm1fZGlzcGxheV9t b2RlICphZGp1c3RlZF9tb2RlID0gJmNydGNfc3RhdGUtPmFkanVzdGVkX21vZGU7CisJdTggbWF4 X2xhbmVzID0gZHAtPmxpbmtfY29uZmlnLm1heF9sYW5lczsKKwl1OCBicHAgPSBkcC0+Y29uZmln LmJwcDsKKwlpbnQgcmF0ZSwgbWF4X3JhdGUgPSBkcC0+bGlua19jb25maWcubWF4X3JhdGU7CisJ aW50IHJldDsKKworCS8qIENoZWNrIGFnYWluIGFzIGJwcCBvciBmb3JtYXQgbWlnaHQgaGF2ZSBi ZWVuIGNoYWduZWQgKi8KKwlyYXRlID0genlucW1wX2RwX21heF9yYXRlKG1heF9yYXRlLCBtYXhf bGFuZXMsIGJwcCk7CisJaWYgKG1vZGUtPmNsb2NrID4gcmF0ZSkgeworCQlkZXZfZXJyKGRwLT5k ZXYsICJ0aGUgbW9kZSwgJXMsaGFzIHRvbyBoaWdoIHBpeGVsIHJhdGVcbiIsCisJCQltb2RlLT5u YW1lKTsKKwkJZHJtX21vZGVfZGVidWdfcHJpbnRtb2RlbGluZShtb2RlKTsKKwl9CisKKwlyZXQg PSB6eW5xbXBfZHBfbW9kZV9jb25maWd1cmUoZHAsIGFkanVzdGVkX21vZGUtPmNsb2NrLCAwKTsK KwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuOworCisJenlucW1wX2RwX2VuY29kZXJfbW9kZV9zZXRf dHJhbnNmZXJfdW5pdChkcCwgYWRqdXN0ZWRfbW9kZSk7Cit9CisKKyNkZWZpbmUgWllOUU1QX0RQ X01JTl9IX0JBQ0tQT1JDSAkyMAorCitzdGF0aWMgaW50Cit6eW5xbXBfZHBfZW5jb2Rlcl9hdG9t aWNfY2hlY2soc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLAorCQkJICAgICAgIHN0cnVjdCBk cm1fY3J0Y19zdGF0ZSAqY3J0Y19zdGF0ZSwKKwkJCSAgICAgICBzdHJ1Y3QgZHJtX2Nvbm5lY3Rv cl9zdGF0ZSAqY29ubl9zdGF0ZSkKK3sKKwlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSA9 ICZjcnRjX3N0YXRlLT5tb2RlOworCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICphZGp1c3RlZF9t b2RlID0gJmNydGNfc3RhdGUtPmFkanVzdGVkX21vZGU7CisJaW50IGRpZmYgPSBtb2RlLT5odG90 YWwgLSBtb2RlLT5oc3luY19lbmQ7CisKKwkvKgorCSAqIFp5bnFNUCBEUCByZXF1aXJlcyBob3Jp em9udGFsIGJhY2twb3JjaCB0byBiZSBncmVhdGVyIHRoYW4gMTIuCisJICogVGhpcyBsaW1pdGF0 aW9uIG1heSBub3QgYmUgY29tcGF0aWJsZSB3aXRoIHRoZSBzaW5rIGRldmljZS4KKwkgKi8KKwlp ZiAoZGlmZiA8IFpZTlFNUF9EUF9NSU5fSF9CQUNLUE9SQ0gpIHsKKwkJaW50IHZyZWZyZXNoID0g KGFkanVzdGVkX21vZGUtPmNsb2NrICogMTAwMCkgLworCQkJICAgICAgIChhZGp1c3RlZF9tb2Rl LT52dG90YWwgKiBhZGp1c3RlZF9tb2RlLT5odG90YWwpOworCisJCWRldl9kYmcoZW5jb2Rlci0+ ZGV2LT5kZXYsICJoYmFja3BvcmNoIGFkanVzdGVkOiAlZCB0byAlZCIsCisJCQlkaWZmLCBaWU5R TVBfRFBfTUlOX0hfQkFDS1BPUkNIIC0gZGlmZik7CisJCWRpZmYgPSBaWU5RTVBfRFBfTUlOX0hf QkFDS1BPUkNIIC0gZGlmZjsKKwkJYWRqdXN0ZWRfbW9kZS0+aHRvdGFsICs9IGRpZmY7CisJCWFk anVzdGVkX21vZGUtPmNsb2NrID0gYWRqdXN0ZWRfbW9kZS0+dnRvdGFsICoKKwkJCQkgICAgICAg YWRqdXN0ZWRfbW9kZS0+aHRvdGFsICogdnJlZnJlc2ggLyAxMDAwOworCX0KKworCXJldHVybiAw OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9lbmNvZGVyX2Z1bmNzIHp5bnFtcF9kcF9l bmNvZGVyX2Z1bmNzID0geworCS5kZXN0cm95ID0gZHJtX2VuY29kZXJfY2xlYW51cCwKK307CisK K3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2VuY29kZXJfaGVscGVyX2Z1bmNzIHp5bnFtcF9kcF9l bmNvZGVyX2hlbHBlcl9mdW5jcyA9IHsKKwkuZW5hYmxlCQkJPSB6eW5xbXBfZHBfZW5jb2Rlcl9l bmFibGUsCisJLmRpc2FibGUJCT0genlucW1wX2RwX2VuY29kZXJfZGlzYWJsZSwKKwkuYXRvbWlj X21vZGVfc2V0CT0genlucW1wX2RwX2VuY29kZXJfYXRvbWljX21vZGVfc2V0LAorCS5hdG9taWNf Y2hlY2sJCT0genlucW1wX2RwX2VuY29kZXJfYXRvbWljX2NoZWNrLAorfTsKKworLyoKKyAqIENv bXBvbmVudCBmdW5jdGlvbnMKKyAqLworCitzdGF0aWMgdm9pZCB6eW5xbXBfZHBfaHBkX3dvcmtf ZnVuYyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHp5bnFtcF9kcCAqZHA7 CisKKwlkcCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgenlucW1wX2RwLCBocGRfd29yay53 b3JrKTsKKworCWlmIChkcC0+ZHJtKQorCQlkcm1faGVscGVyX2hwZF9pcnFfZXZlbnQoZHAtPmRy bSk7Cit9CisKK2ludCB6eW5xbXBfZHBfYmluZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBk ZXZpY2UgKm1hc3Rlciwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgenlucW1wX2Rwc3ViICpkcHN1 YiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCB6eW5xbXBfZHAgKmRwID0gZHBzdWIt PmRwOworCXN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciA9ICZkcC0+ZW5jb2RlcjsKKwlzdHJ1 Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yID0gJmRwLT5jb25uZWN0b3I7CisJc3RydWN0IGRy bV9kZXZpY2UgKmRybSA9IGRhdGE7CisJc3RydWN0IGRldmljZV9ub2RlICpwb3J0OworCWludCBy ZXQ7CisKKwllbmNvZGVyLT5wb3NzaWJsZV9jcnRjcyB8PSB6eW5xbXBfZGlzcF9nZXRfY3J0Y19t YXNrKGRwc3ViLT5kaXNwKTsKKwlmb3JfZWFjaF9jaGlsZF9vZl9ub2RlKGRldi0+b2Zfbm9kZSwg cG9ydCkgeworCQlpZiAoIXBvcnQtPm5hbWUgfHwgb2Zfbm9kZV9jbXAocG9ydC0+bmFtZSwgInBv cnQiKSkKKwkJCWNvbnRpbnVlOworCQllbmNvZGVyLT5wb3NzaWJsZV9jcnRjcyB8PSBkcm1fb2Zf ZmluZF9wb3NzaWJsZV9jcnRjcyhkcm0sCisJCQkJCQkJCSAgICAgIHBvcnQpOworCX0KKwlkcm1f ZW5jb2Rlcl9pbml0KGRybSwgZW5jb2RlciwgJnp5bnFtcF9kcF9lbmNvZGVyX2Z1bmNzLAorCQkJ IERSTV9NT0RFX0VOQ09ERVJfVE1EUywgTlVMTCk7CisJZHJtX2VuY29kZXJfaGVscGVyX2FkZChl bmNvZGVyLCAmenlucW1wX2RwX2VuY29kZXJfaGVscGVyX2Z1bmNzKTsKKworCWNvbm5lY3Rvci0+ cG9sbGVkID0gRFJNX0NPTk5FQ1RPUl9QT0xMX0hQRDsKKwlyZXQgPSBkcm1fY29ubmVjdG9yX2lu aXQoZW5jb2Rlci0+ZGV2LCBjb25uZWN0b3IsCisJCQkJICZ6eW5xbXBfZHBfY29ubmVjdG9yX2Z1 bmNzLAorCQkJCSBEUk1fTU9ERV9DT05ORUNUT1JfRGlzcGxheVBvcnQpOworCWlmIChyZXQpIHsK KwkJZGV2X2VycihkcC0+ZGV2LCAiZmFpbGVkIHRvIGluaXRpYWxpemUgdGhlIGRybSBjb25uZWN0 b3IiKTsKKwkJZ290byBlcnJvcl9lbmNvZGVyOworCX0KKworCWRybV9jb25uZWN0b3JfaGVscGVy X2FkZChjb25uZWN0b3IsICZ6eW5xbXBfZHBfY29ubmVjdG9yX2hlbHBlcl9mdW5jcyk7CisJZHJt X2Nvbm5lY3Rvcl9yZWdpc3Rlcihjb25uZWN0b3IpOworCWRybV9tb2RlX2Nvbm5lY3Rvcl9hdHRh Y2hfZW5jb2Rlcihjb25uZWN0b3IsIGVuY29kZXIpOworCWNvbm5lY3Rvci0+ZHBtcyA9IERSTV9N T0RFX0RQTVNfT0ZGOworCisJZHAtPmRybSA9IGRybTsKKwlkcC0+Y29uZmlnLm1pc2MwICY9IH5a WU5RTVBfRFBfVFhfTUFJTl9TVFJFQU1fTUlTQzBfU1lOQzsKKwlyZXQgPSB6eW5xbXBfZHBfc2V0 X2JwYyhkcCwgOCk7CisJenlucW1wX2RwX3VwZGF0ZV9icHAoZHApOworCisJLyogVGhpcyBlbmFi bGVzIGludGVycnVwdHMsIHNvIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgRFJNIGluaXQgKi8KKwly ZXQgPSB6eW5xbXBfZHBfaW5pdF9hdXgoZHApOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkcC0+ ZGV2LCAiZmFpbGVkIHRvIGluaXRpYWxpemUgRFAgYXV4Iik7CisJCWdvdG8gZXJyb3JfY29ubmVj dG9yOworCX0KKwlJTklUX0RFTEFZRURfV09SSygmZHAtPmhwZF93b3JrLCB6eW5xbXBfZHBfaHBk X3dvcmtfZnVuYyk7CisKKwlyZXR1cm4gMDsKKworZXJyb3JfY29ubmVjdG9yOgorCXp5bnFtcF9k cF9jb25uZWN0b3JfZGVzdHJveSgmZHAtPmNvbm5lY3Rvcik7CitlcnJvcl9lbmNvZGVyOgorCWRy bV9lbmNvZGVyX2NsZWFudXAoJmRwLT5lbmNvZGVyKTsKKwlyZXR1cm4gcmV0OworfQorCit2b2lk IHp5bnFtcF9kcF91bmJpbmQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlICptYXN0 ZXIsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHp5bnFtcF9kcHN1YiAqZHBzdWIgPSBkZXZfZ2V0 X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgenlucW1wX2RwICpkcCA9IGRwc3ViLT5kcDsKKworCWNh bmNlbF9kZWxheWVkX3dvcmtfc3luYygmZHAtPmhwZF93b3JrKTsKKwlkaXNhYmxlX2lycShkcC0+ aXJxKTsKKwl6eW5xbXBfZHBfZXhpdF9hdXgoZHApOworCXp5bnFtcF9kcF9jb25uZWN0b3JfZGVz dHJveSgmZHAtPmNvbm5lY3Rvcik7CisJZHJtX2VuY29kZXJfY2xlYW51cCgmZHAtPmVuY29kZXIp OworfQorCisvKgorICogUGxhdGZvcm0gZnVuY3Rpb25zCisgKi8KKworc3RhdGljIGlycXJldHVy bl90IHp5bnFtcF9kcF9pcnFfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCXN0cnVj dCB6eW5xbXBfZHAgKmRwID0gKHN0cnVjdCB6eW5xbXBfZHAgKilkYXRhOworCXUzMiBzdGF0dXMs IG1hc2s7CisKKwlzdGF0dXMgPSB6eW5xbXBfZHBfcmVhZChkcC0+aW9tZW0sIFpZTlFNUF9EUF9T VUJfVFhfSU5UUl9TVEFUVVMpOworCW1hc2sgPSB6eW5xbXBfZHBfcmVhZChkcC0+aW9tZW0sIFpZ TlFNUF9EUF9TVUJfVFhfSU5UUl9NQVNLKTsKKwlpZiAoIShzdGF0dXMgJiB+bWFzaykpCisJCXJl dHVybiBJUlFfTk9ORTsKKworCS8qIGRiZyBmb3IgZGlhZ25vc3RpYywgYnV0IG5vdCBtdWNoIHRo YXQgdGhlIGRyaXZlciBjYW4gZG8gKi8KKwlpZiAoc3RhdHVzICYgWllOUU1QX0RQX1RYX0lOVFJf Q0hCVUZfVU5ERVJGTFdfTUFTSykKKwkJZGV2X2RiZ19yYXRlbGltaXRlZChkcC0+ZGV2LCAidW5k ZXJmbG93IGludGVycnVwdFxuIik7CisJaWYgKHN0YXR1cyAmIFpZTlFNUF9EUF9UWF9JTlRSX0NI QlVGX09WRVJGTFdfTUFTSykKKwkJZGV2X2RiZ19yYXRlbGltaXRlZChkcC0+ZGV2LCAib3ZlcmZs b3cgaW50ZXJydXB0XG4iKTsKKworCXp5bnFtcF9kcF93cml0ZShkcC0+aW9tZW0sIFpZTlFNUF9E UF9TVUJfVFhfSU5UUl9TVEFUVVMsIHN0YXR1cyk7CisKKwkvKiBUaGUgRFAgdmJsYW5rIHdpbGwg bm90IGJlIGVuYWJsZWQgd2l0aCByZW1vdGUgY3J0YyBkZXZpY2UgKi8KKwlpZiAoc3RhdHVzICYg WllOUU1QX0RQX1RYX0lOVFJfVkJMQU5LX1NUQVJUKQorCQl6eW5xbXBfZGlzcF9oYW5kbGVfdmJs YW5rKGRwLT5kcHN1Yi0+ZGlzcCk7CisKKwlpZiAoc3RhdHVzICYgWllOUU1QX0RQX1RYX0lOVFJf SFBEX0VWRU5UKQorCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmRwLT5ocGRfd29yaywgMCk7CisK KwlpZiAoc3RhdHVzICYgWllOUU1QX0RQX1RYX0lOVFJfSFBEX0lSUSkgeworCQlpbnQgcmV0Owor CQl1OCBzdGF0dXNbRFBfTElOS19TVEFUVVNfU0laRSArIDJdOworCisJCXJldCA9IGRybV9kcF9k cGNkX3JlYWQoJmRwLT5hdXgsIERQX1NJTktfQ09VTlQsIHN0YXR1cywKKwkJCQkgICAgICAgRFBf TElOS19TVEFUVVNfU0laRSArIDIpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gaGFuZGxlZDsK KworCQlpZiAoc3RhdHVzWzRdICYgRFBfTElOS19TVEFUVVNfVVBEQVRFRCB8fAorCQkgICAgIWRy bV9kcF9jbG9ja19yZWNvdmVyeV9vaygmc3RhdHVzWzJdLCBkcC0+bW9kZS5sYW5lX2NudCkgfHwK KwkJICAgICFkcm1fZHBfY2hhbm5lbF9lcV9vaygmc3RhdHVzWzJdLCBkcC0+bW9kZS5sYW5lX2Nu dCkpIHsKKwkJCXp5bnFtcF9kcF90cmFpbl9sb29wKGRwKTsKKwkJfQorCX0KKworaGFuZGxlZDoK KwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK2ludCB6eW5xbXBfZHBfcHJvYmUoc3RydWN0IHBs YXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgenlucW1wX2Rwc3ViICpkcHN1YjsKKwlz dHJ1Y3QgenlucW1wX2RwICpkcDsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwl1bnNpZ25lZCBp bnQgaTsKKwlpbnQgaXJxLCByZXQ7CisKKwlkcCA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBz aXplb2YoKmRwKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkcCkKKwkJcmV0dXJuIC1FTk9NRU07CisK KwlkcC0+ZHBtcyA9IERSTV9NT0RFX0RQTVNfT0ZGOworCWRwLT5zdGF0dXMgPSBjb25uZWN0b3Jf c3RhdHVzX2Rpc2Nvbm5lY3RlZDsKKwlkcC0+ZGV2ID0gJnBkZXYtPmRldjsKKworCXJlcyA9IHBs YXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwgSU9SRVNPVVJDRV9NRU0sICJkcCIpOwor CWRwLT5pb21lbSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZShkcC0+ZGV2LCByZXMpOworCWlmIChJ U19FUlIoZHAtPmlvbWVtKSkKKwkJcmV0dXJuIFBUUl9FUlIoZHAtPmlvbWVtKTsKKworCXp5bnFt cF9kcF93cml0ZShkcC0+aW9tZW0sIFpZTlFNUF9EUF9UWF9QSFlfUE9XRVJfRE9XTiwKKwkJCVpZ TlFNUF9EUF9UWF9QSFlfUE9XRVJfRE9XTl9BTEwpOworCXp5bnFtcF9kcF9zZXQoZHAtPmlvbWVt LCBaWU5RTVBfRFBfVFhfUEhZX0NPTkZJRywKKwkJICAgICAgWllOUU1QX0RQX1RYX1BIWV9DT05G SUdfQUxMX1JFU0VUKTsKKwl6eW5xbXBfZHBfd3JpdGUoZHAtPmlvbWVtLCBaWU5RTVBfRFBfVFhf Rk9SQ0VfU0NSQU1CTEVSX1JFU0VULCAxKTsKKwl6eW5xbXBfZHBfd3JpdGUoZHAtPmlvbWVtLCBa WU5RTVBfRFBfVFhfRU5BQkxFLCAwKTsKKworCWRwLT5udW1fbGFuZXMgPSAyOworCWZvciAoaSA9 IDA7IGkgPCBaWU5RTVBfRFBfTUFYX0xBTkVTOyBpKyspIHsKKwkJY2hhciBwaHlfbmFtZVsxNl07 CisKKwkJc25wcmludGYocGh5X25hbWUsIHNpemVvZihwaHlfbmFtZSksICJkcC1waHklZCIsIGkp OworCQlkcC0+cGh5W2ldID0gZGV2bV9waHlfZ2V0KGRwLT5kZXYsIHBoeV9uYW1lKTsKKwkJaWYg KElTX0VSUihkcC0+cGh5W2ldKSkgeworCQkJLyogMm5kIGxhbmUgaXMgb3B0aW9uYWwgKi8KKwkJ CWlmIChpID09IDAgfHwgUFRSX0VSUihkcC0+cGh5W2ldKSAhPSAtRU5PREVWKSB7CisJCQkJZGV2 X2VycihkcC0+ZGV2LCAiZmFpbGVkIHRvIGdldCBwaHkgbGFuZVxuIik7CisJCQkJcmV0ID0gUFRS X0VSUihkcC0+cGh5W2ldKTsKKwkJCQlkcC0+cGh5W2ldID0gTlVMTDsKKwkJCQlyZXR1cm4gcmV0 OworCQkJfQorCQkJZHAtPnBoeVtpXSA9IE5VTEw7CisJCQlkcC0+bnVtX2xhbmVzID0gMTsKKwkJ fQorCX0KKworCXJldCA9IHp5bnFtcF9kcF9pbml0X3BoeShkcCk7CisJaWYgKHJldCkKKwkJZ290 byBlcnJvcl9waHk7CisKKwlkcC0+YXV4Lm5hbWUgPSAiWnlucU1QIERQIEFVWCI7CisJZHAtPmF1 eC5kZXYgPSBkcC0+ZGV2OworCWRwLT5hdXgudHJhbnNmZXIgPSB6eW5xbXBfZHBfYXV4X3RyYW5z ZmVyOworCXJldCA9IGRybV9kcF9hdXhfcmVnaXN0ZXIoJmRwLT5hdXgpOworCWlmIChyZXQgPCAw KSB7CisJCWRldl9lcnIoZHAtPmRldiwgImZhaWxlZCB0byBpbml0aWFsaXplIERQIGF1eFxuIik7 CisJCWdvdG8gZXJyb3I7CisJfQorCisJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsK KwlpZiAoaXJxIDwgMCkgeworCQlyZXQgPSBpcnE7CisJCWdvdG8gZXJyb3I7CisJfQorCisJcmV0 ID0gZGV2bV9yZXF1ZXN0X3RocmVhZGVkX2lycShkcC0+ZGV2LCBpcnEsIE5VTEwsCisJCQkJCXp5 bnFtcF9kcF9pcnFfaGFuZGxlciwgSVJRRl9PTkVTSE9ULAorCQkJCQlkZXZfbmFtZShkcC0+ZGV2 KSwgZHApOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yOworCWRwLT5pcnEgPSBpcnE7CisK KwlkcHN1YiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCWRwc3ViLT5kcCA9IGRwOwor CWRwLT5kcHN1YiA9IGRwc3ViOworCisJcmV0dXJuIDA7CisKK2Vycm9yOgorCWRybV9kcF9hdXhf dW5yZWdpc3RlcigmZHAtPmF1eCk7CitlcnJvcl9waHk6CisJenlucW1wX2RwX2V4aXRfcGh5KGRw KTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgenlucW1wX2RwX3JlbW92ZShzdHJ1Y3QgcGxhdGZv cm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCB6eW5xbXBfZHBzdWIgKmRwc3ViID0gcGxhdGZv cm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHp5bnFtcF9kcCAqZHAgPSBkcHN1Yi0+ZHA7 CisKKwl6eW5xbXBfZHBfd3JpdGUoZHAtPmlvbWVtLCBaWU5RTVBfRFBfVFhfRU5BQkxFLCAwKTsK Kwlkcm1fZHBfYXV4X3VucmVnaXN0ZXIoJmRwLT5hdXgpOworCXp5bnFtcF9kcF9leGl0X3BoeShk cCk7CisJZHBzdWItPmRwID0gTlVMTDsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJp dmVycy9ncHUvZHJtL3hsbngvenlucW1wX2RwLmggYi9kcml2ZXJzL2dwdS9kcm0veGxueC96eW5x bXBfZHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTM2MGYxCi0tLSAv ZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL3hsbngvenlucW1wX2RwLmgKQEAgLTAsMCAr MSwzMCBAQAorLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKKy8qCisgKiBaeW5x TVAgRGlzcGxheVBvcnQgRHJpdmVyCisgKgorICogIENvcHlyaWdodCAoQykgMjAxNyAtIDIwMTgg WGlsaW54LCBJbmMuCisgKgorICogIEF1dGhvcjogSHl1biBXb28gS3dvbiA8aHl1bi5rd29uQHhp bGlueC5jb20+CisgKi8KKworI2lmbmRlZiBfWllOUU1QX0RQX0hfCisjZGVmaW5lIF9aWU5RTVBf RFBfSF8KKworc3RydWN0IGRldmljZTsKK3N0cnVjdCBkcm1fZGlzcGxheV9tb2RlOworc3RydWN0 IHBsYXRmb3JtX2RldmljZTsKK3N0cnVjdCB6eW5xbXBfZHA7CisKK2NvbnN0IGludCB6eW5xbXBf ZHBfc2V0X2NvbG9yKHN0cnVjdCB6eW5xbXBfZHAgKmRwLCBjb25zdCBjaGFyICpjb2xvcik7Cit2 b2lkIHp5bnFtcF9kcF9lbmFibGVfdmJsYW5rKHN0cnVjdCB6eW5xbXBfZHAgKmRwKTsKK3ZvaWQg enlucW1wX2RwX2Rpc2FibGVfdmJsYW5rKHN0cnVjdCB6eW5xbXBfZHAgKmRwKTsKK3ZvaWQgenlu cW1wX2RwX2VuY29kZXJfbW9kZV9zZXRfc3RyZWFtKHN0cnVjdCB6eW5xbXBfZHAgKmRwLAorCQkJ CSAgICAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSk7CisKK2ludCB6eW5xbXBfZHBf YmluZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2UgKm1hc3Rlciwgdm9pZCAqZGF0 YSk7Cit2b2lkIHp5bnFtcF9kcF91bmJpbmQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2 aWNlICptYXN0ZXIsIHZvaWQgKmRhdGEpOworCitpbnQgenlucW1wX2RwX3Byb2JlKHN0cnVjdCBw bGF0Zm9ybV9kZXZpY2UgKnBkZXYpOworaW50IHp5bnFtcF9kcF9yZW1vdmUoc3RydWN0IHBsYXRm b3JtX2RldmljZSAqcGRldik7CisKKyNlbmRpZiAvKiBfWllOUU1QX0RQX0hfICovCi0tIAoyLjcu NAoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KZHJpLWRl dmVsIG1haWxpbmcgbGlzdApkcmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8v bGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vZHJpLWRldmVsCg==