From mboxrd@z Thu Jan 1 00:00:00 1970 From: "=?UTF-8?q?Christian=20K=C3=B6nig?=" Subject: [PATCH 2/2] drm/amdgpu: use ring buffer for fault handling on GMC 9 Date: Thu, 24 Jan 2019 13:52:56 +0100 Message-ID: <20190124125256.9900-2-christian.koenig@amd.com> References: <20190124125256.9900-1-christian.koenig@amd.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <20190124125256.9900-1-christian.koenig-5C7GfCeVMHo@public.gmane.org> List-Id: Discussion list for AMD gfx List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: amd-gfx-bounces-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org Sender: "amd-gfx" To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org Cc: Philip.Yang-5C7GfCeVMHo@public.gmane.org, Felix.Kuehling-5C7GfCeVMHo@public.gmane.org RnVydGhlciB0ZXN0aW5nIHNob3dlZCB0aGF0IHRoZSBpZGVhIHdpdGggdGhlIGNoYXNoIGRvZXNu J3Qgd29yayBhcyBleHBlY3RlZC4KRXNwZWNpYWxseSB3ZSBjYW4ndCBwcmVkaWN0IHdoZW4gd2Ug Y2FuIHJlbW92ZSB0aGUgZW50cmllcyBmcm9tIHRoZSBoYXNoIGFnYWluLgoKU28gcmVwbGFjZSB0 aGUgY2hhc2ggd2l0aCBhIHNpbXBsZSByaW5nIGJ1ZmZlciBmb3Igbm93IHRvIGZpbHRlciBvdXQg dGhlCmFscmVhZHkgaGFuZGxlZCBmYXVsdHMuIEFzIGxvbmcgYXMgd2Ugc2VlIGxlc3MgdGhhbiA2 NCBkaXN0aW5jdCBhZGRyZXNzZXMgd2UKc3RpbGwgcmVwb3J0IHRoZW0gb25seSBvbmNlIHRvIHRo ZSBmb2xsb3dpbmcgaGFuZGxpbmcuCgpTaWduZWQtb2ZmLWJ5OiBDaHJpc3RpYW4gS8O2bmlnIDxj aHJpc3RpYW4ua29lbmlnQGFtZC5jb20+Ci0tLQogZHJpdmVycy9ncHUvZHJtL0tjb25maWcgICAg ICAgICAgICAgICAgICAgfCAgIDIgLQogZHJpdmVycy9ncHUvZHJtL01ha2VmaWxlICAgICAgICAg ICAgICAgICAgfCAgIDEgLQogZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1X2dtYy5o ICAgfCAgIDggKwogZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1X3ZtLmMgICAgfCAx MDUgLS0tLQogZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1X3ZtLmggICAgfCAgMTQg LQogZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvZ21jX3Y5XzAuYyAgICAgfCAgNDAgKy0KIGRy aXZlcnMvZ3B1L2RybS9hbWQvaW5jbHVkZS9saW51eC9jaGFzaC5oIHwgMzY2IC0tLS0tLS0tLS0t LS0KIGRyaXZlcnMvZ3B1L2RybS9hbWQvbGliL0tjb25maWcgICAgICAgICAgIHwgIDI4IC0KIGRy aXZlcnMvZ3B1L2RybS9hbWQvbGliL01ha2VmaWxlICAgICAgICAgIHwgIDMyIC0tCiBkcml2ZXJz L2dwdS9kcm0vYW1kL2xpYi9jaGFzaC5jICAgICAgICAgICB8IDYzOCAtLS0tLS0tLS0tLS0tLS0t LS0tLS0tCiAxMCBmaWxlcyBjaGFuZ2VkLCAxNiBpbnNlcnRpb25zKCspLCAxMjE4IGRlbGV0aW9u cygtKQogZGVsZXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1L2RybS9hbWQvaW5jbHVkZS9saW51 eC9jaGFzaC5oCiBkZWxldGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL2FtZC9saWIvS2Nv bmZpZwogZGVsZXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1L2RybS9hbWQvbGliL01ha2VmaWxl CiBkZWxldGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL2FtZC9saWIvY2hhc2guYwoKZGlm ZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9LY29uZmlnIGIvZHJpdmVycy9ncHUvZHJtL0tjb25m aWcKaW5kZXggNDM4NWYwMGUxZDA1Li45OGIwMzNlNjc1ZGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMv Z3B1L2RybS9LY29uZmlnCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9LY29uZmlnCkBAIC0yMjksOCAr MjI5LDYgQEAgY29uZmlnIERSTV9BTURHUFUKIAogc291cmNlICJkcml2ZXJzL2dwdS9kcm0vYW1k L2FtZGdwdS9LY29uZmlnIgogCi1zb3VyY2UgImRyaXZlcnMvZ3B1L2RybS9hbWQvbGliL0tjb25m aWciCi0KIHNvdXJjZSAiZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvS2NvbmZpZyIKIAogc291cmNl ICJkcml2ZXJzL2dwdS9kcm0vaTkxNS9LY29uZmlnIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUv ZHJtL01ha2VmaWxlIGIvZHJpdmVycy9ncHUvZHJtL01ha2VmaWxlCmluZGV4IDdmM2JlMzUwNjA1 Ny4uYWM2MjEzNTc1NjkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vTWFrZWZpbGUKKysr IGIvZHJpdmVycy9ncHUvZHJtL01ha2VmaWxlCkBAIC01Niw3ICs1Niw2IEBAIG9iai0kKENPTkZJ R19EUk1fVFRNKQkrPSB0dG0vCiBvYmotJChDT05GSUdfRFJNX1NDSEVEKQkrPSBzY2hlZHVsZXIv CiBvYmotJChDT05GSUdfRFJNX1RERlgpCSs9IHRkZngvCiBvYmotJChDT05GSUdfRFJNX1IxMjgp CSs9IHIxMjgvCi1vYmoteQkJCSs9IGFtZC9saWIvCiBvYmotJChDT05GSUdfSFNBX0FNRCkgKz0g YW1kL2FtZGtmZC8KIG9iai0kKENPTkZJR19EUk1fUkFERU9OKSs9IHJhZGVvbi8KIG9iai0kKENP TkZJR19EUk1fQU1ER1BVKSs9IGFtZC9hbWRncHUvCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9k cm0vYW1kL2FtZGdwdS9hbWRncHVfZ21jLmggYi9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9h bWRncHVfZ21jLmgKaW5kZXggODFlNjA3MGQyNTViLi44M2M0MTVlYjQwZjQgMTAwNjQ0Ci0tLSBh L2RyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV9nbWMuaAorKysgYi9kcml2ZXJzL2dw dS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfZ21jLmgKQEAgLTQzLDYgKzQzLDExIEBACiAgKi8KICNk ZWZpbmUgQU1ER1BVX0dNQ19IT0xFX01BU0sJMHgwMDAwZmZmZmZmZmZmZmZmVUxMCiAKKy8qCisg KiBOdW1iZXIgb2YgZW50cmllcyBmb3IgdGhlIGxvZyBvZiByZWNlbnQgVk0gZmF1bHRzCisgKi8K KyNkZWZpbmUgQU1ER1BVX0dNQ19OVU1fVk1fRkFVTFRTCTY0CisKIHN0cnVjdCBmaXJtd2FyZTsK IAogLyoKQEAgLTE0Nyw2ICsxNTIsOSBAQCBzdHJ1Y3QgYW1kZ3B1X2dtYyB7CiAJc3RydWN0IGtm ZF92bV9mYXVsdF9pbmZvICp2bV9mYXVsdF9pbmZvOwogCWF0b21pY190CQl2bV9mYXVsdF9pbmZv X3VwZGF0ZWQ7CiAKKwl1aW50NjRfdAkJdm1fZmF1bHRzW0FNREdQVV9HTUNfTlVNX1ZNX0ZBVUxU U107CisJaW50CQkJdm1fZmF1bHRfaWR4OworCiAJY29uc3Qgc3RydWN0IGFtZGdwdV9nbWNfZnVu Y3MJKmdtY19mdW5jczsKIAogCXN0cnVjdCBhbWRncHVfeGdtaSB4Z21pOwpkaWZmIC0tZ2l0IGEv ZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1X3ZtLmMgYi9kcml2ZXJzL2dwdS9kcm0v YW1kL2FtZGdwdS9hbWRncHVfdm0uYwppbmRleCAwYmM2ZjU1M2RjMDguLjMwNDFkNzJjNTQ3OCAx MDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1X3ZtLmMKKysrIGIv ZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1X3ZtLmMKQEAgLTI5NzIsMjIgKzI5NzIs NiBAQCB2b2lkIGFtZGdwdV92bV9hZGp1c3Rfc2l6ZShzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRl diwgdWludDMyX3QgbWluX3ZtX3NpemUsCiAJCSBhZGV2LT52bV9tYW5hZ2VyLmZyYWdtZW50X3Np emUpOwogfQogCi1zdGF0aWMgc3RydWN0IGFtZGdwdV9yZXRyeWZhdWx0X2hhc2h0YWJsZSAqaW5p dF9mYXVsdF9oYXNoKHZvaWQpCi17Ci0Jc3RydWN0IGFtZGdwdV9yZXRyeWZhdWx0X2hhc2h0YWJs ZSAqZmF1bHRfaGFzaDsKLQotCWZhdWx0X2hhc2ggPSBrbWFsbG9jKHNpemVvZigqZmF1bHRfaGFz aCksIEdGUF9LRVJORUwpOwotCWlmICghZmF1bHRfaGFzaCkKLQkJcmV0dXJuIGZhdWx0X2hhc2g7 Ci0KLQlJTklUX0NIQVNIX1RBQkxFKGZhdWx0X2hhc2gtPmhhc2gsCi0JCQlBTURHUFVfUEFHRUZB VUxUX0hBU0hfQklUUywgOCwgMCk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmZhdWx0X2hhc2gtPmxvY2sp OwotCWZhdWx0X2hhc2gtPmNvdW50ID0gMDsKLQotCXJldHVybiBmYXVsdF9oYXNoOwotfQotCiAv KioKICAqIGFtZGdwdV92bV9pbml0IC0gaW5pdGlhbGl6ZSBhIHZtIGluc3RhbmNlCiAgKgpAQCAt MzA4MCwxMiArMzA2NCw2IEBAIGludCBhbWRncHVfdm1faW5pdChzdHJ1Y3QgYW1kZ3B1X2Rldmlj ZSAqYWRldiwgc3RydWN0IGFtZGdwdV92bSAqdm0sCiAJCXZtLT5wYXNpZCA9IHBhc2lkOwogCX0K IAotCXZtLT5mYXVsdF9oYXNoID0gaW5pdF9mYXVsdF9oYXNoKCk7Ci0JaWYgKCF2bS0+ZmF1bHRf aGFzaCkgewotCQlyID0gLUVOT01FTTsKLQkJZ290byBlcnJvcl9mcmVlX3Jvb3Q7Ci0JfQotCiAJ SU5JVF9LRklGTyh2bS0+ZmF1bHRzKTsKIAogCXJldHVybiAwOwpAQCAtMzI0MSwxNSArMzIxOSwx MCBAQCB2b2lkIGFtZGdwdV92bV9maW5pKHN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2LCBzdHJ1 Y3QgYW1kZ3B1X3ZtICp2bSkKIAlzdHJ1Y3QgYW1kZ3B1X2JvX3ZhX21hcHBpbmcgKm1hcHBpbmcs ICp0bXA7CiAJYm9vbCBwcnRfZmluaV9uZWVkZWQgPSAhIWFkZXYtPmdtYy5nbWNfZnVuY3MtPnNl dF9wcnQ7CiAJc3RydWN0IGFtZGdwdV9ibyAqcm9vdDsKLQl1NjQgZmF1bHQ7CiAJaW50IGksIHI7 CiAKIAlhbWRncHVfYW1ka2ZkX2dwdXZtX2Rlc3Ryb3lfY2IoYWRldiwgdm0pOwogCi0JLyogQ2xl YXIgcGVuZGluZyBwYWdlIGZhdWx0cyBmcm9tIElIIHdoZW4gdGhlIFZNIGlzIGRlc3Ryb3llZCAq LwotCXdoaWxlIChrZmlmb19nZXQoJnZtLT5mYXVsdHMsICZmYXVsdCkpCi0JCWFtZGdwdV92bV9j bGVhcl9mYXVsdCh2bS0+ZmF1bHRfaGFzaCwgZmF1bHQpOwotCiAJaWYgKHZtLT5wYXNpZCkgewog CQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCkBAIC0zMjU4LDkgKzMyMzEsNiBAQCB2b2lkIGFtZGdw dV92bV9maW5pKHN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2LCBzdHJ1Y3QgYW1kZ3B1X3ZtICp2 bSkKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRldi0+dm1fbWFuYWdlci5wYXNpZF9sb2Nr LCBmbGFncyk7CiAJfQogCi0Ja2ZyZWUodm0tPmZhdWx0X2hhc2gpOwotCXZtLT5mYXVsdF9oYXNo ID0gTlVMTDsKLQogCWRybV9zY2hlZF9lbnRpdHlfZGVzdHJveSgmdm0tPmVudGl0eSk7CiAKIAlp ZiAoIVJCX0VNUFRZX1JPT1QoJnZtLT52YS5yYl9yb290KSkgewpAQCAtMzQyNiw3OCArMzM5Niwz IEBAIHZvaWQgYW1kZ3B1X3ZtX3NldF90YXNrX2luZm8oc3RydWN0IGFtZGdwdV92bSAqdm0pCiAJ CX0KIAl9CiB9Ci0KLS8qKgotICogYW1kZ3B1X3ZtX2FkZF9mYXVsdCAtIEFkZCBhIHBhZ2UgZmF1 bHQgcmVjb3JkIHRvIGZhdWx0IGhhc2ggdGFibGUKLSAqCi0gKiBAZmF1bHRfaGFzaDogZmF1bHQg aGFzaCB0YWJsZQotICogQGtleTogNjQtYml0IGVuY29kaW5nIG9mIFBBU0lEIGFuZCBhZGRyZXNz Ci0gKgotICogVGhpcyBzaG91bGQgYmUgY2FsbGVkIHdoZW4gYSByZXRyeSBwYWdlIGZhdWx0IGlu dGVycnVwdCBpcwotICogcmVjZWl2ZWQuIElmIHRoaXMgaXMgYSBuZXcgcGFnZSBmYXVsdCwgaXQg d2lsbCBiZSBhZGRlZCB0byBhIGhhc2gKLSAqIHRhYmxlLiBUaGUgcmV0dXJuIHZhbHVlIGluZGlj YXRlcyB3aGV0aGVyIHRoaXMgaXMgYSBuZXcgZmF1bHQsIG9yCi0gKiBhIGZhdWx0IHRoYXQgd2Fz IGFscmVhZHkga25vd24gYW5kIGlzIGFscmVhZHkgYmVpbmcgaGFuZGxlZC4KLSAqCi0gKiBJZiB0 aGVyZSBhcmUgdG9vIG1hbnkgcGVuZGluZyBwYWdlIGZhdWx0cywgdGhpcyB3aWxsIGZhaWwuIFJl dHJ5Ci0gKiBpbnRlcnJ1cHRzIHNob3VsZCBiZSBpZ25vcmVkIGluIHRoaXMgY2FzZSB1bnRpbCB0 aGVyZSBpcyBlbm91Z2gKLSAqIGZyZWUgc3BhY2UuCi0gKgotICogUmV0dXJucyAwIGlmIHRoZSBm YXVsdCB3YXMgYWRkZWQsIDEgaWYgdGhlIGZhdWx0IHdhcyBhbHJlYWR5IGtub3duLAotICogLUVO T1NQQyBpZiB0aGVyZSBhcmUgdG9vIG1hbnkgcGVuZGluZyBmYXVsdHMuCi0gKi8KLWludCBhbWRn cHVfdm1fYWRkX2ZhdWx0KHN0cnVjdCBhbWRncHVfcmV0cnlmYXVsdF9oYXNodGFibGUgKmZhdWx0 X2hhc2gsIHU2NCBrZXkpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgciA9IC1FTk9T UEM7Ci0KLQlpZiAoV0FSTl9PTl9PTkNFKCFmYXVsdF9oYXNoKSkKLQkJLyogU2hvdWxkIGJlIGFs bG9jYXRlZCBpbiBhbWRncHVfdm1faW5pdAotCQkgKi8KLQkJcmV0dXJuIHI7Ci0KLQlzcGluX2xv Y2tfaXJxc2F2ZSgmZmF1bHRfaGFzaC0+bG9jaywgZmxhZ3MpOwotCi0JLyogT25seSBsZXQgdGhl IGhhc2ggdGFibGUgZmlsbCB1cCB0byA1MCUgZm9yIGJlc3QgcGVyZm9ybWFuY2UgKi8KLQlpZiAo ZmF1bHRfaGFzaC0+Y291bnQgPj0gKDEgPDwgKEFNREdQVV9QQUdFRkFVTFRfSEFTSF9CSVRTLTEp KSkKLQkJZ290byB1bmxvY2tfb3V0OwotCi0JciA9IGNoYXNoX3RhYmxlX2NvcHlfaW4oJmZhdWx0 X2hhc2gtPmhhc2gsIGtleSwgTlVMTCk7Ci0JaWYgKCFyKQotCQlmYXVsdF9oYXNoLT5jb3VudCsr OwotCi0JLyogY2hhc2hfdGFibGVfY29weV9pbiBzaG91bGQgbmV2ZXIgZmFpbCB1bmxlc3Mgd2Un cmUgbG9zaW5nIGNvdW50ICovCi0JV0FSTl9PTl9PTkNFKHIgPCAwKTsKLQotdW5sb2NrX291dDoK LQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmYXVsdF9oYXNoLT5sb2NrLCBmbGFncyk7Ci0JcmV0 dXJuIHI7Ci19Ci0KLS8qKgotICogYW1kZ3B1X3ZtX2NsZWFyX2ZhdWx0IC0gUmVtb3ZlIGEgcGFn ZSBmYXVsdCByZWNvcmQKLSAqCi0gKiBAZmF1bHRfaGFzaDogZmF1bHQgaGFzaCB0YWJsZQotICog QGtleTogNjQtYml0IGVuY29kaW5nIG9mIFBBU0lEIGFuZCBhZGRyZXNzCi0gKgotICogVGhpcyBz aG91bGQgYmUgY2FsbGVkIHdoZW4gYSBwYWdlIGZhdWx0IGhhcyBiZWVuIGhhbmRsZWQuIEFueQot ICogZnV0dXJlIGludGVycnVwdCB3aXRoIHRoaXMga2V5IHdpbGwgYmUgcHJvY2Vzc2VkIGFzIGEg bmV3Ci0gKiBwYWdlIGZhdWx0LgotICovCi12b2lkIGFtZGdwdV92bV9jbGVhcl9mYXVsdChzdHJ1 Y3QgYW1kZ3B1X3JldHJ5ZmF1bHRfaGFzaHRhYmxlICpmYXVsdF9oYXNoLCB1NjQga2V5KQotewot CXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHI7Ci0KLQlpZiAoIWZhdWx0X2hhc2gpCi0JCXJl dHVybjsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZmYXVsdF9oYXNoLT5sb2NrLCBmbGFncyk7Ci0K LQlyID0gY2hhc2hfdGFibGVfcmVtb3ZlKCZmYXVsdF9oYXNoLT5oYXNoLCBrZXksIE5VTEwpOwot CWlmICghV0FSTl9PTl9PTkNFKHIgPCAwKSkgewotCQlmYXVsdF9oYXNoLT5jb3VudC0tOwotCQlX QVJOX09OX09OQ0UoZmF1bHRfaGFzaC0+Y291bnQgPCAwKTsKLQl9Ci0KLQlzcGluX3VubG9ja19p cnFyZXN0b3JlKCZmYXVsdF9oYXNoLT5sb2NrLCBmbGFncyk7Ci19CmRpZmYgLS1naXQgYS9kcml2 ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfdm0uaCBiL2RyaXZlcnMvZ3B1L2RybS9hbWQv YW1kZ3B1L2FtZGdwdV92bS5oCmluZGV4IDgxZmY4MTc3ZjA5Mi4uN2M0OTIzNWI2MDY0IDEwMDY0 NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfdm0uaAorKysgYi9kcml2 ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfdm0uaApAQCAtMzAsNyArMzAsNiBAQAogI2lu Y2x1ZGUgPGRybS9ncHVfc2NoZWR1bGVyLmg+CiAjaW5jbHVkZSA8ZHJtL2RybV9maWxlLmg+CiAj aW5jbHVkZSA8ZHJtL3R0bS90dG1fYm9fZHJpdmVyLmg+Ci0jaW5jbHVkZSA8bGludXgvY2hhc2gu aD4KIAogI2luY2x1ZGUgImFtZGdwdV9zeW5jLmgiCiAjaW5jbHVkZSAiYW1kZ3B1X3JpbmcuaCIK QEAgLTE3OSwxMyArMTc4LDYgQEAgc3RydWN0IGFtZGdwdV90YXNrX2luZm8gewogCXBpZF90CXRn aWQ7CiB9OwogCi0jZGVmaW5lIEFNREdQVV9QQUdFRkFVTFRfSEFTSF9CSVRTIDgKLXN0cnVjdCBh bWRncHVfcmV0cnlmYXVsdF9oYXNodGFibGUgewotCURFQ0xBUkVfQ0hBU0hfVEFCTEUoaGFzaCwg QU1ER1BVX1BBR0VGQVVMVF9IQVNIX0JJVFMsIDgsIDApOwotCXNwaW5sb2NrX3QJbG9jazsKLQlp bnQJCWNvdW50OwotfTsKLQogc3RydWN0IGFtZGdwdV92bSB7CiAJLyogdHJlZSBvZiB2aXJ0dWFs IGFkZHJlc3NlcyBtYXBwZWQgKi8KIAlzdHJ1Y3QgcmJfcm9vdF9jYWNoZWQJdmE7CkBAIC0yNDUs NyArMjM3LDYgQEAgc3RydWN0IGFtZGdwdV92bSB7CiAJc3RydWN0IHR0bV9scnVfYnVsa19tb3Zl IGxydV9idWxrX21vdmU7CiAJLyogbWFyayB3aGV0aGVyIGNhbiBkbyB0aGUgYnVsayBtb3ZlICov CiAJYm9vbAkJCWJ1bGtfbW92ZWFibGU7Ci0Jc3RydWN0IGFtZGdwdV9yZXRyeWZhdWx0X2hhc2h0 YWJsZSAqZmF1bHRfaGFzaDsKIH07CiAKIHN0cnVjdCBhbWRncHVfdm1fbWFuYWdlciB7CkBAIC0z NTgsMTEgKzM0OSw2IEBAIHZvaWQgYW1kZ3B1X3ZtX3NldF90YXNrX2luZm8oc3RydWN0IGFtZGdw dV92bSAqdm0pOwogCiB2b2lkIGFtZGdwdV92bV9tb3ZlX3RvX2xydV90YWlsKHN0cnVjdCBhbWRn cHVfZGV2aWNlICphZGV2LAogCQkJCXN0cnVjdCBhbWRncHVfdm0gKnZtKTsKLQotaW50IGFtZGdw dV92bV9hZGRfZmF1bHQoc3RydWN0IGFtZGdwdV9yZXRyeWZhdWx0X2hhc2h0YWJsZSAqZmF1bHRf aGFzaCwgdTY0IGtleSk7Ci0KLXZvaWQgYW1kZ3B1X3ZtX2NsZWFyX2ZhdWx0KHN0cnVjdCBhbWRn cHVfcmV0cnlmYXVsdF9oYXNodGFibGUgKmZhdWx0X2hhc2gsIHU2NCBrZXkpOwotCiB2b2lkIGFt ZGdwdV92bV9kZWxfZnJvbV9scnVfbm90aWZ5KHN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8p OwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2dtY192 OV8wLmMgYi9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9nbWNfdjlfMC5jCmluZGV4IDljMDgy ZjlhZWExYS4uOTY0ZTc4OTkwOGQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vYW1kL2Ft ZGdwdS9nbWNfdjlfMC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2dtY192OV8w LmMKQEAgLTI1NSw0OCArMjU1LDI0IEBAIHN0YXRpYyBib29sIGdtY192OV8wX3ByZXNjcmVlbl9p dihzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldiwKIAkJCQkgIHN0cnVjdCBhbWRncHVfaXZfZW50 cnkgKmVudHJ5LAogCQkJCSAgdWludDY0X3QgYWRkcikKIHsKLQlzdHJ1Y3QgYW1kZ3B1X3ZtICp2 bTsKKwl1bnNpZ25lZCBpOwogCXU2NCBrZXk7Ci0JaW50IHI7CiAKIAkvKiBObyBQQVNJRCwgY2Fu J3QgaWRlbnRpZnkgZmF1bHRpbmcgcHJvY2VzcyAqLwogCWlmICghZW50cnktPnBhc2lkKQogCQly ZXR1cm4gdHJ1ZTsKIAotCS8qIE5vdCBhIHJldHJ5IGZhdWx0ICovCi0JaWYgKCEoZW50cnktPnNy Y19kYXRhWzFdICYgMHg4MCkpCi0JCXJldHVybiB0cnVlOwotCi0JLyogVHJhY2sgcmV0cnkgZmF1 bHRzIGluIHBlci1WTSBmYXVsdCBGSUZPLiAqLwotCXNwaW5fbG9jaygmYWRldi0+dm1fbWFuYWdl ci5wYXNpZF9sb2NrKTsKLQl2bSA9IGlkcl9maW5kKCZhZGV2LT52bV9tYW5hZ2VyLnBhc2lkX2lk ciwgZW50cnktPnBhc2lkKTsKLQlpZiAoIXZtKSB7Ci0JCS8qIFZNIG5vdCBmb3VuZCwgcHJvY2Vz cyBpdCBub3JtYWxseSAqLwotCQlzcGluX3VubG9jaygmYWRldi0+dm1fbWFuYWdlci5wYXNpZF9s b2NrKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCiAJa2V5ID0gQU1ER1BVX1ZNX0ZBVUxUKGVudHJ5 LT5wYXNpZCwgYWRkcik7Ci0JciA9IGFtZGdwdV92bV9hZGRfZmF1bHQodm0tPmZhdWx0X2hhc2gs IGtleSk7CiAKLQkvKiBIYXNoIHRhYmxlIGlzIGZ1bGwgb3IgdGhlIGZhdWx0IGlzIGFscmVhZHkg YmVpbmcgcHJvY2Vzc2VkLAotCSAqIGlnbm9yZSBmdXJ0aGVyIHBhZ2UgZmF1bHRzCi0JICovCi0J aWYgKHIgIT0gMCkgewotCQlzcGluX3VubG9jaygmYWRldi0+dm1fbWFuYWdlci5wYXNpZF9sb2Nr KTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkvKiBObyBsb2NraW5nIHJlcXVpcmVkIHdpdGggc2lu Z2xlIHdyaXRlciBhbmQgc2luZ2xlIHJlYWRlciAqLwotCXIgPSBrZmlmb19wdXQoJnZtLT5mYXVs dHMsIGtleSk7Ci0JaWYgKCFyKSB7Ci0JCS8qIEZJRk8gaXMgZnVsbC4gSWdub3JlIGl0IHVudGls IHRoZXJlIGlzIHNwYWNlICovCi0JCWFtZGdwdV92bV9jbGVhcl9mYXVsdCh2bS0+ZmF1bHRfaGFz aCwga2V5KTsKLQkJc3Bpbl91bmxvY2soJmFkZXYtPnZtX21hbmFnZXIucGFzaWRfbG9jayk7Ci0J CXJldHVybiBmYWxzZTsKKwkvKiBUcmFjayB0aGUgbGFzdCBOIGZhdWx0cyBhbmQgZG9uJ3QgcmVw b3J0IHRoZW0gYWdhaW4gb24gcmV0cnkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQU1ER1BVX0dNQ19O VU1fVk1fRkFVTFRTOyArK2kpIHsKKwkJaWYgKGFkZXYtPmdtYy52bV9mYXVsdHNbaV0gPT0ga2V5 KQorCQkJcmV0dXJuIGZhbHNlOwogCX0KIAotCXNwaW5fdW5sb2NrKCZhZGV2LT52bV9tYW5hZ2Vy LnBhc2lkX2xvY2spOwogCS8qIEl0J3MgdGhlIGZpcnN0IGZhdWx0IGZvciB0aGlzIGFkZHJlc3Ms IHByb2Nlc3MgaXQgbm9ybWFsbHkgKi8KKwlhZGV2LT5nbWMudm1fZmF1bHRzW2FkZXYtPmdtYy52 bV9mYXVsdF9pZHgrK10gPSBrZXk7CisJYWRldi0+Z21jLnZtX2ZhdWx0X2lkeCAlPSBBTURHUFVf R01DX05VTV9WTV9GQVVMVFM7CiAJcmV0dXJuIHRydWU7CiB9CiAKQEAgLTMxMiw3ICsyODgsNyBA QCBzdGF0aWMgaW50IGdtY192OV8wX3Byb2Nlc3NfaW50ZXJydXB0KHN0cnVjdCBhbWRncHVfZGV2 aWNlICphZGV2LAogCWFkZHIgPSAodTY0KWVudHJ5LT5zcmNfZGF0YVswXSA8PCAxMjsKIAlhZGRy IHw9ICgodTY0KWVudHJ5LT5zcmNfZGF0YVsxXSAmIDB4ZikgPDwgNDQ7CiAKLQlpZiAoIWdtY192 OV8wX3ByZXNjcmVlbl9pdihhZGV2LCBlbnRyeSwgYWRkcikpCisJaWYgKHJldHJ5X2ZhdWx0ICYm ICFnbWNfdjlfMF9wcmVzY3JlZW5faXYoYWRldiwgZW50cnksIGFkZHIpKQogCQlyZXR1cm4gMTsg LyogVGhpcyBhbHNvIHByZXZlbnRzIHNlbmRpbmcgaXQgdG8gS0ZEICovCiAKIAlpZiAoIWFtZGdw dV9zcmlvdl92ZihhZGV2KSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2FtZC9pbmNs dWRlL2xpbnV4L2NoYXNoLmggYi9kcml2ZXJzL2dwdS9kcm0vYW1kL2luY2x1ZGUvbGludXgvY2hh c2guaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRjMTU5OTI0ZWQxLi4wMDAwMDAw MDAwMDAKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2FtZC9pbmNsdWRlL2xpbnV4L2NoYXNoLmgKKysr IC9kZXYvbnVsbApAQCAtMSwzNjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEFkdmFu Y2VkIE1pY3JvIERldmljZXMsIEluYy4KLSAqCi0gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFu dGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQotICogY29weSBv ZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAi U29mdHdhcmUiKSwKLSAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rp b24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KLSAqIHRoZSByaWdodHMgdG8gdXNlLCBj b3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAotICog YW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25z IHRvIHdob20gdGhlCi0gKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3Qg dG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotICoKLSAqIFRoZSBhYm92ZSBjb3B5cmlnaHQg bm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCi0g KiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KLSAq Ci0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBP RiBBTlkgS0lORCwgRVhQUkVTUyBPUgotICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElN SVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCi0gKiBGSVRORVNTIEZP UiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQg U0hBTEwKLSAqIFRIRSBDT1BZUklHSFQgSE9MREVSKFMpIE9SIEFVVEhPUihTKSBCRSBMSUFCTEUg Rk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgotICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElO IEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCi0gKiBBUklTSU5HIEZS T00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0Ug T1IKLSAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KLSAqCi0gKi8KLQotI2lmbmRl ZiBfTElOVVhfQ0hBU0hfSAotI2RlZmluZSBfTElOVVhfQ0hBU0hfSAotCi0jaW5jbHVkZSA8bGlu dXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9oYXNoLmg+Ci0jaW5jbHVkZSA8bGludXgvYnVn Lmg+Ci0jaW5jbHVkZSA8YXNtL2JpdHNwZXJsb25nLmg+Ci0KLSNpZiBCSVRTX1BFUl9MT05HID09 IDMyCi0jIGRlZmluZSBfQ0hBU0hfTE9OR19TSElGVCA1Ci0jZWxpZiBCSVRTX1BFUl9MT05HID09 IDY0Ci0jIGRlZmluZSBfQ0hBU0hfTE9OR19TSElGVCA2Ci0jZWxzZQotIyBlcnJvciAiVW5leHBl Y3RlZCBCSVRTX1BFUl9MT05HIgotI2VuZGlmCi0KLXN0cnVjdCBfX2NoYXNoX3RhYmxlIHsKLQl1 OCBiaXRzOwotCXU4IGtleV9zaXplOwotCXVuc2lnbmVkIGludCB2YWx1ZV9zaXplOwotCXUzMiBz aXplX21hc2s7Ci0JdW5zaWduZWQgbG9uZyAqb2NjdXBfYml0bWFwLCAqdmFsaWRfYml0bWFwOwot CXVuaW9uIHsKLQkJdTMyICprZXlzMzI7Ci0JCXU2NCAqa2V5czY0OwotCX07Ci0JdTggKnZhbHVl czsKLQotI2lmZGVmIENPTkZJR19DSEFTSF9TVEFUUwotCXU2NCBoaXRzLCBoaXRzX3N0ZXBzLCBo aXRzX3RpbWVfbnM7Ci0JdTY0IG1pc3MsIG1pc3Nfc3RlcHMsIG1pc3NfdGltZV9uczsKLQl1NjQg cmVsb2NzLCByZWxvY19kaXN0OwotI2VuZGlmCi19OwotCi0jZGVmaW5lIF9fQ0hBU0hfQklUTUFQ X1NJWkUoYml0cykJCQkJXAotCSgoKDEgPDwgKGJpdHMpKSArIEJJVFNfUEVSX0xPTkcgLSAxKSAv IEJJVFNfUEVSX0xPTkcpCi0jZGVmaW5lIF9fQ0hBU0hfQVJSQVlfU0laRShiaXRzLCBzaXplKQkJ CQlcCi0JKCgoKHNpemUpIDw8IChiaXRzKSkgKyBzaXplb2YobG9uZykgLSAxKSAvIHNpemVvZihs b25nKSkKLQotI2RlZmluZSBfX0NIQVNIX0RBVEFfU0laRShiaXRzLCBrZXlfc2l6ZSwgdmFsdWVf c2l6ZSkJXAotCShfX0NIQVNIX0JJVE1BUF9TSVpFKGJpdHMpICogMiArCQlcCi0JIF9fQ0hBU0hf QVJSQVlfU0laRShiaXRzLCBrZXlfc2l6ZSkgKwkJXAotCSBfX0NIQVNIX0FSUkFZX1NJWkUoYml0 cywgdmFsdWVfc2l6ZSkpCi0KLSNkZWZpbmUgU1RSVUNUX0NIQVNIX1RBQkxFKGJpdHMsIGtleV9z aXplLCB2YWx1ZV9zaXplKQkJCVwKLQlzdHJ1Y3QgewkJCQkJCQlcCi0JCXN0cnVjdCBfX2NoYXNo X3RhYmxlIHRhYmxlOwkJCQlcCi0JCXVuc2lnbmVkIGxvbmcgZGF0YQkJCQkJXAotCQkJW19fQ0hB U0hfREFUQV9TSVpFKGJpdHMsIGtleV9zaXplLCB2YWx1ZV9zaXplKV07XAotCX0KLQotLyoqCi0g KiBzdHJ1Y3QgY2hhc2hfdGFibGUgLSBEeW5hbWljYWxseSBhbGxvY2F0ZWQgY2xvc2VkIGhhc2gg dGFibGUKLSAqCi0gKiBVc2UgdGhpcyBzdHJ1Y3QgZm9yIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBo YXNoIHRhYmxlcyAodXNpbmcKLSAqIGNoYXNoX3RhYmxlX2FsbG9jIGFuZCBjaGFzaF90YWJsZV9m cmVlKSwgd2hlcmUgdGhlIHNpemUgaXMKLSAqIGRldGVybWluZWQgYXQgcnVudGltZS4KLSAqLwot c3RydWN0IGNoYXNoX3RhYmxlIHsKLQlzdHJ1Y3QgX19jaGFzaF90YWJsZSB0YWJsZTsKLQl1bnNp Z25lZCBsb25nICpkYXRhOwotfTsKLQotLyoqCi0gKiBERUNMQVJFX0NIQVNIX1RBQkxFIC0gbWFj cm8gdG8gZGVjbGFyZSBhIGNsb3NlZCBoYXNoIHRhYmxlCi0gKiBAdGFibGU6IG5hbWUgb2YgdGhl IGRlY2xhcmVkIGhhc2ggdGFibGUKLSAqIEBidHM6IFRhYmxlIHNpemUgd2lsbCBiZSAyXmJpdHMg ZW50cmllcwotICogQGtleV9zejogU2l6ZSBvZiBoYXNoIGtleXMgaW4gYnl0ZXMsIDQgb3IgOAot ICogQHZhbF9zejogU2l6ZSBvZiBkYXRhIHZhbHVlcyBpbiBieXRlcywgY2FuIGJlIDAKLSAqCi0g KiBUaGlzIGRlY2xhcmVzIHRoZSBoYXNoIHRhYmxlIHZhcmlhYmxlIHdpdGggYSBzdGF0aWMgc2l6 ZS4KLSAqCi0gKiBUaGUgY2xvc2VkIGhhc2ggdGFibGUgc3RvcmVzIGtleS12YWx1ZSBwYWlycyB3 aXRoIGxvdyBtZW1vcnkgYW5kCi0gKiBsb29rdXAgb3ZlcmhlYWQuIEluIG9wZXJhdGlvbiBpdCBw ZXJmb3JtcyBubyBkeW5hbWljIG1lbW9yeQotICogbWFuYWdlbWVudC4gVGhlIGRhdGEgYmVpbmcg c3RvcmVkIGRvZXMgbm90IHJlcXVpcmUgYW55Ci0gKiBsaXN0X2hlYWRzLiBUaGUgaGFzaCB0YWJs ZSBwZXJmb3JtcyBiZXN0IHdpdGggc21hbGwgQHZhbF9zeiBhbmQgYXMKLSAqIGxvbmcgYXMgc29t ZSBzcGFjZSAoYWJvdXQgNTAlKSBpcyBsZWZ0IGZyZWUgaW4gdGhlIHRhYmxlLiBCdXQgdGhlCi0g KiB0YWJsZSBjYW4gc3RpbGwgd29yayByZWFzb25hYmx5IGVmZmljaWVudGx5IGV2ZW4gd2hlbiBm aWxsZWQgdXAgdG8KLSAqIGFib3V0IDkwJS4gSWYgYmlnZ2VyIGRhdGEgaXRlbXMgbmVlZCB0byBi ZSBzdG9yZWQgYW5kIGxvb2tlZCB1cCwKLSAqIHN0b3JlIHRoZSBwb2ludGVyIHRvIGl0IGFzIHZh bHVlIGluIHRoZSBoYXNoIHRhYmxlLgotICoKLSAqIEB2YWxfc3ogbWF5IGJlIDAuIFRoaXMgY2Fu IGJlIHVzZWZ1bCB3aGVuIGFsbCB0aGUgc3RvcmVkCi0gKiBpbmZvcm1hdGlvbiBpcyBjb250YWlu ZWQgaW4gdGhlIGtleSBpdHNlbGYgYW5kIHRoZSBmYWN0IHRoYXQgaXQgaXMKLSAqIGluIHRoZSBo YXNoIHRhYmxlIChvciBub3QpLgotICovCi0jZGVmaW5lIERFQ0xBUkVfQ0hBU0hfVEFCTEUodGFi bGUsIGJ0cywga2V5X3N6LCB2YWxfc3opCQlcCi0JU1RSVUNUX0NIQVNIX1RBQkxFKGJ0cywga2V5 X3N6LCB2YWxfc3opIHRhYmxlCi0KLSNpZmRlZiBDT05GSUdfQ0hBU0hfU1RBVFMKLSNkZWZpbmUg X19DSEFTSF9TVEFUU19JTklUKHByZWZpeCksCQlcCi0JCXByZWZpeC5oaXRzID0gMCwJCVwKLQkJ cHJlZml4LmhpdHNfc3RlcHMgPSAwLAkJXAotCQlwcmVmaXguaGl0c190aW1lX25zID0gMCwJXAot CQlwcmVmaXgubWlzcyA9IDAsCQlcCi0JCXByZWZpeC5taXNzX3N0ZXBzID0gMCwJCVwKLQkJcHJl Zml4Lm1pc3NfdGltZV9ucyA9IDAsCVwKLQkJcHJlZml4LnJlbG9jcyA9IDAsCQlcCi0JCXByZWZp eC5yZWxvY19kaXN0ID0gMAotI2Vsc2UKLSNkZWZpbmUgX19DSEFTSF9TVEFUU19JTklUKHByZWZp eCkKLSNlbmRpZgotCi0jZGVmaW5lIF9fQ0hBU0hfVEFCTEVfSU5JVChwcmVmaXgsIGRhdGEsIGJ0 cywga2V5X3N6LCB2YWxfc3opCVwKLQlwcmVmaXguYml0cyA9IChidHMpLAkJCQkJXAotCQlwcmVm aXgua2V5X3NpemUgPSAoa2V5X3N6KSwJCQlcCi0JCXByZWZpeC52YWx1ZV9zaXplID0gKHZhbF9z eiksCQkJXAotCQlwcmVmaXguc2l6ZV9tYXNrID0gKCgxIDw8IGJ0cykgLSAxKSwJCVwKLQkJcHJl Zml4Lm9jY3VwX2JpdG1hcCA9ICZkYXRhWzBdLAkJCVwKLQkJcHJlZml4LnZhbGlkX2JpdG1hcCA9 ICZkYXRhCQkJXAotCQkJW19fQ0hBU0hfQklUTUFQX1NJWkUoYnRzKV0sCQlcCi0JCXByZWZpeC5r ZXlzNjQgPSAodTY0ICopJmRhdGEJCQlcCi0JCQlbX19DSEFTSF9CSVRNQVBfU0laRShidHMpICog Ml0sCQlcCi0JCXByZWZpeC52YWx1ZXMgPSAodTggKikmZGF0YQkJCVwKLQkJCVtfX0NIQVNIX0JJ VE1BUF9TSVpFKGJ0cykgKiAyICsJCVwKLQkJCSBfX0NIQVNIX0FSUkFZX1NJWkUoYnRzLCBrZXlf c3opXQlcCi0JCV9fQ0hBU0hfU1RBVFNfSU5JVChwcmVmaXgpCi0KLS8qKgotICogREVGSU5FX0NI QVNIX1RBQkxFIC0gbWFjcm8gdG8gZGVmaW5lIGFuZCBpbml0aWFsaXplIGEgY2xvc2VkIGhhc2gg dGFibGUKLSAqIEB0Ymw6IG5hbWUgb2YgdGhlIGRlY2xhcmVkIGhhc2ggdGFibGUKLSAqIEBidHM6 IFRhYmxlIHNpemUgd2lsbCBiZSAyXmJpdHMgZW50cmllcwotICogQGtleV9zejogU2l6ZSBvZiBo YXNoIGtleXMgaW4gYnl0ZXMsIDQgb3IgOAotICogQHZhbF9zejogU2l6ZSBvZiBkYXRhIHZhbHVl cyBpbiBieXRlcywgY2FuIGJlIDAKLSAqCi0gKiBOb3RlOiB0aGUgbWFjcm8gY2FuIGJlIHVzZWQg Zm9yIGdsb2JhbCBhbmQgbG9jYWwgaGFzaCB0YWJsZSB2YXJpYWJsZXMuCi0gKi8KLSNkZWZpbmUg REVGSU5FX0NIQVNIX1RBQkxFKHRibCwgYnRzLCBrZXlfc3osIHZhbF9zeikJCQlcCi0JREVDTEFS RV9DSEFTSF9UQUJMRSh0YmwsIGJ0cywga2V5X3N6LCB2YWxfc3opID0gewkJXAotCQkudGFibGUg PSB7CQkJCQkJXAotCQkJX19DSEFTSF9UQUJMRV9JTklUKCwgKHRibCkuZGF0YSwgYnRzLCBrZXlf c3osIHZhbF9zeikgXAotCQl9LAkJCQkJCQlcCi0JCS5kYXRhID0gezB9CQkJCQkJXAotCX0KLQot LyoqCi0gKiBJTklUX0NIQVNIX1RBQkxFIC0gSW5pdGlhbGl6ZSBhIGhhc2ggdGFibGUgZGVjbGFy ZWQgYnkgREVDTEFSRV9DSEFTSF9UQUJMRQotICogQHRibDogbmFtZSBvZiB0aGUgZGVjbGFyZWQg aGFzaCB0YWJsZQotICogQGJ0czogVGFibGUgc2l6ZSB3aWxsIGJlIDJeYml0cyBlbnRyaWVzCi0g KiBAa2V5X3N6OiBTaXplIG9mIGhhc2gga2V5cyBpbiBieXRlcywgNCBvciA4Ci0gKiBAdmFsX3N6 OiBTaXplIG9mIGRhdGEgdmFsdWVzIGluIGJ5dGVzLCBjYW4gYmUgMAotICovCi0jZGVmaW5lIElO SVRfQ0hBU0hfVEFCTEUodGJsLCBidHMsIGtleV9zeiwgdmFsX3N6KQkJCVwKLQlfX0NIQVNIX1RB QkxFX0lOSVQoKCh0YmwpLnRhYmxlKSwgKHRibCkuZGF0YSwgYnRzLCBrZXlfc3osIHZhbF9zeikK LQotaW50IGNoYXNoX3RhYmxlX2FsbG9jKHN0cnVjdCBjaGFzaF90YWJsZSAqdGFibGUsIHU4IGJp dHMsIHU4IGtleV9zaXplLAotCQkgICAgICB1bnNpZ25lZCBpbnQgdmFsdWVfc2l6ZSwgZ2ZwX3Qg Z2ZwX21hc2spOwotdm9pZCBjaGFzaF90YWJsZV9mcmVlKHN0cnVjdCBjaGFzaF90YWJsZSAqdGFi bGUpOwotCi0vKioKLSAqIGNoYXNoX3RhYmxlX2R1bXBfc3RhdHMgLSBEdW1wIHN0YXRpc3RpY3Mg b2YgYSBjbG9zZWQgaGFzaCB0YWJsZQotICogQHRibDogUG9pbnRlciB0byB0aGUgdGFibGUgc3Ry dWN0dXJlCi0gKgotICogRHVtcHMgc29tZSBwZXJmb3JtYW5jZSBzdGF0aXN0aWNzIG9mIHRoZSB0 YWJsZSBnYXRoZXJlZCBpbiBvcGVyYXRpb24KLSAqIGluIHRoZSBrZXJuZWwgbG9nIHVzaW5nIHBy X2RlYnVnLiBJZiBDT05GSUdfRFlOQU1JQ19ERUJVRyBpcyBlbmFibGVkLAotICogdXNlciBtdXN0 IHR1cm4gb24gbWVzc2FnZXMgZm9yIGNoYXNoLmMgKGZpbGUgY2hhc2guYyArcCkuCi0gKi8KLSNp ZmRlZiBDT05GSUdfQ0hBU0hfU1RBVFMKLSNkZWZpbmUgY2hhc2hfdGFibGVfZHVtcF9zdGF0cyh0 YmwpIF9fY2hhc2hfdGFibGVfZHVtcF9zdGF0cygmKCp0YmwpLnRhYmxlKQotCi12b2lkIF9fY2hh c2hfdGFibGVfZHVtcF9zdGF0cyhzdHJ1Y3QgX19jaGFzaF90YWJsZSAqdGFibGUpOwotI2Vsc2UK LSNkZWZpbmUgY2hhc2hfdGFibGVfZHVtcF9zdGF0cyh0YmwpCi0jZW5kaWYKLQotLyoqCi0gKiBj aGFzaF90YWJsZV9yZXNldF9zdGF0cyAtIFJlc2V0IHN0YXRpc3RpY3Mgb2YgYSBjbG9zZWQgaGFz aCB0YWJsZQotICogQHRibDogUG9pbnRlciB0byB0aGUgdGFibGUgc3RydWN0dXJlCi0gKi8KLSNp ZmRlZiBDT05GSUdfQ0hBU0hfU1RBVFMKLSNkZWZpbmUgY2hhc2hfdGFibGVfcmVzZXRfc3RhdHMo dGJsKSBfX2NoYXNoX3RhYmxlX3Jlc2V0X3N0YXRzKCYoKnRibCkudGFibGUpCi0KLXN0YXRpYyBp bmxpbmUgdm9pZCBfX2NoYXNoX3RhYmxlX3Jlc2V0X3N0YXRzKHN0cnVjdCBfX2NoYXNoX3RhYmxl ICp0YWJsZSkKLXsKLQkodm9pZCl0YWJsZSBfX0NIQVNIX1NUQVRTX0lOSVQoKCp0YWJsZSkpOwot fQotI2Vsc2UKLSNkZWZpbmUgY2hhc2hfdGFibGVfcmVzZXRfc3RhdHModGJsKQotI2VuZGlmCi0K LS8qKgotICogY2hhc2hfdGFibGVfY29weV9pbiAtIENvcHkgYSBuZXcgdmFsdWUgaW50byB0aGUg aGFzaCB0YWJsZQotICogQHRibDogUG9pbnRlciB0byB0aGUgdGFibGUgc3RydWN0dXJlCi0gKiBA a2V5OiBLZXkgb2YgdGhlIGVudHJ5IHRvIGFkZCBvciB1cGRhdGUKLSAqIEB2YWx1ZTogUG9pbnRl ciB0byB2YWx1ZSB0byBjb3B5LCBtYXkgYmUgTlVMTAotICoKLSAqIElmIEBrZXkgYWxyZWFkeSBo YXMgYW4gZW50cnksIGl0cyB2YWx1ZSBpcyByZXBsYWNlZC4gT3RoZXJ3aXNlIGEKLSAqIG5ldyBl bnRyeSBpcyBhZGRlZC4gSWYgQHZhbHVlIGlzIE5VTEwsIHRoZSB2YWx1ZSBpcyBsZWZ0IHVuY2hh bmdlZAotICogb3IgdW5pbml0aWFsaXplZC4gUmV0dXJucyAxIGlmIGFuIGVudHJ5IGFscmVhZHkg ZXhpc3RlZCwgMCBpZiBhIG5ldwotICogZW50cnkgd2FzIGFkZGVkIG9yICUtRU5PTUVNIGlmIHRo ZXJlIHdhcyBubyBmcmVlIHNwYWNlIGluIHRoZQotICogdGFibGUuCi0gKi8KLSNkZWZpbmUgY2hh c2hfdGFibGVfY29weV9pbih0YmwsIGtleSwgdmFsdWUpCQkJXAotCV9fY2hhc2hfdGFibGVfY29w eV9pbigmKCp0YmwpLnRhYmxlLCBrZXksIHZhbHVlKQotCi1pbnQgX19jaGFzaF90YWJsZV9jb3B5 X2luKHN0cnVjdCBfX2NoYXNoX3RhYmxlICp0YWJsZSwgdTY0IGtleSwKLQkJCSAgY29uc3Qgdm9p ZCAqdmFsdWUpOwotCi0vKioKLSAqIGNoYXNoX3RhYmxlX2NvcHlfb3V0IC0gQ29weSBhIHZhbHVl IG91dCBvZiB0aGUgaGFzaCB0YWJsZQotICogQHRibDogUG9pbnRlciB0byB0aGUgdGFibGUgc3Ry dWN0dXJlCi0gKiBAa2V5OiBLZXkgb2YgdGhlIGVudHJ5IHRvIGZpbmQKLSAqIEB2YWx1ZTogUG9p bnRlciB0byB2YWx1ZSB0byBjb3B5LCBtYXkgYmUgTlVMTAotICoKLSAqIElmIEB2YWx1ZSBpcyBu b3QgTlVMTCBhbmQgdGhlIHRhYmxlIGhhcyBhIG5vbi0wIHZhbHVlX3NpemUsIHRoZQotICogdmFs dWUgYXQgQGtleSBpcyBjb3BpZWQgdG8gQHZhbHVlLiBSZXR1cm5zIHRoZSBzbG90IGluZGV4IG9m IHRoZQotICogZW50cnkgb3IgJS1FSU5WQUwgaWYgQGtleSB3YXMgbm90IGZvdW5kLgotICovCi0j ZGVmaW5lIGNoYXNoX3RhYmxlX2NvcHlfb3V0KHRibCwga2V5LCB2YWx1ZSkJCQlcCi0JX19jaGFz aF90YWJsZV9jb3B5X291dCgmKCp0YmwpLnRhYmxlLCBrZXksIHZhbHVlLCBmYWxzZSkKLQotaW50 IF9fY2hhc2hfdGFibGVfY29weV9vdXQoc3RydWN0IF9fY2hhc2hfdGFibGUgKnRhYmxlLCB1NjQg a2V5LAotCQkJICAgdm9pZCAqdmFsdWUsIGJvb2wgcmVtb3ZlKTsKLQotLyoqCi0gKiBjaGFzaF90 YWJsZV9yZW1vdmUgLSBSZW1vdmUgYW4gZW50cnkgZnJvbSB0aGUgaGFzaCB0YWJsZQotICogQHRi bDogUG9pbnRlciB0byB0aGUgdGFibGUgc3RydWN0dXJlCi0gKiBAa2V5OiBLZXkgb2YgdGhlIGVu dHJ5IHRvIGZpbmQKLSAqIEB2YWx1ZTogUG9pbnRlciB0byB2YWx1ZSB0byBjb3B5LCBtYXkgYmUg TlVMTAotICoKLSAqIElmIEB2YWx1ZSBpcyBub3QgTlVMTCBhbmQgdGhlIHRhYmxlIGhhcyBhIG5v bi0wIHZhbHVlX3NpemUsIHRoZQotICogdmFsdWUgYXQgQGtleSBpcyBjb3BpZWQgdG8gQHZhbHVl LiBUaGUgZW50cnkgaXMgcmVtb3ZlZCBmcm9tIHRoZQotICogdGFibGUuIFJldHVybnMgdGhlIHNs b3QgaW5kZXggb2YgdGhlIHJlbW92ZWQgZW50cnkgb3IgJS1FSU5WQUwgaWYKLSAqIEBrZXkgd2Fz IG5vdCBmb3VuZC4KLSAqLwotI2RlZmluZSBjaGFzaF90YWJsZV9yZW1vdmUodGJsLCBrZXksIHZh bHVlKQkJCVwKLQlfX2NoYXNoX3RhYmxlX2NvcHlfb3V0KCYoKnRibCkudGFibGUsIGtleSwgdmFs dWUsIHRydWUpCi0KLS8qCi0gKiBMb3cgbGV2ZWwgaXRlcmF0b3IgQVBJIHVzZWQgaW50ZXJuYWxs eSBieSB0aGUgYWJvdmUgZnVuY3Rpb25zLgotICovCi1zdHJ1Y3QgY2hhc2hfaXRlciB7Ci0Jc3Ry dWN0IF9fY2hhc2hfdGFibGUgKnRhYmxlOwotCXVuc2lnbmVkIGxvbmcgbWFzazsKLQlpbnQgc2xv dDsKLX07Ci0KLS8qKgotICogQ0hBU0hfSVRFUl9JTklUIC0gSW5pdGlhbGl6ZSBhIGhhc2ggdGFi bGUgaXRlcmF0b3IKLSAqIEB0Ymw6IFBvaW50ZXIgdG8gaGFzaCB0YWJsZSB0byBpdGVyYXRlIG92 ZXIKLSAqIEBzOiBJbml0aWFsIHNsb3QgbnVtYmVyCi0gKi8KLSNkZWZpbmUgQ0hBU0hfSVRFUl9J TklUKHRhYmxlLCBzKSB7CQkJXAotCQl0YWJsZSwJCQkJCVwKLQkJMVVMIDw8ICgocykgJiAoQklU U19QRVJfTE9ORyAtIDEpKSwJXAotCQlzCQkJCQlcCi0JfQotLyoqCi0gKiBDSEFTSF9JVEVSX1NF VCAtIFNldCBoYXNoIHRhYmxlIGl0ZXJhdG9yIHRvIG5ldyBzbG90Ci0gKiBAaXRlcjogSXRlcmF0 b3IKLSAqIEBzOiBTbG90IG51bWJlcgotICovCi0jZGVmaW5lIENIQVNIX0lURVJfU0VUKGl0ZXIs IHMpCQkJCQlcCi0JKGl0ZXIpLm1hc2sgPSAxVUwgPDwgKChzKSAmIChCSVRTX1BFUl9MT05HIC0g MSkpLAlcCi0JKGl0ZXIpLnNsb3QgPSAocykKLS8qKgotICogQ0hBU0hfSVRFUl9JTkMgLSBJbmNy ZW1lbnQgaGFzaCB0YWJsZSBpdGVyYXRvcgotICogQHRhYmxlOiBIYXNoIHRhYmxlIHRvIGl0ZXJh dGUgb3ZlcgotICoKLSAqIFdyYXBzIGFyb3VuZCBhdCB0aGUgZW5kLgotICovCi0jZGVmaW5lIENI QVNIX0lURVJfSU5DKGl0ZXIpIGRvIHsJCQkJCVwKLQkJKGl0ZXIpLm1hc2sgPSAoaXRlcikubWFz ayA8PCAxIHwJCQlcCi0JCQkoaXRlcikubWFzayA+PiAoQklUU19QRVJfTE9ORyAtIDEpOwkJXAot CQkoaXRlcikuc2xvdCA9ICgoaXRlcikuc2xvdCArIDEpICYgKGl0ZXIpLnRhYmxlLT5zaXplX21h c2s7IFwKLQl9IHdoaWxlICgwKQotCi1zdGF0aWMgaW5saW5lIGJvb2wgY2hhc2hfaXRlcl9pc192 YWxpZChjb25zdCBzdHJ1Y3QgY2hhc2hfaXRlciBpdGVyKQotewotCUJVR19PTigodW5zaWduZWQp aXRlci5zbG90ID49ICgxIDw8IGl0ZXIudGFibGUtPmJpdHMpKTsKLQlyZXR1cm4gISEoaXRlci50 YWJsZS0+dmFsaWRfYml0bWFwW2l0ZXIuc2xvdCA+PiBfQ0hBU0hfTE9OR19TSElGVF0gJgotCQkg IGl0ZXIubWFzayk7Ci19Ci1zdGF0aWMgaW5saW5lIGJvb2wgY2hhc2hfaXRlcl9pc19lbXB0eShj b25zdCBzdHJ1Y3QgY2hhc2hfaXRlciBpdGVyKQotewotCUJVR19PTigodW5zaWduZWQpaXRlci5z bG90ID49ICgxIDw8IGl0ZXIudGFibGUtPmJpdHMpKTsKLQlyZXR1cm4gIShpdGVyLnRhYmxlLT5v Y2N1cF9iaXRtYXBbaXRlci5zbG90ID4+IF9DSEFTSF9MT05HX1NISUZUXSAmCi0JCSBpdGVyLm1h c2spOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgY2hhc2hfaXRlcl9zZXRfdmFsaWQoY29uc3Qg c3RydWN0IGNoYXNoX2l0ZXIgaXRlcikKLXsKLQlCVUdfT04oKHVuc2lnbmVkKWl0ZXIuc2xvdCA+ PSAoMSA8PCBpdGVyLnRhYmxlLT5iaXRzKSk7Ci0JaXRlci50YWJsZS0+dmFsaWRfYml0bWFwW2l0 ZXIuc2xvdCA+PiBfQ0hBU0hfTE9OR19TSElGVF0gfD0gaXRlci5tYXNrOwotCWl0ZXIudGFibGUt Pm9jY3VwX2JpdG1hcFtpdGVyLnNsb3QgPj4gX0NIQVNIX0xPTkdfU0hJRlRdIHw9IGl0ZXIubWFz azsKLX0KLXN0YXRpYyBpbmxpbmUgdm9pZCBjaGFzaF9pdGVyX3NldF9pbnZhbGlkKGNvbnN0IHN0 cnVjdCBjaGFzaF9pdGVyIGl0ZXIpCi17Ci0JQlVHX09OKCh1bnNpZ25lZClpdGVyLnNsb3QgPj0g KDEgPDwgaXRlci50YWJsZS0+Yml0cykpOwotCWl0ZXIudGFibGUtPnZhbGlkX2JpdG1hcFtpdGVy LnNsb3QgPj4gX0NIQVNIX0xPTkdfU0hJRlRdICY9IH5pdGVyLm1hc2s7Ci19Ci1zdGF0aWMgaW5s aW5lIHZvaWQgY2hhc2hfaXRlcl9zZXRfZW1wdHkoY29uc3Qgc3RydWN0IGNoYXNoX2l0ZXIgaXRl cikKLXsKLQlCVUdfT04oKHVuc2lnbmVkKWl0ZXIuc2xvdCA+PSAoMSA8PCBpdGVyLnRhYmxlLT5i aXRzKSk7Ci0JaXRlci50YWJsZS0+b2NjdXBfYml0bWFwW2l0ZXIuc2xvdCA+PiBfQ0hBU0hfTE9O R19TSElGVF0gJj0gfml0ZXIubWFzazsKLX0KLQotc3RhdGljIGlubGluZSB1MzIgY2hhc2hfaXRl cl9rZXkzMihjb25zdCBzdHJ1Y3QgY2hhc2hfaXRlciBpdGVyKQotewotCUJVR19PTihpdGVyLnRh YmxlLT5rZXlfc2l6ZSAhPSA0KTsKLQlCVUdfT04oKHVuc2lnbmVkKWl0ZXIuc2xvdCA+PSAoMSA8 PCBpdGVyLnRhYmxlLT5iaXRzKSk7Ci0JcmV0dXJuIGl0ZXIudGFibGUtPmtleXMzMltpdGVyLnNs b3RdOwotfQotc3RhdGljIGlubGluZSB1NjQgY2hhc2hfaXRlcl9rZXk2NChjb25zdCBzdHJ1Y3Qg Y2hhc2hfaXRlciBpdGVyKQotewotCUJVR19PTihpdGVyLnRhYmxlLT5rZXlfc2l6ZSAhPSA4KTsK LQlCVUdfT04oKHVuc2lnbmVkKWl0ZXIuc2xvdCA+PSAoMSA8PCBpdGVyLnRhYmxlLT5iaXRzKSk7 Ci0JcmV0dXJuIGl0ZXIudGFibGUtPmtleXM2NFtpdGVyLnNsb3RdOwotfQotc3RhdGljIGlubGlu ZSB1NjQgY2hhc2hfaXRlcl9rZXkoY29uc3Qgc3RydWN0IGNoYXNoX2l0ZXIgaXRlcikKLXsKLQlC VUdfT04oKHVuc2lnbmVkKWl0ZXIuc2xvdCA+PSAoMSA8PCBpdGVyLnRhYmxlLT5iaXRzKSk7Ci0J cmV0dXJuIChpdGVyLnRhYmxlLT5rZXlfc2l6ZSA9PSA0KSA/Ci0JCWl0ZXIudGFibGUtPmtleXMz MltpdGVyLnNsb3RdIDogaXRlci50YWJsZS0+a2V5czY0W2l0ZXIuc2xvdF07Ci19Ci0KLXN0YXRp YyBpbmxpbmUgdTMyIGNoYXNoX2l0ZXJfaGFzaDMyKGNvbnN0IHN0cnVjdCBjaGFzaF9pdGVyIGl0 ZXIpCi17Ci0JQlVHX09OKGl0ZXIudGFibGUtPmtleV9zaXplICE9IDQpOwotCXJldHVybiBoYXNo XzMyKGNoYXNoX2l0ZXJfa2V5MzIoaXRlciksIGl0ZXIudGFibGUtPmJpdHMpOwotfQotCi1zdGF0 aWMgaW5saW5lIHUzMiBjaGFzaF9pdGVyX2hhc2g2NChjb25zdCBzdHJ1Y3QgY2hhc2hfaXRlciBp dGVyKQotewotCUJVR19PTihpdGVyLnRhYmxlLT5rZXlfc2l6ZSAhPSA4KTsKLQlyZXR1cm4gaGFz aF82NChjaGFzaF9pdGVyX2tleTY0KGl0ZXIpLCBpdGVyLnRhYmxlLT5iaXRzKTsKLX0KLQotc3Rh dGljIGlubGluZSB1MzIgY2hhc2hfaXRlcl9oYXNoKGNvbnN0IHN0cnVjdCBjaGFzaF9pdGVyIGl0 ZXIpCi17Ci0JcmV0dXJuIChpdGVyLnRhYmxlLT5rZXlfc2l6ZSA9PSA0KSA/Ci0JCWhhc2hfMzIo Y2hhc2hfaXRlcl9rZXkzMihpdGVyKSwgaXRlci50YWJsZS0+Yml0cykgOgotCQloYXNoXzY0KGNo YXNoX2l0ZXJfa2V5NjQoaXRlciksIGl0ZXIudGFibGUtPmJpdHMpOwotfQotCi1zdGF0aWMgaW5s aW5lIHZvaWQgKmNoYXNoX2l0ZXJfdmFsdWUoY29uc3Qgc3RydWN0IGNoYXNoX2l0ZXIgaXRlcikK LXsKLQlCVUdfT04oKHVuc2lnbmVkKWl0ZXIuc2xvdCA+PSAoMSA8PCBpdGVyLnRhYmxlLT5iaXRz KSk7Ci0JcmV0dXJuIGl0ZXIudGFibGUtPnZhbHVlcyArCi0JCSgodW5zaWduZWQgbG9uZylpdGVy LnNsb3QgKiBpdGVyLnRhYmxlLT52YWx1ZV9zaXplKTsKLX0KLQotI2VuZGlmIC8qIF9MSU5VWF9D SEFTSF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vYW1kL2xpYi9LY29uZmlnIGIv ZHJpdmVycy9ncHUvZHJtL2FtZC9saWIvS2NvbmZpZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQK aW5kZXggNzc2ZWYzNDM0YzEwLi4wMDAwMDAwMDAwMDAKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2Ft ZC9saWIvS2NvbmZpZworKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLW1lbnUgIkFNRCBM aWJyYXJ5IHJvdXRpbmVzIgotCi0jCi0jIENsb3NlZCBoYXNoIHRhYmxlCi0jCi1jb25maWcgQ0hB U0gKLQl0cmlzdGF0ZQotCWRlZmF1bHQgRFJNX0FNREdQVQotCWhlbHAKLQkgU3RhdGljYWxseSBz aXplZCBjbG9zZWQgaGFzaCB0YWJsZSBpbXBsZW1lbnRhdGlvbiB3aXRoIGxvdwotCSBtZW1vcnkg YW5kIENQVSBvdmVyaGVhZC4KLQotY29uZmlnIENIQVNIX1NUQVRTCi0JYm9vbCAiQ2xvc2VkIGhh c2ggdGFibGUgcGVyZm9ybWFuY2Ugc3RhdGlzdGljcyIKLQlkZXBlbmRzIG9uIENIQVNICi0JZGVm YXVsdCBuCi0JaGVscAotCSBFbmFibGUgY29sbGVjdGlvbiBvZiBwZXJmb3JtYW5jZSBzdGF0aXN0 aWNzIGZvciBjbG9zZWQgaGFzaCB0YWJsZXMuCi0KLWNvbmZpZyBDSEFTSF9TRUxGVEVTVAotCWJv b2wgIkNsb3NlZCBoYXNoIHRhYmxlIHNlbGYgdGVzdCIKLQlkZXBlbmRzIG9uIENIQVNICi0JZGVm YXVsdCBuCi0JaGVscAotCSBSdW5zIGEgc2VsZnRlc3QgZHVyaW5nIG1vZHVsZSBsb2FkLiBTZXZl cmFsIG1vZHVsZSBwYXJhbWV0ZXJzCi0JIGFyZSBhdmFpbGFibGUgdG8gbW9kaWZ5IHRoZSBiZWhh dmlvdXIgb2YgdGhlIHRlc3QuCi0KLWVuZG1lbnUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2Ry bS9hbWQvbGliL01ha2VmaWxlIGIvZHJpdmVycy9ncHUvZHJtL2FtZC9saWIvTWFrZWZpbGUKZGVs ZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5MDI0MzAwMWUxYS4uMDAwMDAwMDAwMDAwCi0t LSBhL2RyaXZlcnMvZ3B1L2RybS9hbWQvbGliL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEs MzIgKzAsMCBAQAotIwotIyBDb3B5cmlnaHQgMjAxNyBBZHZhbmNlZCBNaWNybyBEZXZpY2VzLCBJ bmMuCi0jCi0jIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0 byBhbnkgcGVyc29uIG9idGFpbmluZyBhCi0jIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNz b2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCi0jIHRvIGRlYWwg aW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxp bWl0YXRpb24KLSMgdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxp c2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCi0jIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUg U29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQotIyBTb2Z0d2FyZSBp cyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25z OgotIwotIyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5v dGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgotIyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBv cnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KLSMKLSMgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJB UyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKLSMgSU1QTElF RCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFO VEFCSUxJVFksCi0jIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZS SU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAotIyBUSEUgQ09QWVJJR0hUIEhPTERFUihTKSBP UiBBVVRIT1IoUykgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKLSMgT1RIRVIg TElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhF UldJU0UsCi0jIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUg U09GVFdBUkUgT1IgVEhFIFVTRSBPUgotIyBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUu Ci0jCi0jCi0jIE1ha2VmaWxlIGZvciBBTUQgbGlicmFyeSByb3V0aW5lcywgd2hpY2ggYXJlIHVz ZWQgYnkgQU1EIGRyaXZlcgotIyBjb21wb25lbnRzLgotIwotIyBUaGlzIGlzIGZvciBjb21tb24g bGlicmFyeSByb3V0aW5lcyB0aGF0IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBBTUQKLSMgZHJpdmVy IGNvbXBvbmVudHMgb3IgbGF0ZXIgbW92ZWQgdG8ga2VybmVsL2xpYiBmb3Igc2hhcmluZyB3aXRo Ci0jIG90aGVyIGRyaXZlcnMuCi0KLWNjZmxhZ3MteSA6PSAtSSQoc3JjKS8uLi9pbmNsdWRlCi0K LW9iai0kKENPTkZJR19DSEFTSCkgKz0gY2hhc2gubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUv ZHJtL2FtZC9saWIvY2hhc2guYyBiL2RyaXZlcnMvZ3B1L2RybS9hbWQvbGliL2NoYXNoLmMKZGVs ZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4ZTQ1ZjM1NmExYy4uMDAwMDAwMDAwMDAwCi0t LSBhL2RyaXZlcnMvZ3B1L2RybS9hbWQvbGliL2NoYXNoLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2 MzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEFkdmFuY2VkIE1pY3JvIERldmljZXMs IEluYy4KLSAqCi0gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJn ZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQotICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFu ZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKLSAqIHRv IGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRo b3V0IGxpbWl0YXRpb24KLSAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdl LCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAotICogYW5kL29yIHNlbGwgY29waWVz IG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCi0gKiBT b2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBj b25kaXRpb25zOgotICoKLSAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBl cm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCi0gKiBhbGwgY29waWVzIG9yIHN1 YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KLSAqCi0gKiBUSEUgU09GVFdBUkUg SVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVT UyBPUgotICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFO VElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVS UE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKLSAqIFRIRSBDT1BZ UklHSFQgSE9MREVSKFMpIE9SIEFVVEhPUihTKSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFN QUdFUyBPUgotICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05U UkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCi0gKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBD T05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKLSAqIE9USEVSIERFQUxJ TkdTIElOIFRIRSBTT0ZUV0FSRS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+ Ci0jaW5jbHVkZSA8bGludXgvaGFzaC5oPgotI2luY2x1ZGUgPGxpbnV4L2J1Zy5oPgotI2luY2x1 ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxs aW51eC9zY2hlZC9jbG9jay5oPgotI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgotI2luY2x1ZGUgPGxp bnV4L2NoYXNoLmg+Ci0KLS8qKgotICogY2hhc2hfdGFibGVfYWxsb2MgLSBBbGxvY2F0ZSBjbG9z ZWQgaGFzaCB0YWJsZQotICogQHRhYmxlOiBQb2ludGVyIHRvIHRoZSB0YWJsZSBzdHJ1Y3R1cmUK LSAqIEBiaXRzOiBUYWJsZSBzaXplIHdpbGwgYmUgMl5iaXRzIGVudHJpZXMKLSAqIEBrZXlfc2l6 ZTogU2l6ZSBvZiBoYXNoIGtleXMgaW4gYnl0ZXMsIDQgb3IgOAotICogQHZhbHVlX3NpemU6IFNp emUgb2YgZGF0YSB2YWx1ZXMgaW4gYnl0ZXMsIGNhbiBiZSAwCi0gKi8KLWludCBjaGFzaF90YWJs ZV9hbGxvYyhzdHJ1Y3QgY2hhc2hfdGFibGUgKnRhYmxlLCB1OCBiaXRzLCB1OCBrZXlfc2l6ZSwK LQkJICAgICAgdW5zaWduZWQgaW50IHZhbHVlX3NpemUsIGdmcF90IGdmcF9tYXNrKQotewotCWlm IChiaXRzID4gMzEpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKGtleV9zaXplICE9IDQgJiYg a2V5X3NpemUgIT0gOCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQl0YWJsZS0+ZGF0YSA9IGtjYWxs b2MoX19DSEFTSF9EQVRBX1NJWkUoYml0cywga2V5X3NpemUsIHZhbHVlX3NpemUpLAotCQkgICAg ICAgc2l6ZW9mKGxvbmcpLCBnZnBfbWFzayk7Ci0JaWYgKCF0YWJsZS0+ZGF0YSkKLQkJcmV0dXJu IC1FTk9NRU07Ci0KLQlfX0NIQVNIX1RBQkxFX0lOSVQodGFibGUtPnRhYmxlLCB0YWJsZS0+ZGF0 YSwKLQkJCSAgIGJpdHMsIGtleV9zaXplLCB2YWx1ZV9zaXplKTsKLQotCXJldHVybiAwOwotfQot RVhQT1JUX1NZTUJPTChjaGFzaF90YWJsZV9hbGxvYyk7Ci0KLS8qKgotICogY2hhc2hfdGFibGVf ZnJlZSAtIEZyZWUgY2xvc2VkIGhhc2ggdGFibGUKLSAqIEB0YWJsZTogUG9pbnRlciB0byB0aGUg dGFibGUgc3RydWN0dXJlCi0gKi8KLXZvaWQgY2hhc2hfdGFibGVfZnJlZShzdHJ1Y3QgY2hhc2hf dGFibGUgKnRhYmxlKQotewotCWtmcmVlKHRhYmxlLT5kYXRhKTsKLX0KLUVYUE9SVF9TWU1CT0wo Y2hhc2hfdGFibGVfZnJlZSk7Ci0KLSNpZmRlZiBDT05GSUdfQ0hBU0hfU1RBVFMKLQotI2RlZmlu ZSBESVZfRlJBQyhub20sIGRlbm9tLCBxdW90LCBmcmFjLCBmcmFjX2RpZ2l0cykgZG8gewkJXAot CQl1NjQgX19ub20gPSAobm9tKTsJCQkJCVwKLQkJdTY0IF9fZGVub20gPSAoZGVub20pOwkJCQkJ XAotCQl1NjQgX19xdW90LCBfX2ZyYWM7CQkJCQlcCi0JCXUzMiBfX3JlbTsJCQkJCQlcCi0JCQkJ CQkJCQlcCi0JCXdoaWxlIChfX2Rlbm9tID4+IDMyKSB7CQkJCQlcCi0JCQlfX25vbSAgID4+PSAx OwkJCQkJXAotCQkJX19kZW5vbSA+Pj0gMTsJCQkJCVwKLQkJfQkJCQkJCQlcCi0JCV9fcXVvdCA9 IF9fbm9tOwkJCQkJCVwKLQkJX19yZW0gID0gZG9fZGl2KF9fcXVvdCwgX19kZW5vbSk7CQkJXAot CQlfX2ZyYWMgPSBfX3JlbSAqIChmcmFjX2RpZ2l0cykgKyAoX19kZW5vbSA+PiAxKTsJXAotCQlk b19kaXYoX19mcmFjLCBfX2Rlbm9tKTsJCQkJXAotCQkocXVvdCkgPSBfX3F1b3Q7CQkJCQlcCi0J CShmcmFjKSA9IF9fZnJhYzsJCQkJCVwKLQl9IHdoaWxlICgwKQotCi12b2lkIF9fY2hhc2hfdGFi bGVfZHVtcF9zdGF0cyhzdHJ1Y3QgX19jaGFzaF90YWJsZSAqdGFibGUpCi17Ci0Jc3RydWN0IGNo YXNoX2l0ZXIgaXRlciA9IENIQVNIX0lURVJfSU5JVCh0YWJsZSwgMCk7Ci0JdTMyIGZpbGxlZCA9 IDAsIGVtcHR5ID0gMCwgdG9tYnN0b25lcyA9IDA7Ci0JdTY0IHF1b3QxLCBxdW90MjsKLQl1MzIg ZnJhYzEsIGZyYWMyOwotCi0JZG8gewotCQlpZiAoY2hhc2hfaXRlcl9pc192YWxpZChpdGVyKSkK LQkJCWZpbGxlZCsrOwotCQllbHNlIGlmIChjaGFzaF9pdGVyX2lzX2VtcHR5KGl0ZXIpKQotCQkJ ZW1wdHkrKzsKLQkJZWxzZQotCQkJdG9tYnN0b25lcysrOwotCQlDSEFTSF9JVEVSX0lOQyhpdGVy KTsKLQl9IHdoaWxlIChpdGVyLnNsb3QpOwotCi0JcHJfZGVidWcoImNoYXNoOiBrZXkgc2l6ZSAl dSwgdmFsdWUgc2l6ZSAldVxuIiwKLQkJIHRhYmxlLT5rZXlfc2l6ZSwgdGFibGUtPnZhbHVlX3Np emUpOwotCXByX2RlYnVnKCIgIFNsb3RzIHRvdGFsL2ZpbGxlZC9lbXB0eS90b21ic3RvbmVzOiAl dSAvICV1IC8gJXUgLyAldVxuIiwKLQkJIDEgPDwgdGFibGUtPmJpdHMsIGZpbGxlZCwgZW1wdHks IHRvbWJzdG9uZXMpOwotCWlmICh0YWJsZS0+aGl0cyA+IDApIHsKLQkJRElWX0ZSQUModGFibGUt PmhpdHNfc3RlcHMsIHRhYmxlLT5oaXRzLCBxdW90MSwgZnJhYzEsIDEwMDApOwotCQlESVZfRlJB Qyh0YWJsZS0+aGl0cyAqIDEwMDAsIHRhYmxlLT5oaXRzX3RpbWVfbnMsCi0JCQkgcXVvdDIsIGZy YWMyLCAxMDAwKTsKLQl9IGVsc2UgewotCQlxdW90MSA9IHF1b3QyID0gMDsKLQkJZnJhYzEgPSBm cmFjMiA9IDA7Ci0JfQotCXByX2RlYnVnKCIgIEhpdHMgICAoYXZnLmNvc3QsIHJhdGUpOiAlbGx1 ICglbGx1LiUwM3UsICVsbHUuJTAzdSBNL3MpXG4iLAotCQkgdGFibGUtPmhpdHMsIHF1b3QxLCBm cmFjMSwgcXVvdDIsIGZyYWMyKTsKLQlpZiAodGFibGUtPm1pc3MgPiAwKSB7Ci0JCURJVl9GUkFD KHRhYmxlLT5taXNzX3N0ZXBzLCB0YWJsZS0+bWlzcywgcXVvdDEsIGZyYWMxLCAxMDAwKTsKLQkJ RElWX0ZSQUModGFibGUtPm1pc3MgKiAxMDAwLCB0YWJsZS0+bWlzc190aW1lX25zLAotCQkJIHF1 b3QyLCBmcmFjMiwgMTAwMCk7Ci0JfSBlbHNlIHsKLQkJcXVvdDEgPSBxdW90MiA9IDA7Ci0JCWZy YWMxID0gZnJhYzIgPSAwOwotCX0KLQlwcl9kZWJ1ZygiICBNaXNzZXMgKGF2Zy5jb3N0LCByYXRl KTogJWxsdSAoJWxsdS4lMDN1LCAlbGx1LiUwM3UgTS9zKVxuIiwKLQkJIHRhYmxlLT5taXNzLCBx dW90MSwgZnJhYzEsIHF1b3QyLCBmcmFjMik7Ci0JaWYgKHRhYmxlLT5oaXRzICsgdGFibGUtPm1p c3MgPiAwKSB7Ci0JCURJVl9GUkFDKHRhYmxlLT5oaXRzX3N0ZXBzICsgdGFibGUtPm1pc3Nfc3Rl cHMsCi0JCQkgdGFibGUtPmhpdHMgKyB0YWJsZS0+bWlzcywgcXVvdDEsIGZyYWMxLCAxMDAwKTsK LQkJRElWX0ZSQUMoKHRhYmxlLT5oaXRzICsgdGFibGUtPm1pc3MpICogMTAwMCwKLQkJCSAodGFi bGUtPmhpdHNfdGltZV9ucyArIHRhYmxlLT5taXNzX3RpbWVfbnMpLAotCQkJIHF1b3QyLCBmcmFj MiwgMTAwMCk7Ci0JfSBlbHNlIHsKLQkJcXVvdDEgPSBxdW90MiA9IDA7Ci0JCWZyYWMxID0gZnJh YzIgPSAwOwotCX0KLQlwcl9kZWJ1ZygiICBUb3RhbCAgKGF2Zy5jb3N0LCByYXRlKTogJWxsdSAo JWxsdS4lMDN1LCAlbGx1LiUwM3UgTS9zKVxuIiwKLQkJIHRhYmxlLT5oaXRzICsgdGFibGUtPm1p c3MsIHF1b3QxLCBmcmFjMSwgcXVvdDIsIGZyYWMyKTsKLQlpZiAodGFibGUtPnJlbG9jcyA+IDAp IHsKLQkJRElWX0ZSQUModGFibGUtPmhpdHMgKyB0YWJsZS0+bWlzcywgdGFibGUtPnJlbG9jcywK LQkJCSBxdW90MSwgZnJhYzEsIDEwMDApOwotCQlESVZfRlJBQyh0YWJsZS0+cmVsb2NfZGlzdCwg dGFibGUtPnJlbG9jcywgcXVvdDIsIGZyYWMyLCAxMDAwKTsKLQkJcHJfZGVidWcoIiAgUmVsb2Nh dGlvbnMgKGZyZXEsIGF2Zy5kaXN0KTogJWxsdSAoMTolbGx1LiUwM3UsICVsbHUuJTAzdSlcbiIs Ci0JCQkgdGFibGUtPnJlbG9jcywgcXVvdDEsIGZyYWMxLCBxdW90MiwgZnJhYzIpOwotCX0gZWxz ZSB7Ci0JCXByX2RlYnVnKCIgIE5vIHJlbG9jYXRpb25zXG4iKTsKLQl9Ci19Ci1FWFBPUlRfU1lN Qk9MKF9fY2hhc2hfdGFibGVfZHVtcF9zdGF0cyk7Ci0KLSN1bmRlZiBESVZfRlJBQwotI2VuZGlm Ci0KLSNkZWZpbmUgQ0hBU0hfSU5DKHRhYmxlLCBhKSAoKGEpID0gKChhKSArIDEpICYgKHRhYmxl KS0+c2l6ZV9tYXNrKQotI2RlZmluZSBDSEFTSF9BREQodGFibGUsIGEsIGIpICgoKGEpICsgKGIp KSAmICh0YWJsZSktPnNpemVfbWFzaykKLSNkZWZpbmUgQ0hBU0hfU1VCKHRhYmxlLCBhLCBiKSAo KChhKSAtIChiKSkgJiAodGFibGUpLT5zaXplX21hc2spCi0jZGVmaW5lIENIQVNIX0lOX1JBTkdF KHRhYmxlLCBzbG90LCBmaXJzdCwgbGFzdCkgXAotCShDSEFTSF9TVUIodGFibGUsIHNsb3QsIGZp cnN0KSA8PSBDSEFTSF9TVUIodGFibGUsIGxhc3QsIGZpcnN0KSkKLQotLyojZGVmaW5lIENIQVNI X0RFQlVHIFVuY29tbWVudCB0aGlzIHRvIGVuYWJsZSB2ZXJib3NlIGRlYnVnIG91dHB1dCovCi0j aWZkZWYgQ0hBU0hfREVCVUcKLXN0YXRpYyB2b2lkIGNoYXNoX3RhYmxlX2R1bXAoc3RydWN0IF9f Y2hhc2hfdGFibGUgKnRhYmxlKQotewotCXN0cnVjdCBjaGFzaF9pdGVyIGl0ZXIgPSBDSEFTSF9J VEVSX0lOSVQodGFibGUsIDApOwotCi0JZG8gewotCQlpZiAoKGl0ZXIuc2xvdCAmIDMpID09IDAp Ci0JCQlwcl9kZWJ1ZygiJTA0eDogIiwgaXRlci5zbG90KTsKLQotCQlpZiAoY2hhc2hfaXRlcl9p c192YWxpZChpdGVyKSkKLQkJCXByX2RlYnVnKCJbJTAxNmxseF0gIiwgY2hhc2hfaXRlcl9rZXko aXRlcikpOwotCQllbHNlIGlmIChjaGFzaF9pdGVyX2lzX2VtcHR5KGl0ZXIpKQotCQkJcHJfZGVi dWcoIlsgICAgPGVtcHR5PiAgICAgXSAiKTsKLQkJZWxzZQotCQkJcHJfZGVidWcoIlsgIDx0b21i c3RvbmU+ICAgXSAiKTsKLQotCQlpZiAoKGl0ZXIuc2xvdCAmIDMpID09IDMpCi0JCQlwcl9kZWJ1 ZygiXG4iKTsKLQotCQlDSEFTSF9JVEVSX0lOQyhpdGVyKTsKLQl9IHdoaWxlIChpdGVyLnNsb3Qp OwotCi0JaWYgKChpdGVyLnNsb3QgJiAzKSAhPSAwKQotCQlwcl9kZWJ1ZygiXG4iKTsKLX0KLQot c3RhdGljIGludCBjaGFzaF90YWJsZV9jaGVjayhzdHJ1Y3QgX19jaGFzaF90YWJsZSAqdGFibGUp Ci17Ci0JdTMyIGhhc2g7Ci0Jc3RydWN0IGNoYXNoX2l0ZXIgaXRlciA9IENIQVNIX0lURVJfSU5J VCh0YWJsZSwgMCk7Ci0Jc3RydWN0IGNoYXNoX2l0ZXIgY3VyID0gQ0hBU0hfSVRFUl9JTklUKHRh YmxlLCAwKTsKLQotCWRvIHsKLQkJaWYgKCFjaGFzaF9pdGVyX2lzX3ZhbGlkKGl0ZXIpKSB7Ci0J CQlDSEFTSF9JVEVSX0lOQyhpdGVyKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJaGFzaCA9IGNo YXNoX2l0ZXJfaGFzaChpdGVyKTsKLQkJQ0hBU0hfSVRFUl9TRVQoY3VyLCBoYXNoKTsKLQkJd2hp bGUgKGN1ci5zbG90ICE9IGl0ZXIuc2xvdCkgewotCQkJaWYgKGNoYXNoX2l0ZXJfaXNfZW1wdHko Y3VyKSkgewotCQkJCXByX2VycigiUGF0aCB0byBlbGVtZW50IGF0ICV4IHdpdGggaGFzaCAleCBi cm9rZW4gYXQgc2xvdCAleFxuIiwKLQkJCQkgICAgICAgaXRlci5zbG90LCBoYXNoLCBjdXIuc2xv dCk7Ci0JCQkJY2hhc2hfdGFibGVfZHVtcCh0YWJsZSk7Ci0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0J CQl9Ci0JCQlDSEFTSF9JVEVSX0lOQyhjdXIpOwotCQl9Ci0KLQkJQ0hBU0hfSVRFUl9JTkMoaXRl cik7Ci0JfSB3aGlsZSAoaXRlci5zbG90KTsKLQotCXJldHVybiAwOwotfQotI2VuZGlmCi0KLXN0 YXRpYyB2b2lkIGNoYXNoX2l0ZXJfcmVsb2NhdGUoc3RydWN0IGNoYXNoX2l0ZXIgZHN0LCBzdHJ1 Y3QgY2hhc2hfaXRlciBzcmMpCi17Ci0JQlVHX09OKHNyYy50YWJsZSA9PSBkc3QudGFibGUgJiYg c3JjLnNsb3QgPT0gZHN0LnNsb3QpOwotCUJVR19PTihzcmMudGFibGUtPmtleV9zaXplICE9IGRz dC50YWJsZS0+a2V5X3NpemUpOwotCUJVR19PTihzcmMudGFibGUtPnZhbHVlX3NpemUgIT0gZHN0 LnRhYmxlLT52YWx1ZV9zaXplKTsKLQotCWlmIChkc3QudGFibGUtPmtleV9zaXplID09IDQpCi0J CWRzdC50YWJsZS0+a2V5czMyW2RzdC5zbG90XSA9IHNyYy50YWJsZS0+a2V5czMyW3NyYy5zbG90 XTsKLQllbHNlCi0JCWRzdC50YWJsZS0+a2V5czY0W2RzdC5zbG90XSA9IHNyYy50YWJsZS0+a2V5 czY0W3NyYy5zbG90XTsKLQotCWlmIChkc3QudGFibGUtPnZhbHVlX3NpemUpCi0JCW1lbWNweShj aGFzaF9pdGVyX3ZhbHVlKGRzdCksIGNoYXNoX2l0ZXJfdmFsdWUoc3JjKSwKLQkJICAgICAgIGRz dC50YWJsZS0+dmFsdWVfc2l6ZSk7Ci0KLQljaGFzaF9pdGVyX3NldF92YWxpZChkc3QpOwotCWNo YXNoX2l0ZXJfc2V0X2ludmFsaWQoc3JjKTsKLQotI2lmZGVmIENPTkZJR19DSEFTSF9TVEFUUwot CWlmIChzcmMudGFibGUgPT0gZHN0LnRhYmxlKSB7Ci0JCWRzdC50YWJsZS0+cmVsb2NzKys7Ci0J CWRzdC50YWJsZS0+cmVsb2NfZGlzdCArPQotCQkJQ0hBU0hfU1VCKGRzdC50YWJsZSwgc3JjLnNs b3QsIGRzdC5zbG90KTsKLQl9Ci0jZW5kaWYKLX0KLQotLyoqCi0gKiBfX2NoYXNoX3RhYmxlX2Zp bmQgLSBIZWxwZXIgZm9yIGxvb2tpbmcgdXAgYSBoYXNoIHRhYmxlIGVudHJ5Ci0gKiBAaXRlcjog UG9pbnRlciB0byBoYXNoIHRhYmxlIGl0ZXJhdG9yCi0gKiBAa2V5OiBLZXkgb2YgdGhlIGVudHJ5 IHRvIGZpbmQKLSAqIEBmb3JfcmVtb3ZhbDogc2V0IHRvIHRydWUgaWYgdGhlIGVsZW1lbnQgd2ls bCBiZSByZW1vdmVkIHNvb24KLSAqCi0gKiBTZWFyY2hlcyBmb3IgYW4gZW50cnkgaW4gdGhlIGhh c2ggdGFibGUgd2l0aCBhIGdpdmVuIGtleS4gaXRlciBtdXN0Ci0gKiBiZSBpbml0aWFsaXplZCBi eSB0aGUgY2FsbGVyIHRvIHBvaW50IHRvIHRoZSBob21lIHBvc2l0aW9uIG9mIHRoZQotICogaHlw b3RoZXRpY2FsIGVudHJ5LCBpLmUuIGl0IG11c3QgYmUgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgaGFz aCB0YWJsZQotICogYW5kIHRoZSBrZXkncyBoYXNoIGFzIHRoZSBpbml0aWFsIHNsb3QgZm9yIHRo ZSBzZWFyY2guCi0gKgotICogVGhpcyBmdW5jdGlvbiBhbHNvIGRvZXMgc29tZSBsb2NhbCBjbGVh bi11cCB0byBzcGVlZCB1cCBmdXR1cmUKLSAqIGxvb2stdXBzIGJ5IHJlbG9jYXRpbmcgZW50cmll cyB0byBiZXR0ZXIgc2xvdHMgYW5kIHJlbW92aW5nCi0gKiB0b21ic3RvbmVzIHRoYXQgYXJlIG5v IGxvbmdlciBuZWVkZWQuCi0gKgotICogSWYgQGZvcl9yZW1vdmFsIGlzIHRydWUsIHRoZSBmdW5j dGlvbiBhdm9pZHMgcmVsb2NhdGluZyB0aGUgZW50cnkKLSAqIHRoYXQgaXMgYmVpbmcgcmV0dXJu ZWQuCi0gKgotICogUmV0dXJucyAwIGlmIHRoZSBzZWFyY2ggaXMgc3VjY2Vzc2Z1bC4gSW4gdGhp cyBjYXNlIGl0ZXIgaXMgdXBkYXRlZAotICogdG8gcG9pbnQgdG8gdGhlIGZvdW5kIGVudHJ5LiBP dGhlcndpc2UgJS1FSU5WQUwgaXMgcmV0dXJuZWQgYW5kIHRoZQotICogaXRlciBpcyB1cGRhdGVk IHRvIHBvaW50IHRvIHRoZSBmaXJzdCBhdmFpbGFibGUgc2xvdCBmb3IgdGhlIGdpdmVuCi0gKiBr ZXkuIElmIHRoZSB0YWJsZSBpcyBmdWxsLCB0aGUgc2xvdCBpcyBzZXQgdG8gLTEuCi0gKi8KLXN0 YXRpYyBpbnQgY2hhc2hfdGFibGVfZmluZChzdHJ1Y3QgY2hhc2hfaXRlciAqaXRlciwgdTY0IGtl eSwKLQkJCSAgICBib29sIGZvcl9yZW1vdmFsKQotewotI2lmZGVmIENPTkZJR19DSEFTSF9TVEFU UwotCXU2NCB0czEgPSBsb2NhbF9jbG9jaygpOwotI2VuZGlmCi0JdTMyIGhhc2ggPSBpdGVyLT5z bG90OwotCXN0cnVjdCBjaGFzaF9pdGVyIGZpcnN0X3JlZHVuZGFudCA9IENIQVNIX0lURVJfSU5J VChpdGVyLT50YWJsZSwgLTEpOwotCWludCBmaXJzdF9hdmFpbCA9IChmb3JfcmVtb3ZhbCA/IC0y IDogLTEpOwotCi0Jd2hpbGUgKCFjaGFzaF9pdGVyX2lzX3ZhbGlkKCppdGVyKSB8fCBjaGFzaF9p dGVyX2tleSgqaXRlcikgIT0ga2V5KSB7Ci0JCWlmIChjaGFzaF9pdGVyX2lzX2VtcHR5KCppdGVy KSkgewotCQkJLyogRm91bmQgYW4gZW1wdHkgc2xvdCwgd2hpY2ggZW5kcyB0aGUKLQkJCSAqIHNl YXJjaC4gQ2xlYW4gdXAgYW55IHByZWNlZGluZyB0b21ic3RvbmVzCi0JCQkgKiB0aGF0IGFyZSBu byBsb25nZXIgbmVlZGVkIGJlY2F1c2UgdGhleSBsZWFkCi0JCQkgKiB0byBuby13aGVyZQotCQkJ ICovCi0JCQlpZiAoKGludClmaXJzdF9yZWR1bmRhbnQuc2xvdCA8IDApCi0JCQkJZ290byBub3Rf Zm91bmQ7Ci0JCQl3aGlsZSAoZmlyc3RfcmVkdW5kYW50LnNsb3QgIT0gaXRlci0+c2xvdCkgewot CQkJCWlmICghY2hhc2hfaXRlcl9pc192YWxpZChmaXJzdF9yZWR1bmRhbnQpKQotCQkJCQljaGFz aF9pdGVyX3NldF9lbXB0eShmaXJzdF9yZWR1bmRhbnQpOwotCQkJCUNIQVNIX0lURVJfSU5DKGZp cnN0X3JlZHVuZGFudCk7Ci0JCQl9Ci0jaWZkZWYgQ0hBU0hfREVCVUcKLQkJCWNoYXNoX3RhYmxl X2NoZWNrKGl0ZXItPnRhYmxlKTsKLSNlbmRpZgotCQkJZ290byBub3RfZm91bmQ7Ci0JCX0gZWxz ZSBpZiAoIWNoYXNoX2l0ZXJfaXNfdmFsaWQoKml0ZXIpKSB7Ci0JCQkvKiBGb3VuZCBhIHRvbWJz dG9uZS4gUmVtZW1iZXIgaXQgYXMgY2FuZGlkYXRlCi0JCQkgKiBmb3IgcmVsb2NhdGluZyB0aGUg ZW50cnkgd2UncmUgbG9va2luZyBmb3IKLQkJCSAqIG9yIGZvciBhZGRpbmcgYSBuZXcgZW50cnkg d2l0aCB0aGUgZ2l2ZW4ga2V5Ci0JCQkgKi8KLQkJCWlmIChmaXJzdF9hdmFpbCA9PSAtMSkKLQkJ CQlmaXJzdF9hdmFpbCA9IGl0ZXItPnNsb3Q7Ci0JCQkvKiBPciBtYXJrIGl0IGFzIHRoZSBzdGFy dCBvZiBhIHNlcmllcyBvZgotCQkJICogcG90ZW50aWFsbHkgcmVkdW5kYW50IHRvbWJzdG9uZXMK LQkJCSAqLwotCQkJZWxzZSBpZiAoZmlyc3RfcmVkdW5kYW50LnNsb3QgPT0gLTEpCi0JCQkJQ0hB U0hfSVRFUl9TRVQoZmlyc3RfcmVkdW5kYW50LCBpdGVyLT5zbG90KTsKLQkJfSBlbHNlIGlmIChm aXJzdF9yZWR1bmRhbnQuc2xvdCA+PSAwKSB7Ci0JCQkvKiBGb3VuZCBhIHZhbGlkLCBvY2N1cGll ZCBzbG90IHdpdGggYQotCQkJICogcHJlY2VkaW5nIHNlcmllcyBvZiB0b21ic3RvbmVzLiBSZWxv Y2F0ZSBpdAotCQkJICogdG8gYSBiZXR0ZXIgcG9zaXRpb24gdGhhdCBubyBsb25nZXIgZGVwZW5k cwotCQkJICogb24gdGhvc2UgdG9tYnN0b25lcwotCQkJICovCi0JCQl1MzIgY3VyX2hhc2ggPSBj aGFzaF9pdGVyX2hhc2goKml0ZXIpOwotCi0JCQlpZiAoIUNIQVNIX0lOX1JBTkdFKGl0ZXItPnRh YmxlLCBjdXJfaGFzaCwKLQkJCQkJICAgIGZpcnN0X3JlZHVuZGFudC5zbG90ICsgMSwKLQkJCQkJ ICAgIGl0ZXItPnNsb3QpKSB7Ci0JCQkJLyogVGhpcyBlbnRyeSBoYXMgYSBoYXNoIGF0IG9yIGJl Zm9yZQotCQkJCSAqIHRoZSBmaXJzdCB0b21ic3RvbmUgd2UgZm91bmQuIFdlCi0JCQkJICogY2Fu IHJlbG9jYXRlIGl0IHRvIHRoYXQgdG9tYnN0b25lCi0JCQkJICogYW5kIGFkdmFuY2UgdG8gdGhl IG5leHQgdG9tYnN0b25lCi0JCQkJICovCi0JCQkJY2hhc2hfaXRlcl9yZWxvY2F0ZShmaXJzdF9y ZWR1bmRhbnQsICppdGVyKTsKLQkJCQlkbyB7Ci0JCQkJCUNIQVNIX0lURVJfSU5DKGZpcnN0X3Jl ZHVuZGFudCk7Ci0JCQkJfSB3aGlsZSAoY2hhc2hfaXRlcl9pc192YWxpZChmaXJzdF9yZWR1bmRh bnQpKTsKLQkJCX0gZWxzZSBpZiAoY3VyX2hhc2ggIT0gaXRlci0+c2xvdCkgewotCQkJCS8qIFJl bG9jYXRlIGVudHJ5IHRvIGl0cyBob21lIHBvc2l0aW9uCi0JCQkJICogb3IgYXMgY2xvc2UgYXMg cG9zc2libGUgc28gaXQgbm8KLQkJCQkgKiBsb25nZXIgZGVwZW5kcyBvbiBhbnkgcHJlY2VkaW5n Ci0JCQkJICogdG9tYnN0b25lcwotCQkJCSAqLwotCQkJCXN0cnVjdCBjaGFzaF9pdGVyIG5ld19p dGVyID0KLQkJCQkJQ0hBU0hfSVRFUl9JTklUKGl0ZXItPnRhYmxlLCBjdXJfaGFzaCk7Ci0KLQkJ CQl3aGlsZSAobmV3X2l0ZXIuc2xvdCAhPSBpdGVyLT5zbG90ICYmCi0JCQkJICAgICAgIGNoYXNo X2l0ZXJfaXNfdmFsaWQobmV3X2l0ZXIpKQotCQkJCQlDSEFTSF9JVEVSX0lOQyhuZXdfaXRlcik7 Ci0KLQkJCQlpZiAobmV3X2l0ZXIuc2xvdCAhPSBpdGVyLT5zbG90KQotCQkJCQljaGFzaF9pdGVy X3JlbG9jYXRlKG5ld19pdGVyLCAqaXRlcik7Ci0JCQl9Ci0JCX0KLQotCQlDSEFTSF9JVEVSX0lO QygqaXRlcik7Ci0JCWlmIChpdGVyLT5zbG90ID09IGhhc2gpIHsKLQkJCWl0ZXItPnNsb3QgPSAt MTsKLQkJCWdvdG8gbm90X2ZvdW5kOwotCQl9Ci0JfQotCi0jaWZkZWYgQ09ORklHX0NIQVNIX1NU QVRTCi0JaXRlci0+dGFibGUtPmhpdHMrKzsKLQlpdGVyLT50YWJsZS0+aGl0c19zdGVwcyArPSBD SEFTSF9TVUIoaXRlci0+dGFibGUsIGl0ZXItPnNsb3QsIGhhc2gpICsgMTsKLSNlbmRpZgotCi0J aWYgKGZpcnN0X2F2YWlsID49IDApIHsKLQkJQ0hBU0hfSVRFUl9TRVQoZmlyc3RfcmVkdW5kYW50 LCBmaXJzdF9hdmFpbCk7Ci0JCWNoYXNoX2l0ZXJfcmVsb2NhdGUoZmlyc3RfcmVkdW5kYW50LCAq aXRlcik7Ci0JCWl0ZXItPnNsb3QgPSBmaXJzdF9yZWR1bmRhbnQuc2xvdDsKLQkJaXRlci0+bWFz ayA9IGZpcnN0X3JlZHVuZGFudC5tYXNrOwotCX0KLQotI2lmZGVmIENPTkZJR19DSEFTSF9TVEFU UwotCWl0ZXItPnRhYmxlLT5oaXRzX3RpbWVfbnMgKz0gbG9jYWxfY2xvY2soKSAtIHRzMTsKLSNl bmRpZgotCi0JcmV0dXJuIDA7Ci0KLW5vdF9mb3VuZDoKLSNpZmRlZiBDT05GSUdfQ0hBU0hfU1RB VFMKLQlpdGVyLT50YWJsZS0+bWlzcysrOwotCWl0ZXItPnRhYmxlLT5taXNzX3N0ZXBzICs9IChp dGVyLT5zbG90IDwgMCkgPwotCQkoMSA8PCBpdGVyLT50YWJsZS0+Yml0cykgOgotCQlDSEFTSF9T VUIoaXRlci0+dGFibGUsIGl0ZXItPnNsb3QsIGhhc2gpICsgMTsKLSNlbmRpZgotCi0JaWYgKGZp cnN0X2F2YWlsID49IDApCi0JCUNIQVNIX0lURVJfU0VUKCppdGVyLCBmaXJzdF9hdmFpbCk7Ci0K LSNpZmRlZiBDT05GSUdfQ0hBU0hfU1RBVFMKLQlpdGVyLT50YWJsZS0+bWlzc190aW1lX25zICs9 IGxvY2FsX2Nsb2NrKCkgLSB0czE7Ci0jZW5kaWYKLQotCXJldHVybiAtRUlOVkFMOwotfQotCi1p bnQgX19jaGFzaF90YWJsZV9jb3B5X2luKHN0cnVjdCBfX2NoYXNoX3RhYmxlICp0YWJsZSwgdTY0 IGtleSwKLQkJCSAgY29uc3Qgdm9pZCAqdmFsdWUpCi17Ci0JdTMyIGhhc2ggPSAodGFibGUtPmtl eV9zaXplID09IDQpID8KLQkJaGFzaF8zMihrZXksIHRhYmxlLT5iaXRzKSA6IGhhc2hfNjQoa2V5 LCB0YWJsZS0+Yml0cyk7Ci0Jc3RydWN0IGNoYXNoX2l0ZXIgaXRlciA9IENIQVNIX0lURVJfSU5J VCh0YWJsZSwgaGFzaCk7Ci0JaW50IHIgPSBjaGFzaF90YWJsZV9maW5kKCZpdGVyLCBrZXksIGZh bHNlKTsKLQotCS8qIEZvdW5kIGFuIGV4aXN0aW5nIGVudHJ5ICovCi0JaWYgKCFyKSB7Ci0JCWlm ICh2YWx1ZSAmJiB0YWJsZS0+dmFsdWVfc2l6ZSkKLQkJCW1lbWNweShjaGFzaF9pdGVyX3ZhbHVl KGl0ZXIpLCB2YWx1ZSwKLQkJCSAgICAgICB0YWJsZS0+dmFsdWVfc2l6ZSk7Ci0JCXJldHVybiAx OwotCX0KLQotCS8qIElzIHRoZXJlIGEgcGxhY2UgdG8gYWRkIGEgbmV3IGVudHJ5PyAqLwotCWlm IChpdGVyLnNsb3QgPCAwKSB7Ci0JCXByX2VycigiSGFzaCB0YWJsZSBvdmVyZmxvd1xuIik7Ci0J CXJldHVybiAtRU5PTUVNOwotCX0KLQotCWNoYXNoX2l0ZXJfc2V0X3ZhbGlkKGl0ZXIpOwotCi0J aWYgKHRhYmxlLT5rZXlfc2l6ZSA9PSA0KQotCQl0YWJsZS0+a2V5czMyW2l0ZXIuc2xvdF0gPSBr ZXk7Ci0JZWxzZQotCQl0YWJsZS0+a2V5czY0W2l0ZXIuc2xvdF0gPSBrZXk7Ci0JaWYgKHZhbHVl ICYmIHRhYmxlLT52YWx1ZV9zaXplKQotCQltZW1jcHkoY2hhc2hfaXRlcl92YWx1ZShpdGVyKSwg dmFsdWUsIHRhYmxlLT52YWx1ZV9zaXplKTsKLQotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJP TChfX2NoYXNoX3RhYmxlX2NvcHlfaW4pOwotCi1pbnQgX19jaGFzaF90YWJsZV9jb3B5X291dChz dHJ1Y3QgX19jaGFzaF90YWJsZSAqdGFibGUsIHU2NCBrZXksCi0JCQkgICB2b2lkICp2YWx1ZSwg Ym9vbCByZW1vdmUpCi17Ci0JdTMyIGhhc2ggPSAodGFibGUtPmtleV9zaXplID09IDQpID8KLQkJ aGFzaF8zMihrZXksIHRhYmxlLT5iaXRzKSA6IGhhc2hfNjQoa2V5LCB0YWJsZS0+Yml0cyk7Ci0J c3RydWN0IGNoYXNoX2l0ZXIgaXRlciA9IENIQVNIX0lURVJfSU5JVCh0YWJsZSwgaGFzaCk7Ci0J aW50IHIgPSBjaGFzaF90YWJsZV9maW5kKCZpdGVyLCBrZXksIHJlbW92ZSk7Ci0KLQlpZiAociA8 IDApCi0JCXJldHVybiByOwotCi0JaWYgKHZhbHVlICYmIHRhYmxlLT52YWx1ZV9zaXplKQotCQlt ZW1jcHkodmFsdWUsIGNoYXNoX2l0ZXJfdmFsdWUoaXRlciksIHRhYmxlLT52YWx1ZV9zaXplKTsK LQotCWlmIChyZW1vdmUpCi0JCWNoYXNoX2l0ZXJfc2V0X2ludmFsaWQoaXRlcik7Ci0KLQlyZXR1 cm4gaXRlci5zbG90OwotfQotRVhQT1JUX1NZTUJPTChfX2NoYXNoX3RhYmxlX2NvcHlfb3V0KTsK LQotI2lmZGVmIENPTkZJR19DSEFTSF9TRUxGVEVTVAotLyoqCi0gKiBjaGFzaF9zZWxmX3Rlc3Qg LSBSdW4gYSBzZWxmLXRlc3Qgb2YgdGhlIGhhc2ggdGFibGUgaW1wbGVtZW50YXRpb24KLSAqIEBi aXRzOiBUYWJsZSBzaXplIHdpbGwgYmUgMl5iaXRzIGVudHJpZXMKLSAqIEBrZXlfc2l6ZTogU2l6 ZSBvZiBoYXNoIGtleXMgaW4gYnl0ZXMsIDQgb3IgOAotICogQG1pbl9maWxsOiBNaW5pbXVtIGZp bGwgbGV2ZWwgZHVyaW5nIHRoZSB0ZXN0Ci0gKiBAbWF4X2ZpbGw6IE1heGltdW0gZmlsbCBsZXZl bCBkdXJpbmcgdGhlIHRlc3QKLSAqIEBpdGVyYXRpb25zOiBOdW1iZXIgb2YgdGVzdCBpdGVyYXRp b25zCi0gKgotICogVGhlIHRlc3QgYWRkcyBhbmQgcmVtb3ZlcyBlbnRyaWVzIGZyb20gYSBoYXNo IHRhYmxlLCBjeWNsaW5nIHRoZQotICogZmlsbCBsZXZlbCBiZXR3ZWVuIG1pbl9maWxsIGFuZCBt YXhfZmlsbCBlbnRyaWVzLiBBbHNvIHRlc3RzIGxvb2t1cAotICogYW5kIHZhbHVlIHJldHJpZXZh bC4KLSAqLwotc3RhdGljIGludCBfX2luaXQgY2hhc2hfc2VsZl90ZXN0KHU4IGJpdHMsIHU4IGtl eV9zaXplLAotCQkJCSAgaW50IG1pbl9maWxsLCBpbnQgbWF4X2ZpbGwsCi0JCQkJICB1NjQgaXRl cmF0aW9ucykKLXsKLQlzdHJ1Y3QgY2hhc2hfdGFibGUgdGFibGU7Ci0JaW50IHJldDsKLQl1NjQg YWRkX2NvdW50LCBybXZfY291bnQ7Ci0JdTY0IHZhbHVlOwotCi0JaWYgKGtleV9zaXplID09IDQg JiYgaXRlcmF0aW9ucyA+IDB4ZmZmZmZmZmYpCi0JCXJldHVybiAtRUlOVkFMOwotCWlmIChtaW5f ZmlsbCA+PSBtYXhfZmlsbCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlyZXQgPSBjaGFzaF90YWJs ZV9hbGxvYygmdGFibGUsIGJpdHMsIGtleV9zaXplLCBzaXplb2YodTY0KSwKLQkJCQlHRlBfS0VS TkVMKTsKLQlpZiAocmV0KSB7Ci0JCXByX2VycigiY2hhc2hfdGFibGVfYWxsb2MgZmFpbGVkOiAl ZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlmb3IgKGFkZF9jb3VudCA9IDAsIHJt dl9jb3VudCA9IDA7IGFkZF9jb3VudCA8IGl0ZXJhdGlvbnM7Ci0JICAgICBhZGRfY291bnQrKykg ewotCQkvKiBXaGVuIHdlIGhpdCB0aGUgbWF4X2ZpbGwgbGV2ZWwsIHJlbW92ZSBlbnRyaWVzIGRv d24KLQkJICogdG8gbWluX2ZpbGwKLQkJICovCi0JCWlmIChhZGRfY291bnQgLSBybXZfY291bnQg PT0gbWF4X2ZpbGwpIHsKLQkJCXU2NCBmaW5kX2NvdW50ID0gcm12X2NvdW50OwotCi0JCQkvKiBG aXJzdCB0cnkgdG8gZmluZCBhbGwgZW50cmllcyB0aGF0IHdlJ3JlCi0JCQkgKiBhYm91dCB0byBy ZW1vdmUsIGNvbmZpcm0gdGhlaXIgdmFsdWUsIHRlc3QKLQkJCSAqIHdyaXRpbmcgdGhlbSBiYWNr IGEgc2Vjb25kIHRpbWUuCi0JCQkgKi8KLQkJCWZvciAoOyBhZGRfY291bnQgLSBmaW5kX2NvdW50 ID4gbWluX2ZpbGw7Ci0JCQkgICAgIGZpbmRfY291bnQrKykgewotCQkJCXJldCA9IGNoYXNoX3Rh YmxlX2NvcHlfb3V0KCZ0YWJsZSwgZmluZF9jb3VudCwKLQkJCQkJCQkgICAmdmFsdWUpOwotCQkJ CWlmIChyZXQgPCAwKSB7Ci0JCQkJCXByX2VycigiY2hhc2hfdGFibGVfY29weV9vdXQgZmFpbGVk OiAlZFxuIiwKLQkJCQkJICAgICAgIHJldCk7Ci0JCQkJCWdvdG8gb3V0OwotCQkJCX0KLQkJCQlp ZiAodmFsdWUgIT0gfmZpbmRfY291bnQpIHsKLQkJCQkJcHJfZXJyKCJXcm9uZyB2YWx1ZSByZXRy aWV2ZWQgZm9yIGtleSAweCVsbHgsIGV4cGVjdGVkIDB4JWxseCBnb3QgMHglbGx4XG4iLAotCQkJ CQkgICAgICAgZmluZF9jb3VudCwgfmZpbmRfY291bnQsIHZhbHVlKTsKLSNpZmRlZiBDSEFTSF9E RUJVRwotCQkJCQljaGFzaF90YWJsZV9kdW1wKCZ0YWJsZS50YWJsZSk7Ci0jZW5kaWYKLQkJCQkJ cmV0ID0gLUVGQVVMVDsKLQkJCQkJZ290byBvdXQ7Ci0JCQkJfQotCQkJCXJldCA9IGNoYXNoX3Rh YmxlX2NvcHlfaW4oJnRhYmxlLCBmaW5kX2NvdW50LAotCQkJCQkJCSAgJnZhbHVlKTsKLQkJCQlp ZiAocmV0ICE9IDEpIHsKLQkJCQkJcHJfZXJyKCJjb3B5X2luIHNlY29uZCB0aW1lIHJldHVybmVk ICVkLCBleHBlY3RlZCAxXG4iLAotCQkJCQkgICAgICAgcmV0KTsKLQkJCQkJcmV0ID0gLUVGQVVM VDsKLQkJCQkJZ290byBvdXQ7Ci0JCQkJfQotCQkJfQotCQkJLyogUmVtb3ZlIHRoZW0gdW50aWwg d2UgaGl0IG1pbl9maWxsIGxldmVsICovCi0JCQlmb3IgKDsgYWRkX2NvdW50IC0gcm12X2NvdW50 ID4gbWluX2ZpbGw7IHJtdl9jb3VudCsrKSB7Ci0JCQkJcmV0ID0gY2hhc2hfdGFibGVfcmVtb3Zl KCZ0YWJsZSwgcm12X2NvdW50LAotCQkJCQkJCSBOVUxMKTsKLQkJCQlpZiAocmV0IDwgMCkgewot CQkJCQlwcl9lcnIoImNoYXNoX3RhYmxlX3JlbW92ZSBmYWlsZWQ6ICVkXG4iLAotCQkJCQkgICAg ICAgcmV0KTsKLQkJCQkJZ290byBvdXQ7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLyogQWRkIGEg bmV3IHZhbHVlICovCi0JCXZhbHVlID0gfmFkZF9jb3VudDsKLQkJcmV0ID0gY2hhc2hfdGFibGVf Y29weV9pbigmdGFibGUsIGFkZF9jb3VudCwgJnZhbHVlKTsKLQkJaWYgKHJldCAhPSAwKSB7Ci0J CQlwcl9lcnIoImNvcHlfaW4gZmlyc3QgdGltZSByZXR1cm5lZCAlZCwgZXhwZWN0ZWQgMFxuIiwK LQkJCSAgICAgICByZXQpOwotCQkJcmV0ID0gLUVGQVVMVDsKLQkJCWdvdG8gb3V0OwotCQl9Ci0J fQotCi0JY2hhc2hfdGFibGVfZHVtcF9zdGF0cygmdGFibGUpOwotCWNoYXNoX3RhYmxlX3Jlc2V0 X3N0YXRzKCZ0YWJsZSk7Ci0KLW91dDoKLQljaGFzaF90YWJsZV9mcmVlKCZ0YWJsZSk7Ci0JcmV0 dXJuIHJldDsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCBjaGFzaF90ZXN0X2JpdHMgPSAxMDsK LU1PRFVMRV9QQVJNX0RFU0ModGVzdF9iaXRzLAotCQkgIlNlbGZ0ZXN0IG51bWJlciBvZiBoYXNo IGJpdHMgKFs0Li4yMF0sIGRlZmF1bHQ9MTApIik7Ci1tb2R1bGVfcGFyYW1fbmFtZWQodGVzdF9i aXRzLCBjaGFzaF90ZXN0X2JpdHMsIHVpbnQsIDA0NDQpOwotCi1zdGF0aWMgdW5zaWduZWQgaW50 IGNoYXNoX3Rlc3Rfa2V5c2l6ZSA9IDg7Ci1NT0RVTEVfUEFSTV9ERVNDKHRlc3Rfa2V5c2l6ZSwg IlNlbGZ0ZXN0IGtleXNpemUgKDQgb3IgOCwgZGVmYXVsdD04KSIpOwotbW9kdWxlX3BhcmFtX25h bWVkKHRlc3Rfa2V5c2l6ZSwgY2hhc2hfdGVzdF9rZXlzaXplLCB1aW50LCAwNDQ0KTsKLQotc3Rh dGljIHVuc2lnbmVkIGludCBjaGFzaF90ZXN0X21pbmZpbGw7Ci1NT0RVTEVfUEFSTV9ERVNDKHRl c3RfbWluZmlsbCwgIlNlbGZ0ZXN0IG1pbmltdW0gI2VudHJpZXMgKGRlZmF1bHQ9NTAlKSIpOwot bW9kdWxlX3BhcmFtX25hbWVkKHRlc3RfbWluZmlsbCwgY2hhc2hfdGVzdF9taW5maWxsLCB1aW50 LCAwNDQ0KTsKLQotc3RhdGljIHVuc2lnbmVkIGludCBjaGFzaF90ZXN0X21heGZpbGw7Ci1NT0RV TEVfUEFSTV9ERVNDKHRlc3RfbWF4ZmlsbCwgIlNlbGZ0ZXN0IG1heGltdW0gI2VudHJpZXMgKGRl ZmF1bHQ9ODAlKSIpOwotbW9kdWxlX3BhcmFtX25hbWVkKHRlc3RfbWF4ZmlsbCwgY2hhc2hfdGVz dF9tYXhmaWxsLCB1aW50LCAwNDQ0KTsKLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgY2hhc2hfdGVz dF9pdGVyczsKLU1PRFVMRV9QQVJNX0RFU0ModGVzdF9pdGVycywgIlNlbGZ0ZXN0IGl0ZXJhdGlv bnMgKGRlZmF1bHQ9MTAwMCB4ICNlbnRyaWVzKSIpOwotbW9kdWxlX3BhcmFtX25hbWVkKHRlc3Rf aXRlcnMsIGNoYXNoX3Rlc3RfaXRlcnMsIHVsb25nLCAwNDQ0KTsKLQotc3RhdGljIGludCBfX2lu aXQgY2hhc2hfaW5pdCh2b2lkKQotewotCWludCByZXQ7Ci0JdTY0IHRzMV9uczsKLQotCS8qIFNr aXAgc2VsZiB0ZXN0IG9uIHVzZXIgZXJyb3JzICovCi0JaWYgKGNoYXNoX3Rlc3RfYml0cyA8IDQg fHwgY2hhc2hfdGVzdF9iaXRzID4gMjApIHsKLQkJcHJfZXJyKCJjaGFzaDogdGVzdF9iaXRzIG91 dCBvZiByYW5nZSBbNC4uMjBdLlxuIik7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAoY2hhc2hfdGVz dF9rZXlzaXplICE9IDQgJiYgY2hhc2hfdGVzdF9rZXlzaXplICE9IDgpIHsKLQkJcHJfZXJyKCJj aGFzaDogdGVzdF9rZXlzaXplIGludmFsaWQuIE11c3QgYmUgNCBvciA4LlxuIik7Ci0JCXJldHVy biAwOwotCX0KLQotCWlmICghY2hhc2hfdGVzdF9taW5maWxsKQotCQljaGFzaF90ZXN0X21pbmZp bGwgPSAoMSA8PCBjaGFzaF90ZXN0X2JpdHMpIC8gMjsKLQlpZiAoIWNoYXNoX3Rlc3RfbWF4Zmls bCkKLQkJY2hhc2hfdGVzdF9tYXhmaWxsID0gKDEgPDwgY2hhc2hfdGVzdF9iaXRzKSAqIDQgLyA1 OwotCWlmICghY2hhc2hfdGVzdF9pdGVycykKLQkJY2hhc2hfdGVzdF9pdGVycyA9ICgxIDw8IGNo YXNoX3Rlc3RfYml0cykgKiAxMDAwOwotCi0JaWYgKGNoYXNoX3Rlc3RfbWluZmlsbCA+PSAoMSA8 PCBjaGFzaF90ZXN0X2JpdHMpKSB7Ci0JCXByX2VycigiY2hhc2g6IHRlc3RfbWluZmlsbCB0b28g YmlnLiBNdXN0IGJlIDwgdGFibGUgc2l6ZS5cbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKGNo YXNoX3Rlc3RfbWF4ZmlsbCA+PSAoMSA8PCBjaGFzaF90ZXN0X2JpdHMpKSB7Ci0JCXByX2Vycigi Y2hhc2g6IHRlc3RfbWF4ZmlsbCB0b28gYmlnLiBNdXN0IGJlIDwgdGFibGUgc2l6ZS5cbiIpOwot CQlyZXR1cm4gMDsKLQl9Ci0JaWYgKGNoYXNoX3Rlc3RfbWluZmlsbCA+PSBjaGFzaF90ZXN0X21h eGZpbGwpIHsKLQkJcHJfZXJyKCJjaGFzaDogdGVzdF9taW5maWxsIG11c3QgYmUgPCB0ZXN0X21h eGZpbGwuXG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCWlmIChjaGFzaF90ZXN0X2tleXNpemUgPT0g NCAmJiBjaGFzaF90ZXN0X2l0ZXJzID4gMHhmZmZmZmZmZikgewotCQlwcl9lcnIoImNoYXNoOiB0 ZXN0X2l0ZXJzIG11c3QgYmUgPCA0RyBmb3IgNCBieXRlIGtleXMuXG4iKTsKLQkJcmV0dXJuIDA7 Ci0JfQotCi0JdHMxX25zID0gbG9jYWxfY2xvY2soKTsKLQlyZXQgPSBjaGFzaF9zZWxmX3Rlc3Qo Y2hhc2hfdGVzdF9iaXRzLCBjaGFzaF90ZXN0X2tleXNpemUsCi0JCQkgICAgICBjaGFzaF90ZXN0 X21pbmZpbGwsIGNoYXNoX3Rlc3RfbWF4ZmlsbCwKLQkJCSAgICAgIGNoYXNoX3Rlc3RfaXRlcnMp OwotCWlmICghcmV0KSB7Ci0JCXU2NCB0c19kZWx0YV91cyA9IGxvY2FsX2Nsb2NrKCkgLSB0czFf bnM7Ci0JCXU2NCBpdGVyc19wZXJfc2Vjb25kID0gKHU2NCljaGFzaF90ZXN0X2l0ZXJzICogMTAw MDAwMDsKLQotCQlkb19kaXYodHNfZGVsdGFfdXMsIDEwMDApOwotCQlkb19kaXYoaXRlcnNfcGVy X3NlY29uZCwgdHNfZGVsdGFfdXMpOwotCQlwcl9pbmZvKCJjaGFzaDogc2VsZiB0ZXN0IHRvb2sg JWxsdSB1cywgJWxsdSBpdGVyYXRpb25zL3NcbiIsCi0JCQl0c19kZWx0YV91cywgaXRlcnNfcGVy X3NlY29uZCk7Ci0JfSBlbHNlIHsKLQkJcHJfZXJyKCJjaGFzaDogc2VsZiB0ZXN0IGZhaWxlZDog JWRcbiIsIHJldCk7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotbW9kdWxlX2luaXQoY2hhc2hf aW5pdCk7Ci0KLSNlbmRpZiAvKiBDT05GSUdfQ0hBU0hfU0VMRlRFU1QgKi8KLQotTU9EVUxFX0RF U0NSSVBUSU9OKCJDbG9zZWQgaGFzaCB0YWJsZSIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCBhbmQg YWRkaXRpb25hbCByaWdodHMiKTsKLS0gCjIuMTcuMQoKX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX18KYW1kLWdmeCBtYWlsaW5nIGxpc3QKYW1kLWdmeEBsaXN0 cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9s aXN0aW5mby9hbWQtZ2Z4Cg==