From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jordan Crouse Subject: [PATCH 2/2] drm/msm: Add A6XX device support Date: Fri, 16 Mar 2018 12:08:50 -0600 Message-ID: <20180316180850.15376-3-jcrouse@codeaurora.org> References: <20180316180850.15376-1-jcrouse@codeaurora.org> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <20180316180850.15376-1-jcrouse-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: freedreno-bounces-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org Sender: "Freedreno" To: freedreno-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org Cc: linux-arm-msm-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org List-Id: linux-arm-msm@vger.kernel.org QWRkIHN1cHBvcnQgZm9yIHRoZSBBNlhYIGZhbWlseSBvZiBBZHJlbm8gR1BVcy4gVGhlIGJpZ2dl c3QgYWRkaXRpb24KaXMgdGhlIEdNVSAoR3JhcGhpY3MgTWFuYWdlbWVudCBVbml0KSB3aGljaCB0 YWtlcyBvdmVyIG1vc3Qgb2YgdGhlCnBvd2VyIG1hbmFnZW1lbnQgb2YgdGhlIEdQVSBpdHNlbGYg YnV0IGluIGEgaXJvbmljIHR3aXN0IG9mIGZhdGUKbmVlZHMgYSBnb29kbHkgYW1vdW50IG9mIG1h bmFnZW1lbnQgaXRzZWxmLiAgQWRkIHN1cHBvcnQgZm9yIHRoZQpBNlhYIGNvcmUgY29kZSwgdGhl IEdNVSBhbmQgdGhlIEhGSSAoaGFyZHdhcmUgZmlybXdhcmUgaW50ZXJmYWNlKQpxdWV1ZSB0aGF0 IHRoZSBDUFUgdXNlcyB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBHTVUuCgpTaWduZWQtb2ZmLWJ5 OiBKb3JkYW4gQ3JvdXNlIDxqY3JvdXNlQGNvZGVhdXJvcmEub3JnPgotLS0KIGRyaXZlcnMvZ3B1 L2RybS9tc20vTWFrZWZpbGUgICAgICAgICAgICAgICB8ICAgIDMgKwogZHJpdmVycy9ncHUvZHJt L21zbS9hZHJlbm8vYTZ4eF9nbXUuYyAgICAgIHwgMTIyNSArKysrKysrKysrKysrKysrKysrKysr KysrKysrCiBkcml2ZXJzL2dwdS9kcm0vbXNtL2FkcmVuby9hNnh4X2dtdS5oICAgICAgfCAgMTYy ICsrKysKIGRyaXZlcnMvZ3B1L2RybS9tc20vYWRyZW5vL2E2eHhfZ3B1LmMgICAgICB8ICA4MDgg KysrKysrKysrKysrKysrKysrCiBkcml2ZXJzL2dwdS9kcm0vbXNtL2FkcmVuby9hNnh4X2dwdS5o ICAgICAgfCAgIDYwICsrCiBkcml2ZXJzL2dwdS9kcm0vbXNtL2FkcmVuby9hNnh4X2hmaS5jICAg ICAgfCAgNDM1ICsrKysrKysrKysKIGRyaXZlcnMvZ3B1L2RybS9tc20vYWRyZW5vL2E2eHhfaGZp LmggICAgICB8ICAxMjcgKysrCiBkcml2ZXJzL2dwdS9kcm0vbXNtL2FkcmVuby9hZHJlbm9fZGV2 aWNlLmMgfCAgIDEyICsKIGRyaXZlcnMvZ3B1L2RybS9tc20vYWRyZW5vL2FkcmVub19ncHUuYyAg ICB8ICAgIDIgKy0KIGRyaXZlcnMvZ3B1L2RybS9tc20vYWRyZW5vL2FkcmVub19ncHUuaCAgICB8 ICAgIDUgKy0KIGRyaXZlcnMvZ3B1L2RybS9tc20vbXNtX2dwdS5jICAgICAgICAgICAgICB8ICAg IDIgKy0KIDExIGZpbGVzIGNoYW5nZWQsIDI4MzggaW5zZXJ0aW9ucygrKSwgMyBkZWxldGlvbnMo LSkKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dwdS9kcm0vbXNtL2FkcmVuby9hNnh4X2dt dS5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL21zbS9hZHJlbm8vYTZ4eF9n bXUuaAogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1L2RybS9tc20vYWRyZW5vL2E2eHhf Z3B1LmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dwdS9kcm0vbXNtL2FkcmVuby9hNnh4 X2dwdS5oCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL21zbS9hZHJlbm8vYTZ4 eF9oZmkuYwogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1L2RybS9tc20vYWRyZW5vL2E2 eHhfaGZpLmgKCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL01ha2VmaWxlIGIvZHJp dmVycy9ncHUvZHJtL21zbS9NYWtlZmlsZQppbmRleCBjZDQwYzA1MGIyZDcuLjRhZmZjNjY1YzBk ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL21zbS9NYWtlZmlsZQorKysgYi9kcml2ZXJz L2dwdS9kcm0vbXNtL01ha2VmaWxlCkBAIC0xMCw2ICsxMCw5IEBAIG1zbS15IDo9IFwKIAlhZHJl bm8vYTV4eF9ncHUubyBcCiAJYWRyZW5vL2E1eHhfcG93ZXIubyBcCiAJYWRyZW5vL2E1eHhfcHJl ZW1wdC5vIFwKKwlhZHJlbm8vYTZ4eF9ncHUubyBcCisJYWRyZW5vL2E2eHhfZ211Lm8gXAorCWFk cmVuby9hNnh4X2hmaS5vIFwKIAloZG1pL2hkbWkubyBcCiAJaGRtaS9oZG1pX2F1ZGlvLm8gXAog CWhkbWkvaGRtaV9icmlkZ2UubyBcCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL2Fk cmVuby9hNnh4X2dtdS5jIGIvZHJpdmVycy9ncHUvZHJtL21zbS9hZHJlbm8vYTZ4eF9nbXUuYwpu ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAuLjlkNzJmNWE2ZDJiYQotLS0g L2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vYWRyZW5vL2E2eHhfZ211LmMKQEAg LTAsMCArMSwxMjI1IEBACisvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCAqLwor LyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdo dHMgcmVzZXJ2ZWQuICovCisKKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51 eC9pb3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9vcHAuaD4KKyNpbmNsdWRlIDxzb2MvcWNv bS9jbWQtZGIuaD4KKworI2luY2x1ZGUgImE2eHhfZ3B1LmgiCisjaW5jbHVkZSAiYTZ4eF9nbXUu eG1sLmgiCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBhNnh4X2dtdV9pcnEoaW50IGlycSwgdm9pZCAq ZGF0YSkKK3sKKwlzdHJ1Y3QgYTZ4eF9nbXUgKmdtdSA9IGRhdGE7CisJdTMyIHN0YXR1czsKKwor CXN0YXR1cyA9IGdtdV9yZWFkKGdtdSwgUkVHX0E2WFhfR01VX0FPX0hPU1RfSU5URVJSVVBUX1NU QVRVUyk7CisJZ211X3dyaXRlKGdtdSwgUkVHX0E2WFhfR01VX0FPX0hPU1RfSU5URVJSVVBUX0NM Uiwgc3RhdHVzKTsKKworCWlmIChzdGF0dXMgJiBBNlhYX0dNVV9BT19IT1NUX0lOVEVSUlVQVF9T VEFUVVNfV0RPR19CSVRFKSB7CisJCWRldl9lcnJfcmF0ZWxpbWl0ZWQoZ211LT5kZXYsICJHTVUg d2F0Y2hkb2cgZXhwaXJlZFxuIik7CisKKwkJLyogVGVtcG9yYXJ5IHVudGlsIHdlIGNhbiByZWNv dmVyIHNhZmVseSAqLworCQlCVUcoKTsKKwl9CisKKwlpZiAoc3RhdHVzICYgIEE2WFhfR01VX0FP X0hPU1RfSU5URVJSVVBUX1NUQVRVU19IT1NUX0FIQl9CVVNfRVJST1IpCisJCWRldl9lcnJfcmF0 ZWxpbWl0ZWQoZ211LT5kZXYsICJHTVUgQUhCIGJ1cyBlcnJvclxuIik7CisKKwlpZiAoc3RhdHVz ICYgQTZYWF9HTVVfQU9fSE9TVF9JTlRFUlJVUFRfU1RBVFVTX0ZFTkNFX0VSUikKKwkJZGV2X2Vy cl9yYXRlbGltaXRlZChnbXUtPmRldiwgIkdNVSBmZW5jZSBlcnJvcjogMHgleFxuIiwKKwkJCWdt dV9yZWFkKGdtdSwgUkVHX0E2WFhfR01VX0FIQl9GRU5DRV9TVEFUVVMpKTsKKworCXJldHVybiBJ UlFfSEFORExFRDsKK30KKworc3RhdGljIGlycXJldHVybl90IGE2eHhfaGZpX2lycShpbnQgaXJx LCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBhNnh4X2dtdSAqZ211ID0gZGF0YTsKKwl1MzIgc3Rh dHVzOworCisJc3RhdHVzID0gZ211X3JlYWQoZ211LCBSRUdfQTZYWF9HTVVfR01VMkhPU1RfSU5U Ul9JTkZPKTsKKwlnbXVfd3JpdGUoZ211LCBSRUdfQTZYWF9HTVVfR01VMkhPU1RfSU5UUl9DTFIs IHN0YXR1cyk7CisKKwlpZiAoc3RhdHVzICYgQTZYWF9HTVVfR01VMkhPU1RfSU5UUl9JTkZPX01T R1EpCisJCXRhc2tsZXRfc2NoZWR1bGUoJmdtdS0+aGZpX3Rhc2tsZXQpOworCisJaWYgKHN0YXR1 cyAmIEE2WFhfR01VX0dNVTJIT1NUX0lOVFJfSU5GT19DTTNfRkFVTFQpIHsKKwkJZGV2X2Vycl9y YXRlbGltaXRlZChnbXUtPmRldiwgIkdNVSBmaXJtd2FyZSBmYXVsdFxuIik7CisKKwkJLyogVGVt cG9yYXJ5IHVudGlsIHdlIGNhbiByZWNvdmVyIHNhZmVseSAqLworCQlCVUcoKTsKKwl9CisKKwly ZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qIENoZWNrIHRvIHNlZSBpZiB0aGUgR1ggcmFpbCBp cyBzdGlsbCBwb3dlcmVkICovCitzdGF0aWMgYm9vbCBhNnh4X2dtdV9neF9pc19vbihzdHJ1Y3Qg YTZ4eF9nbXUgKmdtdSkKK3sKKwl1MzIgdmFsICA9IGdtdV9yZWFkKGdtdSwgUkVHX0E2WFhfR01V X1NQVFBSQUNfUFdSX0NMS19TVEFUVVMpOworCisJcmV0dXJuICEodmFsICYKKwkJKEE2WFhfR01V X1NQVFBSQUNfUFdSX0NMS19TVEFUVVNfR1hfSE1fR0RTQ19QT1dFUl9PRkYgfAorCQlBNlhYX0dN VV9TUFRQUkFDX1BXUl9DTEtfU1RBVFVTX0dYX0hNX0NMS19PRkYpKTsKK30KKworc3RhdGljIGJv b2wgYTZ4eF9nbXVfY2hlY2tfaWRsZV9sZXZlbChzdHJ1Y3QgYTZ4eF9nbXUgKmdtdSkKK3sKKwl1 MzIgdmFsOworCWludCBsb2NhbCA9IGdtdS0+aWRsZV9sZXZlbDsKKworCS8qIFNQVFAgYW5kIElG UEMgYm90aCByZXBvcnQgYXMgSUZQQyAqLworCWlmIChnbXUtPmlkbGVfbGV2ZWwgPT0gR01VX0lE TEVfU1RBVEVfU1BUUCkKKwkJbG9jYWwgPSBHTVVfSURMRV9TVEFURV9JRlBDOworCisJdmFsID0g Z211X3JlYWQoZ211LCBSRUdfQTZYWF9HUFVfR01VX0NYX0dNVV9SUE1IX1BPV0VSX1NUQVRFKTsK KworCWlmICh2YWwgPT0gbG9jYWwpIHsKKwkJaWYgKGdtdS0+aWRsZV9sZXZlbCAhPSBHTVVfSURM RV9TVEFURV9JRlBDIHx8CisJCQkhYTZ4eF9nbXVfZ3hfaXNfb24oZ211KSkKKwkJCXJldHVybiB0 cnVlOworCX0KKworCXJldHVybiBmYWxzZTsKK30KKworLyogV2FpdCBmb3IgdGhlIEdNVSB0byBn ZXQgdG8gaXRzIG1vc3QgaWRsZSBzdGF0ZSAqLworaW50IGE2eHhfZ211X3dhaXRfZm9yX2lkbGUo c3RydWN0IGE2eHhfZ3B1ICphNnh4X2dwdSkKK3sKKwlzdHJ1Y3QgYTZ4eF9nbXUgKmdtdSA9ICZh Nnh4X2dwdS0+Z211OworCisJcmV0dXJuIHNwaW5fdW50aWwoYTZ4eF9nbXVfY2hlY2tfaWRsZV9s ZXZlbChnbXUpKTsKK30KKworc3RhdGljIGludCBhNnh4X2dtdV9zdGFydChzdHJ1Y3QgYTZ4eF9n bXUgKmdtdSkKK3sKKwlpbnQgcmV0OworCXUzMiB2YWw7CisKKwlnbXVfd3JpdGUoZ211LCBSRUdf QTZYWF9HTVVfQ00zX1NZU1JFU0VULCAxKTsKKwlnbXVfd3JpdGUoZ211LCBSRUdfQTZYWF9HTVVf Q00zX1NZU1JFU0VULCAwKTsKKworCXJldCA9IGdtdV9wb2xsX3RpbWVvdXQoZ211LCBSRUdfQTZY WF9HTVVfQ00zX0ZXX0lOSVRfUkVTVUxULCB2YWwsCisJCXZhbCA9PSAweGJhYmVmYWNlLCAxMDAs IDEwMDAwKTsKKworCWlmIChyZXQpCisJCWRldl9lcnIoZ211LT5kZXYsICJHTVUgZmlybXdhcmUg aW5pdGFsaXphdGlvbiB0aW1lZCBvdXRcbiIpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGlj IGludCBhNnh4X2dtdV9oZmlfc3RhcnQoc3RydWN0IGE2eHhfZ211ICpnbXUpCit7CisJdTMyIHZh bDsKKwlpbnQgcmV0OworCisJZ211X3JtdyhnbXUsIFJFR19BNlhYX0dNVV9HTVUySE9TVF9JTlRS X01BU0ssCisJCUE2WFhfR01VX0dNVTJIT1NUX0lOVFJfSU5GT19NU0dRLCAwKTsKKworCWdtdV93 cml0ZShnbXUsIFJFR19BNlhYX0dNVV9IRklfQ1RSTF9JTklULCAxKTsKKworCXJldCA9IGdtdV9w b2xsX3RpbWVvdXQoZ211LCBSRUdfQTZYWF9HTVVfSEZJX0NUUkxfU1RBVFVTLCB2YWwsCisJCXZh bCAmIDEsIDEwMCwgMTAwMDApOworCWlmIChyZXQpCisJCWRldl9lcnIoZ211LT5kZXYsICJVbmFi bGUgdG8gc3RhcnQgdGhlIEhGSSBxdWV1ZXNcbiIpOworCisJcmV0dXJuIHJldDsKK30KKworLyog VHJpZ2dlciBhIE9PQiAob3V0IG9mIGJhbmQpIHJlcXVlc3QgdG8gdGhlIEdNVSAqLworaW50IGE2 eHhfZ211X3NldF9vb2Ioc3RydWN0IGE2eHhfZ211ICpnbXUsIGVudW0gYTZ4eF9nbXVfb29iX3N0 YXRlIHN0YXRlKQoreworCWludCByZXQ7CisJdTMyIHZhbDsKKwlpbnQgcmVxdWVzdCwgYWNrOwor CWNvbnN0IGNoYXIgKm5hbWU7CisKKwlzd2l0Y2ggKHN0YXRlKSB7CisJY2FzZSBHTVVfT09CX0dQ VV9TRVQ6CisJCXJlcXVlc3QgPSBHTVVfT09CX0dQVV9TRVRfUkVRVUVTVDsKKwkJYWNrID0gR01V X09PQl9HUFVfU0VUX0FDSzsKKwkJbmFtZSA9ICJHUFVfU0VUIjsKKwkJYnJlYWs7CisJY2FzZSBH TVVfT09CX0JPT1RfU0xVTUJFUjoKKwkJcmVxdWVzdCA9IEdNVV9PT0JfQk9PVF9TTFVNQkVSX1JF UVVFU1Q7CisJCWFjayA9IEdNVV9PT0JfQk9PVF9TTFVNQkVSX0FDSzsKKwkJbmFtZSA9ICJCT09U X1NMVU1CRVIiOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisK KwkvKiBUcmlnZ2VyIHRoZSBlcXVlc3RlZCBPT0Igb3BlcmF0aW9uICovCisJZ211X3dyaXRlKGdt dSwgUkVHX0E2WFhfR01VX0hPU1QyR01VX0lOVFJfU0VULCAxIDw8IHJlcXVlc3QpOworCisJLyog V2FpdCBmb3IgdGhlIGFja25vd2xlZGdlIGludGVycnVwdCAqLworCXJldCA9IGdtdV9wb2xsX3Rp bWVvdXQoZ211LCBSRUdfQTZYWF9HTVVfR01VMkhPU1RfSU5UUl9JTkZPLCB2YWwsCisJCXZhbCAm ICgxIDw8IGFjayksIDEwMCwgMTAwMDApOworCisJaWYgKHJldCkKKwkJZGV2X2VycihnbXUtPmRl diwKKwkJCSJUaW1lb3V0IHdhaXRpbmcgZm9yIEdNVSBPT0Igc2V0ICVzOiAweCV4XG4iLAorCQkJ CW5hbWUsCisJCQkJZ211X3JlYWQoZ211LCBSRUdfQTZYWF9HTVVfR01VMkhPU1RfSU5UUl9JTkZP KSk7CisKKwkvKiBDbGVhciB0aGUgYWNrbm93bGVkZ2UgaW50ZXJydXB0ICovCisJZ211X3dyaXRl KGdtdSwgUkVHX0E2WFhfR01VX0dNVTJIT1NUX0lOVFJfQ0xSLCBhY2spOworCisJcmV0dXJuIHJl dDsKK30KKworLyogQ2xlYXIgYSBwZW5kaW5nIE9PQiBzdGF0ZSBpbiB0aGUgR01VICovCit2b2lk IGE2eHhfZ211X2NsZWFyX29vYihzdHJ1Y3QgYTZ4eF9nbXUgKmdtdSwgZW51bSBhNnh4X2dtdV9v b2Jfc3RhdGUgc3RhdGUpCit7CisJc3dpdGNoIChzdGF0ZSkgeworCWNhc2UgR01VX09PQl9HUFVf U0VUOgorCQlnbXVfd3JpdGUoZ211LCBSRUdfQTZYWF9HTVVfSE9TVDJHTVVfSU5UUl9TRVQsCisJ CQkxIDw8IEdNVV9PT0JfR1BVX1NFVF9DTEVBUik7CisJCWJyZWFrOworCWNhc2UgR01VX09PQl9C T09UX1NMVU1CRVI6CisJCWdtdV93cml0ZShnbXUsIFJFR19BNlhYX0dNVV9IT1NUMkdNVV9JTlRS X1NFVCwKKwkJCTEgPDwgR01VX09PQl9CT09UX1NMVU1CRVJfQ0xFQVIpOworCQlicmVhazsKKwl9 Cit9CisKKy8qIEVuYWJsZSBDUFUgY29udHJvbCBvZiBTUFRQIHBvd2VyIHBvd2VyIGNvbGxhcHNl ICovCitzdGF0aWMgaW50IGE2eHhfc3B0cHJhY19lbmFibGUoc3RydWN0IGE2eHhfZ211ICpnbXUp Cit7CisJaW50IHJldDsKKwl1MzIgdmFsOworCisJZ211X3dyaXRlKGdtdSwgUkVHX0E2WFhfR01V X0dYX1NQVFBSQUNfUE9XRVJfQ09OVFJPTCwgMHg3NzgwMDApOworCisJcmV0ID0gZ211X3BvbGxf dGltZW91dChnbXUsIFJFR19BNlhYX0dNVV9TUFRQUkFDX1BXUl9DTEtfU1RBVFVTLCB2YWwsCisJ CSh2YWwgJiAweDM4KSA9PSAweDI4LCAxLCAxMDApOworCisJaWYgKHJldCkgeworCQlkZXZfZXJy KGdtdS0+ZGV2LCAiVW5hYmxlIHRvIHBvd2VyIG9uIFNQVFBSQUM6IDB4JXhcbiIsCisJCQlnbXVf cmVhZChnbXUsIFJFR19BNlhYX0dNVV9TUFRQUkFDX1BXUl9DTEtfU1RBVFVTKSk7CisJfQorCisJ cmV0dXJuIDA7Cit9CisKKy8qIERpc2FibGUgQ1BVIGNvbnRyb2wgb2YgU1BUUCBwb3dlciBwb3dl ciBjb2xsYXBzZSAqLworc3RhdGljIHZvaWQgYTZ4eF9zcHRwcmFjX2Rpc2FibGUoc3RydWN0IGE2 eHhfZ211ICpnbXUpCit7CisJdTMyIHZhbDsKKwlpbnQgcmV0OworCisJLyogTWFrZSBzdXJlIHJl dGVudGlvbiBpcyBvbiAqLworCWdtdV9ybXcoZ211LCBSRUdfQTZYWF9HUFVfQ0NfR1hfR0RTQ1Is IDAsICgxIDw8IDExKSk7CisKKwlnbXVfd3JpdGUoZ211LCBSRUdfQTZYWF9HTVVfR1hfU1BUUFJB Q19QT1dFUl9DT05UUk9MLCAweDc3ODAwMSk7CisKKwlyZXQgPSBnbXVfcG9sbF90aW1lb3V0KGdt dSwgUkVHX0E2WFhfR01VX1NQVFBSQUNfUFdSX0NMS19TVEFUVVMsIHZhbCwKKwkJKHZhbCAmIDB4 MDQpLCAxMDAsIDEwMDAwKTsKKworCWlmIChyZXQpCisJCWRldl9lcnIoZ211LT5kZXYsICJmYWls ZWQgdG8gcG93ZXIgb2ZmIFNQVFBSQUM6IDB4JXhcbiIsCisJCQlnbXVfcmVhZChnbXUsIFJFR19B NlhYX0dNVV9TUFRQUkFDX1BXUl9DTEtfU1RBVFVTKSk7Cit9CisKKy8qIExldCB0aGUgR01VIGtu b3cgd2UgYXJlIHN0YXJ0aW5nIGEgYm9vdCBzZXF1ZW5jZSAqLworc3RhdGljIGludCBhNnh4X2dt dV9nZnhfcmFpbF9vbihzdHJ1Y3QgYTZ4eF9nbXUgKmdtdSkKK3sKKwl1MzIgdm90ZTsKKworCS8q IExldCB0aGUgR01VIGtub3cgd2UgYXJlIGdldHRpbmcgcmVhZHkgZm9yIGJvb3QgKi8KKwlnbXVf d3JpdGUoZ211LCBSRUdfQTZYWF9HTVVfQk9PVF9TTFVNQkVSX09QVElPTiwgMCk7CisKKwkvKiBD aG9vc2UgdGhlICJkZWZhdWx0IiBwb3dlciBsZXZlbCBhcyB0aGUgaGlnaGVzdCBhdmFpbGFibGUg Ki8KKwl2b3RlID0gZ211LT5neF9hcmNfdm90ZXNbZ211LT5ucl9ncHVfZnJlcXMgLSAxXTsKKwor CWdtdV93cml0ZShnbXUsIFJFR19BNlhYX0dNVV9HWF9WT1RFX0lEWCwgdm90ZSAmIDB4ZmYpOwor CWdtdV93cml0ZShnbXUsIFJFR19BNlhYX0dNVV9NWF9WT1RFX0lEWCwgKHZvdGUgPj4gOCkgJiAw eGZmKTsKKworCS8qIExldCB0aGUgR01VIGtub3cgdGhlIGJvb3Qgc2VxdWVuY2UgaGFzIHN0YXJ0 ZWQgKi8KKwlyZXR1cm4gYTZ4eF9nbXVfc2V0X29vYihnbXUsIEdNVV9PT0JfQk9PVF9TTFVNQkVS KTsKK30KKworLyogTGV0IHRoZSBHTVUga25vdyB0aGF0IHdlIGFyZSBhYm91dCB0byBnbyBpbnRv IHNsdW1iZXIgKi8KK3N0YXRpYyBpbnQgYTZ4eF9nbXVfbm90aWZ5X3NsdW1iZXIoc3RydWN0IGE2 eHhfZ211ICpnbXUpCit7CisJaW50IHJldDsKKworCS8qIERpc2FibGUgdGhlIHBvd2VyIGNvdW50 ZXIgc28gdGhlIEdNVSBpc24ndCBidXN5ICovCisJZ211X3dyaXRlKGdtdSwgUkVHX0E2WFhfR01V X0NYX0dNVV9QT1dFUl9DT1VOVEVSX0VOQUJMRSwgMCk7CisKKwkvKiBEaXNhYmxlIFNQVFBfUEMg aWYgdGhlIENQVSBpcyByZXNwb25zaWJsZSBmb3IgaXQgKi8KKwlpZiAoZ211LT5pZGxlX2xldmVs IDwgR01VX0lETEVfU1RBVEVfU1BUUCkKKwkJYTZ4eF9zcHRwcmFjX2Rpc2FibGUoZ211KTsKKwor CS8qIFRlbGwgdGhlIEdNVSB0byBnZXQgcmVhZHkgdG8gc2x1bWJlciAqLworCWdtdV93cml0ZShn bXUsIFJFR19BNlhYX0dNVV9CT09UX1NMVU1CRVJfT1BUSU9OLCAxKTsKKworCXJldCA9IGE2eHhf Z211X3NldF9vb2IoZ211LCBHTVVfT09CX0JPT1RfU0xVTUJFUik7CisJYTZ4eF9nbXVfY2xlYXJf b29iKGdtdSwgR01VX09PQl9CT09UX1NMVU1CRVIpOworCisJaWYgKCFyZXQpIHsKKwkJLyogQ2hl Y2sgdG8gc2VlIGlmIHRoZSBHTVUgcmVhbGx5IGRpZCBzbHVtYmVyICovCisJCWlmIChnbXVfcmVh ZChnbXUsIFJFR19BNlhYX0dQVV9HTVVfQ1hfR01VX1JQTUhfUE9XRVJfU1RBVEUpCisJCQkhPSAw eDBmKSB7CisJCQlkZXZfZXJyKGdtdS0+ZGV2LCAiVGhlIEdNVSBkaWQgbm90IGdvIGludG8gc2x1 bWJlclxuIik7CisJCQlyZXQgPSAtRVRJTUVET1VUOworCQl9CisJfQorCisJLyogUHV0IGZlbmNl IGludG8gYWxsb3cgbW9kZSAqLworCWdtdV93cml0ZShnbXUsIFJFR19BNlhYX0dNVV9BT19BSEJf RkVOQ0VfQ1RSTCwgMCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhNnh4X3JwbWhf c3RhcnQoc3RydWN0IGE2eHhfZ211ICpnbXUpCit7CisJaW50IHJldDsKKwl1MzIgdmFsOworCisJ Z211X3dyaXRlKGdtdSwgUkVHX0E2WFhfR01VX1JTQ0NfQ09OVFJPTF9SRVEsIDEgPDwgMSk7CisJ LyogV2FpdCBmb3IgdGhlIHJlZ2lzdGVyIHRvIGZpbmlzaCBwb3N0aW5nICovCisJd21iKCk7CisK KwlyZXQgPSBnbXVfcG9sbF90aW1lb3V0KGdtdSwgUkVHX0E2WFhfR01VX1JTQ0NfQ09OVFJPTF9B Q0ssIHZhbCwKKwkJdmFsICYgKDEgPDwgMSksIDEwMCwgMTAwMDApOworCWlmIChyZXQpIHsKKwkJ ZGV2X2VycihnbXUtPmRldiwgIlVuYWJsZSB0byBwb3dlciBvbiB0aGUgR1BVIFJTQ1xuIik7CisJ CXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gZ211X3BvbGxfdGltZW91dChnbXUsIFJFR19BNlhY X1JTQ0NfU0VRX0JVU1lfRFJWMCwgdmFsLAorCQkhdmFsLCAxMDAsIDEwMDAwKTsKKworCWlmICgh cmV0KSB7CisJCWdtdV93cml0ZShnbXUsIFJFR19BNlhYX0dNVV9SU0NDX0NPTlRST0xfUkVRLCAw KTsKKworCQkvKiBSZS1lbmFibGUgdGhlIHBvd2VyIGNvdW50ZXIgKi8KKwkJZ211X3dyaXRlKGdt dSwgUkVHX0E2WFhfR01VX0NYX0dNVV9QT1dFUl9DT1VOVEVSX0VOQUJMRSwgMSk7CisJCXJldHVy biAwOworCX0KKworCWRldl9lcnIoZ211LT5kZXYsICJHUFUgUlNDIHNlcXVlbmNlIHN0dWNrIHdo aWxlIHdha2luZyB1cCB0aGUgR1BVXG4iKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9p ZCBhNnh4X3JwbWhfc3RvcChzdHJ1Y3QgYTZ4eF9nbXUgKmdtdSkKK3sKKwlpbnQgcmV0OworCXUz MiB2YWw7CisKKwlnbXVfd3JpdGUoZ211LCBSRUdfQTZYWF9HTVVfUlNDQ19DT05UUk9MX1JFUSwg MSk7CisKKwlyZXQgPSBnbXVfcG9sbF90aW1lb3V0KGdtdSwgUkVHX0E2WFhfR1BVX1JTQ0NfUlND X1NUQVRVUzBfRFJWMCwKKwkJdmFsLCB2YWwgJiAoMSA8PCAxNiksIDEwMCwgMTAwMDApOworCWlm IChyZXQpCisJCWRldl9lcnIoZ211LT5kZXYsICJVbmFibGUgdG8gcG93ZXIgb2ZmIHRoZSBHUFUg UlNDXG4iKTsKKworCWdtdV93cml0ZShnbXUsIFJFR19BNlhYX0dNVV9SU0NDX0NPTlRST0xfUkVR LCAwKTsKK30KKworc3RhdGljIHZvaWQgYTZ4eF9nbXVfcnBtaF9pbml0KHN0cnVjdCBhNnh4X2dt dSAqZ211KQoreworCS8qIERpc2FibGUgU0RFIGNsb2NrIGdhdGluZyAqLworCWdtdV93cml0ZShn bXUsIFJFR19BNlhYX0dQVV9SU0NDX1JTQ19TVEFUVVMwX0RSVjAsIEJJVCgyNCkpOworCisJLyog U2V0dXAgUlNDIFBEQyBoYW5kc2hha2UgZm9yIHNsZWVwIGFuZCB3YWtldXAgKi8KKwlnbXVfd3Jp dGUoZ211LCBSRUdfQTZYWF9SU0NDX1BEQ19TTEFWRV9JRF9EUlYwLCAxKTsKKwlnbXVfd3JpdGUo Z211LCBSRUdfQTZYWF9SU0NDX0hJRERFTl9UQ1NfQ01EMF9EQVRBLCAwKTsKKwlnbXVfd3JpdGUo Z211LCBSRUdfQTZYWF9SU0NDX0hJRERFTl9UQ1NfQ01EMF9BRERSLCAwKTsKKwlnbXVfd3JpdGUo Z211LCBSRUdfQTZYWF9SU0NDX0hJRERFTl9UQ1NfQ01EMF9EQVRBICsgMiwgMCk7CisJZ211X3dy aXRlKGdtdSwgUkVHX0E2WFhfUlNDQ19ISURERU5fVENTX0NNRDBfQUREUiArIDIsIDApOworCWdt dV93cml0ZShnbXUsIFJFR19BNlhYX1JTQ0NfSElEREVOX1RDU19DTUQwX0RBVEEgKyA0LCAweDgw MDAwMDAwKTsKKwlnbXVfd3JpdGUoZ211LCBSRUdfQTZYWF9SU0NDX0hJRERFTl9UQ1NfQ01EMF9B RERSICsgNCwgMCk7CisJZ211X3dyaXRlKGdtdSwgUkVHX0E2WFhfUlNDQ19PVkVSUklERV9TVEFS VF9BRERSLCAwKTsKKwlnbXVfd3JpdGUoZ211LCBSRUdfQTZYWF9SU0NDX1BEQ19TRVFfU1RBUlRf QUREUiwgMHg0NTIwKTsKKwlnbXVfd3JpdGUoZ211LCBSRUdfQTZYWF9SU0NDX1BEQ19NQVRDSF9W QUxVRV9MTywgMHg0NTEwKTsKKwlnbXVfd3JpdGUoZ211LCBSRUdfQTZYWF9SU0NDX1BEQ19NQVRD SF9WQUxVRV9ISSwgMHg0NTE0KTsKKworCS8qIExvYWQgUlNDIHNlcXVlbmNlciB1Q29kZSBmb3Ig c2xlZXAgYW5kIHdha2V1cCAqLworCWdtdV93cml0ZShnbXUsIFJFR19BNlhYX1JTQ0NfU0VRX01F TV8wX0RSVjAsIDB4YTdhNTA2YTApOworCWdtdV93cml0ZShnbXUsIFJFR19BNlhYX1JTQ0NfU0VR X01FTV8wX0RSVjAgKyAxLCAweGExZTZhNmU3KTsKKwlnbXVfd3JpdGUoZ211LCBSRUdfQTZYWF9S U0NDX1NFUV9NRU1fMF9EUlYwICsgMiwgMHhhMmUwODFlMSk7CisJZ211X3dyaXRlKGdtdSwgUkVH X0E2WFhfUlNDQ19TRVFfTUVNXzBfRFJWMCArIDMsIDB4ZTlhOTgyZTIpOworCWdtdV93cml0ZShn bXUsIFJFR19BNlhYX1JTQ0NfU0VRX01FTV8wX0RSVjAgKyA0LCAweDAwMjBlOGE4KTsKKworCS8q IExvYWQgUERDIHNlcXVlbmNlciB1Q29kZSBmb3IgcG93ZXIgdXAgYW5kIHBvd2VyIGRvd24gc2Vx dWVuY2UgKi8KKwlwZGNfd3JpdGUoZ211LCBSRUdfQTZYWF9QRENfR1BVX1NFUV9NRU1fMCwgMHhm ZWJlYTFlMSk7CisJcGRjX3dyaXRlKGdtdSwgUkVHX0E2WFhfUERDX0dQVV9TRVFfTUVNXzAgKyAx LCAweGE1YTRhM2EyKTsKKwlwZGNfd3JpdGUoZ211LCBSRUdfQTZYWF9QRENfR1BVX1NFUV9NRU1f MCArIDIsIDB4ODM4MmE2ZTApOworCXBkY193cml0ZShnbXUsIFJFR19BNlhYX1BEQ19HUFVfU0VR X01FTV8wICsgMywgMHhiY2UzZTI4NCk7CisJcGRjX3dyaXRlKGdtdSwgUkVHX0E2WFhfUERDX0dQ VV9TRVFfTUVNXzAgKyA0LCAweDAwMjA4MWZjKTsKKworCS8qIFNldCBUQ1MgY29tbWFuZHMgdXNl ZCBieSBQREMgc2VxdWVuY2UgZm9yIGxvdyBwb3dlciBtb2RlcyAqLworCXBkY193cml0ZShnbXUs IFJFR19BNlhYX1BEQ19HUFVfVENTMV9DTURfRU5BQkxFX0JBTkssIDcpOworCXBkY193cml0ZShn bXUsIFJFR19BNlhYX1BEQ19HUFVfVENTMV9DTURfV0FJVF9GT1JfQ01QTF9CQU5LLCAwKTsKKwlw ZGNfd3JpdGUoZ211LCBSRUdfQTZYWF9QRENfR1BVX1RDUzFfQ09OVFJPTCwgMCk7CisJcGRjX3dy aXRlKGdtdSwgUkVHX0E2WFhfUERDX0dQVV9UQ1MxX0NNRDBfTVNHSUQsIDB4MTAxMDgpOworCXBk Y193cml0ZShnbXUsIFJFR19BNlhYX1BEQ19HUFVfVENTMV9DTUQwX0FERFIsIDB4MzAwMTApOwor CXBkY193cml0ZShnbXUsIFJFR19BNlhYX1BEQ19HUFVfVENTMV9DTUQwX0RBVEEsIDEpOworCXBk Y193cml0ZShnbXUsIFJFR19BNlhYX1BEQ19HUFVfVENTMV9DTUQwX01TR0lEICsgNCwgMHgxMDEw OCk7CisJcGRjX3dyaXRlKGdtdSwgUkVHX0E2WFhfUERDX0dQVV9UQ1MxX0NNRDBfQUREUiArIDQs IDB4MzAwMDApOworCXBkY193cml0ZShnbXUsIFJFR19BNlhYX1BEQ19HUFVfVENTMV9DTUQwX0RB VEEgKyA0LCAweDApOworCXBkY193cml0ZShnbXUsIFJFR19BNlhYX1BEQ19HUFVfVENTMV9DTUQw X01TR0lEICsgOCwgMHgxMDEwOCk7CisJcGRjX3dyaXRlKGdtdSwgUkVHX0E2WFhfUERDX0dQVV9U Q1MxX0NNRDBfQUREUiArIDgsIDB4MzAwODApOworCXBkY193cml0ZShnbXUsIFJFR19BNlhYX1BE Q19HUFVfVENTMV9DTUQwX0RBVEEgKyA4LCAweDApOworCXBkY193cml0ZShnbXUsIFJFR19BNlhY X1BEQ19HUFVfVENTM19DTURfRU5BQkxFX0JBTkssIDcpOworCXBkY193cml0ZShnbXUsIFJFR19B NlhYX1BEQ19HUFVfVENTM19DTURfV0FJVF9GT1JfQ01QTF9CQU5LLCAwKTsKKwlwZGNfd3JpdGUo Z211LCBSRUdfQTZYWF9QRENfR1BVX1RDUzNfQ09OVFJPTCwgMCk7CisJcGRjX3dyaXRlKGdtdSwg UkVHX0E2WFhfUERDX0dQVV9UQ1MzX0NNRDBfTVNHSUQsIDB4MTAxMDgpOworCXBkY193cml0ZShn bXUsIFJFR19BNlhYX1BEQ19HUFVfVENTM19DTUQwX0FERFIsIDB4MzAwMTApOworCXBkY193cml0 ZShnbXUsIFJFR19BNlhYX1BEQ19HUFVfVENTM19DTUQwX0RBVEEsIDIpOworCXBkY193cml0ZShn bXUsIFJFR19BNlhYX1BEQ19HUFVfVENTM19DTUQwX01TR0lEICsgNCwgMHgxMDEwOCk7CisJcGRj X3dyaXRlKGdtdSwgUkVHX0E2WFhfUERDX0dQVV9UQ1MzX0NNRDBfQUREUiArIDQsIDB4MzAwMDAp OworCXBkY193cml0ZShnbXUsIFJFR19BNlhYX1BEQ19HUFVfVENTM19DTUQwX0RBVEEgKyA0LCAw eDMpOworCXBkY193cml0ZShnbXUsIFJFR19BNlhYX1BEQ19HUFVfVENTM19DTUQwX01TR0lEICsg OCwgMHgxMDEwOCk7CisJcGRjX3dyaXRlKGdtdSwgUkVHX0E2WFhfUERDX0dQVV9UQ1MzX0NNRDBf QUREUiArIDgsIDB4MzAwODApOworCXBkY193cml0ZShnbXUsIFJFR19BNlhYX1BEQ19HUFVfVENT M19DTUQwX0RBVEEgKyA4LCAweDMpOworCisJLyogU2V0dXAgR1BVIFBEQyAqLworCXBkY193cml0 ZShnbXUsIFJFR19BNlhYX1BEQ19HUFVfU0VRX1NUQVJUX0FERFIsIDApOworCXBkY193cml0ZShn bXUsIFJFR19BNlhYX1BEQ19HUFVfRU5BQkxFX1BEQywgMHg4MDAwMDAwMSk7CisKKwkvKiBlbnN1 cmUgbm8gd3JpdGVzIGhhcHBlbiBiZWZvcmUgdGhlIHVDb2RlIGlzIGZ1bGx5IHdyaXR0ZW4gKi8K Kwl3bWIoKTsKK30KKworLyoKKyAqIFRoZSBsb3dlc3QgMTYgYml0cyBvZiB0aGlzIHZhbHVlIGFy ZSB0aGUgbnVtYmVyIG9mIFhPIGNsb2NrIGN5Y2xlcyBmb3IgbWFpbgorICogaHlzdGVyZXNpcyB3 aGljaCBpcyBzZXQgYXQgMHgxNjgwIGN5Y2xlcyAoMzAwIHVzKS4gIFRoZSBoaWdoZXIgMTYgYml0 cyBhcmUKKyAqIGZvciB0aGUgc2hvcnRlciBoeXN0ZXJlc2lzIHRoYXQgaGFwcGVucyBhZnRlciBt YWluIC0gdGhpcyBpcyAweGEgKC41IHVzKQorICovCisKKyNkZWZpbmUgR01VX1BXUl9DT0xfSFlT VCAweDAwMGExNjgwCisKKy8qIFNldCB1cCB0aGUgaWRsZSBzdGF0ZSBmb3IgdGhlIEdNVSAqLwor c3RhdGljIHZvaWQgYTZ4eF9nbXVfcG93ZXJfY29uZmlnKHN0cnVjdCBhNnh4X2dtdSAqZ211KQor eworCS8qIERpc2FibGUgR01VIFdCL1JCIGJ1ZmZlciAqLworCWdtdV93cml0ZShnbXUsIFJFR19B NlhYX0dNVV9TWVNfQlVTX0NPTkZJRywgMHgxKTsKKworCWdtdV93cml0ZShnbXUsIFJFR19BNlhY X0dNVV9QV1JfQ09MX0lOVEVSX0ZSQU1FX0NUUkwsIDB4OWM0MDQwMCk7CisKKwlzd2l0Y2ggKGdt dS0+aWRsZV9sZXZlbCkgeworCWNhc2UgR01VX0lETEVfU1RBVEVfSUZQQzoKKwkJZ211X3dyaXRl KGdtdSwgUkVHX0E2WFhfR01VX1BXUl9DT0xfSU5URVJfRlJBTUVfSFlTVCwKKwkJCUdNVV9QV1Jf Q09MX0hZU1QpOworCQlnbXVfcm13KGdtdSwgUkVHX0E2WFhfR01VX1BXUl9DT0xfSU5URVJfRlJB TUVfQ1RSTCwgMCwKKwkJCUE2WFhfR01VX1BXUl9DT0xfSU5URVJfRlJBTUVfQ1RSTF9JRlBDX0VO QUJMRSB8CisJCQlBNlhYX0dNVV9QV1JfQ09MX0lOVEVSX0ZSQU1FX0NUUkxfSE1fUE9XRVJfQ09M TEFQU0VfRU5BQkxFKTsKKwkJLyogRmFsbCB0aHJvdWdoICovCisJY2FzZSBHTVVfSURMRV9TVEFU RV9TUFRQOgorCQlnbXVfd3JpdGUoZ211LCBSRUdfQTZYWF9HTVVfUFdSX0NPTF9TUFRQUkFDX0hZ U1QsCisJCQlHTVVfUFdSX0NPTF9IWVNUKTsKKwkJZ211X3JtdyhnbXUsIFJFR19BNlhYX0dNVV9Q V1JfQ09MX0lOVEVSX0ZSQU1FX0NUUkwsIDAsCisJCQlBNlhYX0dNVV9QV1JfQ09MX0lOVEVSX0ZS QU1FX0NUUkxfSUZQQ19FTkFCTEUgfAorCQkJQTZYWF9HTVVfUFdSX0NPTF9JTlRFUl9GUkFNRV9D VFJMX1NQVFBSQUNfUE9XRVJfQ09OVFJPTF9FTkFCTEUpOworCX0KKworCS8qIEVuYWJsZSBSUE1o IEdQVSBjbGllbnQgKi8KKwlnbXVfcm13KGdtdSwgUkVHX0E2WFhfR01VX1JQTUhfQ1RSTCwgMCwK KwkJQTZYWF9HTVVfUlBNSF9DVFJMX1JQTUhfSU5URVJGQUNFX0VOQUJMRSB8CisJCUE2WFhfR01V X1JQTUhfQ1RSTF9MTENfVk9URV9FTkFCTEUgfAorCQlBNlhYX0dNVV9SUE1IX0NUUkxfRERSX1ZP VEVfRU5BQkxFIHwKKwkJQTZYWF9HTVVfUlBNSF9DVFJMX01YX1ZPVEVfRU5BQkxFIHwKKwkJQTZY WF9HTVVfUlBNSF9DVFJMX0NYX1ZPVEVfRU5BQkxFIHwKKwkJQTZYWF9HTVVfUlBNSF9DVFJMX0dG WF9WT1RFX0VOQUJMRSk7Cit9CisKK3N0YXRpYyBpbnQgYTZ4eF9nbXVfZndfc3RhcnQoc3RydWN0 IGE2eHhfZ211ICpnbXUsIHVuc2lnbmVkIGludCBzdGF0ZSkKK3sKKwlzdGF0aWMgYm9vbCBycG1o X2luaXQ7CisJc3RydWN0IGE2eHhfZ3B1ICphNnh4X2dwdSA9IGNvbnRhaW5lcl9vZihnbXUsIHN0 cnVjdCBhNnh4X2dwdSwgZ211KTsKKwlzdHJ1Y3QgYWRyZW5vX2dwdSAqYWRyZW5vX2dwdSA9ICZh Nnh4X2dwdS0+YmFzZTsKKwlpbnQgaSwgcmV0OworCXUzMiBjaGlwaWQ7CisJdTMyICppbWFnZTsK KworCWlmIChzdGF0ZSA9PSBHTVVfV0FSTV9CT09UKSB7CisJCXJldCA9IGE2eHhfcnBtaF9zdGFy dChnbXUpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9IGVsc2UgeworCQkvKiBMb2Fk IHRoZSBmaXJtd2FyZSBpbiBjYXNlIGl0IGhhc24ndCBiZWVuIGRvbmUgeWV0ICovCisJCXJldCA9 IGFkcmVub19sb2FkX2Z3KGFkcmVub19ncHUpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsK KworCQkvKiBTYW5pdHkgY2hlY2sgdGhlIHNpemUgb2YgdGhlIGZpcm13YXJlIHRoYXQgd2FzIGxv YWRlZCAqLworCQlpZiAoYWRyZW5vX2dwdS0+ZndbQURSRU5PX0ZXX0dNVV0tPnNpemUgPiAweDgw MDApIHsKKwkJCWRldl9lcnIoZ211LT5kZXYsCisJCQkJIkdNVSBmaXJtd2FyZSBpcyBiaWdnZXIg dGhhbiB0aGUgYXZhaWxhYmxlIHJlZ2lvblxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQor CisJCS8qIFR1cm4gb24gcmVnaXN0ZXIgcmV0ZW50aW9uICovCisJCWdtdV93cml0ZShnbXUsIFJF R19BNlhYX0dNVV9HRU5FUkFMXzcsIDEpOworCisJCS8qIFdlIG9ubHkgbmVlZCB0byBsb2FkIHRo ZSBSUE1oIG1pY3JvY29kZSBvbmNlICovCisJCWlmICghcnBtaF9pbml0KSB7CisJCQlhNnh4X2dt dV9ycG1oX2luaXQoZ211KTsKKwkJCXJwbWhfaW5pdCA9IHRydWU7CisJCX0gZWxzZSBpZiAoc3Rh dGUgIT0gR01VX1JFU0VUKSB7CisJCQlyZXQgPSBhNnh4X3JwbWhfc3RhcnQoZ211KTsKKwkJCWlm IChyZXQpCisJCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCWltYWdlID0gKHUzMiAqKSBhZHJlbm9f Z3B1LT5md1tBRFJFTk9fRldfR01VXS0+ZGF0YTsKKworCQlmb3IgKGkgPSAwOyBpIDwgYWRyZW5v X2dwdS0+ZndbQURSRU5PX0ZXX0dNVV0tPnNpemUgPj4gMjsgaSsrKQorCQkJZ211X3dyaXRlKGdt dSwgUkVHX0E2WFhfR01VX0NNM19JVENNX1NUQVJUICsgaSwKKwkJCQlpbWFnZVtpXSk7CisJfQor CisJZ211X3dyaXRlKGdtdSwgUkVHX0E2WFhfR01VX0NNM19GV19JTklUX1JFU1VMVCwgMCk7CisJ Z211X3dyaXRlKGdtdSwgUkVHX0E2WFhfR01VX0NNM19CT09UX0NPTkZJRywgMHgwMik7CisKKwkv KiBXcml0ZSB0aGUgaW92YSBvZiB0aGUgSEZJIHRhYmxlICovCisJZ211X3dyaXRlKGdtdSwgUkVH X0E2WFhfR01VX0hGSV9RVEJMX0FERFIsIGdtdS0+aGZpLT5pb3ZhKTsKKwlnbXVfd3JpdGUoZ211 LCBSRUdfQTZYWF9HTVVfSEZJX1FUQkxfSU5GTywgMSk7CisKKwlnbXVfd3JpdGUoZ211LCBSRUdf QTZYWF9HTVVfQUhCX0ZFTkNFX1JBTkdFXzAsCisJCSgxIDw8IDMxKSB8ICgweGEgPDwgMTgpIHwg KDB4YTApKTsKKworCWNoaXBpZCA9IGFkcmVub19ncHUtPnJldi5jb3JlIDw8IDI0OworCWNoaXBp ZCB8PSBhZHJlbm9fZ3B1LT5yZXYubWFqb3IgPDwgMTY7CisJY2hpcGlkIHw9IGFkcmVub19ncHUt PnJldi5taW5vciA8PCAxMjsKKwljaGlwaWQgfD0gYWRyZW5vX2dwdS0+cmV2LnBhdGNoaWQgPDwg ODsKKworCWdtdV93cml0ZShnbXUsIFJFR19BNlhYX0dNVV9IRklfU0ZSX0FERFIsIGNoaXBpZCk7 CisKKwkvKiBTZXQgdXAgdGhlIGxvd2VzdCBpZGxlIGxldmVsIG9uIHRoZSBHTVUgKi8KKwlhNnh4 X2dtdV9wb3dlcl9jb25maWcoZ211KTsKKworCXJldCA9IGE2eHhfZ211X3N0YXJ0KGdtdSk7CisJ aWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGE2eHhfZ211X2dmeF9yYWlsX29uKGdt dSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qIEVuYWJsZSBTUFRQX1BDIGlmIHRo ZSBDUFUgaXMgcmVzcG9uc2libGUgZm9yIGl0ICovCisJaWYgKGdtdS0+aWRsZV9sZXZlbCA8IEdN VV9JRExFX1NUQVRFX1NQVFApIHsKKwkJcmV0ID0gYTZ4eF9zcHRwcmFjX2VuYWJsZShnbXUpOwor CQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBhNnh4X2dtdV9oZmlfc3Rh cnQoZ211KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogRklYTUU6IERvIHdlIG5l ZWQgdGhpcyB3bWIoKSBoZXJlPyAqLworCXdtYigpOworCisJcmV0dXJuIDA7Cit9CisKKyNkZWZp bmUgQTZYWF9IRklfSVJRX01BU0sgXAorCShBNlhYX0dNVV9HTVUySE9TVF9JTlRSX0lORk9fTVNH USB8IFwKKwkgQTZYWF9HTVVfR01VMkhPU1RfSU5UUl9JTkZPX0NNM19GQVVMVCkKKworI2RlZmlu ZSBBNlhYX0dNVV9JUlFfTUFTSyBcCisJKEE2WFhfR01VX0FPX0hPU1RfSU5URVJSVVBUX1NUQVRV U19XRE9HX0JJVEUgfCBcCisJIEE2WFhfR01VX0FPX0hPU1RfSU5URVJSVVBUX1NUQVRVU19IT1NU X0FIQl9CVVNfRVJST1IgfCBcCisJIEE2WFhfR01VX0FPX0hPU1RfSU5URVJSVVBUX1NUQVRVU19G RU5DRV9FUlIpCisKK3N0YXRpYyB2b2lkIGE2eHhfZ211X2lycV9lbmFibGUoc3RydWN0IGE2eHhf Z211ICpnbXUpCit7CisJZ211X3dyaXRlKGdtdSwgUkVHX0E2WFhfR01VX0FPX0hPU1RfSU5URVJS VVBUX0NMUiwgfjApOworCWdtdV93cml0ZShnbXUsIFJFR19BNlhYX0dNVV9HTVUySE9TVF9JTlRS X0NMUiwgfjApOworCisJZ211X3dyaXRlKGdtdSwgUkVHX0E2WFhfR01VX0FPX0hPU1RfSU5URVJS VVBUX01BU0ssCisJCX5BNlhYX0dNVV9JUlFfTUFTSyk7CisJZ211X3dyaXRlKGdtdSwgUkVHX0E2 WFhfR01VX0dNVTJIT1NUX0lOVFJfTUFTSywKKwkJfkE2WFhfSEZJX0lSUV9NQVNLKTsKKworCWVu YWJsZV9pcnEoZ211LT5nbXVfaXJxKTsKKwllbmFibGVfaXJxKGdtdS0+aGZpX2lycSk7Cit9CisK K3N0YXRpYyB2b2lkIGE2eHhfZ211X2lycV9kaXNhYmxlKHN0cnVjdCBhNnh4X2dtdSAqZ211KQor eworCWRpc2FibGVfaXJxKGdtdS0+Z211X2lycSk7CisJZGlzYWJsZV9pcnEoZ211LT5oZmlfaXJx KTsKKworCWdtdV93cml0ZShnbXUsIFJFR19BNlhYX0dNVV9BT19IT1NUX0lOVEVSUlVQVF9NQVNL LCB+MCk7CisJZ211X3dyaXRlKGdtdSwgUkVHX0E2WFhfR01VX0dNVTJIT1NUX0lOVFJfTUFTSywg fjApOworfQorCitzdGF0aWMgdm9pZCBhNnh4X2dtdV9kaXNhYmxlX2Nsb2NrcyhzdHJ1Y3QgYTZ4 eF9nbXUgKmdtdSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBnbXUtPm5yX2Nsb2Nr czsgaSsrKQorCQljbGtfZGlzYWJsZV91bnByZXBhcmUoZ211LT5jbG9ja3NbaV0pOworfQorCitz dGF0aWMgdm9pZCBhNnh4X2dtdV9kaXNhYmxlX2dkc2Moc3RydWN0IGE2eHhfZ211ICpnbXUpCit7 CisJaWYgKGdtdS0+Y3gpCisJCXJlZ3VsYXRvcl9kaXNhYmxlKGdtdS0+Y3gpOworfQorCitzdGF0 aWMgaW50IGE2eHhfZ211X2VuYWJsZV9nZHNjKHN0cnVjdCBhNnh4X2dtdSAqZ211KQoreworCWlu dCByZXQgPSAwOworCisJaWYgKGdtdS0+Y3gpCisJCXJldCA9IHJlZ3VsYXRvcl9lbmFibGUoZ211 LT5jeCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBhNnh4X2dtdV9lbmFibGVf Y2xvY2tzKHN0cnVjdCBhNnh4X2dtdSAqZ211KQoreworCWludCBpOworCisJLyogVXNlIGEga25v d24gcmF0ZSB0byBicmluZyB1cCB0aGUgR01VICovCisJY2xrX3NldF9yYXRlKGdtdS0+Y29yZV9j bGssIDIwMDAwMDAwMCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZ211LT5ucl9jbG9ja3M7IGkrKykK KwkJY2xrX3ByZXBhcmVfZW5hYmxlKGdtdS0+Y2xvY2tzW2ldKTsKK30KKworaW50IGE2eHhfZ211 X3Jlc2V0KHN0cnVjdCBhNnh4X2dwdSAqYTZ4eF9ncHUpCit7CisJc3RydWN0IGE2eHhfZ211ICpn bXUgPSAmYTZ4eF9ncHUtPmdtdTsKKwlpbnQgcmV0OworCXUzMiB2YWw7CisKKwkvKiBGbHVzaCBh bGwgdGhlIHF1ZXVlcyAqLworCWE2eHhfaGZpX3N0b3AoZ211KTsKKworCS8qIFN0b3AgdGhlIGlu dGVycnVwdHMgKi8KKwlhNnh4X2dtdV9pcnFfZGlzYWJsZShnbXUpOworCisJLyogRm9yY2Ugb2Zm IFNQVFAgaW4gY2FzZSB0aGUgR01VIGlzIG1hbmFnaW5nIGl0ICovCisJYTZ4eF9zcHRwcmFjX2Rp c2FibGUoZ211KTsKKworCS8qIE1ha2Ugc3VyZSB0aGVyZSBhcmUgbm8gb3V0c3RhbmRpbmcgUlBN aCB2b3RlcyAqLworCWdtdV9wb2xsX3RpbWVvdXQoZ211LCBSRUdfQTZYWF9SU0NDX1RDUzBfRFJW MF9TVEFUVVMsIHZhbCwKKwkJKHZhbCAmIDEpLCAxMDAsIDEwMDAwKTsKKwlnbXVfcG9sbF90aW1l b3V0KGdtdSwgUkVHX0E2WFhfUlNDQ19UQ1MxX0RSVjBfU1RBVFVTLCB2YWwsCisJCSh2YWwgJiAx KSwgMTAwLCAxMDAwMCk7CisJZ211X3BvbGxfdGltZW91dChnbXUsIFJFR19BNlhYX1JTQ0NfVENT Ml9EUlYwX1NUQVRVUywgdmFsLAorCQkodmFsICYgMSksIDEwMCwgMTAwMDApOworCWdtdV9wb2xs X3RpbWVvdXQoZ211LCBSRUdfQTZYWF9SU0NDX1RDUzNfRFJWMF9TVEFUVVMsIHZhbCwKKwkJKHZh bCAmIDEpLCAxMDAsIDEwMDApOworCisJLyogRm9yY2Ugb2ZmIHRoZSBHWCBHU0RDICovCisJcmVn dWxhdG9yX2ZvcmNlX2Rpc2FibGUoZ211LT5neCk7CisKKwkvKiBEaXNhYmxlIHRoZSByZXNvdXJj ZXMgKi8KKwlhNnh4X2dtdV9kaXNhYmxlX2Nsb2NrcyhnbXUpOworCWE2eHhfZ211X2Rpc2FibGVf Z2RzYyhnbXUpOworCisJLyogUmUtZW5hYmxlIHRoZSByZXNvdXJjZXMgKi8KKwlhNnh4X2dtdV9l bmFibGVfZ2RzYyhnbXUpOworCWE2eHhfZ211X2VuYWJsZV9jbG9ja3MoZ211KTsKKwlhNnh4X2dt dV9pcnFfZW5hYmxlKGdtdSk7CisKKwlyZXQgPSBhNnh4X2dtdV9md19zdGFydChnbXUsIEdNVV9S RVNFVCk7CisJaWYgKCFyZXQpCisJCXJldCA9IGE2eHhfaGZpX3N0YXJ0KGdtdSwgR01VX0NPTERf Qk9PVCk7CisKKwlpZiAocmV0KQorCQlhNnh4X2dtdV9jbGVhcl9vb2IoZ211LCBHTVVfT09CX0JP T1RfU0xVTUJFUik7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgYTZ4eF9nbXVfcmVzdW1lKHN0 cnVjdCBhNnh4X2dwdSAqYTZ4eF9ncHUpCit7CisJc3RydWN0IGE2eHhfZ211ICpnbXUgPSAmYTZ4 eF9ncHUtPmdtdTsKKwlpbnQgc3RhdHVzLCByZXQ7CisKKwlpZiAoV0FSTighZ211LT5tbWlvLCAi VGhlIEdNVSBpcyBub3Qgc2V0IHVwIHlldFxuIikpCisJCXJldHVybiAwOworCisJLyogVHVybiBv biB0aGUgcmVzb3VyY2VzICovCisJYTZ4eF9nbXVfZW5hYmxlX2dkc2MoZ211KTsKKwlhNnh4X2dt dV9lbmFibGVfY2xvY2tzKGdtdSk7CisJYTZ4eF9nbXVfaXJxX2VuYWJsZShnbXUpOworCisJLyog Q2hlY2sgdG8gc2VlIGlmIHdlIGFyZSBkb2luZyBhIGNvbGQgb3Igd2FybSBib290ICovCisJc3Rh dHVzID0gZ211X3JlYWQoZ211LCBSRUdfQTZYWF9HTVVfR0VORVJBTF83KSA9PSAxID8KKwkJR01V X1dBUk1fQk9PVCA6IEdNVV9DT0xEX0JPT1Q7CisKKwlyZXQgPSBhNnh4X2dtdV9md19zdGFydChn bXUsIHN0YXR1cyk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSBhNnh4X2hmaV9z dGFydChnbXUsIHN0YXR1cyk7CisKK291dDoKKwkvKiBNYWtlIHN1cmUgdG8gdHVybiBvZmYgdGhl IGJvb3QgT09CIHJlcXVlc3Qgb24gZXJyb3IgKi8KKwlpZiAocmV0KQorCQlhNnh4X2dtdV9jbGVh cl9vb2IoZ211LCBHTVVfT09CX0JPT1RfU0xVTUJFUik7CisKKwlyZXR1cm4gcmV0OworfQorCiti b29sIGE2eHhfZ211X2lzaWRsZShzdHJ1Y3QgYTZ4eF9nbXUgKmdtdSkKK3sKKwl1MzIgcmVnOwor CisJaWYgKCFnbXUtPm1taW8pCisJCXJldHVybiB0cnVlOworCisJcmVnID0gZ211X3JlYWQoZ211 LCBSRUdfQTZYWF9HUFVfR01VX0FPX0dQVV9DWF9CVVNZX1NUQVRVUyk7CisKKwlpZiAocmVnICYg IEE2WFhfR1BVX0dNVV9BT19HUFVfQ1hfQlVTWV9TVEFUVVNfR1BVQlVTWUlHTkFIQikKKwkJcmV0 dXJuIGZhbHNlOworCisJcmV0dXJuIHRydWU7Cit9CisKK2ludCBhNnh4X2dtdV9zdG9wKHN0cnVj dCBhNnh4X2dwdSAqYTZ4eF9ncHUpCit7CisJc3RydWN0IGE2eHhfZ211ICpnbXUgPSAmYTZ4eF9n cHUtPmdtdTsKKwl1MzIgdmFsOworCisJLyoKKwkgKiBUaGUgR01VIG1heSBzdGlsbCBiZSBpbiBz bHVtYmVyIHVubGVzcyB0aGUgR1BVIHN0YXJ0ZWQgc28gY2hlY2sgYW5kCisJICogc2tpcCBwdXR0 aW5nIGl0IGJhY2sgaW50byBzbHVtYmVyIGlmIHNvCisJICovCisJdmFsID0gZ211X3JlYWQoZ211 LCBSRUdfQTZYWF9HUFVfR01VX0NYX0dNVV9SUE1IX1BPV0VSX1NUQVRFKTsKKworCWlmICh2YWwg IT0gMHhmKSB7CisJCWludCByZXQgPSBhNnh4X2dtdV93YWl0X2Zvcl9pZGxlKGE2eHhfZ3B1KTsK KworCQkvKiBUZW1wb3JhcnkgdW50aWwgd2UgY2FuIHJlY292ZXIgc2FmZWx5ICovCisJCUJVR19P TihyZXQpOworCisJCS8qIHRlbGwgdGhlIEdNVSB3ZSB3YW50IHRvIHNsdW1iZXIgKi8KKwkJYTZ4 eF9nbXVfbm90aWZ5X3NsdW1iZXIoZ211KTsKKworCQlyZXQgPSBnbXVfcG9sbF90aW1lb3V0KGdt dSwKKwkJCVJFR19BNlhYX0dQVV9HTVVfQU9fR1BVX0NYX0JVU1lfU1RBVFVTLCB2YWwsCisJCQkh KHZhbCAmIEE2WFhfR1BVX0dNVV9BT19HUFVfQ1hfQlVTWV9TVEFUVVNfR1BVQlVTWUlHTkFIQiks CisJCQkxMDAsIDEwMDAwKTsKKworCQkvKgorCQkgKiBMZXQgdGhlIHVzZXIga25vdyB3ZSBmYWls ZWQgdG8gc2x1bWJlciBidXQgZG9uJ3Qgd29ycnkgdG9vCisJCSAqIG11Y2ggYmVjYXVzZSB3ZSBh cmUgcG93ZXJpbmcgZG93biBhbnl3YXkKKwkJICovCisKKwkJaWYgKHJldCkKKwkJCWRldl9lcnIo Z211LT5kZXYsCisJCQkJIlVuYWJsZSB0byBzbHVtYmVyIEdNVTogc3RhdHVzID0gMCV4LzAleFxu IiwKKwkJCQlnbXVfcmVhZChnbXUsIFJFR19BNlhYX0dQVV9HTVVfQU9fR1BVX0NYX0JVU1lfU1RB VFVTKSwKKwkJCQlnbXVfcmVhZChnbXUsIFJFR19BNlhYX0dQVV9HTVVfQU9fR1BVX0NYX0JVU1lf U1RBVFVTMikpOworCX0KKworCS8qIFR1cm4gb2ZmIEhGSSAqLworCWE2eHhfaGZpX3N0b3AoZ211 KTsKKworCS8qIFN0b3AgdGhlIGludGVycnVwdHMgYW5kIG1hc2sgdGhlIGhhcmR3YXJlICovCisJ YTZ4eF9nbXVfaXJxX2Rpc2FibGUoZ211KTsKKworCS8qIFRlbGwgUlBNaCB0byBwb3dlciBvZmYg dGhlIEdQVSAqLworCWE2eHhfcnBtaF9zdG9wKGdtdSk7CisKKwlhNnh4X2dtdV9kaXNhYmxlX2Ns b2NrcyhnbXUpOworCWE2eHhfZ211X2Rpc2FibGVfZ2RzYyhnbXUpOworCisJcmV0dXJuIDA7Cit9 CisKK3N0YXRpYyB2b2lkIGE2eHhfZ211X21lbW9yeV9mcmVlKHN0cnVjdCBhNnh4X2dtdSAqZ211 LCBzdHJ1Y3QgYTZ4eF9nbXVfYm8gKmJvKQoreworCWludCBjb3VudCwgaTsKKwl1NjQgaW92YTsK KworCWlmIChJU19FUlJfT1JfTlVMTChibykpCisJCXJldHVybjsKKworCWNvdW50ID0gYm8tPnNp emUgPj4gUEFHRV9TSElGVDsKKwlpb3ZhID0gYm8tPmlvdmE7CisKKwlwbV9ydW50aW1lX2dldF9z dXBwbGllcnMoZ211LT5kZXYpOworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrLCBpb3ZhICs9 IFBBR0VfU0laRSkgeworCQlpb21tdV91bm1hcChnbXUtPmRvbWFpbiwgaW92YSwgUEFHRV9TSVpF KTsKKwkJX19mcmVlX3BhZ2VzKGJvLT5wYWdlc1tpXSwgMCk7CisJfQorCXBtX3J1bnRpbWVfcHV0 X3N1cHBsaWVycyhnbXUtPmRldik7CisKKwlrZnJlZShiby0+cGFnZXMpOworCWtmcmVlKGJvKTsK K30KKworc3RhdGljIHN0cnVjdCBhNnh4X2dtdV9ibyAqYTZ4eF9nbXVfbWVtb3J5X2FsbG9jKHN0 cnVjdCBhNnh4X2dtdSAqZ211LAorCQlzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgYTZ4eF9nbXVf Ym8gKmJvOworCWludCByZXQsIGNvdW50LCBpOworCisJYm8gPSBremFsbG9jKHNpemVvZigqYm8p LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJvKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwor CWJvLT5zaXplID0gUEFHRV9BTElHTihzaXplKTsKKworCWNvdW50ID0gYm8tPnNpemUgPj4gUEFH RV9TSElGVDsKKworCWJvLT5wYWdlcyA9IGtjYWxsb2MoY291bnQsIHNpemVvZihzdHJ1Y3QgcGFn ZSAqKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFiby0+cGFnZXMpIHsKKwkJa2ZyZWUoYm8pOworCQly ZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkr KykgeworCQliby0+cGFnZXNbaV0gPSBhbGxvY19wYWdlKEdGUF9LRVJORUwpOworCQlpZiAoIWJv LT5wYWdlc1tpXSkKKwkJCWdvdG8gZXJyOworCX0KKworCWJvLT5pb3ZhID0gZ211LT51bmNhY2hl ZF9pb3ZhX2Jhc2U7CisKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQlyZXQgPSBp b21tdV9tYXAoZ211LT5kb21haW4sCisJCQliby0+aW92YSArIChQQUdFX1NJWkUgKiBpKSwKKwkJ CXBhZ2VfdG9fcGh5cyhiby0+cGFnZXNbaV0pLCBQQUdFX1NJWkUsCisJCQlJT01NVV9SRUFEIHwg SU9NTVVfV1JJVEUpOworCisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoZ211LT5kZXYsICJVbmFi bGUgdG8gbWFwIEdNVSBidWZmZXIgb2JqZWN0XG4iKTsKKworCQkJcG1fcnVudGltZV9nZXRfc3Vw cGxpZXJzKGdtdS0+ZGV2KTsKKwkJCWZvciAoaSA9IGkgLSAxIDsgaSA+PSAwOyBpLS0pIHsKKwkJ CQlpb21tdV91bm1hcChnbXUtPmRvbWFpbiwKKwkJCQkJYm8tPmlvdmEgKyAoUEFHRV9TSVpFICog aSksCisJCQkJCVBBR0VfU0laRSk7CisJCQl9CisJCQlwbV9ydW50aW1lX3B1dF9zdXBwbGllcnMo Z211LT5kZXYpOworCisJCQlnb3RvIGVycjsKKwkJfQorCX0KKworCWJvLT52aXJ0ID0gdm1hcChi by0+cGFnZXMsIGNvdW50LCBWTV9JT1JFTUFQLAorCQlwZ3Byb3Rfd3JpdGVjb21iaW5lKFBBR0Vf S0VSTkVMKSk7CisJaWYgKCFiby0+dmlydCkKKwkJZ290byBlcnI7CisKKwkvKiBBbGlnbiBmdXR1 cmUgSU9WQSBhZGRyZXNzZXMgb24gMU1CIGJvdW5kYXJpZXMgKi8KKwlnbXUtPnVuY2FjaGVkX2lv dmFfYmFzZSArPSBBTElHTihzaXplLCBTWl8xTSk7CisKKwlyZXR1cm4gYm87CisKK2VycjoKKwlm b3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQlpZiAoYm8tPnBhZ2VzW2ldKQorCQkJX19m cmVlX3BhZ2VzKGJvLT5wYWdlc1tpXSwgMCk7CisJfQorCisJa2ZyZWUoYm8tPnBhZ2VzKTsKKwlr ZnJlZShibyk7CisKKwlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKK30KKworc3RhdGljIGludCBh Nnh4X2dtdV9tZW1vcnlfcHJvYmUoc3RydWN0IGE2eHhfZ211ICpnbXUpCit7CisJaW50IHJldDsK KworCS8qCisJICogVGhlIEdNVSBhZGRyZXNzIHNwYWNlIGlzIGhhcmRjb2RlZCB0byB0cmVhdCB0 aGUgcmFuZ2UKKwkgKiAweDYwMDAwMDAwIC0gMHg4MDAwMDAwMCBhcyB1bi1jYWNoZWQgbWVtb3J5 LiBBbGwgYnVmZmVycyBzaGFyZWQKKwkgKiBiZXR3ZWVuIHRoZSBHTVUgYW5kIHRoZSBDUFUgd2ls bCBsaXZlIGluIHRoaXMgc3BhY2UKKwkgKi8KKwlnbXUtPnVuY2FjaGVkX2lvdmFfYmFzZSA9IDB4 NjAwMDAwMDA7CisKKworCWdtdS0+ZG9tYWluID0gaW9tbXVfZG9tYWluX2FsbG9jKCZwbGF0Zm9y bV9idXNfdHlwZSk7CisJaWYgKCFnbXUtPmRvbWFpbikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlw bV9ydW50aW1lX2dldF9zdXBwbGllcnMoZ211LT5kZXYpOworCXJldCA9IGlvbW11X2F0dGFjaF9k ZXZpY2UoZ211LT5kb21haW4sIGdtdS0+ZGV2KTsKKworCWlmIChyZXQpIHsKKwkJaW9tbXVfZG9t YWluX2ZyZWUoZ211LT5kb21haW4pOworCQlnbXUtPmRvbWFpbiA9IE5VTEw7CisJfQorCisJcG1f cnVudGltZV9wdXRfc3VwcGxpZXJzKGdtdS0+ZGV2KTsKKwlyZXR1cm4gcmV0OworfQorCisvKiBH ZXQgdGhlIGxpc3Qgb2YgUlBNaCB2b2x0YWdlIGxldmVscyBmcm9tIGNtZC1kYiAqLworc3RhdGlj IGludCBhNnh4X2dtdV9ycG1oX2FyY19jbWRzKGNvbnN0IGNoYXIgKmlkLCB2b2lkICp2YWxzLCBp bnQgc2l6ZSkKK3sKKwl1MzIgbGVuID0gY21kX2RiX2dldF9hdXhfZGF0YV9sZW4oaWQpOworCisJ aWYgKCFsZW4pCisJCXJldHVybiAwOworCisJaWYgKFdBUk5fT04obGVuID4gc2l6ZSkpCisJCXJl dHVybiAtRUlOVkFMOworCisJY21kX2RiX2dldF9hdXhfZGF0YShpZCwgdmFscywgbGVuKTsKKwor CS8qCisJICogVGhlIGRhdGEgY29tZXMgYmFjayBhcyBhbiBhcnJheSBvZiB1bnNpZ25lZCBzaG9y dHMgc28gYWRqdXN0IHRoZQorCSAqIGNvdW50IGFjY29yZGluZ2x5CisJICovCisJcmV0dXJuIGxl biA+PiAxOworfQorCisvKiBSZXR1cm4gdGhlICdhcmMtbGV2ZWwnIGZvciB0aGUgZ2l2ZW4gZnJl cXVlbmN5ICovCitzdGF0aWMgdTMyIGE2eHhfZ211X2dldF9hcmNfbGV2ZWwoc3RydWN0IGRldmlj ZSAqZGV2LCB1bnNpZ25lZCBsb25nIGZyZXEpCit7CisJc3RydWN0IGRldl9wbV9vcHAgKm9wcDsK KwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworCXUzMiB2YWwgPSAwOworCisJaWYgKCFmcmVxKQor CQlyZXR1cm4gMDsKKworCW9wcCAgPSBkZXZfcG1fb3BwX2ZpbmRfZnJlcV9leGFjdChkZXYsIGZy ZXEsIHRydWUpOworCWlmIChJU19FUlIob3BwKSkKKwkJcmV0dXJuIDA7CisKKwlucCA9IGRldl9w bV9vcHBfZ2V0X29mX25vZGUob3BwKTsKKworCWlmIChucCkgeworCQlvZl9wcm9wZXJ0eV9yZWFk X3UzMihucCwgInFjb20sbGV2ZWwiLCAmdmFsKTsKKwkJb2Zfbm9kZV9wdXQobnApOworCX0KKwor CWRldl9wbV9vcHBfcHV0KG9wcCk7CisKKwlyZXR1cm4gdmFsOworfQorCisKK3N0YXRpYyBpbnQg YTZ4eF9nbXVfcnBtaF9hcmNfdm90ZXNfaW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYsIHUzMiAqdm90 ZXMsCisJCXVuc2lnbmVkIGxvbmcgKmZyZXFzLCBpbnQgZnJlcXNfY291bnQsCisJCXUxNiAqcHJp LCBpbnQgcHJpX2NvdW50LAorCQl1MTYgKnNlYywgaW50IHNlY19jb3VudCkKK3sKKwlpbnQgaSwg ajsKKworCS8qIENvbnN0cnVjdCBhIHZvdGUgZm9yIGVhY2ggZnJlcXVlbmN5ICovCisJZm9yIChp ID0gMDsgaSA8IGZyZXFzX2NvdW50OyBpKyspIHsKKwkJdTggcGluZGV4ID0gMCwgc2luZGV4ID0g MDsKKwkJdTMyIGxldmVsID0gYTZ4eF9nbXVfZ2V0X2FyY19sZXZlbChkZXYsIGZyZXFzW2ldKTsK KworCQkvKiBHZXQgdGhlIHByaW1hcnkgaW5kZXggdGhhdCBtYXRjaGVzIHRoZSBhcmMgbGV2ZWwg Ki8KKwkJZm9yIChqID0gMDsgaiA8IHByaV9jb3VudDsgaisrKSB7CisJCQlpZiAocHJpW2pdID09 IGxldmVsKSB7CisJCQkJcGluZGV4ID0gajsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlm IChqID09IHByaV9jb3VudCkgeworCQkJZGV2X2VycihkZXYsCisJCQkJIkxldmVsICV1IG5vdCBm b3VuZCBpbiBpbiB0aGUgUlBNaCBsaXN0XG4iLAorCQkJCQlsZXZlbCk7CisJCQlkZXZfZXJyKGRl diwgIkF2YWlsYWJsZSBsZXZlbHM6XG4iKTsKKwkJCWZvciAoaiA9IDA7IGogPCBwcmlfY291bnQ7 IGorKykKKwkJCQlkZXZfZXJyKGRldiwgIiAgJXVcbiIsIHByaVtqXSk7CisKKwkJCXJldHVybiAt RUlOVkFMOworCQl9CisKKwkJLyoKKwkJICogTG9vayBmb3IgYSBsZXZlbCBpbiBpbiB0aGUgc2Vj b25kYXJ5IGxpc3QgdGhhdCBtYXRjaGVzLiBJZgorCQkgKiBub3RoaW5nIGZpdHMsIHVzZSB0aGUg bWF4aW11bQorCQkgKi8KKwkJc2luZGV4ID0gc2VjX2NvdW50IC0gMTsKKworCQlmb3IgKGogPSAw OyBqIDwgc2VjX2NvdW50IC0gMTsgaisrKSB7CisJCQlpZiAoc2VjW2pdID49IGxldmVsKQorCQkJ CXNpbmRleCA9IGo7CisJCX0KKworCQkvKiBDb25zdHJ1Y3QgdGhlIHZvdGUgKi8KKwkJdm90ZXNb aV0gPSAoKGxldmVsICYgMHhmZmZmKSA8PCAxNikgfCBzaW5kZXggPDwgOCB8IHBpbmRleDsKKwl9 CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoZSBHTVUgdm90ZXMgd2l0aCB0aGUgUlBNaCBm b3IgaXRzZWxmIGFuZCBvbiBiZWhhbGYgb2YgdGhlIEdQVSBidXQgd2UgbmVlZAorICogdG8gY29u c3RydWN0IHRoZSBsaXN0IG9mIHZvdGVzIG9uIHRoZSBDUFUgYW5kIHNlbmQgaXQgb3Zlci4gUXVl cnkgdGhlIFJQTWgKKyAqIHZvbHRhZ2UgbGV2ZWxzIGFuZCBidWlsZCB0aGUgdm90ZXMKKyAqLwor CitzdGF0aWMgaW50IGE2eHhfZ211X3JwbWhfdm90ZXNfaW5pdChzdHJ1Y3QgYTZ4eF9nbXUgKmdt dSkKK3sKKwlzdHJ1Y3QgYTZ4eF9ncHUgKmE2eHhfZ3B1ID0gY29udGFpbmVyX29mKGdtdSwgc3Ry dWN0IGE2eHhfZ3B1LCBnbXUpOworCXN0cnVjdCBhZHJlbm9fZ3B1ICphZHJlbm9fZ3B1ID0gJmE2 eHhfZ3B1LT5iYXNlOworCXN0cnVjdCBtc21fZ3B1ICpncHUgPSAmYWRyZW5vX2dwdS0+YmFzZTsK KworCXUxNiBneFsxNl0sIGN4WzE2XSwgbXhbMTZdOworCXUzMiBneGNvdW50LCBjeGNvdW50LCBt eGNvdW50OworCWludCByZXQ7CisKKwkvKiBHZXQgdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIHZvbHRh Z2UgbGV2ZWxzIGZvciBlYWNoIGNvbXBvbmVudCAqLworCWd4Y291bnQgPSBhNnh4X2dtdV9ycG1o X2FyY19jbWRzKCJnZngubHZsIiwgZ3gsIHNpemVvZihneCkpOworCWN4Y291bnQgPSBhNnh4X2dt dV9ycG1oX2FyY19jbWRzKCJjeC5sdmwiLCBjeCwgc2l6ZW9mKGN4KSk7CisJbXhjb3VudCA9IGE2 eHhfZ211X3JwbWhfYXJjX2NtZHMoIm14Lmx2bCIsIG14LCBzaXplb2YobXgpKTsKKworCS8qIEJ1 aWxkIHRoZSBHWCB2b3RlcyAqLworCXJldCA9IGE2eHhfZ211X3JwbWhfYXJjX3ZvdGVzX2luaXQo JmdwdS0+cGRldi0+ZGV2LCBnbXUtPmd4X2FyY192b3RlcywKKwkJZ211LT5ncHVfZnJlcXMsIGdt dS0+bnJfZ3B1X2ZyZXFzLAorCQlneCwgZ3hjb3VudCwgbXgsIG14Y291bnQpOworCisJLyogQnVp bGQgdGhlIENYIHZvdGVzICovCisJcmV0IHw9IGE2eHhfZ211X3JwbWhfYXJjX3ZvdGVzX2luaXQo Z211LT5kZXYsIGdtdS0+Y3hfYXJjX3ZvdGVzLAorCQlnbXUtPmdtdV9mcmVxcywgZ211LT5ucl9n bXVfZnJlcXMsCisJCWN4LCBjeGNvdW50LCBteCwgbXhjb3VudCk7CisKKwlyZXR1cm4gcmV0Owor fQorCitzdGF0aWMgaW50IGE2eHhfZ211X2J1aWxkX2ZyZXFfdGFibGUoc3RydWN0IGRldmljZSAq ZGV2LCB1bnNpZ25lZCBsb25nICpmcmVxcywKKwkJdTMyIHNpemUpCit7CisJaW50IGNvdW50ID0g ZGV2X3BtX29wcF9nZXRfb3BwX2NvdW50KGRldik7CisJc3RydWN0IGRldl9wbV9vcHAgKm9wcDsK KwlpbnQgaSwgaW5kZXggPSAwOworCXVuc2lnbmVkIGxvbmcgZnJlcSA9IDE7CisKKwkvKgorCSAq IFRoZSBPUFAgdGFibGUgZG9lc24ndCBjb250YWluIHRoZSAib2ZmIiBmcmVxdWVuY3kgbGV2ZWwg c28gd2UgbmVlZCB0bworCSAqIGFkZCAxIHRvIHRoZSB0YWJsZSBzaXplIHRvIGFjY291bnQgZm9y IGl0CisJICovCisKKwlpZiAoV0FSTihjb3VudCArIDEgPiBzaXplLAorCQkiVGhlIEdNVSBmcmVx dWVuY3kgdGFibGUgaXMgYmVpbmcgdHJ1bmNhdGVkXG4iKSkKKwkJY291bnQgPSBzaXplIC0gMTsK KworCS8qIFNldCB0aGUgIm9mZiIgZnJlcXVlbmN5ICovCisJZnJlcXNbaW5kZXgrK10gPSAwOwor CisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJb3BwID0gZGV2X3BtX29wcF9maW5k X2ZyZXFfY2VpbChkZXYsICZmcmVxKTsKKwkJaWYgKElTX0VSUihvcHApKQorCQkJYnJlYWs7CisK KwkJZGV2X3BtX29wcF9wdXQob3BwKTsKKwkJZnJlcXNbaW5kZXgrK10gPSBmcmVxKys7CisJfQor CisJcmV0dXJuIGluZGV4OworfQorCitzdGF0aWMgaW50IGE2eHhfZ211X3B3cmxldmVsc19wcm9i ZShzdHJ1Y3QgYTZ4eF9nbXUgKmdtdSkKK3sKKwlzdHJ1Y3QgYTZ4eF9ncHUgKmE2eHhfZ3B1ID0g Y29udGFpbmVyX29mKGdtdSwgc3RydWN0IGE2eHhfZ3B1LCBnbXUpOworCXN0cnVjdCBhZHJlbm9f Z3B1ICphZHJlbm9fZ3B1ID0gJmE2eHhfZ3B1LT5iYXNlOworCXN0cnVjdCBtc21fZ3B1ICpncHUg PSAmYWRyZW5vX2dwdS0+YmFzZTsKKworCWludCByZXQgPSAwOworCisJLyoKKwkgKiBUaGUgR01V IGhhbmRsZXMgaXRzIG93biBmcmVxdWVuY3kgc3dpdGNoaW5nIHNvIGJ1aWxkIGEgbGlzdCBvZgor CSAqIGF2YWlsYWJsZSBmcmVxdWVuY2llcyB0byBzZW5kIGR1cmluZyBpbml0YWxpemF0aW9uCisJ ICovCisJcmV0ID0gZGV2X3BtX29wcF9vZl9hZGRfdGFibGUoZ211LT5kZXYpOworCWlmIChyZXQp IHsKKwkJZGV2X2VycihnbXUtPmRldiwgIlVuYWJsZSB0byBzZXQgdGhlIE9QUCB0YWJsZSBmb3Ig dGhlIEdNVVxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJZ211LT5ucl9nbXVfZnJlcXMgPSBh Nnh4X2dtdV9idWlsZF9mcmVxX3RhYmxlKGdtdS0+ZGV2LAorCQlnbXUtPmdtdV9mcmVxcywgQVJS QVlfU0laRShnbXUtPmdtdV9mcmVxcykpOworCisJLyoKKwkgKiBUaGUgR01VIGFsc28gaGFuZGxl cyBHUFUgZnJlcXVlbmN5IHN3aXRjaGluZyBzbyBidWlsZCBhIGxpc3QKKwkgKiBmcm9tIHRoZSBH UFUgT1BQIHRhYmxlCisJICovCisJZ211LT5ucl9ncHVfZnJlcXMgPSBhNnh4X2dtdV9idWlsZF9m cmVxX3RhYmxlKCZncHUtPnBkZXYtPmRldiwKKwkJZ211LT5ncHVfZnJlcXMsIEFSUkFZX1NJWkUo Z211LT5ncHVfZnJlcXMpKTsKKworCS8qIEJ1aWxkIHRoZSBsaXN0IG9mIFJQTWggdm90ZXMgdGhh dCB3ZSdsbCBzZW5kIHRvIHRoZSBHTVUgKi8KKwlyZXR1cm4gYTZ4eF9nbXVfcnBtaF92b3Rlc19p bml0KGdtdSk7Cit9CisKK3N0YXRpYyBpbnQgYTZ4eF9nbXVfY2xvY2tzX3Byb2JlKHN0cnVjdCBh Nnh4X2dtdSAqZ211KQoreworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKKwljb25zdCBjaGFyICpu YW1lOworCWludCBpID0gMDsKKworCWdtdS0+bnJfY2xvY2tzID0gb2ZfcHJvcGVydHlfY291bnRf c3RyaW5ncyhnbXUtPmRldi0+b2Zfbm9kZSwKKwkJImNsb2NrLW5hbWVzIik7CisKKwlpZiAoZ211 LT5ucl9jbG9ja3MgPCAxKSB7CisJCWRldl9lcnIoZ211LT5kZXYsICJObyBjbG9ja3MgaGF2ZSBi ZWVuIGRlZmluZWRcbiIpOworCQlnbXUtPm5yX2Nsb2NrcyA9IDA7CisJCXJldHVybiAwOworCX0K KworCWdtdS0+Y2xvY2tzID0gZGV2bV9rY2FsbG9jKGdtdS0+ZGV2LCBzaXplb2Yoc3RydWN0IGNs ayAqKSwKKwkJZ211LT5ucl9jbG9ja3MsIEdGUF9LRVJORUwpOworCWlmICghZ211LT5jbG9ja3Mp IHsKKwkJZ211LT5ucl9jbG9ja3MgPSAwOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlvZl9w cm9wZXJ0eV9mb3JfZWFjaF9zdHJpbmcoZ211LT5kZXYtPm9mX25vZGUsICJjbG9jay1uYW1lcyIs IHByb3AsCisJCW5hbWUpIHsKKwkJZ211LT5jbG9ja3NbaV0gPSBkZXZtX2Nsa19nZXQoZ211LT5k ZXYsIG5hbWUpOworCQlpZiAoSVNfRVJSKGdtdS0+Y2xvY2tzW2ldKSkgeworCQkJaW50IHJldCA9 IFBUUl9FUlIoZ211LT5jbG9ja3NbaV0pOworCisJCQlkZXZfZXJyKGdtdS0+ZGV2LCAiVW5hYmxl IHRvIGFsbG9jYXRlIGNsb2NrICVzOiAlZFxuIiwKKwkJCQluYW1lLCByZXQpOworCQl9CisKKwkJ aWYgKHN0cmNtcChuYW1lLCAiZ211IikgfHwgc3RyY21wKG5hbWUsICJnbXVfY2xrIikpCisJCQln bXUtPmNvcmVfY2xrID0gZ211LT5jbG9ja3NbaV07CisKKwkJaSsrOworCX0KKworCXJldHVybiAw OworfQorCitzdGF0aWMgdm9pZCBfX2lvbWVtICphNnh4X2dtdV9nZXRfbW1pbyhzdHJ1Y3QgcGxh dGZvcm1fZGV2aWNlICpwZGV2LAorCQljb25zdCBjaGFyICpuYW1lKQoreworCXZvaWQgX19pb21l bSAqcmV0OworCXN0cnVjdCByZXNvdXJjZSAqcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlX2J5 bmFtZShwZGV2LAorCQkJSU9SRVNPVVJDRV9NRU0sIG5hbWUpOworCisJaWYgKCFyZXMpIHsKKwkJ ZGV2X2VycigmcGRldi0+ZGV2LCAiVW5hYmxlIHRvIGZpbmQgdGhlICVzIHJlZ2lzdGVyc1xuIiwg bmFtZSk7CisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCX0KKworCXJldCA9IGRldm1faW9y ZW1hcCgmcGRldi0+ZGV2LCByZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOworCWlmICgh cmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIlVuYWJsZSB0byBtYXAgdGhlICVzIHJlZ2lz dGVyc1xuIiwgbmFtZSk7CisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCX0KKworCXJldHVy biByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYTZ4eF9nbXVfZ2V0X2lycShzdHJ1Y3QgYTZ4eF9nbXUg KmdtdSwgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJY29uc3QgY2hhciAqbmFtZSwg aXJxX2hhbmRsZXJfdCBoYW5kbGVyKQoreworCWludCBpcnEsIHJldDsKKworCWlycSA9IHBsYXRm b3JtX2dldF9pcnFfYnluYW1lKHBkZXYsIG5hbWUpOworCisJcmV0ID0gZGV2bV9yZXF1ZXN0X2ly cSgmcGRldi0+ZGV2LCBpcnEsIGhhbmRsZXIsIElSUUZfVFJJR0dFUl9ISUdILAorCQluYW1lLCBn bXUpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiVW5hYmxlIHRvIGdldCBp bnRlcnJ1cHQgJXNcbiIsIG5hbWUpOworCQlyZXR1cm4gcmV0OworCX0KKworCWRpc2FibGVfaXJx KGlycSk7CisKKwlyZXR1cm4gaXJxOworfQorCit2b2lkIGE2eHhfZ211X3JlbW92ZShzdHJ1Y3Qg YTZ4eF9ncHUgKmE2eHhfZ3B1KQoreworCXN0cnVjdCBhNnh4X2dtdSAqZ211ID0gJmE2eHhfZ3B1 LT5nbXU7CisKKwlpZiAoSVNfRVJSX09SX05VTEwoZ211LT5tbWlvKSkKKwkJcmV0dXJuOworCisJ YTZ4eF9nbXVfc3RvcChhNnh4X2dwdSk7CisKKwlhNnh4X2dtdV9pcnFfZGlzYWJsZShnbXUpOwor CWE2eHhfZ211X21lbW9yeV9mcmVlKGdtdSwgZ211LT5oZmkpOworCisJcG1fcnVudGltZV9nZXRf c3VwcGxpZXJzKGdtdS0+ZGV2KTsKKwlpb21tdV9kZXRhY2hfZGV2aWNlKGdtdS0+ZG9tYWluLCBn bXUtPmRldik7CisJcG1fcnVudGltZV9wdXRfc3VwcGxpZXJzKGdtdS0+ZGV2KTsKKworCWlvbW11 X2RvbWFpbl9mcmVlKGdtdS0+ZG9tYWluKTsKK30KKworaW50IGE2eHhfZ211X3Byb2JlKHN0cnVj dCBhNnh4X2dwdSAqYTZ4eF9ncHUsIHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSkKK3sKKwlzdHJ1 Y3QgYTZ4eF9nbXUgKmdtdSA9ICZhNnh4X2dwdS0+Z211OworCXN0cnVjdCBwbGF0Zm9ybV9kZXZp Y2UgKnBkZXYgPSBvZl9maW5kX2RldmljZV9ieV9ub2RlKG5vZGUpOworCWludCByZXQ7CisKKwlp ZiAoIXBkZXYpCisJCXJldHVybiAtRU5PREVWOworCisJZ211LT5kZXYgPSAmcGRldi0+ZGV2Owor CisJb2ZfZG1hX2NvbmZpZ3VyZShnbXUtPmRldiwgbm9kZSk7CisKKwkvKiBGb3cgbm93LCBkb24n dCBkbyBhbnl0aGluZyBmYW5jeSB1bnRpbCB3ZSBnZXQgb3VyIGZlZXQgdW5kZXIgdXMgKi8KKwln bXUtPmlkbGVfbGV2ZWwgPSBHTVVfSURMRV9TVEFURV9BQ1RJVkU7CisKKwlnbXUtPmN4ID0gZGV2 bV9yZWd1bGF0b3JfZ2V0KGdtdS0+ZGV2LCAidmRkY3giKTsKKwlnbXUtPmd4ID0gZGV2bV9yZWd1 bGF0b3JfZ2V0KGdtdS0+ZGV2LCAidmRkIik7CisKKwkvKiBHZXQgdGhlIGxpc3Qgb2YgY2xvY2tz ICovCisJcmV0ID0gYTZ4eF9nbXVfY2xvY2tzX3Byb2JlKGdtdSk7CisJaWYgKHJldCkKKwkJcmV0 dXJuIHJldDsKKworCS8qIFNldCB1cCB0aGUgSU9NTVUgY29udGV4dCBiYW5rICovCisJcmV0ID0g YTZ4eF9nbXVfbWVtb3J5X3Byb2JlKGdtdSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwor CS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgZm9yIHRoZSBIRkkgcXVldWVzICovCisJZ211LT5oZmkg PSBhNnh4X2dtdV9tZW1vcnlfYWxsb2MoZ211LCBTWl8xNkspOworCWlmIChJU19FUlIoZ211LT5o ZmkpKQorCQlnb3RvIGVycjsKKworCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIEdNVSBkZWJ1 ZyByZWdpb24gKi8KKwlnbXUtPmRlYnVnID0gYTZ4eF9nbXVfbWVtb3J5X2FsbG9jKGdtdSwgU1pf MTZLKTsKKwlpZiAoSVNfRVJSKGdtdS0+ZGVidWcpKQorCQlnb3RvIGVycjsKKworCS8qIE1hcCB0 aGUgR01VIHJlZ2lzdGVycyAqLworCWdtdS0+bW1pbyA9IGE2eHhfZ211X2dldF9tbWlvKHBkZXYs ICJnbXUiKTsKKworCS8qIE1hcCB0aGUgR1BVIHBvd2VyIGRvbWFpbiBjb250cm9sbGVyIHJlZ2lz dGVycyAqLworCWdtdS0+cGRjX21taW8gPSBhNnh4X2dtdV9nZXRfbW1pbyhwZGV2LCAiZ211X3Bk YyIpOworCisJaWYgKElTX0VSUihnbXUtPm1taW8pIHx8IElTX0VSUihnbXUtPnBkY19tbWlvKSkK KwkJZ290byBlcnI7CisKKwkvKiBHZXQgdGhlIEhGSSBhbmQgR01VIGludGVycnVwdHMgKi8KKwln bXUtPmhmaV9pcnEgPSBhNnh4X2dtdV9nZXRfaXJxKGdtdSwgcGRldiwgImhmaSIsIGE2eHhfaGZp X2lycSk7CisJZ211LT5nbXVfaXJxID0gYTZ4eF9nbXVfZ2V0X2lycShnbXUsIHBkZXYsICJnbXUi LCBhNnh4X2dtdV9pcnEpOworCisJaWYgKGdtdS0+aGZpX2lycSA8IDAgfHwgZ211LT5nbXVfaXJx IDwgMCkKKwkJZ290byBlcnI7CisKKwkvKiBTZXQgdXAgYSB0YXNrbGV0IHRvIGhhbmRsZSBHTVUg SEZJIHJlc3BvbnNlcyAqLworCXRhc2tsZXRfaW5pdCgmZ211LT5oZmlfdGFza2xldCwgYTZ4eF9o ZmlfdGFzaywgKHVuc2lnbmVkIGxvbmcpIGdtdSk7CisKKwkvKiBHZXQgdGhlIHBvd2VyIGxldmVs cyBmb3IgdGhlIEdNVSBhbmQgR1BVICovCisJYTZ4eF9nbXVfcHdybGV2ZWxzX3Byb2JlKGdtdSk7 CisKKwkvKiBTZXQgdXAgdGhlIEhGSSBxdWV1ZXMgKi8KKwlhNnh4X2hmaV9pbml0KGdtdSk7CisK KwlyZXR1cm4gMDsKK2VycjoKKwlhNnh4X2dtdV9tZW1vcnlfZnJlZShnbXUsIGdtdS0+aGZpKTsK KworCWlmIChnbXUtPmRvbWFpbikgeworCQlwbV9ydW50aW1lX2dldF9zdXBwbGllcnMoZ211LT5k ZXYpOworCQlpb21tdV9kZXRhY2hfZGV2aWNlKGdtdS0+ZG9tYWluLCBnbXUtPmRldik7CisJCXBt X3J1bnRpbWVfcHV0X3N1cHBsaWVycyhnbXUtPmRldik7CisKKwkJaW9tbXVfZG9tYWluX2ZyZWUo Z211LT5kb21haW4pOworCX0KKworCXJldHVybiAtRU5PREVWOworfQpkaWZmIC0tZ2l0IGEvZHJp dmVycy9ncHUvZHJtL21zbS9hZHJlbm8vYTZ4eF9nbXUuaCBiL2RyaXZlcnMvZ3B1L2RybS9tc20v YWRyZW5vL2E2eHhfZ211LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAw Li45ZThkNDYwN2RmNjkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2Fk cmVuby9hNnh4X2dtdS5oCkBAIC0wLDAgKzEsMTYyIEBACisvKiBTUERYLUxpY2Vuc2UtSWRlbnRp ZmllcjogR1BMLTIuMCAqLworLyogQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBMaW51eCBGb3VuZGF0 aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAqLworCisjaWZuZGVmIF9BNlhYX0dNVV9IXworI2Rl ZmluZSBfQTZYWF9HTVVfSF8KKworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1 ZGUgIm1zbV9kcnYuaCIKKyNpbmNsdWRlICJhNnh4X2hmaS5oIgorCitzdHJ1Y3QgYTZ4eF9nbXVf Ym8geworCXZvaWQgKnZpcnQ7CisJc2l6ZV90IHNpemU7CisJdTY0IGlvdmE7CisJc3RydWN0IHBh Z2UgKipwYWdlczsKK307CisKKy8qCisgKiBUaGVzZSBkZWZpbmUgdGhlIGRpZmZlcmVudCBHTVUg d2FrZSB1cCBvcHRpb25zIC0gdGhlc2UgZGVmaW5lIGhvdyBib3RoIHRoZQorICogQ1BVIGFuZCB0 aGUgR01VIGJyaW5nIHVwIHRoZSBoYXJkd2FyZQorICovCisKKy8qIFRIZSBHTVUgaGFzIGFscmVh ZHkgYmVlbiBib290ZWQgYW5kIHRoZSByZW50ZW50aW9uIHJlZ2lzdGVycyBhcmUgYWN0aXZlICov CisjZGVmaW5lIEdNVV9XQVJNX0JPT1QgMAorCisvKiB0aGUgR01VIGlzIGNvbWluZyB1cCBmb3Ig dGhlIGZpcnN0IHRpbWUgb3IgYmFjayBmcm9tIGEgcG93ZXIgY29sbGFwc2UgKi8KKyNkZWZpbmUg R01VX0NPTERfQk9PVCAxCisKKy8qIFRoZSBHTVUgaXMgYmVpbmcgc29mdCByZXNldCBhZnRlciBh IGZhdWx0ICovCisjZGVmaW5lIEdNVV9SRVNFVCAyCisKKy8qCisgKiBUaGVzZSBkZWZpbmUgdGhl IGxldmVsIG9mIGNvbnRyb2wgdGhhdCB0aGUgR01VIGhhcyAtIHRoZSBoaWdoZXIgdGhlIG51bWJl cgorICogdGhlIG1vcmUgdGhpbmdzIHRoYXQgdGhlIEdNVSBoYXJkd2FyZSBjb250cm9scyBvbiBp dHMgb3duLgorICovCisKKy8qIFRoZSBHTVUgZG9lcyBub3QgZG8gYW55IGlkbGUgc3RhdGUgbWFu YWdlbWVudCAqLworI2RlZmluZSBHTVVfSURMRV9TVEFURV9BQ1RJVkUgMAorCisvKiBUaGUgR01V IG1hbmFnZXMgU1BUUCBwb3dlciBjb2xsYXBzZSAqLworI2RlZmluZSBHTVVfSURMRV9TVEFURV9T UFRQIDIKKworLyogVGhlIEdNVSBkb2VzIGF1dG9tYXRpYyBJRlBDIChpbnRyYS1mcmFtZSBwb3dl ciBjb2xsYXBzZSkgKi8KKyNkZWZpbmUgR01VX0lETEVfU1RBVEVfSUZQQyAzCisKK3N0cnVjdCBh Nnh4X2dtdSB7CisJc3RydWN0IGRldmljZSAqZGV2OworCisJdm9pZCAqIF9faW9tZW0gbW1pbzsK Kwl2b2lkICogX19pb21lbSBwZGNfbW1pbzsKKworCWludCBoZmlfaXJxOworCWludCBnbXVfaXJx OworCisJc3RydWN0IHJlZ3VsYXRvciAqY3g7CisJc3RydWN0IHJlZ3VsYXRvciAqZ3g7CisKKwlz dHJ1Y3QgaW9tbXVfZG9tYWluICpkb21haW47CisJdTY0IHVuY2FjaGVkX2lvdmFfYmFzZTsKKwor CWludCBpZGxlX2xldmVsOworCisJc3RydWN0IGE2eHhfZ211X2JvICpoZmk7CisJc3RydWN0IGE2 eHhfZ211X2JvICpkZWJ1ZzsKKworCWludCBucl9jbG9ja3M7CisJc3RydWN0IGNsayAqKmNsb2Nr czsKKwlzdHJ1Y3QgY2xrICpjb3JlX2NsazsKKworCWludCBucl9ncHVfZnJlcXM7CisJdW5zaWdu ZWQgbG9uZyBncHVfZnJlcXNbMTZdOworCXUzMiBneF9hcmNfdm90ZXNbMTZdOworCisJaW50IG5y X2dtdV9mcmVxczsKKwl1bnNpZ25lZCBsb25nIGdtdV9mcmVxc1s0XTsKKwl1MzIgY3hfYXJjX3Zv dGVzWzRdOworCisJc3RydWN0IGE2eHhfaGZpX3F1ZXVlIHF1ZXVlc1syXTsKKworCXN0cnVjdCB0 YXNrbGV0X3N0cnVjdCBoZmlfdGFza2xldDsKK307CisKK3N0YXRpYyBpbmxpbmUgdTMyIGdtdV9y ZWFkKHN0cnVjdCBhNnh4X2dtdSAqZ211LCB1MzIgb2Zmc2V0KQoreworCXJldHVybiBtc21fcmVh ZGwoZ211LT5tbWlvICsgKG9mZnNldCA8PCAyKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBn bXVfd3JpdGUoc3RydWN0IGE2eHhfZ211ICpnbXUsIHUzMiBvZmZzZXQsIHUzMiB2YWx1ZSkKK3sK KwlyZXR1cm4gbXNtX3dyaXRlbCh2YWx1ZSwgZ211LT5tbWlvICsgKG9mZnNldCA8PCAyKSk7Cit9 CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwZGNfd3JpdGUoc3RydWN0IGE2eHhfZ211ICpnbXUsIHUz MiBvZmZzZXQsIHUzMiB2YWx1ZSkKK3sKKwlyZXR1cm4gbXNtX3dyaXRlbCh2YWx1ZSwgZ211LT5w ZGNfbW1pbyArIChvZmZzZXQgPDwgMikpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ211X3Jt dyhzdHJ1Y3QgYTZ4eF9nbXUgKmdtdSwgdTMyIHJlZywgdTMyIG1hc2ssIHUzMiBvcikKK3sKKwl1 MzIgdmFsID0gZ211X3JlYWQoZ211LCByZWcpOworCisJdmFsICY9IH5tYXNrOworCisJZ211X3dy aXRlKGdtdSwgcmVnLCB2YWwgfCBvcik7Cit9CisKKyNkZWZpbmUgZ211X3BvbGxfdGltZW91dChn bXUsIGFkZHIsIHZhbCwgY29uZCwgaW50ZXJ2YWwsIHRpbWVvdXQpIFwKKwlyZWFkbF9wb2xsX3Rp bWVvdXQoKGdtdSktPm1taW8gKyAoKGFkZHIpIDw8IDIpLCB2YWwsIGNvbmQsIFwKKwkJaW50ZXJ2 YWwsIHRpbWVvdXQpCisKKy8qCisgKiBUaGVzZSBhcmUgdGhlIGF2YWlsYWJsZSBPT0IgKG91dCBv ZiBiYW5kIHJlcXVlc3RzKSB0byB0aGUgR01VIHdoZXJlICJvdXQgb2YKKyAqIGJhbmQiIG1lYW5z IHRoYXQgdGhlIENQVSB0YWxrcyB0byB0aGUgR01VIGRpcmVjdGx5IGFuZCBub3QgdGhyb3VnaCBI RkkuCisgKiBOb3JtYWxseSB0aGlzIHdvcmtzIGJ5IHdyaXRpbmcgYSBJVENNL0RUQ00gcmVnaXN0 ZXIgYW5kIHRoZW4gdHJpZ2dlcmluZyBhCisgKiBpbnRlcnJ1cHQgKHRoZSAicmVxdWVzdCIgYml0 KSBhbmQgd2FpdGluZyBmb3IgYW4gYWNrbm93bGVkZ21lbnQgKHRoZSAiYWNrIgorICogYml0KS4g VGhlIHN0YXRlIGlzIGNsZWFyZWQgYnkgd3JpdGluZyB0aGUgImNsZWFyJyBiaXQgdG8gdGhlIEdN VSBpbnRlcnJ1cHQuCisgKgorICogVGhlc2UgYXJlIHVzZWQgdG8gZm9yY2UgdGhlIEdNVS9HUFUg dG8gc3RheSBvbiBkdXJpbmcgYSBjcml0aWNhbCBzZXF1ZW5jZSBvcgorICogZm9yIGhhcmR3YXJl IHdvcmthcm91bmRzLgorICovCisKK2VudW0gYTZ4eF9nbXVfb29iX3N0YXRlIHsKKwlHTVVfT09C X0JPT1RfU0xVTUJFUiA9IDAsCisJR01VX09PQl9HUFVfU0VULAorfTsKKworLyogVGhlc2UgYXJl IHRoZSBpbnRlcnJ1cHQgLyBhY2sgYml0cyBmb3IgZWFjaCBPT0IgcmVxdWVzdCB0aGF0IGFyZSBz ZXQKKyAqIGluIGE2eHhfZ211X3NldF9vb2IgYW5kIGE2eHhfY2xlYXJfb29iCisgKi8KKworLyoK KyAqIExldCB0aGUgR01VIGtub3cgdGhhdCBhIGJvb3Qgb3Igc2x1bWJlciBvcGVyYXRpb24gaGFz IHN0YXJ0ZWQuIFRoZSB2YWx1ZSBpbgorICogUkVHX0E2WFhfR01VX0JPT1RfU0xVTUJFUl9PUFRJ T04gbGV0cyB0aGUgR01VIGtub3cgd2hpY2ggb3BlcmF0aW9uIHdlIGFyZQorICogZG9pbmcKKyAq LworI2RlZmluZSBHTVVfT09CX0JPT1RfU0xVTUJFUl9SRVFVRVNUCTIyCisjZGVmaW5lIEdNVV9P T0JfQk9PVF9TTFVNQkVSX0FDSwkzMAorI2RlZmluZSBHTVVfT09CX0JPT1RfU0xVTUJFUl9DTEVB UgkzMAorCisvKgorICogU2V0IGEgbmV3IHBvd2VyIGxldmVsIGZvciB0aGUgR1BVIHdoZW4gdGhl IENQVSBpcyBkb2luZyBmcmVxdWVuY3kgc2NhbGluZworICovCisjZGVmaW5lIEdNVV9PT0JfRENW U19SRVFVRVNUCTIzCisjZGVmaW5lIEdNVV9PT0JfRENWU19BQ0sJMzEKKyNkZWZpbmUgR01VX09P Ql9EQ1ZTX0NMRUFSCTMxCisKKy8qCisgKiBMZXQgdGhlIEdNVSBrbm93IHRvIG5vdCB0dXJuIG9m ZiBhbnkgR1BVIHJlZ2lzdGVycyB3aGlsZSB0aGUgQ1BVIGlzIGluIGEKKyAqIGNyaXRpY2FsIHNl Y3Rpb24KKyAqLworI2RlZmluZSBHTVVfT09CX0dQVV9TRVRfUkVRVUVTVAkxNgorI2RlZmluZSBH TVVfT09CX0dQVV9TRVRfQUNLCTI0CisjZGVmaW5lIEdNVV9PT0JfR1BVX1NFVF9DTEVBUgkyNAor CisKK3ZvaWQgYTZ4eF9oZmlfaW5pdChzdHJ1Y3QgYTZ4eF9nbXUgKmdtdSk7CitpbnQgYTZ4eF9o Zmlfc3RhcnQoc3RydWN0IGE2eHhfZ211ICpnbXUsIGludCBib290X3N0YXRlKTsKK3ZvaWQgYTZ4 eF9oZmlfc3RvcChzdHJ1Y3QgYTZ4eF9nbXUgKmdtdSk7CisKK3ZvaWQgYTZ4eF9oZmlfdGFzayh1 bnNpZ25lZCBsb25nIGRhdGEpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2Ry bS9tc20vYWRyZW5vL2E2eHhfZ3B1LmMgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2FkcmVuby9hNnh4 X2dwdS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMC4uYWE2MjcyZTQw ZjExCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9hZHJlbm8vYTZ4eF9n cHUuYwpAQCAtMCwwICsxLDgwOCBAQAorLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0y LjAgKi8KKy8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBB bGwgcmlnaHRzIHJlc2VydmVkLiAqLworCisKKyNpbmNsdWRlICJtc21fZ2VtLmgiCisjaW5jbHVk ZSAibXNtX21tdS5oIgorI2luY2x1ZGUgImE2eHhfZ3B1LmgiCisjaW5jbHVkZSAiYTZ4eF9nbXUu eG1sLmgiCisKK3N0YXRpYyBpbmxpbmUgYm9vbCBfYTZ4eF9jaGVja19pZGxlKHN0cnVjdCBtc21f Z3B1ICpncHUpCit7CisJc3RydWN0IGFkcmVub19ncHUgKmFkcmVub19ncHUgPSB0b19hZHJlbm9f Z3B1KGdwdSk7CisJc3RydWN0IGE2eHhfZ3B1ICphNnh4X2dwdSA9IHRvX2E2eHhfZ3B1KGFkcmVu b19ncHUpOworCisJLyogQ2hlY2sgdGhhdCB0aGUgR01VIGlzIGlkbGUgKi8KKwlpZiAoIWE2eHhf Z211X2lzaWRsZSgmYTZ4eF9ncHUtPmdtdSkpCisJCXJldHVybiBmYWxzZTsKKworCS8qIENoZWNr IHRoYSB0aGUgQ1ggbWFzdGVyIGlzIGlkbGUgKi8KKwlpZiAoZ3B1X3JlYWQoZ3B1LCBSRUdfQTZY WF9SQkJNX1NUQVRVUykgJgorCQkJfkE2WFhfUkJCTV9TVEFUVVNfQ1BfQUhCX0JVU1lfQ1hfTUFT VEVSKQorCQlyZXR1cm4gZmFsc2U7CisKKwlyZXR1cm4gIShncHVfcmVhZChncHUsIFJFR19BNlhY X1JCQk1fSU5UXzBfU1RBVFVTKSAmCisJCUE2WFhfUkJCTV9JTlRfMF9NQVNLX1JCQk1fSEFOR19E RVRFQ1QpOworfQorCitib29sIGE2eHhfaWRsZShzdHJ1Y3QgbXNtX2dwdSAqZ3B1LCBzdHJ1Y3Qg bXNtX3JpbmdidWZmZXIgKnJpbmcpCit7CisJLyogd2FpdCBmb3IgQ1AgdG8gZHJhaW4gcmluZ2J1 ZmZlcjogKi8KKwlpZiAoIWFkcmVub19pZGxlKGdwdSwgcmluZykpCisJCXJldHVybiBmYWxzZTsK KworCWlmIChzcGluX3VudGlsKF9hNnh4X2NoZWNrX2lkbGUoZ3B1KSkpIHsKKwkJRFJNX0VSUk9S KCIlczogJXBzOiB0aW1lb3V0IHdhaXRpbmcgZm9yIEdQVSB0byBpZGxlOiBzdGF0dXMgJTguOFgg aXJxICU4LjhYIHJwdHIvd3B0ciAlZC8lZFxuIiwKKwkJCWdwdS0+bmFtZSwgX19idWlsdGluX3Jl dHVybl9hZGRyZXNzKDApLAorCQkJZ3B1X3JlYWQoZ3B1LCBSRUdfQTZYWF9SQkJNX1NUQVRVUyks CisJCQlncHVfcmVhZChncHUsIFJFR19BNlhYX1JCQk1fSU5UXzBfU1RBVFVTKSwKKwkJCWdwdV9y ZWFkKGdwdSwgUkVHX0E2WFhfQ1BfUkJfUlBUUiksCisJCQlncHVfcmVhZChncHUsIFJFR19BNlhY X0NQX1JCX1dQVFIpKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXJldHVybiB0cnVlOworfQor CitzdGF0aWMgdm9pZCBhNnh4X2ZsdXNoKHN0cnVjdCBtc21fZ3B1ICpncHUsIHN0cnVjdCBtc21f cmluZ2J1ZmZlciAqcmluZykKK3sKKwl1aW50MzJfdCB3cHRyOworCXVuc2lnbmVkIGxvbmcgZmxh Z3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcmluZy0+bG9jaywgZmxhZ3MpOworCisJLyogQ29w eSB0aGUgc2hhZG93IHRvIHRoZSBhY3R1YWwgcmVnaXN0ZXIgKi8KKwlyaW5nLT5jdXIgPSByaW5n LT5uZXh0OworCisJLyogTWFrZSBzdXJlIHRvIHdyYXAgd3B0ciBpZiB3ZSBuZWVkIHRvICovCisJ d3B0ciA9IGdldF93cHRyKHJpbmcpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcmluZy0+ bG9jaywgZmxhZ3MpOworCisJLyogTWFrZSBzdXJlIGV2ZXJ5dGhpbmcgaXMgcG9zdGVkIGJlZm9y ZSBtYWtpbmcgYSBkZWNpc2lvbiAqLworCW1iKCk7CisKKwlncHVfd3JpdGUoZ3B1LCBSRUdfQTZY WF9DUF9SQl9XUFRSLCB3cHRyKTsKK30KKworc3RhdGljIHZvaWQgYTZ4eF9zdWJtaXQoc3RydWN0 IG1zbV9ncHUgKmdwdSwgc3RydWN0IG1zbV9nZW1fc3VibWl0ICpzdWJtaXQsCisJc3RydWN0IG1z bV9maWxlX3ByaXZhdGUgKmN0eCkKK3sKKwlzdHJ1Y3QgbXNtX2RybV9wcml2YXRlICpwcml2ID0g Z3B1LT5kZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBtc21fcmluZ2J1ZmZlciAqcmluZyA9IHN1 Ym1pdC0+cmluZzsKKwl1bnNpZ25lZCBpbnQgaTsKKworCS8qIEludmFsaWRhdGUgQ0NVIGRlcHRo IGFuZCBjb2xvciAqLworCU9VVF9QS1Q3KHJpbmcsIENQX0VWRU5UX1dSSVRFLCAxKTsKKwlPVVRf UklORyhyaW5nLCBQQ19DQ1VfSU5WQUxJREFURV9ERVBUSCk7CisKKwlPVVRfUEtUNyhyaW5nLCBD UF9FVkVOVF9XUklURSwgMSk7CisJT1VUX1JJTkcocmluZywgUENfQ0NVX0lOVkFMSURBVEVfQ09M T1IpOworCisJLyogU3VibWl0IHRoZSBjb21tYW5kcyAqLworCWZvciAoaSA9IDA7IGkgPCBzdWJt aXQtPm5yX2NtZHM7IGkrKykgeworCQlzd2l0Y2ggKHN1Ym1pdC0+Y21kW2ldLnR5cGUpIHsKKwkJ Y2FzZSBNU01fU1VCTUlUX0NNRF9JQl9UQVJHRVRfQlVGOgorCQkJYnJlYWs7CisJCWNhc2UgTVNN X1NVQk1JVF9DTURfQ1RYX1JFU1RPUkVfQlVGOgorCQkJaWYgKHByaXYtPmxhc3RjdHggPT0gY3R4 KQorCQkJCWJyZWFrOworCQljYXNlIE1TTV9TVUJNSVRfQ01EX0JVRjoKKwkJCU9VVF9QS1Q3KHJp bmcsIENQX0lORElSRUNUX0JVRkZFUl9QRkUsIDMpOworCQkJT1VUX1JJTkcocmluZywgbG93ZXJf MzJfYml0cyhzdWJtaXQtPmNtZFtpXS5pb3ZhKSk7CisJCQlPVVRfUklORyhyaW5nLCB1cHBlcl8z Ml9iaXRzKHN1Ym1pdC0+Y21kW2ldLmlvdmEpKTsKKwkJCU9VVF9SSU5HKHJpbmcsIHN1Ym1pdC0+ Y21kW2ldLnNpemUpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBXcml0ZSB0aGUgZmVuY2Ug dG8gdGhlIHNjcmF0Y2ggcmVnaXN0ZXIgKi8KKwlPVVRfUEtUNChyaW5nLCBSRUdfQTZYWF9DUF9T Q1JBVENIX1JFRygyKSwgMSk7CisJT1VUX1JJTkcocmluZywgc3VibWl0LT5zZXFubyk7CisKKwkv KgorCSAqIEV4ZWN1dGUgYSBDQUNIRV9GTFVTSF9UUyBldmVudC4gVGhpcyB3aWxsIGVuc3VyZSB0 aGF0IHRoZQorCSAqIHRpbWVzdGFtcCBpcyB3cml0dGVuIHRvIHRoZSBtZW1vcnkgYW5kIHRoZW4g dHJpZ2dlcnMgdGhlIGludGVycnVwdAorCSAqLworCU9VVF9QS1Q3KHJpbmcsIENQX0VWRU5UX1dS SVRFLCA0KTsKKwlPVVRfUklORyhyaW5nLCBDQUNIRV9GTFVTSF9UUyB8ICgxIDw8IDMxKSk7CisJ T1VUX1JJTkcocmluZywgbG93ZXJfMzJfYml0cyhyYm1lbXB0cihyaW5nLCBmZW5jZSkpKTsKKwlP VVRfUklORyhyaW5nLCB1cHBlcl8zMl9iaXRzKHJibWVtcHRyKHJpbmcsIGZlbmNlKSkpOworCU9V VF9SSU5HKHJpbmcsIHN1Ym1pdC0+c2Vxbm8pOworCisJYTZ4eF9mbHVzaChncHUsIHJpbmcpOwor fQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHsKKwl1MzIgb2Zmc2V0OworCXUzMiB2YWx1ZTsKK30g YTZ4eF9od2NnW10gPSB7CisJe1JFR19BNlhYX1JCQk1fQ0xPQ0tfQ05UTF9TUDAsIDB4MjIyMjIy MjJ9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0NOVExfU1AxLCAweDIyMjIyMjIyfSwKKwl7UkVH X0E2WFhfUkJCTV9DTE9DS19DTlRMX1NQMiwgMHgyMjIyMjIyMn0sCisJe1JFR19BNlhYX1JCQk1f Q0xPQ0tfQ05UTF9TUDMsIDB4MjIyMjIyMjJ9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0NOVEwy X1NQMCwgMHgwMjAyMjIyMH0sCisJe1JFR19BNlhYX1JCQk1fQ0xPQ0tfQ05UTDJfU1AxLCAweDAy MDIyMjIwfSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9DS19DTlRMMl9TUDIsIDB4MDIwMjIyMjB9LAor CXtSRUdfQTZYWF9SQkJNX0NMT0NLX0NOVEwyX1NQMywgMHgwMjAyMjIyMH0sCisJe1JFR19BNlhY X1JCQk1fQ0xPQ0tfREVMQVlfU1AwLCAweDAwMDBmM2NmfSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9D S19ERUxBWV9TUDEsIDB4MDAwMGYzY2Z9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0RFTEFZX1NQ MiwgMHgwMDAwZjNjZn0sCisJe1JFR19BNlhYX1JCQk1fQ0xPQ0tfREVMQVlfU1AzLCAweDAwMDBm M2NmfSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9DS19IWVNUX1NQMCwgMHgwMDAwMDA4MH0sCisJe1JF R19BNlhYX1JCQk1fQ0xPQ0tfSFlTVF9TUDEsIDB4MDAwMDAwODB9LAorCXtSRUdfQTZYWF9SQkJN X0NMT0NLX0hZU1RfU1AyLCAweDAwMDAwMDgwfSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9DS19IWVNU X1NQMywgMHgwMDAwMDA4MH0sCisJe1JFR19BNlhYX1JCQk1fQ0xPQ0tfQ05UTF9UUDAsIDB4MDIy MjIyMjJ9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0NOVExfVFAxLCAweDAyMjIyMjIyfSwKKwl7 UkVHX0E2WFhfUkJCTV9DTE9DS19DTlRMX1RQMiwgMHgwMjIyMjIyMn0sCisJe1JFR19BNlhYX1JC Qk1fQ0xPQ0tfQ05UTF9UUDMsIDB4MDIyMjIyMjJ9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0NO VEwyX1RQMCwgMHgyMjIyMjIyMn0sCisJe1JFR19BNlhYX1JCQk1fQ0xPQ0tfQ05UTDJfVFAxLCAw eDIyMjIyMjIyfSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9DS19DTlRMMl9UUDIsIDB4MjIyMjIyMjJ9 LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0NOVEwyX1RQMywgMHgyMjIyMjIyMn0sCisJe1JFR19B NlhYX1JCQk1fQ0xPQ0tfQ05UTDNfVFAwLCAweDIyMjIyMjIyfSwKKwl7UkVHX0E2WFhfUkJCTV9D TE9DS19DTlRMM19UUDEsIDB4MjIyMjIyMjJ9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0NOVEwz X1RQMiwgMHgyMjIyMjIyMn0sCisJe1JFR19BNlhYX1JCQk1fQ0xPQ0tfQ05UTDNfVFAzLCAweDIy MjIyMjIyfSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9DS19DTlRMNF9UUDAsIDB4MDAwMjIyMjJ9LAor CXtSRUdfQTZYWF9SQkJNX0NMT0NLX0NOVEw0X1RQMSwgMHgwMDAyMjIyMn0sCisJe1JFR19BNlhY X1JCQk1fQ0xPQ0tfQ05UTDRfVFAyLCAweDAwMDIyMjIyfSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9D S19DTlRMNF9UUDMsIDB4MDAwMjIyMjJ9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0hZU1RfVFAw LCAweDc3Nzc3Nzc3fSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9DS19IWVNUX1RQMSwgMHg3Nzc3Nzc3 N30sCisJe1JFR19BNlhYX1JCQk1fQ0xPQ0tfSFlTVF9UUDIsIDB4Nzc3Nzc3Nzd9LAorCXtSRUdf QTZYWF9SQkJNX0NMT0NLX0hZU1RfVFAzLCAweDc3Nzc3Nzc3fSwKKwl7UkVHX0E2WFhfUkJCTV9D TE9DS19IWVNUMl9UUDAsIDB4Nzc3Nzc3Nzd9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0hZU1Qy X1RQMSwgMHg3Nzc3Nzc3N30sCisJe1JFR19BNlhYX1JCQk1fQ0xPQ0tfSFlTVDJfVFAyLCAweDc3 Nzc3Nzc3fSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9DS19IWVNUMl9UUDMsIDB4Nzc3Nzc3Nzd9LAor CXtSRUdfQTZYWF9SQkJNX0NMT0NLX0hZU1QzX1RQMCwgMHgwNzc3Nzc3N30sCisJe1JFR19BNlhY X1JCQk1fQ0xPQ0tfSFlTVDNfVFAxLCAweDA3Nzc3Nzc3fSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9D S19IWVNUM19UUDIsIDB4MDc3Nzc3Nzd9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0hZU1QzX1RQ MywgMHgwNzc3Nzc3N30sCisJe1JFR19BNlhYX1JCQk1fQ0xPQ0tfSFlTVDRfVFAwLCAweDAwMDc3 Nzc3fSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9DS19IWVNUNF9UUDEsIDB4MDAwNzc3Nzd9LAorCXtS RUdfQTZYWF9SQkJNX0NMT0NLX0hZU1Q0X1RQMiwgMHgwMDA3Nzc3N30sCisJe1JFR19BNlhYX1JC Qk1fQ0xPQ0tfSFlTVDRfVFAzLCAweDAwMDc3Nzc3fSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9DS19E RUxBWV9UUDAsIDB4MTExMTExMTF9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0RFTEFZX1RQMSwg MHgxMTExMTExMX0sCisJe1JFR19BNlhYX1JCQk1fQ0xPQ0tfREVMQVlfVFAyLCAweDExMTExMTEx fSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9DS19ERUxBWV9UUDMsIDB4MTExMTExMTF9LAorCXtSRUdf QTZYWF9SQkJNX0NMT0NLX0RFTEFZMl9UUDAsIDB4MTExMTExMTF9LAorCXtSRUdfQTZYWF9SQkJN X0NMT0NLX0RFTEFZMl9UUDEsIDB4MTExMTExMTF9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0RF TEFZMl9UUDIsIDB4MTExMTExMTF9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0RFTEFZMl9UUDMs IDB4MTExMTExMTF9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0RFTEFZM19UUDAsIDB4MTExMTEx MTF9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0RFTEFZM19UUDEsIDB4MTExMTExMTF9LAorCXtS RUdfQTZYWF9SQkJNX0NMT0NLX0RFTEFZM19UUDIsIDB4MTExMTExMTF9LAorCXtSRUdfQTZYWF9S QkJNX0NMT0NLX0RFTEFZM19UUDMsIDB4MTExMTExMTF9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NL X0RFTEFZNF9UUDAsIDB4MDAwMTExMTF9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0RFTEFZNF9U UDEsIDB4MDAwMTExMTF9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0RFTEFZNF9UUDIsIDB4MDAw MTExMTF9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0RFTEFZNF9UUDMsIDB4MDAwMTExMTF9LAor CXtSRUdfQTZYWF9SQkJNX0NMT0NLX0NOVExfVUNIRSwgMHgyMjIyMjIyMn0sCisJe1JFR19BNlhY X1JCQk1fQ0xPQ0tfQ05UTDJfVUNIRSwgMHgyMjIyMjIyMn0sCisJe1JFR19BNlhYX1JCQk1fQ0xP Q0tfQ05UTDNfVUNIRSwgMHgyMjIyMjIyMn0sCisJe1JFR19BNlhYX1JCQk1fQ0xPQ0tfQ05UTDRf VUNIRSwgMHgwMDIyMjIyMn0sCisJe1JFR19BNlhYX1JCQk1fQ0xPQ0tfSFlTVF9VQ0hFLCAweDAw MDAwMDA0fSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9DS19ERUxBWV9VQ0hFLCAweDAwMDAwMDAyfSwK Kwl7UkVHX0E2WFhfUkJCTV9DTE9DS19DTlRMX1JCMCwgMHgyMjIyMjIyMn0sCisJe1JFR19BNlhY X1JCQk1fQ0xPQ0tfQ05UTF9SQjEsIDB4MjIyMjIyMjJ9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NL X0NOVExfUkIyLCAweDIyMjIyMjIyfSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9DS19DTlRMX1JCMywg MHgyMjIyMjIyMn0sCisJe1JFR19BNlhYX1JCQk1fQ0xPQ0tfQ05UTDJfUkIwLCAweDAwMDAyMjIy fSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9DS19DTlRMMl9SQjEsIDB4MDAwMDIyMjJ9LAorCXtSRUdf QTZYWF9SQkJNX0NMT0NLX0NOVEwyX1JCMiwgMHgwMDAwMjIyMn0sCisJe1JFR19BNlhYX1JCQk1f Q0xPQ0tfQ05UTDJfUkIzLCAweDAwMDAyMjIyfSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9DS19DTlRM X0NDVTAsIDB4MDAwMDIyMjB9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0NOVExfQ0NVMSwgMHgw MDAwMjIyMH0sCisJe1JFR19BNlhYX1JCQk1fQ0xPQ0tfQ05UTF9DQ1UyLCAweDAwMDAyMjIwfSwK Kwl7UkVHX0E2WFhfUkJCTV9DTE9DS19DTlRMX0NDVTMsIDB4MDAwMDIyMjB9LAorCXtSRUdfQTZY WF9SQkJNX0NMT0NLX0hZU1RfUkJfQ0NVMCwgMHgwMDA0MGYwMH0sCisJe1JFR19BNlhYX1JCQk1f Q0xPQ0tfSFlTVF9SQl9DQ1UxLCAweDAwMDQwZjAwfSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9DS19I WVNUX1JCX0NDVTIsIDB4MDAwNDBmMDB9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0hZU1RfUkJf Q0NVMywgMHgwMDA0MGYwMH0sCisJe1JFR19BNlhYX1JCQk1fQ0xPQ0tfQ05UTF9SQUMsIDB4MDUw MjIwMjJ9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0NOVEwyX1JBQywgMHgwMDAwNTU1NX0sCisJ e1JFR19BNlhYX1JCQk1fQ0xPQ0tfREVMQVlfUkFDLCAweDAwMDEwMDExfSwKKwl7UkVHX0E2WFhf UkJCTV9DTE9DS19IWVNUX1JBQywgMHgwMDQ0NTA0NH0sCisJe1JFR19BNlhYX1JCQk1fQ0xPQ0tf Q05UTF9UU0VfUkFTX1JCQk0sIDB4MDQyMjIyMjJ9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX01P REVfR1BDLCAweDAyMjIyMjIyfSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9DS19NT0RFX1ZGRCwgMHgw MDAwMjIyMn0sCisJe1JFR19BNlhYX1JCQk1fQ0xPQ0tfSFlTVF9UU0VfUkFTX1JCQk0sIDB4MDAw MDAwMDB9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0hZU1RfR1BDLCAweDA0MTA0MDA0fSwKKwl7 UkVHX0E2WFhfUkJCTV9DTE9DS19IWVNUX1ZGRCwgMHgwMDAwMDAwMH0sCisJe1JFR19BNlhYX1JC Qk1fQ0xPQ0tfREVMQVlfSExTUSwgMHgwMDAwMDAwMH0sCisJe1JFR19BNlhYX1JCQk1fQ0xPQ0tf REVMQVlfVFNFX1JBU19SQkJNLCAweDAwMDA0MDAwfSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9DS19E RUxBWV9HUEMsIDB4MDAwMDAyMDB9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0RFTEFZX1ZGRCwg MHgwMDAwMjIyMn0sCisJe1JFR19BNlhYX1JCQk1fQ0xPQ0tfREVMQVlfSExTUV8yLCAweDAwMDAw MDAyfSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9DS19NT0RFX0hMU1EsIDB4MDAwMDIyMjJ9LAorCXtS RUdfQTZYWF9SQkJNX0NMT0NLX0NOVExfR01VX0dYLCAweDAwMDAwMjIyfSwKKwl7UkVHX0E2WFhf UkJCTV9DTE9DS19ERUxBWV9HTVVfR1gsIDB4MDAwMDAxMTF9LAorCXtSRUdfQTZYWF9SQkJNX0NM T0NLX0hZU1RfR01VX0dYLCAweDAwMDAwNTU1fQorfTsKKworc3RhdGljIHZvaWQgYTZ4eF9zZXRf aHdjZyhzdHJ1Y3QgbXNtX2dwdSAqZ3B1LCBib29sIHN0YXRlKQoreworCXN0cnVjdCBhZHJlbm9f Z3B1ICphZHJlbm9fZ3B1ID0gdG9fYWRyZW5vX2dwdShncHUpOworCXN0cnVjdCBhNnh4X2dwdSAq YTZ4eF9ncHUgPSB0b19hNnh4X2dwdShhZHJlbm9fZ3B1KTsKKwlzdHJ1Y3QgYTZ4eF9nbXUgKmdt dSA9ICZhNnh4X2dwdS0+Z211OworCXVuc2lnbmVkIGludCBpOworCWludCByZXQ7CisJdTMyIHZh bDsKKworCXZhbCA9IGdwdV9yZWFkKGdwdSwgUkVHX0E2WFhfUkJCTV9DTE9DS19DTlRMKTsKKwor CS8qIERvbid0IHJlLXByb2dyYW0gdGhlIHJlZ2lzdGVycyBpZiB0aGV5IGFyZSBhbHJlYWR5IGNv cnJlY3QgKi8KKwlpZiAoKCFzdGF0ZSAmJiAhdmFsKSB8fCAoc3RhdGUgJiYgKHZhbCA9PSAweDhh YThhYTAyKSkpCisJCXJldHVybjsKKworCS8qIERpc2FibGUgU1AgY2xvY2sgYmVmb3JlIHByb2dy YW1taW5nIEhXQ0cgcmVnaXN0ZXJzICovCisJZ211X3JtdyhnbXUsIFJFR19BNlhYX0dQVV9HTVVf R1hfU1BUUFJBQ19DTE9DS19DT05UUk9MLCAxLCAwKTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJB WV9TSVpFKGE2eHhfaHdjZyk7IGkrKykKKwkJZ3B1X3dyaXRlKGdwdSwgYTZ4eF9od2NnW2ldLm9m ZnNldCwKKwkJCXN0YXRlID8gYTZ4eF9od2NnW2ldLnZhbHVlIDogMCk7CisKKwkvKiBFbmFibGUg U1AgY2xvY2sgKi8KKwlnbXVfcm13KGdtdSwgUkVHX0E2WFhfR1BVX0dNVV9HWF9TUFRQUkFDX0NM T0NLX0NPTlRST0wsIDAsIDEpOworCisJZ3B1X3dyaXRlKGdwdSwgUkVHX0E2WFhfUkJCTV9DTE9D S19DTlRMLCBzdGF0ZSA/IDB4OGFhOGFhMDIgOiAwKTsKK30KKworc3RhdGljIGludCBhNnh4X2Nw X2luaXQoc3RydWN0IG1zbV9ncHUgKmdwdSkKK3sKKwlzdHJ1Y3QgbXNtX3JpbmdidWZmZXIgKnJp bmcgPSBncHUtPnJiWzBdOworCisJT1VUX1BLVDcocmluZywgQ1BfTUVfSU5JVCwgOCk7CisKKwlP VVRfUklORyhyaW5nLCAweDAwMDAwMDJmKTsKKworCS8qIEVuYWJsZSBtdWx0aXBsZSBoYXJkd2Fy ZSBjb250ZXh0cyAqLworCU9VVF9SSU5HKHJpbmcsIDB4MDAwMDAwMDMpOworCisJLyogRW5hYmxl IGVycm9yIGRldGVjdGlvbiAqLworCU9VVF9SSU5HKHJpbmcsIDB4MjAwMDAwMDApOworCisJLyog RG9uJ3QgZW5hYmxlIGhlYWRlciBkdW1wICovCisJT1VUX1JJTkcocmluZywgMHgwMDAwMDAwMCk7 CisJT1VUX1JJTkcocmluZywgMHgwMDAwMDAwMCk7CisKKwkvKiBObyB3b3JrYXJvdW5kcyBlbmFi bGVkICovCisJT1VUX1JJTkcocmluZywgMHgwMDAwMDAwMCk7CisKKwkvKiBQYWQgcmVzdCBvZiB0 aGUgY21kcyB3aXRoIDAncyAqLworCU9VVF9SSU5HKHJpbmcsIDB4MDAwMDAwMDApOworCU9VVF9S SU5HKHJpbmcsIDB4MDAwMDAwMDApOworCisJYTZ4eF9mbHVzaChncHUsIHJpbmcpOworCXJldHVy biBhNnh4X2lkbGUoZ3B1LCByaW5nKSA/IDAgOiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IGE2 eHhfdWNvZGVfaW5pdChzdHJ1Y3QgbXNtX2dwdSAqZ3B1KQoreworCXN0cnVjdCBhZHJlbm9fZ3B1 ICphZHJlbm9fZ3B1ID0gdG9fYWRyZW5vX2dwdShncHUpOworCXN0cnVjdCBhNnh4X2dwdSAqYTZ4 eF9ncHUgPSB0b19hNnh4X2dwdShhZHJlbm9fZ3B1KTsKKworCWlmICghYTZ4eF9ncHUtPnNxZV9i bykgeworCQlhNnh4X2dwdS0+c3FlX2JvID0gYWRyZW5vX2Z3X2NyZWF0ZV9ibyhncHUsCisJCQlh ZHJlbm9fZ3B1LT5md1tBRFJFTk9fRldfU1FFXSwgJmE2eHhfZ3B1LT5zcWVfaW92YSk7CisKKwkJ aWYgKElTX0VSUihhNnh4X2dwdS0+c3FlX2JvKSkgeworCQkJaW50IHJldCA9IFBUUl9FUlIoYTZ4 eF9ncHUtPnNxZV9ibyk7CisKKwkJCWE2eHhfZ3B1LT5zcWVfYm8gPSBOVUxMOworCQkJRFJNX0RF Vl9FUlJPUigmZ3B1LT5wZGV2LT5kZXYsCisJCQkJIkNvdWxkIG5vdCBhbGxvY2F0ZSBTUUUgdWNv ZGU6ICVkXG4iLCByZXQpOworCisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJZ3B1X3dyaXRl NjQoZ3B1LCBSRUdfQTZYWF9DUF9TUUVfSU5TVFJfQkFTRV9MTywKKwkJUkVHX0E2WFhfQ1BfU1FF X0lOU1RSX0JBU0VfSEksIGE2eHhfZ3B1LT5zcWVfaW92YSk7CisKKwlyZXR1cm4gMDsKK30KKwor I2RlZmluZSBBNlhYX0lOVF9NQVNLIChBNlhYX1JCQk1fSU5UXzBfTUFTS19DUF9BSEJfRVJST1Ig fCBcCisJICBBNlhYX1JCQk1fSU5UXzBfTUFTS19SQkJNX0FUQl9BU1lOQ0ZJRk9fT1ZFUkZMT1cg fCBcCisJICBBNlhYX1JCQk1fSU5UXzBfTUFTS19DUF9IV19FUlJPUiB8IFwKKwkgIEE2WFhfUkJC TV9JTlRfMF9NQVNLX0NQX0lCMiB8IFwKKwkgIEE2WFhfUkJCTV9JTlRfMF9NQVNLX0NQX0lCMSB8 IFwKKwkgIEE2WFhfUkJCTV9JTlRfMF9NQVNLX0NQX1JCIHwgXAorCSAgQTZYWF9SQkJNX0lOVF8w X01BU0tfQ1BfQ0FDSEVfRkxVU0hfVFMgfCBcCisJICBBNlhYX1JCQk1fSU5UXzBfTUFTS19SQkJN X0FUQl9CVVNfT1ZFUkZMT1cgfCBcCisJICBBNlhYX1JCQk1fSU5UXzBfTUFTS19SQkJNX0hBTkdf REVURUNUIHwgXAorCSAgQTZYWF9SQkJNX0lOVF8wX01BU0tfVUNIRV9PT0JfQUNDRVNTIHwgXAor CSAgQTZYWF9SQkJNX0lOVF8wX01BU0tfVUNIRV9UUkFQX0lOVFIpCisKK3N0YXRpYyBpbnQgYTZ4 eF9od19pbml0KHN0cnVjdCBtc21fZ3B1ICpncHUpCit7CisJc3RydWN0IGFkcmVub19ncHUgKmFk cmVub19ncHUgPSB0b19hZHJlbm9fZ3B1KGdwdSk7CisJc3RydWN0IGE2eHhfZ3B1ICphNnh4X2dw dSA9IHRvX2E2eHhfZ3B1KGFkcmVub19ncHUpOworCWludCByZXQ7CisKKwkvKiBNYWtlIHN1cmUg dGhlIEdNVSBrZWVwcyB0aGUgR1BVIG9uIHdoaWxlIHdlIHNldCBpdCB1cCAqLworCWE2eHhfZ211 X3NldF9vb2IoJmE2eHhfZ3B1LT5nbXUsIEdNVV9PT0JfR1BVX1NFVCk7CisKKwlncHVfd3JpdGUo Z3B1LCBSRUdfQTZYWF9SQkJNX1NFQ1ZJRF9UU0JfQ05UTCwgMCk7CisKKwkvKgorCSAqIERpc2Fi bGUgdGhlIHRydXN0ZWQgbWVtb3J5IHJhbmdlIC0gd2UgZG9uJ3QgYWN0dWFsbHkgc3VwcG9ydGVk IHNlY3VyZQorCSAqIG1lbW9yeSByZW5kZXJpbmcgYXQgdGhpcyBwb2ludCBpbiB0aW1lIGFuZCB3 ZSBkb24ndCB3YW50IHRvIGJsb2NrIG9mZgorCSAqIHBhcnQgb2YgdGhlIHZpcnR1YWwgbWVtb3J5 IHNwYWNlLgorCSAqLworCWdwdV93cml0ZTY0KGdwdSwgUkVHX0E2WFhfUkJCTV9TRUNWSURfVFNC X1RSVVNURURfQkFTRV9MTywKKwkJUkVHX0E2WFhfUkJCTV9TRUNWSURfVFNCX1RSVVNURURfQkFT RV9ISSwgMHgwMDAwMDAwMCk7CisJZ3B1X3dyaXRlKGdwdSwgUkVHX0E2WFhfUkJCTV9TRUNWSURf VFNCX1RSVVNURURfU0laRSwgMHgwMDAwMDAwMCk7CisKKwkvKiBlbmFibGUgaGFyZHdhcmUgY2xv Y2tnYXRpbmcgKi8KKwlhNnh4X3NldF9od2NnKGdwdSwgdHJ1ZSk7CisKKwkvKiBWQklGIHN0YXJ0 ICovCisJZ3B1X3dyaXRlKGdwdSwgUkVHX0E2WFhfVkJJRl9HQVRFX09GRl9XUlJFUV9FTiwgMHgw MDAwMDAwOSk7CisJZ3B1X3dyaXRlKGdwdSwgUkVHX0E2WFhfUkJCTV9WQklGX0NMSUVOVF9RT1Nf Q05UTCwgMHgzKTsKKworCS8qIE1ha2UgYWxsIGJsb2NrcyBjb250cmlidXRlIHRvIHRoZSBHUFUg QlVTWSBwZXJmIGNvdW50ZXIgKi8KKwlncHVfd3JpdGUoZ3B1LCBSRUdfQTZYWF9SQkJNX1BFUkZD VFJfR1BVX0JVU1lfTUFTS0VELCAweGZmZmZmZmZmKTsKKworCS8qIERpc2FibGUgTDIgYnlwYXNz IGluIHRoZSBVQ0hFICovCisJZ3B1X3dyaXRlKGdwdSwgUkVHX0E2WFhfVUNIRV9XUklURV9SQU5H RV9NQVhfTE8sIDB4ZmZmZmZmYzApOworCWdwdV93cml0ZShncHUsIFJFR19BNlhYX1VDSEVfV1JJ VEVfUkFOR0VfTUFYX0hJLCAweDAwMDFmZmZmKTsKKwlncHVfd3JpdGUoZ3B1LCBSRUdfQTZYWF9V Q0hFX1RSQVBfQkFTRV9MTywgMHhmZmZmZjAwMCk7CisJZ3B1X3dyaXRlKGdwdSwgUkVHX0E2WFhf VUNIRV9UUkFQX0JBU0VfSEksIDB4MDAwMWZmZmYpOworCWdwdV93cml0ZShncHUsIFJFR19BNlhY X1VDSEVfV1JJVEVfVEhSVV9CQVNFX0xPLCAweGZmZmZmMDAwKTsKKwlncHVfd3JpdGUoZ3B1LCBS RUdfQTZYWF9VQ0hFX1dSSVRFX1RIUlVfQkFTRV9ISSwgMHgwMDAxZmZmZik7CisKKwkvKiBTZXQg dGhlIEdNRU0gVkEgcmFuZ2UgWzB4MTAwMDAwOjB4MTAwMDAwICsgZ3B1LT5nbWVtIC0gMV0gKi8K KwlncHVfd3JpdGU2NChncHUsIFJFR19BNlhYX1VDSEVfR01FTV9SQU5HRV9NSU5fTE8sCisJCVJF R19BNlhYX1VDSEVfR01FTV9SQU5HRV9NSU5fSEksIDB4MDAxMDAwMDApOworCisJZ3B1X3dyaXRl NjQoZ3B1LCBSRUdfQTZYWF9VQ0hFX0dNRU1fUkFOR0VfTUFYX0xPLAorCQlSRUdfQTZYWF9VQ0hF X0dNRU1fUkFOR0VfTUFYX0hJLAorCQkweDAwMTAwMDAwICsgYWRyZW5vX2dwdS0+Z21lbSAtIDEp OworCisJZ3B1X3dyaXRlKGdwdSwgUkVHX0E2WFhfVUNIRV9GSUxURVJfQ05UTCwgMHg4MDQpOwor CWdwdV93cml0ZShncHUsIFJFR19BNlhYX1VDSEVfQ0FDSEVfV0FZUywgMHg0KTsKKworCWdwdV93 cml0ZShncHUsIFJFR19BNlhYX0NQX1JPUV9USFJFU0hPTERTXzIsIDB4MDEwMDAwYzApOworCWdw dV93cml0ZShncHUsIFJFR19BNlhYX0NQX1JPUV9USFJFU0hPTERTXzEsIDB4ODA0MDM2MmMpOwor CisJLyogU2V0dGluZyB0aGUgbWVtIHBvb2wgc2l6ZSAqLworCWdwdV93cml0ZShncHUsIFJFR19B NlhYX0NQX01FTV9QT09MX1NJWkUsIDEyOCk7CisKKwkvKiBTZXR0aW5nIHRoZSBwcmltRmlmbyB0 aHJlc2hvbGRzIGRlZmF1bHQgdmFsdWVzICovCisJZ3B1X3dyaXRlKGdwdSwgUkVHX0E2WFhfUENf REJHX0VDT19DTlRMLCAoMHgzMDAgPDwgMTEpKTsKKworCS8qIFNldCB0aGUgQUhCIGRlZmF1bHQg c2xhdmUgcmVzcG9uc2UgdG8gIkVSUk9SIiAqLworCWdwdV93cml0ZShncHUsIFJFR19BNlhYX0NQ X0FIQl9DTlRMLCAweDEpOworCisJLyogVHVybiBvbiBwZXJmb3JtYW5jZSBjb3VudGVycyAqLwor CWdwdV93cml0ZShncHUsIFJFR19BNlhYX1JCQk1fUEVSRkNUUl9DTlRMLCAweDEpOworCisJLyog U2VsZWN0IENQMCB0byBhbHdheXMgY291bnQgY3ljbGVzICovCisJZ3B1X3dyaXRlKGdwdSwgUkVH X0E2WFhfQ1BfUEVSRkNUUl9DUF9TRUxfMCwgUEVSRl9DUF9BTFdBWVNfQ09VTlQpOworCisJLyog RklYTUU6IG5vdCBzdXJlIGlmIHRoaXMgc2hvdWxkIGxpdmUgaGVyZSBvciBpbiBhNnh4X2dtdS5j ICovCisJZ211X3dyaXRlKCZhNnh4X2dwdS0+Z211LCAgUkVHX0E2WFhfR1BVX0dNVV9BT19HUFVf Q1hfQlVTWV9NQVNLLAorCQkweGZmMDAwMDAwKTsKKwlnbXVfcm13KCZhNnh4X2dwdS0+Z211LCBS RUdfQTZYWF9HTVVfQ1hfR01VX1BPV0VSX0NPVU5URVJfU0VMRUNUXzAsCisJCTB4ZmYsIDB4MjAp OworCWdtdV93cml0ZSgmYTZ4eF9ncHUtPmdtdSwgUkVHX0E2WFhfR01VX0NYX0dNVV9QT1dFUl9D T1VOVEVSX0VOQUJMRSwKKwkJMHgwMSk7CisKKwlncHVfd3JpdGUoZ3B1LCBSRUdfQTZYWF9SQl9O Q19NT0RFX0NOVEwsIDIgPDwgMSk7CisJZ3B1X3dyaXRlKGdwdSwgUkVHX0E2WFhfVFBMMV9OQ19N T0RFX0NOVEwsIDIgPDwgMSk7CisJZ3B1X3dyaXRlKGdwdSwgUkVHX0E2WFhfU1BfTkNfTU9ERV9D TlRMLCAyIDw8IDEpOworCWdwdV93cml0ZShncHUsIFJFR19BNlhYX1VDSEVfTU9ERV9DTlRMLCAy IDw8IDIxKTsKKworCS8qIEVuYWJsZSBmYXVsdCBkZXRlY3Rpb24gKi8KKwlncHVfd3JpdGUoZ3B1 LCBSRUdfQTZYWF9SQkJNX0lOVEVSRkFDRV9IQU5HX0lOVF9DTlRMLAorCQkoMSA8PCAzMCkgfCAw eDFmZmZmZik7CisKKwlncHVfd3JpdGUoZ3B1LCBSRUdfQTZYWF9VQ0hFX0NMSUVOVF9QRiwgMSk7 CisKKwkvKiBQcm90ZWN0IHJlZ2lzdGVycyBmcm9tIHRoZSBDUCAqLworCWdwdV93cml0ZShncHUs IFJFR19BNlhYX0NQX1BST1RFQ1RfQ05UTCwgMHgwMDAwMDAwMyk7CisKKwlncHVfd3JpdGUoZ3B1 LCBSRUdfQTZYWF9DUF9QUk9URUNUKDApLAorCQlBNlhYX1BST1RFQ1RfUkRPTkxZKDB4NjAwLCAw eDUxKSk7CisJZ3B1X3dyaXRlKGdwdSwgUkVHX0E2WFhfQ1BfUFJPVEVDVCgxKSwgQTZYWF9QUk9U RUNUX1JXKDB4YWU1MCwgMHgyKSk7CisJZ3B1X3dyaXRlKGdwdSwgUkVHX0E2WFhfQ1BfUFJPVEVD VCgyKSwgQTZYWF9QUk9URUNUX1JXKDB4OTYyNCwgMHgxMykpOworCWdwdV93cml0ZShncHUsIFJF R19BNlhYX0NQX1BST1RFQ1QoMyksIEE2WFhfUFJPVEVDVF9SVygweDg2MzAsIDB4OCkpOworCWdw dV93cml0ZShncHUsIFJFR19BNlhYX0NQX1BST1RFQ1QoNCksIEE2WFhfUFJPVEVDVF9SVygweDll NzAsIDB4MSkpOworCWdwdV93cml0ZShncHUsIFJFR19BNlhYX0NQX1BST1RFQ1QoNSksIEE2WFhf UFJPVEVDVF9SVygweDllNzgsIDB4MTg3KSk7CisJZ3B1X3dyaXRlKGdwdSwgUkVHX0E2WFhfQ1Bf UFJPVEVDVCg2KSwgQTZYWF9QUk9URUNUX1JXKDB4ZjAwMCwgMHg4MTApKTsKKwlncHVfd3JpdGUo Z3B1LCBSRUdfQTZYWF9DUF9QUk9URUNUKDcpLAorCQlBNlhYX1BST1RFQ1RfUkRPTkxZKDB4ZmMw MCwgMHgzKSk7CisJZ3B1X3dyaXRlKGdwdSwgUkVHX0E2WFhfQ1BfUFJPVEVDVCg4KSwgQTZYWF9Q Uk9URUNUX1JXKDB4NTBlLCAweDApKTsKKwlncHVfd3JpdGUoZ3B1LCBSRUdfQTZYWF9DUF9QUk9U RUNUKDkpLCBBNlhYX1BST1RFQ1RfUkRPTkxZKDB4NTBmLCAweDApKTsKKwlncHVfd3JpdGUoZ3B1 LCBSRUdfQTZYWF9DUF9QUk9URUNUKDEwKSwgQTZYWF9QUk9URUNUX1JXKDB4NTEwLCAweDApKTsK KwlncHVfd3JpdGUoZ3B1LCBSRUdfQTZYWF9DUF9QUk9URUNUKDExKSwKKwkJQTZYWF9QUk9URUNU X1JET05MWSgweDAsIDB4NGY5KSk7CisJZ3B1X3dyaXRlKGdwdSwgUkVHX0E2WFhfQ1BfUFJPVEVD VCgxMiksCisJCUE2WFhfUFJPVEVDVF9SRE9OTFkoMHg1MDEsIDB4YSkpOworCWdwdV93cml0ZShn cHUsIFJFR19BNlhYX0NQX1BST1RFQ1QoMTMpLAorCQlBNlhYX1BST1RFQ1RfUkRPTkxZKDB4NTEx LCAweDQ0KSk7CisJZ3B1X3dyaXRlKGdwdSwgUkVHX0E2WFhfQ1BfUFJPVEVDVCgxNCksIEE2WFhf UFJPVEVDVF9SVygweGUwMCwgMHhlKSk7CisJZ3B1X3dyaXRlKGdwdSwgUkVHX0E2WFhfQ1BfUFJP VEVDVCgxNSksIEE2WFhfUFJPVEVDVF9SVygweDhlMDAsIDB4MCkpOworCWdwdV93cml0ZShncHUs IFJFR19BNlhYX0NQX1BST1RFQ1QoMTYpLCBBNlhYX1BST1RFQ1RfUlcoMHg4ZTUwLCAweGYpKTsK KwlncHVfd3JpdGUoZ3B1LCBSRUdfQTZYWF9DUF9QUk9URUNUKDE3KSwgQTZYWF9QUk9URUNUX1JX KDB4YmUwMiwgMHgwKSk7CisJZ3B1X3dyaXRlKGdwdSwgUkVHX0E2WFhfQ1BfUFJPVEVDVCgxOCks CisJCUE2WFhfUFJPVEVDVF9SVygweGJlMjAsIDB4MTFmMykpOworCWdwdV93cml0ZShncHUsIFJF R19BNlhYX0NQX1BST1RFQ1QoMTkpLCBBNlhYX1BST1RFQ1RfUlcoMHg4MDAsIDB4ODIpKTsKKwln cHVfd3JpdGUoZ3B1LCBSRUdfQTZYWF9DUF9QUk9URUNUKDIwKSwgQTZYWF9QUk9URUNUX1JXKDB4 OGEwLCAweDgpKTsKKwlncHVfd3JpdGUoZ3B1LCBSRUdfQTZYWF9DUF9QUk9URUNUKDIxKSwgQTZY WF9QUk9URUNUX1JXKDB4OGFiLCAweDE5KSk7CisJZ3B1X3dyaXRlKGdwdSwgUkVHX0E2WFhfQ1Bf UFJPVEVDVCgyMiksIEE2WFhfUFJPVEVDVF9SVygweDkwMCwgMHg0ZCkpOworCWdwdV93cml0ZShn cHUsIFJFR19BNlhYX0NQX1BST1RFQ1QoMjMpLCBBNlhYX1BST1RFQ1RfUlcoMHg5OGQsIDB4NzYp KTsKKwlncHVfd3JpdGUoZ3B1LCBSRUdfQTZYWF9DUF9QUk9URUNUKDI0KSwKKwkJCUE2WFhfUFJP VEVDVF9SRE9OTFkoMHg4ZDAsIDB4MjMpKTsKKwlncHVfd3JpdGUoZ3B1LCBSRUdfQTZYWF9DUF9Q Uk9URUNUKDI1KSwKKwkJCUE2WFhfUFJPVEVDVF9SRE9OTFkoMHg5ODAsIDB4NCkpOworCWdwdV93 cml0ZShncHUsIFJFR19BNlhYX0NQX1BST1RFQ1QoMjYpLCBBNlhYX1BST1RFQ1RfUlcoMHhhNjMw LCAweDApKTsKKworCS8qIEVuYWJsZSBpbnRlcnJ1cHRzICovCisJZ3B1X3dyaXRlKGdwdSwgUkVH X0E2WFhfUkJCTV9JTlRfMF9NQVNLLCBBNlhYX0lOVF9NQVNLKTsKKworCXJldCA9IGFkcmVub19o d19pbml0KGdwdSk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSBhNnh4X3Vjb2Rl X2luaXQoZ3B1KTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCS8qIEFsd2F5cyBjb21lIHVw IG9uIHJiIDAgKi8KKwlhNnh4X2dwdS0+Y3VyX3JpbmcgPSBncHUtPnJiWzBdOworCisJLyogRW5h YmxlIHRoZSBTUUVfdG8gc3RhcnQgdGhlIENQIGVuZ2luZSAqLworCWdwdV93cml0ZShncHUsIFJF R19BNlhYX0NQX1NRRV9DTlRMLCAxKTsKKworCXJldCA9IGE2eHhfY3BfaW5pdChncHUpOworCWlm IChyZXQpCisJCWdvdG8gb3V0OworCisJZ3B1X3dyaXRlKGdwdSwgUkVHX0E2WFhfUkJCTV9TRUNW SURfVFJVU1RfQ05UTCwgMHgwKTsKKworb3V0OgorCS8qCisJICogVGVsbCB0aGUgR01VIHRoYXQg d2UgYXJlIGRvbmUgdG91Y2hpbmcgdGhlIEdQVSBhbmQgaXQgY2FuIHN0YXJ0IHBvd2VyCisJICog bWFuYWdlbWVudAorCSAqLworCWE2eHhfZ211X2NsZWFyX29vYigmYTZ4eF9ncHUtPmdtdSwgR01V X09PQl9HUFVfU0VUKTsKKworCS8qIFRha2UgdGhlIEdNVSBvdXQgb2YgaXRzIHNwZWNpYWwgYm9v dCBtb2RlICovCisJYTZ4eF9nbXVfY2xlYXJfb29iKCZhNnh4X2dwdS0+Z211LCBHTVVfT09CX0JP T1RfU0xVTUJFUik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBhNnh4X2R1bXAo c3RydWN0IG1zbV9ncHUgKmdwdSkKK3sKKwlkZXZfaW5mbygmZ3B1LT5wZGV2LT5kZXYsICJzdGF0 dXM6ICAgJTA4eFxuIiwKKwkJCWdwdV9yZWFkKGdwdSwgUkVHX0E2WFhfUkJCTV9TVEFUVVMpKTsK KwlhZHJlbm9fZHVtcChncHUpOworfQorCisjZGVmaW5lIFZCSUZfUkVTRVRfQUNLX1RJTUVPVVQJ MTAwCisjZGVmaW5lIFZCSUZfUkVTRVRfQUNLX01BU0sJMHgwMGYwCisKK3N0YXRpYyB2b2lkIGE2 eHhfcmVjb3ZlcihzdHJ1Y3QgbXNtX2dwdSAqZ3B1KQoreworCWludCBpOworCisJYWRyZW5vX2R1 bXBfaW5mbyhncHUpOworCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJZGV2X2luZm8oJmdw dS0+cGRldi0+ZGV2LCAiQ1BfU0NSQVRDSF9SRUclZDogJXVcbiIsIGksCisJCQlncHVfcmVhZChn cHUsIFJFR19BNlhYX0NQX1NDUkFUQ0hfUkVHKGkpKSk7CisKKwlpZiAoaGFuZ19kZWJ1ZykKKwkJ YTZ4eF9kdW1wKGdwdSk7CisKKwlncHUtPmZ1bmNzLT5wbV9zdXNwZW5kKGdwdSk7CisJZ3B1LT5m dW5jcy0+cG1fcmVzdW1lKGdwdSk7CisKKwltc21fZ3B1X2h3X2luaXQoZ3B1KTsKK30KKworc3Rh dGljIGludCBhNnh4X2ZhdWx0X2hhbmRsZXIodm9pZCAqYXJnLCB1bnNpZ25lZCBsb25nIGlvdmEs IGludCBmbGFncykKK3sKKwlzdHJ1Y3QgbXNtX2dwdSAqZ3B1ID0gYXJnOworCisJcHJfd2Fybl9y YXRlbGltaXRlZCgiKioqIGdwdSBmYXVsdDogaW92YT0lMDhseCwgZmxhZ3M9JWQgKCV1LCV1LCV1 LCV1KVxuIiwKKwkJCWlvdmEsIGZsYWdzLAorCQkJZ3B1X3JlYWQoZ3B1LCBSRUdfQTZYWF9DUF9T Q1JBVENIX1JFRyg0KSksCisJCQlncHVfcmVhZChncHUsIFJFR19BNlhYX0NQX1NDUkFUQ0hfUkVH KDUpKSwKKwkJCWdwdV9yZWFkKGdwdSwgUkVHX0E2WFhfQ1BfU0NSQVRDSF9SRUcoNikpLAorCQkJ Z3B1X3JlYWQoZ3B1LCBSRUdfQTZYWF9DUF9TQ1JBVENIX1JFRyg3KSkpOworCisJcmV0dXJuIC1F RkFVTFQ7Cit9CisKK3N0YXRpYyB2b2lkIGE2eHhfY3BfaHdfZXJyX2lycShzdHJ1Y3QgbXNtX2dw dSAqZ3B1KQoreworCXUzMiBzdGF0dXMgPSBncHVfcmVhZChncHUsIFJFR19BNlhYX0NQX0lOVEVS UlVQVF9TVEFUVVMpOworCisJaWYgKHN0YXR1cyAmIEE2WFhfQ1BfSU5UX0NQX09QQ09ERV9FUlJP UikgeworCQl1MzIgdmFsOworCisJCWdwdV93cml0ZShncHUsIFJFR19BNlhYX0NQX1NRRV9TVEFU X0FERFIsIDEpOworCQl2YWwgPSBncHVfcmVhZChncHUsIFJFR19BNlhYX0NQX1NRRV9TVEFUX0RB VEEpOworCQlkZXZfZXJyX3JhdGVsaW1pdGVkKCZncHUtPnBkZXYtPmRldiwKKwkJCSJDUCB8IG9w Y29kZSBlcnJvciB8IHBvc3NpYmxlIG9wY29kZT0weCU4LjhYXG4iLAorCQkJdmFsKTsKKwl9CisK KwlpZiAoc3RhdHVzICYgQTZYWF9DUF9JTlRfQ1BfVUNPREVfRVJST1IpCisJCWRldl9lcnJfcmF0 ZWxpbWl0ZWQoJmdwdS0+cGRldi0+ZGV2LAorCQkJIkNQIHVjb2RlIGVycm9yIGludGVycnVwdFxu Iik7CisKKwlpZiAoc3RhdHVzICYgQTZYWF9DUF9JTlRfQ1BfSFdfRkFVTFRfRVJST1IpCisJCWRl dl9lcnJfcmF0ZWxpbWl0ZWQoJmdwdS0+cGRldi0+ZGV2LCAiQ1AgfCBIVyBmYXVsdCB8IHN0YXR1 cz0weCU4LjhYXG4iLAorCQkJZ3B1X3JlYWQoZ3B1LCBSRUdfQTZYWF9DUF9IV19GQVVMVCkpOwor CisJaWYgKHN0YXR1cyAmIEE2WFhfQ1BfSU5UX0NQX1JFR0lTVEVSX1BST1RFQ1RJT05fRVJST1Ip IHsKKwkJdTMyIHZhbCA9IGdwdV9yZWFkKGdwdSwgUkVHX0E2WFhfQ1BfUFJPVEVDVF9TVEFUVVMp OworCisJCWRldl9lcnJfcmF0ZWxpbWl0ZWQoJmdwdS0+cGRldi0+ZGV2LAorCQkJIkNQIHwgcHJv dGVjdGVkIG1vZGUgZXJyb3IgfCAlcyB8IGFkZHI9MHglOC44WCB8IHN0YXR1cz0weCU4LjhYXG4i LAorCQkJdmFsICYgKDEgPDwgMjApID8gIlJFQUQiIDogIldSSVRFIiwKKwkJCSh2YWwgJiAweDNm ZmZmKSwgdmFsKTsKKwl9CisKKwlpZiAoc3RhdHVzICYgQTZYWF9DUF9JTlRfQ1BfQUhCX0VSUk9S KQorCQlkZXZfZXJyX3JhdGVsaW1pdGVkKCZncHUtPnBkZXYtPmRldiwgIkNQIEFIQiBlcnJvciBp bnRlcnJ1cHRcbiIpOworCisJaWYgKHN0YXR1cyAmIEE2WFhfQ1BfSU5UX0NQX1ZTRF9QQVJJVFlf RVJST1IpCisJCWRldl9lcnJfcmF0ZWxpbWl0ZWQoJmdwdS0+cGRldi0+ZGV2LCAiQ1AgVlNEIGRl Y29kZXIgcGFyaXR5IGVycm9yXG4iKTsKKworCWlmIChzdGF0dXMgJiBBNlhYX0NQX0lOVF9DUF9J TExFR0FMX0lOU1RSX0VSUk9SKQorCQlkZXZfZXJyX3JhdGVsaW1pdGVkKCZncHUtPnBkZXYtPmRl diwgIkNQIGlsbGVnYWwgaW5zdHJ1Y3Rpb24gZXJyb3JcbiIpOworCit9CisKK3N0YXRpYyB2b2lk IGE2eHhfZmF1bHRfZGV0ZWN0X2lycShzdHJ1Y3QgbXNtX2dwdSAqZ3B1KQoreworCXN0cnVjdCBk cm1fZGV2aWNlICpkZXYgPSBncHUtPmRldjsKKwlzdHJ1Y3QgbXNtX2RybV9wcml2YXRlICpwcml2 ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgbXNtX3JpbmdidWZmZXIgKnJpbmcgPSBncHUt PmZ1bmNzLT5hY3RpdmVfcmluZyhncHUpOworCisJRFJNX0RFVl9FUlJPUigmZ3B1LT5wZGV2LT5k ZXYsCisJCSJncHUgZmF1bHQgcmluZyAlZCBmZW5jZSAleCBzdGF0dXMgJTguOFggcmIgJTQuNHgv JTQuNHggaWIxICUxNi4xNmxsWC8lNC40eCBpYjIgJTE2LjE2bGxYLyU0LjR4XG4iLAorCQlyaW5n ID8gcmluZy0+aWQgOiAtMSwgcmluZyA/IHJpbmctPnNlcW5vIDogMCwKKwkJZ3B1X3JlYWQoZ3B1 LCBSRUdfQTZYWF9SQkJNX1NUQVRVUyksCisJCWdwdV9yZWFkKGdwdSwgUkVHX0E2WFhfQ1BfUkJf UlBUUiksCisJCWdwdV9yZWFkKGdwdSwgUkVHX0E2WFhfQ1BfUkJfV1BUUiksCisJCWdwdV9yZWFk NjQoZ3B1LCBSRUdfQTZYWF9DUF9JQjFfQkFTRSwgUkVHX0E2WFhfQ1BfSUIxX0JBU0VfSEkpLAor CQlncHVfcmVhZChncHUsIFJFR19BNlhYX0NQX0lCMV9SRU1fU0laRSksCisJCWdwdV9yZWFkNjQo Z3B1LCBSRUdfQTZYWF9DUF9JQjJfQkFTRSwgUkVHX0E2WFhfQ1BfSUIyX0JBU0VfSEkpLAorCQln cHVfcmVhZChncHUsIFJFR19BNlhYX0NQX0lCMl9SRU1fU0laRSkpOworCisJLyogVHVybiBvZmYg dGhlIGhhbmdjaGVjayB0aW1lciB0byBrZWVwIGl0IGZyb20gYm90aGVyaW5nIHVzICovCisJZGVs X3RpbWVyKCZncHUtPmhhbmdjaGVja190aW1lcik7CisKKwlxdWV1ZV93b3JrKHByaXYtPndxLCAm Z3B1LT5yZWNvdmVyX3dvcmspOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgYTZ4eF9pcnEoc3Ry dWN0IG1zbV9ncHUgKmdwdSkKK3sKKwl1MzIgc3RhdHVzID0gZ3B1X3JlYWQoZ3B1LCBSRUdfQTZY WF9SQkJNX0lOVF8wX1NUQVRVUyk7CisKKwlncHVfd3JpdGUoZ3B1LCBSRUdfQTZYWF9SQkJNX0lO VF9DTEVBUl9DTUQsIHN0YXR1cyk7CisKKwlpZiAoc3RhdHVzICYgQTZYWF9SQkJNX0lOVF8wX01B U0tfUkJCTV9IQU5HX0RFVEVDVCkKKwkJYTZ4eF9mYXVsdF9kZXRlY3RfaXJxKGdwdSk7CisKKwlp ZiAoc3RhdHVzICYgQTZYWF9SQkJNX0lOVF8wX01BU0tfQ1BfQUhCX0VSUk9SKQorCQlkZXZfZXJy X3JhdGVsaW1pdGVkKCZncHUtPnBkZXYtPmRldiwgIkNQIHwgQUhCIGJ1cyBlcnJvclxuIik7CisK KwlpZiAoc3RhdHVzICYgQTZYWF9SQkJNX0lOVF8wX01BU0tfQ1BfSFdfRVJST1IpCisJCWE2eHhf Y3BfaHdfZXJyX2lycShncHUpOworCisJaWYgKHN0YXR1cyAmIEE2WFhfUkJCTV9JTlRfMF9NQVNL X1JCQk1fQVRCX0FTWU5DRklGT19PVkVSRkxPVykKKwkJZGV2X2Vycl9yYXRlbGltaXRlZCgmZ3B1 LT5wZGV2LT5kZXYsICJSQkJNIHwgQVRCIEFTWU5DIG92ZXJmbG93XG4iKTsKKworCWlmIChzdGF0 dXMgJiBBNlhYX1JCQk1fSU5UXzBfTUFTS19SQkJNX0FUQl9CVVNfT1ZFUkZMT1cpCisJCWRldl9l cnJfcmF0ZWxpbWl0ZWQoJmdwdS0+cGRldi0+ZGV2LCAiUkJCTSB8IEFUQiBidXMgb3ZlcmZsb3dc biIpOworCisJaWYgKHN0YXR1cyAmIEE2WFhfUkJCTV9JTlRfMF9NQVNLX1VDSEVfT09CX0FDQ0VT UykKKwkJZGV2X2Vycl9yYXRlbGltaXRlZCgmZ3B1LT5wZGV2LT5kZXYsICJVQ0hFIHwgT3V0IG9m IGJvdW5kcyBhY2Nlc3NcbiIpOworCisJaWYgKHN0YXR1cyAmIEE2WFhfUkJCTV9JTlRfMF9NQVNL X0NQX0NBQ0hFX0ZMVVNIX1RTKQorCQltc21fZ3B1X3JldGlyZShncHUpOworCisJcmV0dXJuIElS UV9IQU5ETEVEOworfQorCitzdGF0aWMgY29uc3QgdTMyIGE2eHhfcmVnaXN0ZXJfb2Zmc2V0c1tS RUdfQURSRU5PX1JFR0lTVEVSX01BWF0gPSB7CisJUkVHX0FEUkVOT19ERUZJTkUoUkVHX0FEUkVO T19DUF9SQl9CQVNFLCBSRUdfQTZYWF9DUF9SQl9CQVNFKSwKKwlSRUdfQURSRU5PX0RFRklORShS RUdfQURSRU5PX0NQX1JCX0JBU0VfSEksIFJFR19BNlhYX0NQX1JCX0JBU0VfSEkpLAorCVJFR19B RFJFTk9fREVGSU5FKFJFR19BRFJFTk9fQ1BfUkJfUlBUUl9BRERSLAorCQlSRUdfQTZYWF9DUF9S Ql9SUFRSX0FERFJfTE8pLAorCVJFR19BRFJFTk9fREVGSU5FKFJFR19BRFJFTk9fQ1BfUkJfUlBU Ul9BRERSX0hJLAorCQlSRUdfQTZYWF9DUF9SQl9SUFRSX0FERFJfSEkpLAorCVJFR19BRFJFTk9f REVGSU5FKFJFR19BRFJFTk9fQ1BfUkJfUlBUUiwgUkVHX0E2WFhfQ1BfUkJfUlBUUiksCisJUkVH X0FEUkVOT19ERUZJTkUoUkVHX0FEUkVOT19DUF9SQl9XUFRSLCBSRUdfQTZYWF9DUF9SQl9XUFRS KSwKKwlSRUdfQURSRU5PX0RFRklORShSRUdfQURSRU5PX0NQX1JCX0NOVEwsIFJFR19BNlhYX0NQ X1JCX0NOVEwpLAorfTsKKworc3RhdGljIGNvbnN0IHUzMiBhNnh4X3JlZ2lzdGVyc1tdID0gewor CTB4MDAwMCwgMHgwMDAyLCAweDAwMTAsIDB4MDAxMCwgMHgwMDEyLCAweDAwMTIsIDB4MDAxOCwg MHgwMDFiLAorCTB4MDAxZSwgMHgwMDMyLCAweDAwMzgsIDB4MDAzYywgMHgwMDQyLCAweDAwNDIs IDB4MDA0NCwgMHgwMDQ0LAorCTB4MDA0NywgMHgwMDQ3LCAweDAwNTYsIDB4MDA1NiwgMHgwMGFk LCAweDAwYWUsIDB4MDBiMCwgMHgwMGZiLAorCTB4MDEwMCwgMHgwMTFkLCAweDAyMDAsIDB4MDIw ZCwgMHgwMjEwLCAweDAyMTMsIDB4MDIxOCwgMHgwMjNkLAorCTB4MDQwMCwgMHgwNGY5LCAweDA1 MDAsIDB4MDUwMCwgMHgwNTA1LCAweDA1MGIsIDB4MDUwZSwgMHgwNTExLAorCTB4MDUzMywgMHgw NTMzLCAweDA1NDAsIDB4MDU1NSwgMHgwODAwLCAweDA4MDgsIDB4MDgxMCwgMHgwODEzLAorCTB4 MDgyMCwgMHgwODIxLCAweDA4MjMsIDB4MDgyNywgMHgwODMwLCAweDA4MzMsIDB4MDg0MCwgMHgw ODQzLAorCTB4MDg0ZiwgMHgwODZmLCAweDA4ODAsIDB4MDg4YSwgMHgwOGEwLCAweDA4YWIsIDB4 MDhjMCwgMHgwOGM0LAorCTB4MDhkMCwgMHgwOGRkLCAweDA4ZjAsIDB4MDhmMywgMHgwOTAwLCAw eDA5MDMsIDB4MDkwOCwgMHgwOTExLAorCTB4MDkyOCwgMHgwOTNlLCAweDA5NDIsIDB4MDk0ZCwg MHgwOTgwLCAweDA5ODQsIDB4MDk4ZCwgMHgwOTk2LAorCTB4MDk5OCwgMHgwOTllLCAweDA5YTAs IDB4MDlhNiwgMHgwOWE4LCAweDA5YWUsIDB4MDliMCwgMHgwOWIxLAorCTB4MDljMiwgMHgwOWM4 LCAweDBhMDAsIDB4MGEwMywgMHgwYzAwLCAweDBjMDQsIDB4MGMwNiwgMHgwYzA2LAorCTB4MGMx MCwgMHgwY2Q5LCAweDBlMDAsIDB4MGUwZSwgMHgwZTEwLCAweDBlMTMsIDB4MGUxNywgMHgwZTE5 LAorCTB4MGUxYywgMHgwZTJiLCAweDBlMzAsIDB4MGUzMiwgMHgwZTM4LCAweDBlMzksIDB4ODYw MCwgMHg4NjAxLAorCTB4ODYxMCwgMHg4NjFiLCAweDg2MjAsIDB4ODYyMCwgMHg4NjI4LCAweDg2 MmIsIDB4ODYzMCwgMHg4NjM3LAorCTB4OGUwMSwgMHg4ZTAxLCAweDhlMDQsIDB4OGUwNSwgMHg4 ZTA3LCAweDhlMDgsIDB4OGUwYywgMHg4ZTBjLAorCTB4OGUxMCwgMHg4ZTFjLCAweDhlMjAsIDB4 OGUyNSwgMHg4ZTI4LCAweDhlMjgsIDB4OGUyYywgMHg4ZTJmLAorCTB4OGUzYiwgMHg4ZTNlLCAw eDhlNDAsIDB4OGU0MywgMHg4ZTUwLCAweDhlNWUsIDB4OGU3MCwgMHg4ZTc3LAorCTB4OTYwMCwg MHg5NjA0LCAweDk2MjQsIDB4OTYzNywgMHg5ZTAwLCAweDllMDEsIDB4OWUwMywgMHg5ZTBlLAor CTB4OWUxMSwgMHg5ZTE2LCAweDllMTksIDB4OWUxOSwgMHg5ZTFjLCAweDllMWMsIDB4OWUyMCwg MHg5ZTIzLAorCTB4OWUzMCwgMHg5ZTMxLCAweDllMzQsIDB4OWUzNCwgMHg5ZTcwLCAweDllNzIs IDB4OWU3OCwgMHg5ZTc5LAorCTB4OWU4MCwgMHg5ZmZmLCAweGE2MDAsIDB4YTYwMSwgMHhhNjAz LCAweGE2MDMsIDB4YTYwYSwgMHhhNjBhLAorCTB4YTYxMCwgMHhhNjE3LCAweGE2MzAsIDB4YTYz MCwKKwl+MAorfTsKKworc3RhdGljIGludCBhNnh4X3BtX3Jlc3VtZShzdHJ1Y3QgbXNtX2dwdSAq Z3B1KQoreworCXN0cnVjdCBhZHJlbm9fZ3B1ICphZHJlbm9fZ3B1ID0gdG9fYWRyZW5vX2dwdShn cHUpOworCXN0cnVjdCBhNnh4X2dwdSAqYTZ4eF9ncHUgPSB0b19hNnh4X2dwdShhZHJlbm9fZ3B1 KTsKKwlpbnQgcmV0OworCisJcmV0ID0gYTZ4eF9nbXVfcmVzdW1lKGE2eHhfZ3B1KTsKKworCWdw dS0+bmVlZHNfaHdfaW5pdCA9IHRydWU7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50 IGE2eHhfcG1fc3VzcGVuZChzdHJ1Y3QgbXNtX2dwdSAqZ3B1KQoreworCXN0cnVjdCBhZHJlbm9f Z3B1ICphZHJlbm9fZ3B1ID0gdG9fYWRyZW5vX2dwdShncHUpOworCXN0cnVjdCBhNnh4X2dwdSAq YTZ4eF9ncHUgPSB0b19hNnh4X2dwdShhZHJlbm9fZ3B1KTsKKworCS8qCisJICogTWFrZSBzdXJl IHRoZSBHTVUgaXMgaWRsZSBiZWZvcmUgY29udGludWluZyAoYmVjYXVzZSBzb21lIHRyYW5zaXRp b25zCisJICogbWF5IHVzZSBWQklGCisJICovCisJYTZ4eF9nbXVfd2FpdF9mb3JfaWRsZShhNnh4 X2dwdSk7CisKKwkvKiBDbGVhciB0aGUgVkJJRiBwaXBlIGJlZm9yZSBzaHV0dGluZyBkb3duICov CisJLyogRklYTUU6IFRoaXMgYWNjZXNzZXMgdGhlIEdQVSAtIGRvIHdlIG5lZWQgdG8gbWFrZSBz dXJlIGl0IGlzIG9uPyAqLworCWdwdV93cml0ZShncHUsIFJFR19BNlhYX1ZCSUZfWElOX0hBTFRf Q1RSTDAsIDB4Zik7CisJc3Bpbl91bnRpbCgoZ3B1X3JlYWQoZ3B1LCBSRUdfQTZYWF9WQklGX1hJ Tl9IQUxUX0NUUkwxKSAmIDB4ZikgPT0gMHhmKTsKKwlncHVfd3JpdGUoZ3B1LCBSRUdfQTZYWF9W QklGX1hJTl9IQUxUX0NUUkwwLCAwKTsKKworCXJldHVybiBhNnh4X2dtdV9zdG9wKGE2eHhfZ3B1 KTsKK30KKworc3RhdGljIGludCBhNnh4X2dldF90aW1lc3RhbXAoc3RydWN0IG1zbV9ncHUgKmdw dSwgdWludDY0X3QgKnZhbHVlKQoreworCXN0cnVjdCBhZHJlbm9fZ3B1ICphZHJlbm9fZ3B1ID0g dG9fYWRyZW5vX2dwdShncHUpOworCXN0cnVjdCBhNnh4X2dwdSAqYTZ4eF9ncHUgPSB0b19hNnh4 X2dwdShhZHJlbm9fZ3B1KTsKKworCS8qIEZvcmNlIHRoZSBHUFUgcG93ZXIgb24gc28gd2UgY2Fu IHJlYWQgdGhpcyByZWdpc3RlciAqLworCWE2eHhfZ211X3NldF9vb2IoJmE2eHhfZ3B1LT5nbXUs IEdNVV9PT0JfR1BVX1NFVCk7CisKKwkqdmFsdWUgPSBncHVfcmVhZDY0KGdwdSwgUkVHX0E2WFhf UkJCTV9QRVJGQ1RSX0NQXzBfTE8sCisJCVJFR19BNlhYX1JCQk1fUEVSRkNUUl9DUF8wX0hJKTsK KworCWE2eHhfZ211X2NsZWFyX29vYigmYTZ4eF9ncHUtPmdtdSwgR01VX09PQl9HUFVfU0VUKTsK KwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19ERUJVR19GUworc3RhdGljIHZvaWQgYTZ4 eF9zaG93KHN0cnVjdCBtc21fZ3B1ICpncHUsIHN0cnVjdCBzZXFfZmlsZSAqbSkKK3sKKwlncHUt PmZ1bmNzLT5wbV9yZXN1bWUoZ3B1KTsKKworCXNlcV9wcmludGYobSwgInN0YXR1czogICAlMDh4 XG4iLAorCQkJZ3B1X3JlYWQoZ3B1LCBSRUdfQTZYWF9SQkJNX1NUQVRVUykpOworCWdwdS0+ZnVu Y3MtPnBtX3N1c3BlbmQoZ3B1KTsKKworCWFkcmVub19zaG93KGdwdSwgbSk7Cit9CisjZW5kaWYK Kworc3RhdGljIHN0cnVjdCBtc21fcmluZ2J1ZmZlciAqYTZ4eF9hY3RpdmVfcmluZyhzdHJ1Y3Qg bXNtX2dwdSAqZ3B1KQoreworCXN0cnVjdCBhZHJlbm9fZ3B1ICphZHJlbm9fZ3B1ID0gdG9fYWRy ZW5vX2dwdShncHUpOworCXN0cnVjdCBhNnh4X2dwdSAqYTZ4eF9ncHUgPSB0b19hNnh4X2dwdShh ZHJlbm9fZ3B1KTsKKworCXJldHVybiBhNnh4X2dwdS0+Y3VyX3Jpbmc7Cit9CisKK3N0YXRpYyB2 b2lkIGE2eHhfZGVzdHJveShzdHJ1Y3QgbXNtX2dwdSAqZ3B1KQoreworCXN0cnVjdCBhZHJlbm9f Z3B1ICphZHJlbm9fZ3B1ID0gdG9fYWRyZW5vX2dwdShncHUpOworCXN0cnVjdCBhNnh4X2dwdSAq YTZ4eF9ncHUgPSB0b19hNnh4X2dwdShhZHJlbm9fZ3B1KTsKKworCWlmIChhNnh4X2dwdS0+c3Fl X2JvKSB7CisJCWlmIChhNnh4X2dwdS0+c3FlX2lvdmEpCisJCQltc21fZ2VtX3B1dF9pb3ZhKGE2 eHhfZ3B1LT5zcWVfYm8sIGdwdS0+YXNwYWNlKTsKKwkJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVu Y2VfdW5sb2NrZWQoYTZ4eF9ncHUtPnNxZV9ibyk7CisJfQorCisJYTZ4eF9nbXVfcmVtb3ZlKGE2 eHhfZ3B1KTsKKworCWFkcmVub19ncHVfY2xlYW51cChhZHJlbm9fZ3B1KTsKKwlrZnJlZShhNnh4 X2dwdSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWRyZW5vX2dwdV9mdW5jcyBmdW5jcyA9 IHsKKwkuYmFzZSA9IHsKKwkJLmdldF9wYXJhbSA9IGFkcmVub19nZXRfcGFyYW0sCisJCS5od19p bml0ID0gYTZ4eF9od19pbml0LAorCQkucG1fc3VzcGVuZCA9IGE2eHhfcG1fc3VzcGVuZCwKKwkJ LnBtX3Jlc3VtZSA9IGE2eHhfcG1fcmVzdW1lLAorCQkucmVjb3ZlciA9IGE2eHhfcmVjb3ZlciwK KwkJLnN1Ym1pdCA9IGE2eHhfc3VibWl0LAorCQkuZmx1c2ggPSBhNnh4X2ZsdXNoLAorCQkuYWN0 aXZlX3JpbmcgPSBhNnh4X2FjdGl2ZV9yaW5nLAorCQkuaXJxID0gYTZ4eF9pcnEsCisJCS5kZXN0 cm95ID0gYTZ4eF9kZXN0cm95LAorI2lmZGVmIENPTkZJR19ERUJVR19GUworCQkuc2hvdyA9IGE2 eHhfc2hvdywKKyNlbmRpZgorCX0sCisJLmdldF90aW1lc3RhbXAgPSBhNnh4X2dldF90aW1lc3Rh bXAsCit9OworCitzdHJ1Y3QgbXNtX2dwdSAqYTZ4eF9ncHVfaW5pdChzdHJ1Y3QgZHJtX2Rldmlj ZSAqZGV2KQoreworCXN0cnVjdCBtc21fZHJtX3ByaXZhdGUgKnByaXYgPSBkZXYtPmRldl9wcml2 YXRlOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSBwcml2LT5ncHVfcGRldjsKKwlz dHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGU7CisJc3RydWN0IGE2eHhfZ3B1ICphNnh4X2dwdTsKKwlz dHJ1Y3QgYWRyZW5vX2dwdSAqYWRyZW5vX2dwdTsKKwlzdHJ1Y3QgbXNtX2dwdSAqZ3B1OworCWlu dCByZXQ7CisKKwlhNnh4X2dwdSA9IGt6YWxsb2Moc2l6ZW9mKCphNnh4X2dwdSksIEdGUF9LRVJO RUwpOworCWlmICghYTZ4eF9ncHUpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJYWRy ZW5vX2dwdSA9ICZhNnh4X2dwdS0+YmFzZTsKKwlncHUgPSAmYWRyZW5vX2dwdS0+YmFzZTsKKwor CWFkcmVub19ncHUtPnJlZ2lzdGVycyA9IGE2eHhfcmVnaXN0ZXJzOworCWFkcmVub19ncHUtPnJl Z19vZmZzZXRzID0gYTZ4eF9yZWdpc3Rlcl9vZmZzZXRzOworCisJcmV0ID0gYWRyZW5vX2dwdV9p bml0KGRldiwgcGRldiwgYWRyZW5vX2dwdSwgJmZ1bmNzLCAxKTsKKwlpZiAocmV0KSB7CisJCWE2 eHhfZGVzdHJveSgmKGE2eHhfZ3B1LT5iYXNlLmJhc2UpKTsKKwkJcmV0dXJuIEVSUl9QVFIocmV0 KTsKKwl9CisKKwkvKiBDaGVjayBpZiB0aGVyZSBpcyBhIEdNVSBwaGFuZGxlIGFuZCBzZXQgaXQg dXAgKi8KKwlub2RlID0gb2ZfcGFyc2VfcGhhbmRsZShwZGV2LT5kZXYub2Zfbm9kZSwgImdtdSIs IDApOworCisJLyogRklYTUU6IEhvdyBkbyB3ZSBncmFjZWZ1bGx5IGhhbmRsZSB0aGlzPyAqLwor CUJVR19PTighbm9kZSk7CisKKwlyZXQgPSBhNnh4X2dtdV9wcm9iZShhNnh4X2dwdSwgbm9kZSk7 CisJaWYgKHJldCkgeworCQlhNnh4X2Rlc3Ryb3koJihhNnh4X2dwdS0+YmFzZS5iYXNlKSk7CisJ CXJldHVybiBFUlJfUFRSKHJldCk7CisJfQorCisJaWYgKGdwdS0+YXNwYWNlKQorCQltc21fbW11 X3NldF9mYXVsdF9oYW5kbGVyKGdwdS0+YXNwYWNlLT5tbXUsIGdwdSwKKwkJCQlhNnh4X2ZhdWx0 X2hhbmRsZXIpOworCisJcmV0dXJuIGdwdTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2Ry bS9tc20vYWRyZW5vL2E2eHhfZ3B1LmggYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2FkcmVuby9hNnh4 X2dwdS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMC4uZGQ2OWU1YjBl NjkyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9hZHJlbm8vYTZ4eF9n cHUuaApAQCAtMCwwICsxLDYwIEBACisvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIu MCAqLworLyogQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmln aHRzIHJlc2VydmVkLiAqLworCisjaWZuZGVmIF9fQTZYWF9HUFVfSF9fCisjZGVmaW5lIF9fQTZY WF9HUFVfSF9fCisKKworI2luY2x1ZGUgImFkcmVub19ncHUuaCIKKyNpbmNsdWRlICJhNnh4Lnht bC5oIgorCisjaW5jbHVkZSAiYTZ4eF9nbXUuaCIKKworZXh0ZXJuIGJvb2wgaGFuZ19kZWJ1ZzsK Kworc3RydWN0IGE2eHhfZ3B1IHsKKwlzdHJ1Y3QgYWRyZW5vX2dwdSBiYXNlOworCisJc3RydWN0 IGRybV9nZW1fb2JqZWN0ICpzcWVfYm87CisJdWludDY0X3Qgc3FlX2lvdmE7CisKKwlzdHJ1Y3Qg bXNtX3JpbmdidWZmZXIgKmN1cl9yaW5nOworCisJc3RydWN0IGE2eHhfZ211IGdtdTsKK307CisK KyNkZWZpbmUgdG9fYTZ4eF9ncHUoeCkgY29udGFpbmVyX29mKHgsIHN0cnVjdCBhNnh4X2dwdSwg YmFzZSkKKworLyoKKyAqIEdpdmVuIGEgcmVnaXN0ZXIgYW5kIGEgY291bnQsIHJldHVybiBhIHZh bHVlIHRvIHByb2dyYW0gaW50bworICogUkVHX0NQX1BST1RFQ1RfUkVHKG4pIC0gdGhpcyB3aWxs IGJsb2NrIGJvdGggcmVhZHMgYW5kIHdyaXRlcyBmb3IgX2xlbgorICogcmVnaXN0ZXJzIHN0YXJ0 aW5nIGF0IF9yZWcuCisgKi8KKyNkZWZpbmUgQTZYWF9QUk9URUNUX1JXKF9yZWcsIF9sZW4pIFwK KwkoKDEgPDwgMzEpIHwgXAorCSgoKF9sZW4pICYgMHgzRkZGKSA8PCAxOCkgfCAoKF9yZWcpICYg MHgzRkZGRikpCisKKy8qCisgKiBTYW1lIGFzIGFib3ZlLCBidXQgYWxsb3cgcmVhZHMgb3ZlciB0 aGUgcmFuZ2UuIEZvciBhcmVhcyBvZiBtaXhlZCB1c2UgKHN1Y2gKKyAqIGFzIHBlcmZvcm1hbmNl IGNvdW50ZXJzKSB0aGlzIGFsbG93cyB1cyB0byBwcm90ZWN0IGEgbXVjaCBsYXJnZXIgcmFuZ2Ug d2l0aCBhCisgKiBzaW5nbGUgcmVnaXN0ZXIKKyAqLworI2RlZmluZSBBNlhYX1BST1RFQ1RfUkRP TkxZKF9yZWcsIF9sZW4pIFwKKwkoKCgoX2xlbikgJiAweDNGRkYpIDw8IDE4KSB8ICgoX3JlZykg JiAweDNGRkZGKSkKKworCitpbnQgYTZ4eF9nbXVfcmVzdW1lKHN0cnVjdCBhNnh4X2dwdSAqZ3B1 KTsKK2ludCBhNnh4X2dtdV9zdG9wKHN0cnVjdCBhNnh4X2dwdSAqZ3B1KTsKKworaW50IGE2eHhf Z211X3dhaXRfZm9yX2lkbGUoc3RydWN0IGE2eHhfZ3B1ICpncHUpOworCitpbnQgYTZ4eF9nbXVf cmVzZXQoc3RydWN0IGE2eHhfZ3B1ICphNnh4X2dwdSk7Citib29sIGE2eHhfZ211X2lzaWRsZShz dHJ1Y3QgYTZ4eF9nbXUgKmdtdSk7CisKK2ludCBhNnh4X2dtdV9zZXRfb29iKHN0cnVjdCBhNnh4 X2dtdSAqZ211LCBlbnVtIGE2eHhfZ211X29vYl9zdGF0ZSBzdGF0ZSk7Cit2b2lkIGE2eHhfZ211 X2NsZWFyX29vYihzdHJ1Y3QgYTZ4eF9nbXUgKmdtdSwgZW51bSBhNnh4X2dtdV9vb2Jfc3RhdGUg c3RhdGUpOworCitpbnQgYTZ4eF9nbXVfcHJvYmUoc3RydWN0IGE2eHhfZ3B1ICphNnh4X2dwdSwg c3RydWN0IGRldmljZV9ub2RlICpub2RlKTsKK3ZvaWQgYTZ4eF9nbXVfcmVtb3ZlKHN0cnVjdCBh Nnh4X2dwdSAqYTZ4eF9ncHUpOworCisjZW5kaWYgLyogX19BNlhYX0dQVV9IX18gKi8KZGlmZiAt LWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vYWRyZW5vL2E2eHhfaGZpLmMgYi9kcml2ZXJzL2dw dS9kcm0vbXNtL2FkcmVuby9hNnh4X2hmaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAw MDAwMDAwMDAwMC4uZGU4YzdjNDMwMWVmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUv ZHJtL21zbS9hZHJlbm8vYTZ4eF9oZmkuYwpAQCAtMCwwICsxLDQzNSBAQAorLyogU1BEWC1MaWNl bnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgKi8KKy8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IFRo ZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAqLworCisjaW5jbHVkZSA8 bGludXgvY29tcGxldGlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2NpcmNfYnVmLmg+CisjaW5jbHVk ZSA8bGludXgvbGlzdC5oPgorCisjaW5jbHVkZSAiYTZ4eF9nbXUuaCIKKyNpbmNsdWRlICJhNnh4 X2dtdS54bWwuaCIKKworI2RlZmluZSBIRklfTVNHX0lEKHZhbCkgW3ZhbF0gPSAjdmFsCisKK3N0 YXRpYyBjb25zdCBjaGFyICogY29uc3QgYTZ4eF9oZmlfbXNnX2lkW10gPSB7CisJSEZJX01TR19J RChIRklfSDJGX01TR19JTklUKSwKKwlIRklfTVNHX0lEKEhGSV9IMkZfTVNHX0ZXX1ZFUlNJT04p LAorCUhGSV9NU0dfSUQoSEZJX0gyRl9NU0dfQldfVEFCTEUpLAorCUhGSV9NU0dfSUQoSEZJX0gy Rl9NU0dfUEVSRl9UQUJMRSksCisJSEZJX01TR19JRChIRklfSDJGX01TR19URVNUKSwKK307CisK K3N0YXRpYyBpbnQgYTZ4eF9oZmlfcXVldWVfcmVhZChzdHJ1Y3QgYTZ4eF9oZmlfcXVldWUgKnF1 ZXVlLCB1MzIgKmRhdGEsCisJCXUzMiBkd29yZHMpCit7CisJc3RydWN0IGE2eHhfaGZpX3F1ZXVl X2hlYWRlciAqaGVhZGVyID0gcXVldWUtPmhlYWRlcjsKKwl1MzIgaSwgaGRyLCBpbmRleCA9IGhl YWRlci0+cmVhZF9pbmRleDsKKworCWlmIChoZWFkZXItPnJlYWRfaW5kZXggPT0gaGVhZGVyLT53 cml0ZV9pbmRleCkgeworCQloZWFkZXItPnJ4X3JlcXVlc3QgPSAxOworCQlyZXR1cm4gMDsKKwl9 CisKKwloZHIgPSBxdWV1ZS0+ZGF0YVtpbmRleF07CisKKwkvKgorCSAqIElmIHdlIGFyZSB0byBh c3N1bWUgdGhhdCB0aGUgR01VIGZpcm13YXJlIGlzIGluIGZhY3QgYSByYXRpb25hbCBhY3Rvcgor CSAqIGFuZCBpcyBwcm9ncmFtbWVkIHRvIG5vdCBzZW5kIHVzIGEgbGFyZ2VyIHJlc3BvbnNlIHRo YW4gd2UgZXhwZWN0CisJICogdGhlbiB3ZSBjYW4gYWxzbyBhc3N1bWUgdGhhdCBpZiB0aGUgaGVh ZGVyIHNpemUgaXMgdW5leHBlY3RlZGx5IGxhcmdlCisJICogdGhhdCBpdCBpcyBkdWUgdG8gbWVt b3J5IGNvcnJ1cHRpb24gYW5kL29yIGhhcmR3YXJlIGZhaWx1cmUuIEluIHRoaXMKKwkgKiBjYXNl IHRoZSBvbmx5IHJlYXNvbmFibGUgY291cnNlIG9mIGFjdGlvbiBpcyB0byBCVUcoKSB0byBoZWxw IGhhcmRlbgorCSAqIHRoZSBmYWlsdXJlLgorCSAqLworCisJQlVHX09OKEhGSV9IRUFERVJfU0la RShoZHIpID4gZHdvcmRzKTsKKworCWZvciAoaSA9IDA7IGkgPCBIRklfSEVBREVSX1NJWkUoaGRy KTsgaSsrKSB7CisJCWRhdGFbaV0gPSBxdWV1ZS0+ZGF0YVtpbmRleF07CisJCWluZGV4ID0gKGlu ZGV4ICsgMSkgJSBoZWFkZXItPnNpemU7CisJfQorCisJaGVhZGVyLT5yZWFkX2luZGV4ID0gaW5k ZXg7CisJcmV0dXJuIEhGSV9IRUFERVJfU0laRShoZHIpOworfQorCitzdGF0aWMgaW50IGE2eHhf aGZpX3F1ZXVlX3dyaXRlKHN0cnVjdCBhNnh4X2dtdSAqZ211LAorCXN0cnVjdCBhNnh4X2hmaV9x dWV1ZSAqcXVldWUsIHUzMiAqZGF0YSwgdTMyIGR3b3JkcykKK3sKKwlzdHJ1Y3QgYTZ4eF9oZmlf cXVldWVfaGVhZGVyICpoZWFkZXIgPSBxdWV1ZS0+aGVhZGVyOworCXUzMiBpLCBzcGFjZSwgaW5k ZXggPSBoZWFkZXItPndyaXRlX2luZGV4OworCisJc3Bpbl9sb2NrKCZxdWV1ZS0+bG9jayk7CisK KwlzcGFjZSA9IENJUkNfU1BBQ0UoaGVhZGVyLT53cml0ZV9pbmRleCwgaGVhZGVyLT5yZWFkX2lu ZGV4LAorCQloZWFkZXItPnNpemUpOworCWlmIChzcGFjZSA8IGR3b3JkcykgeworCQloZWFkZXIt PmRyb3BwZWQrKzsKKwkJc3Bpbl91bmxvY2soJnF1ZXVlLT5sb2NrKTsKKwkJcmV0dXJuIC1FTk9T UEM7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGR3b3JkczsgaSsrKSB7CisJCXF1ZXVlLT5kYXRh W2luZGV4XSA9IGRhdGFbaV07CisJCWluZGV4ID0gKGluZGV4ICsgMSkgJSBoZWFkZXItPnNpemU7 CisJfQorCisJaGVhZGVyLT53cml0ZV9pbmRleCA9IGluZGV4OworCXNwaW5fdW5sb2NrKCZxdWV1 ZS0+bG9jayk7CisKKwlnbXVfd3JpdGUoZ211LCBSRUdfQTZYWF9HTVVfSE9TVDJHTVVfSU5UUl9T RVQsIDB4MDEpOworCXJldHVybiAwOworfQorCitzdHJ1Y3QgYTZ4eF9oZmlfcmVzcG9uc2Ugewor CXUzMiBpZDsKKwl1MzIgc2VxbnVtOworCXN0cnVjdCBsaXN0X2hlYWQgbm9kZTsKKwlzdHJ1Y3Qg Y29tcGxldGlvbiBjb21wbGV0ZTsKKworCXUzMiBlcnJvcjsKKwl1MzIgcGF5bG9hZFsxNl07Cit9 OworCisvKgorICogSW5jb21pbmcgSEZJIGFjayBtZXNzYWdlcyBjYW4gY29tZSBpbiBvdXQgb2Yg b3JkZXIgc28gd2UgbmVlZCB0byBzdG9yZSBhbGwKKyAqIHRoZSBwZW5kaW5nIG1lc3NhZ2VzIG9u IGEgbGlzdCB1bnRpbCB0aGV5IGFyZSBoYW5kbGVkLgorICovCitzdGF0aWMgc3BpbmxvY2tfdCBo ZmlfYWNrX2xvY2sgPSBfX1NQSU5fTE9DS19VTkxPQ0tFRChtZXNzYWdlX2xvY2spOworc3RhdGlj IExJU1RfSEVBRChoZmlfYWNrX2xpc3QpOworCitzdGF0aWMgdm9pZCBhNnh4X2hmaV9oYW5kbGVf YWNrKHN0cnVjdCBhNnh4X2dtdSAqZ211LAorCQlzdHJ1Y3QgYTZ4eF9oZmlfbXNnX3Jlc3BvbnNl ICptc2cpCit7CisJc3RydWN0IGE2eHhfaGZpX3Jlc3BvbnNlICpyZXNwOworCXUzMiBpZCwgc2Vx bnVtOworCisJLyogbXNnLT5yZXRfaGVhZGVyIGNvbnRhaW5zIHRoZSBoZWFkZXIgb2YgdGhlIG1l c3NhZ2UgYmVpbmcgYWNrZWQgKi8KKwlpZCA9IEhGSV9IRUFERVJfSUQobXNnLT5yZXRfaGVhZGVy KTsKKwlzZXFudW0gPSBIRklfSEVBREVSX1NFUU5VTShtc2ctPnJldF9oZWFkZXIpOworCisJc3Bp bl9sb2NrKCZoZmlfYWNrX2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkocmVzcCwgJmhmaV9h Y2tfbGlzdCwgbm9kZSkgeworCQlpZiAocmVzcC0+aWQgPT0gaWQgJiYgcmVzcC0+c2VxbnVtID09 IHNlcW51bSkgeworCQkJcmVzcC0+ZXJyb3IgPSBtc2ctPmVycm9yOworCQkJbWVtY3B5KHJlc3At PnBheWxvYWQsIG1zZy0+cGF5bG9hZCwKKwkJCQlzaXplb2YocmVzcC0+cGF5bG9hZCkpOworCisJ CQljb21wbGV0ZSgmcmVzcC0+Y29tcGxldGUpOworCQkJc3Bpbl91bmxvY2soJmhmaV9hY2tfbG9j ayk7CisJCQlyZXR1cm47CisJCX0KKwl9CisJc3Bpbl91bmxvY2soJmhmaV9hY2tfbG9jayk7CisK KwlkZXZfZXJyKGdtdS0+ZGV2LCAiTm9ib2R5IHdhcyB3YWl0aW5nIGZvciBIRkkgbWVzc2FnZSAl ZFxuIiwgc2VxbnVtKTsKK30KKworc3RhdGljIHZvaWQgYTZ4eF9oZmlfaGFuZGxlX2Vycm9yKHN0 cnVjdCBhNnh4X2dtdSAqZ211LAorCQlzdHJ1Y3QgYTZ4eF9oZmlfbXNnX3Jlc3BvbnNlICptc2cp Cit7CisJc3RydWN0IGE2eHhfaGZpX21zZ19lcnJvciAqZXJyb3IgPSAoc3RydWN0IGE2eHhfaGZp X21zZ19lcnJvciAqKSBtc2c7CisKKwlkZXZfZXJyKGdtdS0+ZGV2LCAiR01VIGZpcm13YXJlIGVy cm9yICVkXG4iLCBlcnJvci0+Y29kZSk7Cit9CisKK3ZvaWQgYTZ4eF9oZmlfdGFzayh1bnNpZ25l ZCBsb25nIGRhdGEpCit7CisJc3RydWN0IGE2eHhfZ211ICpnbXUgPSAoc3RydWN0IGE2eHhfZ211 ICopIGRhdGE7CisJc3RydWN0IGE2eHhfaGZpX3F1ZXVlICpxdWV1ZSA9ICZnbXUtPnF1ZXVlc1tI RklfUkVTUE9OU0VfUVVFVUVdOworCXN0cnVjdCBhNnh4X2hmaV9tc2dfcmVzcG9uc2UgcmVzcDsK KworCWZvciAoOzspIHsKKwkJdTMyIGlkOworCQlpbnQgcmV0ID0gYTZ4eF9oZmlfcXVldWVfcmVh ZChxdWV1ZSwgKHUzMiAqKSAmcmVzcCwKKwkJCXNpemVvZihyZXNwKSA+PiAyKTsKKworCQkvKiBS ZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29waWVkIG9yIG5lZ2F0aXZlIG9uIGVycm9yICov CisJCWlmIChyZXQgPD0gMCkgeworCQkJaWYgKHJldCA8IDApCisJCQkJZGV2X2VycihnbXUtPmRl diwKKwkJCQkJIlVuYWJsZSB0byByZWFkIHRoZSBIRkkgbWVzc2FnZSBxdWV1ZVxuIik7CisJCQli cmVhazsKKwkJfQorCisJCWlkID0gSEZJX0hFQURFUl9JRChyZXNwLmhlYWRlcik7CisKKwkJaWYg KGlkID09IEhGSV9GMkhfTVNHX0FDSykKKwkJCWE2eHhfaGZpX2hhbmRsZV9hY2soZ211LCAmcmVz cCk7CisJCWVsc2UgaWYgKGlkID09IEhGSV9GMkhfTVNHX0VSUk9SKQorCQkJYTZ4eF9oZmlfaGFu ZGxlX2Vycm9yKGdtdSwgJnJlc3ApOworCX0KK30KKworc3RhdGljIGludCBhNnh4X2hmaV9zZW5k X21zZyhzdHJ1Y3QgYTZ4eF9nbXUgKmdtdSwgaW50IGlkLAorCQl2b2lkICpkYXRhLCB1MzIgc2l6 ZSwgdTMyICpwYXlsb2FkLCB1MzIgcGF5bG9hZF9zaXplKQoreworCXN0cnVjdCBhNnh4X2hmaV9x dWV1ZSAqcXVldWUgPSAmZ211LT5xdWV1ZXNbSEZJX0NPTU1BTkRfUVVFVUVdOworCXN0cnVjdCBh Nnh4X2hmaV9yZXNwb25zZSByZXNwID0geyAwIH07CisJaW50IHJldCwgZHdvcmRzID0gc2l6ZSA+ PiAyOworCXUzMiBzZXFudW07CisKKwlzZXFudW0gPSBhdG9taWNfaW5jX3JldHVybigmcXVldWUt PnNlcW51bSkgJSAweGZmZjsKKworCS8qIEZpcnN0IGR3b3JkIG9mIHRoZSBtZXNzYWdlIGlzIHRo ZSBtZXNzYWdlIGhlYWRlciAtIGZpbGwgaXQgaW4gKi8KKwkqKCh1MzIgKikgZGF0YSkgPSAoc2Vx bnVtIDw8IDIwKSB8IChIRklfTVNHX0NNRCA8PCAxNikgfAorCQkoZHdvcmRzIDw8IDgpIHwgaWQ7 CisKKwlpbml0X2NvbXBsZXRpb24oJnJlc3AuY29tcGxldGUpOworCXJlc3AuaWQgPSBpZDsKKwly ZXNwLnNlcW51bSA9IHNlcW51bTsKKworCXNwaW5fbG9ja19iaCgmaGZpX2Fja19sb2NrKTsKKwls aXN0X2FkZF90YWlsKCZyZXNwLm5vZGUsICZoZmlfYWNrX2xpc3QpOworCXNwaW5fdW5sb2NrX2Jo KCZoZmlfYWNrX2xvY2spOworCisJcmV0ID0gYTZ4eF9oZmlfcXVldWVfd3JpdGUoZ211LCBxdWV1 ZSwgZGF0YSwgZHdvcmRzKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZ211LT5kZXYsICJVbmFi bGUgdG8gc2VuZCBtZXNzYWdlICVzIGlkICVkXG4iLAorCQkJYTZ4eF9oZmlfbXNnX2lkW2lkXSwg c2VxbnVtKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogV2FpdCB1cCB0byA1IHNlY29uZHMgZm9y IHRoZSByZXNwb25zZSAqLworCXJldCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmcmVz cC5jb21wbGV0ZSwKKwkJbXNlY3NfdG9famlmZmllcyg1MDAwKSk7CisJaWYgKCFyZXQpIHsKKwkJ ZGV2X2VycihnbXUtPmRldiwKKwkJCSJNZXNzYWdlICVzIGlkICVkIHRpbWVkIG91dCB3YWl0aW5n IGZvciByZXNwb25zZVxuIiwKKwkJCWE2eHhfaGZpX21zZ19pZFtpZF0sIHNlcW51bSk7CisJCXJl dCA9IC1FVElNRURPVVQ7CisJfSBlbHNlCisJCXJldCA9IDA7CisKK291dDoKKwlzcGluX2xvY2tf YmgoJmhmaV9hY2tfbG9jayk7CisJbGlzdF9kZWwoJnJlc3Aubm9kZSk7CisJc3Bpbl91bmxvY2tf YmgoJmhmaV9hY2tfbG9jayk7CisKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaWYgKHJl c3AuZXJyb3IpIHsKKwkJZGV2X2VycihnbXUtPmRldiwgIk1lc3NhZ2UgJXMgaWQgJWQgcmV0dXJu ZWQgZXJyb3IgJWRcbiIsCisJCQlhNnh4X2hmaV9tc2dfaWRbaWRdLCBzZXFudW0sIHJlc3AuZXJy b3IpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAocGF5bG9hZCAmJiBwYXlsb2FkX3Np emUpIHsKKwkJaW50IGNvcHkgPSBtaW5fdCh1MzIsIHBheWxvYWRfc2l6ZSwgc2l6ZW9mKHJlc3Au cGF5bG9hZCkpOworCisJCW1lbWNweShwYXlsb2FkLCByZXNwLnBheWxvYWQsIGNvcHkpOworCX0K KworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGE2eHhfaGZpX3NlbmRfZ211X2luaXQoc3Ry dWN0IGE2eHhfZ211ICpnbXUsIGludCBib290X3N0YXRlKQoreworCXN0cnVjdCBhNnh4X2hmaV9t c2dfZ211X2luaXRfY21kIG1zZyA9IHsgMCB9OworCisJbXNnLmRiZ19idWZmZXJfYWRkciA9ICh1 MzIpIGdtdS0+ZGVidWctPmlvdmE7CisJbXNnLmRiZ19idWZmZXJfc2l6ZSA9ICh1MzIpIGdtdS0+ ZGVidWctPnNpemU7CisJbXNnLmJvb3Rfc3RhdGUgPSBib290X3N0YXRlOworCisJcmV0dXJuIGE2 eHhfaGZpX3NlbmRfbXNnKGdtdSwgSEZJX0gyRl9NU0dfSU5JVCwgJm1zZywgc2l6ZW9mKG1zZyks CisJCU5VTEwsIDApOworfQorCitzdGF0aWMgaW50IGE2eHhfaGZpX2dldF9md192ZXJzaW9uKHN0 cnVjdCBhNnh4X2dtdSAqZ211LCB1MzIgKnZlcnNpb24pCit7CisJc3RydWN0IGE2eHhfaGZpX21z Z19md192ZXJzaW9uIG1zZyA9IHsgMCB9OworCisJLyogQ3VycmVudGx5IHN1cHBvcnRpbmcgdmVy c2lvbiAxLjEgKi8KKwltc2cuc3VwcG9ydGVkX3ZlcnNpb24gPSAoMSA8PCAyOCkgfCAoMSA8PCAx Nik7CisKKwlyZXR1cm4gYTZ4eF9oZmlfc2VuZF9tc2coZ211LCBIRklfSDJGX01TR19GV19WRVJT SU9OLCAmbXNnLCBzaXplb2YobXNnKSwKKwkJdmVyc2lvbiwgc2l6ZW9mKCp2ZXJzaW9uKSk7Cit9 CisKK3N0YXRpYyBpbnQgYTZ4eF9oZmlfc2VuZF9wZXJmX3RhYmxlKHN0cnVjdCBhNnh4X2dtdSAq Z211KQoreworCXN0cnVjdCBhNnh4X2hmaV9tc2dfcGVyZl90YWJsZSBtc2cgPSB7IDAgfTsKKwlp bnQgaTsKKworCW1zZy5udW1fZ3B1X2xldmVscyA9IGdtdS0+bnJfZ3B1X2ZyZXFzOworCW1zZy5u dW1fZ211X2xldmVscyA9IGdtdS0+bnJfZ211X2ZyZXFzOworCisJZm9yIChpID0gMDsgaSA8IGdt dS0+bnJfZ3B1X2ZyZXFzOyBpKyspIHsKKwkJbXNnLmd4X3ZvdGVzW2ldLnZvdGUgPSBnbXUtPmd4 X2FyY192b3Rlc1tpXTsKKwkJbXNnLmd4X3ZvdGVzW2ldLnZvdGUgPSBnbXUtPmdwdV9mcmVxc1tp XSAvIDEwMDA7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGdtdS0+bnJfZ211X2ZyZXFzOyBpKysp IHsKKwkJbXNnLmN4X3ZvdGVzW2ldLnZvdGUgPSBnbXUtPmN4X2FyY192b3Rlc1tpXTsKKwkJbXNn LmN4X3ZvdGVzW2ldLnZvdGUgPSBnbXUtPmdtdV9mcmVxc1tpXSAvIDEwMDA7CisJfQorCisJcmV0 dXJuIGE2eHhfaGZpX3NlbmRfbXNnKGdtdSwgSEZJX0gyRl9NU0dfUEVSRl9UQUJMRSwgJm1zZywg c2l6ZW9mKG1zZyksCisJCU5VTEwsIDApOworfQorCitzdGF0aWMgaW50IGE2eHhfaGZpX3NlbmRf YndfdGFibGUoc3RydWN0IGE2eHhfZ211ICpnbXUpCit7CisJc3RydWN0IGE2eHhfaGZpX21zZ19i d190YWJsZSBtc2cgPSB7IDAgfTsKKworCS8qCisJICogVGhlIHNkbTg0NSBHTVUgZG9lc24ndCBk byBidXMgZnJlcXVlbmN5IHNjYWxpbmcgb24gaXRzIG93biBidXQgaXQKKwkgKiBkb2VzIG5lZWQg YXQgbGVhc3Qgb25lIGVudHJ5IGluIHRoZSBsaXN0IGJlY2F1c2UgaXQgbWlnaHQgYmUgYWNjZXNz ZWQKKwkgKiB3aGVuIHRoZSBHTVUgaXMgc2h1dHRpbmcgZG93bi4gU2VuZCBhIHNpbmdsZSAib2Zm IiBlbnRyeS4KKwkgKi8KKworCW1zZy5id19sZXZlbF9udW0gPSAxOworCisJbXNnLmRkcl9jbWRz X251bSA9IDM7CisJbXNnLmRkcl93YWl0X2JpdG1hc2sgPSAweDA3OworCisJbXNnLmRkcl9jbWRz X2FkZHJzWzBdID0gMHg1MDAwMDsKKwltc2cuZGRyX2NtZHNfYWRkcnNbMV0gPSAweDUwMDVjOwor CW1zZy5kZHJfY21kc19hZGRyc1syXSA9IDB4NTAwMGM7CisKKwltc2cuZGRyX2NtZHNfZGF0YVsw XVswXSA9ICAweDQwMDAwMDAwOworCW1zZy5kZHJfY21kc19kYXRhWzBdWzFdID0gIDB4NDAwMDAw MDA7CisJbXNnLmRkcl9jbWRzX2RhdGFbMF1bMl0gPSAgMHg0MDAwMDAwMDsKKworCS8qCisJICog VGhlc2UgYXJlIHRoZSBDWCAoQ05PQykgdm90ZXMuICBUaGlzIGlzIHVzZWQgYnV0IHRoZSB2YWx1 ZXMgZm9yIHRoZQorCSAqIHNkbTg0NSBHTVUgYXJlIGtub3duIGFuZCBmaXhlZCBzbyB3ZSBjYW4g aGFyZCBjb2RlIHRoZW0uCisJICovCisKKwltc2cuY25vY19jbWRzX251bSA9IDM7CisJbXNnLmNu b2Nfd2FpdF9iaXRtYXNrID0gMHgwNTsKKworCW1zZy5jbm9jX2NtZHNfYWRkcnNbMF0gPSAweDUw MDM0OworCW1zZy5jbm9jX2NtZHNfYWRkcnNbMV0gPSAweDUwMDdjOworCW1zZy5jbm9jX2NtZHNf YWRkcnNbMl0gPSAweDUwMDRjOworCisJbXNnLmNub2NfY21kc19kYXRhWzBdWzBdID0gIDB4NDAw MDAwMDA7CisJbXNnLmNub2NfY21kc19kYXRhWzBdWzFdID0gIDB4MDAwMDAwMDA7CisJbXNnLmNu b2NfY21kc19kYXRhWzBdWzJdID0gIDB4NDAwMDAwMDA7CisKKwltc2cuY25vY19jbWRzX2RhdGFb MV1bMF0gPSAgMHg2MDAwMDAwMTsKKwltc2cuY25vY19jbWRzX2RhdGFbMV1bMV0gPSAgMHgyMDAw MDAwMTsKKwltc2cuY25vY19jbWRzX2RhdGFbMV1bMl0gPSAgMHg2MDAwMDAwMTsKKworCXJldHVy biBhNnh4X2hmaV9zZW5kX21zZyhnbXUsIEhGSV9IMkZfTVNHX0JXX1RBQkxFLCAmbXNnLCBzaXpl b2YobXNnKSwKKwkJTlVMTCwgMCk7Cit9CisKK3N0YXRpYyBpbnQgYTZ4eF9oZmlfc2VuZF90ZXN0 KHN0cnVjdCBhNnh4X2dtdSAqZ211KQoreworCXN0cnVjdCBhNnh4X2hmaV9tc2dfdGVzdCBtc2cg PSB7IDAgfTsKKworCXJldHVybiBhNnh4X2hmaV9zZW5kX21zZyhnbXUsIEhGSV9IMkZfTVNHX1RF U1QsICZtc2csIHNpemVvZihtc2cpLAorCQlOVUxMLCAwKTsKK30KKworaW50IGE2eHhfaGZpX3N0 YXJ0KHN0cnVjdCBhNnh4X2dtdSAqZ211LCBpbnQgYm9vdF9zdGF0ZSkKK3sKKwlpbnQgcmV0Owor CisJcmV0ID0gYTZ4eF9oZmlfc2VuZF9nbXVfaW5pdChnbXUsIGJvb3Rfc3RhdGUpOworCWlmIChy ZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBhNnh4X2hmaV9nZXRfZndfdmVyc2lvbihnbXUs IE5VTEwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKgorCSAqIFdlIGhhdmUgdG8g Z2V0IGV4Y2hhbmdlIHZlcnNpb24gbnVtYmVycyBwZXIgdGhlIHNlcXVlbmNlIGJ1dCBhdCB0aGlz CisJICogcG9pbnQgdGgga2VybmVsIGRyaXZlciBkb2Vzbid0IG5lZWQgdG8ga25vdyB0aGUgZXhh Y3QgdmVyc2lvbiBvZgorCSAqIHRoZSBHTVUgZmlybXdhcmUKKwkgKi8KKworCXJldCA9IGE2eHhf aGZpX3NlbmRfcGVyZl90YWJsZShnbXUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwly ZXQgPSBhNnh4X2hmaV9zZW5kX2J3X3RhYmxlKGdtdSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJl dDsKKworCS8qCisJICogTGV0IHRoZSBHTVUga25vdyB0aGF0IHRoZXJlIHdvbid0IGJlIGFueSBt b3JlIEhGSSBtZXNzYWdlcyB1bnRpbCBuZXh0CisJICogYm9vdAorCSAqLworCWE2eHhfaGZpX3Nl bmRfdGVzdChnbXUpOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgYTZ4eF9oZmlfc3RvcChzdHJ1 Y3QgYTZ4eF9nbXUgKmdtdSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9T SVpFKGdtdS0+cXVldWVzKTsgaSsrKSB7CisJCXN0cnVjdCBhNnh4X2hmaV9xdWV1ZSAqcXVldWUg PSAmZ211LT5xdWV1ZXNbaV07CisKKwkJaWYgKCFxdWV1ZS0+aGVhZGVyKQorCQkJY29udGludWU7 CisKKwkJaWYgKHF1ZXVlLT5oZWFkZXItPnJlYWRfaW5kZXggIT0gcXVldWUtPmhlYWRlci0+d3Jp dGVfaW5kZXgpCisJCQlkZXZfZXJyKGdtdS0+ZGV2LCAiSEZJIHF1ZXVlICVkIGlzIG5vdCBlbXB0 eVxuIiwgaSk7CisKKwkJcXVldWUtPmhlYWRlci0+cmVhZF9pbmRleCA9IDA7CisJCXF1ZXVlLT5o ZWFkZXItPndyaXRlX2luZGV4ID0gMDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGE2eHhfaGZpX3F1 ZXVlX2luaXQoc3RydWN0IGE2eHhfaGZpX3F1ZXVlICpxdWV1ZSwKKwkJc3RydWN0IGE2eHhfaGZp X3F1ZXVlX2hlYWRlciAqaGVhZGVyLCB2b2lkICp2aXJ0LCB1NjQgaW92YSwKKwkJdTMyIGlkKQor eworCXNwaW5fbG9ja19pbml0KCZxdWV1ZS0+bG9jayk7CisJcXVldWUtPmhlYWRlciA9IGhlYWRl cjsKKwlxdWV1ZS0+ZGF0YSA9IHZpcnQ7CisJYXRvbWljX3NldCgmcXVldWUtPnNlcW51bSwgMCk7 CisKKwkvKiBTZXQgdXAgdGhlIHNoYXJlZCBtZW1vcnkgaGVhZGVyICovCisJaGVhZGVyLT5pb3Zh ID0gaW92YTsKKwloZWFkZXItPnR5cGUgPSAgMTAgPDwgOCB8IGlkOworCWhlYWRlci0+c3RhdHVz ID0gMTsKKwloZWFkZXItPnNpemUgPSBTWl80SyA+PiAyOworCWhlYWRlci0+bXNnX3NpemUgPSAw OworCWhlYWRlci0+ZHJvcHBlZCA9IDA7CisJaGVhZGVyLT5yeF93YXRlcm1hcmsgPSAxOworCWhl YWRlci0+dHhfd2F0ZXJtYXJrID0gMTsKKwloZWFkZXItPnJ4X3JlcXVlc3QgPSAxOworCWhlYWRl ci0+dHhfcmVxdWVzdCA9IDA7CisJaGVhZGVyLT5yZWFkX2luZGV4ID0gMDsKKwloZWFkZXItPndy aXRlX2luZGV4ID0gMDsKK30KKwordm9pZCBhNnh4X2hmaV9pbml0KHN0cnVjdCBhNnh4X2dtdSAq Z211KQoreworCXN0cnVjdCBhNnh4X2dtdV9ibyAqaGZpID0gZ211LT5oZmk7CisJc3RydWN0IGE2 eHhfaGZpX3F1ZXVlX3RhYmxlX2hlYWRlciAqdGFibGUgPSBoZmktPnZpcnQ7CisJc3RydWN0IGE2 eHhfaGZpX3F1ZXVlX2hlYWRlciAqaGVhZGVycyA9IGhmaS0+dmlydCArIHNpemVvZigqdGFibGUp OworCXU2NCBvZmZzZXQ7CisJaW50IHRhYmxlX3NpemU7CisKKwkvKgorCSAqIFRoZSB0YWJsZSBz aXplIGlzIHRoZSBzaXplIG9mIHRoZSB0YWJsZSBoZWFkZXIgcGx1cyBhbGwgb2YgdGhlIHF1ZXVl CisJICogaGVhZGVycworCSAqLworCXRhYmxlX3NpemUgPSBzaXplb2YoKnRhYmxlKTsKKwl0YWJs ZV9zaXplICs9IChBUlJBWV9TSVpFKGdtdS0+cXVldWVzKSAqCisJCXNpemVvZihzdHJ1Y3QgYTZ4 eF9oZmlfcXVldWVfaGVhZGVyKSk7CisKKwl0YWJsZS0+dmVyc2lvbiA9IDA7CisJdGFibGUtPnNp emUgPSB0YWJsZV9zaXplOworCS8qIEZpcnN0IHF1ZXVlIGhlYWRlciBpcyBsb2NhdGVkIGltbWVk aWF0ZWx5IGFmdGVyIHRoZSB0YWJsZSBoZWFkZXIgKi8KKwl0YWJsZS0+cWhkcjBfb2Zmc2V0ID0g c2l6ZW9mKCp0YWJsZSkgPj4gMjsKKwl0YWJsZS0+cWhkcl9zaXplID0gc2l6ZW9mKHN0cnVjdCBh Nnh4X2hmaV9xdWV1ZV9oZWFkZXIpID4+IDI7CisJdGFibGUtPm51bV9xdWV1ZXMgPSBBUlJBWV9T SVpFKGdtdS0+cXVldWVzKTsKKwl0YWJsZS0+YWN0aXZlX3F1ZXVlcyA9IEFSUkFZX1NJWkUoZ211 LT5xdWV1ZXMpOworCisJLyogQ29tbWFuZCBxdWV1ZSAqLworCW9mZnNldCA9IFNaXzRLOworCWE2 eHhfaGZpX3F1ZXVlX2luaXQoJmdtdS0+cXVldWVzWzBdLCAmaGVhZGVyc1swXSwgaGZpLT52aXJ0 ICsgb2Zmc2V0LAorCQloZmktPmlvdmEgKyBvZmZzZXQsIDApOworCisJLyogR01VIHJlc3BvbnNl IHF1ZXVlICovCisJb2Zmc2V0ICs9IFNaXzRLOworCWE2eHhfaGZpX3F1ZXVlX2luaXQoJmdtdS0+ cXVldWVzWzFdLCAmaGVhZGVyc1sxXSwgaGZpLT52aXJ0ICsgb2Zmc2V0LAorCQloZmktPmlvdmEg KyBvZmZzZXQsIDQpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9hZHJlbm8v YTZ4eF9oZmkuaCBiL2RyaXZlcnMvZ3B1L2RybS9tc20vYWRyZW5vL2E2eHhfaGZpLmgKbmV3IGZp bGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwLi42MGQxMzE5ZmE0NGYKLS0tIC9kZXYv bnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2FkcmVuby9hNnh4X2hmaS5oCkBAIC0wLDAg KzEsMTI3IEBACisvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCAqLworLyogQ29w eXJpZ2h0IChjKSAyMDE3IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVk LiAqLworCisjaWZuZGVmIF9BNlhYX0hGSV9IXworI2RlZmluZSBfQTZYWF9IRklfSF8KKworc3Ry dWN0IGE2eHhfaGZpX3F1ZXVlX3RhYmxlX2hlYWRlciB7CisJdTMyIHZlcnNpb247CisJdTMyIHNp emU7CQkvKiBTaXplIG9mIHRoZSBxdWV1ZSB0YWJsZSBpbiBkd29yZHMgKi8KKwl1MzIgcWhkcjBf b2Zmc2V0OwkvKiBPZmZzZXQgb2YgdGhlIGZpcnN0IHF1ZXVlIGhlYWRlciAqLworCXUzMiBxaGRy X3NpemU7CQkvKiBTaXplIG9mIHRoZSBxdWV1ZSBoZWFkZXJzICovCisJdTMyIG51bV9xdWV1ZXM7 CQkvKiBOdW1iZXIgb2YgdG90YWwgcXVldWVzICovCisJdTMyIGFjdGl2ZV9xdWV1ZXM7CS8qIE51 bWJlciBvZiBhY3RpdmUgcXVldWVzICovCit9OworCitzdHJ1Y3QgYTZ4eF9oZmlfcXVldWVfaGVh ZGVyIHsKKwl1MzIgc3RhdHVzOworCXUzMiBpb3ZhOworCXUzMiB0eXBlOworCXUzMiBzaXplOwor CXUzMiBtc2dfc2l6ZTsKKwl1MzIgZHJvcHBlZDsKKwl1MzIgcnhfd2F0ZXJtYXJrOworCXUzMiB0 eF93YXRlcm1hcms7CisJdTMyIHJ4X3JlcXVlc3Q7CisJdTMyIHR4X3JlcXVlc3Q7CisJdTMyIHJl YWRfaW5kZXg7CisJdTMyIHdyaXRlX2luZGV4OworfTsKKworc3RydWN0IGE2eHhfaGZpX3F1ZXVl IHsKKwlzdHJ1Y3QgYTZ4eF9oZmlfcXVldWVfaGVhZGVyICpoZWFkZXI7CisJc3BpbmxvY2tfdCBs b2NrOworCXUzMiAqZGF0YTsKKwlhdG9taWNfdCBzZXFudW07Cit9OworCisvKiBUaGlzIGlzIHRo ZSBvdXRnb2luZyBxdWV1ZSB0byB0aGUgR01VICovCisjZGVmaW5lIEhGSV9DT01NQU5EX1FVRVVF IDAKKworLyogVEhpcyBpcyB0aGUgaW5jb21pbmcgcmVzcG9uc2UgcXVldWUgZnJvbSB0aGUgR01V ICovCisjZGVmaW5lIEhGSV9SRVNQT05TRV9RVUVVRSAxCisKKyNkZWZpbmUgSEZJX0hFQURFUl9J RChtc2cpICgobXNnKSAmIDB4ZmYpCisjZGVmaW5lIEhGSV9IRUFERVJfU0laRShtc2cpICgoKG1z ZykgPj4gOCkgJiAweGZmKQorI2RlZmluZSBIRklfSEVBREVSX1NFUU5VTShtc2cpICgoKG1zZykg Pj4gMjApICYgMHhmZmYpCisKKy8qIEZJWE1FOiBEbyB3ZSBuZWVkIHRoaXMgb3IgY2FuIHdlIHVz ZSBBUlJBWV9TSVpFPyAqLworI2RlZmluZSBIRklfUkVTUE9OU0VfUEFZTE9BRF9TSVpFIDE2CisK Ky8qIEhGSSBtZXNzYWdlIHR5cGVzICovCisKKyNkZWZpbmUgSEZJX01TR19DTUQgMAorI2RlZmlu ZSBIRklfTVNHX0FDSyAyCisKKyNkZWZpbmUgSEZJX0YySF9NU0dfQUNLIDEyNgorCitzdHJ1Y3Qg YTZ4eF9oZmlfbXNnX3Jlc3BvbnNlIHsKKwl1MzIgaGVhZGVyOworCXUzMiByZXRfaGVhZGVyOwor CXUzMiBlcnJvcjsKKwl1MzIgcGF5bG9hZFtIRklfUkVTUE9OU0VfUEFZTE9BRF9TSVpFXTsKK307 CisKKyNkZWZpbmUgSEZJX0YySF9NU0dfRVJST1IgMTAwCisKK3N0cnVjdCBhNnh4X2hmaV9tc2df ZXJyb3IgeworCXUzMiBoZWFkZXI7CisJdTMyIGNvZGU7CisJdTMyIHBheWxvYWRbMl07Cit9Owor CisjZGVmaW5lIEhGSV9IMkZfTVNHX0lOSVQgMAorCitzdHJ1Y3QgYTZ4eF9oZmlfbXNnX2dtdV9p bml0X2NtZCB7CisJdTMyIGhlYWRlcjsKKwl1MzIgc2VnX2lkOworCXUzMiBkYmdfYnVmZmVyX2Fk ZHI7CisJdTMyIGRiZ19idWZmZXJfc2l6ZTsKKwl1MzIgYm9vdF9zdGF0ZTsKK307CisKKyNkZWZp bmUgSEZJX0gyRl9NU0dfRldfVkVSU0lPTiAxCisKK3N0cnVjdCBhNnh4X2hmaV9tc2dfZndfdmVy c2lvbiB7CisJdTMyIGhlYWRlcjsKKwl1MzIgc3VwcG9ydGVkX3ZlcnNpb247Cit9OworCisjZGVm aW5lIEhGSV9IMkZfTVNHX1BFUkZfVEFCTEUgNAorCitzdHJ1Y3QgcGVyZl9sZXZlbCB7CisJdTMy IHZvdGU7CisJdTMyIGZyZXE7Cit9OworCitzdHJ1Y3QgYTZ4eF9oZmlfbXNnX3BlcmZfdGFibGUg eworCXUzMiBoZWFkZXI7CisJdTMyIG51bV9ncHVfbGV2ZWxzOworCXUzMiBudW1fZ211X2xldmVs czsKKworCXN0cnVjdCBwZXJmX2xldmVsIGd4X3ZvdGVzWzE2XTsKKwlzdHJ1Y3QgcGVyZl9sZXZl bCBjeF92b3Rlc1s0XTsKK307CisKKyNkZWZpbmUgSEZJX0gyRl9NU0dfQldfVEFCTEUgMworCitz dHJ1Y3QgYTZ4eF9oZmlfbXNnX2J3X3RhYmxlIHsKKwl1MzIgaGVhZGVyOworCXUzMiBid19sZXZl bF9udW07CisJdTMyIGNub2NfY21kc19udW07CisJdTMyIGRkcl9jbWRzX251bTsKKwl1MzIgY25v Y193YWl0X2JpdG1hc2s7CisJdTMyIGRkcl93YWl0X2JpdG1hc2s7CisJdTMyIGNub2NfY21kc19h ZGRyc1s2XTsKKwl1MzIgY25vY19jbWRzX2RhdGFbMl1bNl07CisJdTMyIGRkcl9jbWRzX2FkZHJz WzhdOworCXUzMiBkZHJfY21kc19kYXRhWzE2XVs4XTsKK307CisKKyNkZWZpbmUgSEZJX0gyRl9N U0dfVEVTVCA1CisKK3N0cnVjdCBhNnh4X2hmaV9tc2dfdGVzdCB7CisJdTMyIGhlYWRlcjsKK307 CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9hZHJlbm8vYWRyZW5v X2RldmljZS5jIGIvZHJpdmVycy9ncHUvZHJtL21zbS9hZHJlbm8vYWRyZW5vX2RldmljZS5jCmlu ZGV4IDhlMGNiMTYxNzU0Yi4uYTA3NDIyYWE2YmQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9k cm0vbXNtL2FkcmVuby9hZHJlbm9fZGV2aWNlLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9h ZHJlbm8vYWRyZW5vX2RldmljZS5jCkBAIC0xMDAsNiArMTAwLDE2IEBAIHN0YXRpYyBjb25zdCBz dHJ1Y3QgYWRyZW5vX2luZm8gZ3B1bGlzdFtdID0gewogCQkJQURSRU5PX1FVSVJLX0ZBVUxUX0RF VEVDVF9NQVNLLAogCQkuaW5pdCA9IGE1eHhfZ3B1X2luaXQsCiAJCS56YXBmdyA9ICJhNTMwX3ph cC5tZHQiLAorCX0sIHsKKwkJLnJldiA9IEFEUkVOT19SRVYoNiwgMywgMCwgQU5ZX0lEKSwKKwkJ LnJldm4gPSA2MzAsCisJCS5uYW1lID0gIkE2MzAiLAorCQkuZncgPSB7CisJCQlbQURSRU5PX0ZX X1NRRV0gPSAiYTYzMF9zcWUuZnciLAorCQkJW0FEUkVOT19GV19HTVVdID0gImE2MzBfZ211LmJp biIsCisJCX0sCisJCS5nbWVtID0gU1pfMU0sCisJCS5pbml0ID0gYTZ4eF9ncHVfaW5pdCwKIAl9 LAogfTsKIApAQCAtMTE2LDYgKzEyNiw4IEBAIE1PRFVMRV9GSVJNV0FSRSgicWNvbS9hNTMwX3ph cC5tZHQiKTsKIE1PRFVMRV9GSVJNV0FSRSgicWNvbS9hNTMwX3phcC5iMDAiKTsKIE1PRFVMRV9G SVJNV0FSRSgicWNvbS9hNTMwX3phcC5iMDEiKTsKIE1PRFVMRV9GSVJNV0FSRSgicWNvbS9hNTMw X3phcC5iMDIiKTsKK01PRFVMRV9GSVJNV0FSRSgicWNvbS9hNjMwX3NxZS5mdyIpOworTU9EVUxF X0ZJUk1XQVJFKCJxY29tL2E2MzBfZ211LmJpbiIpOwogCiBzdGF0aWMgaW5saW5lIGJvb2wgX3Jl dl9tYXRjaCh1aW50OF90IGVudHJ5LCB1aW50OF90IGlkKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVy cy9ncHUvZHJtL21zbS9hZHJlbm8vYWRyZW5vX2dwdS5jIGIvZHJpdmVycy9ncHUvZHJtL21zbS9h ZHJlbm8vYWRyZW5vX2dwdS5jCmluZGV4IDE3ZDA1MDZkMDU4Yy4uNWMxYTI4ODE0OWYzIDEwMDY0 NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbXNtL2FkcmVuby9hZHJlbm9fZ3B1LmMKKysrIGIvZHJp dmVycy9ncHUvZHJtL21zbS9hZHJlbm8vYWRyZW5vX2dwdS5jCkBAIC0xMzgsNyArMTM4LDcgQEAg YWRyZW5vX3JlcXVlc3RfZncoc3RydWN0IGFkcmVub19ncHUgKmFkcmVub19ncHUsIGNvbnN0IGNo YXIgKmZ3bmFtZSkKIAlyZXR1cm4gRVJSX1BUUigtRU5PRU5UKTsKIH0KIAotc3RhdGljIGludCBh ZHJlbm9fbG9hZF9mdyhzdHJ1Y3QgYWRyZW5vX2dwdSAqYWRyZW5vX2dwdSkKK2ludCBhZHJlbm9f bG9hZF9mdyhzdHJ1Y3QgYWRyZW5vX2dwdSAqYWRyZW5vX2dwdSkKIHsKIAlpbnQgaTsKIApkaWZm IC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9hZHJlbm8vYWRyZW5vX2dwdS5oIGIvZHJpdmVy cy9ncHUvZHJtL21zbS9hZHJlbm8vYWRyZW5vX2dwdS5oCmluZGV4IGQ2YjBlN2I4MTNmNC4uOTQ3 NjRkMDAxYTUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbXNtL2FkcmVuby9hZHJlbm9f Z3B1LmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9hZHJlbm8vYWRyZW5vX2dwdS5oCkBAIC01 MCw3ICs1MCw5IEBAIGVudW0gYWRyZW5vX3JlZ3MgewogCiBlbnVtIHsKIAlBRFJFTk9fRldfUE00 ID0gMCwKKwlBRFJFTk9fRldfU1FFID0gMCwgLyogYTZ4eCAqLwogCUFEUkVOT19GV19QRlAgPSAx LAorCUFEUkVOT19GV19HTVUgPSAxLCAvKiBhNnh4ICovCiAJQURSRU5PX0ZXX0dQTVUgPSAyLAog CUFEUkVOT19GV19NQVgsCiB9OwpAQCAtMTUxLDcgKzE1Myw2IEBAIHN0cnVjdCBhZHJlbm9fcGxh dGZvcm1fY29uZmlnIHsKIAlfX3JldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBcCiB9KQogCi0KIHN0YXRpYyBpbmxpbmUgYm9vbCBhZHJlbm9faXNfYTN4eChz dHJ1Y3QgYWRyZW5vX2dwdSAqZ3B1KQogewogCXJldHVybiAoZ3B1LT5yZXZuID49IDMwMCkgJiYg KGdwdS0+cmV2biA8IDQwMCk7CkBAIC0yMjYsNiArMjI3LDcgQEAgaW50IGFkcmVub19ncHVfaW5p dChzdHJ1Y3QgZHJtX2RldmljZSAqZHJtLCBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAog CQlzdHJ1Y3QgYWRyZW5vX2dwdSAqZ3B1LCBjb25zdCBzdHJ1Y3QgYWRyZW5vX2dwdV9mdW5jcyAq ZnVuY3MsCiAJCWludCBucl9yaW5ncyk7CiB2b2lkIGFkcmVub19ncHVfY2xlYW51cChzdHJ1Y3Qg YWRyZW5vX2dwdSAqZ3B1KTsKK2ludCBhZHJlbm9fbG9hZF9mdyhzdHJ1Y3QgYWRyZW5vX2dwdSAq YWRyZW5vX2dwdSk7CiAKIAogLyogcmluZ2J1ZmZlciBoZWxwZXJzICh0aGUgcGFydHMgdGhhdCBh cmUgYWRyZW5vIHNwZWNpZmljKSAqLwpAQCAtMzI4LDYgKzMzMCw3IEBAIHN0YXRpYyBpbmxpbmUg dm9pZCBhZHJlbm9fZ3B1X3dyaXRlKHN0cnVjdCBhZHJlbm9fZ3B1ICpncHUsCiBzdHJ1Y3QgbXNt X2dwdSAqYTN4eF9ncHVfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIHN0cnVjdCBtc21f Z3B1ICphNHh4X2dwdV9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogc3RydWN0IG1zbV9n cHUgKmE1eHhfZ3B1X2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CitzdHJ1Y3QgbXNtX2dw dSAqYTZ4eF9ncHVfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIAogc3RhdGljIGlubGlu ZSB2b2lkIGFkcmVub19ncHVfd3JpdGU2NChzdHJ1Y3QgYWRyZW5vX2dwdSAqZ3B1LAogCQllbnVt IGFkcmVub19yZWdzIGxvLCBlbnVtIGFkcmVub19yZWdzIGhpLCB1NjQgZGF0YSkKZGlmZiAtLWdp dCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vbXNtX2dwdS5jIGIvZHJpdmVycy9ncHUvZHJtL21zbS9t c21fZ3B1LmMKaW5kZXggMWMwOWFjZmI0MDI4Li4wZDAyZTE5N2Y4YmIgMTAwNjQ0Ci0tLSBhL2Ry aXZlcnMvZ3B1L2RybS9tc20vbXNtX2dwdS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vbXNt X2dwdS5jCkBAIC04Nyw3ICs4Nyw3IEBAIHN0YXRpYyBzdHJ1Y3QgZGV2ZnJlcV9kZXZfcHJvZmls ZSBtc21fZGV2ZnJlcV9wcm9maWxlID0gewogc3RhdGljIHZvaWQgbXNtX2RldmZyZXFfaW5pdChz dHJ1Y3QgbXNtX2dwdSAqZ3B1KQogewogCS8qIFdlIG5lZWQgdGFyZ2V0IHN1cHBvcnQgdG8gZG8g ZGV2ZnJlcSAqLwotCWlmICghZ3B1LT5mdW5jcy0+Z3B1X2J1c3kpCisJaWYgKCFncHUtPmZ1bmNz LT5ncHVfYnVzeSB8fCAhZ3B1LT5jb3JlX2NsaykKIAkJcmV0dXJuOwogCiAJbXNtX2RldmZyZXFf cHJvZmlsZS5pbml0aWFsX2ZyZXEgPSBncHUtPmZhc3RfcmF0ZTsKLS0gCjIuMTYuMQoKX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KRnJlZWRyZW5vIG1haWxp bmcgbGlzdApGcmVlZHJlbm9AbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJl ZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vZnJlZWRyZW5vCg==