From: Sameer Goel Subject: [RFC v3 3/4] Add verbatim copy of arm-smmu-v3.c from Linux Date: Mon, 4 Dec 2017 20:59:25 -0700 Message-ID: <1512446366-21877-4-git-send-email-sgoel@codeaurora.org> References: <1512446366-21877-1-git-send-email-sgoel@codeaurora.org> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from us1-rack-dfw2.inumbo.com ([104.130.134.6]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1eM4OR-0005zF-Kt for xen-devel@lists.xenproject.org; Tue, 05 Dec 2017 03:59:39 +0000 In-Reply-To: <1512446366-21877-1-git-send-email-sgoel@codeaurora.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: Sameer Goel , sstabellini@kernel.org, shankerd@codeaurora.org List-Id: xen-devel@lists.xenproject.org QmFzZWQgb24gY29tbWl0IDdhYTg2MTlhNjZhZWE1MmIxNDVlMDRjYmFiNGY4ZDZhNGU1ZjNmM2IK VGhpcyBpcyBhIHZlcmJhdGltIHNuYXBzaG90IG9mIGFybS1zbW11LXYzLmMgZnJvbSBMaW51eCBr ZXJuZWwgc291cmNlCmNvZGUuCk5vIFhlbiBjb2RlIGhhcyBiZWVuIGFkZGVkIGFuZCB0aGUgZmls ZSBpcyBub3QgYnVpbHQuCi0tLQogeGVuL2RyaXZlcnMvcGFzc3Rocm91Z2gvYXJtL3NtbXUtdjMu YyB8IDI4ODUgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCiAxIGZpbGUgY2hhbmdl ZCwgMjg4NSBpbnNlcnRpb25zKCspCiBjcmVhdGUgbW9kZSAxMDA2NDQgeGVuL2RyaXZlcnMvcGFz c3Rocm91Z2gvYXJtL3NtbXUtdjMuYwoKZGlmZiAtLWdpdCBhL3hlbi9kcml2ZXJzL3Bhc3N0aHJv dWdoL2FybS9zbW11LXYzLmMgYi94ZW4vZHJpdmVycy9wYXNzdGhyb3VnaC9hcm0vc21tdS12My5j Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2N2JhNmMKLS0tIC9kZXYvbnVs bAorKysgYi94ZW4vZHJpdmVycy9wYXNzdGhyb3VnaC9hcm0vc21tdS12My5jCkBAIC0wLDAgKzEs Mjg4NSBAQAorLyoKKyAqIElPTU1VIEFQSSBmb3IgQVJNIGFyY2hpdGVjdGVkIFNNTVV2MyBpbXBs ZW1lbnRhdGlvbnMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBj YW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBv ZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNo ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0g aXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1 dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5 IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBP U0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRh aWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBH ZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5v dCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqCisgKiBDb3B5cmlnaHQg KEMpIDIwMTUgQVJNIExpbWl0ZWQKKyAqCisgKiBBdXRob3I6IFdpbGwgRGVhY29uIDx3aWxsLmRl YWNvbkBhcm0uY29tPgorICoKKyAqIFRoaXMgZHJpdmVyIGlzIHBvd2VyZWQgYnkgYmFkIGNvZmZl ZSBhbmQgYm9tYmF5IG1peC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgorI2luY2x1 ZGUgPGxpbnV4L2FjcGlfaW9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVk ZSA8bGludXgvZG1hLWlvbW11Lmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8 bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9tbXUuaD4KKyNpbmNsdWRlIDxs aW51eC9pb3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51 eC9tc2kuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJl c3MuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9pb21tdS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX3Bs YXRmb3JtLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZv cm1fZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9hbWJhL2J1cy5oPgorCisjaW5jbHVkZSAi aW8tcGd0YWJsZS5oIgorCisvKiBNTUlPIHJlZ2lzdGVycyAqLworI2RlZmluZSBBUk1fU01NVV9J RFIwCQkJMHgwCisjZGVmaW5lIElEUjBfU1RfTFZMX1NISUZUCQkyNworI2RlZmluZSBJRFIwX1NU X0xWTF9NQVNLCQkweDMKKyNkZWZpbmUgSURSMF9TVF9MVkxfMkxWTAkJKDEgPDwgSURSMF9TVF9M VkxfU0hJRlQpCisjZGVmaW5lIElEUjBfU1RBTExfTU9ERUxfU0hJRlQJCTI0CisjZGVmaW5lIElE UjBfU1RBTExfTU9ERUxfTUFTSwkJMHgzCisjZGVmaW5lIElEUjBfU1RBTExfTU9ERUxfU1RBTEwJ CSgwIDw8IElEUjBfU1RBTExfTU9ERUxfU0hJRlQpCisjZGVmaW5lIElEUjBfU1RBTExfTU9ERUxf Rk9SQ0UJCSgyIDw8IElEUjBfU1RBTExfTU9ERUxfU0hJRlQpCisjZGVmaW5lIElEUjBfVFRFTkRJ QU5fU0hJRlQJCTIxCisjZGVmaW5lIElEUjBfVFRFTkRJQU5fTUFTSwkJMHgzCisjZGVmaW5lIElE UjBfVFRFTkRJQU5fTEUJCSgyIDw8IElEUjBfVFRFTkRJQU5fU0hJRlQpCisjZGVmaW5lIElEUjBf VFRFTkRJQU5fQkUJCSgzIDw8IElEUjBfVFRFTkRJQU5fU0hJRlQpCisjZGVmaW5lIElEUjBfVFRF TkRJQU5fTUlYRUQJCSgwIDw8IElEUjBfVFRFTkRJQU5fU0hJRlQpCisjZGVmaW5lIElEUjBfQ0Qy TAkJCSgxIDw8IDE5KQorI2RlZmluZSBJRFIwX1ZNSUQxNgkJCSgxIDw8IDE4KQorI2RlZmluZSBJ RFIwX1BSSQkJCSgxIDw8IDE2KQorI2RlZmluZSBJRFIwX1NFVgkJCSgxIDw8IDE0KQorI2RlZmlu ZSBJRFIwX01TSQkJCSgxIDw8IDEzKQorI2RlZmluZSBJRFIwX0FTSUQxNgkJCSgxIDw8IDEyKQor I2RlZmluZSBJRFIwX0FUUwkJCSgxIDw8IDEwKQorI2RlZmluZSBJRFIwX0hZUAkJCSgxIDw8IDkp CisjZGVmaW5lIElEUjBfQ09IQUNDCQkJKDEgPDwgNCkKKyNkZWZpbmUgSURSMF9UVEZfU0hJRlQJ CQkyCisjZGVmaW5lIElEUjBfVFRGX01BU0sJCQkweDMKKyNkZWZpbmUgSURSMF9UVEZfQUFSQ0g2 NAkJKDIgPDwgSURSMF9UVEZfU0hJRlQpCisjZGVmaW5lIElEUjBfVFRGX0FBUkNIMzJfNjQJCSgz IDw8IElEUjBfVFRGX1NISUZUKQorI2RlZmluZSBJRFIwX1MxUAkJCSgxIDw8IDEpCisjZGVmaW5l IElEUjBfUzJQCQkJKDEgPDwgMCkKKworI2RlZmluZSBBUk1fU01NVV9JRFIxCQkJMHg0CisjZGVm aW5lIElEUjFfVEFCTEVTX1BSRVNFVAkJKDEgPDwgMzApCisjZGVmaW5lIElEUjFfUVVFVUVTX1BS RVNFVAkJKDEgPDwgMjkpCisjZGVmaW5lIElEUjFfUkVMCQkJKDEgPDwgMjgpCisjZGVmaW5lIElE UjFfQ01EUV9TSElGVAkJCTIxCisjZGVmaW5lIElEUjFfQ01EUV9NQVNLCQkJMHgxZgorI2RlZmlu ZSBJRFIxX0VWVFFfU0hJRlQJCQkxNgorI2RlZmluZSBJRFIxX0VWVFFfTUFTSwkJCTB4MWYKKyNk ZWZpbmUgSURSMV9QUklRX1NISUZUCQkJMTEKKyNkZWZpbmUgSURSMV9QUklRX01BU0sJCQkweDFm CisjZGVmaW5lIElEUjFfU1NJRF9TSElGVAkJCTYKKyNkZWZpbmUgSURSMV9TU0lEX01BU0sJCQkw eDFmCisjZGVmaW5lIElEUjFfU0lEX1NISUZUCQkJMAorI2RlZmluZSBJRFIxX1NJRF9NQVNLCQkJ MHgzZgorCisjZGVmaW5lIEFSTV9TTU1VX0lEUjUJCQkweDE0CisjZGVmaW5lIElEUjVfU1RBTExf TUFYX1NISUZUCQkxNgorI2RlZmluZSBJRFI1X1NUQUxMX01BWF9NQVNLCQkweGZmZmYKKyNkZWZp bmUgSURSNV9HUkFONjRLCQkJKDEgPDwgNikKKyNkZWZpbmUgSURSNV9HUkFOMTZLCQkJKDEgPDwg NSkKKyNkZWZpbmUgSURSNV9HUkFONEsJCQkoMSA8PCA0KQorI2RlZmluZSBJRFI1X09BU19TSElG VAkJCTAKKyNkZWZpbmUgSURSNV9PQVNfTUFTSwkJCTB4NworI2RlZmluZSBJRFI1X09BU18zMl9C SVQJCQkoMCA8PCBJRFI1X09BU19TSElGVCkKKyNkZWZpbmUgSURSNV9PQVNfMzZfQklUCQkJKDEg PDwgSURSNV9PQVNfU0hJRlQpCisjZGVmaW5lIElEUjVfT0FTXzQwX0JJVAkJCSgyIDw8IElEUjVf T0FTX1NISUZUKQorI2RlZmluZSBJRFI1X09BU180Ml9CSVQJCQkoMyA8PCBJRFI1X09BU19TSElG VCkKKyNkZWZpbmUgSURSNV9PQVNfNDRfQklUCQkJKDQgPDwgSURSNV9PQVNfU0hJRlQpCisjZGVm aW5lIElEUjVfT0FTXzQ4X0JJVAkJCSg1IDw8IElEUjVfT0FTX1NISUZUKQorCisjZGVmaW5lIEFS TV9TTU1VX0NSMAkJCTB4MjAKKyNkZWZpbmUgQ1IwX0NNRFFFTgkJCSgxIDw8IDMpCisjZGVmaW5l IENSMF9FVlRRRU4JCQkoMSA8PCAyKQorI2RlZmluZSBDUjBfUFJJUUVOCQkJKDEgPDwgMSkKKyNk ZWZpbmUgQ1IwX1NNTVVFTgkJCSgxIDw8IDApCisKKyNkZWZpbmUgQVJNX1NNTVVfQ1IwQUNLCQkJ MHgyNAorCisjZGVmaW5lIEFSTV9TTU1VX0NSMQkJCTB4MjgKKyNkZWZpbmUgQ1IxX1NIX05TSAkJ CTAKKyNkZWZpbmUgQ1IxX1NIX09TSAkJCTIKKyNkZWZpbmUgQ1IxX1NIX0lTSAkJCTMKKyNkZWZp bmUgQ1IxX0NBQ0hFX05DCQkJMAorI2RlZmluZSBDUjFfQ0FDSEVfV0IJCQkxCisjZGVmaW5lIENS MV9DQUNIRV9XVAkJCTIKKyNkZWZpbmUgQ1IxX1RBQkxFX1NIX1NISUZUCQkxMAorI2RlZmluZSBD UjFfVEFCTEVfT0NfU0hJRlQJCTgKKyNkZWZpbmUgQ1IxX1RBQkxFX0lDX1NISUZUCQk2CisjZGVm aW5lIENSMV9RVUVVRV9TSF9TSElGVAkJNAorI2RlZmluZSBDUjFfUVVFVUVfT0NfU0hJRlQJCTIK KyNkZWZpbmUgQ1IxX1FVRVVFX0lDX1NISUZUCQkwCisKKyNkZWZpbmUgQVJNX1NNTVVfQ1IyCQkJ MHgyYworI2RlZmluZSBDUjJfUFRNCQkJCSgxIDw8IDIpCisjZGVmaW5lIENSMl9SRUNJTlZTSUQJ CQkoMSA8PCAxKQorI2RlZmluZSBDUjJfRTJICQkJCSgxIDw8IDApCisKKyNkZWZpbmUgQVJNX1NN TVVfR0JQQQkJCTB4NDQKKyNkZWZpbmUgR0JQQV9BQk9SVAkJCSgxIDw8IDIwKQorI2RlZmluZSBH QlBBX1VQREFURQkJCSgxIDw8IDMxKQorCisjZGVmaW5lIEFSTV9TTU1VX0lSUV9DVFJMCQkweDUw CisjZGVmaW5lIElSUV9DVFJMX0VWVFFfSVJRRU4JCSgxIDw8IDIpCisjZGVmaW5lIElSUV9DVFJM X1BSSVFfSVJRRU4JCSgxIDw8IDEpCisjZGVmaW5lIElSUV9DVFJMX0dFUlJPUl9JUlFFTgkJKDEg PDwgMCkKKworI2RlZmluZSBBUk1fU01NVV9JUlFfQ1RSTEFDSwkJMHg1NAorCisjZGVmaW5lIEFS TV9TTU1VX0dFUlJPUgkJCTB4NjAKKyNkZWZpbmUgR0VSUk9SX1NGTV9FUlIJCQkoMSA8PCA4KQor I2RlZmluZSBHRVJST1JfTVNJX0dFUlJPUl9BQlRfRVJSCSgxIDw8IDcpCisjZGVmaW5lIEdFUlJP Ul9NU0lfUFJJUV9BQlRfRVJSCQkoMSA8PCA2KQorI2RlZmluZSBHRVJST1JfTVNJX0VWVFFfQUJU X0VSUgkJKDEgPDwgNSkKKyNkZWZpbmUgR0VSUk9SX01TSV9DTURRX0FCVF9FUlIJCSgxIDw8IDQp CisjZGVmaW5lIEdFUlJPUl9QUklRX0FCVF9FUlIJCSgxIDw8IDMpCisjZGVmaW5lIEdFUlJPUl9F VlRRX0FCVF9FUlIJCSgxIDw8IDIpCisjZGVmaW5lIEdFUlJPUl9DTURRX0VSUgkJCSgxIDw8IDAp CisjZGVmaW5lIEdFUlJPUl9FUlJfTUFTSwkJCTB4ZmQKKworI2RlZmluZSBBUk1fU01NVV9HRVJS T1JOCQkweDY0CisKKyNkZWZpbmUgQVJNX1NNTVVfR0VSUk9SX0lSUV9DRkcwCTB4NjgKKyNkZWZp bmUgQVJNX1NNTVVfR0VSUk9SX0lSUV9DRkcxCTB4NzAKKyNkZWZpbmUgQVJNX1NNTVVfR0VSUk9S X0lSUV9DRkcyCTB4NzQKKworI2RlZmluZSBBUk1fU01NVV9TVFJUQUJfQkFTRQkJMHg4MAorI2Rl ZmluZSBTVFJUQUJfQkFTRV9SQQkJCSgxVUwgPDwgNjIpCisjZGVmaW5lIFNUUlRBQl9CQVNFX0FE RFJfU0hJRlQJCTYKKyNkZWZpbmUgU1RSVEFCX0JBU0VfQUREUl9NQVNLCQkweDNmZmZmZmZmZmZm VUwKKworI2RlZmluZSBBUk1fU01NVV9TVFJUQUJfQkFTRV9DRkcJMHg4OAorI2RlZmluZSBTVFJU QUJfQkFTRV9DRkdfTE9HMlNJWkVfU0hJRlQJMAorI2RlZmluZSBTVFJUQUJfQkFTRV9DRkdfTE9H MlNJWkVfTUFTSwkweDNmCisjZGVmaW5lIFNUUlRBQl9CQVNFX0NGR19TUExJVF9TSElGVAk2Cisj ZGVmaW5lIFNUUlRBQl9CQVNFX0NGR19TUExJVF9NQVNLCTB4MWYKKyNkZWZpbmUgU1RSVEFCX0JB U0VfQ0ZHX0ZNVF9TSElGVAkxNgorI2RlZmluZSBTVFJUQUJfQkFTRV9DRkdfRk1UX01BU0sJMHgz CisjZGVmaW5lIFNUUlRBQl9CQVNFX0NGR19GTVRfTElORUFSCSgwIDw8IFNUUlRBQl9CQVNFX0NG R19GTVRfU0hJRlQpCisjZGVmaW5lIFNUUlRBQl9CQVNFX0NGR19GTVRfMkxWTAkoMSA8PCBTVFJU QUJfQkFTRV9DRkdfRk1UX1NISUZUKQorCisjZGVmaW5lIEFSTV9TTU1VX0NNRFFfQkFTRQkJMHg5 MAorI2RlZmluZSBBUk1fU01NVV9DTURRX1BST0QJCTB4OTgKKyNkZWZpbmUgQVJNX1NNTVVfQ01E UV9DT05TCQkweDljCisKKyNkZWZpbmUgQVJNX1NNTVVfRVZUUV9CQVNFCQkweGEwCisjZGVmaW5l IEFSTV9TTU1VX0VWVFFfUFJPRAkJMHgxMDBhOAorI2RlZmluZSBBUk1fU01NVV9FVlRRX0NPTlMJ CTB4MTAwYWMKKyNkZWZpbmUgQVJNX1NNTVVfRVZUUV9JUlFfQ0ZHMAkJMHhiMAorI2RlZmluZSBB Uk1fU01NVV9FVlRRX0lSUV9DRkcxCQkweGI4CisjZGVmaW5lIEFSTV9TTU1VX0VWVFFfSVJRX0NG RzIJCTB4YmMKKworI2RlZmluZSBBUk1fU01NVV9QUklRX0JBU0UJCTB4YzAKKyNkZWZpbmUgQVJN X1NNTVVfUFJJUV9QUk9ECQkweDEwMGM4CisjZGVmaW5lIEFSTV9TTU1VX1BSSVFfQ09OUwkJMHgx MDBjYworI2RlZmluZSBBUk1fU01NVV9QUklRX0lSUV9DRkcwCQkweGQwCisjZGVmaW5lIEFSTV9T TU1VX1BSSVFfSVJRX0NGRzEJCTB4ZDgKKyNkZWZpbmUgQVJNX1NNTVVfUFJJUV9JUlFfQ0ZHMgkJ MHhkYworCisvKiBDb21tb24gTVNJIGNvbmZpZyBmaWVsZHMgKi8KKyNkZWZpbmUgTVNJX0NGRzBf QUREUl9TSElGVAkJMgorI2RlZmluZSBNU0lfQ0ZHMF9BRERSX01BU0sJCTB4M2ZmZmZmZmZmZmZm VUwKKyNkZWZpbmUgTVNJX0NGRzJfU0hfU0hJRlQJCTQKKyNkZWZpbmUgTVNJX0NGRzJfU0hfTlNI CQkJKDBVTCA8PCBNU0lfQ0ZHMl9TSF9TSElGVCkKKyNkZWZpbmUgTVNJX0NGRzJfU0hfT1NICQkJ KDJVTCA8PCBNU0lfQ0ZHMl9TSF9TSElGVCkKKyNkZWZpbmUgTVNJX0NGRzJfU0hfSVNICQkJKDNV TCA8PCBNU0lfQ0ZHMl9TSF9TSElGVCkKKyNkZWZpbmUgTVNJX0NGRzJfTUVNQVRUUl9TSElGVAkJ MAorI2RlZmluZSBNU0lfQ0ZHMl9NRU1BVFRSX0RFVklDRV9uR25SRQkoMHgxIDw8IE1TSV9DRkcy X01FTUFUVFJfU0hJRlQpCisKKyNkZWZpbmUgUV9JRFgocSwgcCkJCQkoKHApICYgKCgxIDw8IChx KS0+bWF4X25fc2hpZnQpIC0gMSkpCisjZGVmaW5lIFFfV1JQKHEsIHApCQkJKChwKSAmICgxIDw8 IChxKS0+bWF4X25fc2hpZnQpKQorI2RlZmluZSBRX09WRVJGTE9XX0ZMQUcJCQkoMSA8PCAzMSkK KyNkZWZpbmUgUV9PVkYocSwgcCkJCQkoKHApICYgUV9PVkVSRkxPV19GTEFHKQorI2RlZmluZSBR X0VOVChxLCBwKQkJCSgocSktPmJhc2UgKwkJCVwKKwkJCQkJIFFfSURYKHEsIHApICogKHEpLT5l bnRfZHdvcmRzKQorCisjZGVmaW5lIFFfQkFTRV9SV0EJCQkoMVVMIDw8IDYyKQorI2RlZmluZSBR X0JBU0VfQUREUl9TSElGVAkJNQorI2RlZmluZSBRX0JBU0VfQUREUl9NQVNLCQkweGZmZmZmZmZm ZmZmVUwKKyNkZWZpbmUgUV9CQVNFX0xPRzJTSVpFX1NISUZUCQkwCisjZGVmaW5lIFFfQkFTRV9M T0cyU0laRV9NQVNLCQkweDFmVUwKKworLyoKKyAqIFN0cmVhbSB0YWJsZS4KKyAqCisgKiBMaW5l YXI6IEVub3VnaCB0byBjb3ZlciAxIDw8IElEUjEuU0lEU0laRSBlbnRyaWVzCisgKiAybHZsOiAx MjhrIEwxIGVudHJpZXMsCisgKiAgICAgICAyNTYgbGF6eSBlbnRyaWVzIHBlciB0YWJsZSAoZWFj aCB0YWJsZSBjb3ZlcnMgYSBQQ0kgYnVzKQorICovCisjZGVmaW5lIFNUUlRBQl9MMV9TWl9TSElG VAkJMjAKKyNkZWZpbmUgU1RSVEFCX1NQTElUCQkJOAorCisjZGVmaW5lIFNUUlRBQl9MMV9ERVND X0RXT1JEUwkJMQorI2RlZmluZSBTVFJUQUJfTDFfREVTQ19TUEFOX1NISUZUCTAKKyNkZWZpbmUg U1RSVEFCX0wxX0RFU0NfU1BBTl9NQVNLCTB4MWZVTAorI2RlZmluZSBTVFJUQUJfTDFfREVTQ19M MlBUUl9TSElGVAk2CisjZGVmaW5lIFNUUlRBQl9MMV9ERVNDX0wyUFRSX01BU0sJMHgzZmZmZmZm ZmZmZlVMCisKKyNkZWZpbmUgU1RSVEFCX1NURV9EV09SRFMJCTgKKyNkZWZpbmUgU1RSVEFCX1NU RV8wX1YJCQkoMVVMIDw8IDApCisjZGVmaW5lIFNUUlRBQl9TVEVfMF9DRkdfU0hJRlQJCTEKKyNk ZWZpbmUgU1RSVEFCX1NURV8wX0NGR19NQVNLCQkweDdVTAorI2RlZmluZSBTVFJUQUJfU1RFXzBf Q0ZHX0FCT1JUCQkoMFVMIDw8IFNUUlRBQl9TVEVfMF9DRkdfU0hJRlQpCisjZGVmaW5lIFNUUlRB Ql9TVEVfMF9DRkdfQllQQVNTCQkoNFVMIDw8IFNUUlRBQl9TVEVfMF9DRkdfU0hJRlQpCisjZGVm aW5lIFNUUlRBQl9TVEVfMF9DRkdfUzFfVFJBTlMJKDVVTCA8PCBTVFJUQUJfU1RFXzBfQ0ZHX1NI SUZUKQorI2RlZmluZSBTVFJUQUJfU1RFXzBfQ0ZHX1MyX1RSQU5TCSg2VUwgPDwgU1RSVEFCX1NU RV8wX0NGR19TSElGVCkKKworI2RlZmluZSBTVFJUQUJfU1RFXzBfUzFGTVRfU0hJRlQJNAorI2Rl ZmluZSBTVFJUQUJfU1RFXzBfUzFGTVRfTElORUFSCSgwVUwgPDwgU1RSVEFCX1NURV8wX1MxRk1U X1NISUZUKQorI2RlZmluZSBTVFJUQUJfU1RFXzBfUzFDVFhQVFJfU0hJRlQJNgorI2RlZmluZSBT VFJUQUJfU1RFXzBfUzFDVFhQVFJfTUFTSwkweDNmZmZmZmZmZmZmVUwKKyNkZWZpbmUgU1RSVEFC X1NURV8wX1MxQ0RNQVhfU0hJRlQJNTkKKyNkZWZpbmUgU1RSVEFCX1NURV8wX1MxQ0RNQVhfTUFT SwkweDFmVUwKKworI2RlZmluZSBTVFJUQUJfU1RFXzFfUzFDX0NBQ0hFX05DCTBVTAorI2RlZmlu ZSBTVFJUQUJfU1RFXzFfUzFDX0NBQ0hFX1dCUkEJMVVMCisjZGVmaW5lIFNUUlRBQl9TVEVfMV9T MUNfQ0FDSEVfV1QJMlVMCisjZGVmaW5lIFNUUlRBQl9TVEVfMV9TMUNfQ0FDSEVfV0IJM1VMCisj ZGVmaW5lIFNUUlRBQl9TVEVfMV9TMUNfU0hfTlNICQkwVUwKKyNkZWZpbmUgU1RSVEFCX1NURV8x X1MxQ19TSF9PU0gJCTJVTAorI2RlZmluZSBTVFJUQUJfU1RFXzFfUzFDX1NIX0lTSAkJM1VMCisj ZGVmaW5lIFNUUlRBQl9TVEVfMV9TMUNJUl9TSElGVAkyCisjZGVmaW5lIFNUUlRBQl9TVEVfMV9T MUNPUl9TSElGVAk0CisjZGVmaW5lIFNUUlRBQl9TVEVfMV9TMUNTSF9TSElGVAk2CisKKyNkZWZp bmUgU1RSVEFCX1NURV8xX1MxU1RBTExECQkoMVVMIDw8IDI3KQorCisjZGVmaW5lIFNUUlRBQl9T VEVfMV9FQVRTX0FCVAkJMFVMCisjZGVmaW5lIFNUUlRBQl9TVEVfMV9FQVRTX1RSQU5TCQkxVUwK KyNkZWZpbmUgU1RSVEFCX1NURV8xX0VBVFNfUzFDSEsJCTJVTAorI2RlZmluZSBTVFJUQUJfU1RF XzFfRUFUU19TSElGVAkJMjgKKworI2RlZmluZSBTVFJUQUJfU1RFXzFfU1RSV19OU0VMMQkJMFVM CisjZGVmaW5lIFNUUlRBQl9TVEVfMV9TVFJXX0VMMgkJMlVMCisjZGVmaW5lIFNUUlRBQl9TVEVf MV9TVFJXX1NISUZUCQkzMAorCisjZGVmaW5lIFNUUlRBQl9TVEVfMV9TSENGR19JTkNPTUlORwkx VUwKKyNkZWZpbmUgU1RSVEFCX1NURV8xX1NIQ0ZHX1NISUZUCTQ0CisKKyNkZWZpbmUgU1RSVEFC X1NURV8yX1MyVk1JRF9TSElGVAkwCisjZGVmaW5lIFNUUlRBQl9TVEVfMl9TMlZNSURfTUFTSwkw eGZmZmZVTAorI2RlZmluZSBTVFJUQUJfU1RFXzJfVlRDUl9TSElGVAkJMzIKKyNkZWZpbmUgU1RS VEFCX1NURV8yX1ZUQ1JfTUFTSwkJMHg3ZmZmZlVMCisjZGVmaW5lIFNUUlRBQl9TVEVfMl9TMkFB NjQJCSgxVUwgPDwgNTEpCisjZGVmaW5lIFNUUlRBQl9TVEVfMl9TMkVOREkJCSgxVUwgPDwgNTIp CisjZGVmaW5lIFNUUlRBQl9TVEVfMl9TMlBUVwkJKDFVTCA8PCA1NCkKKyNkZWZpbmUgU1RSVEFC X1NURV8yX1MyUgkJKDFVTCA8PCA1OCkKKworI2RlZmluZSBTVFJUQUJfU1RFXzNfUzJUVEJfU0hJ RlQJNAorI2RlZmluZSBTVFJUQUJfU1RFXzNfUzJUVEJfTUFTSwkJMHhmZmZmZmZmZmZmZlVMCisK Ky8qIENvbnRleHQgZGVzY3JpcHRvciAoc3RhZ2UtMSBvbmx5KSAqLworI2RlZmluZSBDVFhERVND X0NEX0RXT1JEUwkJOAorI2RlZmluZSBDVFhERVNDX0NEXzBfVENSX1QwU1pfU0hJRlQJMAorI2Rl ZmluZSBBUk02NF9UQ1JfVDBTWl9TSElGVAkJMAorI2RlZmluZSBBUk02NF9UQ1JfVDBTWl9NQVNL CQkweDFmVUwKKyNkZWZpbmUgQ1RYREVTQ19DRF8wX1RDUl9URzBfU0hJRlQJNgorI2RlZmluZSBB Uk02NF9UQ1JfVEcwX1NISUZUCQkxNAorI2RlZmluZSBBUk02NF9UQ1JfVEcwX01BU0sJCTB4M1VM CisjZGVmaW5lIENUWERFU0NfQ0RfMF9UQ1JfSVJHTjBfU0hJRlQJOAorI2RlZmluZSBBUk02NF9U Q1JfSVJHTjBfU0hJRlQJCTgKKyNkZWZpbmUgQVJNNjRfVENSX0lSR04wX01BU0sJCTB4M1VMCisj ZGVmaW5lIENUWERFU0NfQ0RfMF9UQ1JfT1JHTjBfU0hJRlQJMTAKKyNkZWZpbmUgQVJNNjRfVENS X09SR04wX1NISUZUCQkxMAorI2RlZmluZSBBUk02NF9UQ1JfT1JHTjBfTUFTSwkJMHgzVUwKKyNk ZWZpbmUgQ1RYREVTQ19DRF8wX1RDUl9TSDBfU0hJRlQJMTIKKyNkZWZpbmUgQVJNNjRfVENSX1NI MF9TSElGVAkJMTIKKyNkZWZpbmUgQVJNNjRfVENSX1NIMF9NQVNLCQkweDNVTAorI2RlZmluZSBD VFhERVNDX0NEXzBfVENSX0VQRDBfU0hJRlQJMTQKKyNkZWZpbmUgQVJNNjRfVENSX0VQRDBfU0hJ RlQJCTcKKyNkZWZpbmUgQVJNNjRfVENSX0VQRDBfTUFTSwkJMHgxVUwKKyNkZWZpbmUgQ1RYREVT Q19DRF8wX1RDUl9FUEQxX1NISUZUCTMwCisjZGVmaW5lIEFSTTY0X1RDUl9FUEQxX1NISUZUCQky MworI2RlZmluZSBBUk02NF9UQ1JfRVBEMV9NQVNLCQkweDFVTAorCisjZGVmaW5lIENUWERFU0Nf Q0RfMF9FTkRJCQkoMVVMIDw8IDE1KQorI2RlZmluZSBDVFhERVNDX0NEXzBfVgkJCSgxVUwgPDwg MzEpCisKKyNkZWZpbmUgQ1RYREVTQ19DRF8wX1RDUl9JUFNfU0hJRlQJMzIKKyNkZWZpbmUgQVJN NjRfVENSX0lQU19TSElGVAkJMzIKKyNkZWZpbmUgQVJNNjRfVENSX0lQU19NQVNLCQkweDdVTAor I2RlZmluZSBDVFhERVNDX0NEXzBfVENSX1RCSTBfU0hJRlQJMzgKKyNkZWZpbmUgQVJNNjRfVENS X1RCSTBfU0hJRlQJCTM3CisjZGVmaW5lIEFSTTY0X1RDUl9UQkkwX01BU0sJCTB4MVVMCisKKyNk ZWZpbmUgQ1RYREVTQ19DRF8wX0FBNjQJCSgxVUwgPDwgNDEpCisjZGVmaW5lIENUWERFU0NfQ0Rf MF9SCQkJKDFVTCA8PCA0NSkKKyNkZWZpbmUgQ1RYREVTQ19DRF8wX0EJCQkoMVVMIDw8IDQ2KQor I2RlZmluZSBDVFhERVNDX0NEXzBfQVNFVF9TSElGVAkJNDcKKyNkZWZpbmUgQ1RYREVTQ19DRF8w X0FTRVRfU0hBUkVECSgwVUwgPDwgQ1RYREVTQ19DRF8wX0FTRVRfU0hJRlQpCisjZGVmaW5lIENU WERFU0NfQ0RfMF9BU0VUX1BSSVZBVEUJKDFVTCA8PCBDVFhERVNDX0NEXzBfQVNFVF9TSElGVCkK KyNkZWZpbmUgQ1RYREVTQ19DRF8wX0FTSURfU0hJRlQJCTQ4CisjZGVmaW5lIENUWERFU0NfQ0Rf MF9BU0lEX01BU0sJCTB4ZmZmZlVMCisKKyNkZWZpbmUgQ1RYREVTQ19DRF8xX1RUQjBfU0hJRlQJ CTQKKyNkZWZpbmUgQ1RYREVTQ19DRF8xX1RUQjBfTUFTSwkJMHhmZmZmZmZmZmZmZlVMCisKKyNk ZWZpbmUgQ1RYREVTQ19DRF8zX01BSVJfU0hJRlQJCTAKKworLyogQ29udmVydCBiZXR3ZWVuIEFB cmNoNjQgKENQVSkgVENSIGZvcm1hdCBhbmQgU01NVSBDRCBmb3JtYXQgKi8KKyNkZWZpbmUgQVJN X1NNTVVfVENSMkNEKHRjciwgZmxkKQkJCQkJXAorCSgoKHRjcikgPj4gQVJNNjRfVENSXyMjZmxk IyNfU0hJRlQgJiBBUk02NF9UQ1JfIyNmbGQjI19NQVNLKQlcCisJIDw8IENUWERFU0NfQ0RfMF9U Q1JfIyNmbGQjI19TSElGVCkKKworLyogQ29tbWFuZCBxdWV1ZSAqLworI2RlZmluZSBDTURRX0VO VF9EV09SRFMJCQkyCisjZGVmaW5lIENNRFFfTUFYX1NaX1NISUZUCQk4CisKKyNkZWZpbmUgQ01E UV9FUlJfU0hJRlQJCQkyNAorI2RlZmluZSBDTURRX0VSUl9NQVNLCQkJMHg3ZgorI2RlZmluZSBD TURRX0VSUl9DRVJST1JfTk9ORV9JRFgJMAorI2RlZmluZSBDTURRX0VSUl9DRVJST1JfSUxMX0lE WAkJMQorI2RlZmluZSBDTURRX0VSUl9DRVJST1JfQUJUX0lEWAkJMgorCisjZGVmaW5lIENNRFFf MF9PUF9TSElGVAkJCTAKKyNkZWZpbmUgQ01EUV8wX09QX01BU0sJCQkweGZmVUwKKyNkZWZpbmUg Q01EUV8wX1NTVgkJCSgxVUwgPDwgMTEpCisKKyNkZWZpbmUgQ01EUV9QUkVGRVRDSF8wX1NJRF9T SElGVAkzMgorI2RlZmluZSBDTURRX1BSRUZFVENIXzFfU0laRV9TSElGVAkwCisjZGVmaW5lIENN RFFfUFJFRkVUQ0hfMV9BRERSX01BU0sJfjB4ZmZmVUwKKworI2RlZmluZSBDTURRX0NGR0lfMF9T SURfU0hJRlQJCTMyCisjZGVmaW5lIENNRFFfQ0ZHSV8wX1NJRF9NQVNLCQkweGZmZmZmZmZmVUwK KyNkZWZpbmUgQ01EUV9DRkdJXzFfTEVBRgkJKDFVTCA8PCAwKQorI2RlZmluZSBDTURRX0NGR0lf MV9SQU5HRV9TSElGVAkJMAorI2RlZmluZSBDTURRX0NGR0lfMV9SQU5HRV9NQVNLCQkweDFmVUwK KworI2RlZmluZSBDTURRX1RMQklfMF9WTUlEX1NISUZUCQkzMgorI2RlZmluZSBDTURRX1RMQklf MF9BU0lEX1NISUZUCQk0OAorI2RlZmluZSBDTURRX1RMQklfMV9MRUFGCQkoMVVMIDw8IDApCisj ZGVmaW5lIENNRFFfVExCSV8xX1ZBX01BU0sJCX4weGZmZlVMCisjZGVmaW5lIENNRFFfVExCSV8x X0lQQV9NQVNLCQkweGZmZmZmZmZmZjAwMFVMCisKKyNkZWZpbmUgQ01EUV9QUklfMF9TU0lEX1NI SUZUCQkxMgorI2RlZmluZSBDTURRX1BSSV8wX1NTSURfTUFTSwkJMHhmZmZmZlVMCisjZGVmaW5l IENNRFFfUFJJXzBfU0lEX1NISUZUCQkzMgorI2RlZmluZSBDTURRX1BSSV8wX1NJRF9NQVNLCQkw eGZmZmZmZmZmVUwKKyNkZWZpbmUgQ01EUV9QUklfMV9HUlBJRF9TSElGVAkJMAorI2RlZmluZSBD TURRX1BSSV8xX0dSUElEX01BU0sJCTB4MWZmVUwKKyNkZWZpbmUgQ01EUV9QUklfMV9SRVNQX1NI SUZUCQkxMgorI2RlZmluZSBDTURRX1BSSV8xX1JFU1BfREVOWQkJKDBVTCA8PCBDTURRX1BSSV8x X1JFU1BfU0hJRlQpCisjZGVmaW5lIENNRFFfUFJJXzFfUkVTUF9GQUlMCQkoMVVMIDw8IENNRFFf UFJJXzFfUkVTUF9TSElGVCkKKyNkZWZpbmUgQ01EUV9QUklfMV9SRVNQX1NVQ0MJCSgyVUwgPDwg Q01EUV9QUklfMV9SRVNQX1NISUZUKQorCisjZGVmaW5lIENNRFFfU1lOQ18wX0NTX1NISUZUCQkx MgorI2RlZmluZSBDTURRX1NZTkNfMF9DU19OT05FCQkoMFVMIDw8IENNRFFfU1lOQ18wX0NTX1NI SUZUKQorI2RlZmluZSBDTURRX1NZTkNfMF9DU19TRVYJCSgyVUwgPDwgQ01EUV9TWU5DXzBfQ1Nf U0hJRlQpCisKKy8qIEV2ZW50IHF1ZXVlICovCisjZGVmaW5lIEVWVFFfRU5UX0RXT1JEUwkJCTQK KyNkZWZpbmUgRVZUUV9NQVhfU1pfU0hJRlQJCTcKKworI2RlZmluZSBFVlRRXzBfSURfU0hJRlQJ CQkwCisjZGVmaW5lIEVWVFFfMF9JRF9NQVNLCQkJMHhmZlVMCisKKy8qIFBSSSBxdWV1ZSAqLwor I2RlZmluZSBQUklRX0VOVF9EV09SRFMJCQkyCisjZGVmaW5lIFBSSVFfTUFYX1NaX1NISUZUCQk4 CisKKyNkZWZpbmUgUFJJUV8wX1NJRF9TSElGVAkJMAorI2RlZmluZSBQUklRXzBfU0lEX01BU0sJ CQkweGZmZmZmZmZmVUwKKyNkZWZpbmUgUFJJUV8wX1NTSURfU0hJRlQJCTMyCisjZGVmaW5lIFBS SVFfMF9TU0lEX01BU0sJCTB4ZmZmZmZVTAorI2RlZmluZSBQUklRXzBfUEVSTV9QUklWCQkoMVVM IDw8IDU4KQorI2RlZmluZSBQUklRXzBfUEVSTV9FWEVDCQkoMVVMIDw8IDU5KQorI2RlZmluZSBQ UklRXzBfUEVSTV9SRUFECQkoMVVMIDw8IDYwKQorI2RlZmluZSBQUklRXzBfUEVSTV9XUklURQkJ KDFVTCA8PCA2MSkKKyNkZWZpbmUgUFJJUV8wX1BSR19MQVNUCQkJKDFVTCA8PCA2MikKKyNkZWZp bmUgUFJJUV8wX1NTSURfVgkJCSgxVUwgPDwgNjMpCisKKyNkZWZpbmUgUFJJUV8xX1BSR19JRFhf U0hJRlQJCTAKKyNkZWZpbmUgUFJJUV8xX1BSR19JRFhfTUFTSwkJMHgxZmZVTAorI2RlZmluZSBQ UklRXzFfQUREUl9TSElGVAkJMTIKKyNkZWZpbmUgUFJJUV8xX0FERFJfTUFTSwkJMHhmZmZmZmZm ZmZmZmZmVUwKKworLyogSGlnaC1sZXZlbCBxdWV1ZSBzdHJ1Y3R1cmVzICovCisjZGVmaW5lIEFS TV9TTU1VX1BPTExfVElNRU9VVF9VUwkxMDAKKyNkZWZpbmUgQVJNX1NNTVVfQ01EUV9EUkFJTl9U SU1FT1VUX1VTCTEwMDAwMDAgLyogMXMhICovCisKKyNkZWZpbmUgTVNJX0lPVkFfQkFTRQkJCTB4 ODAwMDAwMAorI2RlZmluZSBNU0lfSU9WQV9MRU5HVEgJCQkweDEwMDAwMAorCisvKiBVbnRpbCBB Q1BJQ0EgaGVhZGVycyBjb3ZlciBJT1JUIHJldi4gQyAqLworI2lmbmRlZiBBQ1BJX0lPUlRfU01N VV9ISVNJTElDT05fSEkxNjFYCisjZGVmaW5lIEFDUElfSU9SVF9TTU1VX0hJU0lMSUNPTl9ISTE2 MVgJCTB4MQorI2VuZGlmCisKKyNpZm5kZWYgQUNQSV9JT1JUX1NNTVVfVjNfQ0FWSVVNX0NOOTlY WAorI2RlZmluZSBBQ1BJX0lPUlRfU01NVV9WM19DQVZJVU1fQ045OVhYCQkweDIKKyNlbmRpZgor CitzdGF0aWMgYm9vbCBkaXNhYmxlX2J5cGFzczsKK21vZHVsZV9wYXJhbV9uYW1lZChkaXNhYmxl X2J5cGFzcywgZGlzYWJsZV9ieXBhc3MsIGJvb2wsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVT QyhkaXNhYmxlX2J5cGFzcywKKwkiRGlzYWJsZSBieXBhc3Mgc3RyZWFtcyBzdWNoIHRoYXQgaW5j b21pbmcgdHJhbnNhY3Rpb25zIGZyb20gZGV2aWNlcyB0aGF0IGFyZSBub3QgYXR0YWNoZWQgdG8g YW4gaW9tbXUgZG9tYWluIHdpbGwgcmVwb3J0IGFuIGFib3J0IGJhY2sgdG8gdGhlIGRldmljZSBh bmQgd2lsbCBub3QgYmUgYWxsb3dlZCB0byBwYXNzIHRocm91Z2ggdGhlIFNNTVUuIik7CisKK2Vu dW0gcHJpX3Jlc3AgeworCVBSSV9SRVNQX0RFTlksCisJUFJJX1JFU1BfRkFJTCwKKwlQUklfUkVT UF9TVUNDLAorfTsKKworZW51bSBhcm1fc21tdV9tc2lfaW5kZXggeworCUVWVFFfTVNJX0lOREVY LAorCUdFUlJPUl9NU0lfSU5ERVgsCisJUFJJUV9NU0lfSU5ERVgsCisJQVJNX1NNTVVfTUFYX01T SVMsCit9OworCitzdGF0aWMgcGh5c19hZGRyX3QgYXJtX3NtbXVfbXNpX2NmZ1tBUk1fU01NVV9N QVhfTVNJU11bM10gPSB7CisJW0VWVFFfTVNJX0lOREVYXSA9IHsKKwkJQVJNX1NNTVVfRVZUUV9J UlFfQ0ZHMCwKKwkJQVJNX1NNTVVfRVZUUV9JUlFfQ0ZHMSwKKwkJQVJNX1NNTVVfRVZUUV9JUlFf Q0ZHMiwKKwl9LAorCVtHRVJST1JfTVNJX0lOREVYXSA9IHsKKwkJQVJNX1NNTVVfR0VSUk9SX0lS UV9DRkcwLAorCQlBUk1fU01NVV9HRVJST1JfSVJRX0NGRzEsCisJCUFSTV9TTU1VX0dFUlJPUl9J UlFfQ0ZHMiwKKwl9LAorCVtQUklRX01TSV9JTkRFWF0gPSB7CisJCUFSTV9TTU1VX1BSSVFfSVJR X0NGRzAsCisJCUFSTV9TTU1VX1BSSVFfSVJRX0NGRzEsCisJCUFSTV9TTU1VX1BSSVFfSVJRX0NG RzIsCisJfSwKK307CisKK3N0cnVjdCBhcm1fc21tdV9jbWRxX2VudCB7CisJLyogQ29tbW9uIGZp ZWxkcyAqLworCXU4CQkJCW9wY29kZTsKKwlib29sCQkJCXN1YnN0cmVhbV92YWxpZDsKKworCS8q IENvbW1hbmQtc3BlY2lmaWMgZmllbGRzICovCisJdW5pb24geworCQkjZGVmaW5lIENNRFFfT1Bf UFJFRkVUQ0hfQ0ZHCTB4MQorCQlzdHJ1Y3QgeworCQkJdTMyCQkJc2lkOworCQkJdTgJCQlzaXpl OworCQkJdTY0CQkJYWRkcjsKKwkJfSBwcmVmZXRjaDsKKworCQkjZGVmaW5lIENNRFFfT1BfQ0ZH SV9TVEUJMHgzCisJCSNkZWZpbmUgQ01EUV9PUF9DRkdJX0FMTAkweDQKKwkJc3RydWN0IHsKKwkJ CXUzMgkJCXNpZDsKKwkJCXVuaW9uIHsKKwkJCQlib29sCQlsZWFmOworCQkJCXU4CQlzcGFuOwor CQkJfTsKKwkJfSBjZmdpOworCisJCSNkZWZpbmUgQ01EUV9PUF9UTEJJX05IX0FTSUQJMHgxMQor CQkjZGVmaW5lIENNRFFfT1BfVExCSV9OSF9WQQkweDEyCisJCSNkZWZpbmUgQ01EUV9PUF9UTEJJ X0VMMl9BTEwJMHgyMAorCQkjZGVmaW5lIENNRFFfT1BfVExCSV9TMTJfVk1BTEwJMHgyOAorCQkj ZGVmaW5lIENNRFFfT1BfVExCSV9TMl9JUEEJMHgyYQorCQkjZGVmaW5lIENNRFFfT1BfVExCSV9O U05IX0FMTAkweDMwCisJCXN0cnVjdCB7CisJCQl1MTYJCQlhc2lkOworCQkJdTE2CQkJdm1pZDsK KwkJCWJvb2wJCQlsZWFmOworCQkJdTY0CQkJYWRkcjsKKwkJfSB0bGJpOworCisJCSNkZWZpbmUg Q01EUV9PUF9QUklfUkVTUAkweDQxCisJCXN0cnVjdCB7CisJCQl1MzIJCQlzaWQ7CisJCQl1MzIJ CQlzc2lkOworCQkJdTE2CQkJZ3JwaWQ7CisJCQllbnVtIHByaV9yZXNwCQlyZXNwOworCQl9IHBy aTsKKworCQkjZGVmaW5lIENNRFFfT1BfQ01EX1NZTkMJMHg0NgorCX07Cit9OworCitzdHJ1Y3Qg YXJtX3NtbXVfcXVldWUgeworCWludAkJCQlpcnE7IC8qIFdpcmVkIGludGVycnVwdCAqLworCisJ X19sZTY0CQkJCSpiYXNlOworCWRtYV9hZGRyX3QJCQliYXNlX2RtYTsKKwl1NjQJCQkJcV9iYXNl OworCisJc2l6ZV90CQkJCWVudF9kd29yZHM7CisJdTMyCQkJCW1heF9uX3NoaWZ0OworCXUzMgkJ CQlwcm9kOworCXUzMgkJCQljb25zOworCisJdTMyIF9faW9tZW0JCQkqcHJvZF9yZWc7CisJdTMy IF9faW9tZW0JCQkqY29uc19yZWc7Cit9OworCitzdHJ1Y3QgYXJtX3NtbXVfY21kcSB7CisJc3Ry dWN0IGFybV9zbW11X3F1ZXVlCQlxOworCXNwaW5sb2NrX3QJCQlsb2NrOworfTsKKworc3RydWN0 IGFybV9zbW11X2V2dHEgeworCXN0cnVjdCBhcm1fc21tdV9xdWV1ZQkJcTsKKwl1MzIJCQkJbWF4 X3N0YWxsczsKK307CisKK3N0cnVjdCBhcm1fc21tdV9wcmlxIHsKKwlzdHJ1Y3QgYXJtX3NtbXVf cXVldWUJCXE7Cit9OworCisvKiBIaWdoLWxldmVsIHN0cmVhbSB0YWJsZSBhbmQgY29udGV4dCBk ZXNjcmlwdG9yIHN0cnVjdHVyZXMgKi8KK3N0cnVjdCBhcm1fc21tdV9zdHJ0YWJfbDFfZGVzYyB7 CisJdTgJCQkJc3BhbjsKKworCV9fbGU2NAkJCQkqbDJwdHI7CisJZG1hX2FkZHJfdAkJCWwycHRy X2RtYTsKK307CisKK3N0cnVjdCBhcm1fc21tdV9zMV9jZmcgeworCV9fbGU2NAkJCQkqY2RwdHI7 CisJZG1hX2FkZHJfdAkJCWNkcHRyX2RtYTsKKworCXN0cnVjdCBhcm1fc21tdV9jdHhfZGVzYyB7 CisJCXUxNglhc2lkOworCQl1NjQJdHRicjsKKwkJdTY0CXRjcjsKKwkJdTY0CW1haXI7CisJfQkJ CQljZDsKK307CisKK3N0cnVjdCBhcm1fc21tdV9zMl9jZmcgeworCXUxNgkJCQl2bWlkOworCXU2 NAkJCQl2dHRicjsKKwl1NjQJCQkJdnRjcjsKK307CisKK3N0cnVjdCBhcm1fc21tdV9zdHJ0YWJf ZW50IHsKKwkvKgorCSAqIEFuIFNURSBpcyAiYXNzaWduZWQiIGlmIHRoZSBtYXN0ZXIgZW1pdHRp bmcgdGhlIGNvcnJlc3BvbmRpbmcgU0lECisJICogaXMgYXR0YWNoZWQgdG8gYSBkb21haW4uIFRo ZSBiZWhhdmlvdXIgb2YgYW4gdW5hc3NpZ25lZCBTVEUgaXMKKwkgKiBkZXRlcm1pbmVkIGJ5IHRo ZSBkaXNhYmxlX2J5cGFzcyBwYXJhbWV0ZXIsIHdoZXJlYXMgYW4gYXNzaWduZWQKKwkgKiBTVEUg YmVoYXZlcyBhY2NvcmRpbmcgdG8gczFfY2ZnL3MyX2NmZywgd2hpY2ggdGhlbXNlbHZlcyBhcmUK KwkgKiBjb25maWd1cmVkIGFjY29yZGluZyB0byB0aGUgZG9tYWluIHR5cGUuCisJICovCisJYm9v bAkJCQlhc3NpZ25lZDsKKwlzdHJ1Y3QgYXJtX3NtbXVfczFfY2ZnCQkqczFfY2ZnOworCXN0cnVj dCBhcm1fc21tdV9zMl9jZmcJCSpzMl9jZmc7Cit9OworCitzdHJ1Y3QgYXJtX3NtbXVfc3RydGFi X2NmZyB7CisJX19sZTY0CQkJCSpzdHJ0YWI7CisJZG1hX2FkZHJfdAkJCXN0cnRhYl9kbWE7CisJ c3RydWN0IGFybV9zbW11X3N0cnRhYl9sMV9kZXNjCSpsMV9kZXNjOworCXVuc2lnbmVkIGludAkJ CW51bV9sMV9lbnRzOworCisJdTY0CQkJCXN0cnRhYl9iYXNlOworCXUzMgkJCQlzdHJ0YWJfYmFz ZV9jZmc7Cit9OworCisvKiBBbiBTTU1VdjMgaW5zdGFuY2UgKi8KK3N0cnVjdCBhcm1fc21tdV9k ZXZpY2UgeworCXN0cnVjdCBkZXZpY2UJCQkqZGV2OworCXZvaWQgX19pb21lbQkJCSpiYXNlOwor CisjZGVmaW5lIEFSTV9TTU1VX0ZFQVRfMl9MVkxfU1RSVEFCCSgxIDw8IDApCisjZGVmaW5lIEFS TV9TTU1VX0ZFQVRfMl9MVkxfQ0RUQUIJKDEgPDwgMSkKKyNkZWZpbmUgQVJNX1NNTVVfRkVBVF9U VF9MRQkJKDEgPDwgMikKKyNkZWZpbmUgQVJNX1NNTVVfRkVBVF9UVF9CRQkJKDEgPDwgMykKKyNk ZWZpbmUgQVJNX1NNTVVfRkVBVF9QUkkJCSgxIDw8IDQpCisjZGVmaW5lIEFSTV9TTU1VX0ZFQVRf QVRTCQkoMSA8PCA1KQorI2RlZmluZSBBUk1fU01NVV9GRUFUX1NFVgkJKDEgPDwgNikKKyNkZWZp bmUgQVJNX1NNTVVfRkVBVF9NU0kJCSgxIDw8IDcpCisjZGVmaW5lIEFSTV9TTU1VX0ZFQVRfQ09I RVJFTkNZCQkoMSA8PCA4KQorI2RlZmluZSBBUk1fU01NVV9GRUFUX1RSQU5TX1MxCQkoMSA8PCA5 KQorI2RlZmluZSBBUk1fU01NVV9GRUFUX1RSQU5TX1MyCQkoMSA8PCAxMCkKKyNkZWZpbmUgQVJN X1NNTVVfRkVBVF9TVEFMTFMJCSgxIDw8IDExKQorI2RlZmluZSBBUk1fU01NVV9GRUFUX0hZUAkJ KDEgPDwgMTIpCisJdTMyCQkJCWZlYXR1cmVzOworCisjZGVmaW5lIEFSTV9TTU1VX09QVF9TS0lQ X1BSRUZFVENICSgxIDw8IDApCisjZGVmaW5lIEFSTV9TTU1VX09QVF9QQUdFMF9SRUdTX09OTFkJ KDEgPDwgMSkKKwl1MzIJCQkJb3B0aW9uczsKKworCXN0cnVjdCBhcm1fc21tdV9jbWRxCQljbWRx OworCXN0cnVjdCBhcm1fc21tdV9ldnRxCQlldnRxOworCXN0cnVjdCBhcm1fc21tdV9wcmlxCQlw cmlxOworCisJaW50CQkJCWdlcnJfaXJxOworCWludAkJCQljb21iaW5lZF9pcnE7CisKKwl1bnNp Z25lZCBsb25nCQkJaWFzOyAvKiBJUEEgKi8KKwl1bnNpZ25lZCBsb25nCQkJb2FzOyAvKiBQQSAq LworCXVuc2lnbmVkIGxvbmcJCQlwZ3NpemVfYml0bWFwOworCisjZGVmaW5lIEFSTV9TTU1VX01B WF9BU0lEUwkJKDEgPDwgMTYpCisJdW5zaWduZWQgaW50CQkJYXNpZF9iaXRzOworCURFQ0xBUkVf QklUTUFQKGFzaWRfbWFwLCBBUk1fU01NVV9NQVhfQVNJRFMpOworCisjZGVmaW5lIEFSTV9TTU1V X01BWF9WTUlEUwkJKDEgPDwgMTYpCisJdW5zaWduZWQgaW50CQkJdm1pZF9iaXRzOworCURFQ0xB UkVfQklUTUFQKHZtaWRfbWFwLCBBUk1fU01NVV9NQVhfVk1JRFMpOworCisJdW5zaWduZWQgaW50 CQkJc3NpZF9iaXRzOworCXVuc2lnbmVkIGludAkJCXNpZF9iaXRzOworCisJc3RydWN0IGFybV9z bW11X3N0cnRhYl9jZmcJc3RydGFiX2NmZzsKKworCS8qIElPTU1VIGNvcmUgY29kZSBoYW5kbGUg Ki8KKwlzdHJ1Y3QgaW9tbXVfZGV2aWNlCQlpb21tdTsKK307CisKKy8qIFNNTVUgcHJpdmF0ZSBk YXRhIGZvciBlYWNoIG1hc3RlciAqLworc3RydWN0IGFybV9zbW11X21hc3Rlcl9kYXRhIHsKKwlz dHJ1Y3QgYXJtX3NtbXVfZGV2aWNlCQkqc21tdTsKKwlzdHJ1Y3QgYXJtX3NtbXVfc3RydGFiX2Vu dAlzdGU7Cit9OworCisvKiBTTU1VIHByaXZhdGUgZGF0YSBmb3IgYW4gSU9NTVUgZG9tYWluICov CitlbnVtIGFybV9zbW11X2RvbWFpbl9zdGFnZSB7CisJQVJNX1NNTVVfRE9NQUlOX1MxID0gMCwK KwlBUk1fU01NVV9ET01BSU5fUzIsCisJQVJNX1NNTVVfRE9NQUlOX05FU1RFRCwKKwlBUk1fU01N VV9ET01BSU5fQllQQVNTLAorfTsKKworc3RydWN0IGFybV9zbW11X2RvbWFpbiB7CisJc3RydWN0 IGFybV9zbW11X2RldmljZQkJKnNtbXU7CisJc3RydWN0IG11dGV4CQkJaW5pdF9tdXRleDsgLyog UHJvdGVjdHMgc21tdSBwb2ludGVyICovCisKKwlzdHJ1Y3QgaW9fcGd0YWJsZV9vcHMJCSpwZ3Ri bF9vcHM7CisKKwllbnVtIGFybV9zbW11X2RvbWFpbl9zdGFnZQlzdGFnZTsKKwl1bmlvbiB7CisJ CXN0cnVjdCBhcm1fc21tdV9zMV9jZmcJczFfY2ZnOworCQlzdHJ1Y3QgYXJtX3NtbXVfczJfY2Zn CXMyX2NmZzsKKwl9OworCisJc3RydWN0IGlvbW11X2RvbWFpbgkJZG9tYWluOworfTsKKworc3Ry dWN0IGFybV9zbW11X29wdGlvbl9wcm9wIHsKKwl1MzIgb3B0OworCWNvbnN0IGNoYXIgKnByb3A7 Cit9OworCitzdGF0aWMgc3RydWN0IGFybV9zbW11X29wdGlvbl9wcm9wIGFybV9zbW11X29wdGlv bnNbXSA9IHsKKwl7IEFSTV9TTU1VX09QVF9TS0lQX1BSRUZFVENILCAiaGlzaWxpY29uLGJyb2tl bi1wcmVmZXRjaC1jbWQiIH0sCisJeyBBUk1fU01NVV9PUFRfUEFHRTBfUkVHU19PTkxZLCAiY2F2 aXVtLGNuOTkwMC1icm9rZW4tcGFnZTEtcmVnc3BhY2UifSwKKwl7IDAsIE5VTEx9LAorfTsKKwor c3RhdGljIGlubGluZSB2b2lkIF9faW9tZW0gKmFybV9zbW11X3BhZ2UxX2ZpeHVwKHVuc2lnbmVk IGxvbmcgb2Zmc2V0LAorCQkJCQkJIHN0cnVjdCBhcm1fc21tdV9kZXZpY2UgKnNtbXUpCit7CisJ aWYgKChvZmZzZXQgPiBTWl82NEspICYmCisJICAgIChzbW11LT5vcHRpb25zICYgQVJNX1NNTVVf T1BUX1BBR0UwX1JFR1NfT05MWSkpCisJCW9mZnNldCAtPSBTWl82NEs7CisKKwlyZXR1cm4gc21t dS0+YmFzZSArIG9mZnNldDsKK30KKworc3RhdGljIHN0cnVjdCBhcm1fc21tdV9kb21haW4gKnRv X3NtbXVfZG9tYWluKHN0cnVjdCBpb21tdV9kb21haW4gKmRvbSkKK3sKKwlyZXR1cm4gY29udGFp bmVyX29mKGRvbSwgc3RydWN0IGFybV9zbW11X2RvbWFpbiwgZG9tYWluKTsKK30KKworc3RhdGlj IHZvaWQgcGFyc2VfZHJpdmVyX29wdGlvbnMoc3RydWN0IGFybV9zbW11X2RldmljZSAqc21tdSkK K3sKKwlpbnQgaSA9IDA7CisKKwlkbyB7CisJCWlmIChvZl9wcm9wZXJ0eV9yZWFkX2Jvb2woc21t dS0+ZGV2LT5vZl9ub2RlLAorCQkJCQkJYXJtX3NtbXVfb3B0aW9uc1tpXS5wcm9wKSkgeworCQkJ c21tdS0+b3B0aW9ucyB8PSBhcm1fc21tdV9vcHRpb25zW2ldLm9wdDsKKwkJCWRldl9ub3RpY2Uo c21tdS0+ZGV2LCAib3B0aW9uICVzXG4iLAorCQkJCWFybV9zbW11X29wdGlvbnNbaV0ucHJvcCk7 CisJCX0KKwl9IHdoaWxlIChhcm1fc21tdV9vcHRpb25zWysraV0ub3B0KTsKK30KKworLyogTG93 LWxldmVsIHF1ZXVlIG1hbmlwdWxhdGlvbiBmdW5jdGlvbnMgKi8KK3N0YXRpYyBib29sIHF1ZXVl X2Z1bGwoc3RydWN0IGFybV9zbW11X3F1ZXVlICpxKQoreworCXJldHVybiBRX0lEWChxLCBxLT5w cm9kKSA9PSBRX0lEWChxLCBxLT5jb25zKSAmJgorCSAgICAgICBRX1dSUChxLCBxLT5wcm9kKSAh PSBRX1dSUChxLCBxLT5jb25zKTsKK30KKworc3RhdGljIGJvb2wgcXVldWVfZW1wdHkoc3RydWN0 IGFybV9zbW11X3F1ZXVlICpxKQoreworCXJldHVybiBRX0lEWChxLCBxLT5wcm9kKSA9PSBRX0lE WChxLCBxLT5jb25zKSAmJgorCSAgICAgICBRX1dSUChxLCBxLT5wcm9kKSA9PSBRX1dSUChxLCBx LT5jb25zKTsKK30KKworc3RhdGljIHZvaWQgcXVldWVfc3luY19jb25zKHN0cnVjdCBhcm1fc21t dV9xdWV1ZSAqcSkKK3sKKwlxLT5jb25zID0gcmVhZGxfcmVsYXhlZChxLT5jb25zX3JlZyk7Cit9 CisKK3N0YXRpYyB2b2lkIHF1ZXVlX2luY19jb25zKHN0cnVjdCBhcm1fc21tdV9xdWV1ZSAqcSkK K3sKKwl1MzIgY29ucyA9IChRX1dSUChxLCBxLT5jb25zKSB8IFFfSURYKHEsIHEtPmNvbnMpKSAr IDE7CisKKwlxLT5jb25zID0gUV9PVkYocSwgcS0+Y29ucykgfCBRX1dSUChxLCBjb25zKSB8IFFf SURYKHEsIGNvbnMpOworCXdyaXRlbChxLT5jb25zLCBxLT5jb25zX3JlZyk7Cit9CisKK3N0YXRp YyBpbnQgcXVldWVfc3luY19wcm9kKHN0cnVjdCBhcm1fc21tdV9xdWV1ZSAqcSkKK3sKKwlpbnQg cmV0ID0gMDsKKwl1MzIgcHJvZCA9IHJlYWRsX3JlbGF4ZWQocS0+cHJvZF9yZWcpOworCisJaWYg KFFfT1ZGKHEsIHByb2QpICE9IFFfT1ZGKHEsIHEtPnByb2QpKQorCQlyZXQgPSAtRU9WRVJGTE9X OworCisJcS0+cHJvZCA9IHByb2Q7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgcXVl dWVfaW5jX3Byb2Qoc3RydWN0IGFybV9zbW11X3F1ZXVlICpxKQoreworCXUzMiBwcm9kID0gKFFf V1JQKHEsIHEtPnByb2QpIHwgUV9JRFgocSwgcS0+cHJvZCkpICsgMTsKKworCXEtPnByb2QgPSBR X09WRihxLCBxLT5wcm9kKSB8IFFfV1JQKHEsIHByb2QpIHwgUV9JRFgocSwgcHJvZCk7CisJd3Jp dGVsKHEtPnByb2QsIHEtPnByb2RfcmVnKTsKK30KKworLyoKKyAqIFdhaXQgZm9yIHRoZSBTTU1V IHRvIGNvbnN1bWUgaXRlbXMuIElmIGRyYWluIGlzIHRydWUsIHdhaXQgdW50aWwgdGhlIHF1ZXVl CisgKiBpcyBlbXB0eS4gT3RoZXJ3aXNlLCB3YWl0IHVudGlsIHRoZXJlIGlzIGF0IGxlYXN0IG9u ZSBmcmVlIHNsb3QuCisgKi8KK3N0YXRpYyBpbnQgcXVldWVfcG9sbF9jb25zKHN0cnVjdCBhcm1f c21tdV9xdWV1ZSAqcSwgYm9vbCBkcmFpbiwgYm9vbCB3ZmUpCit7CisJa3RpbWVfdCB0aW1lb3V0 OworCXVuc2lnbmVkIGludCBkZWxheSA9IDE7CisKKwkvKiBXYWl0IGxvbmdlciBpZiBpdCdzIHF1 ZXVlIGRyYWluICovCisJdGltZW91dCA9IGt0aW1lX2FkZF91cyhrdGltZV9nZXQoKSwgZHJhaW4g PworCQkJCQkgICAgQVJNX1NNTVVfQ01EUV9EUkFJTl9USU1FT1VUX1VTIDoKKwkJCQkJICAgIEFS TV9TTU1VX1BPTExfVElNRU9VVF9VUyk7CisKKwl3aGlsZSAocXVldWVfc3luY19jb25zKHEpLCAo ZHJhaW4gPyAhcXVldWVfZW1wdHkocSkgOiBxdWV1ZV9mdWxsKHEpKSkgeworCQlpZiAoa3RpbWVf Y29tcGFyZShrdGltZV9nZXQoKSwgdGltZW91dCkgPiAwKQorCQkJcmV0dXJuIC1FVElNRURPVVQ7 CisKKwkJaWYgKHdmZSkgeworCQkJd2ZlKCk7CisJCX0gZWxzZSB7CisJCQljcHVfcmVsYXgoKTsK KwkJCXVkZWxheShkZWxheSk7CisJCQlkZWxheSAqPSAyOworCQl9CisJfQorCisJcmV0dXJuIDA7 Cit9CisKK3N0YXRpYyB2b2lkIHF1ZXVlX3dyaXRlKF9fbGU2NCAqZHN0LCB1NjQgKnNyYywgc2l6 ZV90IG5fZHdvcmRzKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IG5fZHdvcmRzOyAr K2kpCisJCSpkc3QrKyA9IGNwdV90b19sZTY0KCpzcmMrKyk7Cit9CisKK3N0YXRpYyBpbnQgcXVl dWVfaW5zZXJ0X3JhdyhzdHJ1Y3QgYXJtX3NtbXVfcXVldWUgKnEsIHU2NCAqZW50KQoreworCWlm IChxdWV1ZV9mdWxsKHEpKQorCQlyZXR1cm4gLUVOT1NQQzsKKworCXF1ZXVlX3dyaXRlKFFfRU5U KHEsIHEtPnByb2QpLCBlbnQsIHEtPmVudF9kd29yZHMpOworCXF1ZXVlX2luY19wcm9kKHEpOwor CXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBxdWV1ZV9yZWFkKF9fbGU2NCAqZHN0LCB1NjQg KnNyYywgc2l6ZV90IG5fZHdvcmRzKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IG5f ZHdvcmRzOyArK2kpCisJCSpkc3QrKyA9IGxlNjRfdG9fY3B1KCpzcmMrKyk7Cit9CisKK3N0YXRp YyBpbnQgcXVldWVfcmVtb3ZlX3JhdyhzdHJ1Y3QgYXJtX3NtbXVfcXVldWUgKnEsIHU2NCAqZW50 KQoreworCWlmIChxdWV1ZV9lbXB0eShxKSkKKwkJcmV0dXJuIC1FQUdBSU47CisKKwlxdWV1ZV9y ZWFkKGVudCwgUV9FTlQocSwgcS0+Y29ucyksIHEtPmVudF9kd29yZHMpOworCXF1ZXVlX2luY19j b25zKHEpOworCXJldHVybiAwOworfQorCisvKiBIaWdoLWxldmVsIHF1ZXVlIGFjY2Vzc29ycyAq Lworc3RhdGljIGludCBhcm1fc21tdV9jbWRxX2J1aWxkX2NtZCh1NjQgKmNtZCwgc3RydWN0IGFy bV9zbW11X2NtZHFfZW50ICplbnQpCit7CisJbWVtc2V0KGNtZCwgMCwgQ01EUV9FTlRfRFdPUkRT IDw8IDMpOworCWNtZFswXSB8PSAoZW50LT5vcGNvZGUgJiBDTURRXzBfT1BfTUFTSykgPDwgQ01E UV8wX09QX1NISUZUOworCisJc3dpdGNoIChlbnQtPm9wY29kZSkgeworCWNhc2UgQ01EUV9PUF9U TEJJX0VMMl9BTEw6CisJY2FzZSBDTURRX09QX1RMQklfTlNOSF9BTEw6CisJCWJyZWFrOworCWNh c2UgQ01EUV9PUF9QUkVGRVRDSF9DRkc6CisJCWNtZFswXSB8PSAodTY0KWVudC0+cHJlZmV0Y2gu c2lkIDw8IENNRFFfUFJFRkVUQ0hfMF9TSURfU0hJRlQ7CisJCWNtZFsxXSB8PSBlbnQtPnByZWZl dGNoLnNpemUgPDwgQ01EUV9QUkVGRVRDSF8xX1NJWkVfU0hJRlQ7CisJCWNtZFsxXSB8PSBlbnQt PnByZWZldGNoLmFkZHIgJiBDTURRX1BSRUZFVENIXzFfQUREUl9NQVNLOworCQlicmVhazsKKwlj YXNlIENNRFFfT1BfQ0ZHSV9TVEU6CisJCWNtZFswXSB8PSAodTY0KWVudC0+Y2ZnaS5zaWQgPDwg Q01EUV9DRkdJXzBfU0lEX1NISUZUOworCQljbWRbMV0gfD0gZW50LT5jZmdpLmxlYWYgPyBDTURR X0NGR0lfMV9MRUFGIDogMDsKKwkJYnJlYWs7CisJY2FzZSBDTURRX09QX0NGR0lfQUxMOgorCQkv KiBDb3ZlciB0aGUgZW50aXJlIFNJRCByYW5nZSAqLworCQljbWRbMV0gfD0gQ01EUV9DRkdJXzFf UkFOR0VfTUFTSyA8PCBDTURRX0NGR0lfMV9SQU5HRV9TSElGVDsKKwkJYnJlYWs7CisJY2FzZSBD TURRX09QX1RMQklfTkhfVkE6CisJCWNtZFswXSB8PSAodTY0KWVudC0+dGxiaS5hc2lkIDw8IENN RFFfVExCSV8wX0FTSURfU0hJRlQ7CisJCWNtZFsxXSB8PSBlbnQtPnRsYmkubGVhZiA/IENNRFFf VExCSV8xX0xFQUYgOiAwOworCQljbWRbMV0gfD0gZW50LT50bGJpLmFkZHIgJiBDTURRX1RMQklf MV9WQV9NQVNLOworCQlicmVhazsKKwljYXNlIENNRFFfT1BfVExCSV9TMl9JUEE6CisJCWNtZFsw XSB8PSAodTY0KWVudC0+dGxiaS52bWlkIDw8IENNRFFfVExCSV8wX1ZNSURfU0hJRlQ7CisJCWNt ZFsxXSB8PSBlbnQtPnRsYmkubGVhZiA/IENNRFFfVExCSV8xX0xFQUYgOiAwOworCQljbWRbMV0g fD0gZW50LT50bGJpLmFkZHIgJiBDTURRX1RMQklfMV9JUEFfTUFTSzsKKwkJYnJlYWs7CisJY2Fz ZSBDTURRX09QX1RMQklfTkhfQVNJRDoKKwkJY21kWzBdIHw9ICh1NjQpZW50LT50bGJpLmFzaWQg PDwgQ01EUV9UTEJJXzBfQVNJRF9TSElGVDsKKwkJLyogRmFsbHRocm91Z2ggKi8KKwljYXNlIENN RFFfT1BfVExCSV9TMTJfVk1BTEw6CisJCWNtZFswXSB8PSAodTY0KWVudC0+dGxiaS52bWlkIDw8 IENNRFFfVExCSV8wX1ZNSURfU0hJRlQ7CisJCWJyZWFrOworCWNhc2UgQ01EUV9PUF9QUklfUkVT UDoKKwkJY21kWzBdIHw9IGVudC0+c3Vic3RyZWFtX3ZhbGlkID8gQ01EUV8wX1NTViA6IDA7CisJ CWNtZFswXSB8PSBlbnQtPnByaS5zc2lkIDw8IENNRFFfUFJJXzBfU1NJRF9TSElGVDsKKwkJY21k WzBdIHw9ICh1NjQpZW50LT5wcmkuc2lkIDw8IENNRFFfUFJJXzBfU0lEX1NISUZUOworCQljbWRb MV0gfD0gZW50LT5wcmkuZ3JwaWQgPDwgQ01EUV9QUklfMV9HUlBJRF9TSElGVDsKKwkJc3dpdGNo IChlbnQtPnByaS5yZXNwKSB7CisJCWNhc2UgUFJJX1JFU1BfREVOWToKKwkJCWNtZFsxXSB8PSBD TURRX1BSSV8xX1JFU1BfREVOWTsKKwkJCWJyZWFrOworCQljYXNlIFBSSV9SRVNQX0ZBSUw6CisJ CQljbWRbMV0gfD0gQ01EUV9QUklfMV9SRVNQX0ZBSUw7CisJCQlicmVhazsKKwkJY2FzZSBQUklf UkVTUF9TVUNDOgorCQkJY21kWzFdIHw9IENNRFFfUFJJXzFfUkVTUF9TVUNDOworCQkJYnJlYWs7 CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlicmVhazsKKwljYXNlIENN RFFfT1BfQ01EX1NZTkM6CisJCWNtZFswXSB8PSBDTURRX1NZTkNfMF9DU19TRVY7CisJCWJyZWFr OworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PRU5UOworCX0KKworCXJldHVybiAwOworfQorCitz dGF0aWMgdm9pZCBhcm1fc21tdV9jbWRxX3NraXBfZXJyKHN0cnVjdCBhcm1fc21tdV9kZXZpY2Ug KnNtbXUpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgKmNlcnJvcl9zdHJbXSA9IHsKKwkJW0NNRFFf RVJSX0NFUlJPUl9OT05FX0lEWF0JPSAiTm8gZXJyb3IiLAorCQlbQ01EUV9FUlJfQ0VSUk9SX0lM TF9JRFhdCT0gIklsbGVnYWwgY29tbWFuZCIsCisJCVtDTURRX0VSUl9DRVJST1JfQUJUX0lEWF0J PSAiQWJvcnQgb24gY29tbWFuZCBmZXRjaCIsCisJfTsKKworCWludCBpOworCXU2NCBjbWRbQ01E UV9FTlRfRFdPUkRTXTsKKwlzdHJ1Y3QgYXJtX3NtbXVfcXVldWUgKnEgPSAmc21tdS0+Y21kcS5x OworCXUzMiBjb25zID0gcmVhZGxfcmVsYXhlZChxLT5jb25zX3JlZyk7CisJdTMyIGlkeCA9IGNv bnMgPj4gQ01EUV9FUlJfU0hJRlQgJiBDTURRX0VSUl9NQVNLOworCXN0cnVjdCBhcm1fc21tdV9j bWRxX2VudCBjbWRfc3luYyA9IHsKKwkJLm9wY29kZSA9IENNRFFfT1BfQ01EX1NZTkMsCisJfTsK KworCWRldl9lcnIoc21tdS0+ZGV2LCAiQ01EUSBlcnJvciAoY29ucyAweCUwOHgpOiAlc1xuIiwg Y29ucywKKwkJaWR4IDwgQVJSQVlfU0laRShjZXJyb3Jfc3RyKSA/ICBjZXJyb3Jfc3RyW2lkeF0g OiAiVW5rbm93biIpOworCisJc3dpdGNoIChpZHgpIHsKKwljYXNlIENNRFFfRVJSX0NFUlJPUl9B QlRfSURYOgorCQlkZXZfZXJyKHNtbXUtPmRldiwgInJldHJ5aW5nIGNvbW1hbmQgZmV0Y2hcbiIp OworCWNhc2UgQ01EUV9FUlJfQ0VSUk9SX05PTkVfSURYOgorCQlyZXR1cm47CisJY2FzZSBDTURR X0VSUl9DRVJST1JfSUxMX0lEWDoKKwkJLyogRmFsbHRocm91Z2ggKi8KKwlkZWZhdWx0OgorCQli cmVhazsKKwl9CisKKwkvKgorCSAqIFdlIG1heSBoYXZlIGNvbmN1cnJlbnQgcHJvZHVjZXJzLCBz byB3ZSBuZWVkIHRvIGJlIGNhcmVmdWwKKwkgKiBub3QgdG8gdG91Y2ggYW55IG9mIHRoZSBzaGFk b3cgY21kcSBzdGF0ZS4KKwkgKi8KKwlxdWV1ZV9yZWFkKGNtZCwgUV9FTlQocSwgY29ucyksIHEt PmVudF9kd29yZHMpOworCWRldl9lcnIoc21tdS0+ZGV2LCAic2tpcHBpbmcgY29tbWFuZCBpbiBl cnJvciBzdGF0ZTpcbiIpOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNtZCk7ICsraSkK KwkJZGV2X2VycihzbW11LT5kZXYsICJcdDB4JTAxNmxseFxuIiwgKHVuc2lnbmVkIGxvbmcgbG9u ZyljbWRbaV0pOworCisJLyogQ29udmVydCB0aGUgZXJyb25lb3VzIGNvbW1hbmQgaW50byBhIENN RF9TWU5DICovCisJaWYgKGFybV9zbW11X2NtZHFfYnVpbGRfY21kKGNtZCwgJmNtZF9zeW5jKSkg eworCQlkZXZfZXJyKHNtbXUtPmRldiwgImZhaWxlZCB0byBjb252ZXJ0IHRvIENNRF9TWU5DXG4i KTsKKwkJcmV0dXJuOworCX0KKworCXF1ZXVlX3dyaXRlKFFfRU5UKHEsIGNvbnMpLCBjbWQsIHEt PmVudF9kd29yZHMpOworfQorCitzdGF0aWMgdm9pZCBhcm1fc21tdV9jbWRxX2lzc3VlX2NtZChz dHJ1Y3QgYXJtX3NtbXVfZGV2aWNlICpzbW11LAorCQkJCSAgICBzdHJ1Y3QgYXJtX3NtbXVfY21k cV9lbnQgKmVudCkKK3sKKwl1NjQgY21kW0NNRFFfRU5UX0RXT1JEU107CisJdW5zaWduZWQgbG9u ZyBmbGFnczsKKwlib29sIHdmZSA9ICEhKHNtbXUtPmZlYXR1cmVzICYgQVJNX1NNTVVfRkVBVF9T RVYpOworCXN0cnVjdCBhcm1fc21tdV9xdWV1ZSAqcSA9ICZzbW11LT5jbWRxLnE7CisKKwlpZiAo YXJtX3NtbXVfY21kcV9idWlsZF9jbWQoY21kLCBlbnQpKSB7CisJCWRldl93YXJuKHNtbXUtPmRl diwgImlnbm9yaW5nIHVua25vd24gQ01EUSBvcGNvZGUgMHgleFxuIiwKKwkJCSBlbnQtPm9wY29k ZSk7CisJCXJldHVybjsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc21tdS0+Y21kcS5sb2Nr LCBmbGFncyk7CisJd2hpbGUgKHF1ZXVlX2luc2VydF9yYXcocSwgY21kKSA9PSAtRU5PU1BDKSB7 CisJCWlmIChxdWV1ZV9wb2xsX2NvbnMocSwgZmFsc2UsIHdmZSkpCisJCQlkZXZfZXJyX3JhdGVs aW1pdGVkKHNtbXUtPmRldiwgIkNNRFEgdGltZW91dFxuIik7CisJfQorCisJaWYgKGVudC0+b3Bj b2RlID09IENNRFFfT1BfQ01EX1NZTkMgJiYgcXVldWVfcG9sbF9jb25zKHEsIHRydWUsIHdmZSkp CisJCWRldl9lcnJfcmF0ZWxpbWl0ZWQoc21tdS0+ZGV2LCAiQ01EX1NZTkMgdGltZW91dFxuIik7 CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc21tdS0+Y21kcS5sb2NrLCBmbGFncyk7Cit9CisK Ky8qIENvbnRleHQgZGVzY3JpcHRvciBtYW5pcHVsYXRpb24gZnVuY3Rpb25zICovCitzdGF0aWMg dTY0IGFybV9zbW11X2NwdV90Y3JfdG9fY2QodTY0IHRjcikKK3sKKwl1NjQgdmFsID0gMDsKKwor CS8qIFJlcGFjayB0aGUgVENSLiBKdXN0IGNhcmUgYWJvdXQgVFRCUjAgZm9yIG5vdyAqLworCXZh bCB8PSBBUk1fU01NVV9UQ1IyQ0QodGNyLCBUMFNaKTsKKwl2YWwgfD0gQVJNX1NNTVVfVENSMkNE KHRjciwgVEcwKTsKKwl2YWwgfD0gQVJNX1NNTVVfVENSMkNEKHRjciwgSVJHTjApOworCXZhbCB8 PSBBUk1fU01NVV9UQ1IyQ0QodGNyLCBPUkdOMCk7CisJdmFsIHw9IEFSTV9TTU1VX1RDUjJDRCh0 Y3IsIFNIMCk7CisJdmFsIHw9IEFSTV9TTU1VX1RDUjJDRCh0Y3IsIEVQRDApOworCXZhbCB8PSBB Uk1fU01NVV9UQ1IyQ0QodGNyLCBFUEQxKTsKKwl2YWwgfD0gQVJNX1NNTVVfVENSMkNEKHRjciwg SVBTKTsKKwl2YWwgfD0gQVJNX1NNTVVfVENSMkNEKHRjciwgVEJJMCk7CisKKwlyZXR1cm4gdmFs OworfQorCitzdGF0aWMgdm9pZCBhcm1fc21tdV93cml0ZV9jdHhfZGVzYyhzdHJ1Y3QgYXJtX3Nt bXVfZGV2aWNlICpzbW11LAorCQkJCSAgICBzdHJ1Y3QgYXJtX3NtbXVfczFfY2ZnICpjZmcpCit7 CisJdTY0IHZhbDsKKworCS8qCisJICogV2UgZG9uJ3QgbmVlZCB0byBpc3N1ZSBhbnkgaW52YWxp ZGF0aW9uIGhlcmUsIGFzIHdlJ2xsIGludmFsaWRhdGUKKwkgKiB0aGUgU1RFIHdoZW4gaW5zdGFs bGluZyB0aGUgbmV3IGVudHJ5IGFueXdheS4KKwkgKi8KKwl2YWwgPSBhcm1fc21tdV9jcHVfdGNy X3RvX2NkKGNmZy0+Y2QudGNyKSB8CisjaWZkZWYgX19CSUdfRU5ESUFOCisJICAgICAgQ1RYREVT Q19DRF8wX0VOREkgfAorI2VuZGlmCisJICAgICAgQ1RYREVTQ19DRF8wX1IgfCBDVFhERVNDX0NE XzBfQSB8IENUWERFU0NfQ0RfMF9BU0VUX1BSSVZBVEUgfAorCSAgICAgIENUWERFU0NfQ0RfMF9B QTY0IHwgKHU2NCljZmctPmNkLmFzaWQgPDwgQ1RYREVTQ19DRF8wX0FTSURfU0hJRlQgfAorCSAg ICAgIENUWERFU0NfQ0RfMF9WOworCWNmZy0+Y2RwdHJbMF0gPSBjcHVfdG9fbGU2NCh2YWwpOwor CisJdmFsID0gY2ZnLT5jZC50dGJyICYgQ1RYREVTQ19DRF8xX1RUQjBfTUFTSyA8PCBDVFhERVND X0NEXzFfVFRCMF9TSElGVDsKKwljZmctPmNkcHRyWzFdID0gY3B1X3RvX2xlNjQodmFsKTsKKwor CWNmZy0+Y2RwdHJbM10gPSBjcHVfdG9fbGU2NChjZmctPmNkLm1haXIgPDwgQ1RYREVTQ19DRF8z X01BSVJfU0hJRlQpOworfQorCisvKiBTdHJlYW0gdGFibGUgbWFuaXB1bGF0aW9uIGZ1bmN0aW9u cyAqLworc3RhdGljIHZvaWQKK2FybV9zbW11X3dyaXRlX3N0cnRhYl9sMV9kZXNjKF9fbGU2NCAq ZHN0LCBzdHJ1Y3QgYXJtX3NtbXVfc3RydGFiX2wxX2Rlc2MgKmRlc2MpCit7CisJdTY0IHZhbCA9 IDA7CisKKwl2YWwgfD0gKGRlc2MtPnNwYW4gJiBTVFJUQUJfTDFfREVTQ19TUEFOX01BU0spCisJ CTw8IFNUUlRBQl9MMV9ERVNDX1NQQU5fU0hJRlQ7CisJdmFsIHw9IGRlc2MtPmwycHRyX2RtYSAm CisJICAgICAgIFNUUlRBQl9MMV9ERVNDX0wyUFRSX01BU0sgPDwgU1RSVEFCX0wxX0RFU0NfTDJQ VFJfU0hJRlQ7CisKKwkqZHN0ID0gY3B1X3RvX2xlNjQodmFsKTsKK30KKworc3RhdGljIHZvaWQg YXJtX3NtbXVfc3luY19zdGVfZm9yX3NpZChzdHJ1Y3QgYXJtX3NtbXVfZGV2aWNlICpzbW11LCB1 MzIgc2lkKQoreworCXN0cnVjdCBhcm1fc21tdV9jbWRxX2VudCBjbWQgPSB7CisJCS5vcGNvZGUJ PSBDTURRX09QX0NGR0lfU1RFLAorCQkuY2ZnaQk9IHsKKwkJCS5zaWQJPSBzaWQsCisJCQkubGVh Zgk9IHRydWUsCisJCX0sCisJfTsKKworCWFybV9zbW11X2NtZHFfaXNzdWVfY21kKHNtbXUsICZj bWQpOworCWNtZC5vcGNvZGUgPSBDTURRX09QX0NNRF9TWU5DOworCWFybV9zbW11X2NtZHFfaXNz dWVfY21kKHNtbXUsICZjbWQpOworfQorCitzdGF0aWMgdm9pZCBhcm1fc21tdV93cml0ZV9zdHJ0 YWJfZW50KHN0cnVjdCBhcm1fc21tdV9kZXZpY2UgKnNtbXUsIHUzMiBzaWQsCisJCQkJICAgICAg X19sZTY0ICpkc3QsIHN0cnVjdCBhcm1fc21tdV9zdHJ0YWJfZW50ICpzdGUpCit7CisJLyoKKwkg KiBUaGlzIGlzIGhpZGVvdXNseSBjb21wbGljYXRlZCwgYnV0IHdlIG9ubHkgcmVhbGx5IGNhcmUg YWJvdXQKKwkgKiB0aHJlZSBjYXNlcyBhdCB0aGUgbW9tZW50OgorCSAqCisJICogMS4gSW52YWxp ZCAoYWxsIHplcm8pIC0+IGJ5cGFzcy9mYXVsdCAoaW5pdCkKKwkgKiAyLiBCeXBhc3MvZmF1bHQg LT4gdHJhbnNsYXRpb24vYnlwYXNzIChhdHRhY2gpCisJICogMy4gVHJhbnNsYXRpb24vYnlwYXNz IC0+IGJ5cGFzcy9mYXVsdCAoZGV0YWNoKQorCSAqCisJICogR2l2ZW4gdGhhdCB3ZSBjYW4ndCB1 cGRhdGUgdGhlIFNURSBhdG9taWNhbGx5IGFuZCB0aGUgU01NVQorCSAqIGRvZXNuJ3QgcmVhZCB0 aGUgdGhpbmcgaW4gYSBkZWZpbmVkIG9yZGVyLCB0aGF0IGxlYXZlcyB1cworCSAqIHdpdGggdGhl IGZvbGxvd2luZyBtYWludGVuYW5jZSByZXF1aXJlbWVudHM6CisJICoKKwkgKiAxLiBVcGRhdGUg Q29uZmlnLCByZXR1cm4gKGluaXQgdGltZSBTVEVzIGFyZW4ndCBsaXZlKQorCSAqIDIuIFdyaXRl IGV2ZXJ5dGhpbmcgYXBhcnQgZnJvbSBkd29yZCAwLCBzeW5jLCB3cml0ZSBkd29yZCAwLCBzeW5j CisJICogMy4gVXBkYXRlIENvbmZpZywgc3luYworCSAqLworCXU2NCB2YWwgPSBsZTY0X3RvX2Nw dShkc3RbMF0pOworCWJvb2wgc3RlX2xpdmUgPSBmYWxzZTsKKwlzdHJ1Y3QgYXJtX3NtbXVfY21k cV9lbnQgcHJlZmV0Y2hfY21kID0geworCQkub3Bjb2RlCQk9IENNRFFfT1BfUFJFRkVUQ0hfQ0ZH LAorCQkucHJlZmV0Y2gJPSB7CisJCQkuc2lkCT0gc2lkLAorCQl9LAorCX07CisKKwlpZiAodmFs ICYgU1RSVEFCX1NURV8wX1YpIHsKKwkJdTY0IGNmZzsKKworCQljZmcgPSB2YWwgJiBTVFJUQUJf U1RFXzBfQ0ZHX01BU0sgPDwgU1RSVEFCX1NURV8wX0NGR19TSElGVDsKKwkJc3dpdGNoIChjZmcp IHsKKwkJY2FzZSBTVFJUQUJfU1RFXzBfQ0ZHX0JZUEFTUzoKKwkJCWJyZWFrOworCQljYXNlIFNU UlRBQl9TVEVfMF9DRkdfUzFfVFJBTlM6CisJCWNhc2UgU1RSVEFCX1NURV8wX0NGR19TMl9UUkFO UzoKKwkJCXN0ZV9saXZlID0gdHJ1ZTsKKwkJCWJyZWFrOworCQljYXNlIFNUUlRBQl9TVEVfMF9D RkdfQUJPUlQ6CisJCQlpZiAoZGlzYWJsZV9ieXBhc3MpCisJCQkJYnJlYWs7CisJCWRlZmF1bHQ6 CisJCQlCVUcoKTsgLyogU1RFIGNvcnJ1cHRpb24gKi8KKwkJfQorCX0KKworCS8qIE51a2UgdGhl IGV4aXN0aW5nIFNURV8wIHZhbHVlLCBhcyB3ZSdyZSBnb2luZyB0byByZXdyaXRlIGl0ICovCisJ dmFsID0gU1RSVEFCX1NURV8wX1Y7CisKKwkvKiBCeXBhc3MvZmF1bHQgKi8KKwlpZiAoIXN0ZS0+ YXNzaWduZWQgfHwgIShzdGUtPnMxX2NmZyB8fCBzdGUtPnMyX2NmZykpIHsKKwkJaWYgKCFzdGUt PmFzc2lnbmVkICYmIGRpc2FibGVfYnlwYXNzKQorCQkJdmFsIHw9IFNUUlRBQl9TVEVfMF9DRkdf QUJPUlQ7CisJCWVsc2UKKwkJCXZhbCB8PSBTVFJUQUJfU1RFXzBfQ0ZHX0JZUEFTUzsKKworCQlk c3RbMF0gPSBjcHVfdG9fbGU2NCh2YWwpOworCQlkc3RbMV0gPSBjcHVfdG9fbGU2NChTVFJUQUJf U1RFXzFfU0hDRkdfSU5DT01JTkcKKwkJCSA8PCBTVFJUQUJfU1RFXzFfU0hDRkdfU0hJRlQpOwor CQlkc3RbMl0gPSAwOyAvKiBOdWtlIHRoZSBWTUlEICovCisJCWlmIChzdGVfbGl2ZSkKKwkJCWFy bV9zbW11X3N5bmNfc3RlX2Zvcl9zaWQoc21tdSwgc2lkKTsKKwkJcmV0dXJuOworCX0KKworCWlm IChzdGUtPnMxX2NmZykgeworCQlCVUdfT04oc3RlX2xpdmUpOworCQlkc3RbMV0gPSBjcHVfdG9f bGU2NCgKKwkJCSBTVFJUQUJfU1RFXzFfUzFDX0NBQ0hFX1dCUkEKKwkJCSA8PCBTVFJUQUJfU1RF XzFfUzFDSVJfU0hJRlQgfAorCQkJIFNUUlRBQl9TVEVfMV9TMUNfQ0FDSEVfV0JSQQorCQkJIDw8 IFNUUlRBQl9TVEVfMV9TMUNPUl9TSElGVCB8CisJCQkgU1RSVEFCX1NURV8xX1MxQ19TSF9JU0gg PDwgU1RSVEFCX1NURV8xX1MxQ1NIX1NISUZUIHwKKyNpZmRlZiBDT05GSUdfUENJX0FUUworCQkJ IFNUUlRBQl9TVEVfMV9FQVRTX1RSQU5TIDw8IFNUUlRBQl9TVEVfMV9FQVRTX1NISUZUIHwKKyNl bmRpZgorCQkJIFNUUlRBQl9TVEVfMV9TVFJXX05TRUwxIDw8IFNUUlRBQl9TVEVfMV9TVFJXX1NI SUZUKTsKKworCQlpZiAoc21tdS0+ZmVhdHVyZXMgJiBBUk1fU01NVV9GRUFUX1NUQUxMUykKKwkJ CWRzdFsxXSB8PSBjcHVfdG9fbGU2NChTVFJUQUJfU1RFXzFfUzFTVEFMTEQpOworCisJCXZhbCB8 PSAoc3RlLT5zMV9jZmctPmNkcHRyX2RtYSAmIFNUUlRBQl9TVEVfMF9TMUNUWFBUUl9NQVNLCisJ CSAgICAgICAgPDwgU1RSVEFCX1NURV8wX1MxQ1RYUFRSX1NISUZUKSB8CisJCQlTVFJUQUJfU1RF XzBfQ0ZHX1MxX1RSQU5TOworCX0KKworCWlmIChzdGUtPnMyX2NmZykgeworCQlCVUdfT04oc3Rl X2xpdmUpOworCQlkc3RbMl0gPSBjcHVfdG9fbGU2NCgKKwkJCSBzdGUtPnMyX2NmZy0+dm1pZCA8 PCBTVFJUQUJfU1RFXzJfUzJWTUlEX1NISUZUIHwKKwkJCSAoc3RlLT5zMl9jZmctPnZ0Y3IgJiBT VFJUQUJfU1RFXzJfVlRDUl9NQVNLKQorCQkJICA8PCBTVFJUQUJfU1RFXzJfVlRDUl9TSElGVCB8 CisjaWZkZWYgX19CSUdfRU5ESUFOCisJCQkgU1RSVEFCX1NURV8yX1MyRU5ESSB8CisjZW5kaWYK KwkJCSBTVFJUQUJfU1RFXzJfUzJQVFcgfCBTVFJUQUJfU1RFXzJfUzJBQTY0IHwKKwkJCSBTVFJU QUJfU1RFXzJfUzJSKTsKKworCQlkc3RbM10gPSBjcHVfdG9fbGU2NChzdGUtPnMyX2NmZy0+dnR0 YnIgJgorCQkJIFNUUlRBQl9TVEVfM19TMlRUQl9NQVNLIDw8IFNUUlRBQl9TVEVfM19TMlRUQl9T SElGVCk7CisKKwkJdmFsIHw9IFNUUlRBQl9TVEVfMF9DRkdfUzJfVFJBTlM7CisJfQorCisJYXJt X3NtbXVfc3luY19zdGVfZm9yX3NpZChzbW11LCBzaWQpOworCWRzdFswXSA9IGNwdV90b19sZTY0 KHZhbCk7CisJYXJtX3NtbXVfc3luY19zdGVfZm9yX3NpZChzbW11LCBzaWQpOworCisJLyogSXQn cyBsaWtlbHkgdGhhdCB3ZSdsbCB3YW50IHRvIHVzZSB0aGUgbmV3IFNURSBzb29uICovCisJaWYg KCEoc21tdS0+b3B0aW9ucyAmIEFSTV9TTU1VX09QVF9TS0lQX1BSRUZFVENIKSkKKwkJYXJtX3Nt bXVfY21kcV9pc3N1ZV9jbWQoc21tdSwgJnByZWZldGNoX2NtZCk7Cit9CisKK3N0YXRpYyB2b2lk IGFybV9zbW11X2luaXRfYnlwYXNzX3N0ZXModTY0ICpzdHJ0YWIsIHVuc2lnbmVkIGludCBuZW50 KQoreworCXVuc2lnbmVkIGludCBpOworCXN0cnVjdCBhcm1fc21tdV9zdHJ0YWJfZW50IHN0ZSA9 IHsgLmFzc2lnbmVkID0gZmFsc2UgfTsKKworCWZvciAoaSA9IDA7IGkgPCBuZW50OyArK2kpIHsK KwkJYXJtX3NtbXVfd3JpdGVfc3RydGFiX2VudChOVUxMLCAtMSwgc3RydGFiLCAmc3RlKTsKKwkJ c3RydGFiICs9IFNUUlRBQl9TVEVfRFdPUkRTOworCX0KK30KKworc3RhdGljIGludCBhcm1fc21t dV9pbml0X2wyX3N0cnRhYihzdHJ1Y3QgYXJtX3NtbXVfZGV2aWNlICpzbW11LCB1MzIgc2lkKQor eworCXNpemVfdCBzaXplOworCXZvaWQgKnN0cnRhYjsKKwlzdHJ1Y3QgYXJtX3NtbXVfc3RydGFi X2NmZyAqY2ZnID0gJnNtbXUtPnN0cnRhYl9jZmc7CisJc3RydWN0IGFybV9zbW11X3N0cnRhYl9s MV9kZXNjICpkZXNjID0gJmNmZy0+bDFfZGVzY1tzaWQgPj4gU1RSVEFCX1NQTElUXTsKKworCWlm IChkZXNjLT5sMnB0cikKKwkJcmV0dXJuIDA7CisKKwlzaXplID0gMSA8PCAoU1RSVEFCX1NQTElU ICsgaWxvZzIoU1RSVEFCX1NURV9EV09SRFMpICsgMyk7CisJc3RydGFiID0gJmNmZy0+c3RydGFi WyhzaWQgPj4gU1RSVEFCX1NQTElUKSAqIFNUUlRBQl9MMV9ERVNDX0RXT1JEU107CisKKwlkZXNj LT5zcGFuID0gU1RSVEFCX1NQTElUICsgMTsKKwlkZXNjLT5sMnB0ciA9IGRtYW1fYWxsb2NfY29o ZXJlbnQoc21tdS0+ZGV2LCBzaXplLCAmZGVzYy0+bDJwdHJfZG1hLAorCQkJCQkgIEdGUF9LRVJO RUwgfCBfX0dGUF9aRVJPKTsKKwlpZiAoIWRlc2MtPmwycHRyKSB7CisJCWRldl9lcnIoc21tdS0+ ZGV2LAorCQkJImZhaWxlZCB0byBhbGxvY2F0ZSBsMiBzdHJlYW0gdGFibGUgZm9yIFNJRCAldVxu IiwKKwkJCXNpZCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWFybV9zbW11X2luaXRfYnlw YXNzX3N0ZXMoZGVzYy0+bDJwdHIsIDEgPDwgU1RSVEFCX1NQTElUKTsKKwlhcm1fc21tdV93cml0 ZV9zdHJ0YWJfbDFfZGVzYyhzdHJ0YWIsIGRlc2MpOworCXJldHVybiAwOworfQorCisvKiBJUlEg YW5kIGV2ZW50IGhhbmRsZXJzICovCitzdGF0aWMgaXJxcmV0dXJuX3QgYXJtX3NtbXVfZXZ0cV90 aHJlYWQoaW50IGlycSwgdm9pZCAqZGV2KQoreworCWludCBpOworCXN0cnVjdCBhcm1fc21tdV9k ZXZpY2UgKnNtbXUgPSBkZXY7CisJc3RydWN0IGFybV9zbW11X3F1ZXVlICpxID0gJnNtbXUtPmV2 dHEucTsKKwl1NjQgZXZ0W0VWVFFfRU5UX0RXT1JEU107CisKKwlkbyB7CisJCXdoaWxlICghcXVl dWVfcmVtb3ZlX3JhdyhxLCBldnQpKSB7CisJCQl1OCBpZCA9IGV2dFswXSA+PiBFVlRRXzBfSURf U0hJRlQgJiBFVlRRXzBfSURfTUFTSzsKKworCQkJZGV2X2luZm8oc21tdS0+ZGV2LCAiZXZlbnQg MHglMDJ4IHJlY2VpdmVkOlxuIiwgaWQpOworCQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUo ZXZ0KTsgKytpKQorCQkJCWRldl9pbmZvKHNtbXUtPmRldiwgIlx0MHglMDE2bGx4XG4iLAorCQkJ CQkgKHVuc2lnbmVkIGxvbmcgbG9uZylldnRbaV0pOworCisJCX0KKworCQkvKgorCQkgKiBOb3Qg bXVjaCB3ZSBjYW4gZG8gb24gb3ZlcmZsb3csIHNvIHNjcmVhbSBhbmQgcHJldGVuZCB3ZSdyZQor CQkgKiB0cnlpbmcgaGFyZGVyLgorCQkgKi8KKwkJaWYgKHF1ZXVlX3N5bmNfcHJvZChxKSA9PSAt RU9WRVJGTE9XKQorCQkJZGV2X2VycihzbW11LT5kZXYsICJFVlRRIG92ZXJmbG93IGRldGVjdGVk IC0tIGV2ZW50cyBsb3N0XG4iKTsKKwl9IHdoaWxlICghcXVldWVfZW1wdHkocSkpOworCisJLyog U3luYyBvdXIgb3ZlcmZsb3cgZmxhZywgYXMgd2UgYmVsaWV2ZSB3ZSdyZSB1cCB0byBzcGVlZCAq LworCXEtPmNvbnMgPSBRX09WRihxLCBxLT5wcm9kKSB8IFFfV1JQKHEsIHEtPmNvbnMpIHwgUV9J RFgocSwgcS0+Y29ucyk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgdm9pZCBh cm1fc21tdV9oYW5kbGVfcHByKHN0cnVjdCBhcm1fc21tdV9kZXZpY2UgKnNtbXUsIHU2NCAqZXZ0 KQoreworCXUzMiBzaWQsIHNzaWQ7CisJdTE2IGdycGlkOworCWJvb2wgc3N2LCBsYXN0OworCisJ c2lkID0gZXZ0WzBdID4+IFBSSVFfMF9TSURfU0hJRlQgJiBQUklRXzBfU0lEX01BU0s7CisJc3N2 ID0gZXZ0WzBdICYgUFJJUV8wX1NTSURfVjsKKwlzc2lkID0gc3N2ID8gZXZ0WzBdID4+IFBSSVFf MF9TU0lEX1NISUZUICYgUFJJUV8wX1NTSURfTUFTSyA6IDA7CisJbGFzdCA9IGV2dFswXSAmIFBS SVFfMF9QUkdfTEFTVDsKKwlncnBpZCA9IGV2dFsxXSA+PiBQUklRXzFfUFJHX0lEWF9TSElGVCAm IFBSSVFfMV9QUkdfSURYX01BU0s7CisKKwlkZXZfaW5mbyhzbW11LT5kZXYsICJ1bmV4cGVjdGVk IFBSSSByZXF1ZXN0IHJlY2VpdmVkOlxuIik7CisJZGV2X2luZm8oc21tdS0+ZGV2LAorCQkgIlx0 c2lkIDB4JTA4eC4weCUwNXg6IFsldSVzXSAlc3ByaXZpbGVnZWQgJXMlcyVzIGFjY2VzcyBhdCBp b3ZhIDB4JTAxNmxseFxuIiwKKwkJIHNpZCwgc3NpZCwgZ3JwaWQsIGxhc3QgPyAiTCIgOiAiIiwK KwkJIGV2dFswXSAmIFBSSVFfMF9QRVJNX1BSSVYgPyAiIiA6ICJ1biIsCisJCSBldnRbMF0gJiBQ UklRXzBfUEVSTV9SRUFEID8gIlIiIDogIiIsCisJCSBldnRbMF0gJiBQUklRXzBfUEVSTV9XUklU RSA/ICJXIiA6ICIiLAorCQkgZXZ0WzBdICYgUFJJUV8wX1BFUk1fRVhFQyA/ICJYIiA6ICIiLAor CQkgZXZ0WzFdICYgUFJJUV8xX0FERFJfTUFTSyA8PCBQUklRXzFfQUREUl9TSElGVCk7CisKKwlp ZiAobGFzdCkgeworCQlzdHJ1Y3QgYXJtX3NtbXVfY21kcV9lbnQgY21kID0geworCQkJLm9wY29k ZQkJCT0gQ01EUV9PUF9QUklfUkVTUCwKKwkJCS5zdWJzdHJlYW1fdmFsaWQJPSBzc3YsCisJCQku cHJpCQkJPSB7CisJCQkJLnNpZAk9IHNpZCwKKwkJCQkuc3NpZAk9IHNzaWQsCisJCQkJLmdycGlk CT0gZ3JwaWQsCisJCQkJLnJlc3AJPSBQUklfUkVTUF9ERU5ZLAorCQkJfSwKKwkJfTsKKworCQlh cm1fc21tdV9jbWRxX2lzc3VlX2NtZChzbW11LCAmY21kKTsKKwl9Cit9CisKK3N0YXRpYyBpcnFy ZXR1cm5fdCBhcm1fc21tdV9wcmlxX3RocmVhZChpbnQgaXJxLCB2b2lkICpkZXYpCit7CisJc3Ry dWN0IGFybV9zbW11X2RldmljZSAqc21tdSA9IGRldjsKKwlzdHJ1Y3QgYXJtX3NtbXVfcXVldWUg KnEgPSAmc21tdS0+cHJpcS5xOworCXU2NCBldnRbUFJJUV9FTlRfRFdPUkRTXTsKKworCWRvIHsK KwkJd2hpbGUgKCFxdWV1ZV9yZW1vdmVfcmF3KHEsIGV2dCkpCisJCQlhcm1fc21tdV9oYW5kbGVf cHByKHNtbXUsIGV2dCk7CisKKwkJaWYgKHF1ZXVlX3N5bmNfcHJvZChxKSA9PSAtRU9WRVJGTE9X KQorCQkJZGV2X2VycihzbW11LT5kZXYsICJQUklRIG92ZXJmbG93IGRldGVjdGVkIC0tIHJlcXVl c3RzIGxvc3RcbiIpOworCX0gd2hpbGUgKCFxdWV1ZV9lbXB0eShxKSk7CisKKwkvKiBTeW5jIG91 ciBvdmVyZmxvdyBmbGFnLCBhcyB3ZSBiZWxpZXZlIHdlJ3JlIHVwIHRvIHNwZWVkICovCisJcS0+ Y29ucyA9IFFfT1ZGKHEsIHEtPnByb2QpIHwgUV9XUlAocSwgcS0+Y29ucykgfCBRX0lEWChxLCBx LT5jb25zKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBh cm1fc21tdV9jbWRxX3N5bmNfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXYpCit7CisJLyogV2Ug ZG9uJ3QgYWN0dWFsbHkgdXNlIENNRF9TWU5DIGludGVycnVwdHMgZm9yIGFueXRoaW5nICovCisJ cmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IGFybV9zbW11X2RldmljZV9kaXNh YmxlKHN0cnVjdCBhcm1fc21tdV9kZXZpY2UgKnNtbXUpOworCitzdGF0aWMgaXJxcmV0dXJuX3Qg YXJtX3NtbXVfZ2Vycm9yX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2KQoreworCXUzMiBnZXJy b3IsIGdlcnJvcm4sIGFjdGl2ZTsKKwlzdHJ1Y3QgYXJtX3NtbXVfZGV2aWNlICpzbW11ID0gZGV2 OworCisJZ2Vycm9yID0gcmVhZGxfcmVsYXhlZChzbW11LT5iYXNlICsgQVJNX1NNTVVfR0VSUk9S KTsKKwlnZXJyb3JuID0gcmVhZGxfcmVsYXhlZChzbW11LT5iYXNlICsgQVJNX1NNTVVfR0VSUk9S Tik7CisKKwlhY3RpdmUgPSBnZXJyb3IgXiBnZXJyb3JuOworCWlmICghKGFjdGl2ZSAmIEdFUlJP Ul9FUlJfTUFTSykpCisJCXJldHVybiBJUlFfTk9ORTsgLyogTm8gZXJyb3JzIHBlbmRpbmcgKi8K KworCWRldl93YXJuKHNtbXUtPmRldiwKKwkJICJ1bmV4cGVjdGVkIGdsb2JhbCBlcnJvciByZXBv cnRlZCAoMHglMDh4KSwgdGhpcyBjb3VsZCBiZSBzZXJpb3VzXG4iLAorCQkgYWN0aXZlKTsKKwor CWlmIChhY3RpdmUgJiBHRVJST1JfU0ZNX0VSUikgeworCQlkZXZfZXJyKHNtbXUtPmRldiwgImRl dmljZSBoYXMgZW50ZXJlZCBTZXJ2aWNlIEZhaWx1cmUgTW9kZSFcbiIpOworCQlhcm1fc21tdV9k ZXZpY2VfZGlzYWJsZShzbW11KTsKKwl9CisKKwlpZiAoYWN0aXZlICYgR0VSUk9SX01TSV9HRVJS T1JfQUJUX0VSUikKKwkJZGV2X3dhcm4oc21tdS0+ZGV2LCAiR0VSUk9SIE1TSSB3cml0ZSBhYm9y dGVkXG4iKTsKKworCWlmIChhY3RpdmUgJiBHRVJST1JfTVNJX1BSSVFfQUJUX0VSUikKKwkJZGV2 X3dhcm4oc21tdS0+ZGV2LCAiUFJJUSBNU0kgd3JpdGUgYWJvcnRlZFxuIik7CisKKwlpZiAoYWN0 aXZlICYgR0VSUk9SX01TSV9FVlRRX0FCVF9FUlIpCisJCWRldl93YXJuKHNtbXUtPmRldiwgIkVW VFEgTVNJIHdyaXRlIGFib3J0ZWRcbiIpOworCisJaWYgKGFjdGl2ZSAmIEdFUlJPUl9NU0lfQ01E UV9BQlRfRVJSKSB7CisJCWRldl93YXJuKHNtbXUtPmRldiwgIkNNRFEgTVNJIHdyaXRlIGFib3J0 ZWRcbiIpOworCQlhcm1fc21tdV9jbWRxX3N5bmNfaGFuZGxlcihpcnEsIHNtbXUtPmRldik7CisJ fQorCisJaWYgKGFjdGl2ZSAmIEdFUlJPUl9QUklRX0FCVF9FUlIpCisJCWRldl9lcnIoc21tdS0+ ZGV2LCAiUFJJUSB3cml0ZSBhYm9ydGVkIC0tIGV2ZW50cyBtYXkgaGF2ZSBiZWVuIGxvc3RcbiIp OworCisJaWYgKGFjdGl2ZSAmIEdFUlJPUl9FVlRRX0FCVF9FUlIpCisJCWRldl9lcnIoc21tdS0+ ZGV2LCAiRVZUUSB3cml0ZSBhYm9ydGVkIC0tIGV2ZW50cyBtYXkgaGF2ZSBiZWVuIGxvc3RcbiIp OworCisJaWYgKGFjdGl2ZSAmIEdFUlJPUl9DTURRX0VSUikKKwkJYXJtX3NtbXVfY21kcV9za2lw X2VycihzbW11KTsKKworCXdyaXRlbChnZXJyb3IsIHNtbXUtPmJhc2UgKyBBUk1fU01NVV9HRVJS T1JOKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBhcm1f c21tdV9jb21iaW5lZF9pcnFfdGhyZWFkKGludCBpcnEsIHZvaWQgKmRldikKK3sKKwlzdHJ1Y3Qg YXJtX3NtbXVfZGV2aWNlICpzbW11ID0gZGV2OworCisJYXJtX3NtbXVfZXZ0cV90aHJlYWQoaXJx LCBkZXYpOworCWlmIChzbW11LT5mZWF0dXJlcyAmIEFSTV9TTU1VX0ZFQVRfUFJJKQorCQlhcm1f c21tdV9wcmlxX3RocmVhZChpcnEsIGRldik7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisK K3N0YXRpYyBpcnFyZXR1cm5fdCBhcm1fc21tdV9jb21iaW5lZF9pcnFfaGFuZGxlcihpbnQgaXJx LCB2b2lkICpkZXYpCit7CisJYXJtX3NtbXVfZ2Vycm9yX2hhbmRsZXIoaXJxLCBkZXYpOworCWFy bV9zbW11X2NtZHFfc3luY19oYW5kbGVyKGlycSwgZGV2KTsKKwlyZXR1cm4gSVJRX1dBS0VfVEhS RUFEOworfQorCisvKiBJT19QR1RBQkxFIEFQSSAqLworc3RhdGljIHZvaWQgX19hcm1fc21tdV90 bGJfc3luYyhzdHJ1Y3QgYXJtX3NtbXVfZGV2aWNlICpzbW11KQoreworCXN0cnVjdCBhcm1fc21t dV9jbWRxX2VudCBjbWQ7CisKKwljbWQub3Bjb2RlID0gQ01EUV9PUF9DTURfU1lOQzsKKwlhcm1f c21tdV9jbWRxX2lzc3VlX2NtZChzbW11LCAmY21kKTsKK30KKworc3RhdGljIHZvaWQgYXJtX3Nt bXVfdGxiX3N5bmModm9pZCAqY29va2llKQoreworCXN0cnVjdCBhcm1fc21tdV9kb21haW4gKnNt bXVfZG9tYWluID0gY29va2llOworCV9fYXJtX3NtbXVfdGxiX3N5bmMoc21tdV9kb21haW4tPnNt bXUpOworfQorCitzdGF0aWMgdm9pZCBhcm1fc21tdV90bGJfaW52X2NvbnRleHQodm9pZCAqY29v a2llKQoreworCXN0cnVjdCBhcm1fc21tdV9kb21haW4gKnNtbXVfZG9tYWluID0gY29va2llOwor CXN0cnVjdCBhcm1fc21tdV9kZXZpY2UgKnNtbXUgPSBzbW11X2RvbWFpbi0+c21tdTsKKwlzdHJ1 Y3QgYXJtX3NtbXVfY21kcV9lbnQgY21kOworCisJaWYgKHNtbXVfZG9tYWluLT5zdGFnZSA9PSBB Uk1fU01NVV9ET01BSU5fUzEpIHsKKwkJY21kLm9wY29kZQk9IENNRFFfT1BfVExCSV9OSF9BU0lE OworCQljbWQudGxiaS5hc2lkCT0gc21tdV9kb21haW4tPnMxX2NmZy5jZC5hc2lkOworCQljbWQu dGxiaS52bWlkCT0gMDsKKwl9IGVsc2UgeworCQljbWQub3Bjb2RlCT0gQ01EUV9PUF9UTEJJX1Mx Ml9WTUFMTDsKKwkJY21kLnRsYmkudm1pZAk9IHNtbXVfZG9tYWluLT5zMl9jZmcudm1pZDsKKwl9 CisKKwlhcm1fc21tdV9jbWRxX2lzc3VlX2NtZChzbW11LCAmY21kKTsKKwlfX2FybV9zbW11X3Rs Yl9zeW5jKHNtbXUpOworfQorCitzdGF0aWMgdm9pZCBhcm1fc21tdV90bGJfaW52X3JhbmdlX25v c3luYyh1bnNpZ25lZCBsb25nIGlvdmEsIHNpemVfdCBzaXplLAorCQkJCQkgIHNpemVfdCBncmFu dWxlLCBib29sIGxlYWYsIHZvaWQgKmNvb2tpZSkKK3sKKwlzdHJ1Y3QgYXJtX3NtbXVfZG9tYWlu ICpzbW11X2RvbWFpbiA9IGNvb2tpZTsKKwlzdHJ1Y3QgYXJtX3NtbXVfZGV2aWNlICpzbW11ID0g c21tdV9kb21haW4tPnNtbXU7CisJc3RydWN0IGFybV9zbW11X2NtZHFfZW50IGNtZCA9IHsKKwkJ LnRsYmkgPSB7CisJCQkubGVhZgk9IGxlYWYsCisJCQkuYWRkcgk9IGlvdmEsCisJCX0sCisJfTsK KworCWlmIChzbW11X2RvbWFpbi0+c3RhZ2UgPT0gQVJNX1NNTVVfRE9NQUlOX1MxKSB7CisJCWNt ZC5vcGNvZGUJPSBDTURRX09QX1RMQklfTkhfVkE7CisJCWNtZC50bGJpLmFzaWQJPSBzbW11X2Rv bWFpbi0+czFfY2ZnLmNkLmFzaWQ7CisJfSBlbHNlIHsKKwkJY21kLm9wY29kZQk9IENNRFFfT1Bf VExCSV9TMl9JUEE7CisJCWNtZC50bGJpLnZtaWQJPSBzbW11X2RvbWFpbi0+czJfY2ZnLnZtaWQ7 CisJfQorCisJZG8geworCQlhcm1fc21tdV9jbWRxX2lzc3VlX2NtZChzbW11LCAmY21kKTsKKwkJ Y21kLnRsYmkuYWRkciArPSBncmFudWxlOworCX0gd2hpbGUgKHNpemUgLT0gZ3JhbnVsZSk7Cit9 CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaW9tbXVfZ2F0aGVyX29wcyBhcm1fc21tdV9nYXRoZXJf b3BzID0geworCS50bGJfZmx1c2hfYWxsCT0gYXJtX3NtbXVfdGxiX2ludl9jb250ZXh0LAorCS50 bGJfYWRkX2ZsdXNoCT0gYXJtX3NtbXVfdGxiX2ludl9yYW5nZV9ub3N5bmMsCisJLnRsYl9zeW5j CT0gYXJtX3NtbXVfdGxiX3N5bmMsCit9OworCisvKiBJT01NVSBBUEkgKi8KK3N0YXRpYyBib29s IGFybV9zbW11X2NhcGFibGUoZW51bSBpb21tdV9jYXAgY2FwKQoreworCXN3aXRjaCAoY2FwKSB7 CisJY2FzZSBJT01NVV9DQVBfQ0FDSEVfQ09IRVJFTkNZOgorCQlyZXR1cm4gdHJ1ZTsKKwljYXNl IElPTU1VX0NBUF9OT0VYRUM6CisJCXJldHVybiB0cnVlOworCWRlZmF1bHQ6CisJCXJldHVybiBm YWxzZTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaW9tbXVfZG9tYWluICphcm1fc21tdV9kb21h aW5fYWxsb2ModW5zaWduZWQgdHlwZSkKK3sKKwlzdHJ1Y3QgYXJtX3NtbXVfZG9tYWluICpzbW11 X2RvbWFpbjsKKworCWlmICh0eXBlICE9IElPTU1VX0RPTUFJTl9VTk1BTkFHRUQgJiYKKwkgICAg dHlwZSAhPSBJT01NVV9ET01BSU5fRE1BICYmCisJICAgIHR5cGUgIT0gSU9NTVVfRE9NQUlOX0lE RU5USVRZKQorCQlyZXR1cm4gTlVMTDsKKworCS8qCisJICogQWxsb2NhdGUgdGhlIGRvbWFpbiBh bmQgaW5pdGlhbGlzZSBzb21lIG9mIGl0cyBkYXRhIHN0cnVjdHVyZXMuCisJICogV2UgY2FuJ3Qg cmVhbGx5IGRvIGFueXRoaW5nIG1lYW5pbmdmdWwgdW50aWwgd2UndmUgYWRkZWQgYQorCSAqIG1h c3Rlci4KKwkgKi8KKwlzbW11X2RvbWFpbiA9IGt6YWxsb2Moc2l6ZW9mKCpzbW11X2RvbWFpbiks IEdGUF9LRVJORUwpOworCWlmICghc21tdV9kb21haW4pCisJCXJldHVybiBOVUxMOworCisJaWYg KHR5cGUgPT0gSU9NTVVfRE9NQUlOX0RNQSAmJgorCSAgICBpb21tdV9nZXRfZG1hX2Nvb2tpZSgm c21tdV9kb21haW4tPmRvbWFpbikpIHsKKwkJa2ZyZWUoc21tdV9kb21haW4pOworCQlyZXR1cm4g TlVMTDsKKwl9CisKKwltdXRleF9pbml0KCZzbW11X2RvbWFpbi0+aW5pdF9tdXRleCk7CisJcmV0 dXJuICZzbW11X2RvbWFpbi0+ZG9tYWluOworfQorCitzdGF0aWMgaW50IGFybV9zbW11X2JpdG1h cF9hbGxvYyh1bnNpZ25lZCBsb25nICptYXAsIGludCBzcGFuKQoreworCWludCBpZHgsIHNpemUg PSAxIDw8IHNwYW47CisKKwlkbyB7CisJCWlkeCA9IGZpbmRfZmlyc3RfemVyb19iaXQobWFwLCBz aXplKTsKKwkJaWYgKGlkeCA9PSBzaXplKQorCQkJcmV0dXJuIC1FTk9TUEM7CisJfSB3aGlsZSAo dGVzdF9hbmRfc2V0X2JpdChpZHgsIG1hcCkpOworCisJcmV0dXJuIGlkeDsKK30KKworc3RhdGlj IHZvaWQgYXJtX3NtbXVfYml0bWFwX2ZyZWUodW5zaWduZWQgbG9uZyAqbWFwLCBpbnQgaWR4KQor eworCWNsZWFyX2JpdChpZHgsIG1hcCk7Cit9CisKK3N0YXRpYyB2b2lkIGFybV9zbW11X2RvbWFp bl9mcmVlKHN0cnVjdCBpb21tdV9kb21haW4gKmRvbWFpbikKK3sKKwlzdHJ1Y3QgYXJtX3NtbXVf ZG9tYWluICpzbW11X2RvbWFpbiA9IHRvX3NtbXVfZG9tYWluKGRvbWFpbik7CisJc3RydWN0IGFy bV9zbW11X2RldmljZSAqc21tdSA9IHNtbXVfZG9tYWluLT5zbW11OworCisJaW9tbXVfcHV0X2Rt YV9jb29raWUoZG9tYWluKTsKKwlmcmVlX2lvX3BndGFibGVfb3BzKHNtbXVfZG9tYWluLT5wZ3Ri bF9vcHMpOworCisJLyogRnJlZSB0aGUgQ0QgYW5kIEFTSUQsIGlmIHdlIGFsbG9jYXRlZCB0aGVt ICovCisJaWYgKHNtbXVfZG9tYWluLT5zdGFnZSA9PSBBUk1fU01NVV9ET01BSU5fUzEpIHsKKwkJ c3RydWN0IGFybV9zbW11X3MxX2NmZyAqY2ZnID0gJnNtbXVfZG9tYWluLT5zMV9jZmc7CisKKwkJ aWYgKGNmZy0+Y2RwdHIpIHsKKwkJCWRtYW1fZnJlZV9jb2hlcmVudChzbW11X2RvbWFpbi0+c21t dS0+ZGV2LAorCQkJCQkgICBDVFhERVNDX0NEX0RXT1JEUyA8PCAzLAorCQkJCQkgICBjZmctPmNk cHRyLAorCQkJCQkgICBjZmctPmNkcHRyX2RtYSk7CisKKwkJCWFybV9zbW11X2JpdG1hcF9mcmVl KHNtbXUtPmFzaWRfbWFwLCBjZmctPmNkLmFzaWQpOworCQl9CisJfSBlbHNlIHsKKwkJc3RydWN0 IGFybV9zbW11X3MyX2NmZyAqY2ZnID0gJnNtbXVfZG9tYWluLT5zMl9jZmc7CisJCWlmIChjZmct PnZtaWQpCisJCQlhcm1fc21tdV9iaXRtYXBfZnJlZShzbW11LT52bWlkX21hcCwgY2ZnLT52bWlk KTsKKwl9CisKKwlrZnJlZShzbW11X2RvbWFpbik7Cit9CisKK3N0YXRpYyBpbnQgYXJtX3NtbXVf ZG9tYWluX2ZpbmFsaXNlX3MxKHN0cnVjdCBhcm1fc21tdV9kb21haW4gKnNtbXVfZG9tYWluLAor CQkJCSAgICAgICBzdHJ1Y3QgaW9fcGd0YWJsZV9jZmcgKnBndGJsX2NmZykKK3sKKwlpbnQgcmV0 OworCWludCBhc2lkOworCXN0cnVjdCBhcm1fc21tdV9kZXZpY2UgKnNtbXUgPSBzbW11X2RvbWFp bi0+c21tdTsKKwlzdHJ1Y3QgYXJtX3NtbXVfczFfY2ZnICpjZmcgPSAmc21tdV9kb21haW4tPnMx X2NmZzsKKworCWFzaWQgPSBhcm1fc21tdV9iaXRtYXBfYWxsb2Moc21tdS0+YXNpZF9tYXAsIHNt bXUtPmFzaWRfYml0cyk7CisJaWYgKGFzaWQgPCAwKQorCQlyZXR1cm4gYXNpZDsKKworCWNmZy0+ Y2RwdHIgPSBkbWFtX2FsbG9jX2NvaGVyZW50KHNtbXUtPmRldiwgQ1RYREVTQ19DRF9EV09SRFMg PDwgMywKKwkJCQkJICZjZmctPmNkcHRyX2RtYSwKKwkJCQkJIEdGUF9LRVJORUwgfCBfX0dGUF9a RVJPKTsKKwlpZiAoIWNmZy0+Y2RwdHIpIHsKKwkJZGV2X3dhcm4oc21tdS0+ZGV2LCAiZmFpbGVk IHRvIGFsbG9jYXRlIGNvbnRleHQgZGVzY3JpcHRvclxuIik7CisJCXJldCA9IC1FTk9NRU07CisJ CWdvdG8gb3V0X2ZyZWVfYXNpZDsKKwl9CisKKwljZmctPmNkLmFzaWQJPSAodTE2KWFzaWQ7CisJ Y2ZnLT5jZC50dGJyCT0gcGd0YmxfY2ZnLT5hcm1fbHBhZV9zMV9jZmcudHRiclswXTsKKwljZmct PmNkLnRjcgk9IHBndGJsX2NmZy0+YXJtX2xwYWVfczFfY2ZnLnRjcjsKKwljZmctPmNkLm1haXIJ PSBwZ3RibF9jZmctPmFybV9scGFlX3MxX2NmZy5tYWlyWzBdOworCXJldHVybiAwOworCitvdXRf ZnJlZV9hc2lkOgorCWFybV9zbW11X2JpdG1hcF9mcmVlKHNtbXUtPmFzaWRfbWFwLCBhc2lkKTsK KwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFybV9zbW11X2RvbWFpbl9maW5hbGlzZV9z MihzdHJ1Y3QgYXJtX3NtbXVfZG9tYWluICpzbW11X2RvbWFpbiwKKwkJCQkgICAgICAgc3RydWN0 IGlvX3BndGFibGVfY2ZnICpwZ3RibF9jZmcpCit7CisJaW50IHZtaWQ7CisJc3RydWN0IGFybV9z bW11X2RldmljZSAqc21tdSA9IHNtbXVfZG9tYWluLT5zbW11OworCXN0cnVjdCBhcm1fc21tdV9z Ml9jZmcgKmNmZyA9ICZzbW11X2RvbWFpbi0+czJfY2ZnOworCisJdm1pZCA9IGFybV9zbW11X2Jp dG1hcF9hbGxvYyhzbW11LT52bWlkX21hcCwgc21tdS0+dm1pZF9iaXRzKTsKKwlpZiAodm1pZCA8 IDApCisJCXJldHVybiB2bWlkOworCisJY2ZnLT52bWlkCT0gKHUxNil2bWlkOworCWNmZy0+dnR0 YnIJPSBwZ3RibF9jZmctPmFybV9scGFlX3MyX2NmZy52dHRicjsKKwljZmctPnZ0Y3IJPSBwZ3Ri bF9jZmctPmFybV9scGFlX3MyX2NmZy52dGNyOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50 IGFybV9zbW11X2RvbWFpbl9maW5hbGlzZShzdHJ1Y3QgaW9tbXVfZG9tYWluICpkb21haW4pCit7 CisJaW50IHJldDsKKwl1bnNpZ25lZCBsb25nIGlhcywgb2FzOworCWVudW0gaW9fcGd0YWJsZV9m bXQgZm10OworCXN0cnVjdCBpb19wZ3RhYmxlX2NmZyBwZ3RibF9jZmc7CisJc3RydWN0IGlvX3Bn dGFibGVfb3BzICpwZ3RibF9vcHM7CisJaW50ICgqZmluYWxpc2Vfc3RhZ2VfZm4pKHN0cnVjdCBh cm1fc21tdV9kb21haW4gKiwKKwkJCQkgc3RydWN0IGlvX3BndGFibGVfY2ZnICopOworCXN0cnVj dCBhcm1fc21tdV9kb21haW4gKnNtbXVfZG9tYWluID0gdG9fc21tdV9kb21haW4oZG9tYWluKTsK KwlzdHJ1Y3QgYXJtX3NtbXVfZGV2aWNlICpzbW11ID0gc21tdV9kb21haW4tPnNtbXU7CisKKwlp ZiAoZG9tYWluLT50eXBlID09IElPTU1VX0RPTUFJTl9JREVOVElUWSkgeworCQlzbW11X2RvbWFp bi0+c3RhZ2UgPSBBUk1fU01NVV9ET01BSU5fQllQQVNTOworCQlyZXR1cm4gMDsKKwl9CisKKwkv KiBSZXN0cmljdCB0aGUgc3RhZ2UgdG8gd2hhdCB3ZSBjYW4gYWN0dWFsbHkgc3VwcG9ydCAqLwor CWlmICghKHNtbXUtPmZlYXR1cmVzICYgQVJNX1NNTVVfRkVBVF9UUkFOU19TMSkpCisJCXNtbXVf ZG9tYWluLT5zdGFnZSA9IEFSTV9TTU1VX0RPTUFJTl9TMjsKKwlpZiAoIShzbW11LT5mZWF0dXJl cyAmIEFSTV9TTU1VX0ZFQVRfVFJBTlNfUzIpKQorCQlzbW11X2RvbWFpbi0+c3RhZ2UgPSBBUk1f U01NVV9ET01BSU5fUzE7CisKKwlzd2l0Y2ggKHNtbXVfZG9tYWluLT5zdGFnZSkgeworCWNhc2Ug QVJNX1NNTVVfRE9NQUlOX1MxOgorCQlpYXMgPSBWQV9CSVRTOworCQlvYXMgPSBzbW11LT5pYXM7 CisJCWZtdCA9IEFSTV82NF9MUEFFX1MxOworCQlmaW5hbGlzZV9zdGFnZV9mbiA9IGFybV9zbW11 X2RvbWFpbl9maW5hbGlzZV9zMTsKKwkJYnJlYWs7CisJY2FzZSBBUk1fU01NVV9ET01BSU5fTkVT VEVEOgorCWNhc2UgQVJNX1NNTVVfRE9NQUlOX1MyOgorCQlpYXMgPSBzbW11LT5pYXM7CisJCW9h cyA9IHNtbXUtPm9hczsKKwkJZm10ID0gQVJNXzY0X0xQQUVfUzI7CisJCWZpbmFsaXNlX3N0YWdl X2ZuID0gYXJtX3NtbXVfZG9tYWluX2ZpbmFsaXNlX3MyOworCQlicmVhazsKKwlkZWZhdWx0Ogor CQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlwZ3RibF9jZmcgPSAoc3RydWN0IGlvX3BndGFibGVf Y2ZnKSB7CisJCS5wZ3NpemVfYml0bWFwCT0gc21tdS0+cGdzaXplX2JpdG1hcCwKKwkJLmlhcwkJ PSBpYXMsCisJCS5vYXMJCT0gb2FzLAorCQkudGxiCQk9ICZhcm1fc21tdV9nYXRoZXJfb3BzLAor CQkuaW9tbXVfZGV2CT0gc21tdS0+ZGV2LAorCX07CisKKwlpZiAoc21tdS0+ZmVhdHVyZXMgJiBB Uk1fU01NVV9GRUFUX0NPSEVSRU5DWSkKKwkJcGd0YmxfY2ZnLnF1aXJrcyA9IElPX1BHVEFCTEVf UVVJUktfTk9fRE1BOworCisJcGd0Ymxfb3BzID0gYWxsb2NfaW9fcGd0YWJsZV9vcHMoZm10LCAm cGd0YmxfY2ZnLCBzbW11X2RvbWFpbik7CisJaWYgKCFwZ3RibF9vcHMpCisJCXJldHVybiAtRU5P TUVNOworCisJZG9tYWluLT5wZ3NpemVfYml0bWFwID0gcGd0YmxfY2ZnLnBnc2l6ZV9iaXRtYXA7 CisJZG9tYWluLT5nZW9tZXRyeS5hcGVydHVyZV9lbmQgPSAoMVVMIDw8IGlhcykgLSAxOworCWRv bWFpbi0+Z2VvbWV0cnkuZm9yY2VfYXBlcnR1cmUgPSB0cnVlOworCXNtbXVfZG9tYWluLT5wZ3Ri bF9vcHMgPSBwZ3RibF9vcHM7CisKKwlyZXQgPSBmaW5hbGlzZV9zdGFnZV9mbihzbW11X2RvbWFp biwgJnBndGJsX2NmZyk7CisJaWYgKHJldCA8IDApCisJCWZyZWVfaW9fcGd0YWJsZV9vcHMocGd0 Ymxfb3BzKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBfX2xlNjQgKmFybV9zbW11X2dl dF9zdGVwX2Zvcl9zaWQoc3RydWN0IGFybV9zbW11X2RldmljZSAqc21tdSwgdTMyIHNpZCkKK3sK KwlfX2xlNjQgKnN0ZXA7CisJc3RydWN0IGFybV9zbW11X3N0cnRhYl9jZmcgKmNmZyA9ICZzbW11 LT5zdHJ0YWJfY2ZnOworCisJaWYgKHNtbXUtPmZlYXR1cmVzICYgQVJNX1NNTVVfRkVBVF8yX0xW TF9TVFJUQUIpIHsKKwkJc3RydWN0IGFybV9zbW11X3N0cnRhYl9sMV9kZXNjICpsMV9kZXNjOwor CQlpbnQgaWR4OworCisJCS8qIFR3by1sZXZlbCB3YWxrICovCisJCWlkeCA9IChzaWQgPj4gU1RS VEFCX1NQTElUKSAqIFNUUlRBQl9MMV9ERVNDX0RXT1JEUzsKKwkJbDFfZGVzYyA9ICZjZmctPmwx X2Rlc2NbaWR4XTsKKwkJaWR4ID0gKHNpZCAmICgoMSA8PCBTVFJUQUJfU1BMSVQpIC0gMSkpICog U1RSVEFCX1NURV9EV09SRFM7CisJCXN0ZXAgPSAmbDFfZGVzYy0+bDJwdHJbaWR4XTsKKwl9IGVs c2UgeworCQkvKiBTaW1wbGUgbGluZWFyIGxvb2t1cCAqLworCQlzdGVwID0gJmNmZy0+c3RydGFi W3NpZCAqIFNUUlRBQl9TVEVfRFdPUkRTXTsKKwl9CisKKwlyZXR1cm4gc3RlcDsKK30KKworc3Rh dGljIHZvaWQgYXJtX3NtbXVfaW5zdGFsbF9zdGVfZm9yX2RldihzdHJ1Y3QgaW9tbXVfZndzcGVj ICpmd3NwZWMpCit7CisJaW50IGk7CisJc3RydWN0IGFybV9zbW11X21hc3Rlcl9kYXRhICptYXN0 ZXIgPSBmd3NwZWMtPmlvbW11X3ByaXY7CisJc3RydWN0IGFybV9zbW11X2RldmljZSAqc21tdSA9 IG1hc3Rlci0+c21tdTsKKworCWZvciAoaSA9IDA7IGkgPCBmd3NwZWMtPm51bV9pZHM7ICsraSkg eworCQl1MzIgc2lkID0gZndzcGVjLT5pZHNbaV07CisJCV9fbGU2NCAqc3RlcCA9IGFybV9zbW11 X2dldF9zdGVwX2Zvcl9zaWQoc21tdSwgc2lkKTsKKworCQlhcm1fc21tdV93cml0ZV9zdHJ0YWJf ZW50KHNtbXUsIHNpZCwgc3RlcCwgJm1hc3Rlci0+c3RlKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lk IGFybV9zbW11X2RldGFjaF9kZXYoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBhcm1f c21tdV9tYXN0ZXJfZGF0YSAqbWFzdGVyID0gZGV2LT5pb21tdV9md3NwZWMtPmlvbW11X3ByaXY7 CisKKwltYXN0ZXItPnN0ZS5hc3NpZ25lZCA9IGZhbHNlOworCWFybV9zbW11X2luc3RhbGxfc3Rl X2Zvcl9kZXYoZGV2LT5pb21tdV9md3NwZWMpOworfQorCitzdGF0aWMgaW50IGFybV9zbW11X2F0 dGFjaF9kZXYoc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tYWluLCBzdHJ1Y3QgZGV2aWNlICpkZXYp Cit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGFybV9zbW11X2RldmljZSAqc21tdTsKKwlzdHJ1 Y3QgYXJtX3NtbXVfZG9tYWluICpzbW11X2RvbWFpbiA9IHRvX3NtbXVfZG9tYWluKGRvbWFpbik7 CisJc3RydWN0IGFybV9zbW11X21hc3Rlcl9kYXRhICptYXN0ZXI7CisJc3RydWN0IGFybV9zbW11 X3N0cnRhYl9lbnQgKnN0ZTsKKworCWlmICghZGV2LT5pb21tdV9md3NwZWMpCisJCXJldHVybiAt RU5PRU5UOworCisJbWFzdGVyID0gZGV2LT5pb21tdV9md3NwZWMtPmlvbW11X3ByaXY7CisJc21t dSA9IG1hc3Rlci0+c21tdTsKKwlzdGUgPSAmbWFzdGVyLT5zdGU7CisKKwkvKiBBbHJlYWR5IGF0 dGFjaGVkIHRvIGEgZGlmZmVyZW50IGRvbWFpbj8gKi8KKwlpZiAoc3RlLT5hc3NpZ25lZCkKKwkJ YXJtX3NtbXVfZGV0YWNoX2RldihkZXYpOworCisJbXV0ZXhfbG9jaygmc21tdV9kb21haW4tPmlu aXRfbXV0ZXgpOworCisJaWYgKCFzbW11X2RvbWFpbi0+c21tdSkgeworCQlzbW11X2RvbWFpbi0+ c21tdSA9IHNtbXU7CisJCXJldCA9IGFybV9zbW11X2RvbWFpbl9maW5hbGlzZShkb21haW4pOwor CQlpZiAocmV0KSB7CisJCQlzbW11X2RvbWFpbi0+c21tdSA9IE5VTEw7CisJCQlnb3RvIG91dF91 bmxvY2s7CisJCX0KKwl9IGVsc2UgaWYgKHNtbXVfZG9tYWluLT5zbW11ICE9IHNtbXUpIHsKKwkJ ZGV2X2VycihkZXYsCisJCQkiY2Fubm90IGF0dGFjaCB0byBTTU1VICVzICh1cHN0cmVhbSBvZiAl cylcbiIsCisJCQlkZXZfbmFtZShzbW11X2RvbWFpbi0+c21tdS0+ZGV2KSwKKwkJCWRldl9uYW1l KHNtbXUtPmRldikpOworCQlyZXQgPSAtRU5YSU87CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisK KwlzdGUtPmFzc2lnbmVkID0gdHJ1ZTsKKworCWlmIChzbW11X2RvbWFpbi0+c3RhZ2UgPT0gQVJN X1NNTVVfRE9NQUlOX0JZUEFTUykgeworCQlzdGUtPnMxX2NmZyA9IE5VTEw7CisJCXN0ZS0+czJf Y2ZnID0gTlVMTDsKKwl9IGVsc2UgaWYgKHNtbXVfZG9tYWluLT5zdGFnZSA9PSBBUk1fU01NVV9E T01BSU5fUzEpIHsKKwkJc3RlLT5zMV9jZmcgPSAmc21tdV9kb21haW4tPnMxX2NmZzsKKwkJc3Rl LT5zMl9jZmcgPSBOVUxMOworCQlhcm1fc21tdV93cml0ZV9jdHhfZGVzYyhzbW11LCBzdGUtPnMx X2NmZyk7CisJfSBlbHNlIHsKKwkJc3RlLT5zMV9jZmcgPSBOVUxMOworCQlzdGUtPnMyX2NmZyA9 ICZzbW11X2RvbWFpbi0+czJfY2ZnOworCX0KKworCWFybV9zbW11X2luc3RhbGxfc3RlX2Zvcl9k ZXYoZGV2LT5pb21tdV9md3NwZWMpOworb3V0X3VubG9jazoKKwltdXRleF91bmxvY2soJnNtbXVf ZG9tYWluLT5pbml0X211dGV4KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFybV9z bW11X21hcChzdHJ1Y3QgaW9tbXVfZG9tYWluICpkb21haW4sIHVuc2lnbmVkIGxvbmcgaW92YSwK KwkJCXBoeXNfYWRkcl90IHBhZGRyLCBzaXplX3Qgc2l6ZSwgaW50IHByb3QpCit7CisJc3RydWN0 IGlvX3BndGFibGVfb3BzICpvcHMgPSB0b19zbW11X2RvbWFpbihkb21haW4pLT5wZ3RibF9vcHM7 CisKKwlpZiAoIW9wcykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXR1cm4gb3BzLT5tYXAob3Bz LCBpb3ZhLCBwYWRkciwgc2l6ZSwgcHJvdCk7Cit9CisKK3N0YXRpYyBzaXplX3QKK2FybV9zbW11 X3VubWFwKHN0cnVjdCBpb21tdV9kb21haW4gKmRvbWFpbiwgdW5zaWduZWQgbG9uZyBpb3ZhLCBz aXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgaW9fcGd0YWJsZV9vcHMgKm9wcyA9IHRvX3NtbXVfZG9t YWluKGRvbWFpbiktPnBndGJsX29wczsKKworCWlmICghb3BzKQorCQlyZXR1cm4gMDsKKworCXJl dHVybiBvcHMtPnVubWFwKG9wcywgaW92YSwgc2l6ZSk7Cit9CisKK3N0YXRpYyBwaHlzX2FkZHJf dAorYXJtX3NtbXVfaW92YV90b19waHlzKHN0cnVjdCBpb21tdV9kb21haW4gKmRvbWFpbiwgZG1h X2FkZHJfdCBpb3ZhKQoreworCXN0cnVjdCBpb19wZ3RhYmxlX29wcyAqb3BzID0gdG9fc21tdV9k b21haW4oZG9tYWluKS0+cGd0Ymxfb3BzOworCisJaWYgKGRvbWFpbi0+dHlwZSA9PSBJT01NVV9E T01BSU5fSURFTlRJVFkpCisJCXJldHVybiBpb3ZhOworCisJaWYgKCFvcHMpCisJCXJldHVybiAw OworCisJcmV0dXJuIG9wcy0+aW92YV90b19waHlzKG9wcywgaW92YSk7Cit9CisKK3N0YXRpYyBz dHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGFybV9zbW11X2RyaXZlcjsKKworc3RhdGljIGludCBhcm1f c21tdV9tYXRjaF9ub2RlKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKK3sKKwlyZXR1 cm4gZGV2LT5md25vZGUgPT0gZGF0YTsKK30KKworc3RhdGljCitzdHJ1Y3QgYXJtX3NtbXVfZGV2 aWNlICphcm1fc21tdV9nZXRfYnlfZndub2RlKHN0cnVjdCBmd25vZGVfaGFuZGxlICpmd25vZGUp Cit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gZHJpdmVyX2ZpbmRfZGV2aWNlKCZhcm1fc21tdV9k cml2ZXIuZHJpdmVyLCBOVUxMLAorCQkJCQkJZndub2RlLCBhcm1fc21tdV9tYXRjaF9ub2RlKTsK KwlwdXRfZGV2aWNlKGRldik7CisJcmV0dXJuIGRldiA/IGRldl9nZXRfZHJ2ZGF0YShkZXYpIDog TlVMTDsKK30KKworc3RhdGljIGJvb2wgYXJtX3NtbXVfc2lkX2luX3JhbmdlKHN0cnVjdCBhcm1f c21tdV9kZXZpY2UgKnNtbXUsIHUzMiBzaWQpCit7CisJdW5zaWduZWQgbG9uZyBsaW1pdCA9IHNt bXUtPnN0cnRhYl9jZmcubnVtX2wxX2VudHM7CisKKwlpZiAoc21tdS0+ZmVhdHVyZXMgJiBBUk1f U01NVV9GRUFUXzJfTFZMX1NUUlRBQikKKwkJbGltaXQgKj0gMVVMIDw8IFNUUlRBQl9TUExJVDsK KworCXJldHVybiBzaWQgPCBsaW1pdDsKK30KKworc3RhdGljIHN0cnVjdCBpb21tdV9vcHMgYXJt X3NtbXVfb3BzOworCitzdGF0aWMgaW50IGFybV9zbW11X2FkZF9kZXZpY2Uoc3RydWN0IGRldmlj ZSAqZGV2KQoreworCWludCBpLCByZXQ7CisJc3RydWN0IGFybV9zbW11X2RldmljZSAqc21tdTsK KwlzdHJ1Y3QgYXJtX3NtbXVfbWFzdGVyX2RhdGEgKm1hc3RlcjsKKwlzdHJ1Y3QgaW9tbXVfZndz cGVjICpmd3NwZWMgPSBkZXYtPmlvbW11X2Z3c3BlYzsKKwlzdHJ1Y3QgaW9tbXVfZ3JvdXAgKmdy b3VwOworCisJaWYgKCFmd3NwZWMgfHwgZndzcGVjLT5vcHMgIT0gJmFybV9zbW11X29wcykKKwkJ cmV0dXJuIC1FTk9ERVY7CisJLyoKKwkgKiBXZSBfY2FuXyBhY3R1YWxseSB3aXRoc3RhbmQgZG9k Z3kgYnVzIGNvZGUgcmUtY2FsbGluZyBhZGRfZGV2aWNlKCkKKwkgKiB3aXRob3V0IGFuIGludGVy dmVuaW5nIHJlbW92ZV9kZXZpY2UoKS9vZl94bGF0ZSgpIHNlcXVlbmNlLCBidXQKKwkgKiB3ZSdy ZSBub3QgZ29pbmcgdG8gZG8gc28gcXVpZXRseS4uLgorCSAqLworCWlmIChXQVJOX09OX09OQ0Uo ZndzcGVjLT5pb21tdV9wcml2KSkgeworCQltYXN0ZXIgPSBmd3NwZWMtPmlvbW11X3ByaXY7CisJ CXNtbXUgPSBtYXN0ZXItPnNtbXU7CisJfSBlbHNlIHsKKwkJc21tdSA9IGFybV9zbW11X2dldF9i eV9md25vZGUoZndzcGVjLT5pb21tdV9md25vZGUpOworCQlpZiAoIXNtbXUpCisJCQlyZXR1cm4g LUVOT0RFVjsKKwkJbWFzdGVyID0ga3phbGxvYyhzaXplb2YoKm1hc3RlciksIEdGUF9LRVJORUwp OworCQlpZiAoIW1hc3RlcikKKwkJCXJldHVybiAtRU5PTUVNOworCisJCW1hc3Rlci0+c21tdSA9 IHNtbXU7CisJCWZ3c3BlYy0+aW9tbXVfcHJpdiA9IG1hc3RlcjsKKwl9CisKKwkvKiBDaGVjayB0 aGUgU0lEcyBhcmUgaW4gcmFuZ2Ugb2YgdGhlIFNNTVUgYW5kIG91ciBzdHJlYW0gdGFibGUgKi8K Kwlmb3IgKGkgPSAwOyBpIDwgZndzcGVjLT5udW1faWRzOyBpKyspIHsKKwkJdTMyIHNpZCA9IGZ3 c3BlYy0+aWRzW2ldOworCisJCWlmICghYXJtX3NtbXVfc2lkX2luX3JhbmdlKHNtbXUsIHNpZCkp CisJCQlyZXR1cm4gLUVSQU5HRTsKKworCQkvKiBFbnN1cmUgbDIgc3RydGFiIGlzIGluaXRpYWxp c2VkICovCisJCWlmIChzbW11LT5mZWF0dXJlcyAmIEFSTV9TTU1VX0ZFQVRfMl9MVkxfU1RSVEFC KSB7CisJCQlyZXQgPSBhcm1fc21tdV9pbml0X2wyX3N0cnRhYihzbW11LCBzaWQpOworCQkJaWYg KHJldCkKKwkJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJZ3JvdXAgPSBpb21tdV9ncm91cF9n ZXRfZm9yX2RldihkZXYpOworCWlmICghSVNfRVJSKGdyb3VwKSkgeworCQlpb21tdV9ncm91cF9w dXQoZ3JvdXApOworCQlpb21tdV9kZXZpY2VfbGluaygmc21tdS0+aW9tbXUsIGRldik7CisJfQor CisJcmV0dXJuIFBUUl9FUlJfT1JfWkVSTyhncm91cCk7Cit9CisKK3N0YXRpYyB2b2lkIGFybV9z bW11X3JlbW92ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpb21tdV9m d3NwZWMgKmZ3c3BlYyA9IGRldi0+aW9tbXVfZndzcGVjOworCXN0cnVjdCBhcm1fc21tdV9tYXN0 ZXJfZGF0YSAqbWFzdGVyOworCXN0cnVjdCBhcm1fc21tdV9kZXZpY2UgKnNtbXU7CisKKwlpZiAo IWZ3c3BlYyB8fCBmd3NwZWMtPm9wcyAhPSAmYXJtX3NtbXVfb3BzKQorCQlyZXR1cm47CisKKwlt YXN0ZXIgPSBmd3NwZWMtPmlvbW11X3ByaXY7CisJc21tdSA9IG1hc3Rlci0+c21tdTsKKwlpZiAo bWFzdGVyICYmIG1hc3Rlci0+c3RlLmFzc2lnbmVkKQorCQlhcm1fc21tdV9kZXRhY2hfZGV2KGRl dik7CisJaW9tbXVfZ3JvdXBfcmVtb3ZlX2RldmljZShkZXYpOworCWlvbW11X2RldmljZV91bmxp bmsoJnNtbXUtPmlvbW11LCBkZXYpOworCWtmcmVlKG1hc3Rlcik7CisJaW9tbXVfZndzcGVjX2Zy ZWUoZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCBpb21tdV9ncm91cCAqYXJtX3NtbXVfZGV2aWNl X2dyb3VwKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaW9tbXVfZ3JvdXAgKmdyb3Vw OworCisJLyoKKwkgKiBXZSBkb24ndCBzdXBwb3J0IGRldmljZXMgc2hhcmluZyBzdHJlYW0gSURz IG90aGVyIHRoYW4gUENJIFJJRAorCSAqIGFsaWFzZXMsIHNpbmNlIHRoZSBuZWNlc3NhcnkgSUQt dG8tZGV2aWNlIGxvb2t1cCBiZWNvbWVzIHJhdGhlcgorCSAqIGltcHJhY3RpY2FsIGdpdmVuIGEg cG90ZW50aWFsIHNwYXJzZSAzMi1iaXQgc3RyZWFtIElEIHNwYWNlLgorCSAqLworCWlmIChkZXZf aXNfcGNpKGRldikpCisJCWdyb3VwID0gcGNpX2RldmljZV9ncm91cChkZXYpOworCWVsc2UKKwkJ Z3JvdXAgPSBnZW5lcmljX2RldmljZV9ncm91cChkZXYpOworCisJcmV0dXJuIGdyb3VwOworfQor CitzdGF0aWMgaW50IGFybV9zbW11X2RvbWFpbl9nZXRfYXR0cihzdHJ1Y3QgaW9tbXVfZG9tYWlu ICpkb21haW4sCisJCQkJICAgIGVudW0gaW9tbXVfYXR0ciBhdHRyLCB2b2lkICpkYXRhKQorewor CXN0cnVjdCBhcm1fc21tdV9kb21haW4gKnNtbXVfZG9tYWluID0gdG9fc21tdV9kb21haW4oZG9t YWluKTsKKworCWlmIChkb21haW4tPnR5cGUgIT0gSU9NTVVfRE9NQUlOX1VOTUFOQUdFRCkKKwkJ cmV0dXJuIC1FSU5WQUw7CisKKwlzd2l0Y2ggKGF0dHIpIHsKKwljYXNlIERPTUFJTl9BVFRSX05F U1RJTkc6CisJCSooaW50ICopZGF0YSA9IChzbW11X2RvbWFpbi0+c3RhZ2UgPT0gQVJNX1NNTVVf RE9NQUlOX05FU1RFRCk7CisJCXJldHVybiAwOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PREVW OworCX0KK30KKworc3RhdGljIGludCBhcm1fc21tdV9kb21haW5fc2V0X2F0dHIoc3RydWN0IGlv bW11X2RvbWFpbiAqZG9tYWluLAorCQkJCSAgICBlbnVtIGlvbW11X2F0dHIgYXR0ciwgdm9pZCAq ZGF0YSkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgYXJtX3NtbXVfZG9tYWluICpzbW11X2Rv bWFpbiA9IHRvX3NtbXVfZG9tYWluKGRvbWFpbik7CisKKwlpZiAoZG9tYWluLT50eXBlICE9IElP TU1VX0RPTUFJTl9VTk1BTkFHRUQpCisJCXJldHVybiAtRUlOVkFMOworCisJbXV0ZXhfbG9jaygm c21tdV9kb21haW4tPmluaXRfbXV0ZXgpOworCisJc3dpdGNoIChhdHRyKSB7CisJY2FzZSBET01B SU5fQVRUUl9ORVNUSU5HOgorCQlpZiAoc21tdV9kb21haW4tPnNtbXUpIHsKKwkJCXJldCA9IC1F UEVSTTsKKwkJCWdvdG8gb3V0X3VubG9jazsKKwkJfQorCisJCWlmICgqKGludCAqKWRhdGEpCisJ CQlzbW11X2RvbWFpbi0+c3RhZ2UgPSBBUk1fU01NVV9ET01BSU5fTkVTVEVEOworCQllbHNlCisJ CQlzbW11X2RvbWFpbi0+c3RhZ2UgPSBBUk1fU01NVV9ET01BSU5fUzE7CisKKwkJYnJlYWs7CisJ ZGVmYXVsdDoKKwkJcmV0ID0gLUVOT0RFVjsKKwl9CisKK291dF91bmxvY2s6CisJbXV0ZXhfdW5s b2NrKCZzbW11X2RvbWFpbi0+aW5pdF9tdXRleCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGlj IGludCBhcm1fc21tdV9vZl94bGF0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBvZl9waGFu ZGxlX2FyZ3MgKmFyZ3MpCit7CisJcmV0dXJuIGlvbW11X2Z3c3BlY19hZGRfaWRzKGRldiwgYXJn cy0+YXJncywgMSk7Cit9CisKK3N0YXRpYyB2b2lkIGFybV9zbW11X2dldF9yZXN2X3JlZ2lvbnMo c3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCit7 CisJc3RydWN0IGlvbW11X3Jlc3ZfcmVnaW9uICpyZWdpb247CisJaW50IHByb3QgPSBJT01NVV9X UklURSB8IElPTU1VX05PRVhFQyB8IElPTU1VX01NSU87CisKKwlyZWdpb24gPSBpb21tdV9hbGxv Y19yZXN2X3JlZ2lvbihNU0lfSU9WQV9CQVNFLCBNU0lfSU9WQV9MRU5HVEgsCisJCQkJCSBwcm90 LCBJT01NVV9SRVNWX1NXX01TSSk7CisJaWYgKCFyZWdpb24pCisJCXJldHVybjsKKworCWxpc3Rf YWRkX3RhaWwoJnJlZ2lvbi0+bGlzdCwgaGVhZCk7CisKKwlpb21tdV9kbWFfZ2V0X3Jlc3ZfcmVn aW9ucyhkZXYsIGhlYWQpOworfQorCitzdGF0aWMgdm9pZCBhcm1fc21tdV9wdXRfcmVzdl9yZWdp b25zKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFk KQoreworCXN0cnVjdCBpb21tdV9yZXN2X3JlZ2lvbiAqZW50cnksICpuZXh0OworCisJbGlzdF9m b3JfZWFjaF9lbnRyeV9zYWZlKGVudHJ5LCBuZXh0LCBoZWFkLCBsaXN0KQorCQlrZnJlZShlbnRy eSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaW9tbXVfb3BzIGFybV9zbW11X29wcyA9IHsKKwkuY2Fw YWJsZQkJPSBhcm1fc21tdV9jYXBhYmxlLAorCS5kb21haW5fYWxsb2MJCT0gYXJtX3NtbXVfZG9t YWluX2FsbG9jLAorCS5kb21haW5fZnJlZQkJPSBhcm1fc21tdV9kb21haW5fZnJlZSwKKwkuYXR0 YWNoX2RldgkJPSBhcm1fc21tdV9hdHRhY2hfZGV2LAorCS5tYXAJCQk9IGFybV9zbW11X21hcCwK KwkudW5tYXAJCQk9IGFybV9zbW11X3VubWFwLAorCS5tYXBfc2cJCQk9IGRlZmF1bHRfaW9tbXVf bWFwX3NnLAorCS5pb3ZhX3RvX3BoeXMJCT0gYXJtX3NtbXVfaW92YV90b19waHlzLAorCS5hZGRf ZGV2aWNlCQk9IGFybV9zbW11X2FkZF9kZXZpY2UsCisJLnJlbW92ZV9kZXZpY2UJCT0gYXJtX3Nt bXVfcmVtb3ZlX2RldmljZSwKKwkuZGV2aWNlX2dyb3VwCQk9IGFybV9zbW11X2RldmljZV9ncm91 cCwKKwkuZG9tYWluX2dldF9hdHRyCT0gYXJtX3NtbXVfZG9tYWluX2dldF9hdHRyLAorCS5kb21h aW5fc2V0X2F0dHIJPSBhcm1fc21tdV9kb21haW5fc2V0X2F0dHIsCisJLm9mX3hsYXRlCQk9IGFy bV9zbW11X29mX3hsYXRlLAorCS5nZXRfcmVzdl9yZWdpb25zCT0gYXJtX3NtbXVfZ2V0X3Jlc3Zf cmVnaW9ucywKKwkucHV0X3Jlc3ZfcmVnaW9ucwk9IGFybV9zbW11X3B1dF9yZXN2X3JlZ2lvbnMs CisJLnBnc2l6ZV9iaXRtYXAJCT0gLTFVTCwgLyogUmVzdHJpY3RlZCBkdXJpbmcgZGV2aWNlIGF0 dGFjaCAqLworfTsKKworLyogUHJvYmluZyBhbmQgaW5pdGlhbGlzYXRpb24gZnVuY3Rpb25zICov CitzdGF0aWMgaW50IGFybV9zbW11X2luaXRfb25lX3F1ZXVlKHN0cnVjdCBhcm1fc21tdV9kZXZp Y2UgKnNtbXUsCisJCQkJICAgc3RydWN0IGFybV9zbW11X3F1ZXVlICpxLAorCQkJCSAgIHVuc2ln bmVkIGxvbmcgcHJvZF9vZmYsCisJCQkJICAgdW5zaWduZWQgbG9uZyBjb25zX29mZiwKKwkJCQkg ICBzaXplX3QgZHdvcmRzKQoreworCXNpemVfdCBxc3ogPSAoKDEgPDwgcS0+bWF4X25fc2hpZnQp ICogZHdvcmRzKSA8PCAzOworCisJcS0+YmFzZSA9IGRtYW1fYWxsb2NfY29oZXJlbnQoc21tdS0+ ZGV2LCBxc3osICZxLT5iYXNlX2RtYSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFxLT5iYXNlKSB7CisJ CWRldl9lcnIoc21tdS0+ZGV2LCAiZmFpbGVkIHRvIGFsbG9jYXRlIHF1ZXVlICgweCV6eCBieXRl cylcbiIsCisJCQlxc3opOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlxLT5wcm9kX3JlZwk9 IGFybV9zbW11X3BhZ2UxX2ZpeHVwKHByb2Rfb2ZmLCBzbW11KTsKKwlxLT5jb25zX3JlZwk9IGFy bV9zbW11X3BhZ2UxX2ZpeHVwKGNvbnNfb2ZmLCBzbW11KTsKKwlxLT5lbnRfZHdvcmRzCT0gZHdv cmRzOworCisJcS0+cV9iYXNlICA9IFFfQkFTRV9SV0E7CisJcS0+cV9iYXNlIHw9IHEtPmJhc2Vf ZG1hICYgUV9CQVNFX0FERFJfTUFTSyA8PCBRX0JBU0VfQUREUl9TSElGVDsKKwlxLT5xX2Jhc2Ug fD0gKHEtPm1heF9uX3NoaWZ0ICYgUV9CQVNFX0xPRzJTSVpFX01BU0spCisJCSAgICAgPDwgUV9C QVNFX0xPRzJTSVpFX1NISUZUOworCisJcS0+cHJvZCA9IHEtPmNvbnMgPSAwOworCXJldHVybiAw OworfQorCitzdGF0aWMgaW50IGFybV9zbW11X2luaXRfcXVldWVzKHN0cnVjdCBhcm1fc21tdV9k ZXZpY2UgKnNtbXUpCit7CisJaW50IHJldDsKKworCS8qIGNtZHEgKi8KKwlzcGluX2xvY2tfaW5p dCgmc21tdS0+Y21kcS5sb2NrKTsKKwlyZXQgPSBhcm1fc21tdV9pbml0X29uZV9xdWV1ZShzbW11 LCAmc21tdS0+Y21kcS5xLCBBUk1fU01NVV9DTURRX1BST0QsCisJCQkJICAgICAgQVJNX1NNTVVf Q01EUV9DT05TLCBDTURRX0VOVF9EV09SRFMpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisK KwkvKiBldnRxICovCisJcmV0ID0gYXJtX3NtbXVfaW5pdF9vbmVfcXVldWUoc21tdSwgJnNtbXUt PmV2dHEucSwgQVJNX1NNTVVfRVZUUV9QUk9ELAorCQkJCSAgICAgIEFSTV9TTU1VX0VWVFFfQ09O UywgRVZUUV9FTlRfRFdPUkRTKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogcHJp cSAqLworCWlmICghKHNtbXUtPmZlYXR1cmVzICYgQVJNX1NNTVVfRkVBVF9QUkkpKQorCQlyZXR1 cm4gMDsKKworCXJldHVybiBhcm1fc21tdV9pbml0X29uZV9xdWV1ZShzbW11LCAmc21tdS0+cHJp cS5xLCBBUk1fU01NVV9QUklRX1BST0QsCisJCQkJICAgICAgIEFSTV9TTU1VX1BSSVFfQ09OUywg UFJJUV9FTlRfRFdPUkRTKTsKK30KKworc3RhdGljIGludCBhcm1fc21tdV9pbml0X2wxX3N0cnRh YihzdHJ1Y3QgYXJtX3NtbXVfZGV2aWNlICpzbW11KQoreworCXVuc2lnbmVkIGludCBpOworCXN0 cnVjdCBhcm1fc21tdV9zdHJ0YWJfY2ZnICpjZmcgPSAmc21tdS0+c3RydGFiX2NmZzsKKwlzaXpl X3Qgc2l6ZSA9IHNpemVvZigqY2ZnLT5sMV9kZXNjKSAqIGNmZy0+bnVtX2wxX2VudHM7CisJdm9p ZCAqc3RydGFiID0gc21tdS0+c3RydGFiX2NmZy5zdHJ0YWI7CisKKwljZmctPmwxX2Rlc2MgPSBk ZXZtX2t6YWxsb2Moc21tdS0+ZGV2LCBzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNmZy0+bDFf ZGVzYykgeworCQlkZXZfZXJyKHNtbXUtPmRldiwgImZhaWxlZCB0byBhbGxvY2F0ZSBsMSBzdHJl YW0gdGFibGUgZGVzY1xuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWZvciAoaSA9IDA7 IGkgPCBjZmctPm51bV9sMV9lbnRzOyArK2kpIHsKKwkJYXJtX3NtbXVfd3JpdGVfc3RydGFiX2wx X2Rlc2Moc3RydGFiLCAmY2ZnLT5sMV9kZXNjW2ldKTsKKwkJc3RydGFiICs9IFNUUlRBQl9MMV9E RVNDX0RXT1JEUyA8PCAzOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFybV9z bW11X2luaXRfc3RydGFiXzJsdmwoc3RydWN0IGFybV9zbW11X2RldmljZSAqc21tdSkKK3sKKwl2 b2lkICpzdHJ0YWI7CisJdTY0IHJlZzsKKwl1MzIgc2l6ZSwgbDFzaXplOworCXN0cnVjdCBhcm1f c21tdV9zdHJ0YWJfY2ZnICpjZmcgPSAmc21tdS0+c3RydGFiX2NmZzsKKworCS8qIENhbGN1bGF0 ZSB0aGUgTDEgc2l6ZSwgY2FwcGVkIHRvIHRoZSBTSURTSVpFLiAqLworCXNpemUgPSBTVFJUQUJf TDFfU1pfU0hJRlQgLSAoaWxvZzIoU1RSVEFCX0wxX0RFU0NfRFdPUkRTKSArIDMpOworCXNpemUg PSBtaW4oc2l6ZSwgc21tdS0+c2lkX2JpdHMgLSBTVFJUQUJfU1BMSVQpOworCWNmZy0+bnVtX2wx X2VudHMgPSAxIDw8IHNpemU7CisKKwlzaXplICs9IFNUUlRBQl9TUExJVDsKKwlpZiAoc2l6ZSA8 IHNtbXUtPnNpZF9iaXRzKQorCQlkZXZfd2FybihzbW11LT5kZXYsCisJCQkgIjItbGV2ZWwgc3Ry dGFiIG9ubHkgY292ZXJzICV1LyV1IGJpdHMgb2YgU0lEXG4iLAorCQkJIHNpemUsIHNtbXUtPnNp ZF9iaXRzKTsKKworCWwxc2l6ZSA9IGNmZy0+bnVtX2wxX2VudHMgKiAoU1RSVEFCX0wxX0RFU0Nf RFdPUkRTIDw8IDMpOworCXN0cnRhYiA9IGRtYW1fYWxsb2NfY29oZXJlbnQoc21tdS0+ZGV2LCBs MXNpemUsICZjZmctPnN0cnRhYl9kbWEsCisJCQkJICAgICBHRlBfS0VSTkVMIHwgX19HRlBfWkVS Tyk7CisJaWYgKCFzdHJ0YWIpIHsKKwkJZGV2X2VycihzbW11LT5kZXYsCisJCQkiZmFpbGVkIHRv IGFsbG9jYXRlIGwxIHN0cmVhbSB0YWJsZSAoJXUgYnl0ZXMpXG4iLAorCQkJc2l6ZSk7CisJCXJl dHVybiAtRU5PTUVNOworCX0KKwljZmctPnN0cnRhYiA9IHN0cnRhYjsKKworCS8qIENvbmZpZ3Vy ZSBzdHJ0YWJfYmFzZV9jZmcgZm9yIDIgbGV2ZWxzICovCisJcmVnICA9IFNUUlRBQl9CQVNFX0NG R19GTVRfMkxWTDsKKwlyZWcgfD0gKHNpemUgJiBTVFJUQUJfQkFTRV9DRkdfTE9HMlNJWkVfTUFT SykKKwkJPDwgU1RSVEFCX0JBU0VfQ0ZHX0xPRzJTSVpFX1NISUZUOworCXJlZyB8PSAoU1RSVEFC X1NQTElUICYgU1RSVEFCX0JBU0VfQ0ZHX1NQTElUX01BU0spCisJCTw8IFNUUlRBQl9CQVNFX0NG R19TUExJVF9TSElGVDsKKwljZmctPnN0cnRhYl9iYXNlX2NmZyA9IHJlZzsKKworCXJldHVybiBh cm1fc21tdV9pbml0X2wxX3N0cnRhYihzbW11KTsKK30KKworc3RhdGljIGludCBhcm1fc21tdV9p bml0X3N0cnRhYl9saW5lYXIoc3RydWN0IGFybV9zbW11X2RldmljZSAqc21tdSkKK3sKKwl2b2lk ICpzdHJ0YWI7CisJdTY0IHJlZzsKKwl1MzIgc2l6ZTsKKwlzdHJ1Y3QgYXJtX3NtbXVfc3RydGFi X2NmZyAqY2ZnID0gJnNtbXUtPnN0cnRhYl9jZmc7CisKKwlzaXplID0gKDEgPDwgc21tdS0+c2lk X2JpdHMpICogKFNUUlRBQl9TVEVfRFdPUkRTIDw8IDMpOworCXN0cnRhYiA9IGRtYW1fYWxsb2Nf Y29oZXJlbnQoc21tdS0+ZGV2LCBzaXplLCAmY2ZnLT5zdHJ0YWJfZG1hLAorCQkJCSAgICAgR0ZQ X0tFUk5FTCB8IF9fR0ZQX1pFUk8pOworCWlmICghc3RydGFiKSB7CisJCWRldl9lcnIoc21tdS0+ ZGV2LAorCQkJImZhaWxlZCB0byBhbGxvY2F0ZSBsaW5lYXIgc3RyZWFtIHRhYmxlICgldSBieXRl cylcbiIsCisJCQlzaXplKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWNmZy0+c3RydGFiID0g c3RydGFiOworCWNmZy0+bnVtX2wxX2VudHMgPSAxIDw8IHNtbXUtPnNpZF9iaXRzOworCisJLyog Q29uZmlndXJlIHN0cnRhYl9iYXNlX2NmZyBmb3IgYSBsaW5lYXIgdGFibGUgY292ZXJpbmcgYWxs IFNJRHMgKi8KKwlyZWcgID0gU1RSVEFCX0JBU0VfQ0ZHX0ZNVF9MSU5FQVI7CisJcmVnIHw9IChz bW11LT5zaWRfYml0cyAmIFNUUlRBQl9CQVNFX0NGR19MT0cyU0laRV9NQVNLKQorCQk8PCBTVFJU QUJfQkFTRV9DRkdfTE9HMlNJWkVfU0hJRlQ7CisJY2ZnLT5zdHJ0YWJfYmFzZV9jZmcgPSByZWc7 CisKKwlhcm1fc21tdV9pbml0X2J5cGFzc19zdGVzKHN0cnRhYiwgY2ZnLT5udW1fbDFfZW50cyk7 CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXJtX3NtbXVfaW5pdF9zdHJ0YWIoc3RydWN0 IGFybV9zbW11X2RldmljZSAqc21tdSkKK3sKKwl1NjQgcmVnOworCWludCByZXQ7CisKKwlpZiAo c21tdS0+ZmVhdHVyZXMgJiBBUk1fU01NVV9GRUFUXzJfTFZMX1NUUlRBQikKKwkJcmV0ID0gYXJt X3NtbXVfaW5pdF9zdHJ0YWJfMmx2bChzbW11KTsKKwllbHNlCisJCXJldCA9IGFybV9zbW11X2lu aXRfc3RydGFiX2xpbmVhcihzbW11KTsKKworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkv KiBTZXQgdGhlIHN0cnRhYiBiYXNlIGFkZHJlc3MgKi8KKwlyZWcgID0gc21tdS0+c3RydGFiX2Nm Zy5zdHJ0YWJfZG1hICYKKwkgICAgICAgU1RSVEFCX0JBU0VfQUREUl9NQVNLIDw8IFNUUlRBQl9C QVNFX0FERFJfU0hJRlQ7CisJcmVnIHw9IFNUUlRBQl9CQVNFX1JBOworCXNtbXUtPnN0cnRhYl9j Zmcuc3RydGFiX2Jhc2UgPSByZWc7CisKKwkvKiBBbGxvY2F0ZSB0aGUgZmlyc3QgVk1JRCBmb3Ig c3RhZ2UtMiBieXBhc3MgU1RFcyAqLworCXNldF9iaXQoMCwgc21tdS0+dm1pZF9tYXApOworCXJl dHVybiAwOworfQorCitzdGF0aWMgaW50IGFybV9zbW11X2luaXRfc3RydWN0dXJlcyhzdHJ1Y3Qg YXJtX3NtbXVfZGV2aWNlICpzbW11KQoreworCWludCByZXQ7CisKKwlyZXQgPSBhcm1fc21tdV9p bml0X3F1ZXVlcyhzbW11KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIGFy bV9zbW11X2luaXRfc3RydGFiKHNtbXUpOworfQorCitzdGF0aWMgaW50IGFybV9zbW11X3dyaXRl X3JlZ19zeW5jKHN0cnVjdCBhcm1fc21tdV9kZXZpY2UgKnNtbXUsIHUzMiB2YWwsCisJCQkJICAg dW5zaWduZWQgaW50IHJlZ19vZmYsIHVuc2lnbmVkIGludCBhY2tfb2ZmKQoreworCXUzMiByZWc7 CisKKwl3cml0ZWxfcmVsYXhlZCh2YWwsIHNtbXUtPmJhc2UgKyByZWdfb2ZmKTsKKwlyZXR1cm4g cmVhZGxfcmVsYXhlZF9wb2xsX3RpbWVvdXQoc21tdS0+YmFzZSArIGFja19vZmYsIHJlZywgcmVn ID09IHZhbCwKKwkJCQkJICAxLCBBUk1fU01NVV9QT0xMX1RJTUVPVVRfVVMpOworfQorCisvKiBH QlBBIGlzICJzcGVjaWFsIiAqLworc3RhdGljIGludCBhcm1fc21tdV91cGRhdGVfZ2JwYShzdHJ1 Y3QgYXJtX3NtbXVfZGV2aWNlICpzbW11LCB1MzIgc2V0LCB1MzIgY2xyKQoreworCWludCByZXQ7 CisJdTMyIHJlZywgX19pb21lbSAqZ2JwYSA9IHNtbXUtPmJhc2UgKyBBUk1fU01NVV9HQlBBOwor CisJcmV0ID0gcmVhZGxfcmVsYXhlZF9wb2xsX3RpbWVvdXQoZ2JwYSwgcmVnLCAhKHJlZyAmIEdC UEFfVVBEQVRFKSwKKwkJCQkJIDEsIEFSTV9TTU1VX1BPTExfVElNRU9VVF9VUyk7CisJaWYgKHJl dCkKKwkJcmV0dXJuIHJldDsKKworCXJlZyAmPSB+Y2xyOworCXJlZyB8PSBzZXQ7CisJd3JpdGVs X3JlbGF4ZWQocmVnIHwgR0JQQV9VUERBVEUsIGdicGEpOworCXJldHVybiByZWFkbF9yZWxheGVk X3BvbGxfdGltZW91dChnYnBhLCByZWcsICEocmVnICYgR0JQQV9VUERBVEUpLAorCQkJCQkgIDEs IEFSTV9TTU1VX1BPTExfVElNRU9VVF9VUyk7Cit9CisKK3N0YXRpYyB2b2lkIGFybV9zbW11X2Zy ZWVfbXNpcyh2b2lkICpkYXRhKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGRhdGE7CisJcGxh dGZvcm1fbXNpX2RvbWFpbl9mcmVlX2lycXMoZGV2KTsKK30KKworc3RhdGljIHZvaWQgYXJtX3Nt bXVfd3JpdGVfbXNpX21zZyhzdHJ1Y3QgbXNpX2Rlc2MgKmRlc2MsIHN0cnVjdCBtc2lfbXNnICpt c2cpCit7CisJcGh5c19hZGRyX3QgZG9vcmJlbGw7CisJc3RydWN0IGRldmljZSAqZGV2ID0gbXNp X2Rlc2NfdG9fZGV2KGRlc2MpOworCXN0cnVjdCBhcm1fc21tdV9kZXZpY2UgKnNtbXUgPSBkZXZf Z2V0X2RydmRhdGEoZGV2KTsKKwlwaHlzX2FkZHJfdCAqY2ZnID0gYXJtX3NtbXVfbXNpX2NmZ1tk ZXNjLT5wbGF0Zm9ybS5tc2lfaW5kZXhdOworCisJZG9vcmJlbGwgPSAoKCh1NjQpbXNnLT5hZGRy ZXNzX2hpKSA8PCAzMikgfCBtc2ctPmFkZHJlc3NfbG87CisJZG9vcmJlbGwgJj0gTVNJX0NGRzBf QUREUl9NQVNLIDw8IE1TSV9DRkcwX0FERFJfU0hJRlQ7CisKKwl3cml0ZXFfcmVsYXhlZChkb29y YmVsbCwgc21tdS0+YmFzZSArIGNmZ1swXSk7CisJd3JpdGVsX3JlbGF4ZWQobXNnLT5kYXRhLCBz bW11LT5iYXNlICsgY2ZnWzFdKTsKKwl3cml0ZWxfcmVsYXhlZChNU0lfQ0ZHMl9NRU1BVFRSX0RF VklDRV9uR25SRSwgc21tdS0+YmFzZSArIGNmZ1syXSk7Cit9CisKK3N0YXRpYyB2b2lkIGFybV9z bW11X3NldHVwX21zaXMoc3RydWN0IGFybV9zbW11X2RldmljZSAqc21tdSkKK3sKKwlzdHJ1Y3Qg bXNpX2Rlc2MgKmRlc2M7CisJaW50IHJldCwgbnZlYyA9IEFSTV9TTU1VX01BWF9NU0lTOworCXN0 cnVjdCBkZXZpY2UgKmRldiA9IHNtbXUtPmRldjsKKworCS8qIENsZWFyIHRoZSBNU0kgYWRkcmVz cyByZWdzICovCisJd3JpdGVxX3JlbGF4ZWQoMCwgc21tdS0+YmFzZSArIEFSTV9TTU1VX0dFUlJP Ul9JUlFfQ0ZHMCk7CisJd3JpdGVxX3JlbGF4ZWQoMCwgc21tdS0+YmFzZSArIEFSTV9TTU1VX0VW VFFfSVJRX0NGRzApOworCisJaWYgKHNtbXUtPmZlYXR1cmVzICYgQVJNX1NNTVVfRkVBVF9QUkkp CisJCXdyaXRlcV9yZWxheGVkKDAsIHNtbXUtPmJhc2UgKyBBUk1fU01NVV9QUklRX0lSUV9DRkcw KTsKKwllbHNlCisJCW52ZWMtLTsKKworCWlmICghKHNtbXUtPmZlYXR1cmVzICYgQVJNX1NNTVVf RkVBVF9NU0kpKQorCQlyZXR1cm47CisKKwkvKiBBbGxvY2F0ZSBNU0lzIGZvciBldnRxLCBnZXJy b3IgYW5kIHByaXEuIElnbm9yZSBjbWRxICovCisJcmV0ID0gcGxhdGZvcm1fbXNpX2RvbWFpbl9h bGxvY19pcnFzKGRldiwgbnZlYywgYXJtX3NtbXVfd3JpdGVfbXNpX21zZyk7CisJaWYgKHJldCkg eworCQlkZXZfd2FybihkZXYsICJmYWlsZWQgdG8gYWxsb2NhdGUgTVNJc1xuIik7CisJCXJldHVy bjsKKwl9CisKKwlmb3JfZWFjaF9tc2lfZW50cnkoZGVzYywgZGV2KSB7CisJCXN3aXRjaCAoZGVz Yy0+cGxhdGZvcm0ubXNpX2luZGV4KSB7CisJCWNhc2UgRVZUUV9NU0lfSU5ERVg6CisJCQlzbW11 LT5ldnRxLnEuaXJxID0gZGVzYy0+aXJxOworCQkJYnJlYWs7CisJCWNhc2UgR0VSUk9SX01TSV9J TkRFWDoKKwkJCXNtbXUtPmdlcnJfaXJxID0gZGVzYy0+aXJxOworCQkJYnJlYWs7CisJCWNhc2Ug UFJJUV9NU0lfSU5ERVg6CisJCQlzbW11LT5wcmlxLnEuaXJxID0gZGVzYy0+aXJxOworCQkJYnJl YWs7CisJCWRlZmF1bHQ6CS8qIFVua25vd24gKi8KKwkJCWNvbnRpbnVlOworCQl9CisJfQorCisJ LyogQWRkIGNhbGxiYWNrIHRvIGZyZWUgTVNJcyBvbiB0ZWFyZG93biAqLworCWRldm1fYWRkX2Fj dGlvbihkZXYsIGFybV9zbW11X2ZyZWVfbXNpcywgZGV2KTsKK30KKworc3RhdGljIHZvaWQgYXJt X3NtbXVfc2V0dXBfdW5pcXVlX2lycXMoc3RydWN0IGFybV9zbW11X2RldmljZSAqc21tdSkKK3sK KwlpbnQgaXJxLCByZXQ7CisKKwlhcm1fc21tdV9zZXR1cF9tc2lzKHNtbXUpOworCisJLyogUmVx dWVzdCBpbnRlcnJ1cHQgbGluZXMgKi8KKwlpcnEgPSBzbW11LT5ldnRxLnEuaXJxOworCWlmIChp cnEpIHsKKwkJcmV0ID0gZGV2bV9yZXF1ZXN0X3RocmVhZGVkX2lycShzbW11LT5kZXYsIGlycSwg TlVMTCwKKwkJCQkJCWFybV9zbW11X2V2dHFfdGhyZWFkLAorCQkJCQkJSVJRRl9PTkVTSE9ULAor CQkJCQkJImFybS1zbW11LXYzLWV2dHEiLCBzbW11KTsKKwkJaWYgKHJldCA8IDApCisJCQlkZXZf d2FybihzbW11LT5kZXYsICJmYWlsZWQgdG8gZW5hYmxlIGV2dHEgaXJxXG4iKTsKKwl9CisKKwlp cnEgPSBzbW11LT5jbWRxLnEuaXJxOworCWlmIChpcnEpIHsKKwkJcmV0ID0gZGV2bV9yZXF1ZXN0 X2lycShzbW11LT5kZXYsIGlycSwKKwkJCQkgICAgICAgYXJtX3NtbXVfY21kcV9zeW5jX2hhbmRs ZXIsIDAsCisJCQkJICAgICAgICJhcm0tc21tdS12My1jbWRxLXN5bmMiLCBzbW11KTsKKwkJaWYg KHJldCA8IDApCisJCQlkZXZfd2FybihzbW11LT5kZXYsICJmYWlsZWQgdG8gZW5hYmxlIGNtZHEt c3luYyBpcnFcbiIpOworCX0KKworCWlycSA9IHNtbXUtPmdlcnJfaXJxOworCWlmIChpcnEpIHsK KwkJcmV0ID0gZGV2bV9yZXF1ZXN0X2lycShzbW11LT5kZXYsIGlycSwgYXJtX3NtbXVfZ2Vycm9y X2hhbmRsZXIsCisJCQkJICAgICAgIDAsICJhcm0tc21tdS12My1nZXJyb3IiLCBzbW11KTsKKwkJ aWYgKHJldCA8IDApCisJCQlkZXZfd2FybihzbW11LT5kZXYsICJmYWlsZWQgdG8gZW5hYmxlIGdl cnJvciBpcnFcbiIpOworCX0KKworCWlmIChzbW11LT5mZWF0dXJlcyAmIEFSTV9TTU1VX0ZFQVRf UFJJKSB7CisJCWlycSA9IHNtbXUtPnByaXEucS5pcnE7CisJCWlmIChpcnEpIHsKKwkJCXJldCA9 IGRldm1fcmVxdWVzdF90aHJlYWRlZF9pcnEoc21tdS0+ZGV2LCBpcnEsIE5VTEwsCisJCQkJCQkJ YXJtX3NtbXVfcHJpcV90aHJlYWQsCisJCQkJCQkJSVJRRl9PTkVTSE9ULAorCQkJCQkJCSJhcm0t c21tdS12My1wcmlxIiwKKwkJCQkJCQlzbW11KTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCWRldl93 YXJuKHNtbXUtPmRldiwKKwkJCQkJICJmYWlsZWQgdG8gZW5hYmxlIHByaXEgaXJxXG4iKTsKKwkJ fQorCX0KK30KKworc3RhdGljIGludCBhcm1fc21tdV9zZXR1cF9pcnFzKHN0cnVjdCBhcm1fc21t dV9kZXZpY2UgKnNtbXUpCit7CisJaW50IHJldCwgaXJxOworCXUzMiBpcnFlbl9mbGFncyA9IElS UV9DVFJMX0VWVFFfSVJRRU4gfCBJUlFfQ1RSTF9HRVJST1JfSVJRRU47CisKKwkvKiBEaXNhYmxl IElSUXMgZmlyc3QgKi8KKwlyZXQgPSBhcm1fc21tdV93cml0ZV9yZWdfc3luYyhzbW11LCAwLCBB Uk1fU01NVV9JUlFfQ1RSTCwKKwkJCQkgICAgICBBUk1fU01NVV9JUlFfQ1RSTEFDSyk7CisJaWYg KHJldCkgeworCQlkZXZfZXJyKHNtbXUtPmRldiwgImZhaWxlZCB0byBkaXNhYmxlIGlycXNcbiIp OworCQlyZXR1cm4gcmV0OworCX0KKworCWlycSA9IHNtbXUtPmNvbWJpbmVkX2lycTsKKwlpZiAo aXJxKSB7CisJCS8qCisJCSAqIENhdml1bSBUaHVuZGVyWDIgaW1wbGVtZW50YXRpb24gZG9lc24n dCBub3Qgc3VwcG9ydCB1bmlxdWUKKwkJICogaXJxIGxpbmVzLiBVc2Ugc2luZ2xlIGlycSBsaW5l IGZvciBhbGwgdGhlIFNNTVV2MyBpbnRlcnJ1cHRzLgorCQkgKi8KKwkJcmV0ID0gZGV2bV9yZXF1 ZXN0X3RocmVhZGVkX2lycShzbW11LT5kZXYsIGlycSwKKwkJCQkJYXJtX3NtbXVfY29tYmluZWRf aXJxX2hhbmRsZXIsCisJCQkJCWFybV9zbW11X2NvbWJpbmVkX2lycV90aHJlYWQsCisJCQkJCUlS UUZfT05FU0hPVCwKKwkJCQkJImFybS1zbW11LXYzLWNvbWJpbmVkLWlycSIsIHNtbXUpOworCQlp ZiAocmV0IDwgMCkKKwkJCWRldl93YXJuKHNtbXUtPmRldiwgImZhaWxlZCB0byBlbmFibGUgY29t YmluZWQgaXJxXG4iKTsKKwl9IGVsc2UKKwkJYXJtX3NtbXVfc2V0dXBfdW5pcXVlX2lycXMoc21t dSk7CisKKwlpZiAoc21tdS0+ZmVhdHVyZXMgJiBBUk1fU01NVV9GRUFUX1BSSSkKKwkJaXJxZW5f ZmxhZ3MgfD0gSVJRX0NUUkxfUFJJUV9JUlFFTjsKKworCS8qIEVuYWJsZSBpbnRlcnJ1cHQgZ2Vu ZXJhdGlvbiBvbiB0aGUgU01NVSAqLworCXJldCA9IGFybV9zbW11X3dyaXRlX3JlZ19zeW5jKHNt bXUsIGlycWVuX2ZsYWdzLAorCQkJCSAgICAgIEFSTV9TTU1VX0lSUV9DVFJMLCBBUk1fU01NVV9J UlFfQ1RSTEFDSyk7CisJaWYgKHJldCkKKwkJZGV2X3dhcm4oc21tdS0+ZGV2LCAiZmFpbGVkIHRv IGVuYWJsZSBpcnFzXG4iKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFybV9zbW11 X2RldmljZV9kaXNhYmxlKHN0cnVjdCBhcm1fc21tdV9kZXZpY2UgKnNtbXUpCit7CisJaW50IHJl dDsKKworCXJldCA9IGFybV9zbW11X3dyaXRlX3JlZ19zeW5jKHNtbXUsIDAsIEFSTV9TTU1VX0NS MCwgQVJNX1NNTVVfQ1IwQUNLKTsKKwlpZiAocmV0KQorCQlkZXZfZXJyKHNtbXUtPmRldiwgImZh aWxlZCB0byBjbGVhciBjcjBcbiIpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBh cm1fc21tdV9kZXZpY2VfcmVzZXQoc3RydWN0IGFybV9zbW11X2RldmljZSAqc21tdSwgYm9vbCBi eXBhc3MpCit7CisJaW50IHJldDsKKwl1MzIgcmVnLCBlbmFibGVzOworCXN0cnVjdCBhcm1fc21t dV9jbWRxX2VudCBjbWQ7CisKKwkvKiBDbGVhciBDUjAgYW5kIHN5bmMgKGRpc2FibGVzIFNNTVUg YW5kIHF1ZXVlIHByb2Nlc3NpbmcpICovCisJcmVnID0gcmVhZGxfcmVsYXhlZChzbW11LT5iYXNl ICsgQVJNX1NNTVVfQ1IwKTsKKwlpZiAocmVnICYgQ1IwX1NNTVVFTikKKwkJZGV2X3dhcm4oc21t dS0+ZGV2LCAiU01NVSBjdXJyZW50bHkgZW5hYmxlZCEgUmVzZXR0aW5nLi4uXG4iKTsKKworCXJl dCA9IGFybV9zbW11X2RldmljZV9kaXNhYmxlKHNtbXUpOworCWlmIChyZXQpCisJCXJldHVybiBy ZXQ7CisKKwkvKiBDUjEgKHRhYmxlIGFuZCBxdWV1ZSBtZW1vcnkgYXR0cmlidXRlcykgKi8KKwly ZWcgPSAoQ1IxX1NIX0lTSCA8PCBDUjFfVEFCTEVfU0hfU0hJRlQpIHwKKwkgICAgICAoQ1IxX0NB Q0hFX1dCIDw8IENSMV9UQUJMRV9PQ19TSElGVCkgfAorCSAgICAgIChDUjFfQ0FDSEVfV0IgPDwg Q1IxX1RBQkxFX0lDX1NISUZUKSB8CisJICAgICAgKENSMV9TSF9JU0ggPDwgQ1IxX1FVRVVFX1NI X1NISUZUKSB8CisJICAgICAgKENSMV9DQUNIRV9XQiA8PCBDUjFfUVVFVUVfT0NfU0hJRlQpIHwK KwkgICAgICAoQ1IxX0NBQ0hFX1dCIDw8IENSMV9RVUVVRV9JQ19TSElGVCk7CisJd3JpdGVsX3Jl bGF4ZWQocmVnLCBzbW11LT5iYXNlICsgQVJNX1NNTVVfQ1IxKTsKKworCS8qIENSMiAocmFuZG9t IGNyYXApICovCisJcmVnID0gQ1IyX1BUTSB8IENSMl9SRUNJTlZTSUQgfCBDUjJfRTJIOworCXdy aXRlbF9yZWxheGVkKHJlZywgc21tdS0+YmFzZSArIEFSTV9TTU1VX0NSMik7CisKKwkvKiBTdHJl YW0gdGFibGUgKi8KKwl3cml0ZXFfcmVsYXhlZChzbW11LT5zdHJ0YWJfY2ZnLnN0cnRhYl9iYXNl LAorCQkgICAgICAgc21tdS0+YmFzZSArIEFSTV9TTU1VX1NUUlRBQl9CQVNFKTsKKwl3cml0ZWxf cmVsYXhlZChzbW11LT5zdHJ0YWJfY2ZnLnN0cnRhYl9iYXNlX2NmZywKKwkJICAgICAgIHNtbXUt PmJhc2UgKyBBUk1fU01NVV9TVFJUQUJfQkFTRV9DRkcpOworCisJLyogQ29tbWFuZCBxdWV1ZSAq LworCXdyaXRlcV9yZWxheGVkKHNtbXUtPmNtZHEucS5xX2Jhc2UsIHNtbXUtPmJhc2UgKyBBUk1f U01NVV9DTURRX0JBU0UpOworCXdyaXRlbF9yZWxheGVkKHNtbXUtPmNtZHEucS5wcm9kLCBzbW11 LT5iYXNlICsgQVJNX1NNTVVfQ01EUV9QUk9EKTsKKwl3cml0ZWxfcmVsYXhlZChzbW11LT5jbWRx LnEuY29ucywgc21tdS0+YmFzZSArIEFSTV9TTU1VX0NNRFFfQ09OUyk7CisKKwllbmFibGVzID0g Q1IwX0NNRFFFTjsKKwlyZXQgPSBhcm1fc21tdV93cml0ZV9yZWdfc3luYyhzbW11LCBlbmFibGVz LCBBUk1fU01NVV9DUjAsCisJCQkJICAgICAgQVJNX1NNTVVfQ1IwQUNLKTsKKwlpZiAocmV0KSB7 CisJCWRldl9lcnIoc21tdS0+ZGV2LCAiZmFpbGVkIHRvIGVuYWJsZSBjb21tYW5kIHF1ZXVlXG4i KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBJbnZhbGlkYXRlIGFueSBjYWNoZWQgY29uZmln dXJhdGlvbiAqLworCWNtZC5vcGNvZGUgPSBDTURRX09QX0NGR0lfQUxMOworCWFybV9zbW11X2Nt ZHFfaXNzdWVfY21kKHNtbXUsICZjbWQpOworCWNtZC5vcGNvZGUgPSBDTURRX09QX0NNRF9TWU5D OworCWFybV9zbW11X2NtZHFfaXNzdWVfY21kKHNtbXUsICZjbWQpOworCisJLyogSW52YWxpZGF0 ZSBhbnkgc3RhbGUgVExCIGVudHJpZXMgKi8KKwlpZiAoc21tdS0+ZmVhdHVyZXMgJiBBUk1fU01N VV9GRUFUX0hZUCkgeworCQljbWQub3Bjb2RlID0gQ01EUV9PUF9UTEJJX0VMMl9BTEw7CisJCWFy bV9zbW11X2NtZHFfaXNzdWVfY21kKHNtbXUsICZjbWQpOworCX0KKworCWNtZC5vcGNvZGUgPSBD TURRX09QX1RMQklfTlNOSF9BTEw7CisJYXJtX3NtbXVfY21kcV9pc3N1ZV9jbWQoc21tdSwgJmNt ZCk7CisJY21kLm9wY29kZSA9IENNRFFfT1BfQ01EX1NZTkM7CisJYXJtX3NtbXVfY21kcV9pc3N1 ZV9jbWQoc21tdSwgJmNtZCk7CisKKwkvKiBFdmVudCBxdWV1ZSAqLworCXdyaXRlcV9yZWxheGVk KHNtbXUtPmV2dHEucS5xX2Jhc2UsIHNtbXUtPmJhc2UgKyBBUk1fU01NVV9FVlRRX0JBU0UpOwor CXdyaXRlbF9yZWxheGVkKHNtbXUtPmV2dHEucS5wcm9kLAorCQkgICAgICAgYXJtX3NtbXVfcGFn ZTFfZml4dXAoQVJNX1NNTVVfRVZUUV9QUk9ELCBzbW11KSk7CisJd3JpdGVsX3JlbGF4ZWQoc21t dS0+ZXZ0cS5xLmNvbnMsCisJCSAgICAgICBhcm1fc21tdV9wYWdlMV9maXh1cChBUk1fU01NVV9F VlRRX0NPTlMsIHNtbXUpKTsKKworCWVuYWJsZXMgfD0gQ1IwX0VWVFFFTjsKKwlyZXQgPSBhcm1f c21tdV93cml0ZV9yZWdfc3luYyhzbW11LCBlbmFibGVzLCBBUk1fU01NVV9DUjAsCisJCQkJICAg ICAgQVJNX1NNTVVfQ1IwQUNLKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoc21tdS0+ZGV2LCAi ZmFpbGVkIHRvIGVuYWJsZSBldmVudCBxdWV1ZVxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJ LyogUFJJIHF1ZXVlICovCisJaWYgKHNtbXUtPmZlYXR1cmVzICYgQVJNX1NNTVVfRkVBVF9QUkkp IHsKKwkJd3JpdGVxX3JlbGF4ZWQoc21tdS0+cHJpcS5xLnFfYmFzZSwKKwkJCSAgICAgICBzbW11 LT5iYXNlICsgQVJNX1NNTVVfUFJJUV9CQVNFKTsKKwkJd3JpdGVsX3JlbGF4ZWQoc21tdS0+cHJp cS5xLnByb2QsCisJCQkgICAgICAgYXJtX3NtbXVfcGFnZTFfZml4dXAoQVJNX1NNTVVfUFJJUV9Q Uk9ELCBzbW11KSk7CisJCXdyaXRlbF9yZWxheGVkKHNtbXUtPnByaXEucS5jb25zLAorCQkJICAg ICAgIGFybV9zbW11X3BhZ2UxX2ZpeHVwKEFSTV9TTU1VX1BSSVFfQ09OUywgc21tdSkpOworCisJ CWVuYWJsZXMgfD0gQ1IwX1BSSVFFTjsKKwkJcmV0ID0gYXJtX3NtbXVfd3JpdGVfcmVnX3N5bmMo c21tdSwgZW5hYmxlcywgQVJNX1NNTVVfQ1IwLAorCQkJCQkgICAgICBBUk1fU01NVV9DUjBBQ0sp OworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKHNtbXUtPmRldiwgImZhaWxlZCB0byBlbmFibGUg UFJJIHF1ZXVlXG4iKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwlyZXQgPSBhcm1fc21t dV9zZXR1cF9pcnFzKHNtbXUpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihzbW11LT5kZXYsICJm YWlsZWQgdG8gc2V0dXAgaXJxc1xuIik7CisJCXJldHVybiByZXQ7CisJfQorCisKKwkvKiBFbmFi bGUgdGhlIFNNTVUgaW50ZXJmYWNlLCBvciBlbnN1cmUgYnlwYXNzICovCisJaWYgKCFieXBhc3Mg fHwgZGlzYWJsZV9ieXBhc3MpIHsKKwkJZW5hYmxlcyB8PSBDUjBfU01NVUVOOworCX0gZWxzZSB7 CisJCXJldCA9IGFybV9zbW11X3VwZGF0ZV9nYnBhKHNtbXUsIDAsIEdCUEFfQUJPUlQpOworCQlp ZiAocmV0KSB7CisJCQlkZXZfZXJyKHNtbXUtPmRldiwgIkdCUEEgbm90IHJlc3BvbmRpbmcgdG8g dXBkYXRlXG4iKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisJcmV0ID0gYXJtX3NtbXVfd3Jp dGVfcmVnX3N5bmMoc21tdSwgZW5hYmxlcywgQVJNX1NNTVVfQ1IwLAorCQkJCSAgICAgIEFSTV9T TU1VX0NSMEFDSyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKHNtbXUtPmRldiwgImZhaWxlZCB0 byBlbmFibGUgU01NVSBpbnRlcmZhY2VcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVy biAwOworfQorCitzdGF0aWMgaW50IGFybV9zbW11X2RldmljZV9od19wcm9iZShzdHJ1Y3QgYXJt X3NtbXVfZGV2aWNlICpzbW11KQoreworCXUzMiByZWc7CisJYm9vbCBjb2hlcmVudCA9IHNtbXUt PmZlYXR1cmVzICYgQVJNX1NNTVVfRkVBVF9DT0hFUkVOQ1k7CisKKwkvKiBJRFIwICovCisJcmVn ID0gcmVhZGxfcmVsYXhlZChzbW11LT5iYXNlICsgQVJNX1NNTVVfSURSMCk7CisKKwkvKiAyLWxl dmVsIHN0cnVjdHVyZXMgKi8KKwlpZiAoKHJlZyAmIElEUjBfU1RfTFZMX01BU0sgPDwgSURSMF9T VF9MVkxfU0hJRlQpID09IElEUjBfU1RfTFZMXzJMVkwpCisJCXNtbXUtPmZlYXR1cmVzIHw9IEFS TV9TTU1VX0ZFQVRfMl9MVkxfU1RSVEFCOworCisJaWYgKHJlZyAmIElEUjBfQ0QyTCkKKwkJc21t dS0+ZmVhdHVyZXMgfD0gQVJNX1NNTVVfRkVBVF8yX0xWTF9DRFRBQjsKKworCS8qCisJICogVHJh bnNsYXRpb24gdGFibGUgZW5kaWFubmVzcy4KKwkgKiBXZSBjdXJyZW50bHkgcmVxdWlyZSB0aGUg c2FtZSBlbmRpYW5uZXNzIGFzIHRoZSBDUFUsIGJ1dCB0aGlzCisJICogY291bGQgYmUgY2hhbmdl ZCBsYXRlciBieSBhZGRpbmcgYSBuZXcgSU9fUEdUQUJMRV9RVUlSSy4KKwkgKi8KKwlzd2l0Y2gg KHJlZyAmIElEUjBfVFRFTkRJQU5fTUFTSyA8PCBJRFIwX1RURU5ESUFOX1NISUZUKSB7CisJY2Fz ZSBJRFIwX1RURU5ESUFOX01JWEVEOgorCQlzbW11LT5mZWF0dXJlcyB8PSBBUk1fU01NVV9GRUFU X1RUX0xFIHwgQVJNX1NNTVVfRkVBVF9UVF9CRTsKKwkJYnJlYWs7CisjaWZkZWYgX19CSUdfRU5E SUFOCisJY2FzZSBJRFIwX1RURU5ESUFOX0JFOgorCQlzbW11LT5mZWF0dXJlcyB8PSBBUk1fU01N VV9GRUFUX1RUX0JFOworCQlicmVhazsKKyNlbHNlCisJY2FzZSBJRFIwX1RURU5ESUFOX0xFOgor CQlzbW11LT5mZWF0dXJlcyB8PSBBUk1fU01NVV9GRUFUX1RUX0xFOworCQlicmVhazsKKyNlbmRp ZgorCWRlZmF1bHQ6CisJCWRldl9lcnIoc21tdS0+ZGV2LCAidW5rbm93bi91bnN1cHBvcnRlZCBU VCBlbmRpYW5uZXNzIVxuIik7CisJCXJldHVybiAtRU5YSU87CisJfQorCisJLyogQm9vbGVhbiBm ZWF0dXJlIGZsYWdzICovCisJaWYgKElTX0VOQUJMRUQoQ09ORklHX1BDSV9QUkkpICYmIHJlZyAm IElEUjBfUFJJKQorCQlzbW11LT5mZWF0dXJlcyB8PSBBUk1fU01NVV9GRUFUX1BSSTsKKworCWlm IChJU19FTkFCTEVEKENPTkZJR19QQ0lfQVRTKSAmJiByZWcgJiBJRFIwX0FUUykKKwkJc21tdS0+ ZmVhdHVyZXMgfD0gQVJNX1NNTVVfRkVBVF9BVFM7CisKKwlpZiAocmVnICYgSURSMF9TRVYpCisJ CXNtbXUtPmZlYXR1cmVzIHw9IEFSTV9TTU1VX0ZFQVRfU0VWOworCisJaWYgKHJlZyAmIElEUjBf TVNJKQorCQlzbW11LT5mZWF0dXJlcyB8PSBBUk1fU01NVV9GRUFUX01TSTsKKworCWlmIChyZWcg JiBJRFIwX0hZUCkKKwkJc21tdS0+ZmVhdHVyZXMgfD0gQVJNX1NNTVVfRkVBVF9IWVA7CisKKwkv KgorCSAqIFRoZSBjb2hlcmVuY3kgZmVhdHVyZSBhcyBzZXQgYnkgRlcgaXMgdXNlZCBpbiBwcmVm ZXJlbmNlIHRvIHRoZSBJRAorCSAqIHJlZ2lzdGVyLCBidXQgd2FybiBvbiBtaXNtYXRjaC4KKwkg Ki8KKwlpZiAoISEocmVnICYgSURSMF9DT0hBQ0MpICE9IGNvaGVyZW50KQorCQlkZXZfd2Fybihz bW11LT5kZXYsICJJRFIwLkNPSEFDQyBvdmVycmlkZGVuIGJ5IGRtYS1jb2hlcmVudCBwcm9wZXJ0 eSAoJXMpXG4iLAorCQkJIGNvaGVyZW50ID8gInRydWUiIDogImZhbHNlIik7CisKKwlzd2l0Y2gg KHJlZyAmIElEUjBfU1RBTExfTU9ERUxfTUFTSyA8PCBJRFIwX1NUQUxMX01PREVMX1NISUZUKSB7 CisJY2FzZSBJRFIwX1NUQUxMX01PREVMX1NUQUxMOgorCQkvKiBGYWxsdGhyb3VnaCAqLworCWNh c2UgSURSMF9TVEFMTF9NT0RFTF9GT1JDRToKKwkJc21tdS0+ZmVhdHVyZXMgfD0gQVJNX1NNTVVf RkVBVF9TVEFMTFM7CisJfQorCisJaWYgKHJlZyAmIElEUjBfUzFQKQorCQlzbW11LT5mZWF0dXJl cyB8PSBBUk1fU01NVV9GRUFUX1RSQU5TX1MxOworCisJaWYgKHJlZyAmIElEUjBfUzJQKQorCQlz bW11LT5mZWF0dXJlcyB8PSBBUk1fU01NVV9GRUFUX1RSQU5TX1MyOworCisJaWYgKCEocmVnICYg KElEUjBfUzFQIHwgSURSMF9TMlApKSkgeworCQlkZXZfZXJyKHNtbXUtPmRldiwgIm5vIHRyYW5z bGF0aW9uIHN1cHBvcnQhXG4iKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwkvKiBXZSBvbmx5 IHN1cHBvcnQgdGhlIEFBcmNoNjQgdGFibGUgZm9ybWF0IGF0IHByZXNlbnQgKi8KKwlzd2l0Y2gg KHJlZyAmIElEUjBfVFRGX01BU0sgPDwgSURSMF9UVEZfU0hJRlQpIHsKKwljYXNlIElEUjBfVFRG X0FBUkNIMzJfNjQ6CisJCXNtbXUtPmlhcyA9IDQwOworCQkvKiBGYWxsdGhyb3VnaCAqLworCWNh c2UgSURSMF9UVEZfQUFSQ0g2NDoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2VycihzbW11 LT5kZXYsICJBQXJjaDY0IHRhYmxlIGZvcm1hdCBub3Qgc3VwcG9ydGVkIVxuIik7CisJCXJldHVy biAtRU5YSU87CisJfQorCisJLyogQVNJRC9WTUlEIHNpemVzICovCisJc21tdS0+YXNpZF9iaXRz ID0gcmVnICYgSURSMF9BU0lEMTYgPyAxNiA6IDg7CisJc21tdS0+dm1pZF9iaXRzID0gcmVnICYg SURSMF9WTUlEMTYgPyAxNiA6IDg7CisKKwkvKiBJRFIxICovCisJcmVnID0gcmVhZGxfcmVsYXhl ZChzbW11LT5iYXNlICsgQVJNX1NNTVVfSURSMSk7CisJaWYgKHJlZyAmIChJRFIxX1RBQkxFU19Q UkVTRVQgfCBJRFIxX1FVRVVFU19QUkVTRVQgfCBJRFIxX1JFTCkpIHsKKwkJZGV2X2VycihzbW11 LT5kZXYsICJlbWJlZGRlZCBpbXBsZW1lbnRhdGlvbiBub3Qgc3VwcG9ydGVkXG4iKTsKKwkJcmV0 dXJuIC1FTlhJTzsKKwl9CisKKwkvKiBRdWV1ZSBzaXplcywgY2FwcGVkIGF0IDRrICovCisJc21t dS0+Y21kcS5xLm1heF9uX3NoaWZ0ID0gbWluKCh1MzIpQ01EUV9NQVhfU1pfU0hJRlQsCisJCQkJ ICAgICAgIHJlZyA+PiBJRFIxX0NNRFFfU0hJRlQgJiBJRFIxX0NNRFFfTUFTSyk7CisJaWYgKCFz bW11LT5jbWRxLnEubWF4X25fc2hpZnQpIHsKKwkJLyogT2RkIGFsaWdubWVudCByZXN0cmljdGlv bnMgb24gdGhlIGJhc2UsIHNvIGlnbm9yZSBmb3Igbm93ICovCisJCWRldl9lcnIoc21tdS0+ZGV2 LCAidW5pdC1sZW5ndGggY29tbWFuZCBxdWV1ZSBub3Qgc3VwcG9ydGVkXG4iKTsKKwkJcmV0dXJu IC1FTlhJTzsKKwl9CisKKwlzbW11LT5ldnRxLnEubWF4X25fc2hpZnQgPSBtaW4oKHUzMilFVlRR X01BWF9TWl9TSElGVCwKKwkJCQkgICAgICAgcmVnID4+IElEUjFfRVZUUV9TSElGVCAmIElEUjFf RVZUUV9NQVNLKTsKKwlzbW11LT5wcmlxLnEubWF4X25fc2hpZnQgPSBtaW4oKHUzMilQUklRX01B WF9TWl9TSElGVCwKKwkJCQkgICAgICAgcmVnID4+IElEUjFfUFJJUV9TSElGVCAmIElEUjFfUFJJ UV9NQVNLKTsKKworCS8qIFNJRC9TU0lEIHNpemVzICovCisJc21tdS0+c3NpZF9iaXRzID0gcmVn ID4+IElEUjFfU1NJRF9TSElGVCAmIElEUjFfU1NJRF9NQVNLOworCXNtbXUtPnNpZF9iaXRzID0g cmVnID4+IElEUjFfU0lEX1NISUZUICYgSURSMV9TSURfTUFTSzsKKworCS8qCisJICogSWYgdGhl IFNNTVUgc3VwcG9ydHMgZmV3ZXIgYml0cyB0aGFuIHdvdWxkIGZpbGwgYSBzaW5nbGUgTDIgc3Ry ZWFtCisJICogdGFibGUsIHVzZSBhIGxpbmVhciB0YWJsZSBpbnN0ZWFkLgorCSAqLworCWlmIChz bW11LT5zaWRfYml0cyA8PSBTVFJUQUJfU1BMSVQpCisJCXNtbXUtPmZlYXR1cmVzICY9IH5BUk1f U01NVV9GRUFUXzJfTFZMX1NUUlRBQjsKKworCS8qIElEUjUgKi8KKwlyZWcgPSByZWFkbF9yZWxh eGVkKHNtbXUtPmJhc2UgKyBBUk1fU01NVV9JRFI1KTsKKworCS8qIE1heGltdW0gbnVtYmVyIG9m IG91dHN0YW5kaW5nIHN0YWxscyAqLworCXNtbXUtPmV2dHEubWF4X3N0YWxscyA9IHJlZyA+PiBJ RFI1X1NUQUxMX01BWF9TSElGVAorCQkJCSYgSURSNV9TVEFMTF9NQVhfTUFTSzsKKworCS8qIFBh Z2Ugc2l6ZXMgKi8KKwlpZiAocmVnICYgSURSNV9HUkFONjRLKQorCQlzbW11LT5wZ3NpemVfYml0 bWFwIHw9IFNaXzY0SyB8IFNaXzUxMk07CisJaWYgKHJlZyAmIElEUjVfR1JBTjE2SykKKwkJc21t dS0+cGdzaXplX2JpdG1hcCB8PSBTWl8xNksgfCBTWl8zMk07CisJaWYgKHJlZyAmIElEUjVfR1JB TjRLKQorCQlzbW11LT5wZ3NpemVfYml0bWFwIHw9IFNaXzRLIHwgU1pfMk0gfCBTWl8xRzsKKwor CWlmIChhcm1fc21tdV9vcHMucGdzaXplX2JpdG1hcCA9PSAtMVVMKQorCQlhcm1fc21tdV9vcHMu cGdzaXplX2JpdG1hcCA9IHNtbXUtPnBnc2l6ZV9iaXRtYXA7CisJZWxzZQorCQlhcm1fc21tdV9v cHMucGdzaXplX2JpdG1hcCB8PSBzbW11LT5wZ3NpemVfYml0bWFwOworCisJLyogT3V0cHV0IGFk ZHJlc3Mgc2l6ZSAqLworCXN3aXRjaCAocmVnICYgSURSNV9PQVNfTUFTSyA8PCBJRFI1X09BU19T SElGVCkgeworCWNhc2UgSURSNV9PQVNfMzJfQklUOgorCQlzbW11LT5vYXMgPSAzMjsKKwkJYnJl YWs7CisJY2FzZSBJRFI1X09BU18zNl9CSVQ6CisJCXNtbXUtPm9hcyA9IDM2OworCQlicmVhazsK KwljYXNlIElEUjVfT0FTXzQwX0JJVDoKKwkJc21tdS0+b2FzID0gNDA7CisJCWJyZWFrOworCWNh c2UgSURSNV9PQVNfNDJfQklUOgorCQlzbW11LT5vYXMgPSA0MjsKKwkJYnJlYWs7CisJY2FzZSBJ RFI1X09BU180NF9CSVQ6CisJCXNtbXUtPm9hcyA9IDQ0OworCQlicmVhazsKKwlkZWZhdWx0Ogor CQlkZXZfaW5mbyhzbW11LT5kZXYsCisJCQkidW5rbm93biBvdXRwdXQgYWRkcmVzcyBzaXplLiBU cnVuY2F0aW5nIHRvIDQ4LWJpdFxuIik7CisJCS8qIEZhbGx0aHJvdWdoICovCisJY2FzZSBJRFI1 X09BU180OF9CSVQ6CisJCXNtbXUtPm9hcyA9IDQ4OworCX0KKworCS8qIFNldCB0aGUgRE1BIG1h c2sgZm9yIG91ciB0YWJsZSB3YWxrZXIgKi8KKwlpZiAoZG1hX3NldF9tYXNrX2FuZF9jb2hlcmVu dChzbW11LT5kZXYsIERNQV9CSVRfTUFTSyhzbW11LT5vYXMpKSkKKwkJZGV2X3dhcm4oc21tdS0+ ZGV2LAorCQkJICJmYWlsZWQgdG8gc2V0IERNQSBtYXNrIGZvciB0YWJsZSB3YWxrZXJcbiIpOwor CisJc21tdS0+aWFzID0gbWF4KHNtbXUtPmlhcywgc21tdS0+b2FzKTsKKworCWRldl9pbmZvKHNt bXUtPmRldiwgImlhcyAlbHUtYml0LCBvYXMgJWx1LWJpdCAoZmVhdHVyZXMgMHglMDh4KVxuIiwK KwkJIHNtbXUtPmlhcywgc21tdS0+b2FzLCBzbW11LT5mZWF0dXJlcyk7CisJcmV0dXJuIDA7Cit9 CisKKyNpZmRlZiBDT05GSUdfQUNQSQorc3RhdGljIHZvaWQgYWNwaV9zbW11X2dldF9vcHRpb25z KHUzMiBtb2RlbCwgc3RydWN0IGFybV9zbW11X2RldmljZSAqc21tdSkKK3sKKwlzd2l0Y2ggKG1v ZGVsKSB7CisJY2FzZSBBQ1BJX0lPUlRfU01NVV9WM19DQVZJVU1fQ045OVhYOgorCQlzbW11LT5v cHRpb25zIHw9IEFSTV9TTU1VX09QVF9QQUdFMF9SRUdTX09OTFk7CisJCWJyZWFrOworCWNhc2Ug QUNQSV9JT1JUX1NNTVVfSElTSUxJQ09OX0hJMTYxWDoKKwkJc21tdS0+b3B0aW9ucyB8PSBBUk1f U01NVV9PUFRfU0tJUF9QUkVGRVRDSDsKKwkJYnJlYWs7CisJfQorCisJZGV2X25vdGljZShzbW11 LT5kZXYsICJvcHRpb24gbWFzayAweCV4XG4iLCBzbW11LT5vcHRpb25zKTsKK30KKworc3RhdGlj IGludCBhcm1fc21tdV9kZXZpY2VfYWNwaV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpw ZGV2LAorCQkJCSAgICAgIHN0cnVjdCBhcm1fc21tdV9kZXZpY2UgKnNtbXUpCit7CisJc3RydWN0 IGFjcGlfaW9ydF9zbW11X3YzICppb3J0X3NtbXU7CisJc3RydWN0IGRldmljZSAqZGV2ID0gc21t dS0+ZGV2OworCXN0cnVjdCBhY3BpX2lvcnRfbm9kZSAqbm9kZTsKKworCW5vZGUgPSAqKHN0cnVj dCBhY3BpX2lvcnRfbm9kZSAqKilkZXZfZ2V0X3BsYXRkYXRhKGRldik7CisKKwkvKiBSZXRyaWV2 ZSBTTU1VdjMgc3BlY2lmaWMgZGF0YSAqLworCWlvcnRfc21tdSA9IChzdHJ1Y3QgYWNwaV9pb3J0 X3NtbXVfdjMgKilub2RlLT5ub2RlX2RhdGE7CisKKwlhY3BpX3NtbXVfZ2V0X29wdGlvbnMoaW9y dF9zbW11LT5tb2RlbCwgc21tdSk7CisKKwlpZiAoaW9ydF9zbW11LT5mbGFncyAmIEFDUElfSU9S VF9TTU1VX1YzX0NPSEFDQ19PVkVSUklERSkKKwkJc21tdS0+ZmVhdHVyZXMgfD0gQVJNX1NNTVVf RkVBVF9DT0hFUkVOQ1k7CisKKwlyZXR1cm4gMDsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIGlu dCBhcm1fc21tdV9kZXZpY2VfYWNwaV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2 LAorCQkJCQkgICAgIHN0cnVjdCBhcm1fc21tdV9kZXZpY2UgKnNtbXUpCit7CisJcmV0dXJuIC1F Tk9ERVY7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBhcm1fc21tdV9kZXZpY2VfZHRfcHJvYmUo c3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJCQkgICAgc3RydWN0IGFybV9zbW11X2Rl dmljZSAqc21tdSkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCXUzMiBj ZWxsczsKKwlpbnQgcmV0ID0gLUVJTlZBTDsKKworCWlmIChvZl9wcm9wZXJ0eV9yZWFkX3UzMihk ZXYtPm9mX25vZGUsICIjaW9tbXUtY2VsbHMiLCAmY2VsbHMpKQorCQlkZXZfZXJyKGRldiwgIm1p c3NpbmcgI2lvbW11LWNlbGxzIHByb3BlcnR5XG4iKTsKKwllbHNlIGlmIChjZWxscyAhPSAxKQor CQlkZXZfZXJyKGRldiwgImludmFsaWQgI2lvbW11LWNlbGxzIHZhbHVlICglZClcbiIsIGNlbGxz KTsKKwllbHNlCisJCXJldCA9IDA7CisKKwlwYXJzZV9kcml2ZXJfb3B0aW9ucyhzbW11KTsKKwor CWlmIChvZl9kbWFfaXNfY29oZXJlbnQoZGV2LT5vZl9ub2RlKSkKKwkJc21tdS0+ZmVhdHVyZXMg fD0gQVJNX1NNTVVfRkVBVF9DT0hFUkVOQ1k7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMg dW5zaWduZWQgbG9uZyBhcm1fc21tdV9yZXNvdXJjZV9zaXplKHN0cnVjdCBhcm1fc21tdV9kZXZp Y2UgKnNtbXUpCit7CisJaWYgKHNtbXUtPm9wdGlvbnMgJiBBUk1fU01NVV9PUFRfUEFHRTBfUkVH U19PTkxZKQorCQlyZXR1cm4gU1pfNjRLOworCWVsc2UKKwkJcmV0dXJuIFNaXzEyOEs7Cit9CisK K3N0YXRpYyBpbnQgYXJtX3NtbXVfZGV2aWNlX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ug KnBkZXYpCit7CisJaW50IGlycSwgcmV0OworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCXJlc291 cmNlX3NpemVfdCBpb2FkZHI7CisJc3RydWN0IGFybV9zbW11X2RldmljZSAqc21tdTsKKwlzdHJ1 Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCWJvb2wgYnlwYXNzOworCisJc21tdSA9IGRl dm1fa3phbGxvYyhkZXYsIHNpemVvZigqc21tdSksIEdGUF9LRVJORUwpOworCWlmICghc21tdSkg eworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBhbGxvY2F0ZSBhcm1fc21tdV9kZXZpY2VcbiIp OworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJc21tdS0+ZGV2ID0gZGV2OworCisJaWYgKGRldi0+ b2Zfbm9kZSkgeworCQlyZXQgPSBhcm1fc21tdV9kZXZpY2VfZHRfcHJvYmUocGRldiwgc21tdSk7 CisJfSBlbHNlIHsKKwkJcmV0ID0gYXJtX3NtbXVfZGV2aWNlX2FjcGlfcHJvYmUocGRldiwgc21t dSk7CisJCWlmIChyZXQgPT0gLUVOT0RFVikKKwkJCXJldHVybiByZXQ7CisJfQorCisJLyogU2V0 IGJ5cGFzcyBtb2RlIGFjY29yZGluZyB0byBmaXJtd2FyZSBwcm9iaW5nIHJlc3VsdCAqLworCWJ5 cGFzcyA9ICEhcmV0OworCisJLyogQmFzZSBhZGRyZXNzICovCisJcmVzID0gcGxhdGZvcm1fZ2V0 X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAocmVzb3VyY2Vfc2l6ZShy ZXMpICsgMSA8IGFybV9zbW11X3Jlc291cmNlX3NpemUoc21tdSkpIHsKKwkJZGV2X2VycihkZXYs ICJNTUlPIHJlZ2lvbiB0b28gc21hbGwgKCVwcilcbiIsIHJlcyk7CisJCXJldHVybiAtRUlOVkFM OworCX0KKwlpb2FkZHIgPSByZXMtPnN0YXJ0OworCisJc21tdS0+YmFzZSA9IGRldm1faW9yZW1h cF9yZXNvdXJjZShkZXYsIHJlcyk7CisJaWYgKElTX0VSUihzbW11LT5iYXNlKSkKKwkJcmV0dXJu IFBUUl9FUlIoc21tdS0+YmFzZSk7CisKKwkvKiBJbnRlcnJ1cHQgbGluZXMgKi8KKworCWlycSA9 IHBsYXRmb3JtX2dldF9pcnFfYnluYW1lKHBkZXYsICJjb21iaW5lZCIpOworCWlmIChpcnEgPiAw KQorCQlzbW11LT5jb21iaW5lZF9pcnEgPSBpcnE7CisJZWxzZSB7CisJCWlycSA9IHBsYXRmb3Jt X2dldF9pcnFfYnluYW1lKHBkZXYsICJldmVudHEiKTsKKwkJaWYgKGlycSA+IDApCisJCQlzbW11 LT5ldnRxLnEuaXJxID0gaXJxOworCisJCWlycSA9IHBsYXRmb3JtX2dldF9pcnFfYnluYW1lKHBk ZXYsICJwcmlxIik7CisJCWlmIChpcnEgPiAwKQorCQkJc21tdS0+cHJpcS5xLmlycSA9IGlycTsK KworCQlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxX2J5bmFtZShwZGV2LCAiY21kcS1zeW5jIik7CisJ CWlmIChpcnEgPiAwKQorCQkJc21tdS0+Y21kcS5xLmlycSA9IGlycTsKKworCQlpcnEgPSBwbGF0 Zm9ybV9nZXRfaXJxX2J5bmFtZShwZGV2LCAiZ2Vycm9yIik7CisJCWlmIChpcnEgPiAwKQorCQkJ c21tdS0+Z2Vycl9pcnEgPSBpcnE7CisJfQorCS8qIFByb2JlIHRoZSBoL3cgKi8KKwlyZXQgPSBh cm1fc21tdV9kZXZpY2VfaHdfcHJvYmUoc21tdSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsK KworCS8qIEluaXRpYWxpc2UgaW4tbWVtb3J5IGRhdGEgc3RydWN0dXJlcyAqLworCXJldCA9IGFy bV9zbW11X2luaXRfc3RydWN0dXJlcyhzbW11KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0Owor CisJLyogUmVjb3JkIG91ciBwcml2YXRlIGRldmljZSBzdHJ1Y3R1cmUgKi8KKwlwbGF0Zm9ybV9z ZXRfZHJ2ZGF0YShwZGV2LCBzbW11KTsKKworCS8qIFJlc2V0IHRoZSBkZXZpY2UgKi8KKwlyZXQg PSBhcm1fc21tdV9kZXZpY2VfcmVzZXQoc21tdSwgYnlwYXNzKTsKKwlpZiAocmV0KQorCQlyZXR1 cm4gcmV0OworCisJLyogQW5kIHdlJ3JlIHVwLiBHbyBnbyBnbyEgKi8KKwlyZXQgPSBpb21tdV9k ZXZpY2Vfc3lzZnNfYWRkKCZzbW11LT5pb21tdSwgZGV2LCBOVUxMLAorCQkJCSAgICAgInNtbXUz LiVwYSIsICZpb2FkZHIpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpb21tdV9kZXZp Y2Vfc2V0X29wcygmc21tdS0+aW9tbXUsICZhcm1fc21tdV9vcHMpOworCWlvbW11X2RldmljZV9z ZXRfZndub2RlKCZzbW11LT5pb21tdSwgZGV2LT5md25vZGUpOworCisJcmV0ID0gaW9tbXVfZGV2 aWNlX3JlZ2lzdGVyKCZzbW11LT5pb21tdSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwg IkZhaWxlZCB0byByZWdpc3RlciBpb21tdVxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisjaWZk ZWYgQ09ORklHX1BDSQorCWlmIChwY2lfYnVzX3R5cGUuaW9tbXVfb3BzICE9ICZhcm1fc21tdV9v cHMpIHsKKwkJcGNpX3JlcXVlc3RfYWNzKCk7CisJCXJldCA9IGJ1c19zZXRfaW9tbXUoJnBjaV9i dXNfdHlwZSwgJmFybV9zbW11X29wcyk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0K KyNlbmRpZgorI2lmZGVmIENPTkZJR19BUk1fQU1CQQorCWlmIChhbWJhX2J1c3R5cGUuaW9tbXVf b3BzICE9ICZhcm1fc21tdV9vcHMpIHsKKwkJcmV0ID0gYnVzX3NldF9pb21tdSgmYW1iYV9idXN0 eXBlLCAmYXJtX3NtbXVfb3BzKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorI2Vu ZGlmCisJaWYgKHBsYXRmb3JtX2J1c190eXBlLmlvbW11X29wcyAhPSAmYXJtX3NtbXVfb3BzKSB7 CisJCXJldCA9IGJ1c19zZXRfaW9tbXUoJnBsYXRmb3JtX2J1c190eXBlLCAmYXJtX3NtbXVfb3Bz KTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0 aWMgaW50IGFybV9zbW11X2RldmljZV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRl dikKK3sKKwlzdHJ1Y3QgYXJtX3NtbXVfZGV2aWNlICpzbW11ID0gcGxhdGZvcm1fZ2V0X2RydmRh dGEocGRldik7CisKKwlhcm1fc21tdV9kZXZpY2VfZGlzYWJsZShzbW11KTsKKworCXJldHVybiAw OworfQorCitzdGF0aWMgdm9pZCBhcm1fc21tdV9kZXZpY2Vfc2h1dGRvd24oc3RydWN0IHBsYXRm b3JtX2RldmljZSAqcGRldikKK3sKKwlhcm1fc21tdV9kZXZpY2VfcmVtb3ZlKHBkZXYpOworfQor CitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBhcm1fc21tdV9vZl9tYXRjaFtdID0g eworCXsgLmNvbXBhdGlibGUgPSAiYXJtLHNtbXUtdjMiLCB9LAorCXsgfSwKK307CitNT0RVTEVf REVWSUNFX1RBQkxFKG9mLCBhcm1fc21tdV9vZl9tYXRjaCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGxh dGZvcm1fZHJpdmVyIGFybV9zbW11X2RyaXZlciA9IHsKKwkuZHJpdmVyCT0geworCQkubmFtZQkJ PSAiYXJtLXNtbXUtdjMiLAorCQkub2ZfbWF0Y2hfdGFibGUJPSBvZl9tYXRjaF9wdHIoYXJtX3Nt bXVfb2ZfbWF0Y2gpLAorCX0sCisJLnByb2JlCT0gYXJtX3NtbXVfZGV2aWNlX3Byb2JlLAorCS5y ZW1vdmUJPSBhcm1fc21tdV9kZXZpY2VfcmVtb3ZlLAorCS5zaHV0ZG93biA9IGFybV9zbW11X2Rl dmljZV9zaHV0ZG93biwKK307Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGFybV9zbW11X2RyaXZl cik7CisKK0lPTU1VX09GX0RFQ0xBUkUoYXJtX3NtbXV2MywgImFybSxzbW11LXYzIiwgTlVMTCk7 CisKK01PRFVMRV9ERVNDUklQVElPTigiSU9NTVUgQVBJIGZvciBBUk0gYXJjaGl0ZWN0ZWQgU01N VXYzIGltcGxlbWVudGF0aW9ucyIpOworTU9EVUxFX0FVVEhPUigiV2lsbCBEZWFjb24gPHdpbGwu ZGVhY29uQGFybS5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7Ci0tIApRdWFsY29t bSBEYXRhY2VudGVyIFRlY2hub2xvZ2llcyBhcyBhbiBhZmZpbGlhdGUgb2YgUXVhbGNvbW0gVGVj aG5vbG9naWVzLCBJbmMuIFF1YWxjb21tIFRlY2hub2xvZ2llcywgSW5jLiBpcyBhIG1lbWJlciBv ZiB0aGUgQ29kZSBBdXJvcmEgRm9ydW0sIGEgTGludXggRm91bmRhdGlvbiBDb2xsYWJvcmF0aXZl IFByb2plY3QuCgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X18KWGVuLWRldmVsIG1haWxpbmcgbGlzdApYZW4tZGV2ZWxAbGlzdHMueGVucHJvamVjdC5vcmcK aHR0cHM6Ly9saXN0cy54ZW5wcm9qZWN0Lm9yZy9tYWlsbWFuL2xpc3RpbmZvL3hlbi1kZXZlbA==