From mboxrd@z Thu Jan 1 00:00:00 1970 From: Oleksandr Tyshchenko Subject: [RFC PATCH v1 3/7] iommu/arm: ipmmu-vmsa: Add io-pgtables support Date: Wed, 26 Jul 2017 18:10:00 +0300 Message-ID: <1501081804-4882-4-git-send-email-olekstysh@gmail.com> References: <1501081804-4882-1-git-send-email-olekstysh@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail6.bemta6.messagelabs.com ([193.109.254.103]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1daNxA-0008OW-Eb for xen-devel@lists.xenproject.org; Wed, 26 Jul 2017 15:10:24 +0000 Received: by mail-lf0-f65.google.com with SMTP id d80so5183717lfg.1 for ; Wed, 26 Jul 2017 08:10:22 -0700 (PDT) In-Reply-To: <1501081804-4882-1-git-send-email-olekstysh@gmail.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" To: xen-devel@lists.xenproject.org Cc: Oleksandr Tyshchenko , Julien Grall , Stefano Stabellini List-Id: xen-devel@lists.xenproject.org RnJvbTogT2xla3NhbmRyIFR5c2hjaGVua28gPG9sZWtzYW5kcl90eXNoY2hlbmtvQGVwYW0uY29t PgoKVGhlIExpbnV4IElQTU1VIGRyaXZlciB3aGljaCBpcyBiZWluZyBwb3J0ZWQgdG8gWGVuIHJl bGllcyBvbiB0aGlzCkxpbnV4IGZyYW1ld29yay4gTW9yZW92ZXIsIGFzIHRoZSBJUE1NVSBpcyBh IG5vbi1zaGFyZWQgSU9NTVUKd2UgbXVzdCBoYXZlIGEgd2F5IG9mIG1hbmlwdWxhdGluZyBpdCdz IHBhZ2UgdGFibGUuCgpTbywgY29weSBpdCBhcyBpcyBmb3Igbm93IHRvIHNpbXBsaWZ5IHRoaW5n cywgYnV0IHdlIHdpbGwgaGF2ZSB0byBmaW5kCmNvbW1vbiBncm91bmQgYWJvdXQgaG93IHRoaXMg c3R1ZmYgc2hvdWxkIGxvb2sgbGlrZS4KClNpZ25lZC1vZmYtYnk6IE9sZWtzYW5kciBUeXNoY2hl bmtvIDxvbGVrc2FuZHJfdHlzaGNoZW5rb0BlcGFtLmNvbT4KQ0M6IEp1bGllbiBHcmFsbCA8anVs aWVuLmdyYWxsQGFybS5jb20+CkNDOiBTdGVmYW5vIFN0YWJlbGxpbmkgPHNzdGFiZWxsaW5pQGtl cm5lbC5vcmc+Ci0tLQogeGVuL2RyaXZlcnMvcGFzc3Rocm91Z2gvYXJtL2lvLXBndGFibGUtYXJt LmMgfCAxMDg0ICsrKysrKysrKysrKysrKysrKysrKysrKysrCiB4ZW4vZHJpdmVycy9wYXNzdGhy b3VnaC9hcm0vaW8tcGd0YWJsZS5jICAgICB8ICAgNzkgKysKIHhlbi9kcml2ZXJzL3Bhc3N0aHJv dWdoL2FybS9pby1wZ3RhYmxlLmggICAgIHwgIDIwOCArKysrKwogMyBmaWxlcyBjaGFuZ2VkLCAx MzcxIGluc2VydGlvbnMoKykKIGNyZWF0ZSBtb2RlIDEwMDY0NCB4ZW4vZHJpdmVycy9wYXNzdGhy b3VnaC9hcm0vaW8tcGd0YWJsZS1hcm0uYwogY3JlYXRlIG1vZGUgMTAwNjQ0IHhlbi9kcml2ZXJz L3Bhc3N0aHJvdWdoL2FybS9pby1wZ3RhYmxlLmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCB4ZW4vZHJp dmVycy9wYXNzdGhyb3VnaC9hcm0vaW8tcGd0YWJsZS5oCgpkaWZmIC0tZ2l0IGEveGVuL2RyaXZl cnMvcGFzc3Rocm91Z2gvYXJtL2lvLXBndGFibGUtYXJtLmMgYi94ZW4vZHJpdmVycy9wYXNzdGhy b3VnaC9hcm0vaW8tcGd0YWJsZS1hcm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAw MDAwLi5mNWM5MGUxCi0tLSAvZGV2L251bGwKKysrIGIveGVuL2RyaXZlcnMvcGFzc3Rocm91Z2gv YXJtL2lvLXBndGFibGUtYXJtLmMKQEAgLTAsMCArMSwxMDg0IEBACisvKgorICogQ1BVLWFnbm9z dGljIEFSTSBwYWdlIHRhYmxlIGFsbG9jYXRvci4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJl ZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQg dW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9u IDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoK KyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwg YmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhl IGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBB IFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNl bnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEg Y29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhp cyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+Lgor ICoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBBUk0gTGltaXRlZAorICoKKyAqIEF1dGhvcjogV2ls bCBEZWFjb24gPHdpbGwuZGVhY29uQGFybS5jb20+CisgKi8KKworI2RlZmluZSBwcl9mbXQoZm10 KQkiYXJtLWxwYWUgaW8tcGd0YWJsZTogIiBmbXQKKworI2luY2x1ZGUgPGxpbnV4L2lvbW11Lmg+ CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2l6ZXMuaD4KKyNp bmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRl IDxsaW51eC9kbWEtbWFwcGluZy5oPgorCisjaW5jbHVkZSA8YXNtL2JhcnJpZXIuaD4KKworI2lu Y2x1ZGUgImlvLXBndGFibGUuaCIKKworI2RlZmluZSBBUk1fTFBBRV9NQVhfQUREUl9CSVRTCQk0 OAorI2RlZmluZSBBUk1fTFBBRV9TMl9NQVhfQ09OQ0FUX1BBR0VTCTE2CisjZGVmaW5lIEFSTV9M UEFFX01BWF9MRVZFTFMJCTQKKworLyogU3RydWN0IGFjY2Vzc29ycyAqLworI2RlZmluZSBpb19w Z3RhYmxlX3RvX2RhdGEoeCkJCQkJCQlcCisJY29udGFpbmVyX29mKCh4KSwgc3RydWN0IGFybV9s cGFlX2lvX3BndGFibGUsIGlvcCkKKworI2RlZmluZSBpb19wZ3RhYmxlX29wc190b19kYXRhKHgp CQkJCQlcCisJaW9fcGd0YWJsZV90b19kYXRhKGlvX3BndGFibGVfb3BzX3RvX3BndGFibGUoeCkp CisKKy8qCisgKiBGb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgYXJjaGl0ZWN0dXJlLCB3ZSBhbHdh eXMgY29uc2lkZXIKKyAqIEFSTV9MUEFFX01BWF9MRVZFTFMgbGV2ZWxzLCB3aXRoIHRoZSB3YWxr IHN0YXJ0aW5nIGF0IGxldmVsIG4gPj0wCisgKi8KKyNkZWZpbmUgQVJNX0xQQUVfU1RBUlRfTFZM KGQpCQkoQVJNX0xQQUVfTUFYX0xFVkVMUyAtIChkKS0+bGV2ZWxzKQorCisvKgorICogQ2FsY3Vs YXRlIHRoZSByaWdodCBzaGlmdCBhbW91bnQgdG8gZ2V0IHRvIHRoZSBwb3J0aW9uIGRlc2NyaWJp bmcgbGV2ZWwgbAorICogaW4gYSB2aXJ0dWFsIGFkZHJlc3MgbWFwcGVkIGJ5IHRoZSBwYWdldGFi bGUgaW4gZC4KKyAqLworI2RlZmluZSBBUk1fTFBBRV9MVkxfU0hJRlQobCxkKQkJCQkJCVwKKwko KCgoZCktPmxldmVscyAtICgobCkgLSBBUk1fTFBBRV9TVEFSVF9MVkwoZCkgKyAxKSkJCVwKKwkg ICogKGQpLT5iaXRzX3Blcl9sZXZlbCkgKyAoZCktPnBnX3NoaWZ0KQorCisjZGVmaW5lIEFSTV9M UEFFX0dSQU5VTEUoZCkJCSgxVUwgPDwgKGQpLT5wZ19zaGlmdCkKKworI2RlZmluZSBBUk1fTFBB RV9QQUdFU19QRVJfUEdEKGQpCQkJCQlcCisJRElWX1JPVU5EX1VQKChkKS0+cGdkX3NpemUsIEFS TV9MUEFFX0dSQU5VTEUoZCkpCisKKy8qCisgKiBDYWxjdWxhdGUgdGhlIGluZGV4IGF0IGxldmVs IGwgdXNlZCB0byBtYXAgdmlydHVhbCBhZGRyZXNzIGEgdXNpbmcgdGhlCisgKiBwYWdldGFibGUg aW4gZC4KKyAqLworI2RlZmluZSBBUk1fTFBBRV9QR0RfSURYKGwsZCkJCQkJCQlcCisJKChsKSA9 PSBBUk1fTFBBRV9TVEFSVF9MVkwoZCkgPyBpbG9nMihBUk1fTFBBRV9QQUdFU19QRVJfUEdEKGQp KSA6IDApCisKKyNkZWZpbmUgQVJNX0xQQUVfTFZMX0lEWChhLGwsZCkJCQkJCQlcCisJKCgodTY0 KShhKSA+PiBBUk1fTFBBRV9MVkxfU0hJRlQobCxkKSkgJgkJCVwKKwkgKCgxIDw8ICgoZCktPmJp dHNfcGVyX2xldmVsICsgQVJNX0xQQUVfUEdEX0lEWChsLGQpKSkgLSAxKSkKKworLyogQ2FsY3Vs YXRlIHRoZSBibG9jay9wYWdlIG1hcHBpbmcgc2l6ZSBhdCBsZXZlbCBsIGZvciBwYWdldGFibGUg aW4gZC4gKi8KKyNkZWZpbmUgQVJNX0xQQUVfQkxPQ0tfU0laRShsLGQpCQkJCQlcCisJKDEgPDwg KGlsb2cyKHNpemVvZihhcm1fbHBhZV9pb3B0ZSkpICsJCQkJXAorCQkoKEFSTV9MUEFFX01BWF9M RVZFTFMgLSAobCkpICogKGQpLT5iaXRzX3Blcl9sZXZlbCkpKQorCisvKiBQYWdlIHRhYmxlIGJp dHMgKi8KKyNkZWZpbmUgQVJNX0xQQUVfUFRFX1RZUEVfU0hJRlQJCTAKKyNkZWZpbmUgQVJNX0xQ QUVfUFRFX1RZUEVfTUFTSwkJMHgzCisKKyNkZWZpbmUgQVJNX0xQQUVfUFRFX1RZUEVfQkxPQ0sJ CTEKKyNkZWZpbmUgQVJNX0xQQUVfUFRFX1RZUEVfVEFCTEUJCTMKKyNkZWZpbmUgQVJNX0xQQUVf UFRFX1RZUEVfUEFHRQkJMworCisjZGVmaW5lIEFSTV9MUEFFX1BURV9OU1RBQkxFCQkoKChhcm1f bHBhZV9pb3B0ZSkxKSA8PCA2MykKKyNkZWZpbmUgQVJNX0xQQUVfUFRFX1hOCQkJKCgoYXJtX2xw YWVfaW9wdGUpMykgPDwgNTMpCisjZGVmaW5lIEFSTV9MUEFFX1BURV9BRgkJCSgoKGFybV9scGFl X2lvcHRlKTEpIDw8IDEwKQorI2RlZmluZSBBUk1fTFBBRV9QVEVfU0hfTlMJCSgoKGFybV9scGFl X2lvcHRlKTApIDw8IDgpCisjZGVmaW5lIEFSTV9MUEFFX1BURV9TSF9PUwkJKCgoYXJtX2xwYWVf aW9wdGUpMikgPDwgOCkKKyNkZWZpbmUgQVJNX0xQQUVfUFRFX1NIX0lTCQkoKChhcm1fbHBhZV9p b3B0ZSkzKSA8PCA4KQorI2RlZmluZSBBUk1fTFBBRV9QVEVfTlMJCQkoKChhcm1fbHBhZV9pb3B0 ZSkxKSA8PCA1KQorI2RlZmluZSBBUk1fTFBBRV9QVEVfVkFMSUQJCSgoKGFybV9scGFlX2lvcHRl KTEpIDw8IDApCisKKyNkZWZpbmUgQVJNX0xQQUVfUFRFX0FUVFJfTE9fTUFTSwkoKChhcm1fbHBh ZV9pb3B0ZSkweDNmZikgPDwgMikKKy8qIElnbm9yZSB0aGUgY29udGlndW91cyBiaXQgZm9yIGJs b2NrIHNwbGl0dGluZyAqLworI2RlZmluZSBBUk1fTFBBRV9QVEVfQVRUUl9ISV9NQVNLCSgoKGFy bV9scGFlX2lvcHRlKTYpIDw8IDUyKQorI2RlZmluZSBBUk1fTFBBRV9QVEVfQVRUUl9NQVNLCQko QVJNX0xQQUVfUFRFX0FUVFJfTE9fTUFTSyB8CVwKKwkJCQkJIEFSTV9MUEFFX1BURV9BVFRSX0hJ X01BU0spCisKKy8qIFN0YWdlLTEgUFRFICovCisjZGVmaW5lIEFSTV9MUEFFX1BURV9BUF9VTlBS SVYJCSgoKGFybV9scGFlX2lvcHRlKTEpIDw8IDYpCisjZGVmaW5lIEFSTV9MUEFFX1BURV9BUF9S RE9OTFkJCSgoKGFybV9scGFlX2lvcHRlKTIpIDw8IDYpCisjZGVmaW5lIEFSTV9MUEFFX1BURV9B VFRSSU5EWF9TSElGVAkyCisjZGVmaW5lIEFSTV9MUEFFX1BURV9uRwkJCSgoKGFybV9scGFlX2lv cHRlKTEpIDw8IDExKQorCisvKiBTdGFnZS0yIFBURSAqLworI2RlZmluZSBBUk1fTFBBRV9QVEVf SEFQX0ZBVUxUCQkoKChhcm1fbHBhZV9pb3B0ZSkwKSA8PCA2KQorI2RlZmluZSBBUk1fTFBBRV9Q VEVfSEFQX1JFQUQJCSgoKGFybV9scGFlX2lvcHRlKTEpIDw8IDYpCisjZGVmaW5lIEFSTV9MUEFF X1BURV9IQVBfV1JJVEUJCSgoKGFybV9scGFlX2lvcHRlKTIpIDw8IDYpCisjZGVmaW5lIEFSTV9M UEFFX1BURV9NRU1BVFRSX09JV0IJKCgoYXJtX2xwYWVfaW9wdGUpMHhmKSA8PCAyKQorI2RlZmlu ZSBBUk1fTFBBRV9QVEVfTUVNQVRUUl9OQwkJKCgoYXJtX2xwYWVfaW9wdGUpMHg1KSA8PCAyKQor I2RlZmluZSBBUk1fTFBBRV9QVEVfTUVNQVRUUl9ERVYJKCgoYXJtX2xwYWVfaW9wdGUpMHgxKSA8 PCAyKQorCisvKiBSZWdpc3RlciBiaXRzICovCisjZGVmaW5lIEFSTV8zMl9MUEFFX1RDUl9FQUUJ CSgxIDw8IDMxKQorI2RlZmluZSBBUk1fNjRfTFBBRV9TMl9UQ1JfUkVTMQkJKDEgPDwgMzEpCisK KyNkZWZpbmUgQVJNX0xQQUVfVENSX0VQRDEJCSgxIDw8IDIzKQorCisjZGVmaW5lIEFSTV9MUEFF X1RDUl9URzBfNEsJCSgwIDw8IDE0KQorI2RlZmluZSBBUk1fTFBBRV9UQ1JfVEcwXzY0SwkJKDEg PDwgMTQpCisjZGVmaW5lIEFSTV9MUEFFX1RDUl9URzBfMTZLCQkoMiA8PCAxNCkKKworI2RlZmlu ZSBBUk1fTFBBRV9UQ1JfU0gwX1NISUZUCQkxMgorI2RlZmluZSBBUk1fTFBBRV9UQ1JfU0gwX01B U0sJCTB4MworI2RlZmluZSBBUk1fTFBBRV9UQ1JfU0hfTlMJCTAKKyNkZWZpbmUgQVJNX0xQQUVf VENSX1NIX09TCQkyCisjZGVmaW5lIEFSTV9MUEFFX1RDUl9TSF9JUwkJMworCisjZGVmaW5lIEFS TV9MUEFFX1RDUl9PUkdOMF9TSElGVAkxMAorI2RlZmluZSBBUk1fTFBBRV9UQ1JfSVJHTjBfU0hJ RlQJOAorI2RlZmluZSBBUk1fTFBBRV9UQ1JfUkdOX01BU0sJCTB4MworI2RlZmluZSBBUk1fTFBB RV9UQ1JfUkdOX05DCQkwCisjZGVmaW5lIEFSTV9MUEFFX1RDUl9SR05fV0JXQQkJMQorI2RlZmlu ZSBBUk1fTFBBRV9UQ1JfUkdOX1dUCQkyCisjZGVmaW5lIEFSTV9MUEFFX1RDUl9SR05fV0IJCTMK KworI2RlZmluZSBBUk1fTFBBRV9UQ1JfU0wwX1NISUZUCQk2CisjZGVmaW5lIEFSTV9MUEFFX1RD Ul9TTDBfTUFTSwkJMHgzCisKKyNkZWZpbmUgQVJNX0xQQUVfVENSX1QwU1pfU0hJRlQJCTAKKyNk ZWZpbmUgQVJNX0xQQUVfVENSX1NaX01BU0sJCTB4ZgorCisjZGVmaW5lIEFSTV9MUEFFX1RDUl9Q U19TSElGVAkJMTYKKyNkZWZpbmUgQVJNX0xQQUVfVENSX1BTX01BU0sJCTB4NworCisjZGVmaW5l IEFSTV9MUEFFX1RDUl9JUFNfU0hJRlQJCTMyCisjZGVmaW5lIEFSTV9MUEFFX1RDUl9JUFNfTUFT SwkJMHg3CisKKyNkZWZpbmUgQVJNX0xQQUVfVENSX1BTXzMyX0JJVAkJMHgwVUxMCisjZGVmaW5l IEFSTV9MUEFFX1RDUl9QU18zNl9CSVQJCTB4MVVMTAorI2RlZmluZSBBUk1fTFBBRV9UQ1JfUFNf NDBfQklUCQkweDJVTEwKKyNkZWZpbmUgQVJNX0xQQUVfVENSX1BTXzQyX0JJVAkJMHgzVUxMCisj ZGVmaW5lIEFSTV9MUEFFX1RDUl9QU180NF9CSVQJCTB4NFVMTAorI2RlZmluZSBBUk1fTFBBRV9U Q1JfUFNfNDhfQklUCQkweDVVTEwKKworI2RlZmluZSBBUk1fTFBBRV9NQUlSX0FUVFJfU0hJRlQo bikJKChuKSA8PCAzKQorI2RlZmluZSBBUk1fTFBBRV9NQUlSX0FUVFJfTUFTSwkJMHhmZgorI2Rl ZmluZSBBUk1fTFBBRV9NQUlSX0FUVFJfREVWSUNFCTB4MDQKKyNkZWZpbmUgQVJNX0xQQUVfTUFJ Ul9BVFRSX05DCQkweDQ0CisjZGVmaW5lIEFSTV9MUEFFX01BSVJfQVRUUl9XQlJXQQkweGZmCisj ZGVmaW5lIEFSTV9MUEFFX01BSVJfQVRUUl9JRFhfTkMJMAorI2RlZmluZSBBUk1fTFBBRV9NQUlS X0FUVFJfSURYX0NBQ0hFCTEKKyNkZWZpbmUgQVJNX0xQQUVfTUFJUl9BVFRSX0lEWF9ERVYJMgor CisvKiBJT1BURSBhY2Nlc3NvcnMgKi8KKyNkZWZpbmUgaW9wdGVfZGVyZWYocHRlLGQpCQkJCQlc CisJKF9fdmEoKHB0ZSkgJiAoKDFVTEwgPDwgQVJNX0xQQUVfTUFYX0FERFJfQklUUykgLSAxKQlc CisJJiB+KEFSTV9MUEFFX0dSQU5VTEUoZCkgLSAxVUxMKSkpCisKKyNkZWZpbmUgaW9wdGVfdHlw ZShwdGUsbCkJCQkJCVwKKwkoKChwdGUpID4+IEFSTV9MUEFFX1BURV9UWVBFX1NISUZUKSAmIEFS TV9MUEFFX1BURV9UWVBFX01BU0spCisKKyNkZWZpbmUgaW9wdGVfcHJvdChwdGUpCSgocHRlKSAm IEFSTV9MUEFFX1BURV9BVFRSX01BU0spCisKKyNkZWZpbmUgaW9wdGVfbGVhZihwdGUsbCkJCQkJ CVwKKwkobCA9PSAoQVJNX0xQQUVfTUFYX0xFVkVMUyAtIDEpID8JCQlcCisJCShpb3B0ZV90eXBl KHB0ZSxsKSA9PSBBUk1fTFBBRV9QVEVfVFlQRV9QQUdFKSA6CVwKKwkJKGlvcHRlX3R5cGUocHRl LGwpID09IEFSTV9MUEFFX1BURV9UWVBFX0JMT0NLKSkKKworI2RlZmluZSBpb3B0ZV90b19wZm4o cHRlLGQpCQkJCQlcCisJKCgocHRlKSAmICgoMVVMTCA8PCBBUk1fTFBBRV9NQVhfQUREUl9CSVRT KSAtIDEpKSA+PiAoZCktPnBnX3NoaWZ0KQorCisjZGVmaW5lIHBmbl90b19pb3B0ZShwZm4sZCkJ CQkJCVwKKwkoKChwZm4pIDw8IChkKS0+cGdfc2hpZnQpICYgKCgxVUxMIDw8IEFSTV9MUEFFX01B WF9BRERSX0JJVFMpIC0gMSkpCisKK3N0cnVjdCBhcm1fbHBhZV9pb19wZ3RhYmxlIHsKKwlzdHJ1 Y3QgaW9fcGd0YWJsZQlpb3A7CisKKwlpbnQJCQlsZXZlbHM7CisJc2l6ZV90CQkJcGdkX3NpemU7 CisJdW5zaWduZWQgbG9uZwkJcGdfc2hpZnQ7CisJdW5zaWduZWQgbG9uZwkJYml0c19wZXJfbGV2 ZWw7CisKKwl2b2lkCQkJKnBnZDsKK307CisKK3R5cGVkZWYgdTY0IGFybV9scGFlX2lvcHRlOwor CitzdGF0aWMgYm9vbCBzZWxmdGVzdF9ydW5uaW5nID0gZmFsc2U7CisKK3N0YXRpYyBkbWFfYWRk cl90IF9fYXJtX2xwYWVfZG1hX2FkZHIodm9pZCAqcGFnZXMpCit7CisJcmV0dXJuIChkbWFfYWRk cl90KXZpcnRfdG9fcGh5cyhwYWdlcyk7Cit9CisKK3N0YXRpYyB2b2lkICpfX2FybV9scGFlX2Fs bG9jX3BhZ2VzKHNpemVfdCBzaXplLCBnZnBfdCBnZnAsCisJCQkJICAgIHN0cnVjdCBpb19wZ3Rh YmxlX2NmZyAqY2ZnKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGNmZy0+aW9tbXVfZGV2Owor CWRtYV9hZGRyX3QgZG1hOworCXZvaWQgKnBhZ2VzID0gYWxsb2NfcGFnZXNfZXhhY3Qoc2l6ZSwg Z2ZwIHwgX19HRlBfWkVSTyk7CisKKwlpZiAoIXBhZ2VzKQorCQlyZXR1cm4gTlVMTDsKKworCWlm ICghc2VsZnRlc3RfcnVubmluZykgeworCQlkbWEgPSBkbWFfbWFwX3NpbmdsZShkZXYsIHBhZ2Vz LCBzaXplLCBETUFfVE9fREVWSUNFKTsKKwkJaWYgKGRtYV9tYXBwaW5nX2Vycm9yKGRldiwgZG1h KSkKKwkJCWdvdG8gb3V0X2ZyZWU7CisJCS8qCisJCSAqIFdlIGRlcGVuZCBvbiB0aGUgSU9NTVUg YmVpbmcgYWJsZSB0byB3b3JrIHdpdGggYW55IHBoeXNpY2FsCisJCSAqIGFkZHJlc3MgZGlyZWN0 bHksIHNvIGlmIHRoZSBETUEgbGF5ZXIgc3VnZ2VzdHMgb3RoZXJ3aXNlIGJ5CisJCSAqIHRyYW5z bGF0aW5nIG9yIHRydW5jYXRpbmcgdGhlbSwgdGhhdCBib2RlcyB2ZXJ5IGJhZGx5Li4uCisJCSAq LworCQlpZiAoZG1hICE9IHZpcnRfdG9fcGh5cyhwYWdlcykpCisJCQlnb3RvIG91dF91bm1hcDsK Kwl9CisKKwlyZXR1cm4gcGFnZXM7CisKK291dF91bm1hcDoKKwlkZXZfZXJyKGRldiwgIkNhbm5v dCBhY2NvbW1vZGF0ZSBETUEgdHJhbnNsYXRpb24gZm9yIElPTU1VIHBhZ2UgdGFibGVzXG4iKTsK KwlkbWFfdW5tYXBfc2luZ2xlKGRldiwgZG1hLCBzaXplLCBETUFfVE9fREVWSUNFKTsKK291dF9m cmVlOgorCWZyZWVfcGFnZXNfZXhhY3QocGFnZXMsIHNpemUpOworCXJldHVybiBOVUxMOworfQor CitzdGF0aWMgdm9pZCBfX2FybV9scGFlX2ZyZWVfcGFnZXModm9pZCAqcGFnZXMsIHNpemVfdCBz aXplLAorCQkJCSAgc3RydWN0IGlvX3BndGFibGVfY2ZnICpjZmcpCit7CisJaWYgKCFzZWxmdGVz dF9ydW5uaW5nKQorCQlkbWFfdW5tYXBfc2luZ2xlKGNmZy0+aW9tbXVfZGV2LCBfX2FybV9scGFl X2RtYV9hZGRyKHBhZ2VzKSwKKwkJCQkgc2l6ZSwgRE1BX1RPX0RFVklDRSk7CisJZnJlZV9wYWdl c19leGFjdChwYWdlcywgc2l6ZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fYXJtX2xwYWVfc2V0X3B0 ZShhcm1fbHBhZV9pb3B0ZSAqcHRlcCwgYXJtX2xwYWVfaW9wdGUgcHRlLAorCQkJICAgICAgIHN0 cnVjdCBpb19wZ3RhYmxlX2NmZyAqY2ZnKQoreworCSpwdGVwID0gcHRlOworCisJaWYgKCFzZWxm dGVzdF9ydW5uaW5nKQorCQlkbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShjZmctPmlvbW11X2Rl diwKKwkJCQkJICAgX19hcm1fbHBhZV9kbWFfYWRkcihwdGVwKSwKKwkJCQkJICAgc2l6ZW9mKHB0 ZSksIERNQV9UT19ERVZJQ0UpOworfQorCitzdGF0aWMgaW50IF9fYXJtX2xwYWVfdW5tYXAoc3Ry dWN0IGFybV9scGFlX2lvX3BndGFibGUgKmRhdGEsCisJCQkgICAgdW5zaWduZWQgbG9uZyBpb3Zh LCBzaXplX3Qgc2l6ZSwgaW50IGx2bCwKKwkJCSAgICBhcm1fbHBhZV9pb3B0ZSAqcHRlcCk7CisK K3N0YXRpYyBpbnQgYXJtX2xwYWVfaW5pdF9wdGUoc3RydWN0IGFybV9scGFlX2lvX3BndGFibGUg KmRhdGEsCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgaW92YSwgcGh5c19hZGRyX3QgcGFkZHIsCisJ CQkgICAgIGFybV9scGFlX2lvcHRlIHByb3QsIGludCBsdmwsCisJCQkgICAgIGFybV9scGFlX2lv cHRlICpwdGVwKQoreworCWFybV9scGFlX2lvcHRlIHB0ZSA9IHByb3Q7CisJc3RydWN0IGlvX3Bn dGFibGVfY2ZnICpjZmcgPSAmZGF0YS0+aW9wLmNmZzsKKworCWlmIChpb3B0ZV9sZWFmKCpwdGVw LCBsdmwpKSB7CisJCS8qIFdlIHJlcXVpcmUgYW4gdW5tYXAgZmlyc3QgKi8KKwkJV0FSTl9PTigh c2VsZnRlc3RfcnVubmluZyk7CisJCXJldHVybiAtRUVYSVNUOworCX0gZWxzZSBpZiAoaW9wdGVf dHlwZSgqcHRlcCwgbHZsKSA9PSBBUk1fTFBBRV9QVEVfVFlQRV9UQUJMRSkgeworCQkvKgorCQkg KiBXZSBuZWVkIHRvIHVubWFwIGFuZCBmcmVlIHRoZSBvbGQgdGFibGUgYmVmb3JlCisJCSAqIG92 ZXJ3cml0aW5nIGl0IHdpdGggYSBibG9jayBlbnRyeS4KKwkJICovCisJCWFybV9scGFlX2lvcHRl ICp0YmxwOworCQlzaXplX3Qgc3ogPSBBUk1fTFBBRV9CTE9DS19TSVpFKGx2bCwgZGF0YSk7CisK KwkJdGJscCA9IHB0ZXAgLSBBUk1fTFBBRV9MVkxfSURYKGlvdmEsIGx2bCwgZGF0YSk7CisJCWlm IChXQVJOX09OKF9fYXJtX2xwYWVfdW5tYXAoZGF0YSwgaW92YSwgc3osIGx2bCwgdGJscCkgIT0g c3opKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGNmZy0+cXVpcmtzICYgSU9fUEdU QUJMRV9RVUlSS19BUk1fTlMpCisJCXB0ZSB8PSBBUk1fTFBBRV9QVEVfTlM7CisKKwlpZiAobHZs ID09IEFSTV9MUEFFX01BWF9MRVZFTFMgLSAxKQorCQlwdGUgfD0gQVJNX0xQQUVfUFRFX1RZUEVf UEFHRTsKKwllbHNlCisJCXB0ZSB8PSBBUk1fTFBBRV9QVEVfVFlQRV9CTE9DSzsKKworCXB0ZSB8 PSBBUk1fTFBBRV9QVEVfQUYgfCBBUk1fTFBBRV9QVEVfU0hfSVM7CisJcHRlIHw9IHBmbl90b19p b3B0ZShwYWRkciA+PiBkYXRhLT5wZ19zaGlmdCwgZGF0YSk7CisKKwlfX2FybV9scGFlX3NldF9w dGUocHRlcCwgcHRlLCBjZmcpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fYXJtX2xw YWVfbWFwKHN0cnVjdCBhcm1fbHBhZV9pb19wZ3RhYmxlICpkYXRhLCB1bnNpZ25lZCBsb25nIGlv dmEsCisJCQkgIHBoeXNfYWRkcl90IHBhZGRyLCBzaXplX3Qgc2l6ZSwgYXJtX2xwYWVfaW9wdGUg cHJvdCwKKwkJCSAgaW50IGx2bCwgYXJtX2xwYWVfaW9wdGUgKnB0ZXApCit7CisJYXJtX2xwYWVf aW9wdGUgKmNwdGVwLCBwdGU7CisJc2l6ZV90IGJsb2NrX3NpemUgPSBBUk1fTFBBRV9CTE9DS19T SVpFKGx2bCwgZGF0YSk7CisJc3RydWN0IGlvX3BndGFibGVfY2ZnICpjZmcgPSAmZGF0YS0+aW9w LmNmZzsKKworCS8qIEZpbmQgb3VyIGVudHJ5IGF0IHRoZSBjdXJyZW50IGxldmVsICovCisJcHRl cCArPSBBUk1fTFBBRV9MVkxfSURYKGlvdmEsIGx2bCwgZGF0YSk7CisKKwkvKiBJZiB3ZSBjYW4g aW5zdGFsbCBhIGxlYWYgZW50cnkgYXQgdGhpcyBsZXZlbCwgdGhlbiBkbyBzbyAqLworCWlmIChz aXplID09IGJsb2NrX3NpemUgJiYgKHNpemUgJiBjZmctPnBnc2l6ZV9iaXRtYXApKQorCQlyZXR1 cm4gYXJtX2xwYWVfaW5pdF9wdGUoZGF0YSwgaW92YSwgcGFkZHIsIHByb3QsIGx2bCwgcHRlcCk7 CisKKwkvKiBXZSBjYW4ndCBhbGxvY2F0ZSB0YWJsZXMgYXQgdGhlIGZpbmFsIGxldmVsICovCisJ aWYgKFdBUk5fT04obHZsID49IEFSTV9MUEFFX01BWF9MRVZFTFMgLSAxKSkKKwkJcmV0dXJuIC1F SU5WQUw7CisKKwkvKiBHcmFiIGEgcG9pbnRlciB0byB0aGUgbmV4dCBsZXZlbCAqLworCXB0ZSA9 ICpwdGVwOworCWlmICghcHRlKSB7CisJCWNwdGVwID0gX19hcm1fbHBhZV9hbGxvY19wYWdlcyhB Uk1fTFBBRV9HUkFOVUxFKGRhdGEpLAorCQkJCQkgICAgICAgR0ZQX0FUT01JQywgY2ZnKTsKKwkJ aWYgKCFjcHRlcCkKKwkJCXJldHVybiAtRU5PTUVNOworCisJCXB0ZSA9IF9fcGEoY3B0ZXApIHwg QVJNX0xQQUVfUFRFX1RZUEVfVEFCTEU7CisJCWlmIChjZmctPnF1aXJrcyAmIElPX1BHVEFCTEVf UVVJUktfQVJNX05TKQorCQkJcHRlIHw9IEFSTV9MUEFFX1BURV9OU1RBQkxFOworCQlfX2FybV9s cGFlX3NldF9wdGUocHRlcCwgcHRlLCBjZmcpOworCX0gZWxzZSB7CisJCWNwdGVwID0gaW9wdGVf ZGVyZWYocHRlLCBkYXRhKTsKKwl9CisKKwkvKiBSaW5zZSwgcmVwZWF0ICovCisJcmV0dXJuIF9f YXJtX2xwYWVfbWFwKGRhdGEsIGlvdmEsIHBhZGRyLCBzaXplLCBwcm90LCBsdmwgKyAxLCBjcHRl cCk7Cit9CisKK3N0YXRpYyBhcm1fbHBhZV9pb3B0ZSBhcm1fbHBhZV9wcm90X3RvX3B0ZShzdHJ1 Y3QgYXJtX2xwYWVfaW9fcGd0YWJsZSAqZGF0YSwKKwkJCQkJICAgaW50IHByb3QpCit7CisJYXJt X2xwYWVfaW9wdGUgcHRlOworCisJaWYgKGRhdGEtPmlvcC5mbXQgPT0gQVJNXzY0X0xQQUVfUzEg fHwKKwkgICAgZGF0YS0+aW9wLmZtdCA9PSBBUk1fMzJfTFBBRV9TMSkgeworCQlwdGUgPSBBUk1f TFBBRV9QVEVfQVBfVU5QUklWIHwgQVJNX0xQQUVfUFRFX25HOworCisJCWlmICghKHByb3QgJiBJ T01NVV9XUklURSkgJiYgKHByb3QgJiBJT01NVV9SRUFEKSkKKwkJCXB0ZSB8PSBBUk1fTFBBRV9Q VEVfQVBfUkRPTkxZOworCisJCWlmIChwcm90ICYgSU9NTVVfTU1JTykKKwkJCXB0ZSB8PSAoQVJN X0xQQUVfTUFJUl9BVFRSX0lEWF9ERVYKKwkJCQk8PCBBUk1fTFBBRV9QVEVfQVRUUklORFhfU0hJ RlQpOworCQllbHNlIGlmIChwcm90ICYgSU9NTVVfQ0FDSEUpCisJCQlwdGUgfD0gKEFSTV9MUEFF X01BSVJfQVRUUl9JRFhfQ0FDSEUKKwkJCQk8PCBBUk1fTFBBRV9QVEVfQVRUUklORFhfU0hJRlQp OworCX0gZWxzZSB7CisJCXB0ZSA9IEFSTV9MUEFFX1BURV9IQVBfRkFVTFQ7CisJCWlmIChwcm90 ICYgSU9NTVVfUkVBRCkKKwkJCXB0ZSB8PSBBUk1fTFBBRV9QVEVfSEFQX1JFQUQ7CisJCWlmIChw cm90ICYgSU9NTVVfV1JJVEUpCisJCQlwdGUgfD0gQVJNX0xQQUVfUFRFX0hBUF9XUklURTsKKwkJ aWYgKHByb3QgJiBJT01NVV9NTUlPKQorCQkJcHRlIHw9IEFSTV9MUEFFX1BURV9NRU1BVFRSX0RF VjsKKwkJZWxzZSBpZiAocHJvdCAmIElPTU1VX0NBQ0hFKQorCQkJcHRlIHw9IEFSTV9MUEFFX1BU RV9NRU1BVFRSX09JV0I7CisJCWVsc2UKKwkJCXB0ZSB8PSBBUk1fTFBBRV9QVEVfTUVNQVRUUl9O QzsKKwl9CisKKwlpZiAocHJvdCAmIElPTU1VX05PRVhFQykKKwkJcHRlIHw9IEFSTV9MUEFFX1BU RV9YTjsKKworCXJldHVybiBwdGU7Cit9CisKK3N0YXRpYyBpbnQgYXJtX2xwYWVfbWFwKHN0cnVj dCBpb19wZ3RhYmxlX29wcyAqb3BzLCB1bnNpZ25lZCBsb25nIGlvdmEsCisJCQlwaHlzX2FkZHJf dCBwYWRkciwgc2l6ZV90IHNpemUsIGludCBpb21tdV9wcm90KQoreworCXN0cnVjdCBhcm1fbHBh ZV9pb19wZ3RhYmxlICpkYXRhID0gaW9fcGd0YWJsZV9vcHNfdG9fZGF0YShvcHMpOworCWFybV9s cGFlX2lvcHRlICpwdGVwID0gZGF0YS0+cGdkOworCWludCByZXQsIGx2bCA9IEFSTV9MUEFFX1NU QVJUX0xWTChkYXRhKTsKKwlhcm1fbHBhZV9pb3B0ZSBwcm90OworCisJLyogSWYgbm8gYWNjZXNz LCB0aGVuIG5vdGhpbmcgdG8gZG8gKi8KKwlpZiAoIShpb21tdV9wcm90ICYgKElPTU1VX1JFQUQg fCBJT01NVV9XUklURSkpKQorCQlyZXR1cm4gMDsKKworCXByb3QgPSBhcm1fbHBhZV9wcm90X3Rv X3B0ZShkYXRhLCBpb21tdV9wcm90KTsKKwlyZXQgPSBfX2FybV9scGFlX21hcChkYXRhLCBpb3Zh LCBwYWRkciwgc2l6ZSwgcHJvdCwgbHZsLCBwdGVwKTsKKwkvKgorCSAqIFN5bmNocm9uaXNlIGFs bCBQVEUgdXBkYXRlcyBmb3IgdGhlIG5ldyBtYXBwaW5nIGJlZm9yZSB0aGVyZSdzCisJICogYSBj aGFuY2UgZm9yIGFueXRoaW5nIHRvIGtpY2sgb2ZmIGEgdGFibGUgd2FsayBmb3IgdGhlIG5ldyBp b3ZhLgorCSAqLworCXdtYigpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19h cm1fbHBhZV9mcmVlX3BndGFibGUoc3RydWN0IGFybV9scGFlX2lvX3BndGFibGUgKmRhdGEsIGlu dCBsdmwsCisJCQkJICAgIGFybV9scGFlX2lvcHRlICpwdGVwKQoreworCWFybV9scGFlX2lvcHRl ICpzdGFydCwgKmVuZDsKKwl1bnNpZ25lZCBsb25nIHRhYmxlX3NpemU7CisKKwlpZiAobHZsID09 IEFSTV9MUEFFX1NUQVJUX0xWTChkYXRhKSkKKwkJdGFibGVfc2l6ZSA9IGRhdGEtPnBnZF9zaXpl OworCWVsc2UKKwkJdGFibGVfc2l6ZSA9IEFSTV9MUEFFX0dSQU5VTEUoZGF0YSk7CisKKwlzdGFy dCA9IHB0ZXA7CisKKwkvKiBPbmx5IGxlYWYgZW50cmllcyBhdCB0aGUgbGFzdCBsZXZlbCAqLwor CWlmIChsdmwgPT0gQVJNX0xQQUVfTUFYX0xFVkVMUyAtIDEpCisJCWVuZCA9IHB0ZXA7CisJZWxz ZQorCQllbmQgPSAodm9pZCAqKXB0ZXAgKyB0YWJsZV9zaXplOworCisJd2hpbGUgKHB0ZXAgIT0g ZW5kKSB7CisJCWFybV9scGFlX2lvcHRlIHB0ZSA9ICpwdGVwKys7CisKKwkJaWYgKCFwdGUgfHwg aW9wdGVfbGVhZihwdGUsIGx2bCkpCisJCQljb250aW51ZTsKKworCQlfX2FybV9scGFlX2ZyZWVf cGd0YWJsZShkYXRhLCBsdmwgKyAxLCBpb3B0ZV9kZXJlZihwdGUsIGRhdGEpKTsKKwl9CisKKwlf X2FybV9scGFlX2ZyZWVfcGFnZXMoc3RhcnQsIHRhYmxlX3NpemUsICZkYXRhLT5pb3AuY2ZnKTsK K30KKworc3RhdGljIHZvaWQgYXJtX2xwYWVfZnJlZV9wZ3RhYmxlKHN0cnVjdCBpb19wZ3RhYmxl ICppb3ApCit7CisJc3RydWN0IGFybV9scGFlX2lvX3BndGFibGUgKmRhdGEgPSBpb19wZ3RhYmxl X3RvX2RhdGEoaW9wKTsKKworCV9fYXJtX2xwYWVfZnJlZV9wZ3RhYmxlKGRhdGEsIEFSTV9MUEFF X1NUQVJUX0xWTChkYXRhKSwgZGF0YS0+cGdkKTsKKwlrZnJlZShkYXRhKTsKK30KKworc3RhdGlj IGludCBhcm1fbHBhZV9zcGxpdF9ibGtfdW5tYXAoc3RydWN0IGFybV9scGFlX2lvX3BndGFibGUg KmRhdGEsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgaW92YSwgc2l6ZV90IHNpemUsCisJCQkJICAg IGFybV9scGFlX2lvcHRlIHByb3QsIGludCBsdmwsCisJCQkJICAgIGFybV9scGFlX2lvcHRlICpw dGVwLCBzaXplX3QgYmxrX3NpemUpCit7CisJdW5zaWduZWQgbG9uZyBibGtfc3RhcnQsIGJsa19l bmQ7CisJcGh5c19hZGRyX3QgYmxrX3BhZGRyOworCWFybV9scGFlX2lvcHRlIHRhYmxlID0gMDsK KworCWJsa19zdGFydCA9IGlvdmEgJiB+KGJsa19zaXplIC0gMSk7CisJYmxrX2VuZCA9IGJsa19z dGFydCArIGJsa19zaXplOworCWJsa19wYWRkciA9IGlvcHRlX3RvX3BmbigqcHRlcCwgZGF0YSkg PDwgZGF0YS0+cGdfc2hpZnQ7CisKKwlmb3IgKDsgYmxrX3N0YXJ0IDwgYmxrX2VuZDsgYmxrX3N0 YXJ0ICs9IHNpemUsIGJsa19wYWRkciArPSBzaXplKSB7CisJCWFybV9scGFlX2lvcHRlICp0YWJs ZXA7CisKKwkJLyogVW5tYXAhICovCisJCWlmIChibGtfc3RhcnQgPT0gaW92YSkKKwkJCWNvbnRp bnVlOworCisJCS8qIF9fYXJtX2xwYWVfbWFwIGV4cGVjdHMgYSBwb2ludGVyIHRvIHRoZSBzdGFy dCBvZiB0aGUgdGFibGUgKi8KKwkJdGFibGVwID0gJnRhYmxlIC0gQVJNX0xQQUVfTFZMX0lEWChi bGtfc3RhcnQsIGx2bCwgZGF0YSk7CisJCWlmIChfX2FybV9scGFlX21hcChkYXRhLCBibGtfc3Rh cnQsIGJsa19wYWRkciwgc2l6ZSwgcHJvdCwgbHZsLAorCQkJCSAgIHRhYmxlcCkgPCAwKSB7CisJ CQlpZiAodGFibGUpIHsKKwkJCQkvKiBGcmVlIHRoZSB0YWJsZSB3ZSBhbGxvY2F0ZWQgKi8KKwkJ CQl0YWJsZXAgPSBpb3B0ZV9kZXJlZih0YWJsZSwgZGF0YSk7CisJCQkJX19hcm1fbHBhZV9mcmVl X3BndGFibGUoZGF0YSwgbHZsICsgMSwgdGFibGVwKTsKKwkJCX0KKwkJCXJldHVybiAwOyAvKiBC eXRlcyB1bm1hcHBlZCAqLworCQl9CisJfQorCisJX19hcm1fbHBhZV9zZXRfcHRlKHB0ZXAsIHRh YmxlLCAmZGF0YS0+aW9wLmNmZyk7CisJaW92YSAmPSB+KGJsa19zaXplIC0gMSk7CisJaW9fcGd0 YWJsZV90bGJfYWRkX2ZsdXNoKCZkYXRhLT5pb3AsIGlvdmEsIGJsa19zaXplLCBibGtfc2l6ZSwg dHJ1ZSk7CisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBpbnQgX19hcm1fbHBhZV91bm1hcChz dHJ1Y3QgYXJtX2xwYWVfaW9fcGd0YWJsZSAqZGF0YSwKKwkJCSAgICB1bnNpZ25lZCBsb25nIGlv dmEsIHNpemVfdCBzaXplLCBpbnQgbHZsLAorCQkJICAgIGFybV9scGFlX2lvcHRlICpwdGVwKQor eworCWFybV9scGFlX2lvcHRlIHB0ZTsKKwlzdHJ1Y3QgaW9fcGd0YWJsZSAqaW9wID0gJmRhdGEt PmlvcDsKKwlzaXplX3QgYmxrX3NpemUgPSBBUk1fTFBBRV9CTE9DS19TSVpFKGx2bCwgZGF0YSk7 CisKKwkvKiBTb21ldGhpbmcgd2VudCBob3JyaWJseSB3cm9uZyBhbmQgd2UgcmFuIG91dCBvZiBw YWdlIHRhYmxlICovCisJaWYgKFdBUk5fT04obHZsID09IEFSTV9MUEFFX01BWF9MRVZFTFMpKQor CQlyZXR1cm4gMDsKKworCXB0ZXAgKz0gQVJNX0xQQUVfTFZMX0lEWChpb3ZhLCBsdmwsIGRhdGEp OworCXB0ZSA9ICpwdGVwOworCWlmIChXQVJOX09OKCFwdGUpKQorCQlyZXR1cm4gMDsKKworCS8q IElmIHRoZSBzaXplIG1hdGNoZXMgdGhpcyBsZXZlbCwgd2UncmUgaW4gdGhlIHJpZ2h0IHBsYWNl ICovCisJaWYgKHNpemUgPT0gYmxrX3NpemUpIHsKKwkJX19hcm1fbHBhZV9zZXRfcHRlKHB0ZXAs IDAsICZpb3AtPmNmZyk7CisKKwkJaWYgKCFpb3B0ZV9sZWFmKHB0ZSwgbHZsKSkgeworCQkJLyog QWxzbyBmbHVzaCBhbnkgcGFydGlhbCB3YWxrcyAqLworCQkJaW9fcGd0YWJsZV90bGJfYWRkX2Zs dXNoKGlvcCwgaW92YSwgc2l6ZSwKKwkJCQkJCUFSTV9MUEFFX0dSQU5VTEUoZGF0YSksIGZhbHNl KTsKKwkJCWlvX3BndGFibGVfdGxiX3N5bmMoaW9wKTsKKwkJCXB0ZXAgPSBpb3B0ZV9kZXJlZihw dGUsIGRhdGEpOworCQkJX19hcm1fbHBhZV9mcmVlX3BndGFibGUoZGF0YSwgbHZsICsgMSwgcHRl cCk7CisJCX0gZWxzZSB7CisJCQlpb19wZ3RhYmxlX3RsYl9hZGRfZmx1c2goaW9wLCBpb3ZhLCBz aXplLCBzaXplLCB0cnVlKTsKKwkJfQorCisJCXJldHVybiBzaXplOworCX0gZWxzZSBpZiAoaW9w dGVfbGVhZihwdGUsIGx2bCkpIHsKKwkJLyoKKwkJICogSW5zZXJ0IGEgdGFibGUgYXQgdGhlIG5l eHQgbGV2ZWwgdG8gbWFwIHRoZSBvbGQgcmVnaW9uLAorCQkgKiBtaW51cyB0aGUgcGFydCB3ZSB3 YW50IHRvIHVubWFwCisJCSAqLworCQlyZXR1cm4gYXJtX2xwYWVfc3BsaXRfYmxrX3VubWFwKGRh dGEsIGlvdmEsIHNpemUsCisJCQkJCQlpb3B0ZV9wcm90KHB0ZSksIGx2bCwgcHRlcCwKKwkJCQkJ CWJsa19zaXplKTsKKwl9CisKKwkvKiBLZWVwIG9uIHdhbGtpbicgKi8KKwlwdGVwID0gaW9wdGVf ZGVyZWYocHRlLCBkYXRhKTsKKwlyZXR1cm4gX19hcm1fbHBhZV91bm1hcChkYXRhLCBpb3ZhLCBz aXplLCBsdmwgKyAxLCBwdGVwKTsKK30KKworc3RhdGljIGludCBhcm1fbHBhZV91bm1hcChzdHJ1 Y3QgaW9fcGd0YWJsZV9vcHMgKm9wcywgdW5zaWduZWQgbG9uZyBpb3ZhLAorCQkJICBzaXplX3Qg c2l6ZSkKK3sKKwlzaXplX3QgdW5tYXBwZWQ7CisJc3RydWN0IGFybV9scGFlX2lvX3BndGFibGUg KmRhdGEgPSBpb19wZ3RhYmxlX29wc190b19kYXRhKG9wcyk7CisJYXJtX2xwYWVfaW9wdGUgKnB0 ZXAgPSBkYXRhLT5wZ2Q7CisJaW50IGx2bCA9IEFSTV9MUEFFX1NUQVJUX0xWTChkYXRhKTsKKwor CXVubWFwcGVkID0gX19hcm1fbHBhZV91bm1hcChkYXRhLCBpb3ZhLCBzaXplLCBsdmwsIHB0ZXAp OworCWlmICh1bm1hcHBlZCkKKwkJaW9fcGd0YWJsZV90bGJfc3luYygmZGF0YS0+aW9wKTsKKwor CXJldHVybiB1bm1hcHBlZDsKK30KKworc3RhdGljIHBoeXNfYWRkcl90IGFybV9scGFlX2lvdmFf dG9fcGh5cyhzdHJ1Y3QgaW9fcGd0YWJsZV9vcHMgKm9wcywKKwkJCQkJIHVuc2lnbmVkIGxvbmcg aW92YSkKK3sKKwlzdHJ1Y3QgYXJtX2xwYWVfaW9fcGd0YWJsZSAqZGF0YSA9IGlvX3BndGFibGVf b3BzX3RvX2RhdGEob3BzKTsKKwlhcm1fbHBhZV9pb3B0ZSBwdGUsICpwdGVwID0gZGF0YS0+cGdk OworCWludCBsdmwgPSBBUk1fTFBBRV9TVEFSVF9MVkwoZGF0YSk7CisKKwlkbyB7CisJCS8qIFZh bGlkIElPUFRFIHBvaW50ZXI/ICovCisJCWlmICghcHRlcCkKKwkJCXJldHVybiAwOworCisJCS8q IEdyYWIgdGhlIElPUFRFIHdlJ3JlIGludGVyZXN0ZWQgaW4gKi8KKwkJcHRlID0gKihwdGVwICsg QVJNX0xQQUVfTFZMX0lEWChpb3ZhLCBsdmwsIGRhdGEpKTsKKworCQkvKiBWYWxpZCBlbnRyeT8g Ki8KKwkJaWYgKCFwdGUpCisJCQlyZXR1cm4gMDsKKworCQkvKiBMZWFmIGVudHJ5PyAqLworCQlp ZiAoaW9wdGVfbGVhZihwdGUsbHZsKSkKKwkJCWdvdG8gZm91bmRfdHJhbnNsYXRpb247CisKKwkJ LyogVGFrZSBpdCB0byB0aGUgbmV4dCBsZXZlbCAqLworCQlwdGVwID0gaW9wdGVfZGVyZWYocHRl LCBkYXRhKTsKKwl9IHdoaWxlICgrK2x2bCA8IEFSTV9MUEFFX01BWF9MRVZFTFMpOworCisJLyog UmFuIG91dCBvZiBwYWdlIHRhYmxlcyB0byB3YWxrICovCisJcmV0dXJuIDA7CisKK2ZvdW5kX3Ry YW5zbGF0aW9uOgorCWlvdmEgJj0gKEFSTV9MUEFFX0JMT0NLX1NJWkUobHZsLCBkYXRhKSAtIDEp OworCXJldHVybiAoKHBoeXNfYWRkcl90KWlvcHRlX3RvX3BmbihwdGUsZGF0YSkgPDwgZGF0YS0+ cGdfc2hpZnQpIHwgaW92YTsKK30KKworc3RhdGljIHZvaWQgYXJtX2xwYWVfcmVzdHJpY3RfcGdz aXplcyhzdHJ1Y3QgaW9fcGd0YWJsZV9jZmcgKmNmZykKK3sKKwl1bnNpZ25lZCBsb25nIGdyYW51 bGU7CisKKwkvKgorCSAqIFdlIG5lZWQgdG8gcmVzdHJpY3QgdGhlIHN1cHBvcnRlZCBwYWdlIHNp emVzIHRvIG1hdGNoIHRoZQorCSAqIHRyYW5zbGF0aW9uIHJlZ2ltZSBmb3IgYSBwYXJ0aWN1bGFy IGdyYW51bGUuIEFpbSB0byBtYXRjaAorCSAqIHRoZSBDUFUgcGFnZSBzaXplIGlmIHBvc3NpYmxl LCBvdGhlcndpc2UgcHJlZmVyIHNtYWxsZXIgc2l6ZXMuCisJICogV2hpbGUgd2UncmUgYXQgaXQs IHJlc3RyaWN0IHRoZSBibG9jayBzaXplcyB0byBtYXRjaCB0aGUKKwkgKiBjaG9zZW4gZ3JhbnVs ZS4KKwkgKi8KKwlpZiAoY2ZnLT5wZ3NpemVfYml0bWFwICYgUEFHRV9TSVpFKQorCQlncmFudWxl ID0gUEFHRV9TSVpFOworCWVsc2UgaWYgKGNmZy0+cGdzaXplX2JpdG1hcCAmIH5QQUdFX01BU0sp CisJCWdyYW51bGUgPSAxVUwgPDwgX19mbHMoY2ZnLT5wZ3NpemVfYml0bWFwICYgflBBR0VfTUFT Syk7CisJZWxzZSBpZiAoY2ZnLT5wZ3NpemVfYml0bWFwICYgUEFHRV9NQVNLKQorCQlncmFudWxl ID0gMVVMIDw8IF9fZmZzKGNmZy0+cGdzaXplX2JpdG1hcCAmIFBBR0VfTUFTSyk7CisJZWxzZQor CQlncmFudWxlID0gMDsKKworCXN3aXRjaCAoZ3JhbnVsZSkgeworCWNhc2UgU1pfNEs6CisJCWNm Zy0+cGdzaXplX2JpdG1hcCAmPSAoU1pfNEsgfCBTWl8yTSB8IFNaXzFHKTsKKwkJYnJlYWs7CisJ Y2FzZSBTWl8xNks6CisJCWNmZy0+cGdzaXplX2JpdG1hcCAmPSAoU1pfMTZLIHwgU1pfMzJNKTsK KwkJYnJlYWs7CisJY2FzZSBTWl82NEs6CisJCWNmZy0+cGdzaXplX2JpdG1hcCAmPSAoU1pfNjRL IHwgU1pfNTEyTSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWNmZy0+cGdzaXplX2JpdG1hcCA9 IDA7CisJfQorfQorCitzdGF0aWMgc3RydWN0IGFybV9scGFlX2lvX3BndGFibGUgKgorYXJtX2xw YWVfYWxsb2NfcGd0YWJsZShzdHJ1Y3QgaW9fcGd0YWJsZV9jZmcgKmNmZykKK3sKKwl1bnNpZ25l ZCBsb25nIHZhX2JpdHMsIHBnZF9iaXRzOworCXN0cnVjdCBhcm1fbHBhZV9pb19wZ3RhYmxlICpk YXRhOworCisJYXJtX2xwYWVfcmVzdHJpY3RfcGdzaXplcyhjZmcpOworCisJaWYgKCEoY2ZnLT5w Z3NpemVfYml0bWFwICYgKFNaXzRLIHwgU1pfMTZLIHwgU1pfNjRLKSkpCisJCXJldHVybiBOVUxM OworCisJaWYgKGNmZy0+aWFzID4gQVJNX0xQQUVfTUFYX0FERFJfQklUUykKKwkJcmV0dXJuIE5V TEw7CisKKwlpZiAoY2ZnLT5vYXMgPiBBUk1fTFBBRV9NQVhfQUREUl9CSVRTKQorCQlyZXR1cm4g TlVMTDsKKworCWlmICghc2VsZnRlc3RfcnVubmluZyAmJiBjZmctPmlvbW11X2Rldi0+ZG1hX3Bm bl9vZmZzZXQpIHsKKwkJZGV2X2VycihjZmctPmlvbW11X2RldiwgIkNhbm5vdCBhY2NvbW1vZGF0 ZSBETUEgb2Zmc2V0IGZvciBJT01NVSBwYWdlIHRhYmxlc1xuIik7CisJCXJldHVybiBOVUxMOwor CX0KKworCWRhdGEgPSBrbWFsbG9jKHNpemVvZigqZGF0YSksIEdGUF9LRVJORUwpOworCWlmICgh ZGF0YSkKKwkJcmV0dXJuIE5VTEw7CisKKwlkYXRhLT5wZ19zaGlmdCA9IF9fZmZzKGNmZy0+cGdz aXplX2JpdG1hcCk7CisJZGF0YS0+Yml0c19wZXJfbGV2ZWwgPSBkYXRhLT5wZ19zaGlmdCAtIGls b2cyKHNpemVvZihhcm1fbHBhZV9pb3B0ZSkpOworCisJdmFfYml0cyA9IGNmZy0+aWFzIC0gZGF0 YS0+cGdfc2hpZnQ7CisJZGF0YS0+bGV2ZWxzID0gRElWX1JPVU5EX1VQKHZhX2JpdHMsIGRhdGEt PmJpdHNfcGVyX2xldmVsKTsKKworCS8qIENhbGN1bGF0ZSB0aGUgYWN0dWFsIHNpemUgb2Ygb3Vy IHBnZCAod2l0aG91dCBjb25jYXRlbmF0aW9uKSAqLworCXBnZF9iaXRzID0gdmFfYml0cyAtIChk YXRhLT5iaXRzX3Blcl9sZXZlbCAqIChkYXRhLT5sZXZlbHMgLSAxKSk7CisJZGF0YS0+cGdkX3Np emUgPSAxVUwgPDwgKHBnZF9iaXRzICsgaWxvZzIoc2l6ZW9mKGFybV9scGFlX2lvcHRlKSkpOwor CisJZGF0YS0+aW9wLm9wcyA9IChzdHJ1Y3QgaW9fcGd0YWJsZV9vcHMpIHsKKwkJLm1hcAkJPSBh cm1fbHBhZV9tYXAsCisJCS51bm1hcAkJPSBhcm1fbHBhZV91bm1hcCwKKwkJLmlvdmFfdG9fcGh5 cwk9IGFybV9scGFlX2lvdmFfdG9fcGh5cywKKwl9OworCisJcmV0dXJuIGRhdGE7Cit9CisKK3N0 YXRpYyBzdHJ1Y3QgaW9fcGd0YWJsZSAqCithcm1fNjRfbHBhZV9hbGxvY19wZ3RhYmxlX3MxKHN0 cnVjdCBpb19wZ3RhYmxlX2NmZyAqY2ZnLCB2b2lkICpjb29raWUpCit7CisJdTY0IHJlZzsKKwlz dHJ1Y3QgYXJtX2xwYWVfaW9fcGd0YWJsZSAqZGF0YTsKKworCWlmIChjZmctPnF1aXJrcyAmIH5J T19QR1RBQkxFX1FVSVJLX0FSTV9OUykKKwkJcmV0dXJuIE5VTEw7CisKKwlkYXRhID0gYXJtX2xw YWVfYWxsb2NfcGd0YWJsZShjZmcpOworCWlmICghZGF0YSkKKwkJcmV0dXJuIE5VTEw7CisKKwkv KiBUQ1IgKi8KKwlyZWcgPSAoQVJNX0xQQUVfVENSX1NIX0lTIDw8IEFSTV9MUEFFX1RDUl9TSDBf U0hJRlQpIHwKKwkgICAgICAoQVJNX0xQQUVfVENSX1JHTl9XQldBIDw8IEFSTV9MUEFFX1RDUl9J UkdOMF9TSElGVCkgfAorCSAgICAgIChBUk1fTFBBRV9UQ1JfUkdOX1dCV0EgPDwgQVJNX0xQQUVf VENSX09SR04wX1NISUZUKTsKKworCXN3aXRjaCAoQVJNX0xQQUVfR1JBTlVMRShkYXRhKSkgewor CWNhc2UgU1pfNEs6CisJCXJlZyB8PSBBUk1fTFBBRV9UQ1JfVEcwXzRLOworCQlicmVhazsKKwlj YXNlIFNaXzE2SzoKKwkJcmVnIHw9IEFSTV9MUEFFX1RDUl9URzBfMTZLOworCQlicmVhazsKKwlj YXNlIFNaXzY0SzoKKwkJcmVnIHw9IEFSTV9MUEFFX1RDUl9URzBfNjRLOworCQlicmVhazsKKwl9 CisKKwlzd2l0Y2ggKGNmZy0+b2FzKSB7CisJY2FzZSAzMjoKKwkJcmVnIHw9IChBUk1fTFBBRV9U Q1JfUFNfMzJfQklUIDw8IEFSTV9MUEFFX1RDUl9JUFNfU0hJRlQpOworCQlicmVhazsKKwljYXNl IDM2OgorCQlyZWcgfD0gKEFSTV9MUEFFX1RDUl9QU18zNl9CSVQgPDwgQVJNX0xQQUVfVENSX0lQ U19TSElGVCk7CisJCWJyZWFrOworCWNhc2UgNDA6CisJCXJlZyB8PSAoQVJNX0xQQUVfVENSX1BT XzQwX0JJVCA8PCBBUk1fTFBBRV9UQ1JfSVBTX1NISUZUKTsKKwkJYnJlYWs7CisJY2FzZSA0MjoK KwkJcmVnIHw9IChBUk1fTFBBRV9UQ1JfUFNfNDJfQklUIDw8IEFSTV9MUEFFX1RDUl9JUFNfU0hJ RlQpOworCQlicmVhazsKKwljYXNlIDQ0OgorCQlyZWcgfD0gKEFSTV9MUEFFX1RDUl9QU180NF9C SVQgPDwgQVJNX0xQQUVfVENSX0lQU19TSElGVCk7CisJCWJyZWFrOworCWNhc2UgNDg6CisJCXJl ZyB8PSAoQVJNX0xQQUVfVENSX1BTXzQ4X0JJVCA8PCBBUk1fTFBBRV9UQ1JfSVBTX1NISUZUKTsK KwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZ290byBvdXRfZnJlZV9kYXRhOworCX0KKworCXJlZyB8 PSAoNjRVTEwgLSBjZmctPmlhcykgPDwgQVJNX0xQQUVfVENSX1QwU1pfU0hJRlQ7CisKKwkvKiBE aXNhYmxlIHNwZWN1bGF0aXZlIHdhbGtzIHRocm91Z2ggVFRCUjEgKi8KKwlyZWcgfD0gQVJNX0xQ QUVfVENSX0VQRDE7CisJY2ZnLT5hcm1fbHBhZV9zMV9jZmcudGNyID0gcmVnOworCisJLyogTUFJ UnMgKi8KKwlyZWcgPSAoQVJNX0xQQUVfTUFJUl9BVFRSX05DCisJICAgICAgIDw8IEFSTV9MUEFF X01BSVJfQVRUUl9TSElGVChBUk1fTFBBRV9NQUlSX0FUVFJfSURYX05DKSkgfAorCSAgICAgIChB Uk1fTFBBRV9NQUlSX0FUVFJfV0JSV0EKKwkgICAgICAgPDwgQVJNX0xQQUVfTUFJUl9BVFRSX1NI SUZUKEFSTV9MUEFFX01BSVJfQVRUUl9JRFhfQ0FDSEUpKSB8CisJICAgICAgKEFSTV9MUEFFX01B SVJfQVRUUl9ERVZJQ0UKKwkgICAgICAgPDwgQVJNX0xQQUVfTUFJUl9BVFRSX1NISUZUKEFSTV9M UEFFX01BSVJfQVRUUl9JRFhfREVWKSk7CisKKwljZmctPmFybV9scGFlX3MxX2NmZy5tYWlyWzBd ID0gcmVnOworCWNmZy0+YXJtX2xwYWVfczFfY2ZnLm1haXJbMV0gPSAwOworCisJLyogTG9va2lu ZyBnb29kOyBhbGxvY2F0ZSBhIHBnZCAqLworCWRhdGEtPnBnZCA9IF9fYXJtX2xwYWVfYWxsb2Nf cGFnZXMoZGF0YS0+cGdkX3NpemUsIEdGUF9LRVJORUwsIGNmZyk7CisJaWYgKCFkYXRhLT5wZ2Qp CisJCWdvdG8gb3V0X2ZyZWVfZGF0YTsKKworCS8qIEVuc3VyZSB0aGUgZW1wdHkgcGdkIGlzIHZp c2libGUgYmVmb3JlIGFueSBhY3R1YWwgVFRCUiB3cml0ZSAqLworCXdtYigpOworCisJLyogVFRC UnMgKi8KKwljZmctPmFybV9scGFlX3MxX2NmZy50dGJyWzBdID0gdmlydF90b19waHlzKGRhdGEt PnBnZCk7CisJY2ZnLT5hcm1fbHBhZV9zMV9jZmcudHRiclsxXSA9IDA7CisJcmV0dXJuICZkYXRh LT5pb3A7CisKK291dF9mcmVlX2RhdGE6CisJa2ZyZWUoZGF0YSk7CisJcmV0dXJuIE5VTEw7Cit9 CisKK3N0YXRpYyBzdHJ1Y3QgaW9fcGd0YWJsZSAqCithcm1fNjRfbHBhZV9hbGxvY19wZ3RhYmxl X3MyKHN0cnVjdCBpb19wZ3RhYmxlX2NmZyAqY2ZnLCB2b2lkICpjb29raWUpCit7CisJdTY0IHJl Zywgc2w7CisJc3RydWN0IGFybV9scGFlX2lvX3BndGFibGUgKmRhdGE7CisKKwkvKiBUaGUgTlMg cXVpcmsgZG9lc24ndCBhcHBseSBhdCBzdGFnZSAyICovCisJaWYgKGNmZy0+cXVpcmtzKQorCQly ZXR1cm4gTlVMTDsKKworCWRhdGEgPSBhcm1fbHBhZV9hbGxvY19wZ3RhYmxlKGNmZyk7CisJaWYg KCFkYXRhKQorCQlyZXR1cm4gTlVMTDsKKworCS8qCisJICogQ29uY2F0ZW5hdGUgUEdEcyBhdCBs ZXZlbCAxIGlmIHBvc3NpYmxlIGluIG9yZGVyIHRvIHJlZHVjZQorCSAqIHRoZSBkZXB0aCBvZiB0 aGUgc3RhZ2UtMiB3YWxrLgorCSAqLworCWlmIChkYXRhLT5sZXZlbHMgPT0gQVJNX0xQQUVfTUFY X0xFVkVMUykgeworCQl1bnNpZ25lZCBsb25nIHBnZF9wYWdlczsKKworCQlwZ2RfcGFnZXMgPSBk YXRhLT5wZ2Rfc2l6ZSA+PiBpbG9nMihzaXplb2YoYXJtX2xwYWVfaW9wdGUpKTsKKwkJaWYgKHBn ZF9wYWdlcyA8PSBBUk1fTFBBRV9TMl9NQVhfQ09OQ0FUX1BBR0VTKSB7CisJCQlkYXRhLT5wZ2Rf c2l6ZSA9IHBnZF9wYWdlcyA8PCBkYXRhLT5wZ19zaGlmdDsKKwkJCWRhdGEtPmxldmVscy0tOwor CQl9CisJfQorCisJLyogVlRDUiAqLworCXJlZyA9IEFSTV82NF9MUEFFX1MyX1RDUl9SRVMxIHwK KwkgICAgIChBUk1fTFBBRV9UQ1JfU0hfSVMgPDwgQVJNX0xQQUVfVENSX1NIMF9TSElGVCkgfAor CSAgICAgKEFSTV9MUEFFX1RDUl9SR05fV0JXQSA8PCBBUk1fTFBBRV9UQ1JfSVJHTjBfU0hJRlQp IHwKKwkgICAgIChBUk1fTFBBRV9UQ1JfUkdOX1dCV0EgPDwgQVJNX0xQQUVfVENSX09SR04wX1NI SUZUKTsKKworCXNsID0gQVJNX0xQQUVfU1RBUlRfTFZMKGRhdGEpOworCisJc3dpdGNoIChBUk1f TFBBRV9HUkFOVUxFKGRhdGEpKSB7CisJY2FzZSBTWl80SzoKKwkJcmVnIHw9IEFSTV9MUEFFX1RD Ul9URzBfNEs7CisJCXNsKys7IC8qIFNMMCBmb3JtYXQgaXMgZGlmZmVyZW50IGZvciA0SyBncmFu dWxlIHNpemUgKi8KKwkJYnJlYWs7CisJY2FzZSBTWl8xNks6CisJCXJlZyB8PSBBUk1fTFBBRV9U Q1JfVEcwXzE2SzsKKwkJYnJlYWs7CisJY2FzZSBTWl82NEs6CisJCXJlZyB8PSBBUk1fTFBBRV9U Q1JfVEcwXzY0SzsKKwkJYnJlYWs7CisJfQorCisJc3dpdGNoIChjZmctPm9hcykgeworCWNhc2Ug MzI6CisJCXJlZyB8PSAoQVJNX0xQQUVfVENSX1BTXzMyX0JJVCA8PCBBUk1fTFBBRV9UQ1JfUFNf U0hJRlQpOworCQlicmVhazsKKwljYXNlIDM2OgorCQlyZWcgfD0gKEFSTV9MUEFFX1RDUl9QU18z Nl9CSVQgPDwgQVJNX0xQQUVfVENSX1BTX1NISUZUKTsKKwkJYnJlYWs7CisJY2FzZSA0MDoKKwkJ cmVnIHw9IChBUk1fTFBBRV9UQ1JfUFNfNDBfQklUIDw8IEFSTV9MUEFFX1RDUl9QU19TSElGVCk7 CisJCWJyZWFrOworCWNhc2UgNDI6CisJCXJlZyB8PSAoQVJNX0xQQUVfVENSX1BTXzQyX0JJVCA8 PCBBUk1fTFBBRV9UQ1JfUFNfU0hJRlQpOworCQlicmVhazsKKwljYXNlIDQ0OgorCQlyZWcgfD0g KEFSTV9MUEFFX1RDUl9QU180NF9CSVQgPDwgQVJNX0xQQUVfVENSX1BTX1NISUZUKTsKKwkJYnJl YWs7CisJY2FzZSA0ODoKKwkJcmVnIHw9IChBUk1fTFBBRV9UQ1JfUFNfNDhfQklUIDw8IEFSTV9M UEFFX1RDUl9QU19TSElGVCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWdvdG8gb3V0X2ZyZWVf ZGF0YTsKKwl9CisKKwlyZWcgfD0gKDY0VUxMIC0gY2ZnLT5pYXMpIDw8IEFSTV9MUEFFX1RDUl9U MFNaX1NISUZUOworCXJlZyB8PSAofnNsICYgQVJNX0xQQUVfVENSX1NMMF9NQVNLKSA8PCBBUk1f TFBBRV9UQ1JfU0wwX1NISUZUOworCWNmZy0+YXJtX2xwYWVfczJfY2ZnLnZ0Y3IgPSByZWc7CisK KwkvKiBBbGxvY2F0ZSBwZ2QgcGFnZXMgKi8KKwlkYXRhLT5wZ2QgPSBfX2FybV9scGFlX2FsbG9j X3BhZ2VzKGRhdGEtPnBnZF9zaXplLCBHRlBfS0VSTkVMLCBjZmcpOworCWlmICghZGF0YS0+cGdk KQorCQlnb3RvIG91dF9mcmVlX2RhdGE7CisKKwkvKiBFbnN1cmUgdGhlIGVtcHR5IHBnZCBpcyB2 aXNpYmxlIGJlZm9yZSBhbnkgYWN0dWFsIFRUQlIgd3JpdGUgKi8KKwl3bWIoKTsKKworCS8qIFZU VEJSICovCisJY2ZnLT5hcm1fbHBhZV9zMl9jZmcudnR0YnIgPSB2aXJ0X3RvX3BoeXMoZGF0YS0+ cGdkKTsKKwlyZXR1cm4gJmRhdGEtPmlvcDsKKworb3V0X2ZyZWVfZGF0YToKKwlrZnJlZShkYXRh KTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBpb19wZ3RhYmxlICoKK2FybV8z Ml9scGFlX2FsbG9jX3BndGFibGVfczEoc3RydWN0IGlvX3BndGFibGVfY2ZnICpjZmcsIHZvaWQg KmNvb2tpZSkKK3sKKwlzdHJ1Y3QgaW9fcGd0YWJsZSAqaW9wOworCisJaWYgKGNmZy0+aWFzID4g MzIgfHwgY2ZnLT5vYXMgPiA0MCkKKwkJcmV0dXJuIE5VTEw7CisKKwljZmctPnBnc2l6ZV9iaXRt YXAgJj0gKFNaXzRLIHwgU1pfMk0gfCBTWl8xRyk7CisJaW9wID0gYXJtXzY0X2xwYWVfYWxsb2Nf cGd0YWJsZV9zMShjZmcsIGNvb2tpZSk7CisJaWYgKGlvcCkgeworCQljZmctPmFybV9scGFlX3Mx X2NmZy50Y3IgfD0gQVJNXzMyX0xQQUVfVENSX0VBRTsKKwkJY2ZnLT5hcm1fbHBhZV9zMV9jZmcu dGNyICY9IDB4ZmZmZmZmZmY7CisJfQorCisJcmV0dXJuIGlvcDsKK30KKworc3RhdGljIHN0cnVj dCBpb19wZ3RhYmxlICoKK2FybV8zMl9scGFlX2FsbG9jX3BndGFibGVfczIoc3RydWN0IGlvX3Bn dGFibGVfY2ZnICpjZmcsIHZvaWQgKmNvb2tpZSkKK3sKKwlzdHJ1Y3QgaW9fcGd0YWJsZSAqaW9w OworCisJaWYgKGNmZy0+aWFzID4gNDAgfHwgY2ZnLT5vYXMgPiA0MCkKKwkJcmV0dXJuIE5VTEw7 CisKKwljZmctPnBnc2l6ZV9iaXRtYXAgJj0gKFNaXzRLIHwgU1pfMk0gfCBTWl8xRyk7CisJaW9w ID0gYXJtXzY0X2xwYWVfYWxsb2NfcGd0YWJsZV9zMihjZmcsIGNvb2tpZSk7CisJaWYgKGlvcCkK KwkJY2ZnLT5hcm1fbHBhZV9zMl9jZmcudnRjciAmPSAweGZmZmZmZmZmOworCisJcmV0dXJuIGlv cDsKK30KKworc3RydWN0IGlvX3BndGFibGVfaW5pdF9mbnMgaW9fcGd0YWJsZV9hcm1fNjRfbHBh ZV9zMV9pbml0X2ZucyA9IHsKKwkuYWxsb2MJPSBhcm1fNjRfbHBhZV9hbGxvY19wZ3RhYmxlX3Mx LAorCS5mcmVlCT0gYXJtX2xwYWVfZnJlZV9wZ3RhYmxlLAorfTsKKworc3RydWN0IGlvX3BndGFi bGVfaW5pdF9mbnMgaW9fcGd0YWJsZV9hcm1fNjRfbHBhZV9zMl9pbml0X2ZucyA9IHsKKwkuYWxs b2MJPSBhcm1fNjRfbHBhZV9hbGxvY19wZ3RhYmxlX3MyLAorCS5mcmVlCT0gYXJtX2xwYWVfZnJl ZV9wZ3RhYmxlLAorfTsKKworc3RydWN0IGlvX3BndGFibGVfaW5pdF9mbnMgaW9fcGd0YWJsZV9h cm1fMzJfbHBhZV9zMV9pbml0X2ZucyA9IHsKKwkuYWxsb2MJPSBhcm1fMzJfbHBhZV9hbGxvY19w Z3RhYmxlX3MxLAorCS5mcmVlCT0gYXJtX2xwYWVfZnJlZV9wZ3RhYmxlLAorfTsKKworc3RydWN0 IGlvX3BndGFibGVfaW5pdF9mbnMgaW9fcGd0YWJsZV9hcm1fMzJfbHBhZV9zMl9pbml0X2ZucyA9 IHsKKwkuYWxsb2MJPSBhcm1fMzJfbHBhZV9hbGxvY19wZ3RhYmxlX3MyLAorCS5mcmVlCT0gYXJt X2xwYWVfZnJlZV9wZ3RhYmxlLAorfTsKKworI2lmZGVmIENPTkZJR19JT01NVV9JT19QR1RBQkxF X0xQQUVfU0VMRlRFU1QKKworc3RhdGljIHN0cnVjdCBpb19wZ3RhYmxlX2NmZyAqY2ZnX2Nvb2tp ZTsKKworc3RhdGljIHZvaWQgZHVtbXlfdGxiX2ZsdXNoX2FsbCh2b2lkICpjb29raWUpCit7CisJ V0FSTl9PTihjb29raWUgIT0gY2ZnX2Nvb2tpZSk7Cit9CisKK3N0YXRpYyB2b2lkIGR1bW15X3Rs Yl9hZGRfZmx1c2godW5zaWduZWQgbG9uZyBpb3ZhLCBzaXplX3Qgc2l6ZSwKKwkJCQlzaXplX3Qg Z3JhbnVsZSwgYm9vbCBsZWFmLCB2b2lkICpjb29raWUpCit7CisJV0FSTl9PTihjb29raWUgIT0g Y2ZnX2Nvb2tpZSk7CisJV0FSTl9PTighKHNpemUgJiBjZmdfY29va2llLT5wZ3NpemVfYml0bWFw KSk7Cit9CisKK3N0YXRpYyB2b2lkIGR1bW15X3RsYl9zeW5jKHZvaWQgKmNvb2tpZSkKK3sKKwlX QVJOX09OKGNvb2tpZSAhPSBjZmdfY29va2llKTsKK30KKworc3RhdGljIHN0cnVjdCBpb21tdV9n YXRoZXJfb3BzIGR1bW15X3RsYl9vcHMgX19pbml0ZGF0YSA9IHsKKwkudGxiX2ZsdXNoX2FsbAk9 IGR1bW15X3RsYl9mbHVzaF9hbGwsCisJLnRsYl9hZGRfZmx1c2gJPSBkdW1teV90bGJfYWRkX2Zs dXNoLAorCS50bGJfc3luYwk9IGR1bW15X3RsYl9zeW5jLAorfTsKKworc3RhdGljIHZvaWQgX19p bml0IGFybV9scGFlX2R1bXBfb3BzKHN0cnVjdCBpb19wZ3RhYmxlX29wcyAqb3BzKQoreworCXN0 cnVjdCBhcm1fbHBhZV9pb19wZ3RhYmxlICpkYXRhID0gaW9fcGd0YWJsZV9vcHNfdG9fZGF0YShv cHMpOworCXN0cnVjdCBpb19wZ3RhYmxlX2NmZyAqY2ZnID0gJmRhdGEtPmlvcC5jZmc7CisKKwlw cl9lcnIoImNmZzogcGdzaXplX2JpdG1hcCAweCVseCwgaWFzICV1LWJpdFxuIiwKKwkJY2ZnLT5w Z3NpemVfYml0bWFwLCBjZmctPmlhcyk7CisJcHJfZXJyKCJkYXRhOiAlZCBsZXZlbHMsIDB4JXp4 IHBnZF9zaXplLCAlbHUgcGdfc2hpZnQsICVsdSBiaXRzX3Blcl9sZXZlbCwgcGdkIEAgJXBcbiIs CisJCWRhdGEtPmxldmVscywgZGF0YS0+cGdkX3NpemUsIGRhdGEtPnBnX3NoaWZ0LAorCQlkYXRh LT5iaXRzX3Blcl9sZXZlbCwgZGF0YS0+cGdkKTsKK30KKworI2RlZmluZSBfX0ZBSUwob3BzLCBp KQkoewkJCQkJCVwKKwkJV0FSTigxLCAic2VsZnRlc3Q6IHRlc3QgZmFpbGVkIGZvciBmbXQgaWR4 ICVkXG4iLCAoaSkpOwlcCisJCWFybV9scGFlX2R1bXBfb3BzKG9wcyk7CQkJCQlcCisJCXNlbGZ0 ZXN0X3J1bm5pbmcgPSBmYWxzZTsJCQkJXAorCQktRUZBVUxUOwkJCQkJCVwKK30pCisKK3N0YXRp YyBpbnQgX19pbml0IGFybV9scGFlX3J1bl90ZXN0cyhzdHJ1Y3QgaW9fcGd0YWJsZV9jZmcgKmNm ZykKK3sKKwlzdGF0aWMgY29uc3QgZW51bSBpb19wZ3RhYmxlX2ZtdCBmbXRzW10gPSB7CisJCUFS TV82NF9MUEFFX1MxLAorCQlBUk1fNjRfTFBBRV9TMiwKKwl9OworCisJaW50IGksIGo7CisJdW5z aWduZWQgbG9uZyBpb3ZhOworCXNpemVfdCBzaXplOworCXN0cnVjdCBpb19wZ3RhYmxlX29wcyAq b3BzOworCisJc2VsZnRlc3RfcnVubmluZyA9IHRydWU7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJS QVlfU0laRShmbXRzKTsgKytpKSB7CisJCWNmZ19jb29raWUgPSBjZmc7CisJCW9wcyA9IGFsbG9j X2lvX3BndGFibGVfb3BzKGZtdHNbaV0sIGNmZywgY2ZnKTsKKwkJaWYgKCFvcHMpIHsKKwkJCXBy X2Vycigic2VsZnRlc3Q6IGZhaWxlZCB0byBhbGxvY2F0ZSBpbyBwZ3RhYmxlIG9wc1xuIik7CisJ CQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCisJCS8qCisJCSAqIEluaXRpYWwgc2FuaXR5IGNoZWNr cy4KKwkJICogRW1wdHkgcGFnZSB0YWJsZXMgc2hvdWxkbid0IHByb3ZpZGUgYW55IHRyYW5zbGF0 aW9ucy4KKwkJICovCisJCWlmIChvcHMtPmlvdmFfdG9fcGh5cyhvcHMsIDQyKSkKKwkJCXJldHVy biBfX0ZBSUwob3BzLCBpKTsKKworCQlpZiAob3BzLT5pb3ZhX3RvX3BoeXMob3BzLCBTWl8xRyAr IDQyKSkKKwkJCXJldHVybiBfX0ZBSUwob3BzLCBpKTsKKworCQlpZiAob3BzLT5pb3ZhX3RvX3Bo eXMob3BzLCBTWl8yRyArIDQyKSkKKwkJCXJldHVybiBfX0ZBSUwob3BzLCBpKTsKKworCQkvKgor CQkgKiBEaXN0aW5jdCBtYXBwaW5ncyBvZiBkaWZmZXJlbnQgZ3JhbnVsZSBzaXplcy4KKwkJICov CisJCWlvdmEgPSAwOworCQlqID0gZmluZF9maXJzdF9iaXQoJmNmZy0+cGdzaXplX2JpdG1hcCwg QklUU19QRVJfTE9ORyk7CisJCXdoaWxlIChqICE9IEJJVFNfUEVSX0xPTkcpIHsKKwkJCXNpemUg PSAxVUwgPDwgajsKKworCQkJaWYgKG9wcy0+bWFwKG9wcywgaW92YSwgaW92YSwgc2l6ZSwgSU9N TVVfUkVBRCB8CisJCQkJCQkJICAgIElPTU1VX1dSSVRFIHwKKwkJCQkJCQkgICAgSU9NTVVfTk9F WEVDIHwKKwkJCQkJCQkgICAgSU9NTVVfQ0FDSEUpKQorCQkJCXJldHVybiBfX0ZBSUwob3BzLCBp KTsKKworCQkJLyogT3ZlcmxhcHBpbmcgbWFwcGluZ3MgKi8KKwkJCWlmICghb3BzLT5tYXAob3Bz LCBpb3ZhLCBpb3ZhICsgc2l6ZSwgc2l6ZSwKKwkJCQkgICAgICBJT01NVV9SRUFEIHwgSU9NTVVf Tk9FWEVDKSkKKwkJCQlyZXR1cm4gX19GQUlMKG9wcywgaSk7CisKKwkJCWlmIChvcHMtPmlvdmFf dG9fcGh5cyhvcHMsIGlvdmEgKyA0MikgIT0gKGlvdmEgKyA0MikpCisJCQkJcmV0dXJuIF9fRkFJ TChvcHMsIGkpOworCisJCQlpb3ZhICs9IFNaXzFHOworCQkJaisrOworCQkJaiA9IGZpbmRfbmV4 dF9iaXQoJmNmZy0+cGdzaXplX2JpdG1hcCwgQklUU19QRVJfTE9ORywgaik7CisJCX0KKworCQkv KiBQYXJ0aWFsIHVubWFwICovCisJCXNpemUgPSAxVUwgPDwgX19mZnMoY2ZnLT5wZ3NpemVfYml0 bWFwKTsKKwkJaWYgKG9wcy0+dW5tYXAob3BzLCBTWl8xRyArIHNpemUsIHNpemUpICE9IHNpemUp CisJCQlyZXR1cm4gX19GQUlMKG9wcywgaSk7CisKKwkJLyogUmVtYXAgb2YgcGFydGlhbCB1bm1h cCAqLworCQlpZiAob3BzLT5tYXAob3BzLCBTWl8xRyArIHNpemUsIHNpemUsIHNpemUsIElPTU1V X1JFQUQpKQorCQkJcmV0dXJuIF9fRkFJTChvcHMsIGkpOworCisJCWlmIChvcHMtPmlvdmFfdG9f cGh5cyhvcHMsIFNaXzFHICsgc2l6ZSArIDQyKSAhPSAoc2l6ZSArIDQyKSkKKwkJCXJldHVybiBf X0ZBSUwob3BzLCBpKTsKKworCQkvKiBGdWxsIHVubWFwICovCisJCWlvdmEgPSAwOworCQlqID0g ZmluZF9maXJzdF9iaXQoJmNmZy0+cGdzaXplX2JpdG1hcCwgQklUU19QRVJfTE9ORyk7CisJCXdo aWxlIChqICE9IEJJVFNfUEVSX0xPTkcpIHsKKwkJCXNpemUgPSAxVUwgPDwgajsKKworCQkJaWYg KG9wcy0+dW5tYXAob3BzLCBpb3ZhLCBzaXplKSAhPSBzaXplKQorCQkJCXJldHVybiBfX0ZBSUwo b3BzLCBpKTsKKworCQkJaWYgKG9wcy0+aW92YV90b19waHlzKG9wcywgaW92YSArIDQyKSkKKwkJ CQlyZXR1cm4gX19GQUlMKG9wcywgaSk7CisKKwkJCS8qIFJlbWFwIGZ1bGwgYmxvY2sgKi8KKwkJ CWlmIChvcHMtPm1hcChvcHMsIGlvdmEsIGlvdmEsIHNpemUsIElPTU1VX1dSSVRFKSkKKwkJCQly ZXR1cm4gX19GQUlMKG9wcywgaSk7CisKKwkJCWlmIChvcHMtPmlvdmFfdG9fcGh5cyhvcHMsIGlv dmEgKyA0MikgIT0gKGlvdmEgKyA0MikpCisJCQkJcmV0dXJuIF9fRkFJTChvcHMsIGkpOworCisJ CQlpb3ZhICs9IFNaXzFHOworCQkJaisrOworCQkJaiA9IGZpbmRfbmV4dF9iaXQoJmNmZy0+cGdz aXplX2JpdG1hcCwgQklUU19QRVJfTE9ORywgaik7CisJCX0KKworCQlmcmVlX2lvX3BndGFibGVf b3BzKG9wcyk7CisJfQorCisJc2VsZnRlc3RfcnVubmluZyA9IGZhbHNlOworCXJldHVybiAwOwor fQorCitzdGF0aWMgaW50IF9faW5pdCBhcm1fbHBhZV9kb19zZWxmdGVzdHModm9pZCkKK3sKKwlz dGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBwZ3NpemVbXSA9IHsKKwkJU1pfNEsgfCBTWl8yTSB8 IFNaXzFHLAorCQlTWl8xNksgfCBTWl8zMk0sCisJCVNaXzY0SyB8IFNaXzUxMk0sCisJfTsKKwor CXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgaWFzW10gPSB7CisJCTMyLCAzNiwgNDAsIDQyLCA0 NCwgNDgsCisJfTsKKworCWludCBpLCBqLCBwYXNzID0gMCwgZmFpbCA9IDA7CisJc3RydWN0IGlv X3BndGFibGVfY2ZnIGNmZyA9IHsKKwkJLnRsYiA9ICZkdW1teV90bGJfb3BzLAorCQkub2FzID0g NDgsCisJfTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBnc2l6ZSk7ICsraSkgewor CQlmb3IgKGogPSAwOyBqIDwgQVJSQVlfU0laRShpYXMpOyArK2opIHsKKwkJCWNmZy5wZ3NpemVf Yml0bWFwID0gcGdzaXplW2ldOworCQkJY2ZnLmlhcyA9IGlhc1tqXTsKKwkJCXByX2luZm8oInNl bGZ0ZXN0OiBwZ3NpemVfYml0bWFwIDB4JTA4bHgsIElBUyAldVxuIiwKKwkJCQlwZ3NpemVbaV0s IGlhc1tqXSk7CisJCQlpZiAoYXJtX2xwYWVfcnVuX3Rlc3RzKCZjZmcpKQorCQkJCWZhaWwrKzsK KwkJCWVsc2UKKwkJCQlwYXNzKys7CisJCX0KKwl9CisKKwlwcl9pbmZvKCJzZWxmdGVzdDogY29t cGxldGVkIHdpdGggJWQgUEFTUyAlZCBGQUlMXG4iLCBwYXNzLCBmYWlsKTsKKwlyZXR1cm4gZmFp bCA/IC1FRkFVTFQgOiAwOworfQorc3Vic3lzX2luaXRjYWxsKGFybV9scGFlX2RvX3NlbGZ0ZXN0 cyk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL3hlbi9kcml2ZXJzL3Bhc3N0aHJvdWdoL2FybS9pby1w Z3RhYmxlLmMgYi94ZW4vZHJpdmVycy9wYXNzdGhyb3VnaC9hcm0vaW8tcGd0YWJsZS5jCm5ldyBm aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyNzU1OGQKLS0tIC9kZXYvbnVsbAorKysg Yi94ZW4vZHJpdmVycy9wYXNzdGhyb3VnaC9hcm0vaW8tcGd0YWJsZS5jCkBAIC0wLDAgKzEsNzkg QEAKKy8qCisgKiBHZW5lcmljIHBhZ2UgdGFibGUgYWxsb2NhdG9yIGZvciBJT01NVXMuCisgKgor ICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0 IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwg UHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29m dHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4g dGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJS QU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFC SUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBH TlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBz aG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNl bnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3 LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgQVJNIExpbWl0 ZWQKKyAqCisgKiBBdXRob3I6IFdpbGwgRGVhY29uIDx3aWxsLmRlYWNvbkBhcm0uY29tPgorICov CisKKyNpbmNsdWRlIDxsaW51eC9idWcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNp bmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjaW5jbHVkZSAiaW8tcGd0YWJsZS5oIgorCitzdGF0 aWMgY29uc3Qgc3RydWN0IGlvX3BndGFibGVfaW5pdF9mbnMgKgoraW9fcGd0YWJsZV9pbml0X3Rh YmxlW0lPX1BHVEFCTEVfTlVNX0ZNVFNdID0geworI2lmZGVmIENPTkZJR19JT01NVV9JT19QR1RB QkxFX0xQQUUKKwlbQVJNXzMyX0xQQUVfUzFdID0gJmlvX3BndGFibGVfYXJtXzMyX2xwYWVfczFf aW5pdF9mbnMsCisJW0FSTV8zMl9MUEFFX1MyXSA9ICZpb19wZ3RhYmxlX2FybV8zMl9scGFlX3My X2luaXRfZm5zLAorCVtBUk1fNjRfTFBBRV9TMV0gPSAmaW9fcGd0YWJsZV9hcm1fNjRfbHBhZV9z MV9pbml0X2ZucywKKwlbQVJNXzY0X0xQQUVfUzJdID0gJmlvX3BndGFibGVfYXJtXzY0X2xwYWVf czJfaW5pdF9mbnMsCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfSU9NTVVfSU9fUEdUQUJMRV9BUk1W N1MKKwlbQVJNX1Y3U10gPSAmaW9fcGd0YWJsZV9hcm1fdjdzX2luaXRfZm5zLAorI2VuZGlmCit9 OworCitzdHJ1Y3QgaW9fcGd0YWJsZV9vcHMgKmFsbG9jX2lvX3BndGFibGVfb3BzKGVudW0gaW9f cGd0YWJsZV9mbXQgZm10LAorCQkJCQkgICAgc3RydWN0IGlvX3BndGFibGVfY2ZnICpjZmcsCisJ CQkJCSAgICB2b2lkICpjb29raWUpCit7CisJc3RydWN0IGlvX3BndGFibGUgKmlvcDsKKwljb25z dCBzdHJ1Y3QgaW9fcGd0YWJsZV9pbml0X2ZucyAqZm5zOworCisJaWYgKGZtdCA+PSBJT19QR1RB QkxFX05VTV9GTVRTKQorCQlyZXR1cm4gTlVMTDsKKworCWZucyA9IGlvX3BndGFibGVfaW5pdF90 YWJsZVtmbXRdOworCWlmICghZm5zKQorCQlyZXR1cm4gTlVMTDsKKworCWlvcCA9IGZucy0+YWxs b2MoY2ZnLCBjb29raWUpOworCWlmICghaW9wKQorCQlyZXR1cm4gTlVMTDsKKworCWlvcC0+Zm10 CT0gZm10OworCWlvcC0+Y29va2llCT0gY29va2llOworCWlvcC0+Y2ZnCT0gKmNmZzsKKworCXJl dHVybiAmaW9wLT5vcHM7Cit9CisKKy8qCisgKiBJdCBpcyB0aGUgSU9NTVUgZHJpdmVyJ3MgcmVz cG9uc2liaWxpdHkgdG8gZW5zdXJlIHRoYXQgdGhlIHBhZ2UgdGFibGUKKyAqIGlzIG5vIGxvbmdl ciBhY2Nlc3NpYmxlIHRvIHRoZSB3YWxrZXIgYnkgdGhpcyBwb2ludC4KKyAqLwordm9pZCBmcmVl X2lvX3BndGFibGVfb3BzKHN0cnVjdCBpb19wZ3RhYmxlX29wcyAqb3BzKQoreworCXN0cnVjdCBp b19wZ3RhYmxlICppb3A7CisKKwlpZiAoIW9wcykKKwkJcmV0dXJuOworCisJaW9wID0gY29udGFp bmVyX29mKG9wcywgc3RydWN0IGlvX3BndGFibGUsIG9wcyk7CisJaW9fcGd0YWJsZV90bGJfZmx1 c2hfYWxsKGlvcCk7CisJaW9fcGd0YWJsZV9pbml0X3RhYmxlW2lvcC0+Zm10XS0+ZnJlZShpb3Ap OworfQpkaWZmIC0tZ2l0IGEveGVuL2RyaXZlcnMvcGFzc3Rocm91Z2gvYXJtL2lvLXBndGFibGUu aCBiL3hlbi9kcml2ZXJzL3Bhc3N0aHJvdWdoL2FybS9pby1wZ3RhYmxlLmgKbmV3IGZpbGUgbW9k ZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY5ZDgyYwotLS0gL2Rldi9udWxsCisrKyBiL3hlbi9k cml2ZXJzL3Bhc3N0aHJvdWdoL2FybS9pby1wZ3RhYmxlLmgKQEAgLTAsMCArMSwyMDggQEAKKyNp Zm5kZWYgX19JT19QR1RBQkxFX0gKKyNkZWZpbmUgX19JT19QR1RBQkxFX0gKKyNpbmNsdWRlIDxs aW51eC9iaXRvcHMuaD4KKworLyoKKyAqIFB1YmxpYyBBUEkgZm9yIHVzZSBieSBJT01NVSBkcml2 ZXJzCisgKi8KK2VudW0gaW9fcGd0YWJsZV9mbXQgeworCUFSTV8zMl9MUEFFX1MxLAorCUFSTV8z Ml9MUEFFX1MyLAorCUFSTV82NF9MUEFFX1MxLAorCUFSTV82NF9MUEFFX1MyLAorCUFSTV9WN1Ms CisJSU9fUEdUQUJMRV9OVU1fRk1UUywKK307CisKKy8qKgorICogc3RydWN0IGlvbW11X2dhdGhl cl9vcHMgLSBJT01NVSBjYWxsYmFja3MgZm9yIFRMQiBhbmQgcGFnZSB0YWJsZSBtYW5hZ2VtZW50 LgorICoKKyAqIEB0bGJfZmx1c2hfYWxsOiBTeW5jaHJvbm91c2x5IGludmFsaWRhdGUgdGhlIGVu dGlyZSBUTEIgY29udGV4dC4KKyAqIEB0bGJfYWRkX2ZsdXNoOiBRdWV1ZSB1cCBhIFRMQiBpbnZh bGlkYXRpb24gZm9yIGEgdmlydHVhbCBhZGRyZXNzIHJhbmdlLgorICogQHRsYl9zeW5jOiAgICAg IEVuc3VyZSBhbnkgcXVldWVkIFRMQiBpbnZhbGlkYXRpb24gaGFzIHRha2VuIGVmZmVjdCwgYW5k CisgKiAgICAgICAgICAgICAgICAgYW55IGNvcnJlc3BvbmRpbmcgcGFnZSB0YWJsZSB1cGRhdGVz IGFyZSB2aXNpYmxlIHRvIHRoZQorICogICAgICAgICAgICAgICAgIElPTU1VLgorICoKKyAqIE5v dGUgdGhhdCB0aGVzZSBjYW4gYWxsIGJlIGNhbGxlZCBpbiBhdG9taWMgY29udGV4dCBhbmQgbXVz dCB0aGVyZWZvcmUKKyAqIG5vdCBibG9jay4KKyAqLworc3RydWN0IGlvbW11X2dhdGhlcl9vcHMg eworCXZvaWQgKCp0bGJfZmx1c2hfYWxsKSh2b2lkICpjb29raWUpOworCXZvaWQgKCp0bGJfYWRk X2ZsdXNoKSh1bnNpZ25lZCBsb25nIGlvdmEsIHNpemVfdCBzaXplLCBzaXplX3QgZ3JhbnVsZSwK KwkJCSAgICAgIGJvb2wgbGVhZiwgdm9pZCAqY29va2llKTsKKwl2b2lkICgqdGxiX3N5bmMpKHZv aWQgKmNvb2tpZSk7Cit9OworCisvKioKKyAqIHN0cnVjdCBpb19wZ3RhYmxlX2NmZyAtIENvbmZp Z3VyYXRpb24gZGF0YSBmb3IgYSBzZXQgb2YgcGFnZSB0YWJsZXMuCisgKgorICogQHF1aXJrczog ICAgICAgIEEgYml0bWFwIG9mIGhhcmR3YXJlIHF1aXJrcyB0aGF0IHJlcXVpcmUgc29tZSBzcGVj aWFsCisgKiAgICAgICAgICAgICAgICAgYWN0aW9uIGJ5IHRoZSBsb3ctbGV2ZWwgcGFnZSB0YWJs ZSBhbGxvY2F0b3IuCisgKiBAcGdzaXplX2JpdG1hcDogQSBiaXRtYXAgb2YgcGFnZSBzaXplcyBz dXBwb3J0ZWQgYnkgdGhpcyBzZXQgb2YgcGFnZQorICogICAgICAgICAgICAgICAgIHRhYmxlcy4K KyAqIEBpYXM6ICAgICAgICAgICBJbnB1dCBhZGRyZXNzIChpb3ZhKSBzaXplLCBpbiBiaXRzLgor ICogQG9hczogICAgICAgICAgIE91dHB1dCBhZGRyZXNzIChwYWRkcikgc2l6ZSwgaW4gYml0cy4K KyAqIEB0bGI6ICAgICAgICAgICBUTEIgbWFuYWdlbWVudCBjYWxsYmFja3MgZm9yIHRoaXMgc2V0 IG9mIHRhYmxlcy4KKyAqIEBpb21tdV9kZXY6ICAgICBUaGUgZGV2aWNlIHJlcHJlc2VudGluZyB0 aGUgRE1BIGNvbmZpZ3VyYXRpb24gZm9yIHRoZQorICogICAgICAgICAgICAgICAgIHBhZ2UgdGFi bGUgd2Fsa2VyLgorICovCitzdHJ1Y3QgaW9fcGd0YWJsZV9jZmcgeworCS8qCisJICogSU9fUEdU QUJMRV9RVUlSS19BUk1fTlM6IChBUk0gZm9ybWF0cykgU2V0IE5TIGFuZCBOU1RBQkxFIGJpdHMg aW4KKwkgKglzdGFnZSAxIFBURXMsIGZvciBoYXJkd2FyZSB3aGljaCBpbnNpc3RzIG9uIHZhbGlk YXRpbmcgdGhlbQorCSAqCWV2ZW4gaW4Jbm9uLXNlY3VyZSBzdGF0ZSB3aGVyZSB0aGV5IHNob3Vs ZCBub3JtYWxseSBiZSBpZ25vcmVkLgorCSAqCisJICogSU9fUEdUQUJMRV9RVUlSS19OT19QRVJN UzogSWdub3JlIHRoZSBJT01NVV9SRUFELCBJT01NVV9XUklURSBhbmQKKwkgKglJT01NVV9OT0VY RUMgZmxhZ3MgYW5kIG1hcCBldmVyeXRoaW5nIHdpdGggZnVsbCBhY2Nlc3MsIGZvcgorCSAqCWhh cmR3YXJlIHdoaWNoIGRvZXMgbm90IGltcGxlbWVudCB0aGUgcGVybWlzc2lvbnMgb2YgYSBnaXZl bgorCSAqCWZvcm1hdCwgYW5kL29yIHJlcXVpcmVzIHNvbWUgZm9ybWF0LXNwZWNpZmljIGRlZmF1 bHQgdmFsdWUuCisJICoKKwkgKiBJT19QR1RBQkxFX1FVSVJLX1RMQklfT05fTUFQOiBJZiB0aGUg Zm9ybWF0IGZvcmJpZHMgY2FjaGluZyBpbnZhbGlkCisJICoJKHVubWFwcGVkKSBlbnRyaWVzIGJ1 dCB0aGUgaGFyZHdhcmUgbWlnaHQgZG8gc28gYW55d2F5LCBwZXJmb3JtCisJICoJVExCIG1haW50 ZW5hbmNlIHdoZW4gbWFwcGluZyBhcyB3ZWxsIGFzIHdoZW4gdW5tYXBwaW5nLgorCSAqCisJICog SU9fUEdUQUJMRV9RVUlSS19BUk1fTVRLXzRHQjogKEFSTSB2N3MgZm9ybWF0KSBTZXQgYml0IDkg aW4gYWxsCisJICoJUFRFcywgZm9yIE1lZGlhdGVrIElPTU1VcyB3aGljaCB0cmVhdCBpdCBhcyBh IDMzcmQgYWRkcmVzcyBiaXQKKwkgKgl3aGVuIHRoZSBTb0MgaXMgaW4gIjRHQiBtb2RlIiBhbmQg dGhleSBjYW4gb25seSBhY2Nlc3MgdGhlIGhpZ2gKKwkgKglyZW1hcCBvZiBEUkFNICgweDFfMDAw MDAwMDAgdG8gMHgxX2ZmZmZmZmZmKS4KKwkgKi8KKwkjZGVmaW5lIElPX1BHVEFCTEVfUVVJUktf QVJNX05TCQlCSVQoMCkKKwkjZGVmaW5lIElPX1BHVEFCTEVfUVVJUktfTk9fUEVSTVMJQklUKDEp CisJI2RlZmluZSBJT19QR1RBQkxFX1FVSVJLX1RMQklfT05fTUFQCUJJVCgyKQorCSNkZWZpbmUg SU9fUEdUQUJMRV9RVUlSS19BUk1fTVRLXzRHQglCSVQoMykKKwl1bnNpZ25lZCBsb25nCQkJcXVp cmtzOworCXVuc2lnbmVkIGxvbmcJCQlwZ3NpemVfYml0bWFwOworCXVuc2lnbmVkIGludAkJCWlh czsKKwl1bnNpZ25lZCBpbnQJCQlvYXM7CisJY29uc3Qgc3RydWN0IGlvbW11X2dhdGhlcl9vcHMJ KnRsYjsKKwlzdHJ1Y3QgZGV2aWNlCQkJKmlvbW11X2RldjsKKworCS8qIExvdy1sZXZlbCBkYXRh IHNwZWNpZmljIHRvIHRoZSB0YWJsZSBmb3JtYXQgKi8KKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJ CQl1NjQJdHRiclsyXTsKKwkJCXU2NAl0Y3I7CisJCQl1NjQJbWFpclsyXTsKKwkJfSBhcm1fbHBh ZV9zMV9jZmc7CisKKwkJc3RydWN0IHsKKwkJCXU2NAl2dHRicjsKKwkJCXU2NAl2dGNyOworCQl9 IGFybV9scGFlX3MyX2NmZzsKKworCQlzdHJ1Y3QgeworCQkJdTMyCXR0YnJbMl07CisJCQl1MzIJ dGNyOworCQkJdTMyCW5tcnI7CisJCQl1MzIJcHJycjsKKwkJfSBhcm1fdjdzX2NmZzsKKwl9Owor fTsKKworLyoqCisgKiBzdHJ1Y3QgaW9fcGd0YWJsZV9vcHMgLSBQYWdlIHRhYmxlIG1hbmlwdWxh dGlvbiBBUEkgZm9yIElPTU1VIGRyaXZlcnMuCisgKgorICogQG1hcDogICAgICAgICAgTWFwIGEg cGh5c2ljYWxseSBjb250aWd1b3VzIG1lbW9yeSByZWdpb24uCisgKiBAdW5tYXA6ICAgICAgICBV bm1hcCBhIHBoeXNpY2FsbHkgY29udGlndW91cyBtZW1vcnkgcmVnaW9uLgorICogQGlvdmFfdG9f cGh5czogVHJhbnNsYXRlIGlvdmEgdG8gcGh5c2ljYWwgYWRkcmVzcy4KKyAqCisgKiBUaGVzZSBm dW5jdGlvbnMgbWFwIGRpcmVjdGx5IG9udG8gdGhlIGlvbW11X29wcyBtZW1iZXIgZnVuY3Rpb25z IHdpdGgKKyAqIHRoZSBzYW1lIG5hbWVzLgorICovCitzdHJ1Y3QgaW9fcGd0YWJsZV9vcHMgewor CWludCAoKm1hcCkoc3RydWN0IGlvX3BndGFibGVfb3BzICpvcHMsIHVuc2lnbmVkIGxvbmcgaW92 YSwKKwkJICAgcGh5c19hZGRyX3QgcGFkZHIsIHNpemVfdCBzaXplLCBpbnQgcHJvdCk7CisJaW50 ICgqdW5tYXApKHN0cnVjdCBpb19wZ3RhYmxlX29wcyAqb3BzLCB1bnNpZ25lZCBsb25nIGlvdmEs CisJCSAgICAgc2l6ZV90IHNpemUpOworCXBoeXNfYWRkcl90ICgqaW92YV90b19waHlzKShzdHJ1 Y3QgaW9fcGd0YWJsZV9vcHMgKm9wcywKKwkJCQkgICAgdW5zaWduZWQgbG9uZyBpb3ZhKTsKK307 CisKKy8qKgorICogYWxsb2NfaW9fcGd0YWJsZV9vcHMoKSAtIEFsbG9jYXRlIGEgcGFnZSB0YWJs ZSBhbGxvY2F0b3IgZm9yIHVzZSBieSBhbiBJT01NVS4KKyAqCisgKiBAZm10OiAgICBUaGUgcGFn ZSB0YWJsZSBmb3JtYXQuCisgKiBAY2ZnOiAgICBUaGUgcGFnZSB0YWJsZSBjb25maWd1cmF0aW9u LiBUaGlzIHdpbGwgYmUgbW9kaWZpZWQgdG8gcmVwcmVzZW50CisgKiAgICAgICAgICB0aGUgY29u ZmlndXJhdGlvbiBhY3R1YWxseSBwcm92aWRlZCBieSB0aGUgYWxsb2NhdG9yIChlLmcuIHRoZQor ICogICAgICAgICAgcGdzaXplX2JpdG1hcCBtYXkgYmUgcmVzdHJpY3RlZCkuCisgKiBAY29va2ll OiBBbiBvcGFxdWUgdG9rZW4gcHJvdmlkZWQgYnkgdGhlIElPTU1VIGRyaXZlciBhbmQgcGFzc2Vk IGJhY2sgdG8KKyAqICAgICAgICAgIHRoZSBjYWxsYmFjayByb3V0aW5lcyBpbiBjZmctPnRsYi4K KyAqLworc3RydWN0IGlvX3BndGFibGVfb3BzICphbGxvY19pb19wZ3RhYmxlX29wcyhlbnVtIGlv X3BndGFibGVfZm10IGZtdCwKKwkJCQkJICAgIHN0cnVjdCBpb19wZ3RhYmxlX2NmZyAqY2ZnLAor CQkJCQkgICAgdm9pZCAqY29va2llKTsKKworLyoqCisgKiBmcmVlX2lvX3BndGFibGVfb3BzKCkg LSBGcmVlIGFuIGlvX3BndGFibGVfb3BzIHN0cnVjdHVyZS4gVGhlIGNhbGxlcgorICogICAgICAg ICAgICAgICAgICAgICAgICAgKm11c3QqIGVuc3VyZSB0aGF0IHRoZSBwYWdlIHRhYmxlIGlzIG5v IGxvbmdlcgorICogICAgICAgICAgICAgICAgICAgICAgICAgbGl2ZSwgYnV0IHRoZSBUTEIgY2Fu IGJlIGRpcnR5LgorICoKKyAqIEBvcHM6IFRoZSBvcHMgcmV0dXJuZWQgZnJvbSBhbGxvY19pb19w Z3RhYmxlX29wcy4KKyAqLwordm9pZCBmcmVlX2lvX3BndGFibGVfb3BzKHN0cnVjdCBpb19wZ3Rh YmxlX29wcyAqb3BzKTsKKworCisvKgorICogSW50ZXJuYWwgc3RydWN0dXJlcyBmb3IgcGFnZSB0 YWJsZSBhbGxvY2F0b3IgaW1wbGVtZW50YXRpb25zLgorICovCisKKy8qKgorICogc3RydWN0IGlv X3BndGFibGUgLSBJbnRlcm5hbCBzdHJ1Y3R1cmUgZGVzY3JpYmluZyBhIHNldCBvZiBwYWdlIHRh Ymxlcy4KKyAqCisgKiBAZm10OiAgICBUaGUgcGFnZSB0YWJsZSBmb3JtYXQuCisgKiBAY29va2ll OiBBbiBvcGFxdWUgdG9rZW4gcHJvdmlkZWQgYnkgdGhlIElPTU1VIGRyaXZlciBhbmQgcGFzc2Vk IGJhY2sgdG8KKyAqICAgICAgICAgIGFueSBjYWxsYmFjayByb3V0aW5lcy4KKyAqIEB0bGJfc3lu Y19wZW5kaW5nOiBQcml2YXRlIGZsYWcgZm9yIG9wdGltaXNpbmcgb3V0IHJlZHVuZGFudCBzeW5j cy4KKyAqIEBjZmc6ICAgIEEgY29weSBvZiB0aGUgcGFnZSB0YWJsZSBjb25maWd1cmF0aW9uLgor ICogQG9wczogICAgVGhlIHBhZ2UgdGFibGUgb3BlcmF0aW9ucyBpbiB1c2UgZm9yIHRoaXMgc2V0 IG9mIHBhZ2UgdGFibGVzLgorICovCitzdHJ1Y3QgaW9fcGd0YWJsZSB7CisJZW51bSBpb19wZ3Rh YmxlX2ZtdAlmbXQ7CisJdm9pZAkJCSpjb29raWU7CisJYm9vbAkJCXRsYl9zeW5jX3BlbmRpbmc7 CisJc3RydWN0IGlvX3BndGFibGVfY2ZnCWNmZzsKKwlzdHJ1Y3QgaW9fcGd0YWJsZV9vcHMJb3Bz OworfTsKKworI2RlZmluZSBpb19wZ3RhYmxlX29wc190b19wZ3RhYmxlKHgpIGNvbnRhaW5lcl9v ZigoeCksIHN0cnVjdCBpb19wZ3RhYmxlLCBvcHMpCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpb19w Z3RhYmxlX3RsYl9mbHVzaF9hbGwoc3RydWN0IGlvX3BndGFibGUgKmlvcCkKK3sKKwlpb3AtPmNm Zy50bGItPnRsYl9mbHVzaF9hbGwoaW9wLT5jb29raWUpOworCWlvcC0+dGxiX3N5bmNfcGVuZGlu ZyA9IHRydWU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpb19wZ3RhYmxlX3RsYl9hZGRfZmx1 c2goc3RydWN0IGlvX3BndGFibGUgKmlvcCwKKwkJdW5zaWduZWQgbG9uZyBpb3ZhLCBzaXplX3Qg c2l6ZSwgc2l6ZV90IGdyYW51bGUsIGJvb2wgbGVhZikKK3sKKwlpb3AtPmNmZy50bGItPnRsYl9h ZGRfZmx1c2goaW92YSwgc2l6ZSwgZ3JhbnVsZSwgbGVhZiwgaW9wLT5jb29raWUpOworCWlvcC0+ dGxiX3N5bmNfcGVuZGluZyA9IHRydWU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpb19wZ3Rh YmxlX3RsYl9zeW5jKHN0cnVjdCBpb19wZ3RhYmxlICppb3ApCit7CisJaWYgKGlvcC0+dGxiX3N5 bmNfcGVuZGluZykgeworCQlpb3AtPmNmZy50bGItPnRsYl9zeW5jKGlvcC0+Y29va2llKTsKKwkJ aW9wLT50bGJfc3luY19wZW5kaW5nID0gZmFsc2U7CisJfQorfQorCisvKioKKyAqIHN0cnVjdCBp b19wZ3RhYmxlX2luaXRfZm5zIC0gQWxsb2MvZnJlZSBhIHNldCBvZiBwYWdlIHRhYmxlcyBmb3Ig YQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aWN1bGFyIGZvcm1hdC4KKyAq CisgKiBAYWxsb2M6IEFsbG9jYXRlIGEgc2V0IG9mIHBhZ2UgdGFibGVzIGRlc2NyaWJlZCBieSBj ZmcuCisgKiBAZnJlZTogIEZyZWUgdGhlIHBhZ2UgdGFibGVzIGFzc29jaWF0ZWQgd2l0aCBpb3Au CisgKi8KK3N0cnVjdCBpb19wZ3RhYmxlX2luaXRfZm5zIHsKKwlzdHJ1Y3QgaW9fcGd0YWJsZSAq KCphbGxvYykoc3RydWN0IGlvX3BndGFibGVfY2ZnICpjZmcsIHZvaWQgKmNvb2tpZSk7CisJdm9p ZCAoKmZyZWUpKHN0cnVjdCBpb19wZ3RhYmxlICppb3ApOworfTsKKworZXh0ZXJuIHN0cnVjdCBp b19wZ3RhYmxlX2luaXRfZm5zIGlvX3BndGFibGVfYXJtXzMyX2xwYWVfczFfaW5pdF9mbnM7Citl eHRlcm4gc3RydWN0IGlvX3BndGFibGVfaW5pdF9mbnMgaW9fcGd0YWJsZV9hcm1fMzJfbHBhZV9z Ml9pbml0X2ZuczsKK2V4dGVybiBzdHJ1Y3QgaW9fcGd0YWJsZV9pbml0X2ZucyBpb19wZ3RhYmxl X2FybV82NF9scGFlX3MxX2luaXRfZm5zOworZXh0ZXJuIHN0cnVjdCBpb19wZ3RhYmxlX2luaXRf Zm5zIGlvX3BndGFibGVfYXJtXzY0X2xwYWVfczJfaW5pdF9mbnM7CitleHRlcm4gc3RydWN0IGlv X3BndGFibGVfaW5pdF9mbnMgaW9fcGd0YWJsZV9hcm1fdjdzX2luaXRfZm5zOworCisjZW5kaWYg LyogX19JT19QR1RBQkxFX0ggKi8KLS0gCjIuNy40CgoKX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX18KWGVuLWRldmVsIG1haWxpbmcgbGlzdApYZW4tZGV2ZWxA bGlzdHMueGVuLm9yZwpodHRwczovL2xpc3RzLnhlbi5vcmcveGVuLWRldmVsCg==