From mboxrd@z Thu Jan 1 00:00:00 1970 From: Sameer Goel Subject: [v2 3/6] Add verbatim copy of arm-smmu-v3.c from Linux Date: Wed, 23 May 2018 18:46:17 -0600 Message-ID: <20180524004620.23828-4-sameer.goel@linaro.org> References: <20180524004620.23828-1-sameer.goel@linaro.org> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from us1-rack-dfw2.inumbo.com ([104.130.134.6]) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1fLeP1-0001Et-TF for xen-devel@lists.xenproject.org; Thu, 24 May 2018 00:46:48 +0000 Received: by mail-pl0-x243.google.com with SMTP id u6-v6so14026465pls.9 for ; Wed, 23 May 2018 17:46:43 -0700 (PDT) In-Reply-To: <20180524004620.23828-1-sameer.goel@linaro.org> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" To: xen-devel@lists.xenproject.org, julien.grall@arm.com, mjaggi@caviumnetworks.com Cc: sstabellini@kernel.org, shankerd@codeaurora.org, Sameer Goel List-Id: xen-devel@lists.xenproject.org QmFzZWQgb24gY29tbWl0IDdhYTg2MTlhNjZhZWE1MmIxNDVlMDRjYmFiNGY4ZDZhNGU1ZjNmM2IK VGhpcyBpcyBhIHZlcmJhdGltIHNuYXBzaG90IG9mIGFybS1zbW11LXYzLmMgZnJvbSBMaW51eCBr ZXJuZWwgc291cmNlCmNvZGUuCk5vIFhlbiBjb2RlIGhhcyBiZWVuIGFkZGVkIGFuZCB0aGUgZmls ZSBpcyBub3QgYnVpbHQuCgpTaWduZWQtb2ZmLWJ5OiBTYW1lZXIgR29lbCA8c2FtZWVyLmdvZWxA bGluYXJvLm9yZz4KLS0tCiB4ZW4vZHJpdmVycy9wYXNzdGhyb3VnaC9hcm0vc21tdS12My5jIHwg Mjg4NSArKysrKysrKysrKysrKysrKysrKysrKysrCiAxIGZpbGUgY2hhbmdlZCwgMjg4NSBpbnNl cnRpb25zKCspCiBjcmVhdGUgbW9kZSAxMDA2NDQgeGVuL2RyaXZlcnMvcGFzc3Rocm91Z2gvYXJt L3NtbXUtdjMuYwoKZGlmZiAtLWdpdCBhL3hlbi9kcml2ZXJzL3Bhc3N0aHJvdWdoL2FybS9zbW11 LXYzLmMgYi94ZW4vZHJpdmVycy9wYXNzdGhyb3VnaC9hcm0vc21tdS12My5jCm5ldyBmaWxlIG1v ZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAuLmU2N2JhNmM0MGYKLS0tIC9kZXYvbnVsbAorKysg Yi94ZW4vZHJpdmVycy9wYXNzdGhyb3VnaC9hcm0vc21tdS12My5jCkBAIC0wLDAgKzEsMjg4NSBA QAorLyoKKyAqIElPTU1VIEFQSSBmb3IgQVJNIGFyY2hpdGVjdGVkIFNNTVV2MyBpbXBsZW1lbnRh dGlvbnMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVk aXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUg R05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkg dGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlz dHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRI T1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisg KiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBT ZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgor ICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFs IFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2Vl IDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIw MTUgQVJNIExpbWl0ZWQKKyAqCisgKiBBdXRob3I6IFdpbGwgRGVhY29uIDx3aWxsLmRlYWNvbkBh cm0uY29tPgorICoKKyAqIFRoaXMgZHJpdmVyIGlzIHBvd2VyZWQgYnkgYmFkIGNvZmZlZSBhbmQg Ym9tYmF5IG1peC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgorI2luY2x1ZGUgPGxp bnV4L2FjcGlfaW9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGlu dXgvZG1hLWlvbW11Lmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgv aW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9tbXUuaD4KKyNpbmNsdWRlIDxsaW51eC9p b3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tc2ku aD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4K KyNpbmNsdWRlIDxsaW51eC9vZl9pb21tdS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3Jt Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2 aWNlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9hbWJhL2J1cy5oPgorCisjaW5jbHVkZSAiaW8tcGd0 YWJsZS5oIgorCisvKiBNTUlPIHJlZ2lzdGVycyAqLworI2RlZmluZSBBUk1fU01NVV9JRFIwCQkJ MHgwCisjZGVmaW5lIElEUjBfU1RfTFZMX1NISUZUCQkyNworI2RlZmluZSBJRFIwX1NUX0xWTF9N QVNLCQkweDMKKyNkZWZpbmUgSURSMF9TVF9MVkxfMkxWTAkJKDEgPDwgSURSMF9TVF9MVkxfU0hJ RlQpCisjZGVmaW5lIElEUjBfU1RBTExfTU9ERUxfU0hJRlQJCTI0CisjZGVmaW5lIElEUjBfU1RB TExfTU9ERUxfTUFTSwkJMHgzCisjZGVmaW5lIElEUjBfU1RBTExfTU9ERUxfU1RBTEwJCSgwIDw8 IElEUjBfU1RBTExfTU9ERUxfU0hJRlQpCisjZGVmaW5lIElEUjBfU1RBTExfTU9ERUxfRk9SQ0UJ CSgyIDw8IElEUjBfU1RBTExfTU9ERUxfU0hJRlQpCisjZGVmaW5lIElEUjBfVFRFTkRJQU5fU0hJ RlQJCTIxCisjZGVmaW5lIElEUjBfVFRFTkRJQU5fTUFTSwkJMHgzCisjZGVmaW5lIElEUjBfVFRF TkRJQU5fTEUJCSgyIDw8IElEUjBfVFRFTkRJQU5fU0hJRlQpCisjZGVmaW5lIElEUjBfVFRFTkRJ QU5fQkUJCSgzIDw8IElEUjBfVFRFTkRJQU5fU0hJRlQpCisjZGVmaW5lIElEUjBfVFRFTkRJQU5f TUlYRUQJCSgwIDw8IElEUjBfVFRFTkRJQU5fU0hJRlQpCisjZGVmaW5lIElEUjBfQ0QyTAkJCSgx IDw8IDE5KQorI2RlZmluZSBJRFIwX1ZNSUQxNgkJCSgxIDw8IDE4KQorI2RlZmluZSBJRFIwX1BS SQkJCSgxIDw8IDE2KQorI2RlZmluZSBJRFIwX1NFVgkJCSgxIDw8IDE0KQorI2RlZmluZSBJRFIw X01TSQkJCSgxIDw8IDEzKQorI2RlZmluZSBJRFIwX0FTSUQxNgkJCSgxIDw8IDEyKQorI2RlZmlu ZSBJRFIwX0FUUwkJCSgxIDw8IDEwKQorI2RlZmluZSBJRFIwX0hZUAkJCSgxIDw8IDkpCisjZGVm aW5lIElEUjBfQ09IQUNDCQkJKDEgPDwgNCkKKyNkZWZpbmUgSURSMF9UVEZfU0hJRlQJCQkyCisj ZGVmaW5lIElEUjBfVFRGX01BU0sJCQkweDMKKyNkZWZpbmUgSURSMF9UVEZfQUFSQ0g2NAkJKDIg PDwgSURSMF9UVEZfU0hJRlQpCisjZGVmaW5lIElEUjBfVFRGX0FBUkNIMzJfNjQJCSgzIDw8IElE UjBfVFRGX1NISUZUKQorI2RlZmluZSBJRFIwX1MxUAkJCSgxIDw8IDEpCisjZGVmaW5lIElEUjBf UzJQCQkJKDEgPDwgMCkKKworI2RlZmluZSBBUk1fU01NVV9JRFIxCQkJMHg0CisjZGVmaW5lIElE UjFfVEFCTEVTX1BSRVNFVAkJKDEgPDwgMzApCisjZGVmaW5lIElEUjFfUVVFVUVTX1BSRVNFVAkJ KDEgPDwgMjkpCisjZGVmaW5lIElEUjFfUkVMCQkJKDEgPDwgMjgpCisjZGVmaW5lIElEUjFfQ01E UV9TSElGVAkJCTIxCisjZGVmaW5lIElEUjFfQ01EUV9NQVNLCQkJMHgxZgorI2RlZmluZSBJRFIx X0VWVFFfU0hJRlQJCQkxNgorI2RlZmluZSBJRFIxX0VWVFFfTUFTSwkJCTB4MWYKKyNkZWZpbmUg SURSMV9QUklRX1NISUZUCQkJMTEKKyNkZWZpbmUgSURSMV9QUklRX01BU0sJCQkweDFmCisjZGVm aW5lIElEUjFfU1NJRF9TSElGVAkJCTYKKyNkZWZpbmUgSURSMV9TU0lEX01BU0sJCQkweDFmCisj ZGVmaW5lIElEUjFfU0lEX1NISUZUCQkJMAorI2RlZmluZSBJRFIxX1NJRF9NQVNLCQkJMHgzZgor CisjZGVmaW5lIEFSTV9TTU1VX0lEUjUJCQkweDE0CisjZGVmaW5lIElEUjVfU1RBTExfTUFYX1NI SUZUCQkxNgorI2RlZmluZSBJRFI1X1NUQUxMX01BWF9NQVNLCQkweGZmZmYKKyNkZWZpbmUgSURS NV9HUkFONjRLCQkJKDEgPDwgNikKKyNkZWZpbmUgSURSNV9HUkFOMTZLCQkJKDEgPDwgNSkKKyNk ZWZpbmUgSURSNV9HUkFONEsJCQkoMSA8PCA0KQorI2RlZmluZSBJRFI1X09BU19TSElGVAkJCTAK KyNkZWZpbmUgSURSNV9PQVNfTUFTSwkJCTB4NworI2RlZmluZSBJRFI1X09BU18zMl9CSVQJCQko MCA8PCBJRFI1X09BU19TSElGVCkKKyNkZWZpbmUgSURSNV9PQVNfMzZfQklUCQkJKDEgPDwgSURS NV9PQVNfU0hJRlQpCisjZGVmaW5lIElEUjVfT0FTXzQwX0JJVAkJCSgyIDw8IElEUjVfT0FTX1NI SUZUKQorI2RlZmluZSBJRFI1X09BU180Ml9CSVQJCQkoMyA8PCBJRFI1X09BU19TSElGVCkKKyNk ZWZpbmUgSURSNV9PQVNfNDRfQklUCQkJKDQgPDwgSURSNV9PQVNfU0hJRlQpCisjZGVmaW5lIElE UjVfT0FTXzQ4X0JJVAkJCSg1IDw8IElEUjVfT0FTX1NISUZUKQorCisjZGVmaW5lIEFSTV9TTU1V X0NSMAkJCTB4MjAKKyNkZWZpbmUgQ1IwX0NNRFFFTgkJCSgxIDw8IDMpCisjZGVmaW5lIENSMF9F VlRRRU4JCQkoMSA8PCAyKQorI2RlZmluZSBDUjBfUFJJUUVOCQkJKDEgPDwgMSkKKyNkZWZpbmUg Q1IwX1NNTVVFTgkJCSgxIDw8IDApCisKKyNkZWZpbmUgQVJNX1NNTVVfQ1IwQUNLCQkJMHgyNAor CisjZGVmaW5lIEFSTV9TTU1VX0NSMQkJCTB4MjgKKyNkZWZpbmUgQ1IxX1NIX05TSAkJCTAKKyNk ZWZpbmUgQ1IxX1NIX09TSAkJCTIKKyNkZWZpbmUgQ1IxX1NIX0lTSAkJCTMKKyNkZWZpbmUgQ1Ix X0NBQ0hFX05DCQkJMAorI2RlZmluZSBDUjFfQ0FDSEVfV0IJCQkxCisjZGVmaW5lIENSMV9DQUNI RV9XVAkJCTIKKyNkZWZpbmUgQ1IxX1RBQkxFX1NIX1NISUZUCQkxMAorI2RlZmluZSBDUjFfVEFC TEVfT0NfU0hJRlQJCTgKKyNkZWZpbmUgQ1IxX1RBQkxFX0lDX1NISUZUCQk2CisjZGVmaW5lIENS MV9RVUVVRV9TSF9TSElGVAkJNAorI2RlZmluZSBDUjFfUVVFVUVfT0NfU0hJRlQJCTIKKyNkZWZp bmUgQ1IxX1FVRVVFX0lDX1NISUZUCQkwCisKKyNkZWZpbmUgQVJNX1NNTVVfQ1IyCQkJMHgyYwor I2RlZmluZSBDUjJfUFRNCQkJCSgxIDw8IDIpCisjZGVmaW5lIENSMl9SRUNJTlZTSUQJCQkoMSA8 PCAxKQorI2RlZmluZSBDUjJfRTJICQkJCSgxIDw8IDApCisKKyNkZWZpbmUgQVJNX1NNTVVfR0JQ QQkJCTB4NDQKKyNkZWZpbmUgR0JQQV9BQk9SVAkJCSgxIDw8IDIwKQorI2RlZmluZSBHQlBBX1VQ REFURQkJCSgxIDw8IDMxKQorCisjZGVmaW5lIEFSTV9TTU1VX0lSUV9DVFJMCQkweDUwCisjZGVm aW5lIElSUV9DVFJMX0VWVFFfSVJRRU4JCSgxIDw8IDIpCisjZGVmaW5lIElSUV9DVFJMX1BSSVFf SVJRRU4JCSgxIDw8IDEpCisjZGVmaW5lIElSUV9DVFJMX0dFUlJPUl9JUlFFTgkJKDEgPDwgMCkK KworI2RlZmluZSBBUk1fU01NVV9JUlFfQ1RSTEFDSwkJMHg1NAorCisjZGVmaW5lIEFSTV9TTU1V X0dFUlJPUgkJCTB4NjAKKyNkZWZpbmUgR0VSUk9SX1NGTV9FUlIJCQkoMSA8PCA4KQorI2RlZmlu ZSBHRVJST1JfTVNJX0dFUlJPUl9BQlRfRVJSCSgxIDw8IDcpCisjZGVmaW5lIEdFUlJPUl9NU0lf UFJJUV9BQlRfRVJSCQkoMSA8PCA2KQorI2RlZmluZSBHRVJST1JfTVNJX0VWVFFfQUJUX0VSUgkJ KDEgPDwgNSkKKyNkZWZpbmUgR0VSUk9SX01TSV9DTURRX0FCVF9FUlIJCSgxIDw8IDQpCisjZGVm aW5lIEdFUlJPUl9QUklRX0FCVF9FUlIJCSgxIDw8IDMpCisjZGVmaW5lIEdFUlJPUl9FVlRRX0FC VF9FUlIJCSgxIDw8IDIpCisjZGVmaW5lIEdFUlJPUl9DTURRX0VSUgkJCSgxIDw8IDApCisjZGVm aW5lIEdFUlJPUl9FUlJfTUFTSwkJCTB4ZmQKKworI2RlZmluZSBBUk1fU01NVV9HRVJST1JOCQkw eDY0CisKKyNkZWZpbmUgQVJNX1NNTVVfR0VSUk9SX0lSUV9DRkcwCTB4NjgKKyNkZWZpbmUgQVJN X1NNTVVfR0VSUk9SX0lSUV9DRkcxCTB4NzAKKyNkZWZpbmUgQVJNX1NNTVVfR0VSUk9SX0lSUV9D RkcyCTB4NzQKKworI2RlZmluZSBBUk1fU01NVV9TVFJUQUJfQkFTRQkJMHg4MAorI2RlZmluZSBT VFJUQUJfQkFTRV9SQQkJCSgxVUwgPDwgNjIpCisjZGVmaW5lIFNUUlRBQl9CQVNFX0FERFJfU0hJ RlQJCTYKKyNkZWZpbmUgU1RSVEFCX0JBU0VfQUREUl9NQVNLCQkweDNmZmZmZmZmZmZmVUwKKwor I2RlZmluZSBBUk1fU01NVV9TVFJUQUJfQkFTRV9DRkcJMHg4OAorI2RlZmluZSBTVFJUQUJfQkFT RV9DRkdfTE9HMlNJWkVfU0hJRlQJMAorI2RlZmluZSBTVFJUQUJfQkFTRV9DRkdfTE9HMlNJWkVf TUFTSwkweDNmCisjZGVmaW5lIFNUUlRBQl9CQVNFX0NGR19TUExJVF9TSElGVAk2CisjZGVmaW5l IFNUUlRBQl9CQVNFX0NGR19TUExJVF9NQVNLCTB4MWYKKyNkZWZpbmUgU1RSVEFCX0JBU0VfQ0ZH X0ZNVF9TSElGVAkxNgorI2RlZmluZSBTVFJUQUJfQkFTRV9DRkdfRk1UX01BU0sJMHgzCisjZGVm aW5lIFNUUlRBQl9CQVNFX0NGR19GTVRfTElORUFSCSgwIDw8IFNUUlRBQl9CQVNFX0NGR19GTVRf U0hJRlQpCisjZGVmaW5lIFNUUlRBQl9CQVNFX0NGR19GTVRfMkxWTAkoMSA8PCBTVFJUQUJfQkFT RV9DRkdfRk1UX1NISUZUKQorCisjZGVmaW5lIEFSTV9TTU1VX0NNRFFfQkFTRQkJMHg5MAorI2Rl ZmluZSBBUk1fU01NVV9DTURRX1BST0QJCTB4OTgKKyNkZWZpbmUgQVJNX1NNTVVfQ01EUV9DT05T CQkweDljCisKKyNkZWZpbmUgQVJNX1NNTVVfRVZUUV9CQVNFCQkweGEwCisjZGVmaW5lIEFSTV9T TU1VX0VWVFFfUFJPRAkJMHgxMDBhOAorI2RlZmluZSBBUk1fU01NVV9FVlRRX0NPTlMJCTB4MTAw YWMKKyNkZWZpbmUgQVJNX1NNTVVfRVZUUV9JUlFfQ0ZHMAkJMHhiMAorI2RlZmluZSBBUk1fU01N VV9FVlRRX0lSUV9DRkcxCQkweGI4CisjZGVmaW5lIEFSTV9TTU1VX0VWVFFfSVJRX0NGRzIJCTB4 YmMKKworI2RlZmluZSBBUk1fU01NVV9QUklRX0JBU0UJCTB4YzAKKyNkZWZpbmUgQVJNX1NNTVVf UFJJUV9QUk9ECQkweDEwMGM4CisjZGVmaW5lIEFSTV9TTU1VX1BSSVFfQ09OUwkJMHgxMDBjYwor I2RlZmluZSBBUk1fU01NVV9QUklRX0lSUV9DRkcwCQkweGQwCisjZGVmaW5lIEFSTV9TTU1VX1BS SVFfSVJRX0NGRzEJCTB4ZDgKKyNkZWZpbmUgQVJNX1NNTVVfUFJJUV9JUlFfQ0ZHMgkJMHhkYwor CisvKiBDb21tb24gTVNJIGNvbmZpZyBmaWVsZHMgKi8KKyNkZWZpbmUgTVNJX0NGRzBfQUREUl9T SElGVAkJMgorI2RlZmluZSBNU0lfQ0ZHMF9BRERSX01BU0sJCTB4M2ZmZmZmZmZmZmZmVUwKKyNk ZWZpbmUgTVNJX0NGRzJfU0hfU0hJRlQJCTQKKyNkZWZpbmUgTVNJX0NGRzJfU0hfTlNICQkJKDBV TCA8PCBNU0lfQ0ZHMl9TSF9TSElGVCkKKyNkZWZpbmUgTVNJX0NGRzJfU0hfT1NICQkJKDJVTCA8 PCBNU0lfQ0ZHMl9TSF9TSElGVCkKKyNkZWZpbmUgTVNJX0NGRzJfU0hfSVNICQkJKDNVTCA8PCBN U0lfQ0ZHMl9TSF9TSElGVCkKKyNkZWZpbmUgTVNJX0NGRzJfTUVNQVRUUl9TSElGVAkJMAorI2Rl ZmluZSBNU0lfQ0ZHMl9NRU1BVFRSX0RFVklDRV9uR25SRQkoMHgxIDw8IE1TSV9DRkcyX01FTUFU VFJfU0hJRlQpCisKKyNkZWZpbmUgUV9JRFgocSwgcCkJCQkoKHApICYgKCgxIDw8IChxKS0+bWF4 X25fc2hpZnQpIC0gMSkpCisjZGVmaW5lIFFfV1JQKHEsIHApCQkJKChwKSAmICgxIDw8IChxKS0+ bWF4X25fc2hpZnQpKQorI2RlZmluZSBRX09WRVJGTE9XX0ZMQUcJCQkoMSA8PCAzMSkKKyNkZWZp bmUgUV9PVkYocSwgcCkJCQkoKHApICYgUV9PVkVSRkxPV19GTEFHKQorI2RlZmluZSBRX0VOVChx LCBwKQkJCSgocSktPmJhc2UgKwkJCVwKKwkJCQkJIFFfSURYKHEsIHApICogKHEpLT5lbnRfZHdv cmRzKQorCisjZGVmaW5lIFFfQkFTRV9SV0EJCQkoMVVMIDw8IDYyKQorI2RlZmluZSBRX0JBU0Vf QUREUl9TSElGVAkJNQorI2RlZmluZSBRX0JBU0VfQUREUl9NQVNLCQkweGZmZmZmZmZmZmZmVUwK KyNkZWZpbmUgUV9CQVNFX0xPRzJTSVpFX1NISUZUCQkwCisjZGVmaW5lIFFfQkFTRV9MT0cyU0la RV9NQVNLCQkweDFmVUwKKworLyoKKyAqIFN0cmVhbSB0YWJsZS4KKyAqCisgKiBMaW5lYXI6IEVu b3VnaCB0byBjb3ZlciAxIDw8IElEUjEuU0lEU0laRSBlbnRyaWVzCisgKiAybHZsOiAxMjhrIEwx IGVudHJpZXMsCisgKiAgICAgICAyNTYgbGF6eSBlbnRyaWVzIHBlciB0YWJsZSAoZWFjaCB0YWJs ZSBjb3ZlcnMgYSBQQ0kgYnVzKQorICovCisjZGVmaW5lIFNUUlRBQl9MMV9TWl9TSElGVAkJMjAK KyNkZWZpbmUgU1RSVEFCX1NQTElUCQkJOAorCisjZGVmaW5lIFNUUlRBQl9MMV9ERVNDX0RXT1JE UwkJMQorI2RlZmluZSBTVFJUQUJfTDFfREVTQ19TUEFOX1NISUZUCTAKKyNkZWZpbmUgU1RSVEFC X0wxX0RFU0NfU1BBTl9NQVNLCTB4MWZVTAorI2RlZmluZSBTVFJUQUJfTDFfREVTQ19MMlBUUl9T SElGVAk2CisjZGVmaW5lIFNUUlRBQl9MMV9ERVNDX0wyUFRSX01BU0sJMHgzZmZmZmZmZmZmZlVM CisKKyNkZWZpbmUgU1RSVEFCX1NURV9EV09SRFMJCTgKKyNkZWZpbmUgU1RSVEFCX1NURV8wX1YJ CQkoMVVMIDw8IDApCisjZGVmaW5lIFNUUlRBQl9TVEVfMF9DRkdfU0hJRlQJCTEKKyNkZWZpbmUg U1RSVEFCX1NURV8wX0NGR19NQVNLCQkweDdVTAorI2RlZmluZSBTVFJUQUJfU1RFXzBfQ0ZHX0FC T1JUCQkoMFVMIDw8IFNUUlRBQl9TVEVfMF9DRkdfU0hJRlQpCisjZGVmaW5lIFNUUlRBQl9TVEVf MF9DRkdfQllQQVNTCQkoNFVMIDw8IFNUUlRBQl9TVEVfMF9DRkdfU0hJRlQpCisjZGVmaW5lIFNU UlRBQl9TVEVfMF9DRkdfUzFfVFJBTlMJKDVVTCA8PCBTVFJUQUJfU1RFXzBfQ0ZHX1NISUZUKQor I2RlZmluZSBTVFJUQUJfU1RFXzBfQ0ZHX1MyX1RSQU5TCSg2VUwgPDwgU1RSVEFCX1NURV8wX0NG R19TSElGVCkKKworI2RlZmluZSBTVFJUQUJfU1RFXzBfUzFGTVRfU0hJRlQJNAorI2RlZmluZSBT VFJUQUJfU1RFXzBfUzFGTVRfTElORUFSCSgwVUwgPDwgU1RSVEFCX1NURV8wX1MxRk1UX1NISUZU KQorI2RlZmluZSBTVFJUQUJfU1RFXzBfUzFDVFhQVFJfU0hJRlQJNgorI2RlZmluZSBTVFJUQUJf U1RFXzBfUzFDVFhQVFJfTUFTSwkweDNmZmZmZmZmZmZmVUwKKyNkZWZpbmUgU1RSVEFCX1NURV8w X1MxQ0RNQVhfU0hJRlQJNTkKKyNkZWZpbmUgU1RSVEFCX1NURV8wX1MxQ0RNQVhfTUFTSwkweDFm VUwKKworI2RlZmluZSBTVFJUQUJfU1RFXzFfUzFDX0NBQ0hFX05DCTBVTAorI2RlZmluZSBTVFJU QUJfU1RFXzFfUzFDX0NBQ0hFX1dCUkEJMVVMCisjZGVmaW5lIFNUUlRBQl9TVEVfMV9TMUNfQ0FD SEVfV1QJMlVMCisjZGVmaW5lIFNUUlRBQl9TVEVfMV9TMUNfQ0FDSEVfV0IJM1VMCisjZGVmaW5l IFNUUlRBQl9TVEVfMV9TMUNfU0hfTlNICQkwVUwKKyNkZWZpbmUgU1RSVEFCX1NURV8xX1MxQ19T SF9PU0gJCTJVTAorI2RlZmluZSBTVFJUQUJfU1RFXzFfUzFDX1NIX0lTSAkJM1VMCisjZGVmaW5l IFNUUlRBQl9TVEVfMV9TMUNJUl9TSElGVAkyCisjZGVmaW5lIFNUUlRBQl9TVEVfMV9TMUNPUl9T SElGVAk0CisjZGVmaW5lIFNUUlRBQl9TVEVfMV9TMUNTSF9TSElGVAk2CisKKyNkZWZpbmUgU1RS VEFCX1NURV8xX1MxU1RBTExECQkoMVVMIDw8IDI3KQorCisjZGVmaW5lIFNUUlRBQl9TVEVfMV9F QVRTX0FCVAkJMFVMCisjZGVmaW5lIFNUUlRBQl9TVEVfMV9FQVRTX1RSQU5TCQkxVUwKKyNkZWZp bmUgU1RSVEFCX1NURV8xX0VBVFNfUzFDSEsJCTJVTAorI2RlZmluZSBTVFJUQUJfU1RFXzFfRUFU U19TSElGVAkJMjgKKworI2RlZmluZSBTVFJUQUJfU1RFXzFfU1RSV19OU0VMMQkJMFVMCisjZGVm aW5lIFNUUlRBQl9TVEVfMV9TVFJXX0VMMgkJMlVMCisjZGVmaW5lIFNUUlRBQl9TVEVfMV9TVFJX X1NISUZUCQkzMAorCisjZGVmaW5lIFNUUlRBQl9TVEVfMV9TSENGR19JTkNPTUlORwkxVUwKKyNk ZWZpbmUgU1RSVEFCX1NURV8xX1NIQ0ZHX1NISUZUCTQ0CisKKyNkZWZpbmUgU1RSVEFCX1NURV8y X1MyVk1JRF9TSElGVAkwCisjZGVmaW5lIFNUUlRBQl9TVEVfMl9TMlZNSURfTUFTSwkweGZmZmZV TAorI2RlZmluZSBTVFJUQUJfU1RFXzJfVlRDUl9TSElGVAkJMzIKKyNkZWZpbmUgU1RSVEFCX1NU RV8yX1ZUQ1JfTUFTSwkJMHg3ZmZmZlVMCisjZGVmaW5lIFNUUlRBQl9TVEVfMl9TMkFBNjQJCSgx VUwgPDwgNTEpCisjZGVmaW5lIFNUUlRBQl9TVEVfMl9TMkVOREkJCSgxVUwgPDwgNTIpCisjZGVm aW5lIFNUUlRBQl9TVEVfMl9TMlBUVwkJKDFVTCA8PCA1NCkKKyNkZWZpbmUgU1RSVEFCX1NURV8y X1MyUgkJKDFVTCA8PCA1OCkKKworI2RlZmluZSBTVFJUQUJfU1RFXzNfUzJUVEJfU0hJRlQJNAor I2RlZmluZSBTVFJUQUJfU1RFXzNfUzJUVEJfTUFTSwkJMHhmZmZmZmZmZmZmZlVMCisKKy8qIENv bnRleHQgZGVzY3JpcHRvciAoc3RhZ2UtMSBvbmx5KSAqLworI2RlZmluZSBDVFhERVNDX0NEX0RX T1JEUwkJOAorI2RlZmluZSBDVFhERVNDX0NEXzBfVENSX1QwU1pfU0hJRlQJMAorI2RlZmluZSBB Uk02NF9UQ1JfVDBTWl9TSElGVAkJMAorI2RlZmluZSBBUk02NF9UQ1JfVDBTWl9NQVNLCQkweDFm VUwKKyNkZWZpbmUgQ1RYREVTQ19DRF8wX1RDUl9URzBfU0hJRlQJNgorI2RlZmluZSBBUk02NF9U Q1JfVEcwX1NISUZUCQkxNAorI2RlZmluZSBBUk02NF9UQ1JfVEcwX01BU0sJCTB4M1VMCisjZGVm aW5lIENUWERFU0NfQ0RfMF9UQ1JfSVJHTjBfU0hJRlQJOAorI2RlZmluZSBBUk02NF9UQ1JfSVJH TjBfU0hJRlQJCTgKKyNkZWZpbmUgQVJNNjRfVENSX0lSR04wX01BU0sJCTB4M1VMCisjZGVmaW5l IENUWERFU0NfQ0RfMF9UQ1JfT1JHTjBfU0hJRlQJMTAKKyNkZWZpbmUgQVJNNjRfVENSX09SR04w X1NISUZUCQkxMAorI2RlZmluZSBBUk02NF9UQ1JfT1JHTjBfTUFTSwkJMHgzVUwKKyNkZWZpbmUg Q1RYREVTQ19DRF8wX1RDUl9TSDBfU0hJRlQJMTIKKyNkZWZpbmUgQVJNNjRfVENSX1NIMF9TSElG VAkJMTIKKyNkZWZpbmUgQVJNNjRfVENSX1NIMF9NQVNLCQkweDNVTAorI2RlZmluZSBDVFhERVND X0NEXzBfVENSX0VQRDBfU0hJRlQJMTQKKyNkZWZpbmUgQVJNNjRfVENSX0VQRDBfU0hJRlQJCTcK KyNkZWZpbmUgQVJNNjRfVENSX0VQRDBfTUFTSwkJMHgxVUwKKyNkZWZpbmUgQ1RYREVTQ19DRF8w X1RDUl9FUEQxX1NISUZUCTMwCisjZGVmaW5lIEFSTTY0X1RDUl9FUEQxX1NISUZUCQkyMworI2Rl ZmluZSBBUk02NF9UQ1JfRVBEMV9NQVNLCQkweDFVTAorCisjZGVmaW5lIENUWERFU0NfQ0RfMF9F TkRJCQkoMVVMIDw8IDE1KQorI2RlZmluZSBDVFhERVNDX0NEXzBfVgkJCSgxVUwgPDwgMzEpCisK KyNkZWZpbmUgQ1RYREVTQ19DRF8wX1RDUl9JUFNfU0hJRlQJMzIKKyNkZWZpbmUgQVJNNjRfVENS X0lQU19TSElGVAkJMzIKKyNkZWZpbmUgQVJNNjRfVENSX0lQU19NQVNLCQkweDdVTAorI2RlZmlu ZSBDVFhERVNDX0NEXzBfVENSX1RCSTBfU0hJRlQJMzgKKyNkZWZpbmUgQVJNNjRfVENSX1RCSTBf U0hJRlQJCTM3CisjZGVmaW5lIEFSTTY0X1RDUl9UQkkwX01BU0sJCTB4MVVMCisKKyNkZWZpbmUg Q1RYREVTQ19DRF8wX0FBNjQJCSgxVUwgPDwgNDEpCisjZGVmaW5lIENUWERFU0NfQ0RfMF9SCQkJ KDFVTCA8PCA0NSkKKyNkZWZpbmUgQ1RYREVTQ19DRF8wX0EJCQkoMVVMIDw8IDQ2KQorI2RlZmlu ZSBDVFhERVNDX0NEXzBfQVNFVF9TSElGVAkJNDcKKyNkZWZpbmUgQ1RYREVTQ19DRF8wX0FTRVRf U0hBUkVECSgwVUwgPDwgQ1RYREVTQ19DRF8wX0FTRVRfU0hJRlQpCisjZGVmaW5lIENUWERFU0Nf Q0RfMF9BU0VUX1BSSVZBVEUJKDFVTCA8PCBDVFhERVNDX0NEXzBfQVNFVF9TSElGVCkKKyNkZWZp bmUgQ1RYREVTQ19DRF8wX0FTSURfU0hJRlQJCTQ4CisjZGVmaW5lIENUWERFU0NfQ0RfMF9BU0lE X01BU0sJCTB4ZmZmZlVMCisKKyNkZWZpbmUgQ1RYREVTQ19DRF8xX1RUQjBfU0hJRlQJCTQKKyNk ZWZpbmUgQ1RYREVTQ19DRF8xX1RUQjBfTUFTSwkJMHhmZmZmZmZmZmZmZlVMCisKKyNkZWZpbmUg Q1RYREVTQ19DRF8zX01BSVJfU0hJRlQJCTAKKworLyogQ29udmVydCBiZXR3ZWVuIEFBcmNoNjQg KENQVSkgVENSIGZvcm1hdCBhbmQgU01NVSBDRCBmb3JtYXQgKi8KKyNkZWZpbmUgQVJNX1NNTVVf VENSMkNEKHRjciwgZmxkKQkJCQkJXAorCSgoKHRjcikgPj4gQVJNNjRfVENSXyMjZmxkIyNfU0hJ RlQgJiBBUk02NF9UQ1JfIyNmbGQjI19NQVNLKQlcCisJIDw8IENUWERFU0NfQ0RfMF9UQ1JfIyNm bGQjI19TSElGVCkKKworLyogQ29tbWFuZCBxdWV1ZSAqLworI2RlZmluZSBDTURRX0VOVF9EV09S RFMJCQkyCisjZGVmaW5lIENNRFFfTUFYX1NaX1NISUZUCQk4CisKKyNkZWZpbmUgQ01EUV9FUlJf U0hJRlQJCQkyNAorI2RlZmluZSBDTURRX0VSUl9NQVNLCQkJMHg3ZgorI2RlZmluZSBDTURRX0VS Ul9DRVJST1JfTk9ORV9JRFgJMAorI2RlZmluZSBDTURRX0VSUl9DRVJST1JfSUxMX0lEWAkJMQor I2RlZmluZSBDTURRX0VSUl9DRVJST1JfQUJUX0lEWAkJMgorCisjZGVmaW5lIENNRFFfMF9PUF9T SElGVAkJCTAKKyNkZWZpbmUgQ01EUV8wX09QX01BU0sJCQkweGZmVUwKKyNkZWZpbmUgQ01EUV8w X1NTVgkJCSgxVUwgPDwgMTEpCisKKyNkZWZpbmUgQ01EUV9QUkVGRVRDSF8wX1NJRF9TSElGVAkz MgorI2RlZmluZSBDTURRX1BSRUZFVENIXzFfU0laRV9TSElGVAkwCisjZGVmaW5lIENNRFFfUFJF RkVUQ0hfMV9BRERSX01BU0sJfjB4ZmZmVUwKKworI2RlZmluZSBDTURRX0NGR0lfMF9TSURfU0hJ RlQJCTMyCisjZGVmaW5lIENNRFFfQ0ZHSV8wX1NJRF9NQVNLCQkweGZmZmZmZmZmVUwKKyNkZWZp bmUgQ01EUV9DRkdJXzFfTEVBRgkJKDFVTCA8PCAwKQorI2RlZmluZSBDTURRX0NGR0lfMV9SQU5H RV9TSElGVAkJMAorI2RlZmluZSBDTURRX0NGR0lfMV9SQU5HRV9NQVNLCQkweDFmVUwKKworI2Rl ZmluZSBDTURRX1RMQklfMF9WTUlEX1NISUZUCQkzMgorI2RlZmluZSBDTURRX1RMQklfMF9BU0lE X1NISUZUCQk0OAorI2RlZmluZSBDTURRX1RMQklfMV9MRUFGCQkoMVVMIDw8IDApCisjZGVmaW5l IENNRFFfVExCSV8xX1ZBX01BU0sJCX4weGZmZlVMCisjZGVmaW5lIENNRFFfVExCSV8xX0lQQV9N QVNLCQkweGZmZmZmZmZmZjAwMFVMCisKKyNkZWZpbmUgQ01EUV9QUklfMF9TU0lEX1NISUZUCQkx MgorI2RlZmluZSBDTURRX1BSSV8wX1NTSURfTUFTSwkJMHhmZmZmZlVMCisjZGVmaW5lIENNRFFf UFJJXzBfU0lEX1NISUZUCQkzMgorI2RlZmluZSBDTURRX1BSSV8wX1NJRF9NQVNLCQkweGZmZmZm ZmZmVUwKKyNkZWZpbmUgQ01EUV9QUklfMV9HUlBJRF9TSElGVAkJMAorI2RlZmluZSBDTURRX1BS SV8xX0dSUElEX01BU0sJCTB4MWZmVUwKKyNkZWZpbmUgQ01EUV9QUklfMV9SRVNQX1NISUZUCQkx MgorI2RlZmluZSBDTURRX1BSSV8xX1JFU1BfREVOWQkJKDBVTCA8PCBDTURRX1BSSV8xX1JFU1Bf U0hJRlQpCisjZGVmaW5lIENNRFFfUFJJXzFfUkVTUF9GQUlMCQkoMVVMIDw8IENNRFFfUFJJXzFf UkVTUF9TSElGVCkKKyNkZWZpbmUgQ01EUV9QUklfMV9SRVNQX1NVQ0MJCSgyVUwgPDwgQ01EUV9Q UklfMV9SRVNQX1NISUZUKQorCisjZGVmaW5lIENNRFFfU1lOQ18wX0NTX1NISUZUCQkxMgorI2Rl ZmluZSBDTURRX1NZTkNfMF9DU19OT05FCQkoMFVMIDw8IENNRFFfU1lOQ18wX0NTX1NISUZUKQor I2RlZmluZSBDTURRX1NZTkNfMF9DU19TRVYJCSgyVUwgPDwgQ01EUV9TWU5DXzBfQ1NfU0hJRlQp CisKKy8qIEV2ZW50IHF1ZXVlICovCisjZGVmaW5lIEVWVFFfRU5UX0RXT1JEUwkJCTQKKyNkZWZp bmUgRVZUUV9NQVhfU1pfU0hJRlQJCTcKKworI2RlZmluZSBFVlRRXzBfSURfU0hJRlQJCQkwCisj ZGVmaW5lIEVWVFFfMF9JRF9NQVNLCQkJMHhmZlVMCisKKy8qIFBSSSBxdWV1ZSAqLworI2RlZmlu ZSBQUklRX0VOVF9EV09SRFMJCQkyCisjZGVmaW5lIFBSSVFfTUFYX1NaX1NISUZUCQk4CisKKyNk ZWZpbmUgUFJJUV8wX1NJRF9TSElGVAkJMAorI2RlZmluZSBQUklRXzBfU0lEX01BU0sJCQkweGZm ZmZmZmZmVUwKKyNkZWZpbmUgUFJJUV8wX1NTSURfU0hJRlQJCTMyCisjZGVmaW5lIFBSSVFfMF9T U0lEX01BU0sJCTB4ZmZmZmZVTAorI2RlZmluZSBQUklRXzBfUEVSTV9QUklWCQkoMVVMIDw8IDU4 KQorI2RlZmluZSBQUklRXzBfUEVSTV9FWEVDCQkoMVVMIDw8IDU5KQorI2RlZmluZSBQUklRXzBf UEVSTV9SRUFECQkoMVVMIDw8IDYwKQorI2RlZmluZSBQUklRXzBfUEVSTV9XUklURQkJKDFVTCA8 PCA2MSkKKyNkZWZpbmUgUFJJUV8wX1BSR19MQVNUCQkJKDFVTCA8PCA2MikKKyNkZWZpbmUgUFJJ UV8wX1NTSURfVgkJCSgxVUwgPDwgNjMpCisKKyNkZWZpbmUgUFJJUV8xX1BSR19JRFhfU0hJRlQJ CTAKKyNkZWZpbmUgUFJJUV8xX1BSR19JRFhfTUFTSwkJMHgxZmZVTAorI2RlZmluZSBQUklRXzFf QUREUl9TSElGVAkJMTIKKyNkZWZpbmUgUFJJUV8xX0FERFJfTUFTSwkJMHhmZmZmZmZmZmZmZmZm VUwKKworLyogSGlnaC1sZXZlbCBxdWV1ZSBzdHJ1Y3R1cmVzICovCisjZGVmaW5lIEFSTV9TTU1V X1BPTExfVElNRU9VVF9VUwkxMDAKKyNkZWZpbmUgQVJNX1NNTVVfQ01EUV9EUkFJTl9USU1FT1VU X1VTCTEwMDAwMDAgLyogMXMhICovCisKKyNkZWZpbmUgTVNJX0lPVkFfQkFTRQkJCTB4ODAwMDAw MAorI2RlZmluZSBNU0lfSU9WQV9MRU5HVEgJCQkweDEwMDAwMAorCisvKiBVbnRpbCBBQ1BJQ0Eg aGVhZGVycyBjb3ZlciBJT1JUIHJldi4gQyAqLworI2lmbmRlZiBBQ1BJX0lPUlRfU01NVV9ISVNJ TElDT05fSEkxNjFYCisjZGVmaW5lIEFDUElfSU9SVF9TTU1VX0hJU0lMSUNPTl9ISTE2MVgJCTB4 MQorI2VuZGlmCisKKyNpZm5kZWYgQUNQSV9JT1JUX1NNTVVfVjNfQ0FWSVVNX0NOOTlYWAorI2Rl ZmluZSBBQ1BJX0lPUlRfU01NVV9WM19DQVZJVU1fQ045OVhYCQkweDIKKyNlbmRpZgorCitzdGF0 aWMgYm9vbCBkaXNhYmxlX2J5cGFzczsKK21vZHVsZV9wYXJhbV9uYW1lZChkaXNhYmxlX2J5cGFz cywgZGlzYWJsZV9ieXBhc3MsIGJvb2wsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyhkaXNh YmxlX2J5cGFzcywKKwkiRGlzYWJsZSBieXBhc3Mgc3RyZWFtcyBzdWNoIHRoYXQgaW5jb21pbmcg dHJhbnNhY3Rpb25zIGZyb20gZGV2aWNlcyB0aGF0IGFyZSBub3QgYXR0YWNoZWQgdG8gYW4gaW9t bXUgZG9tYWluIHdpbGwgcmVwb3J0IGFuIGFib3J0IGJhY2sgdG8gdGhlIGRldmljZSBhbmQgd2ls bCBub3QgYmUgYWxsb3dlZCB0byBwYXNzIHRocm91Z2ggdGhlIFNNTVUuIik7CisKK2VudW0gcHJp X3Jlc3AgeworCVBSSV9SRVNQX0RFTlksCisJUFJJX1JFU1BfRkFJTCwKKwlQUklfUkVTUF9TVUND LAorfTsKKworZW51bSBhcm1fc21tdV9tc2lfaW5kZXggeworCUVWVFFfTVNJX0lOREVYLAorCUdF UlJPUl9NU0lfSU5ERVgsCisJUFJJUV9NU0lfSU5ERVgsCisJQVJNX1NNTVVfTUFYX01TSVMsCit9 OworCitzdGF0aWMgcGh5c19hZGRyX3QgYXJtX3NtbXVfbXNpX2NmZ1tBUk1fU01NVV9NQVhfTVNJ U11bM10gPSB7CisJW0VWVFFfTVNJX0lOREVYXSA9IHsKKwkJQVJNX1NNTVVfRVZUUV9JUlFfQ0ZH MCwKKwkJQVJNX1NNTVVfRVZUUV9JUlFfQ0ZHMSwKKwkJQVJNX1NNTVVfRVZUUV9JUlFfQ0ZHMiwK Kwl9LAorCVtHRVJST1JfTVNJX0lOREVYXSA9IHsKKwkJQVJNX1NNTVVfR0VSUk9SX0lSUV9DRkcw LAorCQlBUk1fU01NVV9HRVJST1JfSVJRX0NGRzEsCisJCUFSTV9TTU1VX0dFUlJPUl9JUlFfQ0ZH MiwKKwl9LAorCVtQUklRX01TSV9JTkRFWF0gPSB7CisJCUFSTV9TTU1VX1BSSVFfSVJRX0NGRzAs CisJCUFSTV9TTU1VX1BSSVFfSVJRX0NGRzEsCisJCUFSTV9TTU1VX1BSSVFfSVJRX0NGRzIsCisJ fSwKK307CisKK3N0cnVjdCBhcm1fc21tdV9jbWRxX2VudCB7CisJLyogQ29tbW9uIGZpZWxkcyAq LworCXU4CQkJCW9wY29kZTsKKwlib29sCQkJCXN1YnN0cmVhbV92YWxpZDsKKworCS8qIENvbW1h bmQtc3BlY2lmaWMgZmllbGRzICovCisJdW5pb24geworCQkjZGVmaW5lIENNRFFfT1BfUFJFRkVU Q0hfQ0ZHCTB4MQorCQlzdHJ1Y3QgeworCQkJdTMyCQkJc2lkOworCQkJdTgJCQlzaXplOworCQkJ dTY0CQkJYWRkcjsKKwkJfSBwcmVmZXRjaDsKKworCQkjZGVmaW5lIENNRFFfT1BfQ0ZHSV9TVEUJ MHgzCisJCSNkZWZpbmUgQ01EUV9PUF9DRkdJX0FMTAkweDQKKwkJc3RydWN0IHsKKwkJCXUzMgkJ CXNpZDsKKwkJCXVuaW9uIHsKKwkJCQlib29sCQlsZWFmOworCQkJCXU4CQlzcGFuOworCQkJfTsK KwkJfSBjZmdpOworCisJCSNkZWZpbmUgQ01EUV9PUF9UTEJJX05IX0FTSUQJMHgxMQorCQkjZGVm aW5lIENNRFFfT1BfVExCSV9OSF9WQQkweDEyCisJCSNkZWZpbmUgQ01EUV9PUF9UTEJJX0VMMl9B TEwJMHgyMAorCQkjZGVmaW5lIENNRFFfT1BfVExCSV9TMTJfVk1BTEwJMHgyOAorCQkjZGVmaW5l IENNRFFfT1BfVExCSV9TMl9JUEEJMHgyYQorCQkjZGVmaW5lIENNRFFfT1BfVExCSV9OU05IX0FM TAkweDMwCisJCXN0cnVjdCB7CisJCQl1MTYJCQlhc2lkOworCQkJdTE2CQkJdm1pZDsKKwkJCWJv b2wJCQlsZWFmOworCQkJdTY0CQkJYWRkcjsKKwkJfSB0bGJpOworCisJCSNkZWZpbmUgQ01EUV9P UF9QUklfUkVTUAkweDQxCisJCXN0cnVjdCB7CisJCQl1MzIJCQlzaWQ7CisJCQl1MzIJCQlzc2lk OworCQkJdTE2CQkJZ3JwaWQ7CisJCQllbnVtIHByaV9yZXNwCQlyZXNwOworCQl9IHByaTsKKwor CQkjZGVmaW5lIENNRFFfT1BfQ01EX1NZTkMJMHg0NgorCX07Cit9OworCitzdHJ1Y3QgYXJtX3Nt bXVfcXVldWUgeworCWludAkJCQlpcnE7IC8qIFdpcmVkIGludGVycnVwdCAqLworCisJX19sZTY0 CQkJCSpiYXNlOworCWRtYV9hZGRyX3QJCQliYXNlX2RtYTsKKwl1NjQJCQkJcV9iYXNlOworCisJ c2l6ZV90CQkJCWVudF9kd29yZHM7CisJdTMyCQkJCW1heF9uX3NoaWZ0OworCXUzMgkJCQlwcm9k OworCXUzMgkJCQljb25zOworCisJdTMyIF9faW9tZW0JCQkqcHJvZF9yZWc7CisJdTMyIF9faW9t ZW0JCQkqY29uc19yZWc7Cit9OworCitzdHJ1Y3QgYXJtX3NtbXVfY21kcSB7CisJc3RydWN0IGFy bV9zbW11X3F1ZXVlCQlxOworCXNwaW5sb2NrX3QJCQlsb2NrOworfTsKKworc3RydWN0IGFybV9z bW11X2V2dHEgeworCXN0cnVjdCBhcm1fc21tdV9xdWV1ZQkJcTsKKwl1MzIJCQkJbWF4X3N0YWxs czsKK307CisKK3N0cnVjdCBhcm1fc21tdV9wcmlxIHsKKwlzdHJ1Y3QgYXJtX3NtbXVfcXVldWUJ CXE7Cit9OworCisvKiBIaWdoLWxldmVsIHN0cmVhbSB0YWJsZSBhbmQgY29udGV4dCBkZXNjcmlw dG9yIHN0cnVjdHVyZXMgKi8KK3N0cnVjdCBhcm1fc21tdV9zdHJ0YWJfbDFfZGVzYyB7CisJdTgJ CQkJc3BhbjsKKworCV9fbGU2NAkJCQkqbDJwdHI7CisJZG1hX2FkZHJfdAkJCWwycHRyX2RtYTsK K307CisKK3N0cnVjdCBhcm1fc21tdV9zMV9jZmcgeworCV9fbGU2NAkJCQkqY2RwdHI7CisJZG1h X2FkZHJfdAkJCWNkcHRyX2RtYTsKKworCXN0cnVjdCBhcm1fc21tdV9jdHhfZGVzYyB7CisJCXUx Nglhc2lkOworCQl1NjQJdHRicjsKKwkJdTY0CXRjcjsKKwkJdTY0CW1haXI7CisJfQkJCQljZDsK K307CisKK3N0cnVjdCBhcm1fc21tdV9zMl9jZmcgeworCXUxNgkJCQl2bWlkOworCXU2NAkJCQl2 dHRicjsKKwl1NjQJCQkJdnRjcjsKK307CisKK3N0cnVjdCBhcm1fc21tdV9zdHJ0YWJfZW50IHsK KwkvKgorCSAqIEFuIFNURSBpcyAiYXNzaWduZWQiIGlmIHRoZSBtYXN0ZXIgZW1pdHRpbmcgdGhl IGNvcnJlc3BvbmRpbmcgU0lECisJICogaXMgYXR0YWNoZWQgdG8gYSBkb21haW4uIFRoZSBiZWhh dmlvdXIgb2YgYW4gdW5hc3NpZ25lZCBTVEUgaXMKKwkgKiBkZXRlcm1pbmVkIGJ5IHRoZSBkaXNh YmxlX2J5cGFzcyBwYXJhbWV0ZXIsIHdoZXJlYXMgYW4gYXNzaWduZWQKKwkgKiBTVEUgYmVoYXZl cyBhY2NvcmRpbmcgdG8gczFfY2ZnL3MyX2NmZywgd2hpY2ggdGhlbXNlbHZlcyBhcmUKKwkgKiBj b25maWd1cmVkIGFjY29yZGluZyB0byB0aGUgZG9tYWluIHR5cGUuCisJICovCisJYm9vbAkJCQlh c3NpZ25lZDsKKwlzdHJ1Y3QgYXJtX3NtbXVfczFfY2ZnCQkqczFfY2ZnOworCXN0cnVjdCBhcm1f c21tdV9zMl9jZmcJCSpzMl9jZmc7Cit9OworCitzdHJ1Y3QgYXJtX3NtbXVfc3RydGFiX2NmZyB7 CisJX19sZTY0CQkJCSpzdHJ0YWI7CisJZG1hX2FkZHJfdAkJCXN0cnRhYl9kbWE7CisJc3RydWN0 IGFybV9zbW11X3N0cnRhYl9sMV9kZXNjCSpsMV9kZXNjOworCXVuc2lnbmVkIGludAkJCW51bV9s MV9lbnRzOworCisJdTY0CQkJCXN0cnRhYl9iYXNlOworCXUzMgkJCQlzdHJ0YWJfYmFzZV9jZmc7 Cit9OworCisvKiBBbiBTTU1VdjMgaW5zdGFuY2UgKi8KK3N0cnVjdCBhcm1fc21tdV9kZXZpY2Ug eworCXN0cnVjdCBkZXZpY2UJCQkqZGV2OworCXZvaWQgX19pb21lbQkJCSpiYXNlOworCisjZGVm aW5lIEFSTV9TTU1VX0ZFQVRfMl9MVkxfU1RSVEFCCSgxIDw8IDApCisjZGVmaW5lIEFSTV9TTU1V X0ZFQVRfMl9MVkxfQ0RUQUIJKDEgPDwgMSkKKyNkZWZpbmUgQVJNX1NNTVVfRkVBVF9UVF9MRQkJ KDEgPDwgMikKKyNkZWZpbmUgQVJNX1NNTVVfRkVBVF9UVF9CRQkJKDEgPDwgMykKKyNkZWZpbmUg QVJNX1NNTVVfRkVBVF9QUkkJCSgxIDw8IDQpCisjZGVmaW5lIEFSTV9TTU1VX0ZFQVRfQVRTCQko MSA8PCA1KQorI2RlZmluZSBBUk1fU01NVV9GRUFUX1NFVgkJKDEgPDwgNikKKyNkZWZpbmUgQVJN X1NNTVVfRkVBVF9NU0kJCSgxIDw8IDcpCisjZGVmaW5lIEFSTV9TTU1VX0ZFQVRfQ09IRVJFTkNZ CQkoMSA8PCA4KQorI2RlZmluZSBBUk1fU01NVV9GRUFUX1RSQU5TX1MxCQkoMSA8PCA5KQorI2Rl ZmluZSBBUk1fU01NVV9GRUFUX1RSQU5TX1MyCQkoMSA8PCAxMCkKKyNkZWZpbmUgQVJNX1NNTVVf RkVBVF9TVEFMTFMJCSgxIDw8IDExKQorI2RlZmluZSBBUk1fU01NVV9GRUFUX0hZUAkJKDEgPDwg MTIpCisJdTMyCQkJCWZlYXR1cmVzOworCisjZGVmaW5lIEFSTV9TTU1VX09QVF9TS0lQX1BSRUZF VENICSgxIDw8IDApCisjZGVmaW5lIEFSTV9TTU1VX09QVF9QQUdFMF9SRUdTX09OTFkJKDEgPDwg MSkKKwl1MzIJCQkJb3B0aW9uczsKKworCXN0cnVjdCBhcm1fc21tdV9jbWRxCQljbWRxOworCXN0 cnVjdCBhcm1fc21tdV9ldnRxCQlldnRxOworCXN0cnVjdCBhcm1fc21tdV9wcmlxCQlwcmlxOwor CisJaW50CQkJCWdlcnJfaXJxOworCWludAkJCQljb21iaW5lZF9pcnE7CisKKwl1bnNpZ25lZCBs b25nCQkJaWFzOyAvKiBJUEEgKi8KKwl1bnNpZ25lZCBsb25nCQkJb2FzOyAvKiBQQSAqLworCXVu c2lnbmVkIGxvbmcJCQlwZ3NpemVfYml0bWFwOworCisjZGVmaW5lIEFSTV9TTU1VX01BWF9BU0lE UwkJKDEgPDwgMTYpCisJdW5zaWduZWQgaW50CQkJYXNpZF9iaXRzOworCURFQ0xBUkVfQklUTUFQ KGFzaWRfbWFwLCBBUk1fU01NVV9NQVhfQVNJRFMpOworCisjZGVmaW5lIEFSTV9TTU1VX01BWF9W TUlEUwkJKDEgPDwgMTYpCisJdW5zaWduZWQgaW50CQkJdm1pZF9iaXRzOworCURFQ0xBUkVfQklU TUFQKHZtaWRfbWFwLCBBUk1fU01NVV9NQVhfVk1JRFMpOworCisJdW5zaWduZWQgaW50CQkJc3Np ZF9iaXRzOworCXVuc2lnbmVkIGludAkJCXNpZF9iaXRzOworCisJc3RydWN0IGFybV9zbW11X3N0 cnRhYl9jZmcJc3RydGFiX2NmZzsKKworCS8qIElPTU1VIGNvcmUgY29kZSBoYW5kbGUgKi8KKwlz dHJ1Y3QgaW9tbXVfZGV2aWNlCQlpb21tdTsKK307CisKKy8qIFNNTVUgcHJpdmF0ZSBkYXRhIGZv ciBlYWNoIG1hc3RlciAqLworc3RydWN0IGFybV9zbW11X21hc3Rlcl9kYXRhIHsKKwlzdHJ1Y3Qg YXJtX3NtbXVfZGV2aWNlCQkqc21tdTsKKwlzdHJ1Y3QgYXJtX3NtbXVfc3RydGFiX2VudAlzdGU7 Cit9OworCisvKiBTTU1VIHByaXZhdGUgZGF0YSBmb3IgYW4gSU9NTVUgZG9tYWluICovCitlbnVt IGFybV9zbW11X2RvbWFpbl9zdGFnZSB7CisJQVJNX1NNTVVfRE9NQUlOX1MxID0gMCwKKwlBUk1f U01NVV9ET01BSU5fUzIsCisJQVJNX1NNTVVfRE9NQUlOX05FU1RFRCwKKwlBUk1fU01NVV9ET01B SU5fQllQQVNTLAorfTsKKworc3RydWN0IGFybV9zbW11X2RvbWFpbiB7CisJc3RydWN0IGFybV9z bW11X2RldmljZQkJKnNtbXU7CisJc3RydWN0IG11dGV4CQkJaW5pdF9tdXRleDsgLyogUHJvdGVj dHMgc21tdSBwb2ludGVyICovCisKKwlzdHJ1Y3QgaW9fcGd0YWJsZV9vcHMJCSpwZ3RibF9vcHM7 CisKKwllbnVtIGFybV9zbW11X2RvbWFpbl9zdGFnZQlzdGFnZTsKKwl1bmlvbiB7CisJCXN0cnVj dCBhcm1fc21tdV9zMV9jZmcJczFfY2ZnOworCQlzdHJ1Y3QgYXJtX3NtbXVfczJfY2ZnCXMyX2Nm ZzsKKwl9OworCisJc3RydWN0IGlvbW11X2RvbWFpbgkJZG9tYWluOworfTsKKworc3RydWN0IGFy bV9zbW11X29wdGlvbl9wcm9wIHsKKwl1MzIgb3B0OworCWNvbnN0IGNoYXIgKnByb3A7Cit9Owor CitzdGF0aWMgc3RydWN0IGFybV9zbW11X29wdGlvbl9wcm9wIGFybV9zbW11X29wdGlvbnNbXSA9 IHsKKwl7IEFSTV9TTU1VX09QVF9TS0lQX1BSRUZFVENILCAiaGlzaWxpY29uLGJyb2tlbi1wcmVm ZXRjaC1jbWQiIH0sCisJeyBBUk1fU01NVV9PUFRfUEFHRTBfUkVHU19PTkxZLCAiY2F2aXVtLGNu OTkwMC1icm9rZW4tcGFnZTEtcmVnc3BhY2UifSwKKwl7IDAsIE5VTEx9LAorfTsKKworc3RhdGlj IGlubGluZSB2b2lkIF9faW9tZW0gKmFybV9zbW11X3BhZ2UxX2ZpeHVwKHVuc2lnbmVkIGxvbmcg b2Zmc2V0LAorCQkJCQkJIHN0cnVjdCBhcm1fc21tdV9kZXZpY2UgKnNtbXUpCit7CisJaWYgKChv ZmZzZXQgPiBTWl82NEspICYmCisJICAgIChzbW11LT5vcHRpb25zICYgQVJNX1NNTVVfT1BUX1BB R0UwX1JFR1NfT05MWSkpCisJCW9mZnNldCAtPSBTWl82NEs7CisKKwlyZXR1cm4gc21tdS0+YmFz ZSArIG9mZnNldDsKK30KKworc3RhdGljIHN0cnVjdCBhcm1fc21tdV9kb21haW4gKnRvX3NtbXVf ZG9tYWluKHN0cnVjdCBpb21tdV9kb21haW4gKmRvbSkKK3sKKwlyZXR1cm4gY29udGFpbmVyX29m KGRvbSwgc3RydWN0IGFybV9zbW11X2RvbWFpbiwgZG9tYWluKTsKK30KKworc3RhdGljIHZvaWQg cGFyc2VfZHJpdmVyX29wdGlvbnMoc3RydWN0IGFybV9zbW11X2RldmljZSAqc21tdSkKK3sKKwlp bnQgaSA9IDA7CisKKwlkbyB7CisJCWlmIChvZl9wcm9wZXJ0eV9yZWFkX2Jvb2woc21tdS0+ZGV2 LT5vZl9ub2RlLAorCQkJCQkJYXJtX3NtbXVfb3B0aW9uc1tpXS5wcm9wKSkgeworCQkJc21tdS0+ b3B0aW9ucyB8PSBhcm1fc21tdV9vcHRpb25zW2ldLm9wdDsKKwkJCWRldl9ub3RpY2Uoc21tdS0+ ZGV2LCAib3B0aW9uICVzXG4iLAorCQkJCWFybV9zbW11X29wdGlvbnNbaV0ucHJvcCk7CisJCX0K Kwl9IHdoaWxlIChhcm1fc21tdV9vcHRpb25zWysraV0ub3B0KTsKK30KKworLyogTG93LWxldmVs IHF1ZXVlIG1hbmlwdWxhdGlvbiBmdW5jdGlvbnMgKi8KK3N0YXRpYyBib29sIHF1ZXVlX2Z1bGwo c3RydWN0IGFybV9zbW11X3F1ZXVlICpxKQoreworCXJldHVybiBRX0lEWChxLCBxLT5wcm9kKSA9 PSBRX0lEWChxLCBxLT5jb25zKSAmJgorCSAgICAgICBRX1dSUChxLCBxLT5wcm9kKSAhPSBRX1dS UChxLCBxLT5jb25zKTsKK30KKworc3RhdGljIGJvb2wgcXVldWVfZW1wdHkoc3RydWN0IGFybV9z bW11X3F1ZXVlICpxKQoreworCXJldHVybiBRX0lEWChxLCBxLT5wcm9kKSA9PSBRX0lEWChxLCBx LT5jb25zKSAmJgorCSAgICAgICBRX1dSUChxLCBxLT5wcm9kKSA9PSBRX1dSUChxLCBxLT5jb25z KTsKK30KKworc3RhdGljIHZvaWQgcXVldWVfc3luY19jb25zKHN0cnVjdCBhcm1fc21tdV9xdWV1 ZSAqcSkKK3sKKwlxLT5jb25zID0gcmVhZGxfcmVsYXhlZChxLT5jb25zX3JlZyk7Cit9CisKK3N0 YXRpYyB2b2lkIHF1ZXVlX2luY19jb25zKHN0cnVjdCBhcm1fc21tdV9xdWV1ZSAqcSkKK3sKKwl1 MzIgY29ucyA9IChRX1dSUChxLCBxLT5jb25zKSB8IFFfSURYKHEsIHEtPmNvbnMpKSArIDE7CisK KwlxLT5jb25zID0gUV9PVkYocSwgcS0+Y29ucykgfCBRX1dSUChxLCBjb25zKSB8IFFfSURYKHEs IGNvbnMpOworCXdyaXRlbChxLT5jb25zLCBxLT5jb25zX3JlZyk7Cit9CisKK3N0YXRpYyBpbnQg cXVldWVfc3luY19wcm9kKHN0cnVjdCBhcm1fc21tdV9xdWV1ZSAqcSkKK3sKKwlpbnQgcmV0ID0g MDsKKwl1MzIgcHJvZCA9IHJlYWRsX3JlbGF4ZWQocS0+cHJvZF9yZWcpOworCisJaWYgKFFfT1ZG KHEsIHByb2QpICE9IFFfT1ZGKHEsIHEtPnByb2QpKQorCQlyZXQgPSAtRU9WRVJGTE9XOworCisJ cS0+cHJvZCA9IHByb2Q7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgcXVldWVfaW5j X3Byb2Qoc3RydWN0IGFybV9zbW11X3F1ZXVlICpxKQoreworCXUzMiBwcm9kID0gKFFfV1JQKHEs IHEtPnByb2QpIHwgUV9JRFgocSwgcS0+cHJvZCkpICsgMTsKKworCXEtPnByb2QgPSBRX09WRihx LCBxLT5wcm9kKSB8IFFfV1JQKHEsIHByb2QpIHwgUV9JRFgocSwgcHJvZCk7CisJd3JpdGVsKHEt PnByb2QsIHEtPnByb2RfcmVnKTsKK30KKworLyoKKyAqIFdhaXQgZm9yIHRoZSBTTU1VIHRvIGNv bnN1bWUgaXRlbXMuIElmIGRyYWluIGlzIHRydWUsIHdhaXQgdW50aWwgdGhlIHF1ZXVlCisgKiBp cyBlbXB0eS4gT3RoZXJ3aXNlLCB3YWl0IHVudGlsIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBmcmVl IHNsb3QuCisgKi8KK3N0YXRpYyBpbnQgcXVldWVfcG9sbF9jb25zKHN0cnVjdCBhcm1fc21tdV9x dWV1ZSAqcSwgYm9vbCBkcmFpbiwgYm9vbCB3ZmUpCit7CisJa3RpbWVfdCB0aW1lb3V0OworCXVu c2lnbmVkIGludCBkZWxheSA9IDE7CisKKwkvKiBXYWl0IGxvbmdlciBpZiBpdCdzIHF1ZXVlIGRy YWluICovCisJdGltZW91dCA9IGt0aW1lX2FkZF91cyhrdGltZV9nZXQoKSwgZHJhaW4gPworCQkJ CQkgICAgQVJNX1NNTVVfQ01EUV9EUkFJTl9USU1FT1VUX1VTIDoKKwkJCQkJICAgIEFSTV9TTU1V X1BPTExfVElNRU9VVF9VUyk7CisKKwl3aGlsZSAocXVldWVfc3luY19jb25zKHEpLCAoZHJhaW4g PyAhcXVldWVfZW1wdHkocSkgOiBxdWV1ZV9mdWxsKHEpKSkgeworCQlpZiAoa3RpbWVfY29tcGFy ZShrdGltZV9nZXQoKSwgdGltZW91dCkgPiAwKQorCQkJcmV0dXJuIC1FVElNRURPVVQ7CisKKwkJ aWYgKHdmZSkgeworCQkJd2ZlKCk7CisJCX0gZWxzZSB7CisJCQljcHVfcmVsYXgoKTsKKwkJCXVk ZWxheShkZWxheSk7CisJCQlkZWxheSAqPSAyOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisK K3N0YXRpYyB2b2lkIHF1ZXVlX3dyaXRlKF9fbGU2NCAqZHN0LCB1NjQgKnNyYywgc2l6ZV90IG5f ZHdvcmRzKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IG5fZHdvcmRzOyArK2kpCisJ CSpkc3QrKyA9IGNwdV90b19sZTY0KCpzcmMrKyk7Cit9CisKK3N0YXRpYyBpbnQgcXVldWVfaW5z ZXJ0X3JhdyhzdHJ1Y3QgYXJtX3NtbXVfcXVldWUgKnEsIHU2NCAqZW50KQoreworCWlmIChxdWV1 ZV9mdWxsKHEpKQorCQlyZXR1cm4gLUVOT1NQQzsKKworCXF1ZXVlX3dyaXRlKFFfRU5UKHEsIHEt PnByb2QpLCBlbnQsIHEtPmVudF9kd29yZHMpOworCXF1ZXVlX2luY19wcm9kKHEpOworCXJldHVy biAwOworfQorCitzdGF0aWMgdm9pZCBxdWV1ZV9yZWFkKF9fbGU2NCAqZHN0LCB1NjQgKnNyYywg c2l6ZV90IG5fZHdvcmRzKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IG5fZHdvcmRz OyArK2kpCisJCSpkc3QrKyA9IGxlNjRfdG9fY3B1KCpzcmMrKyk7Cit9CisKK3N0YXRpYyBpbnQg cXVldWVfcmVtb3ZlX3JhdyhzdHJ1Y3QgYXJtX3NtbXVfcXVldWUgKnEsIHU2NCAqZW50KQorewor CWlmIChxdWV1ZV9lbXB0eShxKSkKKwkJcmV0dXJuIC1FQUdBSU47CisKKwlxdWV1ZV9yZWFkKGVu dCwgUV9FTlQocSwgcS0+Y29ucyksIHEtPmVudF9kd29yZHMpOworCXF1ZXVlX2luY19jb25zKHEp OworCXJldHVybiAwOworfQorCisvKiBIaWdoLWxldmVsIHF1ZXVlIGFjY2Vzc29ycyAqLworc3Rh dGljIGludCBhcm1fc21tdV9jbWRxX2J1aWxkX2NtZCh1NjQgKmNtZCwgc3RydWN0IGFybV9zbW11 X2NtZHFfZW50ICplbnQpCit7CisJbWVtc2V0KGNtZCwgMCwgQ01EUV9FTlRfRFdPUkRTIDw8IDMp OworCWNtZFswXSB8PSAoZW50LT5vcGNvZGUgJiBDTURRXzBfT1BfTUFTSykgPDwgQ01EUV8wX09Q X1NISUZUOworCisJc3dpdGNoIChlbnQtPm9wY29kZSkgeworCWNhc2UgQ01EUV9PUF9UTEJJX0VM Ml9BTEw6CisJY2FzZSBDTURRX09QX1RMQklfTlNOSF9BTEw6CisJCWJyZWFrOworCWNhc2UgQ01E UV9PUF9QUkVGRVRDSF9DRkc6CisJCWNtZFswXSB8PSAodTY0KWVudC0+cHJlZmV0Y2guc2lkIDw8 IENNRFFfUFJFRkVUQ0hfMF9TSURfU0hJRlQ7CisJCWNtZFsxXSB8PSBlbnQtPnByZWZldGNoLnNp emUgPDwgQ01EUV9QUkVGRVRDSF8xX1NJWkVfU0hJRlQ7CisJCWNtZFsxXSB8PSBlbnQtPnByZWZl dGNoLmFkZHIgJiBDTURRX1BSRUZFVENIXzFfQUREUl9NQVNLOworCQlicmVhazsKKwljYXNlIENN RFFfT1BfQ0ZHSV9TVEU6CisJCWNtZFswXSB8PSAodTY0KWVudC0+Y2ZnaS5zaWQgPDwgQ01EUV9D RkdJXzBfU0lEX1NISUZUOworCQljbWRbMV0gfD0gZW50LT5jZmdpLmxlYWYgPyBDTURRX0NGR0lf MV9MRUFGIDogMDsKKwkJYnJlYWs7CisJY2FzZSBDTURRX09QX0NGR0lfQUxMOgorCQkvKiBDb3Zl ciB0aGUgZW50aXJlIFNJRCByYW5nZSAqLworCQljbWRbMV0gfD0gQ01EUV9DRkdJXzFfUkFOR0Vf TUFTSyA8PCBDTURRX0NGR0lfMV9SQU5HRV9TSElGVDsKKwkJYnJlYWs7CisJY2FzZSBDTURRX09Q X1RMQklfTkhfVkE6CisJCWNtZFswXSB8PSAodTY0KWVudC0+dGxiaS5hc2lkIDw8IENNRFFfVExC SV8wX0FTSURfU0hJRlQ7CisJCWNtZFsxXSB8PSBlbnQtPnRsYmkubGVhZiA/IENNRFFfVExCSV8x X0xFQUYgOiAwOworCQljbWRbMV0gfD0gZW50LT50bGJpLmFkZHIgJiBDTURRX1RMQklfMV9WQV9N QVNLOworCQlicmVhazsKKwljYXNlIENNRFFfT1BfVExCSV9TMl9JUEE6CisJCWNtZFswXSB8PSAo dTY0KWVudC0+dGxiaS52bWlkIDw8IENNRFFfVExCSV8wX1ZNSURfU0hJRlQ7CisJCWNtZFsxXSB8 PSBlbnQtPnRsYmkubGVhZiA/IENNRFFfVExCSV8xX0xFQUYgOiAwOworCQljbWRbMV0gfD0gZW50 LT50bGJpLmFkZHIgJiBDTURRX1RMQklfMV9JUEFfTUFTSzsKKwkJYnJlYWs7CisJY2FzZSBDTURR X09QX1RMQklfTkhfQVNJRDoKKwkJY21kWzBdIHw9ICh1NjQpZW50LT50bGJpLmFzaWQgPDwgQ01E UV9UTEJJXzBfQVNJRF9TSElGVDsKKwkJLyogRmFsbHRocm91Z2ggKi8KKwljYXNlIENNRFFfT1Bf VExCSV9TMTJfVk1BTEw6CisJCWNtZFswXSB8PSAodTY0KWVudC0+dGxiaS52bWlkIDw8IENNRFFf VExCSV8wX1ZNSURfU0hJRlQ7CisJCWJyZWFrOworCWNhc2UgQ01EUV9PUF9QUklfUkVTUDoKKwkJ Y21kWzBdIHw9IGVudC0+c3Vic3RyZWFtX3ZhbGlkID8gQ01EUV8wX1NTViA6IDA7CisJCWNtZFsw XSB8PSBlbnQtPnByaS5zc2lkIDw8IENNRFFfUFJJXzBfU1NJRF9TSElGVDsKKwkJY21kWzBdIHw9 ICh1NjQpZW50LT5wcmkuc2lkIDw8IENNRFFfUFJJXzBfU0lEX1NISUZUOworCQljbWRbMV0gfD0g ZW50LT5wcmkuZ3JwaWQgPDwgQ01EUV9QUklfMV9HUlBJRF9TSElGVDsKKwkJc3dpdGNoIChlbnQt PnByaS5yZXNwKSB7CisJCWNhc2UgUFJJX1JFU1BfREVOWToKKwkJCWNtZFsxXSB8PSBDTURRX1BS SV8xX1JFU1BfREVOWTsKKwkJCWJyZWFrOworCQljYXNlIFBSSV9SRVNQX0ZBSUw6CisJCQljbWRb MV0gfD0gQ01EUV9QUklfMV9SRVNQX0ZBSUw7CisJCQlicmVhazsKKwkJY2FzZSBQUklfUkVTUF9T VUNDOgorCQkJY21kWzFdIHw9IENNRFFfUFJJXzFfUkVTUF9TVUNDOworCQkJYnJlYWs7CisJCWRl ZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlicmVhazsKKwljYXNlIENNRFFfT1Bf Q01EX1NZTkM6CisJCWNtZFswXSB8PSBDTURRX1NZTkNfMF9DU19TRVY7CisJCWJyZWFrOworCWRl ZmF1bHQ6CisJCXJldHVybiAtRU5PRU5UOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMg dm9pZCBhcm1fc21tdV9jbWRxX3NraXBfZXJyKHN0cnVjdCBhcm1fc21tdV9kZXZpY2UgKnNtbXUp Cit7CisJc3RhdGljIGNvbnN0IGNoYXIgKmNlcnJvcl9zdHJbXSA9IHsKKwkJW0NNRFFfRVJSX0NF UlJPUl9OT05FX0lEWF0JPSAiTm8gZXJyb3IiLAorCQlbQ01EUV9FUlJfQ0VSUk9SX0lMTF9JRFhd CT0gIklsbGVnYWwgY29tbWFuZCIsCisJCVtDTURRX0VSUl9DRVJST1JfQUJUX0lEWF0JPSAiQWJv cnQgb24gY29tbWFuZCBmZXRjaCIsCisJfTsKKworCWludCBpOworCXU2NCBjbWRbQ01EUV9FTlRf RFdPUkRTXTsKKwlzdHJ1Y3QgYXJtX3NtbXVfcXVldWUgKnEgPSAmc21tdS0+Y21kcS5xOworCXUz MiBjb25zID0gcmVhZGxfcmVsYXhlZChxLT5jb25zX3JlZyk7CisJdTMyIGlkeCA9IGNvbnMgPj4g Q01EUV9FUlJfU0hJRlQgJiBDTURRX0VSUl9NQVNLOworCXN0cnVjdCBhcm1fc21tdV9jbWRxX2Vu dCBjbWRfc3luYyA9IHsKKwkJLm9wY29kZSA9IENNRFFfT1BfQ01EX1NZTkMsCisJfTsKKworCWRl dl9lcnIoc21tdS0+ZGV2LCAiQ01EUSBlcnJvciAoY29ucyAweCUwOHgpOiAlc1xuIiwgY29ucywK KwkJaWR4IDwgQVJSQVlfU0laRShjZXJyb3Jfc3RyKSA/ICBjZXJyb3Jfc3RyW2lkeF0gOiAiVW5r bm93biIpOworCisJc3dpdGNoIChpZHgpIHsKKwljYXNlIENNRFFfRVJSX0NFUlJPUl9BQlRfSURY OgorCQlkZXZfZXJyKHNtbXUtPmRldiwgInJldHJ5aW5nIGNvbW1hbmQgZmV0Y2hcbiIpOworCWNh c2UgQ01EUV9FUlJfQ0VSUk9SX05PTkVfSURYOgorCQlyZXR1cm47CisJY2FzZSBDTURRX0VSUl9D RVJST1JfSUxMX0lEWDoKKwkJLyogRmFsbHRocm91Z2ggKi8KKwlkZWZhdWx0OgorCQlicmVhazsK Kwl9CisKKwkvKgorCSAqIFdlIG1heSBoYXZlIGNvbmN1cnJlbnQgcHJvZHVjZXJzLCBzbyB3ZSBu ZWVkIHRvIGJlIGNhcmVmdWwKKwkgKiBub3QgdG8gdG91Y2ggYW55IG9mIHRoZSBzaGFkb3cgY21k cSBzdGF0ZS4KKwkgKi8KKwlxdWV1ZV9yZWFkKGNtZCwgUV9FTlQocSwgY29ucyksIHEtPmVudF9k d29yZHMpOworCWRldl9lcnIoc21tdS0+ZGV2LCAic2tpcHBpbmcgY29tbWFuZCBpbiBlcnJvciBz dGF0ZTpcbiIpOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNtZCk7ICsraSkKKwkJZGV2 X2VycihzbW11LT5kZXYsICJcdDB4JTAxNmxseFxuIiwgKHVuc2lnbmVkIGxvbmcgbG9uZyljbWRb aV0pOworCisJLyogQ29udmVydCB0aGUgZXJyb25lb3VzIGNvbW1hbmQgaW50byBhIENNRF9TWU5D ICovCisJaWYgKGFybV9zbW11X2NtZHFfYnVpbGRfY21kKGNtZCwgJmNtZF9zeW5jKSkgeworCQlk ZXZfZXJyKHNtbXUtPmRldiwgImZhaWxlZCB0byBjb252ZXJ0IHRvIENNRF9TWU5DXG4iKTsKKwkJ cmV0dXJuOworCX0KKworCXF1ZXVlX3dyaXRlKFFfRU5UKHEsIGNvbnMpLCBjbWQsIHEtPmVudF9k d29yZHMpOworfQorCitzdGF0aWMgdm9pZCBhcm1fc21tdV9jbWRxX2lzc3VlX2NtZChzdHJ1Y3Qg YXJtX3NtbXVfZGV2aWNlICpzbW11LAorCQkJCSAgICBzdHJ1Y3QgYXJtX3NtbXVfY21kcV9lbnQg KmVudCkKK3sKKwl1NjQgY21kW0NNRFFfRU5UX0RXT1JEU107CisJdW5zaWduZWQgbG9uZyBmbGFn czsKKwlib29sIHdmZSA9ICEhKHNtbXUtPmZlYXR1cmVzICYgQVJNX1NNTVVfRkVBVF9TRVYpOwor CXN0cnVjdCBhcm1fc21tdV9xdWV1ZSAqcSA9ICZzbW11LT5jbWRxLnE7CisKKwlpZiAoYXJtX3Nt bXVfY21kcV9idWlsZF9jbWQoY21kLCBlbnQpKSB7CisJCWRldl93YXJuKHNtbXUtPmRldiwgImln bm9yaW5nIHVua25vd24gQ01EUSBvcGNvZGUgMHgleFxuIiwKKwkJCSBlbnQtPm9wY29kZSk7CisJ CXJldHVybjsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc21tdS0+Y21kcS5sb2NrLCBmbGFn cyk7CisJd2hpbGUgKHF1ZXVlX2luc2VydF9yYXcocSwgY21kKSA9PSAtRU5PU1BDKSB7CisJCWlm IChxdWV1ZV9wb2xsX2NvbnMocSwgZmFsc2UsIHdmZSkpCisJCQlkZXZfZXJyX3JhdGVsaW1pdGVk KHNtbXUtPmRldiwgIkNNRFEgdGltZW91dFxuIik7CisJfQorCisJaWYgKGVudC0+b3Bjb2RlID09 IENNRFFfT1BfQ01EX1NZTkMgJiYgcXVldWVfcG9sbF9jb25zKHEsIHRydWUsIHdmZSkpCisJCWRl dl9lcnJfcmF0ZWxpbWl0ZWQoc21tdS0+ZGV2LCAiQ01EX1NZTkMgdGltZW91dFxuIik7CisJc3Bp bl91bmxvY2tfaXJxcmVzdG9yZSgmc21tdS0+Y21kcS5sb2NrLCBmbGFncyk7Cit9CisKKy8qIENv bnRleHQgZGVzY3JpcHRvciBtYW5pcHVsYXRpb24gZnVuY3Rpb25zICovCitzdGF0aWMgdTY0IGFy bV9zbW11X2NwdV90Y3JfdG9fY2QodTY0IHRjcikKK3sKKwl1NjQgdmFsID0gMDsKKworCS8qIFJl cGFjayB0aGUgVENSLiBKdXN0IGNhcmUgYWJvdXQgVFRCUjAgZm9yIG5vdyAqLworCXZhbCB8PSBB Uk1fU01NVV9UQ1IyQ0QodGNyLCBUMFNaKTsKKwl2YWwgfD0gQVJNX1NNTVVfVENSMkNEKHRjciwg VEcwKTsKKwl2YWwgfD0gQVJNX1NNTVVfVENSMkNEKHRjciwgSVJHTjApOworCXZhbCB8PSBBUk1f U01NVV9UQ1IyQ0QodGNyLCBPUkdOMCk7CisJdmFsIHw9IEFSTV9TTU1VX1RDUjJDRCh0Y3IsIFNI MCk7CisJdmFsIHw9IEFSTV9TTU1VX1RDUjJDRCh0Y3IsIEVQRDApOworCXZhbCB8PSBBUk1fU01N VV9UQ1IyQ0QodGNyLCBFUEQxKTsKKwl2YWwgfD0gQVJNX1NNTVVfVENSMkNEKHRjciwgSVBTKTsK Kwl2YWwgfD0gQVJNX1NNTVVfVENSMkNEKHRjciwgVEJJMCk7CisKKwlyZXR1cm4gdmFsOworfQor CitzdGF0aWMgdm9pZCBhcm1fc21tdV93cml0ZV9jdHhfZGVzYyhzdHJ1Y3QgYXJtX3NtbXVfZGV2 aWNlICpzbW11LAorCQkJCSAgICBzdHJ1Y3QgYXJtX3NtbXVfczFfY2ZnICpjZmcpCit7CisJdTY0 IHZhbDsKKworCS8qCisJICogV2UgZG9uJ3QgbmVlZCB0byBpc3N1ZSBhbnkgaW52YWxpZGF0aW9u IGhlcmUsIGFzIHdlJ2xsIGludmFsaWRhdGUKKwkgKiB0aGUgU1RFIHdoZW4gaW5zdGFsbGluZyB0 aGUgbmV3IGVudHJ5IGFueXdheS4KKwkgKi8KKwl2YWwgPSBhcm1fc21tdV9jcHVfdGNyX3RvX2Nk KGNmZy0+Y2QudGNyKSB8CisjaWZkZWYgX19CSUdfRU5ESUFOCisJICAgICAgQ1RYREVTQ19DRF8w X0VOREkgfAorI2VuZGlmCisJICAgICAgQ1RYREVTQ19DRF8wX1IgfCBDVFhERVNDX0NEXzBfQSB8 IENUWERFU0NfQ0RfMF9BU0VUX1BSSVZBVEUgfAorCSAgICAgIENUWERFU0NfQ0RfMF9BQTY0IHwg KHU2NCljZmctPmNkLmFzaWQgPDwgQ1RYREVTQ19DRF8wX0FTSURfU0hJRlQgfAorCSAgICAgIENU WERFU0NfQ0RfMF9WOworCWNmZy0+Y2RwdHJbMF0gPSBjcHVfdG9fbGU2NCh2YWwpOworCisJdmFs ID0gY2ZnLT5jZC50dGJyICYgQ1RYREVTQ19DRF8xX1RUQjBfTUFTSyA8PCBDVFhERVNDX0NEXzFf VFRCMF9TSElGVDsKKwljZmctPmNkcHRyWzFdID0gY3B1X3RvX2xlNjQodmFsKTsKKworCWNmZy0+ Y2RwdHJbM10gPSBjcHVfdG9fbGU2NChjZmctPmNkLm1haXIgPDwgQ1RYREVTQ19DRF8zX01BSVJf U0hJRlQpOworfQorCisvKiBTdHJlYW0gdGFibGUgbWFuaXB1bGF0aW9uIGZ1bmN0aW9ucyAqLwor c3RhdGljIHZvaWQKK2FybV9zbW11X3dyaXRlX3N0cnRhYl9sMV9kZXNjKF9fbGU2NCAqZHN0LCBz dHJ1Y3QgYXJtX3NtbXVfc3RydGFiX2wxX2Rlc2MgKmRlc2MpCit7CisJdTY0IHZhbCA9IDA7CisK Kwl2YWwgfD0gKGRlc2MtPnNwYW4gJiBTVFJUQUJfTDFfREVTQ19TUEFOX01BU0spCisJCTw8IFNU UlRBQl9MMV9ERVNDX1NQQU5fU0hJRlQ7CisJdmFsIHw9IGRlc2MtPmwycHRyX2RtYSAmCisJICAg ICAgIFNUUlRBQl9MMV9ERVNDX0wyUFRSX01BU0sgPDwgU1RSVEFCX0wxX0RFU0NfTDJQVFJfU0hJ RlQ7CisKKwkqZHN0ID0gY3B1X3RvX2xlNjQodmFsKTsKK30KKworc3RhdGljIHZvaWQgYXJtX3Nt bXVfc3luY19zdGVfZm9yX3NpZChzdHJ1Y3QgYXJtX3NtbXVfZGV2aWNlICpzbW11LCB1MzIgc2lk KQoreworCXN0cnVjdCBhcm1fc21tdV9jbWRxX2VudCBjbWQgPSB7CisJCS5vcGNvZGUJPSBDTURR X09QX0NGR0lfU1RFLAorCQkuY2ZnaQk9IHsKKwkJCS5zaWQJPSBzaWQsCisJCQkubGVhZgk9IHRy dWUsCisJCX0sCisJfTsKKworCWFybV9zbW11X2NtZHFfaXNzdWVfY21kKHNtbXUsICZjbWQpOwor CWNtZC5vcGNvZGUgPSBDTURRX09QX0NNRF9TWU5DOworCWFybV9zbW11X2NtZHFfaXNzdWVfY21k KHNtbXUsICZjbWQpOworfQorCitzdGF0aWMgdm9pZCBhcm1fc21tdV93cml0ZV9zdHJ0YWJfZW50 KHN0cnVjdCBhcm1fc21tdV9kZXZpY2UgKnNtbXUsIHUzMiBzaWQsCisJCQkJICAgICAgX19sZTY0 ICpkc3QsIHN0cnVjdCBhcm1fc21tdV9zdHJ0YWJfZW50ICpzdGUpCit7CisJLyoKKwkgKiBUaGlz IGlzIGhpZGVvdXNseSBjb21wbGljYXRlZCwgYnV0IHdlIG9ubHkgcmVhbGx5IGNhcmUgYWJvdXQK KwkgKiB0aHJlZSBjYXNlcyBhdCB0aGUgbW9tZW50OgorCSAqCisJICogMS4gSW52YWxpZCAoYWxs IHplcm8pIC0+IGJ5cGFzcy9mYXVsdCAoaW5pdCkKKwkgKiAyLiBCeXBhc3MvZmF1bHQgLT4gdHJh bnNsYXRpb24vYnlwYXNzIChhdHRhY2gpCisJICogMy4gVHJhbnNsYXRpb24vYnlwYXNzIC0+IGJ5 cGFzcy9mYXVsdCAoZGV0YWNoKQorCSAqCisJICogR2l2ZW4gdGhhdCB3ZSBjYW4ndCB1cGRhdGUg dGhlIFNURSBhdG9taWNhbGx5IGFuZCB0aGUgU01NVQorCSAqIGRvZXNuJ3QgcmVhZCB0aGUgdGhp bmcgaW4gYSBkZWZpbmVkIG9yZGVyLCB0aGF0IGxlYXZlcyB1cworCSAqIHdpdGggdGhlIGZvbGxv d2luZyBtYWludGVuYW5jZSByZXF1aXJlbWVudHM6CisJICoKKwkgKiAxLiBVcGRhdGUgQ29uZmln LCByZXR1cm4gKGluaXQgdGltZSBTVEVzIGFyZW4ndCBsaXZlKQorCSAqIDIuIFdyaXRlIGV2ZXJ5 dGhpbmcgYXBhcnQgZnJvbSBkd29yZCAwLCBzeW5jLCB3cml0ZSBkd29yZCAwLCBzeW5jCisJICog My4gVXBkYXRlIENvbmZpZywgc3luYworCSAqLworCXU2NCB2YWwgPSBsZTY0X3RvX2NwdShkc3Rb MF0pOworCWJvb2wgc3RlX2xpdmUgPSBmYWxzZTsKKwlzdHJ1Y3QgYXJtX3NtbXVfY21kcV9lbnQg cHJlZmV0Y2hfY21kID0geworCQkub3Bjb2RlCQk9IENNRFFfT1BfUFJFRkVUQ0hfQ0ZHLAorCQku cHJlZmV0Y2gJPSB7CisJCQkuc2lkCT0gc2lkLAorCQl9LAorCX07CisKKwlpZiAodmFsICYgU1RS VEFCX1NURV8wX1YpIHsKKwkJdTY0IGNmZzsKKworCQljZmcgPSB2YWwgJiBTVFJUQUJfU1RFXzBf Q0ZHX01BU0sgPDwgU1RSVEFCX1NURV8wX0NGR19TSElGVDsKKwkJc3dpdGNoIChjZmcpIHsKKwkJ Y2FzZSBTVFJUQUJfU1RFXzBfQ0ZHX0JZUEFTUzoKKwkJCWJyZWFrOworCQljYXNlIFNUUlRBQl9T VEVfMF9DRkdfUzFfVFJBTlM6CisJCWNhc2UgU1RSVEFCX1NURV8wX0NGR19TMl9UUkFOUzoKKwkJ CXN0ZV9saXZlID0gdHJ1ZTsKKwkJCWJyZWFrOworCQljYXNlIFNUUlRBQl9TVEVfMF9DRkdfQUJP UlQ6CisJCQlpZiAoZGlzYWJsZV9ieXBhc3MpCisJCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlC VUcoKTsgLyogU1RFIGNvcnJ1cHRpb24gKi8KKwkJfQorCX0KKworCS8qIE51a2UgdGhlIGV4aXN0 aW5nIFNURV8wIHZhbHVlLCBhcyB3ZSdyZSBnb2luZyB0byByZXdyaXRlIGl0ICovCisJdmFsID0g U1RSVEFCX1NURV8wX1Y7CisKKwkvKiBCeXBhc3MvZmF1bHQgKi8KKwlpZiAoIXN0ZS0+YXNzaWdu ZWQgfHwgIShzdGUtPnMxX2NmZyB8fCBzdGUtPnMyX2NmZykpIHsKKwkJaWYgKCFzdGUtPmFzc2ln bmVkICYmIGRpc2FibGVfYnlwYXNzKQorCQkJdmFsIHw9IFNUUlRBQl9TVEVfMF9DRkdfQUJPUlQ7 CisJCWVsc2UKKwkJCXZhbCB8PSBTVFJUQUJfU1RFXzBfQ0ZHX0JZUEFTUzsKKworCQlkc3RbMF0g PSBjcHVfdG9fbGU2NCh2YWwpOworCQlkc3RbMV0gPSBjcHVfdG9fbGU2NChTVFJUQUJfU1RFXzFf U0hDRkdfSU5DT01JTkcKKwkJCSA8PCBTVFJUQUJfU1RFXzFfU0hDRkdfU0hJRlQpOworCQlkc3Rb Ml0gPSAwOyAvKiBOdWtlIHRoZSBWTUlEICovCisJCWlmIChzdGVfbGl2ZSkKKwkJCWFybV9zbW11 X3N5bmNfc3RlX2Zvcl9zaWQoc21tdSwgc2lkKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChzdGUt PnMxX2NmZykgeworCQlCVUdfT04oc3RlX2xpdmUpOworCQlkc3RbMV0gPSBjcHVfdG9fbGU2NCgK KwkJCSBTVFJUQUJfU1RFXzFfUzFDX0NBQ0hFX1dCUkEKKwkJCSA8PCBTVFJUQUJfU1RFXzFfUzFD SVJfU0hJRlQgfAorCQkJIFNUUlRBQl9TVEVfMV9TMUNfQ0FDSEVfV0JSQQorCQkJIDw8IFNUUlRB Ql9TVEVfMV9TMUNPUl9TSElGVCB8CisJCQkgU1RSVEFCX1NURV8xX1MxQ19TSF9JU0ggPDwgU1RS VEFCX1NURV8xX1MxQ1NIX1NISUZUIHwKKyNpZmRlZiBDT05GSUdfUENJX0FUUworCQkJIFNUUlRB Ql9TVEVfMV9FQVRTX1RSQU5TIDw8IFNUUlRBQl9TVEVfMV9FQVRTX1NISUZUIHwKKyNlbmRpZgor CQkJIFNUUlRBQl9TVEVfMV9TVFJXX05TRUwxIDw8IFNUUlRBQl9TVEVfMV9TVFJXX1NISUZUKTsK KworCQlpZiAoc21tdS0+ZmVhdHVyZXMgJiBBUk1fU01NVV9GRUFUX1NUQUxMUykKKwkJCWRzdFsx XSB8PSBjcHVfdG9fbGU2NChTVFJUQUJfU1RFXzFfUzFTVEFMTEQpOworCisJCXZhbCB8PSAoc3Rl LT5zMV9jZmctPmNkcHRyX2RtYSAmIFNUUlRBQl9TVEVfMF9TMUNUWFBUUl9NQVNLCisJCSAgICAg ICAgPDwgU1RSVEFCX1NURV8wX1MxQ1RYUFRSX1NISUZUKSB8CisJCQlTVFJUQUJfU1RFXzBfQ0ZH X1MxX1RSQU5TOworCX0KKworCWlmIChzdGUtPnMyX2NmZykgeworCQlCVUdfT04oc3RlX2xpdmUp OworCQlkc3RbMl0gPSBjcHVfdG9fbGU2NCgKKwkJCSBzdGUtPnMyX2NmZy0+dm1pZCA8PCBTVFJU QUJfU1RFXzJfUzJWTUlEX1NISUZUIHwKKwkJCSAoc3RlLT5zMl9jZmctPnZ0Y3IgJiBTVFJUQUJf U1RFXzJfVlRDUl9NQVNLKQorCQkJICA8PCBTVFJUQUJfU1RFXzJfVlRDUl9TSElGVCB8CisjaWZk ZWYgX19CSUdfRU5ESUFOCisJCQkgU1RSVEFCX1NURV8yX1MyRU5ESSB8CisjZW5kaWYKKwkJCSBT VFJUQUJfU1RFXzJfUzJQVFcgfCBTVFJUQUJfU1RFXzJfUzJBQTY0IHwKKwkJCSBTVFJUQUJfU1RF XzJfUzJSKTsKKworCQlkc3RbM10gPSBjcHVfdG9fbGU2NChzdGUtPnMyX2NmZy0+dnR0YnIgJgor CQkJIFNUUlRBQl9TVEVfM19TMlRUQl9NQVNLIDw8IFNUUlRBQl9TVEVfM19TMlRUQl9TSElGVCk7 CisKKwkJdmFsIHw9IFNUUlRBQl9TVEVfMF9DRkdfUzJfVFJBTlM7CisJfQorCisJYXJtX3NtbXVf c3luY19zdGVfZm9yX3NpZChzbW11LCBzaWQpOworCWRzdFswXSA9IGNwdV90b19sZTY0KHZhbCk7 CisJYXJtX3NtbXVfc3luY19zdGVfZm9yX3NpZChzbW11LCBzaWQpOworCisJLyogSXQncyBsaWtl bHkgdGhhdCB3ZSdsbCB3YW50IHRvIHVzZSB0aGUgbmV3IFNURSBzb29uICovCisJaWYgKCEoc21t dS0+b3B0aW9ucyAmIEFSTV9TTU1VX09QVF9TS0lQX1BSRUZFVENIKSkKKwkJYXJtX3NtbXVfY21k cV9pc3N1ZV9jbWQoc21tdSwgJnByZWZldGNoX2NtZCk7Cit9CisKK3N0YXRpYyB2b2lkIGFybV9z bW11X2luaXRfYnlwYXNzX3N0ZXModTY0ICpzdHJ0YWIsIHVuc2lnbmVkIGludCBuZW50KQorewor CXVuc2lnbmVkIGludCBpOworCXN0cnVjdCBhcm1fc21tdV9zdHJ0YWJfZW50IHN0ZSA9IHsgLmFz c2lnbmVkID0gZmFsc2UgfTsKKworCWZvciAoaSA9IDA7IGkgPCBuZW50OyArK2kpIHsKKwkJYXJt X3NtbXVfd3JpdGVfc3RydGFiX2VudChOVUxMLCAtMSwgc3RydGFiLCAmc3RlKTsKKwkJc3RydGFi ICs9IFNUUlRBQl9TVEVfRFdPUkRTOworCX0KK30KKworc3RhdGljIGludCBhcm1fc21tdV9pbml0 X2wyX3N0cnRhYihzdHJ1Y3QgYXJtX3NtbXVfZGV2aWNlICpzbW11LCB1MzIgc2lkKQoreworCXNp emVfdCBzaXplOworCXZvaWQgKnN0cnRhYjsKKwlzdHJ1Y3QgYXJtX3NtbXVfc3RydGFiX2NmZyAq Y2ZnID0gJnNtbXUtPnN0cnRhYl9jZmc7CisJc3RydWN0IGFybV9zbW11X3N0cnRhYl9sMV9kZXNj ICpkZXNjID0gJmNmZy0+bDFfZGVzY1tzaWQgPj4gU1RSVEFCX1NQTElUXTsKKworCWlmIChkZXNj LT5sMnB0cikKKwkJcmV0dXJuIDA7CisKKwlzaXplID0gMSA8PCAoU1RSVEFCX1NQTElUICsgaWxv ZzIoU1RSVEFCX1NURV9EV09SRFMpICsgMyk7CisJc3RydGFiID0gJmNmZy0+c3RydGFiWyhzaWQg Pj4gU1RSVEFCX1NQTElUKSAqIFNUUlRBQl9MMV9ERVNDX0RXT1JEU107CisKKwlkZXNjLT5zcGFu ID0gU1RSVEFCX1NQTElUICsgMTsKKwlkZXNjLT5sMnB0ciA9IGRtYW1fYWxsb2NfY29oZXJlbnQo c21tdS0+ZGV2LCBzaXplLCAmZGVzYy0+bDJwdHJfZG1hLAorCQkJCQkgIEdGUF9LRVJORUwgfCBf X0dGUF9aRVJPKTsKKwlpZiAoIWRlc2MtPmwycHRyKSB7CisJCWRldl9lcnIoc21tdS0+ZGV2LAor CQkJImZhaWxlZCB0byBhbGxvY2F0ZSBsMiBzdHJlYW0gdGFibGUgZm9yIFNJRCAldVxuIiwKKwkJ CXNpZCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWFybV9zbW11X2luaXRfYnlwYXNzX3N0 ZXMoZGVzYy0+bDJwdHIsIDEgPDwgU1RSVEFCX1NQTElUKTsKKwlhcm1fc21tdV93cml0ZV9zdHJ0 YWJfbDFfZGVzYyhzdHJ0YWIsIGRlc2MpOworCXJldHVybiAwOworfQorCisvKiBJUlEgYW5kIGV2 ZW50IGhhbmRsZXJzICovCitzdGF0aWMgaXJxcmV0dXJuX3QgYXJtX3NtbXVfZXZ0cV90aHJlYWQo aW50IGlycSwgdm9pZCAqZGV2KQoreworCWludCBpOworCXN0cnVjdCBhcm1fc21tdV9kZXZpY2Ug KnNtbXUgPSBkZXY7CisJc3RydWN0IGFybV9zbW11X3F1ZXVlICpxID0gJnNtbXUtPmV2dHEucTsK Kwl1NjQgZXZ0W0VWVFFfRU5UX0RXT1JEU107CisKKwlkbyB7CisJCXdoaWxlICghcXVldWVfcmVt b3ZlX3JhdyhxLCBldnQpKSB7CisJCQl1OCBpZCA9IGV2dFswXSA+PiBFVlRRXzBfSURfU0hJRlQg JiBFVlRRXzBfSURfTUFTSzsKKworCQkJZGV2X2luZm8oc21tdS0+ZGV2LCAiZXZlbnQgMHglMDJ4 IHJlY2VpdmVkOlxuIiwgaWQpOworCQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZXZ0KTsg KytpKQorCQkJCWRldl9pbmZvKHNtbXUtPmRldiwgIlx0MHglMDE2bGx4XG4iLAorCQkJCQkgKHVu c2lnbmVkIGxvbmcgbG9uZylldnRbaV0pOworCisJCX0KKworCQkvKgorCQkgKiBOb3QgbXVjaCB3 ZSBjYW4gZG8gb24gb3ZlcmZsb3csIHNvIHNjcmVhbSBhbmQgcHJldGVuZCB3ZSdyZQorCQkgKiB0 cnlpbmcgaGFyZGVyLgorCQkgKi8KKwkJaWYgKHF1ZXVlX3N5bmNfcHJvZChxKSA9PSAtRU9WRVJG TE9XKQorCQkJZGV2X2VycihzbW11LT5kZXYsICJFVlRRIG92ZXJmbG93IGRldGVjdGVkIC0tIGV2 ZW50cyBsb3N0XG4iKTsKKwl9IHdoaWxlICghcXVldWVfZW1wdHkocSkpOworCisJLyogU3luYyBv dXIgb3ZlcmZsb3cgZmxhZywgYXMgd2UgYmVsaWV2ZSB3ZSdyZSB1cCB0byBzcGVlZCAqLworCXEt PmNvbnMgPSBRX09WRihxLCBxLT5wcm9kKSB8IFFfV1JQKHEsIHEtPmNvbnMpIHwgUV9JRFgocSwg cS0+Y29ucyk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgdm9pZCBhcm1fc21t dV9oYW5kbGVfcHByKHN0cnVjdCBhcm1fc21tdV9kZXZpY2UgKnNtbXUsIHU2NCAqZXZ0KQorewor CXUzMiBzaWQsIHNzaWQ7CisJdTE2IGdycGlkOworCWJvb2wgc3N2LCBsYXN0OworCisJc2lkID0g ZXZ0WzBdID4+IFBSSVFfMF9TSURfU0hJRlQgJiBQUklRXzBfU0lEX01BU0s7CisJc3N2ID0gZXZ0 WzBdICYgUFJJUV8wX1NTSURfVjsKKwlzc2lkID0gc3N2ID8gZXZ0WzBdID4+IFBSSVFfMF9TU0lE X1NISUZUICYgUFJJUV8wX1NTSURfTUFTSyA6IDA7CisJbGFzdCA9IGV2dFswXSAmIFBSSVFfMF9Q UkdfTEFTVDsKKwlncnBpZCA9IGV2dFsxXSA+PiBQUklRXzFfUFJHX0lEWF9TSElGVCAmIFBSSVFf MV9QUkdfSURYX01BU0s7CisKKwlkZXZfaW5mbyhzbW11LT5kZXYsICJ1bmV4cGVjdGVkIFBSSSBy ZXF1ZXN0IHJlY2VpdmVkOlxuIik7CisJZGV2X2luZm8oc21tdS0+ZGV2LAorCQkgIlx0c2lkIDB4 JTA4eC4weCUwNXg6IFsldSVzXSAlc3ByaXZpbGVnZWQgJXMlcyVzIGFjY2VzcyBhdCBpb3ZhIDB4 JTAxNmxseFxuIiwKKwkJIHNpZCwgc3NpZCwgZ3JwaWQsIGxhc3QgPyAiTCIgOiAiIiwKKwkJIGV2 dFswXSAmIFBSSVFfMF9QRVJNX1BSSVYgPyAiIiA6ICJ1biIsCisJCSBldnRbMF0gJiBQUklRXzBf UEVSTV9SRUFEID8gIlIiIDogIiIsCisJCSBldnRbMF0gJiBQUklRXzBfUEVSTV9XUklURSA/ICJX IiA6ICIiLAorCQkgZXZ0WzBdICYgUFJJUV8wX1BFUk1fRVhFQyA/ICJYIiA6ICIiLAorCQkgZXZ0 WzFdICYgUFJJUV8xX0FERFJfTUFTSyA8PCBQUklRXzFfQUREUl9TSElGVCk7CisKKwlpZiAobGFz dCkgeworCQlzdHJ1Y3QgYXJtX3NtbXVfY21kcV9lbnQgY21kID0geworCQkJLm9wY29kZQkJCT0g Q01EUV9PUF9QUklfUkVTUCwKKwkJCS5zdWJzdHJlYW1fdmFsaWQJPSBzc3YsCisJCQkucHJpCQkJ PSB7CisJCQkJLnNpZAk9IHNpZCwKKwkJCQkuc3NpZAk9IHNzaWQsCisJCQkJLmdycGlkCT0gZ3Jw aWQsCisJCQkJLnJlc3AJPSBQUklfUkVTUF9ERU5ZLAorCQkJfSwKKwkJfTsKKworCQlhcm1fc21t dV9jbWRxX2lzc3VlX2NtZChzbW11LCAmY21kKTsKKwl9Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5f dCBhcm1fc21tdV9wcmlxX3RocmVhZChpbnQgaXJxLCB2b2lkICpkZXYpCit7CisJc3RydWN0IGFy bV9zbW11X2RldmljZSAqc21tdSA9IGRldjsKKwlzdHJ1Y3QgYXJtX3NtbXVfcXVldWUgKnEgPSAm c21tdS0+cHJpcS5xOworCXU2NCBldnRbUFJJUV9FTlRfRFdPUkRTXTsKKworCWRvIHsKKwkJd2hp bGUgKCFxdWV1ZV9yZW1vdmVfcmF3KHEsIGV2dCkpCisJCQlhcm1fc21tdV9oYW5kbGVfcHByKHNt bXUsIGV2dCk7CisKKwkJaWYgKHF1ZXVlX3N5bmNfcHJvZChxKSA9PSAtRU9WRVJGTE9XKQorCQkJ ZGV2X2VycihzbW11LT5kZXYsICJQUklRIG92ZXJmbG93IGRldGVjdGVkIC0tIHJlcXVlc3RzIGxv c3RcbiIpOworCX0gd2hpbGUgKCFxdWV1ZV9lbXB0eShxKSk7CisKKwkvKiBTeW5jIG91ciBvdmVy ZmxvdyBmbGFnLCBhcyB3ZSBiZWxpZXZlIHdlJ3JlIHVwIHRvIHNwZWVkICovCisJcS0+Y29ucyA9 IFFfT1ZGKHEsIHEtPnByb2QpIHwgUV9XUlAocSwgcS0+Y29ucykgfCBRX0lEWChxLCBxLT5jb25z KTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBhcm1fc21t dV9jbWRxX3N5bmNfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXYpCit7CisJLyogV2UgZG9uJ3Qg YWN0dWFsbHkgdXNlIENNRF9TWU5DIGludGVycnVwdHMgZm9yIGFueXRoaW5nICovCisJcmV0dXJu IElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IGFybV9zbW11X2RldmljZV9kaXNhYmxlKHN0 cnVjdCBhcm1fc21tdV9kZXZpY2UgKnNtbXUpOworCitzdGF0aWMgaXJxcmV0dXJuX3QgYXJtX3Nt bXVfZ2Vycm9yX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2KQoreworCXUzMiBnZXJyb3IsIGdl cnJvcm4sIGFjdGl2ZTsKKwlzdHJ1Y3QgYXJtX3NtbXVfZGV2aWNlICpzbW11ID0gZGV2OworCisJ Z2Vycm9yID0gcmVhZGxfcmVsYXhlZChzbW11LT5iYXNlICsgQVJNX1NNTVVfR0VSUk9SKTsKKwln ZXJyb3JuID0gcmVhZGxfcmVsYXhlZChzbW11LT5iYXNlICsgQVJNX1NNTVVfR0VSUk9STik7CisK KwlhY3RpdmUgPSBnZXJyb3IgXiBnZXJyb3JuOworCWlmICghKGFjdGl2ZSAmIEdFUlJPUl9FUlJf TUFTSykpCisJCXJldHVybiBJUlFfTk9ORTsgLyogTm8gZXJyb3JzIHBlbmRpbmcgKi8KKworCWRl dl93YXJuKHNtbXUtPmRldiwKKwkJICJ1bmV4cGVjdGVkIGdsb2JhbCBlcnJvciByZXBvcnRlZCAo MHglMDh4KSwgdGhpcyBjb3VsZCBiZSBzZXJpb3VzXG4iLAorCQkgYWN0aXZlKTsKKworCWlmIChh Y3RpdmUgJiBHRVJST1JfU0ZNX0VSUikgeworCQlkZXZfZXJyKHNtbXUtPmRldiwgImRldmljZSBo YXMgZW50ZXJlZCBTZXJ2aWNlIEZhaWx1cmUgTW9kZSFcbiIpOworCQlhcm1fc21tdV9kZXZpY2Vf ZGlzYWJsZShzbW11KTsKKwl9CisKKwlpZiAoYWN0aXZlICYgR0VSUk9SX01TSV9HRVJST1JfQUJU X0VSUikKKwkJZGV2X3dhcm4oc21tdS0+ZGV2LCAiR0VSUk9SIE1TSSB3cml0ZSBhYm9ydGVkXG4i KTsKKworCWlmIChhY3RpdmUgJiBHRVJST1JfTVNJX1BSSVFfQUJUX0VSUikKKwkJZGV2X3dhcm4o c21tdS0+ZGV2LCAiUFJJUSBNU0kgd3JpdGUgYWJvcnRlZFxuIik7CisKKwlpZiAoYWN0aXZlICYg R0VSUk9SX01TSV9FVlRRX0FCVF9FUlIpCisJCWRldl93YXJuKHNtbXUtPmRldiwgIkVWVFEgTVNJ IHdyaXRlIGFib3J0ZWRcbiIpOworCisJaWYgKGFjdGl2ZSAmIEdFUlJPUl9NU0lfQ01EUV9BQlRf RVJSKSB7CisJCWRldl93YXJuKHNtbXUtPmRldiwgIkNNRFEgTVNJIHdyaXRlIGFib3J0ZWRcbiIp OworCQlhcm1fc21tdV9jbWRxX3N5bmNfaGFuZGxlcihpcnEsIHNtbXUtPmRldik7CisJfQorCisJ aWYgKGFjdGl2ZSAmIEdFUlJPUl9QUklRX0FCVF9FUlIpCisJCWRldl9lcnIoc21tdS0+ZGV2LCAi UFJJUSB3cml0ZSBhYm9ydGVkIC0tIGV2ZW50cyBtYXkgaGF2ZSBiZWVuIGxvc3RcbiIpOworCisJ aWYgKGFjdGl2ZSAmIEdFUlJPUl9FVlRRX0FCVF9FUlIpCisJCWRldl9lcnIoc21tdS0+ZGV2LCAi RVZUUSB3cml0ZSBhYm9ydGVkIC0tIGV2ZW50cyBtYXkgaGF2ZSBiZWVuIGxvc3RcbiIpOworCisJ aWYgKGFjdGl2ZSAmIEdFUlJPUl9DTURRX0VSUikKKwkJYXJtX3NtbXVfY21kcV9za2lwX2Vycihz bW11KTsKKworCXdyaXRlbChnZXJyb3IsIHNtbXUtPmJhc2UgKyBBUk1fU01NVV9HRVJST1JOKTsK KwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBhcm1fc21tdV9j b21iaW5lZF9pcnFfdGhyZWFkKGludCBpcnEsIHZvaWQgKmRldikKK3sKKwlzdHJ1Y3QgYXJtX3Nt bXVfZGV2aWNlICpzbW11ID0gZGV2OworCisJYXJtX3NtbXVfZXZ0cV90aHJlYWQoaXJxLCBkZXYp OworCWlmIChzbW11LT5mZWF0dXJlcyAmIEFSTV9TTU1VX0ZFQVRfUFJJKQorCQlhcm1fc21tdV9w cmlxX3RocmVhZChpcnEsIGRldik7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRp YyBpcnFyZXR1cm5fdCBhcm1fc21tdV9jb21iaW5lZF9pcnFfaGFuZGxlcihpbnQgaXJxLCB2b2lk ICpkZXYpCit7CisJYXJtX3NtbXVfZ2Vycm9yX2hhbmRsZXIoaXJxLCBkZXYpOworCWFybV9zbW11 X2NtZHFfc3luY19oYW5kbGVyKGlycSwgZGV2KTsKKwlyZXR1cm4gSVJRX1dBS0VfVEhSRUFEOwor fQorCisvKiBJT19QR1RBQkxFIEFQSSAqLworc3RhdGljIHZvaWQgX19hcm1fc21tdV90bGJfc3lu YyhzdHJ1Y3QgYXJtX3NtbXVfZGV2aWNlICpzbW11KQoreworCXN0cnVjdCBhcm1fc21tdV9jbWRx X2VudCBjbWQ7CisKKwljbWQub3Bjb2RlID0gQ01EUV9PUF9DTURfU1lOQzsKKwlhcm1fc21tdV9j bWRxX2lzc3VlX2NtZChzbW11LCAmY21kKTsKK30KKworc3RhdGljIHZvaWQgYXJtX3NtbXVfdGxi X3N5bmModm9pZCAqY29va2llKQoreworCXN0cnVjdCBhcm1fc21tdV9kb21haW4gKnNtbXVfZG9t YWluID0gY29va2llOworCV9fYXJtX3NtbXVfdGxiX3N5bmMoc21tdV9kb21haW4tPnNtbXUpOwor fQorCitzdGF0aWMgdm9pZCBhcm1fc21tdV90bGJfaW52X2NvbnRleHQodm9pZCAqY29va2llKQor eworCXN0cnVjdCBhcm1fc21tdV9kb21haW4gKnNtbXVfZG9tYWluID0gY29va2llOworCXN0cnVj dCBhcm1fc21tdV9kZXZpY2UgKnNtbXUgPSBzbW11X2RvbWFpbi0+c21tdTsKKwlzdHJ1Y3QgYXJt X3NtbXVfY21kcV9lbnQgY21kOworCisJaWYgKHNtbXVfZG9tYWluLT5zdGFnZSA9PSBBUk1fU01N VV9ET01BSU5fUzEpIHsKKwkJY21kLm9wY29kZQk9IENNRFFfT1BfVExCSV9OSF9BU0lEOworCQlj bWQudGxiaS5hc2lkCT0gc21tdV9kb21haW4tPnMxX2NmZy5jZC5hc2lkOworCQljbWQudGxiaS52 bWlkCT0gMDsKKwl9IGVsc2UgeworCQljbWQub3Bjb2RlCT0gQ01EUV9PUF9UTEJJX1MxMl9WTUFM TDsKKwkJY21kLnRsYmkudm1pZAk9IHNtbXVfZG9tYWluLT5zMl9jZmcudm1pZDsKKwl9CisKKwlh cm1fc21tdV9jbWRxX2lzc3VlX2NtZChzbW11LCAmY21kKTsKKwlfX2FybV9zbW11X3RsYl9zeW5j KHNtbXUpOworfQorCitzdGF0aWMgdm9pZCBhcm1fc21tdV90bGJfaW52X3JhbmdlX25vc3luYyh1 bnNpZ25lZCBsb25nIGlvdmEsIHNpemVfdCBzaXplLAorCQkJCQkgIHNpemVfdCBncmFudWxlLCBi b29sIGxlYWYsIHZvaWQgKmNvb2tpZSkKK3sKKwlzdHJ1Y3QgYXJtX3NtbXVfZG9tYWluICpzbW11 X2RvbWFpbiA9IGNvb2tpZTsKKwlzdHJ1Y3QgYXJtX3NtbXVfZGV2aWNlICpzbW11ID0gc21tdV9k b21haW4tPnNtbXU7CisJc3RydWN0IGFybV9zbW11X2NtZHFfZW50IGNtZCA9IHsKKwkJLnRsYmkg PSB7CisJCQkubGVhZgk9IGxlYWYsCisJCQkuYWRkcgk9IGlvdmEsCisJCX0sCisJfTsKKworCWlm IChzbW11X2RvbWFpbi0+c3RhZ2UgPT0gQVJNX1NNTVVfRE9NQUlOX1MxKSB7CisJCWNtZC5vcGNv ZGUJPSBDTURRX09QX1RMQklfTkhfVkE7CisJCWNtZC50bGJpLmFzaWQJPSBzbW11X2RvbWFpbi0+ czFfY2ZnLmNkLmFzaWQ7CisJfSBlbHNlIHsKKwkJY21kLm9wY29kZQk9IENNRFFfT1BfVExCSV9T Ml9JUEE7CisJCWNtZC50bGJpLnZtaWQJPSBzbW11X2RvbWFpbi0+czJfY2ZnLnZtaWQ7CisJfQor CisJZG8geworCQlhcm1fc21tdV9jbWRxX2lzc3VlX2NtZChzbW11LCAmY21kKTsKKwkJY21kLnRs YmkuYWRkciArPSBncmFudWxlOworCX0gd2hpbGUgKHNpemUgLT0gZ3JhbnVsZSk7Cit9CisKK3N0 YXRpYyBjb25zdCBzdHJ1Y3QgaW9tbXVfZ2F0aGVyX29wcyBhcm1fc21tdV9nYXRoZXJfb3BzID0g eworCS50bGJfZmx1c2hfYWxsCT0gYXJtX3NtbXVfdGxiX2ludl9jb250ZXh0LAorCS50bGJfYWRk X2ZsdXNoCT0gYXJtX3NtbXVfdGxiX2ludl9yYW5nZV9ub3N5bmMsCisJLnRsYl9zeW5jCT0gYXJt X3NtbXVfdGxiX3N5bmMsCit9OworCisvKiBJT01NVSBBUEkgKi8KK3N0YXRpYyBib29sIGFybV9z bW11X2NhcGFibGUoZW51bSBpb21tdV9jYXAgY2FwKQoreworCXN3aXRjaCAoY2FwKSB7CisJY2Fz ZSBJT01NVV9DQVBfQ0FDSEVfQ09IRVJFTkNZOgorCQlyZXR1cm4gdHJ1ZTsKKwljYXNlIElPTU1V X0NBUF9OT0VYRUM6CisJCXJldHVybiB0cnVlOworCWRlZmF1bHQ6CisJCXJldHVybiBmYWxzZTsK Kwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaW9tbXVfZG9tYWluICphcm1fc21tdV9kb21haW5fYWxs b2ModW5zaWduZWQgdHlwZSkKK3sKKwlzdHJ1Y3QgYXJtX3NtbXVfZG9tYWluICpzbW11X2RvbWFp bjsKKworCWlmICh0eXBlICE9IElPTU1VX0RPTUFJTl9VTk1BTkFHRUQgJiYKKwkgICAgdHlwZSAh PSBJT01NVV9ET01BSU5fRE1BICYmCisJICAgIHR5cGUgIT0gSU9NTVVfRE9NQUlOX0lERU5USVRZ KQorCQlyZXR1cm4gTlVMTDsKKworCS8qCisJICogQWxsb2NhdGUgdGhlIGRvbWFpbiBhbmQgaW5p dGlhbGlzZSBzb21lIG9mIGl0cyBkYXRhIHN0cnVjdHVyZXMuCisJICogV2UgY2FuJ3QgcmVhbGx5 IGRvIGFueXRoaW5nIG1lYW5pbmdmdWwgdW50aWwgd2UndmUgYWRkZWQgYQorCSAqIG1hc3Rlci4K KwkgKi8KKwlzbW11X2RvbWFpbiA9IGt6YWxsb2Moc2l6ZW9mKCpzbW11X2RvbWFpbiksIEdGUF9L RVJORUwpOworCWlmICghc21tdV9kb21haW4pCisJCXJldHVybiBOVUxMOworCisJaWYgKHR5cGUg PT0gSU9NTVVfRE9NQUlOX0RNQSAmJgorCSAgICBpb21tdV9nZXRfZG1hX2Nvb2tpZSgmc21tdV9k b21haW4tPmRvbWFpbikpIHsKKwkJa2ZyZWUoc21tdV9kb21haW4pOworCQlyZXR1cm4gTlVMTDsK Kwl9CisKKwltdXRleF9pbml0KCZzbW11X2RvbWFpbi0+aW5pdF9tdXRleCk7CisJcmV0dXJuICZz bW11X2RvbWFpbi0+ZG9tYWluOworfQorCitzdGF0aWMgaW50IGFybV9zbW11X2JpdG1hcF9hbGxv Yyh1bnNpZ25lZCBsb25nICptYXAsIGludCBzcGFuKQoreworCWludCBpZHgsIHNpemUgPSAxIDw8 IHNwYW47CisKKwlkbyB7CisJCWlkeCA9IGZpbmRfZmlyc3RfemVyb19iaXQobWFwLCBzaXplKTsK KwkJaWYgKGlkeCA9PSBzaXplKQorCQkJcmV0dXJuIC1FTk9TUEM7CisJfSB3aGlsZSAodGVzdF9h bmRfc2V0X2JpdChpZHgsIG1hcCkpOworCisJcmV0dXJuIGlkeDsKK30KKworc3RhdGljIHZvaWQg YXJtX3NtbXVfYml0bWFwX2ZyZWUodW5zaWduZWQgbG9uZyAqbWFwLCBpbnQgaWR4KQoreworCWNs ZWFyX2JpdChpZHgsIG1hcCk7Cit9CisKK3N0YXRpYyB2b2lkIGFybV9zbW11X2RvbWFpbl9mcmVl KHN0cnVjdCBpb21tdV9kb21haW4gKmRvbWFpbikKK3sKKwlzdHJ1Y3QgYXJtX3NtbXVfZG9tYWlu ICpzbW11X2RvbWFpbiA9IHRvX3NtbXVfZG9tYWluKGRvbWFpbik7CisJc3RydWN0IGFybV9zbW11 X2RldmljZSAqc21tdSA9IHNtbXVfZG9tYWluLT5zbW11OworCisJaW9tbXVfcHV0X2RtYV9jb29r aWUoZG9tYWluKTsKKwlmcmVlX2lvX3BndGFibGVfb3BzKHNtbXVfZG9tYWluLT5wZ3RibF9vcHMp OworCisJLyogRnJlZSB0aGUgQ0QgYW5kIEFTSUQsIGlmIHdlIGFsbG9jYXRlZCB0aGVtICovCisJ aWYgKHNtbXVfZG9tYWluLT5zdGFnZSA9PSBBUk1fU01NVV9ET01BSU5fUzEpIHsKKwkJc3RydWN0 IGFybV9zbW11X3MxX2NmZyAqY2ZnID0gJnNtbXVfZG9tYWluLT5zMV9jZmc7CisKKwkJaWYgKGNm Zy0+Y2RwdHIpIHsKKwkJCWRtYW1fZnJlZV9jb2hlcmVudChzbW11X2RvbWFpbi0+c21tdS0+ZGV2 LAorCQkJCQkgICBDVFhERVNDX0NEX0RXT1JEUyA8PCAzLAorCQkJCQkgICBjZmctPmNkcHRyLAor CQkJCQkgICBjZmctPmNkcHRyX2RtYSk7CisKKwkJCWFybV9zbW11X2JpdG1hcF9mcmVlKHNtbXUt PmFzaWRfbWFwLCBjZmctPmNkLmFzaWQpOworCQl9CisJfSBlbHNlIHsKKwkJc3RydWN0IGFybV9z bW11X3MyX2NmZyAqY2ZnID0gJnNtbXVfZG9tYWluLT5zMl9jZmc7CisJCWlmIChjZmctPnZtaWQp CisJCQlhcm1fc21tdV9iaXRtYXBfZnJlZShzbW11LT52bWlkX21hcCwgY2ZnLT52bWlkKTsKKwl9 CisKKwlrZnJlZShzbW11X2RvbWFpbik7Cit9CisKK3N0YXRpYyBpbnQgYXJtX3NtbXVfZG9tYWlu X2ZpbmFsaXNlX3MxKHN0cnVjdCBhcm1fc21tdV9kb21haW4gKnNtbXVfZG9tYWluLAorCQkJCSAg ICAgICBzdHJ1Y3QgaW9fcGd0YWJsZV9jZmcgKnBndGJsX2NmZykKK3sKKwlpbnQgcmV0OworCWlu dCBhc2lkOworCXN0cnVjdCBhcm1fc21tdV9kZXZpY2UgKnNtbXUgPSBzbW11X2RvbWFpbi0+c21t dTsKKwlzdHJ1Y3QgYXJtX3NtbXVfczFfY2ZnICpjZmcgPSAmc21tdV9kb21haW4tPnMxX2NmZzsK KworCWFzaWQgPSBhcm1fc21tdV9iaXRtYXBfYWxsb2Moc21tdS0+YXNpZF9tYXAsIHNtbXUtPmFz aWRfYml0cyk7CisJaWYgKGFzaWQgPCAwKQorCQlyZXR1cm4gYXNpZDsKKworCWNmZy0+Y2RwdHIg PSBkbWFtX2FsbG9jX2NvaGVyZW50KHNtbXUtPmRldiwgQ1RYREVTQ19DRF9EV09SRFMgPDwgMywK KwkJCQkJICZjZmctPmNkcHRyX2RtYSwKKwkJCQkJIEdGUF9LRVJORUwgfCBfX0dGUF9aRVJPKTsK KwlpZiAoIWNmZy0+Y2RwdHIpIHsKKwkJZGV2X3dhcm4oc21tdS0+ZGV2LCAiZmFpbGVkIHRvIGFs bG9jYXRlIGNvbnRleHQgZGVzY3JpcHRvclxuIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8g b3V0X2ZyZWVfYXNpZDsKKwl9CisKKwljZmctPmNkLmFzaWQJPSAodTE2KWFzaWQ7CisJY2ZnLT5j ZC50dGJyCT0gcGd0YmxfY2ZnLT5hcm1fbHBhZV9zMV9jZmcudHRiclswXTsKKwljZmctPmNkLnRj cgk9IHBndGJsX2NmZy0+YXJtX2xwYWVfczFfY2ZnLnRjcjsKKwljZmctPmNkLm1haXIJPSBwZ3Ri bF9jZmctPmFybV9scGFlX3MxX2NmZy5tYWlyWzBdOworCXJldHVybiAwOworCitvdXRfZnJlZV9h c2lkOgorCWFybV9zbW11X2JpdG1hcF9mcmVlKHNtbXUtPmFzaWRfbWFwLCBhc2lkKTsKKwlyZXR1 cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFybV9zbW11X2RvbWFpbl9maW5hbGlzZV9zMihzdHJ1 Y3QgYXJtX3NtbXVfZG9tYWluICpzbW11X2RvbWFpbiwKKwkJCQkgICAgICAgc3RydWN0IGlvX3Bn dGFibGVfY2ZnICpwZ3RibF9jZmcpCit7CisJaW50IHZtaWQ7CisJc3RydWN0IGFybV9zbW11X2Rl dmljZSAqc21tdSA9IHNtbXVfZG9tYWluLT5zbW11OworCXN0cnVjdCBhcm1fc21tdV9zMl9jZmcg KmNmZyA9ICZzbW11X2RvbWFpbi0+czJfY2ZnOworCisJdm1pZCA9IGFybV9zbW11X2JpdG1hcF9h bGxvYyhzbW11LT52bWlkX21hcCwgc21tdS0+dm1pZF9iaXRzKTsKKwlpZiAodm1pZCA8IDApCisJ CXJldHVybiB2bWlkOworCisJY2ZnLT52bWlkCT0gKHUxNil2bWlkOworCWNmZy0+dnR0YnIJPSBw Z3RibF9jZmctPmFybV9scGFlX3MyX2NmZy52dHRicjsKKwljZmctPnZ0Y3IJPSBwZ3RibF9jZmct PmFybV9scGFlX3MyX2NmZy52dGNyOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFybV9z bW11X2RvbWFpbl9maW5hbGlzZShzdHJ1Y3QgaW9tbXVfZG9tYWluICpkb21haW4pCit7CisJaW50 IHJldDsKKwl1bnNpZ25lZCBsb25nIGlhcywgb2FzOworCWVudW0gaW9fcGd0YWJsZV9mbXQgZm10 OworCXN0cnVjdCBpb19wZ3RhYmxlX2NmZyBwZ3RibF9jZmc7CisJc3RydWN0IGlvX3BndGFibGVf b3BzICpwZ3RibF9vcHM7CisJaW50ICgqZmluYWxpc2Vfc3RhZ2VfZm4pKHN0cnVjdCBhcm1fc21t dV9kb21haW4gKiwKKwkJCQkgc3RydWN0IGlvX3BndGFibGVfY2ZnICopOworCXN0cnVjdCBhcm1f c21tdV9kb21haW4gKnNtbXVfZG9tYWluID0gdG9fc21tdV9kb21haW4oZG9tYWluKTsKKwlzdHJ1 Y3QgYXJtX3NtbXVfZGV2aWNlICpzbW11ID0gc21tdV9kb21haW4tPnNtbXU7CisKKwlpZiAoZG9t YWluLT50eXBlID09IElPTU1VX0RPTUFJTl9JREVOVElUWSkgeworCQlzbW11X2RvbWFpbi0+c3Rh Z2UgPSBBUk1fU01NVV9ET01BSU5fQllQQVNTOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBSZXN0 cmljdCB0aGUgc3RhZ2UgdG8gd2hhdCB3ZSBjYW4gYWN0dWFsbHkgc3VwcG9ydCAqLworCWlmICgh KHNtbXUtPmZlYXR1cmVzICYgQVJNX1NNTVVfRkVBVF9UUkFOU19TMSkpCisJCXNtbXVfZG9tYWlu LT5zdGFnZSA9IEFSTV9TTU1VX0RPTUFJTl9TMjsKKwlpZiAoIShzbW11LT5mZWF0dXJlcyAmIEFS TV9TTU1VX0ZFQVRfVFJBTlNfUzIpKQorCQlzbW11X2RvbWFpbi0+c3RhZ2UgPSBBUk1fU01NVV9E T01BSU5fUzE7CisKKwlzd2l0Y2ggKHNtbXVfZG9tYWluLT5zdGFnZSkgeworCWNhc2UgQVJNX1NN TVVfRE9NQUlOX1MxOgorCQlpYXMgPSBWQV9CSVRTOworCQlvYXMgPSBzbW11LT5pYXM7CisJCWZt dCA9IEFSTV82NF9MUEFFX1MxOworCQlmaW5hbGlzZV9zdGFnZV9mbiA9IGFybV9zbW11X2RvbWFp bl9maW5hbGlzZV9zMTsKKwkJYnJlYWs7CisJY2FzZSBBUk1fU01NVV9ET01BSU5fTkVTVEVEOgor CWNhc2UgQVJNX1NNTVVfRE9NQUlOX1MyOgorCQlpYXMgPSBzbW11LT5pYXM7CisJCW9hcyA9IHNt bXUtPm9hczsKKwkJZm10ID0gQVJNXzY0X0xQQUVfUzI7CisJCWZpbmFsaXNlX3N0YWdlX2ZuID0g YXJtX3NtbXVfZG9tYWluX2ZpbmFsaXNlX3MyOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1 cm4gLUVJTlZBTDsKKwl9CisKKwlwZ3RibF9jZmcgPSAoc3RydWN0IGlvX3BndGFibGVfY2ZnKSB7 CisJCS5wZ3NpemVfYml0bWFwCT0gc21tdS0+cGdzaXplX2JpdG1hcCwKKwkJLmlhcwkJPSBpYXMs CisJCS5vYXMJCT0gb2FzLAorCQkudGxiCQk9ICZhcm1fc21tdV9nYXRoZXJfb3BzLAorCQkuaW9t bXVfZGV2CT0gc21tdS0+ZGV2LAorCX07CisKKwlpZiAoc21tdS0+ZmVhdHVyZXMgJiBBUk1fU01N VV9GRUFUX0NPSEVSRU5DWSkKKwkJcGd0YmxfY2ZnLnF1aXJrcyA9IElPX1BHVEFCTEVfUVVJUktf Tk9fRE1BOworCisJcGd0Ymxfb3BzID0gYWxsb2NfaW9fcGd0YWJsZV9vcHMoZm10LCAmcGd0Ymxf Y2ZnLCBzbW11X2RvbWFpbik7CisJaWYgKCFwZ3RibF9vcHMpCisJCXJldHVybiAtRU5PTUVNOwor CisJZG9tYWluLT5wZ3NpemVfYml0bWFwID0gcGd0YmxfY2ZnLnBnc2l6ZV9iaXRtYXA7CisJZG9t YWluLT5nZW9tZXRyeS5hcGVydHVyZV9lbmQgPSAoMVVMIDw8IGlhcykgLSAxOworCWRvbWFpbi0+ Z2VvbWV0cnkuZm9yY2VfYXBlcnR1cmUgPSB0cnVlOworCXNtbXVfZG9tYWluLT5wZ3RibF9vcHMg PSBwZ3RibF9vcHM7CisKKwlyZXQgPSBmaW5hbGlzZV9zdGFnZV9mbihzbW11X2RvbWFpbiwgJnBn dGJsX2NmZyk7CisJaWYgKHJldCA8IDApCisJCWZyZWVfaW9fcGd0YWJsZV9vcHMocGd0Ymxfb3Bz KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBfX2xlNjQgKmFybV9zbW11X2dldF9zdGVw X2Zvcl9zaWQoc3RydWN0IGFybV9zbW11X2RldmljZSAqc21tdSwgdTMyIHNpZCkKK3sKKwlfX2xl NjQgKnN0ZXA7CisJc3RydWN0IGFybV9zbW11X3N0cnRhYl9jZmcgKmNmZyA9ICZzbW11LT5zdHJ0 YWJfY2ZnOworCisJaWYgKHNtbXUtPmZlYXR1cmVzICYgQVJNX1NNTVVfRkVBVF8yX0xWTF9TVFJU QUIpIHsKKwkJc3RydWN0IGFybV9zbW11X3N0cnRhYl9sMV9kZXNjICpsMV9kZXNjOworCQlpbnQg aWR4OworCisJCS8qIFR3by1sZXZlbCB3YWxrICovCisJCWlkeCA9IChzaWQgPj4gU1RSVEFCX1NQ TElUKSAqIFNUUlRBQl9MMV9ERVNDX0RXT1JEUzsKKwkJbDFfZGVzYyA9ICZjZmctPmwxX2Rlc2Nb aWR4XTsKKwkJaWR4ID0gKHNpZCAmICgoMSA8PCBTVFJUQUJfU1BMSVQpIC0gMSkpICogU1RSVEFC X1NURV9EV09SRFM7CisJCXN0ZXAgPSAmbDFfZGVzYy0+bDJwdHJbaWR4XTsKKwl9IGVsc2Ugewor CQkvKiBTaW1wbGUgbGluZWFyIGxvb2t1cCAqLworCQlzdGVwID0gJmNmZy0+c3RydGFiW3NpZCAq IFNUUlRBQl9TVEVfRFdPUkRTXTsKKwl9CisKKwlyZXR1cm4gc3RlcDsKK30KKworc3RhdGljIHZv aWQgYXJtX3NtbXVfaW5zdGFsbF9zdGVfZm9yX2RldihzdHJ1Y3QgaW9tbXVfZndzcGVjICpmd3Nw ZWMpCit7CisJaW50IGk7CisJc3RydWN0IGFybV9zbW11X21hc3Rlcl9kYXRhICptYXN0ZXIgPSBm d3NwZWMtPmlvbW11X3ByaXY7CisJc3RydWN0IGFybV9zbW11X2RldmljZSAqc21tdSA9IG1hc3Rl ci0+c21tdTsKKworCWZvciAoaSA9IDA7IGkgPCBmd3NwZWMtPm51bV9pZHM7ICsraSkgeworCQl1 MzIgc2lkID0gZndzcGVjLT5pZHNbaV07CisJCV9fbGU2NCAqc3RlcCA9IGFybV9zbW11X2dldF9z dGVwX2Zvcl9zaWQoc21tdSwgc2lkKTsKKworCQlhcm1fc21tdV93cml0ZV9zdHJ0YWJfZW50KHNt bXUsIHNpZCwgc3RlcCwgJm1hc3Rlci0+c3RlKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGFybV9z bW11X2RldGFjaF9kZXYoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBhcm1fc21tdV9t YXN0ZXJfZGF0YSAqbWFzdGVyID0gZGV2LT5pb21tdV9md3NwZWMtPmlvbW11X3ByaXY7CisKKwlt YXN0ZXItPnN0ZS5hc3NpZ25lZCA9IGZhbHNlOworCWFybV9zbW11X2luc3RhbGxfc3RlX2Zvcl9k ZXYoZGV2LT5pb21tdV9md3NwZWMpOworfQorCitzdGF0aWMgaW50IGFybV9zbW11X2F0dGFjaF9k ZXYoc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tYWluLCBzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJ aW50IHJldCA9IDA7CisJc3RydWN0IGFybV9zbW11X2RldmljZSAqc21tdTsKKwlzdHJ1Y3QgYXJt X3NtbXVfZG9tYWluICpzbW11X2RvbWFpbiA9IHRvX3NtbXVfZG9tYWluKGRvbWFpbik7CisJc3Ry dWN0IGFybV9zbW11X21hc3Rlcl9kYXRhICptYXN0ZXI7CisJc3RydWN0IGFybV9zbW11X3N0cnRh Yl9lbnQgKnN0ZTsKKworCWlmICghZGV2LT5pb21tdV9md3NwZWMpCisJCXJldHVybiAtRU5PRU5U OworCisJbWFzdGVyID0gZGV2LT5pb21tdV9md3NwZWMtPmlvbW11X3ByaXY7CisJc21tdSA9IG1h c3Rlci0+c21tdTsKKwlzdGUgPSAmbWFzdGVyLT5zdGU7CisKKwkvKiBBbHJlYWR5IGF0dGFjaGVk IHRvIGEgZGlmZmVyZW50IGRvbWFpbj8gKi8KKwlpZiAoc3RlLT5hc3NpZ25lZCkKKwkJYXJtX3Nt bXVfZGV0YWNoX2RldihkZXYpOworCisJbXV0ZXhfbG9jaygmc21tdV9kb21haW4tPmluaXRfbXV0 ZXgpOworCisJaWYgKCFzbW11X2RvbWFpbi0+c21tdSkgeworCQlzbW11X2RvbWFpbi0+c21tdSA9 IHNtbXU7CisJCXJldCA9IGFybV9zbW11X2RvbWFpbl9maW5hbGlzZShkb21haW4pOworCQlpZiAo cmV0KSB7CisJCQlzbW11X2RvbWFpbi0+c21tdSA9IE5VTEw7CisJCQlnb3RvIG91dF91bmxvY2s7 CisJCX0KKwl9IGVsc2UgaWYgKHNtbXVfZG9tYWluLT5zbW11ICE9IHNtbXUpIHsKKwkJZGV2X2Vy cihkZXYsCisJCQkiY2Fubm90IGF0dGFjaCB0byBTTU1VICVzICh1cHN0cmVhbSBvZiAlcylcbiIs CisJCQlkZXZfbmFtZShzbW11X2RvbWFpbi0+c21tdS0+ZGV2KSwKKwkJCWRldl9uYW1lKHNtbXUt PmRldikpOworCQlyZXQgPSAtRU5YSU87CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKwlzdGUt PmFzc2lnbmVkID0gdHJ1ZTsKKworCWlmIChzbW11X2RvbWFpbi0+c3RhZ2UgPT0gQVJNX1NNTVVf RE9NQUlOX0JZUEFTUykgeworCQlzdGUtPnMxX2NmZyA9IE5VTEw7CisJCXN0ZS0+czJfY2ZnID0g TlVMTDsKKwl9IGVsc2UgaWYgKHNtbXVfZG9tYWluLT5zdGFnZSA9PSBBUk1fU01NVV9ET01BSU5f UzEpIHsKKwkJc3RlLT5zMV9jZmcgPSAmc21tdV9kb21haW4tPnMxX2NmZzsKKwkJc3RlLT5zMl9j ZmcgPSBOVUxMOworCQlhcm1fc21tdV93cml0ZV9jdHhfZGVzYyhzbW11LCBzdGUtPnMxX2NmZyk7 CisJfSBlbHNlIHsKKwkJc3RlLT5zMV9jZmcgPSBOVUxMOworCQlzdGUtPnMyX2NmZyA9ICZzbW11 X2RvbWFpbi0+czJfY2ZnOworCX0KKworCWFybV9zbW11X2luc3RhbGxfc3RlX2Zvcl9kZXYoZGV2 LT5pb21tdV9md3NwZWMpOworb3V0X3VubG9jazoKKwltdXRleF91bmxvY2soJnNtbXVfZG9tYWlu LT5pbml0X211dGV4KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFybV9zbW11X21h cChzdHJ1Y3QgaW9tbXVfZG9tYWluICpkb21haW4sIHVuc2lnbmVkIGxvbmcgaW92YSwKKwkJCXBo eXNfYWRkcl90IHBhZGRyLCBzaXplX3Qgc2l6ZSwgaW50IHByb3QpCit7CisJc3RydWN0IGlvX3Bn dGFibGVfb3BzICpvcHMgPSB0b19zbW11X2RvbWFpbihkb21haW4pLT5wZ3RibF9vcHM7CisKKwlp ZiAoIW9wcykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXR1cm4gb3BzLT5tYXAob3BzLCBpb3Zh LCBwYWRkciwgc2l6ZSwgcHJvdCk7Cit9CisKK3N0YXRpYyBzaXplX3QKK2FybV9zbW11X3VubWFw KHN0cnVjdCBpb21tdV9kb21haW4gKmRvbWFpbiwgdW5zaWduZWQgbG9uZyBpb3ZhLCBzaXplX3Qg c2l6ZSkKK3sKKwlzdHJ1Y3QgaW9fcGd0YWJsZV9vcHMgKm9wcyA9IHRvX3NtbXVfZG9tYWluKGRv bWFpbiktPnBndGJsX29wczsKKworCWlmICghb3BzKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBv cHMtPnVubWFwKG9wcywgaW92YSwgc2l6ZSk7Cit9CisKK3N0YXRpYyBwaHlzX2FkZHJfdAorYXJt X3NtbXVfaW92YV90b19waHlzKHN0cnVjdCBpb21tdV9kb21haW4gKmRvbWFpbiwgZG1hX2FkZHJf dCBpb3ZhKQoreworCXN0cnVjdCBpb19wZ3RhYmxlX29wcyAqb3BzID0gdG9fc21tdV9kb21haW4o ZG9tYWluKS0+cGd0Ymxfb3BzOworCisJaWYgKGRvbWFpbi0+dHlwZSA9PSBJT01NVV9ET01BSU5f SURFTlRJVFkpCisJCXJldHVybiBpb3ZhOworCisJaWYgKCFvcHMpCisJCXJldHVybiAwOworCisJ cmV0dXJuIG9wcy0+aW92YV90b19waHlzKG9wcywgaW92YSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qg cGxhdGZvcm1fZHJpdmVyIGFybV9zbW11X2RyaXZlcjsKKworc3RhdGljIGludCBhcm1fc21tdV9t YXRjaF9ub2RlKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gZGV2 LT5md25vZGUgPT0gZGF0YTsKK30KKworc3RhdGljCitzdHJ1Y3QgYXJtX3NtbXVfZGV2aWNlICph cm1fc21tdV9nZXRfYnlfZndub2RlKHN0cnVjdCBmd25vZGVfaGFuZGxlICpmd25vZGUpCit7CisJ c3RydWN0IGRldmljZSAqZGV2ID0gZHJpdmVyX2ZpbmRfZGV2aWNlKCZhcm1fc21tdV9kcml2ZXIu ZHJpdmVyLCBOVUxMLAorCQkJCQkJZndub2RlLCBhcm1fc21tdV9tYXRjaF9ub2RlKTsKKwlwdXRf ZGV2aWNlKGRldik7CisJcmV0dXJuIGRldiA/IGRldl9nZXRfZHJ2ZGF0YShkZXYpIDogTlVMTDsK K30KKworc3RhdGljIGJvb2wgYXJtX3NtbXVfc2lkX2luX3JhbmdlKHN0cnVjdCBhcm1fc21tdV9k ZXZpY2UgKnNtbXUsIHUzMiBzaWQpCit7CisJdW5zaWduZWQgbG9uZyBsaW1pdCA9IHNtbXUtPnN0 cnRhYl9jZmcubnVtX2wxX2VudHM7CisKKwlpZiAoc21tdS0+ZmVhdHVyZXMgJiBBUk1fU01NVV9G RUFUXzJfTFZMX1NUUlRBQikKKwkJbGltaXQgKj0gMVVMIDw8IFNUUlRBQl9TUExJVDsKKworCXJl dHVybiBzaWQgPCBsaW1pdDsKK30KKworc3RhdGljIHN0cnVjdCBpb21tdV9vcHMgYXJtX3NtbXVf b3BzOworCitzdGF0aWMgaW50IGFybV9zbW11X2FkZF9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2 KQoreworCWludCBpLCByZXQ7CisJc3RydWN0IGFybV9zbW11X2RldmljZSAqc21tdTsKKwlzdHJ1 Y3QgYXJtX3NtbXVfbWFzdGVyX2RhdGEgKm1hc3RlcjsKKwlzdHJ1Y3QgaW9tbXVfZndzcGVjICpm d3NwZWMgPSBkZXYtPmlvbW11X2Z3c3BlYzsKKwlzdHJ1Y3QgaW9tbXVfZ3JvdXAgKmdyb3VwOwor CisJaWYgKCFmd3NwZWMgfHwgZndzcGVjLT5vcHMgIT0gJmFybV9zbW11X29wcykKKwkJcmV0dXJu IC1FTk9ERVY7CisJLyoKKwkgKiBXZSBfY2FuXyBhY3R1YWxseSB3aXRoc3RhbmQgZG9kZ3kgYnVz IGNvZGUgcmUtY2FsbGluZyBhZGRfZGV2aWNlKCkKKwkgKiB3aXRob3V0IGFuIGludGVydmVuaW5n IHJlbW92ZV9kZXZpY2UoKS9vZl94bGF0ZSgpIHNlcXVlbmNlLCBidXQKKwkgKiB3ZSdyZSBub3Qg Z29pbmcgdG8gZG8gc28gcXVpZXRseS4uLgorCSAqLworCWlmIChXQVJOX09OX09OQ0UoZndzcGVj LT5pb21tdV9wcml2KSkgeworCQltYXN0ZXIgPSBmd3NwZWMtPmlvbW11X3ByaXY7CisJCXNtbXUg PSBtYXN0ZXItPnNtbXU7CisJfSBlbHNlIHsKKwkJc21tdSA9IGFybV9zbW11X2dldF9ieV9md25v ZGUoZndzcGVjLT5pb21tdV9md25vZGUpOworCQlpZiAoIXNtbXUpCisJCQlyZXR1cm4gLUVOT0RF VjsKKwkJbWFzdGVyID0ga3phbGxvYyhzaXplb2YoKm1hc3RlciksIEdGUF9LRVJORUwpOworCQlp ZiAoIW1hc3RlcikKKwkJCXJldHVybiAtRU5PTUVNOworCisJCW1hc3Rlci0+c21tdSA9IHNtbXU7 CisJCWZ3c3BlYy0+aW9tbXVfcHJpdiA9IG1hc3RlcjsKKwl9CisKKwkvKiBDaGVjayB0aGUgU0lE cyBhcmUgaW4gcmFuZ2Ugb2YgdGhlIFNNTVUgYW5kIG91ciBzdHJlYW0gdGFibGUgKi8KKwlmb3Ig KGkgPSAwOyBpIDwgZndzcGVjLT5udW1faWRzOyBpKyspIHsKKwkJdTMyIHNpZCA9IGZ3c3BlYy0+ aWRzW2ldOworCisJCWlmICghYXJtX3NtbXVfc2lkX2luX3JhbmdlKHNtbXUsIHNpZCkpCisJCQly ZXR1cm4gLUVSQU5HRTsKKworCQkvKiBFbnN1cmUgbDIgc3RydGFiIGlzIGluaXRpYWxpc2VkICov CisJCWlmIChzbW11LT5mZWF0dXJlcyAmIEFSTV9TTU1VX0ZFQVRfMl9MVkxfU1RSVEFCKSB7CisJ CQlyZXQgPSBhcm1fc21tdV9pbml0X2wyX3N0cnRhYihzbW11LCBzaWQpOworCQkJaWYgKHJldCkK KwkJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJZ3JvdXAgPSBpb21tdV9ncm91cF9nZXRfZm9y X2RldihkZXYpOworCWlmICghSVNfRVJSKGdyb3VwKSkgeworCQlpb21tdV9ncm91cF9wdXQoZ3Jv dXApOworCQlpb21tdV9kZXZpY2VfbGluaygmc21tdS0+aW9tbXUsIGRldik7CisJfQorCisJcmV0 dXJuIFBUUl9FUlJfT1JfWkVSTyhncm91cCk7Cit9CisKK3N0YXRpYyB2b2lkIGFybV9zbW11X3Jl bW92ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpb21tdV9md3NwZWMg KmZ3c3BlYyA9IGRldi0+aW9tbXVfZndzcGVjOworCXN0cnVjdCBhcm1fc21tdV9tYXN0ZXJfZGF0 YSAqbWFzdGVyOworCXN0cnVjdCBhcm1fc21tdV9kZXZpY2UgKnNtbXU7CisKKwlpZiAoIWZ3c3Bl YyB8fCBmd3NwZWMtPm9wcyAhPSAmYXJtX3NtbXVfb3BzKQorCQlyZXR1cm47CisKKwltYXN0ZXIg PSBmd3NwZWMtPmlvbW11X3ByaXY7CisJc21tdSA9IG1hc3Rlci0+c21tdTsKKwlpZiAobWFzdGVy ICYmIG1hc3Rlci0+c3RlLmFzc2lnbmVkKQorCQlhcm1fc21tdV9kZXRhY2hfZGV2KGRldik7CisJ aW9tbXVfZ3JvdXBfcmVtb3ZlX2RldmljZShkZXYpOworCWlvbW11X2RldmljZV91bmxpbmsoJnNt bXUtPmlvbW11LCBkZXYpOworCWtmcmVlKG1hc3Rlcik7CisJaW9tbXVfZndzcGVjX2ZyZWUoZGV2 KTsKK30KKworc3RhdGljIHN0cnVjdCBpb21tdV9ncm91cCAqYXJtX3NtbXVfZGV2aWNlX2dyb3Vw KHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaW9tbXVfZ3JvdXAgKmdyb3VwOworCisJ LyoKKwkgKiBXZSBkb24ndCBzdXBwb3J0IGRldmljZXMgc2hhcmluZyBzdHJlYW0gSURzIG90aGVy IHRoYW4gUENJIFJJRAorCSAqIGFsaWFzZXMsIHNpbmNlIHRoZSBuZWNlc3NhcnkgSUQtdG8tZGV2 aWNlIGxvb2t1cCBiZWNvbWVzIHJhdGhlcgorCSAqIGltcHJhY3RpY2FsIGdpdmVuIGEgcG90ZW50 aWFsIHNwYXJzZSAzMi1iaXQgc3RyZWFtIElEIHNwYWNlLgorCSAqLworCWlmIChkZXZfaXNfcGNp KGRldikpCisJCWdyb3VwID0gcGNpX2RldmljZV9ncm91cChkZXYpOworCWVsc2UKKwkJZ3JvdXAg PSBnZW5lcmljX2RldmljZV9ncm91cChkZXYpOworCisJcmV0dXJuIGdyb3VwOworfQorCitzdGF0 aWMgaW50IGFybV9zbW11X2RvbWFpbl9nZXRfYXR0cihzdHJ1Y3QgaW9tbXVfZG9tYWluICpkb21h aW4sCisJCQkJICAgIGVudW0gaW9tbXVfYXR0ciBhdHRyLCB2b2lkICpkYXRhKQoreworCXN0cnVj dCBhcm1fc21tdV9kb21haW4gKnNtbXVfZG9tYWluID0gdG9fc21tdV9kb21haW4oZG9tYWluKTsK KworCWlmIChkb21haW4tPnR5cGUgIT0gSU9NTVVfRE9NQUlOX1VOTUFOQUdFRCkKKwkJcmV0dXJu IC1FSU5WQUw7CisKKwlzd2l0Y2ggKGF0dHIpIHsKKwljYXNlIERPTUFJTl9BVFRSX05FU1RJTkc6 CisJCSooaW50ICopZGF0YSA9IChzbW11X2RvbWFpbi0+c3RhZ2UgPT0gQVJNX1NNTVVfRE9NQUlO X05FU1RFRCk7CisJCXJldHVybiAwOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PREVWOworCX0K K30KKworc3RhdGljIGludCBhcm1fc21tdV9kb21haW5fc2V0X2F0dHIoc3RydWN0IGlvbW11X2Rv bWFpbiAqZG9tYWluLAorCQkJCSAgICBlbnVtIGlvbW11X2F0dHIgYXR0ciwgdm9pZCAqZGF0YSkK K3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgYXJtX3NtbXVfZG9tYWluICpzbW11X2RvbWFpbiA9 IHRvX3NtbXVfZG9tYWluKGRvbWFpbik7CisKKwlpZiAoZG9tYWluLT50eXBlICE9IElPTU1VX0RP TUFJTl9VTk1BTkFHRUQpCisJCXJldHVybiAtRUlOVkFMOworCisJbXV0ZXhfbG9jaygmc21tdV9k b21haW4tPmluaXRfbXV0ZXgpOworCisJc3dpdGNoIChhdHRyKSB7CisJY2FzZSBET01BSU5fQVRU Ul9ORVNUSU5HOgorCQlpZiAoc21tdV9kb21haW4tPnNtbXUpIHsKKwkJCXJldCA9IC1FUEVSTTsK KwkJCWdvdG8gb3V0X3VubG9jazsKKwkJfQorCisJCWlmICgqKGludCAqKWRhdGEpCisJCQlzbW11 X2RvbWFpbi0+c3RhZ2UgPSBBUk1fU01NVV9ET01BSU5fTkVTVEVEOworCQllbHNlCisJCQlzbW11 X2RvbWFpbi0+c3RhZ2UgPSBBUk1fU01NVV9ET01BSU5fUzE7CisKKwkJYnJlYWs7CisJZGVmYXVs dDoKKwkJcmV0ID0gLUVOT0RFVjsKKwl9CisKK291dF91bmxvY2s6CisJbXV0ZXhfdW5sb2NrKCZz bW11X2RvbWFpbi0+aW5pdF9tdXRleCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBh cm1fc21tdV9vZl94bGF0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBvZl9waGFuZGxlX2Fy Z3MgKmFyZ3MpCit7CisJcmV0dXJuIGlvbW11X2Z3c3BlY19hZGRfaWRzKGRldiwgYXJncy0+YXJn cywgMSk7Cit9CisKK3N0YXRpYyB2b2lkIGFybV9zbW11X2dldF9yZXN2X3JlZ2lvbnMoc3RydWN0 IGRldmljZSAqZGV2LAorCQkJCSAgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCit7CisJc3Ry dWN0IGlvbW11X3Jlc3ZfcmVnaW9uICpyZWdpb247CisJaW50IHByb3QgPSBJT01NVV9XUklURSB8 IElPTU1VX05PRVhFQyB8IElPTU1VX01NSU87CisKKwlyZWdpb24gPSBpb21tdV9hbGxvY19yZXN2 X3JlZ2lvbihNU0lfSU9WQV9CQVNFLCBNU0lfSU9WQV9MRU5HVEgsCisJCQkJCSBwcm90LCBJT01N VV9SRVNWX1NXX01TSSk7CisJaWYgKCFyZWdpb24pCisJCXJldHVybjsKKworCWxpc3RfYWRkX3Rh aWwoJnJlZ2lvbi0+bGlzdCwgaGVhZCk7CisKKwlpb21tdV9kbWFfZ2V0X3Jlc3ZfcmVnaW9ucyhk ZXYsIGhlYWQpOworfQorCitzdGF0aWMgdm9pZCBhcm1fc21tdV9wdXRfcmVzdl9yZWdpb25zKHN0 cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQorewor CXN0cnVjdCBpb21tdV9yZXN2X3JlZ2lvbiAqZW50cnksICpuZXh0OworCisJbGlzdF9mb3JfZWFj aF9lbnRyeV9zYWZlKGVudHJ5LCBuZXh0LCBoZWFkLCBsaXN0KQorCQlrZnJlZShlbnRyeSk7Cit9 CisKK3N0YXRpYyBzdHJ1Y3QgaW9tbXVfb3BzIGFybV9zbW11X29wcyA9IHsKKwkuY2FwYWJsZQkJ PSBhcm1fc21tdV9jYXBhYmxlLAorCS5kb21haW5fYWxsb2MJCT0gYXJtX3NtbXVfZG9tYWluX2Fs bG9jLAorCS5kb21haW5fZnJlZQkJPSBhcm1fc21tdV9kb21haW5fZnJlZSwKKwkuYXR0YWNoX2Rl dgkJPSBhcm1fc21tdV9hdHRhY2hfZGV2LAorCS5tYXAJCQk9IGFybV9zbW11X21hcCwKKwkudW5t YXAJCQk9IGFybV9zbW11X3VubWFwLAorCS5tYXBfc2cJCQk9IGRlZmF1bHRfaW9tbXVfbWFwX3Nn LAorCS5pb3ZhX3RvX3BoeXMJCT0gYXJtX3NtbXVfaW92YV90b19waHlzLAorCS5hZGRfZGV2aWNl CQk9IGFybV9zbW11X2FkZF9kZXZpY2UsCisJLnJlbW92ZV9kZXZpY2UJCT0gYXJtX3NtbXVfcmVt b3ZlX2RldmljZSwKKwkuZGV2aWNlX2dyb3VwCQk9IGFybV9zbW11X2RldmljZV9ncm91cCwKKwku ZG9tYWluX2dldF9hdHRyCT0gYXJtX3NtbXVfZG9tYWluX2dldF9hdHRyLAorCS5kb21haW5fc2V0 X2F0dHIJPSBhcm1fc21tdV9kb21haW5fc2V0X2F0dHIsCisJLm9mX3hsYXRlCQk9IGFybV9zbW11 X29mX3hsYXRlLAorCS5nZXRfcmVzdl9yZWdpb25zCT0gYXJtX3NtbXVfZ2V0X3Jlc3ZfcmVnaW9u cywKKwkucHV0X3Jlc3ZfcmVnaW9ucwk9IGFybV9zbW11X3B1dF9yZXN2X3JlZ2lvbnMsCisJLnBn c2l6ZV9iaXRtYXAJCT0gLTFVTCwgLyogUmVzdHJpY3RlZCBkdXJpbmcgZGV2aWNlIGF0dGFjaCAq LworfTsKKworLyogUHJvYmluZyBhbmQgaW5pdGlhbGlzYXRpb24gZnVuY3Rpb25zICovCitzdGF0 aWMgaW50IGFybV9zbW11X2luaXRfb25lX3F1ZXVlKHN0cnVjdCBhcm1fc21tdV9kZXZpY2UgKnNt bXUsCisJCQkJICAgc3RydWN0IGFybV9zbW11X3F1ZXVlICpxLAorCQkJCSAgIHVuc2lnbmVkIGxv bmcgcHJvZF9vZmYsCisJCQkJICAgdW5zaWduZWQgbG9uZyBjb25zX29mZiwKKwkJCQkgICBzaXpl X3QgZHdvcmRzKQoreworCXNpemVfdCBxc3ogPSAoKDEgPDwgcS0+bWF4X25fc2hpZnQpICogZHdv cmRzKSA8PCAzOworCisJcS0+YmFzZSA9IGRtYW1fYWxsb2NfY29oZXJlbnQoc21tdS0+ZGV2LCBx c3osICZxLT5iYXNlX2RtYSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFxLT5iYXNlKSB7CisJCWRldl9l cnIoc21tdS0+ZGV2LCAiZmFpbGVkIHRvIGFsbG9jYXRlIHF1ZXVlICgweCV6eCBieXRlcylcbiIs CisJCQlxc3opOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlxLT5wcm9kX3JlZwk9IGFybV9z bW11X3BhZ2UxX2ZpeHVwKHByb2Rfb2ZmLCBzbW11KTsKKwlxLT5jb25zX3JlZwk9IGFybV9zbW11 X3BhZ2UxX2ZpeHVwKGNvbnNfb2ZmLCBzbW11KTsKKwlxLT5lbnRfZHdvcmRzCT0gZHdvcmRzOwor CisJcS0+cV9iYXNlICA9IFFfQkFTRV9SV0E7CisJcS0+cV9iYXNlIHw9IHEtPmJhc2VfZG1hICYg UV9CQVNFX0FERFJfTUFTSyA8PCBRX0JBU0VfQUREUl9TSElGVDsKKwlxLT5xX2Jhc2UgfD0gKHEt Pm1heF9uX3NoaWZ0ICYgUV9CQVNFX0xPRzJTSVpFX01BU0spCisJCSAgICAgPDwgUV9CQVNFX0xP RzJTSVpFX1NISUZUOworCisJcS0+cHJvZCA9IHEtPmNvbnMgPSAwOworCXJldHVybiAwOworfQor CitzdGF0aWMgaW50IGFybV9zbW11X2luaXRfcXVldWVzKHN0cnVjdCBhcm1fc21tdV9kZXZpY2Ug KnNtbXUpCit7CisJaW50IHJldDsKKworCS8qIGNtZHEgKi8KKwlzcGluX2xvY2tfaW5pdCgmc21t dS0+Y21kcS5sb2NrKTsKKwlyZXQgPSBhcm1fc21tdV9pbml0X29uZV9xdWV1ZShzbW11LCAmc21t dS0+Y21kcS5xLCBBUk1fU01NVV9DTURRX1BST0QsCisJCQkJICAgICAgQVJNX1NNTVVfQ01EUV9D T05TLCBDTURRX0VOVF9EV09SRFMpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiBl dnRxICovCisJcmV0ID0gYXJtX3NtbXVfaW5pdF9vbmVfcXVldWUoc21tdSwgJnNtbXUtPmV2dHEu cSwgQVJNX1NNTVVfRVZUUV9QUk9ELAorCQkJCSAgICAgIEFSTV9TTU1VX0VWVFFfQ09OUywgRVZU UV9FTlRfRFdPUkRTKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogcHJpcSAqLwor CWlmICghKHNtbXUtPmZlYXR1cmVzICYgQVJNX1NNTVVfRkVBVF9QUkkpKQorCQlyZXR1cm4gMDsK KworCXJldHVybiBhcm1fc21tdV9pbml0X29uZV9xdWV1ZShzbW11LCAmc21tdS0+cHJpcS5xLCBB Uk1fU01NVV9QUklRX1BST0QsCisJCQkJICAgICAgIEFSTV9TTU1VX1BSSVFfQ09OUywgUFJJUV9F TlRfRFdPUkRTKTsKK30KKworc3RhdGljIGludCBhcm1fc21tdV9pbml0X2wxX3N0cnRhYihzdHJ1 Y3QgYXJtX3NtbXVfZGV2aWNlICpzbW11KQoreworCXVuc2lnbmVkIGludCBpOworCXN0cnVjdCBh cm1fc21tdV9zdHJ0YWJfY2ZnICpjZmcgPSAmc21tdS0+c3RydGFiX2NmZzsKKwlzaXplX3Qgc2l6 ZSA9IHNpemVvZigqY2ZnLT5sMV9kZXNjKSAqIGNmZy0+bnVtX2wxX2VudHM7CisJdm9pZCAqc3Ry dGFiID0gc21tdS0+c3RydGFiX2NmZy5zdHJ0YWI7CisKKwljZmctPmwxX2Rlc2MgPSBkZXZtX2t6 YWxsb2Moc21tdS0+ZGV2LCBzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNmZy0+bDFfZGVzYykg eworCQlkZXZfZXJyKHNtbXUtPmRldiwgImZhaWxlZCB0byBhbGxvY2F0ZSBsMSBzdHJlYW0gdGFi bGUgZGVzY1xuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBj ZmctPm51bV9sMV9lbnRzOyArK2kpIHsKKwkJYXJtX3NtbXVfd3JpdGVfc3RydGFiX2wxX2Rlc2Mo c3RydGFiLCAmY2ZnLT5sMV9kZXNjW2ldKTsKKwkJc3RydGFiICs9IFNUUlRBQl9MMV9ERVNDX0RX T1JEUyA8PCAzOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFybV9zbW11X2lu aXRfc3RydGFiXzJsdmwoc3RydWN0IGFybV9zbW11X2RldmljZSAqc21tdSkKK3sKKwl2b2lkICpz dHJ0YWI7CisJdTY0IHJlZzsKKwl1MzIgc2l6ZSwgbDFzaXplOworCXN0cnVjdCBhcm1fc21tdV9z dHJ0YWJfY2ZnICpjZmcgPSAmc21tdS0+c3RydGFiX2NmZzsKKworCS8qIENhbGN1bGF0ZSB0aGUg TDEgc2l6ZSwgY2FwcGVkIHRvIHRoZSBTSURTSVpFLiAqLworCXNpemUgPSBTVFJUQUJfTDFfU1pf U0hJRlQgLSAoaWxvZzIoU1RSVEFCX0wxX0RFU0NfRFdPUkRTKSArIDMpOworCXNpemUgPSBtaW4o c2l6ZSwgc21tdS0+c2lkX2JpdHMgLSBTVFJUQUJfU1BMSVQpOworCWNmZy0+bnVtX2wxX2VudHMg PSAxIDw8IHNpemU7CisKKwlzaXplICs9IFNUUlRBQl9TUExJVDsKKwlpZiAoc2l6ZSA8IHNtbXUt PnNpZF9iaXRzKQorCQlkZXZfd2FybihzbW11LT5kZXYsCisJCQkgIjItbGV2ZWwgc3RydGFiIG9u bHkgY292ZXJzICV1LyV1IGJpdHMgb2YgU0lEXG4iLAorCQkJIHNpemUsIHNtbXUtPnNpZF9iaXRz KTsKKworCWwxc2l6ZSA9IGNmZy0+bnVtX2wxX2VudHMgKiAoU1RSVEFCX0wxX0RFU0NfRFdPUkRT IDw8IDMpOworCXN0cnRhYiA9IGRtYW1fYWxsb2NfY29oZXJlbnQoc21tdS0+ZGV2LCBsMXNpemUs ICZjZmctPnN0cnRhYl9kbWEsCisJCQkJICAgICBHRlBfS0VSTkVMIHwgX19HRlBfWkVSTyk7CisJ aWYgKCFzdHJ0YWIpIHsKKwkJZGV2X2VycihzbW11LT5kZXYsCisJCQkiZmFpbGVkIHRvIGFsbG9j YXRlIGwxIHN0cmVhbSB0YWJsZSAoJXUgYnl0ZXMpXG4iLAorCQkJc2l6ZSk7CisJCXJldHVybiAt RU5PTUVNOworCX0KKwljZmctPnN0cnRhYiA9IHN0cnRhYjsKKworCS8qIENvbmZpZ3VyZSBzdHJ0 YWJfYmFzZV9jZmcgZm9yIDIgbGV2ZWxzICovCisJcmVnICA9IFNUUlRBQl9CQVNFX0NGR19GTVRf MkxWTDsKKwlyZWcgfD0gKHNpemUgJiBTVFJUQUJfQkFTRV9DRkdfTE9HMlNJWkVfTUFTSykKKwkJ PDwgU1RSVEFCX0JBU0VfQ0ZHX0xPRzJTSVpFX1NISUZUOworCXJlZyB8PSAoU1RSVEFCX1NQTElU ICYgU1RSVEFCX0JBU0VfQ0ZHX1NQTElUX01BU0spCisJCTw8IFNUUlRBQl9CQVNFX0NGR19TUExJ VF9TSElGVDsKKwljZmctPnN0cnRhYl9iYXNlX2NmZyA9IHJlZzsKKworCXJldHVybiBhcm1fc21t dV9pbml0X2wxX3N0cnRhYihzbW11KTsKK30KKworc3RhdGljIGludCBhcm1fc21tdV9pbml0X3N0 cnRhYl9saW5lYXIoc3RydWN0IGFybV9zbW11X2RldmljZSAqc21tdSkKK3sKKwl2b2lkICpzdHJ0 YWI7CisJdTY0IHJlZzsKKwl1MzIgc2l6ZTsKKwlzdHJ1Y3QgYXJtX3NtbXVfc3RydGFiX2NmZyAq Y2ZnID0gJnNtbXUtPnN0cnRhYl9jZmc7CisKKwlzaXplID0gKDEgPDwgc21tdS0+c2lkX2JpdHMp ICogKFNUUlRBQl9TVEVfRFdPUkRTIDw8IDMpOworCXN0cnRhYiA9IGRtYW1fYWxsb2NfY29oZXJl bnQoc21tdS0+ZGV2LCBzaXplLCAmY2ZnLT5zdHJ0YWJfZG1hLAorCQkJCSAgICAgR0ZQX0tFUk5F TCB8IF9fR0ZQX1pFUk8pOworCWlmICghc3RydGFiKSB7CisJCWRldl9lcnIoc21tdS0+ZGV2LAor CQkJImZhaWxlZCB0byBhbGxvY2F0ZSBsaW5lYXIgc3RyZWFtIHRhYmxlICgldSBieXRlcylcbiIs CisJCQlzaXplKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWNmZy0+c3RydGFiID0gc3RydGFi OworCWNmZy0+bnVtX2wxX2VudHMgPSAxIDw8IHNtbXUtPnNpZF9iaXRzOworCisJLyogQ29uZmln dXJlIHN0cnRhYl9iYXNlX2NmZyBmb3IgYSBsaW5lYXIgdGFibGUgY292ZXJpbmcgYWxsIFNJRHMg Ki8KKwlyZWcgID0gU1RSVEFCX0JBU0VfQ0ZHX0ZNVF9MSU5FQVI7CisJcmVnIHw9IChzbW11LT5z aWRfYml0cyAmIFNUUlRBQl9CQVNFX0NGR19MT0cyU0laRV9NQVNLKQorCQk8PCBTVFJUQUJfQkFT RV9DRkdfTE9HMlNJWkVfU0hJRlQ7CisJY2ZnLT5zdHJ0YWJfYmFzZV9jZmcgPSByZWc7CisKKwlh cm1fc21tdV9pbml0X2J5cGFzc19zdGVzKHN0cnRhYiwgY2ZnLT5udW1fbDFfZW50cyk7CisJcmV0 dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXJtX3NtbXVfaW5pdF9zdHJ0YWIoc3RydWN0IGFybV9z bW11X2RldmljZSAqc21tdSkKK3sKKwl1NjQgcmVnOworCWludCByZXQ7CisKKwlpZiAoc21tdS0+ ZmVhdHVyZXMgJiBBUk1fU01NVV9GRUFUXzJfTFZMX1NUUlRBQikKKwkJcmV0ID0gYXJtX3NtbXVf aW5pdF9zdHJ0YWJfMmx2bChzbW11KTsKKwllbHNlCisJCXJldCA9IGFybV9zbW11X2luaXRfc3Ry dGFiX2xpbmVhcihzbW11KTsKKworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiBTZXQg dGhlIHN0cnRhYiBiYXNlIGFkZHJlc3MgKi8KKwlyZWcgID0gc21tdS0+c3RydGFiX2NmZy5zdHJ0 YWJfZG1hICYKKwkgICAgICAgU1RSVEFCX0JBU0VfQUREUl9NQVNLIDw8IFNUUlRBQl9CQVNFX0FE RFJfU0hJRlQ7CisJcmVnIHw9IFNUUlRBQl9CQVNFX1JBOworCXNtbXUtPnN0cnRhYl9jZmcuc3Ry dGFiX2Jhc2UgPSByZWc7CisKKwkvKiBBbGxvY2F0ZSB0aGUgZmlyc3QgVk1JRCBmb3Igc3RhZ2Ut MiBieXBhc3MgU1RFcyAqLworCXNldF9iaXQoMCwgc21tdS0+dm1pZF9tYXApOworCXJldHVybiAw OworfQorCitzdGF0aWMgaW50IGFybV9zbW11X2luaXRfc3RydWN0dXJlcyhzdHJ1Y3QgYXJtX3Nt bXVfZGV2aWNlICpzbW11KQoreworCWludCByZXQ7CisKKwlyZXQgPSBhcm1fc21tdV9pbml0X3F1 ZXVlcyhzbW11KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIGFybV9zbW11 X2luaXRfc3RydGFiKHNtbXUpOworfQorCitzdGF0aWMgaW50IGFybV9zbW11X3dyaXRlX3JlZ19z eW5jKHN0cnVjdCBhcm1fc21tdV9kZXZpY2UgKnNtbXUsIHUzMiB2YWwsCisJCQkJICAgdW5zaWdu ZWQgaW50IHJlZ19vZmYsIHVuc2lnbmVkIGludCBhY2tfb2ZmKQoreworCXUzMiByZWc7CisKKwl3 cml0ZWxfcmVsYXhlZCh2YWwsIHNtbXUtPmJhc2UgKyByZWdfb2ZmKTsKKwlyZXR1cm4gcmVhZGxf cmVsYXhlZF9wb2xsX3RpbWVvdXQoc21tdS0+YmFzZSArIGFja19vZmYsIHJlZywgcmVnID09IHZh bCwKKwkJCQkJICAxLCBBUk1fU01NVV9QT0xMX1RJTUVPVVRfVVMpOworfQorCisvKiBHQlBBIGlz ICJzcGVjaWFsIiAqLworc3RhdGljIGludCBhcm1fc21tdV91cGRhdGVfZ2JwYShzdHJ1Y3QgYXJt X3NtbXVfZGV2aWNlICpzbW11LCB1MzIgc2V0LCB1MzIgY2xyKQoreworCWludCByZXQ7CisJdTMy IHJlZywgX19pb21lbSAqZ2JwYSA9IHNtbXUtPmJhc2UgKyBBUk1fU01NVV9HQlBBOworCisJcmV0 ID0gcmVhZGxfcmVsYXhlZF9wb2xsX3RpbWVvdXQoZ2JwYSwgcmVnLCAhKHJlZyAmIEdCUEFfVVBE QVRFKSwKKwkJCQkJIDEsIEFSTV9TTU1VX1BPTExfVElNRU9VVF9VUyk7CisJaWYgKHJldCkKKwkJ cmV0dXJuIHJldDsKKworCXJlZyAmPSB+Y2xyOworCXJlZyB8PSBzZXQ7CisJd3JpdGVsX3JlbGF4 ZWQocmVnIHwgR0JQQV9VUERBVEUsIGdicGEpOworCXJldHVybiByZWFkbF9yZWxheGVkX3BvbGxf dGltZW91dChnYnBhLCByZWcsICEocmVnICYgR0JQQV9VUERBVEUpLAorCQkJCQkgIDEsIEFSTV9T TU1VX1BPTExfVElNRU9VVF9VUyk7Cit9CisKK3N0YXRpYyB2b2lkIGFybV9zbW11X2ZyZWVfbXNp cyh2b2lkICpkYXRhKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGRhdGE7CisJcGxhdGZvcm1f bXNpX2RvbWFpbl9mcmVlX2lycXMoZGV2KTsKK30KKworc3RhdGljIHZvaWQgYXJtX3NtbXVfd3Jp dGVfbXNpX21zZyhzdHJ1Y3QgbXNpX2Rlc2MgKmRlc2MsIHN0cnVjdCBtc2lfbXNnICptc2cpCit7 CisJcGh5c19hZGRyX3QgZG9vcmJlbGw7CisJc3RydWN0IGRldmljZSAqZGV2ID0gbXNpX2Rlc2Nf dG9fZGV2KGRlc2MpOworCXN0cnVjdCBhcm1fc21tdV9kZXZpY2UgKnNtbXUgPSBkZXZfZ2V0X2Ry dmRhdGEoZGV2KTsKKwlwaHlzX2FkZHJfdCAqY2ZnID0gYXJtX3NtbXVfbXNpX2NmZ1tkZXNjLT5w bGF0Zm9ybS5tc2lfaW5kZXhdOworCisJZG9vcmJlbGwgPSAoKCh1NjQpbXNnLT5hZGRyZXNzX2hp KSA8PCAzMikgfCBtc2ctPmFkZHJlc3NfbG87CisJZG9vcmJlbGwgJj0gTVNJX0NGRzBfQUREUl9N QVNLIDw8IE1TSV9DRkcwX0FERFJfU0hJRlQ7CisKKwl3cml0ZXFfcmVsYXhlZChkb29yYmVsbCwg c21tdS0+YmFzZSArIGNmZ1swXSk7CisJd3JpdGVsX3JlbGF4ZWQobXNnLT5kYXRhLCBzbW11LT5i YXNlICsgY2ZnWzFdKTsKKwl3cml0ZWxfcmVsYXhlZChNU0lfQ0ZHMl9NRU1BVFRSX0RFVklDRV9u R25SRSwgc21tdS0+YmFzZSArIGNmZ1syXSk7Cit9CisKK3N0YXRpYyB2b2lkIGFybV9zbW11X3Nl dHVwX21zaXMoc3RydWN0IGFybV9zbW11X2RldmljZSAqc21tdSkKK3sKKwlzdHJ1Y3QgbXNpX2Rl c2MgKmRlc2M7CisJaW50IHJldCwgbnZlYyA9IEFSTV9TTU1VX01BWF9NU0lTOworCXN0cnVjdCBk ZXZpY2UgKmRldiA9IHNtbXUtPmRldjsKKworCS8qIENsZWFyIHRoZSBNU0kgYWRkcmVzcyByZWdz ICovCisJd3JpdGVxX3JlbGF4ZWQoMCwgc21tdS0+YmFzZSArIEFSTV9TTU1VX0dFUlJPUl9JUlFf Q0ZHMCk7CisJd3JpdGVxX3JlbGF4ZWQoMCwgc21tdS0+YmFzZSArIEFSTV9TTU1VX0VWVFFfSVJR X0NGRzApOworCisJaWYgKHNtbXUtPmZlYXR1cmVzICYgQVJNX1NNTVVfRkVBVF9QUkkpCisJCXdy aXRlcV9yZWxheGVkKDAsIHNtbXUtPmJhc2UgKyBBUk1fU01NVV9QUklRX0lSUV9DRkcwKTsKKwll bHNlCisJCW52ZWMtLTsKKworCWlmICghKHNtbXUtPmZlYXR1cmVzICYgQVJNX1NNTVVfRkVBVF9N U0kpKQorCQlyZXR1cm47CisKKwkvKiBBbGxvY2F0ZSBNU0lzIGZvciBldnRxLCBnZXJyb3IgYW5k IHByaXEuIElnbm9yZSBjbWRxICovCisJcmV0ID0gcGxhdGZvcm1fbXNpX2RvbWFpbl9hbGxvY19p cnFzKGRldiwgbnZlYywgYXJtX3NtbXVfd3JpdGVfbXNpX21zZyk7CisJaWYgKHJldCkgeworCQlk ZXZfd2FybihkZXYsICJmYWlsZWQgdG8gYWxsb2NhdGUgTVNJc1xuIik7CisJCXJldHVybjsKKwl9 CisKKwlmb3JfZWFjaF9tc2lfZW50cnkoZGVzYywgZGV2KSB7CisJCXN3aXRjaCAoZGVzYy0+cGxh dGZvcm0ubXNpX2luZGV4KSB7CisJCWNhc2UgRVZUUV9NU0lfSU5ERVg6CisJCQlzbW11LT5ldnRx LnEuaXJxID0gZGVzYy0+aXJxOworCQkJYnJlYWs7CisJCWNhc2UgR0VSUk9SX01TSV9JTkRFWDoK KwkJCXNtbXUtPmdlcnJfaXJxID0gZGVzYy0+aXJxOworCQkJYnJlYWs7CisJCWNhc2UgUFJJUV9N U0lfSU5ERVg6CisJCQlzbW11LT5wcmlxLnEuaXJxID0gZGVzYy0+aXJxOworCQkJYnJlYWs7CisJ CWRlZmF1bHQ6CS8qIFVua25vd24gKi8KKwkJCWNvbnRpbnVlOworCQl9CisJfQorCisJLyogQWRk IGNhbGxiYWNrIHRvIGZyZWUgTVNJcyBvbiB0ZWFyZG93biAqLworCWRldm1fYWRkX2FjdGlvbihk ZXYsIGFybV9zbW11X2ZyZWVfbXNpcywgZGV2KTsKK30KKworc3RhdGljIHZvaWQgYXJtX3NtbXVf c2V0dXBfdW5pcXVlX2lycXMoc3RydWN0IGFybV9zbW11X2RldmljZSAqc21tdSkKK3sKKwlpbnQg aXJxLCByZXQ7CisKKwlhcm1fc21tdV9zZXR1cF9tc2lzKHNtbXUpOworCisJLyogUmVxdWVzdCBp bnRlcnJ1cHQgbGluZXMgKi8KKwlpcnEgPSBzbW11LT5ldnRxLnEuaXJxOworCWlmIChpcnEpIHsK KwkJcmV0ID0gZGV2bV9yZXF1ZXN0X3RocmVhZGVkX2lycShzbW11LT5kZXYsIGlycSwgTlVMTCwK KwkJCQkJCWFybV9zbW11X2V2dHFfdGhyZWFkLAorCQkJCQkJSVJRRl9PTkVTSE9ULAorCQkJCQkJ ImFybS1zbW11LXYzLWV2dHEiLCBzbW11KTsKKwkJaWYgKHJldCA8IDApCisJCQlkZXZfd2Fybihz bW11LT5kZXYsICJmYWlsZWQgdG8gZW5hYmxlIGV2dHEgaXJxXG4iKTsKKwl9CisKKwlpcnEgPSBz bW11LT5jbWRxLnEuaXJxOworCWlmIChpcnEpIHsKKwkJcmV0ID0gZGV2bV9yZXF1ZXN0X2lycShz bW11LT5kZXYsIGlycSwKKwkJCQkgICAgICAgYXJtX3NtbXVfY21kcV9zeW5jX2hhbmRsZXIsIDAs CisJCQkJICAgICAgICJhcm0tc21tdS12My1jbWRxLXN5bmMiLCBzbW11KTsKKwkJaWYgKHJldCA8 IDApCisJCQlkZXZfd2FybihzbW11LT5kZXYsICJmYWlsZWQgdG8gZW5hYmxlIGNtZHEtc3luYyBp cnFcbiIpOworCX0KKworCWlycSA9IHNtbXUtPmdlcnJfaXJxOworCWlmIChpcnEpIHsKKwkJcmV0 ID0gZGV2bV9yZXF1ZXN0X2lycShzbW11LT5kZXYsIGlycSwgYXJtX3NtbXVfZ2Vycm9yX2hhbmRs ZXIsCisJCQkJICAgICAgIDAsICJhcm0tc21tdS12My1nZXJyb3IiLCBzbW11KTsKKwkJaWYgKHJl dCA8IDApCisJCQlkZXZfd2FybihzbW11LT5kZXYsICJmYWlsZWQgdG8gZW5hYmxlIGdlcnJvciBp cnFcbiIpOworCX0KKworCWlmIChzbW11LT5mZWF0dXJlcyAmIEFSTV9TTU1VX0ZFQVRfUFJJKSB7 CisJCWlycSA9IHNtbXUtPnByaXEucS5pcnE7CisJCWlmIChpcnEpIHsKKwkJCXJldCA9IGRldm1f cmVxdWVzdF90aHJlYWRlZF9pcnEoc21tdS0+ZGV2LCBpcnEsIE5VTEwsCisJCQkJCQkJYXJtX3Nt bXVfcHJpcV90aHJlYWQsCisJCQkJCQkJSVJRRl9PTkVTSE9ULAorCQkJCQkJCSJhcm0tc21tdS12 My1wcmlxIiwKKwkJCQkJCQlzbW11KTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCWRldl93YXJuKHNt bXUtPmRldiwKKwkJCQkJICJmYWlsZWQgdG8gZW5hYmxlIHByaXEgaXJxXG4iKTsKKwkJfQorCX0K K30KKworc3RhdGljIGludCBhcm1fc21tdV9zZXR1cF9pcnFzKHN0cnVjdCBhcm1fc21tdV9kZXZp Y2UgKnNtbXUpCit7CisJaW50IHJldCwgaXJxOworCXUzMiBpcnFlbl9mbGFncyA9IElSUV9DVFJM X0VWVFFfSVJRRU4gfCBJUlFfQ1RSTF9HRVJST1JfSVJRRU47CisKKwkvKiBEaXNhYmxlIElSUXMg Zmlyc3QgKi8KKwlyZXQgPSBhcm1fc21tdV93cml0ZV9yZWdfc3luYyhzbW11LCAwLCBBUk1fU01N VV9JUlFfQ1RSTCwKKwkJCQkgICAgICBBUk1fU01NVV9JUlFfQ1RSTEFDSyk7CisJaWYgKHJldCkg eworCQlkZXZfZXJyKHNtbXUtPmRldiwgImZhaWxlZCB0byBkaXNhYmxlIGlycXNcbiIpOworCQly ZXR1cm4gcmV0OworCX0KKworCWlycSA9IHNtbXUtPmNvbWJpbmVkX2lycTsKKwlpZiAoaXJxKSB7 CisJCS8qCisJCSAqIENhdml1bSBUaHVuZGVyWDIgaW1wbGVtZW50YXRpb24gZG9lc24ndCBub3Qg c3VwcG9ydCB1bmlxdWUKKwkJICogaXJxIGxpbmVzLiBVc2Ugc2luZ2xlIGlycSBsaW5lIGZvciBh bGwgdGhlIFNNTVV2MyBpbnRlcnJ1cHRzLgorCQkgKi8KKwkJcmV0ID0gZGV2bV9yZXF1ZXN0X3Ro cmVhZGVkX2lycShzbW11LT5kZXYsIGlycSwKKwkJCQkJYXJtX3NtbXVfY29tYmluZWRfaXJxX2hh bmRsZXIsCisJCQkJCWFybV9zbW11X2NvbWJpbmVkX2lycV90aHJlYWQsCisJCQkJCUlSUUZfT05F U0hPVCwKKwkJCQkJImFybS1zbW11LXYzLWNvbWJpbmVkLWlycSIsIHNtbXUpOworCQlpZiAocmV0 IDwgMCkKKwkJCWRldl93YXJuKHNtbXUtPmRldiwgImZhaWxlZCB0byBlbmFibGUgY29tYmluZWQg aXJxXG4iKTsKKwl9IGVsc2UKKwkJYXJtX3NtbXVfc2V0dXBfdW5pcXVlX2lycXMoc21tdSk7CisK KwlpZiAoc21tdS0+ZmVhdHVyZXMgJiBBUk1fU01NVV9GRUFUX1BSSSkKKwkJaXJxZW5fZmxhZ3Mg fD0gSVJRX0NUUkxfUFJJUV9JUlFFTjsKKworCS8qIEVuYWJsZSBpbnRlcnJ1cHQgZ2VuZXJhdGlv biBvbiB0aGUgU01NVSAqLworCXJldCA9IGFybV9zbW11X3dyaXRlX3JlZ19zeW5jKHNtbXUsIGly cWVuX2ZsYWdzLAorCQkJCSAgICAgIEFSTV9TTU1VX0lSUV9DVFJMLCBBUk1fU01NVV9JUlFfQ1RS TEFDSyk7CisJaWYgKHJldCkKKwkJZGV2X3dhcm4oc21tdS0+ZGV2LCAiZmFpbGVkIHRvIGVuYWJs ZSBpcnFzXG4iKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFybV9zbW11X2Rldmlj ZV9kaXNhYmxlKHN0cnVjdCBhcm1fc21tdV9kZXZpY2UgKnNtbXUpCit7CisJaW50IHJldDsKKwor CXJldCA9IGFybV9zbW11X3dyaXRlX3JlZ19zeW5jKHNtbXUsIDAsIEFSTV9TTU1VX0NSMCwgQVJN X1NNTVVfQ1IwQUNLKTsKKwlpZiAocmV0KQorCQlkZXZfZXJyKHNtbXUtPmRldiwgImZhaWxlZCB0 byBjbGVhciBjcjBcbiIpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhcm1fc21t dV9kZXZpY2VfcmVzZXQoc3RydWN0IGFybV9zbW11X2RldmljZSAqc21tdSwgYm9vbCBieXBhc3Mp Cit7CisJaW50IHJldDsKKwl1MzIgcmVnLCBlbmFibGVzOworCXN0cnVjdCBhcm1fc21tdV9jbWRx X2VudCBjbWQ7CisKKwkvKiBDbGVhciBDUjAgYW5kIHN5bmMgKGRpc2FibGVzIFNNTVUgYW5kIHF1 ZXVlIHByb2Nlc3NpbmcpICovCisJcmVnID0gcmVhZGxfcmVsYXhlZChzbW11LT5iYXNlICsgQVJN X1NNTVVfQ1IwKTsKKwlpZiAocmVnICYgQ1IwX1NNTVVFTikKKwkJZGV2X3dhcm4oc21tdS0+ZGV2 LCAiU01NVSBjdXJyZW50bHkgZW5hYmxlZCEgUmVzZXR0aW5nLi4uXG4iKTsKKworCXJldCA9IGFy bV9zbW11X2RldmljZV9kaXNhYmxlKHNtbXUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisK KwkvKiBDUjEgKHRhYmxlIGFuZCBxdWV1ZSBtZW1vcnkgYXR0cmlidXRlcykgKi8KKwlyZWcgPSAo Q1IxX1NIX0lTSCA8PCBDUjFfVEFCTEVfU0hfU0hJRlQpIHwKKwkgICAgICAoQ1IxX0NBQ0hFX1dC IDw8IENSMV9UQUJMRV9PQ19TSElGVCkgfAorCSAgICAgIChDUjFfQ0FDSEVfV0IgPDwgQ1IxX1RB QkxFX0lDX1NISUZUKSB8CisJICAgICAgKENSMV9TSF9JU0ggPDwgQ1IxX1FVRVVFX1NIX1NISUZU KSB8CisJICAgICAgKENSMV9DQUNIRV9XQiA8PCBDUjFfUVVFVUVfT0NfU0hJRlQpIHwKKwkgICAg ICAoQ1IxX0NBQ0hFX1dCIDw8IENSMV9RVUVVRV9JQ19TSElGVCk7CisJd3JpdGVsX3JlbGF4ZWQo cmVnLCBzbW11LT5iYXNlICsgQVJNX1NNTVVfQ1IxKTsKKworCS8qIENSMiAocmFuZG9tIGNyYXAp ICovCisJcmVnID0gQ1IyX1BUTSB8IENSMl9SRUNJTlZTSUQgfCBDUjJfRTJIOworCXdyaXRlbF9y ZWxheGVkKHJlZywgc21tdS0+YmFzZSArIEFSTV9TTU1VX0NSMik7CisKKwkvKiBTdHJlYW0gdGFi bGUgKi8KKwl3cml0ZXFfcmVsYXhlZChzbW11LT5zdHJ0YWJfY2ZnLnN0cnRhYl9iYXNlLAorCQkg ICAgICAgc21tdS0+YmFzZSArIEFSTV9TTU1VX1NUUlRBQl9CQVNFKTsKKwl3cml0ZWxfcmVsYXhl ZChzbW11LT5zdHJ0YWJfY2ZnLnN0cnRhYl9iYXNlX2NmZywKKwkJICAgICAgIHNtbXUtPmJhc2Ug KyBBUk1fU01NVV9TVFJUQUJfQkFTRV9DRkcpOworCisJLyogQ29tbWFuZCBxdWV1ZSAqLworCXdy aXRlcV9yZWxheGVkKHNtbXUtPmNtZHEucS5xX2Jhc2UsIHNtbXUtPmJhc2UgKyBBUk1fU01NVV9D TURRX0JBU0UpOworCXdyaXRlbF9yZWxheGVkKHNtbXUtPmNtZHEucS5wcm9kLCBzbW11LT5iYXNl ICsgQVJNX1NNTVVfQ01EUV9QUk9EKTsKKwl3cml0ZWxfcmVsYXhlZChzbW11LT5jbWRxLnEuY29u cywgc21tdS0+YmFzZSArIEFSTV9TTU1VX0NNRFFfQ09OUyk7CisKKwllbmFibGVzID0gQ1IwX0NN RFFFTjsKKwlyZXQgPSBhcm1fc21tdV93cml0ZV9yZWdfc3luYyhzbW11LCBlbmFibGVzLCBBUk1f U01NVV9DUjAsCisJCQkJICAgICAgQVJNX1NNTVVfQ1IwQUNLKTsKKwlpZiAocmV0KSB7CisJCWRl dl9lcnIoc21tdS0+ZGV2LCAiZmFpbGVkIHRvIGVuYWJsZSBjb21tYW5kIHF1ZXVlXG4iKTsKKwkJ cmV0dXJuIHJldDsKKwl9CisKKwkvKiBJbnZhbGlkYXRlIGFueSBjYWNoZWQgY29uZmlndXJhdGlv biAqLworCWNtZC5vcGNvZGUgPSBDTURRX09QX0NGR0lfQUxMOworCWFybV9zbW11X2NtZHFfaXNz dWVfY21kKHNtbXUsICZjbWQpOworCWNtZC5vcGNvZGUgPSBDTURRX09QX0NNRF9TWU5DOworCWFy bV9zbW11X2NtZHFfaXNzdWVfY21kKHNtbXUsICZjbWQpOworCisJLyogSW52YWxpZGF0ZSBhbnkg c3RhbGUgVExCIGVudHJpZXMgKi8KKwlpZiAoc21tdS0+ZmVhdHVyZXMgJiBBUk1fU01NVV9GRUFU X0hZUCkgeworCQljbWQub3Bjb2RlID0gQ01EUV9PUF9UTEJJX0VMMl9BTEw7CisJCWFybV9zbW11 X2NtZHFfaXNzdWVfY21kKHNtbXUsICZjbWQpOworCX0KKworCWNtZC5vcGNvZGUgPSBDTURRX09Q X1RMQklfTlNOSF9BTEw7CisJYXJtX3NtbXVfY21kcV9pc3N1ZV9jbWQoc21tdSwgJmNtZCk7CisJ Y21kLm9wY29kZSA9IENNRFFfT1BfQ01EX1NZTkM7CisJYXJtX3NtbXVfY21kcV9pc3N1ZV9jbWQo c21tdSwgJmNtZCk7CisKKwkvKiBFdmVudCBxdWV1ZSAqLworCXdyaXRlcV9yZWxheGVkKHNtbXUt PmV2dHEucS5xX2Jhc2UsIHNtbXUtPmJhc2UgKyBBUk1fU01NVV9FVlRRX0JBU0UpOworCXdyaXRl bF9yZWxheGVkKHNtbXUtPmV2dHEucS5wcm9kLAorCQkgICAgICAgYXJtX3NtbXVfcGFnZTFfZml4 dXAoQVJNX1NNTVVfRVZUUV9QUk9ELCBzbW11KSk7CisJd3JpdGVsX3JlbGF4ZWQoc21tdS0+ZXZ0 cS5xLmNvbnMsCisJCSAgICAgICBhcm1fc21tdV9wYWdlMV9maXh1cChBUk1fU01NVV9FVlRRX0NP TlMsIHNtbXUpKTsKKworCWVuYWJsZXMgfD0gQ1IwX0VWVFFFTjsKKwlyZXQgPSBhcm1fc21tdV93 cml0ZV9yZWdfc3luYyhzbW11LCBlbmFibGVzLCBBUk1fU01NVV9DUjAsCisJCQkJICAgICAgQVJN X1NNTVVfQ1IwQUNLKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoc21tdS0+ZGV2LCAiZmFpbGVk IHRvIGVuYWJsZSBldmVudCBxdWV1ZVxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogUFJJ IHF1ZXVlICovCisJaWYgKHNtbXUtPmZlYXR1cmVzICYgQVJNX1NNTVVfRkVBVF9QUkkpIHsKKwkJ d3JpdGVxX3JlbGF4ZWQoc21tdS0+cHJpcS5xLnFfYmFzZSwKKwkJCSAgICAgICBzbW11LT5iYXNl ICsgQVJNX1NNTVVfUFJJUV9CQVNFKTsKKwkJd3JpdGVsX3JlbGF4ZWQoc21tdS0+cHJpcS5xLnBy b2QsCisJCQkgICAgICAgYXJtX3NtbXVfcGFnZTFfZml4dXAoQVJNX1NNTVVfUFJJUV9QUk9ELCBz bW11KSk7CisJCXdyaXRlbF9yZWxheGVkKHNtbXUtPnByaXEucS5jb25zLAorCQkJICAgICAgIGFy bV9zbW11X3BhZ2UxX2ZpeHVwKEFSTV9TTU1VX1BSSVFfQ09OUywgc21tdSkpOworCisJCWVuYWJs ZXMgfD0gQ1IwX1BSSVFFTjsKKwkJcmV0ID0gYXJtX3NtbXVfd3JpdGVfcmVnX3N5bmMoc21tdSwg ZW5hYmxlcywgQVJNX1NNTVVfQ1IwLAorCQkJCQkgICAgICBBUk1fU01NVV9DUjBBQ0spOworCQlp ZiAocmV0KSB7CisJCQlkZXZfZXJyKHNtbXUtPmRldiwgImZhaWxlZCB0byBlbmFibGUgUFJJIHF1 ZXVlXG4iKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwlyZXQgPSBhcm1fc21tdV9zZXR1 cF9pcnFzKHNtbXUpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihzbW11LT5kZXYsICJmYWlsZWQg dG8gc2V0dXAgaXJxc1xuIik7CisJCXJldHVybiByZXQ7CisJfQorCisKKwkvKiBFbmFibGUgdGhl IFNNTVUgaW50ZXJmYWNlLCBvciBlbnN1cmUgYnlwYXNzICovCisJaWYgKCFieXBhc3MgfHwgZGlz YWJsZV9ieXBhc3MpIHsKKwkJZW5hYmxlcyB8PSBDUjBfU01NVUVOOworCX0gZWxzZSB7CisJCXJl dCA9IGFybV9zbW11X3VwZGF0ZV9nYnBhKHNtbXUsIDAsIEdCUEFfQUJPUlQpOworCQlpZiAocmV0 KSB7CisJCQlkZXZfZXJyKHNtbXUtPmRldiwgIkdCUEEgbm90IHJlc3BvbmRpbmcgdG8gdXBkYXRl XG4iKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisJcmV0ID0gYXJtX3NtbXVfd3JpdGVfcmVn X3N5bmMoc21tdSwgZW5hYmxlcywgQVJNX1NNTVVfQ1IwLAorCQkJCSAgICAgIEFSTV9TTU1VX0NS MEFDSyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKHNtbXUtPmRldiwgImZhaWxlZCB0byBlbmFi bGUgU01NVSBpbnRlcmZhY2VcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOwor fQorCitzdGF0aWMgaW50IGFybV9zbW11X2RldmljZV9od19wcm9iZShzdHJ1Y3QgYXJtX3NtbXVf ZGV2aWNlICpzbW11KQoreworCXUzMiByZWc7CisJYm9vbCBjb2hlcmVudCA9IHNtbXUtPmZlYXR1 cmVzICYgQVJNX1NNTVVfRkVBVF9DT0hFUkVOQ1k7CisKKwkvKiBJRFIwICovCisJcmVnID0gcmVh ZGxfcmVsYXhlZChzbW11LT5iYXNlICsgQVJNX1NNTVVfSURSMCk7CisKKwkvKiAyLWxldmVsIHN0 cnVjdHVyZXMgKi8KKwlpZiAoKHJlZyAmIElEUjBfU1RfTFZMX01BU0sgPDwgSURSMF9TVF9MVkxf U0hJRlQpID09IElEUjBfU1RfTFZMXzJMVkwpCisJCXNtbXUtPmZlYXR1cmVzIHw9IEFSTV9TTU1V X0ZFQVRfMl9MVkxfU1RSVEFCOworCisJaWYgKHJlZyAmIElEUjBfQ0QyTCkKKwkJc21tdS0+ZmVh dHVyZXMgfD0gQVJNX1NNTVVfRkVBVF8yX0xWTF9DRFRBQjsKKworCS8qCisJICogVHJhbnNsYXRp b24gdGFibGUgZW5kaWFubmVzcy4KKwkgKiBXZSBjdXJyZW50bHkgcmVxdWlyZSB0aGUgc2FtZSBl bmRpYW5uZXNzIGFzIHRoZSBDUFUsIGJ1dCB0aGlzCisJICogY291bGQgYmUgY2hhbmdlZCBsYXRl ciBieSBhZGRpbmcgYSBuZXcgSU9fUEdUQUJMRV9RVUlSSy4KKwkgKi8KKwlzd2l0Y2ggKHJlZyAm IElEUjBfVFRFTkRJQU5fTUFTSyA8PCBJRFIwX1RURU5ESUFOX1NISUZUKSB7CisJY2FzZSBJRFIw X1RURU5ESUFOX01JWEVEOgorCQlzbW11LT5mZWF0dXJlcyB8PSBBUk1fU01NVV9GRUFUX1RUX0xF IHwgQVJNX1NNTVVfRkVBVF9UVF9CRTsKKwkJYnJlYWs7CisjaWZkZWYgX19CSUdfRU5ESUFOCisJ Y2FzZSBJRFIwX1RURU5ESUFOX0JFOgorCQlzbW11LT5mZWF0dXJlcyB8PSBBUk1fU01NVV9GRUFU X1RUX0JFOworCQlicmVhazsKKyNlbHNlCisJY2FzZSBJRFIwX1RURU5ESUFOX0xFOgorCQlzbW11 LT5mZWF0dXJlcyB8PSBBUk1fU01NVV9GRUFUX1RUX0xFOworCQlicmVhazsKKyNlbmRpZgorCWRl ZmF1bHQ6CisJCWRldl9lcnIoc21tdS0+ZGV2LCAidW5rbm93bi91bnN1cHBvcnRlZCBUVCBlbmRp YW5uZXNzIVxuIik7CisJCXJldHVybiAtRU5YSU87CisJfQorCisJLyogQm9vbGVhbiBmZWF0dXJl IGZsYWdzICovCisJaWYgKElTX0VOQUJMRUQoQ09ORklHX1BDSV9QUkkpICYmIHJlZyAmIElEUjBf UFJJKQorCQlzbW11LT5mZWF0dXJlcyB8PSBBUk1fU01NVV9GRUFUX1BSSTsKKworCWlmIChJU19F TkFCTEVEKENPTkZJR19QQ0lfQVRTKSAmJiByZWcgJiBJRFIwX0FUUykKKwkJc21tdS0+ZmVhdHVy ZXMgfD0gQVJNX1NNTVVfRkVBVF9BVFM7CisKKwlpZiAocmVnICYgSURSMF9TRVYpCisJCXNtbXUt PmZlYXR1cmVzIHw9IEFSTV9TTU1VX0ZFQVRfU0VWOworCisJaWYgKHJlZyAmIElEUjBfTVNJKQor CQlzbW11LT5mZWF0dXJlcyB8PSBBUk1fU01NVV9GRUFUX01TSTsKKworCWlmIChyZWcgJiBJRFIw X0hZUCkKKwkJc21tdS0+ZmVhdHVyZXMgfD0gQVJNX1NNTVVfRkVBVF9IWVA7CisKKwkvKgorCSAq IFRoZSBjb2hlcmVuY3kgZmVhdHVyZSBhcyBzZXQgYnkgRlcgaXMgdXNlZCBpbiBwcmVmZXJlbmNl IHRvIHRoZSBJRAorCSAqIHJlZ2lzdGVyLCBidXQgd2FybiBvbiBtaXNtYXRjaC4KKwkgKi8KKwlp ZiAoISEocmVnICYgSURSMF9DT0hBQ0MpICE9IGNvaGVyZW50KQorCQlkZXZfd2FybihzbW11LT5k ZXYsICJJRFIwLkNPSEFDQyBvdmVycmlkZGVuIGJ5IGRtYS1jb2hlcmVudCBwcm9wZXJ0eSAoJXMp XG4iLAorCQkJIGNvaGVyZW50ID8gInRydWUiIDogImZhbHNlIik7CisKKwlzd2l0Y2ggKHJlZyAm IElEUjBfU1RBTExfTU9ERUxfTUFTSyA8PCBJRFIwX1NUQUxMX01PREVMX1NISUZUKSB7CisJY2Fz ZSBJRFIwX1NUQUxMX01PREVMX1NUQUxMOgorCQkvKiBGYWxsdGhyb3VnaCAqLworCWNhc2UgSURS MF9TVEFMTF9NT0RFTF9GT1JDRToKKwkJc21tdS0+ZmVhdHVyZXMgfD0gQVJNX1NNTVVfRkVBVF9T VEFMTFM7CisJfQorCisJaWYgKHJlZyAmIElEUjBfUzFQKQorCQlzbW11LT5mZWF0dXJlcyB8PSBB Uk1fU01NVV9GRUFUX1RSQU5TX1MxOworCisJaWYgKHJlZyAmIElEUjBfUzJQKQorCQlzbW11LT5m ZWF0dXJlcyB8PSBBUk1fU01NVV9GRUFUX1RSQU5TX1MyOworCisJaWYgKCEocmVnICYgKElEUjBf UzFQIHwgSURSMF9TMlApKSkgeworCQlkZXZfZXJyKHNtbXUtPmRldiwgIm5vIHRyYW5zbGF0aW9u IHN1cHBvcnQhXG4iKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwkvKiBXZSBvbmx5IHN1cHBv cnQgdGhlIEFBcmNoNjQgdGFibGUgZm9ybWF0IGF0IHByZXNlbnQgKi8KKwlzd2l0Y2ggKHJlZyAm IElEUjBfVFRGX01BU0sgPDwgSURSMF9UVEZfU0hJRlQpIHsKKwljYXNlIElEUjBfVFRGX0FBUkNI MzJfNjQ6CisJCXNtbXUtPmlhcyA9IDQwOworCQkvKiBGYWxsdGhyb3VnaCAqLworCWNhc2UgSURS MF9UVEZfQUFSQ0g2NDoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2VycihzbW11LT5kZXYs ICJBQXJjaDY0IHRhYmxlIGZvcm1hdCBub3Qgc3VwcG9ydGVkIVxuIik7CisJCXJldHVybiAtRU5Y SU87CisJfQorCisJLyogQVNJRC9WTUlEIHNpemVzICovCisJc21tdS0+YXNpZF9iaXRzID0gcmVn ICYgSURSMF9BU0lEMTYgPyAxNiA6IDg7CisJc21tdS0+dm1pZF9iaXRzID0gcmVnICYgSURSMF9W TUlEMTYgPyAxNiA6IDg7CisKKwkvKiBJRFIxICovCisJcmVnID0gcmVhZGxfcmVsYXhlZChzbW11 LT5iYXNlICsgQVJNX1NNTVVfSURSMSk7CisJaWYgKHJlZyAmIChJRFIxX1RBQkxFU19QUkVTRVQg fCBJRFIxX1FVRVVFU19QUkVTRVQgfCBJRFIxX1JFTCkpIHsKKwkJZGV2X2VycihzbW11LT5kZXYs ICJlbWJlZGRlZCBpbXBsZW1lbnRhdGlvbiBub3Qgc3VwcG9ydGVkXG4iKTsKKwkJcmV0dXJuIC1F TlhJTzsKKwl9CisKKwkvKiBRdWV1ZSBzaXplcywgY2FwcGVkIGF0IDRrICovCisJc21tdS0+Y21k cS5xLm1heF9uX3NoaWZ0ID0gbWluKCh1MzIpQ01EUV9NQVhfU1pfU0hJRlQsCisJCQkJICAgICAg IHJlZyA+PiBJRFIxX0NNRFFfU0hJRlQgJiBJRFIxX0NNRFFfTUFTSyk7CisJaWYgKCFzbW11LT5j bWRxLnEubWF4X25fc2hpZnQpIHsKKwkJLyogT2RkIGFsaWdubWVudCByZXN0cmljdGlvbnMgb24g dGhlIGJhc2UsIHNvIGlnbm9yZSBmb3Igbm93ICovCisJCWRldl9lcnIoc21tdS0+ZGV2LCAidW5p dC1sZW5ndGggY29tbWFuZCBxdWV1ZSBub3Qgc3VwcG9ydGVkXG4iKTsKKwkJcmV0dXJuIC1FTlhJ TzsKKwl9CisKKwlzbW11LT5ldnRxLnEubWF4X25fc2hpZnQgPSBtaW4oKHUzMilFVlRRX01BWF9T Wl9TSElGVCwKKwkJCQkgICAgICAgcmVnID4+IElEUjFfRVZUUV9TSElGVCAmIElEUjFfRVZUUV9N QVNLKTsKKwlzbW11LT5wcmlxLnEubWF4X25fc2hpZnQgPSBtaW4oKHUzMilQUklRX01BWF9TWl9T SElGVCwKKwkJCQkgICAgICAgcmVnID4+IElEUjFfUFJJUV9TSElGVCAmIElEUjFfUFJJUV9NQVNL KTsKKworCS8qIFNJRC9TU0lEIHNpemVzICovCisJc21tdS0+c3NpZF9iaXRzID0gcmVnID4+IElE UjFfU1NJRF9TSElGVCAmIElEUjFfU1NJRF9NQVNLOworCXNtbXUtPnNpZF9iaXRzID0gcmVnID4+ IElEUjFfU0lEX1NISUZUICYgSURSMV9TSURfTUFTSzsKKworCS8qCisJICogSWYgdGhlIFNNTVUg c3VwcG9ydHMgZmV3ZXIgYml0cyB0aGFuIHdvdWxkIGZpbGwgYSBzaW5nbGUgTDIgc3RyZWFtCisJ ICogdGFibGUsIHVzZSBhIGxpbmVhciB0YWJsZSBpbnN0ZWFkLgorCSAqLworCWlmIChzbW11LT5z aWRfYml0cyA8PSBTVFJUQUJfU1BMSVQpCisJCXNtbXUtPmZlYXR1cmVzICY9IH5BUk1fU01NVV9G RUFUXzJfTFZMX1NUUlRBQjsKKworCS8qIElEUjUgKi8KKwlyZWcgPSByZWFkbF9yZWxheGVkKHNt bXUtPmJhc2UgKyBBUk1fU01NVV9JRFI1KTsKKworCS8qIE1heGltdW0gbnVtYmVyIG9mIG91dHN0 YW5kaW5nIHN0YWxscyAqLworCXNtbXUtPmV2dHEubWF4X3N0YWxscyA9IHJlZyA+PiBJRFI1X1NU QUxMX01BWF9TSElGVAorCQkJCSYgSURSNV9TVEFMTF9NQVhfTUFTSzsKKworCS8qIFBhZ2Ugc2l6 ZXMgKi8KKwlpZiAocmVnICYgSURSNV9HUkFONjRLKQorCQlzbW11LT5wZ3NpemVfYml0bWFwIHw9 IFNaXzY0SyB8IFNaXzUxMk07CisJaWYgKHJlZyAmIElEUjVfR1JBTjE2SykKKwkJc21tdS0+cGdz aXplX2JpdG1hcCB8PSBTWl8xNksgfCBTWl8zMk07CisJaWYgKHJlZyAmIElEUjVfR1JBTjRLKQor CQlzbW11LT5wZ3NpemVfYml0bWFwIHw9IFNaXzRLIHwgU1pfMk0gfCBTWl8xRzsKKworCWlmIChh cm1fc21tdV9vcHMucGdzaXplX2JpdG1hcCA9PSAtMVVMKQorCQlhcm1fc21tdV9vcHMucGdzaXpl X2JpdG1hcCA9IHNtbXUtPnBnc2l6ZV9iaXRtYXA7CisJZWxzZQorCQlhcm1fc21tdV9vcHMucGdz aXplX2JpdG1hcCB8PSBzbW11LT5wZ3NpemVfYml0bWFwOworCisJLyogT3V0cHV0IGFkZHJlc3Mg c2l6ZSAqLworCXN3aXRjaCAocmVnICYgSURSNV9PQVNfTUFTSyA8PCBJRFI1X09BU19TSElGVCkg eworCWNhc2UgSURSNV9PQVNfMzJfQklUOgorCQlzbW11LT5vYXMgPSAzMjsKKwkJYnJlYWs7CisJ Y2FzZSBJRFI1X09BU18zNl9CSVQ6CisJCXNtbXUtPm9hcyA9IDM2OworCQlicmVhazsKKwljYXNl IElEUjVfT0FTXzQwX0JJVDoKKwkJc21tdS0+b2FzID0gNDA7CisJCWJyZWFrOworCWNhc2UgSURS NV9PQVNfNDJfQklUOgorCQlzbW11LT5vYXMgPSA0MjsKKwkJYnJlYWs7CisJY2FzZSBJRFI1X09B U180NF9CSVQ6CisJCXNtbXUtPm9hcyA9IDQ0OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZf aW5mbyhzbW11LT5kZXYsCisJCQkidW5rbm93biBvdXRwdXQgYWRkcmVzcyBzaXplLiBUcnVuY2F0 aW5nIHRvIDQ4LWJpdFxuIik7CisJCS8qIEZhbGx0aHJvdWdoICovCisJY2FzZSBJRFI1X09BU180 OF9CSVQ6CisJCXNtbXUtPm9hcyA9IDQ4OworCX0KKworCS8qIFNldCB0aGUgRE1BIG1hc2sgZm9y IG91ciB0YWJsZSB3YWxrZXIgKi8KKwlpZiAoZG1hX3NldF9tYXNrX2FuZF9jb2hlcmVudChzbW11 LT5kZXYsIERNQV9CSVRfTUFTSyhzbW11LT5vYXMpKSkKKwkJZGV2X3dhcm4oc21tdS0+ZGV2LAor CQkJICJmYWlsZWQgdG8gc2V0IERNQSBtYXNrIGZvciB0YWJsZSB3YWxrZXJcbiIpOworCisJc21t dS0+aWFzID0gbWF4KHNtbXUtPmlhcywgc21tdS0+b2FzKTsKKworCWRldl9pbmZvKHNtbXUtPmRl diwgImlhcyAlbHUtYml0LCBvYXMgJWx1LWJpdCAoZmVhdHVyZXMgMHglMDh4KVxuIiwKKwkJIHNt bXUtPmlhcywgc21tdS0+b2FzLCBzbW11LT5mZWF0dXJlcyk7CisJcmV0dXJuIDA7Cit9CisKKyNp ZmRlZiBDT05GSUdfQUNQSQorc3RhdGljIHZvaWQgYWNwaV9zbW11X2dldF9vcHRpb25zKHUzMiBt b2RlbCwgc3RydWN0IGFybV9zbW11X2RldmljZSAqc21tdSkKK3sKKwlzd2l0Y2ggKG1vZGVsKSB7 CisJY2FzZSBBQ1BJX0lPUlRfU01NVV9WM19DQVZJVU1fQ045OVhYOgorCQlzbW11LT5vcHRpb25z IHw9IEFSTV9TTU1VX09QVF9QQUdFMF9SRUdTX09OTFk7CisJCWJyZWFrOworCWNhc2UgQUNQSV9J T1JUX1NNTVVfSElTSUxJQ09OX0hJMTYxWDoKKwkJc21tdS0+b3B0aW9ucyB8PSBBUk1fU01NVV9P UFRfU0tJUF9QUkVGRVRDSDsKKwkJYnJlYWs7CisJfQorCisJZGV2X25vdGljZShzbW11LT5kZXYs ICJvcHRpb24gbWFzayAweCV4XG4iLCBzbW11LT5vcHRpb25zKTsKK30KKworc3RhdGljIGludCBh cm1fc21tdV9kZXZpY2VfYWNwaV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAor CQkJCSAgICAgIHN0cnVjdCBhcm1fc21tdV9kZXZpY2UgKnNtbXUpCit7CisJc3RydWN0IGFjcGlf aW9ydF9zbW11X3YzICppb3J0X3NtbXU7CisJc3RydWN0IGRldmljZSAqZGV2ID0gc21tdS0+ZGV2 OworCXN0cnVjdCBhY3BpX2lvcnRfbm9kZSAqbm9kZTsKKworCW5vZGUgPSAqKHN0cnVjdCBhY3Bp X2lvcnRfbm9kZSAqKilkZXZfZ2V0X3BsYXRkYXRhKGRldik7CisKKwkvKiBSZXRyaWV2ZSBTTU1V djMgc3BlY2lmaWMgZGF0YSAqLworCWlvcnRfc21tdSA9IChzdHJ1Y3QgYWNwaV9pb3J0X3NtbXVf djMgKilub2RlLT5ub2RlX2RhdGE7CisKKwlhY3BpX3NtbXVfZ2V0X29wdGlvbnMoaW9ydF9zbW11 LT5tb2RlbCwgc21tdSk7CisKKwlpZiAoaW9ydF9zbW11LT5mbGFncyAmIEFDUElfSU9SVF9TTU1V X1YzX0NPSEFDQ19PVkVSUklERSkKKwkJc21tdS0+ZmVhdHVyZXMgfD0gQVJNX1NNTVVfRkVBVF9D T0hFUkVOQ1k7CisKKwlyZXR1cm4gMDsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBhcm1f c21tdV9kZXZpY2VfYWNwaV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCQkJ CQkgICAgIHN0cnVjdCBhcm1fc21tdV9kZXZpY2UgKnNtbXUpCit7CisJcmV0dXJuIC1FTk9ERVY7 Cit9CisjZW5kaWYKKworc3RhdGljIGludCBhcm1fc21tdV9kZXZpY2VfZHRfcHJvYmUoc3RydWN0 IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJCQkgICAgc3RydWN0IGFybV9zbW11X2RldmljZSAq c21tdSkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCXUzMiBjZWxsczsK KwlpbnQgcmV0ID0gLUVJTlZBTDsKKworCWlmIChvZl9wcm9wZXJ0eV9yZWFkX3UzMihkZXYtPm9m X25vZGUsICIjaW9tbXUtY2VsbHMiLCAmY2VsbHMpKQorCQlkZXZfZXJyKGRldiwgIm1pc3Npbmcg I2lvbW11LWNlbGxzIHByb3BlcnR5XG4iKTsKKwllbHNlIGlmIChjZWxscyAhPSAxKQorCQlkZXZf ZXJyKGRldiwgImludmFsaWQgI2lvbW11LWNlbGxzIHZhbHVlICglZClcbiIsIGNlbGxzKTsKKwll bHNlCisJCXJldCA9IDA7CisKKwlwYXJzZV9kcml2ZXJfb3B0aW9ucyhzbW11KTsKKworCWlmIChv Zl9kbWFfaXNfY29oZXJlbnQoZGV2LT5vZl9ub2RlKSkKKwkJc21tdS0+ZmVhdHVyZXMgfD0gQVJN X1NNTVVfRkVBVF9DT0hFUkVOQ1k7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdW5zaWdu ZWQgbG9uZyBhcm1fc21tdV9yZXNvdXJjZV9zaXplKHN0cnVjdCBhcm1fc21tdV9kZXZpY2UgKnNt bXUpCit7CisJaWYgKHNtbXUtPm9wdGlvbnMgJiBBUk1fU01NVV9PUFRfUEFHRTBfUkVHU19PTkxZ KQorCQlyZXR1cm4gU1pfNjRLOworCWVsc2UKKwkJcmV0dXJuIFNaXzEyOEs7Cit9CisKK3N0YXRp YyBpbnQgYXJtX3NtbXVfZGV2aWNlX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYp Cit7CisJaW50IGlycSwgcmV0OworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCXJlc291cmNlX3Np emVfdCBpb2FkZHI7CisJc3RydWN0IGFybV9zbW11X2RldmljZSAqc21tdTsKKwlzdHJ1Y3QgZGV2 aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCWJvb2wgYnlwYXNzOworCisJc21tdSA9IGRldm1fa3ph bGxvYyhkZXYsIHNpemVvZigqc21tdSksIEdGUF9LRVJORUwpOworCWlmICghc21tdSkgeworCQlk ZXZfZXJyKGRldiwgImZhaWxlZCB0byBhbGxvY2F0ZSBhcm1fc21tdV9kZXZpY2VcbiIpOworCQly ZXR1cm4gLUVOT01FTTsKKwl9CisJc21tdS0+ZGV2ID0gZGV2OworCisJaWYgKGRldi0+b2Zfbm9k ZSkgeworCQlyZXQgPSBhcm1fc21tdV9kZXZpY2VfZHRfcHJvYmUocGRldiwgc21tdSk7CisJfSBl bHNlIHsKKwkJcmV0ID0gYXJtX3NtbXVfZGV2aWNlX2FjcGlfcHJvYmUocGRldiwgc21tdSk7CisJ CWlmIChyZXQgPT0gLUVOT0RFVikKKwkJCXJldHVybiByZXQ7CisJfQorCisJLyogU2V0IGJ5cGFz cyBtb2RlIGFjY29yZGluZyB0byBmaXJtd2FyZSBwcm9iaW5nIHJlc3VsdCAqLworCWJ5cGFzcyA9 ICEhcmV0OworCisJLyogQmFzZSBhZGRyZXNzICovCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291 cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAocmVzb3VyY2Vfc2l6ZShyZXMpICsg MSA8IGFybV9zbW11X3Jlc291cmNlX3NpemUoc21tdSkpIHsKKwkJZGV2X2VycihkZXYsICJNTUlP IHJlZ2lvbiB0b28gc21hbGwgKCVwcilcbiIsIHJlcyk7CisJCXJldHVybiAtRUlOVkFMOworCX0K Kwlpb2FkZHIgPSByZXMtPnN0YXJ0OworCisJc21tdS0+YmFzZSA9IGRldm1faW9yZW1hcF9yZXNv dXJjZShkZXYsIHJlcyk7CisJaWYgKElTX0VSUihzbW11LT5iYXNlKSkKKwkJcmV0dXJuIFBUUl9F UlIoc21tdS0+YmFzZSk7CisKKwkvKiBJbnRlcnJ1cHQgbGluZXMgKi8KKworCWlycSA9IHBsYXRm b3JtX2dldF9pcnFfYnluYW1lKHBkZXYsICJjb21iaW5lZCIpOworCWlmIChpcnEgPiAwKQorCQlz bW11LT5jb21iaW5lZF9pcnEgPSBpcnE7CisJZWxzZSB7CisJCWlycSA9IHBsYXRmb3JtX2dldF9p cnFfYnluYW1lKHBkZXYsICJldmVudHEiKTsKKwkJaWYgKGlycSA+IDApCisJCQlzbW11LT5ldnRx LnEuaXJxID0gaXJxOworCisJCWlycSA9IHBsYXRmb3JtX2dldF9pcnFfYnluYW1lKHBkZXYsICJw cmlxIik7CisJCWlmIChpcnEgPiAwKQorCQkJc21tdS0+cHJpcS5xLmlycSA9IGlycTsKKworCQlp cnEgPSBwbGF0Zm9ybV9nZXRfaXJxX2J5bmFtZShwZGV2LCAiY21kcS1zeW5jIik7CisJCWlmIChp cnEgPiAwKQorCQkJc21tdS0+Y21kcS5xLmlycSA9IGlycTsKKworCQlpcnEgPSBwbGF0Zm9ybV9n ZXRfaXJxX2J5bmFtZShwZGV2LCAiZ2Vycm9yIik7CisJCWlmIChpcnEgPiAwKQorCQkJc21tdS0+ Z2Vycl9pcnEgPSBpcnE7CisJfQorCS8qIFByb2JlIHRoZSBoL3cgKi8KKwlyZXQgPSBhcm1fc21t dV9kZXZpY2VfaHdfcHJvYmUoc21tdSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8q IEluaXRpYWxpc2UgaW4tbWVtb3J5IGRhdGEgc3RydWN0dXJlcyAqLworCXJldCA9IGFybV9zbW11 X2luaXRfc3RydWN0dXJlcyhzbW11KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyog UmVjb3JkIG91ciBwcml2YXRlIGRldmljZSBzdHJ1Y3R1cmUgKi8KKwlwbGF0Zm9ybV9zZXRfZHJ2 ZGF0YShwZGV2LCBzbW11KTsKKworCS8qIFJlc2V0IHRoZSBkZXZpY2UgKi8KKwlyZXQgPSBhcm1f c21tdV9kZXZpY2VfcmVzZXQoc21tdSwgYnlwYXNzKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0 OworCisJLyogQW5kIHdlJ3JlIHVwLiBHbyBnbyBnbyEgKi8KKwlyZXQgPSBpb21tdV9kZXZpY2Vf c3lzZnNfYWRkKCZzbW11LT5pb21tdSwgZGV2LCBOVUxMLAorCQkJCSAgICAgInNtbXUzLiVwYSIs ICZpb2FkZHIpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpb21tdV9kZXZpY2Vfc2V0 X29wcygmc21tdS0+aW9tbXUsICZhcm1fc21tdV9vcHMpOworCWlvbW11X2RldmljZV9zZXRfZndu b2RlKCZzbW11LT5pb21tdSwgZGV2LT5md25vZGUpOworCisJcmV0ID0gaW9tbXVfZGV2aWNlX3Jl Z2lzdGVyKCZzbW11LT5pb21tdSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgIkZhaWxl ZCB0byByZWdpc3RlciBpb21tdVxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisjaWZkZWYgQ09O RklHX1BDSQorCWlmIChwY2lfYnVzX3R5cGUuaW9tbXVfb3BzICE9ICZhcm1fc21tdV9vcHMpIHsK KwkJcGNpX3JlcXVlc3RfYWNzKCk7CisJCXJldCA9IGJ1c19zZXRfaW9tbXUoJnBjaV9idXNfdHlw ZSwgJmFybV9zbW11X29wcyk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKyNlbmRp ZgorI2lmZGVmIENPTkZJR19BUk1fQU1CQQorCWlmIChhbWJhX2J1c3R5cGUuaW9tbXVfb3BzICE9 ICZhcm1fc21tdV9vcHMpIHsKKwkJcmV0ID0gYnVzX3NldF9pb21tdSgmYW1iYV9idXN0eXBlLCAm YXJtX3NtbXVfb3BzKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorI2VuZGlmCisJ aWYgKHBsYXRmb3JtX2J1c190eXBlLmlvbW11X29wcyAhPSAmYXJtX3NtbXVfb3BzKSB7CisJCXJl dCA9IGJ1c19zZXRfaW9tbXUoJnBsYXRmb3JtX2J1c190eXBlLCAmYXJtX3NtbXVfb3BzKTsKKwkJ aWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50 IGFybV9zbW11X2RldmljZV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sK KwlzdHJ1Y3QgYXJtX3NtbXVfZGV2aWNlICpzbW11ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRl dik7CisKKwlhcm1fc21tdV9kZXZpY2VfZGlzYWJsZShzbW11KTsKKworCXJldHVybiAwOworfQor CitzdGF0aWMgdm9pZCBhcm1fc21tdV9kZXZpY2Vfc2h1dGRvd24oc3RydWN0IHBsYXRmb3JtX2Rl dmljZSAqcGRldikKK3sKKwlhcm1fc21tdV9kZXZpY2VfcmVtb3ZlKHBkZXYpOworfQorCitzdGF0 aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBhcm1fc21tdV9vZl9tYXRjaFtdID0geworCXsg LmNvbXBhdGlibGUgPSAiYXJtLHNtbXUtdjMiLCB9LAorCXsgfSwKK307CitNT0RVTEVfREVWSUNF X1RBQkxFKG9mLCBhcm1fc21tdV9vZl9tYXRjaCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1f ZHJpdmVyIGFybV9zbW11X2RyaXZlciA9IHsKKwkuZHJpdmVyCT0geworCQkubmFtZQkJPSAiYXJt LXNtbXUtdjMiLAorCQkub2ZfbWF0Y2hfdGFibGUJPSBvZl9tYXRjaF9wdHIoYXJtX3NtbXVfb2Zf bWF0Y2gpLAorCX0sCisJLnByb2JlCT0gYXJtX3NtbXVfZGV2aWNlX3Byb2JlLAorCS5yZW1vdmUJ PSBhcm1fc21tdV9kZXZpY2VfcmVtb3ZlLAorCS5zaHV0ZG93biA9IGFybV9zbW11X2RldmljZV9z aHV0ZG93biwKK307Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGFybV9zbW11X2RyaXZlcik7CisK K0lPTU1VX09GX0RFQ0xBUkUoYXJtX3NtbXV2MywgImFybSxzbW11LXYzIiwgTlVMTCk7CisKK01P RFVMRV9ERVNDUklQVElPTigiSU9NTVUgQVBJIGZvciBBUk0gYXJjaGl0ZWN0ZWQgU01NVXYzIGlt cGxlbWVudGF0aW9ucyIpOworTU9EVUxFX0FVVEhPUigiV2lsbCBEZWFjb24gPHdpbGwuZGVhY29u QGFybS5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7Ci0tIAoyLjE3LjAKCgpfX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpYZW4tZGV2ZWwgbWFp bGluZyBsaXN0Clhlbi1kZXZlbEBsaXN0cy54ZW5wcm9qZWN0Lm9yZwpodHRwczovL2xpc3RzLnhl bnByb2plY3Qub3JnL21haWxtYW4vbGlzdGluZm8veGVuLWRldmVs