From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Chen, Tianyang" Subject: Re: [PATCH v6][RFC]xen: sched: convert RTDS from time to event driven model Date: Fri, 26 Feb 2016 13:33:04 -0500 Message-ID: References: <1456430736-4606-1-git-send-email-tiche@seas.upenn.edu> <1456443078.2959.85.camel@citrix.com> <56CFDF85.504@seas.upenn.edu> <1456477891.2959.132.camel@citrix.com> <56D08B50.5090301@seas.upenn.edu> <1456510170.2959.210.camel@citrix.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=_c9b3c5915c9bb24ce21f5ea1f72d3e55" Return-path: Received: from mail6.bemta14.messagelabs.com ([193.109.254.103]) by lists.xen.org with esmtp (Exim 4.84) (envelope-from ) id 1aZNCb-0001X0-3T for xen-devel@lists.xenproject.org; Fri, 26 Feb 2016 18:33:21 +0000 In-Reply-To: <1456510170.2959.210.camel@citrix.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" To: Dario Faggioli Cc: xen-devel@lists.xenproject.org, george.dunlap@citrix.com, Dagaen Golomb , Meng Xu List-Id: xen-devel@lists.xenproject.org --=_c9b3c5915c9bb24ce21f5ea1f72d3e55 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8; format=flowed Attached. Tianyang On 2016-02-26 13:09, Dario Faggioli wrote: > On Fri, 2016-02-26 at 12:28 -0500, Tianyang Chen wrote: >> > So, have you made other changes wrt v6 when trying this? >> The v6 doesn't have the if statement commented out when I submitted >> it.  >> But I tried commenting it out, the assertion failed. >> > Ok, thanks for these tests. Can you send (just quick-&-dirtily, as an > attached to a replay to this email, no need of a proper re-submission > of a new version) the patch that does this: > >> rt_vcpu_sleep(): removing replenishment event if the vcpu is on  >> runq/depletedq >> rt_context_saved(): removing replenishment events if not runnable >> rt_vcpu_wake(): not checking if the event is already queued. >> >> I added debug prints in all these functions and noticed that it could >> be  >> caused by racing between spurious wakeups and context switching. >> > And the code that produces these debug output as well? > >> (XEN) cpu1 picked idle >> (XEN) d0 attempted to change d0v1's CR4 flags 00000620 -> 00040660 >> (XEN) cpu2 picked idle >> (XEN) vcpu1 sleeps on cpu >> (XEN) cpu0 picked idle >> (XEN) vcpu1 context saved not runnable >> (XEN) vcpu1 wakes up nowhere >> (XEN) cpu0 picked vcpu1 >> (XEN) vcpu1 sleeps on cpu >> (XEN) cpu0 picked idle >> (XEN) vcpu1 context saved not runnable >> (XEN) vcpu1 wakes up nowhere >> (XEN) cpu0 picked vcpu1 >> (XEN) cpu0 picked idle >> (XEN) vcpu1 context saved not runnable >> (XEN) cpu0 picked vcpu0 >> (XEN) vcpu1 wakes up nowhere >> (XEN) cpu1 picked vcpu1     *** vcpu1 is on a cpu >> (XEN) cpu1 picked idle      *** vcpu1 is waiting to be context >> switched >> (XEN) vcpu2 wakes up nowhere >> (XEN) cpu0 picked vcpu0 >> (XEN) cpu2 picked vcpu2 >> (XEN) cpu0 picked vcpu0 >> (XEN) cpu0 picked vcpu0 >> (XEN) d0 attempted to change d0v2's CR4 flags 00000620 -> 00040660 >> (XEN) cpu0 picked vcpu0 >> (XEN) vcpu2 sleeps on cpu >> (XEN) vcpu1 wakes up nowhere      *** vcpu1 wakes up without sleep? >> >> (XEN) Assertion '!__vcpu_on_replq(svc)' failed at sched_rt.c:526 >> (XEN) ----[ Xen-4.7-unstable  x86_64  debug=y  Tainted:    C ]---- >> (XEN) CPU:    0 >> (XEN) RIP:    e008:[] >> sched_rt.c#rt_vcpu_wake+0x11f/0x17b >> ... >> (XEN) Xen call trace: >> (XEN)    [] sched_rt.c#rt_vcpu_wake+0x11f/0x17b >> (XEN)    [] vcpu_wake+0x213/0x3d4 >> (XEN)    [] vcpu_unblock+0x4b/0x4d >> (XEN)    [] vcpu_kick+0x20/0x6f >> (XEN)    [] vcpu_mark_events_pending+0x2c/0x2f >> (XEN)    [] >> event_2l.c#evtchn_2l_set_pending+0xa9/0xb9 >> (XEN)    [] send_guest_vcpu_virq+0x9d/0xba >> (XEN)    [] send_timer_event+0xe/0x10 >> (XEN)    [] >> schedule.c#vcpu_singleshot_timer_fn+0x9/0xb >> (XEN)    [] timer.c#execute_timer+0x4e/0x6c >> (XEN)    [] timer.c#timer_softirq_action+0xdd/0x213 >> (XEN)    [] softirq.c#__do_softirq+0x82/0x8d >> (XEN)    [] do_softirq+0x13/0x15 >> (XEN)    [] cpufreq.c#process_softirqs+0x21/0x30 >> >> >> So, it looks like spurious wakeup for vcpu1 happens before it was  >> completely context switched off a cpu. But rt_vcpu_wake() didn't see >> it  >> on cpu with curr_on_cpu() so it fell through the first two RETURNs. >> >> I guess the replenishment queue check is necessary for this >> situation? >> > Perhaps, but I first want to make sure we understand what is really > happening. > > Regards, > Dario --=_c9b3c5915c9bb24ce21f5ea1f72d3e55 Content-Transfer-Encoding: base64 Content-Type: text/x-c; name=sched_rt.c Content-Disposition: attachment; filename=sched_rt.c; size=37986 LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqCiAqIFByZWVtcHRpdmUgR2xvYmFsIEVhcmxpZXN0IERlYWRs aW5lIEZpcnN0ICAoRURGKSBzY2hlZHVsZXIgZm9yIFhlbgogKiBFREYgc2NoZWR1bGluZyBpcyBh IHJlYWwtdGltZSBzY2hlZHVsaW5nIGFsZ29yaXRobSB1c2VkIGluIGVtYmVkZGVkIGZpZWxkLgog KgogKiBieSBTaXN1IFhpLCAyMDEzLCBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU2FpbnQgTG91 aXMKICogYW5kIE1lbmcgWHUsIDIwMTQsIFVuaXZlcnNpdHkgb2YgUGVubnN5bHZhbmlhCiAqCiAq IGJhc2VkIG9uIHRoZSBjb2RlIG9mIGNyZWRpdCBTY2hlZHVsZXIKICovCgojaW5jbHVkZSA8eGVu L2NvbmZpZy5oPgojaW5jbHVkZSA8eGVuL2luaXQuaD4KI2luY2x1ZGUgPHhlbi9saWIuaD4KI2lu Y2x1ZGUgPHhlbi9zY2hlZC5oPgojaW5jbHVkZSA8eGVuL2RvbWFpbi5oPgojaW5jbHVkZSA8eGVu L2RlbGF5Lmg+CiNpbmNsdWRlIDx4ZW4vZXZlbnQuaD4KI2luY2x1ZGUgPHhlbi90aW1lLmg+CiNp bmNsdWRlIDx4ZW4vdGltZXIuaD4KI2luY2x1ZGUgPHhlbi9wZXJmYy5oPgojaW5jbHVkZSA8eGVu L3NjaGVkLWlmLmg+CiNpbmNsdWRlIDx4ZW4vc29mdGlycS5oPgojaW5jbHVkZSA8YXNtL2F0b21p Yy5oPgojaW5jbHVkZSA8eGVuL2Vycm5vLmg+CiNpbmNsdWRlIDx4ZW4vdHJhY2UuaD4KI2luY2x1 ZGUgPHhlbi9jcHUuaD4KI2luY2x1ZGUgPHhlbi9rZXloYW5kbGVyLmg+CiNpbmNsdWRlIDx4ZW4v dHJhY2UuaD4KI2luY2x1ZGUgPHhlbi9ndWVzdF9hY2Nlc3MuaD4KCi8qCiAqIFRPRE86CiAqCiAq IE1pZ3JhdGlvbiBjb21wZW5zYXRpb24gYW5kIHJlc2lzdCBsaWtlIGNyZWRpdDIgdG8gYmV0dGVy IHVzZSBjYWNoZTsKICogTG9jayBIb2xkZXIgUHJvYmxlbSwgdXNpbmcgeWllbGQ/CiAqIFNlbGYg c3dpdGNoIHByb2JsZW06IFZDUFVzIG9mIHRoZSBzYW1lIGRvbWFpbiBtYXkgcHJlZW1wdCBlYWNo IG90aGVyOwogKi8KCi8qCiAqIERlc2lnbjoKICoKICogVGhpcyBzY2hlZHVsZXIgZm9sbG93cyB0 aGUgUHJlZW1wdGl2ZSBHbG9iYWwgRWFybGllc3QgRGVhZGxpbmUgRmlyc3QgKEVERikKICogdGhl b3J5IGluIHJlYWwtdGltZSBmaWVsZC4KICogQXQgYW55IHNjaGVkdWxpbmcgcG9pbnQsIHRoZSBW Q1BVIHdpdGggZWFybGllciBkZWFkbGluZSBoYXMgaGlnaGVyIHByaW9yaXR5LgogKiBUaGUgc2No ZWR1bGVyIGFsd2F5cyBwaWNrcyBoaWdoZXN0IHByaW9yaXR5IFZDUFUgdG8gcnVuIG9uIGEgZmVh c2libGUgUENQVS4KICogQSBQQ1BVIGlzIGZlYXNpYmxlIGlmIHRoZSBWQ1BVIGNhbiBydW4gb24g dGhpcyBQQ1BVIGFuZCAodGhlIFBDUFUgaXMgaWRsZSBvcgogKiBoYXMgYSBsb3dlci1wcmlvcml0 eSBWQ1BVIHJ1bm5pbmcgb24gaXQuKQogKgogKiBFYWNoIFZDUFUgaGFzIGEgZGVkaWNhdGVkIHBl cmlvZCBhbmQgYnVkZ2V0LgogKiBUaGUgZGVhZGxpbmUgb2YgYSBWQ1BVIGlzIGF0IHRoZSBlbmQg b2YgZWFjaCBwZXJpb2Q7CiAqIEEgVkNQVSBoYXMgaXRzIGJ1ZGdldCByZXBsZW5pc2hlZCBhdCB0 aGUgYmVnaW5uaW5nIG9mIGVhY2ggcGVyaW9kOwogKiBXaGlsZSBzY2hlZHVsZWQsIGEgVkNQVSBi dXJucyBpdHMgYnVkZ2V0LgogKiBUaGUgVkNQVSBuZWVkcyB0byBmaW5pc2ggaXRzIGJ1ZGdldCBi ZWZvcmUgaXRzIGRlYWRsaW5lIGluIGVhY2ggcGVyaW9kOwogKiBUaGUgVkNQVSBkaXNjYXJkcyBp dHMgdW51c2VkIGJ1ZGdldCBhdCB0aGUgZW5kIG9mIGVhY2ggcGVyaW9kLgogKiBJZiBhIFZDUFUg cnVucyBvdXQgb2YgYnVkZ2V0IGluIGEgcGVyaW9kLCBpdCBoYXMgdG8gd2FpdCB1bnRpbCBuZXh0 IHBlcmlvZC4KICoKICogRWFjaCBWQ1BVIGlzIGltcGxlbWVudGVkIGFzIGEgZGVmZXJhYmxlIHNl cnZlci4KICogV2hlbiBhIFZDUFUgaGFzIGEgdGFzayBydW5uaW5nIG9uIGl0LCBpdHMgYnVkZ2V0 IGlzIGNvbnRpbnVvdXNseSBidXJuZWQ7CiAqIFdoZW4gYSBWQ1BVIGhhcyBubyB0YXNrIGJ1dCB3 aXRoIGJ1ZGdldCBsZWZ0LCBpdHMgYnVkZ2V0IGlzIHByZXNlcnZlZC4KICoKICogUXVldWUgc2No ZW1lOgogKiBBIGdsb2JhbCBydW5xdWV1ZSBhbmQgYSBnbG9iYWwgZGVwbGV0ZWRxdWV1ZSBmb3Ig ZWFjaCBDUFUgcG9vbC4KICogVGhlIHJ1bnF1ZXVlIGhvbGRzIGFsbCBydW5uYWJsZSBWQ1BVcyB3 aXRoIGJ1ZGdldCwgc29ydGVkIGJ5IGRlYWRsaW5lOwogKiBUaGUgZGVwbGV0ZWRxdWV1ZSBob2xk cyBhbGwgVkNQVXMgd2l0aG91dCBidWRnZXQsIHVuc29ydGVkOwogKgogKiBOb3RlOiBjcHVtYXNr IGFuZCBjcHVwb29sIGlzIHN1cHBvcnRlZC4KICovCgovKgogKiBMb2NraW5nOgogKiBBIGdsb2Jh bCBzeXN0ZW0gbG9jayBpcyB1c2VkIHRvIHByb3RlY3QgdGhlIFJ1blEgYW5kIERlcGxldGVkUS4K ICogVGhlIGdsb2JhbCBsb2NrIGlzIHJlZmVyZW5jZWQgYnkgc2NoZWR1bGVfZGF0YS5zY2hlZHVs ZV9sb2NrCiAqIGZyb20gYWxsIHBoeXNpY2FsIGNwdXMuCiAqCiAqIFRoZSBsb2NrIGlzIGFscmVh ZHkgZ3JhYmJlZCB3aGVuIGNhbGxpbmcgd2FrZS9zbGVlcC9zY2hlZHVsZS8gZnVuY3Rpb25zCiAq IGluIHNjaGVkdWxlLmMKICoKICogVGhlIGZ1bmN0aW9ucyBpbnZvbGVzIFJ1blEgYW5kIG5lZWRz IHRvIGdyYWIgbG9ja3MgYXJlOgogKiAgICB2Y3B1X2luc2VydCwgdmNwdV9yZW1vdmUsIGNvbnRl eHRfc2F2ZWQsIF9fcnVucV9pbnNlcnQKICovCgoKLyoKICogRGVmYXVsdCBwYXJhbWV0ZXJzOgog KiBQZXJpb2QgYW5kIGJ1ZGdldCBpbiBkZWZhdWx0IGlzIDEwIGFuZCA0IG1zLCByZXNwZWN0aXZl bHkKICovCiNkZWZpbmUgUlREU19ERUZBVUxUX1BFUklPRCAgICAgKE1JQ1JPU0VDUygxMDAwMCkp CiNkZWZpbmUgUlREU19ERUZBVUxUX0JVREdFVCAgICAgKE1JQ1JPU0VDUyg0MDAwKSkKCiNkZWZp bmUgVVBEQVRFX0xJTUlUX1NISUZUICAgICAgMTAKCi8qCiAqIEZsYWdzCiAqLwovKgogKiBSVERT X3NjaGVkdWxlZDogSXMgdGhpcyB2Y3B1IGVpdGhlciBydW5uaW5nIG9uLCBvciBjb250ZXh0LXN3 aXRjaGluZyBvZmYsCiAqIGEgcGh5aXNjYWwgY3B1PwogKiArIEFjY2Vzc2VkIG9ubHkgd2l0aCBn bG9iYWwgbG9jayBoZWxkLgogKiArIFNldCB3aGVuIGNob3NlbiBhcyBuZXh0IGluIHJ0X3NjaGVk dWxlKCkuCiAqICsgQ2xlYXJlZCBhZnRlciBjb250ZXh0IHN3aXRjaCBoYXMgYmVlbiBzYXZlZCBp biBydF9jb250ZXh0X3NhdmVkKCkKICogKyBDaGVja2VkIGluIHZjcHVfd2FrZSB0byBzZWUgaWYg d2UgY2FuIGFkZCB0byB0aGUgUnVucXVldWUsIG9yIGlmIHdlIHNob3VsZAogKiAgIHNldCBSVERT X2RlbGF5ZWRfcnVucV9hZGQKICogKyBDaGVja2VkIHRvIGJlIGZhbHNlIGluIHJ1bnFfaW5zZXJ0 LgogKi8KI2RlZmluZSBfX1JURFNfc2NoZWR1bGVkICAgICAgICAgICAgMQojZGVmaW5lIFJURFNf c2NoZWR1bGVkICgxPDxfX1JURFNfc2NoZWR1bGVkKQovKgogKiBSVERTX2RlbGF5ZWRfcnVucV9h ZGQ6IERvIHdlIG5lZWQgdG8gYWRkIHRoaXMgdG8gdGhlIFJ1blEvRGVwbGV0ZWRRCiAqIG9uY2Ug aXQncyBkb25lIGJlaW5nIGNvbnRleHQgc3dpdGNoaW5nIG91dD8KICogKyBTZXQgd2hlbiBzY2hl ZHVsaW5nIG91dCBpbiBydF9zY2hlZHVsZSgpIGlmIHByZXYgaXMgcnVuYWJsZQogKiArIFNldCBp biBydF92Y3B1X3dha2UgaWYgaXQgZmluZHMgUlREU19zY2hlZHVsZWQgc2V0CiAqICsgUmVhZCBp biBydF9jb250ZXh0X3NhdmVkKCkuIElmIHNldCwgaXQgYWRkcyBwcmV2IHRvIHRoZSBSdW5xdWV1 ZS9EZXBsZXRlZFEKICogICBhbmQgY2xlYXJzIHRoZSBiaXQuCiAqLwojZGVmaW5lIF9fUlREU19k ZWxheWVkX3J1bnFfYWRkICAgICAyCiNkZWZpbmUgUlREU19kZWxheWVkX3J1bnFfYWRkICgxPDxf X1JURFNfZGVsYXllZF9ydW5xX2FkZCkKCi8qCiAqIHJ0IHRyYWNpbmcgZXZlbnRzICgib25seSIg NTEyIGF2YWlsYWJsZSEpLiBDaGVjawogKiBpbmNsdWRlL3B1YmxpYy90cmFjZS5oIGZvciBtb3Jl IGRldGFpbHMuCiAqLwojZGVmaW5lIFRSQ19SVERTX1RJQ0tMRSAgICAgICAgICAgVFJDX1NDSEVE X0NMQVNTX0VWVChSVERTLCAxKQojZGVmaW5lIFRSQ19SVERTX1JVTlFfUElDSyAgICAgICAgVFJD X1NDSEVEX0NMQVNTX0VWVChSVERTLCAyKQojZGVmaW5lIFRSQ19SVERTX0JVREdFVF9CVVJOICAg ICAgVFJDX1NDSEVEX0NMQVNTX0VWVChSVERTLCAzKQojZGVmaW5lIFRSQ19SVERTX0JVREdFVF9S RVBMRU5JU0ggVFJDX1NDSEVEX0NMQVNTX0VWVChSVERTLCA0KQojZGVmaW5lIFRSQ19SVERTX1ND SEVEX1RBU0tMRVQgICAgVFJDX1NDSEVEX0NMQVNTX0VWVChSVERTLCA1KQoKIC8qCiAgKiBVc2Vm dWwgdG8gYXZvaWQgdG9vIG1hbnkgY3B1bWFza192YXJfdCBvbiB0aGUgc3RhY2suCiAgKi8Kc3Rh dGljIGNwdW1hc2tfdmFyX3QgKl9jcHVtYXNrX3NjcmF0Y2g7CiNkZWZpbmUgY3B1bWFza19zY3Jh dGNoIF9jcHVtYXNrX3NjcmF0Y2hbc21wX3Byb2Nlc3Nvcl9pZCgpXQoKLyoKICogV2Ugd2FudCB0 byBvbmx5IGFsbG9jYXRlIHRoZSBfY3B1bWFza19zY3JhdGNoIGFycmF5IHRoZSBmaXJzdCB0aW1l IGFuCiAqIGluc3RhbmNlIG9mIHRoaXMgc2NoZWR1bGVyIGlzIHVzZWQsIGFuZCBhdm9pZCByZWFs bG9jYXRpbmcgYW5kIGxlYWtpbmcKICogdGhlIG9sZCBvbmUgd2hlbiBtb3JlIGluc3RhbmNlIGFy ZSBhY3RpdmF0ZWQgaW5zaWRlIG5ldyBjcHVwb29scy4gV2UKICogYWxzbyB3YW50IHRvIGdldCBy aWQgb2YgaXQgd2hlbiB0aGUgbGFzdCBpbnN0YW5jZSBpcyBkZS1pbml0ZWQuCiAqCiAqIFNvIHdl IChzb3J0IG9mKSByZWZlcmVuY2UgY291bnQgdGhlIG51bWJlciBvZiBpbml0aWFsaXplZCBpbnN0 YW5jZXMuIFRoaXMKICogZG9lcyBub3QgbmVlZCB0byBoYXBwZW4gdmlhIGF0b21pY190IHJlZmNv dW50ZXJzLCBhcyBpdCBvbmx5IGhhcHBlbnMgZWl0aGVyCiAqIGR1cmluZyBib290LCBvciB1bmRl ciB0aGUgcHJvdGVjdGlvbiBvZiB0aGUgY3B1cG9vbF9sb2NrIHNwaW5sb2NrLgogKi8Kc3RhdGlj IHVuc2lnbmVkIGludCBucl9ydF9vcHM7CgovKiBoYW5kbGVyIGZvciB0aGUgcmVwbGVuaXNobWVu dCB0aW1lciAqLwpzdGF0aWMgdm9pZCByZXBsX2hhbmRsZXIodm9pZCAqZGF0YSk7CgovKgogKiBT eXN0bWUtd2lkZSBwcml2YXRlIGRhdGEsIGluY2x1ZGUgZ2xvYmFsIFJ1blF1ZXVlL0RlcGxldGVk UQogKiBHbG9iYWwgbG9jayBpcyByZWZlcmVuY2VkIGJ5IHNjaGVkdWxlX2RhdGEuc2NoZWR1bGVf bG9jayBmcm9tIGFsbAogKiBwaHlzaWNhbCBjcHVzLiBJdCBjYW4gYmUgZ3JhYmJlZCB2aWEgdmNw dV9zY2hlZHVsZV9sb2NrX2lycSgpCiAqLwpzdHJ1Y3QgcnRfcHJpdmF0ZSB7CiAgICBzcGlubG9j a190IGxvY2s7ICAgICAgICAgICAgLyogdGhlIGdsb2JhbCBjb2Fyc2UgZ3JhbmQgbG9jayAqLwog ICAgc3RydWN0IGxpc3RfaGVhZCBzZG9tOyAgICAgIC8qIGxpc3Qgb2YgYXZhaWxhbGJlIGRvbWFp bnMsIHVzZWQgZm9yIGR1bXAgKi8KICAgIHN0cnVjdCBsaXN0X2hlYWQgcnVucTsgICAgICAvKiBv cmRlcmVkIGxpc3Qgb2YgcnVubmFibGUgdmNwdXMgKi8KICAgIHN0cnVjdCBsaXN0X2hlYWQgZGVw bGV0ZWRxOyAvKiB1bm9yZGVyZWQgbGlzdCBvZiBkZXBsZXRlZCB2Y3B1cyAqLwogICAgc3RydWN0 IGxpc3RfaGVhZCByZXBscTsgICAgIC8qIG9yZGVyZWQgbGlzdCBvZiB2Y3B1cyB0aGF0IG5lZWQg cmVwbGVuaXNobWVudCAqLwogICAgY3B1bWFza190IHRpY2tsZWQ7ICAgICAgICAgIC8qIGNwdXMg YmVlbiB0aWNrbGVkICovCiAgICBzdHJ1Y3QgdGltZXIgKnJlcGxfdGltZXI7ICAgLyogcmVwbGVu aXNobWVudCB0aW1lciAqLwp9OwoKLyoKICogVmlydHVhbCBDUFUKICovCnN0cnVjdCBydF92Y3B1 IHsKICAgIHN0cnVjdCBsaXN0X2hlYWQgcV9lbGVtOyAgICAvKiBvbiB0aGUgcnVucS9kZXBsZXRl ZHEgbGlzdCAqLwogICAgc3RydWN0IGxpc3RfaGVhZCByZXBscV9lbGVtOy8qIG9uIHRoZSByZXBs IGV2ZW50IGxpc3QgKi8KCiAgICAvKiBVcC1wb2ludGVycyAqLwogICAgc3RydWN0IHJ0X2RvbSAq c2RvbTsKICAgIHN0cnVjdCB2Y3B1ICp2Y3B1OwoKICAgIC8qIFZDUFUgcGFyYW1ldGVycywgaW4g bmFub3NlY29uZHMgKi8KICAgIHNfdGltZV90IHBlcmlvZDsKICAgIHNfdGltZV90IGJ1ZGdldDsK CiAgICAvKiBWQ1BVIGN1cnJlbnQgaW5mb21hdGlvbiBpbiBuYW5vc2Vjb25kICovCiAgICBzX3Rp bWVfdCBjdXJfYnVkZ2V0OyAgICAgICAgLyogY3VycmVudCBidWRnZXQgKi8KICAgIHNfdGltZV90 IGxhc3Rfc3RhcnQ7ICAgICAgICAvKiBsYXN0IHN0YXJ0IHRpbWUgKi8KICAgIHNfdGltZV90IGN1 cl9kZWFkbGluZTsgICAgICAvKiBjdXJyZW50IGRlYWRsaW5lIGZvciBFREYgKi8KCiAgICB1bnNp Z25lZCBmbGFnczsgICAgICAgICAgICAgLyogbWFyayBfX1JURFNfc2NoZWR1bGVkLCBldGMuLiAq Lwp9OwoKLyoKICogRG9tYWluCiAqLwpzdHJ1Y3QgcnRfZG9tIHsKICAgIHN0cnVjdCBsaXN0X2hl YWQgc2RvbV9lbGVtOyAvKiBsaW5rIGxpc3Qgb24gcnRfcHJpdiAqLwogICAgc3RydWN0IGRvbWFp biAqZG9tOyAgICAgICAgIC8qIHBvaW50ZXIgdG8gdXBwZXIgZG9tYWluICovCn07CgovKgogKiBV c2VmdWwgaW5saW5lIGZ1bmN0aW9ucwogKi8Kc3RhdGljIGlubGluZSBzdHJ1Y3QgcnRfcHJpdmF0 ZSAqcnRfcHJpdihjb25zdCBzdHJ1Y3Qgc2NoZWR1bGVyICpvcHMpCnsKICAgIHJldHVybiBvcHMt PnNjaGVkX2RhdGE7Cn0KCnN0YXRpYyBpbmxpbmUgc3RydWN0IHJ0X3ZjcHUgKnJ0X3ZjcHUoY29u c3Qgc3RydWN0IHZjcHUgKnZjcHUpCnsKICAgIHJldHVybiB2Y3B1LT5zY2hlZF9wcml2Owp9Cgpz dGF0aWMgaW5saW5lIHN0cnVjdCBydF9kb20gKnJ0X2RvbShjb25zdCBzdHJ1Y3QgZG9tYWluICpk b20pCnsKICAgIHJldHVybiBkb20tPnNjaGVkX3ByaXY7Cn0KCnN0YXRpYyBpbmxpbmUgc3RydWN0 IGxpc3RfaGVhZCAqcnRfcnVucShjb25zdCBzdHJ1Y3Qgc2NoZWR1bGVyICpvcHMpCnsKICAgIHJl dHVybiAmcnRfcHJpdihvcHMpLT5ydW5xOwp9CgpzdGF0aWMgaW5saW5lIHN0cnVjdCBsaXN0X2hl YWQgKnJ0X2RlcGxldGVkcShjb25zdCBzdHJ1Y3Qgc2NoZWR1bGVyICpvcHMpCnsKICAgIHJldHVy biAmcnRfcHJpdihvcHMpLT5kZXBsZXRlZHE7Cn0KCnN0YXRpYyBpbmxpbmUgc3RydWN0IGxpc3Rf aGVhZCAqcnRfcmVwbHEoY29uc3Qgc3RydWN0IHNjaGVkdWxlciAqb3BzKQp7CiAgICByZXR1cm4g JnJ0X3ByaXYob3BzKS0+cmVwbHE7Cn0KCi8qCiAqIFF1ZXVlIGhlbHBlciBmdW5jdGlvbnMgZm9y IHJ1bnEsIGRlcGxldGVkcQogKiBhbmQgcmVwbGVuaXNobWVudCBldmVudCBxdWV1ZQogKi8Kc3Rh dGljIGludApfX3ZjcHVfb25fcShjb25zdCBzdHJ1Y3QgcnRfdmNwdSAqc3ZjKQp7CiAgIHJldHVy biAhbGlzdF9lbXB0eSgmc3ZjLT5xX2VsZW0pOwp9CgpzdGF0aWMgc3RydWN0IHJ0X3ZjcHUgKgpf X3FfZWxlbShzdHJ1Y3QgbGlzdF9oZWFkICplbGVtKQp7CiAgICByZXR1cm4gbGlzdF9lbnRyeShl bGVtLCBzdHJ1Y3QgcnRfdmNwdSwgcV9lbGVtKTsKfQoKc3RhdGljIHN0cnVjdCBydF92Y3B1ICoK X19yZXBscV9lbGVtKHN0cnVjdCBsaXN0X2hlYWQgKmVsZW0pCnsKICAgIHJldHVybiBsaXN0X2Vu dHJ5KGVsZW0sIHN0cnVjdCBydF92Y3B1LCByZXBscV9lbGVtKTsKfQoKc3RhdGljIGludApfX3Zj cHVfb25fcmVwbHEoY29uc3Qgc3RydWN0IHJ0X3ZjcHUgKnN2YykKewogICByZXR1cm4gIWxpc3Rf ZW1wdHkoJnN2Yy0+cmVwbHFfZWxlbSk7Cn0KCi8qCiAqIERlYnVnIHJlbGF0ZWQgY29kZSwgZHVt cCB2Y3B1L2NwdSBpbmZvcm1hdGlvbgogKi8Kc3RhdGljIHZvaWQKcnRfZHVtcF92Y3B1KGNvbnN0 IHN0cnVjdCBzY2hlZHVsZXIgKm9wcywgY29uc3Qgc3RydWN0IHJ0X3ZjcHUgKnN2YykKewogICAg Y3B1bWFza190ICpjcHVwb29sX21hc2ssICptYXNrOwoKICAgIEFTU0VSVChzdmMgIT0gTlVMTCk7 CiAgICAvKiBpZGxlIHZjcHUgKi8KICAgIGlmKCBzdmMtPnNkb20gPT0gTlVMTCApCiAgICB7CiAg ICAgICAgcHJpbnRrKCJcbiIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAvKgogICAgICog V2UgY2FuJ3QganVzdCB1c2UgJ2NwdW1hc2tfc2NyYXRjaCcgYmVjYXVzZSB0aGUgZHVtcGluZyBj YW4KICAgICAqIGhhcHBlbiBmcm9tIGEgcENQVSBvdXRzaWRlIG9mIHRoaXMgc2NoZWR1bGVyJ3Mg Y3B1cG9vbCwgYW5kCiAgICAgKiBoZW5jZSBpdCdzIG5vdCByaWdodCB0byB1c2UgdGhlIHBDUFUn cyBzY3JhdGNoIG1hc2sgKHdoaWNoCiAgICAgKiBtYXkgZXZlbiBub3QgZXhpc3QhKS4gT24gdGhl IG90aGVyIGhhbmQsIGl0IGlzIHNhZmUgdG8gdXNlCiAgICAgKiBzdmMtPnZjcHUtPnByb2Nlc3Nv cidzIG93biBzY3JhdGNoIHNwYWNlLCBzaW5jZSB3ZSBob2xkIHRoZQogICAgICogcnVucXVldWUg bG9jay4KICAgICAqLwogICAgbWFzayA9IF9jcHVtYXNrX3NjcmF0Y2hbc3ZjLT52Y3B1LT5wcm9j ZXNzb3JdOwoKICAgIGNwdXBvb2xfbWFzayA9IGNwdXBvb2xfZG9tYWluX2NwdW1hc2soc3ZjLT52 Y3B1LT5kb21haW4pOwogICAgY3B1bWFza19hbmQobWFzaywgY3B1cG9vbF9tYXNrLCBzdmMtPnZj cHUtPmNwdV9oYXJkX2FmZmluaXR5KTsKICAgIGNwdWxpc3Rfc2NucHJpbnRmKGtleWhhbmRsZXJf c2NyYXRjaCwgc2l6ZW9mKGtleWhhbmRsZXJfc2NyYXRjaCksIG1hc2spOwogICAgcHJpbnRrKCJb JTVkLiUtMnVdIGNwdSAldSwgKCUiUFJJX3N0aW1lIiwgJSJQUklfc3RpbWUiKSwiCiAgICAgICAg ICAgIiBjdXJfYj0lIlBSSV9zdGltZSIgY3VyX2Q9JSJQUklfc3RpbWUiIGxhc3Rfc3RhcnQ9JSJQ Uklfc3RpbWUiXG4iCiAgICAgICAgICAgIiBcdFx0IG9uUT0lZCBydW5uYWJsZT0lZCBmbGFncz0l eCBlZmZlY3RpdmUgaGFyZF9hZmZpbml0eT0lc1xuIiwKICAgICAgICAgICAgc3ZjLT52Y3B1LT5k b21haW4tPmRvbWFpbl9pZCwKICAgICAgICAgICAgc3ZjLT52Y3B1LT52Y3B1X2lkLAogICAgICAg ICAgICBzdmMtPnZjcHUtPnByb2Nlc3NvciwKICAgICAgICAgICAgc3ZjLT5wZXJpb2QsCiAgICAg ICAgICAgIHN2Yy0+YnVkZ2V0LAogICAgICAgICAgICBzdmMtPmN1cl9idWRnZXQsCiAgICAgICAg ICAgIHN2Yy0+Y3VyX2RlYWRsaW5lLAogICAgICAgICAgICBzdmMtPmxhc3Rfc3RhcnQsCiAgICAg ICAgICAgIF9fdmNwdV9vbl9xKHN2YyksCiAgICAgICAgICAgIHZjcHVfcnVubmFibGUoc3ZjLT52 Y3B1KSwKICAgICAgICAgICAgc3ZjLT5mbGFncywKICAgICAgICAgICAga2V5aGFuZGxlcl9zY3Jh dGNoKTsKfQoKc3RhdGljIHZvaWQKcnRfZHVtcF9wY3B1KGNvbnN0IHN0cnVjdCBzY2hlZHVsZXIg Km9wcywgaW50IGNwdSkKewogICAgc3RydWN0IHJ0X3ByaXZhdGUgKnBydiA9IHJ0X3ByaXYob3Bz KTsKICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CgogICAgc3Bpbl9sb2NrX2lycXNhdmUoJnBydi0+ bG9jaywgZmxhZ3MpOwogICAgcnRfZHVtcF92Y3B1KG9wcywgcnRfdmNwdShjdXJyX29uX2NwdShj cHUpKSk7CiAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcnYtPmxvY2ssIGZsYWdzKTsKfQoK c3RhdGljIHZvaWQKcnRfZHVtcChjb25zdCBzdHJ1Y3Qgc2NoZWR1bGVyICpvcHMpCnsKICAgIHN0 cnVjdCBsaXN0X2hlYWQgKnJ1bnEsICpkZXBsZXRlZHEsICpyZXBscSwgKml0ZXI7CiAgICBzdHJ1 Y3QgcnRfcHJpdmF0ZSAqcHJ2ID0gcnRfcHJpdihvcHMpOwogICAgc3RydWN0IHJ0X3ZjcHUgKnN2 YzsKICAgIHN0cnVjdCBydF9kb20gKnNkb207CiAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwoKICAg IHNwaW5fbG9ja19pcnFzYXZlKCZwcnYtPmxvY2ssIGZsYWdzKTsKCiAgICBpZiAoIGxpc3RfZW1w dHkoJnBydi0+c2RvbSkgKQogICAgICAgIGdvdG8gb3V0OwoKICAgIHJ1bnEgPSBydF9ydW5xKG9w cyk7CiAgICBkZXBsZXRlZHEgPSBydF9kZXBsZXRlZHEob3BzKTsKICAgIHJlcGxxID0gcnRfcmVw bHEob3BzKTsKCiAgICBwcmludGsoIkdsb2JhbCBSdW5RdWV1ZSBpbmZvOlxuIik7CiAgICBsaXN0 X2Zvcl9lYWNoKCBpdGVyLCBydW5xICkKICAgIHsKICAgICAgICBzdmMgPSBfX3FfZWxlbShpdGVy KTsKICAgICAgICBydF9kdW1wX3ZjcHUob3BzLCBzdmMpOwogICAgfQoKICAgIHByaW50aygiR2xv YmFsIERlcGxldGVkUXVldWUgaW5mbzpcbiIpOwogICAgbGlzdF9mb3JfZWFjaCggaXRlciwgZGVw bGV0ZWRxICkKICAgIHsKICAgICAgICBzdmMgPSBfX3FfZWxlbShpdGVyKTsKICAgICAgICBydF9k dW1wX3ZjcHUob3BzLCBzdmMpOwogICAgfQoKICAgIHByaW50aygiR2xvYmFsIFJlcGxlbmlzaG1l bnQgRXZlbnQgaW5mbzpcbiIpOwogICAgbGlzdF9mb3JfZWFjaCggaXRlciwgcmVwbHEgKQogICAg ewogICAgICAgIHN2YyA9IF9fcmVwbHFfZWxlbShpdGVyKTsKICAgICAgICBydF9kdW1wX3ZjcHUo b3BzLCBzdmMpOwogICAgfQoKICAgIHByaW50aygiRG9tYWluIGluZm86XG4iKTsKICAgIGxpc3Rf Zm9yX2VhY2goIGl0ZXIsICZwcnYtPnNkb20gKQogICAgewogICAgICAgIHN0cnVjdCB2Y3B1ICp2 OwoKICAgICAgICBzZG9tID0gbGlzdF9lbnRyeShpdGVyLCBzdHJ1Y3QgcnRfZG9tLCBzZG9tX2Vs ZW0pOwogICAgICAgIHByaW50aygiXHRkb21haW46ICVkXG4iLCBzZG9tLT5kb20tPmRvbWFpbl9p ZCk7CgogICAgICAgIGZvcl9lYWNoX3ZjcHUgKCBzZG9tLT5kb20sIHYgKQogICAgICAgIHsKICAg ICAgICAgICAgc3ZjID0gcnRfdmNwdSh2KTsKICAgICAgICAgICAgcnRfZHVtcF92Y3B1KG9wcywg c3ZjKTsKICAgICAgICB9CiAgICB9Cgogb3V0OgogICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgm cHJ2LT5sb2NrLCBmbGFncyk7Cn0KCi8qCiAqIHVwZGF0ZSBkZWFkbGluZSBhbmQgYnVkZ2V0IHdo ZW4gbm93ID49IGN1cl9kZWFkbGluZQogKiBpdCBuZWVkIHRvIGJlIHVwZGF0ZWQgdG8gdGhlIGRl YWRsaW5lIG9mIHRoZSBjdXJyZW50IHBlcmlvZAogKi8Kc3RhdGljIHZvaWQKcnRfdXBkYXRlX2Rl YWRsaW5lKHNfdGltZV90IG5vdywgc3RydWN0IHJ0X3ZjcHUgKnN2YykKewogICAgQVNTRVJUKG5v dyA+PSBzdmMtPmN1cl9kZWFkbGluZSk7CiAgICBBU1NFUlQoc3ZjLT5wZXJpb2QgIT0gMCk7Cgog ICAgaWYgKCBzdmMtPmN1cl9kZWFkbGluZSArIChzdmMtPnBlcmlvZCA8PCBVUERBVEVfTElNSVRf U0hJRlQpID4gbm93ICkKICAgIHsKICAgICAgICBkbwogICAgICAgICAgICBzdmMtPmN1cl9kZWFk bGluZSArPSBzdmMtPnBlcmlvZDsKICAgICAgICB3aGlsZSAoIHN2Yy0+Y3VyX2RlYWRsaW5lIDw9 IG5vdyApOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIGxvbmcgY291bnQgPSAoKG5vdyAt IHN2Yy0+Y3VyX2RlYWRsaW5lKSAvIHN2Yy0+cGVyaW9kKSArIDE7CiAgICAgICAgc3ZjLT5jdXJf ZGVhZGxpbmUgKz0gY291bnQgKiBzdmMtPnBlcmlvZDsKICAgIH0KCiAgICBzdmMtPmN1cl9idWRn ZXQgPSBzdmMtPmJ1ZGdldDsKCiAgICAvKiBUUkFDRSAqLwogICAgewogICAgICAgIHN0cnVjdCB7 CiAgICAgICAgICAgIHVuc2lnbmVkIGRvbToxNix2Y3B1OjE2OwogICAgICAgICAgICB1bnNpZ25l ZCBjdXJfZGVhZGxpbmVfbG8sIGN1cl9kZWFkbGluZV9oaTsKICAgICAgICAgICAgdW5zaWduZWQg Y3VyX2J1ZGdldF9sbywgY3VyX2J1ZGdldF9oaTsKICAgICAgICB9IGQ7CiAgICAgICAgZC5kb20g PSBzdmMtPnZjcHUtPmRvbWFpbi0+ZG9tYWluX2lkOwogICAgICAgIGQudmNwdSA9IHN2Yy0+dmNw dS0+dmNwdV9pZDsKICAgICAgICBkLmN1cl9kZWFkbGluZV9sbyA9ICh1bnNpZ25lZCkgc3ZjLT5j dXJfZGVhZGxpbmU7CiAgICAgICAgZC5jdXJfZGVhZGxpbmVfaGkgPSAodW5zaWduZWQpIChzdmMt PmN1cl9kZWFkbGluZSA+PiAzMik7CiAgICAgICAgZC5jdXJfYnVkZ2V0X2xvID0gKHVuc2lnbmVk KSBzdmMtPmN1cl9idWRnZXQ7CiAgICAgICAgZC5jdXJfYnVkZ2V0X2hpID0gKHVuc2lnbmVkKSAo c3ZjLT5jdXJfYnVkZ2V0ID4+IDMyKTsKICAgICAgICB0cmFjZV92YXIoVFJDX1JURFNfQlVER0VU X1JFUExFTklTSCwgMSwKICAgICAgICAgICAgICAgICAgc2l6ZW9mKGQpLAogICAgICAgICAgICAg ICAgICAodW5zaWduZWQgY2hhciAqKSAmZCk7CiAgICB9CgogICAgcmV0dXJuOwp9CgovKiBhIGhl bHBlciBmdW5jdGlvbiB0aGF0IG9ubHkgcmVtb3ZlcyBhIHZjcHUgZnJvbSBhIHF1ZXVlICovCnN0 YXRpYyBpbmxpbmUgdm9pZApkZWFkbGluZV9xdWV1ZV9yZW1vdmUoc3RydWN0IGxpc3RfaGVhZCAq ZWxlbSkKewogICAgbGlzdF9kZWxfaW5pdChlbGVtKTsKfQoKc3RhdGljIGlubGluZSB2b2lkCl9f cV9yZW1vdmUoc3RydWN0IHJ0X3ZjcHUgKnN2YykKewogICAgaWYgKCBfX3ZjcHVfb25fcShzdmMp ICkKICAgICAgICBkZWFkbGluZV9xdWV1ZV9yZW1vdmUoJnN2Yy0+cV9lbGVtKTsKfQoKLyoKICog UmVtb3ZpbmcgYSB2Y3B1IGZyb20gdGhlIHJlcGxlbmlzaG1lbnQgcXVldWUgY291bGQKICogcmUt cHJvZ3JhbSB0aGUgdGltZXIgZm9yIHRoZSBuZXh0IHJlcGxlbmlzaG1lbnQgZXZlbnQKICogaWYg dGhlcmUgaXMgYW55IG9uIHRoZSBsaXN0CiAqLwpzdGF0aWMgaW5saW5lIHZvaWQKX19yZXBscV9y ZW1vdmUoY29uc3Qgc3RydWN0IHNjaGVkdWxlciAqb3BzLCBzdHJ1Y3QgcnRfdmNwdSAqc3ZjKQp7 CiAgICBzdHJ1Y3QgcnRfcHJpdmF0ZSAqcHJ2ID0gcnRfcHJpdihvcHMpOwogICAgc3RydWN0IGxp c3RfaGVhZCAqcmVwbHEgPSBydF9yZXBscShvcHMpOwogICAgc3RydWN0IHRpbWVyKiByZXBsX3Rp bWVyID0gcHJ2LT5yZXBsX3RpbWVyOwoKICAgIC8qCiAgICAgKiBEaXNhcm0gdGhlIHRpbWVyIGJl Zm9yZSByZS1wcm9ncmFtbWluZyBpdC4KICAgICAqIEl0IGRvZXNuJ3QgbWF0dGVyIGlmIHRoZSB2 Y3B1IHRvIGJlIHJlbW92ZWQKICAgICAqIGlzIG9uIHRvcCBvZiB0aGUgbGlzdCBvciBub3QgYmVj YXVzZSB0aGUgdGltZXIKICAgICAqIGlzIHN0b3BwZWQgYW5kIG5lZWRzIHRvIGJlIHJlLXByb2dy YW1tZWQgYW55d2F5cwogICAgICovCiAgICBzdG9wX3RpbWVyKHJlcGxfdGltZXIpOwoKICAgIGRl YWRsaW5lX3F1ZXVlX3JlbW92ZSgmc3ZjLT5yZXBscV9lbGVtKTsKCiAgICAvKiByZS1hcm0gdGhl IHRpbWVyIGZvciB0aGUgbmV4dCByZXBsZW5pc2htZW50IGV2ZW50ICovCiAgICBpZiggIWxpc3Rf ZW1wdHkocmVwbHEpICkKICAgIHsKICAgICAgICBzdHJ1Y3QgcnRfdmNwdSAqc3ZjX25leHQgPSBf X3JlcGxxX2VsZW0ocmVwbHEtPm5leHQpOwogICAgICAgIHNldF90aW1lcihyZXBsX3RpbWVyLCBz dmNfbmV4dC0+Y3VyX2RlYWRsaW5lKTsKICAgIH0KfQoKLyoKICogQW4gdXRpbGl0eSBmdW5jdGlv biB0aGF0IGluc2VydHMgYSB2Y3B1IHRvIGEKICogcXVldWUgYmFzZWQgb24gY2VydGFpbiBvcmRl ciAoRURGKS4gVGhlIHJldHVybmVkCiAqIHZhbHVlIGlzIDEgaWYgYSB2Y3B1IGhhcyBiZWVuIGlu c2VydGVkIHRvIHRoZQogKiBmcm9udCBvZiBhIGxpc3QKICovCnN0YXRpYyBpbnQKZGVhZGxpbmVf cXVldWVfaW5zZXJ0KHN0cnVjdCBydF92Y3B1ICogKCpfZ2V0X3FfZWxlbSkoc3RydWN0IGxpc3Rf aGVhZCAqZWxlbSksCiAgICBzdHJ1Y3QgcnRfdmNwdSAqc3ZjLCBzdHJ1Y3QgbGlzdF9oZWFkICpl bGVtLCBzdHJ1Y3QgbGlzdF9oZWFkICpxdWV1ZSkKewogICAgc3RydWN0IGxpc3RfaGVhZCAqaXRl cjsKICAgIGludCBwb3MgPSAwOwoKICAgIGxpc3RfZm9yX2VhY2goaXRlciwgcXVldWUpCiAgICB7 CiAgICAgICAgc3RydWN0IHJ0X3ZjcHUgKiBpdGVyX3N2YyA9ICgqX2dldF9xX2VsZW0pKGl0ZXIp OwogICAgICAgIGlmICggc3ZjLT5jdXJfZGVhZGxpbmUgPD0gaXRlcl9zdmMtPmN1cl9kZWFkbGlu ZSApCiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBwb3MrKzsKICAgIH0KCiAgICBsaXN0X2Fk ZF90YWlsKGVsZW0sIGl0ZXIpOwogICAgcmV0dXJuICFwb3M7Cn0KCi8qCiAqIEluc2VydCBzdmMg d2l0aCBidWRnZXQgaW4gUnVuUSBhY2NvcmRpbmcgdG8gRURGOgogKiB2Y3B1cyB3aXRoIHNtYWxs ZXIgZGVhZGxpbmVzIGdvIGZpcnN0LgogKiBJbnNlcnQgc3ZjIHdpdGhvdXQgYnVkZ2V0IGluIERl cGxldGVkUSB1bnNvcnRlZDsKICovCnN0YXRpYyB2b2lkCl9fcnVucV9pbnNlcnQoY29uc3Qgc3Ry dWN0IHNjaGVkdWxlciAqb3BzLCBzdHJ1Y3QgcnRfdmNwdSAqc3ZjKQp7CiAgICBzdHJ1Y3QgcnRf cHJpdmF0ZSAqcHJ2ID0gcnRfcHJpdihvcHMpOwogICAgc3RydWN0IGxpc3RfaGVhZCAqcnVucSA9 IHJ0X3J1bnEob3BzKTsKCiAgICBBU1NFUlQoIHNwaW5faXNfbG9ja2VkKCZwcnYtPmxvY2spICk7 CgogICAgQVNTRVJUKCAhX192Y3B1X29uX3Eoc3ZjKSApOwoKICAgIC8qIGFkZCBzdmMgdG8gcnVu cSBpZiBzdmMgc3RpbGwgaGFzIGJ1ZGdldCAqLwogICAgaWYgKCBzdmMtPmN1cl9idWRnZXQgPiAw ICkKICAgICAgICBkZWFkbGluZV9xdWV1ZV9pbnNlcnQoJl9fcV9lbGVtLCBzdmMsICZzdmMtPnFf ZWxlbSwgcnVucSk7CiAgICBlbHNlCiAgICB7CiAgICAgICAgbGlzdF9hZGQoJnN2Yy0+cV9lbGVt LCAmcHJ2LT5kZXBsZXRlZHEpOwogICAgICAgIEFTU0VSVCggX192Y3B1X29uX3JlcGxxKHN2Yykg KTsKICAgIH0KfQoKLyoKICogSW5zZXJ0IHN2YyBpbnRvIHRoZSByZXBsZW5pc2htZW50IGV2ZW50 IGxpc3QKICogaW4gcmVwbGVuaXNobWVudCB0aW1lIG9yZGVyLgogKiB2Y3B1cyB0aGF0IG5lZWQg dG8gYmUgcmVwbGlzaGVkIGVhcmxpZXIgZ28gZmlyc3QuCiAqIFRoZSB0aW1lciBtYXkgYmUgcmUt cHJvZ3JhbW1lZCBpZiBzdmMgaXMgaW5zZXJ0ZWQKICogYXQgdGhlIGZyb250IG9mIHRoZSBldmVu dCBsaXN0LgogKi8Kc3RhdGljIHZvaWQKX19yZXBscV9pbnNlcnQoY29uc3Qgc3RydWN0IHNjaGVk dWxlciAqb3BzLCBzdHJ1Y3QgcnRfdmNwdSAqc3ZjKQp7CiAgICBzdHJ1Y3QgbGlzdF9oZWFkICpy ZXBscSA9IHJ0X3JlcGxxKG9wcyk7CiAgICBzdHJ1Y3QgcnRfcHJpdmF0ZSAqcHJ2ID0gcnRfcHJp dihvcHMpOwogICAgc3RydWN0IHRpbWVyICpyZXBsX3RpbWVyID0gcHJ2LT5yZXBsX3RpbWVyOwog ICAgaW50IHNldDsKCiAgICBBU1NFUlQoICFfX3ZjcHVfb25fcmVwbHEoc3ZjKSApOwoKICAgIHNl dCA9IGRlYWRsaW5lX3F1ZXVlX2luc2VydCgmX19yZXBscV9lbGVtLCBzdmMsICZzdmMtPnJlcGxx X2VsZW0sIHJlcGxxKTsKIAogICAgaWYoIHNldCApCiAgICAgICAgc2V0X3RpbWVyKHJlcGxfdGlt ZXIsc3ZjLT5jdXJfZGVhZGxpbmUpOwp9CgovKgogKiBJbml0L0ZyZWUgcmVsYXRlZCBjb2RlCiAq LwpzdGF0aWMgaW50CnJ0X2luaXQoc3RydWN0IHNjaGVkdWxlciAqb3BzKQp7CiAgICBzdHJ1Y3Qg cnRfcHJpdmF0ZSAqcHJ2ID0geHphbGxvYyhzdHJ1Y3QgcnRfcHJpdmF0ZSk7CgogICAgcHJpbnRr KCJJbml0aWFsaXppbmcgUlREUyBzY2hlZHVsZXJcbiIKICAgICAgICAgICAiV0FSTklORzogVGhp cyBpcyBleHBlcmltZW50YWwgc29mdHdhcmUgaW4gZGV2ZWxvcG1lbnQuXG4iCiAgICAgICAgICAg IlVzZSBhdCB5b3VyIG93biByaXNrLlxuIik7CgogICAgaWYgKCBwcnYgPT0gTlVMTCApCiAgICAg ICAgcmV0dXJuIC1FTk9NRU07CgogICAgQVNTRVJUKCBfY3B1bWFza19zY3JhdGNoID09IE5VTEwg fHwgbnJfcnRfb3BzID4gMCApOwoKICAgIGlmICggIV9jcHVtYXNrX3NjcmF0Y2ggKQogICAgewog ICAgICAgIF9jcHVtYXNrX3NjcmF0Y2ggPSB4bWFsbG9jX2FycmF5KGNwdW1hc2tfdmFyX3QsIG5y X2NwdV9pZHMpOwogICAgICAgIGlmICggIV9jcHVtYXNrX3NjcmF0Y2ggKQogICAgICAgICAgICBn b3RvIG5vX21lbTsKICAgIH0KICAgIG5yX3J0X29wcysrOwoKICAgIHNwaW5fbG9ja19pbml0KCZw cnYtPmxvY2spOwogICAgSU5JVF9MSVNUX0hFQUQoJnBydi0+c2RvbSk7CiAgICBJTklUX0xJU1Rf SEVBRCgmcHJ2LT5ydW5xKTsKICAgIElOSVRfTElTVF9IRUFEKCZwcnYtPmRlcGxldGVkcSk7CiAg ICBJTklUX0xJU1RfSEVBRCgmcHJ2LT5yZXBscSk7CgogICAgY3B1bWFza19jbGVhcigmcHJ2LT50 aWNrbGVkKTsKCiAgICBvcHMtPnNjaGVkX2RhdGEgPSBwcnY7CgogICAgLyogCiAgICAgKiBUaGUg dGltZXIgaW5pdGlhbGl6YXRpb24gd2lsbCBoYXBwZW4gbGF0ZXIgd2hlbiAKICAgICAqIHRoZSBm aXJzdCBwY3B1IGlzIGFkZGVkIHRvIHRoaXMgcG9vbCBpbiBhbGxvY19wZGF0YQogICAgICovCiAg ICBwcnYtPnJlcGxfdGltZXIgPSBOVUxMOwoKICAgIHJldHVybiAwOwoKIG5vX21lbToKICAgIHhm cmVlKHBydik7CiAgICByZXR1cm4gLUVOT01FTTsKfQoKc3RhdGljIHZvaWQKcnRfZGVpbml0KGNv bnN0IHN0cnVjdCBzY2hlZHVsZXIgKm9wcykKewogICAgc3RydWN0IHJ0X3ByaXZhdGUgKnBydiA9 IHJ0X3ByaXYob3BzKTsKCiAgICBBU1NFUlQoIF9jcHVtYXNrX3NjcmF0Y2ggJiYgbnJfcnRfb3Bz ID4gMCApOwoKICAgIGlmICggKC0tbnJfcnRfb3BzKSA9PSAwICkKICAgIHsKICAgICAgICB4ZnJl ZShfY3B1bWFza19zY3JhdGNoKTsKICAgICAgICBfY3B1bWFza19zY3JhdGNoID0gTlVMTDsKICAg IH0KCiAgICBraWxsX3RpbWVyKHBydi0+cmVwbF90aW1lcik7CiAgICB4ZnJlZShwcnYtPnJlcGxf dGltZXIpOwoKICAgIHhmcmVlKHBydik7Cn0KCi8qCiAqIFBvaW50IHBlcl9jcHUgc3BpbmxvY2sg dG8gdGhlIGdsb2JhbCBzeXN0ZW0gbG9jazsKICogQWxsIGNwdSBoYXZlIHNhbWUgZ2xvYmFsIHN5 c3RlbSBsb2NrCiAqLwpzdGF0aWMgdm9pZCAqCnJ0X2FsbG9jX3BkYXRhKGNvbnN0IHN0cnVjdCBz Y2hlZHVsZXIgKm9wcywgaW50IGNwdSkKewogICAgc3RydWN0IHJ0X3ByaXZhdGUgKnBydiA9IHJ0 X3ByaXYob3BzKTsKICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CgogICAgc3Bpbl9sb2NrX2lycXNh dmUoJnBydi0+bG9jaywgZmxhZ3MpOwogICAgcGVyX2NwdShzY2hlZHVsZV9kYXRhLCBjcHUpLnNj aGVkdWxlX2xvY2sgPSAmcHJ2LT5sb2NrOwogICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJ2 LT5sb2NrLCBmbGFncyk7CgogICAgaWYgKCAhYWxsb2NfY3B1bWFza192YXIoJl9jcHVtYXNrX3Nj cmF0Y2hbY3B1XSkgKQogICAgICAgIHJldHVybiBOVUxMOwoKICAgIGlmKCBwcnYtPnJlcGxfdGlt ZXIgPT0gTlVMTCApCiAgICB7ICAgCiAgICAgICAgLyogYWxsb2NhdGUgdGhlIHRpbWVyIG9uIHRo ZSBmaXJzdCBjcHUgb2YgdGhpcyBwb29sICovCiAgICAgICAgcHJ2LT5yZXBsX3RpbWVyID0geHph bGxvYyhzdHJ1Y3QgdGltZXIpOwoKICAgICAgICBpZihwcnYtPnJlcGxfdGltZXIgPT0gTlVMTCAp CiAgICAgICAgICAgIHJldHVybiBOVUxMOwoKICAgICAgICBpbml0X3RpbWVyKHBydi0+cmVwbF90 aW1lciwgcmVwbF9oYW5kbGVyLCAodm9pZCAqKW9wcywgY3B1KTsKICAgIH0KCiAgICAvKiAxIGlu ZGljYXRlcyBhbGxvYy4gc3VjY2VlZCBpbiBzY2hlZHVsZS5jICovCiAgICByZXR1cm4gKHZvaWQg KikxOwp9CgpzdGF0aWMgdm9pZApydF9mcmVlX3BkYXRhKGNvbnN0IHN0cnVjdCBzY2hlZHVsZXIg Km9wcywgdm9pZCAqcGNwdSwgaW50IGNwdSkKewogICAgc3RydWN0IHJ0X3ByaXZhdGUgKnBydiA9 IHJ0X3ByaXYob3BzKTsKICAgIHN0cnVjdCBzY2hlZHVsZV9kYXRhICpzZCA9ICZwZXJfY3B1KHNj aGVkdWxlX2RhdGEsIGNwdSk7CiAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwoKICAgIHNwaW5fbG9j a19pcnFzYXZlKCZwcnYtPmxvY2ssIGZsYWdzKTsKCiAgICAvKiBNb3ZlIHNwaW5sb2NrIGJhY2sg dG8gdGhlIGRlZmF1bHQgbG9jayAqLwogICAgQVNTRVJUKHNkLT5zY2hlZHVsZV9sb2NrID09ICZw cnYtPmxvY2spOwogICAgQVNTRVJUKCFzcGluX2lzX2xvY2tlZCgmc2QtPl9sb2NrKSk7CiAgICBz ZC0+c2NoZWR1bGVfbG9jayA9ICZzZC0+X2xvY2s7CgogICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9y ZSgmcHJ2LT5sb2NrLCBmbGFncyk7CgogICAgZnJlZV9jcHVtYXNrX3ZhcihfY3B1bWFza19zY3Jh dGNoW2NwdV0pOwp9CgpzdGF0aWMgdm9pZCAqCnJ0X2FsbG9jX2RvbWRhdGEoY29uc3Qgc3RydWN0 IHNjaGVkdWxlciAqb3BzLCBzdHJ1Y3QgZG9tYWluICpkb20pCnsKICAgIHVuc2lnbmVkIGxvbmcg ZmxhZ3M7CiAgICBzdHJ1Y3QgcnRfZG9tICpzZG9tOwogICAgc3RydWN0IHJ0X3ByaXZhdGUgKiBw cnYgPSBydF9wcml2KG9wcyk7CgogICAgc2RvbSA9IHh6YWxsb2Moc3RydWN0IHJ0X2RvbSk7CiAg ICBpZiAoIHNkb20gPT0gTlVMTCApCiAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgSU5JVF9MSVNU X0hFQUQoJnNkb20tPnNkb21fZWxlbSk7CiAgICBzZG9tLT5kb20gPSBkb207CgogICAgLyogc3Bp bmxvY2sgaGVyZSB0byBpbnNlcnQgdGhlIGRvbSAqLwogICAgc3Bpbl9sb2NrX2lycXNhdmUoJnBy di0+bG9jaywgZmxhZ3MpOwogICAgbGlzdF9hZGRfdGFpbCgmc2RvbS0+c2RvbV9lbGVtLCAmKHBy di0+c2RvbSkpOwogICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJ2LT5sb2NrLCBmbGFncyk7 CgogICAgcmV0dXJuIHNkb207Cn0KCnN0YXRpYyB2b2lkCnJ0X2ZyZWVfZG9tZGF0YShjb25zdCBz dHJ1Y3Qgc2NoZWR1bGVyICpvcHMsIHZvaWQgKmRhdGEpCnsKICAgIHVuc2lnbmVkIGxvbmcgZmxh Z3M7CiAgICBzdHJ1Y3QgcnRfZG9tICpzZG9tID0gZGF0YTsKICAgIHN0cnVjdCBydF9wcml2YXRl ICpwcnYgPSBydF9wcml2KG9wcyk7CgogICAgc3Bpbl9sb2NrX2lycXNhdmUoJnBydi0+bG9jaywg ZmxhZ3MpOwogICAgbGlzdF9kZWxfaW5pdCgmc2RvbS0+c2RvbV9lbGVtKTsKICAgIHNwaW5fdW5s b2NrX2lycXJlc3RvcmUoJnBydi0+bG9jaywgZmxhZ3MpOwogICAgeGZyZWUoZGF0YSk7Cn0KCnN0 YXRpYyBpbnQKcnRfZG9tX2luaXQoY29uc3Qgc3RydWN0IHNjaGVkdWxlciAqb3BzLCBzdHJ1Y3Qg ZG9tYWluICpkb20pCnsKICAgIHN0cnVjdCBydF9kb20gKnNkb207CgogICAgLyogSURMRSBEb21h aW4gZG9lcyBub3QgbGluayBvbiBydF9wcml2YXRlICovCiAgICBpZiAoIGlzX2lkbGVfZG9tYWlu KGRvbSkgKQogICAgICAgIHJldHVybiAwOwoKICAgIHNkb20gPSBydF9hbGxvY19kb21kYXRhKG9w cywgZG9tKTsKICAgIGlmICggc2RvbSA9PSBOVUxMICkKICAgICAgICByZXR1cm4gLUVOT01FTTsK CiAgICBkb20tPnNjaGVkX3ByaXYgPSBzZG9tOwoKICAgIHJldHVybiAwOwp9CgpzdGF0aWMgdm9p ZApydF9kb21fZGVzdHJveShjb25zdCBzdHJ1Y3Qgc2NoZWR1bGVyICpvcHMsIHN0cnVjdCBkb21h aW4gKmRvbSkKewogICAgcnRfZnJlZV9kb21kYXRhKG9wcywgcnRfZG9tKGRvbSkpOwp9CgpzdGF0 aWMgdm9pZCAqCnJ0X2FsbG9jX3ZkYXRhKGNvbnN0IHN0cnVjdCBzY2hlZHVsZXIgKm9wcywgc3Ry dWN0IHZjcHUgKnZjLCB2b2lkICpkZCkKewogICAgc3RydWN0IHJ0X3ZjcHUgKnN2YzsKCiAgICAv KiBBbGxvY2F0ZSBwZXItVkNQVSBpbmZvICovCiAgICBzdmMgPSB4emFsbG9jKHN0cnVjdCBydF92 Y3B1KTsKICAgIGlmICggc3ZjID09IE5VTEwgKQogICAgICAgIHJldHVybiBOVUxMOwoKICAgIElO SVRfTElTVF9IRUFEKCZzdmMtPnFfZWxlbSk7CiAgICBJTklUX0xJU1RfSEVBRCgmc3ZjLT5yZXBs cV9lbGVtKTsKICAgIHN2Yy0+ZmxhZ3MgPSAwVTsKICAgIHN2Yy0+c2RvbSA9IGRkOwogICAgc3Zj LT52Y3B1ID0gdmM7CiAgICBzdmMtPmxhc3Rfc3RhcnQgPSAwOwoKICAgIHN2Yy0+cGVyaW9kID0g UlREU19ERUZBVUxUX1BFUklPRDsKICAgIGlmICggIWlzX2lkbGVfdmNwdSh2YykgKQogICAgICAg IHN2Yy0+YnVkZ2V0ID0gUlREU19ERUZBVUxUX0JVREdFVDsKCiAgICBTQ0hFRF9TVEFUX0NSQU5L KHZjcHVfYWxsb2MpOwoKICAgIHJldHVybiBzdmM7Cn0KCnN0YXRpYyB2b2lkCnJ0X2ZyZWVfdmRh dGEoY29uc3Qgc3RydWN0IHNjaGVkdWxlciAqb3BzLCB2b2lkICpwcml2KQp7CiAgICBzdHJ1Y3Qg cnRfdmNwdSAqc3ZjID0gcHJpdjsKCiAgICB4ZnJlZShzdmMpOwp9CgovKgogKiBJdCBpcyBjYWxs ZWQgaW4gc2NoZWRfbW92ZV9kb21haW4oKSBhbmQgc2NoZWRfaW5pdF92Y3B1CiAqIGluIHNjaGVk dWxlLmMKICogV2hlbiBtb3ZlIGEgZG9tYWluIHRvIGEgbmV3IGNwdXBvb2wuCiAqIEl0IGluc2Vy dHMgdmNwdXMgb2YgbW92aW5nIGRvbWFpbiB0byB0aGUgc2NoZWR1bGVyJ3MgUnVuUSBpbgogKiBk ZXN0LiBjcHVwb29sLgogKi8Kc3RhdGljIHZvaWQKcnRfdmNwdV9pbnNlcnQoY29uc3Qgc3RydWN0 IHNjaGVkdWxlciAqb3BzLCBzdHJ1Y3QgdmNwdSAqdmMpCnsKICAgIHN0cnVjdCBydF92Y3B1ICpz dmMgPSBydF92Y3B1KHZjKTsKICAgIHNfdGltZV90IG5vdyA9IE5PVygpOwogICAgc3BpbmxvY2tf dCAqbG9jazsKCiAgICBCVUdfT04oIGlzX2lkbGVfdmNwdSh2YykgKTsKCiAgICBsb2NrID0gdmNw dV9zY2hlZHVsZV9sb2NrX2lycSh2Yyk7CiAgICBpZiAoIG5vdyA+PSBzdmMtPmN1cl9kZWFkbGlu ZSApCiAgICAgICAgcnRfdXBkYXRlX2RlYWRsaW5lKG5vdywgc3ZjKTsKCiAgICBpZiAoICFfX3Zj cHVfb25fcShzdmMpICYmIHZjcHVfcnVubmFibGUodmMpICYmICF2Yy0+aXNfcnVubmluZyApCiAg ICB7CiAgICAgICAgX19ydW5xX2luc2VydChvcHMsIHN2Yyk7CiAgICAgICAgcHJpbnRrKCJ2Y3B1 JWQgaW5zZXJ0ZWQgdG8gcnVuIHF1ZXVlXG4iLHZjLT52Y3B1X2lkKTsKCiAgICB9CiAgICB2Y3B1 X3NjaGVkdWxlX3VubG9ja19pcnEobG9jaywgdmMpOwoKICAgIFNDSEVEX1NUQVRfQ1JBTksodmNw dV9pbnNlcnQpOwp9CgovKgogKiBSZW1vdmUgcnRfdmNwdSBzdmMgZnJvbSB0aGUgb2xkIHNjaGVk dWxlciBpbiBzb3VyY2UgY3B1cG9vbC4KICovCnN0YXRpYyB2b2lkCnJ0X3ZjcHVfcmVtb3ZlKGNv bnN0IHN0cnVjdCBzY2hlZHVsZXIgKm9wcywgc3RydWN0IHZjcHUgKnZjKQp7CiAgICBzdHJ1Y3Qg cnRfdmNwdSAqIGNvbnN0IHN2YyA9IHJ0X3ZjcHUodmMpOwogICAgc3RydWN0IHJ0X2RvbSAqIGNv bnN0IHNkb20gPSBzdmMtPnNkb207CiAgICBzcGlubG9ja190ICpsb2NrOwoKICAgIFNDSEVEX1NU QVRfQ1JBTksodmNwdV9yZW1vdmUpOwoKICAgIEJVR19PTiggc2RvbSA9PSBOVUxMICk7CgogICAg bG9jayA9IHZjcHVfc2NoZWR1bGVfbG9ja19pcnEodmMpOwogICAgaWYgKCBfX3ZjcHVfb25fcShz dmMpICkKICAgICAgICBfX3FfcmVtb3ZlKHN2Yyk7CgogICAgaWYoIF9fdmNwdV9vbl9yZXBscShz dmMpICkKICAgICAgICBfX3JlcGxxX3JlbW92ZShvcHMsc3ZjKTsKCiAgICB2Y3B1X3NjaGVkdWxl X3VubG9ja19pcnEobG9jaywgdmMpOwp9CgovKgogKiBQaWNrIGEgdmFsaWQgQ1BVIGZvciB0aGUg dmNwdSB2YwogKiBWYWxpZCBDUFUgb2YgYSB2Y3B1IGlzIGludGVzZWN0aW9uIG9mIHZjcHUncyBh ZmZpbml0eQogKiBhbmQgYXZhaWxhYmxlIGNwdXMKICovCnN0YXRpYyBpbnQKcnRfY3B1X3BpY2so Y29uc3Qgc3RydWN0IHNjaGVkdWxlciAqb3BzLCBzdHJ1Y3QgdmNwdSAqdmMpCnsKICAgIGNwdW1h c2tfdCBjcHVzOwogICAgY3B1bWFza190ICpvbmxpbmU7CiAgICBpbnQgY3B1OwoKICAgIG9ubGlu ZSA9IGNwdXBvb2xfZG9tYWluX2NwdW1hc2sodmMtPmRvbWFpbik7CiAgICBjcHVtYXNrX2FuZCgm Y3B1cywgb25saW5lLCB2Yy0+Y3B1X2hhcmRfYWZmaW5pdHkpOwoKICAgIGNwdSA9IGNwdW1hc2tf dGVzdF9jcHUodmMtPnByb2Nlc3NvciwgJmNwdXMpCiAgICAgICAgICAgID8gdmMtPnByb2Nlc3Nv cgogICAgICAgICAgICA6IGNwdW1hc2tfY3ljbGUodmMtPnByb2Nlc3NvciwgJmNwdXMpOwogICAg QVNTRVJUKCAhY3B1bWFza19lbXB0eSgmY3B1cykgJiYgY3B1bWFza190ZXN0X2NwdShjcHUsICZj cHVzKSApOwoKICAgIHJldHVybiBjcHU7Cn0KCi8qCiAqIEJ1cm4gYnVkZ2V0IGluIG5hbm9zZWNv bmQgZ3JhbnVsYXJpdHkKICovCnN0YXRpYyB2b2lkCmJ1cm5fYnVkZ2V0KGNvbnN0IHN0cnVjdCBz Y2hlZHVsZXIgKm9wcywgc3RydWN0IHJ0X3ZjcHUgKnN2Yywgc190aW1lX3Qgbm93KQp7CiAgICBz X3RpbWVfdCBkZWx0YTsKCiAgICAvKiBkb24ndCBidXJuIGJ1ZGdldCBmb3IgaWRsZSBWQ1BVICov CiAgICBpZiAoIGlzX2lkbGVfdmNwdShzdmMtPnZjcHUpICkKICAgICAgICByZXR1cm47CgogICAg LyogYnVybiBhdCBuYW5vc2Vjb25kcyBsZXZlbCAqLwogICAgZGVsdGEgPSBub3cgLSBzdmMtPmxh c3Rfc3RhcnQ7CiAgICAvKgogICAgICogZGVsdGEgPCAwIG9ubHkgaGFwcGVucyBpbiBuZXN0ZWQg dmlydHVhbGl6YXRpb247CiAgICAgKiBUT0RPOiBob3cgc2hvdWxkIHdlIGhhbmRsZSBkZWx0YSA8 IDAgaW4gYSBiZXR0ZXIgd2F5PwogICAgICovCiAgICBpZiAoIGRlbHRhIDwgMCApCiAgICB7CiAg ICAgICAgcHJpbnRrKCIlcywgQVRURU5USU9OOiBub3cgaXMgYmVoaW5kIGxhc3Rfc3RhcnQhIGRl bHRhPSUiUFJJX3N0aW1lIlxuIiwKICAgICAgICAgICAgICAgIF9fZnVuY19fLCBkZWx0YSk7CiAg ICAgICAgc3ZjLT5sYXN0X3N0YXJ0ID0gbm93OwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBz dmMtPmN1cl9idWRnZXQgLT0gZGVsdGE7CgogICAgaWYgKCBzdmMtPmN1cl9idWRnZXQgPCAwICkK ICAgICAgICBzdmMtPmN1cl9idWRnZXQgPSAwOwoKICAgIC8qIFRSQUNFICovCiAgICB7CiAgICAg ICAgc3RydWN0IHsKICAgICAgICAgICAgdW5zaWduZWQgZG9tOjE2LCB2Y3B1OjE2OwogICAgICAg ICAgICB1bnNpZ25lZCBjdXJfYnVkZ2V0X2xvOwogICAgICAgICAgICB1bnNpZ25lZCBjdXJfYnVk Z2V0X2hpOwogICAgICAgICAgICBpbnQgZGVsdGE7CiAgICAgICAgfSBkOwogICAgICAgIGQuZG9t ID0gc3ZjLT52Y3B1LT5kb21haW4tPmRvbWFpbl9pZDsKICAgICAgICBkLnZjcHUgPSBzdmMtPnZj cHUtPnZjcHVfaWQ7CiAgICAgICAgZC5jdXJfYnVkZ2V0X2xvID0gKHVuc2lnbmVkKSBzdmMtPmN1 cl9idWRnZXQ7CiAgICAgICAgZC5jdXJfYnVkZ2V0X2hpID0gKHVuc2lnbmVkKSAoc3ZjLT5jdXJf YnVkZ2V0ID4+IDMyKTsKICAgICAgICBkLmRlbHRhID0gZGVsdGE7CiAgICAgICAgdHJhY2VfdmFy KFRSQ19SVERTX0JVREdFVF9CVVJOLCAxLAogICAgICAgICAgICAgICAgICBzaXplb2YoZCksCiAg ICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyICopICZkKTsKICAgIH0KfQoKLyoKICogUnVu USBpcyBzb3J0ZWQuIFBpY2sgZmlyc3Qgb25lIHdpdGhpbiBjcHVtYXNrLiBJZiBubyBvbmUsIHJl dHVybiBOVUxMCiAqIGxvY2sgaXMgZ3JhYmJlZCBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9u CiAqLwpzdGF0aWMgc3RydWN0IHJ0X3ZjcHUgKgpfX3J1bnFfcGljayhjb25zdCBzdHJ1Y3Qgc2No ZWR1bGVyICpvcHMsIGNvbnN0IGNwdW1hc2tfdCAqbWFzaykKewogICAgc3RydWN0IGxpc3RfaGVh ZCAqcnVucSA9IHJ0X3J1bnEob3BzKTsKICAgIHN0cnVjdCBsaXN0X2hlYWQgKml0ZXI7CiAgICBz dHJ1Y3QgcnRfdmNwdSAqc3ZjID0gTlVMTDsKICAgIHN0cnVjdCBydF92Y3B1ICppdGVyX3N2YyA9 IE5VTEw7CiAgICBjcHVtYXNrX3QgY3B1X2NvbW1vbjsKICAgIGNwdW1hc2tfdCAqb25saW5lOwoK ICAgIGxpc3RfZm9yX2VhY2goaXRlciwgcnVucSkKICAgIHsKICAgICAgICBpdGVyX3N2YyA9IF9f cV9lbGVtKGl0ZXIpOwoKICAgICAgICAvKiBtYXNrIGNwdV9oYXJkX2FmZmluaXR5ICYgY3B1cG9v bCAmIG1hc2sgKi8KICAgICAgICBvbmxpbmUgPSBjcHVwb29sX2RvbWFpbl9jcHVtYXNrKGl0ZXJf c3ZjLT52Y3B1LT5kb21haW4pOwogICAgICAgIGNwdW1hc2tfYW5kKCZjcHVfY29tbW9uLCBvbmxp bmUsIGl0ZXJfc3ZjLT52Y3B1LT5jcHVfaGFyZF9hZmZpbml0eSk7CiAgICAgICAgY3B1bWFza19h bmQoJmNwdV9jb21tb24sIG1hc2ssICZjcHVfY29tbW9uKTsKICAgICAgICBpZiAoIGNwdW1hc2tf ZW1wdHkoJmNwdV9jb21tb24pICkKICAgICAgICAgICAgY29udGludWU7CgogICAgICAgIEFTU0VS VCggaXRlcl9zdmMtPmN1cl9idWRnZXQgPiAwICk7CgogICAgICAgIHN2YyA9IGl0ZXJfc3ZjOwog ICAgICAgIGJyZWFrOwogICAgfQoKICAgIC8qIFRSQUNFICovCiAgICB7CiAgICAgICAgaWYoIHN2 YyAhPSBOVUxMICkKICAgICAgICB7CiAgICAgICAgICAgIHN0cnVjdCB7CiAgICAgICAgICAgICAg ICB1bnNpZ25lZCBkb206MTYsIHZjcHU6MTY7CiAgICAgICAgICAgICAgICB1bnNpZ25lZCBjdXJf ZGVhZGxpbmVfbG8sIGN1cl9kZWFkbGluZV9oaTsKICAgICAgICAgICAgICAgIHVuc2lnbmVkIGN1 cl9idWRnZXRfbG8sIGN1cl9idWRnZXRfaGk7CiAgICAgICAgICAgIH0gZDsKICAgICAgICAgICAg ZC5kb20gPSBzdmMtPnZjcHUtPmRvbWFpbi0+ZG9tYWluX2lkOwogICAgICAgICAgICBkLnZjcHUg PSBzdmMtPnZjcHUtPnZjcHVfaWQ7CiAgICAgICAgICAgIGQuY3VyX2RlYWRsaW5lX2xvID0gKHVu c2lnbmVkKSBzdmMtPmN1cl9kZWFkbGluZTsKICAgICAgICAgICAgZC5jdXJfZGVhZGxpbmVfaGkg PSAodW5zaWduZWQpIChzdmMtPmN1cl9kZWFkbGluZSA+PiAzMik7CiAgICAgICAgICAgIGQuY3Vy X2J1ZGdldF9sbyA9ICh1bnNpZ25lZCkgc3ZjLT5jdXJfYnVkZ2V0OwogICAgICAgICAgICBkLmN1 cl9idWRnZXRfaGkgPSAodW5zaWduZWQpIChzdmMtPmN1cl9idWRnZXQgPj4gMzIpOwogICAgICAg ICAgICB0cmFjZV92YXIoVFJDX1JURFNfUlVOUV9QSUNLLCAxLAogICAgICAgICAgICAgICAgICAg ICAgc2l6ZW9mKGQpLAogICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIgKikgJmQp OwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgICAgIHRyYWNlX3ZhcihUUkNfUlREU19S VU5RX1BJQ0ssIDEsIDAsIE5VTEwpOwogICAgfQoKICAgIHJldHVybiBzdmM7Cn0KCi8qCiAqIHNj aGVkdWxlIGZ1bmN0aW9uIGZvciBydCBzY2hlZHVsZXIuCiAqIFRoZSBsb2NrIGlzIGFscmVhZHkg Z3JhYmJlZCBpbiBzY2hlZHVsZS5jLCBubyBuZWVkIHRvIGxvY2sgaGVyZQogKi8Kc3RhdGljIHN0 cnVjdCB0YXNrX3NsaWNlCnJ0X3NjaGVkdWxlKGNvbnN0IHN0cnVjdCBzY2hlZHVsZXIgKm9wcywg c190aW1lX3Qgbm93LCBib29sX3QgdGFza2xldF93b3JrX3NjaGVkdWxlZCkKewogICAgY29uc3Qg aW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKICAgIHN0cnVjdCBydF9wcml2YXRlICpwcnYg PSBydF9wcml2KG9wcyk7CiAgICBzdHJ1Y3QgcnRfdmNwdSAqY29uc3Qgc2N1cnIgPSBydF92Y3B1 KGN1cnJlbnQpOwogICAgc3RydWN0IHJ0X3ZjcHUgKnNuZXh0ID0gTlVMTDsKICAgIHN0cnVjdCB0 YXNrX3NsaWNlIHJldCA9IHsgLm1pZ3JhdGVkID0gMCB9OwoKICAgIC8qIGNsZWFyIHRpY2tlZCBi aXQgbm93IHRoYXQgd2UndmUgYmVlbiBzY2hlZHVsZWQgKi8KICAgIGNwdW1hc2tfY2xlYXJfY3B1 KGNwdSwgJnBydi0+dGlja2xlZCk7CgogICAgLyogYnVybl9idWRnZXQgd291bGQgcmV0dXJuIGZv ciBJRExFIFZDUFUgKi8KICAgIGJ1cm5fYnVkZ2V0KG9wcywgc2N1cnIsIG5vdyk7CgoKICAgIGlm ICggdGFza2xldF93b3JrX3NjaGVkdWxlZCApCiAgICB7CiAgICAgICAgc25leHQgPSBydF92Y3B1 KGlkbGVfdmNwdVtjcHVdKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBzbmV4dCA9IF9f cnVucV9waWNrKG9wcywgY3B1bWFza19vZihjcHUpKTsKICAgICAgICBpZiAoIHNuZXh0ID09IE5V TEwgKQogICAgICAgICAgICBzbmV4dCA9IHJ0X3ZjcHUoaWRsZV92Y3B1W2NwdV0pOwoKICAgICAg ICAvKiBpZiBzY3VyciBoYXMgaGlnaGVyIHByaW9yaXR5IGFuZCBidWRnZXQsIHN0aWxsIHBpY2sg c2N1cnIgKi8KICAgICAgICBpZiAoICFpc19pZGxlX3ZjcHUoY3VycmVudCkgJiYKICAgICAgICAg ICAgIHZjcHVfcnVubmFibGUoY3VycmVudCkgJiYKICAgICAgICAgICAgIHNjdXJyLT5jdXJfYnVk Z2V0ID4gMCAmJgogICAgICAgICAgICAgKCBpc19pZGxlX3ZjcHUoc25leHQtPnZjcHUpIHx8CiAg ICAgICAgICAgICAgIHNjdXJyLT5jdXJfZGVhZGxpbmUgPD0gc25leHQtPmN1cl9kZWFkbGluZSAp ICkKICAgICAgICAgICAgc25leHQgPSBzY3VycjsKICAgIH0KCiAgICBpZiAoIHNuZXh0ICE9IHNj dXJyICYmCiAgICAgICAgICFpc19pZGxlX3ZjcHUoY3VycmVudCkgJiYKICAgICAgICAgdmNwdV9y dW5uYWJsZShjdXJyZW50KSApCiAgICAgICAgc2V0X2JpdChfX1JURFNfZGVsYXllZF9ydW5xX2Fk ZCwgJnNjdXJyLT5mbGFncyk7CgogICAgc25leHQtPmxhc3Rfc3RhcnQgPSBub3c7CgogICAgcmV0 LnRpbWUgPSAgLTE7IC8qIGlmIGFuIGlkbGUgdmNwdSBpcyBwaWNrZWQgKi8gCiAgICBpZiAoICFp c19pZGxlX3ZjcHUoc25leHQtPnZjcHUpICkKICAgIHsKICAgICAgICBpZiAoIHNuZXh0ICE9IHNj dXJyICkKICAgICAgICB7CiAgICAgICAgICAgIF9fcV9yZW1vdmUoc25leHQpOwogICAgICAgICAg ICBzZXRfYml0KF9fUlREU19zY2hlZHVsZWQsICZzbmV4dC0+ZmxhZ3MpOwogICAgICAgIH0KICAg ICAgICBpZiAoIHNuZXh0LT52Y3B1LT5wcm9jZXNzb3IgIT0gY3B1ICkKICAgICAgICB7CiAgICAg ICAgICAgIHNuZXh0LT52Y3B1LT5wcm9jZXNzb3IgPSBjcHU7CiAgICAgICAgICAgIHJldC5taWdy YXRlZCA9IDE7CiAgICAgICAgfQoKICAgICAgICByZXQudGltZSA9IHNuZXh0LT5idWRnZXQ7IC8q IGludm9rZSB0aGUgc2NoZWR1bGVyIG5leHQgdGltZSAqLwoKICAgIH0KCiAgICByZXQudGFzayA9 IHNuZXh0LT52Y3B1OwogICAgaWYoIGlzX2lkbGVfdmNwdShzbmV4dC0+dmNwdSkpCiAgICB7CiAg ICAgICAgcHJpbnRrKCJjcHUlZCBwaWNrZWQgaWRsZVxuIixjcHUpOwogICAgfQogICAgZWxzZQog ICAgICAgIHByaW50aygiY3B1JWQgcGlja2VkIHZjcHUlZFxuIixjcHUsIHNuZXh0LT52Y3B1LT52 Y3B1X2lkKTsKCiAgICAvKiBUUkFDRSAqLwogICAgewogICAgICAgIHN0cnVjdCB7CiAgICAgICAg ICAgIHVuc2lnbmVkIGRvbToxNix2Y3B1OjE2OwogICAgICAgICAgICB1bnNpZ25lZCBjdXJfZGVh ZGxpbmVfbG8sIGN1cl9kZWFkbGluZV9oaTsKICAgICAgICAgICAgdW5zaWduZWQgY3VyX2J1ZGdl dF9sbywgY3VyX2J1ZGdldF9oaTsKICAgICAgICB9IGQ7CiAgICAgICAgZC5kb20gPSBzbmV4dC0+ dmNwdS0+ZG9tYWluLT5kb21haW5faWQ7CiAgICAgICAgZC52Y3B1ID0gc25leHQtPnZjcHUtPnZj cHVfaWQ7CiAgICAgICAgZC5jdXJfZGVhZGxpbmVfbG8gPSAodW5zaWduZWQpIHNuZXh0LT5jdXJf ZGVhZGxpbmU7CiAgICAgICAgZC5jdXJfZGVhZGxpbmVfaGkgPSAodW5zaWduZWQpIChzbmV4dC0+ Y3VyX2RlYWRsaW5lID4+IDMyKTsKICAgICAgICBkLmN1cl9idWRnZXRfbG8gPSAodW5zaWduZWQp IHNuZXh0LT5jdXJfYnVkZ2V0OwogICAgICAgIGQuY3VyX2J1ZGdldF9oaSA9ICh1bnNpZ25lZCkg KHNuZXh0LT5jdXJfYnVkZ2V0ID4+IDMyKTsKICAgICAgICB0cmFjZV92YXIoVFJDX1JURFNfU0NI RURfVEFTS0xFVCwgMSwKICAgICAgICAgICAgICAgICAgc2l6ZW9mKGQpLAogICAgICAgICAgICAg ICAgICAodW5zaWduZWQgY2hhciAqKSZkKTsKICAgIH0KCiAgICByZXR1cm4gcmV0Owp9CgovKgog KiBSZW1vdmUgVkNQVSBmcm9tIFJ1blEKICogVGhlIGxvY2sgaXMgYWxyZWFkeSBncmFiYmVkIGlu IHNjaGVkdWxlLmMsIG5vIG5lZWQgdG8gbG9jayBoZXJlCiAqLwpzdGF0aWMgdm9pZApydF92Y3B1 X3NsZWVwKGNvbnN0IHN0cnVjdCBzY2hlZHVsZXIgKm9wcywgc3RydWN0IHZjcHUgKnZjKQp7CiAg ICBzdHJ1Y3QgcnRfdmNwdSAqIGNvbnN0IHN2YyA9IHJ0X3ZjcHUodmMpOwoKICAgIEJVR19PTigg aXNfaWRsZV92Y3B1KHZjKSApOwogICAgU0NIRURfU1RBVF9DUkFOSyh2Y3B1X3NsZWVwKTsKCiAg ICBpZiAoIGN1cnJfb25fY3B1KHZjLT5wcm9jZXNzb3IpID09IHZjICkKICAgIHsKICAgICAgICBj cHVfcmFpc2Vfc29mdGlycSh2Yy0+cHJvY2Vzc29yLCBTQ0hFRFVMRV9TT0ZUSVJRKTsKICAgICAg ICBwcmludGsoInZjcHUlZCBzbGVlcHMgb24gY3B1XG4iLHZjLT52Y3B1X2lkKTsKCiAgICB9CiAg ICBlbHNlIGlmICggX192Y3B1X29uX3Eoc3ZjKSApCiAgICB7CiAgICAgICAgcHJpbnRrKCJ2Y3B1 JWQgc2xlZXBzIG9uIHF1ZXVlXG4iLHZjLT52Y3B1X2lkKTsKCiAgICAgICAgX19xX3JlbW92ZShz dmMpOwogICAgICAgX19yZXBscV9yZW1vdmUob3BzLCBzdmMpOyAKICAgIH0KICAgIGVsc2UgaWYg KCBzdmMtPmZsYWdzICYgUlREU19kZWxheWVkX3J1bnFfYWRkICkKICAgIHsKICAgICAgICBjbGVh cl9iaXQoX19SVERTX2RlbGF5ZWRfcnVucV9hZGQsICZzdmMtPmZsYWdzKTsKICAgICAgICBwcmlu dGsoInZjcHUlZCBzbGVlcHMgYmVmb3JlIGNvbnRleHQgc3dpdGNoIGZpbmlzaGVkXG4iLHZjLT52 Y3B1X2lkKTsKCiAgICB9Cn0KCi8qCiAqIFBpY2sgYSBjcHUgd2hlcmUgdG8gcnVuIGEgdmNwdSwK ICogcG9zc2libHkga2lja2luZyBvdXQgdGhlIHZjcHUgcnVubmluZyB0aGVyZQogKiBDYWxsZWQg Ynkgd2FrZSgpIGFuZCBjb250ZXh0X3NhdmVkKCkKICogV2UgaGF2ZSBhIHJ1bm5pbmcgY2FuZGlk YXRlIGhlcmUsIHRoZSBraWNrIGxvZ2ljIGlzOgogKiBBbW9uZyBhbGwgdGhlIGNwdXMgdGhhdCBh cmUgd2l0aGluIHRoZSBjcHUgYWZmaW5pdHkKICogMSkgaWYgdGhlIG5ldy0+Y3B1IGlzIGlkbGUs IGtpY2sgaXQuIFRoaXMgY291bGQgYmVuZWZpdCBjYWNoZSBoaXQKICogMikgaWYgdGhlcmUgYXJl IGFueSBpZGxlIHZjcHUsIGtpY2sgaXQuCiAqIDMpIG5vdyBhbGwgcGNwdXMgYXJlIGJ1c3k7CiAq ICAgIGFtb25nIGFsbCB0aGUgcnVubmluZyB2Y3B1cywgcGljayBsb3dlc3QgcHJpb3JpdHkgb25l CiAqICAgIGlmIHNuZXh0IGhhcyBoaWdoZXIgcHJpb3JpdHksIGtpY2sgaXQuCiAqCiAqIFRPRE86 CiAqIDEpIHdoYXQgaWYgdGhlc2UgdHdvIHZjcHVzIGJlbG9uZ3MgdG8gdGhlIHNhbWUgZG9tYWlu PwogKiAgICByZXBsYWNlIGEgdmNwdSBiZWxvbmdpbmcgdG8gdGhlIHNhbWUgZG9tYWluIGludHJv ZHVjZXMgbW9yZSBvdmVyaGVhZAogKgogKiBsb2NrIGlzIGdyYWJiZWQgYmVmb3JlIGNhbGxpbmcg dGhpcyBmdW5jdGlvbgogKi8Kc3RhdGljIHZvaWQKcnVucV90aWNrbGUoY29uc3Qgc3RydWN0IHNj aGVkdWxlciAqb3BzLCBzdHJ1Y3QgcnRfdmNwdSAqbmV3KQp7CiAgICBzdHJ1Y3QgcnRfcHJpdmF0 ZSAqcHJ2ID0gcnRfcHJpdihvcHMpOwogICAgc3RydWN0IHJ0X3ZjcHUgKmxhdGVzdF9kZWFkbGlu ZV92Y3B1ID0gTlVMTDsgLyogbG93ZXN0IHByaW9yaXR5ICovCiAgICBzdHJ1Y3QgcnRfdmNwdSAq aXRlcl9zdmM7CiAgICBzdHJ1Y3QgdmNwdSAqaXRlcl92YzsKICAgIGludCBjcHUgPSAwLCBjcHVf dG9fdGlja2xlID0gMDsKICAgIGNwdW1hc2tfdCBub3RfdGlja2xlZDsKICAgIGNwdW1hc2tfdCAq b25saW5lOwoKICAgIGlmICggbmV3ID09IE5VTEwgfHwgaXNfaWRsZV92Y3B1KG5ldy0+dmNwdSkg KQogICAgICAgIHJldHVybjsKCiAgICBvbmxpbmUgPSBjcHVwb29sX2RvbWFpbl9jcHVtYXNrKG5l dy0+dmNwdS0+ZG9tYWluKTsKICAgIGNwdW1hc2tfYW5kKCZub3RfdGlja2xlZCwgb25saW5lLCBu ZXctPnZjcHUtPmNwdV9oYXJkX2FmZmluaXR5KTsKICAgIGNwdW1hc2tfYW5kbm90KCZub3RfdGlj a2xlZCwgJm5vdF90aWNrbGVkLCAmcHJ2LT50aWNrbGVkKTsKCiAgICAvKiAxKSBpZiBuZXcncyBw cmV2aW91cyBjcHUgaXMgaWRsZSwga2ljayBpdCBmb3IgY2FjaGUgYmVuZWZpdCAqLwogICAgaWYg KCBpc19pZGxlX3ZjcHUoY3Vycl9vbl9jcHUobmV3LT52Y3B1LT5wcm9jZXNzb3IpKSApCiAgICB7 CiAgICAgICAgY3B1X3RvX3RpY2tsZSA9IG5ldy0+dmNwdS0+cHJvY2Vzc29yOwogICAgICAgIGdv dG8gb3V0OwogICAgfQoKICAgIC8qIDIpIGlmIHRoZXJlIGFyZSBhbnkgaWRsZSBwY3B1LCBraWNr IGl0ICovCiAgICAvKiBUaGUgc2FtZSBsb29wIGFsc28gZmluZCB0aGUgb25lIHdpdGggbG93ZXN0 IHByaW9yaXR5ICovCiAgICBmb3JfZWFjaF9jcHUoY3B1LCAmbm90X3RpY2tsZWQpCiAgICB7CiAg ICAgICAgaXRlcl92YyA9IGN1cnJfb25fY3B1KGNwdSk7CiAgICAgICAgaWYgKCBpc19pZGxlX3Zj cHUoaXRlcl92YykgKQogICAgICAgIHsKICAgICAgICAgICAgY3B1X3RvX3RpY2tsZSA9IGNwdTsK ICAgICAgICAgICAgZ290byBvdXQ7CiAgICAgICAgfQogICAgICAgIGl0ZXJfc3ZjID0gcnRfdmNw dShpdGVyX3ZjKTsKICAgICAgICBpZiAoIGxhdGVzdF9kZWFkbGluZV92Y3B1ID09IE5VTEwgfHwK ICAgICAgICAgICAgIGl0ZXJfc3ZjLT5jdXJfZGVhZGxpbmUgPiBsYXRlc3RfZGVhZGxpbmVfdmNw dS0+Y3VyX2RlYWRsaW5lICkKICAgICAgICAgICAgbGF0ZXN0X2RlYWRsaW5lX3ZjcHUgPSBpdGVy X3N2YzsKICAgIH0KCiAgICAvKiAzKSBjYW5kaWNhdGUgaGFzIGhpZ2hlciBwcmlvcml0eSwga2lj ayBvdXQgbG93ZXN0IHByaW9yaXR5IHZjcHUgKi8KICAgIGlmICggbGF0ZXN0X2RlYWRsaW5lX3Zj cHUgIT0gTlVMTCAmJgogICAgICAgICBuZXctPmN1cl9kZWFkbGluZSA8IGxhdGVzdF9kZWFkbGlu ZV92Y3B1LT5jdXJfZGVhZGxpbmUgKQogICAgewogICAgICAgIGNwdV90b190aWNrbGUgPSBsYXRl c3RfZGVhZGxpbmVfdmNwdS0+dmNwdS0+cHJvY2Vzc29yOwogICAgICAgIGdvdG8gb3V0OwogICAg fQoKICAgIC8qIGRpZG4ndCB0aWNrbGUgYW55IGNwdSAqLwogICAgU0NIRURfU1RBVF9DUkFOSyh0 aWNrbGVfaWRsZXJzX25vbmUpOwogICAgcmV0dXJuOwpvdXQ6CiAgICAvKiBUUkFDRSAqLwogICAg ewogICAgICAgIHN0cnVjdCB7CiAgICAgICAgICAgIHVuc2lnbmVkIGNwdToxNiwgcGFkOjE2Owog ICAgICAgIH0gZDsKICAgICAgICBkLmNwdSA9IGNwdV90b190aWNrbGU7CiAgICAgICAgZC5wYWQg PSAwOwogICAgICAgIHRyYWNlX3ZhcihUUkNfUlREU19USUNLTEUsIDAsCiAgICAgICAgICAgICAg ICAgIHNpemVvZihkKSwKICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIgKikmZCk7CiAg ICB9CgogICAgY3B1bWFza19zZXRfY3B1KGNwdV90b190aWNrbGUsICZwcnYtPnRpY2tsZWQpOwog ICAgU0NIRURfU1RBVF9DUkFOSyh0aWNrbGVfaWRsZXJzX3NvbWUpOwogICAgY3B1X3JhaXNlX3Nv ZnRpcnEoY3B1X3RvX3RpY2tsZSwgU0NIRURVTEVfU09GVElSUSk7CiAgICByZXR1cm47Cn0KCi8q CiAqIFNob3VsZCBhbHdheXMgd2FrZSB1cCBydW5uYWJsZSB2Y3B1LCBwdXQgaXQgYmFjayB0byBS dW5RLgogKiBDaGVjayBwcmlvcml0eSB0byByYWlzZSBpbnRlcnJ1cHQKICogVGhlIGxvY2sgaXMg YWxyZWFkeSBncmFiYmVkIGluIHNjaGVkdWxlLmMsIG5vIG5lZWQgdG8gbG9jayBoZXJlCiAqIFRP RE86IHdoYXQgaWYgdGhlc2UgdHdvIHZjcHVzIGJlbG9uZ3MgdG8gdGhlIHNhbWUgZG9tYWluPwog Ki8Kc3RhdGljIHZvaWQKcnRfdmNwdV93YWtlKGNvbnN0IHN0cnVjdCBzY2hlZHVsZXIgKm9wcywg c3RydWN0IHZjcHUgKnZjKQp7CiAgICBzdHJ1Y3QgcnRfdmNwdSAqIGNvbnN0IHN2YyA9IHJ0X3Zj cHUodmMpOwogICAgc190aW1lX3Qgbm93ID0gTk9XKCk7CgogICAgQlVHX09OKCBpc19pZGxlX3Zj cHUodmMpICk7CgogICAgaWYgKCB1bmxpa2VseShjdXJyX29uX2NwdSh2Yy0+cHJvY2Vzc29yKSA9 PSB2YykgKQogICAgewogICAgICAgIHByaW50aygidmNwdSVkIHdha2VzIHVwIG9uIGNwdVxuIix2 Yy0+dmNwdV9pZCk7CiAgICAgICAgU0NIRURfU1RBVF9DUkFOSyh2Y3B1X3dha2VfcnVubmluZyk7 CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8qIG9uIFJ1blEvRGVwbGV0ZWRRLCBqdXN0IHVw ZGF0ZSBpbmZvIGlzIG9rICovCiAgICBpZiAoIHVubGlrZWx5KF9fdmNwdV9vbl9xKHN2YykpICkK ICAgIHsKICAgICAgICBwcmludGsoInZjcHUlZCB3YWtlcyB1cCBvbiBxdWV1ZVxuIix2Yy0+dmNw dV9pZCk7CgogICAgICAgIFNDSEVEX1NUQVRfQ1JBTksodmNwdV93YWtlX29ucnVucSk7CiAgICAg ICAgcmV0dXJuOwogICAgfQoKICAgIHByaW50aygidmNwdSVkIHdha2VzIHVwIG5vd2hlcmVcbiIs dmMtPnZjcHVfaWQpOwoKICAgIGlmICggbGlrZWx5KHZjcHVfcnVubmFibGUodmMpKSApCiAgICAg ICAgU0NIRURfU1RBVF9DUkFOSyh2Y3B1X3dha2VfcnVubmFibGUpOwogICAgZWxzZQogICAgICAg IFNDSEVEX1NUQVRfQ1JBTksodmNwdV93YWtlX25vdF9ydW5uYWJsZSk7CgogICAgLyoKICAgICAq IElmIGEgZGVhZGxpbmUgcGFzc2VkIHdoaWxlIHN2YyB3YXMgYXNsZWVwL2Jsb2NrZWQsIHdlIG5l ZWQgbmV3CiAgICAgKiBzY2hlZHVsaW5nIHBhcmFtZXRlcnMgKCBhIG5ldyBkZWFkbGluZSBhbmQg ZnVsbCBidWRnZXQpLCBhbmQKICAgICAqIGFsc28gYSBuZXcgcmVwbGVuaXNobWVudCBldmVudAog ICAgICovCiAgICBpZiAoIG5vdyA+PSBzdmMtPmN1cl9kZWFkbGluZSkKICAgIHsgICAKICAgICAg ICBydF91cGRhdGVfZGVhZGxpbmUobm93LCBzdmMpOwogICAgICAgIF9fcmVwbHFfcmVtb3ZlKG9w cywgc3ZjKTsKICAgIH0KCiAgIC8vIGlmKCAhX192Y3B1X29uX3JlcGxxKHN2YykgKQogICAgICAg IF9fcmVwbHFfaW5zZXJ0KG9wcywgc3ZjKTsKCiAgICAvKiBJZiBjb250ZXh0IGhhc24ndCBiZWVu IHNhdmVkIGZvciB0aGlzIHZjcHUgeWV0LCB3ZSBjYW4ndCBwdXQgaXQgb24KICAgICAqIHRoZSBS dW5xdWV1ZS9EZXBsZXRlZFEuIEluc3RlYWQsIHdlIHNldCBhIGZsYWcgc28gdGhhdCBpdCB3aWxs IGJlCiAgICAgKiBwdXQgb24gdGhlIFJ1bnF1ZXVlL0RlcGxldGVkUSBhZnRlciB0aGUgY29udGV4 dCBoYXMgYmVlbiBzYXZlZC4KICAgICAqLwogICAgaWYgKCB1bmxpa2VseShzdmMtPmZsYWdzICYg UlREU19zY2hlZHVsZWQpICkKICAgIHsKICAgICAgICBzZXRfYml0KF9fUlREU19kZWxheWVkX3J1 bnFfYWRkLCAmc3ZjLT5mbGFncyk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8qIGluc2Vy dCBzdmMgdG8gcnVucS9kZXBsZXRlZHEgYmVjYXVzZSBzdmMgaXMgbm90IGluIHF1ZXVlIG5vdyAq LwogICAgX19ydW5xX2luc2VydChvcHMsIHN2Yyk7CgogICAgcnVucV90aWNrbGUob3BzLCBzdmMp Owp9CgovKgogKiBzY3VyciBoYXMgZmluaXNoZWQgY29udGV4dCBzd2l0Y2gsIGluc2VydCBpdCBi YWNrIHRvIHRoZSBSdW5RLAogKiBhbmQgdGhlbiBwaWNrIHRoZSBoaWdoZXN0IHByaW9yaXR5IHZj cHUgZnJvbSBydW5xIHRvIHJ1bgogKi8Kc3RhdGljIHZvaWQKcnRfY29udGV4dF9zYXZlZChjb25z dCBzdHJ1Y3Qgc2NoZWR1bGVyICpvcHMsIHN0cnVjdCB2Y3B1ICp2YykKewogICAgc3RydWN0IHJ0 X3ZjcHUgKnN2YyA9IHJ0X3ZjcHUodmMpOwogICAgc3BpbmxvY2tfdCAqbG9jayA9IHZjcHVfc2No ZWR1bGVfbG9ja19pcnEodmMpOwoKICAgIGNsZWFyX2JpdChfX1JURFNfc2NoZWR1bGVkLCAmc3Zj LT5mbGFncyk7CiAgICAvKiBub3QgaW5zZXJ0IGlkbGUgdmNwdSB0byBydW5xICovCiAgICBpZiAo IGlzX2lkbGVfdmNwdSh2YykgKQogICAgICAgIGdvdG8gb3V0OwoKICAgIGlmICggdGVzdF9hbmRf Y2xlYXJfYml0KF9fUlREU19kZWxheWVkX3J1bnFfYWRkLCAmc3ZjLT5mbGFncykgJiYKICAgICAg ICAgbGlrZWx5KHZjcHVfcnVubmFibGUodmMpKSApCiAgICB7CiAgICAgICAgcHJpbnRrKCJ2Y3B1 JWQgY29udGV4dCBzYXZlZCBhbmQgYWRkZWQgYmFjayB0byBxdWV1ZVxuIix2Yy0+dmNwdV9pZCk7 CgogICAgICAgIF9fcnVucV9pbnNlcnQob3BzLCBzdmMpOwogICAgICAgIHJ1bnFfdGlja2xlKG9w cywgc3ZjKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBfX3JlcGxxX3JlbW92ZShvcHMs IHN2Yyk7CiAgICAgICAgcHJpbnRrKCJ2Y3B1JWQgY29udGV4dCBzYXZlZCBub3QgcnVubmFibGVc biIsdmMtPnZjcHVfaWQpOwoKICAgIH0Kb3V0OgogICAgdmNwdV9zY2hlZHVsZV91bmxvY2tfaXJx KGxvY2ssIHZjKTsKfQoKLyoKICogc2V0L2dldCBlYWNoIHZjcHUgaW5mbyBvZiBlYWNoIGRvbWFp bgogKi8Kc3RhdGljIGludApydF9kb21fY250bCgKICAgIGNvbnN0IHN0cnVjdCBzY2hlZHVsZXIg Km9wcywKICAgIHN0cnVjdCBkb21haW4gKmQsCiAgICBzdHJ1Y3QgeGVuX2RvbWN0bF9zY2hlZHVs ZXJfb3AgKm9wKQp7CiAgICBzdHJ1Y3QgcnRfcHJpdmF0ZSAqcHJ2ID0gcnRfcHJpdihvcHMpOwog ICAgc3RydWN0IHJ0X3ZjcHUgKnN2YzsKICAgIHN0cnVjdCB2Y3B1ICp2OwogICAgdW5zaWduZWQg bG9uZyBmbGFnczsKICAgIGludCByYyA9IDA7CgogICAgc3dpdGNoICggb3AtPmNtZCApCiAgICB7 CiAgICBjYXNlIFhFTl9ET01DVExfU0NIRURPUF9nZXRpbmZvOgogICAgICAgIGlmICggZC0+bWF4 X3ZjcHVzID4gMCApCiAgICAgICAgewogICAgICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmcHJ2 LT5sb2NrLCBmbGFncyk7CiAgICAgICAgICAgIHN2YyA9IHJ0X3ZjcHUoZC0+dmNwdVswXSk7CiAg ICAgICAgICAgIG9wLT51LnJ0ZHMucGVyaW9kID0gc3ZjLT5wZXJpb2QgLyBNSUNST1NFQ1MoMSk7 CiAgICAgICAgICAgIG9wLT51LnJ0ZHMuYnVkZ2V0ID0gc3ZjLT5idWRnZXQgLyBNSUNST1NFQ1Mo MSk7CiAgICAgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBydi0+bG9jaywgZmxhZ3Mp OwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICAvKiBJZiB3ZSBk b24ndCBoYXZlIHZjcHVzIHlldCwgbGV0J3MganVzdCByZXR1cm4gdGhlIGRlZmF1bHRzLiAqLwog ICAgICAgICAgICBvcC0+dS5ydGRzLnBlcmlvZCA9IFJURFNfREVGQVVMVF9QRVJJT0Q7CiAgICAg ICAgICAgIG9wLT51LnJ0ZHMuYnVkZ2V0ID0gUlREU19ERUZBVUxUX0JVREdFVDsKICAgICAgICB9 CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIFhFTl9ET01DVExfU0NIRURPUF9wdXRpbmZvOgogICAg ICAgIGlmICggb3AtPnUucnRkcy5wZXJpb2QgPT0gMCB8fCBvcC0+dS5ydGRzLmJ1ZGdldCA9PSAw ICkKICAgICAgICB7CiAgICAgICAgICAgIHJjID0gLUVJTlZBTDsKICAgICAgICAgICAgYnJlYWs7 CiAgICAgICAgfQogICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZwcnYtPmxvY2ssIGZsYWdzKTsK ICAgICAgICBmb3JfZWFjaF92Y3B1ICggZCwgdiApCiAgICAgICAgewogICAgICAgICAgICBzdmMg PSBydF92Y3B1KHYpOwogICAgICAgICAgICBzdmMtPnBlcmlvZCA9IE1JQ1JPU0VDUyhvcC0+dS5y dGRzLnBlcmlvZCk7IC8qIHRyYW5zZmVyIHRvIG5hbm9zZWMgKi8KICAgICAgICAgICAgc3ZjLT5i dWRnZXQgPSBNSUNST1NFQ1Mob3AtPnUucnRkcy5idWRnZXQpOwogICAgICAgIH0KICAgICAgICBz cGluX3VubG9ja19pcnFyZXN0b3JlKCZwcnYtPmxvY2ssIGZsYWdzKTsKICAgICAgICBicmVhazsK ICAgIH0KCiAgICByZXR1cm4gcmM7Cn0KCi8qCiAqIFRoZSByZXBsZW5pc2htZW50IHRpbWVyIGhh bmRsZXIgcGlja3MgdmNwdXMKICogZnJvbSB0aGUgcmVwbHEgYW5kIGRvZXMgdGhlIGFjdHVhbCBy ZXBsZW5pc2htZW50CiAqLwpzdGF0aWMgdm9pZCByZXBsX2hhbmRsZXIodm9pZCAqZGF0YSl7CiAg ICB1bnNpZ25lZCBsb25nIGZsYWdzOwogICAgc190aW1lX3Qgbm93ID0gTk9XKCk7CiAgICBzdHJ1 Y3Qgc2NoZWR1bGVyICpvcHMgPSBkYXRhOyAKICAgIHN0cnVjdCBydF9wcml2YXRlICpwcnYgPSBy dF9wcml2KG9wcyk7CiAgICBzdHJ1Y3QgbGlzdF9oZWFkICpyZXBscSA9IHJ0X3JlcGxxKG9wcyk7 CiAgICBzdHJ1Y3QgdGltZXIgKnJlcGxfdGltZXIgPSBwcnYtPnJlcGxfdGltZXI7CiAgICBzdHJ1 Y3QgbGlzdF9oZWFkICppdGVyLCAqdG1wOwogICAgc3RydWN0IHJ0X3ZjcHUgKnN2YyA9IE5VTEw7 CgogICAgc3Bpbl9sb2NrX2lycXNhdmUoJnBydi0+bG9jaywgZmxhZ3MpOwoKICAgIHN0b3BfdGlt ZXIocmVwbF90aW1lcik7CgogICAgbGlzdF9mb3JfZWFjaF9zYWZlKGl0ZXIsIHRtcCwgcmVwbHEp CiAgICB7CiAgICAgICAgc3ZjID0gX19yZXBscV9lbGVtKGl0ZXIpOwoKICAgICAgICBpZiAoIG5v dyA8IHN2Yy0+Y3VyX2RlYWRsaW5lICkKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIHJ0X3Vw ZGF0ZV9kZWFkbGluZShub3csIHN2Yyk7CgogICAgICAgIC8qCiAgICAgICAgICogd2hlbiB0aGUg cmVwbGVuaXNobWVudCBoYXBwZW5zCiAgICAgICAgICogc3ZjIGlzIGVpdGhlciBvbiBhIHBjcHUg b3Igb24KICAgICAgICAgKiBydW5xL2RlcGxldGVkcQogICAgICAgICAqLwogICAgICAgIGlmKCBf X3ZjcHVfb25fcShzdmMpICkKICAgICAgICB7CiAgICAgICAgICAgIC8qIHB1dCBiYWNrIHRvIHJ1 bnEgKi8KICAgICAgICAgICAgX19xX3JlbW92ZShzdmMpOwogICAgICAgICAgICBfX3J1bnFfaW5z ZXJ0KG9wcywgc3ZjKTsKICAgICAgICB9CgogICAgICAgIC8qIAogICAgICAgICAqIHRpY2tsZSBy ZWdhcmRsZXNzIHdoZXJlIGl0J3MgYXQgCiAgICAgICAgICogYmVjYXVzZSBhIHJ1bm5pbmcgdmNw dSBjb3VsZCBoYXZlCiAgICAgICAgICogYSBsYXRlciBkZWFkbGluZSB0aGFuIG90aGVycyBhZnRl cgogICAgICAgICAqIHJlcGxlbmlzaG1lbnQKICAgICAgICAgKi8KICAgICAgICBydW5xX3RpY2ts ZShvcHMsIHN2Yyk7CgogICAgICAgIC8qIAogICAgICAgICAqIHVwZGF0ZSByZXBsZW5pc2htZW50 IGV2ZW50IHF1ZXVlCiAgICAgICAgICogd2l0aG91dCByZXByb2dyYW1taW5nIHRoZSB0aW1lcgog ICAgICAgICAqLwogICAgICAgIGRlYWRsaW5lX3F1ZXVlX3JlbW92ZSgmc3ZjLT5yZXBscV9lbGVt KTsKICAgICAgICBkZWFkbGluZV9xdWV1ZV9pbnNlcnQoJl9fcmVwbHFfZWxlbSwgc3ZjLCAmc3Zj LT5yZXBscV9lbGVtLCByZXBscSk7CiAgICB9CgogICAgLyogCiAgICAgKiB1c2UgdGhlIHZjcHUg dGhhdCdzIG9uIHRoZSB0b3AKICAgICAqIG9yIGVsc2UgZG9uJ3QgcHJvZ3JhbSB0aGUgdGltZXIK ICAgICAqLwogICAgaWYoICFsaXN0X2VtcHR5KHJlcGxxKSApCiAgICAgICAgc2V0X3RpbWVyKHJl cGxfdGltZXIsIF9fcmVwbHFfZWxlbShyZXBscS0+bmV4dCktPmN1cl9kZWFkbGluZSk7CgogICAg c3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJ2LT5sb2NrLCBmbGFncyk7Cn0KCnN0YXRpYyBzdHJ1 Y3QgcnRfcHJpdmF0ZSBfcnRfcHJpdjsKCnN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2NoZWR1bGVyIHNj aGVkX3J0ZHNfZGVmID0gewogICAgLm5hbWUgICAgICAgICAgID0gIlNNUCBSVERTIFNjaGVkdWxl ciIsCiAgICAub3B0X25hbWUgICAgICAgPSAicnRkcyIsCiAgICAuc2NoZWRfaWQgICAgICAgPSBY RU5fU0NIRURVTEVSX1JURFMsCiAgICAuc2NoZWRfZGF0YSAgICAgPSAmX3J0X3ByaXYsCgogICAg LmR1bXBfY3B1X3N0YXRlID0gcnRfZHVtcF9wY3B1LAogICAgLmR1bXBfc2V0dGluZ3MgID0gcnRf ZHVtcCwKICAgIC5pbml0ICAgICAgICAgICA9IHJ0X2luaXQsCiAgICAuZGVpbml0ICAgICAgICAg PSBydF9kZWluaXQsCiAgICAuYWxsb2NfcGRhdGEgICAgPSBydF9hbGxvY19wZGF0YSwKICAgIC5m cmVlX3BkYXRhICAgICA9IHJ0X2ZyZWVfcGRhdGEsCiAgICAuYWxsb2NfZG9tZGF0YSAgPSBydF9h bGxvY19kb21kYXRhLAogICAgLmZyZWVfZG9tZGF0YSAgID0gcnRfZnJlZV9kb21kYXRhLAogICAg LmluaXRfZG9tYWluICAgID0gcnRfZG9tX2luaXQsCiAgICAuZGVzdHJveV9kb21haW4gPSBydF9k b21fZGVzdHJveSwKICAgIC5hbGxvY192ZGF0YSAgICA9IHJ0X2FsbG9jX3ZkYXRhLAogICAgLmZy ZWVfdmRhdGEgICAgID0gcnRfZnJlZV92ZGF0YSwKICAgIC5pbnNlcnRfdmNwdSAgICA9IHJ0X3Zj cHVfaW5zZXJ0LAogICAgLnJlbW92ZV92Y3B1ICAgID0gcnRfdmNwdV9yZW1vdmUsCgogICAgLmFk anVzdCAgICAgICAgID0gcnRfZG9tX2NudGwsCgogICAgLnBpY2tfY3B1ICAgICAgID0gcnRfY3B1 X3BpY2ssCiAgICAuZG9fc2NoZWR1bGUgICAgPSBydF9zY2hlZHVsZSwKICAgIC5zbGVlcCAgICAg ICAgICA9IHJ0X3ZjcHVfc2xlZXAsCiAgICAud2FrZSAgICAgICAgICAgPSBydF92Y3B1X3dha2Us CiAgICAuY29udGV4dF9zYXZlZCAgPSBydF9jb250ZXh0X3NhdmVkLAp9OwoKUkVHSVNURVJfU0NI RURVTEVSKHNjaGVkX3J0ZHNfZGVmKTsK --=_c9b3c5915c9bb24ce21f5ea1f72d3e55 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: base64 Content-Disposition: inline X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KWGVuLWRldmVs IG1haWxpbmcgbGlzdApYZW4tZGV2ZWxAbGlzdHMueGVuLm9yZwpodHRwOi8vbGlzdHMueGVuLm9y Zy94ZW4tZGV2ZWwK --=_c9b3c5915c9bb24ce21f5ea1f72d3e55--