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--