From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933215AbYEUHl0 (ORCPT ); Wed, 21 May 2008 03:41:26 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1755902AbYEUHlR (ORCPT ); Wed, 21 May 2008 03:41:17 -0400 Received: from qb-out-0506.google.com ([72.14.204.232]:11726 "EHLO qb-out-0506.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754124AbYEUHlQ (ORCPT ); Wed, 21 May 2008 03:41:16 -0400 DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=message-id:date:from:to:subject:in-reply-to:mime-version:content-type:references; b=FXFTTYaAtRiDwlWVvy7EPmcY3rhriYnG4LVUXKSfadVNvjkU4yApgbQBBXrJJWT2FoDwdDMAvuVSRWn7aUzgt12RPDR8U9rmvzNhA7z8oG/E5omnkS9hmW6n8yqsF0W/phwOVnPajRcnwpKyLz1R3PHOXcpoOC2omkYIhalTz5A= Message-ID: Date: Wed, 21 May 2008 11:41:11 +0400 From: "Cyrill Gorcunov" To: "Thomas Gleixner" , "Mikael Pettersson" , "Maciej W. Rozycki" , "Tom Spink" , "Ingo Molnar" , "H. Peter Anvin" , LKML , "Jiri Slaby" , "Andi Kleen" Subject: Re: [RFC] x86: merge nmi_32-64 to nmi.c In-Reply-To: <20080519184153.GE7773@cvg> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_Part_6512_7971505.1211355672109" References: <20080517192200.GA6914@cvg> <7b9198260805171328u555eec17t3597f3378edbda88@mail.gmail.com> <18479.21161.437325.251769@harpo.it.uu.se> <20080519180753.GB7773@cvg> <20080519184153.GE7773@cvg> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org ------=_Part_6512_7971505.1211355672109 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Content-Disposition: inline well, here is a second version of patch attached (i'm in office now so can't use my lovely mutt as usual). Please take a look. Any objections are quite welcome! - Cyrill - ------=_Part_6512_7971505.1211355672109 Content-Type: application/octet-stream; name=nmi-32-64-merge-v2.patch Content-Transfer-Encoding: base64 X-Attachment-Id: f_fghlqu2u0 Content-Disposition: attachment; filename=nmi-32-64-merge-v2.patch W1JGQ10geDg2OiBtZXJnZSBubWkgMzIvNjQgdjIKCkhlcmUgaXMgYSBzZWNvbmQgdmVyc2lvbiBv ZiBtZXJnaW5nIGF0dGVtcHQuIE1vc3Qgbm90YWJsZSBjaGFuZ2VzIGZyb20KcHJldmlvdXMgdmVy c2lvbjoKCi0gZGVmaW5pdGlvbiBvZiBwYW5pY19vbl91bnJlY292ZXJlZF9ubWkgbW92ZWQgdG8g dHJhcHNfNjQuYyAoYXMgdHJhcHNfMzIuYyBkbykKLSAzMmJpdCBkaWVfbm1pIGNoYW5nZWQgdG8g YmUgbW9yZSBmYW1pbGlhciB0byA2NGJpdCBzbyB3ZSBjYW4gdXNlIHNpbmdsZQogIGRlZmluaXRp b24gKGFuZCBwYXNzIGRvX3BhbmljIGlmIG5lZWRlZCkKLSBzZXR1cF9ubWlfd2F0Y2hkb2cgbm93 IGFjY2VwdCAibm1pX3dhdGNoZG9nPXBhbmljIiBib290IG9wdGlvbiBldmVuIGluIDMyYml0IG1v ZGUKLSB3ZSB1c2UgYXBpY193cml0ZV9hcm91bmQgZm9yIGJvdGggY3B1IG1vZGVzIHNpbmNlIGl0 IHdpbGwgYmUgZXhwYW5kZWQKICB0byBhcGljX3dyaXRlIGluIDY0Yml0IG1vZGUgYW55d2F5IGJ1 dCBzYXZlIHVzIGZyb20gYWRkaXRpb25hbCAjaWZkZWYKClN1YnJvdXRpbmVzIGdldF9ubWlfY291 bnQoKSwgbWNlX2luX3Byb2dyZXNzKCksIGdldF9pcnFfc3VtKCkgY2FuJ3QgZWxpbWluYXRlCiNp ZmRlZiB1c2luZyBzaW5jZSB0aGV5IGRvIEhJREUgZGlmZmVyZW50IHR5cGVzLiBUbyBlbGltaW5h dGUgc3VjaCBkaWZmZXJlbmNpZXMKY29tcGxldGVseSBtdWNoIG1vcmUgZGVlcCBjaGFuZ2VzIGhh cyB0byBiZSBicm91Z2h0IHdoaWNoIEkgdGhpbmsgd291bGQgbm90IGJlCmdvb2QgYXQgb25jZS4g U28gSSBkb24ndCBzZWUgYSBzaW1wbGUgd2F5IHRvIHVzZSBDT05GSUdfIHZhcnMgd2l0aCBmb2xs b3dpbmcgPyA6CmNvbnN0cnVjdGlvbnMgdG8gc3RyaXAgI2lmZGVmIG91dC4KCkFueSBfT0JKRUNU SU9OU18gYXJlIHdlbGNvbWUhCgpTaWduZWQtb2ZmLWJ5OiBDeXJpbGwgR29yY3Vub3YgPGdvcmN1 bm92QGdtYWlsLmNvbT4KLS0tCgpJbmRleDogYXJjaC94ODYva2VybmVsL25taS5jCj09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PQotLS0gL2Rldi9udWxsCVdlZCBNYXkgMjEgMTA6MTE6MjggMjAwOAorKysgYi9hcmNoL3g4 Ni9rZXJuZWwvbm1pLmMJV2VkIE1heSAyMSAxMDowNjoyOCAyMDA4CkBAIC0wLDAgKzEsNTUxIEBA CisvKgorICogIE5NSSB3YXRjaGRvZyBzdXBwb3J0IG9uIEFQSUMgc3lzdGVtcworICoKKyAqICBT dGFydGVkIGJ5IEluZ28gTW9sbmFyIDxtaW5nb0ByZWRoYXQuY29tPgorICoKKyAqICBGaXhlczoK KyAqICBNaWthZWwgUGV0dGVyc3Nvbgk6IEFNRCBLNyBzdXBwb3J0IGZvciBsb2NhbCBBUElDIE5N SSB3YXRjaGRvZy4KKyAqICBNaWthZWwgUGV0dGVyc3Nvbgk6IFBvd2VyIE1hbmFnZW1lbnQgZm9y IGxvY2FsIEFQSUMgTk1JIHdhdGNoZG9nLgorICogIE1pa2FlbCBQZXR0ZXJzc29uCTogUGVudGl1 bSA0IHN1cHBvcnQgZm9yIGxvY2FsIEFQSUMgTk1JIHdhdGNoZG9nLgorICogIFBhdmVsIE1hY2hl ayBhbmQKKyAqICBNaWthZWwgUGV0dGVyc3Nvbgk6IFBNIGNvbnZlcnRlZCB0byBkcml2ZXIgbW9k ZWwuIERpc2FibGUvZW5hYmxlIEFQSS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbm1pLmg+Cisj aW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUg PGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUg PGxpbnV4L3N5c2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgorI2luY2x1ZGUgPGxp bnV4L2twcm9iZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+CisjaW5jbHVkZSA8bGlu dXgva2RlYnVnLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsX3N0YXQuaD4KKworI2luY2x1ZGUg PGFzbS9zbXAuaD4KKyNpbmNsdWRlIDxhc20vbm1pLmg+CisjaW5jbHVkZSA8YXNtL3Byb3RvLmg+ CisjaW5jbHVkZSA8YXNtL21jZS5oPgorI2luY2x1ZGUgPGFzbS90aW1lci5oPgorCisjaW5jbHVk ZSA8bWFjaF90cmFwcy5oPgorCitpbnQgdW5rbm93bl9ubWlfcGFuaWM7CitpbnQgbm1pX3dhdGNo ZG9nX2VuYWJsZWQ7CisKK3N0YXRpYyBpbnQgcGFuaWNfb25fdGltZW91dDsKKworc3RhdGljIGNw dW1hc2tfdCBiYWNrdHJhY2VfbWFzayA9IENQVV9NQVNLX05PTkU7CisKKy8qCisgKiBubWlfYWN0 aXZlCisgKiA+MDogdGhlIGxhcGljIE5NSSB3YXRjaGRvZyBpcyBhY3RpdmUsIGJ1dCBjYW4gYmUg ZGlzYWJsZWQKKyAqIDwwOiB0aGUgbGFwaWMgTk1JIHdhdGNoZG9nIGhhcyBub3QgYmVlbiBzZXQg dXAsIGFuZCBjYW5ub3QKKyAqICAgICBiZSBlbmFibGVkCisgKiAgMDogdGhlIGxhcGljIE5NSSB3 YXRjaGRvZyBpcyBkaXNhYmxlZCwgYnV0IGNhbiBiZSBlbmFibGVkCisgKi8KK2F0b21pY190IG5t aV9hY3RpdmUgPSBBVE9NSUNfSU5JVCgwKTsJLyogb3Byb2ZpbGUgdXNlcyB0aGlzICovCit1bnNp Z25lZCBpbnQgbm1pX3dhdGNoZG9nID0gTk1JX0RFRkFVTFQ7CisKK3N0YXRpYyBERUZJTkVfUEVS X0NQVShzaG9ydCwgd2RfZW5hYmxlZCk7CitzdGF0aWMgdW5zaWduZWQgaW50IG5taV9oeiA9IEha Oworc3RhdGljIGludCBlbmRmbGFnIF9faW5pdGRhdGEgPSAwOworCitzdGF0aWMgaW5saW5lIHVu c2lnbmVkIGludCBnZXRfbm1pX2NvdW50KGludCBjcHUpCit7CisjaWZkZWYgQ09ORklHX1g4Nl82 NAorCXJldHVybiBjcHVfcGRhKGNwdSktPl9fbm1pX2NvdW50OworI2Vsc2UKKwlyZXR1cm4gbm1p X2NvdW50KGNwdSk7CisjZW5kaWYKK30KKworc3RhdGljIGlubGluZSBpbnQgbWNlX2luX3Byb2dy ZXNzKHZvaWQpCit7CisjaWYgZGVmaW5lZChDT05GSVhfWDg2XzY0KSAmJiBkZWZpbmVkKENPTkZJ R19YODZfTUNFKQorCXJldHVybiBhdG9taWNfcmVhZCgmbWNlX2VudHJ5KSA+IDA7CisjZW5kaWYK KwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRha2UgdGhlIGxvY2FsIGFwaWMgdGltZXIgYW5kIFBJ VC9IUEVUIGludG8gYWNjb3VudC4gV2UgZG9uJ3QKKyAqIGtub3cgd2hpY2ggb25lIGlzIGFjdGl2 ZSwgd2hlbiB3ZSBoYXZlIGhpZ2hyZXMvZHludGljayBvbgorICovCitzdGF0aWMgaW5saW5lIHVu c2lnbmVkIGludCBnZXRfaXJxX3N1bShpbnQgY3B1KQoreworI2lmZGVmIENPTkZJR19YODZfNjQK KwlyZXR1cm4gcmVhZF9wZGEoYXBpY190aW1lcl9pcnFzKSArIHJlYWRfcGRhKGlycTBfaXJxcyk7 CisjZWxzZQorCXJldHVybiBwZXJfY3B1KGlycV9zdGF0LCBjcHUpLmFwaWNfdGltZXJfaXJxcyAr CisJCXBlcl9jcHUoaXJxX3N0YXQsIGNwdSkuaXJxMF9pcnFzOworI2VuZGlmCit9CisKKy8qIFJ1 biBhZnRlciBjb21tYW5kIGxpbmUgYW5kIGNwdV9pbml0IGluaXQsIGJ1dCBiZWZvcmUgYWxsIG90 aGVyIGNoZWNrcyAqLwordm9pZCBubWlfd2F0Y2hkb2dfZGVmYXVsdCh2b2lkKQoreworCWlmIChu bWlfd2F0Y2hkb2cgIT0gTk1JX0RFRkFVTFQpCisJCXJldHVybjsKKyNpZmRlZiBDT05GSUdfWDg2 XzY0CisJbm1pX3dhdGNoZG9nID0gTk1JX05PTkU7CisjZWxzZQorCWlmIChsYXBpY193YXRjaGRv Z19vaygpKQorCQlubWlfd2F0Y2hkb2cgPSBOTUlfTE9DQUxfQVBJQzsKKwllbHNlCisJCW5taV93 YXRjaGRvZyA9IE5NSV9JT19BUElDOworI2VuZGlmCit9CisKKyNpZmRlZiBDT05GSUdfU01QCisv KgorICogVGhlIHBlcmZvcm1hbmNlIGNvdW50ZXJzIHVzZWQgYnkgTk1JX0xPQ0FMX0FQSUMgZG9u J3QgdHJpZ2dlciB3aGVuCisgKiB0aGUgQ1BVIGlzIGlkbGUuIFRvIG1ha2Ugc3VyZSB0aGUgTk1J IHdhdGNoZG9nIHJlYWxseSB0aWNrcyBvbiBhbGwKKyAqIENQVXMgZHVyaW5nIHRoZSB0ZXN0IG1h a2UgdGhlbSBidXN5LgorICovCitzdGF0aWMgX19pbml0IHZvaWQgbm1pX2NwdV9idXN5KHZvaWQg KmRhdGEpCit7CisJbG9jYWxfaXJxX2VuYWJsZV9pbl9oYXJkaXJxKCk7CisJLyoKKwkgKiBJbnRl bnRpb25hbGx5IGRvbid0IHVzZSBjcHVfcmVsYXggaGVyZS4gVGhpcyBpcworCSAqIHRvIG1ha2Ug c3VyZSB0aGF0IHRoZSBwZXJmb3JtYW5jZSBjb3VudGVyIHJlYWxseSB0aWNrcywKKwkgKiBldmVu IGlmIHRoZXJlIGlzIGEgc2ltdWxhdG9yIG9yIHNpbWlsYXIgdGhhdCBjYXRjaGVzIHRoZQorCSAq IHBhdXNlIGluc3RydWN0aW9uLiBPbiBhIHJlYWwgSFQgbWFjaGluZSB0aGlzIGlzIGZpbmUgYmVj YXVzZQorCSAqIGFsbCBvdGhlciBDUFVzIGFyZSBidXN5IHdpdGggInVzZWxlc3MiIGRlbGF5IGxv b3BzIGFuZCBkb24ndAorCSAqIGNhcmUgaWYgdGhleSBnZXQgc29tZXdoYXQgbGVzcyBjeWNsZXMu CisJICovCisJd2hpbGUgKGVuZGZsYWcgPT0gMCkKKwkJbWIoKTsKK30KKyNlbmRpZiAvKiBDT05G SUdfU01QICovCisKK2ludCBfX2luaXQgY2hlY2tfbm1pX3dhdGNoZG9nKHZvaWQpCit7CisJdW5z aWduZWQgaW50ICpwcmV2X25taV9jb3VudDsKKwlpbnQgY3B1OworCisJaWYgKG5taV93YXRjaGRv ZyA9PSBOTUlfTk9ORSB8fCBubWlfd2F0Y2hkb2cgPT0gTk1JX0RJU0FCTEVEKQorCQlyZXR1cm4g MDsKKworCWlmICghYXRvbWljX3JlYWQoJm5taV9hY3RpdmUpKQorCQlyZXR1cm4gMDsKKworCXBy ZXZfbm1pX2NvdW50ID0ga21hbGxvYyhOUl9DUFVTICogc2l6ZW9mKGludCksIEdGUF9LRVJORUwp OworCWlmICghcHJldl9ubWlfY291bnQpCisJCWdvdG8gZXJyb3I7CisKKwlwcmludGsoS0VSTl9J TkZPICJUZXN0aW5nIE5NSSB3YXRjaGRvZyAuLi4gIik7CisKKyNpZmRlZiBDT05GSUdfU01QCisJ aWYgKG5taV93YXRjaGRvZyA9PSBOTUlfTE9DQUxfQVBJQykKKwkJc21wX2NhbGxfZnVuY3Rpb24o bm1pX2NwdV9idXN5LCAodm9pZCAqKSZlbmRmbGFnLCAwLCAwKTsKKyNlbmRpZgorCisJZm9yX2Vh Y2hfcG9zc2libGVfY3B1KGNwdSkKKwkJcHJldl9ubWlfY291bnRbY3B1XSA9IGdldF9ubWlfY291 bnQoY3B1KTsKKworCWxvY2FsX2lycV9lbmFibGUoKTsKKwltZGVsYXkoKDIwICogMTAwMCkgLyBu bWlfaHopOyAvKiB3YWl0IGZvciAyMCB0aWNrcyAqLworCisJZm9yX2VhY2hfb25saW5lX2NwdShj cHUpIHsKKwkJaWYgKCFwZXJfY3B1KHdkX2VuYWJsZWQsIGNwdSkpCisJCQljb250aW51ZTsKKwkJ aWYgKGdldF9ubWlfY291bnQoY3B1KSAtIHByZXZfbm1pX2NvdW50W2NwdV0gPD0gNSkgeworCQkJ cHJpbnRrKEtFUk5fV0FSTklORyAiV0FSTklORzogQ1BVIyVkOiBOTUkgIgorCQkJCSJhcHBlYXJz IHRvIGJlIHN0dWNrICglZC0+JWQpIVxuIiwKKwkJCQljcHUsCisJCQkJcHJldl9ubWlfY291bnRb Y3B1XSwKKwkJCQlnZXRfbm1pX2NvdW50KGNwdSkpOworCQkJcGVyX2NwdSh3ZF9lbmFibGVkLCBj cHUpID0gMDsKKwkJCWF0b21pY19kZWMoJm5taV9hY3RpdmUpOworCQl9CisJfQorCWVuZGZsYWcg PSAxOworCWlmICghYXRvbWljX3JlYWQoJm5taV9hY3RpdmUpKSB7CisJCWtmcmVlKHByZXZfbm1p X2NvdW50KTsKKwkJYXRvbWljX3NldCgmbm1pX2FjdGl2ZSwgLTEpOworCQlnb3RvIGVycm9yOwor CX0KKwlwcmludGsoIk9LLlxuIik7CisKKwkvKgorCSAqIG5vdyB0aGF0IHdlIGtub3cgaXQgd29y a3Mgd2UgY2FuIHJlZHVjZSBOTUkgZnJlcXVlbmN5IHRvCisJICogc29tZXRoaW5nIG1vcmUgcmVh c29uYWJsZTsgbWFrZXMgYSBkaWZmZXJlbmNlIGluIHNvbWUgY29uZmlncworCSAqLworCWlmIChu bWlfd2F0Y2hkb2cgPT0gTk1JX0xPQ0FMX0FQSUMpCisJCW5taV9oeiA9IGxhcGljX2FkanVzdF9u bWlfaHooMSk7CisKKwlrZnJlZShwcmV2X25taV9jb3VudCk7CisJcmV0dXJuIDA7CisKK2Vycm9y OgorI2lmZGVmIENPTkZJR19YODZfMzIKKwl0aW1lcl9hY2sgPSAhY3B1X2hhc190c2M7CisjZW5k aWYKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHNldHVwX25taV93YXRjaGRv ZyhjaGFyICpzdHIpCit7CisJaW50IG5taTsKKworCWlmICghc3RybmNtcChzdHIsICJwYW5pYyIs IDUpKSB7CisJCXBhbmljX29uX3RpbWVvdXQgPSAxOworCQlzdHIgPSBzdHJjaHIoc3RyLCAnLCcp OworCQlpZiAoIXN0cikKKwkJCXJldHVybiAxOworCQkrK3N0cjsKKwl9CisKKwlnZXRfb3B0aW9u KCZzdHIsICZubWkpOworCWlmIChubWkgPj0gTk1JX0lOVkFMSUQgfHwgbm1pIDwgTk1JX05PTkUp CisJCXJldHVybiAwOworCisJbm1pX3dhdGNoZG9nID0gbm1pOworCisJcmV0dXJuIDE7Cit9Citf X3NldHVwKCJubWlfd2F0Y2hkb2c9Iiwgc2V0dXBfbm1pX3dhdGNoZG9nKTsKKworLyogU3VzcGVu ZC9yZXN1bWUgc3VwcG9ydCAqLworI2lmZGVmIENPTkZJR19QTQorCitzdGF0aWMgaW50IG5taV9w bV9hY3RpdmU7IC8qIG5taV9hY3RpdmUgYmVmb3JlIHN1c3BlbmQgKi8KKworc3RhdGljIGludCBs YXBpY19ubWlfc3VzcGVuZChzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3Rh dGUpCit7CisJLyogb25seSBDUFUwIGdvZXMgaGVyZSwgb3RoZXIgQ1BVcyBzaG91bGQgYmUgb2Zm bGluZSAqLworCW5taV9wbV9hY3RpdmUgPSBhdG9taWNfcmVhZCgmbm1pX2FjdGl2ZSk7CisJc3Rv cF9hcGljX25taV93YXRjaGRvZyhOVUxMKTsKKwlCVUdfT04oYXRvbWljX3JlYWQoJm5taV9hY3Rp dmUpICE9IDApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxhcGljX25taV9yZXN1bWUo c3RydWN0IHN5c19kZXZpY2UgKmRldikKK3sKKwkvKiBvbmx5IENQVTAgZ29lcyBoZXJlLCBvdGhl ciBDUFVzIHNob3VsZCBiZSBvZmZsaW5lICovCisJaWYgKG5taV9wbV9hY3RpdmUgPiAwKSB7CisJ CXNldHVwX2FwaWNfbm1pX3dhdGNoZG9nKE5VTEwpOworCQl0b3VjaF9ubWlfd2F0Y2hkb2coKTsK Kwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3lzZGV2X2NsYXNzIG5taV9zeXNj bGFzcyA9IHsKKwkubmFtZQkJPSAibGFwaWNfbm1pIiwKKwkucmVzdW1lCQk9IGxhcGljX25taV9y ZXN1bWUsCisJLnN1c3BlbmQJPSBsYXBpY19ubWlfc3VzcGVuZCwKK307CisKK3N0YXRpYyBzdHJ1 Y3Qgc3lzX2RldmljZSBkZXZpY2VfbGFwaWNfbm1pID0geworCS5pZAk9IDAsCisJLmNscwk9ICZu bWlfc3lzY2xhc3MsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X2xhcGljX25taV9zeXNm cyh2b2lkKQoreworCWludCBlcnJvcjsKKworCS8qCisJICogc2hvdWxkIHJlYWxseSBiZSBhIEJV R19PTiBidXQgYi9jIHRoaXMgaXMgYW4KKwkgKiBpbml0IGNhbGwsIGl0IGp1c3QgZG9lc24ndCB3 b3JrLiAgLWRjegorCSAqLworCWlmIChubWlfd2F0Y2hkb2cgIT0gTk1JX0xPQ0FMX0FQSUMpCisJ CXJldHVybiAwOworCisJaWYgKGF0b21pY19yZWFkKCZubWlfYWN0aXZlKSA8IDApCisJCXJldHVy biAwOworCisJZXJyb3IgPSBzeXNkZXZfY2xhc3NfcmVnaXN0ZXIoJm5taV9zeXNjbGFzcyk7CisJ aWYgKCFlcnJvcikKKwkJZXJyb3IgPSBzeXNkZXZfcmVnaXN0ZXIoJmRldmljZV9sYXBpY19ubWkp OworCisJcmV0dXJuIGVycm9yOworfQorLyogbXVzdCBjb21lIGFmdGVyIHRoZSBsb2NhbCBBUElD J3MgZGV2aWNlX2luaXRjYWxsKCkgKi8KK2xhdGVfaW5pdGNhbGwoaW5pdF9sYXBpY19ubWlfc3lz ZnMpOworCisjZW5kaWYJLyogQ09ORklHX1BNICovCisKK3N0YXRpYyB2b2lkIF9fYWNwaV9ubWlf ZW5hYmxlKHZvaWQgKl9fdW51c2VkKQoreworCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfTFZUMCwg QVBJQ19ETV9OTUkpOworfQorCisvKiBFbmFibGUgdGltZXIgYmFzZWQgTk1JcyBvbiBhbGwgQ1BV cyAqLwordm9pZCBhY3BpX25taV9lbmFibGUodm9pZCkKK3sKKwlpZiAoYXRvbWljX3JlYWQoJm5t aV9hY3RpdmUpICYmIG5taV93YXRjaGRvZyA9PSBOTUlfSU9fQVBJQykKKwkJb25fZWFjaF9jcHUo X19hY3BpX25taV9lbmFibGUsIE5VTEwsIDAsIDEpOworfQorCitzdGF0aWMgdm9pZCBfX2FjcGlf bm1pX2Rpc2FibGUodm9pZCAqX191bnVzZWQpCit7CisJYXBpY193cml0ZV9hcm91bmQoQVBJQ19M VlQwLCBBUElDX0RNX05NSSB8IEFQSUNfTFZUX01BU0tFRCk7Cit9CisKKy8qIERpc2FibGUgdGlt ZXIgYmFzZWQgTk1JcyBvbiBhbGwgQ1BVcyAqLwordm9pZCBhY3BpX25taV9kaXNhYmxlKHZvaWQp Cit7CisJaWYgKGF0b21pY19yZWFkKCZubWlfYWN0aXZlKSAmJiBubWlfd2F0Y2hkb2cgPT0gTk1J X0lPX0FQSUMpCisJCW9uX2VhY2hfY3B1KF9fYWNwaV9ubWlfZGlzYWJsZSwgTlVMTCwgMCwgMSk7 Cit9CisKK3ZvaWQgc2V0dXBfYXBpY19ubWlfd2F0Y2hkb2codm9pZCAqdW51c2VkKQoreworCWlm IChfX2dldF9jcHVfdmFyKHdkX2VuYWJsZWQpKQorCQlyZXR1cm47CisKKwkvKiBjaGVhcCBoYWNr IHRvIHN1cHBvcnQgc3VzcGVuZC9yZXN1bWUgKi8KKwkvKiBpZiBjcHUwIGlzIG5vdCBhY3RpdmUg bmVpdGhlciBzaG91bGQgdGhlIG90aGVyIGNwdXMgKi8KKwlpZiAoc21wX3Byb2Nlc3Nvcl9pZCgp ICE9IDAgJiYgYXRvbWljX3JlYWQoJm5taV9hY3RpdmUpIDw9IDApCisJCXJldHVybjsKKworCXN3 aXRjaCAobm1pX3dhdGNoZG9nKSB7CisJY2FzZSBOTUlfTE9DQUxfQVBJQzoKKwkJX19nZXRfY3B1 X3Zhcih3ZF9lbmFibGVkKSA9IDE7CisJCWlmIChsYXBpY193YXRjaGRvZ19pbml0KG5taV9oeikg PCAwKSB7CisJCQlfX2dldF9jcHVfdmFyKHdkX2VuYWJsZWQpID0gMDsKKwkJCXJldHVybjsKKwkJ fQorCQkvKiBGQUxMIFRIUk9VR0ggKi8KKwljYXNlIE5NSV9JT19BUElDOgorCQlfX2dldF9jcHVf dmFyKHdkX2VuYWJsZWQpID0gMTsKKwkJYXRvbWljX2luYygmbm1pX2FjdGl2ZSk7CisJfQorfQor Cit2b2lkIHN0b3BfYXBpY19ubWlfd2F0Y2hkb2codm9pZCAqdW51c2VkKQoreworCS8qIG9ubHkg c3VwcG9ydCBMT0NBTCBhbmQgSU8gQVBJQ3MgZm9yIG5vdyAqLworCWlmIChubWlfd2F0Y2hkb2cg IT0gTk1JX0xPQ0FMX0FQSUMgJiYKKwkgICAgbm1pX3dhdGNoZG9nICE9IE5NSV9JT19BUElDKQor CSAgICAJcmV0dXJuOworCWlmIChfX2dldF9jcHVfdmFyKHdkX2VuYWJsZWQpID09IDApCisJCXJl dHVybjsKKwlpZiAobm1pX3dhdGNoZG9nID09IE5NSV9MT0NBTF9BUElDKQorCQlsYXBpY193YXRj aGRvZ19zdG9wKCk7CisJX19nZXRfY3B1X3Zhcih3ZF9lbmFibGVkKSA9IDA7CisJYXRvbWljX2Rl Yygmbm1pX2FjdGl2ZSk7Cit9CisKKy8qCisgKiB0aGUgYmVzdCB3YXkgdG8gZGV0ZWN0IHdoZXRo ZXIgYSBDUFUgaGFzIGEgJ2hhcmQgbG9ja3VwJyBwcm9ibGVtCisgKiBpcyB0byBjaGVjayBpdCdz IGxvY2FsIEFQSUMgdGltZXIgSVJRIGNvdW50cy4gSWYgdGhleSBhcmUgbm90CisgKiBjaGFuZ2lu ZyB0aGVuIHRoYXQgQ1BVIGhhcyBzb21lIHByb2JsZW0uCisgKgorICogYXMgdGhlc2Ugd2F0Y2hk b2cgTk1JIElSUXMgYXJlIGdlbmVyYXRlZCBvbiBldmVyeSBDUFUsIHdlIG9ubHkKKyAqIGhhdmUg dG8gY2hlY2sgdGhlIGN1cnJlbnQgcHJvY2Vzc29yLgorICoKKyAqIHNpbmNlIE5NSXMgZG9uJ3Qg bGlzdGVuIHRvIF9hbnlfIGxvY2tzLCB3ZSBoYXZlIHRvIGJlIGV4dHJlbWVseQorICogY2FyZWZ1 bCBub3QgdG8gcmVseSBvbiB1bnNhZmUgdmFyaWFibGVzLiBUaGUgcHJpbnRrIG1pZ2h0IGxvY2sK KyAqIHVwIHRob3VnaCwgc28gd2UgaGF2ZSB0byBicmVhayB1cCBhbnkgY29uc29sZSBsb2NrcyBm aXJzdCAuLi4KKyAqIFt3aGVuIHRoZXJlIHdpbGwgYmUgbW9yZSB0dHktcmVsYXRlZCBsb2Nrcywg YnJlYWsgdGhlbSB1cCBoZXJlIHRvbyFdCisgKi8KKworc3RhdGljIERFRklORV9QRVJfQ1BVKHVu c2lnbmVkLCBsYXN0X2lycV9zdW0pOworc3RhdGljIERFRklORV9QRVJfQ1BVKGxvY2FsX3QsIGFs ZXJ0X2NvdW50ZXIpOworc3RhdGljIERFRklORV9QRVJfQ1BVKGludCwgbm1pX3RvdWNoKTsKKwor dm9pZCB0b3VjaF9ubWlfd2F0Y2hkb2codm9pZCkKK3sKKwlpZiAobm1pX3dhdGNoZG9nID4gMCkg eworCQl1bnNpZ25lZCBjcHU7CisKKwkJLyoKKyAJCSAqIFRlbGwgb3RoZXIgQ1BVcyB0byByZXNl dCB0aGVpciBhbGVydCBjb3VudGVycy4gV2UgY2Fubm90CisJCSAqIGRvIGl0IG91cnNlbHZlcyBi ZWNhdXNlIHRoZSBhbGVydCBjb3VudCBpbmNyZWFzZSBpcyBub3QKKwkJICogYXRvbWljCisJCSAq LworCQlmb3JfZWFjaF9wcmVzZW50X2NwdShjcHUpIHsKKwkJCWlmIChwZXJfY3B1KG5taV90b3Vj aCwgY3B1KSAhPSAxKQorCQkJCXBlcl9jcHUobm1pX3RvdWNoLCBjcHUpID0gMTsKKwkJfQorCX0K KworCS8qIFRpY2tsZSB0aGUgc29mdGxvY2t1cCBkZXRlY3RvciB0b28gKi8KKwl0b3VjaF9zb2Z0 bG9ja3VwX3dhdGNoZG9nKCk7Cit9CitFWFBPUlRfU1lNQk9MKHRvdWNoX25taV93YXRjaGRvZyk7 CisKK25vdHJhY2UgX19rcHJvYmVzIGludAorbm1pX3dhdGNoZG9nX3RpY2soc3RydWN0IHB0X3Jl Z3MgKnJlZ3MsIHVuc2lnbmVkIHJlYXNvbikKK3sKKwkvKgorCSAqIFNpbmNlIGN1cnJlbnRfdGhy ZWFkX2luZm8oKS0+IGlzIGFsd2F5cyBvbiB0aGUgc3RhY2ssIGFuZCB3ZQorCSAqIGFsd2F5cyBz d2l0Y2ggdGhlIHN0YWNrIE5NSS1hdG9taWNhbGx5LCBpdCdzIHNhZmUgdG8gdXNlCisJICogc21w X3Byb2Nlc3Nvcl9pZCgpCisJICovCisJdW5zaWduZWQgaW50IHN1bTsKKwlpbnQgdG91Y2hlZCA9 IDA7CisJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwlpbnQgcmMgPSAwOworCisJLyog Y2hlY2sgZm9yIG90aGVyIHVzZXJzIGZpcnN0ICovCisJaWYgKG5vdGlmeV9kaWUoRElFX05NSSwg Im5taSIsIHJlZ3MsIHJlYXNvbiwgMiwgU0lHSU5UKQorCQkJPT0gTk9USUZZX1NUT1ApIHsKKwkJ cmMgPSAxOworCQl0b3VjaGVkID0gMTsKKwl9CisKKwlzdW0gPSBnZXRfaXJxX3N1bShjcHUpOwor CisJaWYgKF9fZ2V0X2NwdV92YXIobm1pX3RvdWNoKSkgeworCQlfX2dldF9jcHVfdmFyKG5taV90 b3VjaCkgPSAwOworCQl0b3VjaGVkID0gMTsKKwl9CisKKwlpZiAoY3B1X2lzc2V0KGNwdSwgYmFj a3RyYWNlX21hc2spKSB7CisJCXN0YXRpYyBERUZJTkVfU1BJTkxPQ0sobG9jayk7CisJCXNwaW5f bG9jaygmbG9jayk7CisJCXByaW50aygiTk1JIGJhY2t0cmFjZSBmb3IgY3B1ICVkXG4iLCBjcHUp OworCQlkdW1wX3N0YWNrKCk7CisJCXNwaW5fdW5sb2NrKCZsb2NrKTsKKwkJY3B1X2NsZWFyKGNw dSwgYmFja3RyYWNlX21hc2spOworCX0KKworCS8qCisJICogQ291bGQgY2hlY2sgb29wc19pbl9w cm9ncmVzcyBoZXJlIHRvbywKKwkgKiBidXQgaXQncyBzYWZlciBub3QgdG8gZG8KKwkgKi8KKwlp ZiAobWNlX2luX3Byb2dyZXNzKCkpCisJCXRvdWNoZWQgPSAxOworCisJLyogaWYgdGhlIG5vbmUg b2YgdGhlIHRpbWVycyBpc24ndCBmaXJpbmcsIHRoaXMgY3B1IGlzbid0IGRvaW5nIG11Y2ggKi8K KwlpZiAoIXRvdWNoZWQgJiYgX19nZXRfY3B1X3ZhcihsYXN0X2lycV9zdW0pID09IHN1bSkgewor CQkvKgorCQkgKiBBeWllZSwgbG9va3MgbGlrZSB0aGlzIENQVSBpcyBzdHVjayAuLi4KKwkJICog d2FpdCBhIGZldyBJUlFzICg1IHNlY29uZHMpIGJlZm9yZSBkb2luZyB0aGUgb29wcyAuLi4KKwkJ ICovCisJCWxvY2FsX2luYygmX19nZXRfY3B1X3ZhcihhbGVydF9jb3VudGVyKSk7CisJCWlmIChs b2NhbF9yZWFkKCZfX2dldF9jcHVfdmFyKGFsZXJ0X2NvdW50ZXIpKSA9PSA1ICogbm1pX2h6KQor CQkJZGllX25taSgiTk1JIFdhdGNoZG9nIGRldGVjdGVkIExPQ0tVUFxuIiwKKwkJCQlyZWdzLCBw YW5pY19vbl90aW1lb3V0KTsKKwl9IGVsc2UgeworCQlfX2dldF9jcHVfdmFyKGxhc3RfaXJxX3N1 bSkgPSBzdW07CisJCWxvY2FsX3NldCgmX19nZXRfY3B1X3ZhcihhbGVydF9jb3VudGVyKSwgMCk7 CisJfQorCisJLyogc2VlIGlmIHRoZSBubWkgd2F0Y2hkb2cgd2VudCBvZmYgKi8KKwlpZiAoIV9f Z2V0X2NwdV92YXIod2RfZW5hYmxlZCkpCisJCXJldHVybiByYzsKKworCXN3aXRjaCAobm1pX3dh dGNoZG9nKSB7CisJY2FzZSBOTUlfTE9DQUxfQVBJQzoKKwkJcmMgfD0gbGFwaWNfd2RfZXZlbnQo bm1pX2h6KTsKKwkJYnJlYWs7CisJY2FzZSBOTUlfSU9fQVBJQzoKKwkJLyoKKwkJICogZG9uJ3Qg a25vdyBob3cgdG8gYWNjdXJhdGVseSBjaGVjayBmb3IgdGhpcy4KKwkJICoganVzdCBhc3N1bWUg aXQgd2FzIGEgd2F0Y2hkb2cgdGltZXIgaW50ZXJydXB0CisJCSAqIFRoaXMgbWF0Y2hlcyB0aGUg b2xkIGJlaGF2aW91ci4KKwkJICovCisJCXJjID0gMTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJu IHJjOworfQorCisjaWZkZWYgQ09ORklHX1g4Nl82NAorc3RhdGljIHVuc2lnbmVkIGlnbm9yZV9u bWlzOworCithc21saW5rYWdlIG5vdHJhY2UgX19rcHJvYmVzIHZvaWQKK2RvX25taShzdHJ1Y3Qg cHRfcmVncyAqcmVncywgbG9uZyBlcnJvcl9jb2RlKQoreworCW5taV9lbnRlcigpOworCWFkZF9w ZGEoX19ubWlfY291bnQsIDEpOworCWlmICghaWdub3JlX25taXMpCisJCWRlZmF1bHRfZG9fbm1p KHJlZ3MpOworCW5taV9leGl0KCk7Cit9CisKK3ZvaWQgc3RvcF9ubWkodm9pZCkKK3sKKwlhY3Bp X25taV9kaXNhYmxlKCk7CisJaWdub3JlX25taXMrKzsKK30KKwordm9pZCByZXN0YXJ0X25taSh2 b2lkKQoreworCWlnbm9yZV9ubWlzLS07CisJYWNwaV9ubWlfZW5hYmxlKCk7Cit9CisjZW5kaWYg LyogQ09ORklHX1g4Nl82NCAqLworCisjaWZkZWYgQ09ORklHX1NZU0NUTAorCitzdGF0aWMgaW50 IHVua25vd25fbm1pX3BhbmljX2NhbGxiYWNrKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgY3B1 KQoreworCXVuc2lnbmVkIGNoYXIgcmVhc29uID0gZ2V0X25taV9yZWFzb24oKTsKKwljaGFyIGJ1 Zls2NF07CisKKwlzcHJpbnRmKGJ1ZiwgIk5NSSByZWNlaXZlZCBmb3IgdW5rbm93biByZWFzb24g JTAyeFxuIiwgcmVhc29uKTsKKwlkaWVfbm1pKGJ1ZiwgcmVncywgMSk7CisJcmV0dXJuIDA7Cit9 CisKKy8qCisgKiBwcm9jIGhhbmRsZXIgZm9yIC9wcm9jL3N5cy9rZXJuZWwvbm1pCisgKi8KK2lu dCBwcm9jX25taV9lbmFibGVkKHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsIHN0 cnVjdCBmaWxlICpmaWxlLAorCQkJdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5ndGgs IGxvZmZfdCAqcHBvcykKK3sKKwlpbnQgb2xkX3N0YXRlOworCisJbm1pX3dhdGNoZG9nX2VuYWJs ZWQgPSAoYXRvbWljX3JlYWQoJm5taV9hY3RpdmUpID4gMCkgPyAxIDogMDsKKwlvbGRfc3RhdGUg PSBubWlfd2F0Y2hkb2dfZW5hYmxlZDsKKwlwcm9jX2RvaW50dmVjKHRhYmxlLCB3cml0ZSwgZmls ZSwgYnVmZmVyLCBsZW5ndGgsIHBwb3MpOworCWlmICghIW9sZF9zdGF0ZSA9PSAhIW5taV93YXRj aGRvZ19lbmFibGVkKQorCQlyZXR1cm4gMDsKKworCWlmIChhdG9taWNfcmVhZCgmbm1pX2FjdGl2 ZSkgPCAwIHx8IG5taV93YXRjaGRvZyA9PSBOTUlfRElTQUJMRUQpIHsKKwkJcHJpbnRrKEtFUk5f V0FSTklORworCQkJIk5NSSB3YXRjaGRvZyBpcyBwZXJtYW5lbnRseSBkaXNhYmxlZFxuIik7CisJ CXJldHVybiAtRUlPOworCX0KKworCS8qIGlmIG5taV93YXRjaGRvZyBpcyBub3Qgc2V0IHlldCwg dGhlbiBzZXQgaXQgKi8KKwlubWlfd2F0Y2hkb2dfZGVmYXVsdCgpOworCisJaWYgKG5taV93YXRj aGRvZyA9PSBOTUlfTE9DQUxfQVBJQykgeworCQlpZiAobm1pX3dhdGNoZG9nX2VuYWJsZWQpCisJ CQllbmFibGVfbGFwaWNfbm1pX3dhdGNoZG9nKCk7CisJCWVsc2UKKwkJCWRpc2FibGVfbGFwaWNf bm1pX3dhdGNoZG9nKCk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJIk5N SSB3YXRjaGRvZyBkb2Vzbid0IGtub3cgd2hhdCBoYXJkd2FyZSB0byB0b3VjaFxuIik7CisJCXJl dHVybiAtRUlPOworCX0KKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIENPTkZJR19TWVNDVEwg Ki8KKworaW50IGRvX25taV9jYWxsYmFjayhzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IGNwdSkK K3sKKyNpZmRlZiBDT05GSUdfU1lTQ1RMCisJaWYgKHVua25vd25fbm1pX3BhbmljKQorCQlyZXR1 cm4gdW5rbm93bl9ubWlfcGFuaWNfY2FsbGJhY2socmVncywgY3B1KTsKKyNlbmRpZgorCXJldHVy biAwOworfQorCit2b2lkIF9fdHJpZ2dlcl9hbGxfY3B1X2JhY2t0cmFjZSh2b2lkKQoreworCWlu dCBpOworCisJYmFja3RyYWNlX21hc2sgPSBjcHVfb25saW5lX21hcDsKKwkvKiBXYWl0IGZvciB1 cCB0byAxMCBzZWNvbmRzIGZvciBhbGwgQ1BVcyB0byBkbyB0aGUgYmFja3RyYWNlICovCisJZm9y IChpID0gMDsgaSA8IDEwICogMTAwMDsgaSsrKSB7CisJCWlmIChjcHVzX2VtcHR5KGJhY2t0cmFj ZV9tYXNrKSkKKwkJCWJyZWFrOworCQltZGVsYXkoMSk7CisJfQorfQorCitFWFBPUlRfU1lNQk9M KG5taV9hY3RpdmUpOworRVhQT1JUX1NZTUJPTChubWlfd2F0Y2hkb2cpOworCgpJbmRleDogYXJj aC94ODYva2VybmVsL3RyYXBzXzY0LmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBhL2FyY2gveDg2L2tlcm5l bC90cmFwc182NC5jCU1vbiBNYXkgMTkgMDE6MzY6NDIgMjAwOAorKysgYi9hcmNoL3g4Ni9rZXJu ZWwvdHJhcHNfNjQuYwlXZWQgTWF5IDIxIDA4OjUwOjQwIDIwMDgKQEAgLTc2LDYgKzc2LDcgQEAg YXNtbGlua2FnZSB2b2lkIGFsaWdubWVudF9jaGVjayh2b2lkKTsKIGFzbWxpbmthZ2Ugdm9pZCBt YWNoaW5lX2NoZWNrKHZvaWQpOwogYXNtbGlua2FnZSB2b2lkIHNwdXJpb3VzX2ludGVycnVwdF9i dWcodm9pZCk7CiAKK2ludCBwYW5pY19vbl91bnJlY292ZXJlZF9ubWk7CiBzdGF0aWMgdW5zaWdu ZWQgaW50IGNvZGVfYnl0ZXMgPSA2NDsKIAogc3RhdGljIGlubGluZSB2b2lkIGNvbmRpdGlvbmFs X3N0aShzdHJ1Y3QgcHRfcmVncyAqcmVncykKCkluZGV4OiBhcmNoL3g4Ni9rZXJuZWwvdHJhcHNf MzIuYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT0KLS0tIGEvYXJjaC94ODYva2VybmVsL3RyYXBzXzMyLmMJTW9uIE1h eSAxOSAwMTozNjo0MiAyMDA4CisrKyBiL2FyY2gveDg2L2tlcm5lbC90cmFwc18zMi5jCVdlZCBN YXkgMjEgMDk6Mjc6NDIgMjAwOApAQCAtNzU1LDkgKzc1NSw5IEBAIHVua25vd25fbm1pX2Vycm9y KHVuc2lnbmVkIGNoYXIgcmVhc29uLCAKIAogc3RhdGljIERFRklORV9TUElOTE9DSyhubWlfcHJp bnRfbG9jayk7CiAKLXZvaWQgbm90cmFjZSBfX2twcm9iZXMgZGllX25taShzdHJ1Y3QgcHRfcmVn cyAqcmVncywgY29uc3QgY2hhciAqbXNnKQordm9pZCBub3RyYWNlIF9fa3Byb2JlcyBkaWVfbm1p KGNoYXIgKnN0ciwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGludCBkb19wYW5pYykKIHsKLQlpZiAo bm90aWZ5X2RpZShESUVfTk1JV0FUQ0hET0csIG1zZywgcmVncywgMCwgMiwgU0lHSU5UKSA9PSBO T1RJRllfU1RPUCkKKwlpZiAobm90aWZ5X2RpZShESUVfTk1JV0FUQ0hET0csIHN0ciwgcmVncywg MCwgMiwgU0lHSU5UKSA9PSBOT1RJRllfU1RPUCkKIAkJcmV0dXJuOwogCiAJc3Bpbl9sb2NrKCZu bWlfcHJpbnRfbG9jayk7CkBAIC03NjYsMTAgKzc2NiwxMiBAQCB2b2lkIG5vdHJhY2UgX19rcHJv YmVzIGRpZV9ubWkoc3RydWN0IHB0CiAJKiB0byBnZXQgYSBtZXNzYWdlIG91dDoKIAkqLwogCWJ1 c3Rfc3BpbmxvY2tzKDEpOwotCXByaW50ayhLRVJOX0VNRVJHICIlcyIsIG1zZyk7CisJcHJpbnRr KEtFUk5fRU1FUkcgIiVzIiwgc3RyKTsKIAlwcmludGsoIiBvbiBDUFUlZCwgaXAgJTA4bHgsIHJl Z2lzdGVyczpcbiIsCiAJCXNtcF9wcm9jZXNzb3JfaWQoKSwgcmVncy0+aXApOwogCXNob3dfcmVn aXN0ZXJzKHJlZ3MpOworCWlmIChkb19wYW5pYykKKwkJcGFuaWMoIk5vbiBtYXNrYWJsZSBpbnRl cnJ1cHQiKTsKIAljb25zb2xlX3NpbGVudCgpOwogCXNwaW5fdW5sb2NrKCZubWlfcHJpbnRfbG9j ayk7CiAJYnVzdF9zcGlubG9ja3MoMCk7CgpJbmRleDogaW5jbHVkZS9hc20teDg2L25taS5oCj09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PQotLS0gYS9pbmNsdWRlL2FzbS14ODYvbm1pLmgJTW9uIE1heSAxOSAwMTozNjo0 MiAyMDA4CisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9ubWkuaAlXZWQgTWF5IDIxIDA5OjI4OjIwIDIw MDgKQEAgLTM4LDEyICszOCwxMCBAQCBzdGF0aWMgaW5saW5lIHZvaWQgdW5zZXRfbm1pX3BtX2Nh bGxiYWNrCiAKICNpZmRlZiBDT05GSUdfWDg2XzY0CiBleHRlcm4gdm9pZCBkZWZhdWx0X2RvX25t aShzdHJ1Y3QgcHRfcmVncyAqKTsKLWV4dGVybiB2b2lkIGRpZV9ubWkoY2hhciAqc3RyLCBzdHJ1 Y3QgcHRfcmVncyAqcmVncywgaW50IGRvX3BhbmljKTsKLWV4dGVybiB2b2lkIG5taV93YXRjaGRv Z19kZWZhdWx0KHZvaWQpOwotI2Vsc2UKLSNkZWZpbmUgbm1pX3dhdGNoZG9nX2RlZmF1bHQoKSBk byB7fSB3aGlsZSAoMCkKICNlbmRpZgogCitleHRlcm4gdm9pZCBubWlfd2F0Y2hkb2dfZGVmYXVs dCh2b2lkKTsKK2V4dGVybiB2b2lkIGRpZV9ubWkoY2hhciAqc3RyLCBzdHJ1Y3QgcHRfcmVncyAq cmVncywgaW50IGRvX3BhbmljKTsKIGV4dGVybiBpbnQgY2hlY2tfbm1pX3dhdGNoZG9nKHZvaWQp OwogZXh0ZXJuIGludCBubWlfd2F0Y2hkb2dfZW5hYmxlZDsKIGV4dGVybiBpbnQgdW5rbm93bl9u bWlfcGFuaWM7CgpJbmRleDogYXJjaC94ODYva2VybmVsL01ha2VmaWxlCj09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot LS0gYS9hcmNoL3g4Ni9rZXJuZWwvTWFrZWZpbGUJTW9uIE1heSAxOSAwMTozNjo0MiAyMDA4Cisr KyBiL2FyY2gveDg2L2tlcm5lbC9NYWtlZmlsZQlXZWQgTWF5IDIxIDEwOjE3OjQyIDIwMDgKQEAg LTUzLDcgKzUzLDcgQEAgb2JqLSQoQ09ORklHX1g4Nl8zMl9TTVApCSs9IHNtcGNvbW1vbi5vCiBv YmotJChDT05GSUdfWDg2XzY0X1NNUCkJKz0gdHNjX3N5bmMubyBzbXBjb21tb24ubwogb2JqLSQo Q09ORklHX1g4Nl9UUkFNUE9MSU5FKQkrPSB0cmFtcG9saW5lXyQoQklUUykubwogb2JqLSQoQ09O RklHX1g4Nl9NUFBBUlNFKQkrPSBtcHBhcnNlLm8KLW9iai0kKENPTkZJR19YODZfTE9DQUxfQVBJ QykJKz0gYXBpY18kKEJJVFMpLm8gbm1pXyQoQklUUykubworb2JqLSQoQ09ORklHX1g4Nl9MT0NB TF9BUElDKQkrPSBhcGljXyQoQklUUykubyBubWkubwogb2JqLSQoQ09ORklHX1g4Nl9JT19BUElD KQkrPSBpb19hcGljXyQoQklUUykubwogb2JqLSQoQ09ORklHX1g4Nl9SRUJPT1RGSVhVUFMpCSs9 IHJlYm9vdF9maXh1cHNfMzIubwogb2JqLSQoQ09ORklHX0tFWEVDKQkJKz0gbWFjaGluZV9rZXhl Y18kKEJJVFMpLm8KCkluZGV4OiBhcmNoL3g4Ni9rZXJuZWwvbm1pXzMyLmMKPT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 Ci0tLSBhL3g4Ni9rZXJuZWwvbm1pXzMyLmMJTW9uIE1heSAxOSAwMTozNjo0MiAyMDA4CisrKyAv ZGV2L251bGwJV2VkIE1heSAyMSAxMDoxMjozMCAyMDA4CkBAIC0xLDQ3MiArMCwwIEBACi0vKgot ICogIE5NSSB3YXRjaGRvZyBzdXBwb3J0IG9uIEFQSUMgc3lzdGVtcwotICoKLSAqICBTdGFydGVk IGJ5IEluZ28gTW9sbmFyIDxtaW5nb0ByZWRoYXQuY29tPgotICoKLSAqICBGaXhlczoKLSAqICBN aWthZWwgUGV0dGVyc3Nvbgk6IEFNRCBLNyBzdXBwb3J0IGZvciBsb2NhbCBBUElDIE5NSSB3YXRj aGRvZy4KLSAqICBNaWthZWwgUGV0dGVyc3Nvbgk6IFBvd2VyIE1hbmFnZW1lbnQgZm9yIGxvY2Fs IEFQSUMgTk1JIHdhdGNoZG9nLgotICogIE1pa2FlbCBQZXR0ZXJzc29uCTogUGVudGl1bSA0IHN1 cHBvcnQgZm9yIGxvY2FsIEFQSUMgTk1JIHdhdGNoZG9nLgotICogIFBhdmVsIE1hY2hlayBhbmQK LSAqICBNaWthZWwgUGV0dGVyc3Nvbgk6IFBNIGNvbnZlcnRlZCB0byBkcml2ZXIgbW9kZWwuIERp c2FibGUvZW5hYmxlIEFQSS4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNs dWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNs dWRlIDxsaW51eC9ubWkuaD4KLSNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KLSNpbmNsdWRlIDxs aW51eC9zeXNjdGwuaD4KLSNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KLSNpbmNsdWRlIDxsaW51 eC9rcHJvYmVzLmg+Ci0jaW5jbHVkZSA8bGludXgvY3B1bWFzay5oPgotI2luY2x1ZGUgPGxpbnV4 L2tlcm5lbF9zdGF0Lmg+Ci0jaW5jbHVkZSA8bGludXgva2RlYnVnLmg+Ci0jaW5jbHVkZSA8bGlu dXgvc2xhYi5oPgotCi0jaW5jbHVkZSA8YXNtL3NtcC5oPgotI2luY2x1ZGUgPGFzbS9ubWkuaD4K LSNpbmNsdWRlIDxhc20vdGltZXIuaD4KLQotI2luY2x1ZGUgIm1hY2hfdHJhcHMuaCIKLQotaW50 IHVua25vd25fbm1pX3BhbmljOwotaW50IG5taV93YXRjaGRvZ19lbmFibGVkOwotCi1zdGF0aWMg Y3B1bWFza190IGJhY2t0cmFjZV9tYXNrID0gQ1BVX01BU0tfTk9ORTsKLQotLyogbm1pX2FjdGl2 ZToKLSAqID4wOiB0aGUgbGFwaWMgTk1JIHdhdGNoZG9nIGlzIGFjdGl2ZSwgYnV0IGNhbiBiZSBk aXNhYmxlZAotICogPDA6IHRoZSBsYXBpYyBOTUkgd2F0Y2hkb2cgaGFzIG5vdCBiZWVuIHNldCB1 cCwgYW5kIGNhbm5vdAotICogICAgIGJlIGVuYWJsZWQKLSAqICAwOiB0aGUgbGFwaWMgTk1JIHdh dGNoZG9nIGlzIGRpc2FibGVkLCBidXQgY2FuIGJlIGVuYWJsZWQKLSAqLwotYXRvbWljX3Qgbm1p X2FjdGl2ZSA9IEFUT01JQ19JTklUKDApOwkJLyogb3Byb2ZpbGUgdXNlcyB0aGlzICovCi0KLXVu c2lnbmVkIGludCBubWlfd2F0Y2hkb2cgPSBOTUlfREVGQVVMVDsKLXN0YXRpYyB1bnNpZ25lZCBp bnQgbm1pX2h6ID0gSFo7Ci0KLXN0YXRpYyBERUZJTkVfUEVSX0NQVShzaG9ydCwgd2RfZW5hYmxl ZCk7Ci0KLXN0YXRpYyBpbnQgZW5kZmxhZyBfX2luaXRkYXRhID0gMDsKLQotI2lmZGVmIENPTkZJ R19TTVAKLS8qIFRoZSBwZXJmb3JtYW5jZSBjb3VudGVycyB1c2VkIGJ5IE5NSV9MT0NBTF9BUElD IGRvbid0IHRyaWdnZXIgd2hlbgotICogdGhlIENQVSBpcyBpZGxlLiBUbyBtYWtlIHN1cmUgdGhl IE5NSSB3YXRjaGRvZyByZWFsbHkgdGlja3Mgb24gYWxsCi0gKiBDUFVzIGR1cmluZyB0aGUgdGVz dCBtYWtlIHRoZW0gYnVzeS4KLSAqLwotc3RhdGljIF9faW5pdCB2b2lkIG5taV9jcHVfYnVzeSh2 b2lkICpkYXRhKQotewotCWxvY2FsX2lycV9lbmFibGVfaW5faGFyZGlycSgpOwotCS8qIEludGVu dGlvbmFsbHkgZG9uJ3QgdXNlIGNwdV9yZWxheCBoZXJlLiBUaGlzIGlzCi0JICAgdG8gbWFrZSBz dXJlIHRoYXQgdGhlIHBlcmZvcm1hbmNlIGNvdW50ZXIgcmVhbGx5IHRpY2tzLAotCSAgIGV2ZW4g aWYgdGhlcmUgaXMgYSBzaW11bGF0b3Igb3Igc2ltaWxhciB0aGF0IGNhdGNoZXMgdGhlCi0JICAg cGF1c2UgaW5zdHJ1Y3Rpb24uIE9uIGEgcmVhbCBIVCBtYWNoaW5lIHRoaXMgaXMgZmluZSBiZWNh dXNlCi0JICAgYWxsIG90aGVyIENQVXMgYXJlIGJ1c3kgd2l0aCAidXNlbGVzcyIgZGVsYXkgbG9v cHMgYW5kIGRvbid0Ci0JICAgY2FyZSBpZiB0aGV5IGdldCBzb21ld2hhdCBsZXNzIGN5Y2xlcy4g Ki8KLQl3aGlsZSAoZW5kZmxhZyA9PSAwKQotCQltYigpOwotfQotI2VuZGlmCi0KLWludCBfX2lu aXQgY2hlY2tfbm1pX3dhdGNoZG9nKHZvaWQpCi17Ci0JdW5zaWduZWQgaW50ICpwcmV2X25taV9j b3VudDsKLQlpbnQgY3B1OwotCi0JaWYgKChubWlfd2F0Y2hkb2cgPT0gTk1JX05PTkUpIHx8IChu bWlfd2F0Y2hkb2cgPT0gTk1JX0RJU0FCTEVEKSkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoIWF0b21p Y19yZWFkKCZubWlfYWN0aXZlKSkKLQkJcmV0dXJuIDA7Ci0KLQlwcmV2X25taV9jb3VudCA9IGtt YWxsb2MoTlJfQ1BVUyAqIHNpemVvZihpbnQpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXByZXZfbm1p X2NvdW50KQotCQlnb3RvIGVycm9yOwotCi0JcHJpbnRrKEtFUk5fSU5GTyAiVGVzdGluZyBOTUkg d2F0Y2hkb2cgLi4uICIpOwotCi0jaWZkZWYgQ09ORklHX1NNUAotCWlmIChubWlfd2F0Y2hkb2cg PT0gTk1JX0xPQ0FMX0FQSUMpCi0JCXNtcF9jYWxsX2Z1bmN0aW9uKG5taV9jcHVfYnVzeSwgKHZv aWQgKikmZW5kZmxhZywgMCwgMCk7Ci0jZW5kaWYKLQotCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShj cHUpCi0JCXByZXZfbm1pX2NvdW50W2NwdV0gPSBubWlfY291bnQoY3B1KTsKLQlsb2NhbF9pcnFf ZW5hYmxlKCk7Ci0JbWRlbGF5KCgyMCoxMDAwKS9ubWlfaHopOyAvLyB3YWl0IDIwIHRpY2tzCi0K LQlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7Ci0jaWZkZWYgQ09ORklHX1NNUAotCQkvKiBD aGVjayBjcHVfY2FsbGluX21hcCBoZXJlIGJlY2F1c2UgdGhhdCBpcyBzZXQKLQkJICAgYWZ0ZXIg dGhlIHRpbWVyIGlzIHN0YXJ0ZWQuICovCi0JCWlmICghY3B1X2lzc2V0KGNwdSwgY3B1X2NhbGxp bl9tYXApKQotCQkJY29udGludWU7Ci0jZW5kaWYKLQkJaWYgKCFwZXJfY3B1KHdkX2VuYWJsZWQs IGNwdSkpCi0JCQljb250aW51ZTsKLQkJaWYgKG5taV9jb3VudChjcHUpIC0gcHJldl9ubWlfY291 bnRbY3B1XSA8PSA1KSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJXQVJOSU5HOiBDUFUjJWQ6 IE5NSSAiCi0JCQkJImFwcGVhcnMgdG8gYmUgc3R1Y2sgKCVkLT4lZCkhXG4iLAotCQkJCWNwdSwK LQkJCQlwcmV2X25taV9jb3VudFtjcHVdLAotCQkJCW5taV9jb3VudChjcHUpKTsKLQkJCXBlcl9j cHUod2RfZW5hYmxlZCwgY3B1KSA9IDA7Ci0JCQlhdG9taWNfZGVjKCZubWlfYWN0aXZlKTsKLQkJ fQotCX0KLQllbmRmbGFnID0gMTsKLQlpZiAoIWF0b21pY19yZWFkKCZubWlfYWN0aXZlKSkgewot CQlrZnJlZShwcmV2X25taV9jb3VudCk7Ci0JCWF0b21pY19zZXQoJm5taV9hY3RpdmUsIC0xKTsK LQkJZ290byBlcnJvcjsKLQl9Ci0JcHJpbnRrKCJPSy5cbiIpOwotCi0JLyogbm93IHRoYXQgd2Ug a25vdyBpdCB3b3JrcyB3ZSBjYW4gcmVkdWNlIE5NSSBmcmVxdWVuY3kgdG8KLQkgICBzb21ldGhp bmcgbW9yZSByZWFzb25hYmxlOyBtYWtlcyBhIGRpZmZlcmVuY2UgaW4gc29tZSBjb25maWdzICov Ci0JaWYgKG5taV93YXRjaGRvZyA9PSBOTUlfTE9DQUxfQVBJQykKLQkJbm1pX2h6ID0gbGFwaWNf YWRqdXN0X25taV9oeigxKTsKLQotCWtmcmVlKHByZXZfbm1pX2NvdW50KTsKLQlyZXR1cm4gMDsK LWVycm9yOgotCXRpbWVyX2FjayA9ICFjcHVfaGFzX3RzYzsKLQotCXJldHVybiAtMTsKLX0KLQot c3RhdGljIGludCBfX2luaXQgc2V0dXBfbm1pX3dhdGNoZG9nKGNoYXIgKnN0cikKLXsKLQlpbnQg bm1pOwotCi0JZ2V0X29wdGlvbigmc3RyLCAmbm1pKTsKLQotCWlmICgobm1pID49IE5NSV9JTlZB TElEKSB8fCAobm1pIDwgTk1JX05PTkUpKQotCQlyZXR1cm4gMDsKLQotCW5taV93YXRjaGRvZyA9 IG5taTsKLQlyZXR1cm4gMTsKLX0KLQotX19zZXR1cCgibm1pX3dhdGNoZG9nPSIsIHNldHVwX25t aV93YXRjaGRvZyk7Ci0KLQotLyogU3VzcGVuZC9yZXN1bWUgc3VwcG9ydCAqLwotCi0jaWZkZWYg Q09ORklHX1BNCi0KLXN0YXRpYyBpbnQgbm1pX3BtX2FjdGl2ZTsgLyogbm1pX2FjdGl2ZSBiZWZv cmUgc3VzcGVuZCAqLwotCi1zdGF0aWMgaW50IGxhcGljX25taV9zdXNwZW5kKHN0cnVjdCBzeXNf ZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKLXsKLQkvKiBvbmx5IENQVTAgZ29lcyBo ZXJlLCBvdGhlciBDUFVzIHNob3VsZCBiZSBvZmZsaW5lICovCi0Jbm1pX3BtX2FjdGl2ZSA9IGF0 b21pY19yZWFkKCZubWlfYWN0aXZlKTsKLQlzdG9wX2FwaWNfbm1pX3dhdGNoZG9nKE5VTEwpOwot CUJVR19PTihhdG9taWNfcmVhZCgmbm1pX2FjdGl2ZSkgIT0gMCk7Ci0JcmV0dXJuIDA7Ci19Ci0K LXN0YXRpYyBpbnQgbGFwaWNfbm1pX3Jlc3VtZShzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2KQotewot CS8qIG9ubHkgQ1BVMCBnb2VzIGhlcmUsIG90aGVyIENQVXMgc2hvdWxkIGJlIG9mZmxpbmUgKi8K LQlpZiAobm1pX3BtX2FjdGl2ZSA+IDApIHsKLQkJc2V0dXBfYXBpY19ubWlfd2F0Y2hkb2coTlVM TCk7Ci0JCXRvdWNoX25taV93YXRjaGRvZygpOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotCi1zdGF0 aWMgc3RydWN0IHN5c2Rldl9jbGFzcyBubWlfc3lzY2xhc3MgPSB7Ci0JLm5hbWUJCT0gImxhcGlj X25taSIsCi0JLnJlc3VtZQkJPSBsYXBpY19ubWlfcmVzdW1lLAotCS5zdXNwZW5kCT0gbGFwaWNf bm1pX3N1c3BlbmQsCi19OwotCi1zdGF0aWMgc3RydWN0IHN5c19kZXZpY2UgZGV2aWNlX2xhcGlj X25taSA9IHsKLQkuaWQJPSAwLAotCS5jbHMJPSAmbm1pX3N5c2NsYXNzLAotfTsKLQotc3RhdGlj IGludCBfX2luaXQgaW5pdF9sYXBpY19ubWlfc3lzZnModm9pZCkKLXsKLQlpbnQgZXJyb3I7Ci0K LQkvKiBzaG91bGQgcmVhbGx5IGJlIGEgQlVHX09OIGJ1dCBiL2MgdGhpcyBpcyBhbgotCSAqIGlu aXQgY2FsbCwgaXQganVzdCBkb2Vzbid0IHdvcmsuICAtZGN6Ci0JICovCi0JaWYgKG5taV93YXRj aGRvZyAhPSBOTUlfTE9DQUxfQVBJQykKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoYXRvbWljX3JlYWQo Jm5taV9hY3RpdmUpIDwgMCkKLQkJcmV0dXJuIDA7Ci0KLQllcnJvciA9IHN5c2Rldl9jbGFzc19y ZWdpc3Rlcigmbm1pX3N5c2NsYXNzKTsKLQlpZiAoIWVycm9yKQotCQllcnJvciA9IHN5c2Rldl9y ZWdpc3RlcigmZGV2aWNlX2xhcGljX25taSk7Ci0JcmV0dXJuIGVycm9yOwotfQotLyogbXVzdCBj b21lIGFmdGVyIHRoZSBsb2NhbCBBUElDJ3MgZGV2aWNlX2luaXRjYWxsKCkgKi8KLWxhdGVfaW5p dGNhbGwoaW5pdF9sYXBpY19ubWlfc3lzZnMpOwotCi0jZW5kaWYJLyogQ09ORklHX1BNICovCi0K LXN0YXRpYyB2b2lkIF9fYWNwaV9ubWlfZW5hYmxlKHZvaWQgKl9fdW51c2VkKQotewotCWFwaWNf d3JpdGVfYXJvdW5kKEFQSUNfTFZUMCwgQVBJQ19ETV9OTUkpOwotfQotCi0vKgotICogRW5hYmxl IHRpbWVyIGJhc2VkIE5NSXMgb24gYWxsIENQVXM6Ci0gKi8KLXZvaWQgYWNwaV9ubWlfZW5hYmxl KHZvaWQpCi17Ci0JaWYgKGF0b21pY19yZWFkKCZubWlfYWN0aXZlKSAmJiBubWlfd2F0Y2hkb2cg PT0gTk1JX0lPX0FQSUMpCi0JCW9uX2VhY2hfY3B1KF9fYWNwaV9ubWlfZW5hYmxlLCBOVUxMLCAw LCAxKTsKLX0KLQotc3RhdGljIHZvaWQgX19hY3BpX25taV9kaXNhYmxlKHZvaWQgKl9fdW51c2Vk KQotewotCWFwaWNfd3JpdGUoQVBJQ19MVlQwLCBBUElDX0RNX05NSSB8IEFQSUNfTFZUX01BU0tF RCk7Ci19Ci0KLS8qCi0gKiBEaXNhYmxlIHRpbWVyIGJhc2VkIE5NSXMgb24gYWxsIENQVXM6Ci0g Ki8KLXZvaWQgYWNwaV9ubWlfZGlzYWJsZSh2b2lkKQotewotCWlmIChhdG9taWNfcmVhZCgmbm1p X2FjdGl2ZSkgJiYgbm1pX3dhdGNoZG9nID09IE5NSV9JT19BUElDKQotCQlvbl9lYWNoX2NwdShf X2FjcGlfbm1pX2Rpc2FibGUsIE5VTEwsIDAsIDEpOwotfQotCi12b2lkIHNldHVwX2FwaWNfbm1p X3dhdGNoZG9nKHZvaWQgKnVudXNlZCkKLXsKLQlpZiAoX19nZXRfY3B1X3Zhcih3ZF9lbmFibGVk KSkKLQkJcmV0dXJuOwotCi0JLyogY2hlYXAgaGFjayB0byBzdXBwb3J0IHN1c3BlbmQvcmVzdW1l ICovCi0JLyogaWYgY3B1MCBpcyBub3QgYWN0aXZlIG5laXRoZXIgc2hvdWxkIHRoZSBvdGhlciBj cHVzICovCi0JaWYgKChzbXBfcHJvY2Vzc29yX2lkKCkgIT0gMCkgJiYgKGF0b21pY19yZWFkKCZu bWlfYWN0aXZlKSA8PSAwKSkKLQkJcmV0dXJuOwotCi0Jc3dpdGNoIChubWlfd2F0Y2hkb2cpIHsK LQljYXNlIE5NSV9MT0NBTF9BUElDOgotCQlfX2dldF9jcHVfdmFyKHdkX2VuYWJsZWQpID0gMTsg LyogZW5hYmxlIGl0IGJlZm9yZSB0byBhdm9pZCByYWNlIHdpdGggaGFuZGxlciAqLwotCQlpZiAo bGFwaWNfd2F0Y2hkb2dfaW5pdChubWlfaHopIDwgMCkgewotCQkJX19nZXRfY3B1X3Zhcih3ZF9l bmFibGVkKSA9IDA7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJLyogRkFMTCBUSFJPVUdIICovCi0JY2Fz ZSBOTUlfSU9fQVBJQzoKLQkJX19nZXRfY3B1X3Zhcih3ZF9lbmFibGVkKSA9IDE7Ci0JCWF0b21p Y19pbmMoJm5taV9hY3RpdmUpOwotCX0KLX0KLQotdm9pZCBzdG9wX2FwaWNfbm1pX3dhdGNoZG9n KHZvaWQgKnVudXNlZCkKLXsKLQkvKiBvbmx5IHN1cHBvcnQgTE9DQUwgYW5kIElPIEFQSUNzIGZv ciBub3cgKi8KLQlpZiAoKG5taV93YXRjaGRvZyAhPSBOTUlfTE9DQUxfQVBJQykgJiYKLQkgICAg KG5taV93YXRjaGRvZyAhPSBOTUlfSU9fQVBJQykpCi0JICAgIAlyZXR1cm47Ci0JaWYgKF9fZ2V0 X2NwdV92YXIod2RfZW5hYmxlZCkgPT0gMCkKLQkJcmV0dXJuOwotCWlmIChubWlfd2F0Y2hkb2cg PT0gTk1JX0xPQ0FMX0FQSUMpCi0JCWxhcGljX3dhdGNoZG9nX3N0b3AoKTsKLQlfX2dldF9jcHVf dmFyKHdkX2VuYWJsZWQpID0gMDsKLQlhdG9taWNfZGVjKCZubWlfYWN0aXZlKTsKLX0KLQotLyoK LSAqIHRoZSBiZXN0IHdheSB0byBkZXRlY3Qgd2hldGhlciBhIENQVSBoYXMgYSAnaGFyZCBsb2Nr dXAnIHByb2JsZW0KLSAqIGlzIHRvIGNoZWNrIGl0J3MgbG9jYWwgQVBJQyB0aW1lciBJUlEgY291 bnRzLiBJZiB0aGV5IGFyZSBub3QKLSAqIGNoYW5naW5nIHRoZW4gdGhhdCBDUFUgaGFzIHNvbWUg cHJvYmxlbS4KLSAqCi0gKiBhcyB0aGVzZSB3YXRjaGRvZyBOTUkgSVJRcyBhcmUgZ2VuZXJhdGVk IG9uIGV2ZXJ5IENQVSwgd2Ugb25seQotICogaGF2ZSB0byBjaGVjayB0aGUgY3VycmVudCBwcm9j ZXNzb3IuCi0gKgotICogc2luY2UgTk1JcyBkb24ndCBsaXN0ZW4gdG8gX2FueV8gbG9ja3MsIHdl IGhhdmUgdG8gYmUgZXh0cmVtZWx5Ci0gKiBjYXJlZnVsIG5vdCB0byByZWx5IG9uIHVuc2FmZSB2 YXJpYWJsZXMuIFRoZSBwcmludGsgbWlnaHQgbG9jawotICogdXAgdGhvdWdoLCBzbyB3ZSBoYXZl IHRvIGJyZWFrIHVwIGFueSBjb25zb2xlIGxvY2tzIGZpcnN0IC4uLgotICogW3doZW4gdGhlcmUg d2lsbCBiZSBtb3JlIHR0eS1yZWxhdGVkIGxvY2tzLCBicmVhayB0aGVtIHVwCi0gKiAgaGVyZSB0 b28hXQotICovCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLQlsYXN0X2lycV9zdW1zIFtOUl9DUFVT XSwKLQlhbGVydF9jb3VudGVyIFtOUl9DUFVTXTsKLQotdm9pZCB0b3VjaF9ubWlfd2F0Y2hkb2co dm9pZCkKLXsKLQlpZiAobm1pX3dhdGNoZG9nID4gMCkgewotCQl1bnNpZ25lZCBjcHU7Ci0KLQkJ LyoKLQkJICogSnVzdCByZXNldCB0aGUgYWxlcnQgY291bnRlcnMsIChvdGhlciBDUFVzIG1pZ2h0 IGJlCi0JCSAqIHNwaW5uaW5nIG9uIGxvY2tzIHdlIGhvbGQpOgotCQkgKi8KLQkJZm9yX2VhY2hf cHJlc2VudF9jcHUoY3B1KSB7Ci0JCQlpZiAoYWxlcnRfY291bnRlcltjcHVdKQotCQkJCWFsZXJ0 X2NvdW50ZXJbY3B1XSA9IDA7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFRpY2tsZSB0aGUgc29mdGxv Y2t1cCBkZXRlY3RvciB0b286Ci0JICovCi0JdG91Y2hfc29mdGxvY2t1cF93YXRjaGRvZygpOwot fQotRVhQT1JUX1NZTUJPTCh0b3VjaF9ubWlfd2F0Y2hkb2cpOwotCi1leHRlcm4gdm9pZCBkaWVf bm1pKHN0cnVjdCBwdF9yZWdzICosIGNvbnN0IGNoYXIgKm1zZyk7Ci0KLW5vdHJhY2UgX19rcHJv YmVzIGludAotbm1pX3dhdGNoZG9nX3RpY2soc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHVuc2lnbmVk IHJlYXNvbikKLXsKLQotCS8qCi0JICogU2luY2UgY3VycmVudF90aHJlYWRfaW5mbygpLT4gaXMg YWx3YXlzIG9uIHRoZSBzdGFjaywgYW5kIHdlCi0JICogYWx3YXlzIHN3aXRjaCB0aGUgc3RhY2sg Tk1JLWF0b21pY2FsbHksIGl0J3Mgc2FmZSB0byB1c2UKLQkgKiBzbXBfcHJvY2Vzc29yX2lkKCku Ci0JICovCi0JdW5zaWduZWQgaW50IHN1bTsKLQlpbnQgdG91Y2hlZCA9IDA7Ci0JaW50IGNwdSA9 IHNtcF9wcm9jZXNzb3JfaWQoKTsKLQlpbnQgcmMgPSAwOwotCi0JLyogY2hlY2sgZm9yIG90aGVy IHVzZXJzIGZpcnN0ICovCi0JaWYgKG5vdGlmeV9kaWUoRElFX05NSSwgIm5taSIsIHJlZ3MsIHJl YXNvbiwgMiwgU0lHSU5UKQotCQkJPT0gTk9USUZZX1NUT1ApIHsKLQkJcmMgPSAxOwotCQl0b3Vj aGVkID0gMTsKLQl9Ci0KLQlpZiAoY3B1X2lzc2V0KGNwdSwgYmFja3RyYWNlX21hc2spKSB7Ci0J CXN0YXRpYyBERUZJTkVfU1BJTkxPQ0sobG9jayk7CS8qIFNlcmlhbGlzZSB0aGUgcHJpbnRrcyAq LwotCi0JCXNwaW5fbG9jaygmbG9jayk7Ci0JCXByaW50aygiTk1JIGJhY2t0cmFjZSBmb3IgY3B1 ICVkXG4iLCBjcHUpOwotCQlkdW1wX3N0YWNrKCk7Ci0JCXNwaW5fdW5sb2NrKCZsb2NrKTsKLQkJ Y3B1X2NsZWFyKGNwdSwgYmFja3RyYWNlX21hc2spOwotCX0KLQotCS8qCi0JICogVGFrZSB0aGUg bG9jYWwgYXBpYyB0aW1lciBhbmQgUElUL0hQRVQgaW50byBhY2NvdW50LiBXZSBkb24ndAotCSAq IGtub3cgd2hpY2ggb25lIGlzIGFjdGl2ZSwgd2hlbiB3ZSBoYXZlIGhpZ2hyZXMvZHludGljayBv bgotCSAqLwotCXN1bSA9IHBlcl9jcHUoaXJxX3N0YXQsIGNwdSkuYXBpY190aW1lcl9pcnFzICsK LQkJcGVyX2NwdShpcnFfc3RhdCwgY3B1KS5pcnEwX2lycXM7Ci0KLQkvKiBpZiB0aGUgbm9uZSBv ZiB0aGUgdGltZXJzIGlzbid0IGZpcmluZywgdGhpcyBjcHUgaXNuJ3QgZG9pbmcgbXVjaCAqLwot CWlmICghdG91Y2hlZCAmJiBsYXN0X2lycV9zdW1zW2NwdV0gPT0gc3VtKSB7Ci0JCS8qCi0JCSAq IEF5aWVlLCBsb29rcyBsaWtlIHRoaXMgQ1BVIGlzIHN0dWNrIC4uLgotCQkgKiB3YWl0IGEgZmV3 IElSUXMgKDUgc2Vjb25kcykgYmVmb3JlIGRvaW5nIHRoZSBvb3BzIC4uLgotCQkgKi8KLQkJYWxl cnRfY291bnRlcltjcHVdKys7Ci0JCWlmIChhbGVydF9jb3VudGVyW2NwdV0gPT0gNSpubWlfaHop Ci0JCQkvKgotCQkJICogZGllX25taSB3aWxsIHJldHVybiBPTkxZIGlmIE5PVElGWV9TVE9QIGhh cHBlbnMuLgotCQkJICovCi0JCQlkaWVfbm1pKHJlZ3MsICJCVUc6IE5NSSBXYXRjaGRvZyBkZXRl Y3RlZCBMT0NLVVAiKTsKLQl9IGVsc2UgewotCQlsYXN0X2lycV9zdW1zW2NwdV0gPSBzdW07Ci0J CWFsZXJ0X2NvdW50ZXJbY3B1XSA9IDA7Ci0JfQotCS8qIHNlZSBpZiB0aGUgbm1pIHdhdGNoZG9n IHdlbnQgb2ZmICovCi0JaWYgKCFfX2dldF9jcHVfdmFyKHdkX2VuYWJsZWQpKQotCQlyZXR1cm4g cmM7Ci0Jc3dpdGNoIChubWlfd2F0Y2hkb2cpIHsKLQljYXNlIE5NSV9MT0NBTF9BUElDOgotCQly YyB8PSBsYXBpY193ZF9ldmVudChubWlfaHopOwotCQlicmVhazsKLQljYXNlIE5NSV9JT19BUElD OgotCQkvKiBkb24ndCBrbm93IGhvdyB0byBhY2N1cmF0ZWx5IGNoZWNrIGZvciB0aGlzLgotCQkg KiBqdXN0IGFzc3VtZSBpdCB3YXMgYSB3YXRjaGRvZyB0aW1lciBpbnRlcnJ1cHQKLQkJICogVGhp cyBtYXRjaGVzIHRoZSBvbGQgYmVoYXZpb3VyLgotCQkgKi8KLQkJcmMgPSAxOwotCQlicmVhazsK LQl9Ci0JcmV0dXJuIHJjOwotfQotCi0jaWZkZWYgQ09ORklHX1NZU0NUTAotCi1zdGF0aWMgaW50 IHVua25vd25fbm1pX3BhbmljX2NhbGxiYWNrKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgY3B1 KQotewotCXVuc2lnbmVkIGNoYXIgcmVhc29uID0gZ2V0X25taV9yZWFzb24oKTsKLQljaGFyIGJ1 Zls2NF07Ci0KLQlzcHJpbnRmKGJ1ZiwgIk5NSSByZWNlaXZlZCBmb3IgdW5rbm93biByZWFzb24g JTAyeFxuIiwgcmVhc29uKTsKLQlkaWVfbm1pKHJlZ3MsIGJ1Zik7Ci0JcmV0dXJuIDA7Ci19Ci0K LS8qCi0gKiBwcm9jIGhhbmRsZXIgZm9yIC9wcm9jL3N5cy9rZXJuZWwvbm1pCi0gKi8KLWludCBw cm9jX25taV9lbmFibGVkKHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsIHN0cnVj dCBmaWxlICpmaWxlLAotCQkJdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5ndGgsIGxv ZmZfdCAqcHBvcykKLXsKLQlpbnQgb2xkX3N0YXRlOwotCi0Jbm1pX3dhdGNoZG9nX2VuYWJsZWQg PSAoYXRvbWljX3JlYWQoJm5taV9hY3RpdmUpID4gMCkgPyAxIDogMDsKLQlvbGRfc3RhdGUgPSBu bWlfd2F0Y2hkb2dfZW5hYmxlZDsKLQlwcm9jX2RvaW50dmVjKHRhYmxlLCB3cml0ZSwgZmlsZSwg YnVmZmVyLCBsZW5ndGgsIHBwb3MpOwotCWlmICghIW9sZF9zdGF0ZSA9PSAhIW5taV93YXRjaGRv Z19lbmFibGVkKQotCQlyZXR1cm4gMDsKLQotCWlmIChhdG9taWNfcmVhZCgmbm1pX2FjdGl2ZSkg PCAwIHx8IG5taV93YXRjaGRvZyA9PSBOTUlfRElTQUJMRUQpIHsKLQkJcHJpbnRrKCBLRVJOX1dB Uk5JTkcgIk5NSSB3YXRjaGRvZyBpcyBwZXJtYW5lbnRseSBkaXNhYmxlZFxuIik7Ci0JCXJldHVy biAtRUlPOwotCX0KLQotCWlmIChubWlfd2F0Y2hkb2cgPT0gTk1JX0RFRkFVTFQpIHsKLQkJaWYg KGxhcGljX3dhdGNoZG9nX29rKCkpCi0JCQlubWlfd2F0Y2hkb2cgPSBOTUlfTE9DQUxfQVBJQzsK LQkJZWxzZQotCQkJbm1pX3dhdGNoZG9nID0gTk1JX0lPX0FQSUM7Ci0JfQotCi0JaWYgKG5taV93 YXRjaGRvZyA9PSBOTUlfTE9DQUxfQVBJQykgewotCQlpZiAobm1pX3dhdGNoZG9nX2VuYWJsZWQp Ci0JCQllbmFibGVfbGFwaWNfbm1pX3dhdGNoZG9nKCk7Ci0JCWVsc2UKLQkJCWRpc2FibGVfbGFw aWNfbm1pX3dhdGNoZG9nKCk7Ci0JfSBlbHNlIHsKLQkJcHJpbnRrKCBLRVJOX1dBUk5JTkcKLQkJ CSJOTUkgd2F0Y2hkb2cgZG9lc24ndCBrbm93IHdoYXQgaGFyZHdhcmUgdG8gdG91Y2hcbiIpOwot CQlyZXR1cm4gLUVJTzsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLSNlbmRpZgotCi1pbnQgZG9fbm1p X2NhbGxiYWNrKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgY3B1KQotewotI2lmZGVmIENPTkZJ R19TWVNDVEwKLQlpZiAodW5rbm93bl9ubWlfcGFuaWMpCi0JCXJldHVybiB1bmtub3duX25taV9w YW5pY19jYWxsYmFjayhyZWdzLCBjcHUpOwotI2VuZGlmCi0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQg X190cmlnZ2VyX2FsbF9jcHVfYmFja3RyYWNlKHZvaWQpCi17Ci0JaW50IGk7Ci0KLQliYWNrdHJh Y2VfbWFzayA9IGNwdV9vbmxpbmVfbWFwOwotCS8qIFdhaXQgZm9yIHVwIHRvIDEwIHNlY29uZHMg Zm9yIGFsbCBDUFVzIHRvIGRvIHRoZSBiYWNrdHJhY2UgKi8KLQlmb3IgKGkgPSAwOyBpIDwgMTAg KiAxMDAwOyBpKyspIHsKLQkJaWYgKGNwdXNfZW1wdHkoYmFja3RyYWNlX21hc2spKQotCQkJYnJl YWs7Ci0JCW1kZWxheSgxKTsKLQl9Ci19Ci0KLUVYUE9SVF9TWU1CT0wobm1pX2FjdGl2ZSk7Ci1F WFBPUlRfU1lNQk9MKG5taV93YXRjaGRvZyk7CgpJbmRleDogYXJjaC94ODYva2VybmVsL25taV82 NC5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PQotLS0gYS94ODYva2VybmVsL25taV82NC5jCU1vbiBNYXkgMTkgMDE6 MzY6NDIgMjAwOAorKysgL2Rldi9udWxsCVdlZCBNYXkgMjEgMTA6MTI6MzAgMjAwOApAQCAtMSw0 ODIgKzAsMCBAQAotLyoKLSAqICBOTUkgd2F0Y2hkb2cgc3VwcG9ydCBvbiBBUElDIHN5c3RlbXMK LSAqCi0gKiAgU3RhcnRlZCBieSBJbmdvIE1vbG5hciA8bWluZ29AcmVkaGF0LmNvbT4KLSAqCi0g KiAgRml4ZXM6Ci0gKiAgTWlrYWVsIFBldHRlcnNzb24JOiBBTUQgSzcgc3VwcG9ydCBmb3IgbG9j YWwgQVBJQyBOTUkgd2F0Y2hkb2cuCi0gKiAgTWlrYWVsIFBldHRlcnNzb24JOiBQb3dlciBNYW5h Z2VtZW50IGZvciBsb2NhbCBBUElDIE5NSSB3YXRjaGRvZy4KLSAqICBQYXZlbCBNYWNoZWsgYW5k Ci0gKiAgTWlrYWVsIFBldHRlcnNzb24JOiBQTSBjb252ZXJ0ZWQgdG8gZHJpdmVyIG1vZGVsLiBE aXNhYmxlL2VuYWJsZSBBUEkuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L25taS5oPgotI2luY2x1 ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51 eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51 eC9zeXNkZXYuaD4KLSNpbmNsdWRlIDxsaW51eC9zeXNjdGwuaD4KLSNpbmNsdWRlIDxsaW51eC9r cHJvYmVzLmg+Ci0jaW5jbHVkZSA8bGludXgvY3B1bWFzay5oPgotI2luY2x1ZGUgPGxpbnV4L2tk ZWJ1Zy5oPgotCi0jaW5jbHVkZSA8YXNtL3NtcC5oPgotI2luY2x1ZGUgPGFzbS9ubWkuaD4KLSNp bmNsdWRlIDxhc20vcHJvdG8uaD4KLSNpbmNsdWRlIDxhc20vbWNlLmg+Ci0KLSNpbmNsdWRlIDxt YWNoX3RyYXBzLmg+Ci0KLWludCB1bmtub3duX25taV9wYW5pYzsKLWludCBubWlfd2F0Y2hkb2df ZW5hYmxlZDsKLWludCBwYW5pY19vbl91bnJlY292ZXJlZF9ubWk7Ci0KLXN0YXRpYyBjcHVtYXNr X3QgYmFja3RyYWNlX21hc2sgPSBDUFVfTUFTS19OT05FOwotCi0vKiBubWlfYWN0aXZlOgotICog PjA6IHRoZSBsYXBpYyBOTUkgd2F0Y2hkb2cgaXMgYWN0aXZlLCBidXQgY2FuIGJlIGRpc2FibGVk Ci0gKiA8MDogdGhlIGxhcGljIE5NSSB3YXRjaGRvZyBoYXMgbm90IGJlZW4gc2V0IHVwLCBhbmQg Y2Fubm90Ci0gKiAgICAgYmUgZW5hYmxlZAotICogIDA6IHRoZSBsYXBpYyBOTUkgd2F0Y2hkb2cg aXMgZGlzYWJsZWQsIGJ1dCBjYW4gYmUgZW5hYmxlZAotICovCi1hdG9taWNfdCBubWlfYWN0aXZl ID0gQVRPTUlDX0lOSVQoMCk7CQkvKiBvcHJvZmlsZSB1c2VzIHRoaXMgKi8KLXN0YXRpYyBpbnQg cGFuaWNfb25fdGltZW91dDsKLQotdW5zaWduZWQgaW50IG5taV93YXRjaGRvZyA9IE5NSV9ERUZB VUxUOwotc3RhdGljIHVuc2lnbmVkIGludCBubWlfaHogPSBIWjsKLQotc3RhdGljIERFRklORV9Q RVJfQ1BVKHNob3J0LCB3ZF9lbmFibGVkKTsKLQotLyogUnVuIGFmdGVyIGNvbW1hbmQgbGluZSBh bmQgY3B1X2luaXQgaW5pdCwgYnV0IGJlZm9yZSBhbGwgb3RoZXIgY2hlY2tzICovCi12b2lkIG5t aV93YXRjaGRvZ19kZWZhdWx0KHZvaWQpCi17Ci0JaWYgKG5taV93YXRjaGRvZyAhPSBOTUlfREVG QVVMVCkKLQkJcmV0dXJuOwotCW5taV93YXRjaGRvZyA9IE5NSV9OT05FOwotfQotCi1zdGF0aWMg aW50IGVuZGZsYWcgX19pbml0ZGF0YSA9IDA7Ci0KLSNpZmRlZiBDT05GSUdfU01QCi0vKiBUaGUg cGVyZm9ybWFuY2UgY291bnRlcnMgdXNlZCBieSBOTUlfTE9DQUxfQVBJQyBkb24ndCB0cmlnZ2Vy IHdoZW4KLSAqIHRoZSBDUFUgaXMgaWRsZS4gVG8gbWFrZSBzdXJlIHRoZSBOTUkgd2F0Y2hkb2cg cmVhbGx5IHRpY2tzIG9uIGFsbAotICogQ1BVcyBkdXJpbmcgdGhlIHRlc3QgbWFrZSB0aGVtIGJ1 c3kuCi0gKi8KLXN0YXRpYyBfX2luaXQgdm9pZCBubWlfY3B1X2J1c3kodm9pZCAqZGF0YSkKLXsK LQlsb2NhbF9pcnFfZW5hYmxlX2luX2hhcmRpcnEoKTsKLQkvKiBJbnRlbnRpb25hbGx5IGRvbid0 IHVzZSBjcHVfcmVsYXggaGVyZS4gVGhpcyBpcwotCSAgIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBw ZXJmb3JtYW5jZSBjb3VudGVyIHJlYWxseSB0aWNrcywKLQkgICBldmVuIGlmIHRoZXJlIGlzIGEg c2ltdWxhdG9yIG9yIHNpbWlsYXIgdGhhdCBjYXRjaGVzIHRoZQotCSAgIHBhdXNlIGluc3RydWN0 aW9uLiBPbiBhIHJlYWwgSFQgbWFjaGluZSB0aGlzIGlzIGZpbmUgYmVjYXVzZQotCSAgIGFsbCBv dGhlciBDUFVzIGFyZSBidXN5IHdpdGggInVzZWxlc3MiIGRlbGF5IGxvb3BzIGFuZCBkb24ndAot CSAgIGNhcmUgaWYgdGhleSBnZXQgc29tZXdoYXQgbGVzcyBjeWNsZXMuICovCi0Jd2hpbGUgKGVu ZGZsYWcgPT0gMCkKLQkJbWIoKTsKLX0KLSNlbmRpZgotCi1pbnQgX19pbml0IGNoZWNrX25taV93 YXRjaGRvZyh2b2lkKQotewotCWludCAqcHJldl9ubWlfY291bnQ7Ci0JaW50IGNwdTsKLQotCWlm ICgobm1pX3dhdGNoZG9nID09IE5NSV9OT05FKSB8fCAobm1pX3dhdGNoZG9nID09IE5NSV9ESVNB QkxFRCkpCi0JCXJldHVybiAwOwotCi0JaWYgKCFhdG9taWNfcmVhZCgmbm1pX2FjdGl2ZSkpCi0J CXJldHVybiAwOwotCi0JcHJldl9ubWlfY291bnQgPSBrbWFsbG9jKE5SX0NQVVMgKiBzaXplb2Yo aW50KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwcmV2X25taV9jb3VudCkKLQkJcmV0dXJuIC0xOwot Ci0JcHJpbnRrKEtFUk5fSU5GTyAiVGVzdGluZyBOTUkgd2F0Y2hkb2cgLi4uICIpOwotCi0jaWZk ZWYgQ09ORklHX1NNUAotCWlmIChubWlfd2F0Y2hkb2cgPT0gTk1JX0xPQ0FMX0FQSUMpCi0JCXNt cF9jYWxsX2Z1bmN0aW9uKG5taV9jcHVfYnVzeSwgKHZvaWQgKikmZW5kZmxhZywgMCwgMCk7Ci0j ZW5kaWYKLQotCWZvciAoY3B1ID0gMDsgY3B1IDwgTlJfQ1BVUzsgY3B1KyspCi0JCXByZXZfbm1p X2NvdW50W2NwdV0gPSBjcHVfcGRhKGNwdSktPl9fbm1pX2NvdW50OwotCWxvY2FsX2lycV9lbmFi bGUoKTsKLQltZGVsYXkoKDIwKjEwMDApL25taV9oeik7IC8vIHdhaXQgMjAgdGlja3MKLQotCWZv cl9lYWNoX29ubGluZV9jcHUoY3B1KSB7Ci0JCWlmICghcGVyX2NwdSh3ZF9lbmFibGVkLCBjcHUp KQotCQkJY29udGludWU7Ci0JCWlmIChjcHVfcGRhKGNwdSktPl9fbm1pX2NvdW50IC0gcHJldl9u bWlfY291bnRbY3B1XSA8PSA1KSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJXQVJOSU5HOiBD UFUjJWQ6IE5NSSAiCi0JCQkgICAgICAgImFwcGVhcnMgdG8gYmUgc3R1Y2sgKCVkLT4lZCkhXG4i LAotCQkJCWNwdSwKLQkJCQlwcmV2X25taV9jb3VudFtjcHVdLAotCQkJCWNwdV9wZGEoY3B1KS0+ X19ubWlfY291bnQpOwotCQkJcGVyX2NwdSh3ZF9lbmFibGVkLCBjcHUpID0gMDsKLQkJCWF0b21p Y19kZWMoJm5taV9hY3RpdmUpOwotCQl9Ci0JfQotCWVuZGZsYWcgPSAxOwotCWlmICghYXRvbWlj X3JlYWQoJm5taV9hY3RpdmUpKSB7Ci0JCWtmcmVlKHByZXZfbm1pX2NvdW50KTsKLQkJYXRvbWlj X3NldCgmbm1pX2FjdGl2ZSwgLTEpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXByaW50aygiT0suXG4i KTsKLQotCS8qIG5vdyB0aGF0IHdlIGtub3cgaXQgd29ya3Mgd2UgY2FuIHJlZHVjZSBOTUkgZnJl cXVlbmN5IHRvCi0JICAgc29tZXRoaW5nIG1vcmUgcmVhc29uYWJsZTsgbWFrZXMgYSBkaWZmZXJl bmNlIGluIHNvbWUgY29uZmlncyAqLwotCWlmIChubWlfd2F0Y2hkb2cgPT0gTk1JX0xPQ0FMX0FQ SUMpCi0JCW5taV9oeiA9IGxhcGljX2FkanVzdF9ubWlfaHooMSk7Ci0KLQlrZnJlZShwcmV2X25t aV9jb3VudCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IHNldHVwX25taV93 YXRjaGRvZyhjaGFyICpzdHIpCi17Ci0JaW50IG5taTsKLQotCWlmICghc3RybmNtcChzdHIsInBh bmljIiw1KSkgewotCQlwYW5pY19vbl90aW1lb3V0ID0gMTsKLQkJc3RyID0gc3RyY2hyKHN0ciwg JywnKTsKLQkJaWYgKCFzdHIpCi0JCQlyZXR1cm4gMTsKLQkJKytzdHI7Ci0JfQotCi0JZ2V0X29w dGlvbigmc3RyLCAmbm1pKTsKLQotCWlmICgobm1pID49IE5NSV9JTlZBTElEKSB8fCAobm1pIDwg Tk1JX05PTkUpKQotCQlyZXR1cm4gMDsKLQotCW5taV93YXRjaGRvZyA9IG5taTsKLQlyZXR1cm4g MTsKLX0KLQotX19zZXR1cCgibm1pX3dhdGNoZG9nPSIsIHNldHVwX25taV93YXRjaGRvZyk7Ci0K LSNpZmRlZiBDT05GSUdfUE0KLQotc3RhdGljIGludCBubWlfcG1fYWN0aXZlOyAvKiBubWlfYWN0 aXZlIGJlZm9yZSBzdXNwZW5kICovCi0KLXN0YXRpYyBpbnQgbGFwaWNfbm1pX3N1c3BlbmQoc3Ry dWN0IHN5c19kZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQotewotCS8qIG9ubHkgQ1BV MCBnb2VzIGhlcmUsIG90aGVyIENQVXMgc2hvdWxkIGJlIG9mZmxpbmUgKi8KLQlubWlfcG1fYWN0 aXZlID0gYXRvbWljX3JlYWQoJm5taV9hY3RpdmUpOwotCXN0b3BfYXBpY19ubWlfd2F0Y2hkb2co TlVMTCk7Ci0JQlVHX09OKGF0b21pY19yZWFkKCZubWlfYWN0aXZlKSAhPSAwKTsKLQlyZXR1cm4g MDsKLX0KLQotc3RhdGljIGludCBsYXBpY19ubWlfcmVzdW1lKHN0cnVjdCBzeXNfZGV2aWNlICpk ZXYpCi17Ci0JLyogb25seSBDUFUwIGdvZXMgaGVyZSwgb3RoZXIgQ1BVcyBzaG91bGQgYmUgb2Zm bGluZSAqLwotCWlmIChubWlfcG1fYWN0aXZlID4gMCkgewotCQlzZXR1cF9hcGljX25taV93YXRj aGRvZyhOVUxMKTsKLQkJdG91Y2hfbm1pX3dhdGNoZG9nKCk7Ci0JfQotCXJldHVybiAwOwotfQot Ci1zdGF0aWMgc3RydWN0IHN5c2Rldl9jbGFzcyBubWlfc3lzY2xhc3MgPSB7Ci0JLm5hbWUJCT0g ImxhcGljX25taSIsCi0JLnJlc3VtZQkJPSBsYXBpY19ubWlfcmVzdW1lLAotCS5zdXNwZW5kCT0g bGFwaWNfbm1pX3N1c3BlbmQsCi19OwotCi1zdGF0aWMgc3RydWN0IHN5c19kZXZpY2UgZGV2aWNl X2xhcGljX25taSA9IHsKLQkuaWQJPSAwLAotCS5jbHMJPSAmbm1pX3N5c2NsYXNzLAotfTsKLQot c3RhdGljIGludCBfX2luaXQgaW5pdF9sYXBpY19ubWlfc3lzZnModm9pZCkKLXsKLQlpbnQgZXJy b3I7Ci0KLQkvKiBzaG91bGQgcmVhbGx5IGJlIGEgQlVHX09OIGJ1dCBiL2MgdGhpcyBpcyBhbgot CSAqIGluaXQgY2FsbCwgaXQganVzdCBkb2Vzbid0IHdvcmsuICAtZGN6Ci0JICovCi0JaWYgKG5t aV93YXRjaGRvZyAhPSBOTUlfTE9DQUxfQVBJQykKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoYXRvbWlj X3JlYWQoJm5taV9hY3RpdmUpIDwgMCkKLQkJcmV0dXJuIDA7Ci0KLQllcnJvciA9IHN5c2Rldl9j bGFzc19yZWdpc3Rlcigmbm1pX3N5c2NsYXNzKTsKLQlpZiAoIWVycm9yKQotCQllcnJvciA9IHN5 c2Rldl9yZWdpc3RlcigmZGV2aWNlX2xhcGljX25taSk7Ci0JcmV0dXJuIGVycm9yOwotfQotLyog bXVzdCBjb21lIGFmdGVyIHRoZSBsb2NhbCBBUElDJ3MgZGV2aWNlX2luaXRjYWxsKCkgKi8KLWxh dGVfaW5pdGNhbGwoaW5pdF9sYXBpY19ubWlfc3lzZnMpOwotCi0jZW5kaWYJLyogQ09ORklHX1BN ICovCi0KLXN0YXRpYyB2b2lkIF9fYWNwaV9ubWlfZW5hYmxlKHZvaWQgKl9fdW51c2VkKQotewot CWFwaWNfd3JpdGUoQVBJQ19MVlQwLCBBUElDX0RNX05NSSk7Ci19Ci0KLS8qCi0gKiBFbmFibGUg dGltZXIgYmFzZWQgTk1JcyBvbiBhbGwgQ1BVczoKLSAqLwotdm9pZCBhY3BpX25taV9lbmFibGUo dm9pZCkKLXsKLQlpZiAoYXRvbWljX3JlYWQoJm5taV9hY3RpdmUpICYmIG5taV93YXRjaGRvZyA9 PSBOTUlfSU9fQVBJQykKLQkJb25fZWFjaF9jcHUoX19hY3BpX25taV9lbmFibGUsIE5VTEwsIDAs IDEpOwotfQotCi1zdGF0aWMgdm9pZCBfX2FjcGlfbm1pX2Rpc2FibGUodm9pZCAqX191bnVzZWQp Ci17Ci0JYXBpY193cml0ZShBUElDX0xWVDAsIEFQSUNfRE1fTk1JIHwgQVBJQ19MVlRfTUFTS0VE KTsKLX0KLQotLyoKLSAqIERpc2FibGUgdGltZXIgYmFzZWQgTk1JcyBvbiBhbGwgQ1BVczoKLSAq Lwotdm9pZCBhY3BpX25taV9kaXNhYmxlKHZvaWQpCi17Ci0JaWYgKGF0b21pY19yZWFkKCZubWlf YWN0aXZlKSAmJiBubWlfd2F0Y2hkb2cgPT0gTk1JX0lPX0FQSUMpCi0JCW9uX2VhY2hfY3B1KF9f YWNwaV9ubWlfZGlzYWJsZSwgTlVMTCwgMCwgMSk7Ci19Ci0KLXZvaWQgc2V0dXBfYXBpY19ubWlf d2F0Y2hkb2codm9pZCAqdW51c2VkKQotewotCWlmIChfX2dldF9jcHVfdmFyKHdkX2VuYWJsZWQp KQotCQlyZXR1cm47Ci0KLQkvKiBjaGVhcCBoYWNrIHRvIHN1cHBvcnQgc3VzcGVuZC9yZXN1bWUg Ki8KLQkvKiBpZiBjcHUwIGlzIG5vdCBhY3RpdmUgbmVpdGhlciBzaG91bGQgdGhlIG90aGVyIGNw dXMgKi8KLQlpZiAoKHNtcF9wcm9jZXNzb3JfaWQoKSAhPSAwKSAmJiAoYXRvbWljX3JlYWQoJm5t aV9hY3RpdmUpIDw9IDApKQotCQlyZXR1cm47Ci0KLQlzd2l0Y2ggKG5taV93YXRjaGRvZykgewot CWNhc2UgTk1JX0xPQ0FMX0FQSUM6Ci0JCV9fZ2V0X2NwdV92YXIod2RfZW5hYmxlZCkgPSAxOwot CQlpZiAobGFwaWNfd2F0Y2hkb2dfaW5pdChubWlfaHopIDwgMCkgewotCQkJX19nZXRfY3B1X3Zh cih3ZF9lbmFibGVkKSA9IDA7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJLyogRkFMTCBUSFJPVUdIICov Ci0JY2FzZSBOTUlfSU9fQVBJQzoKLQkJX19nZXRfY3B1X3Zhcih3ZF9lbmFibGVkKSA9IDE7Ci0J CWF0b21pY19pbmMoJm5taV9hY3RpdmUpOwotCX0KLX0KLQotdm9pZCBzdG9wX2FwaWNfbm1pX3dh dGNoZG9nKHZvaWQgKnVudXNlZCkKLXsKLQkvKiBvbmx5IHN1cHBvcnQgTE9DQUwgYW5kIElPIEFQ SUNzIGZvciBub3cgKi8KLQlpZiAoKG5taV93YXRjaGRvZyAhPSBOTUlfTE9DQUxfQVBJQykgJiYK LQkgICAgKG5taV93YXRjaGRvZyAhPSBOTUlfSU9fQVBJQykpCi0JICAgIAlyZXR1cm47Ci0JaWYg KF9fZ2V0X2NwdV92YXIod2RfZW5hYmxlZCkgPT0gMCkKLQkJcmV0dXJuOwotCWlmIChubWlfd2F0 Y2hkb2cgPT0gTk1JX0xPQ0FMX0FQSUMpCi0JCWxhcGljX3dhdGNoZG9nX3N0b3AoKTsKLQlfX2dl dF9jcHVfdmFyKHdkX2VuYWJsZWQpID0gMDsKLQlhdG9taWNfZGVjKCZubWlfYWN0aXZlKTsKLX0K LQotLyoKLSAqIHRoZSBiZXN0IHdheSB0byBkZXRlY3Qgd2hldGhlciBhIENQVSBoYXMgYSAnaGFy ZCBsb2NrdXAnIHByb2JsZW0KLSAqIGlzIHRvIGNoZWNrIGl0J3MgbG9jYWwgQVBJQyB0aW1lciBJ UlEgY291bnRzLiBJZiB0aGV5IGFyZSBub3QKLSAqIGNoYW5naW5nIHRoZW4gdGhhdCBDUFUgaGFz IHNvbWUgcHJvYmxlbS4KLSAqCi0gKiBhcyB0aGVzZSB3YXRjaGRvZyBOTUkgSVJRcyBhcmUgZ2Vu ZXJhdGVkIG9uIGV2ZXJ5IENQVSwgd2Ugb25seQotICogaGF2ZSB0byBjaGVjayB0aGUgY3VycmVu dCBwcm9jZXNzb3IuCi0gKi8KLQotc3RhdGljIERFRklORV9QRVJfQ1BVKHVuc2lnbmVkLCBsYXN0 X2lycV9zdW0pOwotc3RhdGljIERFRklORV9QRVJfQ1BVKGxvY2FsX3QsIGFsZXJ0X2NvdW50ZXIp Owotc3RhdGljIERFRklORV9QRVJfQ1BVKGludCwgbm1pX3RvdWNoKTsKLQotdm9pZCB0b3VjaF9u bWlfd2F0Y2hkb2codm9pZCkKLXsKLQlpZiAobm1pX3dhdGNoZG9nID4gMCkgewotCQl1bnNpZ25l ZCBjcHU7Ci0KLQkJLyoKLSAJCSAqIFRlbGwgb3RoZXIgQ1BVcyB0byByZXNldCB0aGVpciBhbGVy dCBjb3VudGVycy4gV2UgY2Fubm90Ci0JCSAqIGRvIGl0IG91cnNlbHZlcyBiZWNhdXNlIHRoZSBh bGVydCBjb3VudCBpbmNyZWFzZSBpcyBub3QKLQkJICogYXRvbWljLgotCQkgKi8KLQkJZm9yX2Vh Y2hfcHJlc2VudF9jcHUoY3B1KSB7Ci0JCQlpZiAocGVyX2NwdShubWlfdG91Y2gsIGNwdSkgIT0g MSkKLQkJCQlwZXJfY3B1KG5taV90b3VjaCwgY3B1KSA9IDE7Ci0JCX0KLQl9Ci0KLQl0b3VjaF9z b2Z0bG9ja3VwX3dhdGNoZG9nKCk7Ci19Ci1FWFBPUlRfU1lNQk9MKHRvdWNoX25taV93YXRjaGRv Zyk7Ci0KLW5vdHJhY2UgX19rcHJvYmVzIGludAotbm1pX3dhdGNoZG9nX3RpY2soc3RydWN0IHB0 X3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIHJlYXNvbikKLXsKLQlpbnQgc3VtOwotCWludCB0b3VjaGVk ID0gMDsKLQlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwotCWludCByYyA9IDA7Ci0KLQkv KiBjaGVjayBmb3Igb3RoZXIgdXNlcnMgZmlyc3QgKi8KLQlpZiAobm90aWZ5X2RpZShESUVfTk1J LCAibm1pIiwgcmVncywgcmVhc29uLCAyLCBTSUdJTlQpCi0JCQk9PSBOT1RJRllfU1RPUCkgewot CQlyYyA9IDE7Ci0JCXRvdWNoZWQgPSAxOwotCX0KLQotCXN1bSA9IHJlYWRfcGRhKGFwaWNfdGlt ZXJfaXJxcykgKyByZWFkX3BkYShpcnEwX2lycXMpOwotCWlmIChfX2dldF9jcHVfdmFyKG5taV90 b3VjaCkpIHsKLQkJX19nZXRfY3B1X3ZhcihubWlfdG91Y2gpID0gMDsKLQkJdG91Y2hlZCA9IDE7 Ci0JfQotCi0JaWYgKGNwdV9pc3NldChjcHUsIGJhY2t0cmFjZV9tYXNrKSkgewotCQlzdGF0aWMg REVGSU5FX1NQSU5MT0NLKGxvY2spOwkvKiBTZXJpYWxpc2UgdGhlIHByaW50a3MgKi8KLQotCQlz cGluX2xvY2soJmxvY2spOwotCQlwcmludGsoIk5NSSBiYWNrdHJhY2UgZm9yIGNwdSAlZFxuIiwg Y3B1KTsKLQkJZHVtcF9zdGFjaygpOwotCQlzcGluX3VubG9jaygmbG9jayk7Ci0JCWNwdV9jbGVh cihjcHUsIGJhY2t0cmFjZV9tYXNrKTsKLQl9Ci0KLSNpZmRlZiBDT05GSUdfWDg2X01DRQotCS8q IENvdWxkIGNoZWNrIG9vcHNfaW5fcHJvZ3Jlc3MgaGVyZSB0b28sIGJ1dCBpdCdzIHNhZmVyCi0J ICAgbm90IHRvbyAqLwotCWlmIChhdG9taWNfcmVhZCgmbWNlX2VudHJ5KSA+IDApCi0JCXRvdWNo ZWQgPSAxOwotI2VuZGlmCi0JLyogaWYgdGhlIGFwaWMgdGltZXIgaXNuJ3QgZmlyaW5nLCB0aGlz IGNwdSBpc24ndCBkb2luZyBtdWNoICovCi0JaWYgKCF0b3VjaGVkICYmIF9fZ2V0X2NwdV92YXIo bGFzdF9pcnFfc3VtKSA9PSBzdW0pIHsKLQkJLyoKLQkJICogQXlpZWUsIGxvb2tzIGxpa2UgdGhp cyBDUFUgaXMgc3R1Y2sgLi4uCi0JCSAqIHdhaXQgYSBmZXcgSVJRcyAoNSBzZWNvbmRzKSBiZWZv cmUgZG9pbmcgdGhlIG9vcHMgLi4uCi0JCSAqLwotCQlsb2NhbF9pbmMoJl9fZ2V0X2NwdV92YXIo YWxlcnRfY291bnRlcikpOwotCQlpZiAobG9jYWxfcmVhZCgmX19nZXRfY3B1X3ZhcihhbGVydF9j b3VudGVyKSkgPT0gNSpubWlfaHopCi0JCQlkaWVfbm1pKCJOTUkgV2F0Y2hkb2cgZGV0ZWN0ZWQg TE9DS1VQIG9uIENQVSAlZFxuIiwgcmVncywKLQkJCQlwYW5pY19vbl90aW1lb3V0KTsKLQl9IGVs c2UgewotCQlfX2dldF9jcHVfdmFyKGxhc3RfaXJxX3N1bSkgPSBzdW07Ci0JCWxvY2FsX3NldCgm X19nZXRfY3B1X3ZhcihhbGVydF9jb3VudGVyKSwgMCk7Ci0JfQotCi0JLyogc2VlIGlmIHRoZSBu bWkgd2F0Y2hkb2cgd2VudCBvZmYgKi8KLQlpZiAoIV9fZ2V0X2NwdV92YXIod2RfZW5hYmxlZCkp Ci0JCXJldHVybiByYzsKLQlzd2l0Y2ggKG5taV93YXRjaGRvZykgewotCWNhc2UgTk1JX0xPQ0FM X0FQSUM6Ci0JCXJjIHw9IGxhcGljX3dkX2V2ZW50KG5taV9oeik7Ci0JCWJyZWFrOwotCWNhc2Ug Tk1JX0lPX0FQSUM6Ci0JCS8qIGRvbid0IGtub3cgaG93IHRvIGFjY3VyYXRlbHkgY2hlY2sgZm9y IHRoaXMuCi0JCSAqIGp1c3QgYXNzdW1lIGl0IHdhcyBhIHdhdGNoZG9nIHRpbWVyIGludGVycnVw dAotCQkgKiBUaGlzIG1hdGNoZXMgdGhlIG9sZCBiZWhhdmlvdXIuCi0JCSAqLwotCQlyYyA9IDE7 Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpZ25vcmVf bm1pczsKLQotYXNtbGlua2FnZSBub3RyYWNlIF9fa3Byb2JlcyB2b2lkCi1kb19ubWkoc3RydWN0 IHB0X3JlZ3MgKnJlZ3MsIGxvbmcgZXJyb3JfY29kZSkKLXsKLQlubWlfZW50ZXIoKTsKLQlhZGRf cGRhKF9fbm1pX2NvdW50LDEpOwotCWlmICghaWdub3JlX25taXMpCi0JCWRlZmF1bHRfZG9fbm1p KHJlZ3MpOwotCW5taV9leGl0KCk7Ci19Ci0KLXZvaWQgc3RvcF9ubWkodm9pZCkKLXsKLQlhY3Bp X25taV9kaXNhYmxlKCk7Ci0JaWdub3JlX25taXMrKzsKLX0KLQotdm9pZCByZXN0YXJ0X25taSh2 b2lkKQotewotCWlnbm9yZV9ubWlzLS07Ci0JYWNwaV9ubWlfZW5hYmxlKCk7Ci19Ci0KLSNpZmRl ZiBDT05GSUdfU1lTQ1RMCi0KLXN0YXRpYyBpbnQgdW5rbm93bl9ubWlfcGFuaWNfY2FsbGJhY2so c3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGludCBjcHUpCi17Ci0JdW5zaWduZWQgY2hhciByZWFzb24g PSBnZXRfbm1pX3JlYXNvbigpOwotCWNoYXIgYnVmWzY0XTsKLQotCXNwcmludGYoYnVmLCAiTk1J IHJlY2VpdmVkIGZvciB1bmtub3duIHJlYXNvbiAlMDJ4XG4iLCByZWFzb24pOwotCWRpZV9ubWko YnVmLCByZWdzLCAxKTsJLyogQWx3YXlzIHBhbmljIGhlcmUgKi8KLQlyZXR1cm4gMDsKLX0KLQot LyoKLSAqIHByb2MgaGFuZGxlciBmb3IgL3Byb2Mvc3lzL2tlcm5lbC9ubWkKLSAqLwotaW50IHBy b2Nfbm1pX2VuYWJsZWQoc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwgc3RydWN0 IGZpbGUgKmZpbGUsCi0JCQl2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbmd0aCwgbG9m Zl90ICpwcG9zKQotewotCWludCBvbGRfc3RhdGU7Ci0KLQlubWlfd2F0Y2hkb2dfZW5hYmxlZCA9 IChhdG9taWNfcmVhZCgmbm1pX2FjdGl2ZSkgPiAwKSA/IDEgOiAwOwotCW9sZF9zdGF0ZSA9IG5t aV93YXRjaGRvZ19lbmFibGVkOwotCXByb2NfZG9pbnR2ZWModGFibGUsIHdyaXRlLCBmaWxlLCBi dWZmZXIsIGxlbmd0aCwgcHBvcyk7Ci0JaWYgKCEhb2xkX3N0YXRlID09ICEhbm1pX3dhdGNoZG9n X2VuYWJsZWQpCi0JCXJldHVybiAwOwotCi0JaWYgKGF0b21pY19yZWFkKCZubWlfYWN0aXZlKSA8 IDAgfHwgbm1pX3dhdGNoZG9nID09IE5NSV9ESVNBQkxFRCkgewotCQlwcmludGsoIEtFUk5fV0FS TklORyAiTk1JIHdhdGNoZG9nIGlzIHBlcm1hbmVudGx5IGRpc2FibGVkXG4iKTsKLQkJcmV0dXJu IC1FSU87Ci0JfQotCi0JLyogaWYgbm1pX3dhdGNoZG9nIGlzIG5vdCBzZXQgeWV0LCB0aGVuIHNl dCBpdCAqLwotCW5taV93YXRjaGRvZ19kZWZhdWx0KCk7Ci0KLQlpZiAobm1pX3dhdGNoZG9nID09 IE5NSV9MT0NBTF9BUElDKSB7Ci0JCWlmIChubWlfd2F0Y2hkb2dfZW5hYmxlZCkKLQkJCWVuYWJs ZV9sYXBpY19ubWlfd2F0Y2hkb2coKTsKLQkJZWxzZQotCQkJZGlzYWJsZV9sYXBpY19ubWlfd2F0 Y2hkb2coKTsKLQl9IGVsc2UgewotCQlwcmludGsoIEtFUk5fV0FSTklORwotCQkJIk5NSSB3YXRj aGRvZyBkb2Vzbid0IGtub3cgd2hhdCBoYXJkd2FyZSB0byB0b3VjaFxuIik7Ci0JCXJldHVybiAt RUlPOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotI2VuZGlmCi0KLWludCBkb19ubWlfY2FsbGJhY2so c3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGludCBjcHUpCi17Ci0jaWZkZWYgQ09ORklHX1NZU0NUTAot CWlmICh1bmtub3duX25taV9wYW5pYykKLQkJcmV0dXJuIHVua25vd25fbm1pX3BhbmljX2NhbGxi YWNrKHJlZ3MsIGNwdSk7Ci0jZW5kaWYKLQlyZXR1cm4gMDsKLX0KLQotdm9pZCBfX3RyaWdnZXJf YWxsX2NwdV9iYWNrdHJhY2Uodm9pZCkKLXsKLQlpbnQgaTsKLQotCWJhY2t0cmFjZV9tYXNrID0g Y3B1X29ubGluZV9tYXA7Ci0JLyogV2FpdCBmb3IgdXAgdG8gMTAgc2Vjb25kcyBmb3IgYWxsIENQ VXMgdG8gZG8gdGhlIGJhY2t0cmFjZSAqLwotCWZvciAoaSA9IDA7IGkgPCAxMCAqIDEwMDA7IGkr KykgewotCQlpZiAoY3B1c19lbXB0eShiYWNrdHJhY2VfbWFzaykpCi0JCQlicmVhazsKLQkJbWRl bGF5KDEpOwotCX0KLX0KLQotRVhQT1JUX1NZTUJPTChubWlfYWN0aXZlKTsKLUVYUE9SVF9TWU1C T0wobm1pX3dhdGNoZG9nKTsK ------=_Part_6512_7971505.1211355672109--