From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756247AbZHMU4r (ORCPT ); Thu, 13 Aug 2009 16:56:47 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1755836AbZHMU4q (ORCPT ); Thu, 13 Aug 2009 16:56:46 -0400 Received: from mx2.redhat.com ([66.187.237.31]:53206 "EHLO mx2.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754355AbZHMU4o (ORCPT ); Thu, 13 Aug 2009 16:56:44 -0400 Message-ID: <4A847EA7.20307@redhat.com> Date: Thu, 13 Aug 2009 16:59:19 -0400 From: Masami Hiramatsu User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1b3pre) Gecko/20090513 Fedora/3.0-2.3.beta2.fc11 Thunderbird/3.0b2 MIME-Version: 1.0 To: Ingo Molnar , Steven Rostedt , lkml CC: Ananth N Mavinakayanahalli , Avi Kivity , Andi Kleen , Christoph Hellwig , "Frank Ch. Eigler" , Frederic Weisbecker , "H. Peter Anvin" , Jason Baron , Jim Keniston , "K.Prasad" , Lai Jiangshan , Li Zefan , =?UTF-8?B?UHJ6ZW15c8WCYXdQYXdlxYJjenlr?= , Roland McGrath , Sam Ravnborg , Srikar Dronamraju , Tom Zanussi , Vegard Nossum , systemtap , kvm , DLE Subject: [TOOL] c2kpe: C expression to kprobe event format converter References: <20090813203403.31965.20973.stgit@localhost.localdomain> In-Reply-To: <20090813203403.31965.20973.stgit@localhost.localdomain> Content-Type: multipart/mixed; boundary="------------040903020306080407020700" Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This is a multi-part message in MIME format. --------------040903020306080407020700 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit This program converts probe point in C expression to kprobe event format for kprobe-based event tracer. This helps to define kprobes events by C source line number or function name, and local variable name. Currently, this supports only x86(32/64) kernels. Compile -------- Before compilation, please install libelf and libdwarf development packages. (e.g. elfutils-libelf-devel and libdwarf-devel on Fedora) $ gcc -Wall -lelf -ldwarf c2kpe.c -o c2kpe Synopsis -------- $ c2kpe [options] FUNCTION[+OFFS][@SRC] [VAR [VAR ...]] or $ c2kpe [options] @SRC:LINE [VAR [VAR ...]] FUNCTION: Probing function name. OFFS: Offset in bytes. SRC: Source file path. LINE: Line number VAR: Local variable name. options: -r KREL Kernel release version (e.g. 2.6.31-rc5) -m DEBUGINFO Dwarf-format binary file (vmlinux or kmodule) Example ------- $ c2kpe sys_read fd buf count sys_read+0 %di %si %dx $ c2kpe @mm/filemap.c:339 inode pos sync_page_range+125 -48(%bp) %r14 Example with kprobe-tracer -------------------------- Since C expression may be converted multiple results, I recommend to use readline. $ c2kpe sys_read fd buf count | while read i; do \ echo "p $i" > $DEBUGFS/tracing/kprobe_events ;\ done Note ---- - This requires a kernel compiled with CONFIG_DEBUG_INFO. - Specifying @SRC speeds up c2kpe, because we can skip CUs which don't include specified SRC file. - c2kpe doesn't check whether the offset byte is correctly on the instruction boundary. I recommend you to use @SRC:LINE expression for tracing function body. - This tool doesn't search kmodule file. You need to specify kmodule file if you want to probe it. TODO ---- - Fix bugs. - Support multiple probepoints from stdin. - Better kmodule support. - Use elfutils-libdw? - Merge into trace-cmd or perf-tools? -- Masami Hiramatsu Software Engineer Hitachi Computer Products (America), Inc. Software Solutions Division e-mail: mhiramat@redhat.com --------------040903020306080407020700 Content-Type: text/plain; name="c2kpe.c" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="c2kpe.c" LyoKICogYzJrcGUgOiBDIGV4cHJlc3Npb24gdG8ga3Byb2JlIGV2ZW50IGNvbnZlcnRlcgog KgogKiBXcml0dGVuIGJ5IE1hc2FtaSBIaXJhbWF0c3UgPG1oaXJhbWF0QHJlZGhhdC5jb20+ CiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJp YnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05V IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAqIHRoZSBGcmVlIFNv ZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9y CiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJv Z3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVs LAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGll ZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJU SUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNl IGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNv cHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhp cyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5k YXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAw MjExMS0xMzA3LCBVU0EuCiAqCiAqLwoKI2luY2x1ZGUgPHN5cy91dHNuYW1lLmg+CiNpbmNs dWRlIDxzeXMvdHlwZXMuaD4KI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiNpbmNsdWRlIDxmY250 bC5oPgojaW5jbHVkZSA8ZXJybm8uaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDx1 bmlzdGQuaD4KI2luY2x1ZGUgPGdldG9wdC5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNs dWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPGxpYmR3YXJmL2R3YXJmLmg+CiNpbmNsdWRlIDxs aWJkd2FyZi9saWJkd2FyZi5oPgoKLyogRGVmYXVsdCB2bWxpbnV4IHNlYXJjaCBwYXRocyAq LwojZGVmaW5lIE5SX1NFQVJDSF9QQVRIIDIKY29uc3QgY2hhciAqZGVmYXVsdF9zZWFyY2hf cGF0aFtOUl9TRUFSQ0hfUEFUSF0gPSB7CiIvbGliL21vZHVsZXMvJXMvYnVpbGQvdm1saW51 eCIsCQkvKiBDdXN0b20gYnVpbGQga2VybmVsICovCiIvdXNyL2xpYi9kZWJ1Zy9saWIvbW9k dWxlcy8lcy92bWxpbnV4IiwJLyogUmVkIEhhdCBkZWJ1Z2luZm8gKi8KfTsKCiNkZWZpbmUg X3N0cmluZ2lmeShuKQkjbgojZGVmaW5lIHN0cmluZ2lmeShuKQlfc3RyaW5naWZ5KG4pCgoj aWZkZWYgREVCVUcKI2RlZmluZSBkZWJ1ZyhmbXQgLi4uKQlcCglmcHJpbnRmKHN0ZGVyciwg IkRCRygiIF9fRklMRV9fICI6IiBzdHJpbmdpZnkoX19MSU5FX18pICIpOiAiIGZtdCkKI2Vs c2UKI2RlZmluZSBkZWJ1ZyhmbXQgLi4uKQlkbyB7fSB3aGlsZSAoMCkKI2VuZGlmCgojZGVm aW5lIEVSUl9JRihjbmQpCVwKCWRvIHsgaWYgKGNuZCkgewlcCgkJZnByaW50ZihzdGRlcnIs ICJFcnJvciAoIiBfX0ZJTEVfXyAiOiIgc3RyaW5naWZ5KF9fTElORV9fKSBcCgkJCSIpOiAi IHN0cmluZ2lmeShjbmQpICJcbiIpOwkJCQlcCgkJZXhpdCgxKTsJCQkJCQlcCgl9fSB3aGls ZSAoMCkKCiNkZWZpbmUgTUFYX1BBVEhfTEVOIDI1NgoKLyogRHdhcmZfRGllIExpbmthZ2Ug dG8gcGFyZW50IERpZSAqLwpzdHJ1Y3QgZGllX2xpbmsgewoJc3RydWN0IGRpZV9saW5rICpw YXJlbnQ7CS8qIFBhcmVudCBkaWUgKi8KCUR3YXJmX0RpZSBkaWU7CQkJLyogQ3VycmVudCBk aWUgKi8KfTsKCiNkZWZpbmUgWDg2XzMyX01BWF9SRUdTIDgKY29uc3QgY2hhciAqeDg2XzMy X3JlZ3NfdGFibGVbWDg2XzMyX01BWF9SRUdTXSA9IHsKCSIlYXgiLAoJIiVjeCIsCgkiJWR4 IiwKCSIlYngiLAoJInNhIiwJLyogU3RhY2sgYWRkcmVzcyAqLwoJIiVicCIsCgkiJXNpIiwK CSIlZGkiLAp9OwoKI2RlZmluZSBYODZfNjRfTUFYX1JFR1MgMTYKY29uc3QgY2hhciAqeDg2 XzY0X3JlZ3NfdGFibGVbWDg2XzY0X01BWF9SRUdTXSA9IHsKCSIlYXgiLAoJIiVkeCIsCgki JWN4IiwKCSIlYngiLAoJIiVzaSIsCgkiJWRpIiwKCSIlYnAiLAoJIiVzcCIsCgkiJXI4IiwK CSIlcjkiLAoJIiVyMTAiLAoJIiVyMTEiLAoJIiVyMTIiLAoJIiVyMTMiLAoJIiVyMTQiLAoJ IiVyMTUiLAp9OwoKLyogVE9ETzogc3dpdGNoaW5nIGJ5IGR3YXJmIGFkZHJlc3Mgc2l6ZSAq LwojaWZkZWYgX194ODZfNjRfXwojZGVmaW5lIEFSQ0hfTUFYX1JFR1MgWDg2XzY0X01BWF9S RUdTCiNkZWZpbmUgYXJjaF9yZWdzX3RhYmxlIHg4Nl82NF9yZWdzX3RhYmxlCiNlbHNlCiNk ZWZpbmUgQVJDSF9NQVhfUkVHUyBYODZfMzJfTUFYX1JFR1MKI2RlZmluZSBhcmNoX3JlZ3Nf dGFibGUgeDg2XzMyX3JlZ3NfdGFibGUKI2VuZGlmCgovKiBSZXR1cm4gYXJjaGl0ZWN0dXJl IGRlcGVuZGVudCByZWdpc3RlciBzdHJpbmcgKi8Kc3RhdGljIGlubGluZSBjb25zdCBjaGFy ICpnZXRfYXJjaF9yZWdzdHIodW5zaWduZWQgaW50IG4pCnsKCXJldHVybiAobiA8PSBBUkNI X01BWF9SRUdTKSA/IGFyY2hfcmVnc190YWJsZVtuXSA6IE5VTEw7Cn0KCnN0cnVjdCBwcm9i ZV9maW5kZXIgewoJLyogSW5wdXRzICovCgljaGFyICpmaWxlOwkvKiBGaWxlIG5hbWUgKi8K CWludCBsaW5lOwkvKiBMaW5lIG51bWJlciAqLwoKCWNoYXIgKmZ1bmN0aW9uOwkvKiBGdW5j dGlvbiBuYW1lICovCglpbnQgb2Zmc2V0OwkvKiBPZmZzZXQgYnl0ZXMgKi8KCglEd2FyZl9B ZGRyIGFkZHI7CS8qIEFkZHJlc3MgKi8KCglpbnQgbnJfYXJnczsJLyogTnVtYmVyIG9mIGFy Z3VtZW50cyAqLwoJY2hhciAqKmFyZ3M7CS8qIEFyZ3VtZW50cyAqLwoKCS8qIFdvcmtpbmcg YXJlYSAqLwoJRHdhcmZfQWRkciBjdV9iYXNlOwkvKiBDdXJyZW50IENVIGJhc2UgYWRkcmVz cyAqLwoJRHdhcmZfTG9jZGVzYyBmYmxvYzsJLyogTG9jYXRpb24gb2YgQ3VycmVudCBGcmFt ZSBCYXNlICovCglEd2FyZl9VbnNpZ25lZCBmbm87CS8qIEZpbGUgbnVtYmVyICovCglEd2Fy Zl9PZmYgaW5sX29mZnM7CS8qIElubGluZSBvZmZzZXQgKi8KCWNvbnN0IGNoYXIgKnZhcjsJ LyogQ3VycmVudCB2YXJpYWJsZSBuYW1lICovCgoJLyogT3V0cHV0ICovCglpbnQgZm91bmQ7 CS8qIE51bWJlciBvZiBmb3VuZCBwcm9iZSBwb2ludHMgKi8KfTsKCi8qIEZpbmQgYSBwcm9i ZSBwb2ludCAqLwpzdGF0aWMgdm9pZCBmaW5kX3Byb2JlcG9pbnQoc3RydWN0IHByb2JlX2Zp bmRlciAqcGYpOwoKLyogU2Vzc2lvbiBtYW5hZ2VtZW50IHN0cnVjdHVyZSAqLwpzdGF0aWMg c3RydWN0IHsKCWNoYXIgKmt2ZXI7CgljaGFyICptb2RwYXRoOwoJaW50IG1heHByb2JlOwoK CXN0cnVjdCBwcm9iZV9maW5kZXIgZmluZGVyOwoKCUR3YXJmX0RlYnVnIGRiZzsKCUR3YXJm X0Vycm9yIGVycjsKCWludCBuZm91bmQ7Cn0gc2Vzc2lvbjsKCgpzdGF0aWMgdm9pZCB1c2Fn ZShjb25zdCBjaGFyICptc2cpCnsKCWlmIChtc2cpCgkJcHJpbnRmKCIlc1xuXG4iLCBtc2cp OwoJcHJpbnRmKCJjMmtwZTogQyBleHByZXNzaW9uIHRvIGtwcm9iZSBldmVudCBjb252ZXJ0 ZXJcbiIpOwoJcHJpbnRmKCJVc2FnZTogYzJrcGUgWy1yIEtSRUxdIFstbSBtb2R8dm1saW51 eF0gRlVOQ3xTUkMgW0FSRy4uLl1cbiIpOwoJcHJpbnRmKCIgRlVOQzpcdEZVTkNOQU1FWytP RkZTX0JZVEVdW0BTUkNQQVRIXVxuIik7CglwcmludGYoIiBTUkM6XHRAU1JDUEFUSDpMSU5F XG4iKTsKCXByaW50ZigiIEFSRzpcdExvY2FsIHZhcmlhYmxlIG5hbWVcbiIpOwoJLyogVE9E TzogQGdsb2JhbCwgJHZhcnMsICRwYXJhbXMgKi8KCWV4aXQoMCk7Cn0KCnN0YXRpYyB2b2lk IHNlbWFudGljX2Vycm9yKGNvbnN0IGNoYXIgKm1zZykKewoJZnByaW50ZihzdGRlcnIsICJT ZW1hbnRpYyBlcnJvcjogJXNcbiIsIG1zZyk7CglleGl0KDEpOwp9CgpzdGF0aWMgdm9pZCBw YXJzZV9wcm9iZV9wb2ludChpbnQgYXJnYywgY2hhciAqYXJndltdLCBzdHJ1Y3QgcHJvYmVf ZmluZGVyICpwZikKewoJY2hhciAqYXJnOwoJY2hhciAqcHRyOwoKCWFyZyA9IGFyZ3ZbMF07 CgoJaWYgKGFyZ1swXSA9PSAnQCcpIHsKCQkvKiBTb3VyY2UgTGluZSAqLwoJCWFyZysrOwoJ CXB0ciA9IHN0cmNocihhcmcsICc6Jyk7CgkJaWYgKCFwdHIgfHwgcHRyWzFdID09ICdcMCcp CgkJCXNlbWFudGljX2Vycm9yKCJMaW5lIG51bWJlciBpcyByZXF1aXJlZC4iKTsKCQkqcHRy KysgPSAnXDAnOwoJCXBmLT5maWxlID0gYXJnOwoJCWlmIChzdHJsZW4oYXJnKSA9PSAwKQoJ CQlzZW1hbnRpY19lcnJvcigiTm8gZmlsZSBuYW1lLiIpOwoJCXBmLT5saW5lID0gYXRvaShw dHIpOwoJCWRlYnVnKCJmaWxlOiVzIGxpbmU6JWRcbiIsIHBmLT5maWxlLCBwZi0+bGluZSk7 Cgl9IGVsc2UgewoJCS8qIEZ1bmN0aW9uIG5hbWUgKi8KCQlwZi0+ZnVuY3Rpb24gPSBhcmc7 CgkJcHRyID0gc3RyY2hyKGFyZywgJysnKTsKCQlpZiAocHRyKSB7CgkJCWlmIChwdHJbMV0g PT0gJ1wwJyB8fCBwdHJbMV0gPT0gJ0AnKQoJCQkJc2VtYW50aWNfZXJyb3IoIk9mZnNldCBp cyByZXF1aXJlZC4iKTsKCQkJKnB0cisrID0gJ1wwJzsKCQkJcGYtPm9mZnNldCA9IGF0b2ko cHRyKTsKCQkJYXJnID0gcHRyOwoJCX0KCQlwdHIgPSBzdHJjaHIoYXJnLCAnQCcpOwoJCWlm IChwdHIpIHsKCQkJKnB0cisrID0gJ1wwJzsKCQkJcGYtPmZpbGUgPSBwdHI7CgkJfQoJCWRl YnVnKCJmbmFtZTolcyBmaWxlOiVzIG9mZnNldDolZFxuIiwKCQkgICAgICBwZi0+ZnVuY3Rp b24sIHBmLT5maWxlLCBwZi0+b2Zmc2V0KTsKCX0KCglwZi0+bnJfYXJncyA9IGFyZ2MgLSAx OwoJaWYgKHBmLT5ucl9hcmdzID4gMCkKCQlwZi0+YXJncyA9ICZhcmd2WzFdOwoJZGVidWco IiVkIGFyZ3VtZW50c1xuIiwgcGYtPm5yX2FyZ3MpOwp9CgpzdGF0aWMgdm9pZCBwYXJzZV9h cmdzKGludCBhcmdjLCBjaGFyICphcmd2W10pCnsKCWludCBvcHQ7CglpZiAoYXJnYyA8IDEp CgkJdXNhZ2UoIk5lZWQgYSBwcm9iZSBwb2ludC4iKTsKCgl3aGlsZSAoKG9wdCA9IGdldG9w dChhcmdjLCBhcmd2LCAicjptOm46IikpICE9IC0xKSB7CgkJc3dpdGNoIChvcHQpIHsKCQlj YXNlICdyJzoKCQkJc2Vzc2lvbi5rdmVyID0gb3B0YXJnOwoJCQlicmVhazsKCQljYXNlICdt JzoKCQkJc2Vzc2lvbi5tb2RwYXRoID0gb3B0YXJnOwoJCQlicmVhazsKCQljYXNlICduJzoK CQkJc2Vzc2lvbi5tYXhwcm9iZSA9IGF0b2kob3B0YXJnKTsKCQkJYnJlYWs7CgkJZGVmYXVs dDoKCQkJdXNhZ2UoIlVuZXhwZWN0ZWQgb3B0aW9uIGZvdW5kLiIpOwoJCX0KCX0KCWlmIChv cHRpbmQgPj0gYXJnYykKCQl1c2FnZSgiTmVlZCBhIHByb2JlIHBvaW50LiIpOwoKCXBhcnNl X3Byb2JlX3BvaW50KGFyZ2MgLSBvcHRpbmQsICZhcmd2W29wdGluZF0sICZzZXNzaW9uLmZp bmRlcik7Cn0KCnN0YXRpYyBpbnQgb3Blbl9kZWZhdWx0X3ZtbGludXgoY29uc3QgY2hhciAq a3ZlcikKewoJc3RydWN0IHV0c25hbWUgdXRzOwoJY2hhciBmbmFtZVtNQVhfUEFUSF9MRU5d OwoJaW50IGZkLCByZXQsIGk7CgoJaWYgKCFrdmVyKSB7CgkJcmV0ID0gdW5hbWUoJnV0cyk7 CgkJaWYgKHJldCkgewoJCQlkZWJ1ZygidW5hbWUoKSBmYWlsZWQuXG4iKTsKCQkJcmV0dXJu IC1lcnJubzsKCQl9CgkJa3ZlciA9IHV0cy5yZWxlYXNlOwoJfQoJZm9yIChpID0gMDsgaSA8 IE5SX1NFQVJDSF9QQVRIOyBpKyspIHsKCQlyZXQgPSBzbnByaW50ZihmbmFtZSwgTUFYX1BB VEhfTEVOLAoJCQkgICAgICAgZGVmYXVsdF9zZWFyY2hfcGF0aFtpXSwga3Zlcik7CgkJaWYg KHJldCA+PSBNQVhfUEFUSF9MRU4gfHwgcmV0IDwgMCkgewoJCQlkZWJ1ZygiRmlsZW5hbWUo JWQsJXMpIGlzIHRvbyBsb25nLlxuIiwgaSwgdXRzLnJlbGVhc2UpOwoJCQllcnJubyA9IEUy QklHOwoJCQlyZXR1cm4gLUUyQklHOwoJCX0KCQlkZWJ1ZygidHJ5IHRvIG9wZW4gJXNcbiIs IGZuYW1lKTsKCQlmZCA9IG9wZW4oZm5hbWUsIE9fUkRPTkxZKTsKCQlpZiAoZmQgPj0gMCkK CQkJYnJlYWs7Cgl9CglyZXR1cm4gZmQ7Cn0KCmludCBtYWluKGludCBhcmdjLCBjaGFyICph cmd2W10pCnsKCWludCBmZCwgcmV0OwoKCXBhcnNlX2FyZ3MoYXJnYywgYXJndik7CgoJaWYg KHNlc3Npb24ubW9kcGF0aCkKCQlmZCA9IG9wZW4oc2Vzc2lvbi5tb2RwYXRoLCBPX1JET05M WSk7CgllbHNlCgkJZmQgPSBvcGVuX2RlZmF1bHRfdm1saW51eChzZXNzaW9uLmt2ZXIpOwoJ aWYgKGZkIDwgMCkgewoJCXBlcnJvcigiZmlsZSBvcGVuIik7CgkJZXhpdCgxKTsKCX0KCgkv KiBUT0RPOiBoYW5kbGUgZXJyb3JzICovCglyZXQgPSBkd2FyZl9pbml0KGZkLCBEV19ETENf UkVBRCwgMCwgMCwgJnNlc3Npb24uZGJnLCAmc2Vzc2lvbi5lcnIpOwoJaWYgKHJldCAhPSBE V19ETFZfT0spIHsKCQlmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBjYWxsIGR3YXJmX2lu aXQoKS4gIgoJCQkiTWF5YmUsIG5vdCBhIGR3YXJmIGZpbGU/XG4iKTsKCQlleGl0KDEpOwoJ fQoKCWZpbmRfcHJvYmVwb2ludCgmc2Vzc2lvbi5maW5kZXIpOwoKCXJldCA9IGR3YXJmX2Zp bmlzaChzZXNzaW9uLmRiZywgJnNlc3Npb24uZXJyKTsKCUVSUl9JRihyZXQgIT0gRFdfRExW X09LKTsKCgljbG9zZShmZCk7CglyZXR1cm4gMDsKfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0t LS0KICogRHdhcmYgQW5hbHlzeXMgUGFydAogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgov KgogKiBDb21wYXJlIHRoZSB0YWlsIG9mIHR3byBzdHJpbmdzLgogKiBSZXR1cm4gMCBpZiB3 aG9sZSBvZiBlaXRoZXIgc3RyaW5nIGlzIHNhbWUgYXMgYW5vdGhlcidzIHRhaWwgcGFydC4K ICovCnN0YXRpYyBpbnQgc3RydGFpbGNtcChjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAq czIpCnsKCWludCBpMSA9IHN0cmxlbihzMSk7CglpbnQgaTIgPSBzdHJsZW4oczIpOwoJd2hp bGUgKC0taTEgPiAwICYmIC0taTIgPiAwKSB7CgkJaWYgKHMxW2kxXSAhPSBzMltpMl0pCgkJ CXJldHVybiBzMVtpMV0gLSBzMltpMl07Cgl9CglyZXR1cm4gMDsKfQoKLyogRmluZCB0aGUg ZmlsZW5vIG9mIHRoZSB0YXJnZXQgZmlsZS4gKi8Kc3RhdGljIER3YXJmX1Vuc2lnbmVkIGRp ZV9nZXRfZmlsZW5vKER3YXJmX0RpZSBjdV9kaWUsIGNvbnN0IGNoYXIgKmZuYW1lKQp7CglE d2FyZl9TaWduZWQgY250LCBpOwoJRHdhcmZfVW5zaWduZWQgZm91bmQgPSAwOwoJY2hhciAq KnNyY3M7CglpbnQgcmV0OwoKCWlmICghZm5hbWUpCgkJcmV0dXJuIDA7CgoJcmV0ID0gZHdh cmZfc3JjZmlsZXMoY3VfZGllLCAmc3JjcywgJmNudCwgJnNlc3Npb24uZXJyKTsKCWlmIChy ZXQgPT0gRFdfRExWX09LKSB7CgkJZm9yIChpID0gMDsgaSA8IGNudCAmJiAhZm91bmQ7IGkr KykgewoJCQlpZiAoc3RydGFpbGNtcChzcmNzW2ldLCBmbmFtZSkgPT0gMCkKCQkJCWZvdW5k ID0gaSArIDE7CgkJCWR3YXJmX2RlYWxsb2Moc2Vzc2lvbi5kYmcsIHNyY3NbaV0sIERXX0RM QV9TVFJJTkcpOwoJCX0KCQlmb3IgKDtpIDwgY250OyBpKyspCgkJCWR3YXJmX2RlYWxsb2Mo c2Vzc2lvbi5kYmcsIHNyY3NbaV0sIERXX0RMQV9TVFJJTkcpOwoJCWR3YXJmX2RlYWxsb2Mo c2Vzc2lvbi5kYmcsIHNyY3MsIERXX0RMQV9MSVNUKTsKCX0KCWlmIChmb3VuZCkgZGVidWco ImZvdW5kIGZubzogJWRcbiIsIChpbnQpZm91bmQpOwoJcmV0dXJuIGZvdW5kOwp9CgovKiBD b21wYXJlIGRpZW5hbWUgYW5kIHRuYW1lICovCnN0YXRpYyBpbnQgZGllX2NvbXBhcmVfbmFt ZShEd2FyZl9EaWUgZGllLCBjb25zdCBjaGFyICp0bmFtZSkKewoJY2hhciAqbmFtZTsKCWlu dCByZXQ7CglyZXQgPSBkd2FyZl9kaWVuYW1lKGRpZSwgJm5hbWUsICZzZXNzaW9uLmVycik7 CglFUlJfSUYocmV0ID09IERXX0RMVl9FUlJPUik7CglpZiAocmV0ID09IERXX0RMVl9PSykg ewoJCS8vZGVidWcoImRpZW5hbWU6ICVzXG4iLCBuYW1lKTsKCQlyZXQgPSBzdHJjbXAodG5h bWUsIG5hbWUpOwoJCWR3YXJmX2RlYWxsb2Moc2Vzc2lvbi5kYmcsIG5hbWUsIERXX0RMQV9T VFJJTkcpOwoJfSBlbHNlCgkJcmV0ID0gLTE7CglyZXR1cm4gcmV0Owp9CgovKiBDaGVjayB0 aGUgYWRkcmVzcyBpcyBpbiB0aGUgc3VicHJvZ3JhbShmdW5jdGlvbikuICovCnN0YXRpYyBp bnQgZGllX3dpdGhpbl9zdWJwcm9ncmFtKER3YXJmX0RpZSBzcF9kaWUsIER3YXJmX0FkZHIg YWRkciwKCQkJCSBEd2FyZl9TaWduZWQgKm9mZnMpCnsKCUR3YXJmX0FkZHIgbG9wYywgaGlw YzsKCWludCByZXQ7CgoJcmV0ID0gZHdhcmZfbG93cGMoc3BfZGllLCAmbG9wYywgJnNlc3Np b24uZXJyKTsKCUVSUl9JRihyZXQgPT0gRFdfRExWX0VSUk9SKTsKCWlmIChyZXQgPT0gRFdf RExWX05PX0VOVFJZKQoJCXJldHVybiAwOwoJcmV0ID0gZHdhcmZfaGlnaHBjKHNwX2RpZSwg JmhpcGMsICZzZXNzaW9uLmVycik7CglFUlJfSUYocmV0ICE9IERXX0RMVl9PSyk7CglpZiAo bG9wYyA8PSBhZGRyICYmIGFkZHIgPCBoaXBjKSB7CgkJKm9mZnMgPSBhZGRyIC0gbG9wYzsK CQlyZXR1cm4gMTsKCX0gZWxzZQoJCXJldHVybiAwOwp9CgovKiBDaGVjayB0aGUgZGllIGlz IGlubGluZWQgZnVuY3Rpb24gKi8Kc3RhdGljIER3YXJmX0Jvb2wgZGllX2lubGluZWRfc3Vi cHJvZ3JhbShEd2FyZl9EaWUgZGllKQp7CgkvKiBUT0RPOiBjaGVjayBzdHJpY3RseSAqLwoJ RHdhcmZfQm9vbCBpbmw7CglpbnQgcmV0OwoKCXJldCA9IGR3YXJmX2hhc2F0dHIoZGllLCBE V19BVF9pbmxpbmUsICZpbmwsICZzZXNzaW9uLmVycik7CglFUlJfSUYocmV0ID09IERXX0RM Vl9FUlJPUik7CglyZXR1cm4gaW5sOwp9CgovKiBHZXQgdGhlIG9mZnNldCBvZiBhYnN0cnVj dF9vcmlnaW4gKi8Kc3RhdGljIER3YXJmX09mZiBkaWVfZ2V0X2Fic3RyYWN0X29yaWdpbihE d2FyZl9EaWUgZGllKQp7CglEd2FyZl9BdHRyaWJ1dGUgYXR0cjsKCUR3YXJmX09mZiBjdV9v ZmZzOwoJaW50IHJldDsKCglyZXQgPSBkd2FyZl9hdHRyKGRpZSwgRFdfQVRfYWJzdHJhY3Rf b3JpZ2luLCAmYXR0ciwgJnNlc3Npb24uZXJyKTsKCUVSUl9JRihyZXQgIT0gRFdfRExWX09L KTsKCXJldCA9IGR3YXJmX2Zvcm1yZWYoYXR0ciwgJmN1X29mZnMsICZzZXNzaW9uLmVycik7 CglFUlJfSUYocmV0ICE9IERXX0RMVl9PSyk7Cglkd2FyZl9kZWFsbG9jKHNlc3Npb24uZGJn LCBhdHRyLCBEV19ETEFfQVRUUik7CglyZXR1cm4gY3Vfb2ZmczsKfQoKLyogR2V0IGVudHJ5 IHBjKG9yIGxvdyBwYywgMXN0IGVudHJ5IG9mIHJhbmdlcykgIG9mIHRoZSBkaWUgKi8Kc3Rh dGljIER3YXJmX0FkZHIgZGllX2dldF9lbnRyeXBjKER3YXJmX0RpZSBkaWUpCnsKCUR3YXJm X0F0dHJpYnV0ZSBhdHRyOwoJRHdhcmZfQWRkciBhZGRyOwoJRHdhcmZfT2ZmIG9mZnM7CglE d2FyZl9SYW5nZXMgKnJhbmdlczsKCUR3YXJmX1NpZ25lZCBjbnQ7CglpbnQgcmV0OwoKCS8q IFRyeSB0byBnZXQgZW50cnkgcGMgKi8KCXJldCA9IGR3YXJmX2F0dHIoZGllLCBEV19BVF9l bnRyeV9wYywgJmF0dHIsICZzZXNzaW9uLmVycik7CglFUlJfSUYocmV0ID09IERXX0RMVl9F UlJPUik7CglpZiAocmV0ID09IERXX0RMVl9PSykgewoJCXJldCA9IGR3YXJmX2Zvcm1hZGRy KGF0dHIsICZhZGRyLCAmc2Vzc2lvbi5lcnIpOwoJCUVSUl9JRihyZXQgIT0gRFdfRExWX09L KTsKCQlkd2FyZl9kZWFsbG9jKHNlc3Npb24uZGJnLCBhdHRyLCBEV19ETEFfQVRUUik7CgkJ cmV0dXJuIGFkZHI7Cgl9CgoJLyogVHJ5IHRvIGdldCBsb3cgcGMgKi8KCXJldCA9IGR3YXJm X2xvd3BjKGRpZSwgJmFkZHIsICZzZXNzaW9uLmVycik7CglFUlJfSUYocmV0ID09IERXX0RM Vl9FUlJPUik7CglpZiAocmV0ID09IERXX0RMVl9PSykKCQlyZXR1cm4gYWRkcjsKCgkvKiBU cnkgdG8gZ2V0IHJhbmdlcyAqLwoJcmV0ID0gZHdhcmZfYXR0cihkaWUsIERXX0FUX3Jhbmdl cywgJmF0dHIsICZzZXNzaW9uLmVycik7CglFUlJfSUYocmV0ICE9IERXX0RMVl9PSyk7Cgly ZXQgPSBkd2FyZl9mb3JtcmVmKGF0dHIsICZvZmZzLCAmc2Vzc2lvbi5lcnIpOwoJRVJSX0lG KHJldCAhPSBEV19ETFZfT0spOwoJcmV0ID0gZHdhcmZfZ2V0X3JhbmdlcyhzZXNzaW9uLmRi Zywgb2ZmcywgJnJhbmdlcywgJmNudCwgTlVMTCwKCQkJCSZzZXNzaW9uLmVycik7CglFUlJf SUYocmV0ICE9IERXX0RMVl9PSyk7CglhZGRyID0gcmFuZ2VzWzBdLmR3cl9hZGRyMTsKCWR3 YXJmX3Jhbmdlc19kZWFsbG9jKHNlc3Npb24uZGJnLCByYW5nZXMsIGNudCk7CglyZXR1cm4g YWRkcjsKfQoKLyoKICogU2VhcmNoIGEgRGllIGZyb20gRGllIHRyZWUuCiAqIE5vdGU6IGN1 cl9saW5rLT5kaWUgc2hvdWxkIGJlIGRlYWxsb2NhdGVkIGluIHRoaXMgZnVuY3Rpb24uCiAq LwpzdGF0aWMgaW50IF9fc2VhcmNoX2RpZV90cmVlKHN0cnVjdCBkaWVfbGluayAqY3VyX2xp bmssCgkJCSAgICAgaW50ICgqZGllX2NiKShzdHJ1Y3QgZGllX2xpbmsgKiwgdm9pZCAqKSwK CQkJICAgICB2b2lkICpkYXRhKQp7CglEd2FyZl9EaWUgbmV3X2RpZTsKCXN0cnVjdCBkaWVf bGluayBsaW5rOwoJaW50IHJldDsKCglpZiAoIWRpZV9jYikKCQlyZXR1cm4gMDsKCgkvKiBD aGVjayBjdXJyZW50IGRpZSAqLwoJd2hpbGUgKCEocmV0ID0gZGllX2NiKGN1cl9saW5rLCBk YXRhKSkpIHsKCQkvKiBDaGVjayBjaGlsZCBkaWUgKi8KCQlyZXQgPSBkd2FyZl9jaGlsZChj dXJfbGluay0+ZGllLCAmbmV3X2RpZSwgJnNlc3Npb24uZXJyKTsKCQlFUlJfSUYocmV0ID09 IERXX0RMVl9FUlJPUik7CgkJaWYgKHJldCA9PSBEV19ETFZfT0spIHsKCQkJbGluay5wYXJl bnQgPSBjdXJfbGluazsKCQkJbGluay5kaWUgPSBuZXdfZGllOwoJCQlyZXQgPSBfX3NlYXJj aF9kaWVfdHJlZSgmbGluaywgZGllX2NiLCBkYXRhKTsKCQkJaWYgKHJldCkKCQkJCWJyZWFr OwoJCX0KCgkJLyogTW92ZSB0byBuZXh0IHNpYmxpbmcgKi8KCQlyZXQgPSBkd2FyZl9zaWJs aW5nb2Yoc2Vzc2lvbi5kYmcsIGN1cl9saW5rLT5kaWUsICZuZXdfZGllLAoJCQkJICAgICAg JnNlc3Npb24uZXJyKTsKCQlFUlJfSUYocmV0ID09IERXX0RMVl9FUlJPUik7CgkJZHdhcmZf ZGVhbGxvYyhzZXNzaW9uLmRiZywgY3VyX2xpbmstPmRpZSwgRFdfRExBX0RJRSk7CgkJY3Vy X2xpbmstPmRpZSA9IG5ld19kaWU7CgkJaWYgKHJldCA9PSBEV19ETFZfTk9fRU5UUlkpCgkJ CXJldHVybiAwOwoJfQoJZHdhcmZfZGVhbGxvYyhzZXNzaW9uLmRiZywgY3VyX2xpbmstPmRp ZSwgRFdfRExBX0RJRSk7CglyZXR1cm4gcmV0Owp9CgovKiBTZWFyY2ggYSBkaWUgaW4gaXRz IGNoaWxkcmVuJ3MgZGllIHRyZWUgKi8Kc3RhdGljIGludCBzZWFyY2hfZGllX2Zyb21fY2hp bGRyZW4oRHdhcmZfRGllIHBhcmVudF9kaWUsCgkJCQkgICAgaW50ICgqZGllX2NiKShzdHJ1 Y3QgZGllX2xpbmsgKiwgdm9pZCAqKSwgCgkJCQkgICAgdm9pZCAqZGF0YSkKewoJc3RydWN0 IGRpZV9saW5rIGxpbms7CglpbnQgcmV0OwoKCWxpbmsucGFyZW50ID0gTlVMTDsKCXJldCA9 IGR3YXJmX2NoaWxkKHBhcmVudF9kaWUsICZsaW5rLmRpZSwgJnNlc3Npb24uZXJyKTsKCUVS Ul9JRihyZXQgPT0gRFdfRExWX0VSUk9SKTsKCWlmIChyZXQgPT0gRFdfRExWX09LKQoJCXJl dHVybiBfX3NlYXJjaF9kaWVfdHJlZSgmbGluaywgZGllX2NiLCBkYXRhKTsKCWVsc2UKCQly ZXR1cm4gMDsKfQoKLyogRmluZCBhIGxvY2Rlc2MgY29ycmVzcG9uZGluZyB0byB0aGUgYWRk cmVzcyAqLwpzdGF0aWMgaW50IGF0dHJfZ2V0X2xvY2Rlc2MoRHdhcmZfQXR0cmlidXRlIGF0 dHIsIER3YXJmX0xvY2Rlc2MgKmRlc2MsCgkJCSAgICBEd2FyZl9BZGRyIGFkZHIpCnsKCUR3 YXJmX1NpZ25lZCBsY250OwoJRHdhcmZfTG9jZGVzYyAqKmxsYnVmOwoJaW50IHJldCwgaTsK CglyZXQgPSBkd2FyZl9sb2NsaXN0X24oYXR0ciwgJmxsYnVmLCAmbGNudCwgJnNlc3Npb24u ZXJyKTsKCUVSUl9JRihyZXQgIT0gRFdfRExWX09LKTsKCXJldCA9IERXX0RMVl9OT19FTlRS WTsKCWZvciAoaSA9IDA7IGkgPCBsY250OyArK2kpIHsKCQlpZiAobGxidWZbaV0tPmxkX2xv cGMgPD0gYWRkciAmJgoJCSAgICBsbGJ1ZltpXS0+bGRfaGlwYyA+IGFkZHIgKSB7CgkJCW1l bWNweShkZXNjLCBsbGJ1ZltpXSwgc2l6ZW9mKER3YXJmX0xvY2Rlc2MpKTsKCQkJZGVzYy0+ bGRfcyA9CgkJCQltYWxsb2Moc2l6ZW9mKER3YXJmX0xvYykgKiBsbGJ1ZltpXS0+bGRfY2Vu dHMpOwoJCQlFUlJfSUYoZGVzYy0+bGRfcyA9PSBOVUxMKTsKCQkJbWVtY3B5KGRlc2MtPmxk X3MsIGxsYnVmW2ldLT5sZF9zLAoJCQkJc2l6ZW9mKER3YXJmX0xvYykgKiBsbGJ1ZltpXS0+ bGRfY2VudHMpOwoJCQlyZXQgPSBEV19ETFZfT0s7CgkJCWJyZWFrOwoJCX0KCQlkd2FyZl9k ZWFsbG9jKHNlc3Npb24uZGJnLCBsbGJ1ZltpXS0+bGRfcywgRFdfRExBX0xPQ19CTE9DSyk7 CgkJZHdhcmZfZGVhbGxvYyhzZXNzaW9uLmRiZywgbGxidWZbaV0sIERXX0RMQV9MT0NERVND KTsKCX0KCS8qIFJlbGVhc2luZyBsb29wICovCglmb3IgKDsgaSA8IGxjbnQ7ICsraSkgewoJ CWR3YXJmX2RlYWxsb2Moc2Vzc2lvbi5kYmcsIGxsYnVmW2ldLT5sZF9zLCBEV19ETEFfTE9D X0JMT0NLKTsKCQlkd2FyZl9kZWFsbG9jKHNlc3Npb24uZGJnLCBsbGJ1ZltpXSwgRFdfRExB X0xPQ0RFU0MpOwoJfQoJZHdhcmZfZGVhbGxvYyhzZXNzaW9uLmRiZywgbGxidWYsIERXX0RM QV9MSVNUKTsKCXJldHVybiByZXQ7Cn0KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tCiAqIFByb2JlIGZpbmRlciByZWxhdGVkIGZ1bmN0aW9ucwogKi0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKLyogU2hvdyBhIGxvY2F0aW9uICovCnN0YXRpYyB2 b2lkIHNob3dfbG9jYXRpb24oRHdhcmZfTG9jICpsb2MsIHN0cnVjdCBwcm9iZV9maW5kZXIg KnBmKQp7CglEd2FyZl9TbWFsbCBvcDsKCUR3YXJmX1Vuc2lnbmVkIHJlZ247CglEd2FyZl9T aWduZWQgb2ZmczsKCWludCBkZXJlZiA9IDA7Cgljb25zdCBjaGFyICpyZWdzOwoKCW9wID0g bG9jLT5scl9hdG9tOwoKCS8qIElmIHRoaXMgaXMgYmFzZWQgb24gZnJhbWUgYnVmZmVyLCBz ZXQgdGhlIG9mZnNldCAqLwoJaWYgKG9wID09IERXX09QX2ZicmVnKSB7CgkJZGVyZWYgPSAx OwoJCW9mZnMgPSAoRHdhcmZfU2lnbmVkKWxvYy0+bHJfbnVtYmVyOwoJCW9wID0gcGYtPmZi bG9jLmxkX3NbMF0ubHJfYXRvbTsKCQlsb2MgPSAmcGYtPmZibG9jLmxkX3NbMF07Cgl9IGVs c2UKCQlvZmZzID0gMDsKCglpZiAob3AgPj0gRFdfT1BfYnJlZzAgJiYgb3AgPD0gRFdfT1Bf YnJlZzMxKSB7CgkJcmVnbiA9IG9wIC0gRFdfT1BfYnJlZzA7CgkJb2ZmcyArPSAoRHdhcmZf U2lnbmVkKWxvYy0+bHJfbnVtYmVyOwoJCWRlcmVmID0gMTsKCX0gZWxzZSBpZiAob3AgPj0g RFdfT1BfcmVnMCAmJiBvcCA8PSBEV19PUF9yZWczMSkgewoJCXJlZ24gPSBvcCAtIERXX09Q X3JlZzA7Cgl9IGVsc2UgaWYgKG9wID09IERXX09QX2JyZWd4KSB7CgkJcmVnbiA9IGxvYy0+ bHJfbnVtYmVyOwoJCW9mZnMgKz0gKER3YXJmX1NpZ25lZClsb2MtPmxyX251bWJlcjI7CgkJ ZGVyZWYgPSAxOwoJfSBlbHNlIGlmIChvcCA9PSBEV19PUF9yZWd4KSB7CgkJcmVnbiA9IGxv Yy0+bHJfbnVtYmVyOwoJfSBlbHNlIHsKCQlmcHJpbnRmKHN0ZGVyciwgIkVycm9yOiBEd2Fy Zl9PUCAlZCBpcyBub3Qgc3VwcG9ydGVkLlxuIiwgb3ApOwoJCWV4aXQoMSk7Cgl9CgoJcmVn cyA9IGdldF9hcmNoX3JlZ3N0cihyZWduKTsKCWlmICghcmVncykgewoJCWZwcmludGYoc3Rk ZXJyLAoJCQkiRXJyb3I6ICVsbGQgZXhjZWVkcyBtYXggcmVnaXN0ZXIgbnVtYmVyLlxuIiwg cmVnbik7CgkJZXhpdCgxKTsKCX0KCglpZiAoZGVyZWYpCgkJcHJpbnRmKCIgJStsbGQoJXMp Iiwgb2ZmcywgcmVncyk7CgllbHNlCgkJcHJpbnRmKCIgJXMiLCByZWdzKTsKfQoKLyogU2hv dyBhIHZhcmlhYmxlcyBpbiBrcHJvYmUgZXZlbnQgZm9ybWF0ICovCnN0YXRpYyB2b2lkIHNo b3dfdmFyaWFibGUoRHdhcmZfRGllIHZyX2RpZSwgc3RydWN0IHByb2JlX2ZpbmRlciAqcGYp CnsKCUR3YXJmX0F0dHJpYnV0ZSBhdHRyOwoJRHdhcmZfTG9jZGVzYyBsZDsKCWludCByZXQ7 CgoJcmV0ID0gZHdhcmZfYXR0cih2cl9kaWUsIERXX0FUX2xvY2F0aW9uLCAmYXR0ciwgJnNl c3Npb24uZXJyKTsKCUVSUl9JRihyZXQgIT0gRFdfRExWX09LKTsKCXJldCA9IGF0dHJfZ2V0 X2xvY2Rlc2MoYXR0ciwgJmxkLCAocGYtPmFkZHIgLSBwZi0+Y3VfYmFzZSkpOwoJRVJSX0lG KHJldCAhPSBEV19ETFZfT0spOwoJLyogVE9ETz8gKi8KCWlmIChsZC5sZF9jZW50cyAhPSAx KSB7CgkJZnByaW50ZihzdGRlcnIsICJUaGlzIHZhcmlhYmxlIHR5cGUgaXMgbm90IHN1cHBv cnRlZC5cbiIpOwoJCWV4aXQoMSk7Cgl9CglzaG93X2xvY2F0aW9uKCZsZC5sZF9zWzBdLCBw Zik7CglmcmVlKGxkLmxkX3MpOwoJZHdhcmZfZGVhbGxvYyhzZXNzaW9uLmRiZywgYXR0ciwg RFdfRExBX0FUVFIpOwp9CgpzdGF0aWMgaW50IHZhcmlhYmxlX2NhbGxiYWNrKHN0cnVjdCBk aWVfbGluayAqbGluaywgdm9pZCAqZGF0YSkKewoJc3RydWN0IHByb2JlX2ZpbmRlciAqcGYg PSAoc3RydWN0IHByb2JlX2ZpbmRlciAqKWRhdGE7CglEd2FyZl9IYWxmIHRhZzsKCWludCBy ZXQ7CgoJcmV0ID0gZHdhcmZfdGFnKGxpbmstPmRpZSwgJnRhZywgJnNlc3Npb24uZXJyKTsK CUVSUl9JRihyZXQgPT0gRFdfRExWX0VSUk9SKTsKCWlmICgodGFnID09IERXX1RBR19mb3Jt YWxfcGFyYW1ldGVyIHx8CgkgICAgIHRhZyA9PSBEV19UQUdfdmFyaWFibGUpICYmIAoJICAg IChkaWVfY29tcGFyZV9uYW1lKGxpbmstPmRpZSwgcGYtPnZhcikgPT0gMCkpIHsKCQlzaG93 X3ZhcmlhYmxlKGxpbmstPmRpZSwgcGYpOwoJCXJldHVybiAxOwoJfQoJLyogVE9ETzogU3Vw cG9ydCBzdHJ1Y3QgbWVtYmVycyAqLwoJcmV0dXJuIDA7Cn0KCi8qIEZpbmQgYSB2YXJpYWJs ZSBpbiBhIHN1YnByb2dyYW0gZGllICovCnN0YXRpYyB2b2lkIGZpbmRfdmFyaWFibGUoY29u c3QgY2hhciAqdmFyLCBEd2FyZl9EaWUgc3BfZGllLAoJCQkgIHN0cnVjdCBwcm9iZV9maW5k ZXIgKnBmKQp7CglpbnQgcmV0OwoKCWRlYnVnKCJTZWFyY2hpbmcgJXMgdmFyaWFibGUgaW4g Y29udGV4dC5cbiIsIHZhcik7CglwZi0+dmFyID0gdmFyOwoJLyogU2VhcmNoIGNoaWxkIGRp ZSBmb3IgbG9jYWwgdmFyaWFibGVzIGFuZCBwYXJhbWV0ZXJzLiAqLwoJcmV0ID0gc2VhcmNo X2RpZV9mcm9tX2NoaWxkcmVuKHNwX2RpZSwgdmFyaWFibGVfY2FsbGJhY2ssIHBmKTsKCWlm ICghcmV0KSB7CgkJZnByaW50ZihzdGRlcnIsICJcbkZhaWxlZCB0byBmaW5kICVzIGluIHRo aXMgZnVuY3Rpb24uXG4iLCB2YXIpOwoJCWV4aXQoMSk7Cgl9Cn0KCi8qIEdldCBhIGZyYW1l IGJhc2Ugb24gdGhlIGFkZHJlc3MgKi8Kc3RhdGljIHZvaWQgZ2V0X2N1cnJlbnRfZnJhbWVf YmFzZShEd2FyZl9EaWUgc3BfZGllLCBzdHJ1Y3QgcHJvYmVfZmluZGVyICpwZikKewoJRHdh cmZfQXR0cmlidXRlIGF0dHI7CglpbnQgcmV0OwoKCXJldCA9IGR3YXJmX2F0dHIoc3BfZGll LCBEV19BVF9mcmFtZV9iYXNlLCAmYXR0ciwgJnNlc3Npb24uZXJyKTsKCUVSUl9JRihyZXQg IT0gRFdfRExWX09LKTsKCXJldCA9IGF0dHJfZ2V0X2xvY2Rlc2MoYXR0ciwgJnBmLT5mYmxv YywgKHBmLT5hZGRyIC0gcGYtPmN1X2Jhc2UpKTsKCUVSUl9JRihyZXQgIT0gRFdfRExWX09L KTsKCWR3YXJmX2RlYWxsb2Moc2Vzc2lvbi5kYmcsIGF0dHIsIERXX0RMQV9BVFRSKTsKfQoK c3RhdGljIHZvaWQgZnJlZV9jdXJyZW50X2ZyYW1lX2Jhc2Uoc3RydWN0IHByb2JlX2ZpbmRl ciAqcGYpCnsKCWZyZWUocGYtPmZibG9jLmxkX3MpOwoJbWVtc2V0KCZwZi0+ZmJsb2MsIDAs IHNpemVvZihEd2FyZl9Mb2NkZXNjKSk7Cn0KCi8qIFNob3cgYSBwcm9iZSBwb2ludCB0byBz dGRvdXQgKi8Kc3RhdGljIHZvaWQgc2hvd19wcm9iZXBvaW50KER3YXJmX0RpZSBzcF9kaWUs IER3YXJmX1NpZ25lZCBvZmZzLAoJCQkgICAgc3RydWN0IHByb2JlX2ZpbmRlciAqcGYpCnsK CWNoYXIgKm5hbWU7CglpbnQgcmV0LCBpOwoJcmV0ID0gZHdhcmZfZGllbmFtZShzcF9kaWUs ICZuYW1lLCAmc2Vzc2lvbi5lcnIpOwoJRVJSX0lGKHJldCA9PSBEV19ETFZfRVJST1IpOwoJ aWYgKHJldCA9PSBEV19ETFZfT0spIHsKCQlwcmludGYoIiVzJStkIiwgbmFtZSwgKGludClv ZmZzKTsKCQlkd2FyZl9kZWFsbG9jKHNlc3Npb24uZGJnLCBuYW1lLCBEV19ETEFfU1RSSU5H KTsKCX0gZWxzZSB7CgkJLyogVGhpcyBmdW5jdGlvbiBoYXMgbm8gbmFtZS4gKi8KCQlwcmlu dGYoIjB4JWxseCIsIHBmLT5hZGRyKTsKCX0KCWdldF9jdXJyZW50X2ZyYW1lX2Jhc2Uoc3Bf ZGllLCBwZik7Cglmb3IgKGkgPSAwOyBpIDwgcGYtPm5yX2FyZ3M7IGkrKykKCQlmaW5kX3Zh cmlhYmxlKHBmLT5hcmdzW2ldLCBzcF9kaWUsIHBmKTsKCWZyZWVfY3VycmVudF9mcmFtZV9i YXNlKHBmKTsKCXByaW50ZigiXG4iKTsKCXBmLT5mb3VuZCsrOwp9CgpzdGF0aWMgaW50IHBy b2JlYWRkcl9jYWxsYmFjayhzdHJ1Y3QgZGllX2xpbmsgKmxpbmssIHZvaWQgKmRhdGEpCnsK CXN0cnVjdCBwcm9iZV9maW5kZXIgKnBmID0gKHN0cnVjdCBwcm9iZV9maW5kZXIgKilkYXRh OwoJRHdhcmZfSGFsZiB0YWc7CglEd2FyZl9TaWduZWQgb2ZmczsKCWludCByZXQ7CgoJcmV0 ID0gZHdhcmZfdGFnKGxpbmstPmRpZSwgJnRhZywgJnNlc3Npb24uZXJyKTsKCUVSUl9JRihy ZXQgPT0gRFdfRExWX0VSUk9SKTsKCWlmICh0YWcgPT0gRFdfVEFHX3N1YnByb2dyYW0gJiYK CSAgICBkaWVfd2l0aGluX3N1YnByb2dyYW0obGluay0+ZGllLCBwZi0+YWRkciwgJm9mZnMp KSB7CgkJc2hvd19wcm9iZXBvaW50KGxpbmstPmRpZSwgb2ZmcywgcGYpOwoJCXJldHVybiAx OwoJfQoJcmV0dXJuIDA7Cn0KCi8qIEZpbmQgcHJvYmUgcG9pbnQgZnJvbSBpdHMgbGluZSBu dW1iZXIgKi8Kc3RhdGljIHZvaWQgZmluZF9ieV9saW5lKER3YXJmX0RpZSBjdV9kaWUsIHN0 cnVjdCBwcm9iZV9maW5kZXIgKnBmKQp7CglEd2FyZl9TaWduZWQgY250LCBpOwoJRHdhcmZf TGluZSAqbGluZXM7CglEd2FyZl9VbnNpZ25lZCBsaW5lbm8gPSAwOwoJRHdhcmZfQWRkciBh ZGRyOwoJRHdhcmZfVW5zaWduZWQgZm5vOwoJaW50IHJldDsKCglyZXQgPSBkd2FyZl9zcmNs aW5lcyhjdV9kaWUsICZsaW5lcywgJmNudCwgJnNlc3Npb24uZXJyKTsKCUVSUl9JRihyZXQg IT0gRFdfRExWX09LKTsKCglmb3IgKGkgPSAwOyBpIDwgY250OyBpKyspIHsKCQlyZXQgPSBk d2FyZl9saW5lX3NyY2ZpbGVubyhsaW5lc1tpXSwgJmZubywgJnNlc3Npb24uZXJyKTsKCQlF UlJfSUYocmV0ICE9IERXX0RMVl9PSyk7CgkJaWYgKGZubyAhPSBwZi0+Zm5vKQoJCQljb250 aW51ZTsKCgkJcmV0ID0gZHdhcmZfbGluZW5vKGxpbmVzW2ldLCAmbGluZW5vLCAmc2Vzc2lv bi5lcnIpOwoJCUVSUl9JRihyZXQgIT0gRFdfRExWX09LKTsKCQlpZiAobGluZW5vICE9IHBm LT5saW5lKQoJCQljb250aW51ZTsKCgkJcmV0ID0gZHdhcmZfbGluZWFkZHIobGluZXNbaV0s ICZhZGRyLCAmc2Vzc2lvbi5lcnIpOwoJCUVSUl9JRihyZXQgIT0gRFdfRExWX09LKTsKCQlk ZWJ1ZygiUHJvYmUgcG9pbnQgZm91bmQ6IDB4JWxseFxuIiwgYWRkcik7CgkJcGYtPmFkZHIg PSBhZGRyOwoJCS8qIFNlYXJjaCBhIHJlYWwgc3VicHJvZ3JhbSBpbmNsdWRpbmcgdGhpcyBs aW5lLCAqLwoJCXJldCA9IHNlYXJjaF9kaWVfZnJvbV9jaGlsZHJlbihjdV9kaWUsIHByb2Jl YWRkcl9jYWxsYmFjaywgcGYpOwoJCWlmIChyZXQgPT0gMCkgewoJCQlmcHJpbnRmKHN0ZGVy ciwKCQkJCSJQcm9iZSBwb2ludCBpcyBub3QgZm91bmQgaW4gc3VicHJvZ3JhbXMuXG4iKTsK CQkJZXhpdCgxKTsKCQl9CgkJLyogQ29udGludWluZywgYmVjYXVzZSB0YXJnZXQgbGluZSBt aWdodCBiZSBpbmxpbmVkLiAqLwoJfQoJZHdhcmZfc3JjbGluZXNfZGVhbGxvYyhzZXNzaW9u LmRiZywgbGluZXMsIGNudCk7Cn0KCi8qIFNlYXJjaCBmdW5jdGlvbiBmcm9tIGZ1bmN0aW9u IG5hbWUgKi8Kc3RhdGljIGludCBwcm9iZWZ1bmNfY2FsbGJhY2soc3RydWN0IGRpZV9saW5r ICpsaW5rLCB2b2lkICpkYXRhKQp7CglzdHJ1Y3QgcHJvYmVfZmluZGVyICpwZiA9IChzdHJ1 Y3QgcHJvYmVfZmluZGVyICopZGF0YTsKCXN0cnVjdCBkaWVfbGluayAqbGs7CglEd2FyZl9T aWduZWQgb2ZmczsKCUR3YXJmX0hhbGYgdGFnOwoJaW50IHJldDsKCglyZXQgPSBkd2FyZl90 YWcobGluay0+ZGllLCAmdGFnLCAmc2Vzc2lvbi5lcnIpOwoJRVJSX0lGKHJldCA9PSBEV19E TFZfRVJST1IpOwoJaWYgKHRhZyA9PSBEV19UQUdfc3VicHJvZ3JhbSkgewoJCWlmIChkaWVf Y29tcGFyZV9uYW1lKGxpbmstPmRpZSwgcGYtPmZ1bmN0aW9uKSA9PSAwKSB7CgkJCWlmIChk aWVfaW5saW5lZF9zdWJwcm9ncmFtKGxpbmstPmRpZSkpIHsKCQkJCS8qIElubGluZWQgZnVu Y3Rpb24sIHNhdmUgaXQuICovCgkJCQlyZXQgPSBkd2FyZl9kaWVfQ1Vfb2Zmc2V0KGxpbmst PmRpZSwKCQkJCQkJCSAgJnBmLT5pbmxfb2ZmcywKCQkJCQkJCSAgJnNlc3Npb24uZXJyKTsK CQkJCUVSUl9JRihyZXQgIT0gRFdfRExWX09LKTsKCQkJCWRlYnVnKCJpbmxpbmUgZGVmaW5p dGlvbiBvZmZzZXQgJWxsZFxuIiwKCQkJCQlwZi0+aW5sX29mZnMpOwoJCQkJcmV0dXJuIDA7 CgkJCX0KCQkJZHdhcmZfbG93cGMobGluay0+ZGllLCAmcGYtPmFkZHIsICZzZXNzaW9uLmVy cik7CgkJCXBmLT5hZGRyICs9IHBmLT5vZmZzZXQ7CgkJCS8qIFRPRE86IENoZWNrIHRoZSBh ZGRyZXNzIGluIHRoaXMgZnVuY3Rpb24gKi8KCQkJc2hvd19wcm9iZXBvaW50KGxpbmstPmRp ZSwgcGYtPm9mZnNldCwgcGYpOwoJCQkvKiBDb250aW51ZSB0byBzZWFyY2ggKi8KCQl9Cgl9 IGVsc2UgaWYgKHRhZyA9PSBEV19UQUdfaW5saW5lZF9zdWJyb3V0aW5lICYmIHBmLT5pbmxf b2ZmcykgewoJCWlmIChkaWVfZ2V0X2Fic3RyYWN0X29yaWdpbihsaW5rLT5kaWUpID09IHBm LT5pbmxfb2ZmcykgewoJCQlwZi0+YWRkciA9IGRpZV9nZXRfZW50cnlwYyhsaW5rLT5kaWUp OwoJCQlwZi0+YWRkciArPSBwZi0+b2Zmc2V0OwoJCQlkZWJ1ZygiZm91bmQgaW5saW5lIGFk ZHI6IDB4JWxseFxuIiwgcGYtPmFkZHIpOwoJCQkvKiBJbmxpbmVkIGZ1bmN0aW9uLiBHZXQg YSByZWFsIHN1YnByb2dyYW0gKi8KCQkJZm9yIChsayA9IGxpbmstPnBhcmVudDsgbGsgIT0g TlVMTDsgbGsgPSBsay0+cGFyZW50KSB7CgkJCQl0YWcgPSAwOwoJCQkJZHdhcmZfdGFnKGxr LT5kaWUsICZ0YWcsICZzZXNzaW9uLmVycik7CgkJCQlFUlJfSUYocmV0ID09IERXX0RMVl9F UlJPUik7CgkJCQlpZiAodGFnID09IERXX1RBR19zdWJwcm9ncmFtICYmCgkJCQkgICAgIWRp ZV9pbmxpbmVkX3N1YnByb2dyYW0obGstPmRpZSkpCgkJCQkJZ290byBmb3VuZDsKCQkJfQoJ CQlmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBmaW5kIHJlYWwgc3VicHJvZ3JhbS5cbiIp OwoJCQlleGl0KDEpOwpmb3VuZDoKCQkJcmV0ID0gZGllX3dpdGhpbl9zdWJwcm9ncmFtKGxr LT5kaWUsIHBmLT5hZGRyLCAmb2Zmcyk7CgkJCUVSUl9JRighcmV0KTsKCQkJc2hvd19wcm9i ZXBvaW50KGxrLT5kaWUsIG9mZnMsIHBmKTsKCQkJLyogQ29udGludWUgdG8gc2VhcmNoICov CgkJfQoJfQoJcmV0dXJuIDA7Cn0KCnN0YXRpYyB2b2lkIGZpbmRfYnlfZnVuYyhEd2FyZl9E aWUgY3VfZGllLCBzdHJ1Y3QgcHJvYmVfZmluZGVyICpwZikKewoJc2VhcmNoX2RpZV9mcm9t X2NoaWxkcmVuKGN1X2RpZSwgcHJvYmVmdW5jX2NhbGxiYWNrLCBwZik7Cn0KCnN0YXRpYyB2 b2lkIGZpbmRfcHJvYmVwb2ludChzdHJ1Y3QgcHJvYmVfZmluZGVyICpwZikKewoJRHdhcmZf VW5zaWduZWQgY3VoX2xlbiA9IDA7CglEd2FyZl9IYWxmIHZzdGFtcCA9IDA7CglEd2FyZl9V bnNpZ25lZCBhYmJyZXYgPSAwOwoJRHdhcmZfSGFsZiBhZGRyX3NpemUgPSAwOwoJRHdhcmZf VW5zaWduZWQgbmV4dF9jdWggPSAwOwoJRHdhcmZfRGllIGN1X2RpZSA9IDA7CglpbnQgY3Vf bnVtYmVyID0gMCwgcmV0OwoKCXBmLT5mb3VuZCA9IDA7Cgl3aGlsZSAoKytjdV9udW1iZXIp IHsKCQkvKiBTZWFyY2ggQ1UgKENvbXBpbGF0aW9uIFVuaXQpICovCgkJcmV0ID0gZHdhcmZf bmV4dF9jdV9oZWFkZXIoc2Vzc2lvbi5kYmcsICZjdWhfbGVuLCAmdnN0YW1wLAoJCQkmYWJi cmV2LCAmYWRkcl9zaXplLCAmbmV4dF9jdWgsICZzZXNzaW9uLmVycik7CgkJRVJSX0lGKHJl dCA9PSBEV19ETFZfRVJST1IpOwogICAgICAgIAlpZiAocmV0ID09IERXX0RMVl9OT19FTlRS WSkKCQkJYnJlYWs7CgoJCS8qIEdldCB0aGUgRElFKERlYnVnZ2luZyBJbmZvcm1hdGlvbiBF bnRyeSkgb2YgdGhpcyBDVSAqLwoJCXJldCA9IGR3YXJmX3NpYmxpbmdvZihzZXNzaW9uLmRi ZywgMCwgJmN1X2RpZSwgJnNlc3Npb24uZXJyKTsKCQlFUlJfSUYocmV0ICE9IERXX0RMVl9P Syk7CgoJCS8qIENoZWNrIGlmIHRhcmdldCBmaWxlIGlzIGluY2x1ZGVkLiAqLwoJCWlmIChw Zi0+ZmlsZSkKCQkJcGYtPmZubyA9IGRpZV9nZXRfZmlsZW5vKGN1X2RpZSwgcGYtPmZpbGUp OwoKCQlpZiAoIXBmLT5maWxlIHx8IHBmLT5mbm8pIHsKCQkJLyogU2F2ZSBDVSBiYXNlIGFk ZHJlc3MgKGZvciBmcmFtZV9iYXNlKSAqLwoJCQlyZXQgPSBkd2FyZl9sb3dwYyhjdV9kaWUs ICZwZi0+Y3VfYmFzZSwgJnNlc3Npb24uZXJyKTsKCQkJRVJSX0lGKHJldCA9PSBEV19ETFZf RVJST1IpOwoJCQlpZiAocmV0ID09IERXX0RMVl9OT19FTlRSWSkKCQkJCXBmLT5jdV9iYXNl ID0gMDsKCQkJaWYgKHBmLT5saW5lKQoJCQkJZmluZF9ieV9saW5lKGN1X2RpZSwgcGYpOwoJ CQlpZiAocGYtPmZ1bmN0aW9uKQoJCQkJZmluZF9ieV9mdW5jKGN1X2RpZSwgcGYpOwoJCX0K CQlkd2FyZl9kZWFsbG9jKHNlc3Npb24uZGJnLCBjdV9kaWUsIERXX0RMQV9ESUUpOwoJfQoJ aWYgKHBmLT5mb3VuZCA9PSAwKSB7CgkJZnByaW50ZihzdGRlcnIsICJQcm9iZSBwb2ludCBp cyBub3QgZm91bmQuXG4iKTsKCQlleGl0KDEpOwoJfQp9Cgo= --------------040903020306080407020700-- From mboxrd@z Thu Jan 1 00:00:00 1970 From: Masami Hiramatsu Subject: [TOOL] c2kpe: C expression to kprobe event format converter Date: Thu, 13 Aug 2009 16:59:19 -0400 Message-ID: <4A847EA7.20307@redhat.com> References: <20090813203403.31965.20973.stgit@localhost.localdomain> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------040903020306080407020700" Cc: Ananth N Mavinakayanahalli , Avi Kivity , Andi Kleen , Christoph Hellwig , "Frank Ch. Eigler" , Frederic Weisbecker , "H. Peter Anvin" , Jason Baron , Jim Keniston , "K.Prasad" , Lai Jiangshan , Li Zefan , =?UTF-8?B?UHJ6ZW15c8WCYXdQYXdlxYJjenlr?= , Roland McGrath , Sam Ravnborg , Srikar Dronamraju , Tom Zanussi , Vegard Nossum , systemtap , kvm , DLE To: Ingo Molnar , Steven Rostedt , lkml Return-path: In-Reply-To: <20090813203403.31965.20973.stgit@localhost.localdomain> List-Unsubscribe: List-Subscribe: List-Post: List-Help: , Sender: systemtap-owner@sourceware.org List-Id: kvm.vger.kernel.org This is a multi-part message in MIME format. --------------040903020306080407020700 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit This program converts probe point in C expression to kprobe event format for kprobe-based event tracer. This helps to define kprobes events by C source line number or function name, and local variable name. Currently, this supports only x86(32/64) kernels. Compile -------- Before compilation, please install libelf and libdwarf development packages. (e.g. elfutils-libelf-devel and libdwarf-devel on Fedora) $ gcc -Wall -lelf -ldwarf c2kpe.c -o c2kpe Synopsis -------- $ c2kpe [options] FUNCTION[+OFFS][@SRC] [VAR [VAR ...]] or $ c2kpe [options] @SRC:LINE [VAR [VAR ...]] FUNCTION: Probing function name. OFFS: Offset in bytes. SRC: Source file path. LINE: Line number VAR: Local variable name. options: -r KREL Kernel release version (e.g. 2.6.31-rc5) -m DEBUGINFO Dwarf-format binary file (vmlinux or kmodule) Example ------- $ c2kpe sys_read fd buf count sys_read+0 %di %si %dx $ c2kpe @mm/filemap.c:339 inode pos sync_page_range+125 -48(%bp) %r14 Example with kprobe-tracer -------------------------- Since C expression may be converted multiple results, I recommend to use readline. $ c2kpe sys_read fd buf count | while read i; do \ echo "p $i" > $DEBUGFS/tracing/kprobe_events ;\ done Note ---- - This requires a kernel compiled with CONFIG_DEBUG_INFO. - Specifying @SRC speeds up c2kpe, because we can skip CUs which don't include specified SRC file. - c2kpe doesn't check whether the offset byte is correctly on the instruction boundary. I recommend you to use @SRC:LINE expression for tracing function body. - This tool doesn't search kmodule file. You need to specify kmodule file if you want to probe it. TODO ---- - Fix bugs. - Support multiple probepoints from stdin. - Better kmodule support. - Use elfutils-libdw? - Merge into trace-cmd or perf-tools? -- Masami Hiramatsu Software Engineer Hitachi Computer Products (America), Inc. Software Solutions Division e-mail: mhiramat@redhat.com --------------040903020306080407020700 Content-Type: text/plain; name="c2kpe.c" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="c2kpe.c" LyoKICogYzJrcGUgOiBDIGV4cHJlc3Npb24gdG8ga3Byb2JlIGV2ZW50IGNv bnZlcnRlcgogKgogKiBXcml0dGVuIGJ5IE1hc2FtaSBIaXJhbWF0c3UgPG1o aXJhbWF0QHJlZGhhdC5jb20+CiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVl IHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9k aWZ5CiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwg UHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAqIHRoZSBGcmVlIFNv ZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExp Y2Vuc2UsIG9yCiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNp b24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUg aG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBB TlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50 eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJU SUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1Ymxp YyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQg aGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1Ymxp YyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3Qs IHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIElu Yy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAw MjExMS0xMzA3LCBVU0EuCiAqCiAqLwoKI2luY2x1ZGUgPHN5cy91dHNuYW1l Lmg+CiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2luY2x1ZGUgPHN5cy9zdGF0 Lmg+CiNpbmNsdWRlIDxmY250bC5oPgojaW5jbHVkZSA8ZXJybm8uaD4KI2lu Y2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDx1bmlzdGQuaD4KI2luY2x1ZGUg PGdldG9wdC5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzdHJp bmcuaD4KI2luY2x1ZGUgPGxpYmR3YXJmL2R3YXJmLmg+CiNpbmNsdWRlIDxs aWJkd2FyZi9saWJkd2FyZi5oPgoKLyogRGVmYXVsdCB2bWxpbnV4IHNlYXJj aCBwYXRocyAqLwojZGVmaW5lIE5SX1NFQVJDSF9QQVRIIDIKY29uc3QgY2hh ciAqZGVmYXVsdF9zZWFyY2hfcGF0aFtOUl9TRUFSQ0hfUEFUSF0gPSB7CiIv bGliL21vZHVsZXMvJXMvYnVpbGQvdm1saW51eCIsCQkvKiBDdXN0b20gYnVp bGQga2VybmVsICovCiIvdXNyL2xpYi9kZWJ1Zy9saWIvbW9kdWxlcy8lcy92 bWxpbnV4IiwJLyogUmVkIEhhdCBkZWJ1Z2luZm8gKi8KfTsKCiNkZWZpbmUg X3N0cmluZ2lmeShuKQkjbgojZGVmaW5lIHN0cmluZ2lmeShuKQlfc3RyaW5n aWZ5KG4pCgojaWZkZWYgREVCVUcKI2RlZmluZSBkZWJ1ZyhmbXQgLi4uKQlc CglmcHJpbnRmKHN0ZGVyciwgIkRCRygiIF9fRklMRV9fICI6IiBzdHJpbmdp ZnkoX19MSU5FX18pICIpOiAiIGZtdCkKI2Vsc2UKI2RlZmluZSBkZWJ1Zyhm bXQgLi4uKQlkbyB7fSB3aGlsZSAoMCkKI2VuZGlmCgojZGVmaW5lIEVSUl9J RihjbmQpCVwKCWRvIHsgaWYgKGNuZCkgewlcCgkJZnByaW50ZihzdGRlcnIs ICJFcnJvciAoIiBfX0ZJTEVfXyAiOiIgc3RyaW5naWZ5KF9fTElORV9fKSBc CgkJCSIpOiAiIHN0cmluZ2lmeShjbmQpICJcbiIpOwkJCQlcCgkJZXhpdCgx KTsJCQkJCQlcCgl9fSB3aGlsZSAoMCkKCiNkZWZpbmUgTUFYX1BBVEhfTEVO IDI1NgoKLyogRHdhcmZfRGllIExpbmthZ2UgdG8gcGFyZW50IERpZSAqLwpz dHJ1Y3QgZGllX2xpbmsgewoJc3RydWN0IGRpZV9saW5rICpwYXJlbnQ7CS8q IFBhcmVudCBkaWUgKi8KCUR3YXJmX0RpZSBkaWU7CQkJLyogQ3VycmVudCBk aWUgKi8KfTsKCiNkZWZpbmUgWDg2XzMyX01BWF9SRUdTIDgKY29uc3QgY2hh ciAqeDg2XzMyX3JlZ3NfdGFibGVbWDg2XzMyX01BWF9SRUdTXSA9IHsKCSIl YXgiLAoJIiVjeCIsCgkiJWR4IiwKCSIlYngiLAoJInNhIiwJLyogU3RhY2sg YWRkcmVzcyAqLwoJIiVicCIsCgkiJXNpIiwKCSIlZGkiLAp9OwoKI2RlZmlu ZSBYODZfNjRfTUFYX1JFR1MgMTYKY29uc3QgY2hhciAqeDg2XzY0X3JlZ3Nf dGFibGVbWDg2XzY0X01BWF9SRUdTXSA9IHsKCSIlYXgiLAoJIiVkeCIsCgki JWN4IiwKCSIlYngiLAoJIiVzaSIsCgkiJWRpIiwKCSIlYnAiLAoJIiVzcCIs CgkiJXI4IiwKCSIlcjkiLAoJIiVyMTAiLAoJIiVyMTEiLAoJIiVyMTIiLAoJ IiVyMTMiLAoJIiVyMTQiLAoJIiVyMTUiLAp9OwoKLyogVE9ETzogc3dpdGNo aW5nIGJ5IGR3YXJmIGFkZHJlc3Mgc2l6ZSAqLwojaWZkZWYgX194ODZfNjRf XwojZGVmaW5lIEFSQ0hfTUFYX1JFR1MgWDg2XzY0X01BWF9SRUdTCiNkZWZp bmUgYXJjaF9yZWdzX3RhYmxlIHg4Nl82NF9yZWdzX3RhYmxlCiNlbHNlCiNk ZWZpbmUgQVJDSF9NQVhfUkVHUyBYODZfMzJfTUFYX1JFR1MKI2RlZmluZSBh cmNoX3JlZ3NfdGFibGUgeDg2XzMyX3JlZ3NfdGFibGUKI2VuZGlmCgovKiBS ZXR1cm4gYXJjaGl0ZWN0dXJlIGRlcGVuZGVudCByZWdpc3RlciBzdHJpbmcg Ki8Kc3RhdGljIGlubGluZSBjb25zdCBjaGFyICpnZXRfYXJjaF9yZWdzdHIo dW5zaWduZWQgaW50IG4pCnsKCXJldHVybiAobiA8PSBBUkNIX01BWF9SRUdT KSA/IGFyY2hfcmVnc190YWJsZVtuXSA6IE5VTEw7Cn0KCnN0cnVjdCBwcm9i ZV9maW5kZXIgewoJLyogSW5wdXRzICovCgljaGFyICpmaWxlOwkvKiBGaWxl IG5hbWUgKi8KCWludCBsaW5lOwkvKiBMaW5lIG51bWJlciAqLwoKCWNoYXIg KmZ1bmN0aW9uOwkvKiBGdW5jdGlvbiBuYW1lICovCglpbnQgb2Zmc2V0Owkv KiBPZmZzZXQgYnl0ZXMgKi8KCglEd2FyZl9BZGRyIGFkZHI7CS8qIEFkZHJl c3MgKi8KCglpbnQgbnJfYXJnczsJLyogTnVtYmVyIG9mIGFyZ3VtZW50cyAq LwoJY2hhciAqKmFyZ3M7CS8qIEFyZ3VtZW50cyAqLwoKCS8qIFdvcmtpbmcg YXJlYSAqLwoJRHdhcmZfQWRkciBjdV9iYXNlOwkvKiBDdXJyZW50IENVIGJh c2UgYWRkcmVzcyAqLwoJRHdhcmZfTG9jZGVzYyBmYmxvYzsJLyogTG9jYXRp b24gb2YgQ3VycmVudCBGcmFtZSBCYXNlICovCglEd2FyZl9VbnNpZ25lZCBm bm87CS8qIEZpbGUgbnVtYmVyICovCglEd2FyZl9PZmYgaW5sX29mZnM7CS8q IElubGluZSBvZmZzZXQgKi8KCWNvbnN0IGNoYXIgKnZhcjsJLyogQ3VycmVu dCB2YXJpYWJsZSBuYW1lICovCgoJLyogT3V0cHV0ICovCglpbnQgZm91bmQ7 CS8qIE51bWJlciBvZiBmb3VuZCBwcm9iZSBwb2ludHMgKi8KfTsKCi8qIEZp bmQgYSBwcm9iZSBwb2ludCAqLwpzdGF0aWMgdm9pZCBmaW5kX3Byb2JlcG9p bnQoc3RydWN0IHByb2JlX2ZpbmRlciAqcGYpOwoKLyogU2Vzc2lvbiBtYW5h Z2VtZW50IHN0cnVjdHVyZSAqLwpzdGF0aWMgc3RydWN0IHsKCWNoYXIgKmt2 ZXI7CgljaGFyICptb2RwYXRoOwoJaW50IG1heHByb2JlOwoKCXN0cnVjdCBw cm9iZV9maW5kZXIgZmluZGVyOwoKCUR3YXJmX0RlYnVnIGRiZzsKCUR3YXJm X0Vycm9yIGVycjsKCWludCBuZm91bmQ7Cn0gc2Vzc2lvbjsKCgpzdGF0aWMg dm9pZCB1c2FnZShjb25zdCBjaGFyICptc2cpCnsKCWlmIChtc2cpCgkJcHJp bnRmKCIlc1xuXG4iLCBtc2cpOwoJcHJpbnRmKCJjMmtwZTogQyBleHByZXNz aW9uIHRvIGtwcm9iZSBldmVudCBjb252ZXJ0ZXJcbiIpOwoJcHJpbnRmKCJV c2FnZTogYzJrcGUgWy1yIEtSRUxdIFstbSBtb2R8dm1saW51eF0gRlVOQ3xT UkMgW0FSRy4uLl1cbiIpOwoJcHJpbnRmKCIgRlVOQzpcdEZVTkNOQU1FWytP RkZTX0JZVEVdW0BTUkNQQVRIXVxuIik7CglwcmludGYoIiBTUkM6XHRAU1JD UEFUSDpMSU5FXG4iKTsKCXByaW50ZigiIEFSRzpcdExvY2FsIHZhcmlhYmxl IG5hbWVcbiIpOwoJLyogVE9ETzogQGdsb2JhbCwgJHZhcnMsICRwYXJhbXMg Ki8KCWV4aXQoMCk7Cn0KCnN0YXRpYyB2b2lkIHNlbWFudGljX2Vycm9yKGNv bnN0IGNoYXIgKm1zZykKewoJZnByaW50ZihzdGRlcnIsICJTZW1hbnRpYyBl cnJvcjogJXNcbiIsIG1zZyk7CglleGl0KDEpOwp9CgpzdGF0aWMgdm9pZCBw YXJzZV9wcm9iZV9wb2ludChpbnQgYXJnYywgY2hhciAqYXJndltdLCBzdHJ1 Y3QgcHJvYmVfZmluZGVyICpwZikKewoJY2hhciAqYXJnOwoJY2hhciAqcHRy OwoKCWFyZyA9IGFyZ3ZbMF07CgoJaWYgKGFyZ1swXSA9PSAnQCcpIHsKCQkv KiBTb3VyY2UgTGluZSAqLwoJCWFyZysrOwoJCXB0ciA9IHN0cmNocihhcmcs ICc6Jyk7CgkJaWYgKCFwdHIgfHwgcHRyWzFdID09ICdcMCcpCgkJCXNlbWFu dGljX2Vycm9yKCJMaW5lIG51bWJlciBpcyByZXF1aXJlZC4iKTsKCQkqcHRy KysgPSAnXDAnOwoJCXBmLT5maWxlID0gYXJnOwoJCWlmIChzdHJsZW4oYXJn KSA9PSAwKQoJCQlzZW1hbnRpY19lcnJvcigiTm8gZmlsZSBuYW1lLiIpOwoJ CXBmLT5saW5lID0gYXRvaShwdHIpOwoJCWRlYnVnKCJmaWxlOiVzIGxpbmU6 JWRcbiIsIHBmLT5maWxlLCBwZi0+bGluZSk7Cgl9IGVsc2UgewoJCS8qIEZ1 bmN0aW9uIG5hbWUgKi8KCQlwZi0+ZnVuY3Rpb24gPSBhcmc7CgkJcHRyID0g c3RyY2hyKGFyZywgJysnKTsKCQlpZiAocHRyKSB7CgkJCWlmIChwdHJbMV0g PT0gJ1wwJyB8fCBwdHJbMV0gPT0gJ0AnKQoJCQkJc2VtYW50aWNfZXJyb3Io Ik9mZnNldCBpcyByZXF1aXJlZC4iKTsKCQkJKnB0cisrID0gJ1wwJzsKCQkJ cGYtPm9mZnNldCA9IGF0b2kocHRyKTsKCQkJYXJnID0gcHRyOwoJCX0KCQlw dHIgPSBzdHJjaHIoYXJnLCAnQCcpOwoJCWlmIChwdHIpIHsKCQkJKnB0cisr ID0gJ1wwJzsKCQkJcGYtPmZpbGUgPSBwdHI7CgkJfQoJCWRlYnVnKCJmbmFt ZTolcyBmaWxlOiVzIG9mZnNldDolZFxuIiwKCQkgICAgICBwZi0+ZnVuY3Rp b24sIHBmLT5maWxlLCBwZi0+b2Zmc2V0KTsKCX0KCglwZi0+bnJfYXJncyA9 IGFyZ2MgLSAxOwoJaWYgKHBmLT5ucl9hcmdzID4gMCkKCQlwZi0+YXJncyA9 ICZhcmd2WzFdOwoJZGVidWcoIiVkIGFyZ3VtZW50c1xuIiwgcGYtPm5yX2Fy Z3MpOwp9CgpzdGF0aWMgdm9pZCBwYXJzZV9hcmdzKGludCBhcmdjLCBjaGFy ICphcmd2W10pCnsKCWludCBvcHQ7CglpZiAoYXJnYyA8IDEpCgkJdXNhZ2Uo Ik5lZWQgYSBwcm9iZSBwb2ludC4iKTsKCgl3aGlsZSAoKG9wdCA9IGdldG9w dChhcmdjLCBhcmd2LCAicjptOm46IikpICE9IC0xKSB7CgkJc3dpdGNoIChv cHQpIHsKCQljYXNlICdyJzoKCQkJc2Vzc2lvbi5rdmVyID0gb3B0YXJnOwoJ CQlicmVhazsKCQljYXNlICdtJzoKCQkJc2Vzc2lvbi5tb2RwYXRoID0gb3B0 YXJnOwoJCQlicmVhazsKCQljYXNlICduJzoKCQkJc2Vzc2lvbi5tYXhwcm9i ZSA9IGF0b2kob3B0YXJnKTsKCQkJYnJlYWs7CgkJZGVmYXVsdDoKCQkJdXNh Z2UoIlVuZXhwZWN0ZWQgb3B0aW9uIGZvdW5kLiIpOwoJCX0KCX0KCWlmIChv cHRpbmQgPj0gYXJnYykKCQl1c2FnZSgiTmVlZCBhIHByb2JlIHBvaW50LiIp OwoKCXBhcnNlX3Byb2JlX3BvaW50KGFyZ2MgLSBvcHRpbmQsICZhcmd2W29w dGluZF0sICZzZXNzaW9uLmZpbmRlcik7Cn0KCnN0YXRpYyBpbnQgb3Blbl9k ZWZhdWx0X3ZtbGludXgoY29uc3QgY2hhciAqa3ZlcikKewoJc3RydWN0IHV0 c25hbWUgdXRzOwoJY2hhciBmbmFtZVtNQVhfUEFUSF9MRU5dOwoJaW50IGZk LCByZXQsIGk7CgoJaWYgKCFrdmVyKSB7CgkJcmV0ID0gdW5hbWUoJnV0cyk7 CgkJaWYgKHJldCkgewoJCQlkZWJ1ZygidW5hbWUoKSBmYWlsZWQuXG4iKTsK CQkJcmV0dXJuIC1lcnJubzsKCQl9CgkJa3ZlciA9IHV0cy5yZWxlYXNlOwoJ fQoJZm9yIChpID0gMDsgaSA8IE5SX1NFQVJDSF9QQVRIOyBpKyspIHsKCQly ZXQgPSBzbnByaW50ZihmbmFtZSwgTUFYX1BBVEhfTEVOLAoJCQkgICAgICAg ZGVmYXVsdF9zZWFyY2hfcGF0aFtpXSwga3Zlcik7CgkJaWYgKHJldCA+PSBN QVhfUEFUSF9MRU4gfHwgcmV0IDwgMCkgewoJCQlkZWJ1ZygiRmlsZW5hbWUo JWQsJXMpIGlzIHRvbyBsb25nLlxuIiwgaSwgdXRzLnJlbGVhc2UpOwoJCQll cnJubyA9IEUyQklHOwoJCQlyZXR1cm4gLUUyQklHOwoJCX0KCQlkZWJ1Zygi dHJ5IHRvIG9wZW4gJXNcbiIsIGZuYW1lKTsKCQlmZCA9IG9wZW4oZm5hbWUs IE9fUkRPTkxZKTsKCQlpZiAoZmQgPj0gMCkKCQkJYnJlYWs7Cgl9CglyZXR1 cm4gZmQ7Cn0KCmludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCnsK CWludCBmZCwgcmV0OwoKCXBhcnNlX2FyZ3MoYXJnYywgYXJndik7CgoJaWYg KHNlc3Npb24ubW9kcGF0aCkKCQlmZCA9IG9wZW4oc2Vzc2lvbi5tb2RwYXRo LCBPX1JET05MWSk7CgllbHNlCgkJZmQgPSBvcGVuX2RlZmF1bHRfdm1saW51 eChzZXNzaW9uLmt2ZXIpOwoJaWYgKGZkIDwgMCkgewoJCXBlcnJvcigiZmls ZSBvcGVuIik7CgkJZXhpdCgxKTsKCX0KCgkvKiBUT0RPOiBoYW5kbGUgZXJy b3JzICovCglyZXQgPSBkd2FyZl9pbml0KGZkLCBEV19ETENfUkVBRCwgMCwg MCwgJnNlc3Npb24uZGJnLCAmc2Vzc2lvbi5lcnIpOwoJaWYgKHJldCAhPSBE V19ETFZfT0spIHsKCQlmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBjYWxs IGR3YXJmX2luaXQoKS4gIgoJCQkiTWF5YmUsIG5vdCBhIGR3YXJmIGZpbGU/ XG4iKTsKCQlleGl0KDEpOwoJfQoKCWZpbmRfcHJvYmVwb2ludCgmc2Vzc2lv bi5maW5kZXIpOwoKCXJldCA9IGR3YXJmX2ZpbmlzaChzZXNzaW9uLmRiZywg JnNlc3Npb24uZXJyKTsKCUVSUl9JRihyZXQgIT0gRFdfRExWX09LKTsKCglj bG9zZShmZCk7CglyZXR1cm4gMDsKfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0t LS0KICogRHdhcmYgQW5hbHlzeXMgUGFydAogKi0tLS0tLS0tLS0tLS0tLS0t LS0tLSovCgovKgogKiBDb21wYXJlIHRoZSB0YWlsIG9mIHR3byBzdHJpbmdz LgogKiBSZXR1cm4gMCBpZiB3aG9sZSBvZiBlaXRoZXIgc3RyaW5nIGlzIHNh bWUgYXMgYW5vdGhlcidzIHRhaWwgcGFydC4KICovCnN0YXRpYyBpbnQgc3Ry dGFpbGNtcChjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIpCnsKCWlu dCBpMSA9IHN0cmxlbihzMSk7CglpbnQgaTIgPSBzdHJsZW4oczIpOwoJd2hp bGUgKC0taTEgPiAwICYmIC0taTIgPiAwKSB7CgkJaWYgKHMxW2kxXSAhPSBz MltpMl0pCgkJCXJldHVybiBzMVtpMV0gLSBzMltpMl07Cgl9CglyZXR1cm4g MDsKfQoKLyogRmluZCB0aGUgZmlsZW5vIG9mIHRoZSB0YXJnZXQgZmlsZS4g Ki8Kc3RhdGljIER3YXJmX1Vuc2lnbmVkIGRpZV9nZXRfZmlsZW5vKER3YXJm X0RpZSBjdV9kaWUsIGNvbnN0IGNoYXIgKmZuYW1lKQp7CglEd2FyZl9TaWdu ZWQgY250LCBpOwoJRHdhcmZfVW5zaWduZWQgZm91bmQgPSAwOwoJY2hhciAq KnNyY3M7CglpbnQgcmV0OwoKCWlmICghZm5hbWUpCgkJcmV0dXJuIDA7CgoJ cmV0ID0gZHdhcmZfc3JjZmlsZXMoY3VfZGllLCAmc3JjcywgJmNudCwgJnNl c3Npb24uZXJyKTsKCWlmIChyZXQgPT0gRFdfRExWX09LKSB7CgkJZm9yIChp ID0gMDsgaSA8IGNudCAmJiAhZm91bmQ7IGkrKykgewoJCQlpZiAoc3RydGFp bGNtcChzcmNzW2ldLCBmbmFtZSkgPT0gMCkKCQkJCWZvdW5kID0gaSArIDE7 CgkJCWR3YXJmX2RlYWxsb2Moc2Vzc2lvbi5kYmcsIHNyY3NbaV0sIERXX0RM QV9TVFJJTkcpOwoJCX0KCQlmb3IgKDtpIDwgY250OyBpKyspCgkJCWR3YXJm X2RlYWxsb2Moc2Vzc2lvbi5kYmcsIHNyY3NbaV0sIERXX0RMQV9TVFJJTkcp OwoJCWR3YXJmX2RlYWxsb2Moc2Vzc2lvbi5kYmcsIHNyY3MsIERXX0RMQV9M SVNUKTsKCX0KCWlmIChmb3VuZCkgZGVidWcoImZvdW5kIGZubzogJWRcbiIs IChpbnQpZm91bmQpOwoJcmV0dXJuIGZvdW5kOwp9CgovKiBDb21wYXJlIGRp ZW5hbWUgYW5kIHRuYW1lICovCnN0YXRpYyBpbnQgZGllX2NvbXBhcmVfbmFt ZShEd2FyZl9EaWUgZGllLCBjb25zdCBjaGFyICp0bmFtZSkKewoJY2hhciAq bmFtZTsKCWludCByZXQ7CglyZXQgPSBkd2FyZl9kaWVuYW1lKGRpZSwgJm5h bWUsICZzZXNzaW9uLmVycik7CglFUlJfSUYocmV0ID09IERXX0RMVl9FUlJP Uik7CglpZiAocmV0ID09IERXX0RMVl9PSykgewoJCS8vZGVidWcoImRpZW5h bWU6ICVzXG4iLCBuYW1lKTsKCQlyZXQgPSBzdHJjbXAodG5hbWUsIG5hbWUp OwoJCWR3YXJmX2RlYWxsb2Moc2Vzc2lvbi5kYmcsIG5hbWUsIERXX0RMQV9T VFJJTkcpOwoJfSBlbHNlCgkJcmV0ID0gLTE7CglyZXR1cm4gcmV0Owp9Cgov KiBDaGVjayB0aGUgYWRkcmVzcyBpcyBpbiB0aGUgc3VicHJvZ3JhbShmdW5j dGlvbikuICovCnN0YXRpYyBpbnQgZGllX3dpdGhpbl9zdWJwcm9ncmFtKER3 YXJmX0RpZSBzcF9kaWUsIER3YXJmX0FkZHIgYWRkciwKCQkJCSBEd2FyZl9T aWduZWQgKm9mZnMpCnsKCUR3YXJmX0FkZHIgbG9wYywgaGlwYzsKCWludCBy ZXQ7CgoJcmV0ID0gZHdhcmZfbG93cGMoc3BfZGllLCAmbG9wYywgJnNlc3Np b24uZXJyKTsKCUVSUl9JRihyZXQgPT0gRFdfRExWX0VSUk9SKTsKCWlmIChy ZXQgPT0gRFdfRExWX05PX0VOVFJZKQoJCXJldHVybiAwOwoJcmV0ID0gZHdh cmZfaGlnaHBjKHNwX2RpZSwgJmhpcGMsICZzZXNzaW9uLmVycik7CglFUlJf SUYocmV0ICE9IERXX0RMVl9PSyk7CglpZiAobG9wYyA8PSBhZGRyICYmIGFk ZHIgPCBoaXBjKSB7CgkJKm9mZnMgPSBhZGRyIC0gbG9wYzsKCQlyZXR1cm4g MTsKCX0gZWxzZQoJCXJldHVybiAwOwp9CgovKiBDaGVjayB0aGUgZGllIGlz IGlubGluZWQgZnVuY3Rpb24gKi8Kc3RhdGljIER3YXJmX0Jvb2wgZGllX2lu bGluZWRfc3VicHJvZ3JhbShEd2FyZl9EaWUgZGllKQp7CgkvKiBUT0RPOiBj aGVjayBzdHJpY3RseSAqLwoJRHdhcmZfQm9vbCBpbmw7CglpbnQgcmV0OwoK CXJldCA9IGR3YXJmX2hhc2F0dHIoZGllLCBEV19BVF9pbmxpbmUsICZpbmws ICZzZXNzaW9uLmVycik7CglFUlJfSUYocmV0ID09IERXX0RMVl9FUlJPUik7 CglyZXR1cm4gaW5sOwp9CgovKiBHZXQgdGhlIG9mZnNldCBvZiBhYnN0cnVj dF9vcmlnaW4gKi8Kc3RhdGljIER3YXJmX09mZiBkaWVfZ2V0X2Fic3RyYWN0 X29yaWdpbihEd2FyZl9EaWUgZGllKQp7CglEd2FyZl9BdHRyaWJ1dGUgYXR0 cjsKCUR3YXJmX09mZiBjdV9vZmZzOwoJaW50IHJldDsKCglyZXQgPSBkd2Fy Zl9hdHRyKGRpZSwgRFdfQVRfYWJzdHJhY3Rfb3JpZ2luLCAmYXR0ciwgJnNl c3Npb24uZXJyKTsKCUVSUl9JRihyZXQgIT0gRFdfRExWX09LKTsKCXJldCA9 IGR3YXJmX2Zvcm1yZWYoYXR0ciwgJmN1X29mZnMsICZzZXNzaW9uLmVycik7 CglFUlJfSUYocmV0ICE9IERXX0RMVl9PSyk7Cglkd2FyZl9kZWFsbG9jKHNl c3Npb24uZGJnLCBhdHRyLCBEV19ETEFfQVRUUik7CglyZXR1cm4gY3Vfb2Zm czsKfQoKLyogR2V0IGVudHJ5IHBjKG9yIGxvdyBwYywgMXN0IGVudHJ5IG9m IHJhbmdlcykgIG9mIHRoZSBkaWUgKi8Kc3RhdGljIER3YXJmX0FkZHIgZGll X2dldF9lbnRyeXBjKER3YXJmX0RpZSBkaWUpCnsKCUR3YXJmX0F0dHJpYnV0 ZSBhdHRyOwoJRHdhcmZfQWRkciBhZGRyOwoJRHdhcmZfT2ZmIG9mZnM7CglE d2FyZl9SYW5nZXMgKnJhbmdlczsKCUR3YXJmX1NpZ25lZCBjbnQ7CglpbnQg cmV0OwoKCS8qIFRyeSB0byBnZXQgZW50cnkgcGMgKi8KCXJldCA9IGR3YXJm X2F0dHIoZGllLCBEV19BVF9lbnRyeV9wYywgJmF0dHIsICZzZXNzaW9uLmVy cik7CglFUlJfSUYocmV0ID09IERXX0RMVl9FUlJPUik7CglpZiAocmV0ID09 IERXX0RMVl9PSykgewoJCXJldCA9IGR3YXJmX2Zvcm1hZGRyKGF0dHIsICZh ZGRyLCAmc2Vzc2lvbi5lcnIpOwoJCUVSUl9JRihyZXQgIT0gRFdfRExWX09L KTsKCQlkd2FyZl9kZWFsbG9jKHNlc3Npb24uZGJnLCBhdHRyLCBEV19ETEFf QVRUUik7CgkJcmV0dXJuIGFkZHI7Cgl9CgoJLyogVHJ5IHRvIGdldCBsb3cg cGMgKi8KCXJldCA9IGR3YXJmX2xvd3BjKGRpZSwgJmFkZHIsICZzZXNzaW9u LmVycik7CglFUlJfSUYocmV0ID09IERXX0RMVl9FUlJPUik7CglpZiAocmV0 ID09IERXX0RMVl9PSykKCQlyZXR1cm4gYWRkcjsKCgkvKiBUcnkgdG8gZ2V0 IHJhbmdlcyAqLwoJcmV0ID0gZHdhcmZfYXR0cihkaWUsIERXX0FUX3Jhbmdl cywgJmF0dHIsICZzZXNzaW9uLmVycik7CglFUlJfSUYocmV0ICE9IERXX0RM Vl9PSyk7CglyZXQgPSBkd2FyZl9mb3JtcmVmKGF0dHIsICZvZmZzLCAmc2Vz c2lvbi5lcnIpOwoJRVJSX0lGKHJldCAhPSBEV19ETFZfT0spOwoJcmV0ID0g ZHdhcmZfZ2V0X3JhbmdlcyhzZXNzaW9uLmRiZywgb2ZmcywgJnJhbmdlcywg JmNudCwgTlVMTCwKCQkJCSZzZXNzaW9uLmVycik7CglFUlJfSUYocmV0ICE9 IERXX0RMVl9PSyk7CglhZGRyID0gcmFuZ2VzWzBdLmR3cl9hZGRyMTsKCWR3 YXJmX3Jhbmdlc19kZWFsbG9jKHNlc3Npb24uZGJnLCByYW5nZXMsIGNudCk7 CglyZXR1cm4gYWRkcjsKfQoKLyoKICogU2VhcmNoIGEgRGllIGZyb20gRGll IHRyZWUuCiAqIE5vdGU6IGN1cl9saW5rLT5kaWUgc2hvdWxkIGJlIGRlYWxs b2NhdGVkIGluIHRoaXMgZnVuY3Rpb24uCiAqLwpzdGF0aWMgaW50IF9fc2Vh cmNoX2RpZV90cmVlKHN0cnVjdCBkaWVfbGluayAqY3VyX2xpbmssCgkJCSAg ICAgaW50ICgqZGllX2NiKShzdHJ1Y3QgZGllX2xpbmsgKiwgdm9pZCAqKSwK CQkJICAgICB2b2lkICpkYXRhKQp7CglEd2FyZl9EaWUgbmV3X2RpZTsKCXN0 cnVjdCBkaWVfbGluayBsaW5rOwoJaW50IHJldDsKCglpZiAoIWRpZV9jYikK CQlyZXR1cm4gMDsKCgkvKiBDaGVjayBjdXJyZW50IGRpZSAqLwoJd2hpbGUg KCEocmV0ID0gZGllX2NiKGN1cl9saW5rLCBkYXRhKSkpIHsKCQkvKiBDaGVj ayBjaGlsZCBkaWUgKi8KCQlyZXQgPSBkd2FyZl9jaGlsZChjdXJfbGluay0+ ZGllLCAmbmV3X2RpZSwgJnNlc3Npb24uZXJyKTsKCQlFUlJfSUYocmV0ID09 IERXX0RMVl9FUlJPUik7CgkJaWYgKHJldCA9PSBEV19ETFZfT0spIHsKCQkJ bGluay5wYXJlbnQgPSBjdXJfbGluazsKCQkJbGluay5kaWUgPSBuZXdfZGll OwoJCQlyZXQgPSBfX3NlYXJjaF9kaWVfdHJlZSgmbGluaywgZGllX2NiLCBk YXRhKTsKCQkJaWYgKHJldCkKCQkJCWJyZWFrOwoJCX0KCgkJLyogTW92ZSB0 byBuZXh0IHNpYmxpbmcgKi8KCQlyZXQgPSBkd2FyZl9zaWJsaW5nb2Yoc2Vz c2lvbi5kYmcsIGN1cl9saW5rLT5kaWUsICZuZXdfZGllLAoJCQkJICAgICAg JnNlc3Npb24uZXJyKTsKCQlFUlJfSUYocmV0ID09IERXX0RMVl9FUlJPUik7 CgkJZHdhcmZfZGVhbGxvYyhzZXNzaW9uLmRiZywgY3VyX2xpbmstPmRpZSwg RFdfRExBX0RJRSk7CgkJY3VyX2xpbmstPmRpZSA9IG5ld19kaWU7CgkJaWYg KHJldCA9PSBEV19ETFZfTk9fRU5UUlkpCgkJCXJldHVybiAwOwoJfQoJZHdh cmZfZGVhbGxvYyhzZXNzaW9uLmRiZywgY3VyX2xpbmstPmRpZSwgRFdfRExB X0RJRSk7CglyZXR1cm4gcmV0Owp9CgovKiBTZWFyY2ggYSBkaWUgaW4gaXRz IGNoaWxkcmVuJ3MgZGllIHRyZWUgKi8Kc3RhdGljIGludCBzZWFyY2hfZGll X2Zyb21fY2hpbGRyZW4oRHdhcmZfRGllIHBhcmVudF9kaWUsCgkJCQkgICAg aW50ICgqZGllX2NiKShzdHJ1Y3QgZGllX2xpbmsgKiwgdm9pZCAqKSwgCgkJ CQkgICAgdm9pZCAqZGF0YSkKewoJc3RydWN0IGRpZV9saW5rIGxpbms7Cglp bnQgcmV0OwoKCWxpbmsucGFyZW50ID0gTlVMTDsKCXJldCA9IGR3YXJmX2No aWxkKHBhcmVudF9kaWUsICZsaW5rLmRpZSwgJnNlc3Npb24uZXJyKTsKCUVS Ul9JRihyZXQgPT0gRFdfRExWX0VSUk9SKTsKCWlmIChyZXQgPT0gRFdfRExW X09LKQoJCXJldHVybiBfX3NlYXJjaF9kaWVfdHJlZSgmbGluaywgZGllX2Ni LCBkYXRhKTsKCWVsc2UKCQlyZXR1cm4gMDsKfQoKLyogRmluZCBhIGxvY2Rl c2MgY29ycmVzcG9uZGluZyB0byB0aGUgYWRkcmVzcyAqLwpzdGF0aWMgaW50 IGF0dHJfZ2V0X2xvY2Rlc2MoRHdhcmZfQXR0cmlidXRlIGF0dHIsIER3YXJm X0xvY2Rlc2MgKmRlc2MsCgkJCSAgICBEd2FyZl9BZGRyIGFkZHIpCnsKCUR3 YXJmX1NpZ25lZCBsY250OwoJRHdhcmZfTG9jZGVzYyAqKmxsYnVmOwoJaW50 IHJldCwgaTsKCglyZXQgPSBkd2FyZl9sb2NsaXN0X24oYXR0ciwgJmxsYnVm LCAmbGNudCwgJnNlc3Npb24uZXJyKTsKCUVSUl9JRihyZXQgIT0gRFdfRExW X09LKTsKCXJldCA9IERXX0RMVl9OT19FTlRSWTsKCWZvciAoaSA9IDA7IGkg PCBsY250OyArK2kpIHsKCQlpZiAobGxidWZbaV0tPmxkX2xvcGMgPD0gYWRk ciAmJgoJCSAgICBsbGJ1ZltpXS0+bGRfaGlwYyA+IGFkZHIgKSB7CgkJCW1l bWNweShkZXNjLCBsbGJ1ZltpXSwgc2l6ZW9mKER3YXJmX0xvY2Rlc2MpKTsK CQkJZGVzYy0+bGRfcyA9CgkJCQltYWxsb2Moc2l6ZW9mKER3YXJmX0xvYykg KiBsbGJ1ZltpXS0+bGRfY2VudHMpOwoJCQlFUlJfSUYoZGVzYy0+bGRfcyA9 PSBOVUxMKTsKCQkJbWVtY3B5KGRlc2MtPmxkX3MsIGxsYnVmW2ldLT5sZF9z LAoJCQkJc2l6ZW9mKER3YXJmX0xvYykgKiBsbGJ1ZltpXS0+bGRfY2VudHMp OwoJCQlyZXQgPSBEV19ETFZfT0s7CgkJCWJyZWFrOwoJCX0KCQlkd2FyZl9k ZWFsbG9jKHNlc3Npb24uZGJnLCBsbGJ1ZltpXS0+bGRfcywgRFdfRExBX0xP Q19CTE9DSyk7CgkJZHdhcmZfZGVhbGxvYyhzZXNzaW9uLmRiZywgbGxidWZb aV0sIERXX0RMQV9MT0NERVNDKTsKCX0KCS8qIFJlbGVhc2luZyBsb29wICov Cglmb3IgKDsgaSA8IGxjbnQ7ICsraSkgewoJCWR3YXJmX2RlYWxsb2Moc2Vz c2lvbi5kYmcsIGxsYnVmW2ldLT5sZF9zLCBEV19ETEFfTE9DX0JMT0NLKTsK CQlkd2FyZl9kZWFsbG9jKHNlc3Npb24uZGJnLCBsbGJ1ZltpXSwgRFdfRExB X0xPQ0RFU0MpOwoJfQoJZHdhcmZfZGVhbGxvYyhzZXNzaW9uLmRiZywgbGxi dWYsIERXX0RMQV9MSVNUKTsKCXJldHVybiByZXQ7Cn0KCi8qLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIFByb2JlIGZpbmRlciByZWxh dGVkIGZ1bmN0aW9ucwogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0qLwoKLyogU2hvdyBhIGxvY2F0aW9uICovCnN0YXRpYyB2b2lkIHNob3df bG9jYXRpb24oRHdhcmZfTG9jICpsb2MsIHN0cnVjdCBwcm9iZV9maW5kZXIg KnBmKQp7CglEd2FyZl9TbWFsbCBvcDsKCUR3YXJmX1Vuc2lnbmVkIHJlZ247 CglEd2FyZl9TaWduZWQgb2ZmczsKCWludCBkZXJlZiA9IDA7Cgljb25zdCBj aGFyICpyZWdzOwoKCW9wID0gbG9jLT5scl9hdG9tOwoKCS8qIElmIHRoaXMg aXMgYmFzZWQgb24gZnJhbWUgYnVmZmVyLCBzZXQgdGhlIG9mZnNldCAqLwoJ aWYgKG9wID09IERXX09QX2ZicmVnKSB7CgkJZGVyZWYgPSAxOwoJCW9mZnMg PSAoRHdhcmZfU2lnbmVkKWxvYy0+bHJfbnVtYmVyOwoJCW9wID0gcGYtPmZi bG9jLmxkX3NbMF0ubHJfYXRvbTsKCQlsb2MgPSAmcGYtPmZibG9jLmxkX3Nb MF07Cgl9IGVsc2UKCQlvZmZzID0gMDsKCglpZiAob3AgPj0gRFdfT1BfYnJl ZzAgJiYgb3AgPD0gRFdfT1BfYnJlZzMxKSB7CgkJcmVnbiA9IG9wIC0gRFdf T1BfYnJlZzA7CgkJb2ZmcyArPSAoRHdhcmZfU2lnbmVkKWxvYy0+bHJfbnVt YmVyOwoJCWRlcmVmID0gMTsKCX0gZWxzZSBpZiAob3AgPj0gRFdfT1BfcmVn MCAmJiBvcCA8PSBEV19PUF9yZWczMSkgewoJCXJlZ24gPSBvcCAtIERXX09Q X3JlZzA7Cgl9IGVsc2UgaWYgKG9wID09IERXX09QX2JyZWd4KSB7CgkJcmVn biA9IGxvYy0+bHJfbnVtYmVyOwoJCW9mZnMgKz0gKER3YXJmX1NpZ25lZCls b2MtPmxyX251bWJlcjI7CgkJZGVyZWYgPSAxOwoJfSBlbHNlIGlmIChvcCA9 PSBEV19PUF9yZWd4KSB7CgkJcmVnbiA9IGxvYy0+bHJfbnVtYmVyOwoJfSBl bHNlIHsKCQlmcHJpbnRmKHN0ZGVyciwgIkVycm9yOiBEd2FyZl9PUCAlZCBp cyBub3Qgc3VwcG9ydGVkLlxuIiwgb3ApOwoJCWV4aXQoMSk7Cgl9CgoJcmVn cyA9IGdldF9hcmNoX3JlZ3N0cihyZWduKTsKCWlmICghcmVncykgewoJCWZw cmludGYoc3RkZXJyLAoJCQkiRXJyb3I6ICVsbGQgZXhjZWVkcyBtYXggcmVn aXN0ZXIgbnVtYmVyLlxuIiwgcmVnbik7CgkJZXhpdCgxKTsKCX0KCglpZiAo ZGVyZWYpCgkJcHJpbnRmKCIgJStsbGQoJXMpIiwgb2ZmcywgcmVncyk7Cgll bHNlCgkJcHJpbnRmKCIgJXMiLCByZWdzKTsKfQoKLyogU2hvdyBhIHZhcmlh YmxlcyBpbiBrcHJvYmUgZXZlbnQgZm9ybWF0ICovCnN0YXRpYyB2b2lkIHNo b3dfdmFyaWFibGUoRHdhcmZfRGllIHZyX2RpZSwgc3RydWN0IHByb2JlX2Zp bmRlciAqcGYpCnsKCUR3YXJmX0F0dHJpYnV0ZSBhdHRyOwoJRHdhcmZfTG9j ZGVzYyBsZDsKCWludCByZXQ7CgoJcmV0ID0gZHdhcmZfYXR0cih2cl9kaWUs IERXX0FUX2xvY2F0aW9uLCAmYXR0ciwgJnNlc3Npb24uZXJyKTsKCUVSUl9J RihyZXQgIT0gRFdfRExWX09LKTsKCXJldCA9IGF0dHJfZ2V0X2xvY2Rlc2Mo YXR0ciwgJmxkLCAocGYtPmFkZHIgLSBwZi0+Y3VfYmFzZSkpOwoJRVJSX0lG KHJldCAhPSBEV19ETFZfT0spOwoJLyogVE9ETz8gKi8KCWlmIChsZC5sZF9j ZW50cyAhPSAxKSB7CgkJZnByaW50ZihzdGRlcnIsICJUaGlzIHZhcmlhYmxl IHR5cGUgaXMgbm90IHN1cHBvcnRlZC5cbiIpOwoJCWV4aXQoMSk7Cgl9Cglz aG93X2xvY2F0aW9uKCZsZC5sZF9zWzBdLCBwZik7CglmcmVlKGxkLmxkX3Mp OwoJZHdhcmZfZGVhbGxvYyhzZXNzaW9uLmRiZywgYXR0ciwgRFdfRExBX0FU VFIpOwp9CgpzdGF0aWMgaW50IHZhcmlhYmxlX2NhbGxiYWNrKHN0cnVjdCBk aWVfbGluayAqbGluaywgdm9pZCAqZGF0YSkKewoJc3RydWN0IHByb2JlX2Zp bmRlciAqcGYgPSAoc3RydWN0IHByb2JlX2ZpbmRlciAqKWRhdGE7CglEd2Fy Zl9IYWxmIHRhZzsKCWludCByZXQ7CgoJcmV0ID0gZHdhcmZfdGFnKGxpbmst PmRpZSwgJnRhZywgJnNlc3Npb24uZXJyKTsKCUVSUl9JRihyZXQgPT0gRFdf RExWX0VSUk9SKTsKCWlmICgodGFnID09IERXX1RBR19mb3JtYWxfcGFyYW1l dGVyIHx8CgkgICAgIHRhZyA9PSBEV19UQUdfdmFyaWFibGUpICYmIAoJICAg IChkaWVfY29tcGFyZV9uYW1lKGxpbmstPmRpZSwgcGYtPnZhcikgPT0gMCkp IHsKCQlzaG93X3ZhcmlhYmxlKGxpbmstPmRpZSwgcGYpOwoJCXJldHVybiAx OwoJfQoJLyogVE9ETzogU3VwcG9ydCBzdHJ1Y3QgbWVtYmVycyAqLwoJcmV0 dXJuIDA7Cn0KCi8qIEZpbmQgYSB2YXJpYWJsZSBpbiBhIHN1YnByb2dyYW0g ZGllICovCnN0YXRpYyB2b2lkIGZpbmRfdmFyaWFibGUoY29uc3QgY2hhciAq dmFyLCBEd2FyZl9EaWUgc3BfZGllLAoJCQkgIHN0cnVjdCBwcm9iZV9maW5k ZXIgKnBmKQp7CglpbnQgcmV0OwoKCWRlYnVnKCJTZWFyY2hpbmcgJXMgdmFy aWFibGUgaW4gY29udGV4dC5cbiIsIHZhcik7CglwZi0+dmFyID0gdmFyOwoJ LyogU2VhcmNoIGNoaWxkIGRpZSBmb3IgbG9jYWwgdmFyaWFibGVzIGFuZCBw YXJhbWV0ZXJzLiAqLwoJcmV0ID0gc2VhcmNoX2RpZV9mcm9tX2NoaWxkcmVu KHNwX2RpZSwgdmFyaWFibGVfY2FsbGJhY2ssIHBmKTsKCWlmICghcmV0KSB7 CgkJZnByaW50ZihzdGRlcnIsICJcbkZhaWxlZCB0byBmaW5kICVzIGluIHRo aXMgZnVuY3Rpb24uXG4iLCB2YXIpOwoJCWV4aXQoMSk7Cgl9Cn0KCi8qIEdl dCBhIGZyYW1lIGJhc2Ugb24gdGhlIGFkZHJlc3MgKi8Kc3RhdGljIHZvaWQg Z2V0X2N1cnJlbnRfZnJhbWVfYmFzZShEd2FyZl9EaWUgc3BfZGllLCBzdHJ1 Y3QgcHJvYmVfZmluZGVyICpwZikKewoJRHdhcmZfQXR0cmlidXRlIGF0dHI7 CglpbnQgcmV0OwoKCXJldCA9IGR3YXJmX2F0dHIoc3BfZGllLCBEV19BVF9m cmFtZV9iYXNlLCAmYXR0ciwgJnNlc3Npb24uZXJyKTsKCUVSUl9JRihyZXQg IT0gRFdfRExWX09LKTsKCXJldCA9IGF0dHJfZ2V0X2xvY2Rlc2MoYXR0ciwg JnBmLT5mYmxvYywgKHBmLT5hZGRyIC0gcGYtPmN1X2Jhc2UpKTsKCUVSUl9J RihyZXQgIT0gRFdfRExWX09LKTsKCWR3YXJmX2RlYWxsb2Moc2Vzc2lvbi5k YmcsIGF0dHIsIERXX0RMQV9BVFRSKTsKfQoKc3RhdGljIHZvaWQgZnJlZV9j dXJyZW50X2ZyYW1lX2Jhc2Uoc3RydWN0IHByb2JlX2ZpbmRlciAqcGYpCnsK CWZyZWUocGYtPmZibG9jLmxkX3MpOwoJbWVtc2V0KCZwZi0+ZmJsb2MsIDAs IHNpemVvZihEd2FyZl9Mb2NkZXNjKSk7Cn0KCi8qIFNob3cgYSBwcm9iZSBw b2ludCB0byBzdGRvdXQgKi8Kc3RhdGljIHZvaWQgc2hvd19wcm9iZXBvaW50 KER3YXJmX0RpZSBzcF9kaWUsIER3YXJmX1NpZ25lZCBvZmZzLAoJCQkgICAg c3RydWN0IHByb2JlX2ZpbmRlciAqcGYpCnsKCWNoYXIgKm5hbWU7CglpbnQg cmV0LCBpOwoJcmV0ID0gZHdhcmZfZGllbmFtZShzcF9kaWUsICZuYW1lLCAm c2Vzc2lvbi5lcnIpOwoJRVJSX0lGKHJldCA9PSBEV19ETFZfRVJST1IpOwoJ aWYgKHJldCA9PSBEV19ETFZfT0spIHsKCQlwcmludGYoIiVzJStkIiwgbmFt ZSwgKGludClvZmZzKTsKCQlkd2FyZl9kZWFsbG9jKHNlc3Npb24uZGJnLCBu YW1lLCBEV19ETEFfU1RSSU5HKTsKCX0gZWxzZSB7CgkJLyogVGhpcyBmdW5j dGlvbiBoYXMgbm8gbmFtZS4gKi8KCQlwcmludGYoIjB4JWxseCIsIHBmLT5h ZGRyKTsKCX0KCWdldF9jdXJyZW50X2ZyYW1lX2Jhc2Uoc3BfZGllLCBwZik7 Cglmb3IgKGkgPSAwOyBpIDwgcGYtPm5yX2FyZ3M7IGkrKykKCQlmaW5kX3Zh cmlhYmxlKHBmLT5hcmdzW2ldLCBzcF9kaWUsIHBmKTsKCWZyZWVfY3VycmVu dF9mcmFtZV9iYXNlKHBmKTsKCXByaW50ZigiXG4iKTsKCXBmLT5mb3VuZCsr Owp9CgpzdGF0aWMgaW50IHByb2JlYWRkcl9jYWxsYmFjayhzdHJ1Y3QgZGll X2xpbmsgKmxpbmssIHZvaWQgKmRhdGEpCnsKCXN0cnVjdCBwcm9iZV9maW5k ZXIgKnBmID0gKHN0cnVjdCBwcm9iZV9maW5kZXIgKilkYXRhOwoJRHdhcmZf SGFsZiB0YWc7CglEd2FyZl9TaWduZWQgb2ZmczsKCWludCByZXQ7CgoJcmV0 ID0gZHdhcmZfdGFnKGxpbmstPmRpZSwgJnRhZywgJnNlc3Npb24uZXJyKTsK CUVSUl9JRihyZXQgPT0gRFdfRExWX0VSUk9SKTsKCWlmICh0YWcgPT0gRFdf VEFHX3N1YnByb2dyYW0gJiYKCSAgICBkaWVfd2l0aGluX3N1YnByb2dyYW0o bGluay0+ZGllLCBwZi0+YWRkciwgJm9mZnMpKSB7CgkJc2hvd19wcm9iZXBv aW50KGxpbmstPmRpZSwgb2ZmcywgcGYpOwoJCXJldHVybiAxOwoJfQoJcmV0 dXJuIDA7Cn0KCi8qIEZpbmQgcHJvYmUgcG9pbnQgZnJvbSBpdHMgbGluZSBu dW1iZXIgKi8Kc3RhdGljIHZvaWQgZmluZF9ieV9saW5lKER3YXJmX0RpZSBj dV9kaWUsIHN0cnVjdCBwcm9iZV9maW5kZXIgKnBmKQp7CglEd2FyZl9TaWdu ZWQgY250LCBpOwoJRHdhcmZfTGluZSAqbGluZXM7CglEd2FyZl9VbnNpZ25l ZCBsaW5lbm8gPSAwOwoJRHdhcmZfQWRkciBhZGRyOwoJRHdhcmZfVW5zaWdu ZWQgZm5vOwoJaW50IHJldDsKCglyZXQgPSBkd2FyZl9zcmNsaW5lcyhjdV9k aWUsICZsaW5lcywgJmNudCwgJnNlc3Npb24uZXJyKTsKCUVSUl9JRihyZXQg IT0gRFdfRExWX09LKTsKCglmb3IgKGkgPSAwOyBpIDwgY250OyBpKyspIHsK CQlyZXQgPSBkd2FyZl9saW5lX3NyY2ZpbGVubyhsaW5lc1tpXSwgJmZubywg JnNlc3Npb24uZXJyKTsKCQlFUlJfSUYocmV0ICE9IERXX0RMVl9PSyk7CgkJ aWYgKGZubyAhPSBwZi0+Zm5vKQoJCQljb250aW51ZTsKCgkJcmV0ID0gZHdh cmZfbGluZW5vKGxpbmVzW2ldLCAmbGluZW5vLCAmc2Vzc2lvbi5lcnIpOwoJ CUVSUl9JRihyZXQgIT0gRFdfRExWX09LKTsKCQlpZiAobGluZW5vICE9IHBm LT5saW5lKQoJCQljb250aW51ZTsKCgkJcmV0ID0gZHdhcmZfbGluZWFkZHIo bGluZXNbaV0sICZhZGRyLCAmc2Vzc2lvbi5lcnIpOwoJCUVSUl9JRihyZXQg IT0gRFdfRExWX09LKTsKCQlkZWJ1ZygiUHJvYmUgcG9pbnQgZm91bmQ6IDB4 JWxseFxuIiwgYWRkcik7CgkJcGYtPmFkZHIgPSBhZGRyOwoJCS8qIFNlYXJj aCBhIHJlYWwgc3VicHJvZ3JhbSBpbmNsdWRpbmcgdGhpcyBsaW5lLCAqLwoJ CXJldCA9IHNlYXJjaF9kaWVfZnJvbV9jaGlsZHJlbihjdV9kaWUsIHByb2Jl YWRkcl9jYWxsYmFjaywgcGYpOwoJCWlmIChyZXQgPT0gMCkgewoJCQlmcHJp bnRmKHN0ZGVyciwKCQkJCSJQcm9iZSBwb2ludCBpcyBub3QgZm91bmQgaW4g c3VicHJvZ3JhbXMuXG4iKTsKCQkJZXhpdCgxKTsKCQl9CgkJLyogQ29udGlu dWluZywgYmVjYXVzZSB0YXJnZXQgbGluZSBtaWdodCBiZSBpbmxpbmVkLiAq LwoJfQoJZHdhcmZfc3JjbGluZXNfZGVhbGxvYyhzZXNzaW9uLmRiZywgbGlu ZXMsIGNudCk7Cn0KCi8qIFNlYXJjaCBmdW5jdGlvbiBmcm9tIGZ1bmN0aW9u IG5hbWUgKi8Kc3RhdGljIGludCBwcm9iZWZ1bmNfY2FsbGJhY2soc3RydWN0 IGRpZV9saW5rICpsaW5rLCB2b2lkICpkYXRhKQp7CglzdHJ1Y3QgcHJvYmVf ZmluZGVyICpwZiA9IChzdHJ1Y3QgcHJvYmVfZmluZGVyICopZGF0YTsKCXN0 cnVjdCBkaWVfbGluayAqbGs7CglEd2FyZl9TaWduZWQgb2ZmczsKCUR3YXJm X0hhbGYgdGFnOwoJaW50IHJldDsKCglyZXQgPSBkd2FyZl90YWcobGluay0+ ZGllLCAmdGFnLCAmc2Vzc2lvbi5lcnIpOwoJRVJSX0lGKHJldCA9PSBEV19E TFZfRVJST1IpOwoJaWYgKHRhZyA9PSBEV19UQUdfc3VicHJvZ3JhbSkgewoJ CWlmIChkaWVfY29tcGFyZV9uYW1lKGxpbmstPmRpZSwgcGYtPmZ1bmN0aW9u KSA9PSAwKSB7CgkJCWlmIChkaWVfaW5saW5lZF9zdWJwcm9ncmFtKGxpbmst PmRpZSkpIHsKCQkJCS8qIElubGluZWQgZnVuY3Rpb24sIHNhdmUgaXQuICov CgkJCQlyZXQgPSBkd2FyZl9kaWVfQ1Vfb2Zmc2V0KGxpbmstPmRpZSwKCQkJ CQkJCSAgJnBmLT5pbmxfb2ZmcywKCQkJCQkJCSAgJnNlc3Npb24uZXJyKTsK CQkJCUVSUl9JRihyZXQgIT0gRFdfRExWX09LKTsKCQkJCWRlYnVnKCJpbmxp bmUgZGVmaW5pdGlvbiBvZmZzZXQgJWxsZFxuIiwKCQkJCQlwZi0+aW5sX29m ZnMpOwoJCQkJcmV0dXJuIDA7CgkJCX0KCQkJZHdhcmZfbG93cGMobGluay0+ ZGllLCAmcGYtPmFkZHIsICZzZXNzaW9uLmVycik7CgkJCXBmLT5hZGRyICs9 IHBmLT5vZmZzZXQ7CgkJCS8qIFRPRE86IENoZWNrIHRoZSBhZGRyZXNzIGlu IHRoaXMgZnVuY3Rpb24gKi8KCQkJc2hvd19wcm9iZXBvaW50KGxpbmstPmRp ZSwgcGYtPm9mZnNldCwgcGYpOwoJCQkvKiBDb250aW51ZSB0byBzZWFyY2gg Ki8KCQl9Cgl9IGVsc2UgaWYgKHRhZyA9PSBEV19UQUdfaW5saW5lZF9zdWJy b3V0aW5lICYmIHBmLT5pbmxfb2ZmcykgewoJCWlmIChkaWVfZ2V0X2Fic3Ry YWN0X29yaWdpbihsaW5rLT5kaWUpID09IHBmLT5pbmxfb2ZmcykgewoJCQlw Zi0+YWRkciA9IGRpZV9nZXRfZW50cnlwYyhsaW5rLT5kaWUpOwoJCQlwZi0+ YWRkciArPSBwZi0+b2Zmc2V0OwoJCQlkZWJ1ZygiZm91bmQgaW5saW5lIGFk ZHI6IDB4JWxseFxuIiwgcGYtPmFkZHIpOwoJCQkvKiBJbmxpbmVkIGZ1bmN0 aW9uLiBHZXQgYSByZWFsIHN1YnByb2dyYW0gKi8KCQkJZm9yIChsayA9IGxp bmstPnBhcmVudDsgbGsgIT0gTlVMTDsgbGsgPSBsay0+cGFyZW50KSB7CgkJ CQl0YWcgPSAwOwoJCQkJZHdhcmZfdGFnKGxrLT5kaWUsICZ0YWcsICZzZXNz aW9uLmVycik7CgkJCQlFUlJfSUYocmV0ID09IERXX0RMVl9FUlJPUik7CgkJ CQlpZiAodGFnID09IERXX1RBR19zdWJwcm9ncmFtICYmCgkJCQkgICAgIWRp ZV9pbmxpbmVkX3N1YnByb2dyYW0obGstPmRpZSkpCgkJCQkJZ290byBmb3Vu ZDsKCQkJfQoJCQlmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBmaW5kIHJl YWwgc3VicHJvZ3JhbS5cbiIpOwoJCQlleGl0KDEpOwpmb3VuZDoKCQkJcmV0 ID0gZGllX3dpdGhpbl9zdWJwcm9ncmFtKGxrLT5kaWUsIHBmLT5hZGRyLCAm b2Zmcyk7CgkJCUVSUl9JRighcmV0KTsKCQkJc2hvd19wcm9iZXBvaW50KGxr LT5kaWUsIG9mZnMsIHBmKTsKCQkJLyogQ29udGludWUgdG8gc2VhcmNoICov CgkJfQoJfQoJcmV0dXJuIDA7Cn0KCnN0YXRpYyB2b2lkIGZpbmRfYnlfZnVu YyhEd2FyZl9EaWUgY3VfZGllLCBzdHJ1Y3QgcHJvYmVfZmluZGVyICpwZikK ewoJc2VhcmNoX2RpZV9mcm9tX2NoaWxkcmVuKGN1X2RpZSwgcHJvYmVmdW5j X2NhbGxiYWNrLCBwZik7Cn0KCnN0YXRpYyB2b2lkIGZpbmRfcHJvYmVwb2lu dChzdHJ1Y3QgcHJvYmVfZmluZGVyICpwZikKewoJRHdhcmZfVW5zaWduZWQg Y3VoX2xlbiA9IDA7CglEd2FyZl9IYWxmIHZzdGFtcCA9IDA7CglEd2FyZl9V bnNpZ25lZCBhYmJyZXYgPSAwOwoJRHdhcmZfSGFsZiBhZGRyX3NpemUgPSAw OwoJRHdhcmZfVW5zaWduZWQgbmV4dF9jdWggPSAwOwoJRHdhcmZfRGllIGN1 X2RpZSA9IDA7CglpbnQgY3VfbnVtYmVyID0gMCwgcmV0OwoKCXBmLT5mb3Vu ZCA9IDA7Cgl3aGlsZSAoKytjdV9udW1iZXIpIHsKCQkvKiBTZWFyY2ggQ1Ug KENvbXBpbGF0aW9uIFVuaXQpICovCgkJcmV0ID0gZHdhcmZfbmV4dF9jdV9o ZWFkZXIoc2Vzc2lvbi5kYmcsICZjdWhfbGVuLCAmdnN0YW1wLAoJCQkmYWJi cmV2LCAmYWRkcl9zaXplLCAmbmV4dF9jdWgsICZzZXNzaW9uLmVycik7CgkJ RVJSX0lGKHJldCA9PSBEV19ETFZfRVJST1IpOwogICAgICAgIAlpZiAocmV0 ID09IERXX0RMVl9OT19FTlRSWSkKCQkJYnJlYWs7CgoJCS8qIEdldCB0aGUg RElFKERlYnVnZ2luZyBJbmZvcm1hdGlvbiBFbnRyeSkgb2YgdGhpcyBDVSAq LwoJCXJldCA9IGR3YXJmX3NpYmxpbmdvZihzZXNzaW9uLmRiZywgMCwgJmN1 X2RpZSwgJnNlc3Npb24uZXJyKTsKCQlFUlJfSUYocmV0ICE9IERXX0RMVl9P Syk7CgoJCS8qIENoZWNrIGlmIHRhcmdldCBmaWxlIGlzIGluY2x1ZGVkLiAq LwoJCWlmIChwZi0+ZmlsZSkKCQkJcGYtPmZubyA9IGRpZV9nZXRfZmlsZW5v KGN1X2RpZSwgcGYtPmZpbGUpOwoKCQlpZiAoIXBmLT5maWxlIHx8IHBmLT5m bm8pIHsKCQkJLyogU2F2ZSBDVSBiYXNlIGFkZHJlc3MgKGZvciBmcmFtZV9i YXNlKSAqLwoJCQlyZXQgPSBkd2FyZl9sb3dwYyhjdV9kaWUsICZwZi0+Y3Vf YmFzZSwgJnNlc3Npb24uZXJyKTsKCQkJRVJSX0lGKHJldCA9PSBEV19ETFZf RVJST1IpOwoJCQlpZiAocmV0ID09IERXX0RMVl9OT19FTlRSWSkKCQkJCXBm LT5jdV9iYXNlID0gMDsKCQkJaWYgKHBmLT5saW5lKQoJCQkJZmluZF9ieV9s aW5lKGN1X2RpZSwgcGYpOwoJCQlpZiAocGYtPmZ1bmN0aW9uKQoJCQkJZmlu ZF9ieV9mdW5jKGN1X2RpZSwgcGYpOwoJCX0KCQlkd2FyZl9kZWFsbG9jKHNl c3Npb24uZGJnLCBjdV9kaWUsIERXX0RMQV9ESUUpOwoJfQoJaWYgKHBmLT5m b3VuZCA9PSAwKSB7CgkJZnByaW50ZihzdGRlcnIsICJQcm9iZSBwb2ludCBp cyBub3QgZm91bmQuXG4iKTsKCQlleGl0KDEpOwoJfQp9Cgo= --------------040903020306080407020700--