From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jordan Crouse Subject: [PATCH 3/3] drm/msm: Add A6XX device support Date: Fri, 2 Mar 2018 14:43:29 -0700 Message-ID: <20180302214329.1086-4-jcrouse@codeaurora.org> References: <20180302214329.1086-1-jcrouse@codeaurora.org> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <20180302214329.1086-1-jcrouse@codeaurora.org> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: freedreno@lists.freedesktop.org, dri-devel@lists.freedesktop.org Cc: nm@ti.com, linux-arm-msm@vger.kernel.org, linux-pm@vger.kernel.org, sboyd@codeaurora.org, vireshk@kernel.org List-Id: linux-arm-msm@vger.kernel.org QWRkIHN1cHBvcnQgZm9yIHRoZSBBNlhYIGZhbWlseSBvZiBBZHJlbm8gR1BVcy4gVGhlIGJpZ2dl c3QgYWRkaXRpb24KaXMgdGhlIEdNVSAoR3JhcGhpY3MgTWFuYWdlbWVudCBVbml0KSB3aGljaCB0 YWtlcyBvdmVyIG1vc3Qgb2YgdGhlCnBvd2VyIG1hbmFnZW1lbnQgb2YgdGhlIEdQVSBpdHNlbGYg YnV0IGluIGEgaXJvbmljIHR3aXN0IG9mIGZhdGUKbmVlZHMgYSBnb29kbHkgYW1vdW50IG9mIG1h bmFnZW1lbnQgaXRzZWxmLiAgQWRkIHN1cHBvcnQgZm9yIHRoZQpBNlhYIGNvcmUgY29kZSwgdGhl IEdNVSBhbmQgdGhlIEhGSSAoaGFyZHdhcmUgZmlybXdhcmUgaW50ZXJmYWNlKQpxdWV1ZSB0aGF0 IHRoZSBDUFUgdXNlcyB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBHTVUuCgpDaGFuZ2UtSWQ6IElj YjJiODBmYTBkM2JmNGJkYjBiODJlOTgwNzM2MGMxOWNiNDVkYWU2ClNpZ25lZC1vZmYtYnk6IEpv cmRhbiBDcm91c2UgPGpjcm91c2VAY29kZWF1cm9yYS5vcmc+Ci0tLQogZHJpdmVycy9ncHUvZHJt L21zbS9NYWtlZmlsZSAgICAgICAgICAgICAgIHwgICAgMyArCiBkcml2ZXJzL2dwdS9kcm0vbXNt L2FkcmVuby9hNnh4X2dtdS5jICAgICAgfCAxMjI2ICsrKysrKysrKysrKysrKysrKysrKysrKysr KysKIGRyaXZlcnMvZ3B1L2RybS9tc20vYWRyZW5vL2E2eHhfZ211LmggICAgICB8ICAxNjIgKysr KwogZHJpdmVycy9ncHUvZHJtL21zbS9hZHJlbm8vYTZ4eF9ncHUuYyAgICAgIHwgIDgwOSArKysr KysrKysrKysrKysrKysKIGRyaXZlcnMvZ3B1L2RybS9tc20vYWRyZW5vL2E2eHhfZ3B1LmggICAg ICB8ICAgNjAgKysKIGRyaXZlcnMvZ3B1L2RybS9tc20vYWRyZW5vL2E2eHhfaGZpLmMgICAgICB8 ICA0MzUgKysrKysrKysrKwogZHJpdmVycy9ncHUvZHJtL21zbS9hZHJlbm8vYTZ4eF9oZmkuaCAg ICAgIHwgIDEyNyArKysKIGRyaXZlcnMvZ3B1L2RybS9tc20vYWRyZW5vL2FkcmVub19kZXZpY2Uu YyB8ICAgMTIgKwogZHJpdmVycy9ncHUvZHJtL21zbS9hZHJlbm8vYWRyZW5vX2dwdS5jICAgIHwg ICAgMiArLQogZHJpdmVycy9ncHUvZHJtL21zbS9hZHJlbm8vYWRyZW5vX2dwdS5oICAgIHwgICAg NSArLQogZHJpdmVycy9ncHUvZHJtL21zbS9tc21fZ3B1LmMgICAgICAgICAgICAgIHwgICAgMiAr LQogMTEgZmlsZXMgY2hhbmdlZCwgMjg0MCBpbnNlcnRpb25zKCspLCAzIGRlbGV0aW9ucygtKQog Y3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1L2RybS9tc20vYWRyZW5vL2E2eHhfZ211LmMK IGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dwdS9kcm0vbXNtL2FkcmVuby9hNnh4X2dtdS5o CiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL21zbS9hZHJlbm8vYTZ4eF9ncHUu YwogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1L2RybS9tc20vYWRyZW5vL2E2eHhfZ3B1 LmgKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dwdS9kcm0vbXNtL2FkcmVuby9hNnh4X2hm aS5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL21zbS9hZHJlbm8vYTZ4eF9o ZmkuaAoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vTWFrZWZpbGUgYi9kcml2ZXJz L2dwdS9kcm0vbXNtL01ha2VmaWxlCmluZGV4IGNkNDBjMDUwYjJkNy4uNGFmZmM2NjVjMGRlIDEw MDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbXNtL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvZ3B1 L2RybS9tc20vTWFrZWZpbGUKQEAgLTEwLDYgKzEwLDkgQEAgbXNtLXkgOj0gXAogCWFkcmVuby9h NXh4X2dwdS5vIFwKIAlhZHJlbm8vYTV4eF9wb3dlci5vIFwKIAlhZHJlbm8vYTV4eF9wcmVlbXB0 Lm8gXAorCWFkcmVuby9hNnh4X2dwdS5vIFwKKwlhZHJlbm8vYTZ4eF9nbXUubyBcCisJYWRyZW5v L2E2eHhfaGZpLm8gXAogCWhkbWkvaGRtaS5vIFwKIAloZG1pL2hkbWlfYXVkaW8ubyBcCiAJaGRt aS9oZG1pX2JyaWRnZS5vIFwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vYWRyZW5v L2E2eHhfZ211LmMgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2FkcmVuby9hNnh4X2dtdS5jCm5ldyBm aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMC4uM2QwYTQ2YzQ5NTI2Ci0tLSAvZGV2 L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9hZHJlbm8vYTZ4eF9nbXUuYwpAQCAtMCww ICsxLDEyMjYgQEAKKy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wICovCisvKiBD b3B5cmlnaHQgKGMpIDIwMTctMjAxOCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyBy ZXNlcnZlZC4gKi8KKworI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2lv cG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX29wcC5oPgorI2luY2x1ZGUgPHNvYy9xY29tL2Nt ZC1kYi5oPgorCisjaW5jbHVkZSAiYTZ4eF9ncHUuaCIKKyNpbmNsdWRlICJhNnh4X2dtdS54bWwu aCIKKworc3RhdGljIGlycXJldHVybl90IGE2eHhfZ211X2lycShpbnQgaXJxLCB2b2lkICpkYXRh KQoreworCXN0cnVjdCBhNnh4X2dtdSAqZ211ID0gZGF0YTsKKwl1MzIgc3RhdHVzOworCisJc3Rh dHVzID0gZ211X3JlYWQoZ211LCBSRUdfQTZYWF9HTVVfQU9fSE9TVF9JTlRFUlJVUFRfU1RBVFVT KTsKKwlnbXVfd3JpdGUoZ211LCBSRUdfQTZYWF9HTVVfQU9fSE9TVF9JTlRFUlJVUFRfQ0xSLCBz dGF0dXMpOworCisJaWYgKHN0YXR1cyAmIEE2WFhfR01VX0FPX0hPU1RfSU5URVJSVVBUX1NUQVRV U19XRE9HX0JJVEUpIHsKKwkJZGV2X2Vycl9yYXRlbGltaXRlZChnbXUtPmRldiwgIkdNVSB3YXRj aGRvZyBleHBpcmVkXG4iKTsKKworCQkvKiBUZW1wb3JhcnkgdW50aWwgd2UgY2FuIHJlY292ZXIg c2FmZWx5ICovCisJCUJVRygpOworCX0KKworCWlmIChzdGF0dXMgJiAgQTZYWF9HTVVfQU9fSE9T VF9JTlRFUlJVUFRfU1RBVFVTX0hPU1RfQUhCX0JVU19FUlJPUikKKwkJZGV2X2Vycl9yYXRlbGlt aXRlZChnbXUtPmRldiwgIkdNVSBBSEIgYnVzIGVycm9yXG4iKTsKKworCWlmIChzdGF0dXMgJiBB NlhYX0dNVV9BT19IT1NUX0lOVEVSUlVQVF9TVEFUVVNfRkVOQ0VfRVJSKQorCQlkZXZfZXJyX3Jh dGVsaW1pdGVkKGdtdS0+ZGV2LCAiR01VIGZlbmNlIGVycm9yOiAweCV4XG4iLAorCQkJZ211X3Jl YWQoZ211LCBSRUdfQTZYWF9HTVVfQUhCX0ZFTkNFX1NUQVRVUykpOworCisJcmV0dXJuIElSUV9I QU5ETEVEOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgYTZ4eF9oZmlfaXJxKGludCBpcnEsIHZv aWQgKmRhdGEpCit7CisJc3RydWN0IGE2eHhfZ211ICpnbXUgPSBkYXRhOworCXUzMiBzdGF0dXM7 CisKKwlzdGF0dXMgPSBnbXVfcmVhZChnbXUsIFJFR19BNlhYX0dNVV9HTVUySE9TVF9JTlRSX0lO Rk8pOworCWdtdV93cml0ZShnbXUsIFJFR19BNlhYX0dNVV9HTVUySE9TVF9JTlRSX0NMUiwgc3Rh dHVzKTsKKworCWlmIChzdGF0dXMgJiBBNlhYX0dNVV9HTVUySE9TVF9JTlRSX0lORk9fTVNHUSkK KwkJdGFza2xldF9zY2hlZHVsZSgmZ211LT5oZmlfdGFza2xldCk7CisKKwlpZiAoc3RhdHVzICYg QTZYWF9HTVVfR01VMkhPU1RfSU5UUl9JTkZPX0NNM19GQVVMVCkgeworCQlkZXZfZXJyX3JhdGVs aW1pdGVkKGdtdS0+ZGV2LCAiR01VIGZpcm13YXJlIGZhdWx0XG4iKTsKKworCQkvKiBUZW1wb3Jh cnkgdW50aWwgd2UgY2FuIHJlY292ZXIgc2FmZWx5ICovCisJCUJVRygpOworCX0KKworCXJldHVy biBJUlFfSEFORExFRDsKK30KKworLyogQ2hlY2sgdG8gc2VlIGlmIHRoZSBHWCByYWlsIGlzIHN0 aWxsIHBvd2VyZWQgKi8KK3N0YXRpYyBib29sIGE2eHhfZ211X2d4X2lzX29uKHN0cnVjdCBhNnh4 X2dtdSAqZ211KQoreworCXUzMiB2YWwgID0gZ211X3JlYWQoZ211LCBSRUdfQTZYWF9HTVVfU1BU UFJBQ19QV1JfQ0xLX1NUQVRVUyk7CisKKwlyZXR1cm4gISh2YWwgJgorCQkoQTZYWF9HTVVfU1BU UFJBQ19QV1JfQ0xLX1NUQVRVU19TUFRQUkFDX0dEU0NfUE9XRVJfT0ZGIHwKKwkJQTZYWF9HTVVf U1BUUFJBQ19QV1JfQ0xLX1NUQVRVU19HWF9ITV9DTEtfT0ZGKSk7Cit9CisKKyNkZWZpbmUgR1hf T0ZGX01BU0sgXAorCShBNlhYX0dNVV9TUFRQUkFDX1BXUl9DTEtfU1RBVFVTX1NQVFBSQUNfR0RT Q19QT1dFUl9PRkYJfCBcCisJIEE2WFhfR01VX1NQVFBSQUNfUFdSX0NMS19TVEFUVVNfR1hfSE1f Q0xLX09GRikKKworc3RhdGljIGJvb2wgYTZ4eF9nbXVfY2hlY2tfaWRsZV9sZXZlbChzdHJ1Y3Qg YTZ4eF9nbXUgKmdtdSkKK3sKKwl1MzIgdmFsOworCWludCBsb2NhbCA9IGdtdS0+aWRsZV9sZXZl bDsKKworCS8qIFNQVFAgYW5kIElGUEMgYm90aCByZXBvcnQgYXMgSUZQQyAqLworCWlmIChnbXUt PmlkbGVfbGV2ZWwgPT0gR01VX0lETEVfU1RBVEVfU1BUUCkKKwkJbG9jYWwgPSBHTVVfSURMRV9T VEFURV9JRlBDOworCisJdmFsID0gZ211X3JlYWQoZ211LCBSRUdfQTZYWF9HUFVfR01VX0NYX0dN VV9SUE1IX1BPV0VSX1NUQVRFKTsKKworCWlmICh2YWwgPT0gbG9jYWwpIHsKKwkJaWYgKGdtdS0+ aWRsZV9sZXZlbCAhPSBHTVVfSURMRV9TVEFURV9JRlBDIHx8CisJCQkhYTZ4eF9nbXVfZ3hfaXNf b24oZ211KSkKKwkJCXJldHVybiB0cnVlOworCX0KKworCXJldHVybiBmYWxzZTsKK30KKworLyog V2FpdCBmb3IgdGhlIEdNVSB0byBnZXQgdG8gaXRzIG1vc3QgaWRsZSBzdGF0ZSAqLworaW50IGE2 eHhfZ211X3dhaXRfZm9yX2lkbGUoc3RydWN0IGE2eHhfZ3B1ICphNnh4X2dwdSkKK3sKKwlzdHJ1 Y3QgYTZ4eF9nbXUgKmdtdSA9ICZhNnh4X2dwdS0+Z211OworCisJcmV0dXJuIHNwaW5fdW50aWwo YTZ4eF9nbXVfY2hlY2tfaWRsZV9sZXZlbChnbXUpKTsKK30KKworc3RhdGljIGludCBhNnh4X2dt dV9zdGFydChzdHJ1Y3QgYTZ4eF9nbXUgKmdtdSkKK3sKKwlpbnQgcmV0OworCXUzMiB2YWw7CisK KwlnbXVfd3JpdGUoZ211LCBSRUdfQTZYWF9HTVVfQ00zX1NZU1JFU0VULCAxKTsKKwlnbXVfd3Jp dGUoZ211LCBSRUdfQTZYWF9HTVVfQ00zX1NZU1JFU0VULCAwKTsKKworCXJldCA9IGdtdV9wb2xs X3RpbWVvdXQoZ211LCBSRUdfQTZYWF9HTVVfQ00zX0ZXX0lOSVRfUkVTVUxULCB2YWwsCisJCXZh bCA9PSAweGJhYmVmYWNlLCAxMDAsIDEwMDAwKTsKKworCWlmIChyZXQpCisJCWRldl9lcnIoZ211 LT5kZXYsICJHTVUgZmlybXdhcmUgaW5pdGFsaXphdGlvbiB0aW1lZCBvdXRcbiIpOworCisJcmV0 dXJuIHJldDsKK30KKworc3RhdGljIGludCBhNnh4X2dtdV9oZmlfc3RhcnQoc3RydWN0IGE2eHhf Z211ICpnbXUpCit7CisJdTMyIHZhbDsKKwlpbnQgcmV0OworCisJZ211X3JtdyhnbXUsIFJFR19B NlhYX0dNVV9HTVUySE9TVF9JTlRSX01BU0ssCisJCUE2WFhfR01VX0dNVTJIT1NUX0lOVFJfSU5G T19NU0dRLCAwKTsKKworCWdtdV93cml0ZShnbXUsIFJFR19BNlhYX0dNVV9IRklfQ1RSTF9JTklU LCAxKTsKKworCXJldCA9IGdtdV9wb2xsX3RpbWVvdXQoZ211LCBSRUdfQTZYWF9HTVVfSEZJX0NU UkxfU1RBVFVTLCB2YWwsCisJCXZhbCAmIDEsIDEwMCwgMTAwMDApOworCWlmIChyZXQpCisJCWRl dl9lcnIoZ211LT5kZXYsICJVbmFibGUgdG8gc3RhcnQgdGhlIEhGSSBxdWV1ZXNcbiIpOworCisJ cmV0dXJuIHJldDsKK30KKworLyogVHJpZ2dlciBhIE9PQiAob3V0IG9mIGJhbmQpIHJlcXVlc3Qg dG8gdGhlIEdNVSAqLworaW50IGE2eHhfZ211X3NldF9vb2Ioc3RydWN0IGE2eHhfZ211ICpnbXUs IGVudW0gYTZ4eF9nbXVfb29iX3N0YXRlIHN0YXRlKQoreworCWludCByZXQ7CisJdTMyIHZhbDsK KwlpbnQgcmVxdWVzdCwgYWNrOworCWNvbnN0IGNoYXIgKm5hbWU7CisKKwlzd2l0Y2ggKHN0YXRl KSB7CisJY2FzZSBHTVVfT09CX0dQVV9TRVQ6CisJCXJlcXVlc3QgPSBHTVVfT09CX0dQVV9TRVRf UkVRVUVTVDsKKwkJYWNrID0gR01VX09PQl9HUFVfU0VUX0FDSzsKKwkJbmFtZSA9ICJHUFVfU0VU IjsKKwkJYnJlYWs7CisJY2FzZSBHTVVfT09CX0JPT1RfU0xVTUJFUjoKKwkJcmVxdWVzdCA9IEdN VV9PT0JfQk9PVF9TTFVNQkVSX1JFUVVFU1Q7CisJCWFjayA9IEdNVV9PT0JfQk9PVF9TTFVNQkVS X0FDSzsKKwkJbmFtZSA9ICJCT09UX1NMVU1CRVIiOworCQlicmVhazsKKwlkZWZhdWx0OgorCQly ZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBUcmlnZ2VyIHRoZSBlcXVlc3RlZCBPT0Igb3BlcmF0 aW9uICovCisJZ211X3dyaXRlKGdtdSwgUkVHX0E2WFhfR01VX0hPU1QyR01VX0lOVFJfU0VULCAx IDw8IHJlcXVlc3QpOworCisJLyogV2FpdCBmb3IgdGhlIGFja25vd2xlZGdlIGludGVycnVwdCAq LworCXJldCA9IGdtdV9wb2xsX3RpbWVvdXQoZ211LCBSRUdfQTZYWF9HTVVfR01VMkhPU1RfSU5U Ul9JTkZPLCB2YWwsCisJCXZhbCAmICgxIDw8IGFjayksIDEwMCwgMTAwMDApOworCisJaWYgKHJl dCkKKwkJZGV2X2VycihnbXUtPmRldiwKKwkJCSJUaW1lb3V0IHdhaXRpbmcgZm9yIEdNVSBPT0Ig c2V0ICVzOiAweCV4XG4iLAorCQkJCW5hbWUsCisJCQkJZ211X3JlYWQoZ211LCBSRUdfQTZYWF9H TVVfR01VMkhPU1RfSU5UUl9JTkZPKSk7CisKKwkvKiBDbGVhciB0aGUgYWNrbm93bGVkZ2UgaW50 ZXJydXB0ICovCisJZ211X3dyaXRlKGdtdSwgUkVHX0E2WFhfR01VX0dNVTJIT1NUX0lOVFJfQ0xS LCBhY2spOworCisJcmV0dXJuIHJldDsKK30KKworLyogQ2xlYXIgYSBwZW5kaW5nIE9PQiBzdGF0 ZSBpbiB0aGUgR01VICovCit2b2lkIGE2eHhfZ211X2NsZWFyX29vYihzdHJ1Y3QgYTZ4eF9nbXUg KmdtdSwgZW51bSBhNnh4X2dtdV9vb2Jfc3RhdGUgc3RhdGUpCit7CisJc3dpdGNoIChzdGF0ZSkg eworCWNhc2UgR01VX09PQl9HUFVfU0VUOgorCQlnbXVfd3JpdGUoZ211LCBSRUdfQTZYWF9HTVVf SE9TVDJHTVVfSU5UUl9TRVQsCisJCQkxIDw8IEdNVV9PT0JfR1BVX1NFVF9DTEVBUik7CisJCWJy ZWFrOworCWNhc2UgR01VX09PQl9CT09UX1NMVU1CRVI6CisJCWdtdV93cml0ZShnbXUsIFJFR19B NlhYX0dNVV9IT1NUMkdNVV9JTlRSX1NFVCwKKwkJCTEgPDwgR01VX09PQl9CT09UX1NMVU1CRVJf Q0xFQVIpOworCQlicmVhazsKKwl9Cit9CisKKy8qIEVuYWJsZSBDUFUgY29udHJvbCBvZiBTUFRQ IHBvd2VyIHBvd2VyIGNvbGxhcHNlICovCitzdGF0aWMgaW50IGE2eHhfc3B0cHJhY19lbmFibGUo c3RydWN0IGE2eHhfZ211ICpnbXUpCit7CisJaW50IHJldDsKKwl1MzIgdmFsOworCisJZ211X3dy aXRlKGdtdSwgUkVHX0E2WFhfR01VX0dYX1NQVFBSQUNfUE9XRVJfQ09OVFJPTCwgMHg3NzgwMDAp OworCisJcmV0ID0gZ211X3BvbGxfdGltZW91dChnbXUsIFJFR19BNlhYX0dNVV9TUFRQUkFDX1BX Ul9DTEtfU1RBVFVTLCB2YWwsCisJCSh2YWwgJiAweDM4KSA9PSAweDI4LCAxLCAxMDApOworCisJ aWYgKHJldCkgeworCQlkZXZfZXJyKGdtdS0+ZGV2LCAiVW5hYmxlIHRvIHBvd2VyIG9uIFNQVFBS QUM6IDB4JXhcbiIsCisJCQlnbXVfcmVhZChnbXUsIFJFR19BNlhYX0dNVV9TUFRQUkFDX1BXUl9D TEtfU1RBVFVTKSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIERpc2FibGUgQ1BVIGNvbnRy b2wgb2YgU1BUUCBwb3dlciBwb3dlciBjb2xsYXBzZSAqLworc3RhdGljIHZvaWQgYTZ4eF9zcHRw cmFjX2Rpc2FibGUoc3RydWN0IGE2eHhfZ211ICpnbXUpCit7CisJdTMyIHZhbDsKKwlpbnQgcmV0 OworCisJLyogTWFrZSBzdXJlIHJldGVudGlvbiBpcyBvbiAqLworCWdtdV9ybXcoZ211LCBSRUdf QTZYWF9HUFVfQ0NfR1hfR0RTQ1IsIDAsICgxIDw8IDExKSk7CisKKwlnbXVfd3JpdGUoZ211LCBS RUdfQTZYWF9HTVVfR1hfU1BUUFJBQ19QT1dFUl9DT05UUk9MLCAweDc3ODAwMSk7CisKKwlyZXQg PSBnbXVfcG9sbF90aW1lb3V0KGdtdSwgUkVHX0E2WFhfR01VX1NQVFBSQUNfUFdSX0NMS19TVEFU VVMsIHZhbCwKKwkJKHZhbCAmIDB4MDQpLCAxMDAsIDEwMDAwKTsKKworCWlmIChyZXQpCisJCWRl dl9lcnIoZ211LT5kZXYsICJmYWlsZWQgdG8gcG93ZXIgb2ZmIFNQVFBSQUM6IDB4JXhcbiIsCisJ CQlnbXVfcmVhZChnbXUsIFJFR19BNlhYX0dNVV9TUFRQUkFDX1BXUl9DTEtfU1RBVFVTKSk7Cit9 CisKKy8qIExldCB0aGUgR01VIGtub3cgd2UgYXJlIHN0YXJ0aW5nIGEgYm9vdCBzZXF1ZW5jZSAq Lworc3RhdGljIGludCBhNnh4X2dtdV9nZnhfcmFpbF9vbihzdHJ1Y3QgYTZ4eF9nbXUgKmdtdSkK K3sKKwl1MzIgdm90ZTsKKworCS8qIExldCB0aGUgR01VIGtub3cgd2UgYXJlIGdldHRpbmcgcmVh ZHkgZm9yIGJvb3QgKi8KKwlnbXVfd3JpdGUoZ211LCBSRUdfQTZYWF9HTVVfQk9PVF9TTFVNQkVS X09QVElPTiwgMCk7CisKKwkvKiBDaG9vc2UgdGhlICJkZWZhdWx0IiBwb3dlciBsZXZlbCBhcyB0 aGUgaGlnaGVzdCBhdmFpbGFibGUgKi8KKwl2b3RlID0gZ211LT5neF9hcmNfdm90ZXNbZ211LT5u cl9ncHVfZnJlcXMgLSAxXTsKKworCWdtdV93cml0ZShnbXUsIFJFR19BNlhYX0dNVV9HWF9WT1RF X0lEWCwgdm90ZSAmIDB4ZmYpOworCWdtdV93cml0ZShnbXUsIFJFR19BNlhYX0dNVV9NWF9WT1RF X0lEWCwgKHZvdGUgPj4gOCkgJiAweGZmKTsKKworCS8qIExldCB0aGUgR01VIGtub3cgdGhlIGJv b3Qgc2VxdWVuY2UgaGFzIHN0YXJ0ZWQgKi8KKwlyZXR1cm4gYTZ4eF9nbXVfc2V0X29vYihnbXUs IEdNVV9PT0JfQk9PVF9TTFVNQkVSKTsKK30KKworLyogTGV0IHRoZSBHTVUga25vdyB0aGF0IHdl IGFyZSBhYm91dCB0byBnbyBpbnRvIHNsdW1iZXIgKi8KK3N0YXRpYyBpbnQgYTZ4eF9nbXVfbm90 aWZ5X3NsdW1iZXIoc3RydWN0IGE2eHhfZ211ICpnbXUpCit7CisJaW50IHJldDsKKworCS8qIERp c2FibGUgdGhlIHBvd2VyIGNvdW50ZXIgc28gdGhlIEdNVSBpc24ndCBidXN5ICovCisJZ211X3dy aXRlKGdtdSwgUkVHX0E2WFhfR01VX0NYX0dNVV9QT1dFUl9DT1VOVEVSX0VOQUJMRSwgMCk7CisK KwkvKiBEaXNhYmxlIFNQVFBfUEMgaWYgdGhlIENQVSBpcyByZXNwb25zaWJsZSBmb3IgaXQgKi8K KwlpZiAoZ211LT5pZGxlX2xldmVsIDwgR01VX0lETEVfU1RBVEVfU1BUUCkKKwkJYTZ4eF9zcHRw cmFjX2Rpc2FibGUoZ211KTsKKworCS8qIFRlbGwgdGhlIEdNVSB0byBnZXQgcmVhZHkgdG8gc2x1 bWJlciAqLworCWdtdV93cml0ZShnbXUsIFJFR19BNlhYX0dNVV9CT09UX1NMVU1CRVJfT1BUSU9O LCAxKTsKKworCXJldCA9IGE2eHhfZ211X3NldF9vb2IoZ211LCBHTVVfT09CX0JPT1RfU0xVTUJF Uik7CisJYTZ4eF9nbXVfY2xlYXJfb29iKGdtdSwgR01VX09PQl9CT09UX1NMVU1CRVIpOworCisJ aWYgKCFyZXQpIHsKKwkJLyogQ2hlY2sgdG8gc2VlIGlmIHRoZSBHTVUgcmVhbGx5IGRpZCBzbHVt YmVyICovCisJCWlmIChnbXVfcmVhZChnbXUsIFJFR19BNlhYX0dQVV9HTVVfQ1hfR01VX1JQTUhf UE9XRVJfU1RBVEUpCisJCQkhPSAweDBmKSB7CisJCQlkZXZfZXJyKGdtdS0+ZGV2LCAiVGhlIEdN VSBkaWQgbm90IGdvIGludG8gc2x1bWJlclxuIik7CisJCQlyZXQgPSAtRVRJTUVET1VUOworCQl9 CisJfQorCisJLyogUHV0IGZlbmNlIGludG8gYWxsb3cgbW9kZSAqLworCWdtdV93cml0ZShnbXUs IFJFR19BNlhYX0dNVV9BT19BSEJfRkVOQ0VfQ1RSTCwgMCk7CisJcmV0dXJuIHJldDsKK30KKwor c3RhdGljIGludCBhNnh4X3JwbWhfc3RhcnQoc3RydWN0IGE2eHhfZ211ICpnbXUpCit7CisJaW50 IHJldDsKKwl1MzIgdmFsOworCisJZ211X3dyaXRlKGdtdSwgUkVHX0E2WFhfR01VX1JTQ0NfQ09O VFJPTF9SRVEsIDEgPDwgMSk7CisJLyogV2FpdCBmb3IgdGhlIHJlZ2lzdGVyIHRvIGZpbmlzaCBw b3N0aW5nICovCisJd21iKCk7CisKKwlyZXQgPSBnbXVfcG9sbF90aW1lb3V0KGdtdSwgUkVHX0E2 WFhfR01VX1JTQ0NfQ09OVFJPTF9BQ0ssIHZhbCwKKwkJdmFsICYgKDEgPDwgMSksIDEwMCwgMTAw MDApOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihnbXUtPmRldiwgIlVuYWJsZSB0byBwb3dlciBv biB0aGUgR1BVIFJTQ1xuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gZ211X3BvbGxf dGltZW91dChnbXUsIFJFR19BNlhYX1JTQ0NfU0VRX0JVU1lfRFJWMCwgdmFsLAorCQkhdmFsLCAx MDAsIDEwMDAwKTsKKworCWlmICghcmV0KSB7CisJCWdtdV93cml0ZShnbXUsIFJFR19BNlhYX0dN VV9SU0NDX0NPTlRST0xfUkVRLCAwKTsKKworCQkvKiBSZS1lbmFibGUgdGhlIHBvd2VyIGNvdW50 ZXIgKi8KKwkJZ211X3dyaXRlKGdtdSwgUkVHX0E2WFhfR01VX0NYX0dNVV9QT1dFUl9DT1VOVEVS X0VOQUJMRSwgMSk7CisJCXJldHVybiAwOworCX0KKworCWRldl9lcnIoZ211LT5kZXYsICJHUFUg UlNDIHNlcXVlbmNlIHN0dWNrIHdoaWxlIHdha2luZyB1cCB0aGUgR1BVXG4iKTsKKwlyZXR1cm4g cmV0OworfQorCitzdGF0aWMgdm9pZCBhNnh4X3JwbWhfc3RvcChzdHJ1Y3QgYTZ4eF9nbXUgKmdt dSkKK3sKKwlpbnQgcmV0OworCXUzMiB2YWw7CisKKwlnbXVfd3JpdGUoZ211LCBSRUdfQTZYWF9H TVVfUlNDQ19DT05UUk9MX1JFUSwgMSk7CisKKwlyZXQgPSBnbXVfcG9sbF90aW1lb3V0KGdtdSwg UkVHX0E2WFhfR1BVX1JTQ0NfUlNDX1NUQVRVUzBfRFJWMCwKKwkJdmFsLCB2YWwgJiAoMSA8PCAx NiksIDEwMCwgMTAwMDApOworCWlmIChyZXQpCisJCWRldl9lcnIoZ211LT5kZXYsICJVbmFibGUg dG8gcG93ZXIgb2ZmIHRoZSBHUFUgUlNDXG4iKTsKKworCWdtdV93cml0ZShnbXUsIFJFR19BNlhY X0dNVV9SU0NDX0NPTlRST0xfUkVRLCAwKTsKK30KKworc3RhdGljIHZvaWQgYTZ4eF9nbXVfcnBt aF9pbml0KHN0cnVjdCBhNnh4X2dtdSAqZ211KQoreworCS8qIERpc2FibGUgU0RFIGNsb2NrIGdh dGluZyAqLworCWdtdV93cml0ZShnbXUsIFJFR19BNlhYX0dQVV9SU0NDX1JTQ19TVEFUVVMwX0RS VjAsIEJJVCgyNCkpOworCisJLyogU2V0dXAgUlNDIFBEQyBoYW5kc2hha2UgZm9yIHNsZWVwIGFu ZCB3YWtldXAgKi8KKwlnbXVfd3JpdGUoZ211LCBSRUdfQTZYWF9SU0NDX1BEQ19TTEFWRV9JRF9E UlYwLCAxKTsKKwlnbXVfd3JpdGUoZ211LCBSRUdfQTZYWF9SU0NDX0hJRERFTl9UQ1NfQ01EMF9E QVRBLCAwKTsKKwlnbXVfd3JpdGUoZ211LCBSRUdfQTZYWF9SU0NDX0hJRERFTl9UQ1NfQ01EMF9B RERSLCAwKTsKKwlnbXVfd3JpdGUoZ211LCBSRUdfQTZYWF9SU0NDX0hJRERFTl9UQ1NfQ01EMF9E QVRBICsgMiwgMCk7CisJZ211X3dyaXRlKGdtdSwgUkVHX0E2WFhfUlNDQ19ISURERU5fVENTX0NN RDBfQUREUiArIDIsIDApOworCWdtdV93cml0ZShnbXUsIFJFR19BNlhYX1JTQ0NfSElEREVOX1RD U19DTUQwX0RBVEEgKyA0LCAweDgwMDAwMDAwKTsKKwlnbXVfd3JpdGUoZ211LCBSRUdfQTZYWF9S U0NDX0hJRERFTl9UQ1NfQ01EMF9BRERSICsgNCwgMCk7CisJZ211X3dyaXRlKGdtdSwgUkVHX0E2 WFhfUlNDQ19PVkVSUklERV9TVEFSVF9BRERSLCAwKTsKKwlnbXVfd3JpdGUoZ211LCBSRUdfQTZY WF9SU0NDX1BEQ19TRVFfU1RBUlRfQUREUiwgMHg0NTIwKTsKKwlnbXVfd3JpdGUoZ211LCBSRUdf QTZYWF9SU0NDX1BEQ19NQVRDSF9WQUxVRV9MTywgMHg0NTEwKTsKKwlnbXVfd3JpdGUoZ211LCBS RUdfQTZYWF9SU0NDX1BEQ19NQVRDSF9WQUxVRV9ISSwgMHg0NTE0KTsKKworCS8qIExvYWQgUlND IHNlcXVlbmNlciB1Q29kZSBmb3Igc2xlZXAgYW5kIHdha2V1cCAqLworCWdtdV93cml0ZShnbXUs IFJFR19BNlhYX1JTQ0NfU0VRX01FTV8wX0RSVjAsIDB4YTdhNTA2YTApOworCWdtdV93cml0ZShn bXUsIFJFR19BNlhYX1JTQ0NfU0VRX01FTV8wX0RSVjAgKyAxLCAweGExZTZhNmU3KTsKKwlnbXVf d3JpdGUoZ211LCBSRUdfQTZYWF9SU0NDX1NFUV9NRU1fMF9EUlYwICsgMiwgMHhhMmUwODFlMSk7 CisJZ211X3dyaXRlKGdtdSwgUkVHX0E2WFhfUlNDQ19TRVFfTUVNXzBfRFJWMCArIDMsIDB4ZTlh OTgyZTIpOworCWdtdV93cml0ZShnbXUsIFJFR19BNlhYX1JTQ0NfU0VRX01FTV8wX0RSVjAgKyA0 LCAweDAwMjBlOGE4KTsKKworCS8qIExvYWQgUERDIHNlcXVlbmNlciB1Q29kZSBmb3IgcG93ZXIg dXAgYW5kIHBvd2VyIGRvd24gc2VxdWVuY2UgKi8KKwlwZGNfd3JpdGUoZ211LCBSRUdfQTZYWF9Q RENfR1BVX1NFUV9NRU1fMCwgMHhmZWJlYTFlMSk7CisJcGRjX3dyaXRlKGdtdSwgUkVHX0E2WFhf UERDX0dQVV9TRVFfTUVNXzAgKyAxLCAweGE1YTRhM2EyKTsKKwlwZGNfd3JpdGUoZ211LCBSRUdf QTZYWF9QRENfR1BVX1NFUV9NRU1fMCArIDIsIDB4ODM4MmE2ZTApOworCXBkY193cml0ZShnbXUs IFJFR19BNlhYX1BEQ19HUFVfU0VRX01FTV8wICsgMywgMHhiY2UzZTI4NCk7CisJcGRjX3dyaXRl KGdtdSwgUkVHX0E2WFhfUERDX0dQVV9TRVFfTUVNXzAgKyA0LCAweDAwMjA4MWZjKTsKKworCS8q IFNldCBUQ1MgY29tbWFuZHMgdXNlZCBieSBQREMgc2VxdWVuY2UgZm9yIGxvdyBwb3dlciBtb2Rl cyAqLworCXBkY193cml0ZShnbXUsIFJFR19BNlhYX1BEQ19HUFVfVENTMV9DTURfRU5BQkxFX0JB TkssIDcpOworCXBkY193cml0ZShnbXUsIFJFR19BNlhYX1BEQ19HUFVfVENTMV9DTURfV0FJVF9G T1JfQ01QTF9CQU5LLCAwKTsKKwlwZGNfd3JpdGUoZ211LCBSRUdfQTZYWF9QRENfR1BVX1RDUzFf Q09OVFJPTCwgMCk7CisJcGRjX3dyaXRlKGdtdSwgUkVHX0E2WFhfUERDX0dQVV9UQ1MxX0NNRDBf TVNHSUQsIDB4MTAxMDgpOworCXBkY193cml0ZShnbXUsIFJFR19BNlhYX1BEQ19HUFVfVENTMV9D TUQwX0FERFIsIDB4MzAwMTApOworCXBkY193cml0ZShnbXUsIFJFR19BNlhYX1BEQ19HUFVfVENT MV9DTUQwX0RBVEEsIDEpOworCXBkY193cml0ZShnbXUsIFJFR19BNlhYX1BEQ19HUFVfVENTMV9D TUQwX01TR0lEICsgNCwgMHgxMDEwOCk7CisJcGRjX3dyaXRlKGdtdSwgUkVHX0E2WFhfUERDX0dQ VV9UQ1MxX0NNRDBfQUREUiArIDQsIDB4MzAwMDApOworCXBkY193cml0ZShnbXUsIFJFR19BNlhY X1BEQ19HUFVfVENTMV9DTUQwX0RBVEEgKyA0LCAweDApOworCXBkY193cml0ZShnbXUsIFJFR19B NlhYX1BEQ19HUFVfVENTMV9DTUQwX01TR0lEICsgOCwgMHgxMDEwOCk7CisJcGRjX3dyaXRlKGdt dSwgUkVHX0E2WFhfUERDX0dQVV9UQ1MxX0NNRDBfQUREUiArIDgsIDB4MzAwODApOworCXBkY193 cml0ZShnbXUsIFJFR19BNlhYX1BEQ19HUFVfVENTMV9DTUQwX0RBVEEgKyA4LCAweDApOworCXBk Y193cml0ZShnbXUsIFJFR19BNlhYX1BEQ19HUFVfVENTM19DTURfRU5BQkxFX0JBTkssIDcpOwor CXBkY193cml0ZShnbXUsIFJFR19BNlhYX1BEQ19HUFVfVENTM19DTURfV0FJVF9GT1JfQ01QTF9C QU5LLCAwKTsKKwlwZGNfd3JpdGUoZ211LCBSRUdfQTZYWF9QRENfR1BVX1RDUzNfQ09OVFJPTCwg MCk7CisJcGRjX3dyaXRlKGdtdSwgUkVHX0E2WFhfUERDX0dQVV9UQ1MzX0NNRDBfTVNHSUQsIDB4 MTAxMDgpOworCXBkY193cml0ZShnbXUsIFJFR19BNlhYX1BEQ19HUFVfVENTM19DTUQwX0FERFIs IDB4MzAwMTApOworCXBkY193cml0ZShnbXUsIFJFR19BNlhYX1BEQ19HUFVfVENTM19DTUQwX0RB VEEsIDIpOworCXBkY193cml0ZShnbXUsIFJFR19BNlhYX1BEQ19HUFVfVENTM19DTUQwX01TR0lE ICsgNCwgMHgxMDEwOCk7CisJcGRjX3dyaXRlKGdtdSwgUkVHX0E2WFhfUERDX0dQVV9UQ1MzX0NN RDBfQUREUiArIDQsIDB4MzAwMDApOworCXBkY193cml0ZShnbXUsIFJFR19BNlhYX1BEQ19HUFVf VENTM19DTUQwX0RBVEEgKyA0LCAweDMpOworCXBkY193cml0ZShnbXUsIFJFR19BNlhYX1BEQ19H UFVfVENTM19DTUQwX01TR0lEICsgOCwgMHgxMDEwOCk7CisJcGRjX3dyaXRlKGdtdSwgUkVHX0E2 WFhfUERDX0dQVV9UQ1MzX0NNRDBfQUREUiArIDgsIDB4MzAwODApOworCXBkY193cml0ZShnbXUs IFJFR19BNlhYX1BEQ19HUFVfVENTM19DTUQwX0RBVEEgKyA4LCAweDMpOworCisJLyogU2V0dXAg R1BVIFBEQyAqLworCXBkY193cml0ZShnbXUsIFJFR19BNlhYX1BEQ19HUFVfU0VRX1NUQVJUX0FE RFIsIDApOworCXBkY193cml0ZShnbXUsIFJFR19BNlhYX1BEQ19HUFVfRU5BQkxFX1BEQywgMHg4 MDAwMDAwMSk7CisKKwkvKiBlbnN1cmUgbm8gd3JpdGVzIGhhcHBlbiBiZWZvcmUgdGhlIHVDb2Rl IGlzIGZ1bGx5IHdyaXR0ZW4gKi8KKwl3bWIoKTsKK30KKworLyoKKyAqIFRoZSBsb3dlc3QgMTYg Yml0cyBvZiB0aGlzIHZhbHVlIGFyZSB0aGUgbnVtYmVyIG9mIFhPIGNsb2NrIGN5Y2xlcyBmb3Ig bWFpbgorICogaHlzdGVyZXNpcyB3aGljaCBpcyBzZXQgYXQgMHgxNjgwIGN5Y2xlcyAoMzAwIHVz KS4gIFRoZSBoaWdoZXIgMTYgYml0cyBhcmUKKyAqIGZvciB0aGUgc2hvcnRlciBoeXN0ZXJlc2lz IHRoYXQgaGFwcGVucyBhZnRlciBtYWluIC0gdGhpcyBpcyAweGEgKC41IHVzKQorICovCisKKyNk ZWZpbmUgR01VX1BXUl9DT0xfSFlTVCAweDAwMGExNjgwCisKKy8qIFNldCB1cCB0aGUgaWRsZSBz dGF0ZSBmb3IgdGhlIEdNVSAqLworc3RhdGljIHZvaWQgYTZ4eF9nbXVfcG93ZXJfY29uZmlnKHN0 cnVjdCBhNnh4X2dtdSAqZ211KQoreworCS8qIERpc2FibGUgR01VIFdCL1JCIGJ1ZmZlciAqLwor CWdtdV93cml0ZShnbXUsIFJFR19BNlhYX0dNVV9TWVNfQlVTX0NPTkZJRywgMHgxKTsKKworCWdt dV93cml0ZShnbXUsIFJFR19BNlhYX0dNVV9QV1JfQ09MX0lOVEVSX0ZSQU1FX0NUUkwsIDB4OWM0 MDQwMCk7CisKKwlzd2l0Y2ggKGdtdS0+aWRsZV9sZXZlbCkgeworCWNhc2UgR01VX0lETEVfU1RB VEVfSUZQQzoKKwkJZ211X3dyaXRlKGdtdSwgUkVHX0E2WFhfR01VX1BXUl9DT0xfSU5URVJfRlJB TUVfSFlTVCwKKwkJCUdNVV9QV1JfQ09MX0hZU1QpOworCQlnbXVfcm13KGdtdSwgUkVHX0E2WFhf R01VX1BXUl9DT0xfSU5URVJfRlJBTUVfQ1RSTCwgMCwKKwkJCUE2WFhfR01VX1BXUl9DT0xfSU5U RVJfRlJBTUVfQ1RSTF9JRlBDX0VOQUJMRSB8CisJCQlBNlhYX0dNVV9QV1JfQ09MX0lOVEVSX0ZS QU1FX0NUUkxfSE1fUE9XRVJfQ09MTEFQU0VfRU5BQkxFKTsKKwkJLyogRmFsbCB0aHJvdWdoICov CisJY2FzZSBHTVVfSURMRV9TVEFURV9TUFRQOgorCQlnbXVfd3JpdGUoZ211LCBSRUdfQTZYWF9H TVVfUFdSX0NPTF9TUFRQUkFDX0hZU1QsCisJCQlHTVVfUFdSX0NPTF9IWVNUKTsKKwkJZ211X3Jt dyhnbXUsIFJFR19BNlhYX0dNVV9QV1JfQ09MX0lOVEVSX0ZSQU1FX0NUUkwsIDAsCisJCQlBNlhY X0dNVV9QV1JfQ09MX0lOVEVSX0ZSQU1FX0NUUkxfSUZQQ19FTkFCTEUgfAorCQkJQTZYWF9HTVVf UFdSX0NPTF9JTlRFUl9GUkFNRV9DVFJMX1NQVFBSQUNfUE9XRVJfQ09OVFJPTF9FTkFCTEUpOwor CX0KKworCS8qIEVuYWJsZSBSUE1oIEdQVSBjbGllbnQgKi8KKwlnbXVfcm13KGdtdSwgUkVHX0E2 WFhfR01VX1JQTUhfQ1RSTCwgMCwKKwkJQTZYWF9HTVVfUlBNSF9DVFJMX1JQTUhfSU5URVJGQUNF X0VOQUJMRSB8CisJCUE2WFhfR01VX1JQTUhfQ1RSTF9MTENfVk9URV9FTkFCTEUgfAorCQlBNlhY X0dNVV9SUE1IX0NUUkxfRERSX1ZPVEVfRU5BQkxFIHwKKwkJQTZYWF9HTVVfUlBNSF9DVFJMX01Y X1ZPVEVfRU5BQkxFIHwKKwkJQTZYWF9HTVVfUlBNSF9DVFJMX0NYX1ZPVEVfRU5BQkxFIHwKKwkJ QTZYWF9HTVVfUlBNSF9DVFJMX0dGWF9WT1RFX0VOQUJMRSk7Cit9CisKK3N0YXRpYyBpbnQgYTZ4 eF9nbXVfZndfc3RhcnQoc3RydWN0IGE2eHhfZ211ICpnbXUsIHVuc2lnbmVkIGludCBzdGF0ZSkK K3sKKwlzdGF0aWMgYm9vbCBycG1oX2luaXQ7CisJc3RydWN0IGE2eHhfZ3B1ICphNnh4X2dwdSA9 IGNvbnRhaW5lcl9vZihnbXUsIHN0cnVjdCBhNnh4X2dwdSwgZ211KTsKKwlzdHJ1Y3QgYWRyZW5v X2dwdSAqYWRyZW5vX2dwdSA9ICZhNnh4X2dwdS0+YmFzZTsKKwlpbnQgaSwgcmV0OworCXUzMiBj aGlwaWQ7CisJdTMyICppbWFnZTsKKworCWlmIChzdGF0ZSA9PSBHTVVfV0FSTV9CT09UKSB7CisJ CXJldCA9IGE2eHhfcnBtaF9zdGFydChnbXUpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsK Kwl9IGVsc2UgeworCQkvKiBMb2FkIHRoZSBmaXJtd2FyZSBpbiBjYXNlIGl0IGhhc24ndCBiZWVu IGRvbmUgeWV0ICovCisJCXJldCA9IGFkcmVub19sb2FkX2Z3KGFkcmVub19ncHUpOworCQlpZiAo cmV0KQorCQkJcmV0dXJuIHJldDsKKworCQkvKiBTYW5pdHkgY2hlY2sgdGhlIHNpemUgb2YgdGhl IGZpcm13YXJlIHRoYXQgd2FzIGxvYWRlZCAqLworCQlpZiAoYWRyZW5vX2dwdS0+ZndbQURSRU5P X0ZXX0dNVV0tPnNpemUgPiAweDgwMDApIHsKKwkJCWRldl9lcnIoZ211LT5kZXYsCisJCQkJIkdN VSBmaXJtd2FyZSBpcyBiaWdnZXIgdGhhbiB0aGUgYXZhaWxhYmxlIHJlZ2lvblxuIik7CisJCQkJ cmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQkvKiBUdXJuIG9uIHJlZ2lzdGVyIHJldGVudGlvbiAq LworCQlnbXVfd3JpdGUoZ211LCBSRUdfQTZYWF9HTVVfR0VORVJBTF83LCAxKTsKKworCQkvKiBX ZSBvbmx5IG5lZWQgdG8gbG9hZCB0aGUgUlBNaCBtaWNyb2NvZGUgb25jZSAqLworCQlpZiAoIXJw bWhfaW5pdCkgeworCQkJYTZ4eF9nbXVfcnBtaF9pbml0KGdtdSk7CisJCQlycG1oX2luaXQgPSB0 cnVlOworCQl9IGVsc2UgaWYgKHN0YXRlICE9IEdNVV9SRVNFVCkgeworCQkJcmV0ID0gYTZ4eF9y cG1oX3N0YXJ0KGdtdSk7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiByZXQ7CisJCX0KKworCQlp bWFnZSA9ICh1MzIgKikgYWRyZW5vX2dwdS0+ZndbQURSRU5PX0ZXX0dNVV0tPmRhdGE7CisKKwkJ Zm9yIChpID0gMDsgaSA8IGFkcmVub19ncHUtPmZ3W0FEUkVOT19GV19HTVVdLT5zaXplID4+IDI7 IGkrKykKKwkJCWdtdV93cml0ZShnbXUsIFJFR19BNlhYX0dNVV9DTTNfSVRDTV9TVEFSVCArIGks CisJCQkJaW1hZ2VbaV0pOworCX0KKworCWdtdV93cml0ZShnbXUsIFJFR19BNlhYX0dNVV9DTTNf RldfSU5JVF9SRVNVTFQsIDApOworCWdtdV93cml0ZShnbXUsIFJFR19BNlhYX0dNVV9DTTNfQk9P VF9DT05GSUcsIDB4MDIpOworCisJLyogV3JpdGUgdGhlIGlvdmEgb2YgdGhlIEhGSSB0YWJsZSAq LworCWdtdV93cml0ZShnbXUsIFJFR19BNlhYX0dNVV9IRklfUVRCTF9BRERSLCBnbXUtPmhmaS0+ aW92YSk7CisJZ211X3dyaXRlKGdtdSwgUkVHX0E2WFhfR01VX0hGSV9RVEJMX0lORk8sIDEpOwor CisJZ211X3dyaXRlKGdtdSwgUkVHX0E2WFhfR01VX0FIQl9GRU5DRV9SQU5HRV8wLAorCQkoMSA8 PCAzMSkgfCAoMHhhIDw8IDE4KSB8ICgweGEwKSk7CisKKwljaGlwaWQgPSBhZHJlbm9fZ3B1LT5y ZXYuY29yZSA8PCAyNDsKKwljaGlwaWQgfD0gYWRyZW5vX2dwdS0+cmV2Lm1ham9yIDw8IDE2Owor CWNoaXBpZCB8PSBhZHJlbm9fZ3B1LT5yZXYubWlub3IgPDwgMTI7CisJY2hpcGlkIHw9IGFkcmVu b19ncHUtPnJldi5wYXRjaGlkIDw8IDg7CisKKwlnbXVfd3JpdGUoZ211LCBSRUdfQTZYWF9HTVVf SEZJX1NGUl9BRERSLCBjaGlwaWQpOworCisJLyogU2V0IHVwIHRoZSBsb3dlc3QgaWRsZSBsZXZl bCBvbiB0aGUgR01VICovCisJYTZ4eF9nbXVfcG93ZXJfY29uZmlnKGdtdSk7CisKKwlyZXQgPSBh Nnh4X2dtdV9zdGFydChnbXUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBh Nnh4X2dtdV9nZnhfcmFpbF9vbihnbXUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkv KiBFbmFibGUgU1BUUF9QQyBpZiB0aGUgQ1BVIGlzIHJlc3BvbnNpYmxlIGZvciBpdCAqLworCWlm IChnbXUtPmlkbGVfbGV2ZWwgPCBHTVVfSURMRV9TVEFURV9TUFRQKSB7CisJCXJldCA9IGE2eHhf c3B0cHJhY19lbmFibGUoZ211KTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJ cmV0ID0gYTZ4eF9nbXVfaGZpX3N0YXJ0KGdtdSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsK KworCS8qIEZJWE1FOiBEbyB3ZSBuZWVkIHRoaXMgd21iKCkgaGVyZT8gKi8KKwl3bWIoKTsKKwor CXJldHVybiAwOworfQorCisjZGVmaW5lIEE2WFhfSEZJX0lSUV9NQVNLIFwKKwkoQTZYWF9HTVVf R01VMkhPU1RfSU5UUl9JTkZPX01TR1EgfCBcCisJIEE2WFhfR01VX0dNVTJIT1NUX0lOVFJfSU5G T19DTTNfRkFVTFQpCisKKyNkZWZpbmUgQTZYWF9HTVVfSVJRX01BU0sgXAorCShBNlhYX0dNVV9B T19IT1NUX0lOVEVSUlVQVF9TVEFUVVNfV0RPR19CSVRFIHwgXAorCSBBNlhYX0dNVV9BT19IT1NU X0lOVEVSUlVQVF9TVEFUVVNfSE9TVF9BSEJfQlVTX0VSUk9SIHwgXAorCSBBNlhYX0dNVV9BT19I T1NUX0lOVEVSUlVQVF9TVEFUVVNfRkVOQ0VfRVJSKQorCitzdGF0aWMgdm9pZCBhNnh4X2dtdV9p cnFfZW5hYmxlKHN0cnVjdCBhNnh4X2dtdSAqZ211KQoreworCWdtdV93cml0ZShnbXUsIFJFR19B NlhYX0dNVV9BT19IT1NUX0lOVEVSUlVQVF9DTFIsIH4wKTsKKwlnbXVfd3JpdGUoZ211LCBSRUdf QTZYWF9HTVVfR01VMkhPU1RfSU5UUl9DTFIsIH4wKTsKKworCWdtdV93cml0ZShnbXUsIFJFR19B NlhYX0dNVV9BT19IT1NUX0lOVEVSUlVQVF9NQVNLLAorCQl+QTZYWF9HTVVfSVJRX01BU0spOwor CWdtdV93cml0ZShnbXUsIFJFR19BNlhYX0dNVV9HTVUySE9TVF9JTlRSX01BU0ssCisJCX5BNlhY X0hGSV9JUlFfTUFTSyk7CisKKwllbmFibGVfaXJxKGdtdS0+Z211X2lycSk7CisJZW5hYmxlX2ly cShnbXUtPmhmaV9pcnEpOworfQorCitzdGF0aWMgdm9pZCBhNnh4X2dtdV9pcnFfZGlzYWJsZShz dHJ1Y3QgYTZ4eF9nbXUgKmdtdSkKK3sKKwlkaXNhYmxlX2lycShnbXUtPmdtdV9pcnEpOworCWRp c2FibGVfaXJxKGdtdS0+aGZpX2lycSk7CisKKwlnbXVfd3JpdGUoZ211LCBSRUdfQTZYWF9HTVVf QU9fSE9TVF9JTlRFUlJVUFRfTUFTSywgfjApOworCWdtdV93cml0ZShnbXUsIFJFR19BNlhYX0dN VV9HTVUySE9TVF9JTlRSX01BU0ssIH4wKTsKK30KKworc3RhdGljIHZvaWQgYTZ4eF9nbXVfZGlz YWJsZV9jbG9ja3Moc3RydWN0IGE2eHhfZ211ICpnbXUpCit7CisJaW50IGk7CisKKwlmb3IgKGkg PSAwOyBpIDwgZ211LT5ucl9jbG9ja3M7IGkrKykKKwkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGdt dS0+Y2xvY2tzW2ldKTsKK30KKworc3RhdGljIHZvaWQgYTZ4eF9nbXVfZGlzYWJsZV9nZHNjKHN0 cnVjdCBhNnh4X2dtdSAqZ211KQoreworCWlmIChnbXUtPmN4KQorCQlyZWd1bGF0b3JfZGlzYWJs ZShnbXUtPmN4KTsKK30KKworc3RhdGljIGludCBhNnh4X2dtdV9lbmFibGVfZ2RzYyhzdHJ1Y3Qg YTZ4eF9nbXUgKmdtdSkKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmIChnbXUtPmN4KQorCQlyZXQg PSByZWd1bGF0b3JfZW5hYmxlKGdtdS0+Y3gpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGlj IHZvaWQgYTZ4eF9nbXVfZW5hYmxlX2Nsb2NrcyhzdHJ1Y3QgYTZ4eF9nbXUgKmdtdSkKK3sKKwlp bnQgaTsKKworCS8qIFVzZSBhIGtub3duIHJhdGUgdG8gYnJpbmcgdXAgdGhlIEdNVSAqLworCWNs a19zZXRfcmF0ZShnbXUtPmNvcmVfY2xrLCAyMDAwMDAwMDApOworCisJZm9yIChpID0gMDsgaSA8 IGdtdS0+bnJfY2xvY2tzOyBpKyspCisJCWNsa19wcmVwYXJlX2VuYWJsZShnbXUtPmNsb2Nrc1tp XSk7Cit9CisKK2ludCBhNnh4X2dtdV9yZXNldChzdHJ1Y3QgYTZ4eF9ncHUgKmE2eHhfZ3B1KQor eworCXN0cnVjdCBhNnh4X2dtdSAqZ211ID0gJmE2eHhfZ3B1LT5nbXU7CisJaW50IHJldDsKKwl1 MzIgdmFsOworCisJLyogRmx1c2ggYWxsIHRoZSBxdWV1ZXMgKi8KKwlhNnh4X2hmaV9zdG9wKGdt dSk7CisKKwkvKiBTdG9wIHRoZSBpbnRlcnJ1cHRzICovCisJYTZ4eF9nbXVfaXJxX2Rpc2FibGUo Z211KTsKKworCS8qIEZvcmNlIG9mZiBTUFRQIGluIGNhc2UgdGhlIEdNVSBpcyBtYW5hZ2luZyBp dCAqLworCWE2eHhfc3B0cHJhY19kaXNhYmxlKGdtdSk7CisKKwkvKiBNYWtlIHN1cmUgdGhlcmUg YXJlIG5vIG91dHN0YW5kaW5nIFJQTWggdm90ZXMgKi8KKwlnbXVfcG9sbF90aW1lb3V0KGdtdSwg UkVHX0E2WFhfUlNDQ19UQ1MwX0RSVjBfU1RBVFVTLCB2YWwsCisJCSh2YWwgJiAxKSwgMTAwLCAx MDAwMCk7CisJZ211X3BvbGxfdGltZW91dChnbXUsIFJFR19BNlhYX1JTQ0NfVENTMV9EUlYwX1NU QVRVUywgdmFsLAorCQkodmFsICYgMSksIDEwMCwgMTAwMDApOworCWdtdV9wb2xsX3RpbWVvdXQo Z211LCBSRUdfQTZYWF9SU0NDX1RDUzJfRFJWMF9TVEFUVVMsIHZhbCwKKwkJKHZhbCAmIDEpLCAx MDAsIDEwMDAwKTsKKwlnbXVfcG9sbF90aW1lb3V0KGdtdSwgUkVHX0E2WFhfUlNDQ19UQ1MzX0RS VjBfU1RBVFVTLCB2YWwsCisJCSh2YWwgJiAxKSwgMTAwLCAxMDAwKTsKKworCS8qIEZvcmNlIG9m ZiB0aGUgR1ggR1NEQyAqLworCXJlZ3VsYXRvcl9mb3JjZV9kaXNhYmxlKGdtdS0+Z3gpOworCisJ LyogRGlzYWJsZSB0aGUgcmVzb3VyY2VzICovCisJYTZ4eF9nbXVfZGlzYWJsZV9jbG9ja3MoZ211 KTsKKwlhNnh4X2dtdV9kaXNhYmxlX2dkc2MoZ211KTsKKworCS8qIFJlLWVuYWJsZSB0aGUgcmVz b3VyY2VzICovCisJYTZ4eF9nbXVfZW5hYmxlX2dkc2MoZ211KTsKKwlhNnh4X2dtdV9lbmFibGVf Y2xvY2tzKGdtdSk7CisJYTZ4eF9nbXVfaXJxX2VuYWJsZShnbXUpOworCisJcmV0ID0gYTZ4eF9n bXVfZndfc3RhcnQoZ211LCBHTVVfUkVTRVQpOworCWlmICghcmV0KQorCQlyZXQgPSBhNnh4X2hm aV9zdGFydChnbXUsIEdNVV9DT0xEX0JPT1QpOworCisJaWYgKHJldCkKKwkJYTZ4eF9nbXVfY2xl YXJfb29iKGdtdSwgR01VX09PQl9CT09UX1NMVU1CRVIpOworCisJcmV0dXJuIHJldDsKK30KKwor aW50IGE2eHhfZ211X3Jlc3VtZShzdHJ1Y3QgYTZ4eF9ncHUgKmE2eHhfZ3B1KQoreworCXN0cnVj dCBhNnh4X2dtdSAqZ211ID0gJmE2eHhfZ3B1LT5nbXU7CisJaW50IHN0YXR1cywgcmV0OworCisJ aWYgKFdBUk4oIWdtdS0+bW1pbywgIlRoZSBHTVUgaXMgbm90IHNldCB1cCB5ZXRcbiIpKQorCQly ZXR1cm4gMDsKKworCS8qIFR1cm4gb24gdGhlIHJlc291cmNlcyAqLworCWE2eHhfZ211X2VuYWJs ZV9nZHNjKGdtdSk7CisJYTZ4eF9nbXVfZW5hYmxlX2Nsb2NrcyhnbXUpOworCWE2eHhfZ211X2ly cV9lbmFibGUoZ211KTsKKworCS8qIENoZWNrIHRvIHNlZSBpZiB3ZSBhcmUgZG9pbmcgYSBjb2xk IG9yIHdhcm0gYm9vdCAqLworCXN0YXR1cyA9IGdtdV9yZWFkKGdtdSwgUkVHX0E2WFhfR01VX0dF TkVSQUxfNykgPT0gMSA/CisJCUdNVV9XQVJNX0JPT1QgOiBHTVVfQ09MRF9CT09UOworCisJIHJl dCA9IGE2eHhfZ211X2Z3X3N0YXJ0KGdtdSwgc3RhdHVzKTsKKwlpZiAocmV0KQorCQlnb3RvIG91 dDsKKworCSByZXQgPSBhNnh4X2hmaV9zdGFydChnbXUsIHN0YXR1cyk7CisKK291dDoKKwkvKiBN YWtlIHN1cmUgdG8gdHVybiBvZmYgdGhlIGJvb3QgT09CIHJlcXVlc3Qgb24gZXJyb3IgKi8KKwlp ZiAocmV0KQorCQlhNnh4X2dtdV9jbGVhcl9vb2IoZ211LCBHTVVfT09CX0JPT1RfU0xVTUJFUik7 CisKKwlyZXR1cm4gcmV0OworfQorCitib29sIGE2eHhfZ211X2lzaWRsZShzdHJ1Y3QgYTZ4eF9n bXUgKmdtdSkKK3sKKwl1MzIgcmVnOworCisJaWYgKCFnbXUtPm1taW8pCisJCXJldHVybiB0cnVl OworCisJcmVnID0gZ211X3JlYWQoZ211LCBSRUdfQTZYWF9HUFVfR01VX0FPX0dQVV9DWF9CVVNZ X1NUQVRVUyk7CisKKwlpZiAocmVnICYgIEE2WFhfR1BVX0dNVV9BT19HUFVfQ1hfQlVTWV9TVEFU VVNfR1BVQlVTWUlHTkFIQikKKwkJcmV0dXJuIGZhbHNlOworCisJcmV0dXJuIHRydWU7Cit9CisK K2ludCBhNnh4X2dtdV9zdG9wKHN0cnVjdCBhNnh4X2dwdSAqYTZ4eF9ncHUpCit7CisJc3RydWN0 IGE2eHhfZ211ICpnbXUgPSAmYTZ4eF9ncHUtPmdtdTsKKwl1MzIgdmFsOworCisJLyoKKwkgKiBU aGUgR01VIG1heSBzdGlsbCBiZSBpbiBzbHVtYmVyIHVubGVzcyB0aGUgR1BVIHN0YXJ0ZWQgc28g Y2hlY2sgYW5kCisJICogc2tpcCBwdXR0aW5nIGl0IGJhY2sgaW50byBzbHVtYmVyIGlmIHNvCisJ ICovCisJdmFsID0gZ211X3JlYWQoZ211LCBSRUdfQTZYWF9HUFVfR01VX0NYX0dNVV9SUE1IX1BP V0VSX1NUQVRFKTsKKworCWlmICh2YWwgIT0gMHhmKSB7CisJCWludCByZXQgPSBhNnh4X2dtdV93 YWl0X2Zvcl9pZGxlKGE2eHhfZ3B1KTsKKworCQkvKiBUZW1wb3JhcnkgdW50aWwgd2UgY2FuIHJl Y292ZXIgc2FmZWx5ICovCisJCUJVR19PTihyZXQpOworCisJCS8qIHRlbGwgdGhlIEdNVSB3ZSB3 YW50IHRvIHNsdW1iZXIgKi8KKwkJYTZ4eF9nbXVfbm90aWZ5X3NsdW1iZXIoZ211KTsKKworCQly ZXQgPSBnbXVfcG9sbF90aW1lb3V0KGdtdSwKKwkJCVJFR19BNlhYX0dQVV9HTVVfQU9fR1BVX0NY X0JVU1lfU1RBVFVTLCB2YWwsCisJCQkhKHZhbCAmIEE2WFhfR1BVX0dNVV9BT19HUFVfQ1hfQlVT WV9TVEFUVVNfR1BVQlVTWUlHTkFIQiksCisJCQkxMDAsIDEwMDAwKTsKKworCQkvKgorCQkgKiBM ZXQgdGhlIHVzZXIga25vdyB3ZSBmYWlsZWQgdG8gc2x1bWJlciBidXQgZG9uJ3Qgd29ycnkgdG9v CisJCSAqIG11Y2ggYmVjYXVzZSB3ZSBhcmUgcG93ZXJpbmcgZG93biBhbnl3YXkKKwkJICovCisK KwkJaWYgKHJldCkKKwkJCWRldl9lcnIoZ211LT5kZXYsCisJCQkJIlVuYWJsZSB0byBzbHVtYmVy IEdNVTogc3RhdHVzID0gMCV4LzAleFxuIiwKKwkJCQlnbXVfcmVhZChnbXUsIFJFR19BNlhYX0dQ VV9HTVVfQU9fR1BVX0NYX0JVU1lfU1RBVFVTKSwKKwkJCQlnbXVfcmVhZChnbXUsIFJFR19BNlhY X0dQVV9HTVVfQU9fR1BVX0NYX0JVU1lfU1RBVFVTMikpOworCX0KKworCS8qIFR1cm4gb2ZmIEhG SSAqLworCWE2eHhfaGZpX3N0b3AoZ211KTsKKworCS8qIFN0b3AgdGhlIGludGVycnVwdHMgYW5k IG1hc2sgdGhlIGhhcmR3YXJlICovCisJYTZ4eF9nbXVfaXJxX2Rpc2FibGUoZ211KTsKKworCS8q IFRlbGwgUlBNaCB0byBwb3dlciBvZmYgdGhlIEdQVSAqLworCWE2eHhfcnBtaF9zdG9wKGdtdSk7 CisKKwlhNnh4X2dtdV9kaXNhYmxlX2Nsb2NrcyhnbXUpOworCWE2eHhfZ211X2Rpc2FibGVfZ2Rz YyhnbXUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGE2eHhfZ211X21lbW9yeV9m cmVlKHN0cnVjdCBhNnh4X2dtdSAqZ211LCBzdHJ1Y3QgYTZ4eF9nbXVfYm8gKmJvKQoreworCWlu dCBjb3VudCwgaTsKKwl1NjQgaW92YTsKKworCWlmIChJU19FUlJfT1JfTlVMTChibykpCisJCXJl dHVybjsKKworCWNvdW50ID0gYm8tPnNpemUgPj4gUEFHRV9TSElGVDsKKwlpb3ZhID0gYm8tPmlv dmE7CisKKwlwbV9ydW50aW1lX2dldF9zdXBwbGllcnMoZ211LT5kZXYpOworCWZvciAoaSA9IDA7 IGkgPCBjb3VudDsgaSsrLCBpb3ZhICs9IFBBR0VfU0laRSkgeworCQlpb21tdV91bm1hcChnbXUt PmRvbWFpbiwgaW92YSwgUEFHRV9TSVpFKTsKKwkJX19mcmVlX3BhZ2VzKGJvLT5wYWdlc1tpXSwg MCk7CisJfQorCXBtX3J1bnRpbWVfcHV0X3N1cHBsaWVycyhnbXUtPmRldik7CisKKwlrZnJlZShi by0+cGFnZXMpOworCWtmcmVlKGJvKTsKK30KKworc3RhdGljIHN0cnVjdCBhNnh4X2dtdV9ibyAq YTZ4eF9nbXVfbWVtb3J5X2FsbG9jKHN0cnVjdCBhNnh4X2dtdSAqZ211LAorCQlzaXplX3Qgc2l6 ZSkKK3sKKwlzdHJ1Y3QgYTZ4eF9nbXVfYm8gKmJvOworCWludCByZXQgPSAtRU5PTUVNLCBjb3Vu dCwgaTsKKworCWJvID0ga3phbGxvYyhzaXplb2YoKmJvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFi bykKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwliby0+c2l6ZSA9IFBBR0VfQUxJR04o c2l6ZSk7CisKKwljb3VudCA9IGJvLT5zaXplID4+IFBBR0VfU0hJRlQ7CisKKwliby0+cGFnZXMg PSBrY2FsbG9jKGNvdW50LCBzaXplb2Yoc3RydWN0IHBhZ2UgKiksIEdGUF9LRVJORUwpOworCWlm ICghYm8tPnBhZ2VzKSB7CisJCWtmcmVlKGJvKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7 CisJfQorCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJYm8tPnBhZ2VzW2ldID0g YWxsb2NfcGFnZShHRlBfS0VSTkVMKTsKKwkJaWYgKCFiby0+cGFnZXNbaV0pCisJCQlnb3RvIGVy cjsKKwl9CisKKwliby0+aW92YSA9IGdtdS0+dW5jYWNoZWRfaW92YV9iYXNlOworCisJZm9yIChp ID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJcmV0ID0gaW9tbXVfbWFwKGdtdS0+ZG9tYWluLAor CQkJYm8tPmlvdmEgKyAoUEFHRV9TSVpFICogaSksCisJCQlwYWdlX3RvX3BoeXMoYm8tPnBhZ2Vz W2ldKSwgUEFHRV9TSVpFLAorCQkJSU9NTVVfUkVBRCB8IElPTU1VX1dSSVRFKTsKKworCQlpZiAo cmV0KSB7CisJCQlkZXZfZXJyKGdtdS0+ZGV2LCAiVW5hYmxlIHRvIG1hcCBHTVUgYnVmZmVyIG9i amVjdFxuIik7CisKKwkJCXBtX3J1bnRpbWVfZ2V0X3N1cHBsaWVycyhnbXUtPmRldik7CisJCQlm b3IgKGkgPSBpIC0gMSA7IGkgPj0gMDsgaS0tKSB7CisJCQkJaW9tbXVfdW5tYXAoZ211LT5kb21h aW4sCisJCQkJCWJvLT5pb3ZhICsgKFBBR0VfU0laRSAqIGkpLAorCQkJCQlQQUdFX1NJWkUpOwor CQkJfQorCQkJcG1fcnVudGltZV9wdXRfc3VwcGxpZXJzKGdtdS0+ZGV2KTsKKworCQkJZ290byBl cnI7CisJCX0KKwl9CisKKwliby0+dmlydCA9IHZtYXAoYm8tPnBhZ2VzLCBjb3VudCwgVk1fSU9S RU1BUCwKKwkJcGdwcm90X3dyaXRlY29tYmluZShQQUdFX0tFUk5FTCkpOworCWlmICghYm8tPnZp cnQpCisJCWdvdG8gZXJyOworCisJLyogQWxpZ24gZnV0dXJlIElPVkEgYWRkcmVzc2VzIG9uIDFN QiBib3VuZGFyaWVzICovCisJZ211LT51bmNhY2hlZF9pb3ZhX2Jhc2UgKz0gQUxJR04oc2l6ZSwg U1pfMU0pOworCisJcmV0dXJuIGJvOworCitlcnI6CisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBp KyspIHsKKwkJaWYgKGJvLT5wYWdlc1tpXSkKKwkJCV9fZnJlZV9wYWdlcyhiby0+cGFnZXNbaV0s IDApOworCX0KKworCWtmcmVlKGJvLT5wYWdlcyk7CisJa2ZyZWUoYm8pOworCisJcmV0dXJuIEVS Ul9QVFIocmV0KTsKK30KKworc3RhdGljIGludCBhNnh4X2dtdV9tZW1vcnlfcHJvYmUoc3RydWN0 IGE2eHhfZ211ICpnbXUpCit7CisJaW50IHJldDsKKworCS8qCisJICogVGhlIEdNVSBhZGRyZXNz IHNwYWNlIGlzIGhhcmRjb2RlZCB0byB0cmVhdCB0aGUgcmFuZ2UKKwkgKiAweDYwMDAwMDAwIC0g MHg4MDAwMDAwMCBhcyB1bi1jYWNoZWQgbWVtb3J5LiBBbGwgYnVmZmVycyBzaGFyZWQKKwkgKiBi ZXR3ZWVuIHRoZSBHTVUgYW5kIHRoZSBDUFUgd2lsbCBsaXZlIGluIHRoaXMgc3BhY2UKKwkgKi8K KwlnbXUtPnVuY2FjaGVkX2lvdmFfYmFzZSA9IDB4NjAwMDAwMDA7CisKKworCWdtdS0+ZG9tYWlu ID0gaW9tbXVfZG9tYWluX2FsbG9jKCZwbGF0Zm9ybV9idXNfdHlwZSk7CisJaWYgKCFnbXUtPmRv bWFpbikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlwbV9ydW50aW1lX2dldF9zdXBwbGllcnMoZ211 LT5kZXYpOworCXJldCA9IGlvbW11X2F0dGFjaF9kZXZpY2UoZ211LT5kb21haW4sIGdtdS0+ZGV2 KTsKKworCWlmIChyZXQpIHsKKwkJaW9tbXVfZG9tYWluX2ZyZWUoZ211LT5kb21haW4pOworCQln bXUtPmRvbWFpbiA9IE5VTEw7CisJfQorCisJcG1fcnVudGltZV9wdXRfc3VwcGxpZXJzKGdtdS0+ ZGV2KTsKKwlyZXR1cm4gcmV0OworfQorCisvKiBHZXQgdGhlIGxpc3Qgb2YgUlBNaCB2b2x0YWdl IGxldmVscyBmcm9tIGNtZC1kYiAqLworc3RhdGljIGludCBhNnh4X2dtdV9ycG1oX2FyY19jbWRz KGNvbnN0IGNoYXIgKmlkLCB2b2lkICp2YWxzLCBpbnQgc2l6ZSkKK3sKKwl1MzIgbGVuID0gY21k X2RiX2dldF9hdXhfZGF0YV9sZW4oaWQpOworCisJaWYgKCFsZW4pCisJCXJldHVybiAwOworCisJ aWYgKFdBUk5fT04obGVuID4gc2l6ZSkpCisJCXJldHVybiAtRUlOVkFMOworCisJY21kX2RiX2dl dF9hdXhfZGF0YShpZCwgdmFscywgbGVuKTsKKworCS8qCisJICogVGhlIGRhdGEgY29tZXMgYmFj ayBhcyBhbiBhcnJheSBvZiB1bnNpZ25lZCBzaG9ydHMgc28gYWRqdXN0IHRoZQorCSAqIGNvdW50 IGFjY29yZGluZ2x5CisJICovCisJcmV0dXJuIGxlbiA+PiAxOworfQorCisvKiBSZXR1cm4gdGhl ICdhcmMtbGV2ZWwnIGZvciB0aGUgZ2l2ZW4gZnJlcXVlbmN5ICovCitzdGF0aWMgdTMyIGE2eHhf Z211X2dldF9hcmNfbGV2ZWwoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIGZyZXEp Cit7CisJc3RydWN0IGRldl9wbV9vcHAgKm9wcDsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOwor CXUzMiB2YWwgPSAwOworCisJaWYgKCFmcmVxKQorCQlyZXR1cm4gMDsKKworCW9wcCAgPSBkZXZf cG1fb3BwX2ZpbmRfZnJlcV9leGFjdChkZXYsIGZyZXEsIHRydWUpOworCWlmIChJU19FUlIob3Bw KSkKKwkJcmV0dXJuIDA7CisKKwlucCA9IGRldl9wbV9vcHBfZ2V0X25wKG9wcCk7CisKKwlpZiAo bnApCisJCW9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAicWNvbSxhcmMtbGV2ZWwiLCAmdmFsKTsK KworCWRldl9wbV9vcHBfcHV0KG9wcCk7CisKKwlyZXR1cm4gdmFsOworfQorCisKK3N0YXRpYyBp bnQgYTZ4eF9nbXVfcnBtaF9hcmNfdm90ZXNfaW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYsIHUzMiAq dm90ZXMsCisJCXVuc2lnbmVkIGxvbmcgKmZyZXFzLCBpbnQgZnJlcXNfY291bnQsCisJCXUxNiAq cHJpLCBpbnQgcHJpX2NvdW50LAorCQl1MTYgKnNlYywgaW50IHNlY19jb3VudCkKK3sKKwlpbnQg aSwgajsKKworCS8qIENvbnN0cnVjdCBhIHZvdGUgZm9yIGVhY2ggZnJlcXVlbmN5ICovCisJZm9y IChpID0gMDsgaSA8IGZyZXFzX2NvdW50OyBpKyspIHsKKwkJdTggcGluZGV4ID0gMCwgc2luZGV4 ID0gMDsKKwkJdTMyIGxldmVsID0gYTZ4eF9nbXVfZ2V0X2FyY19sZXZlbChkZXYsIGZyZXFzW2ld KTsKKworCQkvKiBHZXQgdGhlIHByaW1hcnkgaW5kZXggdGhhdCBtYXRjaGVzIHRoZSBhcmMgbGV2 ZWwgKi8KKwkJZm9yIChqID0gMDsgaiA8IHByaV9jb3VudDsgaisrKSB7CisJCQlpZiAocHJpW2pd ID09IGxldmVsKSB7CisJCQkJcGluZGV4ID0gajsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJ CWlmIChqID09IHByaV9jb3VudCkgeworCQkJZGV2X2VycihkZXYsCisJCQkJIkxldmVsICV1IG5v dCBmb3VuZCBpbiBpbiB0aGUgUlBNaCBsaXN0XG4iLAorCQkJCQlsZXZlbCk7CisJCQlkZXZfZXJy KGRldiwgIkF2YWlsYWJsZSBsZXZlbHM6XG4iKTsKKwkJCWZvciAoaiA9IDA7IGogPCBwcmlfY291 bnQ7IGorKykKKwkJCQlkZXZfZXJyKGRldiwgIiAgJXVcbiIsIHByaVtqXSk7CisKKwkJCXJldHVy biAtRUlOVkFMOworCQl9CisKKwkJLyoKKwkJICogTG9vayBmb3IgYSBsZXZlbCBpbiBpbiB0aGUg c2Vjb25kYXJ5IGxpc3QgdGhhdCBtYXRjaGVzLiBJZgorCQkgKiBub3RoaW5nIGZpdHMsIHVzZSB0 aGUgbWF4aW11bQorCQkgKi8KKwkJc2luZGV4ID0gc2VjX2NvdW50IC0gMTsKKworCQlmb3IgKGog PSAwOyBqIDwgc2VjX2NvdW50IC0gMTsgaisrKSB7CisJCQlpZiAoc2VjW2pdID49IGxldmVsKQor CQkJCXNpbmRleCA9IGo7CisJCX0KKworCQkvKiBDb25zdHJ1Y3QgdGhlIHZvdGUgKi8KKwkJdm90 ZXNbaV0gPSAoKGxldmVsICYgMHhmZmZmKSA8PCAxNikgfCBzaW5kZXggPDwgOCB8IHBpbmRleDsK Kwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoZSBHTVUgdm90ZXMgd2l0aCB0aGUgUlBN aCBmb3IgaXRzZWxmIGFuZCBvbiBiZWhhbGYgb2YgdGhlIEdQVSBidXQgd2UgbmVlZAorICogdG8g Y29uc3RydWN0IHRoZSBsaXN0IG9mIHZvdGVzIG9uIHRoZSBDUFUgYW5kIHNlbmQgaXQgb3Zlci4g UXVlcnkgdGhlIFJQTWgKKyAqIHZvbHRhZ2UgbGV2ZWxzIGFuZCBidWlsZCB0aGUgdm90ZXMKKyAq LworCitzdGF0aWMgaW50IGE2eHhfZ211X3JwbWhfdm90ZXNfaW5pdChzdHJ1Y3QgYTZ4eF9nbXUg KmdtdSkKK3sKKwlzdHJ1Y3QgYTZ4eF9ncHUgKmE2eHhfZ3B1ID0gY29udGFpbmVyX29mKGdtdSwg c3RydWN0IGE2eHhfZ3B1LCBnbXUpOworCXN0cnVjdCBhZHJlbm9fZ3B1ICphZHJlbm9fZ3B1ID0g JmE2eHhfZ3B1LT5iYXNlOworCXN0cnVjdCBtc21fZ3B1ICpncHUgPSAmYWRyZW5vX2dwdS0+YmFz ZTsKKworCXUxNiBneFsxNl0sIGN4WzE2XSwgbXhbMTZdOworCXUzMiBneGNvdW50LCBjeGNvdW50 LCBteGNvdW50OworCWludCByZXQ7CisKKwkvKiBHZXQgdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIHZv bHRhZ2UgbGV2ZWxzIGZvciBlYWNoIGNvbXBvbmVudCAqLworCWd4Y291bnQgPSBhNnh4X2dtdV9y cG1oX2FyY19jbWRzKCJnZngubHZsIiwgZ3gsIHNpemVvZihneCkpOworCWN4Y291bnQgPSBhNnh4 X2dtdV9ycG1oX2FyY19jbWRzKCJjeC5sdmwiLCBjeCwgc2l6ZW9mKGN4KSk7CisJbXhjb3VudCA9 IGE2eHhfZ211X3JwbWhfYXJjX2NtZHMoIm14Lmx2bCIsIG14LCBzaXplb2YobXgpKTsKKworCS8q IEJ1aWxkIHRoZSBHWCB2b3RlcyAqLworCXJldCA9IGE2eHhfZ211X3JwbWhfYXJjX3ZvdGVzX2lu aXQoJmdwdS0+cGRldi0+ZGV2LCBnbXUtPmd4X2FyY192b3RlcywKKwkJZ211LT5ncHVfZnJlcXMs IGdtdS0+bnJfZ3B1X2ZyZXFzLAorCQlneCwgZ3hjb3VudCwgbXgsIG14Y291bnQpOworCisJLyog QnVpbGQgdGhlIENYIHZvdGVzICovCisJcmV0IHw9IGE2eHhfZ211X3JwbWhfYXJjX3ZvdGVzX2lu aXQoZ211LT5kZXYsIGdtdS0+Y3hfYXJjX3ZvdGVzLAorCQlnbXUtPmdtdV9mcmVxcywgZ211LT5u cl9nbXVfZnJlcXMsCisJCWN4LCBjeGNvdW50LCBteCwgbXhjb3VudCk7CisKKwlyZXR1cm4gcmV0 OworfQorCitzdGF0aWMgaW50IGE2eHhfZ211X2J1aWxkX2ZyZXFfdGFibGUoc3RydWN0IGRldmlj ZSAqZGV2LCB1bnNpZ25lZCBsb25nICpmcmVxcywKKwkJdTMyIHNpemUpCit7CisJaW50IGNvdW50 ID0gZGV2X3BtX29wcF9nZXRfb3BwX2NvdW50KGRldik7CisJc3RydWN0IGRldl9wbV9vcHAgKm9w cDsKKwlpbnQgaSwgaW5kZXggPSAwOworCXVuc2lnbmVkIGxvbmcgZnJlcSA9IDE7CisKKwkvKgor CSAqIFRoZSBPUFAgdGFibGUgZG9lc24ndCBjb250YWluIHRoZSAib2ZmIiBmcmVxdWVuY3kgbGV2 ZWwgc28gd2UgbmVlZCB0bworCSAqIGFkZCAxIHRvIHRoZSB0YWJsZSBzaXplIHRvIGFjY291bnQg Zm9yIGl0CisJICovCisKKwlpZiAoV0FSTihjb3VudCArIDEgPiBzaXplLAorCQkiVGhlIEdNVSBm cmVxdWVuY3kgdGFibGUgaXMgYmVpbmcgdHJ1bmNhdGVkXG4iKSkKKwkJY291bnQgPSBzaXplIC0g MTsKKworCS8qIFNldCB0aGUgIm9mZiIgZnJlcXVlbmN5ICovCisJZnJlcXNbaW5kZXgrK10gPSAw OworCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJb3BwID0gZGV2X3BtX29wcF9m aW5kX2ZyZXFfY2VpbChkZXYsICZmcmVxKTsKKwkJaWYgKElTX0VSUihvcHApKQorCQkJYnJlYWs7 CisKKwkJZnJlcXNbaW5kZXgrK10gPSBmcmVxKys7CisJfQorCisJcmV0dXJuIGluZGV4OworfQor CitzdGF0aWMgaW50IGE2eHhfZ211X3B3cmxldmVsc19wcm9iZShzdHJ1Y3QgYTZ4eF9nbXUgKmdt dSkKK3sKKwlzdHJ1Y3QgYTZ4eF9ncHUgKmE2eHhfZ3B1ID0gY29udGFpbmVyX29mKGdtdSwgc3Ry dWN0IGE2eHhfZ3B1LCBnbXUpOworCXN0cnVjdCBhZHJlbm9fZ3B1ICphZHJlbm9fZ3B1ID0gJmE2 eHhfZ3B1LT5iYXNlOworCXN0cnVjdCBtc21fZ3B1ICpncHUgPSAmYWRyZW5vX2dwdS0+YmFzZTsK KworCWludCByZXQgPSAwOworCisJLyoKKwkgKiBUaGUgR01VIGhhbmRsZXMgaXRzIG93biBmcmVx dWVuY3kgc3dpdGNoaW5nIHNvIGJ1aWxkIGEgbGlzdCBvZgorCSAqIGF2YWlsYWJsZSBmcmVxdWVu Y2llcyB0byBzZW5kIGR1cmluZyBpbml0YWxpemF0aW9uCisJICovCisJcmV0ID0gZGV2X3BtX29w cF9vZl9hZGRfdGFibGUoZ211LT5kZXYpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihnbXUtPmRl diwgIlVuYWJsZSB0byBzZXQgdGhlIE9QUCB0YWJsZSBmb3IgdGhlIEdNVVxuIik7CisJCXJldHVy biByZXQ7CisJfQorCisJZ211LT5ucl9nbXVfZnJlcXMgPSBhNnh4X2dtdV9idWlsZF9mcmVxX3Rh YmxlKGdtdS0+ZGV2LAorCQlnbXUtPmdtdV9mcmVxcywgQVJSQVlfU0laRShnbXUtPmdtdV9mcmVx cykpOworCisJLyoKKwkgKiBUaGUgR01VIGFsc28gaGFuZGxlcyBHUFUgZnJlcXVlbmN5IHN3aXRj aGluZyBzbyBidWlsZCBhIGxpc3QKKwkgKiBmcm9tIHRoZSBHUFUgT1BQIHRhYmxlCisJICovCisJ Z211LT5ucl9ncHVfZnJlcXMgPSBhNnh4X2dtdV9idWlsZF9mcmVxX3RhYmxlKCZncHUtPnBkZXYt PmRldiwKKwkJZ211LT5ncHVfZnJlcXMsIEFSUkFZX1NJWkUoZ211LT5ncHVfZnJlcXMpKTsKKwor CS8qIEJ1aWxkIHRoZSBsaXN0IG9mIFJQTWggdm90ZXMgdGhhdCB3ZSdsbCBzZW5kIHRvIHRoZSBH TVUgKi8KKwlyZXR1cm4gYTZ4eF9nbXVfcnBtaF92b3Rlc19pbml0KGdtdSk7Cit9CisKK3N0YXRp YyBpbnQgYTZ4eF9nbXVfY2xvY2tzX3Byb2JlKHN0cnVjdCBhNnh4X2dtdSAqZ211KQoreworCXN0 cnVjdCBwcm9wZXJ0eSAqcHJvcDsKKwljb25zdCBjaGFyICpuYW1lOworCWludCBpID0gMDsKKwor CWdtdS0+bnJfY2xvY2tzID0gb2ZfcHJvcGVydHlfY291bnRfc3RyaW5ncyhnbXUtPmRldi0+b2Zf bm9kZSwKKwkJImNsb2NrLW5hbWVzIik7CisKKwlpZiAoZ211LT5ucl9jbG9ja3MgPCAxKSB7CisJ CWRldl9lcnIoZ211LT5kZXYsICJObyBjbG9ja3MgaGF2ZSBiZWVuIGRlZmluZWRcbiIpOworCQln bXUtPm5yX2Nsb2NrcyA9IDA7CisJCXJldHVybiAwOworCX0KKworCWdtdS0+Y2xvY2tzID0gZGV2 bV9rY2FsbG9jKGdtdS0+ZGV2LCBzaXplb2Yoc3RydWN0IGNsayAqKSwKKwkJZ211LT5ucl9jbG9j a3MsIEdGUF9LRVJORUwpOworCWlmICghZ211LT5jbG9ja3MpIHsKKwkJZ211LT5ucl9jbG9ja3Mg PSAwOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlvZl9wcm9wZXJ0eV9mb3JfZWFjaF9zdHJp bmcoZ211LT5kZXYtPm9mX25vZGUsICJjbG9jay1uYW1lcyIsIHByb3AsCisJCW5hbWUpIHsKKwkJ Z211LT5jbG9ja3NbaV0gPSBkZXZtX2Nsa19nZXQoZ211LT5kZXYsIG5hbWUpOworCQlpZiAoSVNf RVJSKGdtdS0+Y2xvY2tzW2ldKSkgeworCQkJaW50IHJldCA9IFBUUl9FUlIoZ211LT5jbG9ja3Nb aV0pOworCisJCQlkZXZfZXJyKGdtdS0+ZGV2LCAiVW5hYmxlIHRvIGFsbG9jYXRlIGNsb2NrICVz OiAlZFxuIiwKKwkJCQluYW1lLCByZXQpOworCQl9CisKKwkJaWYgKHN0cmNtcChuYW1lLCAiZ211 IikgfHwgc3RyY21wKG5hbWUsICJnbXVfY2xrIikpCisJCQlnbXUtPmNvcmVfY2xrID0gZ211LT5j bG9ja3NbaV07CisKKwkJaSsrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBf X2lvbWVtICphNnh4X2dtdV9nZXRfbW1pbyhzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAor CQljb25zdCBjaGFyICpuYW1lKQoreworCXZvaWQgX19pb21lbSAqcmV0OworCXN0cnVjdCByZXNv dXJjZSAqcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlX2J5bmFtZShwZGV2LAorCQkJSU9SRVNP VVJDRV9NRU0sIG5hbWUpOworCisJaWYgKCFyZXMpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAi VW5hYmxlIHRvIGZpbmQgdGhlICVzIHJlZ2lzdGVyc1xuIiwgbmFtZSk7CisJCXJldHVybiBFUlJf UFRSKC1FSU5WQUwpOworCX0KKworCXJldCA9IGRldm1faW9yZW1hcCgmcGRldi0+ZGV2LCByZXMt PnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOworCWlmICghcmV0KSB7CisJCWRldl9lcnIoJnBk ZXYtPmRldiwgIlVuYWJsZSB0byBtYXAgdGhlICVzIHJlZ2lzdGVyc1xuIiwgbmFtZSk7CisJCXJl dHVybiBFUlJfUFRSKC1FSU5WQUwpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBp bnQgYTZ4eF9nbXVfZ2V0X2lycShzdHJ1Y3QgYTZ4eF9nbXUgKmdtdSwgc3RydWN0IHBsYXRmb3Jt X2RldmljZSAqcGRldiwKKwkJY29uc3QgY2hhciAqbmFtZSwgaXJxX2hhbmRsZXJfdCBoYW5kbGVy KQoreworCWludCBpcnEsIHJldDsKKworCWlycSA9IHBsYXRmb3JtX2dldF9pcnFfYnluYW1lKHBk ZXYsIG5hbWUpOworCisJcmV0ID0gZGV2bV9yZXF1ZXN0X2lycSgmcGRldi0+ZGV2LCBpcnEsIGhh bmRsZXIsIElSUUZfVFJJR0dFUl9ISUdILAorCQluYW1lLCBnbXUpOworCWlmIChyZXQpIHsKKwkJ ZGV2X2VycigmcGRldi0+ZGV2LCAiVW5hYmxlIHRvIGdldCBpbnRlcnJ1cHQgJXNcbiIsIG5hbWUp OworCQlyZXR1cm4gcmV0OworCX0KKworCWRpc2FibGVfaXJxKGlycSk7CisKKwlyZXR1cm4gaXJx OworfQorCit2b2lkIGE2eHhfZ211X3JlbW92ZShzdHJ1Y3QgYTZ4eF9ncHUgKmE2eHhfZ3B1KQor eworCXN0cnVjdCBhNnh4X2dtdSAqZ211ID0gJmE2eHhfZ3B1LT5nbXU7CisKKwlpZiAoSVNfRVJS X09SX05VTEwoZ211LT5tbWlvKSkKKwkJcmV0dXJuOworCisJYTZ4eF9nbXVfc3RvcChhNnh4X2dw dSk7CisKKwlhNnh4X2dtdV9pcnFfZGlzYWJsZShnbXUpOworCWE2eHhfZ211X21lbW9yeV9mcmVl KGdtdSwgZ211LT5oZmkpOworCisJcG1fcnVudGltZV9nZXRfc3VwcGxpZXJzKGdtdS0+ZGV2KTsK Kwlpb21tdV9kZXRhY2hfZGV2aWNlKGdtdS0+ZG9tYWluLCBnbXUtPmRldik7CisJcG1fcnVudGlt ZV9wdXRfc3VwcGxpZXJzKGdtdS0+ZGV2KTsKKworCWlvbW11X2RvbWFpbl9mcmVlKGdtdS0+ZG9t YWluKTsKK30KKworaW50IGE2eHhfZ211X3Byb2JlKHN0cnVjdCBhNnh4X2dwdSAqYTZ4eF9ncHUs IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSkKK3sKKwlzdHJ1Y3QgYTZ4eF9nbXUgKmdtdSA9ICZh Nnh4X2dwdS0+Z211OworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSBvZl9maW5kX2Rl dmljZV9ieV9ub2RlKG5vZGUpOworCWludCByZXQ7CisKKwlpZiAoIXBkZXYpCisJCXJldHVybiAt RU5PREVWOworCisJZ211LT5kZXYgPSAmcGRldi0+ZGV2OworCisJb2ZfZG1hX2NvbmZpZ3VyZShn bXUtPmRldiwgbm9kZSk7CisKKwkvKiBGb3cgbm93LCBkb24ndCBkbyBhbnl0aGluZyBmYW5jeSB1 bnRpbCB3ZSBnZXQgb3VyIGZlZXQgdW5kZXIgdXMgKi8KKwlnbXUtPmlkbGVfbGV2ZWwgPSBHTVVf SURMRV9TVEFURV9BQ1RJVkU7CisKKwlnbXUtPmN4ID0gZGV2bV9yZWd1bGF0b3JfZ2V0KGdtdS0+ ZGV2LCAidmRkY3giKTsKKwlnbXUtPmd4ID0gZGV2bV9yZWd1bGF0b3JfZ2V0KGdtdS0+ZGV2LCAi dmRkIik7CisKKwkvKiBHZXQgdGhlIGxpc3Qgb2YgY2xvY2tzICovCisJcmV0ID0gYTZ4eF9nbXVf Y2xvY2tzX3Byb2JlKGdtdSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qIFNldCB1 cCB0aGUgSU9NTVUgY29udGV4dCBiYW5rICovCisJcmV0ID0gYTZ4eF9nbXVfbWVtb3J5X3Byb2Jl KGdtdSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qIEFsbG9jYXRlIG1lbW9yeSBm b3IgZm9yIHRoZSBIRkkgcXVldWVzICovCisJZ211LT5oZmkgPSBhNnh4X2dtdV9tZW1vcnlfYWxs b2MoZ211LCBTWl8xNkspOworCWlmIChJU19FUlIoZ211LT5oZmkpKQorCQlnb3RvIGVycjsKKwor CS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIEdNVSBkZWJ1ZyByZWdpb24gKi8KKwlnbXUtPmRl YnVnID0gYTZ4eF9nbXVfbWVtb3J5X2FsbG9jKGdtdSwgU1pfMTZLKTsKKwlpZiAoSVNfRVJSKGdt dS0+ZGVidWcpKQorCQlnb3RvIGVycjsKKworCS8qIE1hcCB0aGUgR01VIHJlZ2lzdGVycyAqLwor CWdtdS0+bW1pbyA9IGE2eHhfZ211X2dldF9tbWlvKHBkZXYsICJnbXUiKTsKKworCS8qIE1hcCB0 aGUgR1BVIHBvd2VyIGRvbWFpbiBjb250cm9sbGVyIHJlZ2lzdGVycyAqLworCWdtdS0+cGRjX21t aW8gPSBhNnh4X2dtdV9nZXRfbW1pbyhwZGV2LCAiZ211X3BkYyIpOworCisJaWYgKElTX0VSUihn bXUtPm1taW8pIHx8IElTX0VSUihnbXUtPnBkY19tbWlvKSkKKwkJZ290byBlcnI7CisKKwkvKiBH ZXQgdGhlIEhGSSBhbmQgR01VIGludGVycnVwdHMgKi8KKwlnbXUtPmhmaV9pcnEgPSBhNnh4X2dt dV9nZXRfaXJxKGdtdSwgcGRldiwgImhmaSIsIGE2eHhfaGZpX2lycSk7CisJZ211LT5nbXVfaXJx ID0gYTZ4eF9nbXVfZ2V0X2lycShnbXUsIHBkZXYsICJnbXUiLCBhNnh4X2dtdV9pcnEpOworCisJ aWYgKGdtdS0+aGZpX2lycSA8IDAgfHwgZ211LT5nbXVfaXJxIDwgMCkKKwkJZ290byBlcnI7CisK KwkvKiBTZXQgdXAgYSB0YXNrbGV0IHRvIGhhbmRsZSBHTVUgSEZJIHJlc3BvbnNlcyAqLworCXRh c2tsZXRfaW5pdCgmZ211LT5oZmlfdGFza2xldCwgYTZ4eF9oZmlfdGFzaywgKHVuc2lnbmVkIGxv bmcpIGdtdSk7CisKKwkvKiBHZXQgdGhlIHBvd2VyIGxldmVscyBmb3IgdGhlIEdNVSBhbmQgR1BV ICovCisJYTZ4eF9nbXVfcHdybGV2ZWxzX3Byb2JlKGdtdSk7CisKKwkvKiBTZXQgdXAgdGhlIEhG SSBxdWV1ZXMgKi8KKwlhNnh4X2hmaV9pbml0KGdtdSk7CisKKwlyZXR1cm4gMDsKK2VycjoKKwlh Nnh4X2dtdV9tZW1vcnlfZnJlZShnbXUsIGdtdS0+aGZpKTsKKworCWlmIChnbXUtPmRvbWFpbikg eworCQlwbV9ydW50aW1lX2dldF9zdXBwbGllcnMoZ211LT5kZXYpOworCQlpb21tdV9kZXRhY2hf ZGV2aWNlKGdtdS0+ZG9tYWluLCBnbXUtPmRldik7CisJCXBtX3J1bnRpbWVfcHV0X3N1cHBsaWVy cyhnbXUtPmRldik7CisKKwkJaW9tbXVfZG9tYWluX2ZyZWUoZ211LT5kb21haW4pOworCX0KKwor CXJldHVybiAtRU5PREVWOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9hZHJl bm8vYTZ4eF9nbXUuaCBiL2RyaXZlcnMvZ3B1L2RybS9tc20vYWRyZW5vL2E2eHhfZ211LmgKbmV3 IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwLi45ZThkNDYwN2RmNjkKLS0tIC9k ZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2FkcmVuby9hNnh4X2dtdS5oCkBAIC0w LDAgKzEsMTYyIEBACisvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCAqLworLyog Q29weXJpZ2h0IChjKSAyMDE3IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2Vy dmVkLiAqLworCisjaWZuZGVmIF9BNlhYX0dNVV9IXworI2RlZmluZSBfQTZYWF9HTVVfSF8KKwor I2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgIm1zbV9kcnYuaCIKKyNpbmNs dWRlICJhNnh4X2hmaS5oIgorCitzdHJ1Y3QgYTZ4eF9nbXVfYm8geworCXZvaWQgKnZpcnQ7CisJ c2l6ZV90IHNpemU7CisJdTY0IGlvdmE7CisJc3RydWN0IHBhZ2UgKipwYWdlczsKK307CisKKy8q CisgKiBUaGVzZSBkZWZpbmUgdGhlIGRpZmZlcmVudCBHTVUgd2FrZSB1cCBvcHRpb25zIC0gdGhl c2UgZGVmaW5lIGhvdyBib3RoIHRoZQorICogQ1BVIGFuZCB0aGUgR01VIGJyaW5nIHVwIHRoZSBo YXJkd2FyZQorICovCisKKy8qIFRIZSBHTVUgaGFzIGFscmVhZHkgYmVlbiBib290ZWQgYW5kIHRo ZSByZW50ZW50aW9uIHJlZ2lzdGVycyBhcmUgYWN0aXZlICovCisjZGVmaW5lIEdNVV9XQVJNX0JP T1QgMAorCisvKiB0aGUgR01VIGlzIGNvbWluZyB1cCBmb3IgdGhlIGZpcnN0IHRpbWUgb3IgYmFj ayBmcm9tIGEgcG93ZXIgY29sbGFwc2UgKi8KKyNkZWZpbmUgR01VX0NPTERfQk9PVCAxCisKKy8q IFRoZSBHTVUgaXMgYmVpbmcgc29mdCByZXNldCBhZnRlciBhIGZhdWx0ICovCisjZGVmaW5lIEdN VV9SRVNFVCAyCisKKy8qCisgKiBUaGVzZSBkZWZpbmUgdGhlIGxldmVsIG9mIGNvbnRyb2wgdGhh dCB0aGUgR01VIGhhcyAtIHRoZSBoaWdoZXIgdGhlIG51bWJlcgorICogdGhlIG1vcmUgdGhpbmdz IHRoYXQgdGhlIEdNVSBoYXJkd2FyZSBjb250cm9scyBvbiBpdHMgb3duLgorICovCisKKy8qIFRo ZSBHTVUgZG9lcyBub3QgZG8gYW55IGlkbGUgc3RhdGUgbWFuYWdlbWVudCAqLworI2RlZmluZSBH TVVfSURMRV9TVEFURV9BQ1RJVkUgMAorCisvKiBUaGUgR01VIG1hbmFnZXMgU1BUUCBwb3dlciBj b2xsYXBzZSAqLworI2RlZmluZSBHTVVfSURMRV9TVEFURV9TUFRQIDIKKworLyogVGhlIEdNVSBk b2VzIGF1dG9tYXRpYyBJRlBDIChpbnRyYS1mcmFtZSBwb3dlciBjb2xsYXBzZSkgKi8KKyNkZWZp bmUgR01VX0lETEVfU1RBVEVfSUZQQyAzCisKK3N0cnVjdCBhNnh4X2dtdSB7CisJc3RydWN0IGRl dmljZSAqZGV2OworCisJdm9pZCAqIF9faW9tZW0gbW1pbzsKKwl2b2lkICogX19pb21lbSBwZGNf bW1pbzsKKworCWludCBoZmlfaXJxOworCWludCBnbXVfaXJxOworCisJc3RydWN0IHJlZ3VsYXRv ciAqY3g7CisJc3RydWN0IHJlZ3VsYXRvciAqZ3g7CisKKwlzdHJ1Y3QgaW9tbXVfZG9tYWluICpk b21haW47CisJdTY0IHVuY2FjaGVkX2lvdmFfYmFzZTsKKworCWludCBpZGxlX2xldmVsOworCisJ c3RydWN0IGE2eHhfZ211X2JvICpoZmk7CisJc3RydWN0IGE2eHhfZ211X2JvICpkZWJ1ZzsKKwor CWludCBucl9jbG9ja3M7CisJc3RydWN0IGNsayAqKmNsb2NrczsKKwlzdHJ1Y3QgY2xrICpjb3Jl X2NsazsKKworCWludCBucl9ncHVfZnJlcXM7CisJdW5zaWduZWQgbG9uZyBncHVfZnJlcXNbMTZd OworCXUzMiBneF9hcmNfdm90ZXNbMTZdOworCisJaW50IG5yX2dtdV9mcmVxczsKKwl1bnNpZ25l ZCBsb25nIGdtdV9mcmVxc1s0XTsKKwl1MzIgY3hfYXJjX3ZvdGVzWzRdOworCisJc3RydWN0IGE2 eHhfaGZpX3F1ZXVlIHF1ZXVlc1syXTsKKworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCBoZmlfdGFz a2xldDsKK307CisKK3N0YXRpYyBpbmxpbmUgdTMyIGdtdV9yZWFkKHN0cnVjdCBhNnh4X2dtdSAq Z211LCB1MzIgb2Zmc2V0KQoreworCXJldHVybiBtc21fcmVhZGwoZ211LT5tbWlvICsgKG9mZnNl dCA8PCAyKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnbXVfd3JpdGUoc3RydWN0IGE2eHhf Z211ICpnbXUsIHUzMiBvZmZzZXQsIHUzMiB2YWx1ZSkKK3sKKwlyZXR1cm4gbXNtX3dyaXRlbCh2 YWx1ZSwgZ211LT5tbWlvICsgKG9mZnNldCA8PCAyKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9p ZCBwZGNfd3JpdGUoc3RydWN0IGE2eHhfZ211ICpnbXUsIHUzMiBvZmZzZXQsIHUzMiB2YWx1ZSkK K3sKKwlyZXR1cm4gbXNtX3dyaXRlbCh2YWx1ZSwgZ211LT5wZGNfbW1pbyArIChvZmZzZXQgPDwg MikpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ211X3JtdyhzdHJ1Y3QgYTZ4eF9nbXUgKmdt dSwgdTMyIHJlZywgdTMyIG1hc2ssIHUzMiBvcikKK3sKKwl1MzIgdmFsID0gZ211X3JlYWQoZ211 LCByZWcpOworCisJdmFsICY9IH5tYXNrOworCisJZ211X3dyaXRlKGdtdSwgcmVnLCB2YWwgfCBv cik7Cit9CisKKyNkZWZpbmUgZ211X3BvbGxfdGltZW91dChnbXUsIGFkZHIsIHZhbCwgY29uZCwg aW50ZXJ2YWwsIHRpbWVvdXQpIFwKKwlyZWFkbF9wb2xsX3RpbWVvdXQoKGdtdSktPm1taW8gKyAo KGFkZHIpIDw8IDIpLCB2YWwsIGNvbmQsIFwKKwkJaW50ZXJ2YWwsIHRpbWVvdXQpCisKKy8qCisg KiBUaGVzZSBhcmUgdGhlIGF2YWlsYWJsZSBPT0IgKG91dCBvZiBiYW5kIHJlcXVlc3RzKSB0byB0 aGUgR01VIHdoZXJlICJvdXQgb2YKKyAqIGJhbmQiIG1lYW5zIHRoYXQgdGhlIENQVSB0YWxrcyB0 byB0aGUgR01VIGRpcmVjdGx5IGFuZCBub3QgdGhyb3VnaCBIRkkuCisgKiBOb3JtYWxseSB0aGlz IHdvcmtzIGJ5IHdyaXRpbmcgYSBJVENNL0RUQ00gcmVnaXN0ZXIgYW5kIHRoZW4gdHJpZ2dlcmlu ZyBhCisgKiBpbnRlcnJ1cHQgKHRoZSAicmVxdWVzdCIgYml0KSBhbmQgd2FpdGluZyBmb3IgYW4g YWNrbm93bGVkZ21lbnQgKHRoZSAiYWNrIgorICogYml0KS4gVGhlIHN0YXRlIGlzIGNsZWFyZWQg Ynkgd3JpdGluZyB0aGUgImNsZWFyJyBiaXQgdG8gdGhlIEdNVSBpbnRlcnJ1cHQuCisgKgorICog VGhlc2UgYXJlIHVzZWQgdG8gZm9yY2UgdGhlIEdNVS9HUFUgdG8gc3RheSBvbiBkdXJpbmcgYSBj cml0aWNhbCBzZXF1ZW5jZSBvcgorICogZm9yIGhhcmR3YXJlIHdvcmthcm91bmRzLgorICovCisK K2VudW0gYTZ4eF9nbXVfb29iX3N0YXRlIHsKKwlHTVVfT09CX0JPT1RfU0xVTUJFUiA9IDAsCisJ R01VX09PQl9HUFVfU0VULAorfTsKKworLyogVGhlc2UgYXJlIHRoZSBpbnRlcnJ1cHQgLyBhY2sg Yml0cyBmb3IgZWFjaCBPT0IgcmVxdWVzdCB0aGF0IGFyZSBzZXQKKyAqIGluIGE2eHhfZ211X3Nl dF9vb2IgYW5kIGE2eHhfY2xlYXJfb29iCisgKi8KKworLyoKKyAqIExldCB0aGUgR01VIGtub3cg dGhhdCBhIGJvb3Qgb3Igc2x1bWJlciBvcGVyYXRpb24gaGFzIHN0YXJ0ZWQuIFRoZSB2YWx1ZSBp bgorICogUkVHX0E2WFhfR01VX0JPT1RfU0xVTUJFUl9PUFRJT04gbGV0cyB0aGUgR01VIGtub3cg d2hpY2ggb3BlcmF0aW9uIHdlIGFyZQorICogZG9pbmcKKyAqLworI2RlZmluZSBHTVVfT09CX0JP T1RfU0xVTUJFUl9SRVFVRVNUCTIyCisjZGVmaW5lIEdNVV9PT0JfQk9PVF9TTFVNQkVSX0FDSwkz MAorI2RlZmluZSBHTVVfT09CX0JPT1RfU0xVTUJFUl9DTEVBUgkzMAorCisvKgorICogU2V0IGEg bmV3IHBvd2VyIGxldmVsIGZvciB0aGUgR1BVIHdoZW4gdGhlIENQVSBpcyBkb2luZyBmcmVxdWVu Y3kgc2NhbGluZworICovCisjZGVmaW5lIEdNVV9PT0JfRENWU19SRVFVRVNUCTIzCisjZGVmaW5l IEdNVV9PT0JfRENWU19BQ0sJMzEKKyNkZWZpbmUgR01VX09PQl9EQ1ZTX0NMRUFSCTMxCisKKy8q CisgKiBMZXQgdGhlIEdNVSBrbm93IHRvIG5vdCB0dXJuIG9mZiBhbnkgR1BVIHJlZ2lzdGVycyB3 aGlsZSB0aGUgQ1BVIGlzIGluIGEKKyAqIGNyaXRpY2FsIHNlY3Rpb24KKyAqLworI2RlZmluZSBH TVVfT09CX0dQVV9TRVRfUkVRVUVTVAkxNgorI2RlZmluZSBHTVVfT09CX0dQVV9TRVRfQUNLCTI0 CisjZGVmaW5lIEdNVV9PT0JfR1BVX1NFVF9DTEVBUgkyNAorCisKK3ZvaWQgYTZ4eF9oZmlfaW5p dChzdHJ1Y3QgYTZ4eF9nbXUgKmdtdSk7CitpbnQgYTZ4eF9oZmlfc3RhcnQoc3RydWN0IGE2eHhf Z211ICpnbXUsIGludCBib290X3N0YXRlKTsKK3ZvaWQgYTZ4eF9oZmlfc3RvcChzdHJ1Y3QgYTZ4 eF9nbXUgKmdtdSk7CisKK3ZvaWQgYTZ4eF9oZmlfdGFzayh1bnNpZ25lZCBsb25nIGRhdGEpOwor CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vYWRyZW5vL2E2eHhfZ3B1 LmMgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2FkcmVuby9hNnh4X2dwdS5jCm5ldyBmaWxlIG1vZGUg MTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMC4uN2MyMGQ5YTk1YmYzCi0tLSAvZGV2L251bGwKKysr IGIvZHJpdmVycy9ncHUvZHJtL21zbS9hZHJlbm8vYTZ4eF9ncHUuYwpAQCAtMCwwICsxLDgwOSBA QAorLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgKi8KKy8qIENvcHlyaWdodCAo YykgMjAxNy0yMDE4IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAq LworCisKKyNpbmNsdWRlICJtc21fZ2VtLmgiCisjaW5jbHVkZSAibXNtX21tdS5oIgorI2luY2x1 ZGUgImE2eHhfZ3B1LmgiCisjaW5jbHVkZSAiYTZ4eF9nbXUueG1sLmgiCisKK3N0YXRpYyBpbmxp bmUgYm9vbCBfYTZ4eF9jaGVja19pZGxlKHN0cnVjdCBtc21fZ3B1ICpncHUpCit7CisJc3RydWN0 IGFkcmVub19ncHUgKmFkcmVub19ncHUgPSB0b19hZHJlbm9fZ3B1KGdwdSk7CisJc3RydWN0IGE2 eHhfZ3B1ICphNnh4X2dwdSA9IHRvX2E2eHhfZ3B1KGFkcmVub19ncHUpOworCisJLyogQ2hlY2sg dGhhdCB0aGUgR01VIGlzIGlkbGUgKi8KKwlpZiAoIWE2eHhfZ211X2lzaWRsZSgmYTZ4eF9ncHUt PmdtdSkpCisJCXJldHVybiBmYWxzZTsKKworCS8qIENoZWNrIHRoYSB0aGUgQ1ggbWFzdGVyIGlz IGlkbGUgKi8KKwlpZiAoZ3B1X3JlYWQoZ3B1LCBSRUdfQTZYWF9SQkJNX1NUQVRVUykgJgorCQkJ fkE2WFhfUkJCTV9TVEFUVVNfQ1BfQUhCX0JVU1lfQ1hfTUFTVEVSKQorCQlyZXR1cm4gZmFsc2U7 CisKKwlyZXR1cm4gIShncHVfcmVhZChncHUsIFJFR19BNlhYX1JCQk1fSU5UXzBfU1RBVFVTKSAm CisJCUE2WFhfUkJCTV9JTlRfMF9NQVNLX1JCQk1fSEFOR19ERVRFQ1QpOworfQorCitib29sIGE2 eHhfaWRsZShzdHJ1Y3QgbXNtX2dwdSAqZ3B1LCBzdHJ1Y3QgbXNtX3JpbmdidWZmZXIgKnJpbmcp Cit7CisJLyogd2FpdCBmb3IgQ1AgdG8gZHJhaW4gcmluZ2J1ZmZlcjogKi8KKwlpZiAoIWFkcmVu b19pZGxlKGdwdSwgcmluZykpCisJCXJldHVybiBmYWxzZTsKKworCWlmIChzcGluX3VudGlsKF9h Nnh4X2NoZWNrX2lkbGUoZ3B1KSkpIHsKKwkJRFJNX0VSUk9SKCIlczogJXBzOiB0aW1lb3V0IHdh aXRpbmcgZm9yIEdQVSB0byBpZGxlOiBzdGF0dXMgJTguOFggaXJxICU4LjhYIHJwdHIvd3B0ciAl ZC8lZFxuIiwKKwkJCWdwdS0+bmFtZSwgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApLAorCQkJ Z3B1X3JlYWQoZ3B1LCBSRUdfQTZYWF9SQkJNX1NUQVRVUyksCisJCQlncHVfcmVhZChncHUsIFJF R19BNlhYX1JCQk1fSU5UXzBfU1RBVFVTKSwKKwkJCWdwdV9yZWFkKGdwdSwgUkVHX0E2WFhfQ1Bf UkJfUlBUUiksCisJCQlncHVfcmVhZChncHUsIFJFR19BNlhYX0NQX1JCX1dQVFIpKTsKKwkJcmV0 dXJuIGZhbHNlOworCX0KKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZCBhNnh4X2Zs dXNoKHN0cnVjdCBtc21fZ3B1ICpncHUsIHN0cnVjdCBtc21fcmluZ2J1ZmZlciAqcmluZykKK3sK Kwl1aW50MzJfdCB3cHRyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJx c2F2ZSgmcmluZy0+bG9jaywgZmxhZ3MpOworCisJLyogQ29weSB0aGUgc2hhZG93IHRvIHRoZSBh Y3R1YWwgcmVnaXN0ZXIgKi8KKwlyaW5nLT5jdXIgPSByaW5nLT5uZXh0OworCisJLyogTWFrZSBz dXJlIHRvIHdyYXAgd3B0ciBpZiB3ZSBuZWVkIHRvICovCisJd3B0ciA9IGdldF93cHRyKHJpbmcp OworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcmluZy0+bG9jaywgZmxhZ3MpOworCisJLyog TWFrZSBzdXJlIGV2ZXJ5dGhpbmcgaXMgcG9zdGVkIGJlZm9yZSBtYWtpbmcgYSBkZWNpc2lvbiAq LworCW1iKCk7CisKKwlncHVfd3JpdGUoZ3B1LCBSRUdfQTZYWF9DUF9SQl9XUFRSLCB3cHRyKTsK K30KKworc3RhdGljIHZvaWQgYTZ4eF9zdWJtaXQoc3RydWN0IG1zbV9ncHUgKmdwdSwgc3RydWN0 IG1zbV9nZW1fc3VibWl0ICpzdWJtaXQsCisJc3RydWN0IG1zbV9maWxlX3ByaXZhdGUgKmN0eCkK K3sKKwlzdHJ1Y3QgbXNtX2RybV9wcml2YXRlICpwcml2ID0gZ3B1LT5kZXYtPmRldl9wcml2YXRl OworCXN0cnVjdCBtc21fcmluZ2J1ZmZlciAqcmluZyA9IHN1Ym1pdC0+cmluZzsKKwl1bnNpZ25l ZCBpbnQgaTsKKworCS8qIEludmFsaWRhdGUgQ0NVIGRlcHRoIGFuZCBjb2xvciAqLworCU9VVF9Q S1Q3KHJpbmcsIENQX0VWRU5UX1dSSVRFLCAxKTsKKwlPVVRfUklORyhyaW5nLCBQQ19DQ1VfSU5W QUxJREFURV9ERVBUSCk7CisKKwlPVVRfUEtUNyhyaW5nLCBDUF9FVkVOVF9XUklURSwgMSk7CisJ T1VUX1JJTkcocmluZywgUENfQ0NVX0lOVkFMSURBVEVfQ09MT1IpOworCisJLyogU3VibWl0IHRo ZSBjb21tYW5kcyAqLworCWZvciAoaSA9IDA7IGkgPCBzdWJtaXQtPm5yX2NtZHM7IGkrKykgewor CQlzd2l0Y2ggKHN1Ym1pdC0+Y21kW2ldLnR5cGUpIHsKKwkJY2FzZSBNU01fU1VCTUlUX0NNRF9J Ql9UQVJHRVRfQlVGOgorCQkJYnJlYWs7CisJCWNhc2UgTVNNX1NVQk1JVF9DTURfQ1RYX1JFU1RP UkVfQlVGOgorCQkJaWYgKHByaXYtPmxhc3RjdHggPT0gY3R4KQorCQkJCWJyZWFrOworCQljYXNl IE1TTV9TVUJNSVRfQ01EX0JVRjoKKwkJCU9VVF9QS1Q3KHJpbmcsIENQX0lORElSRUNUX0JVRkZF Ul9QRkUsIDMpOworCQkJT1VUX1JJTkcocmluZywgbG93ZXJfMzJfYml0cyhzdWJtaXQtPmNtZFtp XS5pb3ZhKSk7CisJCQlPVVRfUklORyhyaW5nLCB1cHBlcl8zMl9iaXRzKHN1Ym1pdC0+Y21kW2ld LmlvdmEpKTsKKwkJCU9VVF9SSU5HKHJpbmcsIHN1Ym1pdC0+Y21kW2ldLnNpemUpOworCQkJYnJl YWs7CisJCX0KKwl9CisKKwkvKiBXcml0ZSB0aGUgZmVuY2UgdG8gdGhlIHNjcmF0Y2ggcmVnaXN0 ZXIgKi8KKwlPVVRfUEtUNChyaW5nLCBSRUdfQTZYWF9DUF9TQ1JBVENIX1JFRygyKSwgMSk7CisJ T1VUX1JJTkcocmluZywgc3VibWl0LT5zZXFubyk7CisKKwkvKgorCSAqIEV4ZWN1dGUgYSBDQUNI RV9GTFVTSF9UUyBldmVudC4gVGhpcyB3aWxsIGVuc3VyZSB0aGF0IHRoZQorCSAqIHRpbWVzdGFt cCBpcyB3cml0dGVuIHRvIHRoZSBtZW1vcnkgYW5kIHRoZW4gdHJpZ2dlcnMgdGhlIGludGVycnVw dAorCSAqLworCU9VVF9QS1Q3KHJpbmcsIENQX0VWRU5UX1dSSVRFLCA0KTsKKwlPVVRfUklORyhy aW5nLCBDQUNIRV9GTFVTSF9UUyB8ICgxIDw8IDMxKSk7CisJT1VUX1JJTkcocmluZywgbG93ZXJf MzJfYml0cyhyYm1lbXB0cihyaW5nLCBmZW5jZSkpKTsKKwlPVVRfUklORyhyaW5nLCB1cHBlcl8z Ml9iaXRzKHJibWVtcHRyKHJpbmcsIGZlbmNlKSkpOworCU9VVF9SSU5HKHJpbmcsIHN1Ym1pdC0+ c2Vxbm8pOworCisJYTZ4eF9mbHVzaChncHUsIHJpbmcpOworfQorCitzdGF0aWMgY29uc3Qgc3Ry dWN0IHsKKwl1MzIgb2Zmc2V0OworCXUzMiB2YWx1ZTsKK30gYTZ4eF9od2NnW10gPSB7CisJe1JF R19BNlhYX1JCQk1fQ0xPQ0tfQ05UTF9TUDAsIDB4MjIyMjIyMjJ9LAorCXtSRUdfQTZYWF9SQkJN X0NMT0NLX0NOVExfU1AxLCAweDIyMjIyMjIyfSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9DS19DTlRM X1NQMiwgMHgyMjIyMjIyMn0sCisJe1JFR19BNlhYX1JCQk1fQ0xPQ0tfQ05UTF9TUDMsIDB4MjIy MjIyMjJ9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0NOVEwyX1NQMCwgMHgwMjAyMjIyMH0sCisJ e1JFR19BNlhYX1JCQk1fQ0xPQ0tfQ05UTDJfU1AxLCAweDAyMDIyMjIwfSwKKwl7UkVHX0E2WFhf UkJCTV9DTE9DS19DTlRMMl9TUDIsIDB4MDIwMjIyMjB9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NL X0NOVEwyX1NQMywgMHgwMjAyMjIyMH0sCisJe1JFR19BNlhYX1JCQk1fQ0xPQ0tfREVMQVlfU1Aw LCAweDAwMDBmM2NmfSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9DS19ERUxBWV9TUDEsIDB4MDAwMGYz Y2Z9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0RFTEFZX1NQMiwgMHgwMDAwZjNjZn0sCisJe1JF R19BNlhYX1JCQk1fQ0xPQ0tfREVMQVlfU1AzLCAweDAwMDBmM2NmfSwKKwl7UkVHX0E2WFhfUkJC TV9DTE9DS19IWVNUX1NQMCwgMHgwMDAwMDA4MH0sCisJe1JFR19BNlhYX1JCQk1fQ0xPQ0tfSFlT VF9TUDEsIDB4MDAwMDAwODB9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0hZU1RfU1AyLCAweDAw MDAwMDgwfSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9DS19IWVNUX1NQMywgMHgwMDAwMDA4MH0sCisJ e1JFR19BNlhYX1JCQk1fQ0xPQ0tfQ05UTF9UUDAsIDB4MDIyMjIyMjJ9LAorCXtSRUdfQTZYWF9S QkJNX0NMT0NLX0NOVExfVFAxLCAweDAyMjIyMjIyfSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9DS19D TlRMX1RQMiwgMHgwMjIyMjIyMn0sCisJe1JFR19BNlhYX1JCQk1fQ0xPQ0tfQ05UTF9UUDMsIDB4 MDIyMjIyMjJ9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0NOVEwyX1RQMCwgMHgyMjIyMjIyMn0s CisJe1JFR19BNlhYX1JCQk1fQ0xPQ0tfQ05UTDJfVFAxLCAweDIyMjIyMjIyfSwKKwl7UkVHX0E2 WFhfUkJCTV9DTE9DS19DTlRMMl9UUDIsIDB4MjIyMjIyMjJ9LAorCXtSRUdfQTZYWF9SQkJNX0NM T0NLX0NOVEwyX1RQMywgMHgyMjIyMjIyMn0sCisJe1JFR19BNlhYX1JCQk1fQ0xPQ0tfQ05UTDNf VFAwLCAweDIyMjIyMjIyfSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9DS19DTlRMM19UUDEsIDB4MjIy MjIyMjJ9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0NOVEwzX1RQMiwgMHgyMjIyMjIyMn0sCisJ e1JFR19BNlhYX1JCQk1fQ0xPQ0tfQ05UTDNfVFAzLCAweDIyMjIyMjIyfSwKKwl7UkVHX0E2WFhf UkJCTV9DTE9DS19DTlRMNF9UUDAsIDB4MDAwMjIyMjJ9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NL X0NOVEw0X1RQMSwgMHgwMDAyMjIyMn0sCisJe1JFR19BNlhYX1JCQk1fQ0xPQ0tfQ05UTDRfVFAy LCAweDAwMDIyMjIyfSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9DS19DTlRMNF9UUDMsIDB4MDAwMjIy MjJ9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0hZU1RfVFAwLCAweDc3Nzc3Nzc3fSwKKwl7UkVH X0E2WFhfUkJCTV9DTE9DS19IWVNUX1RQMSwgMHg3Nzc3Nzc3N30sCisJe1JFR19BNlhYX1JCQk1f Q0xPQ0tfSFlTVF9UUDIsIDB4Nzc3Nzc3Nzd9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0hZU1Rf VFAzLCAweDc3Nzc3Nzc3fSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9DS19IWVNUMl9UUDAsIDB4Nzc3 Nzc3Nzd9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0hZU1QyX1RQMSwgMHg3Nzc3Nzc3N30sCisJ e1JFR19BNlhYX1JCQk1fQ0xPQ0tfSFlTVDJfVFAyLCAweDc3Nzc3Nzc3fSwKKwl7UkVHX0E2WFhf UkJCTV9DTE9DS19IWVNUMl9UUDMsIDB4Nzc3Nzc3Nzd9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NL X0hZU1QzX1RQMCwgMHgwNzc3Nzc3N30sCisJe1JFR19BNlhYX1JCQk1fQ0xPQ0tfSFlTVDNfVFAx LCAweDA3Nzc3Nzc3fSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9DS19IWVNUM19UUDIsIDB4MDc3Nzc3 Nzd9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0hZU1QzX1RQMywgMHgwNzc3Nzc3N30sCisJe1JF R19BNlhYX1JCQk1fQ0xPQ0tfSFlTVDRfVFAwLCAweDAwMDc3Nzc3fSwKKwl7UkVHX0E2WFhfUkJC TV9DTE9DS19IWVNUNF9UUDEsIDB4MDAwNzc3Nzd9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0hZ U1Q0X1RQMiwgMHgwMDA3Nzc3N30sCisJe1JFR19BNlhYX1JCQk1fQ0xPQ0tfSFlTVDRfVFAzLCAw eDAwMDc3Nzc3fSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9DS19ERUxBWV9UUDAsIDB4MTExMTExMTF9 LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0RFTEFZX1RQMSwgMHgxMTExMTExMX0sCisJe1JFR19B NlhYX1JCQk1fQ0xPQ0tfREVMQVlfVFAyLCAweDExMTExMTExfSwKKwl7UkVHX0E2WFhfUkJCTV9D TE9DS19ERUxBWV9UUDMsIDB4MTExMTExMTF9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0RFTEFZ Ml9UUDAsIDB4MTExMTExMTF9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0RFTEFZMl9UUDEsIDB4 MTExMTExMTF9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0RFTEFZMl9UUDIsIDB4MTExMTExMTF9 LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0RFTEFZMl9UUDMsIDB4MTExMTExMTF9LAorCXtSRUdf QTZYWF9SQkJNX0NMT0NLX0RFTEFZM19UUDAsIDB4MTExMTExMTF9LAorCXtSRUdfQTZYWF9SQkJN X0NMT0NLX0RFTEFZM19UUDEsIDB4MTExMTExMTF9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0RF TEFZM19UUDIsIDB4MTExMTExMTF9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0RFTEFZM19UUDMs IDB4MTExMTExMTF9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0RFTEFZNF9UUDAsIDB4MDAwMTEx MTF9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0RFTEFZNF9UUDEsIDB4MDAwMTExMTF9LAorCXtS RUdfQTZYWF9SQkJNX0NMT0NLX0RFTEFZNF9UUDIsIDB4MDAwMTExMTF9LAorCXtSRUdfQTZYWF9S QkJNX0NMT0NLX0RFTEFZNF9UUDMsIDB4MDAwMTExMTF9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NL X0NOVExfVUNIRSwgMHgyMjIyMjIyMn0sCisJe1JFR19BNlhYX1JCQk1fQ0xPQ0tfQ05UTDJfVUNI RSwgMHgyMjIyMjIyMn0sCisJe1JFR19BNlhYX1JCQk1fQ0xPQ0tfQ05UTDNfVUNIRSwgMHgyMjIy MjIyMn0sCisJe1JFR19BNlhYX1JCQk1fQ0xPQ0tfQ05UTDRfVUNIRSwgMHgwMDIyMjIyMn0sCisJ e1JFR19BNlhYX1JCQk1fQ0xPQ0tfSFlTVF9VQ0hFLCAweDAwMDAwMDA0fSwKKwl7UkVHX0E2WFhf UkJCTV9DTE9DS19ERUxBWV9VQ0hFLCAweDAwMDAwMDAyfSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9D S19DTlRMX1JCMCwgMHgyMjIyMjIyMn0sCisJe1JFR19BNlhYX1JCQk1fQ0xPQ0tfQ05UTF9SQjEs IDB4MjIyMjIyMjJ9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0NOVExfUkIyLCAweDIyMjIyMjIy fSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9DS19DTlRMX1JCMywgMHgyMjIyMjIyMn0sCisJe1JFR19B NlhYX1JCQk1fQ0xPQ0tfQ05UTDJfUkIwLCAweDAwMDAyMjIyfSwKKwl7UkVHX0E2WFhfUkJCTV9D TE9DS19DTlRMMl9SQjEsIDB4MDAwMDIyMjJ9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0NOVEwy X1JCMiwgMHgwMDAwMjIyMn0sCisJe1JFR19BNlhYX1JCQk1fQ0xPQ0tfQ05UTDJfUkIzLCAweDAw MDAyMjIyfSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9DS19DTlRMX0NDVTAsIDB4MDAwMDIyMjB9LAor CXtSRUdfQTZYWF9SQkJNX0NMT0NLX0NOVExfQ0NVMSwgMHgwMDAwMjIyMH0sCisJe1JFR19BNlhY X1JCQk1fQ0xPQ0tfQ05UTF9DQ1UyLCAweDAwMDAyMjIwfSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9D S19DTlRMX0NDVTMsIDB4MDAwMDIyMjB9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0hZU1RfUkJf Q0NVMCwgMHgwMDA0MGYwMH0sCisJe1JFR19BNlhYX1JCQk1fQ0xPQ0tfSFlTVF9SQl9DQ1UxLCAw eDAwMDQwZjAwfSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9DS19IWVNUX1JCX0NDVTIsIDB4MDAwNDBm MDB9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0hZU1RfUkJfQ0NVMywgMHgwMDA0MGYwMH0sCisJ e1JFR19BNlhYX1JCQk1fQ0xPQ0tfQ05UTF9SQUMsIDB4MDUwMjIwMjJ9LAorCXtSRUdfQTZYWF9S QkJNX0NMT0NLX0NOVEwyX1JBQywgMHgwMDAwNTU1NX0sCisJe1JFR19BNlhYX1JCQk1fQ0xPQ0tf REVMQVlfUkFDLCAweDAwMDEwMDExfSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9DS19IWVNUX1JBQywg MHgwMDQ0NTA0NH0sCisJe1JFR19BNlhYX1JCQk1fQ0xPQ0tfQ05UTF9UU0VfUkFTX1JCQk0sIDB4 MDQyMjIyMjJ9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX01PREVfR1BDLCAweDAyMjIyMjIyfSwK Kwl7UkVHX0E2WFhfUkJCTV9DTE9DS19NT0RFX1ZGRCwgMHgwMDAwMjIyMn0sCisJe1JFR19BNlhY X1JCQk1fQ0xPQ0tfSFlTVF9UU0VfUkFTX1JCQk0sIDB4MDAwMDAwMDB9LAorCXtSRUdfQTZYWF9S QkJNX0NMT0NLX0hZU1RfR1BDLCAweDA0MTA0MDA0fSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9DS19I WVNUX1ZGRCwgMHgwMDAwMDAwMH0sCisJe1JFR19BNlhYX1JCQk1fQ0xPQ0tfREVMQVlfSExTUSwg MHgwMDAwMDAwMH0sCisJe1JFR19BNlhYX1JCQk1fQ0xPQ0tfREVMQVlfVFNFX1JBU19SQkJNLCAw eDAwMDA0MDAwfSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9DS19ERUxBWV9HUEMsIDB4MDAwMDAyMDB9 LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0RFTEFZX1ZGRCwgMHgwMDAwMjIyMn0sCisJe1JFR19B NlhYX1JCQk1fQ0xPQ0tfREVMQVlfSExTUV8yLCAweDAwMDAwMDAyfSwKKwl7UkVHX0E2WFhfUkJC TV9DTE9DS19NT0RFX0hMU1EsIDB4MDAwMDIyMjJ9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0NO VExfR01VX0dYLCAweDAwMDAwMjIyfSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9DS19ERUxBWV9HTVVf R1gsIDB4MDAwMDAxMTF9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0hZU1RfR01VX0dYLCAweDAw MDAwNTU1fQorfTsKKworaW50IGE2eHhfc2V0X2h3Y2coc3RydWN0IG1zbV9ncHUgKmdwdSwgYm9v bCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgYWRyZW5vX2dwdSAqYWRyZW5vX2dwdSA9IHRvX2FkcmVub19n cHUoZ3B1KTsKKwlzdHJ1Y3QgYTZ4eF9ncHUgKmE2eHhfZ3B1ID0gdG9fYTZ4eF9ncHUoYWRyZW5v X2dwdSk7CisJc3RydWN0IGE2eHhfZ211ICpnbXUgPSAmYTZ4eF9ncHUtPmdtdTsKKwl1bnNpZ25l ZCBpbnQgaTsKKwlpbnQgcmV0OworCXUzMiB2YWw7CisKKwl2YWwgPSBncHVfcmVhZChncHUsIFJF R19BNlhYX1JCQk1fQ0xPQ0tfQ05UTCk7CisKKwkvKiBEb24ndCByZS1wcm9ncmFtIHRoZSByZWdp c3RlcnMgaWYgdGhleSBhcmUgYWxyZWFkeSBjb3JyZWN0ICovCisJaWYgKCghc3RhdGUgJiYgIXZh bCkgfHwgKHN0YXRlICYmICh2YWwgPT0gMHg4YWE4YWEwMikpKQorCQlyZXR1cm4gMDsKKworCS8q IERpc2FibGUgU1AgY2xvY2sgYmVmb3JlIHByb2dyYW1taW5nIEhXQ0cgcmVnaXN0ZXJzICovCisJ Z211X3JtdyhnbXUsIFJFR19BNlhYX0dQVV9HTVVfR1hfU1BUUFJBQ19DTE9DS19DT05UUk9MLCAx LCAwKTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGE2eHhfaHdjZyk7IGkrKykKKwkJ Z3B1X3dyaXRlKGdwdSwgYTZ4eF9od2NnW2ldLm9mZnNldCwKKwkJCXN0YXRlID8gYTZ4eF9od2Nn W2ldLnZhbHVlIDogMCk7CisKKwkvKiBFbmFibGUgU1AgY2xvY2sgKi8KKwlnbXVfcm13KGdtdSwg UkVHX0E2WFhfR1BVX0dNVV9HWF9TUFRQUkFDX0NMT0NLX0NPTlRST0wsIDAsIDEpOworCisJZ3B1 X3dyaXRlKGdwdSwgUkVHX0E2WFhfUkJCTV9DTE9DS19DTlRMLCBzdGF0ZSA/IDB4OGFhOGFhMDIg OiAwKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGE2eHhfY3BfaW5pdChzdHJ1Y3Qg bXNtX2dwdSAqZ3B1KQoreworCXN0cnVjdCBtc21fcmluZ2J1ZmZlciAqcmluZyA9IGdwdS0+cmJb MF07CisKKwlPVVRfUEtUNyhyaW5nLCBDUF9NRV9JTklULCA4KTsKKworCU9VVF9SSU5HKHJpbmcs IDB4MDAwMDAwMmYpOworCisJLyogRW5hYmxlIG11bHRpcGxlIGhhcmR3YXJlIGNvbnRleHRzICov CisJT1VUX1JJTkcocmluZywgMHgwMDAwMDAwMyk7CisKKwkvKiBFbmFibGUgZXJyb3IgZGV0ZWN0 aW9uICovCisJT1VUX1JJTkcocmluZywgMHgyMDAwMDAwMCk7CisKKwkvKiBEb24ndCBlbmFibGUg aGVhZGVyIGR1bXAgKi8KKwlPVVRfUklORyhyaW5nLCAweDAwMDAwMDAwKTsKKwlPVVRfUklORyhy aW5nLCAweDAwMDAwMDAwKTsKKworCS8qIE5vIHdvcmthcm91bmRzIGVuYWJsZWQgKi8KKwlPVVRf UklORyhyaW5nLCAweDAwMDAwMDAwKTsKKworCS8qIFBhZCByZXN0IG9mIHRoZSBjbWRzIHdpdGgg MCdzICovCisJT1VUX1JJTkcocmluZywgMHgwMDAwMDAwMCk7CisJT1VUX1JJTkcocmluZywgMHgw MDAwMDAwMCk7CisKKwlhNnh4X2ZsdXNoKGdwdSwgcmluZyk7CisJcmV0dXJuIGE2eHhfaWRsZShn cHUsIHJpbmcpID8gMCA6IC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgYTZ4eF91Y29kZV9pbml0 KHN0cnVjdCBtc21fZ3B1ICpncHUpCit7CisJc3RydWN0IGFkcmVub19ncHUgKmFkcmVub19ncHUg PSB0b19hZHJlbm9fZ3B1KGdwdSk7CisJc3RydWN0IGE2eHhfZ3B1ICphNnh4X2dwdSA9IHRvX2E2 eHhfZ3B1KGFkcmVub19ncHUpOworCisJaWYgKCFhNnh4X2dwdS0+c3FlX2JvKSB7CisJCWE2eHhf Z3B1LT5zcWVfYm8gPSBhZHJlbm9fZndfY3JlYXRlX2JvKGdwdSwKKwkJCWFkcmVub19ncHUtPmZ3 W0FEUkVOT19GV19TUUVdLCAmYTZ4eF9ncHUtPnNxZV9pb3ZhKTsKKworCQlpZiAoSVNfRVJSKGE2 eHhfZ3B1LT5zcWVfYm8pKSB7CisJCQlpbnQgcmV0ID0gUFRSX0VSUihhNnh4X2dwdS0+c3FlX2Jv KTsKKworCQkJYTZ4eF9ncHUtPnNxZV9ibyA9IE5VTEw7CisJCQlEUk1fREVWX0VSUk9SKCZncHUt PnBkZXYtPmRldiwKKwkJCQkiQ291bGQgbm90IGFsbG9jYXRlIFNRRSB1Y29kZTogJWRcbiIsIHJl dCk7CisKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwlncHVfd3JpdGU2NChncHUsIFJFR19B NlhYX0NQX1NRRV9JTlNUUl9CQVNFX0xPLAorCQlSRUdfQTZYWF9DUF9TUUVfSU5TVFJfQkFTRV9I SSwgYTZ4eF9ncHUtPnNxZV9pb3ZhKTsKKworCXJldHVybiAwOworfQorCisjZGVmaW5lIEE2WFhf SU5UX01BU0sgKEE2WFhfUkJCTV9JTlRfMF9NQVNLX0NQX0FIQl9FUlJPUiB8IFwKKwkgIEE2WFhf UkJCTV9JTlRfMF9NQVNLX1JCQk1fQVRCX0FTWU5DRklGT19PVkVSRkxPVyB8IFwKKwkgIEE2WFhf UkJCTV9JTlRfMF9NQVNLX0NQX0hXX0VSUk9SIHwgXAorCSAgQTZYWF9SQkJNX0lOVF8wX01BU0tf Q1BfSUIyIHwgXAorCSAgQTZYWF9SQkJNX0lOVF8wX01BU0tfQ1BfSUIxIHwgXAorCSAgQTZYWF9S QkJNX0lOVF8wX01BU0tfQ1BfUkIgfCBcCisJICBBNlhYX1JCQk1fSU5UXzBfTUFTS19DUF9DQUNI RV9GTFVTSF9UUyB8IFwKKwkgIEE2WFhfUkJCTV9JTlRfMF9NQVNLX1JCQk1fQVRCX0JVU19PVkVS RkxPVyB8IFwKKwkgIEE2WFhfUkJCTV9JTlRfMF9NQVNLX1JCQk1fSEFOR19ERVRFQ1QgfCBcCisJ ICBBNlhYX1JCQk1fSU5UXzBfTUFTS19VQ0hFX09PQl9BQ0NFU1MgfCBcCisJICBBNlhYX1JCQk1f SU5UXzBfTUFTS19VQ0hFX1RSQVBfSU5UUikKKworc3RhdGljIGludCBhNnh4X2h3X2luaXQoc3Ry dWN0IG1zbV9ncHUgKmdwdSkKK3sKKwlzdHJ1Y3QgYWRyZW5vX2dwdSAqYWRyZW5vX2dwdSA9IHRv X2FkcmVub19ncHUoZ3B1KTsKKwlzdHJ1Y3QgYTZ4eF9ncHUgKmE2eHhfZ3B1ID0gdG9fYTZ4eF9n cHUoYWRyZW5vX2dwdSk7CisJaW50IHJldDsKKworCS8qIE1ha2Ugc3VyZSB0aGUgR01VIGtlZXBz IHRoZSBHUFUgb24gd2hpbGUgd2Ugc2V0IGl0IHVwICovCisJYTZ4eF9nbXVfc2V0X29vYigmYTZ4 eF9ncHUtPmdtdSwgR01VX09PQl9HUFVfU0VUKTsKKworCWdwdV93cml0ZShncHUsIFJFR19BNlhY X1JCQk1fU0VDVklEX1RTQl9DTlRMLCAwKTsKKworCS8qCisJICogRGlzYWJsZSB0aGUgdHJ1c3Rl ZCBtZW1vcnkgcmFuZ2UgLSB3ZSBkb24ndCBhY3R1YWxseSBzdXBwb3J0ZWQgc2VjdXJlCisJICog bWVtb3J5IHJlbmRlcmluZyBhdCB0aGlzIHBvaW50IGluIHRpbWUgYW5kIHdlIGRvbid0IHdhbnQg dG8gYmxvY2sgb2ZmCisJICogcGFydCBvZiB0aGUgdmlydHVhbCBtZW1vcnkgc3BhY2UuCisJICov CisJZ3B1X3dyaXRlNjQoZ3B1LCBSRUdfQTZYWF9SQkJNX1NFQ1ZJRF9UU0JfVFJVU1RFRF9CQVNF X0xPLAorCQlSRUdfQTZYWF9SQkJNX1NFQ1ZJRF9UU0JfVFJVU1RFRF9CQVNFX0hJLCAweDAwMDAw MDAwKTsKKwlncHVfd3JpdGUoZ3B1LCBSRUdfQTZYWF9SQkJNX1NFQ1ZJRF9UU0JfVFJVU1RFRF9T SVpFLCAweDAwMDAwMDAwKTsKKworCS8qIGVuYWJsZSBoYXJkd2FyZSBjbG9ja2dhdGluZyAqLwor CWE2eHhfc2V0X2h3Y2coZ3B1LCB0cnVlKTsKKworCS8qIFZCSUYgc3RhcnQgKi8KKwlncHVfd3Jp dGUoZ3B1LCBSRUdfQTZYWF9WQklGX0dBVEVfT0ZGX1dSUkVRX0VOLCAweDAwMDAwMDA5KTsKKwln cHVfd3JpdGUoZ3B1LCBSRUdfQTZYWF9SQkJNX1ZCSUZfQ0xJRU5UX1FPU19DTlRMLCAweDMpOwor CisJLyogTWFrZSBhbGwgYmxvY2tzIGNvbnRyaWJ1dGUgdG8gdGhlIEdQVSBCVVNZIHBlcmYgY291 bnRlciAqLworCWdwdV93cml0ZShncHUsIFJFR19BNlhYX1JCQk1fUEVSRkNUUl9HUFVfQlVTWV9N QVNLRUQsIDB4ZmZmZmZmZmYpOworCisJLyogRGlzYWJsZSBMMiBieXBhc3MgaW4gdGhlIFVDSEUg Ki8KKwlncHVfd3JpdGUoZ3B1LCBSRUdfQTZYWF9VQ0hFX1dSSVRFX1JBTkdFX01BWF9MTywgMHhm ZmZmZmZjMCk7CisJZ3B1X3dyaXRlKGdwdSwgUkVHX0E2WFhfVUNIRV9XUklURV9SQU5HRV9NQVhf SEksIDB4MDAwMWZmZmYpOworCWdwdV93cml0ZShncHUsIFJFR19BNlhYX1VDSEVfVFJBUF9CQVNF X0xPLCAweGZmZmZmMDAwKTsKKwlncHVfd3JpdGUoZ3B1LCBSRUdfQTZYWF9VQ0hFX1RSQVBfQkFT RV9ISSwgMHgwMDAxZmZmZik7CisJZ3B1X3dyaXRlKGdwdSwgUkVHX0E2WFhfVUNIRV9XUklURV9U SFJVX0JBU0VfTE8sIDB4ZmZmZmYwMDApOworCWdwdV93cml0ZShncHUsIFJFR19BNlhYX1VDSEVf V1JJVEVfVEhSVV9CQVNFX0hJLCAweDAwMDFmZmZmKTsKKworCS8qIFNldCB0aGUgR01FTSBWQSBy YW5nZSBbMHgxMDAwMDA6MHgxMDAwMDAgKyBncHUtPmdtZW0gLSAxXSAqLworCWdwdV93cml0ZTY0 KGdwdSwgUkVHX0E2WFhfVUNIRV9HTUVNX1JBTkdFX01JTl9MTywKKwkJUkVHX0E2WFhfVUNIRV9H TUVNX1JBTkdFX01JTl9ISSwgMHgwMDEwMDAwMCk7CisKKwlncHVfd3JpdGU2NChncHUsIFJFR19B NlhYX1VDSEVfR01FTV9SQU5HRV9NQVhfTE8sCisJCVJFR19BNlhYX1VDSEVfR01FTV9SQU5HRV9N QVhfSEksCisJCTB4MDAxMDAwMDAgKyBhZHJlbm9fZ3B1LT5nbWVtIC0gMSk7CisKKwlncHVfd3Jp dGUoZ3B1LCBSRUdfQTZYWF9VQ0hFX0ZJTFRFUl9DTlRMLCAweDgwNCk7CisJZ3B1X3dyaXRlKGdw dSwgUkVHX0E2WFhfVUNIRV9DQUNIRV9XQVlTLCAweDQpOworCisJZ3B1X3dyaXRlKGdwdSwgUkVH X0E2WFhfQ1BfUk9RX1RIUkVTSE9MRFNfMiwgMHgwMTAwMDBjMCk7CisJZ3B1X3dyaXRlKGdwdSwg UkVHX0E2WFhfQ1BfUk9RX1RIUkVTSE9MRFNfMSwgMHg4MDQwMzYyYyk7CisKKwkvKiBTZXR0aW5n IHRoZSBtZW0gcG9vbCBzaXplICovCisJZ3B1X3dyaXRlKGdwdSwgUkVHX0E2WFhfQ1BfTUVNX1BP T0xfU0laRSwgMTI4KTsKKworCS8qIFNldHRpbmcgdGhlIHByaW1GaWZvIHRocmVzaG9sZHMgZGVm YXVsdCB2YWx1ZXMgKi8KKwlncHVfd3JpdGUoZ3B1LCBSRUdfQTZYWF9QQ19EQkdfRUNPX0NOVEws ICgweDMwMCA8PCAxMSkpOworCisJLyogU2V0IHRoZSBBSEIgZGVmYXVsdCBzbGF2ZSByZXNwb25z ZSB0byAiRVJST1IiICovCisJZ3B1X3dyaXRlKGdwdSwgUkVHX0E2WFhfQ1BfQUhCX0NOVEwsIDB4 MSk7CisKKwkvKiBUdXJuIG9uIHBlcmZvcm1hbmNlIGNvdW50ZXJzICovCisJZ3B1X3dyaXRlKGdw dSwgUkVHX0E2WFhfUkJCTV9QRVJGQ1RSX0NOVEwsIDB4MSk7CisKKwkvKiBTZWxlY3QgQ1AwIHRv IGFsd2F5cyBjb3VudCBjeWNsZXMgKi8KKwlncHVfd3JpdGUoZ3B1LCBSRUdfQTZYWF9DUF9QRVJG Q1RSX0NQX1NFTF8wLCBQRVJGX0NQX0FMV0FZU19DT1VOVCk7CisKKwkvKiBGSVhNRTogbm90IHN1 cmUgaWYgdGhpcyBzaG91bGQgbGl2ZSBoZXJlIG9yIGluIGE2eHhfZ211LmMgKi8KKwlnbXVfd3Jp dGUoJmE2eHhfZ3B1LT5nbXUsICBSRUdfQTZYWF9HUFVfR01VX0FPX0dQVV9DWF9CVVNZX01BU0ss CisJCTB4ZmYwMDAwMDApOworCWdtdV9ybXcoJmE2eHhfZ3B1LT5nbXUsIFJFR19BNlhYX0dNVV9D WF9HTVVfUE9XRVJfQ09VTlRFUl9TRUxFQ1RfMCwKKwkJMHhmZiwgMHgyMCk7CisJZ211X3dyaXRl KCZhNnh4X2dwdS0+Z211LCBSRUdfQTZYWF9HTVVfQ1hfR01VX1BPV0VSX0NPVU5URVJfRU5BQkxF LAorCQkweDAxKTsKKworCWdwdV93cml0ZShncHUsIFJFR19BNlhYX1JCX05DX01PREVfQ05UTCwg MiA8PCAxKTsKKwlncHVfd3JpdGUoZ3B1LCBSRUdfQTZYWF9UUEwxX05DX01PREVfQ05UTCwgMiA8 PCAxKTsKKwlncHVfd3JpdGUoZ3B1LCBSRUdfQTZYWF9TUF9OQ19NT0RFX0NOVEwsIDIgPDwgMSk7 CisJZ3B1X3dyaXRlKGdwdSwgUkVHX0E2WFhfVUNIRV9NT0RFX0NOVEwsIDIgPDwgMjEpOworCisJ LyogRW5hYmxlIGZhdWx0IGRldGVjdGlvbiAqLworCWdwdV93cml0ZShncHUsIFJFR19BNlhYX1JC Qk1fSU5URVJGQUNFX0hBTkdfSU5UX0NOVEwsCisJCSgxIDw8IDMwKSB8IDB4MWZmZmZmKTsKKwor CWdwdV93cml0ZShncHUsIFJFR19BNlhYX1VDSEVfQ0xJRU5UX1BGLCAxKTsKKworCS8qIFByb3Rl Y3QgcmVnaXN0ZXJzIGZyb20gdGhlIENQICovCisJZ3B1X3dyaXRlKGdwdSwgUkVHX0E2WFhfQ1Bf UFJPVEVDVF9DTlRMLCAweDAwMDAwMDAzKTsKKworCWdwdV93cml0ZShncHUsIFJFR19BNlhYX0NQ X1BST1RFQ1QoMCksCisJCUE2WFhfUFJPVEVDVF9SRE9OTFkoMHg2MDAsIDB4NTEpKTsKKwlncHVf d3JpdGUoZ3B1LCBSRUdfQTZYWF9DUF9QUk9URUNUKDEpLCBBNlhYX1BST1RFQ1RfUlcoMHhhZTUw LCAweDIpKTsKKwlncHVfd3JpdGUoZ3B1LCBSRUdfQTZYWF9DUF9QUk9URUNUKDIpLCBBNlhYX1BS T1RFQ1RfUlcoMHg5NjI0LCAweDEzKSk7CisJZ3B1X3dyaXRlKGdwdSwgUkVHX0E2WFhfQ1BfUFJP VEVDVCgzKSwgQTZYWF9QUk9URUNUX1JXKDB4ODYzMCwgMHg4KSk7CisJZ3B1X3dyaXRlKGdwdSwg UkVHX0E2WFhfQ1BfUFJPVEVDVCg0KSwgQTZYWF9QUk9URUNUX1JXKDB4OWU3MCwgMHgxKSk7CisJ Z3B1X3dyaXRlKGdwdSwgUkVHX0E2WFhfQ1BfUFJPVEVDVCg1KSwgQTZYWF9QUk9URUNUX1JXKDB4 OWU3OCwgMHgxODcpKTsKKwlncHVfd3JpdGUoZ3B1LCBSRUdfQTZYWF9DUF9QUk9URUNUKDYpLCBB NlhYX1BST1RFQ1RfUlcoMHhmMDAwLCAweDgxMCkpOworCWdwdV93cml0ZShncHUsIFJFR19BNlhY X0NQX1BST1RFQ1QoNyksCisJCUE2WFhfUFJPVEVDVF9SRE9OTFkoMHhmYzAwLCAweDMpKTsKKwln cHVfd3JpdGUoZ3B1LCBSRUdfQTZYWF9DUF9QUk9URUNUKDgpLCBBNlhYX1BST1RFQ1RfUlcoMHg1 MGUsIDB4MCkpOworCWdwdV93cml0ZShncHUsIFJFR19BNlhYX0NQX1BST1RFQ1QoOSksIEE2WFhf UFJPVEVDVF9SRE9OTFkoMHg1MGYsIDB4MCkpOworCWdwdV93cml0ZShncHUsIFJFR19BNlhYX0NQ X1BST1RFQ1QoMTApLCBBNlhYX1BST1RFQ1RfUlcoMHg1MTAsIDB4MCkpOworCWdwdV93cml0ZShn cHUsIFJFR19BNlhYX0NQX1BST1RFQ1QoMTEpLAorCQlBNlhYX1BST1RFQ1RfUkRPTkxZKDB4MCwg MHg0ZjkpKTsKKwlncHVfd3JpdGUoZ3B1LCBSRUdfQTZYWF9DUF9QUk9URUNUKDEyKSwKKwkJQTZY WF9QUk9URUNUX1JET05MWSgweDUwMSwgMHhhKSk7CisJZ3B1X3dyaXRlKGdwdSwgUkVHX0E2WFhf Q1BfUFJPVEVDVCgxMyksCisJCUE2WFhfUFJPVEVDVF9SRE9OTFkoMHg1MTEsIDB4NDQpKTsKKwln cHVfd3JpdGUoZ3B1LCBSRUdfQTZYWF9DUF9QUk9URUNUKDE0KSwgQTZYWF9QUk9URUNUX1JXKDB4 ZTAwLCAweGUpKTsKKwlncHVfd3JpdGUoZ3B1LCBSRUdfQTZYWF9DUF9QUk9URUNUKDE1KSwgQTZY WF9QUk9URUNUX1JXKDB4OGUwMCwgMHgwKSk7CisJZ3B1X3dyaXRlKGdwdSwgUkVHX0E2WFhfQ1Bf UFJPVEVDVCgxNiksIEE2WFhfUFJPVEVDVF9SVygweDhlNTAsIDB4ZikpOworCWdwdV93cml0ZShn cHUsIFJFR19BNlhYX0NQX1BST1RFQ1QoMTcpLCBBNlhYX1BST1RFQ1RfUlcoMHhiZTAyLCAweDAp KTsKKwlncHVfd3JpdGUoZ3B1LCBSRUdfQTZYWF9DUF9QUk9URUNUKDE4KSwKKwkJQTZYWF9QUk9U RUNUX1JXKDB4YmUyMCwgMHgxMWYzKSk7CisJZ3B1X3dyaXRlKGdwdSwgUkVHX0E2WFhfQ1BfUFJP VEVDVCgxOSksIEE2WFhfUFJPVEVDVF9SVygweDgwMCwgMHg4MikpOworCWdwdV93cml0ZShncHUs IFJFR19BNlhYX0NQX1BST1RFQ1QoMjApLCBBNlhYX1BST1RFQ1RfUlcoMHg4YTAsIDB4OCkpOwor CWdwdV93cml0ZShncHUsIFJFR19BNlhYX0NQX1BST1RFQ1QoMjEpLCBBNlhYX1BST1RFQ1RfUlco MHg4YWIsIDB4MTkpKTsKKwlncHVfd3JpdGUoZ3B1LCBSRUdfQTZYWF9DUF9QUk9URUNUKDIyKSwg QTZYWF9QUk9URUNUX1JXKDB4OTAwLCAweDRkKSk7CisJZ3B1X3dyaXRlKGdwdSwgUkVHX0E2WFhf Q1BfUFJPVEVDVCgyMyksIEE2WFhfUFJPVEVDVF9SVygweDk4ZCwgMHg3NikpOworCWdwdV93cml0 ZShncHUsIFJFR19BNlhYX0NQX1BST1RFQ1QoMjQpLAorCQkJQTZYWF9QUk9URUNUX1JET05MWSgw eDhkMCwgMHgyMykpOworCWdwdV93cml0ZShncHUsIFJFR19BNlhYX0NQX1BST1RFQ1QoMjUpLAor CQkJQTZYWF9QUk9URUNUX1JET05MWSgweDk4MCwgMHg0KSk7CisJZ3B1X3dyaXRlKGdwdSwgUkVH X0E2WFhfQ1BfUFJPVEVDVCgyNiksIEE2WFhfUFJPVEVDVF9SVygweGE2MzAsIDB4MCkpOworCisJ LyogRW5hYmxlIGludGVycnVwdHMgKi8KKwlncHVfd3JpdGUoZ3B1LCBSRUdfQTZYWF9SQkJNX0lO VF8wX01BU0ssIEE2WFhfSU5UX01BU0spOworCisJcmV0ID0gYWRyZW5vX2h3X2luaXQoZ3B1KTsK KwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCXJldCA9IGE2eHhfdWNvZGVfaW5pdChncHUpOwor CWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJLyogQWx3YXlzIGNvbWUgdXAgb24gcmIgMCAqLwor CWE2eHhfZ3B1LT5jdXJfcmluZyA9IGdwdS0+cmJbMF07CisKKwkvKiBFbmFibGUgdGhlIFNRRV90 byBzdGFydCB0aGUgQ1AgZW5naW5lICovCisJZ3B1X3dyaXRlKGdwdSwgUkVHX0E2WFhfQ1BfU1FF X0NOVEwsIDEpOworCisJcmV0ID0gYTZ4eF9jcF9pbml0KGdwdSk7CisJaWYgKHJldCkKKwkJZ290 byBvdXQ7CisKKwlncHVfd3JpdGUoZ3B1LCBSRUdfQTZYWF9SQkJNX1NFQ1ZJRF9UUlVTVF9DTlRM LCAweDApOworCitvdXQ6CisJLyoKKwkgKiBUZWxsIHRoZSBHTVUgdGhhdCB3ZSBhcmUgZG9uZSB0 b3VjaGluZyB0aGUgR1BVIGFuZCBpdCBjYW4gc3RhcnQgcG93ZXIKKwkgKiBtYW5hZ2VtZW50CisJ ICovCisJYTZ4eF9nbXVfY2xlYXJfb29iKCZhNnh4X2dwdS0+Z211LCBHTVVfT09CX0dQVV9TRVQp OworCisJLyogVGFrZSB0aGUgR01VIG91dCBvZiBpdHMgc3BlY2lhbCBib290IG1vZGUgKi8KKwlh Nnh4X2dtdV9jbGVhcl9vb2IoJmE2eHhfZ3B1LT5nbXUsIEdNVV9PT0JfQk9PVF9TTFVNQkVSKTsK KworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGE2eHhfZHVtcChzdHJ1Y3QgbXNtX2dw dSAqZ3B1KQoreworCWRldl9pbmZvKCZncHUtPnBkZXYtPmRldiwgInN0YXR1czogICAlMDh4XG4i LAorCQkJZ3B1X3JlYWQoZ3B1LCBSRUdfQTZYWF9SQkJNX1NUQVRVUykpOworCWFkcmVub19kdW1w KGdwdSk7Cit9CisKKyNkZWZpbmUgVkJJRl9SRVNFVF9BQ0tfVElNRU9VVAkxMDAKKyNkZWZpbmUg VkJJRl9SRVNFVF9BQ0tfTUFTSwkweDAwZjAKKworc3RhdGljIHZvaWQgYTZ4eF9yZWNvdmVyKHN0 cnVjdCBtc21fZ3B1ICpncHUpCit7CisJaW50IGk7CisKKwlhZHJlbm9fZHVtcF9pbmZvKGdwdSk7 CisKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCQlkZXZfaW5mbygmZ3B1LT5wZGV2LT5kZXYs ICJDUF9TQ1JBVENIX1JFRyVkOiAldVxuIiwgaSwKKwkJCWdwdV9yZWFkKGdwdSwgUkVHX0E2WFhf Q1BfU0NSQVRDSF9SRUcoaSkpKTsKKworCWlmIChoYW5nX2RlYnVnKQorCQlhNnh4X2R1bXAoZ3B1 KTsKKworCWdwdS0+ZnVuY3MtPnBtX3N1c3BlbmQoZ3B1KTsKKwlncHUtPmZ1bmNzLT5wbV9yZXN1 bWUoZ3B1KTsKKworCW1zbV9ncHVfaHdfaW5pdChncHUpOworfQorCitzdGF0aWMgaW50IGE2eHhf ZmF1bHRfaGFuZGxlcih2b2lkICphcmcsIHVuc2lnbmVkIGxvbmcgaW92YSwgaW50IGZsYWdzKQor eworCXN0cnVjdCBtc21fZ3B1ICpncHUgPSBhcmc7CisKKwlwcl93YXJuX3JhdGVsaW1pdGVkKCIq KiogZ3B1IGZhdWx0OiBpb3ZhPSUwOGx4LCBmbGFncz0lZCAoJXUsJXUsJXUsJXUpXG4iLAorCQkJ aW92YSwgZmxhZ3MsCisJCQlncHVfcmVhZChncHUsIFJFR19BNlhYX0NQX1NDUkFUQ0hfUkVHKDQp KSwKKwkJCWdwdV9yZWFkKGdwdSwgUkVHX0E2WFhfQ1BfU0NSQVRDSF9SRUcoNSkpLAorCQkJZ3B1 X3JlYWQoZ3B1LCBSRUdfQTZYWF9DUF9TQ1JBVENIX1JFRyg2KSksCisJCQlncHVfcmVhZChncHUs IFJFR19BNlhYX0NQX1NDUkFUQ0hfUkVHKDcpKSk7CisKKwlyZXR1cm4gLUVGQVVMVDsKK30KKwor c3RhdGljIHZvaWQgYTZ4eF9jcF9od19lcnJfaXJxKHN0cnVjdCBtc21fZ3B1ICpncHUpCit7CisJ dTMyIHN0YXR1cyA9IGdwdV9yZWFkKGdwdSwgUkVHX0E2WFhfQ1BfSU5URVJSVVBUX1NUQVRVUyk7 CisKKwlpZiAoc3RhdHVzICYgQTZYWF9DUF9JTlRfQ1BfT1BDT0RFX0VSUk9SKSB7CisJCXUzMiB2 YWw7CisKKwkJZ3B1X3dyaXRlKGdwdSwgUkVHX0E2WFhfQ1BfU1FFX1NUQVRfQUREUiwgMSk7CisJ CXZhbCA9IGdwdV9yZWFkKGdwdSwgUkVHX0E2WFhfQ1BfU1FFX1NUQVRfREFUQSk7CisJCWRldl9l cnJfcmF0ZWxpbWl0ZWQoJmdwdS0+cGRldi0+ZGV2LAorCQkJIkNQIHwgb3Bjb2RlIGVycm9yIHwg cG9zc2libGUgb3Bjb2RlPTB4JTguOFhcbiIsCisJCQl2YWwpOworCX0KKworCWlmIChzdGF0dXMg JiBBNlhYX0NQX0lOVF9DUF9VQ09ERV9FUlJPUikKKwkJZGV2X2Vycl9yYXRlbGltaXRlZCgmZ3B1 LT5wZGV2LT5kZXYsCisJCQkiQ1AgdWNvZGUgZXJyb3IgaW50ZXJydXB0XG4iKTsKKworCWlmIChz dGF0dXMgJiBBNlhYX0NQX0lOVF9DUF9IV19GQVVMVF9FUlJPUikKKwkJZGV2X2Vycl9yYXRlbGlt aXRlZCgmZ3B1LT5wZGV2LT5kZXYsICJDUCB8IEhXIGZhdWx0IHwgc3RhdHVzPTB4JTguOFhcbiIs CisJCQlncHVfcmVhZChncHUsIFJFR19BNlhYX0NQX0hXX0ZBVUxUKSk7CisKKwlpZiAoc3RhdHVz ICYgQTZYWF9DUF9JTlRfQ1BfUkVHSVNURVJfUFJPVEVDVElPTl9FUlJPUikgeworCQl1MzIgdmFs ID0gZ3B1X3JlYWQoZ3B1LCBSRUdfQTZYWF9DUF9QUk9URUNUX1NUQVRVUyk7CisKKwkJZGV2X2Vy cl9yYXRlbGltaXRlZCgmZ3B1LT5wZGV2LT5kZXYsCisJCQkiQ1AgfCBwcm90ZWN0ZWQgbW9kZSBl cnJvciB8ICVzIHwgYWRkcj0weCU4LjhYIHwgc3RhdHVzPTB4JTguOFhcbiIsCisJCQl2YWwgJiAo MSA8PCAyMCkgPyAiUkVBRCIgOiAiV1JJVEUiLAorCQkJKHZhbCAmIDB4M2ZmZmYpLCB2YWwpOwor CX0KKworCWlmIChzdGF0dXMgJiBBNlhYX0NQX0lOVF9DUF9BSEJfRVJST1IpCisJCWRldl9lcnJf cmF0ZWxpbWl0ZWQoJmdwdS0+cGRldi0+ZGV2LCAiQ1AgQUhCIGVycm9yIGludGVycnVwdFxuIik7 CisKKwlpZiAoc3RhdHVzICYgQTZYWF9DUF9JTlRfQ1BfVlNEX1BBUklUWV9FUlJPUikKKwkJZGV2 X2Vycl9yYXRlbGltaXRlZCgmZ3B1LT5wZGV2LT5kZXYsICJDUCBWU0QgZGVjb2RlciBwYXJpdHkg ZXJyb3JcbiIpOworCisJaWYgKHN0YXR1cyAmIEE2WFhfQ1BfSU5UX0NQX0lMTEVHQUxfSU5TVFJf RVJST1IpCisJCWRldl9lcnJfcmF0ZWxpbWl0ZWQoJmdwdS0+cGRldi0+ZGV2LCAiQ1AgaWxsZWdh bCBpbnN0cnVjdGlvbiBlcnJvclxuIik7CisKK30KKworc3RhdGljIHZvaWQgYTZ4eF9mYXVsdF9k ZXRlY3RfaXJxKHN0cnVjdCBtc21fZ3B1ICpncHUpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRl diA9IGdwdS0+ZGV2OworCXN0cnVjdCBtc21fZHJtX3ByaXZhdGUgKnByaXYgPSBkZXYtPmRldl9w cml2YXRlOworCXN0cnVjdCBtc21fcmluZ2J1ZmZlciAqcmluZyA9IGdwdS0+ZnVuY3MtPmFjdGl2 ZV9yaW5nKGdwdSk7CisKKwlEUk1fREVWX0VSUk9SKCZncHUtPnBkZXYtPmRldiwKKwkJImdwdSBm YXVsdCByaW5nICVkIGZlbmNlICV4IHN0YXR1cyAlOC44WCByYiAlNC40eC8lNC40eCBpYjEgJTE2 LjE2bGxYLyU0LjR4IGliMiAlMTYuMTZsbFgvJTQuNHhcbiIsCisJCXJpbmcgPyByaW5nLT5pZCA6 IC0xLCByaW5nID8gcmluZy0+c2Vxbm8gOiAwLAorCQlncHVfcmVhZChncHUsIFJFR19BNlhYX1JC Qk1fU1RBVFVTKSwKKwkJZ3B1X3JlYWQoZ3B1LCBSRUdfQTZYWF9DUF9SQl9SUFRSKSwKKwkJZ3B1 X3JlYWQoZ3B1LCBSRUdfQTZYWF9DUF9SQl9XUFRSKSwKKwkJZ3B1X3JlYWQ2NChncHUsIFJFR19B NlhYX0NQX0lCMV9CQVNFLCBSRUdfQTZYWF9DUF9JQjFfQkFTRV9ISSksCisJCWdwdV9yZWFkKGdw dSwgUkVHX0E2WFhfQ1BfSUIxX1JFTV9TSVpFKSwKKwkJZ3B1X3JlYWQ2NChncHUsIFJFR19BNlhY X0NQX0lCMl9CQVNFLCBSRUdfQTZYWF9DUF9JQjJfQkFTRV9ISSksCisJCWdwdV9yZWFkKGdwdSwg UkVHX0E2WFhfQ1BfSUIyX1JFTV9TSVpFKSk7CisKKwkvKiBUdXJuIG9mZiB0aGUgaGFuZ2NoZWNr IHRpbWVyIHRvIGtlZXAgaXQgZnJvbSBib3RoZXJpbmcgdXMgKi8KKwlkZWxfdGltZXIoJmdwdS0+ aGFuZ2NoZWNrX3RpbWVyKTsKKworCXF1ZXVlX3dvcmsocHJpdi0+d3EsICZncHUtPnJlY292ZXJf d29yayk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBhNnh4X2lycShzdHJ1Y3QgbXNtX2dwdSAq Z3B1KQoreworCXUzMiBzdGF0dXMgPSBncHVfcmVhZChncHUsIFJFR19BNlhYX1JCQk1fSU5UXzBf U1RBVFVTKTsKKworCWdwdV93cml0ZShncHUsIFJFR19BNlhYX1JCQk1fSU5UX0NMRUFSX0NNRCwg c3RhdHVzKTsKKworCWlmIChzdGF0dXMgJiBBNlhYX1JCQk1fSU5UXzBfTUFTS19SQkJNX0hBTkdf REVURUNUKQorCQlhNnh4X2ZhdWx0X2RldGVjdF9pcnEoZ3B1KTsKKworCWlmIChzdGF0dXMgJiBB NlhYX1JCQk1fSU5UXzBfTUFTS19DUF9BSEJfRVJST1IpCisJCWRldl9lcnJfcmF0ZWxpbWl0ZWQo JmdwdS0+cGRldi0+ZGV2LCAiQ1AgfCBBSEIgYnVzIGVycm9yXG4iKTsKKworCWlmIChzdGF0dXMg JiBBNlhYX1JCQk1fSU5UXzBfTUFTS19DUF9IV19FUlJPUikKKwkJYTZ4eF9jcF9od19lcnJfaXJx KGdwdSk7CisKKwlpZiAoc3RhdHVzICYgQTZYWF9SQkJNX0lOVF8wX01BU0tfUkJCTV9BVEJfQVNZ TkNGSUZPX09WRVJGTE9XKQorCQlkZXZfZXJyX3JhdGVsaW1pdGVkKCZncHUtPnBkZXYtPmRldiwg IlJCQk0gfCBBVEIgQVNZTkMgb3ZlcmZsb3dcbiIpOworCisJaWYgKHN0YXR1cyAmIEE2WFhfUkJC TV9JTlRfMF9NQVNLX1JCQk1fQVRCX0JVU19PVkVSRkxPVykKKwkJZGV2X2Vycl9yYXRlbGltaXRl ZCgmZ3B1LT5wZGV2LT5kZXYsICJSQkJNIHwgQVRCIGJ1cyBvdmVyZmxvd1xuIik7CisKKwlpZiAo c3RhdHVzICYgQTZYWF9SQkJNX0lOVF8wX01BU0tfVUNIRV9PT0JfQUNDRVNTKQorCQlkZXZfZXJy X3JhdGVsaW1pdGVkKCZncHUtPnBkZXYtPmRldiwgIlVDSEUgfCBPdXQgb2YgYm91bmRzIGFjY2Vz c1xuIik7CisKKwlpZiAoc3RhdHVzICYgQTZYWF9SQkJNX0lOVF8wX01BU0tfQ1BfQ0FDSEVfRkxV U0hfVFMpCisJCW1zbV9ncHVfcmV0aXJlKGdwdSk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9 CisKK3N0YXRpYyBjb25zdCB1MzIgYTZ4eF9yZWdpc3Rlcl9vZmZzZXRzW1JFR19BRFJFTk9fUkVH SVNURVJfTUFYXSA9IHsKKwlSRUdfQURSRU5PX0RFRklORShSRUdfQURSRU5PX0NQX1JCX0JBU0Us IFJFR19BNlhYX0NQX1JCX0JBU0UpLAorCVJFR19BRFJFTk9fREVGSU5FKFJFR19BRFJFTk9fQ1Bf UkJfQkFTRV9ISSwgUkVHX0E2WFhfQ1BfUkJfQkFTRV9ISSksCisJUkVHX0FEUkVOT19ERUZJTkUo UkVHX0FEUkVOT19DUF9SQl9SUFRSX0FERFIsCisJCVJFR19BNlhYX0NQX1JCX1JQVFJfQUREUl9M TyksCisJUkVHX0FEUkVOT19ERUZJTkUoUkVHX0FEUkVOT19DUF9SQl9SUFRSX0FERFJfSEksCisJ CVJFR19BNlhYX0NQX1JCX1JQVFJfQUREUl9ISSksCisJUkVHX0FEUkVOT19ERUZJTkUoUkVHX0FE UkVOT19DUF9SQl9SUFRSLCBSRUdfQTZYWF9DUF9SQl9SUFRSKSwKKwlSRUdfQURSRU5PX0RFRklO RShSRUdfQURSRU5PX0NQX1JCX1dQVFIsIFJFR19BNlhYX0NQX1JCX1dQVFIpLAorCVJFR19BRFJF Tk9fREVGSU5FKFJFR19BRFJFTk9fQ1BfUkJfQ05UTCwgUkVHX0E2WFhfQ1BfUkJfQ05UTCksCit9 OworCitzdGF0aWMgY29uc3QgdTMyIGE2eHhfcmVnaXN0ZXJzW10gPSB7CisJMHgwMDAwLCAweDAw MDIsIDB4MDAxMCwgMHgwMDEwLCAweDAwMTIsIDB4MDAxMiwgMHgwMDE4LCAweDAwMWIsCisJMHgw MDFlLCAweDAwMzIsIDB4MDAzOCwgMHgwMDNjLCAweDAwNDIsIDB4MDA0MiwgMHgwMDQ0LCAweDAw NDQsCisJMHgwMDQ3LCAweDAwNDcsIDB4MDA1NiwgMHgwMDU2LCAweDAwYWQsIDB4MDBhZSwgMHgw MGIwLCAweDAwZmIsCisJMHgwMTAwLCAweDAxMWQsIDB4MDIwMCwgMHgwMjBkLCAweDAyMTAsIDB4 MDIxMywgMHgwMjE4LCAweDAyM2QsCisJMHgwNDAwLCAweDA0ZjksIDB4MDUwMCwgMHgwNTAwLCAw eDA1MDUsIDB4MDUwYiwgMHgwNTBlLCAweDA1MTEsCisJMHgwNTMzLCAweDA1MzMsIDB4MDU0MCwg MHgwNTU1LCAweDA4MDAsIDB4MDgwOCwgMHgwODEwLCAweDA4MTMsCisJMHgwODIwLCAweDA4MjEs IDB4MDgyMywgMHgwODI3LCAweDA4MzAsIDB4MDgzMywgMHgwODQwLCAweDA4NDMsCisJMHgwODRm LCAweDA4NmYsIDB4MDg4MCwgMHgwODhhLCAweDA4YTAsIDB4MDhhYiwgMHgwOGMwLCAweDA4YzQs CisJMHgwOGQwLCAweDA4ZGQsIDB4MDhmMCwgMHgwOGYzLCAweDA5MDAsIDB4MDkwMywgMHgwOTA4 LCAweDA5MTEsCisJMHgwOTI4LCAweDA5M2UsIDB4MDk0MiwgMHgwOTRkLCAweDA5ODAsIDB4MDk4 NCwgMHgwOThkLCAweDA5OTYsCisJMHgwOTk4LCAweDA5OWUsIDB4MDlhMCwgMHgwOWE2LCAweDA5 YTgsIDB4MDlhZSwgMHgwOWIwLCAweDA5YjEsCisJMHgwOWMyLCAweDA5YzgsIDB4MGEwMCwgMHgw YTAzLCAweDBjMDAsIDB4MGMwNCwgMHgwYzA2LCAweDBjMDYsCisJMHgwYzEwLCAweDBjZDksIDB4 MGUwMCwgMHgwZTBlLCAweDBlMTAsIDB4MGUxMywgMHgwZTE3LCAweDBlMTksCisJMHgwZTFjLCAw eDBlMmIsIDB4MGUzMCwgMHgwZTMyLCAweDBlMzgsIDB4MGUzOSwgMHg4NjAwLCAweDg2MDEsCisJ MHg4NjEwLCAweDg2MWIsIDB4ODYyMCwgMHg4NjIwLCAweDg2MjgsIDB4ODYyYiwgMHg4NjMwLCAw eDg2MzcsCisJMHg4ZTAxLCAweDhlMDEsIDB4OGUwNCwgMHg4ZTA1LCAweDhlMDcsIDB4OGUwOCwg MHg4ZTBjLCAweDhlMGMsCisJMHg4ZTEwLCAweDhlMWMsIDB4OGUyMCwgMHg4ZTI1LCAweDhlMjgs IDB4OGUyOCwgMHg4ZTJjLCAweDhlMmYsCisJMHg4ZTNiLCAweDhlM2UsIDB4OGU0MCwgMHg4ZTQz LCAweDhlNTAsIDB4OGU1ZSwgMHg4ZTcwLCAweDhlNzcsCisJMHg5NjAwLCAweDk2MDQsIDB4OTYy NCwgMHg5NjM3LCAweDllMDAsIDB4OWUwMSwgMHg5ZTAzLCAweDllMGUsCisJMHg5ZTExLCAweDll MTYsIDB4OWUxOSwgMHg5ZTE5LCAweDllMWMsIDB4OWUxYywgMHg5ZTIwLCAweDllMjMsCisJMHg5 ZTMwLCAweDllMzEsIDB4OWUzNCwgMHg5ZTM0LCAweDllNzAsIDB4OWU3MiwgMHg5ZTc4LCAweDll NzksCisJMHg5ZTgwLCAweDlmZmYsIDB4YTYwMCwgMHhhNjAxLCAweGE2MDMsIDB4YTYwMywgMHhh NjBhLCAweGE2MGEsCisJMHhhNjEwLCAweGE2MTcsIDB4YTYzMCwgMHhhNjMwLAorCX4wCit9Owor CitzdGF0aWMgaW50IGE2eHhfcG1fcmVzdW1lKHN0cnVjdCBtc21fZ3B1ICpncHUpCit7CisJc3Ry dWN0IGFkcmVub19ncHUgKmFkcmVub19ncHUgPSB0b19hZHJlbm9fZ3B1KGdwdSk7CisJc3RydWN0 IGE2eHhfZ3B1ICphNnh4X2dwdSA9IHRvX2E2eHhfZ3B1KGFkcmVub19ncHUpOworCWludCByZXQ7 CisKKwlyZXQgPSBhNnh4X2dtdV9yZXN1bWUoYTZ4eF9ncHUpOworCisJZ3B1LT5uZWVkc19od19p bml0ID0gdHJ1ZTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYTZ4eF9wbV9zdXNw ZW5kKHN0cnVjdCBtc21fZ3B1ICpncHUpCit7CisJc3RydWN0IGFkcmVub19ncHUgKmFkcmVub19n cHUgPSB0b19hZHJlbm9fZ3B1KGdwdSk7CisJc3RydWN0IGE2eHhfZ3B1ICphNnh4X2dwdSA9IHRv X2E2eHhfZ3B1KGFkcmVub19ncHUpOworCisJLyoKKwkgKiBNYWtlIHN1cmUgdGhlIEdNVSBpcyBp ZGxlIGJlZm9yZSBjb250aW51aW5nIChiZWNhdXNlIHNvbWUgdHJhbnNpdGlvbnMKKwkgKiBtYXkg dXNlIFZCSUYKKwkgKi8KKwlhNnh4X2dtdV93YWl0X2Zvcl9pZGxlKGE2eHhfZ3B1KTsKKworCS8q IENsZWFyIHRoZSBWQklGIHBpcGUgYmVmb3JlIHNodXR0aW5nIGRvd24gKi8KKwkvKiBGSVhNRTog VGhpcyBhY2Nlc3NlcyB0aGUgR1BVIC0gZG8gd2UgbmVlZCB0byBtYWtlIHN1cmUgaXQgaXMgb24/ ICovCisJZ3B1X3dyaXRlKGdwdSwgUkVHX0E2WFhfVkJJRl9YSU5fSEFMVF9DVFJMMCwgMHhmKTsK KwlzcGluX3VudGlsKChncHVfcmVhZChncHUsIFJFR19BNlhYX1ZCSUZfWElOX0hBTFRfQ1RSTDEp ICYgMHhmKSA9PSAweGYpOworCWdwdV93cml0ZShncHUsIFJFR19BNlhYX1ZCSUZfWElOX0hBTFRf Q1RSTDAsIDApOworCisJcmV0dXJuIGE2eHhfZ211X3N0b3AoYTZ4eF9ncHUpOworfQorCitzdGF0 aWMgaW50IGE2eHhfZ2V0X3RpbWVzdGFtcChzdHJ1Y3QgbXNtX2dwdSAqZ3B1LCB1aW50NjRfdCAq dmFsdWUpCit7CisJc3RydWN0IGFkcmVub19ncHUgKmFkcmVub19ncHUgPSB0b19hZHJlbm9fZ3B1 KGdwdSk7CisJc3RydWN0IGE2eHhfZ3B1ICphNnh4X2dwdSA9IHRvX2E2eHhfZ3B1KGFkcmVub19n cHUpOworCisJLyogRm9yY2UgdGhlIEdQVSBwb3dlciBvbiBzbyB3ZSBjYW4gcmVhZCB0aGlzIHJl Z2lzdGVyICovCisJYTZ4eF9nbXVfc2V0X29vYigmYTZ4eF9ncHUtPmdtdSwgR01VX09PQl9HUFVf U0VUKTsKKworCSp2YWx1ZSA9IGdwdV9yZWFkNjQoZ3B1LCBSRUdfQTZYWF9SQkJNX1BFUkZDVFJf Q1BfMF9MTywKKwkJUkVHX0E2WFhfUkJCTV9QRVJGQ1RSX0NQXzBfSEkpOworCisJYTZ4eF9nbXVf Y2xlYXJfb29iKCZhNnh4X2dwdS0+Z211LCBHTVVfT09CX0dQVV9TRVQpOworCXJldHVybiAwOwor fQorCisjaWZkZWYgQ09ORklHX0RFQlVHX0ZTCitzdGF0aWMgdm9pZCBhNnh4X3Nob3coc3RydWN0 IG1zbV9ncHUgKmdwdSwgc3RydWN0IHNlcV9maWxlICptKQoreworCWdwdS0+ZnVuY3MtPnBtX3Jl c3VtZShncHUpOworCisJc2VxX3ByaW50ZihtLCAic3RhdHVzOiAgICUwOHhcbiIsCisJCQlncHVf cmVhZChncHUsIFJFR19BNlhYX1JCQk1fU1RBVFVTKSk7CisJZ3B1LT5mdW5jcy0+cG1fc3VzcGVu ZChncHUpOworCisJYWRyZW5vX3Nob3coZ3B1LCBtKTsKK30KKyNlbmRpZgorCitzdGF0aWMgc3Ry dWN0IG1zbV9yaW5nYnVmZmVyICphNnh4X2FjdGl2ZV9yaW5nKHN0cnVjdCBtc21fZ3B1ICpncHUp Cit7CisJc3RydWN0IGFkcmVub19ncHUgKmFkcmVub19ncHUgPSB0b19hZHJlbm9fZ3B1KGdwdSk7 CisJc3RydWN0IGE2eHhfZ3B1ICphNnh4X2dwdSA9IHRvX2E2eHhfZ3B1KGFkcmVub19ncHUpOwor CisJcmV0dXJuIGE2eHhfZ3B1LT5jdXJfcmluZzsKK30KKworc3RhdGljIHZvaWQgYTZ4eF9kZXN0 cm95KHN0cnVjdCBtc21fZ3B1ICpncHUpCit7CisJc3RydWN0IGFkcmVub19ncHUgKmFkcmVub19n cHUgPSB0b19hZHJlbm9fZ3B1KGdwdSk7CisJc3RydWN0IGE2eHhfZ3B1ICphNnh4X2dwdSA9IHRv X2E2eHhfZ3B1KGFkcmVub19ncHUpOworCisJaWYgKGE2eHhfZ3B1LT5zcWVfYm8pIHsKKwkJaWYg KGE2eHhfZ3B1LT5zcWVfaW92YSkKKwkJCW1zbV9nZW1fcHV0X2lvdmEoYTZ4eF9ncHUtPnNxZV9i bywgZ3B1LT5hc3BhY2UpOworCQlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZV91bmxvY2tlZChh Nnh4X2dwdS0+c3FlX2JvKTsKKwl9CisKKwlhNnh4X2dtdV9yZW1vdmUoYTZ4eF9ncHUpOworCisJ YWRyZW5vX2dwdV9jbGVhbnVwKGFkcmVub19ncHUpOworCWtmcmVlKGE2eHhfZ3B1KTsKK30KKwor c3RhdGljIGNvbnN0IHN0cnVjdCBhZHJlbm9fZ3B1X2Z1bmNzIGZ1bmNzID0geworCS5iYXNlID0g eworCQkuZ2V0X3BhcmFtID0gYWRyZW5vX2dldF9wYXJhbSwKKwkJLmh3X2luaXQgPSBhNnh4X2h3 X2luaXQsCisJCS5wbV9zdXNwZW5kID0gYTZ4eF9wbV9zdXNwZW5kLAorCQkucG1fcmVzdW1lID0g YTZ4eF9wbV9yZXN1bWUsCisJCS5yZWNvdmVyID0gYTZ4eF9yZWNvdmVyLAorCQkuc3VibWl0ID0g YTZ4eF9zdWJtaXQsCisJCS5mbHVzaCA9IGE2eHhfZmx1c2gsCisJCS5hY3RpdmVfcmluZyA9IGE2 eHhfYWN0aXZlX3JpbmcsCisJCS5pcnEgPSBhNnh4X2lycSwKKwkJLmRlc3Ryb3kgPSBhNnh4X2Rl c3Ryb3ksCisjaWZkZWYgQ09ORklHX0RFQlVHX0ZTCisJCS5zaG93ID0gYTZ4eF9zaG93LAorI2Vu ZGlmCisJfSwKKwkuZ2V0X3RpbWVzdGFtcCA9IGE2eHhfZ2V0X3RpbWVzdGFtcCwKK307CisKK3N0 cnVjdCBtc21fZ3B1ICphNnh4X2dwdV9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJ c3RydWN0IG1zbV9kcm1fcHJpdmF0ZSAqcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0 IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHByaXYtPmdwdV9wZGV2OworCXN0cnVjdCBkZXZpY2Vf bm9kZSAqbm9kZTsKKwlzdHJ1Y3QgYTZ4eF9ncHUgKmE2eHhfZ3B1OworCXN0cnVjdCBhZHJlbm9f Z3B1ICphZHJlbm9fZ3B1OworCXN0cnVjdCBtc21fZ3B1ICpncHU7CisJaW50IHJldDsKKworCWE2 eHhfZ3B1ID0ga3phbGxvYyhzaXplb2YoKmE2eHhfZ3B1KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFh Nnh4X2dwdSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlhZHJlbm9fZ3B1ID0gJmE2 eHhfZ3B1LT5iYXNlOworCWdwdSA9ICZhZHJlbm9fZ3B1LT5iYXNlOworCisJYWRyZW5vX2dwdS0+ cmVnaXN0ZXJzID0gYTZ4eF9yZWdpc3RlcnM7CisJYWRyZW5vX2dwdS0+cmVnX29mZnNldHMgPSBh Nnh4X3JlZ2lzdGVyX29mZnNldHM7CisKKwlyZXQgPSBhZHJlbm9fZ3B1X2luaXQoZGV2LCBwZGV2 LCBhZHJlbm9fZ3B1LCAmZnVuY3MsIDEpOworCWlmIChyZXQpIHsKKwkJYTZ4eF9kZXN0cm95KCYo YTZ4eF9ncHUtPmJhc2UuYmFzZSkpOworCQlyZXR1cm4gRVJSX1BUUihyZXQpOworCX0KKworCS8q IENoZWNrIGlmIHRoZXJlIGlzIGEgR01VIHBoYW5kbGUgYW5kIHNldCBpdCB1cCAqLworCW5vZGUg PSBvZl9wYXJzZV9waGFuZGxlKHBkZXYtPmRldi5vZl9ub2RlLCAiZ211IiwgMCk7CisKKwkvKiBG SVhNRTogSG93IGRvIHdlIGdyYWNlZnVsbHkgaGFuZGxlIHRoaXM/ICovCisJQlVHX09OKCFub2Rl KTsKKworCXJldCA9IGE2eHhfZ211X3Byb2JlKGE2eHhfZ3B1LCBub2RlKTsKKwlpZiAocmV0KSB7 CisJCWE2eHhfZGVzdHJveSgmKGE2eHhfZ3B1LT5iYXNlLmJhc2UpKTsKKwkJcmV0dXJuIEVSUl9Q VFIocmV0KTsKKwl9CisKKwlpZiAoZ3B1LT5hc3BhY2UpCisJCW1zbV9tbXVfc2V0X2ZhdWx0X2hh bmRsZXIoZ3B1LT5hc3BhY2UtPm1tdSwgZ3B1LAorCQkJCWE2eHhfZmF1bHRfaGFuZGxlcik7CisK KwlyZXR1cm4gZ3B1OworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9hZHJlbm8v YTZ4eF9ncHUuaCBiL2RyaXZlcnMvZ3B1L2RybS9tc20vYWRyZW5vL2E2eHhfZ3B1LmgKbmV3IGZp bGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwLi5kZDY5ZTViMGU2OTIKLS0tIC9kZXYv bnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2FkcmVuby9hNnh4X2dwdS5oCkBAIC0wLDAg KzEsNjAgQEAKKy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wICovCisvKiBDb3B5 cmlnaHQgKGMpIDIwMTcgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQu ICovCisKKyNpZm5kZWYgX19BNlhYX0dQVV9IX18KKyNkZWZpbmUgX19BNlhYX0dQVV9IX18KKwor CisjaW5jbHVkZSAiYWRyZW5vX2dwdS5oIgorI2luY2x1ZGUgImE2eHgueG1sLmgiCisKKyNpbmNs dWRlICJhNnh4X2dtdS5oIgorCitleHRlcm4gYm9vbCBoYW5nX2RlYnVnOworCitzdHJ1Y3QgYTZ4 eF9ncHUgeworCXN0cnVjdCBhZHJlbm9fZ3B1IGJhc2U7CisKKwlzdHJ1Y3QgZHJtX2dlbV9vYmpl Y3QgKnNxZV9ibzsKKwl1aW50NjRfdCBzcWVfaW92YTsKKworCXN0cnVjdCBtc21fcmluZ2J1ZmZl ciAqY3VyX3Jpbmc7CisKKwlzdHJ1Y3QgYTZ4eF9nbXUgZ211OworfTsKKworI2RlZmluZSB0b19h Nnh4X2dwdSh4KSBjb250YWluZXJfb2YoeCwgc3RydWN0IGE2eHhfZ3B1LCBiYXNlKQorCisvKgor ICogR2l2ZW4gYSByZWdpc3RlciBhbmQgYSBjb3VudCwgcmV0dXJuIGEgdmFsdWUgdG8gcHJvZ3Jh bSBpbnRvCisgKiBSRUdfQ1BfUFJPVEVDVF9SRUcobikgLSB0aGlzIHdpbGwgYmxvY2sgYm90aCBy ZWFkcyBhbmQgd3JpdGVzIGZvciBfbGVuCisgKiByZWdpc3RlcnMgc3RhcnRpbmcgYXQgX3JlZy4K KyAqLworI2RlZmluZSBBNlhYX1BST1RFQ1RfUlcoX3JlZywgX2xlbikgXAorCSgoMSA8PCAzMSkg fCBcCisJKCgoX2xlbikgJiAweDNGRkYpIDw8IDE4KSB8ICgoX3JlZykgJiAweDNGRkZGKSkKKwor LyoKKyAqIFNhbWUgYXMgYWJvdmUsIGJ1dCBhbGxvdyByZWFkcyBvdmVyIHRoZSByYW5nZS4gRm9y IGFyZWFzIG9mIG1peGVkIHVzZSAoc3VjaAorICogYXMgcGVyZm9ybWFuY2UgY291bnRlcnMpIHRo aXMgYWxsb3dzIHVzIHRvIHByb3RlY3QgYSBtdWNoIGxhcmdlciByYW5nZSB3aXRoIGEKKyAqIHNp bmdsZSByZWdpc3RlcgorICovCisjZGVmaW5lIEE2WFhfUFJPVEVDVF9SRE9OTFkoX3JlZywgX2xl bikgXAorCSgoKChfbGVuKSAmIDB4M0ZGRikgPDwgMTgpIHwgKChfcmVnKSAmIDB4M0ZGRkYpKQor CisKK2ludCBhNnh4X2dtdV9yZXN1bWUoc3RydWN0IGE2eHhfZ3B1ICpncHUpOworaW50IGE2eHhf Z211X3N0b3Aoc3RydWN0IGE2eHhfZ3B1ICpncHUpOworCitpbnQgYTZ4eF9nbXVfd2FpdF9mb3Jf aWRsZShzdHJ1Y3QgYTZ4eF9ncHUgKmdwdSk7CisKK2ludCBhNnh4X2dtdV9yZXNldChzdHJ1Y3Qg YTZ4eF9ncHUgKmE2eHhfZ3B1KTsKK2Jvb2wgYTZ4eF9nbXVfaXNpZGxlKHN0cnVjdCBhNnh4X2dt dSAqZ211KTsKKworaW50IGE2eHhfZ211X3NldF9vb2Ioc3RydWN0IGE2eHhfZ211ICpnbXUsIGVu dW0gYTZ4eF9nbXVfb29iX3N0YXRlIHN0YXRlKTsKK3ZvaWQgYTZ4eF9nbXVfY2xlYXJfb29iKHN0 cnVjdCBhNnh4X2dtdSAqZ211LCBlbnVtIGE2eHhfZ211X29vYl9zdGF0ZSBzdGF0ZSk7CisKK2lu dCBhNnh4X2dtdV9wcm9iZShzdHJ1Y3QgYTZ4eF9ncHUgKmE2eHhfZ3B1LCBzdHJ1Y3QgZGV2aWNl X25vZGUgKm5vZGUpOwordm9pZCBhNnh4X2dtdV9yZW1vdmUoc3RydWN0IGE2eHhfZ3B1ICphNnh4 X2dwdSk7CisKKyNlbmRpZiAvKiBfX0E2WFhfR1BVX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVy cy9ncHUvZHJtL21zbS9hZHJlbm8vYTZ4eF9oZmkuYyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vYWRy ZW5vL2E2eHhfaGZpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwLi5k ZThjN2M0MzAxZWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2FkcmVu by9hNnh4X2hmaS5jCkBAIC0wLDAgKzEsNDM1IEBACisvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmll cjogR1BMLTIuMCAqLworLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggVGhlIExpbnV4IEZvdW5k YXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuICovCisKKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0 aW9uLmg+CisjaW5jbHVkZSA8bGludXgvY2lyY19idWYuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0 Lmg+CisKKyNpbmNsdWRlICJhNnh4X2dtdS5oIgorI2luY2x1ZGUgImE2eHhfZ211LnhtbC5oIgor CisjZGVmaW5lIEhGSV9NU0dfSUQodmFsKSBbdmFsXSA9ICN2YWwKKworc3RhdGljIGNvbnN0IGNo YXIgKiBjb25zdCBhNnh4X2hmaV9tc2dfaWRbXSA9IHsKKwlIRklfTVNHX0lEKEhGSV9IMkZfTVNH X0lOSVQpLAorCUhGSV9NU0dfSUQoSEZJX0gyRl9NU0dfRldfVkVSU0lPTiksCisJSEZJX01TR19J RChIRklfSDJGX01TR19CV19UQUJMRSksCisJSEZJX01TR19JRChIRklfSDJGX01TR19QRVJGX1RB QkxFKSwKKwlIRklfTVNHX0lEKEhGSV9IMkZfTVNHX1RFU1QpLAorfTsKKworc3RhdGljIGludCBh Nnh4X2hmaV9xdWV1ZV9yZWFkKHN0cnVjdCBhNnh4X2hmaV9xdWV1ZSAqcXVldWUsIHUzMiAqZGF0 YSwKKwkJdTMyIGR3b3JkcykKK3sKKwlzdHJ1Y3QgYTZ4eF9oZmlfcXVldWVfaGVhZGVyICpoZWFk ZXIgPSBxdWV1ZS0+aGVhZGVyOworCXUzMiBpLCBoZHIsIGluZGV4ID0gaGVhZGVyLT5yZWFkX2lu ZGV4OworCisJaWYgKGhlYWRlci0+cmVhZF9pbmRleCA9PSBoZWFkZXItPndyaXRlX2luZGV4KSB7 CisJCWhlYWRlci0+cnhfcmVxdWVzdCA9IDE7CisJCXJldHVybiAwOworCX0KKworCWhkciA9IHF1 ZXVlLT5kYXRhW2luZGV4XTsKKworCS8qCisJICogSWYgd2UgYXJlIHRvIGFzc3VtZSB0aGF0IHRo ZSBHTVUgZmlybXdhcmUgaXMgaW4gZmFjdCBhIHJhdGlvbmFsIGFjdG9yCisJICogYW5kIGlzIHBy b2dyYW1tZWQgdG8gbm90IHNlbmQgdXMgYSBsYXJnZXIgcmVzcG9uc2UgdGhhbiB3ZSBleHBlY3QK KwkgKiB0aGVuIHdlIGNhbiBhbHNvIGFzc3VtZSB0aGF0IGlmIHRoZSBoZWFkZXIgc2l6ZSBpcyB1 bmV4cGVjdGVkbHkgbGFyZ2UKKwkgKiB0aGF0IGl0IGlzIGR1ZSB0byBtZW1vcnkgY29ycnVwdGlv biBhbmQvb3IgaGFyZHdhcmUgZmFpbHVyZS4gSW4gdGhpcworCSAqIGNhc2UgdGhlIG9ubHkgcmVh c29uYWJsZSBjb3Vyc2Ugb2YgYWN0aW9uIGlzIHRvIEJVRygpIHRvIGhlbHAgaGFyZGVuCisJICog dGhlIGZhaWx1cmUuCisJICovCisKKwlCVUdfT04oSEZJX0hFQURFUl9TSVpFKGhkcikgPiBkd29y ZHMpOworCisJZm9yIChpID0gMDsgaSA8IEhGSV9IRUFERVJfU0laRShoZHIpOyBpKyspIHsKKwkJ ZGF0YVtpXSA9IHF1ZXVlLT5kYXRhW2luZGV4XTsKKwkJaW5kZXggPSAoaW5kZXggKyAxKSAlIGhl YWRlci0+c2l6ZTsKKwl9CisKKwloZWFkZXItPnJlYWRfaW5kZXggPSBpbmRleDsKKwlyZXR1cm4g SEZJX0hFQURFUl9TSVpFKGhkcik7Cit9CisKK3N0YXRpYyBpbnQgYTZ4eF9oZmlfcXVldWVfd3Jp dGUoc3RydWN0IGE2eHhfZ211ICpnbXUsCisJc3RydWN0IGE2eHhfaGZpX3F1ZXVlICpxdWV1ZSwg dTMyICpkYXRhLCB1MzIgZHdvcmRzKQoreworCXN0cnVjdCBhNnh4X2hmaV9xdWV1ZV9oZWFkZXIg KmhlYWRlciA9IHF1ZXVlLT5oZWFkZXI7CisJdTMyIGksIHNwYWNlLCBpbmRleCA9IGhlYWRlci0+ d3JpdGVfaW5kZXg7CisKKwlzcGluX2xvY2soJnF1ZXVlLT5sb2NrKTsKKworCXNwYWNlID0gQ0lS Q19TUEFDRShoZWFkZXItPndyaXRlX2luZGV4LCBoZWFkZXItPnJlYWRfaW5kZXgsCisJCWhlYWRl ci0+c2l6ZSk7CisJaWYgKHNwYWNlIDwgZHdvcmRzKSB7CisJCWhlYWRlci0+ZHJvcHBlZCsrOwor CQlzcGluX3VubG9jaygmcXVldWUtPmxvY2spOworCQlyZXR1cm4gLUVOT1NQQzsKKwl9CisKKwlm b3IgKGkgPSAwOyBpIDwgZHdvcmRzOyBpKyspIHsKKwkJcXVldWUtPmRhdGFbaW5kZXhdID0gZGF0 YVtpXTsKKwkJaW5kZXggPSAoaW5kZXggKyAxKSAlIGhlYWRlci0+c2l6ZTsKKwl9CisKKwloZWFk ZXItPndyaXRlX2luZGV4ID0gaW5kZXg7CisJc3Bpbl91bmxvY2soJnF1ZXVlLT5sb2NrKTsKKwor CWdtdV93cml0ZShnbXUsIFJFR19BNlhYX0dNVV9IT1NUMkdNVV9JTlRSX1NFVCwgMHgwMSk7CisJ cmV0dXJuIDA7Cit9CisKK3N0cnVjdCBhNnh4X2hmaV9yZXNwb25zZSB7CisJdTMyIGlkOworCXUz MiBzZXFudW07CisJc3RydWN0IGxpc3RfaGVhZCBub2RlOworCXN0cnVjdCBjb21wbGV0aW9uIGNv bXBsZXRlOworCisJdTMyIGVycm9yOworCXUzMiBwYXlsb2FkWzE2XTsKK307CisKKy8qCisgKiBJ bmNvbWluZyBIRkkgYWNrIG1lc3NhZ2VzIGNhbiBjb21lIGluIG91dCBvZiBvcmRlciBzbyB3ZSBu ZWVkIHRvIHN0b3JlIGFsbAorICogdGhlIHBlbmRpbmcgbWVzc2FnZXMgb24gYSBsaXN0IHVudGls IHRoZXkgYXJlIGhhbmRsZWQuCisgKi8KK3N0YXRpYyBzcGlubG9ja190IGhmaV9hY2tfbG9jayA9 IF9fU1BJTl9MT0NLX1VOTE9DS0VEKG1lc3NhZ2VfbG9jayk7CitzdGF0aWMgTElTVF9IRUFEKGhm aV9hY2tfbGlzdCk7CisKK3N0YXRpYyB2b2lkIGE2eHhfaGZpX2hhbmRsZV9hY2soc3RydWN0IGE2 eHhfZ211ICpnbXUsCisJCXN0cnVjdCBhNnh4X2hmaV9tc2dfcmVzcG9uc2UgKm1zZykKK3sKKwlz dHJ1Y3QgYTZ4eF9oZmlfcmVzcG9uc2UgKnJlc3A7CisJdTMyIGlkLCBzZXFudW07CisKKwkvKiBt c2ctPnJldF9oZWFkZXIgY29udGFpbnMgdGhlIGhlYWRlciBvZiB0aGUgbWVzc2FnZSBiZWluZyBh Y2tlZCAqLworCWlkID0gSEZJX0hFQURFUl9JRChtc2ctPnJldF9oZWFkZXIpOworCXNlcW51bSA9 IEhGSV9IRUFERVJfU0VRTlVNKG1zZy0+cmV0X2hlYWRlcik7CisKKwlzcGluX2xvY2soJmhmaV9h Y2tfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShyZXNwLCAmaGZpX2Fja19saXN0LCBub2Rl KSB7CisJCWlmIChyZXNwLT5pZCA9PSBpZCAmJiByZXNwLT5zZXFudW0gPT0gc2VxbnVtKSB7CisJ CQlyZXNwLT5lcnJvciA9IG1zZy0+ZXJyb3I7CisJCQltZW1jcHkocmVzcC0+cGF5bG9hZCwgbXNn LT5wYXlsb2FkLAorCQkJCXNpemVvZihyZXNwLT5wYXlsb2FkKSk7CisKKwkJCWNvbXBsZXRlKCZy ZXNwLT5jb21wbGV0ZSk7CisJCQlzcGluX3VubG9jaygmaGZpX2Fja19sb2NrKTsKKwkJCXJldHVy bjsKKwkJfQorCX0KKwlzcGluX3VubG9jaygmaGZpX2Fja19sb2NrKTsKKworCWRldl9lcnIoZ211 LT5kZXYsICJOb2JvZHkgd2FzIHdhaXRpbmcgZm9yIEhGSSBtZXNzYWdlICVkXG4iLCBzZXFudW0p OworfQorCitzdGF0aWMgdm9pZCBhNnh4X2hmaV9oYW5kbGVfZXJyb3Ioc3RydWN0IGE2eHhfZ211 ICpnbXUsCisJCXN0cnVjdCBhNnh4X2hmaV9tc2dfcmVzcG9uc2UgKm1zZykKK3sKKwlzdHJ1Y3Qg YTZ4eF9oZmlfbXNnX2Vycm9yICplcnJvciA9IChzdHJ1Y3QgYTZ4eF9oZmlfbXNnX2Vycm9yICop IG1zZzsKKworCWRldl9lcnIoZ211LT5kZXYsICJHTVUgZmlybXdhcmUgZXJyb3IgJWRcbiIsIGVy cm9yLT5jb2RlKTsKK30KKwordm9pZCBhNnh4X2hmaV90YXNrKHVuc2lnbmVkIGxvbmcgZGF0YSkK K3sKKwlzdHJ1Y3QgYTZ4eF9nbXUgKmdtdSA9IChzdHJ1Y3QgYTZ4eF9nbXUgKikgZGF0YTsKKwlz dHJ1Y3QgYTZ4eF9oZmlfcXVldWUgKnF1ZXVlID0gJmdtdS0+cXVldWVzW0hGSV9SRVNQT05TRV9R VUVVRV07CisJc3RydWN0IGE2eHhfaGZpX21zZ19yZXNwb25zZSByZXNwOworCisJZm9yICg7Oykg eworCQl1MzIgaWQ7CisJCWludCByZXQgPSBhNnh4X2hmaV9xdWV1ZV9yZWFkKHF1ZXVlLCAodTMy ICopICZyZXNwLAorCQkJc2l6ZW9mKHJlc3ApID4+IDIpOworCisJCS8qIFJldHVybnMgdGhlIG51 bWJlciBvZiBieXRlcyBjb3BpZWQgb3IgbmVnYXRpdmUgb24gZXJyb3IgKi8KKwkJaWYgKHJldCA8 PSAwKSB7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlkZXZfZXJyKGdtdS0+ZGV2LAorCQkJCQkiVW5h YmxlIHRvIHJlYWQgdGhlIEhGSSBtZXNzYWdlIHF1ZXVlXG4iKTsKKwkJCWJyZWFrOworCQl9CisK KwkJaWQgPSBIRklfSEVBREVSX0lEKHJlc3AuaGVhZGVyKTsKKworCQlpZiAoaWQgPT0gSEZJX0Yy SF9NU0dfQUNLKQorCQkJYTZ4eF9oZmlfaGFuZGxlX2FjayhnbXUsICZyZXNwKTsKKwkJZWxzZSBp ZiAoaWQgPT0gSEZJX0YySF9NU0dfRVJST1IpCisJCQlhNnh4X2hmaV9oYW5kbGVfZXJyb3IoZ211 LCAmcmVzcCk7CisJfQorfQorCitzdGF0aWMgaW50IGE2eHhfaGZpX3NlbmRfbXNnKHN0cnVjdCBh Nnh4X2dtdSAqZ211LCBpbnQgaWQsCisJCXZvaWQgKmRhdGEsIHUzMiBzaXplLCB1MzIgKnBheWxv YWQsIHUzMiBwYXlsb2FkX3NpemUpCit7CisJc3RydWN0IGE2eHhfaGZpX3F1ZXVlICpxdWV1ZSA9 ICZnbXUtPnF1ZXVlc1tIRklfQ09NTUFORF9RVUVVRV07CisJc3RydWN0IGE2eHhfaGZpX3Jlc3Bv bnNlIHJlc3AgPSB7IDAgfTsKKwlpbnQgcmV0LCBkd29yZHMgPSBzaXplID4+IDI7CisJdTMyIHNl cW51bTsKKworCXNlcW51bSA9IGF0b21pY19pbmNfcmV0dXJuKCZxdWV1ZS0+c2VxbnVtKSAlIDB4 ZmZmOworCisJLyogRmlyc3QgZHdvcmQgb2YgdGhlIG1lc3NhZ2UgaXMgdGhlIG1lc3NhZ2UgaGVh ZGVyIC0gZmlsbCBpdCBpbiAqLworCSooKHUzMiAqKSBkYXRhKSA9IChzZXFudW0gPDwgMjApIHwg KEhGSV9NU0dfQ01EIDw8IDE2KSB8CisJCShkd29yZHMgPDwgOCkgfCBpZDsKKworCWluaXRfY29t cGxldGlvbigmcmVzcC5jb21wbGV0ZSk7CisJcmVzcC5pZCA9IGlkOworCXJlc3Auc2VxbnVtID0g c2VxbnVtOworCisJc3Bpbl9sb2NrX2JoKCZoZmlfYWNrX2xvY2spOworCWxpc3RfYWRkX3RhaWwo JnJlc3Aubm9kZSwgJmhmaV9hY2tfbGlzdCk7CisJc3Bpbl91bmxvY2tfYmgoJmhmaV9hY2tfbG9j ayk7CisKKwlyZXQgPSBhNnh4X2hmaV9xdWV1ZV93cml0ZShnbXUsIHF1ZXVlLCBkYXRhLCBkd29y ZHMpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihnbXUtPmRldiwgIlVuYWJsZSB0byBzZW5kIG1l c3NhZ2UgJXMgaWQgJWRcbiIsCisJCQlhNnh4X2hmaV9tc2dfaWRbaWRdLCBzZXFudW0pOworCQln b3RvIG91dDsKKwl9CisKKwkvKiBXYWl0IHVwIHRvIDUgc2Vjb25kcyBmb3IgdGhlIHJlc3BvbnNl ICovCisJcmV0ID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZyZXNwLmNvbXBsZXRlLAor CQltc2Vjc190b19qaWZmaWVzKDUwMDApKTsKKwlpZiAoIXJldCkgeworCQlkZXZfZXJyKGdtdS0+ ZGV2LAorCQkJIk1lc3NhZ2UgJXMgaWQgJWQgdGltZWQgb3V0IHdhaXRpbmcgZm9yIHJlc3BvbnNl XG4iLAorCQkJYTZ4eF9oZmlfbXNnX2lkW2lkXSwgc2VxbnVtKTsKKwkJcmV0ID0gLUVUSU1FRE9V VDsKKwl9IGVsc2UKKwkJcmV0ID0gMDsKKworb3V0OgorCXNwaW5fbG9ja19iaCgmaGZpX2Fja19s b2NrKTsKKwlsaXN0X2RlbCgmcmVzcC5ub2RlKTsKKwlzcGluX3VubG9ja19iaCgmaGZpX2Fja19s b2NrKTsKKworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAocmVzcC5lcnJvcikgewor CQlkZXZfZXJyKGdtdS0+ZGV2LCAiTWVzc2FnZSAlcyBpZCAlZCByZXR1cm5lZCBlcnJvciAlZFxu IiwKKwkJCWE2eHhfaGZpX21zZ19pZFtpZF0sIHNlcW51bSwgcmVzcC5lcnJvcik7CisJCXJldHVy biAtRUlOVkFMOworCX0KKworCWlmIChwYXlsb2FkICYmIHBheWxvYWRfc2l6ZSkgeworCQlpbnQg Y29weSA9IG1pbl90KHUzMiwgcGF5bG9hZF9zaXplLCBzaXplb2YocmVzcC5wYXlsb2FkKSk7CisK KwkJbWVtY3B5KHBheWxvYWQsIHJlc3AucGF5bG9hZCwgY29weSk7CisJfQorCisJcmV0dXJuIDA7 Cit9CisKK3N0YXRpYyBpbnQgYTZ4eF9oZmlfc2VuZF9nbXVfaW5pdChzdHJ1Y3QgYTZ4eF9nbXUg KmdtdSwgaW50IGJvb3Rfc3RhdGUpCit7CisJc3RydWN0IGE2eHhfaGZpX21zZ19nbXVfaW5pdF9j bWQgbXNnID0geyAwIH07CisKKwltc2cuZGJnX2J1ZmZlcl9hZGRyID0gKHUzMikgZ211LT5kZWJ1 Zy0+aW92YTsKKwltc2cuZGJnX2J1ZmZlcl9zaXplID0gKHUzMikgZ211LT5kZWJ1Zy0+c2l6ZTsK Kwltc2cuYm9vdF9zdGF0ZSA9IGJvb3Rfc3RhdGU7CisKKwlyZXR1cm4gYTZ4eF9oZmlfc2VuZF9t c2coZ211LCBIRklfSDJGX01TR19JTklULCAmbXNnLCBzaXplb2YobXNnKSwKKwkJTlVMTCwgMCk7 Cit9CisKK3N0YXRpYyBpbnQgYTZ4eF9oZmlfZ2V0X2Z3X3ZlcnNpb24oc3RydWN0IGE2eHhfZ211 ICpnbXUsIHUzMiAqdmVyc2lvbikKK3sKKwlzdHJ1Y3QgYTZ4eF9oZmlfbXNnX2Z3X3ZlcnNpb24g bXNnID0geyAwIH07CisKKwkvKiBDdXJyZW50bHkgc3VwcG9ydGluZyB2ZXJzaW9uIDEuMSAqLwor CW1zZy5zdXBwb3J0ZWRfdmVyc2lvbiA9ICgxIDw8IDI4KSB8ICgxIDw8IDE2KTsKKworCXJldHVy biBhNnh4X2hmaV9zZW5kX21zZyhnbXUsIEhGSV9IMkZfTVNHX0ZXX1ZFUlNJT04sICZtc2csIHNp emVvZihtc2cpLAorCQl2ZXJzaW9uLCBzaXplb2YoKnZlcnNpb24pKTsKK30KKworc3RhdGljIGlu dCBhNnh4X2hmaV9zZW5kX3BlcmZfdGFibGUoc3RydWN0IGE2eHhfZ211ICpnbXUpCit7CisJc3Ry dWN0IGE2eHhfaGZpX21zZ19wZXJmX3RhYmxlIG1zZyA9IHsgMCB9OworCWludCBpOworCisJbXNn Lm51bV9ncHVfbGV2ZWxzID0gZ211LT5ucl9ncHVfZnJlcXM7CisJbXNnLm51bV9nbXVfbGV2ZWxz ID0gZ211LT5ucl9nbXVfZnJlcXM7CisKKwlmb3IgKGkgPSAwOyBpIDwgZ211LT5ucl9ncHVfZnJl cXM7IGkrKykgeworCQltc2cuZ3hfdm90ZXNbaV0udm90ZSA9IGdtdS0+Z3hfYXJjX3ZvdGVzW2ld OworCQltc2cuZ3hfdm90ZXNbaV0udm90ZSA9IGdtdS0+Z3B1X2ZyZXFzW2ldIC8gMTAwMDsKKwl9 CisKKwlmb3IgKGkgPSAwOyBpIDwgZ211LT5ucl9nbXVfZnJlcXM7IGkrKykgeworCQltc2cuY3hf dm90ZXNbaV0udm90ZSA9IGdtdS0+Y3hfYXJjX3ZvdGVzW2ldOworCQltc2cuY3hfdm90ZXNbaV0u dm90ZSA9IGdtdS0+Z211X2ZyZXFzW2ldIC8gMTAwMDsKKwl9CisKKwlyZXR1cm4gYTZ4eF9oZmlf c2VuZF9tc2coZ211LCBIRklfSDJGX01TR19QRVJGX1RBQkxFLCAmbXNnLCBzaXplb2YobXNnKSwK KwkJTlVMTCwgMCk7Cit9CisKK3N0YXRpYyBpbnQgYTZ4eF9oZmlfc2VuZF9id190YWJsZShzdHJ1 Y3QgYTZ4eF9nbXUgKmdtdSkKK3sKKwlzdHJ1Y3QgYTZ4eF9oZmlfbXNnX2J3X3RhYmxlIG1zZyA9 IHsgMCB9OworCisJLyoKKwkgKiBUaGUgc2RtODQ1IEdNVSBkb2Vzbid0IGRvIGJ1cyBmcmVxdWVu Y3kgc2NhbGluZyBvbiBpdHMgb3duIGJ1dCBpdAorCSAqIGRvZXMgbmVlZCBhdCBsZWFzdCBvbmUg ZW50cnkgaW4gdGhlIGxpc3QgYmVjYXVzZSBpdCBtaWdodCBiZSBhY2Nlc3NlZAorCSAqIHdoZW4g dGhlIEdNVSBpcyBzaHV0dGluZyBkb3duLiBTZW5kIGEgc2luZ2xlICJvZmYiIGVudHJ5LgorCSAq LworCisJbXNnLmJ3X2xldmVsX251bSA9IDE7CisKKwltc2cuZGRyX2NtZHNfbnVtID0gMzsKKwlt c2cuZGRyX3dhaXRfYml0bWFzayA9IDB4MDc7CisKKwltc2cuZGRyX2NtZHNfYWRkcnNbMF0gPSAw eDUwMDAwOworCW1zZy5kZHJfY21kc19hZGRyc1sxXSA9IDB4NTAwNWM7CisJbXNnLmRkcl9jbWRz X2FkZHJzWzJdID0gMHg1MDAwYzsKKworCW1zZy5kZHJfY21kc19kYXRhWzBdWzBdID0gIDB4NDAw MDAwMDA7CisJbXNnLmRkcl9jbWRzX2RhdGFbMF1bMV0gPSAgMHg0MDAwMDAwMDsKKwltc2cuZGRy X2NtZHNfZGF0YVswXVsyXSA9ICAweDQwMDAwMDAwOworCisJLyoKKwkgKiBUaGVzZSBhcmUgdGhl IENYIChDTk9DKSB2b3Rlcy4gIFRoaXMgaXMgdXNlZCBidXQgdGhlIHZhbHVlcyBmb3IgdGhlCisJ ICogc2RtODQ1IEdNVSBhcmUga25vd24gYW5kIGZpeGVkIHNvIHdlIGNhbiBoYXJkIGNvZGUgdGhl bS4KKwkgKi8KKworCW1zZy5jbm9jX2NtZHNfbnVtID0gMzsKKwltc2cuY25vY193YWl0X2JpdG1h c2sgPSAweDA1OworCisJbXNnLmNub2NfY21kc19hZGRyc1swXSA9IDB4NTAwMzQ7CisJbXNnLmNu b2NfY21kc19hZGRyc1sxXSA9IDB4NTAwN2M7CisJbXNnLmNub2NfY21kc19hZGRyc1syXSA9IDB4 NTAwNGM7CisKKwltc2cuY25vY19jbWRzX2RhdGFbMF1bMF0gPSAgMHg0MDAwMDAwMDsKKwltc2cu Y25vY19jbWRzX2RhdGFbMF1bMV0gPSAgMHgwMDAwMDAwMDsKKwltc2cuY25vY19jbWRzX2RhdGFb MF1bMl0gPSAgMHg0MDAwMDAwMDsKKworCW1zZy5jbm9jX2NtZHNfZGF0YVsxXVswXSA9ICAweDYw MDAwMDAxOworCW1zZy5jbm9jX2NtZHNfZGF0YVsxXVsxXSA9ICAweDIwMDAwMDAxOworCW1zZy5j bm9jX2NtZHNfZGF0YVsxXVsyXSA9ICAweDYwMDAwMDAxOworCisJcmV0dXJuIGE2eHhfaGZpX3Nl bmRfbXNnKGdtdSwgSEZJX0gyRl9NU0dfQldfVEFCTEUsICZtc2csIHNpemVvZihtc2cpLAorCQlO VUxMLCAwKTsKK30KKworc3RhdGljIGludCBhNnh4X2hmaV9zZW5kX3Rlc3Qoc3RydWN0IGE2eHhf Z211ICpnbXUpCit7CisJc3RydWN0IGE2eHhfaGZpX21zZ190ZXN0IG1zZyA9IHsgMCB9OworCisJ cmV0dXJuIGE2eHhfaGZpX3NlbmRfbXNnKGdtdSwgSEZJX0gyRl9NU0dfVEVTVCwgJm1zZywgc2l6 ZW9mKG1zZyksCisJCU5VTEwsIDApOworfQorCitpbnQgYTZ4eF9oZmlfc3RhcnQoc3RydWN0IGE2 eHhfZ211ICpnbXUsIGludCBib290X3N0YXRlKQoreworCWludCByZXQ7CisKKwlyZXQgPSBhNnh4 X2hmaV9zZW5kX2dtdV9pbml0KGdtdSwgYm9vdF9zdGF0ZSk7CisJaWYgKHJldCkKKwkJcmV0dXJu IHJldDsKKworCXJldCA9IGE2eHhfaGZpX2dldF9md192ZXJzaW9uKGdtdSwgTlVMTCk7CisJaWYg KHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qCisJICogV2UgaGF2ZSB0byBnZXQgZXhjaGFuZ2Ug dmVyc2lvbiBudW1iZXJzIHBlciB0aGUgc2VxdWVuY2UgYnV0IGF0IHRoaXMKKwkgKiBwb2ludCB0 aCBrZXJuZWwgZHJpdmVyIGRvZXNuJ3QgbmVlZCB0byBrbm93IHRoZSBleGFjdCB2ZXJzaW9uIG9m CisJICogdGhlIEdNVSBmaXJtd2FyZQorCSAqLworCisJcmV0ID0gYTZ4eF9oZmlfc2VuZF9wZXJm X3RhYmxlKGdtdSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGE2eHhfaGZp X3NlbmRfYndfdGFibGUoZ211KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyoKKwkg KiBMZXQgdGhlIEdNVSBrbm93IHRoYXQgdGhlcmUgd29uJ3QgYmUgYW55IG1vcmUgSEZJIG1lc3Nh Z2VzIHVudGlsIG5leHQKKwkgKiBib290CisJICovCisJYTZ4eF9oZmlfc2VuZF90ZXN0KGdtdSk7 CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBhNnh4X2hmaV9zdG9wKHN0cnVjdCBhNnh4X2dtdSAq Z211KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZ211LT5xdWV1 ZXMpOyBpKyspIHsKKwkJc3RydWN0IGE2eHhfaGZpX3F1ZXVlICpxdWV1ZSA9ICZnbXUtPnF1ZXVl c1tpXTsKKworCQlpZiAoIXF1ZXVlLT5oZWFkZXIpCisJCQljb250aW51ZTsKKworCQlpZiAocXVl dWUtPmhlYWRlci0+cmVhZF9pbmRleCAhPSBxdWV1ZS0+aGVhZGVyLT53cml0ZV9pbmRleCkKKwkJ CWRldl9lcnIoZ211LT5kZXYsICJIRkkgcXVldWUgJWQgaXMgbm90IGVtcHR5XG4iLCBpKTsKKwor CQlxdWV1ZS0+aGVhZGVyLT5yZWFkX2luZGV4ID0gMDsKKwkJcXVldWUtPmhlYWRlci0+d3JpdGVf aW5kZXggPSAwOworCX0KK30KKworc3RhdGljIHZvaWQgYTZ4eF9oZmlfcXVldWVfaW5pdChzdHJ1 Y3QgYTZ4eF9oZmlfcXVldWUgKnF1ZXVlLAorCQlzdHJ1Y3QgYTZ4eF9oZmlfcXVldWVfaGVhZGVy ICpoZWFkZXIsIHZvaWQgKnZpcnQsIHU2NCBpb3ZhLAorCQl1MzIgaWQpCit7CisJc3Bpbl9sb2Nr X2luaXQoJnF1ZXVlLT5sb2NrKTsKKwlxdWV1ZS0+aGVhZGVyID0gaGVhZGVyOworCXF1ZXVlLT5k YXRhID0gdmlydDsKKwlhdG9taWNfc2V0KCZxdWV1ZS0+c2VxbnVtLCAwKTsKKworCS8qIFNldCB1 cCB0aGUgc2hhcmVkIG1lbW9yeSBoZWFkZXIgKi8KKwloZWFkZXItPmlvdmEgPSBpb3ZhOworCWhl YWRlci0+dHlwZSA9ICAxMCA8PCA4IHwgaWQ7CisJaGVhZGVyLT5zdGF0dXMgPSAxOworCWhlYWRl ci0+c2l6ZSA9IFNaXzRLID4+IDI7CisJaGVhZGVyLT5tc2dfc2l6ZSA9IDA7CisJaGVhZGVyLT5k cm9wcGVkID0gMDsKKwloZWFkZXItPnJ4X3dhdGVybWFyayA9IDE7CisJaGVhZGVyLT50eF93YXRl cm1hcmsgPSAxOworCWhlYWRlci0+cnhfcmVxdWVzdCA9IDE7CisJaGVhZGVyLT50eF9yZXF1ZXN0 ID0gMDsKKwloZWFkZXItPnJlYWRfaW5kZXggPSAwOworCWhlYWRlci0+d3JpdGVfaW5kZXggPSAw OworfQorCit2b2lkIGE2eHhfaGZpX2luaXQoc3RydWN0IGE2eHhfZ211ICpnbXUpCit7CisJc3Ry dWN0IGE2eHhfZ211X2JvICpoZmkgPSBnbXUtPmhmaTsKKwlzdHJ1Y3QgYTZ4eF9oZmlfcXVldWVf dGFibGVfaGVhZGVyICp0YWJsZSA9IGhmaS0+dmlydDsKKwlzdHJ1Y3QgYTZ4eF9oZmlfcXVldWVf aGVhZGVyICpoZWFkZXJzID0gaGZpLT52aXJ0ICsgc2l6ZW9mKCp0YWJsZSk7CisJdTY0IG9mZnNl dDsKKwlpbnQgdGFibGVfc2l6ZTsKKworCS8qCisJICogVGhlIHRhYmxlIHNpemUgaXMgdGhlIHNp emUgb2YgdGhlIHRhYmxlIGhlYWRlciBwbHVzIGFsbCBvZiB0aGUgcXVldWUKKwkgKiBoZWFkZXJz CisJICovCisJdGFibGVfc2l6ZSA9IHNpemVvZigqdGFibGUpOworCXRhYmxlX3NpemUgKz0gKEFS UkFZX1NJWkUoZ211LT5xdWV1ZXMpICoKKwkJc2l6ZW9mKHN0cnVjdCBhNnh4X2hmaV9xdWV1ZV9o ZWFkZXIpKTsKKworCXRhYmxlLT52ZXJzaW9uID0gMDsKKwl0YWJsZS0+c2l6ZSA9IHRhYmxlX3Np emU7CisJLyogRmlyc3QgcXVldWUgaGVhZGVyIGlzIGxvY2F0ZWQgaW1tZWRpYXRlbHkgYWZ0ZXIg dGhlIHRhYmxlIGhlYWRlciAqLworCXRhYmxlLT5xaGRyMF9vZmZzZXQgPSBzaXplb2YoKnRhYmxl KSA+PiAyOworCXRhYmxlLT5xaGRyX3NpemUgPSBzaXplb2Yoc3RydWN0IGE2eHhfaGZpX3F1ZXVl X2hlYWRlcikgPj4gMjsKKwl0YWJsZS0+bnVtX3F1ZXVlcyA9IEFSUkFZX1NJWkUoZ211LT5xdWV1 ZXMpOworCXRhYmxlLT5hY3RpdmVfcXVldWVzID0gQVJSQVlfU0laRShnbXUtPnF1ZXVlcyk7CisK KwkvKiBDb21tYW5kIHF1ZXVlICovCisJb2Zmc2V0ID0gU1pfNEs7CisJYTZ4eF9oZmlfcXVldWVf aW5pdCgmZ211LT5xdWV1ZXNbMF0sICZoZWFkZXJzWzBdLCBoZmktPnZpcnQgKyBvZmZzZXQsCisJ CWhmaS0+aW92YSArIG9mZnNldCwgMCk7CisKKwkvKiBHTVUgcmVzcG9uc2UgcXVldWUgKi8KKwlv ZmZzZXQgKz0gU1pfNEs7CisJYTZ4eF9oZmlfcXVldWVfaW5pdCgmZ211LT5xdWV1ZXNbMV0sICZo ZWFkZXJzWzFdLCBoZmktPnZpcnQgKyBvZmZzZXQsCisJCWhmaS0+aW92YSArIG9mZnNldCwgNCk7 Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL2FkcmVuby9hNnh4X2hmaS5oIGIv ZHJpdmVycy9ncHUvZHJtL21zbS9hZHJlbm8vYTZ4eF9oZmkuaApuZXcgZmlsZSBtb2RlIDEwMDY0 NAppbmRleCAwMDAwMDAwMDAwMDAuLjYwZDEzMTlmYTQ0ZgotLS0gL2Rldi9udWxsCisrKyBiL2Ry aXZlcnMvZ3B1L2RybS9tc20vYWRyZW5vL2E2eHhfaGZpLmgKQEAgLTAsMCArMSwxMjcgQEAKKy8q IFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wICovCisvKiBDb3B5cmlnaHQgKGMpIDIw MTcgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuICovCisKKyNpZm5k ZWYgX0E2WFhfSEZJX0hfCisjZGVmaW5lIF9BNlhYX0hGSV9IXworCitzdHJ1Y3QgYTZ4eF9oZmlf cXVldWVfdGFibGVfaGVhZGVyIHsKKwl1MzIgdmVyc2lvbjsKKwl1MzIgc2l6ZTsJCS8qIFNpemUg b2YgdGhlIHF1ZXVlIHRhYmxlIGluIGR3b3JkcyAqLworCXUzMiBxaGRyMF9vZmZzZXQ7CS8qIE9m ZnNldCBvZiB0aGUgZmlyc3QgcXVldWUgaGVhZGVyICovCisJdTMyIHFoZHJfc2l6ZTsJCS8qIFNp emUgb2YgdGhlIHF1ZXVlIGhlYWRlcnMgKi8KKwl1MzIgbnVtX3F1ZXVlczsJCS8qIE51bWJlciBv ZiB0b3RhbCBxdWV1ZXMgKi8KKwl1MzIgYWN0aXZlX3F1ZXVlczsJLyogTnVtYmVyIG9mIGFjdGl2 ZSBxdWV1ZXMgKi8KK307CisKK3N0cnVjdCBhNnh4X2hmaV9xdWV1ZV9oZWFkZXIgeworCXUzMiBz dGF0dXM7CisJdTMyIGlvdmE7CisJdTMyIHR5cGU7CisJdTMyIHNpemU7CisJdTMyIG1zZ19zaXpl OworCXUzMiBkcm9wcGVkOworCXUzMiByeF93YXRlcm1hcms7CisJdTMyIHR4X3dhdGVybWFyazsK Kwl1MzIgcnhfcmVxdWVzdDsKKwl1MzIgdHhfcmVxdWVzdDsKKwl1MzIgcmVhZF9pbmRleDsKKwl1 MzIgd3JpdGVfaW5kZXg7Cit9OworCitzdHJ1Y3QgYTZ4eF9oZmlfcXVldWUgeworCXN0cnVjdCBh Nnh4X2hmaV9xdWV1ZV9oZWFkZXIgKmhlYWRlcjsKKwlzcGlubG9ja190IGxvY2s7CisJdTMyICpk YXRhOworCWF0b21pY190IHNlcW51bTsKK307CisKKy8qIFRoaXMgaXMgdGhlIG91dGdvaW5nIHF1 ZXVlIHRvIHRoZSBHTVUgKi8KKyNkZWZpbmUgSEZJX0NPTU1BTkRfUVVFVUUgMAorCisvKiBUSGlz IGlzIHRoZSBpbmNvbWluZyByZXNwb25zZSBxdWV1ZSBmcm9tIHRoZSBHTVUgKi8KKyNkZWZpbmUg SEZJX1JFU1BPTlNFX1FVRVVFIDEKKworI2RlZmluZSBIRklfSEVBREVSX0lEKG1zZykgKChtc2cp ICYgMHhmZikKKyNkZWZpbmUgSEZJX0hFQURFUl9TSVpFKG1zZykgKCgobXNnKSA+PiA4KSAmIDB4 ZmYpCisjZGVmaW5lIEhGSV9IRUFERVJfU0VRTlVNKG1zZykgKCgobXNnKSA+PiAyMCkgJiAweGZm ZikKKworLyogRklYTUU6IERvIHdlIG5lZWQgdGhpcyBvciBjYW4gd2UgdXNlIEFSUkFZX1NJWkU/ ICovCisjZGVmaW5lIEhGSV9SRVNQT05TRV9QQVlMT0FEX1NJWkUgMTYKKworLyogSEZJIG1lc3Nh Z2UgdHlwZXMgKi8KKworI2RlZmluZSBIRklfTVNHX0NNRCAwCisjZGVmaW5lIEhGSV9NU0dfQUNL IDIKKworI2RlZmluZSBIRklfRjJIX01TR19BQ0sgMTI2CisKK3N0cnVjdCBhNnh4X2hmaV9tc2df cmVzcG9uc2UgeworCXUzMiBoZWFkZXI7CisJdTMyIHJldF9oZWFkZXI7CisJdTMyIGVycm9yOwor CXUzMiBwYXlsb2FkW0hGSV9SRVNQT05TRV9QQVlMT0FEX1NJWkVdOworfTsKKworI2RlZmluZSBI RklfRjJIX01TR19FUlJPUiAxMDAKKworc3RydWN0IGE2eHhfaGZpX21zZ19lcnJvciB7CisJdTMy IGhlYWRlcjsKKwl1MzIgY29kZTsKKwl1MzIgcGF5bG9hZFsyXTsKK307CisKKyNkZWZpbmUgSEZJ X0gyRl9NU0dfSU5JVCAwCisKK3N0cnVjdCBhNnh4X2hmaV9tc2dfZ211X2luaXRfY21kIHsKKwl1 MzIgaGVhZGVyOworCXUzMiBzZWdfaWQ7CisJdTMyIGRiZ19idWZmZXJfYWRkcjsKKwl1MzIgZGJn X2J1ZmZlcl9zaXplOworCXUzMiBib290X3N0YXRlOworfTsKKworI2RlZmluZSBIRklfSDJGX01T R19GV19WRVJTSU9OIDEKKworc3RydWN0IGE2eHhfaGZpX21zZ19md192ZXJzaW9uIHsKKwl1MzIg aGVhZGVyOworCXUzMiBzdXBwb3J0ZWRfdmVyc2lvbjsKK307CisKKyNkZWZpbmUgSEZJX0gyRl9N U0dfUEVSRl9UQUJMRSA0CisKK3N0cnVjdCBwZXJmX2xldmVsIHsKKwl1MzIgdm90ZTsKKwl1MzIg ZnJlcTsKK307CisKK3N0cnVjdCBhNnh4X2hmaV9tc2dfcGVyZl90YWJsZSB7CisJdTMyIGhlYWRl cjsKKwl1MzIgbnVtX2dwdV9sZXZlbHM7CisJdTMyIG51bV9nbXVfbGV2ZWxzOworCisJc3RydWN0 IHBlcmZfbGV2ZWwgZ3hfdm90ZXNbMTZdOworCXN0cnVjdCBwZXJmX2xldmVsIGN4X3ZvdGVzWzRd OworfTsKKworI2RlZmluZSBIRklfSDJGX01TR19CV19UQUJMRSAzCisKK3N0cnVjdCBhNnh4X2hm aV9tc2dfYndfdGFibGUgeworCXUzMiBoZWFkZXI7CisJdTMyIGJ3X2xldmVsX251bTsKKwl1MzIg Y25vY19jbWRzX251bTsKKwl1MzIgZGRyX2NtZHNfbnVtOworCXUzMiBjbm9jX3dhaXRfYml0bWFz azsKKwl1MzIgZGRyX3dhaXRfYml0bWFzazsKKwl1MzIgY25vY19jbWRzX2FkZHJzWzZdOworCXUz MiBjbm9jX2NtZHNfZGF0YVsyXVs2XTsKKwl1MzIgZGRyX2NtZHNfYWRkcnNbOF07CisJdTMyIGRk cl9jbWRzX2RhdGFbMTZdWzhdOworfTsKKworI2RlZmluZSBIRklfSDJGX01TR19URVNUIDUKKwor c3RydWN0IGE2eHhfaGZpX21zZ190ZXN0IHsKKwl1MzIgaGVhZGVyOworfTsKKworI2VuZGlmCmRp ZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL2FkcmVuby9hZHJlbm9fZGV2aWNlLmMgYi9k cml2ZXJzL2dwdS9kcm0vbXNtL2FkcmVuby9hZHJlbm9fZGV2aWNlLmMKaW5kZXggOGUwY2IxNjE3 NTRiLi5hMDc0MjJhYTZiZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tc20vYWRyZW5v L2FkcmVub19kZXZpY2UuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2FkcmVuby9hZHJlbm9f ZGV2aWNlLmMKQEAgLTEwMCw2ICsxMDAsMTYgQEAgc3RhdGljIGNvbnN0IHN0cnVjdCBhZHJlbm9f aW5mbyBncHVsaXN0W10gPSB7CiAJCQlBRFJFTk9fUVVJUktfRkFVTFRfREVURUNUX01BU0ssCiAJ CS5pbml0ID0gYTV4eF9ncHVfaW5pdCwKIAkJLnphcGZ3ID0gImE1MzBfemFwLm1kdCIsCisJfSwg eworCQkucmV2ID0gQURSRU5PX1JFVig2LCAzLCAwLCBBTllfSUQpLAorCQkucmV2biA9IDYzMCwK KwkJLm5hbWUgPSAiQTYzMCIsCisJCS5mdyA9IHsKKwkJCVtBRFJFTk9fRldfU1FFXSA9ICJhNjMw X3NxZS5mdyIsCisJCQlbQURSRU5PX0ZXX0dNVV0gPSAiYTYzMF9nbXUuYmluIiwKKwkJfSwKKwkJ LmdtZW0gPSBTWl8xTSwKKwkJLmluaXQgPSBhNnh4X2dwdV9pbml0LAogCX0sCiB9OwogCkBAIC0x MTYsNiArMTI2LDggQEAgTU9EVUxFX0ZJUk1XQVJFKCJxY29tL2E1MzBfemFwLm1kdCIpOwogTU9E VUxFX0ZJUk1XQVJFKCJxY29tL2E1MzBfemFwLmIwMCIpOwogTU9EVUxFX0ZJUk1XQVJFKCJxY29t L2E1MzBfemFwLmIwMSIpOwogTU9EVUxFX0ZJUk1XQVJFKCJxY29tL2E1MzBfemFwLmIwMiIpOwor TU9EVUxFX0ZJUk1XQVJFKCJxY29tL2E2MzBfc3FlLmZ3Iik7CitNT0RVTEVfRklSTVdBUkUoInFj b20vYTYzMF9nbXUuYmluIik7CiAKIHN0YXRpYyBpbmxpbmUgYm9vbCBfcmV2X21hdGNoKHVpbnQ4 X3QgZW50cnksIHVpbnQ4X3QgaWQpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNt L2FkcmVuby9hZHJlbm9fZ3B1LmMgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2FkcmVuby9hZHJlbm9f Z3B1LmMKaW5kZXggMTdkMDUwNmQwNThjLi41YzFhMjg4MTQ5ZjMgMTAwNjQ0Ci0tLSBhL2RyaXZl cnMvZ3B1L2RybS9tc20vYWRyZW5vL2FkcmVub19ncHUuYworKysgYi9kcml2ZXJzL2dwdS9kcm0v bXNtL2FkcmVuby9hZHJlbm9fZ3B1LmMKQEAgLTEzOCw3ICsxMzgsNyBAQCBhZHJlbm9fcmVxdWVz dF9mdyhzdHJ1Y3QgYWRyZW5vX2dwdSAqYWRyZW5vX2dwdSwgY29uc3QgY2hhciAqZnduYW1lKQog CXJldHVybiBFUlJfUFRSKC1FTk9FTlQpOwogfQogCi1zdGF0aWMgaW50IGFkcmVub19sb2FkX2Z3 KHN0cnVjdCBhZHJlbm9fZ3B1ICphZHJlbm9fZ3B1KQoraW50IGFkcmVub19sb2FkX2Z3KHN0cnVj dCBhZHJlbm9fZ3B1ICphZHJlbm9fZ3B1KQogewogCWludCBpOwogCmRpZmYgLS1naXQgYS9kcml2 ZXJzL2dwdS9kcm0vbXNtL2FkcmVuby9hZHJlbm9fZ3B1LmggYi9kcml2ZXJzL2dwdS9kcm0vbXNt L2FkcmVuby9hZHJlbm9fZ3B1LmgKaW5kZXggZDZiMGU3YjgxM2Y0Li45NDc2NGQwMDFhNTEgMTAw NjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tc20vYWRyZW5vL2FkcmVub19ncHUuaAorKysgYi9k cml2ZXJzL2dwdS9kcm0vbXNtL2FkcmVuby9hZHJlbm9fZ3B1LmgKQEAgLTUwLDcgKzUwLDkgQEAg ZW51bSBhZHJlbm9fcmVncyB7CiAKIGVudW0gewogCUFEUkVOT19GV19QTTQgPSAwLAorCUFEUkVO T19GV19TUUUgPSAwLCAvKiBhNnh4ICovCiAJQURSRU5PX0ZXX1BGUCA9IDEsCisJQURSRU5PX0ZX X0dNVSA9IDEsIC8qIGE2eHggKi8KIAlBRFJFTk9fRldfR1BNVSA9IDIsCiAJQURSRU5PX0ZXX01B WCwKIH07CkBAIC0xNTEsNyArMTUzLDYgQEAgc3RydWN0IGFkcmVub19wbGF0Zm9ybV9jb25maWcg ewogCV9fcmV0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwK IH0pCiAKLQogc3RhdGljIGlubGluZSBib29sIGFkcmVub19pc19hM3h4KHN0cnVjdCBhZHJlbm9f Z3B1ICpncHUpCiB7CiAJcmV0dXJuIChncHUtPnJldm4gPj0gMzAwKSAmJiAoZ3B1LT5yZXZuIDwg NDAwKTsKQEAgLTIyNiw2ICsyMjcsNyBAQCBpbnQgYWRyZW5vX2dwdV9pbml0KHN0cnVjdCBkcm1f ZGV2aWNlICpkcm0sIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCiAJCXN0cnVjdCBhZHJl bm9fZ3B1ICpncHUsIGNvbnN0IHN0cnVjdCBhZHJlbm9fZ3B1X2Z1bmNzICpmdW5jcywKIAkJaW50 IG5yX3JpbmdzKTsKIHZvaWQgYWRyZW5vX2dwdV9jbGVhbnVwKHN0cnVjdCBhZHJlbm9fZ3B1ICpn cHUpOworaW50IGFkcmVub19sb2FkX2Z3KHN0cnVjdCBhZHJlbm9fZ3B1ICphZHJlbm9fZ3B1KTsK IAogCiAvKiByaW5nYnVmZmVyIGhlbHBlcnMgKHRoZSBwYXJ0cyB0aGF0IGFyZSBhZHJlbm8gc3Bl Y2lmaWMpICovCkBAIC0zMjgsNiArMzMwLDcgQEAgc3RhdGljIGlubGluZSB2b2lkIGFkcmVub19n cHVfd3JpdGUoc3RydWN0IGFkcmVub19ncHUgKmdwdSwKIHN0cnVjdCBtc21fZ3B1ICphM3h4X2dw dV9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogc3RydWN0IG1zbV9ncHUgKmE0eHhfZ3B1 X2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiBzdHJ1Y3QgbXNtX2dwdSAqYTV4eF9ncHVf aW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK3N0cnVjdCBtc21fZ3B1ICphNnh4X2dwdV9p bml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogCiBzdGF0aWMgaW5saW5lIHZvaWQgYWRyZW5v X2dwdV93cml0ZTY0KHN0cnVjdCBhZHJlbm9fZ3B1ICpncHUsCiAJCWVudW0gYWRyZW5vX3JlZ3Mg bG8sIGVudW0gYWRyZW5vX3JlZ3MgaGksIHU2NCBkYXRhKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9n cHUvZHJtL21zbS9tc21fZ3B1LmMgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL21zbV9ncHUuYwppbmRl eCAxYzA5YWNmYjQwMjguLjBkMDJlMTk3ZjhiYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJt L21zbS9tc21fZ3B1LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9tc21fZ3B1LmMKQEAgLTg3 LDcgKzg3LDcgQEAgc3RhdGljIHN0cnVjdCBkZXZmcmVxX2Rldl9wcm9maWxlIG1zbV9kZXZmcmVx X3Byb2ZpbGUgPSB7CiBzdGF0aWMgdm9pZCBtc21fZGV2ZnJlcV9pbml0KHN0cnVjdCBtc21fZ3B1 ICpncHUpCiB7CiAJLyogV2UgbmVlZCB0YXJnZXQgc3VwcG9ydCB0byBkbyBkZXZmcmVxICovCi0J aWYgKCFncHUtPmZ1bmNzLT5ncHVfYnVzeSkKKwlpZiAoIWdwdS0+ZnVuY3MtPmdwdV9idXN5IHx8 ICFncHUtPmNvcmVfY2xrKQogCQlyZXR1cm47CiAKIAltc21fZGV2ZnJlcV9wcm9maWxlLmluaXRp YWxfZnJlcSA9IGdwdS0+ZmFzdF9yYXRlOwotLSAKMi4xNi4xCgpfX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fXwpkcmktZGV2ZWwgbWFpbGluZyBsaXN0CmRyaS1k ZXZlbEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcv bWFpbG1hbi9saXN0aW5mby9kcmktZGV2ZWwK