Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S269505AbUJFUps (ORCPT ); Wed, 6 Oct 2004 16:45:48 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S269467AbUJFUht (ORCPT ); Wed, 6 Oct 2004 16:37:49 -0400 Received: from sigma957.CIS.McMaster.CA ([130.113.64.83]:31949 "EHLO sigma957.cis.mcmaster.ca") by vger.kernel.org with ESMTP id S269394AbUJFU3s (ORCPT ); Wed, 6 Oct 2004 16:29:48 -0400 Subject: [RFC][PATCH] inotify 0.13 From: John McCutchan To: linux-kernel@vger.kernel.org, gamin-list@gnome.org, rml@ximian.com, viro@parcelfarce.linux.theplanet.co.uk, akpm@osdl.org, iggy@gentoo.org, ben@bagu.org Content-Type: multipart/mixed; boundary="=-6wHUE47jK1MlTG+avsEH" Message-Id: <1097095286.9199.2.camel@vertex> Mime-Version: 1.0 X-Mailer: Ximian Evolution 1.4.6 Date: Wed, 06 Oct 2004 16:41:27 -0400 X-PMX-Version-Mac: 4.7.0.111621, Antispam-Engine: 2.0.1.0, Antispam-Data: 2004.10.6.1 X-PerlMx-Spam: Gauge=IIIIIII, Probability=7%, Report='__CT 0, __CTYPE_HAS_BOUNDARY 0, __CTYPE_MULTIPART 0, __HAS_MSGID 0, __HAS_X_MAILER 0, __MIME_VERSION 0, __SANE_MSGID 0' X-Spam-Flag: NO Sender: linux-kernel-owner@vger.kernel.org X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 72116 Lines: 1061 --=-6wHUE47jK1MlTG+avsEH Content-Type: text/plain Content-Transfer-Encoding: 7bit Hello, Here is release 0.13.0 of inotify. Attached is a patch to 2.6.8.1 --New in this version-- -dnotify configurable (rml) -ioctl return val (rml) -locking (rml) -unsign nr_watches (rml) -fix deadlock (rml) -add CLOSE_WRITE/CLOSE_NOWRITE events (rml) -CLOSE_* events are delivered in all circumstances now (rml) -fix MOVED_FROM filename bug (rml) -misc cleanups (rml,me) -MOVED_FROM/MOVED_TO cookie code (me) -inotify_inode_data uses slab cache (me) -clean up release notes (me) John McCutchan Release notes: --Why Not dnotify and Why inotify (By Robert Love)-- Everyone seems quick to deride the blunder known as "dnotify" and applaud a replacement, any replacement, man anything but that current mess, but in the name of fairness I present my treatise on why dnotify is what one might call not good: * dnotify requires the opening of one fd per each directory that you intend to watch. o The file descriptor pins the directory, disallowing the backing device to be unmounted, which absolutely wrecks havoc with removable media. o Watching many directories results in many open file descriptors, possibly hitting a per-process fd limit. * dnotify is directory-based. You only learn about changes to directories. Sure, a change to a file in a directory affects the directory, but you are then forced to keep a cache of stat structures around to compare things in order to find out which file. * dnotify's interface to user-space is awful. o dnotify uses signals to communicate with user-space. o Specifically, dnotify uses SIGIO. o But then you can pick a different signal! So by "signals," I really meant you need to use real-time signals if you want to queue the events. * dnotify basically ignores any problems that would arise in the VFS from hard links. * Rumor is that the "d" in "dnotify" does not stand for "directory" but for "suck." A suitable replacement is "inotify." And now, my tract on what inotify brings to the table: * inotify's interface is a device node, not SIGIO. o You open only a single fd, to the device node. No more pinning directories or opening a million file descriptors. o Usage is nice: open the device, issue simple commands via ioctl(), and then block on the device. It returns events when, well, there are events to be returned. o You can select() on the device node and so it integrates with main loops like coffee mixed with vanilla milkshake. * inotify has an event that says "the filesystem that the item you were watching is on was unmounted" (this is particularly cool). * inotify can watch directories or files. * The "i" in inotify does not stand for "suck" but for "inode" -- the logical choice since inotify is inode-based. --COMPLEXITY-- I have been asked what the complexity of inotify is. Inotify has 2 path codes where complexity could be an issue: Adding a watch to a device This code has to check if the inode is already being watched by the device, this is O(1) since the maximum number of devices is limited to 8. Removing a watch from a device This code has to do a search of all watches on the device to find the watch descriptor that is being asked to remove. This involves a linear search, but should not really be an issue because it is limited to 8192 entries. If this does turn in to a concern, I would replace the list of watches on the device with a sorted binary tree, so that the search could be done very quickly. The calls to inotify from the VFS code has a complexity of O(1) so inotify does not affect the speed of VFS operations. --MEMORY USAGE-- The inotify data structures are light weight: inotify watch is 40 bytes inotify device is 68 bytes inotify event is 272 bytes So assuming a device has 8192 watches, the structures are only going to consume 320KB of memory. With a maximum number of 8 devices allowed to exist at a time, this is still only 2.5 MB Each device can also have 256 events queued at a time, which sums to 68KB per device. And only .5 MB if all devices are opened and have a full event queue. So approximately 3 MB of memory are used in the rare case of everything open and full. Each inotify watch pins the inode of a directory/file in memory, the size of an inode is different per file system but lets assume that it is 512 byes. So assuming the maximum number of global watches are active, this would pin down 32 MB of inodes in the inode cache. Again not a problem on a modern system. On smaller systems, the maximum watches / events could be lowered to provide a smaller foot print. Keep in mind that this is an absolute worst case memory analysis. In reality it will most likely cost approximately 5MB. --HOWTO USE-- Inotify is a character device that when opened offers 2 IOCTL's. (It actually has 4 but the other 2 are used for debugging) INOTIFY_WATCH: Which takes a path and event mask and returns a unique (to the instance of the driver) integer (wd [watch descriptor] from here on) that is a 1:1 mapping to the path passed. What happens is inotify gets the inode (and ref's the inode) for the path and adds a inotify_watch structure to the inodes list of watches. If this instance of the driver is already watching the path, the event mask will be updated and the original wd will be returned. INOTIFY_IGNORE: Which takes an integer (that you got from INOTIFY_WATCH) representing a wd that you are not interested in watching anymore. This will: send an IGNORE event to the device remove the inotify_watch structure from the device and from the inode and unref the inode. After you are watching 1 or more paths, you can read from the fd and get events. The events are struct inotify_event. If you are watching a directory and something happens to a file in the directory the event will contain the filename (just the filename not the full path). -- EVENTS -- IN_ACCESS - Sent when file is accessed. IN_MODIFY - Sent when file is modified. IN_ATTRIB - Sent when file is chmod'ed. IN_CLOSE_WRITE - Sent when file is closed and was opened for writing. IN_CLOSE_NOWRITE - Sent when file is closed but was not opened for writing. IN_CLOSE - either of the two above events. IN_OPEN - Sent when file is opened. IN_MOVED_FROM - Sent to the source folder of a move. IN_MOVED_TO - Sent to the destination folder of a move. IN_DELETE_SUBDIR - Sent when a sub directory is deleted. (When watching parent) IN_DELETE_FILE - Sent when a file is deleted. (When watching parent) IN_CREATE_SUBDIR - Sent when a sub directory is created. (When watching parent) IN_CREATE_FILE - Sent when a file is created. (When watching parent) IN_DELETE_SELF - Sent when file is deleted. IN_UNMOUNT - Sent when the filesystem is being unmounted. IN_Q_OVERFLOW - Sent when your event queue has over flowed. The MOVED_FROM/MOVED_TO events are always sent in pairs. MOVED_FROM/MOVED_TO is also sent when a file is renamed. The cookie field in the event pairs up MOVED_FROM/MOVED_TO events. These two events are not guaranteed to be successive in the event stream. You must rely on the cookie to pair them up. (Note, the cookie is not sent yet.) If you aren't watching the source and destination folders in a MOVE. You will only get MOVED_TO or MOVED_FROM. In this case, MOVED_TO is equivelent to a CREATE and MOVED_FROM is equivelent to a DELETE. --KERNEL CHANGES-- inotify char device driver. Adding calls to inotify_inode_queue_event and inotify_dentry_parent_queue_event from VFS operations. Dnotify has the same function calls. The complexity of the VFS operations is not affected because inotify_*_queue_event is O(1). Adding a call to inotify_super_block_umount from generic_shutdown_superblock inotify_super_block_umount consists of this: find all of the inodes that are on the super block being shut down, sends each watch on each inode the UNMOUNT and IGNORED event removes the watch structures from each instance of the device driver and each inode. unref's the inode. --=-6wHUE47jK1MlTG+avsEH Content-Disposition: attachment; filename=inotify-0.13.diff Content-Transfer-Encoding: base64 Content-Type: text/x-patch; name=inotify-0.13.diff; charset=UTF-8 LS0tIGNsZWFuL2xpbnV4L2RyaXZlcnMvY2hhci9pbm90aWZ5LmMJMTk2OS0xMi0zMSAxOTowMDow MC4wMDAwMDAwMDAgLTA1MDANCisrKyBsaW51eC9kcml2ZXJzL2NoYXIvaW5vdGlmeS5jCTIwMDQt MTAtMDYgMTY6Mjc6NTIuMDAwMDAwMDAwIC0wNDAwDQpAQCAtMCwwICsxLDk4MSBAQA0KKy8qDQor ICogSW5vZGUgYmFzZWQgZGlyZWN0b3J5IG5vdGlmaWNhdGlvbnMgZm9yIExpbnV4Lg0KKyAqDQor ICogQ29weXJpZ2h0IChDKSAyMDA0IEpvaG4gTWNDdXRjaGFuDQorICoNCisgKiBUaGlzIHByb2dy YW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlm eSBpdA0KKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vu c2UgYXMgcHVibGlzaGVkIGJ5IHRoZQ0KKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0 aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkNCisgKiBsYXRlciB2ZXJzaW9u Lg0KKyAqDQorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQg aXQgd2lsbCBiZSB1c2VmdWwsIGJ1dA0KKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0 IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklU TkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQ0KKyAqIEdlbmVyYWwg UHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCisgKi8NCisNCisvKiBUT0RPOiANCisg KiB1bm1vdW50IGV2ZW50cyBkb24ndCBnZXQgc2VudCBpZiBmaWxlc3lzdGVtIGlzIG1vdW50ZWQg aW4gdHdvIHBsYWNlcw0KKyAqIGR5bmFtaWNhbGx5IGFsbG9jYXRlIGV2ZW50IGZpbGVuYW1lDQor ICovDQorDQorI2luY2x1ZGUgPGxpbnV4L2JpdG1hcC5oPg0KKyNpbmNsdWRlIDxsaW51eC9tb2R1 bGUuaD4NCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+DQorI2luY2x1ZGUgPGxpbnV4L3NjaGVk Lmg+DQorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+DQorI2luY2x1ZGUgPGxpbnV4L3NsYWIu aD4NCisjaW5jbHVkZSA8bGludXgvZnMuaD4NCisjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4NCisj aW5jbHVkZSA8bGludXgvcG9sbC5oPg0KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+DQor I2luY2x1ZGUgPGxpbnV4L2luaXQuaD4NCisjaW5jbHVkZSA8bGludXgvbGlzdC5oPg0KKyNpbmNs dWRlIDxsaW51eC93cml0ZWJhY2suaD4NCisjaW5jbHVkZSA8bGludXgvaW5vdGlmeS5oPg0KKw0K KyNkZWZpbmUgTUFYX0lOT1RJRllfREVWUwkgIDgJLyogbWF4IG9wZW4gaW5vdGlmeSBkZXZpY2Vz ICovDQorI2RlZmluZSBNQVhfSU5PVElGWV9ERVZfV0FUQ0hFUyAgIDgxOTIJLyogbWF4IHRvdGFs IHdhdGNoZXMgKi8NCisjZGVmaW5lIE1BWF9JTk9USUZZX1FVRVVFRF9FVkVOVFMgMjU2CS8qIG1h eCBldmVudHMgcXVldWVkIG9uIHRoZSBkZXYgKi8NCisNCitzdGF0aWMgYXRvbWljX3Qgd2F0Y2hf Y291bnQ7DQorc3RhdGljIGF0b21pY190IGlub3RpZnlfY29va2llOw0KK3N0YXRpYyBrbWVtX2Nh Y2hlX3QgKndhdGNoX2NhY2hlcDsNCitzdGF0aWMga21lbV9jYWNoZV90ICpldmVudF9jYWNoZXA7 DQorc3RhdGljIGttZW1fY2FjaGVfdCAqaW5vZGVfZGF0YV9jYWNoZXA7DQorDQorLyogRm9yIGRl YnVnZ2luZyAqLw0KK3N0YXRpYyBpbnQgaW5vdGlmeV9kZWJ1Z19mbGFnczsNCisjZGVmaW5lIGlw cmludGsoZiwgc3RyLi4uKSBpZiAoaW5vdGlmeV9kZWJ1Z19mbGFncyAmIGYpIHByaW50ayAoS0VS Tl9BTEVSVCBzdHIpDQorDQorLyoNCisgKiBzdHJ1Y3QgaW5vdGlmeV9kZXZpY2UgLSByZXByZXNl bnRzIGFuIG9wZW4gaW5zdGFuY2Ugb2YgYW4gaW5vdGlmeSBkZXZpY2UNCisgKg0KKyAqIEZvciBl YWNoIGlub3RpZnkgZGV2aWNlLCB3ZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIGV2ZW50cyBx dWV1ZWQgb24gaXQsDQorICogYSBsaXN0IG9mIHRoZSBpbm9kZXMgdGhhdCB3ZSBhcmUgd2F0Y2hp bmcsIGFuZCBzbyBvbi4NCisgKg0KKyAqICdiaXRtYXNrJyBob2xkcyBvbmUgYml0IGZvciBlYWNo IHBvc3NpYmxlIHdhdGNoIGRlc2NyaXB0b3I6IGEgc2V0IGJpdA0KKyAqIGltcGxpZXMgdGhhdCB0 aGUgZ2l2ZW4gV0QgaXMgdmFsaWQsIHVuc2V0IGltcGxpZXMgaXQgaXMgbm90Lg0KKyAqDQorICog VGhpcyBzdHJ1Y3R1cmUgaXMgcHJvdGVjdGVkIGJ5ICdsb2NrJy4gIExvY2sgb3JkZXJpbmc6DQor ICoNCisgKiBpbm9kZS0+aV9sb2NrDQorICoJZGV2LT5sb2NrDQorICoJCWRldi0+d2FpdC0+bG9j aw0KKyAqDQorICogRklYTUU6IExvb2sgYXQgcmVwbGFjaW5nIGlfbG9jayB3aXRoIGlfc2VtLg0K KyAqLw0KK3N0cnVjdCBpbm90aWZ5X2RldmljZSB7DQorCURFQ0xBUkVfQklUTUFQKGJpdG1hc2ss IE1BWF9JTk9USUZZX0RFVl9XQVRDSEVTKTsNCisJd2FpdF9xdWV1ZV9oZWFkX3QgCXdhaXQ7DQor CXN0cnVjdCBsaXN0X2hlYWQgCWV2ZW50czsNCisJc3RydWN0IGxpc3RfaGVhZCAJd2F0Y2hlczsN CisJc3BpbmxvY2tfdAkJbG9jazsNCisJdW5zaWduZWQgaW50CQlldmVudF9jb3VudDsNCisJdW5z aWduZWQgaW50CQlucl93YXRjaGVzOw0KK307DQorDQorc3RydWN0IGlub3RpZnlfd2F0Y2ggew0K KwlfX3MzMiAJCQl3ZDsJLyogd2F0Y2ggZGVzY3JpcHRvciAqLw0KKwlfX3UzMgkJCW1hc2s7DQor CXN0cnVjdCBpbm9kZSAqCQlpbm9kZTsNCisJc3RydWN0IGlub3RpZnlfZGV2aWNlICoJZGV2Ow0K KwlzdHJ1Y3QgbGlzdF9oZWFkCWRfbGlzdDsJLyogZGV2aWNlIGxpc3QgKi8NCisJc3RydWN0IGxp c3RfaGVhZAlpX2xpc3Q7IC8qIGlub2RlIGxpc3QgKi8NCisJc3RydWN0IGxpc3RfaGVhZAl1X2xp c3Q7IC8qIHVubW91bnQgbGlzdCAqLw0KK307DQorI2RlZmluZSBpbm90aWZ5X3dhdGNoX2RfbGlz dChwb3MpIGxpc3RfZW50cnkoKHBvcyksIHN0cnVjdCBpbm90aWZ5X3dhdGNoLCBkX2xpc3QpDQor I2RlZmluZSBpbm90aWZ5X3dhdGNoX2lfbGlzdChwb3MpIGxpc3RfZW50cnkoKHBvcyksIHN0cnVj dCBpbm90aWZ5X3dhdGNoLCBpX2xpc3QpDQorI2RlZmluZSBpbm90aWZ5X3dhdGNoX3VfbGlzdChw b3MpIGxpc3RfZW50cnkoKHBvcyksIHN0cnVjdCBpbm90aWZ5X3dhdGNoLCB1X2xpc3QpDQorDQor LyoNCisgKiBBIGxpc3Qgb2YgdGhlc2UgaXMgYXR0YWNoZWQgdG8gZWFjaCBpbnN0YW5jZSBvZiB0 aGUgZHJpdmVyDQorICogd2hlbiB0aGUgZHJpdmVycyByZWFkKCkgZ2V0cyBjYWxsZWQsIHRoaXMg bGlzdCBpcyB3YWxrZWQgYW5kDQorICogYWxsIGV2ZW50cyB0aGF0IGNhbiBmaXQgaW4gdGhlIGJ1 ZmZlciBnZXQgZGVsaXZlcmVkDQorICovDQorc3RydWN0IGlub3RpZnlfa2VybmVsX2V2ZW50IHsN CisgICAgICAgIHN0cnVjdCBsaXN0X2hlYWQgICAgICAgIGxpc3Q7DQorCXN0cnVjdCBpbm90aWZ5 X2V2ZW50CWV2ZW50Ow0KK307DQorDQorLyoNCisgKiBmaW5kX2lub2RlIC0gcmVzb2x2ZSBhIHVz ZXItZ2l2ZW4gcGF0aCB0byBhIHNwZWNpZmljIGlub2RlIGFuZCBpZ2V0KCkgaXQNCisgKi8NCitz dGF0aWMgc3RydWN0IGlub2RlICogZmluZF9pbm9kZShjb25zdCBjaGFyIF9fdXNlciAqZGlybmFt ZSkNCit7DQorCXN0cnVjdCBpbm9kZSAqaW5vZGU7DQorCXN0cnVjdCBuYW1laWRhdGEgbmQ7DQor CWludCBlcnJvcjsNCisNCisJZXJyb3IgPSBfX3VzZXJfd2FsayhkaXJuYW1lLCBMT09LVVBfRk9M TE9XLCAmbmQpOw0KKwlpZiAoZXJyb3IpIHsNCisJCWlwcmludGsoSU5PVElGWV9ERUJVR19JTk9E RSwgImNvdWxkIG5vdCBmaW5kIGlub2RlXG4iKTsNCisJCWlub2RlID0gRVJSX1BUUihlcnJvcik7 DQorCQlnb3RvIG91dDsNCisJfQ0KKw0KKwlpbm9kZSA9IG5kLmRlbnRyeS0+ZF9pbm9kZTsNCisJ X19pZ2V0KGlub2RlKTsNCisJaXByaW50ayhJTk9USUZZX0RFQlVHX0lOT0RFLCAicmVmJ2QgaW5v ZGVcbiIpOw0KKwlwYXRoX3JlbGVhc2UoJm5kKTsNCitvdXQ6DQorCXJldHVybiBpbm9kZTsNCit9 DQorDQorc3RhdGljIHZvaWQgdW5yZWZfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkNCit7DQor CWlwcmludGsoSU5PVElGWV9ERUJVR19JTk9ERSwgInVucmVmJ2QgaW5vZGVcbiIpOw0KKwlpcHV0 KGlub2RlKTsNCit9DQorDQorc3RydWN0IGlub3RpZnlfa2VybmVsX2V2ZW50ICprZXJuZWxfZXZl bnQoaW50IHdkLCBfX3UzMiBtYXNrLCBfX3UzMiBjb29raWUsDQorCQkJCQkgIGNvbnN0IGNoYXIg KmZpbGVuYW1lKQ0KK3sNCisJc3RydWN0IGlub3RpZnlfa2VybmVsX2V2ZW50ICprZXZlbnQ7DQor DQorCWtldmVudCA9IGttZW1fY2FjaGVfYWxsb2MoZXZlbnRfY2FjaGVwLCBHRlBfQVRPTUlDKTsN CisJaWYgKCFrZXZlbnQpIHsNCisJCWlwcmludGsoSU5PVElGWV9ERUJVR19BTExPQywNCisJCQki ZmFpbGVkIHRvIGFsbG9jIGtldmVudCAoJWQsJWQpXG4iLCB3ZCwgbWFzayk7DQorCQlnb3RvIG91 dDsNCisJfQ0KKw0KKwlpcHJpbnRrKElOT1RJRllfREVCVUdfQUxMT0MsICJhbGxvY2VkIGtldmVu dCAlcCAoJWQsJWQpXG4iLA0KKwkJa2V2ZW50LCB3ZCwgbWFzayk7DQorDQorCWtldmVudC0+ZXZl bnQud2QgPSB3ZDsNCisJa2V2ZW50LT5ldmVudC5tYXNrID0gbWFzazsNCisJa2V2ZW50LT5ldmVu dC5jb29raWUgPSBjb29raWU7DQorCUlOSVRfTElTVF9IRUFEKCZrZXZlbnQtPmxpc3QpOw0KKw0K KwlpZiAoZmlsZW5hbWUpIHsNCisJCWlwcmludGsoSU5PVElGWV9ERUJVR19GSUxFTiwNCisJCQki ZmlsZW5hbWUgZm9yIGV2ZW50IHdhcyAlcCAlc1xuIiwgZmlsZW5hbWUsIGZpbGVuYW1lKTsNCisJ CXN0cm5jcHkoa2V2ZW50LT5ldmVudC5maWxlbmFtZSwgZmlsZW5hbWUsDQorCQkJSU5PVElGWV9G SUxFTkFNRV9NQVgpOw0KKwkJa2V2ZW50LT5ldmVudC5maWxlbmFtZVtJTk9USUZZX0ZJTEVOQU1F X01BWC0xXSA9ICdcMCc7DQorCQlpcHJpbnRrKElOT1RJRllfREVCVUdfRklMRU4sDQorCQkJImZp bGVuYW1lIGFmdGVyIGNvcHlpbmcgJXNcbiIsIGtldmVudC0+ZXZlbnQuZmlsZW5hbWUpOw0KKwl9 IGVsc2Ugew0KKwkJaXByaW50ayhJTk9USUZZX0RFQlVHX0ZJTEVOLCAibm8gZmlsZW5hbWUgZm9y IGV2ZW50XG4iKTsNCisJCWtldmVudC0+ZXZlbnQuZmlsZW5hbWVbMF0gPSAnXDAnOw0KKwl9DQor DQorb3V0Og0KKwlyZXR1cm4ga2V2ZW50Ow0KK30NCisNCit2b2lkIGRlbGV0ZV9rZXJuZWxfZXZl bnQoc3RydWN0IGlub3RpZnlfa2VybmVsX2V2ZW50ICprZXZlbnQpDQorew0KKwlpZiAoIWtldmVu dCkNCisJCXJldHVybjsNCisJaXByaW50ayhJTk9USUZZX0RFQlVHX0FMTE9DLCAiZnJlZSdkIGtl dmVudCAlcFxuIiwga2V2ZW50KTsNCisJa21lbV9jYWNoZV9mcmVlKGV2ZW50X2NhY2hlcCwga2V2 ZW50KTsNCit9DQorDQorI2RlZmluZSBsaXN0X3RvX2lub3RpZnlfa2VybmVsX2V2ZW50KHBvcykg bGlzdF9lbnRyeSgocG9zKSwgc3RydWN0IGlub3RpZnlfa2VybmVsX2V2ZW50LCBsaXN0KQ0KKyNk ZWZpbmUgaW5vdGlmeV9kZXZfZ2V0X2V2ZW50KGRldikgKGxpc3RfdG9faW5vdGlmeV9rZXJuZWxf ZXZlbnQoZGV2LT5ldmVudHMubmV4dCkpDQorI2RlZmluZSBpbm90aWZ5X2Rldl9oYXNfZXZlbnRz KGRldikJKCFsaXN0X2VtcHR5KCZkZXYtPmV2ZW50cykpDQorDQorLyogRG9lcyB0aGlzIGV2ZW50 cyBtYXNrIGdldCBzZW50IHRvIHRoZSB3YXRjaCA/ICovDQorI2RlZmluZSBldmVudF9hbmQoZXZl bnRfbWFzayx3YXRjaGVzX21hc2spIAkoKGV2ZW50X21hc2sgPT0gSU5fVU5NT1VOVCkgfHwgXA0K KwkJCQkJCShldmVudF9tYXNrID09IElOX0lHTk9SRUQpIHx8IFwNCisJCQkJCQkoZXZlbnRfbWFz ayAmIHdhdGNoZXNfbWFzaykpDQorDQorLyoNCisgKiBpbm90aWZ5X2Rldl9xdWV1ZV9ldmVudCAt IGFkZCBhIG5ldyBldmVudCB0byB0aGUgZ2l2ZW4gZGV2aWNlDQorICoNCisgKiBDYWxsZXIgbXVz dCBob2xkIGRldi0+bG9jay4NCisgKi8NCitzdGF0aWMgdm9pZCBpbm90aWZ5X2Rldl9xdWV1ZV9l dmVudChzdHJ1Y3QgaW5vdGlmeV9kZXZpY2UgKmRldiwNCisJCQkJICAgIHN0cnVjdCBpbm90aWZ5 X3dhdGNoICp3YXRjaCwgX191MzIgbWFzaywNCisJCQkJICAgIF9fdTMyIGNvb2tpZSwgY29uc3Qg Y2hhciAqZmlsZW5hbWUpDQorew0KKwlzdHJ1Y3QgaW5vdGlmeV9rZXJuZWxfZXZlbnQgKmtldmVu dCwgKmxhc3Q7DQorDQorCS8qDQorCSAqIENoZWNrIGlmIHRoZSBuZXcgZXZlbnQgaXMgYSBkdXBs aWNhdGUgb2YgdGhlIGxhc3QgZXZlbnQgcXVldWVkLg0KKwkgKi8NCisJbGFzdCA9IGlub3RpZnlf ZGV2X2dldF9ldmVudChkZXYpOw0KKwlpZiAoZGV2LT5ldmVudF9jb3VudCAmJiBsYXN0LT5ldmVu dC5tYXNrID09IG1hc2sgJiYNCisJCQlsYXN0LT5ldmVudC53ZCA9PSB3YXRjaC0+d2QpIHsNCisJ CS8qIENoZWNrIGlmIHRoZSBmaWxlbmFtZXMgbWF0Y2ggKi8NCisJCWlmICghZmlsZW5hbWUgJiYg bGFzdC0+ZXZlbnQuZmlsZW5hbWVbMF0gPT0gJ1wwJykNCisJCQlyZXR1cm47DQorCQlpZiAoZmls ZW5hbWUgJiYgIXN0cmNtcChsYXN0LT5ldmVudC5maWxlbmFtZSwgZmlsZW5hbWUpKQ0KKwkJCXJl dHVybjsNCisJfQ0KKw0KKwkvKg0KKwkgKiB0aGUgcXVldWUgaGFzIGFscmVhZHkgb3ZlcmZsb3dl ZCBhbmQgd2UgaGF2ZSBhbHJlYWR5IHNlbnQgdGhlDQorCSAqIFFfT1ZFUkZMT1cgZXZlbnQNCisJ ICovDQorCWlmIChkZXYtPmV2ZW50X2NvdW50ID4gTUFYX0lOT1RJRllfUVVFVUVEX0VWRU5UUykg ew0KKwkJaXByaW50ayhJTk9USUZZX0RFQlVHX0VWRU5UUywNCisJCQkiZXZlbnQgcXVldWUgZm9y ICVwIG92ZXJmbG93ZWRcbiIsIGRldik7DQorCQlyZXR1cm47DQorCX0NCisNCisJLyogdGhlIHF1 ZXVlIGhhcyBqdXN0IG92ZXJmbG93ZWQgYW5kIHdlIG5lZWQgdG8gbm90aWZ5IHVzZXIgc3BhY2Ug Ki8NCisJaWYgKGRldi0+ZXZlbnRfY291bnQgPT0gTUFYX0lOT1RJRllfUVVFVUVEX0VWRU5UUykg ew0KKwkJZGV2LT5ldmVudF9jb3VudCsrOw0KKwkJa2V2ZW50ID0ga2VybmVsX2V2ZW50KC0xLCBJ Tl9RX09WRVJGTE9XLCBjb29raWUsIE5VTEwpOw0KKwkJaXByaW50ayhJTk9USUZZX0RFQlVHX0VW RU5UUywgInNlbmRpbmcgSU5fUV9PVkVSRkxPVyB0byAlcFxuIiwNCisJCQlkZXYpOw0KKwkJZ290 byBhZGRfZXZlbnRfdG9fcXVldWU7DQorCX0NCisNCisJaWYgKCFldmVudF9hbmQobWFzaywgd2F0 Y2gtPmlub2RlLT5pbm90aWZ5X2RhdGEtPndhdGNoX21hc2spIHx8DQorCQkJIWV2ZW50X2FuZCht YXNrLCB3YXRjaC0+bWFzaykpDQorCQlyZXR1cm47DQorDQorCWRldi0+ZXZlbnRfY291bnQrKzsN CisJa2V2ZW50ID0ga2VybmVsX2V2ZW50KHdhdGNoLT53ZCwgbWFzaywgY29va2llLCBmaWxlbmFt ZSk7DQorDQorYWRkX2V2ZW50X3RvX3F1ZXVlOg0KKwlpZiAoIWtldmVudCkgew0KKwkJaXByaW50 ayhJTk9USUZZX0RFQlVHX0VWRU5UUywgImZhaWxlZCB0byBxdWV1ZSBldmVudCBmb3IgJXAiDQor CQkJIiAtLSBjb3VsZCBub3QgYWxsb2NhdGUga2V2ZW50XG4iLCBkZXYpOw0KKwkJZGV2LT5ldmVu dF9jb3VudC0tOw0KKwkJcmV0dXJuOw0KKwl9DQorDQorCS8qIHF1ZXVlIHRoZSBldmVudCBhbmQg d2FrZSB1cCBhbnlvbmUgd2FpdGluZyAqLw0KKwlsaXN0X2FkZF90YWlsKCZrZXZlbnQtPmxpc3Qs ICZkZXYtPmV2ZW50cyk7DQorCWlwcmludGsoSU5PVElGWV9ERUJVR19FVkVOVFMsDQorCQkicXVl dWVkIGV2ZW50ICV4IGZvciAlcFxuIiwga2V2ZW50LT5ldmVudC5tYXNrLCBkZXYpOw0KKwl3YWtl X3VwX2ludGVycnVwdGlibGUoJmRldi0+d2FpdCk7DQorfQ0KKw0KKy8qDQorICogaW5vdGlmeV9k ZXZfZXZlbnRfZGVxdWV1ZSAtIGRlc3Ryb3kgYW4gZXZlbnQgb24gdGhlIGdpdmVuIGRldmljZQ0K KyAqDQorICogQ2FsbGVyIG11c3QgaG9sZCBkZXYtPmxvY2suDQorICovDQorc3RhdGljIHZvaWQg aW5vdGlmeV9kZXZfZXZlbnRfZGVxdWV1ZShzdHJ1Y3QgaW5vdGlmeV9kZXZpY2UgKmRldikNCit7 DQorCXN0cnVjdCBpbm90aWZ5X2tlcm5lbF9ldmVudCAqa2V2ZW50Ow0KKw0KKwlpZiAoIWlub3Rp ZnlfZGV2X2hhc19ldmVudHMoZGV2KSkNCisJCXJldHVybjsNCisNCisJa2V2ZW50ID0gaW5vdGlm eV9kZXZfZ2V0X2V2ZW50KGRldik7DQorCWxpc3RfZGVsKCZrZXZlbnQtPmxpc3QpOw0KKwlkZXYt PmV2ZW50X2NvdW50LS07DQorCWRlbGV0ZV9rZXJuZWxfZXZlbnQoa2V2ZW50KTsNCisNCisJaXBy aW50ayhJTk9USUZZX0RFQlVHX0VWRU5UUywgImRlcXVldWVkIGV2ZW50IG9uICVwXG4iLCBkZXYp Ow0KK30NCisNCisvKg0KKyAqIGlub3RpZnlfZGV2X2dldF93ZCAtIHJldHVybnMgdGhlIG5leHQg V0QgZm9yIHVzZSBieSB0aGUgZ2l2ZW4gZGV2DQorICoNCisgKiBDYWxsZXIgbXVzdCBob2xkIGRl di0+bG9jayBiZWZvcmUgY2FsbGluZy4NCisgKi8NCitzdGF0aWMgaW50IGlub3RpZnlfZGV2X2dl dF93ZChzdHJ1Y3QgaW5vdGlmeV9kZXZpY2UgKmRldikNCit7DQorCWludCB3ZDsNCisNCisJaWYg KCFkZXYgfHwgZGV2LT5ucl93YXRjaGVzID09IE1BWF9JTk9USUZZX0RFVl9XQVRDSEVTKQ0KKwkJ cmV0dXJuIC0xOw0KKw0KKwlkZXYtPm5yX3dhdGNoZXMrKzsNCisJd2QgPSBmaW5kX2ZpcnN0X3pl cm9fYml0KGRldi0+Yml0bWFzaywgTUFYX0lOT1RJRllfREVWX1dBVENIRVMpOw0KKwlzZXRfYml0 KHdkLCBkZXYtPmJpdG1hc2spOw0KKw0KKwlyZXR1cm4gd2Q7DQorfQ0KKw0KKy8qDQorICogaW5v dGlmeV9kZXZfcHV0X3dkIC0gcmVsZWFzZSB0aGUgZ2l2ZW4gV0Qgb24gdGhlIGdpdmVuIGRldmlj ZQ0KKyAqDQorICogQ2FsbGVyIG11c3QgaG9sZCBkZXYtPmxvY2suDQorICovDQorc3RhdGljIGlu dCBpbm90aWZ5X2Rldl9wdXRfd2Qoc3RydWN0IGlub3RpZnlfZGV2aWNlICpkZXYsIGludCB3ZCkN Cit7DQorCWlmICghZGV2IHx8IHdkIDwgMCkNCisJCXJldHVybiAtMTsNCisNCisJZGV2LT5ucl93 YXRjaGVzLS07DQorCWNsZWFyX2JpdCh3ZCwgZGV2LT5iaXRtYXNrKTsNCisNCisJcmV0dXJuIDA7 DQorfQ0KKw0KKy8qDQorICogY3JlYXRlX3dhdGNoIC0gY3JlYXRlcyBhIHdhdGNoIG9uIHRoZSBn aXZlbiBkZXZpY2UuDQorICoNCisgKiBHcmFicyBkZXYtPmxvY2ssIHNvIHRoZSBjYWxsZXIgbXVz dCBub3QgaG9sZCBpdC4NCisgKi8NCitzdGF0aWMgc3RydWN0IGlub3RpZnlfd2F0Y2ggKmNyZWF0 ZV93YXRjaChzdHJ1Y3QgaW5vdGlmeV9kZXZpY2UgKmRldiwNCisJCQkJCSAgX191MzIgbWFzaywg c3RydWN0IGlub2RlICppbm9kZSkNCit7DQorCXN0cnVjdCBpbm90aWZ5X3dhdGNoICp3YXRjaDsN CisNCisJd2F0Y2ggPSBrbWVtX2NhY2hlX2FsbG9jKHdhdGNoX2NhY2hlcCwgR0ZQX0tFUk5FTCk7 DQorCWlmICghd2F0Y2gpIHsNCisJCWlwcmludGsoSU5PVElGWV9ERUJVR19BTExPQywNCisJCQki ZmFpbGVkIHRvIGFsbG9jYXRlIHdhdGNoICglcCwlZClcbiIsIGlub2RlLCBtYXNrKTsNCisJCXJl dHVybiBOVUxMOw0KKwl9DQorDQorCXdhdGNoLT5tYXNrID0gbWFzazsNCisJd2F0Y2gtPmlub2Rl ID0gaW5vZGU7DQorCXdhdGNoLT5kZXYgPSBkZXY7DQorCUlOSVRfTElTVF9IRUFEKCZ3YXRjaC0+ ZF9saXN0KTsNCisJSU5JVF9MSVNUX0hFQUQoJndhdGNoLT5pX2xpc3QpOw0KKwlJTklUX0xJU1Rf SEVBRCgmd2F0Y2gtPnVfbGlzdCk7DQorDQorCXNwaW5fbG9jaygmZGV2LT5sb2NrKTsNCisJd2F0 Y2gtPndkID0gaW5vdGlmeV9kZXZfZ2V0X3dkKGRldik7DQorCXNwaW5fdW5sb2NrKCZkZXYtPmxv Y2spOw0KKw0KKwlpZiAod2F0Y2gtPndkIDwgMCkgew0KKwkJaXByaW50ayhJTk9USUZZX0RFQlVH X0VSUk9SUywNCisJCQkiQ291bGQgbm90IGdldCB3ZCBmb3Igd2F0Y2ggJXBcbiIsIHdhdGNoKTsN CisJCWlwcmludGsoSU5PVElGWV9ERUJVR19BTExPQywgImZyZWUnZCB3YXRjaCAlcFxuIiwgd2F0 Y2gpOw0KKwkJa21lbV9jYWNoZV9mcmVlKHdhdGNoX2NhY2hlcCwgd2F0Y2gpOw0KKwkJcmV0dXJu IE5VTEw7DQorCX0NCisNCisJcmV0dXJuIHdhdGNoOw0KK30NCisNCisvKg0KKyAqIGRlbGV0ZV93 YXRjaCAtIHJlbW92ZXMgdGhlIGdpdmVuICd3YXRjaCcgZnJvbSB0aGUgZ2l2ZW4gJ2RldicNCisg Kg0KKyAqIENhbGxlciBtdXN0IGhvbGQgZGV2LT5sb2NrLg0KKyAqLw0KK3N0YXRpYyB2b2lkIGRl bGV0ZV93YXRjaChzdHJ1Y3QgaW5vdGlmeV9kZXZpY2UgKmRldiwNCisJCQkgc3RydWN0IGlub3Rp Znlfd2F0Y2ggKndhdGNoKQ0KK3sNCisJaW5vdGlmeV9kZXZfcHV0X3dkKGRldiwgd2F0Y2gtPndk KTsNCisJaXByaW50ayhJTk9USUZZX0RFQlVHX0FMTE9DLCAiZnJlZSdkIHdhdGNoICVwXG4iLCB3 YXRjaCk7DQorCWttZW1fY2FjaGVfZnJlZSh3YXRjaF9jYWNoZXAsIHdhdGNoKTsNCit9DQorDQor LyoNCisgKiBpbm90aWZ5X2ZpbmRfZGV2IC0gZmluZCB0aGUgd2F0Y2ggYXNzb2NpYXRlZCB3aXRo IHRoZSBnaXZlbiBpbm9kZSBhbmQgZGV2DQorICoNCisgKiBDYWxsZXIgbXVzdCBob2xkIGRldi0+ bG9jay4NCisgKi8NCitzdGF0aWMgc3RydWN0IGlub3RpZnlfd2F0Y2ggKmlub2RlX2ZpbmRfZGV2 KHN0cnVjdCBpbm9kZSAqaW5vZGUsDQorCQkJCQkgICAgc3RydWN0IGlub3RpZnlfZGV2aWNlICpk ZXYpDQorew0KKwlzdHJ1Y3QgaW5vdGlmeV93YXRjaCAqd2F0Y2g7DQorDQorCWlmICghaW5vZGUt Pmlub3RpZnlfZGF0YSkNCisJCXJldHVybiBOVUxMOw0KKw0KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5 KHdhdGNoLCAmaW5vZGUtPmlub3RpZnlfZGF0YS0+d2F0Y2hlcywgaV9saXN0KSB7DQorCQlpZiAo d2F0Y2gtPmRldiA9PSBkZXYpDQorCQkJcmV0dXJuIHdhdGNoOw0KKwl9DQorDQorCXJldHVybiBO VUxMOw0KK30NCisNCitzdGF0aWMgc3RydWN0IGlub3RpZnlfd2F0Y2ggKmRldl9maW5kX3dkKHN0 cnVjdCBpbm90aWZ5X2RldmljZSAqZGV2LCBpbnQgd2QpDQorew0KKwlzdHJ1Y3QgaW5vdGlmeV93 YXRjaCAqd2F0Y2g7DQorDQorCWxpc3RfZm9yX2VhY2hfZW50cnkod2F0Y2gsICZkZXYtPndhdGNo ZXMsIGRfbGlzdCkgew0KKwkJaWYgKHdhdGNoLT53ZCA9PSB3ZCkNCisJCQlyZXR1cm4gd2F0Y2g7 DQorCX0NCisNCisJcmV0dXJuIE5VTEw7DQorfQ0KKw0KK3N0YXRpYyBpbnQgaW5vdGlmeV9kZXZf aXNfd2F0Y2hpbmdfaW5vZGUoc3RydWN0IGlub3RpZnlfZGV2aWNlICpkZXYsDQorCQkJCQkgc3Ry dWN0IGlub2RlICppbm9kZSkNCit7DQorCXN0cnVjdCBpbm90aWZ5X3dhdGNoICp3YXRjaDsNCisN CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh3YXRjaCwgJmRldi0+d2F0Y2hlcywgZF9saXN0KSB7DQor CQlpZiAod2F0Y2gtPmlub2RlID09IGlub2RlKQ0KKwkJCXJldHVybiAxOw0KKwl9DQorCQ0KKwly ZXR1cm4gMDsNCit9DQorDQorLyoNCisgKiBpbm90aWZ5X2Rldl9hZGRfd2F0Y2hlciAtIGFkZCB0 aGUgZ2l2ZW4gd2F0Y2hlciB0byB0aGUgZ2l2ZW4gZGV2aWNlIGluc3RhbmNlDQorICoNCisgKiBD YWxsZXIgbXVzdCBob2xkIGRldi0+bG9jay4NCisgKi8NCitzdGF0aWMgaW50IGlub3RpZnlfZGV2 X2FkZF93YXRjaChzdHJ1Y3QgaW5vdGlmeV9kZXZpY2UgKmRldiwNCisJCQkJIHN0cnVjdCBpbm90 aWZ5X3dhdGNoICp3YXRjaCkNCit7DQorCWlmICghZGV2IHx8ICF3YXRjaCkNCisJCXJldHVybiAt RUlOVkFMOw0KKw0KKwlpZiAoZGV2X2ZpbmRfd2QgKGRldiwgd2F0Y2gtPndkKSkNCisJCXJldHVy biAtRUlOVkFMOw0KKw0KKwlpZiAoZGV2LT5ucl93YXRjaGVzID09IE1BWF9JTk9USUZZX0RFVl9X QVRDSEVTKQ0KKwkJcmV0dXJuIC1FTk9TUEM7DQorDQorCWxpc3RfYWRkKCZ3YXRjaC0+ZF9saXN0 LCAmZGV2LT53YXRjaGVzKTsNCisJcmV0dXJuIDA7DQorfQ0KKw0KKy8qDQorICogaW5vdGlmeV9k ZXZfcm1fd2F0Y2ggLSByZW1vdmUgdGhlIGdpdmVuIHdhdGNoIGZyb20gdGhlIGdpdmVuIGRldmlj ZQ0KKyAqDQorICogQ2FsbGVyIG11c3QgaG9sZCBkZXYtPmxvY2sgYmVjYXVzZSB3ZSBjYWxsIGlu b3RpZnlfZGV2X3F1ZXVlX2V2ZW50KCkuDQorICovDQorc3RhdGljIGludCBpbm90aWZ5X2Rldl9y bV93YXRjaChzdHJ1Y3QgaW5vdGlmeV9kZXZpY2UgKmRldiwNCisJCQkJc3RydWN0IGlub3RpZnlf d2F0Y2ggKndhdGNoKQ0KK3sNCisJaWYgKCF3YXRjaCkNCisJCXJldHVybiAtRUlOVkFMOw0KKw0K Kwlpbm90aWZ5X2Rldl9xdWV1ZV9ldmVudChkZXYsIHdhdGNoLCBJTl9JR05PUkVELCAwLCBOVUxM KTsNCisJbGlzdF9kZWwoJndhdGNoLT5kX2xpc3QpOw0KKw0KKwlyZXR1cm4gMDsNCit9DQorDQor dm9pZCBpbm9kZV91cGRhdGVfd2F0Y2hfbWFzayhzdHJ1Y3QgaW5vZGUgKmlub2RlKQ0KK3sNCisJ c3RydWN0IGlub3RpZnlfd2F0Y2ggKndhdGNoOw0KKwlfX3UzMiBuZXdfbWFzazsNCisNCisJaWYg KCFpbm9kZS0+aW5vdGlmeV9kYXRhKQ0KKwkJcmV0dXJuOw0KKw0KKwluZXdfbWFzayA9IDA7DQor CWxpc3RfZm9yX2VhY2hfZW50cnkod2F0Y2gsICZpbm9kZS0+aW5vdGlmeV9kYXRhLT53YXRjaGVz LCBpX2xpc3QpDQorCQluZXdfbWFzayB8PSB3YXRjaC0+bWFzazsNCisNCisJaW5vZGUtPmlub3Rp ZnlfZGF0YS0+d2F0Y2hfbWFzayA9IG5ld19tYXNrOw0KK30NCisNCisvKg0KKyAqIGlub2RlX2Fk ZF93YXRjaCAtIGFkZCBhIHdhdGNoIHRvIHRoZSBnaXZlbiBpbm9kZQ0KKyAqDQorICogQ2FsbGVy cyBtdXN0IGhvbGQgZGV2LT5sb2NrLCBiZWNhdXNlIHdlIGNhbGwgaW5vZGVfZmluZF9kZXYoKS4N CisgKi8NCitzdGF0aWMgaW50IGlub2RlX2FkZF93YXRjaChzdHJ1Y3QgaW5vZGUgKmlub2RlLA0K KwkJCSAgIHN0cnVjdCBpbm90aWZ5X3dhdGNoICp3YXRjaCkNCit7DQorCWlmICghaW5vZGUgfHwg IXdhdGNoIHx8IGlub2RlX2ZpbmRfZGV2KGlub2RlLCB3YXRjaC0+ZGV2KSkNCisJCXJldHVybiAt RUlOVkFMOw0KKw0KKwkvKg0KKwkgKiBUaGlzIGlub2RlIGRvZXNuJ3QgaGF2ZSBhbiBpbm90aWZ5 X2RhdGEgc3RydWN0dXJlIGF0dGFjaGVkIHRvIGl0DQorCSAqLw0KKwlpZiAoIWlub2RlLT5pbm90 aWZ5X2RhdGEpIHsNCisJCWlub2RlLT5pbm90aWZ5X2RhdGEgPSBrbWVtX2NhY2hlX2FsbG9jKGlu b2RlX2RhdGFfY2FjaGVwLA0KKwkJCQkJCQlHRlBfQVRPTUlDKTsNCisJCUlOSVRfTElTVF9IRUFE KCZpbm9kZS0+aW5vdGlmeV9kYXRhLT53YXRjaGVzKTsNCisJCWlub2RlLT5pbm90aWZ5X2RhdGEt PndhdGNoX21hc2sgPSAwOw0KKwkJaW5vZGUtPmlub3RpZnlfZGF0YS0+d2F0Y2hfY291bnQgPSAw Ow0KKwl9DQorCWxpc3RfYWRkKCZ3YXRjaC0+aV9saXN0LCAmaW5vZGUtPmlub3RpZnlfZGF0YS0+ d2F0Y2hlcyk7DQorCWlub2RlLT5pbm90aWZ5X2RhdGEtPndhdGNoX2NvdW50Kys7DQorCWlub2Rl X3VwZGF0ZV93YXRjaF9tYXNrKGlub2RlKTsNCisNCisJcmV0dXJuIDA7DQorfQ0KKw0KK3N0YXRp YyBpbnQgaW5vZGVfcm1fd2F0Y2goc3RydWN0IGlub2RlICppbm9kZSwNCisJCQkgIHN0cnVjdCBp bm90aWZ5X3dhdGNoICp3YXRjaCkNCit7DQorCWlmICghaW5vZGUgfHwgIXdhdGNoIHx8ICFpbm9k ZS0+aW5vdGlmeV9kYXRhKQ0KKwkJcmV0dXJuIC1FSU5WQUw7DQorDQorCWxpc3RfZGVsKCZ3YXRj aC0+aV9saXN0KTsNCisJaW5vZGUtPmlub3RpZnlfZGF0YS0+d2F0Y2hfY291bnQtLTsNCisNCisJ aWYgKCFpbm9kZS0+aW5vdGlmeV9kYXRhLT53YXRjaF9jb3VudCkgew0KKwkJa21lbV9jYWNoZV9m cmVlKGlub2RlX2RhdGFfY2FjaGVwLCBpbm9kZS0+aW5vdGlmeV9kYXRhKTsNCisJCWlub2RlLT5p bm90aWZ5X2RhdGEgPSBOVUxMOw0KKwl9DQorDQorCWlub2RlX3VwZGF0ZV93YXRjaF9tYXNrKGlu b2RlKTsNCisNCisJcmV0dXJuIDA7DQorfQ0KKw0KKy8qIEtlcm5lbCBBUEkgKi8NCisNCit2b2lk IGlub3RpZnlfaW5vZGVfcXVldWVfZXZlbnQoc3RydWN0IGlub2RlICppbm9kZSwgX191MzIgbWFz aywgX191MzIgY29va2llLA0KKwkJCSAgICAgICBjb25zdCBjaGFyICpmaWxlbmFtZSkNCit7DQor CXN0cnVjdCBpbm90aWZ5X3dhdGNoICp3YXRjaDsNCisNCisJaWYgKCFpbm9kZS0+aW5vdGlmeV9k YXRhKQ0KKwkJcmV0dXJuOw0KKw0KKwlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOw0KKw0KKwls aXN0X2Zvcl9lYWNoX2VudHJ5KHdhdGNoLCAmaW5vZGUtPmlub3RpZnlfZGF0YS0+d2F0Y2hlcywg aV9saXN0KSB7DQorCQlzcGluX2xvY2soJndhdGNoLT5kZXYtPmxvY2spOw0KKwkJaW5vdGlmeV9k ZXZfcXVldWVfZXZlbnQod2F0Y2gtPmRldiwgd2F0Y2gsIG1hc2ssIGNvb2tpZSwgZmlsZW5hbWUp Ow0KKwkJc3Bpbl91bmxvY2soJndhdGNoLT5kZXYtPmxvY2spOw0KKwl9DQorDQorCXNwaW5fdW5s b2NrKCZpbm9kZS0+aV9sb2NrKTsNCit9DQorRVhQT1JUX1NZTUJPTF9HUEwoaW5vdGlmeV9pbm9k ZV9xdWV1ZV9ldmVudCk7DQorDQordm9pZCBpbm90aWZ5X2RlbnRyeV9wYXJlbnRfcXVldWVfZXZl bnQoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBfX3UzMiBtYXNrLA0KKwkJCQkgICAgICAgX191MzIg Y29va2llLCBjb25zdCBjaGFyICpmaWxlbmFtZSkNCit7DQorCXN0cnVjdCBkZW50cnkgKnBhcmVu dDsNCisNCisJcGFyZW50ID0gZGdldF9wYXJlbnQoZGVudHJ5KTsNCisJaW5vdGlmeV9pbm9kZV9x dWV1ZV9ldmVudChwYXJlbnQtPmRfaW5vZGUsIG1hc2ssIGNvb2tpZSwgZmlsZW5hbWUpOw0KKwlk cHV0KHBhcmVudCk7DQorfQ0KK0VYUE9SVF9TWU1CT0xfR1BMKGlub3RpZnlfZGVudHJ5X3BhcmVu dF9xdWV1ZV9ldmVudCk7DQorDQorX191MzIgaW5vdGlmeV9nZXRfY29va2llKCkNCit7DQorCWF0 b21pY19pbmMoJmlub3RpZnlfY29va2llKTsNCisNCisJcmV0dXJuIGF0b21pY19yZWFkKCZpbm90 aWZ5X2Nvb2tpZSk7DQorfQ0KK0VYUE9SVF9TWU1CT0xfR1BMKGlub3RpZnlfZ2V0X2Nvb2tpZSk7 DQorDQorDQorc3RhdGljIHZvaWQgaWdub3JlX2hlbHBlcihzdHJ1Y3QgaW5vdGlmeV93YXRjaCAq d2F0Y2gsIGludCBldmVudCkNCit7DQorCXN0cnVjdCBpbm90aWZ5X2RldmljZSAqZGV2Ow0KKwlz dHJ1Y3QgaW5vZGUgKmlub2RlOw0KKw0KKwlpbm9kZSA9IHdhdGNoLT5pbm9kZTsNCisJZGV2ID0g d2F0Y2gtPmRldjsNCisNCisJc3Bpbl9sb2NrKCZpbm9kZS0+aV9sb2NrKTsNCisJc3Bpbl9sb2Nr KCZkZXYtPmxvY2spOw0KKw0KKwlpZiAoZXZlbnQpDQorCQlpbm90aWZ5X2Rldl9xdWV1ZV9ldmVu dChkZXYsIHdhdGNoLCBldmVudCwgMCwgTlVMTCk7DQorDQorCWlub2RlX3JtX3dhdGNoKGlub2Rl LCB3YXRjaCk7DQorCWlub3RpZnlfZGV2X3JtX3dhdGNoKHdhdGNoLT5kZXYsIHdhdGNoKTsNCisJ bGlzdF9kZWwoJndhdGNoLT51X2xpc3QpOw0KKw0KKwlkZWxldGVfd2F0Y2goZGV2LCB3YXRjaCk7 DQorCXNwaW5fdW5sb2NrKCZkZXYtPmxvY2spOw0KKwlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9j ayk7DQorDQorCXVucmVmX2lub2RlKGlub2RlKTsNCit9DQorDQorc3RhdGljIHZvaWQgcHJvY2Vz c191bW91bnRfbGlzdChzdHJ1Y3QgbGlzdF9oZWFkICp1bW91bnQpDQorew0KKwlzdHJ1Y3QgaW5v dGlmeV93YXRjaCAqd2F0Y2gsICpuZXh0Ow0KKw0KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUo d2F0Y2gsIG5leHQsIHVtb3VudCwgdV9saXN0KQ0KKwkJaWdub3JlX2hlbHBlcih3YXRjaCwgSU5f VU5NT1VOVCk7DQorfQ0KKw0KKy8qDQorICogYnVpbGRfdW1vdW50X2xpc3QgLSBidWlsZCBhIGxp c3Qgb2Ygd2F0Y2hlcyBhZmZlY3RlZCBieSBhbiB1bm1vdW50Lg0KKyAqDQorICogQ2FsbGVyIG11 c3QgaG9sZCBpbm9kZV9sb2NrLg0KKyAqLw0KK3N0YXRpYyB2b2lkIGJ1aWxkX3Vtb3VudF9saXN0 KHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsDQorCQkJICAg ICAgc3RydWN0IGxpc3RfaGVhZCAqdW1vdW50KQ0KK3sNCisJc3RydWN0IGlub2RlICppbm9kZTsN CisNCisJbGlzdF9mb3JfZWFjaF9lbnRyeShpbm9kZSwgaGVhZCwgaV9saXN0KSB7DQorCQlzdHJ1 Y3QgaW5vdGlmeV93YXRjaCAqd2F0Y2g7DQorDQorCQlpZiAoaW5vZGUtPmlfc2IgIT0gc2IpDQor CQkJY29udGludWU7DQorDQorCQlpZiAoIWlub2RlLT5pbm90aWZ5X2RhdGEpDQorCQkJY29udGlu dWU7DQorDQorCQlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOw0KKw0KKwkJbGlzdF9mb3JfZWFj aF9lbnRyeSh3YXRjaCwgJmlub2RlLT5pbm90aWZ5X2RhdGEtPndhdGNoZXMsDQorCQkJCSAgICBp X2xpc3QpDQorCQkJbGlzdF9hZGQoJndhdGNoLT51X2xpc3QsIHVtb3VudCk7DQorDQorCQlzcGlu X3VubG9jaygmaW5vZGUtPmlfbG9jayk7DQorCX0NCit9DQorDQordm9pZCBpbm90aWZ5X3N1cGVy X2Jsb2NrX3Vtb3VudChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQ0KK3sNCisJc3RydWN0IGxpc3Rf aGVhZCB1bW91bnQ7DQorDQorCUlOSVRfTElTVF9IRUFEKCZ1bW91bnQpOw0KKw0KKwlzcGluX2xv Y2soJmlub2RlX2xvY2spOw0KKwlidWlsZF91bW91bnRfbGlzdCgmaW5vZGVfaW5fdXNlLCBzYiwg JnVtb3VudCk7DQorCXNwaW5fdW5sb2NrKCZpbm9kZV9sb2NrKTsNCisNCisJcHJvY2Vzc191bW91 bnRfbGlzdCgmdW1vdW50KTsNCit9DQorRVhQT1JUX1NZTUJPTF9HUEwoaW5vdGlmeV9zdXBlcl9i bG9ja191bW91bnQpOw0KKw0KKy8qDQorICogaW5vdGlmeV9pbm9kZV9pc19kZWFkIC0gYW4gaW5v ZGUgaGFzIGJlZW4gZGVsZXRlZCwgY2xlYW51cCBhbnkgd2F0Y2hlcw0KKyAqDQorICogRklYTUU6 IENhbGxlcnMgbmVlZCB0byBhbHdheXMgaG9sZCBpbm9kZS0+aV9sb2NrLg0KKyAqLw0KK3ZvaWQg aW5vdGlmeV9pbm9kZV9pc19kZWFkKHN0cnVjdCBpbm9kZSAqaW5vZGUpDQorew0KKwlzdHJ1Y3Qg aW5vdGlmeV93YXRjaCAqd2F0Y2gsICpuZXh0Ow0KKwlzdHJ1Y3QgaW5vdGlmeV9pbm9kZV9kYXRh ICpkYXRhOw0KKw0KKwlkYXRhID0gaW5vZGUtPmlub3RpZnlfZGF0YTsNCisJaWYgKCFkYXRhKQ0K KwkJcmV0dXJuOw0KKw0KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUod2F0Y2gsIG5leHQsICZk YXRhLT53YXRjaGVzLCBpX2xpc3QpDQorCQlpZ25vcmVfaGVscGVyKHdhdGNoLCAwKTsNCit9DQor RVhQT1JUX1NZTUJPTF9HUEwoaW5vdGlmeV9pbm9kZV9pc19kZWFkKTsNCisNCisvKiBUaGUgZHJp dmVyIGludGVyZmFjZSBpcyBpbXBsZW1lbnRlZCBiZWxvdyAqLw0KKw0KK3N0YXRpYyB1bnNpZ25l ZCBpbnQgaW5vdGlmeV9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KQ0K K3sNCisgICAgICAgIHN0cnVjdCBpbm90aWZ5X2RldmljZSAqZGV2Ow0KKw0KKyAgICAgICAgZGV2 ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOw0KKw0KKyAgICAgICAgcG9sbF93YWl0KGZpbGUsICZkZXYt PndhaXQsIHdhaXQpOw0KKw0KKyAgICAgICAgaWYgKGlub3RpZnlfZGV2X2hhc19ldmVudHMoZGV2 KSkNCisgICAgICAgICAgICAgICAgcmV0dXJuIFBPTExJTiB8IFBPTExSRE5PUk07DQorDQorICAg ICAgICByZXR1cm4gMDsNCit9DQorDQorc3RhdGljIHNzaXplX3QgaW5vdGlmeV9yZWFkKHN0cnVj dCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLA0KKwkJCSAgICBzaXplX3QgY291bnQsIGxv ZmZfdCAqcG9zKQ0KK3sNCisJc2l6ZV90IGV2ZW50X3NpemU7DQorCXN0cnVjdCBpbm90aWZ5X2Rl dmljZSAqZGV2Ow0KKwljaGFyICpzdGFydDsNCisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3Vy cmVudCk7DQorDQorCXN0YXJ0ID0gYnVmOw0KKwlkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7DQor DQorCS8qIFdlIG9ubHkgaGFuZCBvdXQgZnVsbCBpbm90aWZ5IGV2ZW50cyAqLw0KKwlldmVudF9z aXplID0gc2l6ZW9mKHN0cnVjdCBpbm90aWZ5X2V2ZW50KTsNCisJaWYgKGNvdW50IDwgZXZlbnRf c2l6ZSkNCisJCXJldHVybiAtRUlOVkFMOw0KKw0KKwl3aGlsZSgxKSB7DQorCQlpbnQgaGFzX2V2 ZW50czsNCisNCisJCXNwaW5fbG9jaygmZGV2LT5sb2NrKTsNCisJCWhhc19ldmVudHMgPSBpbm90 aWZ5X2Rldl9oYXNfZXZlbnRzKGRldik7DQorCQlzcGluX3VubG9jaygmZGV2LT5sb2NrKTsNCisJ CWlmIChoYXNfZXZlbnRzKQ0KKwkJCWJyZWFrOw0KKw0KKwkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBP X05PTkJMT0NLKQ0KKwkJCXJldHVybiAtRUFHQUlOOw0KKw0KKwkJaWYgKHNpZ25hbF9wZW5kaW5n KGN1cnJlbnQpKQ0KKwkJCXJldHVybiAtRVJFU1RBUlRTWVM7DQorDQorCQlhZGRfd2FpdF9xdWV1 ZSgmZGV2LT53YWl0LCAmd2FpdCk7DQorCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQ VElCTEUpOw0KKw0KKwkJc2NoZWR1bGUoKTsNCisNCisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tf UlVOTklORyk7CQkNCisJCXJlbW92ZV93YWl0X3F1ZXVlKCZkZXYtPndhaXQsICZ3YWl0KTsNCisJ fQ0KKw0KKwl3aGlsZSAoY291bnQgPj0gZXZlbnRfc2l6ZSkgew0KKwkJc3RydWN0IGlub3RpZnlf a2VybmVsX2V2ZW50ICprZXZlbnQ7DQorDQorCQlzcGluX2xvY2soJmRldi0+bG9jayk7DQorCQlp ZiAoIWlub3RpZnlfZGV2X2hhc19ldmVudHMoZGV2KSkgew0KKwkJCXNwaW5fdW5sb2NrKCZkZXYt PmxvY2spOw0KKwkJCWJyZWFrOw0KKwkJfQ0KKwkJa2V2ZW50ID0gaW5vdGlmeV9kZXZfZ2V0X2V2 ZW50KGRldik7DQorCQlzcGluX3VubG9jaygmZGV2LT5sb2NrKTsNCisJCWlmIChjb3B5X3RvX3Vz ZXIoYnVmLCAma2V2ZW50LT5ldmVudCwgZXZlbnRfc2l6ZSkpDQorCQkJcmV0dXJuIC1FRkFVTFQ7 DQorDQorCQlzcGluX2xvY2soJmRldi0+bG9jayk7DQorCQlpbm90aWZ5X2Rldl9ldmVudF9kZXF1 ZXVlKGRldik7DQorCQlzcGluX3VubG9jaygmZGV2LT5sb2NrKTsNCisJCWNvdW50IC09IGV2ZW50 X3NpemU7DQorCQlidWYgKz0gZXZlbnRfc2l6ZTsNCisJfQ0KKw0KKwlyZXR1cm4gYnVmIC0gc3Rh cnQ7DQorfQ0KKw0KK3N0YXRpYyBpbnQgaW5vdGlmeV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUs IHN0cnVjdCBmaWxlICpmaWxlKQ0KK3sNCisJc3RydWN0IGlub3RpZnlfZGV2aWNlICpkZXY7DQor DQorCWlmIChhdG9taWNfcmVhZCgmd2F0Y2hfY291bnQpID09IE1BWF9JTk9USUZZX0RFVlMpDQor CQlyZXR1cm4gLUVOT0RFVjsNCisNCisJYXRvbWljX2luYygmd2F0Y2hfY291bnQpOw0KKw0KKwlk ZXYgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaW5vdGlmeV9kZXZpY2UpLCBHRlBfS0VSTkVMKTsN CisJaWYgKCFkZXYpDQorCQlyZXR1cm4gLUVOT01FTTsNCisNCisJYml0bWFwX3plcm8oZGV2LT5i aXRtYXNrLCBNQVhfSU5PVElGWV9ERVZfV0FUQ0hFUyk7DQorDQorCUlOSVRfTElTVF9IRUFEKCZk ZXYtPmV2ZW50cyk7DQorCUlOSVRfTElTVF9IRUFEKCZkZXYtPndhdGNoZXMpOw0KKwlpbml0X3dh aXRxdWV1ZV9oZWFkKCZkZXYtPndhaXQpOw0KKw0KKwlkZXYtPmV2ZW50X2NvdW50ID0gMDsNCisJ ZGV2LT5ucl93YXRjaGVzID0gMDsNCisJZGV2LT5sb2NrID0gU1BJTl9MT0NLX1VOTE9DS0VEOw0K Kw0KKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBkZXY7DQorDQorCXByaW50ayhLRVJOX0FMRVJUICJp bm90aWZ5IGRldmljZSBvcGVuZWRcbiIpOw0KKw0KKwlyZXR1cm4gMDsNCit9DQorDQorLyoNCisg KiBpbm90aWZ5X3JlbGVhc2VfYWxsX3dhdGNoZXMgLSBkZXN0cm95IGFsbCB3YXRjaGVzIG9uIGEg Z2l2ZW4gZGV2aWNlDQorICovDQorc3RhdGljIHZvaWQgaW5vdGlmeV9yZWxlYXNlX2FsbF93YXRj aGVzKHN0cnVjdCBpbm90aWZ5X2RldmljZSAqZGV2KQ0KK3sNCisJc3RydWN0IGlub3RpZnlfd2F0 Y2ggKndhdGNoLCpuZXh0Ow0KKw0KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUod2F0Y2gsIG5l eHQsICZkZXYtPndhdGNoZXMsIGRfbGlzdCkNCisJCWlnbm9yZV9oZWxwZXIod2F0Y2gsIDApOw0K K30NCisNCisvKg0KKyAqIGlub3RpZnlfcmVsZWFzZV9hbGxfZXZlbnRzIC0gZGVzdHJveSBhbGwg b2YgdGhlIGV2ZW50cyBvbiBhIGdpdmVuIGRldmljZQ0KKyAqLw0KK3N0YXRpYyB2b2lkIGlub3Rp ZnlfcmVsZWFzZV9hbGxfZXZlbnRzKHN0cnVjdCBpbm90aWZ5X2RldmljZSAqZGV2KQ0KK3sNCisJ c3Bpbl9sb2NrKCZkZXYtPmxvY2spOw0KKwl3aGlsZSAoaW5vdGlmeV9kZXZfaGFzX2V2ZW50cyhk ZXYpKQ0KKwkJaW5vdGlmeV9kZXZfZXZlbnRfZGVxdWV1ZShkZXYpOw0KKwlzcGluX3VubG9jaygm ZGV2LT5sb2NrKTsNCit9DQorDQorc3RhdGljIGludCBpbm90aWZ5X3JlbGVhc2Uoc3RydWN0IGlu b2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpDQorew0KKwlzdHJ1Y3QgaW5vdGlmeV9kZXZp Y2UgKmRldjsNCisNCisJZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOw0KKwlpbm90aWZ5X3JlbGVh c2VfYWxsX3dhdGNoZXMoZGV2KTsNCisJaW5vdGlmeV9yZWxlYXNlX2FsbF9ldmVudHMoZGV2KTsN CisJa2ZyZWUoZGV2KTsNCisNCisJcHJpbnRrKEtFUk5fQUxFUlQgImlub3RpZnkgZGV2aWNlIHJl bGVhc2VkXG4iKTsNCisNCisJYXRvbWljX2RlYygmd2F0Y2hfY291bnQpOw0KKwlyZXR1cm4gMDsN Cit9DQorDQorc3RhdGljIGludCBpbm90aWZ5X3dhdGNoKHN0cnVjdCBpbm90aWZ5X2RldmljZSAq ZGV2LA0KKwkJCSBzdHJ1Y3QgaW5vdGlmeV93YXRjaF9yZXF1ZXN0ICpyZXF1ZXN0KQ0KK3sNCisJ c3RydWN0IGlub2RlICppbm9kZTsNCisJc3RydWN0IGlub3RpZnlfd2F0Y2ggKndhdGNoOw0KKw0K Kwlpbm9kZSA9IGZpbmRfaW5vZGUocmVxdWVzdC0+ZGlybmFtZSk7DQorCWlmIChJU19FUlIoaW5v ZGUpKQ0KKwkJcmV0dXJuIFBUUl9FUlIoaW5vZGUpOw0KKw0KKwlpZiAoIVNfSVNESVIoaW5vZGUt PmlfbW9kZSkpDQorCQlpcHJpbnRrKElOT1RJRllfREVCVUdfRVJST1JTLCAid2F0Y2hpbmcgZmls ZVxuIik7DQorDQorCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7DQorCXNwaW5fbG9jaygmZGV2 LT5sb2NrKTsNCisNCisJLyoNCisJICogVGhpcyBoYW5kbGVzIHRoZSBjYXNlIG9mIHJlLWFkZGlu ZyBhIGRpcmVjdG9yeSB3ZSBhcmUgYWxyZWFkeQ0KKwkgKiB3YXRjaGluZywgd2UganVzdCB1cGRh dGUgdGhlIG1hc2sgYW5kIHJldHVybiAwDQorCSAqLw0KKwlpZiAoaW5vdGlmeV9kZXZfaXNfd2F0 Y2hpbmdfaW5vZGUoZGV2LCBpbm9kZSkpIHsNCisJCXN0cnVjdCBpbm90aWZ5X3dhdGNoICpvd2F0 Y2g7CS8qIHRoZSBvbGQgd2F0Y2ggKi8NCisNCisJCWlwcmludGsoSU5PVElGWV9ERUJVR19FUlJP UlMsDQorCQkJCSJhZGp1c3RpbmcgZXZlbnQgbWFzayBmb3IgaW5vZGUgJXBcbiIsIGlub2RlKTsN CisNCisJCW93YXRjaCA9IGlub2RlX2ZpbmRfZGV2KGlub2RlLCBkZXYpOw0KKwkJb3dhdGNoLT5t YXNrID0gcmVxdWVzdC0+bWFzazsNCisJCWlub2RlX3VwZGF0ZV93YXRjaF9tYXNrKGlub2RlKTsN CisJCXNwaW5fdW5sb2NrKCZkZXYtPmxvY2spOw0KKwkJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xv Y2spOwkJDQorCQl1bnJlZl9pbm9kZShpbm9kZSk7DQorDQorCQlyZXR1cm4gMDsNCisJfQ0KKw0K KwlzcGluX3VubG9jaygmZGV2LT5sb2NrKTsNCisJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2sp OwkNCisNCisJd2F0Y2ggPSBjcmVhdGVfd2F0Y2goZGV2LCByZXF1ZXN0LT5tYXNrLCBpbm9kZSk7 DQorCWlmICghd2F0Y2gpIHsNCisJCXVucmVmX2lub2RlKGlub2RlKTsNCisJCXJldHVybiAtRU5P U1BDOw0KKwl9DQorDQorCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7DQorCXNwaW5fbG9jaygm ZGV2LT5sb2NrKTsNCisNCisJLyogV2UgY2FuJ3QgYWRkIGFueW1vcmUgd2F0Y2hlcyB0byB0aGlz IGRldmljZSAqLw0KKwlpZiAoaW5vdGlmeV9kZXZfYWRkX3dhdGNoKGRldiwgd2F0Y2gpID09IC1F Tk9TUEMpIHsNCisJCWlwcmludGsoSU5PVElGWV9ERUJVR19FUlJPUlMsDQorCQkJImNhbid0IGFk ZCB3YXRjaCBkZXYgaXMgZnVsbFxuIik7DQorCQlkZWxldGVfd2F0Y2goZGV2LCB3YXRjaCk7DQor CQlzcGluX3VubG9jaygmZGV2LT5sb2NrKTsNCisJCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2Nr KTsJCQ0KKwkJdW5yZWZfaW5vZGUoaW5vZGUpOw0KKwkJcmV0dXJuIC1FTk9TUEM7DQorCX0NCisN CisJaW5vZGVfYWRkX3dhdGNoKGlub2RlLCB3YXRjaCk7DQorDQorCXNwaW5fdW5sb2NrKCZkZXYt PmxvY2spOw0KKwlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7DQorDQorCXJldHVybiB3YXRj aC0+d2Q7DQorfQ0KKw0KK3N0YXRpYyBpbnQgaW5vdGlmeV9pZ25vcmUoc3RydWN0IGlub3RpZnlf ZGV2aWNlICpkZXYsIGludCB3ZCkNCit7DQorCXN0cnVjdCBpbm90aWZ5X3dhdGNoICp3YXRjaDsN CisNCisJd2F0Y2ggPSBkZXZfZmluZF93ZChkZXYsIHdkKTsNCisJaWYgKCF3YXRjaCkNCisJCXJl dHVybiAtRUlOVkFMOw0KKwlpZ25vcmVfaGVscGVyKHdhdGNoLCAwKTsNCisNCisJcmV0dXJuIDA7 DQorfQ0KKw0KK3N0YXRpYyB2b2lkIGlub3RpZnlfcHJpbnRfc3RhdHMoc3RydWN0IGlub3RpZnlf ZGV2aWNlICpkZXYpDQorew0KKwlpbnQgc2l6ZW9mX2lub3RpZnlfd2F0Y2g7DQorCWludCBzaXpl b2ZfaW5vdGlmeV9kZXZpY2U7DQorCWludCBzaXplb2ZfaW5vdGlmeV9rZXJuZWxfZXZlbnQ7DQor DQorCXNpemVvZl9pbm90aWZ5X3dhdGNoID0gc2l6ZW9mIChzdHJ1Y3QgaW5vdGlmeV93YXRjaCk7 DQorCXNpemVvZl9pbm90aWZ5X2RldmljZSA9IHNpemVvZiAoc3RydWN0IGlub3RpZnlfZGV2aWNl KTsNCisJc2l6ZW9mX2lub3RpZnlfa2VybmVsX2V2ZW50ID0gc2l6ZW9mIChzdHJ1Y3QgaW5vdGlm eV9rZXJuZWxfZXZlbnQpOw0KKw0KKwlwcmludGsoS0VSTl9BTEVSVCAiR0xPQkFMIElOT1RJRlkg U1RBVFNcbiIpOw0KKwlwcmludGsoS0VSTl9BTEVSVCAid2F0Y2hfY291bnQgPSAlZFxuIiwgYXRv bWljX3JlYWQoJndhdGNoX2NvdW50KSk7DQorDQorCXByaW50ayhLRVJOX0FMRVJUICJzaXplb2Yo c3RydWN0IGlub3RpZnlfd2F0Y2gpID0gJWRcbiIsDQorCQlzaXplb2ZfaW5vdGlmeV93YXRjaCk7 DQorCXByaW50ayhLRVJOX0FMRVJUICJzaXplb2Yoc3RydWN0IGlub3RpZnlfZGV2aWNlKSA9ICVk XG4iLA0KKwkJc2l6ZW9mX2lub3RpZnlfZGV2aWNlKTsNCisJcHJpbnRrKEtFUk5fQUxFUlQgInNp emVvZihzdHJ1Y3QgaW5vdGlmeV9rZXJuZWxfZXZlbnQpID0gJWRcbiIsDQorCQlzaXplb2ZfaW5v dGlmeV9rZXJuZWxfZXZlbnQpOw0KKw0KKwlzcGluX2xvY2soJmRldi0+bG9jayk7DQorDQorCXBy aW50ayhLRVJOX0FMRVJUICJpbm90aWZ5IGRldmljZTogJXBcbiIsIGRldik7DQorCXByaW50ayhL RVJOX0FMRVJUICJpbm90aWZ5IGV2ZW50X2NvdW50OiAldVxuIiwgZGV2LT5ldmVudF9jb3VudCk7 DQorCXByaW50ayhLRVJOX0FMRVJUICJpbm90aWZ5IHdhdGNoX2NvdW50OiAlZFxuIiwgZGV2LT5u cl93YXRjaGVzKTsNCisNCisJc3Bpbl91bmxvY2soJmRldi0+bG9jayk7DQorfQ0KKw0KKy8qDQor ICogaW5vdGlmeV9pb2N0bCgpIC0gb3VyIGRldmljZSBmaWxlJ3MgaW9jdGwgbWV0aG9kDQorICoN CisgKiBUaGUgVkZTIHNlcmlhbGl6ZXMgYWxsIG9mIG91ciBjYWxscyB2aWEgdGhlIEJLTCBhbmQg d2UgcmVseSBvbiB0aGF0LiAgV2UNCisgKiBjb3VsZCwgYWx0ZXJuYXRpdmVseSwgZ3JhYiBkZXYt PmxvY2suICBSaWdodCBub3cgbG93ZXIgbGV2ZWxzIGdyYWIgdGhhdA0KKyAqIHdoZXJlIG5lZWRl ZC4NCisgKi8NCitzdGF0aWMgaW50IGlub3RpZnlfaW9jdGwoc3RydWN0IGlub2RlICppcCwgc3Ry dWN0IGZpbGUgKmZwLA0KKwkJCSB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykN Cit7DQorCXN0cnVjdCBpbm90aWZ5X2RldmljZSAqZGV2Ow0KKwlzdHJ1Y3QgaW5vdGlmeV93YXRj aF9yZXF1ZXN0IHJlcXVlc3Q7DQorCXZvaWQgX191c2VyICpwOw0KKwlpbnQgd2Q7DQorDQorCWRl diA9IGZwLT5wcml2YXRlX2RhdGE7DQorCXAgPSAodm9pZCBfX3VzZXIgKikgYXJnOw0KKw0KKwlz d2l0Y2ggKGNtZCkgew0KKwljYXNlIElOT1RJRllfV0FUQ0g6DQorCQlpcHJpbnRrKElOT1RJRllf REVCVUdfRVJST1JTLCAiSU5PVElGWV9XQVRDSCBpb2N0bFxuIik7DQorCQlpZiAoY29weV9mcm9t X3VzZXIoJnJlcXVlc3QsIHAsIHNpemVvZiAocmVxdWVzdCkpKQ0KKwkJCXJldHVybiAtRUZBVUxU Ow0KKwkJcmV0dXJuIGlub3RpZnlfd2F0Y2goZGV2LCAmcmVxdWVzdCk7DQorCWNhc2UgSU5PVElG WV9JR05PUkU6DQorCQlpcHJpbnRrKElOT1RJRllfREVCVUdfRVJST1JTLCAiSU5PVElGWV9JR05P UkUgaW9jdGxcbiIpOw0KKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZ3ZCwgcCwgc2l6ZW9mICh3ZCkp KQ0KKwkJCXJldHVybiAtRUZBVUxUOw0KKwkJcmV0dXJuIGlub3RpZnlfaWdub3JlKGRldiwgd2Qp Ow0KKwljYXNlIElOT1RJRllfU1RBVFM6DQorCQlpcHJpbnRrKElOT1RJRllfREVCVUdfRVJST1JT LCAiSU5PVElGWV9TVEFUUyBpb2N0bFxuIik7DQorCQlpbm90aWZ5X3ByaW50X3N0YXRzKGRldik7 DQorCQlyZXR1cm4gMDsNCisJY2FzZSBJTk9USUZZX1NFVERFQlVHOg0KKwkJaXByaW50ayhJTk9U SUZZX0RFQlVHX0VSUk9SUywgIklOT1RJRllfU0VUREVCVUcgaW9jdGxcbiIpOw0KKwkJaWYgKGNv cHlfZnJvbV91c2VyKCZpbm90aWZ5X2RlYnVnX2ZsYWdzLCBwLCBzaXplb2YgKGludCkpKQ0KKwkJ CXJldHVybiAtRUZBVUxUOw0KKwkJcmV0dXJuIDA7DQorCWRlZmF1bHQ6DQorCQlyZXR1cm4gLUVO T1RUWTsNCisJfQ0KK30NCisNCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpbm90aWZ5 X2ZvcHMgPSB7DQorCS5vd25lcgkJPSBUSElTX01PRFVMRSwNCisJLnBvbGwJCT0gaW5vdGlmeV9w b2xsLA0KKwkucmVhZAkJPSBpbm90aWZ5X3JlYWQsDQorCS5vcGVuCQk9IGlub3RpZnlfb3BlbiwN CisJLnJlbGVhc2UJPSBpbm90aWZ5X3JlbGVhc2UsDQorCS5pb2N0bAkJPSBpbm90aWZ5X2lvY3Rs LA0KK307DQorDQorc3RydWN0IG1pc2NkZXZpY2UgaW5vdGlmeV9kZXZpY2UgPSB7DQorCS5taW5v ciAgPSBNSVNDX0RZTkFNSUNfTUlOT1IsDQorCS5uYW1lCT0gImlub3RpZnkiLA0KKwkuZm9wcwk9 ICZpbm90aWZ5X2ZvcHMsDQorfTsNCisNCitzdGF0aWMgaW50IF9faW5pdCBpbm90aWZ5X2luaXQo dm9pZCkNCit7DQorCWludCByZXQ7DQorDQorCXJldCA9IG1pc2NfcmVnaXN0ZXIoJmlub3RpZnlf ZGV2aWNlKTsNCisJaWYgKHJldCkNCisJCWdvdG8gb3V0Ow0KKw0KKwlhdG9taWNfc2V0KCZ3YXRj aF9jb3VudCwgMCk7DQorCWF0b21pY19zZXQoJmlub3RpZnlfY29va2llLCAwKTsNCisJaW5vdGlm eV9kZWJ1Z19mbGFncyA9IElOT1RJRllfREVCVUdfTk9ORTsNCisNCisJd2F0Y2hfY2FjaGVwID0g a21lbV9jYWNoZV9jcmVhdGUoImlub3RpZnlfd2F0Y2hfY2FjaGUiLA0KKwkJCXNpemVvZihzdHJ1 Y3QgaW5vdGlmeV93YXRjaCksIDAsIFNMQUJfUEFOSUMsDQorCQkJTlVMTCwgTlVMTCk7DQorDQor CWV2ZW50X2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJpbm90aWZ5X2V2ZW50X2NhY2hlIiwN CisJCQlzaXplb2Yoc3RydWN0IGlub3RpZnlfa2VybmVsX2V2ZW50KSwgMCwNCisJCQlTTEFCX1BB TklDLCBOVUxMLCBOVUxMKTsNCisNCisJaW5vZGVfZGF0YV9jYWNoZXAgPSBrbWVtX2NhY2hlX2Ny ZWF0ZSgiaW5vdGlmeV9pbm9kZV9kYXRhX2NhY2hlIiwNCisJCQlzaXplb2Yoc3RydWN0IGlub3Rp ZnlfaW5vZGVfZGF0YSksIDAsIFNMQUJfUEFOSUMsDQorCQkJTlVMTCwgTlVMTCk7DQorDQorCXBy aW50ayhLRVJOX0lORk8gImlub3RpZnkgaW5pdDogbWlub3I9JWRcbiIsIGlub3RpZnlfZGV2aWNl Lm1pbm9yKTsNCitvdXQ6DQorCXJldHVybiByZXQ7DQorfQ0KKw0KK21vZHVsZV9pbml0KGlub3Rp ZnlfaW5pdCk7DQotLS0gY2xlYW4vbGludXgvaW5jbHVkZS9saW51eC9pbm90aWZ5LmgJMTk2OS0x Mi0zMSAxOTowMDowMC4wMDAwMDAwMDAgLTA1MDANCisrKyBsaW51eC9pbmNsdWRlL2xpbnV4L2lu b3RpZnkuaAkyMDA0LTEwLTA2IDE2OjE2OjUyLjAwMDAwMDAwMCAtMDQwMA0KQEAgLTAsMCArMSwx NTIgQEANCisvKg0KKyAqIElub2RlIGJhc2VkIGRpcmVjdG9yeSBub3RpZmljYXRpb24gZm9yIExp bnV4DQorICoNCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgSm9obiBNY0N1dGNoYW4NCisgKi8NCisN CisjaWZuZGVmIF9MSU5VWF9JTk9USUZZX0gNCisjZGVmaW5lIF9MSU5VWF9JTk9USUZZX0gNCisN CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4NCisjaW5jbHVkZSA8bGludXgvbGltaXRzLmg+DQor DQorLyogdGhpcyBzaXplIGNvdWxkIGxpbWl0IHRoaW5ncywgc2luY2UgdGVjaG5pY2FsbHkgd2Ug Y291bGQgbmVlZCBQQVRIX01BWCAqLw0KKyNkZWZpbmUgSU5PVElGWV9GSUxFTkFNRV9NQVgJMjU2 DQorDQorLyoNCisgKiBzdHJ1Y3QgaW5vdGlmeV9ldmVudCAtIHN0cnVjdHVyZSByZWFkIGZyb20g dGhlIGlub3RpZnkgZGV2aWNlIGZvciBlYWNoIGV2ZW50DQorICoNCisgKiBXaGVuIHlvdSBhcmUg d2F0Y2hpbmcgYSBkaXJlY3RvcnksIHlvdSB3aWxsIHJlY2VpdmUgdGhlIGZpbGVuYW1lIGZvciBl dmVudHMNCisgKiBzdWNoIGFzIElOX0NSRUFURSwgSU5fREVMRVRFLCBJTl9PUEVOLCBJTl9DTE9T RSwgLi4uDQorICoNCisgKiBOb3RlOiBXaGVuIHJlYWRpbmcgZnJvbSB0aGUgZGV2aWNlIHlvdSBt dXN0IHByb3ZpZGUgYSBidWZmZXIgdGhhdCBpcyBhDQorICogbXVsdGlwbGUgb2Ygc2l6ZW9mKHN0 cnVjdCBpbm90aWZ5X2V2ZW50KQ0KKyAqLw0KK3N0cnVjdCBpbm90aWZ5X2V2ZW50IHsNCisJX19z MzIgd2Q7DQorCV9fdTMyIG1hc2s7DQorCV9fdTMyIGNvb2tpZTsNCisJY2hhciBmaWxlbmFtZVtJ Tk9USUZZX0ZJTEVOQU1FX01BWF07DQorfTsNCisNCisvKg0KKyAqIHN0cnVjdCBpbm90aWZ5X3dh dGNoX3JlcXVlc3QgLSByZXByZXNlbnRzIGEgd2F0Y2ggcmVxdWVzdA0KKyAqDQorICogUGFzcyB0 byB0aGUgaW5vdGlmeSBkZXZpY2UgdmlhIHRoZSBJTk9USUZZX1dBVENIIGlvY3RsDQorICovDQor c3RydWN0IGlub3RpZnlfd2F0Y2hfcmVxdWVzdCB7DQorCWNoYXIgKmRpcm5hbWU7CQkvKiBkaXJl Y3RvcnkgbmFtZSAqLw0KKwlfX3UzMiBtYXNrOwkJLyogZXZlbnQgbWFzayAqLw0KK307DQorDQor LyogdGhlIGZvbGxvd2luZyBhcmUgbGVnYWwsIGltcGxlbWVudGVkIGV2ZW50cyAqLw0KKyNkZWZp bmUgSU5fQUNDRVNTCQkweDAwMDAwMDAxCS8qIEZpbGUgd2FzIGFjY2Vzc2VkICovDQorI2RlZmlu ZSBJTl9NT0RJRlkJCTB4MDAwMDAwMDIJLyogRmlsZSB3YXMgbW9kaWZpZWQgKi8NCisjZGVmaW5l IElOX0FUVFJJQgkJMHgwMDAwMDAwNAkvKiBGaWxlIGNoYW5nZWQgYXR0cmlidXRlcyAqLw0KKyNk ZWZpbmUgSU5fQ0xPU0VfV1JJVEUJCTB4MDAwMDAwMDgJLyogV3JpdHRhYmxlIGZpbGUgd2FzIGNs b3NlZCAqLw0KKyNkZWZpbmUgSU5fQ0xPU0VfTk9XUklURQkweDAwMDAwMDEwCS8qIFVud3JpdHRh YmxlIGZpbGUgY2xvc2VkICovDQorI2RlZmluZSBJTl9PUEVOCQkJMHgwMDAwMDAyMAkvKiBGaWxl IHdhcyBvcGVuZWQgKi8NCisjZGVmaW5lIElOX01PVkVEX0ZST00JCTB4MDAwMDAwNDAJLyogRmls ZSB3YXMgbW92ZWQgZnJvbSBYICovDQorI2RlZmluZSBJTl9NT1ZFRF9UTwkJMHgwMDAwMDA4MAkv KiBGaWxlIHdhcyBtb3ZlZCB0byBZICovDQorI2RlZmluZSBJTl9ERUxFVEVfU1VCRElSCTB4MDAw MDAxMDAJLyogU3ViZGlyIHdhcyBkZWxldGVkICovIA0KKyNkZWZpbmUgSU5fREVMRVRFX0ZJTEUJ CTB4MDAwMDAyMDAJLyogU3ViZmlsZSB3YXMgZGVsZXRlZCAqLw0KKyNkZWZpbmUgSU5fQ1JFQVRF X1NVQkRJUgkweDAwMDAwNDAwCS8qIFN1YmRpciB3YXMgY3JlYXRlZCAqLw0KKyNkZWZpbmUgSU5f Q1JFQVRFX0ZJTEUJCTB4MDAwMDA4MDAJLyogU3ViZmlsZSB3YXMgY3JlYXRlZCAqLw0KKyNkZWZp bmUgSU5fREVMRVRFX1NFTEYJCTB4MDAwMDEwMDAJLyogU2VsZiB3YXMgZGVsZXRlZCAqLw0KKyNk ZWZpbmUgSU5fVU5NT1VOVAkJMHgwMDAwMjAwMAkvKiBCYWNraW5nIGZzIHdhcyB1bm1vdW50ZWQg Ki8NCisjZGVmaW5lIElOX1FfT1ZFUkZMT1cJCTB4MDAwMDQwMDAJLyogRXZlbnQgcXVldWVkIG92 ZXJmbG93ZWQgKi8NCisjZGVmaW5lIElOX0lHTk9SRUQJCTB4MDAwMDgwMDAJLyogRmlsZSB3YXMg aWdub3JlZCAqLw0KKw0KKy8qIHNwZWNpYWwgZmxhZ3MgKi8NCisjZGVmaW5lIElOX0FMTF9FVkVO VFMJCTB4ZmZmZmZmZmYJLyogQWxsIHRoZSBldmVudHMgKi8NCisjZGVmaW5lIElOX0NMT1NFCQko SU5fQ0xPU0VfV1JJVEUgfCBJTl9DTE9TRV9OT1dSSVRFKQ0KKw0KKyNkZWZpbmUgSU5PVElGWV9J T0NUTF9NQUdJQwknUScNCisjZGVmaW5lIElOT1RJRllfSU9DVExfTUFYTlIJNA0KKw0KKyNkZWZp bmUgSU5PVElGWV9XQVRDSCAgCQlfSU9SKElOT1RJRllfSU9DVExfTUFHSUMsIDEsIHN0cnVjdCBp bm90aWZ5X3dhdGNoX3JlcXVlc3QpDQorI2RlZmluZSBJTk9USUZZX0lHTk9SRSAJCV9JT1IoSU5P VElGWV9JT0NUTF9NQUdJQywgMiwgaW50KQ0KKyNkZWZpbmUgSU5PVElGWV9TVEFUUwkJX0lPUihJ Tk9USUZZX0lPQ1RMX01BR0lDLCAzLCBpbnQpDQorI2RlZmluZSBJTk9USUZZX1NFVERFQlVHCV9J T1IoSU5PVElGWV9JT0NUTF9NQUdJQywgNCwgaW50KQ0KKw0KKyNkZWZpbmUgSU5PVElGWV9ERUJV R19OT05FCTB4MDAwMDAwMDANCisjZGVmaW5lIElOT1RJRllfREVCVUdfQUxMT0MJMHgwMDAwMDAw MQ0KKyNkZWZpbmUgSU5PVElGWV9ERUJVR19FVkVOVFMJMHgwMDAwMDAwMg0KKyNkZWZpbmUgSU5P VElGWV9ERUJVR19JTk9ERQkweDAwMDAwMDA0DQorI2RlZmluZSBJTk9USUZZX0RFQlVHX0VSUk9S UwkweDAwMDAwMDA4DQorI2RlZmluZSBJTk9USUZZX0RFQlVHX0ZJTEVOCTB4MDAwMDAwMTANCisj ZGVmaW5lIElOT1RJRllfREVCVUdfQUxMCTB4ZmZmZmZmZmYNCisNCisjaWZkZWYgX19LRVJORUxf Xw0KKw0KKyNpbmNsdWRlIDxsaW51eC9kY2FjaGUuaD4NCisjaW5jbHVkZSA8bGludXgvZnMuaD4N CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+DQorDQorc3RydWN0IGlub3RpZnlfaW5vZGVfZGF0 YSB7DQorCXN0cnVjdCBsaXN0X2hlYWQgd2F0Y2hlczsNCisJX191MzIgd2F0Y2hfbWFzazsNCisJ aW50IHdhdGNoX2NvdW50Ow0KK307DQorDQorI2lmZGVmIENPTkZJR19JTk9USUZZDQorDQorZXh0 ZXJuIHZvaWQgaW5vdGlmeV9pbm9kZV9xdWV1ZV9ldmVudChzdHJ1Y3QgaW5vZGUgKiwgX191MzIs IF9fdTMyLCBjb25zdCBjaGFyICopOw0KK2V4dGVybiB2b2lkIGlub3RpZnlfZGVudHJ5X3BhcmVu dF9xdWV1ZV9ldmVudChzdHJ1Y3QgZGVudHJ5ICosIF9fdTMyLCBfX3UzMiwNCisJCQkJCSAgICAg IGNvbnN0IGNoYXIgKik7DQorZXh0ZXJuIHZvaWQgaW5vdGlmeV9zdXBlcl9ibG9ja191bW91bnQo c3RydWN0IHN1cGVyX2Jsb2NrICopOw0KK2V4dGVybiB2b2lkIGlub3RpZnlfaW5vZGVfaXNfZGVh ZChzdHJ1Y3QgaW5vZGUgKik7DQorZXh0ZXJuIF9fdTMyICBpbm90aWZ5X2dldF9jb29raWUgKHZv aWQpOw0KKw0KKy8qIHRoaXMgY291bGQgYmUga3N0cmR1cCBpZiBvbmx5IHdlIGNvdWxkIGFkZCB0 aGF0IHRvIGxpYi9zdHJpbmcuYyAqLw0KK3N0YXRpYyBpbmxpbmUgY2hhciAqIGlub3RpZnlfb2xk bmFtZV9pbml0KHN0cnVjdCBkZW50cnkgKm9sZF9kZW50cnkpDQorew0KKwljaGFyICpvbGRfbmFt ZTsNCisNCisJb2xkX25hbWUgPSBrbWFsbG9jKHN0cmxlbihvbGRfZGVudHJ5LT5kX25hbWUubmFt ZSkgKyAxLCBHRlBfS0VSTkVMKTsNCisJaWYgKG9sZF9uYW1lKQ0KKwkJc3RyY3B5KG9sZF9uYW1l LCBvbGRfZGVudHJ5LT5kX25hbWUubmFtZSk7DQorCXJldHVybiBvbGRfbmFtZTsNCit9DQorDQor c3RhdGljIGlubGluZSB2b2lkIGlub3RpZnlfb2xkbmFtZV9mcmVlKGNvbnN0IGNoYXIgKm9sZF9u YW1lKQ0KK3sNCisJa2ZyZWUob2xkX25hbWUpOw0KK30NCisNCisjZWxzZQ0KKw0KK3N0YXRpYyBp bmxpbmUgdm9pZCBpbm90aWZ5X2lub2RlX3F1ZXVlX2V2ZW50KHN0cnVjdCBpbm9kZSAqaW5vZGUs DQorCQkJCQkgICAgIF9fdTMyIG1hc2ssDQorCQkJCQkgICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1l KQ0KK3sNCit9DQorDQorc3RhdGljIGlubGluZSB2b2lkIGlub3RpZnlfZGVudHJ5X3BhcmVudF9x dWV1ZV9ldmVudChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksDQorCQkJCQkJICAgICBfX3UzMiBtYXNr LA0KKwkJCQkJCSAgICAgY29uc3QgY2hhciAqZmlsZW5hbWUpDQorew0KK30NCisNCitzdGF0aWMg aW5saW5lIHZvaWQgaW5vdGlmeV9zdXBlcl9ibG9ja191bW91bnQoc3RydWN0IHN1cGVyX2Jsb2Nr ICpzYikNCit7DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBpbm90aWZ5X2lub2RlX2lzX2Rl YWQoc3RydWN0IGlub2RlICppbm9kZSkNCit7DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUgY2hhciAq IGlub3RpZnlfb2xkbmFtZV9pbml0KHN0cnVjdCBkZW50cnkgKm9sZF9kZW50cnkpDQorew0KKwly ZXR1cm4gTlVMTDsNCit9DQorDQorc3RhdGljIGlubGluZSB2b2lkIGlub3RpZnlfb2xkbmFtZV9m cmVlKGNvbnN0IGNoYXIgKm9sZF9uYW1lKQ0KK3sNCit9DQorDQorI2VuZGlmCS8qIENPTkZJR19J Tk9USUZZICovDQorDQorI2VuZGlmCS8qIF9fS0VSTkVMIF9fICovDQorDQorI2VuZGlmCS8qIF9M SU5VWF9JTk9USUZZX0ggKi8NCi0tLSBjbGVhbi9saW51eC9pbmNsdWRlL2xpbnV4L2ZzLmgJMjAw NC0wOC0xNCAwNjo1NTowOS4wMDAwMDAwMDAgLTA0MDANCisrKyBsaW51eC9pbmNsdWRlL2xpbnV4 L2ZzLmgJMjAwNC0xMC0wNCAyMToxMzowMy4wMDAwMDAwMDAgLTA0MDANCkBAIC0yNyw2ICsyNyw3 IEBADQogc3RydWN0IGtzdGF0ZnM7DQogc3RydWN0IHZtX2FyZWFfc3RydWN0Ow0KIHN0cnVjdCB2 ZnNtb3VudDsNCitzdHJ1Y3QgaW5vdGlmeV9pbm9kZV9kYXRhOw0KIA0KIC8qDQogICogSXQncyBz aWxseSB0byBoYXZlIE5SX09QRU4gYmlnZ2VyIHRoYW4gTlJfRklMRSwgYnV0IHlvdSBjYW4gY2hh bmdlDQpAQCAtNjEsNyArNjIsNyBAQA0KIH07DQogZXh0ZXJuIHN0cnVjdCBpbm9kZXNfc3RhdF90 IGlub2Rlc19zdGF0Ow0KIA0KLWV4dGVybiBpbnQgbGVhc2VzX2VuYWJsZSwgZGlyX25vdGlmeV9l bmFibGUsIGxlYXNlX2JyZWFrX3RpbWU7DQorZXh0ZXJuIGludCBsZWFzZXNfZW5hYmxlLCBsZWFz ZV9icmVha190aW1lOw0KIA0KICNkZWZpbmUgTlJfRklMRSAgODE5MgkvKiB0aGlzIGNhbiB3ZWxs IGJlIGxhcmdlciBvbiBhIGxhcmdlciBzeXN0ZW0gKi8NCiAjZGVmaW5lIE5SX1JFU0VSVkVEX0ZJ TEVTIDEwIC8qIHJlc2VydmVkIGZvciByb290ICovDQpAQCAtNDU1LDggKzQ1NiwxNCBAQA0KIAlz dHJ1Y3QgY2RldgkJKmlfY2RldjsNCiAJaW50CQkJaV9jaW5kZXg7DQogDQorI2lmZGVmIENPTkZJ R19ETk9USUZZDQogCXVuc2lnbmVkIGxvbmcJCWlfZG5vdGlmeV9tYXNrOyAvKiBEaXJlY3Rvcnkg bm90aWZ5IGV2ZW50cyAqLw0KIAlzdHJ1Y3QgZG5vdGlmeV9zdHJ1Y3QJKmlfZG5vdGlmeTsgLyog Zm9yIGRpcmVjdG9yeSBub3RpZmljYXRpb25zICovDQorI2VuZGlmDQorDQorI2lmZGVmIENPTkZJ R19JTk9USUZZDQorCXN0cnVjdCBpbm90aWZ5X2lub2RlX2RhdGEgKmlub3RpZnlfZGF0YTsNCisj ZW5kaWYNCiANCiAJdW5zaWduZWQgbG9uZwkJaV9zdGF0ZTsNCiAJdW5zaWduZWQgbG9uZwkJZGly dGllZF93aGVuOwkvKiBqaWZmaWVzIG9mIGZpcnN0IGRpcnR5aW5nICovDQotLS0gY2xlYW4vbGlu dXgvZnMvc3VwZXIuYwkyMDA0LTA4LTE0IDA2OjU1OjIyLjAwMDAwMDAwMCAtMDQwMA0KKysrIGxp bnV4L2ZzL3N1cGVyLmMJMjAwNC0xMC0wNiAxNTo0OToyOC4wMDAwMDAwMDAgLTA0MDANCkBAIC0z Niw2ICszNiw3IEBADQogI2luY2x1ZGUgPGxpbnV4L3dyaXRlYmFjay5oPgkJLyogZm9yIHRoZSBl bWVyZ2VuY3kgcmVtb3VudCBzdHVmZiAqLw0KICNpbmNsdWRlIDxsaW51eC9pZHIuaD4NCiAjaW5j bHVkZSA8YXNtL3VhY2Nlc3MuaD4NCisjaW5jbHVkZSA8bGludXgvaW5vdGlmeS5oPg0KIA0KIA0K IHZvaWQgZ2V0X2ZpbGVzeXN0ZW0oc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzKTsNCkBAIC0y MDQsNiArMjA1LDcgQEANCiANCiAJaWYgKHJvb3QpIHsNCiAJCXNiLT5zX3Jvb3QgPSBOVUxMOw0K KwkJaW5vdGlmeV9zdXBlcl9ibG9ja191bW91bnQoc2IpOw0KIAkJc2hyaW5rX2RjYWNoZV9wYXJl bnQocm9vdCk7DQogCQlzaHJpbmtfZGNhY2hlX2Fub24oJnNiLT5zX2Fub24pOw0KIAkJZHB1dChy b290KTsNCi0tLSBjbGVhbi9saW51eC9mcy9yZWFkX3dyaXRlLmMJMjAwNC0wOC0xNCAwNjo1NToz NS4wMDAwMDAwMDAgLTA0MDANCisrKyBsaW51eC9mcy9yZWFkX3dyaXRlLmMJMjAwNC0xMC0wNiAx NjoyMjozOS4wMDAwMDAwMDAgLTA0MDANCkBAIC0xMSw2ICsxMSw3IEBADQogI2luY2x1ZGUgPGxp bnV4L3Vpby5oPg0KICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPg0KICNpbmNsdWRlIDxsaW51 eC9kbm90aWZ5Lmg+DQorI2luY2x1ZGUgPGxpbnV4L2lub3RpZnkuaD4NCiAjaW5jbHVkZSA8bGlu dXgvc2VjdXJpdHkuaD4NCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+DQogDQpAQCAtMjE2LDgg KzIxNywxNCBAQA0KIAkJCQlyZXQgPSBmaWxlLT5mX29wLT5yZWFkKGZpbGUsIGJ1ZiwgY291bnQs IHBvcyk7DQogCQkJZWxzZQ0KIAkJCQlyZXQgPSBkb19zeW5jX3JlYWQoZmlsZSwgYnVmLCBjb3Vu dCwgcG9zKTsNCi0JCQlpZiAocmV0ID4gMCkNCi0JCQkJZG5vdGlmeV9wYXJlbnQoZmlsZS0+Zl9k ZW50cnksIEROX0FDQ0VTUyk7DQorCQkJaWYgKHJldCA+IDApIHsNCisJCQkJc3RydWN0IGRlbnRy eSAqZGVudHJ5ID0gZmlsZS0+Zl9kZW50cnk7DQorCQkJCWRub3RpZnlfcGFyZW50KGRlbnRyeSwg RE5fQUNDRVNTKTsNCisJCQkJaW5vdGlmeV9kZW50cnlfcGFyZW50X3F1ZXVlX2V2ZW50KGRlbnRy eSwNCisJCQkJCQlJTl9BQ0NFU1MsIDAsIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOw0KKwkJCQlpbm90 aWZ5X2lub2RlX3F1ZXVlX2V2ZW50KGlub2RlLCBJTl9BQ0NFU1MsIDAsDQorCQkJCQkJTlVMTCk7 DQorCQkJfQ0KIAkJfQ0KIAl9DQogDQpAQCAtMjYwLDggKzI2NywxNCBAQA0KIAkJCQlyZXQgPSBm aWxlLT5mX29wLT53cml0ZShmaWxlLCBidWYsIGNvdW50LCBwb3MpOw0KIAkJCWVsc2UNCiAJCQkJ cmV0ID0gZG9fc3luY193cml0ZShmaWxlLCBidWYsIGNvdW50LCBwb3MpOw0KLQkJCWlmIChyZXQg PiAwKQ0KLQkJCQlkbm90aWZ5X3BhcmVudChmaWxlLT5mX2RlbnRyeSwgRE5fTU9ESUZZKTsNCisJ CQlpZiAocmV0ID4gMCkgew0KKwkJCQlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBmaWxlLT5mX2Rl bnRyeTsNCisJCQkJZG5vdGlmeV9wYXJlbnQoZGVudHJ5LCBETl9NT0RJRlkpOw0KKwkJCQlpbm90 aWZ5X2RlbnRyeV9wYXJlbnRfcXVldWVfZXZlbnQoZGVudHJ5LA0KKwkJCQkJCUlOX01PRElGWSwg MCwgZGVudHJ5LT5kX25hbWUubmFtZSk7DQorCQkJCWlub3RpZnlfaW5vZGVfcXVldWVfZXZlbnQo aW5vZGUsIElOX01PRElGWSwgMCwNCisJCQkJCQlOVUxMKTsNCisJCQl9DQogCQl9DQogCX0NCiAN CkBAIC00OTMsOSArNTA2LDE1IEBADQogb3V0Og0KIAlpZiAoaW92ICE9IGlvdnN0YWNrKQ0KIAkJ a2ZyZWUoaW92KTsNCi0JaWYgKChyZXQgKyAodHlwZSA9PSBSRUFEKSkgPiAwKQ0KLQkJZG5vdGlm eV9wYXJlbnQoZmlsZS0+Zl9kZW50cnksDQotCQkJCSh0eXBlID09IFJFQUQpID8gRE5fQUNDRVNT IDogRE5fTU9ESUZZKTsNCisJaWYgKChyZXQgKyAodHlwZSA9PSBSRUFEKSkgPiAwKSB7DQorCQlz dHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBmaWxlLT5mX2RlbnRyeTsNCisJCWRub3RpZnlfcGFyZW50 KGRlbnRyeSwgKHR5cGUgPT0gUkVBRCkgPyBETl9BQ0NFU1MgOiBETl9NT0RJRlkpOw0KKwkJaW5v dGlmeV9kZW50cnlfcGFyZW50X3F1ZXVlX2V2ZW50KGRlbnRyeSwNCisJCQkJKHR5cGUgPT0gUkVB RCkgPyBJTl9BQ0NFU1MgOiBJTl9NT0RJRlksIDAsDQorCQkJCWRlbnRyeS0+ZF9uYW1lLm5hbWUp Ow0KKwkJaW5vdGlmeV9pbm9kZV9xdWV1ZV9ldmVudCAoZGVudHJ5LT5kX2lub2RlLA0KKwkJCQko dHlwZSA9PSBSRUFEKSA/IElOX0FDQ0VTUyA6IElOX01PRElGWSwgMCwgTlVMTCk7DQorCX0NCiAJ cmV0dXJuIHJldDsNCiB9DQogDQotLS0gY2xlYW4vbGludXgvZnMvb3Blbi5jCTIwMDQtMDgtMTQg MDY6NTQ6NDguMDAwMDAwMDAwIC0wNDAwDQorKysgbGludXgvZnMvb3Blbi5jCTIwMDQtMTAtMDYg MTY6MjA6NTYuMDAwMDAwMDAwIC0wNDAwDQpAQCAtMTEsNiArMTEsNyBAQA0KICNpbmNsdWRlIDxs aW51eC9zbXBfbG9jay5oPg0KICNpbmNsdWRlIDxsaW51eC9xdW90YW9wcy5oPg0KICNpbmNsdWRl IDxsaW51eC9kbm90aWZ5Lmg+DQorI2luY2x1ZGUgPGxpbnV4L2lub3RpZnkuaD4NCiAjaW5jbHVk ZSA8bGludXgvbW9kdWxlLmg+DQogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4NCiAjaW5jbHVkZSA8 bGludXgvdHR5Lmg+DQpAQCAtOTU1LDYgKzk1NiwxMCBAQA0KIAkJCWVycm9yID0gUFRSX0VSUihm KTsNCiAJCQlpZiAoSVNfRVJSKGYpKQ0KIAkJCQlnb3RvIG91dF9lcnJvcjsNCisJCQlpbm90aWZ5 X2lub2RlX3F1ZXVlX2V2ZW50KGYtPmZfZGVudHJ5LT5kX2lub2RlLA0KKwkJCQkJSU5fT1BFTiwg MCwgTlVMTCk7DQorCQkJaW5vdGlmeV9kZW50cnlfcGFyZW50X3F1ZXVlX2V2ZW50KGYtPmZfZGVu dHJ5LCBJTl9PUEVOLA0KKwkJCQkJMCwgZi0+Zl9kZW50cnktPmRfbmFtZS5uYW1lKTsNCiAJCQlm ZF9pbnN0YWxsKGZkLCBmKTsNCiAJCX0NCiBvdXQ6DQotLS0gY2xlYW4vbGludXgvZnMvbmFtZWku YwkyMDA0LTA4LTE0IDA2OjU1OjEwLjAwMDAwMDAwMCAtMDQwMA0KKysrIGxpbnV4L2ZzL25hbWVp LmMJMjAwNC0xMC0wNiAxNjoyNDoxNC4wMDAwMDAwMDAgLTA0MDANCkBAIC0yMiw2ICsyMiw3IEBA DQogI2luY2x1ZGUgPGxpbnV4L3F1b3Rhb3BzLmg+DQogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAu aD4NCiAjaW5jbHVkZSA8bGludXgvZG5vdGlmeS5oPg0KKyNpbmNsdWRlIDxsaW51eC9pbm90aWZ5 Lmg+DQogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+DQogI2luY2x1ZGUgPGxpbnV4L3BlcnNv bmFsaXR5Lmg+DQogI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+DQpAQCAtMTIyMSw2ICsxMjIy LDggQEANCiAJZXJyb3IgPSBkaXItPmlfb3AtPmNyZWF0ZShkaXIsIGRlbnRyeSwgbW9kZSwgbmQp Ow0KIAlpZiAoIWVycm9yKSB7DQogCQlpbm9kZV9kaXJfbm90aWZ5KGRpciwgRE5fQ1JFQVRFKTsN CisJCWlub3RpZnlfaW5vZGVfcXVldWVfZXZlbnQoZGlyLCBJTl9DUkVBVEVfRklMRSwNCisJCQkJ MCwgZGVudHJ5LT5kX25hbWUubmFtZSk7DQogCQlzZWN1cml0eV9pbm9kZV9wb3N0X2NyZWF0ZShk aXIsIGRlbnRyeSwgbW9kZSk7DQogCX0NCiAJcmV0dXJuIGVycm9yOw0KQEAgLTE1MzUsNiArMTUz OCw4IEBADQogCWVycm9yID0gZGlyLT5pX29wLT5ta25vZChkaXIsIGRlbnRyeSwgbW9kZSwgZGV2 KTsNCiAJaWYgKCFlcnJvcikgew0KIAkJaW5vZGVfZGlyX25vdGlmeShkaXIsIEROX0NSRUFURSk7 DQorCQlpbm90aWZ5X2lub2RlX3F1ZXVlX2V2ZW50KGRpciwgSU5fQ1JFQVRFX0ZJTEUsIDAsDQor CQkJCWRlbnRyeS0+ZF9uYW1lLm5hbWUpOw0KIAkJc2VjdXJpdHlfaW5vZGVfcG9zdF9ta25vZChk aXIsIGRlbnRyeSwgbW9kZSwgZGV2KTsNCiAJfQ0KIAlyZXR1cm4gZXJyb3I7DQpAQCAtMTYwOCw2 ICsxNjEzLDggQEANCiAJZXJyb3IgPSBkaXItPmlfb3AtPm1rZGlyKGRpciwgZGVudHJ5LCBtb2Rl KTsNCiAJaWYgKCFlcnJvcikgew0KIAkJaW5vZGVfZGlyX25vdGlmeShkaXIsIEROX0NSRUFURSk7 DQorCQlpbm90aWZ5X2lub2RlX3F1ZXVlX2V2ZW50KGRpciwgSU5fQ1JFQVRFX1NVQkRJUiwgMCwN CisJCQkJZGVudHJ5LT5kX25hbWUubmFtZSk7DQogCQlzZWN1cml0eV9pbm9kZV9wb3N0X21rZGly KGRpcixkZW50cnksIG1vZGUpOw0KIAl9DQogCXJldHVybiBlcnJvcjsNCkBAIC0xNzAzLDYgKzE3 MTAsMTEgQEANCiAJdXAoJmRlbnRyeS0+ZF9pbm9kZS0+aV9zZW0pOw0KIAlpZiAoIWVycm9yKSB7 DQogCQlpbm9kZV9kaXJfbm90aWZ5KGRpciwgRE5fREVMRVRFKTsNCisJCWlub3RpZnlfaW5vZGVf cXVldWVfZXZlbnQoZGlyLCBJTl9ERUxFVEVfU1VCRElSLCAwLA0KKwkJCQlkZW50cnktPmRfbmFt ZS5uYW1lKTsNCisJCWlub3RpZnlfaW5vZGVfcXVldWVfZXZlbnQoZGVudHJ5LT5kX2lub2RlLCBJ Tl9ERUxFVEVfU0VMRiwgMCwNCisJCQkJTlVMTCk7DQorCQlpbm90aWZ5X2lub2RlX2lzX2RlYWQg KGRlbnRyeS0+ZF9pbm9kZSk7DQogCQlkX2RlbGV0ZShkZW50cnkpOw0KIAl9DQogCWRwdXQoZGVu dHJ5KTsNCkBAIC0xNzc1LDggKzE3ODcsMTMgQEANCiANCiAJLyogV2UgZG9uJ3QgZF9kZWxldGUo KSBORlMgc2lsbHlyZW5hbWVkIGZpbGVzLS10aGV5IHN0aWxsIGV4aXN0LiAqLw0KIAlpZiAoIWVy cm9yICYmICEoZGVudHJ5LT5kX2ZsYWdzICYgRENBQ0hFX05GU0ZTX1JFTkFNRUQpKSB7DQotCQlk X2RlbGV0ZShkZW50cnkpOw0KIAkJaW5vZGVfZGlyX25vdGlmeShkaXIsIEROX0RFTEVURSk7DQor CQlpbm90aWZ5X2lub2RlX3F1ZXVlX2V2ZW50KGRpciwgSU5fREVMRVRFX0ZJTEUsIDAsDQorCQkJ CWRlbnRyeS0+ZF9uYW1lLm5hbWUpOw0KKwkJaW5vdGlmeV9pbm9kZV9xdWV1ZV9ldmVudChkZW50 cnktPmRfaW5vZGUsIElOX0RFTEVURV9TRUxGLCAwLA0KKwkJCQlOVUxMKTsNCisJCWlub3RpZnlf aW5vZGVfaXNfZGVhZCAoZGVudHJ5LT5kX2lub2RlKTsNCisJCWRfZGVsZXRlKGRlbnRyeSk7DQog CX0NCiAJcmV0dXJuIGVycm9yOw0KIH0NCkBAIC0xODUzLDYgKzE4NzAsOCBAQA0KIAllcnJvciA9 IGRpci0+aV9vcC0+c3ltbGluayhkaXIsIGRlbnRyeSwgb2xkbmFtZSk7DQogCWlmICghZXJyb3Ip IHsNCiAJCWlub2RlX2Rpcl9ub3RpZnkoZGlyLCBETl9DUkVBVEUpOw0KKwkJaW5vdGlmeV9pbm9k ZV9xdWV1ZV9ldmVudChkaXIsIElOX0NSRUFURV9GSUxFLCAwLA0KKwkJCQlkZW50cnktPmRfbmFt ZS5uYW1lKTsNCiAJCXNlY3VyaXR5X2lub2RlX3Bvc3Rfc3ltbGluayhkaXIsIGRlbnRyeSwgb2xk bmFtZSk7DQogCX0NCiAJcmV0dXJuIGVycm9yOw0KQEAgLTE5MjYsNiArMTk0NSw4IEBADQogCXVw KCZvbGRfZGVudHJ5LT5kX2lub2RlLT5pX3NlbSk7DQogCWlmICghZXJyb3IpIHsNCiAJCWlub2Rl X2Rpcl9ub3RpZnkoZGlyLCBETl9DUkVBVEUpOw0KKwkJaW5vdGlmeV9pbm9kZV9xdWV1ZV9ldmVu dChkaXIsIElOX0NSRUFURV9GSUxFLCAwLCANCisJCQkJCW5ld19kZW50cnktPmRfbmFtZS5uYW1l KTsNCiAJCXNlY3VyaXR5X2lub2RlX3Bvc3RfbGluayhvbGRfZGVudHJ5LCBkaXIsIG5ld19kZW50 cnkpOw0KIAl9DQogCXJldHVybiBlcnJvcjsNCkBAIC0yMDg5LDYgKzIxMTAsOCBAQA0KIHsNCiAJ aW50IGVycm9yOw0KIAlpbnQgaXNfZGlyID0gU19JU0RJUihvbGRfZGVudHJ5LT5kX2lub2RlLT5p X21vZGUpOw0KKwljaGFyICpvbGRfbmFtZTsNCisJdTMyIGNvb2tpZTsNCiANCiAJaWYgKG9sZF9k ZW50cnktPmRfaW5vZGUgPT0gbmV3X2RlbnRyeS0+ZF9pbm9kZSkNCiAgCQlyZXR1cm4gMDsNCkBA IC0yMTEwLDYgKzIxMzMsOCBAQA0KIAlEUVVPVF9JTklUKG9sZF9kaXIpOw0KIAlEUVVPVF9JTklU KG5ld19kaXIpOw0KIA0KKwlvbGRfbmFtZSA9IGlub3RpZnlfb2xkbmFtZV9pbml0KG9sZF9kZW50 cnkpOw0KKw0KIAlpZiAoaXNfZGlyKQ0KIAkJZXJyb3IgPSB2ZnNfcmVuYW1lX2RpcihvbGRfZGly LG9sZF9kZW50cnksbmV3X2RpcixuZXdfZGVudHJ5KTsNCiAJZWxzZQ0KQEAgLTIxMjEsNyArMjE0 NiwxNSBAQA0KIAkJCWlub2RlX2Rpcl9ub3RpZnkob2xkX2RpciwgRE5fREVMRVRFKTsNCiAJCQlp bm9kZV9kaXJfbm90aWZ5KG5ld19kaXIsIEROX0NSRUFURSk7DQogCQl9DQorDQorCQljb29raWUg PSBpbm90aWZ5X2dldF9jb29raWUoKTsNCisNCisJCWlub3RpZnlfaW5vZGVfcXVldWVfZXZlbnQo b2xkX2RpciwgSU5fTU9WRURfRlJPTSwgY29va2llLCBvbGRfbmFtZSk7DQorCQlpbm90aWZ5X2lu b2RlX3F1ZXVlX2V2ZW50KG5ld19kaXIsIElOX01PVkVEX1RPLCBjb29raWUsDQorCQkJCQkgIG5l d19kZW50cnktPmRfbmFtZS5uYW1lKTsNCiAJfQ0KKwlpbm90aWZ5X29sZG5hbWVfZnJlZShvbGRf bmFtZSk7DQorDQogCXJldHVybiBlcnJvcjsNCiB9DQogDQotLS0gY2xlYW4vbGludXgvZnMvaW5v ZGUuYwkyMDA0LTA4LTE0IDA2OjU2OjIzLjAwMDAwMDAwMCAtMDQwMA0KKysrIGxpbnV4L2ZzL2lu b2RlLmMJMjAwNC0xMC0wNCAwMDo0NDo1NC4wMDAwMDAwMDAgLTA0MDANCkBAIC0xMTQsNiArMTE0 LDkgQEANCiAJaWYgKGlub2RlKSB7DQogCQlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqIGNvbnN0IG1h cHBpbmcgPSAmaW5vZGUtPmlfZGF0YTsNCiANCisjaWZkZWYgQ09ORklHX0lOT1RJRlkNCisJCWlu b2RlLT5pbm90aWZ5X2RhdGEgPSBOVUxMOw0KKyNlbmRpZg0KIAkJaW5vZGUtPmlfc2IgPSBzYjsN CiAJCWlub2RlLT5pX2Jsa2JpdHMgPSBzYi0+c19ibG9ja3NpemVfYml0czsNCiAJCWlub2RlLT5p X2ZsYWdzID0gMDsNCi0tLSBjbGVhbi9saW51eC9mcy9hdHRyLmMJMjAwNC0wOC0xNCAwNjo1NDo1 MC4wMDAwMDAwMDAgLTA0MDANCisrKyBsaW51eC9mcy9hdHRyLmMJMjAwNC0xMC0wNiAxNjoyNTo0 Ni4wMDAwMDAwMDAgLTA0MDANCkBAIC0xMSw2ICsxMSw3IEBADQogI2luY2x1ZGUgPGxpbnV4L3N0 cmluZy5oPg0KICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPg0KICNpbmNsdWRlIDxsaW51eC9k bm90aWZ5Lmg+DQorI2luY2x1ZGUgPGxpbnV4L2lub3RpZnkuaD4NCiAjaW5jbHVkZSA8bGludXgv ZmNudGwuaD4NCiAjaW5jbHVkZSA8bGludXgvcXVvdGFvcHMuaD4NCiAjaW5jbHVkZSA8bGludXgv c2VjdXJpdHkuaD4NCkBAIC0xMjgsNiArMTI5LDI4IEBADQogCXJldHVybiBkbl9tYXNrOw0KIH0N CiANCitzdGF0aWMgaW50IHNldGF0dHJfbWFza19pbm90aWZ5KHVuc2lnbmVkIGludCBpYV92YWxp ZCkNCit7DQorCXVuc2lnbmVkIGxvbmcgZG5fbWFzayA9IDA7DQorDQorCWlmIChpYV92YWxpZCAm IEFUVFJfVUlEKQ0KKwkJZG5fbWFzayB8PSBJTl9BVFRSSUI7DQorCWlmIChpYV92YWxpZCAmIEFU VFJfR0lEKQ0KKwkJZG5fbWFzayB8PSBJTl9BVFRSSUI7DQorCWlmIChpYV92YWxpZCAmIEFUVFJf U0laRSkNCisJCWRuX21hc2sgfD0gSU5fTU9ESUZZOw0KKwkvKiBib3RoIHRpbWVzIGltcGxpZXMg YSB1dGltZShzKSBjYWxsICovDQorCWlmICgoaWFfdmFsaWQgJiAoQVRUUl9BVElNRXxBVFRSX01U SU1FKSkgPT0gKEFUVFJfQVRJTUV8QVRUUl9NVElNRSkpDQorCQlkbl9tYXNrIHw9IElOX0FUVFJJ QjsNCisJZWxzZSBpZiAoaWFfdmFsaWQgJiBBVFRSX0FUSU1FKQ0KKwkJZG5fbWFzayB8PSBJTl9B Q0NFU1M7DQorCWVsc2UgaWYgKGlhX3ZhbGlkICYgQVRUUl9NVElNRSkNCisJCWRuX21hc2sgfD0g SU5fTU9ESUZZOw0KKwlpZiAoaWFfdmFsaWQgJiBBVFRSX01PREUpDQorCQlkbl9tYXNrIHw9IElO X0FUVFJJQjsNCisJcmV0dXJuIGRuX21hc2s7DQorfQ0KKw0KIGludCBub3RpZnlfY2hhbmdlKHN0 cnVjdCBkZW50cnkgKiBkZW50cnksIHN0cnVjdCBpYXR0ciAqIGF0dHIpDQogew0KIAlzdHJ1Y3Qg aW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOw0KQEAgLTE4NSw4ICsyMDgsMTYgQEANCiAJ fQ0KIAlpZiAoIWVycm9yKSB7DQogCQl1bnNpZ25lZCBsb25nIGRuX21hc2sgPSBzZXRhdHRyX21h c2soaWFfdmFsaWQpOw0KKwkJdW5zaWduZWQgbG9uZyBpbl9tYXNrID0gc2V0YXR0cl9tYXNrX2lu b3RpZnkoaWFfdmFsaWQpOw0KKw0KIAkJaWYgKGRuX21hc2spDQogCQkJZG5vdGlmeV9wYXJlbnQo ZGVudHJ5LCBkbl9tYXNrKTsNCisJCWlmIChpbl9tYXNrKSB7DQorCQkJaW5vdGlmeV9pbm9kZV9x dWV1ZV9ldmVudChkZW50cnktPmRfaW5vZGUsIGluX21hc2ssIDAsDQorCQkJCQkJICBOVUxMKTsN CisJCQlpbm90aWZ5X2RlbnRyeV9wYXJlbnRfcXVldWVfZXZlbnQoZGVudHJ5LCBpbl9tYXNrLCAw LA0KKwkJCQkJCQkgIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOw0KKwkJfQ0KIAl9DQogCXJldHVybiBl cnJvcjsNCiB9DQotLS0gY2xlYW4vbGludXgvZHJpdmVycy9jaGFyL01ha2VmaWxlCTIwMDQtMDgt MTQgMDY6NTY6MjIuMDAwMDAwMDAwIC0wNDAwDQorKysgbGludXgvZHJpdmVycy9jaGFyL01ha2Vm aWxlCTIwMDQtMDktMjggMTY6NDY6MDUuMDAwMDAwMDAwIC0wNDAwDQpAQCAtOSw2ICs5LDggQEAN CiANCiBvYmoteQkgKz0gbWVtLm8gcmFuZG9tLm8gdHR5X2lvLm8gbl90dHkubyB0dHlfaW9jdGwu byBwdHkubyBtaXNjLm8NCiANCisNCitvYmotJChDT05GSUdfSU5PVElGWSkJCSs9IGlub3RpZnku bw0KIG9iai0kKENPTkZJR19WVCkJCSs9IHZ0X2lvY3RsLm8gdmNfc2NyZWVuLm8gY29uc29sZW1h cC5vIFwNCiAJCQkJICAgY29uc29sZW1hcF9kZWZ0YmwubyBzZWxlY3Rpb24ubyBrZXlib2FyZC5v DQogb2JqLSQoQ09ORklHX0hXX0NPTlNPTEUpCSs9IHZ0Lm8gZGVma2V5bWFwLm8NCi0tLSBjbGVh bi9saW51eC9kcml2ZXJzL2NoYXIvS2NvbmZpZwkyMDA0LTA4LTE0IDA2OjU0OjQ3LjAwMDAwMDAw MCAtMDQwMA0KKysrIGxpbnV4L2RyaXZlcnMvY2hhci9LY29uZmlnCTIwMDQtMDktMjggMTY6NDQ6 MzQuMDAwMDAwMDAwIC0wNDAwDQpAQCAtNjIsNiArNjIsMTkgQEANCiAJZGVwZW5kcyBvbiBWVCAm JiAhUzM5MCAmJiAhVU0NCiAJZGVmYXVsdCB5DQogDQorY29uZmlnIElOT1RJRlkNCisJYm9vbCAi SW5vdGlmeSBmaWxlIGNoYW5nZSBub3RpZmljYXRpb24gc3VwcG9ydCINCisJZGVmYXVsdCB5DQor CS0tLWhlbHAtLS0NCisJICBTYXkgWSBoZXJlIHRvIGVuYWJsZSBpbm90aWZ5IHN1cHBvcnQgYW5k IHRoZSAvZGV2L2lub3RpZnkgY2hhcmFjdGVyDQorCSAgZGV2aWNlLiAgSW5vdGlmeSBpcyBhIGZp bGUgY2hhbmdlIG5vdGlmaWNhdGlvbiBzeXN0ZW0gYW5kIGENCisJICByZXBsYWNlbWVudCBmb3Ig ZG5vdGlmeS4gIElub3RpZnkgZml4ZXMgbnVtZXJvdXMgc2hvcnRjb21pbmdzIGluDQorCSAgZG5v dGlmeSBhbmQgaW50cm9kdWNlcyBzZXZlcmFsIG5ldyBmZWF0dXJlcy4gIEl0IGFsbG93cyBtb25p dG9yaW5nDQorCSAgb2YgYm90aCBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgdmlhIGEgc2luZ2xlIG9w ZW4gZmQuICBNdWx0aXBsZSBmaWxlDQorCSAgZXZlbnRzIGFyZSBzdXBwb3J0ZWQuDQorCSAgDQor CSAgSWYgdW5zdXJlLCBzYXkgWS4NCisNCiBjb25maWcgU0VSSUFMX05PTlNUQU5EQVJEDQogCWJv b2wgIk5vbi1zdGFuZGFyZCBzZXJpYWwgcG9ydCBzdXBwb3J0Ig0KIAktLS1oZWxwLS0tDQotLS0g Y2xlYW4vbGludXgvRG9jdW1lbnRhdGlvbi9kbm90aWZ5LnR4dAkyMDA0LTA4LTE0IDA2OjU1OjMz LjAwMDAwMDAwMCAtMDQwMA0KKysrIGxpbnV4L0RvY3VtZW50YXRpb24vZG5vdGlmeS50eHQJMjAw NC0xMC0wNCAyMToxMzowMy4wMDAwMDAwMDAgLTA0MDANCkBAIC01NCw2ICs1NCwxNCBAQA0KIEFs c28sIGZpbGVzIHRoYXQgYXJlIHVubGlua2VkLCB3aWxsIHN0aWxsIGNhdXNlIG5vdGlmaWNhdGlv bnMgaW4gdGhlDQogbGFzdCBkaXJlY3RvcnkgdGhhdCB0aGV5IHdlcmUgbGlua2VkIHRvLg0KIA0K K0NvbmZpZ3VyYXRpb24NCistLS0tLS0tLS0tLS0tDQorDQorRG5vdGlmeSBpcyBjb250cm9sbGVk IHZpYSB0aGUgQ09ORklHX0ROT1RJRlkgY29uZmlndXJhdGlvbiBvcHRpb24uICBXaGVuDQorZGlz YWJsZWQsIGZjbnRsKGZkLCBGX05PVElGWSwgLi4uKSB3aWxsIHJldHVybiAtRUlOVkFMLg0KKw0K K0Rub3RpZnkgaXMgZGVwcmVjYXRlZCBpbiBmYXZvciBvZiBpbm90aWZ5IChDT05GSUdfSU5PVElG WSkuDQorDQogRXhhbXBsZQ0KIC0tLS0tLS0NCiANCi0tLSBjbGVhbi9saW51eC9mcy9LY29uZmln CTIwMDQtMDgtMTQgMDY6NTU6MzMuMDAwMDAwMDAwIC0wNDAwDQorKysgbGludXgvZnMvS2NvbmZp ZwkyMDA0LTEwLTA0IDIxOjEzOjAzLjAwMDAwMDAwMCAtMDQwMA0KQEAgLTQzOCw2ICs0MzgsMTgg QEANCiAJZGVwZW5kcyBvbiBYRlNfUVVPVEEgfHwgUVVPVEENCiAJZGVmYXVsdCB5DQogDQorY29u ZmlnIEROT1RJRlkNCisJYm9vbCAiRG5vdGlmeSBzdXBwb3J0Ig0KKwlkZWZhdWx0IHkNCisJaGVs cA0KKwkgIERub3RpZnkgaXMgYSBkaXJlY3RvcnktYmFzZWQgcGVyLWZkIGZpbGUgY2hhbmdlIG5v dGlmaWNhdGlvbiBzeXN0ZW0NCisJICB0aGF0IHVzZXMgc2lnbmFscyB0byBjb21tdW5pY2F0ZSBl dmVudHMgdG8gdXNlci1zcGFjZS4gIEl0IGhhcw0KKwkgIGJlZW4gcmVwbGFjZWQgYnkgaW5vdGlm eSAoc2VlIENPTkZJR19JTk9USUZZKSwgd2hpY2ggc29sdmVzIG1hbnkgb2YNCisJICB0aGUgc2hv cnRjb21pbmdzIG9mIGRub3RpZnkgYW5kIGFkZHMgbmV3IGZlYXR1cmVzLCBidXQgc29tZQ0KKwkg IGFwcGxpY2F0aW9ucyBtYXkgc3RpbGwgcmVseSBvbiBkbm90aWZ5Lg0KKwkgIA0KKwkgIEJlY2F1 c2Ugb2YgdGhpcywgaWYgdW5zdXJlLCBzYXkgWS4NCisNCiBjb25maWcgQVVUT0ZTX0ZTDQogCXRy aXN0YXRlICJLZXJuZWwgYXV0b21vdW50ZXIgc3VwcG9ydCINCiAJaGVscA0KLS0tIGNsZWFuL2xp bnV4L2ZzL01ha2VmaWxlCTIwMDQtMDgtMTQgMDY6NTU6MzMuMDAwMDAwMDAwIC0wNDAwDQorKysg bGludXgvZnMvTWFrZWZpbGUJMjAwNC0xMC0wNCAyMToxMzowMy4wMDAwMDAwMDAgLTA0MDANCkBA IC01LDEyICs1LDExIEBADQogIyBSZXdyaXR0ZW4gdG8gdXNlIGxpc3RzIGluc3RlYWQgb2YgaWYt c3RhdGVtZW50cy4NCiAjIA0KIA0KLW9iai15IDo9CW9wZW4ubyByZWFkX3dyaXRlLm8gZmlsZV90 YWJsZS5vIGJ1ZmZlci5vIFwNCi0JCWJpby5vIHN1cGVyLm8gYmxvY2tfZGV2Lm8gY2hhcl9kZXYu byBzdGF0Lm8gZXhlYy5vIHBpcGUubyBcDQotCQluYW1laS5vIGZjbnRsLm8gaW9jdGwubyByZWFk ZGlyLm8gc2VsZWN0Lm8gZmlmby5vIGxvY2tzLm8gXA0KLQkJZGNhY2hlLm8gaW5vZGUubyBhdHRy Lm8gYmFkX2lub2RlLm8gZmlsZS5vIGRub3RpZnkubyBcDQotCQlmaWxlc3lzdGVtcy5vIG5hbWVz cGFjZS5vIHNlcV9maWxlLm8geGF0dHIubyBsaWJmcy5vIFwNCi0JCWZzLXdyaXRlYmFjay5vIG1w YWdlLm8gZGlyZWN0LWlvLm8gYWlvLm8NCitvYmoteSA6PQlvcGVuLm8gcmVhZF93cml0ZS5vIGZp bGVfdGFibGUubyBidWZmZXIubyAgYmlvLm8gc3VwZXIubyBcDQorCQlibG9ja19kZXYubyBjaGFy X2Rldi5vIHN0YXQubyBleGVjLm8gcGlwZS5vIG5hbWVpLm8gZmNudGwubyBcDQorCQlpb2N0bC5v IHJlYWRkaXIubyBzZWxlY3QubyBmaWZvLm8gbG9ja3MubyBkY2FjaGUubyBpbm9kZS5vIFwNCisJ CWF0dHIubyBiYWRfaW5vZGUubyBmaWxlLm8gZmlsZXN5c3RlbXMubyBuYW1lc3BhY2UubyBhaW8u byBcDQorCQlzZXFfZmlsZS5vIHhhdHRyLm8gbGliZnMubyBmcy13cml0ZWJhY2subyBtcGFnZS5v IGRpcmVjdC1pby5vIFwNCiANCiBvYmotJChDT05GSUdfRVBPTEwpCQkrPSBldmVudHBvbGwubw0K IG9iai0kKENPTkZJR19DT01QQVQpCQkrPSBjb21wYXQubw0KQEAgLTM3LDYgKzM2LDggQEANCiBv YmotJChDT05GSUdfUUZNVF9WMikJCSs9IHF1b3RhX3YyLm8NCiBvYmotJChDT05GSUdfUVVPVEFD VEwpCQkrPSBxdW90YS5vDQogDQorb2JqLSQoQ09ORklHX0ROT1RJRlkpCQkrPSBkbm90aWZ5Lm8N CisNCiBvYmotJChDT05GSUdfUFJPQ19GUykJCSs9IHByb2MvDQogb2JqLXkJCQkJKz0gcGFydGl0 aW9ucy8NCiBvYmotJChDT05GSUdfU1lTRlMpCQkrPSBzeXNmcy8NCi0tLSBjbGVhbi9saW51eC9m cy9kbm90aWZ5LmMJMjAwNC0wOC0xNCAwNjo1NToxMC4wMDAwMDAwMDAgLTA0MDANCisrKyBsaW51 eC9mcy9kbm90aWZ5LmMJMjAwNC0xMC0wNCAyMToxMzowMy4wMDAwMDAwMDAgLTA0MDANCkBAIC0x Myw2ICsxMyw3IEBADQogICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElD VUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUNCiAgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZv ciBtb3JlIGRldGFpbHMuDQogICovDQorDQogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+DQogI2luY2x1 ZGUgPGxpbnV4L21vZHVsZS5oPg0KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPg0KQEAgLTIxLDgg KzIyLDYgQEANCiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4NCiAjaW5jbHVkZSA8bGludXgv c2xhYi5oPg0KIA0KLWludCBkaXJfbm90aWZ5X2VuYWJsZSA9IDE7DQotDQogc3RhdGljIGttZW1f Y2FjaGVfdCAqZG5fY2FjaGU7DQogDQogc3RhdGljIHZvaWQgcmVkb19pbm9kZV9tYXNrKHN0cnVj dCBpbm9kZSAqaW5vZGUpDQpAQCAtNzIsOCArNzEsNiBAQA0KIAkJZG5vdGlmeV9mbHVzaChmaWxw LCBpZCk7DQogCQlyZXR1cm4gMDsNCiAJfQ0KLQlpZiAoIWRpcl9ub3RpZnlfZW5hYmxlKQ0KLQkJ cmV0dXJuIC1FSU5WQUw7DQogCWlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7DQogCWlm ICghU19JU0RJUihpbm9kZS0+aV9tb2RlKSkNCiAJCXJldHVybiAtRU5PVERJUjsNCkBAIC0xNTcs OSArMTU0LDYgQEANCiB7DQogCXN0cnVjdCBkZW50cnkgKnBhcmVudDsNCiANCi0JaWYgKCFkaXJf bm90aWZ5X2VuYWJsZSkNCi0JCXJldHVybjsNCi0NCiAJc3Bpbl9sb2NrKCZkZW50cnktPmRfbG9j ayk7DQogCXBhcmVudCA9IGRlbnRyeS0+ZF9wYXJlbnQ7DQogCWlmIChwYXJlbnQtPmRfaW5vZGUt PmlfZG5vdGlmeV9tYXNrICYgZXZlbnQpIHsNCi0tLSBjbGVhbi9saW51eC9pbmNsdWRlL2xpbnV4 L2Rub3RpZnkuaAkyMDA0LTA4LTE0IDA2OjU0OjQ3LjAwMDAwMDAwMCAtMDQwMA0KKysrIGxpbnV4 L2luY2x1ZGUvbGludXgvZG5vdGlmeS5oCTIwMDQtMTAtMDQgMjE6MTM6MDMuMDAwMDAwMDAwIC0w NDAwDQpAQCAtMSwzICsxLDUgQEANCisjaWZuZGVmIF9MSU5VWF9ETk9USUZZX0gNCisjZGVmaW5l IF9MSU5VWF9ETk9USUZZX0gNCiAvKg0KICAqIERpcmVjdG9yeSBub3RpZmljYXRpb24gZm9yIExp bnV4DQogICoNCkBAIC04LDIwICsxMCw1NCBAQA0KIA0KIHN0cnVjdCBkbm90aWZ5X3N0cnVjdCB7 DQogCXN0cnVjdCBkbm90aWZ5X3N0cnVjdCAqCWRuX25leHQ7DQotCXVuc2lnbmVkIGxvbmcJCWRu X21hc2s7CS8qIEV2ZW50cyB0byBiZSBub3RpZmllZA0KLQkJCQkJCSAgIHNlZSBsaW51eC9mY250 bC5oICovDQorCXVuc2lnbmVkIGxvbmcJCWRuX21hc2s7DQogCWludAkJCWRuX2ZkOw0KIAlzdHJ1 Y3QgZmlsZSAqCQlkbl9maWxwOw0KIAlmbF9vd25lcl90CQlkbl9vd25lcjsNCiB9Ow0KIA0KKyNp ZmRlZiBfX0tFUk5FTF9fDQorDQorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPg0KKw0KKyNpZmRl ZiBDT05GSUdfRE5PVElGWQ0KKw0KIGV4dGVybiB2b2lkIF9faW5vZGVfZGlyX25vdGlmeShzdHJ1 Y3QgaW5vZGUgKiwgdW5zaWduZWQgbG9uZyk7DQotZXh0ZXJuIHZvaWQgZG5vdGlmeV9mbHVzaChz dHJ1Y3QgZmlsZSAqZmlscCwgZmxfb3duZXJfdCBpZCk7DQorZXh0ZXJuIHZvaWQgZG5vdGlmeV9m bHVzaChzdHJ1Y3QgZmlsZSAqLCBmbF9vd25lcl90KTsNCiBleHRlcm4gaW50IGZjbnRsX2Rpcm5v dGlmeShpbnQsIHN0cnVjdCBmaWxlICosIHVuc2lnbmVkIGxvbmcpOw0KLXZvaWQgZG5vdGlmeV9w YXJlbnQoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCB1bnNpZ25lZCBsb25nIGV2ZW50KTsNCitleHRl cm4gdm9pZCBkbm90aWZ5X3BhcmVudChzdHJ1Y3QgZGVudHJ5ICosIHVuc2lnbmVkIGxvbmcpOw0K IA0KIHN0YXRpYyBpbmxpbmUgdm9pZCBpbm9kZV9kaXJfbm90aWZ5KHN0cnVjdCBpbm9kZSAqaW5v ZGUsIHVuc2lnbmVkIGxvbmcgZXZlbnQpDQogew0KLQlpZiAoKGlub2RlKS0+aV9kbm90aWZ5X21h c2sgJiAoZXZlbnQpKQ0KKwlpZiAoaW5vZGUtPmlfZG5vdGlmeV9tYXNrICYgKGV2ZW50KSkNCiAJ CV9faW5vZGVfZGlyX25vdGlmeShpbm9kZSwgZXZlbnQpOw0KIH0NCisNCisjZWxzZQ0KKw0KK3N0 YXRpYyBpbmxpbmUgdm9pZCBfX2lub2RlX2Rpcl9ub3RpZnkoc3RydWN0IGlub2RlICppbm9kZSwg dW5zaWduZWQgbG9uZyBldmVudCkNCit7DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBkbm90 aWZ5X2ZsdXNoKHN0cnVjdCBmaWxlICpmaWxwLCBmbF9vd25lcl90IGlkKQ0KK3sNCit9DQorDQor c3RhdGljIGlubGluZSBpbnQgZmNudGxfZGlybm90aWZ5KGludCBmZCwgc3RydWN0IGZpbGUgKmZp bHAsIHVuc2lnbmVkIGxvbmcgYXJnKQ0KK3sNCisJcmV0dXJuIC1FSU5WQUw7DQorfQ0KKw0KK3N0 YXRpYyBpbmxpbmUgdm9pZCBkbm90aWZ5X3BhcmVudChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHVu c2lnbmVkIGxvbmcgZXZlbnQpDQorew0KK30NCisNCitzdGF0aWMgaW5saW5lIHZvaWQgaW5vZGVf ZGlyX25vdGlmeShzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1bnNpZ25lZCBsb25nIGV2ZW50KQ0KK3sN Cit9DQorDQorI2VuZGlmIC8qIENPTkZJR19ETk9USUZZICovDQorDQorI2VuZGlmIC8qIF9fS0VS TkVMIF9fICovDQorDQorI2VuZGlmIC8qIF9MSU5VWF9ETk9USUZZX0ggKi8NCi0tLSBjbGVhbi9s aW51eC9rZXJuZWwvc3lzY3RsLmMJMjAwNC0wOC0xNCAwNjo1NDo0OS4wMDAwMDAwMDAgLTA0MDAN CisrKyBsaW51eC9rZXJuZWwvc3lzY3RsLmMJMjAwNC0xMC0wNCAyMToxMzowMy4wMDAwMDAwMDAg LTA0MDANCkBAIC04NjgsMTQgKzg2OCw2IEBADQogCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9p bnR2ZWMsDQogCX0sDQogCXsNCi0JCS5jdGxfbmFtZQk9IEZTX0RJUl9OT1RJRlksDQotCQkucHJv Y25hbWUJPSAiZGlyLW5vdGlmeS1lbmFibGUiLA0KLQkJLmRhdGEJCT0gJmRpcl9ub3RpZnlfZW5h YmxlLA0KLQkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwNCi0JCS5tb2RlCQk9IDA2NDQsDQotCQku cHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMsDQotCX0sDQotCXsNCiAJCS5jdGxfbmFtZQk9 IEZTX0xFQVNFX1RJTUUsDQogCQkucHJvY25hbWUJPSAibGVhc2UtYnJlYWstdGltZSIsDQogCQku ZGF0YQkJPSAmbGVhc2VfYnJlYWtfdGltZSwNCl== --=-6wHUE47jK1MlTG+avsEH-- - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/