From mboxrd@z Thu Jan 1 00:00:00 1970 From: Sameer Goel Subject: [RFC v2 6/7] Add verbatim copy of arm-smmu-v3.c from Linux Date: Wed, 20 Sep 2017 18:37:09 -0600 Message-ID: <1505954230-18892-7-git-send-email-sgoel@codeaurora.org> References: <1505954230-18892-1-git-send-email-sgoel@codeaurora.org> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail6.bemta6.messagelabs.com ([193.109.254.103]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dupV2-0000Rd-09 for xen-devel@lists.xenproject.org; Thu, 21 Sep 2017 00:37:52 +0000 In-Reply-To: <1505954230-18892-1-git-send-email-sgoel@codeaurora.org> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" To: xen-devel@lists.xenproject.org, julien.grall@arm.com, mjaggi@caviumnetworks.com Cc: sstabellini@kernel.org, wei.liu2@citrix.com, george.dunlap@eu.citrix.com, Andrew.Cooper3@citrix.com, jbeulich@suse.com, Sameer Goel , Ian.Jackson@citrix.com, nd@arm.com, robin.murphy@arm.com, shankerd@codeaurora.org List-Id: xen-devel@lists.xenproject.org QmFzZWQgb24gY29tbWl0IGJkZjk1OTIzMDg2ZmIzNTljY2I0NGM4MTU3MjRjM2FjZTE2MTFjOTAK ClRoaXMgaXMgYSB2ZXJiYXRpbSBzbmFwc2hvdCBvZiBhcm0tc21tdS12My5jIGZyb20gTGludXgg a2VybmVsIHNvdXJjZQpjb2RlLgoKTm8gWGVuIGNvZGUgaGFzIGJlZW4gYWRkZWQgYW5kIHRoZSBm aWxlIGlzIG5vdCBidWlsdC4KClNpZ25lZC1vZmYtYnk6IFNhbWVlciBHb2VsIDxzZ29lbEBjb2Rl YXVyb3JhLm9yZz4KLS0tCiB4ZW4vZHJpdmVycy9wYXNzdGhyb3VnaC9hcm0vc21tdS12My5jIHwg Mjc5MSArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKIDEgZmlsZSBjaGFuZ2VkLCAy NzkxIGluc2VydGlvbnMoKykKIGNyZWF0ZSBtb2RlIDEwMDY0NCB4ZW4vZHJpdmVycy9wYXNzdGhy b3VnaC9hcm0vc21tdS12My5jCgpkaWZmIC0tZ2l0IGEveGVuL2RyaXZlcnMvcGFzc3Rocm91Z2gv YXJtL3NtbXUtdjMuYyBiL3hlbi9kcml2ZXJzL3Bhc3N0aHJvdWdoL2FybS9zbW11LXYzLmMKbmV3 IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzgwOTY5YQotLS0gL2Rldi9udWxsCisr KyBiL3hlbi9kcml2ZXJzL3Bhc3N0aHJvdWdoL2FybS9zbW11LXYzLmMKQEAgLTAsMCArMSwyNzkx IEBACisvKgorICogSU9NTVUgQVBJIGZvciBBUk0gYXJjaGl0ZWN0ZWQgU01NVXYzIGltcGxlbWVu dGF0aW9ucy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiBy ZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRo ZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBi eSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBk aXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJ VEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YK KyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4g IFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMu CisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVy YWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBz ZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICoKKyAqIENvcHlyaWdodCAoQykg MjAxNSBBUk0gTGltaXRlZAorICoKKyAqIEF1dGhvcjogV2lsbCBEZWFjb24gPHdpbGwuZGVhY29u QGFybS5jb20+CisgKgorICogVGhpcyBkcml2ZXIgaXMgcG93ZXJlZCBieSBiYWQgY29mZmVlIGFu ZCBib21iYXkgbWl4LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CisjaW5jbHVkZSA8 bGludXgvYWNwaV9pb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxs aW51eC9kbWEtaW9tbXUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51 eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb21tdS5oPgorI2luY2x1ZGUgPGxpbnV4 L2lvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21z aS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5o PgorI2luY2x1ZGUgPGxpbnV4L29mX2lvbW11Lmg+CisjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZv cm0uaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9k ZXZpY2UuaD4KKworI2luY2x1ZGUgPGxpbnV4L2FtYmEvYnVzLmg+CisKKyNpbmNsdWRlICJpby1w Z3RhYmxlLmgiCisKKy8qIE1NSU8gcmVnaXN0ZXJzICovCisjZGVmaW5lIEFSTV9TTU1VX0lEUjAJ CQkweDAKKyNkZWZpbmUgSURSMF9TVF9MVkxfU0hJRlQJCTI3CisjZGVmaW5lIElEUjBfU1RfTFZM X01BU0sJCTB4MworI2RlZmluZSBJRFIwX1NUX0xWTF8yTFZMCQkoMSA8PCBJRFIwX1NUX0xWTF9T SElGVCkKKyNkZWZpbmUgSURSMF9TVEFMTF9NT0RFTF9TSElGVAkJMjQKKyNkZWZpbmUgSURSMF9T VEFMTF9NT0RFTF9NQVNLCQkweDMKKyNkZWZpbmUgSURSMF9TVEFMTF9NT0RFTF9TVEFMTAkJKDAg PDwgSURSMF9TVEFMTF9NT0RFTF9TSElGVCkKKyNkZWZpbmUgSURSMF9TVEFMTF9NT0RFTF9GT1JD RQkJKDIgPDwgSURSMF9TVEFMTF9NT0RFTF9TSElGVCkKKyNkZWZpbmUgSURSMF9UVEVORElBTl9T SElGVAkJMjEKKyNkZWZpbmUgSURSMF9UVEVORElBTl9NQVNLCQkweDMKKyNkZWZpbmUgSURSMF9U VEVORElBTl9MRQkJKDIgPDwgSURSMF9UVEVORElBTl9TSElGVCkKKyNkZWZpbmUgSURSMF9UVEVO RElBTl9CRQkJKDMgPDwgSURSMF9UVEVORElBTl9TSElGVCkKKyNkZWZpbmUgSURSMF9UVEVORElB Tl9NSVhFRAkJKDAgPDwgSURSMF9UVEVORElBTl9TSElGVCkKKyNkZWZpbmUgSURSMF9DRDJMCQkJ KDEgPDwgMTkpCisjZGVmaW5lIElEUjBfVk1JRDE2CQkJKDEgPDwgMTgpCisjZGVmaW5lIElEUjBf UFJJCQkJKDEgPDwgMTYpCisjZGVmaW5lIElEUjBfU0VWCQkJKDEgPDwgMTQpCisjZGVmaW5lIElE UjBfTVNJCQkJKDEgPDwgMTMpCisjZGVmaW5lIElEUjBfQVNJRDE2CQkJKDEgPDwgMTIpCisjZGVm aW5lIElEUjBfQVRTCQkJKDEgPDwgMTApCisjZGVmaW5lIElEUjBfSFlQCQkJKDEgPDwgOSkKKyNk ZWZpbmUgSURSMF9DT0hBQ0MJCQkoMSA8PCA0KQorI2RlZmluZSBJRFIwX1RURl9TSElGVAkJCTIK KyNkZWZpbmUgSURSMF9UVEZfTUFTSwkJCTB4MworI2RlZmluZSBJRFIwX1RURl9BQVJDSDY0CQko MiA8PCBJRFIwX1RURl9TSElGVCkKKyNkZWZpbmUgSURSMF9UVEZfQUFSQ0gzMl82NAkJKDMgPDwg SURSMF9UVEZfU0hJRlQpCisjZGVmaW5lIElEUjBfUzFQCQkJKDEgPDwgMSkKKyNkZWZpbmUgSURS MF9TMlAJCQkoMSA8PCAwKQorCisjZGVmaW5lIEFSTV9TTU1VX0lEUjEJCQkweDQKKyNkZWZpbmUg SURSMV9UQUJMRVNfUFJFU0VUCQkoMSA8PCAzMCkKKyNkZWZpbmUgSURSMV9RVUVVRVNfUFJFU0VU CQkoMSA8PCAyOSkKKyNkZWZpbmUgSURSMV9SRUwJCQkoMSA8PCAyOCkKKyNkZWZpbmUgSURSMV9D TURRX1NISUZUCQkJMjEKKyNkZWZpbmUgSURSMV9DTURRX01BU0sJCQkweDFmCisjZGVmaW5lIElE UjFfRVZUUV9TSElGVAkJCTE2CisjZGVmaW5lIElEUjFfRVZUUV9NQVNLCQkJMHgxZgorI2RlZmlu ZSBJRFIxX1BSSVFfU0hJRlQJCQkxMQorI2RlZmluZSBJRFIxX1BSSVFfTUFTSwkJCTB4MWYKKyNk ZWZpbmUgSURSMV9TU0lEX1NISUZUCQkJNgorI2RlZmluZSBJRFIxX1NTSURfTUFTSwkJCTB4MWYK KyNkZWZpbmUgSURSMV9TSURfU0hJRlQJCQkwCisjZGVmaW5lIElEUjFfU0lEX01BU0sJCQkweDNm CisKKyNkZWZpbmUgQVJNX1NNTVVfSURSNQkJCTB4MTQKKyNkZWZpbmUgSURSNV9TVEFMTF9NQVhf U0hJRlQJCTE2CisjZGVmaW5lIElEUjVfU1RBTExfTUFYX01BU0sJCTB4ZmZmZgorI2RlZmluZSBJ RFI1X0dSQU42NEsJCQkoMSA8PCA2KQorI2RlZmluZSBJRFI1X0dSQU4xNksJCQkoMSA8PCA1KQor I2RlZmluZSBJRFI1X0dSQU40SwkJCSgxIDw8IDQpCisjZGVmaW5lIElEUjVfT0FTX1NISUZUCQkJ MAorI2RlZmluZSBJRFI1X09BU19NQVNLCQkJMHg3CisjZGVmaW5lIElEUjVfT0FTXzMyX0JJVAkJ CSgwIDw8IElEUjVfT0FTX1NISUZUKQorI2RlZmluZSBJRFI1X09BU18zNl9CSVQJCQkoMSA8PCBJ RFI1X09BU19TSElGVCkKKyNkZWZpbmUgSURSNV9PQVNfNDBfQklUCQkJKDIgPDwgSURSNV9PQVNf U0hJRlQpCisjZGVmaW5lIElEUjVfT0FTXzQyX0JJVAkJCSgzIDw8IElEUjVfT0FTX1NISUZUKQor I2RlZmluZSBJRFI1X09BU180NF9CSVQJCQkoNCA8PCBJRFI1X09BU19TSElGVCkKKyNkZWZpbmUg SURSNV9PQVNfNDhfQklUCQkJKDUgPDwgSURSNV9PQVNfU0hJRlQpCisKKyNkZWZpbmUgQVJNX1NN TVVfQ1IwCQkJMHgyMAorI2RlZmluZSBDUjBfQ01EUUVOCQkJKDEgPDwgMykKKyNkZWZpbmUgQ1Iw X0VWVFFFTgkJCSgxIDw8IDIpCisjZGVmaW5lIENSMF9QUklRRU4JCQkoMSA8PCAxKQorI2RlZmlu ZSBDUjBfU01NVUVOCQkJKDEgPDwgMCkKKworI2RlZmluZSBBUk1fU01NVV9DUjBBQ0sJCQkweDI0 CisKKyNkZWZpbmUgQVJNX1NNTVVfQ1IxCQkJMHgyOAorI2RlZmluZSBDUjFfU0hfTlNICQkJMAor I2RlZmluZSBDUjFfU0hfT1NICQkJMgorI2RlZmluZSBDUjFfU0hfSVNICQkJMworI2RlZmluZSBD UjFfQ0FDSEVfTkMJCQkwCisjZGVmaW5lIENSMV9DQUNIRV9XQgkJCTEKKyNkZWZpbmUgQ1IxX0NB Q0hFX1dUCQkJMgorI2RlZmluZSBDUjFfVEFCTEVfU0hfU0hJRlQJCTEwCisjZGVmaW5lIENSMV9U QUJMRV9PQ19TSElGVAkJOAorI2RlZmluZSBDUjFfVEFCTEVfSUNfU0hJRlQJCTYKKyNkZWZpbmUg Q1IxX1FVRVVFX1NIX1NISUZUCQk0CisjZGVmaW5lIENSMV9RVUVVRV9PQ19TSElGVAkJMgorI2Rl ZmluZSBDUjFfUVVFVUVfSUNfU0hJRlQJCTAKKworI2RlZmluZSBBUk1fU01NVV9DUjIJCQkweDJj CisjZGVmaW5lIENSMl9QVE0JCQkJKDEgPDwgMikKKyNkZWZpbmUgQ1IyX1JFQ0lOVlNJRAkJCSgx IDw8IDEpCisjZGVmaW5lIENSMl9FMkgJCQkJKDEgPDwgMCkKKworI2RlZmluZSBBUk1fU01NVV9H QlBBCQkJMHg0NAorI2RlZmluZSBHQlBBX0FCT1JUCQkJKDEgPDwgMjApCisjZGVmaW5lIEdCUEFf VVBEQVRFCQkJKDEgPDwgMzEpCisKKyNkZWZpbmUgQVJNX1NNTVVfSVJRX0NUUkwJCTB4NTAKKyNk ZWZpbmUgSVJRX0NUUkxfRVZUUV9JUlFFTgkJKDEgPDwgMikKKyNkZWZpbmUgSVJRX0NUUkxfUFJJ UV9JUlFFTgkJKDEgPDwgMSkKKyNkZWZpbmUgSVJRX0NUUkxfR0VSUk9SX0lSUUVOCQkoMSA8PCAw KQorCisjZGVmaW5lIEFSTV9TTU1VX0lSUV9DVFJMQUNLCQkweDU0CisKKyNkZWZpbmUgQVJNX1NN TVVfR0VSUk9SCQkJMHg2MAorI2RlZmluZSBHRVJST1JfU0ZNX0VSUgkJCSgxIDw8IDgpCisjZGVm aW5lIEdFUlJPUl9NU0lfR0VSUk9SX0FCVF9FUlIJKDEgPDwgNykKKyNkZWZpbmUgR0VSUk9SX01T SV9QUklRX0FCVF9FUlIJCSgxIDw8IDYpCisjZGVmaW5lIEdFUlJPUl9NU0lfRVZUUV9BQlRfRVJS CQkoMSA8PCA1KQorI2RlZmluZSBHRVJST1JfTVNJX0NNRFFfQUJUX0VSUgkJKDEgPDwgNCkKKyNk ZWZpbmUgR0VSUk9SX1BSSVFfQUJUX0VSUgkJKDEgPDwgMykKKyNkZWZpbmUgR0VSUk9SX0VWVFFf QUJUX0VSUgkJKDEgPDwgMikKKyNkZWZpbmUgR0VSUk9SX0NNRFFfRVJSCQkJKDEgPDwgMCkKKyNk ZWZpbmUgR0VSUk9SX0VSUl9NQVNLCQkJMHhmZAorCisjZGVmaW5lIEFSTV9TTU1VX0dFUlJPUk4J CTB4NjQKKworI2RlZmluZSBBUk1fU01NVV9HRVJST1JfSVJRX0NGRzAJMHg2OAorI2RlZmluZSBB Uk1fU01NVV9HRVJST1JfSVJRX0NGRzEJMHg3MAorI2RlZmluZSBBUk1fU01NVV9HRVJST1JfSVJR X0NGRzIJMHg3NAorCisjZGVmaW5lIEFSTV9TTU1VX1NUUlRBQl9CQVNFCQkweDgwCisjZGVmaW5l IFNUUlRBQl9CQVNFX1JBCQkJKDFVTCA8PCA2MikKKyNkZWZpbmUgU1RSVEFCX0JBU0VfQUREUl9T SElGVAkJNgorI2RlZmluZSBTVFJUQUJfQkFTRV9BRERSX01BU0sJCTB4M2ZmZmZmZmZmZmZVTAor CisjZGVmaW5lIEFSTV9TTU1VX1NUUlRBQl9CQVNFX0NGRwkweDg4CisjZGVmaW5lIFNUUlRBQl9C QVNFX0NGR19MT0cyU0laRV9TSElGVAkwCisjZGVmaW5lIFNUUlRBQl9CQVNFX0NGR19MT0cyU0la RV9NQVNLCTB4M2YKKyNkZWZpbmUgU1RSVEFCX0JBU0VfQ0ZHX1NQTElUX1NISUZUCTYKKyNkZWZp bmUgU1RSVEFCX0JBU0VfQ0ZHX1NQTElUX01BU0sJMHgxZgorI2RlZmluZSBTVFJUQUJfQkFTRV9D RkdfRk1UX1NISUZUCTE2CisjZGVmaW5lIFNUUlRBQl9CQVNFX0NGR19GTVRfTUFTSwkweDMKKyNk ZWZpbmUgU1RSVEFCX0JBU0VfQ0ZHX0ZNVF9MSU5FQVIJKDAgPDwgU1RSVEFCX0JBU0VfQ0ZHX0ZN VF9TSElGVCkKKyNkZWZpbmUgU1RSVEFCX0JBU0VfQ0ZHX0ZNVF8yTFZMCSgxIDw8IFNUUlRBQl9C QVNFX0NGR19GTVRfU0hJRlQpCisKKyNkZWZpbmUgQVJNX1NNTVVfQ01EUV9CQVNFCQkweDkwCisj ZGVmaW5lIEFSTV9TTU1VX0NNRFFfUFJPRAkJMHg5OAorI2RlZmluZSBBUk1fU01NVV9DTURRX0NP TlMJCTB4OWMKKworI2RlZmluZSBBUk1fU01NVV9FVlRRX0JBU0UJCTB4YTAKKyNkZWZpbmUgQVJN X1NNTVVfRVZUUV9QUk9ECQkweDEwMGE4CisjZGVmaW5lIEFSTV9TTU1VX0VWVFFfQ09OUwkJMHgx MDBhYworI2RlZmluZSBBUk1fU01NVV9FVlRRX0lSUV9DRkcwCQkweGIwCisjZGVmaW5lIEFSTV9T TU1VX0VWVFFfSVJRX0NGRzEJCTB4YjgKKyNkZWZpbmUgQVJNX1NNTVVfRVZUUV9JUlFfQ0ZHMgkJ MHhiYworCisjZGVmaW5lIEFSTV9TTU1VX1BSSVFfQkFTRQkJMHhjMAorI2RlZmluZSBBUk1fU01N VV9QUklRX1BST0QJCTB4MTAwYzgKKyNkZWZpbmUgQVJNX1NNTVVfUFJJUV9DT05TCQkweDEwMGNj CisjZGVmaW5lIEFSTV9TTU1VX1BSSVFfSVJRX0NGRzAJCTB4ZDAKKyNkZWZpbmUgQVJNX1NNTVVf UFJJUV9JUlFfQ0ZHMQkJMHhkOAorI2RlZmluZSBBUk1fU01NVV9QUklRX0lSUV9DRkcyCQkweGRj CisKKy8qIENvbW1vbiBNU0kgY29uZmlnIGZpZWxkcyAqLworI2RlZmluZSBNU0lfQ0ZHMF9BRERS X1NISUZUCQkyCisjZGVmaW5lIE1TSV9DRkcwX0FERFJfTUFTSwkJMHgzZmZmZmZmZmZmZmZVTAor I2RlZmluZSBNU0lfQ0ZHMl9TSF9TSElGVAkJNAorI2RlZmluZSBNU0lfQ0ZHMl9TSF9OU0gJCQko MFVMIDw8IE1TSV9DRkcyX1NIX1NISUZUKQorI2RlZmluZSBNU0lfQ0ZHMl9TSF9PU0gJCQkoMlVM IDw8IE1TSV9DRkcyX1NIX1NISUZUKQorI2RlZmluZSBNU0lfQ0ZHMl9TSF9JU0gJCQkoM1VMIDw8 IE1TSV9DRkcyX1NIX1NISUZUKQorI2RlZmluZSBNU0lfQ0ZHMl9NRU1BVFRSX1NISUZUCQkwCisj ZGVmaW5lIE1TSV9DRkcyX01FTUFUVFJfREVWSUNFX25HblJFCSgweDEgPDwgTVNJX0NGRzJfTUVN QVRUUl9TSElGVCkKKworI2RlZmluZSBRX0lEWChxLCBwKQkJCSgocCkgJiAoKDEgPDwgKHEpLT5t YXhfbl9zaGlmdCkgLSAxKSkKKyNkZWZpbmUgUV9XUlAocSwgcCkJCQkoKHApICYgKDEgPDwgKHEp LT5tYXhfbl9zaGlmdCkpCisjZGVmaW5lIFFfT1ZFUkZMT1dfRkxBRwkJCSgxIDw8IDMxKQorI2Rl ZmluZSBRX09WRihxLCBwKQkJCSgocCkgJiBRX09WRVJGTE9XX0ZMQUcpCisjZGVmaW5lIFFfRU5U KHEsIHApCQkJKChxKS0+YmFzZSArCQkJXAorCQkJCQkgUV9JRFgocSwgcCkgKiAocSktPmVudF9k d29yZHMpCisKKyNkZWZpbmUgUV9CQVNFX1JXQQkJCSgxVUwgPDwgNjIpCisjZGVmaW5lIFFfQkFT RV9BRERSX1NISUZUCQk1CisjZGVmaW5lIFFfQkFTRV9BRERSX01BU0sJCTB4ZmZmZmZmZmZmZmZV TAorI2RlZmluZSBRX0JBU0VfTE9HMlNJWkVfU0hJRlQJCTAKKyNkZWZpbmUgUV9CQVNFX0xPRzJT SVpFX01BU0sJCTB4MWZVTAorCisvKgorICogU3RyZWFtIHRhYmxlLgorICoKKyAqIExpbmVhcjog RW5vdWdoIHRvIGNvdmVyIDEgPDwgSURSMS5TSURTSVpFIGVudHJpZXMKKyAqIDJsdmw6IDEyOGsg TDEgZW50cmllcywKKyAqICAgICAgIDI1NiBsYXp5IGVudHJpZXMgcGVyIHRhYmxlIChlYWNoIHRh YmxlIGNvdmVycyBhIFBDSSBidXMpCisgKi8KKyNkZWZpbmUgU1RSVEFCX0wxX1NaX1NISUZUCQky MAorI2RlZmluZSBTVFJUQUJfU1BMSVQJCQk4CisKKyNkZWZpbmUgU1RSVEFCX0wxX0RFU0NfRFdP UkRTCQkxCisjZGVmaW5lIFNUUlRBQl9MMV9ERVNDX1NQQU5fU0hJRlQJMAorI2RlZmluZSBTVFJU QUJfTDFfREVTQ19TUEFOX01BU0sJMHgxZlVMCisjZGVmaW5lIFNUUlRBQl9MMV9ERVNDX0wyUFRS X1NISUZUCTYKKyNkZWZpbmUgU1RSVEFCX0wxX0RFU0NfTDJQVFJfTUFTSwkweDNmZmZmZmZmZmZm VUwKKworI2RlZmluZSBTVFJUQUJfU1RFX0RXT1JEUwkJOAorI2RlZmluZSBTVFJUQUJfU1RFXzBf VgkJCSgxVUwgPDwgMCkKKyNkZWZpbmUgU1RSVEFCX1NURV8wX0NGR19TSElGVAkJMQorI2RlZmlu ZSBTVFJUQUJfU1RFXzBfQ0ZHX01BU0sJCTB4N1VMCisjZGVmaW5lIFNUUlRBQl9TVEVfMF9DRkdf QUJPUlQJCSgwVUwgPDwgU1RSVEFCX1NURV8wX0NGR19TSElGVCkKKyNkZWZpbmUgU1RSVEFCX1NU RV8wX0NGR19CWVBBU1MJCSg0VUwgPDwgU1RSVEFCX1NURV8wX0NGR19TSElGVCkKKyNkZWZpbmUg U1RSVEFCX1NURV8wX0NGR19TMV9UUkFOUwkoNVVMIDw8IFNUUlRBQl9TVEVfMF9DRkdfU0hJRlQp CisjZGVmaW5lIFNUUlRBQl9TVEVfMF9DRkdfUzJfVFJBTlMJKDZVTCA8PCBTVFJUQUJfU1RFXzBf Q0ZHX1NISUZUKQorCisjZGVmaW5lIFNUUlRBQl9TVEVfMF9TMUZNVF9TSElGVAk0CisjZGVmaW5l IFNUUlRBQl9TVEVfMF9TMUZNVF9MSU5FQVIJKDBVTCA8PCBTVFJUQUJfU1RFXzBfUzFGTVRfU0hJ RlQpCisjZGVmaW5lIFNUUlRBQl9TVEVfMF9TMUNUWFBUUl9TSElGVAk2CisjZGVmaW5lIFNUUlRB Ql9TVEVfMF9TMUNUWFBUUl9NQVNLCTB4M2ZmZmZmZmZmZmZVTAorI2RlZmluZSBTVFJUQUJfU1RF XzBfUzFDRE1BWF9TSElGVAk1OQorI2RlZmluZSBTVFJUQUJfU1RFXzBfUzFDRE1BWF9NQVNLCTB4 MWZVTAorCisjZGVmaW5lIFNUUlRBQl9TVEVfMV9TMUNfQ0FDSEVfTkMJMFVMCisjZGVmaW5lIFNU UlRBQl9TVEVfMV9TMUNfQ0FDSEVfV0JSQQkxVUwKKyNkZWZpbmUgU1RSVEFCX1NURV8xX1MxQ19D QUNIRV9XVAkyVUwKKyNkZWZpbmUgU1RSVEFCX1NURV8xX1MxQ19DQUNIRV9XQgkzVUwKKyNkZWZp bmUgU1RSVEFCX1NURV8xX1MxQ19TSF9OU0gJCTBVTAorI2RlZmluZSBTVFJUQUJfU1RFXzFfUzFD X1NIX09TSAkJMlVMCisjZGVmaW5lIFNUUlRBQl9TVEVfMV9TMUNfU0hfSVNICQkzVUwKKyNkZWZp bmUgU1RSVEFCX1NURV8xX1MxQ0lSX1NISUZUCTIKKyNkZWZpbmUgU1RSVEFCX1NURV8xX1MxQ09S X1NISUZUCTQKKyNkZWZpbmUgU1RSVEFCX1NURV8xX1MxQ1NIX1NISUZUCTYKKworI2RlZmluZSBT VFJUQUJfU1RFXzFfUzFTVEFMTEQJCSgxVUwgPDwgMjcpCisKKyNkZWZpbmUgU1RSVEFCX1NURV8x X0VBVFNfQUJUCQkwVUwKKyNkZWZpbmUgU1RSVEFCX1NURV8xX0VBVFNfVFJBTlMJCTFVTAorI2Rl ZmluZSBTVFJUQUJfU1RFXzFfRUFUU19TMUNISwkJMlVMCisjZGVmaW5lIFNUUlRBQl9TVEVfMV9F QVRTX1NISUZUCQkyOAorCisjZGVmaW5lIFNUUlRBQl9TVEVfMV9TVFJXX05TRUwxCQkwVUwKKyNk ZWZpbmUgU1RSVEFCX1NURV8xX1NUUldfRUwyCQkyVUwKKyNkZWZpbmUgU1RSVEFCX1NURV8xX1NU UldfU0hJRlQJCTMwCisKKyNkZWZpbmUgU1RSVEFCX1NURV8xX1NIQ0ZHX0lOQ09NSU5HCTFVTAor I2RlZmluZSBTVFJUQUJfU1RFXzFfU0hDRkdfU0hJRlQJNDQKKworI2RlZmluZSBTVFJUQUJfU1RF XzJfUzJWTUlEX1NISUZUCTAKKyNkZWZpbmUgU1RSVEFCX1NURV8yX1MyVk1JRF9NQVNLCTB4ZmZm ZlVMCisjZGVmaW5lIFNUUlRBQl9TVEVfMl9WVENSX1NISUZUCQkzMgorI2RlZmluZSBTVFJUQUJf U1RFXzJfVlRDUl9NQVNLCQkweDdmZmZmVUwKKyNkZWZpbmUgU1RSVEFCX1NURV8yX1MyQUE2NAkJ KDFVTCA8PCA1MSkKKyNkZWZpbmUgU1RSVEFCX1NURV8yX1MyRU5ESQkJKDFVTCA8PCA1MikKKyNk ZWZpbmUgU1RSVEFCX1NURV8yX1MyUFRXCQkoMVVMIDw8IDU0KQorI2RlZmluZSBTVFJUQUJfU1RF XzJfUzJSCQkoMVVMIDw8IDU4KQorCisjZGVmaW5lIFNUUlRBQl9TVEVfM19TMlRUQl9TSElGVAk0 CisjZGVmaW5lIFNUUlRBQl9TVEVfM19TMlRUQl9NQVNLCQkweGZmZmZmZmZmZmZmVUwKKworLyog Q29udGV4dCBkZXNjcmlwdG9yIChzdGFnZS0xIG9ubHkpICovCisjZGVmaW5lIENUWERFU0NfQ0Rf RFdPUkRTCQk4CisjZGVmaW5lIENUWERFU0NfQ0RfMF9UQ1JfVDBTWl9TSElGVAkwCisjZGVmaW5l IEFSTTY0X1RDUl9UMFNaX1NISUZUCQkwCisjZGVmaW5lIEFSTTY0X1RDUl9UMFNaX01BU0sJCTB4 MWZVTAorI2RlZmluZSBDVFhERVNDX0NEXzBfVENSX1RHMF9TSElGVAk2CisjZGVmaW5lIEFSTTY0 X1RDUl9URzBfU0hJRlQJCTE0CisjZGVmaW5lIEFSTTY0X1RDUl9URzBfTUFTSwkJMHgzVUwKKyNk ZWZpbmUgQ1RYREVTQ19DRF8wX1RDUl9JUkdOMF9TSElGVAk4CisjZGVmaW5lIEFSTTY0X1RDUl9J UkdOMF9TSElGVAkJOAorI2RlZmluZSBBUk02NF9UQ1JfSVJHTjBfTUFTSwkJMHgzVUwKKyNkZWZp bmUgQ1RYREVTQ19DRF8wX1RDUl9PUkdOMF9TSElGVAkxMAorI2RlZmluZSBBUk02NF9UQ1JfT1JH TjBfU0hJRlQJCTEwCisjZGVmaW5lIEFSTTY0X1RDUl9PUkdOMF9NQVNLCQkweDNVTAorI2RlZmlu ZSBDVFhERVNDX0NEXzBfVENSX1NIMF9TSElGVAkxMgorI2RlZmluZSBBUk02NF9UQ1JfU0gwX1NI SUZUCQkxMgorI2RlZmluZSBBUk02NF9UQ1JfU0gwX01BU0sJCTB4M1VMCisjZGVmaW5lIENUWERF U0NfQ0RfMF9UQ1JfRVBEMF9TSElGVAkxNAorI2RlZmluZSBBUk02NF9UQ1JfRVBEMF9TSElGVAkJ NworI2RlZmluZSBBUk02NF9UQ1JfRVBEMF9NQVNLCQkweDFVTAorI2RlZmluZSBDVFhERVNDX0NE XzBfVENSX0VQRDFfU0hJRlQJMzAKKyNkZWZpbmUgQVJNNjRfVENSX0VQRDFfU0hJRlQJCTIzCisj ZGVmaW5lIEFSTTY0X1RDUl9FUEQxX01BU0sJCTB4MVVMCisKKyNkZWZpbmUgQ1RYREVTQ19DRF8w X0VOREkJCSgxVUwgPDwgMTUpCisjZGVmaW5lIENUWERFU0NfQ0RfMF9WCQkJKDFVTCA8PCAzMSkK KworI2RlZmluZSBDVFhERVNDX0NEXzBfVENSX0lQU19TSElGVAkzMgorI2RlZmluZSBBUk02NF9U Q1JfSVBTX1NISUZUCQkzMgorI2RlZmluZSBBUk02NF9UQ1JfSVBTX01BU0sJCTB4N1VMCisjZGVm aW5lIENUWERFU0NfQ0RfMF9UQ1JfVEJJMF9TSElGVAkzOAorI2RlZmluZSBBUk02NF9UQ1JfVEJJ MF9TSElGVAkJMzcKKyNkZWZpbmUgQVJNNjRfVENSX1RCSTBfTUFTSwkJMHgxVUwKKworI2RlZmlu ZSBDVFhERVNDX0NEXzBfQUE2NAkJKDFVTCA8PCA0MSkKKyNkZWZpbmUgQ1RYREVTQ19DRF8wX1IJ CQkoMVVMIDw8IDQ1KQorI2RlZmluZSBDVFhERVNDX0NEXzBfQQkJCSgxVUwgPDwgNDYpCisjZGVm aW5lIENUWERFU0NfQ0RfMF9BU0VUX1NISUZUCQk0NworI2RlZmluZSBDVFhERVNDX0NEXzBfQVNF VF9TSEFSRUQJKDBVTCA8PCBDVFhERVNDX0NEXzBfQVNFVF9TSElGVCkKKyNkZWZpbmUgQ1RYREVT Q19DRF8wX0FTRVRfUFJJVkFURQkoMVVMIDw8IENUWERFU0NfQ0RfMF9BU0VUX1NISUZUKQorI2Rl ZmluZSBDVFhERVNDX0NEXzBfQVNJRF9TSElGVAkJNDgKKyNkZWZpbmUgQ1RYREVTQ19DRF8wX0FT SURfTUFTSwkJMHhmZmZmVUwKKworI2RlZmluZSBDVFhERVNDX0NEXzFfVFRCMF9TSElGVAkJNAor I2RlZmluZSBDVFhERVNDX0NEXzFfVFRCMF9NQVNLCQkweGZmZmZmZmZmZmZmVUwKKworI2RlZmlu ZSBDVFhERVNDX0NEXzNfTUFJUl9TSElGVAkJMAorCisvKiBDb252ZXJ0IGJldHdlZW4gQUFyY2g2 NCAoQ1BVKSBUQ1IgZm9ybWF0IGFuZCBTTU1VIENEIGZvcm1hdCAqLworI2RlZmluZSBBUk1fU01N VV9UQ1IyQ0QodGNyLCBmbGQpCQkJCQlcCisJKCgodGNyKSA+PiBBUk02NF9UQ1JfIyNmbGQjI19T SElGVCAmIEFSTTY0X1RDUl8jI2ZsZCMjX01BU0spCVwKKwkgPDwgQ1RYREVTQ19DRF8wX1RDUl8j I2ZsZCMjX1NISUZUKQorCisvKiBDb21tYW5kIHF1ZXVlICovCisjZGVmaW5lIENNRFFfRU5UX0RX T1JEUwkJCTIKKyNkZWZpbmUgQ01EUV9NQVhfU1pfU0hJRlQJCTgKKworI2RlZmluZSBDTURRX0VS Ul9TSElGVAkJCTI0CisjZGVmaW5lIENNRFFfRVJSX01BU0sJCQkweDdmCisjZGVmaW5lIENNRFFf RVJSX0NFUlJPUl9OT05FX0lEWAkwCisjZGVmaW5lIENNRFFfRVJSX0NFUlJPUl9JTExfSURYCQkx CisjZGVmaW5lIENNRFFfRVJSX0NFUlJPUl9BQlRfSURYCQkyCisKKyNkZWZpbmUgQ01EUV8wX09Q X1NISUZUCQkJMAorI2RlZmluZSBDTURRXzBfT1BfTUFTSwkJCTB4ZmZVTAorI2RlZmluZSBDTURR XzBfU1NWCQkJKDFVTCA8PCAxMSkKKworI2RlZmluZSBDTURRX1BSRUZFVENIXzBfU0lEX1NISUZU CTMyCisjZGVmaW5lIENNRFFfUFJFRkVUQ0hfMV9TSVpFX1NISUZUCTAKKyNkZWZpbmUgQ01EUV9Q UkVGRVRDSF8xX0FERFJfTUFTSwl+MHhmZmZVTAorCisjZGVmaW5lIENNRFFfQ0ZHSV8wX1NJRF9T SElGVAkJMzIKKyNkZWZpbmUgQ01EUV9DRkdJXzBfU0lEX01BU0sJCTB4ZmZmZmZmZmZVTAorI2Rl ZmluZSBDTURRX0NGR0lfMV9MRUFGCQkoMVVMIDw8IDApCisjZGVmaW5lIENNRFFfQ0ZHSV8xX1JB TkdFX1NISUZUCQkwCisjZGVmaW5lIENNRFFfQ0ZHSV8xX1JBTkdFX01BU0sJCTB4MWZVTAorCisj ZGVmaW5lIENNRFFfVExCSV8wX1ZNSURfU0hJRlQJCTMyCisjZGVmaW5lIENNRFFfVExCSV8wX0FT SURfU0hJRlQJCTQ4CisjZGVmaW5lIENNRFFfVExCSV8xX0xFQUYJCSgxVUwgPDwgMCkKKyNkZWZp bmUgQ01EUV9UTEJJXzFfVkFfTUFTSwkJfjB4ZmZmVUwKKyNkZWZpbmUgQ01EUV9UTEJJXzFfSVBB X01BU0sJCTB4ZmZmZmZmZmZmMDAwVUwKKworI2RlZmluZSBDTURRX1BSSV8wX1NTSURfU0hJRlQJ CTEyCisjZGVmaW5lIENNRFFfUFJJXzBfU1NJRF9NQVNLCQkweGZmZmZmVUwKKyNkZWZpbmUgQ01E UV9QUklfMF9TSURfU0hJRlQJCTMyCisjZGVmaW5lIENNRFFfUFJJXzBfU0lEX01BU0sJCTB4ZmZm ZmZmZmZVTAorI2RlZmluZSBDTURRX1BSSV8xX0dSUElEX1NISUZUCQkwCisjZGVmaW5lIENNRFFf UFJJXzFfR1JQSURfTUFTSwkJMHgxZmZVTAorI2RlZmluZSBDTURRX1BSSV8xX1JFU1BfU0hJRlQJ CTEyCisjZGVmaW5lIENNRFFfUFJJXzFfUkVTUF9ERU5ZCQkoMFVMIDw8IENNRFFfUFJJXzFfUkVT UF9TSElGVCkKKyNkZWZpbmUgQ01EUV9QUklfMV9SRVNQX0ZBSUwJCSgxVUwgPDwgQ01EUV9QUklf MV9SRVNQX1NISUZUKQorI2RlZmluZSBDTURRX1BSSV8xX1JFU1BfU1VDQwkJKDJVTCA8PCBDTURR X1BSSV8xX1JFU1BfU0hJRlQpCisKKyNkZWZpbmUgQ01EUV9TWU5DXzBfQ1NfU0hJRlQJCTEyCisj ZGVmaW5lIENNRFFfU1lOQ18wX0NTX05PTkUJCSgwVUwgPDwgQ01EUV9TWU5DXzBfQ1NfU0hJRlQp CisjZGVmaW5lIENNRFFfU1lOQ18wX0NTX1NFVgkJKDJVTCA8PCBDTURRX1NZTkNfMF9DU19TSElG VCkKKworLyogRXZlbnQgcXVldWUgKi8KKyNkZWZpbmUgRVZUUV9FTlRfRFdPUkRTCQkJNAorI2Rl ZmluZSBFVlRRX01BWF9TWl9TSElGVAkJNworCisjZGVmaW5lIEVWVFFfMF9JRF9TSElGVAkJCTAK KyNkZWZpbmUgRVZUUV8wX0lEX01BU0sJCQkweGZmVUwKKworLyogUFJJIHF1ZXVlICovCisjZGVm aW5lIFBSSVFfRU5UX0RXT1JEUwkJCTIKKyNkZWZpbmUgUFJJUV9NQVhfU1pfU0hJRlQJCTgKKwor I2RlZmluZSBQUklRXzBfU0lEX1NISUZUCQkwCisjZGVmaW5lIFBSSVFfMF9TSURfTUFTSwkJCTB4 ZmZmZmZmZmZVTAorI2RlZmluZSBQUklRXzBfU1NJRF9TSElGVAkJMzIKKyNkZWZpbmUgUFJJUV8w X1NTSURfTUFTSwkJMHhmZmZmZlVMCisjZGVmaW5lIFBSSVFfMF9QRVJNX1BSSVYJCSgxVUwgPDwg NTgpCisjZGVmaW5lIFBSSVFfMF9QRVJNX0VYRUMJCSgxVUwgPDwgNTkpCisjZGVmaW5lIFBSSVFf MF9QRVJNX1JFQUQJCSgxVUwgPDwgNjApCisjZGVmaW5lIFBSSVFfMF9QRVJNX1dSSVRFCQkoMVVM IDw8IDYxKQorI2RlZmluZSBQUklRXzBfUFJHX0xBU1QJCQkoMVVMIDw8IDYyKQorI2RlZmluZSBQ UklRXzBfU1NJRF9WCQkJKDFVTCA8PCA2MykKKworI2RlZmluZSBQUklRXzFfUFJHX0lEWF9TSElG VAkJMAorI2RlZmluZSBQUklRXzFfUFJHX0lEWF9NQVNLCQkweDFmZlVMCisjZGVmaW5lIFBSSVFf MV9BRERSX1NISUZUCQkxMgorI2RlZmluZSBQUklRXzFfQUREUl9NQVNLCQkweGZmZmZmZmZmZmZm ZmZVTAorCisvKiBIaWdoLWxldmVsIHF1ZXVlIHN0cnVjdHVyZXMgKi8KKyNkZWZpbmUgQVJNX1NN TVVfUE9MTF9USU1FT1VUX1VTCTEwMAorCisjZGVmaW5lIE1TSV9JT1ZBX0JBU0UJCQkweDgwMDAw MDAKKyNkZWZpbmUgTVNJX0lPVkFfTEVOR1RICQkJMHgxMDAwMDAKKworc3RhdGljIGJvb2wgZGlz YWJsZV9ieXBhc3M7Cittb2R1bGVfcGFyYW1fbmFtZWQoZGlzYWJsZV9ieXBhc3MsIGRpc2FibGVf YnlwYXNzLCBib29sLCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0MoZGlzYWJsZV9ieXBhc3Ms CisJIkRpc2FibGUgYnlwYXNzIHN0cmVhbXMgc3VjaCB0aGF0IGluY29taW5nIHRyYW5zYWN0aW9u cyBmcm9tIGRldmljZXMgdGhhdCBhcmUgbm90IGF0dGFjaGVkIHRvIGFuIGlvbW11IGRvbWFpbiB3 aWxsIHJlcG9ydCBhbiBhYm9ydCBiYWNrIHRvIHRoZSBkZXZpY2UgYW5kIHdpbGwgbm90IGJlIGFs bG93ZWQgdG8gcGFzcyB0aHJvdWdoIHRoZSBTTU1VLiIpOworCitlbnVtIHByaV9yZXNwIHsKKwlQ UklfUkVTUF9ERU5ZLAorCVBSSV9SRVNQX0ZBSUwsCisJUFJJX1JFU1BfU1VDQywKK307CisKK2Vu dW0gYXJtX3NtbXVfbXNpX2luZGV4IHsKKwlFVlRRX01TSV9JTkRFWCwKKwlHRVJST1JfTVNJX0lO REVYLAorCVBSSVFfTVNJX0lOREVYLAorCUFSTV9TTU1VX01BWF9NU0lTLAorfTsKKworc3RhdGlj IHBoeXNfYWRkcl90IGFybV9zbW11X21zaV9jZmdbQVJNX1NNTVVfTUFYX01TSVNdWzNdID0gewor CVtFVlRRX01TSV9JTkRFWF0gPSB7CisJCUFSTV9TTU1VX0VWVFFfSVJRX0NGRzAsCisJCUFSTV9T TU1VX0VWVFFfSVJRX0NGRzEsCisJCUFSTV9TTU1VX0VWVFFfSVJRX0NGRzIsCisJfSwKKwlbR0VS Uk9SX01TSV9JTkRFWF0gPSB7CisJCUFSTV9TTU1VX0dFUlJPUl9JUlFfQ0ZHMCwKKwkJQVJNX1NN TVVfR0VSUk9SX0lSUV9DRkcxLAorCQlBUk1fU01NVV9HRVJST1JfSVJRX0NGRzIsCisJfSwKKwlb UFJJUV9NU0lfSU5ERVhdID0geworCQlBUk1fU01NVV9QUklRX0lSUV9DRkcwLAorCQlBUk1fU01N VV9QUklRX0lSUV9DRkcxLAorCQlBUk1fU01NVV9QUklRX0lSUV9DRkcyLAorCX0sCit9OworCitz dHJ1Y3QgYXJtX3NtbXVfY21kcV9lbnQgeworCS8qIENvbW1vbiBmaWVsZHMgKi8KKwl1OAkJCQlv cGNvZGU7CisJYm9vbAkJCQlzdWJzdHJlYW1fdmFsaWQ7CisKKwkvKiBDb21tYW5kLXNwZWNpZmlj IGZpZWxkcyAqLworCXVuaW9uIHsKKwkJI2RlZmluZSBDTURRX09QX1BSRUZFVENIX0NGRwkweDEK KwkJc3RydWN0IHsKKwkJCXUzMgkJCXNpZDsKKwkJCXU4CQkJc2l6ZTsKKwkJCXU2NAkJCWFkZHI7 CisJCX0gcHJlZmV0Y2g7CisKKwkJI2RlZmluZSBDTURRX09QX0NGR0lfU1RFCTB4MworCQkjZGVm aW5lIENNRFFfT1BfQ0ZHSV9BTEwJMHg0CisJCXN0cnVjdCB7CisJCQl1MzIJCQlzaWQ7CisJCQl1 bmlvbiB7CisJCQkJYm9vbAkJbGVhZjsKKwkJCQl1OAkJc3BhbjsKKwkJCX07CisJCX0gY2ZnaTsK KworCQkjZGVmaW5lIENNRFFfT1BfVExCSV9OSF9BU0lECTB4MTEKKwkJI2RlZmluZSBDTURRX09Q X1RMQklfTkhfVkEJMHgxMgorCQkjZGVmaW5lIENNRFFfT1BfVExCSV9FTDJfQUxMCTB4MjAKKwkJ I2RlZmluZSBDTURRX09QX1RMQklfUzEyX1ZNQUxMCTB4MjgKKwkJI2RlZmluZSBDTURRX09QX1RM QklfUzJfSVBBCTB4MmEKKwkJI2RlZmluZSBDTURRX09QX1RMQklfTlNOSF9BTEwJMHgzMAorCQlz dHJ1Y3QgeworCQkJdTE2CQkJYXNpZDsKKwkJCXUxNgkJCXZtaWQ7CisJCQlib29sCQkJbGVhZjsK KwkJCXU2NAkJCWFkZHI7CisJCX0gdGxiaTsKKworCQkjZGVmaW5lIENNRFFfT1BfUFJJX1JFU1AJ MHg0MQorCQlzdHJ1Y3QgeworCQkJdTMyCQkJc2lkOworCQkJdTMyCQkJc3NpZDsKKwkJCXUxNgkJ CWdycGlkOworCQkJZW51bSBwcmlfcmVzcAkJcmVzcDsKKwkJfSBwcmk7CisKKwkJI2RlZmluZSBD TURRX09QX0NNRF9TWU5DCTB4NDYKKwl9OworfTsKKworc3RydWN0IGFybV9zbW11X3F1ZXVlIHsK KwlpbnQJCQkJaXJxOyAvKiBXaXJlZCBpbnRlcnJ1cHQgKi8KKworCV9fbGU2NAkJCQkqYmFzZTsK KwlkbWFfYWRkcl90CQkJYmFzZV9kbWE7CisJdTY0CQkJCXFfYmFzZTsKKworCXNpemVfdAkJCQll bnRfZHdvcmRzOworCXUzMgkJCQltYXhfbl9zaGlmdDsKKwl1MzIJCQkJcHJvZDsKKwl1MzIJCQkJ Y29uczsKKworCXUzMiBfX2lvbWVtCQkJKnByb2RfcmVnOworCXUzMiBfX2lvbWVtCQkJKmNvbnNf cmVnOworfTsKKworc3RydWN0IGFybV9zbW11X2NtZHEgeworCXN0cnVjdCBhcm1fc21tdV9xdWV1 ZQkJcTsKKwlzcGlubG9ja190CQkJbG9jazsKK307CisKK3N0cnVjdCBhcm1fc21tdV9ldnRxIHsK KwlzdHJ1Y3QgYXJtX3NtbXVfcXVldWUJCXE7CisJdTMyCQkJCW1heF9zdGFsbHM7Cit9OworCitz dHJ1Y3QgYXJtX3NtbXVfcHJpcSB7CisJc3RydWN0IGFybV9zbW11X3F1ZXVlCQlxOworfTsKKwor LyogSGlnaC1sZXZlbCBzdHJlYW0gdGFibGUgYW5kIGNvbnRleHQgZGVzY3JpcHRvciBzdHJ1Y3R1 cmVzICovCitzdHJ1Y3QgYXJtX3NtbXVfc3RydGFiX2wxX2Rlc2MgeworCXU4CQkJCXNwYW47CisK KwlfX2xlNjQJCQkJKmwycHRyOworCWRtYV9hZGRyX3QJCQlsMnB0cl9kbWE7Cit9OworCitzdHJ1 Y3QgYXJtX3NtbXVfczFfY2ZnIHsKKwlfX2xlNjQJCQkJKmNkcHRyOworCWRtYV9hZGRyX3QJCQlj ZHB0cl9kbWE7CisKKwlzdHJ1Y3QgYXJtX3NtbXVfY3R4X2Rlc2MgeworCQl1MTYJYXNpZDsKKwkJ dTY0CXR0YnI7CisJCXU2NAl0Y3I7CisJCXU2NAltYWlyOworCX0JCQkJY2Q7Cit9OworCitzdHJ1 Y3QgYXJtX3NtbXVfczJfY2ZnIHsKKwl1MTYJCQkJdm1pZDsKKwl1NjQJCQkJdnR0YnI7CisJdTY0 CQkJCXZ0Y3I7Cit9OworCitzdHJ1Y3QgYXJtX3NtbXVfc3RydGFiX2VudCB7CisJLyoKKwkgKiBB biBTVEUgaXMgImFzc2lnbmVkIiBpZiB0aGUgbWFzdGVyIGVtaXR0aW5nIHRoZSBjb3JyZXNwb25k aW5nIFNJRAorCSAqIGlzIGF0dGFjaGVkIHRvIGEgZG9tYWluLiBUaGUgYmVoYXZpb3VyIG9mIGFu IHVuYXNzaWduZWQgU1RFIGlzCisJICogZGV0ZXJtaW5lZCBieSB0aGUgZGlzYWJsZV9ieXBhc3Mg cGFyYW1ldGVyLCB3aGVyZWFzIGFuIGFzc2lnbmVkCisJICogU1RFIGJlaGF2ZXMgYWNjb3JkaW5n IHRvIHMxX2NmZy9zMl9jZmcsIHdoaWNoIHRoZW1zZWx2ZXMgYXJlCisJICogY29uZmlndXJlZCBh Y2NvcmRpbmcgdG8gdGhlIGRvbWFpbiB0eXBlLgorCSAqLworCWJvb2wJCQkJYXNzaWduZWQ7CisJ c3RydWN0IGFybV9zbW11X3MxX2NmZwkJKnMxX2NmZzsKKwlzdHJ1Y3QgYXJtX3NtbXVfczJfY2Zn CQkqczJfY2ZnOworfTsKKworc3RydWN0IGFybV9zbW11X3N0cnRhYl9jZmcgeworCV9fbGU2NAkJ CQkqc3RydGFiOworCWRtYV9hZGRyX3QJCQlzdHJ0YWJfZG1hOworCXN0cnVjdCBhcm1fc21tdV9z dHJ0YWJfbDFfZGVzYwkqbDFfZGVzYzsKKwl1bnNpZ25lZCBpbnQJCQludW1fbDFfZW50czsKKwor CXU2NAkJCQlzdHJ0YWJfYmFzZTsKKwl1MzIJCQkJc3RydGFiX2Jhc2VfY2ZnOworfTsKKworLyog QW4gU01NVXYzIGluc3RhbmNlICovCitzdHJ1Y3QgYXJtX3NtbXVfZGV2aWNlIHsKKwlzdHJ1Y3Qg ZGV2aWNlCQkJKmRldjsKKwl2b2lkIF9faW9tZW0JCQkqYmFzZTsKKworI2RlZmluZSBBUk1fU01N VV9GRUFUXzJfTFZMX1NUUlRBQgkoMSA8PCAwKQorI2RlZmluZSBBUk1fU01NVV9GRUFUXzJfTFZM X0NEVEFCCSgxIDw8IDEpCisjZGVmaW5lIEFSTV9TTU1VX0ZFQVRfVFRfTEUJCSgxIDw8IDIpCisj ZGVmaW5lIEFSTV9TTU1VX0ZFQVRfVFRfQkUJCSgxIDw8IDMpCisjZGVmaW5lIEFSTV9TTU1VX0ZF QVRfUFJJCQkoMSA8PCA0KQorI2RlZmluZSBBUk1fU01NVV9GRUFUX0FUUwkJKDEgPDwgNSkKKyNk ZWZpbmUgQVJNX1NNTVVfRkVBVF9TRVYJCSgxIDw8IDYpCisjZGVmaW5lIEFSTV9TTU1VX0ZFQVRf TVNJCQkoMSA8PCA3KQorI2RlZmluZSBBUk1fU01NVV9GRUFUX0NPSEVSRU5DWQkJKDEgPDwgOCkK KyNkZWZpbmUgQVJNX1NNTVVfRkVBVF9UUkFOU19TMQkJKDEgPDwgOSkKKyNkZWZpbmUgQVJNX1NN TVVfRkVBVF9UUkFOU19TMgkJKDEgPDwgMTApCisjZGVmaW5lIEFSTV9TTU1VX0ZFQVRfU1RBTExT CQkoMSA8PCAxMSkKKyNkZWZpbmUgQVJNX1NNTVVfRkVBVF9IWVAJCSgxIDw8IDEyKQorCXUzMgkJ CQlmZWF0dXJlczsKKworI2RlZmluZSBBUk1fU01NVV9PUFRfU0tJUF9QUkVGRVRDSAkoMSA8PCAw KQorCXUzMgkJCQlvcHRpb25zOworCisJc3RydWN0IGFybV9zbW11X2NtZHEJCWNtZHE7CisJc3Ry dWN0IGFybV9zbW11X2V2dHEJCWV2dHE7CisJc3RydWN0IGFybV9zbW11X3ByaXEJCXByaXE7CisK KwlpbnQJCQkJZ2Vycl9pcnE7CisKKwl1bnNpZ25lZCBsb25nCQkJaWFzOyAvKiBJUEEgKi8KKwl1 bnNpZ25lZCBsb25nCQkJb2FzOyAvKiBQQSAqLworCXVuc2lnbmVkIGxvbmcJCQlwZ3NpemVfYml0 bWFwOworCisjZGVmaW5lIEFSTV9TTU1VX01BWF9BU0lEUwkJKDEgPDwgMTYpCisJdW5zaWduZWQg aW50CQkJYXNpZF9iaXRzOworCURFQ0xBUkVfQklUTUFQKGFzaWRfbWFwLCBBUk1fU01NVV9NQVhf QVNJRFMpOworCisjZGVmaW5lIEFSTV9TTU1VX01BWF9WTUlEUwkJKDEgPDwgMTYpCisJdW5zaWdu ZWQgaW50CQkJdm1pZF9iaXRzOworCURFQ0xBUkVfQklUTUFQKHZtaWRfbWFwLCBBUk1fU01NVV9N QVhfVk1JRFMpOworCisJdW5zaWduZWQgaW50CQkJc3NpZF9iaXRzOworCXVuc2lnbmVkIGludAkJ CXNpZF9iaXRzOworCisJc3RydWN0IGFybV9zbW11X3N0cnRhYl9jZmcJc3RydGFiX2NmZzsKKwor CS8qIElPTU1VIGNvcmUgY29kZSBoYW5kbGUgKi8KKwlzdHJ1Y3QgaW9tbXVfZGV2aWNlCQlpb21t dTsKK307CisKKy8qIFNNTVUgcHJpdmF0ZSBkYXRhIGZvciBlYWNoIG1hc3RlciAqLworc3RydWN0 IGFybV9zbW11X21hc3Rlcl9kYXRhIHsKKwlzdHJ1Y3QgYXJtX3NtbXVfZGV2aWNlCQkqc21tdTsK KwlzdHJ1Y3QgYXJtX3NtbXVfc3RydGFiX2VudAlzdGU7Cit9OworCisvKiBTTU1VIHByaXZhdGUg ZGF0YSBmb3IgYW4gSU9NTVUgZG9tYWluICovCitlbnVtIGFybV9zbW11X2RvbWFpbl9zdGFnZSB7 CisJQVJNX1NNTVVfRE9NQUlOX1MxID0gMCwKKwlBUk1fU01NVV9ET01BSU5fUzIsCisJQVJNX1NN TVVfRE9NQUlOX05FU1RFRCwKKwlBUk1fU01NVV9ET01BSU5fQllQQVNTLAorfTsKKworc3RydWN0 IGFybV9zbW11X2RvbWFpbiB7CisJc3RydWN0IGFybV9zbW11X2RldmljZQkJKnNtbXU7CisJc3Ry dWN0IG11dGV4CQkJaW5pdF9tdXRleDsgLyogUHJvdGVjdHMgc21tdSBwb2ludGVyICovCisKKwlz dHJ1Y3QgaW9fcGd0YWJsZV9vcHMJCSpwZ3RibF9vcHM7CisJc3BpbmxvY2tfdAkJCXBndGJsX2xv Y2s7CisKKwllbnVtIGFybV9zbW11X2RvbWFpbl9zdGFnZQlzdGFnZTsKKwl1bmlvbiB7CisJCXN0 cnVjdCBhcm1fc21tdV9zMV9jZmcJczFfY2ZnOworCQlzdHJ1Y3QgYXJtX3NtbXVfczJfY2ZnCXMy X2NmZzsKKwl9OworCisJc3RydWN0IGlvbW11X2RvbWFpbgkJZG9tYWluOworfTsKKworc3RydWN0 IGFybV9zbW11X29wdGlvbl9wcm9wIHsKKwl1MzIgb3B0OworCWNvbnN0IGNoYXIgKnByb3A7Cit9 OworCitzdGF0aWMgc3RydWN0IGFybV9zbW11X29wdGlvbl9wcm9wIGFybV9zbW11X29wdGlvbnNb XSA9IHsKKwl7IEFSTV9TTU1VX09QVF9TS0lQX1BSRUZFVENILCAiaGlzaWxpY29uLGJyb2tlbi1w cmVmZXRjaC1jbWQiIH0sCisJeyAwLCBOVUxMfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXJtX3Nt bXVfZG9tYWluICp0b19zbW11X2RvbWFpbihzdHJ1Y3QgaW9tbXVfZG9tYWluICpkb20pCit7CisJ cmV0dXJuIGNvbnRhaW5lcl9vZihkb20sIHN0cnVjdCBhcm1fc21tdV9kb21haW4sIGRvbWFpbik7 Cit9CisKK3N0YXRpYyB2b2lkIHBhcnNlX2RyaXZlcl9vcHRpb25zKHN0cnVjdCBhcm1fc21tdV9k ZXZpY2UgKnNtbXUpCit7CisJaW50IGkgPSAwOworCisJZG8geworCQlpZiAob2ZfcHJvcGVydHlf cmVhZF9ib29sKHNtbXUtPmRldi0+b2Zfbm9kZSwKKwkJCQkJCWFybV9zbW11X29wdGlvbnNbaV0u cHJvcCkpIHsKKwkJCXNtbXUtPm9wdGlvbnMgfD0gYXJtX3NtbXVfb3B0aW9uc1tpXS5vcHQ7CisJ CQlkZXZfbm90aWNlKHNtbXUtPmRldiwgIm9wdGlvbiAlc1xuIiwKKwkJCQlhcm1fc21tdV9vcHRp b25zW2ldLnByb3ApOworCQl9CisJfSB3aGlsZSAoYXJtX3NtbXVfb3B0aW9uc1srK2ldLm9wdCk7 Cit9CisKKy8qIExvdy1sZXZlbCBxdWV1ZSBtYW5pcHVsYXRpb24gZnVuY3Rpb25zICovCitzdGF0 aWMgYm9vbCBxdWV1ZV9mdWxsKHN0cnVjdCBhcm1fc21tdV9xdWV1ZSAqcSkKK3sKKwlyZXR1cm4g UV9JRFgocSwgcS0+cHJvZCkgPT0gUV9JRFgocSwgcS0+Y29ucykgJiYKKwkgICAgICAgUV9XUlAo cSwgcS0+cHJvZCkgIT0gUV9XUlAocSwgcS0+Y29ucyk7Cit9CisKK3N0YXRpYyBib29sIHF1ZXVl X2VtcHR5KHN0cnVjdCBhcm1fc21tdV9xdWV1ZSAqcSkKK3sKKwlyZXR1cm4gUV9JRFgocSwgcS0+ cHJvZCkgPT0gUV9JRFgocSwgcS0+Y29ucykgJiYKKwkgICAgICAgUV9XUlAocSwgcS0+cHJvZCkg PT0gUV9XUlAocSwgcS0+Y29ucyk7Cit9CisKK3N0YXRpYyB2b2lkIHF1ZXVlX3N5bmNfY29ucyhz dHJ1Y3QgYXJtX3NtbXVfcXVldWUgKnEpCit7CisJcS0+Y29ucyA9IHJlYWRsX3JlbGF4ZWQocS0+ Y29uc19yZWcpOworfQorCitzdGF0aWMgdm9pZCBxdWV1ZV9pbmNfY29ucyhzdHJ1Y3QgYXJtX3Nt bXVfcXVldWUgKnEpCit7CisJdTMyIGNvbnMgPSAoUV9XUlAocSwgcS0+Y29ucykgfCBRX0lEWChx LCBxLT5jb25zKSkgKyAxOworCisJcS0+Y29ucyA9IFFfT1ZGKHEsIHEtPmNvbnMpIHwgUV9XUlAo cSwgY29ucykgfCBRX0lEWChxLCBjb25zKTsKKwl3cml0ZWwocS0+Y29ucywgcS0+Y29uc19yZWcp OworfQorCitzdGF0aWMgaW50IHF1ZXVlX3N5bmNfcHJvZChzdHJ1Y3QgYXJtX3NtbXVfcXVldWUg KnEpCit7CisJaW50IHJldCA9IDA7CisJdTMyIHByb2QgPSByZWFkbF9yZWxheGVkKHEtPnByb2Rf cmVnKTsKKworCWlmIChRX09WRihxLCBwcm9kKSAhPSBRX09WRihxLCBxLT5wcm9kKSkKKwkJcmV0 ID0gLUVPVkVSRkxPVzsKKworCXEtPnByb2QgPSBwcm9kOworCXJldHVybiByZXQ7Cit9CisKK3N0 YXRpYyB2b2lkIHF1ZXVlX2luY19wcm9kKHN0cnVjdCBhcm1fc21tdV9xdWV1ZSAqcSkKK3sKKwl1 MzIgcHJvZCA9IChRX1dSUChxLCBxLT5wcm9kKSB8IFFfSURYKHEsIHEtPnByb2QpKSArIDE7CisK KwlxLT5wcm9kID0gUV9PVkYocSwgcS0+cHJvZCkgfCBRX1dSUChxLCBwcm9kKSB8IFFfSURYKHEs IHByb2QpOworCXdyaXRlbChxLT5wcm9kLCBxLT5wcm9kX3JlZyk7Cit9CisKKy8qCisgKiBXYWl0 IGZvciB0aGUgU01NVSB0byBjb25zdW1lIGl0ZW1zLiBJZiBkcmFpbiBpcyB0cnVlLCB3YWl0IHVu dGlsIHRoZSBxdWV1ZQorICogaXMgZW1wdHkuIE90aGVyd2lzZSwgd2FpdCB1bnRpbCB0aGVyZSBp cyBhdCBsZWFzdCBvbmUgZnJlZSBzbG90LgorICovCitzdGF0aWMgaW50IHF1ZXVlX3BvbGxfY29u cyhzdHJ1Y3QgYXJtX3NtbXVfcXVldWUgKnEsIGJvb2wgZHJhaW4sIGJvb2wgd2ZlKQoreworCWt0 aW1lX3QgdGltZW91dCA9IGt0aW1lX2FkZF91cyhrdGltZV9nZXQoKSwgQVJNX1NNTVVfUE9MTF9U SU1FT1VUX1VTKTsKKworCXdoaWxlIChxdWV1ZV9zeW5jX2NvbnMocSksIChkcmFpbiA/ICFxdWV1 ZV9lbXB0eShxKSA6IHF1ZXVlX2Z1bGwocSkpKSB7CisJCWlmIChrdGltZV9jb21wYXJlKGt0aW1l X2dldCgpLCB0aW1lb3V0KSA+IDApCisJCQlyZXR1cm4gLUVUSU1FRE9VVDsKKworCQlpZiAod2Zl KSB7CisJCQl3ZmUoKTsKKwkJfSBlbHNlIHsKKwkJCWNwdV9yZWxheCgpOworCQkJdWRlbGF5KDEp OworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHF1ZXVlX3dyaXRlKF9f bGU2NCAqZHN0LCB1NjQgKnNyYywgc2l6ZV90IG5fZHdvcmRzKQoreworCWludCBpOworCisJZm9y IChpID0gMDsgaSA8IG5fZHdvcmRzOyArK2kpCisJCSpkc3QrKyA9IGNwdV90b19sZTY0KCpzcmMr Kyk7Cit9CisKK3N0YXRpYyBpbnQgcXVldWVfaW5zZXJ0X3JhdyhzdHJ1Y3QgYXJtX3NtbXVfcXVl dWUgKnEsIHU2NCAqZW50KQoreworCWlmIChxdWV1ZV9mdWxsKHEpKQorCQlyZXR1cm4gLUVOT1NQ QzsKKworCXF1ZXVlX3dyaXRlKFFfRU5UKHEsIHEtPnByb2QpLCBlbnQsIHEtPmVudF9kd29yZHMp OworCXF1ZXVlX2luY19wcm9kKHEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBxdWV1 ZV9yZWFkKF9fbGU2NCAqZHN0LCB1NjQgKnNyYywgc2l6ZV90IG5fZHdvcmRzKQoreworCWludCBp OworCisJZm9yIChpID0gMDsgaSA8IG5fZHdvcmRzOyArK2kpCisJCSpkc3QrKyA9IGxlNjRfdG9f Y3B1KCpzcmMrKyk7Cit9CisKK3N0YXRpYyBpbnQgcXVldWVfcmVtb3ZlX3JhdyhzdHJ1Y3QgYXJt X3NtbXVfcXVldWUgKnEsIHU2NCAqZW50KQoreworCWlmIChxdWV1ZV9lbXB0eShxKSkKKwkJcmV0 dXJuIC1FQUdBSU47CisKKwlxdWV1ZV9yZWFkKGVudCwgUV9FTlQocSwgcS0+Y29ucyksIHEtPmVu dF9kd29yZHMpOworCXF1ZXVlX2luY19jb25zKHEpOworCXJldHVybiAwOworfQorCisvKiBIaWdo LWxldmVsIHF1ZXVlIGFjY2Vzc29ycyAqLworc3RhdGljIGludCBhcm1fc21tdV9jbWRxX2J1aWxk X2NtZCh1NjQgKmNtZCwgc3RydWN0IGFybV9zbW11X2NtZHFfZW50ICplbnQpCit7CisJbWVtc2V0 KGNtZCwgMCwgQ01EUV9FTlRfRFdPUkRTIDw8IDMpOworCWNtZFswXSB8PSAoZW50LT5vcGNvZGUg JiBDTURRXzBfT1BfTUFTSykgPDwgQ01EUV8wX09QX1NISUZUOworCisJc3dpdGNoIChlbnQtPm9w Y29kZSkgeworCWNhc2UgQ01EUV9PUF9UTEJJX0VMMl9BTEw6CisJY2FzZSBDTURRX09QX1RMQklf TlNOSF9BTEw6CisJCWJyZWFrOworCWNhc2UgQ01EUV9PUF9QUkVGRVRDSF9DRkc6CisJCWNtZFsw XSB8PSAodTY0KWVudC0+cHJlZmV0Y2guc2lkIDw8IENNRFFfUFJFRkVUQ0hfMF9TSURfU0hJRlQ7 CisJCWNtZFsxXSB8PSBlbnQtPnByZWZldGNoLnNpemUgPDwgQ01EUV9QUkVGRVRDSF8xX1NJWkVf U0hJRlQ7CisJCWNtZFsxXSB8PSBlbnQtPnByZWZldGNoLmFkZHIgJiBDTURRX1BSRUZFVENIXzFf QUREUl9NQVNLOworCQlicmVhazsKKwljYXNlIENNRFFfT1BfQ0ZHSV9TVEU6CisJCWNtZFswXSB8 PSAodTY0KWVudC0+Y2ZnaS5zaWQgPDwgQ01EUV9DRkdJXzBfU0lEX1NISUZUOworCQljbWRbMV0g fD0gZW50LT5jZmdpLmxlYWYgPyBDTURRX0NGR0lfMV9MRUFGIDogMDsKKwkJYnJlYWs7CisJY2Fz ZSBDTURRX09QX0NGR0lfQUxMOgorCQkvKiBDb3ZlciB0aGUgZW50aXJlIFNJRCByYW5nZSAqLwor CQljbWRbMV0gfD0gQ01EUV9DRkdJXzFfUkFOR0VfTUFTSyA8PCBDTURRX0NGR0lfMV9SQU5HRV9T SElGVDsKKwkJYnJlYWs7CisJY2FzZSBDTURRX09QX1RMQklfTkhfVkE6CisJCWNtZFswXSB8PSAo dTY0KWVudC0+dGxiaS5hc2lkIDw8IENNRFFfVExCSV8wX0FTSURfU0hJRlQ7CisJCWNtZFsxXSB8 PSBlbnQtPnRsYmkubGVhZiA/IENNRFFfVExCSV8xX0xFQUYgOiAwOworCQljbWRbMV0gfD0gZW50 LT50bGJpLmFkZHIgJiBDTURRX1RMQklfMV9WQV9NQVNLOworCQlicmVhazsKKwljYXNlIENNRFFf T1BfVExCSV9TMl9JUEE6CisJCWNtZFswXSB8PSAodTY0KWVudC0+dGxiaS52bWlkIDw8IENNRFFf VExCSV8wX1ZNSURfU0hJRlQ7CisJCWNtZFsxXSB8PSBlbnQtPnRsYmkubGVhZiA/IENNRFFfVExC SV8xX0xFQUYgOiAwOworCQljbWRbMV0gfD0gZW50LT50bGJpLmFkZHIgJiBDTURRX1RMQklfMV9J UEFfTUFTSzsKKwkJYnJlYWs7CisJY2FzZSBDTURRX09QX1RMQklfTkhfQVNJRDoKKwkJY21kWzBd IHw9ICh1NjQpZW50LT50bGJpLmFzaWQgPDwgQ01EUV9UTEJJXzBfQVNJRF9TSElGVDsKKwkJLyog RmFsbHRocm91Z2ggKi8KKwljYXNlIENNRFFfT1BfVExCSV9TMTJfVk1BTEw6CisJCWNtZFswXSB8 PSAodTY0KWVudC0+dGxiaS52bWlkIDw8IENNRFFfVExCSV8wX1ZNSURfU0hJRlQ7CisJCWJyZWFr OworCWNhc2UgQ01EUV9PUF9QUklfUkVTUDoKKwkJY21kWzBdIHw9IGVudC0+c3Vic3RyZWFtX3Zh bGlkID8gQ01EUV8wX1NTViA6IDA7CisJCWNtZFswXSB8PSBlbnQtPnByaS5zc2lkIDw8IENNRFFf UFJJXzBfU1NJRF9TSElGVDsKKwkJY21kWzBdIHw9ICh1NjQpZW50LT5wcmkuc2lkIDw8IENNRFFf UFJJXzBfU0lEX1NISUZUOworCQljbWRbMV0gfD0gZW50LT5wcmkuZ3JwaWQgPDwgQ01EUV9QUklf MV9HUlBJRF9TSElGVDsKKwkJc3dpdGNoIChlbnQtPnByaS5yZXNwKSB7CisJCWNhc2UgUFJJX1JF U1BfREVOWToKKwkJCWNtZFsxXSB8PSBDTURRX1BSSV8xX1JFU1BfREVOWTsKKwkJCWJyZWFrOwor CQljYXNlIFBSSV9SRVNQX0ZBSUw6CisJCQljbWRbMV0gfD0gQ01EUV9QUklfMV9SRVNQX0ZBSUw7 CisJCQlicmVhazsKKwkJY2FzZSBQUklfUkVTUF9TVUNDOgorCQkJY21kWzFdIHw9IENNRFFfUFJJ XzFfUkVTUF9TVUNDOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsK KwkJfQorCQlicmVhazsKKwljYXNlIENNRFFfT1BfQ01EX1NZTkM6CisJCWNtZFswXSB8PSBDTURR X1NZTkNfMF9DU19TRVY7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PRU5UOwor CX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhcm1fc21tdV9jbWRxX3NraXBfZXJy KHN0cnVjdCBhcm1fc21tdV9kZXZpY2UgKnNtbXUpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgKmNl cnJvcl9zdHJbXSA9IHsKKwkJW0NNRFFfRVJSX0NFUlJPUl9OT05FX0lEWF0JPSAiTm8gZXJyb3Ii LAorCQlbQ01EUV9FUlJfQ0VSUk9SX0lMTF9JRFhdCT0gIklsbGVnYWwgY29tbWFuZCIsCisJCVtD TURRX0VSUl9DRVJST1JfQUJUX0lEWF0JPSAiQWJvcnQgb24gY29tbWFuZCBmZXRjaCIsCisJfTsK KworCWludCBpOworCXU2NCBjbWRbQ01EUV9FTlRfRFdPUkRTXTsKKwlzdHJ1Y3QgYXJtX3NtbXVf cXVldWUgKnEgPSAmc21tdS0+Y21kcS5xOworCXUzMiBjb25zID0gcmVhZGxfcmVsYXhlZChxLT5j b25zX3JlZyk7CisJdTMyIGlkeCA9IGNvbnMgPj4gQ01EUV9FUlJfU0hJRlQgJiBDTURRX0VSUl9N QVNLOworCXN0cnVjdCBhcm1fc21tdV9jbWRxX2VudCBjbWRfc3luYyA9IHsKKwkJLm9wY29kZSA9 IENNRFFfT1BfQ01EX1NZTkMsCisJfTsKKworCWRldl9lcnIoc21tdS0+ZGV2LCAiQ01EUSBlcnJv ciAoY29ucyAweCUwOHgpOiAlc1xuIiwgY29ucywKKwkJaWR4IDwgQVJSQVlfU0laRShjZXJyb3Jf c3RyKSA/ICBjZXJyb3Jfc3RyW2lkeF0gOiAiVW5rbm93biIpOworCisJc3dpdGNoIChpZHgpIHsK KwljYXNlIENNRFFfRVJSX0NFUlJPUl9BQlRfSURYOgorCQlkZXZfZXJyKHNtbXUtPmRldiwgInJl dHJ5aW5nIGNvbW1hbmQgZmV0Y2hcbiIpOworCWNhc2UgQ01EUV9FUlJfQ0VSUk9SX05PTkVfSURY OgorCQlyZXR1cm47CisJY2FzZSBDTURRX0VSUl9DRVJST1JfSUxMX0lEWDoKKwkJLyogRmFsbHRo cm91Z2ggKi8KKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwkvKgorCSAqIFdlIG1heSBoYXZl IGNvbmN1cnJlbnQgcHJvZHVjZXJzLCBzbyB3ZSBuZWVkIHRvIGJlIGNhcmVmdWwKKwkgKiBub3Qg dG8gdG91Y2ggYW55IG9mIHRoZSBzaGFkb3cgY21kcSBzdGF0ZS4KKwkgKi8KKwlxdWV1ZV9yZWFk KGNtZCwgUV9FTlQocSwgY29ucyksIHEtPmVudF9kd29yZHMpOworCWRldl9lcnIoc21tdS0+ZGV2 LCAic2tpcHBpbmcgY29tbWFuZCBpbiBlcnJvciBzdGF0ZTpcbiIpOworCWZvciAoaSA9IDA7IGkg PCBBUlJBWV9TSVpFKGNtZCk7ICsraSkKKwkJZGV2X2VycihzbW11LT5kZXYsICJcdDB4JTAxNmxs eFxuIiwgKHVuc2lnbmVkIGxvbmcgbG9uZyljbWRbaV0pOworCisJLyogQ29udmVydCB0aGUgZXJy b25lb3VzIGNvbW1hbmQgaW50byBhIENNRF9TWU5DICovCisJaWYgKGFybV9zbW11X2NtZHFfYnVp bGRfY21kKGNtZCwgJmNtZF9zeW5jKSkgeworCQlkZXZfZXJyKHNtbXUtPmRldiwgImZhaWxlZCB0 byBjb252ZXJ0IHRvIENNRF9TWU5DXG4iKTsKKwkJcmV0dXJuOworCX0KKworCXF1ZXVlX3dyaXRl KFFfRU5UKHEsIGNvbnMpLCBjbWQsIHEtPmVudF9kd29yZHMpOworfQorCitzdGF0aWMgdm9pZCBh cm1fc21tdV9jbWRxX2lzc3VlX2NtZChzdHJ1Y3QgYXJtX3NtbXVfZGV2aWNlICpzbW11LAorCQkJ CSAgICBzdHJ1Y3QgYXJtX3NtbXVfY21kcV9lbnQgKmVudCkKK3sKKwl1NjQgY21kW0NNRFFfRU5U X0RXT1JEU107CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlib29sIHdmZSA9ICEhKHNtbXUtPmZl YXR1cmVzICYgQVJNX1NNTVVfRkVBVF9TRVYpOworCXN0cnVjdCBhcm1fc21tdV9xdWV1ZSAqcSA9 ICZzbW11LT5jbWRxLnE7CisKKwlpZiAoYXJtX3NtbXVfY21kcV9idWlsZF9jbWQoY21kLCBlbnQp KSB7CisJCWRldl93YXJuKHNtbXUtPmRldiwgImlnbm9yaW5nIHVua25vd24gQ01EUSBvcGNvZGUg MHgleFxuIiwKKwkJCSBlbnQtPm9wY29kZSk7CisJCXJldHVybjsKKwl9CisKKwlzcGluX2xvY2tf aXJxc2F2ZSgmc21tdS0+Y21kcS5sb2NrLCBmbGFncyk7CisJd2hpbGUgKHF1ZXVlX2luc2VydF9y YXcocSwgY21kKSA9PSAtRU5PU1BDKSB7CisJCWlmIChxdWV1ZV9wb2xsX2NvbnMocSwgZmFsc2Us IHdmZSkpCisJCQlkZXZfZXJyX3JhdGVsaW1pdGVkKHNtbXUtPmRldiwgIkNNRFEgdGltZW91dFxu Iik7CisJfQorCisJaWYgKGVudC0+b3Bjb2RlID09IENNRFFfT1BfQ01EX1NZTkMgJiYgcXVldWVf cG9sbF9jb25zKHEsIHRydWUsIHdmZSkpCisJCWRldl9lcnJfcmF0ZWxpbWl0ZWQoc21tdS0+ZGV2 LCAiQ01EX1NZTkMgdGltZW91dFxuIik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc21tdS0+ Y21kcS5sb2NrLCBmbGFncyk7Cit9CisKKy8qIENvbnRleHQgZGVzY3JpcHRvciBtYW5pcHVsYXRp b24gZnVuY3Rpb25zICovCitzdGF0aWMgdTY0IGFybV9zbW11X2NwdV90Y3JfdG9fY2QodTY0IHRj cikKK3sKKwl1NjQgdmFsID0gMDsKKworCS8qIFJlcGFjayB0aGUgVENSLiBKdXN0IGNhcmUgYWJv dXQgVFRCUjAgZm9yIG5vdyAqLworCXZhbCB8PSBBUk1fU01NVV9UQ1IyQ0QodGNyLCBUMFNaKTsK Kwl2YWwgfD0gQVJNX1NNTVVfVENSMkNEKHRjciwgVEcwKTsKKwl2YWwgfD0gQVJNX1NNTVVfVENS MkNEKHRjciwgSVJHTjApOworCXZhbCB8PSBBUk1fU01NVV9UQ1IyQ0QodGNyLCBPUkdOMCk7CisJ dmFsIHw9IEFSTV9TTU1VX1RDUjJDRCh0Y3IsIFNIMCk7CisJdmFsIHw9IEFSTV9TTU1VX1RDUjJD RCh0Y3IsIEVQRDApOworCXZhbCB8PSBBUk1fU01NVV9UQ1IyQ0QodGNyLCBFUEQxKTsKKwl2YWwg fD0gQVJNX1NNTVVfVENSMkNEKHRjciwgSVBTKTsKKwl2YWwgfD0gQVJNX1NNTVVfVENSMkNEKHRj ciwgVEJJMCk7CisKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgdm9pZCBhcm1fc21tdV93cml0 ZV9jdHhfZGVzYyhzdHJ1Y3QgYXJtX3NtbXVfZGV2aWNlICpzbW11LAorCQkJCSAgICBzdHJ1Y3Qg YXJtX3NtbXVfczFfY2ZnICpjZmcpCit7CisJdTY0IHZhbDsKKworCS8qCisJICogV2UgZG9uJ3Qg bmVlZCB0byBpc3N1ZSBhbnkgaW52YWxpZGF0aW9uIGhlcmUsIGFzIHdlJ2xsIGludmFsaWRhdGUK KwkgKiB0aGUgU1RFIHdoZW4gaW5zdGFsbGluZyB0aGUgbmV3IGVudHJ5IGFueXdheS4KKwkgKi8K Kwl2YWwgPSBhcm1fc21tdV9jcHVfdGNyX3RvX2NkKGNmZy0+Y2QudGNyKSB8CisjaWZkZWYgX19C SUdfRU5ESUFOCisJICAgICAgQ1RYREVTQ19DRF8wX0VOREkgfAorI2VuZGlmCisJICAgICAgQ1RY REVTQ19DRF8wX1IgfCBDVFhERVNDX0NEXzBfQSB8IENUWERFU0NfQ0RfMF9BU0VUX1BSSVZBVEUg fAorCSAgICAgIENUWERFU0NfQ0RfMF9BQTY0IHwgKHU2NCljZmctPmNkLmFzaWQgPDwgQ1RYREVT Q19DRF8wX0FTSURfU0hJRlQgfAorCSAgICAgIENUWERFU0NfQ0RfMF9WOworCWNmZy0+Y2RwdHJb MF0gPSBjcHVfdG9fbGU2NCh2YWwpOworCisJdmFsID0gY2ZnLT5jZC50dGJyICYgQ1RYREVTQ19D RF8xX1RUQjBfTUFTSyA8PCBDVFhERVNDX0NEXzFfVFRCMF9TSElGVDsKKwljZmctPmNkcHRyWzFd ID0gY3B1X3RvX2xlNjQodmFsKTsKKworCWNmZy0+Y2RwdHJbM10gPSBjcHVfdG9fbGU2NChjZmct PmNkLm1haXIgPDwgQ1RYREVTQ19DRF8zX01BSVJfU0hJRlQpOworfQorCisvKiBTdHJlYW0gdGFi bGUgbWFuaXB1bGF0aW9uIGZ1bmN0aW9ucyAqLworc3RhdGljIHZvaWQKK2FybV9zbW11X3dyaXRl X3N0cnRhYl9sMV9kZXNjKF9fbGU2NCAqZHN0LCBzdHJ1Y3QgYXJtX3NtbXVfc3RydGFiX2wxX2Rl c2MgKmRlc2MpCit7CisJdTY0IHZhbCA9IDA7CisKKwl2YWwgfD0gKGRlc2MtPnNwYW4gJiBTVFJU QUJfTDFfREVTQ19TUEFOX01BU0spCisJCTw8IFNUUlRBQl9MMV9ERVNDX1NQQU5fU0hJRlQ7CisJ dmFsIHw9IGRlc2MtPmwycHRyX2RtYSAmCisJICAgICAgIFNUUlRBQl9MMV9ERVNDX0wyUFRSX01B U0sgPDwgU1RSVEFCX0wxX0RFU0NfTDJQVFJfU0hJRlQ7CisKKwkqZHN0ID0gY3B1X3RvX2xlNjQo dmFsKTsKK30KKworc3RhdGljIHZvaWQgYXJtX3NtbXVfc3luY19zdGVfZm9yX3NpZChzdHJ1Y3Qg YXJtX3NtbXVfZGV2aWNlICpzbW11LCB1MzIgc2lkKQoreworCXN0cnVjdCBhcm1fc21tdV9jbWRx X2VudCBjbWQgPSB7CisJCS5vcGNvZGUJPSBDTURRX09QX0NGR0lfU1RFLAorCQkuY2ZnaQk9IHsK KwkJCS5zaWQJPSBzaWQsCisJCQkubGVhZgk9IHRydWUsCisJCX0sCisJfTsKKworCWFybV9zbW11 X2NtZHFfaXNzdWVfY21kKHNtbXUsICZjbWQpOworCWNtZC5vcGNvZGUgPSBDTURRX09QX0NNRF9T WU5DOworCWFybV9zbW11X2NtZHFfaXNzdWVfY21kKHNtbXUsICZjbWQpOworfQorCitzdGF0aWMg dm9pZCBhcm1fc21tdV93cml0ZV9zdHJ0YWJfZW50KHN0cnVjdCBhcm1fc21tdV9kZXZpY2UgKnNt bXUsIHUzMiBzaWQsCisJCQkJICAgICAgX19sZTY0ICpkc3QsIHN0cnVjdCBhcm1fc21tdV9zdHJ0 YWJfZW50ICpzdGUpCit7CisJLyoKKwkgKiBUaGlzIGlzIGhpZGVvdXNseSBjb21wbGljYXRlZCwg YnV0IHdlIG9ubHkgcmVhbGx5IGNhcmUgYWJvdXQKKwkgKiB0aHJlZSBjYXNlcyBhdCB0aGUgbW9t ZW50OgorCSAqCisJICogMS4gSW52YWxpZCAoYWxsIHplcm8pIC0+IGJ5cGFzcy9mYXVsdCAoaW5p dCkKKwkgKiAyLiBCeXBhc3MvZmF1bHQgLT4gdHJhbnNsYXRpb24vYnlwYXNzIChhdHRhY2gpCisJ ICogMy4gVHJhbnNsYXRpb24vYnlwYXNzIC0+IGJ5cGFzcy9mYXVsdCAoZGV0YWNoKQorCSAqCisJ ICogR2l2ZW4gdGhhdCB3ZSBjYW4ndCB1cGRhdGUgdGhlIFNURSBhdG9taWNhbGx5IGFuZCB0aGUg U01NVQorCSAqIGRvZXNuJ3QgcmVhZCB0aGUgdGhpbmcgaW4gYSBkZWZpbmVkIG9yZGVyLCB0aGF0 IGxlYXZlcyB1cworCSAqIHdpdGggdGhlIGZvbGxvd2luZyBtYWludGVuYW5jZSByZXF1aXJlbWVu dHM6CisJICoKKwkgKiAxLiBVcGRhdGUgQ29uZmlnLCByZXR1cm4gKGluaXQgdGltZSBTVEVzIGFy ZW4ndCBsaXZlKQorCSAqIDIuIFdyaXRlIGV2ZXJ5dGhpbmcgYXBhcnQgZnJvbSBkd29yZCAwLCBz eW5jLCB3cml0ZSBkd29yZCAwLCBzeW5jCisJICogMy4gVXBkYXRlIENvbmZpZywgc3luYworCSAq LworCXU2NCB2YWwgPSBsZTY0X3RvX2NwdShkc3RbMF0pOworCWJvb2wgc3RlX2xpdmUgPSBmYWxz ZTsKKwlzdHJ1Y3QgYXJtX3NtbXVfY21kcV9lbnQgcHJlZmV0Y2hfY21kID0geworCQkub3Bjb2Rl CQk9IENNRFFfT1BfUFJFRkVUQ0hfQ0ZHLAorCQkucHJlZmV0Y2gJPSB7CisJCQkuc2lkCT0gc2lk LAorCQl9LAorCX07CisKKwlpZiAodmFsICYgU1RSVEFCX1NURV8wX1YpIHsKKwkJdTY0IGNmZzsK KworCQljZmcgPSB2YWwgJiBTVFJUQUJfU1RFXzBfQ0ZHX01BU0sgPDwgU1RSVEFCX1NURV8wX0NG R19TSElGVDsKKwkJc3dpdGNoIChjZmcpIHsKKwkJY2FzZSBTVFJUQUJfU1RFXzBfQ0ZHX0JZUEFT UzoKKwkJCWJyZWFrOworCQljYXNlIFNUUlRBQl9TVEVfMF9DRkdfUzFfVFJBTlM6CisJCWNhc2Ug U1RSVEFCX1NURV8wX0NGR19TMl9UUkFOUzoKKwkJCXN0ZV9saXZlID0gdHJ1ZTsKKwkJCWJyZWFr OworCQljYXNlIFNUUlRBQl9TVEVfMF9DRkdfQUJPUlQ6CisJCQlpZiAoZGlzYWJsZV9ieXBhc3Mp CisJCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlCVUcoKTsgLyogU1RFIGNvcnJ1cHRpb24gKi8K KwkJfQorCX0KKworCS8qIE51a2UgdGhlIGV4aXN0aW5nIFNURV8wIHZhbHVlLCBhcyB3ZSdyZSBn b2luZyB0byByZXdyaXRlIGl0ICovCisJdmFsID0gU1RSVEFCX1NURV8wX1Y7CisKKwkvKiBCeXBh c3MvZmF1bHQgKi8KKwlpZiAoIXN0ZS0+YXNzaWduZWQgfHwgIShzdGUtPnMxX2NmZyB8fCBzdGUt PnMyX2NmZykpIHsKKwkJaWYgKCFzdGUtPmFzc2lnbmVkICYmIGRpc2FibGVfYnlwYXNzKQorCQkJ dmFsIHw9IFNUUlRBQl9TVEVfMF9DRkdfQUJPUlQ7CisJCWVsc2UKKwkJCXZhbCB8PSBTVFJUQUJf U1RFXzBfQ0ZHX0JZUEFTUzsKKworCQlkc3RbMF0gPSBjcHVfdG9fbGU2NCh2YWwpOworCQlkc3Rb MV0gPSBjcHVfdG9fbGU2NChTVFJUQUJfU1RFXzFfU0hDRkdfSU5DT01JTkcKKwkJCSA8PCBTVFJU QUJfU1RFXzFfU0hDRkdfU0hJRlQpOworCQlkc3RbMl0gPSAwOyAvKiBOdWtlIHRoZSBWTUlEICov CisJCWlmIChzdGVfbGl2ZSkKKwkJCWFybV9zbW11X3N5bmNfc3RlX2Zvcl9zaWQoc21tdSwgc2lk KTsKKwkJcmV0dXJuOworCX0KKworCWlmIChzdGUtPnMxX2NmZykgeworCQlCVUdfT04oc3RlX2xp dmUpOworCQlkc3RbMV0gPSBjcHVfdG9fbGU2NCgKKwkJCSBTVFJUQUJfU1RFXzFfUzFDX0NBQ0hF X1dCUkEKKwkJCSA8PCBTVFJUQUJfU1RFXzFfUzFDSVJfU0hJRlQgfAorCQkJIFNUUlRBQl9TVEVf MV9TMUNfQ0FDSEVfV0JSQQorCQkJIDw8IFNUUlRBQl9TVEVfMV9TMUNPUl9TSElGVCB8CisJCQkg U1RSVEFCX1NURV8xX1MxQ19TSF9JU0ggPDwgU1RSVEFCX1NURV8xX1MxQ1NIX1NISUZUIHwKKyNp ZmRlZiBDT05GSUdfUENJX0FUUworCQkJIFNUUlRBQl9TVEVfMV9FQVRTX1RSQU5TIDw8IFNUUlRB Ql9TVEVfMV9FQVRTX1NISUZUIHwKKyNlbmRpZgorCQkJIFNUUlRBQl9TVEVfMV9TVFJXX05TRUwx IDw8IFNUUlRBQl9TVEVfMV9TVFJXX1NISUZUKTsKKworCQlpZiAoc21tdS0+ZmVhdHVyZXMgJiBB Uk1fU01NVV9GRUFUX1NUQUxMUykKKwkJCWRzdFsxXSB8PSBjcHVfdG9fbGU2NChTVFJUQUJfU1RF XzFfUzFTVEFMTEQpOworCisJCXZhbCB8PSAoc3RlLT5zMV9jZmctPmNkcHRyX2RtYSAmIFNUUlRB Ql9TVEVfMF9TMUNUWFBUUl9NQVNLCisJCSAgICAgICAgPDwgU1RSVEFCX1NURV8wX1MxQ1RYUFRS X1NISUZUKSB8CisJCQlTVFJUQUJfU1RFXzBfQ0ZHX1MxX1RSQU5TOworCX0KKworCWlmIChzdGUt PnMyX2NmZykgeworCQlCVUdfT04oc3RlX2xpdmUpOworCQlkc3RbMl0gPSBjcHVfdG9fbGU2NCgK KwkJCSBzdGUtPnMyX2NmZy0+dm1pZCA8PCBTVFJUQUJfU1RFXzJfUzJWTUlEX1NISUZUIHwKKwkJ CSAoc3RlLT5zMl9jZmctPnZ0Y3IgJiBTVFJUQUJfU1RFXzJfVlRDUl9NQVNLKQorCQkJICA8PCBT VFJUQUJfU1RFXzJfVlRDUl9TSElGVCB8CisjaWZkZWYgX19CSUdfRU5ESUFOCisJCQkgU1RSVEFC X1NURV8yX1MyRU5ESSB8CisjZW5kaWYKKwkJCSBTVFJUQUJfU1RFXzJfUzJQVFcgfCBTVFJUQUJf U1RFXzJfUzJBQTY0IHwKKwkJCSBTVFJUQUJfU1RFXzJfUzJSKTsKKworCQlkc3RbM10gPSBjcHVf dG9fbGU2NChzdGUtPnMyX2NmZy0+dnR0YnIgJgorCQkJIFNUUlRBQl9TVEVfM19TMlRUQl9NQVNL IDw8IFNUUlRBQl9TVEVfM19TMlRUQl9TSElGVCk7CisKKwkJdmFsIHw9IFNUUlRBQl9TVEVfMF9D RkdfUzJfVFJBTlM7CisJfQorCisJYXJtX3NtbXVfc3luY19zdGVfZm9yX3NpZChzbW11LCBzaWQp OworCWRzdFswXSA9IGNwdV90b19sZTY0KHZhbCk7CisJYXJtX3NtbXVfc3luY19zdGVfZm9yX3Np ZChzbW11LCBzaWQpOworCisJLyogSXQncyBsaWtlbHkgdGhhdCB3ZSdsbCB3YW50IHRvIHVzZSB0 aGUgbmV3IFNURSBzb29uICovCisJaWYgKCEoc21tdS0+b3B0aW9ucyAmIEFSTV9TTU1VX09QVF9T S0lQX1BSRUZFVENIKSkKKwkJYXJtX3NtbXVfY21kcV9pc3N1ZV9jbWQoc21tdSwgJnByZWZldGNo X2NtZCk7Cit9CisKK3N0YXRpYyB2b2lkIGFybV9zbW11X2luaXRfYnlwYXNzX3N0ZXModTY0ICpz dHJ0YWIsIHVuc2lnbmVkIGludCBuZW50KQoreworCXVuc2lnbmVkIGludCBpOworCXN0cnVjdCBh cm1fc21tdV9zdHJ0YWJfZW50IHN0ZSA9IHsgLmFzc2lnbmVkID0gZmFsc2UgfTsKKworCWZvciAo aSA9IDA7IGkgPCBuZW50OyArK2kpIHsKKwkJYXJtX3NtbXVfd3JpdGVfc3RydGFiX2VudChOVUxM LCAtMSwgc3RydGFiLCAmc3RlKTsKKwkJc3RydGFiICs9IFNUUlRBQl9TVEVfRFdPUkRTOworCX0K K30KKworc3RhdGljIGludCBhcm1fc21tdV9pbml0X2wyX3N0cnRhYihzdHJ1Y3QgYXJtX3NtbXVf ZGV2aWNlICpzbW11LCB1MzIgc2lkKQoreworCXNpemVfdCBzaXplOworCXZvaWQgKnN0cnRhYjsK KwlzdHJ1Y3QgYXJtX3NtbXVfc3RydGFiX2NmZyAqY2ZnID0gJnNtbXUtPnN0cnRhYl9jZmc7CisJ c3RydWN0IGFybV9zbW11X3N0cnRhYl9sMV9kZXNjICpkZXNjID0gJmNmZy0+bDFfZGVzY1tzaWQg Pj4gU1RSVEFCX1NQTElUXTsKKworCWlmIChkZXNjLT5sMnB0cikKKwkJcmV0dXJuIDA7CisKKwlz aXplID0gMSA8PCAoU1RSVEFCX1NQTElUICsgaWxvZzIoU1RSVEFCX1NURV9EV09SRFMpICsgMyk7 CisJc3RydGFiID0gJmNmZy0+c3RydGFiWyhzaWQgPj4gU1RSVEFCX1NQTElUKSAqIFNUUlRBQl9M MV9ERVNDX0RXT1JEU107CisKKwlkZXNjLT5zcGFuID0gU1RSVEFCX1NQTElUICsgMTsKKwlkZXNj LT5sMnB0ciA9IGRtYW1fYWxsb2NfY29oZXJlbnQoc21tdS0+ZGV2LCBzaXplLCAmZGVzYy0+bDJw dHJfZG1hLAorCQkJCQkgIEdGUF9LRVJORUwgfCBfX0dGUF9aRVJPKTsKKwlpZiAoIWRlc2MtPmwy cHRyKSB7CisJCWRldl9lcnIoc21tdS0+ZGV2LAorCQkJImZhaWxlZCB0byBhbGxvY2F0ZSBsMiBz dHJlYW0gdGFibGUgZm9yIFNJRCAldVxuIiwKKwkJCXNpZCk7CisJCXJldHVybiAtRU5PTUVNOwor CX0KKworCWFybV9zbW11X2luaXRfYnlwYXNzX3N0ZXMoZGVzYy0+bDJwdHIsIDEgPDwgU1RSVEFC X1NQTElUKTsKKwlhcm1fc21tdV93cml0ZV9zdHJ0YWJfbDFfZGVzYyhzdHJ0YWIsIGRlc2MpOwor CXJldHVybiAwOworfQorCisvKiBJUlEgYW5kIGV2ZW50IGhhbmRsZXJzICovCitzdGF0aWMgaXJx cmV0dXJuX3QgYXJtX3NtbXVfZXZ0cV90aHJlYWQoaW50IGlycSwgdm9pZCAqZGV2KQoreworCWlu dCBpOworCXN0cnVjdCBhcm1fc21tdV9kZXZpY2UgKnNtbXUgPSBkZXY7CisJc3RydWN0IGFybV9z bW11X3F1ZXVlICpxID0gJnNtbXUtPmV2dHEucTsKKwl1NjQgZXZ0W0VWVFFfRU5UX0RXT1JEU107 CisKKwlkbyB7CisJCXdoaWxlICghcXVldWVfcmVtb3ZlX3JhdyhxLCBldnQpKSB7CisJCQl1OCBp ZCA9IGV2dFswXSA+PiBFVlRRXzBfSURfU0hJRlQgJiBFVlRRXzBfSURfTUFTSzsKKworCQkJZGV2 X2luZm8oc21tdS0+ZGV2LCAiZXZlbnQgMHglMDJ4IHJlY2VpdmVkOlxuIiwgaWQpOworCQkJZm9y IChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZXZ0KTsgKytpKQorCQkJCWRldl9pbmZvKHNtbXUtPmRl diwgIlx0MHglMDE2bGx4XG4iLAorCQkJCQkgKHVuc2lnbmVkIGxvbmcgbG9uZylldnRbaV0pOwor CisJCX0KKworCQkvKgorCQkgKiBOb3QgbXVjaCB3ZSBjYW4gZG8gb24gb3ZlcmZsb3csIHNvIHNj cmVhbSBhbmQgcHJldGVuZCB3ZSdyZQorCQkgKiB0cnlpbmcgaGFyZGVyLgorCQkgKi8KKwkJaWYg KHF1ZXVlX3N5bmNfcHJvZChxKSA9PSAtRU9WRVJGTE9XKQorCQkJZGV2X2VycihzbW11LT5kZXYs ICJFVlRRIG92ZXJmbG93IGRldGVjdGVkIC0tIGV2ZW50cyBsb3N0XG4iKTsKKwl9IHdoaWxlICgh cXVldWVfZW1wdHkocSkpOworCisJLyogU3luYyBvdXIgb3ZlcmZsb3cgZmxhZywgYXMgd2UgYmVs aWV2ZSB3ZSdyZSB1cCB0byBzcGVlZCAqLworCXEtPmNvbnMgPSBRX09WRihxLCBxLT5wcm9kKSB8 IFFfV1JQKHEsIHEtPmNvbnMpIHwgUV9JRFgocSwgcS0+Y29ucyk7CisJcmV0dXJuIElSUV9IQU5E TEVEOworfQorCitzdGF0aWMgdm9pZCBhcm1fc21tdV9oYW5kbGVfcHByKHN0cnVjdCBhcm1fc21t dV9kZXZpY2UgKnNtbXUsIHU2NCAqZXZ0KQoreworCXUzMiBzaWQsIHNzaWQ7CisJdTE2IGdycGlk OworCWJvb2wgc3N2LCBsYXN0OworCisJc2lkID0gZXZ0WzBdID4+IFBSSVFfMF9TSURfU0hJRlQg JiBQUklRXzBfU0lEX01BU0s7CisJc3N2ID0gZXZ0WzBdICYgUFJJUV8wX1NTSURfVjsKKwlzc2lk ID0gc3N2ID8gZXZ0WzBdID4+IFBSSVFfMF9TU0lEX1NISUZUICYgUFJJUV8wX1NTSURfTUFTSyA6 IDA7CisJbGFzdCA9IGV2dFswXSAmIFBSSVFfMF9QUkdfTEFTVDsKKwlncnBpZCA9IGV2dFsxXSA+ PiBQUklRXzFfUFJHX0lEWF9TSElGVCAmIFBSSVFfMV9QUkdfSURYX01BU0s7CisKKwlkZXZfaW5m byhzbW11LT5kZXYsICJ1bmV4cGVjdGVkIFBSSSByZXF1ZXN0IHJlY2VpdmVkOlxuIik7CisJZGV2 X2luZm8oc21tdS0+ZGV2LAorCQkgIlx0c2lkIDB4JTA4eC4weCUwNXg6IFsldSVzXSAlc3ByaXZp bGVnZWQgJXMlcyVzIGFjY2VzcyBhdCBpb3ZhIDB4JTAxNmxseFxuIiwKKwkJIHNpZCwgc3NpZCwg Z3JwaWQsIGxhc3QgPyAiTCIgOiAiIiwKKwkJIGV2dFswXSAmIFBSSVFfMF9QRVJNX1BSSVYgPyAi IiA6ICJ1biIsCisJCSBldnRbMF0gJiBQUklRXzBfUEVSTV9SRUFEID8gIlIiIDogIiIsCisJCSBl dnRbMF0gJiBQUklRXzBfUEVSTV9XUklURSA/ICJXIiA6ICIiLAorCQkgZXZ0WzBdICYgUFJJUV8w X1BFUk1fRVhFQyA/ICJYIiA6ICIiLAorCQkgZXZ0WzFdICYgUFJJUV8xX0FERFJfTUFTSyA8PCBQ UklRXzFfQUREUl9TSElGVCk7CisKKwlpZiAobGFzdCkgeworCQlzdHJ1Y3QgYXJtX3NtbXVfY21k cV9lbnQgY21kID0geworCQkJLm9wY29kZQkJCT0gQ01EUV9PUF9QUklfUkVTUCwKKwkJCS5zdWJz dHJlYW1fdmFsaWQJPSBzc3YsCisJCQkucHJpCQkJPSB7CisJCQkJLnNpZAk9IHNpZCwKKwkJCQku c3NpZAk9IHNzaWQsCisJCQkJLmdycGlkCT0gZ3JwaWQsCisJCQkJLnJlc3AJPSBQUklfUkVTUF9E RU5ZLAorCQkJfSwKKwkJfTsKKworCQlhcm1fc21tdV9jbWRxX2lzc3VlX2NtZChzbW11LCAmY21k KTsKKwl9Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBhcm1fc21tdV9wcmlxX3RocmVhZChpbnQg aXJxLCB2b2lkICpkZXYpCit7CisJc3RydWN0IGFybV9zbW11X2RldmljZSAqc21tdSA9IGRldjsK KwlzdHJ1Y3QgYXJtX3NtbXVfcXVldWUgKnEgPSAmc21tdS0+cHJpcS5xOworCXU2NCBldnRbUFJJ UV9FTlRfRFdPUkRTXTsKKworCWRvIHsKKwkJd2hpbGUgKCFxdWV1ZV9yZW1vdmVfcmF3KHEsIGV2 dCkpCisJCQlhcm1fc21tdV9oYW5kbGVfcHByKHNtbXUsIGV2dCk7CisKKwkJaWYgKHF1ZXVlX3N5 bmNfcHJvZChxKSA9PSAtRU9WRVJGTE9XKQorCQkJZGV2X2VycihzbW11LT5kZXYsICJQUklRIG92 ZXJmbG93IGRldGVjdGVkIC0tIHJlcXVlc3RzIGxvc3RcbiIpOworCX0gd2hpbGUgKCFxdWV1ZV9l bXB0eShxKSk7CisKKwkvKiBTeW5jIG91ciBvdmVyZmxvdyBmbGFnLCBhcyB3ZSBiZWxpZXZlIHdl J3JlIHVwIHRvIHNwZWVkICovCisJcS0+Y29ucyA9IFFfT1ZGKHEsIHEtPnByb2QpIHwgUV9XUlAo cSwgcS0+Y29ucykgfCBRX0lEWChxLCBxLT5jb25zKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9 CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBhcm1fc21tdV9jbWRxX3N5bmNfaGFuZGxlcihpbnQgaXJx LCB2b2lkICpkZXYpCit7CisJLyogV2UgZG9uJ3QgYWN0dWFsbHkgdXNlIENNRF9TWU5DIGludGVy cnVwdHMgZm9yIGFueXRoaW5nICovCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMg aW50IGFybV9zbW11X2RldmljZV9kaXNhYmxlKHN0cnVjdCBhcm1fc21tdV9kZXZpY2UgKnNtbXUp OworCitzdGF0aWMgaXJxcmV0dXJuX3QgYXJtX3NtbXVfZ2Vycm9yX2hhbmRsZXIoaW50IGlycSwg dm9pZCAqZGV2KQoreworCXUzMiBnZXJyb3IsIGdlcnJvcm4sIGFjdGl2ZTsKKwlzdHJ1Y3QgYXJt X3NtbXVfZGV2aWNlICpzbW11ID0gZGV2OworCisJZ2Vycm9yID0gcmVhZGxfcmVsYXhlZChzbW11 LT5iYXNlICsgQVJNX1NNTVVfR0VSUk9SKTsKKwlnZXJyb3JuID0gcmVhZGxfcmVsYXhlZChzbW11 LT5iYXNlICsgQVJNX1NNTVVfR0VSUk9STik7CisKKwlhY3RpdmUgPSBnZXJyb3IgXiBnZXJyb3Ju OworCWlmICghKGFjdGl2ZSAmIEdFUlJPUl9FUlJfTUFTSykpCisJCXJldHVybiBJUlFfTk9ORTsg LyogTm8gZXJyb3JzIHBlbmRpbmcgKi8KKworCWRldl93YXJuKHNtbXUtPmRldiwKKwkJICJ1bmV4 cGVjdGVkIGdsb2JhbCBlcnJvciByZXBvcnRlZCAoMHglMDh4KSwgdGhpcyBjb3VsZCBiZSBzZXJp b3VzXG4iLAorCQkgYWN0aXZlKTsKKworCWlmIChhY3RpdmUgJiBHRVJST1JfU0ZNX0VSUikgewor CQlkZXZfZXJyKHNtbXUtPmRldiwgImRldmljZSBoYXMgZW50ZXJlZCBTZXJ2aWNlIEZhaWx1cmUg TW9kZSFcbiIpOworCQlhcm1fc21tdV9kZXZpY2VfZGlzYWJsZShzbW11KTsKKwl9CisKKwlpZiAo YWN0aXZlICYgR0VSUk9SX01TSV9HRVJST1JfQUJUX0VSUikKKwkJZGV2X3dhcm4oc21tdS0+ZGV2 LCAiR0VSUk9SIE1TSSB3cml0ZSBhYm9ydGVkXG4iKTsKKworCWlmIChhY3RpdmUgJiBHRVJST1Jf TVNJX1BSSVFfQUJUX0VSUikKKwkJZGV2X3dhcm4oc21tdS0+ZGV2LCAiUFJJUSBNU0kgd3JpdGUg YWJvcnRlZFxuIik7CisKKwlpZiAoYWN0aXZlICYgR0VSUk9SX01TSV9FVlRRX0FCVF9FUlIpCisJ CWRldl93YXJuKHNtbXUtPmRldiwgIkVWVFEgTVNJIHdyaXRlIGFib3J0ZWRcbiIpOworCisJaWYg KGFjdGl2ZSAmIEdFUlJPUl9NU0lfQ01EUV9BQlRfRVJSKSB7CisJCWRldl93YXJuKHNtbXUtPmRl diwgIkNNRFEgTVNJIHdyaXRlIGFib3J0ZWRcbiIpOworCQlhcm1fc21tdV9jbWRxX3N5bmNfaGFu ZGxlcihpcnEsIHNtbXUtPmRldik7CisJfQorCisJaWYgKGFjdGl2ZSAmIEdFUlJPUl9QUklRX0FC VF9FUlIpCisJCWRldl9lcnIoc21tdS0+ZGV2LCAiUFJJUSB3cml0ZSBhYm9ydGVkIC0tIGV2ZW50 cyBtYXkgaGF2ZSBiZWVuIGxvc3RcbiIpOworCisJaWYgKGFjdGl2ZSAmIEdFUlJPUl9FVlRRX0FC VF9FUlIpCisJCWRldl9lcnIoc21tdS0+ZGV2LCAiRVZUUSB3cml0ZSBhYm9ydGVkIC0tIGV2ZW50 cyBtYXkgaGF2ZSBiZWVuIGxvc3RcbiIpOworCisJaWYgKGFjdGl2ZSAmIEdFUlJPUl9DTURRX0VS UikKKwkJYXJtX3NtbXVfY21kcV9za2lwX2VycihzbW11KTsKKworCXdyaXRlbChnZXJyb3IsIHNt bXUtPmJhc2UgKyBBUk1fU01NVV9HRVJST1JOKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisK Ky8qIElPX1BHVEFCTEUgQVBJICovCitzdGF0aWMgdm9pZCBfX2FybV9zbW11X3RsYl9zeW5jKHN0 cnVjdCBhcm1fc21tdV9kZXZpY2UgKnNtbXUpCit7CisJc3RydWN0IGFybV9zbW11X2NtZHFfZW50 IGNtZDsKKworCWNtZC5vcGNvZGUgPSBDTURRX09QX0NNRF9TWU5DOworCWFybV9zbW11X2NtZHFf aXNzdWVfY21kKHNtbXUsICZjbWQpOworfQorCitzdGF0aWMgdm9pZCBhcm1fc21tdV90bGJfc3lu Yyh2b2lkICpjb29raWUpCit7CisJc3RydWN0IGFybV9zbW11X2RvbWFpbiAqc21tdV9kb21haW4g PSBjb29raWU7CisJX19hcm1fc21tdV90bGJfc3luYyhzbW11X2RvbWFpbi0+c21tdSk7Cit9CisK K3N0YXRpYyB2b2lkIGFybV9zbW11X3RsYl9pbnZfY29udGV4dCh2b2lkICpjb29raWUpCit7CisJ c3RydWN0IGFybV9zbW11X2RvbWFpbiAqc21tdV9kb21haW4gPSBjb29raWU7CisJc3RydWN0IGFy bV9zbW11X2RldmljZSAqc21tdSA9IHNtbXVfZG9tYWluLT5zbW11OworCXN0cnVjdCBhcm1fc21t dV9jbWRxX2VudCBjbWQ7CisKKwlpZiAoc21tdV9kb21haW4tPnN0YWdlID09IEFSTV9TTU1VX0RP TUFJTl9TMSkgeworCQljbWQub3Bjb2RlCT0gQ01EUV9PUF9UTEJJX05IX0FTSUQ7CisJCWNtZC50 bGJpLmFzaWQJPSBzbW11X2RvbWFpbi0+czFfY2ZnLmNkLmFzaWQ7CisJCWNtZC50bGJpLnZtaWQJ PSAwOworCX0gZWxzZSB7CisJCWNtZC5vcGNvZGUJPSBDTURRX09QX1RMQklfUzEyX1ZNQUxMOwor CQljbWQudGxiaS52bWlkCT0gc21tdV9kb21haW4tPnMyX2NmZy52bWlkOworCX0KKworCWFybV9z bW11X2NtZHFfaXNzdWVfY21kKHNtbXUsICZjbWQpOworCV9fYXJtX3NtbXVfdGxiX3N5bmMoc21t dSk7Cit9CisKK3N0YXRpYyB2b2lkIGFybV9zbW11X3RsYl9pbnZfcmFuZ2Vfbm9zeW5jKHVuc2ln bmVkIGxvbmcgaW92YSwgc2l6ZV90IHNpemUsCisJCQkJCSAgc2l6ZV90IGdyYW51bGUsIGJvb2wg bGVhZiwgdm9pZCAqY29va2llKQoreworCXN0cnVjdCBhcm1fc21tdV9kb21haW4gKnNtbXVfZG9t YWluID0gY29va2llOworCXN0cnVjdCBhcm1fc21tdV9kZXZpY2UgKnNtbXUgPSBzbW11X2RvbWFp bi0+c21tdTsKKwlzdHJ1Y3QgYXJtX3NtbXVfY21kcV9lbnQgY21kID0geworCQkudGxiaSA9IHsK KwkJCS5sZWFmCT0gbGVhZiwKKwkJCS5hZGRyCT0gaW92YSwKKwkJfSwKKwl9OworCisJaWYgKHNt bXVfZG9tYWluLT5zdGFnZSA9PSBBUk1fU01NVV9ET01BSU5fUzEpIHsKKwkJY21kLm9wY29kZQk9 IENNRFFfT1BfVExCSV9OSF9WQTsKKwkJY21kLnRsYmkuYXNpZAk9IHNtbXVfZG9tYWluLT5zMV9j ZmcuY2QuYXNpZDsKKwl9IGVsc2UgeworCQljbWQub3Bjb2RlCT0gQ01EUV9PUF9UTEJJX1MyX0lQ QTsKKwkJY21kLnRsYmkudm1pZAk9IHNtbXVfZG9tYWluLT5zMl9jZmcudm1pZDsKKwl9CisKKwlk byB7CisJCWFybV9zbW11X2NtZHFfaXNzdWVfY21kKHNtbXUsICZjbWQpOworCQljbWQudGxiaS5h ZGRyICs9IGdyYW51bGU7CisJfSB3aGlsZSAoc2l6ZSAtPSBncmFudWxlKTsKK30KKworc3RhdGlj IGNvbnN0IHN0cnVjdCBpb21tdV9nYXRoZXJfb3BzIGFybV9zbW11X2dhdGhlcl9vcHMgPSB7CisJ LnRsYl9mbHVzaF9hbGwJPSBhcm1fc21tdV90bGJfaW52X2NvbnRleHQsCisJLnRsYl9hZGRfZmx1 c2gJPSBhcm1fc21tdV90bGJfaW52X3JhbmdlX25vc3luYywKKwkudGxiX3N5bmMJPSBhcm1fc21t dV90bGJfc3luYywKK307CisKKy8qIElPTU1VIEFQSSAqLworc3RhdGljIGJvb2wgYXJtX3NtbXVf Y2FwYWJsZShlbnVtIGlvbW11X2NhcCBjYXApCit7CisJc3dpdGNoIChjYXApIHsKKwljYXNlIElP TU1VX0NBUF9DQUNIRV9DT0hFUkVOQ1k6CisJCXJldHVybiB0cnVlOworCWNhc2UgSU9NTVVfQ0FQ X05PRVhFQzoKKwkJcmV0dXJuIHRydWU7CisJZGVmYXVsdDoKKwkJcmV0dXJuIGZhbHNlOworCX0K K30KKworc3RhdGljIHN0cnVjdCBpb21tdV9kb21haW4gKmFybV9zbW11X2RvbWFpbl9hbGxvYyh1 bnNpZ25lZCB0eXBlKQoreworCXN0cnVjdCBhcm1fc21tdV9kb21haW4gKnNtbXVfZG9tYWluOwor CisJaWYgKHR5cGUgIT0gSU9NTVVfRE9NQUlOX1VOTUFOQUdFRCAmJgorCSAgICB0eXBlICE9IElP TU1VX0RPTUFJTl9ETUEgJiYKKwkgICAgdHlwZSAhPSBJT01NVV9ET01BSU5fSURFTlRJVFkpCisJ CXJldHVybiBOVUxMOworCisJLyoKKwkgKiBBbGxvY2F0ZSB0aGUgZG9tYWluIGFuZCBpbml0aWFs aXNlIHNvbWUgb2YgaXRzIGRhdGEgc3RydWN0dXJlcy4KKwkgKiBXZSBjYW4ndCByZWFsbHkgZG8g YW55dGhpbmcgbWVhbmluZ2Z1bCB1bnRpbCB3ZSd2ZSBhZGRlZCBhCisJICogbWFzdGVyLgorCSAq LworCXNtbXVfZG9tYWluID0ga3phbGxvYyhzaXplb2YoKnNtbXVfZG9tYWluKSwgR0ZQX0tFUk5F TCk7CisJaWYgKCFzbW11X2RvbWFpbikKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAodHlwZSA9PSBJ T01NVV9ET01BSU5fRE1BICYmCisJICAgIGlvbW11X2dldF9kbWFfY29va2llKCZzbW11X2RvbWFp bi0+ZG9tYWluKSkgeworCQlrZnJlZShzbW11X2RvbWFpbik7CisJCXJldHVybiBOVUxMOworCX0K KworCW11dGV4X2luaXQoJnNtbXVfZG9tYWluLT5pbml0X211dGV4KTsKKwlzcGluX2xvY2tfaW5p dCgmc21tdV9kb21haW4tPnBndGJsX2xvY2spOworCXJldHVybiAmc21tdV9kb21haW4tPmRvbWFp bjsKK30KKworc3RhdGljIGludCBhcm1fc21tdV9iaXRtYXBfYWxsb2ModW5zaWduZWQgbG9uZyAq bWFwLCBpbnQgc3BhbikKK3sKKwlpbnQgaWR4LCBzaXplID0gMSA8PCBzcGFuOworCisJZG8gewor CQlpZHggPSBmaW5kX2ZpcnN0X3plcm9fYml0KG1hcCwgc2l6ZSk7CisJCWlmIChpZHggPT0gc2l6 ZSkKKwkJCXJldHVybiAtRU5PU1BDOworCX0gd2hpbGUgKHRlc3RfYW5kX3NldF9iaXQoaWR4LCBt YXApKTsKKworCXJldHVybiBpZHg7Cit9CisKK3N0YXRpYyB2b2lkIGFybV9zbW11X2JpdG1hcF9m cmVlKHVuc2lnbmVkIGxvbmcgKm1hcCwgaW50IGlkeCkKK3sKKwljbGVhcl9iaXQoaWR4LCBtYXAp OworfQorCitzdGF0aWMgdm9pZCBhcm1fc21tdV9kb21haW5fZnJlZShzdHJ1Y3QgaW9tbXVfZG9t YWluICpkb21haW4pCit7CisJc3RydWN0IGFybV9zbW11X2RvbWFpbiAqc21tdV9kb21haW4gPSB0 b19zbW11X2RvbWFpbihkb21haW4pOworCXN0cnVjdCBhcm1fc21tdV9kZXZpY2UgKnNtbXUgPSBz bW11X2RvbWFpbi0+c21tdTsKKworCWlvbW11X3B1dF9kbWFfY29va2llKGRvbWFpbik7CisJZnJl ZV9pb19wZ3RhYmxlX29wcyhzbW11X2RvbWFpbi0+cGd0Ymxfb3BzKTsKKworCS8qIEZyZWUgdGhl IENEIGFuZCBBU0lELCBpZiB3ZSBhbGxvY2F0ZWQgdGhlbSAqLworCWlmIChzbW11X2RvbWFpbi0+ c3RhZ2UgPT0gQVJNX1NNTVVfRE9NQUlOX1MxKSB7CisJCXN0cnVjdCBhcm1fc21tdV9zMV9jZmcg KmNmZyA9ICZzbW11X2RvbWFpbi0+czFfY2ZnOworCisJCWlmIChjZmctPmNkcHRyKSB7CisJCQlk bWFtX2ZyZWVfY29oZXJlbnQoc21tdV9kb21haW4tPnNtbXUtPmRldiwKKwkJCQkJICAgQ1RYREVT Q19DRF9EV09SRFMgPDwgMywKKwkJCQkJICAgY2ZnLT5jZHB0ciwKKwkJCQkJICAgY2ZnLT5jZHB0 cl9kbWEpOworCisJCQlhcm1fc21tdV9iaXRtYXBfZnJlZShzbW11LT5hc2lkX21hcCwgY2ZnLT5j ZC5hc2lkKTsKKwkJfQorCX0gZWxzZSB7CisJCXN0cnVjdCBhcm1fc21tdV9zMl9jZmcgKmNmZyA9 ICZzbW11X2RvbWFpbi0+czJfY2ZnOworCQlpZiAoY2ZnLT52bWlkKQorCQkJYXJtX3NtbXVfYml0 bWFwX2ZyZWUoc21tdS0+dm1pZF9tYXAsIGNmZy0+dm1pZCk7CisJfQorCisJa2ZyZWUoc21tdV9k b21haW4pOworfQorCitzdGF0aWMgaW50IGFybV9zbW11X2RvbWFpbl9maW5hbGlzZV9zMShzdHJ1 Y3QgYXJtX3NtbXVfZG9tYWluICpzbW11X2RvbWFpbiwKKwkJCQkgICAgICAgc3RydWN0IGlvX3Bn dGFibGVfY2ZnICpwZ3RibF9jZmcpCit7CisJaW50IHJldDsKKwlpbnQgYXNpZDsKKwlzdHJ1Y3Qg YXJtX3NtbXVfZGV2aWNlICpzbW11ID0gc21tdV9kb21haW4tPnNtbXU7CisJc3RydWN0IGFybV9z bW11X3MxX2NmZyAqY2ZnID0gJnNtbXVfZG9tYWluLT5zMV9jZmc7CisKKwlhc2lkID0gYXJtX3Nt bXVfYml0bWFwX2FsbG9jKHNtbXUtPmFzaWRfbWFwLCBzbW11LT5hc2lkX2JpdHMpOworCWlmIChh c2lkIDwgMCkKKwkJcmV0dXJuIGFzaWQ7CisKKwljZmctPmNkcHRyID0gZG1hbV9hbGxvY19jb2hl cmVudChzbW11LT5kZXYsIENUWERFU0NfQ0RfRFdPUkRTIDw8IDMsCisJCQkJCSAmY2ZnLT5jZHB0 cl9kbWEsCisJCQkJCSBHRlBfS0VSTkVMIHwgX19HRlBfWkVSTyk7CisJaWYgKCFjZmctPmNkcHRy KSB7CisJCWRldl93YXJuKHNtbXUtPmRldiwgImZhaWxlZCB0byBhbGxvY2F0ZSBjb250ZXh0IGRl c2NyaXB0b3JcbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dF9mcmVlX2FzaWQ7CisJ fQorCisJY2ZnLT5jZC5hc2lkCT0gKHUxNilhc2lkOworCWNmZy0+Y2QudHRicgk9IHBndGJsX2Nm Zy0+YXJtX2xwYWVfczFfY2ZnLnR0YnJbMF07CisJY2ZnLT5jZC50Y3IJPSBwZ3RibF9jZmctPmFy bV9scGFlX3MxX2NmZy50Y3I7CisJY2ZnLT5jZC5tYWlyCT0gcGd0YmxfY2ZnLT5hcm1fbHBhZV9z MV9jZmcubWFpclswXTsKKwlyZXR1cm4gMDsKKworb3V0X2ZyZWVfYXNpZDoKKwlhcm1fc21tdV9i aXRtYXBfZnJlZShzbW11LT5hc2lkX21hcCwgYXNpZCk7CisJcmV0dXJuIHJldDsKK30KKworc3Rh dGljIGludCBhcm1fc21tdV9kb21haW5fZmluYWxpc2VfczIoc3RydWN0IGFybV9zbW11X2RvbWFp biAqc21tdV9kb21haW4sCisJCQkJICAgICAgIHN0cnVjdCBpb19wZ3RhYmxlX2NmZyAqcGd0Ymxf Y2ZnKQoreworCWludCB2bWlkOworCXN0cnVjdCBhcm1fc21tdV9kZXZpY2UgKnNtbXUgPSBzbW11 X2RvbWFpbi0+c21tdTsKKwlzdHJ1Y3QgYXJtX3NtbXVfczJfY2ZnICpjZmcgPSAmc21tdV9kb21h aW4tPnMyX2NmZzsKKworCXZtaWQgPSBhcm1fc21tdV9iaXRtYXBfYWxsb2Moc21tdS0+dm1pZF9t YXAsIHNtbXUtPnZtaWRfYml0cyk7CisJaWYgKHZtaWQgPCAwKQorCQlyZXR1cm4gdm1pZDsKKwor CWNmZy0+dm1pZAk9ICh1MTYpdm1pZDsKKwljZmctPnZ0dGJyCT0gcGd0YmxfY2ZnLT5hcm1fbHBh ZV9zMl9jZmcudnR0YnI7CisJY2ZnLT52dGNyCT0gcGd0YmxfY2ZnLT5hcm1fbHBhZV9zMl9jZmcu dnRjcjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhcm1fc21tdV9kb21haW5fZmluYWxp c2Uoc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tYWluKQoreworCWludCByZXQ7CisJdW5zaWduZWQg bG9uZyBpYXMsIG9hczsKKwllbnVtIGlvX3BndGFibGVfZm10IGZtdDsKKwlzdHJ1Y3QgaW9fcGd0 YWJsZV9jZmcgcGd0YmxfY2ZnOworCXN0cnVjdCBpb19wZ3RhYmxlX29wcyAqcGd0Ymxfb3BzOwor CWludCAoKmZpbmFsaXNlX3N0YWdlX2ZuKShzdHJ1Y3QgYXJtX3NtbXVfZG9tYWluICosCisJCQkJ IHN0cnVjdCBpb19wZ3RhYmxlX2NmZyAqKTsKKwlzdHJ1Y3QgYXJtX3NtbXVfZG9tYWluICpzbW11 X2RvbWFpbiA9IHRvX3NtbXVfZG9tYWluKGRvbWFpbik7CisJc3RydWN0IGFybV9zbW11X2Rldmlj ZSAqc21tdSA9IHNtbXVfZG9tYWluLT5zbW11OworCisJaWYgKGRvbWFpbi0+dHlwZSA9PSBJT01N VV9ET01BSU5fSURFTlRJVFkpIHsKKwkJc21tdV9kb21haW4tPnN0YWdlID0gQVJNX1NNTVVfRE9N QUlOX0JZUEFTUzsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogUmVzdHJpY3QgdGhlIHN0YWdlIHRv IHdoYXQgd2UgY2FuIGFjdHVhbGx5IHN1cHBvcnQgKi8KKwlpZiAoIShzbW11LT5mZWF0dXJlcyAm IEFSTV9TTU1VX0ZFQVRfVFJBTlNfUzEpKQorCQlzbW11X2RvbWFpbi0+c3RhZ2UgPSBBUk1fU01N VV9ET01BSU5fUzI7CisJaWYgKCEoc21tdS0+ZmVhdHVyZXMgJiBBUk1fU01NVV9GRUFUX1RSQU5T X1MyKSkKKwkJc21tdV9kb21haW4tPnN0YWdlID0gQVJNX1NNTVVfRE9NQUlOX1MxOworCisJc3dp dGNoIChzbW11X2RvbWFpbi0+c3RhZ2UpIHsKKwljYXNlIEFSTV9TTU1VX0RPTUFJTl9TMToKKwkJ aWFzID0gVkFfQklUUzsKKwkJb2FzID0gc21tdS0+aWFzOworCQlmbXQgPSBBUk1fNjRfTFBBRV9T MTsKKwkJZmluYWxpc2Vfc3RhZ2VfZm4gPSBhcm1fc21tdV9kb21haW5fZmluYWxpc2VfczE7CisJ CWJyZWFrOworCWNhc2UgQVJNX1NNTVVfRE9NQUlOX05FU1RFRDoKKwljYXNlIEFSTV9TTU1VX0RP TUFJTl9TMjoKKwkJaWFzID0gc21tdS0+aWFzOworCQlvYXMgPSBzbW11LT5vYXM7CisJCWZtdCA9 IEFSTV82NF9MUEFFX1MyOworCQlmaW5hbGlzZV9zdGFnZV9mbiA9IGFybV9zbW11X2RvbWFpbl9m aW5hbGlzZV9zMjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQor CisJcGd0YmxfY2ZnID0gKHN0cnVjdCBpb19wZ3RhYmxlX2NmZykgeworCQkucGdzaXplX2JpdG1h cAk9IHNtbXUtPnBnc2l6ZV9iaXRtYXAsCisJCS5pYXMJCT0gaWFzLAorCQkub2FzCQk9IG9hcywK KwkJLnRsYgkJPSAmYXJtX3NtbXVfZ2F0aGVyX29wcywKKwkJLmlvbW11X2Rldgk9IHNtbXUtPmRl diwKKwl9OworCisJcGd0Ymxfb3BzID0gYWxsb2NfaW9fcGd0YWJsZV9vcHMoZm10LCAmcGd0Ymxf Y2ZnLCBzbW11X2RvbWFpbik7CisJaWYgKCFwZ3RibF9vcHMpCisJCXJldHVybiAtRU5PTUVNOwor CisJZG9tYWluLT5wZ3NpemVfYml0bWFwID0gcGd0YmxfY2ZnLnBnc2l6ZV9iaXRtYXA7CisJZG9t YWluLT5nZW9tZXRyeS5hcGVydHVyZV9lbmQgPSAoMVVMIDw8IGlhcykgLSAxOworCWRvbWFpbi0+ Z2VvbWV0cnkuZm9yY2VfYXBlcnR1cmUgPSB0cnVlOworCXNtbXVfZG9tYWluLT5wZ3RibF9vcHMg PSBwZ3RibF9vcHM7CisKKwlyZXQgPSBmaW5hbGlzZV9zdGFnZV9mbihzbW11X2RvbWFpbiwgJnBn dGJsX2NmZyk7CisJaWYgKHJldCA8IDApCisJCWZyZWVfaW9fcGd0YWJsZV9vcHMocGd0Ymxfb3Bz KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBfX2xlNjQgKmFybV9zbW11X2dldF9zdGVw X2Zvcl9zaWQoc3RydWN0IGFybV9zbW11X2RldmljZSAqc21tdSwgdTMyIHNpZCkKK3sKKwlfX2xl NjQgKnN0ZXA7CisJc3RydWN0IGFybV9zbW11X3N0cnRhYl9jZmcgKmNmZyA9ICZzbW11LT5zdHJ0 YWJfY2ZnOworCisJaWYgKHNtbXUtPmZlYXR1cmVzICYgQVJNX1NNTVVfRkVBVF8yX0xWTF9TVFJU QUIpIHsKKwkJc3RydWN0IGFybV9zbW11X3N0cnRhYl9sMV9kZXNjICpsMV9kZXNjOworCQlpbnQg aWR4OworCisJCS8qIFR3by1sZXZlbCB3YWxrICovCisJCWlkeCA9IChzaWQgPj4gU1RSVEFCX1NQ TElUKSAqIFNUUlRBQl9MMV9ERVNDX0RXT1JEUzsKKwkJbDFfZGVzYyA9ICZjZmctPmwxX2Rlc2Nb aWR4XTsKKwkJaWR4ID0gKHNpZCAmICgoMSA8PCBTVFJUQUJfU1BMSVQpIC0gMSkpICogU1RSVEFC X1NURV9EV09SRFM7CisJCXN0ZXAgPSAmbDFfZGVzYy0+bDJwdHJbaWR4XTsKKwl9IGVsc2Ugewor CQkvKiBTaW1wbGUgbGluZWFyIGxvb2t1cCAqLworCQlzdGVwID0gJmNmZy0+c3RydGFiW3NpZCAq IFNUUlRBQl9TVEVfRFdPUkRTXTsKKwl9CisKKwlyZXR1cm4gc3RlcDsKK30KKworc3RhdGljIHZv aWQgYXJtX3NtbXVfaW5zdGFsbF9zdGVfZm9yX2RldihzdHJ1Y3QgaW9tbXVfZndzcGVjICpmd3Nw ZWMpCit7CisJaW50IGk7CisJc3RydWN0IGFybV9zbW11X21hc3Rlcl9kYXRhICptYXN0ZXIgPSBm d3NwZWMtPmlvbW11X3ByaXY7CisJc3RydWN0IGFybV9zbW11X2RldmljZSAqc21tdSA9IG1hc3Rl ci0+c21tdTsKKworCWZvciAoaSA9IDA7IGkgPCBmd3NwZWMtPm51bV9pZHM7ICsraSkgeworCQl1 MzIgc2lkID0gZndzcGVjLT5pZHNbaV07CisJCV9fbGU2NCAqc3RlcCA9IGFybV9zbW11X2dldF9z dGVwX2Zvcl9zaWQoc21tdSwgc2lkKTsKKworCQlhcm1fc21tdV93cml0ZV9zdHJ0YWJfZW50KHNt bXUsIHNpZCwgc3RlcCwgJm1hc3Rlci0+c3RlKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGFybV9z bW11X2RldGFjaF9kZXYoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBhcm1fc21tdV9t YXN0ZXJfZGF0YSAqbWFzdGVyID0gZGV2LT5pb21tdV9md3NwZWMtPmlvbW11X3ByaXY7CisKKwlt YXN0ZXItPnN0ZS5hc3NpZ25lZCA9IGZhbHNlOworCWFybV9zbW11X2luc3RhbGxfc3RlX2Zvcl9k ZXYoZGV2LT5pb21tdV9md3NwZWMpOworfQorCitzdGF0aWMgaW50IGFybV9zbW11X2F0dGFjaF9k ZXYoc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tYWluLCBzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJ aW50IHJldCA9IDA7CisJc3RydWN0IGFybV9zbW11X2RldmljZSAqc21tdTsKKwlzdHJ1Y3QgYXJt X3NtbXVfZG9tYWluICpzbW11X2RvbWFpbiA9IHRvX3NtbXVfZG9tYWluKGRvbWFpbik7CisJc3Ry dWN0IGFybV9zbW11X21hc3Rlcl9kYXRhICptYXN0ZXI7CisJc3RydWN0IGFybV9zbW11X3N0cnRh Yl9lbnQgKnN0ZTsKKworCWlmICghZGV2LT5pb21tdV9md3NwZWMpCisJCXJldHVybiAtRU5PRU5U OworCisJbWFzdGVyID0gZGV2LT5pb21tdV9md3NwZWMtPmlvbW11X3ByaXY7CisJc21tdSA9IG1h c3Rlci0+c21tdTsKKwlzdGUgPSAmbWFzdGVyLT5zdGU7CisKKwkvKiBBbHJlYWR5IGF0dGFjaGVk IHRvIGEgZGlmZmVyZW50IGRvbWFpbj8gKi8KKwlpZiAoc3RlLT5hc3NpZ25lZCkKKwkJYXJtX3Nt bXVfZGV0YWNoX2RldihkZXYpOworCisJbXV0ZXhfbG9jaygmc21tdV9kb21haW4tPmluaXRfbXV0 ZXgpOworCisJaWYgKCFzbW11X2RvbWFpbi0+c21tdSkgeworCQlzbW11X2RvbWFpbi0+c21tdSA9 IHNtbXU7CisJCXJldCA9IGFybV9zbW11X2RvbWFpbl9maW5hbGlzZShkb21haW4pOworCQlpZiAo cmV0KSB7CisJCQlzbW11X2RvbWFpbi0+c21tdSA9IE5VTEw7CisJCQlnb3RvIG91dF91bmxvY2s7 CisJCX0KKwl9IGVsc2UgaWYgKHNtbXVfZG9tYWluLT5zbW11ICE9IHNtbXUpIHsKKwkJZGV2X2Vy cihkZXYsCisJCQkiY2Fubm90IGF0dGFjaCB0byBTTU1VICVzICh1cHN0cmVhbSBvZiAlcylcbiIs CisJCQlkZXZfbmFtZShzbW11X2RvbWFpbi0+c21tdS0+ZGV2KSwKKwkJCWRldl9uYW1lKHNtbXUt PmRldikpOworCQlyZXQgPSAtRU5YSU87CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKwlzdGUt PmFzc2lnbmVkID0gdHJ1ZTsKKworCWlmIChzbW11X2RvbWFpbi0+c3RhZ2UgPT0gQVJNX1NNTVVf RE9NQUlOX0JZUEFTUykgeworCQlzdGUtPnMxX2NmZyA9IE5VTEw7CisJCXN0ZS0+czJfY2ZnID0g TlVMTDsKKwl9IGVsc2UgaWYgKHNtbXVfZG9tYWluLT5zdGFnZSA9PSBBUk1fU01NVV9ET01BSU5f UzEpIHsKKwkJc3RlLT5zMV9jZmcgPSAmc21tdV9kb21haW4tPnMxX2NmZzsKKwkJc3RlLT5zMl9j ZmcgPSBOVUxMOworCQlhcm1fc21tdV93cml0ZV9jdHhfZGVzYyhzbW11LCBzdGUtPnMxX2NmZyk7 CisJfSBlbHNlIHsKKwkJc3RlLT5zMV9jZmcgPSBOVUxMOworCQlzdGUtPnMyX2NmZyA9ICZzbW11 X2RvbWFpbi0+czJfY2ZnOworCX0KKworCWFybV9zbW11X2luc3RhbGxfc3RlX2Zvcl9kZXYoZGV2 LT5pb21tdV9md3NwZWMpOworb3V0X3VubG9jazoKKwltdXRleF91bmxvY2soJnNtbXVfZG9tYWlu LT5pbml0X211dGV4KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFybV9zbW11X21h cChzdHJ1Y3QgaW9tbXVfZG9tYWluICpkb21haW4sIHVuc2lnbmVkIGxvbmcgaW92YSwKKwkJCXBo eXNfYWRkcl90IHBhZGRyLCBzaXplX3Qgc2l6ZSwgaW50IHByb3QpCit7CisJaW50IHJldDsKKwl1 bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBhcm1fc21tdV9kb21haW4gKnNtbXVfZG9tYWlu ID0gdG9fc21tdV9kb21haW4oZG9tYWluKTsKKwlzdHJ1Y3QgaW9fcGd0YWJsZV9vcHMgKm9wcyA9 IHNtbXVfZG9tYWluLT5wZ3RibF9vcHM7CisKKwlpZiAoIW9wcykKKwkJcmV0dXJuIC1FTk9ERVY7 CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc21tdV9kb21haW4tPnBndGJsX2xvY2ssIGZsYWdzKTsK KwlyZXQgPSBvcHMtPm1hcChvcHMsIGlvdmEsIHBhZGRyLCBzaXplLCBwcm90KTsKKwlzcGluX3Vu bG9ja19pcnFyZXN0b3JlKCZzbW11X2RvbWFpbi0+cGd0YmxfbG9jaywgZmxhZ3MpOworCXJldHVy biByZXQ7Cit9CisKK3N0YXRpYyBzaXplX3QKK2FybV9zbW11X3VubWFwKHN0cnVjdCBpb21tdV9k b21haW4gKmRvbWFpbiwgdW5zaWduZWQgbG9uZyBpb3ZhLCBzaXplX3Qgc2l6ZSkKK3sKKwlzaXpl X3QgcmV0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGFybV9zbW11X2RvbWFpbiAq c21tdV9kb21haW4gPSB0b19zbW11X2RvbWFpbihkb21haW4pOworCXN0cnVjdCBpb19wZ3RhYmxl X29wcyAqb3BzID0gc21tdV9kb21haW4tPnBndGJsX29wczsKKworCWlmICghb3BzKQorCQlyZXR1 cm4gMDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzbW11X2RvbWFpbi0+cGd0YmxfbG9jaywgZmxh Z3MpOworCXJldCA9IG9wcy0+dW5tYXAob3BzLCBpb3ZhLCBzaXplKTsKKwlzcGluX3VubG9ja19p cnFyZXN0b3JlKCZzbW11X2RvbWFpbi0+cGd0YmxfbG9jaywgZmxhZ3MpOworCXJldHVybiByZXQ7 Cit9CisKK3N0YXRpYyBwaHlzX2FkZHJfdAorYXJtX3NtbXVfaW92YV90b19waHlzKHN0cnVjdCBp b21tdV9kb21haW4gKmRvbWFpbiwgZG1hX2FkZHJfdCBpb3ZhKQoreworCXBoeXNfYWRkcl90IHJl dDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBhcm1fc21tdV9kb21haW4gKnNtbXVf ZG9tYWluID0gdG9fc21tdV9kb21haW4oZG9tYWluKTsKKwlzdHJ1Y3QgaW9fcGd0YWJsZV9vcHMg Km9wcyA9IHNtbXVfZG9tYWluLT5wZ3RibF9vcHM7CisKKwlpZiAoZG9tYWluLT50eXBlID09IElP TU1VX0RPTUFJTl9JREVOVElUWSkKKwkJcmV0dXJuIGlvdmE7CisKKwlpZiAoIW9wcykKKwkJcmV0 dXJuIDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc21tdV9kb21haW4tPnBndGJsX2xvY2ssIGZs YWdzKTsKKwlyZXQgPSBvcHMtPmlvdmFfdG9fcGh5cyhvcHMsIGlvdmEpOworCXNwaW5fdW5sb2Nr X2lycXJlc3RvcmUoJnNtbXVfZG9tYWluLT5wZ3RibF9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4g cmV0OworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBhcm1fc21tdV9kcml2ZXI7 CisKK3N0YXRpYyBpbnQgYXJtX3NtbXVfbWF0Y2hfbm9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHZv aWQgKmRhdGEpCit7CisJcmV0dXJuIGRldi0+Zndub2RlID09IGRhdGE7Cit9CisKK3N0YXRpYwor c3RydWN0IGFybV9zbW11X2RldmljZSAqYXJtX3NtbXVfZ2V0X2J5X2Z3bm9kZShzdHJ1Y3QgZndu b2RlX2hhbmRsZSAqZndub2RlKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGRyaXZlcl9maW5k X2RldmljZSgmYXJtX3NtbXVfZHJpdmVyLmRyaXZlciwgTlVMTCwKKwkJCQkJCWZ3bm9kZSwgYXJt X3NtbXVfbWF0Y2hfbm9kZSk7CisJcHV0X2RldmljZShkZXYpOworCXJldHVybiBkZXYgPyBkZXZf Z2V0X2RydmRhdGEoZGV2KSA6IE5VTEw7Cit9CisKK3N0YXRpYyBib29sIGFybV9zbW11X3NpZF9p bl9yYW5nZShzdHJ1Y3QgYXJtX3NtbXVfZGV2aWNlICpzbW11LCB1MzIgc2lkKQoreworCXVuc2ln bmVkIGxvbmcgbGltaXQgPSBzbW11LT5zdHJ0YWJfY2ZnLm51bV9sMV9lbnRzOworCisJaWYgKHNt bXUtPmZlYXR1cmVzICYgQVJNX1NNTVVfRkVBVF8yX0xWTF9TVFJUQUIpCisJCWxpbWl0ICo9IDFV TCA8PCBTVFJUQUJfU1BMSVQ7CisKKwlyZXR1cm4gc2lkIDwgbGltaXQ7Cit9CisKK3N0YXRpYyBz dHJ1Y3QgaW9tbXVfb3BzIGFybV9zbW11X29wczsKKworc3RhdGljIGludCBhcm1fc21tdV9hZGRf ZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpbnQgaSwgcmV0OworCXN0cnVjdCBhcm1f c21tdV9kZXZpY2UgKnNtbXU7CisJc3RydWN0IGFybV9zbW11X21hc3Rlcl9kYXRhICptYXN0ZXI7 CisJc3RydWN0IGlvbW11X2Z3c3BlYyAqZndzcGVjID0gZGV2LT5pb21tdV9md3NwZWM7CisJc3Ry dWN0IGlvbW11X2dyb3VwICpncm91cDsKKworCWlmICghZndzcGVjIHx8IGZ3c3BlYy0+b3BzICE9 ICZhcm1fc21tdV9vcHMpCisJCXJldHVybiAtRU5PREVWOworCS8qCisJICogV2UgX2Nhbl8gYWN0 dWFsbHkgd2l0aHN0YW5kIGRvZGd5IGJ1cyBjb2RlIHJlLWNhbGxpbmcgYWRkX2RldmljZSgpCisJ ICogd2l0aG91dCBhbiBpbnRlcnZlbmluZyByZW1vdmVfZGV2aWNlKCkvb2ZfeGxhdGUoKSBzZXF1 ZW5jZSwgYnV0CisJICogd2UncmUgbm90IGdvaW5nIHRvIGRvIHNvIHF1aWV0bHkuLi4KKwkgKi8K KwlpZiAoV0FSTl9PTl9PTkNFKGZ3c3BlYy0+aW9tbXVfcHJpdikpIHsKKwkJbWFzdGVyID0gZndz cGVjLT5pb21tdV9wcml2OworCQlzbW11ID0gbWFzdGVyLT5zbW11OworCX0gZWxzZSB7CisJCXNt bXUgPSBhcm1fc21tdV9nZXRfYnlfZndub2RlKGZ3c3BlYy0+aW9tbXVfZndub2RlKTsKKwkJaWYg KCFzbW11KQorCQkJcmV0dXJuIC1FTk9ERVY7CisJCW1hc3RlciA9IGt6YWxsb2Moc2l6ZW9mKCpt YXN0ZXIpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFtYXN0ZXIpCisJCQlyZXR1cm4gLUVOT01FTTsK KworCQltYXN0ZXItPnNtbXUgPSBzbW11OworCQlmd3NwZWMtPmlvbW11X3ByaXYgPSBtYXN0ZXI7 CisJfQorCisJLyogQ2hlY2sgdGhlIFNJRHMgYXJlIGluIHJhbmdlIG9mIHRoZSBTTU1VIGFuZCBv dXIgc3RyZWFtIHRhYmxlICovCisJZm9yIChpID0gMDsgaSA8IGZ3c3BlYy0+bnVtX2lkczsgaSsr KSB7CisJCXUzMiBzaWQgPSBmd3NwZWMtPmlkc1tpXTsKKworCQlpZiAoIWFybV9zbW11X3NpZF9p bl9yYW5nZShzbW11LCBzaWQpKQorCQkJcmV0dXJuIC1FUkFOR0U7CisKKwkJLyogRW5zdXJlIGwy IHN0cnRhYiBpcyBpbml0aWFsaXNlZCAqLworCQlpZiAoc21tdS0+ZmVhdHVyZXMgJiBBUk1fU01N VV9GRUFUXzJfTFZMX1NUUlRBQikgeworCQkJcmV0ID0gYXJtX3NtbXVfaW5pdF9sMl9zdHJ0YWIo c21tdSwgc2lkKTsKKwkJCWlmIChyZXQpCisJCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCWdy b3VwID0gaW9tbXVfZ3JvdXBfZ2V0X2Zvcl9kZXYoZGV2KTsKKwlpZiAoIUlTX0VSUihncm91cCkp IHsKKwkJaW9tbXVfZ3JvdXBfcHV0KGdyb3VwKTsKKwkJaW9tbXVfZGV2aWNlX2xpbmsoJnNtbXUt PmlvbW11LCBkZXYpOworCX0KKworCXJldHVybiBQVFJfRVJSX09SX1pFUk8oZ3JvdXApOworfQor CitzdGF0aWMgdm9pZCBhcm1fc21tdV9yZW1vdmVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikK K3sKKwlzdHJ1Y3QgaW9tbXVfZndzcGVjICpmd3NwZWMgPSBkZXYtPmlvbW11X2Z3c3BlYzsKKwlz dHJ1Y3QgYXJtX3NtbXVfbWFzdGVyX2RhdGEgKm1hc3RlcjsKKwlzdHJ1Y3QgYXJtX3NtbXVfZGV2 aWNlICpzbW11OworCisJaWYgKCFmd3NwZWMgfHwgZndzcGVjLT5vcHMgIT0gJmFybV9zbW11X29w cykKKwkJcmV0dXJuOworCisJbWFzdGVyID0gZndzcGVjLT5pb21tdV9wcml2OworCXNtbXUgPSBt YXN0ZXItPnNtbXU7CisJaWYgKG1hc3RlciAmJiBtYXN0ZXItPnN0ZS5hc3NpZ25lZCkKKwkJYXJt X3NtbXVfZGV0YWNoX2RldihkZXYpOworCWlvbW11X2dyb3VwX3JlbW92ZV9kZXZpY2UoZGV2KTsK Kwlpb21tdV9kZXZpY2VfdW5saW5rKCZzbW11LT5pb21tdSwgZGV2KTsKKwlrZnJlZShtYXN0ZXIp OworCWlvbW11X2Z3c3BlY19mcmVlKGRldik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaW9tbXVfZ3Jv dXAgKmFybV9zbW11X2RldmljZV9ncm91cChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0 IGlvbW11X2dyb3VwICpncm91cDsKKworCS8qCisJICogV2UgZG9uJ3Qgc3VwcG9ydCBkZXZpY2Vz IHNoYXJpbmcgc3RyZWFtIElEcyBvdGhlciB0aGFuIFBDSSBSSUQKKwkgKiBhbGlhc2VzLCBzaW5j ZSB0aGUgbmVjZXNzYXJ5IElELXRvLWRldmljZSBsb29rdXAgYmVjb21lcyByYXRoZXIKKwkgKiBp bXByYWN0aWNhbCBnaXZlbiBhIHBvdGVudGlhbCBzcGFyc2UgMzItYml0IHN0cmVhbSBJRCBzcGFj ZS4KKwkgKi8KKwlpZiAoZGV2X2lzX3BjaShkZXYpKQorCQlncm91cCA9IHBjaV9kZXZpY2VfZ3Jv dXAoZGV2KTsKKwllbHNlCisJCWdyb3VwID0gZ2VuZXJpY19kZXZpY2VfZ3JvdXAoZGV2KTsKKwor CXJldHVybiBncm91cDsKK30KKworc3RhdGljIGludCBhcm1fc21tdV9kb21haW5fZ2V0X2F0dHIo c3RydWN0IGlvbW11X2RvbWFpbiAqZG9tYWluLAorCQkJCSAgICBlbnVtIGlvbW11X2F0dHIgYXR0 ciwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgYXJtX3NtbXVfZG9tYWluICpzbW11X2RvbWFpbiA9 IHRvX3NtbXVfZG9tYWluKGRvbWFpbik7CisKKwlpZiAoZG9tYWluLT50eXBlICE9IElPTU1VX0RP TUFJTl9VTk1BTkFHRUQpCisJCXJldHVybiAtRUlOVkFMOworCisJc3dpdGNoIChhdHRyKSB7CisJ Y2FzZSBET01BSU5fQVRUUl9ORVNUSU5HOgorCQkqKGludCAqKWRhdGEgPSAoc21tdV9kb21haW4t PnN0YWdlID09IEFSTV9TTU1VX0RPTUFJTl9ORVNURUQpOworCQlyZXR1cm4gMDsKKwlkZWZhdWx0 OgorCQlyZXR1cm4gLUVOT0RFVjsKKwl9Cit9CisKK3N0YXRpYyBpbnQgYXJtX3NtbXVfZG9tYWlu X3NldF9hdHRyKHN0cnVjdCBpb21tdV9kb21haW4gKmRvbWFpbiwKKwkJCQkgICAgZW51bSBpb21t dV9hdHRyIGF0dHIsIHZvaWQgKmRhdGEpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGFybV9z bW11X2RvbWFpbiAqc21tdV9kb21haW4gPSB0b19zbW11X2RvbWFpbihkb21haW4pOworCisJaWYg KGRvbWFpbi0+dHlwZSAhPSBJT01NVV9ET01BSU5fVU5NQU5BR0VEKQorCQlyZXR1cm4gLUVJTlZB TDsKKworCW11dGV4X2xvY2soJnNtbXVfZG9tYWluLT5pbml0X211dGV4KTsKKworCXN3aXRjaCAo YXR0cikgeworCWNhc2UgRE9NQUlOX0FUVFJfTkVTVElORzoKKwkJaWYgKHNtbXVfZG9tYWluLT5z bW11KSB7CisJCQlyZXQgPSAtRVBFUk07CisJCQlnb3RvIG91dF91bmxvY2s7CisJCX0KKworCQlp ZiAoKihpbnQgKilkYXRhKQorCQkJc21tdV9kb21haW4tPnN0YWdlID0gQVJNX1NNTVVfRE9NQUlO X05FU1RFRDsKKwkJZWxzZQorCQkJc21tdV9kb21haW4tPnN0YWdlID0gQVJNX1NNTVVfRE9NQUlO X1MxOworCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FTk9ERVY7CisJfQorCitvdXRf dW5sb2NrOgorCW11dGV4X3VubG9jaygmc21tdV9kb21haW4tPmluaXRfbXV0ZXgpOworCXJldHVy biByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYXJtX3NtbXVfb2ZfeGxhdGUoc3RydWN0IGRldmljZSAq ZGV2LCBzdHJ1Y3Qgb2ZfcGhhbmRsZV9hcmdzICphcmdzKQoreworCXJldHVybiBpb21tdV9md3Nw ZWNfYWRkX2lkcyhkZXYsIGFyZ3MtPmFyZ3MsIDEpOworfQorCitzdGF0aWMgdm9pZCBhcm1fc21t dV9nZXRfcmVzdl9yZWdpb25zKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgICBzdHJ1Y3Qg bGlzdF9oZWFkICpoZWFkKQoreworCXN0cnVjdCBpb21tdV9yZXN2X3JlZ2lvbiAqcmVnaW9uOwor CWludCBwcm90ID0gSU9NTVVfV1JJVEUgfCBJT01NVV9OT0VYRUMgfCBJT01NVV9NTUlPOworCisJ cmVnaW9uID0gaW9tbXVfYWxsb2NfcmVzdl9yZWdpb24oTVNJX0lPVkFfQkFTRSwgTVNJX0lPVkFf TEVOR1RILAorCQkJCQkgcHJvdCwgSU9NTVVfUkVTVl9TV19NU0kpOworCWlmICghcmVnaW9uKQor CQlyZXR1cm47CisKKwlsaXN0X2FkZF90YWlsKCZyZWdpb24tPmxpc3QsIGhlYWQpOworCisJaW9t bXVfZG1hX2dldF9yZXN2X3JlZ2lvbnMoZGV2LCBoZWFkKTsKK30KKworc3RhdGljIHZvaWQgYXJt X3NtbXVfcHV0X3Jlc3ZfcmVnaW9ucyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICAgc3Ry dWN0IGxpc3RfaGVhZCAqaGVhZCkKK3sKKwlzdHJ1Y3QgaW9tbXVfcmVzdl9yZWdpb24gKmVudHJ5 LCAqbmV4dDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShlbnRyeSwgbmV4dCwgaGVhZCwg bGlzdCkKKwkJa2ZyZWUoZW50cnkpOworfQorCitzdGF0aWMgc3RydWN0IGlvbW11X29wcyBhcm1f c21tdV9vcHMgPSB7CisJLmNhcGFibGUJCT0gYXJtX3NtbXVfY2FwYWJsZSwKKwkuZG9tYWluX2Fs bG9jCQk9IGFybV9zbW11X2RvbWFpbl9hbGxvYywKKwkuZG9tYWluX2ZyZWUJCT0gYXJtX3NtbXVf ZG9tYWluX2ZyZWUsCisJLmF0dGFjaF9kZXYJCT0gYXJtX3NtbXVfYXR0YWNoX2RldiwKKwkubWFw CQkJPSBhcm1fc21tdV9tYXAsCisJLnVubWFwCQkJPSBhcm1fc21tdV91bm1hcCwKKwkubWFwX3Nn CQkJPSBkZWZhdWx0X2lvbW11X21hcF9zZywKKwkuaW92YV90b19waHlzCQk9IGFybV9zbW11X2lv dmFfdG9fcGh5cywKKwkuYWRkX2RldmljZQkJPSBhcm1fc21tdV9hZGRfZGV2aWNlLAorCS5yZW1v dmVfZGV2aWNlCQk9IGFybV9zbW11X3JlbW92ZV9kZXZpY2UsCisJLmRldmljZV9ncm91cAkJPSBh cm1fc21tdV9kZXZpY2VfZ3JvdXAsCisJLmRvbWFpbl9nZXRfYXR0cgk9IGFybV9zbW11X2RvbWFp bl9nZXRfYXR0ciwKKwkuZG9tYWluX3NldF9hdHRyCT0gYXJtX3NtbXVfZG9tYWluX3NldF9hdHRy LAorCS5vZl94bGF0ZQkJPSBhcm1fc21tdV9vZl94bGF0ZSwKKwkuZ2V0X3Jlc3ZfcmVnaW9ucwk9 IGFybV9zbW11X2dldF9yZXN2X3JlZ2lvbnMsCisJLnB1dF9yZXN2X3JlZ2lvbnMJPSBhcm1fc21t dV9wdXRfcmVzdl9yZWdpb25zLAorCS5wZ3NpemVfYml0bWFwCQk9IC0xVUwsIC8qIFJlc3RyaWN0 ZWQgZHVyaW5nIGRldmljZSBhdHRhY2ggKi8KK307CisKKy8qIFByb2JpbmcgYW5kIGluaXRpYWxp c2F0aW9uIGZ1bmN0aW9ucyAqLworc3RhdGljIGludCBhcm1fc21tdV9pbml0X29uZV9xdWV1ZShz dHJ1Y3QgYXJtX3NtbXVfZGV2aWNlICpzbW11LAorCQkJCSAgIHN0cnVjdCBhcm1fc21tdV9xdWV1 ZSAqcSwKKwkJCQkgICB1bnNpZ25lZCBsb25nIHByb2Rfb2ZmLAorCQkJCSAgIHVuc2lnbmVkIGxv bmcgY29uc19vZmYsCisJCQkJICAgc2l6ZV90IGR3b3JkcykKK3sKKwlzaXplX3QgcXN6ID0gKCgx IDw8IHEtPm1heF9uX3NoaWZ0KSAqIGR3b3JkcykgPDwgMzsKKworCXEtPmJhc2UgPSBkbWFtX2Fs bG9jX2NvaGVyZW50KHNtbXUtPmRldiwgcXN6LCAmcS0+YmFzZV9kbWEsIEdGUF9LRVJORUwpOwor CWlmICghcS0+YmFzZSkgeworCQlkZXZfZXJyKHNtbXUtPmRldiwgImZhaWxlZCB0byBhbGxvY2F0 ZSBxdWV1ZSAoMHglenggYnl0ZXMpXG4iLAorCQkJcXN6KTsKKwkJcmV0dXJuIC1FTk9NRU07CisJ fQorCisJcS0+cHJvZF9yZWcJPSBzbW11LT5iYXNlICsgcHJvZF9vZmY7CisJcS0+Y29uc19yZWcJ PSBzbW11LT5iYXNlICsgY29uc19vZmY7CisJcS0+ZW50X2R3b3Jkcwk9IGR3b3JkczsKKworCXEt PnFfYmFzZSAgPSBRX0JBU0VfUldBOworCXEtPnFfYmFzZSB8PSBxLT5iYXNlX2RtYSAmIFFfQkFT RV9BRERSX01BU0sgPDwgUV9CQVNFX0FERFJfU0hJRlQ7CisJcS0+cV9iYXNlIHw9IChxLT5tYXhf bl9zaGlmdCAmIFFfQkFTRV9MT0cyU0laRV9NQVNLKQorCQkgICAgIDw8IFFfQkFTRV9MT0cyU0la RV9TSElGVDsKKworCXEtPnByb2QgPSBxLT5jb25zID0gMDsKKwlyZXR1cm4gMDsKK30KKworc3Rh dGljIGludCBhcm1fc21tdV9pbml0X3F1ZXVlcyhzdHJ1Y3QgYXJtX3NtbXVfZGV2aWNlICpzbW11 KQoreworCWludCByZXQ7CisKKwkvKiBjbWRxICovCisJc3Bpbl9sb2NrX2luaXQoJnNtbXUtPmNt ZHEubG9jayk7CisJcmV0ID0gYXJtX3NtbXVfaW5pdF9vbmVfcXVldWUoc21tdSwgJnNtbXUtPmNt ZHEucSwgQVJNX1NNTVVfQ01EUV9QUk9ELAorCQkJCSAgICAgIEFSTV9TTU1VX0NNRFFfQ09OUywg Q01EUV9FTlRfRFdPUkRTKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogZXZ0cSAq LworCXJldCA9IGFybV9zbW11X2luaXRfb25lX3F1ZXVlKHNtbXUsICZzbW11LT5ldnRxLnEsIEFS TV9TTU1VX0VWVFFfUFJPRCwKKwkJCQkgICAgICBBUk1fU01NVV9FVlRRX0NPTlMsIEVWVFFfRU5U X0RXT1JEUyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qIHByaXEgKi8KKwlpZiAo IShzbW11LT5mZWF0dXJlcyAmIEFSTV9TTU1VX0ZFQVRfUFJJKSkKKwkJcmV0dXJuIDA7CisKKwly ZXR1cm4gYXJtX3NtbXVfaW5pdF9vbmVfcXVldWUoc21tdSwgJnNtbXUtPnByaXEucSwgQVJNX1NN TVVfUFJJUV9QUk9ELAorCQkJCSAgICAgICBBUk1fU01NVV9QUklRX0NPTlMsIFBSSVFfRU5UX0RX T1JEUyk7Cit9CisKK3N0YXRpYyBpbnQgYXJtX3NtbXVfaW5pdF9sMV9zdHJ0YWIoc3RydWN0IGFy bV9zbW11X2RldmljZSAqc21tdSkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlzdHJ1Y3QgYXJtX3Nt bXVfc3RydGFiX2NmZyAqY2ZnID0gJnNtbXUtPnN0cnRhYl9jZmc7CisJc2l6ZV90IHNpemUgPSBz aXplb2YoKmNmZy0+bDFfZGVzYykgKiBjZmctPm51bV9sMV9lbnRzOworCXZvaWQgKnN0cnRhYiA9 IHNtbXUtPnN0cnRhYl9jZmcuc3RydGFiOworCisJY2ZnLT5sMV9kZXNjID0gZGV2bV9remFsbG9j KHNtbXUtPmRldiwgc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjZmctPmwxX2Rlc2MpIHsKKwkJ ZGV2X2VycihzbW11LT5kZXYsICJmYWlsZWQgdG8gYWxsb2NhdGUgbDEgc3RyZWFtIHRhYmxlIGRl c2NcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgY2ZnLT5u dW1fbDFfZW50czsgKytpKSB7CisJCWFybV9zbW11X3dyaXRlX3N0cnRhYl9sMV9kZXNjKHN0cnRh YiwgJmNmZy0+bDFfZGVzY1tpXSk7CisJCXN0cnRhYiArPSBTVFJUQUJfTDFfREVTQ19EV09SRFMg PDwgMzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhcm1fc21tdV9pbml0X3N0 cnRhYl8ybHZsKHN0cnVjdCBhcm1fc21tdV9kZXZpY2UgKnNtbXUpCit7CisJdm9pZCAqc3RydGFi OworCXU2NCByZWc7CisJdTMyIHNpemUsIGwxc2l6ZTsKKwlzdHJ1Y3QgYXJtX3NtbXVfc3RydGFi X2NmZyAqY2ZnID0gJnNtbXUtPnN0cnRhYl9jZmc7CisKKwkvKiBDYWxjdWxhdGUgdGhlIEwxIHNp emUsIGNhcHBlZCB0byB0aGUgU0lEU0laRS4gKi8KKwlzaXplID0gU1RSVEFCX0wxX1NaX1NISUZU IC0gKGlsb2cyKFNUUlRBQl9MMV9ERVNDX0RXT1JEUykgKyAzKTsKKwlzaXplID0gbWluKHNpemUs IHNtbXUtPnNpZF9iaXRzIC0gU1RSVEFCX1NQTElUKTsKKwljZmctPm51bV9sMV9lbnRzID0gMSA8 PCBzaXplOworCisJc2l6ZSArPSBTVFJUQUJfU1BMSVQ7CisJaWYgKHNpemUgPCBzbW11LT5zaWRf Yml0cykKKwkJZGV2X3dhcm4oc21tdS0+ZGV2LAorCQkJICIyLWxldmVsIHN0cnRhYiBvbmx5IGNv dmVycyAldS8ldSBiaXRzIG9mIFNJRFxuIiwKKwkJCSBzaXplLCBzbW11LT5zaWRfYml0cyk7CisK KwlsMXNpemUgPSBjZmctPm51bV9sMV9lbnRzICogKFNUUlRBQl9MMV9ERVNDX0RXT1JEUyA8PCAz KTsKKwlzdHJ0YWIgPSBkbWFtX2FsbG9jX2NvaGVyZW50KHNtbXUtPmRldiwgbDFzaXplLCAmY2Zn LT5zdHJ0YWJfZG1hLAorCQkJCSAgICAgR0ZQX0tFUk5FTCB8IF9fR0ZQX1pFUk8pOworCWlmICgh c3RydGFiKSB7CisJCWRldl9lcnIoc21tdS0+ZGV2LAorCQkJImZhaWxlZCB0byBhbGxvY2F0ZSBs MSBzdHJlYW0gdGFibGUgKCV1IGJ5dGVzKVxuIiwKKwkJCXNpemUpOworCQlyZXR1cm4gLUVOT01F TTsKKwl9CisJY2ZnLT5zdHJ0YWIgPSBzdHJ0YWI7CisKKwkvKiBDb25maWd1cmUgc3RydGFiX2Jh c2VfY2ZnIGZvciAyIGxldmVscyAqLworCXJlZyAgPSBTVFJUQUJfQkFTRV9DRkdfRk1UXzJMVkw7 CisJcmVnIHw9IChzaXplICYgU1RSVEFCX0JBU0VfQ0ZHX0xPRzJTSVpFX01BU0spCisJCTw8IFNU UlRBQl9CQVNFX0NGR19MT0cyU0laRV9TSElGVDsKKwlyZWcgfD0gKFNUUlRBQl9TUExJVCAmIFNU UlRBQl9CQVNFX0NGR19TUExJVF9NQVNLKQorCQk8PCBTVFJUQUJfQkFTRV9DRkdfU1BMSVRfU0hJ RlQ7CisJY2ZnLT5zdHJ0YWJfYmFzZV9jZmcgPSByZWc7CisKKwlyZXR1cm4gYXJtX3NtbXVfaW5p dF9sMV9zdHJ0YWIoc21tdSk7Cit9CisKK3N0YXRpYyBpbnQgYXJtX3NtbXVfaW5pdF9zdHJ0YWJf bGluZWFyKHN0cnVjdCBhcm1fc21tdV9kZXZpY2UgKnNtbXUpCit7CisJdm9pZCAqc3RydGFiOwor CXU2NCByZWc7CisJdTMyIHNpemU7CisJc3RydWN0IGFybV9zbW11X3N0cnRhYl9jZmcgKmNmZyA9 ICZzbW11LT5zdHJ0YWJfY2ZnOworCisJc2l6ZSA9ICgxIDw8IHNtbXUtPnNpZF9iaXRzKSAqIChT VFJUQUJfU1RFX0RXT1JEUyA8PCAzKTsKKwlzdHJ0YWIgPSBkbWFtX2FsbG9jX2NvaGVyZW50KHNt bXUtPmRldiwgc2l6ZSwgJmNmZy0+c3RydGFiX2RtYSwKKwkJCQkgICAgIEdGUF9LRVJORUwgfCBf X0dGUF9aRVJPKTsKKwlpZiAoIXN0cnRhYikgeworCQlkZXZfZXJyKHNtbXUtPmRldiwKKwkJCSJm YWlsZWQgdG8gYWxsb2NhdGUgbGluZWFyIHN0cmVhbSB0YWJsZSAoJXUgYnl0ZXMpXG4iLAorCQkJ c2l6ZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwljZmctPnN0cnRhYiA9IHN0cnRhYjsKKwlj ZmctPm51bV9sMV9lbnRzID0gMSA8PCBzbW11LT5zaWRfYml0czsKKworCS8qIENvbmZpZ3VyZSBz dHJ0YWJfYmFzZV9jZmcgZm9yIGEgbGluZWFyIHRhYmxlIGNvdmVyaW5nIGFsbCBTSURzICovCisJ cmVnICA9IFNUUlRBQl9CQVNFX0NGR19GTVRfTElORUFSOworCXJlZyB8PSAoc21tdS0+c2lkX2Jp dHMgJiBTVFJUQUJfQkFTRV9DRkdfTE9HMlNJWkVfTUFTSykKKwkJPDwgU1RSVEFCX0JBU0VfQ0ZH X0xPRzJTSVpFX1NISUZUOworCWNmZy0+c3RydGFiX2Jhc2VfY2ZnID0gcmVnOworCisJYXJtX3Nt bXVfaW5pdF9ieXBhc3Nfc3RlcyhzdHJ0YWIsIGNmZy0+bnVtX2wxX2VudHMpOworCXJldHVybiAw OworfQorCitzdGF0aWMgaW50IGFybV9zbW11X2luaXRfc3RydGFiKHN0cnVjdCBhcm1fc21tdV9k ZXZpY2UgKnNtbXUpCit7CisJdTY0IHJlZzsKKwlpbnQgcmV0OworCisJaWYgKHNtbXUtPmZlYXR1 cmVzICYgQVJNX1NNTVVfRkVBVF8yX0xWTF9TVFJUQUIpCisJCXJldCA9IGFybV9zbW11X2luaXRf c3RydGFiXzJsdmwoc21tdSk7CisJZWxzZQorCQlyZXQgPSBhcm1fc21tdV9pbml0X3N0cnRhYl9s aW5lYXIoc21tdSk7CisKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogU2V0IHRoZSBz dHJ0YWIgYmFzZSBhZGRyZXNzICovCisJcmVnICA9IHNtbXUtPnN0cnRhYl9jZmcuc3RydGFiX2Rt YSAmCisJICAgICAgIFNUUlRBQl9CQVNFX0FERFJfTUFTSyA8PCBTVFJUQUJfQkFTRV9BRERSX1NI SUZUOworCXJlZyB8PSBTVFJUQUJfQkFTRV9SQTsKKwlzbW11LT5zdHJ0YWJfY2ZnLnN0cnRhYl9i YXNlID0gcmVnOworCisJLyogQWxsb2NhdGUgdGhlIGZpcnN0IFZNSUQgZm9yIHN0YWdlLTIgYnlw YXNzIFNURXMgKi8KKwlzZXRfYml0KDAsIHNtbXUtPnZtaWRfbWFwKTsKKwlyZXR1cm4gMDsKK30K Kworc3RhdGljIGludCBhcm1fc21tdV9pbml0X3N0cnVjdHVyZXMoc3RydWN0IGFybV9zbW11X2Rl dmljZSAqc21tdSkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gYXJtX3NtbXVfaW5pdF9xdWV1ZXMo c21tdSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBhcm1fc21tdV9pbml0 X3N0cnRhYihzbW11KTsKK30KKworc3RhdGljIGludCBhcm1fc21tdV93cml0ZV9yZWdfc3luYyhz dHJ1Y3QgYXJtX3NtbXVfZGV2aWNlICpzbW11LCB1MzIgdmFsLAorCQkJCSAgIHVuc2lnbmVkIGlu dCByZWdfb2ZmLCB1bnNpZ25lZCBpbnQgYWNrX29mZikKK3sKKwl1MzIgcmVnOworCisJd3JpdGVs X3JlbGF4ZWQodmFsLCBzbW11LT5iYXNlICsgcmVnX29mZik7CisJcmV0dXJuIHJlYWRsX3JlbGF4 ZWRfcG9sbF90aW1lb3V0KHNtbXUtPmJhc2UgKyBhY2tfb2ZmLCByZWcsIHJlZyA9PSB2YWwsCisJ CQkJCSAgMSwgQVJNX1NNTVVfUE9MTF9USU1FT1VUX1VTKTsKK30KKworLyogR0JQQSBpcyAic3Bl Y2lhbCIgKi8KK3N0YXRpYyBpbnQgYXJtX3NtbXVfdXBkYXRlX2dicGEoc3RydWN0IGFybV9zbW11 X2RldmljZSAqc21tdSwgdTMyIHNldCwgdTMyIGNscikKK3sKKwlpbnQgcmV0OworCXUzMiByZWcs IF9faW9tZW0gKmdicGEgPSBzbW11LT5iYXNlICsgQVJNX1NNTVVfR0JQQTsKKworCXJldCA9IHJl YWRsX3JlbGF4ZWRfcG9sbF90aW1lb3V0KGdicGEsIHJlZywgIShyZWcgJiBHQlBBX1VQREFURSks CisJCQkJCSAxLCBBUk1fU01NVV9QT0xMX1RJTUVPVVRfVVMpOworCWlmIChyZXQpCisJCXJldHVy biByZXQ7CisKKwlyZWcgJj0gfmNscjsKKwlyZWcgfD0gc2V0OworCXdyaXRlbF9yZWxheGVkKHJl ZyB8IEdCUEFfVVBEQVRFLCBnYnBhKTsKKwlyZXR1cm4gcmVhZGxfcmVsYXhlZF9wb2xsX3RpbWVv dXQoZ2JwYSwgcmVnLCAhKHJlZyAmIEdCUEFfVVBEQVRFKSwKKwkJCQkJICAxLCBBUk1fU01NVV9Q T0xMX1RJTUVPVVRfVVMpOworfQorCitzdGF0aWMgdm9pZCBhcm1fc21tdV9mcmVlX21zaXModm9p ZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBkYXRhOworCXBsYXRmb3JtX21zaV9k b21haW5fZnJlZV9pcnFzKGRldik7Cit9CisKK3N0YXRpYyB2b2lkIGFybV9zbW11X3dyaXRlX21z aV9tc2coc3RydWN0IG1zaV9kZXNjICpkZXNjLCBzdHJ1Y3QgbXNpX21zZyAqbXNnKQoreworCXBo eXNfYWRkcl90IGRvb3JiZWxsOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IG1zaV9kZXNjX3RvX2Rl dihkZXNjKTsKKwlzdHJ1Y3QgYXJtX3NtbXVfZGV2aWNlICpzbW11ID0gZGV2X2dldF9kcnZkYXRh KGRldik7CisJcGh5c19hZGRyX3QgKmNmZyA9IGFybV9zbW11X21zaV9jZmdbZGVzYy0+cGxhdGZv cm0ubXNpX2luZGV4XTsKKworCWRvb3JiZWxsID0gKCgodTY0KW1zZy0+YWRkcmVzc19oaSkgPDwg MzIpIHwgbXNnLT5hZGRyZXNzX2xvOworCWRvb3JiZWxsICY9IE1TSV9DRkcwX0FERFJfTUFTSyA8 PCBNU0lfQ0ZHMF9BRERSX1NISUZUOworCisJd3JpdGVxX3JlbGF4ZWQoZG9vcmJlbGwsIHNtbXUt PmJhc2UgKyBjZmdbMF0pOworCXdyaXRlbF9yZWxheGVkKG1zZy0+ZGF0YSwgc21tdS0+YmFzZSAr IGNmZ1sxXSk7CisJd3JpdGVsX3JlbGF4ZWQoTVNJX0NGRzJfTUVNQVRUUl9ERVZJQ0VfbkduUkUs IHNtbXUtPmJhc2UgKyBjZmdbMl0pOworfQorCitzdGF0aWMgdm9pZCBhcm1fc21tdV9zZXR1cF9t c2lzKHN0cnVjdCBhcm1fc21tdV9kZXZpY2UgKnNtbXUpCit7CisJc3RydWN0IG1zaV9kZXNjICpk ZXNjOworCWludCByZXQsIG52ZWMgPSBBUk1fU01NVV9NQVhfTVNJUzsKKwlzdHJ1Y3QgZGV2aWNl ICpkZXYgPSBzbW11LT5kZXY7CisKKwkvKiBDbGVhciB0aGUgTVNJIGFkZHJlc3MgcmVncyAqLwor CXdyaXRlcV9yZWxheGVkKDAsIHNtbXUtPmJhc2UgKyBBUk1fU01NVV9HRVJST1JfSVJRX0NGRzAp OworCXdyaXRlcV9yZWxheGVkKDAsIHNtbXUtPmJhc2UgKyBBUk1fU01NVV9FVlRRX0lSUV9DRkcw KTsKKworCWlmIChzbW11LT5mZWF0dXJlcyAmIEFSTV9TTU1VX0ZFQVRfUFJJKQorCQl3cml0ZXFf cmVsYXhlZCgwLCBzbW11LT5iYXNlICsgQVJNX1NNTVVfUFJJUV9JUlFfQ0ZHMCk7CisJZWxzZQor CQludmVjLS07CisKKwlpZiAoIShzbW11LT5mZWF0dXJlcyAmIEFSTV9TTU1VX0ZFQVRfTVNJKSkK KwkJcmV0dXJuOworCisJLyogQWxsb2NhdGUgTVNJcyBmb3IgZXZ0cSwgZ2Vycm9yIGFuZCBwcmlx LiBJZ25vcmUgY21kcSAqLworCXJldCA9IHBsYXRmb3JtX21zaV9kb21haW5fYWxsb2NfaXJxcyhk ZXYsIG52ZWMsIGFybV9zbW11X3dyaXRlX21zaV9tc2cpOworCWlmIChyZXQpIHsKKwkJZGV2X3dh cm4oZGV2LCAiZmFpbGVkIHRvIGFsbG9jYXRlIE1TSXNcbiIpOworCQlyZXR1cm47CisJfQorCisJ Zm9yX2VhY2hfbXNpX2VudHJ5KGRlc2MsIGRldikgeworCQlzd2l0Y2ggKGRlc2MtPnBsYXRmb3Jt Lm1zaV9pbmRleCkgeworCQljYXNlIEVWVFFfTVNJX0lOREVYOgorCQkJc21tdS0+ZXZ0cS5xLmly cSA9IGRlc2MtPmlycTsKKwkJCWJyZWFrOworCQljYXNlIEdFUlJPUl9NU0lfSU5ERVg6CisJCQlz bW11LT5nZXJyX2lycSA9IGRlc2MtPmlycTsKKwkJCWJyZWFrOworCQljYXNlIFBSSVFfTVNJX0lO REVYOgorCQkJc21tdS0+cHJpcS5xLmlycSA9IGRlc2MtPmlycTsKKwkJCWJyZWFrOworCQlkZWZh dWx0OgkvKiBVbmtub3duICovCisJCQljb250aW51ZTsKKwkJfQorCX0KKworCS8qIEFkZCBjYWxs YmFjayB0byBmcmVlIE1TSXMgb24gdGVhcmRvd24gKi8KKwlkZXZtX2FkZF9hY3Rpb24oZGV2LCBh cm1fc21tdV9mcmVlX21zaXMsIGRldik7Cit9CisKK3N0YXRpYyBpbnQgYXJtX3NtbXVfc2V0dXBf aXJxcyhzdHJ1Y3QgYXJtX3NtbXVfZGV2aWNlICpzbW11KQoreworCWludCByZXQsIGlycTsKKwl1 MzIgaXJxZW5fZmxhZ3MgPSBJUlFfQ1RSTF9FVlRRX0lSUUVOIHwgSVJRX0NUUkxfR0VSUk9SX0lS UUVOOworCisJLyogRGlzYWJsZSBJUlFzIGZpcnN0ICovCisJcmV0ID0gYXJtX3NtbXVfd3JpdGVf cmVnX3N5bmMoc21tdSwgMCwgQVJNX1NNTVVfSVJRX0NUUkwsCisJCQkJICAgICAgQVJNX1NNTVVf SVJRX0NUUkxBQ0spOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihzbW11LT5kZXYsICJmYWlsZWQg dG8gZGlzYWJsZSBpcnFzXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlhcm1fc21tdV9zZXR1 cF9tc2lzKHNtbXUpOworCisJLyogUmVxdWVzdCBpbnRlcnJ1cHQgbGluZXMgKi8KKwlpcnEgPSBz bW11LT5ldnRxLnEuaXJxOworCWlmIChpcnEpIHsKKwkJcmV0ID0gZGV2bV9yZXF1ZXN0X3RocmVh ZGVkX2lycShzbW11LT5kZXYsIGlycSwgTlVMTCwKKwkJCQkJCWFybV9zbW11X2V2dHFfdGhyZWFk LAorCQkJCQkJSVJRRl9PTkVTSE9ULAorCQkJCQkJImFybS1zbW11LXYzLWV2dHEiLCBzbW11KTsK KwkJaWYgKHJldCA8IDApCisJCQlkZXZfd2FybihzbW11LT5kZXYsICJmYWlsZWQgdG8gZW5hYmxl IGV2dHEgaXJxXG4iKTsKKwl9CisKKwlpcnEgPSBzbW11LT5jbWRxLnEuaXJxOworCWlmIChpcnEp IHsKKwkJcmV0ID0gZGV2bV9yZXF1ZXN0X2lycShzbW11LT5kZXYsIGlycSwKKwkJCQkgICAgICAg YXJtX3NtbXVfY21kcV9zeW5jX2hhbmRsZXIsIDAsCisJCQkJICAgICAgICJhcm0tc21tdS12My1j bWRxLXN5bmMiLCBzbW11KTsKKwkJaWYgKHJldCA8IDApCisJCQlkZXZfd2FybihzbW11LT5kZXYs ICJmYWlsZWQgdG8gZW5hYmxlIGNtZHEtc3luYyBpcnFcbiIpOworCX0KKworCWlycSA9IHNtbXUt PmdlcnJfaXJxOworCWlmIChpcnEpIHsKKwkJcmV0ID0gZGV2bV9yZXF1ZXN0X2lycShzbW11LT5k ZXYsIGlycSwgYXJtX3NtbXVfZ2Vycm9yX2hhbmRsZXIsCisJCQkJICAgICAgIDAsICJhcm0tc21t dS12My1nZXJyb3IiLCBzbW11KTsKKwkJaWYgKHJldCA8IDApCisJCQlkZXZfd2FybihzbW11LT5k ZXYsICJmYWlsZWQgdG8gZW5hYmxlIGdlcnJvciBpcnFcbiIpOworCX0KKworCWlmIChzbW11LT5m ZWF0dXJlcyAmIEFSTV9TTU1VX0ZFQVRfUFJJKSB7CisJCWlycSA9IHNtbXUtPnByaXEucS5pcnE7 CisJCWlmIChpcnEpIHsKKwkJCXJldCA9IGRldm1fcmVxdWVzdF90aHJlYWRlZF9pcnEoc21tdS0+ ZGV2LCBpcnEsIE5VTEwsCisJCQkJCQkJYXJtX3NtbXVfcHJpcV90aHJlYWQsCisJCQkJCQkJSVJR Rl9PTkVTSE9ULAorCQkJCQkJCSJhcm0tc21tdS12My1wcmlxIiwKKwkJCQkJCQlzbW11KTsKKwkJ CWlmIChyZXQgPCAwKQorCQkJCWRldl93YXJuKHNtbXUtPmRldiwKKwkJCQkJICJmYWlsZWQgdG8g ZW5hYmxlIHByaXEgaXJxXG4iKTsKKwkJCWVsc2UKKwkJCQlpcnFlbl9mbGFncyB8PSBJUlFfQ1RS TF9QUklRX0lSUUVOOworCQl9CisJfQorCisJLyogRW5hYmxlIGludGVycnVwdCBnZW5lcmF0aW9u IG9uIHRoZSBTTU1VICovCisJcmV0ID0gYXJtX3NtbXVfd3JpdGVfcmVnX3N5bmMoc21tdSwgaXJx ZW5fZmxhZ3MsCisJCQkJICAgICAgQVJNX1NNTVVfSVJRX0NUUkwsIEFSTV9TTU1VX0lSUV9DVFJM QUNLKTsKKwlpZiAocmV0KQorCQlkZXZfd2FybihzbW11LT5kZXYsICJmYWlsZWQgdG8gZW5hYmxl IGlycXNcbiIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXJtX3NtbXVfZGV2aWNl X2Rpc2FibGUoc3RydWN0IGFybV9zbW11X2RldmljZSAqc21tdSkKK3sKKwlpbnQgcmV0OworCisJ cmV0ID0gYXJtX3NtbXVfd3JpdGVfcmVnX3N5bmMoc21tdSwgMCwgQVJNX1NNTVVfQ1IwLCBBUk1f U01NVV9DUjBBQ0spOworCWlmIChyZXQpCisJCWRldl9lcnIoc21tdS0+ZGV2LCAiZmFpbGVkIHRv IGNsZWFyIGNyMFxuIik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFybV9zbW11 X2RldmljZV9yZXNldChzdHJ1Y3QgYXJtX3NtbXVfZGV2aWNlICpzbW11LCBib29sIGJ5cGFzcykK K3sKKwlpbnQgcmV0OworCXUzMiByZWcsIGVuYWJsZXM7CisJc3RydWN0IGFybV9zbW11X2NtZHFf ZW50IGNtZDsKKworCS8qIENsZWFyIENSMCBhbmQgc3luYyAoZGlzYWJsZXMgU01NVSBhbmQgcXVl dWUgcHJvY2Vzc2luZykgKi8KKwlyZWcgPSByZWFkbF9yZWxheGVkKHNtbXUtPmJhc2UgKyBBUk1f U01NVV9DUjApOworCWlmIChyZWcgJiBDUjBfU01NVUVOKQorCQlkZXZfd2FybihzbW11LT5kZXYs ICJTTU1VIGN1cnJlbnRseSBlbmFibGVkISBSZXNldHRpbmcuLi5cbiIpOworCisJcmV0ID0gYXJt X3NtbXVfZGV2aWNlX2Rpc2FibGUoc21tdSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwor CS8qIENSMSAodGFibGUgYW5kIHF1ZXVlIG1lbW9yeSBhdHRyaWJ1dGVzKSAqLworCXJlZyA9IChD UjFfU0hfSVNIIDw8IENSMV9UQUJMRV9TSF9TSElGVCkgfAorCSAgICAgIChDUjFfQ0FDSEVfV0Ig PDwgQ1IxX1RBQkxFX09DX1NISUZUKSB8CisJICAgICAgKENSMV9DQUNIRV9XQiA8PCBDUjFfVEFC TEVfSUNfU0hJRlQpIHwKKwkgICAgICAoQ1IxX1NIX0lTSCA8PCBDUjFfUVVFVUVfU0hfU0hJRlQp IHwKKwkgICAgICAoQ1IxX0NBQ0hFX1dCIDw8IENSMV9RVUVVRV9PQ19TSElGVCkgfAorCSAgICAg IChDUjFfQ0FDSEVfV0IgPDwgQ1IxX1FVRVVFX0lDX1NISUZUKTsKKwl3cml0ZWxfcmVsYXhlZChy ZWcsIHNtbXUtPmJhc2UgKyBBUk1fU01NVV9DUjEpOworCisJLyogQ1IyIChyYW5kb20gY3JhcCkg Ki8KKwlyZWcgPSBDUjJfUFRNIHwgQ1IyX1JFQ0lOVlNJRCB8IENSMl9FMkg7CisJd3JpdGVsX3Jl bGF4ZWQocmVnLCBzbW11LT5iYXNlICsgQVJNX1NNTVVfQ1IyKTsKKworCS8qIFN0cmVhbSB0YWJs ZSAqLworCXdyaXRlcV9yZWxheGVkKHNtbXUtPnN0cnRhYl9jZmcuc3RydGFiX2Jhc2UsCisJCSAg ICAgICBzbW11LT5iYXNlICsgQVJNX1NNTVVfU1RSVEFCX0JBU0UpOworCXdyaXRlbF9yZWxheGVk KHNtbXUtPnN0cnRhYl9jZmcuc3RydGFiX2Jhc2VfY2ZnLAorCQkgICAgICAgc21tdS0+YmFzZSAr IEFSTV9TTU1VX1NUUlRBQl9CQVNFX0NGRyk7CisKKwkvKiBDb21tYW5kIHF1ZXVlICovCisJd3Jp dGVxX3JlbGF4ZWQoc21tdS0+Y21kcS5xLnFfYmFzZSwgc21tdS0+YmFzZSArIEFSTV9TTU1VX0NN RFFfQkFTRSk7CisJd3JpdGVsX3JlbGF4ZWQoc21tdS0+Y21kcS5xLnByb2QsIHNtbXUtPmJhc2Ug KyBBUk1fU01NVV9DTURRX1BST0QpOworCXdyaXRlbF9yZWxheGVkKHNtbXUtPmNtZHEucS5jb25z LCBzbW11LT5iYXNlICsgQVJNX1NNTVVfQ01EUV9DT05TKTsKKworCWVuYWJsZXMgPSBDUjBfQ01E UUVOOworCXJldCA9IGFybV9zbW11X3dyaXRlX3JlZ19zeW5jKHNtbXUsIGVuYWJsZXMsIEFSTV9T TU1VX0NSMCwKKwkJCQkgICAgICBBUk1fU01NVV9DUjBBQ0spOworCWlmIChyZXQpIHsKKwkJZGV2 X2VycihzbW11LT5kZXYsICJmYWlsZWQgdG8gZW5hYmxlIGNvbW1hbmQgcXVldWVcbiIpOworCQly ZXR1cm4gcmV0OworCX0KKworCS8qIEludmFsaWRhdGUgYW55IGNhY2hlZCBjb25maWd1cmF0aW9u ICovCisJY21kLm9wY29kZSA9IENNRFFfT1BfQ0ZHSV9BTEw7CisJYXJtX3NtbXVfY21kcV9pc3N1 ZV9jbWQoc21tdSwgJmNtZCk7CisJY21kLm9wY29kZSA9IENNRFFfT1BfQ01EX1NZTkM7CisJYXJt X3NtbXVfY21kcV9pc3N1ZV9jbWQoc21tdSwgJmNtZCk7CisKKwkvKiBJbnZhbGlkYXRlIGFueSBz dGFsZSBUTEIgZW50cmllcyAqLworCWlmIChzbW11LT5mZWF0dXJlcyAmIEFSTV9TTU1VX0ZFQVRf SFlQKSB7CisJCWNtZC5vcGNvZGUgPSBDTURRX09QX1RMQklfRUwyX0FMTDsKKwkJYXJtX3NtbXVf Y21kcV9pc3N1ZV9jbWQoc21tdSwgJmNtZCk7CisJfQorCisJY21kLm9wY29kZSA9IENNRFFfT1Bf VExCSV9OU05IX0FMTDsKKwlhcm1fc21tdV9jbWRxX2lzc3VlX2NtZChzbW11LCAmY21kKTsKKwlj bWQub3Bjb2RlID0gQ01EUV9PUF9DTURfU1lOQzsKKwlhcm1fc21tdV9jbWRxX2lzc3VlX2NtZChz bW11LCAmY21kKTsKKworCS8qIEV2ZW50IHF1ZXVlICovCisJd3JpdGVxX3JlbGF4ZWQoc21tdS0+ ZXZ0cS5xLnFfYmFzZSwgc21tdS0+YmFzZSArIEFSTV9TTU1VX0VWVFFfQkFTRSk7CisJd3JpdGVs X3JlbGF4ZWQoc21tdS0+ZXZ0cS5xLnByb2QsIHNtbXUtPmJhc2UgKyBBUk1fU01NVV9FVlRRX1BS T0QpOworCXdyaXRlbF9yZWxheGVkKHNtbXUtPmV2dHEucS5jb25zLCBzbW11LT5iYXNlICsgQVJN X1NNTVVfRVZUUV9DT05TKTsKKworCWVuYWJsZXMgfD0gQ1IwX0VWVFFFTjsKKwlyZXQgPSBhcm1f c21tdV93cml0ZV9yZWdfc3luYyhzbW11LCBlbmFibGVzLCBBUk1fU01NVV9DUjAsCisJCQkJICAg ICAgQVJNX1NNTVVfQ1IwQUNLKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoc21tdS0+ZGV2LCAi ZmFpbGVkIHRvIGVuYWJsZSBldmVudCBxdWV1ZVxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJ LyogUFJJIHF1ZXVlICovCisJaWYgKHNtbXUtPmZlYXR1cmVzICYgQVJNX1NNTVVfRkVBVF9QUkkp IHsKKwkJd3JpdGVxX3JlbGF4ZWQoc21tdS0+cHJpcS5xLnFfYmFzZSwKKwkJCSAgICAgICBzbW11 LT5iYXNlICsgQVJNX1NNTVVfUFJJUV9CQVNFKTsKKwkJd3JpdGVsX3JlbGF4ZWQoc21tdS0+cHJp cS5xLnByb2QsCisJCQkgICAgICAgc21tdS0+YmFzZSArIEFSTV9TTU1VX1BSSVFfUFJPRCk7CisJ CXdyaXRlbF9yZWxheGVkKHNtbXUtPnByaXEucS5jb25zLAorCQkJICAgICAgIHNtbXUtPmJhc2Ug KyBBUk1fU01NVV9QUklRX0NPTlMpOworCisJCWVuYWJsZXMgfD0gQ1IwX1BSSVFFTjsKKwkJcmV0 ID0gYXJtX3NtbXVfd3JpdGVfcmVnX3N5bmMoc21tdSwgZW5hYmxlcywgQVJNX1NNTVVfQ1IwLAor CQkJCQkgICAgICBBUk1fU01NVV9DUjBBQ0spOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKHNt bXUtPmRldiwgImZhaWxlZCB0byBlbmFibGUgUFJJIHF1ZXVlXG4iKTsKKwkJCXJldHVybiByZXQ7 CisJCX0KKwl9CisKKwlyZXQgPSBhcm1fc21tdV9zZXR1cF9pcnFzKHNtbXUpOworCWlmIChyZXQp IHsKKwkJZGV2X2VycihzbW11LT5kZXYsICJmYWlsZWQgdG8gc2V0dXAgaXJxc1xuIik7CisJCXJl dHVybiByZXQ7CisJfQorCisKKwkvKiBFbmFibGUgdGhlIFNNTVUgaW50ZXJmYWNlLCBvciBlbnN1 cmUgYnlwYXNzICovCisJaWYgKCFieXBhc3MgfHwgZGlzYWJsZV9ieXBhc3MpIHsKKwkJZW5hYmxl cyB8PSBDUjBfU01NVUVOOworCX0gZWxzZSB7CisJCXJldCA9IGFybV9zbW11X3VwZGF0ZV9nYnBh KHNtbXUsIDAsIEdCUEFfQUJPUlQpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKHNtbXUtPmRl diwgIkdCUEEgbm90IHJlc3BvbmRpbmcgdG8gdXBkYXRlXG4iKTsKKwkJCXJldHVybiByZXQ7CisJ CX0KKwl9CisJcmV0ID0gYXJtX3NtbXVfd3JpdGVfcmVnX3N5bmMoc21tdSwgZW5hYmxlcywgQVJN X1NNTVVfQ1IwLAorCQkJCSAgICAgIEFSTV9TTU1VX0NSMEFDSyk7CisJaWYgKHJldCkgeworCQlk ZXZfZXJyKHNtbXUtPmRldiwgImZhaWxlZCB0byBlbmFibGUgU01NVSBpbnRlcmZhY2VcbiIpOwor CQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFybV9zbW11 X2RldmljZV9od19wcm9iZShzdHJ1Y3QgYXJtX3NtbXVfZGV2aWNlICpzbW11KQoreworCXUzMiBy ZWc7CisJYm9vbCBjb2hlcmVudCA9IHNtbXUtPmZlYXR1cmVzICYgQVJNX1NNTVVfRkVBVF9DT0hF UkVOQ1k7CisKKwkvKiBJRFIwICovCisJcmVnID0gcmVhZGxfcmVsYXhlZChzbW11LT5iYXNlICsg QVJNX1NNTVVfSURSMCk7CisKKwkvKiAyLWxldmVsIHN0cnVjdHVyZXMgKi8KKwlpZiAoKHJlZyAm IElEUjBfU1RfTFZMX01BU0sgPDwgSURSMF9TVF9MVkxfU0hJRlQpID09IElEUjBfU1RfTFZMXzJM VkwpCisJCXNtbXUtPmZlYXR1cmVzIHw9IEFSTV9TTU1VX0ZFQVRfMl9MVkxfU1RSVEFCOworCisJ aWYgKHJlZyAmIElEUjBfQ0QyTCkKKwkJc21tdS0+ZmVhdHVyZXMgfD0gQVJNX1NNTVVfRkVBVF8y X0xWTF9DRFRBQjsKKworCS8qCisJICogVHJhbnNsYXRpb24gdGFibGUgZW5kaWFubmVzcy4KKwkg KiBXZSBjdXJyZW50bHkgcmVxdWlyZSB0aGUgc2FtZSBlbmRpYW5uZXNzIGFzIHRoZSBDUFUsIGJ1 dCB0aGlzCisJICogY291bGQgYmUgY2hhbmdlZCBsYXRlciBieSBhZGRpbmcgYSBuZXcgSU9fUEdU QUJMRV9RVUlSSy4KKwkgKi8KKwlzd2l0Y2ggKHJlZyAmIElEUjBfVFRFTkRJQU5fTUFTSyA8PCBJ RFIwX1RURU5ESUFOX1NISUZUKSB7CisJY2FzZSBJRFIwX1RURU5ESUFOX01JWEVEOgorCQlzbW11 LT5mZWF0dXJlcyB8PSBBUk1fU01NVV9GRUFUX1RUX0xFIHwgQVJNX1NNTVVfRkVBVF9UVF9CRTsK KwkJYnJlYWs7CisjaWZkZWYgX19CSUdfRU5ESUFOCisJY2FzZSBJRFIwX1RURU5ESUFOX0JFOgor CQlzbW11LT5mZWF0dXJlcyB8PSBBUk1fU01NVV9GRUFUX1RUX0JFOworCQlicmVhazsKKyNlbHNl CisJY2FzZSBJRFIwX1RURU5ESUFOX0xFOgorCQlzbW11LT5mZWF0dXJlcyB8PSBBUk1fU01NVV9G RUFUX1RUX0xFOworCQlicmVhazsKKyNlbmRpZgorCWRlZmF1bHQ6CisJCWRldl9lcnIoc21tdS0+ ZGV2LCAidW5rbm93bi91bnN1cHBvcnRlZCBUVCBlbmRpYW5uZXNzIVxuIik7CisJCXJldHVybiAt RU5YSU87CisJfQorCisJLyogQm9vbGVhbiBmZWF0dXJlIGZsYWdzICovCisJaWYgKElTX0VOQUJM RUQoQ09ORklHX1BDSV9QUkkpICYmIHJlZyAmIElEUjBfUFJJKQorCQlzbW11LT5mZWF0dXJlcyB8 PSBBUk1fU01NVV9GRUFUX1BSSTsKKworCWlmIChJU19FTkFCTEVEKENPTkZJR19QQ0lfQVRTKSAm JiByZWcgJiBJRFIwX0FUUykKKwkJc21tdS0+ZmVhdHVyZXMgfD0gQVJNX1NNTVVfRkVBVF9BVFM7 CisKKwlpZiAocmVnICYgSURSMF9TRVYpCisJCXNtbXUtPmZlYXR1cmVzIHw9IEFSTV9TTU1VX0ZF QVRfU0VWOworCisJaWYgKHJlZyAmIElEUjBfTVNJKQorCQlzbW11LT5mZWF0dXJlcyB8PSBBUk1f U01NVV9GRUFUX01TSTsKKworCWlmIChyZWcgJiBJRFIwX0hZUCkKKwkJc21tdS0+ZmVhdHVyZXMg fD0gQVJNX1NNTVVfRkVBVF9IWVA7CisKKwkvKgorCSAqIFRoZSBjb2hlcmVuY3kgZmVhdHVyZSBh cyBzZXQgYnkgRlcgaXMgdXNlZCBpbiBwcmVmZXJlbmNlIHRvIHRoZSBJRAorCSAqIHJlZ2lzdGVy LCBidXQgd2FybiBvbiBtaXNtYXRjaC4KKwkgKi8KKwlpZiAoISEocmVnICYgSURSMF9DT0hBQ0Mp ICE9IGNvaGVyZW50KQorCQlkZXZfd2FybihzbW11LT5kZXYsICJJRFIwLkNPSEFDQyBvdmVycmlk ZGVuIGJ5IGRtYS1jb2hlcmVudCBwcm9wZXJ0eSAoJXMpXG4iLAorCQkJIGNvaGVyZW50ID8gInRy dWUiIDogImZhbHNlIik7CisKKwlzd2l0Y2ggKHJlZyAmIElEUjBfU1RBTExfTU9ERUxfTUFTSyA8 PCBJRFIwX1NUQUxMX01PREVMX1NISUZUKSB7CisJY2FzZSBJRFIwX1NUQUxMX01PREVMX1NUQUxM OgorCQkvKiBGYWxsdGhyb3VnaCAqLworCWNhc2UgSURSMF9TVEFMTF9NT0RFTF9GT1JDRToKKwkJ c21tdS0+ZmVhdHVyZXMgfD0gQVJNX1NNTVVfRkVBVF9TVEFMTFM7CisJfQorCisJaWYgKHJlZyAm IElEUjBfUzFQKQorCQlzbW11LT5mZWF0dXJlcyB8PSBBUk1fU01NVV9GRUFUX1RSQU5TX1MxOwor CisJaWYgKHJlZyAmIElEUjBfUzJQKQorCQlzbW11LT5mZWF0dXJlcyB8PSBBUk1fU01NVV9GRUFU X1RSQU5TX1MyOworCisJaWYgKCEocmVnICYgKElEUjBfUzFQIHwgSURSMF9TMlApKSkgeworCQlk ZXZfZXJyKHNtbXUtPmRldiwgIm5vIHRyYW5zbGF0aW9uIHN1cHBvcnQhXG4iKTsKKwkJcmV0dXJu IC1FTlhJTzsKKwl9CisKKwkvKiBXZSBvbmx5IHN1cHBvcnQgdGhlIEFBcmNoNjQgdGFibGUgZm9y bWF0IGF0IHByZXNlbnQgKi8KKwlzd2l0Y2ggKHJlZyAmIElEUjBfVFRGX01BU0sgPDwgSURSMF9U VEZfU0hJRlQpIHsKKwljYXNlIElEUjBfVFRGX0FBUkNIMzJfNjQ6CisJCXNtbXUtPmlhcyA9IDQw OworCQkvKiBGYWxsdGhyb3VnaCAqLworCWNhc2UgSURSMF9UVEZfQUFSQ0g2NDoKKwkJYnJlYWs7 CisJZGVmYXVsdDoKKwkJZGV2X2VycihzbW11LT5kZXYsICJBQXJjaDY0IHRhYmxlIGZvcm1hdCBu b3Qgc3VwcG9ydGVkIVxuIik7CisJCXJldHVybiAtRU5YSU87CisJfQorCisJLyogQVNJRC9WTUlE IHNpemVzICovCisJc21tdS0+YXNpZF9iaXRzID0gcmVnICYgSURSMF9BU0lEMTYgPyAxNiA6IDg7 CisJc21tdS0+dm1pZF9iaXRzID0gcmVnICYgSURSMF9WTUlEMTYgPyAxNiA6IDg7CisKKwkvKiBJ RFIxICovCisJcmVnID0gcmVhZGxfcmVsYXhlZChzbW11LT5iYXNlICsgQVJNX1NNTVVfSURSMSk7 CisJaWYgKHJlZyAmIChJRFIxX1RBQkxFU19QUkVTRVQgfCBJRFIxX1FVRVVFU19QUkVTRVQgfCBJ RFIxX1JFTCkpIHsKKwkJZGV2X2VycihzbW11LT5kZXYsICJlbWJlZGRlZCBpbXBsZW1lbnRhdGlv biBub3Qgc3VwcG9ydGVkXG4iKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwkvKiBRdWV1ZSBz aXplcywgY2FwcGVkIGF0IDRrICovCisJc21tdS0+Y21kcS5xLm1heF9uX3NoaWZ0ID0gbWluKCh1 MzIpQ01EUV9NQVhfU1pfU0hJRlQsCisJCQkJICAgICAgIHJlZyA+PiBJRFIxX0NNRFFfU0hJRlQg JiBJRFIxX0NNRFFfTUFTSyk7CisJaWYgKCFzbW11LT5jbWRxLnEubWF4X25fc2hpZnQpIHsKKwkJ LyogT2RkIGFsaWdubWVudCByZXN0cmljdGlvbnMgb24gdGhlIGJhc2UsIHNvIGlnbm9yZSBmb3Ig bm93ICovCisJCWRldl9lcnIoc21tdS0+ZGV2LCAidW5pdC1sZW5ndGggY29tbWFuZCBxdWV1ZSBu b3Qgc3VwcG9ydGVkXG4iKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwlzbW11LT5ldnRxLnEu bWF4X25fc2hpZnQgPSBtaW4oKHUzMilFVlRRX01BWF9TWl9TSElGVCwKKwkJCQkgICAgICAgcmVn ID4+IElEUjFfRVZUUV9TSElGVCAmIElEUjFfRVZUUV9NQVNLKTsKKwlzbW11LT5wcmlxLnEubWF4 X25fc2hpZnQgPSBtaW4oKHUzMilQUklRX01BWF9TWl9TSElGVCwKKwkJCQkgICAgICAgcmVnID4+ IElEUjFfUFJJUV9TSElGVCAmIElEUjFfUFJJUV9NQVNLKTsKKworCS8qIFNJRC9TU0lEIHNpemVz ICovCisJc21tdS0+c3NpZF9iaXRzID0gcmVnID4+IElEUjFfU1NJRF9TSElGVCAmIElEUjFfU1NJ RF9NQVNLOworCXNtbXUtPnNpZF9iaXRzID0gcmVnID4+IElEUjFfU0lEX1NISUZUICYgSURSMV9T SURfTUFTSzsKKworCS8qCisJICogSWYgdGhlIFNNTVUgc3VwcG9ydHMgZmV3ZXIgYml0cyB0aGFu IHdvdWxkIGZpbGwgYSBzaW5nbGUgTDIgc3RyZWFtCisJICogdGFibGUsIHVzZSBhIGxpbmVhciB0 YWJsZSBpbnN0ZWFkLgorCSAqLworCWlmIChzbW11LT5zaWRfYml0cyA8PSBTVFJUQUJfU1BMSVQp CisJCXNtbXUtPmZlYXR1cmVzICY9IH5BUk1fU01NVV9GRUFUXzJfTFZMX1NUUlRBQjsKKworCS8q IElEUjUgKi8KKwlyZWcgPSByZWFkbF9yZWxheGVkKHNtbXUtPmJhc2UgKyBBUk1fU01NVV9JRFI1 KTsKKworCS8qIE1heGltdW0gbnVtYmVyIG9mIG91dHN0YW5kaW5nIHN0YWxscyAqLworCXNtbXUt PmV2dHEubWF4X3N0YWxscyA9IHJlZyA+PiBJRFI1X1NUQUxMX01BWF9TSElGVAorCQkJCSYgSURS NV9TVEFMTF9NQVhfTUFTSzsKKworCS8qIFBhZ2Ugc2l6ZXMgKi8KKwlpZiAocmVnICYgSURSNV9H UkFONjRLKQorCQlzbW11LT5wZ3NpemVfYml0bWFwIHw9IFNaXzY0SyB8IFNaXzUxMk07CisJaWYg KHJlZyAmIElEUjVfR1JBTjE2SykKKwkJc21tdS0+cGdzaXplX2JpdG1hcCB8PSBTWl8xNksgfCBT Wl8zMk07CisJaWYgKHJlZyAmIElEUjVfR1JBTjRLKQorCQlzbW11LT5wZ3NpemVfYml0bWFwIHw9 IFNaXzRLIHwgU1pfMk0gfCBTWl8xRzsKKworCWlmIChhcm1fc21tdV9vcHMucGdzaXplX2JpdG1h cCA9PSAtMVVMKQorCQlhcm1fc21tdV9vcHMucGdzaXplX2JpdG1hcCA9IHNtbXUtPnBnc2l6ZV9i aXRtYXA7CisJZWxzZQorCQlhcm1fc21tdV9vcHMucGdzaXplX2JpdG1hcCB8PSBzbW11LT5wZ3Np emVfYml0bWFwOworCisJLyogT3V0cHV0IGFkZHJlc3Mgc2l6ZSAqLworCXN3aXRjaCAocmVnICYg SURSNV9PQVNfTUFTSyA8PCBJRFI1X09BU19TSElGVCkgeworCWNhc2UgSURSNV9PQVNfMzJfQklU OgorCQlzbW11LT5vYXMgPSAzMjsKKwkJYnJlYWs7CisJY2FzZSBJRFI1X09BU18zNl9CSVQ6CisJ CXNtbXUtPm9hcyA9IDM2OworCQlicmVhazsKKwljYXNlIElEUjVfT0FTXzQwX0JJVDoKKwkJc21t dS0+b2FzID0gNDA7CisJCWJyZWFrOworCWNhc2UgSURSNV9PQVNfNDJfQklUOgorCQlzbW11LT5v YXMgPSA0MjsKKwkJYnJlYWs7CisJY2FzZSBJRFI1X09BU180NF9CSVQ6CisJCXNtbXUtPm9hcyA9 IDQ0OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfaW5mbyhzbW11LT5kZXYsCisJCQkidW5r bm93biBvdXRwdXQgYWRkcmVzcyBzaXplLiBUcnVuY2F0aW5nIHRvIDQ4LWJpdFxuIik7CisJCS8q IEZhbGx0aHJvdWdoICovCisJY2FzZSBJRFI1X09BU180OF9CSVQ6CisJCXNtbXUtPm9hcyA9IDQ4 OworCX0KKworCS8qIFNldCB0aGUgRE1BIG1hc2sgZm9yIG91ciB0YWJsZSB3YWxrZXIgKi8KKwlp ZiAoZG1hX3NldF9tYXNrX2FuZF9jb2hlcmVudChzbW11LT5kZXYsIERNQV9CSVRfTUFTSyhzbW11 LT5vYXMpKSkKKwkJZGV2X3dhcm4oc21tdS0+ZGV2LAorCQkJICJmYWlsZWQgdG8gc2V0IERNQSBt YXNrIGZvciB0YWJsZSB3YWxrZXJcbiIpOworCisJc21tdS0+aWFzID0gbWF4KHNtbXUtPmlhcywg c21tdS0+b2FzKTsKKworCWRldl9pbmZvKHNtbXUtPmRldiwgImlhcyAlbHUtYml0LCBvYXMgJWx1 LWJpdCAoZmVhdHVyZXMgMHglMDh4KVxuIiwKKwkJIHNtbXUtPmlhcywgc21tdS0+b2FzLCBzbW11 LT5mZWF0dXJlcyk7CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfQUNQSQorc3RhdGlj IGludCBhcm1fc21tdV9kZXZpY2VfYWNwaV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpw ZGV2LAorCQkJCSAgICAgIHN0cnVjdCBhcm1fc21tdV9kZXZpY2UgKnNtbXUpCit7CisJc3RydWN0 IGFjcGlfaW9ydF9zbW11X3YzICppb3J0X3NtbXU7CisJc3RydWN0IGRldmljZSAqZGV2ID0gc21t dS0+ZGV2OworCXN0cnVjdCBhY3BpX2lvcnRfbm9kZSAqbm9kZTsKKworCW5vZGUgPSAqKHN0cnVj dCBhY3BpX2lvcnRfbm9kZSAqKilkZXZfZ2V0X3BsYXRkYXRhKGRldik7CisKKwkvKiBSZXRyaWV2 ZSBTTU1VdjMgc3BlY2lmaWMgZGF0YSAqLworCWlvcnRfc21tdSA9IChzdHJ1Y3QgYWNwaV9pb3J0 X3NtbXVfdjMgKilub2RlLT5ub2RlX2RhdGE7CisKKwlpZiAoaW9ydF9zbW11LT5mbGFncyAmIEFD UElfSU9SVF9TTU1VX1YzX0NPSEFDQ19PVkVSUklERSkKKwkJc21tdS0+ZmVhdHVyZXMgfD0gQVJN X1NNTVVfRkVBVF9DT0hFUkVOQ1k7CisKKwlyZXR1cm4gMDsKK30KKyNlbHNlCitzdGF0aWMgaW5s aW5lIGludCBhcm1fc21tdV9kZXZpY2VfYWNwaV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNl ICpwZGV2LAorCQkJCQkgICAgIHN0cnVjdCBhcm1fc21tdV9kZXZpY2UgKnNtbXUpCit7CisJcmV0 dXJuIC1FTk9ERVY7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBhcm1fc21tdV9kZXZpY2VfZHRf cHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJCQkgICAgc3RydWN0IGFybV9z bW11X2RldmljZSAqc21tdSkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2Owor CXUzMiBjZWxsczsKKwlpbnQgcmV0ID0gLUVJTlZBTDsKKworCWlmIChvZl9wcm9wZXJ0eV9yZWFk X3UzMihkZXYtPm9mX25vZGUsICIjaW9tbXUtY2VsbHMiLCAmY2VsbHMpKQorCQlkZXZfZXJyKGRl diwgIm1pc3NpbmcgI2lvbW11LWNlbGxzIHByb3BlcnR5XG4iKTsKKwllbHNlIGlmIChjZWxscyAh PSAxKQorCQlkZXZfZXJyKGRldiwgImludmFsaWQgI2lvbW11LWNlbGxzIHZhbHVlICglZClcbiIs IGNlbGxzKTsKKwllbHNlCisJCXJldCA9IDA7CisKKwlwYXJzZV9kcml2ZXJfb3B0aW9ucyhzbW11 KTsKKworCWlmIChvZl9kbWFfaXNfY29oZXJlbnQoZGV2LT5vZl9ub2RlKSkKKwkJc21tdS0+ZmVh dHVyZXMgfD0gQVJNX1NNTVVfRkVBVF9DT0hFUkVOQ1k7CisKKwlyZXR1cm4gcmV0OworfQorCitz dGF0aWMgaW50IGFybV9zbW11X2RldmljZV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpw ZGV2KQoreworCWludCBpcnEsIHJldDsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlyZXNvdXJj ZV9zaXplX3QgaW9hZGRyOworCXN0cnVjdCBhcm1fc21tdV9kZXZpY2UgKnNtbXU7CisJc3RydWN0 IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKwlib29sIGJ5cGFzczsKKworCXNtbXUgPSBkZXZt X2t6YWxsb2MoZGV2LCBzaXplb2YoKnNtbXUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNtbXUpIHsK KwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gYWxsb2NhdGUgYXJtX3NtbXVfZGV2aWNlXG4iKTsK KwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXNtbXUtPmRldiA9IGRldjsKKworCS8qIEJhc2UgYWRk cmVzcyAqLworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01F TSwgMCk7CisJaWYgKHJlc291cmNlX3NpemUocmVzKSArIDEgPCBTWl8xMjhLKSB7CisJCWRldl9l cnIoZGV2LCAiTU1JTyByZWdpb24gdG9vIHNtYWxsICglcHIpXG4iLCByZXMpOworCQlyZXR1cm4g LUVJTlZBTDsKKwl9CisJaW9hZGRyID0gcmVzLT5zdGFydDsKKworCXNtbXUtPmJhc2UgPSBkZXZt X2lvcmVtYXBfcmVzb3VyY2UoZGV2LCByZXMpOworCWlmIChJU19FUlIoc21tdS0+YmFzZSkpCisJ CXJldHVybiBQVFJfRVJSKHNtbXUtPmJhc2UpOworCisJLyogSW50ZXJydXB0IGxpbmVzICovCisJ aXJxID0gcGxhdGZvcm1fZ2V0X2lycV9ieW5hbWUocGRldiwgImV2ZW50cSIpOworCWlmIChpcnEg PiAwKQorCQlzbW11LT5ldnRxLnEuaXJxID0gaXJxOworCisJaXJxID0gcGxhdGZvcm1fZ2V0X2ly cV9ieW5hbWUocGRldiwgInByaXEiKTsKKwlpZiAoaXJxID4gMCkKKwkJc21tdS0+cHJpcS5xLmly cSA9IGlycTsKKworCWlycSA9IHBsYXRmb3JtX2dldF9pcnFfYnluYW1lKHBkZXYsICJjbWRxLXN5 bmMiKTsKKwlpZiAoaXJxID4gMCkKKwkJc21tdS0+Y21kcS5xLmlycSA9IGlycTsKKworCWlycSA9 IHBsYXRmb3JtX2dldF9pcnFfYnluYW1lKHBkZXYsICJnZXJyb3IiKTsKKwlpZiAoaXJxID4gMCkK KwkJc21tdS0+Z2Vycl9pcnEgPSBpcnE7CisKKwlpZiAoZGV2LT5vZl9ub2RlKSB7CisJCXJldCA9 IGFybV9zbW11X2RldmljZV9kdF9wcm9iZShwZGV2LCBzbW11KTsKKwl9IGVsc2UgeworCQlyZXQg PSBhcm1fc21tdV9kZXZpY2VfYWNwaV9wcm9iZShwZGV2LCBzbW11KTsKKwkJaWYgKHJldCA9PSAt RU5PREVWKQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBTZXQgYnlwYXNzIG1vZGUgYWNjb3Jk aW5nIHRvIGZpcm13YXJlIHByb2JpbmcgcmVzdWx0ICovCisJYnlwYXNzID0gISFyZXQ7CisKKwkv KiBQcm9iZSB0aGUgaC93ICovCisJcmV0ID0gYXJtX3NtbXVfZGV2aWNlX2h3X3Byb2JlKHNtbXUp OworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiBJbml0aWFsaXNlIGluLW1lbW9yeSBk YXRhIHN0cnVjdHVyZXMgKi8KKwlyZXQgPSBhcm1fc21tdV9pbml0X3N0cnVjdHVyZXMoc21tdSk7 CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qIFJlY29yZCBvdXIgcHJpdmF0ZSBkZXZp Y2Ugc3RydWN0dXJlICovCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgc21tdSk7CisKKwkv KiBSZXNldCB0aGUgZGV2aWNlICovCisJcmV0ID0gYXJtX3NtbXVfZGV2aWNlX3Jlc2V0KHNtbXUs IGJ5cGFzcyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qIEFuZCB3ZSdyZSB1cC4g R28gZ28gZ28hICovCisJcmV0ID0gaW9tbXVfZGV2aWNlX3N5c2ZzX2FkZCgmc21tdS0+aW9tbXUs IGRldiwgTlVMTCwKKwkJCQkgICAgICJzbW11My4lcGEiLCAmaW9hZGRyKTsKKwlpZiAocmV0KQor CQlyZXR1cm4gcmV0OworCisJaW9tbXVfZGV2aWNlX3NldF9vcHMoJnNtbXUtPmlvbW11LCAmYXJt X3NtbXVfb3BzKTsKKwlpb21tdV9kZXZpY2Vfc2V0X2Z3bm9kZSgmc21tdS0+aW9tbXUsIGRldi0+ Zndub2RlKTsKKworCXJldCA9IGlvbW11X2RldmljZV9yZWdpc3Rlcigmc21tdS0+aW9tbXUpOwor CisjaWZkZWYgQ09ORklHX1BDSQorCWlmIChwY2lfYnVzX3R5cGUuaW9tbXVfb3BzICE9ICZhcm1f c21tdV9vcHMpIHsKKwkJcGNpX3JlcXVlc3RfYWNzKCk7CisJCXJldCA9IGJ1c19zZXRfaW9tbXUo JnBjaV9idXNfdHlwZSwgJmFybV9zbW11X29wcyk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0 OworCX0KKyNlbmRpZgorI2lmZGVmIENPTkZJR19BUk1fQU1CQQorCWlmIChhbWJhX2J1c3R5cGUu aW9tbXVfb3BzICE9ICZhcm1fc21tdV9vcHMpIHsKKwkJcmV0ID0gYnVzX3NldF9pb21tdSgmYW1i YV9idXN0eXBlLCAmYXJtX3NtbXVfb3BzKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJ fQorI2VuZGlmCisJaWYgKHBsYXRmb3JtX2J1c190eXBlLmlvbW11X29wcyAhPSAmYXJtX3NtbXVf b3BzKSB7CisJCXJldCA9IGJ1c19zZXRfaW9tbXUoJnBsYXRmb3JtX2J1c190eXBlLCAmYXJtX3Nt bXVfb3BzKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCXJldHVybiAwOworfQor CitzdGF0aWMgaW50IGFybV9zbW11X2RldmljZV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2Rldmlj ZSAqcGRldikKK3sKKwlzdHJ1Y3QgYXJtX3NtbXVfZGV2aWNlICpzbW11ID0gcGxhdGZvcm1fZ2V0 X2RydmRhdGEocGRldik7CisKKwlhcm1fc21tdV9kZXZpY2VfZGlzYWJsZShzbW11KTsKKwlyZXR1 cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgYXJtX3NtbXVfb2ZfbWF0Y2hb XSA9IHsKKwl7IC5jb21wYXRpYmxlID0gImFybSxzbW11LXYzIiwgfSwKKwl7IH0sCit9OworTU9E VUxFX0RFVklDRV9UQUJMRShvZiwgYXJtX3NtbXVfb2ZfbWF0Y2gpOworCitzdGF0aWMgc3RydWN0 IHBsYXRmb3JtX2RyaXZlciBhcm1fc21tdV9kcml2ZXIgPSB7CisJLmRyaXZlcgk9IHsKKwkJLm5h bWUJCT0gImFybS1zbW11LXYzIiwKKwkJLm9mX21hdGNoX3RhYmxlCT0gb2ZfbWF0Y2hfcHRyKGFy bV9zbW11X29mX21hdGNoKSwKKwl9LAorCS5wcm9iZQk9IGFybV9zbW11X2RldmljZV9wcm9iZSwK KwkucmVtb3ZlCT0gYXJtX3NtbXVfZGV2aWNlX3JlbW92ZSwKK307Cittb2R1bGVfcGxhdGZvcm1f ZHJpdmVyKGFybV9zbW11X2RyaXZlcik7CisKK0lPTU1VX09GX0RFQ0xBUkUoYXJtX3NtbXV2Mywg ImFybSxzbW11LXYzIiwgTlVMTCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiSU9NTVUgQVBJIGZv ciBBUk0gYXJjaGl0ZWN0ZWQgU01NVXYzIGltcGxlbWVudGF0aW9ucyIpOworTU9EVUxFX0FVVEhP UigiV2lsbCBEZWFjb24gPHdpbGwuZGVhY29uQGFybS5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgi R1BMIHYyIik7Ci0tIApRdWFsY29tbSBEYXRhY2VudGVyIFRlY2hub2xvZ2llcyBhcyBhbiBhZmZp bGlhdGUgb2YgUXVhbGNvbW0gVGVjaG5vbG9naWVzLCBJbmMuIFF1YWxjb21tIFRlY2hub2xvZ2ll cywgSW5jLiBpcyBhIG1lbWJlciBvZiB0aGUgQ29kZSBBdXJvcmEgRm9ydW0sIGEgTGludXggRm91 bmRhdGlvbiBDb2xsYWJvcmF0aXZlIFByb2plY3QuCgoKX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX18KWGVuLWRldmVsIG1haWxpbmcgbGlzdApYZW4tZGV2ZWxA bGlzdHMueGVuLm9yZwpodHRwczovL2xpc3RzLnhlbi5vcmcveGVuLWRldmVsCg==