From: "Valerie Henson" Subject: [RFC] Parallelize IO for e2fsck Date: Wed, 16 Jan 2008 13:30:43 -0800 Message-ID: <70b6f0bf0801161330y46ec555m5d4994a1eea7d045@mail.gmail.com> References: <70b6f0bf0801161322k2740a8dch6a0d6e6e112cd2d0@mail.gmail.com> Reply-To: val@vahconsulting.com Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_Part_9623_30099818.1200519043384" Cc: "Theodore Ts'o" , "Andreas Dilger" , "Ric Wheeler" To: linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, linux-kernel@vger.kernel.org Return-path: In-Reply-To: <70b6f0bf0801161322k2740a8dch6a0d6e6e112cd2d0@mail.gmail.com> Sender: linux-fsdevel-owner@vger.kernel.org List-Id: linux-ext4.vger.kernel.org ------=_Part_9623_30099818.1200519043384 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Content-Disposition: inline Hi y'all, This is a request for comments on the rewrite of the e2fsck IO parallelization patches I sent out a few months ago. The mechanism is totally different. Previously IO was parallelized by issuing IOs from multiple threads; now a single thread issues fadvise(WILLNEED) and then uses read() to complete the IO. Single disk performance doesn't change, but elapsed time drops by about 50% on a big RAID-5 box. Passes 1 and 2 are parallelized. Pass 5 is left as an exercise for the reader. Many thanks to the Lustre folks for their fadvise readahead patch which this patch uses and for comments and help in general. Our good friends at EMC Centera funded this work. Here are the top things I'd like feedback on: How to split up the patch? My take: * Indirect block only flag for iterate * IO manager readahead/release functions * Readahead infrastructure (readahead.c and related) * Readahead calls for pass 1 * Readahead calls for pass 2 Killing readahead properly is hard. I implemented it several ways and didn't like any of them. The current solution is still racy and completely untested. The whole thing needs to be autoconfed correctly. Bah. The user interface kinda sucks. It should at least take arguments of the form "128KB" or "52m" instead of number of file system blocks. Guessing the right amount of buffer cache to use and io requests to issue would also be good. ext2fs_get_next_inode_ptr() - With readahead, copying the inode in ext2fs_get_next_inode_full() costs about 2-3% of elapsed time. This is a hacked up version that just returns a pointer to the inode. The patch is against e2fsprogs 1.40.4 and is attached. Future patches will be split up and sent via quilt. Thanks! -VAL e2fsck/Makefile.in | 6 e2fsck/e2fsck.h | 5 e2fsck/pass1.c | 36 e2fsck/pass2.c | 12 e2fsck/unix.c | 18 lib/ext2fs/readahead.c | 1607 ++++++++++++++++++++++++++++++++ lib/ext2fs/Makefile.in | 1 lib/ext2fs/block.c | 20 lib/ext2fs/dosio.c | 2 lib/ext2fs/ext2_io.h | 10 lib/ext2fs/ext2fs.h | 42 lib/ext2fs/inode.c | 70 + lib/ext2fs/inode_io.c | 2 lib/ext2fs/io_manager.c | 12 lib/ext2fs/nt_io.c | 2 lib/ext2fs/test_io.c | 2 lib/ext2fs/unix_io.c | 41 17 files changed, 1873 insertions(+), 15 deletions(-) ------=_Part_9623_30099818.1200519043384 Content-Type: application/octet-stream; name=readahead Content-Transfer-Encoding: base64 X-Attachment-Id: f_fbidqst60 Content-Disposition: attachment; filename=readahead LS0tIGUyZnNwcm9ncy0xLjQwLjQub3JpZy9saWIvZXh0MmZzL2V4dDJfaW8uaAorKysgZTJmc3By b2dzLTEuNDAuNC9saWIvZXh0MmZzL2V4dDJfaW8uaApAQCAtNjMsNiArNjMsMTAgQEAgc3RydWN0 IHN0cnVjdF9pb19tYW5hZ2VyIHsKIAllcnJjb2RlX3QgKCpzZXRfYmxrc2l6ZSkoaW9fY2hhbm5l bCBjaGFubmVsLCBpbnQgYmxrc2l6ZSk7CiAJZXJyY29kZV90ICgqcmVhZF9ibGspKGlvX2NoYW5u ZWwgY2hhbm5lbCwgdW5zaWduZWQgbG9uZyBibG9jaywKIAkJCSAgICAgIGludCBjb3VudCwgdm9p ZCAqZGF0YSk7CisJZXJyY29kZV90ICgqcmVhZGFoZWFkKShpb19jaGFubmVsIGNoYW5uZWwsIHVu c2lnbmVkIGxvbmcgYmxvY2ssCisJCQkgICAgICAgaW50IGNvdW50KTsKKwllcnJjb2RlX3QgKCpj YWNoZV9yZWxlYXNlKShpb19jaGFubmVsIGNoYW5uZWwsIHVuc2lnbmVkIGxvbmcgYmxvY2ssCisJ CQkJICAgaW50IGNvdW50KTsKIAllcnJjb2RlX3QgKCp3cml0ZV9ibGspKGlvX2NoYW5uZWwgY2hh bm5lbCwgdW5zaWduZWQgbG9uZyBibG9jaywKIAkJCSAgICAgICBpbnQgY291bnQsIGNvbnN0IHZv aWQgKmRhdGEpOwogCWVycmNvZGVfdCAoKmZsdXNoKShpb19jaGFubmVsIGNoYW5uZWwpOwpAQCAt ODIsNiArODYsOCBAQCBzdHJ1Y3Qgc3RydWN0X2lvX21hbmFnZXIgewogI2RlZmluZSBpb19jaGFu bmVsX2Nsb3NlKGMpIAkJKChjKS0+bWFuYWdlci0+Y2xvc2UoKGMpKSkKICNkZWZpbmUgaW9fY2hh bm5lbF9zZXRfYmxrc2l6ZShjLHMpCSgoYyktPm1hbmFnZXItPnNldF9ibGtzaXplKChjKSxzKSkK ICNkZWZpbmUgaW9fY2hhbm5lbF9yZWFkX2JsayhjLGIsbixkKQkoKGMpLT5tYW5hZ2VyLT5yZWFk X2JsaygoYyksYixuLGQpKQorI2RlZmluZSBpb19jaGFubmVsX3JlYWRhaGVhZChjLGIsbikJKChj KS0+bWFuYWdlci0+cmVhZGFoZWFkKChjKSxiLG4pKQorI2RlZmluZSBpb19jaGFubmVsX2NhY2hl X3JlbGVhc2UoYyxiLG4pCSgoYyktPm1hbmFnZXItPmNhY2hlX3JlbGVhc2UoKGMpLGIsbikpCiAj ZGVmaW5lIGlvX2NoYW5uZWxfd3JpdGVfYmxrKGMsYixuLGQpCSgoYyktPm1hbmFnZXItPndyaXRl X2JsaygoYyksYixuLGQpKQogI2RlZmluZSBpb19jaGFubmVsX2ZsdXNoKGMpIAkJKChjKS0+bWFu YWdlci0+Zmx1c2goKGMpKSkKICNkZWZpbmUgaW9fY2hhbm5lbF9idW1wY291bnQoYykJCSgoYykt PnJlZmNvdW50KyspCkBAIC05Miw2ICs5OCwxMCBAQCBleHRlcm4gZXJyY29kZV90IGlvX2NoYW5u ZWxfc2V0X29wdGlvbnMoCiBleHRlcm4gZXJyY29kZV90IGlvX2NoYW5uZWxfd3JpdGVfYnl0ZShp b19jaGFubmVsIGNoYW5uZWwsIAogCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIG9mZnNldCwKIAkJ CQkgICAgICAgaW50IGNvdW50LCBjb25zdCB2b2lkICpkYXRhKTsKK2V4dGVybiBlcnJjb2RlX3Qg cmVhZGFoZWFkX25vb3AoaW9fY2hhbm5lbCBjaGFubmVsLCB1bnNpZ25lZCBsb25nIGJsb2NrLAor CQkJCWludCBjb3VudCk7CitleHRlcm4gZXJyY29kZV90IGNhY2hlX3JlbGVhc2Vfbm9vcChpb19j aGFubmVsIGNoYW5uZWwsIHVuc2lnbmVkIGxvbmcgYmxvY2ssCisJCQkJICAgIGludCBjb3VudCk7 CiAKIC8qIHVuaXhfaW8uYyAqLwogZXh0ZXJuIGlvX21hbmFnZXIgdW5peF9pb19tYW5hZ2VyOwot LS0gZTJmc3Byb2dzLTEuNDAuNC5vcmlnL2xpYi9leHQyZnMvdW5peF9pby5jCisrKyBlMmZzcHJv Z3MtMS40MC40L2xpYi9leHQyZnMvdW5peF9pby5jCkBAIC0xNyw2ICsxNywxMCBAQAogCiAjZGVm aW5lIF9MQVJHRUZJTEVfU09VUkNFCiAjZGVmaW5lIF9MQVJHRUZJTEU2NF9TT1VSQ0UKKy8qIEJl bG93IG5lZWRlZCBmb3IgZmFkdmlzZSAqLworI2RlZmluZSBfWE9QRU5fU09VUkNFIDYwMAorLyog V2l0aG91dCB0aGlzLCBmYWR2aXNlIGdvZXMgMzIgYml0PyAqLworI2RlZmluZSBfRklMRV9PRkZT RVRfQklUUyA2NAogCiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KQEAg LTc3LDYgKzgxLDEwIEBAIHN0YXRpYyBlcnJjb2RlX3QgdW5peF9jbG9zZShpb19jaGFubmVsIGMK IHN0YXRpYyBlcnJjb2RlX3QgdW5peF9zZXRfYmxrc2l6ZShpb19jaGFubmVsIGNoYW5uZWwsIGlu dCBibGtzaXplKTsKIHN0YXRpYyBlcnJjb2RlX3QgdW5peF9yZWFkX2Jsayhpb19jaGFubmVsIGNo YW5uZWwsIHVuc2lnbmVkIGxvbmcgYmxvY2ssCiAJCQkgICAgICAgaW50IGNvdW50LCB2b2lkICpk YXRhKTsKK3N0YXRpYyBlcnJjb2RlX3QgdW5peF9yZWFkYWhlYWQoaW9fY2hhbm5lbCBjaGFubmVs LCB1bnNpZ25lZCBsb25nIGJsb2NrLAorCQkJCWludCBjb3VudCk7CitzdGF0aWMgZXJyY29kZV90 IHVuaXhfY2FjaGVfcmVsZWFzZShpb19jaGFubmVsIGNoYW5uZWwsIHVuc2lnbmVkIGxvbmcgYmxv Y2ssCisJCQkJICAgIGludCBjb3VudCk7CiBzdGF0aWMgZXJyY29kZV90IHVuaXhfd3JpdGVfYmxr KGlvX2NoYW5uZWwgY2hhbm5lbCwgdW5zaWduZWQgbG9uZyBibG9jaywKIAkJCQlpbnQgY291bnQs IGNvbnN0IHZvaWQgKmRhdGEpOwogc3RhdGljIGVycmNvZGVfdCB1bml4X2ZsdXNoKGlvX2NoYW5u ZWwgY2hhbm5lbCk7CkBAIC0xMDMsNiArMTExLDggQEAgc3RhdGljIHN0cnVjdCBzdHJ1Y3RfaW9f bWFuYWdlciBzdHJ1Y3RfdQogCXVuaXhfY2xvc2UsCiAJdW5peF9zZXRfYmxrc2l6ZSwKIAl1bml4 X3JlYWRfYmxrLAorCXVuaXhfcmVhZGFoZWFkLAorCXVuaXhfY2FjaGVfcmVsZWFzZSwKIAl1bml4 X3dyaXRlX2JsaywKIAl1bml4X2ZsdXNoLAogI2lmZGVmIE5FRURfQk9VTkNFX0JVRkZFUgpAQCAt NTg3LDYgKzU5NywzNyBAQCBzdGF0aWMgZXJyY29kZV90IHVuaXhfcmVhZF9ibGsoaW9fY2hhbm5l CiAjZW5kaWYgLyogTk9fSU9fQ0FDSEUgKi8KIH0KIAorc3RhdGljIGVycmNvZGVfdCB1bml4X3Jl YWRhaGVhZChpb19jaGFubmVsIGNoYW5uZWwsIHVuc2lnbmVkIGxvbmcgYmxvY2ssCisJCQkJaW50 IGNvdW50KQoreworCXN0cnVjdCB1bml4X3ByaXZhdGVfZGF0YSAqZGF0YTsKKworCWRhdGEgPSAo c3RydWN0IHVuaXhfcHJpdmF0ZV9kYXRhICopY2hhbm5lbC0+cHJpdmF0ZV9kYXRhOworI2lmIERF QlVHCisJcHJpbnRmKCIgUkE6ICVzOiByZWFkYWhlYWQgJWx1LCAlZCBibG9ja3NcbiIsIF9fRlVO Q1RJT05fXywKKwkgICAgICAgYmxvY2ssIGNvdW50KTsKKyNlbmRpZgorCXBvc2l4X2ZhZHZpc2Uo ZGF0YS0+ZGV2LCAoZXh0Ml9sb2ZmX3QpYmxvY2sgKiBjaGFubmVsLT5ibG9ja19zaXplLAorCQkg ICAgICAoZXh0Ml9sb2ZmX3QpY291bnQgKiBjaGFubmVsLT5ibG9ja19zaXplLAorCQkgICAgICBQ T1NJWF9GQURWX1dJTExORUVEKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGVycmNvZGVfdCB1 bml4X2NhY2hlX3JlbGVhc2UoaW9fY2hhbm5lbCBjaGFubmVsLCB1bnNpZ25lZCBsb25nIGJsb2Nr LAorCQkJCSAgICBpbnQgY291bnQpCit7CisJc3RydWN0IHVuaXhfcHJpdmF0ZV9kYXRhICpkYXRh OworCisJZGF0YSA9IChzdHJ1Y3QgdW5peF9wcml2YXRlX2RhdGEgKiljaGFubmVsLT5wcml2YXRl X2RhdGE7CisjaWYgREVCVUcKKwlwcmludGYoIk1UOiAlczogcmVsZWFzZSAlbHUsICVkIGJsb2Nr c1xuIiwgX19GVU5DVElPTl9fLCBibG9jaywgY291bnQpOworI2VuZGlmCisJcG9zaXhfZmFkdmlz ZShkYXRhLT5kZXYsIChleHQyX2xvZmZfdClibG9jayAqIGNoYW5uZWwtPmJsb2NrX3NpemUsCisJ CSAgICAgIChleHQyX2xvZmZfdCljb3VudCAqIGNoYW5uZWwtPmJsb2NrX3NpemUsCisJCSAgICAg IFBPU0lYX0ZBRFZfRE9OVE5FRUQpOworCXJldHVybiAwOworfQorCiBzdGF0aWMgZXJyY29kZV90 IHVuaXhfd3JpdGVfYmxrKGlvX2NoYW5uZWwgY2hhbm5lbCwgdW5zaWduZWQgbG9uZyBibG9jaywK IAkJCQlpbnQgY291bnQsIGNvbnN0IHZvaWQgKmJ1ZikKIHsKLS0tIGUyZnNwcm9ncy0xLjQwLjQu b3JpZy9saWIvZXh0MmZzL2lub2RlX2lvLmMKKysrIGUyZnNwcm9ncy0xLjQwLjQvbGliL2V4dDJm cy9pbm9kZV9pby5jCkBAIC02NCw2ICs2NCw4IEBAIHN0YXRpYyBzdHJ1Y3Qgc3RydWN0X2lvX21h bmFnZXIgc3RydWN0X2kKIAlpbm9kZV9jbG9zZSwKIAlpbm9kZV9zZXRfYmxrc2l6ZSwKIAlpbm9k ZV9yZWFkX2JsaywKKwlyZWFkYWhlYWRfbm9vcCwKKwljYWNoZV9yZWxlYXNlX25vb3AsCiAJaW5v ZGVfd3JpdGVfYmxrLAogCWlub2RlX2ZsdXNoLAogCWlub2RlX3dyaXRlX2J5dGUKLS0tIGUyZnNw cm9ncy0xLjQwLjQub3JpZy9saWIvZXh0MmZzL2Rvc2lvLmMKKysrIGUyZnNwcm9ncy0xLjQwLjQv bGliL2V4dDJmcy9kb3Npby5jCkBAIC02NCw2ICs2NCw4IEBAIHN0YXRpYyBzdHJ1Y3Qgc3RydWN0 X2lvX21hbmFnZXIgc3RydWN0X2QKICAgICAgICAgZG9zX2Nsb3NlLAogICAgICAgICBkb3Nfc2V0 X2Jsa3NpemUsCiAgICAgICAgIGRvc19yZWFkX2JsaywKKyAgICAgICAgcmVhZGFoZWFkX25vb3As CisgICAgICAgIGNhY2hlX3JlbGVhc2Vfbm9vcCwKICAgICAgICAgZG9zX3dyaXRlX2JsaywKICAg ICAgICAgZG9zX2ZsdXNoCiB9OwotLS0gZTJmc3Byb2dzLTEuNDAuNC5vcmlnL2xpYi9leHQyZnMv bnRfaW8uYworKysgZTJmc3Byb2dzLTEuNDAuNC9saWIvZXh0MmZzL250X2lvLmMKQEAgLTIzNiw2 ICsyMzYsOCBAQCBzdGF0aWMgc3RydWN0IHN0cnVjdF9pb19tYW5hZ2VyIHN0cnVjdF9uCiAJbnRf Y2xvc2UsCiAJbnRfc2V0X2Jsa3NpemUsCiAJbnRfcmVhZF9ibGssCisJcmVhZGFoZWFkX25vb3As CisJY2FjaGVfcmVsZWFzZV9ub29wLAogCW50X3dyaXRlX2JsaywKIAludF9mbHVzaAogfTsKLS0t IGUyZnNwcm9ncy0xLjQwLjQub3JpZy9saWIvZXh0MmZzL3Rlc3RfaW8uYworKysgZTJmc3Byb2dz LTEuNDAuNC9saWIvZXh0MmZzL3Rlc3RfaW8uYwpAQCAtNzQsNiArNzQsOCBAQCBzdGF0aWMgc3Ry dWN0IHN0cnVjdF9pb19tYW5hZ2VyIHN0cnVjdF90CiAJdGVzdF9jbG9zZSwKIAl0ZXN0X3NldF9i bGtzaXplLAogCXRlc3RfcmVhZF9ibGssCisJcmVhZGFoZWFkX25vb3AsCisJY2FjaGVfcmVsZWFz ZV9ub29wLAogCXRlc3Rfd3JpdGVfYmxrLAogCXRlc3RfZmx1c2gsCiAJdGVzdF93cml0ZV9ieXRl LAotLS0gZTJmc3Byb2dzLTEuNDAuNC5vcmlnL2xpYi9leHQyZnMvaW9fbWFuYWdlci5jCisrKyBl MmZzcHJvZ3MtMS40MC40L2xpYi9leHQyZnMvaW9fbWFuYWdlci5jCkBAIC02NywzICs2NywxNSBA QCBlcnJjb2RlX3QgaW9fY2hhbm5lbF93cml0ZV9ieXRlKGlvX2NoYW5uCiAKIAlyZXR1cm4gRVhU Ml9FVF9VTklNUExFTUVOVEVEOwogfQorCitlcnJjb2RlX3QgcmVhZGFoZWFkX25vb3AoaW9fY2hh bm5lbCBjaGFubmVsLCB1bnNpZ25lZCBsb25nIGJsb2NrLAorCQkJIGludCBjb3VudCkKK3sKKwly ZXR1cm4gMDsKK30KKworZXJyY29kZV90IGNhY2hlX3JlbGVhc2Vfbm9vcChpb19jaGFubmVsIGNo YW5uZWwsIHVuc2lnbmVkIGxvbmcgYmxvY2ssCisJCQkgaW50IGNvdW50KQoreworCXJldHVybiAw OworfQotLS0gZTJmc3Byb2dzLTEuNDAuNC5vcmlnL2UyZnNjay9NYWtlZmlsZS5pbgorKysgZTJm c3Byb2dzLTEuNDAuNC9lMmZzY2svTWFrZWZpbGUuaW4KQEAgLTExOSwxNiArMTE5LDE2IEBAIGUy ZnNjazogZTJmc2NrLkBFMkZTQ0tfVFlQRUAKIGUyZnNjay5zdGF0aWM6ICQoT0JKUykgICQoU1RB VElDX0RFUExJQlMpCiAJQGVjaG8gIglMRCAkQCIKIAlAJChMRCkgJChBTExfTERGTEFHUykgJChM REZMQUdfU1RBVElDKSAtbyBlMmZzY2suc3RhdGljICQoT0JKUykgXAotCQkkKFNUQVRJQ19MSUJT KSAKKwkJJChTVEFUSUNfTElCUykgLWxwdGhyZWFkCiAKIGUyZnNjay5zaGFyZWQ6ICQoT0JKUykg ICQoREVQTElCUykKIAlAZWNobyAiCUxEICRAIgotCUAkKExEKSAkKEFMTF9MREZMQUdTKSAtbyBl MmZzY2suc2hhcmVkICQoT0JKUykgJChMSUJTKSAKKwlAJChMRCkgJChBTExfTERGTEFHUykgLW8g ZTJmc2NrLnNoYXJlZCAkKE9CSlMpICQoTElCUykgIC1scHRocmVhZAogCiBlMmZzY2sucHJvZmls ZWQ6ICQoUFJPRklMRURfT0JKUykgICQoUFJPRklMRURfREVQTElCUykKIAlAZWNobyAiCUxEICRA IgogCUAkKExEKSAkKEFMTF9MREZMQUdTKSAtZyAtcGcgLW8gZTJmc2NrLnByb2ZpbGVkICQoUFJP RklMRURfT0JKUykgXAotCQkkKFBST0ZJTEVEX0xJQlMpIAorCQkkKFBST0ZJTEVEX0xJQlMpICAt bHB0aHJlYWQKIAogdHN0X3JlZmNvdW50OiBlYV9yZWZjb3VudC5jCiAJQGVjaG8gIglMRCAkQCIK LS0tIGUyZnNwcm9ncy0xLjQwLjQub3JpZy9lMmZzY2svZTJmc2NrLmgKKysrIGUyZnNwcm9ncy0x LjQwLjQvZTJmc2NrL2UyZnNjay5oCkBAIC0zMzQsNiArMzM0LDExIEBAIHN0cnVjdCBlMmZzY2tf c3RydWN0IHsKIAlwcm9maWxlX3QJcHJvZmlsZTsKIAlpbnQgYmxvY2tzX3Blcl9wYWdlOwogCisg CS8qCisgCSAqIFJlYWRhaGVhZCBzdGF0ZQorIAkgKi8KKyAJc3RydWN0IHJlYWRhaGVhZF9zdGF0 ZSAqcmE7CisKIAkvKgogCSAqIEZvciB0aGUgdXNlIG9mIGNhbGxlcnMgb2YgdGhlIGUyZnNjayBm dW5jdGlvbnM7IG5vdCB1c2VkIGJ5CiAJICogZTJmc2NrIGZ1bmN0aW9ucyB0aGVtc2VsdmVzLgot LS0gZTJmc3Byb2dzLTEuNDAuNC5vcmlnL2UyZnNjay9wYXNzMS5jCisrKyBlMmZzcHJvZ3MtMS40 MC40L2UyZnNjay9wYXNzMS5jCkBAIC00NjMsNiArNDYzLDI1IEBAIGV4dGVybiB2b2lkIGUyZnNj a19zZXR1cF90ZGJfaWNvdW50KGUyZnMKIAkJKnJldCA9IDA7CiB9CiAKKy8qCisgKiBTaG91bGQg d2Ugc3VibWl0IHRoaXMgaW5vZGUgZm9yIHJlYWRhaGVhZD8KKyAqLworCitzdGF0aWMgaW50IHJl YWRhaGVhZF90aGlzX2lub2RlKHN0cnVjdCBleHQyX2lub2RlICppbm9kZSkKK3sKKwkvKiBEb2Vz IHRoaXMgaW5vZGUgaGF2ZSB2YWxpZCBibG9ja3MgKGkuZS4sIG5vdCBhIGZhc3Qgc3ltbGluayk/ ICovCisJaWYgKGV4dDJmc19pbm9kZV9oYXNfdmFsaWRfYmxvY2tzKGlub2RlKSAmJgorCSAgICAv KiBJcyBpdCBhIGRpcmVjdG9yeSBvciByZWd1bGFyIGZpbGU/ICovCisJICAgIChMSU5VWF9TX0lT RElSKGlub2RlLT5pX21vZGUpIHx8CisJICAgICBMSU5VWF9TX0lTUkVHKGlub2RlLT5pX21vZGUp KSAmJgorCSAgICAvKiBBbmQgZG9lcyBpdCBoYXZlIGluZGlyZWN0IGJsb2Nrcz8gKi8KKwkgICAg KGlub2RlLT5pX2Jsb2NrW0VYVDJfSU5EX0JMT0NLXSB8fAorCSAgICAgaW5vZGUtPmlfYmxvY2tb RVhUMl9ESU5EX0JMT0NLXSB8fAorCSAgICAgaW5vZGUtPmlfYmxvY2tbRVhUMl9USU5EX0JMT0NL XSkpCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCiB2b2lkIGUyZnNja19wYXNzMShlMmZz Y2tfdCBjdHgpCiB7CiAJaW50CWk7CkBAIC00ODMsNyArNTAyLDcgQEAgdm9pZCBlMmZzY2tfcGFz czEoZTJmc2NrX3QgY3R4KQogCWludAkJaW1hZ2ljX2ZzOwogCWludAkJYnVzdGVkX2ZzX3RpbWUg PSAwOwogCWludAkJaW5vZGVfc2l6ZTsKLQkKKwogI2lmZGVmIFJFU09VUkNFX1RSQUNLCiAJaW5p dF9yZXNvdXJjZV90cmFjaygmcnRyYWNrKTsKICNlbmRpZgpAQCAtNDk4LDYgKzUxNyw4IEBAIHZv aWQgZTJmc2NrX3Bhc3MxKGUyZnNja190IGN0eCkKIAkJCWN0eC0+ZGlyc190b19oYXNoID0gMDsK IAl9CiAKKwlleHQyZnNfcmVhZGFoZWFkX2lub2RlX2luaXQoY3R4LT5yYSwgcmVhZGFoZWFkX3Ro aXNfaW5vZGUpOworCiAjaWZkZWYgTVRSQUNFCiAJbXRyYWNlX3ByaW50KCJQYXNzIDEiKTsKICNl bmRpZgpAQCAtNjE5LDYgKzY0MCw4IEBAIHZvaWQgZTJmc2NrX3Bhc3MxKGUyZnNja190IGN0eCkK IAkgICAgKGZzLT5zdXBlci0+c19tdGltZSA8IGZzLT5zdXBlci0+c19pbm9kZXNfY291bnQpKQog CQlidXN0ZWRfZnNfdGltZSA9IDE7CiAKKwlleHQyZnNfcmVhZGFoZWFkX2lub2RlX3N0YXJ0KGN0 eC0+cmEpOworCiAJd2hpbGUgKDEpIHsKIAkJb2xkX29wID0gZWhhbmRsZXJfb3BlcmF0aW9uKF8o ImdldHRpbmcgbmV4dCBpbm9kZSBmcm9tIHNjYW4iKSk7CiAJCXBjdHguZXJyY29kZSA9IGV4dDJm c19nZXRfbmV4dF9pbm9kZV9mdWxsKHNjYW4sICZpbm8sIApAQCAtNjg3LDYgKzcxMCw4IEBAIHZv aWQgZTJmc2NrX3Bhc3MxKGUyZnNja190IGN0eCkKIAkJCX0KIAkJCWV4dDJmc19tYXJrX2lub2Rl X2JpdG1hcChjdHgtPmlub2RlX3VzZWRfbWFwLCBpbm8pOwogCQkJY2xlYXJfcHJvYmxlbV9jb250 ZXh0KCZwY3R4KTsKKwkJCS8qIElub2RlcyBhcmUgbm9ybWFsbHkgcmVsZWFzZWQgaW4gY2hlY2tf YmxvY2tzIGV4Y2VwdCBmb3IgdGhpcyBvbmUgKi8KKwkJCWV4dDJmc19yZWFkYWhlYWRfaW5vZGVf cmVsZWFzZShjdHgtPnJhLCBmcywgaW5vLCBibG9ja19idWYpOwogCQkJY29udGludWU7CiAJCX0g ZWxzZSBpZiAoaW5vID09IEVYVDJfUk9PVF9JTk8pIHsKIAkJCS8qCkBAIC05MzUsNiArOTYwLDcg QEAgdm9pZCBlMmZzY2tfcGFzczEoZTJmc2NrX3QgY3R4KQogCX0KIAlwcm9jZXNzX2lub2Rlcyhj dHgsIGJsb2NrX2J1Zik7CiAJZXh0MmZzX2Nsb3NlX2lub2RlX3NjYW4oc2Nhbik7CisJZXh0MmZz X3JlYWRhaGVhZF9pbm9kZV9leGl0KGN0eC0+cmEpOwogCiAJLyoKIAkgKiBJZiBhbnkgZXh0ZW5k ZWQgYXR0cmlidXRlIGJsb2NrcycgcmVmZXJlbmNlIGNvdW50cyBuZWVkIHRvCkBAIC0xMDMyLDYg KzEwNTgsOCBAQCBzdGF0aWMgZXJyY29kZV90IHNjYW5fY2FsbGJhY2soZXh0Ml9maWxzCiAJc2Nh bl9zdHJ1Y3QgPSAoc3RydWN0IHNjYW5fY2FsbGJhY2tfc3RydWN0ICopIHByaXZfZGF0YTsKIAlj dHggPSBzY2FuX3N0cnVjdC0+Y3R4OwogCQorCWV4dDJmc19yZWFkYWhlYWRfaW5vZGVfdGFibGVf cmVsZWFzZShjdHgtPnJhLCBmcywgZ3JvdXApOworCiAJcHJvY2Vzc19pbm9kZXMoKGUyZnNja190 KSBmcy0+cHJpdl9kYXRhLCBzY2FuX3N0cnVjdC0+YmxvY2tfYnVmKTsKIAogCWlmIChjdHgtPnBy b2dyZXNzKQpAQCAtMTUxNSwxMCArMTU0MywxNCBAQCBzdGF0aWMgdm9pZCBjaGVja19ibG9ja3Mo ZTJmc2NrX3QgY3R4LCBzCiAJaWYgKGlub2RlLT5pX2ZpbGVfYWNsICYmIGNoZWNrX2V4dF9hdHRy KGN0eCwgcGN0eCwgYmxvY2tfYnVmKSkKIAkJcGIubnVtX2Jsb2NrcysrOwogCi0JaWYgKGV4dDJm c19pbm9kZV9oYXNfdmFsaWRfYmxvY2tzKGlub2RlKSkKKwlpZiAoZXh0MmZzX2lub2RlX2hhc192 YWxpZF9ibG9ja3MoaW5vZGUpKSB7CiAJCXBjdHgtPmVycmNvZGUgPSBleHQyZnNfYmxvY2tfaXRl cmF0ZTIoZnMsIGlubywKIAkJCQkgICAgICAgcGIuaXNfZGlyID8gQkxPQ0tfRkxBR19IT0xFIDog MCwKIAkJCQkgICAgICAgYmxvY2tfYnVmLCBwcm9jZXNzX2Jsb2NrLCAmcGIpOworCQkvKiBSZWxl YXNlIGl0IGlmIHdlIHJlYWQgaXQgaW4gdGhlIGZpcnN0IHBsYWNlICovCisJCWlmIChyZWFkYWhl YWRfdGhpc19pbm9kZShpbm9kZSkpCisJCQlleHQyZnNfcmVhZGFoZWFkX2lub2RlX3JlbGVhc2Uo Y3R4LT5yYSwgZnMsIGlubywgYmxvY2tfYnVmKTsKKwl9CiAJZW5kX3Byb2JsZW1fbGF0Y2goY3R4 LCBQUl9MQVRDSF9CTE9DSyk7CiAJZW5kX3Byb2JsZW1fbGF0Y2goY3R4LCBQUl9MQVRDSF9UT09C SUcpOwogCWlmIChjdHgtPmZsYWdzICYgRTJGX0ZMQUdfU0lHTkFMX01BU0spCi0tLSBlMmZzcHJv Z3MtMS40MC40Lm9yaWcvZTJmc2NrL3VuaXguYworKysgZTJmc3Byb2dzLTEuNDAuNC9lMmZzY2sv dW5peC5jCkBAIC01Nyw2ICs1Nyw4IEBAIHN0YXRpYyBpbnQgbm9ybWFsaXplX3N3YXBmczsKIHN0 YXRpYyBpbnQgY2ZsYWc7CQkvKiBjaGVjayBkaXNrICovCiBzdGF0aWMgaW50IHNob3dfdmVyc2lv bl9vbmx5Owogc3RhdGljIGludCB2ZXJib3NlOworc3RhdGljIHVuc2lnbmVkIGludCBtYXhfaW9z Oworc3RhdGljIHVuc2lnbmVkIGludCBjYWNoZV9tYXg7CiAKIHN0YXRpYyBpbnQgcmVwbGFjZV9i YWRfYmxvY2tzOwogc3RhdGljIGludCBrZWVwX2JhZF9ibG9ja3M7CkBAIC03NCw2ICs3Niw3IEBA IHN0YXRpYyB2b2lkIHVzYWdlKGUyZnNja190IGN0eCkKIAkJXygiVXNhZ2U6ICVzIFstcGFueXJj ZGZ2c3RERlNWXSBbLWIgc3VwZXJibG9ja10gWy1CIGJsb2Nrc2l6ZV1cbiIKIAkJIlx0XHRbLUkg aW5vZGVfYnVmZmVyX2Jsb2Nrc10gWy1QIHByb2Nlc3NfaW5vZGVfc2l6ZV1cbiIKIAkJIlx0XHRb LWx8LUwgYmFkX2Jsb2Nrc19maWxlXSBbLUMgZmRdIFstaiBleHRlcm5hbF9qb3VybmFsXVxuIgor CQkiXHRcdFstQSBtYXhpbXVtX2NvbmN1cnJlbnRfaW9zXSBbLW0gbWF4aW11bV9tZW1vcnldXG4i CiAJCSJcdFx0Wy1FIGV4dGVuZGVkLW9wdGlvbnNdIGRldmljZVxuIiksCiAJCWN0eC0+cHJvZ3Jh bV9uYW1lKTsKIApAQCAtNjE5LDggKzYyMiwxMSBAQCBzdGF0aWMgZXJyY29kZV90IFBSUyhpbnQg YXJnYywgY2hhciAqYXJnCiAJCWN0eC0+cHJvZ3JhbV9uYW1lID0gKmFyZ3Y7CiAJZWxzZQogCQlj dHgtPnByb2dyYW1fbmFtZSA9ICJlMmZzY2siOwotCXdoaWxlICgoYyA9IGdldG9wdCAoYXJnYywg YXJndiwgInBhbnlyY0M6QjpkRTpmdnRGVk06YjpJOmo6UDpsOkw6TjpTc0RrIikpICE9IEVPRikK Kwl3aGlsZSAoKGMgPSBnZXRvcHQgKGFyZ2MsIGFyZ3YsICJwYUE6bnlyY0M6QjpkRTpmdnRGVm06 TTpiOkk6ajpQOmw6TDpOOlNzRGsiKSkgIT0gRU9GKQogCQlzd2l0Y2ggKGMpIHsKKwkJY2FzZSAn QSc6CisJCQltYXhfaW9zID0gYXRvaShvcHRhcmcpOworCQkJYnJlYWs7CiAJCWNhc2UgJ0MnOgog CQkJY3R4LT5wcm9ncmVzcyA9IGUyZnNja191cGRhdGVfcHJvZ3Jlc3M7CiAJCQlyZXMgPSBzc2Nh bmYob3B0YXJnLCAiJWQiLCAmY3R4LT5wcm9ncmVzc19mZCk7CkBAIC03MjcsNiArNzMzLDEwIEBA IHN0YXRpYyBlcnJjb2RlX3QgUFJTKGludCBhcmdjLCBjaGFyICphcmcKIAkJY2FzZSAnVic6CiAJ CQlzaG93X3ZlcnNpb25fb25seSA9IDE7CiAJCQlicmVhazsKKwkJY2FzZSAnbSc6CisJCQkvKiBY WFggc2hvdWxkIGhhbmRsZSAzTSBhbmQgNTRrYiB0eXBlIHN0dWZmICovCisJCQljYWNoZV9tYXgg PSBhdG9pKG9wdGFyZyk7CisJCQlicmVhazsKICNpZmRlZiBNVFJBQ0UKIAkJY2FzZSAnTSc6CiAJ CQltYWxsd2F0Y2ggPSAodm9pZCAqKSBzdHJ0b2wob3B0YXJnLCBOVUxMLCAwKTsKQEAgLTEyNDQs NyArMTI1NCwxMyBAQCByZXN0YXJ0OgogCWVsc2UKIAkJam91cm5hbF9zaXplID0gLTE7CiAKKwlp ZiAoZXh0MmZzX3JlYWRhaGVhZF9pbml0KGN0eC0+ZnMsIG1heF9pb3MsIGNhY2hlX21heCwgJmN0 eC0+cmEpKQorCQlwcmludGYoXygiUmVhZGFoZWFkIGZhaWxlZCB0byBzdGFydCwgZGlzYWJsZWQu XG4iKSk7CisKIAlydW5fcmVzdWx0ID0gZTJmc2NrX3J1bihjdHgpOworCisJZXh0MmZzX3JlYWRh aGVhZF9leGl0KCZjdHgtPnJhKTsKKwogCWUyZnNja19jbGVhcl9wcm9nYmFyKGN0eCk7CiAKIAlp ZiAoY3R4LT5mbGFncyAmIEUyRl9GTEFHX0pPVVJOQUxfSU5PREUpIHsKLS0tIGUyZnNwcm9ncy0x LjQwLjQub3JpZy9saWIvZXh0MmZzL01ha2VmaWxlLmluCisrKyBlMmZzcHJvZ3MtMS40MC40L2xp Yi9leHQyZnMvTWFrZWZpbGUuaW4KQEAgLTU5LDYgKzU5LDcgQEAgT0JKUz0gJChERUJVR0ZTX0xJ Ql9PQkpTKSAkKFJFU0laRV9MSUJfTwogCW9wZW5mcy5vIFwKIAlyZWFkX2JiLm8gXAogCXJlYWRf YmJfZmlsZS5vIFwKKwlyZWFkYWhlYWQubyBcCiAJcmVzX2dkdC5vIFwKIAlyd19iaXRtYXBzLm8g XAogCXN3YXBmcy5vIFwKLS0tIGUyZnNwcm9ncy0xLjQwLjQub3JpZy9saWIvZXh0MmZzL2Jsb2Nr LmMKKysrIGUyZnNwcm9ncy0xLjQwLjQvbGliL2V4dDJmcy9ibG9jay5jCkBAIC01OSw2ICs1OSw5 IEBAIHN0YXRpYyBpbnQgYmxvY2tfaXRlcmF0ZV9pbmQoYmxrX3QgKmluZF8KIAkJcmV0IHw9IEJM T0NLX0VSUk9SOwogCQlyZXR1cm4gcmV0OwogCX0KKwlpZiAoY3R4LT5mbGFncyAmIEJMT0NLX0ZM QUdfSU5EX09OTFkpCisJCXJldHVybiByZXQ7CisKIAljdHgtPmVycmNvZGUgPSBleHQyZnNfcmVh ZF9pbmRfYmxvY2soY3R4LT5mcywgKmluZF9ibG9jaywgCiAJCQkJCSAgICAgY3R4LT5pbmRfYnVm KTsKIAlpZiAoY3R4LT5lcnJjb2RlKSB7CkBAIC0yNTksNyArMjYyLDYgQEAgc3RhdGljIGludCBi bG9ja19pdGVyYXRlX3RpbmQoYmxrX3QgKnRpbgogCQlyZXQgfD0gKCpjdHgtPmZ1bmMpKGN0eC0+ ZnMsIHRpbmRfYmxvY2ssCiAJCQkJICAgIEJMT0NLX0NPVU5UX1RJTkQsIHJlZl9ibG9jaywKIAkJ CQkgICAgcmVmX29mZnNldCwgY3R4LT5wcml2X2RhdGEpOwotCQogCXJldHVybiByZXQ7CiB9CiAJ CkBAIC0zNDIsMTQgKzM0NCwxNyBAQCBlcnJjb2RlX3QgZXh0MmZzX2Jsb2NrX2l0ZXJhdGUyKGV4 dDJfZmlsCiAJLyoKIAkgKiBJdGVyYXRlIG92ZXIgbm9ybWFsIGRhdGEgYmxvY2tzCiAJICovCi0J Zm9yIChpID0gMDsgaSA8IEVYVDJfTkRJUl9CTE9DS1MgOyBpKyssIGN0eC5iY291bnQrKykgewot CQlpZiAoYmxvY2tzW2ldIHx8IChmbGFncyAmIEJMT0NLX0ZMQUdfQVBQRU5EKSkgewotCQkJcmV0 IHw9ICgqY3R4LmZ1bmMpKGZzLCAmYmxvY2tzW2ldLAotCQkJCQkgICAgY3R4LmJjb3VudCwgMCwg aSwgcHJpdl9kYXRhKTsKLQkJCWlmIChyZXQgJiBCTE9DS19BQk9SVCkKLQkJCQlnb3RvIGFib3J0 X2V4aXQ7CisJaWYgKCEoZmxhZ3MgJiBCTE9DS19GTEFHX0lORF9PTkxZKSkgeworCQlmb3IgKGkg PSAwOyBpIDwgRVhUMl9ORElSX0JMT0NLUyA7IGkrKywgY3R4LmJjb3VudCsrKSB7CisJCQlpZiAo YmxvY2tzW2ldIHx8IChmbGFncyAmIEJMT0NLX0ZMQUdfQVBQRU5EKSkgeworCQkJCXJldCB8PSAo KmN0eC5mdW5jKShmcywgJmJsb2Nrc1tpXSwKKwkJCQkJCSAgIGN0eC5iY291bnQsIDAsIGksIHBy aXZfZGF0YSk7CisJCQkJaWYgKHJldCAmIEJMT0NLX0FCT1JUKQorCQkJCQlnb3RvIGFib3J0X2V4 aXQ7CisJCQl9CiAJCX0KIAl9CisKIAlpZiAoKihibG9ja3MgKyBFWFQyX0lORF9CTE9DSykgfHwg KGZsYWdzICYgQkxPQ0tfRkxBR19BUFBFTkQpKSB7CiAJCXJldCB8PSBibG9ja19pdGVyYXRlX2lu ZChibG9ja3MgKyBFWFQyX0lORF9CTE9DSywKIAkJCQkJIDAsIEVYVDJfSU5EX0JMT0NLLCAmY3R4 KTsKQEAgLTQzNCw0ICs0MzksMyBAQCBlcnJjb2RlX3QgZXh0MmZzX2Jsb2NrX2l0ZXJhdGUoZXh0 Ml9maWxzCiAJcmV0dXJuIGV4dDJmc19ibG9ja19pdGVyYXRlMihmcywgaW5vLCBCTE9DS19GTEFH X05PX0xBUkdFIHwgZmxhZ3MsCiAJCQkJICAgICBibG9ja19idWYsIHhsYXRlX2Z1bmMsICZ4bCk7 CiB9Ci0KLS0tIGUyZnNwcm9ncy0xLjQwLjQub3JpZy9saWIvZXh0MmZzL2V4dDJmcy5oCisrKyBl MmZzcHJvZ3MtMS40MC40L2xpYi9leHQyZnMvZXh0MmZzLmgKQEAgLTI3OCw2ICsyNzgsOSBAQCBz dHJ1Y3Qgc3RydWN0X2V4dDJfZmlsc3lzIHsKICAqIEJMT0NLX0ZMQUdfREFUQV9PTkxZIGluZGlj YXRlcyB0aGF0IHRoZSBpdGVyYXRvciBmdW5jdGlvbiBzaG91bGQgYmUKICAqIGNhbGxlZCBmb3Ig ZGF0YSBibG9ja3Mgb25seS4KICAqCisgKiBCTE9DS19GTEFHX0lORF9PTkxZIGlzIHRoZSBvcHBv c2l0ZSBvZiBCTE9DS19GTEFHX0RBVEFfT05MWSAtIG9ubHkKKyAqIGNhbGwgdGhlIGl0ZXJhdGUg ZnVuY3Rpb24gZm9yIGluZGlyZWN0IGJsb2Nrcy4KKyAqCiAgKiBCTE9DS19GTEFHX05PX0xBUkdF IGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seS4gIEl0IGluZm9ybXMKICAqIGV4dDJmc19ibG9ja19p dGVyYXRlMiB0aGF0IGxhcmdlIGZpbGVzIHdvbid0IGJlIGFjY2VwdGVkLgogICovCkBAIC0yODUs NiArMjg4LDcgQEAgc3RydWN0IHN0cnVjdF9leHQyX2ZpbHN5cyB7CiAjZGVmaW5lIEJMT0NLX0ZM QUdfSE9MRQkJMQogI2RlZmluZSBCTE9DS19GTEFHX0RFUFRIX1RSQVZFUlNFCTIKICNkZWZpbmUg QkxPQ0tfRkxBR19EQVRBX09OTFkJNAorI2RlZmluZSBCTE9DS19GTEFHX0lORF9PTkxZCTgKIAog I2RlZmluZSBCTE9DS19GTEFHX05PX0xBUkdFCTB4MTAwMAogCkBAIC04MDgsNiArODEyLDggQEAg ZXh0ZXJuIGVycmNvZGVfdCBleHQyZnNfZ2V0X25leHRfaW5vZGVfZgogCQkJCQkgICAgZXh0Ml9p bm9fdCAqaW5vLAogCQkJCQkgICAgc3RydWN0IGV4dDJfaW5vZGUgKmlub2RlLCAKIAkJCQkJICAg IGludCBidWZzaXplKTsKK2VycmNvZGVfdCBleHQyZnNfZ2V0X25leHRfaW5vZGVfcHRyKGV4dDJf aW5vZGVfc2NhbiBzY2FuLCBleHQyX2lub190ICppbm8sCisJCQkJICAgIHN0cnVjdCBleHQyX2lu b2RlICoqaW5vZGUpOwogZXh0ZXJuIGVycmNvZGVfdCBleHQyZnNfb3Blbl9pbm9kZV9zY2FuKGV4 dDJfZmlsc3lzIGZzLCBpbnQgYnVmZmVyX2Jsb2NrcywKIAkJCQkgIGV4dDJfaW5vZGVfc2NhbiAq cmV0X3NjYW4pOwogZXh0ZXJuIHZvaWQgZXh0MmZzX2Nsb3NlX2lub2RlX3NjYW4oZXh0Ml9pbm9k ZV9zY2FuIHNjYW4pOwpAQCAtOTA3LDYgKzkxMyw0MiBAQCBlcnJjb2RlX3QgZXh0MmZzX2xpbmso ZXh0Ml9maWxzeXMgZnMsIGV4CiBlcnJjb2RlX3QgZXh0MmZzX3VubGluayhleHQyX2ZpbHN5cyBm cywgZXh0Ml9pbm9fdCBkaXIsIGNvbnN0IGNoYXIgKm5hbWUsCiAJCQlleHQyX2lub190IGlubywg aW50IGZsYWdzKTsKIAorLyogcmVhZGFoZWFkLmMgKi8KKworc3RydWN0IHJlYWRhaGVhZF9zdGF0 ZTsKKworLyogR2VuZXJpYyByZWFkYWhlYWQgc3RhcnQvc3RvcCBmdW5jdGlvbnMgKi8KKworZXJy Y29kZV90IGV4dDJmc19yZWFkYWhlYWRfaW5pdChleHQyX2ZpbHN5cyBmcywgdW5zaWduZWQgaW50 IG1heF9pb3MsCisJCQkJdW5zaWduZWQgaW50IG1heF9tZW0sCisJCQkJc3RydWN0IHJlYWRhaGVh ZF9zdGF0ZSAqKnJldF9yYSk7Cit2b2lkIGV4dDJmc19yZWFkYWhlYWRfZXhpdChzdHJ1Y3QgcmVh ZGFoZWFkX3N0YXRlICoqcmV0X3JhKTsKK3ZvaWQgZXh0MmZzX3JlYWRhaGVhZF9raWxsKHN0cnVj dCByZWFkYWhlYWRfc3RhdGUgKnJhKTsKKworLyogSW5vZGUgcmVhZGFoZWFkIChwYXNzIDEpICov CisKK3ZvaWQgZXh0MmZzX3JlYWRhaGVhZF9pbm9kZV9pbml0KHN0cnVjdCByZWFkYWhlYWRfc3Rh dGUgKnJhLAorCQkJCSBpbnQgKCpzaG91bGRfcmVhZF9pbm9kZSkoc3RydWN0IGV4dDJfaW5vZGUg KikpOwordm9pZCBleHQyZnNfcmVhZGFoZWFkX2lub2RlX3N0YXJ0KHN0cnVjdCByZWFkYWhlYWRf c3RhdGUgKnJhKTsKK3ZvaWQgZXh0MmZzX3JlYWRhaGVhZF9pbm9kZV9leGl0KHN0cnVjdCByZWFk YWhlYWRfc3RhdGUgKnJhKTsKK3ZvaWQgZXh0MmZzX3JlYWRhaGVhZF9pbm9kZV9yZWxlYXNlKHN0 cnVjdCByZWFkYWhlYWRfc3RhdGUgKnJhLCBleHQyX2ZpbHN5cyBmcywKKwkJCQkgICAgZXh0Ml9p bm9fdCBpbm8sIGNoYXIgKmJsb2NrX2J1Zik7Cit2b2lkIGV4dDJmc19yZWFkYWhlYWRfaW5vZGVf dGFibGVfcmVsZWFzZShzdHJ1Y3QgcmVhZGFoZWFkX3N0YXRlICpyYSwKKwkJCQkJICBleHQyX2Zp bHN5cyBmcywgZGdycF90IGdyb3VwKTsKKy8qIERpcmVjdG9yeSBibG9jayByZWFkYWhlYWQgKHBh c3MgMikgKi8KKwordm9pZCBleHQyZnNfcmVhZGFoZWFkX2RibGlzdF9pbml0KHN0cnVjdCByZWFk YWhlYWRfc3RhdGUgKnJhLAorCQkJCSAgZXh0Ml9kYmxpc3QgZGJsaXN0KTsKK3ZvaWQgZXh0MmZz X3JlYWRhaGVhZF9kYmxpc3Rfc3RhcnQoc3RydWN0IHJlYWRhaGVhZF9zdGF0ZSAqcmEpOwordm9p ZCBleHQyZnNfcmVhZGFoZWFkX2RibGlzdF9leGl0KHN0cnVjdCByZWFkYWhlYWRfc3RhdGUgKnJh KTsKK3ZvaWQgZXh0MmZzX3JlYWRhaGVhZF9kYmxpc3RfcmVsZWFzZShzdHJ1Y3QgcmVhZGFoZWFk X3N0YXRlICpyYSwKKwkJCQkgICAgIGV4dDJfZmlsc3lzIGZzLCBibGtfdCBibGspOworCisvKiBQ cml2YXRlIHRvIHJlYWRhaGVhZCBpbXBsZW1lbnRhdGlvbiAqLworCit2b2lkICogcmVhZGFoZWFk X2lub2RlX2xvb3Aodm9pZCAqYXJnKTsKK3ZvaWQgKiByZWFkYWhlYWRfZGJsaXN0KHZvaWQgKmFy Zyk7CisKIC8qIHJlYWRfYmIuYyAqLwogZXh0ZXJuIGVycmNvZGVfdCBleHQyZnNfcmVhZF9iYl9p bm9kZShleHQyX2ZpbHN5cyBmcywKIAkJCQkgICAgICBleHQyX2JhZGJsb2Nrc19saXN0ICpiYl9s aXN0KTsKLS0tIC9kZXYvbnVsbAorKysgZTJmc3Byb2dzLTEuNDAuNC9saWIvZXh0MmZzL3JlYWRh aGVhZC5jCkBAIC0wLDAgKzEsMTYwNyBAQAorLyoKKyAqIHJlYWRhaGVhZC5jIC0tLSBGYXN0LCBw YXJhbGxlbCByZWFkYWhlYWQgb2YgZmlsZSBzeXN0ZW0gc3RydWN0dXJlcworICoKKyAqIENvcHly aWdodCAoQykgMjAwNy0yMDA4IFZhbGVyaWUgSGVuc29uIDx2YWxAbm10LmVkdT4KKyAqCisgKiAl QmVnaW4tSGVhZGVyJQorICogVGhpcyBmaWxlIG1heSBiZSByZWRpc3RyaWJ1dGVkIHVuZGVyIHRo ZSB0ZXJtcyBvZiB0aGUgR05VIFB1YmxpYworICogTGljZW5zZS4KKyAqICVFbmQtSGVhZGVyJQor ICoKKyAqIEdlbmVyaWMgcmVhZGFoZWFkIGZ1bmN0aW9ucyBmb3IgdXNlcnMgb2YgZXh0MiBsaWIu CisgKgorICogVGhlIGdlbmVyYWwgdGhlb3J5IG9mIHJlYWRhaGVhZCBpcyB0aGF0IHRoZSBtYWlu IHRocmVhZCAoZnNjayBpbgorICogbW9zdCBjYXNlcykgc3Bhd25zIGEgc2Vjb25kIHRocmVhZCwg dGhlIHJlYWRhaGVhZCB0aHJlYWQsIHRvIGdvCisgKiBwcmVyZWFkIHRoZSBmaWxlIHN5c3RlbSBz dHJ1Y3R1cmVzLiAgVGhlIHJlYWRhaGVhZCB0aHJlYWQgcmVsaWVzIG9uCisgKiB0aGUgYnVmZmVy IGNhY2hlIHRvIHN0b3JlIHRoZSBibG9ja3MgaXQgaGFzIHByZS1yZWFkIC0gaXQncyBzb3J0IG9m CisgKiBtYW5hZ2luZyB0aGUgYnVmZmVyIGNhY2hlIGJsaW5kZm9sZGVkLiAgU2ltaWxhcmx5LCB0 aGUgcmVhZGFoZWFkCisgKiB0aHJlYWQgYWxzbyBrZWVwcyB0cmFjayBvZiBob3cgbWFueSBpb3Mg aXQgaGFzIHN1Ym1pdHR0ZWQgdG8gdGhlCisgKiBkZXZpY2Ugd2hpY2ggaGF2ZSBub3QgeWV0IGNv bXBsZXRlZCwgc28gaXQgY2FuIGF2b2lkIG92ZXJmbG93aW5nCisgKiB0aGUgZGV2aWNlIGlvIHF1 ZXVlLiAgVGhpcyBpcyBhbHNvIGRvbmUgd2l0aG91dCBhbnkgcmVhbAorICogY29tbXVuaWNhdGlv biB3aXRoIHRoZSBhY3R1YWwgZGV2aWNlIHF1ZXVlOyB3ZSdyZSBqdXN0IGd1ZXNzaW5nIGZvcgor ICogdGhlIG1vc3QgcGFydC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgZGl2aWRlZCBpbnRvIGNhbGxz IG1hZGUgYnkgdGhlIHJlYWRhaGVhZCB0aHJlYWQgYW5kCisgKiBjYWxscyBtYWRlIGJ5IHRoZSBt YWluIHRocmVhZC4KKyAqCisgKiBSZWFkYWhlYWQgaXMgdHVybmVkIG9mZiBieSBkZWZhdWx0LCBh cyBpdCBnaXZlcyBtaW5pbWFsIG9yIHplcm8KKyAqIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50IG9u IHNpbmdsZSBkaXNrIHN5c3RlbXMsIHdoaWNoIG1ha2UgdXAgdGhlCisgKiBtYWpvcml0eSBvZiBm aWxlIHN5c3RlbXMgaW4gTGludXguCisgKgorICogQ2FjaGUgbWFuYWdlbWVudDoKKyAqCisgKiBU aGUgdG90YWwgYW1vdW50IG9mIGNhY2hlIHRvIHVzZSBpcyBzZXQgYnkgYSBjb21tYW5kLWxpbmUg b3B0aW9uLgorICogVGhpcyBzaG91bGQgYmUgYSBsaXR0bGUgYml0IHNtYWxsZXIgdGhhbiB0aGUg bWF4aW11bSBtZW1vcnkKKyAqIGF2YWlsYWJsZSBmb3IgYnVmZmVyIGNhY2hlIC0gaS5lLiwgbm90 IGFsbCBvZiBmcmVlIG1lbW9yeSwgc2luY2UKKyAqIGJ1ZmZlciBjYWNoZSBpcyB1c3VhbGx5IGxp bWl0ZWQgdG8gc29tZSBmcmFjdGlvbiBvZiBhbGwgbWVtb3J5LgorICogU2V0dGluZyB0aGUgbWF4 aW11bSBjYWNoZSB0byBncmVhdGVyIHRoYW4gdGhlIGJ1ZmZlciBjYWNoZSB3aWxsCisgKiBhcHBy b3hpbWF0ZWx5IGRvdWJsZSBlbGFwc2VkIHRpbWUsIHNpbmNlIGFsbCBvZiB0aGUgZmlsZSBzeXN0 ZW0KKyAqIGRhdGEgd2lsbCBiZSByZWFkIGZyb20gZGlzayB0d2ljZSAtIG9uY2UgYnkgcmVhZGFo ZWFkLCBhbmQgYWZ0ZXIgaXQKKyAqIGhhcyBiZWVuIGV2aWN0ZWQgYnkgb3RoZXIgcHJlLXJlYWQg YmxvY2tzLCBhIHNlY29uZCB0aW1lIGJ5IHRoZQorICogbWFpbiB0aHJlYWQuICBUaGlzIGlzIGJh ZC4gIEN1cnJlbnRseSwgSSBmaWd1cmUgb3V0IHdoYXQgdGhlIGJ1ZmZlcgorICogY2FjaGUgbWF4 aW11bSBpcyBieSBydW5uaW5nIHZtc3RhdCBhbmQgcmVhZGluZyB0aGUgImJ1ZmYiIGZpZWxkLgor ICoKKyAqIFRoZSAqX3JlYWRhaGVhZCBmdW5jdGlvbnMgYXJlIGNhbGxlZCBieSB0aGUgcmVhZGFo ZWFkIHRocmVhZCBhbmQKKyAqIHF1ZXVlIHVwIGlvcyB0byBiZSBwcmUtcmVhZC4gIFdoZW4gdGhl IGlvIGlzIGFjdHVhbGx5IGlzc3VlZCBhbmQKKyAqIGNvbXBsZXRlZCwgdGhlIHJlYWRhaGVhZCB0 aHJlYWQgaW5jcmVhc2VzIHRoZSBudW1iZXIgb2YgYmxvY2tzCisgKiBhdmFpbGFibGUgaW4gY2Fj aGUuICBUaGUgbWFpbiB0aHJlYWQgKHRoZSBjbGllbnQpIGNhbGxzIHRoZQorICogZXh0MmZzX3Jl YWRhaGVhZF8qX3JlbGVhc2UgZnVuY3Rpb25zIChpbiByZWFkYWhlYWRfY2xpZW50LmMpLAorICog cmVkdWNpbmcgdGhlIG51bWJlciBvZiBibG9ja3MgbWFya2VkIGFzIGluIHRoZSBjYWNoZSBhbmQg bWFya2luZworICogdGhlbSBhcyBXT05UTkVFRCB1c2luZyBmYWR2aXNlIChwcm9iYWJseSB1bm5l Y2Vzc2FyeSBhbmQgYSBuby1vcCwKKyAqIGFzIG5vcm1hbCBibG9jayBhZ2luZyBzaG91bGQgZXZp Y3QgdGhlbSBmcm9tIGNhY2hlIGFzIG5ldyBibG9ja3MKKyAqIGFyZSByZWFkKS4KKyAqCisgKiBU aGUgdGhyZWFkcyBzbGVlcCBhbmQgd2FrZSBhY2NvcmRpbmcgdG8gdGhlIHNpemUgb2YgdGhlIGNh Y2hlLCB3aXRoCisgKiB0aGUgcmVhZGFoZWFkIHRocmVhZCBhcyB0aGUgcHJvZHVjZXIgYW5kIHRo ZSBtYWluIHRocmVhZCBhcyB0aGUKKyAqIGNvbnN1bWVyLiAgVGhlIHJlYWRhaGVhZCB0aHJlYWQg d2FrZXMgdGhlIG1haW4gdGhyZWFkIHdoZW5ldmVyIGEKKyAqIHNpZ25pZmljYW50IGFtb3VudCBv ZiBjYWNoZSBpcyBhdmFpbGFibGUsIGFuZCB3YWtlcyBhbmQgd2FpdHMgb24KKyAqIHRoZSBtYWlu IHRocmVhZCBpZiB0aGUgY2FjaGUgaXMgZnVsbC4gIFRoZSBtYWluIHRocmVhZCB3YWtlcyB0aGUK KyAqIHJlYWRhaGVhZCB0aHJlYWQgd2hlbmV2ZXIgYSBzaWduaWZpY2FudCBhbW91bnQgb2YgY2Fj aGUgYmVjb21lcworICogZnJlZSwgYW5kIHdha2VzIGFuZCB3YWl0cyBvbiB0aGUgcmVhZGFoZWFk IHRocmVhZCB3aGVuZXZlciB0aGUKKyAqIGNhY2hlIGJlY29tZXMgZW1wdHkuICBUaGUgdGhyZWFk cyBvbmx5IHNpZ25hbCBlYWNoIG90aGVyIHdoZW4gYQorICogc2lnbmlmaWNhbnQgYW1vdW50IG9m IGNhY2hlIGJlY29tZXMgZnJlZSBvciBhdmFpbGFibGUgYmVjYXVzZQorICogb3RoZXJ3aXNlIHRo ZSB0aHJlYWRzIGNhbiBnZXQgbG9ja2VkIGluIGEgdGlnaHQgd2FrZS9zbGVlcCBjeWNsZSBpbgor ICogd2hpY2ggdGhlIHJlYWRhaGVhZCB0aHJlYWQgbmV2ZXIgaGFzIHRoZSBvcHBvcnR1bml0eSB0 byBpc3N1ZQorICogbXVsdGlwbGUgaW9zIGluIHBhcmFsbGVsLiAgQW5vdGhlciBzbWFsbCBtb2Rp ZmljYXRpb24gaXMgdGhhdCB0aGUKKyAqIHJlYWRhaGVhZCB0aHJlYWQgcmVjb3JkcyBob3cgbXVj aCBjYWNoZSBpdCBuZWVkcyB0byBjb21wbGV0ZSB0aGUKKyAqIG5leHQgaW8gYmVmb3JlIGl0IGdv ZXMgdG8gc2xlZXAsIHNvIHRoZSBtYWluIHRocmVhZCB3b24ndCB3YWtlIGl0CisgKiB1bmxlc3Mg dGhlcmUgaXMgZW5vdWdoIGNhY2hlIHRvIHNhdGlzZnkgdGhlIG5leHQgaW8uCisgKgorICogT25l IG1ham9yIHBpdGZhbGwgb2YgdGhpcyBhcHByb2FjaCBpcyB0aGF0IGl0IHJlcXVpcmVzIHZlcnkg Y2FyZWZ1bAorICogYWNjb3VudGluZyBvZiBibG9ja3MgcmVhZC4gIFRoZSBtYWluIHRocmVhZCBt dXN0IGNhbGwgdGhlIHJlbGVhc2UKKyAqIGZ1bmN0aW9uIGZvciBldmVyeSBibG9jayB0aGF0IHRo ZSByZWFkYWhlYWQgdGhyZWFkIGFkZHMgdG8gdGhlCisgKiBjYWNoZS4gIEluIHBhcnRpY3VsYXIs IHRoZSBtYWluIHRocmVhZCBtdXN0IHJlbGVhc2UgdGhlIGluZGlyZWN0CisgKiBibG9ja3MgZm9y IGV2ZXJ5IGlub2RlIHRoYXQgdGhlIHJlYWRhaGVhZCB0aHJlYWQgd2Fsa3MuICBUaGUgbWFpbgor ICogdGhyZWFkIG1heSBub3Qgd2FudCB0byByZWFkYWhlYWQgZXZlcnkgaW5vZGUgaW4gdGhlIGZp bGUgc3lzdGVtLCBzbworICogdGhlIGludGVyZmFjZSBhbGxvd3MgdGhlIGNsaWVudCB0byBwYXNz IGEgZnVuY3Rpb24gdXNlZCB0byBkZWNpZGUKKyAqIHdoaWNoIGlub2RlcyB0byByZWFkYWhlYWQu CisgKgorICogTm90ZSB0aGF0IHRoZSBtYWluIHRocmVhZCBpcyBhbGxvd2VkIHRvIHB1bGwgc2xp Z2h0bHkgYWhlYWQgb2YgdGhlCisgKiByZWFkYWhlYWQgdGhyZWFkIChhbmQgYWxsb3cgdGhlIGNh Y2hlIHVzZWQgYWNjb3VudGluZyB0byBnbworICogbmVnYXRpdmUpIGJlY2F1c2UgaXQncyBoYXJk IHRvIHByZWRpY3QgaG93IG1hbnkgYmxvY2tzIHRoZSBtYWluCisgKiB0aHJlYWQgd2lsbCByZWFk IHdoZW4gaXQncyBjaGVja2luZyBhbiBpbm9kZS4gIENoZWNraW5nIGJlZm9yZQorICogZXZlcnkg YmxvY2sgcmVhZCB3b3VsZCBiZSBhIGxvdCBvZiBvdmVyaGVhZCwgc28gY2hlY2tpbmcgYW5kCisg KiBibG9ja2luZyBpZiBuZWNlc3NhcnkgaXMgZG9uZSB3aGVuIHRoZSBtYWluIHRocmVhZCBpcyBl bnRpcmVseSBkb25lCisgKiB3aXRoIGFuIGlub2RlLgorICoKKyAqIFdlIHRyeSB0byBrZWVwIHRo ZSBncmFudWxhcml0eSBvZiBhZGRpbmcgb3IgcmVsZWFzaW5nIHRoaW5ncyB0byB0aGUKKyAqIGNh Y2hlIGxhcmdlLCBzbyB0aGF0IHdlIGRvbid0IGdyYWIgbG9ja3MgYW5kIHNlbmQgc2lnbmFscyBh bmQKKyAqIHN3aXRjaCB0aHJlYWRzIGZvciBldmVyeSBibG9jayB0aGF0IGVudGVycyBvciBsZWF2 ZXMgdGhlIGNhY2hlLgorICoKKyAqIEFzeW5jaHJvbm91cyBJTyBpbXBsZW1lbnRhdGlvbjoKKyAq CisgKiBBc3luY2hyb25vdXMsIHBhcmFsbGVsIElPIGlzIGltcGxlbWVudGVkIHVzaW5nIHByaW1p dGl2ZXMgdGhhdCBhcmUKKyAqIGF2YWlsYWJsZSwgd2VsbC10ZXN0ZWQsIGFuZCBhY3R1YWxseSBk byBzb21ldGhpbmcgaW4gbW9zdCBkZXBsb3llZAorICogTGludXggc3lzdGVtczoKKyAqCisgKiBT dGFydCBpbzogcG9zaXhfZmFkdmlzZSAoV0lMTE5FRUQpCisgKiBDb21wbGV0ZSBpbzogcmVhZCgp IGludG8gc2NyYXRjaCBidWZmZXIKKyAqCisgKiBBbWF6aW5nbHksIHRoaXMgd29ya3MgLSBhbmQg aXQgZ29lcyBmYXN0LiAgQXQgdGhpcyBwb2ludCBpbiB0aW1lLAorICogdGhlIG9ubHkgb3RoZXIg c2VyaW91cyBhbHRlcm5hdGl2ZSBpcyB0byBzcGF3biBtdWx0aXBsZSB0aHJlYWRzIGFuZAorICog ZG8gc3luY2hyb25vdXMgaW9zIGZyb20gdGhlIHRocmVhZC4gIE5vIG90aGVyIGZvcm1zIG9mIGFp byBmb3IKKyAqIExpbnV4IHNhdGlzZnkgdGhlIGFib3ZlIHRocmVlIGNyaXRlcmlhOyBpbiBwYXJ0 aWN1bGFyLCBQT1NJWCBhaW8gaXMKKyAqIGltcGxlbWVudGVkIGFzIHN5bmNocm9ub3VzIElPIG9u IG1vc3Qgc3lzdGVtcy4KKyAqCisgKiBEZXZpY2UgcXVldWUgbWFuYWdlbWVudDoKKyAqCisgKiBB cyB3aXRoIHRoZSBjYWNoZSwgd2UgYXNzdW1lIHdlIGhhdmUgcHJldHR5IG11Y2ggZXhjbHVzaXZl IHVzZSBvZgorICogdGhlIGRldmljZSBjb250YWluaW5nIHRoZSBmaWxlIHN5c3RlbSwgYW5kIHRy eSB0byBtYW5hZ2UgdGhlIHF1ZXVlCisgKiBibGluZC4gIFRoZSBpbyBxdWV1ZSBzaXplIGlzIGN1 cnJlbnRseSBwYXNzZWQgaW4gZnJvbSB0aGUgdXNlciwgYnV0CisgKiBjb3VsZCBiZSBmb3VuZCBw cm9ncmFtbWF0aWNhbGx5IHdpdGggc29tZSBlZmZvcnQuICBJb3MgYXJlCisgKiBjb25zaWRlcmVk IG91dHN0YW5kaW5nIGFmdGVyIHdlIHN0YXJ0IHJlYWRhaGVhZCB1bnRpbCB3ZSByZWFkIHRoZQor ICogYWN0dWFsIGRhdGEgcmVxdWVzdGVkLiAgV2UgdHJ5IHRvIGNvbGxlY3QgYXQgbGVhc3QgbWF4 X2lvcyBiZWZvcmUKKyAqIHNvcnRpbmcgYW5kIGlzc3VpbmcgdGhlbSwgdG8gZ2V0IG9wdGltYWwg cGFyYWxsZWxpemF0aW9uIGFuZCBoZWFkCisgKiBtb3ZlbWVudC4KKyAqCisgKiBUaGlzIGNvZGUg cmVwbGljYXRlcyBzb21lIHBvcnRpb24gb2YgdGhlIGluLWtlcm5lbCBkZXZpY2UgcXVldWUKKyAq IG1hbmFnZW1lbnQgLSBxdWV1ZSBwbHVnZ2luZywgbWVyZ2luZywgc29ydGluZywgZXRjLiAgV2h5 IG5vdCBqdXN0CisgKiBsZXQgdGhlIGtlcm5lbCBoYW5kbGUgaXQ/ICBUaGUgYW5zd2VyIGlzIHRo YXQgd2UgY2FuIHByZWRpY3Qgd2hhdAorICogYmxvY2tzIHdpbGwgYmUgbmVlZGVkLCBhbmQgd2Ug a25vdyBhYm91dCBibG9jayBkZXBlbmRlbmNpZXMuICBUaGUKKyAqIGJsb2NrIGxheWVyIGhhcyB0 byBndWVzcyB3aGF0IHdpbGwgaGFwcGVuIG5leHQsIGJ1dCB3ZSBoYXZlIG1vcmUKKyAqIGluZm9y bWF0aW9uIHRoYW4gd2UgY2FuIHBhc3MgZG93biB0aHJvdWdoIHRoZSBzeXN0ZW0gY2FsbAorICog aW50ZXJmYWNlLiAgVGhhdCBzYWlkLCBpdCdzIGNlcnRhaW5seSBwb3NzaWJsZSB0aGF0IHRoZSBw ZXJmb3JtYW5jZQorICogZGlmZmVyZW5jZSB3aWxsIGJlIG5lZ2xpZ2libGUgb24gc29tZSBzeXN0 ZW1zLgorICoKKyAqIFRocmVhZCBtYW5hZ2VtZW50OgorICoKKyAqIEVhY2ggcGFzcyBvZiByZWFk YWhlYWQgKGlub2RlLCBkaXJlY3QgYmxvY2ssIGV0Yy4pIGNyZWF0ZXMgYW5kCisgKiBkZXN0cm95 cyBpdHMgb3duIHRocmVhZC4gIFRoZSB0aHJlYWQgaXNuJ3QgY3JlYXRlZCBhbmQgZG9lc24ndAor ICogc3RhcnQgdW50aWwgdGhlICpfc3RhcnQoKSBmdW5jdGlvbiBpcyBjYWxsZWQsIHNvIHRoZSBt YWluIHRocmVhZAorICogY29udHJvbHMgd2hlbiByZWFkYWhlYWQgc3RhcnRzIHdvcmtpbmcuICBT b21lIGdlbmVyaWMgaGVscGVyCisgKiBmdW5jdGlvbnMgYXJlIHByb3ZpZGVkOyB0aGUgcGVyLXBh c3MgaW5pdGlhbGl6YXRpb24gb25seSBoYXMgdG8KKyAqIGluaXRpYWxpemUgaXRzIG93biBwcml2 YXRlIHZhcmlhYmxlcy4KKyAqCisgKiBUT0RPOgorICoKKyAqIC0gYWNscyBhbmQgeGF0dHJzIGFy ZSBpZ25vcmVkLCBidXQgc2hvdWxkIGFsc28gYmUgcmVhZC4KKyAqIC0gVGhlIHVzZXIgaW50ZXJm YWNlIGlzIGxlc3MgdGhhbiBzdGVsbGFyLCBlc3AuIGZvciBtYXhpbXVtIGNhY2hlIG1lbW9yeQor ICogLSBhdXRvY29uZiB0aGUgdGhyZWFkIHN0dWZmIGFuZCBhbGwgb2YgcmVhZGFoZWFkCisgKiAt IEltcGxlbWVudCBtYWluIHRocmVhZCB0aW1lb3V0IGZvciBzYWZldHkKKyAqIC0gUmVwbGFjZSBk dW1teSBibG9jayBoYWNrIHRvIGtlZXAgbWFpbiB0aHJlYWQgZnJvbSBoYW5naW5nCisgKiAtIFVz ZSBwdGhyZWFkX2NsZWFudXAgaGFuZGxlcnMgd2hlbiBob2xkaW5nIGxvY2tzIHRvIHByZXZlbnQK KyAqICAgZGVhZGxvY2sgaW4gdGhlIGNhc2Ugb2YgdGhlIHRocmVhZCBkeWluZyB3aGlsZSBob2xk aW5nIGEgbG9jaworICogLSBtaW5jb3JlKCkgaW5zdGVhZCBvZiByZWFkKCk/CisgKiAtIHBhcmFs bGVsaXplIGlub2RlIHRhYmxlIHJlYWRhaGVhZAorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8u aD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5p c3RkLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjaW5jbHVkZSA8ZXJyb3IuaD4K KyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSAiZXh0Ml9mcy5oIgorI2luY2x1ZGUgImV4 dDJmcy5oIgorI2luY2x1ZGUgImV4dDJmc1AuaCIKKworLyogWFhYIHNob3VsZCB1c2UgZXh0MiBk ZWJ1ZyByb3V0aW5lcz8gKi8KKworLyogI2RlZmluZSBFWFQyRlNfUkVBREFIRUFEX0RFQlVHICov CisKKyNpZmRlZiBFWFQyRlNfUkVBREFIRUFEX0RFQlVHCisjZGVmaW5lIGRwcmludGYJCQlwcmlu dGYKKyNlbHNlCisjZGVmaW5lIGRwcmludGYoYXJncy4uLikJZG8geyB9IHdoaWxlICgwKQorI2Vu ZGlmCisKK3N0cnVjdCBpb19kZXNjIHsKKwlibGtfdAlibGs7CisJdW5zaWduZWQgaW50IGNvdW50 OworfTsKKworc3RydWN0IHJlYWRhaGVhZF9zdGF0ZSB7CisJZXh0Ml9maWxzeXMJZnM7CisJaW50 CQllbmFibGVkOworCisJLyoKKwkgKiBQYXNzLWluZGVwZW5kZW50IElPIGFuZCBjYWNoZSBtYW5h Z2VtZW50LgorCSAqLworCisJLyogTWF4aW11bSBudW1iZXIgb2Ygc2ltdWx0YW5lb3VzIGlvcyBk aXNrIGNhbiBoYW5kbGUgKi8KKwl1bnNpZ25lZCBpbnQJbWF4X2lvczsKKwkvKiBNYXhpbXVtIGlv IHNpemUgLSB0byBwcmV2ZW50IGRlYWRsb2NrcyB3YWl0aW5nIGZvciBjYWNoZSAqLworCXVuc2ln bmVkIGludAltYXhfaW9fc2l6ZTsKKwkvKiBLaWNrIG9mZiBvdXRzdGFuZGluZyBpb3MgYWZ0ZXIg dGhpcyBtYW55IG1zZWNzIGlkbGUgKi8KKwl1bnNpZ25lZCBpbnQJdGltZW91dDsKKwkvKiBTaG91 bGQgYmUgYXQgbGVhc3QgbWF4X2lvcyBpbiBzaXplICovCisJdW5zaWduZWQgaW50CWlvX3F1ZXVl X3NpemU7CisJLyogQmxvY2tzIHRvIHJlYWQgcXVldWUgKi8KKwlzdHJ1Y3QgaW9fZGVzYwkqaW9f cXVldWU7CisJLyogSW9zIGluIHRoZSBxdWV1ZSAqLworCXVuc2lnbmVkIGludAlpb3NfcXVldWVk OworCS8qIEJsb2NrcyBpbiB0aGUgcXVldWUgKGJ1dCBub3QgaXNzdWVkKSAqLworCXVuc2lnbmVk IGludAlibG9ja3NfcXVldWVkOworCS8qIEFsbCBjYWNoZSBzaXplIHZhcmlhYmxlcyBhcmUgaW4g dW5pdHMgb2YgZmlsZSBzeXN0ZW0gYmxvY2tzICovCisJLyogTWF4aW11bSBidWZmZXIgY2FjaGUg dG8gdXNlICovCisJaW50CQljYWNoZV9tYXg7CisJLyogQnVmZmVyIGNhY2hlIHVzZWQgYnkgcHJl LXJlYWQgYmxvY2tzICovCisJaW50CQljYWNoZV91c2VkOworCS8qIENhY2hlIHJlc2VydmVkIGZv ciBpbi1wcm9ncmVzcyByZWFkYWhlYWRzICovCisJaW50CQljYWNoZV9wZW5kaW5nOworCS8qIENh Y2hlIGJsb2NrcyBuZWVkZWQgZm9yIHdhaXRpbmcgcmVhZGFoZWFkIHRocmVhZCB0byBwcm9ncmVz cyAqLworCWludAkJY2FjaGVfbmVlZGVkOworCS8qIFdha2UgcmVhZGFoZWFkIHdoZW4gY2FjaGUg dXNlZCBnZXRzIHRoaXMgbG93ICovCisJdW5zaWduZWQgaW50CWNhY2hlX3Jlc3RhcnRfcmE7CisJ LyogV2FrZSBtYWluIHRocmVhZCBhaGVhZCB3aGVuIGNhY2hlIHVzZWQgZ2V0cyB0aGlzIGhpZ2gg Ki8KKwl1bnNpZ25lZCBpbnQJY2FjaGVfcmVzdGFydF9tYWluOworCS8qIFByb3RlY3RzIHNoYXJl ZCBjYWNoZSB2YXJpYWJsZXMgKi8KKwlwdGhyZWFkX211dGV4X3QJY2FjaGVfbXV0ZXg7CisJLyog Q29uZGl0aW9uIHZhcmlhYmxlIGZvciB0aHJlYWQgd2FrZS9zbGVlcCAqLworCXB0aHJlYWRfY29u ZF90CWNhY2hlX3dha2U7CisJLyogSXMgcmVhZGFoZWFkIGRvbmU/IFRoZW4gZG9uJ3Qgd2FpdCBv biB6ZXJvIGNhY2hlICovCisJaW50CQljYWNoZV9yZWFkYWhlYWRfZG9uZTsKKwkvKgorCSAqIFNj cmF0Y2ggYnVmZmVyIGZvciByZWFkaW5nIGEgc2luZ2xlIHRocm93YXdheSBibG9jay4gIE5ldmVy CisJICogZXZlciByZWFkIHRoZSBjb250ZW50cy4KKwkgKi8KKwljaGFyCQkqc2NyYXRjaF9idWY7 CisJLyogUmVhZGFoZWFkIHRocmVhZCBzdHJ1Y3Q7IG9ubHkgbmVlZCBvbmUgb2YgdGhlbSAqLwor CXB0aHJlYWRfdAkJdGhyZWFkOworCS8qIFBhc3Mtc3BlY2lmaWMgZXhpdCBoYW5kbGVyICovCisJ dm9pZAkJKCp0aHJlYWRfZXhpdCkoc3RydWN0IHJlYWRhaGVhZF9zdGF0ZSAqKTsKKwkvKiBTaG91 bGQgd2UgZXhpdCBub3c/IENoZWNrIGZyZXF1ZW50bHkgKi8KKwlpbnQJCXNob3VsZF9leGl0Owor CisJLyoKKwkgKiBJbm9kZSByZWFkYWhlYWQgcmVsYXRlZCBzdGF0ZQorCSAqLworCisJLyoKKwkg KiBJbmRpcmVjdCBibG9ja3MgYXJlIHRyYXZlcnNlZCByZWN1cnNpdmVseSBhbmQgbmVlZCBvbmUK KwkgKiBibG9jayBidWZmZXIgZm9yIGRvdWJsZSBhbmQgdHJpcGxlIGJsb2NrcyAoc2luZ2xlcyB1 c2UgdGhlCisJICogc2NyYXRjaF9idWYpLgorCSAqLworCWNoYXIJCSpkb3VibGVfYnVmOworCWNo YXIJCSp0cmlwbGVfYnVmOworCS8qIFdlIGRvIG91ciBvd24gaW50ZXJuYWwgaW5vZGUgc2NhbiAq LworCWV4dDJfaW5vZGVfc2NhbiBzY2FuOworCS8qIENhbGxlciBwcm92aWRlZCBmdW5jdGlvbiB0 byBkZWNpZGUgd2hpY2ggaW5vZGVzIHRvIHJlYWQgYWhlYWQgKi8KKwlpbnQJCSgqc2hvdWxkX3Jl YWRfaW5vZGUpKHN0cnVjdCBleHQyX2lub2RlICopOworCisJLyoKKwkgKiBEaXJlY3RvcnkgYmxv Y2sgcmVhZGFoZWFkIHJlbGF0ZWQgc3RhdGUKKwkgKi8KKworCS8qIExpc3Qgb2YgZGlyZWN0b3J5 IGJsb2NrcyAqLworCWV4dDJfZGJsaXN0IGRibGlzdDsKK307CisKK3N0YXRpYyB2b2lkIHJlYWRh aGVhZF90ZXN0X2V4aXQoc3RydWN0IHJlYWRhaGVhZF9zdGF0ZSAqcmEpOworc3RhdGljIHZvaWQg cmVhZGhlYWRfdGhyZWFkX2V4aXRfbm93KHN0cnVjdCByZWFkYWhlYWRfc3RhdGUgKnJhKTsKKwor LyoKKyAqIENhY2hlIG1hbmFnZW1lbnQgcm91dGluZXMuCisgKi8KKworLyoKKyAqIFNhbml0eSBj aGVjayBjYWNoZSB2YXJpYWJsZXMgYW5kIGtpbGwgcmVhZGFoZWFkIGlmIHRoaW5ncyBsb29rCisg KiB3b25reS4gIENhbGxlciBtdXN0IG5vdCBob2xkIHRoZSBjYWNoZSBtdXRleC4KKyAqLworCitz dGF0aWMgdm9pZCBjaGVja19jYWNoZShzdHJ1Y3QgcmVhZGFoZWFkX3N0YXRlICpyYSkKK3sKKwlp ZiAocmEtPmNhY2hlX3VzZWQgKyByYS0+Y2FjaGVfcGVuZGluZyA+IHJhLT5jYWNoZV9tYXgpIHsK KwkJZnByaW50ZihzdGRlcnIsICJCdWchIGNhY2hlX3VzZWQgKCVkKSArIGNhY2hlX3BlbmRpbmcg KCVkKSBpcyAiCisJCQkiZ3JlYXRlciB0aGFuIGNhY2hlX21heCAoJWQpXG4iLAorCQkJcmEtPmNh Y2hlX3VzZWQsIHJhLT5jYWNoZV9wZW5kaW5nLCByYS0+Y2FjaGVfbWF4KTsKKyNpZmRlZiBFWFQy RlNfUkVBREFIRUFEX0RFQlVHCisJCWFib3J0KCk7CisjZW5kaWYKKwkJcmVhZGhlYWRfdGhyZWFk X2V4aXRfbm93KHJhKTsKKwl9Cit9CisKKy8qCisgKiBEbyB3ZSBoYXZlIHJvb20gaW4gdGhlIGNh Y2hlIGZvciB0aGlzIGlvPworICovCisKK3N0YXRpYyBpbnQgY2FjaGVfZnVsbChzdHJ1Y3QgcmVh ZGFoZWFkX3N0YXRlICpyYSwgdW5zaWduZWQgaW50IGJsa3MpCit7CisJLyogTm8gbG9jayBuZWVk ZWQgLSBtYWluIHRocmVhZCBjYW4gb25seSBkZWNyZWFzZSBjYWNoZV91c2VkICovCisJaWYgKHJh LT5jYWNoZV91c2VkICsgcmEtPmNhY2hlX3BlbmRpbmcgKyBibGtzID4gcmEtPmNhY2hlX21heCkg eworCQlkcHJpbnRmKCIgUkE6ICVzOiBjYWNoZV91c2VkICVkIGNhY2hlX3BlbmRpbmcgJWQgYmxr cyAldVxuIiwKKwkJCV9fRlVOQ1RJT05fXywgcmEtPmNhY2hlX3VzZWQsIHJhLT5jYWNoZV9wZW5k aW5nLCBibGtzKTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogV2Fp dCB1bnRpbCBjYWNoZSBiZWNvbWVzIGF2YWlsYWJsZS4KKyAqLworCitzdGF0aWMgdm9pZCB3YWl0 X2Zvcl9jYWNoZShzdHJ1Y3QgcmVhZGFoZWFkX3N0YXRlICpyYSwgdW5zaWduZWQgaW50IGJsa3Mp Cit7CisJY2hlY2tfY2FjaGUocmEpOworCXB0aHJlYWRfbXV0ZXhfbG9jaygmcmEtPmNhY2hlX211 dGV4KTsKKwkvKgorCSAqIFRoZSBtYWluIHRocmVhZCBjb3VsZCBoYXZlIGZyZWVkIHVwIGNhY2hl IHNpbmNlIHRoZSBjYWxsIHRvCisJICogY2FjaGVfZnVsbCgpLCBjaGVjayB0byBzZWUgaWYgd2Ug YWxyZWFkeSBoYXZlIHNwYWNlCisJICogYXZhaWxhYmxlLgorCSAqLworCWlmIChyYS0+Y2FjaGVf dXNlZCArIHJhLT5jYWNoZV9wZW5kaW5nICsgYmxrcyA8PSByYS0+Y2FjaGVfbWF4KSB7CisJCXB0 aHJlYWRfbXV0ZXhfdW5sb2NrKCZyYS0+Y2FjaGVfbXV0ZXgpOworCQlyZXR1cm47CisJfQorCS8q IEd1ZXNzIG5vdC4gIFdhaXQgZm9yIGl0LiAqLworCXJhLT5jYWNoZV9uZWVkZWQgPSBibGtzOwor CWRwcmludGYoIiBSQTogJXM6IE5lZWQgY2FjaGUsIHdha2luZyBtYWluIHRocmVhZCwgdXNlZCAl ZCBuZWVkZWQgJWRcbiIsCisJCV9fRlVOQ1RJT05fXywgcmEtPmNhY2hlX3VzZWQsIHJhLT5jYWNo ZV9uZWVkZWQpOworCXB0aHJlYWRfY29uZF9zaWduYWwoJnJhLT5jYWNoZV93YWtlKTsKKwlkcHJp bnRmKCIgUkE6ICVzOiBXYWl0aW5nIGZvciBtYWluIHRocmVhZCB0byBmcmVlIGNhY2hlLi4uXG4i LAorCQlfX0ZVTkNUSU9OX18pOworCXB0aHJlYWRfY29uZF93YWl0KCZyYS0+Y2FjaGVfd2FrZSwg JnJhLT5jYWNoZV9tdXRleCk7CisJLyogY2FjaGVfbmVlZGVkIGlzIHJlc2V0IGJ5IHRoZSBtYWlu IHRocmVhZCAqLworCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZyYS0+Y2FjaGVfbXV0ZXgpOworCS8q IFNlZSBpZiB3ZSB3ZXJlIGFjdHVhbGx5IHdva2VuIGJ5IHJlcXVlc3QgdG8gZXhpdCAqLworCXJl YWRhaGVhZF90ZXN0X2V4aXQocmEpOworfQorCisvKgorICogVHJhY2sgYmxvY2tzIHJlYWQgaW50 byBidWZmZXIgY2FjaGUgYW5kIHJlYWR5IGZvciB0aGUgbWFpbiB0aHJlYWQKKyAqIHRvIHVzZS4K KyAqLworCitzdGF0aWMgdm9pZCBibG9ja3NfcmVhZHkoc3RydWN0IHJlYWRhaGVhZF9zdGF0ZSAq cmEsIHVuc2lnbmVkIGludCBjb3VudCkKK3sKKwljaGVja19jYWNoZShyYSk7CisJcHRocmVhZF9t dXRleF9sb2NrKCZyYS0+Y2FjaGVfbXV0ZXgpOworCWRwcmludGYoIiBSQTogJXM6IGNhY2hlX3Bl bmRpbmcgJWQgY2FjaGVfdXNlZCAlZCBjb3VudCAldVxuIiwKKwkJX19GVU5DVElPTl9fLCByYS0+ Y2FjaGVfcGVuZGluZywgcmEtPmNhY2hlX3VzZWQsIGNvdW50KTsKKwlyYS0+Y2FjaGVfcGVuZGlu ZyAtPSBjb3VudDsKKwlyYS0+Y2FjaGVfdXNlZCArPSBjb3VudDsKKwkvKiBXYWtlIG1haW4gdGhy ZWFkIGlmIHdlIGNyb3NzZWQgdGhlIGJvdW5kYXJ5ICovCisJaWYgKChyYS0+Y2FjaGVfdXNlZCAt IGNvdW50IDwgcmEtPmNhY2hlX3Jlc3RhcnRfbWFpbikgJiYKKwkgICAgKHJhLT5jYWNoZV91c2Vk ID49IHJhLT5jYWNoZV9yZXN0YXJ0X21haW4pKSB7CisJCWRwcmludGYoIiBSQTogJXM6IENhY2hl IGZpbGxpbmcgdXAsIHdha2luZyBtYWluIHRocmVhZCAiCisJCQkiKHVzZWQgJWQpXG4iLCBfX0ZV TkNUSU9OX18sIHJhLT5jYWNoZV91c2VkKTsKKwkJcHRocmVhZF9jb25kX3NpZ25hbCgmcmEtPmNh Y2hlX3dha2UpOworCX0KKwlwdGhyZWFkX211dGV4X3VubG9jaygmcmEtPmNhY2hlX211dGV4KTsK K30KKworLyoKKyAqIElPIHF1ZXVlIG1hbmFnZW1lbnQgcm91dGluZXMuCisgKi8KKworI2lmZGVm IEVYVDJGU19SRUFEQUhFQURfREVCVUcKKworLyoKKyAqIFNhbml0eSBjaGVjayB0aGUgaW8gcXVl dWUuCisgKi8KKworc3RhdGljIHZvaWQgY2hlY2tfcXVldWUoc3RydWN0IHJlYWRhaGVhZF9zdGF0 ZSAqcmEpCit7CisJc3RydWN0IGlvX2Rlc2MgKmlvOworCWludCBpOworCisJaWYgKHJhLT5pb3Nf cXVldWVkID4gcmEtPmlvX3F1ZXVlX3NpemUpIHsKKwkJZnByaW50ZihzdGRlcnIsICJCdWchICBJ T3MgcXVldWVkICV1ID4gSU8gcXVldWUgc2l6ZSAldVxuIiwKKwkJCXJhLT5pb3NfcXVldWVkLCBy YS0+aW9fcXVldWVfc2l6ZSk7CisJCWdvdG8gb3V0OworCX0KKworCWZvciAoaSA9IDA7IGkgPCBy YS0+aW9fcXVldWVfc2l6ZTsgaSsrKSB7CisJCWlvID0gJnJhLT5pb19xdWV1ZVtpXTsKKwkJLyog T25seSBwcmludCBub24temVybyBpb3MgZm9yIGJyZXZpdHkgKi8KKwkJaWYgKGlvLT5ibGspCisJ CQlkcHJpbnRmKCIgIGlvWyVkXSBibGsgJXUgY291bnQgJXVcbiIsIGksIGlvLT5ibGssCisJCQkg ICAgICAgaW8tPmNvdW50KTsKKwkJaWYgKChpby0+YmxrIHx8IGlvLT5jb3VudCkgJiYKKwkJICAg IChpID49IHJhLT5pb3NfcXVldWVkKSkgeworCQkJZnByaW50ZihzdGRlcnIsICJCdWchICBpb1sl ZF0gbG9zdCEgIgorCQkJCSIoYmxrICV1IGNvdW50ICV1KVxuIiwgaSwgaW8tPmJsaywgaW8tPmNv dW50KTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJcmV0dXJuOworCisgb3V0OgorI2lmZGVm IEVYVDJGU19SRUFEQUhFQURfREVCVUcKKwlhYm9ydCgpOworI2VuZGlmCisJcmVhZGhlYWRfdGhy ZWFkX2V4aXRfbm93KHJhKTsKK30KKyNlbHNlCisjZGVmaW5lIGNoZWNrX3F1ZXVlKHgpIGRvIHsg fSB3aGlsZSgwKTsKKyNlbmRpZgorCisvKgorICogQ29tcGFyZSBmdW5jdGlvbiBmb3Igc29ydGlu ZyB0aGUgaW8gcXVldWUuICBXZSBzb3J0IHVudXNlZCAoemVybykKKyAqIGlvcyBjcmVhdGVkIGJ5 IG1lcmdlX2lvcygpIHRvIHRoZSBlbmQuCisgKi8KKworc3RhdGljIEVYVDJfUVNPUlRfVFlQRSBp b19jb21wYXJlKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCit7CisJc3RydWN0IGlvX2Rl c2MgKmlvX2EgPSAoc3RydWN0IGlvX2Rlc2MgKikgYTsKKwlzdHJ1Y3QgaW9fZGVzYyAqaW9fYiA9 IChzdHJ1Y3QgaW9fZGVzYyAqKSBiOworCisJaWYgKChpb19hLT5ibGsgPT0gMCkgJiYKKwkgICAg KGlvX2ItPmJsayA9PSAwKSkKKwkJLyogRG9uJ3QgY2FyZSAqLworCQlyZXR1cm4gMDsKKwkvKgor CSAqIE1ha2UgemVyb2VzIGJpZ2dlciB0aGFuIGV2ZXJ5dGhpbmcgZWxzZSBzbyB0aGV5IG1vdmUg dG8gdGhlCisJICogZW5kIG9mIHRoZSBxdWV1ZS4KKwkgKi8KKwlpZiAoaW9fYS0+YmxrID09IDAp CisJCXJldHVybiAxOworCisJaWYgKGlvX2ItPmJsayA9PSAwKQorCQlyZXR1cm4gLTE7CisKKwly ZXR1cm4gaW9fYS0+YmxrIC0gaW9fYi0+YmxrOworfQorCisvKgorICogTWVyZ2UgaW9zIGlmIHRo ZXkgYXJlIGNvbnRpZ3VvdXMgd2hpbGUgcmVzcGVjdGluZyBtYXhpbXVtIElPIHNpemUuCisgKi8K Kworc3RhdGljIHZvaWQgbWVyZ2VfaW9zKHN0cnVjdCByZWFkYWhlYWRfc3RhdGUgKnJhKQorewor CS8qIG1lcmdlX2lvcyBub3QgdG8gYmUgY2FsbGVkIHdpdGggbGVzcyB0aGFuIG9uZSBpbyAqLwor CXVuc2lnbmVkIGludCBuZXdfaW9zID0gMTsKKwlzdHJ1Y3QgaW9fZGVzYyAqbGFzdF9pbzsKKwlz dHJ1Y3QgaW9fZGVzYyAqbmV3X2lvOworCWJsa190IGxhc3RfYmxrOworCWJsa190IG5ld19sYXN0 X2JsazsKKwlpbnQgaTsKKworCXFzb3J0KHJhLT5pb19xdWV1ZSwgcmEtPmlvc19xdWV1ZWQsIHNp emVvZihyYS0+aW9fcXVldWVbMF0pLAorCSAgICAgIGlvX2NvbXBhcmUpOworCisJLyogU2V0IGxh c3RfaW8gdG8gdGhlIGZpcnN0IGlvLi4uICovCisJbGFzdF9pbyA9ICZyYS0+aW9fcXVldWVbMF07 CisJbmV3X2lvcyA9IDE7CisJLyogVGhlbiBzdGFydCBtZXJnaW5nIGF0IHNlY29uZCBpbyAqLwor CWZvciAoaSA9IDE7IGkgPCByYS0+aW9zX3F1ZXVlZDsgaSsrKSB7CisJCWRwcmludGYoIiBSQTog JXM6IGlvWyVkXVxuIiwgX19GVU5DVElPTl9fLCBpKTsKKwkJbmV3X2lvID0gJnJhLT5pb19xdWV1 ZVtpXTsKKwkJbGFzdF9ibGsgPSBsYXN0X2lvLT5ibGsgKyBsYXN0X2lvLT5jb3VudDsKKwkJLyoK KwkJICogTWVyZ2UgaW9zIGlmIGJvdGggKDEpIHRoZSBzdGFydCBvZiB0aGUgbmV3IGlvIGlzIDw9 CisJCSAqIHRvIHRoZSBlbmQgb2YgdGhlIGxhc3QgaW8sIGFuZCAoMikgdGhlIG5ldyBpbyB3b3Vs ZAorCQkgKiBub3QgYmUgYmlnZ2VyIHRoYW4gdGhlIG1heGltdW0gYWxsb3dlZCBpby4KKwkJICov CisJCWlmICgobmV3X2lvLT5ibGsgPD0gbGFzdF9ibGspICYmCisJCSAgICAoKG5ld19pby0+Y291 bnQgKyBsYXN0X2lvLT5jb3VudCkgPD0gcmEtPm1heF9pb19zaXplKSkgeworCQkJZHByaW50Zigi IFJBOiAlczogaW8gbWVyZ2VkISBbJXUsJXVdICsgWyV1LCV1XSA9ICIsCisJCQkJX19GVU5DVElP Tl9fLCBsYXN0X2lvLT5ibGssIGxhc3RfaW8tPmNvdW50LAorCQkJCW5ld19pby0+YmxrLCBuZXdf aW8tPmNvdW50KTsKKwkJCW5ld19sYXN0X2JsayA9IG5ld19pby0+YmxrICsgbmV3X2lvLT5jb3Vu dDsKKwkJCS8qCisJCQkgKiBCZSBjYXJlZnVsLiAgVGhlIGVuZCBvZiB0aGlzIGlvIGNvdWxkIGJl CisJCQkgKiBsZXNzIHRoYW4gdGhlIGVuZCBvZiBsYXN0IGlvLgorCQkJICovCisJCQlpZiAobmV3 X2xhc3RfYmxrID4gbGFzdF9ibGspCisJCQkJbGFzdF9pby0+Y291bnQgPSBuZXdfbGFzdF9ibGsg LSBsYXN0X2lvLT5ibGs7CisJCQkvKiBDbGVhciB0aGUgbWVyZ2VkIGlvICovCisJCQluZXdfaW8t PmJsayA9IDA7CisJCQluZXdfaW8tPmNvdW50ID0gMDsKKwkJCWRwcmludGYoIlsldSwldV1cbiIs IGxhc3RfaW8tPmJsaywgbGFzdF9pby0+Y291bnQpOworCQl9IGVsc2UgeworCQkJZHByaW50Zigi IFJBOiBOb3QgbWVyZ2VkOiBbJXUsJXVdIGFuZCBbJXUsJXVdXG4iLAorCQkJCWxhc3RfaW8tPmJs aywgbGFzdF9pby0+Y291bnQsCisJCQkJbmV3X2lvLT5ibGssIG5ld19pby0+Y291bnQpOworCQkJ LyogVGhpcyBpcyBvdXIgbmV3IGxhc3QgaW8gKi8KKwkJCWxhc3RfaW8gPSBuZXdfaW87CisJCQlu ZXdfaW9zKys7CisJCX0KKwl9CisKKwkvKiBSZXNvcnQgdG8gbW92ZSB6ZXJvZXMgdG8gdGhlIGVu ZCAqLworCXFzb3J0KHJhLT5pb19xdWV1ZSwgcmEtPmlvc19xdWV1ZWQsIHNpemVvZihyYS0+aW9f cXVldWVbMF0pLAorCSAgICAgIGlvX2NvbXBhcmUpOworCisJY2hlY2tfcXVldWUocmEpOworCisJ cmEtPmlvc19xdWV1ZWQgPSBuZXdfaW9zOworfQorCisvKgorICogSW9zIGNhbiBiZSBiYWQgZm9y IGF0IGxlYXN0IHR3byByZWFzb25zOgorICoKKyAqIC0gY29ycnVwdGVkIG9uLWRpc2sgYmxvY2sg cG9pbnRlciAoY2FuJ3QgcHJldmVudCB0aGlzKQorICogLSBwcm9ncmFtbWluZyBlcnJvciAoYS5r LmEuICJidWciKQorICoKKyAqIENoZWNrIGZvciBhbmQgcmVqZWN0IG9idmlvdXNseSBiYWQgaW9z IGJlZm9yZSB0aGV5IGFyZSBpc3N1ZWQgb3IKKyAqIGNhY2hlIGlzIHJlc2VydmVkIGZvciB0aGVt LgorICovCisKK3N0YXRpYyBpbnQgcmVqZWN0X2lvKHN0cnVjdCByZWFkYWhlYWRfc3RhdGUgKnJh LCBibGtfdCBibGssIHVuc2lnbmVkIGludCBjb3VudCkKK3sKKwlibGtfdCBtYXhfYmxrID0gcmEt PmZzLT5zdXBlci0+c19ibG9ja3NfY291bnQgLSAxOworCisJLyogSXMgdGhlIGJsayBudW1iZXIg d2l0aGluIHRoZSBib3VuZHMgb2YgdGhlIGZpbGUgc3lzdGVtPyAqLworCWlmICgoYmxrID09IDAp IHx8IChibGsgKyBjb3VudCA+IG1heF9ibGspKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQmFkIGlv OiBibGsgJXUgY291bnQgJXVcbiIsIGJsaywgY291bnQpOworI2lmZGVmIEVYVDJGU19SRUFEQUhF QURfREVCVUcKKwkJYWJvcnQoKTsKKyNlbmRpZgorCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4g MDsKK30KKworLyoKKyAqIENvbXBsZXRlIGlzc3VlZCBpb3MgdG8gZ2V0IHRoZW0gb3V0IG9mIHRo ZSBkZXZpY2UncyBpbyBxdWV1ZS4KKyAqLworCitzdGF0aWMgdm9pZCByZWFwX2lvcyhzdHJ1Y3Qg cmVhZGFoZWFkX3N0YXRlICpyYSwgdW5zaWduZWQgaW50IHN0YXJ0LAorCQkgICAgIHVuc2lnbmVk IGludCBjb3VudCkKK3sKKwl1bnNpZ25lZCBpbnQgYmxvY2tzX3JlYXBlZCA9IDA7CisJc3RydWN0 IGlvX2Rlc2MgKmlvOworCWludCBpOworCisJZHByaW50ZigiIFJBOiAlczogc3RhcnQgJXUgY291 bnQgJXVcbiIsIF9fRlVOQ1RJT05fXywgc3RhcnQsIGNvdW50KTsKKwlmb3IgKGkgPSBzdGFydDsg aSA8IHN0YXJ0ICsgY291bnQ7IGkrKykgeworCQlpbyA9ICZyYS0+aW9fcXVldWVbaV07CisJCWlm IChyZWplY3RfaW8ocmEsIGlvLT5ibGssIGlvLT5jb3VudCkpCisJCQljb250aW51ZTsKKwkJLyoK KwkJICogUmVhZCBibG9ja3MgaW50byB0aGUgc2NyYXRjaCBidWZmZXIgb25lIGlvIGF0IGEKKwkJ ICogdGltZSBhbmQgdGhyb3cgdGhlbSBhd2F5IChzY3JhdGNoIGJ1ZmZlciBpcyBiaWcKKwkJICog ZW5vdWdoIGZvciB0aGUgbWF4aW11bSBwb3NzaWJsZSBpbykuICBXYXN0ZXMgbWVtb3J5CisJCSAq IGJhbmR3aWR0aCwgYnV0IEkgc3VyZSBob3BlIHRoYXQncyBub3Qgb3VyCisJCSAqIGJvdHRsZW5l Y2suICBBbHNvLCBwYXNzaW5nIHRoZSBtZW1vcnkgYmFjayB0byB0aGUKKwkJICogbWFpbiB0aHJl YWQgaXMgcGFpbmZ1bCwgYW5kIGtlZXBpbmcgdGhlIGJsb2NrcyBpbgorCQkgKiBtZW1vcnkgd291 bGQgcmVzdWx0IGluIGRvdWJsZS1idWZmZXJpbmcgZm9yCisJCSAqIGV2ZXJ5dGhpbmcgaW4gdGhl IGNhY2hlIGFueXdheS4KKwkJICovCisJCWlvX2NoYW5uZWxfcmVhZF9ibGsocmEtPmZzLT5pbywg aW8tPmJsaywgaW8tPmNvdW50LAorCQkJCSAgICByYS0+c2NyYXRjaF9idWYpOworCQlibG9ja3Nf cmVhcGVkICs9IGlvLT5jb3VudDsKKwkJLyoKKwkJICogT25seSByZWxlYXNlIGJsb2NrcyB0byB0 aGUgY2FjaGUgd2hlbiB3ZSBoYXZlIGEgbG90CisJCSAqIG9mIHRoZW0gdG8gYXZvaWQgZXhjZXNz aXZlIGxvY2sgYW5kIHNpZ25hbAorCQkgKiBvdmVyaGVhZC4KKwkJICovCisJCS8qIFhYWCBzaG91 bGQgYmUgYmFzZWQgb24gaGlnaC9sb3cgd2F0ZXJtYXJrcyAqLworCQlpZiAoYmxvY2tzX3JlYXBl ZCA+IChyYS0+Y2FjaGVfbWF4IC8gMTApKSB7CisJCQlibG9ja3NfcmVhZHkocmEsIGJsb2Nrc19y ZWFwZWQpOworCQkJYmxvY2tzX3JlYXBlZCA9IDA7CisJCX0KKwkJLyogQ2xlYXIgdGhlIGlvIGRl c2NyaXB0b3IgZm9yIGRlYnVnZ2luZyAqLworCQlpby0+YmxrID0gMDsKKwkJaW8tPmNvdW50ID0g MDsKKwkJLyoKKwkJICogRnJlcXVlbnQgY2hlY2tpbmcgZm9yIGFuIGV4aXQgcmVxdWVzdCBpcyBl c3BlY2lhbGx5CisJCSAqIGltcG9ydGFudCB3aGVuIGRvaW5nIElPLgorCQkgKi8KKwkJcmVhZGFo ZWFkX3Rlc3RfZXhpdChyYSk7CisJfQorCWJsb2Nrc19yZWFkeShyYSwgYmxvY2tzX3JlYXBlZCk7 CisJYmxvY2tzX3JlYXBlZCA9IDA7Cit9CisKKy8qCisgKiBHaXZlbiBhbiBhcnJheSBvZiBpb3Ms IHNvcnQsIGlzc3VlLCBhbmQgd2FpdCBmb3IgdGhlbS4KKyAqCisgKiBEZXZpY2UgcXVldWUgbWFu YWdlbWVudCBpcyBpbXBvcnRhbnQuICBXZSB3YW50IHRvIGF2b2lkIG92ZXJmbG93aW5nCisgKiB0 aGUgZGV2aWNlIHF1ZXVlIGFuZCBnZXR0aW5nIG91ciByZWFkYWhlYWQgcmVxdWVzdHMgdGhyb3du IGF3YXksIHNvCisgKiB3ZSBuZWVkIHRvIGtub3cgd2hldGhlciB0aGUgcHJldmlvdXMgcmVhZGFo ZWFkIGlvcyBoYXZlIGNvbXBsZXRlZC4KKyAqIEF0IHRoZSBzYW1lIHRpbWUsIHdlIHdhbnQgdG8g aXNzdWUgbWF4X2lvcyBudW1iZXIgb2Ygc29ydGVkIElPcyBpbgorICogcGFyYWxsZWwuICBTbyB3 ZSBjb2xsZWN0IGlvcyBhdCB1c2VyIGxldmVsIGFuZCB3YWl0IHVudGlsICgxKSB0aGUKKyAqIHF1 ZXVlIGlzIGZ1bGwsICgyKSB3ZSBuZWVkIGEgc3luY2hyb25vdXMgcmVhZCAoYXMgZm9yIGRvdWJs ZS90cmlwbGUKKyAqIGluZGlyZWN0IGJsb2NrcyBvciBpbm9kZSB0YWJsZXMpLCBvciAoMykgd2Ug dGltZW91dC4gIFRoZW4gd2UgaXNzdWUKKyAqIHRoZSByZWFkYWhlYWQgcmVxdWVzdHMsIHVwIHRv IG1heF9pb3MgYXQgYSB0aW1lLiAgV2UgdGhlbiBkbyBhCisgKiBzeW5jaHJvbm91cyByZWFkIG9m IGFsbCB0aGUgb3V0c3RhbmRpbmcgaW9zIHRvIG1ha2Ugc3VyZSB0aGV5IGhhdmUKKyAqIGNvbXBs ZXRlZCBiZWZvcmUgaXNzdWluZyB0aGUgbmV4dCBzZXQgb2YgaW9zLiAgUG9vciBtYW4ncyBhaW8u CisgKi8KKworc3RhdGljIHZvaWQgaXNzdWVfaW9zKHN0cnVjdCByZWFkYWhlYWRfc3RhdGUgKnJh KQoreworCXVuc2lnbmVkIGludCBpb3NfaW5fZmxpZ2h0ID0gMDsKKwlzdHJ1Y3QgaW9fZGVzYyAq aW87CisJaW50IGlvc19maW5pc2hlZCA9IDA7CisJaW50IGk7CisKKwltZXJnZV9pb3MocmEpOwor CisJZHByaW50ZigiIFJBOiAlczogaW9zX3F1ZXVlZCAldSBibG9ja3NfcXVldWVkICV1IGFmdGVy IG1lcmdlXG4iLAorCQlfX0ZVTkNUSU9OX18sIHJhLT5pb3NfcXVldWVkLCByYS0+YmxvY2tzX3F1 ZXVlZCk7CisJLyoKKwkgKiBJc3N1ZSB1cCB0byBtYXggaW9zIGF0IGEgdGltZS4gIElmIG5lY2Vz c2FyeSwgd2FrZSB0aGUgbWFpbgorCSAqIHRocmVhZCBhbmQgd2FpdCBmb3IgY2FjaGUgdG8gYmVj b21lIGF2YWlsYWJsZS4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgcmEtPmlvc19xdWV1ZWQ7IGkr KykgeworCQlpbyA9ICZyYS0+aW9fcXVldWVbaV07CisJCS8qIENoZWNrIGlvIGFuZCBjYWNoZSBs aW1pdHMgKi8KKwkJaWYgKChpb3NfaW5fZmxpZ2h0ID09IHJhLT5tYXhfaW9zKSB8fAorCQkgICAg Y2FjaGVfZnVsbChyYSwgaW8tPmNvdW50KSkgeworCQkJLyogQ2FjaGUgd29uJ3Qgb3ZlcmZsb3cg aWYgd2UgaXNzdWUgY3VycmVudCBpb3MgKi8KKwkJCXJlYXBfaW9zKHJhLCBpb3NfZmluaXNoZWQs IGlvc19pbl9mbGlnaHQpOworCQkJaW9zX2luX2ZsaWdodCA9IDA7CisJCQlpb3NfZmluaXNoZWQg PSBpOworCQl9CisJCS8qIENoZWNrIHRoYXQgd2UgaGF2ZSBlbm91Z2ggY2FjaGUgKi8KKwkJd2Fp dF9mb3JfY2FjaGUocmEsIGlvLT5jb3VudCk7CisJCS8qIE5vdyB3ZSBoYXZlIGVub3VnaCBjYWNo ZSBhbmQgYSBmcmVlIGlvIHNsb3QgKi8KKwkJZHByaW50ZigiIFJBOiAlczogaXNzdWluZyBpbyAl ZCBibGsgJXUgY291bnQgJWRcbiIsCisJCQlfX0ZVTkNUSU9OX18sIGksIGlvLT5ibGssIGlvLT5j b3VudCk7CisJCWlvX2NoYW5uZWxfcmVhZGFoZWFkKHJhLT5mcy0+aW8sIGlvLT5ibGssIGlvLT5j b3VudCk7CisJCS8qIFJlc2VydmUgY2FjaGUgZm9yIHRoaXMgaW8gKi8KKwkJcmEtPmNhY2hlX3Bl bmRpbmcgKz0gaW8tPmNvdW50OworCQlpb3NfaW5fZmxpZ2h0Kys7CisJCXJlYWRhaGVhZF90ZXN0 X2V4aXQocmEpOworCX0KKwkvKiBGaW5pc2ggb2ZmIHRoZSBsYXN0IG9mIHRoZSBpb3MgKi8KKwlp ZiAoaW9zX2luX2ZsaWdodCkKKwkJcmVhcF9pb3MocmEsIGlvc19maW5pc2hlZCwgaW9zX2luX2Zs aWdodCk7CisJcmEtPmlvc19xdWV1ZWQgPSAwOworCXJhLT5ibG9ja3NfcXVldWVkID0gMDsKK30K KworLyoKKyAqIElzc3VlIGFueSBvdXRzdGFuZGluZyBpb3MgYW5kIHdha2UgbWFpbiB0aHJlYWQg b25lIG1vcmUgdGltZS4KKyAqIENhbGxlZCBiZWZvcmUgdGhyZWFkIGV4aXRzLgorICovCisKK3N0 YXRpYyB2b2lkIGZpbmlzaF9pb3Moc3RydWN0IHJlYWRhaGVhZF9zdGF0ZSAqcmEpCit7CisJLyog S2ljayBvZmYgYW55IGxlZnQtb3ZlciBpb3MgKi8KKwlpZiAocmEtPmlvc19xdWV1ZWQpCisJCWlz c3VlX2lvcyhyYSk7CisKKwkvKiBXYWtlIG1haW4gdGhyZWFkIG9uZSBtb3JlIHRpbWUgaW4gY2Fz ZSBpdCdzIHdhaXRpbmcgb24gdXMgKi8KKwlwdGhyZWFkX211dGV4X2xvY2soJnJhLT5jYWNoZV9t dXRleCk7CisJLyoKKwkgKiBYWFggSEFDSzogUHJldmVudCBtYWluIHRocmVhZCBoYW5naW5nIG9u IHplcm8gY2FjaGUgYnkKKwkgKiBhZGRpbmcgYSBkdW1teSBibG9jayB0byB0aGUgY2FjaGUuICBX aWxsIGRlYWRsb2NrIGlmIHdlCisJICogaGF2ZSBhIGNhY2hlIGFjY291bnRpbmcgYnVnIHRoYXQg bWFrZXMgY2FjaGVfdXNlZCBnbworCSAqIG5lZ2F0aXZlLgorCSAqLworCXJhLT5jYWNoZV91c2Vk ICs9IDE7CisJZHByaW50ZigiIFJBOiAlczogUmVhZGFoZWFkIGZpbmlzaGVkLCB3YWtpbmcgbWFp biB0aHJlYWQgIgorCQkiY2FjaGVfdXNlZCAlZFxuIiwgX19GVU5DVElPTl9fLCByYS0+Y2FjaGVf dXNlZCk7CisJcHRocmVhZF9jb25kX3NpZ25hbCgmcmEtPmNhY2hlX3dha2UpOworCXB0aHJlYWRf bXV0ZXhfdW5sb2NrKCZyYS0+Y2FjaGVfbXV0ZXgpOworfQorCisvKgorICogQ2hlY2sgaWYgdGhl IGlvIHF1ZXVlIGlzIGZ1bGwuICBJZiBpdCBpcywgdHJ5IHRvIHNxdWlzaCB0aGUgaW9zCisgKiB0 b2dldGhlciB0byBmcmVlIHVwIGlvIHNsb3RzLgorICovCisKK3N0YXRpYyBpbnQgcXVldWVfZnVs bChzdHJ1Y3QgcmVhZGFoZWFkX3N0YXRlICpyYSkKK3sKKwlpZiAocmEtPmlvc19xdWV1ZWQgPT0g cmEtPmlvX3F1ZXVlX3NpemUpCisJCW1lcmdlX2lvcyhyYSk7CisJaWYgKHJhLT5pb3NfcXVldWVk ID09IHJhLT5pb19xdWV1ZV9zaXplKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCisv KgorICogQWRkIGFuIGlvIHRvIHRoZSByZWFkYWhlYWQgcXVldWUsIGlzc3VpbmcgaW9zIGlmIG5l Y2Vzc2FyeSB0byBtYWtlCisgKiBzcGFjZSBpbiB0aGUgcXVldWUuCisgKi8KKworc3RhdGljIHZv aWQgcXVldWVfYmxrcyhzdHJ1Y3QgcmVhZGFoZWFkX3N0YXRlICpyYSwgYmxrX3QgYmxrLAorCQkg ICAgICAgdW5zaWduZWQgaW50IGNvdW50KQoreworCXVuc2lnbmVkIGludCBibGtzX3RvX3F1ZXVl OworCXN0cnVjdCBpb19kZXNjICppbzsKKworCWRwcmludGYoIiBSQTogJXM6IHF1ZXVlICV1LCBi bGsgJXUsIGNvdW50ICVkXG4iLCBfX0ZVTkNUSU9OX18sCisJCXJhLT5pb3NfcXVldWVkLCBibGss IGNvdW50KTsKKworCWlmIChyZWplY3RfaW8ocmEsIGJsaywgY291bnQpKQorCQlyZXR1cm47CisK KwkvKiBCcmVhayBkb3duIGxhcmdlIHJlcXVlc3RzIGludG8gbWF4X2lvX3NpemUgY2h1bmtzICov CisJd2hpbGUgKGNvdW50KSB7CisJCWlmIChxdWV1ZV9mdWxsKHJhKSkKKwkJCWlzc3VlX2lvcyhy YSk7CisJCWlvID0gJnJhLT5pb19xdWV1ZVtyYS0+aW9zX3F1ZXVlZF07CisJCWJsa3NfdG9fcXVl dWUgPSBjb3VudCA+IHJhLT5tYXhfaW9fc2l6ZSA/CisJCQlyYS0+bWF4X2lvX3NpemUgOiBjb3Vu dDsKKwkJaW8tPmJsayA9IGJsazsKKwkJaW8tPmNvdW50ID0gYmxrc190b19xdWV1ZTsKKwkJLyog cHJpbnRmKCIlczogcXVldWVkIGJsayAldSBjb3VudCAldVxuIiwgX19GVU5DVElPTl9fLCBpby0+ YmxrLAorCQkgICBpby0+Y291bnQpOyAqLworCQlyYS0+YmxvY2tzX3F1ZXVlZCArPSBjb3VudDsK KwkJcmEtPmlvc19xdWV1ZWQrKzsKKwkJY291bnQgLT0gYmxrc190b19xdWV1ZTsKKwkJYmxrICs9 IGJsa3NfdG9fcXVldWU7CisJfQorfQorCisvKgorICogUmVhZCByZXF1ZXN0ZWQgYmxvY2tzLCBp c3N1aW5nIGFueSBvdGhlciB3YWl0aW5nIGlvcyB3aGlsZSB3ZSdyZSBhdAorICogaXQuCisgKi8K Kworc3RhdGljIHZvaWQgcmVhZF9ibGtzKHN0cnVjdCByZWFkYWhlYWRfc3RhdGUgKnJhLCBibGtf dCBibGssCisJCSAgICAgIHVuc2lnbmVkIGludCBjb3VudCwgY2hhciAqYnVmKQoreworCWRwcmlu dGYoIiBSQTogJXM6IGJsayAldSBjb3VudCAldVxuIiwgX19GVU5DVElPTl9fLCBibGssIGNvdW50 KTsKKworCWlmIChyZWplY3RfaW8ocmEsIGJsaywgY291bnQpKQorCQlyZXR1cm47CisKKwkvKiBB ZGQgdG8gcmVhZGFoZWFkIHF1ZXVlICovCisJcXVldWVfYmxrcyhyYSwgYmxrLCBjb3VudCk7CisJ LyoKKwkgKiBTaW5jZSB3ZSBoYXZlIHRvIGdvIHRvIGRpc2sgYW55d2F5LCBraWNrIG9mZiBhbmQg Y29tcGxldGUKKwkgKiBhbGwgb3V0c3RhbmRpbmcgaW9zLgorCSAqLworCWlzc3VlX2lvcyhyYSk7 CisJLyoKKwkgKiBSZXRyaWV2ZSBzcGVjaWZpYyBkYXRhIHJlcXVlc3RlZC4gIFRoZSBjYWNoZSB1 c2VkIGJ5IHRoaXMKKwkgKiBibG9jayBpcyBhbHJlYWR5IGFjY291bnRlZCBmb3IuCisJICovCisJ aW9fY2hhbm5lbF9yZWFkX2JsayhyYS0+ZnMtPmlvLCBibGssIGNvdW50LCBidWYpOworfQorCisv KgorICogSW5vZGUgdGFibGUgYW5kIGluZGlyZWN0IGJsb2NrIHJlYWRhaGVhZCByb3V0aW5lcy4K KyAqLworCisvKgorICogR2l2ZW4gYSB0cmlwbGUsIGRvdWJsZSwgb3Igc2luZ2xlIGluZGlyZWN0 IGJsb2NrLCByZWN1cnNpdmVseQorICogdHJhdmVyc2UgdGhlIGluZGlyZWN0IGJsb2NrIHRyZWUu ICBSZWFkIHRyaXBsZXMgYW5kIGRvdWJsZXMKKyAqIGltbWVkaWF0ZWx5LCBidXQganVzdCBhZGQg c2luZ2xlcyB0byB0aGUgbWFpbiBibG9jayBxdWV1ZSBhbmQgcmVhZAorICogdGhlbSBhdCBvdXIg Y29udmVuaWVuY2UuCisgKi8KKworc3RhdGljIHZvaWQgcmVhZGFoZWFkX2luZF9ibGsoc3RydWN0 IHJlYWRhaGVhZF9zdGF0ZSAqcmEsIGJsa190IGJsaywKKwkJCSAgICAgIGludCBsZXZlbCwgaW50 IHByaW50X2hlYWRlcikKK3sKKwl1bnNpZ25lZCBpbnQgbGltaXQgPSByYS0+ZnMtPmJsb2Nrc2l6 ZSA+PiAyOworCWJsa190ICpibGtfcHRyOworCWNoYXIgKmJ1ZjsKKwlpbnQgaTsKKworCWlmIChw cmludF9oZWFkZXIpCisJCWRwcmludGYoIiBSQTogJSpzJXM6IGJsayAldSBsZXZlbCAlZFxuIiwg bGV2ZWwgKiA0LCAiIiwKKwkJCV9fRlVOQ1RJT05fXywgYmxrLCBsZXZlbCk7CisJZWxzZSBpZiAo bGV2ZWwgIT0gMCkKKwkJLyogU3RhcnQgYSBuZXcgbGluZSAqLworCQlkcHJpbnRmKCJcbiIpOwor CisJaWYgKHJlamVjdF9pbyhyYSwgYmxrLCAxKSkKKwkJcmV0dXJuOworCisJLyogU2luZ2xlIGlu ZGlyZWN0IGJsb2NrPyAgSnVzdCBxdWV1ZSBpdCB1cCBhbmQgcmV0dXJuLiAqLworCWlmIChsZXZl bCA9PSAwKSB7CisJCXF1ZXVlX2Jsa3MocmEsIGJsaywgMSk7CisJCXJldHVybjsKKwl9CisKKwkv KiBSZWFkIGRvdWJsZS90cmlwbGUgaW1tZWRpYXRlbHkgKi8KKwlpZiAobGV2ZWwgPT0gMSkKKwkJ YnVmID0gcmEtPmRvdWJsZV9idWY7CisJZWxzZQorCQlidWYgPSByYS0+dHJpcGxlX2J1ZjsKKwor CXJlYWRfYmxrcyhyYSwgYmxrLCAxLCBidWYpOworCisJLyogSXRlcmF0ZSB0aHJvdWdoIHRoZSBi bG9jayBwb2ludGVycyAqLworCWJsa19wdHIgPSAoYmxrX3QgKikgYnVmOworCWRwcmludGYoIiBS QTogJSpzJXMoJWQpOiByZWFkIGJsb2NrICV1IGludG8gYnVmICVwXG4iLAorCQlsZXZlbCAqIDQs ICIiLCBfX0ZVTkNUSU9OX18sIGxldmVsLCBibGssIGJ1Zik7CisKKwlmb3IgKGkgPSAwOyBpIDwg bGltaXQ7IGkrKykgeworCQlpZiAoYmxrX3B0cltpXSAhPSAwKQorCQkJcmVhZGFoZWFkX2luZF9i bGsocmEsIGJsa19wdHJbaV0sIGxldmVsIC0gMSwgMCk7CisJfQorfQorCisvKgorICogUGVyZm9y bSBicmVhZHRoLWZpcnN0IHRyYXZlcnNhbCBvbiB0aGUgaW5kaXJlY3QgYmxvY2tzIG9mIHRoZSBp bm9kZS4KKyAqLworCitzdGF0aWMgdm9pZCByZWFkYWhlYWRfaW5vZGUoc3RydWN0IHJlYWRhaGVh ZF9zdGF0ZSAqcmEsCisJCQkgICAgc3RydWN0IGV4dDJfaW5vZGUgKmlub2RlLAorCQkJICAgIGV4 dDJfaW5vX3QgaW5vKQoreworCWRwcmludGYoIiVzOiAlZFxuIiwgX19GVU5DVElPTl9fLCBpbm8p OworCisJLyogWFhYIFJlYWQgYWNscyBhbmQgeGF0dHJzIHRvbyAqLworCisJaWYgKGlub2RlLT5p X2Jsb2NrW0VYVDJfSU5EX0JMT0NLXSkKKwkJcmVhZGFoZWFkX2luZF9ibGsocmEsIGlub2RlLT5p X2Jsb2NrW0VYVDJfSU5EX0JMT0NLXSwgMCwgMSk7CisJaWYgKGlub2RlLT5pX2Jsb2NrW0VYVDJf RElORF9CTE9DS10pCisJCXJlYWRhaGVhZF9pbmRfYmxrKHJhLCBpbm9kZS0+aV9ibG9ja1tFWFQy X0RJTkRfQkxPQ0tdLCAxLCAxKTsKKwlpZiAoaW5vZGUtPmlfYmxvY2tbRVhUMl9USU5EX0JMT0NL XSkKKwkJcmVhZGFoZWFkX2luZF9ibGsocmEsIGlub2RlLT5pX2Jsb2NrW0VYVDJfVElORF9CTE9D S10sIDIsIDEpOworfQorCisvKgorICogU3RhcnQgcmVhZGFoZWFkIGZvciBhIHNldCBvZiBpbm9k ZSB0YWJsZXMuCisgKgorICogWFhYIElub2RlIHRhYmxlIHJlYWRhaGVhZCByZWFsbHksIHJlYWxs eSBvdWdodCB0byBiZSBwYXJhbGxlbGl6ZWQsCisgKiBidXQgdGhlIGNhY2hlIGFuZCBpbyBzbG90 IG1hbmFnZW1lbnQgaXMgcHJldHR5IGhhaXJ5LiAgV2h5PworICoKKyAqIC0gWW91IGNhbid0IGp1 c3QgYWRkIHRoZSBibG9ja3MgdG8gdGhlIGNhY2hlIGZvciBtb3JlIHRoYW4gb25lCisgKiBpbm9k ZSB0YWJsZSBhdCBvbmNlIGJlY2F1c2UgdGhlIG1haW4gdGhyZWFkIHdpbGwgdGhpbmsgdGhlIGlu ZGlyZWN0CisgKiBibG9ja3MgZm9yIHRoZSBjdXJyZW50IGlub2RlIHRhYmxlIGFyZSByZWFkeSBh bmQgZ28gcmVhZCB0aGVtIC0KKyAqIHdoaWNoIHdpbGwga2lsbCBwZXJmb3JtYW5jZSBiZWNhdXNl IHJlYWRpbmcgaW5kaXJlY3QgYmxvY2tzIG91dCBvZgorICogb3JkZXIgaXMgcHJldHR5IGZhdGFs bHkgc2xvdy4KKyAqCisgKiAtIFlvdSBoYXZlIHRvIHJlc2VydmUgc29tZSBjYWNoZSBmb3IgaW5k aXJlY3QgYmxvY2sgcmVhZHMgZm9yIHRoZQorICogY3VycmVudCBibG9jayBncm91cCB0byBjb21w bGV0ZSBvciBlbHNlIHJlYWRhaGVhZCB3b24ndCBiZSBhYmxlIHRvCisgKiBwcm9ncmVzcywgc2lu Y2UgYWxsIHRoZSBjYWNoZSB3aWxsIGJlIGxvY2tlZCB1cCBhcyBwZW5kaW5nIGFuZCBpdAorICog d2lsbCBuZXZlciBtYWtlIGFueSBvZiBpdCBhdmFpbGFibGUgdG8gdGhlIG1haW4gdGhyZWFkLiAg VG8gbWVyZWx5CisgKiBwcmV2ZW50IGRlYWRsb2NrcywgeW91IG11c3QgcmVzZXJ2ZSBhdCBsZWFz dCBlbm91Z2ggYmxvY2tzIGZvciB0aGUKKyAqIG1heGltdW0gaW8gc2l6ZS4gIFRvIG1ha2UgaXQg cGVyZm9ybSB3ZWxsLCB5b3UgaGF2ZSB0byByZXNlcnZlIG1vcmUKKyAqIHRoYW4gdGhhdC4gIEhv dyBtdWNoIGlzIGVub3VnaD8gIERvbid0IGtub3cuCisgKgorICogLSBUbyBtYWtlIHN1cmUgeW91 IGNhbiByZWFkIGlub2RlIHRhYmxlcyBpbiBwYXJhbGxlbCwgeW91IHdhbnQgdG8KKyAqIG1ha2Ug c3VyZSB5b3UgaGF2ZSBlbm91Z2ggaW8gc2xvdHMgZnJlZS4gIEFnYWluLCBob3cgbWFueT8gIFNo b3VsZAorICogdGhleSBiZSBhbHdheXMgcmVzZXJ2ZWQgb3IgY2FuIGluZGlyZWN0IGJsb2NrIHJl YWRzIGJlIGFibGUgdG8gdXNlCisgKiB0aGVtPyAgU2hvdWxkIHlvdSBqdXN0IGlzc3VlIGFsbCBv dXRzdGFuZGluZyBpb3Mgd2hlbiB5b3Ugc3RhcnQKKyAqIHJlYWRpbmcgYSBibG9jayBncm91cD8g IEJ1dCB0aGVuIHlvdSBoYXZlIHRvIGNoYW5nZSBpc3N1ZV9pb3Mgc28gaXQKKyAqIGRvZXNuJ3Qg bWFyayB0aGUgYmxvY2tzIGFzIGF2YWlsYWJsZSBpbiBjYWNoZS4KKyAqCisgKiBQb3NzaWJsZSBz b2x1dGlvbnM6CisgKgorICogLSBUcmFjayBpbm9kZSB0YWJsZSBibG9ja3MgYW5kIGluZGlyZWN0 IGJsb2NrcyBzZXBhcmF0ZWx5LiAgTWVzc2VzCisgKiB1cCBuaWNlIGNsZWFuIGdlbmVyaWMgY2Fj aGUgaW50ZXJmYWNlLgorICoKKyAqIC0gVHJhY2sgY3VycmVudCBpbm9kZSBudW1iZXIgYW5kIGRv bid0IGxldCBtYWluIHRocmVhZCBwcm9jZXNzCisgKiBiZXlvbmQgdGhhdC4gIEhhdmUgdG8gd29y cnkgYWJvdXQgY2FjaGUvaW5vZGUgcHJvZ3Jlc3MgZGVhZGxvY2tzLgorICoKKyAqIC0gUmVzZXJ2 ZSBjYWNoZS9pbyBmb3IgaW5vZGUgdGFibGUgcmVhZGFoZWFkcy4gIERhbmdlciBvZiBkZWFkbG9j a3MKKyAqIHdhaXRpbmcgZm9yIGNhY2hlIHdhaXRpbmcgZm9yIGlvIHdhaXRpbmcgZm9yIGNhY2hl LCBldGMuLiAgSG93IG11Y2gKKyAqIHRvIHJlc2VydmUgbm90IGNsZWFyLgorICovCisKK3N0YXRp YyB2b2lkIHJlYWRhaGVhZF9pbm9kZV90YWJsZXMoc3RydWN0IHJlYWRhaGVhZF9zdGF0ZSAqcmEs IGRncnBfdCBncm91cCwKKwkJCQkgIGludCBjb3VudCkKK3sKKwlpbnQgaTsKKworCWRwcmludGYo IiBSQTogJXM6IFN0YXJ0aW5nIGdyb3VwcyAldS0ldSBjYWNoZV91c2VkICV1XG4iLAorCQlfX0ZV TkNUSU9OX18sIGdyb3VwLCBncm91cCArIGNvdW50IC0gMSwgcmEtPmNhY2hlX3VzZWQpOworCisJ Zm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCisJCXF1ZXVlX2Jsa3MocmEsIHJhLT5mcy0+Z3Jv dXBfZGVzY1tncm91cCArIGldLmJnX2lub2RlX3RhYmxlLAorCQkJICAgcmEtPmZzLT5pbm9kZV9i bG9ja3NfcGVyX2dyb3VwKTsKKwkvKgorCSAqIEtpY2sgb2ZmIHRoZSBpbyBpbW1lZGlhdGVseSBz aW5jZSB3ZSdsbCBuZWVkIHRoZSBibG9ja3MKKwkgKiByaWdodCBhd2F5LgorCSAqLworCWlzc3Vl X2lvcyhyYSk7Cit9CisKKy8qCisgKiBBdCB0aGUgZW5kIG9mIGVhY2ggYmxvY2sgZ3JvdXAsIGlz c3VlIHJlYWRhaGVhZCBmb3IgdGhlIG5leHQgYmxvY2sKKyAqIGdyb3VwKHMpLgorICovCisKK3N0 YXRpYyBlcnJjb2RlX3QgcmVhZGFoZWFkX3NjYW5fY2FsbGJhY2soZXh0Ml9maWxzeXMgZnMsCisJ CQkgICAgICAgZXh0Ml9pbm9kZV9zY2FuIHNjYW4gRVhUMkZTX0FUVFIoKHVudXNlZCkpLAorCQkJ ICAgICAgIGRncnBfdCBncm91cCwgdm9pZCAqIHByaXZfZGF0YSkKK3sKKwlzdHJ1Y3QgcmVhZGFo ZWFkX3N0YXRlICpyYSA9IChzdHJ1Y3QgcmVhZGFoZWFkX3N0YXRlICopIHByaXZfZGF0YTsKKwlk Z3JwX3QgbmV4dF9ncm91cCA9IGdyb3VwICsgMTsKKworCWRwcmludGYoIiBSQTogJXM6IEZpbmlz aGVkIGdyb3VwICV1IGNhY2hlX3VzZWQgJWRcbiIsIF9fRlVOQ1RJT05fXywKKwkJZ3JvdXAsIHJh LT5jYWNoZV91c2VkKTsKKworCS8qIEFueSBtb3JlIGJsb2NrZ3JvdXBzPyAqLworCWlmIChuZXh0 X2dyb3VwID09IGZzLT5ncm91cF9kZXNjX2NvdW50KQorCQlyZXR1cm4gMDsKKworCS8qIFN0YXJ0 IHJlYWRhaGVhZCBmb3IgbmV4dCBpbm9kZSB0YWJsZShzKSAqLworCS8qIFhYWCBjb3VudCBpcyBh bHdheXMgMSBmb3Igbm93IC0gc2VlIGNvbW1lbnQgKi8KKwlyZWFkYWhlYWRfaW5vZGVfdGFibGVz KHJhLCBuZXh0X2dyb3VwLCAxKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoZW9yeSBvZiBy ZWFkYWhlYWQgdGhyZWFkIGV4aXQva2lsbDoKKyAqCisgKiBUaGUgcmVhZGFoZWFkIHRocmVhZCB3 aWxsIGVuZCBmb3Igb25lIG9mIHR3byByZWFzb25zOiAoMSkgVGhpcworICogcGFydGljdWxhciBw YXNzIGlzIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQsICgyKSBUaGUgbWFpbiB0aHJlYWQKKyAqIHdh bnRzIHRvIGtpbGwgcmVhZGFoZWFkIGVudGlyZWx5IGJlY2F1c2Ugc29tZSBwYXNzIHdhcyBhYm9y dGVkLgorICogV2hlbiBlaXRoZXIgb2YgdGhlc2UgdGhpbmdzIGhhcHBlbnMsIHdlIG5lZWQgdG8g ZXhpdCB0aGUgcmVhZGFoZWFkCisgKiB0aHJlYWQgc2FmZWx5IGFuZCB0aGVuIHJ1biB0aGUgZXhp dCBmdW5jdGlvbiBmb3IgdGhpcyBwYXNzIGluIHRoZQorICogbWFpbiB0aHJlYWQncyBjb250ZXh0 LiAgVGhlIG5hc3R5IGJpdCBpcyBkb2luZyB0aGlzIHdoaWxlIG1ha2luZworICogc3VyZSB3ZSBk b24ndCBsZWF2ZSB0aGUgY2FjaGUgbXV0ZXggbG9ja2VkLiAgV2UgcmVhbGx5IGhhdmUgdG8KKyAq IGF2b2lkIHRoZSBtYWluIHRocmVhZCBibG9ja2luZyBpbiBhbnkgc2l0dWF0aW9uIHNvIHRoYXQg cmVhZGFoZWFkCisgKiBkb2Vzbid0IG1ha2UgZnNjayAqbGVzcyogc3RhYmxlLiAgUHRocmVhZHMg ZG9lc24ndCBvZmZlciBhbnkKKyAqIHJlYXNvbmFibGUgZmFjaWxpdGllcyBmb3IgZG9pbmcgdGhp cywgdGhvdWdoLgorICoKKyAqIFRoZSBzb2x1dGlvbiBpcyBleGFjdGx5IHRoZSBzYW1lIG9uZSBh cyB0aGUgbWFpbiBmc2NrIHRocmVhZDogQmxvY2sKKyAqIGNhbmNlbGxhdGlvbiBhbmQgb2NjYXNp b25hbGx5IGNoZWNrIGF0IHByZWRldGVybWluZWQgc2FmZSBwbGFjZXMgaWYKKyAqIHdlIHNob3Vs ZCBleGl0IG5vdy4KKyAqCisgKiBTbyB0aGUgaW50ZXJmYWNlIGZvciBjbGVhbmluZyB1cCBwcm9w ZXJseSBhZnRlciBwYXNzZXMgZ29lcyBsaWtlCisgKiB0aGlzOgorICoKKyAqIEluIHRoZSBwYXNz LXNwZWNpZmljIGluaXQgcm91dGluZSwgc2V0IHRoZSB0aHJlYWRfZXhpdCBwb2ludGVyIHRvCisg KiB5b3VyIGV4aXQgZnVuY3Rpb24gLSBhZnRlciBjb21wbGV0aW5nIGFsbCBzZXR1cCB0aGF0IHdp bGwgYmUgdG9ybgorICogZG93biBvbiBleGl0LgorICoKKyAqIENhbGwgcmVhZGFoZWFkX3RocmVh ZF9zZXR1cCBhdCBzdGFydCBvZiB0aGUgcGFzcy1zcGVjaWZpYyBtYWluCisgKiByb3V0aW5lIHRv IGRpc2FibGUgY2FuY2VsbGF0aW9uLgorICoKKyAqIFdoZW4gdGhlIHBhc3MgY29tcGxldGVzIG5v cm1hbGx5LCBpdCBzaG91bGQgY2FsbAorICogcmVhZGFoZWFkX3RocmVhZF9leGl0KCkuICBUaGlz IHdpbGwgZXhpdCB0aGUgdGhyZWFkLiAgUGFzcy1zcGVjaWZpYworICogY2xlYW4gdXAgd2lsbCBu b3QgaGFwcGVuIHVudGlsIHRoZSBtYWluIHRocmVhZCBjYWxscyB0aGUgcGFzcyBleGl0CisgKiBm dW5jdGlvbiAoY2xlYW4gdXAgc2hvdWxkIGJlIGRvbmUgaW4gdGhlIHNhbWUgY29udGV4dCBhcwor ICogaW5pdGlhbGl6YXRpb24pLgorICoKKyAqIElmIHNvbWV0aGluZyBnb2VzIGRyYXN0aWNhbGx5 IHdyb25nLCB0aGUgcGFzcyBoYXMgdG8gYmUgcmVzdGFydGVkLAorICogb3IgcmVhZGFoZWFkIG5l ZWRzIHRvIGJlIGRpc2FibGVkIGltbWVkaWF0ZWx5IGZvciBhbnkgcmVhc29uLCBjYWxsCisgKiBl eHQyZnNfcmVhZGFoZWFkX2tpbGwoKS4gIFRoaXMgd2lsbCBzZXQgdGhlICJleGl0IGFuZCBjbGVh bnVwIgorICogdmFyaWFibGUuICBUaGUgcmVhZGFoZWFkIHRocmVhZCB3aWxsIGV2ZW50dWFsbHkg Y2hlY2sgaXQgYW5kCisgKiBjb3JyZWN0bHkgY2xlYW4gdXAgYW5kIGtpbGwgdGhlIGN1cnJlbnQg cmVhZGFoZWFkIHRocmVhZC4gIEZyb20KKyAqIHRoaXMgcG9pbnQgb24sIHJlYWRhaGVhZCBpcyBk aXNhYmxlZCBhbmQgbm8gZnV0dXJlIHJlYWRhaGVhZAorICogcmVxdWVzdHMgd2lsbCBhY3R1YWxs eSBzdGFydC4gIElmIHlvdSB3YW50IHJlYWRhaGVhZCB0byBzdGFydAorICogYWdhaW4sIHN0YXJ0 IG92ZXIgYWdhaW4gd2l0aCBleHQyZnNfcmVhZGFoZWFkX2luaXQoKS4KKyAqCisgKiBUaHJvdWdo b3V0IHRoZSBwYXNzLXNwZWNpZmljIHJlYWRhaGVhZCwgdXNlIHJlYWRhaGVhZF90ZXN0X2V4aXQo KQorICogdG8gZnJlcXVlbnR0bHkgY2hlY2sgZm9yIHRoZSBleGl0IGNvbmRpdGlvbiAoZS5nLiwg ZG9uJ3QgZG8gdG9vCisgKiBtdWNoIElPIHdpdGhvdXQgY2hlY2tpbmcgZm9yIGV4aXQpLgorICov CisKKy8qCisgKiBHZW5lcmljIHBvc3QtdGhyZWFkIGNyZWF0ZSBzZXR1cC4gIFJ1biBpdCBmaXJz dCB0aGluZyBhcyBzb29uIGFzCisgKiB0aGUgdGhyZWFkIGlzIGNyZWF0ZWQgKGluIHRoZSBuZXcg dGhyZWFkJ3MgY29udGV4dCkuCisgKi8KKworc3RhdGljIHZvaWQgcmVhZGFoZWFkX3RocmVhZF9z ZXR1cChzdHJ1Y3QgcmVhZGFoZWFkX3N0YXRlICpyYSkKK3sKKwkvKgorCSAqIERpc2FibGUgY2Fu Y2VsbGF0aW9uIHNvIHRoYXQgd2UgY2FuIGV4aXQgb25seSBhdCBzYWZlCisJICogcG9pbnRzLgor CSAqLworCXB0aHJlYWRfc2V0Y2FuY2Vsc3RhdGUoUFRIUkVBRF9DQU5DRUxfRElTQUJMRSwgTlVM TCk7Cit9CisKKy8qCisgKiBOb3JtYWwgcGFzcyBjb21wbGV0aW9uIGV4aXQgaGFuZGxlci4KKyAq LworCitzdGF0aWMgdm9pZCByZWFkYWhlYWRfdGhyZWFkX2V4aXQoc3RydWN0IHJlYWRhaGVhZF9z dGF0ZSAqcmEpCit7CisJZmluaXNoX2lvcyhyYSk7Cit9CisKKy8qCisgKiBDaGVjayBpZiByZWFk YWhlYWQgc2hvdWxkIGV4aXQgZW50aXJlbHkuICBDdXJyZW50bHkgaXQncyBqdXN0IGEKKyAqIGNo ZWNrIGFuZCBhbiBleGl0LCBidXQgaWYgYW55dGhpbmcgaXMgYWRkZWQsIG5vdGUgdGhhdCB3ZSBk byBub3QKKyAqIHdhbnQgdG8gZG8gYW55dGhpbmcgZmFuY3kgYmVjYXVzZSB3ZSdyZSB0cnlpbmcg dG8ga2lsbCBhbGwKKyAqIHJlYWRhaGVhZCBhY3Rpdml0eSBhcyBzb29uIGFzIHBvc3NpYmxlIHdp dGhvdXQgZG9pbmcgYW55dGhpbmcKKyAqIGRhbmdlcm91cy4gIEFsbCBwYXNzLXNwZWNpZmljIGNs ZWFudXAgaXMgZG9uZSBpbiB0aGUgY29udGV4dCBvZiB0aGUKKyAqIGNhbGxlci4KKyAqCisgKiBU aGlzIGZ1bmN0aW9uIG1heSBub3QgYmUgY2FsbGVkIHdpdGggdGhlIGNhY2hlIG11dGV4IGhlbGQu CisgKi8KKworc3RhdGljIHZvaWQgcmVhZGFoZWFkX3Rlc3RfZXhpdChzdHJ1Y3QgcmVhZGFoZWFk X3N0YXRlICpyYSkKK3sKKwlpZiAoIXJhLT5zaG91bGRfZXhpdCkKKwkJcmV0dXJuOworCisJZnBy aW50ZihzdGRlcnIsICJSZWFkYWhlYWQgdGhyZWFkIGR5aW5nIGFuIHVudGltZWx5IGRlYXRoLlxu Iik7CisKKwlyYS0+ZW5hYmxlZCA9IDA7CisJcHRocmVhZF9leGl0KE5VTEwpOworfQorCisvKgor ICogRXhpdCBub3cuICBJbml0aWF0ZWQgZnJvbSB0aGUgcmVhZGFoZWFkIHRocmVhZCwgcmF0aGVy IHRoYW4gdGhlCisgKiBtYWluIHRocmVhZCBhcyBpbiBleHQyZnNfcmVhZGFoZWFkX2tpbGwoKS4K KyAqCisgKiBUaGlzIGZ1bmN0aW9uIG1heSBub3QgYmUgY2FsbGVkIHdpdGggdGhlIGNhY2hlIG11 dGV4IGhlbGQuCisgKi8KKworc3RhdGljIHZvaWQgcmVhZGhlYWRfdGhyZWFkX2V4aXRfbm93KHN0 cnVjdCByZWFkYWhlYWRfc3RhdGUgKnJhKQoreworCXJhLT5zaG91bGRfZXhpdCA9IDE7CisJcmVh ZGFoZWFkX3Rlc3RfZXhpdChyYSk7Cit9CisKKy8qCisgKiBUaGUgaW5vZGUgcmVhZGFoZWFkIG1h aW4gZnVuY3Rpb24gaXRlcmF0ZXMgb3ZlciBhbGwgdGhlIGlub2RlcyBpbgorICogdGhlIGZpbGUg c3lzdGVtLCByZWFkaW5nIHRoZSBpbmRpcmVjdCBibG9ja3MgaWYgbmVjZXNzYXJ5LCB0byBnZXQK KyAqIGRhdGEgaW4gY2FjaGUgYXMgZWZmaWNpZW50bHkgYXMgcG9zc2libGUuICBUaGUgbWFpbiB0 aHJlYWQgaXNzdWVzCisgKiBJT3Mgc3luY2hyb25vdXNseSBhbmQgYXMtbmVlZGVkOyB3ZSBjYW4g ZG8gYmV0dGVyLgorICovCisKK3ZvaWQgKiByZWFkYWhlYWRfaW5vZGVfbG9vcCh2b2lkICphcmcp Cit7CisJc3RydWN0IHJlYWRhaGVhZF9zdGF0ZSAqcmEgPSAoc3RydWN0IHJlYWRhaGVhZF9zdGF0 ZSAqKSBhcmc7CisJc3RydWN0IGV4dDJfaW5vZGUgKmlub2RlOworCWV4dDJfaW5vX3QgaW5vID0g MDsKKworCXJlYWRhaGVhZF90aHJlYWRfc2V0dXAocmEpOworCisJZHByaW50ZigiIFJBOiAlc1xu IiwgX19GVU5DVElPTl9fKTsKKworCWV4dDJmc19zZXRfaW5vZGVfY2FsbGJhY2socmEtPnNjYW4s IHJlYWRhaGVhZF9zY2FuX2NhbGxiYWNrLCByYSk7CisKKwkvKiBTdGFydCBmaXJzdCBiZyByZWFk YWhlYWQsIHJlc3QgYXJlIHRyaWdnZXJlZCBieSBjYWxsYmFjayAqLworCXJlYWRhaGVhZF9pbm9k ZV90YWJsZXMocmEsIDAsIDEpOworCisJZG8geworCQlleHQyZnNfZ2V0X25leHRfaW5vZGVfcHRy KHJhLT5zY2FuLCAmaW5vLCAmaW5vZGUpOworCQkvKiBJcyBpdCBpbnRlcmVzdGluZz8gUmVhZGFo ZWFkIGl0cyBpbmRpcmVjdCBibG9ja3MgKi8KKwkJaWYgKCFyYS0+c2hvdWxkX3JlYWRfaW5vZGUg fHwgcmEtPnNob3VsZF9yZWFkX2lub2RlKGlub2RlKSkKKwkJCXJlYWRhaGVhZF9pbm9kZShyYSwg aW5vZGUsIGlubyk7CisJCS8qCisJCSAqIENoZWNrIGFmdGVyIGV2ZXJ5IGlub2RlIGZvciBleGl0 IHJlcXVlc3Q7IHdlIGNhbgorCQkgKiBwcm9jZXNzIGEgbG90IG9mIGlub2RlcyBiZWZvcmUgaGl0 dGluZyBhbnkgb3RoZXIKKwkJICogZXhpdCBwb2ludHMuCisJCSAqLworCQlyZWFkYWhlYWRfdGVz dF9leGl0KHJhKTsKKwl9IHdoaWxlIChpbm8pOworCisJcmVhZGFoZWFkX3RocmVhZF9leGl0KHJh KTsKKwkvKiBSZXR1cm4gdmFsdWUgaWdub3JlZCAqLworCXJldHVybiBOVUxMOworfQorCisvKgor ICogSGVscGVyIGZ1bmN0aW9uIGZvciBleHQyZnNfZGJsaXN0X2l0ZXJhdGUuCisgKi8KKworc3Rh dGljIGludCBpdGVyX2RibGlzdChleHQyX2ZpbHN5cyBmcywgc3RydWN0IGV4dDJfZGJfZW50cnkg KmRiLAorCQkgICAgICAgdm9pZCAqcHJpdl9kYXRhKQoreworCXN0cnVjdCByZWFkYWhlYWRfc3Rh dGUgKnJhID0gKHN0cnVjdCByZWFkYWhlYWRfc3RhdGUgKikgcHJpdl9kYXRhOworCisJcXVldWVf YmxrcyhyYSwgZGItPmJsaywgMSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIERvIHRoZSBk aXJlY3RvcnkgYmxvY2sgcmVhZGFoZWFkLgorICovCisKK3ZvaWQgKiByZWFkYWhlYWRfZGJsaXN0 KHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgcmVhZGFoZWFkX3N0YXRlICpyYSA9IChzdHJ1Y3QgcmVh ZGFoZWFkX3N0YXRlICopIGFyZzsKKwllcnJjb2RlX3QgZXJyOworCisJcmVhZGFoZWFkX3RocmVh ZF9zZXR1cChyYSk7CisKKwllcnIgPSBleHQyZnNfZGJsaXN0X2l0ZXJhdGUocmEtPmRibGlzdCwg aXRlcl9kYmxpc3QsIHJhKTsKKworCWlmIChlcnIpCisJCWZwcmludGYoc3RkZXJyLCAiRXJyb3Ig dHJhdmVyc2luZyBkaXJlY3RvcnkgYmxvY2tzXG4iKTsKKworCXJlYWRhaGVhZF90aHJlYWRfZXhp dChyYSk7CisKKwkvKiBSZXR1cm4gdmFsdWUgaWdub3JlZCAqLworCXJldHVybiBOVUxMOworfQor CisvKgorICogVGhlIGNsaWVudCByb3V0aW5lcyBmb3IgcmVhZGFoZWFkIGFyZSBjYWxsZWQgb25s eSBieSB0aGUgbWFpbgorICogdGhyZWFkLiAgVGhlIHJlc3Qgb2YgdGhlIHJlYWRhaGVhZCBmdW5j dGlvbnMgYXJlIGNhbGxlZCBvbmx5IGJ5IHRoZQorICogcmVhZGFoZWFkIHRocmVhZC4gIFRoZSBj bGllbnQgaW5pdGlhbGl6ZXMsIHN0YXJ0cywgYW5kIHN0b3BzIHRoZQorICogcmVhZGFoZWFkIHRo cmVhZC4gIEl0IGluZm9ybXMgdGhlIHJlYWRhaGVhZCB0aHJlYWQgd2hlbiBpdCBoYXMKKyAqIGZp bmlzaGVkIHJlYWRpbmcgYmxvY2tzIGZyb20gdGhlIGNhY2hlLgorICoKKyAqIFRoZSBkaXN0aW5j dGlvbiBiZXR3ZWVuIHRoZSB0d28gdGhyZWFkcyBpcyBlc3BlY2lhbGx5IGltcG9ydGFudAorICog d2hlbiBpdCBjb21lcyB0byBsc2VlaygpL3JlYWQoKS93cml0ZSgpIG9uIHRoZSBkZXZpY2UgZmls ZQorICogZGVzY3JpcHRvci4gIFRoZSB0d28gdGhyZWFkcyBtdXN0IG5ldmVyIHNoYXJlIGFuIGZk IG9yIHRoZSBsc2VlaygpcworICogd2lsbCByYWNlIHdpdGggZWFjaCBvdGhlci4gIFRoZSByZWFk YWhlYWQgdGhyZWFkJ3MgZmQgaXMgaW4gdGhlCisgKiByZWFkYWhlYWQgc3RydWN0OyB0aGUgbWFp biB0aHJlYWQncyBmZCBpcyBpbiB0aGUgY29udGV4dCBzdHJ1Y3QKKyAqIChib3RoIGFyZSBpbnNp ZGUgdGhlIGV4dDJfZmlsc3lzIHN0dXJjdHVyZSkuICBUaGUgbWFpbiBzeW1wdG9tIG9mCisgKiB0 aGlzIGJ1ZyBpcyBnZXR0aW5nIGJhY2sgZGF0YSB3aGljaCBpcyBmcm9tIHNvbWV3aGVyZSBvbiBk aXNrLCBqdXN0CisgKiBub3QgdGhlIHNvbWV3aGVyZSB5b3Ugd2FudGVkLgorICoKKyAqLworCitz dGF0aWMgaW50IHJlYWRhaGVhZF9kaXNhYmxlZChzdHJ1Y3QgcmVhZGFoZWFkX3N0YXRlICpyYSkK K3sKKwlpZiAoKHJhID09IE5VTEwpIHx8ICFyYS0+ZW5hYmxlZCkKKwkJcmV0dXJuIDE7CisKKwly ZXR1cm4gMDsKK30KKworLyoKKyAqIFB1dCB0aGUgY2FjaGUgYW5kIGFzc29jaWF0ZWQgbG9ja3Mg aW50byB0aGUgcmlnaHQgc3RhdGUgdG8gc3RhcnQgYQorICogcmVhZGFoZWFkIHRocmVhZC4KKyAq LworCitzdGF0aWMgdm9pZCByZWFkYWhlYWRfY2FjaGVfaW5pdChzdHJ1Y3QgcmVhZGFoZWFkX3N0 YXRlICpyYSkKK3sKKwlwdGhyZWFkX211dGV4X2luaXQoJnJhLT5jYWNoZV9tdXRleCwgTlVMTCk7 CisJcHRocmVhZF9jb25kX2luaXQoJnJhLT5jYWNoZV93YWtlLCBOVUxMKTsKKworCXJhLT5jYWNo ZV91c2VkID0gMDsKKwlyYS0+Y2FjaGVfbmVlZGVkID0gMDsKKwlyYS0+Y2FjaGVfcmVhZGFoZWFk X2RvbmUgPSAwOworfQorCitlcnJjb2RlX3QgZXh0MmZzX3JlYWRhaGVhZF9pbml0KGV4dDJfZmls c3lzIGZzLCB1bnNpZ25lZCBpbnQgbWF4X2lvcywKKwkJCQl1bnNpZ25lZCBpbnQgY2FjaGVfbWF4 LAorCQkJCXN0cnVjdCByZWFkYWhlYWRfc3RhdGUgKipyZXRfcmEpCit7CisJc3RydWN0IHJlYWRh aGVhZF9zdGF0ZSAqcmE7CisJaW50IHJldHZhbDsKKworCWRwcmludGYoIk1UOiAlc1xuIiwgX19G VU5DVElPTl9fKTsKKworCSpyZXRfcmEgPSBOVUxMOworCisJLyoKKwkgKiBEb24ndCBpbml0aWFs aXplIHJlYWRhaGVhZCB1bmxlc3MgZXhwbGljaXRseSBlbmFibGVkIGJ5IHRoZQorCSAqIHVzZXIg cGFzc2luZyB0aGUgbWF4IGlvcyBhcmd1bWVudC4KKwkgKi8KKworCWlmIChtYXhfaW9zID09IDAp CisJCXJldHVybiAwOworCisJcmV0dmFsID0gZXh0MmZzX2dldF9tZW0oc2l6ZW9mKCpyYSksICZy YSk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKworCS8qIFJlb3BlbiB0aGUgZGV2 aWNlIHNvIHdlIGRvbid0IHNoYXJlIHRoZSBmaWxlIHBvaW50ZXIgKi8KKwlyZXR2YWwgPSBleHQy ZnNfb3BlbjIoZnMtPmRldmljZV9uYW1lLCBOVUxMLAorCQkJICAgICAgLyogRG9uJ3QgYXNrIGZv ciBleGNsdXNpdmUgb3BlbiBiZWNhdXNlCisJCQkgICAgICAgKiB3ZSBkZWZpbml0ZWx5IHdvbid0 IGdldCBpdC4gKi8KKwkJCSAgICAgIChmcy0+ZmxhZ3MgJiYgfklPX0ZMQUdfRVhDTFVTSVZFKSwg MCwgMCwKKwkJCSAgICAgIGZzLT5pby0+bWFuYWdlciwgJnJhLT5mcyk7CisJaWYgKHJldHZhbCkK KwkJZ290byBvdXQ7CisKKwkvKiBUaHJlYWQgZXhpdC9raWxsIG1hbmFnZW1lbnQgKi8KKwlyYS0+ c2hvdWxkX2V4aXQgPSAwOworCXJhLT50aHJlYWRfZXhpdCA9IE5VTEw7CisKKwkvKiBJTyBxdWV1 ZSBzZXQgdXAgKi8KKwlyYS0+bWF4X2lvcyA9IG1heF9pb3M7CisJZHByaW50ZigiTVQ6ICVzOiBN YXhpbXVtIGlvcyAldVxuIiwgX19GVU5DVElPTl9fLCByYS0+bWF4X2lvcyk7CisJcmEtPnRpbWVv dXQgPSAxMDA7IC8qIG1pbGxpc2Vjb25kcywgY3VycmVudGx5IG5vdCB1c2VkICovCisJLyogTm90 IHN1cmUgaG93IGJpZyB0byBtYWtlIHRoaXMsIGJ1dCBtdXN0IGJlIGF0IGxlYXN0IG1heF9pb3Mg Ki8KKwlyYS0+aW9fcXVldWVfc2l6ZSA9IHJhLT5tYXhfaW9zICogMTA7CisJZHByaW50ZigiTVQ6 ICVzOiBJTyBxdWV1ZSBzaXplICV1XG4iLCBfX0ZVTkNUSU9OX18sIHJhLT5pb19xdWV1ZV9zaXpl KTsKKwlyYS0+aW9zX3F1ZXVlZCA9IDA7CisJcmV0dmFsID0gZXh0MmZzX2dldF9tZW0oc2l6ZW9m KHJhLT5pb19xdWV1ZVswXSkgKiByYS0+aW9fcXVldWVfc2l6ZSwKKwkJCQkmcmEtPmlvX3F1ZXVl KTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIG91dF9jbG9zZTsKKwkvKiBDbGVhciB0aGUgcXVldWUg Zm9yIGRlYnVnZ2luZyBwdXJwb3NlcyAqLworCW1lbXNldChyYS0+aW9fcXVldWUsIDAsIHNpemVv ZihyYS0+aW9fcXVldWVbMF0pICogcmEtPmlvX3F1ZXVlX3NpemUpOworCisJLyogQ2FjaGUgc2V0 IHVwICovCisKKwkvKgorCSAqIE1heCBtZW1vcnkgbXVzdCBiZSBhdCBsZWFzdCBhcyBiaWcgYXMg YW4gaW5vZGUgdGFibGUuICBNYWtlCisJICogdGhlIG1pbmltdW0gZm91ciB0aW1lcyB0aGF0IHNv IHdlIGNhbiBnZXQgbW9yZSB0aGFuIG9uZQorCSAqIGJsb2NrIGdyb3VwIGFoZWFkIGFuZCByZWFk IHNvbWUgaW5kaXJlY3QgYmxvY2tzIHRvby4KKwkgKi8KKwlyYS0+Y2FjaGVfbWF4ID0gY2FjaGVf bWF4OworCS8qIFhYWCBjdXJyZW50bHkgbWVhc3VyaW5nIGNhY2hlX21heCBpbiBmaWxlIHN5c3Rl bSBibG9ja3MsIHl1Y2sgKi8KKwlpZiAocmEtPmNhY2hlX21heCA8IHJhLT5mcy0+aW5vZGVfYmxv Y2tzX3Blcl9ncm91cCkgeworCQlyYS0+Y2FjaGVfbWF4ID0gNCAqIHJhLT5mcy0+aW5vZGVfYmxv Y2tzX3Blcl9ncm91cDsKKwkJaWYgKGNhY2hlX21heCAhPSAwKQorCQkJLyogWFhYIHVzZSBleHQy IHByaW50aW5nIHJvdXRpbmVzICovCisJCQlmcHJpbnRmKHN0ZGVyciwgIk1heGltdW0gY2FjaGUg JXUgYmxvY2tzIHRvbyBzbWFsbDsgIgorCQkJCSJyYWlzZWQgdG8gJXUgYmxvY2tzIiwgY2FjaGVf bWF4LAorCQkJCXJhLT5jYWNoZV9tYXgpOworCX0KKwlkcHJpbnRmKCJNVDogJXM6IE1heGltdW0g Y2FjaGUgJXVcbiIsIF9fRlVOQ1RJT05fXywgcmEtPmNhY2hlX21heCk7CisKKwlyZWFkYWhlYWRf Y2FjaGVfaW5pdChyYSk7CisJLyoKKwkgKiBXaGVuIHRoZSBjYWNoZSBnZXRzIGZ1bGwsIHRoZSBy ZWFkYWhlYWQgdGhyZWFkIHNsZWVwcy4KKwkgKiBXaGVuIHRoZSBjYWNoZSBnZXRzIGVtcHR5LCB0 aGUgbWFpbiB0aHJlYWQgc2xlZXBzLiAgSWYgd2UKKwkgKiB3YWtlIHRoZSB0aHJlYWRzIGF0IGVt cHR5L2Z1bGwsIHRoZW4gd2UgZW5kIHVwIHdpdGggYW4KKwkgKiBpbmVmZmljaWVudCBwaW5nLXBv bmcgZWZmZWN0IHdoZXJlIHRoZSByZWFkYWhlYWQgdGhyZWFkCisJICogb25seSBpc3N1ZXMgb25l IGlvIGJlZm9yZSBnb2luZyBiYWNrIHRvIHNsZWVwLiAgVGhlIGlkZWFsCisJICogcGF0dGVybiBp cyB3aGVyZSB0aGUgcmVhZGFoZWFkIHRocmVhZCBjYWNoZXMgYSBidW5jaCBvZgorCSAqIGJsb2Nr cywgdGhlbiBnb2VzIGJhY2sgdG8gc2xlZXAgdW50aWwgYSBsb3Qgb2YgdGhlIGNhY2hlIGlzCisJ ICogZnJlZSBhZ2Fpbiwgc28gaXQgaXNzdWUgbG90cyBvZiBpb3MgaW4gcGFyYWxsZWwuICBXaGVu IHRoZQorCSAqIG1haW4gdGhyZWFkIHdha2VzL3NsZWVwcyBpcyBsZXNzIGltcG9ydGFudCwgb3Ro ZXIgdGhhbgorCSAqIGF2b2lkaW5nIGEgbG90IG9mIHNpZ25hbC93YWtlIHRyYWZmaWMgaWYgaXQn cyBuZWFyIHRoZQorCSAqIHJlYWRhaGVhZCB0aHJlYWQgd2FrZSBwb2ludCBvciBuZWFyIHRoZSBj YWNoZSBib3VuZGFyaWVzLgorCSAqIFdhaXQgdG8gd2FrZSBpdCB1cCB1bnRpbCB0aGUgY2FjaGUg aXMgY2xvc2UgdG8gZnVsbC4KKwkgKgorCSAqIFhYWCBTaG91bGQgd2FrZSBtYWluIHRocmVhZCBz b29uZXI/CisJICovCisKKwkvKiBSZXN0YXJ0IHJlYWRhaGVhZCB3aGVuIHRoZSBjYWNoZSBnZXRz IHRoaXMgbG93ICovCisJcmEtPmNhY2hlX3Jlc3RhcnRfcmEgPSByYS0+Y2FjaGVfbWF4IC8gMzsK KwlkcHJpbnRmKCJNVDogJXM6IFJlYWRhaGVhZCByZXN0YXJ0cyBhdCAldVxuIiwgX19GVU5DVElP Tl9fLAorCSAgICAgICByYS0+Y2FjaGVfcmVzdGFydF9yYSk7CisJcmEtPmNhY2hlX3Jlc3RhcnRf bWFpbiA9IChyYS0+Y2FjaGVfbWF4ICogMikgLyAzOworCWRwcmludGYoIk1UOiAlczogTWFpbiB0 aHJlYWQgcmVzdGFydHMgYXQgJXVcbiIsIF9fRlVOQ1RJT05fXywKKwkgICAgICAgcmEtPmNhY2hl X3Jlc3RhcnRfbWFpbik7CisKKwkvKiBNYXhpdW0gaW8gc2l6ZSAoaW4gYmxvY2tzKSBzaG91bGQg YmUgbGVzcyB0aGFuIHRoZSBjYWNoZSBzaXplICovCisJLyogWFhYIHNob3VsZCBiZSBjb21tYW5k IGxpbmUgb3B0aW9uICovCisJcmEtPm1heF9pb19zaXplID0gKDI1NiAqIDEwMjQpIC8gcmEtPmZz LT5ibG9ja3NpemU7CisJaWYgKHJhLT5tYXhfaW9fc2l6ZSA+IHJhLT5jYWNoZV9tYXgpIHsKKwkJ ZHByaW50ZigiTVQ6ICVzOiBNYXhpbXVtIGlvIHNpemUgJXUgbGFyZ2VyIHRoYW4gY2FjaGUgJXVc biIsCisJCQlfX0ZVTkNUSU9OX18sIHJhLT5tYXhfaW9fc2l6ZSwgcmEtPmNhY2hlX21heCk7CisJ CXJhLT5tYXhfaW9fc2l6ZSA9IHJhLT5jYWNoZV9tYXggLyA0OworCX0KKwlkcHJpbnRmKCJNVDog JXM6IE1heGltdW0gaW8gc2l6ZSAldVxuIiwgX19GVU5DVElPTl9fLCByYS0+bWF4X2lvX3NpemUp OworCisJLyogTWFrZSBzY3JhdGNoIGJ1ZmZlciBiaWcgZW5vdWdoIGZvciBsYXJnZXN0IGlvcyAq LworCXJldHZhbCA9IGV4dDJmc19nZXRfbWVtKHJhLT5tYXhfaW9fc2l6ZSAqIHJhLT5mcy0+Ymxv Y2tzaXplLAorCQkJCSZyYS0+c2NyYXRjaF9idWYpOworCWlmIChyZXR2YWwpCisJCWdvdG8gb3V0 X2ZyZWVfcXVldWU7CisKKwlyYS0+ZW5hYmxlZCA9IDE7CisJKnJldF9yYSA9IHJhOworCXJldHVy biAwOworCisgb3V0X2ZyZWVfcXVldWU6CisJZXh0MmZzX2ZyZWVfbWVtKCZyYS0+aW9fcXVldWUp OworIG91dF9jbG9zZToKKwlleHQyZnNfY2xvc2UocmEtPmZzKTsKKyBvdXQ6CisJZXh0MmZzX2Zy ZWVfbWVtKCZyYSk7CisJZnByaW50ZihzdGRlcnIsICJSZWFkYWhlYWQgZmFpbGVkIHRvIGluaXRp YWxpemUuXG4iKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCit2b2lkIGV4dDJmc19yZWFkYWhlYWRf ZXhpdChzdHJ1Y3QgcmVhZGFoZWFkX3N0YXRlICoqcmV0X3JhKQoreworCXN0cnVjdCByZWFkYWhl YWRfc3RhdGUgKnJhID0gKnJldF9yYTsKKworCWRwcmludGYoIk1UOiAlc1xuIiwgX19GVU5DVElP Tl9fKTsKKworCWlmICghcmEpCisJCXJldHVybjsKKworCXB0aHJlYWRfbXV0ZXhfZGVzdHJveSgm cmEtPmNhY2hlX211dGV4KTsKKwlwdGhyZWFkX2NvbmRfZGVzdHJveSgmcmEtPmNhY2hlX3dha2Up OworCWV4dDJmc19mcmVlX21lbSgmcmEtPnNjcmF0Y2hfYnVmKTsKKwlleHQyZnNfZnJlZV9tZW0o JnJhLT5pb19xdWV1ZSk7CisJZXh0MmZzX2Nsb3NlKHJhLT5mcyk7CisJZXh0MmZzX2ZyZWVfbWVt KCZyYSk7CisJKnJldF9yYSA9IE5VTEw7Cit9CisKKy8qCisgKiBSZWxlYXNlIGJsb2NrcyB0aGF0 IGhhdmUgYWxyZWFkeSBiZWVuIHJlYWQuICBQcmltaXRpdmUgZm9yIHRoZQorICogdmFyaW91cyBy ZWxlYXNlIHJ1bmN0aW9ucy4KKyAqLworCitzdGF0aWMgdm9pZCBibG9ja3NfcmVsZWFzZShzdHJ1 Y3QgcmVhZGFoZWFkX3N0YXRlICpyYSwgZXh0Ml9maWxzeXMgZnMsCisJCQkgICBibGtfdCBibGss IGludCBjb3VudCkKK3sKKwlkcHJpbnRmKCJNVDogJXM6IGNhY2hlX3VzZWQgJWQgcmVsZWFzaW5n ICVkXG4iLCBfX0ZVTkNUSU9OX18sCisJCXJhLT5jYWNoZV91c2VkLCBjb3VudCk7CisJcHRocmVh ZF9tdXRleF9sb2NrKCZyYS0+Y2FjaGVfbXV0ZXgpOworCXJhLT5jYWNoZV91c2VkIC09IGNvdW50 OworCS8qCisJICogRGlkIHdlIGdldCBhaGVhZCBvZiByZWFkYWhlYWQ/CisJICoKKwkgKiBYWFgg TWFpbiB0aHJlYWQgaGFuZ3Mgb24gY2FjaGVfdXNlZCA9PSAwOyBjdXJyZW50CisJICogd29ya2Fy b3VuZCBpcyB0byBhZGQgYSBib2d1cyBibG9jayB0byB0aGUgY2FjaGUgb24gZXhpdC4KKwkgKi8K KwlpZiAocmEtPmNhY2hlX3VzZWQgPD0gMCkgeworCQlkcHJpbnRmKCJNVDogJXM6IENhY2hlIGVt cHR5LCB3YWtpbmcgcmVhZGFoZWFkIHRocmVhZFxuIiwKKwkJCV9fRlVOQ1RJT05fXyk7CisJCXB0 aHJlYWRfY29uZF9zaWduYWwoJnJhLT5jYWNoZV93YWtlKTsKKwkJZHByaW50ZigiTVQ6ICVzOiBX YWl0aW5nIGZvciByZWFkYWhlYWQgdG8gcG9wdWxhdGUgY2FjaGUuLi5cbiIsCisJCQlfX0ZVTkNU SU9OX18pOworCQkvKiBYWFggdXNlIHRpbWVvdXQgdG8gYXZvaWQgZGVhZGxvY2sgb24gZmF0YWwg YnVncyAqLworCQlwdGhyZWFkX2NvbmRfd2FpdCgmcmEtPmNhY2hlX3dha2UsICZyYS0+Y2FjaGVf bXV0ZXgpOworCQlkcHJpbnRmKCJNVDogJXM6IENvbnRpbnVpbmcsIGNhY2hlX3VzZWQgJWRcbiIs IF9fRlVOQ1RJT05fXywKKwkJCXJhLT5jYWNoZV91c2VkKTsKKwl9CisJLyoKKwkgKiBXYWtlIHJl YWRhaGVhZCB0aHJlYWQgaWYgd2UgaGF2ZSBlbm91Z2ggZnJlZSBjYWNoZSB0byBpc3N1ZQorCSAq IGlvIGVmZmljaWVudGx5LgorCSAqLworCWlmICgocmEtPmNhY2hlX3VzZWQgKyBjb3VudCkgPiBy YS0+Y2FjaGVfcmVzdGFydF9yYSAmJgorCSAgICAocmEtPmNhY2hlX3VzZWQgPD0gcmEtPmNhY2hl X3Jlc3RhcnRfcmEpKSB7CisJCS8qIERvIHdlIGhhdmUgZW5vdWdoIGNhY2hlIHRvIHNhdGlzZnkg YW55IHNwZWNpZmljIG5lZWQ/ICovCisJCWlmICgocmEtPmNhY2hlX3VzZWQgKyByYS0+Y2FjaGVf bmVlZGVkIDw9IHJhLT5jYWNoZV9tYXgpKSB7CisJCQlkcHJpbnRmKCJNVDogJXM6IENhY2hlIGF2 YWlsYWJsZSwgd2FraW5nIHJlYWRhaGVhZCAiCisJCQkJIihuZWVkZWQgJXUgdXNlZCAlZClcbiIs IF9fRlVOQ1RJT05fXywKKwkJCQlyYS0+Y2FjaGVfbmVlZGVkLCByYS0+Y2FjaGVfdXNlZCk7CisJ CQlwdGhyZWFkX2NvbmRfc2lnbmFsKCZyYS0+Y2FjaGVfd2FrZSk7CisJCQkvKiBEb24ndCBrZWVw IHdha2luZyBpdCBvdmVyIGFuZCBvdmVyLi4uICovCisJCQlyYS0+Y2FjaGVfbmVlZGVkID0gMDsK KwkJfQorCX0KKwlwdGhyZWFkX211dGV4X3VubG9jaygmcmEtPmNhY2hlX211dGV4KTsKKwkvKiBP cHRpb25hbCBidXQgbmljZTogTGV0IHZtIGtub3cgd2UgZG9uJ3QgbmVlZCB0aGVzZSBhbnkgbW9y ZSAqLworCWlvX2NoYW5uZWxfY2FjaGVfcmVsZWFzZShmcy0+aW8sIGJsaywgY291bnQpOworfQor CisvKgorICogZXh0MmZzX2Jsb2NrX2l0ZXJhdGUyIGhlbHBlciBmdW5jdGlvbiBmb3IgcmVsZWFz aW5nIGluZGlyZWN0CisgKiBibG9ja3MuCisgKi8KKworc3RhdGljIGludCBpbmRfYmxvY2tfcmVs ZWFzZShleHQyX2ZpbHN5cyBmcywgYmxrX3QgKmJsb2NrX25yLAorCQkgIGUyX2Jsa2NudF90IGJs b2NrY250LAorCQkgIGJsa190IHJlZl9ibG9jayBFWFQyRlNfQVRUUigodW51c2VkKSksCisJCSAg aW50IHJlZl9vZmZzZXQgRVhUMkZTX0FUVFIoKHVudXNlZCkpLAorCQkgIHZvaWQgKnByaXZfZGF0 YSkKK3sKKwlzdHJ1Y3QgcmVhZGFoZWFkX3N0YXRlICpyYSA9IChzdHJ1Y3QgcmVhZGFoZWFkX3N0 YXRlICopIHByaXZfZGF0YTsKKworCS8qCisJICogVGhlIGJsb2NrY250IGFyZyBpcyB0aGUgdG90 YWwgbnVtYmVyIG9mIGRhdGEgYmxvY2tzICg/KQorCSAqIHRyYXZlcnNlZCBzbyBmYXIgZm9yIHRo aXMgaW5vZGUsIG5vdCB0aGUgbnVtYmVyIG9mIGJsb2NrcworCSAqIHRvIHJlbGVhc2UuCisJICov CisJYmxvY2tzX3JlbGVhc2UocmEsIGZzLCAqYmxvY2tfbnIsIDEpOworCisJcmV0dXJuIDA7Cit9 CisKKy8qCisgKiBNYXJrIGFsbCBjYWNoZWQgYmxvY2tzIGZyb20gdGhpcyBpbm9kZSBhcyByZWxl YXNlZC4KKyAqLworCit2b2lkIGV4dDJmc19yZWFkYWhlYWRfaW5vZGVfcmVsZWFzZShzdHJ1Y3Qg cmVhZGFoZWFkX3N0YXRlICpyYSwKKwkJCQkgICAgZXh0Ml9maWxzeXMgZnMsIGV4dDJfaW5vX3Qg aW5vLCBjaGFyICpibG9ja19idWYpCit7CisJZXJyY29kZV90IGVycjsKKworCWRwcmludGYoIk1U OiAlczogJXVcbiIsIF9fRlVOQ1RJT05fXywgaW5vKTsKKworCWlmIChyZWFkYWhlYWRfZGlzYWJs ZWQocmEpKQorCQlyZXR1cm47CisKKwkvKgorCSAqIERvbid0IHVzZSByYS0+ZnMgLSB0aGF0IGNv bnRhaW5zIHRoZSByZWFkYWhlYWQgdGhyZWFkJ3MgZmQKKwkgKiAtIHVzaW5nIHRoZSBzYW1lIGZk IHJlc3VsdHMgaW4gZXhjaXRpbmcgbHNlZWsoKS9yZWFkKCkKKwkgKiByYWNlcy4KKwkgKi8KKwll cnIgPSBleHQyZnNfYmxvY2tfaXRlcmF0ZTIoZnMsIGlubywgQkxPQ0tfRkxBR19JTkRfT05MWSwK KwkJCQkgICAgYmxvY2tfYnVmLCBpbmRfYmxvY2tfcmVsZWFzZSwgcmEpOworCisJLyogQ2FuJ3Qg cmV0dXJuIHRoaXMgZXJyb3IsIGJ1dCBjYW4gbm90aWZ5IHVzZXIgKi8KKwlpZiAoZXJyKQorCQlm cHJpbnRmKHN0ZGVyciwgIiVzOiBFcnJvciAlZCB0cmF2ZXJzaW5nIGluZGlyZWN0IGJsb2NrcyAi CisJCQkiZm9yIGlubyAldVxuIiwgIF9fRlVOQ1RJT05fXywgKGludCkgZXJyLCBpbm8pOworfQor CisvKgorICogTWFyayBhbGwgY2FjaGVkIGJsb2NrcyBmcm9tIHRoaXMgaW5vZGUgdGFibGUgYXMg dXNlZC4KKyAqLworCit2b2lkIGV4dDJmc19yZWFkYWhlYWRfaW5vZGVfdGFibGVfcmVsZWFzZShz dHJ1Y3QgcmVhZGFoZWFkX3N0YXRlICpyYSwKKwkJCQkJICBleHQyX2ZpbHN5cyBmcywgZGdycF90 IGdyb3VwKQoreworCWlmIChyZWFkYWhlYWRfZGlzYWJsZWQocmEpKQorCQlyZXR1cm47CisKKwlk cHJpbnRmKCJNVDogJXM6IEZpbmlzaGVkIGdyb3VwICV1IGNhY2hlX3VzZWQgJXVcbiIsCisJCV9f RlVOQ1RJT05fXywgZ3JvdXAsIHJhLT5jYWNoZV91c2VkKTsKKworCWJsb2Nrc19yZWxlYXNlKHJh LCBmcywgcmEtPmZzLT5ncm91cF9kZXNjW2dyb3VwXS5iZ19pbm9kZV90YWJsZSwKKwkJICAgICAg IHJhLT5mcy0+aW5vZGVfYmxvY2tzX3Blcl9ncm91cCk7Cit9CisKKy8qCisgKiBHZW5lcmljIHRo cmVhZCBzdGFydC4gIFBhc3MgaXQgdGhlIGZ1bmN0aW9uIGZvciBzdGFydGluZyB0aGlzIHBhc3MK KyAqIG9mIHJlYWRhaGVhZC4KKyAqLworCitzdGF0aWMgdm9pZCByZWFkYWhlYWRfdGhyZWFkX3N0 YXJ0KHN0cnVjdCByZWFkYWhlYWRfc3RhdGUgKnJhLAorCQkJCSAgIHZvaWQgKiAoKnRocmVhZF9z dGFydCkodm9pZCAqKSkKK3sKKwlpZiAocHRocmVhZF9jcmVhdGUoJnJhLT50aHJlYWQsIE5VTEws IHRocmVhZF9zdGFydCwgcmEpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiVGhyZWFkIGZhaWxlZCB0 byBzdGFydC5cbiIpOworCQlyYS0+ZW5hYmxlZCA9IDA7CisJCXJldHVybjsKKwl9CisKKwkvKgor CSAqIFdhaXQgZm9yIHJlYWRhaGVhZCB0byBwdXQgc29tZXRoaW5nIGluIHRoZSBjYWNoZS4gIFRo ZQorCSAqIHJlYWRhaGVhZCB0aHJlYWQgbWlnaHQgaGF2ZSBhbHJlYWR5IHJlYWQgc29tZXRoaW5n IGludG8gdGhlCisJICogY2FjaGUgYW5kIHNpZ25hbGVkIHVzIHRvIHdha2UsIHNvIG9ubHkgd2Fp dCBpZiBub3RoaW5nIGlzCisJICogaW4gdGhlIGNhY2hlIGFscmVhZHkuCisJICovCisJcHRocmVh ZF9tdXRleF9sb2NrKCZyYS0+Y2FjaGVfbXV0ZXgpOworCWlmIChyYS0+Y2FjaGVfdXNlZCA9PSAw KQorCQlwdGhyZWFkX2NvbmRfd2FpdCgmcmEtPmNhY2hlX3dha2UsICZyYS0+Y2FjaGVfbXV0ZXgp OworCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZyYS0+Y2FjaGVfbXV0ZXgpOworfQorCisvKgorICog U2lnbmFsIHRoZSBjdXJyZW50IHJlYWRhaGVhZCB0aHJlYWQgdG8gc3RvcC4gIENhbGwgaXQgYmVm b3JlCisgKiBmcmVlaW5nIGFueSByZXNvdXJjZXMgdGhhdCB0aGUgcmVhZGFoZWFkIHRocmVhZCBt aWdodCBhY2Nlc3MuCisgKgorICogVGhpcyBmdW5jdGlvbiBtdXN0IGNvbXBsZXRlIGluIHRoZSBj YXNlIG9mIHRoZSB0aHJlYWQgZXhpdGluZworICogYmVmb3JlIG9yIGR1cmluZyB0aGlzIGZ1bmN0 aW9uLgorICovCisKK3N0YXRpYyB2b2lkIHJlYWRhaGVhZF90aHJlYWRfc3RvcChzdHJ1Y3QgcmVh ZGFoZWFkX3N0YXRlICpyYSkKK3sKKwlyYS0+c2hvdWxkX2V4aXQgPSAxOworCS8qCisJICogV2Fr ZSByZWFkYWhlYWQgdGhyZWFkIGluIGNhc2UgaXQncyB3YWl0aW5nIG9uIGNhY2hlLiAgVGhlCisJ ICogcmVhZGFoZWFkIHRocmVhZCBtdXN0IHRlc3QgZm9yIGV4aXQgYWZ0ZXIgZXZlcnkKKwkgKiBw dGhyZWFkX2NvbmRfd2FpdCgpLgorCSAqLworCXB0aHJlYWRfbXV0ZXhfbG9jaygmcmEtPmNhY2hl X211dGV4KTsKKwlwdGhyZWFkX2NvbmRfc2lnbmFsKCZyYS0+Y2FjaGVfd2FrZSk7CisJcHRocmVh ZF9tdXRleF91bmxvY2soJnJhLT5jYWNoZV9tdXRleCk7CisJLyoKKwkgKiBBdCB0aGlzIHBvaW50 LCB0aGUgcmVhZGFoZWFkIHRocmVhZCBoYXMgZWl0aGVyIChhKSBhbHJlYWR5CisJICogZXhpdGVk LCBvciAoYikgaXMgcnVubmluZyBidXQgd2lsbCBjYWxsCisJICogcmVhZGFoZWFkX3Rlc3RfZXhp dCgpIHNob3J0bHkgYW5kIGV4aXQgdGhlbi4KKwkgKi8KKwlwdGhyZWFkX2pvaW4ocmEtPnRocmVh ZCwgTlVMTCk7CisJLyogTm93IHRoZSByZWFkYWhlYWQgdGhyZWFkIGlzIGRlYWQgZm9yIHN1cmUg Ki8KKworCS8qIFJ1biB0aGUgcGFzcy1zcGVjaWZpYyBjbGVhbiB1cCAqLworCWlmIChyYS0+dGhy ZWFkX2V4aXQpCisJCXJhLT50aHJlYWRfZXhpdChyYSk7CisJcmEtPnRocmVhZF9leGl0ID0gTlVM TDsKKworCXJlYWRhaGVhZF9jYWNoZV9pbml0KHJhKTsKKwlyYS0+c2hvdWxkX2V4aXQgPSAwOwor CisJLyoKKwkgKiBDaGVjayB0byBzZWUgaWYgdGhlIHJlYWRhaGVhZCB0aHJlYWQgZW5jb3VudGVy ZWQgc29tZQorCSAqIHByb2JsZW0gYW5kIGRpc2FibGVkIHJlYWRhaGVhZC4gIEluIHRoYXQgY2Fz ZSwgY2xvc2UgZG93bgorCSAqIHJlYWRhaGVhZCBlbnRpcmVseS4gIFRvIHJlc3RhcnQsIGNhbGwK KwkgKiBleHQyZnNfcmVhZGFoZWFkX2luaXQoKS4KKwkgKi8KKwlpZiAocmVhZGFoZWFkX2Rpc2Fi bGVkKHJhKSkKKwkJZXh0MmZzX3JlYWRhaGVhZF9leGl0KCZyYSk7Cit9CisKKy8qCisgKiBVc2Ug dGhpcyB0byBraWxsIHJlYWRhaGVhZCBlbnRpcmVseSBhbmQgdHVybiBpdCBvZmYgdW50aWwKKyAq IGV4dDJmc19yZWFkYWhlYWRfaW5pdCgpIGlzIGNhbGxlZCBhZ2Fpbi4gIEl0IGlzIHNhZmUgdG8g Y2FsbCBhbnkKKyAqIGV4dDJmc19yZWFkYWhlYWRfKiBmdW5jdGlvbiBhZnRlciB0aGlzIHNpbmNl IHJlYWRhaGVhZCB3aWxsIGJlCisgKiBkaXNhYmxlZC4KKyAqLworCit2b2lkIGV4dDJmc19yZWFk YWhlYWRfa2lsbChzdHJ1Y3QgcmVhZGFoZWFkX3N0YXRlICpyYSkKK3sKKwlkcHJpbnRmKCJNVDog JXNcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlpZiAoIXJhKQorCQlyZXR1cm47CisKKwlyZWFkYWhl YWRfdGhyZWFkX3N0b3AocmEpOworCisJcmEtPmVuYWJsZWQgPSAwOworfQorCisvKgorICogQ2xl YW4gdXAgYWZ0ZXIgaW5vZGUgcmVhZGFoZWFkLgorICovCisKK3N0YXRpYyB2b2lkIHJlYWRhaGVh ZF9pbm9kZV9leGl0KHN0cnVjdCByZWFkYWhlYWRfc3RhdGUgKnJhKQoreworCWV4dDJmc19jbG9z ZV9pbm9kZV9zY2FuKHJhLT5zY2FuKTsKKwlleHQyZnNfZnJlZV9tZW0oJnJhLT50cmlwbGVfYnVm KTsKKwlleHQyZnNfZnJlZV9tZW0oJnJhLT5kb3VibGVfYnVmKTsKKwlyYS0+c2hvdWxkX3JlYWRf aW5vZGUgPSBOVUxMOworfQorCisvKgorICogSW5pdGlhbGl6ZSBpbm9kZSByZWFkYWhlYWQgc3Rh dGUuCisgKi8KKwordm9pZCBleHQyZnNfcmVhZGFoZWFkX2lub2RlX2luaXQoc3RydWN0IHJlYWRh aGVhZF9zdGF0ZSAqcmEsCisJCQkJIGludCAoKnNob3VsZF9yZWFkX2lub2RlKShzdHJ1Y3QgZXh0 Ml9pbm9kZSAqKSkKK3sKKwlpZiAocmVhZGFoZWFkX2Rpc2FibGVkKHJhKSkKKwkJcmV0dXJuOwor CisJZHByaW50ZigiTVQ6ICVzXG4iLCBfX0ZVTkNUSU9OX18pOworCisJLyoKKwkgKiBBbGxvY2F0 ZSBidWZmZXJzIGZvciBzYXZpbmcgdHJpcGxlIGFuZCBkb3VibGUgaW5kaXJlY3QKKwkgKiBibG9j a3Mgd2hpbGUgcmVjdXJzaXZlbHkgcXVldWVpbmcgYW5kIGlzc3VpbmcgaW9zIGZvciB0aGUKKwkg KiBibG9jayBwb2ludGVycyB0aGV5IGNvbnRhaW4uICBEb24ndCBuZWVkIGFueSBmb3Igc2luZ2xl CisJICogaW5kaXJlY3QgYmxvY2tzIGJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZSB0byByZWFkIHRoZSBk YXRhCisJICogYmxvY2tzIHRoZXkgcG9pbnQgdG8uCisJICovCisKKwlpZiAoZXh0MmZzX2dldF9t ZW0ocmEtPmZzLT5ibG9ja3NpemUsICZyYS0+ZG91YmxlX2J1ZikpCisJCWdvdG8gb3V0OworCisJ aWYgKGV4dDJmc19nZXRfbWVtKHJhLT5mcy0+YmxvY2tzaXplLCAmcmEtPnRyaXBsZV9idWYpKQor CQlnb3RvIG91dF9mcmVlX2RvdWJsZTsKKworCWlmIChleHQyZnNfb3Blbl9pbm9kZV9zY2FuKHJh LT5mcywgOCwgJnJhLT5zY2FuKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIk9wZW4gaW5vZGUgc2Nh biBmYWlsZWQsIGRpc2FibGluZyAiCisJCQkicmVhZGFoZWFkXG4iKTsKKwkJZ290byBvdXRfZnJl ZV9kb3VibGU7CisJfQorCisJcmEtPnNob3VsZF9yZWFkX2lub2RlID0gc2hvdWxkX3JlYWRfaW5v ZGU7CisJcmEtPnRocmVhZF9leGl0ID0gcmVhZGFoZWFkX2lub2RlX2V4aXQ7CisKKwlyZXR1cm47 CisKKyBvdXRfZnJlZV9kb3VibGU6CisJZXh0MmZzX2ZyZWVfbWVtKCZyYS0+ZG91YmxlX2J1Zik7 Cisgb3V0OgorCWZwcmludGYoc3RkZXJyLCAiSW5vZGUgcmVhZGFoZWFkIGZhaWxlZCB0byBpbml0 aWFsaXplLlxuIik7CisJcmEtPmVuYWJsZWQgPSAwOworfQorCisvKgorICogS2ljayBvZmYgaW5v ZGUgcmVhZGFoZWFkLgorICovCisKK3ZvaWQgZXh0MmZzX3JlYWRhaGVhZF9pbm9kZV9zdGFydChz dHJ1Y3QgcmVhZGFoZWFkX3N0YXRlICpyYSkKK3sKKwlkcHJpbnRmKCJNVDogJXNcbiIsIF9fRlVO Q1RJT05fXyk7CisKKwlpZiAocmVhZGFoZWFkX2Rpc2FibGVkKHJhKSkKKwkJcmV0dXJuOworCisJ cmVhZGFoZWFkX3RocmVhZF9zdGFydChyYSwgcmVhZGFoZWFkX2lub2RlX2xvb3ApOworfQorCisv KgorICogU3RvcCB0aGUgaW5vZGUgcmVhZGFoZWFkIHRocmVhZC4gIHJlYWRhaGVhZF90aHJlYWRf c3RvcCgpIGRvZXMgYWxsCisgKiB0aGUgYWN0dWFsIHdvcmssIGluY2x1ZGluZyBydW5uaW5nIHRo ZSB0aHJlYWRfZXhpdCBmdW5jdGlvbi4KKyAqLworCit2b2lkIGV4dDJmc19yZWFkYWhlYWRfaW5v ZGVfZXhpdChzdHJ1Y3QgcmVhZGFoZWFkX3N0YXRlICpyYSkKK3sKKwlkcHJpbnRmKCJNVDogJXNc biIsIF9fRlVOQ1RJT05fXyk7CisKKwlpZiAocmVhZGFoZWFkX2Rpc2FibGVkKHJhKSkKKwkJcmV0 dXJuOworCisJcmVhZGFoZWFkX3RocmVhZF9zdG9wKHJhKTsKK30KKworLyoKKyAqIFJlbGVhc2Ug YSBibG9jayBmcm9tIHRoZSBkaXJlY3RvcnkgYmxvY2sgbGlzdC4KKyAqLworCit2b2lkIGV4dDJm c19yZWFkYWhlYWRfZGJsaXN0X3JlbGVhc2Uoc3RydWN0IHJlYWRhaGVhZF9zdGF0ZSAqcmEsCisJ CQkJICAgICBleHQyX2ZpbHN5cyBmcywgYmxrX3QgYmxrKQoreworCWlmIChyZWFkYWhlYWRfZGlz YWJsZWQocmEpKQorCQlyZXR1cm47CisKKwlibG9ja3NfcmVsZWFzZShyYSwgZnMsIGJsaywgMSk7 Cit9CisKKy8qCisgKiBDbGVhbiB1cCBhZnRlciBkaXJlY3RvcnkgYmxvY2sgcmVhZGFoZWFkLgor ICovCisKK3N0YXRpYyB2b2lkIHJlYWRhaGVhZF9kYmxpc3RfZXhpdChzdHJ1Y3QgcmVhZGFoZWFk X3N0YXRlICpyYSkKK3sKKwlyYS0+ZGJsaXN0ID0gTlVMTDsKK30KKworLyoKKyAqIFNldCB1cCB0 aGUgZGlyZWN0b3J5IGJsb2NrIHJlYWRhaGVhZCB0aHJlYWQuCisgKi8KKwordm9pZCBleHQyZnNf cmVhZGFoZWFkX2RibGlzdF9pbml0KHN0cnVjdCByZWFkYWhlYWRfc3RhdGUgKnJhLCBleHQyX2Ri bGlzdCBkYmxpc3QpCit7CisJZHByaW50ZigiTVQ6ICVzXG4iLCBfX0ZVTkNUSU9OX18pOworCisJ aWYgKHJlYWRhaGVhZF9kaXNhYmxlZChyYSkpCisJCXJldHVybjsKKworCXJhLT5kYmxpc3QgPSBk Ymxpc3Q7CisJcmEtPnRocmVhZF9leGl0ID0gcmVhZGFoZWFkX2RibGlzdF9leGl0OworfQorCisv KgorICogU3RhcnQgdGhlIGRpcmVjdG9yeSBibG9jayByZWFkYWhlYWQgdGhyZWFkLgorICoKKyAq IERvbid0IGFsdGVyIHRoZSBkYmxpc3QgKGkuZS4sIHNvcnQgaXQpIGFmdGVyIHN0YXJ0aW5nIHRo ZSBkYmxpc3QKKyAqIHJlYWRhaGVhZCwgb3IgeW91J2xsIGhhdmUgc29tZSBmYWJ1bG91cyByYWNl IGNvbmRpdGlvbnMuICBOb3RlIHRoYXQKKyAqIGV4dDJfZGJsaXN0X2l0ZXJhdGUgd2lsbCBzb3J0 IHRoZSBkYmxpc3QgaWYgaXQncyBub3QgYWxyZWFkeQorICogc29ydGVkLiAgU29ydCB0aGUgZGJs aXN0IEJFRk9SRSB5b3UgY2FsbCB0aGlzIGZ1bmN0aW9uLgorICovCisKK3ZvaWQgZXh0MmZzX3Jl YWRhaGVhZF9kYmxpc3Rfc3RhcnQoc3RydWN0IHJlYWRhaGVhZF9zdGF0ZSAqcmEpCit7CisJZHBy aW50ZigiTVQ6ICVzXG4iLCBfX0ZVTkNUSU9OX18pOworCisJaWYgKHJlYWRhaGVhZF9kaXNhYmxl ZChyYSkpCisJCXJldHVybjsKKworCXJlYWRhaGVhZF90aHJlYWRfc3RhcnQocmEsIHJlYWRhaGVh ZF9kYmxpc3QpOworfQorCit2b2lkIGV4dDJmc19yZWFkYWhlYWRfZGJsaXN0X2V4aXQoc3RydWN0 IHJlYWRhaGVhZF9zdGF0ZSAqcmEpCit7CisJZHByaW50ZigiTVQ6ICVzXG4iLCBfX0ZVTkNUSU9O X18pOworCisJaWYgKHJlYWRhaGVhZF9kaXNhYmxlZChyYSkpCisJCXJldHVybjsKKworCXJlYWRh aGVhZF90aHJlYWRfc3RvcChyYSk7Cit9Ci0tLSBlMmZzcHJvZ3MtMS40MC40Lm9yaWcvZTJmc2Nr L3Bhc3MyLmMKKysrIGUyZnNwcm9ncy0xLjQwLjQvZTJmc2NrL3Bhc3MyLmMKQEAgLTE0OCw5ICsx NDgsMTcgQEAgdm9pZCBlMmZzY2tfcGFzczIoZTJmc2NrX3QgY3R4KQogCiAJaWYgKGZzLT5zdXBl ci0+c19mZWF0dXJlX2NvbXBhdCAmIEVYVDJfRkVBVFVSRV9DT01QQVRfRElSX0lOREVYKQogCQll eHQyZnNfZGJsaXN0X3NvcnQoZnMtPmRibGlzdCwgc3BlY2lhbF9kaXJfYmxvY2tfY21wKTsKLQkK KwllbHNlCisJCWV4dDJmc19kYmxpc3Rfc29ydChmcy0+ZGJsaXN0LCAwKTsKKworCS8qIFN0YXJ0 IHJlYWRhaGVhZCBhZnRlciB0aGUgZGJsaXN0IGhhcyBiZWVuIHNvcnRlZCAqLworCWV4dDJmc19y ZWFkYWhlYWRfZGJsaXN0X2luaXQoY3R4LT5yYSwgZnMtPmRibGlzdCk7CisJZXh0MmZzX3JlYWRh aGVhZF9kYmxpc3Rfc3RhcnQoY3R4LT5yYSk7CisKIAljZC5wY3R4LmVycmNvZGUgPSBleHQyZnNf ZGJsaXN0X2l0ZXJhdGUoZnMtPmRibGlzdCwgY2hlY2tfZGlyX2Jsb2NrLAogCQkJCQkJJmNkKTsK KwlleHQyZnNfcmVhZGFoZWFkX2RibGlzdF9leGl0KGN0eC0+cmEpOworCiAJaWYgKGN0eC0+Zmxh Z3MgJiBFMkZfRkxBR19TSUdOQUxfTUFTSykKIAkJcmV0dXJuOwogCWlmIChjZC5wY3R4LmVycmNv ZGUpIHsKQEAgLTc3OCw2ICs3ODYsOCBAQCBzdGF0aWMgaW50IGNoZWNrX2Rpcl9ibG9jayhleHQy X2ZpbHN5cyBmCiAJCiAJb2xkX29wID0gZWhhbmRsZXJfb3BlcmF0aW9uKF8oInJlYWRpbmcgZGly ZWN0b3J5IGJsb2NrIikpOwogCWNkLT5wY3R4LmVycmNvZGUgPSBleHQyZnNfcmVhZF9kaXJfYmxv Y2soZnMsIGJsb2NrX25yLCBidWYpOworCS8qIFJlbGVhc2UgdGhlIGJsb2NrIG5vdyAtIGl0IGlz IGFscmVhZHkgaW4gb3VyIG1lbW9yeSAqLworCWV4dDJmc19yZWFkYWhlYWRfZGJsaXN0X3JlbGVh c2UoY3R4LT5yYSwgZnMsIGJsb2NrX25yKTsKIAllaGFuZGxlcl9vcGVyYXRpb24oMCk7CiAJaWYg KGNkLT5wY3R4LmVycmNvZGUgPT0gRVhUMl9FVF9ESVJfQ09SUlVQVEVEKQogCQljZC0+cGN0eC5l cnJjb2RlID0gMDsgLyogV2UnbGwgaGFuZGxlIHRoaXMgb3Vyc2VsdmVzICovCi0tLSBlMmZzcHJv Z3MtMS40MC40Lm9yaWcvbGliL2V4dDJmcy9pbm9kZS5jCisrKyBlMmZzcHJvZ3MtMS40MC40L2xp Yi9leHQyZnMvaW5vZGUuYwpAQCAtNDkxLDYgKzQ5MSw3NiBAQCBlcnJjb2RlX3QgZXh0MmZzX2dl dF9uZXh0X2lub2RlX2Z1bGwoZXh0CiAJcmV0dXJuIHJldHZhbDsKIH0KIAorZXJyY29kZV90IGV4 dDJmc19nZXRfbmV4dF9pbm9kZV9wdHIoZXh0Ml9pbm9kZV9zY2FuIHNjYW4sIGV4dDJfaW5vX3Qg KmlubywKKwkJCQkgICAgc3RydWN0IGV4dDJfaW5vZGUgKippbm9kZSkKK3sKKwllcnJjb2RlX3QJ cmV0dmFsOworCWludAkJZXh0cmFfYnl0ZXMgPSAwOworCisJRVhUMl9DSEVDS19NQUdJQyhzY2Fu LCBFWFQyX0VUX01BR0lDX0lOT0RFX1NDQU4pOworCisJLyoKKwkgKiBEbyB3ZSBuZWVkIHRvIHN0 YXJ0IHJlYWRpbmcgYSBuZXcgYmxvY2sgZ3JvdXA/CisJICovCisJaWYgKHNjYW4tPmlub2Rlc19s ZWZ0IDw9IDApIHsKKwlmb3JjZV9uZXdfZ3JvdXA6CisJCWlmIChzY2FuLT5kb25lX2dyb3VwKSB7 CisJCQlyZXR2YWwgPSAoc2Nhbi0+ZG9uZV9ncm91cCkKKwkJCQkoc2Nhbi0+ZnMsIHNjYW4sIHNj YW4tPmN1cnJlbnRfZ3JvdXAsCisJCQkJIHNjYW4tPmRvbmVfZ3JvdXBfZGF0YSk7CisJCQlpZiAo cmV0dmFsKQorCQkJCXJldHVybiByZXR2YWw7CisJCX0KKwkJaWYgKHNjYW4tPmdyb3Vwc19sZWZ0 IDw9IDApIHsKKwkJCSppbm8gPSAwOworCQkJcmV0dXJuIDA7CisJCX0KKwkJcmV0dmFsID0gZ2V0 X25leHRfYmxvY2tncm91cChzY2FuKTsKKwkJaWYgKHJldHZhbCkKKwkJCXJldHVybiByZXR2YWw7 CisJfQorCS8qCisJICogVGhlc2UgY2hlY2tzIGFyZSBkb25lIG91dHNpZGUgdGhlIGFib3ZlIGlm IHN0YXRlbWVudCBzbworCSAqIHRoZXkgY2FuIGJlIGRvbmUgZm9yIGJsb2NrIGdyb3VwICMwLgor CSAqLworCWlmICgoc2Nhbi0+c2Nhbl9mbGFncyAmIEVYVDJfU0ZfRE9fTEFaWSkgJiYKKwkgICAg KHNjYW4tPmZzLT5ncm91cF9kZXNjW3NjYW4tPmN1cnJlbnRfZ3JvdXBdLmJnX2ZsYWdzICYKKwkg ICAgIEVYVDJfQkdfSU5PREVfVU5JTklUKSkKKwkJZ290byBmb3JjZV9uZXdfZ3JvdXA7CisJaWYg KHNjYW4tPmN1cnJlbnRfYmxvY2sgPT0gMCkgeworCQlpZiAoc2Nhbi0+c2Nhbl9mbGFncyAmIEVY VDJfU0ZfU0tJUF9NSVNTSU5HX0lUQUJMRSkgeworCQkJZ290byBmb3JjZV9uZXdfZ3JvdXA7CisJ CX0gZWxzZQorCQkJcmV0dXJuIEVYVDJfRVRfTUlTU0lOR19JTk9ERV9UQUJMRTsKKwl9CisKKwkv KgorCSAqIEhhdmUgd2UgcnVuIG91dCBvZiBzcGFjZSBpbiB0aGUgaW5vZGUgYnVmZmVyPyAgSWYg c28sIHdlCisJICogbmVlZCB0byByZWFkIGluIG1vcmUgYmxvY2tzLgorCSAqLworCWlmIChzY2Fu LT5ieXRlc19sZWZ0IDwgc2Nhbi0+aW5vZGVfc2l6ZSkgeworCQltZW1jcHkoc2Nhbi0+dGVtcF9i dWZmZXIsIHNjYW4tPnB0ciwgc2Nhbi0+Ynl0ZXNfbGVmdCk7CisJCWV4dHJhX2J5dGVzID0gc2Nh bi0+Ynl0ZXNfbGVmdDsKKworCQlyZXR2YWwgPSBnZXRfbmV4dF9ibG9ja3Moc2Nhbik7CisJCWlm IChyZXR2YWwpCisJCQlyZXR1cm4gcmV0dmFsOworCX0KKworCS8qIFhYWCBpZ25vcmluZyBleHRy YV9ieXRlcyBsb2dpYyAqLworCS8qIFJldHVybiBhIHBvaW50ZXIgZGlyZWN0bHkgdG8gdGhlIGlu b2RlIGJ1ZmZlci4uLiBEb24ndCB3cml0ZSBpdC4gKi8KKwkqaW5vZGUgPSAoc3RydWN0IGV4dDJf aW5vZGUgKikgc2Nhbi0+cHRyOworCXNjYW4tPnB0ciArPSBzY2FuLT5pbm9kZV9zaXplOworCXNj YW4tPmJ5dGVzX2xlZnQgLT0gc2Nhbi0+aW5vZGVfc2l6ZTsKKwlpZiAoc2Nhbi0+c2Nhbl9mbGFn cyAmIEVYVDJfU0ZfQkFEX0lOT0RFX0JMSykKKwkJcmV0dmFsID0gRVhUMl9FVF9CQURfQkxPQ0tf SU5fSU5PREVfVEFCTEU7CisKKwlzY2FuLT5pbm9kZXNfbGVmdC0tOworCXNjYW4tPmN1cnJlbnRf aW5vZGUrKzsKKwkqaW5vID0gc2Nhbi0+Y3VycmVudF9pbm9kZTsKKwlyZXR1cm4gcmV0dmFsOwor fQorCiBlcnJjb2RlX3QgZXh0MmZzX2dldF9uZXh0X2lub2RlKGV4dDJfaW5vZGVfc2NhbiBzY2Fu LCBleHQyX2lub190ICppbm8sCiAJCQkJc3RydWN0IGV4dDJfaW5vZGUgKmlub2RlKQogewo= ------=_Part_9623_30099818.1200519043384--