From mboxrd@z Thu Jan 1 00:00:00 1970 From: Sameer Goel Subject: [RFC v4 5/8] Add verbatim copy of arm-smmu-v3.c from Linux Date: Mon, 18 Dec 2017 20:17:00 -0700 Message-ID: <20171219031703.23420-6-sameer.goel@linaro.org> References: <20171219031703.23420-1-sameer.goel@linaro.org> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from us1-rack-dfw2.inumbo.com ([104.130.134.6]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1eR8PG-0006cO-5e for xen-devel@lists.xenproject.org; Tue, 19 Dec 2017 03:17:26 +0000 Received: by mail-pl0-x244.google.com with SMTP id s10so6142547plj.5 for ; Mon, 18 Dec 2017 19:17:21 -0800 (PST) In-Reply-To: <20171219031703.23420-1-sameer.goel@linaro.org> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" To: xen-devel@lists.xenproject.org, julien.grall@arm.com, mjaggi@caviumnetworks.com Cc: sstabellini@kernel.org, shankerd@codeaurora.org, andre.przywara@linaro.org, Sameer Goel List-Id: xen-devel@lists.xenproject.org QmFzZWQgb24gY29tbWl0IDdhYTg2MTlhNjZhZWE1MmIxNDVlMDRjYmFiNGY4ZDZhNGU1ZjNmM2IK VGhpcyBpcyBhIHZlcmJhdGltIHNuYXBzaG90IG9mIGFybS1zbW11LXYzLmMgZnJvbSBMaW51eCBr ZXJuZWwgc291cmNlCmNvZGUuCk5vIFhlbiBjb2RlIGhhcyBiZWVuIGFkZGVkIGFuZCB0aGUgZmls ZSBpcyBub3QgYnVpbHQuCgpTaWduZWQtb2ZmLWJ5OiBTYW1lZXIgR29lbCA8c2FtZWVyLmdvZWxA bGluYXJvLm9yZz4KLS0tCiB4ZW4vZHJpdmVycy9wYXNzdGhyb3VnaC9hcm0vc21tdS12My5jIHwg Mjg4NSArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKIDEgZmlsZSBjaGFuZ2VkLCAy ODg1IGluc2VydGlvbnMoKykKIGNyZWF0ZSBtb2RlIDEwMDY0NCB4ZW4vZHJpdmVycy9wYXNzdGhy b3VnaC9hcm0vc21tdS12My5jCgpkaWZmIC0tZ2l0IGEveGVuL2RyaXZlcnMvcGFzc3Rocm91Z2gv YXJtL3NtbXUtdjMuYyBiL3hlbi9kcml2ZXJzL3Bhc3N0aHJvdWdoL2FybS9zbW11LXYzLmMKbmV3 IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMC4uZTY3YmE2YzQwZgotLS0gL2Rldi9u dWxsCisrKyBiL3hlbi9kcml2ZXJzL3Bhc3N0aHJvdWdoL2FybS9zbW11LXYzLmMKQEAgLTAsMCAr MSwyODg1IEBACisvKgorICogSU9NTVUgQVBJIGZvciBBUk0gYXJjaGl0ZWN0ZWQgU01NVXYzIGlt cGxlbWVudGF0aW9ucy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91 IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1z IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxp c2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3Jh bSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICog YnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFu dHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVS UE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRl dGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05V IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYg bm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICoKKyAqIENvcHlyaWdo dCAoQykgMjAxNSBBUk0gTGltaXRlZAorICoKKyAqIEF1dGhvcjogV2lsbCBEZWFjb24gPHdpbGwu ZGVhY29uQGFybS5jb20+CisgKgorICogVGhpcyBkcml2ZXIgaXMgcG93ZXJlZCBieSBiYWQgY29m ZmVlIGFuZCBib21iYXkgbWl4LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CisjaW5j bHVkZSA8bGludXgvYWNwaV9pb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNs dWRlIDxsaW51eC9kbWEtaW9tbXUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRl IDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb21tdS5oPgorI2luY2x1ZGUg PGxpbnV4L2lvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxp bnV4L21zaS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfYWRk cmVzcy5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2lvbW11Lmg+CisjaW5jbHVkZSA8bGludXgvb2Zf cGxhdGZvcm0uaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0 Zm9ybV9kZXZpY2UuaD4KKworI2luY2x1ZGUgPGxpbnV4L2FtYmEvYnVzLmg+CisKKyNpbmNsdWRl ICJpby1wZ3RhYmxlLmgiCisKKy8qIE1NSU8gcmVnaXN0ZXJzICovCisjZGVmaW5lIEFSTV9TTU1V X0lEUjAJCQkweDAKKyNkZWZpbmUgSURSMF9TVF9MVkxfU0hJRlQJCTI3CisjZGVmaW5lIElEUjBf U1RfTFZMX01BU0sJCTB4MworI2RlZmluZSBJRFIwX1NUX0xWTF8yTFZMCQkoMSA8PCBJRFIwX1NU X0xWTF9TSElGVCkKKyNkZWZpbmUgSURSMF9TVEFMTF9NT0RFTF9TSElGVAkJMjQKKyNkZWZpbmUg SURSMF9TVEFMTF9NT0RFTF9NQVNLCQkweDMKKyNkZWZpbmUgSURSMF9TVEFMTF9NT0RFTF9TVEFM TAkJKDAgPDwgSURSMF9TVEFMTF9NT0RFTF9TSElGVCkKKyNkZWZpbmUgSURSMF9TVEFMTF9NT0RF TF9GT1JDRQkJKDIgPDwgSURSMF9TVEFMTF9NT0RFTF9TSElGVCkKKyNkZWZpbmUgSURSMF9UVEVO RElBTl9TSElGVAkJMjEKKyNkZWZpbmUgSURSMF9UVEVORElBTl9NQVNLCQkweDMKKyNkZWZpbmUg SURSMF9UVEVORElBTl9MRQkJKDIgPDwgSURSMF9UVEVORElBTl9TSElGVCkKKyNkZWZpbmUgSURS MF9UVEVORElBTl9CRQkJKDMgPDwgSURSMF9UVEVORElBTl9TSElGVCkKKyNkZWZpbmUgSURSMF9U VEVORElBTl9NSVhFRAkJKDAgPDwgSURSMF9UVEVORElBTl9TSElGVCkKKyNkZWZpbmUgSURSMF9D RDJMCQkJKDEgPDwgMTkpCisjZGVmaW5lIElEUjBfVk1JRDE2CQkJKDEgPDwgMTgpCisjZGVmaW5l IElEUjBfUFJJCQkJKDEgPDwgMTYpCisjZGVmaW5lIElEUjBfU0VWCQkJKDEgPDwgMTQpCisjZGVm aW5lIElEUjBfTVNJCQkJKDEgPDwgMTMpCisjZGVmaW5lIElEUjBfQVNJRDE2CQkJKDEgPDwgMTIp CisjZGVmaW5lIElEUjBfQVRTCQkJKDEgPDwgMTApCisjZGVmaW5lIElEUjBfSFlQCQkJKDEgPDwg OSkKKyNkZWZpbmUgSURSMF9DT0hBQ0MJCQkoMSA8PCA0KQorI2RlZmluZSBJRFIwX1RURl9TSElG VAkJCTIKKyNkZWZpbmUgSURSMF9UVEZfTUFTSwkJCTB4MworI2RlZmluZSBJRFIwX1RURl9BQVJD SDY0CQkoMiA8PCBJRFIwX1RURl9TSElGVCkKKyNkZWZpbmUgSURSMF9UVEZfQUFSQ0gzMl82NAkJ KDMgPDwgSURSMF9UVEZfU0hJRlQpCisjZGVmaW5lIElEUjBfUzFQCQkJKDEgPDwgMSkKKyNkZWZp bmUgSURSMF9TMlAJCQkoMSA8PCAwKQorCisjZGVmaW5lIEFSTV9TTU1VX0lEUjEJCQkweDQKKyNk ZWZpbmUgSURSMV9UQUJMRVNfUFJFU0VUCQkoMSA8PCAzMCkKKyNkZWZpbmUgSURSMV9RVUVVRVNf UFJFU0VUCQkoMSA8PCAyOSkKKyNkZWZpbmUgSURSMV9SRUwJCQkoMSA8PCAyOCkKKyNkZWZpbmUg SURSMV9DTURRX1NISUZUCQkJMjEKKyNkZWZpbmUgSURSMV9DTURRX01BU0sJCQkweDFmCisjZGVm aW5lIElEUjFfRVZUUV9TSElGVAkJCTE2CisjZGVmaW5lIElEUjFfRVZUUV9NQVNLCQkJMHgxZgor I2RlZmluZSBJRFIxX1BSSVFfU0hJRlQJCQkxMQorI2RlZmluZSBJRFIxX1BSSVFfTUFTSwkJCTB4 MWYKKyNkZWZpbmUgSURSMV9TU0lEX1NISUZUCQkJNgorI2RlZmluZSBJRFIxX1NTSURfTUFTSwkJ CTB4MWYKKyNkZWZpbmUgSURSMV9TSURfU0hJRlQJCQkwCisjZGVmaW5lIElEUjFfU0lEX01BU0sJ CQkweDNmCisKKyNkZWZpbmUgQVJNX1NNTVVfSURSNQkJCTB4MTQKKyNkZWZpbmUgSURSNV9TVEFM TF9NQVhfU0hJRlQJCTE2CisjZGVmaW5lIElEUjVfU1RBTExfTUFYX01BU0sJCTB4ZmZmZgorI2Rl ZmluZSBJRFI1X0dSQU42NEsJCQkoMSA8PCA2KQorI2RlZmluZSBJRFI1X0dSQU4xNksJCQkoMSA8 PCA1KQorI2RlZmluZSBJRFI1X0dSQU40SwkJCSgxIDw8IDQpCisjZGVmaW5lIElEUjVfT0FTX1NI SUZUCQkJMAorI2RlZmluZSBJRFI1X09BU19NQVNLCQkJMHg3CisjZGVmaW5lIElEUjVfT0FTXzMy X0JJVAkJCSgwIDw8IElEUjVfT0FTX1NISUZUKQorI2RlZmluZSBJRFI1X09BU18zNl9CSVQJCQko MSA8PCBJRFI1X09BU19TSElGVCkKKyNkZWZpbmUgSURSNV9PQVNfNDBfQklUCQkJKDIgPDwgSURS NV9PQVNfU0hJRlQpCisjZGVmaW5lIElEUjVfT0FTXzQyX0JJVAkJCSgzIDw8IElEUjVfT0FTX1NI SUZUKQorI2RlZmluZSBJRFI1X09BU180NF9CSVQJCQkoNCA8PCBJRFI1X09BU19TSElGVCkKKyNk ZWZpbmUgSURSNV9PQVNfNDhfQklUCQkJKDUgPDwgSURSNV9PQVNfU0hJRlQpCisKKyNkZWZpbmUg QVJNX1NNTVVfQ1IwCQkJMHgyMAorI2RlZmluZSBDUjBfQ01EUUVOCQkJKDEgPDwgMykKKyNkZWZp bmUgQ1IwX0VWVFFFTgkJCSgxIDw8IDIpCisjZGVmaW5lIENSMF9QUklRRU4JCQkoMSA8PCAxKQor I2RlZmluZSBDUjBfU01NVUVOCQkJKDEgPDwgMCkKKworI2RlZmluZSBBUk1fU01NVV9DUjBBQ0sJ CQkweDI0CisKKyNkZWZpbmUgQVJNX1NNTVVfQ1IxCQkJMHgyOAorI2RlZmluZSBDUjFfU0hfTlNI CQkJMAorI2RlZmluZSBDUjFfU0hfT1NICQkJMgorI2RlZmluZSBDUjFfU0hfSVNICQkJMworI2Rl ZmluZSBDUjFfQ0FDSEVfTkMJCQkwCisjZGVmaW5lIENSMV9DQUNIRV9XQgkJCTEKKyNkZWZpbmUg Q1IxX0NBQ0hFX1dUCQkJMgorI2RlZmluZSBDUjFfVEFCTEVfU0hfU0hJRlQJCTEwCisjZGVmaW5l IENSMV9UQUJMRV9PQ19TSElGVAkJOAorI2RlZmluZSBDUjFfVEFCTEVfSUNfU0hJRlQJCTYKKyNk ZWZpbmUgQ1IxX1FVRVVFX1NIX1NISUZUCQk0CisjZGVmaW5lIENSMV9RVUVVRV9PQ19TSElGVAkJ MgorI2RlZmluZSBDUjFfUVVFVUVfSUNfU0hJRlQJCTAKKworI2RlZmluZSBBUk1fU01NVV9DUjIJ CQkweDJjCisjZGVmaW5lIENSMl9QVE0JCQkJKDEgPDwgMikKKyNkZWZpbmUgQ1IyX1JFQ0lOVlNJ RAkJCSgxIDw8IDEpCisjZGVmaW5lIENSMl9FMkgJCQkJKDEgPDwgMCkKKworI2RlZmluZSBBUk1f U01NVV9HQlBBCQkJMHg0NAorI2RlZmluZSBHQlBBX0FCT1JUCQkJKDEgPDwgMjApCisjZGVmaW5l IEdCUEFfVVBEQVRFCQkJKDEgPDwgMzEpCisKKyNkZWZpbmUgQVJNX1NNTVVfSVJRX0NUUkwJCTB4 NTAKKyNkZWZpbmUgSVJRX0NUUkxfRVZUUV9JUlFFTgkJKDEgPDwgMikKKyNkZWZpbmUgSVJRX0NU UkxfUFJJUV9JUlFFTgkJKDEgPDwgMSkKKyNkZWZpbmUgSVJRX0NUUkxfR0VSUk9SX0lSUUVOCQko MSA8PCAwKQorCisjZGVmaW5lIEFSTV9TTU1VX0lSUV9DVFJMQUNLCQkweDU0CisKKyNkZWZpbmUg QVJNX1NNTVVfR0VSUk9SCQkJMHg2MAorI2RlZmluZSBHRVJST1JfU0ZNX0VSUgkJCSgxIDw8IDgp CisjZGVmaW5lIEdFUlJPUl9NU0lfR0VSUk9SX0FCVF9FUlIJKDEgPDwgNykKKyNkZWZpbmUgR0VS Uk9SX01TSV9QUklRX0FCVF9FUlIJCSgxIDw8IDYpCisjZGVmaW5lIEdFUlJPUl9NU0lfRVZUUV9B QlRfRVJSCQkoMSA8PCA1KQorI2RlZmluZSBHRVJST1JfTVNJX0NNRFFfQUJUX0VSUgkJKDEgPDwg NCkKKyNkZWZpbmUgR0VSUk9SX1BSSVFfQUJUX0VSUgkJKDEgPDwgMykKKyNkZWZpbmUgR0VSUk9S X0VWVFFfQUJUX0VSUgkJKDEgPDwgMikKKyNkZWZpbmUgR0VSUk9SX0NNRFFfRVJSCQkJKDEgPDwg MCkKKyNkZWZpbmUgR0VSUk9SX0VSUl9NQVNLCQkJMHhmZAorCisjZGVmaW5lIEFSTV9TTU1VX0dF UlJPUk4JCTB4NjQKKworI2RlZmluZSBBUk1fU01NVV9HRVJST1JfSVJRX0NGRzAJMHg2OAorI2Rl ZmluZSBBUk1fU01NVV9HRVJST1JfSVJRX0NGRzEJMHg3MAorI2RlZmluZSBBUk1fU01NVV9HRVJS T1JfSVJRX0NGRzIJMHg3NAorCisjZGVmaW5lIEFSTV9TTU1VX1NUUlRBQl9CQVNFCQkweDgwCisj ZGVmaW5lIFNUUlRBQl9CQVNFX1JBCQkJKDFVTCA8PCA2MikKKyNkZWZpbmUgU1RSVEFCX0JBU0Vf QUREUl9TSElGVAkJNgorI2RlZmluZSBTVFJUQUJfQkFTRV9BRERSX01BU0sJCTB4M2ZmZmZmZmZm ZmZVTAorCisjZGVmaW5lIEFSTV9TTU1VX1NUUlRBQl9CQVNFX0NGRwkweDg4CisjZGVmaW5lIFNU UlRBQl9CQVNFX0NGR19MT0cyU0laRV9TSElGVAkwCisjZGVmaW5lIFNUUlRBQl9CQVNFX0NGR19M T0cyU0laRV9NQVNLCTB4M2YKKyNkZWZpbmUgU1RSVEFCX0JBU0VfQ0ZHX1NQTElUX1NISUZUCTYK KyNkZWZpbmUgU1RSVEFCX0JBU0VfQ0ZHX1NQTElUX01BU0sJMHgxZgorI2RlZmluZSBTVFJUQUJf QkFTRV9DRkdfRk1UX1NISUZUCTE2CisjZGVmaW5lIFNUUlRBQl9CQVNFX0NGR19GTVRfTUFTSwkw eDMKKyNkZWZpbmUgU1RSVEFCX0JBU0VfQ0ZHX0ZNVF9MSU5FQVIJKDAgPDwgU1RSVEFCX0JBU0Vf Q0ZHX0ZNVF9TSElGVCkKKyNkZWZpbmUgU1RSVEFCX0JBU0VfQ0ZHX0ZNVF8yTFZMCSgxIDw8IFNU UlRBQl9CQVNFX0NGR19GTVRfU0hJRlQpCisKKyNkZWZpbmUgQVJNX1NNTVVfQ01EUV9CQVNFCQkw eDkwCisjZGVmaW5lIEFSTV9TTU1VX0NNRFFfUFJPRAkJMHg5OAorI2RlZmluZSBBUk1fU01NVV9D TURRX0NPTlMJCTB4OWMKKworI2RlZmluZSBBUk1fU01NVV9FVlRRX0JBU0UJCTB4YTAKKyNkZWZp bmUgQVJNX1NNTVVfRVZUUV9QUk9ECQkweDEwMGE4CisjZGVmaW5lIEFSTV9TTU1VX0VWVFFfQ09O UwkJMHgxMDBhYworI2RlZmluZSBBUk1fU01NVV9FVlRRX0lSUV9DRkcwCQkweGIwCisjZGVmaW5l IEFSTV9TTU1VX0VWVFFfSVJRX0NGRzEJCTB4YjgKKyNkZWZpbmUgQVJNX1NNTVVfRVZUUV9JUlFf Q0ZHMgkJMHhiYworCisjZGVmaW5lIEFSTV9TTU1VX1BSSVFfQkFTRQkJMHhjMAorI2RlZmluZSBB Uk1fU01NVV9QUklRX1BST0QJCTB4MTAwYzgKKyNkZWZpbmUgQVJNX1NNTVVfUFJJUV9DT05TCQkw eDEwMGNjCisjZGVmaW5lIEFSTV9TTU1VX1BSSVFfSVJRX0NGRzAJCTB4ZDAKKyNkZWZpbmUgQVJN X1NNTVVfUFJJUV9JUlFfQ0ZHMQkJMHhkOAorI2RlZmluZSBBUk1fU01NVV9QUklRX0lSUV9DRkcy CQkweGRjCisKKy8qIENvbW1vbiBNU0kgY29uZmlnIGZpZWxkcyAqLworI2RlZmluZSBNU0lfQ0ZH MF9BRERSX1NISUZUCQkyCisjZGVmaW5lIE1TSV9DRkcwX0FERFJfTUFTSwkJMHgzZmZmZmZmZmZm ZmZVTAorI2RlZmluZSBNU0lfQ0ZHMl9TSF9TSElGVAkJNAorI2RlZmluZSBNU0lfQ0ZHMl9TSF9O U0gJCQkoMFVMIDw8IE1TSV9DRkcyX1NIX1NISUZUKQorI2RlZmluZSBNU0lfQ0ZHMl9TSF9PU0gJ CQkoMlVMIDw8IE1TSV9DRkcyX1NIX1NISUZUKQorI2RlZmluZSBNU0lfQ0ZHMl9TSF9JU0gJCQko M1VMIDw8IE1TSV9DRkcyX1NIX1NISUZUKQorI2RlZmluZSBNU0lfQ0ZHMl9NRU1BVFRSX1NISUZU CQkwCisjZGVmaW5lIE1TSV9DRkcyX01FTUFUVFJfREVWSUNFX25HblJFCSgweDEgPDwgTVNJX0NG RzJfTUVNQVRUUl9TSElGVCkKKworI2RlZmluZSBRX0lEWChxLCBwKQkJCSgocCkgJiAoKDEgPDwg KHEpLT5tYXhfbl9zaGlmdCkgLSAxKSkKKyNkZWZpbmUgUV9XUlAocSwgcCkJCQkoKHApICYgKDEg PDwgKHEpLT5tYXhfbl9zaGlmdCkpCisjZGVmaW5lIFFfT1ZFUkZMT1dfRkxBRwkJCSgxIDw8IDMx KQorI2RlZmluZSBRX09WRihxLCBwKQkJCSgocCkgJiBRX09WRVJGTE9XX0ZMQUcpCisjZGVmaW5l IFFfRU5UKHEsIHApCQkJKChxKS0+YmFzZSArCQkJXAorCQkJCQkgUV9JRFgocSwgcCkgKiAocSkt PmVudF9kd29yZHMpCisKKyNkZWZpbmUgUV9CQVNFX1JXQQkJCSgxVUwgPDwgNjIpCisjZGVmaW5l IFFfQkFTRV9BRERSX1NISUZUCQk1CisjZGVmaW5lIFFfQkFTRV9BRERSX01BU0sJCTB4ZmZmZmZm ZmZmZmZVTAorI2RlZmluZSBRX0JBU0VfTE9HMlNJWkVfU0hJRlQJCTAKKyNkZWZpbmUgUV9CQVNF X0xPRzJTSVpFX01BU0sJCTB4MWZVTAorCisvKgorICogU3RyZWFtIHRhYmxlLgorICoKKyAqIExp bmVhcjogRW5vdWdoIHRvIGNvdmVyIDEgPDwgSURSMS5TSURTSVpFIGVudHJpZXMKKyAqIDJsdmw6 IDEyOGsgTDEgZW50cmllcywKKyAqICAgICAgIDI1NiBsYXp5IGVudHJpZXMgcGVyIHRhYmxlIChl YWNoIHRhYmxlIGNvdmVycyBhIFBDSSBidXMpCisgKi8KKyNkZWZpbmUgU1RSVEFCX0wxX1NaX1NI SUZUCQkyMAorI2RlZmluZSBTVFJUQUJfU1BMSVQJCQk4CisKKyNkZWZpbmUgU1RSVEFCX0wxX0RF U0NfRFdPUkRTCQkxCisjZGVmaW5lIFNUUlRBQl9MMV9ERVNDX1NQQU5fU0hJRlQJMAorI2RlZmlu ZSBTVFJUQUJfTDFfREVTQ19TUEFOX01BU0sJMHgxZlVMCisjZGVmaW5lIFNUUlRBQl9MMV9ERVND X0wyUFRSX1NISUZUCTYKKyNkZWZpbmUgU1RSVEFCX0wxX0RFU0NfTDJQVFJfTUFTSwkweDNmZmZm ZmZmZmZmVUwKKworI2RlZmluZSBTVFJUQUJfU1RFX0RXT1JEUwkJOAorI2RlZmluZSBTVFJUQUJf U1RFXzBfVgkJCSgxVUwgPDwgMCkKKyNkZWZpbmUgU1RSVEFCX1NURV8wX0NGR19TSElGVAkJMQor I2RlZmluZSBTVFJUQUJfU1RFXzBfQ0ZHX01BU0sJCTB4N1VMCisjZGVmaW5lIFNUUlRBQl9TVEVf MF9DRkdfQUJPUlQJCSgwVUwgPDwgU1RSVEFCX1NURV8wX0NGR19TSElGVCkKKyNkZWZpbmUgU1RS VEFCX1NURV8wX0NGR19CWVBBU1MJCSg0VUwgPDwgU1RSVEFCX1NURV8wX0NGR19TSElGVCkKKyNk ZWZpbmUgU1RSVEFCX1NURV8wX0NGR19TMV9UUkFOUwkoNVVMIDw8IFNUUlRBQl9TVEVfMF9DRkdf U0hJRlQpCisjZGVmaW5lIFNUUlRBQl9TVEVfMF9DRkdfUzJfVFJBTlMJKDZVTCA8PCBTVFJUQUJf U1RFXzBfQ0ZHX1NISUZUKQorCisjZGVmaW5lIFNUUlRBQl9TVEVfMF9TMUZNVF9TSElGVAk0Cisj ZGVmaW5lIFNUUlRBQl9TVEVfMF9TMUZNVF9MSU5FQVIJKDBVTCA8PCBTVFJUQUJfU1RFXzBfUzFG TVRfU0hJRlQpCisjZGVmaW5lIFNUUlRBQl9TVEVfMF9TMUNUWFBUUl9TSElGVAk2CisjZGVmaW5l IFNUUlRBQl9TVEVfMF9TMUNUWFBUUl9NQVNLCTB4M2ZmZmZmZmZmZmZVTAorI2RlZmluZSBTVFJU QUJfU1RFXzBfUzFDRE1BWF9TSElGVAk1OQorI2RlZmluZSBTVFJUQUJfU1RFXzBfUzFDRE1BWF9N QVNLCTB4MWZVTAorCisjZGVmaW5lIFNUUlRBQl9TVEVfMV9TMUNfQ0FDSEVfTkMJMFVMCisjZGVm aW5lIFNUUlRBQl9TVEVfMV9TMUNfQ0FDSEVfV0JSQQkxVUwKKyNkZWZpbmUgU1RSVEFCX1NURV8x X1MxQ19DQUNIRV9XVAkyVUwKKyNkZWZpbmUgU1RSVEFCX1NURV8xX1MxQ19DQUNIRV9XQgkzVUwK KyNkZWZpbmUgU1RSVEFCX1NURV8xX1MxQ19TSF9OU0gJCTBVTAorI2RlZmluZSBTVFJUQUJfU1RF XzFfUzFDX1NIX09TSAkJMlVMCisjZGVmaW5lIFNUUlRBQl9TVEVfMV9TMUNfU0hfSVNICQkzVUwK KyNkZWZpbmUgU1RSVEFCX1NURV8xX1MxQ0lSX1NISUZUCTIKKyNkZWZpbmUgU1RSVEFCX1NURV8x X1MxQ09SX1NISUZUCTQKKyNkZWZpbmUgU1RSVEFCX1NURV8xX1MxQ1NIX1NISUZUCTYKKworI2Rl ZmluZSBTVFJUQUJfU1RFXzFfUzFTVEFMTEQJCSgxVUwgPDwgMjcpCisKKyNkZWZpbmUgU1RSVEFC X1NURV8xX0VBVFNfQUJUCQkwVUwKKyNkZWZpbmUgU1RSVEFCX1NURV8xX0VBVFNfVFJBTlMJCTFV TAorI2RlZmluZSBTVFJUQUJfU1RFXzFfRUFUU19TMUNISwkJMlVMCisjZGVmaW5lIFNUUlRBQl9T VEVfMV9FQVRTX1NISUZUCQkyOAorCisjZGVmaW5lIFNUUlRBQl9TVEVfMV9TVFJXX05TRUwxCQkw VUwKKyNkZWZpbmUgU1RSVEFCX1NURV8xX1NUUldfRUwyCQkyVUwKKyNkZWZpbmUgU1RSVEFCX1NU RV8xX1NUUldfU0hJRlQJCTMwCisKKyNkZWZpbmUgU1RSVEFCX1NURV8xX1NIQ0ZHX0lOQ09NSU5H CTFVTAorI2RlZmluZSBTVFJUQUJfU1RFXzFfU0hDRkdfU0hJRlQJNDQKKworI2RlZmluZSBTVFJU QUJfU1RFXzJfUzJWTUlEX1NISUZUCTAKKyNkZWZpbmUgU1RSVEFCX1NURV8yX1MyVk1JRF9NQVNL CTB4ZmZmZlVMCisjZGVmaW5lIFNUUlRBQl9TVEVfMl9WVENSX1NISUZUCQkzMgorI2RlZmluZSBT VFJUQUJfU1RFXzJfVlRDUl9NQVNLCQkweDdmZmZmVUwKKyNkZWZpbmUgU1RSVEFCX1NURV8yX1My QUE2NAkJKDFVTCA8PCA1MSkKKyNkZWZpbmUgU1RSVEFCX1NURV8yX1MyRU5ESQkJKDFVTCA8PCA1 MikKKyNkZWZpbmUgU1RSVEFCX1NURV8yX1MyUFRXCQkoMVVMIDw8IDU0KQorI2RlZmluZSBTVFJU QUJfU1RFXzJfUzJSCQkoMVVMIDw8IDU4KQorCisjZGVmaW5lIFNUUlRBQl9TVEVfM19TMlRUQl9T SElGVAk0CisjZGVmaW5lIFNUUlRBQl9TVEVfM19TMlRUQl9NQVNLCQkweGZmZmZmZmZmZmZmVUwK KworLyogQ29udGV4dCBkZXNjcmlwdG9yIChzdGFnZS0xIG9ubHkpICovCisjZGVmaW5lIENUWERF U0NfQ0RfRFdPUkRTCQk4CisjZGVmaW5lIENUWERFU0NfQ0RfMF9UQ1JfVDBTWl9TSElGVAkwCisj ZGVmaW5lIEFSTTY0X1RDUl9UMFNaX1NISUZUCQkwCisjZGVmaW5lIEFSTTY0X1RDUl9UMFNaX01B U0sJCTB4MWZVTAorI2RlZmluZSBDVFhERVNDX0NEXzBfVENSX1RHMF9TSElGVAk2CisjZGVmaW5l IEFSTTY0X1RDUl9URzBfU0hJRlQJCTE0CisjZGVmaW5lIEFSTTY0X1RDUl9URzBfTUFTSwkJMHgz VUwKKyNkZWZpbmUgQ1RYREVTQ19DRF8wX1RDUl9JUkdOMF9TSElGVAk4CisjZGVmaW5lIEFSTTY0 X1RDUl9JUkdOMF9TSElGVAkJOAorI2RlZmluZSBBUk02NF9UQ1JfSVJHTjBfTUFTSwkJMHgzVUwK KyNkZWZpbmUgQ1RYREVTQ19DRF8wX1RDUl9PUkdOMF9TSElGVAkxMAorI2RlZmluZSBBUk02NF9U Q1JfT1JHTjBfU0hJRlQJCTEwCisjZGVmaW5lIEFSTTY0X1RDUl9PUkdOMF9NQVNLCQkweDNVTAor I2RlZmluZSBDVFhERVNDX0NEXzBfVENSX1NIMF9TSElGVAkxMgorI2RlZmluZSBBUk02NF9UQ1Jf U0gwX1NISUZUCQkxMgorI2RlZmluZSBBUk02NF9UQ1JfU0gwX01BU0sJCTB4M1VMCisjZGVmaW5l IENUWERFU0NfQ0RfMF9UQ1JfRVBEMF9TSElGVAkxNAorI2RlZmluZSBBUk02NF9UQ1JfRVBEMF9T SElGVAkJNworI2RlZmluZSBBUk02NF9UQ1JfRVBEMF9NQVNLCQkweDFVTAorI2RlZmluZSBDVFhE RVNDX0NEXzBfVENSX0VQRDFfU0hJRlQJMzAKKyNkZWZpbmUgQVJNNjRfVENSX0VQRDFfU0hJRlQJ CTIzCisjZGVmaW5lIEFSTTY0X1RDUl9FUEQxX01BU0sJCTB4MVVMCisKKyNkZWZpbmUgQ1RYREVT Q19DRF8wX0VOREkJCSgxVUwgPDwgMTUpCisjZGVmaW5lIENUWERFU0NfQ0RfMF9WCQkJKDFVTCA8 PCAzMSkKKworI2RlZmluZSBDVFhERVNDX0NEXzBfVENSX0lQU19TSElGVAkzMgorI2RlZmluZSBB Uk02NF9UQ1JfSVBTX1NISUZUCQkzMgorI2RlZmluZSBBUk02NF9UQ1JfSVBTX01BU0sJCTB4N1VM CisjZGVmaW5lIENUWERFU0NfQ0RfMF9UQ1JfVEJJMF9TSElGVAkzOAorI2RlZmluZSBBUk02NF9U Q1JfVEJJMF9TSElGVAkJMzcKKyNkZWZpbmUgQVJNNjRfVENSX1RCSTBfTUFTSwkJMHgxVUwKKwor I2RlZmluZSBDVFhERVNDX0NEXzBfQUE2NAkJKDFVTCA8PCA0MSkKKyNkZWZpbmUgQ1RYREVTQ19D RF8wX1IJCQkoMVVMIDw8IDQ1KQorI2RlZmluZSBDVFhERVNDX0NEXzBfQQkJCSgxVUwgPDwgNDYp CisjZGVmaW5lIENUWERFU0NfQ0RfMF9BU0VUX1NISUZUCQk0NworI2RlZmluZSBDVFhERVNDX0NE XzBfQVNFVF9TSEFSRUQJKDBVTCA8PCBDVFhERVNDX0NEXzBfQVNFVF9TSElGVCkKKyNkZWZpbmUg Q1RYREVTQ19DRF8wX0FTRVRfUFJJVkFURQkoMVVMIDw8IENUWERFU0NfQ0RfMF9BU0VUX1NISUZU KQorI2RlZmluZSBDVFhERVNDX0NEXzBfQVNJRF9TSElGVAkJNDgKKyNkZWZpbmUgQ1RYREVTQ19D RF8wX0FTSURfTUFTSwkJMHhmZmZmVUwKKworI2RlZmluZSBDVFhERVNDX0NEXzFfVFRCMF9TSElG VAkJNAorI2RlZmluZSBDVFhERVNDX0NEXzFfVFRCMF9NQVNLCQkweGZmZmZmZmZmZmZmVUwKKwor I2RlZmluZSBDVFhERVNDX0NEXzNfTUFJUl9TSElGVAkJMAorCisvKiBDb252ZXJ0IGJldHdlZW4g QUFyY2g2NCAoQ1BVKSBUQ1IgZm9ybWF0IGFuZCBTTU1VIENEIGZvcm1hdCAqLworI2RlZmluZSBB Uk1fU01NVV9UQ1IyQ0QodGNyLCBmbGQpCQkJCQlcCisJKCgodGNyKSA+PiBBUk02NF9UQ1JfIyNm bGQjI19TSElGVCAmIEFSTTY0X1RDUl8jI2ZsZCMjX01BU0spCVwKKwkgPDwgQ1RYREVTQ19DRF8w X1RDUl8jI2ZsZCMjX1NISUZUKQorCisvKiBDb21tYW5kIHF1ZXVlICovCisjZGVmaW5lIENNRFFf RU5UX0RXT1JEUwkJCTIKKyNkZWZpbmUgQ01EUV9NQVhfU1pfU0hJRlQJCTgKKworI2RlZmluZSBD TURRX0VSUl9TSElGVAkJCTI0CisjZGVmaW5lIENNRFFfRVJSX01BU0sJCQkweDdmCisjZGVmaW5l IENNRFFfRVJSX0NFUlJPUl9OT05FX0lEWAkwCisjZGVmaW5lIENNRFFfRVJSX0NFUlJPUl9JTExf SURYCQkxCisjZGVmaW5lIENNRFFfRVJSX0NFUlJPUl9BQlRfSURYCQkyCisKKyNkZWZpbmUgQ01E UV8wX09QX1NISUZUCQkJMAorI2RlZmluZSBDTURRXzBfT1BfTUFTSwkJCTB4ZmZVTAorI2RlZmlu ZSBDTURRXzBfU1NWCQkJKDFVTCA8PCAxMSkKKworI2RlZmluZSBDTURRX1BSRUZFVENIXzBfU0lE X1NISUZUCTMyCisjZGVmaW5lIENNRFFfUFJFRkVUQ0hfMV9TSVpFX1NISUZUCTAKKyNkZWZpbmUg Q01EUV9QUkVGRVRDSF8xX0FERFJfTUFTSwl+MHhmZmZVTAorCisjZGVmaW5lIENNRFFfQ0ZHSV8w X1NJRF9TSElGVAkJMzIKKyNkZWZpbmUgQ01EUV9DRkdJXzBfU0lEX01BU0sJCTB4ZmZmZmZmZmZV TAorI2RlZmluZSBDTURRX0NGR0lfMV9MRUFGCQkoMVVMIDw8IDApCisjZGVmaW5lIENNRFFfQ0ZH SV8xX1JBTkdFX1NISUZUCQkwCisjZGVmaW5lIENNRFFfQ0ZHSV8xX1JBTkdFX01BU0sJCTB4MWZV TAorCisjZGVmaW5lIENNRFFfVExCSV8wX1ZNSURfU0hJRlQJCTMyCisjZGVmaW5lIENNRFFfVExC SV8wX0FTSURfU0hJRlQJCTQ4CisjZGVmaW5lIENNRFFfVExCSV8xX0xFQUYJCSgxVUwgPDwgMCkK KyNkZWZpbmUgQ01EUV9UTEJJXzFfVkFfTUFTSwkJfjB4ZmZmVUwKKyNkZWZpbmUgQ01EUV9UTEJJ XzFfSVBBX01BU0sJCTB4ZmZmZmZmZmZmMDAwVUwKKworI2RlZmluZSBDTURRX1BSSV8wX1NTSURf U0hJRlQJCTEyCisjZGVmaW5lIENNRFFfUFJJXzBfU1NJRF9NQVNLCQkweGZmZmZmVUwKKyNkZWZp bmUgQ01EUV9QUklfMF9TSURfU0hJRlQJCTMyCisjZGVmaW5lIENNRFFfUFJJXzBfU0lEX01BU0sJ CTB4ZmZmZmZmZmZVTAorI2RlZmluZSBDTURRX1BSSV8xX0dSUElEX1NISUZUCQkwCisjZGVmaW5l IENNRFFfUFJJXzFfR1JQSURfTUFTSwkJMHgxZmZVTAorI2RlZmluZSBDTURRX1BSSV8xX1JFU1Bf U0hJRlQJCTEyCisjZGVmaW5lIENNRFFfUFJJXzFfUkVTUF9ERU5ZCQkoMFVMIDw8IENNRFFfUFJJ XzFfUkVTUF9TSElGVCkKKyNkZWZpbmUgQ01EUV9QUklfMV9SRVNQX0ZBSUwJCSgxVUwgPDwgQ01E UV9QUklfMV9SRVNQX1NISUZUKQorI2RlZmluZSBDTURRX1BSSV8xX1JFU1BfU1VDQwkJKDJVTCA8 PCBDTURRX1BSSV8xX1JFU1BfU0hJRlQpCisKKyNkZWZpbmUgQ01EUV9TWU5DXzBfQ1NfU0hJRlQJ CTEyCisjZGVmaW5lIENNRFFfU1lOQ18wX0NTX05PTkUJCSgwVUwgPDwgQ01EUV9TWU5DXzBfQ1Nf U0hJRlQpCisjZGVmaW5lIENNRFFfU1lOQ18wX0NTX1NFVgkJKDJVTCA8PCBDTURRX1NZTkNfMF9D U19TSElGVCkKKworLyogRXZlbnQgcXVldWUgKi8KKyNkZWZpbmUgRVZUUV9FTlRfRFdPUkRTCQkJ NAorI2RlZmluZSBFVlRRX01BWF9TWl9TSElGVAkJNworCisjZGVmaW5lIEVWVFFfMF9JRF9TSElG VAkJCTAKKyNkZWZpbmUgRVZUUV8wX0lEX01BU0sJCQkweGZmVUwKKworLyogUFJJIHF1ZXVlICov CisjZGVmaW5lIFBSSVFfRU5UX0RXT1JEUwkJCTIKKyNkZWZpbmUgUFJJUV9NQVhfU1pfU0hJRlQJ CTgKKworI2RlZmluZSBQUklRXzBfU0lEX1NISUZUCQkwCisjZGVmaW5lIFBSSVFfMF9TSURfTUFT SwkJCTB4ZmZmZmZmZmZVTAorI2RlZmluZSBQUklRXzBfU1NJRF9TSElGVAkJMzIKKyNkZWZpbmUg UFJJUV8wX1NTSURfTUFTSwkJMHhmZmZmZlVMCisjZGVmaW5lIFBSSVFfMF9QRVJNX1BSSVYJCSgx VUwgPDwgNTgpCisjZGVmaW5lIFBSSVFfMF9QRVJNX0VYRUMJCSgxVUwgPDwgNTkpCisjZGVmaW5l IFBSSVFfMF9QRVJNX1JFQUQJCSgxVUwgPDwgNjApCisjZGVmaW5lIFBSSVFfMF9QRVJNX1dSSVRF CQkoMVVMIDw8IDYxKQorI2RlZmluZSBQUklRXzBfUFJHX0xBU1QJCQkoMVVMIDw8IDYyKQorI2Rl ZmluZSBQUklRXzBfU1NJRF9WCQkJKDFVTCA8PCA2MykKKworI2RlZmluZSBQUklRXzFfUFJHX0lE WF9TSElGVAkJMAorI2RlZmluZSBQUklRXzFfUFJHX0lEWF9NQVNLCQkweDFmZlVMCisjZGVmaW5l IFBSSVFfMV9BRERSX1NISUZUCQkxMgorI2RlZmluZSBQUklRXzFfQUREUl9NQVNLCQkweGZmZmZm ZmZmZmZmZmZVTAorCisvKiBIaWdoLWxldmVsIHF1ZXVlIHN0cnVjdHVyZXMgKi8KKyNkZWZpbmUg QVJNX1NNTVVfUE9MTF9USU1FT1VUX1VTCTEwMAorI2RlZmluZSBBUk1fU01NVV9DTURRX0RSQUlO X1RJTUVPVVRfVVMJMTAwMDAwMCAvKiAxcyEgKi8KKworI2RlZmluZSBNU0lfSU9WQV9CQVNFCQkJ MHg4MDAwMDAwCisjZGVmaW5lIE1TSV9JT1ZBX0xFTkdUSAkJCTB4MTAwMDAwCisKKy8qIFVudGls IEFDUElDQSBoZWFkZXJzIGNvdmVyIElPUlQgcmV2LiBDICovCisjaWZuZGVmIEFDUElfSU9SVF9T TU1VX0hJU0lMSUNPTl9ISTE2MVgKKyNkZWZpbmUgQUNQSV9JT1JUX1NNTVVfSElTSUxJQ09OX0hJ MTYxWAkJMHgxCisjZW5kaWYKKworI2lmbmRlZiBBQ1BJX0lPUlRfU01NVV9WM19DQVZJVU1fQ045 OVhYCisjZGVmaW5lIEFDUElfSU9SVF9TTU1VX1YzX0NBVklVTV9DTjk5WFgJCTB4MgorI2VuZGlm CisKK3N0YXRpYyBib29sIGRpc2FibGVfYnlwYXNzOworbW9kdWxlX3BhcmFtX25hbWVkKGRpc2Fi bGVfYnlwYXNzLCBkaXNhYmxlX2J5cGFzcywgYm9vbCwgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9E RVNDKGRpc2FibGVfYnlwYXNzLAorCSJEaXNhYmxlIGJ5cGFzcyBzdHJlYW1zIHN1Y2ggdGhhdCBp bmNvbWluZyB0cmFuc2FjdGlvbnMgZnJvbSBkZXZpY2VzIHRoYXQgYXJlIG5vdCBhdHRhY2hlZCB0 byBhbiBpb21tdSBkb21haW4gd2lsbCByZXBvcnQgYW4gYWJvcnQgYmFjayB0byB0aGUgZGV2aWNl IGFuZCB3aWxsIG5vdCBiZSBhbGxvd2VkIHRvIHBhc3MgdGhyb3VnaCB0aGUgU01NVS4iKTsKKwor ZW51bSBwcmlfcmVzcCB7CisJUFJJX1JFU1BfREVOWSwKKwlQUklfUkVTUF9GQUlMLAorCVBSSV9S RVNQX1NVQ0MsCit9OworCitlbnVtIGFybV9zbW11X21zaV9pbmRleCB7CisJRVZUUV9NU0lfSU5E RVgsCisJR0VSUk9SX01TSV9JTkRFWCwKKwlQUklRX01TSV9JTkRFWCwKKwlBUk1fU01NVV9NQVhf TVNJUywKK307CisKK3N0YXRpYyBwaHlzX2FkZHJfdCBhcm1fc21tdV9tc2lfY2ZnW0FSTV9TTU1V X01BWF9NU0lTXVszXSA9IHsKKwlbRVZUUV9NU0lfSU5ERVhdID0geworCQlBUk1fU01NVV9FVlRR X0lSUV9DRkcwLAorCQlBUk1fU01NVV9FVlRRX0lSUV9DRkcxLAorCQlBUk1fU01NVV9FVlRRX0lS UV9DRkcyLAorCX0sCisJW0dFUlJPUl9NU0lfSU5ERVhdID0geworCQlBUk1fU01NVV9HRVJST1Jf SVJRX0NGRzAsCisJCUFSTV9TTU1VX0dFUlJPUl9JUlFfQ0ZHMSwKKwkJQVJNX1NNTVVfR0VSUk9S X0lSUV9DRkcyLAorCX0sCisJW1BSSVFfTVNJX0lOREVYXSA9IHsKKwkJQVJNX1NNTVVfUFJJUV9J UlFfQ0ZHMCwKKwkJQVJNX1NNTVVfUFJJUV9JUlFfQ0ZHMSwKKwkJQVJNX1NNTVVfUFJJUV9JUlFf Q0ZHMiwKKwl9LAorfTsKKworc3RydWN0IGFybV9zbW11X2NtZHFfZW50IHsKKwkvKiBDb21tb24g ZmllbGRzICovCisJdTgJCQkJb3Bjb2RlOworCWJvb2wJCQkJc3Vic3RyZWFtX3ZhbGlkOworCisJ LyogQ29tbWFuZC1zcGVjaWZpYyBmaWVsZHMgKi8KKwl1bmlvbiB7CisJCSNkZWZpbmUgQ01EUV9P UF9QUkVGRVRDSF9DRkcJMHgxCisJCXN0cnVjdCB7CisJCQl1MzIJCQlzaWQ7CisJCQl1OAkJCXNp emU7CisJCQl1NjQJCQlhZGRyOworCQl9IHByZWZldGNoOworCisJCSNkZWZpbmUgQ01EUV9PUF9D RkdJX1NURQkweDMKKwkJI2RlZmluZSBDTURRX09QX0NGR0lfQUxMCTB4NAorCQlzdHJ1Y3Qgewor CQkJdTMyCQkJc2lkOworCQkJdW5pb24geworCQkJCWJvb2wJCWxlYWY7CisJCQkJdTgJCXNwYW47 CisJCQl9OworCQl9IGNmZ2k7CisKKwkJI2RlZmluZSBDTURRX09QX1RMQklfTkhfQVNJRAkweDEx CisJCSNkZWZpbmUgQ01EUV9PUF9UTEJJX05IX1ZBCTB4MTIKKwkJI2RlZmluZSBDTURRX09QX1RM QklfRUwyX0FMTAkweDIwCisJCSNkZWZpbmUgQ01EUV9PUF9UTEJJX1MxMl9WTUFMTAkweDI4CisJ CSNkZWZpbmUgQ01EUV9PUF9UTEJJX1MyX0lQQQkweDJhCisJCSNkZWZpbmUgQ01EUV9PUF9UTEJJ X05TTkhfQUxMCTB4MzAKKwkJc3RydWN0IHsKKwkJCXUxNgkJCWFzaWQ7CisJCQl1MTYJCQl2bWlk OworCQkJYm9vbAkJCWxlYWY7CisJCQl1NjQJCQlhZGRyOworCQl9IHRsYmk7CisKKwkJI2RlZmlu ZSBDTURRX09QX1BSSV9SRVNQCTB4NDEKKwkJc3RydWN0IHsKKwkJCXUzMgkJCXNpZDsKKwkJCXUz MgkJCXNzaWQ7CisJCQl1MTYJCQlncnBpZDsKKwkJCWVudW0gcHJpX3Jlc3AJCXJlc3A7CisJCX0g cHJpOworCisJCSNkZWZpbmUgQ01EUV9PUF9DTURfU1lOQwkweDQ2CisJfTsKK307CisKK3N0cnVj dCBhcm1fc21tdV9xdWV1ZSB7CisJaW50CQkJCWlycTsgLyogV2lyZWQgaW50ZXJydXB0ICovCisK KwlfX2xlNjQJCQkJKmJhc2U7CisJZG1hX2FkZHJfdAkJCWJhc2VfZG1hOworCXU2NAkJCQlxX2Jh c2U7CisKKwlzaXplX3QJCQkJZW50X2R3b3JkczsKKwl1MzIJCQkJbWF4X25fc2hpZnQ7CisJdTMy CQkJCXByb2Q7CisJdTMyCQkJCWNvbnM7CisKKwl1MzIgX19pb21lbQkJCSpwcm9kX3JlZzsKKwl1 MzIgX19pb21lbQkJCSpjb25zX3JlZzsKK307CisKK3N0cnVjdCBhcm1fc21tdV9jbWRxIHsKKwlz dHJ1Y3QgYXJtX3NtbXVfcXVldWUJCXE7CisJc3BpbmxvY2tfdAkJCWxvY2s7Cit9OworCitzdHJ1 Y3QgYXJtX3NtbXVfZXZ0cSB7CisJc3RydWN0IGFybV9zbW11X3F1ZXVlCQlxOworCXUzMgkJCQlt YXhfc3RhbGxzOworfTsKKworc3RydWN0IGFybV9zbW11X3ByaXEgeworCXN0cnVjdCBhcm1fc21t dV9xdWV1ZQkJcTsKK307CisKKy8qIEhpZ2gtbGV2ZWwgc3RyZWFtIHRhYmxlIGFuZCBjb250ZXh0 IGRlc2NyaXB0b3Igc3RydWN0dXJlcyAqLworc3RydWN0IGFybV9zbW11X3N0cnRhYl9sMV9kZXNj IHsKKwl1OAkJCQlzcGFuOworCisJX19sZTY0CQkJCSpsMnB0cjsKKwlkbWFfYWRkcl90CQkJbDJw dHJfZG1hOworfTsKKworc3RydWN0IGFybV9zbW11X3MxX2NmZyB7CisJX19sZTY0CQkJCSpjZHB0 cjsKKwlkbWFfYWRkcl90CQkJY2RwdHJfZG1hOworCisJc3RydWN0IGFybV9zbW11X2N0eF9kZXNj IHsKKwkJdTE2CWFzaWQ7CisJCXU2NAl0dGJyOworCQl1NjQJdGNyOworCQl1NjQJbWFpcjsKKwl9 CQkJCWNkOworfTsKKworc3RydWN0IGFybV9zbW11X3MyX2NmZyB7CisJdTE2CQkJCXZtaWQ7CisJ dTY0CQkJCXZ0dGJyOworCXU2NAkJCQl2dGNyOworfTsKKworc3RydWN0IGFybV9zbW11X3N0cnRh Yl9lbnQgeworCS8qCisJICogQW4gU1RFIGlzICJhc3NpZ25lZCIgaWYgdGhlIG1hc3RlciBlbWl0 dGluZyB0aGUgY29ycmVzcG9uZGluZyBTSUQKKwkgKiBpcyBhdHRhY2hlZCB0byBhIGRvbWFpbi4g VGhlIGJlaGF2aW91ciBvZiBhbiB1bmFzc2lnbmVkIFNURSBpcworCSAqIGRldGVybWluZWQgYnkg dGhlIGRpc2FibGVfYnlwYXNzIHBhcmFtZXRlciwgd2hlcmVhcyBhbiBhc3NpZ25lZAorCSAqIFNU RSBiZWhhdmVzIGFjY29yZGluZyB0byBzMV9jZmcvczJfY2ZnLCB3aGljaCB0aGVtc2VsdmVzIGFy ZQorCSAqIGNvbmZpZ3VyZWQgYWNjb3JkaW5nIHRvIHRoZSBkb21haW4gdHlwZS4KKwkgKi8KKwli b29sCQkJCWFzc2lnbmVkOworCXN0cnVjdCBhcm1fc21tdV9zMV9jZmcJCSpzMV9jZmc7CisJc3Ry dWN0IGFybV9zbW11X3MyX2NmZwkJKnMyX2NmZzsKK307CisKK3N0cnVjdCBhcm1fc21tdV9zdHJ0 YWJfY2ZnIHsKKwlfX2xlNjQJCQkJKnN0cnRhYjsKKwlkbWFfYWRkcl90CQkJc3RydGFiX2RtYTsK KwlzdHJ1Y3QgYXJtX3NtbXVfc3RydGFiX2wxX2Rlc2MJKmwxX2Rlc2M7CisJdW5zaWduZWQgaW50 CQkJbnVtX2wxX2VudHM7CisKKwl1NjQJCQkJc3RydGFiX2Jhc2U7CisJdTMyCQkJCXN0cnRhYl9i YXNlX2NmZzsKK307CisKKy8qIEFuIFNNTVV2MyBpbnN0YW5jZSAqLworc3RydWN0IGFybV9zbW11 X2RldmljZSB7CisJc3RydWN0IGRldmljZQkJCSpkZXY7CisJdm9pZCBfX2lvbWVtCQkJKmJhc2U7 CisKKyNkZWZpbmUgQVJNX1NNTVVfRkVBVF8yX0xWTF9TVFJUQUIJKDEgPDwgMCkKKyNkZWZpbmUg QVJNX1NNTVVfRkVBVF8yX0xWTF9DRFRBQgkoMSA8PCAxKQorI2RlZmluZSBBUk1fU01NVV9GRUFU X1RUX0xFCQkoMSA8PCAyKQorI2RlZmluZSBBUk1fU01NVV9GRUFUX1RUX0JFCQkoMSA8PCAzKQor I2RlZmluZSBBUk1fU01NVV9GRUFUX1BSSQkJKDEgPDwgNCkKKyNkZWZpbmUgQVJNX1NNTVVfRkVB VF9BVFMJCSgxIDw8IDUpCisjZGVmaW5lIEFSTV9TTU1VX0ZFQVRfU0VWCQkoMSA8PCA2KQorI2Rl ZmluZSBBUk1fU01NVV9GRUFUX01TSQkJKDEgPDwgNykKKyNkZWZpbmUgQVJNX1NNTVVfRkVBVF9D T0hFUkVOQ1kJCSgxIDw8IDgpCisjZGVmaW5lIEFSTV9TTU1VX0ZFQVRfVFJBTlNfUzEJCSgxIDw8 IDkpCisjZGVmaW5lIEFSTV9TTU1VX0ZFQVRfVFJBTlNfUzIJCSgxIDw8IDEwKQorI2RlZmluZSBB Uk1fU01NVV9GRUFUX1NUQUxMUwkJKDEgPDwgMTEpCisjZGVmaW5lIEFSTV9TTU1VX0ZFQVRfSFlQ CQkoMSA8PCAxMikKKwl1MzIJCQkJZmVhdHVyZXM7CisKKyNkZWZpbmUgQVJNX1NNTVVfT1BUX1NL SVBfUFJFRkVUQ0gJKDEgPDwgMCkKKyNkZWZpbmUgQVJNX1NNTVVfT1BUX1BBR0UwX1JFR1NfT05M WQkoMSA8PCAxKQorCXUzMgkJCQlvcHRpb25zOworCisJc3RydWN0IGFybV9zbW11X2NtZHEJCWNt ZHE7CisJc3RydWN0IGFybV9zbW11X2V2dHEJCWV2dHE7CisJc3RydWN0IGFybV9zbW11X3ByaXEJ CXByaXE7CisKKwlpbnQJCQkJZ2Vycl9pcnE7CisJaW50CQkJCWNvbWJpbmVkX2lycTsKKworCXVu c2lnbmVkIGxvbmcJCQlpYXM7IC8qIElQQSAqLworCXVuc2lnbmVkIGxvbmcJCQlvYXM7IC8qIFBB ICovCisJdW5zaWduZWQgbG9uZwkJCXBnc2l6ZV9iaXRtYXA7CisKKyNkZWZpbmUgQVJNX1NNTVVf TUFYX0FTSURTCQkoMSA8PCAxNikKKwl1bnNpZ25lZCBpbnQJCQlhc2lkX2JpdHM7CisJREVDTEFS RV9CSVRNQVAoYXNpZF9tYXAsIEFSTV9TTU1VX01BWF9BU0lEUyk7CisKKyNkZWZpbmUgQVJNX1NN TVVfTUFYX1ZNSURTCQkoMSA8PCAxNikKKwl1bnNpZ25lZCBpbnQJCQl2bWlkX2JpdHM7CisJREVD TEFSRV9CSVRNQVAodm1pZF9tYXAsIEFSTV9TTU1VX01BWF9WTUlEUyk7CisKKwl1bnNpZ25lZCBp bnQJCQlzc2lkX2JpdHM7CisJdW5zaWduZWQgaW50CQkJc2lkX2JpdHM7CisKKwlzdHJ1Y3QgYXJt X3NtbXVfc3RydGFiX2NmZwlzdHJ0YWJfY2ZnOworCisJLyogSU9NTVUgY29yZSBjb2RlIGhhbmRs ZSAqLworCXN0cnVjdCBpb21tdV9kZXZpY2UJCWlvbW11OworfTsKKworLyogU01NVSBwcml2YXRl IGRhdGEgZm9yIGVhY2ggbWFzdGVyICovCitzdHJ1Y3QgYXJtX3NtbXVfbWFzdGVyX2RhdGEgewor CXN0cnVjdCBhcm1fc21tdV9kZXZpY2UJCSpzbW11OworCXN0cnVjdCBhcm1fc21tdV9zdHJ0YWJf ZW50CXN0ZTsKK307CisKKy8qIFNNTVUgcHJpdmF0ZSBkYXRhIGZvciBhbiBJT01NVSBkb21haW4g Ki8KK2VudW0gYXJtX3NtbXVfZG9tYWluX3N0YWdlIHsKKwlBUk1fU01NVV9ET01BSU5fUzEgPSAw LAorCUFSTV9TTU1VX0RPTUFJTl9TMiwKKwlBUk1fU01NVV9ET01BSU5fTkVTVEVELAorCUFSTV9T TU1VX0RPTUFJTl9CWVBBU1MsCit9OworCitzdHJ1Y3QgYXJtX3NtbXVfZG9tYWluIHsKKwlzdHJ1 Y3QgYXJtX3NtbXVfZGV2aWNlCQkqc21tdTsKKwlzdHJ1Y3QgbXV0ZXgJCQlpbml0X211dGV4OyAv KiBQcm90ZWN0cyBzbW11IHBvaW50ZXIgKi8KKworCXN0cnVjdCBpb19wZ3RhYmxlX29wcwkJKnBn dGJsX29wczsKKworCWVudW0gYXJtX3NtbXVfZG9tYWluX3N0YWdlCXN0YWdlOworCXVuaW9uIHsK KwkJc3RydWN0IGFybV9zbW11X3MxX2NmZwlzMV9jZmc7CisJCXN0cnVjdCBhcm1fc21tdV9zMl9j ZmcJczJfY2ZnOworCX07CisKKwlzdHJ1Y3QgaW9tbXVfZG9tYWluCQlkb21haW47Cit9OworCitz dHJ1Y3QgYXJtX3NtbXVfb3B0aW9uX3Byb3AgeworCXUzMiBvcHQ7CisJY29uc3QgY2hhciAqcHJv cDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXJtX3NtbXVfb3B0aW9uX3Byb3AgYXJtX3NtbXVfb3B0 aW9uc1tdID0geworCXsgQVJNX1NNTVVfT1BUX1NLSVBfUFJFRkVUQ0gsICJoaXNpbGljb24sYnJv a2VuLXByZWZldGNoLWNtZCIgfSwKKwl7IEFSTV9TTU1VX09QVF9QQUdFMF9SRUdTX09OTFksICJj YXZpdW0sY245OTAwLWJyb2tlbi1wYWdlMS1yZWdzcGFjZSJ9LAorCXsgMCwgTlVMTH0sCit9Owor CitzdGF0aWMgaW5saW5lIHZvaWQgX19pb21lbSAqYXJtX3NtbXVfcGFnZTFfZml4dXAodW5zaWdu ZWQgbG9uZyBvZmZzZXQsCisJCQkJCQkgc3RydWN0IGFybV9zbW11X2RldmljZSAqc21tdSkKK3sK KwlpZiAoKG9mZnNldCA+IFNaXzY0SykgJiYKKwkgICAgKHNtbXUtPm9wdGlvbnMgJiBBUk1fU01N VV9PUFRfUEFHRTBfUkVHU19PTkxZKSkKKwkJb2Zmc2V0IC09IFNaXzY0SzsKKworCXJldHVybiBz bW11LT5iYXNlICsgb2Zmc2V0OworfQorCitzdGF0aWMgc3RydWN0IGFybV9zbW11X2RvbWFpbiAq dG9fc21tdV9kb21haW4oc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tKQoreworCXJldHVybiBjb250 YWluZXJfb2YoZG9tLCBzdHJ1Y3QgYXJtX3NtbXVfZG9tYWluLCBkb21haW4pOworfQorCitzdGF0 aWMgdm9pZCBwYXJzZV9kcml2ZXJfb3B0aW9ucyhzdHJ1Y3QgYXJtX3NtbXVfZGV2aWNlICpzbW11 KQoreworCWludCBpID0gMDsKKworCWRvIHsKKwkJaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChz bW11LT5kZXYtPm9mX25vZGUsCisJCQkJCQlhcm1fc21tdV9vcHRpb25zW2ldLnByb3ApKSB7CisJ CQlzbW11LT5vcHRpb25zIHw9IGFybV9zbW11X29wdGlvbnNbaV0ub3B0OworCQkJZGV2X25vdGlj ZShzbW11LT5kZXYsICJvcHRpb24gJXNcbiIsCisJCQkJYXJtX3NtbXVfb3B0aW9uc1tpXS5wcm9w KTsKKwkJfQorCX0gd2hpbGUgKGFybV9zbW11X29wdGlvbnNbKytpXS5vcHQpOworfQorCisvKiBM b3ctbGV2ZWwgcXVldWUgbWFuaXB1bGF0aW9uIGZ1bmN0aW9ucyAqLworc3RhdGljIGJvb2wgcXVl dWVfZnVsbChzdHJ1Y3QgYXJtX3NtbXVfcXVldWUgKnEpCit7CisJcmV0dXJuIFFfSURYKHEsIHEt PnByb2QpID09IFFfSURYKHEsIHEtPmNvbnMpICYmCisJICAgICAgIFFfV1JQKHEsIHEtPnByb2Qp ICE9IFFfV1JQKHEsIHEtPmNvbnMpOworfQorCitzdGF0aWMgYm9vbCBxdWV1ZV9lbXB0eShzdHJ1 Y3QgYXJtX3NtbXVfcXVldWUgKnEpCit7CisJcmV0dXJuIFFfSURYKHEsIHEtPnByb2QpID09IFFf SURYKHEsIHEtPmNvbnMpICYmCisJICAgICAgIFFfV1JQKHEsIHEtPnByb2QpID09IFFfV1JQKHEs IHEtPmNvbnMpOworfQorCitzdGF0aWMgdm9pZCBxdWV1ZV9zeW5jX2NvbnMoc3RydWN0IGFybV9z bW11X3F1ZXVlICpxKQoreworCXEtPmNvbnMgPSByZWFkbF9yZWxheGVkKHEtPmNvbnNfcmVnKTsK K30KKworc3RhdGljIHZvaWQgcXVldWVfaW5jX2NvbnMoc3RydWN0IGFybV9zbW11X3F1ZXVlICpx KQoreworCXUzMiBjb25zID0gKFFfV1JQKHEsIHEtPmNvbnMpIHwgUV9JRFgocSwgcS0+Y29ucykp ICsgMTsKKworCXEtPmNvbnMgPSBRX09WRihxLCBxLT5jb25zKSB8IFFfV1JQKHEsIGNvbnMpIHwg UV9JRFgocSwgY29ucyk7CisJd3JpdGVsKHEtPmNvbnMsIHEtPmNvbnNfcmVnKTsKK30KKworc3Rh dGljIGludCBxdWV1ZV9zeW5jX3Byb2Qoc3RydWN0IGFybV9zbW11X3F1ZXVlICpxKQoreworCWlu dCByZXQgPSAwOworCXUzMiBwcm9kID0gcmVhZGxfcmVsYXhlZChxLT5wcm9kX3JlZyk7CisKKwlp ZiAoUV9PVkYocSwgcHJvZCkgIT0gUV9PVkYocSwgcS0+cHJvZCkpCisJCXJldCA9IC1FT1ZFUkZM T1c7CisKKwlxLT5wcm9kID0gcHJvZDsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBx dWV1ZV9pbmNfcHJvZChzdHJ1Y3QgYXJtX3NtbXVfcXVldWUgKnEpCit7CisJdTMyIHByb2QgPSAo UV9XUlAocSwgcS0+cHJvZCkgfCBRX0lEWChxLCBxLT5wcm9kKSkgKyAxOworCisJcS0+cHJvZCA9 IFFfT1ZGKHEsIHEtPnByb2QpIHwgUV9XUlAocSwgcHJvZCkgfCBRX0lEWChxLCBwcm9kKTsKKwl3 cml0ZWwocS0+cHJvZCwgcS0+cHJvZF9yZWcpOworfQorCisvKgorICogV2FpdCBmb3IgdGhlIFNN TVUgdG8gY29uc3VtZSBpdGVtcy4gSWYgZHJhaW4gaXMgdHJ1ZSwgd2FpdCB1bnRpbCB0aGUgcXVl dWUKKyAqIGlzIGVtcHR5LiBPdGhlcndpc2UsIHdhaXQgdW50aWwgdGhlcmUgaXMgYXQgbGVhc3Qg b25lIGZyZWUgc2xvdC4KKyAqLworc3RhdGljIGludCBxdWV1ZV9wb2xsX2NvbnMoc3RydWN0IGFy bV9zbW11X3F1ZXVlICpxLCBib29sIGRyYWluLCBib29sIHdmZSkKK3sKKwlrdGltZV90IHRpbWVv dXQ7CisJdW5zaWduZWQgaW50IGRlbGF5ID0gMTsKKworCS8qIFdhaXQgbG9uZ2VyIGlmIGl0J3Mg cXVldWUgZHJhaW4gKi8KKwl0aW1lb3V0ID0ga3RpbWVfYWRkX3VzKGt0aW1lX2dldCgpLCBkcmFp biA/CisJCQkJCSAgICBBUk1fU01NVV9DTURRX0RSQUlOX1RJTUVPVVRfVVMgOgorCQkJCQkgICAg QVJNX1NNTVVfUE9MTF9USU1FT1VUX1VTKTsKKworCXdoaWxlIChxdWV1ZV9zeW5jX2NvbnMocSks IChkcmFpbiA/ICFxdWV1ZV9lbXB0eShxKSA6IHF1ZXVlX2Z1bGwocSkpKSB7CisJCWlmIChrdGlt ZV9jb21wYXJlKGt0aW1lX2dldCgpLCB0aW1lb3V0KSA+IDApCisJCQlyZXR1cm4gLUVUSU1FRE9V VDsKKworCQlpZiAod2ZlKSB7CisJCQl3ZmUoKTsKKwkJfSBlbHNlIHsKKwkJCWNwdV9yZWxheCgp OworCQkJdWRlbGF5KGRlbGF5KTsKKwkJCWRlbGF5ICo9IDI7CisJCX0KKwl9CisKKwlyZXR1cm4g MDsKK30KKworc3RhdGljIHZvaWQgcXVldWVfd3JpdGUoX19sZTY0ICpkc3QsIHU2NCAqc3JjLCBz aXplX3Qgbl9kd29yZHMpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbl9kd29yZHM7 ICsraSkKKwkJKmRzdCsrID0gY3B1X3RvX2xlNjQoKnNyYysrKTsKK30KKworc3RhdGljIGludCBx dWV1ZV9pbnNlcnRfcmF3KHN0cnVjdCBhcm1fc21tdV9xdWV1ZSAqcSwgdTY0ICplbnQpCit7CisJ aWYgKHF1ZXVlX2Z1bGwocSkpCisJCXJldHVybiAtRU5PU1BDOworCisJcXVldWVfd3JpdGUoUV9F TlQocSwgcS0+cHJvZCksIGVudCwgcS0+ZW50X2R3b3Jkcyk7CisJcXVldWVfaW5jX3Byb2QocSk7 CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHF1ZXVlX3JlYWQoX19sZTY0ICpkc3QsIHU2 NCAqc3JjLCBzaXplX3Qgbl9kd29yZHMpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwg bl9kd29yZHM7ICsraSkKKwkJKmRzdCsrID0gbGU2NF90b19jcHUoKnNyYysrKTsKK30KKworc3Rh dGljIGludCBxdWV1ZV9yZW1vdmVfcmF3KHN0cnVjdCBhcm1fc21tdV9xdWV1ZSAqcSwgdTY0ICpl bnQpCit7CisJaWYgKHF1ZXVlX2VtcHR5KHEpKQorCQlyZXR1cm4gLUVBR0FJTjsKKworCXF1ZXVl X3JlYWQoZW50LCBRX0VOVChxLCBxLT5jb25zKSwgcS0+ZW50X2R3b3Jkcyk7CisJcXVldWVfaW5j X2NvbnMocSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIEhpZ2gtbGV2ZWwgcXVldWUgYWNjZXNzb3Jz ICovCitzdGF0aWMgaW50IGFybV9zbW11X2NtZHFfYnVpbGRfY21kKHU2NCAqY21kLCBzdHJ1Y3Qg YXJtX3NtbXVfY21kcV9lbnQgKmVudCkKK3sKKwltZW1zZXQoY21kLCAwLCBDTURRX0VOVF9EV09S RFMgPDwgMyk7CisJY21kWzBdIHw9IChlbnQtPm9wY29kZSAmIENNRFFfMF9PUF9NQVNLKSA8PCBD TURRXzBfT1BfU0hJRlQ7CisKKwlzd2l0Y2ggKGVudC0+b3Bjb2RlKSB7CisJY2FzZSBDTURRX09Q X1RMQklfRUwyX0FMTDoKKwljYXNlIENNRFFfT1BfVExCSV9OU05IX0FMTDoKKwkJYnJlYWs7CisJ Y2FzZSBDTURRX09QX1BSRUZFVENIX0NGRzoKKwkJY21kWzBdIHw9ICh1NjQpZW50LT5wcmVmZXRj aC5zaWQgPDwgQ01EUV9QUkVGRVRDSF8wX1NJRF9TSElGVDsKKwkJY21kWzFdIHw9IGVudC0+cHJl ZmV0Y2guc2l6ZSA8PCBDTURRX1BSRUZFVENIXzFfU0laRV9TSElGVDsKKwkJY21kWzFdIHw9IGVu dC0+cHJlZmV0Y2guYWRkciAmIENNRFFfUFJFRkVUQ0hfMV9BRERSX01BU0s7CisJCWJyZWFrOwor CWNhc2UgQ01EUV9PUF9DRkdJX1NURToKKwkJY21kWzBdIHw9ICh1NjQpZW50LT5jZmdpLnNpZCA8 PCBDTURRX0NGR0lfMF9TSURfU0hJRlQ7CisJCWNtZFsxXSB8PSBlbnQtPmNmZ2kubGVhZiA/IENN RFFfQ0ZHSV8xX0xFQUYgOiAwOworCQlicmVhazsKKwljYXNlIENNRFFfT1BfQ0ZHSV9BTEw6CisJ CS8qIENvdmVyIHRoZSBlbnRpcmUgU0lEIHJhbmdlICovCisJCWNtZFsxXSB8PSBDTURRX0NGR0lf MV9SQU5HRV9NQVNLIDw8IENNRFFfQ0ZHSV8xX1JBTkdFX1NISUZUOworCQlicmVhazsKKwljYXNl IENNRFFfT1BfVExCSV9OSF9WQToKKwkJY21kWzBdIHw9ICh1NjQpZW50LT50bGJpLmFzaWQgPDwg Q01EUV9UTEJJXzBfQVNJRF9TSElGVDsKKwkJY21kWzFdIHw9IGVudC0+dGxiaS5sZWFmID8gQ01E UV9UTEJJXzFfTEVBRiA6IDA7CisJCWNtZFsxXSB8PSBlbnQtPnRsYmkuYWRkciAmIENNRFFfVExC SV8xX1ZBX01BU0s7CisJCWJyZWFrOworCWNhc2UgQ01EUV9PUF9UTEJJX1MyX0lQQToKKwkJY21k WzBdIHw9ICh1NjQpZW50LT50bGJpLnZtaWQgPDwgQ01EUV9UTEJJXzBfVk1JRF9TSElGVDsKKwkJ Y21kWzFdIHw9IGVudC0+dGxiaS5sZWFmID8gQ01EUV9UTEJJXzFfTEVBRiA6IDA7CisJCWNtZFsx XSB8PSBlbnQtPnRsYmkuYWRkciAmIENNRFFfVExCSV8xX0lQQV9NQVNLOworCQlicmVhazsKKwlj YXNlIENNRFFfT1BfVExCSV9OSF9BU0lEOgorCQljbWRbMF0gfD0gKHU2NCllbnQtPnRsYmkuYXNp ZCA8PCBDTURRX1RMQklfMF9BU0lEX1NISUZUOworCQkvKiBGYWxsdGhyb3VnaCAqLworCWNhc2Ug Q01EUV9PUF9UTEJJX1MxMl9WTUFMTDoKKwkJY21kWzBdIHw9ICh1NjQpZW50LT50bGJpLnZtaWQg PDwgQ01EUV9UTEJJXzBfVk1JRF9TSElGVDsKKwkJYnJlYWs7CisJY2FzZSBDTURRX09QX1BSSV9S RVNQOgorCQljbWRbMF0gfD0gZW50LT5zdWJzdHJlYW1fdmFsaWQgPyBDTURRXzBfU1NWIDogMDsK KwkJY21kWzBdIHw9IGVudC0+cHJpLnNzaWQgPDwgQ01EUV9QUklfMF9TU0lEX1NISUZUOworCQlj bWRbMF0gfD0gKHU2NCllbnQtPnByaS5zaWQgPDwgQ01EUV9QUklfMF9TSURfU0hJRlQ7CisJCWNt ZFsxXSB8PSBlbnQtPnByaS5ncnBpZCA8PCBDTURRX1BSSV8xX0dSUElEX1NISUZUOworCQlzd2l0 Y2ggKGVudC0+cHJpLnJlc3ApIHsKKwkJY2FzZSBQUklfUkVTUF9ERU5ZOgorCQkJY21kWzFdIHw9 IENNRFFfUFJJXzFfUkVTUF9ERU5ZOworCQkJYnJlYWs7CisJCWNhc2UgUFJJX1JFU1BfRkFJTDoK KwkJCWNtZFsxXSB8PSBDTURRX1BSSV8xX1JFU1BfRkFJTDsKKwkJCWJyZWFrOworCQljYXNlIFBS SV9SRVNQX1NVQ0M6CisJCQljbWRbMV0gfD0gQ01EUV9QUklfMV9SRVNQX1NVQ0M7CisJCQlicmVh azsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWJyZWFrOworCWNhc2Ug Q01EUV9PUF9DTURfU1lOQzoKKwkJY21kWzBdIHw9IENNRFFfU1lOQ18wX0NTX1NFVjsKKwkJYnJl YWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisK K3N0YXRpYyB2b2lkIGFybV9zbW11X2NtZHFfc2tpcF9lcnIoc3RydWN0IGFybV9zbW11X2Rldmlj ZSAqc21tdSkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciAqY2Vycm9yX3N0cltdID0geworCQlbQ01E UV9FUlJfQ0VSUk9SX05PTkVfSURYXQk9ICJObyBlcnJvciIsCisJCVtDTURRX0VSUl9DRVJST1Jf SUxMX0lEWF0JPSAiSWxsZWdhbCBjb21tYW5kIiwKKwkJW0NNRFFfRVJSX0NFUlJPUl9BQlRfSURY XQk9ICJBYm9ydCBvbiBjb21tYW5kIGZldGNoIiwKKwl9OworCisJaW50IGk7CisJdTY0IGNtZFtD TURRX0VOVF9EV09SRFNdOworCXN0cnVjdCBhcm1fc21tdV9xdWV1ZSAqcSA9ICZzbW11LT5jbWRx LnE7CisJdTMyIGNvbnMgPSByZWFkbF9yZWxheGVkKHEtPmNvbnNfcmVnKTsKKwl1MzIgaWR4ID0g Y29ucyA+PiBDTURRX0VSUl9TSElGVCAmIENNRFFfRVJSX01BU0s7CisJc3RydWN0IGFybV9zbW11 X2NtZHFfZW50IGNtZF9zeW5jID0geworCQkub3Bjb2RlID0gQ01EUV9PUF9DTURfU1lOQywKKwl9 OworCisJZGV2X2VycihzbW11LT5kZXYsICJDTURRIGVycm9yIChjb25zIDB4JTA4eCk6ICVzXG4i LCBjb25zLAorCQlpZHggPCBBUlJBWV9TSVpFKGNlcnJvcl9zdHIpID8gIGNlcnJvcl9zdHJbaWR4 XSA6ICJVbmtub3duIik7CisKKwlzd2l0Y2ggKGlkeCkgeworCWNhc2UgQ01EUV9FUlJfQ0VSUk9S X0FCVF9JRFg6CisJCWRldl9lcnIoc21tdS0+ZGV2LCAicmV0cnlpbmcgY29tbWFuZCBmZXRjaFxu Iik7CisJY2FzZSBDTURRX0VSUl9DRVJST1JfTk9ORV9JRFg6CisJCXJldHVybjsKKwljYXNlIENN RFFfRVJSX0NFUlJPUl9JTExfSURYOgorCQkvKiBGYWxsdGhyb3VnaCAqLworCWRlZmF1bHQ6CisJ CWJyZWFrOworCX0KKworCS8qCisJICogV2UgbWF5IGhhdmUgY29uY3VycmVudCBwcm9kdWNlcnMs IHNvIHdlIG5lZWQgdG8gYmUgY2FyZWZ1bAorCSAqIG5vdCB0byB0b3VjaCBhbnkgb2YgdGhlIHNo YWRvdyBjbWRxIHN0YXRlLgorCSAqLworCXF1ZXVlX3JlYWQoY21kLCBRX0VOVChxLCBjb25zKSwg cS0+ZW50X2R3b3Jkcyk7CisJZGV2X2VycihzbW11LT5kZXYsICJza2lwcGluZyBjb21tYW5kIGlu IGVycm9yIHN0YXRlOlxuIik7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY21kKTsgKytp KQorCQlkZXZfZXJyKHNtbXUtPmRldiwgIlx0MHglMDE2bGx4XG4iLCAodW5zaWduZWQgbG9uZyBs b25nKWNtZFtpXSk7CisKKwkvKiBDb252ZXJ0IHRoZSBlcnJvbmVvdXMgY29tbWFuZCBpbnRvIGEg Q01EX1NZTkMgKi8KKwlpZiAoYXJtX3NtbXVfY21kcV9idWlsZF9jbWQoY21kLCAmY21kX3N5bmMp KSB7CisJCWRldl9lcnIoc21tdS0+ZGV2LCAiZmFpbGVkIHRvIGNvbnZlcnQgdG8gQ01EX1NZTkNc biIpOworCQlyZXR1cm47CisJfQorCisJcXVldWVfd3JpdGUoUV9FTlQocSwgY29ucyksIGNtZCwg cS0+ZW50X2R3b3Jkcyk7Cit9CisKK3N0YXRpYyB2b2lkIGFybV9zbW11X2NtZHFfaXNzdWVfY21k KHN0cnVjdCBhcm1fc21tdV9kZXZpY2UgKnNtbXUsCisJCQkJICAgIHN0cnVjdCBhcm1fc21tdV9j bWRxX2VudCAqZW50KQoreworCXU2NCBjbWRbQ01EUV9FTlRfRFdPUkRTXTsKKwl1bnNpZ25lZCBs b25nIGZsYWdzOworCWJvb2wgd2ZlID0gISEoc21tdS0+ZmVhdHVyZXMgJiBBUk1fU01NVV9GRUFU X1NFVik7CisJc3RydWN0IGFybV9zbW11X3F1ZXVlICpxID0gJnNtbXUtPmNtZHEucTsKKworCWlm IChhcm1fc21tdV9jbWRxX2J1aWxkX2NtZChjbWQsIGVudCkpIHsKKwkJZGV2X3dhcm4oc21tdS0+ ZGV2LCAiaWdub3JpbmcgdW5rbm93biBDTURRIG9wY29kZSAweCV4XG4iLAorCQkJIGVudC0+b3Bj b2RlKTsKKwkJcmV0dXJuOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZzbW11LT5jbWRxLmxv Y2ssIGZsYWdzKTsKKwl3aGlsZSAocXVldWVfaW5zZXJ0X3JhdyhxLCBjbWQpID09IC1FTk9TUEMp IHsKKwkJaWYgKHF1ZXVlX3BvbGxfY29ucyhxLCBmYWxzZSwgd2ZlKSkKKwkJCWRldl9lcnJfcmF0 ZWxpbWl0ZWQoc21tdS0+ZGV2LCAiQ01EUSB0aW1lb3V0XG4iKTsKKwl9CisKKwlpZiAoZW50LT5v cGNvZGUgPT0gQ01EUV9PUF9DTURfU1lOQyAmJiBxdWV1ZV9wb2xsX2NvbnMocSwgdHJ1ZSwgd2Zl KSkKKwkJZGV2X2Vycl9yYXRlbGltaXRlZChzbW11LT5kZXYsICJDTURfU1lOQyB0aW1lb3V0XG4i KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzbW11LT5jbWRxLmxvY2ssIGZsYWdzKTsKK30K KworLyogQ29udGV4dCBkZXNjcmlwdG9yIG1hbmlwdWxhdGlvbiBmdW5jdGlvbnMgKi8KK3N0YXRp YyB1NjQgYXJtX3NtbXVfY3B1X3Rjcl90b19jZCh1NjQgdGNyKQoreworCXU2NCB2YWwgPSAwOwor CisJLyogUmVwYWNrIHRoZSBUQ1IuIEp1c3QgY2FyZSBhYm91dCBUVEJSMCBmb3Igbm93ICovCisJ dmFsIHw9IEFSTV9TTU1VX1RDUjJDRCh0Y3IsIFQwU1opOworCXZhbCB8PSBBUk1fU01NVV9UQ1Iy Q0QodGNyLCBURzApOworCXZhbCB8PSBBUk1fU01NVV9UQ1IyQ0QodGNyLCBJUkdOMCk7CisJdmFs IHw9IEFSTV9TTU1VX1RDUjJDRCh0Y3IsIE9SR04wKTsKKwl2YWwgfD0gQVJNX1NNTVVfVENSMkNE KHRjciwgU0gwKTsKKwl2YWwgfD0gQVJNX1NNTVVfVENSMkNEKHRjciwgRVBEMCk7CisJdmFsIHw9 IEFSTV9TTU1VX1RDUjJDRCh0Y3IsIEVQRDEpOworCXZhbCB8PSBBUk1fU01NVV9UQ1IyQ0QodGNy LCBJUFMpOworCXZhbCB8PSBBUk1fU01NVV9UQ1IyQ0QodGNyLCBUQkkwKTsKKworCXJldHVybiB2 YWw7Cit9CisKK3N0YXRpYyB2b2lkIGFybV9zbW11X3dyaXRlX2N0eF9kZXNjKHN0cnVjdCBhcm1f c21tdV9kZXZpY2UgKnNtbXUsCisJCQkJICAgIHN0cnVjdCBhcm1fc21tdV9zMV9jZmcgKmNmZykK K3sKKwl1NjQgdmFsOworCisJLyoKKwkgKiBXZSBkb24ndCBuZWVkIHRvIGlzc3VlIGFueSBpbnZh bGlkYXRpb24gaGVyZSwgYXMgd2UnbGwgaW52YWxpZGF0ZQorCSAqIHRoZSBTVEUgd2hlbiBpbnN0 YWxsaW5nIHRoZSBuZXcgZW50cnkgYW55d2F5LgorCSAqLworCXZhbCA9IGFybV9zbW11X2NwdV90 Y3JfdG9fY2QoY2ZnLT5jZC50Y3IpIHwKKyNpZmRlZiBfX0JJR19FTkRJQU4KKwkgICAgICBDVFhE RVNDX0NEXzBfRU5ESSB8CisjZW5kaWYKKwkgICAgICBDVFhERVNDX0NEXzBfUiB8IENUWERFU0Nf Q0RfMF9BIHwgQ1RYREVTQ19DRF8wX0FTRVRfUFJJVkFURSB8CisJICAgICAgQ1RYREVTQ19DRF8w X0FBNjQgfCAodTY0KWNmZy0+Y2QuYXNpZCA8PCBDVFhERVNDX0NEXzBfQVNJRF9TSElGVCB8CisJ ICAgICAgQ1RYREVTQ19DRF8wX1Y7CisJY2ZnLT5jZHB0clswXSA9IGNwdV90b19sZTY0KHZhbCk7 CisKKwl2YWwgPSBjZmctPmNkLnR0YnIgJiBDVFhERVNDX0NEXzFfVFRCMF9NQVNLIDw8IENUWERF U0NfQ0RfMV9UVEIwX1NISUZUOworCWNmZy0+Y2RwdHJbMV0gPSBjcHVfdG9fbGU2NCh2YWwpOwor CisJY2ZnLT5jZHB0clszXSA9IGNwdV90b19sZTY0KGNmZy0+Y2QubWFpciA8PCBDVFhERVNDX0NE XzNfTUFJUl9TSElGVCk7Cit9CisKKy8qIFN0cmVhbSB0YWJsZSBtYW5pcHVsYXRpb24gZnVuY3Rp b25zICovCitzdGF0aWMgdm9pZAorYXJtX3NtbXVfd3JpdGVfc3RydGFiX2wxX2Rlc2MoX19sZTY0 ICpkc3QsIHN0cnVjdCBhcm1fc21tdV9zdHJ0YWJfbDFfZGVzYyAqZGVzYykKK3sKKwl1NjQgdmFs ID0gMDsKKworCXZhbCB8PSAoZGVzYy0+c3BhbiAmIFNUUlRBQl9MMV9ERVNDX1NQQU5fTUFTSykK KwkJPDwgU1RSVEFCX0wxX0RFU0NfU1BBTl9TSElGVDsKKwl2YWwgfD0gZGVzYy0+bDJwdHJfZG1h ICYKKwkgICAgICAgU1RSVEFCX0wxX0RFU0NfTDJQVFJfTUFTSyA8PCBTVFJUQUJfTDFfREVTQ19M MlBUUl9TSElGVDsKKworCSpkc3QgPSBjcHVfdG9fbGU2NCh2YWwpOworfQorCitzdGF0aWMgdm9p ZCBhcm1fc21tdV9zeW5jX3N0ZV9mb3Jfc2lkKHN0cnVjdCBhcm1fc21tdV9kZXZpY2UgKnNtbXUs IHUzMiBzaWQpCit7CisJc3RydWN0IGFybV9zbW11X2NtZHFfZW50IGNtZCA9IHsKKwkJLm9wY29k ZQk9IENNRFFfT1BfQ0ZHSV9TVEUsCisJCS5jZmdpCT0geworCQkJLnNpZAk9IHNpZCwKKwkJCS5s ZWFmCT0gdHJ1ZSwKKwkJfSwKKwl9OworCisJYXJtX3NtbXVfY21kcV9pc3N1ZV9jbWQoc21tdSwg JmNtZCk7CisJY21kLm9wY29kZSA9IENNRFFfT1BfQ01EX1NZTkM7CisJYXJtX3NtbXVfY21kcV9p c3N1ZV9jbWQoc21tdSwgJmNtZCk7Cit9CisKK3N0YXRpYyB2b2lkIGFybV9zbW11X3dyaXRlX3N0 cnRhYl9lbnQoc3RydWN0IGFybV9zbW11X2RldmljZSAqc21tdSwgdTMyIHNpZCwKKwkJCQkgICAg ICBfX2xlNjQgKmRzdCwgc3RydWN0IGFybV9zbW11X3N0cnRhYl9lbnQgKnN0ZSkKK3sKKwkvKgor CSAqIFRoaXMgaXMgaGlkZW91c2x5IGNvbXBsaWNhdGVkLCBidXQgd2Ugb25seSByZWFsbHkgY2Fy ZSBhYm91dAorCSAqIHRocmVlIGNhc2VzIGF0IHRoZSBtb21lbnQ6CisJICoKKwkgKiAxLiBJbnZh bGlkIChhbGwgemVybykgLT4gYnlwYXNzL2ZhdWx0IChpbml0KQorCSAqIDIuIEJ5cGFzcy9mYXVs dCAtPiB0cmFuc2xhdGlvbi9ieXBhc3MgKGF0dGFjaCkKKwkgKiAzLiBUcmFuc2xhdGlvbi9ieXBh c3MgLT4gYnlwYXNzL2ZhdWx0IChkZXRhY2gpCisJICoKKwkgKiBHaXZlbiB0aGF0IHdlIGNhbid0 IHVwZGF0ZSB0aGUgU1RFIGF0b21pY2FsbHkgYW5kIHRoZSBTTU1VCisJICogZG9lc24ndCByZWFk IHRoZSB0aGluZyBpbiBhIGRlZmluZWQgb3JkZXIsIHRoYXQgbGVhdmVzIHVzCisJICogd2l0aCB0 aGUgZm9sbG93aW5nIG1haW50ZW5hbmNlIHJlcXVpcmVtZW50czoKKwkgKgorCSAqIDEuIFVwZGF0 ZSBDb25maWcsIHJldHVybiAoaW5pdCB0aW1lIFNURXMgYXJlbid0IGxpdmUpCisJICogMi4gV3Jp dGUgZXZlcnl0aGluZyBhcGFydCBmcm9tIGR3b3JkIDAsIHN5bmMsIHdyaXRlIGR3b3JkIDAsIHN5 bmMKKwkgKiAzLiBVcGRhdGUgQ29uZmlnLCBzeW5jCisJICovCisJdTY0IHZhbCA9IGxlNjRfdG9f Y3B1KGRzdFswXSk7CisJYm9vbCBzdGVfbGl2ZSA9IGZhbHNlOworCXN0cnVjdCBhcm1fc21tdV9j bWRxX2VudCBwcmVmZXRjaF9jbWQgPSB7CisJCS5vcGNvZGUJCT0gQ01EUV9PUF9QUkVGRVRDSF9D RkcsCisJCS5wcmVmZXRjaAk9IHsKKwkJCS5zaWQJPSBzaWQsCisJCX0sCisJfTsKKworCWlmICh2 YWwgJiBTVFJUQUJfU1RFXzBfVikgeworCQl1NjQgY2ZnOworCisJCWNmZyA9IHZhbCAmIFNUUlRB Ql9TVEVfMF9DRkdfTUFTSyA8PCBTVFJUQUJfU1RFXzBfQ0ZHX1NISUZUOworCQlzd2l0Y2ggKGNm ZykgeworCQljYXNlIFNUUlRBQl9TVEVfMF9DRkdfQllQQVNTOgorCQkJYnJlYWs7CisJCWNhc2Ug U1RSVEFCX1NURV8wX0NGR19TMV9UUkFOUzoKKwkJY2FzZSBTVFJUQUJfU1RFXzBfQ0ZHX1MyX1RS QU5TOgorCQkJc3RlX2xpdmUgPSB0cnVlOworCQkJYnJlYWs7CisJCWNhc2UgU1RSVEFCX1NURV8w X0NGR19BQk9SVDoKKwkJCWlmIChkaXNhYmxlX2J5cGFzcykKKwkJCQlicmVhazsKKwkJZGVmYXVs dDoKKwkJCUJVRygpOyAvKiBTVEUgY29ycnVwdGlvbiAqLworCQl9CisJfQorCisJLyogTnVrZSB0 aGUgZXhpc3RpbmcgU1RFXzAgdmFsdWUsIGFzIHdlJ3JlIGdvaW5nIHRvIHJld3JpdGUgaXQgKi8K Kwl2YWwgPSBTVFJUQUJfU1RFXzBfVjsKKworCS8qIEJ5cGFzcy9mYXVsdCAqLworCWlmICghc3Rl LT5hc3NpZ25lZCB8fCAhKHN0ZS0+czFfY2ZnIHx8IHN0ZS0+czJfY2ZnKSkgeworCQlpZiAoIXN0 ZS0+YXNzaWduZWQgJiYgZGlzYWJsZV9ieXBhc3MpCisJCQl2YWwgfD0gU1RSVEFCX1NURV8wX0NG R19BQk9SVDsKKwkJZWxzZQorCQkJdmFsIHw9IFNUUlRBQl9TVEVfMF9DRkdfQllQQVNTOworCisJ CWRzdFswXSA9IGNwdV90b19sZTY0KHZhbCk7CisJCWRzdFsxXSA9IGNwdV90b19sZTY0KFNUUlRB Ql9TVEVfMV9TSENGR19JTkNPTUlORworCQkJIDw8IFNUUlRBQl9TVEVfMV9TSENGR19TSElGVCk7 CisJCWRzdFsyXSA9IDA7IC8qIE51a2UgdGhlIFZNSUQgKi8KKwkJaWYgKHN0ZV9saXZlKQorCQkJ YXJtX3NtbXVfc3luY19zdGVfZm9yX3NpZChzbW11LCBzaWQpOworCQlyZXR1cm47CisJfQorCisJ aWYgKHN0ZS0+czFfY2ZnKSB7CisJCUJVR19PTihzdGVfbGl2ZSk7CisJCWRzdFsxXSA9IGNwdV90 b19sZTY0KAorCQkJIFNUUlRBQl9TVEVfMV9TMUNfQ0FDSEVfV0JSQQorCQkJIDw8IFNUUlRBQl9T VEVfMV9TMUNJUl9TSElGVCB8CisJCQkgU1RSVEFCX1NURV8xX1MxQ19DQUNIRV9XQlJBCisJCQkg PDwgU1RSVEFCX1NURV8xX1MxQ09SX1NISUZUIHwKKwkJCSBTVFJUQUJfU1RFXzFfUzFDX1NIX0lT SCA8PCBTVFJUQUJfU1RFXzFfUzFDU0hfU0hJRlQgfAorI2lmZGVmIENPTkZJR19QQ0lfQVRTCisJ CQkgU1RSVEFCX1NURV8xX0VBVFNfVFJBTlMgPDwgU1RSVEFCX1NURV8xX0VBVFNfU0hJRlQgfAor I2VuZGlmCisJCQkgU1RSVEFCX1NURV8xX1NUUldfTlNFTDEgPDwgU1RSVEFCX1NURV8xX1NUUldf U0hJRlQpOworCisJCWlmIChzbW11LT5mZWF0dXJlcyAmIEFSTV9TTU1VX0ZFQVRfU1RBTExTKQor CQkJZHN0WzFdIHw9IGNwdV90b19sZTY0KFNUUlRBQl9TVEVfMV9TMVNUQUxMRCk7CisKKwkJdmFs IHw9IChzdGUtPnMxX2NmZy0+Y2RwdHJfZG1hICYgU1RSVEFCX1NURV8wX1MxQ1RYUFRSX01BU0sK KwkJICAgICAgICA8PCBTVFJUQUJfU1RFXzBfUzFDVFhQVFJfU0hJRlQpIHwKKwkJCVNUUlRBQl9T VEVfMF9DRkdfUzFfVFJBTlM7CisJfQorCisJaWYgKHN0ZS0+czJfY2ZnKSB7CisJCUJVR19PTihz dGVfbGl2ZSk7CisJCWRzdFsyXSA9IGNwdV90b19sZTY0KAorCQkJIHN0ZS0+czJfY2ZnLT52bWlk IDw8IFNUUlRBQl9TVEVfMl9TMlZNSURfU0hJRlQgfAorCQkJIChzdGUtPnMyX2NmZy0+dnRjciAm IFNUUlRBQl9TVEVfMl9WVENSX01BU0spCisJCQkgIDw8IFNUUlRBQl9TVEVfMl9WVENSX1NISUZU IHwKKyNpZmRlZiBfX0JJR19FTkRJQU4KKwkJCSBTVFJUQUJfU1RFXzJfUzJFTkRJIHwKKyNlbmRp ZgorCQkJIFNUUlRBQl9TVEVfMl9TMlBUVyB8IFNUUlRBQl9TVEVfMl9TMkFBNjQgfAorCQkJIFNU UlRBQl9TVEVfMl9TMlIpOworCisJCWRzdFszXSA9IGNwdV90b19sZTY0KHN0ZS0+czJfY2ZnLT52 dHRiciAmCisJCQkgU1RSVEFCX1NURV8zX1MyVFRCX01BU0sgPDwgU1RSVEFCX1NURV8zX1MyVFRC X1NISUZUKTsKKworCQl2YWwgfD0gU1RSVEFCX1NURV8wX0NGR19TMl9UUkFOUzsKKwl9CisKKwlh cm1fc21tdV9zeW5jX3N0ZV9mb3Jfc2lkKHNtbXUsIHNpZCk7CisJZHN0WzBdID0gY3B1X3RvX2xl NjQodmFsKTsKKwlhcm1fc21tdV9zeW5jX3N0ZV9mb3Jfc2lkKHNtbXUsIHNpZCk7CisKKwkvKiBJ dCdzIGxpa2VseSB0aGF0IHdlJ2xsIHdhbnQgdG8gdXNlIHRoZSBuZXcgU1RFIHNvb24gKi8KKwlp ZiAoIShzbW11LT5vcHRpb25zICYgQVJNX1NNTVVfT1BUX1NLSVBfUFJFRkVUQ0gpKQorCQlhcm1f c21tdV9jbWRxX2lzc3VlX2NtZChzbW11LCAmcHJlZmV0Y2hfY21kKTsKK30KKworc3RhdGljIHZv aWQgYXJtX3NtbXVfaW5pdF9ieXBhc3Nfc3Rlcyh1NjQgKnN0cnRhYiwgdW5zaWduZWQgaW50IG5l bnQpCit7CisJdW5zaWduZWQgaW50IGk7CisJc3RydWN0IGFybV9zbW11X3N0cnRhYl9lbnQgc3Rl ID0geyAuYXNzaWduZWQgPSBmYWxzZSB9OworCisJZm9yIChpID0gMDsgaSA8IG5lbnQ7ICsraSkg eworCQlhcm1fc21tdV93cml0ZV9zdHJ0YWJfZW50KE5VTEwsIC0xLCBzdHJ0YWIsICZzdGUpOwor CQlzdHJ0YWIgKz0gU1RSVEFCX1NURV9EV09SRFM7CisJfQorfQorCitzdGF0aWMgaW50IGFybV9z bW11X2luaXRfbDJfc3RydGFiKHN0cnVjdCBhcm1fc21tdV9kZXZpY2UgKnNtbXUsIHUzMiBzaWQp Cit7CisJc2l6ZV90IHNpemU7CisJdm9pZCAqc3RydGFiOworCXN0cnVjdCBhcm1fc21tdV9zdHJ0 YWJfY2ZnICpjZmcgPSAmc21tdS0+c3RydGFiX2NmZzsKKwlzdHJ1Y3QgYXJtX3NtbXVfc3RydGFi X2wxX2Rlc2MgKmRlc2MgPSAmY2ZnLT5sMV9kZXNjW3NpZCA+PiBTVFJUQUJfU1BMSVRdOworCisJ aWYgKGRlc2MtPmwycHRyKQorCQlyZXR1cm4gMDsKKworCXNpemUgPSAxIDw8IChTVFJUQUJfU1BM SVQgKyBpbG9nMihTVFJUQUJfU1RFX0RXT1JEUykgKyAzKTsKKwlzdHJ0YWIgPSAmY2ZnLT5zdHJ0 YWJbKHNpZCA+PiBTVFJUQUJfU1BMSVQpICogU1RSVEFCX0wxX0RFU0NfRFdPUkRTXTsKKworCWRl c2MtPnNwYW4gPSBTVFJUQUJfU1BMSVQgKyAxOworCWRlc2MtPmwycHRyID0gZG1hbV9hbGxvY19j b2hlcmVudChzbW11LT5kZXYsIHNpemUsICZkZXNjLT5sMnB0cl9kbWEsCisJCQkJCSAgR0ZQX0tF Uk5FTCB8IF9fR0ZQX1pFUk8pOworCWlmICghZGVzYy0+bDJwdHIpIHsKKwkJZGV2X2VycihzbW11 LT5kZXYsCisJCQkiZmFpbGVkIHRvIGFsbG9jYXRlIGwyIHN0cmVhbSB0YWJsZSBmb3IgU0lEICV1 XG4iLAorCQkJc2lkKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJYXJtX3NtbXVfaW5pdF9i eXBhc3Nfc3RlcyhkZXNjLT5sMnB0ciwgMSA8PCBTVFJUQUJfU1BMSVQpOworCWFybV9zbW11X3dy aXRlX3N0cnRhYl9sMV9kZXNjKHN0cnRhYiwgZGVzYyk7CisJcmV0dXJuIDA7Cit9CisKKy8qIElS USBhbmQgZXZlbnQgaGFuZGxlcnMgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBhcm1fc21tdV9ldnRx X3RocmVhZChpbnQgaXJxLCB2b2lkICpkZXYpCit7CisJaW50IGk7CisJc3RydWN0IGFybV9zbW11 X2RldmljZSAqc21tdSA9IGRldjsKKwlzdHJ1Y3QgYXJtX3NtbXVfcXVldWUgKnEgPSAmc21tdS0+ ZXZ0cS5xOworCXU2NCBldnRbRVZUUV9FTlRfRFdPUkRTXTsKKworCWRvIHsKKwkJd2hpbGUgKCFx dWV1ZV9yZW1vdmVfcmF3KHEsIGV2dCkpIHsKKwkJCXU4IGlkID0gZXZ0WzBdID4+IEVWVFFfMF9J RF9TSElGVCAmIEVWVFFfMF9JRF9NQVNLOworCisJCQlkZXZfaW5mbyhzbW11LT5kZXYsICJldmVu dCAweCUwMnggcmVjZWl2ZWQ6XG4iLCBpZCk7CisJCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0la RShldnQpOyArK2kpCisJCQkJZGV2X2luZm8oc21tdS0+ZGV2LCAiXHQweCUwMTZsbHhcbiIsCisJ CQkJCSAodW5zaWduZWQgbG9uZyBsb25nKWV2dFtpXSk7CisKKwkJfQorCisJCS8qCisJCSAqIE5v dCBtdWNoIHdlIGNhbiBkbyBvbiBvdmVyZmxvdywgc28gc2NyZWFtIGFuZCBwcmV0ZW5kIHdlJ3Jl CisJCSAqIHRyeWluZyBoYXJkZXIuCisJCSAqLworCQlpZiAocXVldWVfc3luY19wcm9kKHEpID09 IC1FT1ZFUkZMT1cpCisJCQlkZXZfZXJyKHNtbXUtPmRldiwgIkVWVFEgb3ZlcmZsb3cgZGV0ZWN0 ZWQgLS0gZXZlbnRzIGxvc3RcbiIpOworCX0gd2hpbGUgKCFxdWV1ZV9lbXB0eShxKSk7CisKKwkv KiBTeW5jIG91ciBvdmVyZmxvdyBmbGFnLCBhcyB3ZSBiZWxpZXZlIHdlJ3JlIHVwIHRvIHNwZWVk ICovCisJcS0+Y29ucyA9IFFfT1ZGKHEsIHEtPnByb2QpIHwgUV9XUlAocSwgcS0+Y29ucykgfCBR X0lEWChxLCBxLT5jb25zKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyB2b2lk IGFybV9zbW11X2hhbmRsZV9wcHIoc3RydWN0IGFybV9zbW11X2RldmljZSAqc21tdSwgdTY0ICpl dnQpCit7CisJdTMyIHNpZCwgc3NpZDsKKwl1MTYgZ3JwaWQ7CisJYm9vbCBzc3YsIGxhc3Q7CisK KwlzaWQgPSBldnRbMF0gPj4gUFJJUV8wX1NJRF9TSElGVCAmIFBSSVFfMF9TSURfTUFTSzsKKwlz c3YgPSBldnRbMF0gJiBQUklRXzBfU1NJRF9WOworCXNzaWQgPSBzc3YgPyBldnRbMF0gPj4gUFJJ UV8wX1NTSURfU0hJRlQgJiBQUklRXzBfU1NJRF9NQVNLIDogMDsKKwlsYXN0ID0gZXZ0WzBdICYg UFJJUV8wX1BSR19MQVNUOworCWdycGlkID0gZXZ0WzFdID4+IFBSSVFfMV9QUkdfSURYX1NISUZU ICYgUFJJUV8xX1BSR19JRFhfTUFTSzsKKworCWRldl9pbmZvKHNtbXUtPmRldiwgInVuZXhwZWN0 ZWQgUFJJIHJlcXVlc3QgcmVjZWl2ZWQ6XG4iKTsKKwlkZXZfaW5mbyhzbW11LT5kZXYsCisJCSAi XHRzaWQgMHglMDh4LjB4JTA1eDogWyV1JXNdICVzcHJpdmlsZWdlZCAlcyVzJXMgYWNjZXNzIGF0 IGlvdmEgMHglMDE2bGx4XG4iLAorCQkgc2lkLCBzc2lkLCBncnBpZCwgbGFzdCA/ICJMIiA6ICIi LAorCQkgZXZ0WzBdICYgUFJJUV8wX1BFUk1fUFJJViA/ICIiIDogInVuIiwKKwkJIGV2dFswXSAm IFBSSVFfMF9QRVJNX1JFQUQgPyAiUiIgOiAiIiwKKwkJIGV2dFswXSAmIFBSSVFfMF9QRVJNX1dS SVRFID8gIlciIDogIiIsCisJCSBldnRbMF0gJiBQUklRXzBfUEVSTV9FWEVDID8gIlgiIDogIiIs CisJCSBldnRbMV0gJiBQUklRXzFfQUREUl9NQVNLIDw8IFBSSVFfMV9BRERSX1NISUZUKTsKKwor CWlmIChsYXN0KSB7CisJCXN0cnVjdCBhcm1fc21tdV9jbWRxX2VudCBjbWQgPSB7CisJCQkub3Bj b2RlCQkJPSBDTURRX09QX1BSSV9SRVNQLAorCQkJLnN1YnN0cmVhbV92YWxpZAk9IHNzdiwKKwkJ CS5wcmkJCQk9IHsKKwkJCQkuc2lkCT0gc2lkLAorCQkJCS5zc2lkCT0gc3NpZCwKKwkJCQkuZ3Jw aWQJPSBncnBpZCwKKwkJCQkucmVzcAk9IFBSSV9SRVNQX0RFTlksCisJCQl9LAorCQl9OworCisJ CWFybV9zbW11X2NtZHFfaXNzdWVfY21kKHNtbXUsICZjbWQpOworCX0KK30KKworc3RhdGljIGly cXJldHVybl90IGFybV9zbW11X3ByaXFfdGhyZWFkKGludCBpcnEsIHZvaWQgKmRldikKK3sKKwlz dHJ1Y3QgYXJtX3NtbXVfZGV2aWNlICpzbW11ID0gZGV2OworCXN0cnVjdCBhcm1fc21tdV9xdWV1 ZSAqcSA9ICZzbW11LT5wcmlxLnE7CisJdTY0IGV2dFtQUklRX0VOVF9EV09SRFNdOworCisJZG8g eworCQl3aGlsZSAoIXF1ZXVlX3JlbW92ZV9yYXcocSwgZXZ0KSkKKwkJCWFybV9zbW11X2hhbmRs ZV9wcHIoc21tdSwgZXZ0KTsKKworCQlpZiAocXVldWVfc3luY19wcm9kKHEpID09IC1FT1ZFUkZM T1cpCisJCQlkZXZfZXJyKHNtbXUtPmRldiwgIlBSSVEgb3ZlcmZsb3cgZGV0ZWN0ZWQgLS0gcmVx dWVzdHMgbG9zdFxuIik7CisJfSB3aGlsZSAoIXF1ZXVlX2VtcHR5KHEpKTsKKworCS8qIFN5bmMg b3VyIG92ZXJmbG93IGZsYWcsIGFzIHdlIGJlbGlldmUgd2UncmUgdXAgdG8gc3BlZWQgKi8KKwlx LT5jb25zID0gUV9PVkYocSwgcS0+cHJvZCkgfCBRX1dSUChxLCBxLT5jb25zKSB8IFFfSURYKHEs IHEtPmNvbnMpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGlycXJldHVybl90 IGFybV9zbW11X2NtZHFfc3luY19oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldikKK3sKKwkvKiBX ZSBkb24ndCBhY3R1YWxseSB1c2UgQ01EX1NZTkMgaW50ZXJydXB0cyBmb3IgYW55dGhpbmcgKi8K KwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgYXJtX3NtbXVfZGV2aWNlX2Rp c2FibGUoc3RydWN0IGFybV9zbW11X2RldmljZSAqc21tdSk7CisKK3N0YXRpYyBpcnFyZXR1cm5f dCBhcm1fc21tdV9nZXJyb3JfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXYpCit7CisJdTMyIGdl cnJvciwgZ2Vycm9ybiwgYWN0aXZlOworCXN0cnVjdCBhcm1fc21tdV9kZXZpY2UgKnNtbXUgPSBk ZXY7CisKKwlnZXJyb3IgPSByZWFkbF9yZWxheGVkKHNtbXUtPmJhc2UgKyBBUk1fU01NVV9HRVJS T1IpOworCWdlcnJvcm4gPSByZWFkbF9yZWxheGVkKHNtbXUtPmJhc2UgKyBBUk1fU01NVV9HRVJS T1JOKTsKKworCWFjdGl2ZSA9IGdlcnJvciBeIGdlcnJvcm47CisJaWYgKCEoYWN0aXZlICYgR0VS Uk9SX0VSUl9NQVNLKSkKKwkJcmV0dXJuIElSUV9OT05FOyAvKiBObyBlcnJvcnMgcGVuZGluZyAq LworCisJZGV2X3dhcm4oc21tdS0+ZGV2LAorCQkgInVuZXhwZWN0ZWQgZ2xvYmFsIGVycm9yIHJl cG9ydGVkICgweCUwOHgpLCB0aGlzIGNvdWxkIGJlIHNlcmlvdXNcbiIsCisJCSBhY3RpdmUpOwor CisJaWYgKGFjdGl2ZSAmIEdFUlJPUl9TRk1fRVJSKSB7CisJCWRldl9lcnIoc21tdS0+ZGV2LCAi ZGV2aWNlIGhhcyBlbnRlcmVkIFNlcnZpY2UgRmFpbHVyZSBNb2RlIVxuIik7CisJCWFybV9zbW11 X2RldmljZV9kaXNhYmxlKHNtbXUpOworCX0KKworCWlmIChhY3RpdmUgJiBHRVJST1JfTVNJX0dF UlJPUl9BQlRfRVJSKQorCQlkZXZfd2FybihzbW11LT5kZXYsICJHRVJST1IgTVNJIHdyaXRlIGFi b3J0ZWRcbiIpOworCisJaWYgKGFjdGl2ZSAmIEdFUlJPUl9NU0lfUFJJUV9BQlRfRVJSKQorCQlk ZXZfd2FybihzbW11LT5kZXYsICJQUklRIE1TSSB3cml0ZSBhYm9ydGVkXG4iKTsKKworCWlmIChh Y3RpdmUgJiBHRVJST1JfTVNJX0VWVFFfQUJUX0VSUikKKwkJZGV2X3dhcm4oc21tdS0+ZGV2LCAi RVZUUSBNU0kgd3JpdGUgYWJvcnRlZFxuIik7CisKKwlpZiAoYWN0aXZlICYgR0VSUk9SX01TSV9D TURRX0FCVF9FUlIpIHsKKwkJZGV2X3dhcm4oc21tdS0+ZGV2LCAiQ01EUSBNU0kgd3JpdGUgYWJv cnRlZFxuIik7CisJCWFybV9zbW11X2NtZHFfc3luY19oYW5kbGVyKGlycSwgc21tdS0+ZGV2KTsK Kwl9CisKKwlpZiAoYWN0aXZlICYgR0VSUk9SX1BSSVFfQUJUX0VSUikKKwkJZGV2X2VycihzbW11 LT5kZXYsICJQUklRIHdyaXRlIGFib3J0ZWQgLS0gZXZlbnRzIG1heSBoYXZlIGJlZW4gbG9zdFxu Iik7CisKKwlpZiAoYWN0aXZlICYgR0VSUk9SX0VWVFFfQUJUX0VSUikKKwkJZGV2X2VycihzbW11 LT5kZXYsICJFVlRRIHdyaXRlIGFib3J0ZWQgLS0gZXZlbnRzIG1heSBoYXZlIGJlZW4gbG9zdFxu Iik7CisKKwlpZiAoYWN0aXZlICYgR0VSUk9SX0NNRFFfRVJSKQorCQlhcm1fc21tdV9jbWRxX3Nr aXBfZXJyKHNtbXUpOworCisJd3JpdGVsKGdlcnJvciwgc21tdS0+YmFzZSArIEFSTV9TTU1VX0dF UlJPUk4pOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGlycXJldHVybl90IGFy bV9zbW11X2NvbWJpbmVkX2lycV90aHJlYWQoaW50IGlycSwgdm9pZCAqZGV2KQoreworCXN0cnVj dCBhcm1fc21tdV9kZXZpY2UgKnNtbXUgPSBkZXY7CisKKwlhcm1fc21tdV9ldnRxX3RocmVhZChp cnEsIGRldik7CisJaWYgKHNtbXUtPmZlYXR1cmVzICYgQVJNX1NNTVVfRkVBVF9QUkkpCisJCWFy bV9zbW11X3ByaXFfdGhyZWFkKGlycSwgZGV2KTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30K Kworc3RhdGljIGlycXJldHVybl90IGFybV9zbW11X2NvbWJpbmVkX2lycV9oYW5kbGVyKGludCBp cnEsIHZvaWQgKmRldikKK3sKKwlhcm1fc21tdV9nZXJyb3JfaGFuZGxlcihpcnEsIGRldik7CisJ YXJtX3NtbXVfY21kcV9zeW5jX2hhbmRsZXIoaXJxLCBkZXYpOworCXJldHVybiBJUlFfV0FLRV9U SFJFQUQ7Cit9CisKKy8qIElPX1BHVEFCTEUgQVBJICovCitzdGF0aWMgdm9pZCBfX2FybV9zbW11 X3RsYl9zeW5jKHN0cnVjdCBhcm1fc21tdV9kZXZpY2UgKnNtbXUpCit7CisJc3RydWN0IGFybV9z bW11X2NtZHFfZW50IGNtZDsKKworCWNtZC5vcGNvZGUgPSBDTURRX09QX0NNRF9TWU5DOworCWFy bV9zbW11X2NtZHFfaXNzdWVfY21kKHNtbXUsICZjbWQpOworfQorCitzdGF0aWMgdm9pZCBhcm1f c21tdV90bGJfc3luYyh2b2lkICpjb29raWUpCit7CisJc3RydWN0IGFybV9zbW11X2RvbWFpbiAq c21tdV9kb21haW4gPSBjb29raWU7CisJX19hcm1fc21tdV90bGJfc3luYyhzbW11X2RvbWFpbi0+ c21tdSk7Cit9CisKK3N0YXRpYyB2b2lkIGFybV9zbW11X3RsYl9pbnZfY29udGV4dCh2b2lkICpj b29raWUpCit7CisJc3RydWN0IGFybV9zbW11X2RvbWFpbiAqc21tdV9kb21haW4gPSBjb29raWU7 CisJc3RydWN0IGFybV9zbW11X2RldmljZSAqc21tdSA9IHNtbXVfZG9tYWluLT5zbW11OworCXN0 cnVjdCBhcm1fc21tdV9jbWRxX2VudCBjbWQ7CisKKwlpZiAoc21tdV9kb21haW4tPnN0YWdlID09 IEFSTV9TTU1VX0RPTUFJTl9TMSkgeworCQljbWQub3Bjb2RlCT0gQ01EUV9PUF9UTEJJX05IX0FT SUQ7CisJCWNtZC50bGJpLmFzaWQJPSBzbW11X2RvbWFpbi0+czFfY2ZnLmNkLmFzaWQ7CisJCWNt ZC50bGJpLnZtaWQJPSAwOworCX0gZWxzZSB7CisJCWNtZC5vcGNvZGUJPSBDTURRX09QX1RMQklf UzEyX1ZNQUxMOworCQljbWQudGxiaS52bWlkCT0gc21tdV9kb21haW4tPnMyX2NmZy52bWlkOwor CX0KKworCWFybV9zbW11X2NtZHFfaXNzdWVfY21kKHNtbXUsICZjbWQpOworCV9fYXJtX3NtbXVf dGxiX3N5bmMoc21tdSk7Cit9CisKK3N0YXRpYyB2b2lkIGFybV9zbW11X3RsYl9pbnZfcmFuZ2Vf bm9zeW5jKHVuc2lnbmVkIGxvbmcgaW92YSwgc2l6ZV90IHNpemUsCisJCQkJCSAgc2l6ZV90IGdy YW51bGUsIGJvb2wgbGVhZiwgdm9pZCAqY29va2llKQoreworCXN0cnVjdCBhcm1fc21tdV9kb21h aW4gKnNtbXVfZG9tYWluID0gY29va2llOworCXN0cnVjdCBhcm1fc21tdV9kZXZpY2UgKnNtbXUg PSBzbW11X2RvbWFpbi0+c21tdTsKKwlzdHJ1Y3QgYXJtX3NtbXVfY21kcV9lbnQgY21kID0gewor CQkudGxiaSA9IHsKKwkJCS5sZWFmCT0gbGVhZiwKKwkJCS5hZGRyCT0gaW92YSwKKwkJfSwKKwl9 OworCisJaWYgKHNtbXVfZG9tYWluLT5zdGFnZSA9PSBBUk1fU01NVV9ET01BSU5fUzEpIHsKKwkJ Y21kLm9wY29kZQk9IENNRFFfT1BfVExCSV9OSF9WQTsKKwkJY21kLnRsYmkuYXNpZAk9IHNtbXVf ZG9tYWluLT5zMV9jZmcuY2QuYXNpZDsKKwl9IGVsc2UgeworCQljbWQub3Bjb2RlCT0gQ01EUV9P UF9UTEJJX1MyX0lQQTsKKwkJY21kLnRsYmkudm1pZAk9IHNtbXVfZG9tYWluLT5zMl9jZmcudm1p ZDsKKwl9CisKKwlkbyB7CisJCWFybV9zbW11X2NtZHFfaXNzdWVfY21kKHNtbXUsICZjbWQpOwor CQljbWQudGxiaS5hZGRyICs9IGdyYW51bGU7CisJfSB3aGlsZSAoc2l6ZSAtPSBncmFudWxlKTsK K30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpb21tdV9nYXRoZXJfb3BzIGFybV9zbW11X2dhdGhl cl9vcHMgPSB7CisJLnRsYl9mbHVzaF9hbGwJPSBhcm1fc21tdV90bGJfaW52X2NvbnRleHQsCisJ LnRsYl9hZGRfZmx1c2gJPSBhcm1fc21tdV90bGJfaW52X3JhbmdlX25vc3luYywKKwkudGxiX3N5 bmMJPSBhcm1fc21tdV90bGJfc3luYywKK307CisKKy8qIElPTU1VIEFQSSAqLworc3RhdGljIGJv b2wgYXJtX3NtbXVfY2FwYWJsZShlbnVtIGlvbW11X2NhcCBjYXApCit7CisJc3dpdGNoIChjYXAp IHsKKwljYXNlIElPTU1VX0NBUF9DQUNIRV9DT0hFUkVOQ1k6CisJCXJldHVybiB0cnVlOworCWNh c2UgSU9NTVVfQ0FQX05PRVhFQzoKKwkJcmV0dXJuIHRydWU7CisJZGVmYXVsdDoKKwkJcmV0dXJu IGZhbHNlOworCX0KK30KKworc3RhdGljIHN0cnVjdCBpb21tdV9kb21haW4gKmFybV9zbW11X2Rv bWFpbl9hbGxvYyh1bnNpZ25lZCB0eXBlKQoreworCXN0cnVjdCBhcm1fc21tdV9kb21haW4gKnNt bXVfZG9tYWluOworCisJaWYgKHR5cGUgIT0gSU9NTVVfRE9NQUlOX1VOTUFOQUdFRCAmJgorCSAg ICB0eXBlICE9IElPTU1VX0RPTUFJTl9ETUEgJiYKKwkgICAgdHlwZSAhPSBJT01NVV9ET01BSU5f SURFTlRJVFkpCisJCXJldHVybiBOVUxMOworCisJLyoKKwkgKiBBbGxvY2F0ZSB0aGUgZG9tYWlu IGFuZCBpbml0aWFsaXNlIHNvbWUgb2YgaXRzIGRhdGEgc3RydWN0dXJlcy4KKwkgKiBXZSBjYW4n dCByZWFsbHkgZG8gYW55dGhpbmcgbWVhbmluZ2Z1bCB1bnRpbCB3ZSd2ZSBhZGRlZCBhCisJICog bWFzdGVyLgorCSAqLworCXNtbXVfZG9tYWluID0ga3phbGxvYyhzaXplb2YoKnNtbXVfZG9tYWlu KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzbW11X2RvbWFpbikKKwkJcmV0dXJuIE5VTEw7CisKKwlp ZiAodHlwZSA9PSBJT01NVV9ET01BSU5fRE1BICYmCisJICAgIGlvbW11X2dldF9kbWFfY29va2ll KCZzbW11X2RvbWFpbi0+ZG9tYWluKSkgeworCQlrZnJlZShzbW11X2RvbWFpbik7CisJCXJldHVy biBOVUxMOworCX0KKworCW11dGV4X2luaXQoJnNtbXVfZG9tYWluLT5pbml0X211dGV4KTsKKwly ZXR1cm4gJnNtbXVfZG9tYWluLT5kb21haW47Cit9CisKK3N0YXRpYyBpbnQgYXJtX3NtbXVfYml0 bWFwX2FsbG9jKHVuc2lnbmVkIGxvbmcgKm1hcCwgaW50IHNwYW4pCit7CisJaW50IGlkeCwgc2l6 ZSA9IDEgPDwgc3BhbjsKKworCWRvIHsKKwkJaWR4ID0gZmluZF9maXJzdF96ZXJvX2JpdChtYXAs IHNpemUpOworCQlpZiAoaWR4ID09IHNpemUpCisJCQlyZXR1cm4gLUVOT1NQQzsKKwl9IHdoaWxl ICh0ZXN0X2FuZF9zZXRfYml0KGlkeCwgbWFwKSk7CisKKwlyZXR1cm4gaWR4OworfQorCitzdGF0 aWMgdm9pZCBhcm1fc21tdV9iaXRtYXBfZnJlZSh1bnNpZ25lZCBsb25nICptYXAsIGludCBpZHgp Cit7CisJY2xlYXJfYml0KGlkeCwgbWFwKTsKK30KKworc3RhdGljIHZvaWQgYXJtX3NtbXVfZG9t YWluX2ZyZWUoc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tYWluKQoreworCXN0cnVjdCBhcm1fc21t dV9kb21haW4gKnNtbXVfZG9tYWluID0gdG9fc21tdV9kb21haW4oZG9tYWluKTsKKwlzdHJ1Y3Qg YXJtX3NtbXVfZGV2aWNlICpzbW11ID0gc21tdV9kb21haW4tPnNtbXU7CisKKwlpb21tdV9wdXRf ZG1hX2Nvb2tpZShkb21haW4pOworCWZyZWVfaW9fcGd0YWJsZV9vcHMoc21tdV9kb21haW4tPnBn dGJsX29wcyk7CisKKwkvKiBGcmVlIHRoZSBDRCBhbmQgQVNJRCwgaWYgd2UgYWxsb2NhdGVkIHRo ZW0gKi8KKwlpZiAoc21tdV9kb21haW4tPnN0YWdlID09IEFSTV9TTU1VX0RPTUFJTl9TMSkgewor CQlzdHJ1Y3QgYXJtX3NtbXVfczFfY2ZnICpjZmcgPSAmc21tdV9kb21haW4tPnMxX2NmZzsKKwor CQlpZiAoY2ZnLT5jZHB0cikgeworCQkJZG1hbV9mcmVlX2NvaGVyZW50KHNtbXVfZG9tYWluLT5z bW11LT5kZXYsCisJCQkJCSAgIENUWERFU0NfQ0RfRFdPUkRTIDw8IDMsCisJCQkJCSAgIGNmZy0+ Y2RwdHIsCisJCQkJCSAgIGNmZy0+Y2RwdHJfZG1hKTsKKworCQkJYXJtX3NtbXVfYml0bWFwX2Zy ZWUoc21tdS0+YXNpZF9tYXAsIGNmZy0+Y2QuYXNpZCk7CisJCX0KKwl9IGVsc2UgeworCQlzdHJ1 Y3QgYXJtX3NtbXVfczJfY2ZnICpjZmcgPSAmc21tdV9kb21haW4tPnMyX2NmZzsKKwkJaWYgKGNm Zy0+dm1pZCkKKwkJCWFybV9zbW11X2JpdG1hcF9mcmVlKHNtbXUtPnZtaWRfbWFwLCBjZmctPnZt aWQpOworCX0KKworCWtmcmVlKHNtbXVfZG9tYWluKTsKK30KKworc3RhdGljIGludCBhcm1fc21t dV9kb21haW5fZmluYWxpc2VfczEoc3RydWN0IGFybV9zbW11X2RvbWFpbiAqc21tdV9kb21haW4s CisJCQkJICAgICAgIHN0cnVjdCBpb19wZ3RhYmxlX2NmZyAqcGd0YmxfY2ZnKQoreworCWludCBy ZXQ7CisJaW50IGFzaWQ7CisJc3RydWN0IGFybV9zbW11X2RldmljZSAqc21tdSA9IHNtbXVfZG9t YWluLT5zbW11OworCXN0cnVjdCBhcm1fc21tdV9zMV9jZmcgKmNmZyA9ICZzbW11X2RvbWFpbi0+ czFfY2ZnOworCisJYXNpZCA9IGFybV9zbW11X2JpdG1hcF9hbGxvYyhzbW11LT5hc2lkX21hcCwg c21tdS0+YXNpZF9iaXRzKTsKKwlpZiAoYXNpZCA8IDApCisJCXJldHVybiBhc2lkOworCisJY2Zn LT5jZHB0ciA9IGRtYW1fYWxsb2NfY29oZXJlbnQoc21tdS0+ZGV2LCBDVFhERVNDX0NEX0RXT1JE UyA8PCAzLAorCQkJCQkgJmNmZy0+Y2RwdHJfZG1hLAorCQkJCQkgR0ZQX0tFUk5FTCB8IF9fR0ZQ X1pFUk8pOworCWlmICghY2ZnLT5jZHB0cikgeworCQlkZXZfd2FybihzbW11LT5kZXYsICJmYWls ZWQgdG8gYWxsb2NhdGUgY29udGV4dCBkZXNjcmlwdG9yXG4iKTsKKwkJcmV0ID0gLUVOT01FTTsK KwkJZ290byBvdXRfZnJlZV9hc2lkOworCX0KKworCWNmZy0+Y2QuYXNpZAk9ICh1MTYpYXNpZDsK KwljZmctPmNkLnR0YnIJPSBwZ3RibF9jZmctPmFybV9scGFlX3MxX2NmZy50dGJyWzBdOworCWNm Zy0+Y2QudGNyCT0gcGd0YmxfY2ZnLT5hcm1fbHBhZV9zMV9jZmcudGNyOworCWNmZy0+Y2QubWFp cgk9IHBndGJsX2NmZy0+YXJtX2xwYWVfczFfY2ZnLm1haXJbMF07CisJcmV0dXJuIDA7CisKK291 dF9mcmVlX2FzaWQ6CisJYXJtX3NtbXVfYml0bWFwX2ZyZWUoc21tdS0+YXNpZF9tYXAsIGFzaWQp OworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYXJtX3NtbXVfZG9tYWluX2ZpbmFsaXNl X3MyKHN0cnVjdCBhcm1fc21tdV9kb21haW4gKnNtbXVfZG9tYWluLAorCQkJCSAgICAgICBzdHJ1 Y3QgaW9fcGd0YWJsZV9jZmcgKnBndGJsX2NmZykKK3sKKwlpbnQgdm1pZDsKKwlzdHJ1Y3QgYXJt X3NtbXVfZGV2aWNlICpzbW11ID0gc21tdV9kb21haW4tPnNtbXU7CisJc3RydWN0IGFybV9zbW11 X3MyX2NmZyAqY2ZnID0gJnNtbXVfZG9tYWluLT5zMl9jZmc7CisKKwl2bWlkID0gYXJtX3NtbXVf Yml0bWFwX2FsbG9jKHNtbXUtPnZtaWRfbWFwLCBzbW11LT52bWlkX2JpdHMpOworCWlmICh2bWlk IDwgMCkKKwkJcmV0dXJuIHZtaWQ7CisKKwljZmctPnZtaWQJPSAodTE2KXZtaWQ7CisJY2ZnLT52 dHRicgk9IHBndGJsX2NmZy0+YXJtX2xwYWVfczJfY2ZnLnZ0dGJyOworCWNmZy0+dnRjcgk9IHBn dGJsX2NmZy0+YXJtX2xwYWVfczJfY2ZnLnZ0Y3I7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBp bnQgYXJtX3NtbXVfZG9tYWluX2ZpbmFsaXNlKHN0cnVjdCBpb21tdV9kb21haW4gKmRvbWFpbikK K3sKKwlpbnQgcmV0OworCXVuc2lnbmVkIGxvbmcgaWFzLCBvYXM7CisJZW51bSBpb19wZ3RhYmxl X2ZtdCBmbXQ7CisJc3RydWN0IGlvX3BndGFibGVfY2ZnIHBndGJsX2NmZzsKKwlzdHJ1Y3QgaW9f cGd0YWJsZV9vcHMgKnBndGJsX29wczsKKwlpbnQgKCpmaW5hbGlzZV9zdGFnZV9mbikoc3RydWN0 IGFybV9zbW11X2RvbWFpbiAqLAorCQkJCSBzdHJ1Y3QgaW9fcGd0YWJsZV9jZmcgKik7CisJc3Ry dWN0IGFybV9zbW11X2RvbWFpbiAqc21tdV9kb21haW4gPSB0b19zbW11X2RvbWFpbihkb21haW4p OworCXN0cnVjdCBhcm1fc21tdV9kZXZpY2UgKnNtbXUgPSBzbW11X2RvbWFpbi0+c21tdTsKKwor CWlmIChkb21haW4tPnR5cGUgPT0gSU9NTVVfRE9NQUlOX0lERU5USVRZKSB7CisJCXNtbXVfZG9t YWluLT5zdGFnZSA9IEFSTV9TTU1VX0RPTUFJTl9CWVBBU1M7CisJCXJldHVybiAwOworCX0KKwor CS8qIFJlc3RyaWN0IHRoZSBzdGFnZSB0byB3aGF0IHdlIGNhbiBhY3R1YWxseSBzdXBwb3J0ICov CisJaWYgKCEoc21tdS0+ZmVhdHVyZXMgJiBBUk1fU01NVV9GRUFUX1RSQU5TX1MxKSkKKwkJc21t dV9kb21haW4tPnN0YWdlID0gQVJNX1NNTVVfRE9NQUlOX1MyOworCWlmICghKHNtbXUtPmZlYXR1 cmVzICYgQVJNX1NNTVVfRkVBVF9UUkFOU19TMikpCisJCXNtbXVfZG9tYWluLT5zdGFnZSA9IEFS TV9TTU1VX0RPTUFJTl9TMTsKKworCXN3aXRjaCAoc21tdV9kb21haW4tPnN0YWdlKSB7CisJY2Fz ZSBBUk1fU01NVV9ET01BSU5fUzE6CisJCWlhcyA9IFZBX0JJVFM7CisJCW9hcyA9IHNtbXUtPmlh czsKKwkJZm10ID0gQVJNXzY0X0xQQUVfUzE7CisJCWZpbmFsaXNlX3N0YWdlX2ZuID0gYXJtX3Nt bXVfZG9tYWluX2ZpbmFsaXNlX3MxOworCQlicmVhazsKKwljYXNlIEFSTV9TTU1VX0RPTUFJTl9O RVNURUQ6CisJY2FzZSBBUk1fU01NVV9ET01BSU5fUzI6CisJCWlhcyA9IHNtbXUtPmlhczsKKwkJ b2FzID0gc21tdS0+b2FzOworCQlmbXQgPSBBUk1fNjRfTFBBRV9TMjsKKwkJZmluYWxpc2Vfc3Rh Z2VfZm4gPSBhcm1fc21tdV9kb21haW5fZmluYWxpc2VfczI7CisJCWJyZWFrOworCWRlZmF1bHQ6 CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXBndGJsX2NmZyA9IChzdHJ1Y3QgaW9fcGd0YWJs ZV9jZmcpIHsKKwkJLnBnc2l6ZV9iaXRtYXAJPSBzbW11LT5wZ3NpemVfYml0bWFwLAorCQkuaWFz CQk9IGlhcywKKwkJLm9hcwkJPSBvYXMsCisJCS50bGIJCT0gJmFybV9zbW11X2dhdGhlcl9vcHMs CisJCS5pb21tdV9kZXYJPSBzbW11LT5kZXYsCisJfTsKKworCWlmIChzbW11LT5mZWF0dXJlcyAm IEFSTV9TTU1VX0ZFQVRfQ09IRVJFTkNZKQorCQlwZ3RibF9jZmcucXVpcmtzID0gSU9fUEdUQUJM RV9RVUlSS19OT19ETUE7CisKKwlwZ3RibF9vcHMgPSBhbGxvY19pb19wZ3RhYmxlX29wcyhmbXQs ICZwZ3RibF9jZmcsIHNtbXVfZG9tYWluKTsKKwlpZiAoIXBndGJsX29wcykKKwkJcmV0dXJuIC1F Tk9NRU07CisKKwlkb21haW4tPnBnc2l6ZV9iaXRtYXAgPSBwZ3RibF9jZmcucGdzaXplX2JpdG1h cDsKKwlkb21haW4tPmdlb21ldHJ5LmFwZXJ0dXJlX2VuZCA9ICgxVUwgPDwgaWFzKSAtIDE7CisJ ZG9tYWluLT5nZW9tZXRyeS5mb3JjZV9hcGVydHVyZSA9IHRydWU7CisJc21tdV9kb21haW4tPnBn dGJsX29wcyA9IHBndGJsX29wczsKKworCXJldCA9IGZpbmFsaXNlX3N0YWdlX2ZuKHNtbXVfZG9t YWluLCAmcGd0YmxfY2ZnKTsKKwlpZiAocmV0IDwgMCkKKwkJZnJlZV9pb19wZ3RhYmxlX29wcyhw Z3RibF9vcHMpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIF9fbGU2NCAqYXJtX3NtbXVf Z2V0X3N0ZXBfZm9yX3NpZChzdHJ1Y3QgYXJtX3NtbXVfZGV2aWNlICpzbW11LCB1MzIgc2lkKQor eworCV9fbGU2NCAqc3RlcDsKKwlzdHJ1Y3QgYXJtX3NtbXVfc3RydGFiX2NmZyAqY2ZnID0gJnNt bXUtPnN0cnRhYl9jZmc7CisKKwlpZiAoc21tdS0+ZmVhdHVyZXMgJiBBUk1fU01NVV9GRUFUXzJf TFZMX1NUUlRBQikgeworCQlzdHJ1Y3QgYXJtX3NtbXVfc3RydGFiX2wxX2Rlc2MgKmwxX2Rlc2M7 CisJCWludCBpZHg7CisKKwkJLyogVHdvLWxldmVsIHdhbGsgKi8KKwkJaWR4ID0gKHNpZCA+PiBT VFJUQUJfU1BMSVQpICogU1RSVEFCX0wxX0RFU0NfRFdPUkRTOworCQlsMV9kZXNjID0gJmNmZy0+ bDFfZGVzY1tpZHhdOworCQlpZHggPSAoc2lkICYgKCgxIDw8IFNUUlRBQl9TUExJVCkgLSAxKSkg KiBTVFJUQUJfU1RFX0RXT1JEUzsKKwkJc3RlcCA9ICZsMV9kZXNjLT5sMnB0cltpZHhdOworCX0g ZWxzZSB7CisJCS8qIFNpbXBsZSBsaW5lYXIgbG9va3VwICovCisJCXN0ZXAgPSAmY2ZnLT5zdHJ0 YWJbc2lkICogU1RSVEFCX1NURV9EV09SRFNdOworCX0KKworCXJldHVybiBzdGVwOworfQorCitz dGF0aWMgdm9pZCBhcm1fc21tdV9pbnN0YWxsX3N0ZV9mb3JfZGV2KHN0cnVjdCBpb21tdV9md3Nw ZWMgKmZ3c3BlYykKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgYXJtX3NtbXVfbWFzdGVyX2RhdGEgKm1h c3RlciA9IGZ3c3BlYy0+aW9tbXVfcHJpdjsKKwlzdHJ1Y3QgYXJtX3NtbXVfZGV2aWNlICpzbW11 ID0gbWFzdGVyLT5zbW11OworCisJZm9yIChpID0gMDsgaSA8IGZ3c3BlYy0+bnVtX2lkczsgKytp KSB7CisJCXUzMiBzaWQgPSBmd3NwZWMtPmlkc1tpXTsKKwkJX19sZTY0ICpzdGVwID0gYXJtX3Nt bXVfZ2V0X3N0ZXBfZm9yX3NpZChzbW11LCBzaWQpOworCisJCWFybV9zbW11X3dyaXRlX3N0cnRh Yl9lbnQoc21tdSwgc2lkLCBzdGVwLCAmbWFzdGVyLT5zdGUpOworCX0KK30KKworc3RhdGljIHZv aWQgYXJtX3NtbXVfZGV0YWNoX2RldihzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFy bV9zbW11X21hc3Rlcl9kYXRhICptYXN0ZXIgPSBkZXYtPmlvbW11X2Z3c3BlYy0+aW9tbXVfcHJp djsKKworCW1hc3Rlci0+c3RlLmFzc2lnbmVkID0gZmFsc2U7CisJYXJtX3NtbXVfaW5zdGFsbF9z dGVfZm9yX2RldihkZXYtPmlvbW11X2Z3c3BlYyk7Cit9CisKK3N0YXRpYyBpbnQgYXJtX3NtbXVf YXR0YWNoX2RldihzdHJ1Y3QgaW9tbXVfZG9tYWluICpkb21haW4sIHN0cnVjdCBkZXZpY2UgKmRl dikKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgYXJtX3NtbXVfZGV2aWNlICpzbW11OworCXN0 cnVjdCBhcm1fc21tdV9kb21haW4gKnNtbXVfZG9tYWluID0gdG9fc21tdV9kb21haW4oZG9tYWlu KTsKKwlzdHJ1Y3QgYXJtX3NtbXVfbWFzdGVyX2RhdGEgKm1hc3RlcjsKKwlzdHJ1Y3QgYXJtX3Nt bXVfc3RydGFiX2VudCAqc3RlOworCisJaWYgKCFkZXYtPmlvbW11X2Z3c3BlYykKKwkJcmV0dXJu IC1FTk9FTlQ7CisKKwltYXN0ZXIgPSBkZXYtPmlvbW11X2Z3c3BlYy0+aW9tbXVfcHJpdjsKKwlz bW11ID0gbWFzdGVyLT5zbW11OworCXN0ZSA9ICZtYXN0ZXItPnN0ZTsKKworCS8qIEFscmVhZHkg YXR0YWNoZWQgdG8gYSBkaWZmZXJlbnQgZG9tYWluPyAqLworCWlmIChzdGUtPmFzc2lnbmVkKQor CQlhcm1fc21tdV9kZXRhY2hfZGV2KGRldik7CisKKwltdXRleF9sb2NrKCZzbW11X2RvbWFpbi0+ aW5pdF9tdXRleCk7CisKKwlpZiAoIXNtbXVfZG9tYWluLT5zbW11KSB7CisJCXNtbXVfZG9tYWlu LT5zbW11ID0gc21tdTsKKwkJcmV0ID0gYXJtX3NtbXVfZG9tYWluX2ZpbmFsaXNlKGRvbWFpbik7 CisJCWlmIChyZXQpIHsKKwkJCXNtbXVfZG9tYWluLT5zbW11ID0gTlVMTDsKKwkJCWdvdG8gb3V0 X3VubG9jazsKKwkJfQorCX0gZWxzZSBpZiAoc21tdV9kb21haW4tPnNtbXUgIT0gc21tdSkgewor CQlkZXZfZXJyKGRldiwKKwkJCSJjYW5ub3QgYXR0YWNoIHRvIFNNTVUgJXMgKHVwc3RyZWFtIG9m ICVzKVxuIiwKKwkJCWRldl9uYW1lKHNtbXVfZG9tYWluLT5zbW11LT5kZXYpLAorCQkJZGV2X25h bWUoc21tdS0+ZGV2KSk7CisJCXJldCA9IC1FTlhJTzsKKwkJZ290byBvdXRfdW5sb2NrOworCX0K KworCXN0ZS0+YXNzaWduZWQgPSB0cnVlOworCisJaWYgKHNtbXVfZG9tYWluLT5zdGFnZSA9PSBB Uk1fU01NVV9ET01BSU5fQllQQVNTKSB7CisJCXN0ZS0+czFfY2ZnID0gTlVMTDsKKwkJc3RlLT5z Ml9jZmcgPSBOVUxMOworCX0gZWxzZSBpZiAoc21tdV9kb21haW4tPnN0YWdlID09IEFSTV9TTU1V X0RPTUFJTl9TMSkgeworCQlzdGUtPnMxX2NmZyA9ICZzbW11X2RvbWFpbi0+czFfY2ZnOworCQlz dGUtPnMyX2NmZyA9IE5VTEw7CisJCWFybV9zbW11X3dyaXRlX2N0eF9kZXNjKHNtbXUsIHN0ZS0+ czFfY2ZnKTsKKwl9IGVsc2UgeworCQlzdGUtPnMxX2NmZyA9IE5VTEw7CisJCXN0ZS0+czJfY2Zn ID0gJnNtbXVfZG9tYWluLT5zMl9jZmc7CisJfQorCisJYXJtX3NtbXVfaW5zdGFsbF9zdGVfZm9y X2RldihkZXYtPmlvbW11X2Z3c3BlYyk7CitvdXRfdW5sb2NrOgorCW11dGV4X3VubG9jaygmc21t dV9kb21haW4tPmluaXRfbXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYXJt X3NtbXVfbWFwKHN0cnVjdCBpb21tdV9kb21haW4gKmRvbWFpbiwgdW5zaWduZWQgbG9uZyBpb3Zh LAorCQkJcGh5c19hZGRyX3QgcGFkZHIsIHNpemVfdCBzaXplLCBpbnQgcHJvdCkKK3sKKwlzdHJ1 Y3QgaW9fcGd0YWJsZV9vcHMgKm9wcyA9IHRvX3NtbXVfZG9tYWluKGRvbWFpbiktPnBndGJsX29w czsKKworCWlmICghb3BzKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJldHVybiBvcHMtPm1hcChv cHMsIGlvdmEsIHBhZGRyLCBzaXplLCBwcm90KTsKK30KKworc3RhdGljIHNpemVfdAorYXJtX3Nt bXVfdW5tYXAoc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tYWluLCB1bnNpZ25lZCBsb25nIGlvdmEs IHNpemVfdCBzaXplKQoreworCXN0cnVjdCBpb19wZ3RhYmxlX29wcyAqb3BzID0gdG9fc21tdV9k b21haW4oZG9tYWluKS0+cGd0Ymxfb3BzOworCisJaWYgKCFvcHMpCisJCXJldHVybiAwOworCisJ cmV0dXJuIG9wcy0+dW5tYXAob3BzLCBpb3ZhLCBzaXplKTsKK30KKworc3RhdGljIHBoeXNfYWRk cl90Cithcm1fc21tdV9pb3ZhX3RvX3BoeXMoc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tYWluLCBk bWFfYWRkcl90IGlvdmEpCit7CisJc3RydWN0IGlvX3BndGFibGVfb3BzICpvcHMgPSB0b19zbW11 X2RvbWFpbihkb21haW4pLT5wZ3RibF9vcHM7CisKKwlpZiAoZG9tYWluLT50eXBlID09IElPTU1V X0RPTUFJTl9JREVOVElUWSkKKwkJcmV0dXJuIGlvdmE7CisKKwlpZiAoIW9wcykKKwkJcmV0dXJu IDA7CisKKwlyZXR1cm4gb3BzLT5pb3ZhX3RvX3BoeXMob3BzLCBpb3ZhKTsKK30KKworc3RhdGlj IHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYXJtX3NtbXVfZHJpdmVyOworCitzdGF0aWMgaW50IGFy bV9zbW11X21hdGNoX25vZGUoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQoreworCXJl dHVybiBkZXYtPmZ3bm9kZSA9PSBkYXRhOworfQorCitzdGF0aWMKK3N0cnVjdCBhcm1fc21tdV9k ZXZpY2UgKmFybV9zbW11X2dldF9ieV9md25vZGUoc3RydWN0IGZ3bm9kZV9oYW5kbGUgKmZ3bm9k ZSkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBkcml2ZXJfZmluZF9kZXZpY2UoJmFybV9zbW11 X2RyaXZlci5kcml2ZXIsIE5VTEwsCisJCQkJCQlmd25vZGUsIGFybV9zbW11X21hdGNoX25vZGUp OworCXB1dF9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gZGV2ID8gZGV2X2dldF9kcnZkYXRhKGRldikg OiBOVUxMOworfQorCitzdGF0aWMgYm9vbCBhcm1fc21tdV9zaWRfaW5fcmFuZ2Uoc3RydWN0IGFy bV9zbW11X2RldmljZSAqc21tdSwgdTMyIHNpZCkKK3sKKwl1bnNpZ25lZCBsb25nIGxpbWl0ID0g c21tdS0+c3RydGFiX2NmZy5udW1fbDFfZW50czsKKworCWlmIChzbW11LT5mZWF0dXJlcyAmIEFS TV9TTU1VX0ZFQVRfMl9MVkxfU1RSVEFCKQorCQlsaW1pdCAqPSAxVUwgPDwgU1RSVEFCX1NQTElU OworCisJcmV0dXJuIHNpZCA8IGxpbWl0OworfQorCitzdGF0aWMgc3RydWN0IGlvbW11X29wcyBh cm1fc21tdV9vcHM7CisKK3N0YXRpYyBpbnQgYXJtX3NtbXVfYWRkX2RldmljZShzdHJ1Y3QgZGV2 aWNlICpkZXYpCit7CisJaW50IGksIHJldDsKKwlzdHJ1Y3QgYXJtX3NtbXVfZGV2aWNlICpzbW11 OworCXN0cnVjdCBhcm1fc21tdV9tYXN0ZXJfZGF0YSAqbWFzdGVyOworCXN0cnVjdCBpb21tdV9m d3NwZWMgKmZ3c3BlYyA9IGRldi0+aW9tbXVfZndzcGVjOworCXN0cnVjdCBpb21tdV9ncm91cCAq Z3JvdXA7CisKKwlpZiAoIWZ3c3BlYyB8fCBmd3NwZWMtPm9wcyAhPSAmYXJtX3NtbXVfb3BzKQor CQlyZXR1cm4gLUVOT0RFVjsKKwkvKgorCSAqIFdlIF9jYW5fIGFjdHVhbGx5IHdpdGhzdGFuZCBk b2RneSBidXMgY29kZSByZS1jYWxsaW5nIGFkZF9kZXZpY2UoKQorCSAqIHdpdGhvdXQgYW4gaW50 ZXJ2ZW5pbmcgcmVtb3ZlX2RldmljZSgpL29mX3hsYXRlKCkgc2VxdWVuY2UsIGJ1dAorCSAqIHdl J3JlIG5vdCBnb2luZyB0byBkbyBzbyBxdWlldGx5Li4uCisJICovCisJaWYgKFdBUk5fT05fT05D RShmd3NwZWMtPmlvbW11X3ByaXYpKSB7CisJCW1hc3RlciA9IGZ3c3BlYy0+aW9tbXVfcHJpdjsK KwkJc21tdSA9IG1hc3Rlci0+c21tdTsKKwl9IGVsc2UgeworCQlzbW11ID0gYXJtX3NtbXVfZ2V0 X2J5X2Z3bm9kZShmd3NwZWMtPmlvbW11X2Z3bm9kZSk7CisJCWlmICghc21tdSkKKwkJCXJldHVy biAtRU5PREVWOworCQltYXN0ZXIgPSBremFsbG9jKHNpemVvZigqbWFzdGVyKSwgR0ZQX0tFUk5F TCk7CisJCWlmICghbWFzdGVyKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJbWFzdGVyLT5zbW11 ID0gc21tdTsKKwkJZndzcGVjLT5pb21tdV9wcml2ID0gbWFzdGVyOworCX0KKworCS8qIENoZWNr IHRoZSBTSURzIGFyZSBpbiByYW5nZSBvZiB0aGUgU01NVSBhbmQgb3VyIHN0cmVhbSB0YWJsZSAq LworCWZvciAoaSA9IDA7IGkgPCBmd3NwZWMtPm51bV9pZHM7IGkrKykgeworCQl1MzIgc2lkID0g ZndzcGVjLT5pZHNbaV07CisKKwkJaWYgKCFhcm1fc21tdV9zaWRfaW5fcmFuZ2Uoc21tdSwgc2lk KSkKKwkJCXJldHVybiAtRVJBTkdFOworCisJCS8qIEVuc3VyZSBsMiBzdHJ0YWIgaXMgaW5pdGlh bGlzZWQgKi8KKwkJaWYgKHNtbXUtPmZlYXR1cmVzICYgQVJNX1NNTVVfRkVBVF8yX0xWTF9TVFJU QUIpIHsKKwkJCXJldCA9IGFybV9zbW11X2luaXRfbDJfc3RydGFiKHNtbXUsIHNpZCk7CisJCQlp ZiAocmV0KQorCQkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwlncm91cCA9IGlvbW11X2dyb3Vw X2dldF9mb3JfZGV2KGRldik7CisJaWYgKCFJU19FUlIoZ3JvdXApKSB7CisJCWlvbW11X2dyb3Vw X3B1dChncm91cCk7CisJCWlvbW11X2RldmljZV9saW5rKCZzbW11LT5pb21tdSwgZGV2KTsKKwl9 CisKKwlyZXR1cm4gUFRSX0VSUl9PUl9aRVJPKGdyb3VwKTsKK30KKworc3RhdGljIHZvaWQgYXJt X3NtbXVfcmVtb3ZlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGlvbW11 X2Z3c3BlYyAqZndzcGVjID0gZGV2LT5pb21tdV9md3NwZWM7CisJc3RydWN0IGFybV9zbW11X21h c3Rlcl9kYXRhICptYXN0ZXI7CisJc3RydWN0IGFybV9zbW11X2RldmljZSAqc21tdTsKKworCWlm ICghZndzcGVjIHx8IGZ3c3BlYy0+b3BzICE9ICZhcm1fc21tdV9vcHMpCisJCXJldHVybjsKKwor CW1hc3RlciA9IGZ3c3BlYy0+aW9tbXVfcHJpdjsKKwlzbW11ID0gbWFzdGVyLT5zbW11OworCWlm IChtYXN0ZXIgJiYgbWFzdGVyLT5zdGUuYXNzaWduZWQpCisJCWFybV9zbW11X2RldGFjaF9kZXYo ZGV2KTsKKwlpb21tdV9ncm91cF9yZW1vdmVfZGV2aWNlKGRldik7CisJaW9tbXVfZGV2aWNlX3Vu bGluaygmc21tdS0+aW9tbXUsIGRldik7CisJa2ZyZWUobWFzdGVyKTsKKwlpb21tdV9md3NwZWNf ZnJlZShkZXYpOworfQorCitzdGF0aWMgc3RydWN0IGlvbW11X2dyb3VwICphcm1fc21tdV9kZXZp Y2VfZ3JvdXAoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpb21tdV9ncm91cCAqZ3Jv dXA7CisKKwkvKgorCSAqIFdlIGRvbid0IHN1cHBvcnQgZGV2aWNlcyBzaGFyaW5nIHN0cmVhbSBJ RHMgb3RoZXIgdGhhbiBQQ0kgUklECisJICogYWxpYXNlcywgc2luY2UgdGhlIG5lY2Vzc2FyeSBJ RC10by1kZXZpY2UgbG9va3VwIGJlY29tZXMgcmF0aGVyCisJICogaW1wcmFjdGljYWwgZ2l2ZW4g YSBwb3RlbnRpYWwgc3BhcnNlIDMyLWJpdCBzdHJlYW0gSUQgc3BhY2UuCisJICovCisJaWYgKGRl dl9pc19wY2koZGV2KSkKKwkJZ3JvdXAgPSBwY2lfZGV2aWNlX2dyb3VwKGRldik7CisJZWxzZQor CQlncm91cCA9IGdlbmVyaWNfZGV2aWNlX2dyb3VwKGRldik7CisKKwlyZXR1cm4gZ3JvdXA7Cit9 CisKK3N0YXRpYyBpbnQgYXJtX3NtbXVfZG9tYWluX2dldF9hdHRyKHN0cnVjdCBpb21tdV9kb21h aW4gKmRvbWFpbiwKKwkJCQkgICAgZW51bSBpb21tdV9hdHRyIGF0dHIsIHZvaWQgKmRhdGEpCit7 CisJc3RydWN0IGFybV9zbW11X2RvbWFpbiAqc21tdV9kb21haW4gPSB0b19zbW11X2RvbWFpbihk b21haW4pOworCisJaWYgKGRvbWFpbi0+dHlwZSAhPSBJT01NVV9ET01BSU5fVU5NQU5BR0VEKQor CQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRjaCAoYXR0cikgeworCWNhc2UgRE9NQUlOX0FUVFJf TkVTVElORzoKKwkJKihpbnQgKilkYXRhID0gKHNtbXVfZG9tYWluLT5zdGFnZSA9PSBBUk1fU01N VV9ET01BSU5fTkVTVEVEKTsKKwkJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9E RVY7CisJfQorfQorCitzdGF0aWMgaW50IGFybV9zbW11X2RvbWFpbl9zZXRfYXR0cihzdHJ1Y3Qg aW9tbXVfZG9tYWluICpkb21haW4sCisJCQkJICAgIGVudW0gaW9tbXVfYXR0ciBhdHRyLCB2b2lk ICpkYXRhKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBhcm1fc21tdV9kb21haW4gKnNtbXVf ZG9tYWluID0gdG9fc21tdV9kb21haW4oZG9tYWluKTsKKworCWlmIChkb21haW4tPnR5cGUgIT0g SU9NTVVfRE9NQUlOX1VOTUFOQUdFRCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltdXRleF9sb2Nr KCZzbW11X2RvbWFpbi0+aW5pdF9tdXRleCk7CisKKwlzd2l0Y2ggKGF0dHIpIHsKKwljYXNlIERP TUFJTl9BVFRSX05FU1RJTkc6CisJCWlmIChzbW11X2RvbWFpbi0+c21tdSkgeworCQkJcmV0ID0g LUVQRVJNOworCQkJZ290byBvdXRfdW5sb2NrOworCQl9CisKKwkJaWYgKCooaW50ICopZGF0YSkK KwkJCXNtbXVfZG9tYWluLT5zdGFnZSA9IEFSTV9TTU1VX0RPTUFJTl9ORVNURUQ7CisJCWVsc2UK KwkJCXNtbXVfZG9tYWluLT5zdGFnZSA9IEFSTV9TTU1VX0RPTUFJTl9TMTsKKworCQlicmVhazsK KwlkZWZhdWx0OgorCQlyZXQgPSAtRU5PREVWOworCX0KKworb3V0X3VubG9jazoKKwltdXRleF91 bmxvY2soJnNtbXVfZG9tYWluLT5pbml0X211dGV4KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0 aWMgaW50IGFybV9zbW11X29mX3hsYXRlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IG9mX3Bo YW5kbGVfYXJncyAqYXJncykKK3sKKwlyZXR1cm4gaW9tbXVfZndzcGVjX2FkZF9pZHMoZGV2LCBh cmdzLT5hcmdzLCAxKTsKK30KKworc3RhdGljIHZvaWQgYXJtX3NtbXVfZ2V0X3Jlc3ZfcmVnaW9u cyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICAgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkK K3sKKwlzdHJ1Y3QgaW9tbXVfcmVzdl9yZWdpb24gKnJlZ2lvbjsKKwlpbnQgcHJvdCA9IElPTU1V X1dSSVRFIHwgSU9NTVVfTk9FWEVDIHwgSU9NTVVfTU1JTzsKKworCXJlZ2lvbiA9IGlvbW11X2Fs bG9jX3Jlc3ZfcmVnaW9uKE1TSV9JT1ZBX0JBU0UsIE1TSV9JT1ZBX0xFTkdUSCwKKwkJCQkJIHBy b3QsIElPTU1VX1JFU1ZfU1dfTVNJKTsKKwlpZiAoIXJlZ2lvbikKKwkJcmV0dXJuOworCisJbGlz dF9hZGRfdGFpbCgmcmVnaW9uLT5saXN0LCBoZWFkKTsKKworCWlvbW11X2RtYV9nZXRfcmVzdl9y ZWdpb25zKGRldiwgaGVhZCk7Cit9CisKK3N0YXRpYyB2b2lkIGFybV9zbW11X3B1dF9yZXN2X3Jl Z2lvbnMoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmhl YWQpCit7CisJc3RydWN0IGlvbW11X3Jlc3ZfcmVnaW9uICplbnRyeSwgKm5leHQ7CisKKwlsaXN0 X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZW50cnksIG5leHQsIGhlYWQsIGxpc3QpCisJCWtmcmVlKGVu dHJ5KTsKK30KKworc3RhdGljIHN0cnVjdCBpb21tdV9vcHMgYXJtX3NtbXVfb3BzID0geworCS5j YXBhYmxlCQk9IGFybV9zbW11X2NhcGFibGUsCisJLmRvbWFpbl9hbGxvYwkJPSBhcm1fc21tdV9k b21haW5fYWxsb2MsCisJLmRvbWFpbl9mcmVlCQk9IGFybV9zbW11X2RvbWFpbl9mcmVlLAorCS5h dHRhY2hfZGV2CQk9IGFybV9zbW11X2F0dGFjaF9kZXYsCisJLm1hcAkJCT0gYXJtX3NtbXVfbWFw LAorCS51bm1hcAkJCT0gYXJtX3NtbXVfdW5tYXAsCisJLm1hcF9zZwkJCT0gZGVmYXVsdF9pb21t dV9tYXBfc2csCisJLmlvdmFfdG9fcGh5cwkJPSBhcm1fc21tdV9pb3ZhX3RvX3BoeXMsCisJLmFk ZF9kZXZpY2UJCT0gYXJtX3NtbXVfYWRkX2RldmljZSwKKwkucmVtb3ZlX2RldmljZQkJPSBhcm1f c21tdV9yZW1vdmVfZGV2aWNlLAorCS5kZXZpY2VfZ3JvdXAJCT0gYXJtX3NtbXVfZGV2aWNlX2dy b3VwLAorCS5kb21haW5fZ2V0X2F0dHIJPSBhcm1fc21tdV9kb21haW5fZ2V0X2F0dHIsCisJLmRv bWFpbl9zZXRfYXR0cgk9IGFybV9zbW11X2RvbWFpbl9zZXRfYXR0ciwKKwkub2ZfeGxhdGUJCT0g YXJtX3NtbXVfb2ZfeGxhdGUsCisJLmdldF9yZXN2X3JlZ2lvbnMJPSBhcm1fc21tdV9nZXRfcmVz dl9yZWdpb25zLAorCS5wdXRfcmVzdl9yZWdpb25zCT0gYXJtX3NtbXVfcHV0X3Jlc3ZfcmVnaW9u cywKKwkucGdzaXplX2JpdG1hcAkJPSAtMVVMLCAvKiBSZXN0cmljdGVkIGR1cmluZyBkZXZpY2Ug YXR0YWNoICovCit9OworCisvKiBQcm9iaW5nIGFuZCBpbml0aWFsaXNhdGlvbiBmdW5jdGlvbnMg Ki8KK3N0YXRpYyBpbnQgYXJtX3NtbXVfaW5pdF9vbmVfcXVldWUoc3RydWN0IGFybV9zbW11X2Rl dmljZSAqc21tdSwKKwkJCQkgICBzdHJ1Y3QgYXJtX3NtbXVfcXVldWUgKnEsCisJCQkJICAgdW5z aWduZWQgbG9uZyBwcm9kX29mZiwKKwkJCQkgICB1bnNpZ25lZCBsb25nIGNvbnNfb2ZmLAorCQkJ CSAgIHNpemVfdCBkd29yZHMpCit7CisJc2l6ZV90IHFzeiA9ICgoMSA8PCBxLT5tYXhfbl9zaGlm dCkgKiBkd29yZHMpIDw8IDM7CisKKwlxLT5iYXNlID0gZG1hbV9hbGxvY19jb2hlcmVudChzbW11 LT5kZXYsIHFzeiwgJnEtPmJhc2VfZG1hLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXEtPmJhc2UpIHsK KwkJZGV2X2VycihzbW11LT5kZXYsICJmYWlsZWQgdG8gYWxsb2NhdGUgcXVldWUgKDB4JXp4IGJ5 dGVzKVxuIiwKKwkJCXFzeik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXEtPnByb2RfcmVn CT0gYXJtX3NtbXVfcGFnZTFfZml4dXAocHJvZF9vZmYsIHNtbXUpOworCXEtPmNvbnNfcmVnCT0g YXJtX3NtbXVfcGFnZTFfZml4dXAoY29uc19vZmYsIHNtbXUpOworCXEtPmVudF9kd29yZHMJPSBk d29yZHM7CisKKwlxLT5xX2Jhc2UgID0gUV9CQVNFX1JXQTsKKwlxLT5xX2Jhc2UgfD0gcS0+YmFz ZV9kbWEgJiBRX0JBU0VfQUREUl9NQVNLIDw8IFFfQkFTRV9BRERSX1NISUZUOworCXEtPnFfYmFz ZSB8PSAocS0+bWF4X25fc2hpZnQgJiBRX0JBU0VfTE9HMlNJWkVfTUFTSykKKwkJICAgICA8PCBR X0JBU0VfTE9HMlNJWkVfU0hJRlQ7CisKKwlxLT5wcm9kID0gcS0+Y29ucyA9IDA7CisJcmV0dXJu IDA7Cit9CisKK3N0YXRpYyBpbnQgYXJtX3NtbXVfaW5pdF9xdWV1ZXMoc3RydWN0IGFybV9zbW11 X2RldmljZSAqc21tdSkKK3sKKwlpbnQgcmV0OworCisJLyogY21kcSAqLworCXNwaW5fbG9ja19p bml0KCZzbW11LT5jbWRxLmxvY2spOworCXJldCA9IGFybV9zbW11X2luaXRfb25lX3F1ZXVlKHNt bXUsICZzbW11LT5jbWRxLnEsIEFSTV9TTU1VX0NNRFFfUFJPRCwKKwkJCQkgICAgICBBUk1fU01N VV9DTURRX0NPTlMsIENNRFFfRU5UX0RXT1JEUyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsK KworCS8qIGV2dHEgKi8KKwlyZXQgPSBhcm1fc21tdV9pbml0X29uZV9xdWV1ZShzbW11LCAmc21t dS0+ZXZ0cS5xLCBBUk1fU01NVV9FVlRRX1BST0QsCisJCQkJICAgICAgQVJNX1NNTVVfRVZUUV9D T05TLCBFVlRRX0VOVF9EV09SRFMpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiBw cmlxICovCisJaWYgKCEoc21tdS0+ZmVhdHVyZXMgJiBBUk1fU01NVV9GRUFUX1BSSSkpCisJCXJl dHVybiAwOworCisJcmV0dXJuIGFybV9zbW11X2luaXRfb25lX3F1ZXVlKHNtbXUsICZzbW11LT5w cmlxLnEsIEFSTV9TTU1VX1BSSVFfUFJPRCwKKwkJCQkgICAgICAgQVJNX1NNTVVfUFJJUV9DT05T LCBQUklRX0VOVF9EV09SRFMpOworfQorCitzdGF0aWMgaW50IGFybV9zbW11X2luaXRfbDFfc3Ry dGFiKHN0cnVjdCBhcm1fc21tdV9kZXZpY2UgKnNtbXUpCit7CisJdW5zaWduZWQgaW50IGk7CisJ c3RydWN0IGFybV9zbW11X3N0cnRhYl9jZmcgKmNmZyA9ICZzbW11LT5zdHJ0YWJfY2ZnOworCXNp emVfdCBzaXplID0gc2l6ZW9mKCpjZmctPmwxX2Rlc2MpICogY2ZnLT5udW1fbDFfZW50czsKKwl2 b2lkICpzdHJ0YWIgPSBzbW11LT5zdHJ0YWJfY2ZnLnN0cnRhYjsKKworCWNmZy0+bDFfZGVzYyA9 IGRldm1fa3phbGxvYyhzbW11LT5kZXYsIHNpemUsIEdGUF9LRVJORUwpOworCWlmICghY2ZnLT5s MV9kZXNjKSB7CisJCWRldl9lcnIoc21tdS0+ZGV2LCAiZmFpbGVkIHRvIGFsbG9jYXRlIGwxIHN0 cmVhbSB0YWJsZSBkZXNjXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZm9yIChpID0g MDsgaSA8IGNmZy0+bnVtX2wxX2VudHM7ICsraSkgeworCQlhcm1fc21tdV93cml0ZV9zdHJ0YWJf bDFfZGVzYyhzdHJ0YWIsICZjZmctPmwxX2Rlc2NbaV0pOworCQlzdHJ0YWIgKz0gU1RSVEFCX0wx X0RFU0NfRFdPUkRTIDw8IDM7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXJt X3NtbXVfaW5pdF9zdHJ0YWJfMmx2bChzdHJ1Y3QgYXJtX3NtbXVfZGV2aWNlICpzbW11KQorewor CXZvaWQgKnN0cnRhYjsKKwl1NjQgcmVnOworCXUzMiBzaXplLCBsMXNpemU7CisJc3RydWN0IGFy bV9zbW11X3N0cnRhYl9jZmcgKmNmZyA9ICZzbW11LT5zdHJ0YWJfY2ZnOworCisJLyogQ2FsY3Vs YXRlIHRoZSBMMSBzaXplLCBjYXBwZWQgdG8gdGhlIFNJRFNJWkUuICovCisJc2l6ZSA9IFNUUlRB Ql9MMV9TWl9TSElGVCAtIChpbG9nMihTVFJUQUJfTDFfREVTQ19EV09SRFMpICsgMyk7CisJc2l6 ZSA9IG1pbihzaXplLCBzbW11LT5zaWRfYml0cyAtIFNUUlRBQl9TUExJVCk7CisJY2ZnLT5udW1f bDFfZW50cyA9IDEgPDwgc2l6ZTsKKworCXNpemUgKz0gU1RSVEFCX1NQTElUOworCWlmIChzaXpl IDwgc21tdS0+c2lkX2JpdHMpCisJCWRldl93YXJuKHNtbXUtPmRldiwKKwkJCSAiMi1sZXZlbCBz dHJ0YWIgb25seSBjb3ZlcnMgJXUvJXUgYml0cyBvZiBTSURcbiIsCisJCQkgc2l6ZSwgc21tdS0+ c2lkX2JpdHMpOworCisJbDFzaXplID0gY2ZnLT5udW1fbDFfZW50cyAqIChTVFJUQUJfTDFfREVT Q19EV09SRFMgPDwgMyk7CisJc3RydGFiID0gZG1hbV9hbGxvY19jb2hlcmVudChzbW11LT5kZXYs IGwxc2l6ZSwgJmNmZy0+c3RydGFiX2RtYSwKKwkJCQkgICAgIEdGUF9LRVJORUwgfCBfX0dGUF9a RVJPKTsKKwlpZiAoIXN0cnRhYikgeworCQlkZXZfZXJyKHNtbXUtPmRldiwKKwkJCSJmYWlsZWQg dG8gYWxsb2NhdGUgbDEgc3RyZWFtIHRhYmxlICgldSBieXRlcylcbiIsCisJCQlzaXplKTsKKwkJ cmV0dXJuIC1FTk9NRU07CisJfQorCWNmZy0+c3RydGFiID0gc3RydGFiOworCisJLyogQ29uZmln dXJlIHN0cnRhYl9iYXNlX2NmZyBmb3IgMiBsZXZlbHMgKi8KKwlyZWcgID0gU1RSVEFCX0JBU0Vf Q0ZHX0ZNVF8yTFZMOworCXJlZyB8PSAoc2l6ZSAmIFNUUlRBQl9CQVNFX0NGR19MT0cyU0laRV9N QVNLKQorCQk8PCBTVFJUQUJfQkFTRV9DRkdfTE9HMlNJWkVfU0hJRlQ7CisJcmVnIHw9IChTVFJU QUJfU1BMSVQgJiBTVFJUQUJfQkFTRV9DRkdfU1BMSVRfTUFTSykKKwkJPDwgU1RSVEFCX0JBU0Vf Q0ZHX1NQTElUX1NISUZUOworCWNmZy0+c3RydGFiX2Jhc2VfY2ZnID0gcmVnOworCisJcmV0dXJu IGFybV9zbW11X2luaXRfbDFfc3RydGFiKHNtbXUpOworfQorCitzdGF0aWMgaW50IGFybV9zbW11 X2luaXRfc3RydGFiX2xpbmVhcihzdHJ1Y3QgYXJtX3NtbXVfZGV2aWNlICpzbW11KQoreworCXZv aWQgKnN0cnRhYjsKKwl1NjQgcmVnOworCXUzMiBzaXplOworCXN0cnVjdCBhcm1fc21tdV9zdHJ0 YWJfY2ZnICpjZmcgPSAmc21tdS0+c3RydGFiX2NmZzsKKworCXNpemUgPSAoMSA8PCBzbW11LT5z aWRfYml0cykgKiAoU1RSVEFCX1NURV9EV09SRFMgPDwgMyk7CisJc3RydGFiID0gZG1hbV9hbGxv Y19jb2hlcmVudChzbW11LT5kZXYsIHNpemUsICZjZmctPnN0cnRhYl9kbWEsCisJCQkJICAgICBH RlBfS0VSTkVMIHwgX19HRlBfWkVSTyk7CisJaWYgKCFzdHJ0YWIpIHsKKwkJZGV2X2VycihzbW11 LT5kZXYsCisJCQkiZmFpbGVkIHRvIGFsbG9jYXRlIGxpbmVhciBzdHJlYW0gdGFibGUgKCV1IGJ5 dGVzKVxuIiwKKwkJCXNpemUpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJY2ZnLT5zdHJ0YWIg PSBzdHJ0YWI7CisJY2ZnLT5udW1fbDFfZW50cyA9IDEgPDwgc21tdS0+c2lkX2JpdHM7CisKKwkv KiBDb25maWd1cmUgc3RydGFiX2Jhc2VfY2ZnIGZvciBhIGxpbmVhciB0YWJsZSBjb3ZlcmluZyBh bGwgU0lEcyAqLworCXJlZyAgPSBTVFJUQUJfQkFTRV9DRkdfRk1UX0xJTkVBUjsKKwlyZWcgfD0g KHNtbXUtPnNpZF9iaXRzICYgU1RSVEFCX0JBU0VfQ0ZHX0xPRzJTSVpFX01BU0spCisJCTw8IFNU UlRBQl9CQVNFX0NGR19MT0cyU0laRV9TSElGVDsKKwljZmctPnN0cnRhYl9iYXNlX2NmZyA9IHJl ZzsKKworCWFybV9zbW11X2luaXRfYnlwYXNzX3N0ZXMoc3RydGFiLCBjZmctPm51bV9sMV9lbnRz KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhcm1fc21tdV9pbml0X3N0cnRhYihzdHJ1 Y3QgYXJtX3NtbXVfZGV2aWNlICpzbW11KQoreworCXU2NCByZWc7CisJaW50IHJldDsKKworCWlm IChzbW11LT5mZWF0dXJlcyAmIEFSTV9TTU1VX0ZFQVRfMl9MVkxfU1RSVEFCKQorCQlyZXQgPSBh cm1fc21tdV9pbml0X3N0cnRhYl8ybHZsKHNtbXUpOworCWVsc2UKKwkJcmV0ID0gYXJtX3NtbXVf aW5pdF9zdHJ0YWJfbGluZWFyKHNtbXUpOworCisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwor CS8qIFNldCB0aGUgc3RydGFiIGJhc2UgYWRkcmVzcyAqLworCXJlZyAgPSBzbW11LT5zdHJ0YWJf Y2ZnLnN0cnRhYl9kbWEgJgorCSAgICAgICBTVFJUQUJfQkFTRV9BRERSX01BU0sgPDwgU1RSVEFC X0JBU0VfQUREUl9TSElGVDsKKwlyZWcgfD0gU1RSVEFCX0JBU0VfUkE7CisJc21tdS0+c3RydGFi X2NmZy5zdHJ0YWJfYmFzZSA9IHJlZzsKKworCS8qIEFsbG9jYXRlIHRoZSBmaXJzdCBWTUlEIGZv ciBzdGFnZS0yIGJ5cGFzcyBTVEVzICovCisJc2V0X2JpdCgwLCBzbW11LT52bWlkX21hcCk7CisJ cmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXJtX3NtbXVfaW5pdF9zdHJ1Y3R1cmVzKHN0cnVj dCBhcm1fc21tdV9kZXZpY2UgKnNtbXUpCit7CisJaW50IHJldDsKKworCXJldCA9IGFybV9zbW11 X2luaXRfcXVldWVzKHNtbXUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4g YXJtX3NtbXVfaW5pdF9zdHJ0YWIoc21tdSk7Cit9CisKK3N0YXRpYyBpbnQgYXJtX3NtbXVfd3Jp dGVfcmVnX3N5bmMoc3RydWN0IGFybV9zbW11X2RldmljZSAqc21tdSwgdTMyIHZhbCwKKwkJCQkg ICB1bnNpZ25lZCBpbnQgcmVnX29mZiwgdW5zaWduZWQgaW50IGFja19vZmYpCit7CisJdTMyIHJl ZzsKKworCXdyaXRlbF9yZWxheGVkKHZhbCwgc21tdS0+YmFzZSArIHJlZ19vZmYpOworCXJldHVy biByZWFkbF9yZWxheGVkX3BvbGxfdGltZW91dChzbW11LT5iYXNlICsgYWNrX29mZiwgcmVnLCBy ZWcgPT0gdmFsLAorCQkJCQkgIDEsIEFSTV9TTU1VX1BPTExfVElNRU9VVF9VUyk7Cit9CisKKy8q IEdCUEEgaXMgInNwZWNpYWwiICovCitzdGF0aWMgaW50IGFybV9zbW11X3VwZGF0ZV9nYnBhKHN0 cnVjdCBhcm1fc21tdV9kZXZpY2UgKnNtbXUsIHUzMiBzZXQsIHUzMiBjbHIpCit7CisJaW50IHJl dDsKKwl1MzIgcmVnLCBfX2lvbWVtICpnYnBhID0gc21tdS0+YmFzZSArIEFSTV9TTU1VX0dCUEE7 CisKKwlyZXQgPSByZWFkbF9yZWxheGVkX3BvbGxfdGltZW91dChnYnBhLCByZWcsICEocmVnICYg R0JQQV9VUERBVEUpLAorCQkJCQkgMSwgQVJNX1NNTVVfUE9MTF9USU1FT1VUX1VTKTsKKwlpZiAo cmV0KQorCQlyZXR1cm4gcmV0OworCisJcmVnICY9IH5jbHI7CisJcmVnIHw9IHNldDsKKwl3cml0 ZWxfcmVsYXhlZChyZWcgfCBHQlBBX1VQREFURSwgZ2JwYSk7CisJcmV0dXJuIHJlYWRsX3JlbGF4 ZWRfcG9sbF90aW1lb3V0KGdicGEsIHJlZywgIShyZWcgJiBHQlBBX1VQREFURSksCisJCQkJCSAg MSwgQVJNX1NNTVVfUE9MTF9USU1FT1VUX1VTKTsKK30KKworc3RhdGljIHZvaWQgYXJtX3NtbXVf ZnJlZV9tc2lzKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gZGF0YTsKKwlw bGF0Zm9ybV9tc2lfZG9tYWluX2ZyZWVfaXJxcyhkZXYpOworfQorCitzdGF0aWMgdm9pZCBhcm1f c21tdV93cml0ZV9tc2lfbXNnKHN0cnVjdCBtc2lfZGVzYyAqZGVzYywgc3RydWN0IG1zaV9tc2cg Km1zZykKK3sKKwlwaHlzX2FkZHJfdCBkb29yYmVsbDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBt c2lfZGVzY190b19kZXYoZGVzYyk7CisJc3RydWN0IGFybV9zbW11X2RldmljZSAqc21tdSA9IGRl dl9nZXRfZHJ2ZGF0YShkZXYpOworCXBoeXNfYWRkcl90ICpjZmcgPSBhcm1fc21tdV9tc2lfY2Zn W2Rlc2MtPnBsYXRmb3JtLm1zaV9pbmRleF07CisKKwlkb29yYmVsbCA9ICgoKHU2NCltc2ctPmFk ZHJlc3NfaGkpIDw8IDMyKSB8IG1zZy0+YWRkcmVzc19sbzsKKwlkb29yYmVsbCAmPSBNU0lfQ0ZH MF9BRERSX01BU0sgPDwgTVNJX0NGRzBfQUREUl9TSElGVDsKKworCXdyaXRlcV9yZWxheGVkKGRv b3JiZWxsLCBzbW11LT5iYXNlICsgY2ZnWzBdKTsKKwl3cml0ZWxfcmVsYXhlZChtc2ctPmRhdGEs IHNtbXUtPmJhc2UgKyBjZmdbMV0pOworCXdyaXRlbF9yZWxheGVkKE1TSV9DRkcyX01FTUFUVFJf REVWSUNFX25HblJFLCBzbW11LT5iYXNlICsgY2ZnWzJdKTsKK30KKworc3RhdGljIHZvaWQgYXJt X3NtbXVfc2V0dXBfbXNpcyhzdHJ1Y3QgYXJtX3NtbXVfZGV2aWNlICpzbW11KQoreworCXN0cnVj dCBtc2lfZGVzYyAqZGVzYzsKKwlpbnQgcmV0LCBudmVjID0gQVJNX1NNTVVfTUFYX01TSVM7CisJ c3RydWN0IGRldmljZSAqZGV2ID0gc21tdS0+ZGV2OworCisJLyogQ2xlYXIgdGhlIE1TSSBhZGRy ZXNzIHJlZ3MgKi8KKwl3cml0ZXFfcmVsYXhlZCgwLCBzbW11LT5iYXNlICsgQVJNX1NNTVVfR0VS Uk9SX0lSUV9DRkcwKTsKKwl3cml0ZXFfcmVsYXhlZCgwLCBzbW11LT5iYXNlICsgQVJNX1NNTVVf RVZUUV9JUlFfQ0ZHMCk7CisKKwlpZiAoc21tdS0+ZmVhdHVyZXMgJiBBUk1fU01NVV9GRUFUX1BS SSkKKwkJd3JpdGVxX3JlbGF4ZWQoMCwgc21tdS0+YmFzZSArIEFSTV9TTU1VX1BSSVFfSVJRX0NG RzApOworCWVsc2UKKwkJbnZlYy0tOworCisJaWYgKCEoc21tdS0+ZmVhdHVyZXMgJiBBUk1fU01N VV9GRUFUX01TSSkpCisJCXJldHVybjsKKworCS8qIEFsbG9jYXRlIE1TSXMgZm9yIGV2dHEsIGdl cnJvciBhbmQgcHJpcS4gSWdub3JlIGNtZHEgKi8KKwlyZXQgPSBwbGF0Zm9ybV9tc2lfZG9tYWlu X2FsbG9jX2lycXMoZGV2LCBudmVjLCBhcm1fc21tdV93cml0ZV9tc2lfbXNnKTsKKwlpZiAocmV0 KSB7CisJCWRldl93YXJuKGRldiwgImZhaWxlZCB0byBhbGxvY2F0ZSBNU0lzXG4iKTsKKwkJcmV0 dXJuOworCX0KKworCWZvcl9lYWNoX21zaV9lbnRyeShkZXNjLCBkZXYpIHsKKwkJc3dpdGNoIChk ZXNjLT5wbGF0Zm9ybS5tc2lfaW5kZXgpIHsKKwkJY2FzZSBFVlRRX01TSV9JTkRFWDoKKwkJCXNt bXUtPmV2dHEucS5pcnEgPSBkZXNjLT5pcnE7CisJCQlicmVhazsKKwkJY2FzZSBHRVJST1JfTVNJ X0lOREVYOgorCQkJc21tdS0+Z2Vycl9pcnEgPSBkZXNjLT5pcnE7CisJCQlicmVhazsKKwkJY2Fz ZSBQUklRX01TSV9JTkRFWDoKKwkJCXNtbXUtPnByaXEucS5pcnEgPSBkZXNjLT5pcnE7CisJCQli cmVhazsKKwkJZGVmYXVsdDoJLyogVW5rbm93biAqLworCQkJY29udGludWU7CisJCX0KKwl9CisK KwkvKiBBZGQgY2FsbGJhY2sgdG8gZnJlZSBNU0lzIG9uIHRlYXJkb3duICovCisJZGV2bV9hZGRf YWN0aW9uKGRldiwgYXJtX3NtbXVfZnJlZV9tc2lzLCBkZXYpOworfQorCitzdGF0aWMgdm9pZCBh cm1fc21tdV9zZXR1cF91bmlxdWVfaXJxcyhzdHJ1Y3QgYXJtX3NtbXVfZGV2aWNlICpzbW11KQor eworCWludCBpcnEsIHJldDsKKworCWFybV9zbW11X3NldHVwX21zaXMoc21tdSk7CisKKwkvKiBS ZXF1ZXN0IGludGVycnVwdCBsaW5lcyAqLworCWlycSA9IHNtbXUtPmV2dHEucS5pcnE7CisJaWYg KGlycSkgeworCQlyZXQgPSBkZXZtX3JlcXVlc3RfdGhyZWFkZWRfaXJxKHNtbXUtPmRldiwgaXJx LCBOVUxMLAorCQkJCQkJYXJtX3NtbXVfZXZ0cV90aHJlYWQsCisJCQkJCQlJUlFGX09ORVNIT1Qs CisJCQkJCQkiYXJtLXNtbXUtdjMtZXZ0cSIsIHNtbXUpOworCQlpZiAocmV0IDwgMCkKKwkJCWRl dl93YXJuKHNtbXUtPmRldiwgImZhaWxlZCB0byBlbmFibGUgZXZ0cSBpcnFcbiIpOworCX0KKwor CWlycSA9IHNtbXUtPmNtZHEucS5pcnE7CisJaWYgKGlycSkgeworCQlyZXQgPSBkZXZtX3JlcXVl c3RfaXJxKHNtbXUtPmRldiwgaXJxLAorCQkJCSAgICAgICBhcm1fc21tdV9jbWRxX3N5bmNfaGFu ZGxlciwgMCwKKwkJCQkgICAgICAgImFybS1zbW11LXYzLWNtZHEtc3luYyIsIHNtbXUpOworCQlp ZiAocmV0IDwgMCkKKwkJCWRldl93YXJuKHNtbXUtPmRldiwgImZhaWxlZCB0byBlbmFibGUgY21k cS1zeW5jIGlycVxuIik7CisJfQorCisJaXJxID0gc21tdS0+Z2Vycl9pcnE7CisJaWYgKGlycSkg eworCQlyZXQgPSBkZXZtX3JlcXVlc3RfaXJxKHNtbXUtPmRldiwgaXJxLCBhcm1fc21tdV9nZXJy b3JfaGFuZGxlciwKKwkJCQkgICAgICAgMCwgImFybS1zbW11LXYzLWdlcnJvciIsIHNtbXUpOwor CQlpZiAocmV0IDwgMCkKKwkJCWRldl93YXJuKHNtbXUtPmRldiwgImZhaWxlZCB0byBlbmFibGUg Z2Vycm9yIGlycVxuIik7CisJfQorCisJaWYgKHNtbXUtPmZlYXR1cmVzICYgQVJNX1NNTVVfRkVB VF9QUkkpIHsKKwkJaXJxID0gc21tdS0+cHJpcS5xLmlycTsKKwkJaWYgKGlycSkgeworCQkJcmV0 ID0gZGV2bV9yZXF1ZXN0X3RocmVhZGVkX2lycShzbW11LT5kZXYsIGlycSwgTlVMTCwKKwkJCQkJ CQlhcm1fc21tdV9wcmlxX3RocmVhZCwKKwkJCQkJCQlJUlFGX09ORVNIT1QsCisJCQkJCQkJImFy bS1zbW11LXYzLXByaXEiLAorCQkJCQkJCXNtbXUpOworCQkJaWYgKHJldCA8IDApCisJCQkJZGV2 X3dhcm4oc21tdS0+ZGV2LAorCQkJCQkgImZhaWxlZCB0byBlbmFibGUgcHJpcSBpcnFcbiIpOwor CQl9CisJfQorfQorCitzdGF0aWMgaW50IGFybV9zbW11X3NldHVwX2lycXMoc3RydWN0IGFybV9z bW11X2RldmljZSAqc21tdSkKK3sKKwlpbnQgcmV0LCBpcnE7CisJdTMyIGlycWVuX2ZsYWdzID0g SVJRX0NUUkxfRVZUUV9JUlFFTiB8IElSUV9DVFJMX0dFUlJPUl9JUlFFTjsKKworCS8qIERpc2Fi bGUgSVJRcyBmaXJzdCAqLworCXJldCA9IGFybV9zbW11X3dyaXRlX3JlZ19zeW5jKHNtbXUsIDAs IEFSTV9TTU1VX0lSUV9DVFJMLAorCQkJCSAgICAgIEFSTV9TTU1VX0lSUV9DVFJMQUNLKTsKKwlp ZiAocmV0KSB7CisJCWRldl9lcnIoc21tdS0+ZGV2LCAiZmFpbGVkIHRvIGRpc2FibGUgaXJxc1xu Iik7CisJCXJldHVybiByZXQ7CisJfQorCisJaXJxID0gc21tdS0+Y29tYmluZWRfaXJxOworCWlm IChpcnEpIHsKKwkJLyoKKwkJICogQ2F2aXVtIFRodW5kZXJYMiBpbXBsZW1lbnRhdGlvbiBkb2Vz bid0IG5vdCBzdXBwb3J0IHVuaXF1ZQorCQkgKiBpcnEgbGluZXMuIFVzZSBzaW5nbGUgaXJxIGxp bmUgZm9yIGFsbCB0aGUgU01NVXYzIGludGVycnVwdHMuCisJCSAqLworCQlyZXQgPSBkZXZtX3Jl cXVlc3RfdGhyZWFkZWRfaXJxKHNtbXUtPmRldiwgaXJxLAorCQkJCQlhcm1fc21tdV9jb21iaW5l ZF9pcnFfaGFuZGxlciwKKwkJCQkJYXJtX3NtbXVfY29tYmluZWRfaXJxX3RocmVhZCwKKwkJCQkJ SVJRRl9PTkVTSE9ULAorCQkJCQkiYXJtLXNtbXUtdjMtY29tYmluZWQtaXJxIiwgc21tdSk7CisJ CWlmIChyZXQgPCAwKQorCQkJZGV2X3dhcm4oc21tdS0+ZGV2LCAiZmFpbGVkIHRvIGVuYWJsZSBj b21iaW5lZCBpcnFcbiIpOworCX0gZWxzZQorCQlhcm1fc21tdV9zZXR1cF91bmlxdWVfaXJxcyhz bW11KTsKKworCWlmIChzbW11LT5mZWF0dXJlcyAmIEFSTV9TTU1VX0ZFQVRfUFJJKQorCQlpcnFl bl9mbGFncyB8PSBJUlFfQ1RSTF9QUklRX0lSUUVOOworCisJLyogRW5hYmxlIGludGVycnVwdCBn ZW5lcmF0aW9uIG9uIHRoZSBTTU1VICovCisJcmV0ID0gYXJtX3NtbXVfd3JpdGVfcmVnX3N5bmMo c21tdSwgaXJxZW5fZmxhZ3MsCisJCQkJICAgICAgQVJNX1NNTVVfSVJRX0NUUkwsIEFSTV9TTU1V X0lSUV9DVFJMQUNLKTsKKwlpZiAocmV0KQorCQlkZXZfd2FybihzbW11LT5kZXYsICJmYWlsZWQg dG8gZW5hYmxlIGlycXNcbiIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXJtX3Nt bXVfZGV2aWNlX2Rpc2FibGUoc3RydWN0IGFybV9zbW11X2RldmljZSAqc21tdSkKK3sKKwlpbnQg cmV0OworCisJcmV0ID0gYXJtX3NtbXVfd3JpdGVfcmVnX3N5bmMoc21tdSwgMCwgQVJNX1NNTVVf Q1IwLCBBUk1fU01NVV9DUjBBQ0spOworCWlmIChyZXQpCisJCWRldl9lcnIoc21tdS0+ZGV2LCAi ZmFpbGVkIHRvIGNsZWFyIGNyMFxuIik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50 IGFybV9zbW11X2RldmljZV9yZXNldChzdHJ1Y3QgYXJtX3NtbXVfZGV2aWNlICpzbW11LCBib29s IGJ5cGFzcykKK3sKKwlpbnQgcmV0OworCXUzMiByZWcsIGVuYWJsZXM7CisJc3RydWN0IGFybV9z bW11X2NtZHFfZW50IGNtZDsKKworCS8qIENsZWFyIENSMCBhbmQgc3luYyAoZGlzYWJsZXMgU01N VSBhbmQgcXVldWUgcHJvY2Vzc2luZykgKi8KKwlyZWcgPSByZWFkbF9yZWxheGVkKHNtbXUtPmJh c2UgKyBBUk1fU01NVV9DUjApOworCWlmIChyZWcgJiBDUjBfU01NVUVOKQorCQlkZXZfd2Fybihz bW11LT5kZXYsICJTTU1VIGN1cnJlbnRseSBlbmFibGVkISBSZXNldHRpbmcuLi5cbiIpOworCisJ cmV0ID0gYXJtX3NtbXVfZGV2aWNlX2Rpc2FibGUoc21tdSk7CisJaWYgKHJldCkKKwkJcmV0dXJu IHJldDsKKworCS8qIENSMSAodGFibGUgYW5kIHF1ZXVlIG1lbW9yeSBhdHRyaWJ1dGVzKSAqLwor CXJlZyA9IChDUjFfU0hfSVNIIDw8IENSMV9UQUJMRV9TSF9TSElGVCkgfAorCSAgICAgIChDUjFf Q0FDSEVfV0IgPDwgQ1IxX1RBQkxFX09DX1NISUZUKSB8CisJICAgICAgKENSMV9DQUNIRV9XQiA8 PCBDUjFfVEFCTEVfSUNfU0hJRlQpIHwKKwkgICAgICAoQ1IxX1NIX0lTSCA8PCBDUjFfUVVFVUVf U0hfU0hJRlQpIHwKKwkgICAgICAoQ1IxX0NBQ0hFX1dCIDw8IENSMV9RVUVVRV9PQ19TSElGVCkg fAorCSAgICAgIChDUjFfQ0FDSEVfV0IgPDwgQ1IxX1FVRVVFX0lDX1NISUZUKTsKKwl3cml0ZWxf cmVsYXhlZChyZWcsIHNtbXUtPmJhc2UgKyBBUk1fU01NVV9DUjEpOworCisJLyogQ1IyIChyYW5k b20gY3JhcCkgKi8KKwlyZWcgPSBDUjJfUFRNIHwgQ1IyX1JFQ0lOVlNJRCB8IENSMl9FMkg7CisJ d3JpdGVsX3JlbGF4ZWQocmVnLCBzbW11LT5iYXNlICsgQVJNX1NNTVVfQ1IyKTsKKworCS8qIFN0 cmVhbSB0YWJsZSAqLworCXdyaXRlcV9yZWxheGVkKHNtbXUtPnN0cnRhYl9jZmcuc3RydGFiX2Jh c2UsCisJCSAgICAgICBzbW11LT5iYXNlICsgQVJNX1NNTVVfU1RSVEFCX0JBU0UpOworCXdyaXRl bF9yZWxheGVkKHNtbXUtPnN0cnRhYl9jZmcuc3RydGFiX2Jhc2VfY2ZnLAorCQkgICAgICAgc21t dS0+YmFzZSArIEFSTV9TTU1VX1NUUlRBQl9CQVNFX0NGRyk7CisKKwkvKiBDb21tYW5kIHF1ZXVl ICovCisJd3JpdGVxX3JlbGF4ZWQoc21tdS0+Y21kcS5xLnFfYmFzZSwgc21tdS0+YmFzZSArIEFS TV9TTU1VX0NNRFFfQkFTRSk7CisJd3JpdGVsX3JlbGF4ZWQoc21tdS0+Y21kcS5xLnByb2QsIHNt bXUtPmJhc2UgKyBBUk1fU01NVV9DTURRX1BST0QpOworCXdyaXRlbF9yZWxheGVkKHNtbXUtPmNt ZHEucS5jb25zLCBzbW11LT5iYXNlICsgQVJNX1NNTVVfQ01EUV9DT05TKTsKKworCWVuYWJsZXMg PSBDUjBfQ01EUUVOOworCXJldCA9IGFybV9zbW11X3dyaXRlX3JlZ19zeW5jKHNtbXUsIGVuYWJs ZXMsIEFSTV9TTU1VX0NSMCwKKwkJCQkgICAgICBBUk1fU01NVV9DUjBBQ0spOworCWlmIChyZXQp IHsKKwkJZGV2X2VycihzbW11LT5kZXYsICJmYWlsZWQgdG8gZW5hYmxlIGNvbW1hbmQgcXVldWVc biIpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIEludmFsaWRhdGUgYW55IGNhY2hlZCBjb25m aWd1cmF0aW9uICovCisJY21kLm9wY29kZSA9IENNRFFfT1BfQ0ZHSV9BTEw7CisJYXJtX3NtbXVf Y21kcV9pc3N1ZV9jbWQoc21tdSwgJmNtZCk7CisJY21kLm9wY29kZSA9IENNRFFfT1BfQ01EX1NZ TkM7CisJYXJtX3NtbXVfY21kcV9pc3N1ZV9jbWQoc21tdSwgJmNtZCk7CisKKwkvKiBJbnZhbGlk YXRlIGFueSBzdGFsZSBUTEIgZW50cmllcyAqLworCWlmIChzbW11LT5mZWF0dXJlcyAmIEFSTV9T TU1VX0ZFQVRfSFlQKSB7CisJCWNtZC5vcGNvZGUgPSBDTURRX09QX1RMQklfRUwyX0FMTDsKKwkJ YXJtX3NtbXVfY21kcV9pc3N1ZV9jbWQoc21tdSwgJmNtZCk7CisJfQorCisJY21kLm9wY29kZSA9 IENNRFFfT1BfVExCSV9OU05IX0FMTDsKKwlhcm1fc21tdV9jbWRxX2lzc3VlX2NtZChzbW11LCAm Y21kKTsKKwljbWQub3Bjb2RlID0gQ01EUV9PUF9DTURfU1lOQzsKKwlhcm1fc21tdV9jbWRxX2lz c3VlX2NtZChzbW11LCAmY21kKTsKKworCS8qIEV2ZW50IHF1ZXVlICovCisJd3JpdGVxX3JlbGF4 ZWQoc21tdS0+ZXZ0cS5xLnFfYmFzZSwgc21tdS0+YmFzZSArIEFSTV9TTU1VX0VWVFFfQkFTRSk7 CisJd3JpdGVsX3JlbGF4ZWQoc21tdS0+ZXZ0cS5xLnByb2QsCisJCSAgICAgICBhcm1fc21tdV9w YWdlMV9maXh1cChBUk1fU01NVV9FVlRRX1BST0QsIHNtbXUpKTsKKwl3cml0ZWxfcmVsYXhlZChz bW11LT5ldnRxLnEuY29ucywKKwkJICAgICAgIGFybV9zbW11X3BhZ2UxX2ZpeHVwKEFSTV9TTU1V X0VWVFFfQ09OUywgc21tdSkpOworCisJZW5hYmxlcyB8PSBDUjBfRVZUUUVOOworCXJldCA9IGFy bV9zbW11X3dyaXRlX3JlZ19zeW5jKHNtbXUsIGVuYWJsZXMsIEFSTV9TTU1VX0NSMCwKKwkJCQkg ICAgICBBUk1fU01NVV9DUjBBQ0spOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihzbW11LT5kZXYs ICJmYWlsZWQgdG8gZW5hYmxlIGV2ZW50IHF1ZXVlXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisK KwkvKiBQUkkgcXVldWUgKi8KKwlpZiAoc21tdS0+ZmVhdHVyZXMgJiBBUk1fU01NVV9GRUFUX1BS SSkgeworCQl3cml0ZXFfcmVsYXhlZChzbW11LT5wcmlxLnEucV9iYXNlLAorCQkJICAgICAgIHNt bXUtPmJhc2UgKyBBUk1fU01NVV9QUklRX0JBU0UpOworCQl3cml0ZWxfcmVsYXhlZChzbW11LT5w cmlxLnEucHJvZCwKKwkJCSAgICAgICBhcm1fc21tdV9wYWdlMV9maXh1cChBUk1fU01NVV9QUklR X1BST0QsIHNtbXUpKTsKKwkJd3JpdGVsX3JlbGF4ZWQoc21tdS0+cHJpcS5xLmNvbnMsCisJCQkg ICAgICAgYXJtX3NtbXVfcGFnZTFfZml4dXAoQVJNX1NNTVVfUFJJUV9DT05TLCBzbW11KSk7CisK KwkJZW5hYmxlcyB8PSBDUjBfUFJJUUVOOworCQlyZXQgPSBhcm1fc21tdV93cml0ZV9yZWdfc3lu YyhzbW11LCBlbmFibGVzLCBBUk1fU01NVV9DUjAsCisJCQkJCSAgICAgIEFSTV9TTU1VX0NSMEFD Syk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoc21tdS0+ZGV2LCAiZmFpbGVkIHRvIGVuYWJs ZSBQUkkgcXVldWVcbiIpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCXJldCA9IGFybV9z bW11X3NldHVwX2lycXMoc21tdSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKHNtbXUtPmRldiwg ImZhaWxlZCB0byBzZXR1cCBpcnFzXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKworCS8qIEVu YWJsZSB0aGUgU01NVSBpbnRlcmZhY2UsIG9yIGVuc3VyZSBieXBhc3MgKi8KKwlpZiAoIWJ5cGFz cyB8fCBkaXNhYmxlX2J5cGFzcykgeworCQllbmFibGVzIHw9IENSMF9TTU1VRU47CisJfSBlbHNl IHsKKwkJcmV0ID0gYXJtX3NtbXVfdXBkYXRlX2dicGEoc21tdSwgMCwgR0JQQV9BQk9SVCk7CisJ CWlmIChyZXQpIHsKKwkJCWRldl9lcnIoc21tdS0+ZGV2LCAiR0JQQSBub3QgcmVzcG9uZGluZyB0 byB1cGRhdGVcbiIpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKwlyZXQgPSBhcm1fc21tdV93 cml0ZV9yZWdfc3luYyhzbW11LCBlbmFibGVzLCBBUk1fU01NVV9DUjAsCisJCQkJICAgICAgQVJN X1NNTVVfQ1IwQUNLKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoc21tdS0+ZGV2LCAiZmFpbGVk IHRvIGVuYWJsZSBTTU1VIGludGVyZmFjZVxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0 dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXJtX3NtbXVfZGV2aWNlX2h3X3Byb2JlKHN0cnVjdCBh cm1fc21tdV9kZXZpY2UgKnNtbXUpCit7CisJdTMyIHJlZzsKKwlib29sIGNvaGVyZW50ID0gc21t dS0+ZmVhdHVyZXMgJiBBUk1fU01NVV9GRUFUX0NPSEVSRU5DWTsKKworCS8qIElEUjAgKi8KKwly ZWcgPSByZWFkbF9yZWxheGVkKHNtbXUtPmJhc2UgKyBBUk1fU01NVV9JRFIwKTsKKworCS8qIDIt bGV2ZWwgc3RydWN0dXJlcyAqLworCWlmICgocmVnICYgSURSMF9TVF9MVkxfTUFTSyA8PCBJRFIw X1NUX0xWTF9TSElGVCkgPT0gSURSMF9TVF9MVkxfMkxWTCkKKwkJc21tdS0+ZmVhdHVyZXMgfD0g QVJNX1NNTVVfRkVBVF8yX0xWTF9TVFJUQUI7CisKKwlpZiAocmVnICYgSURSMF9DRDJMKQorCQlz bW11LT5mZWF0dXJlcyB8PSBBUk1fU01NVV9GRUFUXzJfTFZMX0NEVEFCOworCisJLyoKKwkgKiBU cmFuc2xhdGlvbiB0YWJsZSBlbmRpYW5uZXNzLgorCSAqIFdlIGN1cnJlbnRseSByZXF1aXJlIHRo ZSBzYW1lIGVuZGlhbm5lc3MgYXMgdGhlIENQVSwgYnV0IHRoaXMKKwkgKiBjb3VsZCBiZSBjaGFu Z2VkIGxhdGVyIGJ5IGFkZGluZyBhIG5ldyBJT19QR1RBQkxFX1FVSVJLLgorCSAqLworCXN3aXRj aCAocmVnICYgSURSMF9UVEVORElBTl9NQVNLIDw8IElEUjBfVFRFTkRJQU5fU0hJRlQpIHsKKwlj YXNlIElEUjBfVFRFTkRJQU5fTUlYRUQ6CisJCXNtbXUtPmZlYXR1cmVzIHw9IEFSTV9TTU1VX0ZF QVRfVFRfTEUgfCBBUk1fU01NVV9GRUFUX1RUX0JFOworCQlicmVhazsKKyNpZmRlZiBfX0JJR19F TkRJQU4KKwljYXNlIElEUjBfVFRFTkRJQU5fQkU6CisJCXNtbXUtPmZlYXR1cmVzIHw9IEFSTV9T TU1VX0ZFQVRfVFRfQkU7CisJCWJyZWFrOworI2Vsc2UKKwljYXNlIElEUjBfVFRFTkRJQU5fTEU6 CisJCXNtbXUtPmZlYXR1cmVzIHw9IEFSTV9TTU1VX0ZFQVRfVFRfTEU7CisJCWJyZWFrOworI2Vu ZGlmCisJZGVmYXVsdDoKKwkJZGV2X2VycihzbW11LT5kZXYsICJ1bmtub3duL3Vuc3VwcG9ydGVk IFRUIGVuZGlhbm5lc3MhXG4iKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwkvKiBCb29sZWFu IGZlYXR1cmUgZmxhZ3MgKi8KKwlpZiAoSVNfRU5BQkxFRChDT05GSUdfUENJX1BSSSkgJiYgcmVn ICYgSURSMF9QUkkpCisJCXNtbXUtPmZlYXR1cmVzIHw9IEFSTV9TTU1VX0ZFQVRfUFJJOworCisJ aWYgKElTX0VOQUJMRUQoQ09ORklHX1BDSV9BVFMpICYmIHJlZyAmIElEUjBfQVRTKQorCQlzbW11 LT5mZWF0dXJlcyB8PSBBUk1fU01NVV9GRUFUX0FUUzsKKworCWlmIChyZWcgJiBJRFIwX1NFVikK KwkJc21tdS0+ZmVhdHVyZXMgfD0gQVJNX1NNTVVfRkVBVF9TRVY7CisKKwlpZiAocmVnICYgSURS MF9NU0kpCisJCXNtbXUtPmZlYXR1cmVzIHw9IEFSTV9TTU1VX0ZFQVRfTVNJOworCisJaWYgKHJl ZyAmIElEUjBfSFlQKQorCQlzbW11LT5mZWF0dXJlcyB8PSBBUk1fU01NVV9GRUFUX0hZUDsKKwor CS8qCisJICogVGhlIGNvaGVyZW5jeSBmZWF0dXJlIGFzIHNldCBieSBGVyBpcyB1c2VkIGluIHBy ZWZlcmVuY2UgdG8gdGhlIElECisJICogcmVnaXN0ZXIsIGJ1dCB3YXJuIG9uIG1pc21hdGNoLgor CSAqLworCWlmICghIShyZWcgJiBJRFIwX0NPSEFDQykgIT0gY29oZXJlbnQpCisJCWRldl93YXJu KHNtbXUtPmRldiwgIklEUjAuQ09IQUNDIG92ZXJyaWRkZW4gYnkgZG1hLWNvaGVyZW50IHByb3Bl cnR5ICglcylcbiIsCisJCQkgY29oZXJlbnQgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKworCXN3aXRj aCAocmVnICYgSURSMF9TVEFMTF9NT0RFTF9NQVNLIDw8IElEUjBfU1RBTExfTU9ERUxfU0hJRlQp IHsKKwljYXNlIElEUjBfU1RBTExfTU9ERUxfU1RBTEw6CisJCS8qIEZhbGx0aHJvdWdoICovCisJ Y2FzZSBJRFIwX1NUQUxMX01PREVMX0ZPUkNFOgorCQlzbW11LT5mZWF0dXJlcyB8PSBBUk1fU01N VV9GRUFUX1NUQUxMUzsKKwl9CisKKwlpZiAocmVnICYgSURSMF9TMVApCisJCXNtbXUtPmZlYXR1 cmVzIHw9IEFSTV9TTU1VX0ZFQVRfVFJBTlNfUzE7CisKKwlpZiAocmVnICYgSURSMF9TMlApCisJ CXNtbXUtPmZlYXR1cmVzIHw9IEFSTV9TTU1VX0ZFQVRfVFJBTlNfUzI7CisKKwlpZiAoIShyZWcg JiAoSURSMF9TMVAgfCBJRFIwX1MyUCkpKSB7CisJCWRldl9lcnIoc21tdS0+ZGV2LCAibm8gdHJh bnNsYXRpb24gc3VwcG9ydCFcbiIpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCS8qIFdlIG9u bHkgc3VwcG9ydCB0aGUgQUFyY2g2NCB0YWJsZSBmb3JtYXQgYXQgcHJlc2VudCAqLworCXN3aXRj aCAocmVnICYgSURSMF9UVEZfTUFTSyA8PCBJRFIwX1RURl9TSElGVCkgeworCWNhc2UgSURSMF9U VEZfQUFSQ0gzMl82NDoKKwkJc21tdS0+aWFzID0gNDA7CisJCS8qIEZhbGx0aHJvdWdoICovCisJ Y2FzZSBJRFIwX1RURl9BQVJDSDY0OgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKHNt bXUtPmRldiwgIkFBcmNoNjQgdGFibGUgZm9ybWF0IG5vdCBzdXBwb3J0ZWQhXG4iKTsKKwkJcmV0 dXJuIC1FTlhJTzsKKwl9CisKKwkvKiBBU0lEL1ZNSUQgc2l6ZXMgKi8KKwlzbW11LT5hc2lkX2Jp dHMgPSByZWcgJiBJRFIwX0FTSUQxNiA/IDE2IDogODsKKwlzbW11LT52bWlkX2JpdHMgPSByZWcg JiBJRFIwX1ZNSUQxNiA/IDE2IDogODsKKworCS8qIElEUjEgKi8KKwlyZWcgPSByZWFkbF9yZWxh eGVkKHNtbXUtPmJhc2UgKyBBUk1fU01NVV9JRFIxKTsKKwlpZiAocmVnICYgKElEUjFfVEFCTEVT X1BSRVNFVCB8IElEUjFfUVVFVUVTX1BSRVNFVCB8IElEUjFfUkVMKSkgeworCQlkZXZfZXJyKHNt bXUtPmRldiwgImVtYmVkZGVkIGltcGxlbWVudGF0aW9uIG5vdCBzdXBwb3J0ZWRcbiIpOworCQly ZXR1cm4gLUVOWElPOworCX0KKworCS8qIFF1ZXVlIHNpemVzLCBjYXBwZWQgYXQgNGsgKi8KKwlz bW11LT5jbWRxLnEubWF4X25fc2hpZnQgPSBtaW4oKHUzMilDTURRX01BWF9TWl9TSElGVCwKKwkJ CQkgICAgICAgcmVnID4+IElEUjFfQ01EUV9TSElGVCAmIElEUjFfQ01EUV9NQVNLKTsKKwlpZiAo IXNtbXUtPmNtZHEucS5tYXhfbl9zaGlmdCkgeworCQkvKiBPZGQgYWxpZ25tZW50IHJlc3RyaWN0 aW9ucyBvbiB0aGUgYmFzZSwgc28gaWdub3JlIGZvciBub3cgKi8KKwkJZGV2X2VycihzbW11LT5k ZXYsICJ1bml0LWxlbmd0aCBjb21tYW5kIHF1ZXVlIG5vdCBzdXBwb3J0ZWRcbiIpOworCQlyZXR1 cm4gLUVOWElPOworCX0KKworCXNtbXUtPmV2dHEucS5tYXhfbl9zaGlmdCA9IG1pbigodTMyKUVW VFFfTUFYX1NaX1NISUZULAorCQkJCSAgICAgICByZWcgPj4gSURSMV9FVlRRX1NISUZUICYgSURS MV9FVlRRX01BU0spOworCXNtbXUtPnByaXEucS5tYXhfbl9zaGlmdCA9IG1pbigodTMyKVBSSVFf TUFYX1NaX1NISUZULAorCQkJCSAgICAgICByZWcgPj4gSURSMV9QUklRX1NISUZUICYgSURSMV9Q UklRX01BU0spOworCisJLyogU0lEL1NTSUQgc2l6ZXMgKi8KKwlzbW11LT5zc2lkX2JpdHMgPSBy ZWcgPj4gSURSMV9TU0lEX1NISUZUICYgSURSMV9TU0lEX01BU0s7CisJc21tdS0+c2lkX2JpdHMg PSByZWcgPj4gSURSMV9TSURfU0hJRlQgJiBJRFIxX1NJRF9NQVNLOworCisJLyoKKwkgKiBJZiB0 aGUgU01NVSBzdXBwb3J0cyBmZXdlciBiaXRzIHRoYW4gd291bGQgZmlsbCBhIHNpbmdsZSBMMiBz dHJlYW0KKwkgKiB0YWJsZSwgdXNlIGEgbGluZWFyIHRhYmxlIGluc3RlYWQuCisJICovCisJaWYg KHNtbXUtPnNpZF9iaXRzIDw9IFNUUlRBQl9TUExJVCkKKwkJc21tdS0+ZmVhdHVyZXMgJj0gfkFS TV9TTU1VX0ZFQVRfMl9MVkxfU1RSVEFCOworCisJLyogSURSNSAqLworCXJlZyA9IHJlYWRsX3Jl bGF4ZWQoc21tdS0+YmFzZSArIEFSTV9TTU1VX0lEUjUpOworCisJLyogTWF4aW11bSBudW1iZXIg b2Ygb3V0c3RhbmRpbmcgc3RhbGxzICovCisJc21tdS0+ZXZ0cS5tYXhfc3RhbGxzID0gcmVnID4+ IElEUjVfU1RBTExfTUFYX1NISUZUCisJCQkJJiBJRFI1X1NUQUxMX01BWF9NQVNLOworCisJLyog UGFnZSBzaXplcyAqLworCWlmIChyZWcgJiBJRFI1X0dSQU42NEspCisJCXNtbXUtPnBnc2l6ZV9i aXRtYXAgfD0gU1pfNjRLIHwgU1pfNTEyTTsKKwlpZiAocmVnICYgSURSNV9HUkFOMTZLKQorCQlz bW11LT5wZ3NpemVfYml0bWFwIHw9IFNaXzE2SyB8IFNaXzMyTTsKKwlpZiAocmVnICYgSURSNV9H UkFONEspCisJCXNtbXUtPnBnc2l6ZV9iaXRtYXAgfD0gU1pfNEsgfCBTWl8yTSB8IFNaXzFHOwor CisJaWYgKGFybV9zbW11X29wcy5wZ3NpemVfYml0bWFwID09IC0xVUwpCisJCWFybV9zbW11X29w cy5wZ3NpemVfYml0bWFwID0gc21tdS0+cGdzaXplX2JpdG1hcDsKKwllbHNlCisJCWFybV9zbW11 X29wcy5wZ3NpemVfYml0bWFwIHw9IHNtbXUtPnBnc2l6ZV9iaXRtYXA7CisKKwkvKiBPdXRwdXQg YWRkcmVzcyBzaXplICovCisJc3dpdGNoIChyZWcgJiBJRFI1X09BU19NQVNLIDw8IElEUjVfT0FT X1NISUZUKSB7CisJY2FzZSBJRFI1X09BU18zMl9CSVQ6CisJCXNtbXUtPm9hcyA9IDMyOworCQli cmVhazsKKwljYXNlIElEUjVfT0FTXzM2X0JJVDoKKwkJc21tdS0+b2FzID0gMzY7CisJCWJyZWFr OworCWNhc2UgSURSNV9PQVNfNDBfQklUOgorCQlzbW11LT5vYXMgPSA0MDsKKwkJYnJlYWs7CisJ Y2FzZSBJRFI1X09BU180Ml9CSVQ6CisJCXNtbXUtPm9hcyA9IDQyOworCQlicmVhazsKKwljYXNl IElEUjVfT0FTXzQ0X0JJVDoKKwkJc21tdS0+b2FzID0gNDQ7CisJCWJyZWFrOworCWRlZmF1bHQ6 CisJCWRldl9pbmZvKHNtbXUtPmRldiwKKwkJCSJ1bmtub3duIG91dHB1dCBhZGRyZXNzIHNpemUu IFRydW5jYXRpbmcgdG8gNDgtYml0XG4iKTsKKwkJLyogRmFsbHRocm91Z2ggKi8KKwljYXNlIElE UjVfT0FTXzQ4X0JJVDoKKwkJc21tdS0+b2FzID0gNDg7CisJfQorCisJLyogU2V0IHRoZSBETUEg bWFzayBmb3Igb3VyIHRhYmxlIHdhbGtlciAqLworCWlmIChkbWFfc2V0X21hc2tfYW5kX2NvaGVy ZW50KHNtbXUtPmRldiwgRE1BX0JJVF9NQVNLKHNtbXUtPm9hcykpKQorCQlkZXZfd2FybihzbW11 LT5kZXYsCisJCQkgImZhaWxlZCB0byBzZXQgRE1BIG1hc2sgZm9yIHRhYmxlIHdhbGtlclxuIik7 CisKKwlzbW11LT5pYXMgPSBtYXgoc21tdS0+aWFzLCBzbW11LT5vYXMpOworCisJZGV2X2luZm8o c21tdS0+ZGV2LCAiaWFzICVsdS1iaXQsIG9hcyAlbHUtYml0IChmZWF0dXJlcyAweCUwOHgpXG4i LAorCQkgc21tdS0+aWFzLCBzbW11LT5vYXMsIHNtbXUtPmZlYXR1cmVzKTsKKwlyZXR1cm4gMDsK K30KKworI2lmZGVmIENPTkZJR19BQ1BJCitzdGF0aWMgdm9pZCBhY3BpX3NtbXVfZ2V0X29wdGlv bnModTMyIG1vZGVsLCBzdHJ1Y3QgYXJtX3NtbXVfZGV2aWNlICpzbW11KQoreworCXN3aXRjaCAo bW9kZWwpIHsKKwljYXNlIEFDUElfSU9SVF9TTU1VX1YzX0NBVklVTV9DTjk5WFg6CisJCXNtbXUt Pm9wdGlvbnMgfD0gQVJNX1NNTVVfT1BUX1BBR0UwX1JFR1NfT05MWTsKKwkJYnJlYWs7CisJY2Fz ZSBBQ1BJX0lPUlRfU01NVV9ISVNJTElDT05fSEkxNjFYOgorCQlzbW11LT5vcHRpb25zIHw9IEFS TV9TTU1VX09QVF9TS0lQX1BSRUZFVENIOworCQlicmVhazsKKwl9CisKKwlkZXZfbm90aWNlKHNt bXUtPmRldiwgIm9wdGlvbiBtYXNrIDB4JXhcbiIsIHNtbXUtPm9wdGlvbnMpOworfQorCitzdGF0 aWMgaW50IGFybV9zbW11X2RldmljZV9hY3BpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ug KnBkZXYsCisJCQkJICAgICAgc3RydWN0IGFybV9zbW11X2RldmljZSAqc21tdSkKK3sKKwlzdHJ1 Y3QgYWNwaV9pb3J0X3NtbXVfdjMgKmlvcnRfc21tdTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBz bW11LT5kZXY7CisJc3RydWN0IGFjcGlfaW9ydF9ub2RlICpub2RlOworCisJbm9kZSA9ICooc3Ry dWN0IGFjcGlfaW9ydF9ub2RlICoqKWRldl9nZXRfcGxhdGRhdGEoZGV2KTsKKworCS8qIFJldHJp ZXZlIFNNTVV2MyBzcGVjaWZpYyBkYXRhICovCisJaW9ydF9zbW11ID0gKHN0cnVjdCBhY3BpX2lv cnRfc21tdV92MyAqKW5vZGUtPm5vZGVfZGF0YTsKKworCWFjcGlfc21tdV9nZXRfb3B0aW9ucyhp b3J0X3NtbXUtPm1vZGVsLCBzbW11KTsKKworCWlmIChpb3J0X3NtbXUtPmZsYWdzICYgQUNQSV9J T1JUX1NNTVVfVjNfQ09IQUNDX09WRVJSSURFKQorCQlzbW11LT5mZWF0dXJlcyB8PSBBUk1fU01N VV9GRUFUX0NPSEVSRU5DWTsKKworCXJldHVybiAwOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUg aW50IGFybV9zbW11X2RldmljZV9hY3BpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBk ZXYsCisJCQkJCSAgICAgc3RydWN0IGFybV9zbW11X2RldmljZSAqc21tdSkKK3sKKwlyZXR1cm4g LUVOT0RFVjsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IGFybV9zbW11X2RldmljZV9kdF9wcm9i ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCQkJCSAgICBzdHJ1Y3QgYXJtX3NtbXVf ZGV2aWNlICpzbW11KQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CisJdTMy IGNlbGxzOworCWludCByZXQgPSAtRUlOVkFMOworCisJaWYgKG9mX3Byb3BlcnR5X3JlYWRfdTMy KGRldi0+b2Zfbm9kZSwgIiNpb21tdS1jZWxscyIsICZjZWxscykpCisJCWRldl9lcnIoZGV2LCAi bWlzc2luZyAjaW9tbXUtY2VsbHMgcHJvcGVydHlcbiIpOworCWVsc2UgaWYgKGNlbGxzICE9IDEp CisJCWRldl9lcnIoZGV2LCAiaW52YWxpZCAjaW9tbXUtY2VsbHMgdmFsdWUgKCVkKVxuIiwgY2Vs bHMpOworCWVsc2UKKwkJcmV0ID0gMDsKKworCXBhcnNlX2RyaXZlcl9vcHRpb25zKHNtbXUpOwor CisJaWYgKG9mX2RtYV9pc19jb2hlcmVudChkZXYtPm9mX25vZGUpKQorCQlzbW11LT5mZWF0dXJl cyB8PSBBUk1fU01NVV9GRUFUX0NPSEVSRU5DWTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRp YyB1bnNpZ25lZCBsb25nIGFybV9zbW11X3Jlc291cmNlX3NpemUoc3RydWN0IGFybV9zbW11X2Rl dmljZSAqc21tdSkKK3sKKwlpZiAoc21tdS0+b3B0aW9ucyAmIEFSTV9TTU1VX09QVF9QQUdFMF9S RUdTX09OTFkpCisJCXJldHVybiBTWl82NEs7CisJZWxzZQorCQlyZXR1cm4gU1pfMTI4SzsKK30K Kworc3RhdGljIGludCBhcm1fc21tdV9kZXZpY2VfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2Rldmlj ZSAqcGRldikKK3sKKwlpbnQgaXJxLCByZXQ7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJcmVz b3VyY2Vfc2l6ZV90IGlvYWRkcjsKKwlzdHJ1Y3QgYXJtX3NtbXVfZGV2aWNlICpzbW11OworCXN0 cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CisJYm9vbCBieXBhc3M7CisKKwlzbW11ID0g ZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpzbW11KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzbW11 KSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGFsbG9jYXRlIGFybV9zbW11X2RldmljZVxu Iik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlzbW11LT5kZXYgPSBkZXY7CisKKwlpZiAoZGV2 LT5vZl9ub2RlKSB7CisJCXJldCA9IGFybV9zbW11X2RldmljZV9kdF9wcm9iZShwZGV2LCBzbW11 KTsKKwl9IGVsc2UgeworCQlyZXQgPSBhcm1fc21tdV9kZXZpY2VfYWNwaV9wcm9iZShwZGV2LCBz bW11KTsKKwkJaWYgKHJldCA9PSAtRU5PREVWKQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBT ZXQgYnlwYXNzIG1vZGUgYWNjb3JkaW5nIHRvIGZpcm13YXJlIHByb2JpbmcgcmVzdWx0ICovCisJ YnlwYXNzID0gISFyZXQ7CisKKwkvKiBCYXNlIGFkZHJlc3MgKi8KKwlyZXMgPSBwbGF0Zm9ybV9n ZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmIChyZXNvdXJjZV9zaXpl KHJlcykgKyAxIDwgYXJtX3NtbXVfcmVzb3VyY2Vfc2l6ZShzbW11KSkgeworCQlkZXZfZXJyKGRl diwgIk1NSU8gcmVnaW9uIHRvbyBzbWFsbCAoJXByKVxuIiwgcmVzKTsKKwkJcmV0dXJuIC1FSU5W QUw7CisJfQorCWlvYWRkciA9IHJlcy0+c3RhcnQ7CisKKwlzbW11LT5iYXNlID0gZGV2bV9pb3Jl bWFwX3Jlc291cmNlKGRldiwgcmVzKTsKKwlpZiAoSVNfRVJSKHNtbXUtPmJhc2UpKQorCQlyZXR1 cm4gUFRSX0VSUihzbW11LT5iYXNlKTsKKworCS8qIEludGVycnVwdCBsaW5lcyAqLworCisJaXJx ID0gcGxhdGZvcm1fZ2V0X2lycV9ieW5hbWUocGRldiwgImNvbWJpbmVkIik7CisJaWYgKGlycSA+ IDApCisJCXNtbXUtPmNvbWJpbmVkX2lycSA9IGlycTsKKwllbHNlIHsKKwkJaXJxID0gcGxhdGZv cm1fZ2V0X2lycV9ieW5hbWUocGRldiwgImV2ZW50cSIpOworCQlpZiAoaXJxID4gMCkKKwkJCXNt bXUtPmV2dHEucS5pcnEgPSBpcnE7CisKKwkJaXJxID0gcGxhdGZvcm1fZ2V0X2lycV9ieW5hbWUo cGRldiwgInByaXEiKTsKKwkJaWYgKGlycSA+IDApCisJCQlzbW11LT5wcmlxLnEuaXJxID0gaXJx OworCisJCWlycSA9IHBsYXRmb3JtX2dldF9pcnFfYnluYW1lKHBkZXYsICJjbWRxLXN5bmMiKTsK KwkJaWYgKGlycSA+IDApCisJCQlzbW11LT5jbWRxLnEuaXJxID0gaXJxOworCisJCWlycSA9IHBs YXRmb3JtX2dldF9pcnFfYnluYW1lKHBkZXYsICJnZXJyb3IiKTsKKwkJaWYgKGlycSA+IDApCisJ CQlzbW11LT5nZXJyX2lycSA9IGlycTsKKwl9CisJLyogUHJvYmUgdGhlIGgvdyAqLworCXJldCA9 IGFybV9zbW11X2RldmljZV9od19wcm9iZShzbW11KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0 OworCisJLyogSW5pdGlhbGlzZSBpbi1tZW1vcnkgZGF0YSBzdHJ1Y3R1cmVzICovCisJcmV0ID0g YXJtX3NtbXVfaW5pdF9zdHJ1Y3R1cmVzKHNtbXUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7 CisKKwkvKiBSZWNvcmQgb3VyIHByaXZhdGUgZGV2aWNlIHN0cnVjdHVyZSAqLworCXBsYXRmb3Jt X3NldF9kcnZkYXRhKHBkZXYsIHNtbXUpOworCisJLyogUmVzZXQgdGhlIGRldmljZSAqLworCXJl dCA9IGFybV9zbW11X2RldmljZV9yZXNldChzbW11LCBieXBhc3MpOworCWlmIChyZXQpCisJCXJl dHVybiByZXQ7CisKKwkvKiBBbmQgd2UncmUgdXAuIEdvIGdvIGdvISAqLworCXJldCA9IGlvbW11 X2RldmljZV9zeXNmc19hZGQoJnNtbXUtPmlvbW11LCBkZXYsIE5VTEwsCisJCQkJICAgICAic21t dTMuJXBhIiwgJmlvYWRkcik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlvbW11X2Rl dmljZV9zZXRfb3BzKCZzbW11LT5pb21tdSwgJmFybV9zbW11X29wcyk7CisJaW9tbXVfZGV2aWNl X3NldF9md25vZGUoJnNtbXUtPmlvbW11LCBkZXYtPmZ3bm9kZSk7CisKKwlyZXQgPSBpb21tdV9k ZXZpY2VfcmVnaXN0ZXIoJnNtbXUtPmlvbW11KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2 LCAiRmFpbGVkIHRvIHJlZ2lzdGVyIGlvbW11XG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKyNp ZmRlZiBDT05GSUdfUENJCisJaWYgKHBjaV9idXNfdHlwZS5pb21tdV9vcHMgIT0gJmFybV9zbW11 X29wcykgeworCQlwY2lfcmVxdWVzdF9hY3MoKTsKKwkJcmV0ID0gYnVzX3NldF9pb21tdSgmcGNp X2J1c190eXBlLCAmYXJtX3NtbXVfb3BzKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJ fQorI2VuZGlmCisjaWZkZWYgQ09ORklHX0FSTV9BTUJBCisJaWYgKGFtYmFfYnVzdHlwZS5pb21t dV9vcHMgIT0gJmFybV9zbW11X29wcykgeworCQlyZXQgPSBidXNfc2V0X2lvbW11KCZhbWJhX2J1 c3R5cGUsICZhcm1fc21tdV9vcHMpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9Cisj ZW5kaWYKKwlpZiAocGxhdGZvcm1fYnVzX3R5cGUuaW9tbXVfb3BzICE9ICZhcm1fc21tdV9vcHMp IHsKKwkJcmV0ID0gYnVzX3NldF9pb21tdSgmcGxhdGZvcm1fYnVzX3R5cGUsICZhcm1fc21tdV9v cHMpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0 YXRpYyBpbnQgYXJtX3NtbXVfZGV2aWNlX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpw ZGV2KQoreworCXN0cnVjdCBhcm1fc21tdV9kZXZpY2UgKnNtbXUgPSBwbGF0Zm9ybV9nZXRfZHJ2 ZGF0YShwZGV2KTsKKworCWFybV9zbW11X2RldmljZV9kaXNhYmxlKHNtbXUpOworCisJcmV0dXJu IDA7Cit9CisKK3N0YXRpYyB2b2lkIGFybV9zbW11X2RldmljZV9zaHV0ZG93bihzdHJ1Y3QgcGxh dGZvcm1fZGV2aWNlICpwZGV2KQoreworCWFybV9zbW11X2RldmljZV9yZW1vdmUocGRldik7Cit9 CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGFybV9zbW11X29mX21hdGNoW10g PSB7CisJeyAuY29tcGF0aWJsZSA9ICJhcm0sc21tdS12MyIsIH0sCisJeyB9LAorfTsKK01PRFVM RV9ERVZJQ0VfVEFCTEUob2YsIGFybV9zbW11X29mX21hdGNoKTsKKworc3RhdGljIHN0cnVjdCBw bGF0Zm9ybV9kcml2ZXIgYXJtX3NtbXVfZHJpdmVyID0geworCS5kcml2ZXIJPSB7CisJCS5uYW1l CQk9ICJhcm0tc21tdS12MyIsCisJCS5vZl9tYXRjaF90YWJsZQk9IG9mX21hdGNoX3B0cihhcm1f c21tdV9vZl9tYXRjaCksCisJfSwKKwkucHJvYmUJPSBhcm1fc21tdV9kZXZpY2VfcHJvYmUsCisJ LnJlbW92ZQk9IGFybV9zbW11X2RldmljZV9yZW1vdmUsCisJLnNodXRkb3duID0gYXJtX3NtbXVf ZGV2aWNlX3NodXRkb3duLAorfTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoYXJtX3NtbXVfZHJp dmVyKTsKKworSU9NTVVfT0ZfREVDTEFSRShhcm1fc21tdXYzLCAiYXJtLHNtbXUtdjMiLCBOVUxM KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJJT01NVSBBUEkgZm9yIEFSTSBhcmNoaXRlY3RlZCBT TU1VdjMgaW1wbGVtZW50YXRpb25zIik7CitNT0RVTEVfQVVUSE9SKCJXaWxsIERlYWNvbiA8d2ls bC5kZWFjb25AYXJtLmNvbT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKLS0gCjIuMTQu MQoKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fClhlbi1k ZXZlbCBtYWlsaW5nIGxpc3QKWGVuLWRldmVsQGxpc3RzLnhlbnByb2plY3Qub3JnCmh0dHBzOi8v bGlzdHMueGVucHJvamVjdC5vcmcvbWFpbG1hbi9saXN0aW5mby94ZW4tZGV2ZWw=