Date: Sun, 4 Jan 2015 11:56:14 -0600 From: Bryan Venteicher <bryanv@daemoninthecloset.org> To: FreeBSD-current <freebsd-current@freebsd.org> Cc: freebsd-arch@freebsd.org Subject: [CFT] Paravirtualized KVM clock Message-ID: <CAMo0n6QUp3iZ2fEqbrsD2MhEsWWOPTLisd9iB7TNEvbevcK0Fw@mail.gmail.com>
next in thread | raw e-mail | index | archive | help
--001a11425fb46ce52b050bd74b4a Content-Type: text/plain; charset=UTF-8 For the last few weeks, I've been working on adding support for KVM clock in the projects/paravirt branch. Currently, a KVM VM guest will end up selecting either the HPET or ACPI as the timecounter source. Unfortunately, this is very costly since every timecounter fetch causes a VM exit. KVM clock allows the guest to use the TSC instead; it is very similar to the existing Xen timer. The performance difference between HPET/ACPI and KVMCLOCK can be dramatic: a simple disk benchmark goes from 10K IOPs to 100K IOPs. The patch is attached is attached or available at [1]. I'd appreciate any testing. Also as a part of this, I've tried to generalized a bit of our existing hypervisor guest code, with the eventual goal of being able to support more invasive PV operations. The patch series is viewable in Phabricator. https://reviews.freebsd.org/D1429 - paravirt: Generalize parts of the XEN timer code into pvclock https://reviews.freebsd.org/D1430 - paravirt: Add interface to calculate the TSC frequency from pvclock https://reviews.freebsd.org/D1431 - paravirt: Add simple hypervisor registration and detection interface https://reviews.freebsd.org/D1432 - paravirt: Add detection of bhyve using new hypervisor interface https://reviews.freebsd.org/D1433 - paravirt: Add detection of VMware using new hypervisor interface https://reviews.freebsd.org/D1434 - paravirt: Add detection of KVM using new hypervisor interface https://reviews.freebsd.org/D1435 - paravirt: Add KVM clock timecounter support My current plan is to MFC this series to 10-STABLE, and commit a self-contained KVM clock to the other stable branches. [1] - https://people.freebsd.org/~bryanv/patches/kvm_clock-1.patch --001a11425fb46ce52b050bd74b4a Content-Type: text/x-patch; charset=US-ASCII; name="kvm_clock-1.patch" Content-Disposition: attachment; filename="kvm_clock-1.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_i4ipow0z0 ZGlmZiAtLWdpdCBhL3N5cy9hbWQ2NC9pbmNsdWRlL3B2Y2xvY2suaCBiL3N5cy9hbWQ2NC9pbmNs dWRlL3B2Y2xvY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDFmYWM2 Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzL2FtZDY0L2luY2x1ZGUvcHZjbG9jay5oCkBAIC0wLDAg KzEsNiBAQAorLyotCisgKiBUaGlzIGZpbGUgaXMgaW4gdGhlIHB1YmxpYyBkb21haW4uCisgKi8K Ky8qICRGcmVlQlNEJCAqLworCisjaW5jbHVkZSA8eDg2L3B2Y2xvY2suaD4KZGlmZiAtLWdpdCBh L3N5cy9jb25mL2ZpbGVzLmFtZDY0IGIvc3lzL2NvbmYvZmlsZXMuYW1kNjQKaW5kZXggYmJiZTgy Ny4uN2Q4NTc0MiAxMDA2NDQKLS0tIGEvc3lzL2NvbmYvZmlsZXMuYW1kNjQKKysrIGIvc3lzL2Nv bmYvZmlsZXMuYW1kNjQKQEAgLTU1NSwxMyArNTU1LDE3IEBAIHg4Ni9pc2Evbm1pLmMJCQlzdGFu ZGFyZAogeDg2L2lzYS9vcm0uYwkJCW9wdGlvbmFsCWlzYQogeDg2L3BjaS9wY2lfYnVzLmMJCW9w dGlvbmFsCXBjaQogeDg2L3BjaS9xcGkuYwkJCW9wdGlvbmFsCXBjaQoreDg2L3g4Ni9iaHl2ZS5j CQkJc3RhbmRhcmQKIHg4Ni94ODYvYnVzZG1hX2JvdW5jZS5jCQlzdGFuZGFyZAogeDg2L3g4Ni9i dXNkbWFfbWFjaGRlcC5jCXN0YW5kYXJkCiB4ODYveDg2L2R1bXBfbWFjaGRlcC5jCQlzdGFuZGFy ZAogeDg2L3g4Ni9mZHRfbWFjaGRlcC5jCQlvcHRpb25hbAlmZHQKK3g4Ni94ODYvaHlwZXJ2aXNv ci5jCQlzdGFuZGFyZAogeDg2L3g4Ni9pZGVudGNwdS5jCQlzdGFuZGFyZAogeDg2L3g4Ni9pbnRy X21hY2hkZXAuYwkJc3RhbmRhcmQKIHg4Ni94ODYvaW9fYXBpYy5jCQlzdGFuZGFyZAoreDg2L3g4 Ni9rdm0uYwkJCXN0YW5kYXJkCit4ODYveDg2L2t2bV9jbG9jay5jCQlzdGFuZGFyZAogeDg2L3g4 Ni9sZWdhY3kuYwkJc3RhbmRhcmQKIHg4Ni94ODYvbG9jYWxfYXBpYy5jCQlzdGFuZGFyZAogeDg2 L3g4Ni9tY2EuYwkJCXN0YW5kYXJkCkBAIC01NjksOCArNTczLDEwIEBAIHg4Ni94ODYvbXB0YWJs ZS5jCQlvcHRpb25hbAltcHRhYmxlCiB4ODYveDg2L21wdGFibGVfcGNpLmMJCW9wdGlvbmFsCW1w dGFibGUgcGNpCiB4ODYveDg2L21zaS5jCQkJb3B0aW9uYWwJcGNpCiB4ODYveDg2L25leHVzLmMJ CQlzdGFuZGFyZAoreDg2L3g4Ni9wdmNsb2NrLmMJCXN0YW5kYXJkCiB4ODYveDg2L3RzYy5jCQkJ c3RhbmRhcmQKIHg4Ni94ODYvZGVsYXkuYwkJCXN0YW5kYXJkCit4ODYveDg2L3Ztd2FyZS5jCQlz dGFuZGFyZAogeDg2L3hlbi9odm0uYwkJCW9wdGlvbmFsCXhlbmh2bQogeDg2L3hlbi94ZW5faW50 ci5jCQlvcHRpb25hbAl4ZW4gfCB4ZW5odm0KIHg4Ni94ZW4vcHYuYwkJCW9wdGlvbmFsCXhlbmh2 bQpkaWZmIC0tZ2l0IGEvc3lzL2NvbmYvZmlsZXMuaTM4NiBiL3N5cy9jb25mL2ZpbGVzLmkzODYK aW5kZXggOTY4NzliOC4uY2E4M2M0YyAxMDA2NDQKLS0tIGEvc3lzL2NvbmYvZmlsZXMuaTM4Ngor KysgYi9zeXMvY29uZi9maWxlcy5pMzg2CkBAIC01NzMsMTMgKzU3MywxNyBAQCB4ODYvaXNhL25t aS5jCQkJc3RhbmRhcmQKIHg4Ni9pc2Evb3JtLmMJCQlvcHRpb25hbCBpc2EKIHg4Ni9wY2kvcGNp X2J1cy5jCQlvcHRpb25hbCBwY2kKIHg4Ni9wY2kvcXBpLmMJCQlvcHRpb25hbCBwY2kKK3g4Ni94 ODYvYmh5dmUuYwkJCXN0YW5kYXJkCiB4ODYveDg2L2J1c2RtYV9ib3VuY2UuYwkJc3RhbmRhcmQK IHg4Ni94ODYvYnVzZG1hX21hY2hkZXAuYwlzdGFuZGFyZAogeDg2L3g4Ni9kdW1wX21hY2hkZXAu YwkJc3RhbmRhcmQKIHg4Ni94ODYvZmR0X21hY2hkZXAuYwkJb3B0aW9uYWwgZmR0Cit4ODYveDg2 L2h5cGVydmlzb3IuYwkJc3RhbmRhcmQKIHg4Ni94ODYvaWRlbnRjcHUuYwkJc3RhbmRhcmQKIHg4 Ni94ODYvaW50cl9tYWNoZGVwLmMJCXN0YW5kYXJkCiB4ODYveDg2L2lvX2FwaWMuYwkJb3B0aW9u YWwgYXBpYworeDg2L3g4Ni9rdm0uYwkJCXN0YW5kYXJkCit4ODYveDg2L2t2bV9jbG9jay5jCQlz dGFuZGFyZAogeDg2L3g4Ni9sZWdhY3kuYwkJb3B0aW9uYWwgbmF0aXZlCiB4ODYveDg2L2xvY2Fs X2FwaWMuYwkJb3B0aW9uYWwgYXBpYwogeDg2L3g4Ni9tY2EuYwkJCXN0YW5kYXJkCkBAIC01ODgs NyArNTkyLDkgQEAgeDg2L3g4Ni9tcHRhYmxlX3BjaS5jCQlvcHRpb25hbCBhcGljIG5hdGl2ZSBw Y2kKIHg4Ni94ODYvbXNpLmMJCQlvcHRpb25hbCBhcGljIHBjaQogeDg2L3g4Ni9uZXh1cy5jCQkJ c3RhbmRhcmQKIHg4Ni94ODYvdHNjLmMJCQlzdGFuZGFyZAoreDg2L3g4Ni9wdmNsb2NrLmMJCXN0 YW5kYXJkCiB4ODYveDg2L2RlbGF5LmMJCQlzdGFuZGFyZAoreDg2L3g4Ni92bXdhcmUuYwkJc3Rh bmRhcmQKIHg4Ni94ZW4vaHZtLmMJCQlvcHRpb25hbCB4ZW5odm0KIHg4Ni94ZW4veGVuX2ludHIu YwkJb3B0aW9uYWwgeGVuIHwgeGVuaHZtCiB4ODYveGVuL3hlbl9hcGljLmMJCW9wdGlvbmFsIHhl bmh2bQpkaWZmIC0tZ2l0IGEvc3lzL2Rldi94ZW4vdGltZXIvdGltZXIuYyBiL3N5cy9kZXYveGVu L3RpbWVyL3RpbWVyLmMKaW5kZXggNTc0MzA3Ni4uNTNhZmYwYSAxMDA2NDQKLS0tIGEvc3lzL2Rl di94ZW4vdGltZXIvdGltZXIuYworKysgYi9zeXMvZGV2L3hlbi90aW1lci90aW1lci5jCkBAIC01 OSw2ICs1OSw3IEBAIF9fRkJTRElEKCIkRnJlZUJTRCQiKTsKICNpbmNsdWRlIDxtYWNoaW5lL2Ns b2NrLmg+CiAjaW5jbHVkZSA8bWFjaGluZS9faW50dHlwZXMuaD4KICNpbmNsdWRlIDxtYWNoaW5l L3NtcC5oPgorI2luY2x1ZGUgPG1hY2hpbmUvcHZjbG9jay5oPgogCiAjaW5jbHVkZSA8ZGV2L3hl bi90aW1lci90aW1lci5oPgogCkBAIC05NSw5ICs5Niw2IEBAIHN0cnVjdCB4ZW50aW1lcl9zb2Z0 YyB7CiAJc3RydWN0IGV2ZW50dGltZXIgZXQ7CiB9OwogCi0vKiBMYXN0IHRpbWU7IHRoaXMgZ3Vh cmFudGVlcyBhIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZyBjbG9jay4gKi8KLXZvbGF0aWxlIHVp bnQ2NF90IHhlbl90aW1lcl9sYXN0X3RpbWUgPSAwOwotCiBzdGF0aWMgdm9pZAogeGVudGltZXJf aWRlbnRpZnkoZHJpdmVyX3QgKmRyaXZlciwgZGV2aWNlX3QgcGFyZW50KQogewpAQCAtMTQ4LDEy OCArMTQ2LDIwIEBAIHhlbnRpbWVyX3Byb2JlKGRldmljZV90IGRldikKIAlyZXR1cm4gKEJVU19Q Uk9CRV9OT1dJTERDQVJEKTsKIH0KIAotLyoKLSAqIFNjYWxlIGEgNjQtYml0IGRlbHRhIGJ5IHNj YWxpbmcgYW5kIG11bHRpcGx5aW5nIGJ5IGEgMzItYml0IGZyYWN0aW9uLAotICogeWllbGRpbmcg YSA2NC1iaXQgcmVzdWx0LgotICovCi1zdGF0aWMgaW5saW5lIHVpbnQ2NF90Ci1zY2FsZV9kZWx0 YSh1aW50NjRfdCBkZWx0YSwgdWludDMyX3QgbXVsX2ZyYWMsIGludCBzaGlmdCkKLXsKLQl1aW50 NjRfdCBwcm9kdWN0OwotCi0JaWYgKHNoaWZ0IDwgMCkKLQkJZGVsdGEgPj49IC1zaGlmdDsKLQll bHNlCi0JCWRlbHRhIDw8PSBzaGlmdDsKLQotI2lmIGRlZmluZWQoX19pMzg2X18pCi0JewotCQl1 aW50MzJfdCB0bXAxLCB0bXAyOwotCi0JCS8qKgotCQkgKiBGb3IgaTM4NiwgdGhlIGZvcm11bGEg bG9va3MgbGlrZToKLQkJICoKLQkJICogICBsb3dlciA9IChtdWxfZnJhYyAqIChkZWx0YSAmIFVJ TlRfTUFYKSkgPj4gMzIKLQkJICogICB1cHBlciA9IG11bF9mcmFjICogKGRlbHRhID4+IDMyKQot CQkgKiAgIHByb2R1Y3QgPSBsb3dlciArIHVwcGVyCi0JCSAqLwotCQlfX2FzbV9fICgKLQkJCSJt dWwgICU1ICAgICAgIDsgIgotCQkJIm1vdiAgJTQsJSVlYXggOyAiCi0JCQkibW92ICAlJWVkeCwl NCA7ICIKLQkJCSJtdWwgICU1ICAgICAgIDsgIgotCQkJInhvciAgJTUsJTUgICAgOyAiCi0JCQki YWRkICAlNCwlJWVheCA7ICIKLQkJCSJhZGMgICU1LCUlZWR4IDsgIgotCQkJOiAiPUEiIChwcm9k dWN0KSwgIj1yIiAodG1wMSksICI9ciIgKHRtcDIpCi0JCQk6ICJhIiAoKHVpbnQzMl90KWRlbHRh KSwgIjEiICgodWludDMyX3QpKGRlbHRhID4+IDMyKSksCi0JCQkgICIyIiAobXVsX2ZyYWMpICk7 Ci0JfQotI2VsaWYgZGVmaW5lZChfX2FtZDY0X18pCi0JewotCQl1bnNpZ25lZCBsb25nIHRtcDsK LQotCQlfX2FzbV9fICgKLQkJCSJtdWxxICVbbXVsX2ZyYWNdIDsgc2hyZCAkMzIsICVbaGldLCAl W2xvXSIKLQkJCTogW2xvXSI9YSIgKHByb2R1Y3QpLCBbaGldIj1kIiAodG1wKQotCQkJOiAiMCIg KGRlbHRhKSwgW211bF9mcmFjXSJybSIoKHVpbnQ2NF90KW11bF9mcmFjKSk7Ci0JfQotI2Vsc2UK LSNlcnJvciAieGVudGltZXI6IHVuc3VwcG9ydGVkIGFyY2hpdGVjdHVyZSIKLSNlbmRpZgotCi0J cmV0dXJuIChwcm9kdWN0KTsKLX0KLQotc3RhdGljIHVpbnQ2NF90Ci1nZXRfbnNlY19vZmZzZXQo c3RydWN0IHZjcHVfdGltZV9pbmZvICp0aW5mbykKLXsKLQotCXJldHVybiAoc2NhbGVfZGVsdGEo cmR0c2MoKSAtIHRpbmZvLT50c2NfdGltZXN0YW1wLAotCSAgICB0aW5mby0+dHNjX3RvX3N5c3Rl bV9tdWwsIHRpbmZvLT50c2Nfc2hpZnQpKTsKLX0KLQotLyoKLSAqIFJlYWQgdGhlIGN1cnJlbnQg aHlwZXJ2aXNvciBzeXN0ZW0gdXB0aW1lIHZhbHVlIGZyb20gWGVuLgotICogU2VlIDx4ZW4vaW50 ZXJmYWNlL3hlbi5oPiBmb3IgYSBkZXNjcmlwdGlvbiBvZiBob3cgdGhpcyB3b3Jrcy4KLSAqLwot c3RhdGljIHVpbnQzMl90Ci14ZW5fZmV0Y2hfdmNwdV90aW5mbyhzdHJ1Y3QgdmNwdV90aW1lX2lu Zm8gKmRzdCwgc3RydWN0IHZjcHVfdGltZV9pbmZvICpzcmMpCi17Ci0KLQlkbyB7Ci0JCWRzdC0+ dmVyc2lvbiA9IHNyYy0+dmVyc2lvbjsKLQkJcm1iKCk7Ci0JCWRzdC0+dHNjX3RpbWVzdGFtcCA9 IHNyYy0+dHNjX3RpbWVzdGFtcDsKLQkJZHN0LT5zeXN0ZW1fdGltZSA9IHNyYy0+c3lzdGVtX3Rp bWU7Ci0JCWRzdC0+dHNjX3RvX3N5c3RlbV9tdWwgPSBzcmMtPnRzY190b19zeXN0ZW1fbXVsOwot CQlkc3QtPnRzY19zaGlmdCA9IHNyYy0+dHNjX3NoaWZ0OwotCQlybWIoKTsKLQl9IHdoaWxlICgo c3JjLT52ZXJzaW9uICYgMSkgfCAoZHN0LT52ZXJzaW9uIF4gc3JjLT52ZXJzaW9uKSk7Ci0KLQly ZXR1cm4gKGRzdC0+dmVyc2lvbik7Ci19Ci0KIC8qKgogICogXGJyaWVmIEdldCB0aGUgY3VycmVu dCB0aW1lLCBpbiBuYW5vc2Vjb25kcywgc2luY2UgdGhlIGh5cGVydmlzb3IgYm9vdGVkLgogICoK ICAqIFxwYXJhbSB2Y3B1CQl2Y3B1X2luZm8gc3RydWN0dXJlIHRvIGZldGNoIHRoZSB0aW1lIGZy b20uCiAgKgotICogXG5vdGUgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBjdXJyZW50IENQVSdz IGlkZWEgb2YgdGhpcyB2YWx1ZSwgdW5sZXNzCi0gKiAgICAgICBpdCBoYXBwZW5zIHRvIGJlIGxl c3MgdGhhbiBhbm90aGVyIENQVSdzIHByZXZpb3VzbHkgZGV0ZXJtaW5lZCB2YWx1ZS4KICAqLwog c3RhdGljIHVpbnQ2NF90CiB4ZW5fZmV0Y2hfdmNwdV90aW1lKHN0cnVjdCB2Y3B1X2luZm8gKnZj cHUpCiB7Ci0Jc3RydWN0IHZjcHVfdGltZV9pbmZvIGRzdDsKLQlzdHJ1Y3QgdmNwdV90aW1lX2lu Zm8gKnNyYzsKLQl1aW50MzJfdCBwcmVfdmVyc2lvbjsKLQl1aW50NjRfdCBub3c7Ci0Jdm9sYXRp bGUgdWludDY0X3QgbGFzdDsKLQotCXNyYyA9ICZ2Y3B1LT50aW1lOwotCi0JZG8gewotCQlwcmVf dmVyc2lvbiA9IHhlbl9mZXRjaF92Y3B1X3RpbmZvKCZkc3QsIHNyYyk7Ci0JCWJhcnJpZXIoKTsK LQkJbm93ID0gZHN0LnN5c3RlbV90aW1lICsgZ2V0X25zZWNfb2Zmc2V0KCZkc3QpOwotCQliYXJy aWVyKCk7Ci0JfSB3aGlsZSAocHJlX3ZlcnNpb24gIT0gc3JjLT52ZXJzaW9uKTsKKwlzdHJ1Y3Qg cHZjbG9ja192Y3B1X3RpbWVfaW5mbyAqdGltZTsKIAotCS8qCi0JICogRW5mb3JjZSBhIG1vbm90 b25pY2FsbHkgaW5jcmVhc2luZyBjbG9jayB0aW1lIGFjcm9zcyBhbGwKLQkgKiBWQ1BVcy4gIElm IG91ciB0aW1lIGlzIHRvbyBvbGQsIHVzZSB0aGUgbGFzdCB0aW1lIGFuZCByZXR1cm4uCi0JICog T3RoZXJ3aXNlLCB0cnkgdG8gdXBkYXRlIHRoZSBsYXN0IHRpbWUuCi0JICovCi0JZG8gewotCQls YXN0ID0geGVuX3RpbWVyX2xhc3RfdGltZTsKLQkJaWYgKGxhc3QgPiBub3cpIHsKLQkJCW5vdyA9 IGxhc3Q7Ci0JCQlicmVhazsKLQkJfQotCX0gd2hpbGUgKCFhdG9taWNfY21wc2V0XzY0KCZ4ZW5f dGltZXJfbGFzdF90aW1lLCBsYXN0LCBub3cpKTsKKwl0aW1lID0gKHN0cnVjdCBwdmNsb2NrX3Zj cHVfdGltZV9pbmZvICopICZ2Y3B1LT50aW1lOwogCi0JcmV0dXJuIChub3cpOworCXJldHVybiAo cHZjbG9ja19nZXRfdGltZWNvdW50KHRpbWUpKTsKIH0KIAogc3RhdGljIHVpbnQzMl90CkBAIC0z MDIsMTUgKzE5MiwxMSBAQCBzdGF0aWMgdm9pZAogeGVuX2ZldGNoX3dhbGxjbG9jayhzdHJ1Y3Qg dGltZXNwZWMgKnRzKQogewogCXNoYXJlZF9pbmZvX3QgKnNyYyA9IEhZUEVSVklTT1Jfc2hhcmVk X2luZm87Ci0JdWludDMyX3QgdmVyc2lvbiA9IDA7CisJc3RydWN0IHB2Y2xvY2tfd2FsbF9jbG9j ayAqd2M7CiAKLQlkbyB7Ci0JCXZlcnNpb24gPSBzcmMtPndjX3ZlcnNpb247Ci0JCXJtYigpOwot CQl0cy0+dHZfc2VjID0gc3JjLT53Y19zZWM7Ci0JCXRzLT50dl9uc2VjID0gc3JjLT53Y19uc2Vj OwotCQlybWIoKTsKLQl9IHdoaWxlICgoc3JjLT53Y192ZXJzaW9uICYgMSkgfCAodmVyc2lvbiBe IHNyYy0+d2NfdmVyc2lvbikpOworCXdjID0gKHN0cnVjdCBwdmNsb2NrX3dhbGxfY2xvY2sgKikg JnNyYy0+d2NfdmVyc2lvbjsKKworCXB2Y2xvY2tfZ2V0X3dhbGxjbG9jayh3YywgdHMpOwogfQog CiBzdGF0aWMgdm9pZApAQCAtNTc0LDcgKzQ2MCw3IEBAIHhlbnRpbWVyX3Jlc3VtZShkZXZpY2Vf dCBkZXYpCiAJfQogCiAJLyogUmVzZXQgdGhlIGxhc3QgdXB0aW1lIHZhbHVlICovCi0JeGVuX3Rp bWVyX2xhc3RfdGltZSA9IDA7CisJcHZjbG9ja19yZXN1bWUoKTsKIAogCS8qIFJlc2V0IHRoZSBS VEMgY2xvY2sgKi8KIAlpbml0dG9kcih0aW1lX3NlY29uZCk7CmRpZmYgLS1naXQgYS9zeXMvaTM4 Ni9pbmNsdWRlL3B2Y2xvY2suaCBiL3N5cy9pMzg2L2luY2x1ZGUvcHZjbG9jay5oCm5ldyBmaWxl IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwMWZhYzYKLS0tIC9kZXYvbnVsbAorKysgYi9z eXMvaTM4Ni9pbmNsdWRlL3B2Y2xvY2suaApAQCAtMCwwICsxLDYgQEAKKy8qLQorICogVGhpcyBm aWxlIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluLgorICovCisvKiAkRnJlZUJTRCQgKi8KKworI2lu Y2x1ZGUgPHg4Ni9wdmNsb2NrLmg+CmRpZmYgLS1naXQgYS9zeXMva2Vybi9zdWJyX3BhcmFtLmMg Yi9zeXMva2Vybi9zdWJyX3BhcmFtLmMKaW5kZXggOTVmMzI1MC4uNTMzMjA1NSAxMDA2NDQKLS0t IGEvc3lzL2tlcm4vc3Vicl9wYXJhbS5jCisrKyBiL3N5cy9rZXJuL3N1YnJfcGFyYW0uYwpAQCAt MTU5LDYgKzE1OSw4IEBAIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCB2bV9ndWVzdF9zeXNjdGxf bmFtZXNbXSA9IHsKIAkieGVuIiwKIAkiaHYiLAogCSJ2bXdhcmUiLAorCSJiaHl2ZSIsCisJImt2 bSIsCiAJTlVMTAogfTsKIENUQVNTRVJUKG5pdGVtcyh2bV9ndWVzdF9zeXNjdGxfbmFtZXMpIC0g MSA9PSBWTV9MQVNUKTsKZGlmZiAtLWdpdCBhL3N5cy9zeXMvc3lzdG0uaCBiL3N5cy9zeXMvc3lz dG0uaAppbmRleCBkMzgzM2QwLi41MGE0OWQyIDEwMDY0NAotLS0gYS9zeXMvc3lzL3N5c3RtLmgK KysrIGIvc3lzL3N5cy9zeXN0bS5oCkBAIC03Myw3ICs3Myw3IEBAIGV4dGVybiBpbnQgdm1fZ3Vl c3Q7CQkvKiBSdW5uaW5nIGFzIHZpcnR1YWwgbWFjaGluZSBndWVzdD8gKi8KICAqIEtlZXAgaW4g c3luYyB3aXRoIHZtX2d1ZXN0X3N5c2N0bF9uYW1lc1tdLgogICovCiBlbnVtIFZNX0dVRVNUIHsg Vk1fR1VFU1RfTk8gPSAwLCBWTV9HVUVTVF9WTSwgVk1fR1VFU1RfWEVOLCBWTV9HVUVTVF9IViwK LQkJVk1fR1VFU1RfVk1XQVJFLCBWTV9MQVNUIH07CisJCVZNX0dVRVNUX1ZNV0FSRSwgVk1fR1VF U1RfQkhZVkUsIFZNX0dVRVNUX0tWTSwgVk1fTEFTVCB9OwogCiAjaWYgZGVmaW5lZChXSVRORVNT KSB8fCBkZWZpbmVkKElOVkFSSUFOVFMpCiB2b2lkCWthc3NlcnRfcGFuaWMoY29uc3QgY2hhciAq Zm10LCAuLi4pICBfX3ByaW50Zmxpa2UoMSwgMik7CmRpZmYgLS1naXQgYS9zeXMveDg2L2luY2x1 ZGUvaHlwZXJ2aXNvci5oIGIvc3lzL3g4Ni9pbmNsdWRlL2h5cGVydmlzb3IuaApuZXcgZmlsZSBt b2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWQzMGViCi0tLSAvZGV2L251bGwKKysrIGIvc3lz L3g4Ni9pbmNsdWRlL2h5cGVydmlzb3IuaApAQCAtMCwwICsxLDU2IEBACisvKi0KKyAqIENvcHly aWdodCAoYykgMjAxNCBCcnlhbiBWZW50ZWljaGVyIDxicnlhbnZARnJlZUJTRC5vcmc+CisgKiBB bGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291 cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBh cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBh cmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBp biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt ZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJv dmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJP VklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFO WSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU RUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4g Tk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBG T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwg T1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg VE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NT IE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICog SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElO IENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJ R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNF IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YK KyAqIFNVQ0ggREFNQUdFLgorICoKKyAqICRGcmVlQlNEJAorICovCisKKyNpZm5kZWYgX1g4Nl9I WVBFUlZJU09SX0hfCisjZGVmaW5lIF9YODZfSFlQRVJWSVNPUl9IXworCisjaW5jbHVkZSA8c3lz L3BhcmFtLmg+CisjaW5jbHVkZSA8c3lzL2tlcm5lbC5oPgorCit0eXBlZGVmIHZvaWQgaHlwZXJ2 aXNvcl9pbml0X2Z1bmNfdCh2b2lkKTsKKworLyoKKyAqIFRoZSBndWVzdCBoeXBlcnZpc29yIHN1 cHBvcnQgbWF5IHByb3ZpZGUgcGFyYXZpcnR1YWxpemVkIG9yIGhhdmUgc3BlY2lhbAorICogcmVx dWlyZW1lbnRzIGZvciB2YXJpb3VzIG9wZXJhdGlvbnMuIFRoZSBjYWxsYmFjayBmdW5jdGlvbnMg YXJlIHByb3ZpZGVkCisgKiB3aGVuIGEgaHlwZXJ2aXNvciBpcyBkZXRlY3RlZCBhbmQgcmVnaXN0 ZXJlZC4KKyAqLworc3RydWN0IGh5cGVydmlzb3Jfb3BzIHsKK307CisKK3ZvaWQJaHlwZXJ2aXNv cl9zeXNpbml0KHZvaWQgKmZ1bmMpOwordm9pZAloeXBlcnZpc29yX3JlZ2lzdGVyKGNvbnN0IGNo YXIgKnZlbmRvciwgZW51bSBWTV9HVUVTVCBndWVzdCwKKwkgICAgc3RydWN0IGh5cGVydmlzb3Jf b3BzICpvcHMpOworaW50CWh5cGVydmlzb3JfY3B1aWRfYmFzZShjb25zdCBjaGFyICpzaWduYXR1 cmUsIGludCBsZWF2ZXMsCisJICAgIHVpbnQzMl90ICpiYXNlLCB1aW50MzJfdCAqaGlnaCk7Cit2 b2lkCWh5cGVydmlzb3JfcHJpbnRfaW5mbyh2b2lkKTsKKworI2RlZmluZSBIWVBFUlZJU09SX1NZ U0lOSVQobmFtZSwgZnVuYykJCQkJXAorCVNZU0lOSVQobmFtZSAjIyBfaHlwZXJ2aXNvcl9zeXNp bml0LCBTSV9TVUJfSFlQRVJWSVNPUiwJXAorCSAgICBTSV9PUkRFUl9GSVJTVCwgaHlwZXJ2aXNv cl9zeXNpbml0LCBmdW5jKQorCisjZW5kaWYgLyogIV9YODZfSFlQRVJWSVNPUl9IXyAqLwpkaWZm IC0tZ2l0IGEvc3lzL3g4Ni9pbmNsdWRlL2t2bS5oIGIvc3lzL3g4Ni9pbmNsdWRlL2t2bS5oCm5l dyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MzkwMzgKLS0tIC9kZXYvbnVsbAor KysgYi9zeXMveDg2L2luY2x1ZGUva3ZtLmgKQEAgLTAsMCArMSw0OSBAQAorLyotCisgKiBDb3B5 cmlnaHQgKGMpIDIwMTQgQnJ5YW4gVmVudGVpY2hlciA8YnJ5YW52QEZyZWVCU0Qub3JnPgorICog QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwg YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICog YXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp biB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMg aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp bWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy b3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBS T1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBB TlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1J VEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElO IE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICog Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlks IE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE IFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9T UyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAq IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ TiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdM SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVT RSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G CisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiAkRnJlZUJTRCQKKyAqLworCisjaWZuZGVmIF9YODZf S1ZNX0hfCisjZGVmaW5lIF9YODZfS1ZNX0hfCisKKyNkZWZpbmUgS1ZNX0NQVUlEX0ZFQVRVUkVT X0xFQUYJCTB4NDAwMDAwMDEKKworI2RlZmluZSBLVk1fRkVBVFVSRV9DTE9DS1NPVVJDRQkJMHgw MDAwMDAwMQorI2RlZmluZSBLVk1fRkVBVFVSRV9DTE9DS1NPVVJDRTIJMHgwMDAwMDAwOAorCisv KiBEZXByZWNhdGVkOiBmb3IgdGhlIENMT0NLU09VUkNFIGZlYXR1cmUuICovCisjZGVmaW5lIEtW TV9NU1JfV0FMTF9DTE9DSwkJMHgxMQorI2RlZmluZSBLVk1fTVNSX1NZU1RFTV9USU1FCQkweDEy CisKKyNkZWZpbmUgS1ZNX01TUl9XQUxMX0NMT0NLX05FVwkJMHg0YjU2NGQwMAorI2RlZmluZSBL Vk1fTVNSX1NZU1RFTV9USU1FX05FVwkJMHg0YjU2NGQwMQorCitpbnQJCWt2bV9wYXJhdmlydF9z dXBwb3J0ZWQodm9pZCk7Cit1aW50MzJfdAlrdm1fZ2V0X2ZlYXR1cmVzKHZvaWQpOworCit1aW50 NjRfdAlrdm1fY2xvY2tfdHNjX2ZyZXEodm9pZCk7CisKKyNlbmRpZiAvKiAhX1g4Nl9LVk1fSF8g Ki8KZGlmZiAtLWdpdCBhL3N5cy94ODYvaW5jbHVkZS9wdmNsb2NrLmggYi9zeXMveDg2L2luY2x1 ZGUvcHZjbG9jay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1YWJhOTkK LS0tIC9kZXYvbnVsbAorKysgYi9zeXMveDg2L2luY2x1ZGUvcHZjbG9jay5oCkBAIC0wLDAgKzEs NTggQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDE0LCBCcnlhbiBWZW50ZWljaGVyIDxicnlh bnZARnJlZUJTRC5vcmc+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJp YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91 dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0 aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JT IGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9G IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAq IEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklC VVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws IFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVE SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMK KyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5F U1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0Yg TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1Ig VE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX QVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP RiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqICRGcmVlQlNEJAor ICovCisKKyNpZm5kZWYgWDg2X1BWQ0xPQ0sKKyNkZWZpbmUgWDg2X1BWQ0xPQ0sKKworc3RydWN0 IHB2Y2xvY2tfdmNwdV90aW1lX2luZm8geworCXVpbnQzMl90CXZlcnNpb247CisJdWludDMyX3QJ cGFkMDsKKwl1aW50NjRfdAl0c2NfdGltZXN0YW1wOworCXVpbnQ2NF90CXN5c3RlbV90aW1lOwor CXVpbnQzMl90CXRzY190b19zeXN0ZW1fbXVsOworCWludDhfdAkJdHNjX3NoaWZ0OworCXVpbnQ4 X3QJCWZsYWdzOworCXVpbnQ4X3QJCXBhZFsyXTsKK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgUFZD TE9DS19GTEFHX1RTQ19TVEFCTEUJCTB4MDEKKyNkZWZpbmUgUFZDTE9DS19GTEFHX0dVRVNUX1BB U1VFRAkweDAyCisKK3N0cnVjdCBwdmNsb2NrX3dhbGxfY2xvY2sgeworCXVpbnQzMl90CXZlcnNp b247CisJdWludDMyX3QJc2VjOworCXVpbnQzMl90CW5zZWM7Cit9IF9fcGFja2VkOworCit2b2lk CQlwdmNsb2NrX3Jlc3VtZSh2b2lkKTsKK3VpbnQ2NF90CXB2Y2xvY2tfdHNjX2ZyZXEoc3RydWN0 IHB2Y2xvY2tfdmNwdV90aW1lX2luZm8gKnRpKTsKK3VpbnQ2NF90CXB2Y2xvY2tfZ2V0X3RpbWVj b3VudChzdHJ1Y3QgcHZjbG9ja192Y3B1X3RpbWVfaW5mbyAqdGkpOwordm9pZAkJcHZjbG9ja19n ZXRfd2FsbGNsb2NrKHN0cnVjdCBwdmNsb2NrX3dhbGxfY2xvY2sgKndjLAorCQkgICAgc3RydWN0 IHRpbWVzcGVjICp0cyk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzL3g4Ni9pbmNsdWRlL3Zt d2FyZS5oIGIvc3lzL3g4Ni9pbmNsdWRlL3Ztd2FyZS5oCmluZGV4IGM3MmY0OGQuLjg5NjE2YzUg MTAwNjQ0Ci0tLSBhL3N5cy94ODYvaW5jbHVkZS92bXdhcmUuaAorKysgYi9zeXMveDg2L2luY2x1 ZGUvdm13YXJlLmgKQEAgLTQ0LDQgKzQ0LDYgQEAgdm13YXJlX2h2Y2FsbCh1X2ludCBjbWQsIHVf aW50ICpwKQogCTogIm1lbW9yeSIpOwogfQogCit1aW50NjRfdAl2bXdhcmVfdHNjX2ZyZXEodm9p ZCk7CisKICNlbmRpZiAvKiAhX1g4Nl9WTVdBUkVfSF8gKi8KZGlmZiAtLWdpdCBhL3N5cy94ODYv eDg2L2JoeXZlLmMgYi9zeXMveDg2L3g4Ni9iaHl2ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu ZGV4IDAwMDAwMDAuLmQyMWU4MDgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMveDg2L3g4Ni9iaHl2 ZS5jCkBAIC0wLDAgKzEsNTggQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDE0IEJyeWFuIFZl bnRlaWNoZXIgPGJyeWFudkBGcmVlQlNELm9yZz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3Ry aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk aXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3Vt ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli dXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFO RCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBX QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVE IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM QVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVU SE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBE QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VC U1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9G SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04g QU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICog TElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS SVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZF TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8K KworI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorX19GQlNESUQoIiRGcmVlQlNEJCIpOworCisjaW5j bHVkZSA8c3lzL3BhcmFtLmg+CisjaW5jbHVkZSA8c3lzL3N5c3RtLmg+CisKKyNpbmNsdWRlIDx4 ODYvaHlwZXJ2aXNvci5oPgorCitzdGF0aWMgdWludDMyX3QgYmh5dmVfY3B1aWRfYmFzZSA9IC0x Oworc3RhdGljIHVpbnQzMl90IGJoeXZlX2NwdWlkX2hpZ2ggPSAtMTsKKworc3RhdGljIGludAor Ymh5dmVfY3B1aWRfaWRlbnRpZnkodm9pZCkKK3sKKworCWlmIChiaHl2ZV9jcHVpZF9iYXNlID09 IC0xKSB7CisJCWh5cGVydmlzb3JfY3B1aWRfYmFzZSgiYmh5dmUgYmh5dmUiLCAwLCAmYmh5dmVf Y3B1aWRfYmFzZSwKKwkJICAgICZiaHl2ZV9jcHVpZF9oaWdoKTsKKwl9CisKKwlyZXR1cm4gKGJo eXZlX2NwdWlkX2Jhc2UgPiAwKTsKK30KKworc3RhdGljIHZvaWQKK2JoeXZlX2luaXQodm9pZCkK K3sKKworCWlmIChiaHl2ZV9jcHVpZF9pZGVudGlmeSgpICE9IDApCisJCWh5cGVydmlzb3JfcmVn aXN0ZXIoImJoeXZlIiwgVk1fR1VFU1RfQkhZVkUsIE5VTEwpOworfQorCitIWVBFUlZJU09SX1NZ U0lOSVQoYmh5dmUsIGJoeXZlX2luaXQpOwpkaWZmIC0tZ2l0IGEvc3lzL3g4Ni94ODYvaHlwZXJ2 aXNvci5jIGIvc3lzL3g4Ni94ODYvaHlwZXJ2aXNvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu ZGV4IDAwMDAwMDAuLjMwYzcwZGYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMveDg2L3g4Ni9oeXBl cnZpc29yLmMKQEAgLTAsMCArMSw5OSBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgQnJ5 YW4gVmVudGVpY2hlciA8YnJ5YW52QEZyZWVCU0Qub3JnPgorICogQWxsIHJpZ2h0cyByZXNlcnZl ZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92 aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJl ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93 aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz dCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAg ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp c3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRI T1IgQU5EIENPTlRSSUJVVE9SUyBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElF RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBM SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ Q1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUg QVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJ UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisg KiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0Yg U1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQ Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQg T04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAor ICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up IEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwg RVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisg Ki8KKworI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorX19GQlNESUQoIiRGcmVlQlNEJCIpOworCisj aW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjaW5jbHVkZSA8c3lzL3N5c2N0bC5oPgorI2luY2x1ZGUg PHN5cy9zeXN0bS5oPgorCisjaW5jbHVkZSA8bWFjaGluZS9jcHVmdW5jLmg+CisjaW5jbHVkZSA8 bWFjaGluZS9jcHUuaD4KKyNpbmNsdWRlIDxtYWNoaW5lL21kX3Zhci5oPgorI2luY2x1ZGUgPG1h Y2hpbmUvc3BlY2lhbHJlZy5oPgorCisjaW5jbHVkZSA8eDg2L2h5cGVydmlzb3IuaD4KKworY2hh ciBodl92ZW5kb3JbMTZdOworU1lTQ1RMX1NUUklORyhfaHcsIE9JRF9BVVRPLCBodl92ZW5kb3Is IENUTEZMQUdfUkQsIGh2X3ZlbmRvciwgMCwKKyAgICAiSHlwZXJ2aXNvciB2ZW5kb3IiKTsKKwor dm9pZAoraHlwZXJ2aXNvcl9zeXNpbml0KHZvaWQgKmZ1bmMpCit7CisJaHlwZXJ2aXNvcl9pbml0 X2Z1bmNfdCAqaW5pdDsKKworCWluaXQgPSBmdW5jOworCisJLyoKKwkgKiBDYWxsIHRoZSBpbml0 IGZ1bmN0aW9uIGlmIHdlIGhhdmUgbm90IGFscmVhZHkgaWRlbnRpZmllZCB0aGUKKwkgKiBoeXBl cnZpc29yIHlldC4gV2UgYXNzdW1lIHRoZSBkZXRlY3RhYmxlIGh5cGVydmlzb3JzIHdpbGwKKwkg KiBhbm5vdW5jZSBpdHMgcHJlc2VuY2UgdmlhIHRoZSBDUFVJRCBiaXQuCisJICovCisJaWYgKHZt X2d1ZXN0ID09IFZNX0dVRVNUX1ZNICYmIGNwdV9mZWF0dXJlMiAmIENQVUlEMl9IVikKKwkJKCpp bml0KSgpOworfQorCit2b2lkCitoeXBlcnZpc29yX3JlZ2lzdGVyKGNvbnN0IGNoYXIgKnZlbmRv ciwgZW51bSBWTV9HVUVTVCBndWVzdCwKKyAgICBzdHJ1Y3QgaHlwZXJ2aXNvcl9vcHMgKm9wcykK K3sKKworCXN0cmxjcHkoaHZfdmVuZG9yLCB2ZW5kb3IsIHNpemVvZihodl92ZW5kb3IpKTsKKwl2 bV9ndWVzdCA9IGd1ZXN0OworfQorCisvKgorICogW1JGQ10gQ1BVSUQgdXNhZ2UgZm9yIGludGVy YWN0aW9uIGJldHdlZW4gSHlwZXJ2aXNvcnMgYW5kIExpbnV4LgorICogaHR0cDovL2xrbWwub3Jn L2xrbWwvMjAwOC8xMC8xLzI0NgorICovCitpbnQKK2h5cGVydmlzb3JfY3B1aWRfYmFzZShjb25z dCBjaGFyICpzaWduYXR1cmUsIGludCBsZWF2ZXMsIHVpbnQzMl90ICpiYXNlLAorICAgIHVpbnQz Ml90ICpoaWdoKQoreworCXVpbnQzMl90IGxlYWYsIHJlZ3NbNF07CisKKwlmb3IgKGxlYWYgPSAw eDQwMDAwMDAwOyBsZWFmIDwgMHg0MDAxMDAwMDsgbGVhZiArPSAweDEwMCkgeworCQlkb19jcHVp ZChsZWFmLCByZWdzKTsKKwkJaWYgKCFtZW1jbXAoc2lnbmF0dXJlLCAmcmVnc1sxXSwgMTIpICYm CisJCSAgICAobGVhdmVzID09IDAgfHwgKHJlZ3NbMF0gLSBsZWFmID49IGxlYXZlcykpKSB7CisJ CQkqYmFzZSA9IGxlYWY7CisJCQkqaGlnaCA9IHJlZ3NbMF07CisJCQlyZXR1cm4gKDApOworCQl9 CisJfQorCisJcmV0dXJuICgxKTsKK30KKwordm9pZAoraHlwZXJ2aXNvcl9wcmludF9pbmZvKHZv aWQpCit7CisKKwlpZiAoKmh2X3ZlbmRvcikKKwkJcHJpbnRmKCJIeXBlcnZpc29yOiBPcmlnaW4g PSBcIiVzXCJcbiIsIGh2X3ZlbmRvcik7Cit9CmRpZmYgLS1naXQgYS9zeXMveDg2L3g4Ni9pZGVu dGNwdS5jIGIvc3lzL3g4Ni94ODYvaWRlbnRjcHUuYwppbmRleCBiYWU0MzBhLi5jMjgzOTBjIDEw MDY0NAotLS0gYS9zeXMveDg2L3g4Ni9pZGVudGNwdS5jCisrKyBiL3N5cy94ODYveDg2L2lkZW50 Y3B1LmMKQEAgLTY0LDYgKzY0LDcgQEAgX19GQlNESUQoIiRGcmVlQlNEJCIpOwogCiAjaW5jbHVk ZSA8YW1kNjQvdm1tL2ludGVsL3ZteF9jb250cm9scy5oPgogI2luY2x1ZGUgPHg4Ni9pc2EvaWN1 Lmg+CisjaW5jbHVkZSA8eDg2L2h5cGVydmlzb3IuaD4KICNpbmNsdWRlIDx4ODYvdm13YXJlLmg+ CiAKICNpZmRlZiBfX2kzODZfXwpAQCAtNzgsNyArNzksNiBAQCBzdGF0aWMgdV9pbnQgZmluZF9j cHVfdmVuZG9yX2lkKHZvaWQpOwogc3RhdGljIHZvaWQgcHJpbnRfQU1EX2luZm8odm9pZCk7CiBz dGF0aWMgdm9pZCBwcmludF9JTlRFTF9pbmZvKHZvaWQpOwogc3RhdGljIHZvaWQgcHJpbnRfSU5U RUxfVExCKHVfaW50IGRhdGEpOwotc3RhdGljIHZvaWQgcHJpbnRfaHlwZXJ2aXNvcl9pbmZvKHZv aWQpOwogc3RhdGljIHZvaWQgcHJpbnRfc3ZtX2luZm8odm9pZCk7CiBzdGF0aWMgdm9pZCBwcmlu dF92aWFfcGFkbG9ja19pbmZvKHZvaWQpOwogc3RhdGljIHZvaWQgcHJpbnRfdm14X2luZm8odm9p ZCk7CkBAIC0xMjMsMTEgKzEyMyw2IEBAIHN0YXRpYyBpbnQgaHdfY2xvY2tyYXRlOwogU1lTQ1RM X0lOVChfaHcsIE9JRF9BVVRPLCBjbG9ja3JhdGUsIENUTEZMQUdfUkQsCiAgICAgJmh3X2Nsb2Nr cmF0ZSwgMCwgIkNQVSBpbnN0cnVjdGlvbiBjbG9jayByYXRlIik7CiAKLXVfaW50IGh2X2hpZ2g7 Ci1jaGFyIGh2X3ZlbmRvclsxNl07Ci1TWVNDVExfU1RSSU5HKF9odywgT0lEX0FVVE8sIGh2X3Zl bmRvciwgQ1RMRkxBR19SRCwgaHZfdmVuZG9yLCAwLAotICAgICJIeXBlcnZpc29yIHZlbmRvciIp OwotCiBzdGF0aWMgZXZlbnRoYW5kbGVyX3RhZyB0c2NfcG9zdF90YWc7CiAKIHN0YXRpYyBjaGFy IGNwdV9icmFuZFs0OF07CkBAIC05ODUsNyArOTgwLDcgQEAgcHJpbnRjcHVpbmZvKHZvaWQpCiAj ZW5kaWYKIAl9CiAKLQlwcmludF9oeXBlcnZpc29yX2luZm8oKTsKKwloeXBlcnZpc29yX3ByaW50 X2luZm8oKTsKIH0KIAogdm9pZApAQCAtMTIxOCwyNSArMTIxMywxMiBAQCBpZGVudGlmeV9oeXBl cnZpc29yKHZvaWQpCiAJaW50IGk7CiAKIAkvKgotCSAqIFtSRkNdIENQVUlEIHVzYWdlIGZvciBp bnRlcmFjdGlvbiBiZXR3ZWVuIEh5cGVydmlzb3JzIGFuZCBMaW51eC4KLQkgKiBodHRwOi8vbGtt bC5vcmcvbGttbC8yMDA4LzEwLzEvMjQ2Ci0JICoKLQkgKiBLQjEwMDk0NTg6IE1lY2hhbmlzbXMg dG8gZGV0ZXJtaW5lIGlmIHNvZnR3YXJlIGlzIHJ1bm5pbmcgaW4KLQkgKiBhIFZNd2FyZSB2aXJ0 dWFsIG1hY2hpbmUKLQkgKiBodHRwOi8va2Iudm13YXJlLmNvbS9rYi8xMDA5NDU4CisJICogTW9k ZXJuIGh5cGVydmlzb3JzIHNldCB0aGUgSFYgcHJlc2VudCBmZWF0dXJlIGJpdCBhbmQgYXJlIHRo ZW4KKwkgKiBpZGVudGlmaWFibGUgdGhyb3VnaCBhIHNwZWNpYWwgQ1BVSUQgbGVhZi4gSHlwZXJ2 aXNvcnMgd2Uga25vdworCSAqIGFib3V0IGFyZSBsYXRlciBkZXRlY3RlZCB2aWEgdGhlIFNJX1NV Ql9IWVBFUlZJU09SIFNZU0lOSVQoKS4KIAkgKi8KIAlpZiAoY3B1X2ZlYXR1cmUyICYgQ1BVSUQy X0hWKSB7CiAJCXZtX2d1ZXN0ID0gVk1fR1VFU1RfVk07Ci0JCWRvX2NwdWlkKDB4NDAwMDAwMDAs IHJlZ3MpOwotCQlpZiAocmVnc1swXSA+PSAweDQwMDAwMDAwKSB7Ci0JCQlodl9oaWdoID0gcmVn c1swXTsKLQkJCSgodV9pbnQgKikmaHZfdmVuZG9yKVswXSA9IHJlZ3NbMV07Ci0JCQkoKHVfaW50 ICopJmh2X3ZlbmRvcilbMV0gPSByZWdzWzJdOwotCQkJKCh1X2ludCAqKSZodl92ZW5kb3IpWzJd ID0gcmVnc1szXTsKLQkJCWh2X3ZlbmRvclsxMl0gPSAnXDAnOwotCQkJaWYgKHN0cmNtcChodl92 ZW5kb3IsICJWTXdhcmVWTXdhcmUiKSA9PSAwKQotCQkJCXZtX2d1ZXN0ID0gVk1fR1VFU1RfVk1X QVJFOwotCQl9CiAJCXJldHVybjsKIAl9CiAKQEAgLTIxNTAsMTEgKzIxMzIsMyBAQCBwcmludF92 bXhfaW5mbyh2b2lkKQogCQkpOwogCX0KIH0KLQotc3RhdGljIHZvaWQKLXByaW50X2h5cGVydmlz b3JfaW5mbyh2b2lkKQotewotCi0JaWYgKCpodl92ZW5kb3IpCi0JCXByaW50ZigiSHlwZXJ2aXNv cjogT3JpZ2luID0gXCIlc1wiXG4iLCBodl92ZW5kb3IpOwotfQpkaWZmIC0tZ2l0IGEvc3lzL3g4 Ni94ODYva3ZtLmMgYi9zeXMveDg2L3g4Ni9rdm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl eCAwMDAwMDAwLi5iNDdlYjc2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzL3g4Ni94ODYva3ZtLmMK QEAgLTAsMCArMSw4MyBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgQnJ5YW4gVmVudGVp Y2hlciA8YnJ5YW52QEZyZWVCU0Qub3JnPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisg KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo IG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0 IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0 aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns YWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1 Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0 aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRh dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlv bi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENP TlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FS UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQ VVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1Ig T1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ TkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFH RVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElU VVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7 IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkg VEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFC SUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO RyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisj aW5jbHVkZSA8c3lzL2NkZWZzLmg+CitfX0ZCU0RJRCgiJEZyZWVCU0QkIik7CisKKyNpbmNsdWRl IDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxzeXMvc3lzdG0uaD4KKworI2luY2x1ZGUgPG1hY2hp bmUvY3B1ZnVuYy5oPgorCisjaW5jbHVkZSA8eDg2L2h5cGVydmlzb3IuaD4KKyNpbmNsdWRlIDx4 ODYva3ZtLmg+CisKK3N0YXRpYyBpbnQJCWt2bV9jcHVpZF9pZGVudGlmeSh2b2lkKTsKKworc3Rh dGljIHVpbnQzMl90IGt2bV9jcHVpZF9iYXNlID0gLTE7CitzdGF0aWMgdWludDMyX3Qga3ZtX2Nw dWlkX2hpZ2ggPSAtMTsKKworc3RhdGljIGludAora3ZtX2NwdWlkX2lkZW50aWZ5KHZvaWQpCit7 CisKKwlpZiAoa3ZtX2NwdWlkX2Jhc2UgPT0gLTEpIHsKKwkJaHlwZXJ2aXNvcl9jcHVpZF9iYXNl KCJLVk1LVk1LVk1cMFwwIiwgMCwgJmt2bV9jcHVpZF9iYXNlLAorCQkgICAgJmt2bV9jcHVpZF9o aWdoKTsKKwl9CisKKwlyZXR1cm4gKGt2bV9jcHVpZF9iYXNlID4gMCk7Cit9CisKK2ludAora3Zt X3BhcmF2aXJ0X3N1cHBvcnRlZCh2b2lkKQoreworCisJcmV0dXJuIChrdm1fY3B1aWRfYmFzZSA+ IDApOworfQorCit1aW50MzJfdAora3ZtX2dldF9mZWF0dXJlcyh2b2lkKQoreworCXVfaW50IHJl Z3NbNF07CisKKwlpZiAoa3ZtX3BhcmF2aXJ0X3N1cHBvcnRlZCgpKQorCQlkb19jcHVpZChrdm1f Y3B1aWRfYmFzZSB8IEtWTV9DUFVJRF9GRUFUVVJFU19MRUFGLCByZWdzKTsKKwllbHNlCisJCXJl Z3NbMF0gPSAwOworCisJcmV0dXJuIChyZWdzWzBdKTsKK30KKworc3RhdGljIHZvaWQKK2t2bV9p bml0KHZvaWQpCit7CisKKwlpZiAoa3ZtX2NwdWlkX2lkZW50aWZ5KCkgIT0gMCkKKwkJaHlwZXJ2 aXNvcl9yZWdpc3RlcigiS1ZNIiwgVk1fR1VFU1RfS1ZNLCBOVUxMKTsKK30KKworSFlQRVJWSVNP Ul9TWVNJTklUKGt2bSwga3ZtX2luaXQpOwpkaWZmIC0tZ2l0IGEvc3lzL3g4Ni94ODYva3ZtX2Ns b2NrLmMgYi9zeXMveDg2L3g4Ni9rdm1fY2xvY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl eCAwMDAwMDAwLi43ZGE2MzYzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzL3g4Ni94ODYva3ZtX2Ns b2NrLmMKQEAgLTAsMCArMSwxMzIgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDE0IEJyeWFu IFZlbnRlaWNoZXIgPGJyeWFudkBGcmVlQlNELm9yZz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQu CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt cywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRp c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu ZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg cmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRv Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0 cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9S IEFORCBDT05UUklCVVRPUlMgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQg V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElF RCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNV TEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFV VEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJF Q1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICog REFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNV QlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJP RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9O IEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAq IExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB UklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVW RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICov CisKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KK19fRkJTRElEKCIkRnJlZUJTRCQiKTsKKworI2lu Y2x1ZGUgPHN5cy9wYXJhbS5oPgorI2luY2x1ZGUgPHN5cy9rZXJuZWwuaD4KKyNpbmNsdWRlIDxz eXMvbGltaXRzLmg+CisjaW5jbHVkZSA8c3lzL3N5c3RtLmg+CisjaW5jbHVkZSA8c3lzL3BjcHUu aD4KKyNpbmNsdWRlIDxzeXMvc21wLmg+CisjaW5jbHVkZSA8c3lzL3RpbWV0Yy5oPgorCisjaW5j bHVkZSA8dm0vdm0uaD4KKyNpbmNsdWRlIDx2bS9wbWFwLmg+CisKKyNpbmNsdWRlIDxtYWNoaW5l L3B2Y2xvY2suaD4KKyNpbmNsdWRlIDx4ODYva3ZtLmg+CisKK3N0YXRpYyB1X2ludAlrdm1fY2xv Y2tfZ2V0X3RpbWVjb3VudGVyKHN0cnVjdCB0aW1lY291bnRlciAqKTsKK3N0YXRpYyB2b2lkCWt2 bV9jbG9ja19wY3B1X3N5c3RlbV90aW1lKHZvaWQgKik7CisKK0RQQ1BVX0RFRklORShzdHJ1Y3Qg cHZjbG9ja192Y3B1X3RpbWVfaW5mbywga3ZtX2Nsb2NrX3ZjcHVfdGltZV9pbmZvKTsKKworc3Rh dGljIHN0cnVjdCB0aW1lY291bnRlciBrdm1fY2xvY2tfdGltZWNvdW50ZXIgPSB7CisJa3ZtX2Ns b2NrX2dldF90aW1lY291bnRlciwKKwlOVUxMLAorCX4wdSwKKwkxMDAwMDAwMDAwVUxMLAorCSJL Vk1DTE9DSyIsCisJMTAwMCwKK307CisKK3N0YXRpYyBpbnQJCWt2bV9jbG9ja19yZWdpc3RlcmVk Oworc3RhdGljIHVpbnQzMl90CQlrdm1fY2xvY2tfd2FsbF9jbG9ja19tc3I7CitzdGF0aWMgdWlu dDMyX3QJCWt2bV9jbG9ja19zeXN0ZW1fdGltZV9tc3I7CisKK3VpbnQ2NF90Citrdm1fY2xvY2tf dHNjX2ZyZXEodm9pZCkKK3sKKwlzdHJ1Y3QgcHZjbG9ja192Y3B1X3RpbWVfaW5mbyAqdGk7CisJ dWludDY0X3QgZnJlcTsKKworCWNyaXRpY2FsX2VudGVyKCk7CisJdGkgPSBEUENQVV9QVFIoa3Zt X2Nsb2NrX3ZjcHVfdGltZV9pbmZvKTsKKwlmcmVxID0gcHZjbG9ja190c2NfZnJlcSh0aSk7CisJ Y3JpdGljYWxfZXhpdCgpOworCisJcmV0dXJuIChmcmVxKTsKK30KKworc3RhdGljIHVfaW50Citr dm1fY2xvY2tfZ2V0X3RpbWVjb3VudGVyKHN0cnVjdCB0aW1lY291bnRlciAqdGMpCit7CisJc3Ry dWN0IHB2Y2xvY2tfdmNwdV90aW1lX2luZm8gKnRpOworCXVpbnQ2NF90IHRpbWU7CisKKwljcml0 aWNhbF9lbnRlcigpOworCXRpID0gRFBDUFVfUFRSKGt2bV9jbG9ja192Y3B1X3RpbWVfaW5mbyk7 CisJdGltZSA9IHB2Y2xvY2tfZ2V0X3RpbWVjb3VudCh0aSk7CisJY3JpdGljYWxfZXhpdCgpOwor CisJcmV0dXJuICh0aW1lICYgVUlOVF9NQVgpOworfQorCitzdGF0aWMgdm9pZAora3ZtX2Nsb2Nr X3BjcHVfc3lzdGVtX3RpbWUodm9pZCAqYXJnKQoreworCXVpbnQ2NF90IGRhdGE7CisJaW50IGVu YWJsZTsKKworCWVuYWJsZSA9ICooaW50ICopIGFyZzsKKworCWlmIChlbmFibGUgIT0gMCkKKwkJ ZGF0YSA9IHZ0b3BoeXMoRFBDUFVfUFRSKGt2bV9jbG9ja192Y3B1X3RpbWVfaW5mbykpIHwgMTsK KwllbHNlCisJCWRhdGEgPSAwOworCisJd3Jtc3Ioa3ZtX2Nsb2NrX3N5c3RlbV90aW1lX21zciwg ZGF0YSk7Cit9CisKK3N0YXRpYyB2b2lkCitrdm1fY2xvY2tfaW5pdCh2b2lkKQoreworCXVpbnQz Ml90IGZlYXR1cmVzOworCisJaWYgKHZtX2d1ZXN0ICE9IFZNX0dVRVNUX0tWTSB8fCAha3ZtX3Bh cmF2aXJ0X3N1cHBvcnRlZCgpKQorCQlyZXR1cm47CisKKwlmZWF0dXJlcyA9IGt2bV9nZXRfZmVh dHVyZXMoKTsKKworCWlmIChmZWF0dXJlcyAmIEtWTV9GRUFUVVJFX0NMT0NLU09VUkNFMikgewor CQlrdm1fY2xvY2tfd2FsbF9jbG9ja19tc3IgPSBLVk1fTVNSX1dBTExfQ0xPQ0tfTkVXOworCQlr dm1fY2xvY2tfc3lzdGVtX3RpbWVfbXNyID0gS1ZNX01TUl9TWVNURU1fVElNRV9ORVc7CisJfSBl bHNlIGlmIChmZWF0dXJlcyAmIEtWTV9GRUFUVVJFX0NMT0NLU09VUkNFKSB7CisJCWt2bV9jbG9j a193YWxsX2Nsb2NrX21zciA9IEtWTV9NU1JfV0FMTF9DTE9DSzsKKwkJa3ZtX2Nsb2NrX3N5c3Rl bV90aW1lX21zciA9IEtWTV9NU1JfU1lTVEVNX1RJTUU7CisJfSBlbHNlCisJCXJldHVybjsKKwor CWt2bV9jbG9ja19yZWdpc3RlcmVkID0gMTsKKwlzbXBfcmVuZGV6dm91cyhzbXBfbm9fcmVuZGV2 b3VzX2JhcnJpZXIsIGt2bV9jbG9ja19wY3B1X3N5c3RlbV90aW1lLAorCSAgICBzbXBfbm9fcmVu ZGV2b3VzX2JhcnJpZXIsICZrdm1fY2xvY2tfcmVnaXN0ZXJlZCk7CisKKwl0Y19pbml0KCZrdm1f Y2xvY2tfdGltZWNvdW50ZXIpOworfQorCitTWVNJTklUKGt2bV9jbG9jaywgU0lfU1VCX1NNUCwg U0lfT1JERVJfQU5ZLCBrdm1fY2xvY2tfaW5pdCwgTlVMTCk7CmRpZmYgLS1naXQgYS9zeXMveDg2 L3g4Ni9wdmNsb2NrLmMgYi9zeXMveDg2L3g4Ni9wdmNsb2NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2 NDQKaW5kZXggMDAwMDAwMC4uZDBlZWYxODUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMveDg2L3g4 Ni9wdmNsb2NrLmMKQEAgLTAsMCArMSwxOTcgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA5 IEFkcmlhbiBDaGFkZAorICogQ29weXJpZ2h0IChjKSAyMDEyIFNwZWN0cmEgTG9naWMgQ29ycG9y YXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAxNCBCcnlhbiBWZW50ZWljaGVyCisgKiBBbGwgcmln aHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0 OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g dGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg QlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBS RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s IFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT UyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZF TlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5Z IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09O U0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBS T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVT RSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZF UiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS QUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRI SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNV Q0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KK19fRkJTRElEKCIkRnJl ZUJTRCQiKTsKKworI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2luY2x1ZGUgPHN5cy9zeXN0bS5o PgorI2luY2x1ZGUgPHN5cy9wcm9jLmg+CisKKyNpbmNsdWRlIDxtYWNoaW5lL2NwdWZ1bmMuaD4K KyNpbmNsdWRlIDxtYWNoaW5lL2NwdS5oPgorI2luY2x1ZGUgPG1hY2hpbmUvYXRvbWljLmg+Cisj aW5jbHVkZSA8bWFjaGluZS9wdmNsb2NrLmg+CisKKy8qCisgKiBMYXN0IHRpbWU7IHRoaXMgZ3Vh cmFudGVlcyBhIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZyBjbG9jayBmb3Igd2hlbgorICogYSBz dGFibGUgVFNDIGlzIG5vdCBwcm92aWRlZC4KKyAqLworc3RhdGljIHZvbGF0aWxlIHVpbnQ2NF90 IHB2Y2xvY2tfbGFzdF9jeWNsZXM7CisKK3ZvaWQKK3B2Y2xvY2tfcmVzdW1lKHZvaWQpCit7CisK KwlhdG9taWNfc3RvcmVfcmVsXzY0KCZwdmNsb2NrX2xhc3RfY3ljbGVzLCAwKTsKK30KKwordWlu dDY0X3QKK3B2Y2xvY2tfdHNjX2ZyZXEoc3RydWN0IHB2Y2xvY2tfdmNwdV90aW1lX2luZm8gKnRp KQoreworCXVpbnQ2NF90IGZyZXE7CisKKwlmcmVxID0gKDEwMDAwMDAwMDBVTEwgPDwgMzIpIC8g dGktPnRzY190b19zeXN0ZW1fbXVsOworCisJaWYgKHRpLT50c2Nfc2hpZnQgPCAwKQorCQlmcmVx IDw8PSAtdGktPnRzY19zaGlmdDsKKwllbHNlCisJCWZyZXEgPj49IHRpLT50c2Nfc2hpZnQ7CisK KwlyZXR1cm4gKGZyZXEpOworfQorCisvKgorICogU2NhbGUgYSA2NC1iaXQgZGVsdGEgYnkgc2Nh bGluZyBhbmQgbXVsdGlwbHlpbmcgYnkgYSAzMi1iaXQgZnJhY3Rpb24sCisgKiB5aWVsZGluZyBh IDY0LWJpdCByZXN1bHQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdWludDY0X3QKK3B2Y2xvY2tfc2Nh bGVfZGVsdGEodWludDY0X3QgZGVsdGEsIHVpbnQzMl90IG11bF9mcmFjLCBpbnQgc2hpZnQpCit7 CisJdWludDY0X3QgcHJvZHVjdDsKKworCWlmIChzaGlmdCA8IDApCisJCWRlbHRhID4+PSAtc2hp ZnQ7CisJZWxzZQorCQlkZWx0YSA8PD0gc2hpZnQ7CisKKyNpZiBkZWZpbmVkKF9faTM4Nl9fKQor CXsKKwkJdWludDMyX3QgdG1wMSwgdG1wMjsKKworCQkvKioKKwkJICogRm9yIGkzODYsIHRoZSBm b3JtdWxhIGxvb2tzIGxpa2U6CisJCSAqCisJCSAqICAgbG93ZXIgPSAobXVsX2ZyYWMgKiAoZGVs dGEgJiBVSU5UX01BWCkpID4+IDMyCisJCSAqICAgdXBwZXIgPSBtdWxfZnJhYyAqIChkZWx0YSA+ PiAzMikKKwkJICogICBwcm9kdWN0ID0gbG93ZXIgKyB1cHBlcgorCQkgKi8KKwkJX19hc21fXyAo CisJCQkibXVsICAlNSAgICAgICA7ICIKKwkJCSJtb3YgICU0LCUlZWF4IDsgIgorCQkJIm1vdiAg JSVlZHgsJTQgOyAiCisJCQkibXVsICAlNSAgICAgICA7ICIKKwkJCSJ4b3IgICU1LCU1ICAgIDsg IgorCQkJImFkZCAgJTQsJSVlYXggOyAiCisJCQkiYWRjICAlNSwlJWVkeCA7ICIKKwkJCTogIj1B IiAocHJvZHVjdCksICI9ciIgKHRtcDEpLCAiPXIiICh0bXAyKQorCQkJOiAiYSIgKCh1aW50MzJf dClkZWx0YSksICIxIiAoKHVpbnQzMl90KShkZWx0YSA+PiAzMikpLAorCQkJICAiMiIgKG11bF9m cmFjKSApOworCX0KKyNlbGlmIGRlZmluZWQoX19hbWQ2NF9fKQorCXsKKwkJdW5zaWduZWQgbG9u ZyB0bXA7CisKKwkJX19hc21fXyAoCisJCQkibXVscSAlW211bF9mcmFjXSA7IHNocmQgJDMyLCAl W2hpXSwgJVtsb10iCisJCQk6IFtsb10iPWEiIChwcm9kdWN0KSwgW2hpXSI9ZCIgKHRtcCkKKwkJ CTogIjAiIChkZWx0YSksIFttdWxfZnJhY10icm0iKCh1aW50NjRfdCltdWxfZnJhYykpOworCX0K KyNlbHNlCisjZXJyb3IgInB2Y2xvY2s6IHVuc3VwcG9ydGVkIHg4NiBhcmNoaXRlY3R1cmU/Igor I2VuZGlmCisKKwlyZXR1cm4gKHByb2R1Y3QpOworfQorCitzdGF0aWMgdWludDY0X3QKK3B2Y2xv Y2tfZ2V0X25zZWNfb2Zmc2V0KHN0cnVjdCBwdmNsb2NrX3ZjcHVfdGltZV9pbmZvICp0aSkKK3sK Kwl1aW50NjRfdCBkZWx0YTsKKworCWRlbHRhID0gcmR0c2MoKSAtIHRpLT50c2NfdGltZXN0YW1w OworCisJcmV0dXJuIChwdmNsb2NrX3NjYWxlX2RlbHRhKGRlbHRhLCB0aS0+dHNjX3RvX3N5c3Rl bV9tdWwsCisJICAgIHRpLT50c2Nfc2hpZnQpKTsKK30KKworc3RhdGljIHZvaWQKK3B2Y2xvY2tf cmVhZF90aW1lX2luZm8oc3RydWN0IHB2Y2xvY2tfdmNwdV90aW1lX2luZm8gKnRpLAorICAgIHVp bnQ2NF90ICpjeWNsZXMsIHVpbnQ4X3QgKmZsYWdzKQoreworCXVpbnQzMl90IHZlcnNpb247CisK KwlkbyB7CisJCXZlcnNpb24gPSB0aS0+dmVyc2lvbjsKKwkJcm1iKCk7CisJCSpjeWNsZXMgPSB0 aS0+c3lzdGVtX3RpbWUgKyBwdmNsb2NrX2dldF9uc2VjX29mZnNldCh0aSk7CisJCSpmbGFncyA9 IHRpLT5mbGFnczsKKwkJcm1iKCk7CisJfSB3aGlsZSAoKHRpLT52ZXJzaW9uICYgMSkgIT0gMCB8 fCB0aS0+dmVyc2lvbiAhPSB2ZXJzaW9uKTsKK30KKworc3RhdGljIHZvaWQKK3B2Y2xvY2tfcmVh ZF93YWxsX2Nsb2NrKHN0cnVjdCBwdmNsb2NrX3dhbGxfY2xvY2sgKndjLCB1aW50MzJfdCAqc2Vj LAorICAgIHVpbnQzMl90ICpuc2VjKQoreworCXVpbnQzMl90IHZlcnNpb247CisKKwlkbyB7CisJ CXZlcnNpb24gPSB3Yy0+dmVyc2lvbjsKKwkJcm1iKCk7CisJCSpzZWMgPSB3Yy0+c2VjOworCQkq bnNlYyA9IHdjLT5uc2VjOworCQlybWIoKTsKKwl9IHdoaWxlICgod2MtPnZlcnNpb24gJiAxKSAh PSAwIHx8IHdjLT52ZXJzaW9uICE9IHZlcnNpb24pOworfQorCit1aW50NjRfdAorcHZjbG9ja19n ZXRfdGltZWNvdW50KHN0cnVjdCBwdmNsb2NrX3ZjcHVfdGltZV9pbmZvICp0aSkKK3sKKwl1aW50 NjRfdCBub3c7CisJdWludDhfdCBmbGFnczsKKwl2b2xhdGlsZSB1aW50NjRfdCBsYXN0OworCisJ cHZjbG9ja19yZWFkX3RpbWVfaW5mbyh0aSwgJm5vdywgJmZsYWdzKTsKKworCWlmIChmbGFncyAm IFBWQ0xPQ0tfRkxBR19UU0NfU1RBQkxFKQorCQlyZXR1cm4gKG5vdyk7CisKKwkvKgorCSAqIEVu Zm9yY2UgYSBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcgY2xvY2sgdGltZSBhY3Jvc3MgYWxsIFZD UFVzLgorCSAqIElmIG91ciB0aW1lIGlzIHRvbyBvbGQsIHVzZSB0aGUgbGFzdCB0aW1lIGFuZCBy ZXR1cm4uIE90aGVyd2lzZSwKKwkgKiB0cnkgdG8gdXBkYXRlIHRoZSBsYXN0IHRpbWUuCisJICov CisJZG8geworCQlsYXN0ID0gYXRvbWljX2xvYWRfYWNxXzY0KCZwdmNsb2NrX2xhc3RfY3ljbGVz KTsKKwkJaWYgKGxhc3QgPiBub3cpCisJCQlyZXR1cm4gKGxhc3QpOworCX0gd2hpbGUgKCFhdG9t aWNfY21wc2V0XzY0KCZwdmNsb2NrX2xhc3RfY3ljbGVzLCBsYXN0LCBub3cpKTsKKworCXJldHVy biAobm93KTsKK30KKwordm9pZAorcHZjbG9ja19nZXRfd2FsbGNsb2NrKHN0cnVjdCBwdmNsb2Nr X3dhbGxfY2xvY2sgKndjLCBzdHJ1Y3QgdGltZXNwZWMgKnRzKQoreworCXVpbnQzMl90IHNlYywg bnNlYzsKKworCXB2Y2xvY2tfcmVhZF93YWxsX2Nsb2NrKHdjLCAmc2VjLCAmbnNlYyk7CisJdHMt PnR2X3NlYyA9IHNlYzsKKwl0cy0+dHZfbnNlYyA9IG5zZWM7Cit9CmRpZmYgLS1naXQgYS9zeXMv eDg2L3g4Ni90c2MuYyBiL3N5cy94ODYveDg2L3RzYy5jCmluZGV4IDRjYTU3NGUuLmE4MzRjYjUg MTAwNjQ0Ci0tLSBhL3N5cy94ODYveDg2L3RzYy5jCisrKyBiL3N5cy94ODYveDg2L3RzYy5jCkBA IC0xMDQsMjIgKzEwNCw2IEBAIHN0YXRpYyBzdHJ1Y3QgdGltZWNvdW50ZXIgdHNjX3RpbWVjb3Vu dGVyID0gewogfTsKIAogc3RhdGljIHZvaWQKLXRzY19mcmVxX3Ztd2FyZSh2b2lkKQotewotCXVf aW50IHJlZ3NbNF07Ci0KLQlpZiAoaHZfaGlnaCA+PSAweDQwMDAwMDEwKSB7Ci0JCWRvX2NwdWlk KDB4NDAwMDAwMTAsIHJlZ3MpOwotCQl0c2NfZnJlcSA9IHJlZ3NbMF0gKiAxMDAwOwotCX0gZWxz ZSB7Ci0JCXZtd2FyZV9odmNhbGwoVk1XX0hWQ01EX0dFVEhaLCByZWdzKTsKLQkJaWYgKHJlZ3Nb MV0gIT0gVUlOVF9NQVgpCi0JCQl0c2NfZnJlcSA9IHJlZ3NbMF0gfCAoKHVpbnQ2NF90KXJlZ3Nb MV0gPDwgMzIpOwotCX0KLQl0c2NfaXNfaW52YXJpYW50ID0gMTsKLX0KLQotc3RhdGljIHZvaWQK IHRzY19mcmVxX2ludGVsKHZvaWQpCiB7CiAJY2hhciBicmFuZFs0OF07CkBAIC0yMDEsNyArMTg1 LDggQEAgcHJvYmVfdHNjX2ZyZXEodm9pZCkKIAl9CiAKIAlpZiAodm1fZ3Vlc3QgPT0gVk1fR1VF U1RfVk1XQVJFKSB7Ci0JCXRzY19mcmVxX3Ztd2FyZSgpOworCQl0c2NfZnJlcSA9IHZtd2FyZV90 c2NfZnJlcSgpOworCQl0c2NfaXNfaW52YXJpYW50ID0gMTsKIAkJcmV0dXJuOwogCX0KIApkaWZm IC0tZ2l0IGEvc3lzL3g4Ni94ODYvdm13YXJlLmMgYi9zeXMveDg2L3g4Ni92bXdhcmUuYwpuZXcg ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTZhY2JiCi0tLSAvZGV2L251bGwKKysr IGIvc3lzL3g4Ni94ODYvdm13YXJlLmMKQEAgLTAsMCArMSw4NCBAQAorLyotCisgKiBDb3B5cmln aHQgKGMpIDIwMTQgQnJ5YW4gVmVudGVpY2hlciA8YnJ5YW52QEZyZWVCU0Qub3JnPgorICogQWxs IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJl IG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0 aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90 aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy IGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ REVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkg RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE IFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ VE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5P IEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9S IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9S IENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP LCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBP RiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhP V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBD T05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdF TkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBP RiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisg KiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CitfX0ZCU0RJRCgi JEZyZWVCU0QkIik7CisKKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxzeXMvc3lz dG0uaD4KKyNpbmNsdWRlIDxzeXMvbGltaXRzLmg+CisKKyNpbmNsdWRlIDx4ODYvaHlwZXJ2aXNv ci5oPgorI2luY2x1ZGUgPHg4Ni92bXdhcmUuaD4KKworc3RhdGljIHVpbnQzMl90IHZtd2FyZV9j cHVpZF9iYXNlID0gLTE7CitzdGF0aWMgdWludDMyX3Qgdm13YXJlX2NwdWlkX2hpZ2ggPSAtMTsK Kworc3RhdGljIGludAordm13YXJlX2NwdWlkX2lkZW50aWZ5KHZvaWQpCit7CisKKwkvKgorCSAq IEtCMTAwOTQ1ODogTWVjaGFuaXNtcyB0byBkZXRlcm1pbmUgaWYgc29mdHdhcmUgaXMgcnVubmlu ZyBpbiBhCisJICogVk13YXJlIHZpcnR1YWwgbWFjaGluZTogaHR0cDovL2tiLnZtd2FyZS5jb20v a2IvMTAwOTQ1OAorCSAqLworCWlmICh2bXdhcmVfY3B1aWRfYmFzZSA9PSAtMSkgeworCQloeXBl cnZpc29yX2NwdWlkX2Jhc2UoIlZNd2FyZVZNd2FyZSIsIDAsICZ2bXdhcmVfY3B1aWRfYmFzZSwK KwkJICAgICZ2bXdhcmVfY3B1aWRfaGlnaCk7CisJfQorCisJcmV0dXJuICh2bXdhcmVfY3B1aWRf YmFzZSA+IDApOworfQorCit1aW50NjRfdAordm13YXJlX3RzY19mcmVxKHZvaWQpCit7CisJdWlu dDY0X3QgZnJlcTsKKwl1X2ludCByZWdzWzRdOworCisJaWYgKHZtd2FyZV9jcHVpZF9oaWdoID49 IDB4NDAwMDAwMTApIHsKKwkJZG9fY3B1aWQoMHg0MDAwMDAxMCwgcmVncyk7CisJCWZyZXEgPSBy ZWdzWzBdICogMTAwMDsKKwl9IGVsc2UgeworCQl2bXdhcmVfaHZjYWxsKFZNV19IVkNNRF9HRVRI WiwgcmVncyk7CisJCWlmIChyZWdzWzFdICE9IFVJTlRfTUFYKQorCQkJZnJlcSA9IHJlZ3NbMF0g fCAoKHVpbnQ2NF90KXJlZ3NbMV0gPDwgMzIpOworCQllbHNlCisJCQlmcmVxID0gMDsKKwl9CisK KwlyZXR1cm4gKGZyZXEpOworfQorCitzdGF0aWMgdm9pZAordm13YXJlX2luaXQodm9pZCkKK3sK KworCWlmICh2bXdhcmVfY3B1aWRfaWRlbnRpZnkoKSAhPSAwKQorCQloeXBlcnZpc29yX3JlZ2lz dGVyKCJWTXdhcmUiLCBWTV9HVUVTVF9WTVdBUkUsIE5VTEwpOworfQorCitIWVBFUlZJU09SX1NZ U0lOSVQodm13YXJlLCB2bXdhcmVfaW5pdCk7Cg== --001a11425fb46ce52b050bd74b4a--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAMo0n6QUp3iZ2fEqbrsD2MhEsWWOPTLisd9iB7TNEvbevcK0Fw>