From mboxrd@z Thu Jan 1 00:00:00 1970 From: Wei Liu Subject: [PATCH 26/34] x86/mm/shadow: split out HVM only code Date: Fri, 17 Aug 2018 16:12:44 +0100 Message-ID: <21d88360019e3f7c38ebcda4f83c3112781465f6.1534518694.git-series.wei.liu2@citrix.com> References: Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from us1-rack-dfw2.inumbo.com ([104.130.134.6]) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1fqggQ-0001wM-0Z for xen-devel@lists.xenproject.org; Fri, 17 Aug 2018 15:29:02 +0000 In-Reply-To: List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" To: xen-devel@lists.xenproject.org Cc: George Dunlap , Tim Deegan , Wei Liu , Jan Beulich , Andrew Cooper List-Id: xen-devel@lists.xenproject.org TW92ZSB0aGUgY29kZSBwcmV2aW91c2x5IGVuY2xvc2VkIGluIENPTkZJR19IVk0gaW50byBpdHMg b3duIGZpbGUuCgpOb3RlIHRoYXQgYWx0aG91Z2ggc29tZSBjb2RlIGV4cGxpY2l0bHkgY2hlY2sg aXNfaHZtXyosIHdoaWNoIGhpbnRzIGl0CmNhbiBiZSB1c2VkIGZvciBQViB0b28sIEkgY2FuJ3Qg ZmluZCBhIGNvZGUgcGF0aCB0aGF0IHdvdWxkIGJlIHRoZQpjYXNlLgoKU2lnbmVkLW9mZi1ieTog V2VpIExpdSA8d2VpLmxpdTJAY2l0cml4LmNvbT4KLS0tCkNhbiBiZSBzcXVhc2hlZCBpbnRvIHBy ZXZpb3VzIHBhdGNoIGlmIHRoYXQncyBwcmVmZXJhYmxlLgotLS0KIHhlbi9hcmNoL3g4Ni9tbS9z aGFkb3cvTWFrZWZpbGUgfCAgIDEgKy0KIHhlbi9hcmNoL3g4Ni9tbS9zaGFkb3cvY29tbW9uLmMg fCA1NDIgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogeGVuL2FyY2gveDg2L21tL3No YWRvdy9odm0uYyAgICB8IDU5MCArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKystCiAz IGZpbGVzIGNoYW5nZWQsIDU5NiBpbnNlcnRpb25zKCspLCA1MzcgZGVsZXRpb25zKC0pCiBjcmVh dGUgbW9kZSAxMDA2NDQgeGVuL2FyY2gveDg2L21tL3NoYWRvdy9odm0uYwoKZGlmZiAtLWdpdCBh L3hlbi9hcmNoL3g4Ni9tbS9zaGFkb3cvTWFrZWZpbGUgYi94ZW4vYXJjaC94ODYvbW0vc2hhZG93 L01ha2VmaWxlCmluZGV4IGJjYjIzZDIuLjcyNjU4ZjMgMTAwNjQ0Ci0tLSBhL3hlbi9hcmNoL3g4 Ni9tbS9zaGFkb3cvTWFrZWZpbGUKKysrIGIveGVuL2FyY2gveDg2L21tL3NoYWRvdy9NYWtlZmls ZQpAQCAtMSw1ICsxLDYgQEAKIGlmZXEgKCQoQ09ORklHX1NIQURPV19QQUdJTkcpLHkpCiBvYmot eSArPSBjb21tb24ubyBndWVzdF8yLm8gZ3Vlc3RfMy5vIGd1ZXN0XzQubworb2JqLSQoQ09ORklH X0hWTSkgKz0gaHZtLm8KIGVsc2UKIG9iai15ICs9IG5vbmUubwogZW5kaWYKZGlmZiAtLWdpdCBh L3hlbi9hcmNoL3g4Ni9tbS9zaGFkb3cvY29tbW9uLmMgYi94ZW4vYXJjaC94ODYvbW0vc2hhZG93 L2NvbW1vbi5jCmluZGV4IDQzODE1MzguLmFhOTQ0MTYgMTAwNjQ0Ci0tLSBhL3hlbi9hcmNoL3g4 Ni9tbS9zaGFkb3cvY29tbW9uLmMKKysrIGIveGVuL2FyY2gveDg2L21tL3NoYWRvdy9jb21tb24u YwpAQCAtMTE0LDI3MyArMTE0LDE2IEBAIF9faW5pdGNhbGwoc2hhZG93X2F1ZGl0X2tleV9pbml0 KTsKIAogCiAjaWYgQ09ORklHX0hWTQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogeDg2IGVtdWxh dG9yIHN1cHBvcnQgZm9yIHRoZSBzaGFkb3cgY29kZQotICovCi0KLS8qCi0gKiBSZXR1cm5zIGEg bWFwcGVkIHBvaW50ZXIgdG8gd3JpdGUgdG8sIG9yIG9uZSBvZiB0aGUgZm9sbG93aW5nIGVycm9y Ci0gKiBpbmRpY2F0b3JzLgotICovCi0jZGVmaW5lIE1BUFBJTkdfVU5IQU5ETEVBQkxFIEVSUl9Q VFIofihsb25nKVg4NkVNVUxfVU5IQU5ETEVBQkxFKQotI2RlZmluZSBNQVBQSU5HX0VYQ0VQVElP TiAgICBFUlJfUFRSKH4obG9uZylYODZFTVVMX0VYQ0VQVElPTikKLSNkZWZpbmUgTUFQUElOR19T SUxFTlRfRkFJTCAgRVJSX1BUUih+KGxvbmcpWDg2RU1VTF9PS0FZKQotc3RhdGljIHZvaWQgKnNo X2VtdWxhdGVfbWFwX2Rlc3Qoc3RydWN0IHZjcHUgKnYsIHVuc2lnbmVkIGxvbmcgdmFkZHIsCi0g ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgYnl0ZXMsCi0gICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2hfZW11bGF0ZV9jdHh0ICpzaF9j dHh0KTsKLXN0YXRpYyB2b2lkIHNoX2VtdWxhdGVfdW5tYXBfZGVzdChzdHJ1Y3QgdmNwdSAqdiwg dm9pZCAqYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBp bnQgYnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNoX2Vt dWxhdGVfY3R4dCAqc2hfY3R4dCk7Ci0KLS8qCi0gKiBDYWxsZXJzIHdoaWNoIHBhc3MgYSBrbm93 biBpbi1yYW5nZSB4ODZfc2VnbWVudCBjYW4gcmVseSBvbiB0aGUgcmV0dXJuCi0gKiBwb2ludGVy IGJlaW5nIHZhbGlkLiAgT3RoZXIgY2FsbGVycyBtdXN0IGV4cGxpY2l0bHkgY2hlY2sgZm9yIGVy cm9ycy4KLSAqLwotc3RhdGljIHN0cnVjdCBzZWdtZW50X3JlZ2lzdGVyICpodm1fZ2V0X3NlZ19y ZWcoCi0gICAgZW51bSB4ODZfc2VnbWVudCBzZWcsIHN0cnVjdCBzaF9lbXVsYXRlX2N0eHQgKnNo X2N0eHQpCi17Ci0gICAgdW5zaWduZWQgaW50IGlkeCA9IHNlZzsKLSAgICBzdHJ1Y3Qgc2VnbWVu dF9yZWdpc3RlciAqc2VnX3JlZzsKLQotICAgIGlmICggaWR4ID49IEFSUkFZX1NJWkUoc2hfY3R4 dC0+c2VnX3JlZykgKQotICAgICAgICByZXR1cm4gRVJSX1BUUigtWDg2RU1VTF9VTkhBTkRMRUFC TEUpOwotCi0gICAgc2VnX3JlZyA9ICZzaF9jdHh0LT5zZWdfcmVnW2lkeF07Ci0gICAgaWYgKCAh X190ZXN0X2FuZF9zZXRfYml0KGlkeCwgJnNoX2N0eHQtPnZhbGlkX3NlZ19yZWdzKSApCi0gICAg ICAgIGh2bV9nZXRfc2VnbWVudF9yZWdpc3RlcihjdXJyZW50LCBpZHgsIHNlZ19yZWcpOwotICAg IHJldHVybiBzZWdfcmVnOwotfQotCi1zdGF0aWMgaW50IGh2bV90cmFuc2xhdGVfdmlydHVhbF9h ZGRyKAorZXh0ZXJuIGNvbnN0IHN0cnVjdCB4ODZfZW11bGF0ZV9vcHMgaHZtX3NoYWRvd19lbXVs YXRvcl9vcHM7CitleHRlcm4gc3RydWN0IHNlZ21lbnRfcmVnaXN0ZXIgKmh2bV9nZXRfc2VnX3Jl ZygKKyAgICBlbnVtIHg4Nl9zZWdtZW50IHNlZywgc3RydWN0IHNoX2VtdWxhdGVfY3R4dCAqc2hf Y3R4dCk7CitleHRlcm4gaW50IGh2bV90cmFuc2xhdGVfdmlydHVhbF9hZGRyKAogICAgIGVudW0g eDg2X3NlZ21lbnQgc2VnLAogICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAogICAgIHVuc2lnbmVk IGludCBieXRlcywKICAgICBlbnVtIGh2bV9hY2Nlc3NfdHlwZSBhY2Nlc3NfdHlwZSwKICAgICBz dHJ1Y3Qgc2hfZW11bGF0ZV9jdHh0ICpzaF9jdHh0LAotICAgIHVuc2lnbmVkIGxvbmcgKmxpbmVh cikKLXsKLSAgICBjb25zdCBzdHJ1Y3Qgc2VnbWVudF9yZWdpc3RlciAqcmVnOwotICAgIGludCBv a2F5OwotCi0gICAgcmVnID0gaHZtX2dldF9zZWdfcmVnKHNlZywgc2hfY3R4dCk7Ci0gICAgaWYg KCBJU19FUlIocmVnKSApCi0gICAgICAgIHJldHVybiAtUFRSX0VSUihyZWcpOwotCi0gICAgb2th eSA9IGh2bV92aXJ0dWFsX3RvX2xpbmVhcl9hZGRyKAotICAgICAgICBzZWcsIHJlZywgb2Zmc2V0 LCBieXRlcywgYWNjZXNzX3R5cGUsCi0gICAgICAgIGh2bV9nZXRfc2VnX3JlZyh4ODZfc2VnX2Nz LCBzaF9jdHh0KSwgbGluZWFyKTsKLQotICAgIGlmICggIW9rYXkgKQotICAgIHsKLSAgICAgICAg LyoKLSAgICAgICAgICogTGVhdmUgZXhjZXB0aW9uIGluamVjdGlvbiB0byB0aGUgY2FsbGVyIGZv ciBub24tdXNlciBzZWdtZW50czogV2UKLSAgICAgICAgICogbmVpdGhlciBrbm93IHRoZSBleGFj dCBlcnJvciBjb2RlIHRvIGJlIHVzZWQsIG5vciBjYW4gd2UgZWFzaWx5Ci0gICAgICAgICAqIGRl dGVybWluZSB0aGUga2luZCBvZiBleGNlcHRpb24gKCNHUCBvciAjVFMpIGluIHRoYXQgY2FzZS4K LSAgICAgICAgICovCi0gICAgICAgIGlmICggaXNfeDg2X3VzZXJfc2VnbWVudChzZWcpICkKLSAg ICAgICAgICAgIHg4Nl9lbXVsX2h3X2V4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAoc2VnID09 IHg4Nl9zZWdfc3MpID8gVFJBUF9zdGFja19lcnJvciA6IFRSQVBfZ3BfZmF1bHQsCi0gICAgICAg ICAgICAgICAgMCwgJnNoX2N0eHQtPmN0eHQpOwotICAgICAgICByZXR1cm4gWDg2RU1VTF9FWENF UFRJT047Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLWh2bV9yZWFk KGVudW0geDg2X3NlZ21lbnQgc2VnLAotICAgICAgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQsCi0g ICAgICAgICB2b2lkICpwX2RhdGEsCi0gICAgICAgICB1bnNpZ25lZCBpbnQgYnl0ZXMsCi0gICAg ICAgICBlbnVtIGh2bV9hY2Nlc3NfdHlwZSBhY2Nlc3NfdHlwZSwKLSAgICAgICAgIHN0cnVjdCBz aF9lbXVsYXRlX2N0eHQgKnNoX2N0eHQpCi17Ci0gICAgcGFnZWZhdWx0X2luZm9fdCBwZmluZm87 Ci0gICAgdW5zaWduZWQgbG9uZyBhZGRyOwotICAgIGludCByYzsKLQotICAgIHJjID0gaHZtX3Ry YW5zbGF0ZV92aXJ0dWFsX2FkZHIoCi0gICAgICAgIHNlZywgb2Zmc2V0LCBieXRlcywgYWNjZXNz X3R5cGUsIHNoX2N0eHQsICZhZGRyKTsKLSAgICBpZiAoIHJjIHx8ICFieXRlcyApCi0gICAgICAg IHJldHVybiByYzsKLQotICAgIGlmICggYWNjZXNzX3R5cGUgPT0gaHZtX2FjY2Vzc19pbnNuX2Zl dGNoICkKLSAgICAgICAgcmMgPSBodm1fZmV0Y2hfZnJvbV9ndWVzdF9saW5lYXIocF9kYXRhLCBh ZGRyLCBieXRlcywgMCwgJnBmaW5mbyk7Ci0gICAgZWxzZQotICAgICAgICByYyA9IGh2bV9jb3B5 X2Zyb21fZ3Vlc3RfbGluZWFyKHBfZGF0YSwgYWRkciwgYnl0ZXMsIDAsICZwZmluZm8pOwotCi0g ICAgc3dpdGNoICggcmMgKQotICAgIHsKLSAgICBjYXNlIEhWTVRSQU5TX29rYXk6Ci0gICAgICAg IHJldHVybiBYODZFTVVMX09LQVk7Ci0gICAgY2FzZSBIVk1UUkFOU19iYWRfbGluZWFyX3RvX2dm bjoKLSAgICAgICAgeDg2X2VtdWxfcGFnZWZhdWx0KHBmaW5mby5lYywgcGZpbmZvLmxpbmVhciwg JnNoX2N0eHQtPmN0eHQpOwotICAgICAgICByZXR1cm4gWDg2RU1VTF9FWENFUFRJT047Ci0gICAg Y2FzZSBIVk1UUkFOU19iYWRfZ2ZuX3RvX21mbjoKLSAgICBjYXNlIEhWTVRSQU5TX3VuaGFuZGxl YWJsZToKLSAgICAgICAgcmV0dXJuIFg4NkVNVUxfVU5IQU5ETEVBQkxFOwotICAgIGNhc2UgSFZN VFJBTlNfZ2ZuX3BhZ2VkX291dDoKLSAgICBjYXNlIEhWTVRSQU5TX2dmbl9zaGFyZWQ6Ci0gICAg ICAgIHJldHVybiBYODZFTVVMX1JFVFJZOwotICAgIH0KLQotICAgIEJVRygpOwotICAgIHJldHVy biBYODZFTVVMX1VOSEFORExFQUJMRTsKLX0KLQotc3RhdGljIGludAotaHZtX2VtdWxhdGVfcmVh ZChlbnVtIHg4Nl9zZWdtZW50IHNlZywKLSAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBv ZmZzZXQsCi0gICAgICAgICAgICAgICAgIHZvaWQgKnBfZGF0YSwKLSAgICAgICAgICAgICAgICAg dW5zaWduZWQgaW50IGJ5dGVzLAotICAgICAgICAgICAgICAgICBzdHJ1Y3QgeDg2X2VtdWxhdGVf Y3R4dCAqY3R4dCkKLXsKLSAgICBpZiAoICFpc194ODZfdXNlcl9zZWdtZW50KHNlZykgKQotICAg ICAgICByZXR1cm4gWDg2RU1VTF9VTkhBTkRMRUFCTEU7Ci0gICAgcmV0dXJuIGh2bV9yZWFkKHNl Zywgb2Zmc2V0LCBwX2RhdGEsIGJ5dGVzLCBodm1fYWNjZXNzX3JlYWQsCi0gICAgICAgICAgICAg ICAgICAgIGNvbnRhaW5lcl9vZihjdHh0LCBzdHJ1Y3Qgc2hfZW11bGF0ZV9jdHh0LCBjdHh0KSk7 Ci19Ci0KLXN0YXRpYyBpbnQKLWh2bV9lbXVsYXRlX2luc25fZmV0Y2goZW51bSB4ODZfc2VnbWVu dCBzZWcsCi0gICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAotICAg ICAgICAgICAgICAgICAgICAgICB2b2lkICpwX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAg IHVuc2lnbmVkIGludCBieXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHg4Nl9l bXVsYXRlX2N0eHQgKmN0eHQpCi17Ci0gICAgc3RydWN0IHNoX2VtdWxhdGVfY3R4dCAqc2hfY3R4 dCA9Ci0gICAgICAgIGNvbnRhaW5lcl9vZihjdHh0LCBzdHJ1Y3Qgc2hfZW11bGF0ZV9jdHh0LCBj dHh0KTsKLSAgICB1bnNpZ25lZCBpbnQgaW5zbl9vZmYgPSBvZmZzZXQgLSBzaF9jdHh0LT5pbnNu X2J1Zl9laXA7Ci0KLSAgICBBU1NFUlQoc2VnID09IHg4Nl9zZWdfY3MpOwotCi0gICAgLyogRmFs bCBiYWNrIGlmIHJlcXVlc3RlZCBieXRlcyBhcmUgbm90IGluIHRoZSBwcmVmZXRjaCBjYWNoZS4g Ki8KLSAgICBpZiAoIHVubGlrZWx5KChpbnNuX29mZiArIGJ5dGVzKSA+IHNoX2N0eHQtPmluc25f YnVmX2J5dGVzKSApCi0gICAgICAgIHJldHVybiBodm1fcmVhZChzZWcsIG9mZnNldCwgcF9kYXRh LCBieXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgIGh2bV9hY2Nlc3NfaW5zbl9mZXRjaCwg c2hfY3R4dCk7Ci0KLSAgICAvKiBIaXQgdGhlIGNhY2hlLiBTaW1wbGUgbWVtY3B5LiAqLwotICAg IG1lbWNweShwX2RhdGEsICZzaF9jdHh0LT5pbnNuX2J1ZltpbnNuX29mZl0sIGJ5dGVzKTsKLSAg ICByZXR1cm4gWDg2RU1VTF9PS0FZOwotfQotCi1zdGF0aWMgaW50Ci1odm1fZW11bGF0ZV93cml0 ZShlbnVtIHg4Nl9zZWdtZW50IHNlZywKLSAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcg b2Zmc2V0LAotICAgICAgICAgICAgICAgICAgdm9pZCAqcF9kYXRhLAotICAgICAgICAgICAgICAg ICAgdW5zaWduZWQgaW50IGJ5dGVzLAotICAgICAgICAgICAgICAgICAgc3RydWN0IHg4Nl9lbXVs YXRlX2N0eHQgKmN0eHQpCi17Ci0gICAgc3RydWN0IHNoX2VtdWxhdGVfY3R4dCAqc2hfY3R4dCA9 Ci0gICAgICAgIGNvbnRhaW5lcl9vZihjdHh0LCBzdHJ1Y3Qgc2hfZW11bGF0ZV9jdHh0LCBjdHh0 KTsKLSAgICBzdHJ1Y3QgdmNwdSAqdiA9IGN1cnJlbnQ7Ci0gICAgdW5zaWduZWQgbG9uZyBhZGRy OwotICAgIHZvaWQgKnB0cjsKLSAgICBpbnQgcmM7Ci0KLSAgICAvKiBIb3cgbWFueSBlbXVsYXRp b25zIGNvdWxkIHdlIHNhdmUgaWYgd2UgdW5zaGFkb3dlZCBvbiBzdGFjayB3cml0ZXM/ICovCi0g ICAgaWYgKCBzZWcgPT0geDg2X3NlZ19zcyApCi0gICAgICAgIHBlcmZjX2luY3Ioc2hhZG93X2Zh dWx0X2VtdWxhdGVfc3RhY2spOwotCi0gICAgcmMgPSBodm1fdHJhbnNsYXRlX3ZpcnR1YWxfYWRk cigKLSAgICAgICAgc2VnLCBvZmZzZXQsIGJ5dGVzLCBodm1fYWNjZXNzX3dyaXRlLCBzaF9jdHh0 LCAmYWRkcik7Ci0gICAgaWYgKCByYyB8fCAhYnl0ZXMgKQotICAgICAgICByZXR1cm4gcmM7Ci0K LSAgICAvKiBVbmFsaWduZWQgd3JpdGVzIGFyZSBvbmx5IGFjY2VwdGFibGUgb24gSFZNICovCi0g ICAgaWYgKCAoYWRkciAmIChieXRlcyAtIDEpKSAmJiAhaXNfaHZtX3ZjcHUodikgICkKLSAgICAg ICAgcmV0dXJuIFg4NkVNVUxfVU5IQU5ETEVBQkxFOwotCi0gICAgcHRyID0gc2hfZW11bGF0ZV9t YXBfZGVzdCh2LCBhZGRyLCBieXRlcywgc2hfY3R4dCk7Ci0gICAgaWYgKCBJU19FUlIocHRyKSAp Ci0gICAgICAgIHJldHVybiB+UFRSX0VSUihwdHIpOwotCi0gICAgcGFnaW5nX2xvY2sodi0+ZG9t YWluKTsKLSAgICBtZW1jcHkocHRyLCBwX2RhdGEsIGJ5dGVzKTsKLQotICAgIGlmICggdGJfaW5p dF9kb25lICkKLSAgICAgICAgdi0+YXJjaC5wYWdpbmcubW9kZS0+c2hhZG93LnRyYWNlX2VtdWxf d3JpdGVfdmFsKHB0ciwgYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHBfZGF0YSwgYnl0ZXMpOwotCi0gICAgc2hfZW11bGF0ZV91 bm1hcF9kZXN0KHYsIHB0ciwgYnl0ZXMsIHNoX2N0eHQpOwotICAgIHNoYWRvd19hdWRpdF90YWJs ZXModik7Ci0gICAgcGFnaW5nX3VubG9jayh2LT5kb21haW4pOwotCi0gICAgcmV0dXJuIFg4NkVN VUxfT0tBWTsKLX0KLQotc3RhdGljIGludAotaHZtX2VtdWxhdGVfY21weGNoZyhlbnVtIHg4Nl9z ZWdtZW50IHNlZywKLSAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQsCi0g ICAgICAgICAgICAgICAgICAgIHZvaWQgKnBfb2xkLAotICAgICAgICAgICAgICAgICAgICB2b2lk ICpwX25ldywKLSAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGJ5dGVzLAotICAgICAg ICAgICAgICAgICAgICBib29sIGxvY2ssCi0gICAgICAgICAgICAgICAgICAgIHN0cnVjdCB4ODZf ZW11bGF0ZV9jdHh0ICpjdHh0KQotewotICAgIHN0cnVjdCBzaF9lbXVsYXRlX2N0eHQgKnNoX2N0 eHQgPQotICAgICAgICBjb250YWluZXJfb2YoY3R4dCwgc3RydWN0IHNoX2VtdWxhdGVfY3R4dCwg Y3R4dCk7Ci0gICAgc3RydWN0IHZjcHUgKnYgPSBjdXJyZW50OwotICAgIHVuc2lnbmVkIGxvbmcg YWRkciwgb2xkLCBuZXcsIHByZXY7Ci0gICAgdm9pZCAqcHRyOwotICAgIGludCByYzsKLQotICAg IGlmICggYnl0ZXMgPiBzaXplb2YobG9uZykgKQotICAgICAgICByZXR1cm4gWDg2RU1VTF9VTkhB TkRMRUFCTEU7Ci0KLSAgICByYyA9IGh2bV90cmFuc2xhdGVfdmlydHVhbF9hZGRyKAotICAgICAg ICBzZWcsIG9mZnNldCwgYnl0ZXMsIGh2bV9hY2Nlc3Nfd3JpdGUsIHNoX2N0eHQsICZhZGRyKTsK LSAgICBpZiAoIHJjICkKLSAgICAgICAgcmV0dXJuIHJjOwotCi0gICAgLyogVW5hbGlnbmVkIHdy aXRlcyBhcmUgb25seSBhY2NlcHRhYmxlIG9uIEhWTSAqLwotICAgIGlmICggKGFkZHIgJiAoYnl0 ZXMgLSAxKSkgJiYgIWlzX2h2bV92Y3B1KHYpICApCi0gICAgICAgIHJldHVybiBYODZFTVVMX1VO SEFORExFQUJMRTsKLQotICAgIHB0ciA9IHNoX2VtdWxhdGVfbWFwX2Rlc3QodiwgYWRkciwgYnl0 ZXMsIHNoX2N0eHQpOwotICAgIGlmICggSVNfRVJSKHB0cikgKQotICAgICAgICByZXR1cm4gflBU Ul9FUlIocHRyKTsKLQotICAgIG9sZCA9IG5ldyA9IDA7Ci0gICAgbWVtY3B5KCZvbGQsIHBfb2xk LCBieXRlcyk7Ci0gICAgbWVtY3B5KCZuZXcsIHBfbmV3LCBieXRlcyk7Ci0KLSAgICBwYWdpbmdf bG9jayh2LT5kb21haW4pOwotICAgIHN3aXRjaCAoIGJ5dGVzICkKLSAgICB7Ci0gICAgY2FzZSAx OiBwcmV2ID0gY21weGNoZygodWludDhfdCAgKilwdHIsIG9sZCwgbmV3KTsgYnJlYWs7Ci0gICAg Y2FzZSAyOiBwcmV2ID0gY21weGNoZygodWludDE2X3QgKilwdHIsIG9sZCwgbmV3KTsgYnJlYWs7 Ci0gICAgY2FzZSA0OiBwcmV2ID0gY21weGNoZygodWludDMyX3QgKilwdHIsIG9sZCwgbmV3KTsg YnJlYWs7Ci0gICAgY2FzZSA4OiBwcmV2ID0gY21weGNoZygodWludDY0X3QgKilwdHIsIG9sZCwg bmV3KTsgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgU0hBRE9XX1BSSU5USygiY21weGNo ZyBzaXplICV1IGlzIG5vdCBzdXBwb3J0ZWRcbiIsIGJ5dGVzKTsKLSAgICAgICAgcHJldiA9IH5v bGQ7Ci0gICAgfQotCi0gICAgaWYgKCBwcmV2ICE9IG9sZCApCi0gICAgewotICAgICAgICBtZW1j cHkocF9vbGQsICZwcmV2LCBieXRlcyk7Ci0gICAgICAgIHJjID0gWDg2RU1VTF9DTVBYQ0hHX0ZB SUxFRDsKLSAgICB9Ci0KLSAgICBTSEFET1dfREVCVUcoRU1VTEFURSwKLSAgICAgICAgICAgICAg ICAgInZhICUjbHggd2FzICUjbHggZXhwZWN0ZWQgJSNseCB3YW50ZWQgJSNseCBub3cgJSNseCBi eXRlcyAldVxuIiwKLSAgICAgICAgICAgICAgICAgYWRkciwgcHJldiwgb2xkLCBuZXcsICoodW5z aWduZWQgbG9uZyAqKXB0ciwgYnl0ZXMpOwotCi0gICAgc2hfZW11bGF0ZV91bm1hcF9kZXN0KHYs IHB0ciwgYnl0ZXMsIHNoX2N0eHQpOwotICAgIHNoYWRvd19hdWRpdF90YWJsZXModik7Ci0gICAg cGFnaW5nX3VubG9jayh2LT5kb21haW4pOwotCi0gICAgcmV0dXJuIHJjOwotfQotCi1zdGF0aWMg Y29uc3Qgc3RydWN0IHg4Nl9lbXVsYXRlX29wcyBodm1fc2hhZG93X2VtdWxhdG9yX29wcyA9IHsK LSAgICAucmVhZCAgICAgICA9IGh2bV9lbXVsYXRlX3JlYWQsCi0gICAgLmluc25fZmV0Y2ggPSBo dm1fZW11bGF0ZV9pbnNuX2ZldGNoLAotICAgIC53cml0ZSAgICAgID0gaHZtX2VtdWxhdGVfd3Jp dGUsCi0gICAgLmNtcHhjaGcgICAgPSBodm1fZW11bGF0ZV9jbXB4Y2hnLAotICAgIC5jcHVpZCAg ICAgID0gaHZtZW11bF9jcHVpZCwKLX07CisgICAgdW5zaWduZWQgbG9uZyAqbGluZWFyKTsKICNl bmRpZgogCiBjb25zdCBzdHJ1Y3QgeDg2X2VtdWxhdGVfb3BzICpzaGFkb3dfaW5pdF9lbXVsYXRp b24oCkBAIC0xNjk2LDI4MSArMTQzOSw2IEBAIHN0YXRpYyB1bnNpZ25lZCBpbnQgc2hhZG93X2dl dF9hbGxvY2F0aW9uKHN0cnVjdCBkb21haW4gKmQpCiAgICAgICAgICAgICArICgocGcgJiAoKDEg PDwgKDIwIC0gUEFHRV9TSElGVCkpIC0gMSkpID8gMSA6IDApKTsKIH0KIAotI2lmIENPTkZJR19I Vk0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEhhbmRsaW5nIGd1ZXN0IHdyaXRlcyB0byBwYWdl dGFibGVzLiAqLwotCi0vKgotICogVHJhbnNsYXRlIGEgVkEgdG8gYW4gTUZOLCBpbmplY3Rpbmcg YSBwYWdlLWZhdWx0IGlmIHdlIGZhaWwuICBJZiB0aGUKLSAqIG1hcHBpbmcgc3VjY2VlZHMsIGEg cmVmZXJlbmNlIHdpbGwgYmUgaGVsZCBvbiB0aGUgdW5kZXJseWluZyBwYWdlLgotICovCi0jZGVm aW5lIEJBRF9HVkFfVE9fR0ZOICh+MFVMKQotI2RlZmluZSBCQURfR0ZOX1RPX01GTiAofjFVTCkK LSNkZWZpbmUgUkVBRE9OTFlfR0ZOICAgKH4yVUwpCi1zdGF0aWMgbWZuX3QgZW11bGF0ZV9ndmFf dG9fbWZuKHN0cnVjdCB2Y3B1ICp2LCB1bnNpZ25lZCBsb25nIHZhZGRyLAotICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2hfZW11bGF0ZV9jdHh0ICpzaF9jdHh0KQotewot ICAgIHVuc2lnbmVkIGxvbmcgZ2ZuOwotICAgIHN0cnVjdCBwYWdlX2luZm8gKnBhZ2U7Ci0gICAg bWZuX3QgbWZuOwotICAgIHAybV90eXBlX3QgcDJtdDsKLSAgICB1aW50MzJfdCBwZmVjID0gUEZF Q19wYWdlX3ByZXNlbnQgfCBQRkVDX3dyaXRlX2FjY2VzczsKLQotICAgIC8qIFRyYW5zbGF0ZSB0 aGUgVkEgdG8gYSBHRk4uICovCi0gICAgZ2ZuID0gcGFnaW5nX2dldF9ob3N0bW9kZSh2KS0+Z3Zh X3RvX2dmbih2LCBOVUxMLCB2YWRkciwgJnBmZWMpOwotICAgIGlmICggZ2ZuID09IGdmbl94KElO VkFMSURfR0ZOKSApCi0gICAgewotICAgICAgICB4ODZfZW11bF9wYWdlZmF1bHQocGZlYywgdmFk ZHIsICZzaF9jdHh0LT5jdHh0KTsKLQotICAgICAgICByZXR1cm4gX21mbihCQURfR1ZBX1RPX0dG Tik7Ci0gICAgfQotCi0gICAgLyogVHJhbnNsYXRlIHRoZSBHRk4gdG8gYW4gTUZOLiAqLwotICAg IEFTU0VSVCghcGFnaW5nX2xvY2tlZF9ieV9tZSh2LT5kb21haW4pKTsKLQotICAgIHBhZ2UgPSBn ZXRfcGFnZV9mcm9tX2dmbih2LT5kb21haW4sIGdmbiwgJnAybXQsIFAyTV9BTExPQyk7Ci0KLSAg ICAvKiBTYW5pdHkgY2hlY2tpbmcuICovCi0gICAgaWYgKCBwYWdlID09IE5VTEwgKQotICAgIHsK LSAgICAgICAgcmV0dXJuIF9tZm4oQkFEX0dGTl9UT19NRk4pOwotICAgIH0KLSAgICBpZiAoIHAy bV9pc19kaXNjYXJkX3dyaXRlKHAybXQpICkKLSAgICB7Ci0gICAgICAgIHB1dF9wYWdlKHBhZ2Up OwotICAgICAgICByZXR1cm4gX21mbihSRUFET05MWV9HRk4pOwotICAgIH0KLSAgICBpZiAoICFw Mm1faXNfcmFtKHAybXQpICkKLSAgICB7Ci0gICAgICAgIHB1dF9wYWdlKHBhZ2UpOwotICAgICAg ICByZXR1cm4gX21mbihCQURfR0ZOX1RPX01GTik7Ci0gICAgfQotICAgIG1mbiA9IHBhZ2VfdG9f bWZuKHBhZ2UpOwotICAgIEFTU0VSVChtZm5fdmFsaWQobWZuKSk7Ci0KLSAgICB2LT5hcmNoLnBh Z2luZy5sYXN0X3dyaXRlX3dhc19wdCA9ICEhc2hfbWZuX2lzX2FfcGFnZV90YWJsZShtZm4pOwot Ci0gICAgcmV0dXJuIG1mbjsKLX0KLQotLyoKLSAqIENoZWNrIHRoYXQgdGhlIHVzZXIgaXMgYWxs b3dlZCB0byBwZXJmb3JtIHRoaXMgd3JpdGUuICBJZiBhIG1hcHBpbmcgaXMKLSAqIHJldHVybmVk LCBwYWdlIHJlZmVyZW5jZXMgd2lsbCBiZSBoZWxkIG9uIHNoX2N0eHQtPm1mblswXSBhbmQKLSAq IHNoX2N0eHQtPm1mblsxXSBpZmYgIUlOVkFMSURfTUZOLgotICovCi1zdGF0aWMgdm9pZCAqc2hf ZW11bGF0ZV9tYXBfZGVzdChzdHJ1Y3QgdmNwdSAqdiwgdW5zaWduZWQgbG9uZyB2YWRkciwKLSAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBieXRlcywKLSAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzaF9lbXVsYXRlX2N0eHQgKnNoX2N0 eHQpCi17Ci0gICAgc3RydWN0IGRvbWFpbiAqZCA9IHYtPmRvbWFpbjsKLSAgICB2b2lkICptYXA7 Ci0KLSNpZm5kZWYgTkRFQlVHCi0gICAgLyogV2UgZG9uJ3QgZW11bGF0ZSB1c2VyLW1vZGUgd3Jp dGVzIHRvIHBhZ2UgdGFibGVzLiAqLwotICAgIGlmICggaXNfaHZtX2RvbWFpbihkKSA/IGh2bV9n ZXRfY3BsKHYpID09IDMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgOiAhZ3Vlc3Rfa2VybmVs X21vZGUodiwgZ3Vlc3RfY3B1X3VzZXJfcmVncygpKSApCi0gICAgewotICAgICAgICBnZHByaW50 ayhYRU5MT0dfREVCVUcsICJVc2VyLW1vZGUgd3JpdGUgdG8gcGFnZXRhYmxlIHJlYWNoZWQgIgot ICAgICAgICAgICAgICAgICAiZW11bGF0ZV9tYXBfZGVzdCgpLiBUaGlzIHNob3VsZCBuZXZlciBo YXBwZW4hXG4iKTsKLSAgICAgICAgcmV0dXJuIE1BUFBJTkdfVU5IQU5ETEVBQkxFOwotICAgIH0K LSNlbmRpZgotCi0gICAgc2hfY3R4dC0+bWZuWzBdID0gZW11bGF0ZV9ndmFfdG9fbWZuKHYsIHZh ZGRyLCBzaF9jdHh0KTsKLSAgICBpZiAoICFtZm5fdmFsaWQoc2hfY3R4dC0+bWZuWzBdKSApCi0g ICAgewotICAgICAgICBzd2l0Y2ggKCBtZm5feChzaF9jdHh0LT5tZm5bMF0pICkKLSAgICAgICAg ewotICAgICAgICBjYXNlIEJBRF9HVkFfVE9fR0ZOOiByZXR1cm4gTUFQUElOR19FWENFUFRJT047 Ci0gICAgICAgIGNhc2UgUkVBRE9OTFlfR0ZOOiAgIHJldHVybiBNQVBQSU5HX1NJTEVOVF9GQUlM OwotICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICByZXR1cm4gTUFQUElOR19VTkhBTkRMRUFC TEU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBVbmFsaWduZWQgd3JpdGVzIG1lYW4gcHJv YmFibHkgdGhpcyBpc24ndCBhIHBhZ2V0YWJsZS4gKi8KLSAgICBpZiAoIHZhZGRyICYgKGJ5dGVz IC0gMSkgKQotICAgICAgICBzaF9yZW1vdmVfc2hhZG93cyhkLCBzaF9jdHh0LT5tZm5bMF0sIDAs IDAgLyogU2xvdywgY2FuIGZhaWwuICovICk7Ci0KLSAgICBpZiAoIGxpa2VseSgoKHZhZGRyICsg Ynl0ZXMgLSAxKSAmIFBBR0VfTUFTSykgPT0gKHZhZGRyICYgUEFHRV9NQVNLKSkgKQotICAgIHsK LSAgICAgICAgLyogV2hvbGUgd3JpdGUgZml0cyBvbiBhIHNpbmdsZSBwYWdlLiAqLwotICAgICAg ICBzaF9jdHh0LT5tZm5bMV0gPSBJTlZBTElEX01GTjsKLSAgICAgICAgbWFwID0gbWFwX2RvbWFp bl9wYWdlKHNoX2N0eHQtPm1mblswXSkgKyAodmFkZHIgJiB+UEFHRV9NQVNLKTsKLSAgICB9Ci0g ICAgZWxzZSBpZiAoICFpc19odm1fZG9tYWluKGQpICkKLSAgICB7Ci0gICAgICAgIC8qCi0gICAg ICAgICAqIENyb3NzLXBhZ2UgZW11bGF0ZWQgd3JpdGVzIGFyZSBvbmx5IHN1cHBvcnRlZCBmb3Ig SFZNIGd1ZXN0czsKLSAgICAgICAgICogUFYgZ3Vlc3RzIG91Z2h0IHRvIGtub3cgYmV0dGVyLgot ICAgICAgICAgKi8KLSAgICAgICAgcHV0X3BhZ2UobWZuX3RvX3BhZ2Uoc2hfY3R4dC0+bWZuWzBd KSk7Ci0gICAgICAgIHJldHVybiBNQVBQSU5HX1VOSEFORExFQUJMRTsKLSAgICB9Ci0gICAgZWxz ZQotICAgIHsKLSAgICAgICAgLyogVGhpcyB3cml0ZSBjcm9zc2VzIGEgcGFnZSBib3VuZGFyeS4g VHJhbnNsYXRlIHRoZSBzZWNvbmQgcGFnZS4gKi8KLSAgICAgICAgc2hfY3R4dC0+bWZuWzFdID0g ZW11bGF0ZV9ndmFfdG9fbWZuKAotICAgICAgICAgICAgdiwgKHZhZGRyICsgYnl0ZXMgLSAxKSAm IFBBR0VfTUFTSywgc2hfY3R4dCk7Ci0gICAgICAgIGlmICggIW1mbl92YWxpZChzaF9jdHh0LT5t Zm5bMV0pICkKLSAgICAgICAgewotICAgICAgICAgICAgcHV0X3BhZ2UobWZuX3RvX3BhZ2Uoc2hf Y3R4dC0+bWZuWzBdKSk7Ci0gICAgICAgICAgICBzd2l0Y2ggKCBtZm5feChzaF9jdHh0LT5tZm5b MV0pICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgQkFEX0dWQV9UT19HRk46IHJl dHVybiBNQVBQSU5HX0VYQ0VQVElPTjsKLSAgICAgICAgICAgIGNhc2UgUkVBRE9OTFlfR0ZOOiAg IHJldHVybiBNQVBQSU5HX1NJTEVOVF9GQUlMOwotICAgICAgICAgICAgZGVmYXVsdDogICAgICAg ICAgICAgcmV0dXJuIE1BUFBJTkdfVU5IQU5ETEVBQkxFOwotICAgICAgICAgICAgfQotICAgICAg ICB9Ci0KLSAgICAgICAgLyogQ3Jvc3MtcGFnZSB3cml0ZXMgbWVhbiBwcm9iYWJseSBub3QgYSBw YWdldGFibGUuICovCi0gICAgICAgIHNoX3JlbW92ZV9zaGFkb3dzKGQsIHNoX2N0eHQtPm1mblsx XSwgMCwgMCAvKiBTbG93LCBjYW4gZmFpbC4gKi8gKTsKLQotICAgICAgICBtYXAgPSB2bWFwKHNo X2N0eHQtPm1mbiwgMik7Ci0gICAgICAgIGlmICggIW1hcCApCi0gICAgICAgIHsKLSAgICAgICAg ICAgIHB1dF9wYWdlKG1mbl90b19wYWdlKHNoX2N0eHQtPm1mblswXSkpOwotICAgICAgICAgICAg cHV0X3BhZ2UobWZuX3RvX3BhZ2Uoc2hfY3R4dC0+bWZuWzFdKSk7Ci0gICAgICAgICAgICByZXR1 cm4gTUFQUElOR19VTkhBTkRMRUFCTEU7Ci0gICAgICAgIH0KLSAgICAgICAgbWFwICs9ICh2YWRk ciAmIH5QQUdFX01BU0spOwotICAgIH0KLQotI2lmIChTSEFET1dfT1BUSU1JWkFUSU9OUyAmIFNI T1BUX1NLSVBfVkVSSUZZKQotICAgIC8qCi0gICAgICogUmVtZW1iZXIgaWYgdGhlIGJvdHRvbSBi aXQgd2FzIGNsZWFyLCBzbyB3ZSBjYW4gY2hvb3NlIG5vdCB0byBydW4KLSAgICAgKiB0aGUgY2hh bmdlIHRocm91Z2ggdGhlIHZlcmlmeSBjb2RlIGlmIGl0J3Mgc3RpbGwgY2xlYXIgYWZ0ZXJ3YXJk cy4KLSAgICAgKi8KLSAgICBzaF9jdHh0LT5sb3dfYml0X3dhc19jbGVhciA9IG1hcCAhPSBOVUxM ICYmICEoKih1OCAqKW1hcCAmIF9QQUdFX1BSRVNFTlQpOwotI2VuZGlmCi0KLSAgICByZXR1cm4g bWFwOwotfQotCi0vKgotICogT3B0aW1pemF0aW9uOiBJZiB3ZSBzZWUgdHdvIGVtdWxhdGVkIHdy aXRlcyBvZiB6ZXJvcyB0byB0aGUgc2FtZQotICogcGFnZS10YWJsZSB3aXRob3V0IGFub3RoZXIg a2luZCBvZiBwYWdlIGZhdWx0IGluIGJldHdlZW4sIHdlIGd1ZXNzCi0gKiB0aGF0IHRoaXMgaXMg YSBiYXRjaCBvZiBjaGFuZ2VzIChmb3IgcHJvY2VzcyBkZXN0cnVjdGlvbikgYW5kCi0gKiB1bnNo YWRvdyB0aGUgcGFnZSBzbyB3ZSBkb24ndCB0YWtlIGEgcGFnZWZhdWx0IG9uIGV2ZXJ5IGVudHJ5 LiAgVGhpcwotICogc2hvdWxkIGFsc28gbWFrZSBmaW5kaW5nIHdyaXRlYWJsZSBtYXBwaW5ncyBv ZiBwYWdldGFibGVzIG11Y2gKLSAqIGVhc2llci4KLSAqCi0gKiBMb29rIHRvIHNlZSBpZiB0aGlz IGlzIHRoZSBzZWNvbmQgZW11bGF0ZWQgd3JpdGUgaW4gYSByb3cgdG8gdGhpcwotICogcGFnZSwg YW5kIHVuc2hhZG93IGlmIGl0IGlzLgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgY2hlY2tfZm9y X2Vhcmx5X3Vuc2hhZG93KHN0cnVjdCB2Y3B1ICp2LCBtZm5fdCBnbWZuKQotewotI2lmIFNIQURP V19PUFRJTUlaQVRJT05TICYgU0hPUFRfRUFSTFlfVU5TSEFET1cKLSAgICBzdHJ1Y3QgZG9tYWlu ICpkID0gdi0+ZG9tYWluOwotCi0gICAgLyoKLSAgICAgKiBJZiB0aGUgZG9tYWluIGhhcyBuZXZl ciBtYWRlIGEgImR5aW5nIiBvcCwgdXNlIHRoZSB0d28td3JpdGVzCi0gICAgICogaGV1cmlzdGlj OyBvdGhlcndpc2UsIHVuc2hhZG93IGFzIHNvb24gYXMgd2Ugd3JpdGUgYSB6ZXJvIGZvciBhIGR5 aW5nCi0gICAgICogcHJvY2Vzcy4KLSAgICAgKgotICAgICAqIERvbid0IGJvdGhlciB0cnlpbmcg dG8gdW5zaGFkb3cgaWYgaXQncyBub3QgYSBQVCwgb3IgaWYgaXQncyA+IGwxLgotICAgICAqLwot ICAgIGlmICggKCB2LT5hcmNoLnBhZ2luZy5zaGFkb3cucGFnZXRhYmxlX2R5aW5nCi0gICAgICAg ICAgIHx8ICggIWQtPmFyY2gucGFnaW5nLnNoYWRvdy5wYWdldGFibGVfZHlpbmdfb3AKLSAgICAg ICAgICAgICAgICAmJiB2LT5hcmNoLnBhZ2luZy5zaGFkb3cubGFzdF9lbXVsYXRlZF9tZm5fZm9y X3Vuc2hhZG93ID09IG1mbl94KGdtZm4pICkgKQotICAgICAgICAgJiYgc2hfbWZuX2lzX2FfcGFn ZV90YWJsZShnbWZuKQotICAgICAgICAgJiYgKCFkLT5hcmNoLnBhZ2luZy5zaGFkb3cucGFnZXRh YmxlX2R5aW5nX29wIHx8Ci0gICAgICAgICAgICAgIShtZm5fdG9fcGFnZShnbWZuKS0+c2hhZG93 X2ZsYWdzCi0gICAgICAgICAgICAgICAmIChTSEZfTDJfMzJ8U0hGX0wyX1BBRXxTSEZfTDJIX1BB RXxTSEZfTDRfNjQpKSkgKQotICAgIHsKLSAgICAgICAgcGVyZmNfaW5jcihzaGFkb3dfZWFybHlf dW5zaGFkb3cpOwotICAgICAgICBzaF9yZW1vdmVfc2hhZG93cyhkLCBnbWZuLCAxLCAwIC8qIEZh c3QsIGNhbiBmYWlsIHRvIHVuc2hhZG93ICovICk7Ci0gICAgICAgIFRSQUNFX1NIQURPV19QQVRI X0ZMQUcoVFJDRV9TRkxBR19FQVJMWV9VTlNIQURPVyk7Ci0gICAgfQotICAgIHYtPmFyY2gucGFn aW5nLnNoYWRvdy5sYXN0X2VtdWxhdGVkX21mbl9mb3JfdW5zaGFkb3cgPSBtZm5feChnbWZuKTsK LSNlbmRpZgotfQotCi0vKgotICogVGlkeSB1cCBhZnRlciB0aGUgZW11bGF0ZWQgd3JpdGU6IG1h cmsgcGFnZXMgZGlydHksIHZlcmlmeSB0aGUgbmV3Ci0gKiBjb250ZW50cywgYW5kIHVuZG8gdGhl IG1hcHBpbmcuCi0gKi8KLXN0YXRpYyB2b2lkIHNoX2VtdWxhdGVfdW5tYXBfZGVzdChzdHJ1Y3Qg dmNwdSAqdiwgdm9pZCAqYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1 bnNpZ25lZCBpbnQgYnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ry dWN0IHNoX2VtdWxhdGVfY3R4dCAqc2hfY3R4dCkKLXsKLSAgICB1MzIgYjEgPSBieXRlcywgYjIg PSAwLCBzaGZsYWdzOwotCi0gICAgQVNTRVJUKG1mbl92YWxpZChzaF9jdHh0LT5tZm5bMF0pKTsK LQotICAgIC8qIElmIHdlIGFyZSB3cml0aW5nIGxvdHMgb2YgUFRFLWFsaWduZWQgemVyb3MsIG1p Z2h0IHdhbnQgdG8gdW5zaGFkb3cgKi8KLSAgICBpZiAoIGxpa2VseShieXRlcyA+PSA0KSAmJiAo Kih1MzIgKilhZGRyID09IDApICkKLSAgICB7Ci0gICAgICAgIGlmICggISgodW5zaWduZWQgbG9u ZylhZGRyICYgKHNoX2N0eHQtPnB0ZV9zaXplIC0gMSkpICkKLSAgICAgICAgICAgIGNoZWNrX2Zv cl9lYXJseV91bnNoYWRvdyh2LCBzaF9jdHh0LT5tZm5bMF0pOwotICAgICAgICAvKgotICAgICAg ICAgKiBEb24ndCByZXNldCB0aGUgaGV1cmlzdGljIGlmIHdlJ3JlIHdyaXRpbmcgemVyb3MgYXQg bm9uLWFsaWduZWQKLSAgICAgICAgICogYWRkcmVzc2VzLCBvdGhlcndpc2UgaXQgZG9lc24ndCBj YXRjaCBSRVAgTU9WU0Qgb24gUEFFIGd1ZXN0cy4KLSAgICAgICAgICovCi0gICAgfQotICAgIGVs c2UKLSAgICAgICAgc2hfcmVzZXRfZWFybHlfdW5zaGFkb3codik7Ci0KLSAgICAvKgotICAgICAq IFdlIGNhbiBhdm9pZCByZS12ZXJpZnlpbmcgdGhlIHBhZ2UgY29udGVudHMgYWZ0ZXIgdGhlIHdy aXRlIGlmOgotICAgICAqICAtIGl0IHdhcyBubyBsYXJnZXIgdGhhbiB0aGUgUFRFIHR5cGUgb2Yg dGhpcyBwYWdldGFibGU7Ci0gICAgICogIC0gaXQgd2FzIGFsaWduZWQgdG8gdGhlIFBURSBib3Vu ZGFyaWVzOyBhbmQKLSAgICAgKiAgLSBfUEFHRV9QUkVTRU5UIHdhcyBjbGVhciBiZWZvcmUgYW5k IGFmdGVyIHRoZSB3cml0ZS4KLSAgICAgKi8KLSAgICBzaGZsYWdzID0gbWZuX3RvX3BhZ2Uoc2hf Y3R4dC0+bWZuWzBdKS0+c2hhZG93X2ZsYWdzOwotI2lmIChTSEFET1dfT1BUSU1JWkFUSU9OUyAm IFNIT1BUX1NLSVBfVkVSSUZZKQotICAgIGlmICggc2hfY3R4dC0+bG93X2JpdF93YXNfY2xlYXIK LSAgICAgICAgICYmICEoKih1OCAqKWFkZHIgJiBfUEFHRV9QUkVTRU5UKQotICAgICAgICAgJiYg KCghKHNoZmxhZ3MgJiBTSEZfMzIpCi0gICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAq IE5vdCBzaGFkb3dlZCAzMi1iaXQ6IGFsaWduZWQgNjQtYml0IHdyaXRlcyB0aGF0IGxlYXZlCi0g ICAgICAgICAgICAgICAqIHRoZSBwcmVzZW50IGJpdCB1bnNldCBhcmUgc2FmZSB0byBpZ25vcmUu Ci0gICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAmJiAoKHVuc2lnbmVkIGxvbmcpYWRk ciAmIDcpID09IDAKLSAgICAgICAgICAgICAgJiYgYnl0ZXMgPD0gOCkKLSAgICAgICAgICAgICB8 fAotICAgICAgICAgICAgICghKHNoZmxhZ3MgJiAoU0hGX1BBRXxTSEZfNjQpKQotICAgICAgICAg ICAgICAvKgotICAgICAgICAgICAgICAgKiBOb3Qgc2hhZG93ZWQgUEFFLzY0LWJpdDogYWxpZ25l ZCAzMi1iaXQgd3JpdGVzIHRoYXQKLSAgICAgICAgICAgICAgICogbGVhdmUgdGhlIHByZXNlbnQg Yml0IHVuc2V0IGFyZSBzYWZlIHRvIGlnbm9yZS4KLSAgICAgICAgICAgICAgICovCi0gICAgICAg ICAgICAgICYmICgodW5zaWduZWQgbG9uZylhZGRyICYgMykgPT0gMAotICAgICAgICAgICAgICAm JiBieXRlcyA8PSA0KSkgKQotICAgIHsKLSAgICAgICAgLyogV3JpdGVzIHdpdGggdGhpcyBhbGln bm1lbnQgY29uc3RyYWludCBjYW4ndCBwb3NzaWJseSBjcm9zcyBwYWdlcy4gKi8KLSAgICAgICAg QVNTRVJUKCFtZm5fdmFsaWQoc2hfY3R4dC0+bWZuWzFdKSk7Ci0gICAgfQotICAgIGVsc2UKLSNl bmRpZiAvKiBTSEFET1dfT1BUSU1JWkFUSU9OUyAmIFNIT1BUX1NLSVBfVkVSSUZZICovCi0gICAg ewotICAgICAgICBpZiAoIHVubGlrZWx5KG1mbl92YWxpZChzaF9jdHh0LT5tZm5bMV0pKSApCi0g ICAgICAgIHsKLSAgICAgICAgICAgIC8qIFZhbGlkYXRlIGFzIHR3byB3cml0ZXMsIG9uZSB0byBl YWNoIHBhZ2UuICovCi0gICAgICAgICAgICBiMSA9IFBBR0VfU0laRSAtICgoKHVuc2lnbmVkIGxv bmcpYWRkcikgJiB+UEFHRV9NQVNLKTsKLSAgICAgICAgICAgIGIyID0gYnl0ZXMgLSBiMTsKLSAg ICAgICAgICAgIEFTU0VSVChiMiA8IGJ5dGVzKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIGxp a2VseShiMSA+IDApICkKLSAgICAgICAgICAgIHNoX3ZhbGlkYXRlX2d1ZXN0X3B0X3dyaXRlKHYs IHNoX2N0eHQtPm1mblswXSwgYWRkciwgYjEpOwotICAgICAgICBpZiAoIHVubGlrZWx5KGIyID4g MCkgKQotICAgICAgICAgICAgc2hfdmFsaWRhdGVfZ3Vlc3RfcHRfd3JpdGUodiwgc2hfY3R4dC0+ bWZuWzFdLCBhZGRyICsgYjEsIGIyKTsKLSAgICB9Ci0KLSAgICBwYWdpbmdfbWFya19kaXJ0eSh2 LT5kb21haW4sIHNoX2N0eHQtPm1mblswXSk7Ci0gICAgcHV0X3BhZ2UobWZuX3RvX3BhZ2Uoc2hf Y3R4dC0+bWZuWzBdKSk7Ci0KLSAgICBpZiAoIHVubGlrZWx5KG1mbl92YWxpZChzaF9jdHh0LT5t Zm5bMV0pKSApCi0gICAgewotICAgICAgICBwYWdpbmdfbWFya19kaXJ0eSh2LT5kb21haW4sIHNo X2N0eHQtPm1mblsxXSk7Ci0gICAgICAgIHB1dF9wYWdlKG1mbl90b19wYWdlKHNoX2N0eHQtPm1m blsxXSkpOwotICAgICAgICB2dW5tYXAoKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpYWRkciAmIFBB R0VfTUFTSykpOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIHVubWFwX2RvbWFpbl9wYWdlKGFk ZHIpOwotCi0gICAgYXRvbWljX2luYygmdi0+ZG9tYWluLT5hcmNoLnBhZ2luZy5zaGFkb3cuZ3Rh YmxlX2RpcnR5X3ZlcnNpb24pOwotfQotI2VuZGlmCi0KIC8qKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8q IEhhc2ggdGFibGUgZm9yIHN0b3JpbmcgdGhlIGd1ZXN0LT5zaGFkb3cgbWFwcGluZ3MuCiAgKiBU aGUgdGFibGUgaXRzZWxmIGlzIGFuIGFycmF5IG9mIHBvaW50ZXJzIHRvIHNoYWRvd3M7IHRoZSBz aGFkb3dzIGFyZSB0aGVuCmRpZmYgLS1naXQgYS94ZW4vYXJjaC94ODYvbW0vc2hhZG93L2h2bS5j IGIveGVuL2FyY2gveDg2L21tL3NoYWRvdy9odm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl eCAwMDAwMDAwLi44NjNmNjQ0Ci0tLSAvZGV2L251bGwKKysrIGIveGVuL2FyY2gveDg2L21tL3No YWRvdy9odm0uYwpAQCAtMCwwICsxLDU5MCBAQAorCisvKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisg KiBhcmNoL3g4Ni9tbS9zaGFkb3cvaHZtLmMKKyAqCisgKiBTaGFkb3cgY29kZSB0aGF0IGRvZXMg bm90IG5lZWQgdG8gYmUgbXVsdGlwbHkgY29tcGlsZWQgYW5kIGlzIEhWTSBvbmx5LgorICogUGFy dHMgb2YgdGhpcyBjb2RlIGFyZSBDb3B5cmlnaHQgKGMpIDIwMDYgYnkgWGVuU291cmNlIEluYy4K KyAqIFBhcnRzIG9mIHRoaXMgY29kZSBhcmUgQ29weXJpZ2h0IChjKSAyMDA2IGJ5IE1pY2hhZWwg QSBGZXR0ZXJtYW4KKyAqIFBhcnRzIGJhc2VkIG9uIGVhcmxpZXIgd29yayBieSBNaWNoYWVsIEEg RmV0dGVybWFuLCBJYW4gUHJhdHQgZXQgYWwuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUg c29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVu ZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlz aGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAy IG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lv bi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBp dCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBl dmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVT UyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJs aWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNl aXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3 aXRoIHRoaXMgcHJvZ3JhbTsgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNl cy8+LgorICovCisKKyNpbmNsdWRlIDx4ZW4vdHlwZXMuaD4KKyNpbmNsdWRlIDx4ZW4vbW0uaD4K KyNpbmNsdWRlIDx4ZW4vdHJhY2UuaD4KKyNpbmNsdWRlIDx4ZW4vc2NoZWQuaD4KKyNpbmNsdWRl IDx4ZW4vcGVyZmMuaD4KKyNpbmNsdWRlIDx4ZW4vaXJxLmg+CisjaW5jbHVkZSA8eGVuL2RvbWFp bl9wYWdlLmg+CisjaW5jbHVkZSA8eGVuL2d1ZXN0X2FjY2Vzcy5oPgorI2luY2x1ZGUgPHhlbi9r ZXloYW5kbGVyLmg+CisjaW5jbHVkZSA8YXNtL2V2ZW50Lmg+CisjaW5jbHVkZSA8YXNtL3BhZ2Uu aD4KKyNpbmNsdWRlIDxhc20vY3VycmVudC5oPgorI2luY2x1ZGUgPGFzbS9mbHVzaHRsYi5oPgor I2luY2x1ZGUgPGFzbS9zaGFkb3cuaD4KKyNpbmNsdWRlIDxhc20vaHZtL2lvcmVxLmg+CisjaW5j bHVkZSA8eGVuL251bWEuaD4KKyNpbmNsdWRlICJwcml2YXRlLmgiCisKKy8qKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKi8KKy8qIHg4NiBlbXVsYXRvciBzdXBwb3J0IGZvciB0aGUgc2hhZG93IGNvZGUKKyAqLwor CisvKgorICogUmV0dXJucyBhIG1hcHBlZCBwb2ludGVyIHRvIHdyaXRlIHRvLCBvciBvbmUgb2Yg dGhlIGZvbGxvd2luZyBlcnJvcgorICogaW5kaWNhdG9ycy4KKyAqLworI2RlZmluZSBNQVBQSU5H X1VOSEFORExFQUJMRSBFUlJfUFRSKH4obG9uZylYODZFTVVMX1VOSEFORExFQUJMRSkKKyNkZWZp bmUgTUFQUElOR19FWENFUFRJT04gICAgRVJSX1BUUih+KGxvbmcpWDg2RU1VTF9FWENFUFRJT04p CisjZGVmaW5lIE1BUFBJTkdfU0lMRU5UX0ZBSUwgIEVSUl9QVFIofihsb25nKVg4NkVNVUxfT0tB WSkKK3N0YXRpYyB2b2lkICpzaF9lbXVsYXRlX21hcF9kZXN0KHN0cnVjdCB2Y3B1ICp2LCB1bnNp Z25lZCBsb25nIHZhZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWdu ZWQgaW50IGJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNo X2VtdWxhdGVfY3R4dCAqc2hfY3R4dCk7CitzdGF0aWMgdm9pZCBzaF9lbXVsYXRlX3VubWFwX2Rl c3Qoc3RydWN0IHZjcHUgKnYsIHZvaWQgKmFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgdW5zaWduZWQgaW50IGJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHN0cnVjdCBzaF9lbXVsYXRlX2N0eHQgKnNoX2N0eHQpOworCisvKgorICogQ2FsbGVy cyB3aGljaCBwYXNzIGEga25vd24gaW4tcmFuZ2UgeDg2X3NlZ21lbnQgY2FuIHJlbHkgb24gdGhl IHJldHVybgorICogcG9pbnRlciBiZWluZyB2YWxpZC4gIE90aGVyIGNhbGxlcnMgbXVzdCBleHBs aWNpdGx5IGNoZWNrIGZvciBlcnJvcnMuCisgKi8KK3N0cnVjdCBzZWdtZW50X3JlZ2lzdGVyICpo dm1fZ2V0X3NlZ19yZWcoCisgICAgZW51bSB4ODZfc2VnbWVudCBzZWcsIHN0cnVjdCBzaF9lbXVs YXRlX2N0eHQgKnNoX2N0eHQpCit7CisgICAgdW5zaWduZWQgaW50IGlkeCA9IHNlZzsKKyAgICBz dHJ1Y3Qgc2VnbWVudF9yZWdpc3RlciAqc2VnX3JlZzsKKworICAgIGlmICggaWR4ID49IEFSUkFZ X1NJWkUoc2hfY3R4dC0+c2VnX3JlZykgKQorICAgICAgICByZXR1cm4gRVJSX1BUUigtWDg2RU1V TF9VTkhBTkRMRUFCTEUpOworCisgICAgc2VnX3JlZyA9ICZzaF9jdHh0LT5zZWdfcmVnW2lkeF07 CisgICAgaWYgKCAhX190ZXN0X2FuZF9zZXRfYml0KGlkeCwgJnNoX2N0eHQtPnZhbGlkX3NlZ19y ZWdzKSApCisgICAgICAgIGh2bV9nZXRfc2VnbWVudF9yZWdpc3RlcihjdXJyZW50LCBpZHgsIHNl Z19yZWcpOworICAgIHJldHVybiBzZWdfcmVnOworfQorCitpbnQgaHZtX3RyYW5zbGF0ZV92aXJ0 dWFsX2FkZHIoCisgICAgZW51bSB4ODZfc2VnbWVudCBzZWcsCisgICAgdW5zaWduZWQgbG9uZyBv ZmZzZXQsCisgICAgdW5zaWduZWQgaW50IGJ5dGVzLAorICAgIGVudW0gaHZtX2FjY2Vzc190eXBl IGFjY2Vzc190eXBlLAorICAgIHN0cnVjdCBzaF9lbXVsYXRlX2N0eHQgKnNoX2N0eHQsCisgICAg dW5zaWduZWQgbG9uZyAqbGluZWFyKQoreworICAgIGNvbnN0IHN0cnVjdCBzZWdtZW50X3JlZ2lz dGVyICpyZWc7CisgICAgaW50IG9rYXk7CisKKyAgICByZWcgPSBodm1fZ2V0X3NlZ19yZWcoc2Vn LCBzaF9jdHh0KTsKKyAgICBpZiAoIElTX0VSUihyZWcpICkKKyAgICAgICAgcmV0dXJuIC1QVFJf RVJSKHJlZyk7CisKKyAgICBva2F5ID0gaHZtX3ZpcnR1YWxfdG9fbGluZWFyX2FkZHIoCisgICAg ICAgIHNlZywgcmVnLCBvZmZzZXQsIGJ5dGVzLCBhY2Nlc3NfdHlwZSwKKyAgICAgICAgaHZtX2dl dF9zZWdfcmVnKHg4Nl9zZWdfY3MsIHNoX2N0eHQpLCBsaW5lYXIpOworCisgICAgaWYgKCAhb2th eSApCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBMZWF2ZSBleGNlcHRpb24gaW5qZWN0 aW9uIHRvIHRoZSBjYWxsZXIgZm9yIG5vbi11c2VyIHNlZ21lbnRzOiBXZQorICAgICAgICAgKiBu ZWl0aGVyIGtub3cgdGhlIGV4YWN0IGVycm9yIGNvZGUgdG8gYmUgdXNlZCwgbm9yIGNhbiB3ZSBl YXNpbHkKKyAgICAgICAgICogZGV0ZXJtaW5lIHRoZSBraW5kIG9mIGV4Y2VwdGlvbiAoI0dQIG9y ICNUUykgaW4gdGhhdCBjYXNlLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKCBpc194ODZfdXNl cl9zZWdtZW50KHNlZykgKQorICAgICAgICAgICAgeDg2X2VtdWxfaHdfZXhjZXB0aW9uKAorICAg ICAgICAgICAgICAgIChzZWcgPT0geDg2X3NlZ19zcykgPyBUUkFQX3N0YWNrX2Vycm9yIDogVFJB UF9ncF9mYXVsdCwKKyAgICAgICAgICAgICAgICAwLCAmc2hfY3R4dC0+Y3R4dCk7CisgICAgICAg IHJldHVybiBYODZFTVVMX0VYQ0VQVElPTjsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKwor c3RhdGljIGludAoraHZtX3JlYWQoZW51bSB4ODZfc2VnbWVudCBzZWcsCisgICAgICAgICB1bnNp Z25lZCBsb25nIG9mZnNldCwKKyAgICAgICAgIHZvaWQgKnBfZGF0YSwKKyAgICAgICAgIHVuc2ln bmVkIGludCBieXRlcywKKyAgICAgICAgIGVudW0gaHZtX2FjY2Vzc190eXBlIGFjY2Vzc190eXBl LAorICAgICAgICAgc3RydWN0IHNoX2VtdWxhdGVfY3R4dCAqc2hfY3R4dCkKK3sKKyAgICBwYWdl ZmF1bHRfaW5mb190IHBmaW5mbzsKKyAgICB1bnNpZ25lZCBsb25nIGFkZHI7CisgICAgaW50IHJj OworCisgICAgcmMgPSBodm1fdHJhbnNsYXRlX3ZpcnR1YWxfYWRkcigKKyAgICAgICAgc2VnLCBv ZmZzZXQsIGJ5dGVzLCBhY2Nlc3NfdHlwZSwgc2hfY3R4dCwgJmFkZHIpOworICAgIGlmICggcmMg fHwgIWJ5dGVzICkKKyAgICAgICAgcmV0dXJuIHJjOworCisgICAgaWYgKCBhY2Nlc3NfdHlwZSA9 PSBodm1fYWNjZXNzX2luc25fZmV0Y2ggKQorICAgICAgICByYyA9IGh2bV9mZXRjaF9mcm9tX2d1 ZXN0X2xpbmVhcihwX2RhdGEsIGFkZHIsIGJ5dGVzLCAwLCAmcGZpbmZvKTsKKyAgICBlbHNlCisg ICAgICAgIHJjID0gaHZtX2NvcHlfZnJvbV9ndWVzdF9saW5lYXIocF9kYXRhLCBhZGRyLCBieXRl cywgMCwgJnBmaW5mbyk7CisKKyAgICBzd2l0Y2ggKCByYyApCisgICAgeworICAgIGNhc2UgSFZN VFJBTlNfb2theToKKyAgICAgICAgcmV0dXJuIFg4NkVNVUxfT0tBWTsKKyAgICBjYXNlIEhWTVRS QU5TX2JhZF9saW5lYXJfdG9fZ2ZuOgorICAgICAgICB4ODZfZW11bF9wYWdlZmF1bHQocGZpbmZv LmVjLCBwZmluZm8ubGluZWFyLCAmc2hfY3R4dC0+Y3R4dCk7CisgICAgICAgIHJldHVybiBYODZF TVVMX0VYQ0VQVElPTjsKKyAgICBjYXNlIEhWTVRSQU5TX2JhZF9nZm5fdG9fbWZuOgorICAgIGNh c2UgSFZNVFJBTlNfdW5oYW5kbGVhYmxlOgorICAgICAgICByZXR1cm4gWDg2RU1VTF9VTkhBTkRM RUFCTEU7CisgICAgY2FzZSBIVk1UUkFOU19nZm5fcGFnZWRfb3V0OgorICAgIGNhc2UgSFZNVFJB TlNfZ2ZuX3NoYXJlZDoKKyAgICAgICAgcmV0dXJuIFg4NkVNVUxfUkVUUlk7CisgICAgfQorCisg ICAgQlVHKCk7CisgICAgcmV0dXJuIFg4NkVNVUxfVU5IQU5ETEVBQkxFOworfQorCitzdGF0aWMg aW50Citodm1fZW11bGF0ZV9yZWFkKGVudW0geDg2X3NlZ21lbnQgc2VnLAorICAgICAgICAgICAg ICAgICB1bnNpZ25lZCBsb25nIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgdm9pZCAqcF9kYXRh LAorICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgYnl0ZXMsCisgICAgICAgICAgICAgICAg IHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0KQoreworICAgIGlmICggIWlzX3g4Nl91c2Vy X3NlZ21lbnQoc2VnKSApCisgICAgICAgIHJldHVybiBYODZFTVVMX1VOSEFORExFQUJMRTsKKyAg ICByZXR1cm4gaHZtX3JlYWQoc2VnLCBvZmZzZXQsIHBfZGF0YSwgYnl0ZXMsIGh2bV9hY2Nlc3Nf cmVhZCwKKyAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyX29mKGN0eHQsIHN0cnVjdCBzaF9l bXVsYXRlX2N0eHQsIGN0eHQpKTsKK30KKworc3RhdGljIGludAoraHZtX2VtdWxhdGVfaW5zbl9m ZXRjaChlbnVtIHg4Nl9zZWdtZW50IHNlZywKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWdu ZWQgbG9uZyBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBfZGF0YSwKKyAg ICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGJ5dGVzLAorICAgICAgICAgICAgICAg ICAgICAgICBzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCkKK3sKKyAgICBzdHJ1Y3Qgc2hf ZW11bGF0ZV9jdHh0ICpzaF9jdHh0ID0KKyAgICAgICAgY29udGFpbmVyX29mKGN0eHQsIHN0cnVj dCBzaF9lbXVsYXRlX2N0eHQsIGN0eHQpOworICAgIHVuc2lnbmVkIGludCBpbnNuX29mZiA9IG9m ZnNldCAtIHNoX2N0eHQtPmluc25fYnVmX2VpcDsKKworICAgIEFTU0VSVChzZWcgPT0geDg2X3Nl Z19jcyk7CisKKyAgICAvKiBGYWxsIGJhY2sgaWYgcmVxdWVzdGVkIGJ5dGVzIGFyZSBub3QgaW4g dGhlIHByZWZldGNoIGNhY2hlLiAqLworICAgIGlmICggdW5saWtlbHkoKGluc25fb2ZmICsgYnl0 ZXMpID4gc2hfY3R4dC0+aW5zbl9idWZfYnl0ZXMpICkKKyAgICAgICAgcmV0dXJuIGh2bV9yZWFk KHNlZywgb2Zmc2V0LCBwX2RhdGEsIGJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgaHZt X2FjY2Vzc19pbnNuX2ZldGNoLCBzaF9jdHh0KTsKKworICAgIC8qIEhpdCB0aGUgY2FjaGUuIFNp bXBsZSBtZW1jcHkuICovCisgICAgbWVtY3B5KHBfZGF0YSwgJnNoX2N0eHQtPmluc25fYnVmW2lu c25fb2ZmXSwgYnl0ZXMpOworICAgIHJldHVybiBYODZFTVVMX09LQVk7Cit9CisKK3N0YXRpYyBp bnQKK2h2bV9lbXVsYXRlX3dyaXRlKGVudW0geDg2X3NlZ21lbnQgc2VnLAorICAgICAgICAgICAg ICAgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQsCisgICAgICAgICAgICAgICAgICB2b2lkICpwX2Rh dGEsCisgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgYnl0ZXMsCisgICAgICAgICAgICAg ICAgICBzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCkKK3sKKyAgICBzdHJ1Y3Qgc2hfZW11 bGF0ZV9jdHh0ICpzaF9jdHh0ID0KKyAgICAgICAgY29udGFpbmVyX29mKGN0eHQsIHN0cnVjdCBz aF9lbXVsYXRlX2N0eHQsIGN0eHQpOworICAgIHN0cnVjdCB2Y3B1ICp2ID0gY3VycmVudDsKKyAg ICB1bnNpZ25lZCBsb25nIGFkZHI7CisgICAgdm9pZCAqcHRyOworICAgIGludCByYzsKKworICAg IC8qIEhvdyBtYW55IGVtdWxhdGlvbnMgY291bGQgd2Ugc2F2ZSBpZiB3ZSB1bnNoYWRvd2VkIG9u IHN0YWNrIHdyaXRlcz8gKi8KKyAgICBpZiAoIHNlZyA9PSB4ODZfc2VnX3NzICkKKyAgICAgICAg cGVyZmNfaW5jcihzaGFkb3dfZmF1bHRfZW11bGF0ZV9zdGFjayk7CisKKyAgICByYyA9IGh2bV90 cmFuc2xhdGVfdmlydHVhbF9hZGRyKAorICAgICAgICBzZWcsIG9mZnNldCwgYnl0ZXMsIGh2bV9h Y2Nlc3Nfd3JpdGUsIHNoX2N0eHQsICZhZGRyKTsKKyAgICBpZiAoIHJjIHx8ICFieXRlcyApCisg ICAgICAgIHJldHVybiByYzsKKworICAgIC8qIFVuYWxpZ25lZCB3cml0ZXMgYXJlIG9ubHkgYWNj ZXB0YWJsZSBvbiBIVk0gKi8KKyAgICBpZiAoIChhZGRyICYgKGJ5dGVzIC0gMSkpICYmICFpc19o dm1fdmNwdSh2KSAgKQorICAgICAgICByZXR1cm4gWDg2RU1VTF9VTkhBTkRMRUFCTEU7CisKKyAg ICBwdHIgPSBzaF9lbXVsYXRlX21hcF9kZXN0KHYsIGFkZHIsIGJ5dGVzLCBzaF9jdHh0KTsKKyAg ICBpZiAoIElTX0VSUihwdHIpICkKKyAgICAgICAgcmV0dXJuIH5QVFJfRVJSKHB0cik7CisKKyAg ICBwYWdpbmdfbG9jayh2LT5kb21haW4pOworICAgIG1lbWNweShwdHIsIHBfZGF0YSwgYnl0ZXMp OworCisgICAgaWYgKCB0Yl9pbml0X2RvbmUgKQorICAgICAgICB2LT5hcmNoLnBhZ2luZy5tb2Rl LT5zaGFkb3cudHJhY2VfZW11bF93cml0ZV92YWwocHRyLCBhZGRyLAorICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9kYXRhLCBieXRlcyk7 CisKKyAgICBzaF9lbXVsYXRlX3VubWFwX2Rlc3QodiwgcHRyLCBieXRlcywgc2hfY3R4dCk7Cisg ICAgc2hhZG93X2F1ZGl0X3RhYmxlcyh2KTsKKyAgICBwYWdpbmdfdW5sb2NrKHYtPmRvbWFpbik7 CisKKyAgICByZXR1cm4gWDg2RU1VTF9PS0FZOworfQorCitzdGF0aWMgaW50Citodm1fZW11bGF0 ZV9jbXB4Y2hnKGVudW0geDg2X3NlZ21lbnQgc2VnLAorICAgICAgICAgICAgICAgICAgICB1bnNp Z25lZCBsb25nIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAqcF9vbGQsCisgICAg ICAgICAgICAgICAgICAgIHZvaWQgKnBfbmV3LAorICAgICAgICAgICAgICAgICAgICB1bnNpZ25l ZCBpbnQgYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgIGJvb2wgbG9jaywKKyAgICAgICAgICAg ICAgICAgICAgc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQpCit7CisgICAgc3RydWN0IHNo X2VtdWxhdGVfY3R4dCAqc2hfY3R4dCA9CisgICAgICAgIGNvbnRhaW5lcl9vZihjdHh0LCBzdHJ1 Y3Qgc2hfZW11bGF0ZV9jdHh0LCBjdHh0KTsKKyAgICBzdHJ1Y3QgdmNwdSAqdiA9IGN1cnJlbnQ7 CisgICAgdW5zaWduZWQgbG9uZyBhZGRyLCBvbGQsIG5ldywgcHJldjsKKyAgICB2b2lkICpwdHI7 CisgICAgaW50IHJjOworCisgICAgaWYgKCBieXRlcyA+IHNpemVvZihsb25nKSApCisgICAgICAg IHJldHVybiBYODZFTVVMX1VOSEFORExFQUJMRTsKKworICAgIHJjID0gaHZtX3RyYW5zbGF0ZV92 aXJ0dWFsX2FkZHIoCisgICAgICAgIHNlZywgb2Zmc2V0LCBieXRlcywgaHZtX2FjY2Vzc193cml0 ZSwgc2hfY3R4dCwgJmFkZHIpOworICAgIGlmICggcmMgKQorICAgICAgICByZXR1cm4gcmM7CisK KyAgICAvKiBVbmFsaWduZWQgd3JpdGVzIGFyZSBvbmx5IGFjY2VwdGFibGUgb24gSFZNICovCisg ICAgaWYgKCAoYWRkciAmIChieXRlcyAtIDEpKSAmJiAhaXNfaHZtX3ZjcHUodikgICkKKyAgICAg ICAgcmV0dXJuIFg4NkVNVUxfVU5IQU5ETEVBQkxFOworCisgICAgcHRyID0gc2hfZW11bGF0ZV9t YXBfZGVzdCh2LCBhZGRyLCBieXRlcywgc2hfY3R4dCk7CisgICAgaWYgKCBJU19FUlIocHRyKSAp CisgICAgICAgIHJldHVybiB+UFRSX0VSUihwdHIpOworCisgICAgb2xkID0gbmV3ID0gMDsKKyAg ICBtZW1jcHkoJm9sZCwgcF9vbGQsIGJ5dGVzKTsKKyAgICBtZW1jcHkoJm5ldywgcF9uZXcsIGJ5 dGVzKTsKKworICAgIHBhZ2luZ19sb2NrKHYtPmRvbWFpbik7CisgICAgc3dpdGNoICggYnl0ZXMg KQorICAgIHsKKyAgICBjYXNlIDE6IHByZXYgPSBjbXB4Y2hnKCh1aW50OF90ICAqKXB0ciwgb2xk LCBuZXcpOyBicmVhazsKKyAgICBjYXNlIDI6IHByZXYgPSBjbXB4Y2hnKCh1aW50MTZfdCAqKXB0 ciwgb2xkLCBuZXcpOyBicmVhazsKKyAgICBjYXNlIDQ6IHByZXYgPSBjbXB4Y2hnKCh1aW50MzJf dCAqKXB0ciwgb2xkLCBuZXcpOyBicmVhazsKKyAgICBjYXNlIDg6IHByZXYgPSBjbXB4Y2hnKCh1 aW50NjRfdCAqKXB0ciwgb2xkLCBuZXcpOyBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBT SEFET1dfUFJJTlRLKCJjbXB4Y2hnIHNpemUgJXUgaXMgbm90IHN1cHBvcnRlZFxuIiwgYnl0ZXMp OworICAgICAgICBwcmV2ID0gfm9sZDsKKyAgICB9CisKKyAgICBpZiAoIHByZXYgIT0gb2xkICkK KyAgICB7CisgICAgICAgIG1lbWNweShwX29sZCwgJnByZXYsIGJ5dGVzKTsKKyAgICAgICAgcmMg PSBYODZFTVVMX0NNUFhDSEdfRkFJTEVEOworICAgIH0KKworICAgIFNIQURPV19ERUJVRyhFTVVM QVRFLAorICAgICAgICAgICAgICAgICAidmEgJSNseCB3YXMgJSNseCBleHBlY3RlZCAlI2x4IHdh bnRlZCAlI2x4IG5vdyAlI2x4IGJ5dGVzICV1XG4iLAorICAgICAgICAgICAgICAgICBhZGRyLCBw cmV2LCBvbGQsIG5ldywgKih1bnNpZ25lZCBsb25nICopcHRyLCBieXRlcyk7CisKKyAgICBzaF9l bXVsYXRlX3VubWFwX2Rlc3QodiwgcHRyLCBieXRlcywgc2hfY3R4dCk7CisgICAgc2hhZG93X2F1 ZGl0X3RhYmxlcyh2KTsKKyAgICBwYWdpbmdfdW5sb2NrKHYtPmRvbWFpbik7CisKKyAgICByZXR1 cm4gcmM7Cit9CisKK2NvbnN0IHN0cnVjdCB4ODZfZW11bGF0ZV9vcHMgaHZtX3NoYWRvd19lbXVs YXRvcl9vcHMgPSB7CisgICAgLnJlYWQgICAgICAgPSBodm1fZW11bGF0ZV9yZWFkLAorICAgIC5p bnNuX2ZldGNoID0gaHZtX2VtdWxhdGVfaW5zbl9mZXRjaCwKKyAgICAud3JpdGUgICAgICA9IGh2 bV9lbXVsYXRlX3dyaXRlLAorICAgIC5jbXB4Y2hnICAgID0gaHZtX2VtdWxhdGVfY21weGNoZywK KyAgICAuY3B1aWQgICAgICA9IGh2bWVtdWxfY3B1aWQsCit9OworCisvKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KiovCisvKiBIYW5kbGluZyBndWVzdCB3cml0ZXMgdG8gcGFnZXRhYmxlcy4gKi8KKworLyoKKyAq IFRyYW5zbGF0ZSBhIFZBIHRvIGFuIE1GTiwgaW5qZWN0aW5nIGEgcGFnZS1mYXVsdCBpZiB3ZSBm YWlsLiAgSWYgdGhlCisgKiBtYXBwaW5nIHN1Y2NlZWRzLCBhIHJlZmVyZW5jZSB3aWxsIGJlIGhl bGQgb24gdGhlIHVuZGVybHlpbmcgcGFnZS4KKyAqLworI2RlZmluZSBCQURfR1ZBX1RPX0dGTiAo fjBVTCkKKyNkZWZpbmUgQkFEX0dGTl9UT19NRk4gKH4xVUwpCisjZGVmaW5lIFJFQURPTkxZX0dG TiAgICh+MlVMKQorc3RhdGljIG1mbl90IGVtdWxhdGVfZ3ZhX3RvX21mbihzdHJ1Y3QgdmNwdSAq diwgdW5zaWduZWQgbG9uZyB2YWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg c3RydWN0IHNoX2VtdWxhdGVfY3R4dCAqc2hfY3R4dCkKK3sKKyAgICB1bnNpZ25lZCBsb25nIGdm bjsKKyAgICBzdHJ1Y3QgcGFnZV9pbmZvICpwYWdlOworICAgIG1mbl90IG1mbjsKKyAgICBwMm1f dHlwZV90IHAybXQ7CisgICAgdWludDMyX3QgcGZlYyA9IFBGRUNfcGFnZV9wcmVzZW50IHwgUEZF Q193cml0ZV9hY2Nlc3M7CisKKyAgICAvKiBUcmFuc2xhdGUgdGhlIFZBIHRvIGEgR0ZOLiAqLwor ICAgIGdmbiA9IHBhZ2luZ19nZXRfaG9zdG1vZGUodiktPmd2YV90b19nZm4odiwgTlVMTCwgdmFk ZHIsICZwZmVjKTsKKyAgICBpZiAoIGdmbiA9PSBnZm5feChJTlZBTElEX0dGTikgKQorICAgIHsK KyAgICAgICAgeDg2X2VtdWxfcGFnZWZhdWx0KHBmZWMsIHZhZGRyLCAmc2hfY3R4dC0+Y3R4dCk7 CisKKyAgICAgICAgcmV0dXJuIF9tZm4oQkFEX0dWQV9UT19HRk4pOworICAgIH0KKworICAgIC8q IFRyYW5zbGF0ZSB0aGUgR0ZOIHRvIGFuIE1GTi4gKi8KKyAgICBBU1NFUlQoIXBhZ2luZ19sb2Nr ZWRfYnlfbWUodi0+ZG9tYWluKSk7CisKKyAgICBwYWdlID0gZ2V0X3BhZ2VfZnJvbV9nZm4odi0+ ZG9tYWluLCBnZm4sICZwMm10LCBQMk1fQUxMT0MpOworCisgICAgLyogU2FuaXR5IGNoZWNraW5n LiAqLworICAgIGlmICggcGFnZSA9PSBOVUxMICkKKyAgICB7CisgICAgICAgIHJldHVybiBfbWZu KEJBRF9HRk5fVE9fTUZOKTsKKyAgICB9CisgICAgaWYgKCBwMm1faXNfZGlzY2FyZF93cml0ZShw Mm10KSApCisgICAgeworICAgICAgICBwdXRfcGFnZShwYWdlKTsKKyAgICAgICAgcmV0dXJuIF9t Zm4oUkVBRE9OTFlfR0ZOKTsKKyAgICB9CisgICAgaWYgKCAhcDJtX2lzX3JhbShwMm10KSApCisg ICAgeworICAgICAgICBwdXRfcGFnZShwYWdlKTsKKyAgICAgICAgcmV0dXJuIF9tZm4oQkFEX0dG Tl9UT19NRk4pOworICAgIH0KKyAgICBtZm4gPSBwYWdlX3RvX21mbihwYWdlKTsKKyAgICBBU1NF UlQobWZuX3ZhbGlkKG1mbikpOworCisgICAgdi0+YXJjaC5wYWdpbmcubGFzdF93cml0ZV93YXNf cHQgPSAhIXNoX21mbl9pc19hX3BhZ2VfdGFibGUobWZuKTsKKworICAgIHJldHVybiBtZm47Cit9 CisKKy8qCisgKiBDaGVjayB0aGF0IHRoZSB1c2VyIGlzIGFsbG93ZWQgdG8gcGVyZm9ybSB0aGlz IHdyaXRlLiAgSWYgYSBtYXBwaW5nIGlzCisgKiByZXR1cm5lZCwgcGFnZSByZWZlcmVuY2VzIHdp bGwgYmUgaGVsZCBvbiBzaF9jdHh0LT5tZm5bMF0gYW5kCisgKiBzaF9jdHh0LT5tZm5bMV0gaWZm ICFJTlZBTElEX01GTi4KKyAqLworc3RhdGljIHZvaWQgKnNoX2VtdWxhdGVfbWFwX2Rlc3Qoc3Ry dWN0IHZjcHUgKnYsIHVuc2lnbmVkIGxvbmcgdmFkZHIsCisgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICB1bnNpZ25lZCBpbnQgYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBzdHJ1Y3Qgc2hfZW11bGF0ZV9jdHh0ICpzaF9jdHh0KQoreworICAgIHN0cnVjdCBk b21haW4gKmQgPSB2LT5kb21haW47CisgICAgdm9pZCAqbWFwOworCisjaWZuZGVmIE5ERUJVRwor ICAgIC8qIFdlIGRvbid0IGVtdWxhdGUgdXNlci1tb2RlIHdyaXRlcyB0byBwYWdlIHRhYmxlcy4g Ki8KKyAgICBpZiAoIGlzX2h2bV9kb21haW4oZCkgPyBodm1fZ2V0X2NwbCh2KSA9PSAzCisgICAg ICAgICAgICAgICAgICAgICAgICAgIDogIWd1ZXN0X2tlcm5lbF9tb2RlKHYsIGd1ZXN0X2NwdV91 c2VyX3JlZ3MoKSkgKQorICAgIHsKKyAgICAgICAgZ2RwcmludGsoWEVOTE9HX0RFQlVHLCAiVXNl ci1tb2RlIHdyaXRlIHRvIHBhZ2V0YWJsZSByZWFjaGVkICIKKyAgICAgICAgICAgICAgICAgImVt dWxhdGVfbWFwX2Rlc3QoKS4gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIVxuIik7CisgICAgICAg IHJldHVybiBNQVBQSU5HX1VOSEFORExFQUJMRTsKKyAgICB9CisjZW5kaWYKKworICAgIHNoX2N0 eHQtPm1mblswXSA9IGVtdWxhdGVfZ3ZhX3RvX21mbih2LCB2YWRkciwgc2hfY3R4dCk7CisgICAg aWYgKCAhbWZuX3ZhbGlkKHNoX2N0eHQtPm1mblswXSkgKQorICAgIHsKKyAgICAgICAgc3dpdGNo ICggbWZuX3goc2hfY3R4dC0+bWZuWzBdKSApCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBCQURf R1ZBX1RPX0dGTjogcmV0dXJuIE1BUFBJTkdfRVhDRVBUSU9OOworICAgICAgICBjYXNlIFJFQURP TkxZX0dGTjogICByZXR1cm4gTUFQUElOR19TSUxFTlRfRkFJTDsKKyAgICAgICAgZGVmYXVsdDog ICAgICAgICAgICAgcmV0dXJuIE1BUFBJTkdfVU5IQU5ETEVBQkxFOworICAgICAgICB9CisgICAg fQorCisgICAgLyogVW5hbGlnbmVkIHdyaXRlcyBtZWFuIHByb2JhYmx5IHRoaXMgaXNuJ3QgYSBw YWdldGFibGUuICovCisgICAgaWYgKCB2YWRkciAmIChieXRlcyAtIDEpICkKKyAgICAgICAgc2hf cmVtb3ZlX3NoYWRvd3MoZCwgc2hfY3R4dC0+bWZuWzBdLCAwLCAwIC8qIFNsb3csIGNhbiBmYWls LiAqLyApOworCisgICAgaWYgKCBsaWtlbHkoKCh2YWRkciArIGJ5dGVzIC0gMSkgJiBQQUdFX01B U0spID09ICh2YWRkciAmIFBBR0VfTUFTSykpICkKKyAgICB7CisgICAgICAgIC8qIFdob2xlIHdy aXRlIGZpdHMgb24gYSBzaW5nbGUgcGFnZS4gKi8KKyAgICAgICAgc2hfY3R4dC0+bWZuWzFdID0g SU5WQUxJRF9NRk47CisgICAgICAgIG1hcCA9IG1hcF9kb21haW5fcGFnZShzaF9jdHh0LT5tZm5b MF0pICsgKHZhZGRyICYgflBBR0VfTUFTSyk7CisgICAgfQorICAgIGVsc2UgaWYgKCAhaXNfaHZt X2RvbWFpbihkKSApCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBDcm9zcy1wYWdlIGVt dWxhdGVkIHdyaXRlcyBhcmUgb25seSBzdXBwb3J0ZWQgZm9yIEhWTSBndWVzdHM7CisgICAgICAg ICAqIFBWIGd1ZXN0cyBvdWdodCB0byBrbm93IGJldHRlci4KKyAgICAgICAgICovCisgICAgICAg IHB1dF9wYWdlKG1mbl90b19wYWdlKHNoX2N0eHQtPm1mblswXSkpOworICAgICAgICByZXR1cm4g TUFQUElOR19VTkhBTkRMRUFCTEU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8q IFRoaXMgd3JpdGUgY3Jvc3NlcyBhIHBhZ2UgYm91bmRhcnkuIFRyYW5zbGF0ZSB0aGUgc2Vjb25k IHBhZ2UuICovCisgICAgICAgIHNoX2N0eHQtPm1mblsxXSA9IGVtdWxhdGVfZ3ZhX3RvX21mbigK KyAgICAgICAgICAgIHYsICh2YWRkciArIGJ5dGVzIC0gMSkgJiBQQUdFX01BU0ssIHNoX2N0eHQp OworICAgICAgICBpZiAoICFtZm5fdmFsaWQoc2hfY3R4dC0+bWZuWzFdKSApCisgICAgICAgIHsK KyAgICAgICAgICAgIHB1dF9wYWdlKG1mbl90b19wYWdlKHNoX2N0eHQtPm1mblswXSkpOworICAg ICAgICAgICAgc3dpdGNoICggbWZuX3goc2hfY3R4dC0+bWZuWzFdKSApCisgICAgICAgICAgICB7 CisgICAgICAgICAgICBjYXNlIEJBRF9HVkFfVE9fR0ZOOiByZXR1cm4gTUFQUElOR19FWENFUFRJ T047CisgICAgICAgICAgICBjYXNlIFJFQURPTkxZX0dGTjogICByZXR1cm4gTUFQUElOR19TSUxF TlRfRkFJTDsKKyAgICAgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgIHJldHVybiBNQVBQSU5H X1VOSEFORExFQUJMRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIENy b3NzLXBhZ2Ugd3JpdGVzIG1lYW4gcHJvYmFibHkgbm90IGEgcGFnZXRhYmxlLiAqLworICAgICAg ICBzaF9yZW1vdmVfc2hhZG93cyhkLCBzaF9jdHh0LT5tZm5bMV0sIDAsIDAgLyogU2xvdywgY2Fu IGZhaWwuICovICk7CisKKyAgICAgICAgbWFwID0gdm1hcChzaF9jdHh0LT5tZm4sIDIpOworICAg ICAgICBpZiAoICFtYXAgKQorICAgICAgICB7CisgICAgICAgICAgICBwdXRfcGFnZShtZm5fdG9f cGFnZShzaF9jdHh0LT5tZm5bMF0pKTsKKyAgICAgICAgICAgIHB1dF9wYWdlKG1mbl90b19wYWdl KHNoX2N0eHQtPm1mblsxXSkpOworICAgICAgICAgICAgcmV0dXJuIE1BUFBJTkdfVU5IQU5ETEVB QkxFOworICAgICAgICB9CisgICAgICAgIG1hcCArPSAodmFkZHIgJiB+UEFHRV9NQVNLKTsKKyAg ICB9CisKKyNpZiAoU0hBRE9XX09QVElNSVpBVElPTlMgJiBTSE9QVF9TS0lQX1ZFUklGWSkKKyAg ICAvKgorICAgICAqIFJlbWVtYmVyIGlmIHRoZSBib3R0b20gYml0IHdhcyBjbGVhciwgc28gd2Ug Y2FuIGNob29zZSBub3QgdG8gcnVuCisgICAgICogdGhlIGNoYW5nZSB0aHJvdWdoIHRoZSB2ZXJp ZnkgY29kZSBpZiBpdCdzIHN0aWxsIGNsZWFyIGFmdGVyd2FyZHMuCisgICAgICovCisgICAgc2hf Y3R4dC0+bG93X2JpdF93YXNfY2xlYXIgPSBtYXAgIT0gTlVMTCAmJiAhKCoodTggKiltYXAgJiBf UEFHRV9QUkVTRU5UKTsKKyNlbmRpZgorCisgICAgcmV0dXJuIG1hcDsKK30KKworLyoKKyAqIE9w dGltaXphdGlvbjogSWYgd2Ugc2VlIHR3byBlbXVsYXRlZCB3cml0ZXMgb2YgemVyb3MgdG8gdGhl IHNhbWUKKyAqIHBhZ2UtdGFibGUgd2l0aG91dCBhbm90aGVyIGtpbmQgb2YgcGFnZSBmYXVsdCBp biBiZXR3ZWVuLCB3ZSBndWVzcworICogdGhhdCB0aGlzIGlzIGEgYmF0Y2ggb2YgY2hhbmdlcyAo Zm9yIHByb2Nlc3MgZGVzdHJ1Y3Rpb24pIGFuZAorICogdW5zaGFkb3cgdGhlIHBhZ2Ugc28gd2Ug ZG9uJ3QgdGFrZSBhIHBhZ2VmYXVsdCBvbiBldmVyeSBlbnRyeS4gIFRoaXMKKyAqIHNob3VsZCBh bHNvIG1ha2UgZmluZGluZyB3cml0ZWFibGUgbWFwcGluZ3Mgb2YgcGFnZXRhYmxlcyBtdWNoCisg KiBlYXNpZXIuCisgKgorICogTG9vayB0byBzZWUgaWYgdGhpcyBpcyB0aGUgc2Vjb25kIGVtdWxh dGVkIHdyaXRlIGluIGEgcm93IHRvIHRoaXMKKyAqIHBhZ2UsIGFuZCB1bnNoYWRvdyBpZiBpdCBp cy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGNoZWNrX2Zvcl9lYXJseV91bnNoYWRvdyhzdHJ1 Y3QgdmNwdSAqdiwgbWZuX3QgZ21mbikKK3sKKyNpZiBTSEFET1dfT1BUSU1JWkFUSU9OUyAmIFNI T1BUX0VBUkxZX1VOU0hBRE9XCisgICAgc3RydWN0IGRvbWFpbiAqZCA9IHYtPmRvbWFpbjsKKwor ICAgIC8qCisgICAgICogSWYgdGhlIGRvbWFpbiBoYXMgbmV2ZXIgbWFkZSBhICJkeWluZyIgb3As IHVzZSB0aGUgdHdvLXdyaXRlcworICAgICAqIGhldXJpc3RpYzsgb3RoZXJ3aXNlLCB1bnNoYWRv dyBhcyBzb29uIGFzIHdlIHdyaXRlIGEgemVybyBmb3IgYSBkeWluZworICAgICAqIHByb2Nlc3Mu CisgICAgICoKKyAgICAgKiBEb24ndCBib3RoZXIgdHJ5aW5nIHRvIHVuc2hhZG93IGlmIGl0J3Mg bm90IGEgUFQsIG9yIGlmIGl0J3MgPiBsMS4KKyAgICAgKi8KKyAgICBpZiAoICggdi0+YXJjaC5w YWdpbmcuc2hhZG93LnBhZ2V0YWJsZV9keWluZworICAgICAgICAgICB8fCAoICFkLT5hcmNoLnBh Z2luZy5zaGFkb3cucGFnZXRhYmxlX2R5aW5nX29wCisgICAgICAgICAgICAgICAgJiYgdi0+YXJj aC5wYWdpbmcuc2hhZG93Lmxhc3RfZW11bGF0ZWRfbWZuX2Zvcl91bnNoYWRvdyA9PSBtZm5feChn bWZuKSApICkKKyAgICAgICAgICYmIHNoX21mbl9pc19hX3BhZ2VfdGFibGUoZ21mbikKKyAgICAg ICAgICYmICghZC0+YXJjaC5wYWdpbmcuc2hhZG93LnBhZ2V0YWJsZV9keWluZ19vcCB8fAorICAg ICAgICAgICAgICEobWZuX3RvX3BhZ2UoZ21mbiktPnNoYWRvd19mbGFncworICAgICAgICAgICAg ICAgJiAoU0hGX0wyXzMyfFNIRl9MMl9QQUV8U0hGX0wySF9QQUV8U0hGX0w0XzY0KSkpICkKKyAg ICB7CisgICAgICAgIHBlcmZjX2luY3Ioc2hhZG93X2Vhcmx5X3Vuc2hhZG93KTsKKyAgICAgICAg c2hfcmVtb3ZlX3NoYWRvd3MoZCwgZ21mbiwgMSwgMCAvKiBGYXN0LCBjYW4gZmFpbCB0byB1bnNo YWRvdyAqLyApOworICAgICAgICBUUkFDRV9TSEFET1dfUEFUSF9GTEFHKFRSQ0VfU0ZMQUdfRUFS TFlfVU5TSEFET1cpOworICAgIH0KKyAgICB2LT5hcmNoLnBhZ2luZy5zaGFkb3cubGFzdF9lbXVs YXRlZF9tZm5fZm9yX3Vuc2hhZG93ID0gbWZuX3goZ21mbik7CisjZW5kaWYKK30KKworLyoKKyAq IFRpZHkgdXAgYWZ0ZXIgdGhlIGVtdWxhdGVkIHdyaXRlOiBtYXJrIHBhZ2VzIGRpcnR5LCB2ZXJp ZnkgdGhlIG5ldworICogY29udGVudHMsIGFuZCB1bmRvIHRoZSBtYXBwaW5nLgorICovCitzdGF0 aWMgdm9pZCBzaF9lbXVsYXRlX3VubWFwX2Rlc3Qoc3RydWN0IHZjcHUgKnYsIHZvaWQgKmFkZHIs CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGJ5dGVzLAor ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzaF9lbXVsYXRlX2N0eHQg KnNoX2N0eHQpCit7CisgICAgdTMyIGIxID0gYnl0ZXMsIGIyID0gMCwgc2hmbGFnczsKKworICAg IEFTU0VSVChtZm5fdmFsaWQoc2hfY3R4dC0+bWZuWzBdKSk7CisKKyAgICAvKiBJZiB3ZSBhcmUg d3JpdGluZyBsb3RzIG9mIFBURS1hbGlnbmVkIHplcm9zLCBtaWdodCB3YW50IHRvIHVuc2hhZG93 ICovCisgICAgaWYgKCBsaWtlbHkoYnl0ZXMgPj0gNCkgJiYgKCoodTMyICopYWRkciA9PSAwKSAp CisgICAgeworICAgICAgICBpZiAoICEoKHVuc2lnbmVkIGxvbmcpYWRkciAmIChzaF9jdHh0LT5w dGVfc2l6ZSAtIDEpKSApCisgICAgICAgICAgICBjaGVja19mb3JfZWFybHlfdW5zaGFkb3codiwg c2hfY3R4dC0+bWZuWzBdKTsKKyAgICAgICAgLyoKKyAgICAgICAgICogRG9uJ3QgcmVzZXQgdGhl IGhldXJpc3RpYyBpZiB3ZSdyZSB3cml0aW5nIHplcm9zIGF0IG5vbi1hbGlnbmVkCisgICAgICAg ICAqIGFkZHJlc3Nlcywgb3RoZXJ3aXNlIGl0IGRvZXNuJ3QgY2F0Y2ggUkVQIE1PVlNEIG9uIFBB RSBndWVzdHMuCisgICAgICAgICAqLworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHNoX3Jlc2V0 X2Vhcmx5X3Vuc2hhZG93KHYpOworCisgICAgLyoKKyAgICAgKiBXZSBjYW4gYXZvaWQgcmUtdmVy aWZ5aW5nIHRoZSBwYWdlIGNvbnRlbnRzIGFmdGVyIHRoZSB3cml0ZSBpZjoKKyAgICAgKiAgLSBp dCB3YXMgbm8gbGFyZ2VyIHRoYW4gdGhlIFBURSB0eXBlIG9mIHRoaXMgcGFnZXRhYmxlOworICAg ICAqICAtIGl0IHdhcyBhbGlnbmVkIHRvIHRoZSBQVEUgYm91bmRhcmllczsgYW5kCisgICAgICog IC0gX1BBR0VfUFJFU0VOVCB3YXMgY2xlYXIgYmVmb3JlIGFuZCBhZnRlciB0aGUgd3JpdGUuCisg ICAgICovCisgICAgc2hmbGFncyA9IG1mbl90b19wYWdlKHNoX2N0eHQtPm1mblswXSktPnNoYWRv d19mbGFnczsKKyNpZiAoU0hBRE9XX09QVElNSVpBVElPTlMgJiBTSE9QVF9TS0lQX1ZFUklGWSkK KyAgICBpZiAoIHNoX2N0eHQtPmxvd19iaXRfd2FzX2NsZWFyCisgICAgICAgICAmJiAhKCoodTgg KilhZGRyICYgX1BBR0VfUFJFU0VOVCkKKyAgICAgICAgICYmICgoIShzaGZsYWdzICYgU0hGXzMy KQorICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgKiBOb3Qgc2hhZG93ZWQgMzItYml0 OiBhbGlnbmVkIDY0LWJpdCB3cml0ZXMgdGhhdCBsZWF2ZQorICAgICAgICAgICAgICAgKiB0aGUg cHJlc2VudCBiaXQgdW5zZXQgYXJlIHNhZmUgdG8gaWdub3JlLgorICAgICAgICAgICAgICAgKi8K KyAgICAgICAgICAgICAgJiYgKCh1bnNpZ25lZCBsb25nKWFkZHIgJiA3KSA9PSAwCisgICAgICAg ICAgICAgICYmIGJ5dGVzIDw9IDgpCisgICAgICAgICAgICAgfHwKKyAgICAgICAgICAgICAoIShz aGZsYWdzICYgKFNIRl9QQUV8U0hGXzY0KSkKKyAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAg ICAgICogTm90IHNoYWRvd2VkIFBBRS82NC1iaXQ6IGFsaWduZWQgMzItYml0IHdyaXRlcyB0aGF0 CisgICAgICAgICAgICAgICAqIGxlYXZlIHRoZSBwcmVzZW50IGJpdCB1bnNldCBhcmUgc2FmZSB0 byBpZ25vcmUuCisgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAmJiAoKHVuc2lnbmVk IGxvbmcpYWRkciAmIDMpID09IDAKKyAgICAgICAgICAgICAgJiYgYnl0ZXMgPD0gNCkpICkKKyAg ICB7CisgICAgICAgIC8qIFdyaXRlcyB3aXRoIHRoaXMgYWxpZ25tZW50IGNvbnN0cmFpbnQgY2Fu J3QgcG9zc2libHkgY3Jvc3MgcGFnZXMuICovCisgICAgICAgIEFTU0VSVCghbWZuX3ZhbGlkKHNo X2N0eHQtPm1mblsxXSkpOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYgLyogU0hBRE9XX09QVElN SVpBVElPTlMgJiBTSE9QVF9TS0lQX1ZFUklGWSAqLworICAgIHsKKyAgICAgICAgaWYgKCB1bmxp a2VseShtZm5fdmFsaWQoc2hfY3R4dC0+bWZuWzFdKSkgKQorICAgICAgICB7CisgICAgICAgICAg ICAvKiBWYWxpZGF0ZSBhcyB0d28gd3JpdGVzLCBvbmUgdG8gZWFjaCBwYWdlLiAqLworICAgICAg ICAgICAgYjEgPSBQQUdFX1NJWkUgLSAoKCh1bnNpZ25lZCBsb25nKWFkZHIpICYgflBBR0VfTUFT Syk7CisgICAgICAgICAgICBiMiA9IGJ5dGVzIC0gYjE7CisgICAgICAgICAgICBBU1NFUlQoYjIg PCBieXRlcyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBsaWtlbHkoYjEgPiAwKSApCisgICAg ICAgICAgICBzaF92YWxpZGF0ZV9ndWVzdF9wdF93cml0ZSh2LCBzaF9jdHh0LT5tZm5bMF0sIGFk ZHIsIGIxKTsKKyAgICAgICAgaWYgKCB1bmxpa2VseShiMiA+IDApICkKKyAgICAgICAgICAgIHNo X3ZhbGlkYXRlX2d1ZXN0X3B0X3dyaXRlKHYsIHNoX2N0eHQtPm1mblsxXSwgYWRkciArIGIxLCBi Mik7CisgICAgfQorCisgICAgcGFnaW5nX21hcmtfZGlydHkodi0+ZG9tYWluLCBzaF9jdHh0LT5t Zm5bMF0pOworICAgIHB1dF9wYWdlKG1mbl90b19wYWdlKHNoX2N0eHQtPm1mblswXSkpOworCisg ICAgaWYgKCB1bmxpa2VseShtZm5fdmFsaWQoc2hfY3R4dC0+bWZuWzFdKSkgKQorICAgIHsKKyAg ICAgICAgcGFnaW5nX21hcmtfZGlydHkodi0+ZG9tYWluLCBzaF9jdHh0LT5tZm5bMV0pOworICAg ICAgICBwdXRfcGFnZShtZm5fdG9fcGFnZShzaF9jdHh0LT5tZm5bMV0pKTsKKyAgICAgICAgdnVu bWFwKCh2b2lkICopKCh1bnNpZ25lZCBsb25nKWFkZHIgJiBQQUdFX01BU0spKTsKKyAgICB9Cisg ICAgZWxzZQorICAgICAgICB1bm1hcF9kb21haW5fcGFnZShhZGRyKTsKKworICAgIGF0b21pY19p bmMoJnYtPmRvbWFpbi0+YXJjaC5wYWdpbmcuc2hhZG93Lmd0YWJsZV9kaXJ0eV92ZXJzaW9uKTsK K30KKworLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqIG1vZGU6IEMKKyAqIGMtZmlsZS1zdHls ZTogIkJTRCIKKyAqIGMtYmFzaWMtb2Zmc2V0OiA0CisgKiBpbmRlbnQtdGFicy1tb2RlOiBuaWwK KyAqIEVuZDoKKyAqLwotLSAKZ2l0LXNlcmllcyAwLjkuMQoKX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX18KWGVuLWRldmVsIG1haWxpbmcgbGlzdApYZW4tZGV2 ZWxAbGlzdHMueGVucHJvamVjdC5vcmcKaHR0cHM6Ly9saXN0cy54ZW5wcm9qZWN0Lm9yZy9tYWls bWFuL2xpc3RpbmZvL3hlbi1kZXZlbA==