Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932334AbWAKR3R (ORCPT ); Wed, 11 Jan 2006 12:29:17 -0500 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S932351AbWAKR3R (ORCPT ); Wed, 11 Jan 2006 12:29:17 -0500 Received: from lirs02.phys.au.dk ([130.225.28.43]:9124 "EHLO lirs02.phys.au.dk") by vger.kernel.org with ESMTP id S932334AbWAKR3P (ORCPT ); Wed, 11 Jan 2006 12:29:15 -0500 Date: Wed, 11 Jan 2006 18:25:36 +0100 (MET) From: Esben Nielsen To: Ingo Molnar , Steven Rostedt , david singleton , Subject: RT Mutex patch and tester [PREEMPT_RT] Message-ID: MIME-Version: 1.0 Content-Type: MULTIPART/MIXED; BOUNDARY="202006785-1488366891-1137000336=:16743" Sender: linux-kernel-owner@vger.kernel.org X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 97255 Lines: 1635 This message is in MIME format. The first part should be readable text, while the remaining parts are likely unreadable without MIME-aware tools. Send mail to mime@docserver.cac.washington.edu for more info. --202006785-1488366891-1137000336=:16743 Content-Type: TEXT/PLAIN; charset=US-ASCII I have done 2 things which might be of interrest: I) A rt_mutex unittest suite. It might also be usefull against the generic mutexes. II) I changed the priority inheritance mechanism in rt.c, optaining the following goals: 1) rt_mutex deadlocks doesn't become raw_spinlock deadlocks. And more importantly: futex_deadlocks doesn't become raw_spinlock deadlocks. 2) Time-Predictable code. No matter how deep you nest your locks (kernel or futex) the time spend in irqs or preemption off should be limited. 3) Simpler code. rt.c was kind of messy. Maybe it still is....:-) I have lost: 1) Some speed in the slow slow path. I _might_ have gained some in the normal slow path, though, without meassuring it. Idea: When a task blocks on a lock it adds itself to the wait list and calls schedule(). When it is unblocked it has the lock. Or rather due to grab-locking it has to check again. Therefore the schedule() call is wrapped in a loop. Now when a task is PI boosted, it is at the same time checked if it is blocked on a rt_mutex. If it is, it is unblocked ( wake_up_process_mutex() ). It will now go around in the above loop mentioned above. Within this loop it will now boost the owner of the lock it is blocked on, maybe unblocking the owner, which in turn can boost and unblock the next in the lock chain... At all points there is at least one task boosted to the highest priority required unblocked and working on boosting the next in the lock chain and there is therefore no priority inversion. The boosting of a long list of blocked tasks will clearly take longer than the previous version as there will be task switches. But remember, it is in the slow slow path! And it only occurs when PI boosting is happening on _nested_ locks. What is gained is that the amount of time where irq and preemption is off is limited: One task does it's work with preemption disabled, wakes up the next and enable preemption and schedules. The amount of time spend with preemption disabled is has a clear upper limit, untouched by how complicated and deep the lock structure is. So how many locks do we have to worry about? Two. One for locking the lock. One for locking various PI related data on the task structure, as the pi_waiters list, blocked_on, pending_owner - and also prio. Therefore only lock->wait_lock and sometask->pi_lock will be locked at the same time. And in that order. There is therefore no spinlock deadlocks. And the code is simpler. Because of the simplere code I was able to implement an optimization: Only the first waiter on each lock is member of the owner->pi_waiters. Therefore it is not needed to do any list traversels on neither owner->pi_waiters, not lock->wait_list. Every operation requires touching only removing and/or adding one element to these lists. As for robust futexes: They ought to work out of the box now, blocking in deadlock situations. I have added an entry to /proc//status "BlckOn: ". This can be used to do "post mortem" deadlock detection from userspace. What am I missing: Testing on SMP. I have no SMP machine. The unittest can mimic the SMP somewhat but no unittest can catch _all_ errors. Testing with futexes. ALL_PI_TASKS are always switched on now. This is for making the code simpler. My machine fails to run with CONFIG_DEBUG_DEADLOCKS and CONFIG_DEBUG_PREEMPT on at the same time. I need a serial cabel and on consol over serial to debug it. My screen is too small to see enough there. Figure out more tests to run in my unittester. So why aren't I doing those things before sending the patch? 1) Well my girlfriend comes back tomorrow with our child. I know I will have no time to code anything substential then. 2) I want to make sure Ingo sees this approach before he starts merging preempt_rt and rt_mutex with his now mainstream mutex. Esben --202006785-1488366891-1137000336=:16743 Content-Type: APPLICATION/x-gzip; name="TestRTMutex.tgz" Content-Transfer-Encoding: BASE64 Content-ID: Content-Description: Content-Disposition: attachment; filename="TestRTMutex.tgz" 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 +lk/62f9rJ/1s35mPv8fORuICQCQAQA= --202006785-1488366891-1137000336=:16743 Content-Type: TEXT/PLAIN; charset=US-ASCII; name="pi_lock.patch" Content-Transfer-Encoding: BASE64 Content-ID: Content-Description: Content-Disposition: attachment; filename="pi_lock.patch" ZGlmZiAtdXByIGxpbnV4LTIuNi4xNS1ydDMub3JpZy9mcy9wcm9jL2FycmF5 LmMgbGludXgtMi42LjE1LXJ0My1waXBhdGNoL2ZzL3Byb2MvYXJyYXkuYw0K LS0tIGxpbnV4LTIuNi4xNS1ydDMub3JpZy9mcy9wcm9jL2FycmF5LmMJMjAw Ni0wMS0xMSAwMTo0NToxOC4wMDAwMDAwMDAgKzAxMDANCisrKyBsaW51eC0y LjYuMTUtcnQzLXBpcGF0Y2gvZnMvcHJvYy9hcnJheS5jCTIwMDYtMDEtMTEg MDM6MDI6MTIuMDAwMDAwMDAwICswMTAwDQpAQCAtMjk1LDYgKzI5NSwxNCBA QCBzdGF0aWMgaW5saW5lIGNoYXIgKnRhc2tfY2FwKHN0cnVjdCB0YXNrDQog CQkJICAgIGNhcF90KHAtPmNhcF9lZmZlY3RpdmUpKTsNCiB9DQogDQorDQor c3RhdGljIGNoYXIgKnNob3dfYmxvY2tlZF9vbih0YXNrX3QgKnRhc2ssIGNo YXIgKmJ1ZmZlcikNCit7DQorICBwaWRfdCBwaWQgPSBnZXRfYmxvY2tlZF9v bih0YXNrKTsNCisgIHJldHVybiBidWZmZXIgKyBzcHJpbnRmKGJ1ZmZlciwi Qmxja09uOiAlZFxuIixwaWQpOw0KK30NCisNCisNCiBpbnQgcHJvY19waWRf c3RhdHVzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgY2hhciAqIGJ1ZmZl cikNCiB7DQogCWNoYXIgKiBvcmlnID0gYnVmZmVyOw0KQEAgLTMxMyw2ICsz MjEsNyBAQCBpbnQgcHJvY19waWRfc3RhdHVzKHN0cnVjdCB0YXNrX3N0cnVj dCAqDQogI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfUzM5MCkNCiAJYnVmZmVy ID0gdGFza19zaG93X3JlZ3ModGFzaywgYnVmZmVyKTsNCiAjZW5kaWYNCisJ YnVmZmVyID0gc2hvd19ibG9ja2VkX29uKHRhc2ssYnVmZmVyKTsNCiAJcmV0 dXJuIGJ1ZmZlciAtIG9yaWc7DQogfQ0KIA0KZGlmZiAtdXByIGxpbnV4LTIu Ni4xNS1ydDMub3JpZy9pbmNsdWRlL2xpbnV4L3NjaGVkLmggbGludXgtMi42 LjE1LXJ0My1waXBhdGNoL2luY2x1ZGUvbGludXgvc2NoZWQuaA0KLS0tIGxp bnV4LTIuNi4xNS1ydDMub3JpZy9pbmNsdWRlL2xpbnV4L3NjaGVkLmgJMjAw Ni0wMS0xMSAwMTo0NToxOC4wMDAwMDAwMDAgKzAxMDANCisrKyBsaW51eC0y LjYuMTUtcnQzLXBpcGF0Y2gvaW5jbHVkZS9saW51eC9zY2hlZC5oCTIwMDYt MDEtMTEgMDM6MDI6MTIuMDAwMDAwMDAwICswMTAwDQpAQCAtMTY1Miw2ICsx NjUyLDggQEAgZXh0ZXJuIHZvaWQgcmVjYWxjX3NpZ3BlbmRpbmcodm9pZCk7 DQogDQogZXh0ZXJuIHZvaWQgc2lnbmFsX3dha2VfdXAoc3RydWN0IHRhc2tf c3RydWN0ICp0LCBpbnQgcmVzdW1lX3N0b3BwZWQpOw0KIA0KK2V4dGVybiBw aWRfdCBnZXRfYmxvY2tlZF9vbih0YXNrX3QgKnRhc2spOw0KKw0KIC8qDQog ICogV3JhcHBlcnMgZm9yIHAtPnRocmVhZF9pbmZvLT5jcHUgYWNjZXNzLiBO by1vcCBvbiBVUC4NCiAgKi8NCmRpZmYgLXVwciBsaW51eC0yLjYuMTUtcnQz Lm9yaWcva2VybmVsL2hydGltZXIuYyBsaW51eC0yLjYuMTUtcnQzLXBpcGF0 Y2gva2VybmVsL2hydGltZXIuYw0KLS0tIGxpbnV4LTIuNi4xNS1ydDMub3Jp Zy9rZXJuZWwvaHJ0aW1lci5jCTIwMDYtMDEtMTEgMDE6NDU6MTguMDAwMDAw MDAwICswMTAwDQorKysgbGludXgtMi42LjE1LXJ0My1waXBhdGNoL2tlcm5l bC9ocnRpbWVyLmMJMjAwNi0wMS0xMSAwMzowMjoxMi4wMDAwMDAwMDAgKzAx MDANCkBAIC00MDQsNyArNDA0LDcgQEAga2lja19vZmZfaHJ0aW1lcihzdHJ1 Y3QgaHJ0aW1lciAqdGltZXIsIA0KICMgZGVmaW5lIGhydGltZXJfaHJlc19h Y3RpdmUJCTANCiAjIGRlZmluZSBocmVzX2VucXVldWVfZXhwaXJlZCh0LGIs bikJMA0KICMgZGVmaW5lIGhydGltZXJfY2hlY2tfY2xvY2tzKCkJCWRvIHsg fSB3aGlsZSAoMCkNCi0jIGRlZmluZSBraWNrX29mZl9ocnRpbWVyCQlkbyB7 IH0gd2hpbGUgKDApDQorIyBkZWZpbmUga2lja19vZmZfaHJ0aW1lcih0aW1l cixiYXNlKQlkbyB7IH0gd2hpbGUgKDApDQogDQogI2VuZGlmIC8qICFDT05G SUdfSElHSF9SRVNfVElNRVJTICovDQogDQpkaWZmIC11cHIgbGludXgtMi42 LjE1LXJ0My5vcmlnL2tlcm5lbC9ydC5jIGxpbnV4LTIuNi4xNS1ydDMtcGlw YXRjaC9rZXJuZWwvcnQuYw0KLS0tIGxpbnV4LTIuNi4xNS1ydDMub3JpZy9r ZXJuZWwvcnQuYwkyMDA2LTAxLTExIDAxOjQ1OjE4LjAwMDAwMDAwMCArMDEw MA0KKysrIGxpbnV4LTIuNi4xNS1ydDMtcGlwYXRjaC9rZXJuZWwvcnQuYwky MDA2LTAxLTExIDA5OjA4OjAwLjAwMDAwMDAwMCArMDEwMA0KQEAgLTM2LDcg KzM2LDEwIEBADQogICogICAoYWxzbyBieSBTdGV2ZW4gUm9zdGVkdCkNCiAg KiAgICAtIENvbnZlcnRlZCBzaW5nbGUgcGlfbG9jayB0byBpbmRpdmlkdWFs IHRhc2sgbG9ja3MuDQogICoNCisgKiBCeSBFc2JlbiBOaWVsc2VuOg0KKyAq ICAgIERvaW5nIHByaW9yaXR5IGluaGVyaXRhbmNlIHdpdGggaGVscCBvZiB0 aGUgc2NoZWR1bGVyLg0KICAqLw0KKw0KICNpbmNsdWRlIDxsaW51eC9jb25m aWcuaD4NCiAjaW5jbHVkZSA8bGludXgvcnRfbG9jay5oPg0KICNpbmNsdWRl IDxsaW51eC9zY2hlZC5oPg0KQEAgLTU4LDE4ICs2MSwyNiBAQA0KICAqICBU byBrZWVwIGZyb20gaGF2aW5nIGEgc2luZ2xlIGxvY2sgZm9yIFBJLCBlYWNo IHRhc2sgYW5kIGxvY2sNCiAgKiAgaGFzIHRoZWlyIG93biBsb2NraW5nLiBU aGUgb3JkZXIgaXMgYXMgZm9sbG93czoNCiAgKg0KKyAqICAgICBsb2NrLT53 YWl0X2xvY2sgICAtPiBzb21ldGFzay0+cGlfbG9jaw0KKyAqIFlvdSBzaG91 bGQgb25seSBob2xkIG9uZSB3YWl0X2xvY2sgYW5kIG9uZSBwaV9sb2NrDQog ICogYmxvY2tlZCB0YXNrLT5waV9sb2NrIC0+IGxvY2stPndhaXRfbG9jayAt PiBvd25lciB0YXNrLT5waV9sb2NrLg0KICAqDQotICogVGhpcyBpcyBzYWZl IHNpbmNlIGEgb3duZXIgdGFzayBzaG91bGQgbmV2ZXIgYmxvY2sgb24gYSBs b2NrIHRoYXQNCi0gKiBpcyBvd25lZCBieSBhIGJsb2NraW5nIHRhc2suICBP dGhlcndpc2UgeW91IHdvdWxkIGhhdmUgYSBkZWFkbG9jaw0KLSAqIGluIHRo ZSBub3JtYWwgc3lzdGVtLg0KLSAqIFRoZSBzYW1lIGdvZXMgZm9yIHRoZSBs b2Nrcy4gQSBsb2NrIGhlbGQgYnkgb25lIHRhc2ssIHNob3VsZCBub3QgYmUN Ci0gKiB0YWtlbiBieSB0YXNrIHRoYXQgaG9sZHMgYSBsb2NrIHRoYXQgaXMg YmxvY2tpbmcgdGhpcyBsb2NrJ3Mgb3duZXIuDQorICogbG9jay0+d2FpdF9s b2NrIHByb3RlY3RzIGV2ZXJ5dGhpbmcgaW5zaWRlIHRoZSBsb2NrIGFuZCBh bGwgdGhlIHdhaXRlcnMNCisgKiBvbiBsb2NrLT53YWl0X2xpc3QuDQorICog c29tZXRhc2stPnBpX2xvY2sgcHJvdGVjdHMgZXZlcnl0aGluZyBvbiB0YXNr LT4gcmVsYXRlZCB0byB0aGUgcnRfbXV0ZXguDQorICoNCisgKiBJbnZhcmlh bnRzICAtIG11c3QgYmUgdHJ1ZSB3aGVuIHVubG9jayBsb2NrLT53YWl0X2xv Y2s6DQorICogICBJZiBsb2NrLT53YWl0X2xpc3QgaXMgbm9uLWVtcHR5IA0K KyAqICAgICAxKSBsb2NrX293bmVyKGxvY2spIHBvaW50cyB0byBhIHZhbGlk IHRocmVhZC4NCisgKiAgICAgMikgVGhlIGZpcnN0IGFuZCBvbmx5IHRoZSBm aXJzdCB3YWl0ZXIgb24gdGhlIGxpc3QgbXVzdCBiZSBvbg0KKyAqICAgICAg ICBsb2NrX293bmVyKGxvY2spLT50YXNrLT5waV93YWl0ZXJzLg0KKyAqIA0K KyAqICBBIHdhaXRlciBzdHJ1Y3QgaXMgb24gdGhlIGxvY2stPndhaXRfbGlz dCBpZmYgd2FpdGVyLT50aSE9TlVMTC4NCiAgKg0KLSAqIEEgdGFzayB0aGF0 IGlzIGFib3V0IHRvIGdyYWIgYSBsb2NrIGlzIGZpcnN0IGNvbnNpZGVyZWQg dG8gYmUgYQ0KLSAqIGJsb2NraW5nIHRhc2ssIGV2ZW4gaWYgdGhlIHRhc2sg c3VjY2Vzc2Z1bGx5IGFjcXVpcmVzIHRoZSBsb2NrLg0KLSAqIFRoaXMgaXMg YmVjYXVzZSB0aGUgdGFraW5nIG9mIHRoZSBsb2NrcyBoYXBwZW4gYmVmb3Jl IHRoZQ0KLSAqIHRhc2sgYmVjb21lcyB0aGUgb3duZXIuDQorICogIFN0cmF0 ZWd5IGZvciBib29zdGluZyBsb2NrIGNoYWluOg0KKyAqICAgdGFzayBBIGJs b2NrZWQgb24gbG9jayAxIG93bmVkIGJ5IHRhc2sgQiBibG9ja2VkIG9uIGxv Y2sgMiBldGMuLg0KKyAqICBBIHNldHMgQidzIHByaW8gdXAgYW5kIHdha2Vz IEIuIEIgdHJ5IHRvIGdldCBsb2NrIDIgYWdhaW4gYW5kIGZhaWxzLg0KKyAq ICBCIHRoZXJlZm9yZSBib29zdCBDLg0KICAqLw0KIA0KIC8qDQpAQCAtMTE3 LDggKzEyOCwxMSBAQA0KICAqIFRoaXMgZmxhZyBpcyBnb29kIGZvciBkZWJ1 Z2dpbmcgdGhlIFBJIGNvZGUgLSBpdCBtYWtlcyBhbGwgdGFza3MNCiAgKiBp biB0aGUgc3lzdGVtIGZhbGwgdW5kZXIgUEkgaGFuZGxpbmcuIE5vcm1hbGx5 IG9ubHkgU0NIRURfRklGTy9SUg0KICAqIHRhc2tzIGFyZSBQSS1oYW5kbGVk Og0KKyAqDQorICogSXQgbXVzdCBzdGF5IG9uIGZvciBub3cgYXMgdGhlIGlu dmFyaWFudCB0aGF0IHRoZSBmaXJzdCB3YWl0ZXIgaXMgYWx3YXlzDQorICog b24gdGhlIHBpX3dhaXRlcnMgbGlzdCBpcyBrZWVwZWQgb25seSB0aGlzIHdh eSAoZm9yIG5vdykuDQogICovDQotI2RlZmluZSBBTExfVEFTS1NfUEkgMA0K KyNkZWZpbmUgQUxMX1RBU0tTX1BJIDENCiANCiAjaWZkZWYgQ09ORklHX0RF QlVHX0RFQURMT0NLUw0KICMgZGVmaW5lIF9fRUlQX0RFQ0xfXyAsIHVuc2ln bmVkIGxvbmcgZWlwDQpAQCAtMzExLDcgKzMyNSw3IEBAIHZvaWQgY2hlY2tf cHJlZW1wdF93YWtldXAoc3RydWN0IHRhc2tfc3QNCiAJCX0NCiB9DQogDQot c3RhdGljIGlubGluZSB2b2lkDQorc3RhdGljIHZvaWQNCiBhY2NvdW50X211 dGV4X293bmVyX2Rvd24oc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBzdHJ1 Y3QgcnRfbXV0ZXggKmxvY2spDQogew0KIAlpZiAodGFzay0+bG9ja19jb3Vu dCA+PSBNQVhfTE9DS19TVEFDSykgew0KQEAgLTMyNSw3ICszMzksNyBAQCBh Y2NvdW50X211dGV4X293bmVyX2Rvd24oc3RydWN0IHRhc2tfc3RyDQogCXRh c2stPmxvY2tfY291bnQrKzsNCiB9DQogDQotc3RhdGljIGlubGluZSB2b2lk DQorc3RhdGljIHZvaWQNCiBhY2NvdW50X211dGV4X293bmVyX3VwKHN0cnVj dCB0YXNrX3N0cnVjdCAqdGFzaykNCiB7DQogCWlmICghdGFzay0+bG9ja19j b3VudCkgew0KQEAgLTcyOSwyNSArNzQzLDYgQEAgcmVzdGFydDoNCiAjaWYg QUxMX1RBU0tTX1BJICYmIGRlZmluZWQoQ09ORklHX0RFQlVHX0RFQURMT0NL UykNCiANCiBzdGF0aWMgdm9pZA0KLWNoZWNrX3BpX2xpc3RfcHJlc2VudChz dHJ1Y3QgcnRfbXV0ZXggKmxvY2ssIHN0cnVjdCBydF9tdXRleF93YWl0ZXIg KndhaXRlciwNCi0JCSAgICAgIHN0cnVjdCB0aHJlYWRfaW5mbyAqb2xkX293 bmVyKQ0KLXsNCi0Jc3RydWN0IHJ0X211dGV4X3dhaXRlciAqdzsNCi0NCi0J X3Jhd19zcGluX2xvY2soJm9sZF9vd25lci0+dGFzay0+cGlfbG9jayk7DQot CVRSQUNFX1dBUk5fT05fTE9DS0VEKHBsaXN0X25vZGVfZW1wdHkoJndhaXRl ci0+cGlfbGlzdCkpOw0KLQ0KLQlwbGlzdF9mb3JfZWFjaF9lbnRyeSh3LCAm b2xkX293bmVyLT50YXNrLT5waV93YWl0ZXJzLCBwaV9saXN0KSB7DQotCQlp ZiAodyA9PSB3YWl0ZXIpDQotCQkJZ290byBvazsNCi0JfQ0KLQlUUkFDRV9X QVJOX09OX0xPQ0tFRCgxKTsNCi1vazoNCi0JX3Jhd19zcGluX3VubG9jaygm b2xkX293bmVyLT50YXNrLT5waV9sb2NrKTsNCi0JcmV0dXJuOw0KLX0NCi0N Ci1zdGF0aWMgdm9pZA0KIGNoZWNrX3BpX2xpc3RfZW1wdHkoc3RydWN0IHJ0 X211dGV4ICpsb2NrLCBzdHJ1Y3QgdGhyZWFkX2luZm8gKm9sZF9vd25lcikN CiB7DQogCXN0cnVjdCBydF9tdXRleF93YWl0ZXIgKnc7DQpAQCAtNzgxLDI3 NCArNzc2LDExNiBAQCBjaGVja19waV9saXN0X2VtcHR5KHN0cnVjdCBydF9t dXRleCAqbG9jDQogDQogI2VuZGlmDQogDQotLyoNCi0gKiBNb3ZlIFBJIHdh aXRlcnMgb2YgdGhpcyBsb2NrIHRvIHRoZSBuZXcgb3duZXI6DQotICovDQot c3RhdGljIHZvaWQNCi1jaGFuZ2Vfb3duZXIoc3RydWN0IHJ0X211dGV4ICps b2NrLCBzdHJ1Y3QgdGhyZWFkX2luZm8gKm9sZF9vd25lciwNCi0JICAgICBz dHJ1Y3QgdGhyZWFkX2luZm8gKm5ld19vd25lcikNCi17DQotCXN0cnVjdCBy dF9tdXRleF93YWl0ZXIgKncsICp0bXA7DQotCWludCByZXF1ZXVlZCA9IDAs IHN1bSA9IDA7DQotDQotCWlmIChvbGRfb3duZXIgPT0gbmV3X293bmVyKQ0K LQkJcmV0dXJuOw0KLQ0KLQlTTVBfVFJBQ0VfQlVHX09OX0xPQ0tFRCghc3Bp bl9pc19sb2NrZWQoJm9sZF9vd25lci0+dGFzay0+cGlfbG9jaykpOw0KLQlT TVBfVFJBQ0VfQlVHX09OX0xPQ0tFRCghc3Bpbl9pc19sb2NrZWQoJm5ld19v d25lci0+dGFzay0+cGlfbG9jaykpOw0KLQlwbGlzdF9mb3JfZWFjaF9lbnRy eV9zYWZlKHcsIHRtcCwgJm9sZF9vd25lci0+dGFzay0+cGlfd2FpdGVycywg cGlfbGlzdCkgew0KLQkJaWYgKHctPmxvY2sgPT0gbG9jaykgew0KLQkJCXRy YWNlX3NwZWNpYWxfcGlkKHctPnRpLT50YXNrLT5waWQsIHctPnRpLT50YXNr LT5wcmlvLCB3LT50aS0+dGFzay0+bm9ybWFsX3ByaW8pOw0KLQkJCXBsaXN0 X2RlbCgmdy0+cGlfbGlzdCk7DQotCQkJdy0+cGlfbGlzdC5wcmlvID0gdy0+ dGktPnRhc2stPnByaW87DQotCQkJcGxpc3RfYWRkKCZ3LT5waV9saXN0LCAm bmV3X293bmVyLT50YXNrLT5waV93YWl0ZXJzKTsNCi0JCQlyZXF1ZXVlZCsr Ow0KLQkJfQ0KLQkJc3VtKys7DQotCX0NCi0JdHJhY2Vfc3BlY2lhbChzdW0s IHJlcXVldWVkLCAwKTsNCi19DQogDQotaW50IHBpX3dhbGssIHBpX251bGws IHBpX3ByaW8sIHBpX2luaXRpYWxpemVkOw0KIA0KLS8qDQotICogVGhlIGxv Y2stPndhaXRfbG9jayBhbmQgcC0+cGlfbG9jayBtdXN0IGJlIGhlbGQuDQot ICovDQotc3RhdGljIHZvaWQgcGlfc2V0cHJpbyhzdHJ1Y3QgcnRfbXV0ZXgg KmxvY2ssIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgaW50IHByaW8pDQor c3RhdGljIGludCBjYWxjX3BpX3ByaW8odGFza190ICp0YXNrKQ0KIHsNCi0J c3RydWN0IHJ0X211dGV4ICpsID0gbG9jazsNCi0Jc3RydWN0IHRhc2tfc3Ry dWN0ICpwID0gdGFzazsNCi0JLyoNCi0JICogV2UgZG9uJ3Qgd2FudCB0byBy ZWxlYXNlIHRoZSBwYXJhbWV0ZXJzIGxvY2tzLg0KLQkgKi8NCisJaW50IHBy aW8gPSB0YXNrLT5ub3JtYWxfcHJpbzsNCisJaWYoIXBsaXN0X2hlYWRfZW1w dHkoJnRhc2stPnBpX3dhaXRlcnMpKSB7DQorCQlzdHJ1Y3QgIHJ0X211dGV4 X3dhaXRlciAqd2FpdGVyID0gDQorCQkJcGxpc3RfZmlyc3RfZW50cnkoJnRh c2stPnBpX3dhaXRlcnMsIHN0cnVjdCBydF9tdXRleF93YWl0ZXIsIHBpX2xp c3QpOw0KKwkJcHJpbyA9IG1pbih3YWl0ZXItPnBpX2xpc3QucHJpbyxwcmlv KTsNCiANCi0JaWYgKHVubGlrZWx5KCFwLT5waWQpKSB7DQotCQlwaV9udWxs Kys7DQotCQlyZXR1cm47DQogCX0NCisJcmV0dXJuIHByaW87DQogDQotCVNN UF9UUkFDRV9CVUdfT05fTE9DS0VEKCFzcGluX2lzX2xvY2tlZCgmbG9jay0+ d2FpdF9sb2NrKSk7DQotCVNNUF9UUkFDRV9CVUdfT05fTE9DS0VEKCFzcGlu X2lzX2xvY2tlZCgmcC0+cGlfbG9jaykpOw0KLSNpZmRlZiBDT05GSUdfREVC VUdfREVBRExPQ0tTDQotCXBpX3ByaW8rKzsNCi0JaWYgKHAtPnBvbGljeSAh PSBTQ0hFRF9OT1JNQUwgJiYgcHJpbyA+IG5vcm1hbF9wcmlvKHApKSB7DQot CQlUUkFDRV9PRkYoKTsNCi0NCi0JCXByaW50aygiaHVoPyAoJWQtPiVkPz8p XG4iLCBwLT5wcmlvLCBwcmlvKTsNCi0JCXByaW50aygib3duZXI6XG4iKTsN Ci0JCXByaW50a190YXNrKHApOw0KLQkJcHJpbnRrKCJcbmN1cnJlbnQ6XG4i KTsNCi0JCXByaW50a190YXNrKGN1cnJlbnQpOw0KLQkJcHJpbnRrKCJcbmxv Y2s6XG4iKTsNCi0JCXByaW50a19sb2NrKGxvY2ssIDEpOw0KLQkJZHVtcF9z dGFjaygpOw0KLQkJdHJhY2VfbG9jYWxfaXJxX2Rpc2FibGUodGkpOw0KIAl9 DQotI2VuZGlmDQotCS8qDQotCSAqIElmIHRoZSB0YXNrIGlzIGJsb2NrZWQg b24gc29tZSBvdGhlciB0YXNrIHRoZW4gYm9vc3QgdGhhdA0KLQkgKiBvdGhl ciB0YXNrIChvciB0YXNrcykgdG9vOg0KLQkgKi8NCi0JZm9yICg7Oykgew0K LQkJc3RydWN0IHJ0X211dGV4X3dhaXRlciAqdyA9IHAtPmJsb2NrZWRfb247 DQotI2lmZGVmIENPTkZJR19ERUJVR19ERUFETE9DS1MNCi0JCWludCB3YXNf cnQgPSBydF90YXNrKHApOw0KLSNlbmRpZg0KLQ0KLQkJbXV0ZXhfc2V0cHJp byhwLCBwcmlvKTsNCiANCi0JCS8qDQotCQkgKiBUaGUgQktMIGNhbiByZWFs bHkgYmUgYSBwYWluLiBJdCBjYW4gaGFwcGVuIHdoZXJlIHRoZQ0KLQkJICog QktMIGlzIGJlaW5nIGhlbGQgYnkgb25lIHRhc2sgdGhhdCBpcyBqdXN0IGFi b3V0IHRvDQotCQkgKiBibG9jayBvbiBhbm90aGVyIHRhc2sgdGhhdCBpcyB3 YWl0aW5nIGZvciB0aGUgQktMLg0KLQkJICogVGhpcyBpc24ndCBhIGRlYWRs b2NrLCBzaW5jZSB0aGUgQktMIGlzIHJlbGVhc2VkDQotCQkgKiB3aGVuIHRo ZSB0YXNrIGdvZXMgdG8gc2xlZXAuICBUaGlzIGFsc28gbWVhbnMgdGhhdA0K LQkJICogYWxsIGhvbGRlcnMgb2YgdGhlIEJLTCBhcmUgbm90IGJsb2NrZWQs IG9yIGFyZSBqdXN0DQotCQkgKiBhYm91dCB0byBiZSBibG9ja2VkLg0KLQkJ ICoNCi0JCSAqIEFub3RoZXIgc2lkZS1lZmZlY3Qgb2YgdGhpcyBpcyB0aGF0 IHRoZXJlJ3MgYSBzbWFsbA0KLQkJICogd2luZG93IHdoZXJlIHRoZSBzcGlu bG9ja3MgYXJlIG5vdCBoZWxkLCBhbmQgdGhlIGJsb2NrZWQNCi0JCSAqIHBy b2Nlc3MgaGFzbid0IHJlbGVhc2VkIHRoZSBCS0wuICBTbyBpZiB3ZSBhcmUg Z29pbmcNCi0JCSAqIHRvIGJvb3N0IHRoZSBvd25lciBvZiB0aGUgQktMLCBz dG9wIGFmdGVyIHRoYXQsDQotCQkgKiBzaW5jZSB0aGF0IG93bmVyIGlzIGVp dGhlciBydW5uaW5nLCBvciBhYm91dCB0byBzbGVlcA0KLQkJICogYnV0IGRv bid0IGdvIGFueSBmdXJ0aGVyIG9yIHdlIGFyZSBpbiBhIGxvb3AuDQotCQkg Ki8NCi0JCWlmICghdyB8fCB1bmxpa2VseShwLT5sb2NrX2RlcHRoID49IDAp KQ0KLQkJCWJyZWFrOw0KLQkJLyoNCi0JCSAqIElmIHRoZSB0YXNrIGlzIGJs b2NrZWQgb24gYSBsb2NrLCBhbmQgd2UganVzdCBtYWRlDQotCQkgKiBpdCBS VCwgdGhlbiByZWdpc3RlciB0aGUgdGFzayBpbiB0aGUgUEkgbGlzdCBhbmQN Ci0JCSAqIHJlcXVldWUgaXQgdG8gdGhlIHdhaXQgbGlzdDoNCi0JCSAqLw0K LQ0KLQkJLyoNCi0JCSAqIERvbid0IHVubG9jayB0aGUgb3JpZ2luYWwgbG9j ay0+d2FpdF9sb2NrDQotCQkgKi8NCi0JCWlmIChsICE9IGxvY2spDQotCQkJ X3Jhd19zcGluX3VubG9jaygmbC0+d2FpdF9sb2NrKTsNCi0JCWwgPSB3LT5s b2NrOw0KLQkJVFJBQ0VfQlVHX09OX0xPQ0tFRCghbG9jayk7DQotDQotI2lm ZGVmIENPTkZJR19QUkVFTVBUX1JUDQotCQkvKg0KLQkJICogVGhlIGN1cnJl bnQgdGFzayB0aGF0IGlzIGJsb2NraW5nIGNhbiBhbHNvIHRoZSBvbmUNCi0J CSAqIGhvbGRpbmcgdGhlIEJLTCwgYW5kIGJsb2NraW5nIG9uIGEgdGFzayB0 aGF0IHdhbnRzDQotCQkgKiBpdC4gIFNvIGlmIGl0IHdlcmUgdG8gZ2V0IHRo aXMgZmFyLCB3ZSB3b3VsZCBkZWFkbG9jay4NCi0JCSAqLw0KLQkJaWYgKHVu bGlrZWx5KGwgPT0gJmtlcm5lbF9zZW0ubG9jaykgJiYgbG9ja19vd25lcihs KSA9PSBjdXJyZW50X3RocmVhZF9pbmZvKCkpIHsNCi0JCQkvKg0KLQkJCSAq IE5vIGxvY2tzIGFyZSBoZWxkIGZvciBsb2Nrcywgc28gZm9vbCB0aGUgdW5s b2NraW5nIGNvZGUNCi0JCQkgKiBieSB0aGlua2luZyB0aGUgbGFzdCBsb2Nr IHdhcyB0aGUgb3JpZ2luYWwuDQotCQkJICovDQotCQkJbCA9IGxvY2s7DQot CQkJYnJlYWs7DQorc3RhdGljIHZvaWQgZml4X3ByaW8odGFza190ICp0YXNr KQ0KK3sNCisJaW50IHByaW8gPSBjYWxjX3BpX3ByaW8odGFzayk7DQorCWlm KHRhc2stPnByaW8gPiBwcmlvKSB7DQorCQkvKiBCb29zdCBoaW0gKi8NCisJ CW11dGV4X3NldHByaW8odGFzayxwcmlvKTsNCisJCWlmKHRhc2stPmJsb2Nr ZWRfb24pIHsNCisJCQkvKiBMZXQgaXQgcnVuIHRvIGJvb3N0IGl0J3MgbG9j ayAqLw0KKwkJCXdha2VfdXBfcHJvY2Vzc19tdXRleCh0YXNrKTsNCiAJCX0N Ci0jZW5kaWYNCi0NCi0JCWlmIChsICE9IGxvY2spDQotCQkJX3Jhd19zcGlu X2xvY2soJmwtPndhaXRfbG9jayk7DQotDQotCQlUUkFDRV9CVUdfT05fTE9D S0VEKCFsb2NrX293bmVyKGwpKTsNCi0NCi0JCWlmICghcGxpc3Rfbm9kZV9l bXB0eSgmdy0+cGlfbGlzdCkpIHsNCi0JCQlUUkFDRV9CVUdfT05fTE9DS0VE KCF3YXNfcnQgJiYgIUFMTF9UQVNLU19QSSAmJiAhcnRfdGFzayhwKSk7DQot CQkJLyoNCi0JCQkgKiBJZiB0aGUgdGFzayBpcyBibG9ja2VkIG9uIGEgbG9j aywgYW5kIHdlIGp1c3QgcmVzdG9yZWQNCi0JCQkgKiBpdCBmcm9tIFJUIHRv IG5vbi1SVCB0aGVuIHVucmVnaXN0ZXIgdGhlIHRhc2sgZnJvbQ0KLQkJCSAq IHRoZSBQSSBsaXN0IGFuZCByZXF1ZXVlIGl0IHRvIHRoZSB3YWl0IGxpc3Qu DQotCQkJICoNCi0JCQkgKiAoVE9ETzogdGhpcyBjYW4gYmUgdW5mYWlyIHRv IFNDSEVEX05PUk1BTCB0YXNrcyBpZiB0aGV5DQotCQkJICogICAgICAgIGdl dCBQSSBoYW5kbGVkLikNCi0JCQkgKi8NCi0JCQlwbGlzdF9kZWwoJnctPnBp X2xpc3QpOw0KLQkJfSBlbHNlDQotCQkJVFJBQ0VfQlVHX09OX0xPQ0tFRCgo QUxMX1RBU0tTX1BJIHx8IHJ0X3Rhc2socCkpICYmIHdhc19ydCk7DQotDQot CQlpZiAoQUxMX1RBU0tTX1BJIHx8IHJ0X3Rhc2socCkpIHsNCi0JCQl3LT5w aV9saXN0LnByaW8gPSBwcmlvOw0KLQkJCXBsaXN0X2FkZCgmdy0+cGlfbGlz dCwgJmxvY2tfb3duZXIobCktPnRhc2stPnBpX3dhaXRlcnMpOw0KLQkJfQ0K LQ0KLQkJcGxpc3RfZGVsKCZ3LT5saXN0KTsNCi0JCXctPmxpc3QucHJpbyA9 IHByaW87DQotCQlwbGlzdF9hZGQoJnctPmxpc3QsICZsLT53YWl0X2xpc3Qp Ow0KLQ0KLQkJcGlfd2FsaysrOw0KLQ0KLQkJaWYgKHAgIT0gdGFzaykNCi0J CQlfcmF3X3NwaW5fdW5sb2NrKCZwLT5waV9sb2NrKTsNCi0NCi0JCXAgPSBs b2NrX293bmVyKGwpLT50YXNrOw0KLQkJVFJBQ0VfQlVHX09OX0xPQ0tFRCgh cCk7DQotCQlfcmF3X3NwaW5fbG9jaygmcC0+cGlfbG9jayk7DQotCQkvKg0K LQkJICogSWYgdGhlIGRlcGVuZGVlIGlzIGFscmVhZHkgaGlnaGVyLXByaW8g dGhlbg0KLQkJICogbm8gbmVlZCB0byBib29zdCBpdCwgYW5kIGFsbCBmdXJ0 aGVyIHRhc2tzIGRvd24NCi0JCSAqIHRoZSBkZXBlbmRlbmN5IGNoYWluIGFy ZSBhbHJlYWR5IGJvb3N0ZWQ6DQotCQkgKi8NCi0JCWlmIChwLT5wcmlvIDw9 IHByaW8pDQotCQkJYnJlYWs7DQogCX0NCi0JaWYgKGwgIT0gbG9jaykNCi0J CV9yYXdfc3Bpbl91bmxvY2soJmwtPndhaXRfbG9jayk7DQotCWlmIChwICE9 IHRhc2spDQotCQlfcmF3X3NwaW5fdW5sb2NrKCZwLT5waV9sb2NrKTsNCi19 DQotDQotLyoNCi0gKiBDaGFuZ2UgcHJpb3JpdHkgb2YgYSB0YXNrIHBpIGF3 YXJlDQotICoNCi0gKiBUaGVyZSBhcmUgc2V2ZXJhbCBhc3BlY3RzIHRvIGNv bnNpZGVyOg0KLSAqIC0gdGFzayBpcyBwcmlvcml0eSBib29zdGVkDQotICog LSB0YXNrIGlzIGJsb2NrZWQgb24gYSBtdXRleA0KLSAqDQotICovDQotdm9p ZCBwaV9jaGFuZ2VwcmlvKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgaW50IHBy aW8pDQotew0KLQl1bnNpZ25lZCBsb25nIGZsYWdzOw0KLQlpbnQgb2xkcHJp bzsNCi0NCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnAtPnBpX2xvY2ssZmxhZ3Mp Ow0KLQlpZiAocC0+YmxvY2tlZF9vbikNCi0JCXNwaW5fbG9jaygmcC0+Ymxv Y2tlZF9vbi0+bG9jay0+d2FpdF9sb2NrKTsNCi0NCi0Jb2xkcHJpbyA9IHAt Pm5vcm1hbF9wcmlvOw0KLQlpZiAob2xkcHJpbyA9PSBwcmlvKQ0KLQkJZ290 byBvdXQ7DQotDQotCS8qIFNldCBub3JtYWwgcHJpbyBpbiBhbnkgY2FzZSAq Lw0KLQlwLT5ub3JtYWxfcHJpbyA9IHByaW87DQotDQotCS8qIENoZWNrLCBp ZiB3ZSBjYW4gc2FmZWx5IGxvd2VyIHRoZSBwcmlvcml0eSAqLw0KLQlpZiAo cHJpbyA+IHAtPnByaW8gJiYgIXBsaXN0X2hlYWRfZW1wdHkoJnAtPnBpX3dh aXRlcnMpKSB7DQotCQlzdHJ1Y3QgcnRfbXV0ZXhfd2FpdGVyICp3Ow0KLQkJ dyA9IHBsaXN0X2ZpcnN0X2VudHJ5KCZwLT5waV93YWl0ZXJzLA0KLQkJCQkg ICAgICBzdHJ1Y3QgcnRfbXV0ZXhfd2FpdGVyLCBwaV9saXN0KTsNCi0JCWlm ICh3LT50aS0+dGFzay0+cHJpbyA8IHByaW8pDQotCQkJcHJpbyA9IHctPnRp LT50YXNrLT5wcmlvOw0KKwllbHNlIGlmKHRhc2stPnByaW8gPCBwcmlvKSB7 DQorCQkvKiBQcmlvcml0eSB0b28gaGlnaCAqLw0KKwkJaWYodGFzay0+Ymxv Y2tlZF9vbikgew0KKwkJCS8qIExldCBpdCBydW4gdG8gdW5ib29zdCBpdCdz IGxvY2sgKi8NCisJCQl3YWtlX3VwX3Byb2Nlc3NfbXV0ZXgodGFzayk7DQor CQl9DQorCQllbHNlIHsNCisJCQltdXRleF9zZXRwcmlvKHRhc2sscHJpbyk7 DQorCQl9DQogCX0NCi0NCi0JaWYgKHByaW8gPT0gcC0+cHJpbykNCi0JCWdv dG8gb3V0Ow0KLQ0KLQkvKiBJcyB0YXNrIGJsb2NrZWQgb24gYSBtdXRleCA/ ICovDQotCWlmIChwLT5ibG9ja2VkX29uKQ0KLQkJcGlfc2V0cHJpbyhwLT5i bG9ja2VkX29uLT5sb2NrLCBwLCBwcmlvKTsNCi0JZWxzZQ0KLQkJbXV0ZXhf c2V0cHJpbyhwLCBwcmlvKTsNCi0gb3V0Og0KLQlpZiAocC0+YmxvY2tlZF9v bikNCi0JCXNwaW5fdW5sb2NrKCZwLT5ibG9ja2VkX29uLT5sb2NrLT53YWl0 X2xvY2spOw0KLQ0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwLT5waV9s b2NrLCBmbGFncyk7DQotDQogfQ0KIA0KK2ludCBwaV93YWxrLCBwaV9udWxs LCBwaV9wcmlvLCBwaV9pbml0aWFsaXplZDsNCisNCiAvKg0KICAqIFRoaXMg aXMgY2FsbGVkIHdpdGggYm90aCB0aGUgd2FpdGVyLT50YXNrLT5waV9sb2Nr IGFuZA0KICAqIGxvY2stPndhaXRfbG9jayBoZWxkLg0KICAqLw0KIHN0YXRp YyB2b2lkDQogdGFza19ibG9ja3Nfb25fbG9jayhzdHJ1Y3QgcnRfbXV0ZXhf d2FpdGVyICp3YWl0ZXIsIHN0cnVjdCB0aHJlYWRfaW5mbyAqdGksDQotCQkg ICAgc3RydWN0IHJ0X211dGV4ICpsb2NrIF9fRUlQX0RFQ0xfXykNCisgICAg ICAgICAgICAgICAgICAgIHN0cnVjdCBydF9tdXRleCAqbG9jaywgaW50IHN0 YXRlIF9fRUlQX0RFQ0xfXykNCiB7DQorCXN0cnVjdCBydF9tdXRleF93YWl0 ZXIgKm9sZF9maXJzdDsNCiAJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrID0g dGktPnRhc2s7DQogI2lmZGVmIENPTkZJR19ERUJVR19ERUFETE9DS1MNCiAJ Y2hlY2tfZGVhZGxvY2sobG9jaywgMCwgdGksIGVpcCk7DQogCS8qIG1hcmsg dGhlIGN1cnJlbnQgdGhyZWFkIGFzIGJsb2NrZWQgb24gdGhlIGxvY2sgKi8N CiAJd2FpdGVyLT5laXAgPSBlaXA7DQogI2VuZGlmDQorCVNNUF9UUkFDRV9C VUdfT05fTE9DS0VEKCFzcGluX2lzX2xvY2tlZCgmbG9jay0+d2FpdF9sb2Nr KSk7DQorCVNNUF9UUkFDRV9CVUdfT05fTE9DS0VEKHNwaW5faXNfbG9ja2Vk KCZ0YXNrLT5waV9sb2NrKSk7DQorDQorCWlmKHBsaXN0X2hlYWRfZW1wdHko JmxvY2stPndhaXRfbGlzdCkpIHsNCisJCW9sZF9maXJzdCA9IE5VTEw7DQor CX0NCisJZWxzZSB7DQorCQlvbGRfZmlyc3QgPSBwbGlzdF9maXJzdF9lbnRy eSgmbG9jay0+d2FpdF9saXN0LCBzdHJ1Y3QgcnRfbXV0ZXhfd2FpdGVyLCBs aXN0KTsNCisJfQ0KKw0KKw0KKwlfcmF3X3NwaW5fbG9jaygmdGFzay0+cGlf bG9jayk7DQogCXRhc2stPmJsb2NrZWRfb24gPSB3YWl0ZXI7DQogCXdhaXRl ci0+bG9jayA9IGxvY2s7DQogCXdhaXRlci0+dGkgPSB0aTsNCi0JcGxpc3Rf bm9kZV9pbml0KCZ3YWl0ZXItPnBpX2xpc3QsIHRhc2stPnByaW8pOw0KKyAg ICAgICAgDQorCXsNCisJCS8qIEZpeHVwIHRoZSBwcmlvIG9mIHRoZSAoY3Vy cmVudCkgdGFzayBoZXJlIHdoaWxlIHdlIGhhdmUgdGhlDQorCQkgICBwaV9s b2NrICovDQorCQlpbnQgcHJpbyA9IGNhbGNfcGlfcHJpbyh0YXNrKTsNCisJ CWlmKHByaW8hPXRhc2stPnByaW8pIHsNCisJCQltdXRleF9zZXRwcmlvKHRh c2sscHJpbyk7DQorCQl9DQorCX0NCisNCisJcGxpc3Rfbm9kZV9pbml0KCZ3 YWl0ZXItPmxpc3QsIHRhc2stPnByaW8pOw0KKwlwbGlzdF9hZGQoJndhaXRl ci0+bGlzdCwgJmxvY2stPndhaXRfbGlzdCk7DQorCXNldF90YXNrX3N0YXRl KHRhc2ssIHN0YXRlKTsNCisJX3Jhd19zcGluX3VubG9jaygmdGFzay0+cGlf bG9jayk7DQorDQorCXNldF9sb2NrX293bmVyX3BlbmRpbmcobG9jayk7ICAg DQorI2lmICFBTExfVEFTS1NfUEkNCiAJLyoNCiAJICogQWRkIFNDSEVEX05P Uk1BTCB0YXNrcyB0byB0aGUgZW5kIG9mIHRoZSB3YWl0cXVldWUgKEZJRk8p Og0KIAkgKi8NCi0JU01QX1RSQUNFX0JVR19PTl9MT0NLRUQoIXNwaW5faXNf bG9ja2VkKCZ0YXNrLT5waV9sb2NrKSk7DQotCVNNUF9UUkFDRV9CVUdfT05f TE9DS0VEKCFzcGluX2lzX2xvY2tlZCgmbG9jay0+d2FpdF9sb2NrKSk7DQot I2lmICFBTExfVEFTS1NfUEkNCiAJaWYgKCghcnRfdGFzayh0YXNrKSAmJg0K IAkJIShsb2NrLT5tdXRleF9hdHRyICYgRlVURVhfQVRUUl9QUklPUklUWV9J TkhFUklUQU5DRSkpKSB7DQotCQlwbGlzdF9hZGQoJndhaXRlci0+bGlzdCwg JmxvY2stPndhaXRfbGlzdCk7DQotCQlzZXRfbG9ja19vd25lcl9wZW5kaW5n KGxvY2spOw0KIAkJcmV0dXJuOw0KIAl9DQogI2VuZGlmDQotCV9yYXdfc3Bp bl9sb2NrKCZsb2NrX293bmVyKGxvY2spLT50YXNrLT5waV9sb2NrKTsNCi0J cGxpc3RfYWRkKCZ3YWl0ZXItPnBpX2xpc3QsICZsb2NrX293bmVyKGxvY2sp LT50YXNrLT5waV93YWl0ZXJzKTsNCi0JLyoNCi0JICogQWRkIFJUIHRhc2tz IHRvIHRoZSBoZWFkOg0KLQkgKi8NCi0JcGxpc3RfYWRkKCZ3YWl0ZXItPmxp c3QsICZsb2NrLT53YWl0X2xpc3QpOw0KLQlzZXRfbG9ja19vd25lcl9wZW5k aW5nKGxvY2spOw0KLQkvKg0KLQkgKiBJZiB0aGUgd2FpdGVyIGhhcyBoaWdo ZXIgcHJpb3JpdHkgdGhhbiB0aGUgb3duZXINCi0JICogdGhlbiB0ZW1wb3Jh cmlseSBib29zdCB0aGUgb3duZXI6DQotCSAqLw0KLQlpZiAodGFzay0+cHJp byA8IGxvY2tfb3duZXIobG9jayktPnRhc2stPnByaW8pDQotCQlwaV9zZXRw cmlvKGxvY2ssIGxvY2tfb3duZXIobG9jayktPnRhc2ssIHRhc2stPnByaW8p Ow0KLQlfcmF3X3NwaW5fdW5sb2NrKCZsb2NrX293bmVyKGxvY2spLT50YXNr LT5waV9sb2NrKTsNCisJaWYod2FpdGVyID09DQorCSAgIHBsaXN0X2ZpcnN0 X2VudHJ5KCZsb2NrLT53YWl0X2xpc3QsIHN0cnVjdCBydF9tdXRleF93YWl0 ZXIsIGxpc3QpKSB7DQorCQl0YXNrX3QgKm93bmVyID0gbG9ja19vd25lcihs b2NrKS0+dGFzazsNCisNCisJCXBsaXN0X25vZGVfaW5pdCgmd2FpdGVyLT5w aV9saXN0LCB0YXNrLT5wcmlvKTsNCisNCisJCV9yYXdfc3Bpbl9sb2NrKCZv d25lci0+cGlfbG9jayk7DQorCQlpZihvbGRfZmlyc3QpIHsNCisJCQlwbGlz dF9kZWwoJm9sZF9maXJzdC0+cGlfbGlzdCk7DQorCQl9DQorCQlwbGlzdF9h ZGQoJndhaXRlci0+cGlfbGlzdCwgJm93bmVyLT5waV93YWl0ZXJzKTsNCisJ CWZpeF9wcmlvKG93bmVyKTsNCisNCisJCV9yYXdfc3Bpbl91bmxvY2soJm93 bmVyLT5waV9sb2NrKTsNCisJfQ0KIH0NCiANCiAvKg0KQEAgLTEwODUsMjAg KzkyMiw0NSBAQCBFWFBPUlRfU1lNQk9MKF9faW5pdF9yd3NlbSk7DQogI2Vu ZGlmDQogDQogLyoNCi0gKiBUaGlzIG11c3QgYmUgY2FsbGVkIHdpdGggYm90 aCB0aGUgb2xkX293bmVyIGFuZCBuZXdfb3duZXIgcGlfbG9ja3MgaGVsZC4N Ci0gKiBBcyB3ZWxsIGFzIHRoZSBsb2NrLT53YWl0X2xvY2suDQorICogVGhp cyBtdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBsb2NrLT53YWl0X2xvY2sgaGVs ZC4NCisgKiBNdXN0OiBuZXdfb3duZXIhPU5VTEwNCisgKiBMaWtlbHk6IG9s ZF9vd25lcj09TlVMTA0KICAqLw0KLXN0YXRpYyBpbmxpbmUNCitzdGF0aWMg DQogdm9pZCBzZXRfbmV3X293bmVyKHN0cnVjdCBydF9tdXRleCAqbG9jaywg c3RydWN0IHRocmVhZF9pbmZvICpvbGRfb3duZXIsDQogCQkJc3RydWN0IHRo cmVhZF9pbmZvICpuZXdfb3duZXIgX19FSVBfREVDTF9fKQ0KIHsNCisJU01Q X1RSQUNFX0JVR19PTl9MT0NLRUQoc3Bpbl9pc19sb2NrZWQoJm9sZF9vd25l ci0+dGFzay0+cGlfbG9jaykpOw0KKwlTTVBfVFJBQ0VfQlVHX09OX0xPQ0tF RChzcGluX2lzX2xvY2tlZCgmbmV3X293bmVyLT50YXNrLT5waV9sb2NrKSk7 DQorCVNNUF9UUkFDRV9CVUdfT05fTE9DS0VEKCFzcGluX2lzX2xvY2tlZCgm bG9jay0+d2FpdF9sb2NrKSk7DQorDQogCWlmIChuZXdfb3duZXIpDQogCQl0 cmFjZV9zcGVjaWFsX3BpZChuZXdfb3duZXItPnRhc2stPnBpZCwgbmV3X293 bmVyLT50YXNrLT5wcmlvLCAwKTsNCi0JaWYgKHVubGlrZWx5KG9sZF9vd25l cikpDQotCQljaGFuZ2Vfb3duZXIobG9jaywgb2xkX293bmVyLCBuZXdfb3du ZXIpOw0KKwlpZihvbGRfb3duZXIpIHsNCisJCWFjY291bnRfbXV0ZXhfb3du ZXJfdXAob2xkX293bmVyLT50YXNrKTsNCisJfQ0KKyNpZmRlZiBDT05GSUdf REVCVUdfREVBRExPQ0tTDQorCWlmICh0cmFjZV9vbiAmJiB1bmxpa2VseShv bGRfb3duZXIpKSB7DQorCQlUUkFDRV9XQVJOX09OX0xPQ0tFRChsaXN0X2Vt cHR5KCZsb2NrLT5oZWxkX2xpc3QpKTsNCisJCWxpc3RfZGVsX2luaXQoJmxv Y2stPmhlbGRfbGlzdCk7DQorCX0NCisjZW5kaWYNCiAJbG9jay0+b3duZXIg PSBuZXdfb3duZXI7DQotCWlmICghcGxpc3RfaGVhZF9lbXB0eSgmbG9jay0+ d2FpdF9saXN0KSkNCisJaWYgKCFwbGlzdF9oZWFkX2VtcHR5KCZsb2NrLT53 YWl0X2xpc3QpKSB7DQorCQlzdHJ1Y3QgcnRfbXV0ZXhfd2FpdGVyICpuZXh0 ID0NCisJCQlwbGlzdF9maXJzdF9lbnRyeSgmbG9jay0+d2FpdF9saXN0LCAN CisJCQkJCSAgc3RydWN0IHJ0X211dGV4X3dhaXRlciwgbGlzdCk7DQorCQlp ZihvbGRfb3duZXIpIHsNCisJCQlfcmF3X3NwaW5fbG9jaygmb2xkX293bmVy LT50YXNrLT5waV9sb2NrKTsNCisJCQlwbGlzdF9kZWwoJm5leHQtPnBpX2xp c3QpOw0KKwkJCV9yYXdfc3Bpbl91bmxvY2soJm9sZF9vd25lci0+dGFzay0+ cGlfbG9jayk7DQorCQl9DQorCQlfcmF3X3NwaW5fbG9jaygmbmV3X293bmVy LT50YXNrLT5waV9sb2NrKTsNCisJCXBsaXN0X2FkZCgmbmV4dC0+cGlfbGlz dCwgJm5ld19vd25lci0+dGFzay0+cGlfd2FpdGVycyk7DQogCQlzZXRfbG9j a19vd25lcl9wZW5kaW5nKGxvY2spOw0KKwkJX3Jhd19zcGluX3VubG9jaygm bmV3X293bmVyLT50YXNrLT5waV9sb2NrKTsNCisJfQ0KKyAgICAgICAgDQog I2lmZGVmIENPTkZJR19ERUJVR19ERUFETE9DS1MNCiAJaWYgKHRyYWNlX29u KSB7DQogCQlUUkFDRV9XQVJOX09OX0xPQ0tFRCghbGlzdF9lbXB0eSgmbG9j ay0+aGVsZF9saXN0KSk7DQpAQCAtMTEwOSw2ICs5NzEsMzIgQEAgdm9pZCBz ZXRfbmV3X293bmVyKHN0cnVjdCBydF9tdXRleCAqbG9jaw0KIAlhY2NvdW50 X211dGV4X293bmVyX2Rvd24obmV3X293bmVyLT50YXNrLCBsb2NrKTsNCiB9 DQogDQorDQorc3RhdGljIGlubGluZSB2b2lkIHJlbW92ZV93YWl0ZXIoc3Ry dWN0IHJ0X211dGV4ICpsb2NrLCANCisgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBzdHJ1Y3QgcnRfbXV0ZXhfd2FpdGVyICp3YWl0ZXIsIA0K KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaXhwcmlv KQ0KK3sNCisJdGFza190ICpvd25lciA9IGxvY2tfb3duZXIobG9jaykgPyBs b2NrX293bmVyKGxvY2spLT50YXNrIDogTlVMTDsNCisJaW50IGZpcnN0ID0g KHdhaXRlcj09cGxpc3RfZmlyc3RfZW50cnkoJmxvY2stPndhaXRfbGlzdCwg DQorCQkJCQkgICAgICAgc3RydWN0IHJ0X211dGV4X3dhaXRlciwgbGlzdCkp Ow0KKyAgICAgICAgDQorCXBsaXN0X2RlbCgmd2FpdGVyLT5saXN0KTsNCisJ aWYoZmlyc3QgJiYgb3duZXIpIHsNCisJCV9yYXdfc3Bpbl9sb2NrKCZvd25l ci0+cGlfbG9jayk7DQorCQlwbGlzdF9kZWwoJndhaXRlci0+cGlfbGlzdCk7 DQorCQlpZighcGxpc3RfaGVhZF9lbXB0eSgmbG9jay0+d2FpdF9saXN0KSkg ew0KKwkJCXN0cnVjdCBydF9tdXRleF93YWl0ZXIgKm5leHQgPQ0KKwkJCQlw bGlzdF9maXJzdF9lbnRyeSgmbG9jay0+d2FpdF9saXN0LCANCisJCQkJCQkg IHN0cnVjdCBydF9tdXRleF93YWl0ZXIsIGxpc3QpOw0KKwkJCXBsaXN0X2Fk ZCgmbmV4dC0+cGlfbGlzdCwgJm93bmVyLT5waV93YWl0ZXJzKTsgICAgICAg ICAgICAgICAgICANCisJCX0NCisJCWlmKGZpeHByaW8pIHsNCisJCQlmaXhf cHJpbyhvd25lcik7DQorCQl9DQorCQlfcmF3X3NwaW5fdW5sb2NrKCZvd25l ci0+cGlfbG9jayk7DQorCX0NCit9DQorDQogLyoNCiAgKiBoYW5kbGUgdGhl IGxvY2sgcmVsZWFzZSB3aGVuIHByb2Nlc3NlcyBibG9ja2VkIG9uIGl0IHRo YXQgY2FuIG5vdyBydW4NCiAgKiAtIHRoZSBzcGlubG9jayBtdXN0IGJlIGhl bGQgYnkgdGhlIGNhbGxlcg0KQEAgLTExMjMsNzAgKzEwMTEsMzQgQEAgcGlj a19uZXdfb3duZXIoc3RydWN0IHJ0X211dGV4ICpsb2NrLCBzdA0KIAlzdHJ1 Y3QgdGhyZWFkX2luZm8gKm5ld19vd25lcjsNCiANCiAJU01QX1RSQUNFX0JV R19PTl9MT0NLRUQoIXNwaW5faXNfbG9ja2VkKCZsb2NrLT53YWl0X2xvY2sp KTsNCisJU01QX1RSQUNFX0JVR19PTl9MT0NLRUQoc3Bpbl9pc19sb2NrZWQo Jm9sZF9vd25lci0+dGFzay0+cGlfbG9jaykpOw0KKw0KIAkvKg0KIAkgKiBH ZXQgdGhlIGhpZ2hlc3QgcHJpbyBvbmU6DQogCSAqDQogCSAqIChzYW1lLXBy aW8gUlQgdGFza3MgZ28gRklGTykNCiAJICovDQogCXdhaXRlciA9IHBsaXN0 X2ZpcnN0X2VudHJ5KCZsb2NrLT53YWl0X2xpc3QsIHN0cnVjdCBydF9tdXRl eF93YWl0ZXIsIGxpc3QpOw0KLQ0KLSNpZmRlZiBDT05GSUdfU01QDQotIHRy eV9hZ2FpbjoNCi0jZW5kaWYNCisJcmVtb3ZlX3dhaXRlcihsb2NrLHdhaXRl ciwwKTsNCiAJdHJhY2Vfc3BlY2lhbF9waWQod2FpdGVyLT50aS0+dGFzay0+ cGlkLCB3YWl0ZXItPnRpLT50YXNrLT5wcmlvLCAwKTsNCiANCi0jaWYgQUxM X1RBU0tTX1BJDQotCWNoZWNrX3BpX2xpc3RfcHJlc2VudChsb2NrLCB3YWl0 ZXIsIG9sZF9vd25lcik7DQotI2VuZGlmDQogCW5ld19vd25lciA9IHdhaXRl ci0+dGk7DQotCS8qDQotCSAqIFRoZSBuZXcgb3duZXIgaXMgc3RpbGwgYmxv Y2tlZCBvbiB0aGlzIGxvY2ssIHNvIHdlDQotCSAqIG11c3QgcmVsZWFzZSB0 aGUgbG9jay0+d2FpdF9sb2NrIGJlZm9yZSBncmFiaW5nDQotCSAqIHRoZSBu ZXdfb3duZXIgbG9jay4NCi0JICovDQotCV9yYXdfc3Bpbl91bmxvY2soJmxv Y2stPndhaXRfbG9jayk7DQotCV9yYXdfc3Bpbl9sb2NrKCZuZXdfb3duZXIt PnRhc2stPnBpX2xvY2spOw0KLQlfcmF3X3NwaW5fbG9jaygmbG9jay0+d2Fp dF9sb2NrKTsNCi0JLyoNCi0JICogSW4gdGhpcyBzcGxpdCBzZWNvbmQgb2Yg cmVsZWFzaW5nIHRoZSBsb2NrLCBhIGhpZ2ggcHJpb3JpdHkNCi0JICogcHJv Y2VzcyBjb3VsZCBoYXZlIGNvbWUgYWxvbmcgYW5kIGJsb2NrZWQgYXMgd2Vs bC4NCi0JICovDQotI2lmZGVmIENPTkZJR19TTVANCi0Jd2FpdGVyID0gcGxp c3RfZmlyc3RfZW50cnkoJmxvY2stPndhaXRfbGlzdCwgc3RydWN0IHJ0X211 dGV4X3dhaXRlciwgbGlzdCk7DQotCWlmICh1bmxpa2VseSh3YWl0ZXItPnRp ICE9IG5ld19vd25lcikpIHsNCi0JCV9yYXdfc3Bpbl91bmxvY2soJm5ld19v d25lci0+dGFzay0+cGlfbG9jayk7DQotCQlnb3RvIHRyeV9hZ2FpbjsNCi0J fQ0KLSNpZmRlZiBDT05GSUdfUFJFRU1QVF9SVA0KLQkvKg0KLQkgKiBPbmNl IGFnYWluIHRoZSBCS0wgY29tZXMgdG8gcGxheS4gIFNpbmNlIHRoZSBCS0wg Y2FuIGJlIGdyYWJiZWQgYW5kIHJlbGVhc2VkDQotCSAqIG91dCBvZiB0aGUg bm9ybWFsIFAxLT5MMS0+UDIgb3JkZXIsIHRoZXJlJ3MgYSBjaGFuY2UgdGhh dCBzb21lb25lIGhhcyB0aGUNCi0JICogQktMIG93bmVyJ3MgbG9jayBhbmQg aXMgd2FpdGluZyBvbiB0aGUgbmV3IG93bmVyIGxvY2suDQotCSAqLw0KLQlp ZiAodW5saWtlbHkobG9jayA9PSAma2VybmVsX3NlbS5sb2NrKSkgew0KLQkJ aWYgKCFfcmF3X3NwaW5fdHJ5bG9jaygmb2xkX293bmVyLT50YXNrLT5waV9s b2NrKSkgew0KLQkJCV9yYXdfc3Bpbl91bmxvY2soJm5ld19vd25lci0+dGFz ay0+cGlfbG9jayk7DQotCQkJZ290byB0cnlfYWdhaW47DQotCQl9DQotCX0g ZWxzZQ0KLSNlbmRpZg0KLSNlbmRpZg0KLQkJX3Jhd19zcGluX2xvY2soJm9s ZF9vd25lci0+dGFzay0+cGlfbG9jayk7DQotDQotCXBsaXN0X2RlbCgmd2Fp dGVyLT5saXN0KTsNCi0JcGxpc3RfZGVsKCZ3YWl0ZXItPnBpX2xpc3QpOw0K LQl3YWl0ZXItPnBpX2xpc3QucHJpbyA9IHdhaXRlci0+dGktPnRhc2stPnBy aW87DQogDQogCXNldF9uZXdfb3duZXIobG9jaywgb2xkX293bmVyLCBuZXdf b3duZXIgX19XX0VJUF9fKHdhaXRlcikpOw0KKw0KKwlfcmF3X3NwaW5fbG9j aygmbmV3X293bmVyLT50YXNrLT5waV9sb2NrKTsNCiAJLyogRG9uJ3QgdG91 Y2ggd2FpdGVyIGFmdGVyIC0+dGFzayBoYXMgYmVlbiBOVUxMZWQgKi8NCiAJ bWIoKTsNCiAJd2FpdGVyLT50aSA9IE5VTEw7DQogCW5ld19vd25lci0+dGFz ay0+YmxvY2tlZF9vbiA9IE5VTEw7DQotCVRSQUNFX1dBUk5fT04oc2F2ZV9z dGF0ZSAhPSBsb2NrLT5zYXZlX3N0YXRlKTsNCi0NCi0JX3Jhd19zcGluX3Vu bG9jaygmb2xkX293bmVyLT50YXNrLT5waV9sb2NrKTsNCisjaWZkZWYgQ0FQ VFVSRV9MT0NLDQorCW5ld19vd25lci0+dGFzay0+cnRfZmxhZ3MgfD0gUlRf UEVORE9XTkVSOw0KKwluZXdfb3duZXItPnRhc2stPnBlbmRpbmdfb3duZXIg PSBsb2NrOw0KKyNlbmRpZg0KIAlfcmF3X3NwaW5fdW5sb2NrKCZuZXdfb3du ZXItPnRhc2stPnBpX2xvY2spOw0KIA0KKwlUUkFDRV9XQVJOX09OKHNhdmVf c3RhdGUgIT0gbG9jay0+c2F2ZV9zdGF0ZSk7DQorDQogCXJldHVybiBuZXdf b3duZXI7DQogfQ0KIA0KQEAgLTEyMjIsNiArMTA3NCwzNCBAQCBzdGF0aWMg aW5saW5lIHZvaWQgaW5pdF9saXN0cyhzdHJ1Y3QgcnRfDQogI2VuZGlmDQog fQ0KIA0KKw0KK3N0YXRpYyB2b2lkIHJlbW92ZV9wZW5kaW5nX293bmVyX25v bG9jayh0YXNrX3QgKm93bmVyKQ0KK3sNCisJb3duZXItPnJ0X2ZsYWdzICY9 IH5SVF9QRU5ET1dORVI7DQorCW93bmVyLT5wZW5kaW5nX293bmVyID0gTlVM TDsNCit9DQorDQorc3RhdGljIHZvaWQgcmVtb3ZlX3BlbmRpbmdfb3duZXIo dGFza190ICpvd25lcikNCit7DQorCV9yYXdfc3Bpbl9sb2NrKCZvd25lci0+ cGlfbG9jayk7DQorCXJlbW92ZV9wZW5kaW5nX293bmVyX25vbG9jayhvd25l cik7DQorCV9yYXdfc3Bpbl91bmxvY2soJm93bmVyLT5waV9sb2NrKTsNCit9 DQorDQoraW50IHRhc2tfaXNfcGVuZGluZ19vd25lcl9ub2xvY2soc3RydWN0 IHRocmVhZF9pbmZvICAqb3duZXIsIA0KKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHN0cnVjdCBydF9tdXRleCAqbG9jaykNCit7DQorCXJl dHVybiAobG9ja19vd25lcihsb2NrKSA9PSBvd25lcikgJiYNCisJCShvd25l ci0+dGFzay0+cGVuZGluZ19vd25lciA9PSBsb2NrKTsNCit9DQoraW50IHRh c2tfaXNfcGVuZGluZ19vd25lcihzdHJ1Y3QgdGhyZWFkX2luZm8gICpvd25l ciwgc3RydWN0IHJ0X211dGV4ICpsb2NrKQ0KK3sNCisJaW50IHJlczsNCisJ X3Jhd19zcGluX2xvY2soJm93bmVyLT50YXNrLT5waV9sb2NrKTsNCisJcmVz ID0gdGFza19pc19wZW5kaW5nX293bmVyX25vbG9jayhvd25lcixsb2NrKTsN CisJX3Jhd19zcGluX3VubG9jaygmb3duZXItPnRhc2stPnBpX2xvY2spOw0K KwlyZXR1cm4gcmVzOw0KK30NCiAvKg0KICAqIFRyeSB0byBncmFiIGEgbG9j aywgYW5kIGlmIGl0IGlzIG93bmVkIGJ1dCB0aGUgb3duZXINCiAgKiBoYXNu J3Qgd29rZW4gdXAgeWV0LCBzZWUgaWYgd2UgY2FuIHN0ZWFsIGl0Lg0KQEAg LTEyMzMsNiArMTExMyw4IEBAIHN0YXRpYyBpbnQgX19ncmFiX2xvY2soc3Ry dWN0IHJ0X211dGV4ICoNCiB7DQogI2lmbmRlZiBDQVBUVVJFX0xPQ0sNCiAJ cmV0dXJuIDA7DQorI2Vsc2UNCisJaW50IHJlcyA9IDA7DQogI2VuZGlmDQog CS8qDQogCSAqIFRoZSBsb2NrIGlzIG93bmVkLCBidXQgbm93IHRlc3QgdG8g c2VlIGlmIHRoZSBvd25lcg0KQEAgLTEyNDEsMTExICsxMTIzLDM2IEBAIHN0 YXRpYyBpbnQgX19ncmFiX2xvY2soc3RydWN0IHJ0X211dGV4ICoNCiANCiAJ VFJBQ0VfQlVHX09OX0xPQ0tFRCghb3duZXIpOw0KIA0KKwlfcmF3X3NwaW5f bG9jaygmb3duZXItPnBpX2xvY2spOw0KKw0KIAkvKiBUaGUgb3duZXIgaXMg cGVuZGluZyBvbiBhIGxvY2ssIGJ1dCBpcyBpdCB0aGlzIGxvY2s/ICovDQog CWlmIChvd25lci0+cGVuZGluZ19vd25lciAhPSBsb2NrKQ0KLQkJcmV0dXJu IDA7DQorCQlnb3RvIG91dF91bmxvY2s7DQogDQogCS8qDQogCSAqIFRoZXJl J3MgYW4gb3duZXIsIGJ1dCBpdCBoYXNuJ3Qgd29rZW4gdXAgdG8gdGFrZSB0 aGUgbG9jayB5ZXQuDQogCSAqIFNlZSBpZiB3ZSBzaG91bGQgc3RlYWwgaXQg ZnJvbSBoaW0uDQogCSAqLw0KIAlpZiAodGFzay0+cHJpbyA+IG93bmVyLT5w cmlvKQ0KLQkJcmV0dXJuIDA7DQorCQlnb3RvIG91dF91bmxvY2s7DQogI2lm ZGVmIENPTkZJR19QUkVFTVBUX1JUDQogCS8qDQogCSAqIFRoZSBCS0wgaXMg YSBQSVRBLiBEb24ndCBldmVyIHN0ZWFsIGl0DQogCSAqLw0KIAlpZiAobG9j ayA9PSAma2VybmVsX3NlbS5sb2NrKQ0KLQkJcmV0dXJuIDA7DQorCQlnb3Rv IG91dF91bmxvY2s7DQogI2VuZGlmDQogCS8qDQogCSAqIFRoaXMgdGFzayBp cyBvZiBoaWdoZXIgcHJpb3JpdHkgdGhhbiB0aGUgY3VycmVudCBwZW5kaW5n DQogCSAqIG93bmVyLCBzbyB3ZSBtYXkgc3RlYWwgaXQuDQogCSAqLw0KLQlv d25lci0+cnRfZmxhZ3MgJj0gflJUX1BFTkRPV05FUjsNCi0Jb3duZXItPnBl bmRpbmdfb3duZXIgPSBOVUxMOw0KKwlyZW1vdmVfcGVuZGluZ19vd25lcl9u b2xvY2sob3duZXIpOw0KIA0KLSNpZmRlZiBDT05GSUdfREVCVUdfREVBRExP Q0tTDQotCS8qDQotCSAqIFRoaXMgdGFzayB3aWxsIGJlIHRha2luZyB0aGUg b3duZXJzaGlwIGF3YXksIGFuZA0KLQkgKiB3aGVuIGl0IGRvZXMsIHRoZSBs b2NrIGNhbid0IGJlIG9uIHRoZSBoZWxkIGxpc3QuDQotCSAqLw0KLQlpZiAo dHJhY2Vfb24pIHsNCi0JCVRSQUNFX1dBUk5fT05fTE9DS0VEKGxpc3RfZW1w dHkoJmxvY2stPmhlbGRfbGlzdCkpOw0KLQkJbGlzdF9kZWxfaW5pdCgmbG9j ay0+aGVsZF9saXN0KTsNCi0JfQ0KLSNlbmRpZg0KLQlhY2NvdW50X211dGV4 X293bmVyX3VwKG93bmVyKTsNCisJcmVzID0gMTsNCiANCi0JcmV0dXJuIDE7 DQotfQ0KLQ0KLS8qDQotICogQnJpbmcgYSB0YXNrIGZyb20gcGVuZGluZyBv d25lcnNoaXAgdG8gb3duaW5nIGEgbG9jay4NCi0gKg0KLSAqIFJldHVybiAw IGlmIHdlIHNlY3VyZWQgaXQsIG90aGVyd2lzZSBub24temVybyBpZiBpdCB3 YXMNCi0gKiBzdG9sZW4uDQotICovDQotc3RhdGljIGludA0KLWNhcHR1cmVf bG9jayhzdHJ1Y3QgcnRfbXV0ZXhfd2FpdGVyICp3YWl0ZXIsIHN0cnVjdCB0 aHJlYWRfaW5mbyAqdGksDQotCSAgICAgc3RydWN0IHRhc2tfc3RydWN0ICp0 YXNrKQ0KLXsNCi0Jc3RydWN0IHJ0X211dGV4ICpsb2NrID0gd2FpdGVyLT5s b2NrOw0KLQlzdHJ1Y3QgdGhyZWFkX2luZm8gKm9sZF9vd25lcjsNCi0JdW5z aWduZWQgbG9uZyBmbGFnczsNCi0JaW50IHJldCA9IDA7DQotDQotI2lmbmRl ZiBDQVBUVVJFX0xPQ0sNCi0JcmV0dXJuIDA7DQotI2VuZGlmDQotI2lmZGVm IENPTkZJR19QUkVFTVBUX1JUDQotCS8qDQotCSAqIFRoZSBCS0wgaXMgc3Bl Y2lhbCwgd2UgYWx3YXlzIGdldCBpdC4NCi0JICovDQotCWlmIChsb2NrID09 ICZrZXJuZWxfc2VtLmxvY2spDQotCQlyZXR1cm4gMDsNCi0jZW5kaWYNCi0N Ci0JdHJhY2VfbG9ja19pcnFzYXZlKCZ0cmFjZV9sb2NrLCBmbGFncywgdGkp Ow0KLQkvKg0KLQkgKiBXZSBhcmUgbm8gbG9uZ2VyIGJsb2NrZWQgb24gdGhl IGxvY2ssIHNvIHdlIGFyZSBjb25zaWRlcmVkIGENCi0JICogb3duZXIuIFNv IHdlIG11c3QgZ3JhYiB0aGUgbG9jay0+d2FpdF9sb2NrIGZpcnN0Lg0KLQkg Ki8NCi0JX3Jhd19zcGluX2xvY2soJmxvY2stPndhaXRfbG9jayk7DQotCV9y YXdfc3Bpbl9sb2NrKCZ0YXNrLT5waV9sb2NrKTsNCi0NCi0JaWYgKCEodGFz ay0+cnRfZmxhZ3MgJiBSVF9QRU5ET1dORVIpKSB7DQotCQkvKg0KLQkJICog U29tZW9uZSBlbHNlIHN0b2xlIGl0Lg0KLQkJICovDQotCQlvbGRfb3duZXIg PSBsb2NrX293bmVyKGxvY2spOw0KLQkJVFJBQ0VfQlVHX09OX0xPQ0tFRChv bGRfb3duZXIgPT0gdGkpOw0KLQkJaWYgKGxpa2VseSghb2xkX293bmVyKSB8 fCBfX2dyYWJfbG9jayhsb2NrLCB0YXNrLCBvbGRfb3duZXItPnRhc2spKSB7 DQotCQkJLyogd2UgZ290IGl0IGJhY2shICovDQotCQkJaWYgKG9sZF9vd25l cikgew0KLQkJCQlfcmF3X3NwaW5fbG9jaygmb2xkX293bmVyLT50YXNrLT5w aV9sb2NrKTsNCi0JCQkJc2V0X25ld19vd25lcihsb2NrLCBvbGRfb3duZXIs IHRpIF9fV19FSVBfXyh3YWl0ZXIpKTsNCi0JCQkJX3Jhd19zcGluX3VubG9j aygmb2xkX293bmVyLT50YXNrLT5waV9sb2NrKTsNCi0JCQl9IGVsc2UNCi0J CQkJc2V0X25ld19vd25lcihsb2NrLCBvbGRfb3duZXIsIHRpIF9fV19FSVBf Xyh3YWl0ZXIpKTsNCi0JCQlyZXQgPSAwOw0KLQkJfSBlbHNlIHsNCi0JCQkv KiBBZGQgb3Vyc2VsdmVzIGJhY2sgdG8gdGhlIGxpc3QgKi8NCi0JCQlUUkFD RV9CVUdfT05fTE9DS0VEKCFwbGlzdF9ub2RlX2VtcHR5KCZ3YWl0ZXItPmxp c3QpKTsNCi0JCQlwbGlzdF9ub2RlX2luaXQoJndhaXRlci0+bGlzdCwgdGFz ay0+cHJpbyk7DQotCQkJdGFza19ibG9ja3Nfb25fbG9jayh3YWl0ZXIsIHRp LCBsb2NrIF9fV19FSVBfXyh3YWl0ZXIpKTsNCi0JCQlyZXQgPSAxOw0KLQkJ fQ0KLQl9IGVsc2Ugew0KLQkJdGFzay0+cnRfZmxhZ3MgJj0gflJUX1BFTkRP V05FUjsNCi0JCXRhc2stPnBlbmRpbmdfb3duZXIgPSBOVUxMOw0KLQl9DQot DQotCV9yYXdfc3Bpbl91bmxvY2soJmxvY2stPndhaXRfbG9jayk7DQotCV9y YXdfc3Bpbl91bmxvY2soJnRhc2stPnBpX2xvY2spOw0KLQl0cmFjZV91bmxv Y2tfaXJxcmVzdG9yZSgmdHJhY2VfbG9jaywgZmxhZ3MsIHRpKTsNCi0NCi0J cmV0dXJuIHJldDsNCisgb3V0X3VubG9jazoNCisJX3Jhd19zcGluX3VubG9j aygmb3duZXItPnBpX2xvY2spOw0KKwlyZXR1cm4gcmVzOw0KIH0NCiANCiBz dGF0aWMgaW5saW5lIHZvaWQgSU5JVF9XQUlURVIoc3RydWN0IHJ0X211dGV4 X3dhaXRlciAqd2FpdGVyKQ0KQEAgLTEzNjYsMTAgKzExNzMsMjQgQEAgc3Rh dGljIGlubGluZSB2b2lkIEZSRUVfV0FJVEVSKHN0cnVjdCBydA0KICNlbmRp Zg0KIH0NCiANCitzdGF0aWMgaW50IGFsbG93ZWRfdG9fdGFrZV9sb2NrKHN0 cnVjdCB0aHJlYWRfaW5mbyAqdGksDQorICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICB0YXNrX3QgKnRhc2ssDQorICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBzdHJ1Y3QgdGhyZWFkX2luZm8gKm9sZF9vd25lciwN CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBydF9t dXRleCAqbG9jaykNCit7DQorCVNNUF9UUkFDRV9CVUdfT05fTE9DS0VEKCFz cGluX2lzX2xvY2tlZCgmbG9jay0+d2FpdF9sb2NrKSk7DQorCVNNUF9UUkFD RV9CVUdfT05fTE9DS0VEKHNwaW5faXNfbG9ja2VkKCZvbGRfb3duZXItPnRh c2stPnBpX2xvY2spKTsNCisJU01QX1RSQUNFX0JVR19PTl9MT0NLRUQoc3Bp bl9pc19sb2NrZWQoJnRhc2stPnBpX2xvY2spKTsNCisNCisJcmV0dXJuICFv bGRfb3duZXIgfHwgDQorCQl0YXNrX2lzX3BlbmRpbmdfb3duZXIodGksbG9j aykgfHwgDQorCQlfX2dyYWJfbG9jayhsb2NrLCB0YXNrLCBvbGRfb3duZXIt PnRhc2spOw0KK30NCisNCiAvKg0KICAqIGxvY2sgaXQgc2VtYXBob3JlLXN0 eWxlOiBubyB3b3JyaWVzIGFib3V0IG1pc3NlZCB3YWtldXBzLg0KICAqLw0K LXN0YXRpYyBpbmxpbmUgdm9pZA0KK3N0YXRpYyB2b2lkDQogX19fX2Rvd24o c3RydWN0IHJ0X211dGV4ICpsb2NrIF9fRUlQX0RFQ0xfXykNCiB7DQogCXN0 cnVjdCB0aHJlYWRfaW5mbyAqdGkgPSBjdXJyZW50X3RocmVhZF9pbmZvKCks ICpvbGRfb3duZXI7DQpAQCAtMTM3OSw2NSArMTIwMCw1NiBAQCBfX19fZG93 bihzdHJ1Y3QgcnRfbXV0ZXggKmxvY2sgX19FSVBfREVDDQogDQogCXRyYWNl X2xvY2tfaXJxc2F2ZSgmdHJhY2VfbG9jaywgZmxhZ3MsIHRpKTsNCiAJVFJB Q0VfQlVHX09OX0xPQ0tFRCghcmF3X2lycXNfZGlzYWJsZWQoKSk7DQotCV9y YXdfc3Bpbl9sb2NrKCZ0YXNrLT5waV9sb2NrKTsNCiAJX3Jhd19zcGluX2xv Y2soJmxvY2stPndhaXRfbG9jayk7DQogCUlOSVRfV0FJVEVSKCZ3YWl0ZXIp Ow0KIA0KLQlvbGRfb3duZXIgPSBsb2NrX293bmVyKGxvY2spOw0KIAlpbml0 X2xpc3RzKGxvY2spOw0KIA0KLQlpZiAobGlrZWx5KCFvbGRfb3duZXIpIHx8 IF9fZ3JhYl9sb2NrKGxvY2ssIHRhc2ssIG9sZF9vd25lci0+dGFzaykpIHsN CisJLyogd2FpdCB0byBiZSBnaXZlbiB0aGUgbG9jayAqLw0KKwlmb3IgKDs7 KSB7DQorCQlvbGRfb3duZXIgPSBsb2NrX293bmVyKGxvY2spOw0KKw0KKwkJ aWYoYWxsb3dlZF90b190YWtlX2xvY2sodGksIHRhc2ssIG9sZF9vd25lcixs b2NrKSkgew0KIAkJLyogZ3JhbnRlZCAqLw0KLQkJVFJBQ0VfV0FSTl9PTl9M T0NLRUQoIXBsaXN0X2hlYWRfZW1wdHkoJmxvY2stPndhaXRfbGlzdCkgJiYg IW9sZF9vd25lcik7DQotCQlpZiAob2xkX293bmVyKSB7DQotCQkJX3Jhd19z cGluX2xvY2soJm9sZF9vd25lci0+dGFzay0+cGlfbG9jayk7DQorCQkJVFJB Q0VfV0FSTl9PTl9MT0NLRUQoIXBsaXN0X2hlYWRfZW1wdHkoJmxvY2stPndh aXRfbGlzdCkgJiYgIW9sZF9vd25lcik7DQogCQkJc2V0X25ld19vd25lcihs b2NrLCBvbGRfb3duZXIsIHRpIF9fRUlQX18pOw0KLQkJCV9yYXdfc3Bpbl91 bmxvY2soJm9sZF9vd25lci0+dGFzay0+cGlfbG9jayk7DQotCQl9IGVsc2UN Ci0JCQlzZXRfbmV3X293bmVyKGxvY2ssIG9sZF9vd25lciwgdGkgX19FSVBf Xyk7DQotCQlfcmF3X3NwaW5fdW5sb2NrKCZsb2NrLT53YWl0X2xvY2spOw0K LQkJX3Jhd19zcGluX3VubG9jaygmdGFzay0+cGlfbG9jayk7DQotCQl0cmFj ZV91bmxvY2tfaXJxcmVzdG9yZSgmdHJhY2VfbG9jaywgZmxhZ3MsIHRpKTsN Ci0NCi0JCUZSRUVfV0FJVEVSKCZ3YWl0ZXIpOw0KLQkJcmV0dXJuOw0KLQl9 DQotDQotCXNldF90YXNrX3N0YXRlKHRhc2ssIFRBU0tfVU5JTlRFUlJVUFRJ QkxFKTsNCi0NCi0JcGxpc3Rfbm9kZV9pbml0KCZ3YWl0ZXIubGlzdCwgdGFz ay0+cHJpbyk7DQotCXRhc2tfYmxvY2tzX29uX2xvY2soJndhaXRlciwgdGks IGxvY2sgX19FSVBfXyk7DQorCQkJcmVtb3ZlX3BlbmRpbmdfb3duZXIodGFz ayk7DQorCQkJX3Jhd19zcGluX3VubG9jaygmbG9jay0+d2FpdF9sb2NrKTsN CisJCQl0cmFjZV91bmxvY2tfaXJxcmVzdG9yZSgmdHJhY2VfbG9jaywgZmxh Z3MsIHRpKTsNCiANCi0JVFJBQ0VfQlVHX09OX0xPQ0tFRCghcmF3X2lycXNf ZGlzYWJsZWQoKSk7DQotCS8qIHdlIGRvbid0IG5lZWQgdG8gdG91Y2ggdGhl IGxvY2sgc3RydWN0IGFueW1vcmUgKi8NCi0JX3Jhd19zcGluX3VubG9jaygm bG9jay0+d2FpdF9sb2NrKTsNCi0JX3Jhd19zcGluX3VubG9jaygmdGFzay0+ cGlfbG9jayk7DQotCXRyYWNlX3VubG9ja19pcnFyZXN0b3JlKCZ0cmFjZV9s b2NrLCBmbGFncywgdGkpOw0KKwkJCUZSRUVfV0FJVEVSKCZ3YWl0ZXIpOw0K KwkJCXJldHVybjsNCisJCX0NCisJCQ0KKwkJdGFza19ibG9ja3Nfb25fbG9j aygmd2FpdGVyLCB0aSwgbG9jaywgVEFTS19VTklOVEVSUlVQVElCTEUgX19F SVBfXyk7DQogDQotCW1pZ2h0X3NsZWVwKCk7DQorCQlUUkFDRV9CVUdfT05f TE9DS0VEKCFyYXdfaXJxc19kaXNhYmxlZCgpKTsNCisJCS8qIHdlIGRvbid0 IG5lZWQgdG8gdG91Y2ggdGhlIGxvY2sgc3RydWN0IGFueW1vcmUgKi8NCisJ CV9yYXdfc3Bpbl91bmxvY2soJmxvY2stPndhaXRfbG9jayk7DQorCQl0cmFj ZV91bmxvY2tfaXJxcmVzdG9yZSgmdHJhY2VfbG9jaywgZmxhZ3MsIHRpKTsN CisJCQ0KKwkJbWlnaHRfc2xlZXAoKTsNCisJCQ0KKwkJbm9zY2hlZF9mbGFn ID0gY3VycmVudC0+ZmxhZ3MgJiBQRl9OT1NDSEVEOw0KKwkJY3VycmVudC0+ ZmxhZ3MgJj0gflBGX05PU0NIRUQ7DQogDQotCW5vc2NoZWRfZmxhZyA9IGN1 cnJlbnQtPmZsYWdzICYgUEZfTk9TQ0hFRDsNCi0JY3VycmVudC0+ZmxhZ3Mg Jj0gflBGX05PU0NIRUQ7DQorCQlpZiAod2FpdGVyLnRpKQ0KKwkJew0KKwkJ CXNjaGVkdWxlKCk7DQorCQl9DQorCQkNCisJCWN1cnJlbnQtPmZsYWdzIHw9 IG5vc2NoZWRfZmxhZzsNCisJCXRhc2stPnN0YXRlID0gVEFTS19SVU5OSU5H Ow0KIA0KLXdhaXRfYWdhaW46DQotCS8qIHdhaXQgdG8gYmUgZ2l2ZW4gdGhl IGxvY2sgKi8NCi0JZm9yICg7Oykgew0KLQkJaWYgKCF3YWl0ZXIudGkpDQot CQkJYnJlYWs7DQotCQlzY2hlZHVsZSgpOw0KLQkJc2V0X3Rhc2tfc3RhdGUo dGFzaywgVEFTS19VTklOVEVSUlVQVElCTEUpOw0KLQl9DQotCS8qDQotCSAq IENoZWNrIHRvIHNlZSBpZiB3ZSBkaWRuJ3QgaGF2ZSBvd25lcnNoaXAgc3Rv bGVuLg0KLQkgKi8NCi0JaWYgKGNhcHR1cmVfbG9jaygmd2FpdGVyLCB0aSwg dGFzaykpIHsNCi0JCXNldF90YXNrX3N0YXRlKHRhc2ssIFRBU0tfVU5JTlRF UlJVUFRJQkxFKTsNCi0JCWdvdG8gd2FpdF9hZ2FpbjsNCisJCXRyYWNlX2xv Y2tfaXJxc2F2ZSgmdHJhY2VfbG9jaywgZmxhZ3MsIHRpKTsNCisJCV9yYXdf c3Bpbl9sb2NrKCZsb2NrLT53YWl0X2xvY2spOw0KKwkJaWYod2FpdGVyLnRp KSB7DQorCQkJcmVtb3ZlX3dhaXRlcihsb2NrLCZ3YWl0ZXIsMSk7DQorCQl9 DQogCX0NCiANCi0JY3VycmVudC0+ZmxhZ3MgfD0gbm9zY2hlZF9mbGFnOw0K LQl0YXNrLT5zdGF0ZSA9IFRBU0tfUlVOTklORzsNCi0JRlJFRV9XQUlURVIo JndhaXRlcik7DQorCS8qIFNob3VsZCBub3QgZ2V0IGhlcmUhICovDQorCUJV R19PTigxKTsNCiB9DQogDQogLyoNCkBAIC0xNDUwLDEyMiArMTI2MiwxMDUg QEAgd2FpdF9hZ2FpbjoNCiAgKiBlbmFibGVzIHRoZSBzZWVtbGVzcyB1c2Ug b2YgYXJiaXRyYXJ5IChibG9ja2luZykgc3BpbmxvY2tzIHdpdGhpbg0KICAq IHNsZWVwL3dha2V1cCBldmVudCBsb29wcy4NCiAgKi8NCi1zdGF0aWMgaW5s aW5lIHZvaWQNCitzdGF0aWMgdm9pZA0KIF9fX19kb3duX211dGV4KHN0cnVj dCBydF9tdXRleCAqbG9jayBfX0VJUF9ERUNMX18pDQogew0KIAlzdHJ1Y3Qg dGhyZWFkX2luZm8gKnRpID0gY3VycmVudF90aHJlYWRfaW5mbygpLCAqb2xk X293bmVyOw0KLQl1bnNpZ25lZCBsb25nIHN0YXRlLCBzYXZlZF9zdGF0ZSwg bm9zY2hlZF9mbGFnOw0KKwl1bnNpZ25lZCBsb25nIHN0YXRlLCBzYXZlZF9z dGF0ZTsNCiAJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrID0gdGktPnRhc2s7 DQogCXN0cnVjdCBydF9tdXRleF93YWl0ZXIgd2FpdGVyOw0KIAl1bnNpZ25l ZCBsb25nIGZsYWdzOw0KLQlpbnQgZ290X3dha2V1cCA9IDAsIHNhdmVkX2xv Y2tfZGVwdGg7DQorCWludCBnb3Rfd2FrZXVwID0gMDsNCisJDQorCSAgICAg ICAgDQogDQogCXRyYWNlX2xvY2tfaXJxc2F2ZSgmdHJhY2VfbG9jaywgZmxh Z3MsIHRpKTsNCiAJVFJBQ0VfQlVHX09OX0xPQ0tFRCghcmF3X2lycXNfZGlz YWJsZWQoKSk7DQotCV9yYXdfc3Bpbl9sb2NrKCZ0YXNrLT5waV9sb2NrKTsN CiAJX3Jhd19zcGluX2xvY2soJmxvY2stPndhaXRfbG9jayk7DQotCUlOSVRf V0FJVEVSKCZ3YWl0ZXIpOw0KLQ0KLQlvbGRfb3duZXIgPSBsb2NrX293bmVy KGxvY2spOw0KLQlpbml0X2xpc3RzKGxvY2spOw0KLQ0KLQlpZiAobGlrZWx5 KCFvbGRfb3duZXIpIHx8IF9fZ3JhYl9sb2NrKGxvY2ssIHRhc2ssIG9sZF9v d25lci0+dGFzaykpIHsNCi0JCS8qIGdyYW50ZWQgKi8NCi0JCVRSQUNFX1dB Uk5fT05fTE9DS0VEKCFwbGlzdF9oZWFkX2VtcHR5KCZsb2NrLT53YWl0X2xp c3QpICYmICFvbGRfb3duZXIpOw0KLQkJaWYgKG9sZF9vd25lcikgew0KLQkJ CV9yYXdfc3Bpbl9sb2NrKCZvbGRfb3duZXItPnRhc2stPnBpX2xvY2spOw0K LQkJCXNldF9uZXdfb3duZXIobG9jaywgb2xkX293bmVyLCB0aSBfX0VJUF9f KTsNCi0JCQlfcmF3X3NwaW5fdW5sb2NrKCZvbGRfb3duZXItPnRhc2stPnBp X2xvY2spOw0KLQkJfSBlbHNlDQotCQkJc2V0X25ld19vd25lcihsb2NrLCBv bGRfb3duZXIsIHRpIF9fRUlQX18pOw0KLQkJX3Jhd19zcGluX3VubG9jaygm bG9jay0+d2FpdF9sb2NrKTsNCi0JCV9yYXdfc3Bpbl91bmxvY2soJnRhc2st PnBpX2xvY2spOw0KLQkJdHJhY2VfdW5sb2NrX2lycXJlc3RvcmUoJnRyYWNl X2xvY2ssIGZsYWdzLCB0aSk7DQotDQotCQlGUkVFX1dBSVRFUigmd2FpdGVy KTsNCi0JCXJldHVybjsNCi0JfQ0KLQ0KLQlwbGlzdF9ub2RlX2luaXQoJndh aXRlci5saXN0LCB0YXNrLT5wcmlvKTsNCi0JdGFza19ibG9ja3Nfb25fbG9j aygmd2FpdGVyLCB0aSwgbG9jayBfX0VJUF9fKTsNCi0NCi0JVFJBQ0VfQlVH X09OX0xPQ0tFRCghcmF3X2lycXNfZGlzYWJsZWQoKSk7DQotCS8qDQorLyoN CiAJICogSGVyZSB3ZSBzYXZlIHdoYXRldmVyIHN0YXRlIHRoZSB0YXNrIHdh cyBpbiBvcmlnaW5hbGx5LA0KIAkgKiB3ZSdsbCByZXN0b3JlIGl0IGF0IHRo ZSBlbmQgb2YgdGhlIGZ1bmN0aW9uIGFuZCB3ZSdsbA0KIAkgKiB0YWtlIGFu eSBpbnRlcm1lZGlhdGUgd2FrZXVwIGludG8gYWNjb3VudCBhcyB3ZWxsLA0K IAkgKiBpbmRlcGVuZGVudGx5IG9mIHRoZSBtdXRleCBzbGVlcC93YWtldXAg bWVjaGFuaXNtOg0KIAkgKi8NCiAJc2F2ZWRfc3RhdGUgPSB4Y2hnKCZ0YXNr LT5zdGF0ZSwgVEFTS19VTklOVEVSUlVQVElCTEUpOw0KKyAgICAgICAgDQor CUlOSVRfV0FJVEVSKCZ3YWl0ZXIpOw0KIA0KLQkvKiB3ZSBkb24ndCBuZWVk IHRvIHRvdWNoIHRoZSBsb2NrIHN0cnVjdCBhbnltb3JlICovDQotCV9yYXdf c3Bpbl91bmxvY2soJmxvY2stPndhaXRfbG9jayk7DQotCV9yYXdfc3Bpbl91 bmxvY2soJnRhc2stPnBpX2xvY2spOw0KLQl0cmFjZV91bmxvY2soJnRyYWNl X2xvY2ssIHRpKTsNCi0NCi0JLyoNCi0JICogVE9ETzogY2hlY2sgJ2ZsYWdz JyBmb3IgdGhlIElSUSBiaXQgaGVyZSAtIGl0IGlzIGlsbGVnYWwgdG8NCi0J ICogY2FsbCBkb3duKCkgZnJvbSBhbiBJUlFzLW9mZiBzZWN0aW9uIHRoYXQg cmVzdWx0cyBpbg0KLQkgKiBhbiBhY3R1YWwgcmVzY2hlZHVsZS4NCi0JICov DQotDQotCW5vc2NoZWRfZmxhZyA9IGN1cnJlbnQtPmZsYWdzICYgUEZfTk9T Q0hFRDsNCi0JY3VycmVudC0+ZmxhZ3MgJj0gflBGX05PU0NIRUQ7DQotDQot CS8qDQotCSAqIEJLTCB1c2VycyBleHBlY3QgdGhlIEJLTCB0byBiZSBoZWxk IGFjcm9zcyBzcGlubG9jay9yd2xvY2stYWNxdWlyZS4NCi0JICogU2F2ZSBh bmQgY2xlYXIgaXQsIHRoaXMgd2lsbCBjYXVzZSB0aGUgc2NoZWR1bGVyIHRv IG5vdCBkcm9wIHRoZQ0KLQkgKiBCS0wgc2VtYXBob3JlIGlmIHdlIGVuZCB1 cCBzY2hlZHVsaW5nOg0KLQkgKi8NCi0Jc2F2ZWRfbG9ja19kZXB0aCA9IHRh c2stPmxvY2tfZGVwdGg7DQotCXRhc2stPmxvY2tfZGVwdGggPSAtMTsNCisJ aW5pdF9saXN0cyhsb2NrKTsNCiANCi13YWl0X2FnYWluOg0KIAkvKiB3YWl0 IHRvIGJlIGdpdmVuIHRoZSBsb2NrICovDQogCWZvciAoOzspIHsNCi0JCXVu c2lnbmVkIGxvbmcgc2F2ZWRfZmxhZ3MgPSBjdXJyZW50LT5mbGFncyAmIFBG X05PU0NIRUQ7DQotDQotCQlpZiAoIXdhaXRlci50aSkNCi0JCQlicmVhazsN Ci0JCXRyYWNlX2xvY2FsX2lycV9lbmFibGUodGkpOw0KLQkJLy8gbm8gbmVl ZCB0byBjaGVjayBmb3IgcHJlZW1wdGlvbiBoZXJlLCB3ZSBzY2hlZHVsZSgp Lg0KLQkJY3VycmVudC0+ZmxhZ3MgJj0gflBGX05PU0NIRUQ7DQorCQlvbGRf b3duZXIgPSBsb2NrX293bmVyKGxvY2spOw0KKyAgICAgICAgDQorCQlpZiAo YWxsb3dlZF90b190YWtlX2xvY2sodGksdGFzayxvbGRfb3duZXIsbG9jaykp IHsNCisJCS8qIGdyYW50ZWQgKi8NCisJCQlUUkFDRV9XQVJOX09OX0xPQ0tF RCghcGxpc3RfaGVhZF9lbXB0eSgmbG9jay0+d2FpdF9saXN0KSAmJiAhb2xk X293bmVyKTsNCisJCQlzZXRfbmV3X293bmVyKGxvY2ssIG9sZF9vd25lciwg dGkgX19FSVBfXyk7DQorCQkJcmVtb3ZlX3BlbmRpbmdfb3duZXIodGFzayk7 DQorCQkJX3Jhd19zcGluX3VubG9jaygmbG9jay0+d2FpdF9sb2NrKTsNCisg ICAgICAgICAgICAgICAgICAgICAgICANCisJCQkvKg0KKwkJCSAqIE9ubHkg c2V0IHRoZSB0YXNrJ3Mgc3RhdGUgdG8gVEFTS19SVU5OSU5HIGlmIGl0IGdv dA0KKwkJCSAqIGEgbm9uLW11dGV4IHdha2V1cC4gV2Uga2VlcCB0aGUgb3Jp Z2luYWwgc3RhdGUgb3RoZXJ3aXNlLg0KKwkJCSAqIEEgbXV0ZXggd2FrZXVw IGNoYW5nZXMgdGhlIHRhc2sncyBzdGF0ZSB0byBUQVNLX1JVTk5JTkdfTVVU RVgsDQorCQkJICogbm90IFRBU0tfUlVOTklORyAtIGhlbmNlIHdlIGNhbiBk aWZmZXJlbmNpYXRlIGJldHdlZTV+biB0aGUgdHdvDQorCQkJICogY2FzZXM6 DQorCQkJICovDQorCQkJc3RhdGUgPSB4Y2hnKCZ0YXNrLT5zdGF0ZSwgc2F2 ZWRfc3RhdGUpOw0KKwkJCWlmIChzdGF0ZSA9PSBUQVNLX1JVTk5JTkcpDQor CQkJCWdvdF93YWtldXAgPSAxOw0KKwkJCWlmIChnb3Rfd2FrZXVwKQ0KKwkJ CQl0YXNrLT5zdGF0ZSA9IFRBU0tfUlVOTklORzsNCisJCQl0cmFjZV91bmxv Y2tfaXJxcmVzdG9yZSgmdHJhY2VfbG9jaywgZmxhZ3MsIHRpKTsNCisJCQlw cmVlbXB0X2NoZWNrX3Jlc2NoZWQoKTsNCiANCi0JCXNjaGVkdWxlKCk7DQor CQkJRlJFRV9XQUlURVIoJndhaXRlcik7DQorCQkJcmV0dXJuOw0KKwkJfQ0K KwkJDQorCQl0YXNrX2Jsb2Nrc19vbl9sb2NrKCZ3YWl0ZXIsIHRpLCBsb2Nr LA0KKwkJCQkgICAgVEFTS19VTklOVEVSUlVQVElCTEUgX19FSVBfXyk7DQog DQotCQljdXJyZW50LT5mbGFncyB8PSBzYXZlZF9mbGFnczsNCi0JCXRyYWNl X2xvY2FsX2lycV9kaXNhYmxlKHRpKTsNCi0JCXN0YXRlID0geGNoZygmdGFz ay0+c3RhdGUsIFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsNCi0JCWlmIChzdGF0 ZSA9PSBUQVNLX1JVTk5JTkcpDQotCQkJZ290X3dha2V1cCA9IDE7DQotCX0N Ci0JLyoNCi0JICogQ2hlY2sgdG8gc2VlIGlmIHdlIGRpZG4ndCBoYXZlIG93 bmVyc2hpcCBzdG9sZW4uDQotCSAqLw0KLQlpZiAoY2FwdHVyZV9sb2NrKCZ3 YWl0ZXIsIHRpLCB0YXNrKSkgew0KLQkJc3RhdGUgPSB4Y2hnKCZ0YXNrLT5z dGF0ZSwgVEFTS19VTklOVEVSUlVQVElCTEUpOw0KLQkJaWYgKHN0YXRlID09 IFRBU0tfUlVOTklORykNCi0JCQlnb3Rfd2FrZXVwID0gMTsNCi0JCWdvdG8g d2FpdF9hZ2FpbjsNCi0JfQ0KLQkvKg0KLQkgKiBPbmx5IHNldCB0aGUgdGFz aydzIHN0YXRlIHRvIFRBU0tfUlVOTklORyBpZiBpdCBnb3QNCi0JICogYSBu b24tbXV0ZXggd2FrZXVwLiBXZSBrZWVwIHRoZSBvcmlnaW5hbCBzdGF0ZSBv dGhlcndpc2UuDQotCSAqIEEgbXV0ZXggd2FrZXVwIGNoYW5nZXMgdGhlIHRh c2sncyBzdGF0ZSB0byBUQVNLX1JVTk5JTkdfTVVURVgsDQotCSAqIG5vdCBU QVNLX1JVTk5JTkcgLSBoZW5jZSB3ZSBjYW4gZGlmZmVyZW5jaWF0ZSBiZXR3 ZWVuIHRoZSB0d28NCi0JICogY2FzZXM6DQotCSAqLw0KLQlzdGF0ZSA9IHhj aGcoJnRhc2stPnN0YXRlLCBzYXZlZF9zdGF0ZSk7DQotCWlmIChzdGF0ZSA9 PSBUQVNLX1JVTk5JTkcpDQotCQlnb3Rfd2FrZXVwID0gMTsNCi0JaWYgKGdv dF93YWtldXApDQotCQl0YXNrLT5zdGF0ZSA9IFRBU0tfUlVOTklORzsNCi0J dHJhY2VfbG9jYWxfaXJxX2VuYWJsZSh0aSk7DQotCXByZWVtcHRfY2hlY2tf cmVzY2hlZCgpOw0KKwkJVFJBQ0VfQlVHX09OX0xPQ0tFRCghcmF3X2lycXNf ZGlzYWJsZWQoKSk7DQorCQkvKiB3ZSBkb24ndCBuZWVkIHRvIHRvdWNoIHRo ZSBsb2NrIHN0cnVjdCBhbnltb3JlICovDQorCQlfcmF3X3NwaW5fdW5sb2Nr KCZsb2NrLT53YWl0X2xvY2spOw0KKwkJdHJhY2VfdW5sb2NrKCZ0cmFjZV9s b2NrLCB0aSk7DQorICAgICAgICAgICAgICAgIA0KKwkJaWYgKHdhaXRlci50 aSkgew0KKwkJCXVuc2lnbmVkIGxvbmcgc2F2ZWRfZmxhZ3MgPSANCisJCQkJ Y3VycmVudC0+ZmxhZ3MgJiBQRl9OT1NDSEVEOw0KKwkJCS8qDQorCQkJICog QktMIHVzZXJzIGV4cGVjdCB0aGUgQktMIHRvIGJlIGhlbGQgYWNyb3NzIHNw aW5sb2NrL3J3bG9jay1hY3F1aXJlLg0KKwkJCSAqIFNhdmUgYW5kIGNsZWFy IGl0LCB0aGlzIHdpbGwgY2F1c2UgdGhlIHNjaGVkdWxlciB0byBub3QgZHJv cCB0aGUNCisJCQkgKiBCS0wgc2VtYXBob3JlIGlmIHdlIGVuZCB1cCBzY2hl ZHVsaW5nOg0KKwkJCSAqLw0KIA0KLQl0YXNrLT5sb2NrX2RlcHRoID0gc2F2 ZWRfbG9ja19kZXB0aDsNCi0JY3VycmVudC0+ZmxhZ3MgfD0gbm9zY2hlZF9m bGFnOw0KLQlGUkVFX1dBSVRFUigmd2FpdGVyKTsNCisJCQlpbnQgc2F2ZWRf bG9ja19kZXB0aCA9IHRhc2stPmxvY2tfZGVwdGg7DQorCQkJdGFzay0+bG9j a19kZXB0aCA9IC0xOw0KKwkJCQ0KKw0KKwkJCXRyYWNlX2xvY2FsX2lycV9l bmFibGUodGkpOw0KKwkJCS8vIG5vIG5lZWQgdG8gY2hlY2sgZm9yIHByZWVt cHRpb24gaGVyZSwgd2Ugc2NoZWR1bGUoKS4NCisgICAgICAgICAgICAgICAg ICAgICAgICANCisJCQljdXJyZW50LT5mbGFncyAmPSB+UEZfTk9TQ0hFRDsN CisJCQkNCisJCQlzY2hlZHVsZSgpOw0KKwkJCQ0KKwkJCXRyYWNlX2xvY2Fs X2lycV9kaXNhYmxlKHRpKTsNCisJCQl0YXNrLT5mbGFncyB8PSBzYXZlZF9m bGFnczsNCisJCQl0YXNrLT5sb2NrX2RlcHRoID0gc2F2ZWRfbG9ja19kZXB0 aDsNCisJCQlzdGF0ZSA9IHhjaGcoJnRhc2stPnN0YXRlLCBUQVNLX1JVTk5J TkdfTVVURVgpOw0KKwkJCWlmIChzdGF0ZSA9PSBUQVNLX1JVTk5JTkcpDQor CQkJCWdvdF93YWtldXAgPSAxOw0KKwkJfQ0KKwkJDQorCQl0cmFjZV9sb2Nr X2lycSgmdHJhY2VfbG9jaywgdGkpOw0KKwkJX3Jhd19zcGluX2xvY2soJmxv Y2stPndhaXRfbG9jayk7DQorCQlpZih3YWl0ZXIudGkpIHsNCisJCQlyZW1v dmVfd2FpdGVyKGxvY2ssJndhaXRlciwxKTsNCisJCX0NCisJfQ0KIH0NCiAN CiBzdGF0aWMgdm9pZCBfX3VwX211dGV4X3dhaXRlcl9zYXZlc3RhdGUoc3Ry dWN0IHJ0X211dGV4ICpsb2NrIF9fRUlQX0RFQ0xfXyk7DQpAQCAtMTU3NCw3 ICsxMzY5LDcgQEAgc3RhdGljIHZvaWQgX191cF9tdXRleF93YWl0ZXJfbm9z YXZlc3RhdA0KIC8qDQogICogcmVsZWFzZSB0aGUgbG9jazoNCiAgKi8NCi1z dGF0aWMgaW5saW5lIHZvaWQNCitzdGF0aWMgdm9pZA0KIF9fX191cF9tdXRl eChzdHJ1Y3QgcnRfbXV0ZXggKmxvY2ssIGludCBzYXZlX3N0YXRlIF9fRUlQ X0RFQ0xfXykNCiB7DQogCXN0cnVjdCB0aHJlYWRfaW5mbyAqdGkgPSBjdXJy ZW50X3RocmVhZF9pbmZvKCk7DQpAQCAtMTU4NywxMyArMTM4Miw2IEBAIF9f X191cF9tdXRleChzdHJ1Y3QgcnRfbXV0ZXggKmxvY2ssIGludCANCiAJX3Jh d19zcGluX2xvY2soJmxvY2stPndhaXRfbG9jayk7DQogCVRSQUNFX0JVR19P Tl9MT0NLRUQoIWxvY2stPndhaXRfbGlzdC5wcmlvX2xpc3QucHJldiAmJiAh bG9jay0+d2FpdF9saXN0LnByaW9fbGlzdC5uZXh0KTsNCiANCi0jaWZkZWYg Q09ORklHX0RFQlVHX0RFQURMT0NLUw0KLQlpZiAodHJhY2Vfb24pIHsNCi0J CVRSQUNFX1dBUk5fT05fTE9DS0VEKGxvY2tfb3duZXIobG9jaykgIT0gdGkp Ow0KLQkJVFJBQ0VfV0FSTl9PTl9MT0NLRUQobGlzdF9lbXB0eSgmbG9jay0+ aGVsZF9saXN0KSk7DQotCQlsaXN0X2RlbF9pbml0KCZsb2NrLT5oZWxkX2xp c3QpOw0KLQl9DQotI2VuZGlmDQogDQogI2lmIEFMTF9UQVNLU19QSQ0KIAlp ZiAocGxpc3RfaGVhZF9lbXB0eSgmbG9jay0+d2FpdF9saXN0KSkNCkBAIC0x NjA0LDExICsxMzkyLDE5IEBAIF9fX191cF9tdXRleChzdHJ1Y3QgcnRfbXV0 ZXggKmxvY2ssIGludCANCiAJCQlfX3VwX211dGV4X3dhaXRlcl9zYXZlc3Rh dGUobG9jayBfX0VJUF9fKTsNCiAJCWVsc2UNCiAJCQlfX3VwX211dGV4X3dh aXRlcl9ub3NhdmVzdGF0ZShsb2NrIF9fRUlQX18pOw0KLQl9IGVsc2UNCisJ fSBlbHNlIHsNCisjaWZkZWYgQ09ORklHX0RFQlVHX0RFQURMT0NLUw0KKwkJ aWYgKHRyYWNlX29uKSB7DQorCQkJVFJBQ0VfV0FSTl9PTl9MT0NLRUQobG9j a19vd25lcihsb2NrKSAhPSB0aSk7DQorCQkJVFJBQ0VfV0FSTl9PTl9MT0NL RUQobGlzdF9lbXB0eSgmbG9jay0+aGVsZF9saXN0KSk7DQorCQkJbGlzdF9k ZWxfaW5pdCgmbG9jay0+aGVsZF9saXN0KTsNCisJCX0NCisjZW5kaWYNCiAJ CWxvY2stPm93bmVyID0gTlVMTDsNCisJCWFjY291bnRfbXV0ZXhfb3duZXJf dXAodGktPnRhc2spOw0KKwl9DQogCV9yYXdfc3Bpbl91bmxvY2soJmxvY2st PndhaXRfbG9jayk7DQogI2lmIGRlZmluZWQoQ09ORklHX0RFQlVHX1BSRUVN UFQpICYmIGRlZmluZWQoQ09ORklHX1BSRUVNUFRfUlQpDQotCWFjY291bnRf bXV0ZXhfb3duZXJfdXAoY3VycmVudCk7DQogCWlmICghY3VycmVudC0+bG9j a19jb3VudCAmJiAhcnRfcHJpbyhjdXJyZW50LT5ub3JtYWxfcHJpbykgJiYN CiAJCQkJCXJ0X3ByaW8oY3VycmVudC0+cHJpbykpIHsNCiAJCXN0YXRpYyBp bnQgb25jZSA9IDE7DQpAQCAtMTg0MSwxMjUgKzE2MzcsOTkgQEAgc3RhdGlj IGludCBfX3NjaGVkIF9fZG93bl9pbnRlcnJ1cHRpYmxlKA0KIAlzdHJ1Y3Qg cnRfbXV0ZXhfd2FpdGVyIHdhaXRlcjsNCiAJc3RydWN0IHRpbWVyX2xpc3Qg dGltZXI7DQogCXVuc2lnbmVkIGxvbmcgZXhwaXJlID0gMDsNCisJaW50IHRp bWVyX2luc3RhbGxlZCA9IDA7DQogCWludCByZXQ7DQogDQogCXRyYWNlX2xv Y2tfaXJxc2F2ZSgmdHJhY2VfbG9jaywgZmxhZ3MsIHRpKTsNCiAJVFJBQ0Vf QlVHX09OX0xPQ0tFRCghcmF3X2lycXNfZGlzYWJsZWQoKSk7DQotCV9yYXdf c3Bpbl9sb2NrKCZ0YXNrLT5waV9sb2NrKTsNCiAJX3Jhd19zcGluX2xvY2so JmxvY2stPndhaXRfbG9jayk7DQogCUlOSVRfV0FJVEVSKCZ3YWl0ZXIpOw0K IA0KLQlvbGRfb3duZXIgPSBsb2NrX293bmVyKGxvY2spOw0KIAlpbml0X2xp c3RzKGxvY2spOw0KIA0KLQlpZiAobGlrZWx5KCFvbGRfb3duZXIpIHx8IF9f Z3JhYl9sb2NrKGxvY2ssIHRhc2ssIG9sZF9vd25lci0+dGFzaykpIHsNCisJ cmV0ID0gMDsNCisJLyogd2FpdCB0byBiZSBnaXZlbiB0aGUgbG9jayAqLw0K Kwlmb3IgKDs7KSB7DQorCQlvbGRfb3duZXIgPSBsb2NrX293bmVyKGxvY2sp Ow0KKyAgICAgICAgICAgICAgICANCisJCWlmIChhbGxvd2VkX3RvX3Rha2Vf bG9jayh0aSx0YXNrLG9sZF9vd25lcixsb2NrKSkgew0KIAkJLyogZ3JhbnRl ZCAqLw0KLQkJVFJBQ0VfV0FSTl9PTl9MT0NLRUQoIXBsaXN0X2hlYWRfZW1w dHkoJmxvY2stPndhaXRfbGlzdCkgJiYgIW9sZF9vd25lcik7DQotCQlpZiAo b2xkX293bmVyKSB7DQotCQkJX3Jhd19zcGluX2xvY2soJm9sZF9vd25lci0+ dGFzay0+cGlfbG9jayk7DQorCQkJVFJBQ0VfV0FSTl9PTl9MT0NLRUQoIXBs aXN0X2hlYWRfZW1wdHkoJmxvY2stPndhaXRfbGlzdCkgJiYgIW9sZF9vd25l cik7DQogCQkJc2V0X25ld19vd25lcihsb2NrLCBvbGRfb3duZXIsIHRpIF9f RUlQX18pOw0KLQkJCV9yYXdfc3Bpbl91bmxvY2soJm9sZF9vd25lci0+dGFz ay0+cGlfbG9jayk7DQotCQl9IGVsc2UNCi0JCQlzZXRfbmV3X293bmVyKGxv Y2ssIG9sZF9vd25lciwgdGkgX19FSVBfXyk7DQotCQlfcmF3X3NwaW5fdW5s b2NrKCZsb2NrLT53YWl0X2xvY2spOw0KLQkJX3Jhd19zcGluX3VubG9jaygm dGFzay0+cGlfbG9jayk7DQotCQl0cmFjZV91bmxvY2tfaXJxcmVzdG9yZSgm dHJhY2VfbG9jaywgZmxhZ3MsIHRpKTsNCi0NCi0JCUZSRUVfV0FJVEVSKCZ3 YWl0ZXIpOw0KLQkJcmV0dXJuIDA7DQotCX0NCisJCQlfcmF3X3NwaW5fdW5s b2NrKCZsb2NrLT53YWl0X2xvY2spOw0KKwkJCXRyYWNlX3VubG9ja19pcnFy ZXN0b3JlKCZ0cmFjZV9sb2NrLCBmbGFncywgdGkpOw0KIA0KLQlzZXRfdGFz a19zdGF0ZSh0YXNrLCBUQVNLX0lOVEVSUlVQVElCTEUpOw0KKwkJCWdvdG8g b3V0X2ZyZWVfdGltZXI7DQorCQl9DQogDQotCXBsaXN0X25vZGVfaW5pdCgm d2FpdGVyLmxpc3QsIHRhc2stPnByaW8pOw0KLQl0YXNrX2Jsb2Nrc19vbl9s b2NrKCZ3YWl0ZXIsIHRpLCBsb2NrIF9fRUlQX18pOw0KKwkJdGFza19ibG9j a3Nfb25fbG9jaygmd2FpdGVyLCB0aSwgbG9jaywgVEFTS19JTlRFUlJVUFRJ QkxFIF9fRUlQX18pOw0KIA0KLQlUUkFDRV9CVUdfT05fTE9DS0VEKCFyYXdf aXJxc19kaXNhYmxlZCgpKTsNCi0JLyogd2UgZG9uJ3QgbmVlZCB0byB0b3Vj aCB0aGUgbG9jayBzdHJ1Y3QgYW55bW9yZSAqLw0KLQlfcmF3X3NwaW5fdW5s b2NrKCZsb2NrLT53YWl0X2xvY2spOw0KLQlfcmF3X3NwaW5fdW5sb2NrKCZ0 YXNrLT5waV9sb2NrKTsNCi0JdHJhY2VfdW5sb2NrX2lycXJlc3RvcmUoJnRy YWNlX2xvY2ssIGZsYWdzLCB0aSk7DQotDQotCW1pZ2h0X3NsZWVwKCk7DQor CQlUUkFDRV9CVUdfT05fTE9DS0VEKCFyYXdfaXJxc19kaXNhYmxlZCgpKTsN CisJCS8qIHdlIGRvbid0IG5lZWQgdG8gdG91Y2ggdGhlIGxvY2sgc3RydWN0 IGFueW1vcmUgKi8NCisJCV9yYXdfc3Bpbl91bmxvY2soJmxvY2stPndhaXRf bG9jayk7DQorCQl0cmFjZV91bmxvY2tfaXJxcmVzdG9yZSgmdHJhY2VfbG9j aywgZmxhZ3MsIHRpKTsNCisJCQ0KKwkJbWlnaHRfc2xlZXAoKTsNCisJCQ0K KwkJbm9zY2hlZF9mbGFnID0gY3VycmVudC0+ZmxhZ3MgJiBQRl9OT1NDSEVE Ow0KKwkJY3VycmVudC0+ZmxhZ3MgJj0gflBGX05PU0NIRUQ7DQorCQlpZiAo dGltZSAmJiAhdGltZXJfaW5zdGFsbGVkKSB7DQorCQkJZXhwaXJlID0gdGlt ZSArIGppZmZpZXM7DQorCQkJaW5pdF90aW1lcigmdGltZXIpOw0KKwkJCXRp bWVyLmV4cGlyZXMgPSBleHBpcmU7DQorCQkJdGltZXIuZGF0YSA9ICh1bnNp Z25lZCBsb25nKWN1cnJlbnQ7DQorCQkJdGltZXIuZnVuY3Rpb24gPSBwcm9j ZXNzX3RpbWVvdXQ7DQorCQkJYWRkX3RpbWVyKCZ0aW1lcik7DQorCQkJdGlt ZXJfaW5zdGFsbGVkID0gMTsNCisJCX0NCiANCi0Jbm9zY2hlZF9mbGFnID0g Y3VycmVudC0+ZmxhZ3MgJiBQRl9OT1NDSEVEOw0KLQljdXJyZW50LT5mbGFn cyAmPSB+UEZfTk9TQ0hFRDsNCi0JaWYgKHRpbWUpIHsNCi0JCWV4cGlyZSA9 IHRpbWUgKyBqaWZmaWVzOw0KLQkJaW5pdF90aW1lcigmdGltZXIpOw0KLQkJ dGltZXIuZXhwaXJlcyA9IGV4cGlyZTsNCi0JCXRpbWVyLmRhdGEgPSAodW5z aWduZWQgbG9uZyljdXJyZW50Ow0KLQkJdGltZXIuZnVuY3Rpb24gPSBwcm9j ZXNzX3RpbWVvdXQ7DQotCQlhZGRfdGltZXIoJnRpbWVyKTsNCi0JfQ0KKyAg ICAgICAgICAgICAgICAgICAgICAgIA0KKwkJaWYgKHdhaXRlci50aSkgew0K KwkJCXNjaGVkdWxlKCk7DQorCQl9DQorCQkNCisJCWN1cnJlbnQtPmZsYWdz IHw9IG5vc2NoZWRfZmxhZzsNCisJCXRhc2stPnN0YXRlID0gVEFTS19SVU5O SU5HOw0KIA0KLQlyZXQgPSAwOw0KLXdhaXRfYWdhaW46DQotCS8qIHdhaXQg dG8gYmUgZ2l2ZW4gdGhlIGxvY2sgKi8NCi0JZm9yICg7Oykgew0KLQkJaWYg KHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpIHx8ICh0aW1lICYmICF0aW1lcl9w ZW5kaW5nKCZ0aW1lcikpKSB7DQotCQkJLyoNCi0JCQkgKiBSZW1vdmUgb3Vy c2VsdmVzIGZyb20gdGhlIHdhaXQgbGlzdCBpZiB3ZQ0KLQkJCSAqIGRpZG50 IGdldCB0aGUgbG9jayAtIGVsc2UgcmV0dXJuIHN1Y2Nlc3M6DQotCQkJICov DQotCQkJdHJhY2VfbG9ja19pcnEoJnRyYWNlX2xvY2ssIHRpKTsNCi0JCQlf cmF3X3NwaW5fbG9jaygmdGFzay0+cGlfbG9jayk7DQotCQkJX3Jhd19zcGlu X2xvY2soJmxvY2stPndhaXRfbG9jayk7DQotCQkJaWYgKHdhaXRlci50aSB8 fCB0aW1lKSB7DQotCQkJCXBsaXN0X2RlbCgmd2FpdGVyLmxpc3QpOw0KLQkJ CQkvKg0KLQkJCQkgKiBJZiB3ZSB3ZXJlIHRoZSBsYXN0IHdhaXRlciB0aGVu IGNsZWFyDQotCQkJCSAqIHRoZSBwZW5kaW5nIGJpdDoNCi0JCQkJICovDQot CQkJCWlmIChwbGlzdF9oZWFkX2VtcHR5KCZsb2NrLT53YWl0X2xpc3QpKQ0K LQkJCQkJbG9jay0+b3duZXIgPSBsb2NrX293bmVyKGxvY2spOw0KLQkJCQkv Kg0KLQkJCQkgKiBKdXN0IHJlbW92ZSBvdXJzZWx2ZXMgZnJvbSB0aGUgUEkg bGlzdC4NCi0JCQkJICogKE5vIGJpZyBwcm9ibGVtIGlmIG91ciBQSSBlZmZl Y3QgbGluZ2Vycw0KLQkJCQkgKiAgYSBiaXQgLSBvd25lciB3aWxsIHJlc3Rv cmUgcHJpby4pDQotCQkJCSAqLw0KLQkJCQlUUkFDRV9XQVJOX09OX0xPQ0tF RCh3YWl0ZXIudGkgIT0gdGkpOw0KLQkJCQlUUkFDRV9XQVJOX09OX0xPQ0tF RChjdXJyZW50LT5ibG9ja2VkX29uICE9ICZ3YWl0ZXIpOw0KLQkJCQlwbGlz dF9kZWwoJndhaXRlci5waV9saXN0KTsNCi0JCQkJd2FpdGVyLnBpX2xpc3Qu cHJpbyA9IHRhc2stPnByaW87DQotCQkJCXdhaXRlci50aSA9IE5VTEw7DQot CQkJCWN1cnJlbnQtPmJsb2NrZWRfb24gPSBOVUxMOw0KLQkJCQlpZiAodGlt ZSkgew0KLQkJCQkJcmV0ID0gKGludCkoZXhwaXJlIC0gamlmZmllcyk7DQot CQkJCQlpZiAoIXRpbWVyX3BlbmRpbmcoJnRpbWVyKSkgew0KLQkJCQkJCWRl bF9zaW5nbGVzaG90X3RpbWVyX3N5bmMoJnRpbWVyKTsNCi0JCQkJCQlyZXQg PSAtRVRJTUVET1VUOw0KLQkJCQkJfQ0KLQkJCQl9IGVsc2UNCi0JCQkJCXJl dCA9IC1FSU5UUjsNCisJCXRyYWNlX2xvY2tfaXJxc2F2ZSgmdHJhY2VfbG9j aywgZmxhZ3MsIHRpKTsNCisJCV9yYXdfc3Bpbl9sb2NrKCZsb2NrLT53YWl0 X2xvY2spOw0KKwkJaWYod2FpdGVyLnRpKSB7DQorCQkJcmVtb3ZlX3dhaXRl cihsb2NrLCZ3YWl0ZXIsMSk7DQorCQl9DQorCQlpZihzaWduYWxfcGVuZGlu ZyhjdXJyZW50KSkgew0KKwkJCWlmICh0aW1lKSB7DQorCQkJCXJldCA9IChp bnQpKGV4cGlyZSAtIGppZmZpZXMpOw0KKwkJCQlpZiAoIXRpbWVyX3BlbmRp bmcoJnRpbWVyKSkgew0KKwkJCQkJcmV0ID0gLUVUSU1FRE9VVDsNCisJCQkJ fQ0KIAkJCX0NCi0JCQlfcmF3X3NwaW5fdW5sb2NrKCZsb2NrLT53YWl0X2xv Y2spOw0KLQkJCV9yYXdfc3Bpbl91bmxvY2soJnRhc2stPnBpX2xvY2spOw0K LQkJCXRyYWNlX3VubG9ja19pcnEoJnRyYWNlX2xvY2ssIHRpKTsNCi0JCQli cmVhazsNCisJCQllbHNlDQorCQkJCXJldCA9IC1FSU5UUjsNCisJCQkNCisJ CQlnb3RvIG91dF91bmxvY2s7DQogCQl9DQotCQlpZiAoIXdhaXRlci50aSkN Ci0JCQlicmVhazsNCi0JCXNjaGVkdWxlKCk7DQotCQlzZXRfdGFza19zdGF0 ZSh0YXNrLCBUQVNLX0lOVEVSUlVQVElCTEUpOw0KLQl9DQotDQotCS8qDQot CSAqIENoZWNrIHRvIHNlZSBpZiB3ZSBkaWRuJ3QgaGF2ZSBvd25lcnNoaXAg c3RvbGVuLg0KLQkgKi8NCi0JaWYgKCFyZXQpIHsNCi0JCWlmIChjYXB0dXJl X2xvY2soJndhaXRlciwgdGksIHRhc2spKSB7DQotCQkJc2V0X3Rhc2tfc3Rh dGUodGFzaywgVEFTS19JTlRFUlJVUFRJQkxFKTsNCi0JCQlnb3RvIHdhaXRf YWdhaW47DQorCQllbHNlIGlmKHRpbWVyX2luc3RhbGxlZCAmJg0KKwkJCSF0 aW1lcl9wZW5kaW5nKCZ0aW1lcikpIHsNCisJCQlyZXQgPSAtRVRJTUVET1VU Ow0KKwkJCWdvdG8gb3V0X3VubG9jazsNCiAJCX0NCiAJfQ0KIA0KLQl0YXNr LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsNCi0JY3VycmVudC0+ZmxhZ3MgfD0g bm9zY2hlZF9mbGFnOw0KIA0KKyBvdXRfdW5sb2NrOg0KKwlfcmF3X3NwaW5f dW5sb2NrKCZsb2NrLT53YWl0X2xvY2spOw0KKwl0cmFjZV91bmxvY2tfaXJx cmVzdG9yZSgmdHJhY2VfbG9jaywgZmxhZ3MsIHRpKTsNCisNCisgb3V0X2Zy ZWVfdGltZXI6DQorCWlmICh0aW1lICYmIHRpbWVyX2luc3RhbGxlZCkgew0K KwkJaWYgKCF0aW1lcl9wZW5kaW5nKCZ0aW1lcikpIHsNCisJCQlkZWxfc2lu Z2xlc2hvdF90aW1lcl9zeW5jKCZ0aW1lcik7DQorCQl9DQorCX0NCiAJRlJF RV9XQUlURVIoJndhaXRlcik7DQogCXJldHVybiByZXQ7DQogfQ0KKw0KIC8q DQogICogdHJ5bG9jayBmb3Igd3JpdGluZyAtLSByZXR1cm5zIDEgaWYgc3Vj Y2Vzc2Z1bCwgMCBpZiBjb250ZW50aW9uDQogICovDQpAQCAtMTk3Miw3ICsx NzQyLDYgQEAgc3RhdGljIGludCBfX2Rvd25fdHJ5bG9jayhzdHJ1Y3QgcnRf bXV0ZQ0KIA0KIAl0cmFjZV9sb2NrX2lycXNhdmUoJnRyYWNlX2xvY2ssIGZs YWdzLCB0aSk7DQogCVRSQUNFX0JVR19PTl9MT0NLRUQoIXJhd19pcnFzX2Rp c2FibGVkKCkpOw0KLQlfcmF3X3NwaW5fbG9jaygmdGFzay0+cGlfbG9jayk7 DQogCS8qDQogCSAqIEl0IGlzIE9LIGZvciB0aGUgb3duZXIgb2YgdGhlIGxv Y2sgdG8gZG8gYSB0cnlsb2NrIG9uDQogCSAqIGEgbG9jayBpdCBvd25zLCBz byB0byBwcmV2ZW50IGRlYWRsb2NraW5nLCB3ZSBtdXN0DQpAQCAtMTk4OSwx NyArMTc1OCwxMSBAQCBzdGF0aWMgaW50IF9fZG93bl90cnlsb2NrKHN0cnVj dCBydF9tdXRlDQogCWlmIChsaWtlbHkoIW9sZF9vd25lcikgfHwgX19ncmFi X2xvY2sobG9jaywgdGFzaywgb2xkX293bmVyLT50YXNrKSkgew0KIAkJLyog Z3JhbnRlZCAqLw0KIAkJVFJBQ0VfV0FSTl9PTl9MT0NLRUQoIXBsaXN0X2hl YWRfZW1wdHkoJmxvY2stPndhaXRfbGlzdCkgJiYgIW9sZF9vd25lcik7DQot CQlpZiAob2xkX293bmVyKSB7DQotCQkJX3Jhd19zcGluX2xvY2soJm9sZF9v d25lci0+dGFzay0+cGlfbG9jayk7DQotCQkJc2V0X25ld19vd25lcihsb2Nr LCBvbGRfb3duZXIsIHRpIF9fRUlQX18pOw0KLQkJCV9yYXdfc3Bpbl91bmxv Y2soJm9sZF9vd25lci0+dGFzay0+cGlfbG9jayk7DQotCQl9IGVsc2UNCi0J CQlzZXRfbmV3X293bmVyKGxvY2ssIG9sZF9vd25lciwgdGkgX19FSVBfXyk7 DQorCQlzZXRfbmV3X293bmVyKGxvY2ssIG9sZF9vd25lciwgdGkgX19FSVBf Xyk7DQogCQlyZXQgPSAxOw0KIAl9DQogCV9yYXdfc3Bpbl91bmxvY2soJmxv Y2stPndhaXRfbG9jayk7DQogZmFpbGVkOg0KLQlfcmF3X3NwaW5fdW5sb2Nr KCZ0YXNrLT5waV9sb2NrKTsNCiAJdHJhY2VfdW5sb2NrX2lycXJlc3RvcmUo JnRyYWNlX2xvY2ssIGZsYWdzLCB0aSk7DQogDQogCXJldHVybiByZXQ7DQpA QCAtMjA1MCw3ICsxODEzLDYgQEAgc3RhdGljIHZvaWQgX191cF9tdXRleF93 YWl0ZXJfbm9zYXZlc3RhdA0KIHsNCiAJc3RydWN0IHRocmVhZF9pbmZvICpv bGRfb3duZXJfdGksICpuZXdfb3duZXJfdGk7DQogCXN0cnVjdCB0YXNrX3N0 cnVjdCAqb2xkX293bmVyLCAqbmV3X293bmVyOw0KLQlzdHJ1Y3QgcnRfbXV0 ZXhfd2FpdGVyICp3Ow0KIAlpbnQgcHJpbzsNCiANCiAJb2xkX293bmVyX3Rp ID0gbG9ja19vd25lcihsb2NrKTsNCkBAIC0yMDY0LDI1ICsxODI2LDExIEBA IHN0YXRpYyB2b2lkIF9fdXBfbXV0ZXhfd2FpdGVyX25vc2F2ZXN0YXQNCiAJ ICogd2FpdGVyJ3MgcHJpb3JpdHkpOg0KIAkgKi8NCiAJX3Jhd19zcGluX2xv Y2soJm9sZF9vd25lci0+cGlfbG9jayk7DQotCXByaW8gPSBvbGRfb3duZXIt Pm5vcm1hbF9wcmlvOw0KLQlpZiAodW5saWtlbHkoIXBsaXN0X2hlYWRfZW1w dHkoJm9sZF9vd25lci0+cGlfd2FpdGVycykpKSB7DQotCQl3ID0gcGxpc3Rf Zmlyc3RfZW50cnkoJm9sZF9vd25lci0+cGlfd2FpdGVycywgc3RydWN0IHJ0 X211dGV4X3dhaXRlciwgcGlfbGlzdCk7DQotCQlpZiAody0+dGktPnRhc2st PnByaW8gPCBwcmlvKQ0KLQkJCXByaW8gPSB3LT50aS0+dGFzay0+cHJpbzsN Ci0JfQ0KKwlwcmlvID0gY2FsY19waV9wcmlvKG9sZF9vd25lcik7DQorDQog CWlmICh1bmxpa2VseShwcmlvICE9IG9sZF9vd25lci0+cHJpbykpDQotCQlw aV9zZXRwcmlvKGxvY2ssIG9sZF9vd25lciwgcHJpbyk7DQorCQltdXRleF9z ZXRwcmlvKG9sZF9vd25lciwgcHJpbyk7DQogCV9yYXdfc3Bpbl91bmxvY2so Jm9sZF9vd25lci0+cGlfbG9jayk7DQotI2lmZGVmIENBUFRVUkVfTE9DSw0K LSNpZmRlZiBDT05GSUdfUFJFRU1QVF9SVA0KLQlpZiAobG9jayAhPSAma2Vy bmVsX3NlbS5sb2NrKSB7DQotI2VuZGlmDQotCQluZXdfb3duZXItPnJ0X2Zs YWdzIHw9IFJUX1BFTkRPV05FUjsNCi0JCW5ld19vd25lci0+cGVuZGluZ19v d25lciA9IGxvY2s7DQotI2lmZGVmIENPTkZJR19QUkVFTVBUX1JUDQotCX0N Ci0jZW5kaWYNCi0jZW5kaWYNCiAJd2FrZV91cF9wcm9jZXNzKG5ld19vd25l cik7DQogfQ0KIA0KQEAgLTIwOTAsNyArMTgzOCw2IEBAIHN0YXRpYyB2b2lk IF9fdXBfbXV0ZXhfd2FpdGVyX3NhdmVzdGF0ZSgNCiB7DQogCXN0cnVjdCB0 aHJlYWRfaW5mbyAqb2xkX293bmVyX3RpLCAqbmV3X293bmVyX3RpOw0KIAlz dHJ1Y3QgdGFza19zdHJ1Y3QgKm9sZF9vd25lciwgKm5ld19vd25lcjsNCi0J c3RydWN0IHJ0X211dGV4X3dhaXRlciAqdzsNCiAJaW50IHByaW87DQogDQog CW9sZF9vd25lcl90aSA9IGxvY2tfb3duZXIobG9jayk7DQpAQCAtMjEwNCwy NSArMTg1MSwxMSBAQCBzdGF0aWMgdm9pZCBfX3VwX211dGV4X3dhaXRlcl9z YXZlc3RhdGUoDQogCSAqIHdhaXRlcidzIHByaW9yaXR5KToNCiAJICovDQog CV9yYXdfc3Bpbl9sb2NrKCZvbGRfb3duZXItPnBpX2xvY2spOw0KLQlwcmlv ID0gb2xkX293bmVyLT5ub3JtYWxfcHJpbzsNCi0JaWYgKHVubGlrZWx5KCFw bGlzdF9oZWFkX2VtcHR5KCZvbGRfb3duZXItPnBpX3dhaXRlcnMpKSkgew0K LQkJdyA9IHBsaXN0X2ZpcnN0X2VudHJ5KCZvbGRfb3duZXItPnBpX3dhaXRl cnMsIHN0cnVjdCBydF9tdXRleF93YWl0ZXIsIHBpX2xpc3QpOw0KLQkJaWYg KHctPnRpLT50YXNrLT5wcmlvIDwgcHJpbykNCi0JCQlwcmlvID0gdy0+dGkt PnRhc2stPnByaW87DQotCX0NCisJcHJpbyA9IGNhbGNfcGlfcHJpbyhvbGRf b3duZXIpOw0KKw0KIAlpZiAodW5saWtlbHkocHJpbyAhPSBvbGRfb3duZXIt PnByaW8pKQ0KLQkJcGlfc2V0cHJpbyhsb2NrLCBvbGRfb3duZXIsIHByaW8p Ow0KKwkJbXV0ZXhfc2V0cHJpbyhvbGRfb3duZXIsIHByaW8pOw0KIAlfcmF3 X3NwaW5fdW5sb2NrKCZvbGRfb3duZXItPnBpX2xvY2spOw0KLSNpZmRlZiBD QVBUVVJFX0xPQ0sNCi0jaWZkZWYgQ09ORklHX1BSRUVNUFRfUlQNCi0JaWYg KGxvY2sgIT0gJmtlcm5lbF9zZW0ubG9jaykgew0KLSNlbmRpZg0KLQkJbmV3 X293bmVyLT5ydF9mbGFncyB8PSBSVF9QRU5ET1dORVI7DQotCQluZXdfb3du ZXItPnBlbmRpbmdfb3duZXIgPSBsb2NrOw0KLSNpZmRlZiBDT05GSUdfUFJF RU1QVF9SVA0KLQl9DQotI2VuZGlmDQotI2VuZGlmDQogCXdha2VfdXBfcHJv Y2Vzc19tdXRleChuZXdfb3duZXIpOw0KIH0NCiANCkBAIC0yNTc4LDcgKzIz MTEsNyBAQCBpbnQgX19sb2NrZnVuYyBfcmVhZF90cnlsb2NrKHJ3bG9ja190 ICpyDQogew0KICNpZmRlZiBDT05GSUdfREVCVUdfUlRfTE9DS0lOR19NT0RF DQogCWlmICghcHJlZW1wdF9sb2NrcykNCi0JcmV0dXJuIF9yYXdfcmVhZF90 cnlsb2NrKCZyd2xvY2stPmxvY2subG9jay5kZWJ1Z19yd2xvY2spOw0KKwkJ cmV0dXJuIF9yYXdfcmVhZF90cnlsb2NrKCZyd2xvY2stPmxvY2subG9jay5k ZWJ1Z19yd2xvY2spOw0KIAllbHNlDQogI2VuZGlmDQogCQlyZXR1cm4gZG93 bl9yZWFkX3RyeWxvY2tfbXV0ZXgoJnJ3bG9jay0+bG9jayk7DQpAQCAtMjkw NSwxNyArMjYzOCw2IEBAIG5vdHJhY2UgaW50IGlycXNfZGlzYWJsZWQodm9p ZCkNCiBFWFBPUlRfU1lNQk9MKGlycXNfZGlzYWJsZWQpOw0KICNlbmRpZg0K IA0KLS8qDQotICogVGhpcyByb3V0aW5lIGNoYW5nZXMgdGhlIG93bmVyIG9m IGEgbXV0ZXguIEl0J3Mgb25seQ0KLSAqIGNhbGxlciBpcyB0aGUgZnV0ZXgg Y29kZSB3aGljaCBsb2NrcyBhIGZ1dGV4IG9uIGJlaGFsZg0KLSAqIG9mIGFu b3RoZXIgdGhyZWFkLg0KLSAqLw0KLXZvaWQgZmFzdGNhbGwgcnRfbXV0ZXhf c2V0X293bmVyKHN0cnVjdCBydF9tdXRleCAqbG9jaywgc3RydWN0IHRocmVh ZF9pbmZvICp0KQ0KLXsNCi0JYWNjb3VudF9tdXRleF9vd25lcl91cChjdXJy ZW50KTsNCi0JYWNjb3VudF9tdXRleF9vd25lcl9kb3duKHQtPnRhc2ssIGxv Y2spOw0KLQlsb2NrLT5vd25lciA9IHQ7DQotfQ0KIA0KIHN0cnVjdCB0aHJl YWRfaW5mbyAqIGZhc3RjYWxsIHJ0X211dGV4X293bmVyKHN0cnVjdCBydF9t dXRleCAqbG9jaykNCiB7DQpAQCAtMjk1MCw3ICsyNjcyLDYgQEAgZG93bl90 cnlfZnV0ZXgoc3RydWN0IHJ0X211dGV4ICpsb2NrLCBzdA0KIA0KIAl0cmFj ZV9sb2NrX2lycXNhdmUoJnRyYWNlX2xvY2ssIGZsYWdzLCBwcm94eV9vd25l cik7DQogCVRSQUNFX0JVR19PTl9MT0NLRUQoIXJhd19pcnFzX2Rpc2FibGVk KCkpOw0KLQlfcmF3X3NwaW5fbG9jaygmdGFzay0+cGlfbG9jayk7DQogCV9y YXdfc3Bpbl9sb2NrKCZsb2NrLT53YWl0X2xvY2spOw0KIA0KIAlvbGRfb3du ZXIgPSBsb2NrX293bmVyKGxvY2spOw0KQEAgLTI5NTksMTYgKzI2ODAsMTAg QEAgZG93bl90cnlfZnV0ZXgoc3RydWN0IHJ0X211dGV4ICpsb2NrLCBzdA0K IAlpZiAobGlrZWx5KCFvbGRfb3duZXIpIHx8IF9fZ3JhYl9sb2NrKGxvY2ss IHRhc2ssIG9sZF9vd25lci0+dGFzaykpIHsNCiAJCS8qIGdyYW50ZWQgKi8N CiAJCVRSQUNFX1dBUk5fT05fTE9DS0VEKCFwbGlzdF9oZWFkX2VtcHR5KCZs b2NrLT53YWl0X2xpc3QpICYmICFvbGRfb3duZXIpOw0KLQkJaWYgKG9sZF9v d25lcikgew0KLQkJCV9yYXdfc3Bpbl9sb2NrKCZvbGRfb3duZXItPnRhc2st PnBpX2xvY2spOw0KLQkJCXNldF9uZXdfb3duZXIobG9jaywgb2xkX293bmVy LCBwcm94eV9vd25lciBfX0VJUF9fKTsNCi0JCQlfcmF3X3NwaW5fdW5sb2Nr KCZvbGRfb3duZXItPnRhc2stPnBpX2xvY2spOw0KLQkJfSBlbHNlDQogCQkJ c2V0X25ld19vd25lcihsb2NrLCBvbGRfb3duZXIsIHByb3h5X293bmVyIF9f RUlQX18pOw0KIAkJcmV0ID0gMTsNCiAJfQ0KIAlfcmF3X3NwaW5fdW5sb2Nr KCZsb2NrLT53YWl0X2xvY2spOw0KLQlfcmF3X3NwaW5fdW5sb2NrKCZ0YXNr LT5waV9sb2NrKTsNCiAJdHJhY2VfdW5sb2NrX2lycXJlc3RvcmUoJnRyYWNl X2xvY2ssIGZsYWdzLCBwcm94eV9vd25lcik7DQogDQogCXJldHVybiByZXQ7 DQpAQCAtMzA2NCwzICsyNzc5LDMzIEBAIHZvaWQgZmFzdGNhbGwgaW5pdF9y dF9tdXRleChzdHJ1Y3QgcnRfbXUNCiAJX19pbml0X3J0X211dGV4KGxvY2ss IHNhdmVfc3RhdGUsIG5hbWUsIGZpbGUsIGxpbmUpOw0KIH0NCiBFWFBPUlRf U1lNQk9MKGluaXRfcnRfbXV0ZXgpOw0KKw0KKw0KK3BpZF90IGdldF9ibG9j a2VkX29uKHRhc2tfdCAqdGFzaykNCit7DQorCXBpZF90IHJlcyA9IDA7DQor CXN0cnVjdCBydF9tdXRleCAqbG9jazsNCisJc3RydWN0IHRocmVhZF9pbmZv ICpvd25lcjsNCisgdHJ5X2FnYWluOg0KKwlfcmF3X3NwaW5fbG9jaygmdGFz ay0+cGlfbG9jayk7DQorCWlmKCF0YXNrLT5ibG9ja2VkX29uKSB7DQorCQlf cmF3X3NwaW5fdW5sb2NrKCZ0YXNrLT5waV9sb2NrKTsNCisJCWdvdG8gb3V0 Ow0KKwl9DQorCWxvY2sgPSB0YXNrLT5ibG9ja2VkX29uLT5sb2NrOw0KKwlp ZighX3Jhd19zcGluX3RyeWxvY2soJmxvY2stPndhaXRfbG9jaykpIHsNCisJ CV9yYXdfc3Bpbl91bmxvY2soJnRhc2stPnBpX2xvY2spOw0KKwkJZ290byB0 cnlfYWdhaW47DQorCX0gICAgICAgDQorCW93bmVyID0gbG9ja19vd25lcihs b2NrKTsNCisJaWYob3duZXIpDQorCQlyZXMgPSBvd25lci0+dGFzay0+cGlk Ow0KKw0KKwlfcmF3X3NwaW5fdW5sb2NrKCZ0YXNrLT5waV9sb2NrKTsNCisJ X3Jhd19zcGluX3VubG9jaygmbG9jay0+d2FpdF9sb2NrKTsNCisgICAgICAg IA0KKyBvdXQ6DQorCXJldHVybiByZXM7DQorICAgICAgICAgICAgICAgIA0K K30NCitFWFBPUlRfU1lNQk9MKGdldF9ibG9ja2VkX29uKTsNCg== --202006785-1488366891-1137000336=:16743-- - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/