From mboxrd@z Thu Jan 1 00:00:00 1970 From: John.C.Harrison@Intel.com Subject: [RFC] igt/gem_exec_fence: New test for sync/fence interface Date: Tue, 19 Jan 2016 16:04:51 +0000 Message-ID: <1453219491-27035-1-git-send-email-John.C.Harrison@Intel.com> References: <1452707855-9791-1-git-send-email-John.C.Harrison@Intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) by gabe.freedesktop.org (Postfix) with ESMTP id E04196E041 for ; Tue, 19 Jan 2016 08:04:53 -0800 (PST) In-Reply-To: <1452707855-9791-1-git-send-email-John.C.Harrison@Intel.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: Intel-GFX@Lists.FreeDesktop.Org Cc: Gustavo Padovan List-Id: intel-gfx@lists.freedesktop.org RnJvbTogSm9obiBIYXJyaXNvbiA8Sm9obi5DLkhhcnJpc29uQEludGVsLmNvbT4KCk5vdGUsIHRo aXMgaXMgYSB3b3JrIGluIHByb2dyZXNzLiBJdCBpcyBiZWluZyBwb3N0ZWQgbm93IGFzIHRoZXJl IGlzCndvcmsgZ29pbmcgb24gdG8gY2hhbmdlIHRoZSBkZWJ1Z2dpbmcgaW50ZXJmYWNlIHVzZWQg YnkgdGhpcyB0ZXN0LiBTbwppdCB3b3VsZCBiZSB1c2VmdWwgdG8gZ2V0IHNvbWUgY29tbWVudHMg b24gd2hldGhlciB0aGUgcHJvcG9zZWQKY2hhbmdlcyB3aWxsIGNhdXNlIGEgcHJvYmxlbSBmb3Ig dGhpcyB0ZXN0IG9yIHdoZXRoZXIgdGhlIHRlc3QgaXRzZWxmCnNob3VsZCBiZSBkb25lIGRpZmZl cmVudGx5LgoKU2lnbmVkLW9mZi1ieTogSm9obiBIYXJyaXNvbiA8Sm9obi5DLkhhcnJpc29uQElu dGVsLmNvbT4KQ2M6IEd1c3Rhdm8gUGFkb3ZhbiA8Z3VzdGF2by5wYWRvdmFuQGNvbGxhYm9yYS5j by51az4KLS0tCiBsaWIvaW50ZWxfYmF0Y2hidWZmZXIuYyB8ICAgMzYgKysKIGxpYi9pbnRlbF9i YXRjaGJ1ZmZlci5oIHwgICAgMSArCiB0ZXN0cy9NYWtlZmlsZS5zb3VyY2VzICB8ICAgIDEgKwog dGVzdHMvZ2VtX2V4ZWNfZmVuY2UuYyAgfCAxNDcwICsrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrCiA0IGZpbGVzIGNoYW5nZWQsIDE1MDggaW5zZXJ0aW9ucygr KQogY3JlYXRlIG1vZGUgMTAwNjQ0IHRlc3RzL2dlbV9leGVjX2ZlbmNlLmMKCmRpZmYgLS1naXQg YS9saWIvaW50ZWxfYmF0Y2hidWZmZXIuYyBiL2xpYi9pbnRlbF9iYXRjaGJ1ZmZlci5jCmluZGV4 IDY5MjUyMWYuLjU1YzdmOWYgMTAwNjQ0Ci0tLSBhL2xpYi9pbnRlbF9iYXRjaGJ1ZmZlci5jCisr KyBiL2xpYi9pbnRlbF9iYXRjaGJ1ZmZlci5jCkBAIC0xODYsNiArMTg2LDI3IEBAIGludGVsX2Jh dGNoYnVmZmVyX2ZsdXNoX29uX3Jpbmcoc3RydWN0IGludGVsX2JhdGNoYnVmZmVyICpiYXRjaCwg aW50IHJpbmcpCiAJaW50ZWxfYmF0Y2hidWZmZXJfcmVzZXQoYmF0Y2gpOwogfQogCitzdGF0aWMg dm9pZAoraW50ZWxfYmF0Y2hidWZmZXJfZmx1c2hfb25fcmluZ19mZW5jZShzdHJ1Y3QgaW50ZWxf YmF0Y2hidWZmZXIgKmJhdGNoLCBpbnQgcmluZywKKwkJCQkgICAgICBpbnQgZmVuY2VfaW4sIGlu dCAqZmVuY2Vfb3V0KQoreworCXVuc2lnbmVkIGludCB1c2VkID0gZmx1c2hfb25fcmluZ19jb21t b24oYmF0Y2gsIHJpbmcpOworCWRybV9pbnRlbF9jb250ZXh0ICpjdHg7CisKKwlpZiAodXNlZCA9 PSAwKQorCQlyZXR1cm47CisKKwlkb19vcl9kaWUoZHJtX2ludGVsX2JvX3N1YmRhdGEoYmF0Y2gt PmJvLCAwLCB1c2VkLCBiYXRjaC0+YnVmZmVyKSk7CisKKwliYXRjaC0+cHRyID0gTlVMTDsKKwor CWN0eCA9IGJhdGNoLT5jdHg7CisJZG9fb3JfZGllKGRybV9pbnRlbF9nZW1fYm9fY29udGV4dF9m ZW5jZV9leGVjKGJhdGNoLT5ibywgY3R4LCB1c2VkLAorCQkJCQkJICAgICAgcmluZywgZmVuY2Vf aW4sIGZlbmNlX291dCkpOworCisJaW50ZWxfYmF0Y2hidWZmZXJfcmVzZXQoYmF0Y2gpOworfQor CiB2b2lkCiBpbnRlbF9iYXRjaGJ1ZmZlcl9zZXRfY29udGV4dChzdHJ1Y3QgaW50ZWxfYmF0Y2hi dWZmZXIgKmJhdGNoLAogCQkJCSAgICAgZHJtX2ludGVsX2NvbnRleHQgKmNvbnRleHQpCkBAIC0y MzksNiArMjYwLDIxIEBAIGludGVsX2JhdGNoYnVmZmVyX2ZsdXNoKHN0cnVjdCBpbnRlbF9iYXRj aGJ1ZmZlciAqYmF0Y2gpCiAJaW50ZWxfYmF0Y2hidWZmZXJfZmx1c2hfb25fcmluZyhiYXRjaCwg cmluZyk7CiB9CiAKKy8qKgorICogaW50ZWxfYmF0Y2hidWZmZXJfZmx1c2hfZmVuY2U6CisgKiBA YmF0Y2g6IGJhdGNoYnVmZmVyIG9iamVjdAorICoKKyAqIFN1Ym1pdHMgdGhlIGJhdGNoIGZvciBl eGVjdXRpb24gb24gdGhlIGJsaXR0ZXIgZW5naW5lLCBzZWxlY3RpbmcgdGhlIHJpZ2h0CisgKiBy aW5nIGRlcGVuZGluZyB1cG9uIHRoZSBoYXJkd2FyZSBwbGF0Zm9ybS4KKyAqLwordm9pZAoraW50 ZWxfYmF0Y2hidWZmZXJfZmx1c2hfZmVuY2Uoc3RydWN0IGludGVsX2JhdGNoYnVmZmVyICpiYXRj aCwgaW50IGZlbmNlX2luLCBpbnQgKmZlbmNlX291dCkKK3sKKwlpbnQgcmluZyA9IDA7CisJaWYg KEhBU19CTFRfUklORyhiYXRjaC0+ZGV2aWQpKQorCQlyaW5nID0gSTkxNV9FWEVDX0JMVDsKKwlp bnRlbF9iYXRjaGJ1ZmZlcl9mbHVzaF9vbl9yaW5nX2ZlbmNlKGJhdGNoLCByaW5nLCBmZW5jZV9p biwgZmVuY2Vfb3V0KTsKK30KIAogLyoqCiAgKiBpbnRlbF9iYXRjaGJ1ZmZlcl9lbWl0X3JlbG9j OgpkaWZmIC0tZ2l0IGEvbGliL2ludGVsX2JhdGNoYnVmZmVyLmggYi9saWIvaW50ZWxfYmF0Y2hi dWZmZXIuaAppbmRleCA4Njk3NDdkLi41ZGVjZTJhIDEwMDY0NAotLS0gYS9saWIvaW50ZWxfYmF0 Y2hidWZmZXIuaAorKysgYi9saWIvaW50ZWxfYmF0Y2hidWZmZXIuaApAQCAtMzUsNiArMzUsNyBA QCB2b2lkIGludGVsX2JhdGNoYnVmZmVyX2ZyZWUoc3RydWN0IGludGVsX2JhdGNoYnVmZmVyICpi YXRjaCk7CiAKIAogdm9pZCBpbnRlbF9iYXRjaGJ1ZmZlcl9mbHVzaChzdHJ1Y3QgaW50ZWxfYmF0 Y2hidWZmZXIgKmJhdGNoKTsKK3ZvaWQgaW50ZWxfYmF0Y2hidWZmZXJfZmx1c2hfZmVuY2Uoc3Ry dWN0IGludGVsX2JhdGNoYnVmZmVyICpiYXRjaCwgaW50IGZlbmNlX2luLCBpbnQgKmZlbmNlX291 dCk7CiB2b2lkIGludGVsX2JhdGNoYnVmZmVyX2ZsdXNoX29uX3Jpbmcoc3RydWN0IGludGVsX2Jh dGNoYnVmZmVyICpiYXRjaCwgaW50IHJpbmcpOwogdm9pZCBpbnRlbF9iYXRjaGJ1ZmZlcl9mbHVz aF93aXRoX2NvbnRleHQoc3RydWN0IGludGVsX2JhdGNoYnVmZmVyICpiYXRjaCwKIAkJCQkJICBk cm1faW50ZWxfY29udGV4dCAqY29udGV4dCk7CmRpZmYgLS1naXQgYS90ZXN0cy9NYWtlZmlsZS5z b3VyY2VzIGIvdGVzdHMvTWFrZWZpbGUuc291cmNlcwppbmRleCA4ZmIyZGU4Li4xMDAwMzI0IDEw MDY0NAotLS0gYS90ZXN0cy9NYWtlZmlsZS5zb3VyY2VzCisrKyBiL3Rlc3RzL01ha2VmaWxlLnNv dXJjZXMKQEAgLTI2LDYgKzI2LDcgQEAgVEVTVFNfcHJvZ3NfTSA9IFwKIAlnZW1fZXhlY19hbGln bm1lbnQgXAogCWdlbV9leGVjX2JhZF9kb21haW5zIFwKIAlnZW1fZXhlY19mYXVsdGluZ19yZWxv YyBcCisJZ2VtX2V4ZWNfZmVuY2UgXAogCWdlbV9leGVjX25vcCBcCiAJZ2VtX2V4ZWNfcGFyYW1z IFwKIAlnZW1fZXhlY19wYXJzZSBcCmRpZmYgLS1naXQgYS90ZXN0cy9nZW1fZXhlY19mZW5jZS5j IGIvdGVzdHMvZ2VtX2V4ZWNfZmVuY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAw MDAwLi5hYjZjYzg0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ2VtX2V4ZWNfZmVuY2UuYwpA QCAtMCwwICsxLDE0NzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxNSBJbnRlbCBDb3Jwb3Jh dGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdl LCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5k IGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8g ZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhv dXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2Us IHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMg b2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNv ZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNv bmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVy bWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBi ZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQor ICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJ VEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xV RElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ LAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVO VC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVS UyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZ LCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFS SVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJF IE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MKKyAqIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisg KiBBdXRob3JzOgorICogICAgVHZydGtvIFVyc3VsaW4gPHR2cnRrby51cnN1bGluQGludGVsLmNv bT4KKyAqICAgIEpvaG4gSGFycmlzb24gPGpvaG4uYy5oYXJyaXNvbkBpbnRlbC5jb20+CisgKiAg ICBHZW9mZiBNaWxsZXIgPGdlb2ZmLm1pbGxlckBpbnRlbC5jb20+CisgKgorICovCisKKyNpbmNs dWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4K KyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGZjbnRs Lmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUg PHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUu aD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8cHRo cmVhZC5oPgorI2luY2x1ZGUgImRybS5oIgorI2luY2x1ZGUgImlvY3RsX3dyYXBwZXJzLmgiCisj aW5jbHVkZSAiZHJtdGVzdC5oIgorI2luY2x1ZGUgImludGVsX2lvLmgiCisjaW5jbHVkZSAiaW50 ZWxfY2hpcHNldC5oIgorI2luY2x1ZGUgImlndF9hdXguaCIKKyNpbmNsdWRlICJzeW5jL3N3X3N5 bmMuaCIKKyNpbmNsdWRlICJzeW5jL3N5bmMuaCIKKworI2RlZmluZSBJOTE1X0RSSVZFUl9OQU1F CQkiaTkxNSIKKyNkZWZpbmUgRkVOQ0VfQUNUSVZFICgwKQorI2RlZmluZSBGRU5DRV9TSUdOQUxF RCAoMSkKKworLyogU3RydWN0dXJlIHRvIGVuY2Fwc3VsYXRlIGEgc3dfc3luYyBkZXZpY2UgKi8K K3N0cnVjdCBzd19zeW5jX29iagoreworCWludCBmZDsKKwlpbnQgdGljazsgLyogQ2FuJ3QgcmVh ZCB0aGlzIGRpcmVjdGx5LCBzbyB3ZSB0cmFjayBpdCBoZXJlICovCit9OworCitzdGF0aWMgc3Ry dWN0IHN3X3N5bmNfb2JqIHVzZXJfc3luY19vYmo7CisKKy8qCisgKiBPcGVuIGEgbmV3IHN3IHN5 bmMgb2JqZWN0CisgKiBAb2JqOiBQb2ludGVyIHRvIGEgc3RydWN0IHN3X3N5bmNfb2JqCisgKiBA cmV0dXJuOiBaZXJvIGlmIG9wZW4gd29ya2VkLgorICovCitzdGF0aWMgaW50IGluaXRfc3dfc3lu YyhzdHJ1Y3Qgc3dfc3luY19vYmogKm9iaikKK3sKKwlvYmotPmZkID0gb3BlbigiL2Rldi9zd19z eW5jIiwgT19SRFdSKTsKKwlvYmotPnRpY2sgPSAwOworCXJldHVybiAob2JqLT5mZCA9PSAtMSk7 Cit9CisKKy8qCisgKiBDbG9zZXMgc3dfc3luYyBkZXZpY2UKKyAqIEBvYmo6IHBvaW50ZXIgdG8g YSBzdHJ1Y3Qgc3dfc3luY19vYmoKKyAqLworc3RhdGljIHZvaWQgY2xvc2Vfc3dfc3luYyhzdHJ1 Y3Qgc3dfc3luY19vYmogKm9iaikKK3sKKwljbG9zZShvYmotPmZkKTsKK30KKworLyoKKyAqIENy ZWF0ZXMgYSB1c2VyIGZlbmNlIGF0IGEgZ2l2ZW4gcGxhY2Ugb24gdGhlIHRpbWVsaW5lCisgKiBB c3N1bWVzIHRoYXQgd2UgYXJlIHVzaW5nIGEgc3RydWN0IHN3X3N5bmNfb2JqIGNhbGxlZCB1c2Vy X3N5bmNfb2JqIGluCisgKiBnbG9iYWwgc2NvcGUKKyAqIEBmZW5jZV9vdXQ6IHRoZSBuZXcgZmVu Y2UgcmV0dXJuZWQgdG8gdGhlIHVzZXIKKyAqIEB2YWx1ZTogdGhlIHBvc2l0aW9uIHRvIHBsYWNl IHRoZSBmZW5jZSBvbiB0aGUgdGltZWxpbmUKKyAqIEByZXR1cm46IHJldHVybiB2YWx1ZSBmcm9t IGlvY3RsCisgKi8KK3N0YXRpYyBpbnQgdXNlcl9jcmVhdGVfZmVuY2UoaW50ICpmZW5jZV9vdXQs IHVpbnQzMl90IHZhbHVlKQoreworCWludCByZXQ7CisJc3RydWN0IHN3X3N5bmNfY3JlYXRlX2Zl bmNlX2RhdGEgZGF0YTsKKwlkYXRhLnZhbHVlID0gdmFsdWU7CisJcmV0ID0gaW9jdGwodXNlcl9z eW5jX29iai5mZCwgU1dfU1lOQ19JT0NfQ1JFQVRFX0ZFTkNFLCAmZGF0YSk7CisJKmZlbmNlX291 dCA9IGRhdGEuZmVuY2U7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEluY3JlbWVudHMgdGlt ZWxpbmUgYnkgYSBnaXZlbiBjb3VudAorICogQXNzdW1lcyB0aGF0IHdlIGFyZSB1c2luZyBhIHN0 cnVjdCBzd19zeW5jX29iaiBjYWxsZWQgdXNlcl9zeW5jX29iaiBpbgorICogZ2xvYmFsIHNjb3Bl LiBOb3RlIHRoYXQgd2UgYWxzbyBpbmNyZW1lbnQgdGhlIGxvY2FsIGNvdW50ZXIgaGVyZSwgYnV0 CisgKiBvbmx5IGlmIHRoZSBpb2N0bCBzdWNjZWVkZWQsIHRvIGF2b2lkIGdvaW5nIG91dCBvZiBz eW5jLgorICogQHN0ZXA6IE51bWJlciBvZiBzdGVwcyB0byBpbmNyZW1lbnQgdGhlIHRpbWVsaW5l CisgKiBAcmV0dXJuOiByZXR1cm4gdmFsdWUgZnJvbSBpb2N0bAorICovCitzdGF0aWMgaW50IHVz ZXJfaW5jX3RpbWVsaW5lKHVpbnQzMl90IHN0ZXApCit7CisJaW50IHJldDsKKwl1aW50MzJfdCBs b2NhbHN0ZXAgPSBzdGVwOworCXJldCA9IGlvY3RsKHVzZXJfc3luY19vYmouZmQsIFNXX1NZTkNf SU9DX0lOQywgJmxvY2Fsc3RlcCk7CisJaWYgKHJldCA9PSAwKQorCXsKKwkJdXNlcl9zeW5jX29i ai50aWNrICs9IGxvY2Fsc3RlcDsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFdhaXQg b24gYSBnaXZlbiBmZW5jZSBmb3IgYSB0aW1lb3V0CisgKiBUaGlzIGlzIGEgYmFzaWMgd3JhcHBl ciBhcm91bmQgdGhlIFNZTkNfSU9DX1dBSVQgaW9jdGwsIHNlZSBzeW5jL3N5bmMuaAorICogZm9y IGJlaGF2aW91cmFsIGRldGFpbHMuCisgKiBAZmVuY2U6IGZkIGZvciBmZW5jZSB0byB3YWl0IG9u CisgKiBAdGltZW91dDogcG9pbnRlciB0byB0aW1lb3V0IHZhbHVlIGluIG1pbGxpc2Vjb25kcwor ICogQHJldHVybjogcmV0dXJuIHZhbHVlIG9mIGlvY3RsCisgKi8KK3N0YXRpYyBpbnQgd2FpdF9m ZW5jZShpbnQgZmVuY2UsIGludCAqdGltZW91dCkKK3sKKwlyZXR1cm4gaW9jdGwoZmVuY2UsIFNZ TkNfSU9DX1dBSVQsIHRpbWVvdXQpOworfQorCisvKgorICogTWVyZ2UgdHdvIGZlbmNlcyBpbnRv IGEgbmV3IGZlbmNlCisgKiBAZmVuY2Vfb3V0OiBwb2ludGVyIHRvIGZkIGZvciBuZXcgZmVuY2UK KyAqIEBmZW5jZV9hOiBmaXJzdCBpbnB1dCBmZW5jZQorICogQGZlbmNlX2I6IHNlY29uZCBpbnB1 dCBmZW5jZQorICogQHJldHVybjogcmV0dXJuIHZhbHVlIG9mIGlvY3RsCisgKi8KK3N0YXRpYyBp bnQgbWVyZ2VfZmVuY2UoaW50ICpmZW5jZV9vdXQsIGludCBmZW5jZV9hLCBpbnQgZmVuY2VfYikK K3sKKwlpbnQgcmV0OworCXN0cnVjdCBzeW5jX21lcmdlX2RhdGEgZGF0YTsKKwlkYXRhLmZkMiA9 IGZlbmNlX2I7CisJcmV0ID0gaW9jdGwoZmVuY2VfYSwgU1lOQ19JT0NfTUVSR0UsICZkYXRhKTsK KwlpZiAocmV0ID09IDApCisJeworCQkqZmVuY2Vfb3V0ID0gZGF0YS5mZW5jZTsKKwl9CisJcmV0 dXJuIHJldDsKK30KKworLyoKKyAqIFdyaXRlcyBmZW5jZSBpbmZvIGludG8gc3luY19mZW5jZV9p bmZvIHN0cnVjdHVyZS4gTm90ZSB0aGF0IHRoaXMgY2FuIGJlCisgKiB2YXJpYWJsZSBsZW5ndGgs IHNvIHNldCBkYXRhLT5sZW4gYWNjb3JkaW5nbHkgLSBzZWUgc3luYy9zeW5jLmgKKyAqIEBmZW5j ZTogZmVuY2UgdG8gZ2V0IGluZm9ybWF0aW9uIG9uCisgKiBAZGF0YTogcG9pbnRlciB0byBzdHJ1 Y3Qgc3luY19mZW5jZV9pbmZvX2RhdGEKKyAqIEByZXR1cm46IHJldHVybiB2YWx1ZSBmcm9tIGlv Y3RsCisgKi8KK3N0YXRpYyBpbnQgZ2V0X2ZlbmNlX2luZm8oaW50IGZlbmNlLCBzdHJ1Y3Qgc3lu Y19mZW5jZV9pbmZvX2RhdGEgKmRhdGEpCit7CisJcmV0dXJuIGlvY3RsKGZlbmNlLCBTWU5DX0lP Q19GRU5DRV9JTkZPLCBkYXRhKTsKK30KKworc3RhdGljIGludCBmZDsKK3N0YXRpYyBkcm1faW50 ZWxfYnVmbWdyICpidWZtZ3I7CitzdGF0aWMgc3RydWN0IGludGVsX2JhdGNoYnVmZmVyICpiYXRj aDsKK3N0YXRpYyB1aW50MzJfdCBkZXZpZDsKKworc3RhdGljIHVpbnQzMl90IG5vcF9iYXRjaFsy XSA9IHtNSV9CQVRDSF9CVUZGRVJfRU5EfTsKK3N0YXRpYyB1aW50MzJfdCBoYW5kbGU7CisKKy8q CisgKiBEaXJlY3RseSBzdWJtaXRzIGEgbm9wIHZpYSB0aGUgRVhFQ0JVRkZFUjIgSW9jdGwKKyAq IFRoZSB1c2VyIG9mIHRoaXMgZnVuY3Rpb24gaXMgZXhwZWN0ZWQgdG8gc2V0IHRoZSBmbGFncyBh bmQgZmVuY2UgYXJndW1lbnRzCisgKiBjb3JyZWN0bHkuCisgKiBAY3R4IHBvaW50ZXIgdG8gYSBk cm1faW50ZWxfY29udGV4dCBjcmVhdGVkIGJ5IHRoZSB1c2VyICh1c2UgTlVMTCB0byBpZ25vcmUp CisgKiBAZmxhZ3MgY29udHJvbCB0aGUgZW5naW5lIHNlbGVjdGlvbiwgZW5hYmxlIGZlbmNlIG91 dHB1dAorICogQGZlbmNlX2luIGZlbmNlIHVzZWQgYnkgdGhlIHN1Ym1pc3Npb24KKyAqIEBmZW5j ZV9vdXQgcG9pbnRlciB0byBhIGZlbmNlIG9wdGlvbmFsbHkgcmV0dXJuZWQgYnkgdGhlIHN1Ym1p c3Npb24KKyAqLworc3RhdGljIGludCBub3BfZXhlY193aXRoX2N0eChkcm1faW50ZWxfY29udGV4 dCAqY3R4LCB1bnNpZ25lZCBpbnQgZmxhZ3MsIGludCBmZW5jZV9pbiwgaW50ICpmZW5jZV9vdXQp Cit7CisJc3RydWN0IGRybV9pOTE1X2dlbV9leGVjYnVmZmVyMiBleGVjYnVmOworCXN0cnVjdCBk cm1faTkxNV9nZW1fZXhlY19vYmplY3QyIGdlbV9leGVjWzFdOworCWludCByZXQgPSAwOworCisJ Z2VtX2V4ZWNbMF0uaGFuZGxlID0gaGFuZGxlOworCWdlbV9leGVjWzBdLnJlbG9jYXRpb25fY291 bnQgPSAwOworCWdlbV9leGVjWzBdLnJlbG9jc19wdHIgPSAwOworCWdlbV9leGVjWzBdLmFsaWdu bWVudCA9IDA7CisJZ2VtX2V4ZWNbMF0ub2Zmc2V0ID0gMDsKKwlnZW1fZXhlY1swXS5mbGFncyA9 IDA7CisJZ2VtX2V4ZWNbMF0ucnN2ZDEgPSAwOworCWdlbV9leGVjWzBdLnJzdmQyID0gMDsKKwor CWV4ZWNidWYuYnVmZmVyc19wdHIgPSAodWludHB0cl90KWdlbV9leGVjOworCWV4ZWNidWYuYnVm ZmVyX2NvdW50ID0gMTsKKwlleGVjYnVmLmJhdGNoX3N0YXJ0X29mZnNldCA9IDA7CisJZXhlY2J1 Zi5iYXRjaF9sZW4gPSA4OworCWV4ZWNidWYuY2xpcHJlY3RzX3B0ciA9IDA7CisJZXhlY2J1Zi5u dW1fY2xpcHJlY3RzID0gMDsKKwlleGVjYnVmLkRSMSA9IDA7CisJZXhlY2J1Zi5EUjQgPSAwOwor CWV4ZWNidWYuZmxhZ3MgPSBmbGFncyB8IEk5MTVfRVhFQ19TRUNVUkU7CisJaWYgKGN0eCAhPSBO VUxMKQorCXsKKwkJaTkxNV9leGVjYnVmZmVyMl9zZXRfY29udGV4dF9pZChleGVjYnVmLCAqKGlu dCopY3R4KTsKKwl9CisJZWxzZQorCXsKKwkJaTkxNV9leGVjYnVmZmVyMl9zZXRfY29udGV4dF9p ZChleGVjYnVmLCAwKTsKKwl9CisJZXhlY2J1Zi5yc3ZkMiA9IGZlbmNlX2luOworCisJcmV0ID0g ZHJtSW9jdGwoZmQsIERSTV9JT0NUTF9JOTE1X0dFTV9FWEVDQlVGRkVSMiwgJmV4ZWNidWYpOwor CWlmIChyZXQgPT0gMCAmJiBmZW5jZV9vdXQgIT0gTlVMTCkKKwkJKmZlbmNlX291dCA9IChpbnQp IChleGVjYnVmLnJzdmQyID4+IDMyKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBXcmFw cGVyIGZ1bmN0aW9uIGZvciBub3BfZXhlY193aXRoX2N0eCBmb3Igd2hlbiBjb250ZXh0IGlzIG5v dCBleHBsaWNpdAorICovCitzdGF0aWMgaW50IG5vcF9leGVjKHVuc2lnbmVkIGludCBmbGFncywg aW50IGZlbmNlX2luLCBpbnQgKmZlbmNlX291dCkKK3sKKwlyZXR1cm4gbm9wX2V4ZWNfd2l0aF9j dHgoTlVMTCwgZmxhZ3MsIGZlbmNlX2luLCBmZW5jZV9vdXQpOworfQorCisvKgorICogVGVzdCB0 byBzaG93IHRoYXQgc2VuZGluZyBhIGJhdGNoIGJ1ZmZlciB3aXRob3V0IHJlcXVlc3RpbmcgYSBm ZW5jZQorICogZG9lc24ndCByZXR1cm4gYSBmZW5jZS4KKyAqIEFzc3VtcHRpb25zOiBiYXRjaCBi dWZmZXIgd2FzIGV4ZWN1dGVkCisgKi8KK3N0YXRpYyB2b2lkIGZlbmNlX25vdF9yZXF1ZXN0ZWRf bm90X2NyZWF0ZWQodm9pZCkKK3sKKwlpbnQgZmVuY2U7CisKKwlpZ3RfYXNzZXJ0KG5vcF9leGVj KEk5MTVfRVhFQ19SRU5ERVIsIDAsICZmZW5jZSkgPT0gMCk7CisJaWd0X2Fzc2VydChmZW5jZSA9 PSAwKTsKKwlnZW1fc3luYyhmZCwgaGFuZGxlKTsKK30KKworLyoKKyAqIFRlc3QgdG8gc2hvdyB0 aGF0IHdlIGdldCBhIGZlbmNlIHdoZW4gb25lIGlzIHJlcXVlc3RlZC4KKyAqIEFzc3VtcHRpb25z OiA+IDAgPT0gdmFsaWQgZmVuY2UsIGZlbmNlIHdhcyBpbml0aWFsaXNlZCB0byA8PSAwCisgKi8K K3N0YXRpYyB2b2lkIGZlbmNlX2NyZWF0ZSh2b2lkKQoreworCWludCBmZW5jZTsKKworCWlndF9h c3NlcnQobm9wX2V4ZWMoSTkxNV9FWEVDX1JFTkRFUiB8IEk5MTVfRVhFQ19DUkVBVEVfRkVOQ0Us IDAsCisJCQkgICAgJmZlbmNlKSA9PSAwKTsKKwlpZ3RfYXNzZXJ0KGZlbmNlID4gMCk7IC8qIFpl cm8gaXMgYSB2YWxpZCBGRCBidXQgd2UgYXNzdW1lIGl0IHdpbGwKKwkJCQkgIGFsd2F5cyBiZSB0 YWtlbiBkdXJpbmcgSUdUIHJ1bnMgYW5kIGxpa2UgdGhpcworCQkJCSAgd2UgY2FuIGNhdGNoIG1v cmUgZXJyb3JzLiAqLworCisJY2xvc2UoZmVuY2UpOworCWdlbV9zeW5jKGZkLCBoYW5kbGUpOwor fQorCisvKgorICogVGVzdCB0byBzaG93IHRoYXQgYSByZXF1ZXN0ZWQgZmVuY2UgY2FuIGJlIHF1 ZXJpZWQgYW5kIGNvbWVzIGZyb20gdGhlCisgKiBjb3JyZWN0IGRyaXZlci4KKyAqIEFzc3VtcHRp b25zOiB2YWxpZCBmZW5jZSB2YWx1ZXMgYXJlID49IDAsIGZlbmNlIGluaXRpYWxpc2VkIHRvIDwg MAorICogICAgICAgICAgICAgIHF1ZXJpZWQgZmVuY2UgZGF0YSBpcyBzZW5zaWJsZQorICovCitz dGF0aWMgdm9pZCBmZW5jZV9kcml2ZXJfZGF0YSh2b2lkKQoreworCWludCBmZW5jZTsKKwljaGFy IGJ1Zls0MDk2XTsKKwlzdHJ1Y3Qgc3luY19mZW5jZV9pbmZvX2RhdGEgKmRhdGEgPQorCQkoc3Ry dWN0IHN5bmNfZmVuY2VfaW5mb19kYXRhICopYnVmOworCXN0cnVjdCBzeW5jX3B0X2luZm8gKnB0 ID0gKHN0cnVjdCBzeW5jX3B0X2luZm8gKikmZGF0YS0+cHRfaW5mbzsKKworCWlndF9hc3NlcnQo bm9wX2V4ZWMoSTkxNV9FWEVDX1JFTkRFUiB8IEk5MTVfRVhFQ19DUkVBVEVfRkVOQ0UsIDAsCisJ CQkgICAgJmZlbmNlKSA9PSAwKTsKKwlpZ3RfYXNzZXJ0KGZlbmNlID49IDApOworCisJZ2VtX3N5 bmMoZmQsIGhhbmRsZSk7CisKKwkvKiBSZWFkIHRoZSBzeW5jIGZlbmNlIGluZm8gYW5kIGNoZWNr IGl0IG1hdGNoZXMgb3VyIGRyaXZlciAqLworCWRhdGEtPmxlbiA9IHNpemVvZihidWYpOworCWln dF9hc3NlcnQoZ2V0X2ZlbmNlX2luZm8oZmVuY2UsIGRhdGEpID09IDApOworCWlndF9hc3NlcnQo c3RyY21wKHB0LT5kcml2ZXJfbmFtZSwgSTkxNV9EUklWRVJfTkFNRSkgPT0gMCk7CisKKwljbG9z ZShmZW5jZSk7Cit9CisKKy8qCisgKiBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IHRoZSBzdGF0dXMg b2YgYSBnaXZlbiBmZW5jZQorICogQ2FsbHMgdGhlIF9TWU5DX0lPQ19GRU5DRV9JTkZPIGlvY3Rs CisgKiBAZmVuY2UgRmVuY2Ugb2JqZWN0IHRvIGNoZWNrCisgKiBAcmV0dXJuIFN0YXR1cyBvZiBm ZW5jZQorICovCitzdGF0aWMgaW50IGdldF9mZW5jZV9zdGF0dXMoaW50IGZlbmNlKQoreworCWNo YXIgYnVmWzQwOTZdOworCXN0cnVjdCBzeW5jX2ZlbmNlX2luZm9fZGF0YSAqZGF0YSA9CisJCShz dHJ1Y3Qgc3luY19mZW5jZV9pbmZvX2RhdGEgKilidWY7CisKKwlkYXRhLT5sZW4gPSBzaXplb2Yo YnVmKTsKKwlpZ3RfYXNzZXJ0KGdldF9mZW5jZV9pbmZvKGZlbmNlLCBkYXRhKSA9PSAwKTsKKwor CXJldHVybiBkYXRhLT5zdGF0dXM7Cit9CisKKy8qCisgKiBUZXN0cyB0aGF0IGEgcmVxdWVzdGVk IGZlbmNlIGJlY29tZXMgc2lnbmFsbGVkLgorICogQXNzdW1wdGlvbnM6IHRoZSBmZW5jZSB3YXMg YWN0aXZlIGF0IHNvbWUgcG9pbnQsIGZlbmNlIHZhbHVlcyBldGMuCisgKi8KK3N0YXRpYyB2b2lk IGZlbmNlX3NpZ25hbGVkKHZvaWQpCit7CisJaW50IGZlbmNlLCBzdGF0dXM7CisJdW5zaWduZWQg aW50IGxvb3AgPSAxMDsKKworCWlndF9hc3NlcnQobm9wX2V4ZWMoSTkxNV9FWEVDX1JFTkRFUiB8 IEk5MTVfRVhFQ19DUkVBVEVfRkVOQ0UsIDAsCisJCQkgICAgJmZlbmNlKSA9PSAwKTsKKwlpZ3Rf YXNzZXJ0KGZlbmNlID4gMCk7CisKKwkvKiBNYWtlIHN1cmUgc3RhdHVzIGlzIGNvbXBsZXRlZCBh ZnRlciBhIHdoaWxlICovCisJc3RhdHVzID0gZ2V0X2ZlbmNlX3N0YXR1cyhmZW5jZSk7CisJd2hp bGUgKHN0YXR1cyA9PSBGRU5DRV9BQ1RJVkUgJiYgbG9vcC0tKSB7CisJCXVzbGVlcCgyMDAwMCk7 CisJCXN0YXR1cyA9IGdldF9mZW5jZV9zdGF0dXMoZmVuY2UpOworCX0KKwlpZ3RfYXNzZXJ0KHN0 YXR1cyA9PSBGRU5DRV9TSUdOQUxFRCk7CisKKwljbG9zZShmZW5jZSk7Cit9CisKKy8qCisgKiBI ZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIGEgYmxpdHRpbmcgYmF0Y2ggYnVmZmVyCisgKiBBc3N1 bWVzIHRoYXQgJ2JhdGNoJyBpcyBpbiBzY29wZQorICogQGRzdCBEZXN0aW5hdGlvbiBidWZmZXIg b2JqZWN0CisgKiBAc3JjIFNvdXJjZSBidWZmZXIgb2JqZWN0CisgKiBAd2lkdGggQmxpdCB3aWR0 aAorICogQGhlaWdodCBCbGl0IGhlaWdodAorICogQGRzdF9waXRjaCBEZXN0aW5hdGlvbiBwaXRj aAorICogQHNyY19waXRjaCBTb3VyY2UgcGl0Y2gKKyAqIFRPRE8gZGV0ZXJtaW5lIHdoZXRoZXIg dGhlc2UgaW5zdHJ1Y3Rpb25zIGFyZSBvayBmb3I6CisgKiBhKSBtdWx0aXBsZSBmbGF2b3VycyBv ZiBHZW4KKyAqIGIpIHB1YmxpYyBjb25zdW1wdGlvbgorICovCitzdGF0aWMgdm9pZCBibGl0X2Nv cHkoZHJtX2ludGVsX2JvICpkc3QsIGRybV9pbnRlbF9ibyAqc3JjLAorCQkgICAgICB1bnNpZ25l ZCBpbnQgd2lkdGgsIHVuc2lnbmVkIGludCBoZWlnaHQsCisJCSAgICAgIHVuc2lnbmVkIGludCBk c3RfcGl0Y2gsIHVuc2lnbmVkIGludCBzcmNfcGl0Y2gpCit7CisJQkxJVF9DT1BZX0JBVENIX1NU QVJUKDApOworCU9VVF9CQVRDSCgoMyA8PCAyNCkgfCAvKiAzMiBiaXRzICovCisJCSAgKDB4Y2Mg PDwgMTYpIHwgLyogY29weSBST1AgKi8KKwkJICBkc3RfcGl0Y2gpOworCU9VVF9CQVRDSCgwIDw8 IDE2IHwgMCk7CisJT1VUX0JBVENIKGhlaWdodCA8PCAxNiB8IHdpZHRoKTsKKwlPVVRfUkVMT0Nf RkVOQ0VEKGRzdCwgSTkxNV9HRU1fRE9NQUlOX1JFTkRFUiwgSTkxNV9HRU1fRE9NQUlOX1JFTkRF UiwgMCk7CisJT1VUX0JBVENIKDAgPDwgMTYgfCAwKTsKKwlPVVRfQkFUQ0goc3JjX3BpdGNoKTsK KwlPVVRfUkVMT0NfRkVOQ0VEKHNyYywgSTkxNV9HRU1fRE9NQUlOX1JFTkRFUiwgMCwgMCk7CisJ QURWQU5DRV9CQVRDSCgpOworCisJaWYgKGJhdGNoLT5nZW4gPj0gNikgeworCQlCRUdJTl9CQVRD SCgzLCAwKTsKKwkJT1VUX0JBVENIKFhZX1NFVFVQX0NMSVBfQkxUX0NNRCk7CisJCU9VVF9CQVRD SCgwKTsKKwkJT1VUX0JBVENIKDApOworCQlBRFZBTkNFX0JBVENIKCk7CisJfQorfQorCisjZGVm aW5lIE5TRUNfUEVSX1NFQyAxMDAwMDAwMDAwTAorI2RlZmluZSBVU0VDX1BFUl9TRUMgMTAwMDAw MEwKKworLyoKKyAqIEhlbHBlciBmdW5jdGlvbiB0byBnZW5lcmF0ZSBhbmQgc3VibWl0IGEgKHNl cmllcyBvZiA/KSBsYXJnZSBibGl0KHMpCisgKiBAbGltaXQgbnVtYmVyIG9mIHJlcGVhdGVkIGJs aXRzIGluIHRoZSBzYW1lIGJhdGNoIGJ1ZmZlcgorICogQHRpbWVvdXQgaWYgbm9uemVybywgd2Fp dCBvbiB0aGUgYm8gZm9yIHRpbWVvdXQgbnMKKyAqIEBmZW5jZV9pbiBwYXNzIGluIGZlbmNlIHRv IHVzZSBhcyBzeW5jIHBvaW50CisgKiBAZmVuY2Vfb3V0IHBvaW50ZXIgdG8gcGFzcyBiYWNrIGZl bmNlIGlmIHRpbWVvdXQgaXMgbm9uemVybworICogQHJldHVybiB6ZXJvIG9yIHZhbHVlIG9mIHRo ZSBibyB3YWl0IGNhbGwKKyAqLworc3RhdGljIGludCBfZW1pdF9kdW1teV9sb2FkX19iY3MoaW50 IGxpbWl0LCBpbnQgdGltZW91dCwgaW50IGZlbmNlX2luLCBpbnQgKmZlbmNlX291dCkKK3sKKwlp bnQgaSwgcmV0ID0gMDsKKwlkcm1faW50ZWxfYm8gKnNyY19ibywgKmRzdF9ibzsKKworCXNyY19i byA9IGRybV9pbnRlbF9ib19hbGxvYyhidWZtZ3IsICJkdW1teV9ibyIsIDIwNDgqMjA0OCo0LCA0 MDk2KTsKKwlpZ3RfYXNzZXJ0KHNyY19ibyk7CisKKwlkc3RfYm8gPSBkcm1faW50ZWxfYm9fYWxs b2MoYnVmbWdyLCAiZHVtbXlfYm8iLCAyMDQ4KjIwNDgqNCwgNDA5Nik7CisJaWd0X2Fzc2VydChk c3RfYm8pOworCisJZm9yIChpID0gMDsgaSA8IGxpbWl0OyBpKyspIHsKKwkJYmxpdF9jb3B5KGRz dF9ibywgc3JjX2JvLAorCQkJICAyMDQ4LCAyMDQ4LAorCQkJICAyMDQ4KjQsIDIwNDgqNCk7CisJ fQorCWludGVsX2JhdGNoYnVmZmVyX2ZsdXNoX2ZlbmNlKGJhdGNoLCBmZW5jZV9pbiwgdGltZW91 dCA+IDAgPyBOVUxMIDogZmVuY2Vfb3V0KTsKKworCWlmICh0aW1lb3V0ID4gMCkKKwkJcmV0ID0g ZHJtX2ludGVsX2dlbV9ib193YWl0KGRzdF9ibywgdGltZW91dCAqIE5TRUNfUEVSX1NFQyk7CisK Kwlkcm1faW50ZWxfYm9fdW5yZWZlcmVuY2Uoc3JjX2JvKTsKKwlkcm1faW50ZWxfYm9fdW5yZWZl cmVuY2UoZHN0X2JvKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBIZWxwZXIgZnVuY3Rp b24gdG8gZ2V0IGN1cnJlbnQgdGltZSBpbiB1c2VjcworICogQHJldHVybiBDdXJyZW50IHRpbWUg aW4gdXNlY3MKKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgZ2V0dGltZV91cyh2b2lkKQorewor CXN0cnVjdCB0aW1lc3BlYyB0czsKKworCWNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAm dHMpOworCisJcmV0dXJuIHRzLnR2X3NlYyAqIDEwMDAwMDAgKyB0cy50dl9uc2VjIC8gMTAwMDsK K30KKworLyoKKyAqIEhlbHBlciBmdW5jdGlvbiBmaW5kcyB0aGUgbGltaXQgdG8gZ2VuZXJhdGUg YSBzZWNvbmQncyB3b3J0aAorICogb2Ygc3VibWlzc2lvbiBhY3Rpdml0eSBvbiBhIGdpdmVuIHJp bmcgKGVuZ2luZSkKKyAqIEByaW5nX25hbWUgU3RyaW5nIHJlcHJlc2VudGluZyByaW5nIChlbmdp bmUpIG5hbWUKKyAqIEBlbWl0IFBvaW50ZXIgdG8gZnVuY3Rpb24gdGhhdCBnZW5lcmF0ZXMgYSB3 b3JrbG9hZAorICogQHJldHVybiBOdW1iZXIgb2Ygb3BlcmF0aW9ucyBwZXIgc2Vjb25kCisgKi8K K3N0YXRpYyBpbnQgY2FsaWJyYXRlX2R1bW15X2xvYWQoY29uc3QgY2hhciAqcmluZ19uYW1lLAor CQkJCWludCAoKmVtaXQpKGludCBsaW1pdCwgaW50IHRpbWVvdXQsIGludCBmZW5jZV9pbiwgaW50 ICpmZW5jZV9vdXQpKQoreworCXVuc2lnbmVkIGxvbmcgc3RhcnQ7CisJaW50IG9wcyA9IDE7CisK KwlzdGFydCA9IGdldHRpbWVfdXMoKTsKKworCWRvIHsKKwkJdW5zaWduZWQgbG9uZyBkaWZmOwor CQlpbnQgcmV0OworCisJCXJldCA9IGVtaXQoKG9wcysxKS8yLCAxMCwgLTEsIE5VTEwpOworCQlk aWZmID0gZ2V0dGltZV91cygpIC0gc3RhcnQ7CisKKwkJaWYgKHJldCB8fCBkaWZmIC8gVVNFQ19Q RVJfU0VDID49IDEpCisJCQlicmVhazsKKworCQlvcHMgKz0gb3BzOworCX0gd2hpbGUgKG9wcyA8 IDEwMDAwMCk7CisKKwlpZ3RfZGVidWcoIiVzIGR1bW15IGxvYWQgY2FsaWJyYXRlZDogJWQgb3Bl cmF0aW9ucyAvIHNlY29uZFxuIiwKKwkJICByaW5nX25hbWUsIG9wcyk7CisKKwlyZXR1cm4gb3Bz OworfQorCitzdGF0aWMgaW50IG9wc19wZXJfc2VjOworCisvKgorICogSGVscGVyIGZ1bmN0aW9u IHRvIHN1Ym1pdCBOIHNlY29uZHMgd29ydGggb2YgYmxpdHMgYW5kIGdlbmVyYXRlCisgKiBhIGZl bmNlIHRvIHdhaXQgb24uCisgKiBAc2Vjb25kcyBOdW1iZXIgb2Ygc2Vjb25kcyB3b3J0aCBvZiBv cGVyYXRpb25zIHRvIHN1Ym1pdAorICogQGZlbmNlX291dCBQb2ludGVyIHRvIHJlcXVlc3RlZCBm ZW5jZQorICovCitzdGF0aWMgdm9pZCBlbWl0X2R1bW15X2xvYWRfX2JjcyhpbnQgc2Vjb25kcywg aW50ICpmZW5jZV9vdXQpCit7CisJaWYgKG9wc19wZXJfc2VjID09IDApCisJCW9wc19wZXJfc2Vj ID0gY2FsaWJyYXRlX2R1bW15X2xvYWQoImJjcyIsCisJCQkJCQkgICBfZW1pdF9kdW1teV9sb2Fk X19iY3MpOworCisJX2VtaXRfZHVtbXlfbG9hZF9fYmNzKHNlY29uZHMgKiBvcHNfcGVyX3NlYywg MCwgLTEsIGZlbmNlX291dCk7Cit9CisKKy8qCisgKiBUZXN0cyB0aGF0IGZlbmNlcyBtYWtlIGEg dHJhbnNpdGlvbiBmcm9tIGFjdGl2ZSB0byBzaWduYWxsZWQKKyAqIEFzc3VtcHRpb25zOiB2YWxp ZCBmZW5jZSB2YWx1ZXMKKyAqLworc3RhdGljIHZvaWQgZmVuY2Vfc2lnbmFsKHZvaWQpCit7CisJ aW50IGZlbmNlOworCXVuc2lnbmVkIGludCBsb29wID0gMTAwMDsKKwlpbnQgc3RhdHVzOworCXVu c2lnbmVkIGxvbmcgc3RhcnQsIGVuZDsKKworCXN0YXJ0ID0gZ2V0dGltZV91cygpOworCisJLyog U3VibWl0IGEgc3Bpbm5pbmcgYmF0Y2ggKi8KKwllbWl0X2R1bW15X2xvYWRfX2JjcygyLCAmZmVu Y2UpOworCWlndF9hc3NlcnQoZmVuY2UgPiAwKTsKKworCS8qIE1ha2Ugc3VyZSBzdGF0dXMgaXMg YWN0aXZlIGFmdGVyIGEgd2hpbGUgKi8KKwl1c2xlZXAoMjAwMDApOworCXN0YXR1cyA9IGdldF9m ZW5jZV9zdGF0dXMoZmVuY2UpOworCWlndF9hc3NlcnQoc3RhdHVzID09IEZFTkNFX0FDVElWRSk7 CisKKwkvKiBNYWtlIHN1cmUgc3RhdHVzIGlzIGNvbXBsZXRlZCBhZnRlciBhIHdoaWxlICovCisJ c3RhdHVzID0gZ2V0X2ZlbmNlX3N0YXR1cyhmZW5jZSk7CisJd2hpbGUgKHN0YXR1cyA9PSBGRU5D RV9BQ1RJVkUgJiYgbG9vcC0tKSB7CisJCXVzbGVlcCgyMDAwMCk7CisJCXN0YXR1cyA9IGdldF9m ZW5jZV9zdGF0dXMoZmVuY2UpOworCX0KKwlpZ3RfYXNzZXJ0KHN0YXR1cyA9PSBGRU5DRV9TSUdO QUxFRCk7CisJZW5kID0gZ2V0dGltZV91cygpOworCisJcHJpbnRmKCJGZW5jZSB0b29rICVsZC4l MDZsZHNcbiIsIChlbmQgLSBzdGFydCkgLyAxMDAwMDAwLCAoZW5kIC0gc3RhcnQpICUgMTAwMDAw MCk7CisKKwljbG9zZShmZW5jZSk7Cit9CisKKy8qCisgKiBEdW1teSBhY3Rpb24gZm9yIHNpZ25h bCBjYXRjaGVyCisgKi8KK3N0YXRpYyB2b2lkIHNpZ25hbF9ub3AoaW50IHNpZykKK3sKK30KKwor LyoKKyAqIFRlc3QgdGhhdCB3ZSBjYW4gd2FpdCBvbiBhbiBhY3RpdmUgZmVuY2UgZm9yIGxlc3Mg dGhhbiB0aGUgdGltZSBpdAorICogdGFrZXMgdG8gY2xlYXIsIGFuZCB0aGVuIHdhaXQgZm9yIHRo ZSBmZW5jZSB0byBjbGVhciBwcm9wZXJseS4KKyAqLworc3RhdGljIHZvaWQgZmVuY2VfdGltZW91 dCh2b2lkKQoreworCWludCBmZW5jZTsKKwlpbnQgdGltZW91dCA9IDUwMDsgLyogaW4gbXMgKi8K KwlzdHJ1Y3Qgc2lnYWN0aW9uIHNpZ2FjdCwgb3JpZ19zaWdhY3Q7CisKKwkvKiBTdWJtaXQgYSBz cGlubmluZyBiYXRjaCAqLworCWVtaXRfZHVtbXlfbG9hZF9fYmNzKDIsICZmZW5jZSk7CisJaWd0 X2Fzc2VydChmZW5jZSA+IDApOworCisJLyogTWFrZSBzdXJlIHN0YXR1cyBpcyBhY3RpdmUgYWZ0 ZXIgYSB3aGlsZSAqLworCXVzbGVlcCgyMDAwMCk7CisJaWd0X2Fzc2VydChnZXRfZmVuY2Vfc3Rh dHVzKGZlbmNlKSA9PSBGRU5DRV9BQ1RJVkUpOworCisJLyogU2V0IHVwIHNpZ25hbCB0byBicmVh ayB0aGUgd2FpdCBpZiBicm9rZW4gKi8KKwltZW1zZXQoJnNpZ2FjdCwgMCwgc2l6ZW9mKHNpZ2Fj dCkpOworCXNpZ2FjdC5zYV9oYW5kbGVyID0gc2lnbmFsX25vcDsKKwlpZ3RfYXNzZXJ0KHNpZ2Fj dGlvbihTSUdBTFJNLCAmc2lnYWN0LCAmb3JpZ19zaWdhY3QpID09IDApOworCWFsYXJtKDEwKTsK KworCS8qIFdhaXQgb24gZmVuY2UgKi8KKwlpZ3RfYXNzZXJ0KHdhaXRfZmVuY2UoZmVuY2UsICZ0 aW1lb3V0KSA8IDApOworCWlndF9hc3NlcnQoZXJybm8gPT0gRVRJTUUpOworCisJLyogV2FpdCBm b3IgYmF0Y2ggY29tcGxldGlvbiAqLworCXRpbWVvdXQgPSAxMDAwMDA7CisJaWd0X2Fzc2VydCh3 YWl0X2ZlbmNlKGZlbmNlLCAmdGltZW91dCkgPT0gMCk7CisJaWd0X2Fzc2VydChnZXRfZmVuY2Vf c3RhdHVzKGZlbmNlKSA9PSBGRU5DRV9TSUdOQUxFRCk7CisKKwkvKiBSZXN0b3JlIGFuZCBjbGVh bnVwICovCisJYWxhcm0oMCk7CisJaWd0X2Fzc2VydChzaWdhY3Rpb24oU0lHQUxSTSwgJm9yaWdf c2lnYWN0LCBOVUxMKSA9PSAwKTsKKwljbG9zZShmZW5jZSk7Cit9CisKKy8qCisgKiBUZXN0cyB0 aGF0IHdlIGNhbiB3YWl0IGZvciBhIGZ1bGwgZmVuY2UgdGltZW91dCAocmVwZWF0PykKKyAqLwor c3RhdGljIHZvaWQgZmVuY2Vfd2FpdCh2b2lkKQoreworCWludCBmZW5jZTsKKwlpbnQgdGltZW91 dCA9IDQwMDA7IC8qIGluIG1zICovCisJc3RydWN0IHNpZ2FjdGlvbiBzaWdhY3QsIG9yaWdfc2ln YWN0OworCWludCByZXQ7CisKKwkvKiBTdWJtaXQgYSBzcGlubmluZyBiYXRjaCAqLworCWVtaXRf ZHVtbXlfbG9hZF9fYmNzKDEsICZmZW5jZSk7CisJaWd0X2Fzc2VydChmZW5jZSA+IDApOworCisJ LyogTWFrZSBzdXJlIHN0YXR1cyBpcyBhY3RpdmUgYWZ0ZXIgYSB3aGlsZSAqLworCXVzbGVlcCgy MDAwMCk7CisJaWd0X2Fzc2VydChnZXRfZmVuY2Vfc3RhdHVzKGZlbmNlKSA9PSBGRU5DRV9BQ1RJ VkUpOworCisJLyogU2V0IHVwIHNpZ25hbCB0byBicmVhayB0aGUgd2FpdCBpZiBicm9rZW4gKi8K KwltZW1zZXQoJnNpZ2FjdCwgMCwgc2l6ZW9mKHNpZ2FjdCkpOworCXNpZ2FjdC5zYV9oYW5kbGVy ID0gc2lnbmFsX25vcDsKKwlpZ3RfYXNzZXJ0KHNpZ2FjdGlvbihTSUdBTFJNLCAmc2lnYWN0LCAm b3JpZ19zaWdhY3QpID09IDApOworCWFsYXJtKDEwKTsKKworCS8qIFdhaXQgZm9yIGJhdGNoIGNv bXBsZXRpb24gKi8KKwlyZXQgPSB3YWl0X2ZlbmNlKGZlbmNlLCAmdGltZW91dCk7CisJaWd0X2Fz c2VydChyZXQgPT0gMCk7CisJaWd0X2Fzc2VydChnZXRfZmVuY2Vfc3RhdHVzKGZlbmNlKSA9PSBG RU5DRV9TSUdOQUxFRCk7CisKKwkvKiBSZXN0b3JlIGFuZCBjbGVhbnVwICovCisJYWxhcm0oMCk7 CisJaWd0X2Fzc2VydChzaWdhY3Rpb24oU0lHQUxSTSwgJm9yaWdfc2lnYWN0LCBOVUxMKSA9PSAw KTsKKwljbG9zZShmZW5jZSk7Cit9CisKKy8qCisgKiBUZXN0cyB0aGF0IGEgcHJldmlvdXNseSBy ZXF1ZXN0ZWQgZmVuY2UgY2FuIGJlIHN1Ym1pdHRlZCB3aXRoIGEgYmF0Y2gKKyAqIGJ1ZmZlci4g RG9lcyBub3QgbWFrZSBhbnkgY2hlY2tzIG9uIHRoZSBzZWNvbmQgZmVuY2UuCisgKi8KK3N0YXRp YyB2b2lkIGZlbmNlX3dhaXRfZmVuY2Uodm9pZCkKK3sKKwlpbnQgZmVuY2UsIGZlbmNlX2R1cDsK KwlpbnQgdGltZW91dCA9IDQwMDAwOyAvKiBpbiBtcyAqLworCXN0cnVjdCBzaWdhY3Rpb24gc2ln YWN0LCBvcmlnX3NpZ2FjdDsKKwlpbnQgcmV0OworCisJLyogU3VibWl0IGEgc3Bpbm5pbmcgYmF0 Y2ggKi8KKwllbWl0X2R1bW15X2xvYWRfX2JjcygyLCAmZmVuY2UpOworCWlndF9hc3NlcnQoZmVu Y2UgPiAwKTsKKworCWlndF9hc3NlcnQoZ2V0X2ZlbmNlX3N0YXR1cyhmZW5jZSkgPT0gRkVOQ0Vf QUNUSVZFKTsKKworCWZlbmNlX2R1cCA9IGR1cChmZW5jZSk7CisJX2VtaXRfZHVtbXlfbG9hZF9f YmNzKDEgKiBvcHNfcGVyX3NlYywgMCwgZmVuY2VfZHVwLCBOVUxMKTsKKworCS8qIE1ha2Ugc3Vy ZSBzdGF0dXMgaXMgYWN0aXZlIGFmdGVyIGEgd2hpbGUgKi8KKwl1c2xlZXAoMjAwMDApOworCWln dF9hc3NlcnQoZ2V0X2ZlbmNlX3N0YXR1cyhmZW5jZSkgPT0gRkVOQ0VfQUNUSVZFKTsKKworCS8q IFNldCB1cCBzaWduYWwgdG8gYnJlYWsgdGhlIHdhaXQgaWYgYnJva2VuICovCisJbWVtc2V0KCZz aWdhY3QsIDAsIHNpemVvZihzaWdhY3QpKTsKKwlzaWdhY3Quc2FfaGFuZGxlciA9IHNpZ25hbF9u b3A7CisJaWd0X2Fzc2VydChzaWdhY3Rpb24oU0lHQUxSTSwgJnNpZ2FjdCwgJm9yaWdfc2lnYWN0 KSA9PSAwKTsKKwlhbGFybSgxMCk7CisKKwkvKiBXYWl0IGZvciBiYXRjaCBjb21wbGV0aW9uICov CisJcmV0ID0gd2FpdF9mZW5jZShmZW5jZSwgJnRpbWVvdXQpOworCWlndF9hc3NlcnQocmV0ID09 IDApOworCWlndF9hc3NlcnQoZ2V0X2ZlbmNlX3N0YXR1cyhmZW5jZSkgPT0gRkVOQ0VfU0lHTkFM RUQpOworCisJLyogUmVzdG9yZSBhbmQgY2xlYW51cCAqLworCWFsYXJtKDApOworCWlndF9hc3Nl cnQoc2lnYWN0aW9uKFNJR0FMUk0sICZvcmlnX3NpZ2FjdCwgTlVMTCkgPT0gMCk7CisJY2xvc2Uo ZmVuY2UpOworCWNsb3NlKGZlbmNlX2R1cCk7Cit9CisKKy8qCisgKiBUZXN0cyB0aGF0IGEgcHJl dmlvdXNseSByZXF1ZXN0ZWQgZmVuY2UgY2FuIGJlIHN1Ym1pdHRlZCB3aXRoIGEgYmF0Y2gKKyAq IGJ1ZmZlci4gQ2hlY2tzIHRoYXQgYSBzaW11bHRhbmVvdXNseSByZXF1ZXN0ZWQgZmVuY2Ugc3Rp bGwgd29ya3MgYXMKKyAqIGV4cGVjdGVkLgorICovCitzdGF0aWMgdm9pZCBmZW5jZV93YWl0X2Zl bmNlMih2b2lkKQoreworCWludCBmZW5jZSwgZmVuY2VfZHVwOworCWludCBsYXN0ZmVuY2U7CisJ aW50IHRpbWVvdXQgPSA0MDAwMDsgLyogaW4gbXMgKi8KKwlzdHJ1Y3Qgc2lnYWN0aW9uIHNpZ2Fj dCwgb3JpZ19zaWdhY3Q7CisJaW50IHJldDsKKworCS8qIFN1Ym1pdCBhIHNwaW5uaW5nIGJhdGNo ICovCisJZW1pdF9kdW1teV9sb2FkX19iY3MoMiwgJmZlbmNlKTsKKwlpZ3RfYXNzZXJ0KGZlbmNl ID4gMCk7CisKKwlpZ3RfYXNzZXJ0KGdldF9mZW5jZV9zdGF0dXMoZmVuY2UpID09IEZFTkNFX0FD VElWRSk7CisKKwlmZW5jZV9kdXAgPSBkdXAoZmVuY2UpOworCV9lbWl0X2R1bW15X2xvYWRfX2Jj cygxICogb3BzX3Blcl9zZWMsIDAsIGZlbmNlX2R1cCwgJmxhc3RmZW5jZSk7CisKKwkvKiBNYWtl IHN1cmUgc3RhdHVzIGlzIGFjdGl2ZSBhZnRlciBhIHdoaWxlICovCisJdXNsZWVwKDIwMDAwKTsK KwlpZ3RfYXNzZXJ0KGdldF9mZW5jZV9zdGF0dXMoZmVuY2UpID09IEZFTkNFX0FDVElWRSk7CisJ aWd0X2Fzc2VydChnZXRfZmVuY2Vfc3RhdHVzKGxhc3RmZW5jZSkgPT0gRkVOQ0VfQUNUSVZFKTsK KworCS8qIFNldCB1cCBzaWduYWwgdG8gYnJlYWsgdGhlIHdhaXQgaWYgYnJva2VuICovCisJbWVt c2V0KCZzaWdhY3QsIDAsIHNpemVvZihzaWdhY3QpKTsKKwlzaWdhY3Quc2FfaGFuZGxlciA9IHNp Z25hbF9ub3A7CisJaWd0X2Fzc2VydChzaWdhY3Rpb24oU0lHQUxSTSwgJnNpZ2FjdCwgJm9yaWdf c2lnYWN0KSA9PSAwKTsKKwlhbGFybSgxMCk7CisKKwl1c2xlZXAoMjAwMDApOworCisJLyogV2Fp dCBmb3IgYmF0Y2ggY29tcGxldGlvbiAqLworCXJldCA9IHdhaXRfZmVuY2UoZmVuY2UsICZ0aW1l b3V0KTsKKwlpZ3RfYXNzZXJ0KHJldCA9PSAwKTsKKwlpZ3RfYXNzZXJ0KGdldF9mZW5jZV9zdGF0 dXMoZmVuY2UpID09IEZFTkNFX1NJR05BTEVEKTsKKworCS8qIENoZWNrIHRoZSBzZWNvbmQgdGFz ayBpcyBzdGlsbCBydW5uaW5nICovCisJaWd0X2Fzc2VydChnZXRfZmVuY2Vfc3RhdHVzKGxhc3Rm ZW5jZSkgPT0gRkVOQ0VfQUNUSVZFKTsKKworCXVzbGVlcCgyMDAwMCk7CisKKwkvKiBXYWl0IGZv ciBiYXRjaCBjb21wbGV0aW9uICovCisJcmV0ID0gd2FpdF9mZW5jZShsYXN0ZmVuY2UsICZ0aW1l b3V0KTsKKwlpZ3RfYXNzZXJ0KHJldCA9PSAwKTsKKwlpZ3RfYXNzZXJ0KGdldF9mZW5jZV9zdGF0 dXMobGFzdGZlbmNlKSA9PSBGRU5DRV9TSUdOQUxFRCk7CisKKwkvKiBSZXN0b3JlIGFuZCBjbGVh bnVwICovCisJYWxhcm0oMCk7CisJaWd0X2Fzc2VydChzaWdhY3Rpb24oU0lHQUxSTSwgJm9yaWdf c2lnYWN0LCBOVUxMKSA9PSAwKTsKKwljbG9zZShmZW5jZSk7CisJY2xvc2UoZmVuY2VfZHVwKTsK K30KKworLyoKKyAqIFRlc3QgdGhhdCBpOTE1IGNhbiB3YWl0IG9uIGEgdXNlci1jcmVhdGVkIGZl bmNlCisgKi8KK3N0YXRpYyB2b2lkIGZlbmNlX3VzZXJfZmVuY2Vfd2FpdCh2b2lkKQoreworCWlu dCBteWZlbmNlLCBjaGVja2ZlbmNlOworCWludCBteWZlbmNlZHVwOworCWludCByZXQ7CisJaW50 IHRpbWVvdXQgPSA0MDAwOyAvKiBpbiBtcyAqLworCisJLyogQ3JlYXRlIGEgZmVuY2Ugd2l0aCB0 aGUgdXNlciBzeW5jIGRldmljZSwgYXQgdGltZWxpbmUgb2Zmc2V0IDEwICovCisJaWd0X2Fzc2Vy dCh1c2VyX2NyZWF0ZV9mZW5jZSgmbXlmZW5jZSwgMTApID09IDApOworCWlndF9hc3NlcnQoZ2V0 X2ZlbmNlX3N0YXR1cyhteWZlbmNlKSA9PSBGRU5DRV9BQ1RJVkUpOworCisJLyogQ3JlYXRlIGEg Y29weSB0byBzdWJtaXQgdG8gdGhlIGRyaXZlciAqLworCW15ZmVuY2VkdXAgPSBkdXAobXlmZW5j ZSk7CisKKwkvKiBTdWJtaXQgZmVuY2Ugd2l0aCBkcml2ZXIgLSByZXF1ZXN0aW5nIGEgZmVuY2Ug YmFjayAqLworCW9wc19wZXJfc2VjID0gY2FsaWJyYXRlX2R1bW15X2xvYWQoImJjcyIsIF9lbWl0 X2R1bW15X2xvYWRfX2Jjcyk7CisJX2VtaXRfZHVtbXlfbG9hZF9fYmNzKDEgKiBvcHNfcGVyX3Nl YywgMCwgbXlmZW5jZWR1cCwgJmNoZWNrZmVuY2UpOworCisJLyogTWFrZSBzdXJlIG91ciB3b3Jr bG9hZCBpcyBzdGFsbGVkICovCisJaWd0X2Fzc2VydCh3YWl0X2ZlbmNlKGNoZWNrZmVuY2UsICZ0 aW1lb3V0KSA8IDApOworCWlndF9hc3NlcnQoZXJybm8gPT0gRVRJTUUpOworCisJLyogSW5jcmVt ZW50IHRoZSB0aW1lbGluZSB1bnRpbCB0aGUgdXNlciBmZW5jZSBpcyBzaWduYWxsZWQgKi8KKwly ZXQgPSBnZXRfZmVuY2Vfc3RhdHVzKG15ZmVuY2UpOworCXdoaWxlIChyZXQgIT0gRkVOQ0VfU0lH TkFMRUQpCisJeworCQlpZ3RfYXNzZXJ0KGdldF9mZW5jZV9zdGF0dXMoY2hlY2tmZW5jZSkgPT0g RkVOQ0VfQUNUSVZFKTsKKwkJaWd0X2Fzc2VydCh1c2VyX2luY190aW1lbGluZSgxKSA9PSAwKTsK KwkJcmV0ID0gZ2V0X2ZlbmNlX3N0YXR1cyhteWZlbmNlKTsKKwl9CisKKwkvKiBDaGVjayB0aGUg d29ya2xvYWQgaXMgc3RpbGwgYWN0aXZlICovCisJaWd0X2Fzc2VydChnZXRfZmVuY2Vfc3RhdHVz KGNoZWNrZmVuY2UpID09IEZFTkNFX0FDVElWRSk7CisKKwkvKiBDaGVjayB0aGF0IG91ciB3b3Jr bG9hZCB3aWxsIG5vdyBmaW5pc2ggKi8KKwlpZ3RfYXNzZXJ0KHdhaXRfZmVuY2UoY2hlY2tmZW5j ZSwgJnRpbWVvdXQpID09IDApOworCWlndF9hc3NlcnQoZ2V0X2ZlbmNlX3N0YXR1cyhjaGVja2Zl bmNlKSA9PSBGRU5DRV9TSUdOQUxFRCk7CisKKwkvKiBDbG9zZSB0aGUgZmVuY2UgKi8KKwljbG9z ZShteWZlbmNlKTsKK30KKworLyoKKyAqIFRlc3QgdGhhdCBpOTE1IGNhbiB3YWl0IG9uIGEgdXNl ci1jcmVhdGVkIGZlbmNlCisgKi8KK3N0YXRpYyB2b2lkIGZlbmNlX3VzZXJfZmVuY2VfbGVhayh2 b2lkKQoreworCWludCBteWZlbmNlLCBjaGVja2ZlbmNlOworCWludCBteWZlbmNlZHVwOworCWlu dCB0aW1lb3V0ID0gNTAwOyAvKiBpbiBtcyAqLworCisJcHJpbnRmKCAiKioqKioqKiBXQVJOSU5H ICoqKiBXQVJOSU5HICoqKiBXQVJOSU5HICoqKioqKipcbiIgKTsKKwlwcmludGYoICJVbnRpbCBr ZXJuZWwgc3luYyBjb2RlIGlzIGZpeGVkLCB0aGlzIHRlc3Qgd2lsbFxuIiApOworCXByaW50Zigg ImxlYWsgYmF0Y2ggYnVmZmVycyB0aGF0IGNhbiBuZXZlciBiZSBjb21wbGV0ZWQhXG4iICk7CisJ cHJpbnRmKCAiKioqKioqKiBXQVJOSU5HICoqKiBXQVJOSU5HICoqKiBXQVJOSU5HICoqKioqKipc biIgKTsKKwlyZXR1cm47CisKKwljbG9zZV9zd19zeW5jKCZ1c2VyX3N5bmNfb2JqKTsKKwlpZ3Rf YXNzZXJ0KGluaXRfc3dfc3luYygmdXNlcl9zeW5jX29iaikgPT0gMCk7CisKKwkvKiBDcmVhdGUg YSBmZW5jZSB3aXRoIHRoZSB1c2VyIHN5bmMgZGV2aWNlLCBhdCB0aW1lbGluZSBvZmZzZXQgMTAg Ki8KKwlpZ3RfYXNzZXJ0KHVzZXJfY3JlYXRlX2ZlbmNlKCZteWZlbmNlLCAxMCkgPT0gMCk7CisJ aWd0X2Fzc2VydChnZXRfZmVuY2Vfc3RhdHVzKG15ZmVuY2UpID09IEZFTkNFX0FDVElWRSk7CisK KwkvKiBDcmVhdGUgYSBjb3B5IHRvIHN1Ym1pdCB0byB0aGUgZHJpdmVyICovCisJbXlmZW5jZWR1 cCA9IGR1cChteWZlbmNlKTsKKworCS8qIFN1Ym1pdCBmZW5jZSB3aXRoIGRyaXZlciAtIHJlcXVl c3RpbmcgYSBmZW5jZSBiYWNrICovCisJX2VtaXRfZHVtbXlfbG9hZF9fYmNzKDEsIDAsIG15ZmVu Y2VkdXAsICZjaGVja2ZlbmNlKTsKKworCS8qIE1ha2Ugc3VyZSBvdXIgd29ya2xvYWQgaXMgc3Rh bGxlZCAqLworCWlndF9hc3NlcnQod2FpdF9mZW5jZShjaGVja2ZlbmNlLCAmdGltZW91dCkgPCAw KTsKKwlpZ3RfYXNzZXJ0KGVycm5vID09IEVUSU1FKTsKKworCS8qIENsb3NlIHRoZSBmZW5jZSB3 aXRob3V0IHNpZ25hbGxpbmcgaXQgKi8KKwljbG9zZShteWZlbmNlKTsKKworCS8qIENsb3NlIHRo ZSB0aW1lbGluZSBhbmQgbGVhayB0aGUgZmVuY2UgKi8KKwljbG9zZV9zd19zeW5jKCZ1c2VyX3N5 bmNfb2JqKTsKKworCS8qIENoZWNrIHRoYXQgb3VyIHdvcmtsb2FkIHdpbGwgbm93IGZpbmlzaCAq LworCXRpbWVvdXQgPSAxMDAwOyAvKiBpbiBtcyAqLworCWlndF9hc3NlcnQod2FpdF9mZW5jZShj aGVja2ZlbmNlLCAmdGltZW91dCkgPT0gMCk7CisJaWd0X2Fzc2VydChnZXRfZmVuY2Vfc3RhdHVz KGNoZWNrZmVuY2UpID09IEZFTkNFX1NJR05BTEVEKTsKK30KKworLyoKKyAqIFRlc3Qgb3V0LW9m LW9yZGVyIGZlbmNlIHNpZ25hbGxpbmcKKyAqIEEgc2VyaWVzIG9mIGJhdGNoIGJ1ZmZlcnMgYXJl IGNyZWF0ZWQgc28gdGhhdCB0aGV5IGFyZSBkZXBlbmRlbnQgb24gZmVuY2VzCisgKiB3aGljaCBh cmUgaW4gYSBkaWZmZXJlbnQgb3JkZXI6CisgKiAtIGJiWzBdIGlzIGRlcGVuZGVudCBvbiBmX3Vz ZXJbMV0KKyAqIC0gYmJbMV0gaXMgZGVwZW5kZW50IG9uIGZfdXNlclswXQorICovCitzdGF0aWMg dm9pZCBmZW5jZV9vb29fZmVuY2Uodm9pZCkKK3sKKwlpbnQgZl9vdXRbMl07CisJaW50IGZfdXNl clsyXTsKKwlpbnQgZl91c2VyX2R1cHNbMl07CisJaW50IHRpbWVvdXQgPSAyMDA7IC8qIGluIG1z ICovCisKKwljbG9zZV9zd19zeW5jKCZ1c2VyX3N5bmNfb2JqKTsKKwlpZ3RfYXNzZXJ0KGluaXRf c3dfc3luYygmdXNlcl9zeW5jX29iaikgPT0gMCk7CisKKwkvKiBDcmVhdGUgdXNlciBmZW5jZXMg Ki8KKwlpZ3RfYXNzZXJ0KHVzZXJfY3JlYXRlX2ZlbmNlKCZmX3VzZXJbMF0sIDEpID09IDApOwor CWlndF9hc3NlcnQodXNlcl9jcmVhdGVfZmVuY2UoJmZfdXNlclsxXSwgMikgPT0gMCk7CisKKwkv KiBDaGVjayB0aGV5IGFyZSBzdGlsbCBhY3RpdmUgKi8KKwlpZ3RfYXNzZXJ0KGdldF9mZW5jZV9z dGF0dXMoZl91c2VyWzBdKSA9PSBGRU5DRV9BQ1RJVkUpOworCWlndF9hc3NlcnQoZ2V0X2ZlbmNl X3N0YXR1cyhmX3VzZXJbMV0pID09IEZFTkNFX0FDVElWRSk7CisKKwkvKiBDcmVhdGUgZHVwbGlj YXRlcyBmb3Igc3VibWlzc2lvbiAqLworCWZfdXNlcl9kdXBzWzBdID0gZHVwKGZfdXNlclswXSk7 CisJZl91c2VyX2R1cHNbMV0gPSBkdXAoZl91c2VyWzFdKTsKKworCS8qIEdlbmVyYXRlIGJ1ZmZl ciBjaGFpbiAqLworCWlndF9hc3NlcnQobm9wX2V4ZWMoCisJCUk5MTVfRVhFQ19SRU5ERVIgfAor CQlJOTE1X0VYRUNfQ1JFQVRFX0ZFTkNFIHwKKwkJSTkxNV9FWEVDX1dBSVRfRkVOQ0UsCisJCWZf dXNlcl9kdXBzWzFdLCAmZl9vdXRbMF0pID09IDApOworCWlndF9hc3NlcnQobm9wX2V4ZWMoCisJ CUk5MTVfRVhFQ19SRU5ERVIgfAorCQlJOTE1X0VYRUNfQ1JFQVRFX0ZFTkNFIHwKKwkJSTkxNV9F WEVDX1dBSVRfRkVOQ0UsCisJCWZfdXNlcl9kdXBzWzBdLCAmZl9vdXRbMV0pID09IDApOworCisJ LyogV2FpdCBhbmQgY2hlY2sgYm90aCBhcmUgc3RpbGwgYWN0aXZlICovCisJdXNsZWVwKHRpbWVv dXQgKiAxMDAwKTsKKwlpZ3RfYXNzZXJ0KGdldF9mZW5jZV9zdGF0dXMoZl9vdXRbMF0pID09IEZF TkNFX0FDVElWRSk7CisJaWd0X2Fzc2VydChnZXRfZmVuY2Vfc3RhdHVzKGZfb3V0WzFdKSA9PSBG RU5DRV9BQ1RJVkUpOworCisJLyogU2lnbmFsIGZfdXNlclswXSAqLworCWlndF9hc3NlcnQodXNl cl9pbmNfdGltZWxpbmUoMSkgPT0gMCk7CisJaWd0X2Fzc2VydChnZXRfZmVuY2Vfc3RhdHVzKGZf dXNlclswXSkgPT0gRkVOQ0VfU0lHTkFMRUQpOworCisJLyogQ2hlY2sgZl9vdXRbMC4uMV0gcmVt YWluIGFjdGl2ZSAqLworCXVzbGVlcCh0aW1lb3V0ICogMTAwMCk7CisJaWd0X2Fzc2VydChnZXRf ZmVuY2Vfc3RhdHVzKGZfb3V0WzBdKSA9PSBGRU5DRV9BQ1RJVkUpOworCWlndF9hc3NlcnQoZ2V0 X2ZlbmNlX3N0YXR1cyhmX291dFsxXSkgPT0gRkVOQ0VfQUNUSVZFKTsKKworCS8qIFNpZ25hbCBm X3VzZXJbMV0gKi8KKwlpZ3RfYXNzZXJ0KHVzZXJfaW5jX3RpbWVsaW5lKDEpID09IDApOworCWln dF9hc3NlcnQoZ2V0X2ZlbmNlX3N0YXR1cyhmX3VzZXJbMV0pID09IEZFTkNFX1NJR05BTEVEKTsK KworCS8qIENoZWNrIGZfb3V0WzAuLjFdIHNpZ25hbCBhcyBleHBlY3RlZCAqLworCWlndF9hc3Nl cnQod2FpdF9mZW5jZShmX291dFswXSwgJnRpbWVvdXQpID09IDApOworCWlndF9hc3NlcnQod2Fp dF9mZW5jZShmX291dFsxXSwgJnRpbWVvdXQpID09IDApOworCWlndF9hc3NlcnQoZ2V0X2ZlbmNl X3N0YXR1cyhmX291dFswXSkgPT0gRkVOQ0VfU0lHTkFMRUQpOworCWlndF9hc3NlcnQoZ2V0X2Zl bmNlX3N0YXR1cyhmX291dFsxXSkgPT0gRkVOQ0VfU0lHTkFMRUQpOworCisJLyogQ2xvc2UgZmVu Y2VzICovCisJY2xvc2UoZl91c2VyWzBdKTsKKwljbG9zZShmX3VzZXJbMV0pOworfQorCisvKgor ICogVGVzdCB0byBzaG93IHRoYXQgZmVuY2VzIGZyb20gZHJtIGNhbiBiZSBtZXJnZWQgYW5kIHdh aXRlZCBvbiBhcyBvbmUKKyAqLworc3RhdGljIHZvaWQgZmVuY2VfbWVyZ2Uodm9pZCkKK3sKKwlp bnQgc3RhcnRfZmVuY2UsIHN0YXJ0X2ZlbmNlX2R1cDsKKwlpbnQgZmVuY2VfbWVyZ2VkX2V2ZW4s IGZlbmNlX21lcmdlZF9vZGQ7CisJaW50IGZlbmNlX291dFs0XTsKKwlpbnQgZmVuY2Vfb3V0X2R1 cFs0XTsKKwlpbnQgZmVuY2VfZmluYWw7CisKKwlpbnQgd2FpdF90aW1lb3V0LCBpOworCisJY2xv c2Vfc3dfc3luYygmdXNlcl9zeW5jX29iaik7CisJaWd0X2Fzc2VydChpbml0X3N3X3N5bmMoJnVz ZXJfc3luY19vYmopID09IDApOworCisJaWd0X2Fzc2VydCh1c2VyX2NyZWF0ZV9mZW5jZSgmc3Rh cnRfZmVuY2UsIDEpID09IDApOworCXN0YXJ0X2ZlbmNlX2R1cCA9IGR1cChzdGFydF9mZW5jZSk7 CisKKwkvKiBTdWJtaXQgYW5kIHJlcXVlc3QgZmVuY2VzIGZvciBhIGNoYWluIG9mIHdvcmtsb2Fk cyAqLworCW9wc19wZXJfc2VjID0gY2FsaWJyYXRlX2R1bW15X2xvYWQoImJjcyIsIF9lbWl0X2R1 bW15X2xvYWRfX2Jjcyk7CisJX2VtaXRfZHVtbXlfbG9hZF9fYmNzKDEgKiBvcHNfcGVyX3NlYywg MCwKKwkJCSAgICAgIHN0YXJ0X2ZlbmNlX2R1cCwgJmZlbmNlX291dFswXSk7CisJZmVuY2Vfb3V0 X2R1cFswXSA9IGR1cChmZW5jZV9vdXRbMF0pOworCisJZm9yIChpID0gMTsgaSA8IDQ7IGkrKykK Kwl7CisJCV9lbWl0X2R1bW15X2xvYWRfX2JjcygxICogb3BzX3Blcl9zZWMsIDAsIGZlbmNlX291 dF9kdXBbaSAtIDFdLAorCQkJCSAgICAgICZmZW5jZV9vdXRbaV0pOworCQlmZW5jZV9vdXRfZHVw W2ldID0gZHVwKGZlbmNlX291dFtpXSk7CisJfQorCisJLyogTWVyZ2UgYWx0ZXJuYXRlIGRybSBm ZW5jZXMgaW50byBldmVuIGFuZCBvZGQgZmVuY2VzICovCisJaWd0X2Fzc2VydChtZXJnZV9mZW5j ZSgmZmVuY2VfbWVyZ2VkX2V2ZW4sCisJCQkgICAgICAgZmVuY2Vfb3V0WzBdLCBmZW5jZV9vdXRb Ml0pID09IDApOworCWlndF9hc3NlcnQobWVyZ2VfZmVuY2UoJmZlbmNlX21lcmdlZF9vZGQsCisJ CQkgICAgICAgZmVuY2Vfb3V0WzFdLCBmZW5jZV9vdXRbM10pID09IDApOworCisJLyogQ3JlYXRl IGFkZGl0aW9uYWwgYmF0Y2ggdG8gd2FpdCBvbiB0aGUgbmV3IG1lcmdlZCBmZW5jZXMgKi8KKwlp Z3RfYXNzZXJ0KG5vcF9leGVjKAorCQlJOTE1X0VYRUNfUkVOREVSIHwKKwkJSTkxNV9FWEVDX0NS RUFURV9GRU5DRSB8CisJCUk5MTVfRVhFQ19XQUlUX0ZFTkNFLAorCQlkdXAoZmVuY2VfbWVyZ2Vk X29kZCksICZmZW5jZV9maW5hbCkgPT0gMCk7CisKKwkvKiBTaWduYWwgdGhlIHVzZXIgZmVuY2Ug dG8gYmVnaW4gdGhlIGNoYWluICovCisJaWd0X2Fzc2VydCh1c2VyX2luY190aW1lbGluZSgxKSA9 PSAwKTsKKworCS8qIFdhaXQgb24gZWFjaCBkcm0gZmVuY2UgYW5kIGNoZWNrIG1lcmdlZCBmZW5j ZSBzdGF0dXNlcyAqLworCXdhaXRfdGltZW91dCA9IDE1MDAwOworCisJLyogQWZ0ZXIgYmF0Y2gg MCwgYWxsIHNob3VsZCBzdGlsbCBiZSBhY3RpdmUgKi8KKwlpZ3RfYXNzZXJ0KHdhaXRfZmVuY2Uo ZmVuY2Vfb3V0WzBdLCAmd2FpdF90aW1lb3V0KSA9PSAwKTsKKwlpZ3RfYXNzZXJ0KGdldF9mZW5j ZV9zdGF0dXMoZmVuY2Vfb3V0WzBdKSA9PSBGRU5DRV9TSUdOQUxFRCk7CisJaWd0X2Fzc2VydChn ZXRfZmVuY2Vfc3RhdHVzKGZlbmNlX21lcmdlZF9ldmVuKSA9PSBGRU5DRV9BQ1RJVkUpOworCWln dF9hc3NlcnQoZ2V0X2ZlbmNlX3N0YXR1cyhmZW5jZV9tZXJnZWRfb2RkKSA9PSBGRU5DRV9BQ1RJ VkUpOworCWlndF9hc3NlcnQoZ2V0X2ZlbmNlX3N0YXR1cyhmZW5jZV9maW5hbCkgPT0gRkVOQ0Vf QUNUSVZFKTsKKworCS8qIEFmdGVyIGJhdGNoIDEsIGFsbCBzaG91bGQgc3RpbGwgYmUgYWN0aXZl ICovCisJaWd0X2Fzc2VydCh3YWl0X2ZlbmNlKGZlbmNlX291dFsxXSwgJndhaXRfdGltZW91dCkg PT0gMCk7CisJaWd0X2Fzc2VydChnZXRfZmVuY2Vfc3RhdHVzKGZlbmNlX291dFsxXSkgPT0gRkVO Q0VfU0lHTkFMRUQpOworCWlndF9hc3NlcnQoZ2V0X2ZlbmNlX3N0YXR1cyhmZW5jZV9tZXJnZWRf ZXZlbikgPT0gRkVOQ0VfQUNUSVZFKTsKKwlpZ3RfYXNzZXJ0KGdldF9mZW5jZV9zdGF0dXMoZmVu Y2VfbWVyZ2VkX29kZCkgPT0gRkVOQ0VfQUNUSVZFKTsKKwlpZ3RfYXNzZXJ0KGdldF9mZW5jZV9z dGF0dXMoZmVuY2VfZmluYWwpID09IEZFTkNFX0FDVElWRSk7CisKKwkvKiBBZnRlciBiYXRjaCAy LCBmZW5jZV9tZXJnZWRfZXZlbiBzaG91bGQgYmUgY29tcGxldGUgKi8KKwlpZ3RfYXNzZXJ0KHdh aXRfZmVuY2UoZmVuY2VfbWVyZ2VkX2V2ZW4sICZ3YWl0X3RpbWVvdXQpID09IDApOworCWlndF9h c3NlcnQoZ2V0X2ZlbmNlX3N0YXR1cyhmZW5jZV9vdXRbMl0pID09IEZFTkNFX1NJR05BTEVEKTsK KwlpZ3RfYXNzZXJ0KGdldF9mZW5jZV9zdGF0dXMoZmVuY2VfbWVyZ2VkX2V2ZW4pID09IEZFTkNF X1NJR05BTEVEKTsKKwlpZ3RfYXNzZXJ0KGdldF9mZW5jZV9zdGF0dXMoZmVuY2VfbWVyZ2VkX29k ZCkgPT0gRkVOQ0VfQUNUSVZFKTsKKwlpZ3RfYXNzZXJ0KGdldF9mZW5jZV9zdGF0dXMoZmVuY2Vf ZmluYWwpID09IEZFTkNFX0FDVElWRSk7CisKKwkvKiBBZnRlciBiYXRjaCAzLCBhbGwgZmVuY2Vz IHNob3VsZCBiZSBjb21wbGV0ZSAqLworCWlndF9hc3NlcnQod2FpdF9mZW5jZShmZW5jZV9tZXJn ZWRfb2RkLCAmd2FpdF90aW1lb3V0KSA9PSAwKTsKKwlpZ3RfYXNzZXJ0KGdldF9mZW5jZV9zdGF0 dXMoZmVuY2Vfb3V0WzNdKSA9PSBGRU5DRV9TSUdOQUxFRCk7CisJaWd0X2Fzc2VydChnZXRfZmVu Y2Vfc3RhdHVzKGZlbmNlX21lcmdlZF9ldmVuKSA9PSBGRU5DRV9TSUdOQUxFRCk7CisJaWd0X2Fz c2VydChnZXRfZmVuY2Vfc3RhdHVzKGZlbmNlX21lcmdlZF9vZGQpID09IEZFTkNFX1NJR05BTEVE KTsKKworCS8qIE5vcCBpcyB0b28gc2hvcnQgdG8gc2VlIHdoZXRoZXIgaXQgd2FzIGFjdGl2ZSBh ZnRlciBtZXJnZWQgZmVuY2UKKwkgICB3YXMgc2lnbmFsbGVkICovCisJaWd0X2Fzc2VydCh3YWl0 X2ZlbmNlKGZlbmNlX2ZpbmFsLCAmd2FpdF90aW1lb3V0KSA9PSAwKTsKKwlpZ3RfYXNzZXJ0KGdl dF9mZW5jZV9zdGF0dXMoZmVuY2VfZmluYWwpID09IEZFTkNFX1NJR05BTEVEKTsKKworCS8qIENs b3NlICovCisJY2xvc2Uoc3RhcnRfZmVuY2UpOworfQorCisvKgorICogVGVzdCBmb3IgYmVoYXZp b3VyIG9mIG11bHRpcGxlIGJhdGNoZXMgZGVwZW5kZW50IG9uIHNpbmdsZSBmZW5jZQorICogU2hv dyB0aGF0IHNpZ25hbGxpbmcgdGhlIGZlbmNlIGRvZXMgbm90IG92ZXJyaWRlIG90aGVyIGRlcGVu ZGVuY2llcworICogU2NlbmFyaW8gQTogU2FtZSBjb250ZXh0LCBtdWx0aXBsZSBiYXRjaGVzIGNv bXBsZXRlIGluIHN1Ym1pc3Npb24gb3JkZXIKKyAqICAgICAgICAgICAgIGRlc3BpdGUgYmVpbmcg dHJpZ2dlcmVkIGJ5IHNhbWUgdXNlciBmZW5jZQorICogU2NlbmFyaW8gQjogQmF0Y2hlcyBpbiBk aWZmZXJlbnQgY29udGV4dHMgcmVsaWFudCBvbiBzYW1lIGZlbmNlIGJ1dCB3YWl0aW5nCisgKiAg ICAgICAgICAgICBvbiBlYXJsaWVyIHdvcmsgaW4gc2FtZSBjb250ZXh0CisgKi8KK3N0YXRpYyB2 b2lkIGZlbmNlX211bHRpZGVwZW5kZW5jeSh2b2lkKQoreworCWludCBzdGFydF9mZW5jZTsKKwlp bnQgc3RhcnRfZmVuY2VfZHVwLCBzdGFydF9mZW5jZV9kdXAyOworCWludCBmZW5jZV9vdXRbMl07 CisJaW50IHdhaXRfdGltZW91dDsKKworCWRybV9pbnRlbF9jb250ZXh0ICpjdHhbMl07CisKKwkv KiBTY2VuYXJpbyBBICovCisJY2xvc2Vfc3dfc3luYygmdXNlcl9zeW5jX29iaik7CisJaWd0X2Fz c2VydChpbml0X3N3X3N5bmMoJnVzZXJfc3luY19vYmopID09IDApOworCisJLyogQ3JlYXRlIHVz ZXIgZmVuY2UgdG8gdHJpZ2dlciAqLworCWlndF9hc3NlcnQodXNlcl9jcmVhdGVfZmVuY2UoJnN0 YXJ0X2ZlbmNlLCAxKSA9PSAwKTsKKwlzdGFydF9mZW5jZV9kdXAgPSBkdXAoc3RhcnRfZmVuY2Up OworCXN0YXJ0X2ZlbmNlX2R1cDIgPSBkdXAoc3RhcnRfZmVuY2UpOworCisJLyogQ3JlYXRlIGxv bmcgd29ya2xvYWRzLCBkZXBlbmRlbnQgb24gc2FtZSBmZW5jZSAqLworCW9wc19wZXJfc2VjID0g Y2FsaWJyYXRlX2R1bW15X2xvYWQoImJjcyIsIF9lbWl0X2R1bW15X2xvYWRfX2Jjcyk7CisJX2Vt aXRfZHVtbXlfbG9hZF9fYmNzKDMgKiBvcHNfcGVyX3NlYywgMCwKKwkJCSAgICAgIHN0YXJ0X2Zl bmNlX2R1cCwgJmZlbmNlX291dFswXSk7CisJX2VtaXRfZHVtbXlfbG9hZF9fYmNzKDEgKiBvcHNf cGVyX3NlYywgMCwKKwkJCSAgICAgIHN0YXJ0X2ZlbmNlX2R1cDIsICZmZW5jZV9vdXRbMV0pOwor CisJLyogTm90ZSB0aGF0IGZpcnN0IHdvcmtsb2FkIGlzIG11Y2ggbG9uZ2VyIHRoYW4gdGhlIGZp cnN0CisJICogdG8gaGVscCBtYWtlIHN1cmUgdGhhdCBpdCBjb21wbGV0ZXMgZmlyc3QgKi8KKwkv KiBTaWduYWwgZmVuY2UgKi8KKwlpZ3RfYXNzZXJ0KHVzZXJfaW5jX3RpbWVsaW5lKDEpID09IDAp OworCS8qIENoZWNrIHRoYXQgd29ya2xvYWQgZmlyc3Qgc3VibWl0dGVkIGNvbXBsZXRlcyBmaXJz dCAqLworCXdhaXRfdGltZW91dCA9IDQ1MDAwOworCWlndF9hc3NlcnQod2FpdF9mZW5jZShmZW5j ZV9vdXRbMF0sICZ3YWl0X3RpbWVvdXQpID09IDApOworCWlndF9hc3NlcnQoZ2V0X2ZlbmNlX3N0 YXR1cyhmZW5jZV9vdXRbMF0pID09IEZFTkNFX1NJR05BTEVEKTsKKwlpZ3RfYXNzZXJ0KGdldF9m ZW5jZV9zdGF0dXMoZmVuY2Vfb3V0WzFdKSA9PSBGRU5DRV9BQ1RJVkUpOworCisJaWd0X2Fzc2Vy dCh3YWl0X2ZlbmNlKGZlbmNlX291dFsxXSwgJndhaXRfdGltZW91dCkgPT0gMCk7CisJaWd0X2Fz c2VydChnZXRfZmVuY2Vfc3RhdHVzKGZlbmNlX291dFsxXSkgPT0gRkVOQ0VfU0lHTkFMRUQpOwor CisJY2xvc2Uoc3RhcnRfZmVuY2UpOworCisJaWYgKGJhdGNoLT5nZW4gPCA4KQorCXsKKwkJcHJp bnRmKCJTa2lwcGluZyBMUkMtcmVsYXRlZCB0ZXN0c1xuIik7CisJCXJldHVybjsKKwl9CisKKwkv KiBTY2VuYXJpbyBCICovCisJY2xvc2Vfc3dfc3luYygmdXNlcl9zeW5jX29iaik7CisJaWd0X2Fz c2VydChpbml0X3N3X3N5bmMoJnVzZXJfc3luY19vYmopID09IDApOworCisJLyogQ3JlYXRlIHVz ZXIgZmVuY2UgdG8gdHJpZ2dlciAqLworCWlndF9hc3NlcnQodXNlcl9jcmVhdGVfZmVuY2UoJnN0 YXJ0X2ZlbmNlLCAxKSA9PSAwKTsKKwlzdGFydF9mZW5jZV9kdXAgPSBkdXAoc3RhcnRfZmVuY2Up OworCXN0YXJ0X2ZlbmNlX2R1cDIgPSBkdXAoc3RhcnRfZmVuY2UpOworCisJLyogQ3JlYXRlIGNv bnRleHRzICovCisJaWd0X2Fzc2VydCgoY3R4WzBdID0gZHJtX2ludGVsX2dlbV9jb250ZXh0X2Ny ZWF0ZShidWZtZ3IpKSAhPSBOVUxMKTsKKwlpZ3RfYXNzZXJ0KChjdHhbMV0gPSBkcm1faW50ZWxf Z2VtX2NvbnRleHRfY3JlYXRlKGJ1Zm1ncikpICE9IE5VTEwpOworCS8qIENyZWF0ZSBsb25nIHdv cmtsb2FkcyBvbiBkaWZmZXJlbnQgY29udGV4dHMgKi8KKwkvKiBUaGV5IGFyZSBkZXBlbmRlbnQg b24gdGhlIHNhbWUgZmVuY2UgKi8KKwlvcHNfcGVyX3NlYyA9IGNhbGlicmF0ZV9kdW1teV9sb2Fk KCJiY3MiLCBfZW1pdF9kdW1teV9sb2FkX19iY3MpOworCWludGVsX2JhdGNoYnVmZmVyX3NldF9j b250ZXh0KGJhdGNoLCBjdHhbMF0pOworCV9lbWl0X2R1bW15X2xvYWRfX2JjcygzICogb3BzX3Bl cl9zZWMsIDAsCisJCQkgICAgICBzdGFydF9mZW5jZV9kdXAsICZmZW5jZV9vdXRbMF0pOworCWlu dGVsX2JhdGNoYnVmZmVyX3NldF9jb250ZXh0KGJhdGNoLCBjdHhbMV0pOworCV9lbWl0X2R1bW15 X2xvYWRfX2JjcygxICogb3BzX3Blcl9zZWMsIDAsCisJCQkgICAgICBzdGFydF9mZW5jZV9kdXAy LCAmZmVuY2Vfb3V0WzFdKTsKKwkvKiBTaWduYWwgZmVuY2UgKi8KKwlpZ3RfYXNzZXJ0KHVzZXJf aW5jX3RpbWVsaW5lKDEpID09IDApOworCisJaWd0X2Fzc2VydCh3YWl0X2ZlbmNlKGZlbmNlX291 dFswXSwgJndhaXRfdGltZW91dCkgPT0gMCk7CisJaWd0X2Fzc2VydChnZXRfZmVuY2Vfc3RhdHVz KGZlbmNlX291dFswXSkgPT0gRkVOQ0VfU0lHTkFMRUQpOworCWlndF9hc3NlcnQoZ2V0X2ZlbmNl X3N0YXR1cyhmZW5jZV9vdXRbMV0pID09IEZFTkNFX0FDVElWRSk7CisKKwlpZ3RfYXNzZXJ0KHdh aXRfZmVuY2UoZmVuY2Vfb3V0WzFdLCAmd2FpdF90aW1lb3V0KSA9PSAwKTsKKwlpZ3RfYXNzZXJ0 KGdldF9mZW5jZV9zdGF0dXMoZmVuY2Vfb3V0WzFdKSA9PSBGRU5DRV9TSUdOQUxFRCk7CisKKwlk cm1faW50ZWxfZ2VtX2NvbnRleHRfZGVzdHJveShjdHhbMF0pOworCWRybV9pbnRlbF9nZW1fY29u dGV4dF9kZXN0cm95KGN0eFsxXSk7CisKKwljbG9zZShzdGFydF9mZW5jZSk7Cit9CisKKy8qCisg KiBRdWljayBhbmQgZGlydHkgdGVzdCB0byBicmVhayB0aGluZ3MgYnkgc2V0dGluZyB1cCBhIGRl cGVuZGVuY3kgb24gYSB1c2VyCisgKiBmZW5jZSBhbmQgdGhlbiBmYWlsaW5nIHRvIHNpZ25hbCBp dC4KKyAqIFRoYXQncyB0aGUgdGhlb3J5IGFueXdheSAtIGl0IGRvZXNuJ3Qgc2VlbSB0byBjYXVz ZSB0b28gbWFueSBwcm9ibGVtcworICovCitzdGF0aWMgdm9pZCBmZW5jZV91c2VyX2ZvcmdldCh2 b2lkKQoreworCWludCBteWZlbmNlOworCWludCBmZW5jZV9vdXQ7CisJaW50IHRpbWVvdXQ7CisK KwkvKiBSZXN0YXJ0IG91ciBzeW5jIGRldmljZSB0byByZXNldCB0aGUgdGltZWxpbmUgdG8gemVy byAqLworCS8qIFRoaXMgaXMgYSBzaG9ydGNvbWluZyBvZiB0aGUgbWluaS1hcGkgYXQgdGhlIHRv cCBvZiB0aGlzIGZpbGUgKi8KKwljbG9zZV9zd19zeW5jKCZ1c2VyX3N5bmNfb2JqKTsKKwlpZ3Rf YXNzZXJ0KGluaXRfc3dfc3luYygmdXNlcl9zeW5jX29iaikgPT0gMCk7CisKKwkvKiBDcmVhdGUg YSB1c2VyIGZlbmNlIGF0IHN0ZXAgMSAqLworCWlndF9hc3NlcnQodXNlcl9jcmVhdGVfZmVuY2Uo Jm15ZmVuY2UsIDEpID09IDApOworCWlndF9hc3NlcnQoZ2V0X2ZlbmNlX3N0YXR1cyhteWZlbmNl KSA9PSBGRU5DRV9BQ1RJVkUpOworCisJLyogQ3JlYXRlIGEgc3VibWlzc2lvbiBkZXBlbmRlbnQg b24gdGhpcyBmZW5jZSAqLworCWlndF9hc3NlcnQobm9wX2V4ZWMoCisJCUk5MTVfRVhFQ19SRU5E RVIgfAorCQlJOTE1X0VYRUNfQ1JFQVRFX0ZFTkNFIHwKKwkJSTkxNV9FWEVDX1dBSVRfRkVOQ0Us CisJCWR1cChteWZlbmNlKSwgJmZlbmNlX291dCkgPT0gMCk7CisKKwkvKiBXYWl0IG9uIG91ciBv dXRwdXQgZmVuY2UgKi8KKwl0aW1lb3V0ID0gMTAwMDA7IC8qIGluIG1zICovCisJaWd0X2Fzc2Vy dCh3YWl0X2ZlbmNlKGZlbmNlX291dCwgJnRpbWVvdXQpICE9IDApOworCWlndF9hc3NlcnQoZ2V0 X2ZlbmNlX3N0YXR1cyhmZW5jZV9vdXQpID09IEZFTkNFX0FDVElWRSk7CisKKwkvKiBJZiB3ZSBy ZWFjaGVkIGhlcmUsIHRoZW4gd2Uga25vdyB0aGF0IHRoZSBkcml2ZXIgaXMgc3RpbGwgd2FpdGlu ZyAqLworCS8qIFRoaXMgd2lsbCBibG9jayBldmVyeXRoaW5nIG9uIHRoZSByZW5kZXIncyBkZWZh dWx0IGNvbnRleHQgKi8KKwkvKiBUbyBzaWduYWwgb3VyIHVzZXIgZmVuY2UsIGFkdmFuY2UgdGhl IHRpbWVsaW5lIGJ5IG9uZTogKi8KKwkvKiBpZ3RfYXNzZXJ0KHVzZXJfaW5jX3RpbWVsaW5lKDEp ID09IDApOyAqLworCS8qIENsZWFuIHVwIHRoZSBmZW5jZSB3ZSBtYWRlIC0gbm90IHN1cmUgd2hl dGhlciB0aGlzIGlzIG5lY2Vzc2FyeSAqLworCWNsb3NlKG15ZmVuY2UpOworfQorCisvKgorICog VGVzdCB0byBzaG93IHRoYXQgZmVuY2VzIGNhbiBiZSB1c2VkIGFjcm9zcyBtdWx0aXBsZSBlbmdp bmVzCisgKi8KK3N0YXRpYyB2b2lkIGZlbmNlX211bHRpZW5naW5lKHZvaWQpCit7CisJaW50IHN0 YXJ0X2ZlbmNlOworCWludCBmZW5jZV9hWzJdOworCWludCBmZW5jZV9iOworCWludCBmZW5jZV9t ZXJnZWQ7CisJaW50IHRpbWVvdXQgPSAyMDA7IC8qIGluIG1zICovCisKKwljbG9zZV9zd19zeW5j KCZ1c2VyX3N5bmNfb2JqKTsKKwlpZ3RfYXNzZXJ0KGluaXRfc3dfc3luYygmdXNlcl9zeW5jX29i aikgPT0gMCk7CisKKwkvKiBDcmVhdGUgdXNlciBmZW5jZSAqLworCWlndF9hc3NlcnQodXNlcl9j cmVhdGVfZmVuY2UoJnN0YXJ0X2ZlbmNlLCAxKSA9PSAwKTsKKworCS8qIFNldCB1cCBmZW5jZXMg YW5kIGRlcGVuZGVudCBiYXRjaGVzICovCisKKwkvKiBVc2VyIHRyaWdnZXJzIEEsIHdoaWNoIHRy aWdnZXJzIEIsIHRoZW4gYmFjayB0byBBICovCisJaWd0X2Fzc2VydChub3BfZXhlYygKKwkJSTkx NV9FWEVDX1JFTkRFUiB8CisJCUk5MTVfRVhFQ19DUkVBVEVfRkVOQ0UgfAorCQlJOTE1X0VYRUNf V0FJVF9GRU5DRSwKKwkJZHVwKHN0YXJ0X2ZlbmNlKSwgJmZlbmNlX2FbMF0pID09IDApOworCWln dF9hc3NlcnQobm9wX2V4ZWMoCisJCUk5MTVfRVhFQ19CTFQgfAorCQlJOTE1X0VYRUNfQ1JFQVRF X0ZFTkNFIHwKKwkJSTkxNV9FWEVDX1dBSVRfRkVOQ0UsCisJCWR1cChmZW5jZV9hWzBdKSwgJmZl bmNlX2IpID09IDApOworCWlndF9hc3NlcnQobm9wX2V4ZWMoCisJCUk5MTVfRVhFQ19SRU5ERVIg fAorCQlJOTE1X0VYRUNfQ1JFQVRFX0ZFTkNFIHwKKwkJSTkxNV9FWEVDX1dBSVRfRkVOQ0UsCisJ CWR1cChmZW5jZV9iKSwgJmZlbmNlX2FbMV0pID09IDApOworCisJLyogV2UgYWxzbyBjcmVhdGUg YSBtZXJnZWQgZmVuY2UgdG8gc2hvdyBldmVyeXRoaW5nIGZpbmlzaGVkICovCisJaWd0X2Fzc2Vy dChtZXJnZV9mZW5jZSgmZmVuY2VfbWVyZ2VkLCBmZW5jZV9hWzBdLCBmZW5jZV9hWzFdKSA9PSAw KTsKKwlpZ3RfYXNzZXJ0KG1lcmdlX2ZlbmNlKCZmZW5jZV9tZXJnZWQsIGZlbmNlX21lcmdlZCwg ZmVuY2VfYikgPT0gMCk7CisKKwkvKiBXYWl0IGFuZCBjaGVjayBldmVyeXRoaW5nIGlzIHN0aWxs IGFjdGl2ZSAqLworCXVzbGVlcCh0aW1lb3V0ICogMTAwMCk7CisJaWd0X2Fzc2VydChnZXRfZmVu Y2Vfc3RhdHVzKGZlbmNlX2FbMF0pID09IEZFTkNFX0FDVElWRSk7CisJaWd0X2Fzc2VydChnZXRf ZmVuY2Vfc3RhdHVzKGZlbmNlX2FbMV0pID09IEZFTkNFX0FDVElWRSk7CisJaWd0X2Fzc2VydChn ZXRfZmVuY2Vfc3RhdHVzKGZlbmNlX2IpID09IEZFTkNFX0FDVElWRSk7CisKKwkvKiBUcmlnZ2Vy IGZpcnN0IHVzZXIgZmVuY2UgKi8KKwlpZ3RfYXNzZXJ0KHVzZXJfaW5jX3RpbWVsaW5lKDEpID09 IDApOworCisJLyogQ2hlY2sgZmlyc3QgZmVuY2UgZnJvbSBBIGhhcyBmaW5pc2hlZCAqLworCWln dF9hc3NlcnQod2FpdF9mZW5jZShmZW5jZV9hWzBdLCAmdGltZW91dCkgPT0gMCk7CisJaWd0X2Fz c2VydChnZXRfZmVuY2Vfc3RhdHVzKGZlbmNlX2FbMF0pID09IEZFTkNFX1NJR05BTEVEKTsKKwkv KiBDaGVjayBmZW5jZSBmcm9tIEIgaGFzIGZpbmlzaGVkICovCisJaWd0X2Fzc2VydCh3YWl0X2Zl bmNlKGZlbmNlX2IsICZ0aW1lb3V0KSA9PSAwKTsKKwlpZ3RfYXNzZXJ0KGdldF9mZW5jZV9zdGF0 dXMoZmVuY2VfYikgPT0gRkVOQ0VfU0lHTkFMRUQpOworCS8qIENoZWNrIHNlY29uZCBmZW5jZSBm cm9tIEEgaGFzIGZpbmlzaGVkICovCisJaWd0X2Fzc2VydCh3YWl0X2ZlbmNlKGZlbmNlX2FbMV0s ICZ0aW1lb3V0KSA9PSAwKTsKKwlpZ3RfYXNzZXJ0KGdldF9mZW5jZV9zdGF0dXMoZmVuY2VfYVsx XSkgPT0gRkVOQ0VfU0lHTkFMRUQpOworCisJLyogQ2hlY2sgbWVyZ2VkIGZlbmNlIGZpbmlzaGVk ICovCisJaWd0X2Fzc2VydChnZXRfZmVuY2Vfc3RhdHVzKGZlbmNlX21lcmdlZCkgPT0gRkVOQ0Vf U0lHTkFMRUQpOworCisJY2xvc2Uoc3RhcnRfZmVuY2UpOworfQorCisvKgorICogR2V0cyB0aGUg c3RhdHVzIG9mIGEgZ2l2ZW4gdGhyZWFkIGlkCisgKiBAbXV0ZXggcG9pbnRlciB0byBhIG11dGV4 IGd1YXJkaW5nIHRoZSBzdGF0ZSBhcnJheQorICogQHN0YXRlIHBvaW50ZXIgdG8gdGhlIGludCB3 ZSBhcmUgdXNpbmcgYXMgYSBzdGF0dXMgaW5kaWNhdG9yCisgKi8KK3N0YXRpYyBpbnQgdGhyZWFk X2dldF9zdGF0dXMocHRocmVhZF9tdXRleF90ICptdXRleCwgaW50ICpzdGF0ZSkKK3sKKwlpbnQg dmFsdWU7CisJd2hpbGUgKHB0aHJlYWRfbXV0ZXhfdHJ5bG9jayhtdXRleCkgIT0gMCkKKwkJdXNs ZWVwKDEwMDApOworCXZhbHVlID0gKnN0YXRlOworCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKG11dGV4 KTsKKwlyZXR1cm4gdmFsdWU7Cit9CisKKy8qCisgKiBTZXRzIHRoZSBzdGF0dXMgb2YgYSB0aHJl YWQKKyAqIEBtdXRleCBwb2ludGVyIHRvIGEgbXV0ZXggZ3VhcmRpbmcgdGhlIHN0YXRlIGFycmF5 CisgKiBAc3RhdGUgcG9pbnRlciB0byB0aGUgaW50IHdlIGFyZSB1c2luZyBhcyBhIHN0YXR1cyBp bmRpY2F0b3IKKyAqIEB2YWx1ZSB2YWx1ZSB3ZSB3b3VsZCBsaWtlIHRoZSBzdGF0ZSBzZXQgdG8K KyAqLworc3RhdGljIHZvaWQgdGhyZWFkX3VwZGF0ZV9zdGF0dXMocHRocmVhZF9tdXRleF90ICpt dXRleCwKKwkJCQkgaW50ICpzdGF0ZSwgaW50IHZhbHVlKQoreworCXdoaWxlIChwdGhyZWFkX211 dGV4X3RyeWxvY2sobXV0ZXgpICE9IDApCisJCXVzbGVlcCgxMDAwKTsKKworCSpzdGF0ZSA9IHZh bHVlOworCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKG11dGV4KTsKK30KKworLyogVGhyZWFkIHN0YXRl cyAqLworI2RlZmluZSBUU1RBVEVfQkVHVU4JCSgxKSAvKiB0aHJlYWQgaGFzIGJlZ3VuICovCisj ZGVmaW5lIFRTVEFURV9CVVNZCQkoMikgLyogdGhyZWFkIGlzIGJ1c3kgKi8KKyNkZWZpbmUgVFNU QVRFX0ZFTkNFX1JFQURZCSgzKSAvKiB0aHJlYWQgaGFzIHByb2R1Y2VkIGEgZmVuY2UgKi8KKyNk ZWZpbmUgVFNUQVRFX1NVQk1JVFRFRAkoNCkgLyogdGhyZWFkIGhhcyBzdWJtaXR0ZWQgYWxsIGJ1 ZmZlcnMgKi8KKyNkZWZpbmUgVFNUQVRFX0NPTVBMRVRFCQkoNSkgLyogdGhyZWFkIGhhcyBjb21w bGV0ZWQgKi8KKworLyoKKyAqIFN0cnVjdHVyZSBwYXNzZWQgdG8gdGhlIHRocmFzaF90aHJlYWQg ZnVuY3Rpb24KKyAqLworc3RydWN0IHRocmFzaF9kYXRhCit7CisJaW50IGlkOyAvKiBpZCBvZiB0 aGUgdGhyZWFkIGZvciByZWZlcmVuY2UgKi8KKwlpbnQgc3RhcnRfZmVuY2U7IC8qIHN0YXJ0aW5n IGZlbmNlLCBjcmVhdGVkIGJ5IHVzZXIgKi8KKwlwdGhyZWFkX211dGV4X3QgKnN0YXRlX211dGV4 OyAvKiBtdXRleCB0byBjb250cm9sIGFjY2VzcyB0byBzdGF0ZSAqLworCWludCAqc3RhdGU7IC8q IHBvaW50ZXIgdG8gdGhpcyB0aHJlYWQncyBzdGF0ZSBpbnRlZ2VyICovCisJaW50ICpmZW5jZV9h cnJheTsgLyogcG9pbnRlciB0byB0aGUgcHVibGljIGZlbmNlIGFycmF5ICovCisJaW50IG51bV9z dWJtaXNzaW9uczsgLyogbnVtYmVyIG9mIG5vcCBzdWJtaXNzaW9ucyAqLworCWludCBudW1fdGhy ZWFkczsgLyogbnVtYmVyIG9mIHRocmVhZHMgKi8KK307CisKKy8qCisgKiBUaHJlYWQgZnVuY3Rp b24gdG8gdGhyYXNoIHRoZSBzdWJtaXNzaW9uIG1lY2hhbmlzbSBmb3IgYSBnaXZlbiBjb250ZXh0 CisgKiBFYWNoIHRocmVhZCB1c2VzIHRoZSBzYW1lIGRybSBmZCBhbmQgZW5naW5lCisgKiBFYWNo IHRocmVhZCBpcyBnaXZlbiB0aGUgc2FtZSB1c2VyIGZlbmNlIGFzIGEgdHJpZ2dlcgorICogRWFj aCB0aHJlYWQgY29udGFpbnMgYSBsb29wIHRvIGdlbmVyYXRlIG1hbnkgZGVwZW5kZW50IHN1Ym1p c3Npb25zCisgKiBUaGUgcmV0dXJuZWQgZmVuY2VzIGFyZSB1c2VkIGFzIGlucHV0IGZvciBvdGhl ciB0aHJlYWRzCisgKiBhbmQgYWxzbyBtZXJnZWQgaW50byBhIHN1cGVyZmVuY2UgZm9yIHRoYXQg dGhyZWFkCisgKiBXaGVuIGVhY2ggdGhyZWFkIGhhcyBmaW5pc2hlZCBzdWJtaXR0aW5nLCBpdCBz aWduYWxzIGl0cyByZWFkaW5lc3MKKyAqIFRoZSBtYWluIHRocmVhZCBjaGVja3MgdGhhdCBhbGwg dGhyZWFkcyBhcmUgcmVhZHksIHRoZW4gdHJpZ2dlcnMKKyAqIEBkYXRhIHBvaW50ZXIgdG8gdGhl IHRocmFzaF9kYXRhIHN0cnVjdHVyZSBwYXNzZWQgaW4gdG8gdGhlIHRocmVhZAorICovCitzdGF0 aWMgdm9pZCAqdGhyYXNoX3RocmVhZCh2b2lkICpkYXRhKQoreworCWludCBpOworCWludCBmZW5j ZV9vdXQsIHN1cGVyX2ZlbmNlOworCWludCBuZXh0X3RocmVhZDsKKwlzdHJ1Y3QgdGhyYXNoX2Rh dGEgKnBhcmFtczsKKwlkcm1faW50ZWxfY29udGV4dCAqY3R4OworCisJLyogR2V0IHRoZSB0aHJl YWQgcGFyYW1ldGVycyAqLworCXBhcmFtcyA9IChzdHJ1Y3QgdGhyYXNoX2RhdGEgKikgZGF0YTsK KwluZXh0X3RocmVhZCA9IChwYXJhbXMtPmlkICsgMSkgJSBwYXJhbXMtPm51bV90aHJlYWRzOwor CisJdGhyZWFkX3VwZGF0ZV9zdGF0dXMocGFyYW1zLT5zdGF0ZV9tdXRleCwKKwkJCSAgICAgcGFy YW1zLT5zdGF0ZSwgVFNUQVRFX0JFR1VOKTsKKworCS8qIENyZWF0ZSB0aGUgY29udGV4dCAqLwor CWN0eCA9IGRybV9pbnRlbF9nZW1fY29udGV4dF9jcmVhdGUoYnVmbWdyKTsKKworCS8qIEZpcnN0 IG5vcCB3aWxsIGJlIGRlcGVuZGVudCBvbiB0aGUgc3RhcnRpbmcgZmVuY2UgKi8KKwlmZW5jZV9v dXQgPSBwYXJhbXMtPnN0YXJ0X2ZlbmNlOworCisJLyogU3VibWl0IHRoZSBub3BzICovCisJZm9y IChpID0gMDsgaSA8IHBhcmFtcy0+bnVtX3N1Ym1pc3Npb25zOyBpKyspCisJeworCQkvKiBTaG93 IHRoYXQgd2UncmUgYnVzeSAqLworCQl0aHJlYWRfdXBkYXRlX3N0YXR1cyhwYXJhbXMtPnN0YXRl X211dGV4LAorCQkJICAgICBwYXJhbXMtPnN0YXRlLCBUU1RBVEVfQlVTWSk7CisKKwkJaWd0X2Fz c2VydChub3BfZXhlY193aXRoX2N0eChjdHgsCisJCQlJOTE1X0VYRUNfUkVOREVSIHwKKwkJCUk5 MTVfRVhFQ19DUkVBVEVfRkVOQ0UgfAorCQkJSTkxNV9FWEVDX1dBSVRfRkVOQ0UsCisJCQlkdXAo ZmVuY2Vfb3V0KSwgJmZlbmNlX291dCkgPT0gMCk7CisKKwkJLyogT25seSBuZWVkIHRvIGRvIGEg bWVyZ2UgZnJvbSB0aGUgc2Vjb25kIHN1Ym1pc3Npb24gKi8KKwkJaWYgKGkgPiAwKQorCQkJaWd0 X2Fzc2VydChtZXJnZV9mZW5jZSgmc3VwZXJfZmVuY2UsCisJCQkJCSAgICAgICBzdXBlcl9mZW5j ZSwgZmVuY2Vfb3V0KSA9PSAwKTsKKwkJZWxzZQorCQkJc3VwZXJfZmVuY2UgPSBmZW5jZV9vdXQ7 CisKKwkJLyogVXBkYXRlIHRoZSBwdWJsaWMgZmVuY2UgYW5kIG1ha2UgaXQgYXZhaWxhYmxlICov CisJCXBhcmFtcy0+ZmVuY2VfYXJyYXlbcGFyYW1zLT5pZF0gPSBmZW5jZV9vdXQ7CisKKwkJdGhy ZWFkX3VwZGF0ZV9zdGF0dXMocGFyYW1zLT5zdGF0ZV9tdXRleCwKKwkJCSAgICAgcGFyYW1zLT5z dGF0ZSwgVFNUQVRFX0ZFTkNFX1JFQURZKTsKKworCQkvKiBXYWl0IGZvciBuZXh0IHRocmVhZCB0 byBoYXZlIGFuIGF2YWlsYWJsZSBmZW5jZSAqLworCQl3aGlsZSAodGhyZWFkX2dldF9zdGF0dXMo CisJCQkJcGFyYW1zLT5zdGF0ZV9tdXRleCwKKwkJCQkocGFyYW1zLT5zdGF0ZSAtIHBhcmFtcy0+ aWQgKyBuZXh0X3RocmVhZCkpIDwKKwkJCVRTVEFURV9GRU5DRV9SRUFEWSkKKwkJCXVzbGVlcCgx MDAwKTsKKworCQkvKiBHZXQgdGhlIG5leHQgdGhyZWFkJ3MgZmVuY2UgKi8KKwkJZmVuY2Vfb3V0 ID0gcGFyYW1zLT5mZW5jZV9hcnJheVtuZXh0X3RocmVhZF07CisJfQorCisJcHJpbnRmKCJbJWRd IEZpbmlzaGVkIHN1Ym1pdHRpbmdcbiIsIHBhcmFtcy0+aWQpOworCXVzbGVlcCgxMDAwKTsKKwor CS8qIElmIHdlIGhhdmUgYSBsYXJnZSBlbm91Z2ggcXVldWUgbGltaXQgaW4gdGhlIHNjaGVkdWxl ciwgd2UKKwkgICB3aWxsIGhhdmUgc3VibWl0dGVkIGV2ZXJ5dGhpbmcgYWxyZWFkeSwgc28gdGhl IHdob2xlIHF1ZXVlIGlzCisJICAgd2FpdGluZyBmb3IgdGhlIHVzZXIgdG8gdHJpZ2dlciB0aGUg Zmlyc3QgZmVuY2UuIEJ1dCBpZiBOX1RIUkVBRFMgeAorCSAgIG51bV9zdWJtaXNzaW9ucyBpcyBn cmVhdGVyIHRoYW4gdGhlIGxpbWl0LCB3ZSBjb3VsZCBoYXZlIGV4ZWN1dGVkCisJICAgdGhpcyBh bHJlYWR5IGR1cmluZyBvdXIgdXNsZWVwICovCisJaWYgKGdldF9mZW5jZV9zdGF0dXMoc3VwZXJf ZmVuY2UpICE9IEZFTkNFX0FDVElWRSkKKwl7CisJCXByaW50ZigiWyVkXSBzdXBlciBub3QgYWN0 aXZlOiAlZFxuIiwgcGFyYW1zLT5pZCwKKwkJCWdldF9mZW5jZV9zdGF0dXMoc3VwZXJfZmVuY2Up KTsKKwl9CisKKwkvKmlndF9hc3NlcnQoZ2V0X2ZlbmNlX3N0YXR1cyhwYXJhbXMtPnN0YXJ0X2Zl bmNlKSA9PSBGRU5DRV9BQ1RJVkUpOyovCisKKwkvKiBVcGRhdGUgdGhyZWFkIHN0YXR1cyAqLwor CXRocmVhZF91cGRhdGVfc3RhdHVzKHBhcmFtcy0+c3RhdGVfbXV0ZXgsCisJCQkgICAgIHBhcmFt cy0+c3RhdGUsIFRTVEFURV9TVUJNSVRURUQpOworCXByaW50ZigiWyVkXSByZWNvcmRlZCBzdGF0 ZSAlZFxuIiwKKwkgICAgICAgcGFyYW1zLT5pZCwgKihwYXJhbXMtPnN0YXRlKSk7CisKKwkvKiBX YWl0IGZvciBvdXIgc3VwZXJfZmVuY2UgdG8gZmluaXNoICovCisJd2hpbGUgKGdldF9mZW5jZV9z dGF0dXMoc3VwZXJfZmVuY2UpICE9IEZFTkNFX1NJR05BTEVEKQorCQl1c2xlZXAoMTAwMCk7CisK KwkvKiBVcGRhdGUgdGhyZWFkIHN0YXR1cyAqLworCXRocmVhZF91cGRhdGVfc3RhdHVzKHBhcmFt cy0+c3RhdGVfbXV0ZXgsCisJCQkgICAgIHBhcmFtcy0+c3RhdGUsIFRTVEFURV9DT01QTEVURSk7 CisJcHJpbnRmKCJbJWRdIHJlY29yZGVkIHN0YXRlICVkXG4iLAorCSAgICAgICBwYXJhbXMtPmlk LCAqKHBhcmFtcy0+c3RhdGUpKTsKKworCS8qIERlc3Ryb3kgdGhlIGNvbnRleHQgKi8KKwlkcm1f aW50ZWxfZ2VtX2NvbnRleHRfZGVzdHJveShjdHgpOworCisJcmV0dXJuIE5VTEw7Cit9CisKKy8q CisgKiBDaGVjayB0aGUgdGhhdCBhbGwgdGhlIHRocmVhZHMgaGF2ZSByZWFjaGVkIGEgcGFydGlj dWxhciBzdGF0dXMKKyAqIEBwX211dGV4IHBvaW50ZXIgdG8gYSBtdXRleCBndWFyZGluZyB0aGUg c3RhdGUgYXJyYXkKKyAqIEBudW1fdGhyZWFkcyBUaGUgbnVtYmVyIG9mIHRocmVhZHMgd2UgYXJl IGNoZWNraW5nCisgKiBAc3RhdGVhcnIgUG9pbnRlciB0byB0aGUgZmlyc3QgaW50ZWdlciBpbiBh IG51bV90aHJlYWRzLXNpemVkIGFycmF5CisgKiBAc3RhdGUgVGhlIGNoZWNrcG9pbnQgd2UgYXJl IGV4cGVjdGluZyB0aGUgdGhyZWFkcyB0byBoYXZlIHJlYWNoZWQKKyAqLworc3RhdGljIHZvaWQg Y2hlY2tfdGhyZWFkX3N0YXRlKHB0aHJlYWRfbXV0ZXhfdCAqcF9tdXRleCwgaW50IG51bV90aHJl YWRzLAorCQkJICAgICAgIGludCAqc3RhdGVhcnIsIGludCBzdGF0ZSkKK3sKKwlpbnQgZG9uZSwg aTsKKwlpbnQgY291bnRlciA9IDA7CisJZG9uZSA9IDA7CisJLyogQSBsaW1pdCBvZiAyNSB0cmll cyBpcyBpbXBvc2VkLCBpbiBjYXNlIG9mIGRlYWRsb2NrICovCisJd2hpbGUgKCFkb25lICYmIChj b3VudGVyIDwgMjUpKQorCXsKKwkJaWYgKHB0aHJlYWRfbXV0ZXhfdHJ5bG9jayhwX211dGV4KSA9 PSAwKQorCQl7CisJCQlkb25lID0gMTsKKwkJCWZvciAoaSA9IDA7IGkgPCBudW1fdGhyZWFkczsg aSsrKQorCQkJeworCQkJCWlmIChzdGF0ZWFycltpXSA8IHN0YXRlKQorCQkJCXsKKwkJCQkJZG9u ZSA9IDA7CisJCQkJCS8vcHJpbnRmKCJXYWl0aW5nIGZvciAlZCBvbiAlZFxuIiwgc3RhdGUsIGkp OworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlwdGhyZWFkX211dGV4X3VubG9jayhwX211 dGV4KTsKKwkJfQorCQl1c2xlZXAoNTAwMDApOworCQljb3VudGVyKys7CisJfQorCisJaWYgKCFk b25lKQorCXsKKwkJcHJpbnRmKCJDb3VsZG4ndCBmaW5pc2ggY2hlY2tpbmcgc3RhdGUgJWRcbiIs IHN0YXRlKTsKKwl9Cit9CisKKy8qCisgKiBUaHJhc2ggZmVuY2VzIGFjcm9zcyBtdWx0aXBsZSB0 aHJlYWRzLCB1c2luZyBhIHNpbmdsZSBmZW5jZSB0byBraWNrIGl0IG9mZgorICovCitzdGF0aWMg dm9pZCBmZW5jZV9tdWx0aXRocmVhZCh2b2lkKQoreworCWludCBpOworCWludCBOX1RIUkVBRFMg PSA4OworCWludCBOX1NVQk1JU1NJT05TID0gOTsKKwlwdGhyZWFkX211dGV4X3Qgc3RhdGVfbXV0 ZXg7CisJcHRocmVhZF90IHRocmVhZF9oYW5kbGVzW05fVEhSRUFEU107CisJc3RydWN0IHRocmFz aF9kYXRhIHRfcGFyYW1zW05fVEhSRUFEU107CisJaW50IHN0YXRlYXJyW05fVEhSRUFEU107CisJ aW50IGZlbmNlX2FycmF5W05fVEhSRUFEU107CisKKwlpbnQgc3RhcnRfZmVuY2U7CisKKwljbG9z ZV9zd19zeW5jKCZ1c2VyX3N5bmNfb2JqKTsKKwlpZ3RfYXNzZXJ0KGluaXRfc3dfc3luYygmdXNl cl9zeW5jX29iaikgPT0gMCk7CisKKwkvKiBDcmVhdGUgdXNlciBmZW5jZSAqLworCWlndF9hc3Nl cnQodXNlcl9jcmVhdGVfZmVuY2UoJnN0YXJ0X2ZlbmNlLCAxKSA9PSAwKTsKKworCS8qIFBvcHVs YXRlIHRocmVhZCBkYXRhICovCisJZm9yIChpID0gMDsgaSA8IE5fVEhSRUFEUzsgaSsrKQorCXsK KwkJdF9wYXJhbXNbaV0uaWQgPSBpOworCQl0X3BhcmFtc1tpXS5zdGFydF9mZW5jZSA9IHN0YXJ0 X2ZlbmNlOworCQl0X3BhcmFtc1tpXS5zdGF0ZV9tdXRleCA9ICZzdGF0ZV9tdXRleDsKKwkJdF9w YXJhbXNbaV0uc3RhdGUgPSAmKHN0YXRlYXJyW2ldKTsKKwkJdF9wYXJhbXNbaV0uZmVuY2VfYXJy YXkgPSBmZW5jZV9hcnJheTsKKwkJdF9wYXJhbXNbaV0ubnVtX3N1Ym1pc3Npb25zID0gTl9TVUJN SVNTSU9OUzsKKwkJdF9wYXJhbXNbaV0ubnVtX3RocmVhZHMgPSBOX1RIUkVBRFM7CisJCXN0YXRl YXJyW2ldID0gMDsKKwkJZmVuY2VfYXJyYXlbaV0gPSAtMTsKKwl9CisKKwlwdGhyZWFkX211dGV4 X2luaXQoJnN0YXRlX211dGV4LCBOVUxMKTsKKworCS8qIExhdW5jaCB0aHJlYWRzICovCisJZm9y IChpID0gMDsgaSA8IE5fVEhSRUFEUzsgaSsrKQorCQlwdGhyZWFkX2NyZWF0ZSgmdGhyZWFkX2hh bmRsZXNbaV0sIE5VTEwsIHRocmFzaF90aHJlYWQsCisJCQkgICAgICAgKHZvaWQgKikgKCZ0X3Bh cmFtc1tpXSkpOworCisJLyogV2FpdCBmb3Igc3VibWlzc2lvbnMgdG8gY29tcGxldGUgKi8KKwlj aGVja190aHJlYWRfc3RhdGUoJnN0YXRlX211dGV4LCBOX1RIUkVBRFMsIHN0YXRlYXJyLCBUU1RB VEVfU1VCTUlUVEVEKTsKKworCXByaW50ZigiRmluaXNoZWQgY2hlY2tpbmcgdGhyZWFkcyBmb3Ig c3RhdGUgJWRcbiIsIFRTVEFURV9TVUJNSVRURUQpOworCisJdXNlcl9pbmNfdGltZWxpbmUoMSk7 CisJcHJpbnRmKCJJbmNyZW1lbnRlZCB0aW1lbGluZVxuIik7CisKKwljaGVja190aHJlYWRfc3Rh dGUoJnN0YXRlX211dGV4LCBOX1RIUkVBRFMsIHN0YXRlYXJyLCBUU1RBVEVfQ09NUExFVEUpOwor CXByaW50ZigiRmluaXNoZWQgY2hlY2tpbmcgdGhyZWFkcyBmb3Igc3RhdGUgJWRcbiIsIFRTVEFU RV9DT01QTEVURSk7CisKKwkvKiBGaW5pc2ggdGhyZWFkcyAqLworCWZvciAoaSA9IDA7IGkgPCBO X1RIUkVBRFM7IGkrKykKKwkJcHRocmVhZF9qb2luKHRocmVhZF9oYW5kbGVzW2ldLCBOVUxMKTsK KworCXB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmc3RhdGVfbXV0ZXgpOworCisJY2xvc2Uoc3RhcnRf ZmVuY2UpOworfQorCitpZ3RfbWFpbgoreworCWlndF9maXh0dXJlIHsKKwkJaWd0X2Fzc2VydChp bml0X3N3X3N5bmMoJnVzZXJfc3luY19vYmopID09IDApOworCQlmZCA9IGRybV9vcGVuX2RyaXZl cl9tYXN0ZXIoRFJJVkVSX0lOVEVMKTsKKworCQloYW5kbGUgPSBnZW1fY3JlYXRlKGZkLCA0MDk2 KTsKKwkJZ2VtX3dyaXRlKGZkLCBoYW5kbGUsIDAsIG5vcF9iYXRjaCwgc2l6ZW9mKG5vcF9iYXRj aCkpOworCisJCWJ1Zm1nciA9IGRybV9pbnRlbF9idWZtZ3JfZ2VtX2luaXQoZmQsIDQwOTYpOwor CQlkZXZpZCA9IGludGVsX2dldF9kcm1fZGV2aWQoZmQpOworCQliYXRjaCA9IGludGVsX2JhdGNo YnVmZmVyX2FsbG9jKGJ1Zm1nciwgZGV2aWQpOworCX0KKworCWlndF9zdWJ0ZXN0KCJub3QtcmVx dWVzdGVkLW5vdC1jcmVhdGVkIikKKwkJZmVuY2Vfbm90X3JlcXVlc3RlZF9ub3RfY3JlYXRlZCgp OworCisJaWd0X3N1YnRlc3QoImNyZWF0ZSIpCisJCWZlbmNlX2NyZWF0ZSgpOworCisJaWd0X3N1 YnRlc3QoImRyaXZlci1kYXRhIikKKwkJZmVuY2VfZHJpdmVyX2RhdGEoKTsKKworCWlndF9zdWJ0 ZXN0KCJzaWduYWxlZCIpCisJCWZlbmNlX3NpZ25hbGVkKCk7CisKKwlpZ3Rfc3VidGVzdCgic2ln bmFsIikKKwkJZmVuY2Vfc2lnbmFsKCk7CisKKwlpZ3Rfc3VidGVzdCgid2FpdCIpCisJCWZlbmNl X3dhaXQoKTsKKworCWlndF9zdWJ0ZXN0KCJ0aW1lb3V0IikKKwkJZmVuY2VfdGltZW91dCgpOwor CisJaWd0X3N1YnRlc3QoIndhaXQtZmVuY2UiKQorCQlmZW5jZV93YWl0X2ZlbmNlKCk7CisKKwlp Z3Rfc3VidGVzdCgid2FpdC1mZW5jZTIiKQorCQlmZW5jZV93YWl0X2ZlbmNlMigpOworCisJaWd0 X3N1YnRlc3QoInVzZXItZmVuY2Utd2FpdCIpCisJCWZlbmNlX3VzZXJfZmVuY2Vfd2FpdCgpOwor CisJaWd0X3N1YnRlc3QoInVzZXItZmVuY2Utb29vIikKKwkJZmVuY2Vfb29vX2ZlbmNlKCk7CisK KwlpZ3Rfc3VidGVzdCgidXNlci1mZW5jZS1sZWFrIikKKwkJZmVuY2VfdXNlcl9mZW5jZV9sZWFr KCk7CisKKwlpZ3Rfc3VidGVzdCgibWVyZ2UiKQorCQlmZW5jZV9tZXJnZSgpOworCisvKgorCWln dF9zdWJ0ZXN0KCJtdWx0aWRlcGVuZGVuY3kiKQorCQlmZW5jZV9tdWx0aWRlcGVuZGVuY3koKTsK KworCWlndF9zdWJ0ZXN0KCJ1c2VyLWZlbmNlLWZvcmdldCIpCisJCWZlbmNlX3VzZXJfZm9yZ2V0 KCk7CisqLworCWlndF9zdWJ0ZXN0KCJtdWx0aWVuZ2luZSIpCisJCWZlbmNlX211bHRpZW5naW5l KCk7CisKKwlpZ3Rfc3VidGVzdCgibXVsdGl0aHJlYWQiKQorCQlmZW5jZV9tdWx0aXRocmVhZCgp OworCisJaWd0X2ZpeHR1cmUgeworCQlnZW1fY2xvc2UoZmQsIGhhbmRsZSk7CisJCWludGVsX2Jh dGNoYnVmZmVyX2ZyZWUoYmF0Y2gpOworCQljbG9zZShmZCk7CisJCWNsb3NlX3N3X3N5bmMoJnVz ZXJfc3luY19vYmopOworCX0KK30KLS0gCjEuOS4xCgpfX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fXwpJbnRlbC1nZnggbWFpbGluZyBsaXN0CkludGVsLWdmeEBs aXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cDovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFu L2xpc3RpbmZvL2ludGVsLWdmeAo=