From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S267651AbUHYEBd (ORCPT ); Wed, 25 Aug 2004 00:01:33 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S267450AbUHYEBd (ORCPT ); Wed, 25 Aug 2004 00:01:33 -0400 Received: from [195.23.16.24] ([195.23.16.24]:19424 "EHLO bipbip.comserver-pie.com") by vger.kernel.org with ESMTP id S264396AbUHYEBL (ORCPT ); Wed, 25 Aug 2004 00:01:11 -0400 Message-ID: <1093406686.412c0fde79d4f@webmail.grupopie.com> Date: Wed, 25 Aug 2004 05:04:46 +0100 From: "" To: "" Cc: "" Subject: [PATCH] kallsyms data size reduction / lookup speedup MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="-MOQ10934066866d6fe508680015adf4ac820a7511f1ac" User-Agent: Internet Messaging Program (IMP) 3.2.2 X-Originating-IP: 213.13.76.155 X-AntiVirus: checked by Vexira MailArmor (version: 2.0.1.16; VAE: 6.27.0.6; VDF: 6.27.0.29; host: bipbip) Sender: linux-kernel-owner@vger.kernel.org X-Mailing-List: linux-kernel@vger.kernel.org This message is in MIME format. ---MOQ10934066866d6fe508680015adf4ac820a7511f1ac Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: quoted-printable This patch is an improvement over my first kallsyms speedup patch posted = about 2 weeks ago. It changes scripts/kallsyms as to produce a different format for kallsyms= _names and extra data to speedup lookups. The compression algorithm is quite sim= ple: it uses all the char codes not actually used in symbols to build a lookup= table that translates these codes into small strings. For instance, in my test = runs the code 0xFE was being translated into "acpi_" giving a 4 byte save on e= very translation. The advantage of this algorithm is that to translate a symbol we only req= uire information that is stored on that symbol position, and never need to go = back on the compressed stream to get information from other symbols. To give an idea about the benefits of this algorithm here are some benchm= ark results on a P4 2.8GHz with a symbol table with 10000 entries: kallsyms_lookup average time: vanilla 1346.0 us speedup 14.4 us with this patch 0.5 us total data produced by scripts/kallsyms: uncompressed 169 Kb vanilla 134 Kb with this patch 91 Kb (speedup was my latest patch, that only changed the way kallsyms_lookup w= orked and not the data format) I removed a cond_resched() from the proc/kallsyms handling code path, bec= ause using stem compression, if the current position went backwards, the hole = stream would be uncompressed up to the current position. It seemed that by remov= ing this loop it would be safe to remove the conditional reschedule altogethe= r. There is just one catch with this patch: the time it takes to compile the= kernel goes up just a bit (about 0.8s on a P4 2.8GHz with defconfig). If this de= lay is not acceptable I can change the compression algorithm so that it can use = the previous table (calculating a new table is what consumes most of the time= , and not doing the actual compression) and check to see if it obtains a simila= r compression ratio. If it does, then this is a sign that the symbol patter= ns haven't changed that much and this table is still good to use. This would= not only cut the time down to half on any compilation (because of the 2 pass = symbol build method), but in frequent cases where a developer is compiling a sin= gle file and linking everything over and over again, the table optimization p= rocess would never run. I'm CC'ing Brent Casavant on this email, because last june he sent a patc= h trying a different approach that used a 32 entry symbol cache, because th= ere was a problem with the time "top" took to read "proc//wchan". I was hopping he would be willing to test this patch and comment on the results= . As always, comments, suggestions, flames will be greatly appreciated :) Signed-off-by: Paulo Marques ---MOQ10934066866d6fe508680015adf4ac820a7511f1ac Content-Type: text/x-diff; name="kallsyms_patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="kallsyms_patch" ZGlmZiAtdXByTiAtWCBkb250ZGlmZiBsaW51eC0yLjYuOS1yYzEva2VybmVsL2thbGxzeW1zLmMg bGludXgtMi42LjktcmMxLWthbGwva2VybmVsL2thbGxzeW1zLmMKLS0tIGxpbnV4LTIuNi45LXJj MS9rZXJuZWwva2FsbHN5bXMuYwkyMDA0LTA4LTI0IDIzOjE2OjM5LjAwMDAwMDAwMCArMDEwMAor KysgbGludXgtMi42LjktcmMxLWthbGwva2VybmVsL2thbGxzeW1zLmMJMjAwNC0wOC0yNSAwMzo1 OToyNy4wMDAwMDAwMDAgKzAxMDAKQEAgLTUsNiArNSwxMiBAQAogICogbW9kdWxlIGxvYWRlcjoK ICAqICAgQ29weXJpZ2h0IDIwMDIgUnVzdHkgUnVzc2VsbCA8cnVzdHlAcnVzdGNvcnAuY29tLmF1 PiBJQk0gQ29ycG9yYXRpb24KICAqIFN0ZW0gY29tcHJlc3Npb24gYnkgQW5kaSBLbGVlbi4KKyAq CisgKiBDaGFuZ2VMb2c6CisgKgorICogKDI1L0F1Zy8yMDA0KSBQYXVsbyBNYXJxdWVzCisgKiAg ICAgIENoYW5nZWQgdGhlIGNvbXByZXNzaW9uIG1ldGhvZCBmcm9tIHN0ZW0gY29tcHJlc3Npb24g dG8gInRhYmxlIGxvb2t1cCIKKyAqICAgICAgY29tcHJlc3Npb24KICAqLwogI2luY2x1ZGUgPGxp bnV4L2thbGxzeW1zLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CkBAIC0xNyw3ICsyMywx MiBAQAogLyogVGhlc2Ugd2lsbCBiZSByZS1saW5rZWQgYWdhaW5zdCB0aGVpciByZWFsIHZhbHVl cyBkdXJpbmcgdGhlIHNlY29uZCBsaW5rIHN0YWdlICovCiBleHRlcm4gdW5zaWduZWQgbG9uZyBr YWxsc3ltc19hZGRyZXNzZXNbXSBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSk7CiBleHRlcm4gdW5zaWdu ZWQgbG9uZyBrYWxsc3ltc19udW1fc3ltcyBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSk7Ci1leHRlcm4g Y2hhciBrYWxsc3ltc19uYW1lc1tdIF9fYXR0cmlidXRlX18oKHdlYWspKTsKK2V4dGVybiB1OCBr YWxsc3ltc19uYW1lc1tdIF9fYXR0cmlidXRlX18oKHdlYWspKTsKKworZXh0ZXJuIHU4IGthbGxz eW1zX3Rva2VuX3RhYmxlW10gX19hdHRyaWJ1dGVfXygod2VhaykpOworZXh0ZXJuIHUxNiBrYWxs c3ltc190b2tlbl9pbmRleFtdIF9fYXR0cmlidXRlX18oKHdlYWspKTsKKworZXh0ZXJuIHVuc2ln bmVkIGxvbmcga2FsbHN5bXNfbWFya2Vyc1tdIF9fYXR0cmlidXRlX18oKHdlYWspKTsKIAogLyog RGVmaW5lZCBieSB0aGUgbGlua2VyIHNjcmlwdC4gKi8KIGV4dGVybiBjaGFyIF9zdGV4dFtdLCBf ZXRleHRbXSwgX3Npbml0dGV4dFtdLCBfZWluaXR0ZXh0W107CkBAIC0zNywyMSArNDgsNTYgQEAg c3RhdGljIGlubGluZSBpbnQgaXNfa2VybmVsX3RleHQodW5zaWduZQogCXJldHVybiAwOwogfQog CitzdGF0aWMgdW5zaWduZWQgaW50IGthbGxzeW1zX2V4cGFuZF9zeW1ib2wodW5zaWduZWQgaW50 IG9mZiwgY2hhciAqcmVzdWx0KQoreworCWludCBsZW4sIHRsZW47CisJdTggKnRwdHIsICpkYXRh OworCisJZGF0YSA9ICZrYWxsc3ltc19uYW1lc1tvZmZdOworCQorCWxlbj0qZGF0YSsrOworCW9m ZiArPSBsZW4gKyAxOworCXdoaWxlKGxlbikgeworCQl0cHRyPSZrYWxsc3ltc190b2tlbl90YWJs ZVtrYWxsc3ltc190b2tlbl9pbmRleFsqZGF0YV1dOworCQlkYXRhKys7CisJCWxlbi0tOworCisJ CXRsZW49KnRwdHIrKzsKKwkJd2hpbGUodGxlbikgeworCQkJKnJlc3VsdCsrPSp0cHRyKys7CisJ CQl0bGVuLS07CisJCX0KKwl9CisKKwkqcmVzdWx0ID0gMDsKKworCXJldHVybiBvZmY7Cit9CisK K3N0YXRpYyB1bnNpZ25lZCBpbnQgZ2V0X3N5bWJvbF9vZmZzZXQodW5zaWduZWQgbG9uZyBwb3Mp Cit7CisJdTggKm5hbWU7CisJaW50IGk7CisKKwluYW1lID0gJmthbGxzeW1zX25hbWVzWyBrYWxs c3ltc19tYXJrZXJzW3Bvcz4+OF0gXTsKKwlmb3IoaSA9IDA7IGkgPCAocG9zJjB4RkYpOyBpKysp CisJCW5hbWUgPSBuYW1lICsgKCpuYW1lKSArIDE7CisKKwlyZXR1cm4gbmFtZSAtIGthbGxzeW1z X25hbWVzOworfQorCiAvKiBMb29rdXAgdGhlIGFkZHJlc3MgZm9yIHRoaXMgc3ltYm9sLiBSZXR1 cm5zIDAgaWYgbm90IGZvdW5kLiAqLwogdW5zaWduZWQgbG9uZyBrYWxsc3ltc19sb29rdXBfbmFt ZShjb25zdCBjaGFyICpuYW1lKQogewogCWNoYXIgbmFtZWJ1ZltLU1lNX05BTUVfTEVOKzFdOwog CXVuc2lnbmVkIGxvbmcgaTsKLQljaGFyICprbmFtZXM7CisJdW5zaWduZWQgaW50IG9mZjsKIAot CWZvciAoaSA9IDAsIGtuYW1lcyA9IGthbGxzeW1zX25hbWVzOyBpIDwga2FsbHN5bXNfbnVtX3N5 bXM7IGkrKykgewotCQl1bnNpZ25lZCBwcmVmaXggPSAqa25hbWVzKys7CisJZm9yIChpID0gMCwg b2ZmID0gMDsgaSA8IGthbGxzeW1zX251bV9zeW1zOyBpKyspIHsKKwkJb2ZmID0ga2FsbHN5bXNf ZXhwYW5kX3N5bWJvbChvZmYsIG5hbWVidWYpOwogCi0JCXN0cmxjcHkobmFtZWJ1ZiArIHByZWZp eCwga25hbWVzLCBLU1lNX05BTUVfTEVOIC0gcHJlZml4KTsKIAkJaWYgKHN0cmNtcChuYW1lYnVm LCBuYW1lKSA9PSAwKQogCQkJcmV0dXJuIGthbGxzeW1zX2FkZHJlc3Nlc1tpXTsKLQotCQlrbmFt ZXMgKz0gc3RybGVuKGtuYW1lcykgKyAxOwogCX0KIAlyZXR1cm4gbW9kdWxlX2thbGxzeW1zX2xv b2t1cF9uYW1lKG5hbWUpOwogfQpAQCAtNjIsNyArMTA4LDcgQEAgY29uc3QgY2hhciAqa2FsbHN5 bXNfbG9va3VwKHVuc2lnbmVkIGxvbgogCQkJICAgIHVuc2lnbmVkIGxvbmcgKm9mZnNldCwKIAkJ CSAgICBjaGFyICoqbW9kbmFtZSwgY2hhciAqbmFtZWJ1ZikKIHsKLQl1bnNpZ25lZCBsb25nIGks IGJlc3QgPSAwOworCXVuc2lnbmVkIGxvbmcgaSwgbG93LCBoaWdoLCBtaWQ7CiAKIAkvKiBUaGlz IGtlcm5lbCBzaG91bGQgbmV2ZXIgaGFkIGJlZW4gYm9vdGVkLiAqLwogCUJVR19PTigha2FsbHN5 bXNfYWRkcmVzc2VzKTsKQEAgLTcxLDQwICsxMTcsNDEgQEAgY29uc3QgY2hhciAqa2FsbHN5bXNf bG9va3VwKHVuc2lnbmVkIGxvbgogCW5hbWVidWZbMF0gPSAwOwogCiAJaWYgKGlzX2tlcm5lbF90 ZXh0KGFkZHIpIHx8IGlzX2tlcm5lbF9pbml0dGV4dChhZGRyKSkgewotCQl1bnNpZ25lZCBsb25n IHN5bWJvbF9lbmQ7Ci0JCWNoYXIgKm5hbWUgPSBrYWxsc3ltc19uYW1lczsKKwkJdW5zaWduZWQg bG9uZyBzeW1ib2xfZW5kPTA7CiAKLQkJLyogVGhleSdyZSBzb3J0ZWQsIHdlIGNvdWxkIGJlIGNs ZXZlciBoZXJlLCBidXQgd2hvIGNhcmVzPyAqLwotCQlmb3IgKGkgPSAwOyBpIDwga2FsbHN5bXNf bnVtX3N5bXM7IGkrKykgewotCQkJaWYgKGthbGxzeW1zX2FkZHJlc3Nlc1tpXSA+IGthbGxzeW1z X2FkZHJlc3Nlc1tiZXN0XSAmJgotCQkJICAgIGthbGxzeW1zX2FkZHJlc3Nlc1tpXSA8PSBhZGRy KQotCQkJCWJlc3QgPSBpOworCQkvKiBkbyBhIGJpbmFyeSBzZWFyY2ggb24gdGhlIHNvcnRlZCBr YWxsc3ltc19hZGRyZXNzZXMgYXJyYXkgKi8KKwkJbG93ID0gMDsKKwkJaGlnaCA9IGthbGxzeW1z X251bV9zeW1zOworCQl3aGlsZSAoaGlnaC1sb3cgPiAxKSB7CisJCQltaWQgPSAobG93ICsgaGln aCkgLyAyOworCQkJaWYgKGthbGxzeW1zX2FkZHJlc3Nlc1ttaWRdIDw9IGFkZHIpIGxvdyA9IG1p ZDsKKwkJCWVsc2UgaGlnaCA9IG1pZDsKIAkJfQorCQl3aGlsZSAobG93ICYmIGthbGxzeW1zX2Fk ZHJlc3Nlc1tsb3ctMV0gPT0ga2FsbHN5bXNfYWRkcmVzc2VzW2xvd10pIAorCQkJLS1sb3c7CiAK IAkJLyogR3JhYiBuYW1lICovCi0JCWZvciAoaSA9IDA7IGkgPD0gYmVzdDsgaSsrKSB7IAotCQkJ dW5zaWduZWQgcHJlZml4ID0gKm5hbWUrKzsKLQkJCXN0cm5jcHkobmFtZWJ1ZiArIHByZWZpeCwg bmFtZSwgS1NZTV9OQU1FX0xFTiAtIHByZWZpeCk7Ci0JCQluYW1lICs9IHN0cmxlbihuYW1lKSAr IDE7Ci0JCX0KLQotCQkvKiBBdCB3b3JzdCwgc3ltYm9sIGVuZHMgYXQgZW5kIG9mIHNlY3Rpb24u ICovCi0JCWlmIChpc19rZXJuZWxfaW5pdHRleHQoYWRkcikpCi0JCQlzeW1ib2xfZW5kID0gKHVu c2lnbmVkIGxvbmcpX2Vpbml0dGV4dDsKLQkJZWxzZQotCQkJc3ltYm9sX2VuZCA9ICh1bnNpZ25l ZCBsb25nKV9ldGV4dDsKKwkJa2FsbHN5bXNfZXhwYW5kX3N5bWJvbChnZXRfc3ltYm9sX29mZnNl dChsb3cpLCBuYW1lYnVmKTsKIAogCQkvKiBTZWFyY2ggZm9yIG5leHQgbm9uLWFsaWFzZWQgc3lt Ym9sICovCi0JCWZvciAoaSA9IGJlc3QrMTsgaSA8IGthbGxzeW1zX251bV9zeW1zOyBpKyspIHsK LQkJCWlmIChrYWxsc3ltc19hZGRyZXNzZXNbaV0gPiBrYWxsc3ltc19hZGRyZXNzZXNbYmVzdF0p IHsKKwkJZm9yIChpID0gbG93ICsgMTsgaSA8IGthbGxzeW1zX251bV9zeW1zOyBpKyspIHsKKwkJ CWlmIChrYWxsc3ltc19hZGRyZXNzZXNbaV0gPiBrYWxsc3ltc19hZGRyZXNzZXNbbG93XSkgewog CQkJCXN5bWJvbF9lbmQgPSBrYWxsc3ltc19hZGRyZXNzZXNbaV07CiAJCQkJYnJlYWs7CiAJCQl9 CiAJCX0KIAotCQkqc3ltYm9sc2l6ZSA9IHN5bWJvbF9lbmQgLSBrYWxsc3ltc19hZGRyZXNzZXNb YmVzdF07CisJCWlmICghc3ltYm9sX2VuZCkgeworCQkJLyogQXQgd29yc3QsIHN5bWJvbCBlbmRz IGF0IGVuZCBvZiBzZWN0aW9uLiAqLworCQkJaWYgKGlzX2tlcm5lbF9pbml0dGV4dChhZGRyKSkK KwkJCQlzeW1ib2xfZW5kID0gKHVuc2lnbmVkIGxvbmcpX2Vpbml0dGV4dDsKKwkJCWVsc2UKKwkJ CQlzeW1ib2xfZW5kID0gKHVuc2lnbmVkIGxvbmcpX2V0ZXh0OworCQl9CisKKwkJKnN5bWJvbHNp emUgPSBzeW1ib2xfZW5kIC0ga2FsbHN5bXNfYWRkcmVzc2VzW2xvd107CiAJCSptb2RuYW1lID0g TlVMTDsKLQkJKm9mZnNldCA9IGFkZHIgLSBrYWxsc3ltc19hZGRyZXNzZXNbYmVzdF07CisJCSpv ZmZzZXQgPSBhZGRyIC0ga2FsbHN5bXNfYWRkcmVzc2VzW2xvd107CiAJCXJldHVybiBuYW1lYnVm OwogCX0KIApAQCAtMTY4LDE1ICsyMTUsMTAgQEAgc3RhdGljIGludCBnZXRfa3N5bWJvbF9tb2Qo c3RydWN0IGthbGxzeQogLyogUmV0dXJucyBzcGFjZSB0byBuZXh0IG5hbWUuICovCiBzdGF0aWMg dW5zaWduZWQgbG9uZyBnZXRfa3N5bWJvbF9jb3JlKHN0cnVjdCBrYWxsc3ltX2l0ZXIgKml0ZXIp CiB7Ci0JdW5zaWduZWQgc3RlbWxlbiwgb2ZmID0gaXRlci0+bmFtZW9mZjsKKwl1bnNpZ25lZCBv ZmYgPSBpdGVyLT5uYW1lb2ZmOworCisJb2ZmID0ga2FsbHN5bXNfZXhwYW5kX3N5bWJvbChvZmYs IGl0ZXItPm5hbWUpOwogCi0JLyogRmlyc3QgY2hhciBvZiBlYWNoIHN5bWJvbCBuYW1lIGluZGlj YXRlcyBwcmVmaXggbGVuZ3RoCi0JICAgc2hhcmVkIHdpdGggcHJldmlvdXMgbmFtZSAoc3RlbSBj b21wcmVzc2lvbikuICovCi0Jc3RlbWxlbiA9IGthbGxzeW1zX25hbWVzW29mZisrXTsKLQotCXN0 cmxjcHkoaXRlci0+bmFtZStzdGVtbGVuLCBrYWxsc3ltc19uYW1lcyArIG9mZiwKLQkJS1NZTV9O QU1FX0xFTisxLXN0ZW1sZW4pOwotCW9mZiArPSBzdHJsZW4oa2FsbHN5bXNfbmFtZXMgKyBvZmYp ICsgMTsKIAlpdGVyLT5vd25lciA9IE5VTEw7CiAJaXRlci0+dmFsdWUgPSBrYWxsc3ltc19hZGRy ZXNzZXNbaXRlci0+cG9zXTsKIAlpZiAoaXNfa2VybmVsX3RleHQoaXRlci0+dmFsdWUpIHx8IGlz X2tlcm5lbF9pbml0dGV4dChpdGVyLT52YWx1ZSkpCkBAIC0xODgsMTEgKzIzMCwxMSBAQCBzdGF0 aWMgdW5zaWduZWQgbG9uZyBnZXRfa3N5bWJvbF9jb3JlKHN0CiAJcmV0dXJuIG9mZiAtIGl0ZXIt Pm5hbWVvZmY7CiB9CiAKLXN0YXRpYyB2b2lkIHJlc2V0X2l0ZXIoc3RydWN0IGthbGxzeW1faXRl ciAqaXRlcikKK3N0YXRpYyB2b2lkIHJlc2V0X2l0ZXIoc3RydWN0IGthbGxzeW1faXRlciAqaXRl ciwgbG9mZl90IG5ld19wb3MpCiB7CiAJaXRlci0+bmFtZVswXSA9ICdcMCc7Ci0JaXRlci0+bmFt ZW9mZiA9IDA7Ci0JaXRlci0+cG9zID0gMDsKKwlpdGVyLT5uYW1lb2ZmID0gZ2V0X3N5bWJvbF9v ZmZzZXQobmV3X3Bvcyk7CisJaXRlci0+cG9zID0gbmV3X3BvczsKIH0KIAogLyogUmV0dXJucyBm YWxzZSBpZiBwb3MgYXQgb3IgcGFzdCBlbmQgb2YgZmlsZS4gKi8KQEAgLTIwNCwxNiArMjQ2LDEz IEBAIHN0YXRpYyBpbnQgdXBkYXRlX2l0ZXIoc3RydWN0IGthbGxzeW1faXQKIAkJcmV0dXJuIGdl dF9rc3ltYm9sX21vZChpdGVyKTsKIAl9CiAJCi0JLyogSWYgd2UncmUgcGFzdCB0aGUgZGVzaXJl ZCBwb3NpdGlvbiwgcmVzZXQgdG8gc3RhcnQuICovCi0JaWYgKHBvcyA8IGl0ZXItPnBvcykKLQkJ cmVzZXRfaXRlcihpdGVyKTsKLQotCS8qIFdlIG5lZWQgdG8gaXRlcmF0ZSB0aHJvdWdoIHRoZSBw cmV2aW91cyBzeW1ib2xzOiBjYW4gYmUgc2xvdyAqLwotCWZvciAoOyBpdGVyLT5wb3MgIT0gcG9z OyBpdGVyLT5wb3MrKykgewotCQlpdGVyLT5uYW1lb2ZmICs9IGdldF9rc3ltYm9sX2NvcmUoaXRl cik7Ci0JCWNvbmRfcmVzY2hlZCgpOwotCX0KLQlnZXRfa3N5bWJvbF9jb3JlKGl0ZXIpOworCS8q IElmIHdlJ3JlIG5vdCBvbiB0aGUgZGVzaXJlZCBwb3NpdGlvbiwgcmVzZXQgdG8gbmV3IHBvc2l0 aW9uLiAqLworCWlmIChwb3MgIT0gaXRlci0+cG9zKQorCQlyZXNldF9pdGVyKGl0ZXIsIHBvcyk7 CisKKwlpdGVyLT5uYW1lb2ZmICs9IGdldF9rc3ltYm9sX2NvcmUoaXRlcik7CisJaXRlci0+cG9z Kys7CisKIAlyZXR1cm4gMTsKIH0KIApAQCAtMjc0LDcgKzMxMyw3IEBAIHN0YXRpYyBpbnQga2Fs bHN5bXNfb3BlbihzdHJ1Y3QgaW5vZGUgKmkKIAlpdGVyID0ga21hbGxvYyhzaXplb2YoKml0ZXIp LCBHRlBfS0VSTkVMKTsKIAlpZiAoIWl0ZXIpCiAJCXJldHVybiAtRU5PTUVNOwotCXJlc2V0X2l0 ZXIoaXRlcik7CisJcmVzZXRfaXRlcihpdGVyLCAwKTsKIAogCXJldCA9IHNlcV9vcGVuKGZpbGUs ICZrYWxsc3ltc19vcCk7CiAJaWYgKHJldCA9PSAwKQpkaWZmIC11cHJOIC1YIGRvbnRkaWZmIGxp bnV4LTIuNi45LXJjMS9zY3JpcHRzL2thbGxzeW1zLmMgbGludXgtMi42LjktcmMxLWthbGwvc2Ny aXB0cy9rYWxsc3ltcy5jCi0tLSBsaW51eC0yLjYuOS1yYzEvc2NyaXB0cy9rYWxsc3ltcy5jCTIw MDQtMDgtMjQgMjM6MTY6MzkuMDAwMDAwMDAwICswMTAwCisrKyBsaW51eC0yLjYuOS1yYzEta2Fs bC9zY3JpcHRzL2thbGxzeW1zLmMJMjAwNC0wOC0yNSAwMzozMDozMC4wMDAwMDAwMDAgKzAxMDAK QEAgLTYsNiArNiwxMyBAQAogICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBp bmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KICAqCiAgKiBVc2FnZTogbm0gLW4gdm1s aW51eCB8IHNjcmlwdHMva2FsbHN5bXMgWy0tYWxsLXN5bWJvbHNdID4gc3ltYm9scy5TCisgKgor ICogQ2hhbmdlTG9nOgorICoKKyAqICgyNS9BdWcvMjAwNCkgUGF1bG8gTWFycXVlcworICogICAg ICBDaGFuZ2VkIHRoZSBjb21wcmVzc2lvbiBtZXRob2QgZnJvbSBzdGVtIGNvbXByZXNzaW9uIHRv ICJ0YWJsZSBsb29rdXAiCisgKiAgICAgIGNvbXByZXNzaW9uCisgKgogICovCiAKICNpbmNsdWRl IDxzdGRpby5oPgpAQCAtMTMsMTAgKzIwLDMwIEBACiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5j bHVkZSA8Y3R5cGUuaD4KIAorLyogY29tcHJlc3Npb24gdHVubmluZyBzZXR0aW5ncyAqLworI2Rl ZmluZSBNQVhfVE9LX1NJWkUJCTExCisjZGVmaW5lIEtTWU1fTkFNRV9MRU4JCTEyNworCisvKiB3 ZSB1c2Ugb25seSBhIHN1YnNldCBvZiB0aGUgY29tcGxldGUgc3ltYm9sIHRhYmxlIHRvIGdhdGhl ciB0aGUgdG9rZW4gY291bnQsCisgICB0byBzcGVlZCB1cCBjb21wcmVzc2lvbiwgYXQgdGhlIGV4 cGVuc2Ugb2YgYSBsaXR0bGUgY29tcHJlc3Npb24gcmF0aW8KKyovCisjZGVmaW5lIFdPUktJTkdf U0VUCQkxMDI0CisjZGVmaW5lIEdPT0RfQkFEX1RIUkVTSE9MRAkxMAorCisjZGVmaW5lIEhBU0hf QklUUwkJMTgKKyNkZWZpbmUgSEFTSF9UQUJMRV9TSVpFCQkoMSA8PCBIQVNIX0JJVFMpCisjZGVm aW5lIEhBU0hfTUFTSwkJKEhBU0hfVEFCTEVfU0laRSAtIDEpCisjZGVmaW5lIEhBU0hfQkFTRV9P RkZTRVQJMjE2NjEzNjI2MVUKKyNkZWZpbmUgSEFTSF9GT0xEKGEpCQkoKGEpJihIQVNIX01BU0sp KQorCisKIHN0cnVjdCBzeW1fZW50cnkgewogCXVuc2lnbmVkIGxvbmcgbG9uZyBhZGRyOwogCWNo YXIgdHlwZTsKLQljaGFyICpzeW07CisJY2hhciBzYW1wbGU7CisJY2hhciB2YWxpZDsKKwl1bnNp Z25lZCBjaGFyIGxlbjsKKwl1bnNpZ25lZCBjaGFyICpzeW07CiB9OwogCiAKQEAgLTI1LDYgKzUy LDI0IEBAIHN0YXRpYyBpbnQgc2l6ZSwgY250Owogc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyBf c3RleHQsIF9ldGV4dCwgX3Npbml0dGV4dCwgX2Vpbml0dGV4dDsKIHN0YXRpYyBpbnQgYWxsX3N5 bWJvbHMgPSAwOwogCisKK3N0cnVjdCB0b2tlbiB7IAorCXVuc2lnbmVkIGNoYXIgZGF0YVtNQVhf VE9LX1NJWkVdOworCXVuc2lnbmVkIGNoYXIgbGVuOworCWludCBwcm9maXQ7CisJc3RydWN0IHRv a2VuICpuZXh0OworCXN0cnVjdCB0b2tlbiAqcmlnaHQ7CisJc3RydWN0IHRva2VuICpsZWZ0Owor CXN0cnVjdCB0b2tlbiAqc21hbGxlcjsKKwl9OworCitzdHJ1Y3QgdG9rZW4gYmFkX2hlYWQsIGdv b2RfaGVhZDsKK3N0cnVjdCB0b2tlbiAqaGFzaF90YWJsZVtIQVNIX1RBQkxFX1NJWkVdOworCit1 bnNpZ25lZCBjaGFyIGJlc3RfdGFibGVbMjU2XVtNQVhfVE9LX1NJWkUrMV07Cit1bnNpZ25lZCBj aGFyIGJlc3RfdGFibGVfbGVuWzI1Nl07CisKKwogc3RhdGljIHZvaWQKIHVzYWdlKHZvaWQpCiB7 CkBAIC02MCw2ICsxMDUsNyBAQCByZWFkX3N5bWJvbChGSUxFICppbiwgc3RydWN0IHN5bV9lbnRy eSAqCiAJCXJldHVybiAtMTsKIAogCXMtPnN5bSA9IHN0cmR1cChzdHIpOworCXMtPmxlbiA9IHN0 cmxlbihzdHIpOwogCXJldHVybiAwOwogfQogCkBAIC0xMDgsMTEgKzE1NCw0MiBAQCByZWFkX21h cChGSUxFICppbikKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIG91dHB1dF9sYWJlbChjaGFyICpsYWJl bCkKK3sKKwlwcmludGYoIi5nbG9ibCAlc1xuIixsYWJlbCk7CisJcHJpbnRmKCJcdEFMR05cbiIp OworCXByaW50ZigiJXM6XG4iLGxhYmVsKTsKK30KKworc3RhdGljIGludCBleHBhbmRfc3ltYm9s KHVuc2lnbmVkIGNoYXIgKmRhdGEsIGludCBsZW4sIGNoYXIgKnJlc3VsdCkKK3sKKwlpbnQgYywg cmxlbiwgdG90YWw9MDsKKworCXdoaWxlIChsZW4pIHsKKwkJYyA9ICpkYXRhOworCQlpZiAoYmVz dF90YWJsZVtjXVswXT09YyAmJiBiZXN0X3RhYmxlX2xlbltjXT09MSkgeworCQkJKnJlc3VsdCsr ID0gYzsKKwkJCXRvdGFsKys7CisJCX0gZWxzZSB7IAorCQkJcmxlbiA9IGV4cGFuZF9zeW1ib2wo YmVzdF90YWJsZVtjXSwgYmVzdF90YWJsZV9sZW5bY10sIHJlc3VsdCk7CisJCQl0b3RhbCArPSBy bGVuOworCQkJcmVzdWx0ICs9IHJsZW47CisJCX0KKwkJZGF0YSsrOworCQlsZW4tLTsKKwl9CisJ KnJlc3VsdD0wOworCisJcmV0dXJuIHRvdGFsOworfQorCiBzdGF0aWMgdm9pZAogd3JpdGVfc3Jj KHZvaWQpCiB7Ci0JaW50IGksIHZhbGlkID0gMDsKLQljaGFyICpwcmV2OworCWludCBpLCBrLCBv ZmYsIHZhbGlkOworCXVuc2lnbmVkIGludCBiZXN0X2lkeFsyNTZdOworCXVuc2lnbmVkIGludCAq bWFya2VyczsKKwljaGFyIGJ1ZltLU1lNX05BTUVfTEVOKzFdOwogCiAJcHJpbnRmKCIjaW5jbHVk ZSA8YXNtL3R5cGVzLmg+XG4iKTsKIAlwcmludGYoIiNpZiBCSVRTX1BFUl9MT05HID09IDY0XG4i KTsKQEAgLTEyNSw0MyArMjAyLDM0OSBAQCB3cml0ZV9zcmModm9pZCkKIAogCXByaW50ZigiLmRh dGFcbiIpOwogCi0JcHJpbnRmKCIuZ2xvYmwga2FsbHN5bXNfYWRkcmVzc2VzXG4iKTsKLQlwcmlu dGYoIlx0QUxHTlxuIik7Ci0JcHJpbnRmKCJrYWxsc3ltc19hZGRyZXNzZXM6XG4iKTsKKwlvdXRw dXRfbGFiZWwoImthbGxzeW1zX2FkZHJlc3NlcyIpOworCXZhbGlkID0gMDsKIAlmb3IgKGkgPSAw OyBpIDwgY250OyBpKyspIHsKLQkJaWYgKCFzeW1ib2xfdmFsaWQoJnRhYmxlW2ldKSkKLQkJCWNv bnRpbnVlOwotCi0JCXByaW50ZigiXHRQVFJcdCUjbGx4XG4iLCB0YWJsZVtpXS5hZGRyKTsKLQkJ dmFsaWQrKzsKKwkJaWYgKHRhYmxlW2ldLnZhbGlkKSB7CisJCQlwcmludGYoIlx0UFRSXHQlI2xs eFxuIiwgdGFibGVbaV0uYWRkcik7CisJCQl2YWxpZCsrOworCQl9CiAJfQogCXByaW50ZigiXG4i KTsKIAotCXByaW50ZigiLmdsb2JsIGthbGxzeW1zX251bV9zeW1zXG4iKTsKLQlwcmludGYoIlx0 QUxHTlxuIik7Ci0JcHJpbnRmKCJrYWxsc3ltc19udW1fc3ltczpcbiIpOworCW91dHB1dF9sYWJl bCgia2FsbHN5bXNfbnVtX3N5bXMiKTsKIAlwcmludGYoIlx0UFRSXHQlZFxuIiwgdmFsaWQpOwog CXByaW50ZigiXG4iKTsKIAotCXByaW50ZigiLmdsb2JsIGthbGxzeW1zX25hbWVzXG4iKTsKLQlw cmludGYoIlx0QUxHTlxuIik7Ci0JcHJpbnRmKCJrYWxsc3ltc19uYW1lczpcbiIpOwotCXByZXYg PSAiIjsgCisJbWFya2VycyA9ICh1bnNpZ25lZCBpbnQgKikgbWFsbG9jKHNpemVvZih1bnNpZ25l ZCBpbnQpKigodmFsaWQgKyAyNTUpIC8gMjU2KSk7CisJCisJb3V0cHV0X2xhYmVsKCJrYWxsc3lt c19uYW1lcyIpOworCXZhbGlkID0gMDsKKwlvZmYgPSAwOwogCWZvciAoaSA9IDA7IGkgPCBjbnQ7 IGkrKykgewotCQlpbnQgazsKIAotCQlpZiAoIXN5bWJvbF92YWxpZCgmdGFibGVbaV0pKQorCQlp ZiAoIXRhYmxlW2ldLnZhbGlkKQogCQkJY29udGludWU7CiAKLQkJZm9yIChrID0gMDsgdGFibGVb aV0uc3ltW2tdICYmIHRhYmxlW2ldLnN5bVtrXSA9PSBwcmV2W2tdOyArK2spCi0JCQk7IAorCQlp ZiAoKHZhbGlkICYgMHhGRikgPT0gMCkKKwkJCW1hcmtlcnNbdmFsaWQgPj4gOF0gPSBvZmY7CisK KwkJcHJpbnRmKCJcdC5ieXRlIDB4JTAyeCIsIHRhYmxlW2ldLmxlbik7CisJCWZvciAoayA9IDA7 IGsgPCB0YWJsZVtpXS5sZW47IGsrKykKKwkJCXByaW50ZigiLCAweCUwMngiLCB0YWJsZVtpXS5z eW1ba10pOworCQlwcmludGYoIlxuIik7CiAKLQkJcHJpbnRmKCJcdC5ieXRlIDB4JTAyeFxuXHQu YXNjaXpcdFwiJXNcIlxuIiwgaywgdGFibGVbaV0uc3ltICsgayk7Ci0JCXByZXYgPSB0YWJsZVtp XS5zeW07CisJCW9mZiArPSB0YWJsZVtpXS5sZW4gKyAxOworCQl2YWxpZCsrOwogCX0KIAlwcmlu dGYoIlxuIik7CisKKwlvdXRwdXRfbGFiZWwoImthbGxzeW1zX21hcmtlcnMiKTsKKwlmb3IgKGkg PSAwOyBpIDwgKCh2YWxpZCArIDI1NSkgPj4gOCk7IGkrKykKKwkJcHJpbnRmKCJcdFBUUlx0JWRc biIsIG1hcmtlcnNbaV0pOworCXByaW50ZigiXG4iKTsKKworCW91dHB1dF9sYWJlbCgia2FsbHN5 bXNfdG9rZW5fdGFibGUiKTsKKwlvZmYgPSAwOworCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykg eworCQliZXN0X2lkeFtpXSA9IG9mZjsKKwkJZXhwYW5kX3N5bWJvbChiZXN0X3RhYmxlW2ldLGJl c3RfdGFibGVfbGVuW2ldLGJ1Zik7CisJCWsgPSBzdHJsZW4oYnVmKTsKKwkJcHJpbnRmKCJcdC5i eXRlIDB4JTAyeFxuXHQuYXNjaWlcdFwiJXNcIlxuIiwgaywgYnVmKTsKKwkJb2ZmICs9IGsgKyAx OworCX0KKwlwcmludGYoIlxuIik7CisKKwlvdXRwdXRfbGFiZWwoImthbGxzeW1zX3Rva2VuX2lu ZGV4Iik7CisJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQorCQlwcmludGYoIlx0LndvcmRcdCVk XG4iLCBiZXN0X2lkeFtpXSk7CisJcHJpbnRmKCJcbiIpOworfQorCisKKy8qIHRhYmxlIGxvb2t1 cCBjb21wcmVzc2lvbiBmdW5jdGlvbnMgKi8KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQg cmVoYXNoX3Rva2VuKHVuc2lnbmVkIGludCBoYXNoLCB1bnNpZ25lZCBjaGFyIGRhdGEpCit7CisJ cmV0dXJuICgoaGFzaCAqIDE2Nzc3NjE5KSBeIGRhdGEpOworfQorCitzdGF0aWMgdW5zaWduZWQg aW50IGhhc2hfdG9rZW4odW5zaWduZWQgY2hhciAqZGF0YSwgaW50IGxlbikKK3sKKwl1bnNpZ25l ZCBpbnQgaGFzaD1IQVNIX0JBU0VfT0ZGU0VUOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8 IGxlbjsgaSsrKQorCQloYXNoID0gcmVoYXNoX3Rva2VuKGhhc2gsIGRhdGFbaV0pOworCisJcmV0 dXJuIEhBU0hfRk9MRChoYXNoKTsKK30KKworc3RhdGljIHN0cnVjdCB0b2tlbiAqZmluZF90b2tl bl9oYXNoKHVuc2lnbmVkIGNoYXIgKmRhdGEsIGludCBsZW4sIHVuc2lnbmVkIGludCBoYXNoKQor eworCXN0cnVjdCB0b2tlbiAqcHRyOworCisJcHRyID0gaGFzaF90YWJsZVtoYXNoXTsKKworCXdo aWxlIChwdHIpIHsKKwkJaWYgKChwdHItPmxlbiA9PSBsZW4pICYmIChtZW1jbXAocHRyLT5kYXRh LCBkYXRhLCBsZW4pID09IDApKQorCQkJcmV0dXJuIHB0cjsKKwkJcHRyPXB0ci0+bmV4dDsKKwl9 CisKKwlyZXR1cm4gTlVMTDsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIGluc2VydF90b2tlbl9p bl9ncm91cChzdHJ1Y3QgdG9rZW4gKmhlYWQsIHN0cnVjdCB0b2tlbiAqcHRyKQoreworCXB0ci0+ cmlnaHQgPSBoZWFkLT5yaWdodDsKKwlwdHItPnJpZ2h0LT5sZWZ0ID0gcHRyOworCWhlYWQtPnJp Z2h0ID0gcHRyOworCXB0ci0+bGVmdCA9IGhlYWQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBy ZW1vdmVfdG9rZW5fZnJvbV9ncm91cChzdHJ1Y3QgdG9rZW4gKnB0cikKK3sKKwlwdHItPmxlZnQt PnJpZ2h0ID0gcHRyLT5yaWdodDsKKwlwdHItPnJpZ2h0LT5sZWZ0ID0gcHRyLT5sZWZ0OworfQor CitzdGF0aWMgdm9pZCBsZWFybl90b2tlbih1bnNpZ25lZCBjaGFyICpkYXRhLCBpbnQgbGVuKQor eworCXN0cnVjdCB0b2tlbiAqcHRyLCpsYXN0X3B0cjsKKwlpbnQgaSwgbmV3cHJvZml0OworCXVu c2lnbmVkIGludCBoYXNoID0gSEFTSF9CQVNFX09GRlNFVDsKKwl1bnNpZ25lZCBpbnQgaGFzaGVz W01BWF9UT0tfU0laRSArIDFdOworCisJaWYgKGxlbiA+IE1BWF9UT0tfU0laRSkgCisJCWxlbiA9 IE1BWF9UT0tfU0laRTsKKworCWhhc2ggPSByZWhhc2hfdG9rZW4oaGFzaCwgZGF0YVswXSk7CisJ Zm9yIChpID0gMjsgaSA8PSBsZW47IGkrKykgeworCQloYXNoID0gcmVoYXNoX3Rva2VuKGhhc2gs IGRhdGFbaS0xXSk7CisJCWhhc2hlc1tpXSA9IEhBU0hfRk9MRChoYXNoKTsKKwl9CisKKwlsYXN0 X3B0ciA9IE5VTEw7CisJcHRyID0gTlVMTDsKKworCWZvciAoaSA9IGxlbjsgaSA+PSAyOyBpLS0p IHsKKwkJaGFzaCA9IGhhc2hlc1tpXTsKKworCQlpZiAoIXB0cikgcHRyID0gZmluZF90b2tlbl9o YXNoKGRhdGEsIGksIGhhc2gpOworCisJCWlmICghcHRyKSB7CisJCQlwdHIgPSAoc3RydWN0IHRv a2VuICopIG1hbGxvYyhzaXplb2YoKnB0cikpOworCQkJbWVtY3B5KHB0ci0+ZGF0YSwgZGF0YSwg aSk7CisJCQlwdHItPmxlbiA9IGk7CisJCQlwdHItPnByb2ZpdCA9IC1HT09EX0JBRF9USFJFU0hP TEQ7CisJCQlwdHItPm5leHQgPSBoYXNoX3RhYmxlW2hhc2hdOworCQkJaGFzaF90YWJsZVtoYXNo XSA9IHB0cjsKKworCQkJaW5zZXJ0X3Rva2VuX2luX2dyb3VwKCZiYWRfaGVhZCwgcHRyKTsKKwor CQkJcHRyLT5zbWFsbGVyID0gTlVMTDsKKwkJfSBlbHNlIHsKKwkJCW5ld3Byb2ZpdCA9IHB0ci0+ cHJvZml0ICsgKHB0ci0+bGVuIC0gMSk7CisJCQlpZigocHRyLT5wcm9maXQgPCAwKSAmJiAobmV3 cHJvZml0ID49IDApKSB7CisJCQkJcmVtb3ZlX3Rva2VuX2Zyb21fZ3JvdXAocHRyKTsKKwkJCQlp bnNlcnRfdG9rZW5faW5fZ3JvdXAoJmdvb2RfaGVhZCxwdHIpOworCQkJfQorCQlwdHItPnByb2Zp dCA9IG5ld3Byb2ZpdDsKKwkJfQorCisJCWlmIChsYXN0X3B0cikgbGFzdF9wdHItPnNtYWxsZXIg PSBwdHI7CisJCWxhc3RfcHRyID0gcHRyOworCisJCXB0ciA9IHB0ci0+c21hbGxlcjsKKwl9Cit9 CisKK3N0YXRpYyB2b2lkIGZvcmdldF90b2tlbih1bnNpZ25lZCBjaGFyICpkYXRhLCBpbnQgbGVu KQoreworCXN0cnVjdCB0b2tlbiAqcHRyOworCWludCBpLCBuZXdwcm9maXQ7CisJdW5zaWduZWQg aW50IGhhc2g9MDsKKworCWlmIChsZW4gPiBNQVhfVE9LX1NJWkUpIGxlbiA9IE1BWF9UT0tfU0la RTsKKworCWhhc2ggPSBoYXNoX3Rva2VuKGRhdGEsIGxlbik7CisJcHRyID0gZmluZF90b2tlbl9o YXNoKGRhdGEsIGxlbiwgaGFzaCk7CisKKwlmb3IgKGkgPSBsZW47IGkgPj0gMjsgaS0tKSB7CisK KwkJbmV3cHJvZml0ID0gcHRyLT5wcm9maXQgLSAocHRyLT5sZW4gLSAxKTsKKwkJaWYgKChwdHIt PnByb2ZpdCA+PSAwKSAmJiAobmV3cHJvZml0IDwgMCkpIHsKKwkJCXJlbW92ZV90b2tlbl9mcm9t X2dyb3VwKHB0cik7CisJCQlpbnNlcnRfdG9rZW5faW5fZ3JvdXAoJmJhZF9oZWFkLCBwdHIpOwor CQl9CisJCXB0ci0+cHJvZml0PW5ld3Byb2ZpdDsKKworCQlwdHI9cHRyLT5zbWFsbGVyOworCX0K K30KKworc3RhdGljIHZvaWQgbGVhcm5fc3ltYm9sKHVuc2lnbmVkIGNoYXIgKnN5bWJvbCwgaW50 IGxlbikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBsZW4gLSAxOyBpKyspCisJCWxl YXJuX3Rva2VuKHN5bWJvbCArIGksIGxlbiAtIGkpOworfQorCitzdGF0aWMgdm9pZCBmb3JnZXRf c3ltYm9sKHVuc2lnbmVkIGNoYXIgKnN5bWJvbCwgaW50IGxlbikKK3sKKwlpbnQgaTsKKworCWZv ciAoaSA9IDA7IGkgPCBsZW4gLSAxOyBpKyspCisJCWZvcmdldF90b2tlbihzeW1ib2wgKyBpLCBs ZW4gLSBpKTsKK30KKworc3RhdGljIHZvaWQgYnVpbGRfaW5pdGlhbF90b2tfdGFibGUodm9pZCkK K3sKKwlpbnQgaSwgdXNlX2l0LCB2YWxpZDsKKworCXZhbGlkID0gMDsKKwlmb3IgKGkgPSAwOyBp IDwgY250OyBpKyspIHsKKwkJdGFibGVbaV0udmFsaWQgPSBzeW1ib2xfdmFsaWQoJnRhYmxlW2ld KTsKKwkJaWYgKHRhYmxlW2ldLnZhbGlkKSB2YWxpZCsrOworCX0KKworCXVzZV9pdCA9IDA7CisJ Zm9yIChpID0gMDsgaSA8IGNudDsgaSsrKSB7CisJCXRhYmxlW2ldLnNhbXBsZSA9IDA7CisJCWlm ICh0YWJsZVtpXS52YWxpZCkgeworCQkJdXNlX2l0ICs9IFdPUktJTkdfU0VUOworCQkJaWYgKHVz ZV9pdCA+PSB2YWxpZCkgeworCQkJCXRhYmxlW2ldLnNhbXBsZSA9IDE7CisJCQkJdXNlX2l0IC09 IHZhbGlkOworCQkJfQorCQl9CisJCWlmICh0YWJsZVtpXS5zYW1wbGUpCisJCQlsZWFybl9zeW1i b2wodGFibGVbaV0uc3ltLCB0YWJsZVtpXS5sZW4pOworCX0KK30KKworc3RhdGljIHZvaWQgY29t cHJlc3Nfc3ltYm9scyh1bnNpZ25lZCBjaGFyICpzdHIsIGludCB0bGVuLCBpbnQgaWR4KQorewor CWludCBpLCBsZW4sIGxlYXJuLCBzaXplOworCXVuc2lnbmVkIGNoYXIgKnA7CisKKwlmb3IgKGkg PSAwOyBpIDwgY250OyBpKyspIHsKKwkJaWYgKCF0YWJsZVtpXS52YWxpZCkgY29udGludWU7CisJ CQorCQlsZW4gPSB0YWJsZVtpXS5sZW47CisJCWxlYXJuID0gMDsKKwkJcCA9IHRhYmxlW2ldLnN5 bTsKKworCQlkbyB7CisJCQlwID0gKHVuc2lnbmVkIGNoYXIgKikgc3Ryc3RyKChjaGFyICopIHAs IChjaGFyICopIHN0cik7CisJCQlpZiAoIXApIGJyZWFrOworCisJCQlpZiAoIWxlYXJuKSB7CisJ CQkJaWYgKHRhYmxlW2ldLnNhbXBsZSkgCisJCQkJCWZvcmdldF9zeW1ib2wodGFibGVbaV0uc3lt LCBsZW4pOworCQkJCWxlYXJuID0gMTsKKwkJCX0KKworCQkJKnAgPSBpZHg7CisJCQlzaXplID0g KGxlbiAtIChwIC0gdGFibGVbaV0uc3ltKSkgLSB0bGVuICsgMTsKKwkJCW1lbW1vdmUocCArIDEs IHAgKyB0bGVuLCBzaXplKTsKKwkJCXArKzsKKwkJCWxlbiAtPSB0bGVuIC0gMTsKKwkJCQorCQl9 IHdoaWxlIChzaXplID49IHRsZW4pOworCisJCWlmKGxlYXJuKSB7CisJCQl0YWJsZVtpXS5sZW4g PSBsZW47CisJCQlpZih0YWJsZVtpXS5zYW1wbGUpIGxlYXJuX3N5bWJvbCh0YWJsZVtpXS5zeW0s IGxlbik7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdG9rZW4gKmZpbmRfYmVzdF90b2tl bih2b2lkKQoreworCXN0cnVjdCB0b2tlbiAqcHRyLCpiZXN0LCpoZWFkOworCWludCBiZXN0cHJv Zml0OworCisJYmVzdHByb2ZpdD0tMTAwMDA7CisgCisJLyogZmFpbHNhZmU6IGlmIHRoZSAiZ29v ZCIgbGlzdCBpcyBlbXB0eSBzZWFyY2ggZnJvbSB0aGUgImJhZCIgbGlzdCAqLworCWlmKGdvb2Rf aGVhZC5yaWdodCA9PSAmZ29vZF9oZWFkKSBoZWFkID0gJmJhZF9oZWFkOworCWVsc2UgaGVhZCA9 ICZnb29kX2hlYWQ7CisKKwlwdHIgPSBoZWFkLT5yaWdodDsKKwliZXN0ID0gTlVMTDsKKwl3aGls ZSAocHRyICE9IGhlYWQpIHsgCisJCWlmIChwdHItPnByb2ZpdCA+IGJlc3Rwcm9maXQpIHsKKwkJ CWJlc3Rwcm9maXQgPSBwdHItPnByb2ZpdDsKKwkJCWJlc3QgPSBwdHI7CisJCX0KKwkJcHRyID0g cHRyLT5yaWdodDsKKwl9CisKKwlyZXR1cm4gYmVzdDsKK30KKworc3RhdGljIHZvaWQgb3B0aW1p emVfcmVzdWx0KHZvaWQpCit7CisJc3RydWN0IHRva2VuICpiZXN0OworCWludCBpOworCisJLyog dXNpbmcgdGhlICdcMCcgc3ltYm9sIGxhc3QgYWxsb3dzIGNvbXByZXNzX3N5bWJvbHMgdG8gdXNl IHN0YW5kYXJkCisJICAgZmFzdCBzdHJpbmcgZnVuY3Rpb25zCisJKi8KKwlmb3IgKGkgPSAyNTU7 IGkgPj0gMDsgaS0tKSB7CisJCWlmICghYmVzdF90YWJsZV9sZW5baV0pIHsKKwkJCWJlc3QgPSBm aW5kX2Jlc3RfdG9rZW4oKTsKKworCQkJYmVzdF90YWJsZV9sZW5baV0gPSBiZXN0LT5sZW47CisJ CQltZW1jcHkoYmVzdF90YWJsZVtpXSwgYmVzdC0+ZGF0YSwgYmVzdF90YWJsZV9sZW5baV0pOwor CQkJLyogemVybyB0ZXJtaW5hdGUgdGhlIHRva2VuIHNvIHRoYXQgd2UgY2FuIHVzZSBzdHJzdHIK KwkJCSAgIGluIGNvbXByZXNzX3N5bWJvbHMgKi8KKwkJCWJlc3RfdGFibGVbaV1bYmVzdF90YWJs ZV9sZW5baV1dPSdcMCc7CisKKwkJCWNvbXByZXNzX3N5bWJvbHMoYmVzdF90YWJsZVtpXSwgYmVz dF90YWJsZV9sZW5baV0sIGkpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBpbnNlcnRfcmVh bF9zeW1ib2xzX2luX3RhYmxlKHZvaWQpCit7CisJaW50IGksIGosIGM7CisKKwltZW1zZXQoYmVz dF90YWJsZSwgMCwgc2l6ZW9mKGJlc3RfdGFibGUpKTsKKwltZW1zZXQoYmVzdF90YWJsZV9sZW4s IDAsIHNpemVvZihiZXN0X3RhYmxlX2xlbikpOworCisJZm9yIChpID0gMDsgaSA8IGNudDsgaSsr KSB7CisJCWlmICh0YWJsZVtpXS52YWxpZCkgeworCQkJZm9yIChqID0gMDsgaiA8IHRhYmxlW2ld LmxlbjsgaisrKSB7CisJCQkJYyA9IHRhYmxlW2ldLnN5bVtqXTsKKwkJCQliZXN0X3RhYmxlW2Nd WzBdPWM7CisJCQkJYmVzdF90YWJsZV9sZW5bY109MTsKKwkJCX0KKwkJfQorCX0KK30KKworc3Rh dGljIHZvaWQgb3B0aW1pemVfdG9rZW5fdGFibGUodm9pZCkKK3sKKwltZW1zZXQoaGFzaF90YWJs ZSwgMCwgc2l6ZW9mKGhhc2hfdGFibGUpKTsKKworCWdvb2RfaGVhZC5sZWZ0ID0gJmdvb2RfaGVh ZDsKKwlnb29kX2hlYWQucmlnaHQgPSAmZ29vZF9oZWFkOworCisJYmFkX2hlYWQubGVmdCA9ICZi YWRfaGVhZDsKKwliYWRfaGVhZC5yaWdodCA9ICZiYWRfaGVhZDsKKworCWJ1aWxkX2luaXRpYWxf dG9rX3RhYmxlKCk7CisKKwlpbnNlcnRfcmVhbF9zeW1ib2xzX2luX3RhYmxlKCk7CisKKwlvcHRp bWl6ZV9yZXN1bHQoKTsKK30KKworCiBpbnQKIG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQog ewpAQCAtMTcxLDYgKzU1NCw3IEBAIG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogCQl1c2Fn ZSgpOwogCiAJcmVhZF9tYXAoc3RkaW4pOworCW9wdGltaXplX3Rva2VuX3RhYmxlKCk7CiAJd3Jp dGVfc3JjKCk7CiAKIAlyZXR1cm4gMDsK ---MOQ10934066866d6fe508680015adf4ac820a7511f1ac--