From mboxrd@z Thu Jan 1 00:00:00 1970 Message-ID: <1069370480.3fbd4c706cd12@netmail.pipex.net> From: tugg MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="-MOQ1069370480dda4d505efe35ea7d99426e4cbef3ff5" Subject: [linux-lvm] LVM2 on 2.4.22. (Fedora core 1 with nptl) Sender: linux-lvm-admin@sistina.com Errors-To: linux-lvm-admin@sistina.com Reply-To: linux-lvm@sistina.com List-Help: List-Post: List-Subscribe: , List-Unsubscribe: , List-Archive: Date: Fri Nov 21 07:17:02 2003 List-Id: To: linux-lvm@sistina.com This message is in MIME format. ---MOQ1069370480dda4d505efe35ea7d99426e4cbef3ff5 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit Trying to install LVM2 on 2.4.22. (Fedora core 1 with nptl) Downloaded device mapper (device-mapper-stable.tgz) and LVM2 (LVM2.0- stable.tgz) from sistina.com. Unpacked to device-mapper.1.00.5 and LVM2.2.00.07. For device mapper: did configure followed by make install. There is no patch for 2.4.22 so I assumed that the kernel was already patched (mistake?). LVM and device mapper are already loadable modules, so no need to recompile kernel (correct?). Added script to /etc/modules.conf and reboot. DMESG shows LVM version 1.0.5+(22/07/2002) module loaded. pvscan -h gives me the following: Logical Volume Manager 1.0.3 Heinz Mauelshagen, Sistina Software 19/02/2002 (IOP 10) pvscan -- scan for physical volumes pvscan [-d|--debug] {-e|--exported | -n/--novolumegroup} [-h|--help] [-s|--short] [-u|--uuid] [-v[v]|--verbose [--verbose]] [--version] Why is it telling me 1.0.3 when DMESG says 1.0.5+? dmsetup --version gives me: Library version: 1.00.05-ioctl-cvs (2003-09-01) device-mapper: ioctl interface mismatch: kernel(1.0.3), user(4.0.0), cmd(0) Driver version: 1.0.3 The ioctl interface mismatch message behaves kind of strangely in that it isn't written to std error, i.e. dmsetup --version 1> dmsetup.log 2>&1 doesn't write the message to dmsetup.log. It still appears on the console. Even more bizarrely, if I log in through OpenSSH it doesn't appear in my session - it appears on the physical console (i.e. the monitor connected to the server), and it does this even when no user is logged on!!! It also doesn't appear in a terminal session under X. Is this behaviour 'by design'? I missed the message initially and only found it when I physically went to the server... For LVM: Did configure and make install. Got the following error message: device/dev-io.c: In function `dev_get_size': device/dev-io.c:215: error: `BLKGETSIZE64' undeclared (first use in this function) device/dev-io.c:215: error: (Each undeclared identifier is reported only once device/dev-io.c:215: error: for each function it appears in.) make[1]: *** [device/dev-io.o] Error 1 make[1]: *** Waiting for unfinished jobs.... make[1]: Leaving directory `/usr/LVM/LVM2.2.00.07/lib' make: *** [lib] Error 2 Is this caused by the ioctl mismatch or is there something else going on here? If it is a known problem, is there a workaround? After trying all of the above, found patches for 2.4.22 via mailing list archives (2.4.22-dm-1.tar.bz2) and upacked to get directory 2.4.22-dm-1 containing patch files 00001 through 00016 and INDEX. Used cat to create one large patch file (file patches-2.4.22.patch attached) with all the patches (mistake?) and did patch --dry-run -p1 with this file (only dry run, so nothing applied yet). This indicates some patches will apply, some are already applied, and quite a few will fail (see attached patches-2.4.22.log file). Is this because I installed device mapper before the patches, or do these patches just not fit my system? Also, HOWTO says I need 1.0.6 or later (I assume this is the driver version, not the library version?) - do I need another kernel patch to do that, is it included in the patches I am trying to apply, or will that install as part of LVM2? Okay, I admit assuming that 2.4.22 didn't need patches was not clever, but the patches aren't anywhere to be found on the sistina.com web site and can only be found by trawling the archives for a link hidden in a message!!! So, can anyone help me fix this mess and get LVM2 up and running? I would appreciate any help or advice that anyone can give. Don't know that much about linux (not a kernel hacker...) so please try and keep replies as simple as possible :-) Thanks in advance -- ---MOQ1069370480dda4d505efe35ea7d99426e4cbef3ff5 Content-Type: application/octet-stream; name="patches-2.4.22.log" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="patches-2.4.22.log" cGF0Y2hpbmcgZmlsZSBEb2N1bWVudGF0aW9uL0NvbmZpZ3VyZS5oZWxwClJldmVyc2VkIChvciBw cmV2aW91c2x5IGFwcGxpZWQpIHBhdGNoIGRldGVjdGVkISAgQXNzdW1lIC1SPyBbbl0gCkFwcGx5 IGFueXdheT8gW25dIApTa2lwcGluZyBwYXRjaC4KMSBvdXQgb2YgMSBodW5rIGlnbm9yZWQgLS0g c2F2aW5nIHJlamVjdHMgdG8gZmlsZSBEb2N1bWVudGF0aW9uL0NvbmZpZ3VyZS5oZWxwLnJlagpw YXRjaGluZyBmaWxlIE1BSU5UQUlORVJTCkh1bmsgIzEgc3VjY2VlZGVkIGF0IDU3MSB3aXRoIGZ1 enogMSAob2Zmc2V0IDE3IGxpbmVzKS4KcGF0Y2hpbmcgZmlsZSBhcmNoL21pcHM2NC9rZXJuZWwv aW9jdGwzMi5jCnBhdGNoaW5nIGZpbGUgYXJjaC9wYXJpc2Mva2VybmVsL2lvY3RsMzIuYwpwYXRj aGluZyBmaWxlIGFyY2gvcHBjNjQva2VybmVsL2lvY3RsMzIuYwpwYXRjaGluZyBmaWxlIGFyY2gv czM5MHgva2VybmVsL2lvY3RsMzIuYwpwYXRjaGluZyBmaWxlIGFyY2gvc3BhcmM2NC9rZXJuZWwv aW9jdGwzMi5jCnBhdGNoaW5nIGZpbGUgYXJjaC94ODZfNjQvaWEzMi9pYTMyX2lvY3RsLmMKcGF0 Y2hpbmcgZmlsZSBkcml2ZXJzL21kL0NvbmZpZy5pbgpIdW5rICMxIEZBSUxFRCBhdCAxNC4KMSBv dXQgb2YgMSBodW5rIEZBSUxFRCAtLSBzYXZpbmcgcmVqZWN0cyB0byBmaWxlIGRyaXZlcnMvbWQv Q29uZmlnLmluLnJlagpwYXRjaGluZyBmaWxlIGRyaXZlcnMvbWQvTWFrZWZpbGUKSHVuayAjMSBG QUlMRUQgYXQgNC4KMSBvdXQgb2YgMSBodW5rIEZBSUxFRCAtLSBzYXZpbmcgcmVqZWN0cyB0byBm aWxlIGRyaXZlcnMvbWQvTWFrZWZpbGUucmVqCnBhdGNoaW5nIGZpbGUgZnMvYnVmZmVyLmMKUmV2 ZXJzZWQgKG9yIHByZXZpb3VzbHkgYXBwbGllZCkgcGF0Y2ggZGV0ZWN0ZWQhICBBc3N1bWUgLVI/ IFtuXSAKQXBwbHkgYW55d2F5PyBbbl0gClNraXBwaW5nIHBhdGNoLgoxIG91dCBvZiAxIGh1bmsg aWdub3JlZCAtLSBzYXZpbmcgcmVqZWN0cyB0byBmaWxlIGZzL2J1ZmZlci5jLnJlagpwYXRjaGlu ZyBmaWxlIGZzL2piZC9qb3VybmFsLmMKSHVuayAjMSBGQUlMRUQgYXQgMTgwMi4KSHVuayAjMiBG QUlMRUQgYXQgMTgxMi4KSHVuayAjMyBGQUlMRUQgYXQgMTgyMS4KSHVuayAjNCBGQUlMRUQgYXQg MTg1NC4KNCBvdXQgb2YgNCBodW5rcyBGQUlMRUQgLS0gc2F2aW5nIHJlamVjdHMgdG8gZmlsZSBm cy9qYmQvam91cm5hbC5jLnJlagpwYXRjaGluZyBmaWxlIGluY2x1ZGUvbGludXgvZnMuaApSZXZl cnNlZCAob3IgcHJldmlvdXNseSBhcHBsaWVkKSBwYXRjaCBkZXRlY3RlZCEgIEFzc3VtZSAtUj8g W25dIApBcHBseSBhbnl3YXk/IFtuXSAKU2tpcHBpbmcgcGF0Y2guCjEgb3V0IG9mIDEgaHVuayBp Z25vcmVkIC0tIHNhdmluZyByZWplY3RzIHRvIGZpbGUgaW5jbHVkZS9saW51eC9mcy5oLnJlagpw YXRjaGluZyBmaWxlIGluY2x1ZGUvbGludXgvamJkLmgKUmV2ZXJzZWQgKG9yIHByZXZpb3VzbHkg YXBwbGllZCkgcGF0Y2ggZGV0ZWN0ZWQhICBBc3N1bWUgLVI/IFtuXSAKQXBwbHkgYW55d2F5PyBb bl0gClNraXBwaW5nIHBhdGNoLgoxIG91dCBvZiAxIGh1bmsgaWdub3JlZCAtLSBzYXZpbmcgcmVq ZWN0cyB0byBmaWxlIGluY2x1ZGUvbGludXgvamJkLmgucmVqCnBhdGNoaW5nIGZpbGUgaW5jbHVk ZS9saW51eC92bWFsbG9jLmgKUmV2ZXJzZWQgKG9yIHByZXZpb3VzbHkgYXBwbGllZCkgcGF0Y2gg ZGV0ZWN0ZWQhICBBc3N1bWUgLVI/IFtuXSAKQXBwbHkgYW55d2F5PyBbbl0gClNraXBwaW5nIHBh dGNoLgoxIG91dCBvZiAxIGh1bmsgaWdub3JlZCAtLSBzYXZpbmcgcmVqZWN0cyB0byBmaWxlIGlu Y2x1ZGUvbGludXgvdm1hbGxvYy5oLnJlagpwYXRjaGluZyBmaWxlIGtlcm5lbC9rc3ltcy5jCkh1 bmsgIzEgc3VjY2VlZGVkIGF0IDEzMCB3aXRoIGZ1enogMSAob2Zmc2V0IDE2IGxpbmVzKS4KcGF0 Y2hpbmcgZmlsZSBtbS9NYWtlZmlsZQpIdW5rICMxIEZBSUxFRCBhdCA5LgoxIG91dCBvZiAxIGh1 bmsgRkFJTEVEIC0tIHNhdmluZyByZWplY3RzIHRvIGZpbGUgbW0vTWFrZWZpbGUucmVqCnBhdGNo aW5nIGZpbGUgbW0vZmlsZW1hcC5jCkh1bmsgIzEgc3VjY2VlZGVkIGF0IDE3OTcgKG9mZnNldCA1 NSBsaW5lcykuCkh1bmsgIzIgc3VjY2VlZGVkIGF0IDMxMjkgKG9mZnNldCA4IGxpbmVzKS4KcGF0 Y2hpbmcgZmlsZSBtbS92bWFsbG9jLmMKUmV2ZXJzZWQgKG9yIHByZXZpb3VzbHkgYXBwbGllZCkg cGF0Y2ggZGV0ZWN0ZWQhICBBc3N1bWUgLVI/IFtuXSAKQXBwbHkgYW55d2F5PyBbbl0gClNraXBw aW5nIHBhdGNoLgoxIG91dCBvZiAxIGh1bmsgaWdub3JlZCAtLSBzYXZpbmcgcmVqZWN0cyB0byBm aWxlIG1tL3ZtYWxsb2MuYy5yZWoKcGF0Y2hpbmcgZmlsZSBhcmNoL21pcHM2NC9rZXJuZWwvaW9j dGwzMi5jLnJlagpwYXRjaGluZyBmaWxlIGFyY2gvczM5MHgva2VybmVsL2lvY3RsMzIuYy5yZWoK cGF0Y2hpbmcgZmlsZSBkcml2ZXJzL21kL2RtLWRhZW1vbi5jCnBhdGNoaW5nIGZpbGUgZHJpdmVy cy9tZC9kbS1kYWVtb24uaApUaGUgbmV4dCBwYXRjaCB3b3VsZCBjcmVhdGUgdGhlIGZpbGUgZHJp dmVycy9tZC9kbS1leGNlcHRpb24tc3RvcmUuYywKd2hpY2ggYWxyZWFkeSBleGlzdHMhICBBc3N1 bWUgLVI/IFtuXSAKQXBwbHkgYW55d2F5PyBbbl0gClNraXBwaW5nIHBhdGNoLgoxIG91dCBvZiAx IGh1bmsgaWdub3JlZCAtLSBzYXZpbmcgcmVqZWN0cyB0byBmaWxlIGRyaXZlcnMvbWQvZG0tZXhj ZXB0aW9uLXN0b3JlLmMucmVqCnBhdGNoaW5nIGZpbGUgZHJpdmVycy9tZC9kbS1pby5jCnBhdGNo aW5nIGZpbGUgZHJpdmVycy9tZC9kbS1pby5oClRoZSBuZXh0IHBhdGNoIHdvdWxkIGNyZWF0ZSB0 aGUgZmlsZSBkcml2ZXJzL21kL2RtLWlvY3RsLmMsCndoaWNoIGFscmVhZHkgZXhpc3RzISAgQXNz dW1lIC1SPyBbbl0gCkFwcGx5IGFueXdheT8gW25dIApTa2lwcGluZyBwYXRjaC4KMSBvdXQgb2Yg MSBodW5rIGlnbm9yZWQgLS0gc2F2aW5nIHJlamVjdHMgdG8gZmlsZSBkcml2ZXJzL21kL2RtLWlv Y3RsLmMucmVqClRoZSBuZXh0IHBhdGNoIHdvdWxkIGNyZWF0ZSB0aGUgZmlsZSBkcml2ZXJzL21k L2RtLWxpbmVhci5jLAp3aGljaCBhbHJlYWR5IGV4aXN0cyEgIEFzc3VtZSAtUj8gW25dIApBcHBs eSBhbnl3YXk/IFtuXSAKU2tpcHBpbmcgcGF0Y2guCjEgb3V0IG9mIDEgaHVuayBpZ25vcmVkIC0t IHNhdmluZyByZWplY3RzIHRvIGZpbGUgZHJpdmVycy9tZC9kbS1saW5lYXIuYy5yZWoKcGF0Y2hp bmcgZmlsZSBkcml2ZXJzL21kL2RtLWxvZy5jCnBhdGNoaW5nIGZpbGUgZHJpdmVycy9tZC9kbS1s b2cuaApwYXRjaGluZyBmaWxlIGRyaXZlcnMvbWQvZG0tcmFpZDEuYwpUaGUgbmV4dCBwYXRjaCB3 b3VsZCBjcmVhdGUgdGhlIGZpbGUgZHJpdmVycy9tZC9kbS1zbmFwc2hvdC5jLAp3aGljaCBhbHJl YWR5IGV4aXN0cyEgIEFzc3VtZSAtUj8gW25dIApBcHBseSBhbnl3YXk/IFtuXSAKU2tpcHBpbmcg cGF0Y2guCjEgb3V0IG9mIDEgaHVuayBpZ25vcmVkIC0tIHNhdmluZyByZWplY3RzIHRvIGZpbGUg ZHJpdmVycy9tZC9kbS1zbmFwc2hvdC5jLnJlagpUaGUgbmV4dCBwYXRjaCB3b3VsZCBjcmVhdGUg dGhlIGZpbGUgZHJpdmVycy9tZC9kbS1zbmFwc2hvdC5oLAp3aGljaCBhbHJlYWR5IGV4aXN0cyEg IEFzc3VtZSAtUj8gW25dIApBcHBseSBhbnl3YXk/IFtuXSAKU2tpcHBpbmcgcGF0Y2guCjEgb3V0 IG9mIDEgaHVuayBpZ25vcmVkIC0tIHNhdmluZyByZWplY3RzIHRvIGZpbGUgZHJpdmVycy9tZC9k bS1zbmFwc2hvdC5oLnJlagpUaGUgbmV4dCBwYXRjaCB3b3VsZCBjcmVhdGUgdGhlIGZpbGUgZHJp dmVycy9tZC9kbS1zdHJpcGUuYywKd2hpY2ggYWxyZWFkeSBleGlzdHMhICBBc3N1bWUgLVI/IFtu XSAKQXBwbHkgYW55d2F5PyBbbl0gClNraXBwaW5nIHBhdGNoLgoxIG91dCBvZiAxIGh1bmsgaWdu b3JlZCAtLSBzYXZpbmcgcmVqZWN0cyB0byBmaWxlIGRyaXZlcnMvbWQvZG0tc3RyaXBlLmMucmVq ClRoZSBuZXh0IHBhdGNoIHdvdWxkIGNyZWF0ZSB0aGUgZmlsZSBkcml2ZXJzL21kL2RtLXRhYmxl LmMsCndoaWNoIGFscmVhZHkgZXhpc3RzISAgQXNzdW1lIC1SPyBbbl0gCkFwcGx5IGFueXdheT8g W25dIApTa2lwcGluZyBwYXRjaC4KMSBvdXQgb2YgMSBodW5rIGlnbm9yZWQgLS0gc2F2aW5nIHJl amVjdHMgdG8gZmlsZSBkcml2ZXJzL21kL2RtLXRhYmxlLmMucmVqClRoZSBuZXh0IHBhdGNoIHdv dWxkIGNyZWF0ZSB0aGUgZmlsZSBkcml2ZXJzL21kL2RtLXRhcmdldC5jLAp3aGljaCBhbHJlYWR5 IGV4aXN0cyEgIEFzc3VtZSAtUj8gW25dIApBcHBseSBhbnl3YXk/IFtuXSAKU2tpcHBpbmcgcGF0 Y2guCjEgb3V0IG9mIDEgaHVuayBpZ25vcmVkIC0tIHNhdmluZyByZWplY3RzIHRvIGZpbGUgZHJp dmVycy9tZC9kbS10YXJnZXQuYy5yZWoKVGhlIG5leHQgcGF0Y2ggd291bGQgY3JlYXRlIHRoZSBm aWxlIGRyaXZlcnMvbWQvZG0uYywKd2hpY2ggYWxyZWFkeSBleGlzdHMhICBBc3N1bWUgLVI/IFtu XSAKQXBwbHkgYW55d2F5PyBbbl0gClNraXBwaW5nIHBhdGNoLgoxIG91dCBvZiAxIGh1bmsgaWdu b3JlZCAtLSBzYXZpbmcgcmVqZWN0cyB0byBmaWxlIGRyaXZlcnMvbWQvZG0uYy5yZWoKVGhlIG5l eHQgcGF0Y2ggd291bGQgY3JlYXRlIHRoZSBmaWxlIGRyaXZlcnMvbWQvZG0uaCwKd2hpY2ggYWxy ZWFkeSBleGlzdHMhICBBc3N1bWUgLVI/IFtuXSAKQXBwbHkgYW55d2F5PyBbbl0gClNraXBwaW5n IHBhdGNoLgoxIG91dCBvZiAxIGh1bmsgaWdub3JlZCAtLSBzYXZpbmcgcmVqZWN0cyB0byBmaWxl IGRyaXZlcnMvbWQvZG0uaC5yZWoKVGhlIG5leHQgcGF0Y2ggd291bGQgY3JlYXRlIHRoZSBmaWxl IGRyaXZlcnMvbWQva2NvcHlkLmMsCndoaWNoIGFscmVhZHkgZXhpc3RzISAgQXNzdW1lIC1SPyBb bl0gCkFwcGx5IGFueXdheT8gW25dIApTa2lwcGluZyBwYXRjaC4KMSBvdXQgb2YgMSBodW5rIGln bm9yZWQgLS0gc2F2aW5nIHJlamVjdHMgdG8gZmlsZSBkcml2ZXJzL21kL2tjb3B5ZC5jLnJlagpU aGUgbmV4dCBwYXRjaCB3b3VsZCBjcmVhdGUgdGhlIGZpbGUgZHJpdmVycy9tZC9rY29weWQuaCwK d2hpY2ggYWxyZWFkeSBleGlzdHMhICBBc3N1bWUgLVI/IFtuXSAKQXBwbHkgYW55d2F5PyBbbl0g ClNraXBwaW5nIHBhdGNoLgoxIG91dCBvZiAxIGh1bmsgaWdub3JlZCAtLSBzYXZpbmcgcmVqZWN0 cyB0byBmaWxlIGRyaXZlcnMvbWQva2NvcHlkLmgucmVqClRoZSBuZXh0IHBhdGNoIHdvdWxkIGNy ZWF0ZSB0aGUgZmlsZSBpbmNsdWRlL2xpbnV4L2RldmljZS1tYXBwZXIuaCwKd2hpY2ggYWxyZWFk eSBleGlzdHMhICBBc3N1bWUgLVI/IFtuXSAKQXBwbHkgYW55d2F5PyBbbl0gClNraXBwaW5nIHBh dGNoLgoxIG91dCBvZiAxIGh1bmsgaWdub3JlZCAtLSBzYXZpbmcgcmVqZWN0cyB0byBmaWxlIGlu Y2x1ZGUvbGludXgvZGV2aWNlLW1hcHBlci5oLnJlagpUaGUgbmV4dCBwYXRjaCB3b3VsZCBjcmVh dGUgdGhlIGZpbGUgaW5jbHVkZS9saW51eC9kbS1pb2N0bC5oLAp3aGljaCBhbHJlYWR5IGV4aXN0 cyEgIEFzc3VtZSAtUj8gW25dIApBcHBseSBhbnl3YXk/IFtuXSAKU2tpcHBpbmcgcGF0Y2guCjEg b3V0IG9mIDEgaHVuayBpZ25vcmVkIC0tIHNhdmluZyByZWplY3RzIHRvIGZpbGUgaW5jbHVkZS9s aW51eC9kbS1pb2N0bC5oLnJlagpUaGUgbmV4dCBwYXRjaCB3b3VsZCBjcmVhdGUgdGhlIGZpbGUg aW5jbHVkZS9saW51eC9tZW1wb29sLmgsCndoaWNoIGFscmVhZHkgZXhpc3RzISAgQXNzdW1lIC1S PyBbbl0gCkFwcGx5IGFueXdheT8gW25dIApTa2lwcGluZyBwYXRjaC4KMSBvdXQgb2YgMSBodW5r IGlnbm9yZWQgLS0gc2F2aW5nIHJlamVjdHMgdG8gZmlsZSBpbmNsdWRlL2xpbnV4L21lbXBvb2wu aC5yZWoKcGF0Y2hpbmcgZmlsZSBtbS9maWxlbWFwLmMucmVqClRoZSBuZXh0IHBhdGNoIHdvdWxk IGNyZWF0ZSB0aGUgZmlsZSBtbS9tZW1wb29sLmMsCndoaWNoIGFscmVhZHkgZXhpc3RzISAgQXNz dW1lIC1SPyBbbl0gCkFwcGx5IGFueXdheT8gW25dIApTa2lwcGluZyBwYXRjaC4KMSBvdXQgb2Yg MSBodW5rIGlnbm9yZWQgLS0gc2F2aW5nIHJlamVjdHMgdG8gZmlsZSBtbS9tZW1wb29sLmMucmVq CnBhdGNoaW5nIGZpbGUgZHJpdmVycy9tZC9kbS1leGNlcHRpb24tc3RvcmUuYwpIdW5rICMxIHN1 Y2NlZWRlZCBhdCA0MzkgKG9mZnNldCA3MCBsaW5lcykuClRoZSBuZXh0IHBhdGNoIHdvdWxkIGRl bGV0ZSB0aGUgZmlsZSBhcmNoL21pcHM2NC9rZXJuZWwvaW9jdGwzMi5jLnJlaiwKd2hpY2ggZG9l cyBub3QgZXhpc3QhICBBc3N1bWUgLVI/IFtuXSAKQXBwbHkgYW55d2F5PyBbbl0gClNraXBwaW5n IHBhdGNoLgoxIG91dCBvZiAxIGh1bmsgaWdub3JlZApUaGUgbmV4dCBwYXRjaCB3b3VsZCBkZWxl dGUgdGhlIGZpbGUgYXJjaC9zMzkweC9rZXJuZWwvaW9jdGwzMi5jLnJlaiwKd2hpY2ggZG9lcyBu b3QgZXhpc3QhICBBc3N1bWUgLVI/IFtuXSAKQXBwbHkgYW55d2F5PyBbbl0gClNraXBwaW5nIHBh dGNoLgoxIG91dCBvZiAxIGh1bmsgaWdub3JlZApUaGUgbmV4dCBwYXRjaCB3b3VsZCBkZWxldGUg dGhlIGZpbGUgbW0vZmlsZW1hcC5jLnJlaiwKd2hpY2ggZG9lcyBub3QgZXhpc3QhICBBc3N1bWUg LVI/IFtuXSAKQXBwbHkgYW55d2F5PyBbbl0gClNraXBwaW5nIHBhdGNoLgoxIG91dCBvZiAxIGh1 bmsgaWdub3JlZApwYXRjaGluZyBmaWxlIGRyaXZlcnMvbWQva2NvcHlkLmMKSHVuayAjMSBzdWNj ZWVkZWQgYXQgMjA0IHdpdGggZnV6eiAyIChvZmZzZXQgMjEgbGluZXMpLgpwYXRjaGluZyBmaWxl IGRyaXZlcnMvbWQvZG0taW9jdGwuYwpIdW5rICMxIEZBSUxFRCBhdCA1OTMuCkh1bmsgIzIgRkFJ TEVEIGF0IDYxMi4KSHVuayAjMyBGQUlMRUQgYXQgNjc1LgozIG91dCBvZiAzIGh1bmtzIEZBSUxF RCAtLSBzYXZpbmcgcmVqZWN0cyB0byBmaWxlIGRyaXZlcnMvbWQvZG0taW9jdGwuYy5yZWoKcGF0 Y2hpbmcgZmlsZSBkcml2ZXJzL21kL2RtLXNuYXBzaG90LmMKSHVuayAjMSBGQUlMRUQgYXQgNTI1 LgpIdW5rICMyIEZBSUxFRCBhdCA1MzkuCjIgb3V0IG9mIDIgaHVua3MgRkFJTEVEIC0tIHNhdmlu ZyByZWplY3RzIHRvIGZpbGUgZHJpdmVycy9tZC9kbS1zbmFwc2hvdC5jLnJlagpwYXRjaGluZyBm aWxlIGRyaXZlcnMvbWQvbHZtLmMKUmV2ZXJzZWQgKG9yIHByZXZpb3VzbHkgYXBwbGllZCkgcGF0 Y2ggZGV0ZWN0ZWQhICBBc3N1bWUgLVI/IFtuXSAKQXBwbHkgYW55d2F5PyBbbl0gClNraXBwaW5n IHBhdGNoLgozIG91dCBvZiAzIGh1bmtzIGlnbm9yZWQgLS0gc2F2aW5nIHJlamVjdHMgdG8gZmls ZSBkcml2ZXJzL21kL2x2bS5jLnJlagpwYXRjaGluZyBmaWxlIGZzL2J1ZmZlci5jCkh1bmsgIzEg c3VjY2VlZGVkIGF0IDQ0OCB3aXRoIGZ1enogMSAob2Zmc2V0IDcyIGxpbmVzKS4KcGF0Y2hpbmcg ZmlsZSBmcy9yZWlzZXJmcy9zdXBlci5jClJldmVyc2VkIChvciBwcmV2aW91c2x5IGFwcGxpZWQp IHBhdGNoIGRldGVjdGVkISAgQXNzdW1lIC1SPyBbbl0gCkFwcGx5IGFueXdheT8gW25dIApTa2lw cGluZyBwYXRjaC4KMSBvdXQgb2YgMSBodW5rIGlnbm9yZWQgLS0gc2F2aW5nIHJlamVjdHMgdG8g ZmlsZSBmcy9yZWlzZXJmcy9zdXBlci5jLnJlagpwYXRjaGluZyBmaWxlIGZzL3N1cGVyLmMKSHVu ayAjMSBzdWNjZWVkZWQgYXQgNDYgd2l0aCBmdXp6IDEgKG9mZnNldCA3IGxpbmVzKS4KSHVuayAj MiBzdWNjZWVkZWQgYXQgNDcwIHdpdGggZnV6eiAxIChvZmZzZXQgMjggbGluZXMpLgpIdW5rICMz IHN1Y2NlZWRlZCBhdCA1NDggd2l0aCBmdXp6IDEgKG9mZnNldCA0MCBsaW5lcykuCnBhdGNoaW5n IGZpbGUgaW5jbHVkZS9saW51eC9mcy5oClJldmVyc2VkIChvciBwcmV2aW91c2x5IGFwcGxpZWQp IHBhdGNoIGRldGVjdGVkISAgQXNzdW1lIC1SPyBbbl0gCkFwcGx5IGFueXdheT8gW25dIApTa2lw cGluZyBwYXRjaC4KMiBvdXQgb2YgMiBodW5rcyBpZ25vcmVkIC0tIHNhdmluZyByZWplY3RzIHRv IGZpbGUgaW5jbHVkZS9saW51eC9mcy5oLnJlagpwYXRjaGluZyBmaWxlIGtlcm5lbC9rc3ltcy5j Ckh1bmsgIzEgRkFJTEVEIGF0IDE4OS4KMSBvdXQgb2YgMSBodW5rIEZBSUxFRCAtLSBzYXZpbmcg cmVqZWN0cyB0byBmaWxlIGtlcm5lbC9rc3ltcy5jLnJlagpwYXRjaGluZyBmaWxlIGRyaXZlcnMv bWQvZG0tc25hcHNob3QuYwpIdW5rICMxIEZBSUxFRCBhdCA1MzMuCjEgb3V0IG9mIDEgaHVuayBG QUlMRUQgLS0gc2F2aW5nIHJlamVjdHMgdG8gZmlsZSBkcml2ZXJzL21kL2RtLXNuYXBzaG90LmMu cmVqCnBhdGNoaW5nIGZpbGUgZHJpdmVycy9tZC9kbS1zbmFwc2hvdC5jCkh1bmsgIzEgRkFJTEVE IGF0IDUyNC4KMSBvdXQgb2YgMSBodW5rIEZBSUxFRCAtLSBzYXZpbmcgcmVqZWN0cyB0byBmaWxl IGRyaXZlcnMvbWQvZG0tc25hcHNob3QuYy5yZWoKcGF0Y2hpbmcgZmlsZSBkcml2ZXJzL21kL2Rt LmMKSHVuayAjMSBGQUlMRUQgYXQgOTUxLgpIdW5rICMyIEZBSUxFRCBhdCA5OTYuCkh1bmsgIzMg RkFJTEVEIGF0IDEwMjguCjMgb3V0IG9mIDMgaHVua3MgRkFJTEVEIC0tIHNhdmluZyByZWplY3Rz IHRvIGZpbGUgZHJpdmVycy9tZC9kbS5jLnJlagpjYW4ndCBmaW5kIGZpbGUgdG8gcGF0Y2ggYXQg aW5wdXQgbGluZSAxMDcyOApQZXJoYXBzIHlvdSB1c2VkIHRoZSB3cm9uZyAtcCBvciAtLXN0cmlw IG9wdGlvbj8KVGhlIHRleHQgbGVhZGluZyB1cCB0byB0aGlzIHdhczoKLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0KfENvcnJlY3QgZXJyb3IgbWVzc2FnZSB3aGVuIHN0YXJ0IGEgZG0tZGFlbW9u Lgp8LS0tIGRpZmYvZHJpdmVycy9tZC9kbS1kYWVtb24uYwkyMDAzLTA4LTI2IDEzOjU5OjA0LjAw MDAwMDAwMCArMDEwMAp8KysrIHNvdXJjZS9kcml2ZXJzL21kL2RtLWRhZW1vbi5jCTIwMDMtMDgt MjYgMTY6Mjg6MDUuMDAwMDAwMDAwICswMTAwCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkZp bGUgdG8gcGF0Y2g6IApTa2lwIHRoaXMgcGF0Y2g/IFt5XSAKU2tpcHBpbmcgcGF0Y2guCjEgb3V0 IG9mIDEgaHVuayBpZ25vcmVkCnBhdGNoaW5nIGZpbGUgZHJpdmVycy9tZC9kbS1pb2N0bC5jCkh1 bmsgIzEgRkFJTEVEIGF0IDgxNi4KMSBvdXQgb2YgMSBodW5rIEZBSUxFRCAtLSBzYXZpbmcgcmVq ZWN0cyB0byBmaWxlIGRyaXZlcnMvbWQvZG0taW9jdGwuYy5yZWoKcGF0Y2hpbmcgZmlsZSBkcml2 ZXJzL21kL0NvbmZpZy5pbgpIdW5rICMxIEZBSUxFRCBhdCAxNC4KMSBvdXQgb2YgMSBodW5rIEZB SUxFRCAtLSBzYXZpbmcgcmVqZWN0cyB0byBmaWxlIGRyaXZlcnMvbWQvQ29uZmlnLmluLnJlagpw YXRjaGluZyBmaWxlIGRyaXZlcnMvbWQvZG0taW9jdGwuYwpIdW5rICMxIHN1Y2NlZWRlZCBhdCA0 MDEgd2l0aCBmdXp6IDEgKG9mZnNldCAtMjk4IGxpbmVzKS4KSHVuayAjMiBGQUlMRUQgYXQgNjg0 LgoxIG91dCBvZiAyIGh1bmtzIEZBSUxFRCAtLSBzYXZpbmcgcmVqZWN0cyB0byBmaWxlIGRyaXZl cnMvbWQvZG0taW9jdGwuYy5yZWoKcGF0Y2hpbmcgZmlsZSBkcml2ZXJzL21kL2RtLWlvY3RsLmMK SHVuayAjMSBzdWNjZWVkZWQgYXQgNDA2IHdpdGggZnV6eiAyIChvZmZzZXQgLTM2MiBsaW5lcyku Ckh1bmsgIzIgRkFJTEVEIGF0IDQyOS4KMSBvdXQgb2YgMiBodW5rcyBGQUlMRUQgLS0gc2F2aW5n IHJlamVjdHMgdG8gZmlsZSBkcml2ZXJzL21kL2RtLWlvY3RsLmMucmVqCnBhdGNoaW5nIGZpbGUg ZHJpdmVycy9tZC9kbS1saW5lYXIuYwpIdW5rICMxIEZBSUxFRCBhdCAyNy4KMSBvdXQgb2YgMSBo dW5rIEZBSUxFRCAtLSBzYXZpbmcgcmVqZWN0cyB0byBmaWxlIGRyaXZlcnMvbWQvZG0tbGluZWFy LmMucmVqCnBhdGNoaW5nIGZpbGUgZHJpdmVycy9tZC9kbS10YWJsZS5jCkh1bmsgIzEgRkFJTEVE IGF0IDQ0MS4KSHVuayAjMiBGQUlMRUQgYXQgNDk5LgpIdW5rICMzIHN1Y2NlZWRlZCBhdCA0NDUg d2l0aCBmdXp6IDEgKG9mZnNldCAtNzAgbGluZXMpLgpIdW5rICM0IEZBSUxFRCBhdCA0NTMuCkh1 bmsgIzUgRkFJTEVEIGF0IDQ4Mi4KNCBvdXQgb2YgNSBodW5rcyBGQUlMRUQgLS0gc2F2aW5nIHJl amVjdHMgdG8gZmlsZSBkcml2ZXJzL21kL2RtLXRhYmxlLmMucmVqCnBhdGNoaW5nIGZpbGUgZnMv YnVmZmVyLmMKUmV2ZXJzZWQgKG9yIHByZXZpb3VzbHkgYXBwbGllZCkgcGF0Y2ggZGV0ZWN0ZWQh ICBBc3N1bWUgLVI/IFtuXSAKQXBwbHkgYW55d2F5PyBbbl0gClNraXBwaW5nIHBhdGNoLgoxIG91 dCBvZiAxIGh1bmsgaWdub3JlZCAtLSBzYXZpbmcgcmVqZWN0cyB0byBmaWxlIGZzL2J1ZmZlci5j LnJlagpwYXRjaGluZyBmaWxlIGRyaXZlcnMvbWQvZG0taW9jdGwuYwpIdW5rICMxIHN1Y2NlZWRl ZCBhdCA1MzMgd2l0aCBmdXp6IDEgKG9mZnNldCAtMzM4IGxpbmVzKS4KcGF0Y2hpbmcgZmlsZSBk cml2ZXJzL21kL2RtLXRhYmxlLmMKSHVuayAjMSBGQUlMRUQgYXQgMTEyLgpIdW5rICMyIEZBSUxF RCBhdCAxMjMuCkh1bmsgIzMgRkFJTEVEIGF0IDE5My4KSHVuayAjNCBzdWNjZWVkZWQgYXQgMzQz IHdpdGggZnV6eiAyIChvZmZzZXQgLTE0MSBsaW5lcykuCjMgb3V0IG9mIDQgaHVua3MgRkFJTEVE IC0tIHNhdmluZyByZWplY3RzIHRvIGZpbGUgZHJpdmVycy9tZC9kbS10YWJsZS5jLnJlagpwYXRj aGluZyBmaWxlIGRyaXZlcnMvbWQvZG0uaApIdW5rICMxIEZBSUxFRCBhdCA5Ni4KMSBvdXQgb2Yg MSBodW5rIEZBSUxFRCAtLSBzYXZpbmcgcmVqZWN0cyB0byBmaWxlIGRyaXZlcnMvbWQvZG0uaC5y ZWoK ---MOQ1069370480dda4d505efe35ea7d99426e4cbef3ff5 Content-Type: text/plain; name="patches-2.4.22.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="patches-2.4.22.patch" Y3ZzIGRtIDEuMAotLS0gZGlmZi9Eb2N1bWVudGF0aW9uL0NvbmZpZ3VyZS5oZWxwCTIwMDMtMDgt MjYgMTM6NDk6NTkuMDAwMDAwMDAwICswMTAwCisrKyBzb3VyY2UvRG9jdW1lbnRhdGlvbi9Db25m aWd1cmUuaGVscAkyMDAzLTA4LTI2IDEzOjU5OjA0LjAwMDAwMDAwMCArMDEwMApAQCAtMTg1Niw2 ICsxODU2LDIwIEBACiAgIHdhbnQpLCBzYXkgTSBoZXJlIGFuZCByZWFkIDxmaWxlOkRvY3VtZW50 YXRpb24vbW9kdWxlcy50eHQ+LiAgVGhlCiAgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBsdm0tbW9k Lm8uCiAKK0RldmljZS1tYXBwZXIgc3VwcG9ydAorQ09ORklHX0JMS19ERVZfRE0KKyAgRGV2aWNl LW1hcHBlciBpcyBhIGxvdyBsZXZlbCB2b2x1bWUgbWFuYWdlci4gIEl0IHdvcmtzIGJ5IGFsbG93 aW5nCisgIHBlb3BsZSB0byBzcGVjaWZ5IG1hcHBpbmdzIGZvciByYW5nZXMgb2YgbG9naWNhbCBz ZWN0b3JzLiAgVmFyaW91cworICBtYXBwaW5nIHR5cGVzIGFyZSBhdmFpbGFibGUsIGluIGFkZGl0 aW9uIHBlb3BsZSBtYXkgd3JpdGUgdGhlaXIgb3duCisgIG1vZHVsZXMgY29udGFpbmluZyBjdXN0 b20gbWFwcGluZ3MgaWYgdGhleSB3aXNoLgorCisgIEhpZ2hlciBsZXZlbCB2b2x1bWUgbWFuYWdl cnMgc3VjaCBhcyBMVk0yIHVzZSB0aGlzIGRyaXZlci4KKworICBJZiB5b3Ugd2FudCB0byBjb21w aWxlIHRoaXMgYXMgYSBtb2R1bGUsIHNheSBNIGhlcmUgYW5kIHJlYWQgCisgIDxmaWxlOkRvY3Vt ZW50YXRpb24vbW9kdWxlcy50eHQ+LiAgVGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBkbS1tb2Qu by4KKworICBJZiB1bnN1cmUsIHNheSBOLgorCiBNdWx0aXBsZSBkZXZpY2VzIGRyaXZlciBzdXBw b3J0IChSQUlEIGFuZCBMVk0pCiBDT05GSUdfTUQKICAgU3VwcG9ydCBtdWx0aXBsZSBwaHlzaWNh bCBzcGluZGxlcyB0aHJvdWdoIGEgc2luZ2xlIGxvZ2ljYWwgZGV2aWNlLgotLS0gZGlmZi9NQUlO VEFJTkVSUwkyMDAzLTA4LTI2IDEzOjQ5OjU5LjAwMDAwMDAwMCArMDEwMAorKysgc291cmNlL01B SU5UQUlORVJTCTIwMDMtMDgtMjYgMTM6NTk6MDQuMDAwMDAwMDAwICswMTAwCkBAIC01NTQsNiAr NTU0LDEzIEBACiBXOglodHRwOi8vd3d3LmRlYmlhbi5vcmcvfmR6L2k4ay8KIFM6CU1haW50YWlu ZWQKIAorREVWSUNFIE1BUFBFUgorUDoJSm9lIFRob3JuYmVyCitNOglkbUB1ay5zaXN0aW5hLmNv bQorTDoJbGludXgtTFZNQHNpc3RpbmEuY29tCitXOglodHRwOi8vd3d3LnNpc3RpbmEuY29tL2x2 bQorUzoJTWFpbnRhaW5lZAorCiBERVZJQ0UgTlVNQkVSIFJFR0lTVFJZCiBQOglILiBQZXRlciBB bnZpbgogTToJaHBhQHp5dG9yLmNvbQotLS0gZGlmZi9hcmNoL21pcHM2NC9rZXJuZWwvaW9jdGwz Mi5jCTIwMDMtMDgtMjYgMTM6NTA6MDMuMDAwMDAwMDAwICswMTAwCisrKyBzb3VyY2UvYXJjaC9t aXBzNjQva2VybmVsL2lvY3RsMzIuYwkyMDAzLTA4LTI2IDE0OjE4OjE3LjAwMDAwMDAwMCArMDEw MApAQCAtMzYsNiArMzYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2F1dG9fZnM0Lmg+CiAjaW5jbHVk ZSA8bGludXgvZXh0Ml9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3JhaWQvbWRfdS5oPgorI2luY2x1 ZGUgPGxpbnV4L2RtLWlvY3RsLmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CiAKICNpbmNs dWRlIDxzY3NpL3Njc2kuaD4KQEAgLTEyMjgsNiArMTIyOSwyMiBAQAogCUlPQ1RMMzJfREVGQVVM VChTQlBST0ZfWkJXQUlURlVMTCksCiAjZW5kaWYgLyogQ09ORklHX1NJQllURV9UQlBST0YgKi8K IAorI2lmIGRlZmluZWQoQ09ORklHX0JMS19ERVZfRE0pIHx8IGRlZmluZWQoQ09ORklHX0JMS19E RVZfRE1fTU9EVUxFKQorCUlPQ1RMMzJfREVGQVVMVChETV9WRVJTSU9OKSwKKwlJT0NUTDMyX0RF RkFVTFQoRE1fUkVNT1ZFX0FMTCksCisJSU9DVEwzMl9ERUZBVUxUKERNX0RFVl9DUkVBVEUpLAor CUlPQ1RMMzJfREVGQVVMVChETV9ERVZfUkVNT1ZFKSwKKwlJT0NUTDMyX0RFRkFVTFQoRE1fVEFC TEVfTE9BRCksCisJSU9DVEwzMl9ERUZBVUxUKERNX0RFVl9TVVNQRU5EKSwKKwlJT0NUTDMyX0RF RkFVTFQoRE1fREVWX1JFTkFNRSksCisJSU9DVEwzMl9ERUZBVUxUKERNX1RBQkxFX0RFUFMpLAor CUlPQ1RMMzJfREVGQVVMVChETV9ERVZfU1RBVFVTKSwKKwlJT0NUTDMyX0RFRkFVTFQoRE1fVEFC TEVfU1RBVFVTKSwKKwlJT0NUTDMyX0RFRkFVTFQoRE1fREVWX1dBSVQpLAorCUlPQ1RMMzJfREVG QVVMVChETV9MSVNUX0RFVklDRVMpLAorCUlPQ1RMMzJfREVGQVVMVChETV9UQUJMRV9DTEVBUiks CisjZW5kaWYgLyogQ09ORklHX0JMS19ERVZfRE0gKi8KKwogCUlPQ1RMMzJfREVGQVVMVChNVElP Q1RPUCksCQkJLyogbXRpby5oIGlvY3RscyAgKi8KIAlJT0NUTDMyX0hBTkRMRVIoTVRJT0NHRVQz MiwgbXRfaW9jdGxfdHJhbnMpLAogCUlPQ1RMMzJfSEFORExFUihNVElPQ1BPUzMyLCBtdF9pb2N0 bF90cmFucyksCi0tLSBkaWZmL2FyY2gvcGFyaXNjL2tlcm5lbC9pb2N0bDMyLmMJMjAwMy0wOC0y NiAxMzo1MDowMy4wMDAwMDAwMDAgKzAxMDAKKysrIHNvdXJjZS9hcmNoL3BhcmlzYy9rZXJuZWwv aW9jdGwzMi5jCTIwMDMtMDgtMjYgMTM6NTk6MDQuMDAwMDAwMDAwICswMTAwCkBAIC01NSw2ICs1 NSw3IEBACiAjZGVmaW5lIG1heCBtYXggKi8KICNpbmNsdWRlIDxsaW51eC9sdm0uaD4KICNlbmRp ZiAvKiBMVk0gKi8KKyNpbmNsdWRlIDxsaW51eC9kbS1pb2N0bC5oPgogCiAjaW5jbHVkZSA8c2Nz aS9zY3NpLmg+CiAvKiBVZ2x5IGhhY2suICovCkBAIC0zNDIzLDYgKzM0MjQsMjIgQEAKIENPTVBB VElCTEVfSU9DVEwoTFZfQk1BUCkKIENPTVBBVElCTEVfSU9DVEwoTFZfU05BUFNIT1RfVVNFX1JB VEUpCiAjZW5kaWYgLyogTFZNICovCisvKiBEZXZpY2UtTWFwcGVyICovCisjaWYgZGVmaW5lZChD T05GSUdfQkxLX0RFVl9ETSkgfHwgZGVmaW5lZChDT05GSUdfQkxLX0RFVl9ETV9NT0RVTEUpCitD T01QQVRJQkxFX0lPQ1RMKERNX1ZFUlNJT04pCitDT01QQVRJQkxFX0lPQ1RMKERNX1JFTU9WRV9B TEwpCitDT01QQVRJQkxFX0lPQ1RMKERNX0RFVl9DUkVBVEUpCitDT01QQVRJQkxFX0lPQ1RMKERN X0RFVl9SRU1PVkUpCitDT01QQVRJQkxFX0lPQ1RMKERNX1RBQkxFX0xPQUQpCitDT01QQVRJQkxF X0lPQ1RMKERNX0RFVl9TVVNQRU5EKQorQ09NUEFUSUJMRV9JT0NUTChETV9ERVZfUkVOQU1FKQor Q09NUEFUSUJMRV9JT0NUTChETV9UQUJMRV9ERVBTKQorQ09NUEFUSUJMRV9JT0NUTChETV9ERVZf U1RBVFVTKQorQ09NUEFUSUJMRV9JT0NUTChETV9UQUJMRV9TVEFUVVMpCitDT01QQVRJQkxFX0lP Q1RMKERNX0RFVl9XQUlUKQorQ09NUEFUSUJMRV9JT0NUTChETV9MSVNUX0RFVklDRVMpCitDT01Q QVRJQkxFX0lPQ1RMKERNX1RBQkxFX0NMRUFSKQorI2VuZGlmIC8qIENPTkZJR19CTEtfREVWX0RN ICovCiAjaWYgZGVmaW5lZChDT05GSUdfRFJNKSB8fCBkZWZpbmVkKENPTkZJR19EUk1fTU9EVUxF KQogQ09NUEFUSUJMRV9JT0NUTChEUk1fSU9DVExfR0VUX01BR0lDKQogQ09NUEFUSUJMRV9JT0NU TChEUk1fSU9DVExfSVJRX0JVU0lEKQotLS0gZGlmZi9hcmNoL3BwYzY0L2tlcm5lbC9pb2N0bDMy LmMJMjAwMy0wOC0yNiAxMzo1MDowNC4wMDAwMDAwMDAgKzAxMDAKKysrIHNvdXJjZS9hcmNoL3Bw YzY0L2tlcm5lbC9pb2N0bDMyLmMJMjAwMy0wOC0yNiAxMzo1OTowNC4wMDAwMDAwMDAgKzAxMDAK QEAgLTY2LDYgKzY2LDcgQEAKICNpZiBkZWZpbmVkKENPTkZJR19CTEtfREVWX0xWTSkgfHwgZGVm aW5lZChDT05GSUdfQkxLX0RFVl9MVk1fTU9EVUxFKQogI2luY2x1ZGUgPGxpbnV4L2x2bS5oPgog I2VuZGlmIC8qIExWTSAqLworI2luY2x1ZGUgPGxpbnV4L2RtLWlvY3RsLmg+CiAKICNpbmNsdWRl IDxzY3NpL3Njc2kuaD4KIC8qIFVnbHkgaGFjay4gKi8KQEAgLTQ0MzUsNiArNDQzNiwyMiBAQAog Q09NUEFUSUJMRV9JT0NUTChOQkRfUFJJTlRfREVCVUcpLAogQ09NUEFUSUJMRV9JT0NUTChOQkRf U0VUX1NJWkVfQkxPQ0tTKSwKIENPTVBBVElCTEVfSU9DVEwoTkJEX0RJU0NPTk5FQ1QpLAorLyog ZGV2aWNlLW1hcHBlciAqLworI2lmIGRlZmluZWQoQ09ORklHX0JMS19ERVZfRE0pIHx8IGRlZmlu ZWQoQ09ORklHX0JMS19ERVZfRE1fTU9EVUxFKQorQ09NUEFUSUJMRV9JT0NUTChETV9WRVJTSU9O KSwKK0NPTVBBVElCTEVfSU9DVEwoRE1fUkVNT1ZFX0FMTCksCitDT01QQVRJQkxFX0lPQ1RMKERN X0RFVl9DUkVBVEUpLAorQ09NUEFUSUJMRV9JT0NUTChETV9ERVZfUkVNT1ZFKSwKK0NPTVBBVElC TEVfSU9DVEwoRE1fVEFCTEVfTE9BRCksCitDT01QQVRJQkxFX0lPQ1RMKERNX0RFVl9TVVNQRU5E KSwKK0NPTVBBVElCTEVfSU9DVEwoRE1fREVWX1JFTkFNRSksCitDT01QQVRJQkxFX0lPQ1RMKERN X1RBQkxFX0RFUFMpLAorQ09NUEFUSUJMRV9JT0NUTChETV9ERVZfU1RBVFVTKSwKK0NPTVBBVElC TEVfSU9DVEwoRE1fVEFCTEVfU1RBVFVTKSwKK0NPTVBBVElCTEVfSU9DVEwoRE1fREVWX1dBSVQp LAorQ09NUEFUSUJMRV9JT0NUTChETV9MSVNUX0RFVklDRVMpLAorQ09NUEFUSUJMRV9JT0NUTChE TV9UQUJMRV9DTEVBUiksCisjZW5kaWYgLyogQ09ORklHX0JMS19ERVZfRE0gKi8KIC8qIFJlbW92 ZSAqUFJJVkFURSBpbiAyLjUgKi8KIENPTVBBVElCTEVfSU9DVEwoU0lPQ0RFVlBSSVZBVEUpLAog Q09NUEFUSUJMRV9JT0NUTChTSU9DREVWUFJJVkFURSsxKSwKLS0tIGRpZmYvYXJjaC9zMzkweC9r ZXJuZWwvaW9jdGwzMi5jCTIwMDMtMDgtMjYgMTM6NTA6MDQuMDAwMDAwMDAwICswMTAwCisrKyBz b3VyY2UvYXJjaC9zMzkweC9rZXJuZWwvaW9jdGwzMi5jCTIwMDMtMDgtMjYgMTQ6MTM6MTIuMDAw MDAwMDAwICswMTAwCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSA8bGludXgvYmxrLmg+CiAj aW5jbHVkZSA8bGludXgvZWxldmF0b3IuaD4KICNpbmNsdWRlIDxsaW51eC9yYXcuaD4KKyNpbmNs dWRlIDxsaW51eC9kbS1pb2N0bC5oPgogI2luY2x1ZGUgPGFzbS90eXBlcy5oPgogI2luY2x1ZGUg PGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL2Rhc2QuaD4KQEAgLTYyNyw2ICs2MjgsMjAg QEAKIAogCUlPQ1RMMzJfREVGQVVMVChTSU9DR1NUQU1QKSwKIAorCUlPQ1RMMzJfREVGQVVMVChE TV9WRVJTSU9OKSwKKwlJT0NUTDMyX0RFRkFVTFQoRE1fUkVNT1ZFX0FMTCksCisJSU9DVEwzMl9E RUZBVUxUKERNX0RFVl9DUkVBVEUpLAorCUlPQ1RMMzJfREVGQVVMVChETV9ERVZfUkVNT1ZFKSwK KwlJT0NUTDMyX0RFRkFVTFQoRE1fVEFCTEVfTE9BRCksCisJSU9DVEwzMl9ERUZBVUxUKERNX0RF Vl9TVVNQRU5EKSwKKwlJT0NUTDMyX0RFRkFVTFQoRE1fREVWX1JFTkFNRSksCisJSU9DVEwzMl9E RUZBVUxUKERNX1RBQkxFX0RFUFMpLAorCUlPQ1RMMzJfREVGQVVMVChETV9ERVZfU1RBVFVTKSwK KwlJT0NUTDMyX0RFRkFVTFQoRE1fVEFCTEVfU1RBVFVTKSwKKwlJT0NUTDMyX0RFRkFVTFQoRE1f REVWX1dBSVQpLAorCUlPQ1RMMzJfREVGQVVMVChETV9MSVNUX0RFVklDRVMpLAorCUlPQ1RMMzJf REVGQVVMVChETV9UQUJMRV9DTEVBUiksCisKIAlJT0NUTDMyX0RFRkFVTFQoTE9PUF9TRVRfRkQp LAogCUlPQ1RMMzJfREVGQVVMVChMT09QX0NMUl9GRCksCiAKLS0tIGRpZmYvYXJjaC9zcGFyYzY0 L2tlcm5lbC9pb2N0bDMyLmMJMjAwMy0wOC0yNiAxMzo1MDowNS4wMDAwMDAwMDAgKzAxMDAKKysr IHNvdXJjZS9hcmNoL3NwYXJjNjQva2VybmVsL2lvY3RsMzIuYwkyMDAzLTA4LTI2IDEzOjU5OjA0 LjAwMDAwMDAwMCArMDEwMApAQCAtNTYsNiArNTYsNyBAQAogI2lmIGRlZmluZWQoQ09ORklHX0JM S19ERVZfTFZNKSB8fCBkZWZpbmVkKENPTkZJR19CTEtfREVWX0xWTV9NT0RVTEUpCiAjaW5jbHVk ZSA8bGludXgvbHZtLmg+CiAjZW5kaWYgLyogTFZNICovCisjaW5jbHVkZSA8bGludXgvZG0taW9j dGwuaD4KIAogI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgogLyogVWdseSBoYWNrLiAqLwpAQCAtNTA4 Niw2ICs1MDg3LDIyIEBACiBDT01QQVRJQkxFX0lPQ1RMKE5CRF9QUklOVF9ERUJVRykKIENPTVBB VElCTEVfSU9DVEwoTkJEX1NFVF9TSVpFX0JMT0NLUykKIENPTVBBVElCTEVfSU9DVEwoTkJEX0RJ U0NPTk5FQ1QpCisvKiBkZXZpY2UtbWFwcGVyICovCisjaWYgZGVmaW5lZChDT05GSUdfQkxLX0RF Vl9ETSkgfHwgZGVmaW5lZChDT05GSUdfQkxLX0RFVl9ETV9NT0RVTEUpCitDT01QQVRJQkxFX0lP Q1RMKERNX1ZFUlNJT04pCitDT01QQVRJQkxFX0lPQ1RMKERNX1JFTU9WRV9BTEwpCitDT01QQVRJ QkxFX0lPQ1RMKERNX0RFVl9DUkVBVEUpCitDT01QQVRJQkxFX0lPQ1RMKERNX0RFVl9SRU1PVkUp CitDT01QQVRJQkxFX0lPQ1RMKERNX1RBQkxFX0xPQUQpCitDT01QQVRJQkxFX0lPQ1RMKERNX0RF Vl9TVVNQRU5EKQorQ09NUEFUSUJMRV9JT0NUTChETV9ERVZfUkVOQU1FKQorQ09NUEFUSUJMRV9J T0NUTChETV9UQUJMRV9ERVBTKQorQ09NUEFUSUJMRV9JT0NUTChETV9ERVZfU1RBVFVTKQorQ09N UEFUSUJMRV9JT0NUTChETV9UQUJMRV9TVEFUVVMpCitDT01QQVRJQkxFX0lPQ1RMKERNX0RFVl9X QUlUKQorQ09NUEFUSUJMRV9JT0NUTChETV9MSVNUX0RFVklDRVMpCitDT01QQVRJQkxFX0lPQ1RM KERNX1RBQkxFX0NMRUFSKQorI2VuZGlmIC8qIENPTkZJR19CTEtfREVWX0RNICovCiAvKiBMaW51 eC0xMzk0ICovCiAjaWYgZGVmaW5lZChDT05GSUdfSUVFRTEzOTQpIHx8IGRlZmluZWQoQ09ORklH X0lFRUUxMzk0X01PRFVMRSkKIENPTVBBVElCTEVfSU9DVEwoQU1EVFBfSU9DX0NIQU5ORUwpCi0t LSBkaWZmL2FyY2gveDg2XzY0L2lhMzIvaWEzMl9pb2N0bC5jCTIwMDMtMDgtMjYgMTM6NTA6MDUu MDAwMDAwMDAwICswMTAwCisrKyBzb3VyY2UvYXJjaC94ODZfNjQvaWEzMi9pYTMyX2lvY3RsLmMJ MjAwMy0wOC0yNiAxMzo1OTowNC4wMDAwMDAwMDAgKzAxMDAKQEAgLTY3LDYgKzY3LDcgQEAKICNk ZWZpbmUgbWF4IG1heAogI2luY2x1ZGUgPGxpbnV4L2x2bS5oPgogI2VuZGlmIC8qIExWTSAqLwor I2luY2x1ZGUgPGxpbnV4L2RtLWlvY3RsLmg+CiAKICNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KIC8q IFVnbHkgaGFjay4gKi8KQEAgLTQwNDcsNiArNDA0OCwyMiBAQAogQ09NUEFUSUJMRV9JT0NUTChM Vl9CTUFQKQogQ09NUEFUSUJMRV9JT0NUTChMVl9TTkFQU0hPVF9VU0VfUkFURSkKICNlbmRpZiAv KiBMVk0gKi8KKy8qIERldmljZS1NYXBwZXIgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19CTEtfREVW X0RNKSB8fCBkZWZpbmVkKENPTkZJR19CTEtfREVWX0RNX01PRFVMRSkKK0NPTVBBVElCTEVfSU9D VEwoRE1fVkVSU0lPTikKK0NPTVBBVElCTEVfSU9DVEwoRE1fUkVNT1ZFX0FMTCkKK0NPTVBBVElC TEVfSU9DVEwoRE1fREVWX0NSRUFURSkKK0NPTVBBVElCTEVfSU9DVEwoRE1fREVWX1JFTU9WRSkK K0NPTVBBVElCTEVfSU9DVEwoRE1fVEFCTEVfTE9BRCkKK0NPTVBBVElCTEVfSU9DVEwoRE1fREVW X1NVU1BFTkQpCitDT01QQVRJQkxFX0lPQ1RMKERNX0RFVl9SRU5BTUUpCitDT01QQVRJQkxFX0lP Q1RMKERNX1RBQkxFX0RFUFMpCitDT01QQVRJQkxFX0lPQ1RMKERNX0RFVl9TVEFUVVMpCitDT01Q QVRJQkxFX0lPQ1RMKERNX1RBQkxFX1NUQVRVUykKK0NPTVBBVElCTEVfSU9DVEwoRE1fREVWX1dB SVQpCitDT01QQVRJQkxFX0lPQ1RMKERNX0xJU1RfREVWSUNFUykKK0NPTVBBVElCTEVfSU9DVEwo RE1fVEFCTEVfQ0xFQVIpCisjZW5kaWYgLyogQ09ORklHX0JMS19ERVZfRE0gKi8KICNpZmRlZiBD T05GSUdfQVVUT0ZTX0ZTCiBDT01QQVRJQkxFX0lPQ1RMKEFVVE9GU19JT0NfUkVBRFkpCiBDT01Q QVRJQkxFX0lPQ1RMKEFVVE9GU19JT0NfRkFJTCkKLS0tIGRpZmYvZHJpdmVycy9tZC9Db25maWcu aW4JMjAwMS0wOS0yNiAxNjoxNTowNS4wMDAwMDAwMDAgKzAxMDAKKysrIHNvdXJjZS9kcml2ZXJz L21kL0NvbmZpZy5pbgkyMDAzLTA4LTI2IDEzOjU5OjA0LjAwMDAwMDAwMCArMDEwMApAQCAtMTQs NSArMTQsOSBAQAogZGVwX3RyaXN0YXRlICcgIE11bHRpcGF0aCBJL08gc3VwcG9ydCcgQ09ORklH X01EX01VTFRJUEFUSCAkQ09ORklHX0JMS19ERVZfTUQKIAogZGVwX3RyaXN0YXRlICcgTG9naWNh bCB2b2x1bWUgbWFuYWdlciAoTFZNKSBzdXBwb3J0JyBDT05GSUdfQkxLX0RFVl9MVk0gJENPTkZJ R19NRAoraWYgWyAiJENPTkZJR19FWFBFUklNRU5UQUwiID0gInkiIF07IHRoZW4KKyAgIGRlcF90 cmlzdGF0ZSAnIERldmljZS1tYXBwZXIgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKScgQ09ORklHX0JM S19ERVZfRE0gJENPTkZJR19NRAorICAgZGVwX3RyaXN0YXRlICcgIE1pcnJvciAoUkFJRC0xKSBz dXBwb3J0IChFWFBFUklNRU5UQUwpJyBDT05GSUdfQkxLX0RFVl9ETV9NSVJST1IgJENPTkZJR19C TEtfREVWX0RNCitmaQogCiBlbmRtZW51Ci0tLSBkaWZmL2RyaXZlcnMvbWQvTWFrZWZpbGUJMjAw Mi0wMS0xNyAxMDowNzo1Mi4wMDAwMDAwMDAgKzAwMDAKKysrIHNvdXJjZS9kcml2ZXJzL21kL01h a2VmaWxlCTIwMDMtMDgtMjYgMTM6NTk6MDQuMDAwMDAwMDAwICswMTAwCkBAIC00LDI0ICs0LDQx IEBACiAKIE9fVEFSR0VUCTo9IG1kZGV2Lm8KIAotZXhwb3J0LW9ianMJOj0gbWQubyB4b3Iubwot bGlzdC1tdWx0aQk6PSBsdm0tbW9kLm8KK2V4cG9ydC1vYmpzCTo9IG1kLm8geG9yLm8gZG0tdGFi bGUubyBkbS10YXJnZXQubyBrY29weWQubyBkbS1kYWVtb24ubyBcCisJCSAgIGRtLWxvZy5vIGRt LWlvLm8gZG0ubworCitsaXN0LW11bHRpCTo9IGx2bS1tb2QubyBkbS1tb2QubyBkbS1taXJyb3It bW9kLm8KIGx2bS1tb2Qtb2Jqcwk6PSBsdm0ubyBsdm0tc25hcC5vIGx2bS1mcy5vCitkbS1tb2Qt b2Jqcwk6PSBkbS5vIGRtLXRhYmxlLm8gZG0tdGFyZ2V0Lm8gZG0taW9jdGwubyBcCisJCSAgIGRt LWxpbmVhci5vIGRtLXN0cmlwZS5vIGRtLXNuYXBzaG90Lm8gZG0tZXhjZXB0aW9uLXN0b3JlLm8g XAorCQkgICBrY29weWQubyBkbS1kYWVtb24ubyBkbS1pby5vCitkbS1taXJyb3ItbW9kLW9ianMg Oj0gZG0tcmFpZDEubyBkbS1sb2cubwogCiAjIE5vdGU6IGxpbmsgb3JkZXIgaXMgaW1wb3J0YW50 LiAgQWxsIHJhaWQgcGVyc29uYWxpdGllcwogIyBhbmQgeG9yLm8gbXVzdCBjb21lIGJlZm9yZSBt ZC5vLCBhcyB0aGV5IGVhY2ggaW5pdGlhbGlzZSAKICMgdGhlbXNlbHZlcywgYW5kIG1kLm8gbWF5 IHVzZSB0aGUgcGVyc29uYWxpdGllcyB3aGVuIGl0IAogIyBhdXRvLWluaXRpYWxpc2VkLgogCi1v YmotJChDT05GSUdfTURfTElORUFSKQkJKz0gbGluZWFyLm8KLW9iai0kKENPTkZJR19NRF9SQUlE MCkJCSs9IHJhaWQwLm8KLW9iai0kKENPTkZJR19NRF9SQUlEMSkJCSs9IHJhaWQxLm8KLW9iai0k KENPTkZJR19NRF9SQUlENSkJCSs9IHJhaWQ1Lm8geG9yLm8KLW9iai0kKENPTkZJR19NRF9NVUxU SVBBVEgpCSs9IG11bHRpcGF0aC5vCi1vYmotJChDT05GSUdfQkxLX0RFVl9NRCkJKz0gbWQubwot b2JqLSQoQ09ORklHX0JMS19ERVZfTFZNKQkrPSBsdm0tbW9kLm8KK29iai0kKENPTkZJR19NRF9M SU5FQVIpCQkJKz0gbGluZWFyLm8KK29iai0kKENPTkZJR19NRF9SQUlEMCkJCQkrPSByYWlkMC5v CitvYmotJChDT05GSUdfTURfUkFJRDEpCQkJKz0gcmFpZDEubworb2JqLSQoQ09ORklHX01EX1JB SUQ1KQkJCSs9IHJhaWQ1Lm8geG9yLm8KK29iai0kKENPTkZJR19NRF9NVUxUSVBBVEgpCQkrPSBt dWx0aXBhdGgubworb2JqLSQoQ09ORklHX0JMS19ERVZfTUQpCQkrPSBtZC5vCisKK29iai0kKENP TkZJR19CTEtfREVWX0xWTSkJCSs9IGx2bS1tb2QubworCitvYmotJChDT05GSUdfQkxLX0RFVl9E TSkJCSs9IGRtLW1vZC5vCitvYmotJChDT05GSUdfQkxLX0RFVl9ETV9NSVJST1IpCQkrPSBkbS1t aXJyb3IubwogCiBpbmNsdWRlICQoVE9QRElSKS9SdWxlcy5tYWtlCiAKIGx2bS1tb2QubzogJChs dm0tbW9kLW9ianMpCiAJJChMRCkgLXIgLW8gJEAgJChsdm0tbW9kLW9ianMpCisKK2RtLW1vZC5v OiAkKGRtLW1vZC1vYmpzKQorCSQoTEQpIC1yIC1vICRAICQoZG0tbW9kLW9ianMpCisKK2RtLW1p cnJvci5vOiAkKGRtLW1pcnJvci1tb2Qtb2JqcykKKwkkKExEKSAtciAtbyAkQCAkKGRtLW1pcnJv ci1tb2Qtb2JqcykKKwotLS0gZGlmZi9mcy9idWZmZXIuYwkyMDAzLTA4LTI2IDEzOjUwOjEyLjAw MDAwMDAwMCArMDEwMAorKysgc291cmNlL2ZzL2J1ZmZlci5jCTIwMDMtMDgtMjYgMTM6NTk6MDQu MDAwMDAwMDAwICswMTAwCkBAIC03NTYsNiArNzU2LDcgQEAKIAliaC0+Yl9saXN0ID0gQlVGX0NM RUFOOwogCWJoLT5iX2VuZF9pbyA9IGhhbmRsZXI7CiAJYmgtPmJfcHJpdmF0ZSA9IHByaXZhdGU7 CisJYmgtPmJfam91cm5hbF9oZWFkID0gTlVMTDsKIH0KIAogc3RhdGljIHZvaWQgZW5kX2J1ZmZl cl9pb19hc3luYyhzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCwgaW50IHVwdG9kYXRlKQotLS0gZGlm Zi9mcy9qYmQvam91cm5hbC5jCTIwMDMtMDgtMjYgMTM6NTA6MTIuMDAwMDAwMDAwICswMTAwCisr KyBzb3VyY2UvZnMvamJkL2pvdXJuYWwuYwkyMDAzLTA4LTI2IDEzOjU5OjA0LjAwMDAwMDAwMCAr MDEwMApAQCAtMTgwMiw5ICsxODAyLDkgQEAKIAogCQlpZiAoYnVmZmVyX2piZChiaCkpIHsKIAkJ CS8qIFNvbWVvbmUgZGlkIGl0IGZvciB1cyEgKi8KLQkJCUpfQVNTRVJUX0JIKGJoLCBiaC0+Yl9w cml2YXRlICE9IE5VTEwpOworIAkJCUpfQVNTRVJUX0JIKGJoLCBiaC0+Yl9qb3VybmFsX2hlYWQg IT0gTlVMTCk7CiAJCQlqb3VybmFsX2ZyZWVfam91cm5hbF9oZWFkKGpoKTsKLQkJCWpoID0gYmgt PmJfcHJpdmF0ZTsKKyAJCQlqaCA9IGJoLT5iX2pvdXJuYWxfaGVhZDsKIAkJfSBlbHNlIHsKIAkJ CS8qCiAJCQkgKiBXZSBhY3R1YWxseSBkb24ndCBuZWVkIGpoX3NwbGljZV9sb2NrIHdoZW4KQEAg LTE4MTIsNyArMTgxMiw3IEBACiAJCQkgKi8KIAkJCXNwaW5fbG9jaygmamhfc3BsaWNlX2xvY2sp OwogCQkJc2V0X2JpdChCSF9KQkQsICZiaC0+Yl9zdGF0ZSk7Ci0JCQliaC0+Yl9wcml2YXRlID0g amg7CisJCQliaC0+Yl9qb3VybmFsX2hlYWQgPSBqaDsKIAkJCWpoLT5iX2JoID0gYmg7CiAJCQlh dG9taWNfaW5jKCZiaC0+Yl9jb3VudCk7CiAJCQlzcGluX3VubG9jaygmamhfc3BsaWNlX2xvY2sp OwpAQCAtMTgyMSw3ICsxODIxLDcgQEAKIAl9CiAJamgtPmJfamNvdW50Kys7CiAJc3Bpbl91bmxv Y2soJmpvdXJuYWxfZGF0YWxpc3RfbG9jayk7Ci0JcmV0dXJuIGJoLT5iX3ByaXZhdGU7CisJcmV0 dXJuIGJoLT5iX2pvdXJuYWxfaGVhZDsKIH0KIAogLyoKQEAgLTE4NTQsNyArMTg1NCw3IEBACiAJ CQlKX0FTU0VSVF9CSChiaCwgamgyYmgoamgpID09IGJoKTsKIAkJCUJVRkZFUl9UUkFDRShiaCwg InJlbW92ZSBqb3VybmFsX2hlYWQiKTsKIAkJCXNwaW5fbG9jaygmamhfc3BsaWNlX2xvY2spOwot CQkJYmgtPmJfcHJpdmF0ZSA9IE5VTEw7CisJCQliaC0+Yl9qb3VybmFsX2hlYWQgPSBOVUxMOwog CQkJamgtPmJfYmggPSBOVUxMOwkvKiBkZWJ1ZywgcmVhbGx5ICovCiAJCQljbGVhcl9iaXQoQkhf SkJELCAmYmgtPmJfc3RhdGUpOwogCQkJX19icmVsc2UoYmgpOwotLS0gZGlmZi9pbmNsdWRlL2xp bnV4L2ZzLmgJMjAwMy0wOC0yNiAxMzo1MDoxNC4wMDAwMDAwMDAgKzAxMDAKKysrIHNvdXJjZS9p bmNsdWRlL2xpbnV4L2ZzLmgJMjAwMy0wOC0yNiAxNDoyMDoyNy4wMDAwMDAwMDAgKzAxMDAKQEAg LTI2NSw3ICsyNjUsNyBAQAogCXN0cnVjdCBwYWdlICpiX3BhZ2U7CQkvKiB0aGUgcGFnZSB0aGlz IGJoIGlzIG1hcHBlZCB0byAqLwogCXZvaWQgKCpiX2VuZF9pbykoc3RydWN0IGJ1ZmZlcl9oZWFk ICpiaCwgaW50IHVwdG9kYXRlKTsgLyogSS9PIGNvbXBsZXRpb24gKi8KICAJdm9pZCAqYl9wcml2 YXRlOwkJLyogcmVzZXJ2ZWQgZm9yIGJfZW5kX2lvICovCi0KKyAJdm9pZCAqYl9qb3VybmFsX2hl YWQ7CQkvKiBleHQzIGpvdXJuYWxfaGVhZHMgKi8KIAl1bnNpZ25lZCBsb25nIGJfcnNlY3RvcjsJ LyogUmVhbCBidWZmZXIgbG9jYXRpb24gb24gZGlzayAqLwogCXdhaXRfcXVldWVfaGVhZF90IGJf d2FpdDsKIAotLS0gZGlmZi9pbmNsdWRlL2xpbnV4L2piZC5oCTIwMDMtMDYtMTYgMDk6NTY6MTIu MDAwMDAwMDAwICswMTAwCisrKyBzb3VyY2UvaW5jbHVkZS9saW51eC9qYmQuaAkyMDAzLTA4LTI2 IDEzOjU5OjA0LjAwMDAwMDAwMCArMDEwMApAQCAtMzExLDcgKzMxMSw3IEBACiAKIHN0YXRpYyBp bmxpbmUgc3RydWN0IGpvdXJuYWxfaGVhZCAqYmgyamgoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkK IHsKLQlyZXR1cm4gYmgtPmJfcHJpdmF0ZTsKKwlyZXR1cm4gYmgtPmJfam91cm5hbF9oZWFkOwog fQogCiAjZGVmaW5lIEhBVkVfSk9VUk5BTF9DQUxMQkFDS19TVEFUVVMKLS0tIGRpZmYvaW5jbHVk ZS9saW51eC92bWFsbG9jLmgJMjAwMy0wOC0yNiAxMzo1MDoxNC4wMDAwMDAwMDAgKzAxMDAKKysr IHNvdXJjZS9pbmNsdWRlL2xpbnV4L3ZtYWxsb2MuaAkyMDAzLTA4LTI2IDE0OjIwOjI3LjAwMDAw MDAwMCArMDEwMApAQCAtMjksNiArMjksNyBAQAogZXh0ZXJuIHZvaWQgdm1mcmVlX2FyZWFfcGFn ZXModW5zaWduZWQgbG9uZyBhZGRyZXNzLCB1bnNpZ25lZCBsb25nIHNpemUpOwogZXh0ZXJuIGlu dCB2bWFsbG9jX2FyZWFfcGFnZXModW5zaWduZWQgbG9uZyBhZGRyZXNzLCB1bnNpZ25lZCBsb25n IHNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZ2ZwX21hc2ssIHBncHJv dF90IHByb3QpOworZXh0ZXJuIHZvaWQgKnZjYWxsb2ModW5zaWduZWQgbG9uZyBubWVtYiwgdW5z aWduZWQgbG9uZyBlbGVtX3NpemUpOwogCiAvKgogICoJQWxsb2NhdGUgYW55IHBhZ2VzCi0tLSBk aWZmL2tlcm5lbC9rc3ltcy5jCTIwMDMtMDgtMjYgMTM6NTA6MTQuMDAwMDAwMDAwICswMTAwCisr KyBzb3VyY2Uva2VybmVsL2tzeW1zLmMJMjAwMy0wOC0yNiAxMzo1OTowNC4wMDAwMDAwMDAgKzAx MDAKQEAgLTExNCw2ICsxMTQsNyBAQAogRVhQT1JUX1NZTUJPTChfX3ZtYWxsb2MpOwogRVhQT1JU X1NZTUJPTCh2bWFwKTsKIEVYUE9SVF9TWU1CT0wodm1hbGxvY190b19wYWdlKTsKK0VYUE9SVF9T WU1CT0wodmNhbGxvYyk7CiBFWFBPUlRfU1lNQk9MKG1lbV9tYXApOwogRVhQT1JUX1NZTUJPTChy ZW1hcF9wYWdlX3JhbmdlKTsKIEVYUE9SVF9TWU1CT0wobWF4X21hcG5yKTsKLS0tIGRpZmYvbW0v TWFrZWZpbGUJMjAwMi0wOC0wNSAxNDo1Nzo0NC4wMDAwMDAwMDAgKzAxMDAKKysrIHNvdXJjZS9t bS9NYWtlZmlsZQkyMDAzLTA4LTI2IDEzOjU5OjA0LjAwMDAwMDAwMCArMDEwMApAQCAtOSwxMiAr OSwxMiBAQAogCiBPX1RBUkdFVCA6PSBtbS5vCiAKLWV4cG9ydC1vYmpzIDo9IHNobWVtLm8gZmls ZW1hcC5vIG1lbW9yeS5vIHBhZ2VfYWxsb2MubworZXhwb3J0LW9ianMgOj0gc2htZW0ubyBmaWxl bWFwLm8gbWVtb3J5Lm8gcGFnZV9hbGxvYy5vIG1lbXBvb2wubwogCiBvYmoteQkgOj0gbWVtb3J5 Lm8gbW1hcC5vIGZpbGVtYXAubyBtcHJvdGVjdC5vIG1sb2NrLm8gbXJlbWFwLm8gXAogCSAgICB2 bWFsbG9jLm8gc2xhYi5vIGJvb3RtZW0ubyBzd2FwLm8gdm1zY2FuLm8gcGFnZV9pby5vIFwKIAkg ICAgcGFnZV9hbGxvYy5vIHN3YXBfc3RhdGUubyBzd2FwZmlsZS5vIG51bWEubyBvb21fa2lsbC5v IFwKLQkgICAgc2htZW0ubworCSAgICBzaG1lbS5vIG1lbXBvb2wubwogCiBvYmotJChDT05GSUdf SElHSE1FTSkgKz0gaGlnaG1lbS5vCiAKLS0tIGRpZmYvbW0vZmlsZW1hcC5jCTIwMDMtMDgtMjYg MTM6NTA6MTQuMDAwMDAwMDAwICswMTAwCisrKyBzb3VyY2UvbW0vZmlsZW1hcC5jCTIwMDMtMDgt MjYgMTQ6MDM6NDEuMDAwMDAwMDAwICswMTAwCkBAIC0xNzQyLDcgKzE3NDIsOCBAQAogCQl9CiAJ CXVwKCZpbm9kZS0+aV9zZW0pOwogCQl1cF9yZWFkKCZpbm9kZS0+aV9hbGxvY19zZW0pOwotCQlV UERBVEVfQVRJTUUoZmlscC0+Zl9kZW50cnktPmRfaW5vZGUpOworCQlpZiAoIVNfSVNCTEsoaW5v ZGUtPmlfbW9kZSkpCisJCQlVUERBVEVfQVRJTUUoZmlscC0+Zl9kZW50cnktPmRfaW5vZGUpOwog CQlnb3RvIG91dDsKIAl9CiB9CkBAIC0zMTIwLDggKzMxMjEsMTIgQEAKIAkJZ290byBvdXQ7CiAK IAlyZW1vdmVfc3VpZChpbm9kZSk7Ci0JaW5vZGUtPmlfY3RpbWUgPSBpbm9kZS0+aV9tdGltZSA9 IENVUlJFTlRfVElNRTsKLQltYXJrX2lub2RlX2RpcnR5X3N5bmMoaW5vZGUpOworCisJLyogRG9u J3QgdXBkYXRlIHRpbWVzIGZvciBibG9jayBkZXZpY2VzIHVzaW5nIE9fRElSRUNUICovCisJaWYg KCEoZmlsZS0+Zl9mbGFncyAmIE9fRElSRUNUKSB8fCAhU19JU0JMSyhpbm9kZS0+aV9tb2RlKSkg eworCQlpbm9kZS0+aV9jdGltZSA9IGlub2RlLT5pX210aW1lID0gQ1VSUkVOVF9USU1FOworCQlt YXJrX2lub2RlX2RpcnR5X3N5bmMoaW5vZGUpOworCX0KIAogCWRvIHsKIAkJdW5zaWduZWQgbG9u ZyBpbmRleCwgb2Zmc2V0OwotLS0gZGlmZi9tbS92bWFsbG9jLmMJMjAwMy0wOC0yNiAxMzo1MDox NC4wMDAwMDAwMDAgKzAxMDAKKysrIHNvdXJjZS9tbS92bWFsbG9jLmMJMjAwMy0wOC0yNiAxMzo1 OTowNC4wMDAwMDAwMDAgKzAxMDAKQEAgLTM3NCwzICszNzQsMjIgQEAKIAlyZWFkX3VubG9jaygm dm1saXN0X2xvY2spOwogCXJldHVybiBidWYgLSBidWZfc3RhcnQ7CiB9CisKK3ZvaWQgKnZjYWxs b2ModW5zaWduZWQgbG9uZyBubWVtYiwgdW5zaWduZWQgbG9uZyBlbGVtX3NpemUpCit7CisJdW5z aWduZWQgbG9uZyBzaXplOworCXZvaWQgKmFkZHI7CisKKwkvKgorCSAqIENoZWNrIHRoYXQgd2Un cmUgbm90IGdvaW5nIHRvIG92ZXJmbG93LgorCSAqLworCWlmIChubWVtYiA+IChVTE9OR19NQVgg LyBlbGVtX3NpemUpKQorCQlyZXR1cm4gTlVMTDsKKworCXNpemUgPSBubWVtYiAqIGVsZW1fc2l6 ZTsKKwlhZGRyID0gdm1hbGxvYyhzaXplKTsKKwlpZiAoYWRkcikKKwkJbWVtc2V0KGFkZHIsIDAs IHNpemUpOworCisJcmV0dXJuIGFkZHI7Cit9Ci0tLSBkaWZmL2FyY2gvbWlwczY0L2tlcm5lbC9p b2N0bDMyLmMucmVqCTE5NzAtMDEtMDEgMDE6MDA6MDAuMDAwMDAwMDAwICswMTAwCisrKyBzb3Vy Y2UvYXJjaC9taXBzNjQva2VybmVsL2lvY3RsMzIuYy5yZWoJMjAwMy0wOC0yNiAxMzo1OTowNC4w MDAwMDAwMDAgKzAxMDAKQEAgLTAsMCArMSwxNiBAQAorKioqKioqKioqKioqKioqCisqKiogMzMs MzggKioqKgorICAjaW5jbHVkZSA8bGludXgvYXV0b19mcy5oPgorICAjaW5jbHVkZSA8bGludXgv ZXh0Ml9mcy5oPgorICAjaW5jbHVkZSA8bGludXgvcmFpZC9tZF91Lmg+CisgIAorICAjaW5jbHVk ZSA8c2NzaS9zY3NpLmg+CisgICN1bmRlZiBfX0tFUk5FTF9fCQkvKiBUaGlzIGZpbGUgd2FzIGJv cm4gdG8gYmUgdWdseSAuLi4gICovCistLS0gMzMsMzkgLS0tLQorICAjaW5jbHVkZSA8bGludXgv YXV0b19mcy5oPgorICAjaW5jbHVkZSA8bGludXgvZXh0Ml9mcy5oPgorICAjaW5jbHVkZSA8bGlu dXgvcmFpZC9tZF91Lmg+CisrICNpbmNsdWRlIDxsaW51eC9kbS1pb2N0bC5oPgorICAKKyAgI2lu Y2x1ZGUgPHNjc2kvc2NzaS5oPgorICAjdW5kZWYgX19LRVJORUxfXwkJLyogVGhpcyBmaWxlIHdh cyBib3JuIHRvIGJlIHVnbHkgLi4uICAqLwotLS0gZGlmZi9hcmNoL3MzOTB4L2tlcm5lbC9pb2N0 bDMyLmMucmVqCTE5NzAtMDEtMDEgMDE6MDA6MDAuMDAwMDAwMDAwICswMTAwCisrKyBzb3VyY2Uv YXJjaC9zMzkweC9rZXJuZWwvaW9jdGwzMi5jLnJlagkyMDAzLTA4LTI2IDEzOjU5OjA0LjAwMDAw MDAwMCArMDEwMApAQCAtMCwwICsxLDQ1IEBACisqKioqKioqKioqKioqKioKKyoqKiAyNSwzMCAq KioqCisgICNpbmNsdWRlIDxsaW51eC9leHQyX2ZzLmg+CisgICNpbmNsdWRlIDxsaW51eC9oZHJl Zy5oPgorICAjaW5jbHVkZSA8bGludXgvaWZfYm9uZGluZy5oPgorICAjaW5jbHVkZSA8YXNtL3R5 cGVzLmg+CisgICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorICAjaW5jbHVkZSA8YXNtL2Rhc2Qu aD4KKy0tLSAyNSwzMSAtLS0tCisgICNpbmNsdWRlIDxsaW51eC9leHQyX2ZzLmg+CisgICNpbmNs dWRlIDxsaW51eC9oZHJlZy5oPgorICAjaW5jbHVkZSA8bGludXgvaWZfYm9uZGluZy5oPgorKyAj aW5jbHVkZSA8bGludXgvZG0taW9jdGwuaD4KKyAgI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorICAj aW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyAgI2luY2x1ZGUgPGFzbS9kYXNkLmg+CisqKioqKioq KioqKioqKioKKyoqKiA1MDgsNTEzICoqKioKKyAgCisgIAlJT0NUTDMyX0RFRkFVTFQoU0lPQ0dT VEFNUCksCisgIAorICAJSU9DVEwzMl9IQU5ETEVSKFNJT0NHSUZOQU1FLCBkZXZfaWZuYW1lMzIp LAorICAJSU9DVEwzMl9IQU5ETEVSKFNJT0NHSUZDT05GLCBkZXZfaWZjb25mKSwKKyAgCUlPQ1RM MzJfSEFORExFUihTSU9DR0lGRkxBR1MsIGRldl9pZnNpb2MpLAorLS0tIDUwOSw1MjggLS0tLQor ICAKKyAgCUlPQ1RMMzJfREVGQVVMVChTSU9DR1NUQU1QKSwKKyAgCisrIAlJT0NUTDMyX0RFRkFV TFQoRE1fVkVSU0lPTiksCisrIAlJT0NUTDMyX0RFRkFVTFQoRE1fUkVNT1ZFX0FMTCksCisrIAlJ T0NUTDMyX0RFRkFVTFQoRE1fREVWX0NSRUFURSksCisrIAlJT0NUTDMyX0RFRkFVTFQoRE1fREVW X1JFTU9WRSksCisrIAlJT0NUTDMyX0RFRkFVTFQoRE1fVEFCTEVfTE9BRCksCisrIAlJT0NUTDMy X0RFRkFVTFQoRE1fREVWX1NVU1BFTkQpLAorKyAJSU9DVEwzMl9ERUZBVUxUKERNX0RFVl9SRU5B TUUpLAorKyAJSU9DVEwzMl9ERUZBVUxUKERNX1RBQkxFX0RFUFMpLAorKyAJSU9DVEwzMl9ERUZB VUxUKERNX0RFVl9TVEFUVVMpLAorKyAJSU9DVEwzMl9ERUZBVUxUKERNX1RBQkxFX1NUQVRVUyks CisrIAlJT0NUTDMyX0RFRkFVTFQoRE1fREVWX1dBSVQpLAorKyAJSU9DVEwzMl9ERUZBVUxUKERN X0xJU1RfREVWSUNFUyksCisrIAlJT0NUTDMyX0RFRkFVTFQoRE1fVEFCTEVfQ0xFQVIpLAorKyAK KyAgCUlPQ1RMMzJfSEFORExFUihTSU9DR0lGTkFNRSwgZGV2X2lmbmFtZTMyKSwKKyAgCUlPQ1RM MzJfSEFORExFUihTSU9DR0lGQ09ORiwgZGV2X2lmY29uZiksCisgIAlJT0NUTDMyX0hBTkRMRVIo U0lPQ0dJRkZMQUdTLCBkZXZfaWZzaW9jKSwKLS0tIGRpZmYvZHJpdmVycy9tZC9kbS1kYWVtb24u YwkxOTcwLTAxLTAxIDAxOjAwOjAwLjAwMDAwMDAwMCArMDEwMAorKysgc291cmNlL2RyaXZlcnMv bWQvZG0tZGFlbW9uLmMJMjAwMy0wOC0yNiAxMzo1OTowNC4wMDAwMDAwMDAgKzAxMDAKQEAgLTAs MCArMSwxMTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgU2lzdGluYSBTb2Z0d2FyZQor ICoKKyAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgTEdQTC4KKyAqLworCisjaW5j bHVkZSAiZG0uaCIKKyNpbmNsdWRlICJkbS1kYWVtb24uaCIKKworI2luY2x1ZGUgPGxpbnV4L21v ZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisKK3N0YXRpYyBpbnQgZGFlbW9uKHZv aWQgKmFyZykKK3sKKwlzdHJ1Y3QgZG1fZGFlbW9uICpkZCA9IChzdHJ1Y3QgZG1fZGFlbW9uICop IGFyZzsKKwlERUNMQVJFX1dBSVRRVUVVRSh3cSwgY3VycmVudCk7CisKKwlkYWVtb25pemUoKTsK KwlyZXBhcmVudF90b19pbml0KCk7CisKKwkvKiBibG9jayBhbGwgc2lnbmFscyAqLworCXNwaW5f bG9ja19pcnEoJmN1cnJlbnQtPnNpZ21hc2tfbG9jayk7CisJc2lnZmlsbHNldCgmY3VycmVudC0+ YmxvY2tlZCk7CisJZmx1c2hfc2lnbmFscyhjdXJyZW50KTsKKwlzcGluX3VubG9ja19pcnEoJmN1 cnJlbnQtPnNpZ21hc2tfbG9jayk7CisKKwlzdHJjcHkoY3VycmVudC0+Y29tbSwgZGQtPm5hbWUp OworCWF0b21pY19zZXQoJmRkLT5wbGVhc2VfZGllLCAwKTsKKworCWFkZF93YWl0X3F1ZXVlKCZk ZC0+am9iX3F1ZXVlLCAmd3EpOworCisJZG93bigmZGQtPnJ1bl9sb2NrKTsKKwl1cCgmZGQtPnN0 YXJ0X2xvY2spOworCisJLyoKKwkgKiBkZC0+Zm4oKSBjb3VsZCBkbyBhbnl0aGluZywgdmVyeSBs aWtlbHkgaXQgd2lsbAorCSAqIHN1c3BlbmQuICBTbyB3ZSBjYW4ndCBzZXQgdGhlIHN0YXRlIHRv CisJICogVEFTS19JTlRFUlJVUFRJQkxFIGJlZm9yZSBjYWxsaW5nIGl0LiAgSW4gb3JkZXIgdG8K KwkgKiBwcmV2ZW50IGEgcmFjZSB3aXRoIGEgd2FraW5nIHRocmVhZCB3ZSBkbyB0aGlzIGxpdHRs ZQorCSAqIGRhbmNlIHdpdGggdGhlIGRkLT53b2tlbiB2YXJpYWJsZS4KKwkgKi8KKwl3aGlsZSAo MSkgeworCQlkbyB7CisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCisJCQlp ZiAoYXRvbWljX3JlYWQoJmRkLT5wbGVhc2VfZGllKSkKKwkJCQlnb3RvIG91dDsKKworCQkJYXRv bWljX3NldCgmZGQtPndva2VuLCAwKTsKKwkJCWRkLT5mbigpOworCQkJeWllbGQoKTsKKworCQkJ c2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJfSB3aGlsZSAoYXRvbWlj X3JlYWQoJmRkLT53b2tlbikpOworCisJCXNjaGVkdWxlKCk7CisJfQorCisgb3V0OgorCXJlbW92 ZV93YWl0X3F1ZXVlKCZkZC0+am9iX3F1ZXVlLCAmd3EpOworCXVwKCZkZC0+cnVuX2xvY2spOwor CXJldHVybiAwOworfQorCitpbnQgZG1fZGFlbW9uX3N0YXJ0KHN0cnVjdCBkbV9kYWVtb24gKmRk LCBjb25zdCBjaGFyICpuYW1lLCB2b2lkICgqZm4pKHZvaWQpKQoreworCXBpZF90IHBpZCA9IDA7 CisKKwkvKgorCSAqIEluaXRpYWxpc2UgdGhlIGRtX2RhZW1vbi4KKwkgKi8KKwlkZC0+Zm4gPSBm bjsKKwlzdHJuY3B5KGRkLT5uYW1lLCBuYW1lLCBzaXplb2YoZGQtPm5hbWUpIC0gMSk7CisJc2Vt YV9pbml0KCZkZC0+c3RhcnRfbG9jaywgMSk7CisJc2VtYV9pbml0KCZkZC0+cnVuX2xvY2ssIDEp OworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRkLT5qb2JfcXVldWUpOworCisJLyoKKwkgKiBTdGFy dCB0aGUgbmV3IHRocmVhZC4KKwkgKi8KKwlkb3duKCZkZC0+c3RhcnRfbG9jayk7CisJcGlkID0g a2VybmVsX3RocmVhZChkYWVtb24sIGRkLCAwKTsKKwlpZiAocGlkIDw9IDApIHsKKwkJRE1FUlIo IkZhaWxlZCB0byBzdGFydCBrY29weWQgdGhyZWFkIik7CisJCXJldHVybiAtRUFHQUlOOworCX0K KworCS8qCisJICogd2FpdCBmb3IgdGhlIGRhZW1vbiB0byB1cCB0aGlzIG11dGV4LgorCSAqLwor CWRvd24oJmRkLT5zdGFydF9sb2NrKTsKKwl1cCgmZGQtPnN0YXJ0X2xvY2spOworCisJcmV0dXJu IDA7Cit9CisKK3ZvaWQgZG1fZGFlbW9uX3N0b3Aoc3RydWN0IGRtX2RhZW1vbiAqZGQpCit7CisJ YXRvbWljX3NldCgmZGQtPnBsZWFzZV9kaWUsIDEpOworCWRtX2RhZW1vbl93YWtlKGRkKTsKKwlk b3duKCZkZC0+cnVuX2xvY2spOworCXVwKCZkZC0+cnVuX2xvY2spOworfQorCit2b2lkIGRtX2Rh ZW1vbl93YWtlKHN0cnVjdCBkbV9kYWVtb24gKmRkKQoreworCWF0b21pY19zZXQoJmRkLT53b2tl biwgMSk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZkZC0+am9iX3F1ZXVlKTsKK30KKworRVhQ T1JUX1NZTUJPTChkbV9kYWVtb25fc3RhcnQpOworRVhQT1JUX1NZTUJPTChkbV9kYWVtb25fc3Rv cCk7CitFWFBPUlRfU1lNQk9MKGRtX2RhZW1vbl93YWtlKTsKLS0tIGRpZmYvZHJpdmVycy9tZC9k bS1kYWVtb24uaAkxOTcwLTAxLTAxIDAxOjAwOjAwLjAwMDAwMDAwMCArMDEwMAorKysgc291cmNl L2RyaXZlcnMvbWQvZG0tZGFlbW9uLmgJMjAwMy0wOC0yNiAxNDoyMTo0MC4wMDAwMDAwMDAgKzAx MDAKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBTaXN0aW5hIFNv ZnR3YXJlCisgKgorICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBMR1BMLgorICov CisKKyNpZm5kZWYgRE1fREFFTU9OX0gKKyNkZWZpbmUgRE1fREFFTU9OX0gKKworI2luY2x1ZGUg PGFzbS9hdG9taWMuaD4KKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisKK3N0cnVjdCBkbV9k YWVtb24geworCXZvaWQgKCpmbikodm9pZCk7CisJY2hhciBuYW1lWzE2XTsKKwlhdG9taWNfdCBw bGVhc2VfZGllOworCXN0cnVjdCBzZW1hcGhvcmUgc3RhcnRfbG9jazsKKwlzdHJ1Y3Qgc2VtYXBo b3JlIHJ1bl9sb2NrOworCisJYXRvbWljX3Qgd29rZW47CisJd2FpdF9xdWV1ZV9oZWFkX3Qgam9i X3F1ZXVlOworfTsKKworaW50IGRtX2RhZW1vbl9zdGFydChzdHJ1Y3QgZG1fZGFlbW9uICpkZCwg Y29uc3QgY2hhciAqbmFtZSwgdm9pZCAoKmZuKSh2b2lkKSk7Cit2b2lkIGRtX2RhZW1vbl9zdG9w KHN0cnVjdCBkbV9kYWVtb24gKmRkKTsKK3ZvaWQgZG1fZGFlbW9uX3dha2Uoc3RydWN0IGRtX2Rh ZW1vbiAqZGQpOworaW50IGRtX2RhZW1vbl9ydW5uaW5nKHN0cnVjdCBkbV9kYWVtb24gKmRkKTsK KworI2VuZGlmCi0tLSBkaWZmL2RyaXZlcnMvbWQvZG0tZXhjZXB0aW9uLXN0b3JlLmMJMTk3MC0w MS0wMSAwMTowMDowMC4wMDAwMDAwMDAgKzAxMDAKKysrIHNvdXJjZS9kcml2ZXJzL21kL2RtLWV4 Y2VwdGlvbi1zdG9yZS5jCTIwMDMtMDgtMjYgMTM6NTk6MDQuMDAwMDAwMDAwICswMTAwCkBAIC0w LDAgKzEsNjc1IEBACisvKgorICogZG0tc25hcHNob3QuYworICoKKyAqIENvcHlyaWdodCAoQykg MjAwMS0yMDAyIFNpc3RpbmEgU29mdHdhcmUgKFVLKSBMaW1pdGVkLgorICoKKyAqIFRoaXMgZmls ZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMLgorICovCisKKyNpbmNsdWRlICJkbS1zbmFwc2hv dC5oIgorI2luY2x1ZGUgImRtLWlvLmgiCisjaW5jbHVkZSAia2NvcHlkLmgiCisKKyNpbmNsdWRl IDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51 eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisvKi0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBQ ZXJzaXN0ZW50IHNuYXBzaG90cywgYnkgcGVyc2lzdGVudCB3ZSBtZWFuIHRoYXQgdGhlIHNuYXBz aG90CisgKiB3aWxsIHN1cnZpdmUgYSByZWJvb3QuCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBXZSBu ZWVkIHRvIHN0b3JlIGEgcmVjb3JkIG9mIHdoaWNoIHBhcnRzIG9mIHRoZSBvcmlnaW4gaGF2ZQor ICogYmVlbiBjb3BpZWQgdG8gdGhlIHNuYXBzaG90IGRldmljZS4gIFRoZSBzbmFwc2hvdCBjb2Rl CisgKiByZXF1aXJlcyB0aGF0IHdlIGNvcHkgZXhjZXB0aW9uIGNodW5rcyB0byBjaHVuayBhbGln bmVkIGFyZWFzCisgKiBvZiB0aGUgQ09XIHN0b3JlLiAgSXQgbWFrZXMgc2Vuc2UgdGhlcmVmb3Jl LCB0byBzdG9yZSB0aGUKKyAqIG1ldGFkYXRhIGluIGNodW5rIHNpemUgYmxvY2tzLgorICoKKyAq IFRoZXJlIGlzIG5vIGJhY2t3YXJkIG9yIGZvcndhcmQgY29tcGF0aWJpbGl0eSBpbXBsZW1lbnRl ZCwKKyAqIHNuYXBzaG90cyB3aXRoIGRpZmZlcmVudCBkaXNrIHZlcnNpb25zIHRoYW4gdGhlIGtl cm5lbCB3aWxsCisgKiBub3QgYmUgdXNhYmxlLiAgSXQgaXMgZXhwZWN0ZWQgdGhhdCAibHZjcmVh dGUiIHdpbGwgYmxhbmsgb3V0CisgKiB0aGUgc3RhcnQgb2YgYSBmcmVzaCBDT1cgZGV2aWNlIGJl Zm9yZSBjYWxsaW5nIHRoZSBzbmFwc2hvdAorICogY29uc3RydWN0b3IuCisgKgorICogVGhlIGZp cnN0IGNodW5rIG9mIHRoZSBDT1cgZGV2aWNlIGp1c3QgY29udGFpbnMgdGhlIGhlYWRlci4KKyAq IEFmdGVyIHRoaXMgdGhlcmUgaXMgYSBjaHVuayBmaWxsZWQgd2l0aCBleGNlcHRpb24gbWV0YWRh dGEsCisgKiBmb2xsb3dlZCBieSBhcyBtYW55IGV4Y2VwdGlvbiBjaHVua3MgYXMgY2FuIGZpdCBp biB0aGUKKyAqIG1ldGFkYXRhIGFyZWFzLgorICoKKyAqIEFsbCBvbiBkaXNrIHN0cnVjdHVyZXMg YXJlIGluIGxpdHRsZS1lbmRpYW4gZm9ybWF0LiAgVGhlIGVuZAorICogb2YgdGhlIGV4Y2VwdGlv bnMgaW5mbyBpcyBpbmRpY2F0ZWQgYnkgYW4gZXhjZXB0aW9uIHdpdGggYQorICogbmV3X2NodW5r IG9mIDAsIHdoaWNoIGlzIGludmFsaWQgc2luY2UgaXQgd291bGQgcG9pbnQgdG8gdGhlCisgKiBo ZWFkZXIgY2h1bmsuCisgKi8KKworLyoKKyAqIE1hZ2ljIGZvciBwZXJzaXN0ZW50IHNuYXBzaG90 czogIlNuQXAiIC0gRmVlYmxlIGlzbid0IGl0LgorICovCisjZGVmaW5lIFNOQVBfTUFHSUMgMHg3 MDQxNmU1MworCisvKgorICogVGhlIG9uLWRpc2sgdmVyc2lvbiBvZiB0aGUgbWV0YWRhdGEuCisg Ki8KKyNkZWZpbmUgU05BUFNIT1RfRElTS19WRVJTSU9OIDEKKworc3RydWN0IGRpc2tfaGVhZGVy IHsKKwl1aW50MzJfdCBtYWdpYzsKKworCS8qCisJICogSXMgdGhpcyBzbmFwc2hvdCB2YWxpZC4g IFRoZXJlIGlzIG5vIHdheSBvZiByZWNvdmVyaW5nCisJICogYW4gaW52YWxpZCBzbmFwc2hvdC4K KwkgKi8KKwl1aW50MzJfdCB2YWxpZDsKKworCS8qCisJICogU2ltcGxlLCBpbmNyZW1lbnRpbmcg dmVyc2lvbi4gbm8gYmFja3dhcmQKKwkgKiBjb21wYXRpYmlsaXR5LgorCSAqLworCXVpbnQzMl90 IHZlcnNpb247CisKKwkvKiBJbiBzZWN0b3JzICovCisJdWludDMyX3QgY2h1bmtfc2l6ZTsKK307 CisKK3N0cnVjdCBkaXNrX2V4Y2VwdGlvbiB7CisJdWludDY0X3Qgb2xkX2NodW5rOworCXVpbnQ2 NF90IG5ld19jaHVuazsKK307CisKK3N0cnVjdCBjb21taXRfY2FsbGJhY2sgeworCXZvaWQgKCpj YWxsYmFjaykodm9pZCAqLCBpbnQgc3VjY2Vzcyk7CisJdm9pZCAqY29udGV4dDsKK307CisKKy8q CisgKiBUaGUgdG9wIGxldmVsIHN0cnVjdHVyZSBmb3IgYSBwZXJzaXN0ZW50IGV4Y2VwdGlvbiBz dG9yZS4KKyAqLworc3RydWN0IHBzdG9yZSB7CisJc3RydWN0IGRtX3NuYXBzaG90ICpzbmFwOwkv KiB1cCBwb2ludGVyIHRvIG15IHNuYXBzaG90ICovCisJaW50IHZlcnNpb247CisJaW50IHZhbGlk OworCXVpbnQzMl90IGNodW5rX3NpemU7CisJdWludDMyX3QgZXhjZXB0aW9uc19wZXJfYXJlYTsK KworCS8qCisJICogTm93IHRoYXQgd2UgaGF2ZSBhbiBhc3luY2hyb25vdXMga2NvcHlkIHRoZXJl IGlzIG5vCisJICogbmVlZCBmb3IgbGFyZ2UgY2h1bmsgc2l6ZXMsIHNvIGl0IHdvbnQgaHVydCB0 byBoYXZlIGEKKwkgKiB3aG9sZSBjaHVua3Mgd29ydGggb2YgbWV0YWRhdGEgaW4gbWVtb3J5IGF0 IG9uY2UuCisJICovCisJdm9pZCAqYXJlYTsKKworCS8qCisJICogVXNlZCB0byBrZWVwIHRyYWNr IG9mIHdoaWNoIG1ldGFkYXRhIGFyZWEgdGhlIGRhdGEgaW4KKwkgKiAnY2h1bmsnIHJlZmVycyB0 by4KKwkgKi8KKwl1aW50MzJfdCBjdXJyZW50X2FyZWE7CisKKwkvKgorCSAqIFRoZSBuZXh0IGZy ZWUgY2h1bmsgZm9yIGFuIGV4Y2VwdGlvbi4KKwkgKi8KKwl1aW50MzJfdCBuZXh0X2ZyZWU7CisK KwkvKgorCSAqIFRoZSBpbmRleCBvZiBuZXh0IGZyZWUgZXhjZXB0aW9uIGluIHRoZSBjdXJyZW50 CisJICogbWV0YWRhdGEgYXJlYS4KKwkgKi8KKwl1aW50MzJfdCBjdXJyZW50X2NvbW1pdHRlZDsK KworCWF0b21pY190IHBlbmRpbmdfY291bnQ7CisJdWludDMyX3QgY2FsbGJhY2tfY291bnQ7CisJ c3RydWN0IGNvbW1pdF9jYWxsYmFjayAqY2FsbGJhY2tzOworfTsKKworc3RhdGljIGlubGluZSB1 bnNpZ25lZCBpbnQgc2VjdG9yc190b19wYWdlcyh1bnNpZ25lZCBpbnQgc2VjdG9ycykKK3sKKwly ZXR1cm4gc2VjdG9ycyAvIChQQUdFX1NJWkUgLyBTRUNUT1JfU0laRSk7Cit9CisKK3N0YXRpYyBp bnQgYWxsb2NfYXJlYShzdHJ1Y3QgcHN0b3JlICpwcykKK3sKKwlpbnQgciA9IC1FTk9NRU07CisJ c2l6ZV90IGksIGxlbiwgbnJfcGFnZXM7CisJc3RydWN0IHBhZ2UgKnBhZ2UsICpsYXN0ID0gTlVM TDsKKworCWxlbiA9IHBzLT5jaHVua19zaXplIDw8IFNFQ1RPUl9TSElGVDsKKworCS8qCisJICog QWxsb2NhdGUgdGhlIGNodW5rX3NpemUgYmxvY2sgb2YgbWVtb3J5IHRoYXQgd2lsbCBob2xkCisJ ICogYSBzaW5nbGUgbWV0YWRhdGEgYXJlYS4KKwkgKi8KKwlwcy0+YXJlYSA9IHZtYWxsb2MobGVu KTsKKwlpZiAoIXBzLT5hcmVhKQorCQlyZXR1cm4gcjsKKworCW5yX3BhZ2VzID0gc2VjdG9yc190 b19wYWdlcyhwcy0+Y2h1bmtfc2l6ZSk7CisKKwkvKgorCSAqIFdlIGxvY2sgdGhlIHBhZ2VzIGZv ciBwcy0+YXJlYSBpbnRvIG1lbW9yeSBzaW5jZQorCSAqIHRoZXknbGwgYmUgZG9pbmcgYSBsb3Qg b2YgaW8uICBXZSBhbHNvIGNoYWluIHRoZW0KKwkgKiB0b2dldGhlciByZWFkeSBmb3IgZG0taW8u CisJICovCisJZm9yIChpID0gMDsgaSA8IG5yX3BhZ2VzOyBpKyspIHsKKwkJcGFnZSA9IHZtYWxs b2NfdG9fcGFnZShwcy0+YXJlYSArIChpICogUEFHRV9TSVpFKSk7CisJCUxvY2tQYWdlKHBhZ2Up OworCQlpZiAobGFzdCkKKwkJCWxhc3QtPmxpc3QubmV4dCA9ICZwYWdlLT5saXN0OworCQlsYXN0 ID0gcGFnZTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZnJlZV9hcmVhKHN0 cnVjdCBwc3RvcmUgKnBzKQoreworCXNpemVfdCBpLCBucl9wYWdlczsKKwlzdHJ1Y3QgcGFnZSAq cGFnZTsKKworCW5yX3BhZ2VzID0gc2VjdG9yc190b19wYWdlcyhwcy0+Y2h1bmtfc2l6ZSk7CisJ Zm9yIChpID0gMDsgaSA8IG5yX3BhZ2VzOyBpKyspIHsKKwkJcGFnZSA9IHZtYWxsb2NfdG9fcGFn ZShwcy0+YXJlYSArIChpICogUEFHRV9TSVpFKSk7CisJCXBhZ2UtPmxpc3QubmV4dCA9IE5VTEw7 CisJCVVubG9ja1BhZ2UocGFnZSk7CisJfQorCisJdmZyZWUocHMtPmFyZWEpOworfQorCisvKgor ICogUmVhZCBvciB3cml0ZSBhIGNodW5rIGFsaWduZWQgYW5kIHNpemVkIGJsb2NrIG9mIGRhdGEg ZnJvbSBhIGRldmljZS4KKyAqLworc3RhdGljIGludCBjaHVua19pbyhzdHJ1Y3QgcHN0b3JlICpw cywgdWludDMyX3QgY2h1bmssIGludCBydykKK3sKKwlzdHJ1Y3QgaW9fcmVnaW9uIHdoZXJlOwor CXVuc2lnbmVkIGludCBiaXRzOworCisJd2hlcmUuZGV2ID0gcHMtPnNuYXAtPmNvdy0+ZGV2Owor CXdoZXJlLnNlY3RvciA9IHBzLT5jaHVua19zaXplICogY2h1bms7CisJd2hlcmUuY291bnQgPSBw cy0+Y2h1bmtfc2l6ZTsKKworCXJldHVybiBkbV9pb19zeW5jKDEsICZ3aGVyZSwgcncsIHZtYWxs b2NfdG9fcGFnZShwcy0+YXJlYSksIDAsICZiaXRzKTsKK30KKworLyoKKyAqIFJlYWQgb3Igd3Jp dGUgYSBtZXRhZGF0YSBhcmVhLiAgUmVtZW1iZXJpbmcgdG8gc2tpcCB0aGUgZmlyc3QKKyAqIGNo dW5rIHdoaWNoIGhvbGRzIHRoZSBoZWFkZXIuCisgKi8KK3N0YXRpYyBpbnQgYXJlYV9pbyhzdHJ1 Y3QgcHN0b3JlICpwcywgdWludDMyX3QgYXJlYSwgaW50IHJ3KQoreworCWludCByOworCXVpbnQz Ml90IGNodW5rOworCisJLyogY29udmVydCBhIG1ldGFkYXRhIGFyZWEgaW5kZXggdG8gYSBjaHVu ayBpbmRleCAqLworCWNodW5rID0gMSArICgocHMtPmV4Y2VwdGlvbnNfcGVyX2FyZWEgKyAxKSAq IGFyZWEpOworCisJciA9IGNodW5rX2lvKHBzLCBjaHVuaywgcncpOworCWlmIChyKQorCQlyZXR1 cm4gcjsKKworCXBzLT5jdXJyZW50X2FyZWEgPSBhcmVhOworCXJldHVybiAwOworfQorCitzdGF0 aWMgaW50IHplcm9fYXJlYShzdHJ1Y3QgcHN0b3JlICpwcywgdWludDMyX3QgYXJlYSkKK3sKKwlt ZW1zZXQocHMtPmFyZWEsIDAsIHBzLT5jaHVua19zaXplIDw8IFNFQ1RPUl9TSElGVCk7CisJcmV0 dXJuIGFyZWFfaW8ocHMsIGFyZWEsIFdSSVRFKTsKK30KKworc3RhdGljIGludCByZWFkX2hlYWRl cihzdHJ1Y3QgcHN0b3JlICpwcywgaW50ICpuZXdfc25hcHNob3QpCit7CisJaW50IHI7CisJc3Ry dWN0IGRpc2tfaGVhZGVyICpkaDsKKworCXIgPSBjaHVua19pbyhwcywgMCwgUkVBRCk7CisJaWYg KHIpCisJCXJldHVybiByOworCisJZGggPSAoc3RydWN0IGRpc2tfaGVhZGVyICopIHBzLT5hcmVh OworCisJaWYgKGxlMzJfdG9fY3B1KGRoLT5tYWdpYykgPT0gMCkgeworCQkqbmV3X3NuYXBzaG90 ID0gMTsKKworCX0gZWxzZSBpZiAobGUzMl90b19jcHUoZGgtPm1hZ2ljKSA9PSBTTkFQX01BR0lD KSB7CisJCSpuZXdfc25hcHNob3QgPSAwOworCQlwcy0+dmFsaWQgPSBsZTMyX3RvX2NwdShkaC0+ dmFsaWQpOworCQlwcy0+dmVyc2lvbiA9IGxlMzJfdG9fY3B1KGRoLT52ZXJzaW9uKTsKKwkJcHMt PmNodW5rX3NpemUgPSBsZTMyX3RvX2NwdShkaC0+Y2h1bmtfc2l6ZSk7CisKKwl9IGVsc2Ugewor CQlETVdBUk4oIkludmFsaWQvY29ycnVwdCBzbmFwc2hvdCIpOworCQlyID0gLUVOWElPOworCX0K KworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IHdyaXRlX2hlYWRlcihzdHJ1Y3QgcHN0b3Jl ICpwcykKK3sKKwlzdHJ1Y3QgZGlza19oZWFkZXIgKmRoOworCisJbWVtc2V0KHBzLT5hcmVhLCAw LCBwcy0+Y2h1bmtfc2l6ZSA8PCBTRUNUT1JfU0hJRlQpOworCisJZGggPSAoc3RydWN0IGRpc2tf aGVhZGVyICopIHBzLT5hcmVhOworCWRoLT5tYWdpYyA9IGNwdV90b19sZTMyKFNOQVBfTUFHSUMp OworCWRoLT52YWxpZCA9IGNwdV90b19sZTMyKHBzLT52YWxpZCk7CisJZGgtPnZlcnNpb24gPSBj cHVfdG9fbGUzMihwcy0+dmVyc2lvbik7CisJZGgtPmNodW5rX3NpemUgPSBjcHVfdG9fbGUzMihw cy0+Y2h1bmtfc2l6ZSk7CisKKwlyZXR1cm4gY2h1bmtfaW8ocHMsIDAsIFdSSVRFKTsKK30KKwor LyoKKyAqIEFjY2VzcyBmdW5jdGlvbnMgZm9yIHRoZSBkaXNrIGV4Y2VwdGlvbnMsIHRoZXNlIGRv IHRoZSBlbmRpYW4gY29udmVyc2lvbnMuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZGlza19leGNlcHRp b24gKmdldF9leGNlcHRpb24oc3RydWN0IHBzdG9yZSAqcHMsIHVpbnQzMl90IGluZGV4KQorewor CWlmIChpbmRleCA+PSBwcy0+ZXhjZXB0aW9uc19wZXJfYXJlYSkKKwkJcmV0dXJuIE5VTEw7CisK KwlyZXR1cm4gKChzdHJ1Y3QgZGlza19leGNlcHRpb24gKikgcHMtPmFyZWEpICsgaW5kZXg7Cit9 CisKK3N0YXRpYyBpbnQgcmVhZF9leGNlcHRpb24oc3RydWN0IHBzdG9yZSAqcHMsCisJCQkgIHVp bnQzMl90IGluZGV4LCBzdHJ1Y3QgZGlza19leGNlcHRpb24gKnJlc3VsdCkKK3sKKwlzdHJ1Y3Qg ZGlza19leGNlcHRpb24gKmU7CisKKwllID0gZ2V0X2V4Y2VwdGlvbihwcywgaW5kZXgpOworCWlm ICghZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBjb3B5IGl0ICovCisJcmVzdWx0LT5vbGRf Y2h1bmsgPSBsZTY0X3RvX2NwdShlLT5vbGRfY2h1bmspOworCXJlc3VsdC0+bmV3X2NodW5rID0g bGU2NF90b19jcHUoZS0+bmV3X2NodW5rKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50 IHdyaXRlX2V4Y2VwdGlvbihzdHJ1Y3QgcHN0b3JlICpwcywKKwkJCSAgIHVpbnQzMl90IGluZGV4 LCBzdHJ1Y3QgZGlza19leGNlcHRpb24gKmRlKQoreworCXN0cnVjdCBkaXNrX2V4Y2VwdGlvbiAq ZTsKKworCWUgPSBnZXRfZXhjZXB0aW9uKHBzLCBpbmRleCk7CisJaWYgKCFlKQorCQlyZXR1cm4g LUVJTlZBTDsKKworCS8qIGNvcHkgaXQgKi8KKwllLT5vbGRfY2h1bmsgPSBjcHVfdG9fbGU2NChk ZS0+b2xkX2NodW5rKTsKKwllLT5uZXdfY2h1bmsgPSBjcHVfdG9fbGU2NChkZS0+bmV3X2NodW5r KTsKKworCXJldHVybiAwOworfQorCisvKgorICogUmVnaXN0ZXJzIHRoZSBleGNlcHRpb25zIHRo YXQgYXJlIHByZXNlbnQgaW4gdGhlIGN1cnJlbnQgYXJlYS4KKyAqICdmdWxsJyBpcyBmaWxsZWQg aW4gdG8gaW5kaWNhdGUgaWYgdGhlIGFyZWEgaGFzIGJlZW4KKyAqIGZpbGxlZC4KKyAqLworc3Rh dGljIGludCBpbnNlcnRfZXhjZXB0aW9ucyhzdHJ1Y3QgcHN0b3JlICpwcywgaW50ICpmdWxsKQor eworCWludCByOworCXVuc2lnbmVkIGludCBpOworCXN0cnVjdCBkaXNrX2V4Y2VwdGlvbiBkZTsK KworCS8qIHByZXN1bWUgdGhlIGFyZWEgaXMgZnVsbCAqLworCSpmdWxsID0gMTsKKworCWZvciAo aSA9IDA7IGkgPCBwcy0+ZXhjZXB0aW9uc19wZXJfYXJlYTsgaSsrKSB7CisJCXIgPSByZWFkX2V4 Y2VwdGlvbihwcywgaSwgJmRlKTsKKworCQlpZiAocikKKwkJCXJldHVybiByOworCisJCS8qCisJ CSAqIElmIHRoZSBuZXdfY2h1bmsgaXMgcG9pbnRpbmcgYXQgdGhlIHN0YXJ0IG9mCisJCSAqIHRo ZSBDT1cgZGV2aWNlLCB3aGVyZSB0aGUgZmlyc3QgbWV0YWRhdGEgYXJlYQorCQkgKiBpcyB3ZSBr bm93IHRoYXQgd2UndmUgaGl0IHRoZSBlbmQgb2YgdGhlCisJCSAqIGV4Y2VwdGlvbnMuICBUaGVy ZWZvcmUgdGhlIGFyZWEgaXMgbm90IGZ1bGwuCisJCSAqLworCQlpZiAoZGUubmV3X2NodW5rID09 IDBMTCkgeworCQkJcHMtPmN1cnJlbnRfY29tbWl0dGVkID0gaTsKKwkJCSpmdWxsID0gMDsKKwkJ CWJyZWFrOworCQl9CisKKwkJLyoKKwkJICogS2VlcCB0cmFjayBvZiB0aGUgc3RhcnQgb2YgdGhl IGZyZWUgY2h1bmtzLgorCQkgKi8KKwkJaWYgKHBzLT5uZXh0X2ZyZWUgPD0gZGUubmV3X2NodW5r KQorCQkJcHMtPm5leHRfZnJlZSA9IGRlLm5ld19jaHVuayArIDE7CisKKwkJLyoKKwkJICogT3Ro ZXJ3aXNlIHdlIGFkZCB0aGUgZXhjZXB0aW9uIHRvIHRoZSBzbmFwc2hvdC4KKwkJICovCisJCXIg PSBkbV9hZGRfZXhjZXB0aW9uKHBzLT5zbmFwLCBkZS5vbGRfY2h1bmssIGRlLm5ld19jaHVuayk7 CisJCWlmIChyKQorCQkJcmV0dXJuIHI7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBp bnQgcmVhZF9leGNlcHRpb25zKHN0cnVjdCBwc3RvcmUgKnBzKQoreworCXVpbnQzMl90IGFyZWE7 CisJaW50IHIsIGZ1bGwgPSAxOworCisJLyoKKwkgKiBLZWVwaW5nIHJlYWRpbmcgY2h1bmtzIGFu ZCBpbnNlcnRpbmcgZXhjZXB0aW9ucyB1bnRpbAorCSAqIHdlIGZpbmQgYSBwYXJ0aWFsbHkgZnVs bCBhcmVhLgorCSAqLworCWZvciAoYXJlYSA9IDA7IGZ1bGw7IGFyZWErKykgeworCQlyID0gYXJl YV9pbyhwcywgYXJlYSwgUkVBRCk7CisJCWlmIChyKQorCQkJcmV0dXJuIHI7CisKKwkJciA9IGlu c2VydF9leGNlcHRpb25zKHBzLCAmZnVsbCk7CisJCWlmIChyKQorCQkJcmV0dXJuIHI7CisKKwkJ YXJlYSsrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwc3Rv cmUgKmdldF9pbmZvKHN0cnVjdCBleGNlcHRpb25fc3RvcmUgKnN0b3JlKQoreworCXJldHVybiAo c3RydWN0IHBzdG9yZSAqKSBzdG9yZS0+Y29udGV4dDsKK30KKworc3RhdGljIHZvaWQgcGVyc2lz dGVudF9mcmFjdGlvbl9mdWxsKHN0cnVjdCBleGNlcHRpb25fc3RvcmUgKnN0b3JlLAorCQkJCSAg ICAgc2VjdG9yX3QgKm51bWVyYXRvciwgc2VjdG9yX3QgKmRlbm9taW5hdG9yKQoreworCSpudW1l cmF0b3IgPSBnZXRfaW5mbyhzdG9yZSktPm5leHRfZnJlZSAqIHN0b3JlLT5zbmFwLT5jaHVua19z aXplOworCSpkZW5vbWluYXRvciA9IGdldF9kZXZfc2l6ZShzdG9yZS0+c25hcC0+Y293LT5kZXYp OworfQorCitzdGF0aWMgdm9pZCBwZXJzaXN0ZW50X2Rlc3Ryb3koc3RydWN0IGV4Y2VwdGlvbl9z dG9yZSAqc3RvcmUpCit7CisJc3RydWN0IHBzdG9yZSAqcHMgPSBnZXRfaW5mbyhzdG9yZSk7CisK KwlkbV9pb19wdXQoc2VjdG9yc190b19wYWdlcyhwcy0+Y2h1bmtfc2l6ZSkpOworCXZmcmVlKHBz LT5jYWxsYmFja3MpOworCWZyZWVfYXJlYShwcyk7CisJa2ZyZWUocHMpOworfQorCitzdGF0aWMg aW50IHBlcnNpc3RlbnRfcmVhZF9tZXRhZGF0YShzdHJ1Y3QgZXhjZXB0aW9uX3N0b3JlICpzdG9y ZSkKK3sKKwlpbnQgciwgbmV3X3NuYXBzaG90OworCXN0cnVjdCBwc3RvcmUgKnBzID0gZ2V0X2lu Zm8oc3RvcmUpOworCisJLyoKKwkgKiBSZWFkIHRoZSBzbmFwc2hvdCBoZWFkZXIuCisJICovCisJ ciA9IHJlYWRfaGVhZGVyKHBzLCAmbmV3X3NuYXBzaG90KTsKKwlpZiAocikKKwkJcmV0dXJuIHI7 CisKKwkvKgorCSAqIERvIHdlIG5lZWQgdG8gc2V0dXAgYSBuZXcgc25hcHNob3QgPworCSAqLwor CWlmIChuZXdfc25hcHNob3QpIHsKKwkJciA9IHdyaXRlX2hlYWRlcihwcyk7CisJCWlmIChyKSB7 CisJCQlETVdBUk4oIndyaXRlX2hlYWRlciBmYWlsZWQiKTsKKwkJCXJldHVybiByOworCQl9CisK KwkJciA9IHplcm9fYXJlYShwcywgMCk7CisJCWlmIChyKSB7CisJCQlETVdBUk4oInplcm9fYXJl YSgwKSBmYWlsZWQiKTsKKwkJCXJldHVybiByOworCQl9CisKKwl9IGVsc2UgeworCQkvKgorCQkg KiBTYW5pdHkgY2hlY2tzLgorCQkgKi8KKwkJaWYgKCFwcy0+dmFsaWQpIHsKKwkJCURNV0FSTigi c25hcHNob3QgaXMgbWFya2VkIGludmFsaWQiKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisK KwkJaWYgKHBzLT52ZXJzaW9uICE9IFNOQVBTSE9UX0RJU0tfVkVSU0lPTikgeworCQkJRE1XQVJO KCJ1bmFibGUgdG8gaGFuZGxlIHNuYXBzaG90IGRpc2sgdmVyc2lvbiAlZCIsCisJCQkgICAgICAg cHMtPnZlcnNpb24pOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQkvKgorCQkgKiBSZWFk IHRoZSBtZXRhZGF0YS4KKwkJICovCisJCXIgPSByZWFkX2V4Y2VwdGlvbnMocHMpOworCQlpZiAo cikKKwkJCXJldHVybiByOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBlcnNp c3RlbnRfcHJlcGFyZShzdHJ1Y3QgZXhjZXB0aW9uX3N0b3JlICpzdG9yZSwKKwkJCSAgICAgIHN0 cnVjdCBleGNlcHRpb24gKmUpCit7CisJc3RydWN0IHBzdG9yZSAqcHMgPSBnZXRfaW5mbyhzdG9y ZSk7CisJdWludDMyX3Qgc3RyaWRlOworCXNlY3Rvcl90IHNpemUgPSBnZXRfZGV2X3NpemUoc3Rv cmUtPnNuYXAtPmNvdy0+ZGV2KTsKKworCS8qIElzIHRoZXJlIGVub3VnaCByb29tID8gKi8KKwlp ZiAoc2l6ZSA8ICgocHMtPm5leHRfZnJlZSArIDEpICogc3RvcmUtPnNuYXAtPmNodW5rX3NpemUp KQorCQlyZXR1cm4gLUVOT1NQQzsKKworCWUtPm5ld19jaHVuayA9IHBzLT5uZXh0X2ZyZWU7CisK KwkvKgorCSAqIE1vdmUgb250byB0aGUgbmV4dCBmcmVlIHBlbmRpbmcsIG1ha2luZyBzdXJlIHRv IHRha2UKKwkgKiBpbnRvIGFjY291bnQgdGhlIGxvY2F0aW9uIG9mIHRoZSBtZXRhZGF0YSBjaHVu a3MuCisJICovCisJc3RyaWRlID0gKHBzLT5leGNlcHRpb25zX3Blcl9hcmVhICsgMSk7CisJaWYg KCgrK3BzLT5uZXh0X2ZyZWUgJSBzdHJpZGUpID09IDEpCisJCXBzLT5uZXh0X2ZyZWUrKzsKKwor CWF0b21pY19pbmMoJnBzLT5wZW5kaW5nX2NvdW50KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGlj IHZvaWQgcGVyc2lzdGVudF9jb21taXQoc3RydWN0IGV4Y2VwdGlvbl9zdG9yZSAqc3RvcmUsCisJ CQkgICAgICBzdHJ1Y3QgZXhjZXB0aW9uICplLAorCQkJICAgICAgdm9pZCAoKmNhbGxiYWNrKSAo dm9pZCAqLCBpbnQgc3VjY2VzcyksCisJCQkgICAgICB2b2lkICpjYWxsYmFja19jb250ZXh0KQor eworCWludCByOworCXVuc2lnbmVkIGludCBpOworCXN0cnVjdCBwc3RvcmUgKnBzID0gZ2V0X2lu Zm8oc3RvcmUpOworCXN0cnVjdCBkaXNrX2V4Y2VwdGlvbiBkZTsKKwlzdHJ1Y3QgY29tbWl0X2Nh bGxiYWNrICpjYjsKKworCWRlLm9sZF9jaHVuayA9IGUtPm9sZF9jaHVuazsKKwlkZS5uZXdfY2h1 bmsgPSBlLT5uZXdfY2h1bms7CisJd3JpdGVfZXhjZXB0aW9uKHBzLCBwcy0+Y3VycmVudF9jb21t aXR0ZWQrKywgJmRlKTsKKworCS8qCisJICogQWRkIHRoZSBjYWxsYmFjayB0byB0aGUgYmFjayBv ZiB0aGUgYXJyYXkuICBUaGlzIGNvZGUKKwkgKiBpcyB0aGUgb25seSBwbGFjZSB3aGVyZSB0aGUg Y2FsbGJhY2sgYXJyYXkgaXMKKwkgKiBtYW5pcHVsYXRlZCwgYW5kIHdlIGtub3cgdGhhdCBpdCB3 aWxsIG5ldmVyIGJlIGNhbGxlZAorCSAqIG11bHRpcGxlIHRpbWVzIGNvbmN1cnJlbnRseS4KKwkg Ki8KKwljYiA9IHBzLT5jYWxsYmFja3MgKyBwcy0+Y2FsbGJhY2tfY291bnQrKzsKKwljYi0+Y2Fs bGJhY2sgPSBjYWxsYmFjazsKKwljYi0+Y29udGV4dCA9IGNhbGxiYWNrX2NvbnRleHQ7CisKKwkv KgorCSAqIElmIHRoZXJlIGFyZSBubyBtb3JlIGV4Y2VwdGlvbnMgaW4gZmxpZ2h0LCBvciB3ZSBo YXZlCisJICogZmlsbGVkIHRoaXMgbWV0YWRhdGEgYXJlYSB3ZSBjb21taXQgdGhlIGV4Y2VwdGlv bnMgdG8KKwkgKiBkaXNrLgorCSAqLworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZwcy0+cGVu ZGluZ19jb3VudCkgfHwKKwkgICAgKHBzLT5jdXJyZW50X2NvbW1pdHRlZCA9PSBwcy0+ZXhjZXB0 aW9uc19wZXJfYXJlYSkpIHsKKwkJciA9IGFyZWFfaW8ocHMsIHBzLT5jdXJyZW50X2FyZWEsIFdS SVRFKTsKKwkJaWYgKHIpCisJCQlwcy0+dmFsaWQgPSAwOworCisJCWZvciAoaSA9IDA7IGkgPCBw cy0+Y2FsbGJhY2tfY291bnQ7IGkrKykgeworCQkJY2IgPSBwcy0+Y2FsbGJhY2tzICsgaTsKKwkJ CWNiLT5jYWxsYmFjayhjYi0+Y29udGV4dCwgciA9PSAwID8gMSA6IDApOworCQl9CisKKwkJcHMt PmNhbGxiYWNrX2NvdW50ID0gMDsKKwl9CisKKwkvKgorCSAqIEhhdmUgd2UgY29tcGxldGVseSBm aWxsZWQgdGhlIGN1cnJlbnQgYXJlYSA/CisJICovCisJaWYgKHBzLT5jdXJyZW50X2NvbW1pdHRl ZCA9PSBwcy0+ZXhjZXB0aW9uc19wZXJfYXJlYSkgeworCQlwcy0+Y3VycmVudF9jb21taXR0ZWQg PSAwOworCQlyID0gemVyb19hcmVhKHBzLCBwcy0+Y3VycmVudF9hcmVhICsgMSk7CisJCWlmIChy KQorCQkJcHMtPnZhbGlkID0gMDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHBlcnNpc3RlbnRfZHJv cChzdHJ1Y3QgZXhjZXB0aW9uX3N0b3JlICpzdG9yZSkKK3sKKwlzdHJ1Y3QgcHN0b3JlICpwcyA9 IGdldF9pbmZvKHN0b3JlKTsKKworCXBzLT52YWxpZCA9IDA7CisJaWYgKHdyaXRlX2hlYWRlcihw cykpCisJCURNV0FSTigid3JpdGUgaGVhZGVyIGZhaWxlZCIpOworfQorCitpbnQgZG1fY3JlYXRl X3BlcnNpc3RlbnQoc3RydWN0IGV4Y2VwdGlvbl9zdG9yZSAqc3RvcmUsIHVpbnQzMl90IGNodW5r X3NpemUpCit7CisJaW50IHI7CisJc3RydWN0IHBzdG9yZSAqcHM7CisKKwlyID0gZG1faW9fZ2V0 KHNlY3RvcnNfdG9fcGFnZXMoY2h1bmtfc2l6ZSkpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKwor CS8qIGFsbG9jYXRlIHRoZSBwc3RvcmUgKi8KKwlwcyA9IGttYWxsb2Moc2l6ZW9mKCpwcyksIEdG UF9LRVJORUwpOworCWlmICghcHMpIHsKKwkJciA9IC1FTk9NRU07CisJCWdvdG8gYmFkOworCX0K KworCXBzLT5zbmFwID0gc3RvcmUtPnNuYXA7CisJcHMtPnZhbGlkID0gMTsKKwlwcy0+dmVyc2lv biA9IFNOQVBTSE9UX0RJU0tfVkVSU0lPTjsKKwlwcy0+Y2h1bmtfc2l6ZSA9IGNodW5rX3NpemU7 CisJcHMtPmV4Y2VwdGlvbnNfcGVyX2FyZWEgPSAoY2h1bmtfc2l6ZSA8PCBTRUNUT1JfU0hJRlQp IC8KKwkgICAgc2l6ZW9mKHN0cnVjdCBkaXNrX2V4Y2VwdGlvbik7CisJcHMtPm5leHRfZnJlZSA9 IDI7CS8qIHNraXBwaW5nIHRoZSBoZWFkZXIgYW5kIGZpcnN0IGFyZWEgKi8KKwlwcy0+Y3VycmVu dF9jb21taXR0ZWQgPSAwOworCisJciA9IGFsbG9jX2FyZWEocHMpOworCWlmIChyKQorCQlnb3Rv IGJhZDsKKworCS8qCisJICogQWxsb2NhdGUgc3BhY2UgZm9yIGFsbCB0aGUgY2FsbGJhY2tzLgor CSAqLworCXBzLT5jYWxsYmFja19jb3VudCA9IDA7CisJYXRvbWljX3NldCgmcHMtPnBlbmRpbmdf Y291bnQsIDApOworCXBzLT5jYWxsYmFja3MgPSB2Y2FsbG9jKHBzLT5leGNlcHRpb25zX3Blcl9h cmVhLAorCQkJCXNpemVvZigqcHMtPmNhbGxiYWNrcykpOworCisJaWYgKCFwcy0+Y2FsbGJhY2tz KSB7CisJCXIgPSAtRU5PTUVNOworCQlnb3RvIGJhZDsKKwl9CisKKwlzdG9yZS0+ZGVzdHJveSA9 IHBlcnNpc3RlbnRfZGVzdHJveTsKKwlzdG9yZS0+cmVhZF9tZXRhZGF0YSA9IHBlcnNpc3RlbnRf cmVhZF9tZXRhZGF0YTsKKwlzdG9yZS0+cHJlcGFyZV9leGNlcHRpb24gPSBwZXJzaXN0ZW50X3By ZXBhcmU7CisJc3RvcmUtPmNvbW1pdF9leGNlcHRpb24gPSBwZXJzaXN0ZW50X2NvbW1pdDsKKwlz dG9yZS0+ZHJvcF9zbmFwc2hvdCA9IHBlcnNpc3RlbnRfZHJvcDsKKwlzdG9yZS0+ZnJhY3Rpb25f ZnVsbCA9IHBlcnNpc3RlbnRfZnJhY3Rpb25fZnVsbDsKKwlzdG9yZS0+Y29udGV4dCA9IHBzOwor CisJcmV0dXJuIDA7CisKKyAgICAgIGJhZDoKKwlkbV9pb19wdXQoc2VjdG9yc190b19wYWdlcyhj aHVua19zaXplKSk7CisJaWYgKHBzKSB7CisJCWlmIChwcy0+Y2FsbGJhY2tzKQorCQkJdmZyZWUo cHMtPmNhbGxiYWNrcyk7CisKKwkJa2ZyZWUocHMpOworCX0KKwlyZXR1cm4gcjsKK30KKworLyot LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLQorICogSW1wbGVtZW50YXRpb24gb2YgdGhlIHN0b3JlIGZvciBub24tcGVyc2lzdGVu dCBzbmFwc2hvdHMuCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdHJ1Y3QgdHJhbnNpZW50X2MgeworCXNlY3Rvcl90 IG5leHRfZnJlZTsKK307CisKK3ZvaWQgdHJhbnNpZW50X2Rlc3Ryb3koc3RydWN0IGV4Y2VwdGlv bl9zdG9yZSAqc3RvcmUpCit7CisJa2ZyZWUoc3RvcmUtPmNvbnRleHQpOworfQorCitpbnQgdHJh bnNpZW50X3JlYWRfbWV0YWRhdGEoc3RydWN0IGV4Y2VwdGlvbl9zdG9yZSAqc3RvcmUpCit7CisJ cmV0dXJuIDA7Cit9CisKK2ludCB0cmFuc2llbnRfcHJlcGFyZShzdHJ1Y3QgZXhjZXB0aW9uX3N0 b3JlICpzdG9yZSwgc3RydWN0IGV4Y2VwdGlvbiAqZSkKK3sKKwlzdHJ1Y3QgdHJhbnNpZW50X2Mg KnRjID0gKHN0cnVjdCB0cmFuc2llbnRfYyAqKSBzdG9yZS0+Y29udGV4dDsKKwlzZWN0b3JfdCBz aXplID0gZ2V0X2Rldl9zaXplKHN0b3JlLT5zbmFwLT5jb3ctPmRldik7CisKKwlpZiAoc2l6ZSA8 ICh0Yy0+bmV4dF9mcmVlICsgc3RvcmUtPnNuYXAtPmNodW5rX3NpemUpKQorCQlyZXR1cm4gLTE7 CisKKwllLT5uZXdfY2h1bmsgPSBzZWN0b3JfdG9fY2h1bmsoc3RvcmUtPnNuYXAsIHRjLT5uZXh0 X2ZyZWUpOworCXRjLT5uZXh0X2ZyZWUgKz0gc3RvcmUtPnNuYXAtPmNodW5rX3NpemU7CisKKwly ZXR1cm4gMDsKK30KKwordm9pZCB0cmFuc2llbnRfY29tbWl0KHN0cnVjdCBleGNlcHRpb25fc3Rv cmUgKnN0b3JlLAorCQkgICAgICBzdHJ1Y3QgZXhjZXB0aW9uICplLAorCQkgICAgICB2b2lkICgq Y2FsbGJhY2spICh2b2lkICosIGludCBzdWNjZXNzKSwKKwkJICAgICAgdm9pZCAqY2FsbGJhY2tf Y29udGV4dCkKK3sKKwkvKiBKdXN0IHN1Y2NlZWQgKi8KKwljYWxsYmFjayhjYWxsYmFja19jb250 ZXh0LCAxKTsKK30KKworc3RhdGljIHZvaWQgdHJhbnNpZW50X2ZyYWN0aW9uX2Z1bGwoc3RydWN0 IGV4Y2VwdGlvbl9zdG9yZSAqc3RvcmUsCisJCQkJICAgIHNlY3Rvcl90ICpudW1lcmF0b3IsIHNl Y3Rvcl90ICpkZW5vbWluYXRvcikKK3sKKwkqbnVtZXJhdG9yID0gKChzdHJ1Y3QgdHJhbnNpZW50 X2MgKikgc3RvcmUtPmNvbnRleHQpLT5uZXh0X2ZyZWU7CisJKmRlbm9taW5hdG9yID0gZ2V0X2Rl dl9zaXplKHN0b3JlLT5zbmFwLT5jb3ctPmRldik7Cit9CisKK2ludCBkbV9jcmVhdGVfdHJhbnNp ZW50KHN0cnVjdCBleGNlcHRpb25fc3RvcmUgKnN0b3JlLAorCQkJc3RydWN0IGRtX3NuYXBzaG90 ICpzLCBpbnQgYmxvY2tzaXplKQoreworCXN0cnVjdCB0cmFuc2llbnRfYyAqdGM7CisKKwltZW1z ZXQoc3RvcmUsIDAsIHNpemVvZigqc3RvcmUpKTsKKwlzdG9yZS0+ZGVzdHJveSA9IHRyYW5zaWVu dF9kZXN0cm95OworCXN0b3JlLT5yZWFkX21ldGFkYXRhID0gdHJhbnNpZW50X3JlYWRfbWV0YWRh dGE7CisJc3RvcmUtPnByZXBhcmVfZXhjZXB0aW9uID0gdHJhbnNpZW50X3ByZXBhcmU7CisJc3Rv cmUtPmNvbW1pdF9leGNlcHRpb24gPSB0cmFuc2llbnRfY29tbWl0OworCXN0b3JlLT5mcmFjdGlv bl9mdWxsID0gdHJhbnNpZW50X2ZyYWN0aW9uX2Z1bGw7CisJc3RvcmUtPnNuYXAgPSBzOworCisJ dGMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdHJhbnNpZW50X2MpLCBHRlBfS0VSTkVMKTsKKwlp ZiAoIXRjKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXRjLT5uZXh0X2ZyZWUgPSAwOworCXN0b3Jl LT5jb250ZXh0ID0gdGM7CisKKwlyZXR1cm4gMDsKK30KLS0tIGRpZmYvZHJpdmVycy9tZC9kbS1p by5jCTE5NzAtMDEtMDEgMDE6MDA6MDAuMDAwMDAwMDAwICswMTAwCisrKyBzb3VyY2UvZHJpdmVy cy9tZC9kbS1pby5jCTIwMDMtMDgtMjYgMTM6NTk6MDQuMDAwMDAwMDAwICswMTAwCkBAIC0wLDAg KzEsMzQ0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAzIFNpc3RpbmEgU29mdHdhcmUKKyAq CisgKiBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTC4KKyAqLworCisjaW5jbHVk ZSAiZG0taW8uaCIKKworI2luY2x1ZGUgPGxpbnV4L21lbXBvb2wuaD4KKyNpbmNsdWRlIDxsaW51 eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc2No ZWQuaD4KKworLyogRklYTUU6IGNhbiB3ZSBzaHJpbmsgdGhpcyA/ICovCitzdHJ1Y3QgaW9fY29u dGV4dCB7CisJaW50IHJ3OworCXVuc2lnbmVkIGludCBlcnJvcjsKKwlhdG9taWNfdCBjb3VudDsK KwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnNsZWVwZXI7CisJaW9fbm90aWZ5X2ZuIGNhbGxiYWNrOwor CXZvaWQgKmNvbnRleHQ7Cit9OworCisvKgorICogV2UgbWFpbnRhaW4gYSBwb29sIG9mIGJ1ZmZl ciBoZWFkcyBmb3IgZGlzcGF0Y2hpbmcgdGhlIGlvLgorICovCitzdGF0aWMgdW5zaWduZWQgaW50 IF9udW1fYmhzOworc3RhdGljIG1lbXBvb2xfdCAqX2J1ZmZlcl9wb29sOworCisvKgorICogaW8g Y29udGV4dHMgYXJlIG9ubHkgZHluYW1pY2FsbHkgYWxsb2NhdGVkIGZvciBhc3luY2hyb25vdXMK KyAqIGlvLiAgU2luY2UgYXN5bmMgaW8gaXMgbGlrZWx5IHRvIGJlIHRoZSBtYWpvcml0eSBvZiBp byB3ZSdsbAorICogaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2YgaW8gY29udGV4dHMgYXMgYnVmZmVy IGhlYWRzICEgKEZJWE1FOgorICogbXVzdCByZWR1Y2UgdGhpcykuCisgKi8KK21lbXBvb2xfdCAq X2lvX3Bvb2w7CisKK3N0YXRpYyB2b2lkICphbGxvY19iaChpbnQgZ2ZwX21hc2ssIHZvaWQgKnBv b2xfZGF0YSkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCisJYmggPSBrbWVtX2NhY2hl X2FsbG9jKGJoX2NhY2hlcCwgZ2ZwX21hc2spOworCWlmIChiaCkgeworCQliaC0+Yl9yZXFuZXh0 ID0gTlVMTDsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmYmgtPmJfd2FpdCk7CisJCUlOSVRfTElT VF9IRUFEKCZiaC0+Yl9pbm9kZV9idWZmZXJzKTsKKwl9CisKKwlyZXR1cm4gYmg7Cit9CisKK3N0 YXRpYyB2b2lkICphbGxvY19pbyhpbnQgZ2ZwX21hc2ssIHZvaWQgKnBvb2xfZGF0YSkKK3sKKwly ZXR1cm4ga21hbGxvYyhzaXplb2Yoc3RydWN0IGlvX2NvbnRleHQpLCBnZnBfbWFzayk7Cit9CisK K3N0YXRpYyB2b2lkIGZyZWVfaW8odm9pZCAqZWxlbWVudCwgdm9pZCAqcG9vbF9kYXRhKQorewor CWtmcmVlKGVsZW1lbnQpOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHBhZ2VzX3RvX2J1ZmZl cnModW5zaWduZWQgaW50IHBhZ2VzKQoreworCXJldHVybiA0ICogcGFnZXM7CS8qIHRvbyBtYW55 ID8gKi8KK30KKworc3RhdGljIGludCByZXNpemVfcG9vbCh1bnNpZ25lZCBpbnQgbmV3X2JocykK K3sKKwlpbnQgciA9IDA7CisKKwlpZiAoX2J1ZmZlcl9wb29sKSB7CisJCWlmIChuZXdfYmhzID09 IDApIHsKKwkJCS8qIGZyZWUgb2ZmIHRoZSBwb29scyAqLworCQkJbWVtcG9vbF9kZXN0cm95KF9i dWZmZXJfcG9vbCk7CisJCQltZW1wb29sX2Rlc3Ryb3koX2lvX3Bvb2wpOworCQkJX2J1ZmZlcl9w b29sID0gX2lvX3Bvb2wgPSBOVUxMOworCQl9IGVsc2UgeworCQkJLyogcmVzaXplIHRoZSBwb29s cyAqLworCQkJciA9IG1lbXBvb2xfcmVzaXplKF9idWZmZXJfcG9vbCwgbmV3X2JocywgR0ZQX0tF Uk5FTCk7CisJCQlpZiAoIXIpCisJCQkJciA9IG1lbXBvb2xfcmVzaXplKF9pb19wb29sLAorCQkJ CQkJICAgbmV3X2JocywgR0ZQX0tFUk5FTCk7CisJCX0KKwl9IGVsc2UgeworCQkvKiBjcmVhdGUg bmV3IHBvb2xzICovCisJCV9idWZmZXJfcG9vbCA9IG1lbXBvb2xfY3JlYXRlKG5ld19iaHMsIGFs bG9jX2JoLAorCQkJCQkgICAgICBtZW1wb29sX2ZyZWVfc2xhYiwgYmhfY2FjaGVwKTsKKwkJaWYg KCFfYnVmZmVyX3Bvb2wpCisJCQlyID0gLUVOT01FTTsKKworCQlfaW9fcG9vbCA9IG1lbXBvb2xf Y3JlYXRlKG5ld19iaHMsIGFsbG9jX2lvLCBmcmVlX2lvLCBOVUxMKTsKKwkJaWYgKCFfaW9fcG9v bCkgeworCQkJbWVtcG9vbF9kZXN0cm95KF9idWZmZXJfcG9vbCk7CisJCQlfYnVmZmVyX3Bvb2wg PSBOVUxMOworCQkJciA9IC1FTk9NRU07CisJCX0KKwl9CisKKwlpZiAoIXIpCisJCV9udW1fYmhz ID0gbmV3X2JoczsKKworCXJldHVybiByOworfQorCitpbnQgZG1faW9fZ2V0KHVuc2lnbmVkIGlu dCBudW1fcGFnZXMpCit7CisJcmV0dXJuIHJlc2l6ZV9wb29sKF9udW1fYmhzICsgcGFnZXNfdG9f YnVmZmVycyhudW1fcGFnZXMpKTsKK30KKwordm9pZCBkbV9pb19wdXQodW5zaWduZWQgaW50IG51 bV9wYWdlcykKK3sKKwlyZXNpemVfcG9vbChfbnVtX2JocyAtIHBhZ2VzX3RvX2J1ZmZlcnMobnVt X3BhZ2VzKSk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFdlIG5lZWQgdG8ga2VlcCB0cmFjayBvZiB3 aGljaCByZWdpb24gYSBidWZmZXIgaXMgZG9pbmcgaW8KKyAqIGZvci4gIEluIG9yZGVyIHRvIHNh dmUgYSBtZW1vcnkgYWxsb2NhdGlvbiB3ZSBzdG9yZSB0aGlzIGluIGFuCisgKiB1bnVzZWQgZmll bGQgb2YgdGhlIGJ1ZmZlciBoZWFkLCBhbmQgcHJvdmlkZSB0aGVzZSBhY2Nlc3MKKyAqIGZ1bmN0 aW9ucy4KKyAqCisgKiBGSVhNRTogYWRkIGNvbXBpbGUgdGltZSBjaGVjayB0aGF0IGFuIHVuc2ln bmVkIGludCBjYW4gZml0CisgKiBpbnRvIGEgcG9pbnRlci4KKyAqCisgKi0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0 aWMgaW5saW5lIHZvaWQgYmhfc2V0X3JlZ2lvbihzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCB1bnNp Z25lZCBpbnQgcmVnaW9uKQoreworCWJoLT5iX2pvdXJuYWxfaGVhZCA9ICh2b2lkICopIHJlZ2lv bjsKK30KKworc3RhdGljIGlubGluZSBpbnQgYmhfZ2V0X3JlZ2lvbihzdHJ1Y3QgYnVmZmVyX2hl YWQgKmJoKQoreworCXJldHVybiAodW5zaWduZWQgaW50KSBiaC0+Yl9qb3VybmFsX2hlYWQ7Cit9 CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0KKyAqIFdlIG5lZWQgYW4gaW8gb2JqZWN0IHRvIGtlZXAgdHJhY2sgb2Yg dGhlIG51bWJlciBvZiBiaHMgdGhhdAorICogaGF2ZSBiZWVuIGRpc3BhdGNoZWQgZm9yIGEgcGFy dGljdWxhciBpby4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyB2b2lkIGRlY19jb3VudChzdHJ1Y3QgaW9f Y29udGV4dCAqaW8sIHVuc2lnbmVkIGludCByZWdpb24sIGludCBlcnJvcikKK3sKKwlpZiAoZXJy b3IpCisJCXNldF9iaXQocmVnaW9uLCAmaW8tPmVycm9yKTsKKworCWlmIChhdG9taWNfZGVjX2Fu ZF90ZXN0KCZpby0+Y291bnQpKSB7CisJCWlmIChpby0+c2xlZXBlcikKKwkJCXdha2VfdXBfcHJv Y2Vzcyhpby0+c2xlZXBlcik7CisKKwkJZWxzZSB7CisJCQlpbnQgciA9IGlvLT5lcnJvcjsKKwkJ CWlvX25vdGlmeV9mbiBmbiA9IGlvLT5jYWxsYmFjazsKKwkJCXZvaWQgKmNvbnRleHQgPSBpby0+ Y29udGV4dDsKKworCQkJbWVtcG9vbF9mcmVlKGlvLCBfaW9fcG9vbCk7CisJCQlmbihyLCBjb250 ZXh0KTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgZW5kaW8oc3RydWN0IGJ1ZmZlcl9oZWFk ICpiaCwgaW50IHVwdG9kYXRlKQoreworCXN0cnVjdCBpb19jb250ZXh0ICppbyA9IChzdHJ1Y3Qg aW9fY29udGV4dCAqKSBiaC0+Yl9wcml2YXRlOworCisJaWYgKCF1cHRvZGF0ZSAmJiBpby0+cncg IT0gV1JJVEUpIHsKKwkJLyoKKwkJICogV2UgbmVlZCB0byB6ZXJvIHRoaXMgcmVnaW9uLCBvdGhl cndpc2UgcGVvcGxlCisJCSAqIGxpa2Uga2NvcHlkIG1heSB3cml0ZSB0aGUgYXJiaXRyYXJ5IGNv bnRlbnRzCisJCSAqIG9mIHRoZSBwYWdlLgorCQkgKi8KKwkJbWVtc2V0KGJoLT5iX2RhdGEsIDAs IGJoLT5iX3NpemUpOworCX0KKworCWRlY19jb3VudCgoc3RydWN0IGlvX2NvbnRleHQgKikgYmgt PmJfcHJpdmF0ZSwKKwkJICBiaF9nZXRfcmVnaW9uKGJoKSwgIXVwdG9kYXRlKTsKKwltZW1wb29s X2ZyZWUoYmgsIF9idWZmZXJfcG9vbCk7Cit9CisKKy8qCisgKiBQcmltaXRpdmVzIGZvciBhbGln bm1lbnQgY2FsY3VsYXRpb25zLgorICovCitpbnQgZmxzKHVuc2lnbmVkIG4pCit7CisJcmV0dXJu IGdlbmVyaWNfZmxzMzIobik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGxvZzJfZmxvb3IodW5z aWduZWQgbikKK3sKKwlyZXR1cm4gZmZzKG4pIC0gMTsKK30KKworc3RhdGljIGlubGluZSBpbnQg bG9nMl9hbGlnbih1bnNpZ25lZCBuKQoreworCXJldHVybiBmbHMobikgLSAxOworfQorCisvKgor ICogUmV0dXJucyB0aGUgbmV4dCBibG9jayBmb3IgaW8uCisgKi8KK3N0YXRpYyBpbnQgZG9fcGFn ZShrZGV2X3QgZGV2LCBzZWN0b3JfdCAqYmxvY2ssIHNlY3Rvcl90IGVuZF9ibG9jaywKKwkJICAg dW5zaWduZWQgaW50IGJsb2NrX3NpemUsCisJCSAgIHN0cnVjdCBwYWdlICpwLCB1bnNpZ25lZCBp bnQgb2Zmc2V0LAorCQkgICB1bnNpZ25lZCBpbnQgcmVnaW9uLCBzdHJ1Y3QgaW9fY29udGV4dCAq aW8pCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwlzZWN0b3JfdCBiID0gKmJsb2NrOwor CXNlY3Rvcl90IGJsb2Nrc19wZXJfcGFnZSA9IFBBR0VfU0laRSAvIGJsb2NrX3NpemU7CisJdW5z aWduZWQgaW50IHRoaXNfc2l6ZTsgLyogaG9sZHMgdGhlIHNpemUgb2YgdGhlIGN1cnJlbnQgaW8g Ki8KKwl1bnNpZ25lZCBpbnQgbGVuOworCisJd2hpbGUgKChvZmZzZXQgPCBQQUdFX1NJWkUpICYm IChiICE9IGVuZF9ibG9jaykpIHsKKwkJYmggPSBtZW1wb29sX2FsbG9jKF9idWZmZXJfcG9vbCwg R0ZQX05PSU8pOworCQlpbml0X2J1ZmZlcihiaCwgZW5kaW8sIGlvKTsKKwkJYmhfc2V0X3JlZ2lv bihiaCwgcmVnaW9uKTsKKworCQkvKgorCQkgKiBCbG9jayBzaXplIG11c3QgYmUgYSBwb3dlciBv ZiAyIGFuZCBhbGlnbmVkCisJCSAqIGNvcnJlY3RseS4KKwkJICovCisJCWxlbiA9IGVuZF9ibG9j ayAtIGI7CisJCXRoaXNfc2l6ZSA9IG1pbigoc2VjdG9yX3QpIDEgPDwgbG9nMl9mbG9vcihiKSwg YmxvY2tzX3Blcl9wYWdlKTsKKwkJaWYgKHRoaXNfc2l6ZSA+IGxlbikKKwkJCXRoaXNfc2l6ZSA9 IDEgPDwgbG9nMl9hbGlnbihsZW4pOworCisJCS8qCisJCSAqIEFkZCBpbiB0aGUgam9iIG9mZnNl dC4KKwkJICovCisJCWJoLT5iX2Jsb2NrbnIgPSAoYiAvIHRoaXNfc2l6ZSk7CisJCWJoLT5iX3Np emUgPSBibG9ja19zaXplICogdGhpc19zaXplOworCQlzZXRfYmhfcGFnZShiaCwgcCwgb2Zmc2V0 KTsKKwkJYmgtPmJfdGhpc19wYWdlID0gYmg7CisKKwkJYmgtPmJfZGV2ID0gZGV2OworCQlhdG9t aWNfc2V0KCZiaC0+Yl9jb3VudCwgMSk7CisKKwkJYmgtPmJfc3RhdGUgPSAoKDEgPDwgQkhfVXB0 b2RhdGUpIHwgKDEgPDwgQkhfTWFwcGVkKSB8CisJCQkgICAgICAgKDEgPDwgQkhfTG9jaykpOwor CisJCWlmIChpby0+cncgPT0gV1JJVEUpCisJCQljbGVhcl9iaXQoQkhfRGlydHksICZiaC0+Yl9z dGF0ZSk7CisKKwkJYXRvbWljX2luYygmaW8tPmNvdW50KTsKKwkJc3VibWl0X2JoKGlvLT5ydywg YmgpOworCisJCWIgKz0gdGhpc19zaXplOworCQlvZmZzZXQgKz0gYmxvY2tfc2l6ZSAqIHRoaXNf c2l6ZTsKKwl9CisKKwkqYmxvY2sgPSBiOworCXJldHVybiAoYiA9PSBlbmRfYmxvY2spOworfQor CitzdGF0aWMgdm9pZCBkb19yZWdpb24odW5zaWduZWQgaW50IHJlZ2lvbiwgc3RydWN0IGlvX3Jl Z2lvbiAqd2hlcmUsCisJCSAgICAgIHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBpbnQgb2Zm c2V0LAorCQkgICAgICBzdHJ1Y3QgaW9fY29udGV4dCAqaW8pCit7CisJdW5zaWduZWQgaW50IGJs b2NrX3NpemUgPSBnZXRfaGFyZHNlY3Rfc2l6ZSh3aGVyZS0+ZGV2KTsKKwl1bnNpZ25lZCBpbnQg c2Jsb2NrX3NpemUgPSBibG9ja19zaXplID4+IDk7CisJc2VjdG9yX3QgYmxvY2sgPSB3aGVyZS0+ c2VjdG9yIC8gc2Jsb2NrX3NpemU7CisJc2VjdG9yX3QgZW5kX2Jsb2NrID0gKHdoZXJlLT5zZWN0 b3IgKyB3aGVyZS0+Y291bnQpIC8gc2Jsb2NrX3NpemU7CisKKwl3aGlsZSAoMSkgeworCQlpZiAo ZG9fcGFnZSh3aGVyZS0+ZGV2LCAmYmxvY2ssIGVuZF9ibG9jaywgYmxvY2tfc2l6ZSwKKwkJCSAg ICBwYWdlLCBvZmZzZXQsIHJlZ2lvbiwgaW8pKQorCQkJYnJlYWs7CisKKwkJb2Zmc2V0ID0gMDsJ Lyogb25seSBvZmZzZXQgdGhlIGZpcnN0IHBhZ2UgKi8KKworCQlwYWdlID0gbGlzdF9lbnRyeShw YWdlLT5saXN0Lm5leHQsIHN0cnVjdCBwYWdlLCBsaXN0KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lk IGRpc3BhdGNoX2lvKHVuc2lnbmVkIGludCBudW1fcmVnaW9ucywgc3RydWN0IGlvX3JlZ2lvbiAq d2hlcmUsCisJCQlzdHJ1Y3QgcGFnZSAqcGFnZXMsIHVuc2lnbmVkIGludCBvZmZzZXQsCisJCQlz dHJ1Y3QgaW9fY29udGV4dCAqaW8pCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVt X3JlZ2lvbnM7IGkrKykKKwkJaWYgKHdoZXJlW2ldLmNvdW50KQorCQkJZG9fcmVnaW9uKGksIHdo ZXJlICsgaSwgcGFnZXMsIG9mZnNldCwgaW8pOworCisJLyoKKwkgKiBEcm9wIHRoZSBleHRyYSBy ZWZlbmNlIHRoYXQgd2Ugd2VyZSBob2xkaW5nIHRvIGF2b2lkCisJICogdGhlIGlvIGJlaW5nIGNv bXBsZXRlZCB0b28gZWFybHkuCisJICovCisJZGVjX2NvdW50KGlvLCAwLCAwKTsKK30KKworLyoK KyAqIFN5bmNocm9ub3VzIGlvCisgKi8KK2ludCBkbV9pb19zeW5jKHVuc2lnbmVkIGludCBudW1f cmVnaW9ucywgc3RydWN0IGlvX3JlZ2lvbiAqd2hlcmUsCisJICAgICAgIGludCBydywgc3RydWN0 IHBhZ2UgKnBhZ2VzLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LAorCSAgICAgICB1bnNpZ25lZCBpbnQg KmVycm9yX2JpdHMpCit7CisJc3RydWN0IGlvX2NvbnRleHQgaW87CisKKwlCVUdfT04obnVtX3Jl Z2lvbnMgPiAxICYmIHJ3ICE9IFdSSVRFKTsKKworCWlvLnJ3ID0gcnc7CisJaW8uZXJyb3IgPSAw OworCWF0b21pY19zZXQoJmlvLmNvdW50LCAxKTsgLyogc2VlIGRpc3BhdGNoX2lvKCkgKi8KKwlp by5zbGVlcGVyID0gY3VycmVudDsKKworCWRpc3BhdGNoX2lvKG51bV9yZWdpb25zLCB3aGVyZSwg cGFnZXMsIG9mZnNldCwgJmlvKTsKKwlydW5fdGFza19xdWV1ZSgmdHFfZGlzayk7CisKKwl3aGls ZSAoMSkgeworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisKKwkJ aWYgKCFhdG9taWNfcmVhZCgmaW8uY291bnQpKQorCQkJYnJlYWs7CisKKwkJc2NoZWR1bGUoKTsK Kwl9CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKworCSplcnJvcl9iaXRzID0g aW8uZXJyb3I7CisJcmV0dXJuIGlvLmVycm9yID8gLUVJTyA6IDA7Cit9CisKKy8qCisgKiBBc3lu Y2hyb25vdXMgaW8KKyAqLworaW50IGRtX2lvX2FzeW5jKHVuc2lnbmVkIGludCBudW1fcmVnaW9u cywgc3RydWN0IGlvX3JlZ2lvbiAqd2hlcmUsIGludCBydywKKwkJc3RydWN0IHBhZ2UgKnBhZ2Vz LCB1bnNpZ25lZCBpbnQgb2Zmc2V0LAorCQlpb19ub3RpZnlfZm4gZm4sIHZvaWQgKmNvbnRleHQp Cit7CisJc3RydWN0IGlvX2NvbnRleHQgKmlvID0gbWVtcG9vbF9hbGxvYyhfaW9fcG9vbCwgR0ZQ X05PSU8pOworCisJaW8tPnJ3ID0gcnc7CisJaW8tPmVycm9yID0gMDsKKwlhdG9taWNfc2V0KCZp by0+Y291bnQsIDEpOyAvKiBzZWUgZGlzcGF0Y2hfaW8oKSAqLworCWlvLT5zbGVlcGVyID0gTlVM TDsKKwlpby0+Y2FsbGJhY2sgPSBmbjsKKwlpby0+Y29udGV4dCA9IGNvbnRleHQ7CisKKwlkaXNw YXRjaF9pbyhudW1fcmVnaW9ucywgd2hlcmUsIHBhZ2VzLCBvZmZzZXQsIGlvKTsKKwlyZXR1cm4g MDsKK30KKworRVhQT1JUX1NZTUJPTChkbV9pb19nZXQpOworRVhQT1JUX1NZTUJPTChkbV9pb19w dXQpOworRVhQT1JUX1NZTUJPTChkbV9pb19zeW5jKTsKK0VYUE9SVF9TWU1CT0woZG1faW9fYXN5 bmMpOwotLS0gZGlmZi9kcml2ZXJzL21kL2RtLWlvLmgJMTk3MC0wMS0wMSAwMTowMDowMC4wMDAw MDAwMDAgKzAxMDAKKysrIHNvdXJjZS9kcml2ZXJzL21kL2RtLWlvLmgJMjAwMy0wOC0yNiAxNDoy MTozNS4wMDAwMDAwMDAgKzAxMDAKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqIENvcHlyaWdodCAo QykgMjAwMyBTaXN0aW5hIFNvZnR3YXJlCisgKgorICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVu ZGVyIHRoZSBHUEwuCisgKi8KKworI2lmbmRlZiBfRE1fSU9fSAorI2RlZmluZSBfRE1fSU9fSAor CisjaW5jbHVkZSAiZG0uaCIKKworI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKworLyogTW92ZSB0 aGVzZSB0byBiaXRvcHMuaCBldmVudHVhbGx5ICovCisvKiBJbXByb3ZlZCBnZW5lcmljX2ZscyBh bGdvcml0aG0gKGluIDIuNCB0aGVyZSBpcyBubyBnZW5lcmljX2ZscyBzbyBmYXIpICovCisvKiAo YykgMjAwMiwgRC5QaGlsbGlwcyBhbmQgU2lzdGluYSBTb2Z0d2FyZSAqLworLyogTGljZW5zZWQg dW5kZXIgVmVyc2lvbiAyIG9mIHRoZSBHUEwgKi8KKworc3RhdGljIHVuc2lnbmVkIGdlbmVyaWNf ZmxzOCh1bnNpZ25lZCBuKQoreworCXJldHVybiBuICYgMHhmMCA/CisJICAgIG4gJiAweGMwID8g KG4gPj4gNykgKyA3IDogKG4gPj4gNSkgKyA1OgorCSAgICBuICYgMHgwYyA/IChuID4+IDMpICsg MyA6IG4gLSAoKG4gKyAxKSA+PiAyKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBnZW5l cmljX2ZsczE2KHVuc2lnbmVkIG4pCit7CisJcmV0dXJuCW4gJiAweGZmMDA/IGdlbmVyaWNfZmxz OChuID4+IDgpICsgOCA6IGdlbmVyaWNfZmxzOChuKTsKK30KKworc3RhdGljIGlubGluZSB1bnNp Z25lZCBnZW5lcmljX2ZsczMyKHVuc2lnbmVkIG4pCit7CisJcmV0dXJuCW4gJiAweGZmZmYwMDAw ID8gZ2VuZXJpY19mbHMxNihuID4+IDE2KSArIDE2IDogZ2VuZXJpY19mbHMxNihuKTsKK30KKwor LyogRklYTUUgbWFrZSB0aGlzIGNvbmZpZ3VyYWJsZSAqLworI2RlZmluZSBETV9NQVhfSU9fUkVH SU9OUyA4CisKK3N0cnVjdCBpb19yZWdpb24geworCWtkZXZfdCBkZXY7CisJc2VjdG9yX3Qgc2Vj dG9yOworCXNlY3Rvcl90IGNvdW50OworfTsKKworCisvKgorICogJ2Vycm9yJyBpcyBhIGJpdHNl dCwgd2l0aCBlYWNoIGJpdCBpbmRpY2F0aW5nIHdoZXRoZXIgYW4gZXJyb3IKKyAqIG9jY3VycmVk IGRvaW5nIGlvIHRvIHRoZSBjb3JyZXNwb25kaW5nIHJlZ2lvbi4KKyAqLwordHlwZWRlZiB2b2lk ICgqaW9fbm90aWZ5X2ZuKSh1bnNpZ25lZCBpbnQgZXJyb3IsIHZvaWQgKmNvbnRleHQpOworCisK Ky8qCisgKiBCZWZvcmUgYW55b25lIHVzZXMgdGhlIElPIGludGVyZmFjZSB0aGV5IHNob3VsZCBj YWxsCisgKiBkbV9pb19nZXQoKSwgc3BlY2lmeWluZyByb3VnaGx5IGhvdyBtYW55IHBhZ2VzIHRo ZXkgYXJlCisgKiBleHBlY3RpbmcgdG8gcGVyZm9ybSBpbyBvbiBjb25jdXJyZW50bHkuCisgKgor ICogVGhpcyBmdW5jdGlvbiBtYXkgYmxvY2suCisgKi8KK2ludCBkbV9pb19nZXQodW5zaWduZWQg aW50IG51bV9wYWdlcyk7Cit2b2lkIGRtX2lvX3B1dCh1bnNpZ25lZCBpbnQgbnVtX3BhZ2VzKTsK KworCisvKgorICogU3luY2hyb25vdXMgSU8uCisgKgorICogUGxlYXNlIGVuc3VyZSB0aGF0IHRo ZSBydyBmbGFnIGluIHRoZSBuZXh0IHR3byBmdW5jdGlvbnMgaXMKKyAqIGVpdGhlciBSRUFEIG9y IFdSSVRFLCBpZS4gd2UgZG9uJ3QgdGFrZSBSRUFEQS4gIEFueQorICogcmVnaW9ucyB3aXRoIGEg emVybyBjb3VudCBmaWVsZCB3aWxsIGJlIGlnbm9yZWQuCisgKi8KK2ludCBkbV9pb19zeW5jKHVu c2lnbmVkIGludCBudW1fcmVnaW9ucywgc3RydWN0IGlvX3JlZ2lvbiAqd2hlcmUsIGludCBydywK KwkgICAgICAgc3RydWN0IHBhZ2UgKnBhZ2VzLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LAorCSAgICAg ICB1bnNpZ25lZCBpbnQgKmVycm9yX2JpdHMpOworCisKKy8qCisgKiBBeW5jaHJvbm91cyBJTy4K KyAqCisgKiBUaGUgJ3doZXJlJyBhcnJheSBtYXkgYmUgc2FmZWx5IGFsbG9jYXRlZCBvbiB0aGUg c3RhY2sgc2luY2UKKyAqIHRoZSBmdW5jdGlvbiB0YWtlcyBhIGNvcHkuCisgKi8KK2ludCBkbV9p b19hc3luYyh1bnNpZ25lZCBpbnQgbnVtX3JlZ2lvbnMsIHN0cnVjdCBpb19yZWdpb24gKndoZXJl LCBpbnQgcncsCisJCXN0cnVjdCBwYWdlICpwYWdlcywgdW5zaWduZWQgaW50IG9mZnNldCwKKwkJ aW9fbm90aWZ5X2ZuIGZuLCB2b2lkICpjb250ZXh0KTsKKworI2VuZGlmCi0tLSBkaWZmL2RyaXZl cnMvbWQvZG0taW9jdGwuYwkxOTcwLTAxLTAxIDAxOjAwOjAwLjAwMDAwMDAwMCArMDEwMAorKysg c291cmNlL2RyaXZlcnMvbWQvZG0taW9jdGwuYwkyMDAzLTA4LTI2IDEzOjU5OjA0LjAwMDAwMDAw MCArMDEwMApAQCAtMCwwICsxLDEyNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEsIDIw MDIgU2lzdGluYSBTb2Z0d2FyZSAoVUspIExpbWl0ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHJl bGVhc2VkIHVuZGVyIHRoZSBHUEwuCisgKi8KKworI2luY2x1ZGUgImRtLmgiCisKKyNpbmNsdWRl IDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8 bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtLWlvY3RsLmg+CisjaW5jbHVk ZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51 eC9ibGsuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vz cy5oPgorCisjZGVmaW5lIERNX0RSSVZFUl9FTUFJTCAiZG1AdWsuc2lzdGluYS5jb20iCisKKy8q LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0KKyAqIFRoZSBpb2N0bCBpbnRlcmZhY2UgbmVlZHMgdG8gYmUgYWJsZSB0byBsb29r IHVwIGRldmljZXMgYnkKKyAqIG5hbWUgb3IgdXVpZC4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0cnVjdCBoYXNo X2NlbGwgeworCXN0cnVjdCBsaXN0X2hlYWQgbmFtZV9saXN0OworCXN0cnVjdCBsaXN0X2hlYWQg dXVpZF9saXN0OworCisJY2hhciAqbmFtZTsKKwljaGFyICp1dWlkOworCXN0cnVjdCBtYXBwZWRf ZGV2aWNlICptZDsKKwlzdHJ1Y3QgZG1fdGFibGUgKm5ld19tYXA7CisKKwkvKiBJIGhhdGUgZGV2 ZnMgKi8KKwlkZXZmc19oYW5kbGVfdCBkZXZmc19lbnRyeTsKK307CisKKyNkZWZpbmUgTlVNX0JV Q0tFVFMgNjQKKyNkZWZpbmUgTUFTS19CVUNLRVRTIChOVU1fQlVDS0VUUyAtIDEpCitzdGF0aWMg c3RydWN0IGxpc3RfaGVhZCBfbmFtZV9idWNrZXRzW05VTV9CVUNLRVRTXTsKK3N0YXRpYyBzdHJ1 Y3QgbGlzdF9oZWFkIF91dWlkX2J1Y2tldHNbTlVNX0JVQ0tFVFNdOworCitzdGF0aWMgZGV2ZnNf aGFuZGxlX3QgX2Rldl9kaXI7Cit2b2lkIGRtX2hhc2hfcmVtb3ZlX2FsbCh2b2lkKTsKKworLyoK KyAqIEd1YXJkcyBhY2Nlc3MgdG8gYm90aCBoYXNoIHRhYmxlcy4KKyAqLworc3RhdGljIERFQ0xB UkVfUldTRU0oX2hhc2hfbG9jayk7CisKK3N0YXRpYyB2b2lkIGluaXRfYnVja2V0cyhzdHJ1Y3Qg bGlzdF9oZWFkICpidWNrZXRzKQoreworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsg aSA8IE5VTV9CVUNLRVRTOyBpKyspCisJCUlOSVRfTElTVF9IRUFEKGJ1Y2tldHMgKyBpKTsKK30K KworaW50IGRtX2hhc2hfaW5pdCh2b2lkKQoreworCWluaXRfYnVja2V0cyhfbmFtZV9idWNrZXRz KTsKKwlpbml0X2J1Y2tldHMoX3V1aWRfYnVja2V0cyk7CisJX2Rldl9kaXIgPSBkZXZmc19ta19k aXIoMCwgRE1fRElSLCBOVUxMKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBkbV9oYXNoX2V4aXQo dm9pZCkKK3sKKwlkbV9oYXNoX3JlbW92ZV9hbGwoKTsKKwlkZXZmc191bnJlZ2lzdGVyKF9kZXZf ZGlyKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogSGFzaCBmdW5jdGlvbjoKKyAqIFdlJ3JlIG5vdCBy ZWFsbHkgY29uY2VybmVkIHdpdGggdGhlIHN0ciBoYXNoIGZ1bmN0aW9uIGJlaW5nCisgKiBmYXN0 IHNpbmNlIGl0J3Mgb25seSB1c2VkIGJ5IHRoZSBpb2N0bCBpbnRlcmZhY2UuCisgKi0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSov CitzdGF0aWMgdW5zaWduZWQgaW50IGhhc2hfc3RyKGNvbnN0IGNoYXIgKnN0cikKK3sKKwljb25z dCB1bnNpZ25lZCBpbnQgaGFzaF9tdWx0ID0gMjY1NDQzNTM4N1U7CisJdW5zaWduZWQgaW50IGgg PSAwOworCisJd2hpbGUgKCpzdHIpCisJCWggPSAoaCArICh1bnNpZ25lZCBpbnQpICpzdHIrKykg KiBoYXNoX211bHQ7CisKKwlyZXR1cm4gaCAmIE1BU0tfQlVDS0VUUzsKK30KKworLyotLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LQorICogQ29kZSBmb3IgbG9va2luZyB1cCBhIGRldmljZSBieSBuYW1lCisgKi0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitz dGF0aWMgc3RydWN0IGhhc2hfY2VsbCAqX19nZXRfbmFtZV9jZWxsKGNvbnN0IGNoYXIgKnN0cikK K3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CisJc3RydWN0IGhhc2hfY2VsbCAqaGM7CisJdW5z aWduZWQgaW50IGggPSBoYXNoX3N0cihzdHIpOworCisJbGlzdF9mb3JfZWFjaCAodG1wLCBfbmFt ZV9idWNrZXRzICsgaCkgeworCQloYyA9IGxpc3RfZW50cnkodG1wLCBzdHJ1Y3QgaGFzaF9jZWxs LCBuYW1lX2xpc3QpOworCQlpZiAoIXN0cmNtcChoYy0+bmFtZSwgc3RyKSkKKwkJCXJldHVybiBo YzsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBoYXNoX2NlbGwgKl9f Z2V0X3V1aWRfY2VsbChjb25zdCBjaGFyICpzdHIpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqdG1w OworCXN0cnVjdCBoYXNoX2NlbGwgKmhjOworCXVuc2lnbmVkIGludCBoID0gaGFzaF9zdHIoc3Ry KTsKKworCWxpc3RfZm9yX2VhY2ggKHRtcCwgX3V1aWRfYnVja2V0cyArIGgpIHsKKwkJaGMgPSBs aXN0X2VudHJ5KHRtcCwgc3RydWN0IGhhc2hfY2VsbCwgdXVpZF9saXN0KTsKKwkJaWYgKCFzdHJj bXAoaGMtPnV1aWQsIHN0cikpCisJCQlyZXR1cm4gaGM7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9 CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0KKyAqIEluc2VydGluZywgcmVtb3ZpbmcgYW5kIHJlbmFtaW5nIGEgZGV2 aWNlLgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGlubGluZSBjaGFyICprc3RyZHVwKGNvbnN0IGNoYXIg KnN0cikKK3sKKwljaGFyICpyID0ga21hbGxvYyhzdHJsZW4oc3RyKSArIDEsIEdGUF9LRVJORUwp OworCWlmIChyKQorCQlzdHJjcHkociwgc3RyKTsKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIHN0 cnVjdCBoYXNoX2NlbGwgKmFsbG9jX2NlbGwoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAq dXVpZCwKKwkJCQkgICAgc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kKQoreworCXN0cnVjdCBoYXNo X2NlbGwgKmhjOworCisJaGMgPSBrbWFsbG9jKHNpemVvZigqaGMpLCBHRlBfS0VSTkVMKTsKKwlp ZiAoIWhjKQorCQlyZXR1cm4gTlVMTDsKKworCWhjLT5uYW1lID0ga3N0cmR1cChuYW1lKTsKKwlp ZiAoIWhjLT5uYW1lKSB7CisJCWtmcmVlKGhjKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYg KCF1dWlkKQorCQloYy0+dXVpZCA9IE5VTEw7CisKKwllbHNlIHsKKwkJaGMtPnV1aWQgPSBrc3Ry ZHVwKHV1aWQpOworCQlpZiAoIWhjLT51dWlkKSB7CisJCQlrZnJlZShoYy0+bmFtZSk7CisJCQlr ZnJlZShoYyk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0KKworCUlOSVRfTElTVF9IRUFEKCZo Yy0+bmFtZV9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmaGMtPnV1aWRfbGlzdCk7CisJaGMtPm1k ID0gbWQ7CisJaGMtPm5ld19tYXAgPSBOVUxMOworCXJldHVybiBoYzsKK30KKworc3RhdGljIHZv aWQgZnJlZV9jZWxsKHN0cnVjdCBoYXNoX2NlbGwgKmhjKQoreworCWlmIChoYykgeworCQlrZnJl ZShoYy0+bmFtZSk7CisJCWtmcmVlKGhjLT51dWlkKTsKKwkJa2ZyZWUoaGMpOworCX0KK30KKwor LyoKKyAqIGRldmZzIHN0dWZmLgorICovCitzdGF0aWMgaW50IHJlZ2lzdGVyX3dpdGhfZGV2ZnMo c3RydWN0IGhhc2hfY2VsbCAqaGMpCit7CisJa2Rldl90IGRldiA9IGRtX2tkZXYoaGMtPm1kKTsK KworCWhjLT5kZXZmc19lbnRyeSA9CisJICAgIGRldmZzX3JlZ2lzdGVyKF9kZXZfZGlyLCBoYy0+ bmFtZSwgREVWRlNfRkxfQ1VSUkVOVF9PV05FUiwKKwkJCSAgIG1ham9yKGRldiksIG1pbm9yKGRl diksCisJCQkgICBTX0lGQkxLIHwgU19JUlVTUiB8IFNfSVdVU1IgfCBTX0lSR1JQLAorCQkJICAg JmRtX2Jsa19kb3BzLCBOVUxMKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVucmVn aXN0ZXJfd2l0aF9kZXZmcyhzdHJ1Y3QgaGFzaF9jZWxsICpoYykKK3sKKwlkZXZmc191bnJlZ2lz dGVyKGhjLT5kZXZmc19lbnRyeSk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGUga2Rldl90 IGFuZCB1dWlkIG9mIGEgZGV2aWNlIGNhbiBuZXZlciBjaGFuZ2Ugb25jZSBpdCBpcworICogaW5p dGlhbGx5IGluc2VydGVkLgorICovCitpbnQgZG1faGFzaF9pbnNlcnQoY29uc3QgY2hhciAqbmFt ZSwgY29uc3QgY2hhciAqdXVpZCwgc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kKQoreworCXN0cnVj dCBoYXNoX2NlbGwgKmNlbGw7CisKKwkvKgorCSAqIEFsbG9jYXRlIHRoZSBuZXcgY2VsbHMuCisJ ICovCisJY2VsbCA9IGFsbG9jX2NlbGwobmFtZSwgdXVpZCwgbWQpOworCWlmICghY2VsbCkKKwkJ cmV0dXJuIC1FTk9NRU07CisKKwkvKgorCSAqIEluc2VydCB0aGUgY2VsbCBpbnRvIGJvdGggaGFz aCB0YWJsZXMuCisJICovCisJZG93bl93cml0ZSgmX2hhc2hfbG9jayk7CisJaWYgKF9fZ2V0X25h bWVfY2VsbChuYW1lKSkKKwkJZ290byBiYWQ7CisKKwlsaXN0X2FkZCgmY2VsbC0+bmFtZV9saXN0 LCBfbmFtZV9idWNrZXRzICsgaGFzaF9zdHIobmFtZSkpOworCisJaWYgKHV1aWQpIHsKKwkJaWYg KF9fZ2V0X3V1aWRfY2VsbCh1dWlkKSkgeworCQkJbGlzdF9kZWwoJmNlbGwtPm5hbWVfbGlzdCk7 CisJCQlnb3RvIGJhZDsKKwkJfQorCQlsaXN0X2FkZCgmY2VsbC0+dXVpZF9saXN0LCBfdXVpZF9i dWNrZXRzICsgaGFzaF9zdHIodXVpZCkpOworCX0KKwlyZWdpc3Rlcl93aXRoX2RldmZzKGNlbGwp OworCWRtX2dldChtZCk7CisJdXBfd3JpdGUoJl9oYXNoX2xvY2spOworCisJcmV0dXJuIDA7CisK KyAgICAgIGJhZDoKKwl1cF93cml0ZSgmX2hhc2hfbG9jayk7CisJZnJlZV9jZWxsKGNlbGwpOwor CXJldHVybiAtRUJVU1k7Cit9CisKK3ZvaWQgX19oYXNoX3JlbW92ZShzdHJ1Y3QgaGFzaF9jZWxs ICpoYykKK3sKKwkvKiByZW1vdmUgZnJvbSB0aGUgZGV2IGhhc2ggKi8KKwlsaXN0X2RlbCgmaGMt PnV1aWRfbGlzdCk7CisJbGlzdF9kZWwoJmhjLT5uYW1lX2xpc3QpOworCXVucmVnaXN0ZXJfd2l0 aF9kZXZmcyhoYyk7CisJZG1fcHV0KGhjLT5tZCk7CisJaWYgKGhjLT5uZXdfbWFwKQorCQlkbV90 YWJsZV9wdXQoaGMtPm5ld19tYXApOworCWZyZWVfY2VsbChoYyk7Cit9CisKK3ZvaWQgZG1faGFz aF9yZW1vdmVfYWxsKHZvaWQpCit7CisJaW50IGk7CisJc3RydWN0IGhhc2hfY2VsbCAqaGM7CisJ c3RydWN0IGxpc3RfaGVhZCAqdG1wLCAqbjsKKworCWRvd25fd3JpdGUoJl9oYXNoX2xvY2spOwor CWZvciAoaSA9IDA7IGkgPCBOVU1fQlVDS0VUUzsgaSsrKSB7CisJCWxpc3RfZm9yX2VhY2hfc2Fm ZSAodG1wLCBuLCBfbmFtZV9idWNrZXRzICsgaSkgeworCQkJaGMgPSBsaXN0X2VudHJ5KHRtcCwg c3RydWN0IGhhc2hfY2VsbCwgbmFtZV9saXN0KTsKKwkJCV9faGFzaF9yZW1vdmUoaGMpOworCQl9 CisJfQorCXVwX3dyaXRlKCZfaGFzaF9sb2NrKTsKK30KKworaW50IGRtX2hhc2hfcmVuYW1lKGNv bnN0IGNoYXIgKm9sZCwgY29uc3QgY2hhciAqbmV3KQoreworCWNoYXIgKm5ld19uYW1lLCAqb2xk X25hbWU7CisJc3RydWN0IGhhc2hfY2VsbCAqaGM7CisKKwkvKgorCSAqIGR1cGxpY2F0ZSBuZXcu CisJICovCisJbmV3X25hbWUgPSBrc3RyZHVwKG5ldyk7CisJaWYgKCFuZXdfbmFtZSkKKwkJcmV0 dXJuIC1FTk9NRU07CisKKwlkb3duX3dyaXRlKCZfaGFzaF9sb2NrKTsKKworCS8qCisJICogSXMg bmV3IGZyZWUgPworCSAqLworCWhjID0gX19nZXRfbmFtZV9jZWxsKG5ldyk7CisJaWYgKGhjKSB7 CisJCURNV0FSTigiYXNrZWQgdG8gcmVuYW1lIHRvIGFuIGFscmVhZHkgZXhpc3RpbmcgbmFtZSAl cyAtPiAlcyIsCisJCSAgICAgICBvbGQsIG5ldyk7CisJCXVwX3dyaXRlKCZfaGFzaF9sb2NrKTsK KwkJa2ZyZWUobmV3X25hbWUpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCS8qCisJICogSXMg dGhlcmUgc3VjaCBhIGRldmljZSBhcyAnb2xkJyA/CisJICovCisJaGMgPSBfX2dldF9uYW1lX2Nl bGwob2xkKTsKKwlpZiAoIWhjKSB7CisJCURNV0FSTigiYXNrZWQgdG8gcmVuYW1lIGEgbm9uIGV4 aXN0ZW50IGRldmljZSAlcyAtPiAlcyIsCisJCSAgICAgICBvbGQsIG5ldyk7CisJCXVwX3dyaXRl KCZfaGFzaF9sb2NrKTsKKwkJa2ZyZWUobmV3X25hbWUpOworCQlyZXR1cm4gLUVOWElPOworCX0K KworCS8qCisJICogcmVuYW1lIGFuZCBtb3ZlIHRoZSBuYW1lIGNlbGwuCisJICovCisJbGlzdF9k ZWwoJmhjLT5uYW1lX2xpc3QpOworCW9sZF9uYW1lID0gaGMtPm5hbWU7CisJaGMtPm5hbWUgPSBu ZXdfbmFtZTsKKwlsaXN0X2FkZCgmaGMtPm5hbWVfbGlzdCwgX25hbWVfYnVja2V0cyArIGhhc2hf c3RyKG5ld19uYW1lKSk7CisKKwkvKiByZW5hbWUgdGhlIGRldmljZSBub2RlIGluIGRldmZzICov CisJdW5yZWdpc3Rlcl93aXRoX2RldmZzKGhjKTsKKwlyZWdpc3Rlcl93aXRoX2RldmZzKGhjKTsK KworCXVwX3dyaXRlKCZfaGFzaF9sb2NrKTsKKwlrZnJlZShvbGRfbmFtZSk7CisJcmV0dXJuIDA7 Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0KKyAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBpb2N0bCBjb21tYW5k cworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0qLworLyoKKyAqIEFsbCB0aGUgaW9jdGwgY29tbWFuZHMgZ2V0IGRpc3BhdGNo ZWQgdG8gZnVuY3Rpb25zIHdpdGggdGhpcworICogcHJvdG90eXBlLgorICovCit0eXBlZGVmIGlu dCAoKmlvY3RsX2ZuKShzdHJ1Y3QgZG1faW9jdGwgKnBhcmFtLCBzaXplX3QgcGFyYW1fc2l6ZSk7 CisKK3N0YXRpYyBpbnQgcmVtb3ZlX2FsbChzdHJ1Y3QgZG1faW9jdGwgKnBhcmFtLCBzaXplX3Qg cGFyYW1fc2l6ZSkKK3sKKwlkbV9oYXNoX3JlbW92ZV9hbGwoKTsKKwlwYXJhbS0+ZGF0YV9zaXpl ID0gMDsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFJvdW5kIHVwIHRoZSBwdHIgdG8gYW4gOC1i eXRlIGJvdW5kYXJ5LgorICovCisjZGVmaW5lIEFMSUdOX01BU0sgNworc3RhdGljIGlubGluZSB2 b2lkICphbGlnbl9wdHIodm9pZCAqcHRyKQoreworCXJldHVybiAodm9pZCAqKSAoKChzaXplX3Qp IChwdHIgKyBBTElHTl9NQVNLKSkgJiB+QUxJR05fTUFTSyk7Cit9CisKKy8qCisgKiBSZXRyaWV2 ZXMgdGhlIGRhdGEgcGF5bG9hZCBidWZmZXIgZnJvbSBhbiBhbHJlYWR5IGFsbG9jYXRlZAorICog c3RydWN0IGRtX2lvY3RsLgorICovCitzdGF0aWMgdm9pZCAqZ2V0X3Jlc3VsdF9idWZmZXIoc3Ry dWN0IGRtX2lvY3RsICpwYXJhbSwgc2l6ZV90IHBhcmFtX3NpemUsCisJCQkgICAgICAgc2l6ZV90 ICpsZW4pCit7CisJcGFyYW0tPmRhdGFfc3RhcnQgPSBhbGlnbl9wdHIocGFyYW0gKyAxKSAtICh2 b2lkICopIHBhcmFtOworCisJaWYgKHBhcmFtLT5kYXRhX3N0YXJ0IDwgcGFyYW1fc2l6ZSkKKwkJ KmxlbiA9IHBhcmFtX3NpemUgLSBwYXJhbS0+ZGF0YV9zdGFydDsKKwllbHNlCisJCSpsZW4gPSAw OworCisJcmV0dXJuICgodm9pZCAqKSBwYXJhbSkgKyBwYXJhbS0+ZGF0YV9zdGFydDsKK30KKwor c3RhdGljIGludCBsaXN0X2RldmljZXMoc3RydWN0IGRtX2lvY3RsICpwYXJhbSwgc2l6ZV90IHBh cmFtX3NpemUpCit7CisJdW5zaWduZWQgaW50IGk7CisJc3RydWN0IGhhc2hfY2VsbCAqaGM7CisJ c2l6ZV90IGxlbiwgbmVlZGVkID0gMDsKKwlzdHJ1Y3QgZG1fbmFtZV9saXN0ICpubCwgKm9sZF9u bCA9IE5VTEw7CisKKwlkb3duX3dyaXRlKCZfaGFzaF9sb2NrKTsKKworCS8qCisJICogTG9vcCB0 aHJvdWdoIGFsbCB0aGUgZGV2aWNlcyB3b3JraW5nIG91dCBob3cgbXVjaAorCSAqIHNwYWNlIHdl IG5lZWQuCisJICovCisJZm9yIChpID0gMDsgaSA8IE5VTV9CVUNLRVRTOyBpKyspIHsKKwkJbGlz dF9mb3JfZWFjaF9lbnRyeSAoaGMsIF9uYW1lX2J1Y2tldHMgKyBpLCBuYW1lX2xpc3QpIHsKKwkJ CW5lZWRlZCArPSBzaXplb2Yoc3RydWN0IGRtX25hbWVfbGlzdCk7CisJCQluZWVkZWQgKz0gc3Ry bGVuKGhjLT5uYW1lKTsKKwkJCW5lZWRlZCArPSBBTElHTl9NQVNLOworCQl9CisJfQorCisJLyoK KwkgKiBHcmFiIG91ciBvdXRwdXQgYnVmZmVyLgorCSAqLworCW5sID0gZ2V0X3Jlc3VsdF9idWZm ZXIocGFyYW0sIHBhcmFtX3NpemUsICZsZW4pOworCWlmIChsZW4gPCBuZWVkZWQpIHsKKwkJcGFy YW0tPmZsYWdzIHw9IERNX0JVRkZFUl9GVUxMX0ZMQUc7CisJCWdvdG8gb3V0OworCX0KKwlwYXJh bS0+ZGF0YV9zaXplID0gcGFyYW0tPmRhdGFfc3RhcnQgKyBuZWVkZWQ7CisKKwlubC0+ZGV2ID0g MDsJLyogRmxhZ3Mgbm8gZGF0YSAqLworCisJLyoKKwkgKiBOb3cgbG9vcCB0aHJvdWdoIGZpbGxp bmcgb3V0IHRoZSBuYW1lcy4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0JVQ0tFVFM7IGkr KykgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5IChoYywgX25hbWVfYnVja2V0cyArIGksIG5hbWVf bGlzdCkgeworCQkJaWYgKG9sZF9ubCkKKwkJCQlvbGRfbmwtPm5leHQgPSAodWludDMyX3QpICgo dm9pZCAqKSBubCAtCisJCQkJCQkJICAgKHZvaWQgKikgb2xkX25sKTsKKworCQkJbmwtPmRldiA9 IGRtX2tkZXYoaGMtPm1kKTsKKwkJCW5sLT5uZXh0ID0gMDsKKwkJCXN0cmNweShubC0+bmFtZSwg aGMtPm5hbWUpOworCisJCQlvbGRfbmwgPSBubDsKKwkJCW5sID0gYWxpZ25fcHRyKCgodm9pZCAq KSArK25sKSArIHN0cmxlbihoYy0+bmFtZSkgKyAxKTsKKwkJfQorCX0KKworIG91dDoKKwl1cF93 cml0ZSgmX2hhc2hfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfbmFt ZShjb25zdCBjaGFyICpuYW1lKQoreworCWlmIChzdHJjaHIobmFtZSwgJy8nKSkgeworCQlETVdB Uk4oImludmFsaWQgZGV2aWNlIG5hbWUiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0 dXJuIDA7Cit9CisKKy8qCisgKiBGaWxscyBpbiBhIGRtX2lvY3RsIHN0cnVjdHVyZSwgcmVhZHkg Zm9yIHNlbmRpbmcgYmFjayB0bworICogdXNlcmxhbmQuCisgKi8KK3N0YXRpYyBpbnQgX19kZXZf c3RhdHVzKHN0cnVjdCBtYXBwZWRfZGV2aWNlICptZCwgc3RydWN0IGRtX2lvY3RsICpwYXJhbSkK K3sKKwlrZGV2X3QgZGV2ID0gZG1fa2RldihtZCk7CisJc3RydWN0IGRtX3RhYmxlICp0YWJsZTsK KwlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2OworCisJcGFyYW0tPmZsYWdzICY9IH4oRE1fU1VT UEVORF9GTEFHIHwgRE1fUkVBRE9OTFlfRkxBRyB8CisJCQkgIERNX0FDVElWRV9QUkVTRU5UX0ZM QUcpOworCisJaWYgKGRtX3N1c3BlbmRlZChtZCkpCisJCXBhcmFtLT5mbGFncyB8PSBETV9TVVNQ RU5EX0ZMQUc7CisKKwlwYXJhbS0+ZGV2ID0ga2Rldl90X3RvX25yKGRldik7CisKKwlpZiAoaXNf cmVhZF9vbmx5KGRldikpCisJCXBhcmFtLT5mbGFncyB8PSBETV9SRUFET05MWV9GTEFHOworCisJ cGFyYW0tPmV2ZW50X25yID0gZG1fZ2V0X2V2ZW50X25yKG1kKTsKKworCXRhYmxlID0gZG1fZ2V0 X3RhYmxlKG1kKTsKKwlpZiAodGFibGUpIHsKKwkJcGFyYW0tPmZsYWdzIHw9IERNX0FDVElWRV9Q UkVTRU5UX0ZMQUc7CisJCXBhcmFtLT50YXJnZXRfY291bnQgPSBkbV90YWJsZV9nZXRfbnVtX3Rh cmdldHModGFibGUpOworCQlkbV90YWJsZV9wdXQodGFibGUpOworCX0gZWxzZQorCQlwYXJhbS0+ dGFyZ2V0X2NvdW50ID0gMDsKKworCWJkZXYgPSBiZGdldChwYXJhbS0+ZGV2KTsKKwlpZiAoIWJk ZXYpCisJCXJldHVybiAtRU5YSU87CisJcGFyYW0tPm9wZW5fY291bnQgPSBiZGV2LT5iZF9vcGVu ZXJzOworCWJkcHV0KGJkZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGV2X2Ny ZWF0ZShzdHJ1Y3QgZG1faW9jdGwgKnBhcmFtLCBzaXplX3QgcGFyYW1fc2l6ZSkKK3sKKwlpbnQg cjsKKwlrZGV2X3QgZGV2ID0gMDsKKwlzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQ7CisKKwlyID0g Y2hlY2tfbmFtZShwYXJhbS0+bmFtZSk7CisJaWYgKHIpCisJCXJldHVybiByOworCisJaWYgKHBh cmFtLT5mbGFncyAmIERNX1BFUlNJU1RFTlRfREVWX0ZMQUcpCisJCWRldiA9IHRvX2tkZXZfdChw YXJhbS0+ZGV2KTsKKworCXIgPSBkbV9jcmVhdGUoZGV2LCAmbWQpOworCWlmIChyKQorCQlyZXR1 cm4gcjsKKworCXIgPSBkbV9oYXNoX2luc2VydChwYXJhbS0+bmFtZSwgKnBhcmFtLT51dWlkID8g cGFyYW0tPnV1aWQgOiBOVUxMLCBtZCk7CisJaWYgKHIpIHsKKwkJZG1fcHV0KG1kKTsKKwkJcmV0 dXJuIHI7CisJfQorCisJcGFyYW0tPmZsYWdzICY9IH5ETV9JTkFDVElWRV9QUkVTRU5UX0ZMQUc7 CisKKwlyID0gX19kZXZfc3RhdHVzKG1kLCBwYXJhbSk7CisJZG1fcHV0KG1kKTsKKworCXJldHVy biByOworfQorCisvKgorICogQWx3YXlzIHVzZSBVVUlEIGZvciBsb29rdXBzIGlmIGl0J3MgcHJl c2VudCwgb3RoZXJ3aXNlIHVzZSBuYW1lLgorICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBoYXNo X2NlbGwgKl9fZmluZF9kZXZpY2VfaGFzaF9jZWxsKHN0cnVjdCBkbV9pb2N0bCAqcGFyYW0pCit7 CisJcmV0dXJuICpwYXJhbS0+dXVpZCA/CisJICAgIF9fZ2V0X3V1aWRfY2VsbChwYXJhbS0+dXVp ZCkgOiBfX2dldF9uYW1lX2NlbGwocGFyYW0tPm5hbWUpOworfQorCitzdGF0aWMgaW5saW5lIHN0 cnVjdCBtYXBwZWRfZGV2aWNlICpmaW5kX2RldmljZShzdHJ1Y3QgZG1faW9jdGwgKnBhcmFtKQor eworCXN0cnVjdCBoYXNoX2NlbGwgKmhjOworCXN0cnVjdCBtYXBwZWRfZGV2aWNlICptZCA9IE5V TEw7CisKKwlkb3duX3JlYWQoJl9oYXNoX2xvY2spOworCWhjID0gX19maW5kX2RldmljZV9oYXNo X2NlbGwocGFyYW0pOworCWlmIChoYykgeworCQltZCA9IGhjLT5tZDsKKworCQkvKgorCQkgKiBT bmVha2lseSB3cml0ZSBpbiBib3RoIHRoZSBuYW1lIGFuZCB0aGUgdXVpZAorCQkgKiB3aGlsZSB3 ZSBoYXZlIHRoZSBjZWxsLgorCQkgKi8KKwkJc3RybmNweShwYXJhbS0+bmFtZSwgaGMtPm5hbWUs IHNpemVvZihwYXJhbS0+bmFtZSkpOworCQlpZiAoaGMtPnV1aWQpCisJCQlzdHJuY3B5KHBhcmFt LT51dWlkLCBoYy0+dXVpZCwgc2l6ZW9mKHBhcmFtLT51dWlkKSAtIDEpOworCQllbHNlCisJCQlw YXJhbS0+dXVpZFswXSA9ICdcMCc7CisKKwkJaWYgKGhjLT5uZXdfbWFwKQorCQkJcGFyYW0tPmZs YWdzIHw9IERNX0lOQUNUSVZFX1BSRVNFTlRfRkxBRzsKKwkJZWxzZQorCQkJcGFyYW0tPmZsYWdz ICY9IH5ETV9JTkFDVElWRV9QUkVTRU5UX0ZMQUc7CisKKwkJZG1fZ2V0KG1kKTsKKwl9CisJdXBf cmVhZCgmX2hhc2hfbG9jayk7CisKKwlyZXR1cm4gbWQ7Cit9CisKK3N0YXRpYyBpbnQgZGV2X3Jl bW92ZShzdHJ1Y3QgZG1faW9jdGwgKnBhcmFtLCBzaXplX3QgcGFyYW1fc2l6ZSkKK3sKKwlzdHJ1 Y3QgaGFzaF9jZWxsICpoYzsKKworCWRvd25fd3JpdGUoJl9oYXNoX2xvY2spOworCWhjID0gX19m aW5kX2RldmljZV9oYXNoX2NlbGwocGFyYW0pOworCisJaWYgKCFoYykgeworCQlETVdBUk4oImRl dmljZSBkb2Vzbid0IGFwcGVhciB0byBiZSBpbiB0aGUgZGV2IGhhc2ggdGFibGUuIik7CisJCXVw X3dyaXRlKCZfaGFzaF9sb2NrKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwlfX2hhc2hfcmVt b3ZlKGhjKTsKKwl1cF93cml0ZSgmX2hhc2hfbG9jayk7CisJcGFyYW0tPmRhdGFfc2l6ZSA9IDA7 CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDaGVjayBhIHN0cmluZyBkb2Vzbid0IG92ZXJydW4g dGhlIGNodW5rIG9mCisgKiBtZW1vcnkgd2UgY29waWVkIGZyb20gdXNlcmxhbmQuCisgKi8KK3N0 YXRpYyBpbnQgaW52YWxpZF9zdHIoY2hhciAqc3RyLCB2b2lkICplbmQpCit7CisJd2hpbGUgKCh2 b2lkICopIHN0ciA8IGVuZCkKKwkJaWYgKCEqc3RyKyspCisJCQlyZXR1cm4gMDsKKworCXJldHVy biAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IGRldl9yZW5hbWUoc3RydWN0IGRtX2lvY3RsICpw YXJhbSwgc2l6ZV90IHBhcmFtX3NpemUpCit7CisJaW50IHI7CisJY2hhciAqbmV3X25hbWUgPSAo Y2hhciAqKSBwYXJhbSArIHBhcmFtLT5kYXRhX3N0YXJ0OworCisJaWYgKG5ld19uYW1lIDwgKGNo YXIgKikgKHBhcmFtICsgMSkgfHwKKwkgICAgaW52YWxpZF9zdHIobmV3X25hbWUsICh2b2lkICop IHBhcmFtICsgcGFyYW1fc2l6ZSkpIHsKKwkJRE1XQVJOKCJJbnZhbGlkIG5ldyBsb2dpY2FsIHZv bHVtZSBuYW1lIHN1cHBsaWVkLiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyID0gY2hl Y2tfbmFtZShuZXdfbmFtZSk7CisJaWYgKHIpCisJCXJldHVybiByOworCisJcGFyYW0tPmRhdGFf c2l6ZSA9IDA7CisJcmV0dXJuIGRtX2hhc2hfcmVuYW1lKHBhcmFtLT5uYW1lLCBuZXdfbmFtZSk7 Cit9CisKK3N0YXRpYyBpbnQgc3VzcGVuZChzdHJ1Y3QgZG1faW9jdGwgKnBhcmFtKQoreworCWlu dCByID0gMDsKKwlzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQ7CisKKwltZCA9IGZpbmRfZGV2aWNl KHBhcmFtKTsKKwlpZiAoIW1kKQorCQlyZXR1cm4gLUVOWElPOworCisJaWYgKCFkbV9zdXNwZW5k ZWQobWQpKQorCQlyID0gZG1fc3VzcGVuZChtZCk7CisKKwlpZiAoIXIpCisJCXIgPSBfX2Rldl9z dGF0dXMobWQsIHBhcmFtKTsKKworCWRtX3B1dChtZCk7CisJcmV0dXJuIHI7Cit9CisKK3N0YXRp YyBpbnQgcmVzdW1lKHN0cnVjdCBkbV9pb2N0bCAqcGFyYW0pCit7CisJaW50IHIgPSAwOworCXN0 cnVjdCBoYXNoX2NlbGwgKmhjOworCXN0cnVjdCBtYXBwZWRfZGV2aWNlICptZDsKKwlzdHJ1Y3Qg ZG1fdGFibGUgKm5ld19tYXA7CisKKwlkb3duX3dyaXRlKCZfaGFzaF9sb2NrKTsKKworCWhjID0g X19maW5kX2RldmljZV9oYXNoX2NlbGwocGFyYW0pOworCWlmICghaGMpIHsKKwkJRE1XQVJOKCJk ZXZpY2UgZG9lc24ndCBhcHBlYXIgdG8gYmUgaW4gdGhlIGRldiBoYXNoIHRhYmxlLiIpOworCQl1 cF93cml0ZSgmX2hhc2hfbG9jayk7CisJCXJldHVybiAtRU5YSU87CisJfQorCisJbWQgPSBoYy0+ bWQ7CisJZG1fZ2V0KG1kKTsKKworCW5ld19tYXAgPSBoYy0+bmV3X21hcDsKKwloYy0+bmV3X21h cCA9IE5VTEw7CisJcGFyYW0tPmZsYWdzICY9IH5ETV9JTkFDVElWRV9QUkVTRU5UX0ZMQUc7CisK Kwl1cF93cml0ZSgmX2hhc2hfbG9jayk7CisKKwkvKiBEbyB3ZSBuZWVkIHRvIGxvYWQgYSBuZXcg bWFwID8gKi8KKwlpZiAobmV3X21hcCkgeworCQkvKiBTdXNwZW5kIGlmIGl0IGlzbid0IGFscmVh ZHkgc3VzcGVuZGVkICovCisJCWlmICghZG1fc3VzcGVuZGVkKG1kKSkKKwkJCWRtX3N1c3BlbmQo bWQpOworCisJCXIgPSBkbV9zd2FwX3RhYmxlKG1kLCBuZXdfbWFwKTsKKwkJaWYgKHIpIHsKKwkJ CWRtX3B1dChtZCk7CisJCQlkbV90YWJsZV9wdXQobmV3X21hcCk7CisJCQlyZXR1cm4gcjsKKwkJ fQorCisJCWlmIChkbV90YWJsZV9nZXRfbW9kZShuZXdfbWFwKSAmIEZNT0RFX1dSSVRFKQorCQkJ c2V0X2RldmljZV9ybyhkbV9rZGV2KG1kKSwgMCk7CisJCWVsc2UKKwkJCXNldF9kZXZpY2Vfcm8o ZG1fa2RldihtZCksIDEpOworCisJCWRtX3RhYmxlX3B1dChuZXdfbWFwKTsKKwl9CisKKwlpZiAo ZG1fc3VzcGVuZGVkKG1kKSkKKwkJciA9IGRtX3Jlc3VtZShtZCk7CisKKwlpZiAoIXIpCisJCXIg PSBfX2Rldl9zdGF0dXMobWQsIHBhcmFtKTsKKworCWRtX3B1dChtZCk7CisJcmV0dXJuIHI7Cit9 CisKKy8qCisgKiBTZXQgb3IgdW5zZXQgdGhlIHN1c3BlbnNpb24gc3RhdGUgb2YgYSBkZXZpY2Uu CisgKiBJZiB0aGUgZGV2aWNlIGFscmVhZHkgaXMgaW4gdGhlIHJlcXVlc3RlZCBzdGF0ZSB3ZSBq dXN0IHJldHVybiBpdHMgc3RhdHVzLgorICovCitzdGF0aWMgaW50IGRldl9zdXNwZW5kKHN0cnVj dCBkbV9pb2N0bCAqcGFyYW0sIHNpemVfdCBwYXJhbV9zaXplKQoreworCWlmIChwYXJhbS0+Zmxh Z3MgJiBETV9TVVNQRU5EX0ZMQUcpCisJCXJldHVybiBzdXNwZW5kKHBhcmFtKTsKKworCXJldHVy biByZXN1bWUocGFyYW0pOworfQorCisvKgorICogQ29waWVzIGRldmljZSBpbmZvIGJhY2sgdG8g dXNlciBzcGFjZSwgdXNlZCBieQorICogdGhlIGNyZWF0ZSBhbmQgaW5mbyBpb2N0bHMuCisgKi8K K3N0YXRpYyBpbnQgZGV2X3N0YXR1cyhzdHJ1Y3QgZG1faW9jdGwgKnBhcmFtLCBzaXplX3QgcGFy YW1fc2l6ZSkKK3sKKwlpbnQgcjsKKwlzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQ7CisKKwltZCA9 IGZpbmRfZGV2aWNlKHBhcmFtKTsKKwlpZiAoIW1kKQorCQlyZXR1cm4gLUVOWElPOworCisJciA9 IF9fZGV2X3N0YXR1cyhtZCwgcGFyYW0pOworCWRtX3B1dChtZCk7CisJcmV0dXJuIHI7Cit9CisK Ky8qCisgKiBXYWl0IGZvciBhIGRldmljZSB0byByZXBvcnQgYW4gZXZlbnQKKyAqLworc3RhdGlj IGludCBkZXZfd2FpdChzdHJ1Y3QgZG1faW9jdGwgKnBhcmFtLCBzaXplX3QgcGFyYW1fc2l6ZSkK K3sKKwlpbnQgcjsKKwlzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQ7CisJREVDTEFSRV9XQUlUUVVF VUUod3EsIGN1cnJlbnQpOworCisJbWQgPSBmaW5kX2RldmljZShwYXJhbSk7CisJaWYgKCFtZCkK KwkJcmV0dXJuIC1FTlhJTzsKKworCS8qCisJICogV2FpdCBmb3IgYSBub3RpZmljYXRpb24gZXZl bnQKKwkgKi8KKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCWlmICgh ZG1fYWRkX3dhaXRfcXVldWUobWQsICZ3cSwgcGFyYW0tPmV2ZW50X25yKSkgeworCQlzY2hlZHVs ZSgpOworCQlkbV9yZW1vdmVfd2FpdF9xdWV1ZShtZCwgJndxKTsKKwl9CisJc2V0X2N1cnJlbnRf c3RhdGUoVEFTS19SVU5OSU5HKTsKKworCS8qCisJICogVGhlIHVzZXJsYW5kIHByb2dyYW0gaXMg Z29pbmcgdG8gd2FudCB0byBrbm93IHdoYXQKKwkgKiBjaGFuZ2VkIHRvIHRyaWdnZXIgdGhlIGV2 ZW50LCBzbyB3ZSBtYXkgYXMgd2VsbCB0ZWxsCisJICogaGltIGFuZCBzYXZlIGFuIGlvY3RsLgor CSAqLworCXIgPSBfX2Rldl9zdGF0dXMobWQsIHBhcmFtKTsKKworCWRtX3B1dChtZCk7CisJcmV0 dXJuIHI7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGdldF9tb2RlKHN0cnVjdCBkbV9pb2N0bCAq cGFyYW0pCit7CisJaW50IG1vZGUgPSBGTU9ERV9SRUFEIHwgRk1PREVfV1JJVEU7CisKKwlpZiAo cGFyYW0tPmZsYWdzICYgRE1fUkVBRE9OTFlfRkxBRykKKwkJbW9kZSA9IEZNT0RFX1JFQUQ7CisK KwlyZXR1cm4gbW9kZTsKK30KKworc3RhdGljIGludCBuZXh0X3RhcmdldChzdHJ1Y3QgZG1fdGFy Z2V0X3NwZWMgKmxhc3QsIHVpbnQzMl90IG5leHQsIHZvaWQgKmVuZCwKKwkJICAgICAgIHN0cnVj dCBkbV90YXJnZXRfc3BlYyAqKnNwZWMsIGNoYXIgKip0YXJnZXRfcGFyYW1zKQoreworCSpzcGVj ID0gKHN0cnVjdCBkbV90YXJnZXRfc3BlYyAqKSAoKHVuc2lnbmVkIGNoYXIgKikgbGFzdCArIG5l eHQpOworCSp0YXJnZXRfcGFyYW1zID0gKGNoYXIgKikgKCpzcGVjICsgMSk7CisKKwlpZiAoKnNw ZWMgPCAobGFzdCArIDEpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBpbnZhbGlkX3N0 cigqdGFyZ2V0X3BhcmFtcywgZW5kKTsKK30KKworc3RhdGljIGludCBwb3B1bGF0ZV90YWJsZShz dHJ1Y3QgZG1fdGFibGUgKnRhYmxlLCBzdHJ1Y3QgZG1faW9jdGwgKnBhcmFtLAorCQkJICBzaXpl X3QgcGFyYW1fc2l6ZSkKK3sKKwlpbnQgcjsKKwl1bnNpZ25lZCBpbnQgaSA9IDA7CisJc3RydWN0 IGRtX3RhcmdldF9zcGVjICpzcGVjID0gKHN0cnVjdCBkbV90YXJnZXRfc3BlYyAqKSBwYXJhbTsK Kwl1aW50MzJfdCBuZXh0ID0gcGFyYW0tPmRhdGFfc3RhcnQ7CisJdm9pZCAqZW5kID0gKHZvaWQg KikgcGFyYW0gKyBwYXJhbV9zaXplOworCWNoYXIgKnRhcmdldF9wYXJhbXM7CisKKwlpZiAoIXBh cmFtLT50YXJnZXRfY291bnQpIHsKKwkJRE1XQVJOKCJwb3B1bGF0ZV90YWJsZTogbm8gdGFyZ2V0 cyBzcGVjaWZpZWQiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZm9yIChpID0gMDsgaSA8 IHBhcmFtLT50YXJnZXRfY291bnQ7IGkrKykgeworCisJCXIgPSBuZXh0X3RhcmdldChzcGVjLCBu ZXh0LCBlbmQsICZzcGVjLCAmdGFyZ2V0X3BhcmFtcyk7CisJCWlmIChyKSB7CisJCQlETVdBUk4o InVuYWJsZSB0byBmaW5kIHRhcmdldCIpOworCQkJcmV0dXJuIHI7CisJCX0KKworCQlyID0gZG1f dGFibGVfYWRkX3RhcmdldCh0YWJsZSwgc3BlYy0+dGFyZ2V0X3R5cGUsCisJCQkJCShzZWN0b3Jf dCkgc3BlYy0+c2VjdG9yX3N0YXJ0LAorCQkJCQkoc2VjdG9yX3QpIHNwZWMtPmxlbmd0aCwKKwkJ CQkJdGFyZ2V0X3BhcmFtcyk7CisJCWlmIChyKSB7CisJCQlETVdBUk4oImVycm9yIGFkZGluZyB0 YXJnZXQgdG8gdGFibGUiKTsKKwkJCXJldHVybiByOworCQl9CisKKwkJbmV4dCA9IHNwZWMtPm5l eHQ7CisJfQorCisJcmV0dXJuIGRtX3RhYmxlX2NvbXBsZXRlKHRhYmxlKTsKK30KKworc3RhdGlj IGludCB0YWJsZV9sb2FkKHN0cnVjdCBkbV9pb2N0bCAqcGFyYW0sIHNpemVfdCBwYXJhbV9zaXpl KQoreworCWludCByOworCXN0cnVjdCBoYXNoX2NlbGwgKmhjOworCXN0cnVjdCBkbV90YWJsZSAq dDsKKworCXIgPSBkbV90YWJsZV9jcmVhdGUoJnQsIGdldF9tb2RlKHBhcmFtKSk7CisJaWYgKHIp CisJCXJldHVybiByOworCisJciA9IHBvcHVsYXRlX3RhYmxlKHQsIHBhcmFtLCBwYXJhbV9zaXpl KTsKKwlpZiAocikgeworCQlkbV90YWJsZV9wdXQodCk7CisJCXJldHVybiByOworCX0KKworCWRv d25fd3JpdGUoJl9oYXNoX2xvY2spOworCWhjID0gX19maW5kX2RldmljZV9oYXNoX2NlbGwocGFy YW0pOworCWlmICghaGMpIHsKKwkJRE1XQVJOKCJkZXZpY2UgZG9lc24ndCBhcHBlYXIgdG8gYmUg aW4gdGhlIGRldiBoYXNoIHRhYmxlLiIpOworCQl1cF93cml0ZSgmX2hhc2hfbG9jayk7CisJCXJl dHVybiAtRU5YSU87CisJfQorCisJaGMtPm5ld19tYXAgPSB0OworCXBhcmFtLT5mbGFncyB8PSBE TV9JTkFDVElWRV9QUkVTRU5UX0ZMQUc7CisKKwlyID0gX19kZXZfc3RhdHVzKGhjLT5tZCwgcGFy YW0pOworCXVwX3dyaXRlKCZfaGFzaF9sb2NrKTsKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGlu dCB0YWJsZV9jbGVhcihzdHJ1Y3QgZG1faW9jdGwgKnBhcmFtLCBzaXplX3QgcGFyYW1fc2l6ZSkK K3sKKwlpbnQgcjsKKwlzdHJ1Y3QgaGFzaF9jZWxsICpoYzsKKworCWRvd25fd3JpdGUoJl9oYXNo X2xvY2spOworCisJaGMgPSBfX2ZpbmRfZGV2aWNlX2hhc2hfY2VsbChwYXJhbSk7CisJaWYgKCFo YykgeworCQlETVdBUk4oImRldmljZSBkb2Vzbid0IGFwcGVhciB0byBiZSBpbiB0aGUgZGV2IGhh c2ggdGFibGUuIik7CisJCXVwX3dyaXRlKCZfaGFzaF9sb2NrKTsKKwkJcmV0dXJuIC1FTlhJTzsK Kwl9CisKKwlpZiAoaGMtPm5ld19tYXApIHsKKwkJZG1fdGFibGVfcHV0KGhjLT5uZXdfbWFwKTsK KwkJaGMtPm5ld19tYXAgPSBOVUxMOworCX0KKworCXBhcmFtLT5mbGFncyAmPSB+RE1fSU5BQ1RJ VkVfUFJFU0VOVF9GTEFHOworCisJciA9IF9fZGV2X3N0YXR1cyhoYy0+bWQsIHBhcmFtKTsKKwl1 cF93cml0ZSgmX2hhc2hfbG9jayk7CisJcmV0dXJuIHI7Cit9CisKKy8qCisgKiBSZXRyaWV2ZXMg YSBsaXN0IG9mIGRldmljZXMgdXNlZCBieSBhIHBhcnRpY3VsYXIgZG0gZGV2aWNlLgorICovCitz dGF0aWMgdm9pZCByZXRyaWV2ZV9kZXBzKHN0cnVjdCBkbV90YWJsZSAqdGFibGUsIHN0cnVjdCBk bV9pb2N0bCAqcGFyYW0sCisJCQkgIHNpemVfdCBwYXJhbV9zaXplKQoreworCXVuc2lnbmVkIGlu dCBjb3VudCA9IDA7CisJc3RydWN0IGxpc3RfaGVhZCAqdG1wOworCXNpemVfdCBsZW4sIG5lZWRl ZDsKKwlzdHJ1Y3QgZG1fdGFyZ2V0X2RlcHMgKmRlcHM7CisKKwlkZXBzID0gZ2V0X3Jlc3VsdF9i dWZmZXIocGFyYW0sIHBhcmFtX3NpemUsICZsZW4pOworCisJLyoKKwkgKiBDb3VudCB0aGUgZGV2 aWNlcy4KKwkgKi8KKwlsaXN0X2Zvcl9lYWNoKHRtcCwgZG1fdGFibGVfZ2V0X2RldmljZXModGFi bGUpKQorCQljb3VudCsrOworCisJLyoKKwkgKiBDaGVjayB3ZSBoYXZlIGVub3VnaCBzcGFjZS4K KwkgKi8KKwluZWVkZWQgPSBzaXplb2YoKmRlcHMpICsgKHNpemVvZigqZGVwcy0+ZGV2KSAqIGNv dW50KTsKKwlpZiAobGVuIDwgbmVlZGVkKSB7CisJCXBhcmFtLT5mbGFncyB8PSBETV9CVUZGRVJf RlVMTF9GTEFHOworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBGaWxsIGluIHRoZSBkZXZpY2Vz LgorCSAqLworCWRlcHMtPmNvdW50ID0gY291bnQ7CisJY291bnQgPSAwOworCWxpc3RfZm9yX2Vh Y2godG1wLCBkbV90YWJsZV9nZXRfZGV2aWNlcyh0YWJsZSkpIHsKKwkJc3RydWN0IGRtX2RldiAq ZGQgPSBsaXN0X2VudHJ5KHRtcCwgc3RydWN0IGRtX2RldiwgbGlzdCk7CisJCWRlcHMtPmRldltj b3VudCsrXSA9IGRkLT5iZGV2LT5iZF9kZXY7CisJfQorCisJcGFyYW0tPmRhdGFfc2l6ZSA9IHBh cmFtLT5kYXRhX3N0YXJ0ICsgbmVlZGVkOworfQorCitzdGF0aWMgaW50IHRhYmxlX2RlcHMoc3Ry dWN0IGRtX2lvY3RsICpwYXJhbSwgc2l6ZV90IHBhcmFtX3NpemUpCit7CisJaW50IHI7CisJc3Ry dWN0IG1hcHBlZF9kZXZpY2UgKm1kOworCXN0cnVjdCBkbV90YWJsZSAqdGFibGU7CisKKwltZCA9 IGZpbmRfZGV2aWNlKHBhcmFtKTsKKwlpZiAoIW1kKQorCQlyZXR1cm4gLUVOWElPOworCisJciA9 IF9fZGV2X3N0YXR1cyhtZCwgcGFyYW0pOworCWlmIChyKQorCQlnb3RvIG91dDsKKworCXRhYmxl ID0gZG1fZ2V0X3RhYmxlKG1kKTsKKwlpZiAodGFibGUpIHsKKwkJcmV0cmlldmVfZGVwcyh0YWJs ZSwgcGFyYW0sIHBhcmFtX3NpemUpOworCQlkbV90YWJsZV9wdXQodGFibGUpOworCX0KKworIG91 dDoKKwlkbV9wdXQobWQpOworCXJldHVybiByOworfQorCisvKgorICogQnVpbGQgdXAgdGhlIHN0 YXR1cyBzdHJ1Y3QgZm9yIGVhY2ggdGFyZ2V0CisgKi8KK3N0YXRpYyB2b2lkIHJldHJpZXZlX3N0 YXR1cyhzdHJ1Y3QgZG1fdGFibGUgKnRhYmxlLCBzdHJ1Y3QgZG1faW9jdGwgKnBhcmFtLAorCQkJ ICAgIHNpemVfdCBwYXJhbV9zaXplKQoreworCXVuc2lnbmVkIGludCBpLCBudW1fdGFyZ2V0czsK KwlzdHJ1Y3QgZG1fdGFyZ2V0X3NwZWMgKnNwZWM7CisJY2hhciAqb3V0YnVmLCAqb3V0cHRyOwor CXN0YXR1c190eXBlX3QgdHlwZTsKKwlzaXplX3QgcmVtYWluaW5nLCBsZW4sIHVzZWQgPSAwOwor CisJb3V0cHRyID0gb3V0YnVmID0gZ2V0X3Jlc3VsdF9idWZmZXIocGFyYW0sIHBhcmFtX3NpemUs ICZsZW4pOworCisJaWYgKHBhcmFtLT5mbGFncyAmIERNX1NUQVRVU19UQUJMRV9GTEFHKQorCQl0 eXBlID0gU1RBVFVTVFlQRV9UQUJMRTsKKwllbHNlCisJCXR5cGUgPSBTVEFUVVNUWVBFX0lORk87 CisKKwkvKiBHZXQgYWxsIHRoZSB0YXJnZXQgaW5mbyAqLworCW51bV90YXJnZXRzID0gZG1fdGFi bGVfZ2V0X251bV90YXJnZXRzKHRhYmxlKTsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3RhcmdldHM7 IGkrKykgeworCQlzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSA9IGRtX3RhYmxlX2dldF90YXJnZXQodGFi bGUsIGkpOworCisJCXJlbWFpbmluZyA9IGxlbiAtIChvdXRwdHIgLSBvdXRidWYpOworCQlpZiAo cmVtYWluaW5nIDwgc2l6ZW9mKHN0cnVjdCBkbV90YXJnZXRfc3BlYykpIHsKKwkJCXBhcmFtLT5m bGFncyB8PSBETV9CVUZGRVJfRlVMTF9GTEFHOworCQkJYnJlYWs7CisJCX0KKworCQlzcGVjID0g KHN0cnVjdCBkbV90YXJnZXRfc3BlYyAqKSBvdXRwdHI7CisKKwkJc3BlYy0+c3RhdHVzID0gMDsK KwkJc3BlYy0+c2VjdG9yX3N0YXJ0ID0gdGktPmJlZ2luOworCQlzcGVjLT5sZW5ndGggPSB0aS0+ bGVuOworCQlzdHJuY3B5KHNwZWMtPnRhcmdldF90eXBlLCB0aS0+dHlwZS0+bmFtZSwKKwkJCXNp emVvZihzcGVjLT50YXJnZXRfdHlwZSkpOworCisJCW91dHB0ciArPSBzaXplb2Yoc3RydWN0IGRt X3RhcmdldF9zcGVjKTsKKwkJcmVtYWluaW5nID0gbGVuIC0gKG91dHB0ciAtIG91dGJ1Zik7CisK KwkJLyogR2V0IHRoZSBzdGF0dXMvdGFibGUgc3RyaW5nIGZyb20gdGhlIHRhcmdldCBkcml2ZXIg Ki8KKwkJaWYgKHRpLT50eXBlLT5zdGF0dXMpIHsKKwkJCWlmICh0aS0+dHlwZS0+c3RhdHVzKHRp LCB0eXBlLCBvdXRwdHIsIHJlbWFpbmluZykpIHsKKwkJCQlwYXJhbS0+ZmxhZ3MgfD0gRE1fQlVG RkVSX0ZVTExfRkxBRzsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlCisJCQlvdXRwdHJbMF0g PSAnXDAnOworCisJCW91dHB0ciArPSBzdHJsZW4ob3V0cHRyKSArIDE7CisJCXVzZWQgPSBwYXJh bS0+ZGF0YV9zdGFydCArIChvdXRwdHIgLSBvdXRidWYpOworCisJCWFsaWduX3B0cihvdXRwdHIp OworCQlzcGVjLT5uZXh0ID0gb3V0cHRyIC0gb3V0YnVmOworCX0KKworCWlmICh1c2VkKQorCQlw YXJhbS0+ZGF0YV9zaXplID0gdXNlZDsKKworCXBhcmFtLT50YXJnZXRfY291bnQgPSBudW1fdGFy Z2V0czsKK30KKworLyoKKyAqIFJldHVybiB0aGUgc3RhdHVzIG9mIGEgZGV2aWNlIGFzIGEgdGV4 dCBzdHJpbmcgZm9yIGVhY2gKKyAqIHRhcmdldC4KKyAqLworc3RhdGljIGludCB0YWJsZV9zdGF0 dXMoc3RydWN0IGRtX2lvY3RsICpwYXJhbSwgc2l6ZV90IHBhcmFtX3NpemUpCit7CisJaW50IHI7 CisJc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kOworCXN0cnVjdCBkbV90YWJsZSAqdGFibGU7CisK KwltZCA9IGZpbmRfZGV2aWNlKHBhcmFtKTsKKwlpZiAoIW1kKQorCQlyZXR1cm4gLUVOWElPOwor CisJciA9IF9fZGV2X3N0YXR1cyhtZCwgcGFyYW0pOworCWlmIChyKQorCQlnb3RvIG91dDsKKyAK Kwl0YWJsZSA9IGRtX2dldF90YWJsZShtZCk7CisJaWYgKHRhYmxlKSB7CisJCXJldHJpZXZlX3N0 YXR1cyh0YWJsZSwgcGFyYW0sIHBhcmFtX3NpemUpOworCQlkbV90YWJsZV9wdXQodGFibGUpOwor CX0KKworIG91dDoKKwlkbV9wdXQobWQpOworCXJldHVybiByOworfQorCisvKi0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisg KiBJbXBsZW1lbnRhdGlvbiBvZiBvcGVuL2Nsb3NlL2lvY3RsIG9uIHRoZSBzcGVjaWFsIGNoYXIK KyAqIGRldmljZS4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBpb2N0bF9mbiBsb29rdXBfaW9jdGwodW5z aWduZWQgaW50IGNtZCkKK3sKKwlzdGF0aWMgc3RydWN0IHsKKwkJaW50IGNtZDsKKwkJaW9jdGxf Zm4gZm47CisJfSBfaW9jdGxzW10gPSB7CisJCXtETV9WRVJTSU9OX0NNRCwgTlVMTH0sCS8qIHZl cnNpb24gaXMgZGVhbHQgd2l0aCBlbHNld2hlcmUgKi8KKwkJe0RNX1JFTU9WRV9BTExfQ01ELCBy ZW1vdmVfYWxsfSwKKwkJe0RNX0xJU1RfREVWSUNFU19DTUQsIGxpc3RfZGV2aWNlc30sCisKKwkJ e0RNX0RFVl9DUkVBVEVfQ01ELCBkZXZfY3JlYXRlfSwKKwkJe0RNX0RFVl9SRU1PVkVfQ01ELCBk ZXZfcmVtb3ZlfSwKKwkJe0RNX0RFVl9SRU5BTUVfQ01ELCBkZXZfcmVuYW1lfSwKKwkJe0RNX0RF Vl9TVVNQRU5EX0NNRCwgZGV2X3N1c3BlbmR9LAorCQl7RE1fREVWX1NUQVRVU19DTUQsIGRldl9z dGF0dXN9LAorCQl7RE1fREVWX1dBSVRfQ01ELCBkZXZfd2FpdH0sCisKKwkJe0RNX1RBQkxFX0xP QURfQ01ELCB0YWJsZV9sb2FkfSwKKwkJe0RNX1RBQkxFX0NMRUFSX0NNRCwgdGFibGVfY2xlYXJ9 LAorCQl7RE1fVEFCTEVfREVQU19DTUQsIHRhYmxlX2RlcHN9LAorCQl7RE1fVEFCTEVfU1RBVFVT X0NNRCwgdGFibGVfc3RhdHVzfQorCX07CisKKwlyZXR1cm4gKGNtZCA+PSBBUlJBWV9TSVpFKF9p b2N0bHMpKSA/IE5VTEwgOiBfaW9jdGxzW2NtZF0uZm47Cit9CisKKy8qCisgKiBBcyB3ZWxsIGFz IGNoZWNraW5nIHRoZSB2ZXJzaW9uIGNvbXBhdGliaWxpdHkgdGhpcyBhbHdheXMKKyAqIGNvcGll cyB0aGUga2VybmVsIGludGVyZmFjZSB2ZXJzaW9uIG91dC4KKyAqLworc3RhdGljIGludCBjaGVj a192ZXJzaW9uKHVuc2lnbmVkIGludCBjbWQsIHN0cnVjdCBkbV9pb2N0bCAqdXNlcikKK3sKKwl1 aW50MzJfdCB2ZXJzaW9uWzNdOworCWludCByID0gMDsKKworCWlmIChjb3B5X2Zyb21fdXNlcih2 ZXJzaW9uLCB1c2VyLT52ZXJzaW9uLCBzaXplb2YodmVyc2lvbikpKQorCQlyZXR1cm4gLUVGQVVM VDsKKworCWlmICgoRE1fVkVSU0lPTl9NQUpPUiAhPSB2ZXJzaW9uWzBdKSB8fAorCSAgICAoRE1f VkVSU0lPTl9NSU5PUiA8IHZlcnNpb25bMV0pKSB7CisJCURNV0FSTigiaW9jdGwgaW50ZXJmYWNl IG1pc21hdGNoOiAiCisJCSAgICAgICAia2VybmVsKCV1LiV1LiV1KSwgdXNlcigldS4ldS4ldSks IGNtZCglZCkiLAorCQkgICAgICAgRE1fVkVSU0lPTl9NQUpPUiwgRE1fVkVSU0lPTl9NSU5PUiwK KwkJICAgICAgIERNX1ZFUlNJT05fUEFUQ0hMRVZFTCwKKwkJICAgICAgIHZlcnNpb25bMF0sIHZl cnNpb25bMV0sIHZlcnNpb25bMl0sIGNtZCk7CisJCXIgPSAtRUlOVkFMOworCX0KKworCS8qCisJ ICogRmlsbCBpbiB0aGUga2VybmVsIHZlcnNpb24uCisJICovCisJdmVyc2lvblswXSA9IERNX1ZF UlNJT05fTUFKT1I7CisJdmVyc2lvblsxXSA9IERNX1ZFUlNJT05fTUlOT1I7CisJdmVyc2lvblsy XSA9IERNX1ZFUlNJT05fUEFUQ0hMRVZFTDsKKwlpZiAoY29weV90b191c2VyKHVzZXItPnZlcnNp b24sIHZlcnNpb24sIHNpemVvZih2ZXJzaW9uKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0 dXJuIHI7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfcGFyYW1zKHN0cnVjdCBkbV9pb2N0bCAqcGFy YW0pCit7CisJdmZyZWUocGFyYW0pOworfQorCitzdGF0aWMgaW50IGNvcHlfcGFyYW1zKHN0cnVj dCBkbV9pb2N0bCAqdXNlciwgc3RydWN0IGRtX2lvY3RsICoqcGFyYW0pCit7CisJc3RydWN0IGRt X2lvY3RsIHRtcCwgKmRtaTsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmdG1wLCB1c2VyLCBzaXpl b2YodG1wKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKHRtcC5kYXRhX3NpemUgPCBzaXpl b2YodG1wKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkbWkgPSAoc3RydWN0IGRtX2lvY3RsICop IHZtYWxsb2ModG1wLmRhdGFfc2l6ZSk7CisJaWYgKCFkbWkpCisJCXJldHVybiAtRU5PTUVNOwor CisJaWYgKGNvcHlfZnJvbV91c2VyKGRtaSwgdXNlciwgdG1wLmRhdGFfc2l6ZSkpIHsKKwkJdmZy ZWUoZG1pKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJKnBhcmFtID0gZG1pOworCXJldHVy biAwOworfQorCitzdGF0aWMgaW50IHZhbGlkYXRlX3BhcmFtcyh1aW50IGNtZCwgc3RydWN0IGRt X2lvY3RsICpwYXJhbSkKK3sKKwkvKiBBbHdheXMgY2xlYXIgdGhpcyBmbGFnICovCisJcGFyYW0t PmZsYWdzICY9IH5ETV9CVUZGRVJfRlVMTF9GTEFHOworCisJLyogSWdub3JlcyBwYXJhbWV0ZXJz ICovCisJaWYgKGNtZCA9PSBETV9SRU1PVkVfQUxMX0NNRCB8fCBjbWQgPT0gRE1fTElTVF9ERVZJ Q0VTX0NNRCkKKwkJcmV0dXJuIDA7CisKKwkvKiBVbmxlc3MgY3JlYXRpbmcsIGVpdGhlciBuYW1l IG9yIHV1aWQgYnV0IG5vdCBib3RoICovCisJaWYgKGNtZCAhPSBETV9ERVZfQ1JFQVRFX0NNRCkg eworCQlpZiAoKCEqcGFyYW0tPnV1aWQgJiYgISpwYXJhbS0+bmFtZSkgfHwKKwkJICAgICgqcGFy YW0tPnV1aWQgJiYgKnBhcmFtLT5uYW1lKSkgeworCQkJRE1XQVJOKCJvbmUgb2YgbmFtZSBvciB1 dWlkIG11c3QgYmUgc3VwcGxpZWQsIGNtZCgldSkiLAorCQkJICAgICAgIGNtZCk7CisJCQlyZXR1 cm4gLUVJTlZBTDsKKwkJfQorCX0KKworCS8qIEVuc3VyZSBzdHJpbmdzIGFyZSB0ZXJtaW5hdGVk ICovCisJcGFyYW0tPm5hbWVbRE1fTkFNRV9MRU4gLSAxXSA9ICdcMCc7CisJcGFyYW0tPnV1aWRb RE1fVVVJRF9MRU4gLSAxXSA9ICdcMCc7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBj dGxfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCSAgICAg dWludCBjb21tYW5kLCB1bG9uZyB1KQoreworCWludCByID0gMDsKKwl1bnNpZ25lZCBpbnQgY21k OworCXN0cnVjdCBkbV9pb2N0bCAqcGFyYW07CisJc3RydWN0IGRtX2lvY3RsICp1c2VyID0gKHN0 cnVjdCBkbV9pb2N0bCAqKSB1OworCWlvY3RsX2ZuIGZuID0gTlVMTDsKKwlzaXplX3QgcGFyYW1f c2l6ZTsKKworCS8qIG9ubHkgcm9vdCBjYW4gcGxheSB3aXRoIHRoaXMgKi8KKwlpZiAoIWNhcGFi bGUoQ0FQX1NZU19BRE1JTikpCisJCXJldHVybiAtRUFDQ0VTOworCisJaWYgKF9JT0NfVFlQRShj b21tYW5kKSAhPSBETV9JT0NUTCkKKwkJcmV0dXJuIC1FTk9UVFk7CisKKwljbWQgPSBfSU9DX05S KGNvbW1hbmQpOworCisJLyoKKwkgKiBDaGVjayB0aGUgaW50ZXJmYWNlIHZlcnNpb24gcGFzc2Vk IGluLiAgVGhpcyBhbHNvCisJICogd3JpdGVzIG91dCB0aGUga2VybmVsJ3MgaW50ZXJmYWNlIHZl cnNpb24uCisJICovCisJciA9IGNoZWNrX3ZlcnNpb24oY21kLCB1c2VyKTsKKwlpZiAocikKKwkJ cmV0dXJuIHI7CisKKwkvKgorCSAqIE5vdGhpbmcgbW9yZSB0byBkbyBmb3IgdGhlIHZlcnNpb24g Y29tbWFuZC4KKwkgKi8KKwlpZiAoY21kID09IERNX1ZFUlNJT05fQ01EKQorCQlyZXR1cm4gMDsK KworCWZuID0gbG9va3VwX2lvY3RsKGNtZCk7CisJaWYgKCFmbikgeworCQlETVdBUk4oImRtX2N0 bF9pb2N0bDogdW5rbm93biBjb21tYW5kIDB4JXgiLCBjb21tYW5kKTsKKwkJcmV0dXJuIC1FTk9U VFk7CisJfQorCisJLyoKKwkgKiBGSVhNRTogSSBkb24ndCBsaWtlIHRoaXMsIHdlJ3JlIHRyeWlu ZyB0byBhdm9pZCBsb3cKKwkgKiBtZW1vcnkgaXNzdWVzIHdoZW4gYSBkZXZpY2UgaXMgc3VzcGVu ZGVkLgorCSAqLworCWN1cnJlbnQtPmZsYWdzIHw9IFBGX01FTUFMTE9DOworCisJLyoKKwkgKiBD b3B5IHRoZSBwYXJhbWV0ZXJzIGludG8ga2VybmVsIHNwYWNlLgorCSAqLworCXIgPSBjb3B5X3Bh cmFtcyh1c2VyLCAmcGFyYW0pOworCWlmIChyKSB7CisJCWN1cnJlbnQtPmZsYWdzICY9IH5QRl9N RU1BTExPQzsKKwkJcmV0dXJuIHI7CisJfQorCisJciA9IHZhbGlkYXRlX3BhcmFtcyhjbWQsIHBh cmFtKTsKKwlpZiAocikKKwkJZ290byBvdXQ7CisKKwlwYXJhbV9zaXplID0gcGFyYW0tPmRhdGFf c2l6ZTsKKwlwYXJhbS0+ZGF0YV9zaXplID0gc2l6ZW9mKCpwYXJhbSk7CisJciA9IGZuKHBhcmFt LCBwYXJhbV9zaXplKTsKKworCS8qCisJICogQ29weSB0aGUgcmVzdWx0cyBiYWNrIHRvIHVzZXJs YW5kLgorCSAqLworCWlmICghciAmJiBjb3B5X3RvX3VzZXIodXNlciwgcGFyYW0sIHBhcmFtLT5k YXRhX3NpemUpKQorCQlyID0gLUVGQVVMVDsKKworIG91dDoKKwlmcmVlX3BhcmFtcyhwYXJhbSk7 CisJY3VycmVudC0+ZmxhZ3MgJj0gflBGX01FTUFMTE9DOworCXJldHVybiByOworfQorCitzdGF0 aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBfY3RsX2ZvcHMgPSB7CisJLmlvY3RsCSA9IGN0bF9p b2N0bCwKKwkub3duZXIJID0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgZGV2ZnNfaGFuZGxl X3QgX2N0bF9oYW5kbGU7CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBfZG1fbWlzYyA9IHsK KwkubWlub3IgPSBNSVNDX0RZTkFNSUNfTUlOT1IsCisJLm5hbWUgID0gRE1fTkFNRSwKKwkuZm9w cyAgPSAmX2N0bF9mb3BzCit9OworCisvKgorICogQ3JlYXRlIG1pc2MgY2hhcmFjdGVyIGRldmlj ZSBhbmQgbGluayB0byBETV9ESVIvY29udHJvbC4KKyAqLworaW50IF9faW5pdCBkbV9pbnRlcmZh Y2VfaW5pdCh2b2lkKQoreworCWludCByOworCWNoYXIgcm5hbWVbNjRdOworCisJciA9IGRtX2hh c2hfaW5pdCgpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCXIgPSBtaXNjX3JlZ2lzdGVyKCZf ZG1fbWlzYyk7CisJaWYgKHIpIHsKKwkJRE1FUlIoIm1pc2NfcmVnaXN0ZXIgZmFpbGVkIGZvciBj b250cm9sIGRldmljZSIpOworCQlkbV9oYXNoX2V4aXQoKTsKKwkJcmV0dXJuIHI7CisJfQorCisJ ciA9IGRldmZzX2dlbmVyYXRlX3BhdGgoX2RtX21pc2MuZGV2ZnNfaGFuZGxlLCBybmFtZSArIDMs CisJCQkJc2l6ZW9mIHJuYW1lIC0gMyk7CisJaWYgKHIgPT0gLUVOT1NZUykKKwkJZ290byBkb25l OwkvKiBkZXZmcyBub3QgcHJlc2VudCAqLworCisJaWYgKHIgPCAwKSB7CisJCURNRVJSKCJkZXZm c19nZW5lcmF0ZV9wYXRoIGZhaWxlZCBmb3IgY29udHJvbCBkZXZpY2UiKTsKKwkJZ290byBmYWls ZWQ7CisJfQorCisJc3RybmNweShybmFtZSArIHIsICIuLi8iLCAzKTsKKwlyID0gZGV2ZnNfbWtf c3ltbGluayhOVUxMLCBETV9ESVIgIi9jb250cm9sIiwKKwkJCSAgICAgREVWRlNfRkxfREVGQVVM VCwgcm5hbWUgKyByLCAmX2N0bF9oYW5kbGUsIE5VTEwpOworCWlmIChyKSB7CisJCURNRVJSKCJk ZXZmc19ta19zeW1saW5rIGZhaWxlZCBmb3IgY29udHJvbCBkZXZpY2UiKTsKKwkJZ290byBmYWls ZWQ7CisJfQorCWRldmZzX2F1dG9fdW5yZWdpc3RlcihfZG1fbWlzYy5kZXZmc19oYW5kbGUsIF9j dGxfaGFuZGxlKTsKKworICAgICAgZG9uZToKKwlETUlORk8oIiVkLiVkLiVkJXMgaW5pdGlhbGlz ZWQ6ICVzIiwgRE1fVkVSU0lPTl9NQUpPUiwKKwkgICAgICAgRE1fVkVSU0lPTl9NSU5PUiwgRE1f VkVSU0lPTl9QQVRDSExFVkVMLCBETV9WRVJTSU9OX0VYVFJBLAorCSAgICAgICBETV9EUklWRVJf RU1BSUwpOworCXJldHVybiAwOworCisgICAgICBmYWlsZWQ6CisJbWlzY19kZXJlZ2lzdGVyKCZf ZG1fbWlzYyk7CisJZG1faGFzaF9leGl0KCk7CisJcmV0dXJuIHI7Cit9CisKK3ZvaWQgZG1faW50 ZXJmYWNlX2V4aXQodm9pZCkKK3sKKwlpZiAobWlzY19kZXJlZ2lzdGVyKCZfZG1fbWlzYykgPCAw KQorCQlETUVSUigibWlzY19kZXJlZ2lzdGVyIGZhaWxlZCBmb3IgY29udHJvbCBkZXZpY2UiKTsK KworCWRtX2hhc2hfZXhpdCgpOworfQotLS0gZGlmZi9kcml2ZXJzL21kL2RtLWxpbmVhci5jCTE5 NzAtMDEtMDEgMDE6MDA6MDAuMDAwMDAwMDAwICswMTAwCisrKyBzb3VyY2UvZHJpdmVycy9tZC9k bS1saW5lYXIuYwkyMDAzLTA4LTI2IDEzOjU5OjA0LjAwMDAwMDAwMCArMDEwMApAQCAtMCwwICsx LDEyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMSBTaXN0aW5hIFNvZnR3YXJlIChVSykg TGltaXRlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTC4KKyAq LworCisjaW5jbHVkZSAiZG0uaCIKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1 ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxs aW51eC9zbGFiLmg+CisKKy8qCisgKiBMaW5lYXI6IG1hcHMgYSBsaW5lYXIgcmFuZ2Ugb2YgYSBk ZXZpY2UuCisgKi8KK3N0cnVjdCBsaW5lYXJfYyB7CisJc3RydWN0IGRtX2RldiAqZGV2OworCXNl Y3Rvcl90IHN0YXJ0OworfTsKKworLyoKKyAqIENvbnN0cnVjdCBhIGxpbmVhciBtYXBwaW5nOiA8 ZGV2X3BhdGg+IDxvZmZzZXQ+CisgKi8KK3N0YXRpYyBpbnQgbGluZWFyX2N0cihzdHJ1Y3QgZG1f dGFyZ2V0ICp0aSwgdW5zaWduZWQgaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCBs aW5lYXJfYyAqbGM7CisKKwlpZiAoYXJnYyAhPSAyKSB7CisJCXRpLT5lcnJvciA9ICJkbS1saW5l YXI6IE5vdCBlbm91Z2ggYXJndW1lbnRzIjsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbGMg PSBrbWFsbG9jKHNpemVvZigqbGMpLCBHRlBfS0VSTkVMKTsKKwlpZiAobGMgPT0gTlVMTCkgewor CQl0aS0+ZXJyb3IgPSAiZG0tbGluZWFyOiBDYW5ub3QgYWxsb2NhdGUgbGluZWFyIGNvbnRleHQi OworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpZiAoc3NjYW5mKGFyZ3ZbMV0sIFNFQ1RPUl9G T1JNQVQsICZsYy0+c3RhcnQpICE9IDEpIHsKKwkJdGktPmVycm9yID0gImRtLWxpbmVhcjogSW52 YWxpZCBkZXZpY2Ugc2VjdG9yIjsKKwkJZ290byBiYWQ7CisJfQorCisJaWYgKGRtX2dldF9kZXZp Y2UodGksIGFyZ3ZbMF0sIGxjLT5zdGFydCwgdGktPmxlbiwKKwkJCSAgZG1fdGFibGVfZ2V0X21v ZGUodGktPnRhYmxlKSwgJmxjLT5kZXYpKSB7CisJCXRpLT5lcnJvciA9ICJkbS1saW5lYXI6IERl dmljZSBsb29rdXAgZmFpbGVkIjsKKwkJZ290byBiYWQ7CisJfQorCisJdGktPnByaXZhdGUgPSBs YzsKKwlyZXR1cm4gMDsKKworICAgICAgYmFkOgorCWtmcmVlKGxjKTsKKwlyZXR1cm4gLUVJTlZB TDsKK30KKworc3RhdGljIHZvaWQgbGluZWFyX2R0cihzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSkKK3sK KwlzdHJ1Y3QgbGluZWFyX2MgKmxjID0gKHN0cnVjdCBsaW5lYXJfYyAqKSB0aS0+cHJpdmF0ZTsK KworCWRtX3B1dF9kZXZpY2UodGksIGxjLT5kZXYpOworCWtmcmVlKGxjKTsKK30KKworc3RhdGlj IGludCBsaW5lYXJfbWFwKHN0cnVjdCBkbV90YXJnZXQgKnRpLCBzdHJ1Y3QgYnVmZmVyX2hlYWQg KmJoLCBpbnQgcncsCisJCSAgICAgIHVuaW9uIG1hcF9pbmZvICptYXBfY29udGV4dCkKK3sKKwlz dHJ1Y3QgbGluZWFyX2MgKmxjID0gKHN0cnVjdCBsaW5lYXJfYyAqKSB0aS0+cHJpdmF0ZTsKKwor CWJoLT5iX3JkZXYgPSBsYy0+ZGV2LT5kZXY7CisJYmgtPmJfcnNlY3RvciA9IGxjLT5zdGFydCAr IChiaC0+Yl9yc2VjdG9yIC0gdGktPmJlZ2luKTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMg aW50IGxpbmVhcl9zdGF0dXMoc3RydWN0IGRtX3RhcmdldCAqdGksIHN0YXR1c190eXBlX3QgdHlw ZSwKKwkJCSBjaGFyICpyZXN1bHQsIHVuc2lnbmVkIGludCBtYXhsZW4pCit7CisJc3RydWN0IGxp bmVhcl9jICpsYyA9IChzdHJ1Y3QgbGluZWFyX2MgKikgdGktPnByaXZhdGU7CisJa2Rldl90IGtk ZXY7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIFNUQVRVU1RZUEVfSU5GTzoKKwkJcmVzdWx0 WzBdID0gJ1wwJzsKKwkJYnJlYWs7CisKKwljYXNlIFNUQVRVU1RZUEVfVEFCTEU6CisJCWtkZXYg PSB0b19rZGV2X3QobGMtPmRldi0+YmRldi0+YmRfZGV2KTsKKwkJc25wcmludGYocmVzdWx0LCBt YXhsZW4sICIlcyAiIFNFQ1RPUl9GT1JNQVQsCisJCQkgZG1fa2Rldm5hbWUoa2RldiksIGxjLT5z dGFydCk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCB0YXJn ZXRfdHlwZSBsaW5lYXJfdGFyZ2V0ID0geworCS5uYW1lICAgPSAibGluZWFyIiwKKwkubW9kdWxl ID0gVEhJU19NT0RVTEUsCisJLmN0ciAgICA9IGxpbmVhcl9jdHIsCisJLmR0ciAgICA9IGxpbmVh cl9kdHIsCisJLm1hcCAgICA9IGxpbmVhcl9tYXAsCisJLnN0YXR1cyA9IGxpbmVhcl9zdGF0dXMs Cit9OworCitpbnQgX19pbml0IGRtX2xpbmVhcl9pbml0KHZvaWQpCit7CisJaW50IHIgPSBkbV9y ZWdpc3Rlcl90YXJnZXQoJmxpbmVhcl90YXJnZXQpOworCisJaWYgKHIgPCAwKQorCQlETUVSUigi bGluZWFyOiByZWdpc3RlciBmYWlsZWQgJWQiLCByKTsKKworCXJldHVybiByOworfQorCit2b2lk IGRtX2xpbmVhcl9leGl0KHZvaWQpCit7CisJaW50IHIgPSBkbV91bnJlZ2lzdGVyX3RhcmdldCgm bGluZWFyX3RhcmdldCk7CisKKwlpZiAociA8IDApCisJCURNRVJSKCJsaW5lYXI6IHVucmVnaXN0 ZXIgZmFpbGVkICVkIiwgcik7Cit9Ci0tLSBkaWZmL2RyaXZlcnMvbWQvZG0tbG9nLmMJMTk3MC0w MS0wMSAwMTowMDowMC4wMDAwMDAwMDAgKzAxMDAKKysrIHNvdXJjZS9kcml2ZXJzL21kL2RtLWxv Zy5jCTIwMDMtMDgtMjYgMTM6NTk6MDQuMDAwMDAwMDAwICswMTAwCkBAIC0wLDAgKzEsMzAyIEBA CisvKgorICogQ29weXJpZ2h0IChDKSAyMDAzIFNpc3RpbmEgU29mdHdhcmUKKyAqCisgKiBUaGlz IGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIExHUEwuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4 L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxl Lmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorCisjaW5jbHVkZSAiZG0tbG9nLmgiCisj aW5jbHVkZSAiZG0taW8uaCIKKworc3RhdGljIExJU1RfSEVBRChfbG9nX3R5cGVzKTsKK3N0YXRp YyBzcGlubG9ja190IF9sb2NrID0gU1BJTl9MT0NLX1VOTE9DS0VEOworCitpbnQgZG1fcmVnaXN0 ZXJfZGlydHlfbG9nX3R5cGUoc3RydWN0IGRpcnR5X2xvZ190eXBlICp0eXBlKQoreworCXNwaW5f bG9jaygmX2xvY2spOworCXR5cGUtPnVzZV9jb3VudCA9IDA7CisJaWYgKHR5cGUtPm1vZHVsZSkK KwkJX19NT0RfSU5DX1VTRV9DT1VOVCh0eXBlLT5tb2R1bGUpOworCisJbGlzdF9hZGQoJnR5cGUt Pmxpc3QsICZfbG9nX3R5cGVzKTsKKwlzcGluX3VubG9jaygmX2xvY2spOworCisJcmV0dXJuIDA7 Cit9CisKK2ludCBkbV91bnJlZ2lzdGVyX2RpcnR5X2xvZ190eXBlKHN0cnVjdCBkaXJ0eV9sb2df dHlwZSAqdHlwZSkKK3sKKwlzcGluX2xvY2soJl9sb2NrKTsKKworCWlmICh0eXBlLT51c2VfY291 bnQpCisJCURNV0FSTigiQXR0ZW1wdCB0byB1bnJlZ2lzdGVyIGEgbG9nIHR5cGUgdGhhdCBpcyBz dGlsbCBpbiB1c2UiKTsKKwllbHNlIHsKKwkJbGlzdF9kZWwoJnR5cGUtPmxpc3QpOworCQlpZiAo dHlwZS0+bW9kdWxlKQorCQkJX19NT0RfREVDX1VTRV9DT1VOVCh0eXBlLT5tb2R1bGUpOworCX0K KworCXNwaW5fdW5sb2NrKCZfbG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVj dCBkaXJ0eV9sb2dfdHlwZSAqZ2V0X3R5cGUoY29uc3QgY2hhciAqdHlwZV9uYW1lKQoreworCXN0 cnVjdCBkaXJ0eV9sb2dfdHlwZSAqdHlwZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CisKKwlz cGluX2xvY2soJl9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoICh0bXAsICZfbG9nX3R5cGVzKSB7CisJ CXR5cGUgPSBsaXN0X2VudHJ5KHRtcCwgc3RydWN0IGRpcnR5X2xvZ190eXBlLCBsaXN0KTsKKwkJ aWYgKCFzdHJjbXAodHlwZV9uYW1lLCB0eXBlLT5uYW1lKSkgeworCQkJdHlwZS0+dXNlX2NvdW50 Kys7CisJCQlzcGluX3VubG9jaygmX2xvY2spOworCQkJcmV0dXJuIHR5cGU7CisJCX0KKwl9CisK KwlzcGluX3VubG9jaygmX2xvY2spOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBw dXRfdHlwZShzdHJ1Y3QgZGlydHlfbG9nX3R5cGUgKnR5cGUpCit7CisJc3Bpbl9sb2NrKCZfbG9j ayk7CisJdHlwZS0+dXNlX2NvdW50LS07CisJc3Bpbl91bmxvY2soJl9sb2NrKTsKK30KKworc3Ry dWN0IGRpcnR5X2xvZyAqZG1fY3JlYXRlX2RpcnR5X2xvZyhjb25zdCBjaGFyICp0eXBlX25hbWUs IHNlY3Rvcl90IGRldl9zaXplLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCBhcmdjLCBjaGFyICoq YXJndikKK3sKKwlzdHJ1Y3QgZGlydHlfbG9nX3R5cGUgKnR5cGU7CisJc3RydWN0IGRpcnR5X2xv ZyAqbG9nOworCisJbG9nID0ga21hbGxvYyhzaXplb2YoKmxvZyksIEdGUF9LRVJORUwpOworCWlm ICghbG9nKQorCQlyZXR1cm4gTlVMTDsKKworCXR5cGUgPSBnZXRfdHlwZSh0eXBlX25hbWUpOwor CWlmICghdHlwZSkgeworCQlrZnJlZShsb2cpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlsb2ct PnR5cGUgPSB0eXBlOworCWlmICh0eXBlLT5jdHIobG9nLCBkZXZfc2l6ZSwgYXJnYywgYXJndikp IHsKKwkJa2ZyZWUobG9nKTsKKwkJcHV0X3R5cGUodHlwZSk7CisJCXJldHVybiBOVUxMOworCX0K KworCXJldHVybiBsb2c7Cit9CisKK3ZvaWQgZG1fZGVzdHJveV9kaXJ0eV9sb2coc3RydWN0IGRp cnR5X2xvZyAqbG9nKQoreworCWxvZy0+dHlwZS0+ZHRyKGxvZyk7CisJcHV0X3R5cGUobG9nLT50 eXBlKTsKKwlrZnJlZShsb2cpOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEluIGNvcmUgbG9nLCBp ZS4gdHJpdmlhbCwgbm9uLXBlcnNpc3RlbnQKKyAqCisgKiBGb3Igbm93IHdlJ2xsIGtlZXAgdGhp cyBzaW1wbGUgYW5kIGp1c3QgaGF2ZSAyIGJpdHNldHMsIG9uZQorICogZm9yIGNsZWFuL2RpcnR5 LCB0aGUgb3RoZXIgZm9yIHN5bmMvbm9zeW5jLiAgVGhlIHN5bmMgYml0c2V0CisgKiB3aWxsIGJl IGZyZWVkIHdoZW4gZXZlcnl0aGluZyBpcyBpbiBzeW5jLgorICoKKyAqIEZJWE1FOiBwcm9ibGVt cyB3aXRoIGEgNjRiaXQgc2VjdG9yX3QKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0cnVjdCBjb3JlX2xvZyB7CisJ c2VjdG9yX3QgcmVnaW9uX3NpemU7CisJdW5zaWduZWQgaW50IHJlZ2lvbl9jb3VudDsKKwl1bnNp Z25lZCBsb25nICpjbGVhbl9iaXRzOworCXVuc2lnbmVkIGxvbmcgKnN5bmNfYml0czsKKwl1bnNp Z25lZCBsb25nICpyZWNvdmVyaW5nX2JpdHM7CS8qIEZJWE1FOiB0aGlzIHNlZW1zIGV4Y2Vzc2l2 ZSAqLworCisJaW50IHN5bmNfc2VhcmNoOworfTsKKworc3RhdGljIGludCBjb3JlX2N0cihzdHJ1 Y3QgZGlydHlfbG9nICpsb2csIHNlY3Rvcl90IGRldl9zaXplLAorCQkgICAgdW5zaWduZWQgaW50 IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCBjb3JlX2xvZyAqY2xvZzsKKwlzZWN0b3Jf dCByZWdpb25fc2l6ZTsKKwl1bnNpZ25lZCBpbnQgcmVnaW9uX2NvdW50OworCXNpemVfdCBiaXRz ZXRfc2l6ZTsKKworCWlmIChhcmdjICE9IDEpIHsKKwkJRE1XQVJOKCJ3cm9uZyBudW1iZXIgb2Yg YXJndW1lbnRzIHRvIGNvcmVfbG9nIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChz c2NhbmYoYXJndlswXSwgU0VDVE9SX0ZPUk1BVCwgJnJlZ2lvbl9zaXplKSAhPSAxKSB7CisJCURN V0FSTigiaW52YWxpZCByZWdpb24gc2l6ZSBzdHJpbmciKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJ fQorCisJcmVnaW9uX2NvdW50ID0gZG1fZGl2X3VwKGRldl9zaXplLCByZWdpb25fc2l6ZSk7CisK KwljbG9nID0ga21hbGxvYyhzaXplb2YoKmNsb2cpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNsb2cp IHsKKwkJRE1XQVJOKCJjb3VsZG4ndCBhbGxvY2F0ZSBjb3JlIGxvZyIpOworCQlyZXR1cm4gLUVO T01FTTsKKwl9CisKKwljbG9nLT5yZWdpb25fc2l6ZSA9IHJlZ2lvbl9zaXplOworCWNsb2ctPnJl Z2lvbl9jb3VudCA9IHJlZ2lvbl9jb3VudDsKKworCWJpdHNldF9zaXplID0gZG1fcm91bmRfdXAo cmVnaW9uX2NvdW50ID4+IDMsIHNpemVvZigqY2xvZy0+Y2xlYW5fYml0cykpOworCWNsb2ctPmNs ZWFuX2JpdHMgPSB2bWFsbG9jKGJpdHNldF9zaXplKTsKKwlpZiAoIWNsb2ctPmNsZWFuX2JpdHMp IHsKKwkJRE1XQVJOKCJjb3VsZG4ndCBhbGxvY2F0ZSBjbGVhbiBiaXRzZXQiKTsKKwkJa2ZyZWUo Y2xvZyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQoY2xvZy0+Y2xlYW5fYml0cywg LTEsIGJpdHNldF9zaXplKTsKKworCWNsb2ctPnN5bmNfYml0cyA9IHZtYWxsb2MoYml0c2V0X3Np emUpOworCWlmICghY2xvZy0+c3luY19iaXRzKSB7CisJCURNV0FSTigiY291bGRuJ3QgYWxsb2Nh dGUgc3luYyBiaXRzZXQiKTsKKwkJdmZyZWUoY2xvZy0+Y2xlYW5fYml0cyk7CisJCWtmcmVlKGNs b2cpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KGNsb2ctPnN5bmNfYml0cywgMCwg Yml0c2V0X3NpemUpOworCisJY2xvZy0+cmVjb3ZlcmluZ19iaXRzID0gdm1hbGxvYyhiaXRzZXRf c2l6ZSk7CisJaWYgKCFjbG9nLT5yZWNvdmVyaW5nX2JpdHMpIHsKKwkJRE1XQVJOKCJjb3VsZG4n dCBhbGxvY2F0ZSBzeW5jIGJpdHNldCIpOworCQl2ZnJlZShjbG9nLT5zeW5jX2JpdHMpOworCQl2 ZnJlZShjbG9nLT5jbGVhbl9iaXRzKTsKKwkJa2ZyZWUoY2xvZyk7CisJCXJldHVybiAtRU5PTUVN OworCX0KKwltZW1zZXQoY2xvZy0+cmVjb3ZlcmluZ19iaXRzLCAwLCBiaXRzZXRfc2l6ZSk7CisJ Y2xvZy0+c3luY19zZWFyY2ggPSAwOworCWxvZy0+Y29udGV4dCA9IGNsb2c7CisJcmV0dXJuIDA7 Cit9CisKK3N0YXRpYyB2b2lkIGNvcmVfZHRyKHN0cnVjdCBkaXJ0eV9sb2cgKmxvZykKK3sKKwlz dHJ1Y3QgY29yZV9sb2cgKmNsb2cgPSAoc3RydWN0IGNvcmVfbG9nICopIGxvZy0+Y29udGV4dDsK Kwl2ZnJlZShjbG9nLT5jbGVhbl9iaXRzKTsKKwl2ZnJlZShjbG9nLT5zeW5jX2JpdHMpOworCXZm cmVlKGNsb2ctPnJlY292ZXJpbmdfYml0cyk7CisJa2ZyZWUoY2xvZyk7Cit9CisKK3N0YXRpYyBz ZWN0b3JfdCBjb3JlX2dldF9yZWdpb25fc2l6ZShzdHJ1Y3QgZGlydHlfbG9nICpsb2cpCit7CisJ c3RydWN0IGNvcmVfbG9nICpjbG9nID0gKHN0cnVjdCBjb3JlX2xvZyAqKSBsb2ctPmNvbnRleHQ7 CisJcmV0dXJuIGNsb2ctPnJlZ2lvbl9zaXplOworfQorCitzdGF0aWMgaW50IGNvcmVfaXNfY2xl YW4oc3RydWN0IGRpcnR5X2xvZyAqbG9nLCByZWdpb25fdCByZWdpb24pCit7CisJc3RydWN0IGNv cmVfbG9nICpjbG9nID0gKHN0cnVjdCBjb3JlX2xvZyAqKSBsb2ctPmNvbnRleHQ7CisJcmV0dXJu IHRlc3RfYml0KHJlZ2lvbiwgY2xvZy0+Y2xlYW5fYml0cyk7Cit9CisKK3N0YXRpYyBpbnQgY29y ZV9pbl9zeW5jKHN0cnVjdCBkaXJ0eV9sb2cgKmxvZywgcmVnaW9uX3QgcmVnaW9uLCBpbnQgYmxv Y2spCit7CisJc3RydWN0IGNvcmVfbG9nICpjbG9nID0gKHN0cnVjdCBjb3JlX2xvZyAqKSBsb2ct PmNvbnRleHQ7CisKKwlyZXR1cm4gdGVzdF9iaXQocmVnaW9uLCBjbG9nLT5zeW5jX2JpdHMpID8g MSA6IDA7Cit9CisKK3N0YXRpYyBpbnQgY29yZV9mbHVzaChzdHJ1Y3QgZGlydHlfbG9nICpsb2cp Cit7CisJLyogbm8gb3AgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY29yZV9tYXJr X3JlZ2lvbihzdHJ1Y3QgZGlydHlfbG9nICpsb2csIHJlZ2lvbl90IHJlZ2lvbikKK3sKKwlzdHJ1 Y3QgY29yZV9sb2cgKmNsb2cgPSAoc3RydWN0IGNvcmVfbG9nICopIGxvZy0+Y29udGV4dDsKKwlj bGVhcl9iaXQocmVnaW9uLCBjbG9nLT5jbGVhbl9iaXRzKTsKK30KKworc3RhdGljIHZvaWQgY29y ZV9jbGVhcl9yZWdpb24oc3RydWN0IGRpcnR5X2xvZyAqbG9nLCByZWdpb25fdCByZWdpb24pCit7 CisJc3RydWN0IGNvcmVfbG9nICpjbG9nID0gKHN0cnVjdCBjb3JlX2xvZyAqKSBsb2ctPmNvbnRl eHQ7CisJc2V0X2JpdChyZWdpb24sIGNsb2ctPmNsZWFuX2JpdHMpOworfQorCitzdGF0aWMgaW50 IGNvcmVfZ2V0X3Jlc3luY193b3JrKHN0cnVjdCBkaXJ0eV9sb2cgKmxvZywgcmVnaW9uX3QgKnJl Z2lvbikKK3sKKwlzdHJ1Y3QgY29yZV9sb2cgKmNsb2cgPSAoc3RydWN0IGNvcmVfbG9nICopIGxv Zy0+Y29udGV4dDsKKworCWlmIChjbG9nLT5zeW5jX3NlYXJjaCA+PSBjbG9nLT5yZWdpb25fY291 bnQpCisJCXJldHVybiAwOworCisJZG8geworCQkqcmVnaW9uID0gZmluZF9uZXh0X3plcm9fYml0 KGNsb2ctPnN5bmNfYml0cywKKwkJCQkJICAgICBjbG9nLT5yZWdpb25fY291bnQsCisJCQkJCSAg ICAgY2xvZy0+c3luY19zZWFyY2gpOworCQljbG9nLT5zeW5jX3NlYXJjaCA9ICpyZWdpb24gKyAx OworCisJCWlmICgqcmVnaW9uID09IGNsb2ctPnJlZ2lvbl9jb3VudCkKKwkJCXJldHVybiAwOwor CisJfSB3aGlsZSAodGVzdF9iaXQoKnJlZ2lvbiwgY2xvZy0+cmVjb3ZlcmluZ19iaXRzKSk7CisK KwlzZXRfYml0KCpyZWdpb24sIGNsb2ctPnJlY292ZXJpbmdfYml0cyk7CisJcmV0dXJuIDE7Cit9 CisKK3N0YXRpYyB2b2lkIGNvcmVfY29tcGxldGVfcmVzeW5jX3dvcmsoc3RydWN0IGRpcnR5X2xv ZyAqbG9nLCByZWdpb25fdCByZWdpb24sCisJCQkJICAgICAgaW50IHN1Y2Nlc3MpCit7CisJc3Ry dWN0IGNvcmVfbG9nICpjbG9nID0gKHN0cnVjdCBjb3JlX2xvZyAqKSBsb2ctPmNvbnRleHQ7CisK KwljbGVhcl9iaXQocmVnaW9uLCBjbG9nLT5yZWNvdmVyaW5nX2JpdHMpOworCWlmIChzdWNjZXNz KQorCQlzZXRfYml0KHJlZ2lvbiwgY2xvZy0+c3luY19iaXRzKTsKK30KKworc3RhdGljIHN0cnVj dCBkaXJ0eV9sb2dfdHlwZSBfY29yZV90eXBlID0geworCS5uYW1lID0gImNvcmUiLAorCisJLmN0 ciA9IGNvcmVfY3RyLAorCS5kdHIgPSBjb3JlX2R0ciwKKwkuZ2V0X3JlZ2lvbl9zaXplID0gY29y ZV9nZXRfcmVnaW9uX3NpemUsCisJLmlzX2NsZWFuID0gY29yZV9pc19jbGVhbiwKKwkuaW5fc3lu YyA9IGNvcmVfaW5fc3luYywKKwkuZmx1c2ggPSBjb3JlX2ZsdXNoLAorCS5tYXJrX3JlZ2lvbiA9 IGNvcmVfbWFya19yZWdpb24sCisJLmNsZWFyX3JlZ2lvbiA9IGNvcmVfY2xlYXJfcmVnaW9uLAor CS5nZXRfcmVzeW5jX3dvcmsgPSBjb3JlX2dldF9yZXN5bmNfd29yaywKKwkuY29tcGxldGVfcmVz eW5jX3dvcmsgPSBjb3JlX2NvbXBsZXRlX3Jlc3luY193b3JrCit9OworCitfX2luaXQgaW50IGRt X2RpcnR5X2xvZ19pbml0KHZvaWQpCit7CisJaW50IHI7CisKKwlyID0gZG1fcmVnaXN0ZXJfZGly dHlfbG9nX3R5cGUoJl9jb3JlX3R5cGUpOworCWlmIChyKQorCQlETVdBUk4oImNvdWxkbid0IHJl Z2lzdGVyIGNvcmUgbG9nIik7CisKKwlyZXR1cm4gcjsKK30KKwordm9pZCBkbV9kaXJ0eV9sb2df ZXhpdCh2b2lkKQoreworCWRtX3VucmVnaXN0ZXJfZGlydHlfbG9nX3R5cGUoJl9jb3JlX3R5cGUp OworfQorCitFWFBPUlRfU1lNQk9MKGRtX3JlZ2lzdGVyX2RpcnR5X2xvZ190eXBlKTsKK0VYUE9S VF9TWU1CT0woZG1fdW5yZWdpc3Rlcl9kaXJ0eV9sb2dfdHlwZSk7CitFWFBPUlRfU1lNQk9MKGRt X2RpcnR5X2xvZ19pbml0KTsKK0VYUE9SVF9TWU1CT0woZG1fZGlydHlfbG9nX2V4aXQpOworRVhQ T1JUX1NZTUJPTChkbV9jcmVhdGVfZGlydHlfbG9nKTsKK0VYUE9SVF9TWU1CT0woZG1fZGVzdHJv eV9kaXJ0eV9sb2cpOwotLS0gZGlmZi9kcml2ZXJzL21kL2RtLWxvZy5oCTE5NzAtMDEtMDEgMDE6 MDA6MDAuMDAwMDAwMDAwICswMTAwCisrKyBzb3VyY2UvZHJpdmVycy9tZC9kbS1sb2cuaAkyMDAz LTA4LTI2IDE0OjIxOjQyLjAwMDAwMDAwMCArMDEwMApAQCAtMCwwICsxLDExMiBAQAorLyoKKyAq IENvcHlyaWdodCAoQykgMjAwMyBTaXN0aW5hIFNvZnR3YXJlCisgKgorICogVGhpcyBmaWxlIGlz IHJlbGVhc2VkIHVuZGVyIHRoZSBMR1BMLgorICovCisKKyNpZm5kZWYgRE1fRElSVFlfTE9HCisj ZGVmaW5lIERNX0RJUlRZX0xPRworCisjaW5jbHVkZSAiZG0uaCIKKwordHlwZWRlZiBzZWN0b3Jf dCByZWdpb25fdDsKKworc3RydWN0IGRpcnR5X2xvZ190eXBlOworCitzdHJ1Y3QgZGlydHlfbG9n IHsKKwlzdHJ1Y3QgZGlydHlfbG9nX3R5cGUgKnR5cGU7CisJdm9pZCAqY29udGV4dDsKK307CisK K3N0cnVjdCBkaXJ0eV9sb2dfdHlwZSB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCWNvbnN0 IGNoYXIgKm5hbWU7CisJc3RydWN0IG1vZHVsZSAqbW9kdWxlOworCXVuc2lnbmVkIGludCB1c2Vf Y291bnQ7CisKKwlpbnQgKCpjdHIpKHN0cnVjdCBkaXJ0eV9sb2cgKmxvZywgc2VjdG9yX3QgZGV2 X3NpemUsCisJCSAgIHVuc2lnbmVkIGludCBhcmdjLCBjaGFyICoqYXJndik7CisJdm9pZCAoKmR0 cikoc3RydWN0IGRpcnR5X2xvZyAqbG9nKTsKKworCS8qCisJICogUmV0cmlldmVzIHRoZSBzbWFs bGVzdCBzaXplIG9mIHJlZ2lvbiB0aGF0IHRoZSBsb2cgY2FuCisJICogZGVhbCB3aXRoLgorCSAq LworCXNlY3Rvcl90ICgqZ2V0X3JlZ2lvbl9zaXplKShzdHJ1Y3QgZGlydHlfbG9nICpsb2cpOwor CisgICAgICAgIC8qCisJICogQSBwcmVkaWNhdGUgdG8gc2F5IHdoZXRoZXIgYSByZWdpb24gaXMg Y2xlYW4gb3Igbm90LgorCSAqIE1heSBibG9jay4KKwkgKi8KKwlpbnQgKCppc19jbGVhbikoc3Ry dWN0IGRpcnR5X2xvZyAqbG9nLCByZWdpb25fdCByZWdpb24pOworCisJLyoKKwkgKiAgUmV0dXJu czogMCwgMSwgLUVXT1VMREJMT0NLLCA8IDAKKwkgKgorCSAqIEEgcHJlZGljYXRlIGZ1bmN0aW9u IHRvIGNoZWNrIHRoZSBhcmVhIGdpdmVuIGJ5CisJICogW3NlY3Rvciwgc2VjdG9yICsgbGVuKSBp cyBpbiBzeW5jLgorCSAqCisJICogSWYgLUVXT1VMREJMT0NLIGlzIHJldHVybmVkIHRoZSBzdGF0 ZSBvZiB0aGUgcmVnaW9uIGlzCisJICogdW5rbm93biwgdHlwaWNhbGx5IHRoaXMgd2lsbCByZXN1 bHQgaW4gYSByZWFkIGJlaW5nCisJICogcGFzc2VkIHRvIGEgZGFlbW9uIHRvIGRlYWwgd2l0aCwg c2luY2UgYSBkYWVtb24gaXMKKwkgKiBhbGxvd2VkIHRvIGJsb2NrLgorCSAqLworCWludCAoKmlu X3N5bmMpKHN0cnVjdCBkaXJ0eV9sb2cgKmxvZywgcmVnaW9uX3QgcmVnaW9uLCBpbnQgY2FuX2Js b2NrKTsKKworCS8qCisJICogRmx1c2ggdGhlIGN1cnJlbnQgbG9nIHN0YXRlIChlZywgdG8gZGlz aykuICBUaGlzCisJICogZnVuY3Rpb24gbWF5IGJsb2NrLgorCSAqLworCWludCAoKmZsdXNoKShz dHJ1Y3QgZGlydHlfbG9nICpsb2cpOworCisJLyoKKwkgKiBNYXJrIGFuIGFyZWEgYXMgY2xlYW4g b3IgZGlydHkuICBUaGVzZSBmdW5jdGlvbnMgbWF5CisJICogYmxvY2ssIHRob3VnaCBmb3IgcGVy Zm9ybWFuY2UgcmVhc29ucyBibG9ja2luZyBzaG91bGQKKwkgKiBiZSBleHRyZW1lbHkgcmFyZSAo ZWcsIGFsbG9jYXRpbmcgYW5vdGhlciBjaHVuayBvZgorCSAqIG1lbW9yeSBmb3Igc29tZSByZWFz b24pLgorCSAqLworCXZvaWQgKCptYXJrX3JlZ2lvbikoc3RydWN0IGRpcnR5X2xvZyAqbG9nLCBy ZWdpb25fdCByZWdpb24pOworCXZvaWQgKCpjbGVhcl9yZWdpb24pKHN0cnVjdCBkaXJ0eV9sb2cg KmxvZywgcmVnaW9uX3QgcmVnaW9uKTsKKworCS8qCisJICogUmV0dXJuczogPDAgKGVycm9yKSwg MCAobm8gcmVnaW9uKSwgMSAocmVnaW9uKQorCSAqCisJICogVGhlIG1pcnJvcmQgd2lsbCBuZWVk IHBlcmZvcm0gcmVjb3Zlcnkgb24gcmVnaW9ucyBvZgorCSAqIHRoZSBtaXJyb3IgdGhhdCBhcmUg aW4gdGhlIE5PU1lOQyBzdGF0ZS4gIFRoaXMKKwkgKiBmdW5jdGlvbiBhc2tzIHRoZSBsb2cgdG8g dGVsbCB0aGUgY2FsbGVyIGFib3V0IHRoZQorCSAqIG5leHQgcmVnaW9uIHRoYXQgdGhpcyBtYWNo aW5lIHNob3VsZCByZWNvdmVyLgorCSAqCisJICogRG8gbm90IGNvbmZ1c2UgdGhpcyBmdW5jdGlv biB3aXRoICdpbl9zeW5jKCknLCBvbmUKKwkgKiB0ZWxscyB5b3UgaWYgYW4gYXJlYSBpcyBzeW5j aHJvbmlzZWQsIHRoZSBvdGhlcgorCSAqIGFzc2lnbnMgcmVjb3Zlcnkgd29yay4KKwkqLworCWlu dCAoKmdldF9yZXN5bmNfd29yaykoc3RydWN0IGRpcnR5X2xvZyAqbG9nLCByZWdpb25fdCAqcmVn aW9uKTsKKworCS8qCisJICogVGhpcyBub3RpZmllcyB0aGUgbG9nIHRoYXQgdGhlIHJlc3luYyBv ZiBhbiBhcmVhIGhhcworCSAqIGJlZW4gY29tcGxldGVkLiAgVGhlIGxvZyBzaG91bGQgdGhlbiBt YXJrIHRoaXMgcmVnaW9uCisJICogYXMgQ0xFQU4uCisJICovCisJdm9pZCAoKmNvbXBsZXRlX3Jl c3luY193b3JrKShzdHJ1Y3QgZGlydHlfbG9nICpsb2csCisJCQkJICAgICByZWdpb25fdCByZWdp b24sIGludCBzdWNjZXNzKTsKK307CisKK2ludCBkbV9yZWdpc3Rlcl9kaXJ0eV9sb2dfdHlwZShz dHJ1Y3QgZGlydHlfbG9nX3R5cGUgKnR5cGUpOworaW50IGRtX3VucmVnaXN0ZXJfZGlydHlfbG9n X3R5cGUoc3RydWN0IGRpcnR5X2xvZ190eXBlICp0eXBlKTsKKworCisvKgorICogTWFrZSBzdXJl IHlvdSB1c2UgdGhlc2UgdHdvIGZ1bmN0aW9ucywgcmF0aGVyIHRoYW4gY2FsbGluZworICogdHlw ZS0+Y29uc3RydWN0b3IvZGVzdHJ1Y3RvcigpIGRpcmVjdGx5LgorICovCitzdHJ1Y3QgZGlydHlf bG9nICpkbV9jcmVhdGVfZGlydHlfbG9nKGNvbnN0IGNoYXIgKnR5cGVfbmFtZSwgc2VjdG9yX3Qg ZGV2X3NpemUsCisJCQkJICAgICAgdW5zaWduZWQgaW50IGFyZ2MsIGNoYXIgKiphcmd2KTsKK3Zv aWQgZG1fZGVzdHJveV9kaXJ0eV9sb2coc3RydWN0IGRpcnR5X2xvZyAqbG9nKTsKKworLyoKKyAq IGluaXQvZXhpdCBmdW5jdGlvbnMuCisgKi8KK2ludCBkbV9kaXJ0eV9sb2dfaW5pdCh2b2lkKTsK K3ZvaWQgZG1fZGlydHlfbG9nX2V4aXQodm9pZCk7CisKKyNlbmRpZgotLS0gZGlmZi9kcml2ZXJz L21kL2RtLXJhaWQxLmMJMTk3MC0wMS0wMSAwMTowMDowMC4wMDAwMDAwMDAgKzAxMDAKKysrIHNv dXJjZS9kcml2ZXJzL21kL2RtLXJhaWQxLmMJMjAwMy0wOC0yNiAxMzo1OTowNC4wMDAwMDAwMDAg KzAxMDAKQEAgLTAsMCArMSwxMjk3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAzIFNpc3Rp bmEgU29mdHdhcmUgTGltaXRlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIg dGhlIEdQTC4KKyAqLworCisjaW5jbHVkZSAiZG0uaCIKKyNpbmNsdWRlICJkbS1kYWVtb24uaCIK KyNpbmNsdWRlICJkbS1pby5oIgorI2luY2x1ZGUgImRtLWxvZy5oIgorI2luY2x1ZGUgImtjb3B5 ZC5oIgorCisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+ CisjaW5jbHVkZSA8bGludXgvbWVtcG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgor I2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5j bHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKworc3RhdGlj IHN0cnVjdCBkbV9kYWVtb24gX2ttaXJyb3JkOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBidWZmZXIgbGlz dHM6CisgKgorICogV2UgcGxheSB3aXRoIHNpbmdseSBsaW5rZWQgbGlzdHMgb2YgYnVmZmVycywg YnV0IHdlIHdhbnQgdG8gYmUKKyAqIGNhcmVmdWwgdG8gYWRkIG5ldyBidWZmZXJzIHRvIHRoZSBi YWNrIG9mIHRoZSBsaXN0LCB0byBhdm9pZAorICogYnVmZmVycyBiZWluZyBzdGFydmVkIG9mIGF0 dGVudGlvbi4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0cnVjdCBidWZmZXJfbGlzdCB7CisJc3RydWN0IGJ1ZmZl cl9oZWFkICpoZWFkOworCXN0cnVjdCBidWZmZXJfaGVhZCAqdGFpbDsKK307CisKK3N0YXRpYyBp bmxpbmUgdm9pZCBidWZmZXJfbGlzdF9pbml0KHN0cnVjdCBidWZmZXJfbGlzdCAqYmwpCit7CisJ YmwtPmhlYWQgPSBibC0+dGFpbCA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBidWZm ZXJfbGlzdF9hZGQoc3RydWN0IGJ1ZmZlcl9saXN0ICpibCwKKwkJCQkgICBzdHJ1Y3QgYnVmZmVy X2hlYWQgKmJoKQoreworCWJoLT5iX3JlcW5leHQgPSBOVUxMOworCisJaWYgKGJsLT50YWlsKSB7 CisJCWJsLT50YWlsLT5iX3JlcW5leHQgPSBiaDsKKwkJYmwtPnRhaWwgPSBiaDsKKwl9IGVsc2UK KwkJYmwtPmhlYWQgPSBibC0+dGFpbCA9IGJoOworfQorCitzdGF0aWMgc3RydWN0IGJ1ZmZlcl9o ZWFkICpidWZmZXJfbGlzdF9wb3Aoc3RydWN0IGJ1ZmZlcl9saXN0ICpibCkKK3sKKwlzdHJ1Y3Qg YnVmZmVyX2hlYWQgKmJoID0gYmwtPmhlYWQ7CisKKwlpZiAoYmgpIHsKKwkJYmwtPmhlYWQgPSBi bC0+aGVhZC0+Yl9yZXFuZXh0OworCQlpZiAoIWJsLT5oZWFkKQorCQkJYmwtPnRhaWwgPSBOVUxM OworCisJCWJoLT5iX3JlcW5leHQgPSBOVUxMOworCX0KKworCXJldHVybiBiaDsKK30KKworLyot LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLQorICogUmVnaW9uIGhhc2gKKyAqCisgKiBUaGUgbWlycm9yIHNwbGl0cyBpdHNlbGYg dXAgaW50byBkaXNjcmV0ZSByZWdpb25zLiAgRWFjaAorICogcmVnaW9uIGNhbiBiZSBpbiBvbmUg b2YgdGhyZWUgc3RhdGVzOiBjbGVhbiwgZGlydHksCisgKiBub3N5bmMuICBUaGVyZSBpcyBubyBu ZWVkIHRvIHB1dCBjbGVhbiByZWdpb25zIGluIHRoZSBoYXNoLgorICoKKyAqIEluIGFkZGl0aW9u IHRvIGJlaW5nIHByZXNlbnQgaW4gdGhlIGhhc2ggdGFibGUgYSByZWdpb24gX21heV8KKyAqIGJl IHByZXNlbnQgb24gb25lIG9mIHRocmVlIGxpc3RzLgorICoKKyAqICAgY2xlYW5fcmVnaW9uczog UmVnaW9ucyBvbiB0aGlzIGxpc3QgaGF2ZSBubyBpbyBwZW5kaW5nIHRvCisgKiAgIHRoZW0sIHRo ZXkgYXJlIGluIHN5bmMsIHdlIGFyZSBubyBsb25nZXIgaW50ZXJlc3RlZCBpbiB0aGVtLAorICog ICB0aGV5IGFyZSBkdWxsLiAgcmhfdXBkYXRlX3N0YXRlcygpIHdpbGwgcmVtb3ZlIHRoZW0gZnJv bSB0aGUKKyAqICAgaGFzaCB0YWJsZS4KKyAqCisgKiAgIHF1aWVzY2VkX3JlZ2lvbnM6IFRoZXNl IHJlZ2lvbnMgaGF2ZSBiZWVuIHNwdW4gZG93biwgcmVhZHkKKyAqICAgZm9yIHJlY292ZXJ5LiAg cmhfcmVjb3Zlcnlfc3RhcnQoKSB3aWxsIHJlbW92ZSByZWdpb25zIGZyb20KKyAqICAgdGhpcyBs aXN0IGFuZCBoYW5kIHRoZW0gdG8ga21pcnJvcmQsIHdoaWNoIHdpbGwgc2NoZWR1bGUgdGhlCisg KiAgIHJlY292ZXJ5IGlvIHdpdGgga2NvcHlkLgorICoKKyAqICAgcmVjb3ZlcmVkX3JlZ2lvbnM6 IFJlZ2lvbnMgdGhhdCBrY29weWQgaGFzIHN1Y2Nlc3NmdWxseQorICogICByZWNvdmVyZWQuICBy aF91cGRhdGVfc3RhdGVzKCkgd2lsbCBub3cgc2NoZWR1bGUgYW55IGRlbGF5ZWQKKyAqICAgaW8s IHVwIHRoZSByZWNvdmVyeV9jb3VudCwgYW5kIHJlbW92ZSB0aGUgcmVnaW9uIGZyb20gdGhlCisg KiAgIGhhc2guCisgKgorICogVGhlcmUgYXJlIDIgbG9ja3M6CisgKiAgIEEgcncgc3BpbiBsb2Nr ICdoYXNoX2xvY2snIHByb3RlY3RzIGp1c3QgdGhlIGhhc2ggdGFibGUsCisgKiAgIHRoaXMgaXMg bmV2ZXIgaGVsZCBpbiB3cml0ZSBtb2RlIGZyb20gaW50ZXJydXB0IGNvbnRleHQsCisgKiAgIHdo aWNoIEkgYmVsaWV2ZSBtZWFucyB0aGF0IHdlIG9ubHkgaGF2ZSB0byBkaXNhYmxlIGlycXMgd2hl bgorICogICBkb2luZyBhIHdyaXRlIGxvY2suCisgKgorICogICBBbiBvcmRpbmFyeSBzcGluIGxv Y2sgJ3JlZ2lvbl9sb2NrJyB0aGF0IHByb3RlY3RzIHRoZSB0aHJlZQorICogICBsaXN0cyBpbiB0 aGUgcmVnaW9uX2hhc2gsIHdpdGggdGhlICdzdGF0ZScsICdsaXN0JyBhbmQKKyAqICAgJ2Joc19k ZWxheWVkJyBmaWVsZHMgb2YgdGhlIHJlZ2lvbnMuICBUaGlzIGlzIHVzZWQgZnJvbSBpcnEKKyAq ICAgY29udGV4dCwgc28gYWxsIG90aGVyIHVzZXMgd2lsbCBoYXZlIHRvIHN1c3BlbmQgbG9jYWwg aXJxcy4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tKi8KK3N0cnVjdCBtaXJyb3Jfc2V0Oworc3RydWN0IHJlZ2lvbl9oYXNo IHsKKwlzdHJ1Y3QgbWlycm9yX3NldCAqbXM7CisJc2VjdG9yX3QgcmVnaW9uX3NpemU7CisKKwkv KiBob2xkcyBwZXJzaXN0ZW50IHJlZ2lvbiBzdGF0ZSAqLworCXN0cnVjdCBkaXJ0eV9sb2cgKmxv ZzsKKworCS8qIGhhc2ggdGFibGUgKi8KKwlyd2xvY2tfdCBoYXNoX2xvY2s7CisJbWVtcG9vbF90 ICpyZWdpb25fcG9vbDsKKwl1bnNpZ25lZCBpbnQgbWFzazsKKwl1bnNpZ25lZCBpbnQgbnJfYnVj a2V0czsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpidWNrZXRzOworCisJc3BpbmxvY2tfdCByZWdpb25f bG9jazsKKwlzdHJ1Y3Qgc2VtYXBob3JlIHJlY292ZXJ5X2NvdW50OworCXN0cnVjdCBsaXN0X2hl YWQgY2xlYW5fcmVnaW9uczsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHF1aWVzY2VkX3JlZ2lvbnM7CisJ c3RydWN0IGxpc3RfaGVhZCByZWNvdmVyZWRfcmVnaW9uczsKK307CisKK2VudW0geworCVJIX0NM RUFOLAorCVJIX0RJUlRZLAorCVJIX05PU1lOQywKKwlSSF9SRUNPVkVSSU5HCit9OworCitzdHJ1 Y3QgcmVnaW9uIHsKKwlzdHJ1Y3QgcmVnaW9uX2hhc2ggKnJoOwkvKiBGSVhNRTogY2FuIHdlIGdl dCByaWQgb2YgdGhpcyA/ICovCisJcmVnaW9uX3Qga2V5OworCWludCBzdGF0ZTsKKworCXN0cnVj dCBsaXN0X2hlYWQgaGFzaF9saXN0OworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKworCWF0b21p Y190IHBlbmRpbmc7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpkZWxheWVkX2JoczsKK307CisKKy8q CisgKiBDb252ZXJzaW9uIGZucworICovCitzdGF0aWMgaW5saW5lIHJlZ2lvbl90IGJoX3RvX3Jl Z2lvbihzdHJ1Y3QgcmVnaW9uX2hhc2ggKnJoLAorCQkJCSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQg KmJoKQoreworCXJldHVybiBiaC0+Yl9yc2VjdG9yIC8gcmgtPnJlZ2lvbl9zaXplOworfQorCitz dGF0aWMgaW5saW5lIHNlY3Rvcl90IHJlZ2lvbl90b19zZWN0b3Ioc3RydWN0IHJlZ2lvbl9oYXNo ICpyaCwgcmVnaW9uX3QgcmVnaW9uKQoreworCXJldHVybiByZWdpb24gKiByaC0+cmVnaW9uX3Np emU7Cit9CisKKy8qIEZJWE1FIG1vdmUgdGhpcyAqLworc3RhdGljIHZvaWQgcXVldWVfYmgoc3Ry dWN0IG1pcnJvcl9zZXQgKm1zLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCBpbnQgcncpOworCitz dGF0aWMgdm9pZCAqcmVnaW9uX2FsbG9jKGludCBnZnBfbWFzaywgdm9pZCAqcG9vbF9kYXRhKQor eworCXJldHVybiBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcmVnaW9uKSwgZ2ZwX21hc2spOworfQor CitzdGF0aWMgdm9pZCByZWdpb25fZnJlZSh2b2lkICplbGVtZW50LCB2b2lkICpwb29sX2RhdGEp Cit7CisJa2ZyZWUoZWxlbWVudCk7Cit9CisKKyNkZWZpbmUgTUlOX1JFR0lPTlMgNjQKKyNkZWZp bmUgTUFYX1JFQ09WRVJZIDEKK3N0YXRpYyBpbnQgcmhfaW5pdChzdHJ1Y3QgcmVnaW9uX2hhc2gg KnJoLCBzdHJ1Y3QgbWlycm9yX3NldCAqbXMsCisJCSAgIHN0cnVjdCBkaXJ0eV9sb2cgKmxvZywg c2VjdG9yX3QgcmVnaW9uX3NpemUsCisJCSAgIHJlZ2lvbl90IG5yX3JlZ2lvbnMpCit7CisJdW5z aWduZWQgaW50IG5yX2J1Y2tldHMsIG1heF9idWNrZXRzOworCXNpemVfdCBpOworCisJLyoKKwkg KiBDYWxjdWxhdGUgYSBzdWl0YWJsZSBudW1iZXIgb2YgYnVja2V0cyBmb3Igb3VyIGhhc2gKKwkg KiB0YWJsZS4KKwkgKi8KKwltYXhfYnVja2V0cyA9IG5yX3JlZ2lvbnMgPj4gNjsKKwlmb3IgKG5y X2J1Y2tldHMgPSAxMjh1OyBucl9idWNrZXRzIDwgbWF4X2J1Y2tldHM7IG5yX2J1Y2tldHMgPDw9 IDEpCisJCTsKKwlucl9idWNrZXRzID4+PSAxOworCisJcmgtPm1zID0gbXM7CisJcmgtPmxvZyA9 IGxvZzsKKwlyaC0+cmVnaW9uX3NpemUgPSByZWdpb25fc2l6ZTsKKwlyd2xvY2tfaW5pdCgmcmgt Pmhhc2hfbG9jayk7CisJcmgtPm1hc2sgPSBucl9idWNrZXRzIC0gMTsKKwlyaC0+bnJfYnVja2V0 cyA9IG5yX2J1Y2tldHM7CisKKwlyaC0+YnVja2V0cyA9IHZtYWxsb2MobnJfYnVja2V0cyAqIHNp emVvZigqcmgtPmJ1Y2tldHMpKTsKKwlpZiAoIXJoLT5idWNrZXRzKSB7CisJCURNRVJSKCJ1bmFi bGUgdG8gYWxsb2NhdGUgcmVnaW9uIGhhc2ggbWVtb3J5Iik7CisJCXJldHVybiAtRU5PTUVNOwor CX0KKworCWZvciAoaSA9IDA7IGkgPCBucl9idWNrZXRzOyBpKyspCisJCUlOSVRfTElTVF9IRUFE KHJoLT5idWNrZXRzICsgaSk7CisKKwlzcGluX2xvY2tfaW5pdCgmcmgtPnJlZ2lvbl9sb2NrKTsK KwlzZW1hX2luaXQoJnJoLT5yZWNvdmVyeV9jb3VudCwgMCk7CisJSU5JVF9MSVNUX0hFQUQoJnJo LT5jbGVhbl9yZWdpb25zKTsKKwlJTklUX0xJU1RfSEVBRCgmcmgtPnF1aWVzY2VkX3JlZ2lvbnMp OworCUlOSVRfTElTVF9IRUFEKCZyaC0+cmVjb3ZlcmVkX3JlZ2lvbnMpOworCisJcmgtPnJlZ2lv bl9wb29sID0gbWVtcG9vbF9jcmVhdGUoTUlOX1JFR0lPTlMsIHJlZ2lvbl9hbGxvYywKKwkJCQkJ IHJlZ2lvbl9mcmVlLCBOVUxMKTsKKwlpZiAoIXJoLT5yZWdpb25fcG9vbCkgeworCQl2ZnJlZShy aC0+YnVja2V0cyk7CisJCXJoLT5idWNrZXRzID0gTlVMTDsKKwkJcmV0dXJuIC1FTk9NRU07CisJ fQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHJoX2V4aXQoc3RydWN0IHJlZ2lvbl9o YXNoICpyaCkKK3sKKwl1bnNpZ25lZCBpbnQgaDsKKwlzdHJ1Y3QgcmVnaW9uICpyZWc7CisJc3Ry dWN0IGxpc3RfaGVhZCAqdG1wLCAqdG1wMjsKKworCUJVR19PTighbGlzdF9lbXB0eSgmcmgtPnF1 aWVzY2VkX3JlZ2lvbnMpKTsKKwlmb3IgKGggPSAwOyBoIDwgcmgtPm5yX2J1Y2tldHM7IGgrKykg eworCQlsaXN0X2Zvcl9lYWNoX3NhZmUgKHRtcCwgdG1wMiwgcmgtPmJ1Y2tldHMgKyBoKSB7CisJ CQlyZWcgPSBsaXN0X2VudHJ5KHRtcCwgc3RydWN0IHJlZ2lvbiwgaGFzaF9saXN0KTsKKwkJCUJV R19PTihhdG9taWNfcmVhZCgmcmVnLT5wZW5kaW5nKSk7CisJCQltZW1wb29sX2ZyZWUocmVnLCBy aC0+cmVnaW9uX3Bvb2wpOworCQl9CisJfQorCisJaWYgKHJoLT5sb2cpCisJCWRtX2Rlc3Ryb3lf ZGlydHlfbG9nKHJoLT5sb2cpOworCWlmIChyaC0+cmVnaW9uX3Bvb2wpCisJCW1lbXBvb2xfZGVz dHJveShyaC0+cmVnaW9uX3Bvb2wpOworCXZmcmVlKHJoLT5idWNrZXRzKTsKK30KKworI2RlZmlu ZSBSSF9IQVNIX01VTFQgMjY1NDQzNTM4N1UKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQg cmhfaGFzaChzdHJ1Y3QgcmVnaW9uX2hhc2ggKnJoLCByZWdpb25fdCByZWdpb24pCit7CisJcmV0 dXJuICh1bnNpZ25lZCBpbnQpICgocmVnaW9uICogUkhfSEFTSF9NVUxUKSA+PiAxMikgJiByaC0+ bWFzazsKK30KKworc3RhdGljIHN0cnVjdCByZWdpb24gKl9fcmhfbG9va3VwKHN0cnVjdCByZWdp b25faGFzaCAqcmgsIHJlZ2lvbl90IHJlZ2lvbikKK3sKKwlzdHJ1Y3QgcmVnaW9uICpyZWc7CisK KwlsaXN0X2Zvcl9lYWNoX2VudHJ5IChyZWcsIHJoLT5idWNrZXRzICsgcmhfaGFzaChyaCwgcmVn aW9uKSwgaGFzaF9saXN0KQorCQlpZiAocmVnLT5rZXkgPT0gcmVnaW9uKQorCQkJcmV0dXJuIHJl ZzsKKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBfX3JoX2luc2VydChzdHJ1Y3Qg cmVnaW9uX2hhc2ggKnJoLCBzdHJ1Y3QgcmVnaW9uICpyZWcpCit7CisJdW5zaWduZWQgaW50IGgg PSByaF9oYXNoKHJoLCByZWctPmtleSk7CisJbGlzdF9hZGQoJnJlZy0+aGFzaF9saXN0LCByaC0+ YnVja2V0cyArIGgpOworfQorCitzdGF0aWMgc3RydWN0IHJlZ2lvbiAqX19yaF9hbGxvYyhzdHJ1 Y3QgcmVnaW9uX2hhc2ggKnJoLCByZWdpb25fdCByZWdpb24pCit7CisJc3RydWN0IHJlZ2lvbiAq cmVnLCAqbnJlZzsKKworCXJlYWRfdW5sb2NrKCZyaC0+aGFzaF9sb2NrKTsKKwlucmVnID0gbWVt cG9vbF9hbGxvYyhyaC0+cmVnaW9uX3Bvb2wsIEdGUF9OT0lPKTsKKwlucmVnLT5zdGF0ZSA9IHJo LT5sb2ctPnR5cGUtPmluX3N5bmMocmgtPmxvZywgcmVnaW9uLCAxKSA/CisJCVJIX0NMRUFOIDog UkhfTk9TWU5DOworCW5yZWctPnJoID0gcmg7CisJbnJlZy0+a2V5ID0gcmVnaW9uOworCisJSU5J VF9MSVNUX0hFQUQoJm5yZWctPmxpc3QpOworCisJYXRvbWljX3NldCgmbnJlZy0+cGVuZGluZywg MCk7CisJbnJlZy0+ZGVsYXllZF9iaHMgPSBOVUxMOworCXdyaXRlX2xvY2tfaXJxKCZyaC0+aGFz aF9sb2NrKTsKKworCXJlZyA9IF9fcmhfbG9va3VwKHJoLCByZWdpb24pOworCWlmIChyZWcpCisJ CS8qIHdlIGxvc3QgdGhlIHJhY2UgKi8KKwkJbWVtcG9vbF9mcmVlKG5yZWcsIHJoLT5yZWdpb25f cG9vbCk7CisKKwllbHNlIHsKKwkJX19yaF9pbnNlcnQocmgsIG5yZWcpOworCQlpZiAobnJlZy0+ c3RhdGUgPT0gUkhfQ0xFQU4pIHsKKwkJCXNwaW5fbG9ja19pcnEoJnJoLT5yZWdpb25fbG9jayk7 CisJCQlsaXN0X2FkZCgmbnJlZy0+bGlzdCwgJnJoLT5jbGVhbl9yZWdpb25zKTsKKwkJCXNwaW5f dW5sb2NrX2lycSgmcmgtPnJlZ2lvbl9sb2NrKTsKKwkJfQorCQlyZWcgPSBucmVnOworCX0KKwl3 cml0ZV91bmxvY2tfaXJxKCZyaC0+aGFzaF9sb2NrKTsKKwlyZWFkX2xvY2soJnJoLT5oYXNoX2xv Y2spOworCisJcmV0dXJuIHJlZzsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgcmVnaW9uICpf X3JoX2ZpbmQoc3RydWN0IHJlZ2lvbl9oYXNoICpyaCwgcmVnaW9uX3QgcmVnaW9uKQoreworCXN0 cnVjdCByZWdpb24gKnJlZzsKKworCXJlZyA9IF9fcmhfbG9va3VwKHJoLCByZWdpb24pOworCWlm ICghcmVnKQorCQlyZWcgPSBfX3JoX2FsbG9jKHJoLCByZWdpb24pOworCisJcmV0dXJuIHJlZzsK K30KKworc3RhdGljIGludCByaF9zdGF0ZShzdHJ1Y3QgcmVnaW9uX2hhc2ggKnJoLCByZWdpb25f dCByZWdpb24sIGludCBtYXlfYmxvY2spCit7CisJaW50IHI7CisJc3RydWN0IHJlZ2lvbiAqcmVn OworCisJcmVhZF9sb2NrKCZyaC0+aGFzaF9sb2NrKTsKKwlyZWcgPSBfX3JoX2xvb2t1cChyaCwg cmVnaW9uKTsKKwlyZWFkX3VubG9jaygmcmgtPmhhc2hfbG9jayk7CisKKwlpZiAocmVnKQorCQly ZXR1cm4gcmVnLT5zdGF0ZTsKKworCS8qCisJICogVGhlIHJlZ2lvbiB3YXNuJ3QgaW4gdGhlIGhh c2gsIHNvIHdlIGZhbGwgYmFjayB0byB0aGUKKwkgKiBkaXJ0eSBsb2cuCisJICovCisJciA9IHJo LT5sb2ctPnR5cGUtPmluX3N5bmMocmgtPmxvZywgcmVnaW9uLCBtYXlfYmxvY2spOworCisJLyoK KwkgKiBBbnkgZXJyb3IgZnJvbSB0aGUgZGlydHkgbG9nIChlZy4gLUVXT1VMREJMT0NLKSBnZXRz CisJICogdGFrZW4gYXMgYSBSSF9OT1NZTkMKKwkgKi8KKwlyZXR1cm4gciA9PSAxID8gUkhfQ0xF QU4gOiBSSF9OT1NZTkM7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHJoX2luX3N5bmMoc3RydWN0 IHJlZ2lvbl9oYXNoICpyaCwKKwkJCSAgICAgcmVnaW9uX3QgcmVnaW9uLCBpbnQgbWF5X2Jsb2Nr KQoreworCWludCBzdGF0ZSA9IHJoX3N0YXRlKHJoLCByZWdpb24sIG1heV9ibG9jayk7CisJcmV0 dXJuIHN0YXRlID09IFJIX0NMRUFOIHx8IHN0YXRlID09IFJIX0RJUlRZOworfQorCitzdGF0aWMg dm9pZCBkaXNwYXRjaF9idWZmZXJzKHN0cnVjdCBtaXJyb3Jfc2V0ICptcywgc3RydWN0IGJ1ZmZl cl9oZWFkICpiaCkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKm5iaDsKKworCXdoaWxlIChiaCkg eworCQluYmggPSBiaC0+Yl9yZXFuZXh0OworCQlxdWV1ZV9iaChtcywgYmgsIFdSSVRFKTsKKwkJ YmggPSBuYmg7CisJfQorfQorCitzdGF0aWMgdm9pZCByaF91cGRhdGVfc3RhdGVzKHN0cnVjdCBy ZWdpb25faGFzaCAqcmgpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqdG1wLCAqdG1wMjsKKwlzdHJ1 Y3QgcmVnaW9uICpyZWc7CisKKwlMSVNUX0hFQUQoY2xlYW4pOworCUxJU1RfSEVBRChyZWNvdmVy ZWQpOworCisJLyoKKwkgKiBRdWlja2x5IGdyYWIgdGhlIGxpc3RzLgorCSAqLworCXdyaXRlX2xv Y2tfaXJxKCZyaC0+aGFzaF9sb2NrKTsKKwlzcGluX2xvY2soJnJoLT5yZWdpb25fbG9jayk7CisJ aWYgKCFsaXN0X2VtcHR5KCZyaC0+Y2xlYW5fcmVnaW9ucykpIHsKKwkJbGlzdF9zcGxpY2UoJnJo LT5jbGVhbl9yZWdpb25zLCAmY2xlYW4pOworCQlJTklUX0xJU1RfSEVBRCgmcmgtPmNsZWFuX3Jl Z2lvbnMpOworCisJCWxpc3RfZm9yX2VhY2hfZW50cnkgKHJlZywgJmNsZWFuLCBsaXN0KSB7CisJ CQlyaC0+bG9nLT50eXBlLT5jbGVhcl9yZWdpb24ocmgtPmxvZywgcmVnLT5rZXkpOworCQkJbGlz dF9kZWwoJnJlZy0+aGFzaF9saXN0KTsKKwkJfQorCX0KKworCWlmICghbGlzdF9lbXB0eSgmcmgt PnJlY292ZXJlZF9yZWdpb25zKSkgeworCQlsaXN0X3NwbGljZSgmcmgtPnJlY292ZXJlZF9yZWdp b25zLCAmcmVjb3ZlcmVkKTsKKwkJSU5JVF9MSVNUX0hFQUQoJnJoLT5yZWNvdmVyZWRfcmVnaW9u cyk7CisKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeSAocmVnLCAmcmVjb3ZlcmVkLCBsaXN0KQorCQkJ bGlzdF9kZWwoJnJlZy0+aGFzaF9saXN0KTsKKwl9CisJc3Bpbl91bmxvY2soJnJoLT5yZWdpb25f bG9jayk7CisJd3JpdGVfdW5sb2NrX2lycSgmcmgtPmhhc2hfbG9jayk7CisKKwkvKgorCSAqIEFs bCB0aGUgcmVnaW9ucyBvbiB0aGUgcmVjb3ZlcmVkIGFuZCBjbGVhbiBsaXN0cyBoYXZlCisJICog bm93IGJlZW4gcHVsbGVkIG91dCBvZiB0aGUgc3lzdGVtLCBzbyBubyBuZWVkIHRvIGRvCisJICog YW55IG1vcmUgbG9ja2luZy4KKwkgKi8KKwlsaXN0X2Zvcl9lYWNoX3NhZmUgKHRtcCwgdG1wMiwg JnJlY292ZXJlZCkgeworCQlyZWcgPSBsaXN0X2VudHJ5KHRtcCwgc3RydWN0IHJlZ2lvbiwgbGlz dCk7CisKKwkJcmgtPmxvZy0+dHlwZS0+Y29tcGxldGVfcmVzeW5jX3dvcmsocmgtPmxvZywgcmVn LT5rZXksIDEpOworCQlkaXNwYXRjaF9idWZmZXJzKHJoLT5tcywgcmVnLT5kZWxheWVkX2Jocyk7 CisJCXVwKCZyaC0+cmVjb3ZlcnlfY291bnQpOworCQltZW1wb29sX2ZyZWUocmVnLCByaC0+cmVn aW9uX3Bvb2wpOworCX0KKworCWxpc3RfZm9yX2VhY2hfc2FmZSAodG1wLCB0bXAyLCAmY2xlYW4p IHsKKwkJcmVnID0gbGlzdF9lbnRyeSh0bXAsIHN0cnVjdCByZWdpb24sIGxpc3QpOworCQltZW1w b29sX2ZyZWUocmVnLCByaC0+cmVnaW9uX3Bvb2wpOworCX0KK30KKworc3RhdGljIHZvaWQgcmhf aW5jKHN0cnVjdCByZWdpb25faGFzaCAqcmgsIHJlZ2lvbl90IHJlZ2lvbikKK3sKKwlzdHJ1Y3Qg cmVnaW9uICpyZWc7CisKKwlyZWFkX2xvY2soJnJoLT5oYXNoX2xvY2spOworCXJlZyA9IF9fcmhf ZmluZChyaCwgcmVnaW9uKTsKKwlpZiAocmVnLT5zdGF0ZSA9PSBSSF9DTEVBTikgeworCQlyaC0+ bG9nLT50eXBlLT5tYXJrX3JlZ2lvbihyaC0+bG9nLCByZWctPmtleSk7CisKKwkJc3Bpbl9sb2Nr X2lycSgmcmgtPnJlZ2lvbl9sb2NrKTsKKwkJcmVnLT5zdGF0ZSA9IFJIX0RJUlRZOworCQlsaXN0 X2RlbF9pbml0KCZyZWctPmxpc3QpOwkvKiB0YWtlIG9mZiB0aGUgY2xlYW4gbGlzdCAqLworCQlz cGluX3VubG9ja19pcnEoJnJoLT5yZWdpb25fbG9jayk7CisJfQorCisJYXRvbWljX2luYygmcmVn LT5wZW5kaW5nKTsKKwlyZWFkX3VubG9jaygmcmgtPmhhc2hfbG9jayk7Cit9CisKK3N0YXRpYyB2 b2lkIHJoX2luY19wZW5kaW5nKHN0cnVjdCByZWdpb25faGFzaCAqcmgsIHN0cnVjdCBidWZmZXJf bGlzdCAqYnVmZmVycykKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCisJZm9yIChiaCA9 IGJ1ZmZlcnMtPmhlYWQ7IGJoOyBiaCA9IGJoLT5iX3JlcW5leHQpCisJCXJoX2luYyhyaCwgYmhf dG9fcmVnaW9uKHJoLCBiaCkpOworfQorCitzdGF0aWMgdm9pZCByaF9kZWMoc3RydWN0IHJlZ2lv bl9oYXNoICpyaCwgcmVnaW9uX3QgcmVnaW9uKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJ c3RydWN0IHJlZ2lvbiAqcmVnOworCWludCB3YWtlID0gMDsKKworCXJlYWRfbG9jaygmcmgtPmhh c2hfbG9jayk7CisJcmVnID0gX19yaF9sb29rdXAocmgsIHJlZ2lvbik7CisJcmVhZF91bmxvY2so JnJoLT5oYXNoX2xvY2spOworCisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJnJlZy0+cGVuZGlu ZykpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnJoLT5yZWdpb25fbG9jaywgZmxhZ3MpOworCQlp ZiAocmVnLT5zdGF0ZSA9PSBSSF9SRUNPVkVSSU5HKSB7CisJCQlsaXN0X2FkZF90YWlsKCZyZWct Pmxpc3QsICZyaC0+cXVpZXNjZWRfcmVnaW9ucyk7CisJCX0gZWxzZSB7CisJCQlyZWctPnN0YXRl ID0gUkhfQ0xFQU47CisJCQlsaXN0X2FkZCgmcmVnLT5saXN0LCAmcmgtPmNsZWFuX3JlZ2lvbnMp OworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJoLT5yZWdpb25fbG9jaywgZmxhZ3Mp OworCQl3YWtlID0gMTsKKwl9CisKKwlpZiAod2FrZSkKKwkJZG1fZGFlbW9uX3dha2UoJl9rbWly cm9yZCk7Cit9CisKKy8qCisgKiBTdGFydHMgcXVpZXNjaW5nIGEgcmVnaW9uIGluIHByZXBhcmF0 aW9uIGZvciByZWNvdmVyeS4KKyAqLworc3RhdGljIGludCBfX3JoX3JlY292ZXJ5X3ByZXBhcmUo c3RydWN0IHJlZ2lvbl9oYXNoICpyaCkKK3sKKwlpbnQgcjsKKwlzdHJ1Y3QgcmVnaW9uICpyZWc7 CisJcmVnaW9uX3QgcmVnaW9uOworCisJLyoKKwkgKiBBc2sgdGhlIGRpcnR5IGxvZyB3aGF0J3Mg bmV4dC4KKwkgKi8KKwlyID0gcmgtPmxvZy0+dHlwZS0+Z2V0X3Jlc3luY193b3JrKHJoLT5sb2cs ICZyZWdpb24pOworCWlmIChyIDw9IDApCisJCXJldHVybiByOworCisJLyoKKwkgKiBHZXQgdGhp cyByZWdpb24sIGFuZCBzdGFydCBpdCBxdWllc2NpbmcgYnkgc2V0dGluZyB0aGUKKwkgKiByZWNv dmVyaW5nIGZsYWcuCisJICovCisJcmVhZF9sb2NrKCZyaC0+aGFzaF9sb2NrKTsKKwlyZWcgPSBf X3JoX2ZpbmQocmgsIHJlZ2lvbik7CisJcmVhZF91bmxvY2soJnJoLT5oYXNoX2xvY2spOworCisJ c3Bpbl9sb2NrX2lycSgmcmgtPnJlZ2lvbl9sb2NrKTsKKwlyZWctPnN0YXRlID0gUkhfUkVDT1ZF UklORzsKKworCS8qIEFscmVhZHkgcXVpZXNjZWQgPyAqLworCWlmIChhdG9taWNfcmVhZCgmcmVn LT5wZW5kaW5nKSkKKwkJbGlzdF9kZWxfaW5pdCgmcmVnLT5saXN0KTsKKworCWVsc2UgeworCQls aXN0X2RlbF9pbml0KCZyZWctPmxpc3QpOworCQlsaXN0X2FkZCgmcmVnLT5saXN0LCAmcmgtPnF1 aWVzY2VkX3JlZ2lvbnMpOworCX0KKwlzcGluX3VubG9ja19pcnEoJnJoLT5yZWdpb25fbG9jayk7 CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgcmhfcmVjb3ZlcnlfcHJlcGFyZShzdHJ1 Y3QgcmVnaW9uX2hhc2ggKnJoKQoreworCXdoaWxlICghZG93bl90cnlsb2NrKCZyaC0+cmVjb3Zl cnlfY291bnQpKQorCQlpZiAoX19yaF9yZWNvdmVyeV9wcmVwYXJlKHJoKSA8PSAwKSB7CisJCQl1 cCgmcmgtPnJlY292ZXJ5X2NvdW50KTsKKwkJCWJyZWFrOworCQl9Cit9CisKKy8qCisgKiBSZXR1 cm5zIGFueSBxdWllc2NlZCByZWdpb25zLgorICovCitzdGF0aWMgc3RydWN0IHJlZ2lvbiAqcmhf cmVjb3Zlcnlfc3RhcnQoc3RydWN0IHJlZ2lvbl9oYXNoICpyaCkKK3sKKwlzdHJ1Y3QgcmVnaW9u ICpyZWcgPSBOVUxMOworCisJc3Bpbl9sb2NrX2lycSgmcmgtPnJlZ2lvbl9sb2NrKTsKKwlpZiAo IWxpc3RfZW1wdHkoJnJoLT5xdWllc2NlZF9yZWdpb25zKSkgeworCQlyZWcgPSBsaXN0X2VudHJ5 KHJoLT5xdWllc2NlZF9yZWdpb25zLm5leHQsCisJCQkJIHN0cnVjdCByZWdpb24sIGxpc3QpOwor CQlsaXN0X2RlbF9pbml0KCZyZWctPmxpc3QpOwkvKiByZW1vdmUgZnJvbSB0aGUgcXVpZXNjZWQg bGlzdCAqLworCX0KKwlzcGluX3VubG9ja19pcnEoJnJoLT5yZWdpb25fbG9jayk7CisKKwlyZXR1 cm4gcmVnOworfQorCisvKiBGSVhNRTogc3VjY2VzcyBpZ25vcmVkIGZvciBub3cgKi8KK3N0YXRp YyB2b2lkIHJoX3JlY292ZXJ5X2VuZChzdHJ1Y3QgcmVnaW9uICpyZWcsIGludCBzdWNjZXNzKQor eworCXN0cnVjdCByZWdpb25faGFzaCAqcmggPSByZWctPnJoOworCisJc3Bpbl9sb2NrX2lycSgm cmgtPnJlZ2lvbl9sb2NrKTsKKwlsaXN0X2FkZCgmcmVnLT5saXN0LCAmcmVnLT5yaC0+cmVjb3Zl cmVkX3JlZ2lvbnMpOworCXNwaW5fdW5sb2NrX2lycSgmcmgtPnJlZ2lvbl9sb2NrKTsKKworCWRt X2RhZW1vbl93YWtlKCZfa21pcnJvcmQpOworfQorCitzdGF0aWMgdm9pZCByaF9mbHVzaChzdHJ1 Y3QgcmVnaW9uX2hhc2ggKnJoKQoreworCXJoLT5sb2ctPnR5cGUtPmZsdXNoKHJoLT5sb2cpOwor fQorCitzdGF0aWMgdm9pZCByaF9kZWxheShzdHJ1Y3QgcmVnaW9uX2hhc2ggKnJoLCBzdHJ1Y3Qg YnVmZmVyX2hlYWQgKmJoKQoreworCXN0cnVjdCByZWdpb24gKnJlZzsKKworCXJlYWRfbG9jaygm cmgtPmhhc2hfbG9jayk7CisJcmVnID0gX19yaF9maW5kKHJoLCBiaF90b19yZWdpb24ocmgsIGJo KSk7CisJYmgtPmJfcmVxbmV4dCA9IHJlZy0+ZGVsYXllZF9iaHM7CisJcmVnLT5kZWxheWVkX2Jo cyA9IGJoOworCXJlYWRfdW5sb2NrKCZyaC0+aGFzaF9sb2NrKTsKK30KKworc3RhdGljIHZvaWQg cmhfc3RvcF9yZWNvdmVyeShzdHJ1Y3QgcmVnaW9uX2hhc2ggKnJoKQoreworCWludCBpOworCisJ Lyogd2FpdCBmb3IgYW55IHJlY292ZXJpbmcgcmVnaW9ucyAqLworCWZvciAoaSA9IDA7IGkgPCBN QVhfUkVDT1ZFUlk7IGkrKykKKwkJZG93bigmcmgtPnJlY292ZXJ5X2NvdW50KTsKK30KKworc3Rh dGljIHZvaWQgcmhfc3RhcnRfcmVjb3Zlcnkoc3RydWN0IHJlZ2lvbl9oYXNoICpyaCkKK3sKKwlp bnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfUkVDT1ZFUlk7IGkrKykKKwkJdXAoJnJoLT5y ZWNvdmVyeV9jb3VudCk7CisKKwlkbV9kYWVtb25fd2FrZSgmX2ttaXJyb3JkKTsKK30KKworLyot LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLQorICogTWlycm9yIHNldCBzdHJ1Y3R1cmVzLgorICotLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RydWN0IG1p cnJvciB7CisJYXRvbWljX3QgZXJyb3JfY291bnQ7CisJc3RydWN0IGRtX2RldiAqZGV2OworCXNl Y3Rvcl90IG9mZnNldDsKK307CisKK3N0cnVjdCBtaXJyb3Jfc2V0IHsKKwlzdHJ1Y3QgZG1fdGFy Z2V0ICp0aTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IHJlZ2lvbl9oYXNoIHJo OworCXN0cnVjdCBrY29weWRfY2xpZW50ICprY29weWRfY2xpZW50OworCisJc3BpbmxvY2tfdCBs b2NrOwkvKiBwcm90ZWN0cyB0aGUgbmV4dCB0d28gbGlzdHMgKi8KKwlzdHJ1Y3QgYnVmZmVyX2xp c3QgcmVhZHM7CisJc3RydWN0IGJ1ZmZlcl9saXN0IHdyaXRlczsKKworCS8qIHJlY292ZXJ5ICov CisJcmVnaW9uX3QgbnJfcmVnaW9uczsKKwlyZWdpb25fdCBzeW5jX2NvdW50OworCisJdW5zaWdu ZWQgaW50IG5yX21pcnJvcnM7CisJc3RydWN0IG1pcnJvciBtaXJyb3JbMF07Cit9OworCisvKgor ICogRXZlcnkgbWlycm9yIHNob3VsZCBsb29rIGxpa2UgdGhpcyBvbmUuCisgKi8KKyNkZWZpbmUg REVGQVVMVF9NSVJST1IgMAorCisvKgorICogVGhpcyBpcyB5dWNreS4gIFdlIHNxdWlycmVsIHRo ZSBtaXJyb3Jfc2V0IHN0cnVjdCBhd2F5IGluc2lkZQorICogYl9yZXFuZXh0IGZvciB3cml0ZSBi dWZmZXJzLiAgVGhpcyBpcyBzYWZlIHNpbmNlIHRoZSBiaAorICogZG9lc24ndCBnZXQgc3VibWl0 dGVkIHRvIHRoZSBsb3dlciBsZXZlbHMgb2YgYmxvY2sgbGF5ZXIuCisgKi8KK3N0YXRpYyBzdHJ1 Y3QgbWlycm9yX3NldCAqYmhfZ2V0X21zKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJcmV0 dXJuIChzdHJ1Y3QgbWlycm9yX3NldCAqKSBiaC0+Yl9yZXFuZXh0OworfQorCitzdGF0aWMgdm9p ZCBiaF9zZXRfbXMoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgc3RydWN0IG1pcnJvcl9zZXQgKm1z KQoreworCWJoLT5iX3JlcW5leHQgPSAoc3RydWN0IGJ1ZmZlcl9oZWFkICopIG1zOworfQorCisv Ki0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tCisgKiBSZWNvdmVyeS4KKyAqCisgKiBXaGVuIGEgbWlycm9yIGlzIGZpcnN0IGFj dGl2YXRlZCB3ZSBtYXkgZmluZCB0aGF0IHNvbWUgcmVnaW9ucworICogYXJlIGluIHRoZSBuby1z eW5jIHN0YXRlLiAgV2UgaGF2ZSB0byByZWNvdmVyIHRoZXNlIGJ5CisgKiByZWNvcHlpbmcgZnJv bSB0aGUgZGVmYXVsdCBtaXJyb3IgdG8gYWxsIHRoZSBvdGhlcnMuCisgKi0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0 aWMgdm9pZCByZWNvdmVyeV9jb21wbGV0ZShpbnQgcmVhZF9lcnIsIHVuc2lnbmVkIGludCB3cml0 ZV9lcnIsCisJCQkgICAgICB2b2lkICpjb250ZXh0KQoreworCXN0cnVjdCByZWdpb24gKnJlZyA9 IChzdHJ1Y3QgcmVnaW9uICopIGNvbnRleHQ7CisJc3RydWN0IG1pcnJvcl9zZXQgKm1zID0gcmVn LT5yaC0+bXM7CisKKwkvKiBGSVhNRTogYmV0dGVyIGVycm9yIGhhbmRsaW5nICovCisJcmhfcmVj b3ZlcnlfZW5kKHJlZywgcmVhZF9lcnIgfHwgd3JpdGVfZXJyKTsKKwlpZiAoKyttcy0+c3luY19j b3VudCA9PSBtcy0+bnJfcmVnaW9ucykKKwkJLyogdGhlIHN5bmMgaXMgY29tcGxldGUgKi8KKwkJ ZG1fdGFibGVfZXZlbnQobXMtPnRpLT50YWJsZSk7Cit9CisKK3N0YXRpYyBpbnQgcmVjb3Zlcihz dHJ1Y3QgbWlycm9yX3NldCAqbXMsIHN0cnVjdCByZWdpb24gKnJlZykKK3sKKwlpbnQgcjsKKwl1 bnNpZ25lZCBpbnQgaTsKKwlzdHJ1Y3QgaW9fcmVnaW9uIGZyb20sIHRvW21zLT5ucl9taXJyb3Jz IC0gMV0sICpkZXN0OworCXN0cnVjdCBtaXJyb3IgKm07CisJdW5zaWduZWQgaW50IGZsYWdzID0g MDsKKworCS8qIGZpbGwgaW4gdGhlIHNvdXJjZSAqLworCW0gPSBtcy0+bWlycm9yICsgREVGQVVM VF9NSVJST1I7CisJZnJvbS5kZXYgPSBtLT5kZXYtPmRldjsKKwlmcm9tLnNlY3RvciA9IG0tPm9m ZnNldCArIHJlZ2lvbl90b19zZWN0b3IocmVnLT5yaCwgcmVnLT5rZXkpOworCWlmIChyZWctPmtl eSA9PSAobXMtPm5yX3JlZ2lvbnMgLSAxKSkgeworCQkvKgorCQkgKiBUaGUgZmluYWwgcmVnaW9u IG1heSBiZSBzbWFsbGVyIHRoYW4KKwkJICogcmVnaW9uX3NpemUuCisJCSAqLworCQlmcm9tLmNv dW50ID0gbXMtPnRpLT5sZW4gJiAocmVnLT5yaC0+cmVnaW9uX3NpemUgLSAxKTsKKwkJaWYgKCFm cm9tLmNvdW50KQorCQkJZnJvbS5jb3VudCA9IHJlZy0+cmgtPnJlZ2lvbl9zaXplOworCX0gZWxz ZQorCQlmcm9tLmNvdW50ID0gcmVnLT5yaC0+cmVnaW9uX3NpemU7CisKKwkvKiBmaWxsIGluIHRo ZSBkZXN0aW5hdGlvbnMgKi8KKwlmb3IgKGkgPSAxOyBpIDwgbXMtPm5yX21pcnJvcnM7IGkrKykg eworCQltID0gbXMtPm1pcnJvciArIGk7CisJCWRlc3QgPSB0byArIChpIC0gMSk7CisKKwkJZGVz dC0+ZGV2ID0gbS0+ZGV2LT5kZXY7CisJCWRlc3QtPnNlY3RvciA9IG0tPm9mZnNldCArIHJlZ2lv bl90b19zZWN0b3IocmVnLT5yaCwgcmVnLT5rZXkpOworCQlkZXN0LT5jb3VudCA9IGZyb20uY291 bnQ7CisJfQorCisJLyogaGFuZCB0byBrY29weWQgKi8KKwlzZXRfYml0KEtDT1BZRF9JR05PUkVf RVJST1IsICZmbGFncyk7CisJciA9IGtjb3B5ZF9jb3B5KG1zLT5rY29weWRfY2xpZW50LCAmZnJv bSwgbXMtPm5yX21pcnJvcnMgLSAxLCB0bywgZmxhZ3MsCisJCQlyZWNvdmVyeV9jb21wbGV0ZSwg cmVnKTsKKworCXJldHVybiByOworfQorCitzdGF0aWMgdm9pZCBkb19yZWNvdmVyeShzdHJ1Y3Qg bWlycm9yX3NldCAqbXMpCit7CisJaW50IHI7CisJc3RydWN0IHJlZ2lvbiAqcmVnOworCisJLyoK KwkgKiBTdGFydCBxdWllc2Npbmcgc29tZSByZWdpb25zLgorCSAqLworCXJoX3JlY292ZXJ5X3By ZXBhcmUoJm1zLT5yaCk7CisKKwkvKgorCSAqIENvcHkgYW55IGFscmVhZHkgcXVpZXNjZWQgcmVn aW9ucy4KKwkgKi8KKwl3aGlsZSAoKHJlZyA9IHJoX3JlY292ZXJ5X3N0YXJ0KCZtcy0+cmgpKSkg eworCQlyID0gcmVjb3ZlcihtcywgcmVnKTsKKwkJaWYgKHIpCisJCQlyaF9yZWNvdmVyeV9lbmQo cmVnLCAwKTsKKwl9Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFJlYWRzCisgKi0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0 aWMgc3RydWN0IG1pcnJvciAqY2hvb3NlX21pcnJvcihzdHJ1Y3QgbWlycm9yX3NldCAqbXMsIHNl Y3Rvcl90IHNlY3RvcikKK3sKKwkvKiBGSVhNRTogYWRkIHJlYWQgYmFsYW5jaW5nICovCisJcmV0 dXJuIG1zLT5taXJyb3IgKyBERUZBVUxUX01JUlJPUjsKK30KKworLyoKKyAqIHJlbWFwIGEgYnVm ZmVyIHRvIGEgcGFydGljdWxhciBtaXJyb3IuCisgKi8KK3N0YXRpYyB2b2lkIG1hcF9idWZmZXIo c3RydWN0IG1pcnJvcl9zZXQgKm1zLAorCQkgICAgICAgc3RydWN0IG1pcnJvciAqbSwgc3RydWN0 IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwlzZWN0b3JfdCBic2l6ZSA9IGJoLT5iX3NpemUgPj4gOTsK KwlzZWN0b3JfdCByc2VjdG9yID0gYmgtPmJfYmxvY2tuciAqIGJzaXplOworCisJYmgtPmJfcmRl diA9IG0tPmRldi0+ZGV2OworCWJoLT5iX3JzZWN0b3IgPSBtLT5vZmZzZXQgKyAocnNlY3RvciAt IG1zLT50aS0+YmVnaW4pOworfQorCitzdGF0aWMgdm9pZCBkb19yZWFkcyhzdHJ1Y3QgbWlycm9y X3NldCAqbXMsIHN0cnVjdCBidWZmZXJfbGlzdCAqcmVhZHMpCit7CisJcmVnaW9uX3QgcmVnaW9u OworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJc3RydWN0IG1pcnJvciAqbTsKKworCXdoaWxl ICgoYmggPSBidWZmZXJfbGlzdF9wb3AocmVhZHMpKSkgeworCQlyZWdpb24gPSBiaF90b19yZWdp b24oJm1zLT5yaCwgYmgpOworCisJCS8qCisJCSAqIFdlIGNhbiBvbmx5IHJlYWQgYmFsYW5jZSBp ZiB0aGUgcmVnaW9uIGlzIGluIHN5bmMuCisJCSAqLworCQlpZiAocmhfaW5fc3luYygmbXMtPnJo LCByZWdpb24sIDApKQorCQkJbSA9IGNob29zZV9taXJyb3IobXMsIGJoLT5iX3JzZWN0b3IpOwor CQllbHNlCisJCQltID0gbXMtPm1pcnJvciArIERFRkFVTFRfTUlSUk9SOworCisJCW1hcF9idWZm ZXIobXMsIG0sIGJoKTsKKwkJZ2VuZXJpY19tYWtlX3JlcXVlc3QoUkVBRCwgYmgpOworCX0KK30K KworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLQorICogV3JpdGVzLgorICoKKyAqIFdlIGRvIGRpZmZlcmVudCB0aGluZ3Mg d2l0aCB0aGUgd3JpdGUgaW8gZGVwZW5kaW5nIG9uIHRoZQorICogc3RhdGUgb2YgdGhlIHJlZ2lv biB0aGF0IGl0J3MgaW46CisgKgorICogU1lOQzogCWluY3JlbWVudCBwZW5kaW5nLCB1c2Uga2Nv cHlkIHRvIHdyaXRlIHRvICphbGwqIG1pcnJvcnMKKyAqIFJFQ09WRVJJTkc6CWRlbGF5IHRoZSBp byB1bnRpbCByZWNvdmVyeSBjb21wbGV0ZXMKKyAqIE5PU1lOQzoJaW5jcmVtZW50IHBlbmRpbmcs IGp1c3Qgd3JpdGUgdG8gdGhlIGRlZmF1bHQgbWlycm9yCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdm9p ZCB3cml0ZV9jYWxsYmFjayh1bnNpZ25lZCBpbnQgZXJyb3IsIHZvaWQgKmNvbnRleHQpCit7CisJ dW5zaWduZWQgaW50IGk7CisJaW50IHVwdG9kYXRlID0gMTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQg KmJoID0gKHN0cnVjdCBidWZmZXJfaGVhZCAqKSBjb250ZXh0OworCXN0cnVjdCBtaXJyb3Jfc2V0 ICptczsKKworCW1zID0gYmhfZ2V0X21zKGJoKTsKKwliaF9zZXRfbXMoYmgsIE5VTEwpOworCisJ LyoKKwkgKiBOT1RFOiBXZSBkb24ndCBkZWNyZW1lbnQgdGhlIHBlbmRpbmcgY291bnQgaGVyZSwK KwkgKiBpbnN0ZWFkIGl0IGlzIGRvbmUgYnkgdGhlIHRhcmdldHMgZW5kaW8gZnVuY3Rpb24uCisJ ICogVGhpcyB3YXkgd2UgaGFuZGxlIGJvdGggd3JpdGVzIHRvIFNZTkMgYW5kIE5PU1lOQworCSAq IHJlZ2lvbnMgd2l0aCB0aGUgc2FtZSBjb2RlLgorCSAqLworCisJaWYgKGVycm9yKSB7CisJCS8q CisJCSAqIG9ubHkgZXJyb3IgdGhlIGlvIGlmIGFsbCBtaXJyb3JzIGZhaWxlZC4KKwkJICogRklY TUU6IGJvZ3VzCisJCSAqLworCQl1cHRvZGF0ZSA9IDA7CisJCWZvciAoaSA9IDA7IGkgPCBtcy0+ bnJfbWlycm9yczsgaSsrKQorCQkJaWYgKCF0ZXN0X2JpdChpLCAmZXJyb3IpKSB7CisJCQkJdXB0 b2RhdGUgPSAxOworCQkJCWJyZWFrOworCQkJfQorCX0KKwliaC0+Yl9lbmRfaW8oYmgsIHVwdG9k YXRlKTsKK30KKworc3RhdGljIHZvaWQgZG9fd3JpdGUoc3RydWN0IG1pcnJvcl9zZXQgKm1zLCBz dHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCXVuc2lnbmVkIGludCBpOworCXN0cnVjdCBpb19y ZWdpb24gaW9bbXMtPm5yX21pcnJvcnNdOworCXN0cnVjdCBtaXJyb3IgKm07CisKKwlmb3IgKGkg PSAwOyBpIDwgbXMtPm5yX21pcnJvcnM7IGkrKykgeworCQltID0gbXMtPm1pcnJvciArIGk7CisK KwkJaW9baV0uZGV2ID0gbS0+ZGV2LT5kZXY7CisJCWlvW2ldLnNlY3RvciA9IG0tPm9mZnNldCAr IChiaC0+Yl9yc2VjdG9yIC0gbXMtPnRpLT5iZWdpbik7CisJCWlvW2ldLmNvdW50ID0gYmgtPmJf c2l6ZSA+PiA5OworCX0KKworCWJoX3NldF9tcyhiaCwgbXMpOworCWRtX2lvX2FzeW5jKG1zLT5u cl9taXJyb3JzLCBpbywgV1JJVEUsIGJoLT5iX3BhZ2UsCisJCSAgICAodW5zaWduZWQgaW50KSBi aC0+Yl9kYXRhICYgflBBR0VfTUFTSywgd3JpdGVfY2FsbGJhY2ssIGJoKTsKK30KKworc3RhdGlj IHZvaWQgZG9fd3JpdGVzKHN0cnVjdCBtaXJyb3Jfc2V0ICptcywgc3RydWN0IGJ1ZmZlcl9saXN0 ICp3cml0ZXMpCit7CisJaW50IHN0YXRlOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJc3Ry dWN0IGJ1ZmZlcl9saXN0IHN5bmMsIG5vc3luYywgcmVjb3ZlciwgKnRoaXNfbGlzdCA9IE5VTEw7 CisKKwlpZiAoIXdyaXRlcy0+aGVhZCkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBDbGFzc2lmeSBl YWNoIHdyaXRlLgorCSAqLworCWJ1ZmZlcl9saXN0X2luaXQoJnN5bmMpOworCWJ1ZmZlcl9saXN0 X2luaXQoJm5vc3luYyk7CisJYnVmZmVyX2xpc3RfaW5pdCgmcmVjb3Zlcik7CisKKwl3aGlsZSAo KGJoID0gYnVmZmVyX2xpc3RfcG9wKHdyaXRlcykpKSB7CisJCXN0YXRlID0gcmhfc3RhdGUoJm1z LT5yaCwgYmhfdG9fcmVnaW9uKCZtcy0+cmgsIGJoKSwgMSk7CisJCXN3aXRjaCAoc3RhdGUpIHsK KwkJY2FzZSBSSF9DTEVBTjoKKwkJY2FzZSBSSF9ESVJUWToKKwkJCXRoaXNfbGlzdCA9ICZzeW5j OworCQkJYnJlYWs7CisKKwkJY2FzZSBSSF9OT1NZTkM6CisJCQl0aGlzX2xpc3QgPSAmbm9zeW5j OworCQkJYnJlYWs7CisKKwkJY2FzZSBSSF9SRUNPVkVSSU5HOgorCQkJdGhpc19saXN0ID0gJnJl Y292ZXI7CisJCQlicmVhazsKKwkJfQorCisJCWJ1ZmZlcl9saXN0X2FkZCh0aGlzX2xpc3QsIGJo KTsKKwl9CisKKwkvKgorCSAqIEluY3JlbWVudCB0aGUgcGVuZGluZyBjb3VudHMgZm9yIGFueSBy ZWdpb25zIHRoYXQgd2lsbAorCSAqIGJlIHdyaXR0ZW4gdG8gKHdyaXRlcyB0byByZWNvdmVyIHJl Z2lvbnMgYXJlIGdvaW5nIHRvCisJICogYmUgZGVsYXllZCkuCisJICovCisJcmhfaW5jX3BlbmRp bmcoJm1zLT5yaCwgJnN5bmMpOworCXJoX2luY19wZW5kaW5nKCZtcy0+cmgsICZub3N5bmMpOwor CXJoX2ZsdXNoKCZtcy0+cmgpOworCisJLyoKKwkgKiBEaXNwYXRjaCBpby4KKwkgKi8KKwl3aGls ZSAoKGJoID0gYnVmZmVyX2xpc3RfcG9wKCZzeW5jKSkpCisJCWRvX3dyaXRlKG1zLCBiaCk7CisK Kwl3aGlsZSAoKGJoID0gYnVmZmVyX2xpc3RfcG9wKCZyZWNvdmVyKSkpCisJCXJoX2RlbGF5KCZt cy0+cmgsIGJoKTsKKworCXdoaWxlICgoYmggPSBidWZmZXJfbGlzdF9wb3AoJm5vc3luYykpKSB7 CisJCW1hcF9idWZmZXIobXMsIG1zLT5taXJyb3IgKyBERUZBVUxUX01JUlJPUiwgYmgpOworCQln ZW5lcmljX21ha2VfcmVxdWVzdChXUklURSwgYmgpOworCX0KK30KKworLyotLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICog a21pcnJvcmQKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBMSVNUX0hFQUQoX21pcnJvcl9zZXRzKTsKK3N0 YXRpYyBERUNMQVJFX1JXU0VNKF9taXJyb3Jfc2V0c19sb2NrKTsKKworc3RhdGljIHZvaWQgZG9f bWlycm9yKHN0cnVjdCBtaXJyb3Jfc2V0ICptcykKK3sKKwlzdHJ1Y3QgYnVmZmVyX2xpc3QgcmVh ZHMsIHdyaXRlczsKKworCXNwaW5fbG9jaygmbXMtPmxvY2spOworCW1lbWNweSgmcmVhZHMsICZt cy0+cmVhZHMsIHNpemVvZihyZWFkcykpOworCWJ1ZmZlcl9saXN0X2luaXQoJm1zLT5yZWFkcyk7 CisJbWVtY3B5KCZ3cml0ZXMsICZtcy0+d3JpdGVzLCBzaXplb2Yod3JpdGVzKSk7CisJYnVmZmVy X2xpc3RfaW5pdCgmbXMtPndyaXRlcyk7CisJc3Bpbl91bmxvY2soJm1zLT5sb2NrKTsKKworCXJo X3VwZGF0ZV9zdGF0ZXMoJm1zLT5yaCk7CisJZG9fcmVjb3ZlcnkobXMpOworCWRvX3JlYWRzKG1z LCAmcmVhZHMpOworCWRvX3dyaXRlcyhtcywgJndyaXRlcyk7CisJcnVuX3Rhc2tfcXVldWUoJnRx X2Rpc2spOworfQorCitzdGF0aWMgdm9pZCBkb193b3JrKHZvaWQpCit7CisJc3RydWN0IG1pcnJv cl9zZXQgKm1zOworCisJZG93bl9yZWFkKCZfbWlycm9yX3NldHNfbG9jayk7CisJbGlzdF9mb3Jf ZWFjaF9lbnRyeSAobXMsICZfbWlycm9yX3NldHMsIGxpc3QpCisJCWRvX21pcnJvcihtcyk7CisJ dXBfcmVhZCgmX21pcnJvcl9zZXRzX2xvY2spOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBUYXJnZXQg ZnVuY3Rpb25zCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgc3RydWN0IG1pcnJvcl9zZXQgKmFsbG9jX2Nv bnRleHQodW5zaWduZWQgaW50IG5yX21pcnJvcnMsCisJCQkJCXNlY3Rvcl90IHJlZ2lvbl9zaXpl LAorCQkJCQlzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSwKKwkJCQkJc3RydWN0IGRpcnR5X2xvZyAqZGwp Cit7CisJc2l6ZV90IGxlbjsKKwlzdHJ1Y3QgbWlycm9yX3NldCAqbXMgPSBOVUxMOworCisJaWYg KGFycmF5X3Rvb19iaWcoc2l6ZW9mKCptcyksIHNpemVvZihtcy0+bWlycm9yWzBdKSwgbnJfbWly cm9ycykpCisJCXJldHVybiBOVUxMOworCisJbGVuID0gc2l6ZW9mKCptcykgKyAoc2l6ZW9mKG1z LT5taXJyb3JbMF0pICogbnJfbWlycm9ycyk7CisKKwltcyA9IGttYWxsb2MobGVuLCBHRlBfS0VS TkVMKTsKKwlpZiAoIW1zKSB7CisJCXRpLT5lcnJvciA9ICJkbS1taXJyb3I6IENhbm5vdCBhbGxv Y2F0ZSBtaXJyb3IgY29udGV4dCI7CisJCXJldHVybiBOVUxMOworCX0KKworCW1lbXNldChtcywg MCwgbGVuKTsKKwlzcGluX2xvY2tfaW5pdCgmbXMtPmxvY2spOworCisJbXMtPnRpID0gdGk7CisJ bXMtPm5yX21pcnJvcnMgPSBucl9taXJyb3JzOworCW1zLT5ucl9yZWdpb25zID0gZG1fZGl2X3Vw KHRpLT5sZW4sIHJlZ2lvbl9zaXplKTsKKworCWlmIChyaF9pbml0KCZtcy0+cmgsIG1zLCBkbCwg cmVnaW9uX3NpemUsIG1zLT5ucl9yZWdpb25zKSkgeworCQl0aS0+ZXJyb3IgPSAiZG0tbWlycm9y OiBFcnJvciBjcmVhdGluZyBkaXJ0eSByZWdpb24gaGFzaCI7CisJCWtmcmVlKG1zKTsKKwkJcmV0 dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIG1zOworfQorCitzdGF0aWMgdm9pZCBmcmVlX2NvbnRl eHQoc3RydWN0IG1pcnJvcl9zZXQgKm1zLCBzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSwKKwkJCSB1bnNp Z25lZCBpbnQgbSkKK3sKKwl3aGlsZSAobS0tKQorCQlkbV9wdXRfZGV2aWNlKHRpLCBtcy0+bWly cm9yW21dLmRldik7CisKKwlyaF9leGl0KCZtcy0+cmgpOworCWtmcmVlKG1zKTsKK30KKworc3Rh dGljIGlubGluZSBpbnQgX2NoZWNrX3JlZ2lvbl9zaXplKHN0cnVjdCBkbV90YXJnZXQgKnRpLCBz ZWN0b3JfdCBzaXplKQoreworCXJldHVybiAhKHNpemUgJSAoUEFHRV9TSVpFID4+IDkpIHx8IChz aXplICYgKHNpemUgLSAxKSkgfHwKKwkJIHNpemUgPiB0aS0+bGVuKTsKK30KKworc3RhdGljIGlu dCBnZXRfbWlycm9yKHN0cnVjdCBtaXJyb3Jfc2V0ICptcywgc3RydWN0IGRtX3RhcmdldCAqdGks CisJCSAgICAgIHVuc2lnbmVkIGludCBtaXJyb3IsIGNoYXIgKiphcmd2KQoreworCXNlY3Rvcl90 IG9mZnNldDsKKworCWlmIChzc2NhbmYoYXJndlsxXSwgU0VDVE9SX0ZPUk1BVCwgJm9mZnNldCkg IT0gMSkgeworCQl0aS0+ZXJyb3IgPSAiZG0tbWlycm9yOiBJbnZhbGlkIG9mZnNldCI7CisJCXJl dHVybiAtRUlOVkFMOworCX0KKworCWlmIChkbV9nZXRfZGV2aWNlKHRpLCBhcmd2WzBdLCBvZmZz ZXQsIHRpLT5sZW4sCisJCQkgIGRtX3RhYmxlX2dldF9tb2RlKHRpLT50YWJsZSksCisJCQkgICZt cy0+bWlycm9yW21pcnJvcl0uZGV2KSkgeworCQl0aS0+ZXJyb3IgPSAiZG0tbWlycm9yOiBEZXZp Y2UgbG9va3VwIGZhaWx1cmUiOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCW1zLT5taXJyb3Jb bWlycm9yXS5vZmZzZXQgPSBvZmZzZXQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBh ZGRfbWlycm9yX3NldChzdHJ1Y3QgbWlycm9yX3NldCAqbXMpCit7CisJZG93bl93cml0ZSgmX21p cnJvcl9zZXRzX2xvY2spOworCWxpc3RfYWRkX3RhaWwoJm1zLT5saXN0LCAmX21pcnJvcl9zZXRz KTsKKwl1cF93cml0ZSgmX21pcnJvcl9zZXRzX2xvY2spOworCWRtX2RhZW1vbl93YWtlKCZfa21p cnJvcmQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRlbF9taXJyb3Jfc2V0KHN0 cnVjdCBtaXJyb3Jfc2V0ICptcykKK3sKKwlkb3duX3dyaXRlKCZfbWlycm9yX3NldHNfbG9jayk7 CisJbGlzdF9kZWwoJm1zLT5saXN0KTsKKwl1cF93cml0ZSgmX21pcnJvcl9zZXRzX2xvY2spOwor fQorCisvKgorICogQ3JlYXRlIGRpcnR5IGxvZzogbG9nX3R5cGUgI2xvZ19wYXJhbXMgPGxvZ19w YXJhbXM+CisgKi8KK3N0YXRpYyBzdHJ1Y3QgZGlydHlfbG9nICpjcmVhdGVfZGlydHlfbG9nKHN0 cnVjdCBkbV90YXJnZXQgKnRpLAorCQkJCQkgIHVuc2lnbmVkIGludCBhcmdjLCBjaGFyICoqYXJn diwKKwkJCQkJICB1bnNpZ25lZCBpbnQgKmFyZ3NfdXNlZCkKK3sKKwl1bnNpZ25lZCBpbnQgcGFy YW1fY291bnQ7CisJc3RydWN0IGRpcnR5X2xvZyAqZGw7CisKKwlpZiAoYXJnYyA8IDIpIHsKKwkJ dGktPmVycm9yID0gImRtLW1pcnJvcjogSW5zdWZmaWNpZW50IG1pcnJvciBsb2cgYXJndW1lbnRz IjsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKHNzY2FuZihhcmd2WzFdLCAiJXUiLCAmcGFy YW1fY291bnQpICE9IDEgfHwgcGFyYW1fY291bnQgIT0gMSkgeworCQl0aS0+ZXJyb3IgPSAiZG0t bWlycm9yOiBJbnZhbGlkIG1pcnJvciBsb2cgYXJndW1lbnQgY291bnQiOworCQlyZXR1cm4gTlVM TDsKKwl9CisKKwkqYXJnc191c2VkID0gMiArIHBhcmFtX2NvdW50OworCisJaWYgKGFyZ2MgPCAq YXJnc191c2VkKSB7CisJCXRpLT5lcnJvciA9ICJkbS1taXJyb3I6IEluc3VmZmljaWVudCBtaXJy b3IgbG9nIGFyZ3VtZW50cyI7CisJCXJldHVybiBOVUxMOworCX0KKworCWRsID0gZG1fY3JlYXRl X2RpcnR5X2xvZyhhcmd2WzBdLCB0aS0+bGVuLCBwYXJhbV9jb3VudCwgYXJndiArIDIpOworCWlm ICghZGwpIHsKKwkJdGktPmVycm9yID0gImRtLW1pcnJvcjogRXJyb3IgY3JlYXRpbmcgbWlycm9y IGRpcnR5IGxvZyI7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmICghX2NoZWNrX3JlZ2lvbl9z aXplKHRpLCBkbC0+dHlwZS0+Z2V0X3JlZ2lvbl9zaXplKGRsKSkpIHsKKwkJdGktPmVycm9yID0g ImRtLW1pcnJvcjogSW52YWxpZCByZWdpb24gc2l6ZSI7CisJCWRtX2Rlc3Ryb3lfZGlydHlfbG9n KGRsKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIGRsOworfQorCisvKgorICogQ29u c3RydWN0IGEgbWlycm9yIG1hcHBpbmc6CisgKgorICogbG9nX3R5cGUgI2xvZ19wYXJhbXMgPGxv Z19wYXJhbXM+CisgKiAjbWlycm9ycyBbbWlycm9yX3BhdGggb2Zmc2V0XXsyLH0KKyAqCisgKiBG b3Igbm93LCAjbG9nX3BhcmFtcyA9IDEsIGxvZ190eXBlID0gImNvcmUiCisgKgorICovCisjZGVm aW5lIERNX0lPX1BBR0VTIDY0CitzdGF0aWMgaW50IG1pcnJvcl9jdHIoc3RydWN0IGRtX3Rhcmdl dCAqdGksIHVuc2lnbmVkIGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQgcjsKKwl1bnNp Z25lZCBpbnQgbnJfbWlycm9ycywgbSwgYXJnc191c2VkOworCXN0cnVjdCBtaXJyb3Jfc2V0ICpt czsKKwlzdHJ1Y3QgZGlydHlfbG9nICpkbDsKKworCWRsID0gY3JlYXRlX2RpcnR5X2xvZyh0aSwg YXJnYywgYXJndiwgJmFyZ3NfdXNlZCk7CisJaWYgKCFkbCkKKwkJcmV0dXJuIC1FSU5WQUw7CisK Kwlhcmd2ICs9IGFyZ3NfdXNlZDsKKwlhcmdjIC09IGFyZ3NfdXNlZDsKKworCWlmICghYXJnYyB8 fCBzc2NhbmYoYXJndlswXSwgIiV1IiwgJm5yX21pcnJvcnMpICE9IDEgfHwKKwkgICAgbnJfbWly cm9ycyA8IDIpIHsKKwkJdGktPmVycm9yID0gImRtLW1pcnJvcjogSW52YWxpZCBudW1iZXIgb2Yg bWlycm9ycyI7CisJCWRtX2Rlc3Ryb3lfZGlydHlfbG9nKGRsKTsKKwkJcmV0dXJuIC1FSU5WQUw7 CisJfQorCisJYXJndisrLCBhcmdjLS07CisKKwlpZiAoYXJnYyAhPSBucl9taXJyb3JzICogMikg eworCQl0aS0+ZXJyb3IgPSAiZG0tbWlycm9yOiBXcm9uZyBudW1iZXIgb2YgbWlycm9yIGFyZ3Vt ZW50cyI7CisJCWRtX2Rlc3Ryb3lfZGlydHlfbG9nKGRsKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJ fQorCisJbXMgPSBhbGxvY19jb250ZXh0KG5yX21pcnJvcnMsIGRsLT50eXBlLT5nZXRfcmVnaW9u X3NpemUoZGwpLCB0aSwgZGwpOworCWlmICghbXMpIHsKKwkJZG1fZGVzdHJveV9kaXJ0eV9sb2co ZGwpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKiBHZXQgdGhlIG1pcnJvciBwYXJhbWV0 ZXIgc2V0cyAqLworCWZvciAobSA9IDA7IG0gPCBucl9taXJyb3JzOyBtKyspIHsKKwkJciA9IGdl dF9taXJyb3IobXMsIHRpLCBtLCBhcmd2KTsKKwkJaWYgKHIpIHsKKwkJCWZyZWVfY29udGV4dCht cywgdGksIG0pOworCQkJcmV0dXJuIHI7CisJCX0KKwkJYXJndiArPSAyOworCQlhcmdjIC09IDI7 CisJfQorCisJdGktPnByaXZhdGUgPSBtczsKKworCXIgPSBrY29weWRfY2xpZW50X2NyZWF0ZShE TV9JT19QQUdFUywgJm1zLT5rY29weWRfY2xpZW50KTsKKwlpZiAocikgeworCQlmcmVlX2NvbnRl eHQobXMsIHRpLCBtcy0+bnJfbWlycm9ycyk7CisJCXJldHVybiByOworCX0KKworCWFkZF9taXJy b3Jfc2V0KG1zKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbWlycm9yX2R0cihzdHJ1 Y3QgZG1fdGFyZ2V0ICp0aSkKK3sKKwlzdHJ1Y3QgbWlycm9yX3NldCAqbXMgPSAoc3RydWN0IG1p cnJvcl9zZXQgKikgdGktPnByaXZhdGU7CisKKwlkZWxfbWlycm9yX3NldChtcyk7CisJa2NvcHlk X2NsaWVudF9kZXN0cm95KG1zLT5rY29weWRfY2xpZW50KTsKKwlmcmVlX2NvbnRleHQobXMsIHRp LCBtcy0+bnJfbWlycm9ycyk7Cit9CisKK3N0YXRpYyB2b2lkIHF1ZXVlX2JoKHN0cnVjdCBtaXJy b3Jfc2V0ICptcywgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgaW50IHJ3KQoreworCWludCB3YWtl ID0gMDsKKwlzdHJ1Y3QgYnVmZmVyX2xpc3QgKmJsOworCisJYmwgPSAocncgPT0gV1JJVEUpID8g Jm1zLT53cml0ZXMgOiAmbXMtPnJlYWRzOworCXNwaW5fbG9jaygmbXMtPmxvY2spOworCXdha2Ug PSAhKGJsLT5oZWFkKTsKKwlidWZmZXJfbGlzdF9hZGQoYmwsIGJoKTsKKwlzcGluX3VubG9jaygm bXMtPmxvY2spOworCisJaWYgKHdha2UpCisJCWRtX2RhZW1vbl93YWtlKCZfa21pcnJvcmQpOwor fQorCisvKgorICogTWlycm9yIG1hcHBpbmcgZnVuY3Rpb24KKyAqLworc3RhdGljIGludCBtaXJy b3JfbWFwKHN0cnVjdCBkbV90YXJnZXQgKnRpLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLAorCQkg ICAgICBpbnQgcncsIHVuaW9uIG1hcF9pbmZvICptYXBfY29udGV4dCkKK3sKKwlpbnQgcjsKKwlz dHJ1Y3QgbWlycm9yICptOworCXN0cnVjdCBtaXJyb3Jfc2V0ICptcyA9IHRpLT5wcml2YXRlOwor CisJLyogRklYTUU6IG5hc3R5IGhhY2ssIDMyIGJpdCBzZWN0b3JfdCBvbmx5ICovCisJbWFwX2Nv bnRleHQtPmxsID0gYmgtPmJfcnNlY3RvciAvIG1zLT5yaC5yZWdpb25fc2l6ZTsKKworCWlmIChy dyA9PSBXUklURSkgeworCQlxdWV1ZV9iaChtcywgYmgsIHJ3KTsKKwkJcmV0dXJuIDA7CisJfQor CisJciA9IG1zLT5yaC5sb2ctPnR5cGUtPmluX3N5bmMobXMtPnJoLmxvZywgYmhfdG9fcmVnaW9u KCZtcy0+cmgsIGJoKSwgMCk7CisJaWYgKHIgPCAwICYmIHIgIT0gLUVXT1VMREJMT0NLKQorCQly ZXR1cm4gcjsKKworCWlmIChyID09IC1FV09VTERCTE9DSykJLyogRklYTUU6IHVnbHkgKi8KKwkJ ciA9IDA7CisKKwkvKgorCSAqIFdlIGRvbid0IHdhbnQgdG8gZmFzdCB0cmFjayBhIHJlY292ZXJ5 IGp1c3QgZm9yIGEgcmVhZAorCSAqIGFoZWFkLiAgU28gd2UganVzdCBsZXQgaXQgc2lsZW50bHkg ZmFpbC4KKwkgKiBGSVhNRTogZ2V0IHJpZCBvZiB0aGlzLgorCSAqLworCWlmICghciAmJiBydyA9 PSBSRUFEQSkKKwkJcmV0dXJuIC1FSU87CisKKwlpZiAoIXIpIHsKKwkJLyogUGFzcyB0aGlzIGlv IG92ZXIgdG8gdGhlIGRhZW1vbiAqLworCQlxdWV1ZV9iaChtcywgYmgsIHJ3KTsKKwkJcmV0dXJu IDA7CisJfQorCisJbSA9IGNob29zZV9taXJyb3IobXMsIGJoLT5iX3JzZWN0b3IpOworCWlmICgh bSkKKwkJcmV0dXJuIC1FSU87CisKKwltYXBfYnVmZmVyKG1zLCBtLCBiaCk7CisJcmV0dXJuIDE7 Cit9CisKK3N0YXRpYyBpbnQgbWlycm9yX2VuZF9pbyhzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSwgc3Ry dWN0IGJ1ZmZlcl9oZWFkICpiaCwKKwkJCSBpbnQgcncsIGludCBlcnJvciwgdW5pb24gbWFwX2lu Zm8gKm1hcF9jb250ZXh0KQoreworCXN0cnVjdCBtaXJyb3Jfc2V0ICptcyA9IChzdHJ1Y3QgbWly cm9yX3NldCAqKSB0aS0+cHJpdmF0ZTsKKwlyZWdpb25fdCByZWdpb24gPSBtYXBfY29udGV4dC0+ bGw7CisKKwkvKgorCSAqIFdlIG5lZWQgdG8gZGVjIHBlbmRpbmcgaWYgdGhpcyB3YXMgYSB3cml0 ZS4KKwkgKi8KKwlpZiAocncgPT0gV1JJVEUpCisJCXJoX2RlYygmbXMtPnJoLCByZWdpb24pOwor CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG1pcnJvcl9zdXNwZW5kKHN0cnVjdCBkbV90 YXJnZXQgKnRpKQoreworCXN0cnVjdCBtaXJyb3Jfc2V0ICptcyA9IChzdHJ1Y3QgbWlycm9yX3Nl dCAqKSB0aS0+cHJpdmF0ZTsKKwlyaF9zdG9wX3JlY292ZXJ5KCZtcy0+cmgpOworfQorCitzdGF0 aWMgdm9pZCBtaXJyb3JfcmVzdW1lKHN0cnVjdCBkbV90YXJnZXQgKnRpKQoreworCXN0cnVjdCBt aXJyb3Jfc2V0ICptcyA9IChzdHJ1Y3QgbWlycm9yX3NldCAqKSB0aS0+cHJpdmF0ZTsKKwlyaF9z dGFydF9yZWNvdmVyeSgmbXMtPnJoKTsKK30KKworc3RhdGljIGludCBtaXJyb3Jfc3RhdHVzKHN0 cnVjdCBkbV90YXJnZXQgKnRpLCBzdGF0dXNfdHlwZV90IHR5cGUsCisJCQkgY2hhciAqcmVzdWx0 LCB1bnNpZ25lZCBpbnQgbWF4bGVuKQoreworCXVuc2lnbmVkIGludCBtLCBzeiA9IDA7CisJc3Ry dWN0IG1pcnJvcl9zZXQgKm1zID0gKHN0cnVjdCBtaXJyb3Jfc2V0ICopIHRpLT5wcml2YXRlOwor CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBTVEFUVVNUWVBFX0lORk86CisJCXN6ICs9IHNucHJp bnRmKHJlc3VsdCArIHN6LCBtYXhsZW4gLSBzeiwgIiVkICIsIG1zLT5ucl9taXJyb3JzKTsKKwor CQlmb3IgKG0gPSAwOyBtIDwgbXMtPm5yX21pcnJvcnM7IG0rKykKKwkJCXN6ICs9IHNucHJpbnRm KHJlc3VsdCArIHN6LCBtYXhsZW4gLSBzeiwgIiVzICIsCisJCQkJICAgICAgIGRtX2tkZXZuYW1l KG1zLT5taXJyb3JbbV0uZGV2LT5kZXYpKTsKKworCQlzeiArPSBzbnByaW50ZihyZXN1bHQgKyBz eiwgbWF4bGVuIC0gc3osICIlbHUvJWx1IiwKKwkJCSAgICAgICBtcy0+c3luY19jb3VudCwgbXMt Pm5yX3JlZ2lvbnMpOworCQlicmVhazsKKworCWNhc2UgU1RBVFVTVFlQRV9UQUJMRToKKwkJc3og Kz0gc25wcmludGYocmVzdWx0ICsgc3osIG1heGxlbiAtIHN6LAorCQkJICAgICAgICIlcyAxICIg U0VDVE9SX0ZPUk1BVCAiICVkICIsCisJCQkgICAgICAgbXMtPnJoLmxvZy0+dHlwZS0+bmFtZSwg bXMtPnJoLnJlZ2lvbl9zaXplLAorCQkJICAgICAgIG1zLT5ucl9taXJyb3JzKTsKKworCQlmb3Ig KG0gPSAwOyBtIDwgbXMtPm5yX21pcnJvcnM7IG0rKykKKwkJCXN6ICs9IHNucHJpbnRmKHJlc3Vs dCArIHN6LCBtYXhsZW4gLSBzeiwgIiVzICVsZCAiLAorCQkJCSAgICAgICBkbV9rZGV2bmFtZSht cy0+bWlycm9yW21dLmRldi0+ZGV2KSwKKwkJCQkgICAgICAgbXMtPm1pcnJvclttXS5vZmZzZXQp OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHRhcmdldF90eXBlIG1pcnJv cl90YXJnZXQgPSB7CisJLm5hbWUJID0gIm1pcnJvciIsCisJLm1vZHVsZQkgPSBUSElTX01PRFVM RSwKKwkuY3RyCSA9IG1pcnJvcl9jdHIsCisJLmR0cgkgPSBtaXJyb3JfZHRyLAorCS5tYXAJID0g bWlycm9yX21hcCwKKwkuZW5kX2lvCSA9IG1pcnJvcl9lbmRfaW8sCisJLnN1c3BlbmQgPSBtaXJy b3Jfc3VzcGVuZCwKKwkucmVzdW1lCSA9IG1pcnJvcl9yZXN1bWUsCisJLnN0YXR1cwkgPSBtaXJy b3Jfc3RhdHVzLAorfTsKKworc3RhdGljIGludCBfX2luaXQgZG1fbWlycm9yX2luaXQodm9pZCkK K3sKKwlpbnQgcjsKKworCXIgPSBkbV9kaXJ0eV9sb2dfaW5pdCgpOworCWlmIChyKQorCQlyZXR1 cm4gcjsKKworCXIgPSBkbV9kYWVtb25fc3RhcnQoJl9rbWlycm9yZCwgImttaXJyb3JkIiwgZG9f d29yayk7CisJaWYgKHIpIHsKKwkJRE1FUlIoImNvdWxkbid0IHN0YXJ0IGttaXJyb3JkIik7CisJ CWRtX2RpcnR5X2xvZ19leGl0KCk7CisJCXJldHVybiByOworCX0KKworCXIgPSBkbV9yZWdpc3Rl cl90YXJnZXQoJm1pcnJvcl90YXJnZXQpOworCWlmIChyIDwgMCkgeworCQlETUVSUigiJXM6IEZh aWxlZCB0byByZWdpc3RlciBtaXJyb3IgdGFyZ2V0IiwKKwkJICAgICAgbWlycm9yX3RhcmdldC5u YW1lKTsKKwkJZG1fZGlydHlfbG9nX2V4aXQoKTsKKwkJZG1fZGFlbW9uX3N0b3AoJl9rbWlycm9y ZCk7CisJfQorCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkbV9taXJyb3Jf ZXhpdCh2b2lkKQoreworCWludCByOworCisJciA9IGRtX3VucmVnaXN0ZXJfdGFyZ2V0KCZtaXJy b3JfdGFyZ2V0KTsKKwlpZiAociA8IDApCisJCURNRVJSKCIlczogdW5yZWdpc3RlciBmYWlsZWQg JWQiLCBtaXJyb3JfdGFyZ2V0Lm5hbWUsIHIpOworCisJZG1fZGFlbW9uX3N0b3AoJl9rbWlycm9y ZCk7CisJZG1fZGlydHlfbG9nX2V4aXQoKTsKK30KKworLyogTW9kdWxlIGhvb2tzICovCittb2R1 bGVfaW5pdChkbV9taXJyb3JfaW5pdCk7Cittb2R1bGVfZXhpdChkbV9taXJyb3JfZXhpdCk7CisK K01PRFVMRV9ERVNDUklQVElPTihETV9OQU1FICIgbWlycm9yIHRhcmdldCIpOworTU9EVUxFX0FV VEhPUigiSGVpbnogTWF1ZWxzaGFnZW4gPG1nZUBzaXN0aW5hLmNvbT4iKTsKK01PRFVMRV9MSUNF TlNFKCJHUEwiKTsKLS0tIGRpZmYvZHJpdmVycy9tZC9kbS1zbmFwc2hvdC5jCTE5NzAtMDEtMDEg MDE6MDA6MDAuMDAwMDAwMDAwICswMTAwCisrKyBzb3VyY2UvZHJpdmVycy9tZC9kbS1zbmFwc2hv dC5jCTIwMDMtMDgtMjYgMTM6NTk6MDQuMDAwMDAwMDAwICswMTAwCkBAIC0wLDAgKzEsMTIzNSBA QAorLyoKKyAqIGRtLXNuYXBzaG90LmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMiBT aXN0aW5hIFNvZnR3YXJlIChVSykgTGltaXRlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcmVsZWFz ZWQgdW5kZXIgdGhlIEdQTC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5j bHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRl IDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4 L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5o PgorI2luY2x1ZGUgPGxpbnV4L21lbXBvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UtbWFw cGVyLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorCisjaW5jbHVkZSAiZG0tc25hcHNo b3QuaCIKKyNpbmNsdWRlICJrY29weWQuaCIKKworLyoKKyAqIEZJWE1FOiBSZW1vdmUgdGhpcyBi ZWZvcmUgcmVsZWFzZS4KKyAqLworI2lmIDAKKyNkZWZpbmUgRE1ERUJVRyh4Li4uKSBETVdBUk4o ICMjIHgpCisjZWxzZQorI2RlZmluZSBETURFQlVHKHguLi4pCisjZW5kaWYKKworLyoKKyAqIFRo ZSBwZXJjZW50YWdlIGluY3JlbWVudCB3ZSB3aWxsIHdha2UgdXAgdXNlcnMgYXQKKyAqLworI2Rl ZmluZSBXQUtFX1VQX1BFUkNFTlQgNQorCisvKgorICoga2NvcHlkIHByaW9yaXR5IG9mIHNuYXBz aG90IG9wZXJhdGlvbnMKKyAqLworI2RlZmluZSBTTkFQU0hPVF9DT1BZX1BSSU9SSVRZIDIKKwor LyoKKyAqIEVhY2ggc25hcHNob3QgcmVzZXJ2ZXMgdGhpcyBtYW55IHBhZ2VzIGZvciBpbworICog RklYTUU6IGNhbGN1bGF0ZSB0aGlzCisgKi8KKyNkZWZpbmUgU05BUFNIT1RfUEFHRVMgMjU2CisK K3N0cnVjdCBwZW5kaW5nX2V4Y2VwdGlvbiB7CisJc3RydWN0IGV4Y2VwdGlvbiBlOworCisJLyoK KwkgKiBPcmlnaW4gYnVmZmVycyB3YWl0aW5nIGZvciB0aGlzIHRvIGNvbXBsZXRlIGFyZSBoZWxk CisJICogaW4gYSBsaXN0ICh1c2luZyBiX3JlcW5leHQpLgorCSAqLworCXN0cnVjdCBidWZmZXJf aGVhZCAqb3JpZ2luX2JoczsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnNuYXBzaG90X2JoczsKKwor CS8qCisJICogT3RoZXIgcGVuZGluZ19leGNlcHRpb25zIHRoYXQgYXJlIHByb2Nlc3NpbmcgdGhp cworCSAqIGNodW5rLiAgV2hlbiB0aGlzIGxpc3QgaXMgZW1wdHksIHdlIGtub3cgd2UgY2FuCisJ ICogY29tcGxldGUgdGhlIG9yaWdpbnMuCisJICovCisJc3RydWN0IGxpc3RfaGVhZCBzaWJsaW5n czsKKworCS8qIFBvaW50ZXIgYmFjayB0byBzbmFwc2hvdCBjb250ZXh0ICovCisJc3RydWN0IGRt X3NuYXBzaG90ICpzbmFwOworCisJLyoKKwkgKiAxIGluZGljYXRlcyB0aGUgZXhjZXB0aW9uIGhh cyBhbHJlYWR5IGJlZW4gc2VudCB0bworCSAqIGtjb3B5ZC4KKwkgKi8KKwlpbnQgc3RhcnRlZDsK K307CisKKy8qCisgKiBIYXNoIHRhYmxlIG1hcHBpbmcgb3JpZ2luIHZvbHVtZXMgdG8gbGlzdHMg b2Ygc25hcHNob3RzIGFuZAorICogYSBsb2NrIHRvIHByb3RlY3QgaXQKKyAqLworc3RhdGljIGtt ZW1fY2FjaGVfdCAqZXhjZXB0aW9uX2NhY2hlOworc3RhdGljIGttZW1fY2FjaGVfdCAqcGVuZGlu Z19jYWNoZTsKK3N0YXRpYyBtZW1wb29sX3QgKnBlbmRpbmdfcG9vbDsKKworLyoKKyAqIE9uZSBv ZiB0aGVzZSBwZXIgcmVnaXN0ZXJlZCBvcmlnaW4sIGhlbGQgaW4gdGhlIHNuYXBzaG90X29yaWdp bnMgaGFzaAorICovCitzdHJ1Y3Qgb3JpZ2luIHsKKwkvKiBUaGUgb3JpZ2luIGRldmljZSAqLwor CWtkZXZfdCBkZXY7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkIGhhc2hfbGlzdDsKKworCS8qIExpc3Qg b2Ygc25hcHNob3RzIGZvciB0aGlzIG9yaWdpbiAqLworCXN0cnVjdCBsaXN0X2hlYWQgc25hcHNo b3RzOworfTsKKworLyoKKyAqIFNpemUgb2YgdGhlIGhhc2ggdGFibGUgZm9yIG9yaWdpbiB2b2x1 bWVzLiBJZiB3ZSBtYWtlIHRoaXMKKyAqIHRoZSBzaXplIG9mIHRoZSBtaW5vcnMgbGlzdCB0aGVu IGl0IHNob3VsZCBiZSBuZWFybHkgcGVyZmVjdAorICovCisjZGVmaW5lIE9SSUdJTl9IQVNIX1NJ WkUgMjU2CisjZGVmaW5lIE9SSUdJTl9NQVNLICAgICAgMHhGRgorc3RhdGljIHN0cnVjdCBsaXN0 X2hlYWQgKl9vcmlnaW5zOworc3RhdGljIHN0cnVjdCByd19zZW1hcGhvcmUgX29yaWdpbnNfbG9j azsKKworc3RhdGljIGludCBpbml0X29yaWdpbl9oYXNoKHZvaWQpCit7CisJaW50IGk7CisKKwlf b3JpZ2lucyA9IGttYWxsb2MoT1JJR0lOX0hBU0hfU0laRSAqIHNpemVvZihzdHJ1Y3QgbGlzdF9o ZWFkKSwKKwkJCSAgIEdGUF9LRVJORUwpOworCWlmICghX29yaWdpbnMpIHsKKwkJRE1FUlIoIkRl dmljZSBtYXBwZXI6IFNuYXBzaG90OiB1bmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5Iik7CisJCXJl dHVybiAtRU5PTUVNOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBPUklHSU5fSEFTSF9TSVpFOyBp KyspCisJCUlOSVRfTElTVF9IRUFEKF9vcmlnaW5zICsgaSk7CisJaW5pdF9yd3NlbSgmX29yaWdp bnNfbG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZXhpdF9vcmlnaW5faGFz aCh2b2lkKQoreworCWtmcmVlKF9vcmlnaW5zKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25l ZCBpbnQgb3JpZ2luX2hhc2goa2Rldl90IGRldikKK3sKKwlyZXR1cm4gTUlOT1IoZGV2KSAmIE9S SUdJTl9NQVNLOworfQorCitzdGF0aWMgc3RydWN0IG9yaWdpbiAqX19sb29rdXBfb3JpZ2luKGtk ZXZfdCBvcmlnaW4pCit7CisJc3RydWN0IGxpc3RfaGVhZCAqc2xpc3Q7CisJc3RydWN0IGxpc3Rf aGVhZCAqb2w7CisJc3RydWN0IG9yaWdpbiAqbzsKKworCW9sID0gJl9vcmlnaW5zW29yaWdpbl9o YXNoKG9yaWdpbildOworCWxpc3RfZm9yX2VhY2goc2xpc3QsIG9sKSB7CisJCW8gPSBsaXN0X2Vu dHJ5KHNsaXN0LCBzdHJ1Y3Qgb3JpZ2luLCBoYXNoX2xpc3QpOworCisJCWlmIChvLT5kZXYgPT0g b3JpZ2luKQorCQkJcmV0dXJuIG87CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2 b2lkIF9faW5zZXJ0X29yaWdpbihzdHJ1Y3Qgb3JpZ2luICpvKQoreworCXN0cnVjdCBsaXN0X2hl YWQgKnNsID0gJl9vcmlnaW5zW29yaWdpbl9oYXNoKG8tPmRldildOworCWxpc3RfYWRkX3RhaWwo Jm8tPmhhc2hfbGlzdCwgc2wpOworfQorCisvKgorICogTWFrZSBhIG5vdGUgb2YgdGhlIHNuYXBz aG90IGFuZCBpdHMgb3JpZ2luIHNvIHdlIGNhbiBsb29rIGl0CisgKiB1cCB3aGVuIHRoZSBvcmln aW4gaGFzIGEgd3JpdGUgb24gaXQuCisgKi8KK3N0YXRpYyBpbnQgcmVnaXN0ZXJfc25hcHNob3Qo c3RydWN0IGRtX3NuYXBzaG90ICpzbmFwKQoreworCXN0cnVjdCBvcmlnaW4gKm87CisJa2Rldl90 IGRldiA9IHNuYXAtPm9yaWdpbi0+ZGV2OworCisJZG93bl93cml0ZSgmX29yaWdpbnNfbG9jayk7 CisJbyA9IF9fbG9va3VwX29yaWdpbihkZXYpOworCisJaWYgKCFvKSB7CisJCS8qIE5ldyBvcmln aW4gKi8KKwkJbyA9IGttYWxsb2Moc2l6ZW9mKCpvKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghbykg eworCQkJdXBfd3JpdGUoJl9vcmlnaW5zX2xvY2spOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0K KworCQkvKiBJbml0aWFsaXNlIHRoZSBzdHJ1Y3QgKi8KKwkJSU5JVF9MSVNUX0hFQUQoJm8tPnNu YXBzaG90cyk7CisJCW8tPmRldiA9IGRldjsKKworCQlfX2luc2VydF9vcmlnaW4obyk7CisJfQor CisJbGlzdF9hZGRfdGFpbCgmc25hcC0+bGlzdCwgJm8tPnNuYXBzaG90cyk7CisKKwl1cF93cml0 ZSgmX29yaWdpbnNfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHVucmVnaXN0 ZXJfc25hcHNob3Qoc3RydWN0IGRtX3NuYXBzaG90ICpzKQoreworCXN0cnVjdCBvcmlnaW4gKm87 CisKKwlkb3duX3dyaXRlKCZfb3JpZ2luc19sb2NrKTsKKwlvID0gX19sb29rdXBfb3JpZ2luKHMt Pm9yaWdpbi0+ZGV2KTsKKworCWxpc3RfZGVsKCZzLT5saXN0KTsKKwlpZiAobGlzdF9lbXB0eSgm by0+c25hcHNob3RzKSkgeworCQlsaXN0X2RlbCgmby0+aGFzaF9saXN0KTsKKwkJa2ZyZWUobyk7 CisJfQorCisJdXBfd3JpdGUoJl9vcmlnaW5zX2xvY2spOworfQorCisvKgorICogSW1wbGVtZW50 YXRpb24gb2YgdGhlIGV4Y2VwdGlvbiBoYXNoIHRhYmxlcy4KKyAqLworc3RhdGljIGludCBpbml0 X2V4Y2VwdGlvbl90YWJsZShzdHJ1Y3QgZXhjZXB0aW9uX3RhYmxlICpldCwgdWludDMyX3Qgc2l6 ZSkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWV0LT5oYXNoX21hc2sgPSBzaXplIC0gMTsKKwll dC0+dGFibGUgPSB2Y2FsbG9jKHNpemUsIHNpemVvZihzdHJ1Y3QgbGlzdF9oZWFkKSk7CisJaWYg KCFldC0+dGFibGUpCisJCXJldHVybiAtRU5PTUVNOworCisJZm9yIChpID0gMDsgaSA8IHNpemU7 IGkrKykKKwkJSU5JVF9MSVNUX0hFQUQoZXQtPnRhYmxlICsgaSk7CisKKwlyZXR1cm4gMDsKK30K Kworc3RhdGljIHZvaWQgZXhpdF9leGNlcHRpb25fdGFibGUoc3RydWN0IGV4Y2VwdGlvbl90YWJs ZSAqZXQsIGttZW1fY2FjaGVfdCAqbWVtKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnNsb3QsICpl bnRyeSwgKnRlbXA7CisJc3RydWN0IGV4Y2VwdGlvbiAqZXg7CisJaW50IGksIHNpemU7CisKKwlz aXplID0gZXQtPmhhc2hfbWFzayArIDE7CisJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgewor CQlzbG90ID0gZXQtPnRhYmxlICsgaTsKKworCQlsaXN0X2Zvcl9lYWNoX3NhZmUoZW50cnksIHRl bXAsIHNsb3QpIHsKKwkJCWV4ID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IGV4Y2VwdGlvbiwg aGFzaF9saXN0KTsKKwkJCWttZW1fY2FjaGVfZnJlZShtZW0sIGV4KTsKKwkJfQorCX0KKworCXZm cmVlKGV0LT50YWJsZSk7Cit9CisKKy8qCisgKiBGSVhNRTogY2hlY2sgaG93IHRoaXMgaGFzaCBm biBpcyBwZXJmb3JtaW5nLgorICovCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGV4Y2VwdGlvbl9o YXNoKHN0cnVjdCBleGNlcHRpb25fdGFibGUgKmV0LCBjaHVua190IGNodW5rKQoreworCXJldHVy biBjaHVuayAmIGV0LT5oYXNoX21hc2s7Cit9CisKK3N0YXRpYyB2b2lkIGluc2VydF9leGNlcHRp b24oc3RydWN0IGV4Y2VwdGlvbl90YWJsZSAqZWgsIHN0cnVjdCBleGNlcHRpb24gKmUpCit7CisJ c3RydWN0IGxpc3RfaGVhZCAqbCA9ICZlaC0+dGFibGVbZXhjZXB0aW9uX2hhc2goZWgsIGUtPm9s ZF9jaHVuayldOworCWxpc3RfYWRkKCZlLT5oYXNoX2xpc3QsIGwpOworfQorCitzdGF0aWMgaW5s aW5lIHZvaWQgcmVtb3ZlX2V4Y2VwdGlvbihzdHJ1Y3QgZXhjZXB0aW9uICplKQoreworCWxpc3Rf ZGVsKCZlLT5oYXNoX2xpc3QpOworfQorCisvKgorICogUmV0dXJuIHRoZSBleGNlcHRpb24gZGF0 YSBmb3IgYSBzZWN0b3IsIG9yIE5VTEwgaWYgbm90CisgKiByZW1hcHBlZC4KKyAqLworc3RhdGlj IHN0cnVjdCBleGNlcHRpb24gKmxvb2t1cF9leGNlcHRpb24oc3RydWN0IGV4Y2VwdGlvbl90YWJs ZSAqZXQsCisJCQkJCSAgY2h1bmtfdCBjaHVuaykKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpzbG90 LCAqZWw7CisJc3RydWN0IGV4Y2VwdGlvbiAqZTsKKworCXNsb3QgPSAmZXQtPnRhYmxlW2V4Y2Vw dGlvbl9oYXNoKGV0LCBjaHVuayldOworCWxpc3RfZm9yX2VhY2goZWwsIHNsb3QpIHsKKwkJZSA9 IGxpc3RfZW50cnkoZWwsIHN0cnVjdCBleGNlcHRpb24sIGhhc2hfbGlzdCk7CisJCWlmIChlLT5v bGRfY2h1bmsgPT0gY2h1bmspCisJCQlyZXR1cm4gZTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30K Kworc3RhdGljIGlubGluZSBzdHJ1Y3QgZXhjZXB0aW9uICphbGxvY19leGNlcHRpb24odm9pZCkK K3sKKwlzdHJ1Y3QgZXhjZXB0aW9uICplOworCisJZSA9IGttZW1fY2FjaGVfYWxsb2MoZXhjZXB0 aW9uX2NhY2hlLCBHRlBfTk9JTyk7CisJaWYgKCFlKQorCQllID0ga21lbV9jYWNoZV9hbGxvYyhl eGNlcHRpb25fY2FjaGUsIEdGUF9BVE9NSUMpOworCisJcmV0dXJuIGU7Cit9CisKK3N0YXRpYyBp bmxpbmUgdm9pZCBmcmVlX2V4Y2VwdGlvbihzdHJ1Y3QgZXhjZXB0aW9uICplKQoreworCWttZW1f Y2FjaGVfZnJlZShleGNlcHRpb25fY2FjaGUsIGUpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVj dCBwZW5kaW5nX2V4Y2VwdGlvbiAqYWxsb2NfcGVuZGluZ19leGNlcHRpb24odm9pZCkKK3sKKwly ZXR1cm4gbWVtcG9vbF9hbGxvYyhwZW5kaW5nX3Bvb2wsIEdGUF9OT0lPKTsKK30KKworc3RhdGlj IGlubGluZSB2b2lkIGZyZWVfcGVuZGluZ19leGNlcHRpb24oc3RydWN0IHBlbmRpbmdfZXhjZXB0 aW9uICpwZSkKK3sKKwltZW1wb29sX2ZyZWUocGUsIHBlbmRpbmdfcG9vbCk7Cit9CisKK2ludCBk bV9hZGRfZXhjZXB0aW9uKHN0cnVjdCBkbV9zbmFwc2hvdCAqcywgY2h1bmtfdCBvbGQsIGNodW5r X3QgbmV3KQoreworCXN0cnVjdCBleGNlcHRpb24gKmU7CisKKwllID0gYWxsb2NfZXhjZXB0aW9u KCk7CisJaWYgKCFlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWUtPm9sZF9jaHVuayA9IG9sZDsK KwllLT5uZXdfY2h1bmsgPSBuZXc7CisJaW5zZXJ0X2V4Y2VwdGlvbigmcy0+Y29tcGxldGUsIGUp OworCXJldHVybiAwOworfQorCisvKgorICogSGFyZCBjb2RlZCBtYWdpYy4KKyAqLworc3RhdGlj IGludCBjYWxjX21heF9idWNrZXRzKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBtZW07CisKKwlt ZW0gPSBudW1fcGh5c3BhZ2VzIDw8IFBBR0VfU0hJRlQ7CisJbWVtIC89IDUwOworCW1lbSAvPSBz aXplb2Yoc3RydWN0IGxpc3RfaGVhZCk7CisKKwlyZXR1cm4gbWVtOworfQorCisvKgorICogUm91 bmRzIGEgbnVtYmVyIGRvd24gdG8gYSBwb3dlciBvZiAyLgorICovCitzdGF0aWMgaW5saW5lIHVp bnQzMl90IHJvdW5kX2Rvd24odWludDMyX3QgbikKK3sKKwl3aGlsZSAobiAmIChuIC0gMSkpCisJ CW4gJj0gKG4gLSAxKTsKKwlyZXR1cm4gbjsKK30KKworLyoKKyAqIEFsbG9jYXRlIHJvb20gZm9y IGEgc3VpdGFibGUgaGFzaCB0YWJsZS4KKyAqLworc3RhdGljIGludCBpbml0X2hhc2hfdGFibGVz KHN0cnVjdCBkbV9zbmFwc2hvdCAqcykKK3sKKwlzZWN0b3JfdCBoYXNoX3NpemUsIGNvd19kZXZf c2l6ZSwgb3JpZ2luX2Rldl9zaXplLCBtYXhfYnVja2V0czsKKworCS8qCisJICogQ2FsY3VsYXRl IGJhc2VkIG9uIHRoZSBzaXplIG9mIHRoZSBvcmlnaW5hbCB2b2x1bWUgb3IKKwkgKiB0aGUgQ09X IHZvbHVtZS4uLgorCSAqLworCWNvd19kZXZfc2l6ZSA9IGdldF9kZXZfc2l6ZShzLT5jb3ctPmRl dik7CisJb3JpZ2luX2Rldl9zaXplID0gZ2V0X2Rldl9zaXplKHMtPm9yaWdpbi0+ZGV2KTsKKwlt YXhfYnVja2V0cyA9IGNhbGNfbWF4X2J1Y2tldHMoKTsKKworCWhhc2hfc2l6ZSA9IG1pbihvcmln aW5fZGV2X3NpemUsIGNvd19kZXZfc2l6ZSkgLyBzLT5jaHVua19zaXplOworCWhhc2hfc2l6ZSA9 IG1pbihoYXNoX3NpemUsIG1heF9idWNrZXRzKTsKKworCS8qIFJvdW5kIGl0IGRvd24gdG8gYSBw b3dlciBvZiAyICovCisJaGFzaF9zaXplID0gcm91bmRfZG93bihoYXNoX3NpemUpOworCWlmIChp bml0X2V4Y2VwdGlvbl90YWJsZSgmcy0+Y29tcGxldGUsIGhhc2hfc2l6ZSkpCisJCXJldHVybiAt RU5PTUVNOworCisJLyoKKwkgKiBBbGxvY2F0ZSBoYXNoIHRhYmxlIGZvciBpbi1mbGlnaHQgZXhj ZXB0aW9ucworCSAqIE1ha2UgdGhpcyBzbWFsbGVyIHRoYW4gdGhlIHJlYWwgaGFzaCB0YWJsZQor CSAqLworCWhhc2hfc2l6ZSA+Pj0gMzsKKwlpZiAoIWhhc2hfc2l6ZSkKKwkJaGFzaF9zaXplID0g NjQ7CisKKwlpZiAoaW5pdF9leGNlcHRpb25fdGFibGUoJnMtPnBlbmRpbmcsIGhhc2hfc2l6ZSkp IHsKKwkJZXhpdF9leGNlcHRpb25fdGFibGUoJnMtPmNvbXBsZXRlLCBleGNlcHRpb25fY2FjaGUp OworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFJvdW5k IGEgbnVtYmVyIHVwIHRvIHRoZSBuZWFyZXN0ICdzaXplJyBib3VuZGFyeS4gIHNpemUgbXVzdAor ICogYmUgYSBwb3dlciBvZiAyLgorICovCitzdGF0aWMgaW5saW5lIHVsb25nIHJvdW5kX3VwKHVs b25nIG4sIHVsb25nIHNpemUpCit7CisJc2l6ZS0tOworCXJldHVybiAobiArIHNpemUpICYgfnNp emU7Cit9CisKKy8qCisgKiBDb25zdHJ1Y3QgYSBzbmFwc2hvdCBtYXBwaW5nOiA8b3JpZ2luX2Rl dj4gPENPVy1kZXY+IDxwL24+IDxjaHVuay1zaXplPgorICovCitzdGF0aWMgaW50IHNuYXBzaG90 X2N0cihzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSwgdW5zaWduZWQgaW50IGFyZ2MsIGNoYXIgKiphcmd2 KQoreworCXN0cnVjdCBkbV9zbmFwc2hvdCAqczsKKwl1bnNpZ25lZCBsb25nIGNodW5rX3NpemU7 CisJaW50IHIgPSAtRUlOVkFMOworCWNoYXIgcGVyc2lzdGVudDsKKwljaGFyICpvcmlnaW5fcGF0 aDsKKwljaGFyICpjb3dfcGF0aDsKKwljaGFyICp2YWx1ZTsKKwlpbnQgYmxvY2tzaXplOworCisJ aWYgKGFyZ2MgPCA0KSB7CisJCXRpLT5lcnJvciA9ICJkbS1zbmFwc2hvdDogcmVxdWlyZXMgZXhh Y3RseSA0IGFyZ3VtZW50cyI7CisJCXIgPSAtRUlOVkFMOworCQlnb3RvIGJhZDE7CisJfQorCisJ b3JpZ2luX3BhdGggPSBhcmd2WzBdOworCWNvd19wYXRoID0gYXJndlsxXTsKKwlwZXJzaXN0ZW50 ID0gdG91cHBlcigqYXJndlsyXSk7CisKKwlpZiAocGVyc2lzdGVudCAhPSAnUCcgJiYgcGVyc2lz dGVudCAhPSAnTicpIHsKKwkJdGktPmVycm9yID0gIlBlcnNpc3RlbnQgZmxhZyBpcyBub3QgUCBv ciBOIjsKKwkJciA9IC1FSU5WQUw7CisJCWdvdG8gYmFkMTsKKwl9CisKKwljaHVua19zaXplID0g c2ltcGxlX3N0cnRvdWwoYXJndlszXSwgJnZhbHVlLCAxMCk7CisJaWYgKGNodW5rX3NpemUgPT0g MCB8fCB2YWx1ZSA9PSBOVUxMKSB7CisJCXRpLT5lcnJvciA9ICJJbnZhbGlkIGNodW5rIHNpemUi OworCQlyID0gLUVJTlZBTDsKKwkJZ290byBiYWQxOworCX0KKworCXMgPSBrbWFsbG9jKHNpemVv ZigqcyksIEdGUF9LRVJORUwpOworCWlmIChzID09IE5VTEwpIHsKKwkJdGktPmVycm9yID0gIkNh bm5vdCBhbGxvY2F0ZSBzbmFwc2hvdCBjb250ZXh0IHByaXZhdGUgIgorCQkgICAgInN0cnVjdHVy ZSI7CisJCXIgPSAtRU5PTUVNOworCQlnb3RvIGJhZDE7CisJfQorCisJciA9IGRtX2dldF9kZXZp Y2UodGksIG9yaWdpbl9wYXRoLCAwLCB0aS0+bGVuLCBGTU9ERV9SRUFELCAmcy0+b3JpZ2luKTsK KwlpZiAocikgeworCQl0aS0+ZXJyb3IgPSAiQ2Fubm90IGdldCBvcmlnaW4gZGV2aWNlIjsKKwkJ Z290byBiYWQyOworCX0KKworCS8qIEZJWE1FOiBnZXQgY293IGxlbmd0aCAqLworCXIgPSBkbV9n ZXRfZGV2aWNlKHRpLCBjb3dfcGF0aCwgMCwgMCwKKwkJCSAgRk1PREVfUkVBRCB8IEZNT0RFX1dS SVRFLCAmcy0+Y293KTsKKwlpZiAocikgeworCQlkbV9wdXRfZGV2aWNlKHRpLCBzLT5vcmlnaW4p OworCQl0aS0+ZXJyb3IgPSAiQ2Fubm90IGdldCBDT1cgZGV2aWNlIjsKKwkJZ290byBiYWQyOwor CX0KKworCS8qCisJICogQ2h1bmsgc2l6ZSBtdXN0IGJlIG11bHRpcGxlIG9mIHBhZ2Ugc2l6ZS4g IFNpbGVudGx5CisJICogcm91bmQgdXAgaWYgaXQncyBub3QuCisJICovCisJY2h1bmtfc2l6ZSA9 IHJvdW5kX3VwKGNodW5rX3NpemUsIFBBR0VfU0laRSAvIFNFQ1RPUl9TSVpFKTsKKworCS8qIFZh bGlkYXRlIHRoZSBjaHVuayBzaXplIGFnYWluc3QgdGhlIGRldmljZSBibG9jayBzaXplICovCisJ YmxvY2tzaXplID0gZ2V0X2hhcmRzZWN0X3NpemUocy0+Y293LT5kZXYpOworCWlmIChjaHVua19z aXplICUgKGJsb2Nrc2l6ZSAvIFNFQ1RPUl9TSVpFKSkgeworCQl0aS0+ZXJyb3IgPSAiQ2h1bmsg c2l6ZSBpcyBub3QgYSBtdWx0aXBsZSBvZiBkZXZpY2UgYmxvY2tzaXplIjsKKwkJciA9IC1FSU5W QUw7CisJCWdvdG8gYmFkMzsKKwl9CisKKwkvKiBDaGVjayB0aGUgc2l6ZXMgYXJlIHNtYWxsIGVu b3VnaCB0byBmaXQgaW4gb25lIGtpb3ZlYyAqLworCWlmIChjaHVua19zaXplID4gS0lPX01BWF9T RUNUT1JTKSB7CisJCXRpLT5lcnJvciA9ICJDaHVuayBzaXplIGlzIHRvbyBiaWciOworCQlyID0g LUVJTlZBTDsKKwkJZ290byBiYWQzOworCX0KKworCS8qIENoZWNrIGNodW5rX3NpemUgaXMgYSBw b3dlciBvZiAyICovCisJaWYgKGNodW5rX3NpemUgJiAoY2h1bmtfc2l6ZSAtIDEpKSB7CisJCXRp LT5lcnJvciA9ICJDaHVuayBzaXplIGlzIG5vdCBhIHBvd2VyIG9mIDIiOworCQlyID0gLUVJTlZB TDsKKwkJZ290byBiYWQzOworCX0KKworCXMtPmNodW5rX3NpemUgPSBjaHVua19zaXplOworCXMt PmNodW5rX21hc2sgPSBjaHVua19zaXplIC0gMTsKKwlzLT50eXBlID0gcGVyc2lzdGVudDsKKwlm b3IgKHMtPmNodW5rX3NoaWZ0ID0gMDsgY2h1bmtfc2l6ZTsKKwkgICAgIHMtPmNodW5rX3NoaWZ0 KyssIGNodW5rX3NpemUgPj49IDEpCisJCTsKKwlzLT5jaHVua19zaGlmdC0tOworCisJcy0+dmFs aWQgPSAxOworCXMtPmhhdmVfbWV0YWRhdGEgPSAwOworCXMtPmxhc3RfcGVyY2VudCA9IDA7CisJ aW5pdF9yd3NlbSgmcy0+bG9jayk7CisJcy0+dGFibGUgPSB0aS0+dGFibGU7CisKKwkvKiBBbGxv Y2F0ZSBoYXNoIHRhYmxlIGZvciBDT1cgZGF0YSAqLworCWlmIChpbml0X2hhc2hfdGFibGVzKHMp KSB7CisJCXRpLT5lcnJvciA9ICJVbmFibGUgdG8gYWxsb2NhdGUgaGFzaCB0YWJsZSBzcGFjZSI7 CisJCXIgPSAtRU5PTUVNOworCQlnb3RvIGJhZDM7CisJfQorCisJLyoKKwkgKiBDaGVjayB0aGUg cGVyc2lzdGVudCBmbGFnIC0gZG9uZSBoZXJlIGJlY2F1c2Ugd2UgbmVlZCB0aGUgaW9idWYKKwkg KiB0byBjaGVjayB0aGUgTFYgaGVhZGVyCisJICovCisJcy0+c3RvcmUuc25hcCA9IHM7CisKKwlp ZiAocGVyc2lzdGVudCA9PSAnUCcpCisJCXIgPSBkbV9jcmVhdGVfcGVyc2lzdGVudCgmcy0+c3Rv cmUsIHMtPmNodW5rX3NpemUpOworCWVsc2UKKwkJciA9IGRtX2NyZWF0ZV90cmFuc2llbnQoJnMt PnN0b3JlLCBzLCBibG9ja3NpemUpOworCisJaWYgKHIpIHsKKwkJdGktPmVycm9yID0gIkNvdWxk bid0IGNyZWF0ZSBleGNlcHRpb24gc3RvcmUiOworCQlyID0gLUVJTlZBTDsKKwkJZ290byBiYWQ0 OworCX0KKworCXIgPSBrY29weWRfY2xpZW50X2NyZWF0ZShTTkFQU0hPVF9QQUdFUywgJnMtPmtj b3B5ZF9jbGllbnQpOworCWlmIChyKSB7CisJCXRpLT5lcnJvciA9ICJDb3VsZCBub3QgY3JlYXRl IGtjb3B5ZCBjbGllbnQiOworCQlnb3RvIGJhZDU7CisJfQorCisJLyogRmx1c2ggSU8gdG8gdGhl IG9yaWdpbiBkZXZpY2UgKi8KKwlmc3luY19kZXYocy0+b3JpZ2luLT5kZXYpOworCisJLyogQWRk IHNuYXBzaG90IHRvIHRoZSBsaXN0IG9mIHNuYXBzaG90cyBmb3IgdGhpcyBvcmlnaW4gKi8KKwlp ZiAocmVnaXN0ZXJfc25hcHNob3QocykpIHsKKwkJciA9IC1FSU5WQUw7CisJCXRpLT5lcnJvciA9 ICJDYW5ub3QgcmVnaXN0ZXIgc25hcHNob3Qgb3JpZ2luIjsKKwkJZ290byBiYWQ2OworCX0KKwor CXRpLT5wcml2YXRlID0gczsKKwlyZXR1cm4gMDsKKworIGJhZDY6CisJa2NvcHlkX2NsaWVudF9k ZXN0cm95KHMtPmtjb3B5ZF9jbGllbnQpOworCisgYmFkNToKKwlzLT5zdG9yZS5kZXN0cm95KCZz LT5zdG9yZSk7CisKKyBiYWQ0OgorCWV4aXRfZXhjZXB0aW9uX3RhYmxlKCZzLT5wZW5kaW5nLCBw ZW5kaW5nX2NhY2hlKTsKKwlleGl0X2V4Y2VwdGlvbl90YWJsZSgmcy0+Y29tcGxldGUsIGV4Y2Vw dGlvbl9jYWNoZSk7CisKKyBiYWQzOgorCWRtX3B1dF9kZXZpY2UodGksIHMtPmNvdyk7CisJZG1f cHV0X2RldmljZSh0aSwgcy0+b3JpZ2luKTsKKworIGJhZDI6CisJa2ZyZWUocyk7CisKKyBiYWQx OgorCXJldHVybiByOworfQorCitzdGF0aWMgdm9pZCBzbmFwc2hvdF9kdHIoc3RydWN0IGRtX3Rh cmdldCAqdGkpCit7CisJc3RydWN0IGRtX3NuYXBzaG90ICpzID0gKHN0cnVjdCBkbV9zbmFwc2hv dCAqKSB0aS0+cHJpdmF0ZTsKKworCWRtX3RhYmxlX2V2ZW50KHRpLT50YWJsZSk7CisKKwl1bnJl Z2lzdGVyX3NuYXBzaG90KHMpOworCisJZXhpdF9leGNlcHRpb25fdGFibGUoJnMtPnBlbmRpbmcs IHBlbmRpbmdfY2FjaGUpOworCWV4aXRfZXhjZXB0aW9uX3RhYmxlKCZzLT5jb21wbGV0ZSwgZXhj ZXB0aW9uX2NhY2hlKTsKKworCS8qIERlYWxsb2NhdGUgbWVtb3J5IHVzZWQgKi8KKwlzLT5zdG9y ZS5kZXN0cm95KCZzLT5zdG9yZSk7CisKKwlkbV9wdXRfZGV2aWNlKHRpLCBzLT5vcmlnaW4pOwor CWRtX3B1dF9kZXZpY2UodGksIHMtPmNvdyk7CisJa2NvcHlkX2NsaWVudF9kZXN0cm95KHMtPmtj b3B5ZF9jbGllbnQpOworCWtmcmVlKHMpOworfQorCisvKgorICogV2UgaG9sZCBsaXN0cyBvZiBi dWZmZXJfaGVhZHMsIHVzaW5nIHRoZSBiX3JlcW5leHQgZmllbGQuCisgKi8KK3N0YXRpYyB2b2lk IHF1ZXVlX2J1ZmZlcihzdHJ1Y3QgYnVmZmVyX2hlYWQgKipxdWV1ZSwgc3RydWN0IGJ1ZmZlcl9o ZWFkICpiaCkKK3sKKwliaC0+Yl9yZXFuZXh0ID0gKnF1ZXVlOworCSpxdWV1ZSA9IGJoOworfQor CisvKgorICogRklYTUU6IGluZWZmaWNpZW50LgorICovCitzdGF0aWMgdm9pZCBxdWV1ZV9idWZm ZXJzKHN0cnVjdCBidWZmZXJfaGVhZCAqKnF1ZXVlLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJocykK K3sKKwl3aGlsZSAoKnF1ZXVlKQorCQlxdWV1ZSA9ICYoKCpxdWV1ZSktPmJfcmVxbmV4dCk7CisK KwkqcXVldWUgPSBiaHM7Cit9CisKKy8qCisgKiBGbHVzaCBhIGxpc3Qgb2YgYnVmZmVycy4KKyAq Lworc3RhdGljIHZvaWQgZmx1c2hfYnVmZmVycyhzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQorewor CXN0cnVjdCBidWZmZXJfaGVhZCAqbjsKKworCURNREVCVUcoImJlZ2luIGZsdXNoIik7CisJd2hp bGUgKGJoKSB7CisJCW4gPSBiaC0+Yl9yZXFuZXh0OworCQliaC0+Yl9yZXFuZXh0ID0gTlVMTDsK KwkJRE1ERUJVRygiZmx1c2hpbmcgJXAiLCBiaCk7CisJCWdlbmVyaWNfbWFrZV9yZXF1ZXN0KFdS SVRFLCBiaCk7CisJCWJoID0gbjsKKwl9CisKKwlydW5fdGFza19xdWV1ZSgmdHFfZGlzayk7Cit9 CisKKy8qCisgKiBFcnJvciBhIGxpc3Qgb2YgYnVmZmVycy4KKyAqLworc3RhdGljIHZvaWQgZXJy b3JfYnVmZmVycyhzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCXN0cnVjdCBidWZmZXJfaGVh ZCAqbjsKKworCXdoaWxlIChiaCkgeworCQluID0gYmgtPmJfcmVxbmV4dDsKKwkJYmgtPmJfcmVx bmV4dCA9IE5VTEw7CisJCWJ1ZmZlcl9JT19lcnJvcihiaCk7CisJCWJoID0gbjsKKwl9Cit9CisK K3N0YXRpYyBzdHJ1Y3QgYnVmZmVyX2hlYWQgKl9fZmx1c2hfYmhzKHN0cnVjdCBwZW5kaW5nX2V4 Y2VwdGlvbiAqcGUpCit7CisJc3RydWN0IHBlbmRpbmdfZXhjZXB0aW9uICpzaWJsaW5nOworCisJ aWYgKGxpc3RfZW1wdHkoJnBlLT5zaWJsaW5ncykpCisJCXJldHVybiBwZS0+b3JpZ2luX2JoczsK KworCXNpYmxpbmcgPSBsaXN0X2VudHJ5KHBlLT5zaWJsaW5ncy5uZXh0LAorCQkJICAgICBzdHJ1 Y3QgcGVuZGluZ19leGNlcHRpb24sIHNpYmxpbmdzKTsKKworCWxpc3RfZGVsKCZwZS0+c2libGlu Z3MpOworCisJLyogRklYTUU6IEkgdGhpbmsgdGhlcmUncyBhIHJhY2Ugb24gU01QIG1hY2hpbmVz IGhlcmUsIGFkZCBzcGluIGxvY2sgKi8KKwlxdWV1ZV9idWZmZXJzKCZzaWJsaW5nLT5vcmlnaW5f YmhzLCBwZS0+b3JpZ2luX2Jocyk7CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQg cGVuZGluZ19jb21wbGV0ZShzdHJ1Y3QgcGVuZGluZ19leGNlcHRpb24gKnBlLCBpbnQgc3VjY2Vz cykKK3sKKwlzdHJ1Y3QgZXhjZXB0aW9uICplOworCXN0cnVjdCBkbV9zbmFwc2hvdCAqcyA9IHBl LT5zbmFwOworCXN0cnVjdCBidWZmZXJfaGVhZCAqZmx1c2ggPSBOVUxMOworCisJaWYgKHN1Y2Nl c3MpIHsKKwkJZSA9IGFsbG9jX2V4Y2VwdGlvbigpOworCQlpZiAoIWUpIHsKKwkJCURNV0FSTigi VW5hYmxlIHRvIGFsbG9jYXRlIGV4Y2VwdGlvbi4iKTsKKwkJCWRvd25fd3JpdGUoJnMtPmxvY2sp OworCQkJcy0+c3RvcmUuZHJvcF9zbmFwc2hvdCgmcy0+c3RvcmUpOworCQkJcy0+dmFsaWQgPSAw OworCQkJZmx1c2ggPSBfX2ZsdXNoX2JocyhwZSk7CisJCQl1cF93cml0ZSgmcy0+bG9jayk7CisK KwkJCWVycm9yX2J1ZmZlcnMocGUtPnNuYXBzaG90X2Jocyk7CisJCQlnb3RvIG91dDsKKwkJfQor CisJCS8qCisJCSAqIEFkZCBhIHByb3BlciBleGNlcHRpb24sIGFuZCByZW1vdmUgdGhlCisJCSAq IGluLWZsaWdodCBleGNlcHRpb24gZnJvbSB0aGUgbGlzdC4KKwkJICovCisJCWRvd25fd3JpdGUo JnMtPmxvY2spOworCisJCW1lbWNweShlLCAmcGUtPmUsIHNpemVvZigqZSkpOworCQlpbnNlcnRf ZXhjZXB0aW9uKCZzLT5jb21wbGV0ZSwgZSk7CisJCXJlbW92ZV9leGNlcHRpb24oJnBlLT5lKTsK KwkJZmx1c2ggPSBfX2ZsdXNoX2JocyhwZSk7CisKKwkJLyogU3VibWl0IGFueSBwZW5kaW5nIHdy aXRlIEJIcyAqLworCQl1cF93cml0ZSgmcy0+bG9jayk7CisKKwkJZmx1c2hfYnVmZmVycyhwZS0+ c25hcHNob3RfYmhzKTsKKwkJRE1ERUJVRygiRXhjZXB0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVs bHkuIik7CisKKwkJLyogTm90aWZ5IGFueSBpbnRlcmVzdGVkIHBhcnRpZXMgKi8KKwkJaWYgKHMt PnN0b3JlLmZyYWN0aW9uX2Z1bGwpIHsKKwkJCXNlY3Rvcl90IG51bWVyYXRvciwgZGVub21pbmF0 b3I7CisJCQlpbnQgcGM7CisKKwkJCXMtPnN0b3JlLmZyYWN0aW9uX2Z1bGwoJnMtPnN0b3JlLCAm bnVtZXJhdG9yLAorCQkJCQkgICAgICAgJmRlbm9taW5hdG9yKTsKKwkJCXBjID0gbnVtZXJhdG9y ICogMTAwIC8gZGVub21pbmF0b3I7CisKKwkJCWlmIChwYyA+PSBzLT5sYXN0X3BlcmNlbnQgKyBX QUtFX1VQX1BFUkNFTlQpIHsKKwkJCQlkbV90YWJsZV9ldmVudChzLT50YWJsZSk7CisJCQkJcy0+ bGFzdF9wZXJjZW50ID0gcGMgLSBwYyAlIFdBS0VfVVBfUEVSQ0VOVDsKKwkJCX0KKwkJfQorCisJ fSBlbHNlIHsKKwkJLyogUmVhZC93cml0ZSBlcnJvciAtIHNuYXBzaG90IGlzIHVudXNhYmxlICov CisJCWRvd25fd3JpdGUoJnMtPmxvY2spOworCQlpZiAocy0+dmFsaWQpCisJCQlETUVSUigiRXJy b3IgcmVhZGluZy93cml0aW5nIHNuYXBzaG90Iik7CisJCXMtPnN0b3JlLmRyb3Bfc25hcHNob3Qo JnMtPnN0b3JlKTsKKwkJcy0+dmFsaWQgPSAwOworCQlyZW1vdmVfZXhjZXB0aW9uKCZwZS0+ZSk7 CisJCWZsdXNoID0gX19mbHVzaF9iaHMocGUpOworCQl1cF93cml0ZSgmcy0+bG9jayk7CisKKwkJ ZXJyb3JfYnVmZmVycyhwZS0+c25hcHNob3RfYmhzKTsKKworCQlkbV90YWJsZV9ldmVudChzLT50 YWJsZSk7CisJCURNREVCVUcoIkV4Y2VwdGlvbiBmYWlsZWQuIik7CisJfQorCisgb3V0OgorCWlm IChmbHVzaCkKKwkJZmx1c2hfYnVmZmVycyhmbHVzaCk7CisKKwlmcmVlX3BlbmRpbmdfZXhjZXB0 aW9uKHBlKTsKK30KKworc3RhdGljIHZvaWQgY29tbWl0X2NhbGxiYWNrKHZvaWQgKmNvbnRleHQs IGludCBzdWNjZXNzKQoreworCXN0cnVjdCBwZW5kaW5nX2V4Y2VwdGlvbiAqcGUgPSAoc3RydWN0 IHBlbmRpbmdfZXhjZXB0aW9uICopIGNvbnRleHQ7CisJcGVuZGluZ19jb21wbGV0ZShwZSwgc3Vj Y2Vzcyk7Cit9CisKKy8qCisgKiBDYWxsZWQgd2hlbiB0aGUgY29weSBJL08gaGFzIGZpbmlzaGVk LiAga2NvcHlkIGFjdHVhbGx5IHJ1bnMKKyAqIHRoaXMgY29kZSBzbyBkb24ndCBibG9jay4KKyAq Lworc3RhdGljIHZvaWQgY29weV9jYWxsYmFjayhpbnQgcmVhZF9lcnIsIHVuc2lnbmVkIGludCB3 cml0ZV9lcnIsIHZvaWQgKmNvbnRleHQpCit7CisJc3RydWN0IHBlbmRpbmdfZXhjZXB0aW9uICpw ZSA9IChzdHJ1Y3QgcGVuZGluZ19leGNlcHRpb24gKikgY29udGV4dDsKKwlzdHJ1Y3QgZG1fc25h cHNob3QgKnMgPSBwZS0+c25hcDsKKworCWlmIChyZWFkX2VyciB8fCB3cml0ZV9lcnIpCisJCXBl bmRpbmdfY29tcGxldGUocGUsIDApOworCisJZWxzZQorCQkvKiBVcGRhdGUgdGhlIG1ldGFkYXRh IGlmIHdlIGFyZSBwZXJzaXN0ZW50ICovCisJCXMtPnN0b3JlLmNvbW1pdF9leGNlcHRpb24oJnMt PnN0b3JlLCAmcGUtPmUsIGNvbW1pdF9jYWxsYmFjaywKKwkJCQkJICBwZSk7Cit9CisKKy8qCisg KiBEaXNwYXRjaGVzIHRoZSBjb3B5IG9wZXJhdGlvbiB0byBrY29weWQuCisgKi8KK3N0YXRpYyBp bmxpbmUgdm9pZCBzdGFydF9jb3B5KHN0cnVjdCBwZW5kaW5nX2V4Y2VwdGlvbiAqcGUpCit7CisJ c3RydWN0IGRtX3NuYXBzaG90ICpzID0gcGUtPnNuYXA7CisJc3RydWN0IGlvX3JlZ2lvbiBzcmMs IGRlc3Q7CisJa2Rldl90IGRldiA9IHMtPm9yaWdpbi0+ZGV2OworCWludCAqc2l6ZXMgPSBibGtf c2l6ZVttYWpvcihkZXYpXTsKKwlzZWN0b3JfdCBkZXZfc2l6ZSA9IChzZWN0b3JfdCkgLTE7CisK KwlpZiAocGUtPnN0YXJ0ZWQpCisJCXJldHVybjsKKworCS8qIHRoaXMgaXMgcHJvdGVjdGVkIGJ5 IHNuYXAtPmxvY2sgKi8KKwlwZS0+c3RhcnRlZCA9IDE7CisKKwlpZiAoc2l6ZXMgJiYgc2l6ZXNb bWlub3IoZGV2KV0pCisJCWRldl9zaXplID0gc2l6ZXNbbWlub3IoZGV2KV0gPDwgMTsKKworCXNy Yy5kZXYgPSBkZXY7CisJc3JjLnNlY3RvciA9IGNodW5rX3RvX3NlY3RvcihzLCBwZS0+ZS5vbGRf Y2h1bmspOworCXNyYy5jb3VudCA9IG1pbihzLT5jaHVua19zaXplLCBkZXZfc2l6ZSAtIHNyYy5z ZWN0b3IpOworCisJZGVzdC5kZXYgPSBzLT5jb3ctPmRldjsKKwlkZXN0LnNlY3RvciA9IGNodW5r X3RvX3NlY3RvcihzLCBwZS0+ZS5uZXdfY2h1bmspOworCWRlc3QuY291bnQgPSBzcmMuY291bnQ7 CisKKwkvKiBIYW5kIG92ZXIgdG8ga2NvcHlkICovCisJa2NvcHlkX2NvcHkocy0+a2NvcHlkX2Ns aWVudCwKKwkJICAgICZzcmMsIDEsICZkZXN0LCAwLCBjb3B5X2NhbGxiYWNrLCBwZSk7Cit9CisK Ky8qCisgKiBMb29rcyB0byBzZWUgaWYgdGhpcyBzbmFwc2hvdCBhbHJlYWR5IGhhcyBhIHBlbmRp bmcgZXhjZXB0aW9uCisgKiBmb3IgdGhpcyBjaHVuaywgb3RoZXJ3aXNlIGl0IGFsbG9jYXRlcyBh IG5ldyBvbmUgYW5kIGluc2VydHMKKyAqIGl0IGludG8gdGhlIHBlbmRpbmcgdGFibGUuCisgKi8K K3N0YXRpYyBzdHJ1Y3QgcGVuZGluZ19leGNlcHRpb24gKmZpbmRfcGVuZGluZ19leGNlcHRpb24o c3RydWN0IGRtX3NuYXBzaG90ICpzLAorCQkJCQkJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7 CisJc3RydWN0IGV4Y2VwdGlvbiAqZTsKKwlzdHJ1Y3QgcGVuZGluZ19leGNlcHRpb24gKnBlOwor CWNodW5rX3QgY2h1bmsgPSBzZWN0b3JfdG9fY2h1bmsocywgYmgtPmJfcnNlY3Rvcik7CisKKwkv KgorCSAqIElzIHRoZXJlIGEgcGVuZGluZyBleGNlcHRpb24gZm9yIHRoaXMgYWxyZWFkeSA/CisJ ICovCisJZSA9IGxvb2t1cF9leGNlcHRpb24oJnMtPnBlbmRpbmcsIGNodW5rKTsKKwlpZiAoZSkg eworCQkvKiBjYXN0IHRoZSBleGNlcHRpb24gdG8gYSBwZW5kaW5nIGV4Y2VwdGlvbiAqLworCQlw ZSA9IGxpc3RfZW50cnkoZSwgc3RydWN0IHBlbmRpbmdfZXhjZXB0aW9uLCBlKTsKKworCX0gZWxz ZSB7CisJCS8qIENyZWF0ZSBhIG5ldyBwZW5kaW5nIGV4Y2VwdGlvbiAqLworCQlwZSA9IGFsbG9j X3BlbmRpbmdfZXhjZXB0aW9uKCk7CisJCXBlLT5lLm9sZF9jaHVuayA9IGNodW5rOworCQlwZS0+ b3JpZ2luX2JocyA9IHBlLT5zbmFwc2hvdF9iaHMgPSBOVUxMOworCQlJTklUX0xJU1RfSEVBRCgm cGUtPnNpYmxpbmdzKTsKKwkJcGUtPnNuYXAgPSBzOworCQlwZS0+c3RhcnRlZCA9IDA7CisKKwkJ aWYgKHMtPnN0b3JlLnByZXBhcmVfZXhjZXB0aW9uKCZzLT5zdG9yZSwgJnBlLT5lKSkgeworCQkJ ZnJlZV9wZW5kaW5nX2V4Y2VwdGlvbihwZSk7CisJCQlzLT52YWxpZCA9IDA7CisJCQlyZXR1cm4g TlVMTDsKKwkJfQorCisJCWluc2VydF9leGNlcHRpb24oJnMtPnBlbmRpbmcsICZwZS0+ZSk7CisJ fQorCisJcmV0dXJuIHBlOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmVtYXBfZXhjZXB0aW9u KHN0cnVjdCBkbV9zbmFwc2hvdCAqcywgc3RydWN0IGV4Y2VwdGlvbiAqZSwKKwkJCQkgICBzdHJ1 Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCWJoLT5iX3JkZXYgPSBzLT5jb3ctPmRldjsKKwliaC0+ Yl9yc2VjdG9yID0gY2h1bmtfdG9fc2VjdG9yKHMsIGUtPm5ld19jaHVuaykgKworCSAgICAoYmgt PmJfcnNlY3RvciAmIHMtPmNodW5rX21hc2spOworfQorCitzdGF0aWMgaW50IHNuYXBzaG90X21h cChzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgaW50IHJ3LAor CQkJdW5pb24gbWFwX2luZm8gKm1hcF9jb250ZXh0KQoreworCXN0cnVjdCBleGNlcHRpb24gKmU7 CisJc3RydWN0IGRtX3NuYXBzaG90ICpzID0gKHN0cnVjdCBkbV9zbmFwc2hvdCAqKSB0aS0+cHJp dmF0ZTsKKwlpbnQgciA9IDE7CisJY2h1bmtfdCBjaHVuazsKKwlzdHJ1Y3QgcGVuZGluZ19leGNl cHRpb24gKnBlOworCisJY2h1bmsgPSBzZWN0b3JfdG9fY2h1bmsocywgYmgtPmJfcnNlY3Rvcik7 CisKKwkvKiBGdWxsIHNuYXBzaG90cyBhcmUgbm90IHVzYWJsZSAqLworCWlmICghcy0+dmFsaWQp CisJCXJldHVybiAtMTsKKworCS8qCisJICogV3JpdGUgdG8gc25hcHNob3QgLSBoaWdoZXIgbGV2 ZWwgdGFrZXMgY2FyZSBvZiBSVy9STworCSAqIGZsYWdzIHNvIHdlIHNob3VsZCBvbmx5IGdldCB0 aGlzIGlmIHdlIGFyZQorCSAqIHdyaXRlYWJsZS4KKwkgKi8KKwlpZiAocncgPT0gV1JJVEUpIHsK KworCQlkb3duX3dyaXRlKCZzLT5sb2NrKTsKKworCQkvKiBJZiB0aGUgYmxvY2sgaXMgYWxyZWFk eSByZW1hcHBlZCAtIHVzZSB0aGF0LCBlbHNlIHJlbWFwIGl0ICovCisJCWUgPSBsb29rdXBfZXhj ZXB0aW9uKCZzLT5jb21wbGV0ZSwgY2h1bmspOworCQlpZiAoZSkKKwkJCXJlbWFwX2V4Y2VwdGlv bihzLCBlLCBiaCk7CisKKwkJZWxzZSB7CisJCQlwZSA9IGZpbmRfcGVuZGluZ19leGNlcHRpb24o cywgYmgpOworCisJCQlpZiAoIXBlKSB7CisJCQkJcy0+c3RvcmUuZHJvcF9zbmFwc2hvdCgmcy0+ c3RvcmUpOworCQkJCXMtPnZhbGlkID0gMDsKKwkJCQlyID0gLUVJTzsKKwkJCX0gZWxzZSB7CisJ CQkJcmVtYXBfZXhjZXB0aW9uKHMsICZwZS0+ZSwgYmgpOworCQkJCXF1ZXVlX2J1ZmZlcigmcGUt PnNuYXBzaG90X2JocywgYmgpOworCQkJCXN0YXJ0X2NvcHkocGUpOworCQkJCXIgPSAwOworCQkJ fQorCQl9CisKKwkJdXBfd3JpdGUoJnMtPmxvY2spOworCisJfSBlbHNlIHsKKwkJLyoKKwkJICog RklYTUU6IHRoaXMgcmVhZCBwYXRoIHNjYXJlcyBtZSBiZWNhdXNlIHdlCisJCSAqIGFsd2F5cyB1 c2UgdGhlIG9yaWdpbiB3aGVuIHdlIGhhdmUgYSBwZW5kaW5nCisJCSAqIGV4Y2VwdGlvbi4gIEhv d2V2ZXIgSSBjYW4ndCB0aGluayBvZiBhCisJCSAqIHNpdHVhdGlvbiB3aGVyZSB0aGlzIGlzIHdy b25nIC0gZWp0LgorCQkgKi8KKworCQkvKiBEbyByZWFkcyAqLworCQlkb3duX3JlYWQoJnMtPmxv Y2spOworCisJCS8qIFNlZSBpZiBpdCBpdCBoYXMgYmVlbiByZW1hcHBlZCAqLworCQllID0gbG9v a3VwX2V4Y2VwdGlvbigmcy0+Y29tcGxldGUsIGNodW5rKTsKKwkJaWYgKGUpCisJCQlyZW1hcF9l eGNlcHRpb24ocywgZSwgYmgpOworCQllbHNlCisJCQliaC0+Yl9yZGV2ID0gcy0+b3JpZ2luLT5k ZXY7CisKKwkJdXBfcmVhZCgmcy0+bG9jayk7CisJfQorCisJcmV0dXJuIHI7Cit9CisKK3ZvaWQg c25hcHNob3RfcmVzdW1lKHN0cnVjdCBkbV90YXJnZXQgKnRpKQoreworCXN0cnVjdCBkbV9zbmFw c2hvdCAqcyA9IChzdHJ1Y3QgZG1fc25hcHNob3QgKikgdGktPnByaXZhdGU7CisKKwlpZiAocy0+ aGF2ZV9tZXRhZGF0YSkKKwkJcmV0dXJuOworCisJaWYgKHMtPnN0b3JlLnJlYWRfbWV0YWRhdGEo JnMtPnN0b3JlKSkgeworCQlkb3duX3dyaXRlKCZzLT5sb2NrKTsKKwkJcy0+dmFsaWQgPSAwOwor CQl1cF93cml0ZSgmcy0+bG9jayk7CisJfQorCisJcy0+aGF2ZV9tZXRhZGF0YSA9IDE7Cit9CisK K3N0YXRpYyBpbnQgc25hcHNob3Rfc3RhdHVzKHN0cnVjdCBkbV90YXJnZXQgKnRpLCBzdGF0dXNf dHlwZV90IHR5cGUsCisJCQkgICBjaGFyICpyZXN1bHQsIHVuc2lnbmVkIGludCBtYXhsZW4pCit7 CisJc3RydWN0IGRtX3NuYXBzaG90ICpzbmFwID0gKHN0cnVjdCBkbV9zbmFwc2hvdCAqKSB0aS0+ cHJpdmF0ZTsKKwljaGFyIGNvd1sxNl07CisJY2hhciBvcmdbMTZdOworCisJc3dpdGNoICh0eXBl KSB7CisJY2FzZSBTVEFUVVNUWVBFX0lORk86CisJCWlmICghc25hcC0+dmFsaWQpCisJCQlzbnBy aW50ZihyZXN1bHQsIG1heGxlbiwgIkludmFsaWQiKTsKKwkJZWxzZSB7CisJCQlpZiAoc25hcC0+ c3RvcmUuZnJhY3Rpb25fZnVsbCkgeworCQkJCXNlY3Rvcl90IG51bWVyYXRvciwgZGVub21pbmF0 b3I7CisJCQkJc25hcC0+c3RvcmUuZnJhY3Rpb25fZnVsbCgmc25hcC0+c3RvcmUsCisJCQkJCQkJ ICAmbnVtZXJhdG9yLAorCQkJCQkJCSAgJmRlbm9taW5hdG9yKTsKKwkJCQlzbnByaW50ZihyZXN1 bHQsIG1heGxlbiwKKwkJCQkJIFNFQ1RPUl9GT1JNQVQgIi8iIFNFQ1RPUl9GT1JNQVQsCisJCQkJ CSBudW1lcmF0b3IsIGRlbm9taW5hdG9yKTsKKwkJCX0KKwkJCWVsc2UKKwkJCQlzbnByaW50Zihy ZXN1bHQsIG1heGxlbiwgIlVua25vd24iKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgU1RBVFVT VFlQRV9UQUJMRToKKwkJLyoKKwkJICoga2Rldm5hbWUgcmV0dXJucyBhIHN0YXRpYyBwb2ludGVy IHNvIHdlIG5lZWQKKwkJICogdG8gbWFrZSBwcml2YXRlIGNvcGllcyBpZiB0aGUgb3V0cHV0IGlz IHRvCisJCSAqIG1ha2Ugc2Vuc2UuCisJCSAqLworCQlzdHJuY3B5KGNvdywgZG1fa2Rldm5hbWUo c25hcC0+Y293LT5kZXYpLCBzaXplb2YoY293KSk7CisJCXN0cm5jcHkob3JnLCBkbV9rZGV2bmFt ZShzbmFwLT5vcmlnaW4tPmRldiksIHNpemVvZihvcmcpKTsKKwkJc25wcmludGYocmVzdWx0LCBt YXhsZW4sICIlcyAlcyAlYyAlbGQiLCBvcmcsIGNvdywKKwkJCSBzbmFwLT50eXBlLCBzbmFwLT5j aHVua19zaXplKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K KyAqIE9yaWdpbiBtZXRob2RzCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdm9pZCBsaXN0X21lcmdlKHN0 cnVjdCBsaXN0X2hlYWQgKmwxLCBzdHJ1Y3QgbGlzdF9oZWFkICpsMikKK3sKKwlzdHJ1Y3QgbGlz dF9oZWFkICpsMV9uLCAqbDJfcDsKKworCWwxX24gPSBsMS0+bmV4dDsKKwlsMl9wID0gbDItPnBy ZXY7CisKKwlsMS0+bmV4dCA9IGwyOworCWwyLT5wcmV2ID0gbDE7CisKKwlsMl9wLT5uZXh0ID0g bDFfbjsKKwlsMV9uLT5wcmV2ID0gbDJfcDsKK30KKworc3RhdGljIGludCBfX29yaWdpbl93cml0 ZShzdHJ1Y3QgbGlzdF9oZWFkICpzbmFwc2hvdHMsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7 CisJaW50IHIgPSAxLCBmaXJzdCA9IDE7CisJc3RydWN0IGxpc3RfaGVhZCAqc2w7CisJc3RydWN0 IGRtX3NuYXBzaG90ICpzbmFwOworCXN0cnVjdCBleGNlcHRpb24gKmU7CisJc3RydWN0IHBlbmRp bmdfZXhjZXB0aW9uICpwZSwgKmxhc3QgPSBOVUxMOworCWNodW5rX3QgY2h1bms7CisKKwkvKiBE byBhbGwgdGhlIHNuYXBzaG90cyBvbiB0aGlzIG9yaWdpbiAqLworCWxpc3RfZm9yX2VhY2goc2ws IHNuYXBzaG90cykgeworCQlzbmFwID0gbGlzdF9lbnRyeShzbCwgc3RydWN0IGRtX3NuYXBzaG90 LCBsaXN0KTsKKworCQkvKiBPbmx5IGRlYWwgd2l0aCB2YWxpZCBzbmFwc2hvdHMgKi8KKwkJaWYg KCFzbmFwLT52YWxpZCkKKwkJCWNvbnRpbnVlOworCisJCWRvd25fd3JpdGUoJnNuYXAtPmxvY2sp OworCisJCS8qCisJCSAqIFJlbWVtYmVyLCBkaWZmZXJlbnQgc25hcHNob3RzIGNhbiBoYXZlCisJ CSAqIGRpZmZlcmVudCBjaHVuayBzaXplcy4KKwkJICovCisJCWNodW5rID0gc2VjdG9yX3RvX2No dW5rKHNuYXAsIGJoLT5iX3JzZWN0b3IpOworCisJCS8qCisJCSAqIENoZWNrIGV4Y2VwdGlvbiB0 YWJsZSB0byBzZWUgaWYgYmxvY2sKKwkJICogaXMgYWxyZWFkeSByZW1hcHBlZCBpbiB0aGlzIHNu YXBzaG90CisJCSAqIGFuZCB0cmlnZ2VyIGFuIGV4Y2VwdGlvbiBpZiBub3QuCisJCSAqLworCQll ID0gbG9va3VwX2V4Y2VwdGlvbigmc25hcC0+Y29tcGxldGUsIGNodW5rKTsKKwkJaWYgKCFlKSB7 CisJCQlwZSA9IGZpbmRfcGVuZGluZ19leGNlcHRpb24oc25hcCwgYmgpOworCQkJaWYgKCFwZSkg eworCQkJCXNuYXAtPnN0b3JlLmRyb3Bfc25hcHNob3QoJnNuYXAtPnN0b3JlKTsKKwkJCQlzbmFw LT52YWxpZCA9IDA7CisKKwkJCX0gZWxzZSB7CisJCQkJaWYgKGxhc3QpCisJCQkJCWxpc3RfbWVy Z2UoJnBlLT5zaWJsaW5ncywKKwkJCQkJCSAgICZsYXN0LT5zaWJsaW5ncyk7CisKKwkJCQlsYXN0 ID0gcGU7CisJCQkJciA9IDA7CisJCQl9CisJCX0KKworCQl1cF93cml0ZSgmc25hcC0+bG9jayk7 CisJfQorCisJLyoKKwkgKiBOb3cgdGhhdCB3ZSBoYXZlIGEgY29tcGxldGUgcGUgbGlzdCB3ZSBj YW4gc3RhcnQgdGhlIGNvcHlpbmcuCisJICovCisJaWYgKGxhc3QpIHsKKwkJcGUgPSBsYXN0Owor CQlkbyB7CisJCQlkb3duX3dyaXRlKCZwZS0+c25hcC0+bG9jayk7CisJCQlpZiAoZmlyc3QpCisJ CQkJcXVldWVfYnVmZmVyKCZwZS0+b3JpZ2luX2JocywgYmgpOworCQkJc3RhcnRfY29weShwZSk7 CisJCQl1cF93cml0ZSgmcGUtPnNuYXAtPmxvY2spOworCQkJZmlyc3QgPSAwOworCQkJcGUgPSBs aXN0X2VudHJ5KHBlLT5zaWJsaW5ncy5uZXh0LAorCQkJCQlzdHJ1Y3QgcGVuZGluZ19leGNlcHRp b24sIHNpYmxpbmdzKTsKKworCQl9IHdoaWxlIChwZSAhPSBsYXN0KTsKKwl9CisKKwlyZXR1cm4g cjsKK30KKworLyoKKyAqIENhbGxlZCBvbiBhIHdyaXRlIGZyb20gdGhlIG9yaWdpbiBkcml2ZXIu CisgKi8KK2ludCBkb19vcmlnaW4oc3RydWN0IGRtX2RldiAqb3JpZ2luLCBzdHJ1Y3QgYnVmZmVy X2hlYWQgKmJoKQoreworCXN0cnVjdCBvcmlnaW4gKm87CisJaW50IHI7CisKKwlkb3duX3JlYWQo Jl9vcmlnaW5zX2xvY2spOworCW8gPSBfX2xvb2t1cF9vcmlnaW4ob3JpZ2luLT5kZXYpOworCWlm ICghbykKKwkJQlVHKCk7CisKKwlyID0gX19vcmlnaW5fd3JpdGUoJm8tPnNuYXBzaG90cywgYmgp OworCXVwX3JlYWQoJl9vcmlnaW5zX2xvY2spOworCisJcmV0dXJuIHI7Cit9CisKKy8qCisgKiBP cmlnaW46IG1hcHMgYSBsaW5lYXIgcmFuZ2Ugb2YgYSBkZXZpY2UsIHdpdGggaG9va3MgZm9yIHNu YXBzaG90dGluZy4KKyAqLworCisvKgorICogQ29uc3RydWN0IGFuIG9yaWdpbiBtYXBwaW5nOiA8 ZGV2X3BhdGg+CisgKiBUaGUgY29udGV4dCBmb3IgYW4gb3JpZ2luIGlzIG1lcmVseSBhICdzdHJ1 Y3QgZG1fZGV2IConCisgKiBwb2ludGluZyB0byB0aGUgcmVhbCBkZXZpY2UuCisgKi8KK3N0YXRp YyBpbnQgb3JpZ2luX2N0cihzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSwgdW5zaWduZWQgaW50IGFyZ2Ms IGNoYXIgKiphcmd2KQoreworCWludCByOworCXN0cnVjdCBkbV9kZXYgKmRldjsKKworCWlmIChh cmdjICE9IDEpIHsKKwkJdGktPmVycm9yID0gImRtLW9yaWdpbjogaW5jb3JyZWN0IG51bWJlciBv ZiBhcmd1bWVudHMiOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyID0gZG1fZ2V0X2Rldmlj ZSh0aSwgYXJndlswXSwgMCwgdGktPmxlbiwKKwkJCSAgZG1fdGFibGVfZ2V0X21vZGUodGktPnRh YmxlKSwgJmRldik7CisJaWYgKHIpIHsKKwkJdGktPmVycm9yID0gIkNhbm5vdCBnZXQgdGFyZ2V0 IGRldmljZSI7CisJCXJldHVybiByOworCX0KKworCXRpLT5wcml2YXRlID0gZGV2OworCXJldHVy biAwOworfQorCitzdGF0aWMgdm9pZCBvcmlnaW5fZHRyKHN0cnVjdCBkbV90YXJnZXQgKnRpKQor eworCXN0cnVjdCBkbV9kZXYgKmRldiA9IChzdHJ1Y3QgZG1fZGV2ICopIHRpLT5wcml2YXRlOwor CWRtX3B1dF9kZXZpY2UodGksIGRldik7Cit9CisKK3N0YXRpYyBpbnQgb3JpZ2luX21hcChzdHJ1 Y3QgZG1fdGFyZ2V0ICp0aSwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgaW50IHJ3LAorCQkgICAg ICB1bmlvbiBtYXBfaW5mbyAqbWFwX2NvbnRleHQpCit7CisJc3RydWN0IGRtX2RldiAqZGV2ID0g KHN0cnVjdCBkbV9kZXYgKikgdGktPnByaXZhdGU7CisJYmgtPmJfcmRldiA9IGRldi0+ZGV2Owor CisJLyogT25seSB0ZWxsIHNuYXBzaG90cyBpZiB0aGlzIGlzIGEgd3JpdGUgKi8KKwlyZXR1cm4g KHJ3ID09IFdSSVRFKSA/IGRvX29yaWdpbihkZXYsIGJoKSA6IDE7Cit9CisKK3N0YXRpYyBpbnQg b3JpZ2luX3N0YXR1cyhzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSwgc3RhdHVzX3R5cGVfdCB0eXBlLCBj aGFyICpyZXN1bHQsCisJCQkgdW5zaWduZWQgaW50IG1heGxlbikKK3sKKwlzdHJ1Y3QgZG1fZGV2 ICpkZXYgPSAoc3RydWN0IGRtX2RldiAqKSB0aS0+cHJpdmF0ZTsKKworCXN3aXRjaCAodHlwZSkg eworCWNhc2UgU1RBVFVTVFlQRV9JTkZPOgorCQlyZXN1bHRbMF0gPSAnXDAnOworCQlicmVhazsK KworCWNhc2UgU1RBVFVTVFlQRV9UQUJMRToKKwkJc25wcmludGYocmVzdWx0LCBtYXhsZW4sICIl cyIsIGRtX2tkZXZuYW1lKGRldi0+ZGV2KSk7CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOwor fQorCitzdGF0aWMgc3RydWN0IHRhcmdldF90eXBlIG9yaWdpbl90YXJnZXQgPSB7CisJbmFtZToJ InNuYXBzaG90LW9yaWdpbiIsCisJbW9kdWxlOglUSElTX01PRFVMRSwKKwljdHI6CW9yaWdpbl9j dHIsCisJZHRyOglvcmlnaW5fZHRyLAorCW1hcDoJb3JpZ2luX21hcCwKKwlzdGF0dXM6CW9yaWdp bl9zdGF0dXMsCit9OworCitzdGF0aWMgc3RydWN0IHRhcmdldF90eXBlIHNuYXBzaG90X3Rhcmdl dCA9IHsKKwluYW1lOgkic25hcHNob3QiLAorCW1vZHVsZToJVEhJU19NT0RVTEUsCisJY3RyOglz bmFwc2hvdF9jdHIsCisJZHRyOglzbmFwc2hvdF9kdHIsCisJbWFwOglzbmFwc2hvdF9tYXAsCisJ cmVzdW1lOiBzbmFwc2hvdF9yZXN1bWUsCisJc3RhdHVzOglzbmFwc2hvdF9zdGF0dXMsCit9Owor CitpbnQgX19pbml0IGRtX3NuYXBzaG90X2luaXQodm9pZCkKK3sKKwlpbnQgcjsKKworCXIgPSBk bV9yZWdpc3Rlcl90YXJnZXQoJnNuYXBzaG90X3RhcmdldCk7CisJaWYgKHIpIHsKKwkJRE1FUlIo InNuYXBzaG90IHRhcmdldCByZWdpc3RlciBmYWlsZWQgJWQiLCByKTsKKwkJcmV0dXJuIHI7CisJ fQorCisJciA9IGRtX3JlZ2lzdGVyX3RhcmdldCgmb3JpZ2luX3RhcmdldCk7CisJaWYgKHIgPCAw KSB7CisJCURNRVJSKCJEZXZpY2UgbWFwcGVyOiBPcmlnaW46IHJlZ2lzdGVyIGZhaWxlZCAlZFxu Iiwgcik7CisJCWdvdG8gYmFkMTsKKwl9CisKKwlyID0gaW5pdF9vcmlnaW5faGFzaCgpOworCWlm IChyKSB7CisJCURNRVJSKCJpbml0X29yaWdpbl9oYXNoIGZhaWxlZC4iKTsKKwkJZ290byBiYWQy OworCX0KKworCWV4Y2VwdGlvbl9jYWNoZSA9IGttZW1fY2FjaGVfY3JlYXRlKCJkbS1zbmFwc2hv dC1leCIsCisJCQkJCSAgICBzaXplb2Yoc3RydWN0IGV4Y2VwdGlvbiksCisJCQkJCSAgICBfX2Fs aWdub2ZfXyhzdHJ1Y3QgZXhjZXB0aW9uKSwKKwkJCQkJICAgIDAsIE5VTEwsIE5VTEwpOworCWlm ICghZXhjZXB0aW9uX2NhY2hlKSB7CisJCURNRVJSKCJDb3VsZG4ndCBjcmVhdGUgZXhjZXB0aW9u IGNhY2hlLiIpOworCQlyID0gLUVOT01FTTsKKwkJZ290byBiYWQzOworCX0KKworCXBlbmRpbmdf Y2FjaGUgPQorCSAgICBrbWVtX2NhY2hlX2NyZWF0ZSgiZG0tc25hcHNob3QtaW4iLAorCQkJICAg ICAgc2l6ZW9mKHN0cnVjdCBwZW5kaW5nX2V4Y2VwdGlvbiksCisJCQkgICAgICBfX2FsaWdub2Zf XyhzdHJ1Y3QgcGVuZGluZ19leGNlcHRpb24pLAorCQkJICAgICAgMCwgTlVMTCwgTlVMTCk7CisJ aWYgKCFwZW5kaW5nX2NhY2hlKSB7CisJCURNRVJSKCJDb3VsZG4ndCBjcmVhdGUgcGVuZGluZyBj YWNoZS4iKTsKKwkJciA9IC1FTk9NRU07CisJCWdvdG8gYmFkNDsKKwl9CisKKwlwZW5kaW5nX3Bv b2wgPSBtZW1wb29sX2NyZWF0ZSgxMjgsIG1lbXBvb2xfYWxsb2Nfc2xhYiwKKwkJCQkgICAgICBt ZW1wb29sX2ZyZWVfc2xhYiwgcGVuZGluZ19jYWNoZSk7CisJaWYgKCFwZW5kaW5nX3Bvb2wpIHsK KwkJRE1FUlIoIkNvdWxkbid0IGNyZWF0ZSBwZW5kaW5nIHBvb2wuIik7CisJCXIgPSAtRU5PTUVN OworCQlnb3RvIGJhZDU7CisJfQorCisJcmV0dXJuIDA7CisKKyAgICAgIGJhZDU6CisJa21lbV9j YWNoZV9kZXN0cm95KHBlbmRpbmdfY2FjaGUpOworICAgICAgYmFkNDoKKwlrbWVtX2NhY2hlX2Rl c3Ryb3koZXhjZXB0aW9uX2NhY2hlKTsKKyAgICAgIGJhZDM6CisJZXhpdF9vcmlnaW5faGFzaCgp OworICAgICAgYmFkMjoKKwlkbV91bnJlZ2lzdGVyX3RhcmdldCgmb3JpZ2luX3RhcmdldCk7Cisg ICAgICBiYWQxOgorCWRtX3VucmVnaXN0ZXJfdGFyZ2V0KCZzbmFwc2hvdF90YXJnZXQpOworCXJl dHVybiByOworfQorCit2b2lkIGRtX3NuYXBzaG90X2V4aXQodm9pZCkKK3sKKwlpbnQgcjsKKwor CXIgPSBkbV91bnJlZ2lzdGVyX3RhcmdldCgmc25hcHNob3RfdGFyZ2V0KTsKKwlpZiAocikKKwkJ RE1FUlIoInNuYXBzaG90IHVucmVnaXN0ZXIgZmFpbGVkICVkIiwgcik7CisKKwlyID0gZG1fdW5y ZWdpc3Rlcl90YXJnZXQoJm9yaWdpbl90YXJnZXQpOworCWlmIChyKQorCQlETUVSUigib3JpZ2lu IHVucmVnaXN0ZXIgZmFpbGVkICVkIiwgcik7CisKKwlleGl0X29yaWdpbl9oYXNoKCk7CisJbWVt cG9vbF9kZXN0cm95KHBlbmRpbmdfcG9vbCk7CisJa21lbV9jYWNoZV9kZXN0cm95KHBlbmRpbmdf Y2FjaGUpOworCWttZW1fY2FjaGVfZGVzdHJveShleGNlcHRpb25fY2FjaGUpOworfQotLS0gZGlm Zi9kcml2ZXJzL21kL2RtLXNuYXBzaG90LmgJMTk3MC0wMS0wMSAwMTowMDowMC4wMDAwMDAwMDAg KzAxMDAKKysrIHNvdXJjZS9kcml2ZXJzL21kL2RtLXNuYXBzaG90LmgJMjAwMy0wOC0yNiAxNDoy MTozOS4wMDAwMDAwMDAgKzAxMDAKQEAgLTAsMCArMSwxNTggQEAKKy8qCisgKiBkbS1zbmFwc2hv dC5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDIgU2lzdGluYSBTb2Z0d2FyZSAoVUsp IExpbWl0ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEwuCisg Ki8KKworI2lmbmRlZiBETV9TTkFQU0hPVF9ICisjZGVmaW5lIERNX1NOQVBTSE9UX0gKKworI2lu Y2x1ZGUgImRtLmgiCisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisKK3N0cnVjdCBleGNlcHRp b25fdGFibGUgeworCXVpbnQzMl90IGhhc2hfbWFzazsKKwlzdHJ1Y3QgbGlzdF9oZWFkICp0YWJs ZTsKK307CisKKy8qCisgKiBUaGUgc25hcHNob3QgY29kZSBkZWFscyB3aXRoIGxhcmdpc2ggY2h1 bmtzIG9mIHRoZSBkaXNrIGF0IGEKKyAqIHRpbWUuIFR5cGljYWxseSA2NGsgLSAyNTZrLgorICov CisvKiBGSVhNRTogY2FuIHdlIGdldCBhd2F5IHdpdGggbGltaXRpbmcgdGhlc2UgdG8gYSB1aW50 MzJfdCA/ICovCit0eXBlZGVmIHNlY3Rvcl90IGNodW5rX3Q7CisKKy8qCisgKiBBbiBleGNlcHRp b24gaXMgdXNlZCB3aGVyZSBhbiBvbGQgY2h1bmsgb2YgZGF0YSBoYXMgYmVlbgorICogcmVwbGFj ZWQgYnkgYSBuZXcgb25lLgorICovCitzdHJ1Y3QgZXhjZXB0aW9uIHsKKwlzdHJ1Y3QgbGlzdF9o ZWFkIGhhc2hfbGlzdDsKKworCWNodW5rX3Qgb2xkX2NodW5rOworCWNodW5rX3QgbmV3X2NodW5r OworfTsKKworLyoKKyAqIEFic3RyYWN0aW9uIHRvIGhhbmRsZSB0aGUgbWV0YS9sYXlvdXQgb2Yg ZXhjZXB0aW9uIHN0b3JlcyAodGhlCisgKiBDT1cgZGV2aWNlKS4KKyAqLworc3RydWN0IGV4Y2Vw dGlvbl9zdG9yZSB7CisKKwkvKgorCSAqIERlc3Ryb3lzIHRoaXMgb2JqZWN0IHdoZW4geW91J3Zl IGZpbmlzaGVkIHdpdGggaXQuCisJICovCisJdm9pZCAoKmRlc3Ryb3kpIChzdHJ1Y3QgZXhjZXB0 aW9uX3N0b3JlICpzdG9yZSk7CisKKwkvKgorCSAqIFRoZSB0YXJnZXQgc2hvdWxkbid0IHJlYWQg dGhlIENPVyBkZXZpY2UgdW50aWwgdGhpcyBpcworCSAqIGNhbGxlZC4KKwkgKi8KKwlpbnQgKCpy ZWFkX21ldGFkYXRhKSAoc3RydWN0IGV4Y2VwdGlvbl9zdG9yZSAqc3RvcmUpOworCisJLyoKKwkg KiBGaW5kIHNvbWV3aGVyZSB0byBzdG9yZSB0aGUgbmV4dCBleGNlcHRpb24uCisJICovCisJaW50 ICgqcHJlcGFyZV9leGNlcHRpb24pIChzdHJ1Y3QgZXhjZXB0aW9uX3N0b3JlICpzdG9yZSwKKwkJ CQkgIHN0cnVjdCBleGNlcHRpb24gKmUpOworCisJLyoKKwkgKiBVcGRhdGUgdGhlIG1ldGFkYXRh IHdpdGggdGhpcyBleGNlcHRpb24uCisJICovCisJdm9pZCAoKmNvbW1pdF9leGNlcHRpb24pIChz dHJ1Y3QgZXhjZXB0aW9uX3N0b3JlICpzdG9yZSwKKwkJCQkgIHN0cnVjdCBleGNlcHRpb24gKmUs CisJCQkJICB2b2lkICgqY2FsbGJhY2spICh2b2lkICosIGludCBzdWNjZXNzKSwKKwkJCQkgIHZv aWQgKmNhbGxiYWNrX2NvbnRleHQpOworCisJLyoKKwkgKiBUaGUgc25hcHNob3QgaXMgaW52YWxp ZCwgbm90ZSB0aGlzIGluIHRoZSBtZXRhZGF0YS4KKwkgKi8KKwl2b2lkICgqZHJvcF9zbmFwc2hv dCkgKHN0cnVjdCBleGNlcHRpb25fc3RvcmUgKnN0b3JlKTsKKworCS8qCisJICogUmV0dXJuIGhv dyBmdWxsIHRoZSBzbmFwc2hvdCBpcy4KKwkgKi8KKwl2b2lkICgqZnJhY3Rpb25fZnVsbCkgKHN0 cnVjdCBleGNlcHRpb25fc3RvcmUgKnN0b3JlLAorCQkJICAgICAgIHNlY3Rvcl90ICpudW1lcmF0 b3IsCisJCQkgICAgICAgc2VjdG9yX3QgKmRlbm9taW5hdG9yKTsKKworCXN0cnVjdCBkbV9zbmFw c2hvdCAqc25hcDsKKwl2b2lkICpjb250ZXh0OworfTsKKworc3RydWN0IGRtX3NuYXBzaG90IHsK KwlzdHJ1Y3Qgcndfc2VtYXBob3JlIGxvY2s7CisJc3RydWN0IGRtX3RhYmxlICp0YWJsZTsKKwor CXN0cnVjdCBkbV9kZXYgKm9yaWdpbjsKKwlzdHJ1Y3QgZG1fZGV2ICpjb3c7CisKKwkvKiBMaXN0 IG9mIHNuYXBzaG90cyBwZXIgT3JpZ2luICovCisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCisJ LyogU2l6ZSBvZiBkYXRhIGJsb2NrcyBzYXZlZCAtIG11c3QgYmUgYSBwb3dlciBvZiAyICovCisJ Y2h1bmtfdCBjaHVua19zaXplOworCWNodW5rX3QgY2h1bmtfbWFzazsKKwljaHVua190IGNodW5r X3NoaWZ0OworCisJLyogWW91IGNhbid0IHVzZSBhIHNuYXBzaG90IGlmIHRoaXMgaXMgMCAoZS5n LiBpZiBmdWxsKSAqLworCWludCB2YWxpZDsKKwlpbnQgaGF2ZV9tZXRhZGF0YTsKKworCS8qIFVz ZWQgZm9yIGRpc3BsYXkgb2YgdGFibGUgKi8KKwljaGFyIHR5cGU7CisKKwkvKiBUaGUgbGFzdCBw ZXJjZW50YWdlIHdlIG5vdGlmaWVkICovCisJaW50IGxhc3RfcGVyY2VudDsKKworCXN0cnVjdCBl eGNlcHRpb25fdGFibGUgcGVuZGluZzsKKwlzdHJ1Y3QgZXhjZXB0aW9uX3RhYmxlIGNvbXBsZXRl OworCisJLyogVGhlIG9uIGRpc2sgbWV0YWRhdGEgaGFuZGxlciAqLworCXN0cnVjdCBleGNlcHRp b25fc3RvcmUgc3RvcmU7CisKKwlzdHJ1Y3Qga2NvcHlkX2NsaWVudCAqa2NvcHlkX2NsaWVudDsK K307CisKKy8qCisgKiBVc2VkIGJ5IHRoZSBleGNlcHRpb24gc3RvcmVzIHRvIGxvYWQgZXhjZXB0 aW9ucyBoZW4KKyAqIGluaXRpYWxpc2luZy4KKyAqLworaW50IGRtX2FkZF9leGNlcHRpb24oc3Ry dWN0IGRtX3NuYXBzaG90ICpzLCBjaHVua190IG9sZCwgY2h1bmtfdCBuZXcpOworCisvKgorICog Q29uc3RydWN0b3IgYW5kIGRlc3RydWN0b3IgZm9yIHRoZSBkZWZhdWx0IHBlcnNpc3RlbnQKKyAq IHN0b3JlLgorICovCitpbnQgZG1fY3JlYXRlX3BlcnNpc3RlbnQoc3RydWN0IGV4Y2VwdGlvbl9z dG9yZSAqc3RvcmUsIHVpbnQzMl90IGNodW5rX3NpemUpOworCitpbnQgZG1fY3JlYXRlX3RyYW5z aWVudChzdHJ1Y3QgZXhjZXB0aW9uX3N0b3JlICpzdG9yZSwKKwkJCXN0cnVjdCBkbV9zbmFwc2hv dCAqcywgaW50IGJsb2Nrc2l6ZSk7CisKKy8qCisgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBzZWN0 b3JzIGluIHRoZSBkZXZpY2UuCisgKi8KK3N0YXRpYyBpbmxpbmUgc2VjdG9yX3QgZ2V0X2Rldl9z aXplKGtkZXZfdCBkZXYpCit7CisJaW50ICpzaXplczsKKworCXNpemVzID0gYmxrX3NpemVbTUFK T1IoZGV2KV07CisJaWYgKHNpemVzKQorCQlyZXR1cm4gc2l6ZXNbTUlOT1IoZGV2KV0gPDwgMTsK KworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGNodW5rX3Qgc2VjdG9yX3RvX2NodW5r KHN0cnVjdCBkbV9zbmFwc2hvdCAqcywgc2VjdG9yX3Qgc2VjdG9yKQoreworCXJldHVybiAoc2Vj dG9yICYgfnMtPmNodW5rX21hc2spID4+IHMtPmNodW5rX3NoaWZ0OworfQorCitzdGF0aWMgaW5s aW5lIHNlY3Rvcl90IGNodW5rX3RvX3NlY3RvcihzdHJ1Y3QgZG1fc25hcHNob3QgKnMsIGNodW5r X3QgY2h1bmspCit7CisJcmV0dXJuIGNodW5rIDw8IHMtPmNodW5rX3NoaWZ0OworfQorCisjZW5k aWYKLS0tIGRpZmYvZHJpdmVycy9tZC9kbS1zdHJpcGUuYwkxOTcwLTAxLTAxIDAxOjAwOjAwLjAw MDAwMDAwMCArMDEwMAorKysgc291cmNlL2RyaXZlcnMvbWQvZG0tc3RyaXBlLmMJMjAwMy0wOC0y NiAxMzo1OTowNC4wMDAwMDAwMDAgKzAxMDAKQEAgLTAsMCArMSwyNTggQEAKKy8qCisgKiBDb3B5 cmlnaHQgKEMpIDIwMDEgU2lzdGluYSBTb2Z0d2FyZSAoVUspIExpbWl0ZWQuCisgKgorICogVGhp cyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEwuCisgKi8KKworI2luY2x1ZGUgImRtLmgi CisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Cisj aW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCitzdHJ1 Y3Qgc3RyaXBlIHsKKwlzdHJ1Y3QgZG1fZGV2ICpkZXY7CisJc2VjdG9yX3QgcGh5c2ljYWxfc3Rh cnQ7Cit9OworCitzdHJ1Y3Qgc3RyaXBlX2MgeworCXVpbnQzMl90IHN0cmlwZXM7CisKKwkvKiBU aGUgc2l6ZSBvZiB0aGlzIHRhcmdldCAvIG51bS4gc3RyaXBlcyAqLworCXVpbnQzMl90IHN0cmlw ZV93aWR0aDsKKworCS8qIHN0cmlwZSBjaHVuayBzaXplICovCisJdWludDMyX3QgY2h1bmtfc2hp ZnQ7CisJc2VjdG9yX3QgY2h1bmtfbWFzazsKKworCXN0cnVjdCBzdHJpcGUgc3RyaXBlWzBdOwor fTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc3RyaXBlX2MgKmFsbG9jX2NvbnRleHQodW5zaWdu ZWQgaW50IHN0cmlwZXMpCit7CisJc2l6ZV90IGxlbjsKKworCWlmIChhcnJheV90b29fYmlnKHNp emVvZihzdHJ1Y3Qgc3RyaXBlX2MpLCBzaXplb2Yoc3RydWN0IHN0cmlwZSksCisJCQkgIHN0cmlw ZXMpKQorCQlyZXR1cm4gTlVMTDsKKworCWxlbiA9IHNpemVvZihzdHJ1Y3Qgc3RyaXBlX2MpICsg KHNpemVvZihzdHJ1Y3Qgc3RyaXBlKSAqIHN0cmlwZXMpOworCisJcmV0dXJuIGttYWxsb2MobGVu LCBHRlBfS0VSTkVMKTsKK30KKworLyoKKyAqIFBhcnNlIGEgc2luZ2xlIDxkZXY+IDxzZWN0b3I+ IHBhaXIKKyAqLworc3RhdGljIGludCBnZXRfc3RyaXBlKHN0cnVjdCBkbV90YXJnZXQgKnRpLCBz dHJ1Y3Qgc3RyaXBlX2MgKnNjLAorCQkgICAgICB1bnNpZ25lZCBpbnQgc3RyaXBlLCBjaGFyICoq YXJndikKK3sKKwlzZWN0b3JfdCBzdGFydDsKKworCWlmIChzc2NhbmYoYXJndlsxXSwgU0VDVE9S X0ZPUk1BVCwgJnN0YXJ0KSAhPSAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChkbV9nZXRf ZGV2aWNlKHRpLCBhcmd2WzBdLCBzdGFydCwgc2MtPnN0cmlwZV93aWR0aCwKKwkJCSAgZG1fdGFi bGVfZ2V0X21vZGUodGktPnRhYmxlKSwKKwkJCSAgJnNjLT5zdHJpcGVbc3RyaXBlXS5kZXYpKQor CQlyZXR1cm4gLUVOWElPOworCisJc2MtPnN0cmlwZVtzdHJpcGVdLnBoeXNpY2FsX3N0YXJ0ID0g c3RhcnQ7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGSVhNRTogTmFzdHkgZnVuY3Rpb24sIG9u bHkgcHJlc2VudCBiZWNhdXNlIHdlIGNhbid0IGxpbmsKKyAqIGFnYWluc3QgX19tb2RkaTMgYW5k IF9fZGl2ZGkzLgorICoKKyAqIHJldHVybnMgYSA9PSBiICogbgorICovCitzdGF0aWMgaW50IG11 bHRpcGxlKHNlY3Rvcl90IGEsIHNlY3Rvcl90IGIsIHNlY3Rvcl90ICpuKQoreworCXNlY3Rvcl90 IGFjYywgcHJldiwgaTsKKworCSpuID0gMDsKKwl3aGlsZSAoYSA+PSBiKSB7CisJCWZvciAoYWNj ID0gYiwgcHJldiA9IDAsIGkgPSAxOworCQkgICAgIGFjYyA8PSBhOworCQkgICAgIHByZXYgPSBh Y2MsIGFjYyA8PD0gMSwgaSA8PD0gMSkKKwkJCTsKKworCQlhIC09IHByZXY7CisJCSpuICs9IGkg Pj4gMTsKKwl9CisKKwlyZXR1cm4gYSA9PSAwOworfQorCisvKgorICogQ29uc3RydWN0IGEgc3Ry aXBlZCBtYXBwaW5nLgorICogPG51bWJlciBvZiBzdHJpcGVzPiA8Y2h1bmsgc2l6ZSAoMl5ebik+ IFs8ZGV2X3BhdGg+IDxvZmZzZXQ+XSsKKyAqLworc3RhdGljIGludCBzdHJpcGVfY3RyKHN0cnVj dCBkbV90YXJnZXQgKnRpLCB1bnNpZ25lZCBpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJc3Ry dWN0IHN0cmlwZV9jICpzYzsKKwlzZWN0b3JfdCB3aWR0aDsKKwl1aW50MzJfdCBzdHJpcGVzOwor CXVpbnQzMl90IGNodW5rX3NpemU7CisJY2hhciAqZW5kOworCWludCByOworCXVuc2lnbmVkIGlu dCBpOworCisJaWYgKGFyZ2MgPCAyKSB7CisJCXRpLT5lcnJvciA9ICJkbS1zdHJpcGU6IE5vdCBl bm91Z2ggYXJndW1lbnRzIjsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3RyaXBlcyA9IHNp bXBsZV9zdHJ0b3VsKGFyZ3ZbMF0sICZlbmQsIDEwKTsKKwlpZiAoKmVuZCkgeworCQl0aS0+ZXJy b3IgPSAiZG0tc3RyaXBlOiBJbnZhbGlkIHN0cmlwZSBjb3VudCI7CisJCXJldHVybiAtRUlOVkFM OworCX0KKworCWNodW5rX3NpemUgPSBzaW1wbGVfc3RydG91bChhcmd2WzFdLCAmZW5kLCAxMCk7 CisJaWYgKCplbmQpIHsKKwkJdGktPmVycm9yID0gImRtLXN0cmlwZTogSW52YWxpZCBjaHVua19z aXplIjsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyoKKwkgKiBjaHVua19zaXplIGlzIGEg cG93ZXIgb2YgdHdvCisJICovCisJaWYgKCFjaHVua19zaXplIHx8IChjaHVua19zaXplICYgKGNo dW5rX3NpemUgLSAxKSkpIHsKKwkJdGktPmVycm9yID0gImRtLXN0cmlwZTogSW52YWxpZCBjaHVu ayBzaXplIjsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCFtdWx0aXBsZSh0aS0+bGVu LCBzdHJpcGVzLCAmd2lkdGgpKSB7CisJCXRpLT5lcnJvciA9ICJkbS1zdHJpcGU6IFRhcmdldCBs ZW5ndGggbm90IGRpdmlzYWJsZSBieSAiCisJCSAgICAibnVtYmVyIG9mIHN0cmlwZXMiOworCQly ZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKgorCSAqIERvIHdlIGhhdmUgZW5vdWdoIGFyZ3VtZW50 cyBmb3IgdGhhdCBtYW55IHN0cmlwZXMgPworCSAqLworCWlmIChhcmdjICE9ICgyICsgMiAqIHN0 cmlwZXMpKSB7CisJCXRpLT5lcnJvciA9ICJkbS1zdHJpcGU6IE5vdCBlbm91Z2ggZGVzdGluYXRp b25zIHNwZWNpZmllZCI7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNjID0gYWxsb2NfY29u dGV4dChzdHJpcGVzKTsKKwlpZiAoIXNjKSB7CisJCXRpLT5lcnJvciA9ICJkbS1zdHJpcGU6IE1l bW9yeSBhbGxvY2F0aW9uIGZvciBzdHJpcGVkIGNvbnRleHQgIgorCQkgICAgImZhaWxlZCI7CisJ CXJldHVybiAtRU5PTUVNOworCX0KKworCXNjLT5zdHJpcGVzID0gc3RyaXBlczsKKwlzYy0+c3Ry aXBlX3dpZHRoID0gd2lkdGg7CisKKwlzYy0+Y2h1bmtfbWFzayA9ICgoc2VjdG9yX3QpIGNodW5r X3NpemUpIC0gMTsKKwlmb3IgKHNjLT5jaHVua19zaGlmdCA9IDA7IGNodW5rX3NpemU7IHNjLT5j aHVua19zaGlmdCsrKQorCQljaHVua19zaXplID4+PSAxOworCXNjLT5jaHVua19zaGlmdC0tOwor CisJLyoKKwkgKiBHZXQgdGhlIHN0cmlwZSBkZXN0aW5hdGlvbnMuCisJICovCisJZm9yIChpID0g MDsgaSA8IHN0cmlwZXM7IGkrKykgeworCQlhcmd2ICs9IDI7CisKKwkJciA9IGdldF9zdHJpcGUo dGksIHNjLCBpLCBhcmd2KTsKKwkJaWYgKHIgPCAwKSB7CisJCQl0aS0+ZXJyb3IgPSAiZG0tc3Ry aXBlOiBDb3VsZG4ndCBwYXJzZSBzdHJpcGUgIgorCQkJICAgICJkZXN0aW5hdGlvbiI7CisJCQl3 aGlsZSAoaS0tKQorCQkJCWRtX3B1dF9kZXZpY2UodGksIHNjLT5zdHJpcGVbaV0uZGV2KTsKKwkJ CWtmcmVlKHNjKTsKKwkJCXJldHVybiByOworCQl9CisJfQorCisJdGktPnByaXZhdGUgPSBzYzsK KwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc3RyaXBlX2R0cihzdHJ1Y3QgZG1fdGFyZ2V0 ICp0aSkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlzdHJ1Y3Qgc3RyaXBlX2MgKnNjID0gKHN0cnVj dCBzdHJpcGVfYyAqKSB0aS0+cHJpdmF0ZTsKKworCWZvciAoaSA9IDA7IGkgPCBzYy0+c3RyaXBl czsgaSsrKQorCQlkbV9wdXRfZGV2aWNlKHRpLCBzYy0+c3RyaXBlW2ldLmRldik7CisKKwlrZnJl ZShzYyk7Cit9CisKK3N0YXRpYyBpbnQgc3RyaXBlX21hcChzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSwg c3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgaW50IHJ3LAorCQkgICAgICB1bmlvbiBtYXBfaW5mbyAq Y29udGV4dCkKK3sKKwlzdHJ1Y3Qgc3RyaXBlX2MgKnNjID0gKHN0cnVjdCBzdHJpcGVfYyAqKSB0 aS0+cHJpdmF0ZTsKKworCXNlY3Rvcl90IG9mZnNldCA9IGJoLT5iX3JzZWN0b3IgLSB0aS0+YmVn aW47CisJdWludDMyX3QgY2h1bmsgPSAodWludDMyX3QpIChvZmZzZXQgPj4gc2MtPmNodW5rX3No aWZ0KTsKKwl1aW50MzJfdCBzdHJpcGUgPSBjaHVuayAlIHNjLT5zdHJpcGVzOwkvKiAzMmJpdCBt b2R1bHVzICovCisJY2h1bmsgPSBjaHVuayAvIHNjLT5zdHJpcGVzOworCisJYmgtPmJfcmRldiA9 IHNjLT5zdHJpcGVbc3RyaXBlXS5kZXYtPmRldjsKKwliaC0+Yl9yc2VjdG9yID0gc2MtPnN0cmlw ZVtzdHJpcGVdLnBoeXNpY2FsX3N0YXJ0ICsKKwkgICAgKGNodW5rIDw8IHNjLT5jaHVua19zaGlm dCkgKyAob2Zmc2V0ICYgc2MtPmNodW5rX21hc2spOworCXJldHVybiAxOworfQorCitzdGF0aWMg aW50IHN0cmlwZV9zdGF0dXMoc3RydWN0IGRtX3RhcmdldCAqdGksIHN0YXR1c190eXBlX3QgdHlw ZSwKKwkJCSBjaGFyICpyZXN1bHQsIHVuc2lnbmVkIGludCBtYXhsZW4pCit7CisJc3RydWN0IHN0 cmlwZV9jICpzYyA9IChzdHJ1Y3Qgc3RyaXBlX2MgKikgdGktPnByaXZhdGU7CisJaW50IG9mZnNl dDsKKwl1bnNpZ25lZCBpbnQgaTsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgU1RBVFVTVFlQ RV9JTkZPOgorCQlyZXN1bHRbMF0gPSAnXDAnOworCQlicmVhazsKKworCWNhc2UgU1RBVFVTVFlQ RV9UQUJMRToKKwkJb2Zmc2V0ID0gc25wcmludGYocmVzdWx0LCBtYXhsZW4sICIlZCAiIFNFQ1RP Ul9GT1JNQVQsCisJCQkJICBzYy0+c3RyaXBlcywgc2MtPmNodW5rX21hc2sgKyAxKTsKKwkJZm9y IChpID0gMDsgaSA8IHNjLT5zdHJpcGVzOyBpKyspIHsKKwkJCW9mZnNldCArPQorCQkJICAgIHNu cHJpbnRmKHJlc3VsdCArIG9mZnNldCwgbWF4bGVuIC0gb2Zmc2V0LAorCQkJCSAgICAgIiAlcyAi IFNFQ1RPUl9GT1JNQVQsCisJCSAgICAgICBkbV9rZGV2bmFtZSh0b19rZGV2X3Qoc2MtPnN0cmlw ZVtpXS5kZXYtPmJkZXYtPmJkX2RldikpLAorCQkJCSAgICAgc2MtPnN0cmlwZVtpXS5waHlzaWNh bF9zdGFydCk7CisJCX0KKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3Ry dWN0IHRhcmdldF90eXBlIHN0cmlwZV90YXJnZXQgPSB7CisJLm5hbWUgICA9ICJzdHJpcGVkIiwK KwkubW9kdWxlID0gVEhJU19NT0RVTEUsCisJLmN0ciAgICA9IHN0cmlwZV9jdHIsCisJLmR0ciAg ICA9IHN0cmlwZV9kdHIsCisJLm1hcCAgICA9IHN0cmlwZV9tYXAsCisJLnN0YXR1cyA9IHN0cmlw ZV9zdGF0dXMsCit9OworCitpbnQgX19pbml0IGRtX3N0cmlwZV9pbml0KHZvaWQpCit7CisJaW50 IHI7CisKKwlyID0gZG1fcmVnaXN0ZXJfdGFyZ2V0KCZzdHJpcGVfdGFyZ2V0KTsKKwlpZiAociA8 IDApCisJCURNV0FSTigic3RyaXBlZCB0YXJnZXQgcmVnaXN0cmF0aW9uIGZhaWxlZCIpOworCisJ cmV0dXJuIHI7Cit9CisKK3ZvaWQgZG1fc3RyaXBlX2V4aXQodm9pZCkKK3sKKwlpZiAoZG1fdW5y ZWdpc3Rlcl90YXJnZXQoJnN0cmlwZV90YXJnZXQpKQorCQlETVdBUk4oInN0cmlwZWQgdGFyZ2V0 IHVucmVnaXN0cmF0aW9uIGZhaWxlZCIpOworCisJcmV0dXJuOworfQotLS0gZGlmZi9kcml2ZXJz L21kL2RtLXRhYmxlLmMJMTk3MC0wMS0wMSAwMTowMDowMC4wMDAwMDAwMDAgKzAxMDAKKysrIHNv dXJjZS9kcml2ZXJzL21kL2RtLXRhYmxlLmMJMjAwMy0wOC0yNiAxMzo1OTowNC4wMDAwMDAwMDAg KzAxMDAKQEAgLTAsMCArMSw2ODcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgU2lzdGlu YSBTb2Z0d2FyZSAoVUspIExpbWl0ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVu ZGVyIHRoZSBHUEwuCisgKi8KKworI2luY2x1ZGUgImRtLmgiCisKKyNpbmNsdWRlIDxsaW51eC9t b2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvYmxr ZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+ CisjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgorCisjZGVmaW5lIE1BWF9ERVBUSCAxNgorI2RlZmlu ZSBOT0RFX1NJWkUgTDFfQ0FDSEVfQllURVMKKyNkZWZpbmUgS0VZU19QRVJfTk9ERSAoTk9ERV9T SVpFIC8gc2l6ZW9mKHNlY3Rvcl90KSkKKyNkZWZpbmUgQ0hJTERSRU5fUEVSX05PREUgKEtFWVNf UEVSX05PREUgKyAxKQorCitzdHJ1Y3QgZG1fdGFibGUgeworCWF0b21pY190IGhvbGRlcnM7CisK KwkvKiBidHJlZSB0YWJsZSAqLworCXVuc2lnbmVkIGludCBkZXB0aDsKKwl1bnNpZ25lZCBpbnQg Y291bnRzW01BWF9ERVBUSF07CS8qIGluIG5vZGVzICovCisJc2VjdG9yX3QgKmluZGV4W01BWF9E RVBUSF07CisKKwl1bnNpZ25lZCBpbnQgbnVtX3RhcmdldHM7CisJdW5zaWduZWQgaW50IG51bV9h bGxvY2F0ZWQ7CisJc2VjdG9yX3QgKmhpZ2hzOworCXN0cnVjdCBkbV90YXJnZXQgKnRhcmdldHM7 CisKKwkvKgorCSAqIEluZGljYXRlcyB0aGUgcncgcGVybWlzc2lvbnMgZm9yIHRoZSBuZXcgbG9n aWNhbAorCSAqIGRldmljZS4gIFRoaXMgc2hvdWxkIGJlIGEgY29tYmluYXRpb24gb2YgRk1PREVf UkVBRAorCSAqIGFuZCBGTU9ERV9XUklURS4KKwkgKi8KKwlpbnQgbW9kZTsKKworCS8qIGEgbGlz dCBvZiBkZXZpY2VzIHVzZWQgYnkgdGhpcyB0YWJsZSAqLworCXN0cnVjdCBsaXN0X2hlYWQgZGV2 aWNlczsKKworCS8qIGV2ZW50cyBnZXQgaGFuZGVkIHVwIHVzaW5nIHRoaXMgY2FsbGJhY2sgKi8K Kwl2b2lkICgqZXZlbnRfZm4pKHZvaWQgKik7CisJdm9pZCAqZXZlbnRfY29udGV4dDsKK307CisK Ky8qCisgKiBTaW1pbGFyIHRvIGNlaWxpbmcobG9nX3NpemUobikpCisgKi8KK3N0YXRpYyB1bnNp Z25lZCBpbnQgaW50X2xvZyh1bnNpZ25lZCBsb25nIG4sIHVuc2lnbmVkIGxvbmcgYmFzZSkKK3sK KwlpbnQgcmVzdWx0ID0gMDsKKworCXdoaWxlIChuID4gMSkgeworCQluID0gZG1fZGl2X3VwKG4s IGJhc2UpOworCQlyZXN1bHQrKzsKKwl9CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKgorICog Q2FsY3VsYXRlIHRoZSBpbmRleCBvZiB0aGUgY2hpbGQgbm9kZSBvZiB0aGUgbid0aCBub2RlIGsn dGgga2V5LgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBnZXRfY2hpbGQodW5zaWdu ZWQgaW50IG4sIHVuc2lnbmVkIGludCBrKQoreworCXJldHVybiAobiAqIENISUxEUkVOX1BFUl9O T0RFKSArIGs7Cit9CisKKy8qCisgKiBSZXR1cm4gdGhlIG4ndGggbm9kZSBvZiBsZXZlbCBsIGZy b20gdGFibGUgdC4KKyAqLworc3RhdGljIGlubGluZSBzZWN0b3JfdCAqZ2V0X25vZGUoc3RydWN0 IGRtX3RhYmxlICp0LCB1bnNpZ25lZCBpbnQgbCwKKwkJCQkgdW5zaWduZWQgaW50IG4pCit7CisJ cmV0dXJuIHQtPmluZGV4W2xdICsgKG4gKiBLRVlTX1BFUl9OT0RFKTsKK30KKworLyoKKyAqIFJl dHVybiB0aGUgaGlnaGVzdCBrZXkgdGhhdCB5b3UgY291bGQgbG9va3VwIGZyb20gdGhlIG4ndGgK KyAqIG5vZGUgb24gbGV2ZWwgbCBvZiB0aGUgYnRyZWUuCisgKi8KK3N0YXRpYyBzZWN0b3JfdCBo aWdoKHN0cnVjdCBkbV90YWJsZSAqdCwgdW5zaWduZWQgaW50IGwsIHVuc2lnbmVkIGludCBuKQor eworCWZvciAoOyBsIDwgdC0+ZGVwdGggLSAxOyBsKyspCisJCW4gPSBnZXRfY2hpbGQobiwgQ0hJ TERSRU5fUEVSX05PREUgLSAxKTsKKworCWlmIChuID49IHQtPmNvdW50c1tsXSkKKwkJcmV0dXJu IChzZWN0b3JfdCkgLSAxOworCisJcmV0dXJuIGdldF9ub2RlKHQsIGwsIG4pW0tFWVNfUEVSX05P REUgLSAxXTsKK30KKworLyoKKyAqIEZpbGxzIGluIGEgbGV2ZWwgb2YgdGhlIGJ0cmVlIGJhc2Vk IG9uIHRoZSBoaWdocyBvZiB0aGUgbGV2ZWwKKyAqIGJlbG93IGl0LgorICovCitzdGF0aWMgaW50 IHNldHVwX2J0cmVlX2luZGV4KHVuc2lnbmVkIGludCBsLCBzdHJ1Y3QgZG1fdGFibGUgKnQpCit7 CisJdW5zaWduZWQgaW50IG4sIGs7CisJc2VjdG9yX3QgKm5vZGU7CisKKwlmb3IgKG4gPSAwVTsg biA8IHQtPmNvdW50c1tsXTsgbisrKSB7CisJCW5vZGUgPSBnZXRfbm9kZSh0LCBsLCBuKTsKKwor CQlmb3IgKGsgPSAwVTsgayA8IEtFWVNfUEVSX05PREU7IGsrKykKKwkJCW5vZGVba10gPSBoaWdo KHQsIGwgKyAxLCBnZXRfY2hpbGQobiwgaykpOworCX0KKworCXJldHVybiAwOworfQorCisvKgor ICogaGlnaHMsIGFuZCB0YXJnZXRzIGFyZSBtYW5hZ2VkIGFzIGR5bmFtaWMgYXJyYXlzIGR1cmlu ZyBhCisgKiB0YWJsZSBsb2FkLgorICovCitzdGF0aWMgaW50IGFsbG9jX3RhcmdldHMoc3RydWN0 IGRtX3RhYmxlICp0LCB1bnNpZ25lZCBpbnQgbnVtKQoreworCXNlY3Rvcl90ICpuX2hpZ2hzOwor CXN0cnVjdCBkbV90YXJnZXQgKm5fdGFyZ2V0czsKKwlpbnQgbiA9IHQtPm51bV90YXJnZXRzOwor CisJLyoKKwkgKiBBbGxvY2F0ZSBib3RoIHRoZSB0YXJnZXQgYXJyYXkgYW5kIG9mZnNldCBhcnJh eSBhdCBvbmNlLgorCSAqLworCW5faGlnaHMgPSAoc2VjdG9yX3QgKikgdmNhbGxvYyhzaXplb2Yo c3RydWN0IGRtX3RhcmdldCkgKworCQkJCSAgICAgICBzaXplb2Yoc2VjdG9yX3QpLCBudW0pOwor CWlmICghbl9oaWdocykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwluX3RhcmdldHMgPSAoc3RydWN0 IGRtX3RhcmdldCAqKSAobl9oaWdocyArIG51bSk7CisKKwlpZiAobikgeworCQltZW1jcHkobl9o aWdocywgdC0+aGlnaHMsIHNpemVvZigqbl9oaWdocykgKiBuKTsKKwkJbWVtY3B5KG5fdGFyZ2V0 cywgdC0+dGFyZ2V0cywgc2l6ZW9mKCpuX3RhcmdldHMpICogbik7CisJfQorCisJbWVtc2V0KG5f aGlnaHMgKyBuLCAtMSwgc2l6ZW9mKCpuX2hpZ2hzKSAqIChudW0gLSBuKSk7CisJdmZyZWUodC0+ aGlnaHMpOworCisJdC0+bnVtX2FsbG9jYXRlZCA9IG51bTsKKwl0LT5oaWdocyA9IG5faGlnaHM7 CisJdC0+dGFyZ2V0cyA9IG5fdGFyZ2V0czsKKworCXJldHVybiAwOworfQorCitpbnQgZG1fdGFi bGVfY3JlYXRlKHN0cnVjdCBkbV90YWJsZSAqKnJlc3VsdCwgaW50IG1vZGUpCit7CisJc3RydWN0 IGRtX3RhYmxlICp0ID0ga21hbGxvYyhzaXplb2YoKnQpLCBHRlBfTk9JTyk7CisKKwlpZiAoIXQp CisJCXJldHVybiAtRU5PTUVNOworCisJbWVtc2V0KHQsIDAsIHNpemVvZigqdCkpOworCUlOSVRf TElTVF9IRUFEKCZ0LT5kZXZpY2VzKTsKKwlhdG9taWNfc2V0KCZ0LT5ob2xkZXJzLCAxKTsKKwor CS8qIGFsbG9jYXRlIGEgc2luZ2xlIG5vZGVzIHdvcnRoIG9mIHRhcmdldHMgdG8gYmVnaW4gd2l0 aCAqLworCWlmIChhbGxvY190YXJnZXRzKHQsIEtFWVNfUEVSX05PREUpKSB7CisJCWtmcmVlKHQp OworCQl0ID0gTlVMTDsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJdC0+bW9kZSA9IG1vZGU7 CisJKnJlc3VsdCA9IHQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfZGV2aWNl cyhzdHJ1Y3QgbGlzdF9oZWFkICpkZXZpY2VzKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnRtcCwg Km5leHQ7CisKKwlmb3IgKHRtcCA9IGRldmljZXMtPm5leHQ7IHRtcCAhPSBkZXZpY2VzOyB0bXAg PSBuZXh0KSB7CisJCXN0cnVjdCBkbV9kZXYgKmRkID0gbGlzdF9lbnRyeSh0bXAsIHN0cnVjdCBk bV9kZXYsIGxpc3QpOworCQluZXh0ID0gdG1wLT5uZXh0OworCQlrZnJlZShkZCk7CisJfQorfQor Cit2b2lkIHRhYmxlX2Rlc3Ryb3koc3RydWN0IGRtX3RhYmxlICp0KQoreworCXVuc2lnbmVkIGlu dCBpOworCisJLyogZnJlZSB0aGUgaW5kZXhlcyAoc2VlIGRtX3RhYmxlX2NvbXBsZXRlKSAqLwor CWlmICh0LT5kZXB0aCA+PSAyKQorCQl2ZnJlZSh0LT5pbmRleFt0LT5kZXB0aCAtIDJdKTsKKwor CS8qIGZyZWUgdGhlIHRhcmdldHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgdC0+bnVtX3RhcmdldHM7 IGkrKykgeworCQlzdHJ1Y3QgZG1fdGFyZ2V0ICp0Z3QgPSB0LT50YXJnZXRzICsgaTsKKworCQlp ZiAodGd0LT50eXBlLT5kdHIpCisJCQl0Z3QtPnR5cGUtPmR0cih0Z3QpOworCisJCWRtX3B1dF90 YXJnZXRfdHlwZSh0Z3QtPnR5cGUpOworCX0KKworCXZmcmVlKHQtPmhpZ2hzKTsKKworCS8qIGZy ZWUgdGhlIGRldmljZSBsaXN0ICovCisJaWYgKHQtPmRldmljZXMubmV4dCAhPSAmdC0+ZGV2aWNl cykgeworCQlETVdBUk4oImRldmljZXMgc3RpbGwgcHJlc2VudCBkdXJpbmcgZGVzdHJveTogIgor CQkgICAgICAgImRtX3RhYmxlX3JlbW92ZV9kZXZpY2UgY2FsbHMgbWlzc2luZyIpOworCisJCWZy ZWVfZGV2aWNlcygmdC0+ZGV2aWNlcyk7CisJfQorCisJa2ZyZWUodCk7Cit9CisKK3ZvaWQgZG1f dGFibGVfZ2V0KHN0cnVjdCBkbV90YWJsZSAqdCkKK3sKKwlhdG9taWNfaW5jKCZ0LT5ob2xkZXJz KTsKK30KKwordm9pZCBkbV90YWJsZV9wdXQoc3RydWN0IGRtX3RhYmxlICp0KQoreworCWlmIChh dG9taWNfZGVjX2FuZF90ZXN0KCZ0LT5ob2xkZXJzKSkKKwkJdGFibGVfZGVzdHJveSh0KTsKK30K KworLyoKKyAqIENoZWNrcyB0byBzZWUgaWYgd2UgbmVlZCB0byBleHRlbmQgaGlnaHMgb3IgdGFy Z2V0cy4KKyAqLworc3RhdGljIGlubGluZSBpbnQgY2hlY2tfc3BhY2Uoc3RydWN0IGRtX3RhYmxl ICp0KQoreworCWlmICh0LT5udW1fdGFyZ2V0cyA+PSB0LT5udW1fYWxsb2NhdGVkKQorCQlyZXR1 cm4gYWxsb2NfdGFyZ2V0cyh0LCB0LT5udW1fYWxsb2NhdGVkICogMik7CisKKwlyZXR1cm4gMDsK K30KKworLyoKKyAqIENvbnZlcnQgYSBkZXZpY2UgcGF0aCB0byBhIGRldl90LgorICovCitzdGF0 aWMgaW50IGxvb2t1cF9kZXZpY2UoY29uc3QgY2hhciAqcGF0aCwga2Rldl90ICpkZXYpCit7CisJ aW50IHI7CisJc3RydWN0IG5hbWVpZGF0YSBuZDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCisJ aWYgKCFwYXRoX2luaXQocGF0aCwgTE9PS1VQX0ZPTExPVywgJm5kKSkKKwkJcmV0dXJuIDA7CisK KwlpZiAoKHIgPSBwYXRoX3dhbGsocGF0aCwgJm5kKSkpCisJCWdvdG8gb3V0OworCisJaW5vZGUg PSBuZC5kZW50cnktPmRfaW5vZGU7CisJaWYgKCFpbm9kZSkgeworCQlyID0gLUVOT0VOVDsKKwkJ Z290byBvdXQ7CisJfQorCisJaWYgKCFTX0lTQkxLKGlub2RlLT5pX21vZGUpKSB7CisJCXIgPSAt RU5PVEJMSzsKKwkJZ290byBvdXQ7CisJfQorCisJKmRldiA9IGlub2RlLT5pX3JkZXY7CisKKyAg ICAgIG91dDoKKwlwYXRoX3JlbGVhc2UoJm5kKTsKKwlyZXR1cm4gcjsKK30KKworLyoKKyAqIFNl ZSBpZiB3ZSd2ZSBhbHJlYWR5IGdvdCBhIGRldmljZSBpbiB0aGUgbGlzdC4KKyAqLworc3RhdGlj IHN0cnVjdCBkbV9kZXYgKmZpbmRfZGV2aWNlKHN0cnVjdCBsaXN0X2hlYWQgKmwsIGtkZXZfdCBk ZXYpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqdG1wOworCisJbGlzdF9mb3JfZWFjaCh0bXAsIGwp IHsKKwkJc3RydWN0IGRtX2RldiAqZGQgPSBsaXN0X2VudHJ5KHRtcCwgc3RydWN0IGRtX2Rldiwg bGlzdCk7CisJCWlmIChrZGV2X3NhbWUoZGQtPmRldiwgZGV2KSkKKwkJCXJldHVybiBkZDsKKwl9 CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIE9wZW4gYSBkZXZpY2Ugc28gd2UgY2FuIHVz ZSBpdCBhcyBhIG1hcCBkZXN0aW5hdGlvbi4KKyAqLworc3RhdGljIGludCBvcGVuX2RldihzdHJ1 Y3QgZG1fZGV2ICpkZCkKK3sKKwlpZiAoZGQtPmJkZXYpCisJCUJVRygpOworCisJZGQtPmJkZXYg PSBiZGdldChrZGV2X3RfdG9fbnIoZGQtPmRldikpOworCWlmICghZGQtPmJkZXYpCisJCXJldHVy biAtRU5PTUVNOworCisJcmV0dXJuIGJsa2Rldl9nZXQoZGQtPmJkZXYsIGRkLT5tb2RlLCAwLCBC REVWX1JBVyk7Cit9CisKKy8qCisgKiBDbG9zZSBhIGRldmljZSB0aGF0IHdlJ3ZlIGJlZW4gdXNp bmcuCisgKi8KK3N0YXRpYyB2b2lkIGNsb3NlX2RldihzdHJ1Y3QgZG1fZGV2ICpkZCkKK3sKKwlp ZiAoIWRkLT5iZGV2KQorCQlyZXR1cm47CisKKwlibGtkZXZfcHV0KGRkLT5iZGV2LCBCREVWX1JB Vyk7CisJZGQtPmJkZXYgPSBOVUxMOworfQorCisvKgorICogSWYgcG9zc2libGUgKGllLiBibGtf c2l6ZVttYWpvcl0gaXMgc2V0KSwgdGhpcyBjaGVja3MgYW4gYXJlYQorICogb2YgYSBkZXN0aW5h dGlvbiBkZXZpY2UgaXMgdmFsaWQuCisgKi8KK3N0YXRpYyBpbnQgY2hlY2tfZGV2aWNlX2FyZWEo a2Rldl90IGRldiwgc2VjdG9yX3Qgc3RhcnQsIHNlY3Rvcl90IGxlbikKK3sKKwlpbnQgKnNpemVz OworCXNlY3Rvcl90IGRldl9zaXplOworCisJaWYgKCEoc2l6ZXMgPSBibGtfc2l6ZVttYWpvcihk ZXYpXSkgfHwgIShkZXZfc2l6ZSA9IHNpemVzW21pbm9yKGRldildKSkKKwkJLyogd2UgZG9uJ3Qg a25vdyB0aGUgZGV2aWNlIGRldGFpbHMsCisJCSAqIHNvIGdpdmUgdGhlIGJlbmVmaXQgb2YgdGhl IGRvdWJ0ICovCisJCXJldHVybiAxOworCisJLyogY29udmVydCB0byA1MTItYnl0ZSBzZWN0b3Jz ICovCisJZGV2X3NpemUgPDw9IDE7CisKKwlyZXR1cm4gKChzdGFydCA8IGRldl9zaXplKSAmJiAo bGVuIDw9IChkZXZfc2l6ZSAtIHN0YXJ0KSkpOworfQorCisvKgorICogVGhpcyB1cGdyYWRlcyB0 aGUgbW9kZSBvbiBhbiBhbHJlYWR5IG9wZW4gZG1fZGV2LiAgQmVpbmcKKyAqIGNhcmVmdWwgdG8g bGVhdmUgdGhpbmdzIGFzIHRoZXkgd2VyZSBpZiB3ZSBmYWlsIHRvIHJlb3BlbiB0aGUKKyAqIGRl dmljZS4KKyAqLworc3RhdGljIGludCB1cGdyYWRlX21vZGUoc3RydWN0IGRtX2RldiAqZGQsIGlu dCBuZXdfbW9kZSkKK3sKKwlpbnQgcjsKKwlzdHJ1Y3QgZG1fZGV2IGRkX2NvcHk7CisKKwltZW1j cHkoJmRkX2NvcHksIGRkLCBzaXplb2YoZGRfY29weSkpOworCisJZGQtPm1vZGUgfD0gbmV3X21v ZGU7CisJZGQtPmJkZXYgPSBOVUxMOworCXIgPSBvcGVuX2RldihkZCk7CisJaWYgKCFyKQorCQlj bG9zZV9kZXYoJmRkX2NvcHkpOworCWVsc2UKKwkJbWVtY3B5KGRkLCAmZGRfY29weSwgc2l6ZW9m KGRkX2NvcHkpKTsKKworCXJldHVybiByOworfQorCisvKgorICogQWRkIGEgZGV2aWNlIHRvIHRo ZSBsaXN0LCBvciBqdXN0IGluY3JlbWVudCB0aGUgdXNhZ2UgY291bnQgaWYKKyAqIGl0J3MgYWxy ZWFkeSBwcmVzZW50LgorICovCitpbnQgZG1fZ2V0X2RldmljZShzdHJ1Y3QgZG1fdGFyZ2V0ICp0 aSwgY29uc3QgY2hhciAqcGF0aCwgc2VjdG9yX3Qgc3RhcnQsCisJCSAgc2VjdG9yX3QgbGVuLCBp bnQgbW9kZSwgc3RydWN0IGRtX2RldiAqKnJlc3VsdCkKK3sKKwlpbnQgcjsKKwlrZGV2X3QgZGV2 OworCXN0cnVjdCBkbV9kZXYgKmRkOworCXVuc2lnbmVkIG1ham9yLCBtaW5vcjsKKwlzdHJ1Y3Qg ZG1fdGFibGUgKnQgPSB0aS0+dGFibGU7CisKKwlpZiAoIXQpCisJCUJVRygpOworCisJaWYgKHNz Y2FuZihwYXRoLCAiJXU6JXUiLCAmbWFqb3IsICZtaW5vcikgPT0gMikgeworCQkvKiBFeHRyYWN0 IHRoZSBtYWpvci9taW5vciBudW1iZXJzICovCisJCWRldiA9IG1rX2tkZXYobWFqb3IsIG1pbm9y KTsKKwl9IGVsc2UgeworCQkvKiBjb252ZXJ0IHRoZSBwYXRoIHRvIGEgZGV2aWNlICovCisJCWlm ICgociA9IGxvb2t1cF9kZXZpY2UocGF0aCwgJmRldikpKQorCQkJcmV0dXJuIHI7CisJfQorCisJ ZGQgPSBmaW5kX2RldmljZSgmdC0+ZGV2aWNlcywgZGV2KTsKKwlpZiAoIWRkKSB7CisJCWRkID0g a21hbGxvYyhzaXplb2YoKmRkKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghZGQpCisJCQlyZXR1cm4g LUVOT01FTTsKKworCQlkZC0+ZGV2ID0gZGV2OworCQlkZC0+bW9kZSA9IG1vZGU7CisJCWRkLT5i ZGV2ID0gTlVMTDsKKworCQlpZiAoKHIgPSBvcGVuX2RldihkZCkpKSB7CisJCQlrZnJlZShkZCk7 CisJCQlyZXR1cm4gcjsKKwkJfQorCisJCWF0b21pY19zZXQoJmRkLT5jb3VudCwgMCk7CisJCWxp c3RfYWRkKCZkZC0+bGlzdCwgJnQtPmRldmljZXMpOworCisJfSBlbHNlIGlmIChkZC0+bW9kZSAh PSAobW9kZSB8IGRkLT5tb2RlKSkgeworCQlyID0gdXBncmFkZV9tb2RlKGRkLCBtb2RlKTsKKwkJ aWYgKHIpCisJCQlyZXR1cm4gcjsKKwl9CisJYXRvbWljX2luYygmZGQtPmNvdW50KTsKKworCWlm ICghY2hlY2tfZGV2aWNlX2FyZWEoZGQtPmRldiwgc3RhcnQsIGxlbikpIHsKKwkJRE1XQVJOKCJk ZXZpY2UgJXMgdG9vIHNtYWxsIGZvciB0YXJnZXQiLCBwYXRoKTsKKwkJZG1fcHV0X2RldmljZSh0 aSwgZGQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkqcmVzdWx0ID0gZGQ7CisKKwlyZXR1 cm4gMDsKK30KKworLyoKKyAqIERlY3JlbWVudCBhIGRldmljZXMgdXNlIGNvdW50IGFuZCByZW1v dmUgaXQgaWYgbmVjY2Vzc2FyeS4KKyAqLwordm9pZCBkbV9wdXRfZGV2aWNlKHN0cnVjdCBkbV90 YXJnZXQgKnRpLCBzdHJ1Y3QgZG1fZGV2ICpkZCkKK3sKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVz dCgmZGQtPmNvdW50KSkgeworCQljbG9zZV9kZXYoZGQpOworCQlsaXN0X2RlbCgmZGQtPmxpc3Qp OworCQlrZnJlZShkZCk7CisJfQorfQorCisvKgorICogQ2hlY2tzIHRvIHNlZSBpZiB0aGUgdGFy Z2V0IGpvaW5zIG9udG8gdGhlIGVuZCBvZiB0aGUgdGFibGUuCisgKi8KK3N0YXRpYyBpbnQgYWRq b2luKHN0cnVjdCBkbV90YWJsZSAqdGFibGUsIHN0cnVjdCBkbV90YXJnZXQgKnRpKQoreworCXN0 cnVjdCBkbV90YXJnZXQgKnByZXY7CisKKwlpZiAoIXRhYmxlLT5udW1fdGFyZ2V0cykKKwkJcmV0 dXJuICF0aS0+YmVnaW47CisKKwlwcmV2ID0gJnRhYmxlLT50YXJnZXRzW3RhYmxlLT5udW1fdGFy Z2V0cyAtIDFdOworCXJldHVybiAodGktPmJlZ2luID09IChwcmV2LT5iZWdpbiArIHByZXYtPmxl bikpOworfQorCisvKgorICogRGVzdHJ1Y3RpdmVseSBzcGxpdHMgdXAgdGhlIGFyZ3VtZW50IGxp c3QgdG8gcGFzcyB0byBjdHIuCisgKi8KK3N0YXRpYyBpbnQgc3BsaXRfYXJncyhpbnQgbWF4LCBp bnQgKmFyZ2MsIGNoYXIgKiphcmd2LCBjaGFyICppbnB1dCkKK3sKKwljaGFyICpzdGFydCwgKmVu ZCA9IGlucHV0LCAqb3V0OworCSphcmdjID0gMDsKKworCXdoaWxlICgxKSB7CisJCXN0YXJ0ID0g ZW5kOworCisJCS8qIFNraXAgd2hpdGVzcGFjZSAqLworCQl3aGlsZSAoKnN0YXJ0ICYmIGlzc3Bh Y2UoKnN0YXJ0KSkKKwkJCXN0YXJ0Kys7CisKKwkJaWYgKCEqc3RhcnQpCisJCQlicmVhazsJLyog c3VjY2Vzcywgd2UgaGl0IHRoZSBlbmQgKi8KKworCQkvKiAnb3V0JyBpcyB1c2VkIHRvIHJlbW92 ZSBhbnkgYmFjay1xdW90ZXMgKi8KKwkJZW5kID0gb3V0ID0gc3RhcnQ7CisJCXdoaWxlICgqZW5k KSB7CisJCQkvKiBFdmVyeXRoaW5nIGFwYXJ0IGZyb20gJ1wwJyBjYW4gYmUgcXVvdGVkICovCisJ CQlpZiAoKmVuZCA9PSAnXFwnICYmICooZW5kICsgMSkpIHsKKwkJCQkqb3V0KysgPSAqKGVuZCAr IDEpOworCQkJCWVuZCArPSAyOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlpZiAoaXNzcGFj ZSgqZW5kKSkKKwkJCQlicmVhazsJLyogZW5kIG9mIHRva2VuICovCisKKwkJCSpvdXQrKyA9ICpl bmQrKzsKKwkJfQorCisJCS8qIGhhdmUgd2UgYWxyZWFkeSBmaWxsZWQgdGhlIGFycmF5ID8gKi8K KwkJaWYgKCgqYXJnYyArIDEpID4gbWF4KQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJLyogd2Ug a25vdyB0aGlzIGlzIHdoaXRlc3BhY2UgKi8KKwkJaWYgKCplbmQpCisJCQllbmQrKzsKKworCQkv KiB0ZXJtaW5hdGUgdGhlIHN0cmluZyBhbmQgcHV0IGl0IGluIHRoZSBhcnJheSAqLworCQkqb3V0 ID0gJ1wwJzsKKwkJYXJndlsqYXJnY10gPSBzdGFydDsKKwkJKCphcmdjKSsrOworCX0KKworCXJl dHVybiAwOworfQorCitpbnQgZG1fdGFibGVfYWRkX3RhcmdldChzdHJ1Y3QgZG1fdGFibGUgKnQs IGNvbnN0IGNoYXIgKnR5cGUsCisJCQlzZWN0b3JfdCBzdGFydCwgc2VjdG9yX3QgbGVuLCBjaGFy ICpwYXJhbXMpCit7CisJaW50IHIgPSAtRUlOVkFMLCBhcmdjOworCWNoYXIgKmFyZ3ZbMzJdOwor CXN0cnVjdCBkbV90YXJnZXQgKnRndDsKKworCWlmICgociA9IGNoZWNrX3NwYWNlKHQpKSkKKwkJ cmV0dXJuIHI7CisKKwl0Z3QgPSB0LT50YXJnZXRzICsgdC0+bnVtX3RhcmdldHM7CisJbWVtc2V0 KHRndCwgMCwgc2l6ZW9mKCp0Z3QpKTsKKworCXRndC0+dHlwZSA9IGRtX2dldF90YXJnZXRfdHlw ZSh0eXBlKTsKKwlpZiAoIXRndC0+dHlwZSkgeworCQl0Z3QtPmVycm9yID0gInVua25vd24gdGFy Z2V0IHR5cGUiOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwl0Z3QtPnRhYmxlID0gdDsKKwl0 Z3QtPmJlZ2luID0gc3RhcnQ7CisJdGd0LT5sZW4gPSBsZW47CisJdGd0LT5lcnJvciA9ICJVbmtu b3duIGVycm9yIjsKKworCS8qCisJICogRG9lcyB0aGlzIHRhcmdldCBhZGpvaW4gdGhlIHByZXZp b3VzIG9uZSA/CisJICovCisJaWYgKCFhZGpvaW4odCwgdGd0KSkgeworCQl0Z3QtPmVycm9yID0g IkdhcCBpbiB0YWJsZSI7CisJCXIgPSAtRUlOVkFMOworCQlnb3RvIGJhZDsKKwl9CisKKwlyID0g c3BsaXRfYXJncyhBUlJBWV9TSVpFKGFyZ3YpLCAmYXJnYywgYXJndiwgcGFyYW1zKTsKKwlpZiAo cikgeworCQl0Z3QtPmVycm9yID0gImNvdWxkbid0IHNwbGl0IHBhcmFtZXRlcnMiOworCQlnb3Rv IGJhZDsKKwl9CisKKwlyID0gdGd0LT50eXBlLT5jdHIodGd0LCBhcmdjLCBhcmd2KTsKKwlpZiAo cikKKwkJZ290byBiYWQ7CisKKwl0LT5oaWdoc1t0LT5udW1fdGFyZ2V0cysrXSA9IHRndC0+YmVn aW4gKyB0Z3QtPmxlbiAtIDE7CisJcmV0dXJuIDA7CisKKyAgICAgIGJhZDoKKwlwcmludGsoS0VS Tl9FUlIgRE1fTkFNRSAiOiAlc1xuIiwgdGd0LT5lcnJvcik7CisJZG1fcHV0X3RhcmdldF90eXBl KHRndC0+dHlwZSk7CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgc2V0dXBfaW5kZXhlcyhz dHJ1Y3QgZG1fdGFibGUgKnQpCit7CisJaW50IGk7CisJdW5zaWduZWQgaW50IHRvdGFsID0gMDsK KwlzZWN0b3JfdCAqaW5kZXhlczsKKworCS8qIGFsbG9jYXRlIHRoZSBzcGFjZSBmb3IgKmFsbCog dGhlIGluZGV4ZXMgKi8KKwlmb3IgKGkgPSB0LT5kZXB0aCAtIDI7IGkgPj0gMDsgaS0tKSB7CisJ CXQtPmNvdW50c1tpXSA9IGRtX2Rpdl91cCh0LT5jb3VudHNbaSArIDFdLCBDSElMRFJFTl9QRVJf Tk9ERSk7CisJCXRvdGFsICs9IHQtPmNvdW50c1tpXTsKKwl9CisKKwlpbmRleGVzID0gKHNlY3Rv cl90ICopIHZjYWxsb2ModG90YWwsICh1bnNpZ25lZCBsb25nKSBOT0RFX1NJWkUpOworCWlmICgh aW5kZXhlcykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBzZXQgdXAgaW50ZXJuYWwgbm9kZXMs IGJvdHRvbS11cCAqLworCWZvciAoaSA9IHQtPmRlcHRoIC0gMiwgdG90YWwgPSAwOyBpID49IDA7 IGktLSkgeworCQl0LT5pbmRleFtpXSA9IGluZGV4ZXM7CisJCWluZGV4ZXMgKz0gKEtFWVNfUEVS X05PREUgKiB0LT5jb3VudHNbaV0pOworCQlzZXR1cF9idHJlZV9pbmRleChpLCB0KTsKKwl9CisK KwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEJ1aWxkcyB0aGUgYnRyZWUgdG8gaW5kZXggdGhlIG1h cC4KKyAqLworaW50IGRtX3RhYmxlX2NvbXBsZXRlKHN0cnVjdCBkbV90YWJsZSAqdCkKK3sKKwlp bnQgciA9IDA7CisJdW5zaWduZWQgaW50IGxlYWZfbm9kZXM7CisKKwkvKiBob3cgbWFueSBpbmRl eGVzIHdpbGwgdGhlIGJ0cmVlIGhhdmUgPyAqLworCWxlYWZfbm9kZXMgPSBkbV9kaXZfdXAodC0+ bnVtX3RhcmdldHMsIEtFWVNfUEVSX05PREUpOworCXQtPmRlcHRoID0gMSArIGludF9sb2cobGVh Zl9ub2RlcywgQ0hJTERSRU5fUEVSX05PREUpOworCisJLyogbGVhZiBsYXllciBoYXMgYWxyZWFk eSBiZWVuIHNldCB1cCAqLworCXQtPmNvdW50c1t0LT5kZXB0aCAtIDFdID0gbGVhZl9ub2RlczsK Kwl0LT5pbmRleFt0LT5kZXB0aCAtIDFdID0gdC0+aGlnaHM7CisKKwlpZiAodC0+ZGVwdGggPj0g MikKKwkJciA9IHNldHVwX2luZGV4ZXModCk7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIHNw aW5sb2NrX3QgX2V2ZW50X2xvY2sgPSBTUElOX0xPQ0tfVU5MT0NLRUQ7Cit2b2lkIGRtX3RhYmxl X2V2ZW50X2NhbGxiYWNrKHN0cnVjdCBkbV90YWJsZSAqdCwKKwkJCSAgICAgdm9pZCAoKmZuKSh2 b2lkICopLCB2b2lkICpjb250ZXh0KQoreworCXNwaW5fbG9ja19pcnEoJl9ldmVudF9sb2NrKTsK Kwl0LT5ldmVudF9mbiA9IGZuOworCXQtPmV2ZW50X2NvbnRleHQgPSBjb250ZXh0OworCXNwaW5f dW5sb2NrX2lycSgmX2V2ZW50X2xvY2spOworfQorCit2b2lkIGRtX3RhYmxlX2V2ZW50KHN0cnVj dCBkbV90YWJsZSAqdCkKK3sKKwlzcGluX2xvY2soJl9ldmVudF9sb2NrKTsKKwlpZiAodC0+ZXZl bnRfZm4pCisJCXQtPmV2ZW50X2ZuKHQtPmV2ZW50X2NvbnRleHQpOworCXNwaW5fdW5sb2NrKCZf ZXZlbnRfbG9jayk7Cit9CisKK3NlY3Rvcl90IGRtX3RhYmxlX2dldF9zaXplKHN0cnVjdCBkbV90 YWJsZSAqdCkKK3sKKwlyZXR1cm4gdC0+bnVtX3RhcmdldHMgPyAodC0+aGlnaHNbdC0+bnVtX3Rh cmdldHMgLSAxXSArIDEpIDogMDsKK30KKworc3RydWN0IGRtX3RhcmdldCAqZG1fdGFibGVfZ2V0 X3RhcmdldChzdHJ1Y3QgZG1fdGFibGUgKnQsIHVuc2lnbmVkIGludCBpbmRleCkKK3sKKwlpZiAo aW5kZXggPiB0LT5udW1fdGFyZ2V0cykKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gdC0+dGFy Z2V0cyArIGluZGV4OworfQorCisvKgorICogU2VhcmNoIHRoZSBidHJlZSBmb3IgdGhlIGNvcnJl Y3QgdGFyZ2V0LgorICovCitzdHJ1Y3QgZG1fdGFyZ2V0ICpkbV90YWJsZV9maW5kX3RhcmdldChz dHJ1Y3QgZG1fdGFibGUgKnQsIHNlY3Rvcl90IHNlY3RvcikKK3sKKwl1bnNpZ25lZCBpbnQgbCwg biA9IDAsIGsgPSAwOworCXNlY3Rvcl90ICpub2RlOworCisJZm9yIChsID0gMDsgbCA8IHQtPmRl cHRoOyBsKyspIHsKKwkJbiA9IGdldF9jaGlsZChuLCBrKTsKKwkJbm9kZSA9IGdldF9ub2RlKHQs IGwsIG4pOworCisJCWZvciAoayA9IDA7IGsgPCBLRVlTX1BFUl9OT0RFOyBrKyspCisJCQlpZiAo bm9kZVtrXSA+PSBzZWN0b3IpCisJCQkJYnJlYWs7CisJfQorCisJcmV0dXJuICZ0LT50YXJnZXRz WyhLRVlTX1BFUl9OT0RFICogbikgKyBrXTsKK30KKwordW5zaWduZWQgaW50IGRtX3RhYmxlX2dl dF9udW1fdGFyZ2V0cyhzdHJ1Y3QgZG1fdGFibGUgKnQpCit7CisJcmV0dXJuIHQtPm51bV90YXJn ZXRzOworfQorCitzdHJ1Y3QgbGlzdF9oZWFkICpkbV90YWJsZV9nZXRfZGV2aWNlcyhzdHJ1Y3Qg ZG1fdGFibGUgKnQpCit7CisJcmV0dXJuICZ0LT5kZXZpY2VzOworfQorCitpbnQgZG1fdGFibGVf Z2V0X21vZGUoc3RydWN0IGRtX3RhYmxlICp0KQoreworCXJldHVybiB0LT5tb2RlOworfQorCit2 b2lkIGRtX3RhYmxlX3N1c3BlbmRfdGFyZ2V0cyhzdHJ1Y3QgZG1fdGFibGUgKnQpCit7CisJaW50 IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgdC0+bnVtX3RhcmdldHM7IGkrKykgeworCQlzdHJ1Y3Qg ZG1fdGFyZ2V0ICp0aSA9IHQtPnRhcmdldHMgKyBpOworCisJCWlmICh0aS0+dHlwZS0+c3VzcGVu ZCkKKwkJCXRpLT50eXBlLT5zdXNwZW5kKHRpKTsKKwl9Cit9CisKK3ZvaWQgZG1fdGFibGVfcmVz dW1lX3RhcmdldHMoc3RydWN0IGRtX3RhYmxlICp0KQoreworCWludCBpOworCisJZm9yIChpID0g MDsgaSA8IHQtPm51bV90YXJnZXRzOyBpKyspIHsKKwkJc3RydWN0IGRtX3RhcmdldCAqdGkgPSB0 LT50YXJnZXRzICsgaTsKKworCQlpZiAodGktPnR5cGUtPnJlc3VtZSkKKwkJCXRpLT50eXBlLT5y ZXN1bWUodGkpOworCX0KK30KKworRVhQT1JUX1NZTUJPTChkbV9nZXRfZGV2aWNlKTsKK0VYUE9S VF9TWU1CT0woZG1fcHV0X2RldmljZSk7CitFWFBPUlRfU1lNQk9MKGRtX3RhYmxlX2V2ZW50KTsK K0VYUE9SVF9TWU1CT0woZG1fdGFibGVfZ2V0X21vZGUpOwotLS0gZGlmZi9kcml2ZXJzL21kL2Rt LXRhcmdldC5jCTE5NzAtMDEtMDEgMDE6MDA6MDAuMDAwMDAwMDAwICswMTAwCisrKyBzb3VyY2Uv ZHJpdmVycy9tZC9kbS10YXJnZXQuYwkyMDAzLTA4LTI2IDEzOjU5OjA0LjAwMDAwMDAwMCArMDEw MApAQCAtMCwwICsxLDE4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMSBTaXN0aW5hIFNv ZnR3YXJlIChVSykgTGltaXRlZAorICoKKyAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0 aGUgR1BMLgorICovCisKKyNpbmNsdWRlICJkbS5oIgorCisjaW5jbHVkZSA8bGludXgvbW9kdWxl Lmg+CisjaW5jbHVkZSA8bGludXgva21vZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKwor c3RydWN0IHR0X2ludGVybmFsIHsKKwlzdHJ1Y3QgdGFyZ2V0X3R5cGUgdHQ7CisKKwlzdHJ1Y3Qg bGlzdF9oZWFkIGxpc3Q7CisJbG9uZyB1c2U7Cit9OworCitzdGF0aWMgTElTVF9IRUFEKF90YXJn ZXRzKTsKK3N0YXRpYyBERUNMQVJFX1JXU0VNKF9sb2NrKTsKKworI2RlZmluZSBETV9NT0RfTkFN RV9TSVpFIDMyCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHR0X2ludGVybmFsICpfX2ZpbmRfdGFy Z2V0X3R5cGUoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICp0aWg7CisJ c3RydWN0IHR0X2ludGVybmFsICp0aTsKKworCWxpc3RfZm9yX2VhY2godGloLCAmX3RhcmdldHMp IHsKKwkJdGkgPSBsaXN0X2VudHJ5KHRpaCwgc3RydWN0IHR0X2ludGVybmFsLCBsaXN0KTsKKwor CQlpZiAoIXN0cmNtcChuYW1lLCB0aS0+dHQubmFtZSkpCisJCQlyZXR1cm4gdGk7CisJfQorCisJ cmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdHRfaW50ZXJuYWwgKmdldF90YXJnZXRf dHlwZShjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCB0dF9pbnRlcm5hbCAqdGk7CisKKwlk b3duX3JlYWQoJl9sb2NrKTsKKwl0aSA9IF9fZmluZF90YXJnZXRfdHlwZShuYW1lKTsKKworCWlm ICh0aSkgeworCQlpZiAodGktPnVzZSA9PSAwICYmIHRpLT50dC5tb2R1bGUpCisJCQlfX01PRF9J TkNfVVNFX0NPVU5UKHRpLT50dC5tb2R1bGUpOworCQl0aS0+dXNlKys7CisJfQorCXVwX3JlYWQo Jl9sb2NrKTsKKworCXJldHVybiB0aTsKK30KKworc3RhdGljIHZvaWQgbG9hZF9tb2R1bGUoY29u c3QgY2hhciAqbmFtZSkKK3sKKwljaGFyIG1vZHVsZV9uYW1lW0RNX01PRF9OQU1FX1NJWkVdID0g ImRtLSI7CisKKwkvKiBMZW5ndGggY2hlY2sgZm9yIHN0cmNhdCgpIGJlbG93ICovCisJaWYgKHN0 cmxlbihuYW1lKSA+IChETV9NT0RfTkFNRV9TSVpFIC0gNCkpCisJCXJldHVybjsKKworCXN0cmNh dChtb2R1bGVfbmFtZSwgbmFtZSk7CisJcmVxdWVzdF9tb2R1bGUobW9kdWxlX25hbWUpOworfQor CitzdHJ1Y3QgdGFyZ2V0X3R5cGUgKmRtX2dldF90YXJnZXRfdHlwZShjb25zdCBjaGFyICpuYW1l KQoreworCXN0cnVjdCB0dF9pbnRlcm5hbCAqdGkgPSBnZXRfdGFyZ2V0X3R5cGUobmFtZSk7CisK KwlpZiAoIXRpKSB7CisJCWxvYWRfbW9kdWxlKG5hbWUpOworCQl0aSA9IGdldF90YXJnZXRfdHlw ZShuYW1lKTsKKwl9CisKKwlyZXR1cm4gdGkgPyAmdGktPnR0IDogTlVMTDsKK30KKwordm9pZCBk bV9wdXRfdGFyZ2V0X3R5cGUoc3RydWN0IHRhcmdldF90eXBlICp0KQoreworCXN0cnVjdCB0dF9p bnRlcm5hbCAqdGkgPSAoc3RydWN0IHR0X2ludGVybmFsICopIHQ7CisKKwlkb3duX3JlYWQoJl9s b2NrKTsKKwlpZiAoLS10aS0+dXNlID09IDAgJiYgdGktPnR0Lm1vZHVsZSkKKwkJX19NT0RfREVD X1VTRV9DT1VOVCh0aS0+dHQubW9kdWxlKTsKKworCWlmICh0aS0+dXNlIDwgMCkKKwkJQlVHKCk7 CisJdXBfcmVhZCgmX2xvY2spOworCisJcmV0dXJuOworfQorCitzdGF0aWMgc3RydWN0IHR0X2lu dGVybmFsICphbGxvY190YXJnZXQoc3RydWN0IHRhcmdldF90eXBlICp0KQoreworCXN0cnVjdCB0 dF9pbnRlcm5hbCAqdGkgPSBrbWFsbG9jKHNpemVvZigqdGkpLCBHRlBfS0VSTkVMKTsKKworCWlm ICh0aSkgeworCQltZW1zZXQodGksIDAsIHNpemVvZigqdGkpKTsKKwkJdGktPnR0ID0gKnQ7CisJ fQorCisJcmV0dXJuIHRpOworfQorCitpbnQgZG1fcmVnaXN0ZXJfdGFyZ2V0KHN0cnVjdCB0YXJn ZXRfdHlwZSAqdCkKK3sKKwlpbnQgcnYgPSAwOworCXN0cnVjdCB0dF9pbnRlcm5hbCAqdGkgPSBh bGxvY190YXJnZXQodCk7CisKKwlpZiAoIXRpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRvd25f d3JpdGUoJl9sb2NrKTsKKwlpZiAoX19maW5kX3RhcmdldF90eXBlKHQtPm5hbWUpKSB7CisJCWtm cmVlKHRpKTsKKwkJcnYgPSAtRUVYSVNUOworCX0gZWxzZQorCQlsaXN0X2FkZCgmdGktPmxpc3Qs ICZfdGFyZ2V0cyk7CisKKwl1cF93cml0ZSgmX2xvY2spOworCXJldHVybiBydjsKK30KKworaW50 IGRtX3VucmVnaXN0ZXJfdGFyZ2V0KHN0cnVjdCB0YXJnZXRfdHlwZSAqdCkKK3sKKwlzdHJ1Y3Qg dHRfaW50ZXJuYWwgKnRpOworCisJZG93bl93cml0ZSgmX2xvY2spOworCWlmICghKHRpID0gX19m aW5kX3RhcmdldF90eXBlKHQtPm5hbWUpKSkgeworCQl1cF93cml0ZSgmX2xvY2spOworCQlyZXR1 cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAodGktPnVzZSkgeworCQl1cF93cml0ZSgmX2xvY2spOwor CQlyZXR1cm4gLUVUWFRCU1k7CisJfQorCisJbGlzdF9kZWwoJnRpLT5saXN0KTsKKwlrZnJlZSh0 aSk7CisKKwl1cF93cml0ZSgmX2xvY2spOworCXJldHVybiAwOworfQorCisvKgorICogaW8tZXJy OiBhbHdheXMgZmFpbHMgYW4gaW8sIHVzZWZ1bCBmb3IgYnJpbmdpbmcKKyAqIHVwIExWcyB0aGF0 IGhhdmUgaG9sZXMgaW4gdGhlbS4KKyAqLworc3RhdGljIGludCBpb19lcnJfY3RyKHN0cnVjdCBk bV90YXJnZXQgKnRpLCB1bnNpZ25lZCBpbnQgYXJnYywgY2hhciAqKmFyZ3MpCit7CisJcmV0dXJu IDA7Cit9CisKK3N0YXRpYyB2b2lkIGlvX2Vycl9kdHIoc3RydWN0IGRtX3RhcmdldCAqdGkpCit7 CisJLyogZW1wdHkgKi8KK30KKworc3RhdGljIGludCBpb19lcnJfbWFwKHN0cnVjdCBkbV90YXJn ZXQgKnRpLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCBpbnQgcncsCisJCSAgICAgIHVuaW9uIG1h cF9pbmZvICptYXBfY29udGV4dCkKK3sKKwlyZXR1cm4gLUVJTzsKK30KKworc3RhdGljIHN0cnVj dCB0YXJnZXRfdHlwZSBlcnJvcl90YXJnZXQgPSB7CisJLm5hbWUgPSAiZXJyb3IiLAorCS5jdHIg ID0gaW9fZXJyX2N0ciwKKwkuZHRyICA9IGlvX2Vycl9kdHIsCisJLm1hcCAgPSBpb19lcnJfbWFw LAorfTsKKworaW50IGRtX3RhcmdldF9pbml0KHZvaWQpCit7CisJcmV0dXJuIGRtX3JlZ2lzdGVy X3RhcmdldCgmZXJyb3JfdGFyZ2V0KTsKK30KKwordm9pZCBkbV90YXJnZXRfZXhpdCh2b2lkKQor eworCWlmIChkbV91bnJlZ2lzdGVyX3RhcmdldCgmZXJyb3JfdGFyZ2V0KSkKKwkJRE1XQVJOKCJl cnJvciB0YXJnZXQgdW5yZWdpc3RyYXRpb24gZmFpbGVkIik7Cit9CisKK0VYUE9SVF9TWU1CT0wo ZG1fcmVnaXN0ZXJfdGFyZ2V0KTsKK0VYUE9SVF9TWU1CT0woZG1fdW5yZWdpc3Rlcl90YXJnZXQp OwotLS0gZGlmZi9kcml2ZXJzL21kL2RtLmMJMTk3MC0wMS0wMSAwMTowMDowMC4wMDAwMDAwMDAg KzAxMDAKKysrIHNvdXJjZS9kcml2ZXJzL21kL2RtLmMJMjAwMy0wOC0yNiAxMzo1OTowNC4wMDAw MDAwMDAgKzAxMDAKQEAgLTAsMCArMSwxMTE1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAx LCAyMDAyIFNpc3RpbmEgU29mdHdhcmUgKFVLKSBMaW1pdGVkLgorICoKKyAqIFRoaXMgZmlsZSBp cyByZWxlYXNlZCB1bmRlciB0aGUgR1BMLgorICovCisKKyNpbmNsdWRlICJkbS5oIgorI2luY2x1 ZGUgImtjb3B5ZC5oIgorCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4 L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsay5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa3Bn Lmg+CisjaW5jbHVkZSA8bGludXgvbWVtcG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4K KyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L2tkZXZfdC5oPgorI2lu Y2x1ZGUgPGxpbnV4L2x2bS5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworc3RhdGlj IGNvbnN0IGNoYXIgKl9uYW1lID0gRE1fTkFNRTsKKyNkZWZpbmUgREVGQVVMVF9SRUFEX0FIRUFE IDY0CisKK3N0cnVjdCBkbV9pbyB7CisJc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kOworCisJc3Ry dWN0IGRtX3RhcmdldCAqdGk7CisJaW50IHJ3OworCXVuaW9uIG1hcF9pbmZvIG1hcF9jb250ZXh0 OworCXZvaWQgKCplbmRfaW8pIChzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCwgaW50IHVwdG9kYXRl KTsKKwl2b2lkICpjb250ZXh0OworfTsKKworc3RydWN0IGRlZmVycmVkX2lvIHsKKwlpbnQgcnc7 CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwlzdHJ1Y3QgZGVmZXJyZWRfaW8gKm5leHQ7Cit9 OworCisvKgorICogQml0cyBmb3IgdGhlIG1kLT5mbGFncyBmaWVsZC4KKyAqLworI2RlZmluZSBE TUZfQkxPQ0tfSU8gMAorI2RlZmluZSBETUZfU1VTUEVOREVEIDEKKworc3RydWN0IG1hcHBlZF9k ZXZpY2UgeworCXN0cnVjdCByd19zZW1hcGhvcmUgbG9jazsKKwlhdG9taWNfdCBob2xkZXJzOwor CisJa2Rldl90IGRldjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyoKKwkgKiBBIGxpc3Qg b2YgaW9zIHRoYXQgYXJyaXZlZCB3aGlsZSB3ZSB3ZXJlIHN1c3BlbmRlZC4KKwkgKi8KKwlhdG9t aWNfdCBwZW5kaW5nOworCXdhaXRfcXVldWVfaGVhZF90IHdhaXQ7CisJc3RydWN0IGRlZmVycmVk X2lvICpkZWZlcnJlZDsKKworCS8qCisJICogVGhlIGN1cnJlbnQgbWFwcGluZy4KKwkgKi8KKwlz dHJ1Y3QgZG1fdGFibGUgKm1hcDsKKworCS8qCisJICogaW8gb2JqZWN0cyBhcmUgYWxsb2NhdGVk IGZyb20gaGVyZS4KKwkgKi8KKwltZW1wb29sX3QgKmlvX3Bvb2w7CisKKwkvKgorCSAqIEV2ZW50 IGhhbmRsaW5nLgorCSAqLworCXVpbnQzMl90IGV2ZW50X25yOworCXdhaXRfcXVldWVfaGVhZF90 IGV2ZW50cTsKK307CisKKyNkZWZpbmUgTUlOX0lPUyAyNTYKK3N0YXRpYyBrbWVtX2NhY2hlX3Qg Kl9pb19jYWNoZTsKKworc3RhdGljIHN0cnVjdCBtYXBwZWRfZGV2aWNlICpnZXRfa2RldihrZGV2 X3QgZGV2KTsKK3N0YXRpYyBpbnQgZG1fcmVxdWVzdChyZXF1ZXN0X3F1ZXVlX3QgKnEsIGludCBy dywgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCk7CitzdGF0aWMgaW50IGRtX3VzZXJfYm1hcChzdHJ1 Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgbHZfYm1hcCAqbHZiKTsKKworLyotLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICog SW4gb3JkZXIgdG8gYXZvaWQgdGhlIDI1NiBtaW5vciBudW1iZXIgbGltaXQgd2UgYXJlIGdvaW5n IHRvCisgKiByZWdpc3RlciBtb3JlIG1ham9yIG51bWJlcnMgYXMgbmVjY2Vzc2FyeS4KKyAqLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tKi8KKyNkZWZpbmUgTUFYX01JTk9SUyAoMSA8PCBNSU5PUkJJVFMpCisKK3N0cnVjdCBtYWpv cl9kZXRhaWxzIHsKKwl1bnNpZ25lZCBpbnQgbWFqb3I7CisKKwlpbnQgdHJhbnNpZW50OworCXN0 cnVjdCBsaXN0X2hlYWQgdHJhbnNpZW50X2xpc3Q7CisKKwl1bnNpZ25lZCBpbnQgZmlyc3RfZnJl ZV9taW5vcjsKKwlpbnQgbnJfZnJlZV9taW5vcnM7CisKKwlzdHJ1Y3QgbWFwcGVkX2RldmljZSAq bWRzW01BWF9NSU5PUlNdOworCWludCBibGtfc2l6ZVtNQVhfTUlOT1JTXTsKKwlpbnQgYmxrc2l6 ZV9zaXplW01BWF9NSU5PUlNdOworCWludCBoYXJkc2VjdF9zaXplW01BWF9NSU5PUlNdOworfTsK Kworc3RhdGljIHN0cnVjdCByd19zZW1hcGhvcmUgX2Rldl9sb2NrOworc3RhdGljIHN0cnVjdCBt YWpvcl9kZXRhaWxzICpfbWFqb3JzW01BWF9CTEtERVZdOworCisvKgorICogVGhpcyBob2xkcyBh IGxpc3Qgb2YgbWFqb3JzIHRoYXQgbm9uLXNwZWNpZmllZCBkZXZpY2UgbnVtYmVycworICogbWF5 IGJlIGFsbG9jYXRlZCBmcm9tLiAgT25seSBtYWpvcnMgd2l0aCBmcmVlIG1pbm9ycyBhcHBlYXIg b24KKyAqIHRoaXMgbGlzdC4KKyAqLworc3RhdGljIExJU1RfSEVBRChfdHJhbnNpZW50c19mcmVl KTsKKworc3RhdGljIGludCBfX2FsbG9jX21ham9yKHVuc2lnbmVkIGludCBtYWpvciwgc3RydWN0 IG1ham9yX2RldGFpbHMgKipyZXN1bHQpCit7CisJaW50IHI7CisJdW5zaWduZWQgaW50IHRyYW5z aWVudCA9ICFtYWpvcjsKKwlzdHJ1Y3QgbWFqb3JfZGV0YWlscyAqbWFqOworCisJLyogTWFqb3Ig YWxyZWFkeSBhbGxvY2F0ZWQ/ICovCisJaWYgKG1ham9yICYmIF9tYWpvcnNbbWFqb3JdKQorCQly ZXR1cm4gMDsKKworCW1haiA9IGttYWxsb2Moc2l6ZW9mKCptYWopLCBHRlBfS0VSTkVMKTsKKwlp ZiAoIW1haikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltZW1zZXQobWFqLCAwLCBzaXplb2YoKm1h aikpOworCUlOSVRfTElTVF9IRUFEKCZtYWotPnRyYW5zaWVudF9saXN0KTsKKworCW1hai0+bnJf ZnJlZV9taW5vcnMgPSBNQVhfTUlOT1JTOworCisJciA9IHJlZ2lzdGVyX2Jsa2RldihtYWpvciwg X25hbWUsICZkbV9ibGtfZG9wcyk7CisJaWYgKHIgPCAwKSB7CisJCURNRVJSKCJyZWdpc3Rlcl9i bGtkZXYgZmFpbGVkIGZvciAlZCIsIG1ham9yKTsKKwkJa2ZyZWUobWFqKTsKKwkJcmV0dXJuIHI7 CisJfQorCWlmIChyID4gMCkKKwkJbWFqb3IgPSByOworCisJbWFqLT5tYWpvciA9IG1ham9yOwor CisJaWYgKHRyYW5zaWVudCkgeworCQltYWotPnRyYW5zaWVudCA9IHRyYW5zaWVudDsKKwkJbGlz dF9hZGRfdGFpbCgmbWFqLT50cmFuc2llbnRfbGlzdCwgJl90cmFuc2llbnRzX2ZyZWUpOworCX0K KworCV9tYWpvcnNbbWFqb3JdID0gbWFqOworCisJYmxrX3NpemVbbWFqb3JdID0gbWFqLT5ibGtf c2l6ZTsKKwlibGtzaXplX3NpemVbbWFqb3JdID0gbWFqLT5ibGtzaXplX3NpemU7CisJaGFyZHNl Y3Rfc2l6ZVttYWpvcl0gPSBtYWotPmhhcmRzZWN0X3NpemU7CisJcmVhZF9haGVhZFttYWpvcl0g PSBERUZBVUxUX1JFQURfQUhFQUQ7CisKKwlibGtfcXVldWVfbWFrZV9yZXF1ZXN0KEJMS19ERUZB VUxUX1FVRVVFKG1ham9yKSwgZG1fcmVxdWVzdCk7CisKKwkqcmVzdWx0ID0gbWFqOworCXJldHVy biAwOworfQorCitzdGF0aWMgdm9pZCBfX2ZyZWVfbWFqb3Ioc3RydWN0IG1ham9yX2RldGFpbHMg Km1haikKK3sKKwl1bnNpZ25lZCBpbnQgbWFqb3IgPSBtYWotPm1ham9yOworCisJbGlzdF9kZWwo Jm1hai0+dHJhbnNpZW50X2xpc3QpOworCisJcmVhZF9haGVhZFttYWpvcl0gPSAwOworCWJsa19z aXplW21ham9yXSA9IE5VTEw7CisJYmxrc2l6ZV9zaXplW21ham9yXSA9IE5VTEw7CisJaGFyZHNl Y3Rfc2l6ZVttYWpvcl0gPSBOVUxMOworCisJX21ham9yc1ttYWpvcl0gPSBOVUxMOworCWtmcmVl KG1haik7CisKKwlpZiAodW5yZWdpc3Rlcl9ibGtkZXYobWFqb3IsIF9uYW1lKSA8IDApCisJCURN RVJSKCJkZXZmc191bnJlZ2lzdGVyX2Jsa2RldiBmYWlsZWQiKTsKK30KKworc3RhdGljIHZvaWQg ZnJlZV9hbGxfbWFqb3JzKHZvaWQpCit7CisJdW5zaWduZWQgaW50IG1ham9yID0gQVJSQVlfU0la RShfbWFqb3JzKTsKKworCWRvd25fd3JpdGUoJl9kZXZfbG9jayk7CisKKwl3aGlsZSAobWFqb3It LSkKKwkJaWYgKF9tYWpvcnNbbWFqb3JdKQorCQkJX19mcmVlX21ham9yKF9tYWpvcnNbbWFqb3Jd KTsKKworCXVwX3dyaXRlKCZfZGV2X2xvY2spOworfQorCitzdGF0aWMgdm9pZCBmcmVlX2Rldihr ZGV2X3QgZGV2KQoreworCXVuc2lnbmVkIGludCBtYWpvciA9IG1ham9yKGRldik7CisJdW5zaWdu ZWQgaW50IG1pbm9yID0gbWlub3IoZGV2KTsKKwlzdHJ1Y3QgbWFqb3JfZGV0YWlscyAqbWFqOwor CisJZG93bl93cml0ZSgmX2Rldl9sb2NrKTsKKworCW1haiA9IF9tYWpvcnNbbWFqb3JdOworCWlm ICghbWFqKQorCQlnb3RvIG91dDsKKworCW1hai0+bWRzW21pbm9yXSA9IE5VTEw7CisJbWFqLT5u cl9mcmVlX21pbm9ycysrOworCisJaWYgKG1hai0+bnJfZnJlZV9taW5vcnMgPT0gTUFYX01JTk9S UykgeworCQlfX2ZyZWVfbWFqb3IobWFqKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKCFtYWot PnRyYW5zaWVudCkKKwkJZ290byBvdXQ7CisKKwlpZiAobWFqLT5ucl9mcmVlX21pbm9ycyA9PSAx KQorCQlsaXN0X2FkZF90YWlsKCZtYWotPnRyYW5zaWVudF9saXN0LCAmX3RyYW5zaWVudHNfZnJl ZSk7CisKKwlpZiAobWlub3IgPCBtYWotPmZpcnN0X2ZyZWVfbWlub3IpCisJCW1hai0+Zmlyc3Rf ZnJlZV9taW5vciA9IG1pbm9yOworCisgICAgICBvdXQ6CisJdXBfd3JpdGUoJl9kZXZfbG9jayk7 Cit9CisKK3N0YXRpYyB2b2lkIF9fYWxsb2NfbWlub3Ioc3RydWN0IG1ham9yX2RldGFpbHMgKm1h aiwgdW5zaWduZWQgaW50IG1pbm9yLAorCQkJICBzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQpCit7 CisJbWFqLT5tZHNbbWlub3JdID0gbWQ7CisJbWQtPmRldiA9IG1rX2tkZXYobWFqLT5tYWpvciwg bWlub3IpOworCW1hai0+bnJfZnJlZV9taW5vcnMtLTsKKworCWlmIChtYWotPnRyYW5zaWVudCAm JiAhbWFqLT5ucl9mcmVlX21pbm9ycykKKwkJbGlzdF9kZWxfaW5pdCgmbWFqLT50cmFuc2llbnRf bGlzdCk7Cit9CisKKy8qCisgKiBTZWUgaWYgcmVxdWVzdGVkIGtkZXZfdCBpcyBhdmFpbGFibGUu CisgKi8KK3N0YXRpYyBpbnQgc3BlY2lmaWNfZGV2KGtkZXZfdCBkZXYsIHN0cnVjdCBtYXBwZWRf ZGV2aWNlICptZCkKK3sKKwlpbnQgciA9IDA7CisJdW5zaWduZWQgaW50IG1ham9yID0gbWFqb3Io ZGV2KTsKKwl1bnNpZ25lZCBpbnQgbWlub3IgPSBtaW5vcihkZXYpOworCXN0cnVjdCBtYWpvcl9k ZXRhaWxzICptYWo7CisKKwlpZiAoIW1ham9yIHx8IChtYWpvciA+IE1BWF9CTEtERVYpIHx8ICht aW5vciA+PSBNQVhfTUlOT1JTKSkgeworCQlETVdBUk4oImRldmljZSBudW1iZXIgcmVxdWVzdGVk IG91dCBvZiByYW5nZSAoJWQsICVkKSIsCisJCSAgICAgICBtYWpvciwgbWlub3IpOworCQlyZXR1 cm4gLUVJTlZBTDsKKwl9CisKKwlkb3duX3dyaXRlKCZfZGV2X2xvY2spOworCW1haiA9IF9tYWpv cnNbbWFqb3JdOworCisJLyogUmVnaXN0ZXIgcmVxdWVzdGVkIG1ham9yPyAqLworCWlmICghbWFq KSB7CisJCXIgPSBfX2FsbG9jX21ham9yKG1ham9yLCAmbWFqKTsKKwkJaWYgKHIpCisJCQlnb3Rv IG91dDsKKworCQltYWpvciA9IG1hai0+bWFqb3I7CisJfQorCisJaWYgKG1hai0+bWRzW21pbm9y XSkgeworCQlyID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisKKwlfX2FsbG9jX21pbm9yKG1h aiwgbWlub3IsIG1kKTsKKworICAgICAgb3V0OgorCXVwX3dyaXRlKCZfZGV2X2xvY2spOworCisJ cmV0dXJuIHI7Cit9CisKKy8qCisgKiBGaW5kIGZpcnN0IHVudXNlZCBkZXZpY2UgbnVtYmVyLCBy ZXF1ZXN0aW5nIGEgbmV3IG1ham9yIG51bWJlciBpZiByZXF1aXJlZC4KKyAqLworc3RhdGljIGlu dCBmaXJzdF9mcmVlX2RldihzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQpCit7CisJaW50IHIgPSAw OworCXN0cnVjdCBtYWpvcl9kZXRhaWxzICptYWo7CisKKwlkb3duX3dyaXRlKCZfZGV2X2xvY2sp OworCisJaWYgKGxpc3RfZW1wdHkoJl90cmFuc2llbnRzX2ZyZWUpKSB7CisJCXIgPSBfX2FsbG9j X21ham9yKDAsICZtYWopOworCQlpZiAocikKKwkJCWdvdG8gb3V0OworCX0gZWxzZQorCQltYWog PSBsaXN0X2VudHJ5KF90cmFuc2llbnRzX2ZyZWUubmV4dCwgc3RydWN0IG1ham9yX2RldGFpbHMs CisJCQkJIHRyYW5zaWVudF9saXN0KTsKKworCXdoaWxlIChtYWotPm1kc1ttYWotPmZpcnN0X2Zy ZWVfbWlub3IrK10pCisJCTsKKworCV9fYWxsb2NfbWlub3IobWFqLCBtYWotPmZpcnN0X2ZyZWVf bWlub3IgLSAxLCBtZCk7CisKKyAgICAgIG91dDoKKwl1cF93cml0ZSgmX2Rldl9sb2NrKTsKKwor CXJldHVybiByOworfQorCitzdGF0aWMgc3RydWN0IG1hcHBlZF9kZXZpY2UgKmdldF9rZGV2KGtk ZXZfdCBkZXYpCit7CisJc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kOworCXN0cnVjdCBtYWpvcl9k ZXRhaWxzICptYWo7CisKKwlkb3duX3JlYWQoJl9kZXZfbG9jayk7CisJbWFqID0gX21ham9yc1tt YWpvcihkZXYpXTsKKwlpZiAoIW1haikgeworCQltZCA9IE5VTEw7CisJCWdvdG8gb3V0OworCX0K KwltZCA9IG1hai0+bWRzW21pbm9yKGRldildOworCWlmIChtZCkKKwkJZG1fZ2V0KG1kKTsKKyAg ICAgIG91dDoKKwl1cF9yZWFkKCZfZGV2X2xvY2spOworCisJcmV0dXJuIG1kOworfQorCisvKi0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tCisgKiBpbml0L2V4aXQgY29kZQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgX19pbml0IGlu dCBsb2NhbF9pbml0KHZvaWQpCit7CisJaW5pdF9yd3NlbSgmX2Rldl9sb2NrKTsKKworCS8qIGFs bG9jYXRlIGEgc2xhYiBmb3IgdGhlIGRtX2lvcyAqLworCV9pb19jYWNoZSA9IGttZW1fY2FjaGVf Y3JlYXRlKCJkbSBpbyIsCisJCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBkbV9pbyksIDAsIDAsIE5V TEwsIE5VTEwpOworCisJaWYgKCFfaW9fY2FjaGUpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0 dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGxvY2FsX2V4aXQodm9pZCkKK3sKKwlrbWVtX2NhY2hl X2Rlc3Ryb3koX2lvX2NhY2hlKTsKKwlmcmVlX2FsbF9tYWpvcnMoKTsKKworCURNSU5GTygiY2xl YW5lZCB1cCIpOworfQorCisvKgorICogV2UgaGF2ZSBhIGxvdCBvZiBpbml0L2V4aXQgZnVuY3Rp b25zLCBzbyBpdCBzZWVtcyBlYXNpZXIgdG8KKyAqIHN0b3JlIHRoZW0gaW4gYW4gYXJyYXkuICBU aGUgZGlzcG9zYWJsZSBtYWNybyAneHgnCisgKiBleHBhbmRzIGEgcHJlZml4IGludG8gYSBwYWly IG9mIGZ1bmN0aW9uIG5hbWVzLgorICovCitzdGF0aWMgc3RydWN0IHsKKwlpbnQgKCppbml0KSAo dm9pZCk7CisJdm9pZCAoKmV4aXQpICh2b2lkKTsKKworfSBfaW5pdHNbXSA9IHsKKyNkZWZpbmUg eHgobikge24gIyMgX2luaXQsIG4gIyMgX2V4aXR9LAorCXh4KGxvY2FsKQorCXh4KGtjb3B5ZCkK Kwl4eChkbV90YXJnZXQpCisJeHgoZG1fbGluZWFyKQorCXh4KGRtX3N0cmlwZSkKKwl4eChkbV9z bmFwc2hvdCkKKwl4eChkbV9pbnRlcmZhY2UpCisjdW5kZWYgeHgKK307CisKK3N0YXRpYyBpbnQg X19pbml0IGRtX2luaXQodm9pZCkKK3sKKwljb25zdCBpbnQgY291bnQgPSBBUlJBWV9TSVpFKF9p bml0cyk7CisKKwlpbnQgciwgaTsKKworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJ CXIgPSBfaW5pdHNbaV0uaW5pdCgpOworCQlpZiAocikKKwkJCWdvdG8gYmFkOworCX0KKworCXJl dHVybiAwOworCisgICAgICBiYWQ6CisJd2hpbGUgKGktLSkKKwkJX2luaXRzW2ldLmV4aXQoKTsK KworCXJldHVybiByOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZG1fZXhpdCh2b2lkKQorewor CWludCBpID0gQVJSQVlfU0laRShfaW5pdHMpOworCisJd2hpbGUgKGktLSkKKwkJX2luaXRzW2ld LmV4aXQoKTsKK30KKworLyoKKyAqIEJsb2NrIGRldmljZSBmdW5jdGlvbnMKKyAqLworc3RhdGlj IGludCBkbV9ibGtfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkK K3sKKwlzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQ7CisKKwltZCA9IGdldF9rZGV2KGlub2RlLT5p X3JkZXYpOworCWlmICghbWQpCisJCXJldHVybiAtRU5YSU87CisKKwlyZXR1cm4gMDsKK30KKwor c3RhdGljIGludCBkbV9ibGtfY2xvc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUg KmZpbGUpCit7CisJc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kOworCisJbWQgPSBnZXRfa2Rldihp bm9kZS0+aV9yZGV2KTsKKwlkbV9wdXQobWQpOwkJLyogcHV0IHRoZSByZWZlcmVuY2UgZ2FpbmVk IGJ5IGRtX2Jsa19vcGVuICovCisJZG1fcHV0KG1kKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGlj IGlubGluZSBzdHJ1Y3QgZG1faW8gKmFsbG9jX2lvKHN0cnVjdCBtYXBwZWRfZGV2aWNlICptZCkK K3sKKwlyZXR1cm4gbWVtcG9vbF9hbGxvYyhtZC0+aW9fcG9vbCwgR0ZQX05PSU8pOworfQorCitz dGF0aWMgaW5saW5lIHZvaWQgZnJlZV9pbyhzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQsIHN0cnVj dCBkbV9pbyAqaW8pCit7CisJbWVtcG9vbF9mcmVlKGlvLCBtZC0+aW9fcG9vbCk7Cit9CisKK3N0 YXRpYyBpbmxpbmUgc3RydWN0IGRlZmVycmVkX2lvICphbGxvY19kZWZlcnJlZCh2b2lkKQorewor CXJldHVybiBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZGVmZXJyZWRfaW8pLCBHRlBfTk9JTyk7Cit9 CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmcmVlX2RlZmVycmVkKHN0cnVjdCBkZWZlcnJlZF9pbyAq ZGkpCit7CisJa2ZyZWUoZGkpOworfQorCitzdGF0aWMgaW5saW5lIHNlY3Rvcl90IHZvbHVtZV9z aXplKGtkZXZfdCBkZXYpCit7CisJcmV0dXJuIGJsa19zaXplW21ham9yKGRldildW21pbm9yKGRl dildIDw8IDE7Cit9CisKKy8qIEZJWE1FOiBjaGVjayB0aGlzICovCitzdGF0aWMgaW50IGRtX2Js a19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCXVuc2ln bmVkIGludCBjb21tYW5kLCB1bnNpZ25lZCBsb25nIGEpCit7CisJa2Rldl90IGRldiA9IGlub2Rl LT5pX3JkZXY7CisJbG9uZyBzaXplOworCisJc3dpdGNoIChjb21tYW5kKSB7CisJY2FzZSBCTEtS T1NFVDoKKwljYXNlIEJMS1JPR0VUOgorCWNhc2UgQkxLUkFTRVQ6CisJY2FzZSBCTEtSQUdFVDoK KwljYXNlIEJMS0ZMU0JVRjoKKwljYXNlIEJMS1NTWkdFVDoKKwkJLy9jYXNlIEJMS1JSUEFSVDog LyogUmUtcmVhZCBwYXJ0aXRpb24gdGFibGVzICovCisJCS8vY2FzZSBCTEtQRzoKKwljYXNlIEJM S0VMVkdFVDoKKwljYXNlIEJMS0VMVlNFVDoKKwljYXNlIEJMS0JTWkdFVDoKKwljYXNlIEJMS0JT WlNFVDoKKwkJcmV0dXJuIGJsa19pb2N0bChkZXYsIGNvbW1hbmQsIGEpOworCQlicmVhazsKKwor CWNhc2UgQkxLR0VUU0laRToKKwkJc2l6ZSA9IHZvbHVtZV9zaXplKGRldik7CisJCWlmIChjb3B5 X3RvX3VzZXIoKHZvaWQgKikgYSwgJnNpemUsIHNpemVvZihsb25nKSkpCisJCQlyZXR1cm4gLUVG QVVMVDsKKwkJYnJlYWs7CisKKwljYXNlIEJMS0dFVFNJWkU2NDoKKwkJc2l6ZSA9IHZvbHVtZV9z aXplKGRldik7CisJCWlmIChwdXRfdXNlcigodTY0KSAoKHU2NCkgc2l6ZSkgPDwgOSwgKHU2NCAq KSBhKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlicmVhazsKKworCWNhc2UgQkxLUlJQQVJUOgor CQlyZXR1cm4gLUVOT1RUWTsKKworCWNhc2UgTFZfQk1BUDoKKwkJcmV0dXJuIGRtX3VzZXJfYm1h cChpbm9kZSwgKHN0cnVjdCBsdl9ibWFwICopIGEpOworCisJZGVmYXVsdDoKKwkJRE1XQVJOKCJ1 bmtub3duIGJsb2NrIGlvY3RsIDB4JXgiLCBjb21tYW5kKTsKKwkJcmV0dXJuIC1FTk9UVFk7CisJ fQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBBZGQgdGhlIGJ1ZmZlciB0byB0aGUgbGlzdCBv ZiBkZWZlcnJlZCBpby4KKyAqLworc3RhdGljIGludCBxdWV1ZV9pbyhzdHJ1Y3QgbWFwcGVkX2Rl dmljZSAqbWQsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGludCBydykKK3sKKwlzdHJ1Y3QgZGVm ZXJyZWRfaW8gKmRpOworCisJZGkgPSBhbGxvY19kZWZlcnJlZCgpOworCWlmICghZGkpCisJCXJl dHVybiAtRU5PTUVNOworCisJZG93bl93cml0ZSgmbWQtPmxvY2spOworCisJaWYgKCF0ZXN0X2Jp dChETUZfQkxPQ0tfSU8sICZtZC0+ZmxhZ3MpKSB7CisJCXVwX3dyaXRlKCZtZC0+bG9jayk7CisJ CWZyZWVfZGVmZXJyZWQoZGkpOworCQlyZXR1cm4gMTsKKwl9CisKKwlkaS0+YmggPSBiaDsKKwlk aS0+cncgPSBydzsKKwlkaS0+bmV4dCA9IG1kLT5kZWZlcnJlZDsKKwltZC0+ZGVmZXJyZWQgPSBk aTsKKworCXVwX3dyaXRlKCZtZC0+bG9jayk7CisJcmV0dXJuIDA7CQkvKiBkZWZlcnJlZCBzdWNj ZXNzZnVsbHkgKi8KK30KKworLyoKKyAqIGJoLT5iX2VuZF9pbyByb3V0aW5lIHRoYXQgZGVjcmVt ZW50cyB0aGUgcGVuZGluZyBjb3VudAorICogYW5kIHRoZW4gY2FsbHMgdGhlIG9yaWdpbmFsIGJo LT5iX2VuZF9pbyBmbi4KKyAqLworc3RhdGljIHZvaWQgZGVjX3BlbmRpbmcoc3RydWN0IGJ1ZmZl cl9oZWFkICpiaCwgaW50IHVwdG9kYXRlKQoreworCWludCByOworCXN0cnVjdCBkbV9pbyAqaW8g PSBiaC0+Yl9wcml2YXRlOworCWRtX2VuZGlvX2ZuIGVuZGlvID0gaW8tPnRpLT50eXBlLT5lbmRf aW87CisKKwlpZiAoZW5kaW8pIHsKKwkJciA9IGVuZGlvKGlvLT50aSwgYmgsIGlvLT5ydywgdXB0 b2RhdGUgPyAwIDogLUVJTywKKwkJCSAgJmlvLT5tYXBfY29udGV4dCk7CisJCWlmIChyIDwgMCkK KwkJCXVwdG9kYXRlID0gMDsKKworCQllbHNlIGlmIChyID4gMCkKKwkJCS8qIHRoZSB0YXJnZXQg d2FudHMgYW5vdGhlciBzaG90IGF0IHRoZSBpbyAqLworCQkJcmV0dXJuOworCX0KKworCWlmIChh dG9taWNfZGVjX2FuZF90ZXN0KCZpby0+bWQtPnBlbmRpbmcpKQorCQkvKiBudWRnZSBhbnlvbmUg d2FpdGluZyBvbiBzdXNwZW5kIHF1ZXVlICovCisJCXdha2VfdXAoJmlvLT5tZC0+d2FpdCk7CisK KwliaC0+Yl9lbmRfaW8gPSBpby0+ZW5kX2lvOworCWJoLT5iX3ByaXZhdGUgPSBpby0+Y29udGV4 dDsKKwlmcmVlX2lvKGlvLT5tZCwgaW8pOworCisJYmgtPmJfZW5kX2lvKGJoLCB1cHRvZGF0ZSk7 Cit9CisKKy8qCisgKiBEbyB0aGUgYmggbWFwcGluZyBmb3IgYSBnaXZlbiBsZWFmCisgKi8KK3N0 YXRpYyBpbmxpbmUgaW50IF9fbWFwX2J1ZmZlcihzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQsIGlu dCBydywKKwkJCSAgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCBzdHJ1Y3QgZG1faW8gKmlv KQoreworCXN0cnVjdCBkbV90YXJnZXQgKnRpOworCisJaWYgKCFtZC0+bWFwKQorCQlyZXR1cm4g LUVJTlZBTDsKKworCXRpID0gZG1fdGFibGVfZmluZF90YXJnZXQobWQtPm1hcCwgYmgtPmJfcnNl Y3Rvcik7CisJaWYgKCF0aS0+dHlwZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBob29rIHRo ZSBlbmQgaW8gcmVxdWVzdCBmbiAqLworCWF0b21pY19pbmMoJm1kLT5wZW5kaW5nKTsKKwlpby0+ bWQgPSBtZDsKKwlpby0+dGkgPSB0aTsKKwlpby0+cncgPSBydzsKKwlpby0+ZW5kX2lvID0gYmgt PmJfZW5kX2lvOworCWlvLT5jb250ZXh0ID0gYmgtPmJfcHJpdmF0ZTsKKwliaC0+Yl9lbmRfaW8g PSBkZWNfcGVuZGluZzsKKwliaC0+Yl9wcml2YXRlID0gaW87CisKKwlyZXR1cm4gdGktPnR5cGUt Pm1hcCh0aSwgYmgsIHJ3LCAmaW8tPm1hcF9jb250ZXh0KTsKK30KKworLyoKKyAqIENoZWNrcyB0 byBzZWUgaWYgd2Ugc2hvdWxkIGJlIGRlZmVycmluZyBpbywgaWYgc28gaXQgcXVldWVzIGl0Cisg KiBhbmQgcmV0dXJucyAxLgorICovCitzdGF0aWMgaW5saW5lIGludCBfX2RlZmVycmluZyhzdHJ1 Y3QgbWFwcGVkX2RldmljZSAqbWQsIGludCBydywKKwkJCSAgICAgIHN0cnVjdCBidWZmZXJfaGVh ZCAqYmgpCit7CisJaW50IHI7CisKKwkvKgorCSAqIElmIHdlJ3JlIHN1c3BlbmRlZCB3ZSBoYXZl IHRvIHF1ZXVlIHRoaXMgaW8gZm9yIGxhdGVyLgorCSAqLworCXdoaWxlICh0ZXN0X2JpdChETUZf QkxPQ0tfSU8sICZtZC0+ZmxhZ3MpKSB7CisJCXVwX3JlYWQoJm1kLT5sb2NrKTsKKworCQkvKgor CQkgKiBUaGVyZSdzIG5vIHBvaW50IGRlZmVycmluZyBhIHJlYWQgYWhlYWQKKwkJICogcmVxdWVz dCwganVzdCBkcm9wIGl0LgorCQkgKi8KKwkJaWYgKHJ3ID09IFJFQURBKSB7CisJCQlkb3duX3Jl YWQoJm1kLT5sb2NrKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisKKwkJciA9IHF1ZXVlX2lvKG1k LCBiaCwgcncpOworCQlkb3duX3JlYWQoJm1kLT5sb2NrKTsKKworCQlpZiAociA8IDApCisJCQly ZXR1cm4gcjsKKworCQlpZiAociA9PSAwKQorCQkJcmV0dXJuIDE7CS8qIGRlZmVycmVkIHN1Y2Nl c3NmdWxseSAqLworCisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZG1fcmVxdWVz dChyZXF1ZXN0X3F1ZXVlX3QgKnEsIGludCBydywgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sK KwlpbnQgcjsKKwlzdHJ1Y3QgZG1faW8gKmlvOworCXN0cnVjdCBtYXBwZWRfZGV2aWNlICptZDsK KworCW1kID0gZ2V0X2tkZXYoYmgtPmJfcmRldik7CisJaWYgKCFtZCkgeworCQlidWZmZXJfSU9f ZXJyb3IoYmgpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpbyA9IGFsbG9jX2lvKG1kKTsKKwlkb3du X3JlYWQoJm1kLT5sb2NrKTsKKworCXIgPSBfX2RlZmVycmluZyhtZCwgcncsIGJoKTsKKwlpZiAo ciA8IDApCisJCWdvdG8gYmFkOworCisJZWxzZSBpZiAoIXIpIHsKKwkJLyogbm90IGRlZmVycmlu ZyAqLworCQlyID0gX19tYXBfYnVmZmVyKG1kLCBydywgYmgsIGlvKTsKKwkJaWYgKHIgPCAwKQor CQkJZ290byBiYWQ7CisJfSBlbHNlCisJCXIgPSAwOworCisJdXBfcmVhZCgmbWQtPmxvY2spOwor CWRtX3B1dChtZCk7CisJcmV0dXJuIHI7CisKKyAgICAgIGJhZDoKKwlidWZmZXJfSU9fZXJyb3Io YmgpOworCXVwX3JlYWQoJm1kLT5sb2NrKTsKKwlkbV9wdXQobWQpOworCXJldHVybiAwOworfQor CitzdGF0aWMgaW50IGNoZWNrX2Rldl9zaXplKGtkZXZfdCBkZXYsIHVuc2lnbmVkIGxvbmcgYmxv Y2spCit7CisJdW5zaWduZWQgaW50IG1ham9yID0gbWFqb3IoZGV2KTsKKwl1bnNpZ25lZCBpbnQg bWlub3IgPSBtaW5vcihkZXYpOworCisJLyogRklYTUU6IGNoZWNrIHRoaXMgKi8KKwl1bnNpZ25l ZCBsb25nIG1heF9zZWN0b3IgPSAoYmxrX3NpemVbbWFqb3JdW21pbm9yXSA8PCAxKSArIDE7CisJ dW5zaWduZWQgbG9uZyBzZWN0b3IgPSAoYmxvY2sgKyAxKSAqIChibGtzaXplX3NpemVbbWFqb3Jd W21pbm9yXSA+PiA5KTsKKworCXJldHVybiAoc2VjdG9yID4gbWF4X3NlY3RvcikgPyAwIDogMTsK K30KKworLyoKKyAqIENyZWF0ZXMgYSBkdW1teSBidWZmZXIgaGVhZCBhbmQgbWFwcyBpdCAoZm9y IGxpbG8pLgorICovCitzdGF0aWMgaW50IF9fYm1hcChzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQs IGtkZXZfdCBkZXYsIHVuc2lnbmVkIGxvbmcgYmxvY2ssCisJCSAga2Rldl90ICpyX2RldiwgdW5z aWduZWQgbG9uZyAqcl9ibG9jaykKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgYmg7CisJc3RydWN0 IGRtX3RhcmdldCAqdGk7CisJdW5pb24gbWFwX2luZm8gbWFwX2NvbnRleHQ7CisJaW50IHI7CisK KwlpZiAodGVzdF9iaXQoRE1GX0JMT0NLX0lPLCAmbWQtPmZsYWdzKSkgeworCQlyZXR1cm4gLUVQ RVJNOworCX0KKworCWlmICghY2hlY2tfZGV2X3NpemUoZGV2LCBibG9jaykpIHsKKwkJcmV0dXJu IC1FSU5WQUw7CisJfQorCisJaWYgKCFtZC0+bWFwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8q IHNldHVwIGR1bW15IGJoICovCisJbWVtc2V0KCZiaCwgMCwgc2l6ZW9mKGJoKSk7CisJYmguYl9i bG9ja25yID0gYmxvY2s7CisJYmguYl9kZXYgPSBiaC5iX3JkZXYgPSBkZXY7CisJYmguYl9zaXpl ID0gYmxrc2l6ZV9zaXplW21ham9yKGRldildW21pbm9yKGRldildOworCWJoLmJfcnNlY3RvciA9 IGJsb2NrICogKGJoLmJfc2l6ZSA+PiA5KTsKKworCS8qIGZpbmQgdGFyZ2V0ICovCisJdGkgPSBk bV90YWJsZV9maW5kX3RhcmdldChtZC0+bWFwLCBiaC5iX3JzZWN0b3IpOworCisJLyogZG8gdGhl IG1hcHBpbmcgKi8KKwlyID0gdGktPnR5cGUtPm1hcCh0aSwgJmJoLCBSRUFELCAmbWFwX2NvbnRl eHQpOworCXRpLT50eXBlLT5lbmRfaW8odGksICZiaCwgUkVBRCwgMCwgJm1hcF9jb250ZXh0KTsK KworCWlmICghcikgeworCQkqcl9kZXYgPSBiaC5iX3JkZXY7CisJCSpyX2Jsb2NrID0gYmguYl9y c2VjdG9yIC8gKGJoLmJfc2l6ZSA+PiA5KTsKKwl9CisKKwlyZXR1cm4gcjsKK30KKworLyoKKyAq IE1hcnNoYWxzIGFyZ3VtZW50cyBhbmQgcmVzdWx0cyBiZXR3ZWVuIHVzZXIgYW5kIGtlcm5lbCBz cGFjZS4KKyAqLworc3RhdGljIGludCBkbV91c2VyX2JtYXAoc3RydWN0IGlub2RlICppbm9kZSwg c3RydWN0IGx2X2JtYXAgKmx2YikKK3sKKwlzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQ7CisJdW5z aWduZWQgbG9uZyBibG9jaywgcl9ibG9jazsKKwlrZGV2X3Qgcl9kZXY7CisJaW50IHI7CisKKwlp ZiAoZ2V0X3VzZXIoYmxvY2ssICZsdmItPmx2X2Jsb2NrKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisK KwltZCA9IGdldF9rZGV2KGlub2RlLT5pX3JkZXYpOworCWlmICghbWQpCisJCXJldHVybiAtRU5Y SU87CisKKwlkb3duX3JlYWQoJm1kLT5sb2NrKTsKKwlyID0gX19ibWFwKG1kLCBpbm9kZS0+aV9y ZGV2LCBibG9jaywgJnJfZGV2LCAmcl9ibG9jayk7CisJdXBfcmVhZCgmbWQtPmxvY2spOworCWRt X3B1dChtZCk7CisKKwlpZiAoIXIgJiYgKHB1dF91c2VyKGtkZXZfdF90b19ucihyX2RldiksICZs dmItPmx2X2RldikgfHwKKwkJICAgcHV0X3VzZXIocl9ibG9jaywgJmx2Yi0+bHZfYmxvY2spKSkK KwkJciA9IC1FRkFVTFQ7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIHZvaWQgZnJlZV9tZChz dHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQpCit7CisJZnJlZV9kZXYobWQtPmRldik7CisJbWVtcG9v bF9kZXN0cm95KG1kLT5pb19wb29sKTsKKwlrZnJlZShtZCk7Cit9CisKKy8qCisgKiBBbGxvY2F0 ZSBhbmQgaW5pdGlhbGlzZSBhIGJsYW5rIGRldmljZSB3aXRoIGEgZ2l2ZW4gbWlub3IuCisgKi8K K3N0YXRpYyBzdHJ1Y3QgbWFwcGVkX2RldmljZSAqYWxsb2NfbWQoa2Rldl90IGRldikKK3sKKwlp bnQgcjsKKwlzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQgPSBrbWFsbG9jKHNpemVvZigqbWQpLCBH RlBfS0VSTkVMKTsKKworCWlmICghbWQpIHsKKwkJRE1XQVJOKCJ1bmFibGUgdG8gYWxsb2NhdGUg ZGV2aWNlLCBvdXQgb2YgbWVtb3J5LiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwltZW1zZXQo bWQsIDAsIHNpemVvZigqbWQpKTsKKworCS8qIEFsbG9jYXRlIHN1aXRhYmxlIGRldmljZSBudW1i ZXIgKi8KKwlpZiAoIWRldikKKwkJciA9IGZpcnN0X2ZyZWVfZGV2KG1kKTsKKwllbHNlCisJCXIg PSBzcGVjaWZpY19kZXYoZGV2LCBtZCk7CisKKwlpZiAocikgeworCQlrZnJlZShtZCk7CisJCXJl dHVybiBOVUxMOworCX0KKworCW1kLT5pb19wb29sID0gbWVtcG9vbF9jcmVhdGUoTUlOX0lPUywg bWVtcG9vbF9hbGxvY19zbGFiLAorCQkJCSAgICAgbWVtcG9vbF9mcmVlX3NsYWIsIF9pb19jYWNo ZSk7CisJaWYgKCFtZC0+aW9fcG9vbCkgeworCQlmcmVlX21kKG1kKTsKKwkJa2ZyZWUobWQpOwor CQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpbml0X3J3c2VtKCZtZC0+bG9jayk7CisJYXRvbWljX3Nl dCgmbWQtPmhvbGRlcnMsIDEpOworCWF0b21pY19zZXQoJm1kLT5wZW5kaW5nLCAwKTsKKwlpbml0 X3dhaXRxdWV1ZV9oZWFkKCZtZC0+d2FpdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmbWQtPmV2 ZW50cSk7CisKKwlyZXR1cm4gbWQ7Cit9CisKKy8qCisgKiBUaGUgaGFyZHNlY3Qgc2l6ZSBmb3Ig YSBtYXBwZWQgZGV2aWNlIGlzIHRoZSBsYXJnZXN0IGhhcmRzZWN0IHNpemUKKyAqIGZyb20gdGhl IGRldmljZXMgaXQgbWFwcyBvbnRvLgorICovCitzdGF0aWMgaW50IF9fZmluZF9oYXJkc2VjdF9z aXplKHN0cnVjdCBsaXN0X2hlYWQgKmRldmljZXMpCit7CisJaW50IHJlc3VsdCA9IDUxMiwgc2l6 ZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CisKKwlsaXN0X2Zvcl9lYWNoICh0bXAsIGRldmlj ZXMpIHsKKwkJc3RydWN0IGRtX2RldiAqZGQgPSBsaXN0X2VudHJ5KHRtcCwgc3RydWN0IGRtX2Rl diwgbGlzdCk7CisJCXNpemUgPSBnZXRfaGFyZHNlY3Rfc2l6ZShkZC0+ZGV2KTsKKwkJaWYgKHNp emUgPiByZXN1bHQpCisJCQlyZXN1bHQgPSBzaXplOworCX0KKworCXJldHVybiByZXN1bHQ7Cit9 CisKKy8qCisgKiBCaW5kIGEgdGFibGUgdG8gdGhlIGRldmljZS4KKyAqLworc3RhdGljIHZvaWQg ZXZlbnRfY2FsbGJhY2sodm9pZCAqY29udGV4dCkKK3sKKwlzdHJ1Y3QgbWFwcGVkX2RldmljZSAq bWQgPSAoc3RydWN0IG1hcHBlZF9kZXZpY2UgKikgY29udGV4dDsKKworCWRvd25fd3JpdGUoJm1k LT5sb2NrKTsKKwltZC0+ZXZlbnRfbnIrKzsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJm1kLT5l dmVudHEpOworCXVwX3dyaXRlKCZtZC0+bG9jayk7Cit9CisKK3N0YXRpYyBpbnQgX19iaW5kKHN0 cnVjdCBtYXBwZWRfZGV2aWNlICptZCwgc3RydWN0IGRtX3RhYmxlICp0KQoreworCXVuc2lnbmVk IGludCBtaW5vciA9IG1pbm9yKG1kLT5kZXYpOworCXVuc2lnbmVkIGludCBtYWpvciA9IG1ham9y KG1kLT5kZXYpOworCW1kLT5tYXAgPSB0OworCisJLyogaW4gayAqLworCWJsa19zaXplW21ham9y XVttaW5vcl0gPSBkbV90YWJsZV9nZXRfc2l6ZSh0KSA+PiAxOworCWJsa3NpemVfc2l6ZVttYWpv cl1bbWlub3JdID0gQkxPQ0tfU0laRTsKKwloYXJkc2VjdF9zaXplW21ham9yXVttaW5vcl0gPQor CSAgICBfX2ZpbmRfaGFyZHNlY3Rfc2l6ZShkbV90YWJsZV9nZXRfZGV2aWNlcyh0KSk7CisJcmVn aXN0ZXJfZGlzayhOVUxMLCBtZC0+ZGV2LCAxLCAmZG1fYmxrX2RvcHMsIGJsa19zaXplW21ham9y XVttaW5vcl0pOworCisJZG1fdGFibGVfZXZlbnRfY2FsbGJhY2sobWQtPm1hcCwgZXZlbnRfY2Fs bGJhY2ssIG1kKTsKKwlkbV90YWJsZV9nZXQodCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2 b2lkIF9fdW5iaW5kKHN0cnVjdCBtYXBwZWRfZGV2aWNlICptZCkKK3sKKwl1bnNpZ25lZCBpbnQg bWlub3IgPSBtaW5vcihtZC0+ZGV2KTsKKwl1bnNpZ25lZCBpbnQgbWFqb3IgPSBtYWpvcihtZC0+ ZGV2KTsKKworCWlmIChtZC0+bWFwKSB7CisJCWRtX3RhYmxlX2V2ZW50X2NhbGxiYWNrKG1kLT5t YXAsIE5VTEwsIE5VTEwpOworCQlkbV90YWJsZV9wdXQobWQtPm1hcCk7CisJCW1kLT5tYXAgPSBO VUxMOworCisJfQorCisJYmxrX3NpemVbbWFqb3JdW21pbm9yXSA9IDA7CisJYmxrc2l6ZV9zaXpl W21ham9yXVttaW5vcl0gPSAwOworCWhhcmRzZWN0X3NpemVbbWFqb3JdW21pbm9yXSA9IDA7Cit9 CisKKy8qCisgKiBDb25zdHJ1Y3RvciBmb3IgYSBuZXcgZGV2aWNlLgorICovCitpbnQgZG1fY3Jl YXRlKGtkZXZfdCBkZXYsIHN0cnVjdCBtYXBwZWRfZGV2aWNlICoqcmVzdWx0KQoreworCXN0cnVj dCBtYXBwZWRfZGV2aWNlICptZDsKKworCW1kID0gYWxsb2NfbWQoZGV2KTsKKwlpZiAoIW1kKQor CQlyZXR1cm4gLUVOWElPOworCisJX191bmJpbmQobWQpOwkvKiBFbnN1cmUgemVybyBkZXZpY2Ug c2l6ZSAqLworCisJKnJlc3VsdCA9IG1kOworCXJldHVybiAwOworfQorCit2b2lkIGRtX2dldChz dHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQpCit7CisJYXRvbWljX2luYygmbWQtPmhvbGRlcnMpOwor fQorCit2b2lkIGRtX3B1dChzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQpCit7CisJaWYgKGF0b21p Y19kZWNfYW5kX3Rlc3QoJm1kLT5ob2xkZXJzKSkgeworCQlpZiAobWQtPm1hcCkKKwkJCWRtX3Rh YmxlX3N1c3BlbmRfdGFyZ2V0cyhtZC0+bWFwKTsKKwkJX191bmJpbmQobWQpOworCQlmcmVlX21k KG1kKTsKKwl9Cit9CisKKy8qCisgKiBSZXF1ZXVlIHRoZSBkZWZlcnJlZCBpbyBieSBjYWxsaW5n IGdlbmVyaWNfbWFrZV9yZXF1ZXN0LgorICovCitzdGF0aWMgdm9pZCBmbHVzaF9kZWZlcnJlZF9p byhzdHJ1Y3QgZGVmZXJyZWRfaW8gKmMpCit7CisJc3RydWN0IGRlZmVycmVkX2lvICpuOworCisJ d2hpbGUgKGMpIHsKKwkJbiA9IGMtPm5leHQ7CisJCWdlbmVyaWNfbWFrZV9yZXF1ZXN0KGMtPnJ3 LCBjLT5iaCk7CisJCWZyZWVfZGVmZXJyZWQoYyk7CisJCWMgPSBuOworCX0KK30KKworLyoKKyAq IFN3YXAgaW4gYSBuZXcgdGFibGUgKGRlc3Ryb3lpbmcgb2xkIG9uZSkuCisgKi8KK2ludCBkbV9z d2FwX3RhYmxlKHN0cnVjdCBtYXBwZWRfZGV2aWNlICptZCwgc3RydWN0IGRtX3RhYmxlICp0YWJs ZSkKK3sKKwlpbnQgcjsKKworCWRvd25fd3JpdGUoJm1kLT5sb2NrKTsKKworCS8qCisJICogVGhl IGRldmljZSBtdXN0IGJlIHN1c3BlbmRlZCwgb3IgaGF2ZSBubyB0YWJsZSBib3VuZCB5ZXQuCisJ ICovCisJaWYgKG1kLT5tYXAgJiYgIXRlc3RfYml0KERNRl9TVVNQRU5ERUQsICZtZC0+ZmxhZ3Mp KSB7CisJCXVwX3dyaXRlKCZtZC0+bG9jayk7CisJCXJldHVybiAtRVBFUk07CisJfQorCisJX191 bmJpbmQobWQpOworCXIgPSBfX2JpbmQobWQsIHRhYmxlKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7 CisKKwl1cF93cml0ZSgmbWQtPmxvY2spOworCXJldHVybiAwOworfQorCisvKgorICogV2UgbmVl ZCB0byBiZSBhYmxlIHRvIGNoYW5nZSBhIG1hcHBpbmcgdGFibGUgdW5kZXIgYSBtb3VudGVkCisg KiBmaWxlc3lzdGVtLiAgRm9yIGV4YW1wbGUgd2UgbWlnaHQgd2FudCB0byBtb3ZlIHNvbWUgZGF0 YSBpbgorICogdGhlIGJhY2tncm91bmQuICBCZWZvcmUgdGhlIHRhYmxlIGNhbiBiZSBzd2FwcGVk IHdpdGgKKyAqIGRtX2JpbmRfdGFibGUsIGRtX3N1c3BlbmQgbXVzdCBiZSBjYWxsZWQgdG8gZmx1 c2ggYW55IGluCisgKiBmbGlnaHQgaW8gYW5kIGVuc3VyZSB0aGF0IGFueSBmdXJ0aGVyIGlvIGdl dHMgZGVmZXJyZWQuCisgKi8KK2ludCBkbV9zdXNwZW5kKHN0cnVjdCBtYXBwZWRfZGV2aWNlICpt ZCkKK3sKKwlpbnQgciA9IDA7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisK Kwlkb3duX3dyaXRlKCZtZC0+bG9jayk7CisKKwkvKgorCSAqIEZpcnN0IHdlIHNldCB0aGUgQkxP Q0tfSU8gZmxhZyBzbyBubyBtb3JlIGlvcyB3aWxsIGJlCisJICogbWFwcGVkLgorCSAqLworCWlm ICh0ZXN0X2JpdChETUZfQkxPQ0tfSU8sICZtZC0+ZmxhZ3MpKSB7CisJCXVwX3dyaXRlKCZtZC0+ bG9jayk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNldF9iaXQoRE1GX0JMT0NLX0lPLCAm bWQtPmZsYWdzKTsKKwlhZGRfd2FpdF9xdWV1ZSgmbWQtPndhaXQsICZ3YWl0KTsKKwl1cF93cml0 ZSgmbWQtPmxvY2spOworCisJLyoKKwkgKiBUaGVuIHdlIHdhaXQgZm9yIHRoZSBhbHJlYWR5IG1h cHBlZCBpb3MgdG8KKwkgKiBjb21wbGV0ZS4KKwkgKi8KKwlydW5fdGFza19xdWV1ZSgmdHFfZGlz ayk7CisJd2hpbGUgKDEpIHsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxF KTsKKworCQlpZiAoIWF0b21pY19yZWFkKCZtZC0+cGVuZGluZykgfHwgc2lnbmFsX3BlbmRpbmco Y3VycmVudCkpCisJCQlicmVhazsKKworCQlzY2hlZHVsZSgpOworCX0KKwlzZXRfY3VycmVudF9z dGF0ZShUQVNLX1JVTk5JTkcpOworCisJZG93bl93cml0ZSgmbWQtPmxvY2spOworCXJlbW92ZV93 YWl0X3F1ZXVlKCZtZC0+d2FpdCwgJndhaXQpOworCisJLyogZGlkIHdlIGZsdXNoIGV2ZXJ5dGhp bmcgPyAqLworCWlmIChhdG9taWNfcmVhZCgmbWQtPnBlbmRpbmcpKSB7CisJCWNsZWFyX2JpdChE TUZfQkxPQ0tfSU8sICZtZC0+ZmxhZ3MpOworCQlyID0gLUVJTlRSOworCX0gZWxzZSB7CisJCXNl dF9iaXQoRE1GX1NVU1BFTkRFRCwgJm1kLT5mbGFncyk7CisJCWlmIChtZC0+bWFwKQorCQkJZG1f dGFibGVfc3VzcGVuZF90YXJnZXRzKG1kLT5tYXApOworCX0KKwl1cF93cml0ZSgmbWQtPmxvY2sp OworCisJcmV0dXJuIHI7Cit9CisKK2ludCBkbV9yZXN1bWUoc3RydWN0IG1hcHBlZF9kZXZpY2Ug Km1kKQoreworCXN0cnVjdCBkZWZlcnJlZF9pbyAqZGVmOworCisJZG93bl93cml0ZSgmbWQtPmxv Y2spOworCWlmICghdGVzdF9iaXQoRE1GX1NVU1BFTkRFRCwgJm1kLT5mbGFncykpIHsKKwkJdXBf d3JpdGUoJm1kLT5sb2NrKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKG1kLT5tYXAp CisJCWRtX3RhYmxlX3Jlc3VtZV90YXJnZXRzKG1kLT5tYXApOworCisJY2xlYXJfYml0KERNRl9T VVNQRU5ERUQsICZtZC0+ZmxhZ3MpOworCWNsZWFyX2JpdChETUZfQkxPQ0tfSU8sICZtZC0+Zmxh Z3MpOworCWRlZiA9IG1kLT5kZWZlcnJlZDsKKwltZC0+ZGVmZXJyZWQgPSBOVUxMOworCXVwX3dy aXRlKCZtZC0+bG9jayk7CisKKwlmbHVzaF9kZWZlcnJlZF9pbyhkZWYpOworCXJ1bl90YXNrX3F1 ZXVlKCZ0cV9kaXNrKTsKKworCXJldHVybiAwOworfQorCitzdHJ1Y3QgZG1fdGFibGUgKmRtX2dl dF90YWJsZShzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQpCit7CisJc3RydWN0IGRtX3RhYmxlICp0 OworCisJZG93bl9yZWFkKCZtZC0+bG9jayk7CisJdCA9IG1kLT5tYXA7CisJaWYgKHQpCisJCWRt X3RhYmxlX2dldCh0KTsKKwl1cF9yZWFkKCZtZC0+bG9jayk7CisKKwlyZXR1cm4gdDsKK30KKwor LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLQorICogRXZlbnQgbm90aWZpY2F0aW9uLgorICotLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordWludDMyX3Qg ZG1fZ2V0X2V2ZW50X25yKHN0cnVjdCBtYXBwZWRfZGV2aWNlICptZCkKK3sKKwl1aW50MzJfdCBy OworCisJZG93bl9yZWFkKCZtZC0+bG9jayk7CisJciA9IG1kLT5ldmVudF9ucjsKKwl1cF9yZWFk KCZtZC0+bG9jayk7CisKKwlyZXR1cm4gcjsKK30KKworaW50IGRtX2FkZF93YWl0X3F1ZXVlKHN0 cnVjdCBtYXBwZWRfZGV2aWNlICptZCwgd2FpdF9xdWV1ZV90ICp3cSwKKwkJICAgICAgdWludDMy X3QgZXZlbnRfbnIpCit7CisJZG93bl93cml0ZSgmbWQtPmxvY2spOworCWlmIChldmVudF9uciAh PSBtZC0+ZXZlbnRfbnIpIHsKKwkJdXBfd3JpdGUoJm1kLT5sb2NrKTsKKwkJcmV0dXJuIDE7CisJ fQorCisJYWRkX3dhaXRfcXVldWUoJm1kLT5ldmVudHEsIHdxKTsKKwl1cF93cml0ZSgmbWQtPmxv Y2spOworCisJcmV0dXJuIDA7Cit9CisKK2NvbnN0IGNoYXIgKmRtX2tkZXZuYW1lKGtkZXZfdCBk ZXYpCit7CisJc3RhdGljIGNoYXIgYnVmZmVyWzMyXTsKKwlzcHJpbnRmKGJ1ZmZlciwgIiUwM2Q6 JTAzZCIsIE1BSk9SKGRldiksIE1JTk9SKGRldikpOworCXJldHVybiBidWZmZXI7Cit9CisKK3Zv aWQgZG1fcmVtb3ZlX3dhaXRfcXVldWUoc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kLCB3YWl0X3F1 ZXVlX3QgKndxKQoreworCWRvd25fd3JpdGUoJm1kLT5sb2NrKTsKKwlyZW1vdmVfd2FpdF9xdWV1 ZSgmbWQtPmV2ZW50cSwgd3EpOworCXVwX3dyaXRlKCZtZC0+bG9jayk7Cit9CisKK2tkZXZfdCBk bV9rZGV2KHN0cnVjdCBtYXBwZWRfZGV2aWNlICptZCkKK3sKKwlrZGV2X3QgZGV2OworCisJZG93 bl9yZWFkKCZtZC0+bG9jayk7CisJZGV2ID0gbWQtPmRldjsKKwl1cF9yZWFkKCZtZC0+bG9jayk7 CisKKwlyZXR1cm4gZGV2OworfQorCitpbnQgZG1fc3VzcGVuZGVkKHN0cnVjdCBtYXBwZWRfZGV2 aWNlICptZCkKK3sKKwlyZXR1cm4gdGVzdF9iaXQoRE1GX1NVU1BFTkRFRCwgJm1kLT5mbGFncyk7 Cit9CisKK3N0cnVjdCBibG9ja19kZXZpY2Vfb3BlcmF0aW9ucyBkbV9ibGtfZG9wcyA9IHsKKwku b3BlbiA9IGRtX2Jsa19vcGVuLAorCS5yZWxlYXNlID0gZG1fYmxrX2Nsb3NlLAorCS5pb2N0bCA9 IGRtX2Jsa19pb2N0bCwKKwkub3duZXIgPSBUSElTX01PRFVMRQorfTsKKworLyoKKyAqIG1vZHVs ZSBob29rcworICovCittb2R1bGVfaW5pdChkbV9pbml0KTsKK21vZHVsZV9leGl0KGRtX2V4aXQp OworCitNT0RVTEVfREVTQ1JJUFRJT04oRE1fTkFNRSAiIGRyaXZlciIpOworTU9EVUxFX0FVVEhP UigiSm9lIFRob3JuYmVyIDx0aG9ybmJlckBzaXN0aW5hLmNvbT4iKTsKK01PRFVMRV9MSUNFTlNF KCJHUEwiKTsKKworRVhQT1JUX1NZTUJPTChkbV9rZGV2bmFtZSk7Ci0tLSBkaWZmL2RyaXZlcnMv bWQvZG0uaAkxOTcwLTAxLTAxIDAxOjAwOjAwLjAwMDAwMDAwMCArMDEwMAorKysgc291cmNlL2Ry aXZlcnMvbWQvZG0uaAkyMDAzLTA4LTI2IDE0OjIxOjM1LjAwMDAwMDAwMCArMDEwMApAQCAtMCww ICsxLDE3NSBAQAorLyoKKyAqIEludGVybmFsIGhlYWRlciBmaWxlIGZvciBkZXZpY2UgbWFwcGVy CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyIFNpc3RpbmEgU29mdHdhcmUKKyAqCisg KiBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIExHUEwuCisgKi8KKworI2lmbmRlZiBE TV9JTlRFUk5BTF9ICisjZGVmaW5lIERNX0lOVEVSTkFMX0gKKworI2luY2x1ZGUgPGxpbnV4L2Zz Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLW1hcHBlci5oPgorI2luY2x1ZGUgPGxpbnV4L2xp c3QuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKworI2RlZmluZSBETV9OQU1FICJkZXZp Y2UtbWFwcGVyIgorI2RlZmluZSBETVdBUk4oZiwgeC4uLikgcHJpbnRrKEtFUk5fV0FSTklORyBE TV9OQU1FICI6ICIgZiAiXG4iICwgIyMgeCkKKyNkZWZpbmUgRE1FUlIoZiwgeC4uLikgcHJpbnRr KEtFUk5fRVJSIERNX05BTUUgIjogIiBmICJcbiIgLCAjIyB4KQorI2RlZmluZSBETUlORk8oZiwg eC4uLikgcHJpbnRrKEtFUk5fSU5GTyBETV9OQU1FICI6ICIgZiAiXG4iICwgIyMgeCkKKworLyoK KyAqIEZJWE1FOiBJIHRoaW5rIHRoaXMgc2hvdWxkIGJlIHdpdGggdGhlIGRlZmluaXRpb24gb2Yg c2VjdG9yX3QKKyAqIGluIHR5cGVzLmguCisgKi8KKyNpZmRlZiBDT05GSUdfTEJECisjZGVmaW5l IFNFQ1RPUl9GT1JNQVQgIiVMdSIKKyNlbHNlCisjZGVmaW5lIFNFQ1RPUl9GT1JNQVQgIiVsdSIK KyNlbmRpZgorCisjZGVmaW5lIFNFQ1RPUl9TSElGVCA5CisjZGVmaW5lIFNFQ1RPUl9TSVpFICgx IDw8IFNFQ1RPUl9TSElGVCkKKworZXh0ZXJuIHN0cnVjdCBibG9ja19kZXZpY2Vfb3BlcmF0aW9u cyBkbV9ibGtfZG9wczsKKworLyoKKyAqIExpc3Qgb2YgZGV2aWNlcyB0aGF0IGEgbWV0YWRldmlj ZSB1c2VzIGFuZCBzaG91bGQgb3Blbi9jbG9zZS4KKyAqLworc3RydWN0IGRtX2RldiB7CisJc3Ry dWN0IGxpc3RfaGVhZCBsaXN0OworCisJYXRvbWljX3QgY291bnQ7CisJaW50IG1vZGU7CisJa2Rl dl90IGRldjsKKwlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2OworfTsKKworc3RydWN0IGRtX3Rh YmxlOworc3RydWN0IG1hcHBlZF9kZXZpY2U7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZ1bmN0aW9ucyBm b3IgbWFuaXB1bGF0aW5nIGEgc3RydWN0IG1hcHBlZF9kZXZpY2UuCisgKiBEcm9wIHRoZSByZWZl cmVuY2Ugd2l0aCBkbV9wdXQgd2hlbiB5b3UgZmluaXNoIHdpdGggdGhlIG9iamVjdC4KKyAqLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tKi8KK2ludCBkbV9jcmVhdGUoa2Rldl90IGRldiwgc3RydWN0IG1hcHBlZF9kZXZpY2UgKipt ZCk7CisKKy8qCisgKiBSZWZlcmVuY2UgY291bnRpbmcgZm9yIG1kLgorICovCit2b2lkIGRtX2dl dChzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQpOwordm9pZCBkbV9wdXQoc3RydWN0IG1hcHBlZF9k ZXZpY2UgKm1kKTsKKworLyoKKyAqIEEgZGV2aWNlIGNhbiBzdGlsbCBiZSB1c2VkIHdoaWxlIHN1 c3BlbmRlZCwgYnV0IEkvTyBpcyBkZWZlcnJlZC4KKyAqLworaW50IGRtX3N1c3BlbmQoc3RydWN0 IG1hcHBlZF9kZXZpY2UgKm1kKTsKK2ludCBkbV9yZXN1bWUoc3RydWN0IG1hcHBlZF9kZXZpY2Ug Km1kKTsKKworLyoKKyAqIFRoZSBkZXZpY2UgbXVzdCBiZSBzdXNwZW5kZWQgYmVmb3JlIGNhbGxp bmcgdGhpcyBtZXRob2QuCisgKi8KK2ludCBkbV9zd2FwX3RhYmxlKHN0cnVjdCBtYXBwZWRfZGV2 aWNlICptZCwgc3RydWN0IGRtX3RhYmxlICp0KTsKKworLyoKKyAqIERyb3AgYSByZWZlcmVuY2Ug b24gdGhlIHRhYmxlIHdoZW4geW91J3ZlIGZpbmlzaGVkIHdpdGggdGhlCisgKiByZXN1bHQuCisg Ki8KK3N0cnVjdCBkbV90YWJsZSAqZG1fZ2V0X3RhYmxlKHN0cnVjdCBtYXBwZWRfZGV2aWNlICpt ZCk7CisKKy8qCisgKiBFdmVudCBmdW5jdGlvbnMuCisgKi8KK3VpbnQzMl90IGRtX2dldF9ldmVu dF9ucihzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQpOworaW50IGRtX2FkZF93YWl0X3F1ZXVlKHN0 cnVjdCBtYXBwZWRfZGV2aWNlICptZCwgd2FpdF9xdWV1ZV90ICp3cSwKKwkJICAgICAgdWludDMy X3QgZXZlbnRfbnIpOwordm9pZCBkbV9yZW1vdmVfd2FpdF9xdWV1ZShzdHJ1Y3QgbWFwcGVkX2Rl dmljZSAqbWQsIHdhaXRfcXVldWVfdCAqd3EpOworCisvKgorICogSW5mbyBmdW5jdGlvbnMuCisg Ki8KK2tkZXZfdCBkbV9rZGV2KHN0cnVjdCBtYXBwZWRfZGV2aWNlICptZCk7CitpbnQgZG1fc3Vz cGVuZGVkKHN0cnVjdCBtYXBwZWRfZGV2aWNlICptZCk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZ1bmN0 aW9ucyBmb3IgbWFuaXB1bGF0aW5nIGEgdGFibGUuICBUYWJsZXMgYXJlIGFsc28gcmVmZXJlbmNl CisgKiBjb3VudGVkLgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaW50IGRtX3RhYmxlX2NyZWF0ZShzdHJ1Y3QgZG1f dGFibGUgKipyZXN1bHQsIGludCBtb2RlKTsKKwordm9pZCBkbV90YWJsZV9nZXQoc3RydWN0IGRt X3RhYmxlICp0KTsKK3ZvaWQgZG1fdGFibGVfcHV0KHN0cnVjdCBkbV90YWJsZSAqdCk7CisKK2lu dCBkbV90YWJsZV9hZGRfdGFyZ2V0KHN0cnVjdCBkbV90YWJsZSAqdCwgY29uc3QgY2hhciAqdHlw ZSwKKwkJCXNlY3Rvcl90IHN0YXJ0LAlzZWN0b3JfdCBsZW4sIGNoYXIgKnBhcmFtcyk7CitpbnQg ZG1fdGFibGVfY29tcGxldGUoc3RydWN0IGRtX3RhYmxlICp0KTsKK3ZvaWQgZG1fdGFibGVfZXZl bnRfY2FsbGJhY2soc3RydWN0IGRtX3RhYmxlICp0LAorCQkJICAgICB2b2lkICgqZm4pKHZvaWQg KiksIHZvaWQgKmNvbnRleHQpOwordm9pZCBkbV90YWJsZV9ldmVudChzdHJ1Y3QgZG1fdGFibGUg KnQpOworc2VjdG9yX3QgZG1fdGFibGVfZ2V0X3NpemUoc3RydWN0IGRtX3RhYmxlICp0KTsKK3N0 cnVjdCBkbV90YXJnZXQgKmRtX3RhYmxlX2dldF90YXJnZXQoc3RydWN0IGRtX3RhYmxlICp0LCB1 bnNpZ25lZCBpbnQgaW5kZXgpOworc3RydWN0IGRtX3RhcmdldCAqZG1fdGFibGVfZmluZF90YXJn ZXQoc3RydWN0IGRtX3RhYmxlICp0LCBzZWN0b3JfdCBzZWN0b3IpOwordW5zaWduZWQgaW50IGRt X3RhYmxlX2dldF9udW1fdGFyZ2V0cyhzdHJ1Y3QgZG1fdGFibGUgKnQpOworc3RydWN0IGxpc3Rf aGVhZCAqZG1fdGFibGVfZ2V0X2RldmljZXMoc3RydWN0IGRtX3RhYmxlICp0KTsKK2ludCBkbV90 YWJsZV9nZXRfbW9kZShzdHJ1Y3QgZG1fdGFibGUgKnQpOwordm9pZCBkbV90YWJsZV9zdXNwZW5k X3RhcmdldHMoc3RydWN0IGRtX3RhYmxlICp0KTsKK3ZvaWQgZG1fdGFibGVfcmVzdW1lX3Rhcmdl dHMoc3RydWN0IGRtX3RhYmxlICp0KTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQSByZWdpc3RyeSBvZiB0 YXJnZXQgdHlwZXMuCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpbnQgZG1fdGFyZ2V0X2luaXQodm9pZCk7Cit2b2lk IGRtX3RhcmdldF9leGl0KHZvaWQpOworc3RydWN0IHRhcmdldF90eXBlICpkbV9nZXRfdGFyZ2V0 X3R5cGUoY29uc3QgY2hhciAqbmFtZSk7Cit2b2lkIGRtX3B1dF90YXJnZXRfdHlwZShzdHJ1Y3Qg dGFyZ2V0X3R5cGUgKnQpOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFVzZWZ1bCBpbmxpbmVzLgorICot LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0qLworc3RhdGljIGlubGluZSBpbnQgYXJyYXlfdG9vX2JpZyh1bnNpZ25lZCBsb25nIGZp eGVkLCB1bnNpZ25lZCBsb25nIG9iaiwKKwkJCQl1bnNpZ25lZCBsb25nIG51bSkKK3sKKwlyZXR1 cm4gKG51bSA+IChVTE9OR19NQVggLSBmaXhlZCkgLyBvYmopOworfQorCisvKgorICogY2VpbGlu ZyhuIC8gc2l6ZSkgKiBzaXplCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBkbV9y b3VuZF91cCh1bnNpZ25lZCBsb25nIG4sIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwl1bnNpZ25l ZCBsb25nIHIgPSBuICUgc2l6ZTsKKwlyZXR1cm4gbiArIChyID8gKHNpemUgLSByKSA6IDApOwor fQorCisvKgorICogQ2VpbGluZyhuIC8gc2l6ZSkKKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25l ZCBsb25nIGRtX2Rpdl91cCh1bnNpZ25lZCBsb25nIG4sIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sK KwlyZXR1cm4gZG1fcm91bmRfdXAobiwgc2l6ZSkgLyBzaXplOworfQorCitjb25zdCBjaGFyICpk bV9rZGV2bmFtZShrZGV2X3QgZGV2KTsKKworLyoKKyAqIFRoZSBkZXZpY2UtbWFwcGVyIGNhbiBi ZSBkcml2ZW4gdGhyb3VnaCBvbmUgb2YgdHdvIGludGVyZmFjZXM7CisgKiBpb2N0bCBvciBmaWxl c3lzdGVtLCBkZXBlbmRpbmcgd2hpY2ggcGF0Y2ggeW91IGhhdmUgYXBwbGllZC4KKyAqLworaW50 IGRtX2ludGVyZmFjZV9pbml0KHZvaWQpOwordm9pZCBkbV9pbnRlcmZhY2VfZXhpdCh2b2lkKTsK KworLyoKKyAqIFRhcmdldHMgZm9yIGxpbmVhciBhbmQgc3RyaXBlZCBtYXBwaW5ncworICovCitp bnQgZG1fbGluZWFyX2luaXQodm9pZCk7Cit2b2lkIGRtX2xpbmVhcl9leGl0KHZvaWQpOworCitp bnQgZG1fc3RyaXBlX2luaXQodm9pZCk7Cit2b2lkIGRtX3N0cmlwZV9leGl0KHZvaWQpOworCitp bnQgZG1fc25hcHNob3RfaW5pdCh2b2lkKTsKK3ZvaWQgZG1fc25hcHNob3RfZXhpdCh2b2lkKTsK KworI2VuZGlmCi0tLSBkaWZmL2RyaXZlcnMvbWQva2NvcHlkLmMJMTk3MC0wMS0wMSAwMTowMDow MC4wMDAwMDAwMDAgKzAxMDAKKysrIHNvdXJjZS9kcml2ZXJzL21kL2tjb3B5ZC5jCTIwMDMtMDgt MjYgMTM6NTk6MDQuMDAwMDAwMDAwICswMTAwCkBAIC0wLDAgKzEsNjUwIEBACisvKgorICogQ29w eXJpZ2h0IChDKSAyMDAyIFNpc3RpbmEgU29mdHdhcmUgKFVLKSBMaW1pdGVkLgorICoKKyAqIFRo aXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMLgorICovCisKKyNpbmNsdWRlIDxhc20v YXRvbWljLmg+CisKKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9j b25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UtbWFwcGVyLmg+CisjaW5jbHVkZSA8bGlu dXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5o PgorI2luY2x1ZGUgPGxpbnV4L2xvY2tzLmg+CisjaW5jbHVkZSA8bGludXgvbWVtcG9vbC5oPgor I2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNp bmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorCisjaW5j bHVkZSAia2NvcHlkLmgiCisjaW5jbHVkZSAiZG0tZGFlbW9uLmgiCisKKy8qIEZJWE1FOiB0aGlz IGlzIG9ubHkgbmVlZGVkIGZvciB0aGUgRE1FUlIgbWFjcm9zICovCisjaW5jbHVkZSAiZG0uaCIK Kworc3RhdGljIHN0cnVjdCBkbV9kYWVtb24gX2tjb3B5ZDsKKworLyotLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRWFj aCBrY29weWQgY2xpZW50IGhhcyBpdHMgb3duIGxpdHRsZSBwb29sIG9mIHByZWFsbG9jYXRlZAor ICogcGFnZXMgZm9yIGtjb3B5ZCBpby4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0cnVjdCBrY29weWRfY2xpZW50 IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisKKwlzcGlubG9ja190IGxvY2s7CisJc3RydWN0 IGxpc3RfaGVhZCBwYWdlczsKKwl1bnNpZ25lZCBpbnQgbnJfcGFnZXM7CisJdW5zaWduZWQgaW50 IG5yX2ZyZWVfcGFnZXM7Cit9OworCitzdGF0aWMgaW5saW5lIHZvaWQgX19wdXNoX3BhZ2Uoc3Ry dWN0IGtjb3B5ZF9jbGllbnQgKmtjLCBzdHJ1Y3QgcGFnZSAqcCkKK3sKKwlsaXN0X2FkZCgmcC0+ bGlzdCwgJmtjLT5wYWdlcyk7CisJa2MtPm5yX2ZyZWVfcGFnZXMrKzsKK30KKworc3RhdGljIGlu bGluZSBzdHJ1Y3QgcGFnZSAqX19wb3BfcGFnZShzdHJ1Y3Qga2NvcHlkX2NsaWVudCAqa2MpCit7 CisJc3RydWN0IHBhZ2UgKnA7CisKKwlwID0gbGlzdF9lbnRyeShrYy0+cGFnZXMubmV4dCwgc3Ry dWN0IHBhZ2UsIGxpc3QpOworCWxpc3RfZGVsKCZwLT5saXN0KTsKKwlrYy0+bnJfZnJlZV9wYWdl cy0tOworCisJcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBpbnQga2NvcHlkX2dldF9wYWdlcyhzdHJ1 Y3Qga2NvcHlkX2NsaWVudCAqa2MsCisJCQkgICAgdW5zaWduZWQgaW50IG5yLCBzdHJ1Y3QgbGlz dF9oZWFkICpwYWdlcykKK3sKKwlzdHJ1Y3QgcGFnZSAqcDsKKwlJTklUX0xJU1RfSEVBRChwYWdl cyk7CisKKwlzcGluX2xvY2soJmtjLT5sb2NrKTsKKwlpZiAoa2MtPm5yX2ZyZWVfcGFnZXMgPCBu cikgeworCQlzcGluX3VubG9jaygma2MtPmxvY2spOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisK Kwl3aGlsZSAobnItLSkgeworCQlwID0gX19wb3BfcGFnZShrYyk7CisJCWxpc3RfYWRkKCZwLT5s aXN0LCBwYWdlcyk7CisJfQorCXNwaW5fdW5sb2NrKCZrYy0+bG9jayk7CisKKwlyZXR1cm4gMDsK K30KKworc3RhdGljIHZvaWQga2NvcHlkX3B1dF9wYWdlcyhzdHJ1Y3Qga2NvcHlkX2NsaWVudCAq a2MsIHN0cnVjdCBsaXN0X2hlYWQgKnBhZ2VzKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnRtcCwg KnRtcDI7CisKKwlzcGluX2xvY2soJmtjLT5sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX3NhZmUgKHRt cCwgdG1wMiwgcGFnZXMpCisJCV9fcHVzaF9wYWdlKGtjLCBsaXN0X2VudHJ5KHRtcCwgc3RydWN0 IHBhZ2UsIGxpc3QpKTsKKwlzcGluX3VubG9jaygma2MtPmxvY2spOworfQorCisvKgorICogVGhl c2UgdGhyZWUgZnVuY3Rpb25zIHJlc2l6ZSB0aGUgcGFnZSBwb29sLgorICovCitzdGF0aWMgdm9p ZCByZWxlYXNlX3BhZ2VzKHN0cnVjdCBsaXN0X2hlYWQgKnBhZ2VzKQoreworCXN0cnVjdCBwYWdl ICpwOworCXN0cnVjdCBsaXN0X2hlYWQgKnRtcCwgKnRtcDI7CisKKwlsaXN0X2Zvcl9lYWNoX3Nh ZmUgKHRtcCwgdG1wMiwgcGFnZXMpIHsKKwkJcCA9IGxpc3RfZW50cnkodG1wLCBzdHJ1Y3QgcGFn ZSwgbGlzdCk7CisJCVVubG9ja1BhZ2UocCk7CisJCV9fZnJlZV9wYWdlKHApOworCX0KK30KKwor c3RhdGljIGludCBjbGllbnRfYWxsb2NfcGFnZXMoc3RydWN0IGtjb3B5ZF9jbGllbnQgKmtjLCB1 bnNpZ25lZCBpbnQgbnIpCit7CisJdW5zaWduZWQgaW50IGk7CisJc3RydWN0IHBhZ2UgKnA7CisJ TElTVF9IRUFEKG5ldyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnI7IGkrKykgeworCQlwID0gYWxs b2NfcGFnZShHRlBfS0VSTkVMKTsKKwkJaWYgKCFwKSB7CisJCQlyZWxlYXNlX3BhZ2VzKCZuZXcp OworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKworCQlMb2NrUGFnZShwKTsKKwkJbGlzdF9hZGQo JnAtPmxpc3QsICZuZXcpOworCX0KKworCWtjb3B5ZF9wdXRfcGFnZXMoa2MsICZuZXcpOworCWtj LT5ucl9wYWdlcyArPSBucjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY2xpZW50X2Zy ZWVfcGFnZXMoc3RydWN0IGtjb3B5ZF9jbGllbnQgKmtjKQoreworCUJVR19PTihrYy0+bnJfZnJl ZV9wYWdlcyAhPSBrYy0+bnJfcGFnZXMpOworCXJlbGVhc2VfcGFnZXMoJmtjLT5wYWdlcyk7CisJ a2MtPm5yX2ZyZWVfcGFnZXMgPSBrYy0+bnJfcGFnZXMgPSAwOworfQorCisvKi0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisg KiBrY29weWRfam9icyBuZWVkIHRvIGJlIGFsbG9jYXRlZCBieSB0aGUgKmNsaWVudHMqIG9mIGtj b3B5ZCwKKyAqIGZvciB0aGlzIHJlYXNvbiB3ZSB1c2UgYSBtZW1wb29sIHRvIHByZXZlbnQgdGhl IGNsaWVudCBmcm9tCisgKiBldmVyIGhhdmluZyB0byBkbyBpbyAod2hpY2ggY291bGQgY2F1c2Ug YSBkZWFkbG9jaykuCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdHJ1Y3Qga2NvcHlkX2pvYiB7CisJc3RydWN0IGtj b3B5ZF9jbGllbnQgKmtjOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwl1bnNpZ25lZCBpbnQg ZmxhZ3M7CisKKwkvKgorCSAqIEVycm9yIHN0YXRlIG9mIHRoZSBqb2IuCisJICovCisJaW50IHJl YWRfZXJyOworCXVuc2lnbmVkIGludCB3cml0ZV9lcnI7CisKKwkvKgorCSAqIEVpdGhlciBSRUFE IG9yIFdSSVRFCisJICovCisJaW50IHJ3OworCXN0cnVjdCBpb19yZWdpb24gc291cmNlOworCisJ LyoKKwkgKiBUaGUgZGVzdGluYXRpb25zIGZvciB0aGUgdHJhbnNmZXIuCisJICovCisJdW5zaWdu ZWQgaW50IG51bV9kZXN0czsKKwlzdHJ1Y3QgaW9fcmVnaW9uIGRlc3RzW0tDT1BZRF9NQVhfUkVH SU9OU107CisKKwlzZWN0b3JfdCBvZmZzZXQ7CisJdW5zaWduZWQgaW50IG5yX3BhZ2VzOworCXN0 cnVjdCBsaXN0X2hlYWQgcGFnZXM7CisKKwkvKgorCSAqIFNldCB0aGlzIHRvIGVuc3VyZSB5b3Ug YXJlIG5vdGlmaWVkIHdoZW4gdGhlIGpvYiBoYXMKKwkgKiBjb21wbGV0ZWQuICAnY29udGV4dCcg aXMgZm9yIGNhbGxiYWNrIHRvIHVzZS4KKwkgKi8KKwlrY29weWRfbm90aWZ5X2ZuIGZuOworCXZv aWQgKmNvbnRleHQ7CisKKwkvKgorCSAqIFRoZXNlIGZpZWxkcyBhcmUgb25seSB1c2VkIGlmIHRo ZSBqb2IgaGFzIGJlZW4gc3BsaXQKKwkgKiBpbnRvIG1vcmUgbWFuYWdlYWJsZSBwYXJ0cy4KKwkg Ki8KKwlzdHJ1Y3Qgc2VtYXBob3JlIGxvY2s7CisJYXRvbWljX3Qgc3ViX2pvYnM7CisJc2VjdG9y X3QgcHJvZ3Jlc3M7Cit9OworCisvKiBGSVhNRTogdGhpcyBzaG91bGQgc2NhbGUgd2l0aCB0aGUg bnVtYmVyIG9mIHBhZ2VzICovCisjZGVmaW5lIE1JTl9KT0JTIDUxMgorCitzdGF0aWMga21lbV9j YWNoZV90ICpfam9iX2NhY2hlID0gTlVMTDsKK3N0YXRpYyBtZW1wb29sX3QgKl9qb2JfcG9vbCA9 IE5VTEw7CisKKy8qCisgKiBXZSBtYWludGFpbiB0aHJlZSBsaXN0cyBvZiBqb2JzOgorICoKKyAq IGkpICAgam9icyB3YWl0aW5nIGZvciBwYWdlcworICogaWkpICBqb2JzIHRoYXQgaGF2ZSBwYWdl cywgYW5kIGFyZSB3YWl0aW5nIGZvciB0aGUgaW8gdG8gYmUgaXNzdWVkLgorICogaWlpKSBqb2Jz IHRoYXQgaGF2ZSBjb21wbGV0ZWQuCisgKgorICogQWxsIHRocmVlIG9mIHRoZXNlIGFyZSBwcm90 ZWN0ZWQgYnkgam9iX2xvY2suCisgKi8KK3N0YXRpYyBzcGlubG9ja190IF9qb2JfbG9jayA9IFNQ SU5fTE9DS19VTkxPQ0tFRDsKKworc3RhdGljIExJU1RfSEVBRChfY29tcGxldGVfam9icyk7Citz dGF0aWMgTElTVF9IRUFEKF9pb19qb2JzKTsKK3N0YXRpYyBMSVNUX0hFQUQoX3BhZ2VzX2pvYnMp OworCitzdGF0aWMgaW50IGpvYnNfaW5pdCh2b2lkKQoreworCUlOSVRfTElTVF9IRUFEKCZfY29t cGxldGVfam9icyk7CisJSU5JVF9MSVNUX0hFQUQoJl9pb19qb2JzKTsKKwlJTklUX0xJU1RfSEVB RCgmX3BhZ2VzX2pvYnMpOworCisJX2pvYl9jYWNoZSA9IGttZW1fY2FjaGVfY3JlYXRlKCJrY29w eWQtam9icyIsCisJCQkJICAgICAgIHNpemVvZihzdHJ1Y3Qga2NvcHlkX2pvYiksCisJCQkJICAg ICAgIF9fYWxpZ25vZl9fKHN0cnVjdCBrY29weWRfam9iKSwKKwkJCQkgICAgICAgMCwgTlVMTCwg TlVMTCk7CisJaWYgKCFfam9iX2NhY2hlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCV9qb2JfcG9v bCA9IG1lbXBvb2xfY3JlYXRlKE1JTl9KT0JTLCBtZW1wb29sX2FsbG9jX3NsYWIsCisJCQkJICAg bWVtcG9vbF9mcmVlX3NsYWIsIF9qb2JfY2FjaGUpOworCWlmICghX2pvYl9wb29sKSB7CisJCWtt ZW1fY2FjaGVfZGVzdHJveShfam9iX2NhY2hlKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJ cmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGpvYnNfZXhpdCh2b2lkKQoreworCUJVR19PTigh bGlzdF9lbXB0eSgmX2NvbXBsZXRlX2pvYnMpKTsKKwlCVUdfT04oIWxpc3RfZW1wdHkoJl9pb19q b2JzKSk7CisJQlVHX09OKCFsaXN0X2VtcHR5KCZfcGFnZXNfam9icykpOworCisJbWVtcG9vbF9k ZXN0cm95KF9qb2JfcG9vbCk7CisJa21lbV9jYWNoZV9kZXN0cm95KF9qb2JfY2FjaGUpOworfQor CisvKgorICogRnVuY3Rpb25zIHRvIHB1c2ggYW5kIHBvcCBhIGpvYiBvbnRvIHRoZSBoZWFkIG9m IGEgZ2l2ZW4gam9iCisgKiBsaXN0LgorICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBrY29weWRf am9iICpwb3Aoc3RydWN0IGxpc3RfaGVhZCAqam9icykKK3sKKwlzdHJ1Y3Qga2NvcHlkX2pvYiAq am9iID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUo Jl9qb2JfbG9jaywgZmxhZ3MpOworCisJaWYgKCFsaXN0X2VtcHR5KGpvYnMpKSB7CisJCWpvYiA9 IGxpc3RfZW50cnkoam9icy0+bmV4dCwgc3RydWN0IGtjb3B5ZF9qb2IsIGxpc3QpOworCQlsaXN0 X2RlbCgmam9iLT5saXN0KTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmX2pvYl9sb2Nr LCBmbGFncyk7CisKKwlyZXR1cm4gam9iOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcHVzaChz dHJ1Y3QgbGlzdF9oZWFkICpqb2JzLCBzdHJ1Y3Qga2NvcHlkX2pvYiAqam9iKQoreworCXVuc2ln bmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmX2pvYl9sb2NrLCBmbGFncyk7 CisJbGlzdF9hZGRfdGFpbCgmam9iLT5saXN0LCBqb2JzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0 b3JlKCZfam9iX2xvY2ssIGZsYWdzKTsKK30KKworLyoKKyAqIFRoZXNlIHRocmVlIGZ1bmN0aW9u cyBwcm9jZXNzIDEgaXRlbSBmcm9tIHRoZSBjb3JyZXNwb25kaW5nCisgKiBqb2IgbGlzdC4KKyAq CisgKiBUaGV5IHJldHVybjoKKyAqIDwgMDogZXJyb3IKKyAqICAgMDogc3VjY2VzcworICogPiAw OiBjYW4ndCBwcm9jZXNzIHlldC4KKyAqLworc3RhdGljIGludCBydW5fY29tcGxldGVfam9iKHN0 cnVjdCBrY29weWRfam9iICpqb2IpCit7CisJdm9pZCAqY29udGV4dCA9IGpvYi0+Y29udGV4dDsK KwlpbnQgcmVhZF9lcnIgPSBqb2ItPnJlYWRfZXJyOworCXVuc2lnbmVkIGludCB3cml0ZV9lcnIg PSBqb2ItPndyaXRlX2VycjsKKwlrY29weWRfbm90aWZ5X2ZuIGZuID0gam9iLT5mbjsKKworCWtj b3B5ZF9wdXRfcGFnZXMoam9iLT5rYywgJmpvYi0+cGFnZXMpOworCW1lbXBvb2xfZnJlZShqb2Is IF9qb2JfcG9vbCk7CisJZm4ocmVhZF9lcnIsIHdyaXRlX2VyciwgY29udGV4dCk7CisJcmV0dXJu IDA7Cit9CisKK3N0YXRpYyB2b2lkIGNvbXBsZXRlX2lvKHVuc2lnbmVkIGludCBlcnJvciwgdm9p ZCAqY29udGV4dCkKK3sKKwlzdHJ1Y3Qga2NvcHlkX2pvYiAqam9iID0gKHN0cnVjdCBrY29weWRf am9iICopIGNvbnRleHQ7CisKKwlpZiAoZXJyb3IpIHsKKwkJaWYgKGpvYi0+cncgPT0gV1JJVEUp CisJCQlqb2ItPndyaXRlX2VyciAmPSBlcnJvcjsKKwkJZWxzZQorCQkJam9iLT5yZWFkX2VyciA9 IDE7CisKKwkJaWYgKCF0ZXN0X2JpdChLQ09QWURfSUdOT1JFX0VSUk9SLCAmam9iLT5mbGFncykp IHsKKwkJCXB1c2goJl9jb21wbGV0ZV9qb2JzLCBqb2IpOworCQkJZG1fZGFlbW9uX3dha2UoJl9r Y29weWQpOworCQkJcmV0dXJuOworCQl9CisJfQorCisJaWYgKGpvYi0+cncgPT0gV1JJVEUpCisJ CXB1c2goJl9jb21wbGV0ZV9qb2JzLCBqb2IpOworCisJZWxzZSB7CisJCWpvYi0+cncgPSBXUklU RTsKKwkJcHVzaCgmX2lvX2pvYnMsIGpvYik7CisJfQorCisJZG1fZGFlbW9uX3dha2UoJl9rY29w eWQpOworfQorCisvKgorICogUmVxdWVzdCBpbyBvbiBhcyBtYW55IGJ1ZmZlciBoZWFkcyBhcyB3 ZSBjYW4gY3VycmVudGx5IGdldCBmb3IKKyAqIGEgcGFydGljdWxhciBqb2IuCisgKi8KK3N0YXRp YyBpbnQgcnVuX2lvX2pvYihzdHJ1Y3Qga2NvcHlkX2pvYiAqam9iKQoreworCWludCByOworCisJ aWYgKGpvYi0+cncgPT0gUkVBRCkKKwkJciA9IGRtX2lvX2FzeW5jKDEsICZqb2ItPnNvdXJjZSwg am9iLT5ydywKKwkJCQlsaXN0X2VudHJ5KGpvYi0+cGFnZXMubmV4dCwgc3RydWN0IHBhZ2UsIGxp c3QpLAorCQkJCWpvYi0+b2Zmc2V0LCBjb21wbGV0ZV9pbywgam9iKTsKKworCWVsc2UKKwkJciA9 IGRtX2lvX2FzeW5jKGpvYi0+bnVtX2Rlc3RzLCBqb2ItPmRlc3RzLCBqb2ItPnJ3LAorCQkJCWxp c3RfZW50cnkoam9iLT5wYWdlcy5uZXh0LCBzdHJ1Y3QgcGFnZSwgbGlzdCksCisJCQkJam9iLT5v ZmZzZXQsIGNvbXBsZXRlX2lvLCBqb2IpOworCisJcmV0dXJuIHI7Cit9CisKKyNkZWZpbmUgU0VD VE9SU19QRVJfUEFHRSAoUEFHRV9TSVpFIC8gU0VDVE9SX1NJWkUpCitzdGF0aWMgaW50IHJ1bl9w YWdlc19qb2Ioc3RydWN0IGtjb3B5ZF9qb2IgKmpvYikKK3sKKwlpbnQgcjsKKworCWpvYi0+bnJf cGFnZXMgPSBkbV9kaXZfdXAoam9iLT5kZXN0c1swXS5jb3VudCArIGpvYi0+b2Zmc2V0LAorCQkJ CSAgU0VDVE9SU19QRVJfUEFHRSk7CisJciA9IGtjb3B5ZF9nZXRfcGFnZXMoam9iLT5rYywgam9i LT5ucl9wYWdlcywgJmpvYi0+cGFnZXMpOworCWlmICghcikgeworCQkvKiB0aGlzIGpvYiBpcyBy ZWFkeSBmb3IgaW8gKi8KKwkJcHVzaCgmX2lvX2pvYnMsIGpvYik7CisJCXJldHVybiAwOworCX0K KworCWlmIChyID09IC1FTk9NRU0pCisJCS8qIGNhbid0IGNvbXBsZXRlIG5vdyAqLworCQlyZXR1 cm4gMTsKKworCXJldHVybiByOworfQorCisvKgorICogUnVuIHRocm91Z2ggYSBsaXN0IGZvciBh cyBsb25nIGFzIHBvc3NpYmxlLiAgUmV0dXJucyB0aGUgY291bnQKKyAqIG9mIHN1Y2Nlc3NmdWwg am9icy4KKyAqLworc3RhdGljIGludCBwcm9jZXNzX2pvYnMoc3RydWN0IGxpc3RfaGVhZCAqam9i cywgaW50ICgqZm4pIChzdHJ1Y3Qga2NvcHlkX2pvYiAqKSkKK3sKKwlzdHJ1Y3Qga2NvcHlkX2pv YiAqam9iOworCWludCByLCBjb3VudCA9IDA7CisKKwl3aGlsZSAoKGpvYiA9IHBvcChqb2JzKSkp IHsKKworCQlyID0gZm4oam9iKTsKKworCQlpZiAociA8IDApIHsKKwkJCS8qIGVycm9yIHRoaXMg cm9ndWUgam9iICovCisJCQlpZiAoam9iLT5ydyA9PSBXUklURSkKKwkJCQlqb2ItPndyaXRlX2Vy ciA9ICh1bnNpZ25lZCBpbnQpIC0xOworCQkJZWxzZQorCQkJCWpvYi0+cmVhZF9lcnIgPSAxOwor CQkJcHVzaCgmX2NvbXBsZXRlX2pvYnMsIGpvYik7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChy ID4gMCkgeworCQkJLyoKKwkJCSAqIFdlIGNvdWxkbid0IHNlcnZpY2UgdGhpcyBqb2IgQVRNLCBz bworCQkJICogcHVzaCB0aGlzIGpvYiBiYWNrIG9udG8gdGhlIGxpc3QuCisJCQkgKi8KKwkJCXB1 c2goam9icywgam9iKTsKKwkJCWJyZWFrOworCQl9CisKKwkJY291bnQrKzsKKwl9CisKKwlyZXR1 cm4gY291bnQ7Cit9CisKKy8qCisgKiBrY29weWQgZG9lcyB0aGlzIGV2ZXJ5IHRpbWUgaXQncyB3 b2tlbiB1cC4KKyAqLworc3RhdGljIHZvaWQgZG9fd29yayh2b2lkKQoreworCS8qCisJICogVGhl IG9yZGVyIHRoYXQgdGhlc2UgYXJlIGNhbGxlZCBpcyAqdmVyeSogaW1wb3J0YW50LgorCSAqIGNv bXBsZXRlIGpvYnMgY2FuIGZyZWUgc29tZSBwYWdlcyBmb3IgcGFnZXMgam9icy4KKwkgKiBQYWdl cyBqb2JzIHdoZW4gc3VjY2Vzc2Z1bCB3aWxsIGp1bXAgb250byB0aGUgaW8gam9icworCSAqIGxp c3QuICBpbyBqb2JzIGNhbGwgd2FrZSB3aGVuIHRoZXkgY29tcGxldGUgYW5kIGl0IGFsbAorCSAq IHN0YXJ0cyBhZ2Fpbi4KKwkgKi8KKwlwcm9jZXNzX2pvYnMoJl9jb21wbGV0ZV9qb2JzLCBydW5f Y29tcGxldGVfam9iKTsKKwlwcm9jZXNzX2pvYnMoJl9wYWdlc19qb2JzLCBydW5fcGFnZXNfam9i KTsKKwlwcm9jZXNzX2pvYnMoJl9pb19qb2JzLCBydW5faW9fam9iKTsKKwlydW5fdGFza19xdWV1 ZSgmdHFfZGlzayk7Cit9CisKKy8qCisgKiBJZiB3ZSBhcmUgY29weWluZyBhIHNtYWxsIHJlZ2lv biB3ZSBqdXN0IGRpc3BhdGNoIGEgc2luZ2xlIGpvYgorICogdG8gZG8gdGhlIGNvcHksIG90aGVy d2lzZSB0aGUgaW8gaGFzIHRvIGJlIHNwbGl0IHVwIGludG8gbWFueQorICogam9icy4KKyAqLwor c3RhdGljIHZvaWQgZGlzcGF0Y2hfam9iKHN0cnVjdCBrY29weWRfam9iICpqb2IpCit7CisJcHVz aCgmX3BhZ2VzX2pvYnMsIGpvYik7CisJZG1fZGFlbW9uX3dha2UoJl9rY29weWQpOworfQorCisj ZGVmaW5lIFNVQl9KT0JfU0laRSAxMjgKK3N0YXRpYyB2b2lkIHNlZ21lbnRfY29tcGxldGUoaW50 IHJlYWRfZXJyLAorCQkJICAgICB1bnNpZ25lZCBpbnQgd3JpdGVfZXJyLCB2b2lkICpjb250ZXh0 KQoreworCS8qIEZJWE1FOiB0aWR5IHRoaXMgZnVuY3Rpb24gKi8KKwlzZWN0b3JfdCBwcm9ncmVz cyA9IDA7CisJc2VjdG9yX3QgY291bnQgPSAwOworCXN0cnVjdCBrY29weWRfam9iICpqb2IgPSAo c3RydWN0IGtjb3B5ZF9qb2IgKikgY29udGV4dDsKKworCWRvd24oJmpvYi0+bG9jayk7CisKKwkv KiB1cGRhdGUgdGhlIGVycm9yICovCisJaWYgKHJlYWRfZXJyKQorCQlqb2ItPnJlYWRfZXJyID0g MTsKKworCWlmICh3cml0ZV9lcnIpCisJCWpvYi0+d3JpdGVfZXJyICY9IHdyaXRlX2VycjsKKwor CS8qCisJICogT25seSBkaXNwYXRjaCBtb3JlIHdvcmsgaWYgdGhlcmUgaGFzbid0IGJlZW4gYW4g ZXJyb3IuCisJICovCisJaWYgKCgham9iLT5yZWFkX2VyciAmJiAham9iLT53cml0ZV9lcnIpIHx8 CisJICAgIHRlc3RfYml0KEtDT1BZRF9JR05PUkVfRVJST1IsICZqb2ItPmZsYWdzKSkgeworCQkv KiBnZXQgdGhlIG5leHQgY2h1bmsgb2Ygd29yayAqLworCQlwcm9ncmVzcyA9IGpvYi0+cHJvZ3Jl c3M7CisJCWNvdW50ID0gam9iLT5zb3VyY2UuY291bnQgLSBwcm9ncmVzczsKKwkJaWYgKGNvdW50 KSB7CisJCQlpZiAoY291bnQgPiBTVUJfSk9CX1NJWkUpCisJCQkJY291bnQgPSBTVUJfSk9CX1NJ WkU7CisKKwkJCWpvYi0+cHJvZ3Jlc3MgKz0gY291bnQ7CisJCX0KKwl9CisJdXAoJmpvYi0+bG9j ayk7CisKKwlpZiAoY291bnQpIHsKKwkJaW50IGk7CisJCXN0cnVjdCBrY29weWRfam9iICpzdWJf am9iID0gbWVtcG9vbF9hbGxvYyhfam9iX3Bvb2wsIEdGUF9OT0lPKTsKKworCQltZW1jcHkoc3Vi X2pvYiwgam9iLCBzaXplb2YoKmpvYikpOworCQlzdWJfam9iLT5zb3VyY2Uuc2VjdG9yICs9IHBy b2dyZXNzOworCQlzdWJfam9iLT5zb3VyY2UuY291bnQgPSBjb3VudDsKKworCQlmb3IgKGkgPSAw OyBpIDwgam9iLT5udW1fZGVzdHM7IGkrKykgeworCQkJc3ViX2pvYi0+ZGVzdHNbaV0uc2VjdG9y ICs9IHByb2dyZXNzOworCQkJc3ViX2pvYi0+ZGVzdHNbaV0uY291bnQgPSBjb3VudDsKKwkJfQor CisJCXN1Yl9qb2ItPmZuID0gc2VnbWVudF9jb21wbGV0ZTsKKwkJc3ViX2pvYi0+Y29udGV4dCA9 IGpvYjsKKwkJZGlzcGF0Y2hfam9iKHN1Yl9qb2IpOworCisJfSBlbHNlIGlmIChhdG9taWNfZGVj X2FuZF90ZXN0KCZqb2ItPnN1Yl9qb2JzKSkgeworCisJCS8qCisJCSAqIFRvIGF2b2lkIGEgcmFj ZSB3ZSBtdXN0IGtlZXAgdGhlIGpvYiBhcm91bmQKKwkJICogdW50aWwgYWZ0ZXIgdGhlIG5vdGlm eSBmdW5jdGlvbiBoYXMgY29tcGxldGVkLgorCQkgKiBPdGhlcndpc2UgdGhlIGNsaWVudCBtYXkg dHJ5IGFuZCBzdG9wIHRoZSBqb2IKKwkJICogYWZ0ZXIgd2UndmUgY29tcGxldGVkLgorCQkgKi8K KwkJam9iLT5mbihyZWFkX2Vyciwgd3JpdGVfZXJyLCBqb2ItPmNvbnRleHQpOworCQltZW1wb29s X2ZyZWUoam9iLCBfam9iX3Bvb2wpOworCX0KK30KKworLyoKKyAqIENyZWF0ZSBzb21lIGxpdHRs ZSBqb2JzIHRoYXQgd2lsbCBkbyB0aGUgbW92ZSBiZXR3ZWVuCisgKiB0aGVtLgorICovCisjZGVm aW5lIFNQTElUX0NPVU5UIDgKK3N0YXRpYyB2b2lkIHNwbGl0X2pvYihzdHJ1Y3Qga2NvcHlkX2pv YiAqam9iKQoreworCWludCBpOworCisJYXRvbWljX3NldCgmam9iLT5zdWJfam9icywgU1BMSVRf Q09VTlQpOworCWZvciAoaSA9IDA7IGkgPCBTUExJVF9DT1VOVDsgaSsrKQorCQlzZWdtZW50X2Nv bXBsZXRlKDAsIDB1LCBqb2IpOworfQorCisjZGVmaW5lIFNVQl9KT0JfVEhSRVNIT0xEIChTUExJ VF9DT1VOVCAqIFNVQl9KT0JfU0laRSkKK2ludCBrY29weWRfY29weShzdHJ1Y3Qga2NvcHlkX2Ns aWVudCAqa2MsIHN0cnVjdCBpb19yZWdpb24gKmZyb20sCisJCXVuc2lnbmVkIGludCBudW1fZGVz dHMsIHN0cnVjdCBpb19yZWdpb24gKmRlc3RzLAorCQl1bnNpZ25lZCBpbnQgZmxhZ3MsIGtjb3B5 ZF9ub3RpZnlfZm4gZm4sIHZvaWQgKmNvbnRleHQpCit7CisJc3RydWN0IGtjb3B5ZF9qb2IgKmpv YjsKKworCS8qCisJICogQWxsb2NhdGUgYSBuZXcgam9iLgorCSAqLworCWpvYiA9IG1lbXBvb2xf YWxsb2MoX2pvYl9wb29sLCBHRlBfTk9JTyk7CisKKwkvKgorCSAqIHNldCB1cCBmb3IgdGhlIHJl YWQuCisJICovCisJam9iLT5rYyA9IGtjOworCWpvYi0+ZmxhZ3MgPSBmbGFnczsKKwlqb2ItPnJl YWRfZXJyID0gMDsKKwlqb2ItPndyaXRlX2VyciA9IDA7CisJam9iLT5ydyA9IFJFQUQ7CisKKwlt ZW1jcHkoJmpvYi0+c291cmNlLCBmcm9tLCBzaXplb2YoKmZyb20pKTsKKworCWpvYi0+bnVtX2Rl c3RzID0gbnVtX2Rlc3RzOworCW1lbWNweSgmam9iLT5kZXN0cywgZGVzdHMsIHNpemVvZigqZGVz dHMpICogbnVtX2Rlc3RzKTsKKworCWpvYi0+b2Zmc2V0ID0gMDsKKwlqb2ItPm5yX3BhZ2VzID0g MDsKKwlJTklUX0xJU1RfSEVBRCgmam9iLT5wYWdlcyk7CisKKwlqb2ItPmZuID0gZm47CisJam9i LT5jb250ZXh0ID0gY29udGV4dDsKKworCWlmIChqb2ItPnNvdXJjZS5jb3VudCA8IFNVQl9KT0Jf VEhSRVNIT0xEKQorCQlkaXNwYXRjaF9qb2Ioam9iKTsKKworCWVsc2UgeworCQlpbml0X01VVEVY KCZqb2ItPmxvY2spOworCQlqb2ItPnByb2dyZXNzID0gMDsKKwkJc3BsaXRfam9iKGpvYik7CisJ fQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDYW5jZWxzIGEga2NvcHlkIGpvYiwgZWcuIHNv bWVvbmUgbWlnaHQgYmUgZGVhY3RpdmF0aW5nIGEKKyAqIG1pcnJvci4KKyAqLworaW50IGtjb3B5 ZF9jYW5jZWwoc3RydWN0IGtjb3B5ZF9qb2IgKmpvYiwgaW50IGJsb2NrKQoreworCS8qIEZJWE1F OiBmaW5pc2ggKi8KKwlyZXR1cm4gLTE7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFVuaXQgc2V0dXAK KyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tKi8KK3N0YXRpYyBERUNMQVJFX01VVEVYKF9jbGllbnRfbG9jayk7CitzdGF0aWMg TElTVF9IRUFEKF9jbGllbnRzKTsKKworc3RhdGljIGludCBjbGllbnRfYWRkKHN0cnVjdCBrY29w eWRfY2xpZW50ICprYykKK3sKKwlkb3duKCZfY2xpZW50X2xvY2spOworCWxpc3RfYWRkKCZrYy0+ bGlzdCwgJl9jbGllbnRzKTsKKwl1cCgmX2NsaWVudF9sb2NrKTsKKwlyZXR1cm4gMDsKK30KKwor c3RhdGljIHZvaWQgY2xpZW50X2RlbChzdHJ1Y3Qga2NvcHlkX2NsaWVudCAqa2MpCit7CisJZG93 bigmX2NsaWVudF9sb2NrKTsKKwlsaXN0X2RlbCgma2MtPmxpc3QpOworCXVwKCZfY2xpZW50X2xv Y2spOworfQorCitpbnQga2NvcHlkX2NsaWVudF9jcmVhdGUodW5zaWduZWQgaW50IG5yX3BhZ2Vz LCBzdHJ1Y3Qga2NvcHlkX2NsaWVudCAqKnJlc3VsdCkKK3sKKwlpbnQgciA9IDA7CisJc3RydWN0 IGtjb3B5ZF9jbGllbnQgKmtjOworCisJa2MgPSBrbWFsbG9jKHNpemVvZigqa2MpLCBHRlBfS0VS TkVMKTsKKwlpZiAoIWtjKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWtjLT5sb2NrID0gU1BJTl9M T0NLX1VOTE9DS0VEOworCUlOSVRfTElTVF9IRUFEKCZrYy0+cGFnZXMpOworCWtjLT5ucl9wYWdl cyA9IGtjLT5ucl9mcmVlX3BhZ2VzID0gMDsKKwlyID0gY2xpZW50X2FsbG9jX3BhZ2VzKGtjLCBu cl9wYWdlcyk7CisJaWYgKHIpIHsKKwkJa2ZyZWUoa2MpOworCQlyZXR1cm4gcjsKKwl9CisKKwly ID0gZG1faW9fZ2V0KG5yX3BhZ2VzKTsKKwlpZiAocikgeworCQljbGllbnRfZnJlZV9wYWdlcyhr Yyk7CisJCWtmcmVlKGtjKTsKKwkJcmV0dXJuIHI7CisJfQorCisJciA9IGNsaWVudF9hZGQoa2Mp OworCWlmIChyKSB7CisJCWRtX2lvX3B1dChucl9wYWdlcyk7CisJCWNsaWVudF9mcmVlX3BhZ2Vz KGtjKTsKKwkJa2ZyZWUoa2MpOworCQlyZXR1cm4gcjsKKwl9CisKKwkqcmVzdWx0ID0ga2M7CisJ cmV0dXJuIDA7Cit9CisKK3ZvaWQga2NvcHlkX2NsaWVudF9kZXN0cm95KHN0cnVjdCBrY29weWRf Y2xpZW50ICprYykKK3sKKwlkbV9pb19wdXQoa2MtPm5yX3BhZ2VzKTsKKwljbGllbnRfZnJlZV9w YWdlcyhrYyk7CisJY2xpZW50X2RlbChrYyk7CisJa2ZyZWUoa2MpOworfQorCisKK2ludCBfX2lu aXQga2NvcHlkX2luaXQodm9pZCkKK3sKKwlpbnQgcjsKKworCXIgPSBqb2JzX2luaXQoKTsKKwlp ZiAocikKKwkJcmV0dXJuIHI7CisKKwlyID0gZG1fZGFlbW9uX3N0YXJ0KCZfa2NvcHlkLCAia2Nv cHlkIiwgZG9fd29yayk7CisJaWYgKHIpCisJCWpvYnNfZXhpdCgpOworCisJcmV0dXJuIHI7Cit9 CisKK3ZvaWQga2NvcHlkX2V4aXQodm9pZCkKK3sKKwlqb2JzX2V4aXQoKTsKKwlkbV9kYWVtb25f c3RvcCgmX2tjb3B5ZCk7Cit9CisKK0VYUE9SVF9TWU1CT0woa2NvcHlkX2NsaWVudF9jcmVhdGUp OworRVhQT1JUX1NZTUJPTChrY29weWRfY2xpZW50X2Rlc3Ryb3kpOworRVhQT1JUX1NZTUJPTChr Y29weWRfY29weSk7CitFWFBPUlRfU1lNQk9MKGtjb3B5ZF9jYW5jZWwpOwotLS0gZGlmZi9kcml2 ZXJzL21kL2tjb3B5ZC5oCTE5NzAtMDEtMDEgMDE6MDA6MDAuMDAwMDAwMDAwICswMTAwCisrKyBz b3VyY2UvZHJpdmVycy9tZC9rY29weWQuaAkyMDAzLTA4LTI2IDE0OjIxOjM1LjAwMDAwMDAwMCAr MDEwMApAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxIFNpc3RpbmEg U29mdHdhcmUKKyAqCisgKiBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTC4KKyAq LworCisjaWZuZGVmIERNX0tDT1BZRF9ICisjZGVmaW5lIERNX0tDT1BZRF9ICisKKy8qCisgKiBO ZWVkZWQgZm9yIHRoZSBkZWZpbml0aW9uIG9mIG9mZnNldF90LgorICovCisjaW5jbHVkZSA8bGlu dXgvZGV2aWNlLW1hcHBlci5oPgorI2luY2x1ZGUgPGxpbnV4L2lvYnVmLmg+CisKKyNpbmNsdWRl ICJkbS1pby5oIgorCitpbnQga2NvcHlkX2luaXQodm9pZCk7Cit2b2lkIGtjb3B5ZF9leGl0KHZv aWQpOworCisvKiBGSVhNRTogbWFrZSB0aGlzIGNvbmZpZ3VyYWJsZSAqLworI2RlZmluZSBLQ09Q WURfTUFYX1JFR0lPTlMgOAorCisjZGVmaW5lIEtDT1BZRF9JR05PUkVfRVJST1IgMQorCisvKgor ICogVG8gdXNlIGtjb3B5ZCB5b3UgbXVzdCBmaXJzdCBjcmVhdGUgYSBrY29weWQgY2xpZW50IG9i amVjdC4KKyAqLworc3RydWN0IGtjb3B5ZF9jbGllbnQ7CitpbnQga2NvcHlkX2NsaWVudF9jcmVh dGUodW5zaWduZWQgaW50IG51bV9wYWdlcywgc3RydWN0IGtjb3B5ZF9jbGllbnQgKipyZXN1bHQp Owordm9pZCBrY29weWRfY2xpZW50X2Rlc3Ryb3koc3RydWN0IGtjb3B5ZF9jbGllbnQgKmtjKTsK KworLyoKKyAqIFN1Ym1pdCBhIGNvcHkgam9iIHRvIGtjb3B5ZC4gIFRoaXMgaXMgYnVpbHQgb24g dG9wIG9mIHRoZQorICogcHJldmlvdXMgdGhyZWUgZm5zLgorICoKKyAqIHJlYWRfZXJyIGlzIGEg Ym9vbGVhbiwKKyAqIHdyaXRlX2VyciBpcyBhIGJpdHNldCwgd2l0aCAxIGJpdCBmb3IgZWFjaCBk ZXN0aW5hdGlvbiByZWdpb24KKyAqLwordHlwZWRlZiB2b2lkICgqa2NvcHlkX25vdGlmeV9mbiko aW50IHJlYWRfZXJyLAorCQkJCSB1bnNpZ25lZCBpbnQgd3JpdGVfZXJyLCB2b2lkICpjb250ZXh0 KTsKKworaW50IGtjb3B5ZF9jb3B5KHN0cnVjdCBrY29weWRfY2xpZW50ICprYywgc3RydWN0IGlv X3JlZ2lvbiAqZnJvbSwKKwkJdW5zaWduZWQgaW50IG51bV9kZXN0cywgc3RydWN0IGlvX3JlZ2lv biAqZGVzdHMsCisJCXVuc2lnbmVkIGludCBmbGFncywga2NvcHlkX25vdGlmeV9mbiBmbiwgdm9p ZCAqY29udGV4dCk7CisKKyNlbmRpZgotLS0gZGlmZi9pbmNsdWRlL2xpbnV4L2RldmljZS1tYXBw ZXIuaAkxOTcwLTAxLTAxIDAxOjAwOjAwLjAwMDAwMDAwMCArMDEwMAorKysgc291cmNlL2luY2x1 ZGUvbGludXgvZGV2aWNlLW1hcHBlci5oCTIwMDMtMDgtMjYgMTM6NTk6MDQuMDAwMDAwMDAwICsw MTAwCkBAIC0wLDAgKzEsMTA0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxIFNpc3RpbmEg U29mdHdhcmUgKFVLKSBMaW1pdGVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRl ciB0aGUgTEdQTC4KKyAqLworCisjaWZuZGVmIF9MSU5VWF9ERVZJQ0VfTUFQUEVSX0gKKyNkZWZp bmUgX0xJTlVYX0RFVklDRV9NQVBQRVJfSAorCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgc2VjdG9y X3Q7CisKK3N0cnVjdCBkbV90YXJnZXQ7CitzdHJ1Y3QgZG1fdGFibGU7CitzdHJ1Y3QgZG1fZGV2 OworCit0eXBlZGVmIGVudW0geyBTVEFUVVNUWVBFX0lORk8sIFNUQVRVU1RZUEVfVEFCTEUgfSBz dGF0dXNfdHlwZV90OworCit1bmlvbiBtYXBfaW5mbyB7CisJdm9pZCAqcHRyOworCXVuc2lnbmVk IGxvbmcgbG9uZyBsbDsKK307CisKKy8qCisgKiBJbiB0aGUgY29uc3RydWN0b3IgdGhlIHRhcmdl dCBwYXJhbWV0ZXIgd2lsbCBhbHJlYWR5IGhhdmUgdGhlCisgKiB0YWJsZSwgdHlwZSwgYmVnaW4g YW5kIGxlbiBmaWVsZHMgZmlsbGVkIGluLgorICovCit0eXBlZGVmIGludCAoKmRtX2N0cl9mbikg KHN0cnVjdCBkbV90YXJnZXQgKiB0YXJnZXQsIHVuc2lnbmVkIGludCBhcmdjLAorCQkJICBjaGFy ICoqYXJndik7CisKKy8qCisgKiBUaGUgZGVzdHJ1Y3RvciBkb2Vzbid0IG5lZWQgdG8gZnJlZSB0 aGUgZG1fdGFyZ2V0LCBqdXN0CisgKiBhbnl0aGluZyBoaWRkZW4gdGktPnByaXZhdGUuCisgKi8K K3R5cGVkZWYgdm9pZCAoKmRtX2R0cl9mbikgKHN0cnVjdCBkbV90YXJnZXQgKiB0aSk7CisKKy8q CisgKiBUaGUgbWFwIGZ1bmN0aW9uIG11c3QgcmV0dXJuOgorICogPCAwOiBlcnJvcgorICogPSAw OiBUaGUgdGFyZ2V0IHdpbGwgaGFuZGxlIHRoZSBpbyBieSByZXN1Ym1pdHRpbmcgaXQgbGF0ZXIK KyAqID4gMDogc2ltcGxlIHJlbWFwIGNvbXBsZXRlCisgKi8KK3R5cGVkZWYgaW50ICgqZG1fbWFw X2ZuKSAoc3RydWN0IGRtX3RhcmdldCAqIHRpLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCwKKwkJ CSAgaW50IHJ3LCB1bmlvbiBtYXBfaW5mbyAqbWFwX2NvbnRleHQpOworCisvKgorICogUmV0dXJu czoKKyAqIDwgMCA6IGVycm9yIChjdXJyZW50bHkgaWdub3JlZCkKKyAqIDAgICA6IGVuZGVkIHN1 Y2Nlc3NmdWxseQorICogMSAgIDogZm9yIHNvbWUgcmVhc29uIHRoZSBpbyBoYXMgc3RpbGwgbm90 IGNvbXBsZXRlZCAoZWcsCisgKiAgICAgICBtdWx0aXBhdGggdGFyZ2V0IG1pZ2h0IHdhbnQgdG8g cmVxdWV1ZSBhIGZhaWxlZCBpbykuCisgKi8KK3R5cGVkZWYgaW50ICgqZG1fZW5kaW9fZm4pIChz dHJ1Y3QgZG1fdGFyZ2V0ICogdGksCisJCQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICogYmgsIGlu dCBydywgaW50IGVycm9yLAorCQkJICAgIHVuaW9uIG1hcF9pbmZvICptYXBfY29udGV4dCk7Cit0 eXBlZGVmIHZvaWQgKCpkbV9zdXNwZW5kX2ZuKSAoc3RydWN0IGRtX3RhcmdldCAqdGkpOwordHlw ZWRlZiB2b2lkICgqZG1fcmVzdW1lX2ZuKSAoc3RydWN0IGRtX3RhcmdldCAqdGkpOwordHlwZWRl ZiBpbnQgKCpkbV9zdGF0dXNfZm4pIChzdHJ1Y3QgZG1fdGFyZ2V0ICogdGksIHN0YXR1c190eXBl X3Qgc3RhdHVzX3R5cGUsCisJCQkgICAgIGNoYXIgKnJlc3VsdCwgdW5zaWduZWQgaW50IG1heGxl bik7CisKK3ZvaWQgZG1fZXJyb3IoY29uc3QgY2hhciAqbWVzc2FnZSk7CisKKy8qCisgKiBDb25z dHJ1Y3RvcnMgc2hvdWxkIGNhbGwgdGhlc2UgZnVuY3Rpb25zIHRvIGVuc3VyZSBkZXN0aW5hdGlv biBkZXZpY2VzCisgKiBhcmUgb3BlbmVkL2Nsb3NlZCBjb3JyZWN0bHkuCisgKiBGSVhNRTogdG9v IG1hbnkgYXJndW1lbnRzLgorICovCitpbnQgZG1fZ2V0X2RldmljZShzdHJ1Y3QgZG1fdGFyZ2V0 ICp0aSwgY29uc3QgY2hhciAqcGF0aCwgc2VjdG9yX3Qgc3RhcnQsCisJCSAgc2VjdG9yX3QgbGVu LCBpbnQgbW9kZSwgc3RydWN0IGRtX2RldiAqKnJlc3VsdCk7Cit2b2lkIGRtX3B1dF9kZXZpY2Uo c3RydWN0IGRtX3RhcmdldCAqdGksIHN0cnVjdCBkbV9kZXYgKmQpOworCisvKgorICogSW5mb3Jt YXRpb24gYWJvdXQgYSB0YXJnZXQgdHlwZQorICovCitzdHJ1Y3QgdGFyZ2V0X3R5cGUgeworCWNv bnN0IGNoYXIgKm5hbWU7CisJc3RydWN0IG1vZHVsZSAqbW9kdWxlOworCWRtX2N0cl9mbiBjdHI7 CisJZG1fZHRyX2ZuIGR0cjsKKwlkbV9tYXBfZm4gbWFwOworCWRtX2VuZGlvX2ZuIGVuZF9pbzsK KwlkbV9zdXNwZW5kX2ZuIHN1c3BlbmQ7CisJZG1fcmVzdW1lX2ZuIHJlc3VtZTsKKwlkbV9zdGF0 dXNfZm4gc3RhdHVzOworfTsKKworc3RydWN0IGRtX3RhcmdldCB7CisJc3RydWN0IGRtX3RhYmxl ICp0YWJsZTsKKwlzdHJ1Y3QgdGFyZ2V0X3R5cGUgKnR5cGU7CisKKwkvKiB0YXJnZXQgbGltaXRz ICovCisJc2VjdG9yX3QgYmVnaW47CisJc2VjdG9yX3QgbGVuOworCisJLyogdGFyZ2V0IHNwZWNp ZmljIGRhdGEgKi8KKwl2b2lkICpwcml2YXRlOworCisJLyogVXNlZCB0byBwcm92aWRlIGFuIGVy cm9yIHN0cmluZyBmcm9tIHRoZSBjdHIgKi8KKwljaGFyICplcnJvcjsKK307CisKK2ludCBkbV9y ZWdpc3Rlcl90YXJnZXQoc3RydWN0IHRhcmdldF90eXBlICp0KTsKK2ludCBkbV91bnJlZ2lzdGVy X3RhcmdldChzdHJ1Y3QgdGFyZ2V0X3R5cGUgKnQpOworCisjZW5kaWYJCQkJLyogX0xJTlVYX0RF VklDRV9NQVBQRVJfSCAqLwotLS0gZGlmZi9pbmNsdWRlL2xpbnV4L2RtLWlvY3RsLmgJMTk3MC0w MS0wMSAwMTowMDowMC4wMDAwMDAwMDAgKzAxMDAKKysrIHNvdXJjZS9pbmNsdWRlL2xpbnV4L2Rt LWlvY3RsLmgJMjAwMy0wOC0yNiAxNDoyMTozNy4wMDAwMDAwMDAgKzAxMDAKQEAgLTAsMCArMSwy MzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgLSAyMDAzIFNpc3RpbmEgU29mdHdhcmUg KFVLKSBMaW1pdGVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgTEdQ TC4KKyAqLworCisjaWZuZGVmIF9MSU5VWF9ETV9JT0NUTF9ICisjZGVmaW5lIF9MSU5VWF9ETV9J T0NUTF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjZGVmaW5lIERNX0RJUiAibWFw cGVyIgkJLyogU2xhc2hlcyBub3Qgc3VwcG9ydGVkICovCisjZGVmaW5lIERNX01BWF9UWVBFX05B TUUgMTYKKyNkZWZpbmUgRE1fTkFNRV9MRU4gMTI4CisjZGVmaW5lIERNX1VVSURfTEVOIDEyOQor CisvKgorICogQSB0cmFkaXRpb25hbCBpb2N0bCBpbnRlcmZhY2UgZm9yIHRoZSBkZXZpY2UgbWFw cGVyLgorICoKKyAqIEVhY2ggZGV2aWNlIGNhbiBoYXZlIHR3byB0YWJsZXMgYXNzb2NpYXRlZCB3 aXRoIGl0LCBhbgorICogJ2FjdGl2ZScgdGFibGUgd2hpY2ggaXMgdGhlIG9uZSBjdXJyZW50bHkg dXNlZCBieSBpbyBwYXNzaW5nCisgKiB0aHJvdWdoIHRoZSBkZXZpY2UsIGFuZCBhbiAnaW5hY3Rp dmUnIG9uZSB3aGljaCBpcyBhIHRhYmxlCisgKiB0aGF0IGlzIGJlaW5nIHByZXBhcmVkIGFzIGEg cmVwbGFjZW1lbnQgZm9yIHRoZSAnYWN0aXZlJyBvbmUuCisgKgorICogRE1fVkVSU0lPTjoKKyAq IEp1c3QgZ2V0IHRoZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGZvciB0aGUgaW9jdGwgaW50ZXJmYWNl LgorICoKKyAqIERNX1JFTU9WRV9BTEw6CisgKiBSZW1vdmUgYWxsIGRtIGRldmljZXMsIGRlc3Ry b3kgYWxsIHRhYmxlcy4gIE9ubHkgcmVhbGx5IHVzZWQKKyAqIGZvciBkZWJ1Zy4KKyAqCisgKiBE TV9MSVNUX0RFVklDRVM6CisgKiBHZXQgYSBsaXN0IG9mIGFsbCB0aGUgZG0gZGV2aWNlIG5hbWVz LgorICoKKyAqIERNX0RFVl9DUkVBVEU6CisgKiBDcmVhdGUgYSBuZXcgZGV2aWNlLCBuZWl0aGVy IHRoZSAnYWN0aXZlJyBvciAnaW5hY3RpdmUnIHRhYmxlCisgKiBzbG90cyB3aWxsIGJlIGZpbGxl ZC4gIFRoZSBkZXZpY2Ugd2lsbCBiZSBpbiBzdXNwZW5kZWQgc3RhdGUKKyAqIGFmdGVyIGNyZWF0 aW9uLCBob3dldmVyIGFueSBpbyB0byB0aGUgZGV2aWNlIHdpbGwgZ2V0IGVycm9yZWQKKyAqIHNp bmNlIGl0IHdpbGwgYmUgb3V0LW9mLWJvdW5kcy4KKyAqCisgKiBETV9ERVZfUkVNT1ZFOgorICog UmVtb3ZlIGEgZGV2aWNlLCBkZXN0cm95IGFueSB0YWJsZXMuCisgKgorICogRE1fREVWX1JFTkFN RToKKyAqIFJlbmFtZSBhIGRldmljZS4KKyAqCisgKiBETV9TVVNQRU5EOgorICogVGhpcyBwZXJm b3JtcyBib3RoIHN1c3BlbmQgYW5kIHJlc3VtZSwgZGVwZW5kaW5nIHdoaWNoIGZsYWcgaXMKKyAq IHBhc3NlZCBpbi4KKyAqIFN1c3BlbmQ6IFRoaXMgY29tbWFuZCB3aWxsIG5vdCByZXR1cm4gdW50 aWwgYWxsIHBlbmRpbmcgaW8gdG8KKyAqIHRoZSBkZXZpY2UgaGFzIGNvbXBsZXRlZC4gIEZ1cnRo ZXIgaW8gd2lsbCBiZSBkZWZlcnJlZCB1bnRpbAorICogdGhlIGRldmljZSBpcyByZXN1bWVkLgor ICogUmVzdW1lOiBJdCBpcyBubyBsb25nZXIgYW4gZXJyb3IgdG8gaXNzdWUgdGhpcyBjb21tYW5k IG9uIGFuCisgKiB1bnN1c3BlbmRlZCBkZXZpY2UuICBJZiBhIHRhYmxlIGlzIHByZXNlbnQgaW4g dGhlICdpbmFjdGl2ZScKKyAqIHNsb3QsIGl0IHdpbGwgYmUgbW92ZWQgdG8gdGhlIGFjdGl2ZSBz bG90LCB0aGVuIHRoZSBvbGQgdGFibGUKKyAqIGZyb20gdGhlIGFjdGl2ZSBzbG90IHdpbGwgYmUg X2Rlc3Ryb3llZF8uICBGaW5hbGx5IHRoZSBkZXZpY2UKKyAqIGlzIHJlc3VtZWQuCisgKgorICog RE1fREVWX1NUQVRVUzoKKyAqIFJldHJpZXZlcyB0aGUgc3RhdHVzIGZvciB0aGUgdGFibGUgaW4g dGhlICdhY3RpdmUnIHNsb3QuCisgKgorICogRE1fREVWX1dBSVQ6CisgKiBXYWl0IGZvciBhIHNp Z25pZmljYW50IGV2ZW50IHRvIG9jY3VyIHRvIHRoZSBkZXZpY2UuICBUaGlzCisgKiBjb3VsZCBl aXRoZXIgYmUgY2F1c2VkIGJ5IGFuIGV2ZW50IHRyaWdnZXJlZCBieSBvbmUgb2YgdGhlCisgKiB0 YXJnZXRzIG9mIHRoZSB0YWJsZSBpbiB0aGUgJ2FjdGl2ZScgc2xvdCwgb3IgYSB0YWJsZSBjaGFu Z2UuCisgKgorICogRE1fVEFCTEVfTE9BRDoKKyAqIExvYWQgYSB0YWJsZSBpbnRvIHRoZSAnaW5h Y3RpdmUnIHNsb3QgZm9yIHRoZSBkZXZpY2UuICBUaGUKKyAqIGRldmljZSBkb2VzIF9ub3RfIG5l ZWQgdG8gYmUgc3VzcGVuZGVkIHByaW9yIHRvIHRoaXMgY29tbWFuZC4KKyAqCisgKiBETV9UQUJM RV9DTEVBUjoKKyAqIERlc3Ryb3kgYW55IHRhYmxlIGluIHRoZSAnaW5hY3RpdmUnIHNsb3QgKGll LiBhYm9ydCkuCisgKgorICogRE1fVEFCTEVfREVQUzoKKyAqIFJldHVybiBhIHNldCBvZiBkZXZp Y2UgZGVwZW5kZW5jaWVzIGZvciB0aGUgJ2FjdGl2ZScgdGFibGUuCisgKgorICogRE1fVEFCTEVf U1RBVFVTOgorICogUmV0dXJuIHRoZSB0YXJnZXRzIHN0YXR1cyBmb3IgdGhlICdhY3RpdmUnIHRh YmxlLgorICovCisKKy8qCisgKiBBbGwgaW9jdGwgYXJndW1lbnRzIGNvbnNpc3Qgb2YgYSBzaW5n bGUgY2h1bmsgb2YgbWVtb3J5LCB3aXRoCisgKiB0aGlzIHN0cnVjdHVyZSBhdCB0aGUgc3RhcnQu ICBJZiBhIHV1aWQgaXMgc3BlY2lmaWVkIGFueQorICogbG9va3VwIChlZy4gZm9yIGEgRE1fSU5G Tykgd2lsbCBiZSBkb25lIG9uIHRoYXQsICpub3QqIHRoZQorICogbmFtZS4KKyAqLworc3RydWN0 IGRtX2lvY3RsIHsKKwkvKgorCSAqIFRoZSB2ZXJzaW9uIG51bWJlciBpcyBtYWRlIHVwIG9mIHRo cmVlIHBhcnRzOgorCSAqIG1ham9yIC0gbm8gYmFja3dhcmQgb3IgZm9yd2FyZCBjb21wYXRpYmls aXR5LAorCSAqIG1pbm9yIC0gb25seSBiYWNrd2FyZHMgY29tcGF0aWJsZSwKKwkgKiBwYXRjaCAt IGJvdGggYmFja3dhcmRzIGFuZCBmb3J3YXJkcyBjb21wYXRpYmxlLgorCSAqCisJICogQWxsIGNs aWVudHMgb2YgdGhlIGlvY3RsIGludGVyZmFjZSBzaG91bGQgZmlsbCBpbiB0aGUKKwkgKiB2ZXJz aW9uIG51bWJlciBvZiB0aGUgaW50ZXJmYWNlIHRoYXQgdGhleSB3ZXJlCisJICogY29tcGlsZWQg d2l0aC4KKwkgKgorCSAqIEFsbCByZWNvZ25pc2VkIGlvY3RsIGNvbW1hbmRzIChpZS4gdGhvc2Ug dGhhdCBkb24ndAorCSAqIHJldHVybiAtRU5PVFRZKSBmaWxsIG91dCB0aGlzIGZpZWxkLCBldmVu IGlmIHRoZQorCSAqIGNvbW1hbmQgZmFpbGVkLgorCSAqLworCXVpbnQzMl90IHZlcnNpb25bM107 CS8qIGluL291dCAqLworCXVpbnQzMl90IGRhdGFfc2l6ZTsJLyogdG90YWwgc2l6ZSBvZiBkYXRh IHBhc3NlZCBpbgorCQkJCSAqIGluY2x1ZGluZyB0aGlzIHN0cnVjdCAqLworCisJdWludDMyX3Qg ZGF0YV9zdGFydDsJLyogb2Zmc2V0IHRvIHN0YXJ0IG9mIGRhdGEKKwkJCQkgKiByZWxhdGl2ZSB0 byBzdGFydCBvZiB0aGlzIHN0cnVjdCAqLworCisJdWludDMyX3QgdGFyZ2V0X2NvdW50OwkvKiBp bi9vdXQgKi8KKwlpbnQzMl90IG9wZW5fY291bnQ7CS8qIG91dCAqLworCXVpbnQzMl90IGZsYWdz OwkJLyogaW4vb3V0ICovCisJdWludDMyX3QgZXZlbnRfbnI7ICAgICAgLyogaW4vb3V0ICovCisJ dWludDMyX3QgcGFkZGluZzsKKworCXVpbnQ2NF90IGRldjsJCS8qIGluL291dCAqLworCisJY2hh ciBuYW1lW0RNX05BTUVfTEVOXTsJLyogZGV2aWNlIG5hbWUgKi8KKwljaGFyIHV1aWRbRE1fVVVJ RF9MRU5dOwkvKiB1bmlxdWUgaWRlbnRpZmllciBmb3IKKwkJCQkgKiB0aGUgYmxvY2sgZGV2aWNl ICovCit9OworCisvKgorICogVXNlZCB0byBzcGVjaWZ5IHRhYmxlcy4gIFRoZXNlIHN0cnVjdHVy ZXMgYXBwZWFyIGFmdGVyIHRoZQorICogZG1faW9jdGwuCisgKi8KK3N0cnVjdCBkbV90YXJnZXRf c3BlYyB7CisJdWludDY0X3Qgc2VjdG9yX3N0YXJ0OworCXVpbnQ2NF90IGxlbmd0aDsKKwlpbnQz Ml90IHN0YXR1czsJCS8qIHVzZWQgd2hlbiByZWFkaW5nIGZyb20ga2VybmVsIG9ubHkgKi8KKwor CS8qCisJICogT2Zmc2V0IGluIGJ5dGVzIChmcm9tIHRoZSBzdGFydCBvZiB0aGlzIHN0cnVjdCkg dG8KKwkgKiBuZXh0IHRhcmdldF9zcGVjLgorCSAqLworCXVpbnQzMl90IG5leHQ7CisKKwljaGFy IHRhcmdldF90eXBlW0RNX01BWF9UWVBFX05BTUVdOworCisJLyoKKwkgKiBQYXJhbWV0ZXIgc3Ry aW5nIHN0YXJ0cyBpbW1lZGlhdGVseSBhZnRlciB0aGlzIG9iamVjdC4KKwkgKiBCZSBjYXJlZnVs IHRvIGFkZCBwYWRkaW5nIGFmdGVyIHN0cmluZyB0byBlbnN1cmUgY29ycmVjdAorCSAqIGFsaWdu bWVudCBvZiBzdWJzZXF1ZW50IGRtX3RhcmdldF9zcGVjLgorCSAqLworfTsKKworLyoKKyAqIFVz ZWQgdG8gcmV0cmlldmUgdGhlIHRhcmdldCBkZXBlbmRlbmNpZXMuCisgKi8KK3N0cnVjdCBkbV90 YXJnZXRfZGVwcyB7CisJdWludDMyX3QgY291bnQ7CQkvKiBBcnJheSBzaXplICovCisJdWludDMy X3QgcGFkZGluZzsJLyogdW51c2VkICovCisJdWludDY0X3QgZGV2WzBdOwkvKiBvdXQgKi8KK307 CisKKy8qCisgKiBVc2VkIHRvIGdldCBhIGxpc3Qgb2YgYWxsIGRtIGRldmljZXMuCisgKi8KK3N0 cnVjdCBkbV9uYW1lX2xpc3QgeworCXVpbnQ2NF90IGRldjsKKwl1aW50MzJfdCBuZXh0OwkJLyog b2Zmc2V0IHRvIHRoZSBuZXh0IHJlY29yZCBmcm9tCisJCQkJICAgdGhlIF9zdGFydF8gb2YgdGhp cyAqLworCWNoYXIgbmFtZVswXTsKK307CisKKy8qCisgKiBJZiB5b3UgY2hhbmdlIHRoaXMgbWFr ZSBzdXJlIHlvdSBtYWtlIHRoZSBjb3JyZXNwb25kaW5nIGNoYW5nZQorICogdG8gZG0taW9jdGwu Yzpsb29rdXBfaW9jdGwoKQorICovCitlbnVtIHsKKwkvKiBUb3AgbGV2ZWwgY21kcyAqLworCURN X1ZFUlNJT05fQ01EID0gMCwKKwlETV9SRU1PVkVfQUxMX0NNRCwKKwlETV9MSVNUX0RFVklDRVNf Q01ELAorCisJLyogZGV2aWNlIGxldmVsIGNtZHMgKi8KKwlETV9ERVZfQ1JFQVRFX0NNRCwKKwlE TV9ERVZfUkVNT1ZFX0NNRCwKKwlETV9ERVZfUkVOQU1FX0NNRCwKKwlETV9ERVZfU1VTUEVORF9D TUQsCisJRE1fREVWX1NUQVRVU19DTUQsCisJRE1fREVWX1dBSVRfQ01ELAorCisJLyogVGFibGUg bGV2ZWwgY21kcyAqLworCURNX1RBQkxFX0xPQURfQ01ELAorCURNX1RBQkxFX0NMRUFSX0NNRCwK KwlETV9UQUJMRV9ERVBTX0NNRCwKKwlETV9UQUJMRV9TVEFUVVNfQ01ELAorfTsKKworI2RlZmlu ZSBETV9JT0NUTCAweGZkCisKKyNkZWZpbmUgRE1fVkVSU0lPTiAgICAgICBfSU9XUihETV9JT0NU TCwgRE1fVkVSU0lPTl9DTUQsIHN0cnVjdCBkbV9pb2N0bCkKKyNkZWZpbmUgRE1fUkVNT1ZFX0FM TCAgICBfSU9XUihETV9JT0NUTCwgRE1fUkVNT1ZFX0FMTF9DTUQsIHN0cnVjdCBkbV9pb2N0bCkK KyNkZWZpbmUgRE1fTElTVF9ERVZJQ0VTICBfSU9XUihETV9JT0NUTCwgRE1fTElTVF9ERVZJQ0VT X0NNRCwgc3RydWN0IGRtX2lvY3RsKQorCisjZGVmaW5lIERNX0RFVl9DUkVBVEUgICAgX0lPV1Io RE1fSU9DVEwsIERNX0RFVl9DUkVBVEVfQ01ELCBzdHJ1Y3QgZG1faW9jdGwpCisjZGVmaW5lIERN X0RFVl9SRU1PVkUgICAgX0lPV1IoRE1fSU9DVEwsIERNX0RFVl9SRU1PVkVfQ01ELCBzdHJ1Y3Qg ZG1faW9jdGwpCisjZGVmaW5lIERNX0RFVl9SRU5BTUUgICAgX0lPV1IoRE1fSU9DVEwsIERNX0RF Vl9SRU5BTUVfQ01ELCBzdHJ1Y3QgZG1faW9jdGwpCisjZGVmaW5lIERNX0RFVl9TVVNQRU5EICAg X0lPV1IoRE1fSU9DVEwsIERNX0RFVl9TVVNQRU5EX0NNRCwgc3RydWN0IGRtX2lvY3RsKQorI2Rl ZmluZSBETV9ERVZfU1RBVFVTICAgIF9JT1dSKERNX0lPQ1RMLCBETV9ERVZfU1RBVFVTX0NNRCwg c3RydWN0IGRtX2lvY3RsKQorI2RlZmluZSBETV9ERVZfV0FJVCAgICAgIF9JT1dSKERNX0lPQ1RM LCBETV9ERVZfV0FJVF9DTUQsIHN0cnVjdCBkbV9pb2N0bCkKKworI2RlZmluZSBETV9UQUJMRV9M T0FEICAgIF9JT1dSKERNX0lPQ1RMLCBETV9UQUJMRV9MT0FEX0NNRCwgc3RydWN0IGRtX2lvY3Rs KQorI2RlZmluZSBETV9UQUJMRV9DTEVBUiAgIF9JT1dSKERNX0lPQ1RMLCBETV9UQUJMRV9DTEVB Ul9DTUQsIHN0cnVjdCBkbV9pb2N0bCkKKyNkZWZpbmUgRE1fVEFCTEVfREVQUyAgICBfSU9XUihE TV9JT0NUTCwgRE1fVEFCTEVfREVQU19DTUQsIHN0cnVjdCBkbV9pb2N0bCkKKyNkZWZpbmUgRE1f VEFCTEVfU1RBVFVTICBfSU9XUihETV9JT0NUTCwgRE1fVEFCTEVfU1RBVFVTX0NNRCwgc3RydWN0 IGRtX2lvY3RsKQorCisjZGVmaW5lIERNX1ZFUlNJT05fTUFKT1IJNAorI2RlZmluZSBETV9WRVJT SU9OX01JTk9SCTAKKyNkZWZpbmUgRE1fVkVSU0lPTl9QQVRDSExFVkVMCTEKKyNkZWZpbmUgRE1f VkVSU0lPTl9FWFRSQQkiLWlvY3RsICgyMDAzLTA3LTEyKSIKKworLyogU3RhdHVzIGJpdHMgKi8K KyNkZWZpbmUgRE1fUkVBRE9OTFlfRkxBRwkoMSA8PCAwKSAvKiBJbi9PdXQgKi8KKyNkZWZpbmUg RE1fU1VTUEVORF9GTEFHCQkoMSA8PCAxKSAvKiBJbi9PdXQgKi8KKyNkZWZpbmUgRE1fUEVSU0lT VEVOVF9ERVZfRkxBRwkoMSA8PCAzKSAvKiBJbiAqLworCisvKgorICogRmxhZyBwYXNzZWQgaW50 byBpb2N0bCBTVEFUVVMgY29tbWFuZCB0byBnZXQgdGFibGUgaW5mb3JtYXRpb24KKyAqIHJhdGhl ciB0aGFuIGN1cnJlbnQgc3RhdHVzLgorICovCisjZGVmaW5lIERNX1NUQVRVU19UQUJMRV9GTEFH CSgxIDw8IDQpIC8qIEluICovCisKKy8qCisgKiBGbGFncyB0aGF0IGluZGljYXRlIHdoZXRoZXIg YSB0YWJsZSBpcyBwcmVzZW50IGluIGVpdGhlciBvZgorICogdGhlIHR3byB0YWJsZSBzbG90cyB0 aGF0IGEgZGV2aWNlIGhhcy4KKyAqLworI2RlZmluZSBETV9BQ1RJVkVfUFJFU0VOVF9GTEFHICAg KDEgPDwgNSkgLyogT3V0ICovCisjZGVmaW5lIERNX0lOQUNUSVZFX1BSRVNFTlRfRkxBRyAoMSA8 PCA2KSAvKiBPdXQgKi8KKworLyoKKyAqIEluZGljYXRlcyB0aGF0IHRoZSBidWZmZXIgcGFzc2Vk IGluIHdhc24ndCBiaWcgZW5vdWdoIGZvciB0aGUKKyAqIHJlc3VsdHMuCisgKi8KKyNkZWZpbmUg RE1fQlVGRkVSX0ZVTExfRkxBRwkoMSA8PCA4KSAvKiBPdXQgKi8KKworI2VuZGlmCQkJCS8qIF9M SU5VWF9ETV9JT0NUTF9IICovCi0tLSBkaWZmL2luY2x1ZGUvbGludXgvbWVtcG9vbC5oCTE5NzAt MDEtMDEgMDE6MDA6MDAuMDAwMDAwMDAwICswMTAwCisrKyBzb3VyY2UvaW5jbHVkZS9saW51eC9t ZW1wb29sLmgJMjAwMy0wOC0yNiAxNDoyMTozNS4wMDAwMDAwMDAgKzAxMDAKQEAgLTAsMCArMSwz MSBAQAorLyoKKyAqIG1lbW9yeSBidWZmZXIgcG9vbCBzdXBwb3J0CisgKi8KKyNpZm5kZWYgX0xJ TlVYX01FTVBPT0xfSAorI2RlZmluZSBfTElOVVhfTUVNUE9PTF9ICisKKyNpbmNsdWRlIDxsaW51 eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorCitzdHJ1Y3QgbWVtcG9vbF9zOwor dHlwZWRlZiBzdHJ1Y3QgbWVtcG9vbF9zIG1lbXBvb2xfdDsKKwordHlwZWRlZiB2b2lkICogKG1l bXBvb2xfYWxsb2NfdCkoaW50IGdmcF9tYXNrLCB2b2lkICpwb29sX2RhdGEpOwordHlwZWRlZiB2 b2lkIChtZW1wb29sX2ZyZWVfdCkodm9pZCAqZWxlbWVudCwgdm9pZCAqcG9vbF9kYXRhKTsKKwor ZXh0ZXJuIG1lbXBvb2xfdCAqIG1lbXBvb2xfY3JlYXRlKGludCBtaW5fbnIsIG1lbXBvb2xfYWxs b2NfdCAqYWxsb2NfZm4sCisJCQkJIG1lbXBvb2xfZnJlZV90ICpmcmVlX2ZuLCB2b2lkICpwb29s X2RhdGEpOworZXh0ZXJuIGludCBtZW1wb29sX3Jlc2l6ZShtZW1wb29sX3QgKnBvb2wsIGludCBu ZXdfbWluX25yLCBpbnQgZ2ZwX21hc2spOworZXh0ZXJuIHZvaWQgbWVtcG9vbF9kZXN0cm95KG1l bXBvb2xfdCAqcG9vbCk7CitleHRlcm4gdm9pZCAqIG1lbXBvb2xfYWxsb2MobWVtcG9vbF90ICpw b29sLCBpbnQgZ2ZwX21hc2spOworZXh0ZXJuIHZvaWQgbWVtcG9vbF9mcmVlKHZvaWQgKmVsZW1l bnQsIG1lbXBvb2xfdCAqcG9vbCk7CisKKy8qCisgKiBBIG1lbXBvb2xfYWxsb2NfdCBhbmQgbWVt cG9vbF9mcmVlX3QgdGhhdCBnZXQgdGhlIG1lbW9yeSBmcm9tCisgKiBhIHNsYWIgdGhhdCBpcyBw YXNzZWQgaW4gdGhyb3VnaCBwb29sX2RhdGEuCisgKi8KK3ZvaWQgKm1lbXBvb2xfYWxsb2Nfc2xh YihpbnQgZ2ZwX21hc2ssIHZvaWQgKnBvb2xfZGF0YSk7Cit2b2lkIG1lbXBvb2xfZnJlZV9zbGFi KHZvaWQgKmVsZW1lbnQsIHZvaWQgKnBvb2xfZGF0YSk7CisKKworI2VuZGlmIC8qIF9MSU5VWF9N RU1QT09MX0ggKi8KLS0tIGRpZmYvbW0vZmlsZW1hcC5jLnJlagkxOTcwLTAxLTAxIDAxOjAwOjAw LjAwMDAwMDAwMCArMDEwMAorKysgc291cmNlL21tL2ZpbGVtYXAuYy5yZWoJMjAwMy0wOC0yNiAx Mzo1OTowNC4wMDAwMDAwMDAgKzAxMDAKQEAgLTAsMCArMSwyMSBAQAorKioqKioqKioqKioqKioq CisqKiogMTcwNCwxNzExICoqKioKKyAgCQkJcmV0dmFsID0gZ2VuZXJpY19maWxlX2RpcmVjdF9J TyhSRUFELCBmaWxwLCBidWYsIGNvdW50LCBwb3MpOworICAJCQlpZiAocmV0dmFsID4gMCkKKyAg CQkJCSpwcG9zID0gcG9zICsgcmV0dmFsOworICAJCX0KKy0gCQlVUERBVEVfQVRJTUUoZmlscC0+ Zl9kZW50cnktPmRfaW5vZGUpOworICAJCWdvdG8gb3V0OworICAJfQorICB9CistLS0gMTcwNCwx NzEzIC0tLS0KKyAgCQkJcmV0dmFsID0gZ2VuZXJpY19maWxlX2RpcmVjdF9JTyhSRUFELCBmaWxw LCBidWYsIGNvdW50LCBwb3MpOworICAJCQlpZiAocmV0dmFsID4gMCkKKyAgCQkJCSpwcG9zID0g cG9zICsgcmV0dmFsOworKyAKKyAgCQl9CisrIAkJaWYgKCFTX0lTQkxLKGlub2RlLT5pX21vZGUp KQorKyAJCQlVUERBVEVfQVRJTUUoZmlscC0+Zl9kZW50cnktPmRfaW5vZGUpOworICAJCWdvdG8g b3V0OworICAJfQorICB9Ci0tLSBkaWZmL21tL21lbXBvb2wuYwkxOTcwLTAxLTAxIDAxOjAwOjAw LjAwMDAwMDAwMCArMDEwMAorKysgc291cmNlL21tL21lbXBvb2wuYwkyMDAzLTA4LTI2IDEzOjU5 OjA0LjAwMDAwMDAwMCArMDEwMApAQCAtMCwwICsxLDI5OSBAQAorLyoKKyAqICBsaW51eC9tbS9t ZW1wb29sLmMKKyAqCisgKiAgbWVtb3J5IGJ1ZmZlciBwb29sIHN1cHBvcnQuIFN1Y2ggcG9vbHMg YXJlIG1vc3RseSB1c2VkCisgKiAgZm9yIGd1YXJhbnRlZWQsIGRlYWRsb2NrLWZyZWUgbWVtb3J5 IGFsbG9jYXRpb25zIGR1cmluZworICogIGV4dHJlbWUgVk0gbG9hZC4KKyAqCisgKiAgc3RhcnRl ZCBieSBJbmdvIE1vbG5hciwgQ29weXJpZ2h0IChDKSAyMDAxCisgKi8KKworI2luY2x1ZGUgPGxp bnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVs ZS5oPgorI2luY2x1ZGUgPGxpbnV4L21lbXBvb2wuaD4KKworc3RydWN0IG1lbXBvb2xfcyB7CisJ c3BpbmxvY2tfdCBsb2NrOworCWludCBtaW5fbnI7CQkvKiBuciBvZiBlbGVtZW50cyBhdCAqZWxl bWVudHMgKi8KKwlpbnQgY3Vycl9ucjsJCS8qIEN1cnJlbnQgbnIgb2YgZWxlbWVudHMgYXQgKmVs ZW1lbnRzICovCisJdm9pZCAqKmVsZW1lbnRzOworCisJdm9pZCAqcG9vbF9kYXRhOworCW1lbXBv b2xfYWxsb2NfdCAqYWxsb2M7CisJbWVtcG9vbF9mcmVlX3QgKmZyZWU7CisJd2FpdF9xdWV1ZV9o ZWFkX3Qgd2FpdDsKK307CisKK3N0YXRpYyB2b2lkIGFkZF9lbGVtZW50KG1lbXBvb2xfdCAqcG9v bCwgdm9pZCAqZWxlbWVudCkKK3sKKwlCVUdfT04ocG9vbC0+Y3Vycl9uciA+PSBwb29sLT5taW5f bnIpOworCXBvb2wtPmVsZW1lbnRzW3Bvb2wtPmN1cnJfbnIrK10gPSBlbGVtZW50OworfQorCitz dGF0aWMgdm9pZCAqcmVtb3ZlX2VsZW1lbnQobWVtcG9vbF90ICpwb29sKQoreworCUJVR19PTihw b29sLT5jdXJyX25yIDw9IDApOworCXJldHVybiBwb29sLT5lbGVtZW50c1stLXBvb2wtPmN1cnJf bnJdOworfQorCitzdGF0aWMgdm9pZCBmcmVlX3Bvb2wobWVtcG9vbF90ICpwb29sKQoreworCXdo aWxlIChwb29sLT5jdXJyX25yKSB7CisJCXZvaWQgKmVsZW1lbnQgPSByZW1vdmVfZWxlbWVudChw b29sKTsKKwkJcG9vbC0+ZnJlZShlbGVtZW50LCBwb29sLT5wb29sX2RhdGEpOworCX0KKwlrZnJl ZShwb29sLT5lbGVtZW50cyk7CisJa2ZyZWUocG9vbCk7Cit9CisKKy8qKgorICogbWVtcG9vbF9j cmVhdGUgLSBjcmVhdGUgYSBtZW1vcnkgcG9vbAorICogQG1pbl9ucjogICAgdGhlIG1pbmltdW0g bnVtYmVyIG9mIGVsZW1lbnRzIGd1YXJhbnRlZWQgdG8gYmUKKyAqICAgICAgICAgICAgIGFsbG9j YXRlZCBmb3IgdGhpcyBwb29sLgorICogQGFsbG9jX2ZuOiAgdXNlci1kZWZpbmVkIGVsZW1lbnQt YWxsb2NhdGlvbiBmdW5jdGlvbi4KKyAqIEBmcmVlX2ZuOiAgIHVzZXItZGVmaW5lZCBlbGVtZW50 LWZyZWVpbmcgZnVuY3Rpb24uCisgKiBAcG9vbF9kYXRhOiBvcHRpb25hbCBwcml2YXRlIGRhdGEg YXZhaWxhYmxlIHRvIHRoZSB1c2VyLWRlZmluZWQgZnVuY3Rpb25zLgorICoKKyAqIHRoaXMgZnVu Y3Rpb24gY3JlYXRlcyBhbmQgYWxsb2NhdGVzIGEgZ3VhcmFudGVlZCBzaXplLCBwcmVhbGxvY2F0 ZWQKKyAqIG1lbW9yeSBwb29sLiBUaGUgcG9vbCBjYW4gYmUgdXNlZCBmcm9tIHRoZSBtZW1wb29s X2FsbG9jIGFuZCBtZW1wb29sX2ZyZWUKKyAqIGZ1bmN0aW9ucy4gVGhpcyBmdW5jdGlvbiBtaWdo dCBzbGVlcC4gQm90aCB0aGUgYWxsb2NfZm4oKSBhbmQgdGhlIGZyZWVfZm4oKQorICogZnVuY3Rp b25zIG1pZ2h0IHNsZWVwIC0gYXMgbG9uZyBhcyB0aGUgbWVtcG9vbF9hbGxvYyBmdW5jdGlvbiBp cyBub3QgY2FsbGVkCisgKiBmcm9tIElSUSBjb250ZXh0cy4KKyAqLworbWVtcG9vbF90ICogbWVt cG9vbF9jcmVhdGUoaW50IG1pbl9uciwgbWVtcG9vbF9hbGxvY190ICphbGxvY19mbiwKKwkJCQlt ZW1wb29sX2ZyZWVfdCAqZnJlZV9mbiwgdm9pZCAqcG9vbF9kYXRhKQoreworCW1lbXBvb2xfdCAq cG9vbDsKKworCXBvb2wgPSBrbWFsbG9jKHNpemVvZigqcG9vbCksIEdGUF9LRVJORUwpOworCWlm ICghcG9vbCkKKwkJcmV0dXJuIE5VTEw7CisJbWVtc2V0KHBvb2wsIDAsIHNpemVvZigqcG9vbCkp OworCXBvb2wtPmVsZW1lbnRzID0ga21hbGxvYyhtaW5fbnIgKiBzaXplb2Yodm9pZCAqKSwgR0ZQ X0tFUk5FTCk7CisJaWYgKCFwb29sLT5lbGVtZW50cykgeworCQlrZnJlZShwb29sKTsKKwkJcmV0 dXJuIE5VTEw7CisJfQorCXNwaW5fbG9ja19pbml0KCZwb29sLT5sb2NrKTsKKwlwb29sLT5taW5f bnIgPSBtaW5fbnI7CisJcG9vbC0+cG9vbF9kYXRhID0gcG9vbF9kYXRhOworCWluaXRfd2FpdHF1 ZXVlX2hlYWQoJnBvb2wtPndhaXQpOworCXBvb2wtPmFsbG9jID0gYWxsb2NfZm47CisJcG9vbC0+ ZnJlZSA9IGZyZWVfZm47CisKKwkvKgorCSAqIEZpcnN0IHByZS1hbGxvY2F0ZSB0aGUgZ3VhcmFu dGVlZCBudW1iZXIgb2YgYnVmZmVycy4KKwkgKi8KKwl3aGlsZSAocG9vbC0+Y3Vycl9uciA8IHBv b2wtPm1pbl9ucikgeworCQl2b2lkICplbGVtZW50OworCisJCWVsZW1lbnQgPSBwb29sLT5hbGxv YyhHRlBfS0VSTkVMLCBwb29sLT5wb29sX2RhdGEpOworCQlpZiAodW5saWtlbHkoIWVsZW1lbnQp KSB7CisJCQlmcmVlX3Bvb2wocG9vbCk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlhZGRfZWxl bWVudChwb29sLCBlbGVtZW50KTsKKwl9CisJcmV0dXJuIHBvb2w7Cit9CisKKy8qKgorICogbWVt cG9vbF9yZXNpemUgLSByZXNpemUgYW4gZXhpc3RpbmcgbWVtb3J5IHBvb2wKKyAqIEBwb29sOiAg ICAgICBwb2ludGVyIHRvIHRoZSBtZW1vcnkgcG9vbCB3aGljaCB3YXMgYWxsb2NhdGVkIHZpYQor ICogICAgICAgICAgICAgIG1lbXBvb2xfY3JlYXRlKCkuCisgKiBAbmV3X21pbl9ucjogdGhlIG5l dyBtaW5pbXVtIG51bWJlciBvZiBlbGVtZW50cyBndWFyYW50ZWVkIHRvIGJlCisgKiAgICAgICAg ICAgICAgYWxsb2NhdGVkIGZvciB0aGlzIHBvb2wuCisgKiBAZ2ZwX21hc2s6ICAgdGhlIHVzdWFs IGFsbG9jYXRpb24gYml0bWFzay4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNocmlua3MvZ3Jvd3Mg dGhlIHBvb2wuIEluIHRoZSBjYXNlIG9mIGdyb3dpbmcsCisgKiBpdCBjYW5ub3QgYmUgZ3VhcmFu dGVlZCB0aGF0IHRoZSBwb29sIHdpbGwgYmUgZ3Jvd24gdG8gdGhlIG5ldworICogc2l6ZSBpbW1l ZGlhdGVseSwgYnV0IG5ldyBtZW1wb29sX2ZyZWUoKSBjYWxscyB3aWxsIHJlZmlsbCBpdC4KKyAq CisgKiBOb3RlLCB0aGUgY2FsbGVyIG11c3QgZ3VhcmFudGVlIHRoYXQgbm8gbWVtcG9vbF9kZXN0 cm95IGlzIGNhbGxlZAorICogd2hpbGUgdGhpcyBmdW5jdGlvbiBpcyBydW5uaW5nLiBtZW1wb29s X2FsbG9jKCkgJiBtZW1wb29sX2ZyZWUoKQorICogbWlnaHQgYmUgY2FsbGVkIChlZy4gZnJvbSBJ UlEgY29udGV4dHMpIHdoaWxlIHRoaXMgZnVuY3Rpb24gZXhlY3V0ZXMuCisgKi8KK2ludCBtZW1w b29sX3Jlc2l6ZShtZW1wb29sX3QgKnBvb2wsIGludCBuZXdfbWluX25yLCBpbnQgZ2ZwX21hc2sp Cit7CisJdm9pZCAqZWxlbWVudDsKKwl2b2lkICoqbmV3X2VsZW1lbnRzOworCXVuc2lnbmVkIGxv bmcgZmxhZ3M7CisKKwlCVUdfT04obmV3X21pbl9uciA8PSAwKTsKKworCXNwaW5fbG9ja19pcnFz YXZlKCZwb29sLT5sb2NrLCBmbGFncyk7CisJaWYgKG5ld19taW5fbnIgPCBwb29sLT5taW5fbnIp IHsKKwkJd2hpbGUgKHBvb2wtPmN1cnJfbnIgPiBuZXdfbWluX25yKSB7CisJCQllbGVtZW50ID0g cmVtb3ZlX2VsZW1lbnQocG9vbCk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb29sLT5s b2NrLCBmbGFncyk7CisJCQlwb29sLT5mcmVlKGVsZW1lbnQsIHBvb2wtPnBvb2xfZGF0YSk7CisJ CQlzcGluX2xvY2tfaXJxc2F2ZSgmcG9vbC0+bG9jaywgZmxhZ3MpOworCQl9CisJCXBvb2wtPm1p bl9uciA9IG5ld19taW5fbnI7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisJc3Bpbl91bmxvY2tf aXJxcmVzdG9yZSgmcG9vbC0+bG9jaywgZmxhZ3MpOworCisJLyogR3JvdyB0aGUgcG9vbCAqLwor CW5ld19lbGVtZW50cyA9IGttYWxsb2MobmV3X21pbl9uciAqIHNpemVvZigqbmV3X2VsZW1lbnRz KSwgZ2ZwX21hc2spOworCWlmICghbmV3X2VsZW1lbnRzKQorCQlyZXR1cm4gLUVOT01FTTsKKwor CXNwaW5fbG9ja19pcnFzYXZlKCZwb29sLT5sb2NrLCBmbGFncyk7CisJbWVtY3B5KG5ld19lbGVt ZW50cywgcG9vbC0+ZWxlbWVudHMsCisJCQlwb29sLT5jdXJyX25yICogc2l6ZW9mKCpuZXdfZWxl bWVudHMpKTsKKwlrZnJlZShwb29sLT5lbGVtZW50cyk7CisJcG9vbC0+ZWxlbWVudHMgPSBuZXdf ZWxlbWVudHM7CisJcG9vbC0+bWluX25yID0gbmV3X21pbl9ucjsKKworCXdoaWxlIChwb29sLT5j dXJyX25yIDwgcG9vbC0+bWluX25yKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvb2wt PmxvY2ssIGZsYWdzKTsKKwkJZWxlbWVudCA9IHBvb2wtPmFsbG9jKGdmcF9tYXNrLCBwb29sLT5w b29sX2RhdGEpOworCQlpZiAoIWVsZW1lbnQpCisJCQlnb3RvIG91dDsKKwkJc3Bpbl9sb2NrX2ly cXNhdmUoJnBvb2wtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKHBvb2wtPmN1cnJfbnIgPCBwb29sLT5t aW5fbnIpCisJCQlhZGRfZWxlbWVudChwb29sLCBlbGVtZW50KTsKKwkJZWxzZQorCQkJa2ZyZWUo ZWxlbWVudCk7CQkvKiBSYWNlZCAqLworCX0KK291dF91bmxvY2s6CisJc3Bpbl91bmxvY2tfaXJx cmVzdG9yZSgmcG9vbC0+bG9jaywgZmxhZ3MpOworb3V0OgorCXJldHVybiAwOworfQorCisvKioK KyAqIG1lbXBvb2xfZGVzdHJveSAtIGRlYWxsb2NhdGUgYSBtZW1vcnkgcG9vbAorICogQHBvb2w6 ICAgICAgcG9pbnRlciB0byB0aGUgbWVtb3J5IHBvb2wgd2hpY2ggd2FzIGFsbG9jYXRlZCB2aWEK KyAqICAgICAgICAgICAgIG1lbXBvb2xfY3JlYXRlKCkuCisgKgorICogdGhpcyBmdW5jdGlvbiBv bmx5IHNsZWVwcyBpZiB0aGUgZnJlZV9mbigpIGZ1bmN0aW9uIHNsZWVwcy4gVGhlIGNhbGxlcgor ICogaGFzIHRvIGd1YXJhbnRlZSB0aGF0IGFsbCBlbGVtZW50cyBoYXZlIGJlZW4gcmV0dXJuZWQg dG8gdGhlIHBvb2wgKGllOgorICogZnJlZWQpIHByaW9yIHRvIGNhbGxpbmcgbWVtcG9vbF9kZXN0 cm95KCkuCisgKi8KK3ZvaWQgbWVtcG9vbF9kZXN0cm95KG1lbXBvb2xfdCAqcG9vbCkKK3sKKwlp ZiAocG9vbC0+Y3Vycl9uciAhPSBwb29sLT5taW5fbnIpCisJCUJVRygpOwkJLyogVGhlcmUgd2Vy ZSBvdXRzdGFuZGluZyBlbGVtZW50cyAqLworCWZyZWVfcG9vbChwb29sKTsKK30KKworLyoqCisg KiBtZW1wb29sX2FsbG9jIC0gYWxsb2NhdGUgYW4gZWxlbWVudCBmcm9tIGEgc3BlY2lmaWMgbWVt b3J5IHBvb2wKKyAqIEBwb29sOiAgICAgIHBvaW50ZXIgdG8gdGhlIG1lbW9yeSBwb29sIHdoaWNo IHdhcyBhbGxvY2F0ZWQgdmlhCisgKiAgICAgICAgICAgICBtZW1wb29sX2NyZWF0ZSgpLgorICog QGdmcF9tYXNrOiAgdGhlIHVzdWFsIGFsbG9jYXRpb24gYml0bWFzay4KKyAqCisgKiB0aGlzIGZ1 bmN0aW9uIG9ubHkgc2xlZXBzIGlmIHRoZSBhbGxvY19mbiBmdW5jdGlvbiBzbGVlcHMgb3IKKyAq IHJldHVybnMgTlVMTC4gTm90ZSB0aGF0IGR1ZSB0byBwcmVhbGxvY2F0aW9uLCB0aGlzIGZ1bmN0 aW9uCisgKiAqbmV2ZXIqIGZhaWxzIHdoZW4gY2FsbGVkIGZyb20gcHJvY2VzcyBjb250ZXh0cy4g KGl0IG1pZ2h0CisgKiBmYWlsIGlmIGNhbGxlZCBmcm9tIGFuIElSUSBjb250ZXh0LikKKyAqLwor dm9pZCAqIG1lbXBvb2xfYWxsb2MobWVtcG9vbF90ICpwb29sLCBpbnQgZ2ZwX21hc2spCit7CisJ dm9pZCAqZWxlbWVudDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBjdXJyX25yOworCURF Q0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCWludCBnZnBfbm93YWl0ID0gZ2ZwX21h c2sgJiB+KF9fR0ZQX1dBSVQgfCBfX0dGUF9JTyk7CisKK3JlcGVhdF9hbGxvYzoKKwllbGVtZW50 ID0gcG9vbC0+YWxsb2MoZ2ZwX25vd2FpdCwgcG9vbC0+cG9vbF9kYXRhKTsKKwlpZiAobGlrZWx5 KGVsZW1lbnQgIT0gTlVMTCkpCisJCXJldHVybiBlbGVtZW50OworCisJLyoKKwkgKiBJZiB0aGUg cG9vbCBpcyBsZXNzIHRoYW4gNTAlIGZ1bGwgdGhlbiB0cnkgaGFyZGVyCisJICogdG8gYWxsb2Nh dGUgYW4gZWxlbWVudDoKKwkgKi8KKwlpZiAoKGdmcF9tYXNrICE9IGdmcF9ub3dhaXQpICYmIChw b29sLT5jdXJyX25yIDw9IHBvb2wtPm1pbl9uci8yKSkgeworCQllbGVtZW50ID0gcG9vbC0+YWxs b2MoZ2ZwX21hc2ssIHBvb2wtPnBvb2xfZGF0YSk7CisJCWlmIChsaWtlbHkoZWxlbWVudCAhPSBO VUxMKSkKKwkJCXJldHVybiBlbGVtZW50OworCX0KKworCS8qCisJICogS2ljayB0aGUgVk0gYXQg dGhpcyBwb2ludC4KKwkgKi8KKwl3YWtldXBfYmRmbHVzaCgpOworCisJc3Bpbl9sb2NrX2lycXNh dmUoJnBvb2wtPmxvY2ssIGZsYWdzKTsKKwlpZiAobGlrZWx5KHBvb2wtPmN1cnJfbnIpKSB7CisJ CWVsZW1lbnQgPSByZW1vdmVfZWxlbWVudChwb29sKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9y ZSgmcG9vbC0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gZWxlbWVudDsKKwl9CisJc3Bpbl91bmxv Y2tfaXJxcmVzdG9yZSgmcG9vbC0+bG9jaywgZmxhZ3MpOworCisJLyogV2UgbXVzdCBub3Qgc2xl ZXAgaW4gdGhlIEdGUF9BVE9NSUMgY2FzZSAqLworCWlmIChnZnBfbWFzayA9PSBnZnBfbm93YWl0 KQorCQlyZXR1cm4gTlVMTDsKKworCXJ1bl90YXNrX3F1ZXVlKCZ0cV9kaXNrKTsKKworCWFkZF93 YWl0X3F1ZXVlX2V4Y2x1c2l2ZSgmcG9vbC0+d2FpdCwgJndhaXQpOworCXNldF90YXNrX3N0YXRl KGN1cnJlbnQsIFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZw b29sLT5sb2NrLCBmbGFncyk7CisJY3Vycl9uciA9IHBvb2wtPmN1cnJfbnI7CisJc3Bpbl91bmxv Y2tfaXJxcmVzdG9yZSgmcG9vbC0+bG9jaywgZmxhZ3MpOworCisJaWYgKCFjdXJyX25yKQorCQlz Y2hlZHVsZSgpOworCisJY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7CisJcmVtb3ZlX3dh aXRfcXVldWUoJnBvb2wtPndhaXQsICZ3YWl0KTsKKworCWdvdG8gcmVwZWF0X2FsbG9jOworfQor CisvKioKKyAqIG1lbXBvb2xfZnJlZSAtIHJldHVybiBhbiBlbGVtZW50IHRvIHRoZSBwb29sLgor ICogQGVsZW1lbnQ6ICAgcG9vbCBlbGVtZW50IHBvaW50ZXIuCisgKiBAcG9vbDogICAgICBwb2lu dGVyIHRvIHRoZSBtZW1vcnkgcG9vbCB3aGljaCB3YXMgYWxsb2NhdGVkIHZpYQorICogICAgICAg ICAgICAgbWVtcG9vbF9jcmVhdGUoKS4KKyAqCisgKiB0aGlzIGZ1bmN0aW9uIG9ubHkgc2xlZXBz IGlmIHRoZSBmcmVlX2ZuKCkgZnVuY3Rpb24gc2xlZXBzLgorICovCit2b2lkIG1lbXBvb2xfZnJl ZSh2b2lkICplbGVtZW50LCBtZW1wb29sX3QgKnBvb2wpCit7CisJdW5zaWduZWQgbG9uZyBmbGFn czsKKworCWlmIChwb29sLT5jdXJyX25yIDwgcG9vbC0+bWluX25yKSB7CisJCXNwaW5fbG9ja19p cnFzYXZlKCZwb29sLT5sb2NrLCBmbGFncyk7CisJCWlmIChwb29sLT5jdXJyX25yIDwgcG9vbC0+ bWluX25yKSB7CisJCQlhZGRfZWxlbWVudChwb29sLCBlbGVtZW50KTsKKwkJCXNwaW5fdW5sb2Nr X2lycXJlc3RvcmUoJnBvb2wtPmxvY2ssIGZsYWdzKTsKKwkJCXdha2VfdXAoJnBvb2wtPndhaXQp OworCQkJcmV0dXJuOworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvb2wtPmxvY2ss IGZsYWdzKTsKKwl9CisJcG9vbC0+ZnJlZShlbGVtZW50LCBwb29sLT5wb29sX2RhdGEpOworfQor CisvKgorICogQSBjb21tb25seSB1c2VkIGFsbG9jIGFuZCBmcmVlIGZuLgorICovCit2b2lkICpt ZW1wb29sX2FsbG9jX3NsYWIoaW50IGdmcF9tYXNrLCB2b2lkICpwb29sX2RhdGEpCit7CisJa21l bV9jYWNoZV90ICptZW0gPSAoa21lbV9jYWNoZV90ICopIHBvb2xfZGF0YTsKKwlyZXR1cm4ga21l bV9jYWNoZV9hbGxvYyhtZW0sIGdmcF9tYXNrKTsKK30KKwordm9pZCBtZW1wb29sX2ZyZWVfc2xh Yih2b2lkICplbGVtZW50LCB2b2lkICpwb29sX2RhdGEpCit7CisJa21lbV9jYWNoZV90ICptZW0g PSAoa21lbV9jYWNoZV90ICopIHBvb2xfZGF0YTsKKwlrbWVtX2NhY2hlX2ZyZWUobWVtLCBlbGVt ZW50KTsKK30KKworCitFWFBPUlRfU1lNQk9MKG1lbXBvb2xfY3JlYXRlKTsKK0VYUE9SVF9TWU1C T0wobWVtcG9vbF9yZXNpemUpOworRVhQT1JUX1NZTUJPTChtZW1wb29sX2Rlc3Ryb3kpOworRVhQ T1JUX1NZTUJPTChtZW1wb29sX2FsbG9jKTsKK0VYUE9SVF9TWU1CT0wobWVtcG9vbF9mcmVlKTsK K0VYUE9SVF9TWU1CT0wobWVtcG9vbF9hbGxvY19zbGFiKTsKK0VYUE9SVF9TWU1CT0wobWVtcG9v bF9mcmVlX3NsYWIpOwpPbmx5IGV2ZXJ5IG90aGVyIG1ldGFkYXRhIGFyZWEgd2FzIGJlaW5nIHJl YWQgd2hlbiBsb2FkaW5nIGEgc25hcHNob3QhCltLZXZpbiBDb3JyeV0KLS0tIGRpZmYvZHJpdmVy cy9tZC9kbS1leGNlcHRpb24tc3RvcmUuYwkyMDAzLTA4LTI2IDEzOjU5OjA0LjAwMDAwMDAwMCAr MDEwMAorKysgc291cmNlL2RyaXZlcnMvbWQvZG0tZXhjZXB0aW9uLXN0b3JlLmMJMjAwMy0wOC0y NiAxNjoyNzowNS4wMDAwMDAwMDAgKzAxMDAKQEAgLTM2OSw4ICszNjksNiBAQAogCQlyID0gaW5z ZXJ0X2V4Y2VwdGlvbnMocHMsICZmdWxsKTsKIAkJaWYgKHIpCiAJCQlyZXR1cm4gcjsKLQotCQlh cmVhKys7CiAJfQogCiAJcmV0dXJuIDA7Ci0tLSBkaWZmL2FyY2gvbWlwczY0L2tlcm5lbC9pb2N0 bDMyLmMucmVqCTIwMDMtMDgtMjYgMTM6NTk6MDQuMDAwMDAwMDAwICswMTAwCisrKyBzb3VyY2Uv YXJjaC9taXBzNjQva2VybmVsL2lvY3RsMzIuYy5yZWoJMTk3MC0wMS0wMSAwMTowMDowMC4wMDAw MDAwMDAgKzAxMDAKQEAgLTEsMTYgKzAsMCBAQAotKioqKioqKioqKioqKioqCi0qKiogMzMsMzgg KioqKgotICAjaW5jbHVkZSA8bGludXgvYXV0b19mcy5oPgotICAjaW5jbHVkZSA8bGludXgvZXh0 Ml9mcy5oPgotICAjaW5jbHVkZSA8bGludXgvcmFpZC9tZF91Lmg+Ci0gIAotICAjaW5jbHVkZSA8 c2NzaS9zY3NpLmg+Ci0gICN1bmRlZiBfX0tFUk5FTF9fCQkvKiBUaGlzIGZpbGUgd2FzIGJvcm4g dG8gYmUgdWdseSAuLi4gICovCi0tLS0gMzMsMzkgLS0tLQotICAjaW5jbHVkZSA8bGludXgvYXV0 b19mcy5oPgotICAjaW5jbHVkZSA8bGludXgvZXh0Ml9mcy5oPgotICAjaW5jbHVkZSA8bGludXgv cmFpZC9tZF91Lmg+Ci0rICNpbmNsdWRlIDxsaW51eC9kbS1pb2N0bC5oPgotICAKLSAgI2luY2x1 ZGUgPHNjc2kvc2NzaS5oPgotICAjdW5kZWYgX19LRVJORUxfXwkJLyogVGhpcyBmaWxlIHdhcyBi b3JuIHRvIGJlIHVnbHkgLi4uICAqLwotLS0gZGlmZi9hcmNoL3MzOTB4L2tlcm5lbC9pb2N0bDMy LmMucmVqCTIwMDMtMDgtMjYgMTM6NTk6MDQuMDAwMDAwMDAwICswMTAwCisrKyBzb3VyY2UvYXJj aC9zMzkweC9rZXJuZWwvaW9jdGwzMi5jLnJlagkxOTcwLTAxLTAxIDAxOjAwOjAwLjAwMDAwMDAw MCArMDEwMApAQCAtMSw0NSArMCwwIEBACi0qKioqKioqKioqKioqKioKLSoqKiAyNSwzMCAqKioq Ci0gICNpbmNsdWRlIDxsaW51eC9leHQyX2ZzLmg+Ci0gICNpbmNsdWRlIDxsaW51eC9oZHJlZy5o PgotICAjaW5jbHVkZSA8bGludXgvaWZfYm9uZGluZy5oPgotICAjaW5jbHVkZSA8YXNtL3R5cGVz Lmg+Ci0gICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotICAjaW5jbHVkZSA8YXNtL2Rhc2QuaD4K LS0tLSAyNSwzMSAtLS0tCi0gICNpbmNsdWRlIDxsaW51eC9leHQyX2ZzLmg+Ci0gICNpbmNsdWRl IDxsaW51eC9oZHJlZy5oPgotICAjaW5jbHVkZSA8bGludXgvaWZfYm9uZGluZy5oPgotKyAjaW5j bHVkZSA8bGludXgvZG0taW9jdGwuaD4KLSAgI2luY2x1ZGUgPGFzbS90eXBlcy5oPgotICAjaW5j bHVkZSA8YXNtL3VhY2Nlc3MuaD4KLSAgI2luY2x1ZGUgPGFzbS9kYXNkLmg+Ci0qKioqKioqKioq KioqKioKLSoqKiA1MDgsNTEzICoqKioKLSAgCi0gIAlJT0NUTDMyX0RFRkFVTFQoU0lPQ0dTVEFN UCksCi0gIAotICAJSU9DVEwzMl9IQU5ETEVSKFNJT0NHSUZOQU1FLCBkZXZfaWZuYW1lMzIpLAot ICAJSU9DVEwzMl9IQU5ETEVSKFNJT0NHSUZDT05GLCBkZXZfaWZjb25mKSwKLSAgCUlPQ1RMMzJf SEFORExFUihTSU9DR0lGRkxBR1MsIGRldl9pZnNpb2MpLAotLS0tIDUwOSw1MjggLS0tLQotICAK LSAgCUlPQ1RMMzJfREVGQVVMVChTSU9DR1NUQU1QKSwKLSAgCi0rIAlJT0NUTDMyX0RFRkFVTFQo RE1fVkVSU0lPTiksCi0rIAlJT0NUTDMyX0RFRkFVTFQoRE1fUkVNT1ZFX0FMTCksCi0rIAlJT0NU TDMyX0RFRkFVTFQoRE1fREVWX0NSRUFURSksCi0rIAlJT0NUTDMyX0RFRkFVTFQoRE1fREVWX1JF TU9WRSksCi0rIAlJT0NUTDMyX0RFRkFVTFQoRE1fVEFCTEVfTE9BRCksCi0rIAlJT0NUTDMyX0RF RkFVTFQoRE1fREVWX1NVU1BFTkQpLAotKyAJSU9DVEwzMl9ERUZBVUxUKERNX0RFVl9SRU5BTUUp LAotKyAJSU9DVEwzMl9ERUZBVUxUKERNX1RBQkxFX0RFUFMpLAotKyAJSU9DVEwzMl9ERUZBVUxU KERNX0RFVl9TVEFUVVMpLAotKyAJSU9DVEwzMl9ERUZBVUxUKERNX1RBQkxFX1NUQVRVUyksCi0r IAlJT0NUTDMyX0RFRkFVTFQoRE1fREVWX1dBSVQpLAotKyAJSU9DVEwzMl9ERUZBVUxUKERNX0xJ U1RfREVWSUNFUyksCi0rIAlJT0NUTDMyX0RFRkFVTFQoRE1fVEFCTEVfQ0xFQVIpLAotKyAKLSAg CUlPQ1RMMzJfSEFORExFUihTSU9DR0lGTkFNRSwgZGV2X2lmbmFtZTMyKSwKLSAgCUlPQ1RMMzJf SEFORExFUihTSU9DR0lGQ09ORiwgZGV2X2lmY29uZiksCi0gIAlJT0NUTDMyX0hBTkRMRVIoU0lP Q0dJRkZMQUdTLCBkZXZfaWZzaW9jKSwKLS0tIGRpZmYvbW0vZmlsZW1hcC5jLnJlagkyMDAzLTA4 LTI2IDEzOjU5OjA0LjAwMDAwMDAwMCArMDEwMAorKysgc291cmNlL21tL2ZpbGVtYXAuYy5yZWoJ MTk3MC0wMS0wMSAwMTowMDowMC4wMDAwMDAwMDAgKzAxMDAKQEAgLTEsMjEgKzAsMCBAQAotKioq KioqKioqKioqKioqCi0qKiogMTcwNCwxNzExICoqKioKLSAgCQkJcmV0dmFsID0gZ2VuZXJpY19m aWxlX2RpcmVjdF9JTyhSRUFELCBmaWxwLCBidWYsIGNvdW50LCBwb3MpOwotICAJCQlpZiAocmV0 dmFsID4gMCkKLSAgCQkJCSpwcG9zID0gcG9zICsgcmV0dmFsOwotICAJCX0KLS0gCQlVUERBVEVf QVRJTUUoZmlscC0+Zl9kZW50cnktPmRfaW5vZGUpOwotICAJCWdvdG8gb3V0OwotICAJfQotICB9 Ci0tLS0gMTcwNCwxNzEzIC0tLS0KLSAgCQkJcmV0dmFsID0gZ2VuZXJpY19maWxlX2RpcmVjdF9J TyhSRUFELCBmaWxwLCBidWYsIGNvdW50LCBwb3MpOwotICAJCQlpZiAocmV0dmFsID4gMCkKLSAg CQkJCSpwcG9zID0gcG9zICsgcmV0dmFsOwotKyAKLSAgCQl9Ci0rIAkJaWYgKCFTX0lTQkxLKGlu b2RlLT5pX21vZGUpKQotKyAJCQlVUERBVEVfQVRJTUUoZmlscC0+Zl9kZW50cnktPmRfaW5vZGUp OwotICAJCWdvdG8gb3V0OwotICAJfQotICB9CkRvbid0IGluaXRpYWxpc2Ugc3RhdGljIHZhcmlh YmxlcyB0byB6ZXJvL05VTEwuCi0tLSBkaWZmL2RyaXZlcnMvbWQva2NvcHlkLmMJMjAwMy0wOC0y NiAxMzo1OTowNC4wMDAwMDAwMDAgKzAxMDAKKysrIHNvdXJjZS9kcml2ZXJzL21kL2tjb3B5ZC5j CTIwMDMtMDgtMjYgMTY6Mjc6MTAuMDAwMDAwMDAwICswMTAwCkBAIC0xODMsOCArMTgzLDggQEAK IC8qIEZJWE1FOiB0aGlzIHNob3VsZCBzY2FsZSB3aXRoIHRoZSBudW1iZXIgb2YgcGFnZXMgKi8K ICNkZWZpbmUgTUlOX0pPQlMgNTEyCiAKLXN0YXRpYyBrbWVtX2NhY2hlX3QgKl9qb2JfY2FjaGUg PSBOVUxMOwotc3RhdGljIG1lbXBvb2xfdCAqX2pvYl9wb29sID0gTlVMTDsKK3N0YXRpYyBrbWVt X2NhY2hlX3QgKl9qb2JfY2FjaGU7CitzdGF0aWMgbWVtcG9vbF90ICpfam9iX3Bvb2w7CiAKIC8q CiAgKiBXZSBtYWludGFpbiB0aHJlZSBsaXN0cyBvZiBqb2JzOgpDaGFuZ2UgcmVzdW1lL3N1c3Bl bmQgdG8gZG9fcmVzdW1lL2RvX3N1c3BlbmQgdG8gYXZvaWQgbmFtZSBjbGFzaC4KLS0tIGRpZmYv ZHJpdmVycy9tZC9kbS1pb2N0bC5jCTIwMDMtMDgtMjYgMTM6NTk6MDQuMDAwMDAwMDAwICswMTAw CisrKyBzb3VyY2UvZHJpdmVycy9tZC9kbS1pb2N0bC5jCTIwMDMtMDgtMjYgMTY6Mjc6MTUuMDAw MDAwMDAwICswMTAwCkBAIC01OTMsNyArNTkzLDcgQEAKIAlyZXR1cm4gZG1faGFzaF9yZW5hbWUo cGFyYW0tPm5hbWUsIG5ld19uYW1lKTsKIH0KIAotc3RhdGljIGludCBzdXNwZW5kKHN0cnVjdCBk bV9pb2N0bCAqcGFyYW0pCitzdGF0aWMgaW50IGRvX3N1c3BlbmQoc3RydWN0IGRtX2lvY3RsICpw YXJhbSkKIHsKIAlpbnQgciA9IDA7CiAJc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kOwpAQCAtNjEy LDcgKzYxMiw3IEBACiAJcmV0dXJuIHI7CiB9CiAKLXN0YXRpYyBpbnQgcmVzdW1lKHN0cnVjdCBk bV9pb2N0bCAqcGFyYW0pCitzdGF0aWMgaW50IGRvX3Jlc3VtZShzdHJ1Y3QgZG1faW9jdGwgKnBh cmFtKQogewogCWludCByID0gMDsKIAlzdHJ1Y3QgaGFzaF9jZWxsICpoYzsKQEAgLTY3NSw5ICs2 NzUsOSBAQAogc3RhdGljIGludCBkZXZfc3VzcGVuZChzdHJ1Y3QgZG1faW9jdGwgKnBhcmFtLCBz aXplX3QgcGFyYW1fc2l6ZSkKIHsKIAlpZiAocGFyYW0tPmZsYWdzICYgRE1fU1VTUEVORF9GTEFH KQotCQlyZXR1cm4gc3VzcGVuZChwYXJhbSk7CisJCXJldHVybiBkb19zdXNwZW5kKHBhcmFtKTsK IAotCXJldHVybiByZXN1bWUocGFyYW0pOworCXJldHVybiBkb19yZXN1bWUocGFyYW0pOwogfQog CiAvKgpIZWxsbyBhbGwsCgpUaGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoZSBWRlMgbG9ja2luZyBw YXRjaCBhZGRzIGEgbmV3IHNlbWFwaG9yZSB0bwpmcy9zdXBlci5jLiAgVGhpcyBpcyB1c2VkIHRv IG1ha2Ugc3VyZSBhIGZpbGVzeXN0ZW0gZG9lcyBub3QgZ2V0IG1vdW50ZWQKb24gYSBsb2dpY2Fs IHZvbHVtZSB3aGlsZSBhIHNuYXBzaG90IGlzIGJlaW5nIHRha2VuLiAgSXQgYWxzbyByZXN1bHRz IGluCmFsbCBtb3VudHMgb24gdGhlIHN5c3RlbSBiZWluZyBzZXJpYWxpemVkLCBhbmQgaXNuJ3Qg aW4gbGluZSB3aXRoIHRoZQpWRlMgbG9ja2luZyBzY2hlbWUgaW4gZ2VuZXJhbC4KCkkndmUgYmVl biBtZWFuaW5nIHRvIGZpeCBpdCBmb3JldmVyLCBoZXJlJ3MgYW4gdXBkYXRlZCB2ZXJzaW9uIHRo YXQgYWRkcwphIHN1cGVyIHdpdGggcy0+c19kZXYgc2V0IHRvIHRoZSBzb3VyY2Ugdm9sdW1lIGlm IG5vdGhpbmcgaXMgY3VycmVudGx5Cm1vdW50ZWQgb24gdGhlIHNvdXJjZSB2b2x1bWUuICBUaGlz IGFsbG93cyBtZSB0byB1c2UgdGhlIHNfdW1vdW50CnNlbWFwaG9yZSBpbiB0aGUgc3VwZXIgYmxv Y2sgdG8ga2VlcCB0aGluZ3Mgc2FmZSwgd2hpY2ggaXMgY2xlYW5lcgpvdmVyYWxsLiAgCgpUaGUg b3RoZXIgYmVuZWZpdCBvdmVyIHRoZSBleGlzdGluZyBwYXRjaCBpcyB0aGlzIG9uZSBoYXMgemVy byBmb290cHJpbnQKb3V0c2lkZSB0aGUgbG9ja2ZzIGNhbGxzLiAgWW91J3JlIG9ubHkgcnVubmlu ZyBuZXcgY29kZSBpZiB5b3UgdGFrZSBhCnNuYXBzaG90LgoKSSd2ZSBkb25lIHNvbWUgdGVzdGlu ZyBoZXJlLCBidXQgd2FudGVkIHRvIGxldCBMVk0gcGVvcGxlIHJldmlldyBpdApiZWZvcmUgZ29p bmcgZnVydGhlci4gIFBhdGNoIGlzIGJlbG93IGFnYWluc3QgMi40LjIxLXJjNi4gIAoKVGhpcyBw cm92aWRlcyB6ZXJvIG5ldyBmdW5jdGlvbmFsaXR5IG92ZXIgdGhlIGV4aXN0aW5nIFZGUyBsb2Nr aW5nCnBhdGNoLCBhbmQgaXMgZXhwZXJpbWVudGFsLiAgRG8gbm90IGFwcGx5IHRoaXMgb24gcHJv ZHVjdGlvbiBzZXJ2ZXJzLAphbmQgZG8gbm90IGFwcGx5IHVubGVzcyB5b3Ugd2FudCB0byBoZWxw IHRlc3QuCgotY2hyaXMKCj09PT09IGRyaXZlcnMvbWQvbHZtLmMgMS4xOSB2cyBlZGl0ZWQgPT09 PT0KLS0tIGRpZmYvZHJpdmVycy9tZC9kbS1zbmFwc2hvdC5jCTIwMDMtMDgtMjYgMTM6NTk6MDQu MDAwMDAwMDAwICswMTAwCisrKyBzb3VyY2UvZHJpdmVycy9tZC9kbS1zbmFwc2hvdC5jCTIwMDMt MDgtMjYgMTY6Mjc6MjEuMDAwMDAwMDAwICswMTAwCkBAIC01MjUsNyArNTI1LDcgQEAKIAl9CiAK IAkvKiBGbHVzaCBJTyB0byB0aGUgb3JpZ2luIGRldmljZSAqLwotCWZzeW5jX2RldihzLT5vcmln aW4tPmRldik7CisJZnN5bmNfZGV2X2xvY2tmcyhzLT5vcmlnaW4tPmRldik7CiAKIAkvKiBBZGQg c25hcHNob3QgdG8gdGhlIGxpc3Qgb2Ygc25hcHNob3RzIGZvciB0aGlzIG9yaWdpbiAqLwogCWlm IChyZWdpc3Rlcl9zbmFwc2hvdChzKSkgewpAQCAtNTM5LDYgKzUzOSw3IEBACiAKICBiYWQ2Ogog CWtjb3B5ZF9jbGllbnRfZGVzdHJveShzLT5rY29weWRfY2xpZW50KTsKKwl1bmxvY2tmcyhzLT5v cmlnaW4tPmRldik7CiAKICBiYWQ1OgogCXMtPnN0b3JlLmRlc3Ryb3koJnMtPnN0b3JlKTsKLS0t IGRpZmYvZHJpdmVycy9tZC9sdm0uYwkyMDAzLTA2LTE2IDA5OjU2OjEwLjAwMDAwMDAwMCArMDEw MAorKysgc291cmNlL2RyaXZlcnMvbWQvbHZtLmMJMjAwMy0wOC0yNiAxNjoyNzoyMS4wMDAwMDAw MDAgKzAxMDAKQEAgLTIyOSw5ICsyMjksNiBAQAogI2RlZmluZSBERVZJQ0VfT0ZGKGRldmljZSkK ICNkZWZpbmUgTE9DQUxfRU5EX1JFUVVFU1QKIAotLyogbHZtX2RvX2x2X2NyZWF0ZSBjYWxscyBm c3luY19kZXZfbG9ja2ZzKCkvdW5sb2NrZnMoKSAqLwotLyogI2RlZmluZQlMVk1fVkZTX0VOSEFO Q0VNRU5UICovCi0KICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxsaW51eC9t b2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KQEAgLTIxNzEsMTIgKzIxNjgsOCBA QAogCWlmIChsdl9wdHItPmx2X2FjY2VzcyAmIExWX1NOQVBTSE9UKSB7CiAJCWx2X3QgKm9yZyA9 IGx2X3B0ci0+bHZfc25hcHNob3Rfb3JnLCAqbGFzdDsKIAotCQkvKiBzeW5jIHRoZSBvcmlnaW5h bCBsb2dpY2FsIHZvbHVtZSAqLwotCQlmc3luY19kZXYob3JnLT5sdl9kZXYpOwotI2lmZGVmCUxW TV9WRlNfRU5IQU5DRU1FTlQKIAkJLyogVkZTIGZ1bmN0aW9uIGNhbGwgdG8gc3luYyBhbmQgbG9j ayB0aGUgZmlsZXN5c3RlbSAqLwogCQlmc3luY19kZXZfbG9ja2ZzKG9yZy0+bHZfZGV2KTsKLSNl bmRpZgogCiAJCWRvd25fd3JpdGUoJm9yZy0+bHZfbG9jayk7CiAJCW9yZy0+bHZfYWNjZXNzIHw9 IExWX1NOQVBTSE9UX09SRzsKQEAgLTIyMDEsMTEgKzIxOTQsOSBAQAogCWVsc2UKIAkJc2V0X2Rl dmljZV9ybyhsdl9wdHItPmx2X2RldiwgMSk7CiAKLSNpZmRlZglMVk1fVkZTX0VOSEFOQ0VNRU5U CiAvKiBWRlMgZnVuY3Rpb24gY2FsbCB0byB1bmxvY2sgdGhlIGZpbGVzeXN0ZW0gKi8KIAlpZiAo bHZfcHRyLT5sdl9hY2Nlc3MgJiBMVl9TTkFQU0hPVCkKIAkJdW5sb2NrZnMobHZfcHRyLT5sdl9z bmFwc2hvdF9vcmctPmx2X2Rldik7Ci0jZW5kaWYKIAogCWx2bV9nZW5kaXNrLnBhcnRbTUlOT1Io bHZfcHRyLT5sdl9kZXYpXS5kZSA9CiAJICAgIGx2bV9mc19jcmVhdGVfbHYodmdfcHRyLCBsdl9w dHIpOwotLS0gZGlmZi9mcy9idWZmZXIuYwkyMDAzLTA4LTI2IDEzOjU5OjA0LjAwMDAwMDAwMCAr MDEwMAorKysgc291cmNlL2ZzL2J1ZmZlci5jCTIwMDMtMDgtMjYgMTY6Mjc6MjEuMDAwMDAwMDAw ICswMTAwCkBAIC0zNzYsNiArMzc2LDM0IEBACiAJZnN5bmNfZGV2KGRldik7CiB9CiAKK2ludCBm c3luY19kZXZfbG9ja2ZzKGtkZXZfdCBkZXYpCit7CisJLyogeW91IGFyZSBub3QgYWxsb3dlZCB0 byB0cnkgbG9ja2luZyBhbGwgdGhlIGZpbGVzeXN0ZW1zCisJKiogb24gdGhlIHN5c3RlbSwgeW91 ciBjaGFuY2VzIG9mIGdldHRpbmcgdGhyb3VnaCB3aXRob3V0CisJKiogdG90YWwgZGVhZGxvY2sg YXJlIHNsaW0gdG8gbm9uZS4KKwkqLworCWlmICghZGV2KQorCQlyZXR1cm4gZnN5bmNfZGV2KGRl dikgOworCisJc3luY19idWZmZXJzKGRldiwgMCk7CisKKwlsb2NrX2tlcm5lbCgpOworCS8qIG5v dGUsIHRoZSBGUyBtaWdodCBuZWVkIHRvIHN0YXJ0IHRyYW5zYWN0aW9ucyB0byAKKwkqKiBzeW5j IHRoZSBpbm9kZXMsIG9yIHRoZSBxdW90YSwgbm8gbG9ja2luZyB1bnRpbAorCSoqIGFmdGVyIHRo ZXNlIGFyZSBkb25lCisJKi8KKwlzeW5jX2lub2RlcyhkZXYpOworCURRVU9UX1NZTkMoZGV2KTsK KwkvKiBpZiBpbm9kZXMgb3IgcXVvdGFzIGNvdWxkIGJlIGRpcnRpZWQgZHVyaW5nIHRoZQorCSoq IHN5bmNfc3VwZXJzX2xvY2tmcyBjYWxsLCB0aGUgRlMgaXMgcmVzcG9uc2libGUgZm9yIGdldHRp bmcKKwkqKiB0aGVtIG9uIGRpc2ssIHdpdGhvdXQgZGVhZGxvY2tpbmcgYWdhaW5zdCB0aGUgbG9j aworCSovCisJc3luY19zdXBlcnNfbG9ja2ZzKGRldikgOworCXVubG9ja19rZXJuZWwoKTsKKwor CXJldHVybiBzeW5jX2J1ZmZlcnMoZGV2LCAxKSA7Cit9CisKIGFzbWxpbmthZ2UgbG9uZyBzeXNf c3luYyh2b2lkKQogewogCWZzeW5jX2RldigwKTsKLS0tIGRpZmYvZnMvcmVpc2VyZnMvc3VwZXIu YwkyMDAzLTA4LTI2IDEzOjUwOjEyLjAwMDAwMDAwMCArMDEwMAorKysgc291cmNlL2ZzL3JlaXNl cmZzL3N1cGVyLmMJMjAwMy0wOC0yNiAxNjoyNzoyMS4wMDAwMDAwMDAgKzAxMDAKQEAgLTczLDcg KzczLDcgQEAKICAgICByZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKHMsIFNCX0JVRkZFUl9X SVRIX1NCKHMpLCAxKTsKICAgICBqb3VybmFsX21hcmtfZGlydHkoJnRoLCBzLCBTQl9CVUZGRVJf V0lUSF9TQiAocykpOwogICAgIHJlaXNlcmZzX2Jsb2NrX3dyaXRlcygmdGgpIDsKLSAgICBqb3Vy bmFsX2VuZCgmdGgsIHMsIDEpIDsKKyAgICBqb3VybmFsX2VuZF9zeW5jKCZ0aCwgcywgMSkgOwog ICB9CiAgIHMtPnNfZGlydCA9IGRpcnR5OwogICB1bmxvY2tfa2VybmVsKCkgOwotLS0gZGlmZi9m cy9zdXBlci5jCTIwMDMtMDgtMjYgMTM6NTA6MTIuMDAwMDAwMDAwICswMTAwCisrKyBzb3VyY2Uv ZnMvc3VwZXIuYwkyMDAzLTA4LTI2IDE2OjI3OjIxLjAwMDAwMDAwMCArMDEwMApAQCAtMzksNiAr MzksMTIgQEAKIHNwaW5sb2NrX3Qgc2JfbG9jayA9IFNQSU5fTE9DS19VTkxPQ0tFRDsKIAogLyoK KyAqIHN0dWIgb2YgYSBmaWxlc3lzdGVtIHVzZWQgdG8gbWFrZSBzdXJlIGFuIEZTIGlzbid0IG1v dW50ZWQKKyAqIGluIHRoZSBtaWRkbGUgb2YgYSBsb2NrZnMgY2FsbAorICovCitzdGF0aWMgREVD TEFSRV9GU1RZUEVfREVWKGxvY2tmc19mc190eXBlLCAibG9ja2ZzIiwgTlVMTCk7CisKKy8qCiAg KiBIYW5kbGluZyBvZiBmaWxlc3lzdGVtIGRyaXZlcnMgbGlzdC4KICAqIFJ1bGVzOgogICoJSW5j bHVzaW9uIHRvL3JlbW92YWxzIGZyb20vc2Nhbm5pbmcgb2YgbGlzdCBhcmUgcHJvdGVjdGVkIGJ5 IHNwaW5sb2NrLgpAQCAtNDM2LDYgKzQ0MiwyNSBAQAogCXB1dF9zdXBlcihzYik7CiB9CiAKK3N0 YXRpYyB2b2lkIHdyaXRlX3N1cGVyX2xvY2tmcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQorewor CWxvY2tfc3VwZXIoc2IpOworCWlmIChzYi0+c19yb290ICYmIHNiLT5zX29wKSB7CisJCWlmIChz Yi0+c19kaXJ0ICYmIHNiLT5zX29wLT53cml0ZV9zdXBlcikKKwkJCXNiLT5zX29wLT53cml0ZV9z dXBlcihzYik7CisJCWlmIChzYi0+c19vcC0+d3JpdGVfc3VwZXJfbG9ja2ZzKQorCQkJc2ItPnNf b3AtPndyaXRlX3N1cGVyX2xvY2tmcyhzYik7CisJfQorCXVubG9ja19zdXBlcihzYik7CisKKwkv KiAKKwkgKiBpZiBubyBsb2NrZnMgY2FsbCBpcyBwcm92aWRlZCwgdXNlIHRoZSBzeW5jX2ZzIGNh bGwgaW5zdGVhZC4KKwkgKiB0aGlzIG11c3QgYmUgZG9uZSB3aXRob3V0IHRoZSBzdXBlciBsb2Nr IGhlbGQKKwkgKi8KKwlpZiAoIXNiLT5zX29wLT53cml0ZV9zdXBlcl9sb2NrZnMgJiYgc2ItPnNf b3AtPnN5bmNfZnMpCisJCXNiLT5zX29wLT5zeW5jX2ZzKHNiKTsKK30KKwogc3RhdGljIGlubGlu ZSB2b2lkIHdyaXRlX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7CiAJbG9ja19zdXBl cihzYik7CkBAIC00ODMsNiArNTA4LDExOSBAQAogCXNwaW5fdW5sb2NrKCZzYl9sb2NrKTsKIH0K IAorc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqZmluZF9zdXBlcl9mb3JfbG9ja2ZzKGtkZXZf dCBkZXYpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpsb2NrZnNfc2IgPSBhbGxvY19zdXBlcigp OworCXN0cnVjdCBzdXBlcl9ibG9jayAqIHM7CisKKwlpZiAoIWRldikKKwkJcmV0dXJuIE5VTEw7 CityZXN0YXJ0OgorCXNwaW5fbG9jaygmc2JfbG9jayk7CisJcyA9IGZpbmRfc3VwZXIoZGV2KTsK KwlpZiAocykgeworCQlzcGluX3VubG9jaygmc2JfbG9jayk7CisJCWRvd25fcmVhZCgmcy0+c191 bW91bnQpOworCQlpZiAocy0+c19yb290KSB7CisJCQlkZXN0cm95X3N1cGVyKGxvY2tmc19zYik7 CisJCQlyZXR1cm4gczsKKwkJfQorCQlkcm9wX3N1cGVyKHMpOworCQlnb3RvIHJlc3RhcnQ7CisJ fQorCS8qIGlmIChzKSB3ZSBlaXRoZXIgcmV0dXJuIG9yIGdvdG8sIHNvIHdlIGtub3cgcyA9PSBO VUxMIGhlcmUuCisJICogQXQgdGhpcyBwb2ludCwgdGhlcmUgYXJlIG5vIG1vdW50ZWQgZmlsZXN5 c3RlbXMgb24gdGhpcyBkZXZpY2UsCisJICogc28gd2UgcHJldGVuZCB0byBtb3VudCBvbmUuCisJ ICovCisJaWYgKCFsb2NrZnNfc2IpIHsKKwkJc3Bpbl91bmxvY2soJnNiX2xvY2spOworCQlyZXR1 cm4gTlVMTDsKKwl9CisJcyA9IGxvY2tmc19zYjsKKwlzLT5zX2RldiA9IGRldjsKKwlpZiAobG9j a2ZzX2ZzX3R5cGUuZnNfc3VwZXJzLnByZXYgPT0gTlVMTCkKKwkJSU5JVF9MSVNUX0hFQUQoJmxv Y2tmc19mc190eXBlLmZzX3N1cGVycyk7CisJaW5zZXJ0X3N1cGVyKHMsICZsb2NrZnNfZnNfdHlw ZSk7CisJcy0+c19yb290ID0gKHN0cnVjdCBkZW50cnkgKikxOworCS8qIGFsbG9jX3N1cGVyIGdp dmVzIHVzIGEgd3JpdGUgbG9jayBvbiBzX3Vtb3VudCwgdGhpcworCSAqIHdheSB3ZSBrbm93IHRo ZXJlIGFyZSBubyBjb25jdXJyZW50IGxvY2tmcyBob2xkZXJzIGZvciB0aGlzIGRldi4gIAorCSAq IEl0IGFsbG93cyB1cyB0byByZW1vdmUgdGhlIHRlbXAgc3VwZXIgZnJvbSB0aGUgbGlzdCBvZiBz dXBlcnMgCisJICogaW1tZWRpYXRlbHkgd2hlbiB1bmxvY2tmcyBpcyBjYWxsZWQKKwkgKi8KKwly ZXR1cm4gczsKK30KKy8qCisgKiBOb3RlOiBkb24ndCBjaGVjayB0aGUgZGlydHkgZmxhZyBiZWZv cmUgd2FpdGluZywgd2Ugd2FudCB0aGUgbG9jaworICogdG8gaGFwcGVuIGV2ZXJ5IHRpbWUgdGhp cyBpcyBjYWxsZWQuICBkZXYgbXVzdCBiZSBub24temVybworICovCit2b2lkIHN5bmNfc3VwZXJz X2xvY2tmcyhrZGV2X3QgZGV2KQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7CisJc2IgPSBm aW5kX3N1cGVyX2Zvcl9sb2NrZnMoZGV2KTsKKwlpZiAoc2IpIHsKKwkJd3JpdGVfc3VwZXJfbG9j a2ZzKHNiKTsKKwkJLyogdGhlIGRyb3Bfc3VwZXIgaXMgZG9uZSBieSB1bmxvY2tmcyAqLworCX0K K30KKworc3RhdGljIHZvaWQgZHJvcF9zdXBlcl9sb2NrZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpz KQoreworCWlmIChzLT5zX3R5cGUgPT0gJmxvY2tmc19mc190eXBlKSB7CisJCXN0cnVjdCBmaWxl X3N5c3RlbV90eXBlICpmcyA9IHMtPnNfdHlwZTsKKworCQkvKiAKKwkJICogbm9ib2R5IGVsc2Ug aXMgYWxsb3dlZCB0byBncmFiX3N1cGVyKCkgb24gb3VyIHRlbXAKKwkJICovCisJCWlmICghZGVh Y3RpdmF0ZV9zdXBlcihzKSkKKwkJCUJVRygpOworCisJCXNwaW5fbG9jaygmc2JfbG9jayk7CisJ CXMtPnNfcm9vdCA9IE5VTEw7CisJCWxpc3RfZGVsKCZzLT5zX2xpc3QpOworCQlsaXN0X2RlbCgm cy0+c19pbnN0YW5jZXMpOworCQlzcGluX3VubG9jaygmc2JfbG9jayk7CisKKwkJdXBfd3JpdGUo JnMtPnNfdW1vdW50KTsKKwkJcHV0X3N1cGVyKHMpOworCQlwdXRfZmlsZXN5c3RlbShmcyk7CisJ fSBlbHNlCisJCWRyb3Bfc3VwZXIocyk7Cit9CisKK3ZvaWQgdW5sb2NrZnMoa2Rldl90IGRldikK K3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnM7CisJaWYgKCFkZXYpCisJCXJldHVybjsKKworCXNw aW5fbG9jaygmc2JfbG9jayk7CisJcyA9IGZpbmRfc3VwZXIoZGV2KTsKKwlpZiAocykgeworCQkv KiAKKwkJICogZmluZF9zdXBlciBhbmQgdGhlIG9yaWdpbmFsIGxvY2tmcyBjYWxsIGJvdGggaW5j cmVtZW50ZWQKKwkJICogdGhlIHJlZmVyZW5jZSBjb3VudC4gIGRyb3Agb25lIG9mIHRoZW0KKwkJ ICovCisJCXMtPnNfY291bnQtLTsKKwkJc3Bpbl91bmxvY2soJnNiX2xvY2spOworCQlpZiAocy0+ c19yb290KSB7CisJCQlpZiAocy0+c19vcC0+dW5sb2NrZnMpCisJCQkJcy0+c19vcC0+dW5sb2Nr ZnMocyk7CisJCQlkcm9wX3N1cGVyX2xvY2tmcyhzKTsKKwkJCWdvdG8gb3V0OworCQl9IGVsc2Ug eworCQkJcHJpbnRrKCJ1bmxvY2tmczogbm8gc19yb290LCBkZXYgJXNcbiIsIGtkZXZuYW1lKGRl dikpOworCQkJQlVHKCk7CisJCX0KKwl9IGVsc2UgeworCQlwcmludGsoInVubG9ja2ZzOiBubyBz dXBlciBmb3VuZCwgZGV2ICVzXG4iLCBrZGV2bmFtZShkZXYpKTsKKwkJQlVHKCk7CisJfQorCisJ c3Bpbl91bmxvY2soJnNiX2xvY2spOworb3V0OgorCXJldHVybjsKK30KKwogLyoqCiAgKglnZXRf c3VwZXIJLQlnZXQgdGhlIHN1cGVyYmxvY2sgb2YgYSBkZXZpY2UKICAqCUBkZXY6IGRldmljZSB0 byBnZXQgdGhlIHN1cGVyYmxvY2sgZm9yCi0tLSBkaWZmL2luY2x1ZGUvbGludXgvZnMuaAkyMDAz LTA4LTI2IDE0OjIwOjI3LjAwMDAwMDAwMCArMDEwMAorKysgc291cmNlL2luY2x1ZGUvbGludXgv ZnMuaAkyMDAzLTA4LTI2IDE2OjI3OjIxLjAwMDAwMDAwMCArMDEwMApAQCAtMTI3Miw2ICsxMjcy LDcgQEAKIGV4dGVybiBpbnQgc3luY19idWZmZXJzKGtkZXZfdCwgaW50KTsKIGV4dGVybiB2b2lk IHN5bmNfZGV2KGtkZXZfdCk7CiBleHRlcm4gaW50IGZzeW5jX2RldihrZGV2X3QpOworZXh0ZXJu IGludCBmc3luY19kZXZfbG9ja2ZzKGtkZXZfdCk7CiBleHRlcm4gaW50IGZzeW5jX3N1cGVyKHN0 cnVjdCBzdXBlcl9ibG9jayAqKTsKIGV4dGVybiBpbnQgZnN5bmNfbm9fc3VwZXIoa2Rldl90KTsK IGV4dGVybiB2b2lkIHN5bmNfaW5vZGVzX3NiKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKQEAgLTEy ODksNiArMTI5MCw4IEBACiBleHRlcm4gaW50IGZpbGVtYXBfZmRhdGFzeW5jKHN0cnVjdCBhZGRy ZXNzX3NwYWNlICopOwogZXh0ZXJuIGludCBmaWxlbWFwX2ZkYXRhd2FpdChzdHJ1Y3QgYWRkcmVz c19zcGFjZSAqKTsKIGV4dGVybiB2b2lkIHN5bmNfc3VwZXJzKGtkZXZfdCBkZXYsIGludCB3YWl0 KTsKK2V4dGVybiB2b2lkIHN5bmNfc3VwZXJzX2xvY2tmcyhrZGV2X3QpOworZXh0ZXJuIHZvaWQg dW5sb2NrZnMoa2Rldl90KTsKIGV4dGVybiBpbnQgYm1hcChzdHJ1Y3QgaW5vZGUgKiwgaW50KTsK IGV4dGVybiBpbnQgbm90aWZ5X2NoYW5nZShzdHJ1Y3QgZGVudHJ5ICosIHN0cnVjdCBpYXR0ciAq KTsKIGV4dGVybiBpbnQgcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKiwgaW50KTsKLS0tIGRpZmYv a2VybmVsL2tzeW1zLmMJMjAwMy0wOC0yNiAxMzo1OTowNC4wMDAwMDAwMDAgKzAxMDAKKysrIHNv dXJjZS9rZXJuZWwva3N5bXMuYwkyMDAzLTA4LTI2IDE2OjI3OjIxLjAwMDAwMDAwMCArMDEwMApA QCAtMTg5LDYgKzE4OSw4IEBACiBFWFBPUlRfU1lNQk9MKGludmFsaWRhdGVfaW5vZGVfcGFnZXMp OwogRVhQT1JUX1NZTUJPTCh0cnVuY2F0ZV9pbm9kZV9wYWdlcyk7CiBFWFBPUlRfU1lNQk9MKGZz eW5jX2Rldik7CitFWFBPUlRfU1lNQk9MKGZzeW5jX2Rldl9sb2NrZnMpOworRVhQT1JUX1NZTUJP TCh1bmxvY2tmcyk7CiBFWFBPUlRfU1lNQk9MKGZzeW5jX25vX3N1cGVyKTsKIEVYUE9SVF9TWU1C T0wocGVybWlzc2lvbik7CiBFWFBPUlRfU1lNQk9MKHZmc19wZXJtaXNzaW9uKTsKbWlzc2luZyBw YXJ0cyBvZiB0aGUgcHJldmlvdXMgdmZzIHBhdGNoIChtZXJnZSkuCi0tLSBkaWZmL2RyaXZlcnMv bWQvZG0tc25hcHNob3QuYwkyMDAzLTA4LTI2IDE2OjI3OjIxLjAwMDAwMDAwMCArMDEwMAorKysg c291cmNlL2RyaXZlcnMvbWQvZG0tc25hcHNob3QuYwkyMDAzLTA4LTI2IDE2OjI3OjI3LjAwMDAw MDAwMCArMDEwMApAQCAtNTMzLDEzICs1MzMsMTQgQEAKIAkJdGktPmVycm9yID0gIkNhbm5vdCBy ZWdpc3RlciBzbmFwc2hvdCBvcmlnaW4iOwogCQlnb3RvIGJhZDY7CiAJfQorCXVubG9ja2ZzKHMt Pm9yaWdpbi0+ZGV2KTsKIAogCXRpLT5wcml2YXRlID0gczsKIAlyZXR1cm4gMDsKIAogIGJhZDY6 Ci0Ja2NvcHlkX2NsaWVudF9kZXN0cm95KHMtPmtjb3B5ZF9jbGllbnQpOwogCXVubG9ja2ZzKHMt Pm9yaWdpbi0+ZGV2KTsKKwlrY29weWRfY2xpZW50X2Rlc3Ryb3kocy0+a2NvcHlkX2NsaWVudCk7 CiAKICBiYWQ1OgogCXMtPnN0b3JlLmRlc3Ryb3koJnMtPnN0b3JlKTsKTGlmdCB2ZnMgbG9ja2lu ZyB0byBkbV9zdXNwZW5kL3Jlc3VtZS4KLS0tIGRpZmYvZHJpdmVycy9tZC9kbS1zbmFwc2hvdC5j CTIwMDMtMDgtMjYgMTY6Mjc6MjcuMDAwMDAwMDAwICswMTAwCisrKyBzb3VyY2UvZHJpdmVycy9t ZC9kbS1zbmFwc2hvdC5jCTIwMDMtMDgtMjYgMTY6Mjc6MzQuMDAwMDAwMDAwICswMTAwCkBAIC01 MjQsMjIgKzUyNCwxNyBAQAogCQlnb3RvIGJhZDU7CiAJfQogCi0JLyogRmx1c2ggSU8gdG8gdGhl IG9yaWdpbiBkZXZpY2UgKi8KLQlmc3luY19kZXZfbG9ja2ZzKHMtPm9yaWdpbi0+ZGV2KTsKLQog CS8qIEFkZCBzbmFwc2hvdCB0byB0aGUgbGlzdCBvZiBzbmFwc2hvdHMgZm9yIHRoaXMgb3JpZ2lu ICovCiAJaWYgKHJlZ2lzdGVyX3NuYXBzaG90KHMpKSB7CiAJCXIgPSAtRUlOVkFMOwogCQl0aS0+ ZXJyb3IgPSAiQ2Fubm90IHJlZ2lzdGVyIHNuYXBzaG90IG9yaWdpbiI7CiAJCWdvdG8gYmFkNjsK IAl9Ci0JdW5sb2NrZnMocy0+b3JpZ2luLT5kZXYpOwogCiAJdGktPnByaXZhdGUgPSBzOwogCXJl dHVybiAwOwogCiAgYmFkNjoKLQl1bmxvY2tmcyhzLT5vcmlnaW4tPmRldik7CiAJa2NvcHlkX2Ns aWVudF9kZXN0cm95KHMtPmtjb3B5ZF9jbGllbnQpOwogCiAgYmFkNToKLS0tIGRpZmYvZHJpdmVy cy9tZC9kbS5jCTIwMDMtMDgtMjYgMTM6NTk6MDQuMDAwMDAwMDAwICswMTAwCisrKyBzb3VyY2Uv ZHJpdmVycy9tZC9kbS5jCTIwMDMtMDgtMjYgMTY6Mjc6MzQuMDAwMDAwMDAwICswMTAwCkBAIC05 NTEsMTMgKzk1MSwyMyBAQAogCWludCByID0gMDsKIAlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBj dXJyZW50KTsKIAotCWRvd25fd3JpdGUoJm1kLT5sb2NrKTsKKwkvKiBGbHVzaCBJTyB0byB0aGUg b3JpZ2luIGRldmljZSAqLworCWRvd25fcmVhZCgmbWQtPmxvY2spOworCWlmICh0ZXN0X2JpdChE TUZfQkxPQ0tfSU8sICZtZC0+ZmxhZ3MpKSB7CisJCXVwX3JlYWQoJm1kLT5sb2NrKTsKKwkJcmV0 dXJuIC1FSU5WQUw7CisJfQorCisJZnN5bmNfZGV2X2xvY2tmcyhtZC0+ZGV2KTsKKwl1cF9yZWFk KCZtZC0+bG9jayk7CisKIAogCS8qCi0JICogRmlyc3Qgd2Ugc2V0IHRoZSBCTE9DS19JTyBmbGFn IHNvIG5vIG1vcmUgaW9zIHdpbGwgYmUKLQkgKiBtYXBwZWQuCisJICogU2V0IHRoZSBCTE9DS19J TyBmbGFnIHNvIG5vIG1vcmUgaW9zIHdpbGwgYmUgbWFwcGVkLgogCSAqLworCWRvd25fd3JpdGUo Jm1kLT5sb2NrKTsKIAlpZiAodGVzdF9iaXQoRE1GX0JMT0NLX0lPLCAmbWQtPmZsYWdzKSkgewor CQl1bmxvY2tmcyhtZC0+ZGV2KTsKIAkJdXBfd3JpdGUoJm1kLT5sb2NrKTsKIAkJcmV0dXJuIC1F SU5WQUw7CiAJfQpAQCAtOTg2LDYgKzk5Niw3IEBACiAKIAkvKiBkaWQgd2UgZmx1c2ggZXZlcnl0 aGluZyA/ICovCiAJaWYgKGF0b21pY19yZWFkKCZtZC0+cGVuZGluZykpIHsKKwkJdW5sb2NrZnMo bWQtPmRldik7CiAJCWNsZWFyX2JpdChETUZfQkxPQ0tfSU8sICZtZC0+ZmxhZ3MpOwogCQlyID0g LUVJTlRSOwogCX0gZWxzZSB7CkBAIC0xMDE3LDYgKzEwMjgsNyBAQAogCW1kLT5kZWZlcnJlZCA9 IE5VTEw7CiAJdXBfd3JpdGUoJm1kLT5sb2NrKTsKIAorCXVubG9ja2ZzKG1kLT5kZXYpOwogCWZs dXNoX2RlZmVycmVkX2lvKGRlZik7CiAJcnVuX3Rhc2tfcXVldWUoJnRxX2Rpc2spOwogCkNvcnJl Y3QgZXJyb3IgbWVzc2FnZSB3aGVuIHN0YXJ0IGEgZG0tZGFlbW9uLgotLS0gZGlmZi9kcml2ZXJz L21kL2RtLWRhZW1vbi5jCTIwMDMtMDgtMjYgMTM6NTk6MDQuMDAwMDAwMDAwICswMTAwCisrKyBz b3VyY2UvZHJpdmVycy9tZC9kbS1kYWVtb24uYwkyMDAzLTA4LTI2IDE2OjI4OjA1LjAwMDAwMDAw MCArMDEwMApAQCAtODEsNyArODEsNyBAQAogCWRvd24oJmRkLT5zdGFydF9sb2NrKTsKIAlwaWQg PSBrZXJuZWxfdGhyZWFkKGRhZW1vbiwgZGQsIDApOwogCWlmIChwaWQgPD0gMCkgewotCQlETUVS UigiRmFpbGVkIHRvIHN0YXJ0IGtjb3B5ZCB0aHJlYWQiKTsKKwkJRE1FUlIoIkZhaWxlZCB0byBz dGFydCAlcyB0aHJlYWQiLCBuYW1lKTsKIAkJcmV0dXJuIC1FQUdBSU47CiAJfQogCldoZW4gbXVs dGlwbGUgbG9hZCBpb2N0bHMgYXJlIGlzc3VlZCB0aGUgcmVmZXJlbmNlIGNvdW50IG9uIG9sZGVy CiduZXdfdGFibGVzJyB3YXNuJ3QgYmVpbmcgZHJvcHBlZC4gIFtDaHJpc3RvcGhlIFNhb3V0XQot LS0gZGlmZi9kcml2ZXJzL21kL2RtLWlvY3RsLmMJMjAwMy0wOC0yNiAxNjoyNzoxNS4wMDAwMDAw MDAgKzAxMDAKKysrIHNvdXJjZS9kcml2ZXJzL21kL2RtLWlvY3RsLmMJMjAwMy0wOC0yNiAxNjoy ODoxMS4wMDAwMDAwMDAgKzAxMDAKQEAgLTgxNiw2ICs4MTYsOCBAQAogCQlyZXR1cm4gLUVOWElP OwogCX0KIAorCWlmIChoYy0+bmV3X21hcCkKKwkJZG1fdGFibGVfcHV0KGhjLT5uZXdfbWFwKTsK IAloYy0+bmV3X21hcCA9IHQ7CiAJcGFyYW0tPmZsYWdzIHw9IERNX0lOQUNUSVZFX1BSRVNFTlRf RkxBRzsKIApTdG9wIGxhYmVsbGluZyBkbSBhcyAnZXhwZXJpbWVudGFsJy4KLS0tIGRpZmYvZHJp dmVycy9tZC9Db25maWcuaW4JMjAwMy0wOC0yNiAxMzo1OTowNC4wMDAwMDAwMDAgKzAxMDAKKysr IHNvdXJjZS9kcml2ZXJzL21kL0NvbmZpZy5pbgkyMDAzLTA4LTI2IDE2OjI4OjE2LjAwMDAwMDAw MCArMDEwMApAQCAtMTQsOSArMTQsNyBAQAogZGVwX3RyaXN0YXRlICcgIE11bHRpcGF0aCBJL08g c3VwcG9ydCcgQ09ORklHX01EX01VTFRJUEFUSCAkQ09ORklHX0JMS19ERVZfTUQKIAogZGVwX3Ry aXN0YXRlICcgTG9naWNhbCB2b2x1bWUgbWFuYWdlciAoTFZNKSBzdXBwb3J0JyBDT05GSUdfQkxL X0RFVl9MVk0gJENPTkZJR19NRAotaWYgWyAiJENPTkZJR19FWFBFUklNRU5UQUwiID0gInkiIF07 IHRoZW4KLSAgIGRlcF90cmlzdGF0ZSAnIERldmljZS1tYXBwZXIgc3VwcG9ydCAoRVhQRVJJTUVO VEFMKScgQ09ORklHX0JMS19ERVZfRE0gJENPTkZJR19NRAotICAgZGVwX3RyaXN0YXRlICcgIE1p cnJvciAoUkFJRC0xKSBzdXBwb3J0IChFWFBFUklNRU5UQUwpJyBDT05GSUdfQkxLX0RFVl9ETV9N SVJST1IgJENPTkZJR19CTEtfREVWX0RNCi1maQorZGVwX3RyaXN0YXRlICcgRGV2aWNlLW1hcHBl ciBzdXBwb3J0JyBDT05GSUdfQkxLX0RFVl9ETSAkQ09ORklHX01ECitkZXBfdHJpc3RhdGUgJyAg TWlycm9yIChSQUlELTEpIHN1cHBvcnQnIENPTkZJR19CTEtfREVWX0RNX01JUlJPUiAkQ09ORklH X0JMS19ERVZfRE0KIAogZW5kbWVudQpNb3ZlIHJldHJpZXZlX3N0YXR1cyB1cCBzbyBkZXZfd2Fp dCgpIGNhbiB1c2UgaXQuCi0tLSBkaWZmL2RyaXZlcnMvbWQvZG0taW9jdGwuYwkyMDAzLTA4LTI2 IDE2OjI4OjExLjAwMDAwMDAwMCArMDEwMAorKysgc291cmNlL2RyaXZlcnMvbWQvZG0taW9jdGwu YwkyMDAzLTA4LTI2IDE2OjI4OjIxLjAwMDAwMDAwMCArMDEwMApAQCAtNjk5LDYgKzY5OSw2OSBA QAogfQogCiAvKgorICogQnVpbGQgdXAgdGhlIHN0YXR1cyBzdHJ1Y3QgZm9yIGVhY2ggdGFyZ2V0 CisgKi8KK3N0YXRpYyB2b2lkIHJldHJpZXZlX3N0YXR1cyhzdHJ1Y3QgZG1fdGFibGUgKnRhYmxl LCBzdHJ1Y3QgZG1faW9jdGwgKnBhcmFtLAorCQkJICAgIHNpemVfdCBwYXJhbV9zaXplKQorewor CXVuc2lnbmVkIGludCBpLCBudW1fdGFyZ2V0czsKKwlzdHJ1Y3QgZG1fdGFyZ2V0X3NwZWMgKnNw ZWM7CisJY2hhciAqb3V0YnVmLCAqb3V0cHRyOworCXN0YXR1c190eXBlX3QgdHlwZTsKKwlzaXpl X3QgcmVtYWluaW5nLCBsZW4sIHVzZWQgPSAwOworCisJb3V0cHRyID0gb3V0YnVmID0gZ2V0X3Jl c3VsdF9idWZmZXIocGFyYW0sIHBhcmFtX3NpemUsICZsZW4pOworCisJaWYgKHBhcmFtLT5mbGFn cyAmIERNX1NUQVRVU19UQUJMRV9GTEFHKQorCQl0eXBlID0gU1RBVFVTVFlQRV9UQUJMRTsKKwll bHNlCisJCXR5cGUgPSBTVEFUVVNUWVBFX0lORk87CisKKwkvKiBHZXQgYWxsIHRoZSB0YXJnZXQg aW5mbyAqLworCW51bV90YXJnZXRzID0gZG1fdGFibGVfZ2V0X251bV90YXJnZXRzKHRhYmxlKTsK Kwlmb3IgKGkgPSAwOyBpIDwgbnVtX3RhcmdldHM7IGkrKykgeworCQlzdHJ1Y3QgZG1fdGFyZ2V0 ICp0aSA9IGRtX3RhYmxlX2dldF90YXJnZXQodGFibGUsIGkpOworCisJCXJlbWFpbmluZyA9IGxl biAtIChvdXRwdHIgLSBvdXRidWYpOworCQlpZiAocmVtYWluaW5nIDwgc2l6ZW9mKHN0cnVjdCBk bV90YXJnZXRfc3BlYykpIHsKKwkJCXBhcmFtLT5mbGFncyB8PSBETV9CVUZGRVJfRlVMTF9GTEFH OworCQkJYnJlYWs7CisJCX0KKworCQlzcGVjID0gKHN0cnVjdCBkbV90YXJnZXRfc3BlYyAqKSBv dXRwdHI7CisKKwkJc3BlYy0+c3RhdHVzID0gMDsKKwkJc3BlYy0+c2VjdG9yX3N0YXJ0ID0gdGkt PmJlZ2luOworCQlzcGVjLT5sZW5ndGggPSB0aS0+bGVuOworCQlzdHJuY3B5KHNwZWMtPnRhcmdl dF90eXBlLCB0aS0+dHlwZS0+bmFtZSwKKwkJCXNpemVvZihzcGVjLT50YXJnZXRfdHlwZSkpOwor CisJCW91dHB0ciArPSBzaXplb2Yoc3RydWN0IGRtX3RhcmdldF9zcGVjKTsKKwkJcmVtYWluaW5n ID0gbGVuIC0gKG91dHB0ciAtIG91dGJ1Zik7CisKKwkJLyogR2V0IHRoZSBzdGF0dXMvdGFibGUg c3RyaW5nIGZyb20gdGhlIHRhcmdldCBkcml2ZXIgKi8KKwkJaWYgKHRpLT50eXBlLT5zdGF0dXMp IHsKKwkJCWlmICh0aS0+dHlwZS0+c3RhdHVzKHRpLCB0eXBlLCBvdXRwdHIsIHJlbWFpbmluZykp IHsKKwkJCQlwYXJhbS0+ZmxhZ3MgfD0gRE1fQlVGRkVSX0ZVTExfRkxBRzsKKwkJCQlicmVhazsK KwkJCX0KKwkJfSBlbHNlCisJCQlvdXRwdHJbMF0gPSAnXDAnOworCisJCW91dHB0ciArPSBzdHJs ZW4ob3V0cHRyKSArIDE7CisJCXVzZWQgPSBwYXJhbS0+ZGF0YV9zdGFydCArIChvdXRwdHIgLSBv dXRidWYpOworCisJCWFsaWduX3B0cihvdXRwdHIpOworCQlzcGVjLT5uZXh0ID0gb3V0cHRyIC0g b3V0YnVmOworCX0KKworCWlmICh1c2VkKQorCQlwYXJhbS0+ZGF0YV9zaXplID0gdXNlZDsKKwor CXBhcmFtLT50YXJnZXRfY291bnQgPSBudW1fdGFyZ2V0czsKK30KKworLyoKICAqIFdhaXQgZm9y IGEgZGV2aWNlIHRvIHJlcG9ydCBhbiBldmVudAogICovCiBzdGF0aWMgaW50IGRldl93YWl0KHN0 cnVjdCBkbV9pb2N0bCAqcGFyYW0sIHNpemVfdCBwYXJhbV9zaXplKQpAQCAtOTE5LDY5ICs5ODIs NiBAQAogfQogCiAvKgotICogQnVpbGQgdXAgdGhlIHN0YXR1cyBzdHJ1Y3QgZm9yIGVhY2ggdGFy Z2V0Ci0gKi8KLXN0YXRpYyB2b2lkIHJldHJpZXZlX3N0YXR1cyhzdHJ1Y3QgZG1fdGFibGUgKnRh YmxlLCBzdHJ1Y3QgZG1faW9jdGwgKnBhcmFtLAotCQkJICAgIHNpemVfdCBwYXJhbV9zaXplKQot ewotCXVuc2lnbmVkIGludCBpLCBudW1fdGFyZ2V0czsKLQlzdHJ1Y3QgZG1fdGFyZ2V0X3NwZWMg KnNwZWM7Ci0JY2hhciAqb3V0YnVmLCAqb3V0cHRyOwotCXN0YXR1c190eXBlX3QgdHlwZTsKLQlz aXplX3QgcmVtYWluaW5nLCBsZW4sIHVzZWQgPSAwOwotCi0Jb3V0cHRyID0gb3V0YnVmID0gZ2V0 X3Jlc3VsdF9idWZmZXIocGFyYW0sIHBhcmFtX3NpemUsICZsZW4pOwotCi0JaWYgKHBhcmFtLT5m bGFncyAmIERNX1NUQVRVU19UQUJMRV9GTEFHKQotCQl0eXBlID0gU1RBVFVTVFlQRV9UQUJMRTsK LQllbHNlCi0JCXR5cGUgPSBTVEFUVVNUWVBFX0lORk87Ci0KLQkvKiBHZXQgYWxsIHRoZSB0YXJn ZXQgaW5mbyAqLwotCW51bV90YXJnZXRzID0gZG1fdGFibGVfZ2V0X251bV90YXJnZXRzKHRhYmxl KTsKLQlmb3IgKGkgPSAwOyBpIDwgbnVtX3RhcmdldHM7IGkrKykgewotCQlzdHJ1Y3QgZG1fdGFy Z2V0ICp0aSA9IGRtX3RhYmxlX2dldF90YXJnZXQodGFibGUsIGkpOwotCi0JCXJlbWFpbmluZyA9 IGxlbiAtIChvdXRwdHIgLSBvdXRidWYpOwotCQlpZiAocmVtYWluaW5nIDwgc2l6ZW9mKHN0cnVj dCBkbV90YXJnZXRfc3BlYykpIHsKLQkJCXBhcmFtLT5mbGFncyB8PSBETV9CVUZGRVJfRlVMTF9G TEFHOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlzcGVjID0gKHN0cnVjdCBkbV90YXJnZXRfc3BlYyAq KSBvdXRwdHI7Ci0KLQkJc3BlYy0+c3RhdHVzID0gMDsKLQkJc3BlYy0+c2VjdG9yX3N0YXJ0ID0g dGktPmJlZ2luOwotCQlzcGVjLT5sZW5ndGggPSB0aS0+bGVuOwotCQlzdHJuY3B5KHNwZWMtPnRh cmdldF90eXBlLCB0aS0+dHlwZS0+bmFtZSwKLQkJCXNpemVvZihzcGVjLT50YXJnZXRfdHlwZSkp OwotCi0JCW91dHB0ciArPSBzaXplb2Yoc3RydWN0IGRtX3RhcmdldF9zcGVjKTsKLQkJcmVtYWlu aW5nID0gbGVuIC0gKG91dHB0ciAtIG91dGJ1Zik7Ci0KLQkJLyogR2V0IHRoZSBzdGF0dXMvdGFi bGUgc3RyaW5nIGZyb20gdGhlIHRhcmdldCBkcml2ZXIgKi8KLQkJaWYgKHRpLT50eXBlLT5zdGF0 dXMpIHsKLQkJCWlmICh0aS0+dHlwZS0+c3RhdHVzKHRpLCB0eXBlLCBvdXRwdHIsIHJlbWFpbmlu ZykpIHsKLQkJCQlwYXJhbS0+ZmxhZ3MgfD0gRE1fQlVGRkVSX0ZVTExfRkxBRzsKLQkJCQlicmVh azsKLQkJCX0KLQkJfSBlbHNlCi0JCQlvdXRwdHJbMF0gPSAnXDAnOwotCi0JCW91dHB0ciArPSBz dHJsZW4ob3V0cHRyKSArIDE7Ci0JCXVzZWQgPSBwYXJhbS0+ZGF0YV9zdGFydCArIChvdXRwdHIg LSBvdXRidWYpOwotCi0JCWFsaWduX3B0cihvdXRwdHIpOwotCQlzcGVjLT5uZXh0ID0gb3V0cHRy IC0gb3V0YnVmOwotCX0KLQotCWlmICh1c2VkKQotCQlwYXJhbS0+ZGF0YV9zaXplID0gdXNlZDsK LQotCXBhcmFtLT50YXJnZXRfY291bnQgPSBudW1fdGFyZ2V0czsKLX0KLQotLyoKICAqIFJldHVy biB0aGUgc3RhdHVzIG9mIGEgZGV2aWNlIGFzIGEgdGV4dCBzdHJpbmcgZm9yIGVhY2gKICAqIHRh cmdldC4KICAqLwpkZXZfd2FpdCB3YXMgbWVhbnQgdG8gcmV0dXJuIHRhYmxlIHN0YXR1cyBub3Qg ZGV2IHN0YXR1cy4gIFtBbGFzZGFpciBLZXJnb25dCi0tLSBkaWZmL2RyaXZlcnMvbWQvZG0taW9j dGwuYwkyMDAzLTA4LTI2IDE2OjI4OjIxLjAwMDAwMDAwMCArMDEwMAorKysgc291cmNlL2RyaXZl cnMvbWQvZG0taW9jdGwuYwkyMDAzLTA4LTI2IDE2OjI4OjI2LjAwMDAwMDAwMCArMDEwMApAQCAt NzY4LDYgKzc2OCw3IEBACiB7CiAJaW50IHI7CiAJc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kOwor CXN0cnVjdCBkbV90YWJsZSAqdGFibGU7CiAJREVDTEFSRV9XQUlUUVVFVUUod3EsIGN1cnJlbnQp OwogCiAJbWQgPSBmaW5kX2RldmljZShwYXJhbSk7CkBAIC03OTAsNyArNzkxLDE2IEBACiAJICog aGltIGFuZCBzYXZlIGFuIGlvY3RsLgogCSAqLwogCXIgPSBfX2Rldl9zdGF0dXMobWQsIHBhcmFt KTsKKwlpZiAocikKKwkJZ290byBvdXQ7CisKKwl0YWJsZSA9IGRtX2dldF90YWJsZShtZCk7CisJ aWYgKHRhYmxlKSB7CisJCXJldHJpZXZlX3N0YXR1cyh0YWJsZSwgcGFyYW0sIHBhcmFtX3NpemUp OworCQlkbV90YWJsZV9wdXQodGFibGUpOworCX0KIAorIG91dDoKIAlkbV9wdXQobWQpOwogCXJl dHVybiByOwogfQpGaXggZXJyb3IgbWVzc2FnZSB3aGVuIGxpbmVhciB0YXJnZXRzIGdldHMgaGFu ZGVkIG1vcmUgdGhhbiAyIGFyZ3VtZW50cy4KW0FsYXNkYWlyIEtlcmdvbl0KLS0tIGRpZmYvZHJp dmVycy9tZC9kbS1saW5lYXIuYwkyMDAzLTA4LTI2IDEzOjU5OjA0LjAwMDAwMDAwMCArMDEwMAor Kysgc291cmNlL2RyaXZlcnMvbWQvZG0tbGluZWFyLmMJMjAwMy0wOC0yNiAxNjoyODozMS4wMDAw MDAwMDAgKzAxMDAKQEAgLTI3LDcgKzI3LDcgQEAKIAlzdHJ1Y3QgbGluZWFyX2MgKmxjOwogCiAJ aWYgKGFyZ2MgIT0gMikgewotCQl0aS0+ZXJyb3IgPSAiZG0tbGluZWFyOiBOb3QgZW5vdWdoIGFy Z3VtZW50cyI7CisJCXRpLT5lcnJvciA9ICJkbS1saW5lYXI6IEludmFsaWQgYXJndW1lbnQgY291 bnQiOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKU3VwcG9ydCBhbiBhcmJpdHJhcnkgbnVtYmVy IG9mIHRhcmdldCBwYXJhbWV0ZXJzLiAgW0FsYXNkYWlyIEtlcmdvbl0KLS0tIGRpZmYvZHJpdmVy cy9tZC9kbS10YWJsZS5jCTIwMDMtMDgtMjYgMTM6NTk6MDQuMDAwMDAwMDAwICswMTAwCisrKyBz b3VyY2UvZHJpdmVycy9tZC9kbS10YWJsZS5jCTIwMDMtMDgtMjYgMTY6Mjg6MzkuMDAwMDAwMDAw ICswMTAwCkBAIC00NDEsMTIgKzQ0MSwzNiBAQAogfQogCiAvKgorICogVXNlZCB0byBkeW5hbWlj YWxseSBhbGxvY2F0ZSB0aGUgYXJnIGFycmF5LgorICovCitzdGF0aWMgY2hhciAqKnJlYWxsb2Nf YXJndih1bnNpZ25lZCAqYXJyYXlfc2l6ZSwgY2hhciAqKm9sZF9hcmd2KQoreworCWNoYXIgKiph cmd2OworCXVuc2lnbmVkIG5ld19zaXplOworCisJbmV3X3NpemUgPSAqYXJyYXlfc2l6ZSA/ICph cnJheV9zaXplICogMiA6IDY0OworCWFyZ3YgPSBrbWFsbG9jKG5ld19zaXplICogc2l6ZW9mKCph cmd2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKGFyZ3YpIHsKKwkJbWVtY3B5KGFyZ3YsIG9sZF9hcmd2 LCAqYXJyYXlfc2l6ZSAqIHNpemVvZigqYXJndikpOworCQkqYXJyYXlfc2l6ZSA9IG5ld19zaXpl OworCX0KKworCWtmcmVlKG9sZF9hcmd2KTsKKwlyZXR1cm4gYXJndjsKK30KKworLyoKICAqIERl c3RydWN0aXZlbHkgc3BsaXRzIHVwIHRoZSBhcmd1bWVudCBsaXN0IHRvIHBhc3MgdG8gY3RyLgog ICovCi1zdGF0aWMgaW50IHNwbGl0X2FyZ3MoaW50IG1heCwgaW50ICphcmdjLCBjaGFyICoqYXJn diwgY2hhciAqaW5wdXQpCitzdGF0aWMgaW50IHNwbGl0X2FyZ3MoaW50ICphcmdjLCBjaGFyICoq KmFyZ3ZwLCBjaGFyICppbnB1dCkKIHsKLQljaGFyICpzdGFydCwgKmVuZCA9IGlucHV0LCAqb3V0 OworCWNoYXIgKnN0YXJ0LCAqZW5kID0gaW5wdXQsICpvdXQsICoqYXJndiA9IE5VTEw7CisJdW5z aWduZWQgYXJyYXlfc2l6ZSA9IDA7CisKIAkqYXJnYyA9IDA7CisJYXJndiA9IHJlYWxsb2NfYXJn digmYXJyYXlfc2l6ZSwgYXJndik7CisJaWYgKCFhcmd2KQorCQlyZXR1cm4gLUVOT01FTTsKIAog CXdoaWxlICgxKSB7CiAJCXN0YXJ0ID0gZW5kOwpAQCAtNDc1LDggKzQ5OSwxMSBAQAogCQl9CiAK IAkJLyogaGF2ZSB3ZSBhbHJlYWR5IGZpbGxlZCB0aGUgYXJyYXkgPyAqLwotCQlpZiAoKCphcmdj ICsgMSkgPiBtYXgpCi0JCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKCgqYXJnYyArIDEpID4gYXJy YXlfc2l6ZSkgeworCQkJYXJndiA9IHJlYWxsb2NfYXJndigmYXJyYXlfc2l6ZSwgYXJndik7CisJ CQlpZiAoIWFyZ3YpCisJCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KIAogCQkvKiB3ZSBrbm93IHRo aXMgaXMgd2hpdGVzcGFjZSAqLwogCQlpZiAoKmVuZCkKQEAgLTQ4OCw2ICs1MTUsNyBAQAogCQko KmFyZ2MpKys7CiAJfQogCisJKmFyZ3ZwID0gYXJndjsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNDk1 LDcgKzUyMyw3IEBACiAJCQlzZWN0b3JfdCBzdGFydCwgc2VjdG9yX3QgbGVuLCBjaGFyICpwYXJh bXMpCiB7CiAJaW50IHIgPSAtRUlOVkFMLCBhcmdjOwotCWNoYXIgKmFyZ3ZbMzJdOworCWNoYXIg Kiphcmd2OwogCXN0cnVjdCBkbV90YXJnZXQgKnRndDsKIAogCWlmICgociA9IGNoZWNrX3NwYWNl KHQpKSkKQEAgLTUyNCwxMyArNTUyLDE0IEBACiAJCWdvdG8gYmFkOwogCX0KIAotCXIgPSBzcGxp dF9hcmdzKEFSUkFZX1NJWkUoYXJndiksICZhcmdjLCBhcmd2LCBwYXJhbXMpOworCXIgPSBzcGxp dF9hcmdzKCZhcmdjLCAmYXJndiwgcGFyYW1zKTsKIAlpZiAocikgewotCQl0Z3QtPmVycm9yID0g ImNvdWxkbid0IHNwbGl0IHBhcmFtZXRlcnMiOworCQl0Z3QtPmVycm9yID0gImNvdWxkbid0IHNw bGl0IHBhcmFtZXRlcnMgKGluc3VmZmljaWVudCBtZW1vcnkpIjsKIAkJZ290byBiYWQ7CiAJfQog CiAJciA9IHRndC0+dHlwZS0+Y3RyKHRndCwgYXJnYywgYXJndik7CisJa2ZyZWUoYXJndik7CiAJ aWYgKHIpCiAJCWdvdG8gYmFkOwogCkZpeCBWRlMgcGF0Y2gKLS0tIGRpZmYvZnMvYnVmZmVyLmMJ MjAwMy0wOC0yNiAxNjoyNzoyMS4wMDAwMDAwMDAgKzAxMDAKKysrIHNvdXJjZS9mcy9idWZmZXIu YwkyMDAzLTA4LTI2IDE2OjU2OjMxLjAwMDAwMDAwMCArMDEwMApAQCAtMzkzLDcgKzM5Myw3IEBA CiAJKiogYWZ0ZXIgdGhlc2UgYXJlIGRvbmUKIAkqLwogCXN5bmNfaW5vZGVzKGRldik7Ci0JRFFV T1RfU1lOQyhkZXYpOworCURRVU9UX1NZTkNfREVWKGRldik7CiAJLyogaWYgaW5vZGVzIG9yIHF1 b3RhcyBjb3VsZCBiZSBkaXJ0aWVkIGR1cmluZyB0aGUKIAkqKiBzeW5jX3N1cGVyc19sb2NrZnMg Y2FsbCwgdGhlIEZTIGlzIHJlc3BvbnNpYmxlIGZvciBnZXR0aW5nCiAJKiogdGhlbSBvbiBkaXNr LCB3aXRob3V0IGRlYWRsb2NraW5nIGFnYWluc3QgdGhlIGxvY2sKVGhlIGlvY3RsIGludGVyZmFj ZSBhbHdheXMga25vd3MgaG93IG1hbnkgdGFyZ2V0cyBhcmUgZ29pbmcgdG8gYmUgaW4KdGhlIHRh YmxlLCBzbyByZW1vdmUgdGhlIGR5bmFtaWMgYXJyYXkgc2l6aW5nIGNvZGUgaW4gZG0tdGFibGUu Yy4KVGhpcyBmaXhlcyBhIHByb2JsZW0gd2l0aCBsYXJnZSB0YWJsZXMgd2hlcmUgdGhlIGRtX3Rh cmdldCBwb2ludGVyCnBhc3NlZCB0byB0aGUgdGFyZ2V0IGN0ciB3YXMgYmVjb21pbmcgaW52YWxp ZC4KLS0tIGRpZmYvZHJpdmVycy9tZC9kbS1pb2N0bC5jCTIwMDMtMDgtMjYgMTY6Mjg6MjYuMDAw MDAwMDAwICswMTAwCisrKyBzb3VyY2UvZHJpdmVycy9tZC9kbS1pb2N0bC5jCTIwMDMtMDgtMjYg MTY6NTg6MTYuMDAwMDAwMDAwICswMTAwCkBAIC04NzEsNyArODcxLDcgQEAKIAlzdHJ1Y3QgaGFz aF9jZWxsICpoYzsKIAlzdHJ1Y3QgZG1fdGFibGUgKnQ7CiAKLQlyID0gZG1fdGFibGVfY3JlYXRl KCZ0LCBnZXRfbW9kZShwYXJhbSkpOworCXIgPSBkbV90YWJsZV9jcmVhdGUoJnQsIGdldF9tb2Rl KHBhcmFtKSwgcGFyYW0tPnRhcmdldF9jb3VudCk7CiAJaWYgKHIpCiAJCXJldHVybiByOwogCi0t LSBkaWZmL2RyaXZlcnMvbWQvZG0tdGFibGUuYwkyMDAzLTA4LTI2IDE2OjI4OjM5LjAwMDAwMDAw MCArMDEwMAorKysgc291cmNlL2RyaXZlcnMvbWQvZG0tdGFibGUuYwkyMDAzLTA4LTI2IDE3OjA1 OjA2LjAwMDAwMDAwMCArMDEwMApAQCAtMTEyLDQyICsxMTIsNyBAQAogCXJldHVybiAwOwogfQog Ci0vKgotICogaGlnaHMsIGFuZCB0YXJnZXRzIGFyZSBtYW5hZ2VkIGFzIGR5bmFtaWMgYXJyYXlz IGR1cmluZyBhCi0gKiB0YWJsZSBsb2FkLgotICovCi1zdGF0aWMgaW50IGFsbG9jX3RhcmdldHMo c3RydWN0IGRtX3RhYmxlICp0LCB1bnNpZ25lZCBpbnQgbnVtKQotewotCXNlY3Rvcl90ICpuX2hp Z2hzOwotCXN0cnVjdCBkbV90YXJnZXQgKm5fdGFyZ2V0czsKLQlpbnQgbiA9IHQtPm51bV90YXJn ZXRzOwotCi0JLyoKLQkgKiBBbGxvY2F0ZSBib3RoIHRoZSB0YXJnZXQgYXJyYXkgYW5kIG9mZnNl dCBhcnJheSBhdCBvbmNlLgotCSAqLwotCW5faGlnaHMgPSAoc2VjdG9yX3QgKikgdmNhbGxvYyhz aXplb2Yoc3RydWN0IGRtX3RhcmdldCkgKwotCQkJCSAgICAgICBzaXplb2Yoc2VjdG9yX3QpLCBu dW0pOwotCWlmICghbl9oaWdocykKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQluX3RhcmdldHMgPSAo c3RydWN0IGRtX3RhcmdldCAqKSAobl9oaWdocyArIG51bSk7Ci0KLQlpZiAobikgewotCQltZW1j cHkobl9oaWdocywgdC0+aGlnaHMsIHNpemVvZigqbl9oaWdocykgKiBuKTsKLQkJbWVtY3B5KG5f dGFyZ2V0cywgdC0+dGFyZ2V0cywgc2l6ZW9mKCpuX3RhcmdldHMpICogbik7Ci0JfQotCi0JbWVt c2V0KG5faGlnaHMgKyBuLCAtMSwgc2l6ZW9mKCpuX2hpZ2hzKSAqIChudW0gLSBuKSk7Ci0JdmZy ZWUodC0+aGlnaHMpOwotCi0JdC0+bnVtX2FsbG9jYXRlZCA9IG51bTsKLQl0LT5oaWdocyA9IG5f aGlnaHM7Ci0JdC0+dGFyZ2V0cyA9IG5fdGFyZ2V0czsKLQotCXJldHVybiAwOwotfQotCi1pbnQg ZG1fdGFibGVfY3JlYXRlKHN0cnVjdCBkbV90YWJsZSAqKnJlc3VsdCwgaW50IG1vZGUpCitpbnQg ZG1fdGFibGVfY3JlYXRlKHN0cnVjdCBkbV90YWJsZSAqKnJlc3VsdCwgaW50IG1vZGUsIHVuc2ln bmVkIG51bV90YXJnZXRzKQogewogCXN0cnVjdCBkbV90YWJsZSAqdCA9IGttYWxsb2Moc2l6ZW9m KCp0KSwgR0ZQX05PSU8pOwogCkBAIC0xNTgsMTMgKzEyMywxNyBAQAogCUlOSVRfTElTVF9IRUFE KCZ0LT5kZXZpY2VzKTsKIAlhdG9taWNfc2V0KCZ0LT5ob2xkZXJzLCAxKTsKIAotCS8qIGFsbG9j YXRlIGEgc2luZ2xlIG5vZGVzIHdvcnRoIG9mIHRhcmdldHMgdG8gYmVnaW4gd2l0aCAqLwotCWlm IChhbGxvY190YXJnZXRzKHQsIEtFWVNfUEVSX05PREUpKSB7CisKKwkvKiBhbGxvY2F0ZSBib3Ro IHRoZSB0YXJnZXQgYXJyYXkgYW5kIG9mZnNldCBhcnJheSBhdCBvbmNlICovCisJdC0+aGlnaHMg PSAoc2VjdG9yX3QgKikgdmNhbGxvYyhzaXplb2Yoc3RydWN0IGRtX3RhcmdldCkgKworCQkJCQlz aXplb2Yoc2VjdG9yX3QpLCBudW1fdGFyZ2V0cyk7CisJaWYgKCF0LT5oaWdocykgewogCQlrZnJl ZSh0KTsKLQkJdCA9IE5VTEw7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAorCXQtPnRhcmdldHMg PSAoc3RydWN0IGRtX3RhcmdldCAqKSAodC0+aGlnaHMgKyBudW1fdGFyZ2V0cyk7CisJdC0+bnVt X2FsbG9jYXRlZCA9IG51bV90YXJnZXRzOwogCXQtPm1vZGUgPSBtb2RlOwogCSpyZXN1bHQgPSB0 OwogCXJldHVybiAwOwpAQCAtMjI0LDE3ICsxOTMsNiBAQAogfQogCiAvKgotICogQ2hlY2tzIHRv IHNlZSBpZiB3ZSBuZWVkIHRvIGV4dGVuZCBoaWdocyBvciB0YXJnZXRzLgotICovCi1zdGF0aWMg aW5saW5lIGludCBjaGVja19zcGFjZShzdHJ1Y3QgZG1fdGFibGUgKnQpCi17Ci0JaWYgKHQtPm51 bV90YXJnZXRzID49IHQtPm51bV9hbGxvY2F0ZWQpCi0JCXJldHVybiBhbGxvY190YXJnZXRzKHQs IHQtPm51bV9hbGxvY2F0ZWQgKiAyKTsKLQotCXJldHVybiAwOwotfQotCi0vKgogICogQ29udmVy dCBhIGRldmljZSBwYXRoIHRvIGEgZGV2X3QuCiAgKi8KIHN0YXRpYyBpbnQgbG9va3VwX2Rldmlj ZShjb25zdCBjaGFyICpwYXRoLCBrZGV2X3QgKmRldikKQEAgLTUyNiw4ICs0ODQsOCBAQAogCWNo YXIgKiphcmd2OwogCXN0cnVjdCBkbV90YXJnZXQgKnRndDsKIAotCWlmICgociA9IGNoZWNrX3Nw YWNlKHQpKSkKLQkJcmV0dXJuIHI7CisJaWYgKHQtPm51bV90YXJnZXRzID49IHQtPm51bV9hbGxv Y2F0ZWQpCisJCXJldHVybiAtRU5PTUVNOwogCiAJdGd0ID0gdC0+dGFyZ2V0cyArIHQtPm51bV90 YXJnZXRzOwogCW1lbXNldCh0Z3QsIDAsIHNpemVvZigqdGd0KSk7Ci0tLSBkaWZmL2RyaXZlcnMv bWQvZG0uaAkyMDAzLTA4LTI2IDE2OjQ1OjQ0LjAwMDAwMDAwMCArMDEwMAorKysgc291cmNlL2Ry aXZlcnMvbWQvZG0uaAkyMDAzLTA4LTI2IDE3OjA0OjAyLjAwMDAwMDAwMCArMDEwMApAQCAtOTYs NyArOTYsNyBAQAogICogRnVuY3Rpb25zIGZvciBtYW5pcHVsYXRpbmcgYSB0YWJsZS4gIFRhYmxl cyBhcmUgYWxzbyByZWZlcmVuY2UKICAqIGNvdW50ZWQuCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgZG1fdGFi bGVfY3JlYXRlKHN0cnVjdCBkbV90YWJsZSAqKnJlc3VsdCwgaW50IG1vZGUpOworaW50IGRtX3Rh YmxlX2NyZWF0ZShzdHJ1Y3QgZG1fdGFibGUgKipyZXN1bHQsIGludCBtb2RlLCB1bnNpZ25lZCBu dW1fdGFyZ2V0cyk7CiAKIHZvaWQgZG1fdGFibGVfZ2V0KHN0cnVjdCBkbV90YWJsZSAqdCk7CiB2 b2lkIGRtX3RhYmxlX3B1dChzdHJ1Y3QgZG1fdGFibGUgKnQpOwo= ---MOQ1069370480dda4d505efe35ea7d99426e4cbef3ff5--