From mboxrd@z Thu Jan 1 00:00:00 1970 From: Hyun Kwon Subject: [PATCH v7 4/5] drm: xlnx: DRM KMS driver for Xilinx ZynqMP DisplayPort Date: Tue, 1 May 2018 17:31:45 -0700 Message-ID: <1525221106-32269-5-git-send-email-hyun.kwon@xilinx.com> References: <1525221106-32269-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: In-Reply-To: <1525221106-32269-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, Laurent Pinchart Cc: Daniel Vetter , Rob Herring , Michal Simek , Hyun Kwon List-Id: devicetree@vger.kernel.org VGhpcyBkcml2ZXIgY3JlYXRlcyBEUk0gZW5jb2RlciBhbmQgY29ubmVjdG9yIGZvciBaeW5xTVAg RGlzcGxheVBvcnQuCgpTaWduZWQtb2ZmLWJ5OiBIeXVuIEt3b24gPGh5dW4ua3dvbkB4aWxpbngu Y29tPgpBY2tlZC1ieTogRGFuaWVsIFZldHRlciA8ZGFuaWVsLnZldHRlckBmZndsbC5jaD4KLS0t CnY3Ci0gVXNlIGNvcnJlY3QgbnVtYmVyIG9mIGxhbmVzCnY2Ci0gQ29uc3RpZnkgYWxsIGZ1bmN0 aW9uIHBvaW50ZXJzCi0gQ2xlYW4gdXAgdGhlIGR1cGxpY2F0ZWQgbGljZW5zZSBwYXJhZ3JhcGhz Ci0gRG8gY29tcGxldGUgZm9yd2FyZCBkZWNsYXJhdGlvbiBpbiB0aGUgaGVhZGVyCnYyCi0gQ2hh bmdlIHRoZSBTUERYIGlkZW50aWZpZXIgZm9ybWF0Ci0gU3BsaXQgZHJtIHByb3BlcnRpZXMgaW50 byBhIHNlcGFyYXRlIHBhdGNoCi0tLQotLS0KIGRyaXZlcnMvZ3B1L2RybS94bG54L3p5bnFtcF9k cC5jIHwgMTczMyArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwogZHJpdmVy cy9ncHUvZHJtL3hsbngvenlucW1wX2RwLmggfCAgIDMwICsKIDIgZmlsZXMgY2hhbmdlZCwgMTc2 MyBpbnNlcnRpb25zKCspCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL3hsbngv enlucW1wX2RwLmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dwdS9kcm0veGxueC96eW5x bXBfZHAuaAoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS94bG54L3p5bnFtcF9kcC5jIGIv ZHJpdmVycy9ncHUvZHJtL3hsbngvenlucW1wX2RwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5k ZXggMDAwMDAwMC4uODM3OGZlMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS94 bG54L3p5bnFtcF9kcC5jCkBAIC0wLDAgKzEsMTczMyBAQAorLy8gU1BEWC1MaWNlbnNlLUlkZW50 aWZpZXI6IEdQTC0yLjAKKy8qCisgKiBaeW5xTVAgRGlzcGxheVBvcnQgRHJpdmVyCisgKgorICog IENvcHlyaWdodCAoQykgMjAxNyAtIDIwMTggWGlsaW54LCBJbmMuCisgKgorICogIEF1dGhvcjog SHl1biBXb28gS3dvbiA8aHl1bi5rd29uQHhpbGlueC5jb20+CisgKi8KKworI2luY2x1ZGUgPGRy bS9kcm1QLmg+CisjaW5jbHVkZSA8ZHJtL2RybV9hdG9taWNfaGVscGVyLmg+CisjaW5jbHVkZSA8 ZHJtL2RybV9jb25uZWN0b3IuaD4KKyNpbmNsdWRlIDxkcm0vZHJtX2NydGMuaD4KKyNpbmNsdWRl IDxkcm0vZHJtX2NydGNfaGVscGVyLmg+CisjaW5jbHVkZSA8ZHJtL2RybV9kcF9oZWxwZXIuaD4K KyNpbmNsdWRlIDxkcm0vZHJtX29mLmg+CisKKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2lu Y2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1 ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvcGh5L3BoeS5oPgorI2luY2x1ZGUg PGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4K KyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisKKyNpbmNsdWRlICJ6eW5xbXBfZGlzcC5oIgor I2luY2x1ZGUgInp5bnFtcF9kcHN1Yi5oIgorCitzdGF0aWMgdWludCB6eW5xbXBfZHBfYXV4X3Rp bWVvdXRfbXMgPSA1MDsKK21vZHVsZV9wYXJhbV9uYW1lZChhdXhfdGltZW91dF9tcywgenlucW1w X2RwX2F1eF90aW1lb3V0X21zLCB1aW50LCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoYXV4X3Rp bWVvdXRfbXMsICJEUCBhdXggdGltZW91dCB2YWx1ZSBpbiBtc2VjIChkZWZhdWx0OiA1MCkiKTsK KworLyoKKyAqIFNvbWUgc2luayByZXF1aXJlcyBhIGRlbGF5IGFmdGVyIHBvd2VyIG9uIHJlcXVl c3QKKyAqLworc3RhdGljIHVpbnQgenlucW1wX2RwX3Bvd2VyX29uX2RlbGF5X21zID0gNDsKK21v ZHVsZV9wYXJhbV9uYW1lZChwb3dlcl9vbl9kZWxheV9tcywgenlucW1wX2RwX3Bvd2VyX29uX2Rl bGF5X21zLCB1aW50LCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoYXV4X3RpbWVvdXRfbXMsICJE UCBwb3dlciBvbiBkZWxheSBpbiBtc2VjIChkZWZhdWx0OiA0KSIpOworCisvKiBMaW5rIGNvbmZp Z3VyYXRpb24gcmVnaXN0ZXJzICovCisjZGVmaW5lIFpZTlFNUF9EUF9UWF9MSU5LX0JXX1NFVAkJ CTB4MAorI2RlZmluZSBaWU5RTVBfRFBfVFhfTEFORV9DTlRfU0VUCQkJMHg0CisjZGVmaW5lIFpZ TlFNUF9EUF9UWF9FTkhBTkNFRF9GUkFNRV9FTgkJCTB4OAorI2RlZmluZSBaWU5RTVBfRFBfVFhf VFJBSU5JTkdfUEFUVEVSTl9TRVQJCTB4YworI2RlZmluZSBaWU5RTVBfRFBfVFhfU0NSQU1CTElO R19ESVNBQkxFCQkJMHgxNAorI2RlZmluZSBaWU5RTVBfRFBfVFhfRE9XTlNQUkVBRF9DVEwJCQkw eDE4CisjZGVmaW5lIFpZTlFNUF9EUF9UWF9TV19SRVNFVAkJCQkweDFjCisjZGVmaW5lIFpZTlFN UF9EUF9UWF9TV19SRVNFVF9TVFJFQU0xCQkJQklUKDApCisjZGVmaW5lIFpZTlFNUF9EUF9UWF9T V19SRVNFVF9TVFJFQU0yCQkJQklUKDEpCisjZGVmaW5lIFpZTlFNUF9EUF9UWF9TV19SRVNFVF9T VFJFQU0zCQkJQklUKDIpCisjZGVmaW5lIFpZTlFNUF9EUF9UWF9TV19SRVNFVF9TVFJFQU00CQkJ QklUKDMpCisjZGVmaW5lIFpZTlFNUF9EUF9UWF9TV19SRVNFVF9BVVgJCQlCSVQoNykKKyNkZWZp bmUgWllOUU1QX0RQX1RYX1NXX1JFU0VUX0FMTAkJCShaWU5RTVBfRFBfVFhfU1dfUkVTRVRfU1RS RUFNMSB8IFwKKwkJCQkJCQkgWllOUU1QX0RQX1RYX1NXX1JFU0VUX1NUUkVBTTIgfCBcCisJCQkJ CQkJIFpZTlFNUF9EUF9UWF9TV19SRVNFVF9TVFJFQU0zIHwgXAorCQkJCQkJCSBaWU5RTVBfRFBf VFhfU1dfUkVTRVRfU1RSRUFNNCB8IFwKKwkJCQkJCQkgWllOUU1QX0RQX1RYX1NXX1JFU0VUX0FV WCkKKworLyogQ29yZSBlbmFibGUgcmVnaXN0ZXJzICovCisjZGVmaW5lIFpZTlFNUF9EUF9UWF9F TkFCTEUJCQkJMHg4MAorI2RlZmluZSBaWU5RTVBfRFBfVFhfRU5BQkxFX01BSU5fU1RSRUFNCQkJ MHg4NAorI2RlZmluZSBaWU5RTVBfRFBfVFhfRk9SQ0VfU0NSQU1CTEVSX1JFU0VUCQkweGMwCisj ZGVmaW5lIFpZTlFNUF9EUF9UWF9WRVJTSU9OCQkJCTB4ZjgKKyNkZWZpbmUgWllOUU1QX0RQX1RY X1ZFUlNJT05fTUFKT1JfTUFTSwkJCUdFTk1BU0soMzEsIDI0KQorI2RlZmluZSBaWU5RTVBfRFBf VFhfVkVSU0lPTl9NQUpPUl9TSElGVAkJMjQKKyNkZWZpbmUgWllOUU1QX0RQX1RYX1ZFUlNJT05f TUlOT1JfTUFTSwkJCUdFTk1BU0soMjMsIDE2KQorI2RlZmluZSBaWU5RTVBfRFBfVFhfVkVSU0lP Tl9NSU5PUl9TSElGVAkJMTYKKyNkZWZpbmUgWllOUU1QX0RQX1RYX1ZFUlNJT05fUkVWSVNJT05f TUFTSwkJR0VOTUFTSygxNSwgMTIpCisjZGVmaW5lIFpZTlFNUF9EUF9UWF9WRVJTSU9OX1JFVklT SU9OX1NISUZUCQkxMgorI2RlZmluZSBaWU5RTVBfRFBfVFhfVkVSU0lPTl9QQVRDSF9NQVNLCQkJ R0VOTUFTSygxMSwgOCkKKyNkZWZpbmUgWllOUU1QX0RQX1RYX1ZFUlNJT05fUEFUQ0hfU0hJRlQJ CTgKKyNkZWZpbmUgWllOUU1QX0RQX1RYX1ZFUlNJT05fSU5URVJOQUxfTUFTSwkJR0VOTUFTSyg3 LCAwKQorI2RlZmluZSBaWU5RTVBfRFBfVFhfVkVSU0lPTl9JTlRFUk5BTF9TSElGVAkJMAorCisv KiBDb3JlIElEIHJlZ2lzdGVycyAqLworI2RlZmluZSBaWU5RTVBfRFBfVFhfQ09SRV9JRAkJCQkw eGZjCisjZGVmaW5lIFpZTlFNUF9EUF9UWF9DT1JFX0lEX01BSk9SX01BU0sJCQlHRU5NQVNLKDMx LCAyNCkKKyNkZWZpbmUgWllOUU1QX0RQX1RYX0NPUkVfSURfTUFKT1JfU0hJRlQJCTI0CisjZGVm aW5lIFpZTlFNUF9EUF9UWF9DT1JFX0lEX01JTk9SX01BU0sJCQlHRU5NQVNLKDIzLCAxNikKKyNk ZWZpbmUgWllOUU1QX0RQX1RYX0NPUkVfSURfTUlOT1JfU0hJRlQJCTE2CisjZGVmaW5lIFpZTlFN UF9EUF9UWF9DT1JFX0lEX1JFVklTSU9OX01BU0sJCUdFTk1BU0soMTUsIDgpCisjZGVmaW5lIFpZ TlFNUF9EUF9UWF9DT1JFX0lEX1JFVklTSU9OX1NISUZUCQk4CisjZGVmaW5lIFpZTlFNUF9EUF9U WF9DT1JFX0lEX0RJUkVDVElPTgkJCUdFTk1BU0soMSkKKworLyogQVVYIGNoYW5uZWwgaW50ZXJm YWNlIHJlZ2lzdGVycyAqLworI2RlZmluZSBaWU5RTVBfRFBfVFhfQVVYX0NPTU1BTkQJCQkweDEw MAorI2RlZmluZSBaWU5RTVBfRFBfVFhfQVVYX0NPTU1BTkRfQ01EX1NISUZUCQk4CisjZGVmaW5l IFpZTlFNUF9EUF9UWF9BVVhfQ09NTUFORF9BRERSRVNTX09OTFkJCUJJVCgxMikKKyNkZWZpbmUg WllOUU1QX0RQX1RYX0FVWF9DT01NQU5EX0JZVEVTX1NISUZUCQkwCisjZGVmaW5lIFpZTlFNUF9E UF9UWF9BVVhfV1JJVEVfRklGTwkJCTB4MTA0CisjZGVmaW5lIFpZTlFNUF9EUF9UWF9BVVhfQURE UkVTUwkJCTB4MTA4CisjZGVmaW5lIFpZTlFNUF9EUF9UWF9DTEtfRElWSURFUgkJCTB4MTBjCisj ZGVmaW5lIFpZTlFNUF9EUF9UWF9DTEtfRElWSURFUl9NSFoJCQkxMDAwMDAwCisjZGVmaW5lIFpZ TlFNUF9EUF9UWF9DTEtfRElWSURFUl9BVVhfRklMVEVSX1NISUZUCTgKKyNkZWZpbmUgWllOUU1Q X0RQX1RYX0lOVFJfU0lHTkFMX1NUQVRFCQkJMHgxMzAKKyNkZWZpbmUgWllOUU1QX0RQX1RYX0lO VFJfU0lHTkFMX1NUQVRFX0hQRAkJQklUKDApCisjZGVmaW5lIFpZTlFNUF9EUF9UWF9JTlRSX1NJ R05BTF9TVEFURV9SRVFVRVNUCQlCSVQoMSkKKyNkZWZpbmUgWllOUU1QX0RQX1RYX0lOVFJfU0lH TkFMX1NUQVRFX1JFUExZCQlCSVQoMikKKyNkZWZpbmUgWllOUU1QX0RQX1RYX0lOVFJfU0lHTkFM X1NUQVRFX1JFUExZX1RJTUVPVVQJQklUKDMpCisjZGVmaW5lIFpZTlFNUF9EUF9UWF9BVVhfUkVQ TFlfREFUQQkJCTB4MTM0CisjZGVmaW5lIFpZTlFNUF9EUF9UWF9BVVhfUkVQTFlfQ09ERQkJCTB4 MTM4CisjZGVmaW5lIFpZTlFNUF9EUF9UWF9BVVhfUkVQTFlfQ09ERV9BVVhfQUNLCQkoMCkKKyNk ZWZpbmUgWllOUU1QX0RQX1RYX0FVWF9SRVBMWV9DT0RFX0FVWF9OQUNLCQlCSVQoMCkKKyNkZWZp bmUgWllOUU1QX0RQX1RYX0FVWF9SRVBMWV9DT0RFX0FVWF9ERUZFUgkJQklUKDEpCisjZGVmaW5l IFpZTlFNUF9EUF9UWF9BVVhfUkVQTFlfQ09ERV9JMkNfQUNLCQkoMCkKKyNkZWZpbmUgWllOUU1Q X0RQX1RYX0FVWF9SRVBMWV9DT0RFX0kyQ19OQUNLCQlCSVQoMikKKyNkZWZpbmUgWllOUU1QX0RQ X1RYX0FVWF9SRVBMWV9DT0RFX0kyQ19ERUZFUgkJQklUKDMpCisjZGVmaW5lIFpZTlFNUF9EUF9U WF9BVVhfUkVQTFlfQ05UCQkJMHgxM2MKKyNkZWZpbmUgWllOUU1QX0RQX1RYX0FVWF9SRVBMWV9D TlRfTUFTSwkJCTB4ZmYKKyNkZWZpbmUgWllOUU1QX0RQX1RYX0lOVFJfU1RBVFVTCQkJMHgxNDAK KyNkZWZpbmUgWllOUU1QX0RQX1RYX0lOVFJfTUFTSwkJCQkweDE0NAorI2RlZmluZSBaWU5RTVBf RFBfVFhfSU5UUl9IUERfSVJRCQkJQklUKDApCisjZGVmaW5lIFpZTlFNUF9EUF9UWF9JTlRSX0hQ RF9FVkVOVAkJCUJJVCgxKQorI2RlZmluZSBaWU5RTVBfRFBfVFhfSU5UUl9SRVBMWV9SRUNWCQkJ QklUKDIpCisjZGVmaW5lIFpZTlFNUF9EUF9UWF9JTlRSX1JFUExZX1RJTUVPVVQJCQlCSVQoMykK KyNkZWZpbmUgWllOUU1QX0RQX1RYX0lOVFJfSFBEX1BVTFNFCQkJQklUKDQpCisjZGVmaW5lIFpZ TlFNUF9EUF9UWF9JTlRSX0VYVF9QS1RfVFhECQkJQklUKDUpCisjZGVmaW5lIFpZTlFNUF9EUF9U WF9JTlRSX0xJVl9BQlVGX1VORFJGTFcJCUJJVCgxMikKKyNkZWZpbmUgWllOUU1QX0RQX1RYX0lO VFJfVkJMQU5LX1NUQVJUCQkJQklUKDEzKQorI2RlZmluZSBaWU5RTVBfRFBfVFhfSU5UUl9QSVhF TDBfTUFUQ0gJCQlCSVQoMTQpCisjZGVmaW5lIFpZTlFNUF9EUF9UWF9JTlRSX1BJWEVMMV9NQVRD SAkJCUJJVCgxNSkKKyNkZWZpbmUgWllOUU1QX0RQX1RYX0lOVFJfQ0hCVUZfVU5ERVJGTFdfTUFT SwkJMHgzZjAwMDAKKyNkZWZpbmUgWllOUU1QX0RQX1RYX0lOVFJfQ0hCVUZfT1ZFUkZMV19NQVNL CQkweGZjMDAwMDAKKyNkZWZpbmUgWllOUU1QX0RQX1RYX0lOVFJfQ1VTVF9UU18yCQkJQklUKDI4 KQorI2RlZmluZSBaWU5RTVBfRFBfVFhfSU5UUl9DVVNUX1RTCQkJQklUKDI5KQorI2RlZmluZSBa WU5RTVBfRFBfVFhfSU5UUl9FWFRfVlNZTkNfVFMJCQlCSVQoMzApCisjZGVmaW5lIFpZTlFNUF9E UF9UWF9JTlRSX1ZTWU5DX1RTCQkJQklUKDMxKQorI2RlZmluZSBaWU5RTVBfRFBfVFhfSU5UUl9B TEwJCQkJKFpZTlFNUF9EUF9UWF9JTlRSX0hQRF9JUlEgfCBcCisJCQkJCQkJIFpZTlFNUF9EUF9U WF9JTlRSX0hQRF9FVkVOVCB8IFwKKwkJCQkJCQkgWllOUU1QX0RQX1RYX0lOVFJfUkVQTFlfUkVD ViB8IFwKKwkJCQkJCQkgWllOUU1QX0RQX1RYX0lOVFJfUkVQTFlfVElNRU9VVCB8IFwKKwkJCQkJ CQkgWllOUU1QX0RQX1RYX0lOVFJfSFBEX1BVTFNFIHwgXAorCQkJCQkJCSBaWU5RTVBfRFBfVFhf SU5UUl9FWFRfUEtUX1RYRCB8IFwKKwkJCQkJCQkgWllOUU1QX0RQX1RYX0lOVFJfTElWX0FCVUZf VU5EUkZMVyB8IFwKKwkJCQkJCQkgWllOUU1QX0RQX1RYX0lOVFJfQ0hCVUZfVU5ERVJGTFdfTUFT SyB8IFwKKwkJCQkJCQkgWllOUU1QX0RQX1RYX0lOVFJfQ0hCVUZfT1ZFUkZMV19NQVNLKQorI2Rl ZmluZSBaWU5RTVBfRFBfVFhfTk9fSU5UUl9BTEwJCQkoWllOUU1QX0RQX1RYX0lOVFJfUElYRUww X01BVENIIHwgXAorCQkJCQkJCSBaWU5RTVBfRFBfVFhfSU5UUl9QSVhFTDFfTUFUQ0ggfCBcCisJ CQkJCQkJIFpZTlFNUF9EUF9UWF9JTlRSX0NVU1RfVFNfMiB8IFwKKwkJCQkJCQkgWllOUU1QX0RQ X1RYX0lOVFJfQ1VTVF9UUyB8IFwKKwkJCQkJCQkgWllOUU1QX0RQX1RYX0lOVFJfRVhUX1ZTWU5D X1RTIHwgXAorCQkJCQkJCSBaWU5RTVBfRFBfVFhfSU5UUl9WU1lOQ19UUykKKyNkZWZpbmUgWllO UU1QX0RQX1RYX1JFUExZX0RBVEFfQ05UCQkJMHgxNDgKKyNkZWZpbmUgWllOUU1QX0RQX1NVQl9U WF9JTlRSX1NUQVRVUwkJCTB4M2EwCisjZGVmaW5lIFpZTlFNUF9EUF9TVUJfVFhfSU5UUl9NQVNL CQkJMHgzYTQKKyNkZWZpbmUgWllOUU1QX0RQX1NVQl9UWF9JTlRSX0VOCQkJMHgzYTgKKyNkZWZp bmUgWllOUU1QX0RQX1NVQl9UWF9JTlRSX0RTCQkJMHgzYWMKKworLyogTWFpbiBzdHJlYW0gYXR0 cmlidXRlIHJlZ2lzdGVycyAqLworI2RlZmluZSBaWU5RTVBfRFBfVFhfTUFJTl9TVFJFQU1fSFRP VEFMCQkJMHgxODAKKyNkZWZpbmUgWllOUU1QX0RQX1RYX01BSU5fU1RSRUFNX1ZUT1RBTAkJCTB4 MTg0CisjZGVmaW5lIFpZTlFNUF9EUF9UWF9NQUlOX1NUUkVBTV9QT0xBUklUWQkJMHgxODgKKyNk ZWZpbmUgWllOUU1QX0RQX1RYX01BSU5fU1RSRUFNX1BPTEFSSVRZX0hTWU5DX1NISUZUCTAKKyNk ZWZpbmUgWllOUU1QX0RQX1RYX01BSU5fU1RSRUFNX1BPTEFSSVRZX1ZTWU5DX1NISUZUCTEKKyNk ZWZpbmUgWllOUU1QX0RQX1RYX01BSU5fU1RSRUFNX0hTV0lEVEgJCTB4MThjCisjZGVmaW5lIFpZ TlFNUF9EUF9UWF9NQUlOX1NUUkVBTV9WU1dJRFRICQkweDE5MAorI2RlZmluZSBaWU5RTVBfRFBf VFhfTUFJTl9TVFJFQU1fSFJFUwkJCTB4MTk0CisjZGVmaW5lIFpZTlFNUF9EUF9UWF9NQUlOX1NU UkVBTV9WUkVTCQkJMHgxOTgKKyNkZWZpbmUgWllOUU1QX0RQX1RYX01BSU5fU1RSRUFNX0hTVEFS VAkJCTB4MTljCisjZGVmaW5lIFpZTlFNUF9EUF9UWF9NQUlOX1NUUkVBTV9WU1RBUlQJCQkweDFh MAorI2RlZmluZSBaWU5RTVBfRFBfVFhfTUFJTl9TVFJFQU1fTUlTQzAJCQkweDFhNAorI2RlZmlu ZSBaWU5RTVBfRFBfVFhfTUFJTl9TVFJFQU1fTUlTQzBfU1lOQwkJQklUKDApCisjZGVmaW5lIFpZ TlFNUF9EUF9UWF9NQUlOX1NUUkVBTV9NSVNDMF9GT1JNQVRfU0hJRlQJMQorI2RlZmluZSBaWU5R TVBfRFBfVFhfTUFJTl9TVFJFQU1fTUlTQzBfRFlOQU1JQ19SQU5HRQlCSVQoMykKKyNkZWZpbmUg WllOUU1QX0RQX1RYX01BSU5fU1RSRUFNX01JU0MwX1lDQkNSX0NPTFJJTUVUUlkJQklUKDQpCisj ZGVmaW5lIFpZTlFNUF9EUF9UWF9NQUlOX1NUUkVBTV9NSVNDMF9CUENfU0hJRlQJNQorI2RlZmlu ZSBaWU5RTVBfRFBfVFhfTUFJTl9TVFJFQU1fTUlTQzEJCQkweDFhOAorI2RlZmluZSBaWU5RTVBf RFBfVFhfTUFJTl9TVFJFQU1fTUlTQzBfSU5URVJMQUNFRF9WRVJUCUJJVCgwKQorI2RlZmluZSBa WU5RTVBfRFBfVFhfTUFJTl9TVFJFQU1fTUlTQzBfU1RFUkVPX1ZJRF9TSElGVAkxCisjZGVmaW5l IFpZTlFNUF9EUF9UWF9NX1ZJRAkJCQkweDFhYworI2RlZmluZSBaWU5RTVBfRFBfVFhfVFJBTlNG RVJfVU5JVF9TSVpFCQkJMHgxYjAKKyNkZWZpbmUgWllOUU1QX0RQX1RYX0RFRl9UUkFOU0ZFUl9V TklUX1NJWkUJCTY0CisjZGVmaW5lIFpZTlFNUF9EUF9UWF9OX1ZJRAkJCQkweDFiNAorI2RlZmlu ZSBaWU5RTVBfRFBfVFhfVVNFUl9QSVhFTF9XSURUSAkJCTB4MWI4CisjZGVmaW5lIFpZTlFNUF9E UF9UWF9VU0VSX0RBVEFfQ05UX1BFUl9MQU5FCQkweDFiYworI2RlZmluZSBaWU5RTVBfRFBfVFhf TUlOX0JZVEVTX1BFUl9UVQkJCTB4MWM0CisjZGVmaW5lIFpZTlFNUF9EUF9UWF9GUkFDX0JZVEVT X1BFUl9UVQkJCTB4MWM4CisjZGVmaW5lIFpZTlFNUF9EUF9UWF9JTklUX1dBSVQJCQkJMHgxY2MK KworLyogUEhZIGNvbmZpZ3VyYXRpb24gYW5kIHN0YXR1cyByZWdpc3RlcnMgKi8KKyNkZWZpbmUg WllOUU1QX0RQX1RYX1BIWV9DT05GSUcJCQkJMHgyMDAKKyNkZWZpbmUgWllOUU1QX0RQX1RYX1BI WV9DT05GSUdfUEhZX1JFU0VUCQlCSVQoMCkKKyNkZWZpbmUgWllOUU1QX0RQX1RYX1BIWV9DT05G SUdfR1RUWF9SRVNFVAkJQklUKDEpCisjZGVmaW5lIFpZTlFNUF9EUF9UWF9QSFlfQ09ORklHX1BI WV9QTUFfUkVTRVQJCUJJVCg4KQorI2RlZmluZSBaWU5RTVBfRFBfVFhfUEhZX0NPTkZJR19QSFlf UENTX1JFU0VUCQlCSVQoOSkKKyNkZWZpbmUgWllOUU1QX0RQX1RYX1BIWV9DT05GSUdfQUxMX1JF U0VUCQkoWllOUU1QX0RQX1RYX1BIWV9DT05GSUdfUEhZX1JFU0VUIHwgXAorCQkJCQkJCSBaWU5R TVBfRFBfVFhfUEhZX0NPTkZJR19HVFRYX1JFU0VUIHwgXAorCQkJCQkJCSBaWU5RTVBfRFBfVFhf UEhZX0NPTkZJR19QSFlfUE1BX1JFU0VUIHwgXAorCQkJCQkJCSBaWU5RTVBfRFBfVFhfUEhZX0NP TkZJR19QSFlfUENTX1JFU0VUKQorI2RlZmluZSBaWU5RTVBfRFBfVFhfUEhZX1BSRUVNUEhBU0lT X0xBTkVfMAkJMHgyMTAKKyNkZWZpbmUgWllOUU1QX0RQX1RYX1BIWV9QUkVFTVBIQVNJU19MQU5F XzEJCTB4MjE0CisjZGVmaW5lIFpZTlFNUF9EUF9UWF9QSFlfUFJFRU1QSEFTSVNfTEFORV8yCQkw eDIxOAorI2RlZmluZSBaWU5RTVBfRFBfVFhfUEhZX1BSRUVNUEhBU0lTX0xBTkVfMwkJMHgyMWMK KyNkZWZpbmUgWllOUU1QX0RQX1RYX1BIWV9WT0xUQUdFX0RJRkZfTEFORV8wCQkweDIyMAorI2Rl ZmluZSBaWU5RTVBfRFBfVFhfUEhZX1ZPTFRBR0VfRElGRl9MQU5FXzEJCTB4MjI0CisjZGVmaW5l IFpZTlFNUF9EUF9UWF9QSFlfVk9MVEFHRV9ESUZGX0xBTkVfMgkJMHgyMjgKKyNkZWZpbmUgWllO UU1QX0RQX1RYX1BIWV9WT0xUQUdFX0RJRkZfTEFORV8zCQkweDIyYworI2RlZmluZSBaWU5RTVBf RFBfVFhfUEhZX0NMT0NLX0ZFRURCQUNLX1NFVFRJTkcJCTB4MjM0CisjZGVmaW5lIFpZTlFNUF9E UF9UWF9QSFlfQ0xPQ0tfRkVFREJBQ0tfU0VUVElOR18xNjIJMHgxCisjZGVmaW5lIFpZTlFNUF9E UF9UWF9QSFlfQ0xPQ0tfRkVFREJBQ0tfU0VUVElOR18yNzAJMHgzCisjZGVmaW5lIFpZTlFNUF9E UF9UWF9QSFlfQ0xPQ0tfRkVFREJBQ0tfU0VUVElOR181NDAJMHg1CisjZGVmaW5lIFpZTlFNUF9E UF9UWF9QSFlfUE9XRVJfRE9XTgkJCTB4MjM4CisjZGVmaW5lIFpZTlFNUF9EUF9UWF9QSFlfUE9X RVJfRE9XTl9MQU5FXzAJCUJJVCgwKQorI2RlZmluZSBaWU5RTVBfRFBfVFhfUEhZX1BPV0VSX0RP V05fTEFORV8xCQlCSVQoMSkKKyNkZWZpbmUgWllOUU1QX0RQX1RYX1BIWV9QT1dFUl9ET1dOX0xB TkVfMgkJQklUKDIpCisjZGVmaW5lIFpZTlFNUF9EUF9UWF9QSFlfUE9XRVJfRE9XTl9MQU5FXzMJ CUJJVCgzKQorI2RlZmluZSBaWU5RTVBfRFBfVFhfUEhZX1BPV0VSX0RPV05fQUxMCQkJMHhmCisj ZGVmaW5lIFpZTlFNUF9EUF9UWF9QSFlfUFJFQ1VSU09SX0xBTkVfMAkJMHgyM2MKKyNkZWZpbmUg WllOUU1QX0RQX1RYX1BIWV9QUkVDVVJTT1JfTEFORV8xCQkweDI0MAorI2RlZmluZSBaWU5RTVBf RFBfVFhfUEhZX1BSRUNVUlNPUl9MQU5FXzIJCTB4MjQ0CisjZGVmaW5lIFpZTlFNUF9EUF9UWF9Q SFlfUFJFQ1VSU09SX0xBTkVfMwkJMHgyNDgKKyNkZWZpbmUgWllOUU1QX0RQX1RYX1BIWV9QT1NU Q1VSU09SX0xBTkVfMAkJMHgyNGMKKyNkZWZpbmUgWllOUU1QX0RQX1RYX1BIWV9QT1NUQ1VSU09S X0xBTkVfMQkJMHgyNTAKKyNkZWZpbmUgWllOUU1QX0RQX1RYX1BIWV9QT1NUQ1VSU09SX0xBTkVf MgkJMHgyNTQKKyNkZWZpbmUgWllOUU1QX0RQX1RYX1BIWV9QT1NUQ1VSU09SX0xBTkVfMwkJMHgy NTgKKyNkZWZpbmUgWllOUU1QX0RQX1NVQl9UWF9QSFlfUFJFQ1VSU09SX0xBTkVfMAkJMHgyNGMK KyNkZWZpbmUgWllOUU1QX0RQX1NVQl9UWF9QSFlfUFJFQ1VSU09SX0xBTkVfMQkJMHgyNTAKKyNk ZWZpbmUgWllOUU1QX0RQX1RYX1BIWV9TVEFUVVMJCQkJMHgyODAKKyNkZWZpbmUgWllOUU1QX0RQ X1RYX1BIWV9TVEFUVVNfUExMX0xPQ0tFRF9TSElGVAk0CisjZGVmaW5lIFpZTlFNUF9EUF9UWF9Q SFlfU1RBVFVTX0ZQR0FfUExMX0xPQ0tFRAkJQklUKDYpCisKKy8qIEF1ZGlvIHJlZ2lzdGVycyAq LworI2RlZmluZSBaWU5RTVBfRFBfVFhfQVVESU9fQ09OVFJPTAkJCTB4MzAwCisjZGVmaW5lIFpZ TlFNUF9EUF9UWF9BVURJT19DSEFOTkVMUwkJCTB4MzA0CisjZGVmaW5lIFpZTlFNUF9EUF9UWF9B VURJT19JTkZPX0RBVEEJCQkweDMwOAorI2RlZmluZSBaWU5RTVBfRFBfVFhfQVVESU9fTV9BVUQJ CQkweDMyOAorI2RlZmluZSBaWU5RTVBfRFBfVFhfQVVESU9fTl9BVUQJCQkweDMyYworI2RlZmlu ZSBaWU5RTVBfRFBfVFhfQVVESU9fRVhUX0RBVEEJCQkweDMzMAorCisjZGVmaW5lIFpZTlFNUF9E UF9NSVNDMF9SR0IJCQkJKDApCisjZGVmaW5lIFpZTlFNUF9EUF9NSVNDMF9ZQ1JDQl80MjIJCQko NSA8PCAxKQorI2RlZmluZSBaWU5RTVBfRFBfTUlTQzBfWUNSQ0JfNDQ0CQkJKDYgPDwgMSkKKyNk ZWZpbmUgWllOUU1QX0RQX01JU0MwX0ZPUk1BVF9NQVNLCQkJMHhlCisjZGVmaW5lIFpZTlFNUF9E UF9NSVNDMF9CUENfNgkJCQkoMCA8PCA1KQorI2RlZmluZSBaWU5RTVBfRFBfTUlTQzBfQlBDXzgJ CQkJKDEgPDwgNSkKKyNkZWZpbmUgWllOUU1QX0RQX01JU0MwX0JQQ18xMAkJCQkoMiA8PCA1KQor I2RlZmluZSBaWU5RTVBfRFBfTUlTQzBfQlBDXzEyCQkJCSgzIDw8IDUpCisjZGVmaW5lIFpZTlFN UF9EUF9NSVNDMF9CUENfMTYJCQkJKDQgPDwgNSkKKyNkZWZpbmUgWllOUU1QX0RQX01JU0MwX0JQ Q19NQVNLCQkJMHhlMAorI2RlZmluZSBaWU5RTVBfRFBfTUlTQzFfWV9PTkxZCQkJCSgxIDw8IDcp CisKKyNkZWZpbmUgWllOUU1QX0RQX01BWF9MQU5FUwkJCQkyCisjZGVmaW5lIFpZTlFNUF9NQVhf RlJFUQkJCQkJMzAwMDAwMAorCisjZGVmaW5lIERQX1JFRFVDRURfQklUX1JBVEUJCQkJMTYyMDAw CisjZGVmaW5lIERQX0hJR0hfQklUX1JBVEUJCQkJMjcwMDAwCisjZGVmaW5lIERQX0hJR0hfQklU X1JBVEUyCQkJCTU0MDAwMAorI2RlZmluZSBEUF9NQVhfVFJBSU5JTkdfVFJJRVMJCQkJNQorI2Rl ZmluZSBEUF9WMV8yCQkJCQkJMHgxMgorCisvKioKKyAqIHN0cnVjdCB6eW5xbXBfZHBfbGlua19j b25maWcgLSBDb21tb24gbGluayBjb25maWcgYmV0d2VlbiBzb3VyY2UgYW5kIHNpbmsKKyAqIEBt YXhfcmF0ZTogbWF4aW11bSBsaW5rIHJhdGUKKyAqIEBtYXhfbGFuZXM6IG1heGltdW0gbnVtYmVy IG9mIGxhbmVzCisgKi8KK3N0cnVjdCB6eW5xbXBfZHBfbGlua19jb25maWcgeworCWludCBtYXhf cmF0ZTsKKwl1OCBtYXhfbGFuZXM7Cit9OworCisvKioKKyAqIHN0cnVjdCB6eW5xbXBfZHBfbW9k ZSAtIENvbmZpZ3VyZWQgbW9kZSBvZiBEaXNwbGF5UG9ydAorICogQGJ3X2NvZGU6IGNvZGUgZm9y IGJhbmR3aWR0aChsaW5rIHJhdGUpCisgKiBAbGFuZV9jbnQ6IG51bWJlciBvZiBsYW5lcworICog QHBjbG9jazogcGl4ZWwgY2xvY2sgZnJlcXVlbmN5IG9mIGN1cnJlbnQgbW9kZQorICogQGZtdDog Zm9ybWF0IGlkZW50aWZpZXIgc3RyaW5nCisgKi8KK3N0cnVjdCB6eW5xbXBfZHBfbW9kZSB7CisJ dTggYndfY29kZTsKKwl1OCBsYW5lX2NudDsKKwlpbnQgcGNsb2NrOworCWNvbnN0IGNoYXIgKmZt dDsKK307CisKKy8qKgorICogc3RydWN0IHp5bnFtcF9kcF9jb25maWcgLSBDb25maWd1cmF0aW9u IG9mIERpc3BsYXlQb3J0IGZyb20gRFRTCisgKiBAbWlzYzA6IG1pc2MwIGNvbmZpZ3VyYXRpb24g KHBlciBEUCB2MS4yIHNwZWMpCisgKiBAbWlzYzE6IG1pc2MxIGNvbmZpZ3VyYXRpb24gKHBlciBE UCB2MS4yIHNwZWMpCisgKiBAYnBwOiBiaXRzIHBlciBwaXhlbAorICogQGJwYzogYml0cyBwZXIg Y29tcG9uZW50CisgKiBAbnVtX2NvbG9yczogbnVtYmVyIG9mIGNvbG9yIGNvbXBvbmVudHMKKyAq Lworc3RydWN0IHp5bnFtcF9kcF9jb25maWcgeworCXU4IG1pc2MwOworCXU4IG1pc2MxOworCXU4 IGJwcDsKKwl1OCBicGM7CisJdTggbnVtX2NvbG9yczsKK307CisKKy8qKgorICogc3RydWN0IHp5 bnFtcF9kcCAtIFhpbGlueCBEaXNwbGF5UG9ydCBjb3JlCisgKiBAZW5jb2RlcjogdGhlIGRybSBl bmNvZGVyIHN0cnVjdHVyZQorICogQGNvbm5lY3RvcjogdGhlIGRybSBjb25uZWN0b3Igc3RydWN0 dXJlCisgKiBAZGV2OiBkZXZpY2Ugc3RydWN0dXJlCisgKiBAZHBzdWI6IERpc3BsYXkgc3Vic3lz dGVtCisgKiBAZHJtOiBEUk0gY29yZQorICogQGlvbWVtOiBkZXZpY2UgSS9PIG1lbW9yeSBmb3Ig cmVnaXN0ZXIgYWNjZXNzCisgKiBAaXJxOiBpcnEKKyAqIEBjb25maWc6IElQIGNvcmUgY29uZmln dXJhdGlvbiBmcm9tIERUUworICogQGF1eDogYXV4IGNoYW5uZWwKKyAqIEBwaHk6IFBIWSBoYW5k bGVzIGZvciBEUCBsYW5lcworICogQG51bV9sYW5lczogbnVtYmVyIG9mIGVuYWJsZWQgcGh5IGxh bmVzCisgKiBAaHBkX3dvcms6IGhvdCBwbHVnIGRldGVjdGlvbiB3b3JrZXIKKyAqIEBzdGF0dXM6 IGNvbm5lY3Rpb24gc3RhdHVzCisgKiBAZW5hYmxlZDogZmxhZyB0byBpbmRpY2F0ZSBpZiB0aGUg ZGV2aWNlIGlzIGVuYWJsZWQKKyAqIEBkcG1zOiBjdXJyZW50IGRwbXMgc3RhdGUKKyAqIEBkcGNk OiBEUCBjb25maWd1cmF0aW9uIGRhdGEgZnJvbSBjdXJyZW50bHkgY29ubmVjdGVkIHNpbmsgZGV2 aWNlCisgKiBAbGlua19jb25maWc6IGNvbW1vbiBsaW5rIGNvbmZpZ3VyYXRpb24gYmV0d2VlbiBJ UCBjb3JlIGFuZCBzaW5rIGRldmljZQorICogQG1vZGU6IGN1cnJlbnQgbW9kZSBiZXR3ZWVuIElQ IGNvcmUgYW5kIHNpbmsgZGV2aWNlCisgKiBAdHJhaW5fc2V0OiBzZXQgb2YgdHJhaW5pbmcgZGF0 YQorICovCitzdHJ1Y3QgenlucW1wX2RwIHsKKwlzdHJ1Y3QgZHJtX2VuY29kZXIgZW5jb2RlcjsK KwlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciBjb25uZWN0b3I7CisJc3RydWN0IGRldmljZSAqZGV2Owor CXN0cnVjdCB6eW5xbXBfZHBzdWIgKmRwc3ViOworCXN0cnVjdCBkcm1fZGV2aWNlICpkcm07CisJ dm9pZCBfX2lvbWVtICppb21lbTsKKwlpbnQgaXJxOworCisJc3RydWN0IHp5bnFtcF9kcF9jb25m aWcgY29uZmlnOworCXN0cnVjdCBkcm1fZHBfYXV4IGF1eDsKKwlzdHJ1Y3QgcGh5ICpwaHlbWllO UU1QX0RQX01BWF9MQU5FU107CisJdTggbnVtX2xhbmVzOworCXN0cnVjdCBkZWxheWVkX3dvcmsg aHBkX3dvcms7CisJZW51bSBkcm1fY29ubmVjdG9yX3N0YXR1cyBzdGF0dXM7CisJYm9vbCBlbmFi bGVkOworCisJaW50IGRwbXM7CisJdTggZHBjZFtEUF9SRUNFSVZFUl9DQVBfU0laRV07CisJc3Ry dWN0IHp5bnFtcF9kcF9saW5rX2NvbmZpZyBsaW5rX2NvbmZpZzsKKwlzdHJ1Y3QgenlucW1wX2Rw X21vZGUgbW9kZTsKKwl1OCB0cmFpbl9zZXRbWllOUU1QX0RQX01BWF9MQU5FU107Cit9OworCitz dGF0aWMgaW5saW5lIHN0cnVjdCB6eW5xbXBfZHAgKmVuY29kZXJfdG9fZHAoc3RydWN0IGRybV9l bmNvZGVyICplbmNvZGVyKQoreworCXJldHVybiBjb250YWluZXJfb2YoZW5jb2Rlciwgc3RydWN0 IHp5bnFtcF9kcCwgZW5jb2Rlcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHp5bnFtcF9k cCAqY29ubmVjdG9yX3RvX2RwKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCit7CisJ cmV0dXJuIGNvbnRhaW5lcl9vZihjb25uZWN0b3IsIHN0cnVjdCB6eW5xbXBfZHAsIGNvbm5lY3Rv cik7Cit9CisKK3N0YXRpYyB2b2lkIHp5bnFtcF9kcF93cml0ZSh2b2lkIF9faW9tZW0gKmJhc2Us IGludCBvZmZzZXQsIHUzMiB2YWwpCit7CisJd3JpdGVsKHZhbCwgYmFzZSArIG9mZnNldCk7Cit9 CisKK3N0YXRpYyB1MzIgenlucW1wX2RwX3JlYWQodm9pZCBfX2lvbWVtICpiYXNlLCBpbnQgb2Zm c2V0KQoreworCXJldHVybiByZWFkbChiYXNlICsgb2Zmc2V0KTsKK30KKworc3RhdGljIHZvaWQg enlucW1wX2RwX2Nscih2b2lkIF9faW9tZW0gKmJhc2UsIGludCBvZmZzZXQsIHUzMiBjbHIpCit7 CisJenlucW1wX2RwX3dyaXRlKGJhc2UsIG9mZnNldCwgenlucW1wX2RwX3JlYWQoYmFzZSwgb2Zm c2V0KSAmIH5jbHIpOworfQorCitzdGF0aWMgdm9pZCB6eW5xbXBfZHBfc2V0KHZvaWQgX19pb21l bSAqYmFzZSwgaW50IG9mZnNldCwgdTMyIHNldCkKK3sKKwl6eW5xbXBfZHBfd3JpdGUoYmFzZSwg b2Zmc2V0LCB6eW5xbXBfZHBfcmVhZChiYXNlLCBvZmZzZXQpIHwgc2V0KTsKK30KKworLyoKKyAq IEludGVybmFsIGZ1bmN0aW9uczogdXNlZCBieSB6eW5xbXBfZGlzcC5jCisgKi8KKworLyoqCisg KiB6eW5xbXBfZHBfdXBkYXRlX2JwcCAtIFVwZGF0ZSB0aGUgY3VycmVudCBicHAgY29uZmlnCisg KiBAZHA6IERpc3BsYXlQb3J0IElQIGNvcmUgc3RydWN0dXJlCisgKgorICogVXBkYXRlIHRoZSBj dXJyZW50IGJwcCBiYXNlZCBvbiB0aGUgY29sb3IgZm9ybWF0OiBicGMgJiBudW1fY29sb3JzLgor ICogQW55IGZ1bmN0aW9uIHRoYXQgY2hhbmdlcyBicGMgb3IgbnVtX2NvbG9ycyBzaG91bGQgY2Fs bCB0aGlzCisgKiB0byBrZWVwIHRoZSBicHAgdmFsdWUgaW4gc3luYy4KKyAqLworc3RhdGljIHZv aWQgenlucW1wX2RwX3VwZGF0ZV9icHAoc3RydWN0IHp5bnFtcF9kcCAqZHApCit7CisJc3RydWN0 IHp5bnFtcF9kcF9jb25maWcgKmNvbmZpZyA9ICZkcC0+Y29uZmlnOworCisJY29uZmlnLT5icHAg PSBkcC0+Y29uZmlnLmJwYyAqIGRwLT5jb25maWcubnVtX2NvbG9yczsKK30KKworLyoqCisgKiB6 eW5xbXBfZHBfc2V0X2NvbG9yIC0gU2V0IHRoZSBjb2xvcgorICogQGRwOiBEaXNwbGF5UG9ydCBJ UCBjb3JlIHN0cnVjdHVyZQorICogQGNvbG9yOiBjb2xvciBzdHJpbmcsIGZyb20genlucW1wX2Rp c3BfY29sb3JfZW51bQorICoKKyAqIFVwZGF0ZSBtaXNjIHJlZ2lzdGVyIHZhbHVlcyBiYXNlZCBv biBAY29sb3Igc3RyaW5nLgorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBvciAtRUlOVkFM LgorICovCitpbnQgenlucW1wX2RwX3NldF9jb2xvcihzdHJ1Y3QgenlucW1wX2RwICpkcCwgY29u c3QgY2hhciAqY29sb3IpCit7CisJc3RydWN0IHp5bnFtcF9kcF9jb25maWcgKmNvbmZpZyA9ICZk cC0+Y29uZmlnOworCisJY29uZmlnLT5taXNjMCAmPSB+WllOUU1QX0RQX01JU0MwX0ZPUk1BVF9N QVNLOworCWNvbmZpZy0+bWlzYzEgJj0gflpZTlFNUF9EUF9NSVNDMV9ZX09OTFk7CisJaWYgKHN0 cmNtcChjb2xvciwgInJnYiIpID09IDApIHsKKwkJY29uZmlnLT5taXNjMCB8PSBaWU5RTVBfRFBf TUlTQzBfUkdCOworCQljb25maWctPm51bV9jb2xvcnMgPSAzOworCX0gZWxzZSBpZiAoc3RyY21w KGNvbG9yLCAieWNyY2I0MjIiKSA9PSAwKSB7CisJCWNvbmZpZy0+bWlzYzAgfD0gWllOUU1QX0RQ X01JU0MwX1lDUkNCXzQyMjsKKwkJY29uZmlnLT5udW1fY29sb3JzID0gMjsKKwl9IGVsc2UgaWYg KHN0cmNtcChjb2xvciwgInljcmNiNDQ0IikgPT0gMCkgeworCQljb25maWctPm1pc2MwIHw9IFpZ TlFNUF9EUF9NSVNDMF9ZQ1JDQl80NDQ7CisJCWNvbmZpZy0+bnVtX2NvbG9ycyA9IDM7CisJfSBl bHNlIGlmIChzdHJjbXAoY29sb3IsICJ5b25seSIpID09IDApIHsKKwkJY29uZmlnLT5taXNjMSB8 PSBaWU5RTVBfRFBfTUlTQzFfWV9PTkxZOworCQljb25maWctPm51bV9jb2xvcnMgPSAxOworCX0g ZWxzZSB7CisJCWRldl9lcnIoZHAtPmRldiwgIkludmFsaWQgY29sb3JtZXRyeSBpbiBEVFxuIik7 CisJCXJldHVybiAtRUlOVkFMOworCX0KKwl6eW5xbXBfZHBfdXBkYXRlX2JwcChkcCk7CisKKwly ZXR1cm4gMDsKK30KKworLyoqCisgKiB6eW5xbXBfZHBfZW5hYmxlX3ZibGFuayAtIEVuYWJsZSB2 YmxhbmsKKyAqIEBkcDogRGlzcGxheVBvcnQgSVAgY29yZSBzdHJ1Y3R1cmUKKyAqCisgKiBFbmFi bGUgdmJsYW5rIGludGVycnVwdAorICovCit2b2lkIHp5bnFtcF9kcF9lbmFibGVfdmJsYW5rKHN0 cnVjdCB6eW5xbXBfZHAgKmRwKQoreworCXp5bnFtcF9kcF93cml0ZShkcC0+aW9tZW0sIFpZTlFN UF9EUF9TVUJfVFhfSU5UUl9FTiwKKwkJCVpZTlFNUF9EUF9UWF9JTlRSX1ZCTEFOS19TVEFSVCk7 Cit9CisKKy8qKgorICogenlucW1wX2RwX2Rpc2FibGVfdmJsYW5rIC0gRGlzYWJsZSB2YmxhbmsK KyAqIEBkcDogRGlzcGxheVBvcnQgSVAgY29yZSBzdHJ1Y3R1cmUKKyAqCisgKiBEaXNhYmxlIHZi bGFuayBpbnRlcnJ1cHQKKyAqLwordm9pZCB6eW5xbXBfZHBfZGlzYWJsZV92Ymxhbmsoc3RydWN0 IHp5bnFtcF9kcCAqZHApCit7CisJenlucW1wX2RwX3dyaXRlKGRwLT5pb21lbSwgWllOUU1QX0RQ X1NVQl9UWF9JTlRSX0RTLAorCQkJWllOUU1QX0RQX1RYX0lOVFJfVkJMQU5LX1NUQVJUKTsKK30K KworLyoKKyAqIERQIFBIWSBmdW5jdGlvbnMKKyAqLworCisvKioKKyAqIHp5bnFtcF9kcF9pbml0 X3BoeSAtIEluaXRpYWxpemUgdGhlIHBoeQorICogQGRwOiBEaXNwbGF5UG9ydCBJUCBjb3JlIHN0 cnVjdHVyZQorICoKKyAqIEluaXRpYWxpemUgdGhlIHBoeS4KKyAqCisgKiBSZXR1cm46IDAgaWYg dGhlIHBoeSBpbnN0YW5jZXMgYXJlIGluaXRpYWxpemVkIGNvcnJlY3RseSwgb3IgdGhlIGVycm9y IGNvZGUKKyAqIHJldHVybmVkIGZyb20gdGhlIGNhbGxlZSBmdW5jdGlvbnMuCisgKi8KK3N0YXRp YyBpbnQgenlucW1wX2RwX2luaXRfcGh5KHN0cnVjdCB6eW5xbXBfZHAgKmRwKQoreworCXVuc2ln bmVkIGludCBpOworCWludCByZXQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgZHAtPm51bV9sYW5lczsg aSsrKSB7CisJCXJldCA9IHBoeV9pbml0KGRwLT5waHlbaV0pOworCQlpZiAocmV0KSB7CisJCQlk ZXZfZXJyKGRwLT5kZXYsICJmYWlsZWQgdG8gaW5pdCBwaHkgbGFuZSAlZFxuIiwgaSk7CisJCQly ZXR1cm4gcmV0OworCQl9CisJfQorCisJenlucW1wX2RwX3dyaXRlKGRwLT5pb21lbSwgWllOUU1Q X0RQX1NVQl9UWF9JTlRSX0RTLAorCQkJWllOUU1QX0RQX1RYX0lOVFJfQUxMKTsKKwl6eW5xbXBf ZHBfY2xyKGRwLT5pb21lbSwgWllOUU1QX0RQX1RYX1BIWV9DT05GSUcsCisJCSAgICAgIFpZTlFN UF9EUF9UWF9QSFlfQ09ORklHX0FMTF9SRVNFVCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisg KiB6eW5xbXBfZHBfZXhpdF9waHkgLSBFeGl0IHRoZSBwaHkKKyAqIEBkcDogRGlzcGxheVBvcnQg SVAgY29yZSBzdHJ1Y3R1cmUKKyAqCisgKiBFeGl0IHRoZSBwaHkuCisgKi8KK3N0YXRpYyB2b2lk IHp5bnFtcF9kcF9leGl0X3BoeShzdHJ1Y3QgenlucW1wX2RwICpkcCkKK3sKKwl1bnNpZ25lZCBp bnQgaTsKKwlpbnQgcmV0OworCisJZm9yIChpID0gMDsgaSA8IGRwLT5udW1fbGFuZXM7IGkrKykg eworCQlyZXQgPSBwaHlfZXhpdChkcC0+cGh5W2ldKTsKKwkJaWYgKHJldCkKKwkJCWRldl9lcnIo ZHAtPmRldiwgImZhaWxlZCB0byBleGl0IHBoeSglZCkgJWRcbiIsIGksIHJldCk7CisJfQorfQor CisvKioKKyAqIHp5bnFtcF9kcF9waHlfcmVhZHkgLSBDaGVjayBpZiBQSFkgaXMgcmVhZHkKKyAq IEBkcDogRGlzcGxheVBvcnQgSVAgY29yZSBzdHJ1Y3R1cmUKKyAqCisgKiBDaGVjayBpZiBQSFkg aXMgcmVhZHkuIElmIFBIWSBpcyBub3QgcmVhZHksIHdhaXQgMW1zIHRvIGNoZWNrIGZvciAxMDAg dGltZXMuCisgKiBUaGlzIGFtb3VudCBvZiBkZWxheSB3YXMgc3VnZ2VzdGVkIGJ5IElQIGRlc2ln bmVyLgorICoKKyAqIFJldHVybjogMCBpZiBQSFkgaXMgcmVhZHksIG9yIC1FTk9ERVYgaWYgUEhZ IGlzIG5vdCByZWFkeS4KKyAqLworc3RhdGljIGludCB6eW5xbXBfZHBfcGh5X3JlYWR5KHN0cnVj dCB6eW5xbXBfZHAgKmRwKQoreworCXUzMiBpLCByZWcsIHJlYWR5OworCisJcmVhZHkgPSAoMSA8 PCBkcC0+bnVtX2xhbmVzKSAtIDE7CisKKwkvKiBXYWl0IGZvciAxMDAgKiAxbXMuIFRoaXMgc2hv dWxkIGJlIGVub3VnaCB0aW1lIGZvciBQSFkgdG8gYmUgcmVhZHkgKi8KKwlmb3IgKGkgPSAwOyA7 IGkrKykgeworCQlyZWcgPSB6eW5xbXBfZHBfcmVhZChkcC0+aW9tZW0sIFpZTlFNUF9EUF9UWF9Q SFlfU1RBVFVTKTsKKwkJaWYgKChyZWcgJiByZWFkeSkgPT0gcmVhZHkpCisJCQlyZXR1cm4gMDsK KworCQlpZiAoaSA9PSAxMDApIHsKKwkJCWRldl9lcnIoZHAtPmRldiwgIlBIWSBpc24ndCByZWFk eVxuIik7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCisJCXVzbGVlcF9yYW5nZSgxMDAwLCAx MTAwKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIERQIGZ1bmN0aW9ucworICovCisK Ky8qKgorICogenlucW1wX2RwX21heF9yYXRlIC0gQ2FsY3VsYXRlIGFuZCByZXR1cm4gYXZhaWxh YmxlIG1heCBwaXhlbCBjbG9jaworICogQGxpbmtfcmF0ZTogbGluayByYXRlIChLaWxvLWJ5dGVz IC8gc2VjKQorICogQGxhbmVfbnVtOiBudW1iZXIgb2YgbGFuZXMKKyAqIEBicHA6IGJpdHMgcGVy IHBpeGVsCisgKgorICogUmV0dXJuOiBtYXggcGl4ZWwgY2xvY2sgKEtIeikgc3VwcG9ydGVkIGJ5 IGN1cnJlbnQgbGluayBjb25maWcuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHp5bnFtcF9kcF9t YXhfcmF0ZShpbnQgbGlua19yYXRlLCB1OCBsYW5lX251bSwgdTggYnBwKQoreworCXJldHVybiBs aW5rX3JhdGUgKiBsYW5lX251bSAqIDggLyBicHA7Cit9CisKKy8qKgorICogenlucW1wX2RwX21v ZGVfY29uZmlndXJlIC0gQ29uZmlndXJlIHRoZSBsaW5rIHZhbHVlcworICogQGRwOiBEaXNwbGF5 UG9ydCBJUCBjb3JlIHN0cnVjdHVyZQorICogQHBjbG9jazogcGl4ZWwgY2xvY2sgZm9yIHJlcXVl c3RlZCBkaXNwbGF5IG1vZGUKKyAqIEBjdXJyZW50X2J3OiBjdXJyZW50IGxpbmsgcmF0ZQorICoK KyAqIEZpbmQgdGhlIGxpbmsgY29uZmlndXJhdGlvbiB2YWx1ZXMsIHJhdGUgYW5kIGxhbmUgY291 bnQgZm9yIHJlcXVlc3RlZCBwaXhlbAorICogY2xvY2sgQHBjbG9jay4gVGhlIEBwY2xvY2sgaXMg c3RvcmVkIGluIHRoZSBtb2RlIHRvIGJlIHVzZWQgaW4gb3RoZXIKKyAqIGZ1bmN0aW9ucyBsYXRl ci4gVGhlIHJldHVybmVkIHJhdGUgaXMgZG93bnNoaWZ0ZWQgZnJvbSB0aGUgY3VycmVudCByYXRl CisgKiBAY3VycmVudF9idy4KKyAqCisgKiBSZXR1cm46IEN1cnJlbnQgbGluayByYXRlIGNvZGUs IG9yIC1FSU5WQUwuCisgKi8KK3N0YXRpYyBpbnQgenlucW1wX2RwX21vZGVfY29uZmlndXJlKHN0 cnVjdCB6eW5xbXBfZHAgKmRwLCBpbnQgcGNsb2NrLAorCQkJCSAgICB1OCBjdXJyZW50X2J3KQor eworCWludCBtYXhfcmF0ZSA9IGRwLT5saW5rX2NvbmZpZy5tYXhfcmF0ZTsKKwl1OCBid3NbM10g PSB7IERQX0xJTktfQldfMV82MiwgRFBfTElOS19CV18yXzcsIERQX0xJTktfQldfNV80IH07CisJ dTggbWF4X2xhbmVzID0gZHAtPmxpbmtfY29uZmlnLm1heF9sYW5lczsKKwl1OCBtYXhfbGlua19y YXRlX2NvZGUgPSBkcm1fZHBfbGlua19yYXRlX3RvX2J3X2NvZGUobWF4X3JhdGUpOworCXU4IGJw cCA9IGRwLT5jb25maWcuYnBwOworCXU4IGxhbmVfY250OworCXM4IGk7CisKKwlpZiAoY3VycmVu dF9idyA9PSBEUF9MSU5LX0JXXzFfNjIpIHsKKwkJZGV2X2VycihkcC0+ZGV2LCAiY2FuJ3QgZG93 bnNoaWZ0LiBhbHJlYWR5IGxvd2VzdCBsaW5rIHJhdGVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsK Kwl9CisKKwlmb3IgKGkgPSBBUlJBWV9TSVpFKGJ3cykgLSAxOyBpID49IDA7IGktLSkgeworCQlp ZiAoY3VycmVudF9idyAmJiBid3NbaV0gPj0gY3VycmVudF9idykKKwkJCWNvbnRpbnVlOworCisJ CWlmIChid3NbaV0gPD0gbWF4X2xpbmtfcmF0ZV9jb2RlKQorCQkJYnJlYWs7CisJfQorCisJZm9y IChsYW5lX2NudCA9IDE7IGxhbmVfY250IDw9IG1heF9sYW5lczsgbGFuZV9jbnQgPDw9IDEpIHsK KwkJaW50IGJ3OworCQl1MzIgcmF0ZTsKKworCQlidyA9IGRybV9kcF9id19jb2RlX3RvX2xpbmtf cmF0ZShid3NbaV0pOworCQlyYXRlID0genlucW1wX2RwX21heF9yYXRlKGJ3LCBsYW5lX2NudCwg YnBwKTsKKwkJaWYgKHBjbG9jayA8PSByYXRlKSB7CisJCQlkcC0+bW9kZS5id19jb2RlID0gYndz W2ldOworCQkJZHAtPm1vZGUubGFuZV9jbnQgPSBsYW5lX2NudDsKKwkJCWRwLT5tb2RlLnBjbG9j ayA9IHBjbG9jazsKKwkJCXJldHVybiBkcC0+bW9kZS5id19jb2RlOworCQl9CisJfQorCisJZGV2 X2VycihkcC0+ZGV2LCAiZmFpbGVkIHRvIGNvbmZpZ3VyZSBsaW5rIHZhbHVlc1xuIik7CisKKwly ZXR1cm4gLUVJTlZBTDsKK30KKworLyoqCisgKiB6eW5xbXBfZHBfYWRqdXN0X3RyYWluIC0gQWRq dXN0IHRyYWluIHZhbHVlcworICogQGRwOiBEaXNwbGF5UG9ydCBJUCBjb3JlIHN0cnVjdHVyZQor ICogQGxpbmtfc3RhdHVzOiBsaW5rIHN0YXR1cyBmcm9tIHNpbmsgd2hpY2ggY29udGFpbnMgcmVx dWVzdGVkIHRyYWluaW5nIHZhbHVlcworICovCitzdGF0aWMgdm9pZCB6eW5xbXBfZHBfYWRqdXN0 X3RyYWluKHN0cnVjdCB6eW5xbXBfZHAgKmRwLAorCQkJCSAgIHU4IGxpbmtfc3RhdHVzW0RQX0xJ TktfU1RBVFVTX1NJWkVdKQoreworCXU4ICp0cmFpbl9zZXQgPSBkcC0+dHJhaW5fc2V0OworCXU4 IHZvbHRhZ2UgPSAwLCBwcmVlbXBoYXNpcyA9IDA7CisJdTggaTsKKworCWZvciAoaSA9IDA7IGkg PCBkcC0+bW9kZS5sYW5lX2NudDsgaSsrKSB7CisJCXU4IHYgPSBkcm1fZHBfZ2V0X2FkanVzdF9y ZXF1ZXN0X3ZvbHRhZ2UobGlua19zdGF0dXMsIGkpOworCQl1OCBwID0gZHJtX2RwX2dldF9hZGp1 c3RfcmVxdWVzdF9wcmVfZW1waGFzaXMobGlua19zdGF0dXMsIGkpOworCisJCWlmICh2ID4gdm9s dGFnZSkKKwkJCXZvbHRhZ2UgPSB2OworCisJCWlmIChwID4gcHJlZW1waGFzaXMpCisJCQlwcmVl bXBoYXNpcyA9IHA7CisJfQorCisJaWYgKHZvbHRhZ2UgPj0gRFBfVFJBSU5fVk9MVEFHRV9TV0lO R19MRVZFTF8zKQorCQl2b2x0YWdlIHw9IERQX1RSQUlOX01BWF9TV0lOR19SRUFDSEVEOworCisJ aWYgKHByZWVtcGhhc2lzID49IERQX1RSQUlOX1BSRV9FTVBIX0xFVkVMXzIpCisJCXByZWVtcGhh c2lzIHw9IERQX1RSQUlOX01BWF9QUkVfRU1QSEFTSVNfUkVBQ0hFRDsKKworCWZvciAoaSA9IDA7 IGkgPCBkcC0+bW9kZS5sYW5lX2NudDsgaSsrKQorCQl0cmFpbl9zZXRbaV0gPSB2b2x0YWdlIHwg cHJlZW1waGFzaXM7Cit9CisKKy8qKgorICogenlucW1wX2RwX3VwZGF0ZV92c19lbXBoIC0gVXBk YXRlIHRoZSB0cmFpbmluZyB2YWx1ZXMKKyAqIEBkcDogRGlzcGxheVBvcnQgSVAgY29yZSBzdHJ1 Y3R1cmUKKyAqCisgKiBVcGRhdGUgdGhlIHRyYWluaW5nIHZhbHVlcyBiYXNlZCBvbiB0aGUgcmVx dWVzdCBmcm9tIHNpbmsuIFRoZSBtYXBwZWQgdmFsdWVzCisgKiBhcmUgcHJlZGVmaW5lZCwgYW5k IHZhbHVlcyh2cywgcGUsIHBjKSBhcmUgZnJvbSB0aGUgZGV2aWNlIG1hbnVhbC4KKyAqCisgKiBS ZXR1cm46IDAgaWYgdnMgYW5kIGVtcGggYXJlIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5LCBvciB0aGUg ZXJyb3IgY29kZSByZXR1cm5lZAorICogYnkgZHJtX2RwX2RwY2Rfd3JpdGUoKS4KKyAqLworc3Rh dGljIGludCB6eW5xbXBfZHBfdXBkYXRlX3ZzX2VtcGgoc3RydWN0IHp5bnFtcF9kcCAqZHApCit7 CisJdTggKnRyYWluX3NldCA9IGRwLT50cmFpbl9zZXQ7CisJdTggaSwgdl9sZXZlbCwgcF9sZXZl bDsKKwlpbnQgcmV0OworCisJcmV0ID0gZHJtX2RwX2RwY2Rfd3JpdGUoJmRwLT5hdXgsIERQX1RS QUlOSU5HX0xBTkUwX1NFVCwgdHJhaW5fc2V0LAorCQkJCWRwLT5tb2RlLmxhbmVfY250KTsKKwlp ZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWZvciAoaSA9IDA7IGkgPCBkcC0+bW9kZS5s YW5lX2NudDsgaSsrKSB7CisJCXUzMiByZWcgPSBaWU5RTVBfRFBfU1VCX1RYX1BIWV9QUkVDVVJT T1JfTEFORV8wICsgaSAqIDQ7CisKKwkJdl9sZXZlbCA9ICh0cmFpbl9zZXRbaV0gJiBEUF9UUkFJ Tl9WT0xUQUdFX1NXSU5HX01BU0spID4+CisJCQkgIERQX1RSQUlOX1ZPTFRBR0VfU1dJTkdfU0hJ RlQ7CisJCXBfbGV2ZWwgPSAodHJhaW5fc2V0W2ldICYgRFBfVFJBSU5fUFJFX0VNUEhBU0lTX01B U0spID4+CisJCQkgIERQX1RSQUlOX1BSRV9FTVBIQVNJU19TSElGVDsKKworCQl6eW5xbXBfZHBf d3JpdGUoZHAtPmlvbWVtLCByZWcsIDB4Mik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgor ICogenlucW1wX2RwX2xpbmtfdHJhaW5fY3IgLSBUcmFpbiBjbG9jayByZWNvdmVyeQorICogQGRw OiBEaXNwbGF5UG9ydCBJUCBjb3JlIHN0cnVjdHVyZQorICoKKyAqIFJldHVybjogMCBpZiBjbG9j ayByZWNvdmVyeSB0cmFpbiBpcyBkb25lIHN1Y2Nlc3NmdWxseSwgb3IgY29ycmVzcG9uZGluZwor ICogZXJyb3IgY29kZS4KKyAqLworc3RhdGljIGludCB6eW5xbXBfZHBfbGlua190cmFpbl9jcihz dHJ1Y3QgenlucW1wX2RwICpkcCkKK3sKKwl1OCBsaW5rX3N0YXR1c1tEUF9MSU5LX1NUQVRVU19T SVpFXTsKKwl1OCBsYW5lX2NudCA9IGRwLT5tb2RlLmxhbmVfY250OworCXU4IHZzID0gMCwgdHJp ZXMgPSAwOworCXUxNiBtYXhfdHJpZXMsIGk7CisJYm9vbCBjcl9kb25lOworCWludCByZXQ7CisK Kwl6eW5xbXBfZHBfd3JpdGUoZHAtPmlvbWVtLCBaWU5RTVBfRFBfVFhfVFJBSU5JTkdfUEFUVEVS Tl9TRVQsCisJCQlEUF9UUkFJTklOR19QQVRURVJOXzEpOworCXJldCA9IGRybV9kcF9kcGNkX3dy aXRlYigmZHAtPmF1eCwgRFBfVFJBSU5JTkdfUEFUVEVSTl9TRVQsCisJCQkJIERQX1RSQUlOSU5H X1BBVFRFUk5fMSB8CisJCQkJIERQX0xJTktfU0NSQU1CTElOR19ESVNBQkxFKTsKKwlpZiAocmV0 IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qCisJICogMjU2IGxvb3BzIHNob3VsZCBiZSBtYXhp bXVtIGl0ZXJhdGlvbnMgZm9yIDQgbGFuZXMgYW5kIDQgdmFsdWVzLgorCSAqIFNvLCBUaGlzIGxv b3Agc2hvdWxkIGV4aXQgYmVmb3JlIDUxMiBpdGVyYXRpb25zCisJICovCisJZm9yIChtYXhfdHJp ZXMgPSAwOyBtYXhfdHJpZXMgPCA1MTI7IG1heF90cmllcysrKSB7CisJCXJldCA9IHp5bnFtcF9k cF91cGRhdGVfdnNfZW1waChkcCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCWRy bV9kcF9saW5rX3RyYWluX2Nsb2NrX3JlY292ZXJ5X2RlbGF5KGRwLT5kcGNkKTsKKwkJcmV0ID0g ZHJtX2RwX2RwY2RfcmVhZF9saW5rX3N0YXR1cygmZHAtPmF1eCwgbGlua19zdGF0dXMpOworCQlp ZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisKKwkJY3JfZG9uZSA9IGRybV9kcF9jbG9ja19y ZWNvdmVyeV9vayhsaW5rX3N0YXR1cywgbGFuZV9jbnQpOworCQlpZiAoY3JfZG9uZSkKKwkJCWJy ZWFrOworCisJCWZvciAoaSA9IDA7IGkgPCBsYW5lX2NudDsgaSsrKQorCQkJaWYgKCEoZHAtPnRy YWluX3NldFtpXSAmIERQX1RSQUlOX01BWF9TV0lOR19SRUFDSEVEKSkKKwkJCQlicmVhazsKKwkJ aWYgKGkgPT0gbGFuZV9jbnQpCisJCQlicmVhazsKKworCQlpZiAoKGRwLT50cmFpbl9zZXRbMF0g JiBEUF9UUkFJTl9WT0xUQUdFX1NXSU5HX01BU0spID09IHZzKQorCQkJdHJpZXMrKzsKKwkJZWxz ZQorCQkJdHJpZXMgPSAwOworCisJCWlmICh0cmllcyA9PSBEUF9NQVhfVFJBSU5JTkdfVFJJRVMp CisJCQlicmVhazsKKworCQl2cyA9IGRwLT50cmFpbl9zZXRbMF0gJiBEUF9UUkFJTl9WT0xUQUdF X1NXSU5HX01BU0s7CisJCXp5bnFtcF9kcF9hZGp1c3RfdHJhaW4oZHAsIGxpbmtfc3RhdHVzKTsK Kwl9CisKKwlpZiAoIWNyX2RvbmUpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIDA7Cit9CisK Ky8qKgorICogenlucW1wX2RwX2xpbmtfdHJhaW5fY2UgLSBUcmFpbiBjaGFubmVsIGVxdWFsaXph dGlvbgorICogQGRwOiBEaXNwbGF5UG9ydCBJUCBjb3JlIHN0cnVjdHVyZQorICoKKyAqIFJldHVy bjogMCBpZiBjaGFubmVsIGVxdWFsaXphdGlvbiB0cmFpbiBpcyBkb25lIHN1Y2Nlc3NmdWxseSwg b3IKKyAqIGNvcnJlc3BvbmRpbmcgZXJyb3IgY29kZS4KKyAqLworc3RhdGljIGludCB6eW5xbXBf ZHBfbGlua190cmFpbl9jZShzdHJ1Y3QgenlucW1wX2RwICpkcCkKK3sKKwl1OCBsaW5rX3N0YXR1 c1tEUF9MSU5LX1NUQVRVU19TSVpFXTsKKwl1OCBsYW5lX2NudCA9IGRwLT5tb2RlLmxhbmVfY250 OworCXUzMiBwYXQsIHRyaWVzOworCWludCByZXQ7CisJYm9vbCBjZV9kb25lOworCisJaWYgKGRw LT5kcGNkW0RQX0RQQ0RfUkVWXSA+PSBEUF9WMV8yICYmCisJICAgIGRwLT5kcGNkW0RQX01BWF9M QU5FX0NPVU5UXSAmIERQX1RQUzNfU1VQUE9SVEVEKQorCQlwYXQgPSBEUF9UUkFJTklOR19QQVRU RVJOXzM7CisJZWxzZQorCQlwYXQgPSBEUF9UUkFJTklOR19QQVRURVJOXzI7CisKKwl6eW5xbXBf ZHBfd3JpdGUoZHAtPmlvbWVtLCBaWU5RTVBfRFBfVFhfVFJBSU5JTkdfUEFUVEVSTl9TRVQsIHBh dCk7CisJcmV0ID0gZHJtX2RwX2RwY2Rfd3JpdGViKCZkcC0+YXV4LCBEUF9UUkFJTklOR19QQVRU RVJOX1NFVCwKKwkJCQkgcGF0IHwgRFBfTElOS19TQ1JBTUJMSU5HX0RJU0FCTEUpOworCWlmIChy ZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJZm9yICh0cmllcyA9IDA7IHRyaWVzIDwgRFBfTUFY X1RSQUlOSU5HX1RSSUVTOyB0cmllcysrKSB7CisJCXJldCA9IHp5bnFtcF9kcF91cGRhdGVfdnNf ZW1waChkcCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCWRybV9kcF9saW5rX3Ry YWluX2NoYW5uZWxfZXFfZGVsYXkoZHAtPmRwY2QpOworCQlyZXQgPSBkcm1fZHBfZHBjZF9yZWFk X2xpbmtfc3RhdHVzKCZkcC0+YXV4LCBsaW5rX3N0YXR1cyk7CisJCWlmIChyZXQgPCAwKQorCQkJ cmV0dXJuIHJldDsKKworCQljZV9kb25lID0gZHJtX2RwX2NoYW5uZWxfZXFfb2sobGlua19zdGF0 dXMsIGxhbmVfY250KTsKKwkJaWYgKGNlX2RvbmUpCisJCQlicmVhazsKKworCQl6eW5xbXBfZHBf YWRqdXN0X3RyYWluKGRwLCBsaW5rX3N0YXR1cyk7CisJfQorCisJaWYgKCFjZV9kb25lKQorCQly ZXR1cm4gLUVJTzsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIHp5bnFtcF9kcF9saW5rX3Ry YWluIC0gVHJhaW4gdGhlIGxpbmsKKyAqIEBkcDogRGlzcGxheVBvcnQgSVAgY29yZSBzdHJ1Y3R1 cmUKKyAqCisgKiBSZXR1cm46IDAgaWYgYWxsIHRyYWlucyBhcmUgZG9uZSBzdWNjZXNzZnVsbHks IG9yIGNvcnJlc3BvbmRpbmcgZXJyb3IgY29kZS4KKyAqLworc3RhdGljIGludCB6eW5xbXBfZHBf dHJhaW4oc3RydWN0IHp5bnFtcF9kcCAqZHApCit7CisJdTMyIHJlZzsKKwl1OCBid19jb2RlID0g ZHAtPm1vZGUuYndfY29kZTsKKwl1OCBsYW5lX2NudCA9IGRwLT5tb2RlLmxhbmVfY250OworCXU4 IGF1eF9sYW5lX2NudCA9IGxhbmVfY250OworCWJvb2wgZW5oYW5jZWQ7CisJaW50IHJldDsKKwor CXp5bnFtcF9kcF93cml0ZShkcC0+aW9tZW0sIFpZTlFNUF9EUF9UWF9MQU5FX0NOVF9TRVQsIGxh bmVfY250KTsKKwllbmhhbmNlZCA9IGRybV9kcF9lbmhhbmNlZF9mcmFtZV9jYXAoZHAtPmRwY2Qp OworCWlmIChlbmhhbmNlZCkgeworCQl6eW5xbXBfZHBfd3JpdGUoZHAtPmlvbWVtLCBaWU5RTVBf RFBfVFhfRU5IQU5DRURfRlJBTUVfRU4sIDEpOworCQlhdXhfbGFuZV9jbnQgfD0gRFBfTEFORV9D T1VOVF9FTkhBTkNFRF9GUkFNRV9FTjsKKwl9CisKKwlpZiAoZHAtPmRwY2RbM10gJiAweDEpIHsK KwkJenlucW1wX2RwX3dyaXRlKGRwLT5pb21lbSwgWllOUU1QX0RQX1RYX0RPV05TUFJFQURfQ1RM LCAxKTsKKwkJZHJtX2RwX2RwY2Rfd3JpdGViKCZkcC0+YXV4LCBEUF9ET1dOU1BSRUFEX0NUUkws CisJCQkJICAgRFBfU1BSRUFEX0FNUF8wXzUpOworCX0gZWxzZSB7CisJCXp5bnFtcF9kcF93cml0 ZShkcC0+aW9tZW0sIFpZTlFNUF9EUF9UWF9ET1dOU1BSRUFEX0NUTCwgMCk7CisJCWRybV9kcF9k cGNkX3dyaXRlYigmZHAtPmF1eCwgRFBfRE9XTlNQUkVBRF9DVFJMLCAwKTsKKwl9CisKKwlyZXQg PSBkcm1fZHBfZHBjZF93cml0ZWIoJmRwLT5hdXgsIERQX0xBTkVfQ09VTlRfU0VULCBhdXhfbGFu ZV9jbnQpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZHAtPmRldiwgImZhaWxlZCB0byBz ZXQgbGFuZSBjb3VudFxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gZHJtX2RwX2Rw Y2Rfd3JpdGViKCZkcC0+YXV4LCBEUF9NQUlOX0xJTktfQ0hBTk5FTF9DT0RJTkdfU0VULAorCQkJ CSBEUF9TRVRfQU5TSV84QjEwQik7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihkcC0+ZGV2 LCAiZmFpbGVkIHRvIHNldCBBTlNJIDhCLzEwQiBlbmNvZGluZ1xuIik7CisJCXJldHVybiByZXQ7 CisJfQorCisJcmV0ID0gZHJtX2RwX2RwY2Rfd3JpdGViKCZkcC0+YXV4LCBEUF9MSU5LX0JXX1NF VCwgYndfY29kZSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihkcC0+ZGV2LCAiZmFpbGVk IHRvIHNldCBEUCBiYW5kd2lkdGhcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXp5bnFtcF9k cF93cml0ZShkcC0+aW9tZW0sIFpZTlFNUF9EUF9UWF9MSU5LX0JXX1NFVCwgYndfY29kZSk7CisJ c3dpdGNoIChid19jb2RlKSB7CisJY2FzZSBEUF9MSU5LX0JXXzFfNjI6CisJCXJlZyA9IFpZTlFN UF9EUF9UWF9QSFlfQ0xPQ0tfRkVFREJBQ0tfU0VUVElOR18xNjI7CisJCWJyZWFrOworCWNhc2Ug RFBfTElOS19CV18yXzc6CisJCXJlZyA9IFpZTlFNUF9EUF9UWF9QSFlfQ0xPQ0tfRkVFREJBQ0tf U0VUVElOR18yNzA7CisJCWJyZWFrOworCWNhc2UgRFBfTElOS19CV181XzQ6CisJZGVmYXVsdDoK KwkJcmVnID0gWllOUU1QX0RQX1RYX1BIWV9DTE9DS19GRUVEQkFDS19TRVRUSU5HXzU0MDsKKwkJ YnJlYWs7CisJfQorCisJenlucW1wX2RwX3dyaXRlKGRwLT5pb21lbSwgWllOUU1QX0RQX1RYX1BI WV9DTE9DS19GRUVEQkFDS19TRVRUSU5HLAorCQkJcmVnKTsKKwlyZXQgPSB6eW5xbXBfZHBfcGh5 X3JlYWR5KGRwKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXp5bnFtcF9kcF93 cml0ZShkcC0+aW9tZW0sIFpZTlFNUF9EUF9UWF9TQ1JBTUJMSU5HX0RJU0FCTEUsIDEpOworCW1l bXNldChkcC0+dHJhaW5fc2V0LCAwLCA0KTsKKwlyZXQgPSB6eW5xbXBfZHBfbGlua190cmFpbl9j cihkcCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHp5bnFtcF9kcF9saW5r X3RyYWluX2NlKGRwKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gZHJtX2Rw X2RwY2Rfd3JpdGViKCZkcC0+YXV4LCBEUF9UUkFJTklOR19QQVRURVJOX1NFVCwKKwkJCQkgRFBf VFJBSU5JTkdfUEFUVEVSTl9ESVNBQkxFKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGRw LT5kZXYsICJmYWlsZWQgdG8gZGlzYWJsZSB0cmFpbmluZyBwYXR0ZXJuXG4iKTsKKwkJcmV0dXJu IHJldDsKKwl9CisJenlucW1wX2RwX3dyaXRlKGRwLT5pb21lbSwgWllOUU1QX0RQX1RYX1RSQUlO SU5HX1BBVFRFUk5fU0VULAorCQkJRFBfVFJBSU5JTkdfUEFUVEVSTl9ESVNBQkxFKTsKKworCXp5 bnFtcF9kcF93cml0ZShkcC0+aW9tZW0sIFpZTlFNUF9EUF9UWF9TQ1JBTUJMSU5HX0RJU0FCTEUs IDApOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogenlucW1wX2RwX3RyYWluX2xvb3AgLSBE b3duc2hpZnQgdGhlIGxpbmsgcmF0ZSBkdXJpbmcgdHJhaW5pbmcKKyAqIEBkcDogRGlzcGxheVBv cnQgSVAgY29yZSBzdHJ1Y3R1cmUKKyAqCisgKiBUcmFpbiB0aGUgbGluayBieSBkb3duc2hpZnRp bmcgdGhlIGxpbmsgcmF0ZSBpZiB0cmFpbmluZyBpcyBub3Qgc3VjY2Vzc2Z1bC4KKyAqLworc3Rh dGljIHZvaWQgenlucW1wX2RwX3RyYWluX2xvb3Aoc3RydWN0IHp5bnFtcF9kcCAqZHApCit7CisJ c3RydWN0IHp5bnFtcF9kcF9tb2RlICptb2RlID0gJmRwLT5tb2RlOworCXU4IGJ3ID0gbW9kZS0+ YndfY29kZTsKKwlpbnQgcmV0OworCisJZG8geworCQlpZiAoZHAtPnN0YXR1cyA9PSBjb25uZWN0 b3Jfc3RhdHVzX2Rpc2Nvbm5lY3RlZCB8fAorCQkgICAgIWRwLT5lbmFibGVkKQorCQkJcmV0dXJu OworCisJCXJldCA9IHp5bnFtcF9kcF90cmFpbihkcCk7CisJCWlmICghcmV0KQorCQkJcmV0dXJu OworCisJCXJldCA9IHp5bnFtcF9kcF9tb2RlX2NvbmZpZ3VyZShkcCwgbW9kZS0+cGNsb2NrLCBi dyk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBlcnJfb3V0OworCisJCWJ3ID0gcmV0OworCX0g d2hpbGUgKGJ3ID49IERQX0xJTktfQldfMV82Mik7CisKK2Vycl9vdXQ6CisJZGV2X2VycihkcC0+ ZGV2LCAiZmFpbGVkIHRvIHRyYWluIHRoZSBEUCBsaW5rXG4iKTsKK30KKworLyoKKyAqIERQIEF1 eCBmdW5jdGlvbnMKKyAqLworCisjZGVmaW5lIEFVWF9SRUFEX0JJVAkweDEKKworLyoqCisgKiB6 eW5xbXBfZHBfYXV4X2NtZF9zdWJtaXQgLSBTdWJtaXQgYXV4IGNvbW1hbmQKKyAqIEBkcDogRGlz cGxheVBvcnQgSVAgY29yZSBzdHJ1Y3R1cmUKKyAqIEBjbWQ6IGF1eCBjb21tYW5kCisgKiBAYWRk cjogYXV4IGFkZHJlc3MKKyAqIEBidWY6IGJ1ZmZlciBmb3IgY29tbWFuZCBkYXRhCisgKiBAYnl0 ZXM6IG51bWJlciBvZiBieXRlcyBmb3IgQGJ1ZgorICogQHJlcGx5OiByZXBseSBjb2RlIHRvIGJl IHJldHVybmVkCisgKgorICogU3VibWl0IGFuIGF1eCBjb21tYW5kLiBBbGwgYXV4IHJlbGF0ZWQg Y29tbWFuZHMsIG5hdGl2ZSBvciBpMmMgYXV4CisgKiByZWFkL3dyaXRlLCBhcmUgc3VibWl0dGVk IHRocm91Z2ggdGhpcyBmdW5jdGlvbi4gVGhlIGZ1bmN0aW9uIGlzIG1hcHBlZCB0bworICogdGhl IHRyYW5zZmVyIGZ1bmN0aW9uIG9mIHN0cnVjdCBkcm1fZHBfYXV4LiBUaGlzIGZ1bmN0aW9uIGlu dm9sdmVzIGluCisgKiBtdWx0aXBsZSByZWdpc3RlciByZWFkcy93cml0ZXMsIHRodXMgc3luY2hy b25pemF0aW9uIGlzIG5lZWRlZCwgYW5kIGl0IGlzCisgKiBkb25lIGJ5IGRybV9kcF9oZWxwZXIg dXNpbmcgQGh3X211dGV4LiBUaGUgY2FsbGluZyB0aHJlYWQgZ29lcyBpbnRvIHNsZWVwCisgKiBp ZiB0aGVyZSdzIG5vIGltbWVkaWF0ZSByZXBseSB0byB0aGUgY29tbWFuZCBzdWJtaXNzaW9uLiBU aGUgcmVwbHkgY29kZSBpcworICogcmV0dXJuZWQgYXQgQHJlcGx5IGlmIEByZXBseSAhPSBOVUxM LgorICoKKyAqIFJldHVybjogMCBpZiB0aGUgY29tbWFuZCBpcyBzdWJtaXR0ZWQgcHJvcGVybHks IG9yIGNvcnJlc3BvbmRpbmcgZXJyb3IgY29kZToKKyAqIC1FQlVTWSB3aGVuIHRoZXJlIGlzIGFu eSByZXF1ZXN0IGFscmVhZHkgYmVpbmcgcHJvY2Vzc2VkCisgKiAtRVRJTUVET1VUIHdoZW4gcmVj ZWl2aW5nIHJlcGx5IGlzIHRpbWVkIG91dAorICogLUVJTyB3aGVuIHJlY2VpdmVkIGJ5dGVzIGFy ZSBsZXNzIHRoYW4gcmVxdWVzdGVkCisgKi8KK3N0YXRpYyBpbnQgenlucW1wX2RwX2F1eF9jbWRf c3VibWl0KHN0cnVjdCB6eW5xbXBfZHAgKmRwLCB1MzIgY21kLCB1MTYgYWRkciwKKwkJCQkgICAg dTggKmJ1ZiwgdTggYnl0ZXMsIHU4ICpyZXBseSkKK3sKKwlib29sIGlzX3JlYWQgPSAoY21kICYg QVVYX1JFQURfQklUKSA/IHRydWUgOiBmYWxzZTsKKwl2b2lkIF9faW9tZW0gKmlvbWVtID0gZHAt PmlvbWVtOworCXUzMiByZWcsIGk7CisKKwlyZWcgPSB6eW5xbXBfZHBfcmVhZChpb21lbSwgWllO UU1QX0RQX1RYX0lOVFJfU0lHTkFMX1NUQVRFKTsKKwlpZiAocmVnICYgWllOUU1QX0RQX1RYX0lO VFJfU0lHTkFMX1NUQVRFX1JFUVVFU1QpCisJCXJldHVybiAtRUJVU1k7CisKKwl6eW5xbXBfZHBf d3JpdGUoaW9tZW0sIFpZTlFNUF9EUF9UWF9BVVhfQUREUkVTUywgYWRkcik7CisJaWYgKCFpc19y ZWFkKQorCQlmb3IgKGkgPSAwOyBpIDwgYnl0ZXM7IGkrKykKKwkJCXp5bnFtcF9kcF93cml0ZShp b21lbSwgWllOUU1QX0RQX1RYX0FVWF9XUklURV9GSUZPLAorCQkJCQlidWZbaV0pOworCisJcmVn ID0gY21kIDw8IFpZTlFNUF9EUF9UWF9BVVhfQ09NTUFORF9DTURfU0hJRlQ7CisJaWYgKCFidWYg fHwgIWJ5dGVzKQorCQlyZWcgfD0gWllOUU1QX0RQX1RYX0FVWF9DT01NQU5EX0FERFJFU1NfT05M WTsKKwllbHNlCisJCXJlZyB8PSAoYnl0ZXMgLSAxKSA8PCBaWU5RTVBfRFBfVFhfQVVYX0NPTU1B TkRfQllURVNfU0hJRlQ7CisJenlucW1wX2RwX3dyaXRlKGlvbWVtLCBaWU5RTVBfRFBfVFhfQVVY X0NPTU1BTkQsIHJlZyk7CisKKwkvKiBXYWl0IGZvciByZXBseSB0byBiZSBkZWxpdmVyZWQgdXB0 byAybXMgKi8KKwlmb3IgKGkgPSAwOyA7IGkrKykgeworCQlyZWcgPSB6eW5xbXBfZHBfcmVhZChp b21lbSwgWllOUU1QX0RQX1RYX0lOVFJfU0lHTkFMX1NUQVRFKTsKKwkJaWYgKHJlZyAmIFpZTlFN UF9EUF9UWF9JTlRSX1NJR05BTF9TVEFURV9SRVBMWSkKKwkJCWJyZWFrOworCisJCWlmIChyZWcg JiBaWU5RTVBfRFBfVFhfSU5UUl9TSUdOQUxfU1RBVEVfUkVQTFlfVElNRU9VVCB8fAorCQkgICAg aSA9PSAyKQorCQkJcmV0dXJuIC1FVElNRURPVVQ7CisKKwkJdXNsZWVwX3JhbmdlKDEwMDAsIDEx MDApOworCX0KKworCXJlZyA9IHp5bnFtcF9kcF9yZWFkKGlvbWVtLCBaWU5RTVBfRFBfVFhfQVVY X1JFUExZX0NPREUpOworCWlmIChyZXBseSkKKwkJKnJlcGx5ID0gcmVnOworCisJaWYgKGlzX3Jl YWQgJiYKKwkgICAgKHJlZyA9PSBaWU5RTVBfRFBfVFhfQVVYX1JFUExZX0NPREVfQVVYX0FDSyB8 fAorCSAgICAgcmVnID09IFpZTlFNUF9EUF9UWF9BVVhfUkVQTFlfQ09ERV9JMkNfQUNLKSkgewor CQlyZWcgPSB6eW5xbXBfZHBfcmVhZChpb21lbSwgWllOUU1QX0RQX1RYX1JFUExZX0RBVEFfQ05U KTsKKwkJaWYgKChyZWcgJiBaWU5RTVBfRFBfVFhfQVVYX1JFUExZX0NOVF9NQVNLKSAhPSBieXRl cykKKwkJCXJldHVybiAtRUlPOworCisJCWZvciAoaSA9IDA7IGkgPCBieXRlczsgaSsrKSB7CisJ CQlidWZbaV0gPSB6eW5xbXBfZHBfcmVhZChpb21lbSwKKwkJCQkJCVpZTlFNUF9EUF9UWF9BVVhf UkVQTFlfREFUQSk7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3QK K3p5bnFtcF9kcF9hdXhfdHJhbnNmZXIoc3RydWN0IGRybV9kcF9hdXggKmF1eCwgc3RydWN0IGRy bV9kcF9hdXhfbXNnICptc2cpCit7CisJc3RydWN0IHp5bnFtcF9kcCAqZHAgPSBjb250YWluZXJf b2YoYXV4LCBzdHJ1Y3QgenlucW1wX2RwLCBhdXgpOworCWludCByZXQ7CisJdW5zaWduZWQgaW50 IGksIGl0ZXI7CisKKwkvKiBOdW1iZXIgb2YgbG9vcHMgPSB0aW1lb3V0IGluIG1zZWMgLyBhdXgg ZGVsYXkgKDQwMCB1c2VjKSAqLworCWl0ZXIgPSB6eW5xbXBfZHBfYXV4X3RpbWVvdXRfbXMgKiAx MDAwIC8gNDAwOworCWl0ZXIgPSBpdGVyID8gaXRlciA6IDE7CisKKwlmb3IgKGkgPSAwOyBpIDwg aXRlcjsgaSsrKSB7CisJCXJldCA9IHp5bnFtcF9kcF9hdXhfY21kX3N1Ym1pdChkcCwgbXNnLT5y ZXF1ZXN0LCBtc2ctPmFkZHJlc3MsCisJCQkJCSAgICAgICBtc2ctPmJ1ZmZlciwgbXNnLT5zaXpl LAorCQkJCQkgICAgICAgJm1zZy0+cmVwbHkpOworCQlpZiAoIXJldCkgeworCQkJZGV2X2RiZyhk cC0+ZGV2LCAiYXV4ICVkIHJldHJpZXNcbiIsIGkpOworCQkJcmV0dXJuIG1zZy0+c2l6ZTsKKwkJ fQorCisJCWlmIChkcC0+c3RhdHVzID09IGNvbm5lY3Rvcl9zdGF0dXNfZGlzY29ubmVjdGVkKSB7 CisJCQlkZXZfZGJnKGRwLT5kZXYsICJubyBjb25uZWN0ZWQgYXV4IGRldmljZVxuIik7CisJCQly ZXR1cm4gLUVOT0RFVjsKKwkJfQorCisJCXVzbGVlcF9yYW5nZSg0MDAsIDUwMCk7CisJfQorCisJ ZGV2X2RiZyhkcC0+ZGV2LCAiZmFpbGVkIHRvIGRvIGF1eCB0cmFuc2ZlciAoJWQpXG4iLCByZXQp OworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiB6eW5xbXBfZHBfaW5pdF9hdXggLSBJbml0 aWFsaXplIHRoZSBEUCBhdXgKKyAqIEBkcDogRGlzcGxheVBvcnQgSVAgY29yZSBzdHJ1Y3R1cmUK KyAqCisgKiBJbml0aWFsaXplIHRoZSBEUCBhdXguIFRoZSBhdXggY2xvY2sgaXMgZGVyaXZlZCBm cm9tIHRoZSBheGkgY2xvY2ssIHNvCisgKiB0aGlzIGZ1bmN0aW9uIGdldHMgdGhlIGF4aSBjbG9j ayBmcmVxdWVuY3kgYW5kIGNhbGN1bGF0ZXMgdGhlIGZpbHRlcgorICogdmFsdWUuIEFkZGl0aW9u YWxseSwgdGhlIGludGVycnVwdHMgYW5kIHRyYW5zbWl0dGVyIGFyZSBlbmFibGVkLgorICoKKyAq IFJldHVybjogMCBvbiBzdWNjZXNzLCBlcnJvciB2YWx1ZSBvdGhlcndpc2UKKyAqLworc3RhdGlj IGludCB6eW5xbXBfZHBfaW5pdF9hdXgoc3RydWN0IHp5bnFtcF9kcCAqZHApCit7CisJdW5zaWdu ZWQgaW50IHJhdGU7CisJdTMyIHJlZywgdzsKKworCXJhdGUgPSB6eW5xbXBfZGlzcF9nZXRfYXBi X2Nsa19yYXRlKGRwLT5kcHN1Yi0+ZGlzcCk7CisJaWYgKHJhdGUgPCBaWU5RTVBfRFBfVFhfQ0xL X0RJVklERVJfTUhaKSB7CisJCWRldl9lcnIoZHAtPmRldiwgImFjbGsgc2hvdWxkIGJlIGhpZ2hl ciB0aGFuIDFNSHpcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBBbGxvd2FibGUg dmFsdWVzIGZvciB0aGlzIHJlZ2lzdGVyIGFyZTogOCwgMTYsIDI0LCAzMiwgNDAsIDQ4ICovCisJ Zm9yICh3ID0gODsgdyA8PSA0ODsgdyArPSA4KSB7CisJCS8qIEFVWCBwdWxzZSB3aWR0aCBzaG91 bGQgYmUgYmV0d2VlbiAwLjQgdG8gMC42IHVzZWMgKi8KKwkJaWYgKHcgPj0gKDQgKiByYXRlIC8g MTAwMDAwMDApICYmCisJCSAgICB3IDw9ICg2ICogcmF0ZSAvIDEwMDAwMDAwKSkKKwkJCWJyZWFr OworCX0KKworCWlmICh3ID4gNDgpIHsKKwkJZGV2X2VycihkcC0+ZGV2LCAiYWNsayBmcmVxdWVu Y3kgdG9vIGhpZ2hcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmVnID0gdyA8PCBaWU5R TVBfRFBfVFhfQ0xLX0RJVklERVJfQVVYX0ZJTFRFUl9TSElGVDsKKwlyZWcgfD0gcmF0ZSAvIFpZ TlFNUF9EUF9UWF9DTEtfRElWSURFUl9NSFo7CisJenlucW1wX2RwX3dyaXRlKGRwLT5pb21lbSwg WllOUU1QX0RQX1RYX0NMS19ESVZJREVSLCByZWcpOworCXp5bnFtcF9kcF93cml0ZShkcC0+aW9t ZW0sIFpZTlFNUF9EUF9TVUJfVFhfSU5UUl9FTiwKKwkJCVpZTlFNUF9EUF9UWF9JTlRSX0FMTCk7 CisJenlucW1wX2RwX3dyaXRlKGRwLT5pb21lbSwgWllOUU1QX0RQX1NVQl9UWF9JTlRSX0RTLAor CQkJWllOUU1QX0RQX1RYX05PX0lOVFJfQUxMKTsKKwl6eW5xbXBfZHBfd3JpdGUoZHAtPmlvbWVt LCBaWU5RTVBfRFBfVFhfRU5BQkxFLCAxKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIHp5 bnFtcF9kcF9leGl0X2F1eCAtIERlLWluaXRpYWxpemUgdGhlIERQIGF1eAorICogQGRwOiBEaXNw bGF5UG9ydCBJUCBjb3JlIHN0cnVjdHVyZQorICoKKyAqIERlLWluaXRpYWxpemUgdGhlIERQIGF1 eC4gRGlzYWJsZSBhbGwgaW50ZXJydXB0cyB3aGljaCBhcmUgZW5hYmxlZAorICogdGhyb3VnaCBh dXggaW5pdGlhbGl6YXRpb24sIGFzIHdlbGwgYXMgdGhlIHRyYW5zbWl0dGVyLgorICovCitzdGF0 aWMgdm9pZCB6eW5xbXBfZHBfZXhpdF9hdXgoc3RydWN0IHp5bnFtcF9kcCAqZHApCit7CisJenlu cW1wX2RwX3dyaXRlKGRwLT5pb21lbSwgWllOUU1QX0RQX1RYX0VOQUJMRSwgMCk7CisJenlucW1w X2RwX3dyaXRlKGRwLT5pb21lbSwgWllOUU1QX0RQX1NVQl9UWF9JTlRSX0RTLCAweGZmZmZmZmZm KTsKK30KKworLyoKKyAqIEdlbmVyaWMgRFAgZnVuY3Rpb25zCisgKi8KKworLyoqCisgKiB6eW5x bXBfZHBfdXBkYXRlX21pc2MgLSBXcml0ZSB0aGUgbWlzYyByZWdpc3RlcnMKKyAqIEBkcDogRGlz cGxheVBvcnQgSVAgY29yZSBzdHJ1Y3R1cmUKKyAqCisgKiBUaGUgbWlzYyByZWdpc3RlciB2YWx1 ZXMgYXJlIHN0b3JlZCBpbiB0aGUgc3RydWN0dXJlLCBhbmQgdGhpcworICogZnVuY3Rpb24gYXBw bGllcyB0aGUgdmFsdWVzIGludG8gdGhlIHJlZ2lzdGVycy4KKyAqLworc3RhdGljIHZvaWQgenlu cW1wX2RwX3VwZGF0ZV9taXNjKHN0cnVjdCB6eW5xbXBfZHAgKmRwKQoreworCXp5bnFtcF9kcF93 cml0ZShkcC0+aW9tZW0sIFpZTlFNUF9EUF9UWF9NQUlOX1NUUkVBTV9NSVNDMCwKKwkJCWRwLT5j b25maWcubWlzYzApOworCXp5bnFtcF9kcF93cml0ZShkcC0+aW9tZW0sIFpZTlFNUF9EUF9UWF9N QUlOX1NUUkVBTV9NSVNDMSwKKwkJCWRwLT5jb25maWcubWlzYzEpOworfQorCisvKioKKyAqIHp5 bnFtcF9kcF9zZXRfYnBjIC0gU2V0IGJwYyB2YWx1ZSBpbiBzb2Z0d2FyZSBtaXNjIHN0YXRlCisg KiBAZHA6IERpc3BsYXlQb3J0IElQIGNvcmUgc3RydWN0dXJlCisgKiBAYnBjOiBiaXRzIHBlciBj b21wb25lbnQKKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2Vzcywgb3IgdGhlIGZhbGxiYWNrIGJw YyB2YWx1ZQorICovCitzdGF0aWMgdTggenlucW1wX2RwX3NldF9icGMoc3RydWN0IHp5bnFtcF9k cCAqZHAsIHU4IGJwYykKK3sKKwlzdHJ1Y3QgenlucW1wX2RwX2NvbmZpZyAqY29uZmlnID0gJmRw LT5jb25maWc7CisJdTggcmV0ID0gMDsKKworCWlmIChkcC0+Y29ubmVjdG9yLmRpc3BsYXlfaW5m by5icGMgJiYKKwkgICAgZHAtPmNvbm5lY3Rvci5kaXNwbGF5X2luZm8uYnBjICE9IGJwYykgewor CQlkZXZfZXJyKGRwLT5kZXYsICJyZXF1ZXN0ZWQgYnBjICgldSkgIT0gZGlzcGxheSBpbmZvICgl dSlcbiIsCisJCQlicGMsIGRwLT5jb25uZWN0b3IuZGlzcGxheV9pbmZvLmJwYyk7CisJCWJwYyA9 IGRwLT5jb25uZWN0b3IuZGlzcGxheV9pbmZvLmJwYzsKKwl9CisKKwljb25maWctPm1pc2MwICY9 IH5aWU5RTVBfRFBfTUlTQzBfQlBDX01BU0s7CisJc3dpdGNoIChicGMpIHsKKwljYXNlIDY6CisJ CWNvbmZpZy0+bWlzYzAgfD0gWllOUU1QX0RQX01JU0MwX0JQQ182OworCQlicmVhazsKKwljYXNl IDg6CisJCWNvbmZpZy0+bWlzYzAgfD0gWllOUU1QX0RQX01JU0MwX0JQQ184OworCQlicmVhazsK KwljYXNlIDEwOgorCQljb25maWctPm1pc2MwIHw9IFpZTlFNUF9EUF9NSVNDMF9CUENfMTA7CisJ CWJyZWFrOworCWNhc2UgMTI6CisJCWNvbmZpZy0+bWlzYzAgfD0gWllOUU1QX0RQX01JU0MwX0JQ Q18xMjsKKwkJYnJlYWs7CisJY2FzZSAxNjoKKwkJY29uZmlnLT5taXNjMCB8PSBaWU5RTVBfRFBf TUlTQzBfQlBDXzE2OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGRwLT5kZXYsICJO b3Qgc3VwcG9ydGVkIGJwYyAoJXUpLiBmYWxsIGJhY2sgdG8gOGJwY1xuIiwKKwkJCWJwYyk7CisJ CWNvbmZpZy0+bWlzYzAgfD0gWllOUU1QX0RQX01JU0MwX0JQQ184OworCQlyZXQgPSA4OworCQli cmVhazsKKwl9CisJY29uZmlnLT5icGMgPSBicGM7CisJenlucW1wX2RwX3VwZGF0ZV9icHAoZHAp OworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiB6eW5xbXBfZHBfZW5jb2Rlcl9tb2RlX3Nl dF90cmFuc2Zlcl91bml0IC0gU2V0IHRoZSB0cmFuc2ZlciB1bml0IHZhbHVlcworICogQGRwOiBE aXNwbGF5UG9ydCBJUCBjb3JlIHN0cnVjdHVyZQorICogQG1vZGU6IHJlcXVlc3RlZCBkaXNwbGF5 IG1vZGUKKyAqCisgKiBTZXQgdGhlIHRyYW5zZmVyIHVuaXQsIGFuZCBjYWN1bGF0ZSBhbGwgdHJh bnNmZXIgdW5pdCBzaXplIHJlbGF0ZWQgdmFsdWVzLgorICogQ2FsY3VsYXRpb24gaXMgYmFzZWQg b24gRFAgYW5kIElQIGNvcmUgc3BlY2lmaWNhdGlvbi4KKyAqLworc3RhdGljIHZvaWQKK3p5bnFt cF9kcF9lbmNvZGVyX21vZGVfc2V0X3RyYW5zZmVyX3VuaXQoc3RydWN0IHp5bnFtcF9kcCAqZHAs CisJCQkJCSBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSkKK3sKKwl1MzIgdHUgPSBaWU5R TVBfRFBfVFhfREVGX1RSQU5TRkVSX1VOSVRfU0laRTsKKwl1MzIgYncsIHZpZF9rYnl0ZXMsIGF2 Z19ieXRlc19wZXJfdHUsIGluaXRfd2FpdDsKKworCS8qIFVzZSB0aGUgbWF4IHRyYW5zZmVyIHVu aXQgc2l6ZSAoZGVmYXVsdCkgKi8KKwl6eW5xbXBfZHBfd3JpdGUoZHAtPmlvbWVtLCBaWU5RTVBf RFBfVFhfVFJBTlNGRVJfVU5JVF9TSVpFLCB0dSk7CisKKwl2aWRfa2J5dGVzID0gbW9kZS0+Y2xv Y2sgKiAoZHAtPmNvbmZpZy5icHAgLyA4KTsKKwlidyA9IGRybV9kcF9id19jb2RlX3RvX2xpbmtf cmF0ZShkcC0+bW9kZS5id19jb2RlKTsKKwlhdmdfYnl0ZXNfcGVyX3R1ID0gdmlkX2tieXRlcyAq IHR1IC8gKGRwLT5tb2RlLmxhbmVfY250ICogYncgLyAxMDAwKTsKKwl6eW5xbXBfZHBfd3JpdGUo ZHAtPmlvbWVtLCBaWU5RTVBfRFBfVFhfTUlOX0JZVEVTX1BFUl9UVSwKKwkJCWF2Z19ieXRlc19w ZXJfdHUgLyAxMDAwKTsKKwl6eW5xbXBfZHBfd3JpdGUoZHAtPmlvbWVtLCBaWU5RTVBfRFBfVFhf RlJBQ19CWVRFU19QRVJfVFUsCisJCQlhdmdfYnl0ZXNfcGVyX3R1ICUgMTAwMCk7CisKKwkvKiBD b25maWd1cmUgdGhlIGluaXRpYWwgd2FpdCBjeWNsZSBiYXNlZCBvbiB0cmFuc2ZlciB1bml0IHNp emUgKi8KKwlpZiAodHUgPCAoYXZnX2J5dGVzX3Blcl90dSAvIDEwMDApKQorCQlpbml0X3dhaXQg PSAwOworCWVsc2UgaWYgKChhdmdfYnl0ZXNfcGVyX3R1IC8gMTAwMCkgPD0gNCkKKwkJaW5pdF93 YWl0ID0gdHU7CisJZWxzZQorCQlpbml0X3dhaXQgPSB0dSAtIGF2Z19ieXRlc19wZXJfdHUgLyAx MDAwOworCisJenlucW1wX2RwX3dyaXRlKGRwLT5pb21lbSwgWllOUU1QX0RQX1RYX0lOSVRfV0FJ VCwgaW5pdF93YWl0KTsKK30KKworLyoqCisgKiB6eW5xbXBfZHBfZW5jb2Rlcl9tb2RlX3NldF9z dHJlYW0gLSBDb25maWd1cmUgdGhlIG1haW4gc3RyZWFtCisgKiBAZHA6IERpc3BsYXlQb3J0IElQ IGNvcmUgc3RydWN0dXJlCisgKiBAbW9kZTogcmVxdWVzdGVkIGRpc3BsYXkgbW9kZQorICoKKyAq IENvbmZpZ3VyZSB0aGUgbWFpbiBzdHJlYW0gYmFzZWQgb24gdGhlIHJlcXVlc3RlZCBtb2RlIEBt b2RlLiBDYWxjdWxhdGlvbiBpcworICogYmFzZWQgb24gSVAgY29yZSBzcGVjaWZpY2F0aW9uLgor ICovCit2b2lkIHp5bnFtcF9kcF9lbmNvZGVyX21vZGVfc2V0X3N0cmVhbShzdHJ1Y3QgenlucW1w X2RwICpkcCwKKwkJCQkgICAgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUpCit7CisJ dm9pZCBfX2lvbWVtICppb21lbSA9IGRwLT5pb21lbTsKKwl1OCBsYW5lX2NudCA9IGRwLT5tb2Rl LmxhbmVfY250OworCXUzMiByZWcsIHdwbDsKKwl1bnNpZ25lZCBpbnQgcmF0ZTsKKworCXp5bnFt cF9kcF93cml0ZShpb21lbSwgWllOUU1QX0RQX1RYX01BSU5fU1RSRUFNX0hUT1RBTCwgbW9kZS0+ aHRvdGFsKTsKKwl6eW5xbXBfZHBfd3JpdGUoaW9tZW0sIFpZTlFNUF9EUF9UWF9NQUlOX1NUUkVB TV9WVE9UQUwsIG1vZGUtPnZ0b3RhbCk7CisJenlucW1wX2RwX3dyaXRlKGlvbWVtLCBaWU5RTVBf RFBfVFhfTUFJTl9TVFJFQU1fUE9MQVJJVFksCisJCQkoISEobW9kZS0+ZmxhZ3MgJiBEUk1fTU9E RV9GTEFHX1BWU1lOQykgPDwKKwkJCSBaWU5RTVBfRFBfVFhfTUFJTl9TVFJFQU1fUE9MQVJJVFlf VlNZTkNfU0hJRlQpIHwKKwkJCSghIShtb2RlLT5mbGFncyAmIERSTV9NT0RFX0ZMQUdfUEhTWU5D KSA8PAorCQkJIFpZTlFNUF9EUF9UWF9NQUlOX1NUUkVBTV9QT0xBUklUWV9IU1lOQ19TSElGVCkp OworCXp5bnFtcF9kcF93cml0ZShpb21lbSwgWllOUU1QX0RQX1RYX01BSU5fU1RSRUFNX0hTV0lE VEgsCisJCQltb2RlLT5oc3luY19lbmQgLSBtb2RlLT5oc3luY19zdGFydCk7CisJenlucW1wX2Rw X3dyaXRlKGlvbWVtLCBaWU5RTVBfRFBfVFhfTUFJTl9TVFJFQU1fVlNXSURUSCwKKwkJCW1vZGUt PnZzeW5jX2VuZCAtIG1vZGUtPnZzeW5jX3N0YXJ0KTsKKwl6eW5xbXBfZHBfd3JpdGUoaW9tZW0s IFpZTlFNUF9EUF9UWF9NQUlOX1NUUkVBTV9IUkVTLCBtb2RlLT5oZGlzcGxheSk7CisJenlucW1w X2RwX3dyaXRlKGlvbWVtLCBaWU5RTVBfRFBfVFhfTUFJTl9TVFJFQU1fVlJFUywgbW9kZS0+dmRp c3BsYXkpOworCXp5bnFtcF9kcF93cml0ZShpb21lbSwgWllOUU1QX0RQX1RYX01BSU5fU1RSRUFN X0hTVEFSVCwKKwkJCW1vZGUtPmh0b3RhbCAtIG1vZGUtPmhzeW5jX3N0YXJ0KTsKKwl6eW5xbXBf ZHBfd3JpdGUoaW9tZW0sIFpZTlFNUF9EUF9UWF9NQUlOX1NUUkVBTV9WU1RBUlQsCisJCQltb2Rl LT52dG90YWwgLSBtb2RlLT52c3luY19zdGFydCk7CisKKwkvKiBJbiBzeW5jaHJvbm91cyBtb2Rl LCBzZXQgdGhlIGRpdmllcnMgKi8KKwlpZiAoZHAtPmNvbmZpZy5taXNjMCAmIFpZTlFNUF9EUF9U WF9NQUlOX1NUUkVBTV9NSVNDMF9TWU5DKSB7CisJCXJlZyA9IGRybV9kcF9id19jb2RlX3RvX2xp bmtfcmF0ZShkcC0+bW9kZS5id19jb2RlKTsKKwkJenlucW1wX2RwX3dyaXRlKGlvbWVtLCBaWU5R TVBfRFBfVFhfTl9WSUQsIHJlZyk7CisJCXp5bnFtcF9kcF93cml0ZShpb21lbSwgWllOUU1QX0RQ X1RYX01fVklELCBtb2RlLT5jbG9jayk7CisJCXJhdGUgPSB6eW5xbXBfZGlzcF9nZXRfYXVkX2Ns a19yYXRlKGRwLT5kcHN1Yi0+ZGlzcCk7CisJCWlmIChyYXRlKSB7CisJCQlkZXZfZGJnKGRwLT5k ZXYsICJBdWRpbyByYXRlOiAlZFxuIiwgcmF0ZSAvIDUxMik7CisJCQl6eW5xbXBfZHBfd3JpdGUo aW9tZW0sIFpZTlFNUF9EUF9UWF9BVURJT19OX0FVRCwgcmVnKTsKKwkJCXp5bnFtcF9kcF93cml0 ZShpb21lbSwgWllOUU1QX0RQX1RYX0FVRElPX01fQVVELAorCQkJCQlyYXRlIC8gMTAwMCk7CisJ CX0KKwl9CisKKwkvKiBPbmx5IDIgY2hhbm5lbCBhdWRpbyBpcyBzdXBwb3J0ZWQgbm93ICovCisJ aWYgKHp5bnFtcF9kaXNwX2F1ZF9lbmFibGVkKGRwLT5kcHN1Yi0+ZGlzcCkpCisJCXp5bnFtcF9k cF93cml0ZShpb21lbSwgWllOUU1QX0RQX1RYX0FVRElPX0NIQU5ORUxTLCAxKTsKKworCXp5bnFt cF9kcF93cml0ZShpb21lbSwgWllOUU1QX0RQX1RYX1VTRVJfUElYRUxfV0lEVEgsIDEpOworCisJ LyogVHJhbnNsYXRlIHRvIHRoZSBuYXRpdmUgMTYgYml0IGRhdGFwYXRoIGJhc2VkIG9uIElQIGNv cmUgc3BlYyAqLworCXdwbCA9IChtb2RlLT5oZGlzcGxheSAqIGRwLT5jb25maWcuYnBwICsgMTUp IC8gMTY7CisJcmVnID0gd3BsICsgd3BsICUgbGFuZV9jbnQgLSBsYW5lX2NudDsKKwl6eW5xbXBf ZHBfd3JpdGUoaW9tZW0sIFpZTlFNUF9EUF9UWF9VU0VSX0RBVEFfQ05UX1BFUl9MQU5FLCByZWcp OworfQorCisvKgorICogRFJNIGNvbm5lY3RvciBmdW5jdGlvbnMKKyAqLworCitzdGF0aWMgZW51 bSBkcm1fY29ubmVjdG9yX3N0YXR1cworenlucW1wX2RwX2Nvbm5lY3Rvcl9kZXRlY3Qoc3RydWN0 IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwgYm9vbCBmb3JjZSkKK3sKKwlzdHJ1Y3QgenlucW1w X2RwICpkcCA9IGNvbm5lY3Rvcl90b19kcChjb25uZWN0b3IpOworCXN0cnVjdCB6eW5xbXBfZHBf bGlua19jb25maWcgKmxpbmtfY29uZmlnID0gJmRwLT5saW5rX2NvbmZpZzsKKwl1MzIgc3RhdGUs IGk7CisJaW50IHJldDsKKworCS8qCisJICogVGhpcyBpcyBmcm9tIGhldXJpc3RpYy4gSXQgdGFr ZXMgc29tZSBkZWxheSAoZXgsIDEwMCB+IDUwMCBtc2VjKSB0bworCSAqIGdldCB0aGUgSFBEIHNp Z25hbCB3aXRoIHNvbWUgbW9uaXRvcnMuCisJICovCisJZm9yIChpID0gMDsgaSA8IDEwOyBpKysp IHsKKwkJc3RhdGUgPSB6eW5xbXBfZHBfcmVhZChkcC0+aW9tZW0sCisJCQkJICAgICAgIFpZTlFN UF9EUF9UWF9JTlRSX1NJR05BTF9TVEFURSk7CisJCWlmIChzdGF0ZSAmIFpZTlFNUF9EUF9UWF9J TlRSX1NJR05BTF9TVEFURV9IUEQpCisJCQlicmVhazsKKwkJbXNsZWVwKDEwMCk7CisJfQorCisJ aWYgKHN0YXRlICYgWllOUU1QX0RQX1RYX0lOVFJfU0lHTkFMX1NUQVRFX0hQRCkgeworCQlyZXQg PSBkcm1fZHBfZHBjZF9yZWFkKCZkcC0+YXV4LCAweDAsIGRwLT5kcGNkLAorCQkJCSAgICAgICBz aXplb2YoZHAtPmRwY2QpKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9kYmcoZHAtPmRldiwg IkRQQ0QgcmVhZCBmYWlsZXMiKTsKKwkJCWdvdG8gZGlzY29ubmVjdGVkOworCQl9CisKKwkJbGlu a19jb25maWctPm1heF9yYXRlID0gbWluX3QoaW50LAorCQkJCQkgICAgICBkcm1fZHBfbWF4X2xp bmtfcmF0ZShkcC0+ZHBjZCksCisJCQkJCSAgICAgIERQX0hJR0hfQklUX1JBVEUyKTsKKwkJbGlu a19jb25maWctPm1heF9sYW5lcyA9IG1pbl90KHU4LAorCQkJCQkgICAgICAgZHJtX2RwX21heF9s YW5lX2NvdW50KGRwLT5kcGNkKSwKKwkJCQkJICAgICAgIGRwLT5udW1fbGFuZXMpOworCisJCWRw LT5zdGF0dXMgPSBjb25uZWN0b3Jfc3RhdHVzX2Nvbm5lY3RlZDsKKwkJcmV0dXJuIGNvbm5lY3Rv cl9zdGF0dXNfY29ubmVjdGVkOworCX0KKworZGlzY29ubmVjdGVkOgorCWRwLT5zdGF0dXMgPSBj b25uZWN0b3Jfc3RhdHVzX2Rpc2Nvbm5lY3RlZDsKKwlyZXR1cm4gY29ubmVjdG9yX3N0YXR1c19k aXNjb25uZWN0ZWQ7Cit9CisKK3N0YXRpYyBpbnQgenlucW1wX2RwX2Nvbm5lY3Rvcl9nZXRfbW9k ZXMoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKK3sKKwlzdHJ1Y3QgenlucW1wX2Rw ICpkcCA9IGNvbm5lY3Rvcl90b19kcChjb25uZWN0b3IpOworCXN0cnVjdCBlZGlkICplZGlkOwor CWludCByZXQ7CisKKwllZGlkID0gZHJtX2dldF9lZGlkKGNvbm5lY3RvciwgJmRwLT5hdXguZGRj KTsKKwlpZiAoIWVkaWQpCisJCXJldHVybiAwOworCisJZHJtX21vZGVfY29ubmVjdG9yX3VwZGF0 ZV9lZGlkX3Byb3BlcnR5KGNvbm5lY3RvciwgZWRpZCk7CisJcmV0ID0gZHJtX2FkZF9lZGlkX21v ZGVzKGNvbm5lY3RvciwgZWRpZCk7CisJa2ZyZWUoZWRpZCk7CisKKwlyZXR1cm4gcmV0OworfQor CitzdGF0aWMgc3RydWN0IGRybV9lbmNvZGVyICoKK3p5bnFtcF9kcF9jb25uZWN0b3JfYmVzdF9l bmNvZGVyKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCit7CisJc3RydWN0IHp5bnFt cF9kcCAqZHAgPSBjb25uZWN0b3JfdG9fZHAoY29ubmVjdG9yKTsKKworCXJldHVybiAmZHAtPmVu Y29kZXI7Cit9CisKK3N0YXRpYyBpbnQgenlucW1wX2RwX2Nvbm5lY3Rvcl9tb2RlX3ZhbGlkKHN0 cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCisJCQkJCSAgc3RydWN0IGRybV9kaXNwbGF5 X21vZGUgKm1vZGUpCit7CisJc3RydWN0IHp5bnFtcF9kcCAqZHAgPSBjb25uZWN0b3JfdG9fZHAo Y29ubmVjdG9yKTsKKwl1OCBtYXhfbGFuZXMgPSBkcC0+bGlua19jb25maWcubWF4X2xhbmVzOwor CXU4IGJwcCA9IGRwLT5jb25maWcuYnBwOworCWludCBtYXhfcmF0ZSA9IGRwLT5saW5rX2NvbmZp Zy5tYXhfcmF0ZTsKKwlpbnQgcmF0ZTsKKworCWlmIChtb2RlLT5jbG9jayA+IFpZTlFNUF9NQVhf RlJFUSkgeworCQlkZXZfZGJnKGRwLT5kZXYsICJmaWx0ZXJlZCB0aGUgbW9kZSwgJXMsZm9yIGhp Z2ggcGl4ZWwgcmF0ZVxuIiwKKwkJCW1vZGUtPm5hbWUpOworCQlkcm1fbW9kZV9kZWJ1Z19wcmlu dG1vZGVsaW5lKG1vZGUpOworCQlyZXR1cm4gTU9ERV9DTE9DS19ISUdIOworCX0KKworCS8qIENo ZWNrIHdpdGggbGluayByYXRlIGFuZCBsYW5lIGNvdW50ICovCisJcmF0ZSA9IHp5bnFtcF9kcF9t YXhfcmF0ZShtYXhfcmF0ZSwgbWF4X2xhbmVzLCBicHApOworCWlmIChtb2RlLT5jbG9jayA+IHJh dGUpIHsKKwkJZGV2X2RiZyhkcC0+ZGV2LCAiZmlsdGVyZWQgdGhlIG1vZGUsICVzLGZvciBoaWdo IHBpeGVsIHJhdGVcbiIsCisJCQltb2RlLT5uYW1lKTsKKwkJZHJtX21vZGVfZGVidWdfcHJpbnRt b2RlbGluZShtb2RlKTsKKwkJcmV0dXJuIE1PREVfQ0xPQ0tfSElHSDsKKwl9CisKKwlyZXR1cm4g TU9ERV9PSzsKK30KKworc3RhdGljIHZvaWQgenlucW1wX2RwX2Nvbm5lY3Rvcl9kZXN0cm95KHN0 cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCit7CisJZHJtX2Nvbm5lY3Rvcl91bnJlZ2lz dGVyKGNvbm5lY3Rvcik7CisJZHJtX2Nvbm5lY3Rvcl9jbGVhbnVwKGNvbm5lY3Rvcik7Cit9CisK K3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9mdW5jcyB6eW5xbXBfZHBfY29ubmVj dG9yX2Z1bmNzID0geworCS5kZXRlY3QJCQk9IHp5bnFtcF9kcF9jb25uZWN0b3JfZGV0ZWN0LAor CS5maWxsX21vZGVzCQk9IGRybV9oZWxwZXJfcHJvYmVfc2luZ2xlX2Nvbm5lY3Rvcl9tb2RlcywK KwkuZGVzdHJveQkJPSB6eW5xbXBfZHBfY29ubmVjdG9yX2Rlc3Ryb3ksCisJLmF0b21pY19kdXBs aWNhdGVfc3RhdGUJPSBkcm1fYXRvbWljX2hlbHBlcl9jb25uZWN0b3JfZHVwbGljYXRlX3N0YXRl LAorCS5hdG9taWNfZGVzdHJveV9zdGF0ZQk9IGRybV9hdG9taWNfaGVscGVyX2Nvbm5lY3Rvcl9k ZXN0cm95X3N0YXRlLAorCS5yZXNldAkJCT0gZHJtX2F0b21pY19oZWxwZXJfY29ubmVjdG9yX3Jl c2V0LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fY29ubmVjdG9yX2hlbHBlcl9mdW5j cworenlucW1wX2RwX2Nvbm5lY3Rvcl9oZWxwZXJfZnVuY3MgPSB7CisJLmdldF9tb2Rlcwk9IHp5 bnFtcF9kcF9jb25uZWN0b3JfZ2V0X21vZGVzLAorCS5iZXN0X2VuY29kZXIJPSB6eW5xbXBfZHBf Y29ubmVjdG9yX2Jlc3RfZW5jb2RlciwKKwkubW9kZV92YWxpZAk9IHp5bnFtcF9kcF9jb25uZWN0 b3JfbW9kZV92YWxpZCwKK307CisKKy8qCisgKiBEUk0gZW5jb2RlciBmdW5jdGlvbnMKKyAqLwor CitzdGF0aWMgdm9pZCB6eW5xbXBfZHBfZW5jb2Rlcl9lbmFibGUoc3RydWN0IGRybV9lbmNvZGVy ICplbmNvZGVyKQoreworCXN0cnVjdCB6eW5xbXBfZHAgKmRwID0gZW5jb2Rlcl90b19kcChlbmNv ZGVyKTsKKwl2b2lkIF9faW9tZW0gKmlvbWVtID0gZHAtPmlvbWVtOworCXVuc2lnbmVkIGludCBp OworCWludCByZXQgPSAwOworCisJcG1fcnVudGltZV9nZXRfc3luYyhkcC0+ZGV2KTsKKwlkcC0+ ZW5hYmxlZCA9IHRydWU7CisJenlucW1wX2RwX2luaXRfYXV4KGRwKTsKKwl6eW5xbXBfZHBfdXBk YXRlX21pc2MoZHApOworCWlmICh6eW5xbXBfZGlzcF9hdWRfZW5hYmxlZChkcC0+ZHBzdWItPmRp c3ApKQorCQl6eW5xbXBfZHBfd3JpdGUoaW9tZW0sIFpZTlFNUF9EUF9UWF9BVURJT19DT05UUk9M LCAxKTsKKwl6eW5xbXBfZHBfd3JpdGUoaW9tZW0sIFpZTlFNUF9EUF9UWF9QSFlfUE9XRVJfRE9X TiwgMCk7CisJaWYgKGRwLT5zdGF0dXMgPT0gY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQpIHsK KwkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQkJcmV0ID0gZHJtX2RwX2RwY2Rfd3JpdGVi KCZkcC0+YXV4LCBEUF9TRVRfUE9XRVIsCisJCQkJCQkgRFBfU0VUX1BPV0VSX0QwKTsKKwkJCWlm IChyZXQgPT0gMSkKKwkJCQlicmVhazsKKwkJCXVzbGVlcF9yYW5nZSgzMDAsIDUwMCk7CisJCX0K KwkJLyogU29tZSBtb25pdG9ycyB0YWtlIHRpbWUgdG8gd2FrZSB1cCBwcm9wZXJseSAqLworCQlt c2xlZXAoenlucW1wX2RwX3Bvd2VyX29uX2RlbGF5X21zKTsKKwl9CisJaWYgKHJldCAhPSAxKQor CQlkZXZfZGJnKGRwLT5kZXYsICJEUCBhdXggZmFpbGVkXG4iKTsKKwllbHNlCisJCXp5bnFtcF9k cF90cmFpbl9sb29wKGRwKTsKKwl6eW5xbXBfZHBfd3JpdGUoaW9tZW0sIFpZTlFNUF9EUF9UWF9T V19SRVNFVCwKKwkJCVpZTlFNUF9EUF9UWF9TV19SRVNFVF9BTEwpOworCXp5bnFtcF9kcF93cml0 ZShpb21lbSwgWllOUU1QX0RQX1RYX0VOQUJMRV9NQUlOX1NUUkVBTSwgMSk7Cit9CisKK3N0YXRp YyB2b2lkIHp5bnFtcF9kcF9lbmNvZGVyX2Rpc2FibGUoc3RydWN0IGRybV9lbmNvZGVyICplbmNv ZGVyKQoreworCXN0cnVjdCB6eW5xbXBfZHAgKmRwID0gZW5jb2Rlcl90b19kcChlbmNvZGVyKTsK Kwl2b2lkIF9faW9tZW0gKmlvbWVtID0gZHAtPmlvbWVtOworCisJZHAtPmVuYWJsZWQgPSBmYWxz ZTsKKwljYW5jZWxfZGVsYXllZF93b3JrKCZkcC0+aHBkX3dvcmspOworCXp5bnFtcF9kcF93cml0 ZShpb21lbSwgWllOUU1QX0RQX1RYX0VOQUJMRV9NQUlOX1NUUkVBTSwgMCk7CisJZHJtX2RwX2Rw Y2Rfd3JpdGViKCZkcC0+YXV4LCBEUF9TRVRfUE9XRVIsIERQX1NFVF9QT1dFUl9EMyk7CisJenlu cW1wX2RwX3dyaXRlKGlvbWVtLCBaWU5RTVBfRFBfVFhfUEhZX1BPV0VSX0RPV04sCisJCQlaWU5R TVBfRFBfVFhfUEhZX1BPV0VSX0RPV05fQUxMKTsKKwlpZiAoenlucW1wX2Rpc3BfYXVkX2VuYWJs ZWQoZHAtPmRwc3ViLT5kaXNwKSkKKwkJenlucW1wX2RwX3dyaXRlKGlvbWVtLCBaWU5RTVBfRFBf VFhfQVVESU9fQ09OVFJPTCwgMCk7CisJcG1fcnVudGltZV9wdXRfc3luYyhkcC0+ZGV2KTsKK30K Kworc3RhdGljIHZvaWQKK3p5bnFtcF9kcF9lbmNvZGVyX2F0b21pY19tb2RlX3NldChzdHJ1Y3Qg ZHJtX2VuY29kZXIgKmVuY29kZXIsCisJCQkJICBzdHJ1Y3QgZHJtX2NydGNfc3RhdGUgKmNydGNf c3RhdGUsCisJCQkJICBzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9zdGF0ZSAqY29ubmVjdG9yX3N0YXRl KQoreworCXN0cnVjdCB6eW5xbXBfZHAgKmRwID0gZW5jb2Rlcl90b19kcChlbmNvZGVyKTsKKwlz dHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSA9ICZjcnRjX3N0YXRlLT5tb2RlOworCXN0cnVj dCBkcm1fZGlzcGxheV9tb2RlICphZGp1c3RlZF9tb2RlID0gJmNydGNfc3RhdGUtPmFkanVzdGVk X21vZGU7CisJdTggbWF4X2xhbmVzID0gZHAtPmxpbmtfY29uZmlnLm1heF9sYW5lczsKKwl1OCBi cHAgPSBkcC0+Y29uZmlnLmJwcDsKKwlpbnQgcmF0ZSwgbWF4X3JhdGUgPSBkcC0+bGlua19jb25m aWcubWF4X3JhdGU7CisJaW50IHJldDsKKworCS8qIENoZWNrIGFnYWluIGFzIGJwcCBvciBmb3Jt YXQgbWlnaHQgaGF2ZSBiZWVuIGNoYWduZWQgKi8KKwlyYXRlID0genlucW1wX2RwX21heF9yYXRl KG1heF9yYXRlLCBtYXhfbGFuZXMsIGJwcCk7CisJaWYgKG1vZGUtPmNsb2NrID4gcmF0ZSkgewor CQlkZXZfZXJyKGRwLT5kZXYsICJ0aGUgbW9kZSwgJXMsaGFzIHRvbyBoaWdoIHBpeGVsIHJhdGVc biIsCisJCQltb2RlLT5uYW1lKTsKKwkJZHJtX21vZGVfZGVidWdfcHJpbnRtb2RlbGluZShtb2Rl KTsKKwl9CisKKwlyZXQgPSB6eW5xbXBfZHBfbW9kZV9jb25maWd1cmUoZHAsIGFkanVzdGVkX21v ZGUtPmNsb2NrLCAwKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuOworCisJenlucW1wX2RwX2Vu Y29kZXJfbW9kZV9zZXRfdHJhbnNmZXJfdW5pdChkcCwgYWRqdXN0ZWRfbW9kZSk7Cit9CisKKyNk ZWZpbmUgWllOUU1QX0RQX01JTl9IX0JBQ0tQT1JDSAkyMAorCitzdGF0aWMgaW50Cit6eW5xbXBf ZHBfZW5jb2Rlcl9hdG9taWNfY2hlY2soc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLAorCQkJ ICAgICAgIHN0cnVjdCBkcm1fY3J0Y19zdGF0ZSAqY3J0Y19zdGF0ZSwKKwkJCSAgICAgICBzdHJ1 Y3QgZHJtX2Nvbm5lY3Rvcl9zdGF0ZSAqY29ubl9zdGF0ZSkKK3sKKwlzdHJ1Y3QgZHJtX2Rpc3Bs YXlfbW9kZSAqbW9kZSA9ICZjcnRjX3N0YXRlLT5tb2RlOworCXN0cnVjdCBkcm1fZGlzcGxheV9t b2RlICphZGp1c3RlZF9tb2RlID0gJmNydGNfc3RhdGUtPmFkanVzdGVkX21vZGU7CisJaW50IGRp ZmYgPSBtb2RlLT5odG90YWwgLSBtb2RlLT5oc3luY19lbmQ7CisKKwkvKgorCSAqIFp5bnFNUCBE UCByZXF1aXJlcyBob3Jpem9udGFsIGJhY2twb3JjaCB0byBiZSBncmVhdGVyIHRoYW4gMTIuCisJ ICogVGhpcyBsaW1pdGF0aW9uIG1heSBub3QgYmUgY29tcGF0aWJsZSB3aXRoIHRoZSBzaW5rIGRl dmljZS4KKwkgKi8KKwlpZiAoZGlmZiA8IFpZTlFNUF9EUF9NSU5fSF9CQUNLUE9SQ0gpIHsKKwkJ aW50IHZyZWZyZXNoID0gKGFkanVzdGVkX21vZGUtPmNsb2NrICogMTAwMCkgLworCQkJICAgICAg IChhZGp1c3RlZF9tb2RlLT52dG90YWwgKiBhZGp1c3RlZF9tb2RlLT5odG90YWwpOworCisJCWRl dl9kYmcoZW5jb2Rlci0+ZGV2LT5kZXYsICJoYmFja3BvcmNoIGFkanVzdGVkOiAlZCB0byAlZCIs CisJCQlkaWZmLCBaWU5RTVBfRFBfTUlOX0hfQkFDS1BPUkNIIC0gZGlmZik7CisJCWRpZmYgPSBa WU5RTVBfRFBfTUlOX0hfQkFDS1BPUkNIIC0gZGlmZjsKKwkJYWRqdXN0ZWRfbW9kZS0+aHRvdGFs ICs9IGRpZmY7CisJCWFkanVzdGVkX21vZGUtPmNsb2NrID0gYWRqdXN0ZWRfbW9kZS0+dnRvdGFs ICoKKwkJCQkgICAgICAgYWRqdXN0ZWRfbW9kZS0+aHRvdGFsICogdnJlZnJlc2ggLyAxMDAwOwor CX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9lbmNvZGVyX2Z1 bmNzIHp5bnFtcF9kcF9lbmNvZGVyX2Z1bmNzID0geworCS5kZXN0cm95ID0gZHJtX2VuY29kZXJf Y2xlYW51cCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2VuY29kZXJfaGVscGVyX2Z1 bmNzIHp5bnFtcF9kcF9lbmNvZGVyX2hlbHBlcl9mdW5jcyA9IHsKKwkuZW5hYmxlCQkJPSB6eW5x bXBfZHBfZW5jb2Rlcl9lbmFibGUsCisJLmRpc2FibGUJCT0genlucW1wX2RwX2VuY29kZXJfZGlz YWJsZSwKKwkuYXRvbWljX21vZGVfc2V0CT0genlucW1wX2RwX2VuY29kZXJfYXRvbWljX21vZGVf c2V0LAorCS5hdG9taWNfY2hlY2sJCT0genlucW1wX2RwX2VuY29kZXJfYXRvbWljX2NoZWNrLAor fTsKKworLyoKKyAqIENvbXBvbmVudCBmdW5jdGlvbnMKKyAqLworCitzdGF0aWMgdm9pZCB6eW5x bXBfZHBfaHBkX3dvcmtfZnVuYyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0 IHp5bnFtcF9kcCAqZHA7CisKKwlkcCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgenlucW1w X2RwLCBocGRfd29yay53b3JrKTsKKworCWlmIChkcC0+ZHJtKQorCQlkcm1faGVscGVyX2hwZF9p cnFfZXZlbnQoZHAtPmRybSk7Cit9CisKK2ludCB6eW5xbXBfZHBfYmluZChzdHJ1Y3QgZGV2aWNl ICpkZXYsIHN0cnVjdCBkZXZpY2UgKm1hc3Rlciwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgenlu cW1wX2Rwc3ViICpkcHN1YiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCB6eW5xbXBf ZHAgKmRwID0gZHBzdWItPmRwOworCXN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciA9ICZkcC0+ ZW5jb2RlcjsKKwlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yID0gJmRwLT5jb25uZWN0 b3I7CisJc3RydWN0IGRybV9kZXZpY2UgKmRybSA9IGRhdGE7CisJc3RydWN0IGRldmljZV9ub2Rl ICpwb3J0OworCWludCByZXQ7CisKKwllbmNvZGVyLT5wb3NzaWJsZV9jcnRjcyB8PSB6eW5xbXBf ZGlzcF9nZXRfY3J0Y19tYXNrKGRwc3ViLT5kaXNwKTsKKwlmb3JfZWFjaF9jaGlsZF9vZl9ub2Rl KGRldi0+b2Zfbm9kZSwgcG9ydCkgeworCQlpZiAoIXBvcnQtPm5hbWUgfHwgb2Zfbm9kZV9jbXAo cG9ydC0+bmFtZSwgInBvcnQiKSkKKwkJCWNvbnRpbnVlOworCQllbmNvZGVyLT5wb3NzaWJsZV9j cnRjcyB8PSBkcm1fb2ZfZmluZF9wb3NzaWJsZV9jcnRjcyhkcm0sCisJCQkJCQkJCSAgICAgIHBv cnQpOworCX0KKwlkcm1fZW5jb2Rlcl9pbml0KGRybSwgZW5jb2RlciwgJnp5bnFtcF9kcF9lbmNv ZGVyX2Z1bmNzLAorCQkJIERSTV9NT0RFX0VOQ09ERVJfVE1EUywgTlVMTCk7CisJZHJtX2VuY29k ZXJfaGVscGVyX2FkZChlbmNvZGVyLCAmenlucW1wX2RwX2VuY29kZXJfaGVscGVyX2Z1bmNzKTsK KworCWNvbm5lY3Rvci0+cG9sbGVkID0gRFJNX0NPTk5FQ1RPUl9QT0xMX0hQRDsKKwlyZXQgPSBk cm1fY29ubmVjdG9yX2luaXQoZW5jb2Rlci0+ZGV2LCBjb25uZWN0b3IsCisJCQkJICZ6eW5xbXBf ZHBfY29ubmVjdG9yX2Z1bmNzLAorCQkJCSBEUk1fTU9ERV9DT05ORUNUT1JfRGlzcGxheVBvcnQp OworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkcC0+ZGV2LCAiZmFpbGVkIHRvIGluaXRpYWxpemUg dGhlIGRybSBjb25uZWN0b3IiKTsKKwkJZ290byBlcnJvcl9lbmNvZGVyOworCX0KKworCWRybV9j b25uZWN0b3JfaGVscGVyX2FkZChjb25uZWN0b3IsICZ6eW5xbXBfZHBfY29ubmVjdG9yX2hlbHBl cl9mdW5jcyk7CisJZHJtX2Nvbm5lY3Rvcl9yZWdpc3Rlcihjb25uZWN0b3IpOworCWRybV9tb2Rl X2Nvbm5lY3Rvcl9hdHRhY2hfZW5jb2Rlcihjb25uZWN0b3IsIGVuY29kZXIpOworCWNvbm5lY3Rv ci0+ZHBtcyA9IERSTV9NT0RFX0RQTVNfT0ZGOworCisJZHAtPmRybSA9IGRybTsKKwlkcC0+Y29u ZmlnLm1pc2MwICY9IH5aWU5RTVBfRFBfVFhfTUFJTl9TVFJFQU1fTUlTQzBfU1lOQzsKKwlyZXQg PSB6eW5xbXBfZHBfc2V0X2JwYyhkcCwgOCk7CisJenlucW1wX2RwX3VwZGF0ZV9icHAoZHApOwor CisJLyogVGhpcyBlbmFibGVzIGludGVycnVwdHMsIHNvIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIg RFJNIGluaXQgKi8KKwlyZXQgPSB6eW5xbXBfZHBfaW5pdF9hdXgoZHApOworCWlmIChyZXQpIHsK KwkJZGV2X2VycihkcC0+ZGV2LCAiZmFpbGVkIHRvIGluaXRpYWxpemUgRFAgYXV4Iik7CisJCWdv dG8gZXJyb3JfY29ubmVjdG9yOworCX0KKwlJTklUX0RFTEFZRURfV09SSygmZHAtPmhwZF93b3Jr LCB6eW5xbXBfZHBfaHBkX3dvcmtfZnVuYyk7CisKKwlyZXR1cm4gMDsKKworZXJyb3JfY29ubmVj dG9yOgorCXp5bnFtcF9kcF9jb25uZWN0b3JfZGVzdHJveSgmZHAtPmNvbm5lY3Rvcik7CitlcnJv cl9lbmNvZGVyOgorCWRybV9lbmNvZGVyX2NsZWFudXAoJmRwLT5lbmNvZGVyKTsKKwlyZXR1cm4g cmV0OworfQorCit2b2lkIHp5bnFtcF9kcF91bmJpbmQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1 Y3QgZGV2aWNlICptYXN0ZXIsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHp5bnFtcF9kcHN1YiAq ZHBzdWIgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgenlucW1wX2RwICpkcCA9IGRw c3ViLT5kcDsKKworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmZHAtPmhwZF93b3JrKTsKKwlk aXNhYmxlX2lycShkcC0+aXJxKTsKKwl6eW5xbXBfZHBfZXhpdF9hdXgoZHApOworCXp5bnFtcF9k cF9jb25uZWN0b3JfZGVzdHJveSgmZHAtPmNvbm5lY3Rvcik7CisJZHJtX2VuY29kZXJfY2xlYW51 cCgmZHAtPmVuY29kZXIpOworfQorCisvKgorICogUGxhdGZvcm0gZnVuY3Rpb25zCisgKi8KKwor c3RhdGljIGlycXJldHVybl90IHp5bnFtcF9kcF9pcnFfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpk YXRhKQoreworCXN0cnVjdCB6eW5xbXBfZHAgKmRwID0gKHN0cnVjdCB6eW5xbXBfZHAgKilkYXRh OworCXUzMiBzdGF0dXMsIG1hc2s7CisKKwlzdGF0dXMgPSB6eW5xbXBfZHBfcmVhZChkcC0+aW9t ZW0sIFpZTlFNUF9EUF9TVUJfVFhfSU5UUl9TVEFUVVMpOworCW1hc2sgPSB6eW5xbXBfZHBfcmVh ZChkcC0+aW9tZW0sIFpZTlFNUF9EUF9TVUJfVFhfSU5UUl9NQVNLKTsKKwlpZiAoIShzdGF0dXMg JiB+bWFzaykpCisJCXJldHVybiBJUlFfTk9ORTsKKworCS8qIGRiZyBmb3IgZGlhZ25vc3RpYywg YnV0IG5vdCBtdWNoIHRoYXQgdGhlIGRyaXZlciBjYW4gZG8gKi8KKwlpZiAoc3RhdHVzICYgWllO UU1QX0RQX1RYX0lOVFJfQ0hCVUZfVU5ERVJGTFdfTUFTSykKKwkJZGV2X2RiZ19yYXRlbGltaXRl ZChkcC0+ZGV2LCAidW5kZXJmbG93IGludGVycnVwdFxuIik7CisJaWYgKHN0YXR1cyAmIFpZTlFN UF9EUF9UWF9JTlRSX0NIQlVGX09WRVJGTFdfTUFTSykKKwkJZGV2X2RiZ19yYXRlbGltaXRlZChk cC0+ZGV2LCAib3ZlcmZsb3cgaW50ZXJydXB0XG4iKTsKKworCXp5bnFtcF9kcF93cml0ZShkcC0+ aW9tZW0sIFpZTlFNUF9EUF9TVUJfVFhfSU5UUl9TVEFUVVMsIHN0YXR1cyk7CisKKwkvKiBUaGUg RFAgdmJsYW5rIHdpbGwgbm90IGJlIGVuYWJsZWQgd2l0aCByZW1vdGUgY3J0YyBkZXZpY2UgKi8K KwlpZiAoc3RhdHVzICYgWllOUU1QX0RQX1RYX0lOVFJfVkJMQU5LX1NUQVJUKQorCQl6eW5xbXBf ZGlzcF9oYW5kbGVfdmJsYW5rKGRwLT5kcHN1Yi0+ZGlzcCk7CisKKwlpZiAoc3RhdHVzICYgWllO UU1QX0RQX1RYX0lOVFJfSFBEX0VWRU5UKQorCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmRwLT5o cGRfd29yaywgMCk7CisKKwlpZiAoc3RhdHVzICYgWllOUU1QX0RQX1RYX0lOVFJfSFBEX0lSUSkg eworCQlpbnQgcmV0OworCQl1OCBzdGF0dXNbRFBfTElOS19TVEFUVVNfU0laRSArIDJdOworCisJ CXJldCA9IGRybV9kcF9kcGNkX3JlYWQoJmRwLT5hdXgsIERQX1NJTktfQ09VTlQsIHN0YXR1cywK KwkJCQkgICAgICAgRFBfTElOS19TVEFUVVNfU0laRSArIDIpOworCQlpZiAocmV0IDwgMCkKKwkJ CWdvdG8gaGFuZGxlZDsKKworCQlpZiAoc3RhdHVzWzRdICYgRFBfTElOS19TVEFUVVNfVVBEQVRF RCB8fAorCQkgICAgIWRybV9kcF9jbG9ja19yZWNvdmVyeV9vaygmc3RhdHVzWzJdLCBkcC0+bW9k ZS5sYW5lX2NudCkgfHwKKwkJICAgICFkcm1fZHBfY2hhbm5lbF9lcV9vaygmc3RhdHVzWzJdLCBk cC0+bW9kZS5sYW5lX2NudCkpIHsKKwkJCXp5bnFtcF9kcF90cmFpbl9sb29wKGRwKTsKKwkJfQor CX0KKworaGFuZGxlZDoKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK2ludCB6eW5xbXBfZHBf cHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgenlucW1wX2Rw c3ViICpkcHN1YjsKKwlzdHJ1Y3QgenlucW1wX2RwICpkcDsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJl czsKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgaXJxLCByZXQ7CisKKwlkcCA9IGRldm1fa3phbGxv YygmcGRldi0+ZGV2LCBzaXplb2YoKmRwKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkcCkKKwkJcmV0 dXJuIC1FTk9NRU07CisKKwlkcC0+ZHBtcyA9IERSTV9NT0RFX0RQTVNfT0ZGOworCWRwLT5zdGF0 dXMgPSBjb25uZWN0b3Jfc3RhdHVzX2Rpc2Nvbm5lY3RlZDsKKwlkcC0+ZGV2ID0gJnBkZXYtPmRl djsKKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwgSU9SRVNPVVJD RV9NRU0sICJkcCIpOworCWRwLT5pb21lbSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZShkcC0+ZGV2 LCByZXMpOworCWlmIChJU19FUlIoZHAtPmlvbWVtKSkKKwkJcmV0dXJuIFBUUl9FUlIoZHAtPmlv bWVtKTsKKworCXp5bnFtcF9kcF93cml0ZShkcC0+aW9tZW0sIFpZTlFNUF9EUF9UWF9QSFlfUE9X RVJfRE9XTiwKKwkJCVpZTlFNUF9EUF9UWF9QSFlfUE9XRVJfRE9XTl9BTEwpOworCXp5bnFtcF9k cF9zZXQoZHAtPmlvbWVtLCBaWU5RTVBfRFBfVFhfUEhZX0NPTkZJRywKKwkJICAgICAgWllOUU1Q X0RQX1RYX1BIWV9DT05GSUdfQUxMX1JFU0VUKTsKKwl6eW5xbXBfZHBfd3JpdGUoZHAtPmlvbWVt LCBaWU5RTVBfRFBfVFhfRk9SQ0VfU0NSQU1CTEVSX1JFU0VULCAxKTsKKwl6eW5xbXBfZHBfd3Jp dGUoZHAtPmlvbWVtLCBaWU5RTVBfRFBfVFhfRU5BQkxFLCAwKTsKKworCWRwLT5udW1fbGFuZXMg PSAyOworCWZvciAoaSA9IDA7IGkgPCBaWU5RTVBfRFBfTUFYX0xBTkVTOyBpKyspIHsKKwkJY2hh ciBwaHlfbmFtZVsxNl07CisKKwkJc25wcmludGYocGh5X25hbWUsIHNpemVvZihwaHlfbmFtZSks ICJkcC1waHklZCIsIGkpOworCQlkcC0+cGh5W2ldID0gZGV2bV9waHlfZ2V0KGRwLT5kZXYsIHBo eV9uYW1lKTsKKwkJaWYgKElTX0VSUihkcC0+cGh5W2ldKSkgeworCQkJLyogMm5kIGxhbmUgaXMg b3B0aW9uYWwgKi8KKwkJCWlmIChpID09IDAgfHwgUFRSX0VSUihkcC0+cGh5W2ldKSAhPSAtRU5P REVWKSB7CisJCQkJaWYgKFBUUl9FUlIoZHAtPnBoeVtpXSkgIT0gLUVQUk9CRV9ERUZFUikgewor CQkJCQlkZXZfZXJyKGRwLT5kZXYsCisJCQkJCQkiZmFpbGVkIHRvIGdldCBwaHkgbGFuZVxuIik7 CisJCQkJfQorCQkJCXJldCA9IFBUUl9FUlIoZHAtPnBoeVtpXSk7CisJCQkJZHAtPnBoeVtpXSA9 IE5VTEw7CisJCQkJcmV0dXJuIHJldDsKKwkJCX0KKwkJCWRwLT5waHlbaV0gPSBOVUxMOworCQkJ ZHAtPm51bV9sYW5lcyA9IDE7CisJCX0KKwl9CisKKwlyZXQgPSB6eW5xbXBfZHBfaW5pdF9waHko ZHApOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcGh5OworCisJZHAtPmF1eC5uYW1lID0gIlp5 bnFNUCBEUCBBVVgiOworCWRwLT5hdXguZGV2ID0gZHAtPmRldjsKKwlkcC0+YXV4LnRyYW5zZmVy ID0genlucW1wX2RwX2F1eF90cmFuc2ZlcjsKKwlyZXQgPSBkcm1fZHBfYXV4X3JlZ2lzdGVyKCZk cC0+YXV4KTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGRwLT5kZXYsICJmYWlsZWQgdG8g aW5pdGlhbGl6ZSBEUCBhdXhcbiIpOworCQlnb3RvIGVycm9yOworCX0KKworCWlycSA9IHBsYXRm b3JtX2dldF9pcnEocGRldiwgMCk7CisJaWYgKGlycSA8IDApIHsKKwkJcmV0ID0gaXJxOworCQln b3RvIGVycm9yOworCX0KKworCXJldCA9IGRldm1fcmVxdWVzdF90aHJlYWRlZF9pcnEoZHAtPmRl diwgaXJxLCBOVUxMLAorCQkJCQl6eW5xbXBfZHBfaXJxX2hhbmRsZXIsIElSUUZfT05FU0hPVCwK KwkJCQkJZGV2X25hbWUoZHAtPmRldiksIGRwKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJv cjsKKwlkcC0+aXJxID0gaXJxOworCisJZHBzdWIgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2 KTsKKwlkcHN1Yi0+ZHAgPSBkcDsKKwlkcC0+ZHBzdWIgPSBkcHN1YjsKKworCXJldHVybiAwOwor CitlcnJvcjoKKwlkcm1fZHBfYXV4X3VucmVnaXN0ZXIoJmRwLT5hdXgpOworZXJyb3JfcGh5Ogor CXp5bnFtcF9kcF9leGl0X3BoeShkcCk7CisJcmV0dXJuIHJldDsKK30KKworaW50IHp5bnFtcF9k cF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgenlucW1w X2Rwc3ViICpkcHN1YiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCB6eW5x bXBfZHAgKmRwID0gZHBzdWItPmRwOworCisJenlucW1wX2RwX3dyaXRlKGRwLT5pb21lbSwgWllO UU1QX0RQX1RYX0VOQUJMRSwgMCk7CisJZHJtX2RwX2F1eF91bnJlZ2lzdGVyKCZkcC0+YXV4KTsK Kwl6eW5xbXBfZHBfZXhpdF9waHkoZHApOworCWRwc3ViLT5kcCA9IE5VTEw7CisKKwlyZXR1cm4g MDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS94bG54L3p5bnFtcF9kcC5oIGIvZHJp dmVycy9ncHUvZHJtL3hsbngvenlucW1wX2RwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg MDAwMDAwMC4uYTkzNjBmMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS94bG54 L3p5bnFtcF9kcC5oCkBAIC0wLDAgKzEsMzAgQEAKKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVy OiBHUEwtMi4wCisvKgorICogWnlucU1QIERpc3BsYXlQb3J0IERyaXZlcgorICoKKyAqICBDb3B5 cmlnaHQgKEMpIDIwMTcgLSAyMDE4IFhpbGlueCwgSW5jLgorICoKKyAqICBBdXRob3I6IEh5dW4g V29vIEt3b24gPGh5dW4ua3dvbkB4aWxpbnguY29tPgorICovCisKKyNpZm5kZWYgX1pZTlFNUF9E UF9IXworI2RlZmluZSBfWllOUU1QX0RQX0hfCisKK3N0cnVjdCBkZXZpY2U7CitzdHJ1Y3QgZHJt X2Rpc3BsYXlfbW9kZTsKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2U7CitzdHJ1Y3QgenlucW1wX2Rw OworCitjb25zdCBpbnQgenlucW1wX2RwX3NldF9jb2xvcihzdHJ1Y3QgenlucW1wX2RwICpkcCwg Y29uc3QgY2hhciAqY29sb3IpOwordm9pZCB6eW5xbXBfZHBfZW5hYmxlX3ZibGFuayhzdHJ1Y3Qg enlucW1wX2RwICpkcCk7Cit2b2lkIHp5bnFtcF9kcF9kaXNhYmxlX3ZibGFuayhzdHJ1Y3Qgenlu cW1wX2RwICpkcCk7Cit2b2lkIHp5bnFtcF9kcF9lbmNvZGVyX21vZGVfc2V0X3N0cmVhbShzdHJ1 Y3QgenlucW1wX2RwICpkcCwKKwkJCQkgICAgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1v ZGUpOworCitpbnQgenlucW1wX2RwX2JpbmQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2 aWNlICptYXN0ZXIsIHZvaWQgKmRhdGEpOwordm9pZCB6eW5xbXBfZHBfdW5iaW5kKHN0cnVjdCBk ZXZpY2UgKmRldiwgc3RydWN0IGRldmljZSAqbWFzdGVyLCB2b2lkICpkYXRhKTsKKworaW50IHp5 bnFtcF9kcF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KTsKK2ludCB6eW5xbXBf ZHBfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpOworCisjZW5kaWYgLyogX1pZ TlFNUF9EUF9IXyAqLwotLSAKMi43LjQKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fCmRyaS1kZXZlbCBtYWlsaW5nIGxpc3QKZHJpLWRldmVsQGxpc3RzLmZy ZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3Rp bmZvL2RyaS1kZXZlbAo=