Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S269882AbUKASq3 (ORCPT ); Mon, 1 Nov 2004 13:46:29 -0500 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S274688AbUKASq3 (ORCPT ); Mon, 1 Nov 2004 13:46:29 -0500 Received: from sigma957.CIS.McMaster.CA ([130.113.64.83]:59068 "EHLO sigma957.cis.mcmaster.ca") by vger.kernel.org with ESMTP id S281547AbUKARcK (ORCPT ); Mon, 1 Nov 2004 12:32:10 -0500 Subject: [RFC][PATCH] inotify 0.15 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, bkonrath@redhat.com, greg@kroah.com Content-Type: multipart/mixed; boundary="=-V+AesdDHQ/Vm2FqvlgGF" Date: Mon, 01 Nov 2004 12:31:55 -0500 Message-Id: <1099330316.12182.2.camel@vertex> Mime-Version: 1.0 X-Mailer: Evolution 2.0.2 X-PMX-Version-Mac: 4.7.0.111621, Antispam-Engine: 2.0.2.0, Antispam-Data: 2004.10.31.0 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: 66219 Lines: 980 --=-V+AesdDHQ/Vm2FqvlgGF Content-Type: text/plain Content-Transfer-Encoding: 7bit Hello, In this release of inotify I have added a new ulimit for the number of watches a particular user can have. I am interested in peoples response to this addition and any alternative solutions. Here is release 0.15.0 of inotify. Attached is a patch to 2.6.9 --New in this version-- -uses idr to manager watch descriptors (rml) -drop limit on inotify instances (me) -make watch limit a ulimit (me) -dropped dnotify patch (me) -misc cleanups (me,rml,Bryan Rittmeyer) John McCutchan Inotify documentation: --HOWTO USE-- Inotify is a character device that when opened offers 2 IOCTL's. 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 refs the inode for the path and adds a inotify_watch structure to the inode. Each inotify device instance can only watch an inode once. 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 structure allows you to pair 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. If you aren't watching the source and destination folders of a move/rename 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. --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(N) where N is the number of devices watching the inode Removing a watch from a device This code 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. In the near future this will be based on idr, and the complexity will be O(logn) The calls to inotify from the VFS code has a complexity of O(1). --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. --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. Adding a call to inotify_super_block_umount from generic_shutdown_superblock inotify_super_block_umount: find all of the inodes that are on the super block being shut down foreach of these inodes: remove the watchers on them send UNMOUNT and IGNORED events unref the inode -- John McCutchan --=-V+AesdDHQ/Vm2FqvlgGF Content-Disposition: attachment; filename=inotify-0.15.diff Content-Type: text/x-patch; name=inotify-0.15.diff; charset=UTF-8 Content-Transfer-Encoding: base64 LS0tIGNsZWFuL2xpbnV4L2RyaXZlcnMvY2hhci9pbm90aWZ5LmMJMTk2OS0xMi0zMSAxOTowMDow MC4wMDAwMDAwMDAgLTA1MDANCisrKyBsaW51eC9kcml2ZXJzL2NoYXIvaW5vdGlmeS5jCTIwMDQt MTAtMjggMTg6Mjg6MjQuMDAwMDAwMDAwIC0wNDAwDQpAQCAtMCwwICsxLDk2MyBAQA0KKy8qDQor ICogSW5vZGUgYmFzZWQgZGlyZWN0b3J5IG5vdGlmaWNhdGlvbnMgZm9yIExpbnV4Lg0KKyAqDQor ICogQ29weXJpZ2h0IChDKSAyMDA0IEpvaG4gTWNDdXRjaGFuDQorICoNCisgKiBUaGlzIHByb2dy YW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlm eSBpdA0KKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vu c2UgYXMgcHVibGlzaGVkIGJ5IHRoZQ0KKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0 aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkNCisgKiBsYXRlciB2ZXJzaW9u Lg0KKyAqDQorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQg aXQgd2lsbCBiZSB1c2VmdWwsIGJ1dA0KKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0 IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklU TkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQ0KKyAqIEdlbmVyYWwg UHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCisgKi8NCisNCisvKiBUT0RPOiANCisg KiB1bm1vdW50IGV2ZW50cyBkb24ndCBnZXQgc2VudCBpZiBmaWxlc3lzdGVtIGlzIG1vdW50ZWQg aW4gdHdvIHBsYWNlcw0KKyAqIGR5bmFtaWNhbGx5IGFsbG9jYXRlIGV2ZW50IGZpbGVuYW1lDQor ICovDQorDQorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPg0KKyNpbmNsdWRlIDxsaW51eC9rZXJu ZWwuaD4NCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4NCisjaW5jbHVkZSA8bGludXgvc3Bpbmxv Y2suaD4NCisjaW5jbHVkZSA8bGludXgvaWRyLmg+DQorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4N CisjaW5jbHVkZSA8bGludXgvZnMuaD4NCisjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4NCisjaW5j bHVkZSA8bGludXgvcG9sbC5oPg0KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4NCisjaW5jbHVk ZSA8bGludXgvbWlzY2RldmljZS5oPg0KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+DQorI2luY2x1 ZGUgPGxpbnV4L2xpc3QuaD4NCisjaW5jbHVkZSA8bGludXgvd3JpdGViYWNrLmg+DQorI2luY2x1 ZGUgPGxpbnV4L2lub3RpZnkuaD4NCisNCitzdGF0aWMgYXRvbWljX3Qgd2F0Y2hfY291bnQ7DQor c3RhdGljIGF0b21pY190IGlub3RpZnlfY29va2llOw0KK3N0YXRpYyBrbWVtX2NhY2hlX3QgKndh dGNoX2NhY2hlcDsNCitzdGF0aWMga21lbV9jYWNoZV90ICpldmVudF9jYWNoZXA7DQorc3RhdGlj IGttZW1fY2FjaGVfdCAqaW5vZGVfZGF0YV9jYWNoZXA7DQorc3RhdGljIGludCBzeXNmc19hdHRy aWJfbWF4X3F1ZXVlZF9ldmVudHM7DQorDQorLyoNCisgKiBzdHJ1Y3QgaW5vdGlmeV9kZXZpY2Ug LSByZXByZXNlbnRzIGFuIG9wZW4gaW5zdGFuY2Ugb2YgYW4gaW5vdGlmeSBkZXZpY2UNCisgKg0K KyAqIEZvciBlYWNoIGlub3RpZnkgZGV2aWNlLCB3ZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgdGhl IGV2ZW50cyBxdWV1ZWQgb24gaXQsDQorICogYSBsaXN0IG9mIHRoZSBpbm9kZXMgdGhhdCB3ZSBh cmUgd2F0Y2hpbmcsIGFuZCBzbyBvbi4NCisgKg0KKyAqIFRoaXMgc3RydWN0dXJlIGlzIHByb3Rl Y3RlZCBieSAnbG9jaycuICBMb2NrIG9yZGVyaW5nOg0KKyAqDQorICogaW5vZGUtPmlfbG9jaw0K KyAqCWRldi0+bG9jaw0KKyAqCQlkZXYtPndhaXQtPmxvY2sNCisgKg0KKyAqIEZJWE1FOiBMb29r IGF0IHJlcGxhY2luZyBpX2xvY2sgd2l0aCBpX3NlbS4NCisgKi8NCitzdHJ1Y3QgaW5vdGlmeV9k ZXZpY2Ugew0KKwl3YWl0X3F1ZXVlX2hlYWRfdCAJd2FpdDsNCisJc3RydWN0IGlkcgkJaWRyOw0K KwlzdHJ1Y3QgbGlzdF9oZWFkIAlldmVudHM7DQorCXN0cnVjdCBsaXN0X2hlYWQgCXdhdGNoZXM7 DQorCXNwaW5sb2NrX3QJCWxvY2s7DQorCXVuc2lnbmVkIGludAkJZXZlbnRfY291bnQ7DQorCXVu c2lnbmVkIGludAkJbnJfd2F0Y2hlczsNCisJdW5zaWduZWQgaW50CQltYXhfZXZlbnRzOw0KK307 DQorDQorc3RydWN0IGlub3RpZnlfd2F0Y2ggew0KKwlzMzIgCQkJd2Q7CS8qIHdhdGNoIGRlc2Ny aXB0b3IgKi8NCisJdTMyCQkJbWFzazsNCisJc3RydWN0IGlub2RlICoJCWlub2RlOw0KKwlzdHJ1 Y3QgaW5vdGlmeV9kZXZpY2UgKglkZXY7DQorCXN0cnVjdCBsaXN0X2hlYWQJZF9saXN0OwkvKiBk ZXZpY2UgbGlzdCAqLw0KKwlzdHJ1Y3QgbGlzdF9oZWFkCWlfbGlzdDsgLyogaW5vZGUgbGlzdCAq Lw0KKwlzdHJ1Y3QgbGlzdF9oZWFkCXVfbGlzdDsgLyogdW5tb3VudCBsaXN0ICovDQorfTsNCisj ZGVmaW5lIGlub3RpZnlfd2F0Y2hfZF9saXN0KHBvcykgbGlzdF9lbnRyeSgocG9zKSwgc3RydWN0 IGlub3RpZnlfd2F0Y2gsIGRfbGlzdCkNCisjZGVmaW5lIGlub3RpZnlfd2F0Y2hfaV9saXN0KHBv cykgbGlzdF9lbnRyeSgocG9zKSwgc3RydWN0IGlub3RpZnlfd2F0Y2gsIGlfbGlzdCkNCisjZGVm aW5lIGlub3RpZnlfd2F0Y2hfdV9saXN0KHBvcykgbGlzdF9lbnRyeSgocG9zKSwgc3RydWN0IGlu b3RpZnlfd2F0Y2gsIHVfbGlzdCkNCisNCitzdGF0aWMgc3NpemVfdCBzaG93X21heF9xdWV1ZWRf ZXZlbnRzIChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikNCit7DQorCXNwcmludGYoYnVm LCAiJWQiLCBzeXNmc19hdHRyaWJfbWF4X3F1ZXVlZF9ldmVudHMpOw0KKw0KKwlyZXR1cm4gc3Ry bGVuKGJ1ZikrMTsNCit9DQorDQorc3RhdGljIHNzaXplX3Qgc3RvcmVfbWF4X3F1ZXVlZF9ldmVu dHMgKHN0cnVjdCBkZXZpY2UgKmRldiwNCisJCQkJCQkJCQkJY29uc3QgY2hhciAqYnVmLA0KKwkJ CQkJCQkJCQlzaXplX3QgY291bnQpDQorew0KKwlyZXR1cm4gMDsNCit9DQorDQorc3RhdGljIERF VklDRV9BVFRSKG1heF9xdWV1ZWRfZXZlbnRzLCBTX0lSVVNSfFNfSVdVU1J8U19JUkdSUHxTX0lS T1RILCBzaG93X21heF9xdWV1ZWRfZXZlbnRzLCBzdG9yZV9tYXhfcXVldWVkX2V2ZW50cyk7DQor DQorc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICppbm90aWZ5X2RldmljZV9hdHRyc1td ID0gew0KKwkmZGV2X2F0dHJfbWF4X3F1ZXVlZF9ldmVudHMsDQorCU5VTEwNCit9Ow0KKw0KKw0K Ky8qDQorICogQSBsaXN0IG9mIHRoZXNlIGlzIGF0dGFjaGVkIHRvIGVhY2ggaW5zdGFuY2Ugb2Yg dGhlIGRyaXZlcg0KKyAqIHdoZW4gdGhlIGRyaXZlcnMgcmVhZCgpIGdldHMgY2FsbGVkLCB0aGlz IGxpc3QgaXMgd2Fsa2VkIGFuZA0KKyAqIGFsbCBldmVudHMgdGhhdCBjYW4gZml0IGluIHRoZSBi dWZmZXIgZ2V0IGRlbGl2ZXJlZA0KKyAqLw0KK3N0cnVjdCBpbm90aWZ5X2tlcm5lbF9ldmVudCB7 DQorICAgICAgICBzdHJ1Y3QgbGlzdF9oZWFkICAgICAgICBsaXN0Ow0KKwlzdHJ1Y3QgaW5vdGlm eV9ldmVudAlldmVudDsNCit9Ow0KKw0KKy8qDQorICogZmluZF9pbm9kZSAtIHJlc29sdmUgYSB1 c2VyLWdpdmVuIHBhdGggdG8gYSBzcGVjaWZpYyBpbm9kZSBhbmQgaWdldCgpIGl0DQorICovDQor c3RhdGljIHN0cnVjdCBpbm9kZSAqIGZpbmRfaW5vZGUoY29uc3QgY2hhciBfX3VzZXIgKmRpcm5h bWUpDQorew0KKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOw0KKwlzdHJ1Y3QgbmFtZWlkYXRhIG5kOw0K KwlpbnQgZXJyb3I7DQorDQorCWVycm9yID0gX191c2VyX3dhbGsoZGlybmFtZSwgTE9PS1VQX0ZP TExPVywgJm5kKTsNCisJaWYgKGVycm9yKSB7DQorCQlpbm9kZSA9IEVSUl9QVFIoZXJyb3IpOw0K KwkJZ290byBvdXQ7DQorCX0NCisNCisJaW5vZGUgPSBuZC5kZW50cnktPmRfaW5vZGU7DQorDQor CS8qIHlvdSBjYW4gb25seSB3YXRjaCBhbiBpbm9kZSBpZiB5b3UgaGF2ZSByZWFkIHBlcm1pc3Np b25zIG9uIGl0ICovDQorCWVycm9yID0gdmZzX3Blcm1pc3Npb24oaW5vZGUsIE1BWV9SRUFEKTsN CisJaWYgKGVycm9yKSB7DQorCQlpbm9kZSA9IEVSUl9QVFIoZXJyb3IpOw0KKwkJZ290byByZWxl YXNlX2FuZF9vdXQ7DQorCX0NCisNCisJX19pZ2V0KGlub2RlKTsNCityZWxlYXNlX2FuZF9vdXQ6 DQorCXBhdGhfcmVsZWFzZSgmbmQpOw0KK291dDoNCisJcmV0dXJuIGlub2RlOw0KK30NCisNCitz dGF0aWMgaW5saW5lIHZvaWQgdW5yZWZfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkNCit7DQor CWlwdXQoaW5vZGUpOw0KK30NCisNCitzdHJ1Y3QgaW5vdGlmeV9rZXJuZWxfZXZlbnQgKmtlcm5l bF9ldmVudChzMzIgd2QsIHUzMiBtYXNrLCB1MzIgY29va2llLA0KKwkJCQkJICBjb25zdCBjaGFy ICpmaWxlbmFtZSkNCit7DQorCXN0cnVjdCBpbm90aWZ5X2tlcm5lbF9ldmVudCAqa2V2ZW50Ow0K Kw0KKwlrZXZlbnQgPSBrbWVtX2NhY2hlX2FsbG9jKGV2ZW50X2NhY2hlcCwgR0ZQX0FUT01JQyk7 DQorCWlmICgha2V2ZW50KQ0KKwkJZ290byBvdXQ7DQorDQorCS8qIHdlIGhhbmQgdGhpcyBvdXQg dG8gdXNlci1zcGFjZSwgc28gemVybyBpdCBvdXQganVzdCBpbiBjYXNlICovDQorCW1lbXNldChr ZXZlbnQsIDAsIHNpemVvZihzdHJ1Y3QgaW5vdGlmeV9rZXJuZWxfZXZlbnQpKTsNCisNCisJa2V2 ZW50LT5ldmVudC53ZCA9IHdkOw0KKwlrZXZlbnQtPmV2ZW50Lm1hc2sgPSBtYXNrOw0KKwlrZXZl bnQtPmV2ZW50LmNvb2tpZSA9IGNvb2tpZTsNCisJSU5JVF9MSVNUX0hFQUQoJmtldmVudC0+bGlz dCk7DQorDQorCWlmIChmaWxlbmFtZSkgew0KKwkJc3RybmNweShrZXZlbnQtPmV2ZW50LmZpbGVu YW1lLCBmaWxlbmFtZSwNCisJCQlJTk9USUZZX0ZJTEVOQU1FX01BWCk7DQorCQlrZXZlbnQtPmV2 ZW50LmZpbGVuYW1lW0lOT1RJRllfRklMRU5BTUVfTUFYLTFdID0gJ1wwJzsNCisJfSBlbHNlDQor CQlrZXZlbnQtPmV2ZW50LmZpbGVuYW1lWzBdID0gJ1wwJzsNCisNCitvdXQ6DQorCXJldHVybiBr ZXZlbnQ7DQorfQ0KKw0KK3ZvaWQgZGVsZXRlX2tlcm5lbF9ldmVudChzdHJ1Y3QgaW5vdGlmeV9r ZXJuZWxfZXZlbnQgKmtldmVudCkNCit7DQorCWlmICgha2V2ZW50KQ0KKwkJcmV0dXJuOw0KKwlr bWVtX2NhY2hlX2ZyZWUoZXZlbnRfY2FjaGVwLCBrZXZlbnQpOw0KK30NCisNCisjZGVmaW5lIGxp c3RfdG9faW5vdGlmeV9rZXJuZWxfZXZlbnQocG9zKSBsaXN0X2VudHJ5KChwb3MpLCBzdHJ1Y3Qg aW5vdGlmeV9rZXJuZWxfZXZlbnQsIGxpc3QpDQorI2RlZmluZSBpbm90aWZ5X2Rldl9nZXRfZXZl bnQoZGV2KSAobGlzdF90b19pbm90aWZ5X2tlcm5lbF9ldmVudChkZXYtPmV2ZW50cy5uZXh0KSkN CisjZGVmaW5lIGlub3RpZnlfZGV2X2hhc19ldmVudHMoZGV2KQkoIWxpc3RfZW1wdHkoJmRldi0+ ZXZlbnRzKSkNCisNCisvKiBEb2VzIHRoaXMgZXZlbnRzIG1hc2sgZ2V0IHNlbnQgdG8gdGhlIHdh dGNoID8gKi8NCisjZGVmaW5lIGV2ZW50X2FuZChldmVudF9tYXNrLHdhdGNoZXNfbWFzaykgCSgo ZXZlbnRfbWFzayA9PSBJTl9VTk1PVU5UKSB8fCBcDQorCQkJCQkJKGV2ZW50X21hc2sgPT0gSU5f SUdOT1JFRCkgfHwgXA0KKwkJCQkJCShldmVudF9tYXNrICYgd2F0Y2hlc19tYXNrKSkNCisNCisv Kg0KKyAqIGlub3RpZnlfZGV2X3F1ZXVlX2V2ZW50IC0gYWRkIGEgbmV3IGV2ZW50IHRvIHRoZSBn aXZlbiBkZXZpY2UNCisgKg0KKyAqIENhbGxlciBtdXN0IGhvbGQgZGV2LT5sb2NrLg0KKyAqLw0K K3N0YXRpYyB2b2lkIGlub3RpZnlfZGV2X3F1ZXVlX2V2ZW50KHN0cnVjdCBpbm90aWZ5X2Rldmlj ZSAqZGV2LA0KKwkJCQkgICAgc3RydWN0IGlub3RpZnlfd2F0Y2ggKndhdGNoLCB1MzIgbWFzaywN CisJCQkJICAgIHUzMiBjb29raWUsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQ0KK3sNCisJc3RydWN0 IGlub3RpZnlfa2VybmVsX2V2ZW50ICprZXZlbnQsICpsYXN0Ow0KKw0KKwkvKg0KKwkgKiBDaGVj ayBpZiB0aGUgbmV3IGV2ZW50IGlzIGEgZHVwbGljYXRlIG9mIHRoZSBsYXN0IGV2ZW50IHF1ZXVl ZC4NCisJICovDQorCWxhc3QgPSBpbm90aWZ5X2Rldl9nZXRfZXZlbnQoZGV2KTsNCisJaWYgKGRl di0+ZXZlbnRfY291bnQgJiYgbGFzdC0+ZXZlbnQubWFzayA9PSBtYXNrICYmDQorCQkJbGFzdC0+ ZXZlbnQud2QgPT0gd2F0Y2gtPndkKSB7DQorCQkvKiBDaGVjayBpZiB0aGUgZmlsZW5hbWVzIG1h dGNoICovDQorCQlpZiAoIWZpbGVuYW1lICYmIGxhc3QtPmV2ZW50LmZpbGVuYW1lWzBdID09ICdc MCcpDQorCQkJcmV0dXJuOw0KKwkJaWYgKGZpbGVuYW1lICYmICFzdHJjbXAobGFzdC0+ZXZlbnQu ZmlsZW5hbWUsIGZpbGVuYW1lKSkNCisJCQlyZXR1cm47DQorCX0NCisNCisJLyoNCisJICogdGhl IHF1ZXVlIGhhcyBhbHJlYWR5IG92ZXJmbG93ZWQgYW5kIHdlIGhhdmUgYWxyZWFkeSBzZW50IHRo ZQ0KKwkgKiBRX09WRVJGTE9XIGV2ZW50DQorCSAqLw0KKwlpZiAoZGV2LT5ldmVudF9jb3VudCA+ IGRldi0+bWF4X2V2ZW50cykNCisJCXJldHVybjsNCisNCisJLyogdGhlIHF1ZXVlIGhhcyBqdXN0 IG92ZXJmbG93ZWQgYW5kIHdlIG5lZWQgdG8gbm90aWZ5IHVzZXIgc3BhY2UgKi8NCisJaWYgKGRl di0+ZXZlbnRfY291bnQgPT0gZGV2LT5tYXhfZXZlbnRzKSB7DQorCQlrZXZlbnQgPSBrZXJuZWxf ZXZlbnQoLTEsIElOX1FfT1ZFUkZMT1csIGNvb2tpZSwgTlVMTCk7DQorCQlnb3RvIGFkZF9ldmVu dF90b19xdWV1ZTsNCisJfQ0KKw0KKwlpZiAoIWV2ZW50X2FuZChtYXNrLCB3YXRjaC0+aW5vZGUt Pmlub3RpZnlfZGF0YS0+d2F0Y2hfbWFzaykgfHwNCisJCQkhZXZlbnRfYW5kKG1hc2ssIHdhdGNo LT5tYXNrKSkNCisJCXJldHVybjsNCisNCisJZGV2LT5ldmVudF9jb3VudCsrOw0KKwlrZXZlbnQg PSBrZXJuZWxfZXZlbnQod2F0Y2gtPndkLCBtYXNrLCBjb29raWUsIGZpbGVuYW1lKTsNCisNCith ZGRfZXZlbnRfdG9fcXVldWU6DQorCWlmICgha2V2ZW50KSB7DQorCQlkZXYtPmV2ZW50X2NvdW50 LS07DQorCQlyZXR1cm47DQorCX0NCisNCisJLyogcXVldWUgdGhlIGV2ZW50IGFuZCB3YWtlIHVw IGFueW9uZSB3YWl0aW5nICovDQorCWxpc3RfYWRkX3RhaWwoJmtldmVudC0+bGlzdCwgJmRldi0+ ZXZlbnRzKTsNCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZkZXYtPndhaXQpOw0KK30NCisNCisv Kg0KKyAqIGlub3RpZnlfZGV2X2V2ZW50X2RlcXVldWUgLSBkZXN0cm95IGFuIGV2ZW50IG9uIHRo ZSBnaXZlbiBkZXZpY2UNCisgKg0KKyAqIENhbGxlciBtdXN0IGhvbGQgZGV2LT5sb2NrLg0KKyAq Lw0KK3N0YXRpYyB2b2lkIGlub3RpZnlfZGV2X2V2ZW50X2RlcXVldWUoc3RydWN0IGlub3RpZnlf ZGV2aWNlICpkZXYpDQorew0KKwlzdHJ1Y3QgaW5vdGlmeV9rZXJuZWxfZXZlbnQgKmtldmVudDsN CisNCisJaWYgKCFpbm90aWZ5X2Rldl9oYXNfZXZlbnRzKGRldikpDQorCQlyZXR1cm47DQorDQor CWtldmVudCA9IGlub3RpZnlfZGV2X2dldF9ldmVudChkZXYpOw0KKwlsaXN0X2RlbF9pbml0KCZr ZXZlbnQtPmxpc3QpOw0KKwlkZXYtPmV2ZW50X2NvdW50LS07DQorCWRlbGV0ZV9rZXJuZWxfZXZl bnQoa2V2ZW50KTsNCisNCit9DQorDQorLyoNCisgKiBpbm90aWZ5X2Rldl9nZXRfd2QgLSByZXR1 cm5zIHRoZSBuZXh0IFdEIGZvciB1c2UgYnkgdGhlIGdpdmVuIGRldg0KKyAqDQorICogVGhpcyBm dW5jdGlvbiBjYW4gc2xlZXAuDQorICovDQorc3RhdGljIGludCBpbm90aWZ5X2Rldl9nZXRfd2Qo c3RydWN0IGlub3RpZnlfZGV2aWNlICpkZXYsDQorCQkJCXN0cnVjdCBpbm90aWZ5X3dhdGNoICp3 YXRjaCkNCit7DQorCWludCByZXQ7DQorDQorCWlmICghZGV2IHx8ICF3YXRjaCB8fCBkZXYtPm5y X3dhdGNoZXMgPj0gY3VycmVudC0+cmxpbVtSTElNSVRfSVdBVENIRVNdLnJsaW1fY3VyKQ0KKwkJ cmV0dXJuIC0xOw0KKw0KK3JlcGVhdDoNCisJaWYgKCFpZHJfcHJlX2dldCgmZGV2LT5pZHIsIEdG UF9LRVJORUwpKSB7DQorCQlyZXR1cm4gLUVOT1NQQzsNCisJfQ0KKwlzcGluX2xvY2soJmRldi0+ bG9jayk7DQorCXJldCA9IGlkcl9nZXRfbmV3KCZkZXYtPmlkciwgd2F0Y2gsICZ3YXRjaC0+d2Qp Ow0KKwlzcGluX3VubG9jaygmZGV2LT5sb2NrKTsNCisJaWYgKHJldCA9PSAtRUFHQUlOKSAvKiBt b3JlIG1lbW9yeSBpcyByZXF1aXJlZCwgdHJ5IGFnYWluICovDQorCQlnb3RvIHJlcGVhdDsNCisJ ZWxzZSBpZiAocmV0KSAgICAgICAvKiB0aGUgaWRyIGlzIGZ1bGwhICovDQorCQlyZXR1cm4gLUVO T1NQQzsNCisNCisJZGV2LT5ucl93YXRjaGVzKys7DQorDQorCXJldHVybiAwOw0KK30NCisNCisv Kg0KKyAqIGlub3RpZnlfZGV2X3B1dF93ZCAtIHJlbGVhc2UgdGhlIGdpdmVuIFdEIG9uIHRoZSBn aXZlbiBkZXZpY2UNCisgKg0KKyAqIENhbGxlciBtdXN0IGhvbGQgZGV2LT5sb2NrLg0KKyAqLw0K K3N0YXRpYyBpbnQgaW5vdGlmeV9kZXZfcHV0X3dkKHN0cnVjdCBpbm90aWZ5X2RldmljZSAqZGV2 LCBzMzIgd2QpDQorew0KKwlpZiAoIWRldiB8fCB3ZCA8IDApDQorCQlyZXR1cm4gLTE7DQorDQor CWRldi0+bnJfd2F0Y2hlcy0tOw0KKwlpZHJfcmVtb3ZlKCZkZXYtPmlkciwgd2QpOw0KKw0KKwly ZXR1cm4gMDsNCit9DQorDQorLyoNCisgKiBjcmVhdGVfd2F0Y2ggLSBjcmVhdGVzIGEgd2F0Y2gg b24gdGhlIGdpdmVuIGRldmljZS4NCisgKg0KKyAqIEdyYWJzIGRldi0+bG9jaywgc28gdGhlIGNh bGxlciBtdXN0IG5vdCBob2xkIGl0Lg0KKyAqLw0KK3N0YXRpYyBzdHJ1Y3QgaW5vdGlmeV93YXRj aCAqY3JlYXRlX3dhdGNoKHN0cnVjdCBpbm90aWZ5X2RldmljZSAqZGV2LA0KKwkJCQkJICB1MzIg bWFzaywgc3RydWN0IGlub2RlICppbm9kZSkNCit7DQorCXN0cnVjdCBpbm90aWZ5X3dhdGNoICp3 YXRjaDsNCisNCisJd2F0Y2ggPSBrbWVtX2NhY2hlX2FsbG9jKHdhdGNoX2NhY2hlcCwgR0ZQX0tF Uk5FTCk7DQorCWlmICghd2F0Y2gpDQorCQlyZXR1cm4gTlVMTDsNCisNCisJd2F0Y2gtPm1hc2sg PSBtYXNrOw0KKwl3YXRjaC0+aW5vZGUgPSBpbm9kZTsNCisJd2F0Y2gtPmRldiA9IGRldjsNCisJ SU5JVF9MSVNUX0hFQUQoJndhdGNoLT5kX2xpc3QpOw0KKwlJTklUX0xJU1RfSEVBRCgmd2F0Y2gt PmlfbGlzdCk7DQorCUlOSVRfTElTVF9IRUFEKCZ3YXRjaC0+dV9saXN0KTsNCisNCisJaWYgKGlu b3RpZnlfZGV2X2dldF93ZChkZXYsIHdhdGNoKSkgew0KKwkJa21lbV9jYWNoZV9mcmVlKHdhdGNo X2NhY2hlcCwgd2F0Y2gpOw0KKwkJcmV0dXJuIE5VTEw7DQorCX0NCisNCisJcmV0dXJuIHdhdGNo Ow0KK30NCisNCisvKg0KKyAqIGRlbGV0ZV93YXRjaCAtIHJlbW92ZXMgdGhlIGdpdmVuICd3YXRj aCcgZnJvbSB0aGUgZ2l2ZW4gJ2RldicNCisgKg0KKyAqIENhbGxlciBtdXN0IGhvbGQgZGV2LT5s b2NrLg0KKyAqLw0KK3N0YXRpYyB2b2lkIGRlbGV0ZV93YXRjaChzdHJ1Y3QgaW5vdGlmeV9kZXZp Y2UgKmRldiwNCisJCQkgc3RydWN0IGlub3RpZnlfd2F0Y2ggKndhdGNoKQ0KK3sNCisJaW5vdGlm eV9kZXZfcHV0X3dkKGRldiwgd2F0Y2gtPndkKTsNCisJa21lbV9jYWNoZV9mcmVlKHdhdGNoX2Nh Y2hlcCwgd2F0Y2gpOw0KK30NCisNCisvKg0KKyAqIGlub3RpZnlfZmluZF9kZXYgLSBmaW5kIHRo ZSB3YXRjaCBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGlub2RlIGFuZCBkZXYNCisgKg0KKyAq IENhbGxlciBtdXN0IGhvbGQgZGV2LT5sb2NrLg0KKyAqLw0KK3N0YXRpYyBzdHJ1Y3QgaW5vdGlm eV93YXRjaCAqaW5vZGVfZmluZF9kZXYoc3RydWN0IGlub2RlICppbm9kZSwNCisJCQkJCSAgICBz dHJ1Y3QgaW5vdGlmeV9kZXZpY2UgKmRldikNCit7DQorCXN0cnVjdCBpbm90aWZ5X3dhdGNoICp3 YXRjaDsNCisNCisJaWYgKCFpbm9kZS0+aW5vdGlmeV9kYXRhKQ0KKwkJcmV0dXJuIE5VTEw7DQor DQorCWxpc3RfZm9yX2VhY2hfZW50cnkod2F0Y2gsICZpbm9kZS0+aW5vdGlmeV9kYXRhLT53YXRj aGVzLCBpX2xpc3QpIHsNCisJCWlmICh3YXRjaC0+ZGV2ID09IGRldikNCisJCQlyZXR1cm4gd2F0 Y2g7DQorCX0NCisNCisJcmV0dXJuIE5VTEw7DQorfQ0KKw0KKy8qDQorICogZGV2X2ZpbmRfd2Qg LSBnaXZlbiBhIChkZXYsd2QpIHBhaXIsIHJldHVybnMgdGhlIG1hdGNoaW5nIGlub3RpZnlfd2F0 Y2hlcg0KKyAqDQorICogUmV0dXJucyB0aGUgcmVzdWx0cyBvZiBsb29raW5nIHVwIChkZXYsd2Qp IGluIHRoZSBpZHIgbGF5ZXIuICBOVUxMIGlzDQorICogcmV0dXJuZWQgb24gZXJyb3IuDQorICoN CisgKiBUaGUgY2FsbGVyIG11c3QgaG9sZCBkZXYtPmxvY2suDQorICovDQorc3RhdGljIGlubGlu ZSBzdHJ1Y3QgaW5vdGlmeV93YXRjaCAqZGV2X2ZpbmRfd2Qoc3RydWN0IGlub3RpZnlfZGV2aWNl ICpkZXYsDQorCQkJCQkJdTMyIHdkKQ0KK3sNCisJcmV0dXJuIGlkcl9maW5kKCZkZXYtPmlkciwg d2QpOw0KK30NCisNCitzdGF0aWMgaW50IGlub3RpZnlfZGV2X2lzX3dhdGNoaW5nX2lub2RlKHN0 cnVjdCBpbm90aWZ5X2RldmljZSAqZGV2LA0KKwkJCQkJIHN0cnVjdCBpbm9kZSAqaW5vZGUpDQor ew0KKwlzdHJ1Y3QgaW5vdGlmeV93YXRjaCAqd2F0Y2g7DQorDQorCWxpc3RfZm9yX2VhY2hfZW50 cnkod2F0Y2gsICZkZXYtPndhdGNoZXMsIGRfbGlzdCkgew0KKwkJaWYgKHdhdGNoLT5pbm9kZSA9 PSBpbm9kZSkgew0KKwkJCXJldHVybiAxOw0KKwkJfQ0KKwl9DQorDQorCXJldHVybiAwOw0KK30N CisNCisvKg0KKyAqIGlub3RpZnlfZGV2X2FkZF93YXRjaGVyIC0gYWRkIHRoZSBnaXZlbiB3YXRj aGVyIHRvIHRoZSBnaXZlbiBkZXZpY2UgaW5zdGFuY2UNCisgKg0KKyAqIENhbGxlciBtdXN0IGhv bGQgZGV2LT5sb2NrLg0KKyAqLw0KK3N0YXRpYyBpbnQgaW5vdGlmeV9kZXZfYWRkX3dhdGNoKHN0 cnVjdCBpbm90aWZ5X2RldmljZSAqZGV2LA0KKwkJCQkgc3RydWN0IGlub3RpZnlfd2F0Y2ggKndh dGNoKQ0KK3sNCisJaWYgKCFkZXYgfHwgIXdhdGNoKSB7DQorCQlyZXR1cm4gLUVJTlZBTDsNCisJ fQ0KKw0KKwlsaXN0X2FkZCgmd2F0Y2gtPmRfbGlzdCwgJmRldi0+d2F0Y2hlcyk7DQorCXJldHVy biAwOw0KK30NCisNCisvKg0KKyAqIGlub3RpZnlfZGV2X3JtX3dhdGNoIC0gcmVtb3ZlIHRoZSBn aXZlbiB3YXRjaCBmcm9tIHRoZSBnaXZlbiBkZXZpY2UNCisgKg0KKyAqIENhbGxlciBtdXN0IGhv bGQgZGV2LT5sb2NrIGJlY2F1c2Ugd2UgY2FsbCBpbm90aWZ5X2Rldl9xdWV1ZV9ldmVudCgpLg0K KyAqLw0KK3N0YXRpYyBpbnQgaW5vdGlmeV9kZXZfcm1fd2F0Y2goc3RydWN0IGlub3RpZnlfZGV2 aWNlICpkZXYsDQorCQkJCXN0cnVjdCBpbm90aWZ5X3dhdGNoICp3YXRjaCkNCit7DQorCWlmICgh d2F0Y2gpDQorCQlyZXR1cm4gLUVJTlZBTDsNCisNCisJaW5vdGlmeV9kZXZfcXVldWVfZXZlbnQo ZGV2LCB3YXRjaCwgSU5fSUdOT1JFRCwgMCwgTlVMTCk7DQorCWxpc3RfZGVsX2luaXQoJndhdGNo LT5kX2xpc3QpOw0KKw0KKwlyZXR1cm4gMDsNCit9DQorDQordm9pZCBpbm9kZV91cGRhdGVfd2F0 Y2hfbWFzayhzdHJ1Y3QgaW5vZGUgKmlub2RlKQ0KK3sNCisJc3RydWN0IGlub3RpZnlfd2F0Y2gg KndhdGNoOw0KKwl1MzIgbmV3X21hc2s7DQorDQorCWlmICghaW5vZGUtPmlub3RpZnlfZGF0YSkN CisJCXJldHVybjsNCisNCisJbmV3X21hc2sgPSAwOw0KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHdh dGNoLCAmaW5vZGUtPmlub3RpZnlfZGF0YS0+d2F0Y2hlcywgaV9saXN0KQ0KKwkJbmV3X21hc2sg fD0gd2F0Y2gtPm1hc2s7DQorDQorCWlub2RlLT5pbm90aWZ5X2RhdGEtPndhdGNoX21hc2sgPSBu ZXdfbWFzazsNCit9DQorDQorLyoNCisgKiBpbm9kZV9hZGRfd2F0Y2ggLSBhZGQgYSB3YXRjaCB0 byB0aGUgZ2l2ZW4gaW5vZGUNCisgKg0KKyAqIENhbGxlcnMgbXVzdCBob2xkIGRldi0+bG9jaywg YmVjYXVzZSB3ZSBjYWxsIGlub2RlX2ZpbmRfZGV2KCkuDQorICovDQorc3RhdGljIGludCBpbm9k ZV9hZGRfd2F0Y2goc3RydWN0IGlub2RlICppbm9kZSwNCisJCQkgICBzdHJ1Y3QgaW5vdGlmeV93 YXRjaCAqd2F0Y2gpDQorew0KKwlpZiAoIWlub2RlIHx8ICF3YXRjaCkNCisJCXJldHVybiAtRUlO VkFMOw0KKw0KKwkvKg0KKwkgKiBUaGlzIGlub2RlIGRvZXNuJ3QgaGF2ZSBhbiBpbm90aWZ5X2Rh dGEgc3RydWN0dXJlIGF0dGFjaGVkIHRvIGl0DQorCSAqLw0KKwlpZiAoIWlub2RlLT5pbm90aWZ5 X2RhdGEpIHsNCisJCWlub2RlLT5pbm90aWZ5X2RhdGEgPSBrbWVtX2NhY2hlX2FsbG9jKGlub2Rl X2RhdGFfY2FjaGVwLA0KKwkJCQkJCSAgICAgICBHRlBfQVRPTUlDKTsNCisNCisJCWlmICghaW5v ZGUtPmlub3RpZnlfZGF0YSkNCisJCQlyZXR1cm4gLUVOT01FTTsNCisNCisJCUlOSVRfTElTVF9I RUFEKCZpbm9kZS0+aW5vdGlmeV9kYXRhLT53YXRjaGVzKTsNCisJCWlub2RlLT5pbm90aWZ5X2Rh dGEtPndhdGNoX21hc2sgPSAwOw0KKwkJaW5vZGUtPmlub3RpZnlfZGF0YS0+d2F0Y2hfY291bnQg PSAwOw0KKwl9DQorDQorCWlmIChpbm9kZV9maW5kX2RldiAoaW5vZGUsIHdhdGNoLT5kZXYpKQ0K Kwl7DQorCQlyZXR1cm4gLUVJTlZBTDsNCisJfQ0KKw0KKwlsaXN0X2FkZCgmd2F0Y2gtPmlfbGlz dCwgJmlub2RlLT5pbm90aWZ5X2RhdGEtPndhdGNoZXMpOw0KKwlpbm9kZS0+aW5vdGlmeV9kYXRh LT53YXRjaF9jb3VudCsrOw0KKwlpbm9kZV91cGRhdGVfd2F0Y2hfbWFzayhpbm9kZSk7DQorDQor CXJldHVybiAwOw0KK30NCisNCitzdGF0aWMgaW50IGlub2RlX3JtX3dhdGNoKHN0cnVjdCBpbm9k ZSAqaW5vZGUsDQorCQkJICBzdHJ1Y3QgaW5vdGlmeV93YXRjaCAqd2F0Y2gpDQorew0KKwlpZiAo IWlub2RlIHx8ICF3YXRjaCB8fCAhaW5vZGUtPmlub3RpZnlfZGF0YSkNCisJCXJldHVybiAtRUlO VkFMOw0KKw0KKwlsaXN0X2RlbF9pbml0KCZ3YXRjaC0+aV9saXN0KTsNCisJaW5vZGUtPmlub3Rp ZnlfZGF0YS0+d2F0Y2hfY291bnQtLTsNCisNCisJaWYgKCFpbm9kZS0+aW5vdGlmeV9kYXRhLT53 YXRjaF9jb3VudCkgew0KKwkJa21lbV9jYWNoZV9mcmVlKGlub2RlX2RhdGFfY2FjaGVwLCBpbm9k ZS0+aW5vdGlmeV9kYXRhKTsNCisJCWlub2RlLT5pbm90aWZ5X2RhdGEgPSBOVUxMOw0KKwkJcmV0 dXJuIDA7DQorCX0NCisNCisJaW5vZGVfdXBkYXRlX3dhdGNoX21hc2soaW5vZGUpOw0KKw0KKwly ZXR1cm4gMDsNCit9DQorDQorLyogS2VybmVsIEFQSSAqLw0KKw0KK3ZvaWQgaW5vdGlmeV9pbm9k ZV9xdWV1ZV9ldmVudChzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1MzIgbWFzaywgdTMyIGNvb2tpZSwN CisJCQkgICAgICAgY29uc3QgY2hhciAqZmlsZW5hbWUpDQorew0KKwlzdHJ1Y3QgaW5vdGlmeV93 YXRjaCAqd2F0Y2g7DQorDQorCWlmICghaW5vZGUtPmlub3RpZnlfZGF0YSkNCisJCXJldHVybjsN CisNCisJc3Bpbl9sb2NrKCZpbm9kZS0+aV9sb2NrKTsNCisNCisJbGlzdF9mb3JfZWFjaF9lbnRy eSh3YXRjaCwgJmlub2RlLT5pbm90aWZ5X2RhdGEtPndhdGNoZXMsIGlfbGlzdCkgew0KKwkJc3Bp bl9sb2NrKCZ3YXRjaC0+ZGV2LT5sb2NrKTsNCisJCWlub3RpZnlfZGV2X3F1ZXVlX2V2ZW50KHdh dGNoLT5kZXYsIHdhdGNoLCBtYXNrLCBjb29raWUsDQorCQkJCQlmaWxlbmFtZSk7DQorCQlzcGlu X3VubG9jaygmd2F0Y2gtPmRldi0+bG9jayk7DQorCX0NCisNCisJc3Bpbl91bmxvY2soJmlub2Rl LT5pX2xvY2spOw0KK30NCitFWFBPUlRfU1lNQk9MX0dQTChpbm90aWZ5X2lub2RlX3F1ZXVlX2V2 ZW50KTsNCisNCit2b2lkIGlub3RpZnlfZGVudHJ5X3BhcmVudF9xdWV1ZV9ldmVudChzdHJ1Y3Qg ZGVudHJ5ICpkZW50cnksIHUzMiBtYXNrLA0KKwkJCQkgICAgICAgdTMyIGNvb2tpZSwgY29uc3Qg Y2hhciAqZmlsZW5hbWUpDQorew0KKwlzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQ7DQorDQorCXBhcmVu dCA9IGRnZXRfcGFyZW50KGRlbnRyeSk7DQorCWlub3RpZnlfaW5vZGVfcXVldWVfZXZlbnQocGFy ZW50LT5kX2lub2RlLCBtYXNrLCBjb29raWUsIGZpbGVuYW1lKTsNCisJZHB1dChwYXJlbnQpOw0K K30NCitFWFBPUlRfU1lNQk9MX0dQTChpbm90aWZ5X2RlbnRyeV9wYXJlbnRfcXVldWVfZXZlbnQp Ow0KKw0KK3UzMiBpbm90aWZ5X2dldF9jb29raWUoKQ0KK3sNCisJYXRvbWljX2luYygmaW5vdGlm eV9jb29raWUpOw0KKw0KKwlyZXR1cm4gYXRvbWljX3JlYWQoJmlub3RpZnlfY29va2llKTsNCit9 DQorRVhQT1JUX1NZTUJPTF9HUEwoaW5vdGlmeV9nZXRfY29va2llKTsNCisNCitzdGF0aWMgdm9p ZCBpZ25vcmVfaGVscGVyKHN0cnVjdCBpbm90aWZ5X3dhdGNoICp3YXRjaCwgaW50IGV2ZW50KQ0K K3sNCisJc3RydWN0IGlub3RpZnlfZGV2aWNlICpkZXY7DQorCXN0cnVjdCBpbm9kZSAqaW5vZGU7 DQorDQorCWlub2RlID0gd2F0Y2gtPmlub2RlOw0KKwlkZXYgPSB3YXRjaC0+ZGV2Ow0KKw0KKwlz cGluX2xvY2soJmlub2RlLT5pX2xvY2spOw0KKwlzcGluX2xvY2soJmRldi0+bG9jayk7DQorDQor CWlmIChldmVudCkNCisJCWlub3RpZnlfZGV2X3F1ZXVlX2V2ZW50KGRldiwgd2F0Y2gsIGV2ZW50 LCAwLCBOVUxMKTsNCisNCisJaW5vZGVfcm1fd2F0Y2goaW5vZGUsIHdhdGNoKTsNCisJaW5vdGlm eV9kZXZfcm1fd2F0Y2god2F0Y2gtPmRldiwgd2F0Y2gpOw0KKwlsaXN0X2RlbCgmd2F0Y2gtPnVf bGlzdCk7DQorDQorCWRlbGV0ZV93YXRjaChkZXYsIHdhdGNoKTsNCisJc3Bpbl91bmxvY2soJmRl di0+bG9jayk7DQorCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsNCisNCisJdW5yZWZfaW5v ZGUoaW5vZGUpOw0KK30NCisNCitzdGF0aWMgdm9pZCBwcm9jZXNzX3Vtb3VudF9saXN0KHN0cnVj dCBsaXN0X2hlYWQgKnVtb3VudCkNCit7DQorCXN0cnVjdCBpbm90aWZ5X3dhdGNoICp3YXRjaCwg Km5leHQ7DQorDQorCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh3YXRjaCwgbmV4dCwgdW1vdW50 LCB1X2xpc3QpDQorCQlpZ25vcmVfaGVscGVyKHdhdGNoLCBJTl9VTk1PVU5UKTsNCit9DQorDQor LyoNCisgKiBidWlsZF91bW91bnRfbGlzdCAtIGJ1aWxkIGEgbGlzdCBvZiB3YXRjaGVzIGFmZmVj dGVkIGJ5IGFuIHVubW91bnQuDQorICoNCisgKiBDYWxsZXIgbXVzdCBob2xkIGlub2RlX2xvY2su DQorICovDQorc3RhdGljIHZvaWQgYnVpbGRfdW1vdW50X2xpc3Qoc3RydWN0IGxpc3RfaGVhZCAq aGVhZCwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwNCisJCQkgICAgICBzdHJ1Y3QgbGlzdF9oZWFk ICp1bW91bnQpDQorew0KKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOw0KKw0KKwlsaXN0X2Zvcl9lYWNo X2VudHJ5KGlub2RlLCBoZWFkLCBpX2xpc3QpIHsNCisJCXN0cnVjdCBpbm90aWZ5X3dhdGNoICp3 YXRjaDsNCisNCisJCWlmIChpbm9kZS0+aV9zYiAhPSBzYikNCisJCQljb250aW51ZTsNCisNCisJ CWlmICghaW5vZGUtPmlub3RpZnlfZGF0YSkNCisJCQljb250aW51ZTsNCisNCisJCXNwaW5fbG9j aygmaW5vZGUtPmlfbG9jayk7DQorDQorCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHdhdGNoLCAmaW5v ZGUtPmlub3RpZnlfZGF0YS0+d2F0Y2hlcywNCisJCQkJICAgIGlfbGlzdCkgew0KKwkJCWxpc3Rf YWRkKCZ3YXRjaC0+dV9saXN0LCB1bW91bnQpOw0KKwkJfQ0KKw0KKwkJc3Bpbl91bmxvY2soJmlu b2RlLT5pX2xvY2spOw0KKwl9DQorfQ0KKw0KK3ZvaWQgaW5vdGlmeV9zdXBlcl9ibG9ja191bW91 bnQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikNCit7DQorCXN0cnVjdCBsaXN0X2hlYWQgdW1vdW50 Ow0KKw0KKwlJTklUX0xJU1RfSEVBRCgmdW1vdW50KTsNCisNCisJc3Bpbl9sb2NrKCZpbm9kZV9s b2NrKTsNCisJYnVpbGRfdW1vdW50X2xpc3QoJmlub2RlX2luX3VzZSwgc2IsICZ1bW91bnQpOw0K KwlzcGluX3VubG9jaygmaW5vZGVfbG9jayk7DQorDQorCXByb2Nlc3NfdW1vdW50X2xpc3QoJnVt b3VudCk7DQorfQ0KK0VYUE9SVF9TWU1CT0xfR1BMKGlub3RpZnlfc3VwZXJfYmxvY2tfdW1vdW50 KTsNCisNCisvKg0KKyAqIGlub3RpZnlfaW5vZGVfaXNfZGVhZCAtIGFuIGlub2RlIGhhcyBiZWVu IGRlbGV0ZWQsIGNsZWFudXAgYW55IHdhdGNoZXMNCisgKg0KKyAqIEZJWE1FOiBDYWxsZXJzIG5l ZWQgdG8gYWx3YXlzIGhvbGQgaW5vZGUtPmlfbG9jay4NCisgKi8NCit2b2lkIGlub3RpZnlfaW5v ZGVfaXNfZGVhZChzdHJ1Y3QgaW5vZGUgKmlub2RlKQ0KK3sNCisJc3RydWN0IGlub3RpZnlfd2F0 Y2ggKndhdGNoLCAqbmV4dDsNCisJc3RydWN0IGlub3RpZnlfaW5vZGVfZGF0YSAqZGF0YTsNCisN CisJZGF0YSA9IGlub2RlLT5pbm90aWZ5X2RhdGE7DQorCWlmICghZGF0YSkNCisJCXJldHVybjsN CisNCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHdhdGNoLCBuZXh0LCAmZGF0YS0+d2F0Y2hl cywgaV9saXN0KQ0KKwkJaWdub3JlX2hlbHBlcih3YXRjaCwgMCk7DQorfQ0KK0VYUE9SVF9TWU1C T0xfR1BMKGlub3RpZnlfaW5vZGVfaXNfZGVhZCk7DQorDQorLyogVGhlIGRyaXZlciBpbnRlcmZh Y2UgaXMgaW1wbGVtZW50ZWQgYmVsb3cgKi8NCisNCitzdGF0aWMgdW5zaWduZWQgaW50IGlub3Rp ZnlfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdCkNCit7DQorICAgICAg ICBzdHJ1Y3QgaW5vdGlmeV9kZXZpY2UgKmRldjsNCisNCisgICAgICAgIGRldiA9IGZpbGUtPnBy aXZhdGVfZGF0YTsNCisNCisgICAgICAgIHBvbGxfd2FpdChmaWxlLCAmZGV2LT53YWl0LCB3YWl0 KTsNCisNCisgICAgICAgIGlmIChpbm90aWZ5X2Rldl9oYXNfZXZlbnRzKGRldikpDQorICAgICAg ICAgICAgICAgIHJldHVybiBQT0xMSU4gfCBQT0xMUkROT1JNOw0KKw0KKyAgICAgICAgcmV0dXJu IDA7DQorfQ0KKw0KK3N0YXRpYyBzc2l6ZV90IGlub3RpZnlfcmVhZChzdHJ1Y3QgZmlsZSAqZmls ZSwgY2hhciBfX3VzZXIgKmJ1ZiwNCisJCQkgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBvcykN Cit7DQorCXNpemVfdCBldmVudF9zaXplOw0KKwlzdHJ1Y3QgaW5vdGlmeV9kZXZpY2UgKmRldjsN CisJY2hhciAqc3RhcnQ7DQorCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOw0KKw0K KwlzdGFydCA9IGJ1ZjsNCisJZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOw0KKw0KKwkvKiBXZSBv bmx5IGhhbmQgb3V0IGZ1bGwgaW5vdGlmeSBldmVudHMgKi8NCisJZXZlbnRfc2l6ZSA9IHNpemVv ZihzdHJ1Y3QgaW5vdGlmeV9ldmVudCk7DQorCWlmIChjb3VudCA8IGV2ZW50X3NpemUpDQorCQly ZXR1cm4gLUVJTlZBTDsNCisNCisJd2hpbGUoMSkgew0KKwkJaW50IGhhc19ldmVudHM7DQorDQor CQlzcGluX2xvY2soJmRldi0+bG9jayk7DQorCQloYXNfZXZlbnRzID0gaW5vdGlmeV9kZXZfaGFz X2V2ZW50cyhkZXYpOw0KKwkJc3Bpbl91bmxvY2soJmRldi0+bG9jayk7DQorCQlpZiAoaGFzX2V2 ZW50cykNCisJCQlicmVhazsNCisNCisJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykN CisJCQlyZXR1cm4gLUVBR0FJTjsNCisNCisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkN CisJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOw0KKw0KKwkJYWRkX3dhaXRfcXVldWUoJmRldi0+d2Fp dCwgJndhaXQpOw0KKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsNCisN CisJCXNjaGVkdWxlKCk7DQorDQorCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwkJ DQorCQlyZW1vdmVfd2FpdF9xdWV1ZSgmZGV2LT53YWl0LCAmd2FpdCk7DQorCX0NCisNCisJd2hp bGUgKGNvdW50ID49IGV2ZW50X3NpemUpIHsNCisJCXN0cnVjdCBpbm90aWZ5X2tlcm5lbF9ldmVu dCAqa2V2ZW50Ow0KKw0KKwkJc3Bpbl9sb2NrKCZkZXYtPmxvY2spOw0KKwkJaWYgKCFpbm90aWZ5 X2Rldl9oYXNfZXZlbnRzKGRldikpIHsNCisJCQlzcGluX3VubG9jaygmZGV2LT5sb2NrKTsNCisJ CQlicmVhazsNCisJCX0NCisJCWtldmVudCA9IGlub3RpZnlfZGV2X2dldF9ldmVudChkZXYpOw0K KwkJc3Bpbl91bmxvY2soJmRldi0+bG9jayk7DQorCQlpZiAoY29weV90b191c2VyKGJ1ZiwgJmtl dmVudC0+ZXZlbnQsIGV2ZW50X3NpemUpKQ0KKwkJCXJldHVybiAtRUZBVUxUOw0KKw0KKwkJc3Bp bl9sb2NrKCZkZXYtPmxvY2spOw0KKwkJaW5vdGlmeV9kZXZfZXZlbnRfZGVxdWV1ZShkZXYpOw0K KwkJc3Bpbl91bmxvY2soJmRldi0+bG9jayk7DQorCQljb3VudCAtPSBldmVudF9zaXplOw0KKwkJ YnVmICs9IGV2ZW50X3NpemU7DQorCX0NCisNCisJcmV0dXJuIGJ1ZiAtIHN0YXJ0Ow0KK30NCisN CitzdGF0aWMgaW50IGlub3RpZnlfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmls ZSAqZmlsZSkNCit7DQorCXN0cnVjdCBpbm90aWZ5X2RldmljZSAqZGV2Ow0KKw0KKwlhdG9taWNf aW5jKCZ3YXRjaF9jb3VudCk7DQorDQorCWRldiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpbm90 aWZ5X2RldmljZSksIEdGUF9LRVJORUwpOw0KKwlpZiAoIWRldikNCisJCXJldHVybiAtRU5PTUVN Ow0KKw0KKwlpZHJfaW5pdCgmZGV2LT5pZHIpOw0KKw0KKwlJTklUX0xJU1RfSEVBRCgmZGV2LT5l dmVudHMpOw0KKwlJTklUX0xJU1RfSEVBRCgmZGV2LT53YXRjaGVzKTsNCisJaW5pdF93YWl0cXVl dWVfaGVhZCgmZGV2LT53YWl0KTsNCisNCisJZGV2LT5ldmVudF9jb3VudCA9IDA7DQorCWRldi0+ bnJfd2F0Y2hlcyA9IDA7DQorCWRldi0+bG9jayA9IFNQSU5fTE9DS19VTkxPQ0tFRDsNCisJZGV2 LT5tYXhfZXZlbnRzID0gc3lzZnNfYXR0cmliX21heF9xdWV1ZWRfZXZlbnRzOw0KKw0KKwlmaWxl LT5wcml2YXRlX2RhdGEgPSBkZXY7DQorDQorCXJldHVybiAwOw0KK30NCisNCisvKg0KKyAqIGlu b3RpZnlfcmVsZWFzZV9hbGxfd2F0Y2hlcyAtIGRlc3Ryb3kgYWxsIHdhdGNoZXMgb24gYSBnaXZl biBkZXZpY2UNCisgKg0KKyAqIEZJWE1FOiBEbyB3ZSB3YW50IGEgbG9jayBoZXJlPw0KKyAqLw0K K3N0YXRpYyB2b2lkIGlub3RpZnlfcmVsZWFzZV9hbGxfd2F0Y2hlcyhzdHJ1Y3QgaW5vdGlmeV9k ZXZpY2UgKmRldikNCit7DQorCXN0cnVjdCBpbm90aWZ5X3dhdGNoICp3YXRjaCwqbmV4dDsNCisN CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHdhdGNoLCBuZXh0LCAmZGV2LT53YXRjaGVzLCBk X2xpc3QpIHsNCisJCWlnbm9yZV9oZWxwZXIod2F0Y2gsIDApOw0KKwl9DQorfQ0KKw0KKy8qDQor ICogaW5vdGlmeV9yZWxlYXNlX2FsbF9ldmVudHMgLSBkZXN0cm95IGFsbCBvZiB0aGUgZXZlbnRz IG9uIGEgZ2l2ZW4gZGV2aWNlDQorICovDQorc3RhdGljIHZvaWQgaW5vdGlmeV9yZWxlYXNlX2Fs bF9ldmVudHMoc3RydWN0IGlub3RpZnlfZGV2aWNlICpkZXYpDQorew0KKwlzcGluX2xvY2soJmRl di0+bG9jayk7DQorCXdoaWxlIChpbm90aWZ5X2Rldl9oYXNfZXZlbnRzKGRldikpDQorCQlpbm90 aWZ5X2Rldl9ldmVudF9kZXF1ZXVlKGRldik7DQorCXNwaW5fdW5sb2NrKCZkZXYtPmxvY2spOw0K K30NCisNCitzdGF0aWMgaW50IGlub3RpZnlfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBz dHJ1Y3QgZmlsZSAqZmlsZSkNCit7DQorCXN0cnVjdCBpbm90aWZ5X2RldmljZSAqZGV2Ow0KKw0K KwlkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7DQorCWlub3RpZnlfcmVsZWFzZV9hbGxfd2F0Y2hl cyhkZXYpOw0KKwlpbm90aWZ5X3JlbGVhc2VfYWxsX2V2ZW50cyhkZXYpOw0KKwlrZnJlZShkZXYp Ow0KKw0KKwlhdG9taWNfZGVjKCZ3YXRjaF9jb3VudCk7DQorCXJldHVybiAwOw0KK30NCisNCitz dGF0aWMgaW50IGlub3RpZnlfd2F0Y2goc3RydWN0IGlub3RpZnlfZGV2aWNlICpkZXYsDQorCQkJ IHN0cnVjdCBpbm90aWZ5X3dhdGNoX3JlcXVlc3QgKnJlcXVlc3QpDQorew0KKwlzdHJ1Y3QgaW5v ZGUgKmlub2RlOw0KKwlzdHJ1Y3QgaW5vdGlmeV93YXRjaCAqd2F0Y2g7DQorCWludCByZXQ7DQor DQorCWlub2RlID0gZmluZF9pbm9kZShyZXF1ZXN0LT5kaXJuYW1lKTsNCisJaWYgKElTX0VSUihp bm9kZSkpIHsNCisJCXJldHVybiBQVFJfRVJSKGlub2RlKTsNCisJfQ0KKw0KKwlzcGluX2xvY2so Jmlub2RlLT5pX2xvY2spOw0KKwlzcGluX2xvY2soJmRldi0+bG9jayk7DQorDQorCS8qDQorCSAq IFRoaXMgaGFuZGxlcyB0aGUgY2FzZSBvZiByZS1hZGRpbmcgYSBkaXJlY3Rvcnkgd2UgYXJlIGFs cmVhZHkNCisJICogd2F0Y2hpbmcsIHdlIGp1c3QgdXBkYXRlIHRoZSBtYXNrIGFuZCByZXR1cm4g MA0KKwkgKi8NCisJaWYgKGlub3RpZnlfZGV2X2lzX3dhdGNoaW5nX2lub2RlKGRldiwgaW5vZGUp KSB7DQorCQlzdHJ1Y3QgaW5vdGlmeV93YXRjaCAqb3dhdGNoOwkvKiB0aGUgb2xkIHdhdGNoICov DQorDQorCQlvd2F0Y2ggPSBpbm9kZV9maW5kX2Rldihpbm9kZSwgZGV2KTsNCisJCW93YXRjaC0+ bWFzayA9IHJlcXVlc3QtPm1hc2s7DQorCQlpbm9kZV91cGRhdGVfd2F0Y2hfbWFzayhpbm9kZSk7 DQorCQlzcGluX3VubG9jaygmZGV2LT5sb2NrKTsNCisJCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9s b2NrKTsJCQ0KKwkJdW5yZWZfaW5vZGUoaW5vZGUpOw0KKw0KKwkJcmV0dXJuIG93YXRjaC0+d2Q7 DQorCX0NCisNCisJc3Bpbl91bmxvY2soJmRldi0+bG9jayk7DQorCXNwaW5fdW5sb2NrKCZpbm9k ZS0+aV9sb2NrKTsJDQorDQorCXdhdGNoID0gY3JlYXRlX3dhdGNoKGRldiwgcmVxdWVzdC0+bWFz aywgaW5vZGUpOw0KKwlpZiAoIXdhdGNoKSB7DQorCQl1bnJlZl9pbm9kZShpbm9kZSk7DQorCQly ZXR1cm4gLUVOT1NQQzsNCisJfQ0KKw0KKwlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOw0KKwlz cGluX2xvY2soJmRldi0+bG9jayk7DQorDQorCS8qIFdlIGNhbid0IGFkZCBhbnltb3JlIHdhdGNo ZXMgdG8gdGhpcyBkZXZpY2UgKi8NCisJaWYgKGlub3RpZnlfZGV2X2FkZF93YXRjaChkZXYsIHdh dGNoKSkgew0KKwkJZGVsZXRlX3dhdGNoKGRldiwgd2F0Y2gpOw0KKwkJc3Bpbl91bmxvY2soJmRl di0+bG9jayk7DQorCQlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CQkNCisJCXVucmVmX2lu b2RlKGlub2RlKTsNCisJCXJldHVybiAtRUlOVkFMOw0KKwl9DQorDQorCXJldCA9IGlub2RlX2Fk ZF93YXRjaChpbm9kZSwgd2F0Y2gpOw0KKwlpZihyZXQgPCAwKSB7DQorCQlsaXN0X2RlbF9pbml0 KCZ3YXRjaC0+ZF9saXN0KTsgLyogaW5vdGlmeV9kZXZfcm1fd2F0Y2ggdy9vIGV2ZW50ICovDQor CQlkZWxldGVfd2F0Y2goZGV2LCB3YXRjaCk7DQorCQlzcGluX3VubG9jaygmZGV2LT5sb2NrKTsN CisJCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsNCisJCXVucmVmX2lub2RlKGlub2RlKTsN CisJCXJldHVybiByZXQ7DQorCX0NCisNCisJc3Bpbl91bmxvY2soJmRldi0+bG9jayk7DQorCXNw aW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsNCisNCisJcmV0dXJuIHdhdGNoLT53ZDsNCit9DQor DQorc3RhdGljIGludCBpbm90aWZ5X2lnbm9yZShzdHJ1Y3QgaW5vdGlmeV9kZXZpY2UgKmRldiwg czMyIHdkKQ0KK3sNCisJc3RydWN0IGlub3RpZnlfd2F0Y2ggKndhdGNoOw0KKw0KKwkvKg0KKwkg KiBGSVhNRTogU2lsbHkgdG8gZ3JhYiBkZXYtPmxvY2sgaGVyZSBhbmQgdGhlbiBkcm9wIGl0LCB3 aGVuDQorCSAqIGlnbm9yZV9oZWxwZXIoKSBncmFicyBpdCBhbnl3YXkgYSBmZXcgbGluZXMgZG93 bi4NCisJICovDQorCXNwaW5fbG9jaygmZGV2LT5sb2NrKTsNCisJd2F0Y2ggPSBkZXZfZmluZF93 ZChkZXYsIHdkKTsNCisJc3Bpbl91bmxvY2soJmRldi0+bG9jayk7DQorCWlmICghd2F0Y2gpDQor CQlyZXR1cm4gLUVJTlZBTDsNCisJaWdub3JlX2hlbHBlcih3YXRjaCwgMCk7DQorDQorCXJldHVy biAwOw0KK30NCisNCisvKg0KKyAqIGlub3RpZnlfaW9jdGwoKSAtIG91ciBkZXZpY2UgZmlsZSdz IGlvY3RsIG1ldGhvZA0KKyAqDQorICogVGhlIFZGUyBzZXJpYWxpemVzIGFsbCBvZiBvdXIgY2Fs bHMgdmlhIHRoZSBCS0wgYW5kIHdlIHJlbHkgb24gdGhhdC4gIFdlDQorICogY291bGQsIGFsdGVy bmF0aXZlbHksIGdyYWIgZGV2LT5sb2NrLiAgUmlnaHQgbm93IGxvd2VyIGxldmVscyBncmFiIHRo YXQNCisgKiB3aGVyZSBuZWVkZWQuDQorICovDQorc3RhdGljIGludCBpbm90aWZ5X2lvY3RsKHN0 cnVjdCBpbm9kZSAqaXAsIHN0cnVjdCBmaWxlICpmcCwNCisJCQkgdW5zaWduZWQgaW50IGNtZCwg dW5zaWduZWQgbG9uZyBhcmcpDQorew0KKwlzdHJ1Y3QgaW5vdGlmeV9kZXZpY2UgKmRldjsNCisJ c3RydWN0IGlub3RpZnlfd2F0Y2hfcmVxdWVzdCByZXF1ZXN0Ow0KKwl2b2lkIF9fdXNlciAqcDsN CisJczMyIHdkOw0KKw0KKwlkZXYgPSBmcC0+cHJpdmF0ZV9kYXRhOw0KKwlwID0gKHZvaWQgX191 c2VyICopIGFyZzsNCisNCisJc3dpdGNoIChjbWQpIHsNCisJY2FzZSBJTk9USUZZX1dBVENIOg0K KwkJaWYgKGNvcHlfZnJvbV91c2VyKCZyZXF1ZXN0LCBwLCBzaXplb2YgKHJlcXVlc3QpKSkNCisJ CQlyZXR1cm4gLUVGQVVMVDsNCisJCXJldHVybiBpbm90aWZ5X3dhdGNoKGRldiwgJnJlcXVlc3Qp Ow0KKwljYXNlIElOT1RJRllfSUdOT1JFOg0KKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZ3ZCwgcCwg c2l6ZW9mICh3ZCkpKQ0KKwkJCXJldHVybiAtRUZBVUxUOw0KKwkJcmV0dXJuIGlub3RpZnlfaWdu b3JlKGRldiwgd2QpOw0KKwlkZWZhdWx0Og0KKwkJcmV0dXJuIC1FTk9UVFk7DQorCX0NCit9DQor DQorc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaW5vdGlmeV9mb3BzID0gew0KKwkub3du ZXIJCT0gVEhJU19NT0RVTEUsDQorCS5wb2xsCQk9IGlub3RpZnlfcG9sbCwNCisJLnJlYWQJCT0g aW5vdGlmeV9yZWFkLA0KKwkub3BlbgkJPSBpbm90aWZ5X29wZW4sDQorCS5yZWxlYXNlCT0gaW5v dGlmeV9yZWxlYXNlLA0KKwkuaW9jdGwJCT0gaW5vdGlmeV9pb2N0bCwNCit9Ow0KKw0KK3N0cnVj dCBtaXNjZGV2aWNlIGlub3RpZnlfZGV2aWNlID0gew0KKwkubWlub3IgID0gTUlTQ19EWU5BTUlD X01JTk9SLA0KKwkubmFtZQk9ICJpbm90aWZ5IiwNCisJLmZvcHMJPSAmaW5vdGlmeV9mb3BzLA0K K307DQorDQorc3RhdGljIGludCBfX2luaXQgaW5vdGlmeV9pbml0KHZvaWQpDQorew0KKwlpbnQg cmV0LGk7DQorDQorCXJldCA9IG1pc2NfcmVnaXN0ZXIoJmlub3RpZnlfZGV2aWNlKTsNCisJaWYg KHJldCkNCisJCXJldHVybiByZXQ7DQorDQorCXN5c2ZzX2F0dHJpYl9tYXhfcXVldWVkX2V2ZW50 cyA9IDE2Mzg0Ow0KKw0KKwlmb3IgKGkgPSAwO2lub3RpZnlfZGV2aWNlX2F0dHJzW2ldO2krKykN CisJew0KKwkJZGV2aWNlX2NyZWF0ZV9maWxlIChpbm90aWZ5X2RldmljZS5kZXYsIGlub3RpZnlf ZGV2aWNlX2F0dHJzW2ldKTsNCisJfQ0KKw0KKwlhdG9taWNfc2V0KCZ3YXRjaF9jb3VudCwgMCk7 DQorCWF0b21pY19zZXQoJmlub3RpZnlfY29va2llLCAwKTsNCisNCisJd2F0Y2hfY2FjaGVwID0g a21lbV9jYWNoZV9jcmVhdGUoImlub3RpZnlfd2F0Y2hfY2FjaGUiLA0KKwkJCXNpemVvZihzdHJ1 Y3QgaW5vdGlmeV93YXRjaCksIDAsIFNMQUJfUEFOSUMsDQorCQkJTlVMTCwgTlVMTCk7DQorDQor CWV2ZW50X2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJpbm90aWZ5X2V2ZW50X2NhY2hlIiwN CisJCQlzaXplb2Yoc3RydWN0IGlub3RpZnlfa2VybmVsX2V2ZW50KSwgMCwNCisJCQlTTEFCX1BB TklDLCBOVUxMLCBOVUxMKTsNCisNCisJaW5vZGVfZGF0YV9jYWNoZXAgPSBrbWVtX2NhY2hlX2Ny ZWF0ZSgiaW5vdGlmeV9pbm9kZV9kYXRhX2NhY2hlIiwNCisJCQlzaXplb2Yoc3RydWN0IGlub3Rp ZnlfaW5vZGVfZGF0YSksIDAsIFNMQUJfUEFOSUMsDQorCQkJTlVMTCwgTlVMTCk7DQorDQorCXBy aW50ayhLRVJOX0lORk8gImlub3RpZnkgZGV2aWNlIG1pbm9yPSVkXG4iLCBpbm90aWZ5X2Rldmlj ZS5taW5vcik7DQorDQorCXJldHVybiAwOw0KK30NCisNCisNCisNCittb2R1bGVfaW5pdChpbm90 aWZ5X2luaXQpOw0KLS0tIGNsZWFuL2xpbnV4L2luY2x1ZGUvbGludXgvaW5vdGlmeS5oCTE5Njkt MTItMzEgMTk6MDA6MDAuMDAwMDAwMDAwIC0wNTAwDQorKysgbGludXgvaW5jbHVkZS9saW51eC9p bm90aWZ5LmgJMjAwNC0xMC0yNiAxNjoyMzo0My4wMDAwMDAwMDAgLTA0MDANCkBAIC0wLDAgKzEs MTU2IEBADQorLyoNCisgKiBJbm9kZSBiYXNlZCBkaXJlY3Rvcnkgbm90aWZpY2F0aW9uIGZvciBM aW51eA0KKyAqDQorICogQ29weXJpZ2h0IChDKSAyMDA0IEpvaG4gTWNDdXRjaGFuDQorICovDQor DQorI2lmbmRlZiBfTElOVVhfSU5PVElGWV9IDQorI2RlZmluZSBfTElOVVhfSU5PVElGWV9IDQor DQorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+DQorI2luY2x1ZGUgPGxpbnV4L2xpbWl0cy5oPg0K Kw0KKy8qIHRoaXMgc2l6ZSBjb3VsZCBsaW1pdCB0aGluZ3MsIHNpbmNlIHRlY2huaWNhbGx5IHdl IGNvdWxkIG5lZWQgUEFUSF9NQVggKi8NCisjZGVmaW5lIElOT1RJRllfRklMRU5BTUVfTUFYCTI1 Ng0KKw0KKy8qDQorICogc3RydWN0IGlub3RpZnlfZXZlbnQgLSBzdHJ1Y3R1cmUgcmVhZCBmcm9t IHRoZSBpbm90aWZ5IGRldmljZSBmb3IgZWFjaCBldmVudA0KKyAqDQorICogV2hlbiB5b3UgYXJl IHdhdGNoaW5nIGEgZGlyZWN0b3J5LCB5b3Ugd2lsbCByZWNlaXZlIHRoZSBmaWxlbmFtZSBmb3Ig ZXZlbnRzDQorICogc3VjaCBhcyBJTl9DUkVBVEUsIElOX0RFTEVURSwgSU5fT1BFTiwgSU5fQ0xP U0UsIC4uLg0KKyAqDQorICogTm90ZTogV2hlbiByZWFkaW5nIGZyb20gdGhlIGRldmljZSB5b3Ug bXVzdCBwcm92aWRlIGEgYnVmZmVyIHRoYXQgaXMgYQ0KKyAqIG11bHRpcGxlIG9mIHNpemVvZihz dHJ1Y3QgaW5vdGlmeV9ldmVudCkNCisgKi8NCitzdHJ1Y3QgaW5vdGlmeV9ldmVudCB7DQorCV9f czMyIHdkOw0KKwlfX3UzMiBtYXNrOw0KKwlfX3UzMiBjb29raWU7DQorCWNoYXIgZmlsZW5hbWVb SU5PVElGWV9GSUxFTkFNRV9NQVhdOw0KK307DQorDQorLyoNCisgKiBzdHJ1Y3QgaW5vdGlmeV93 YXRjaF9yZXF1ZXN0IC0gcmVwcmVzZW50cyBhIHdhdGNoIHJlcXVlc3QNCisgKg0KKyAqIFBhc3Mg dG8gdGhlIGlub3RpZnkgZGV2aWNlIHZpYSB0aGUgSU5PVElGWV9XQVRDSCBpb2N0bA0KKyAqLw0K K3N0cnVjdCBpbm90aWZ5X3dhdGNoX3JlcXVlc3Qgew0KKwljaGFyICpkaXJuYW1lOwkJLyogZGly ZWN0b3J5IG5hbWUgKi8NCisJX191MzIgbWFzazsJCS8qIGV2ZW50IG1hc2sgKi8NCit9Ow0KKw0K Ky8qIHRoZSBmb2xsb3dpbmcgYXJlIGxlZ2FsLCBpbXBsZW1lbnRlZCBldmVudHMgKi8NCisjZGVm aW5lIElOX0FDQ0VTUwkJMHgwMDAwMDAwMQkvKiBGaWxlIHdhcyBhY2Nlc3NlZCAqLw0KKyNkZWZp bmUgSU5fTU9ESUZZCQkweDAwMDAwMDAyCS8qIEZpbGUgd2FzIG1vZGlmaWVkICovDQorI2RlZmlu ZSBJTl9BVFRSSUIJCTB4MDAwMDAwMDQJLyogRmlsZSBjaGFuZ2VkIGF0dHJpYnV0ZXMgKi8NCisj ZGVmaW5lIElOX0NMT1NFX1dSSVRFCQkweDAwMDAwMDA4CS8qIFdyaXR0YWJsZSBmaWxlIHdhcyBj bG9zZWQgKi8NCisjZGVmaW5lIElOX0NMT1NFX05PV1JJVEUJMHgwMDAwMDAxMAkvKiBVbndyaXR0 YWJsZSBmaWxlIGNsb3NlZCAqLw0KKyNkZWZpbmUgSU5fT1BFTgkJCTB4MDAwMDAwMjAJLyogRmls ZSB3YXMgb3BlbmVkICovDQorI2RlZmluZSBJTl9NT1ZFRF9GUk9NCQkweDAwMDAwMDQwCS8qIEZp bGUgd2FzIG1vdmVkIGZyb20gWCAqLw0KKyNkZWZpbmUgSU5fTU9WRURfVE8JCTB4MDAwMDAwODAJ LyogRmlsZSB3YXMgbW92ZWQgdG8gWSAqLw0KKyNkZWZpbmUgSU5fREVMRVRFX1NVQkRJUgkweDAw MDAwMTAwCS8qIFN1YmRpciB3YXMgZGVsZXRlZCAqLyANCisjZGVmaW5lIElOX0RFTEVURV9GSUxF CQkweDAwMDAwMjAwCS8qIFN1YmZpbGUgd2FzIGRlbGV0ZWQgKi8NCisjZGVmaW5lIElOX0NSRUFU RV9TVUJESVIJMHgwMDAwMDQwMAkvKiBTdWJkaXIgd2FzIGNyZWF0ZWQgKi8NCisjZGVmaW5lIElO X0NSRUFURV9GSUxFCQkweDAwMDAwODAwCS8qIFN1YmZpbGUgd2FzIGNyZWF0ZWQgKi8NCisjZGVm aW5lIElOX0RFTEVURV9TRUxGCQkweDAwMDAxMDAwCS8qIFNlbGYgd2FzIGRlbGV0ZWQgKi8NCisj ZGVmaW5lIElOX1VOTU9VTlQJCTB4MDAwMDIwMDAJLyogQmFja2luZyBmcyB3YXMgdW5tb3VudGVk ICovDQorI2RlZmluZSBJTl9RX09WRVJGTE9XCQkweDAwMDA0MDAwCS8qIEV2ZW50IHF1ZXVlZCBv dmVyZmxvd2VkICovDQorI2RlZmluZSBJTl9JR05PUkVECQkweDAwMDA4MDAwCS8qIEZpbGUgd2Fz IGlnbm9yZWQgKi8NCisNCisvKiBzcGVjaWFsIGZsYWdzICovDQorI2RlZmluZSBJTl9BTExfRVZF TlRTCQkweGZmZmZmZmZmCS8qIEFsbCB0aGUgZXZlbnRzICovDQorI2RlZmluZSBJTl9DTE9TRQkJ KElOX0NMT1NFX1dSSVRFIHwgSU5fQ0xPU0VfTk9XUklURSkNCisNCisjZGVmaW5lIElOT1RJRllf SU9DVExfTUFHSUMJJ1EnDQorI2RlZmluZSBJTk9USUZZX0lPQ1RMX01BWE5SCTINCisNCisjZGVm aW5lIElOT1RJRllfV0FUQ0ggIAkJX0lPUihJTk9USUZZX0lPQ1RMX01BR0lDLCAxLCBzdHJ1Y3Qg aW5vdGlmeV93YXRjaF9yZXF1ZXN0KQ0KKyNkZWZpbmUgSU5PVElGWV9JR05PUkUgCQlfSU9SKElO T1RJRllfSU9DVExfTUFHSUMsIDIsIGludCkNCisNCisjaWZkZWYgX19LRVJORUxfXw0KKw0KKyNp bmNsdWRlIDxsaW51eC9kY2FjaGUuaD4NCisjaW5jbHVkZSA8bGludXgvZnMuaD4NCisjaW5jbHVk ZSA8bGludXgvY29uZmlnLmg+DQorDQorI2RlZmluZSBJV0FUQ0hFU19TT0ZUX0xJTUlUIDE2Mzg0 DQorDQorc3RydWN0IGlub3RpZnlfaW5vZGVfZGF0YSB7DQorCXN0cnVjdCBsaXN0X2hlYWQgd2F0 Y2hlczsNCisJX191MzIgd2F0Y2hfbWFzazsNCisJaW50IHdhdGNoX2NvdW50Ow0KK307DQorDQor I2lmZGVmIENPTkZJR19JTk9USUZZDQorDQorZXh0ZXJuIHZvaWQgaW5vdGlmeV9pbm9kZV9xdWV1 ZV9ldmVudChzdHJ1Y3QgaW5vZGUgKiwgX191MzIsIF9fdTMyLA0KKwkJCQkgICAgICBjb25zdCBj aGFyICopOw0KK2V4dGVybiB2b2lkIGlub3RpZnlfZGVudHJ5X3BhcmVudF9xdWV1ZV9ldmVudChz dHJ1Y3QgZGVudHJ5ICosIF9fdTMyLCBfX3UzMiwNCisJCQkJCSAgICAgIGNvbnN0IGNoYXIgKik7 DQorZXh0ZXJuIHZvaWQgaW5vdGlmeV9zdXBlcl9ibG9ja191bW91bnQoc3RydWN0IHN1cGVyX2Js b2NrICopOw0KK2V4dGVybiB2b2lkIGlub3RpZnlfaW5vZGVfaXNfZGVhZChzdHJ1Y3QgaW5vZGUg Kik7DQorZXh0ZXJuIF9fdTMyIGlub3RpZnlfZ2V0X2Nvb2tpZSh2b2lkKTsNCitleHRlcm4gX191 MzIgc2V0YXR0cl9tYXNrX2lub3RpZnkodW5zaWduZWQgaW50KTsNCisNCisvKiB0aGlzIGNvdWxk IGJlIGtzdHJkdXAgaWYgb25seSB3ZSBjb3VsZCBhZGQgdGhhdCB0byBsaWIvc3RyaW5nLmMgKi8N CitzdGF0aWMgaW5saW5lIGNoYXIgKiBpbm90aWZ5X29sZG5hbWVfaW5pdChzdHJ1Y3QgZGVudHJ5 ICpvbGRfZGVudHJ5KQ0KK3sNCisJY2hhciAqb2xkX25hbWU7DQorDQorCW9sZF9uYW1lID0ga21h bGxvYyhzdHJsZW4ob2xkX2RlbnRyeS0+ZF9uYW1lLm5hbWUpICsgMSwgR0ZQX0tFUk5FTCk7DQor CWlmIChvbGRfbmFtZSkNCisJCXN0cmNweShvbGRfbmFtZSwgb2xkX2RlbnRyeS0+ZF9uYW1lLm5h bWUpOw0KKwlyZXR1cm4gb2xkX25hbWU7DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBpbm90 aWZ5X29sZG5hbWVfZnJlZShjb25zdCBjaGFyICpvbGRfbmFtZSkNCit7DQorCWtmcmVlKG9sZF9u YW1lKTsNCit9DQorDQorI2Vsc2UNCisNCitzdGF0aWMgaW5saW5lIHZvaWQgaW5vdGlmeV9pbm9k ZV9xdWV1ZV9ldmVudChzdHJ1Y3QgaW5vZGUgKmlub2RlLA0KKwkJCQkJICAgICBfX3UzMiBtYXNr LCBfX3UzMiBjb29raWUsDQorCQkJCQkgICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQ0KK3sNCit9 DQorDQorc3RhdGljIGlubGluZSB2b2lkIGlub3RpZnlfZGVudHJ5X3BhcmVudF9xdWV1ZV9ldmVu dChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksDQorCQkJCQkJICAgICBfX3UzMiBtYXNrLCBfX3UzMiBj b29raWUsDQorCQkJCQkJICAgICBjb25zdCBjaGFyICpmaWxlbmFtZSkNCit7DQorfQ0KKw0KK3N0 YXRpYyBpbmxpbmUgdm9pZCBpbm90aWZ5X3N1cGVyX2Jsb2NrX3Vtb3VudChzdHJ1Y3Qgc3VwZXJf YmxvY2sgKnNiKQ0KK3sNCit9DQorDQorc3RhdGljIGlubGluZSB2b2lkIGlub3RpZnlfaW5vZGVf aXNfZGVhZChzdHJ1Y3QgaW5vZGUgKmlub2RlKQ0KK3sNCit9DQorDQorc3RhdGljIGlubGluZSBj aGFyICogaW5vdGlmeV9vbGRuYW1lX2luaXQoc3RydWN0IGRlbnRyeSAqb2xkX2RlbnRyeSkNCit7 DQorCXJldHVybiBOVUxMOw0KK30NCisNCitzdGF0aWMgaW5saW5lIF9fdTMyIGlub3RpZnlfZ2V0 X2Nvb2tpZSh2b2lkKQ0KK3sNCisJcmV0dXJuIDA7DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUgdm9p ZCBpbm90aWZ5X29sZG5hbWVfZnJlZShjb25zdCBjaGFyICpvbGRfbmFtZSkNCit7DQorfQ0KKw0K K3N0YXRpYyBpbmxpbmUgaW50IHNldGF0dHJfbWFza19pbm90aWZ5KHVuc2lnbmVkIGludCBpYV9t YXNrKQ0KK3sNCisJcmV0dXJuIDA7DQorfQ0KKw0KKyNlbmRpZgkvKiBDT05GSUdfSU5PVElGWSAq Lw0KKw0KKyNlbmRpZgkvKiBfX0tFUk5FTCBfXyAqLw0KKw0KKyNlbmRpZgkvKiBfTElOVVhfSU5P VElGWV9IICovDQotLS0gY2xlYW4vbGludXgvaW5jbHVkZS9saW51eC9mcy5oCTIwMDQtMTAtMTgg MTc6NTM6NDQuMDAwMDAwMDAwIC0wNDAwDQorKysgbGludXgvaW5jbHVkZS9saW51eC9mcy5oCTIw MDQtMTAtMjYgMjI6MTM6MDYuMDAwMDAwMDAwIC0wNDAwDQpAQCAtMjcsNiArMjcsNyBAQA0KIHN0 cnVjdCBrc3RhdGZzOw0KIHN0cnVjdCB2bV9hcmVhX3N0cnVjdDsNCiBzdHJ1Y3QgdmZzbW91bnQ7 DQorc3RydWN0IGlub3RpZnlfaW5vZGVfZGF0YTsNCiANCiAvKg0KICAqIEl0J3Mgc2lsbHkgdG8g aGF2ZSBOUl9PUEVOIGJpZ2dlciB0aGFuIE5SX0ZJTEUsIGJ1dCB5b3UgY2FuIGNoYW5nZQ0KQEAg LTYxLDcgKzYyLDcgQEANCiB9Ow0KIGV4dGVybiBzdHJ1Y3QgaW5vZGVzX3N0YXRfdCBpbm9kZXNf c3RhdDsNCiANCi1leHRlcm4gaW50IGxlYXNlc19lbmFibGUsIGRpcl9ub3RpZnlfZW5hYmxlLCBs ZWFzZV9icmVha190aW1lOw0KK2V4dGVybiBpbnQgbGVhc2VzX2VuYWJsZSwgbGVhc2VfYnJlYWtf dGltZTsNCiANCiAjZGVmaW5lIE5SX0ZJTEUgIDgxOTIJLyogdGhpcyBjYW4gd2VsbCBiZSBsYXJn ZXIgb24gYSBsYXJnZXIgc3lzdGVtICovDQogI2RlZmluZSBOUl9SRVNFUlZFRF9GSUxFUyAxMCAv KiByZXNlcnZlZCBmb3Igcm9vdCAqLw0KQEAgLTQ2Miw2ICs0NjMsMTAgQEANCiAJdW5zaWduZWQg bG9uZwkJaV9kbm90aWZ5X21hc2s7IC8qIERpcmVjdG9yeSBub3RpZnkgZXZlbnRzICovDQogCXN0 cnVjdCBkbm90aWZ5X3N0cnVjdAkqaV9kbm90aWZ5OyAvKiBmb3IgZGlyZWN0b3J5IG5vdGlmaWNh dGlvbnMgKi8NCiANCisjaWZkZWYgQ09ORklHX0lOT1RJRlkNCisJc3RydWN0IGlub3RpZnlfaW5v ZGVfZGF0YSAqaW5vdGlmeV9kYXRhOw0KKyNlbmRpZg0KKw0KIAl1bnNpZ25lZCBsb25nCQlpX3N0 YXRlOw0KIAl1bnNpZ25lZCBsb25nCQlkaXJ0aWVkX3doZW47CS8qIGppZmZpZXMgb2YgZmlyc3Qg ZGlydHlpbmcgKi8NCiANCkBAIC0xMzM2LDcgKzEzNDEsNyBAQA0KIGV4dGVybiBpbnQgZG9fcmVt b3VudF9zYihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgZmxhZ3MsDQogCQkJIHZvaWQgKmRh dGEsIGludCBmb3JjZSk7DQogZXh0ZXJuIHNlY3Rvcl90IGJtYXAoc3RydWN0IGlub2RlICosIHNl Y3Rvcl90KTsNCi1leHRlcm4gaW50IHNldGF0dHJfbWFzayh1bnNpZ25lZCBpbnQpOw0KK2V4dGVy biB2b2lkIHNldGF0dHJfbWFzayh1bnNpZ25lZCBpbnQsIGludCAqLCB1MzIgKik7DQogZXh0ZXJu IGludCBub3RpZnlfY2hhbmdlKHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IGlhdHRyICopOw0KIGV4 dGVybiBpbnQgcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKiwgaW50LCBzdHJ1Y3QgbmFtZWlkYXRh ICopOw0KIGV4dGVybiBpbnQgdmZzX3Blcm1pc3Npb24oc3RydWN0IGlub2RlICosIGludCk7DQot LS0gY2xlYW4vbGludXgvZnMvc3VwZXIuYwkyMDA0LTEwLTE4IDE3OjU0OjA3LjAwMDAwMDAwMCAt MDQwMA0KKysrIGxpbnV4L2ZzL3N1cGVyLmMJMjAwNC0xMC0xOCAyMTo1ODo1NS4wMDAwMDAwMDAg LTA0MDANCkBAIC0zNiw2ICszNiw3IEBADQogI2luY2x1ZGUgPGxpbnV4L3dyaXRlYmFjay5oPgkJ LyogZm9yIHRoZSBlbWVyZ2VuY3kgcmVtb3VudCBzdHVmZiAqLw0KICNpbmNsdWRlIDxsaW51eC9p ZHIuaD4NCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4NCisjaW5jbHVkZSA8bGludXgvaW5vdGlm eS5oPg0KIA0KIA0KIHZvaWQgZ2V0X2ZpbGVzeXN0ZW0oc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUg KmZzKTsNCkBAIC0yMjUsNiArMjI2LDcgQEANCiANCiAJaWYgKHJvb3QpIHsNCiAJCXNiLT5zX3Jv b3QgPSBOVUxMOw0KKwkJaW5vdGlmeV9zdXBlcl9ibG9ja191bW91bnQoc2IpOw0KIAkJc2hyaW5r X2RjYWNoZV9wYXJlbnQocm9vdCk7DQogCQlzaHJpbmtfZGNhY2hlX2Fub24oJnNiLT5zX2Fub24p Ow0KIAkJZHB1dChyb290KTsNCi0tLSBjbGVhbi9saW51eC9mcy9yZWFkX3dyaXRlLmMJMjAwNC0x MC0xOCAxNzo1NDozNy4wMDAwMDAwMDAgLTA0MDANCisrKyBsaW51eC9mcy9yZWFkX3dyaXRlLmMJ MjAwNC0xMC0xOCAyMTo1ODo1NS4wMDAwMDAwMDAgLTA0MDANCkBAIC0xMSw2ICsxMSw3IEBADQog I2luY2x1ZGUgPGxpbnV4L3Vpby5oPg0KICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPg0KICNp bmNsdWRlIDxsaW51eC9kbm90aWZ5Lmg+DQorI2luY2x1ZGUgPGxpbnV4L2lub3RpZnkuaD4NCiAj aW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4NCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+DQog DQpAQCAtMjE2LDggKzIxNywxNCBAQA0KIAkJCQlyZXQgPSBmaWxlLT5mX29wLT5yZWFkKGZpbGUs IGJ1ZiwgY291bnQsIHBvcyk7DQogCQkJZWxzZQ0KIAkJCQlyZXQgPSBkb19zeW5jX3JlYWQoZmls ZSwgYnVmLCBjb3VudCwgcG9zKTsNCi0JCQlpZiAocmV0ID4gMCkNCi0JCQkJZG5vdGlmeV9wYXJl bnQoZmlsZS0+Zl9kZW50cnksIEROX0FDQ0VTUyk7DQorCQkJaWYgKHJldCA+IDApIHsNCisJCQkJ c3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gZmlsZS0+Zl9kZW50cnk7DQorCQkJCWRub3RpZnlfcGFy ZW50KGRlbnRyeSwgRE5fQUNDRVNTKTsNCisJCQkJaW5vdGlmeV9kZW50cnlfcGFyZW50X3F1ZXVl X2V2ZW50KGRlbnRyeSwNCisJCQkJCQlJTl9BQ0NFU1MsIDAsIGRlbnRyeS0+ZF9uYW1lLm5hbWUp Ow0KKwkJCQlpbm90aWZ5X2lub2RlX3F1ZXVlX2V2ZW50KGlub2RlLCBJTl9BQ0NFU1MsIDAsDQor CQkJCQkJTlVMTCk7DQorCQkJfQ0KIAkJfQ0KIAl9DQogDQpAQCAtMjYwLDggKzI2NywxNCBAQA0K IAkJCQlyZXQgPSBmaWxlLT5mX29wLT53cml0ZShmaWxlLCBidWYsIGNvdW50LCBwb3MpOw0KIAkJ CWVsc2UNCiAJCQkJcmV0ID0gZG9fc3luY193cml0ZShmaWxlLCBidWYsIGNvdW50LCBwb3MpOw0K LQkJCWlmIChyZXQgPiAwKQ0KLQkJCQlkbm90aWZ5X3BhcmVudChmaWxlLT5mX2RlbnRyeSwgRE5f TU9ESUZZKTsNCisJCQlpZiAocmV0ID4gMCkgew0KKwkJCQlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkg PSBmaWxlLT5mX2RlbnRyeTsNCisJCQkJZG5vdGlmeV9wYXJlbnQoZGVudHJ5LCBETl9NT0RJRlkp Ow0KKwkJCQlpbm90aWZ5X2RlbnRyeV9wYXJlbnRfcXVldWVfZXZlbnQoZGVudHJ5LA0KKwkJCQkJ CUlOX01PRElGWSwgMCwgZGVudHJ5LT5kX25hbWUubmFtZSk7DQorCQkJCWlub3RpZnlfaW5vZGVf cXVldWVfZXZlbnQoaW5vZGUsIElOX01PRElGWSwgMCwNCisJCQkJCQlOVUxMKTsNCisJCQl9DQog CQl9DQogCX0NCiANCkBAIC00OTMsOSArNTA2LDE1IEBADQogb3V0Og0KIAlpZiAoaW92ICE9IGlv dnN0YWNrKQ0KIAkJa2ZyZWUoaW92KTsNCi0JaWYgKChyZXQgKyAodHlwZSA9PSBSRUFEKSkgPiAw KQ0KLQkJZG5vdGlmeV9wYXJlbnQoZmlsZS0+Zl9kZW50cnksDQotCQkJCSh0eXBlID09IFJFQUQp ID8gRE5fQUNDRVNTIDogRE5fTU9ESUZZKTsNCisJaWYgKChyZXQgKyAodHlwZSA9PSBSRUFEKSkg PiAwKSB7DQorCQlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBmaWxlLT5mX2RlbnRyeTsNCisJCWRu b3RpZnlfcGFyZW50KGRlbnRyeSwgKHR5cGUgPT0gUkVBRCkgPyBETl9BQ0NFU1MgOiBETl9NT0RJ RlkpOw0KKwkJaW5vdGlmeV9kZW50cnlfcGFyZW50X3F1ZXVlX2V2ZW50KGRlbnRyeSwNCisJCQkJ KHR5cGUgPT0gUkVBRCkgPyBJTl9BQ0NFU1MgOiBJTl9NT0RJRlksIDAsDQorCQkJCWRlbnRyeS0+ ZF9uYW1lLm5hbWUpOw0KKwkJaW5vdGlmeV9pbm9kZV9xdWV1ZV9ldmVudCAoZGVudHJ5LT5kX2lu b2RlLA0KKwkJCQkodHlwZSA9PSBSRUFEKSA/IElOX0FDQ0VTUyA6IElOX01PRElGWSwgMCwgTlVM TCk7DQorCX0NCiAJcmV0dXJuIHJldDsNCiB9DQogDQotLS0gY2xlYW4vbGludXgvZnMvb3Blbi5j CTIwMDQtMTAtMTggMTc6NTM6MDguMDAwMDAwMDAwIC0wNDAwDQorKysgbGludXgvZnMvb3Blbi5j CTIwMDQtMTAtMTggMjE6NTg6NTUuMDAwMDAwMDAwIC0wNDAwDQpAQCAtMTEsNiArMTEsNyBAQA0K ICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPg0KICNpbmNsdWRlIDxsaW51eC9xdW90YW9wcy5o Pg0KICNpbmNsdWRlIDxsaW51eC9kbm90aWZ5Lmg+DQorI2luY2x1ZGUgPGxpbnV4L2lub3RpZnku aD4NCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+DQogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4N CiAjaW5jbHVkZSA8bGludXgvdHR5Lmg+DQpAQCAtOTU1LDYgKzk1NiwxMCBAQA0KIAkJCWVycm9y ID0gUFRSX0VSUihmKTsNCiAJCQlpZiAoSVNfRVJSKGYpKQ0KIAkJCQlnb3RvIG91dF9lcnJvcjsN CisJCQlpbm90aWZ5X2lub2RlX3F1ZXVlX2V2ZW50KGYtPmZfZGVudHJ5LT5kX2lub2RlLA0KKwkJ CQkJSU5fT1BFTiwgMCwgTlVMTCk7DQorCQkJaW5vdGlmeV9kZW50cnlfcGFyZW50X3F1ZXVlX2V2 ZW50KGYtPmZfZGVudHJ5LCBJTl9PUEVOLA0KKwkJCQkJMCwgZi0+Zl9kZW50cnktPmRfbmFtZS5u YW1lKTsNCiAJCQlmZF9pbnN0YWxsKGZkLCBmKTsNCiAJCX0NCiBvdXQ6DQotLS0gY2xlYW4vbGlu dXgvZnMvbmFtZWkuYwkyMDA0LTEwLTE4IDE3OjUzOjQ2LjAwMDAwMDAwMCAtMDQwMA0KKysrIGxp bnV4L2ZzL25hbWVpLmMJMjAwNC0xMC0xOCAyMTo1ODo1NS4wMDAwMDAwMDAgLTA0MDANCkBAIC0y Miw2ICsyMiw3IEBADQogI2luY2x1ZGUgPGxpbnV4L3F1b3Rhb3BzLmg+DQogI2luY2x1ZGUgPGxp bnV4L3BhZ2VtYXAuaD4NCiAjaW5jbHVkZSA8bGludXgvZG5vdGlmeS5oPg0KKyNpbmNsdWRlIDxs aW51eC9pbm90aWZ5Lmg+DQogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+DQogI2luY2x1ZGUg PGxpbnV4L3BlcnNvbmFsaXR5Lmg+DQogI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+DQpAQCAt MTIyNiw2ICsxMjI3LDggQEANCiAJZXJyb3IgPSBkaXItPmlfb3AtPmNyZWF0ZShkaXIsIGRlbnRy eSwgbW9kZSwgbmQpOw0KIAlpZiAoIWVycm9yKSB7DQogCQlpbm9kZV9kaXJfbm90aWZ5KGRpciwg RE5fQ1JFQVRFKTsNCisJCWlub3RpZnlfaW5vZGVfcXVldWVfZXZlbnQoZGlyLCBJTl9DUkVBVEVf RklMRSwNCisJCQkJMCwgZGVudHJ5LT5kX25hbWUubmFtZSk7DQogCQlzZWN1cml0eV9pbm9kZV9w b3N0X2NyZWF0ZShkaXIsIGRlbnRyeSwgbW9kZSk7DQogCX0NCiAJcmV0dXJuIGVycm9yOw0KQEAg LTE1NDAsNiArMTU0Myw4IEBADQogCWVycm9yID0gZGlyLT5pX29wLT5ta25vZChkaXIsIGRlbnRy eSwgbW9kZSwgZGV2KTsNCiAJaWYgKCFlcnJvcikgew0KIAkJaW5vZGVfZGlyX25vdGlmeShkaXIs IEROX0NSRUFURSk7DQorCQlpbm90aWZ5X2lub2RlX3F1ZXVlX2V2ZW50KGRpciwgSU5fQ1JFQVRF X0ZJTEUsIDAsDQorCQkJCWRlbnRyeS0+ZF9uYW1lLm5hbWUpOw0KIAkJc2VjdXJpdHlfaW5vZGVf cG9zdF9ta25vZChkaXIsIGRlbnRyeSwgbW9kZSwgZGV2KTsNCiAJfQ0KIAlyZXR1cm4gZXJyb3I7 DQpAQCAtMTYxMyw2ICsxNjE4LDggQEANCiAJZXJyb3IgPSBkaXItPmlfb3AtPm1rZGlyKGRpciwg ZGVudHJ5LCBtb2RlKTsNCiAJaWYgKCFlcnJvcikgew0KIAkJaW5vZGVfZGlyX25vdGlmeShkaXIs IEROX0NSRUFURSk7DQorCQlpbm90aWZ5X2lub2RlX3F1ZXVlX2V2ZW50KGRpciwgSU5fQ1JFQVRF X1NVQkRJUiwgMCwNCisJCQkJZGVudHJ5LT5kX25hbWUubmFtZSk7DQogCQlzZWN1cml0eV9pbm9k ZV9wb3N0X21rZGlyKGRpcixkZW50cnksIG1vZGUpOw0KIAl9DQogCXJldHVybiBlcnJvcjsNCkBA IC0xNzA4LDYgKzE3MTUsMTEgQEANCiAJdXAoJmRlbnRyeS0+ZF9pbm9kZS0+aV9zZW0pOw0KIAlp ZiAoIWVycm9yKSB7DQogCQlpbm9kZV9kaXJfbm90aWZ5KGRpciwgRE5fREVMRVRFKTsNCisJCWlu b3RpZnlfaW5vZGVfcXVldWVfZXZlbnQoZGlyLCBJTl9ERUxFVEVfU1VCRElSLCAwLA0KKwkJCQlk ZW50cnktPmRfbmFtZS5uYW1lKTsNCisJCWlub3RpZnlfaW5vZGVfcXVldWVfZXZlbnQoZGVudHJ5 LT5kX2lub2RlLCBJTl9ERUxFVEVfU0VMRiwgMCwNCisJCQkJTlVMTCk7DQorCQlpbm90aWZ5X2lu b2RlX2lzX2RlYWQgKGRlbnRyeS0+ZF9pbm9kZSk7DQogCQlkX2RlbGV0ZShkZW50cnkpOw0KIAl9 DQogCWRwdXQoZGVudHJ5KTsNCkBAIC0xNzgwLDggKzE3OTIsMTMgQEANCiANCiAJLyogV2UgZG9u J3QgZF9kZWxldGUoKSBORlMgc2lsbHlyZW5hbWVkIGZpbGVzLS10aGV5IHN0aWxsIGV4aXN0LiAq Lw0KIAlpZiAoIWVycm9yICYmICEoZGVudHJ5LT5kX2ZsYWdzICYgRENBQ0hFX05GU0ZTX1JFTkFN RUQpKSB7DQotCQlkX2RlbGV0ZShkZW50cnkpOw0KIAkJaW5vZGVfZGlyX25vdGlmeShkaXIsIERO X0RFTEVURSk7DQorCQlpbm90aWZ5X2lub2RlX3F1ZXVlX2V2ZW50KGRpciwgSU5fREVMRVRFX0ZJ TEUsIDAsDQorCQkJCWRlbnRyeS0+ZF9uYW1lLm5hbWUpOw0KKwkJaW5vdGlmeV9pbm9kZV9xdWV1 ZV9ldmVudChkZW50cnktPmRfaW5vZGUsIElOX0RFTEVURV9TRUxGLCAwLA0KKwkJCQlOVUxMKTsN CisJCWlub3RpZnlfaW5vZGVfaXNfZGVhZCAoZGVudHJ5LT5kX2lub2RlKTsNCisJCWRfZGVsZXRl KGRlbnRyeSk7DQogCX0NCiAJcmV0dXJuIGVycm9yOw0KIH0NCkBAIC0xODU3LDYgKzE4NzQsOCBA QA0KIAllcnJvciA9IGRpci0+aV9vcC0+c3ltbGluayhkaXIsIGRlbnRyeSwgb2xkbmFtZSk7DQog CWlmICghZXJyb3IpIHsNCiAJCWlub2RlX2Rpcl9ub3RpZnkoZGlyLCBETl9DUkVBVEUpOw0KKwkJ aW5vdGlmeV9pbm9kZV9xdWV1ZV9ldmVudChkaXIsIElOX0NSRUFURV9GSUxFLCAwLA0KKwkJCQlk ZW50cnktPmRfbmFtZS5uYW1lKTsNCiAJCXNlY3VyaXR5X2lub2RlX3Bvc3Rfc3ltbGluayhkaXIs IGRlbnRyeSwgb2xkbmFtZSk7DQogCX0NCiAJcmV0dXJuIGVycm9yOw0KQEAgLTE5MzAsNiArMTk0 OSw4IEBADQogCXVwKCZvbGRfZGVudHJ5LT5kX2lub2RlLT5pX3NlbSk7DQogCWlmICghZXJyb3Ip IHsNCiAJCWlub2RlX2Rpcl9ub3RpZnkoZGlyLCBETl9DUkVBVEUpOw0KKwkJaW5vdGlmeV9pbm9k ZV9xdWV1ZV9ldmVudChkaXIsIElOX0NSRUFURV9GSUxFLCAwLCANCisJCQkJCW5ld19kZW50cnkt PmRfbmFtZS5uYW1lKTsNCiAJCXNlY3VyaXR5X2lub2RlX3Bvc3RfbGluayhvbGRfZGVudHJ5LCBk aXIsIG5ld19kZW50cnkpOw0KIAl9DQogCXJldHVybiBlcnJvcjsNCkBAIC0yMDkzLDYgKzIxMTQs OCBAQA0KIHsNCiAJaW50IGVycm9yOw0KIAlpbnQgaXNfZGlyID0gU19JU0RJUihvbGRfZGVudHJ5 LT5kX2lub2RlLT5pX21vZGUpOw0KKwljaGFyICpvbGRfbmFtZTsNCisJdTMyIGNvb2tpZTsNCiAN CiAJaWYgKG9sZF9kZW50cnktPmRfaW5vZGUgPT0gbmV3X2RlbnRyeS0+ZF9pbm9kZSkNCiAgCQly ZXR1cm4gMDsNCkBAIC0yMTE0LDYgKzIxMzcsOCBAQA0KIAlEUVVPVF9JTklUKG9sZF9kaXIpOw0K IAlEUVVPVF9JTklUKG5ld19kaXIpOw0KIA0KKwlvbGRfbmFtZSA9IGlub3RpZnlfb2xkbmFtZV9p bml0KG9sZF9kZW50cnkpOw0KKw0KIAlpZiAoaXNfZGlyKQ0KIAkJZXJyb3IgPSB2ZnNfcmVuYW1l X2RpcihvbGRfZGlyLG9sZF9kZW50cnksbmV3X2RpcixuZXdfZGVudHJ5KTsNCiAJZWxzZQ0KQEAg LTIxMjUsNyArMjE1MCwxNSBAQA0KIAkJCWlub2RlX2Rpcl9ub3RpZnkob2xkX2RpciwgRE5fREVM RVRFKTsNCiAJCQlpbm9kZV9kaXJfbm90aWZ5KG5ld19kaXIsIEROX0NSRUFURSk7DQogCQl9DQor DQorCQljb29raWUgPSBpbm90aWZ5X2dldF9jb29raWUoKTsNCisNCisJCWlub3RpZnlfaW5vZGVf cXVldWVfZXZlbnQob2xkX2RpciwgSU5fTU9WRURfRlJPTSwgY29va2llLCBvbGRfbmFtZSk7DQor CQlpbm90aWZ5X2lub2RlX3F1ZXVlX2V2ZW50KG5ld19kaXIsIElOX01PVkVEX1RPLCBjb29raWUs DQorCQkJCQkgIG5ld19kZW50cnktPmRfbmFtZS5uYW1lKTsNCiAJfQ0KKwlpbm90aWZ5X29sZG5h bWVfZnJlZShvbGRfbmFtZSk7DQorDQogCXJldHVybiBlcnJvcjsNCiB9DQogDQotLS0gY2xlYW4v bGludXgvZnMvaW5vZGUuYwkyMDA0LTEwLTE4IDE3OjU1OjI5LjAwMDAwMDAwMCAtMDQwMA0KKysr IGxpbnV4L2ZzL2lub2RlLmMJMjAwNC0xMC0xOCAyMTo1ODo1NS4wMDAwMDAwMDAgLTA0MDANCkBA IC0xMTQsNiArMTE0LDkgQEANCiAJaWYgKGlub2RlKSB7DQogCQlzdHJ1Y3QgYWRkcmVzc19zcGFj ZSAqIGNvbnN0IG1hcHBpbmcgPSAmaW5vZGUtPmlfZGF0YTsNCiANCisjaWZkZWYgQ09ORklHX0lO T1RJRlkNCisJCWlub2RlLT5pbm90aWZ5X2RhdGEgPSBOVUxMOw0KKyNlbmRpZg0KIAkJaW5vZGUt Pmlfc2IgPSBzYjsNCiAJCWlub2RlLT5pX2Jsa2JpdHMgPSBzYi0+c19ibG9ja3NpemVfYml0czsN CiAJCWlub2RlLT5pX2ZsYWdzID0gMDsNCi0tLSBjbGVhbi9saW51eC9mcy9hdHRyLmMJMjAwNC0x MC0xOCAxNzo1MzoyMS4wMDAwMDAwMDAgLTA0MDANCisrKyBsaW51eC9mcy9hdHRyLmMJMjAwNC0x MC0xOCAyMTo1ODo1NS4wMDAwMDAwMDAgLTA0MDANCkBAIC0xMSw2ICsxMSw3IEBADQogI2luY2x1 ZGUgPGxpbnV4L3N0cmluZy5oPg0KICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPg0KICNpbmNs dWRlIDxsaW51eC9kbm90aWZ5Lmg+DQorI2luY2x1ZGUgPGxpbnV4L2lub3RpZnkuaD4NCiAjaW5j bHVkZSA8bGludXgvZmNudGwuaD4NCiAjaW5jbHVkZSA8bGludXgvcXVvdGFvcHMuaD4NCiAjaW5j bHVkZSA8bGludXgvc2VjdXJpdHkuaD4NCkBAIC0xMDMsMjkgKzEwNCw1MSBAQA0KIG91dDoNCiAJ cmV0dXJuIGVycm9yOw0KIH0NCi0NCiBFWFBPUlRfU1lNQk9MKGlub2RlX3NldGF0dHIpOw0KIA0K LWludCBzZXRhdHRyX21hc2sodW5zaWduZWQgaW50IGlhX3ZhbGlkKQ0KK3ZvaWQgc2V0YXR0cl9t YXNrICh1bnNpZ25lZCBpbnQgaWFfdmFsaWQsIGludCAqZG5fbWFzaywgdTMyICppbl9tYXNrKQ0K IHsNCi0JdW5zaWduZWQgbG9uZyBkbl9tYXNrID0gMDsNCisJaW50IGRubWFzazsNCisJdTMyIGlu bWFzazsNCiANCi0JaWYgKGlhX3ZhbGlkICYgQVRUUl9VSUQpDQotCQlkbl9tYXNrIHw9IEROX0FU VFJJQjsNCi0JaWYgKGlhX3ZhbGlkICYgQVRUUl9HSUQpDQotCQlkbl9tYXNrIHw9IEROX0FUVFJJ QjsNCi0JaWYgKGlhX3ZhbGlkICYgQVRUUl9TSVpFKQ0KLQkJZG5fbWFzayB8PSBETl9NT0RJRlk7 DQotCS8qIGJvdGggdGltZXMgaW1wbGllcyBhIHV0aW1lKHMpIGNhbGwgKi8NCi0JaWYgKChpYV92 YWxpZCAmIChBVFRSX0FUSU1FfEFUVFJfTVRJTUUpKSA9PSAoQVRUUl9BVElNRXxBVFRSX01USU1F KSkNCi0JCWRuX21hc2sgfD0gRE5fQVRUUklCOw0KLQllbHNlIGlmIChpYV92YWxpZCAmIEFUVFJf QVRJTUUpDQotCQlkbl9tYXNrIHw9IEROX0FDQ0VTUzsNCi0JZWxzZSBpZiAoaWFfdmFsaWQgJiBB VFRSX01USU1FKQ0KLQkJZG5fbWFzayB8PSBETl9NT0RJRlk7DQotCWlmIChpYV92YWxpZCAmIEFU VFJfTU9ERSkNCi0JCWRuX21hc2sgfD0gRE5fQVRUUklCOw0KLQlyZXR1cm4gZG5fbWFzazsNCisJ aW5tYXNrID0gMDsNCisJZG5tYXNrID0gMDsNCisNCisJaWYgKCFkbl9tYXNrIHx8ICFpbl9tYXNr KSB7DQorCQlyZXR1cm47DQorCX0NCisgICAgICAgIGlmIChpYV92YWxpZCAmIEFUVFJfVUlEKSB7 DQorICAgICAgICAgICAgICAgIGlubWFzayB8PSBJTl9BVFRSSUI7DQorCQlkbm1hc2sgfD0gRE5f QVRUUklCOw0KKwl9DQorICAgICAgICBpZiAoaWFfdmFsaWQgJiBBVFRSX0dJRCkgew0KKyAgICAg ICAgICAgICAgICBpbm1hc2sgfD0gSU5fQVRUUklCOw0KKwkJZG5tYXNrIHw9IEROX0FUVFJJQjsN CisJfQ0KKyAgICAgICAgaWYgKGlhX3ZhbGlkICYgQVRUUl9TSVpFKSB7DQorICAgICAgICAgICAg ICAgIGlubWFzayB8PSBJTl9NT0RJRlk7DQorCQlkbm1hc2sgfD0gRE5fTU9ESUZZOw0KKwl9DQor ICAgICAgICAvKiBib3RoIHRpbWVzIGltcGxpZXMgYSB1dGltZShzKSBjYWxsICovDQorICAgICAg ICBpZiAoKGlhX3ZhbGlkICYgKEFUVFJfQVRJTUV8QVRUUl9NVElNRSkpID09IChBVFRSX0FUSU1F fEFUVFJfTVRJTUUpKSB7DQorICAgICAgICAgICAgICAgIGlubWFzayB8PSBJTl9BVFRSSUI7DQor CQlkbm1hc2sgfD0gRE5fQVRUUklCOw0KKwl9DQorICAgICAgICBlbHNlIGlmIChpYV92YWxpZCAm IEFUVFJfQVRJTUUpIHsNCisgICAgICAgICAgICAgICAgaW5tYXNrIHw9IElOX0FDQ0VTUzsNCisJ CWRubWFzayB8PSBETl9BQ0NFU1M7DQorCX0NCisgICAgICAgIGVsc2UgaWYgKGlhX3ZhbGlkICYg QVRUUl9NVElNRSkgew0KKyAgICAgICAgICAgICAgICBpbm1hc2sgfD0gSU5fTU9ESUZZOw0KKwkJ ZG5tYXNrIHw9IEROX01PRElGWTsNCisJfQ0KKyAgICAgICAgaWYgKGlhX3ZhbGlkICYgQVRUUl9N T0RFKSB7DQorICAgICAgICAgICAgICAgIGlubWFzayB8PSBJTl9BVFRSSUI7DQorCQlkbm1hc2sg fD0gRE5fQVRUUklCOw0KKwl9DQorDQorCSppbl9tYXNrID0gaW5tYXNrOw0KKwkqZG5fbWFzayA9 IGRubWFzazsNCiB9DQogDQogaW50IG5vdGlmeV9jaGFuZ2Uoc3RydWN0IGRlbnRyeSAqIGRlbnRy eSwgc3RydWN0IGlhdHRyICogYXR0cikNCkBAIC0xODQsOSArMjA3LDE5IEBADQogCQl9DQogCX0N CiAJaWYgKCFlcnJvcikgew0KLQkJdW5zaWduZWQgbG9uZyBkbl9tYXNrID0gc2V0YXR0cl9tYXNr KGlhX3ZhbGlkKTsNCisJCWludCBkbl9tYXNrOw0KKwkJdTMyIGluX21hc2s7DQorDQorCQlzZXRh dHRyX21hc2sgKGlhX3ZhbGlkLCAmZG5fbWFzaywgJmluX21hc2spOw0KKw0KIAkJaWYgKGRuX21h c2spDQogCQkJZG5vdGlmeV9wYXJlbnQoZGVudHJ5LCBkbl9tYXNrKTsNCisJCWlmIChpbl9tYXNr KSB7DQorCQkJaW5vdGlmeV9pbm9kZV9xdWV1ZV9ldmVudChkZW50cnktPmRfaW5vZGUsIGluX21h c2ssIDAsDQorCQkJCQkJICBOVUxMKTsNCisJCQlpbm90aWZ5X2RlbnRyeV9wYXJlbnRfcXVldWVf ZXZlbnQoZGVudHJ5LCBpbl9tYXNrLCAwLA0KKwkJCQkJCQkgIGRlbnRyeS0+ZF9uYW1lLm5hbWUp Ow0KKwkJfQ0KIAl9DQogCXJldHVybiBlcnJvcjsNCiB9DQotLS0gY2xlYW4vbGludXgvZnMvZmls ZV90YWJsZS5jCTIwMDQtMTAtMTggMTc6NTM6MDcuMDAwMDAwMDAwIC0wNDAwDQorKysgbGludXgv ZnMvZmlsZV90YWJsZS5jCTIwMDQtMTAtMTggMjE6NTg6NTUuMDAwMDAwMDAwIC0wNDAwDQpAQCAt MTYsNiArMTYsNyBAQA0KICNpbmNsdWRlIDxsaW51eC9ldmVudHBvbGwuaD4NCiAjaW5jbHVkZSA8 bGludXgvbW91bnQuaD4NCiAjaW5jbHVkZSA8bGludXgvY2Rldi5oPg0KKyNpbmNsdWRlIDxsaW51 eC9pbm90aWZ5Lmg+DQogDQogLyogc3lzY3RsIHR1bmFibGVzLi4uICovDQogc3RydWN0IGZpbGVz X3N0YXRfc3RydWN0IGZpbGVzX3N0YXQgPSB7DQpAQCAtMTIyLDYgKzEyMywxMiBAQA0KIAlzdHJ1 Y3QgZGVudHJ5ICpkZW50cnkgPSBmaWxlLT5mX2RlbnRyeTsNCiAJc3RydWN0IHZmc21vdW50ICpt bnQgPSBmaWxlLT5mX3Zmc21udDsNCiAJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9p bm9kZTsNCisJdTMyIG1hc2s7DQorDQorDQorCW1hc2sgPSAoZmlsZS0+Zl9tb2RlICYgRk1PREVf V1JJVEUpID8gSU5fQ0xPU0VfV1JJVEUgOiBJTl9DTE9TRV9OT1dSSVRFOw0KKwlpbm90aWZ5X2Rl bnRyeV9wYXJlbnRfcXVldWVfZXZlbnQoZGVudHJ5LCBtYXNrLCAwLCBkZW50cnktPmRfbmFtZS5u YW1lKTsNCisJaW5vdGlmeV9pbm9kZV9xdWV1ZV9ldmVudChpbm9kZSwgbWFzaywgMCwgTlVMTCk7 DQogDQogCW1pZ2h0X3NsZWVwKCk7DQogCS8qDQotLS0gY2xlYW4vbGludXgvZHJpdmVycy9jaGFy L01ha2VmaWxlCTIwMDQtMTAtMTggMTc6NTU6MjguMDAwMDAwMDAwIC0wNDAwDQorKysgbGludXgv ZHJpdmVycy9jaGFyL01ha2VmaWxlCTIwMDQtMTAtMTggMjE6NTk6MzEuMDAwMDAwMDAwIC0wNDAw DQpAQCAtOSw2ICs5LDggQEANCiANCiBvYmoteQkgKz0gbWVtLm8gcmFuZG9tLm8gdHR5X2lvLm8g bl90dHkubyB0dHlfaW9jdGwubw0KIA0KKw0KK29iai0kKENPTkZJR19JTk9USUZZKSAgICAgICAg ICAgKz0gaW5vdGlmeS5vDQogb2JqLSQoQ09ORklHX0xFR0FDWV9QVFlTKQkrPSBwdHkubw0KIG9i ai0kKENPTkZJR19VTklYOThfUFRZUykJKz0gcHR5Lm8NCiBvYmoteQkJCQkrPSBtaXNjLm8NCi0t LSBjbGVhbi9saW51eC9kcml2ZXJzL2NoYXIvS2NvbmZpZwkyMDA0LTEwLTE4IDE3OjUzOjA3LjAw MDAwMDAwMCAtMDQwMA0KKysrIGxpbnV4L2RyaXZlcnMvY2hhci9LY29uZmlnCTIwMDQtMTAtMTgg MjE6NTg6NTUuMDAwMDAwMDAwIC0wNDAwDQpAQCAtNjIsNiArNjIsMTkgQEANCiAJZGVwZW5kcyBv biBWVCAmJiAhUzM5MCAmJiAhVVNFUk1PREUNCiAJZGVmYXVsdCB5DQogDQorY29uZmlnIElOT1RJ RlkNCisJYm9vbCAiSW5vdGlmeSBmaWxlIGNoYW5nZSBub3RpZmljYXRpb24gc3VwcG9ydCINCisJ ZGVmYXVsdCB5DQorCS0tLWhlbHAtLS0NCisJICBTYXkgWSBoZXJlIHRvIGVuYWJsZSBpbm90aWZ5 IHN1cHBvcnQgYW5kIHRoZSAvZGV2L2lub3RpZnkgY2hhcmFjdGVyDQorCSAgZGV2aWNlLiAgSW5v dGlmeSBpcyBhIGZpbGUgY2hhbmdlIG5vdGlmaWNhdGlvbiBzeXN0ZW0gYW5kIGENCisJICByZXBs YWNlbWVudCBmb3IgZG5vdGlmeS4gIElub3RpZnkgZml4ZXMgbnVtZXJvdXMgc2hvcnRjb21pbmdz IGluDQorCSAgZG5vdGlmeSBhbmQgaW50cm9kdWNlcyBzZXZlcmFsIG5ldyBmZWF0dXJlcy4gIEl0 IGFsbG93cyBtb25pdG9yaW5nDQorCSAgb2YgYm90aCBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgdmlh IGEgc2luZ2xlIG9wZW4gZmQuICBNdWx0aXBsZSBmaWxlDQorCSAgZXZlbnRzIGFyZSBzdXBwb3J0 ZWQuDQorCSAgDQorCSAgSWYgdW5zdXJlLCBzYXkgWS4NCisNCiBjb25maWcgU0VSSUFMX05PTlNU QU5EQVJEDQogCWJvb2wgIk5vbi1zdGFuZGFyZCBzZXJpYWwgcG9ydCBzdXBwb3J0Ig0KIAktLS1o ZWxwLS0tDQotLS0gY2xlYW4vbGludXgvaW5jbHVkZS9saW51eC9pZHIuaAkyMDA0LTEwLTE4IDE3 OjUzOjEyLjAwMDAwMDAwMCAtMDQwMA0KKysrIGxpbnV4L2luY2x1ZGUvbGludXgvaWRyLmgJMjAw NC0xMC0yNiAxNjoyOTowMi4wMDAwMDAwMDAgLTA0MDANCkBAIC0yOSw2ICsyOSw3IEBADQogIyBl cnJvciAiQklUU19QRVJfTE9ORyBpcyBub3QgMzIgb3IgNjQiDQogI2VuZGlmDQogDQorI2RlZmlu ZSBJRFJfTUFYX0lEIDB4N2ZmZmZmZmYNCiAjZGVmaW5lIElEUl9TSVpFICgxIDw8IElEUl9CSVRT KQ0KICNkZWZpbmUgSURSX01BU0sgKCgxIDw8IElEUl9CSVRTKS0xKQ0KIA0KLS0tIGNsZWFuL2xp bnV4L2luY2x1ZGUvYXNtLWkzODYvcmVzb3VyY2UuaAkyMDA0LTEwLTE4IDE3OjU1OjM2LjAwMDAw MDAwMCAtMDQwMA0KKysrIGxpbnV4L2luY2x1ZGUvYXNtLWkzODYvcmVzb3VyY2UuaAkyMDA0LTEw LTI2IDE2OjI5OjUxLjAwMDAwMDAwMCAtMDQwMA0KQEAgLTE4LDggKzE4LDkgQEANCiAjZGVmaW5l IFJMSU1JVF9MT0NLUwkxMAkJLyogbWF4aW11bSBmaWxlIGxvY2tzIGhlbGQgKi8NCiAjZGVmaW5l IFJMSU1JVF9TSUdQRU5ESU5HIDExCQkvKiBtYXggbnVtYmVyIG9mIHBlbmRpbmcgc2lnbmFscyAq Lw0KICNkZWZpbmUgUkxJTUlUX01TR1FVRVVFIDEyCQkvKiBtYXhpbXVtIGJ5dGVzIGluIFBPU0lY IG1xdWV1ZXMgKi8NCisjZGVmaW5lIFJMSU1JVF9JV0FUQ0hFUyAxMyAvKiBtYXhpbXVtIG51bWJl ciBvZiBpbm90aWZ5IHdhdGNoZXMgKi8NCiANCi0jZGVmaW5lIFJMSU1fTkxJTUlUUwkxMw0KKyNk ZWZpbmUgUkxJTV9OTElNSVRTCTE0DQogDQogDQogLyoNCkBAIC00NSw2ICs0Niw3IEBADQogCXsg UkxJTV9JTkZJTklUWSwgUkxJTV9JTkZJTklUWSB9LAkJXA0KIAl7IE1BWF9TSUdQRU5ESU5HLCBN QVhfU0lHUEVORElORyB9LAkJXA0KIAl7IE1RX0JZVEVTX01BWCwgTVFfQllURVNfTUFYIH0sCQkJ XA0KKwl7IElXQVRDSEVTX1NPRlRfTElNSVQsIElEUl9NQVhfSUQgfSwJCVwNCiB9DQogDQogI2Vu ZGlmIC8qIF9fS0VSTkVMX18gKi8NCi0tLSBjbGVhbi9saW51eC9hcmNoL2kzODYva2VybmVsL2lu aXRfdGFzay5jCTIwMDQtMTAtMTggMTc6NTU6MjguMDAwMDAwMDAwIC0wNDAwDQorKysgbGludXgv YXJjaC9pMzg2L2tlcm5lbC9pbml0X3Rhc2suYwkyMDA0LTEwLTI2IDE2OjMxOjIxLjAwMDAwMDAw MCAtMDQwMA0KQEAgLTUsNiArNSw4IEBADQogI2luY2x1ZGUgPGxpbnV4L2luaXRfdGFzay5oPg0K ICNpbmNsdWRlIDxsaW51eC9mcy5oPg0KICNpbmNsdWRlIDxsaW51eC9tcXVldWUuaD4NCisjaW5j bHVkZSA8bGludXgvaWRyLmg+DQorI2luY2x1ZGUgPGxpbnV4L2lub3RpZnkuaD4NCiANCiAjaW5j bHVkZSA8YXNtL3VhY2Nlc3MuaD4NCiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4NCi== --=-V+AesdDHQ/Vm2FqvlgGF-- - 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/