From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jordan Crouse Subject: [PATCH 5/5] drm/msm: Add A6XX device support Date: Tue, 19 Jun 2018 16:30:06 -0600 Message-ID: <20180619223006.31519-6-jcrouse@codeaurora.org> References: <20180619223006.31519-1-jcrouse@codeaurora.org> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <20180619223006.31519-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: dri-devel@lists.freedesktop.org QWRkIHN1cHBvcnQgZm9yIHRoZSBBNlhYIGZhbWlseSBvZiBBZHJlbm8gR1BVcy4gVGhlIGJpZ2dl c3QgYWRkaXRpb24KaXMgdGhlIEdNVSAoR3JhcGhpY3MgTWFuYWdlbWVudCBVbml0KSB3aGljaCB0 YWtlcyBvdmVyIG1vc3Qgb2YgdGhlCnBvd2VyIG1hbmFnZW1lbnQgb2YgdGhlIEdQVSBpdHNlbGYg YnV0IGluIGEgaXJvbmljIHR3aXN0IG9mIGZhdGUKbmVlZHMgYSBnb29kbHkgYW1vdW50IG9mIG1h bmFnZW1lbnQgaXRzZWxmLiAgQWRkIHN1cHBvcnQgZm9yIHRoZQpBNlhYIGNvcmUgY29kZSwgdGhl IEdNVSBhbmQgdGhlIEhGSSAoaGFyZHdhcmUgZmlybXdhcmUgaW50ZXJmYWNlKQpxdWV1ZSB0aGF0 IHRoZSBDUFUgdXNlcyB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBHTVUuCgpTaWduZWQtb2ZmLWJ5 OiBKb3JkYW4gQ3JvdXNlIDxqY3JvdXNlQGNvZGVhdXJvcmEub3JnPgotLS0KIGRyaXZlcnMvZ3B1 L2RybS9tc20vTWFrZWZpbGUgICAgICAgICAgICAgICB8ICAgIDMgKwogZHJpdmVycy9ncHUvZHJt L21zbS9hZHJlbm8vYTZ4eF9nbXUuYyAgICAgIHwgMTE3MiArKysrKysrKysrKysrKysrKysrKwog ZHJpdmVycy9ncHUvZHJtL21zbS9hZHJlbm8vYTZ4eF9nbXUuaCAgICAgIHwgIDE2MiArKysKIGRy aXZlcnMvZ3B1L2RybS9tc20vYWRyZW5vL2E2eHhfZ3B1LmMgICAgICB8ICA4MDcgKysrKysrKysr KysrKysKIGRyaXZlcnMvZ3B1L2RybS9tc20vYWRyZW5vL2E2eHhfZ3B1LmggICAgICB8ICAgNjAg KwogZHJpdmVycy9ncHUvZHJtL21zbS9hZHJlbm8vYTZ4eF9oZmkuYyAgICAgIHwgIDQzNSArKysr KysrKwogZHJpdmVycy9ncHUvZHJtL21zbS9hZHJlbm8vYTZ4eF9oZmkuaCAgICAgIHwgIDEyNyAr KysKIGRyaXZlcnMvZ3B1L2RybS9tc20vYWRyZW5vL2FkcmVub19kZXZpY2UuYyB8ICAgMTIgKwog ZHJpdmVycy9ncHUvZHJtL21zbS9hZHJlbm8vYWRyZW5vX2dwdS5oICAgIHwgICAgMyArCiBkcml2 ZXJzL2dwdS9kcm0vbXNtL21zbV9ncHUuYyAgICAgICAgICAgICAgfCAgICAyICstCiAxMCBmaWxl cyBjaGFuZ2VkLCAyNzgyIGluc2VydGlvbnMoKyksIDEgZGVsZXRpb24oLSkKIGNyZWF0ZSBtb2Rl IDEwMDY0NCBkcml2ZXJzL2dwdS9kcm0vbXNtL2FkcmVuby9hNnh4X2dtdS5jCiBjcmVhdGUgbW9k ZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL21zbS9hZHJlbm8vYTZ4eF9nbXUuaAogY3JlYXRlIG1v ZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1L2RybS9tc20vYWRyZW5vL2E2eHhfZ3B1LmMKIGNyZWF0ZSBt b2RlIDEwMDY0NCBkcml2ZXJzL2dwdS9kcm0vbXNtL2FkcmVuby9hNnh4X2dwdS5oCiBjcmVhdGUg bW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL21zbS9hZHJlbm8vYTZ4eF9oZmkuYwogY3JlYXRl IG1vZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1L2RybS9tc20vYWRyZW5vL2E2eHhfaGZpLmgKCmRpZmYg LS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL01ha2VmaWxlIGIvZHJpdmVycy9ncHUvZHJtL21z bS9NYWtlZmlsZQppbmRleCBjZDQwYzA1MGIyZDcuLjRhZmZjNjY1YzBkZSAxMDA2NDQKLS0tIGEv ZHJpdmVycy9ncHUvZHJtL21zbS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL01h a2VmaWxlCkBAIC0xMCw2ICsxMCw5IEBAIG1zbS15IDo9IFwKIAlhZHJlbm8vYTV4eF9ncHUubyBc CiAJYWRyZW5vL2E1eHhfcG93ZXIubyBcCiAJYWRyZW5vL2E1eHhfcHJlZW1wdC5vIFwKKwlhZHJl bm8vYTZ4eF9ncHUubyBcCisJYWRyZW5vL2E2eHhfZ211Lm8gXAorCWFkcmVuby9hNnh4X2hmaS5v IFwKIAloZG1pL2hkbWkubyBcCiAJaGRtaS9oZG1pX2F1ZGlvLm8gXAogCWhkbWkvaGRtaV9icmlk Z2UubyBcCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL2FkcmVuby9hNnh4X2dtdS5j IGIvZHJpdmVycy9ncHUvZHJtL21zbS9hZHJlbm8vYTZ4eF9nbXUuYwpuZXcgZmlsZSBtb2RlIDEw MDY0NAppbmRleCAwMDAwMDAwMDAwMDAuLjllY2Q3YWZlNjMyMQotLS0gL2Rldi9udWxsCisrKyBi L2RyaXZlcnMvZ3B1L2RybS9tc20vYWRyZW5vL2E2eHhfZ211LmMKQEAgLTAsMCArMSwxMTcyIEBA CisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAorLyogQ29weXJpZ2h0IChjKSAy MDE3LTIwMTggVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuICovCisK KyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvbGwuaD4KKyNpbmNs dWRlIDxsaW51eC9wbV9vcHAuaD4KKyNpbmNsdWRlIDxzb2MvcWNvbS9jbWQtZGIuaD4KKworI2lu Y2x1ZGUgImE2eHhfZ3B1LmgiCisjaW5jbHVkZSAiYTZ4eF9nbXUueG1sLmgiCisKK3N0YXRpYyBp cnFyZXR1cm5fdCBhNnh4X2dtdV9pcnEoaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qg YTZ4eF9nbXUgKmdtdSA9IGRhdGE7CisJdTMyIHN0YXR1czsKKworCXN0YXR1cyA9IGdtdV9yZWFk KGdtdSwgUkVHX0E2WFhfR01VX0FPX0hPU1RfSU5URVJSVVBUX1NUQVRVUyk7CisJZ211X3dyaXRl KGdtdSwgUkVHX0E2WFhfR01VX0FPX0hPU1RfSU5URVJSVVBUX0NMUiwgc3RhdHVzKTsKKworCWlm IChzdGF0dXMgJiBBNlhYX0dNVV9BT19IT1NUX0lOVEVSUlVQVF9TVEFUVVNfV0RPR19CSVRFKSB7 CisJCWRldl9lcnJfcmF0ZWxpbWl0ZWQoZ211LT5kZXYsICJHTVUgd2F0Y2hkb2cgZXhwaXJlZFxu Iik7CisKKwkJLyogVGVtcG9yYXJ5IHVudGlsIHdlIGNhbiByZWNvdmVyIHNhZmVseSAqLworCQlC VUcoKTsKKwl9CisKKwlpZiAoc3RhdHVzICYgIEE2WFhfR01VX0FPX0hPU1RfSU5URVJSVVBUX1NU QVRVU19IT1NUX0FIQl9CVVNfRVJST1IpCisJCWRldl9lcnJfcmF0ZWxpbWl0ZWQoZ211LT5kZXYs ICJHTVUgQUhCIGJ1cyBlcnJvclxuIik7CisKKwlpZiAoc3RhdHVzICYgQTZYWF9HTVVfQU9fSE9T VF9JTlRFUlJVUFRfU1RBVFVTX0ZFTkNFX0VSUikKKwkJZGV2X2Vycl9yYXRlbGltaXRlZChnbXUt PmRldiwgIkdNVSBmZW5jZSBlcnJvcjogMHgleFxuIiwKKwkJCWdtdV9yZWFkKGdtdSwgUkVHX0E2 WFhfR01VX0FIQl9GRU5DRV9TVEFUVVMpKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKwor c3RhdGljIGlycXJldHVybl90IGE2eHhfaGZpX2lycShpbnQgaXJxLCB2b2lkICpkYXRhKQorewor CXN0cnVjdCBhNnh4X2dtdSAqZ211ID0gZGF0YTsKKwl1MzIgc3RhdHVzOworCisJc3RhdHVzID0g Z211X3JlYWQoZ211LCBSRUdfQTZYWF9HTVVfR01VMkhPU1RfSU5UUl9JTkZPKTsKKwlnbXVfd3Jp dGUoZ211LCBSRUdfQTZYWF9HTVVfR01VMkhPU1RfSU5UUl9DTFIsIHN0YXR1cyk7CisKKwlpZiAo c3RhdHVzICYgQTZYWF9HTVVfR01VMkhPU1RfSU5UUl9JTkZPX01TR1EpCisJCXRhc2tsZXRfc2No ZWR1bGUoJmdtdS0+aGZpX3Rhc2tsZXQpOworCisJaWYgKHN0YXR1cyAmIEE2WFhfR01VX0dNVTJI T1NUX0lOVFJfSU5GT19DTTNfRkFVTFQpIHsKKwkJZGV2X2Vycl9yYXRlbGltaXRlZChnbXUtPmRl diwgIkdNVSBmaXJtd2FyZSBmYXVsdFxuIik7CisKKwkJLyogVGVtcG9yYXJ5IHVudGlsIHdlIGNh biByZWNvdmVyIHNhZmVseSAqLworCQlCVUcoKTsKKwl9CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7 Cit9CisKKy8qIENoZWNrIHRvIHNlZSBpZiB0aGUgR1ggcmFpbCBpcyBzdGlsbCBwb3dlcmVkICov CitzdGF0aWMgYm9vbCBhNnh4X2dtdV9neF9pc19vbihzdHJ1Y3QgYTZ4eF9nbXUgKmdtdSkKK3sK Kwl1MzIgdmFsID0gZ211X3JlYWQoZ211LCBSRUdfQTZYWF9HTVVfU1BUUFJBQ19QV1JfQ0xLX1NU QVRVUyk7CisKKwlyZXR1cm4gISh2YWwgJgorCQkoQTZYWF9HTVVfU1BUUFJBQ19QV1JfQ0xLX1NU QVRVU19HWF9ITV9HRFNDX1BPV0VSX09GRiB8CisJCUE2WFhfR01VX1NQVFBSQUNfUFdSX0NMS19T VEFUVVNfR1hfSE1fQ0xLX09GRikpOworfQorCitzdGF0aWMgYm9vbCBhNnh4X2dtdV9jaGVja19p ZGxlX2xldmVsKHN0cnVjdCBhNnh4X2dtdSAqZ211KQoreworCXUzMiB2YWw7CisJaW50IGxvY2Fs ID0gZ211LT5pZGxlX2xldmVsOworCisJLyogU1BUUCBhbmQgSUZQQyBib3RoIHJlcG9ydCBhcyBJ RlBDICovCisJaWYgKGdtdS0+aWRsZV9sZXZlbCA9PSBHTVVfSURMRV9TVEFURV9TUFRQKQorCQls b2NhbCA9IEdNVV9JRExFX1NUQVRFX0lGUEM7CisKKwl2YWwgPSBnbXVfcmVhZChnbXUsIFJFR19B NlhYX0dQVV9HTVVfQ1hfR01VX1JQTUhfUE9XRVJfU1RBVEUpOworCisJaWYgKHZhbCA9PSBsb2Nh bCkgeworCQlpZiAoZ211LT5pZGxlX2xldmVsICE9IEdNVV9JRExFX1NUQVRFX0lGUEMgfHwKKwkJ CSFhNnh4X2dtdV9neF9pc19vbihnbXUpKQorCQkJcmV0dXJuIHRydWU7CisJfQorCisJcmV0dXJu IGZhbHNlOworfQorCisvKiBXYWl0IGZvciB0aGUgR01VIHRvIGdldCB0byBpdHMgbW9zdCBpZGxl IHN0YXRlICovCitpbnQgYTZ4eF9nbXVfd2FpdF9mb3JfaWRsZShzdHJ1Y3QgYTZ4eF9ncHUgKmE2 eHhfZ3B1KQoreworCXN0cnVjdCBhNnh4X2dtdSAqZ211ID0gJmE2eHhfZ3B1LT5nbXU7CisKKwly ZXR1cm4gc3Bpbl91bnRpbChhNnh4X2dtdV9jaGVja19pZGxlX2xldmVsKGdtdSkpOworfQorCitz dGF0aWMgaW50IGE2eHhfZ211X3N0YXJ0KHN0cnVjdCBhNnh4X2dtdSAqZ211KQoreworCWludCBy ZXQ7CisJdTMyIHZhbDsKKworCWdtdV93cml0ZShnbXUsIFJFR19BNlhYX0dNVV9DTTNfU1lTUkVT RVQsIDEpOworCWdtdV93cml0ZShnbXUsIFJFR19BNlhYX0dNVV9DTTNfU1lTUkVTRVQsIDApOwor CisJcmV0ID0gZ211X3BvbGxfdGltZW91dChnbXUsIFJFR19BNlhYX0dNVV9DTTNfRldfSU5JVF9S RVNVTFQsIHZhbCwKKwkJdmFsID09IDB4YmFiZWZhY2UsIDEwMCwgMTAwMDApOworCisJaWYgKHJl dCkKKwkJZGV2X2VycihnbXUtPmRldiwgIkdNVSBmaXJtd2FyZSBpbml0YWxpemF0aW9uIHRpbWVk IG91dFxuIik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGE2eHhfZ211X2hmaV9z dGFydChzdHJ1Y3QgYTZ4eF9nbXUgKmdtdSkKK3sKKwl1MzIgdmFsOworCWludCByZXQ7CisKKwln bXVfcm13KGdtdSwgUkVHX0E2WFhfR01VX0dNVTJIT1NUX0lOVFJfTUFTSywKKwkJQTZYWF9HTVVf R01VMkhPU1RfSU5UUl9JTkZPX01TR1EsIDApOworCisJZ211X3dyaXRlKGdtdSwgUkVHX0E2WFhf R01VX0hGSV9DVFJMX0lOSVQsIDEpOworCisJcmV0ID0gZ211X3BvbGxfdGltZW91dChnbXUsIFJF R19BNlhYX0dNVV9IRklfQ1RSTF9TVEFUVVMsIHZhbCwKKwkJdmFsICYgMSwgMTAwLCAxMDAwMCk7 CisJaWYgKHJldCkKKwkJZGV2X2VycihnbXUtPmRldiwgIlVuYWJsZSB0byBzdGFydCB0aGUgSEZJ IHF1ZXVlc1xuIik7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBUcmlnZ2VyIGEgT09CIChvdXQg b2YgYmFuZCkgcmVxdWVzdCB0byB0aGUgR01VICovCitpbnQgYTZ4eF9nbXVfc2V0X29vYihzdHJ1 Y3QgYTZ4eF9nbXUgKmdtdSwgZW51bSBhNnh4X2dtdV9vb2Jfc3RhdGUgc3RhdGUpCit7CisJaW50 IHJldDsKKwl1MzIgdmFsOworCWludCByZXF1ZXN0LCBhY2s7CisJY29uc3QgY2hhciAqbmFtZTsK KworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIEdNVV9PT0JfR1BVX1NFVDoKKwkJcmVxdWVzdCA9 IEdNVV9PT0JfR1BVX1NFVF9SRVFVRVNUOworCQlhY2sgPSBHTVVfT09CX0dQVV9TRVRfQUNLOwor CQluYW1lID0gIkdQVV9TRVQiOworCQlicmVhazsKKwljYXNlIEdNVV9PT0JfQk9PVF9TTFVNQkVS OgorCQlyZXF1ZXN0ID0gR01VX09PQl9CT09UX1NMVU1CRVJfUkVRVUVTVDsKKwkJYWNrID0gR01V X09PQl9CT09UX1NMVU1CRVJfQUNLOworCQluYW1lID0gIkJPT1RfU0xVTUJFUiI7CisJCWJyZWFr OworCWNhc2UgR01VX09PQl9EQ1ZTX1NFVDoKKwkJcmVxdWVzdCA9IEdNVV9PT0JfRENWU19SRVFV RVNUOworCQlhY2sgPSBHTVVfT09CX0RDVlNfQUNLOworCQluYW1lID0gIkdQVV9EQ1ZTIjsKKwkJ YnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogVHJpZ2dlciB0 aGUgZXF1ZXN0ZWQgT09CIG9wZXJhdGlvbiAqLworCWdtdV93cml0ZShnbXUsIFJFR19BNlhYX0dN VV9IT1NUMkdNVV9JTlRSX1NFVCwgMSA8PCByZXF1ZXN0KTsKKworCS8qIFdhaXQgZm9yIHRoZSBh Y2tub3dsZWRnZSBpbnRlcnJ1cHQgKi8KKwlyZXQgPSBnbXVfcG9sbF90aW1lb3V0KGdtdSwgUkVH X0E2WFhfR01VX0dNVTJIT1NUX0lOVFJfSU5GTywgdmFsLAorCQl2YWwgJiAoMSA8PCBhY2spLCAx MDAsIDEwMDAwKTsKKworCWlmIChyZXQpCisJCWRldl9lcnIoZ211LT5kZXYsCisJCQkiVGltZW91 dCB3YWl0aW5nIGZvciBHTVUgT09CIHNldCAlczogMHgleFxuIiwKKwkJCQluYW1lLAorCQkJCWdt dV9yZWFkKGdtdSwgUkVHX0E2WFhfR01VX0dNVTJIT1NUX0lOVFJfSU5GTykpOworCisJLyogQ2xl YXIgdGhlIGFja25vd2xlZGdlIGludGVycnVwdCAqLworCWdtdV93cml0ZShnbXUsIFJFR19BNlhY X0dNVV9HTVUySE9TVF9JTlRSX0NMUiwgMSA8PCBhY2spOworCisJcmV0dXJuIHJldDsKK30KKwor LyogQ2xlYXIgYSBwZW5kaW5nIE9PQiBzdGF0ZSBpbiB0aGUgR01VICovCit2b2lkIGE2eHhfZ211 X2NsZWFyX29vYihzdHJ1Y3QgYTZ4eF9nbXUgKmdtdSwgZW51bSBhNnh4X2dtdV9vb2Jfc3RhdGUg c3RhdGUpCit7CisJc3dpdGNoIChzdGF0ZSkgeworCWNhc2UgR01VX09PQl9HUFVfU0VUOgorCQln bXVfd3JpdGUoZ211LCBSRUdfQTZYWF9HTVVfSE9TVDJHTVVfSU5UUl9TRVQsCisJCQkxIDw8IEdN VV9PT0JfR1BVX1NFVF9DTEVBUik7CisJCWJyZWFrOworCWNhc2UgR01VX09PQl9CT09UX1NMVU1C RVI6CisJCWdtdV93cml0ZShnbXUsIFJFR19BNlhYX0dNVV9IT1NUMkdNVV9JTlRSX1NFVCwKKwkJ CTEgPDwgR01VX09PQl9CT09UX1NMVU1CRVJfQ0xFQVIpOworCQlicmVhazsKKwljYXNlIEdNVV9P T0JfRENWU19TRVQ6CisJCWdtdV93cml0ZShnbXUsIFJFR19BNlhYX0dNVV9IT1NUMkdNVV9JTlRS X1NFVCwKKwkJCTEgPDwgR01VX09PQl9EQ1ZTX0NMRUFSKTsKKwkJYnJlYWs7CisJfQorfQorCisv KiBFbmFibGUgQ1BVIGNvbnRyb2wgb2YgU1BUUCBwb3dlciBwb3dlciBjb2xsYXBzZSAqLworc3Rh dGljIGludCBhNnh4X3NwdHByYWNfZW5hYmxlKHN0cnVjdCBhNnh4X2dtdSAqZ211KQoreworCWlu dCByZXQ7CisJdTMyIHZhbDsKKworCWdtdV93cml0ZShnbXUsIFJFR19BNlhYX0dNVV9HWF9TUFRQ UkFDX1BPV0VSX0NPTlRST0wsIDB4Nzc4MDAwKTsKKworCXJldCA9IGdtdV9wb2xsX3RpbWVvdXQo Z211LCBSRUdfQTZYWF9HTVVfU1BUUFJBQ19QV1JfQ0xLX1NUQVRVUywgdmFsLAorCQkodmFsICYg MHgzOCkgPT0gMHgyOCwgMSwgMTAwKTsKKworCWlmIChyZXQpIHsKKwkJZGV2X2VycihnbXUtPmRl diwgIlVuYWJsZSB0byBwb3dlciBvbiBTUFRQUkFDOiAweCV4XG4iLAorCQkJZ211X3JlYWQoZ211 LCBSRUdfQTZYWF9HTVVfU1BUUFJBQ19QV1JfQ0xLX1NUQVRVUykpOworCX0KKworCXJldHVybiAw OworfQorCisvKiBEaXNhYmxlIENQVSBjb250cm9sIG9mIFNQVFAgcG93ZXIgcG93ZXIgY29sbGFw c2UgKi8KK3N0YXRpYyB2b2lkIGE2eHhfc3B0cHJhY19kaXNhYmxlKHN0cnVjdCBhNnh4X2dtdSAq Z211KQoreworCXUzMiB2YWw7CisJaW50IHJldDsKKworCS8qIE1ha2Ugc3VyZSByZXRlbnRpb24g aXMgb24gKi8KKwlnbXVfcm13KGdtdSwgUkVHX0E2WFhfR1BVX0NDX0dYX0dEU0NSLCAwLCAoMSA8 PCAxMSkpOworCisJZ211X3dyaXRlKGdtdSwgUkVHX0E2WFhfR01VX0dYX1NQVFBSQUNfUE9XRVJf Q09OVFJPTCwgMHg3NzgwMDEpOworCisJcmV0ID0gZ211X3BvbGxfdGltZW91dChnbXUsIFJFR19B NlhYX0dNVV9TUFRQUkFDX1BXUl9DTEtfU1RBVFVTLCB2YWwsCisJCSh2YWwgJiAweDA0KSwgMTAw LCAxMDAwMCk7CisKKwlpZiAocmV0KQorCQlkZXZfZXJyKGdtdS0+ZGV2LCAiZmFpbGVkIHRvIHBv d2VyIG9mZiBTUFRQUkFDOiAweCV4XG4iLAorCQkJZ211X3JlYWQoZ211LCBSRUdfQTZYWF9HTVVf U1BUUFJBQ19QV1JfQ0xLX1NUQVRVUykpOworfQorCisvKiBMZXQgdGhlIEdNVSBrbm93IHdlIGFy ZSBzdGFydGluZyBhIGJvb3Qgc2VxdWVuY2UgKi8KK3N0YXRpYyBpbnQgYTZ4eF9nbXVfZ2Z4X3Jh aWxfb24oc3RydWN0IGE2eHhfZ211ICpnbXUpCit7CisJdTMyIHZvdGU7CisKKwkvKiBMZXQgdGhl IEdNVSBrbm93IHdlIGFyZSBnZXR0aW5nIHJlYWR5IGZvciBib290ICovCisJZ211X3dyaXRlKGdt dSwgUkVHX0E2WFhfR01VX0JPT1RfU0xVTUJFUl9PUFRJT04sIDApOworCisJLyogQ2hvb3NlIHRo ZSAiZGVmYXVsdCIgcG93ZXIgbGV2ZWwgYXMgdGhlIGhpZ2hlc3QgYXZhaWxhYmxlICovCisJdm90 ZSA9IGdtdS0+Z3hfYXJjX3ZvdGVzW2dtdS0+bnJfZ3B1X2ZyZXFzIC0gMV07CisKKwlnbXVfd3Jp dGUoZ211LCBSRUdfQTZYWF9HTVVfR1hfVk9URV9JRFgsIHZvdGUgJiAweGZmKTsKKwlnbXVfd3Jp dGUoZ211LCBSRUdfQTZYWF9HTVVfTVhfVk9URV9JRFgsICh2b3RlID4+IDgpICYgMHhmZik7CisK KwkvKiBMZXQgdGhlIEdNVSBrbm93IHRoZSBib290IHNlcXVlbmNlIGhhcyBzdGFydGVkICovCisJ cmV0dXJuIGE2eHhfZ211X3NldF9vb2IoZ211LCBHTVVfT09CX0JPT1RfU0xVTUJFUik7Cit9CisK Ky8qIExldCB0aGUgR01VIGtub3cgdGhhdCB3ZSBhcmUgYWJvdXQgdG8gZ28gaW50byBzbHVtYmVy ICovCitzdGF0aWMgaW50IGE2eHhfZ211X25vdGlmeV9zbHVtYmVyKHN0cnVjdCBhNnh4X2dtdSAq Z211KQoreworCWludCByZXQ7CisKKwkvKiBEaXNhYmxlIHRoZSBwb3dlciBjb3VudGVyIHNvIHRo ZSBHTVUgaXNuJ3QgYnVzeSAqLworCWdtdV93cml0ZShnbXUsIFJFR19BNlhYX0dNVV9DWF9HTVVf UE9XRVJfQ09VTlRFUl9FTkFCTEUsIDApOworCisJLyogRGlzYWJsZSBTUFRQX1BDIGlmIHRoZSBD UFUgaXMgcmVzcG9uc2libGUgZm9yIGl0ICovCisJaWYgKGdtdS0+aWRsZV9sZXZlbCA8IEdNVV9J RExFX1NUQVRFX1NQVFApCisJCWE2eHhfc3B0cHJhY19kaXNhYmxlKGdtdSk7CisKKwkvKiBUZWxs IHRoZSBHTVUgdG8gZ2V0IHJlYWR5IHRvIHNsdW1iZXIgKi8KKwlnbXVfd3JpdGUoZ211LCBSRUdf QTZYWF9HTVVfQk9PVF9TTFVNQkVSX09QVElPTiwgMSk7CisKKwlyZXQgPSBhNnh4X2dtdV9zZXRf b29iKGdtdSwgR01VX09PQl9CT09UX1NMVU1CRVIpOworCWE2eHhfZ211X2NsZWFyX29vYihnbXUs IEdNVV9PT0JfQk9PVF9TTFVNQkVSKTsKKworCWlmICghcmV0KSB7CisJCS8qIENoZWNrIHRvIHNl ZSBpZiB0aGUgR01VIHJlYWxseSBkaWQgc2x1bWJlciAqLworCQlpZiAoZ211X3JlYWQoZ211LCBS RUdfQTZYWF9HUFVfR01VX0NYX0dNVV9SUE1IX1BPV0VSX1NUQVRFKQorCQkJIT0gMHgwZikgewor CQkJZGV2X2VycihnbXUtPmRldiwgIlRoZSBHTVUgZGlkIG5vdCBnbyBpbnRvIHNsdW1iZXJcbiIp OworCQkJcmV0ID0gLUVUSU1FRE9VVDsKKwkJfQorCX0KKworCS8qIFB1dCBmZW5jZSBpbnRvIGFs bG93IG1vZGUgKi8KKwlnbXVfd3JpdGUoZ211LCBSRUdfQTZYWF9HTVVfQU9fQUhCX0ZFTkNFX0NU UkwsIDApOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYTZ4eF9ycG1oX3N0YXJ0KHN0 cnVjdCBhNnh4X2dtdSAqZ211KQoreworCWludCByZXQ7CisJdTMyIHZhbDsKKworCWdtdV93cml0 ZShnbXUsIFJFR19BNlhYX0dNVV9SU0NDX0NPTlRST0xfUkVRLCAxIDw8IDEpOworCS8qIFdhaXQg Zm9yIHRoZSByZWdpc3RlciB0byBmaW5pc2ggcG9zdGluZyAqLworCXdtYigpOworCisJcmV0ID0g Z211X3BvbGxfdGltZW91dChnbXUsIFJFR19BNlhYX0dNVV9SU0NDX0NPTlRST0xfQUNLLCB2YWws CisJCXZhbCAmICgxIDw8IDEpLCAxMDAsIDEwMDAwKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIo Z211LT5kZXYsICJVbmFibGUgdG8gcG93ZXIgb24gdGhlIEdQVSBSU0NcbiIpOworCQlyZXR1cm4g cmV0OworCX0KKworCXJldCA9IGdtdV9wb2xsX3RpbWVvdXQoZ211LCBSRUdfQTZYWF9SU0NDX1NF UV9CVVNZX0RSVjAsIHZhbCwKKwkJIXZhbCwgMTAwLCAxMDAwMCk7CisKKwlpZiAoIXJldCkgewor CQlnbXVfd3JpdGUoZ211LCBSRUdfQTZYWF9HTVVfUlNDQ19DT05UUk9MX1JFUSwgMCk7CisKKwkJ LyogUmUtZW5hYmxlIHRoZSBwb3dlciBjb3VudGVyICovCisJCWdtdV93cml0ZShnbXUsIFJFR19B NlhYX0dNVV9DWF9HTVVfUE9XRVJfQ09VTlRFUl9FTkFCTEUsIDEpOworCQlyZXR1cm4gMDsKKwl9 CisKKwlkZXZfZXJyKGdtdS0+ZGV2LCAiR1BVIFJTQyBzZXF1ZW5jZSBzdHVjayB3aGlsZSB3YWtp bmcgdXAgdGhlIEdQVVxuIik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgYTZ4eF9y cG1oX3N0b3Aoc3RydWN0IGE2eHhfZ211ICpnbXUpCit7CisJaW50IHJldDsKKwl1MzIgdmFsOwor CisJZ211X3dyaXRlKGdtdSwgUkVHX0E2WFhfR01VX1JTQ0NfQ09OVFJPTF9SRVEsIDEpOworCisJ cmV0ID0gZ211X3BvbGxfdGltZW91dChnbXUsIFJFR19BNlhYX0dQVV9SU0NDX1JTQ19TVEFUVVMw X0RSVjAsCisJCXZhbCwgdmFsICYgKDEgPDwgMTYpLCAxMDAsIDEwMDAwKTsKKwlpZiAocmV0KQor CQlkZXZfZXJyKGdtdS0+ZGV2LCAiVW5hYmxlIHRvIHBvd2VyIG9mZiB0aGUgR1BVIFJTQ1xuIik7 CisKKwlnbXVfd3JpdGUoZ211LCBSRUdfQTZYWF9HTVVfUlNDQ19DT05UUk9MX1JFUSwgMCk7Cit9 CisKK3N0YXRpYyB2b2lkIGE2eHhfZ211X3JwbWhfaW5pdChzdHJ1Y3QgYTZ4eF9nbXUgKmdtdSkK K3sKKwkvKiBEaXNhYmxlIFNERSBjbG9jayBnYXRpbmcgKi8KKwlnbXVfd3JpdGUoZ211LCBSRUdf QTZYWF9HUFVfUlNDQ19SU0NfU1RBVFVTMF9EUlYwLCBCSVQoMjQpKTsKKworCS8qIFNldHVwIFJT QyBQREMgaGFuZHNoYWtlIGZvciBzbGVlcCBhbmQgd2FrZXVwICovCisJZ211X3dyaXRlKGdtdSwg UkVHX0E2WFhfUlNDQ19QRENfU0xBVkVfSURfRFJWMCwgMSk7CisJZ211X3dyaXRlKGdtdSwgUkVH X0E2WFhfUlNDQ19ISURERU5fVENTX0NNRDBfREFUQSwgMCk7CisJZ211X3dyaXRlKGdtdSwgUkVH X0E2WFhfUlNDQ19ISURERU5fVENTX0NNRDBfQUREUiwgMCk7CisJZ211X3dyaXRlKGdtdSwgUkVH X0E2WFhfUlNDQ19ISURERU5fVENTX0NNRDBfREFUQSArIDIsIDApOworCWdtdV93cml0ZShnbXUs IFJFR19BNlhYX1JTQ0NfSElEREVOX1RDU19DTUQwX0FERFIgKyAyLCAwKTsKKwlnbXVfd3JpdGUo Z211LCBSRUdfQTZYWF9SU0NDX0hJRERFTl9UQ1NfQ01EMF9EQVRBICsgNCwgMHg4MDAwMDAwMCk7 CisJZ211X3dyaXRlKGdtdSwgUkVHX0E2WFhfUlNDQ19ISURERU5fVENTX0NNRDBfQUREUiArIDQs IDApOworCWdtdV93cml0ZShnbXUsIFJFR19BNlhYX1JTQ0NfT1ZFUlJJREVfU1RBUlRfQUREUiwg MCk7CisJZ211X3dyaXRlKGdtdSwgUkVHX0E2WFhfUlNDQ19QRENfU0VRX1NUQVJUX0FERFIsIDB4 NDUyMCk7CisJZ211X3dyaXRlKGdtdSwgUkVHX0E2WFhfUlNDQ19QRENfTUFUQ0hfVkFMVUVfTE8s IDB4NDUxMCk7CisJZ211X3dyaXRlKGdtdSwgUkVHX0E2WFhfUlNDQ19QRENfTUFUQ0hfVkFMVUVf SEksIDB4NDUxNCk7CisKKwkvKiBMb2FkIFJTQyBzZXF1ZW5jZXIgdUNvZGUgZm9yIHNsZWVwIGFu ZCB3YWtldXAgKi8KKwlnbXVfd3JpdGUoZ211LCBSRUdfQTZYWF9SU0NDX1NFUV9NRU1fMF9EUlYw LCAweGE3YTUwNmEwKTsKKwlnbXVfd3JpdGUoZ211LCBSRUdfQTZYWF9SU0NDX1NFUV9NRU1fMF9E UlYwICsgMSwgMHhhMWU2YTZlNyk7CisJZ211X3dyaXRlKGdtdSwgUkVHX0E2WFhfUlNDQ19TRVFf TUVNXzBfRFJWMCArIDIsIDB4YTJlMDgxZTEpOworCWdtdV93cml0ZShnbXUsIFJFR19BNlhYX1JT Q0NfU0VRX01FTV8wX0RSVjAgKyAzLCAweGU5YTk4MmUyKTsKKwlnbXVfd3JpdGUoZ211LCBSRUdf QTZYWF9SU0NDX1NFUV9NRU1fMF9EUlYwICsgNCwgMHgwMDIwZThhOCk7CisKKwkvKiBMb2FkIFBE QyBzZXF1ZW5jZXIgdUNvZGUgZm9yIHBvd2VyIHVwIGFuZCBwb3dlciBkb3duIHNlcXVlbmNlICov CisJcGRjX3dyaXRlKGdtdSwgUkVHX0E2WFhfUERDX0dQVV9TRVFfTUVNXzAsIDB4ZmViZWExZTEp OworCXBkY193cml0ZShnbXUsIFJFR19BNlhYX1BEQ19HUFVfU0VRX01FTV8wICsgMSwgMHhhNWE0 YTNhMik7CisJcGRjX3dyaXRlKGdtdSwgUkVHX0E2WFhfUERDX0dQVV9TRVFfTUVNXzAgKyAyLCAw eDgzODJhNmUwKTsKKwlwZGNfd3JpdGUoZ211LCBSRUdfQTZYWF9QRENfR1BVX1NFUV9NRU1fMCAr IDMsIDB4YmNlM2UyODQpOworCXBkY193cml0ZShnbXUsIFJFR19BNlhYX1BEQ19HUFVfU0VRX01F TV8wICsgNCwgMHgwMDIwODFmYyk7CisKKwkvKiBTZXQgVENTIGNvbW1hbmRzIHVzZWQgYnkgUERD IHNlcXVlbmNlIGZvciBsb3cgcG93ZXIgbW9kZXMgKi8KKwlwZGNfd3JpdGUoZ211LCBSRUdfQTZY WF9QRENfR1BVX1RDUzFfQ01EX0VOQUJMRV9CQU5LLCA3KTsKKwlwZGNfd3JpdGUoZ211LCBSRUdf QTZYWF9QRENfR1BVX1RDUzFfQ01EX1dBSVRfRk9SX0NNUExfQkFOSywgMCk7CisJcGRjX3dyaXRl KGdtdSwgUkVHX0E2WFhfUERDX0dQVV9UQ1MxX0NPTlRST0wsIDApOworCXBkY193cml0ZShnbXUs IFJFR19BNlhYX1BEQ19HUFVfVENTMV9DTUQwX01TR0lELCAweDEwMTA4KTsKKwlwZGNfd3JpdGUo Z211LCBSRUdfQTZYWF9QRENfR1BVX1RDUzFfQ01EMF9BRERSLCAweDMwMDEwKTsKKwlwZGNfd3Jp dGUoZ211LCBSRUdfQTZYWF9QRENfR1BVX1RDUzFfQ01EMF9EQVRBLCAxKTsKKwlwZGNfd3JpdGUo Z211LCBSRUdfQTZYWF9QRENfR1BVX1RDUzFfQ01EMF9NU0dJRCArIDQsIDB4MTAxMDgpOworCXBk Y193cml0ZShnbXUsIFJFR19BNlhYX1BEQ19HUFVfVENTMV9DTUQwX0FERFIgKyA0LCAweDMwMDAw KTsKKwlwZGNfd3JpdGUoZ211LCBSRUdfQTZYWF9QRENfR1BVX1RDUzFfQ01EMF9EQVRBICsgNCwg MHgwKTsKKwlwZGNfd3JpdGUoZ211LCBSRUdfQTZYWF9QRENfR1BVX1RDUzFfQ01EMF9NU0dJRCAr IDgsIDB4MTAxMDgpOworCXBkY193cml0ZShnbXUsIFJFR19BNlhYX1BEQ19HUFVfVENTMV9DTUQw X0FERFIgKyA4LCAweDMwMDgwKTsKKwlwZGNfd3JpdGUoZ211LCBSRUdfQTZYWF9QRENfR1BVX1RD UzFfQ01EMF9EQVRBICsgOCwgMHgwKTsKKwlwZGNfd3JpdGUoZ211LCBSRUdfQTZYWF9QRENfR1BV X1RDUzNfQ01EX0VOQUJMRV9CQU5LLCA3KTsKKwlwZGNfd3JpdGUoZ211LCBSRUdfQTZYWF9QRENf R1BVX1RDUzNfQ01EX1dBSVRfRk9SX0NNUExfQkFOSywgMCk7CisJcGRjX3dyaXRlKGdtdSwgUkVH X0E2WFhfUERDX0dQVV9UQ1MzX0NPTlRST0wsIDApOworCXBkY193cml0ZShnbXUsIFJFR19BNlhY X1BEQ19HUFVfVENTM19DTUQwX01TR0lELCAweDEwMTA4KTsKKwlwZGNfd3JpdGUoZ211LCBSRUdf QTZYWF9QRENfR1BVX1RDUzNfQ01EMF9BRERSLCAweDMwMDEwKTsKKwlwZGNfd3JpdGUoZ211LCBS RUdfQTZYWF9QRENfR1BVX1RDUzNfQ01EMF9EQVRBLCAyKTsKKwlwZGNfd3JpdGUoZ211LCBSRUdf QTZYWF9QRENfR1BVX1RDUzNfQ01EMF9NU0dJRCArIDQsIDB4MTAxMDgpOworCXBkY193cml0ZShn bXUsIFJFR19BNlhYX1BEQ19HUFVfVENTM19DTUQwX0FERFIgKyA0LCAweDMwMDAwKTsKKwlwZGNf d3JpdGUoZ211LCBSRUdfQTZYWF9QRENfR1BVX1RDUzNfQ01EMF9EQVRBICsgNCwgMHgzKTsKKwlw ZGNfd3JpdGUoZ211LCBSRUdfQTZYWF9QRENfR1BVX1RDUzNfQ01EMF9NU0dJRCArIDgsIDB4MTAx MDgpOworCXBkY193cml0ZShnbXUsIFJFR19BNlhYX1BEQ19HUFVfVENTM19DTUQwX0FERFIgKyA4 LCAweDMwMDgwKTsKKwlwZGNfd3JpdGUoZ211LCBSRUdfQTZYWF9QRENfR1BVX1RDUzNfQ01EMF9E QVRBICsgOCwgMHgzKTsKKworCS8qIFNldHVwIEdQVSBQREMgKi8KKwlwZGNfd3JpdGUoZ211LCBS RUdfQTZYWF9QRENfR1BVX1NFUV9TVEFSVF9BRERSLCAwKTsKKwlwZGNfd3JpdGUoZ211LCBSRUdf QTZYWF9QRENfR1BVX0VOQUJMRV9QREMsIDB4ODAwMDAwMDEpOworCisJLyogZW5zdXJlIG5vIHdy aXRlcyBoYXBwZW4gYmVmb3JlIHRoZSB1Q29kZSBpcyBmdWxseSB3cml0dGVuICovCisJd21iKCk7 Cit9CisKKy8qCisgKiBUaGUgbG93ZXN0IDE2IGJpdHMgb2YgdGhpcyB2YWx1ZSBhcmUgdGhlIG51 bWJlciBvZiBYTyBjbG9jayBjeWNsZXMgZm9yIG1haW4KKyAqIGh5c3RlcmVzaXMgd2hpY2ggaXMg c2V0IGF0IDB4MTY4MCBjeWNsZXMgKDMwMCB1cykuICBUaGUgaGlnaGVyIDE2IGJpdHMgYXJlCisg KiBmb3IgdGhlIHNob3J0ZXIgaHlzdGVyZXNpcyB0aGF0IGhhcHBlbnMgYWZ0ZXIgbWFpbiAtIHRo aXMgaXMgMHhhICguNSB1cykKKyAqLworCisjZGVmaW5lIEdNVV9QV1JfQ09MX0hZU1QgMHgwMDBh MTY4MAorCisvKiBTZXQgdXAgdGhlIGlkbGUgc3RhdGUgZm9yIHRoZSBHTVUgKi8KK3N0YXRpYyB2 b2lkIGE2eHhfZ211X3Bvd2VyX2NvbmZpZyhzdHJ1Y3QgYTZ4eF9nbXUgKmdtdSkKK3sKKwkvKiBE aXNhYmxlIEdNVSBXQi9SQiBidWZmZXIgKi8KKwlnbXVfd3JpdGUoZ211LCBSRUdfQTZYWF9HTVVf U1lTX0JVU19DT05GSUcsIDB4MSk7CisKKwlnbXVfd3JpdGUoZ211LCBSRUdfQTZYWF9HTVVfUFdS X0NPTF9JTlRFUl9GUkFNRV9DVFJMLCAweDljNDA0MDApOworCisJc3dpdGNoIChnbXUtPmlkbGVf bGV2ZWwpIHsKKwljYXNlIEdNVV9JRExFX1NUQVRFX0lGUEM6CisJCWdtdV93cml0ZShnbXUsIFJF R19BNlhYX0dNVV9QV1JfQ09MX0lOVEVSX0ZSQU1FX0hZU1QsCisJCQlHTVVfUFdSX0NPTF9IWVNU KTsKKwkJZ211X3JtdyhnbXUsIFJFR19BNlhYX0dNVV9QV1JfQ09MX0lOVEVSX0ZSQU1FX0NUUkws IDAsCisJCQlBNlhYX0dNVV9QV1JfQ09MX0lOVEVSX0ZSQU1FX0NUUkxfSUZQQ19FTkFCTEUgfAor CQkJQTZYWF9HTVVfUFdSX0NPTF9JTlRFUl9GUkFNRV9DVFJMX0hNX1BPV0VSX0NPTExBUFNFX0VO QUJMRSk7CisJCS8qIEZhbGwgdGhyb3VnaCAqLworCWNhc2UgR01VX0lETEVfU1RBVEVfU1BUUDoK KwkJZ211X3dyaXRlKGdtdSwgUkVHX0E2WFhfR01VX1BXUl9DT0xfU1BUUFJBQ19IWVNULAorCQkJ R01VX1BXUl9DT0xfSFlTVCk7CisJCWdtdV9ybXcoZ211LCBSRUdfQTZYWF9HTVVfUFdSX0NPTF9J TlRFUl9GUkFNRV9DVFJMLCAwLAorCQkJQTZYWF9HTVVfUFdSX0NPTF9JTlRFUl9GUkFNRV9DVFJM X0lGUENfRU5BQkxFIHwKKwkJCUE2WFhfR01VX1BXUl9DT0xfSU5URVJfRlJBTUVfQ1RSTF9TUFRQ UkFDX1BPV0VSX0NPTlRST0xfRU5BQkxFKTsKKwl9CisKKwkvKiBFbmFibGUgUlBNaCBHUFUgY2xp ZW50ICovCisJZ211X3JtdyhnbXUsIFJFR19BNlhYX0dNVV9SUE1IX0NUUkwsIDAsCisJCUE2WFhf R01VX1JQTUhfQ1RSTF9SUE1IX0lOVEVSRkFDRV9FTkFCTEUgfAorCQlBNlhYX0dNVV9SUE1IX0NU UkxfTExDX1ZPVEVfRU5BQkxFIHwKKwkJQTZYWF9HTVVfUlBNSF9DVFJMX0REUl9WT1RFX0VOQUJM RSB8CisJCUE2WFhfR01VX1JQTUhfQ1RSTF9NWF9WT1RFX0VOQUJMRSB8CisJCUE2WFhfR01VX1JQ TUhfQ1RSTF9DWF9WT1RFX0VOQUJMRSB8CisJCUE2WFhfR01VX1JQTUhfQ1RSTF9HRlhfVk9URV9F TkFCTEUpOworfQorCitzdGF0aWMgaW50IGE2eHhfZ211X2Z3X3N0YXJ0KHN0cnVjdCBhNnh4X2dt dSAqZ211LCB1bnNpZ25lZCBpbnQgc3RhdGUpCit7CisJc3RhdGljIGJvb2wgcnBtaF9pbml0Owor CXN0cnVjdCBhNnh4X2dwdSAqYTZ4eF9ncHUgPSBjb250YWluZXJfb2YoZ211LCBzdHJ1Y3QgYTZ4 eF9ncHUsIGdtdSk7CisJc3RydWN0IGFkcmVub19ncHUgKmFkcmVub19ncHUgPSAmYTZ4eF9ncHUt PmJhc2U7CisJaW50IGksIHJldDsKKwl1MzIgY2hpcGlkOworCXUzMiAqaW1hZ2U7CisKKwlpZiAo c3RhdGUgPT0gR01VX1dBUk1fQk9PVCkgeworCQlyZXQgPSBhNnh4X3JwbWhfc3RhcnQoZ211KTsK KwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfSBlbHNlIHsKKwkJaWYgKFdBUk4oIWFkcmVu b19ncHUtPmZ3W0FEUkVOT19GV19HTVVdLCAiR01VIGZpcm13YXJlIGlzIG5vdCBsb2FkZWRcbiIp KQorCQkJcmV0dXJuIC1FTk9FTlQ7CisKKwkJLyogU2FuaXR5IGNoZWNrIHRoZSBzaXplIG9mIHRo ZSBmaXJtd2FyZSB0aGF0IHdhcyBsb2FkZWQgKi8KKwkJaWYgKGFkcmVub19ncHUtPmZ3W0FEUkVO T19GV19HTVVdLT5zaXplID4gMHg4MDAwKSB7CisJCQlkZXZfZXJyKGdtdS0+ZGV2LAorCQkJCSJH TVUgZmlybXdhcmUgaXMgYmlnZ2VyIHRoYW4gdGhlIGF2YWlsYWJsZSByZWdpb25cbiIpOworCQkJ cmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQkvKiBUdXJuIG9uIHJlZ2lzdGVyIHJldGVudGlvbiAq LworCQlnbXVfd3JpdGUoZ211LCBSRUdfQTZYWF9HTVVfR0VORVJBTF83LCAxKTsKKworCQkvKiBX ZSBvbmx5IG5lZWQgdG8gbG9hZCB0aGUgUlBNaCBtaWNyb2NvZGUgb25jZSAqLworCQlpZiAoIXJw bWhfaW5pdCkgeworCQkJYTZ4eF9nbXVfcnBtaF9pbml0KGdtdSk7CisJCQlycG1oX2luaXQgPSB0 cnVlOworCQl9IGVsc2UgaWYgKHN0YXRlICE9IEdNVV9SRVNFVCkgeworCQkJcmV0ID0gYTZ4eF9y cG1oX3N0YXJ0KGdtdSk7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiByZXQ7CisJCX0KKworCQlp bWFnZSA9ICh1MzIgKikgYWRyZW5vX2dwdS0+ZndbQURSRU5PX0ZXX0dNVV0tPmRhdGE7CisKKwkJ Zm9yIChpID0gMDsgaSA8IGFkcmVub19ncHUtPmZ3W0FEUkVOT19GV19HTVVdLT5zaXplID4+IDI7 IGkrKykKKwkJCWdtdV93cml0ZShnbXUsIFJFR19BNlhYX0dNVV9DTTNfSVRDTV9TVEFSVCArIGks CisJCQkJaW1hZ2VbaV0pOworCX0KKworCWdtdV93cml0ZShnbXUsIFJFR19BNlhYX0dNVV9DTTNf RldfSU5JVF9SRVNVTFQsIDApOworCWdtdV93cml0ZShnbXUsIFJFR19BNlhYX0dNVV9DTTNfQk9P VF9DT05GSUcsIDB4MDIpOworCisJLyogV3JpdGUgdGhlIGlvdmEgb2YgdGhlIEhGSSB0YWJsZSAq LworCWdtdV93cml0ZShnbXUsIFJFR19BNlhYX0dNVV9IRklfUVRCTF9BRERSLCBnbXUtPmhmaS0+ aW92YSk7CisJZ211X3dyaXRlKGdtdSwgUkVHX0E2WFhfR01VX0hGSV9RVEJMX0lORk8sIDEpOwor CisJZ211X3dyaXRlKGdtdSwgUkVHX0E2WFhfR01VX0FIQl9GRU5DRV9SQU5HRV8wLAorCQkoMSA8 PCAzMSkgfCAoMHhhIDw8IDE4KSB8ICgweGEwKSk7CisKKwljaGlwaWQgPSBhZHJlbm9fZ3B1LT5y ZXYuY29yZSA8PCAyNDsKKwljaGlwaWQgfD0gYWRyZW5vX2dwdS0+cmV2Lm1ham9yIDw8IDE2Owor CWNoaXBpZCB8PSBhZHJlbm9fZ3B1LT5yZXYubWlub3IgPDwgMTI7CisJY2hpcGlkIHw9IGFkcmVu b19ncHUtPnJldi5wYXRjaGlkIDw8IDg7CisKKwlnbXVfd3JpdGUoZ211LCBSRUdfQTZYWF9HTVVf SEZJX1NGUl9BRERSLCBjaGlwaWQpOworCisJLyogU2V0IHVwIHRoZSBsb3dlc3QgaWRsZSBsZXZl bCBvbiB0aGUgR01VICovCisJYTZ4eF9nbXVfcG93ZXJfY29uZmlnKGdtdSk7CisKKwlyZXQgPSBh Nnh4X2dtdV9zdGFydChnbXUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBh Nnh4X2dtdV9nZnhfcmFpbF9vbihnbXUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkv KiBFbmFibGUgU1BUUF9QQyBpZiB0aGUgQ1BVIGlzIHJlc3BvbnNpYmxlIGZvciBpdCAqLworCWlm IChnbXUtPmlkbGVfbGV2ZWwgPCBHTVVfSURMRV9TVEFURV9TUFRQKSB7CisJCXJldCA9IGE2eHhf c3B0cHJhY19lbmFibGUoZ211KTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJ cmV0ID0gYTZ4eF9nbXVfaGZpX3N0YXJ0KGdtdSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsK KworCS8qIEZJWE1FOiBEbyB3ZSBuZWVkIHRoaXMgd21iKCkgaGVyZT8gKi8KKwl3bWIoKTsKKwor CXJldHVybiAwOworfQorCisjZGVmaW5lIEE2WFhfSEZJX0lSUV9NQVNLIFwKKwkoQTZYWF9HTVVf R01VMkhPU1RfSU5UUl9JTkZPX01TR1EgfCBcCisJIEE2WFhfR01VX0dNVTJIT1NUX0lOVFJfSU5G T19DTTNfRkFVTFQpCisKKyNkZWZpbmUgQTZYWF9HTVVfSVJRX01BU0sgXAorCShBNlhYX0dNVV9B T19IT1NUX0lOVEVSUlVQVF9TVEFUVVNfV0RPR19CSVRFIHwgXAorCSBBNlhYX0dNVV9BT19IT1NU X0lOVEVSUlVQVF9TVEFUVVNfSE9TVF9BSEJfQlVTX0VSUk9SIHwgXAorCSBBNlhYX0dNVV9BT19I T1NUX0lOVEVSUlVQVF9TVEFUVVNfRkVOQ0VfRVJSKQorCitzdGF0aWMgdm9pZCBhNnh4X2dtdV9p cnFfZW5hYmxlKHN0cnVjdCBhNnh4X2dtdSAqZ211KQoreworCWdtdV93cml0ZShnbXUsIFJFR19B NlhYX0dNVV9BT19IT1NUX0lOVEVSUlVQVF9DTFIsIH4wKTsKKwlnbXVfd3JpdGUoZ211LCBSRUdf QTZYWF9HTVVfR01VMkhPU1RfSU5UUl9DTFIsIH4wKTsKKworCWdtdV93cml0ZShnbXUsIFJFR19B NlhYX0dNVV9BT19IT1NUX0lOVEVSUlVQVF9NQVNLLAorCQl+QTZYWF9HTVVfSVJRX01BU0spOwor CWdtdV93cml0ZShnbXUsIFJFR19BNlhYX0dNVV9HTVUySE9TVF9JTlRSX01BU0ssCisJCX5BNlhY X0hGSV9JUlFfTUFTSyk7CisKKwllbmFibGVfaXJxKGdtdS0+Z211X2lycSk7CisJZW5hYmxlX2ly cShnbXUtPmhmaV9pcnEpOworfQorCitzdGF0aWMgdm9pZCBhNnh4X2dtdV9pcnFfZGlzYWJsZShz dHJ1Y3QgYTZ4eF9nbXUgKmdtdSkKK3sKKwlkaXNhYmxlX2lycShnbXUtPmdtdV9pcnEpOworCWRp c2FibGVfaXJxKGdtdS0+aGZpX2lycSk7CisKKwlnbXVfd3JpdGUoZ211LCBSRUdfQTZYWF9HTVVf QU9fSE9TVF9JTlRFUlJVUFRfTUFTSywgfjApOworCWdtdV93cml0ZShnbXUsIFJFR19BNlhYX0dN VV9HTVUySE9TVF9JTlRSX01BU0ssIH4wKTsKK30KKworaW50IGE2eHhfZ211X3Jlc2V0KHN0cnVj dCBhNnh4X2dwdSAqYTZ4eF9ncHUpCit7CisJc3RydWN0IGE2eHhfZ211ICpnbXUgPSAmYTZ4eF9n cHUtPmdtdTsKKwlpbnQgcmV0OworCXUzMiB2YWw7CisKKwkvKiBGbHVzaCBhbGwgdGhlIHF1ZXVl cyAqLworCWE2eHhfaGZpX3N0b3AoZ211KTsKKworCS8qIFN0b3AgdGhlIGludGVycnVwdHMgKi8K KwlhNnh4X2dtdV9pcnFfZGlzYWJsZShnbXUpOworCisJLyogRm9yY2Ugb2ZmIFNQVFAgaW4gY2Fz ZSB0aGUgR01VIGlzIG1hbmFnaW5nIGl0ICovCisJYTZ4eF9zcHRwcmFjX2Rpc2FibGUoZ211KTsK KworCS8qIE1ha2Ugc3VyZSB0aGVyZSBhcmUgbm8gb3V0c3RhbmRpbmcgUlBNaCB2b3RlcyAqLwor CWdtdV9wb2xsX3RpbWVvdXQoZ211LCBSRUdfQTZYWF9SU0NDX1RDUzBfRFJWMF9TVEFUVVMsIHZh bCwKKwkJKHZhbCAmIDEpLCAxMDAsIDEwMDAwKTsKKwlnbXVfcG9sbF90aW1lb3V0KGdtdSwgUkVH X0E2WFhfUlNDQ19UQ1MxX0RSVjBfU1RBVFVTLCB2YWwsCisJCSh2YWwgJiAxKSwgMTAwLCAxMDAw MCk7CisJZ211X3BvbGxfdGltZW91dChnbXUsIFJFR19BNlhYX1JTQ0NfVENTMl9EUlYwX1NUQVRV UywgdmFsLAorCQkodmFsICYgMSksIDEwMCwgMTAwMDApOworCWdtdV9wb2xsX3RpbWVvdXQoZ211 LCBSRUdfQTZYWF9SU0NDX1RDUzNfRFJWMF9TVEFUVVMsIHZhbCwKKwkJKHZhbCAmIDEpLCAxMDAs IDEwMDApOworCisJLyogRm9yY2Ugb2ZmIHRoZSBHWCBHU0RDICovCisJcmVndWxhdG9yX2ZvcmNl X2Rpc2FibGUoZ211LT5neCk7CisKKwkvKiBEaXNhYmxlIHRoZSByZXNvdXJjZXMgKi8KKwljbGtf YnVsa19kaXNhYmxlX3VucHJlcGFyZShnbXUtPm5yX2Nsb2NrcywgZ211LT5jbG9ja3MpOworCXBt X3J1bnRpbWVfcHV0X3N5bmMoZ211LT5kZXYpOworCisJLyogUmUtZW5hYmxlIHRoZSByZXNvdXJj ZXMgKi8KKwlwbV9ydW50aW1lX2dldF9zeW5jKGdtdS0+ZGV2KTsKKworCS8qIFVzZSBhIGtub3du IHJhdGUgdG8gYnJpbmcgdXAgdGhlIEdNVSAqLworCWNsa19zZXRfcmF0ZShnbXUtPmNvcmVfY2xr LCAyMDAwMDAwMDApOworCWNsa19idWxrX3ByZXBhcmVfZW5hYmxlKGdtdS0+bnJfY2xvY2tzLCBn bXUtPmNsb2Nrcyk7CisKKwlhNnh4X2dtdV9pcnFfZW5hYmxlKGdtdSk7CisKKwlyZXQgPSBhNnh4 X2dtdV9md19zdGFydChnbXUsIEdNVV9SRVNFVCk7CisJaWYgKCFyZXQpCisJCXJldCA9IGE2eHhf aGZpX3N0YXJ0KGdtdSwgR01VX0NPTERfQk9PVCk7CisKKwlpZiAocmV0KQorCQlhNnh4X2dtdV9j bGVhcl9vb2IoZ211LCBHTVVfT09CX0JPT1RfU0xVTUJFUik7CisKKwlyZXR1cm4gcmV0OworfQor CitpbnQgYTZ4eF9nbXVfcmVzdW1lKHN0cnVjdCBhNnh4X2dwdSAqYTZ4eF9ncHUpCit7CisJc3Ry dWN0IGE2eHhfZ211ICpnbXUgPSAmYTZ4eF9ncHUtPmdtdTsKKwlpbnQgc3RhdHVzLCByZXQ7CisK KwlpZiAoV0FSTighZ211LT5tbWlvLCAiVGhlIEdNVSBpcyBub3Qgc2V0IHVwIHlldFxuIikpCisJ CXJldHVybiAwOworCisJLyogVHVybiBvbiB0aGUgcmVzb3VyY2VzICovCisJcG1fcnVudGltZV9n ZXRfc3luYyhnbXUtPmRldik7CisKKwkvKiBVc2UgYSBrbm93biByYXRlIHRvIGJyaW5nIHVwIHRo ZSBHTVUgKi8KKwljbGtfc2V0X3JhdGUoZ211LT5jb3JlX2NsaywgMjAwMDAwMDAwKTsKKwljbGtf YnVsa19wcmVwYXJlX2VuYWJsZShnbXUtPm5yX2Nsb2NrcywgZ211LT5jbG9ja3MpOworCisJYTZ4 eF9nbXVfaXJxX2VuYWJsZShnbXUpOworCisJLyogQ2hlY2sgdG8gc2VlIGlmIHdlIGFyZSBkb2lu ZyBhIGNvbGQgb3Igd2FybSBib290ICovCisJc3RhdHVzID0gZ211X3JlYWQoZ211LCBSRUdfQTZY WF9HTVVfR0VORVJBTF83KSA9PSAxID8KKwkJR01VX1dBUk1fQk9PVCA6IEdNVV9DT0xEX0JPT1Q7 CisKKwlyZXQgPSBhNnh4X2dtdV9md19zdGFydChnbXUsIHN0YXR1cyk7CisJaWYgKHJldCkKKwkJ Z290byBvdXQ7CisKKwlyZXQgPSBhNnh4X2hmaV9zdGFydChnbXUsIHN0YXR1cyk7CisKK291dDoK KwkvKiBNYWtlIHN1cmUgdG8gdHVybiBvZmYgdGhlIGJvb3QgT09CIHJlcXVlc3Qgb24gZXJyb3Ig Ki8KKwlpZiAocmV0KQorCQlhNnh4X2dtdV9jbGVhcl9vb2IoZ211LCBHTVVfT09CX0JPT1RfU0xV TUJFUik7CisKKwlyZXR1cm4gcmV0OworfQorCitib29sIGE2eHhfZ211X2lzaWRsZShzdHJ1Y3Qg YTZ4eF9nbXUgKmdtdSkKK3sKKwl1MzIgcmVnOworCisJaWYgKCFnbXUtPm1taW8pCisJCXJldHVy biB0cnVlOworCisJcmVnID0gZ211X3JlYWQoZ211LCBSRUdfQTZYWF9HUFVfR01VX0FPX0dQVV9D WF9CVVNZX1NUQVRVUyk7CisKKwlpZiAocmVnICYgIEE2WFhfR1BVX0dNVV9BT19HUFVfQ1hfQlVT WV9TVEFUVVNfR1BVQlVTWUlHTkFIQikKKwkJcmV0dXJuIGZhbHNlOworCisJcmV0dXJuIHRydWU7 Cit9CisKK2ludCBhNnh4X2dtdV9zdG9wKHN0cnVjdCBhNnh4X2dwdSAqYTZ4eF9ncHUpCit7CisJ c3RydWN0IGE2eHhfZ211ICpnbXUgPSAmYTZ4eF9ncHUtPmdtdTsKKwl1MzIgdmFsOworCisJLyoK KwkgKiBUaGUgR01VIG1heSBzdGlsbCBiZSBpbiBzbHVtYmVyIHVubGVzcyB0aGUgR1BVIHN0YXJ0 ZWQgc28gY2hlY2sgYW5kCisJICogc2tpcCBwdXR0aW5nIGl0IGJhY2sgaW50byBzbHVtYmVyIGlm IHNvCisJICovCisJdmFsID0gZ211X3JlYWQoZ211LCBSRUdfQTZYWF9HUFVfR01VX0NYX0dNVV9S UE1IX1BPV0VSX1NUQVRFKTsKKworCWlmICh2YWwgIT0gMHhmKSB7CisJCWludCByZXQgPSBhNnh4 X2dtdV93YWl0X2Zvcl9pZGxlKGE2eHhfZ3B1KTsKKworCQkvKiBUZW1wb3JhcnkgdW50aWwgd2Ug Y2FuIHJlY292ZXIgc2FmZWx5ICovCisJCUJVR19PTihyZXQpOworCisJCS8qIHRlbGwgdGhlIEdN VSB3ZSB3YW50IHRvIHNsdW1iZXIgKi8KKwkJYTZ4eF9nbXVfbm90aWZ5X3NsdW1iZXIoZ211KTsK KworCQlyZXQgPSBnbXVfcG9sbF90aW1lb3V0KGdtdSwKKwkJCVJFR19BNlhYX0dQVV9HTVVfQU9f R1BVX0NYX0JVU1lfU1RBVFVTLCB2YWwsCisJCQkhKHZhbCAmIEE2WFhfR1BVX0dNVV9BT19HUFVf Q1hfQlVTWV9TVEFUVVNfR1BVQlVTWUlHTkFIQiksCisJCQkxMDAsIDEwMDAwKTsKKworCQkvKgor CQkgKiBMZXQgdGhlIHVzZXIga25vdyB3ZSBmYWlsZWQgdG8gc2x1bWJlciBidXQgZG9uJ3Qgd29y cnkgdG9vCisJCSAqIG11Y2ggYmVjYXVzZSB3ZSBhcmUgcG93ZXJpbmcgZG93biBhbnl3YXkKKwkJ ICovCisKKwkJaWYgKHJldCkKKwkJCWRldl9lcnIoZ211LT5kZXYsCisJCQkJIlVuYWJsZSB0byBz bHVtYmVyIEdNVTogc3RhdHVzID0gMCV4LzAleFxuIiwKKwkJCQlnbXVfcmVhZChnbXUsIFJFR19B NlhYX0dQVV9HTVVfQU9fR1BVX0NYX0JVU1lfU1RBVFVTKSwKKwkJCQlnbXVfcmVhZChnbXUsIFJF R19BNlhYX0dQVV9HTVVfQU9fR1BVX0NYX0JVU1lfU1RBVFVTMikpOworCX0KKworCS8qIFR1cm4g b2ZmIEhGSSAqLworCWE2eHhfaGZpX3N0b3AoZ211KTsKKworCS8qIFN0b3AgdGhlIGludGVycnVw dHMgYW5kIG1hc2sgdGhlIGhhcmR3YXJlICovCisJYTZ4eF9nbXVfaXJxX2Rpc2FibGUoZ211KTsK KworCS8qIFRlbGwgUlBNaCB0byBwb3dlciBvZmYgdGhlIEdQVSAqLworCWE2eHhfcnBtaF9zdG9w KGdtdSk7CisKKwljbGtfYnVsa19kaXNhYmxlX3VucHJlcGFyZShnbXUtPm5yX2Nsb2NrcywgZ211 LT5jbG9ja3MpOworCisJcG1fcnVudGltZV9wdXRfc3luYyhnbXUtPmRldik7CisKKwlyZXR1cm4g MDsKK30KKworc3RhdGljIHZvaWQgYTZ4eF9nbXVfbWVtb3J5X2ZyZWUoc3RydWN0IGE2eHhfZ211 ICpnbXUsIHN0cnVjdCBhNnh4X2dtdV9ibyAqYm8pCit7CisJaW50IGNvdW50LCBpOworCXU2NCBp b3ZhOworCisJaWYgKElTX0VSUl9PUl9OVUxMKGJvKSkKKwkJcmV0dXJuOworCisJY291bnQgPSBi by0+c2l6ZSA+PiBQQUdFX1NISUZUOworCWlvdmEgPSBiby0+aW92YTsKKworCWZvciAoaSA9IDA7 IGkgPCBjb3VudDsgaSsrLCBpb3ZhICs9IFBBR0VfU0laRSkgeworCQlpb21tdV91bm1hcChnbXUt PmRvbWFpbiwgaW92YSwgUEFHRV9TSVpFKTsKKwkJX19mcmVlX3BhZ2VzKGJvLT5wYWdlc1tpXSwg MCk7CisJfQorCisJa2ZyZWUoYm8tPnBhZ2VzKTsKKwlrZnJlZShibyk7Cit9CisKK3N0YXRpYyBz dHJ1Y3QgYTZ4eF9nbXVfYm8gKmE2eHhfZ211X21lbW9yeV9hbGxvYyhzdHJ1Y3QgYTZ4eF9nbXUg KmdtdSwKKwkJc2l6ZV90IHNpemUpCit7CisJc3RydWN0IGE2eHhfZ211X2JvICpibzsKKwlpbnQg cmV0LCBjb3VudCwgaTsKKworCWJvID0ga3phbGxvYyhzaXplb2YoKmJvKSwgR0ZQX0tFUk5FTCk7 CisJaWYgKCFibykKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwliby0+c2l6ZSA9IFBB R0VfQUxJR04oc2l6ZSk7CisKKwljb3VudCA9IGJvLT5zaXplID4+IFBBR0VfU0hJRlQ7CisKKwli by0+cGFnZXMgPSBrY2FsbG9jKGNvdW50LCBzaXplb2Yoc3RydWN0IHBhZ2UgKiksIEdGUF9LRVJO RUwpOworCWlmICghYm8tPnBhZ2VzKSB7CisJCWtmcmVlKGJvKTsKKwkJcmV0dXJuIEVSUl9QVFIo LUVOT01FTSk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJYm8tPnBh Z2VzW2ldID0gYWxsb2NfcGFnZShHRlBfS0VSTkVMKTsKKwkJaWYgKCFiby0+cGFnZXNbaV0pCisJ CQlnb3RvIGVycjsKKwl9CisKKwliby0+aW92YSA9IGdtdS0+dW5jYWNoZWRfaW92YV9iYXNlOwor CisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJcmV0ID0gaW9tbXVfbWFwKGdtdS0+ ZG9tYWluLAorCQkJYm8tPmlvdmEgKyAoUEFHRV9TSVpFICogaSksCisJCQlwYWdlX3RvX3BoeXMo Ym8tPnBhZ2VzW2ldKSwgUEFHRV9TSVpFLAorCQkJSU9NTVVfUkVBRCB8IElPTU1VX1dSSVRFKTsK KworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKGdtdS0+ZGV2LCAiVW5hYmxlIHRvIG1hcCBHTVUg YnVmZmVyIG9iamVjdFxuIik7CisKKwkJCWZvciAoaSA9IGkgLSAxIDsgaSA+PSAwOyBpLS0pCisJ CQkJaW9tbXVfdW5tYXAoZ211LT5kb21haW4sCisJCQkJCWJvLT5pb3ZhICsgKFBBR0VfU0laRSAq IGkpLAorCQkJCQlQQUdFX1NJWkUpOworCisJCQlnb3RvIGVycjsKKwkJfQorCX0KKworCWJvLT52 aXJ0ID0gdm1hcChiby0+cGFnZXMsIGNvdW50LCBWTV9JT1JFTUFQLAorCQlwZ3Byb3Rfd3JpdGVj b21iaW5lKFBBR0VfS0VSTkVMKSk7CisJaWYgKCFiby0+dmlydCkKKwkJZ290byBlcnI7CisKKwkv KiBBbGlnbiBmdXR1cmUgSU9WQSBhZGRyZXNzZXMgb24gMU1CIGJvdW5kYXJpZXMgKi8KKwlnbXUt PnVuY2FjaGVkX2lvdmFfYmFzZSArPSBBTElHTihzaXplLCBTWl8xTSk7CisKKwlyZXR1cm4gYm87 CisKK2VycjoKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQlpZiAoYm8tPnBhZ2Vz W2ldKQorCQkJX19mcmVlX3BhZ2VzKGJvLT5wYWdlc1tpXSwgMCk7CisJfQorCisJa2ZyZWUoYm8t PnBhZ2VzKTsKKwlrZnJlZShibyk7CisKKwlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKK30KKwor c3RhdGljIGludCBhNnh4X2dtdV9tZW1vcnlfcHJvYmUoc3RydWN0IGE2eHhfZ211ICpnbXUpCit7 CisJaW50IHJldDsKKworCS8qCisJICogVGhlIEdNVSBhZGRyZXNzIHNwYWNlIGlzIGhhcmRjb2Rl ZCB0byB0cmVhdCB0aGUgcmFuZ2UKKwkgKiAweDYwMDAwMDAwIC0gMHg4MDAwMDAwMCBhcyB1bi1j YWNoZWQgbWVtb3J5LiBBbGwgYnVmZmVycyBzaGFyZWQKKwkgKiBiZXR3ZWVuIHRoZSBHTVUgYW5k IHRoZSBDUFUgd2lsbCBsaXZlIGluIHRoaXMgc3BhY2UKKwkgKi8KKwlnbXUtPnVuY2FjaGVkX2lv dmFfYmFzZSA9IDB4NjAwMDAwMDA7CisKKworCWdtdS0+ZG9tYWluID0gaW9tbXVfZG9tYWluX2Fs bG9jKCZwbGF0Zm9ybV9idXNfdHlwZSk7CisJaWYgKCFnbXUtPmRvbWFpbikKKwkJcmV0dXJuIC1F Tk9ERVY7CisKKwlyZXQgPSBpb21tdV9hdHRhY2hfZGV2aWNlKGdtdS0+ZG9tYWluLCBnbXUtPmRl dik7CisKKwlpZiAocmV0KSB7CisJCWlvbW11X2RvbWFpbl9mcmVlKGdtdS0+ZG9tYWluKTsKKwkJ Z211LT5kb21haW4gPSBOVUxMOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qIEdldCB0aGUg bGlzdCBvZiBSUE1oIHZvbHRhZ2UgbGV2ZWxzIGZyb20gY21kLWRiICovCitzdGF0aWMgaW50IGE2 eHhfZ211X3JwbWhfYXJjX2NtZHMoY29uc3QgY2hhciAqaWQsIHZvaWQgKnZhbHMsIGludCBzaXpl KQoreworCXUzMiBsZW4gPSBjbWRfZGJfcmVhZF9hdXhfZGF0YV9sZW4oaWQpOworCisJaWYgKCFs ZW4pCisJCXJldHVybiAwOworCisJaWYgKFdBUk5fT04obGVuID4gc2l6ZSkpCisJCXJldHVybiAt RUlOVkFMOworCisJY21kX2RiX3JlYWRfYXV4X2RhdGEoaWQsIHZhbHMsIGxlbik7CisKKwkvKgor CSAqIFRoZSBkYXRhIGNvbWVzIGJhY2sgYXMgYW4gYXJyYXkgb2YgdW5zaWduZWQgc2hvcnRzIHNv IGFkanVzdCB0aGUKKwkgKiBjb3VudCBhY2NvcmRpbmdseQorCSAqLworCXJldHVybiBsZW4gPj4g MTsKK30KKworLyogUmV0dXJuIHRoZSAnYXJjLWxldmVsJyBmb3IgdGhlIGdpdmVuIGZyZXF1ZW5j eSAqLworc3RhdGljIHUzMiBhNnh4X2dtdV9nZXRfYXJjX2xldmVsKHN0cnVjdCBkZXZpY2UgKmRl diwgdW5zaWduZWQgbG9uZyBmcmVxKQoreworCXN0cnVjdCBkZXZfcG1fb3BwICpvcHA7CisJc3Ry dWN0IGRldmljZV9ub2RlICpucDsKKwl1MzIgdmFsID0gMDsKKworCWlmICghZnJlcSkKKwkJcmV0 dXJuIDA7CisKKwlvcHAgID0gZGV2X3BtX29wcF9maW5kX2ZyZXFfZXhhY3QoZGV2LCBmcmVxLCB0 cnVlKTsKKwlpZiAoSVNfRVJSKG9wcCkpCisJCXJldHVybiAwOworCisJbnAgPSBkZXZfcG1fb3Bw X2dldF9vZl9ub2RlKG9wcCk7CisKKwlpZiAobnApIHsKKwkJb2ZfcHJvcGVydHlfcmVhZF91MzIo bnAsICJxY29tLGxldmVsIiwgJnZhbCk7CisJCW9mX25vZGVfcHV0KG5wKTsKKwl9CisKKwlkZXZf cG1fb3BwX3B1dChvcHApOworCisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIGludCBhNnh4X2dt dV9ycG1oX2FyY192b3Rlc19pbml0KHN0cnVjdCBkZXZpY2UgKmRldiwgdTMyICp2b3RlcywKKwkJ dW5zaWduZWQgbG9uZyAqZnJlcXMsIGludCBmcmVxc19jb3VudCwKKwkJdTE2ICpwcmksIGludCBw cmlfY291bnQsCisJCXUxNiAqc2VjLCBpbnQgc2VjX2NvdW50KQoreworCWludCBpLCBqOworCisJ LyogQ29uc3RydWN0IGEgdm90ZSBmb3IgZWFjaCBmcmVxdWVuY3kgKi8KKwlmb3IgKGkgPSAwOyBp IDwgZnJlcXNfY291bnQ7IGkrKykgeworCQl1OCBwaW5kZXggPSAwLCBzaW5kZXggPSAwOworCQl1 MzIgbGV2ZWwgPSBhNnh4X2dtdV9nZXRfYXJjX2xldmVsKGRldiwgZnJlcXNbaV0pOworCisJCS8q IEdldCB0aGUgcHJpbWFyeSBpbmRleCB0aGF0IG1hdGNoZXMgdGhlIGFyYyBsZXZlbCAqLworCQlm b3IgKGogPSAwOyBqIDwgcHJpX2NvdW50OyBqKyspIHsKKwkJCWlmIChwcmlbal0gPj0gbGV2ZWwp IHsKKwkJCQlwaW5kZXggPSBqOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJaWYgKGogPT0g cHJpX2NvdW50KSB7CisJCQlkZXZfZXJyKGRldiwKKwkJCQkiTGV2ZWwgJXUgbm90IGZvdW5kIGlu IGluIHRoZSBSUE1oIGxpc3RcbiIsCisJCQkJCWxldmVsKTsKKwkJCWRldl9lcnIoZGV2LCAiQXZh aWxhYmxlIGxldmVsczpcbiIpOworCQkJZm9yIChqID0gMDsgaiA8IHByaV9jb3VudDsgaisrKQor CQkJCWRldl9lcnIoZGV2LCAiICAldVxuIiwgcHJpW2pdKTsKKworCQkJcmV0dXJuIC1FSU5WQUw7 CisJCX0KKworCQkvKgorCQkgKiBMb29rIGZvciBhIGxldmVsIGluIGluIHRoZSBzZWNvbmRhcnkg bGlzdCB0aGF0IG1hdGNoZXMuIElmCisJCSAqIG5vdGhpbmcgZml0cywgdXNlIHRoZSBtYXhpbXVt CisJCSAqLworCQlzaW5kZXggPSBzZWNfY291bnQgLSAxOworCisJCWZvciAoaiA9IDA7IGogPCBz ZWNfY291bnQgLSAxOyBqKyspIHsKKwkJCWlmIChzZWNbal0gPj0gbGV2ZWwpIHsKKwkJCQlzaW5k ZXggPSBqOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJLyogQ29uc3RydWN0IHRoZSB2b3Rl ICovCisJCXZvdGVzW2ldID0gKChwcmlbcGluZGV4XSAmIDB4ZmZmZikgPDwgMTYpIHwKKwkJCShz aW5kZXggPDwgOCkgfCBwaW5kZXg7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGUg R01VIHZvdGVzIHdpdGggdGhlIFJQTWggZm9yIGl0c2VsZiBhbmQgb24gYmVoYWxmIG9mIHRoZSBH UFUgYnV0IHdlIG5lZWQKKyAqIHRvIGNvbnN0cnVjdCB0aGUgbGlzdCBvZiB2b3RlcyBvbiB0aGUg Q1BVIGFuZCBzZW5kIGl0IG92ZXIuIFF1ZXJ5IHRoZSBSUE1oCisgKiB2b2x0YWdlIGxldmVscyBh bmQgYnVpbGQgdGhlIHZvdGVzCisgKi8KKworc3RhdGljIGludCBhNnh4X2dtdV9ycG1oX3ZvdGVz X2luaXQoc3RydWN0IGE2eHhfZ211ICpnbXUpCit7CisJc3RydWN0IGE2eHhfZ3B1ICphNnh4X2dw dSA9IGNvbnRhaW5lcl9vZihnbXUsIHN0cnVjdCBhNnh4X2dwdSwgZ211KTsKKwlzdHJ1Y3QgYWRy ZW5vX2dwdSAqYWRyZW5vX2dwdSA9ICZhNnh4X2dwdS0+YmFzZTsKKwlzdHJ1Y3QgbXNtX2dwdSAq Z3B1ID0gJmFkcmVub19ncHUtPmJhc2U7CisKKwl1MTYgZ3hbMTZdLCBjeFsxNl0sIG14WzE2XTsK Kwl1MzIgZ3hjb3VudCwgY3hjb3VudCwgbXhjb3VudDsKKwlpbnQgcmV0OworCisJLyogR2V0IHRo ZSBsaXN0IG9mIGF2YWlsYWJsZSB2b2x0YWdlIGxldmVscyBmb3IgZWFjaCBjb21wb25lbnQgKi8K KwlneGNvdW50ID0gYTZ4eF9nbXVfcnBtaF9hcmNfY21kcygiZ2Z4Lmx2bCIsIGd4LCBzaXplb2Yo Z3gpKTsKKwljeGNvdW50ID0gYTZ4eF9nbXVfcnBtaF9hcmNfY21kcygiY3gubHZsIiwgY3gsIHNp emVvZihjeCkpOworCW14Y291bnQgPSBhNnh4X2dtdV9ycG1oX2FyY19jbWRzKCJteC5sdmwiLCBt eCwgc2l6ZW9mKG14KSk7CisKKwkvKiBCdWlsZCB0aGUgR1ggdm90ZXMgKi8KKwlyZXQgPSBhNnh4 X2dtdV9ycG1oX2FyY192b3Rlc19pbml0KCZncHUtPnBkZXYtPmRldiwgZ211LT5neF9hcmNfdm90 ZXMsCisJCWdtdS0+Z3B1X2ZyZXFzLCBnbXUtPm5yX2dwdV9mcmVxcywKKwkJZ3gsIGd4Y291bnQs IG14LCBteGNvdW50KTsKKworCS8qIEJ1aWxkIHRoZSBDWCB2b3RlcyAqLworCXJldCB8PSBhNnh4 X2dtdV9ycG1oX2FyY192b3Rlc19pbml0KGdtdS0+ZGV2LCBnbXUtPmN4X2FyY192b3RlcywKKwkJ Z211LT5nbXVfZnJlcXMsIGdtdS0+bnJfZ211X2ZyZXFzLAorCQljeCwgY3hjb3VudCwgbXgsIG14 Y291bnQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhNnh4X2dtdV9idWlsZF9m cmVxX3RhYmxlKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyAqZnJlcXMsCisJCXUz MiBzaXplKQoreworCWludCBjb3VudCA9IGRldl9wbV9vcHBfZ2V0X29wcF9jb3VudChkZXYpOwor CXN0cnVjdCBkZXZfcG1fb3BwICpvcHA7CisJaW50IGksIGluZGV4ID0gMDsKKwl1bnNpZ25lZCBs b25nIGZyZXEgPSAxOworCisJLyoKKwkgKiBUaGUgT1BQIHRhYmxlIGRvZXNuJ3QgY29udGFpbiB0 aGUgIm9mZiIgZnJlcXVlbmN5IGxldmVsIHNvIHdlIG5lZWQgdG8KKwkgKiBhZGQgMSB0byB0aGUg dGFibGUgc2l6ZSB0byBhY2NvdW50IGZvciBpdAorCSAqLworCisJaWYgKFdBUk4oY291bnQgKyAx ID4gc2l6ZSwKKwkJIlRoZSBHTVUgZnJlcXVlbmN5IHRhYmxlIGlzIGJlaW5nIHRydW5jYXRlZFxu IikpCisJCWNvdW50ID0gc2l6ZSAtIDE7CisKKwkvKiBTZXQgdGhlICJvZmYiIGZyZXF1ZW5jeSAq LworCWZyZXFzW2luZGV4KytdID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7 CisJCW9wcCA9IGRldl9wbV9vcHBfZmluZF9mcmVxX2NlaWwoZGV2LCAmZnJlcSk7CisJCWlmIChJ U19FUlIob3BwKSkKKwkJCWJyZWFrOworCisJCWRldl9wbV9vcHBfcHV0KG9wcCk7CisJCWZyZXFz W2luZGV4KytdID0gZnJlcSsrOworCX0KKworCXJldHVybiBpbmRleDsKK30KKworc3RhdGljIGlu dCBhNnh4X2dtdV9wd3JsZXZlbHNfcHJvYmUoc3RydWN0IGE2eHhfZ211ICpnbXUpCit7CisJc3Ry dWN0IGE2eHhfZ3B1ICphNnh4X2dwdSA9IGNvbnRhaW5lcl9vZihnbXUsIHN0cnVjdCBhNnh4X2dw dSwgZ211KTsKKwlzdHJ1Y3QgYWRyZW5vX2dwdSAqYWRyZW5vX2dwdSA9ICZhNnh4X2dwdS0+YmFz ZTsKKwlzdHJ1Y3QgbXNtX2dwdSAqZ3B1ID0gJmFkcmVub19ncHUtPmJhc2U7CisKKwlpbnQgcmV0 ID0gMDsKKworCS8qCisJICogVGhlIEdNVSBoYW5kbGVzIGl0cyBvd24gZnJlcXVlbmN5IHN3aXRj aGluZyBzbyBidWlsZCBhIGxpc3Qgb2YKKwkgKiBhdmFpbGFibGUgZnJlcXVlbmNpZXMgdG8gc2Vu ZCBkdXJpbmcgaW5pdGFsaXphdGlvbgorCSAqLworCXJldCA9IGRldl9wbV9vcHBfb2ZfYWRkX3Rh YmxlKGdtdS0+ZGV2KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZ211LT5kZXYsICJVbmFibGUg dG8gc2V0IHRoZSBPUFAgdGFibGUgZm9yIHRoZSBHTVVcbiIpOworCQlyZXR1cm4gcmV0OworCX0K KworCWdtdS0+bnJfZ211X2ZyZXFzID0gYTZ4eF9nbXVfYnVpbGRfZnJlcV90YWJsZShnbXUtPmRl diwKKwkJZ211LT5nbXVfZnJlcXMsIEFSUkFZX1NJWkUoZ211LT5nbXVfZnJlcXMpKTsKKworCS8q CisJICogVGhlIEdNVSBhbHNvIGhhbmRsZXMgR1BVIGZyZXF1ZW5jeSBzd2l0Y2hpbmcgc28gYnVp bGQgYSBsaXN0CisJICogZnJvbSB0aGUgR1BVIE9QUCB0YWJsZQorCSAqLworCWdtdS0+bnJfZ3B1 X2ZyZXFzID0gYTZ4eF9nbXVfYnVpbGRfZnJlcV90YWJsZSgmZ3B1LT5wZGV2LT5kZXYsCisJCWdt dS0+Z3B1X2ZyZXFzLCBBUlJBWV9TSVpFKGdtdS0+Z3B1X2ZyZXFzKSk7CisKKwkvKiBCdWlsZCB0 aGUgbGlzdCBvZiBSUE1oIHZvdGVzIHRoYXQgd2UnbGwgc2VuZCB0byB0aGUgR01VICovCisJcmV0 dXJuIGE2eHhfZ211X3JwbWhfdm90ZXNfaW5pdChnbXUpOworfQorCitzdGF0aWMgaW50IGE2eHhf Z211X2Nsb2Nrc19wcm9iZShzdHJ1Y3QgYTZ4eF9nbXUgKmdtdSkKK3sKKwlpbnQgcmV0ID0gbXNt X2Nsa19idWxrX2dldChnbXUtPmRldiwgJmdtdS0+Y2xvY2tzKTsKKworCWlmIChyZXQgPCAxKQor CQlyZXR1cm4gcmV0OworCisJZ211LT5ucl9jbG9ja3MgPSByZXQ7CisKKwlnbXUtPmNvcmVfY2xr ID0gbXNtX2Nsa19idWxrX2dldF9jbG9jayhnbXUtPmNsb2NrcywKKwkJZ211LT5ucl9jbG9ja3Ms ICJnbXUiKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2lvbWVtICphNnh4X2dt dV9nZXRfbW1pbyhzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCQljb25zdCBjaGFyICpu YW1lKQoreworCXZvaWQgX19pb21lbSAqcmV0OworCXN0cnVjdCByZXNvdXJjZSAqcmVzID0gcGxh dGZvcm1fZ2V0X3Jlc291cmNlX2J5bmFtZShwZGV2LAorCQkJSU9SRVNPVVJDRV9NRU0sIG5hbWUp OworCisJaWYgKCFyZXMpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiVW5hYmxlIHRvIGZpbmQg dGhlICVzIHJlZ2lzdGVyc1xuIiwgbmFtZSk7CisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwor CX0KKworCXJldCA9IGRldm1faW9yZW1hcCgmcGRldi0+ZGV2LCByZXMtPnN0YXJ0LCByZXNvdXJj ZV9zaXplKHJlcykpOworCWlmICghcmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIlVuYWJs ZSB0byBtYXAgdGhlICVzIHJlZ2lzdGVyc1xuIiwgbmFtZSk7CisJCXJldHVybiBFUlJfUFRSKC1F SU5WQUwpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYTZ4eF9nbXVfZ2V0 X2lycShzdHJ1Y3QgYTZ4eF9nbXUgKmdtdSwgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwK KwkJY29uc3QgY2hhciAqbmFtZSwgaXJxX2hhbmRsZXJfdCBoYW5kbGVyKQoreworCWludCBpcnEs IHJldDsKKworCWlycSA9IHBsYXRmb3JtX2dldF9pcnFfYnluYW1lKHBkZXYsIG5hbWUpOworCisJ cmV0ID0gZGV2bV9yZXF1ZXN0X2lycSgmcGRldi0+ZGV2LCBpcnEsIGhhbmRsZXIsIElSUUZfVFJJ R0dFUl9ISUdILAorCQluYW1lLCBnbXUpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ ZGV2LCAiVW5hYmxlIHRvIGdldCBpbnRlcnJ1cHQgJXNcbiIsIG5hbWUpOworCQlyZXR1cm4gcmV0 OworCX0KKworCWRpc2FibGVfaXJxKGlycSk7CisKKwlyZXR1cm4gaXJxOworfQorCit2b2lkIGE2 eHhfZ211X3JlbW92ZShzdHJ1Y3QgYTZ4eF9ncHUgKmE2eHhfZ3B1KQoreworCXN0cnVjdCBhNnh4 X2dtdSAqZ211ID0gJmE2eHhfZ3B1LT5nbXU7CisKKwlpZiAoSVNfRVJSX09SX05VTEwoZ211LT5t bWlvKSkKKwkJcmV0dXJuOworCisJcG1fcnVudGltZV9kaXNhYmxlKGdtdS0+ZGV2KTsKKwlhNnh4 X2dtdV9zdG9wKGE2eHhfZ3B1KTsKKworCWE2eHhfZ211X2lycV9kaXNhYmxlKGdtdSk7CisJYTZ4 eF9nbXVfbWVtb3J5X2ZyZWUoZ211LCBnbXUtPmhmaSk7CisKKwlpb21tdV9kZXRhY2hfZGV2aWNl KGdtdS0+ZG9tYWluLCBnbXUtPmRldik7CisKKwlpb21tdV9kb21haW5fZnJlZShnbXUtPmRvbWFp bik7Cit9CisKK2ludCBhNnh4X2dtdV9wcm9iZShzdHJ1Y3QgYTZ4eF9ncHUgKmE2eHhfZ3B1LCBz dHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUpCit7CisJc3RydWN0IGE2eHhfZ211ICpnbXUgPSAmYTZ4 eF9ncHUtPmdtdTsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gb2ZfZmluZF9kZXZp Y2VfYnlfbm9kZShub2RlKTsKKwlpbnQgcmV0OworCisJaWYgKCFwZGV2KQorCQlyZXR1cm4gLUVO T0RFVjsKKworCWdtdS0+ZGV2ID0gJnBkZXYtPmRldjsKKworCW9mX2RtYV9jb25maWd1cmUoZ211 LT5kZXYsIG5vZGUpOworCisJLyogRm93IG5vdywgZG9uJ3QgZG8gYW55dGhpbmcgZmFuY3kgdW50 aWwgd2UgZ2V0IG91ciBmZWV0IHVuZGVyIHVzICovCisJZ211LT5pZGxlX2xldmVsID0gR01VX0lE TEVfU1RBVEVfQUNUSVZFOworCisJcG1fcnVudGltZV9lbmFibGUoZ211LT5kZXYpOworCWdtdS0+ Z3ggPSBkZXZtX3JlZ3VsYXRvcl9nZXQoZ211LT5kZXYsICJ2ZGQiKTsKKworCS8qIEdldCB0aGUg bGlzdCBvZiBjbG9ja3MgKi8KKwlyZXQgPSBhNnh4X2dtdV9jbG9ja3NfcHJvYmUoZ211KTsKKwlp ZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogU2V0IHVwIHRoZSBJT01NVSBjb250ZXh0IGJh bmsgKi8KKwlyZXQgPSBhNnh4X2dtdV9tZW1vcnlfcHJvYmUoZ211KTsKKwlpZiAocmV0KQorCQly ZXR1cm4gcmV0OworCisJLyogQWxsb2NhdGUgbWVtb3J5IGZvciBmb3IgdGhlIEhGSSBxdWV1ZXMg Ki8KKwlnbXUtPmhmaSA9IGE2eHhfZ211X21lbW9yeV9hbGxvYyhnbXUsIFNaXzE2Syk7CisJaWYg KElTX0VSUihnbXUtPmhmaSkpCisJCWdvdG8gZXJyOworCisJLyogQWxsb2NhdGUgbWVtb3J5IGZv ciB0aGUgR01VIGRlYnVnIHJlZ2lvbiAqLworCWdtdS0+ZGVidWcgPSBhNnh4X2dtdV9tZW1vcnlf YWxsb2MoZ211LCBTWl8xNkspOworCWlmIChJU19FUlIoZ211LT5kZWJ1ZykpCisJCWdvdG8gZXJy OworCisJLyogTWFwIHRoZSBHTVUgcmVnaXN0ZXJzICovCisJZ211LT5tbWlvID0gYTZ4eF9nbXVf Z2V0X21taW8ocGRldiwgImdtdSIpOworCisJLyogTWFwIHRoZSBHUFUgcG93ZXIgZG9tYWluIGNv bnRyb2xsZXIgcmVnaXN0ZXJzICovCisJZ211LT5wZGNfbW1pbyA9IGE2eHhfZ211X2dldF9tbWlv KHBkZXYsICJnbXVfcGRjIik7CisKKwlpZiAoSVNfRVJSKGdtdS0+bW1pbykgfHwgSVNfRVJSKGdt dS0+cGRjX21taW8pKQorCQlnb3RvIGVycjsKKworCS8qIEdldCB0aGUgSEZJIGFuZCBHTVUgaW50 ZXJydXB0cyAqLworCWdtdS0+aGZpX2lycSA9IGE2eHhfZ211X2dldF9pcnEoZ211LCBwZGV2LCAi aGZpIiwgYTZ4eF9oZmlfaXJxKTsKKwlnbXUtPmdtdV9pcnEgPSBhNnh4X2dtdV9nZXRfaXJxKGdt dSwgcGRldiwgImdtdSIsIGE2eHhfZ211X2lycSk7CisKKwlpZiAoZ211LT5oZmlfaXJxIDwgMCB8 fCBnbXUtPmdtdV9pcnEgPCAwKQorCQlnb3RvIGVycjsKKworCS8qIFNldCB1cCBhIHRhc2tsZXQg dG8gaGFuZGxlIEdNVSBIRkkgcmVzcG9uc2VzICovCisJdGFza2xldF9pbml0KCZnbXUtPmhmaV90 YXNrbGV0LCBhNnh4X2hmaV90YXNrLCAodW5zaWduZWQgbG9uZykgZ211KTsKKworCS8qIEdldCB0 aGUgcG93ZXIgbGV2ZWxzIGZvciB0aGUgR01VIGFuZCBHUFUgKi8KKwlhNnh4X2dtdV9wd3JsZXZl bHNfcHJvYmUoZ211KTsKKworCS8qIFNldCB1cCB0aGUgSEZJIHF1ZXVlcyAqLworCWE2eHhfaGZp X2luaXQoZ211KTsKKworCXJldHVybiAwOworZXJyOgorCWE2eHhfZ211X21lbW9yeV9mcmVlKGdt dSwgZ211LT5oZmkpOworCisJaWYgKGdtdS0+ZG9tYWluKSB7CisJCWlvbW11X2RldGFjaF9kZXZp Y2UoZ211LT5kb21haW4sIGdtdS0+ZGV2KTsKKworCQlpb21tdV9kb21haW5fZnJlZShnbXUtPmRv bWFpbik7CisJfQorCisJcmV0dXJuIC1FTk9ERVY7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dw dS9kcm0vbXNtL2FkcmVuby9hNnh4X2dtdS5oIGIvZHJpdmVycy9ncHUvZHJtL21zbS9hZHJlbm8v YTZ4eF9nbXUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAuLmQ5YTM4 NmMxODc5OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vYWRyZW5vL2E2 eHhfZ211LmgKQEAgLTAsMCArMSwxNjIgQEAKKy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBH UEwtMi4wICovCisvKiBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFs bCByaWdodHMgcmVzZXJ2ZWQuICovCisKKyNpZm5kZWYgX0E2WFhfR01VX0hfCisjZGVmaW5lIF9B NlhYX0dNVV9IXworCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSAibXNt X2Rydi5oIgorI2luY2x1ZGUgImE2eHhfaGZpLmgiCisKK3N0cnVjdCBhNnh4X2dtdV9ibyB7CisJ dm9pZCAqdmlydDsKKwlzaXplX3Qgc2l6ZTsKKwl1NjQgaW92YTsKKwlzdHJ1Y3QgcGFnZSAqKnBh Z2VzOworfTsKKworLyoKKyAqIFRoZXNlIGRlZmluZSB0aGUgZGlmZmVyZW50IEdNVSB3YWtlIHVw IG9wdGlvbnMgLSB0aGVzZSBkZWZpbmUgaG93IGJvdGggdGhlCisgKiBDUFUgYW5kIHRoZSBHTVUg YnJpbmcgdXAgdGhlIGhhcmR3YXJlCisgKi8KKworLyogVEhlIEdNVSBoYXMgYWxyZWFkeSBiZWVu IGJvb3RlZCBhbmQgdGhlIHJlbnRlbnRpb24gcmVnaXN0ZXJzIGFyZSBhY3RpdmUgKi8KKyNkZWZp bmUgR01VX1dBUk1fQk9PVCAwCisKKy8qIHRoZSBHTVUgaXMgY29taW5nIHVwIGZvciB0aGUgZmly c3QgdGltZSBvciBiYWNrIGZyb20gYSBwb3dlciBjb2xsYXBzZSAqLworI2RlZmluZSBHTVVfQ09M RF9CT09UIDEKKworLyogVGhlIEdNVSBpcyBiZWluZyBzb2Z0IHJlc2V0IGFmdGVyIGEgZmF1bHQg Ki8KKyNkZWZpbmUgR01VX1JFU0VUIDIKKworLyoKKyAqIFRoZXNlIGRlZmluZSB0aGUgbGV2ZWwg b2YgY29udHJvbCB0aGF0IHRoZSBHTVUgaGFzIC0gdGhlIGhpZ2hlciB0aGUgbnVtYmVyCisgKiB0 aGUgbW9yZSB0aGluZ3MgdGhhdCB0aGUgR01VIGhhcmR3YXJlIGNvbnRyb2xzIG9uIGl0cyBvd24u CisgKi8KKworLyogVGhlIEdNVSBkb2VzIG5vdCBkbyBhbnkgaWRsZSBzdGF0ZSBtYW5hZ2VtZW50 ICovCisjZGVmaW5lIEdNVV9JRExFX1NUQVRFX0FDVElWRSAwCisKKy8qIFRoZSBHTVUgbWFuYWdl cyBTUFRQIHBvd2VyIGNvbGxhcHNlICovCisjZGVmaW5lIEdNVV9JRExFX1NUQVRFX1NQVFAgMgor CisvKiBUaGUgR01VIGRvZXMgYXV0b21hdGljIElGUEMgKGludHJhLWZyYW1lIHBvd2VyIGNvbGxh cHNlKSAqLworI2RlZmluZSBHTVVfSURMRV9TVEFURV9JRlBDIDMKKworc3RydWN0IGE2eHhfZ211 IHsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisKKwl2b2lkICogX19pb21lbSBtbWlvOworCXZvaWQg KiBfX2lvbWVtIHBkY19tbWlvOworCisJaW50IGhmaV9pcnE7CisJaW50IGdtdV9pcnE7CisKKwlz dHJ1Y3QgcmVndWxhdG9yICpneDsKKworCXN0cnVjdCBpb21tdV9kb21haW4gKmRvbWFpbjsKKwl1 NjQgdW5jYWNoZWRfaW92YV9iYXNlOworCisJaW50IGlkbGVfbGV2ZWw7CisKKwlzdHJ1Y3QgYTZ4 eF9nbXVfYm8gKmhmaTsKKwlzdHJ1Y3QgYTZ4eF9nbXVfYm8gKmRlYnVnOworCisJaW50IG5yX2Ns b2NrczsKKwlzdHJ1Y3QgY2xrX2J1bGtfZGF0YSAqY2xvY2tzOworCXN0cnVjdCBjbGsgKmNvcmVf Y2xrOworCisJaW50IG5yX2dwdV9mcmVxczsKKwl1bnNpZ25lZCBsb25nIGdwdV9mcmVxc1sxNl07 CisJdTMyIGd4X2FyY192b3Rlc1sxNl07CisKKwlpbnQgbnJfZ211X2ZyZXFzOworCXVuc2lnbmVk IGxvbmcgZ211X2ZyZXFzWzRdOworCXUzMiBjeF9hcmNfdm90ZXNbNF07CisKKwlzdHJ1Y3QgYTZ4 eF9oZmlfcXVldWUgcXVldWVzWzJdOworCisJc3RydWN0IHRhc2tsZXRfc3RydWN0IGhmaV90YXNr bGV0OworfTsKKworc3RhdGljIGlubGluZSB1MzIgZ211X3JlYWQoc3RydWN0IGE2eHhfZ211ICpn bXUsIHUzMiBvZmZzZXQpCit7CisJcmV0dXJuIG1zbV9yZWFkbChnbXUtPm1taW8gKyAob2Zmc2V0 IDw8IDIpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGdtdV93cml0ZShzdHJ1Y3QgYTZ4eF9n bXUgKmdtdSwgdTMyIG9mZnNldCwgdTMyIHZhbHVlKQoreworCXJldHVybiBtc21fd3JpdGVsKHZh bHVlLCBnbXUtPm1taW8gKyAob2Zmc2V0IDw8IDIpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lk IHBkY193cml0ZShzdHJ1Y3QgYTZ4eF9nbXUgKmdtdSwgdTMyIG9mZnNldCwgdTMyIHZhbHVlKQor eworCXJldHVybiBtc21fd3JpdGVsKHZhbHVlLCBnbXUtPnBkY19tbWlvICsgKG9mZnNldCA8PCAy KSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnbXVfcm13KHN0cnVjdCBhNnh4X2dtdSAqZ211 LCB1MzIgcmVnLCB1MzIgbWFzaywgdTMyIG9yKQoreworCXUzMiB2YWwgPSBnbXVfcmVhZChnbXUs IHJlZyk7CisKKwl2YWwgJj0gfm1hc2s7CisKKwlnbXVfd3JpdGUoZ211LCByZWcsIHZhbCB8IG9y KTsKK30KKworI2RlZmluZSBnbXVfcG9sbF90aW1lb3V0KGdtdSwgYWRkciwgdmFsLCBjb25kLCBp bnRlcnZhbCwgdGltZW91dCkgXAorCXJlYWRsX3BvbGxfdGltZW91dCgoZ211KS0+bW1pbyArICgo YWRkcikgPDwgMiksIHZhbCwgY29uZCwgXAorCQlpbnRlcnZhbCwgdGltZW91dCkKKworLyoKKyAq IFRoZXNlIGFyZSB0aGUgYXZhaWxhYmxlIE9PQiAob3V0IG9mIGJhbmQgcmVxdWVzdHMpIHRvIHRo ZSBHTVUgd2hlcmUgIm91dCBvZgorICogYmFuZCIgbWVhbnMgdGhhdCB0aGUgQ1BVIHRhbGtzIHRv IHRoZSBHTVUgZGlyZWN0bHkgYW5kIG5vdCB0aHJvdWdoIEhGSS4KKyAqIE5vcm1hbGx5IHRoaXMg d29ya3MgYnkgd3JpdGluZyBhIElUQ00vRFRDTSByZWdpc3RlciBhbmQgdGhlbiB0cmlnZ2VyaW5n IGEKKyAqIGludGVycnVwdCAodGhlICJyZXF1ZXN0IiBiaXQpIGFuZCB3YWl0aW5nIGZvciBhbiBh Y2tub3dsZWRnbWVudCAodGhlICJhY2siCisgKiBiaXQpLiBUaGUgc3RhdGUgaXMgY2xlYXJlZCBi eSB3cml0aW5nIHRoZSAiY2xlYXInIGJpdCB0byB0aGUgR01VIGludGVycnVwdC4KKyAqCisgKiBU aGVzZSBhcmUgdXNlZCB0byBmb3JjZSB0aGUgR01VL0dQVSB0byBzdGF5IG9uIGR1cmluZyBhIGNy aXRpY2FsIHNlcXVlbmNlIG9yCisgKiBmb3IgaGFyZHdhcmUgd29ya2Fyb3VuZHMuCisgKi8KKwor ZW51bSBhNnh4X2dtdV9vb2Jfc3RhdGUgeworCUdNVV9PT0JfQk9PVF9TTFVNQkVSID0gMCwKKwlH TVVfT09CX0dQVV9TRVQsCisJR01VX09PQl9EQ1ZTX1NFVCwKK307CisKKy8qIFRoZXNlIGFyZSB0 aGUgaW50ZXJydXB0IC8gYWNrIGJpdHMgZm9yIGVhY2ggT09CIHJlcXVlc3QgdGhhdCBhcmUgc2V0 CisgKiBpbiBhNnh4X2dtdV9zZXRfb29iIGFuZCBhNnh4X2NsZWFyX29vYgorICovCisKKy8qCisg KiBMZXQgdGhlIEdNVSBrbm93IHRoYXQgYSBib290IG9yIHNsdW1iZXIgb3BlcmF0aW9uIGhhcyBz dGFydGVkLiBUaGUgdmFsdWUgaW4KKyAqIFJFR19BNlhYX0dNVV9CT09UX1NMVU1CRVJfT1BUSU9O IGxldHMgdGhlIEdNVSBrbm93IHdoaWNoIG9wZXJhdGlvbiB3ZSBhcmUKKyAqIGRvaW5nCisgKi8K KyNkZWZpbmUgR01VX09PQl9CT09UX1NMVU1CRVJfUkVRVUVTVAkyMgorI2RlZmluZSBHTVVfT09C X0JPT1RfU0xVTUJFUl9BQ0sJMzAKKyNkZWZpbmUgR01VX09PQl9CT09UX1NMVU1CRVJfQ0xFQVIJ MzAKKworLyoKKyAqIFNldCBhIG5ldyBwb3dlciBsZXZlbCBmb3IgdGhlIEdQVSB3aGVuIHRoZSBD UFUgaXMgZG9pbmcgZnJlcXVlbmN5IHNjYWxpbmcKKyAqLworI2RlZmluZSBHTVVfT09CX0RDVlNf UkVRVUVTVAkyMworI2RlZmluZSBHTVVfT09CX0RDVlNfQUNLCTMxCisjZGVmaW5lIEdNVV9PT0Jf RENWU19DTEVBUgkzMQorCisvKgorICogTGV0IHRoZSBHTVUga25vdyB0byBub3QgdHVybiBvZmYg YW55IEdQVSByZWdpc3RlcnMgd2hpbGUgdGhlIENQVSBpcyBpbiBhCisgKiBjcml0aWNhbCBzZWN0 aW9uCisgKi8KKyNkZWZpbmUgR01VX09PQl9HUFVfU0VUX1JFUVVFU1QJMTYKKyNkZWZpbmUgR01V X09PQl9HUFVfU0VUX0FDSwkyNAorI2RlZmluZSBHTVVfT09CX0dQVV9TRVRfQ0xFQVIJMjQKKwor Cit2b2lkIGE2eHhfaGZpX2luaXQoc3RydWN0IGE2eHhfZ211ICpnbXUpOworaW50IGE2eHhfaGZp X3N0YXJ0KHN0cnVjdCBhNnh4X2dtdSAqZ211LCBpbnQgYm9vdF9zdGF0ZSk7Cit2b2lkIGE2eHhf aGZpX3N0b3Aoc3RydWN0IGE2eHhfZ211ICpnbXUpOworCit2b2lkIGE2eHhfaGZpX3Rhc2sodW5z aWduZWQgbG9uZyBkYXRhKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0v bXNtL2FkcmVuby9hNnh4X2dwdS5jIGIvZHJpdmVycy9ncHUvZHJtL21zbS9hZHJlbm8vYTZ4eF9n cHUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAuLmIzYjg1ZWJjZTg4 ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vYWRyZW5vL2E2eHhfZ3B1 LmMKQEAgLTAsMCArMSw4MDcgQEAKKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4w CisvKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJp Z2h0cyByZXNlcnZlZC4gKi8KKworCisjaW5jbHVkZSAibXNtX2dlbS5oIgorI2luY2x1ZGUgIm1z bV9tbXUuaCIKKyNpbmNsdWRlICJhNnh4X2dwdS5oIgorI2luY2x1ZGUgImE2eHhfZ211LnhtbC5o IgorCitzdGF0aWMgaW5saW5lIGJvb2wgX2E2eHhfY2hlY2tfaWRsZShzdHJ1Y3QgbXNtX2dwdSAq Z3B1KQoreworCXN0cnVjdCBhZHJlbm9fZ3B1ICphZHJlbm9fZ3B1ID0gdG9fYWRyZW5vX2dwdShn cHUpOworCXN0cnVjdCBhNnh4X2dwdSAqYTZ4eF9ncHUgPSB0b19hNnh4X2dwdShhZHJlbm9fZ3B1 KTsKKworCS8qIENoZWNrIHRoYXQgdGhlIEdNVSBpcyBpZGxlICovCisJaWYgKCFhNnh4X2dtdV9p c2lkbGUoJmE2eHhfZ3B1LT5nbXUpKQorCQlyZXR1cm4gZmFsc2U7CisKKwkvKiBDaGVjayB0aGEg dGhlIENYIG1hc3RlciBpcyBpZGxlICovCisJaWYgKGdwdV9yZWFkKGdwdSwgUkVHX0E2WFhfUkJC TV9TVEFUVVMpICYKKwkJCX5BNlhYX1JCQk1fU1RBVFVTX0NQX0FIQl9CVVNZX0NYX01BU1RFUikK KwkJcmV0dXJuIGZhbHNlOworCisJcmV0dXJuICEoZ3B1X3JlYWQoZ3B1LCBSRUdfQTZYWF9SQkJN X0lOVF8wX1NUQVRVUykgJgorCQlBNlhYX1JCQk1fSU5UXzBfTUFTS19SQkJNX0hBTkdfREVURUNU KTsKK30KKworYm9vbCBhNnh4X2lkbGUoc3RydWN0IG1zbV9ncHUgKmdwdSwgc3RydWN0IG1zbV9y aW5nYnVmZmVyICpyaW5nKQoreworCS8qIHdhaXQgZm9yIENQIHRvIGRyYWluIHJpbmdidWZmZXI6 ICovCisJaWYgKCFhZHJlbm9faWRsZShncHUsIHJpbmcpKQorCQlyZXR1cm4gZmFsc2U7CisKKwlp ZiAoc3Bpbl91bnRpbChfYTZ4eF9jaGVja19pZGxlKGdwdSkpKSB7CisJCURSTV9FUlJPUigiJXM6 ICVwczogdGltZW91dCB3YWl0aW5nIGZvciBHUFUgdG8gaWRsZTogc3RhdHVzICU4LjhYIGlycSAl OC44WCBycHRyL3dwdHIgJWQvJWRcbiIsCisJCQlncHUtPm5hbWUsIF9fYnVpbHRpbl9yZXR1cm5f YWRkcmVzcygwKSwKKwkJCWdwdV9yZWFkKGdwdSwgUkVHX0E2WFhfUkJCTV9TVEFUVVMpLAorCQkJ Z3B1X3JlYWQoZ3B1LCBSRUdfQTZYWF9SQkJNX0lOVF8wX1NUQVRVUyksCisJCQlncHVfcmVhZChn cHUsIFJFR19BNlhYX0NQX1JCX1JQVFIpLAorCQkJZ3B1X3JlYWQoZ3B1LCBSRUdfQTZYWF9DUF9S Ql9XUFRSKSk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3Rh dGljIHZvaWQgYTZ4eF9mbHVzaChzdHJ1Y3QgbXNtX2dwdSAqZ3B1LCBzdHJ1Y3QgbXNtX3Jpbmdi dWZmZXIgKnJpbmcpCit7CisJdWludDMyX3Qgd3B0cjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwor CisJc3Bpbl9sb2NrX2lycXNhdmUoJnJpbmctPmxvY2ssIGZsYWdzKTsKKworCS8qIENvcHkgdGhl IHNoYWRvdyB0byB0aGUgYWN0dWFsIHJlZ2lzdGVyICovCisJcmluZy0+Y3VyID0gcmluZy0+bmV4 dDsKKworCS8qIE1ha2Ugc3VyZSB0byB3cmFwIHdwdHIgaWYgd2UgbmVlZCB0byAqLworCXdwdHIg PSBnZXRfd3B0cihyaW5nKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJpbmctPmxvY2ss IGZsYWdzKTsKKworCS8qIE1ha2Ugc3VyZSBldmVyeXRoaW5nIGlzIHBvc3RlZCBiZWZvcmUgbWFr aW5nIGEgZGVjaXNpb24gKi8KKwltYigpOworCisJZ3B1X3dyaXRlKGdwdSwgUkVHX0E2WFhfQ1Bf UkJfV1BUUiwgd3B0cik7Cit9CisKK3N0YXRpYyB2b2lkIGE2eHhfc3VibWl0KHN0cnVjdCBtc21f Z3B1ICpncHUsIHN0cnVjdCBtc21fZ2VtX3N1Ym1pdCAqc3VibWl0LAorCXN0cnVjdCBtc21fZmls ZV9wcml2YXRlICpjdHgpCit7CisJc3RydWN0IG1zbV9kcm1fcHJpdmF0ZSAqcHJpdiA9IGdwdS0+ ZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgbXNtX3JpbmdidWZmZXIgKnJpbmcgPSBzdWJtaXQt PnJpbmc7CisJdW5zaWduZWQgaW50IGk7CisKKwkvKiBJbnZhbGlkYXRlIENDVSBkZXB0aCBhbmQg Y29sb3IgKi8KKwlPVVRfUEtUNyhyaW5nLCBDUF9FVkVOVF9XUklURSwgMSk7CisJT1VUX1JJTkco cmluZywgUENfQ0NVX0lOVkFMSURBVEVfREVQVEgpOworCisJT1VUX1BLVDcocmluZywgQ1BfRVZF TlRfV1JJVEUsIDEpOworCU9VVF9SSU5HKHJpbmcsIFBDX0NDVV9JTlZBTElEQVRFX0NPTE9SKTsK KworCS8qIFN1Ym1pdCB0aGUgY29tbWFuZHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgc3VibWl0LT5u cl9jbWRzOyBpKyspIHsKKwkJc3dpdGNoIChzdWJtaXQtPmNtZFtpXS50eXBlKSB7CisJCWNhc2Ug TVNNX1NVQk1JVF9DTURfSUJfVEFSR0VUX0JVRjoKKwkJCWJyZWFrOworCQljYXNlIE1TTV9TVUJN SVRfQ01EX0NUWF9SRVNUT1JFX0JVRjoKKwkJCWlmIChwcml2LT5sYXN0Y3R4ID09IGN0eCkKKwkJ CQlicmVhazsKKwkJY2FzZSBNU01fU1VCTUlUX0NNRF9CVUY6CisJCQlPVVRfUEtUNyhyaW5nLCBD UF9JTkRJUkVDVF9CVUZGRVJfUEZFLCAzKTsKKwkJCU9VVF9SSU5HKHJpbmcsIGxvd2VyXzMyX2Jp dHMoc3VibWl0LT5jbWRbaV0uaW92YSkpOworCQkJT1VUX1JJTkcocmluZywgdXBwZXJfMzJfYml0 cyhzdWJtaXQtPmNtZFtpXS5pb3ZhKSk7CisJCQlPVVRfUklORyhyaW5nLCBzdWJtaXQtPmNtZFtp XS5zaXplKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyogV3JpdGUgdGhlIGZlbmNlIHRvIHRo ZSBzY3JhdGNoIHJlZ2lzdGVyICovCisJT1VUX1BLVDQocmluZywgUkVHX0E2WFhfQ1BfU0NSQVRD SF9SRUcoMiksIDEpOworCU9VVF9SSU5HKHJpbmcsIHN1Ym1pdC0+c2Vxbm8pOworCisJLyoKKwkg KiBFeGVjdXRlIGEgQ0FDSEVfRkxVU0hfVFMgZXZlbnQuIFRoaXMgd2lsbCBlbnN1cmUgdGhhdCB0 aGUKKwkgKiB0aW1lc3RhbXAgaXMgd3JpdHRlbiB0byB0aGUgbWVtb3J5IGFuZCB0aGVuIHRyaWdn ZXJzIHRoZSBpbnRlcnJ1cHQKKwkgKi8KKwlPVVRfUEtUNyhyaW5nLCBDUF9FVkVOVF9XUklURSwg NCk7CisJT1VUX1JJTkcocmluZywgQ0FDSEVfRkxVU0hfVFMgfCAoMSA8PCAzMSkpOworCU9VVF9S SU5HKHJpbmcsIGxvd2VyXzMyX2JpdHMocmJtZW1wdHIocmluZywgZmVuY2UpKSk7CisJT1VUX1JJ TkcocmluZywgdXBwZXJfMzJfYml0cyhyYm1lbXB0cihyaW5nLCBmZW5jZSkpKTsKKwlPVVRfUklO RyhyaW5nLCBzdWJtaXQtPnNlcW5vKTsKKworCWE2eHhfZmx1c2goZ3B1LCByaW5nKTsKK30KKwor c3RhdGljIGNvbnN0IHN0cnVjdCB7CisJdTMyIG9mZnNldDsKKwl1MzIgdmFsdWU7Cit9IGE2eHhf aHdjZ1tdID0geworCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0NOVExfU1AwLCAweDIyMjIyMjIyfSwK Kwl7UkVHX0E2WFhfUkJCTV9DTE9DS19DTlRMX1NQMSwgMHgyMjIyMjIyMn0sCisJe1JFR19BNlhY X1JCQk1fQ0xPQ0tfQ05UTF9TUDIsIDB4MjIyMjIyMjJ9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NL X0NOVExfU1AzLCAweDIyMjIyMjIyfSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9DS19DTlRMMl9TUDAs IDB4MDIwMjIyMjB9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0NOVEwyX1NQMSwgMHgwMjAyMjIy MH0sCisJe1JFR19BNlhYX1JCQk1fQ0xPQ0tfQ05UTDJfU1AyLCAweDAyMDIyMjIwfSwKKwl7UkVH X0E2WFhfUkJCTV9DTE9DS19DTlRMMl9TUDMsIDB4MDIwMjIyMjB9LAorCXtSRUdfQTZYWF9SQkJN X0NMT0NLX0RFTEFZX1NQMCwgMHgwMDAwMDA4MH0sCisJe1JFR19BNlhYX1JCQk1fQ0xPQ0tfREVM QVlfU1AxLCAweDAwMDAwMDgwfSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9DS19ERUxBWV9TUDIsIDB4 MDAwMDAwODB9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0RFTEFZX1NQMywgMHgwMDAwMDA4MH0s CisJe1JFR19BNlhYX1JCQk1fQ0xPQ0tfSFlTVF9TUDAsIDB4MDAwMGYzY2Z9LAorCXtSRUdfQTZY WF9SQkJNX0NMT0NLX0hZU1RfU1AxLCAweDAwMDBmM2NmfSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9D S19IWVNUX1NQMiwgMHgwMDAwZjNjZn0sCisJe1JFR19BNlhYX1JCQk1fQ0xPQ0tfSFlTVF9TUDMs IDB4MDAwMGYzY2Z9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0NOVExfVFAwLCAweDAyMjIyMjIy fSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9DS19DTlRMX1RQMSwgMHgwMjIyMjIyMn0sCisJe1JFR19B NlhYX1JCQk1fQ0xPQ0tfQ05UTF9UUDIsIDB4MDIyMjIyMjJ9LAorCXtSRUdfQTZYWF9SQkJNX0NM T0NLX0NOVExfVFAzLCAweDAyMjIyMjIyfSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9DS19DTlRMMl9U UDAsIDB4MjIyMjIyMjJ9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0NOVEwyX1RQMSwgMHgyMjIy MjIyMn0sCisJe1JFR19BNlhYX1JCQk1fQ0xPQ0tfQ05UTDJfVFAyLCAweDIyMjIyMjIyfSwKKwl7 UkVHX0E2WFhfUkJCTV9DTE9DS19DTlRMMl9UUDMsIDB4MjIyMjIyMjJ9LAorCXtSRUdfQTZYWF9S QkJNX0NMT0NLX0NOVEwzX1RQMCwgMHgyMjIyMjIyMn0sCisJe1JFR19BNlhYX1JCQk1fQ0xPQ0tf Q05UTDNfVFAxLCAweDIyMjIyMjIyfSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9DS19DTlRMM19UUDIs IDB4MjIyMjIyMjJ9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0NOVEwzX1RQMywgMHgyMjIyMjIy Mn0sCisJe1JFR19BNlhYX1JCQk1fQ0xPQ0tfQ05UTDRfVFAwLCAweDAwMDIyMjIyfSwKKwl7UkVH X0E2WFhfUkJCTV9DTE9DS19DTlRMNF9UUDEsIDB4MDAwMjIyMjJ9LAorCXtSRUdfQTZYWF9SQkJN X0NMT0NLX0NOVEw0X1RQMiwgMHgwMDAyMjIyMn0sCisJe1JFR19BNlhYX1JCQk1fQ0xPQ0tfQ05U TDRfVFAzLCAweDAwMDIyMjIyfSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9DS19IWVNUX1RQMCwgMHg3 Nzc3Nzc3N30sCisJe1JFR19BNlhYX1JCQk1fQ0xPQ0tfSFlTVF9UUDEsIDB4Nzc3Nzc3Nzd9LAor CXtSRUdfQTZYWF9SQkJNX0NMT0NLX0hZU1RfVFAyLCAweDc3Nzc3Nzc3fSwKKwl7UkVHX0E2WFhf UkJCTV9DTE9DS19IWVNUX1RQMywgMHg3Nzc3Nzc3N30sCisJe1JFR19BNlhYX1JCQk1fQ0xPQ0tf SFlTVDJfVFAwLCAweDc3Nzc3Nzc3fSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9DS19IWVNUMl9UUDEs IDB4Nzc3Nzc3Nzd9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0hZU1QyX1RQMiwgMHg3Nzc3Nzc3 N30sCisJe1JFR19BNlhYX1JCQk1fQ0xPQ0tfSFlTVDJfVFAzLCAweDc3Nzc3Nzc3fSwKKwl7UkVH X0E2WFhfUkJCTV9DTE9DS19IWVNUM19UUDAsIDB4Nzc3Nzc3Nzd9LAorCXtSRUdfQTZYWF9SQkJN X0NMT0NLX0hZU1QzX1RQMSwgMHg3Nzc3Nzc3N30sCisJe1JFR19BNlhYX1JCQk1fQ0xPQ0tfSFlT VDNfVFAyLCAweDc3Nzc3Nzc3fSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9DS19IWVNUM19UUDMsIDB4 Nzc3Nzc3Nzd9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0hZU1Q0X1RQMCwgMHgwMDA3Nzc3N30s CisJe1JFR19BNlhYX1JCQk1fQ0xPQ0tfSFlTVDRfVFAxLCAweDAwMDc3Nzc3fSwKKwl7UkVHX0E2 WFhfUkJCTV9DTE9DS19IWVNUNF9UUDIsIDB4MDAwNzc3Nzd9LAorCXtSRUdfQTZYWF9SQkJNX0NM T0NLX0hZU1Q0X1RQMywgMHgwMDA3Nzc3N30sCisJe1JFR19BNlhYX1JCQk1fQ0xPQ0tfREVMQVlf VFAwLCAweDExMTExMTExfSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9DS19ERUxBWV9UUDEsIDB4MTEx MTExMTF9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0RFTEFZX1RQMiwgMHgxMTExMTExMX0sCisJ e1JFR19BNlhYX1JCQk1fQ0xPQ0tfREVMQVlfVFAzLCAweDExMTExMTExfSwKKwl7UkVHX0E2WFhf UkJCTV9DTE9DS19ERUxBWTJfVFAwLCAweDExMTExMTExfSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9D S19ERUxBWTJfVFAxLCAweDExMTExMTExfSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9DS19ERUxBWTJf VFAyLCAweDExMTExMTExfSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9DS19ERUxBWTJfVFAzLCAweDEx MTExMTExfSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9DS19ERUxBWTNfVFAwLCAweDExMTExMTExfSwK Kwl7UkVHX0E2WFhfUkJCTV9DTE9DS19ERUxBWTNfVFAxLCAweDExMTExMTExfSwKKwl7UkVHX0E2 WFhfUkJCTV9DTE9DS19ERUxBWTNfVFAyLCAweDExMTExMTExfSwKKwl7UkVHX0E2WFhfUkJCTV9D TE9DS19ERUxBWTNfVFAzLCAweDExMTExMTExfSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9DS19ERUxB WTRfVFAwLCAweDAwMDExMTExfSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9DS19ERUxBWTRfVFAxLCAw eDAwMDExMTExfSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9DS19ERUxBWTRfVFAyLCAweDAwMDExMTEx fSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9DS19ERUxBWTRfVFAzLCAweDAwMDExMTExfSwKKwl7UkVH X0E2WFhfUkJCTV9DTE9DS19DTlRMX1VDSEUsIDB4MjIyMjIyMjJ9LAorCXtSRUdfQTZYWF9SQkJN X0NMT0NLX0NOVEwyX1VDSEUsIDB4MjIyMjIyMjJ9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0NO VEwzX1VDSEUsIDB4MjIyMjIyMjJ9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0NOVEw0X1VDSEUs IDB4MDAyMjIyMjJ9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0hZU1RfVUNIRSwgMHgwMDAwMDAw NH0sCisJe1JFR19BNlhYX1JCQk1fQ0xPQ0tfREVMQVlfVUNIRSwgMHgwMDAwMDAwMn0sCisJe1JF R19BNlhYX1JCQk1fQ0xPQ0tfQ05UTF9SQjAsIDB4MjIyMjIyMjJ9LAorCXtSRUdfQTZYWF9SQkJN X0NMT0NLX0NOVExfUkIxLCAweDIyMjIyMjIyfSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9DS19DTlRM X1JCMiwgMHgyMjIyMjIyMn0sCisJe1JFR19BNlhYX1JCQk1fQ0xPQ0tfQ05UTF9SQjMsIDB4MjIy MjIyMjJ9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0NOVEwyX1JCMCwgMHgwMDAwMjIyMn0sCisJ e1JFR19BNlhYX1JCQk1fQ0xPQ0tfQ05UTDJfUkIxLCAweDAwMDAyMjIyfSwKKwl7UkVHX0E2WFhf UkJCTV9DTE9DS19DTlRMMl9SQjIsIDB4MDAwMDIyMjJ9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NL X0NOVEwyX1JCMywgMHgwMDAwMjIyMn0sCisJe1JFR19BNlhYX1JCQk1fQ0xPQ0tfQ05UTF9DQ1Uw LCAweDAwMDAyMjIwfSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9DS19DTlRMX0NDVTEsIDB4MDAwMDIy MjB9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0NOVExfQ0NVMiwgMHgwMDAwMjIyMH0sCisJe1JF R19BNlhYX1JCQk1fQ0xPQ0tfQ05UTF9DQ1UzLCAweDAwMDAyMjIwfSwKKwl7UkVHX0E2WFhfUkJC TV9DTE9DS19IWVNUX1JCX0NDVTAsIDB4MDAwNDBmMDB9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NL X0hZU1RfUkJfQ0NVMSwgMHgwMDA0MGYwMH0sCisJe1JFR19BNlhYX1JCQk1fQ0xPQ0tfSFlTVF9S Ql9DQ1UyLCAweDAwMDQwZjAwfSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9DS19IWVNUX1JCX0NDVTMs IDB4MDAwNDBmMDB9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0NOVExfUkFDLCAweDA1MDIyMDIy fSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9DS19DTlRMMl9SQUMsIDB4MDAwMDU1NTV9LAorCXtSRUdf QTZYWF9SQkJNX0NMT0NLX0RFTEFZX1JBQywgMHgwMDAwMDAxMX0sCisJe1JFR19BNlhYX1JCQk1f Q0xPQ0tfSFlTVF9SQUMsIDB4MDA0NDUwNDR9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0NOVExf VFNFX1JBU19SQkJNLCAweDA0MjIyMjIyfSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9DS19NT0RFX0dQ QywgMHgwMDIyMjIyMn0sCisJe1JFR19BNlhYX1JCQk1fQ0xPQ0tfTU9ERV9WRkQsIDB4MDAwMDIy MjJ9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0hZU1RfVFNFX1JBU19SQkJNLCAweDAwMDAwMDAw fSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9DS19IWVNUX0dQQywgMHgwNDEwNDAwNH0sCisJe1JFR19B NlhYX1JCQk1fQ0xPQ0tfSFlTVF9WRkQsIDB4MDAwMDAwMDB9LAorCXtSRUdfQTZYWF9SQkJNX0NM T0NLX0RFTEFZX0hMU1EsIDB4MDAwMDAwMDB9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0RFTEFZ X1RTRV9SQVNfUkJCTSwgMHgwMDAwNDAwMH0sCisJe1JFR19BNlhYX1JCQk1fQ0xPQ0tfREVMQVlf R1BDLCAweDAwMDAwMjAwfSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9DS19ERUxBWV9WRkQsIDB4MDAw MDIyMjJ9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0RFTEFZX0hMU1FfMiwgMHgwMDAwMDAwMn0s CisJe1JFR19BNlhYX1JCQk1fQ0xPQ0tfTU9ERV9ITFNRLCAweDAwMDAyMjIyfSwKKwl7UkVHX0E2 WFhfUkJCTV9DTE9DS19DTlRMX0dNVV9HWCwgMHgwMDAwMDIyMn0sCisJe1JFR19BNlhYX1JCQk1f Q0xPQ0tfREVMQVlfR01VX0dYLCAweDAwMDAwMTExfSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9DS19I WVNUX0dNVV9HWCwgMHgwMDAwMDU1NX0KK307CisKK3N0YXRpYyB2b2lkIGE2eHhfc2V0X2h3Y2co c3RydWN0IG1zbV9ncHUgKmdwdSwgYm9vbCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgYWRyZW5vX2dwdSAq YWRyZW5vX2dwdSA9IHRvX2FkcmVub19ncHUoZ3B1KTsKKwlzdHJ1Y3QgYTZ4eF9ncHUgKmE2eHhf Z3B1ID0gdG9fYTZ4eF9ncHUoYWRyZW5vX2dwdSk7CisJc3RydWN0IGE2eHhfZ211ICpnbXUgPSAm YTZ4eF9ncHUtPmdtdTsKKwl1bnNpZ25lZCBpbnQgaTsKKwl1MzIgdmFsOworCisJdmFsID0gZ3B1 X3JlYWQoZ3B1LCBSRUdfQTZYWF9SQkJNX0NMT0NLX0NOVEwpOworCisJLyogRG9uJ3QgcmUtcHJv Z3JhbSB0aGUgcmVnaXN0ZXJzIGlmIHRoZXkgYXJlIGFscmVhZHkgY29ycmVjdCAqLworCWlmICgo IXN0YXRlICYmICF2YWwpIHx8IChzdGF0ZSAmJiAodmFsID09IDB4OGFhOGFhMDIpKSkKKwkJcmV0 dXJuOworCisJLyogRGlzYWJsZSBTUCBjbG9jayBiZWZvcmUgcHJvZ3JhbW1pbmcgSFdDRyByZWdp c3RlcnMgKi8KKwlnbXVfcm13KGdtdSwgUkVHX0E2WFhfR1BVX0dNVV9HWF9TUFRQUkFDX0NMT0NL X0NPTlRST0wsIDEsIDApOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYTZ4eF9od2Nn KTsgaSsrKQorCQlncHVfd3JpdGUoZ3B1LCBhNnh4X2h3Y2dbaV0ub2Zmc2V0LAorCQkJc3RhdGUg PyBhNnh4X2h3Y2dbaV0udmFsdWUgOiAwKTsKKworCS8qIEVuYWJsZSBTUCBjbG9jayAqLworCWdt dV9ybXcoZ211LCBSRUdfQTZYWF9HUFVfR01VX0dYX1NQVFBSQUNfQ0xPQ0tfQ09OVFJPTCwgMCwg MSk7CisKKwlncHVfd3JpdGUoZ3B1LCBSRUdfQTZYWF9SQkJNX0NMT0NLX0NOVEwsIHN0YXRlID8g MHg4YWE4YWEwMiA6IDApOworfQorCitzdGF0aWMgaW50IGE2eHhfY3BfaW5pdChzdHJ1Y3QgbXNt X2dwdSAqZ3B1KQoreworCXN0cnVjdCBtc21fcmluZ2J1ZmZlciAqcmluZyA9IGdwdS0+cmJbMF07 CisKKwlPVVRfUEtUNyhyaW5nLCBDUF9NRV9JTklULCA4KTsKKworCU9VVF9SSU5HKHJpbmcsIDB4 MDAwMDAwMmYpOworCisJLyogRW5hYmxlIG11bHRpcGxlIGhhcmR3YXJlIGNvbnRleHRzICovCisJ T1VUX1JJTkcocmluZywgMHgwMDAwMDAwMyk7CisKKwkvKiBFbmFibGUgZXJyb3IgZGV0ZWN0aW9u ICovCisJT1VUX1JJTkcocmluZywgMHgyMDAwMDAwMCk7CisKKwkvKiBEb24ndCBlbmFibGUgaGVh ZGVyIGR1bXAgKi8KKwlPVVRfUklORyhyaW5nLCAweDAwMDAwMDAwKTsKKwlPVVRfUklORyhyaW5n LCAweDAwMDAwMDAwKTsKKworCS8qIE5vIHdvcmthcm91bmRzIGVuYWJsZWQgKi8KKwlPVVRfUklO RyhyaW5nLCAweDAwMDAwMDAwKTsKKworCS8qIFBhZCByZXN0IG9mIHRoZSBjbWRzIHdpdGggMCdz ICovCisJT1VUX1JJTkcocmluZywgMHgwMDAwMDAwMCk7CisJT1VUX1JJTkcocmluZywgMHgwMDAw MDAwMCk7CisKKwlhNnh4X2ZsdXNoKGdwdSwgcmluZyk7CisJcmV0dXJuIGE2eHhfaWRsZShncHUs IHJpbmcpID8gMCA6IC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgYTZ4eF91Y29kZV9pbml0KHN0 cnVjdCBtc21fZ3B1ICpncHUpCit7CisJc3RydWN0IGFkcmVub19ncHUgKmFkcmVub19ncHUgPSB0 b19hZHJlbm9fZ3B1KGdwdSk7CisJc3RydWN0IGE2eHhfZ3B1ICphNnh4X2dwdSA9IHRvX2E2eHhf Z3B1KGFkcmVub19ncHUpOworCisJaWYgKCFhNnh4X2dwdS0+c3FlX2JvKSB7CisJCWE2eHhfZ3B1 LT5zcWVfYm8gPSBhZHJlbm9fZndfY3JlYXRlX2JvKGdwdSwKKwkJCWFkcmVub19ncHUtPmZ3W0FE UkVOT19GV19TUUVdLCAmYTZ4eF9ncHUtPnNxZV9pb3ZhKTsKKworCQlpZiAoSVNfRVJSKGE2eHhf Z3B1LT5zcWVfYm8pKSB7CisJCQlpbnQgcmV0ID0gUFRSX0VSUihhNnh4X2dwdS0+c3FlX2JvKTsK KworCQkJYTZ4eF9ncHUtPnNxZV9ibyA9IE5VTEw7CisJCQlEUk1fREVWX0VSUk9SKCZncHUtPnBk ZXYtPmRldiwKKwkJCQkiQ291bGQgbm90IGFsbG9jYXRlIFNRRSB1Y29kZTogJWRcbiIsIHJldCk7 CisKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwlncHVfd3JpdGU2NChncHUsIFJFR19BNlhY X0NQX1NRRV9JTlNUUl9CQVNFX0xPLAorCQlSRUdfQTZYWF9DUF9TUUVfSU5TVFJfQkFTRV9ISSwg YTZ4eF9ncHUtPnNxZV9pb3ZhKTsKKworCXJldHVybiAwOworfQorCisjZGVmaW5lIEE2WFhfSU5U X01BU0sgKEE2WFhfUkJCTV9JTlRfMF9NQVNLX0NQX0FIQl9FUlJPUiB8IFwKKwkgIEE2WFhfUkJC TV9JTlRfMF9NQVNLX1JCQk1fQVRCX0FTWU5DRklGT19PVkVSRkxPVyB8IFwKKwkgIEE2WFhfUkJC TV9JTlRfMF9NQVNLX0NQX0hXX0VSUk9SIHwgXAorCSAgQTZYWF9SQkJNX0lOVF8wX01BU0tfQ1Bf SUIyIHwgXAorCSAgQTZYWF9SQkJNX0lOVF8wX01BU0tfQ1BfSUIxIHwgXAorCSAgQTZYWF9SQkJN X0lOVF8wX01BU0tfQ1BfUkIgfCBcCisJICBBNlhYX1JCQk1fSU5UXzBfTUFTS19DUF9DQUNIRV9G TFVTSF9UUyB8IFwKKwkgIEE2WFhfUkJCTV9JTlRfMF9NQVNLX1JCQk1fQVRCX0JVU19PVkVSRkxP VyB8IFwKKwkgIEE2WFhfUkJCTV9JTlRfMF9NQVNLX1JCQk1fSEFOR19ERVRFQ1QgfCBcCisJICBB NlhYX1JCQk1fSU5UXzBfTUFTS19VQ0hFX09PQl9BQ0NFU1MgfCBcCisJICBBNlhYX1JCQk1fSU5U XzBfTUFTS19VQ0hFX1RSQVBfSU5UUikKKworc3RhdGljIGludCBhNnh4X2h3X2luaXQoc3RydWN0 IG1zbV9ncHUgKmdwdSkKK3sKKwlzdHJ1Y3QgYWRyZW5vX2dwdSAqYWRyZW5vX2dwdSA9IHRvX2Fk cmVub19ncHUoZ3B1KTsKKwlzdHJ1Y3QgYTZ4eF9ncHUgKmE2eHhfZ3B1ID0gdG9fYTZ4eF9ncHUo YWRyZW5vX2dwdSk7CisJaW50IHJldDsKKworCS8qIE1ha2Ugc3VyZSB0aGUgR01VIGtlZXBzIHRo ZSBHUFUgb24gd2hpbGUgd2Ugc2V0IGl0IHVwICovCisJYTZ4eF9nbXVfc2V0X29vYigmYTZ4eF9n cHUtPmdtdSwgR01VX09PQl9HUFVfU0VUKTsKKworCWdwdV93cml0ZShncHUsIFJFR19BNlhYX1JC Qk1fU0VDVklEX1RTQl9DTlRMLCAwKTsKKworCS8qCisJICogRGlzYWJsZSB0aGUgdHJ1c3RlZCBt ZW1vcnkgcmFuZ2UgLSB3ZSBkb24ndCBhY3R1YWxseSBzdXBwb3J0ZWQgc2VjdXJlCisJICogbWVt b3J5IHJlbmRlcmluZyBhdCB0aGlzIHBvaW50IGluIHRpbWUgYW5kIHdlIGRvbid0IHdhbnQgdG8g YmxvY2sgb2ZmCisJICogcGFydCBvZiB0aGUgdmlydHVhbCBtZW1vcnkgc3BhY2UuCisJICovCisJ Z3B1X3dyaXRlNjQoZ3B1LCBSRUdfQTZYWF9SQkJNX1NFQ1ZJRF9UU0JfVFJVU1RFRF9CQVNFX0xP LAorCQlSRUdfQTZYWF9SQkJNX1NFQ1ZJRF9UU0JfVFJVU1RFRF9CQVNFX0hJLCAweDAwMDAwMDAw KTsKKwlncHVfd3JpdGUoZ3B1LCBSRUdfQTZYWF9SQkJNX1NFQ1ZJRF9UU0JfVFJVU1RFRF9TSVpF LCAweDAwMDAwMDAwKTsKKworCS8qIGVuYWJsZSBoYXJkd2FyZSBjbG9ja2dhdGluZyAqLworCWE2 eHhfc2V0X2h3Y2coZ3B1LCB0cnVlKTsKKworCS8qIFZCSUYgc3RhcnQgKi8KKwlncHVfd3JpdGUo Z3B1LCBSRUdfQTZYWF9WQklGX0dBVEVfT0ZGX1dSUkVRX0VOLCAweDAwMDAwMDA5KTsKKwlncHVf d3JpdGUoZ3B1LCBSRUdfQTZYWF9SQkJNX1ZCSUZfQ0xJRU5UX1FPU19DTlRMLCAweDMpOworCisJ LyogTWFrZSBhbGwgYmxvY2tzIGNvbnRyaWJ1dGUgdG8gdGhlIEdQVSBCVVNZIHBlcmYgY291bnRl ciAqLworCWdwdV93cml0ZShncHUsIFJFR19BNlhYX1JCQk1fUEVSRkNUUl9HUFVfQlVTWV9NQVNL RUQsIDB4ZmZmZmZmZmYpOworCisJLyogRGlzYWJsZSBMMiBieXBhc3MgaW4gdGhlIFVDSEUgKi8K KwlncHVfd3JpdGUoZ3B1LCBSRUdfQTZYWF9VQ0hFX1dSSVRFX1JBTkdFX01BWF9MTywgMHhmZmZm ZmZjMCk7CisJZ3B1X3dyaXRlKGdwdSwgUkVHX0E2WFhfVUNIRV9XUklURV9SQU5HRV9NQVhfSEks IDB4MDAwMWZmZmYpOworCWdwdV93cml0ZShncHUsIFJFR19BNlhYX1VDSEVfVFJBUF9CQVNFX0xP LCAweGZmZmZmMDAwKTsKKwlncHVfd3JpdGUoZ3B1LCBSRUdfQTZYWF9VQ0hFX1RSQVBfQkFTRV9I SSwgMHgwMDAxZmZmZik7CisJZ3B1X3dyaXRlKGdwdSwgUkVHX0E2WFhfVUNIRV9XUklURV9USFJV X0JBU0VfTE8sIDB4ZmZmZmYwMDApOworCWdwdV93cml0ZShncHUsIFJFR19BNlhYX1VDSEVfV1JJ VEVfVEhSVV9CQVNFX0hJLCAweDAwMDFmZmZmKTsKKworCS8qIFNldCB0aGUgR01FTSBWQSByYW5n ZSBbMHgxMDAwMDA6MHgxMDAwMDAgKyBncHUtPmdtZW0gLSAxXSAqLworCWdwdV93cml0ZTY0KGdw dSwgUkVHX0E2WFhfVUNIRV9HTUVNX1JBTkdFX01JTl9MTywKKwkJUkVHX0E2WFhfVUNIRV9HTUVN X1JBTkdFX01JTl9ISSwgMHgwMDEwMDAwMCk7CisKKwlncHVfd3JpdGU2NChncHUsIFJFR19BNlhY X1VDSEVfR01FTV9SQU5HRV9NQVhfTE8sCisJCVJFR19BNlhYX1VDSEVfR01FTV9SQU5HRV9NQVhf SEksCisJCTB4MDAxMDAwMDAgKyBhZHJlbm9fZ3B1LT5nbWVtIC0gMSk7CisKKwlncHVfd3JpdGUo Z3B1LCBSRUdfQTZYWF9VQ0hFX0ZJTFRFUl9DTlRMLCAweDgwNCk7CisJZ3B1X3dyaXRlKGdwdSwg UkVHX0E2WFhfVUNIRV9DQUNIRV9XQVlTLCAweDQpOworCisJZ3B1X3dyaXRlKGdwdSwgUkVHX0E2 WFhfQ1BfUk9RX1RIUkVTSE9MRFNfMiwgMHgwMTAwMDBjMCk7CisJZ3B1X3dyaXRlKGdwdSwgUkVH X0E2WFhfQ1BfUk9RX1RIUkVTSE9MRFNfMSwgMHg4MDQwMzYyYyk7CisKKwkvKiBTZXR0aW5nIHRo ZSBtZW0gcG9vbCBzaXplICovCisJZ3B1X3dyaXRlKGdwdSwgUkVHX0E2WFhfQ1BfTUVNX1BPT0xf U0laRSwgMTI4KTsKKworCS8qIFNldHRpbmcgdGhlIHByaW1GaWZvIHRocmVzaG9sZHMgZGVmYXVs dCB2YWx1ZXMgKi8KKwlncHVfd3JpdGUoZ3B1LCBSRUdfQTZYWF9QQ19EQkdfRUNPX0NOVEwsICgw eDMwMCA8PCAxMSkpOworCisJLyogU2V0IHRoZSBBSEIgZGVmYXVsdCBzbGF2ZSByZXNwb25zZSB0 byAiRVJST1IiICovCisJZ3B1X3dyaXRlKGdwdSwgUkVHX0E2WFhfQ1BfQUhCX0NOVEwsIDB4MSk7 CisKKwkvKiBUdXJuIG9uIHBlcmZvcm1hbmNlIGNvdW50ZXJzICovCisJZ3B1X3dyaXRlKGdwdSwg UkVHX0E2WFhfUkJCTV9QRVJGQ1RSX0NOVEwsIDB4MSk7CisKKwkvKiBTZWxlY3QgQ1AwIHRvIGFs d2F5cyBjb3VudCBjeWNsZXMgKi8KKwlncHVfd3JpdGUoZ3B1LCBSRUdfQTZYWF9DUF9QRVJGQ1RS X0NQX1NFTF8wLCBQRVJGX0NQX0FMV0FZU19DT1VOVCk7CisKKwkvKiBGSVhNRTogbm90IHN1cmUg aWYgdGhpcyBzaG91bGQgbGl2ZSBoZXJlIG9yIGluIGE2eHhfZ211LmMgKi8KKwlnbXVfd3JpdGUo JmE2eHhfZ3B1LT5nbXUsICBSRUdfQTZYWF9HUFVfR01VX0FPX0dQVV9DWF9CVVNZX01BU0ssCisJ CTB4ZmYwMDAwMDApOworCWdtdV9ybXcoJmE2eHhfZ3B1LT5nbXUsIFJFR19BNlhYX0dNVV9DWF9H TVVfUE9XRVJfQ09VTlRFUl9TRUxFQ1RfMCwKKwkJMHhmZiwgMHgyMCk7CisJZ211X3dyaXRlKCZh Nnh4X2dwdS0+Z211LCBSRUdfQTZYWF9HTVVfQ1hfR01VX1BPV0VSX0NPVU5URVJfRU5BQkxFLAor CQkweDAxKTsKKworCWdwdV93cml0ZShncHUsIFJFR19BNlhYX1JCX05DX01PREVfQ05UTCwgMiA8 PCAxKTsKKwlncHVfd3JpdGUoZ3B1LCBSRUdfQTZYWF9UUEwxX05DX01PREVfQ05UTCwgMiA8PCAx KTsKKwlncHVfd3JpdGUoZ3B1LCBSRUdfQTZYWF9TUF9OQ19NT0RFX0NOVEwsIDIgPDwgMSk7CisJ Z3B1X3dyaXRlKGdwdSwgUkVHX0E2WFhfVUNIRV9NT0RFX0NOVEwsIDIgPDwgMjEpOworCisJLyog RW5hYmxlIGZhdWx0IGRldGVjdGlvbiAqLworCWdwdV93cml0ZShncHUsIFJFR19BNlhYX1JCQk1f SU5URVJGQUNFX0hBTkdfSU5UX0NOVEwsCisJCSgxIDw8IDMwKSB8IDB4MWZmZmZmKTsKKworCWdw dV93cml0ZShncHUsIFJFR19BNlhYX1VDSEVfQ0xJRU5UX1BGLCAxKTsKKworCS8qIFByb3RlY3Qg cmVnaXN0ZXJzIGZyb20gdGhlIENQICovCisJZ3B1X3dyaXRlKGdwdSwgUkVHX0E2WFhfQ1BfUFJP VEVDVF9DTlRMLCAweDAwMDAwMDAzKTsKKworCWdwdV93cml0ZShncHUsIFJFR19BNlhYX0NQX1BS T1RFQ1QoMCksCisJCUE2WFhfUFJPVEVDVF9SRE9OTFkoMHg2MDAsIDB4NTEpKTsKKwlncHVfd3Jp dGUoZ3B1LCBSRUdfQTZYWF9DUF9QUk9URUNUKDEpLCBBNlhYX1BST1RFQ1RfUlcoMHhhZTUwLCAw eDIpKTsKKwlncHVfd3JpdGUoZ3B1LCBSRUdfQTZYWF9DUF9QUk9URUNUKDIpLCBBNlhYX1BST1RF Q1RfUlcoMHg5NjI0LCAweDEzKSk7CisJZ3B1X3dyaXRlKGdwdSwgUkVHX0E2WFhfQ1BfUFJPVEVD VCgzKSwgQTZYWF9QUk9URUNUX1JXKDB4ODYzMCwgMHg4KSk7CisJZ3B1X3dyaXRlKGdwdSwgUkVH X0E2WFhfQ1BfUFJPVEVDVCg0KSwgQTZYWF9QUk9URUNUX1JXKDB4OWU3MCwgMHgxKSk7CisJZ3B1 X3dyaXRlKGdwdSwgUkVHX0E2WFhfQ1BfUFJPVEVDVCg1KSwgQTZYWF9QUk9URUNUX1JXKDB4OWU3 OCwgMHgxODcpKTsKKwlncHVfd3JpdGUoZ3B1LCBSRUdfQTZYWF9DUF9QUk9URUNUKDYpLCBBNlhY X1BST1RFQ1RfUlcoMHhmMDAwLCAweDgxMCkpOworCWdwdV93cml0ZShncHUsIFJFR19BNlhYX0NQ X1BST1RFQ1QoNyksCisJCUE2WFhfUFJPVEVDVF9SRE9OTFkoMHhmYzAwLCAweDMpKTsKKwlncHVf d3JpdGUoZ3B1LCBSRUdfQTZYWF9DUF9QUk9URUNUKDgpLCBBNlhYX1BST1RFQ1RfUlcoMHg1MGUs IDB4MCkpOworCWdwdV93cml0ZShncHUsIFJFR19BNlhYX0NQX1BST1RFQ1QoOSksIEE2WFhfUFJP VEVDVF9SRE9OTFkoMHg1MGYsIDB4MCkpOworCWdwdV93cml0ZShncHUsIFJFR19BNlhYX0NQX1BS T1RFQ1QoMTApLCBBNlhYX1BST1RFQ1RfUlcoMHg1MTAsIDB4MCkpOworCWdwdV93cml0ZShncHUs IFJFR19BNlhYX0NQX1BST1RFQ1QoMTEpLAorCQlBNlhYX1BST1RFQ1RfUkRPTkxZKDB4MCwgMHg0 ZjkpKTsKKwlncHVfd3JpdGUoZ3B1LCBSRUdfQTZYWF9DUF9QUk9URUNUKDEyKSwKKwkJQTZYWF9Q Uk9URUNUX1JET05MWSgweDUwMSwgMHhhKSk7CisJZ3B1X3dyaXRlKGdwdSwgUkVHX0E2WFhfQ1Bf UFJPVEVDVCgxMyksCisJCUE2WFhfUFJPVEVDVF9SRE9OTFkoMHg1MTEsIDB4NDQpKTsKKwlncHVf d3JpdGUoZ3B1LCBSRUdfQTZYWF9DUF9QUk9URUNUKDE0KSwgQTZYWF9QUk9URUNUX1JXKDB4ZTAw LCAweGUpKTsKKwlncHVfd3JpdGUoZ3B1LCBSRUdfQTZYWF9DUF9QUk9URUNUKDE1KSwgQTZYWF9Q Uk9URUNUX1JXKDB4OGUwMCwgMHgwKSk7CisJZ3B1X3dyaXRlKGdwdSwgUkVHX0E2WFhfQ1BfUFJP VEVDVCgxNiksIEE2WFhfUFJPVEVDVF9SVygweDhlNTAsIDB4ZikpOworCWdwdV93cml0ZShncHUs IFJFR19BNlhYX0NQX1BST1RFQ1QoMTcpLCBBNlhYX1BST1RFQ1RfUlcoMHhiZTAyLCAweDApKTsK KwlncHVfd3JpdGUoZ3B1LCBSRUdfQTZYWF9DUF9QUk9URUNUKDE4KSwKKwkJQTZYWF9QUk9URUNU X1JXKDB4YmUyMCwgMHgxMWYzKSk7CisJZ3B1X3dyaXRlKGdwdSwgUkVHX0E2WFhfQ1BfUFJPVEVD VCgxOSksIEE2WFhfUFJPVEVDVF9SVygweDgwMCwgMHg4MikpOworCWdwdV93cml0ZShncHUsIFJF R19BNlhYX0NQX1BST1RFQ1QoMjApLCBBNlhYX1BST1RFQ1RfUlcoMHg4YTAsIDB4OCkpOworCWdw dV93cml0ZShncHUsIFJFR19BNlhYX0NQX1BST1RFQ1QoMjEpLCBBNlhYX1BST1RFQ1RfUlcoMHg4 YWIsIDB4MTkpKTsKKwlncHVfd3JpdGUoZ3B1LCBSRUdfQTZYWF9DUF9QUk9URUNUKDIyKSwgQTZY WF9QUk9URUNUX1JXKDB4OTAwLCAweDRkKSk7CisJZ3B1X3dyaXRlKGdwdSwgUkVHX0E2WFhfQ1Bf UFJPVEVDVCgyMyksIEE2WFhfUFJPVEVDVF9SVygweDk4ZCwgMHg3NikpOworCWdwdV93cml0ZShn cHUsIFJFR19BNlhYX0NQX1BST1RFQ1QoMjQpLAorCQkJQTZYWF9QUk9URUNUX1JET05MWSgweDhk MCwgMHgyMykpOworCWdwdV93cml0ZShncHUsIFJFR19BNlhYX0NQX1BST1RFQ1QoMjUpLAorCQkJ QTZYWF9QUk9URUNUX1JET05MWSgweDk4MCwgMHg0KSk7CisJZ3B1X3dyaXRlKGdwdSwgUkVHX0E2 WFhfQ1BfUFJPVEVDVCgyNiksIEE2WFhfUFJPVEVDVF9SVygweGE2MzAsIDB4MCkpOworCisJLyog RW5hYmxlIGludGVycnVwdHMgKi8KKwlncHVfd3JpdGUoZ3B1LCBSRUdfQTZYWF9SQkJNX0lOVF8w X01BU0ssIEE2WFhfSU5UX01BU0spOworCisJcmV0ID0gYWRyZW5vX2h3X2luaXQoZ3B1KTsKKwlp ZiAocmV0KQorCQlnb3RvIG91dDsKKworCXJldCA9IGE2eHhfdWNvZGVfaW5pdChncHUpOworCWlm IChyZXQpCisJCWdvdG8gb3V0OworCisJLyogQWx3YXlzIGNvbWUgdXAgb24gcmIgMCAqLworCWE2 eHhfZ3B1LT5jdXJfcmluZyA9IGdwdS0+cmJbMF07CisKKwkvKiBFbmFibGUgdGhlIFNRRV90byBz dGFydCB0aGUgQ1AgZW5naW5lICovCisJZ3B1X3dyaXRlKGdwdSwgUkVHX0E2WFhfQ1BfU1FFX0NO VEwsIDEpOworCisJcmV0ID0gYTZ4eF9jcF9pbml0KGdwdSk7CisJaWYgKHJldCkKKwkJZ290byBv dXQ7CisKKwlncHVfd3JpdGUoZ3B1LCBSRUdfQTZYWF9SQkJNX1NFQ1ZJRF9UUlVTVF9DTlRMLCAw eDApOworCitvdXQ6CisJLyoKKwkgKiBUZWxsIHRoZSBHTVUgdGhhdCB3ZSBhcmUgZG9uZSB0b3Vj aGluZyB0aGUgR1BVIGFuZCBpdCBjYW4gc3RhcnQgcG93ZXIKKwkgKiBtYW5hZ2VtZW50CisJICov CisJYTZ4eF9nbXVfY2xlYXJfb29iKCZhNnh4X2dwdS0+Z211LCBHTVVfT09CX0dQVV9TRVQpOwor CisJLyogVGFrZSB0aGUgR01VIG91dCBvZiBpdHMgc3BlY2lhbCBib290IG1vZGUgKi8KKwlhNnh4 X2dtdV9jbGVhcl9vb2IoJmE2eHhfZ3B1LT5nbXUsIEdNVV9PT0JfQk9PVF9TTFVNQkVSKTsKKwor CXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGE2eHhfZHVtcChzdHJ1Y3QgbXNtX2dwdSAq Z3B1KQoreworCWRldl9pbmZvKCZncHUtPnBkZXYtPmRldiwgInN0YXR1czogICAlMDh4XG4iLAor CQkJZ3B1X3JlYWQoZ3B1LCBSRUdfQTZYWF9SQkJNX1NUQVRVUykpOworCWFkcmVub19kdW1wKGdw dSk7Cit9CisKKyNkZWZpbmUgVkJJRl9SRVNFVF9BQ0tfVElNRU9VVAkxMDAKKyNkZWZpbmUgVkJJ Rl9SRVNFVF9BQ0tfTUFTSwkweDAwZjAKKworc3RhdGljIHZvaWQgYTZ4eF9yZWNvdmVyKHN0cnVj dCBtc21fZ3B1ICpncHUpCit7CisJaW50IGk7CisKKwlhZHJlbm9fZHVtcF9pbmZvKGdwdSk7CisK Kwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCQlkZXZfaW5mbygmZ3B1LT5wZGV2LT5kZXYsICJD UF9TQ1JBVENIX1JFRyVkOiAldVxuIiwgaSwKKwkJCWdwdV9yZWFkKGdwdSwgUkVHX0E2WFhfQ1Bf U0NSQVRDSF9SRUcoaSkpKTsKKworCWlmIChoYW5nX2RlYnVnKQorCQlhNnh4X2R1bXAoZ3B1KTsK KworCWdwdS0+ZnVuY3MtPnBtX3N1c3BlbmQoZ3B1KTsKKwlncHUtPmZ1bmNzLT5wbV9yZXN1bWUo Z3B1KTsKKworCW1zbV9ncHVfaHdfaW5pdChncHUpOworfQorCitzdGF0aWMgaW50IGE2eHhfZmF1 bHRfaGFuZGxlcih2b2lkICphcmcsIHVuc2lnbmVkIGxvbmcgaW92YSwgaW50IGZsYWdzKQorewor CXN0cnVjdCBtc21fZ3B1ICpncHUgPSBhcmc7CisKKwlwcl93YXJuX3JhdGVsaW1pdGVkKCIqKiog Z3B1IGZhdWx0OiBpb3ZhPSUwOGx4LCBmbGFncz0lZCAoJXUsJXUsJXUsJXUpXG4iLAorCQkJaW92 YSwgZmxhZ3MsCisJCQlncHVfcmVhZChncHUsIFJFR19BNlhYX0NQX1NDUkFUQ0hfUkVHKDQpKSwK KwkJCWdwdV9yZWFkKGdwdSwgUkVHX0E2WFhfQ1BfU0NSQVRDSF9SRUcoNSkpLAorCQkJZ3B1X3Jl YWQoZ3B1LCBSRUdfQTZYWF9DUF9TQ1JBVENIX1JFRyg2KSksCisJCQlncHVfcmVhZChncHUsIFJF R19BNlhYX0NQX1NDUkFUQ0hfUkVHKDcpKSk7CisKKwlyZXR1cm4gLUVGQVVMVDsKK30KKworc3Rh dGljIHZvaWQgYTZ4eF9jcF9od19lcnJfaXJxKHN0cnVjdCBtc21fZ3B1ICpncHUpCit7CisJdTMy IHN0YXR1cyA9IGdwdV9yZWFkKGdwdSwgUkVHX0E2WFhfQ1BfSU5URVJSVVBUX1NUQVRVUyk7CisK KwlpZiAoc3RhdHVzICYgQTZYWF9DUF9JTlRfQ1BfT1BDT0RFX0VSUk9SKSB7CisJCXUzMiB2YWw7 CisKKwkJZ3B1X3dyaXRlKGdwdSwgUkVHX0E2WFhfQ1BfU1FFX1NUQVRfQUREUiwgMSk7CisJCXZh bCA9IGdwdV9yZWFkKGdwdSwgUkVHX0E2WFhfQ1BfU1FFX1NUQVRfREFUQSk7CisJCWRldl9lcnJf cmF0ZWxpbWl0ZWQoJmdwdS0+cGRldi0+ZGV2LAorCQkJIkNQIHwgb3Bjb2RlIGVycm9yIHwgcG9z c2libGUgb3Bjb2RlPTB4JTguOFhcbiIsCisJCQl2YWwpOworCX0KKworCWlmIChzdGF0dXMgJiBB NlhYX0NQX0lOVF9DUF9VQ09ERV9FUlJPUikKKwkJZGV2X2Vycl9yYXRlbGltaXRlZCgmZ3B1LT5w ZGV2LT5kZXYsCisJCQkiQ1AgdWNvZGUgZXJyb3IgaW50ZXJydXB0XG4iKTsKKworCWlmIChzdGF0 dXMgJiBBNlhYX0NQX0lOVF9DUF9IV19GQVVMVF9FUlJPUikKKwkJZGV2X2Vycl9yYXRlbGltaXRl ZCgmZ3B1LT5wZGV2LT5kZXYsICJDUCB8IEhXIGZhdWx0IHwgc3RhdHVzPTB4JTguOFhcbiIsCisJ CQlncHVfcmVhZChncHUsIFJFR19BNlhYX0NQX0hXX0ZBVUxUKSk7CisKKwlpZiAoc3RhdHVzICYg QTZYWF9DUF9JTlRfQ1BfUkVHSVNURVJfUFJPVEVDVElPTl9FUlJPUikgeworCQl1MzIgdmFsID0g Z3B1X3JlYWQoZ3B1LCBSRUdfQTZYWF9DUF9QUk9URUNUX1NUQVRVUyk7CisKKwkJZGV2X2Vycl9y YXRlbGltaXRlZCgmZ3B1LT5wZGV2LT5kZXYsCisJCQkiQ1AgfCBwcm90ZWN0ZWQgbW9kZSBlcnJv ciB8ICVzIHwgYWRkcj0weCU4LjhYIHwgc3RhdHVzPTB4JTguOFhcbiIsCisJCQl2YWwgJiAoMSA8 PCAyMCkgPyAiUkVBRCIgOiAiV1JJVEUiLAorCQkJKHZhbCAmIDB4M2ZmZmYpLCB2YWwpOworCX0K KworCWlmIChzdGF0dXMgJiBBNlhYX0NQX0lOVF9DUF9BSEJfRVJST1IpCisJCWRldl9lcnJfcmF0 ZWxpbWl0ZWQoJmdwdS0+cGRldi0+ZGV2LCAiQ1AgQUhCIGVycm9yIGludGVycnVwdFxuIik7CisK KwlpZiAoc3RhdHVzICYgQTZYWF9DUF9JTlRfQ1BfVlNEX1BBUklUWV9FUlJPUikKKwkJZGV2X2Vy cl9yYXRlbGltaXRlZCgmZ3B1LT5wZGV2LT5kZXYsICJDUCBWU0QgZGVjb2RlciBwYXJpdHkgZXJy b3JcbiIpOworCisJaWYgKHN0YXR1cyAmIEE2WFhfQ1BfSU5UX0NQX0lMTEVHQUxfSU5TVFJfRVJS T1IpCisJCWRldl9lcnJfcmF0ZWxpbWl0ZWQoJmdwdS0+cGRldi0+ZGV2LCAiQ1AgaWxsZWdhbCBp bnN0cnVjdGlvbiBlcnJvclxuIik7CisKK30KKworc3RhdGljIHZvaWQgYTZ4eF9mYXVsdF9kZXRl Y3RfaXJxKHN0cnVjdCBtc21fZ3B1ICpncHUpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9 IGdwdS0+ZGV2OworCXN0cnVjdCBtc21fZHJtX3ByaXZhdGUgKnByaXYgPSBkZXYtPmRldl9wcml2 YXRlOworCXN0cnVjdCBtc21fcmluZ2J1ZmZlciAqcmluZyA9IGdwdS0+ZnVuY3MtPmFjdGl2ZV9y aW5nKGdwdSk7CisKKwlEUk1fREVWX0VSUk9SKCZncHUtPnBkZXYtPmRldiwKKwkJImdwdSBmYXVs dCByaW5nICVkIGZlbmNlICV4IHN0YXR1cyAlOC44WCByYiAlNC40eC8lNC40eCBpYjEgJTE2LjE2 bGxYLyU0LjR4IGliMiAlMTYuMTZsbFgvJTQuNHhcbiIsCisJCXJpbmcgPyByaW5nLT5pZCA6IC0x LCByaW5nID8gcmluZy0+c2Vxbm8gOiAwLAorCQlncHVfcmVhZChncHUsIFJFR19BNlhYX1JCQk1f U1RBVFVTKSwKKwkJZ3B1X3JlYWQoZ3B1LCBSRUdfQTZYWF9DUF9SQl9SUFRSKSwKKwkJZ3B1X3Jl YWQoZ3B1LCBSRUdfQTZYWF9DUF9SQl9XUFRSKSwKKwkJZ3B1X3JlYWQ2NChncHUsIFJFR19BNlhY X0NQX0lCMV9CQVNFLCBSRUdfQTZYWF9DUF9JQjFfQkFTRV9ISSksCisJCWdwdV9yZWFkKGdwdSwg UkVHX0E2WFhfQ1BfSUIxX1JFTV9TSVpFKSwKKwkJZ3B1X3JlYWQ2NChncHUsIFJFR19BNlhYX0NQ X0lCMl9CQVNFLCBSRUdfQTZYWF9DUF9JQjJfQkFTRV9ISSksCisJCWdwdV9yZWFkKGdwdSwgUkVH X0E2WFhfQ1BfSUIyX1JFTV9TSVpFKSk7CisKKwkvKiBUdXJuIG9mZiB0aGUgaGFuZ2NoZWNrIHRp bWVyIHRvIGtlZXAgaXQgZnJvbSBib3RoZXJpbmcgdXMgKi8KKwlkZWxfdGltZXIoJmdwdS0+aGFu Z2NoZWNrX3RpbWVyKTsKKworCXF1ZXVlX3dvcmsocHJpdi0+d3EsICZncHUtPnJlY292ZXJfd29y ayk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBhNnh4X2lycShzdHJ1Y3QgbXNtX2dwdSAqZ3B1 KQoreworCXUzMiBzdGF0dXMgPSBncHVfcmVhZChncHUsIFJFR19BNlhYX1JCQk1fSU5UXzBfU1RB VFVTKTsKKworCWdwdV93cml0ZShncHUsIFJFR19BNlhYX1JCQk1fSU5UX0NMRUFSX0NNRCwgc3Rh dHVzKTsKKworCWlmIChzdGF0dXMgJiBBNlhYX1JCQk1fSU5UXzBfTUFTS19SQkJNX0hBTkdfREVU RUNUKQorCQlhNnh4X2ZhdWx0X2RldGVjdF9pcnEoZ3B1KTsKKworCWlmIChzdGF0dXMgJiBBNlhY X1JCQk1fSU5UXzBfTUFTS19DUF9BSEJfRVJST1IpCisJCWRldl9lcnJfcmF0ZWxpbWl0ZWQoJmdw dS0+cGRldi0+ZGV2LCAiQ1AgfCBBSEIgYnVzIGVycm9yXG4iKTsKKworCWlmIChzdGF0dXMgJiBB NlhYX1JCQk1fSU5UXzBfTUFTS19DUF9IV19FUlJPUikKKwkJYTZ4eF9jcF9od19lcnJfaXJxKGdw dSk7CisKKwlpZiAoc3RhdHVzICYgQTZYWF9SQkJNX0lOVF8wX01BU0tfUkJCTV9BVEJfQVNZTkNG SUZPX09WRVJGTE9XKQorCQlkZXZfZXJyX3JhdGVsaW1pdGVkKCZncHUtPnBkZXYtPmRldiwgIlJC Qk0gfCBBVEIgQVNZTkMgb3ZlcmZsb3dcbiIpOworCisJaWYgKHN0YXR1cyAmIEE2WFhfUkJCTV9J TlRfMF9NQVNLX1JCQk1fQVRCX0JVU19PVkVSRkxPVykKKwkJZGV2X2Vycl9yYXRlbGltaXRlZCgm Z3B1LT5wZGV2LT5kZXYsICJSQkJNIHwgQVRCIGJ1cyBvdmVyZmxvd1xuIik7CisKKwlpZiAoc3Rh dHVzICYgQTZYWF9SQkJNX0lOVF8wX01BU0tfVUNIRV9PT0JfQUNDRVNTKQorCQlkZXZfZXJyX3Jh dGVsaW1pdGVkKCZncHUtPnBkZXYtPmRldiwgIlVDSEUgfCBPdXQgb2YgYm91bmRzIGFjY2Vzc1xu Iik7CisKKwlpZiAoc3RhdHVzICYgQTZYWF9SQkJNX0lOVF8wX01BU0tfQ1BfQ0FDSEVfRkxVU0hf VFMpCisJCW1zbV9ncHVfcmV0aXJlKGdwdSk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisK K3N0YXRpYyBjb25zdCB1MzIgYTZ4eF9yZWdpc3Rlcl9vZmZzZXRzW1JFR19BRFJFTk9fUkVHSVNU RVJfTUFYXSA9IHsKKwlSRUdfQURSRU5PX0RFRklORShSRUdfQURSRU5PX0NQX1JCX0JBU0UsIFJF R19BNlhYX0NQX1JCX0JBU0UpLAorCVJFR19BRFJFTk9fREVGSU5FKFJFR19BRFJFTk9fQ1BfUkJf QkFTRV9ISSwgUkVHX0E2WFhfQ1BfUkJfQkFTRV9ISSksCisJUkVHX0FEUkVOT19ERUZJTkUoUkVH X0FEUkVOT19DUF9SQl9SUFRSX0FERFIsCisJCVJFR19BNlhYX0NQX1JCX1JQVFJfQUREUl9MTyks CisJUkVHX0FEUkVOT19ERUZJTkUoUkVHX0FEUkVOT19DUF9SQl9SUFRSX0FERFJfSEksCisJCVJF R19BNlhYX0NQX1JCX1JQVFJfQUREUl9ISSksCisJUkVHX0FEUkVOT19ERUZJTkUoUkVHX0FEUkVO T19DUF9SQl9SUFRSLCBSRUdfQTZYWF9DUF9SQl9SUFRSKSwKKwlSRUdfQURSRU5PX0RFRklORShS RUdfQURSRU5PX0NQX1JCX1dQVFIsIFJFR19BNlhYX0NQX1JCX1dQVFIpLAorCVJFR19BRFJFTk9f REVGSU5FKFJFR19BRFJFTk9fQ1BfUkJfQ05UTCwgUkVHX0E2WFhfQ1BfUkJfQ05UTCksCit9Owor CitzdGF0aWMgY29uc3QgdTMyIGE2eHhfcmVnaXN0ZXJzW10gPSB7CisJMHgwMDAwLCAweDAwMDIs IDB4MDAxMCwgMHgwMDEwLCAweDAwMTIsIDB4MDAxMiwgMHgwMDE4LCAweDAwMWIsCisJMHgwMDFl LCAweDAwMzIsIDB4MDAzOCwgMHgwMDNjLCAweDAwNDIsIDB4MDA0MiwgMHgwMDQ0LCAweDAwNDQs CisJMHgwMDQ3LCAweDAwNDcsIDB4MDA1NiwgMHgwMDU2LCAweDAwYWQsIDB4MDBhZSwgMHgwMGIw LCAweDAwZmIsCisJMHgwMTAwLCAweDAxMWQsIDB4MDIwMCwgMHgwMjBkLCAweDAyMTAsIDB4MDIx MywgMHgwMjE4LCAweDAyM2QsCisJMHgwNDAwLCAweDA0ZjksIDB4MDUwMCwgMHgwNTAwLCAweDA1 MDUsIDB4MDUwYiwgMHgwNTBlLCAweDA1MTEsCisJMHgwNTMzLCAweDA1MzMsIDB4MDU0MCwgMHgw NTU1LCAweDA4MDAsIDB4MDgwOCwgMHgwODEwLCAweDA4MTMsCisJMHgwODIwLCAweDA4MjEsIDB4 MDgyMywgMHgwODI3LCAweDA4MzAsIDB4MDgzMywgMHgwODQwLCAweDA4NDMsCisJMHgwODRmLCAw eDA4NmYsIDB4MDg4MCwgMHgwODhhLCAweDA4YTAsIDB4MDhhYiwgMHgwOGMwLCAweDA4YzQsCisJ MHgwOGQwLCAweDA4ZGQsIDB4MDhmMCwgMHgwOGYzLCAweDA5MDAsIDB4MDkwMywgMHgwOTA4LCAw eDA5MTEsCisJMHgwOTI4LCAweDA5M2UsIDB4MDk0MiwgMHgwOTRkLCAweDA5ODAsIDB4MDk4NCwg MHgwOThkLCAweDA5OTYsCisJMHgwOTk4LCAweDA5OWUsIDB4MDlhMCwgMHgwOWE2LCAweDA5YTgs IDB4MDlhZSwgMHgwOWIwLCAweDA5YjEsCisJMHgwOWMyLCAweDA5YzgsIDB4MGEwMCwgMHgwYTAz LCAweDBjMDAsIDB4MGMwNCwgMHgwYzA2LCAweDBjMDYsCisJMHgwYzEwLCAweDBjZDksIDB4MGUw MCwgMHgwZTBlLCAweDBlMTAsIDB4MGUxMywgMHgwZTE3LCAweDBlMTksCisJMHgwZTFjLCAweDBl MmIsIDB4MGUzMCwgMHgwZTMyLCAweDBlMzgsIDB4MGUzOSwgMHg4NjAwLCAweDg2MDEsCisJMHg4 NjEwLCAweDg2MWIsIDB4ODYyMCwgMHg4NjIwLCAweDg2MjgsIDB4ODYyYiwgMHg4NjMwLCAweDg2 MzcsCisJMHg4ZTAxLCAweDhlMDEsIDB4OGUwNCwgMHg4ZTA1LCAweDhlMDcsIDB4OGUwOCwgMHg4 ZTBjLCAweDhlMGMsCisJMHg4ZTEwLCAweDhlMWMsIDB4OGUyMCwgMHg4ZTI1LCAweDhlMjgsIDB4 OGUyOCwgMHg4ZTJjLCAweDhlMmYsCisJMHg4ZTNiLCAweDhlM2UsIDB4OGU0MCwgMHg4ZTQzLCAw eDhlNTAsIDB4OGU1ZSwgMHg4ZTcwLCAweDhlNzcsCisJMHg5NjAwLCAweDk2MDQsIDB4OTYyNCwg MHg5NjM3LCAweDllMDAsIDB4OWUwMSwgMHg5ZTAzLCAweDllMGUsCisJMHg5ZTExLCAweDllMTYs IDB4OWUxOSwgMHg5ZTE5LCAweDllMWMsIDB4OWUxYywgMHg5ZTIwLCAweDllMjMsCisJMHg5ZTMw LCAweDllMzEsIDB4OWUzNCwgMHg5ZTM0LCAweDllNzAsIDB4OWU3MiwgMHg5ZTc4LCAweDllNzks CisJMHg5ZTgwLCAweDlmZmYsIDB4YTYwMCwgMHhhNjAxLCAweGE2MDMsIDB4YTYwMywgMHhhNjBh LCAweGE2MGEsCisJMHhhNjEwLCAweGE2MTcsIDB4YTYzMCwgMHhhNjMwLAorCX4wCit9OworCitz dGF0aWMgaW50IGE2eHhfcG1fcmVzdW1lKHN0cnVjdCBtc21fZ3B1ICpncHUpCit7CisJc3RydWN0 IGFkcmVub19ncHUgKmFkcmVub19ncHUgPSB0b19hZHJlbm9fZ3B1KGdwdSk7CisJc3RydWN0IGE2 eHhfZ3B1ICphNnh4X2dwdSA9IHRvX2E2eHhfZ3B1KGFkcmVub19ncHUpOworCWludCByZXQ7CisK KwlyZXQgPSBhNnh4X2dtdV9yZXN1bWUoYTZ4eF9ncHUpOworCisJZ3B1LT5uZWVkc19od19pbml0 ID0gdHJ1ZTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYTZ4eF9wbV9zdXNwZW5k KHN0cnVjdCBtc21fZ3B1ICpncHUpCit7CisJc3RydWN0IGFkcmVub19ncHUgKmFkcmVub19ncHUg PSB0b19hZHJlbm9fZ3B1KGdwdSk7CisJc3RydWN0IGE2eHhfZ3B1ICphNnh4X2dwdSA9IHRvX2E2 eHhfZ3B1KGFkcmVub19ncHUpOworCisJLyoKKwkgKiBNYWtlIHN1cmUgdGhlIEdNVSBpcyBpZGxl IGJlZm9yZSBjb250aW51aW5nIChiZWNhdXNlIHNvbWUgdHJhbnNpdGlvbnMKKwkgKiBtYXkgdXNl IFZCSUYKKwkgKi8KKwlhNnh4X2dtdV93YWl0X2Zvcl9pZGxlKGE2eHhfZ3B1KTsKKworCS8qIENs ZWFyIHRoZSBWQklGIHBpcGUgYmVmb3JlIHNodXR0aW5nIGRvd24gKi8KKwkvKiBGSVhNRTogVGhp cyBhY2Nlc3NlcyB0aGUgR1BVIC0gZG8gd2UgbmVlZCB0byBtYWtlIHN1cmUgaXQgaXMgb24/ICov CisJZ3B1X3dyaXRlKGdwdSwgUkVHX0E2WFhfVkJJRl9YSU5fSEFMVF9DVFJMMCwgMHhmKTsKKwlz cGluX3VudGlsKChncHVfcmVhZChncHUsIFJFR19BNlhYX1ZCSUZfWElOX0hBTFRfQ1RSTDEpICYg MHhmKSA9PSAweGYpOworCWdwdV93cml0ZShncHUsIFJFR19BNlhYX1ZCSUZfWElOX0hBTFRfQ1RS TDAsIDApOworCisJcmV0dXJuIGE2eHhfZ211X3N0b3AoYTZ4eF9ncHUpOworfQorCitzdGF0aWMg aW50IGE2eHhfZ2V0X3RpbWVzdGFtcChzdHJ1Y3QgbXNtX2dwdSAqZ3B1LCB1aW50NjRfdCAqdmFs dWUpCit7CisJc3RydWN0IGFkcmVub19ncHUgKmFkcmVub19ncHUgPSB0b19hZHJlbm9fZ3B1KGdw dSk7CisJc3RydWN0IGE2eHhfZ3B1ICphNnh4X2dwdSA9IHRvX2E2eHhfZ3B1KGFkcmVub19ncHUp OworCisJLyogRm9yY2UgdGhlIEdQVSBwb3dlciBvbiBzbyB3ZSBjYW4gcmVhZCB0aGlzIHJlZ2lz dGVyICovCisJYTZ4eF9nbXVfc2V0X29vYigmYTZ4eF9ncHUtPmdtdSwgR01VX09PQl9HUFVfU0VU KTsKKworCSp2YWx1ZSA9IGdwdV9yZWFkNjQoZ3B1LCBSRUdfQTZYWF9SQkJNX1BFUkZDVFJfQ1Bf MF9MTywKKwkJUkVHX0E2WFhfUkJCTV9QRVJGQ1RSX0NQXzBfSEkpOworCisJYTZ4eF9nbXVfY2xl YXJfb29iKCZhNnh4X2dwdS0+Z211LCBHTVVfT09CX0dQVV9TRVQpOworCXJldHVybiAwOworfQor CisjaWZkZWYgQ09ORklHX0RFQlVHX0ZTCitzdGF0aWMgdm9pZCBhNnh4X3Nob3coc3RydWN0IG1z bV9ncHUgKmdwdSwgc3RydWN0IHNlcV9maWxlICptKQoreworCWdwdS0+ZnVuY3MtPnBtX3Jlc3Vt ZShncHUpOworCisJc2VxX3ByaW50ZihtLCAic3RhdHVzOiAgICUwOHhcbiIsCisJCQlncHVfcmVh ZChncHUsIFJFR19BNlhYX1JCQk1fU1RBVFVTKSk7CisJZ3B1LT5mdW5jcy0+cG1fc3VzcGVuZChn cHUpOworCisJYWRyZW5vX3Nob3coZ3B1LCBtKTsKK30KKyNlbmRpZgorCitzdGF0aWMgc3RydWN0 IG1zbV9yaW5nYnVmZmVyICphNnh4X2FjdGl2ZV9yaW5nKHN0cnVjdCBtc21fZ3B1ICpncHUpCit7 CisJc3RydWN0IGFkcmVub19ncHUgKmFkcmVub19ncHUgPSB0b19hZHJlbm9fZ3B1KGdwdSk7CisJ c3RydWN0IGE2eHhfZ3B1ICphNnh4X2dwdSA9IHRvX2E2eHhfZ3B1KGFkcmVub19ncHUpOworCisJ cmV0dXJuIGE2eHhfZ3B1LT5jdXJfcmluZzsKK30KKworc3RhdGljIHZvaWQgYTZ4eF9kZXN0cm95 KHN0cnVjdCBtc21fZ3B1ICpncHUpCit7CisJc3RydWN0IGFkcmVub19ncHUgKmFkcmVub19ncHUg PSB0b19hZHJlbm9fZ3B1KGdwdSk7CisJc3RydWN0IGE2eHhfZ3B1ICphNnh4X2dwdSA9IHRvX2E2 eHhfZ3B1KGFkcmVub19ncHUpOworCisJaWYgKGE2eHhfZ3B1LT5zcWVfYm8pIHsKKwkJaWYgKGE2 eHhfZ3B1LT5zcWVfaW92YSkKKwkJCW1zbV9nZW1fcHV0X2lvdmEoYTZ4eF9ncHUtPnNxZV9ibywg Z3B1LT5hc3BhY2UpOworCQlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZV91bmxvY2tlZChhNnh4 X2dwdS0+c3FlX2JvKTsKKwl9CisKKwlhNnh4X2dtdV9yZW1vdmUoYTZ4eF9ncHUpOworCisJYWRy ZW5vX2dwdV9jbGVhbnVwKGFkcmVub19ncHUpOworCWtmcmVlKGE2eHhfZ3B1KTsKK30KKworc3Rh dGljIGNvbnN0IHN0cnVjdCBhZHJlbm9fZ3B1X2Z1bmNzIGZ1bmNzID0geworCS5iYXNlID0gewor CQkuZ2V0X3BhcmFtID0gYWRyZW5vX2dldF9wYXJhbSwKKwkJLmh3X2luaXQgPSBhNnh4X2h3X2lu aXQsCisJCS5wbV9zdXNwZW5kID0gYTZ4eF9wbV9zdXNwZW5kLAorCQkucG1fcmVzdW1lID0gYTZ4 eF9wbV9yZXN1bWUsCisJCS5yZWNvdmVyID0gYTZ4eF9yZWNvdmVyLAorCQkuc3VibWl0ID0gYTZ4 eF9zdWJtaXQsCisJCS5mbHVzaCA9IGE2eHhfZmx1c2gsCisJCS5hY3RpdmVfcmluZyA9IGE2eHhf YWN0aXZlX3JpbmcsCisJCS5pcnEgPSBhNnh4X2lycSwKKwkJLmRlc3Ryb3kgPSBhNnh4X2Rlc3Ry b3ksCisjaWZkZWYgQ09ORklHX0RFQlVHX0ZTCisJCS5zaG93ID0gYTZ4eF9zaG93LAorI2VuZGlm CisJfSwKKwkuZ2V0X3RpbWVzdGFtcCA9IGE2eHhfZ2V0X3RpbWVzdGFtcCwKK307CisKK3N0cnVj dCBtc21fZ3B1ICphNnh4X2dwdV9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3Ry dWN0IG1zbV9kcm1fcHJpdmF0ZSAqcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IHBs YXRmb3JtX2RldmljZSAqcGRldiA9IHByaXYtPmdwdV9wZGV2OworCXN0cnVjdCBkZXZpY2Vfbm9k ZSAqbm9kZTsKKwlzdHJ1Y3QgYTZ4eF9ncHUgKmE2eHhfZ3B1OworCXN0cnVjdCBhZHJlbm9fZ3B1 ICphZHJlbm9fZ3B1OworCXN0cnVjdCBtc21fZ3B1ICpncHU7CisJaW50IHJldDsKKworCWE2eHhf Z3B1ID0ga3phbGxvYyhzaXplb2YoKmE2eHhfZ3B1KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFhNnh4 X2dwdSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlhZHJlbm9fZ3B1ID0gJmE2eHhf Z3B1LT5iYXNlOworCWdwdSA9ICZhZHJlbm9fZ3B1LT5iYXNlOworCisJYWRyZW5vX2dwdS0+cmVn aXN0ZXJzID0gYTZ4eF9yZWdpc3RlcnM7CisJYWRyZW5vX2dwdS0+cmVnX29mZnNldHMgPSBhNnh4 X3JlZ2lzdGVyX29mZnNldHM7CisKKwlyZXQgPSBhZHJlbm9fZ3B1X2luaXQoZGV2LCBwZGV2LCBh ZHJlbm9fZ3B1LCAmZnVuY3MsIDEpOworCWlmIChyZXQpIHsKKwkJYTZ4eF9kZXN0cm95KCYoYTZ4 eF9ncHUtPmJhc2UuYmFzZSkpOworCQlyZXR1cm4gRVJSX1BUUihyZXQpOworCX0KKworCS8qIENo ZWNrIGlmIHRoZXJlIGlzIGEgR01VIHBoYW5kbGUgYW5kIHNldCBpdCB1cCAqLworCW5vZGUgPSBv Zl9wYXJzZV9waGFuZGxlKHBkZXYtPmRldi5vZl9ub2RlLCAiZ211IiwgMCk7CisKKwkvKiBGSVhN RTogSG93IGRvIHdlIGdyYWNlZnVsbHkgaGFuZGxlIHRoaXM/ICovCisJQlVHX09OKCFub2RlKTsK KworCXJldCA9IGE2eHhfZ211X3Byb2JlKGE2eHhfZ3B1LCBub2RlKTsKKwlpZiAocmV0KSB7CisJ CWE2eHhfZGVzdHJveSgmKGE2eHhfZ3B1LT5iYXNlLmJhc2UpKTsKKwkJcmV0dXJuIEVSUl9QVFIo cmV0KTsKKwl9CisKKwlpZiAoZ3B1LT5hc3BhY2UpCisJCW1zbV9tbXVfc2V0X2ZhdWx0X2hhbmRs ZXIoZ3B1LT5hc3BhY2UtPm1tdSwgZ3B1LAorCQkJCWE2eHhfZmF1bHRfaGFuZGxlcik7CisKKwly ZXR1cm4gZ3B1OworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9hZHJlbm8vYTZ4 eF9ncHUuaCBiL2RyaXZlcnMvZ3B1L2RybS9tc20vYWRyZW5vL2E2eHhfZ3B1LmgKbmV3IGZpbGUg bW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwLi5kZDY5ZTViMGU2OTIKLS0tIC9kZXYvbnVs bAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2FkcmVuby9hNnh4X2dwdS5oCkBAIC0wLDAgKzEs NjAgQEAKKy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wICovCisvKiBDb3B5cmln aHQgKGMpIDIwMTcgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuICov CisKKyNpZm5kZWYgX19BNlhYX0dQVV9IX18KKyNkZWZpbmUgX19BNlhYX0dQVV9IX18KKworCisj aW5jbHVkZSAiYWRyZW5vX2dwdS5oIgorI2luY2x1ZGUgImE2eHgueG1sLmgiCisKKyNpbmNsdWRl ICJhNnh4X2dtdS5oIgorCitleHRlcm4gYm9vbCBoYW5nX2RlYnVnOworCitzdHJ1Y3QgYTZ4eF9n cHUgeworCXN0cnVjdCBhZHJlbm9fZ3B1IGJhc2U7CisKKwlzdHJ1Y3QgZHJtX2dlbV9vYmplY3Qg KnNxZV9ibzsKKwl1aW50NjRfdCBzcWVfaW92YTsKKworCXN0cnVjdCBtc21fcmluZ2J1ZmZlciAq Y3VyX3Jpbmc7CisKKwlzdHJ1Y3QgYTZ4eF9nbXUgZ211OworfTsKKworI2RlZmluZSB0b19hNnh4 X2dwdSh4KSBjb250YWluZXJfb2YoeCwgc3RydWN0IGE2eHhfZ3B1LCBiYXNlKQorCisvKgorICog R2l2ZW4gYSByZWdpc3RlciBhbmQgYSBjb3VudCwgcmV0dXJuIGEgdmFsdWUgdG8gcHJvZ3JhbSBp bnRvCisgKiBSRUdfQ1BfUFJPVEVDVF9SRUcobikgLSB0aGlzIHdpbGwgYmxvY2sgYm90aCByZWFk cyBhbmQgd3JpdGVzIGZvciBfbGVuCisgKiByZWdpc3RlcnMgc3RhcnRpbmcgYXQgX3JlZy4KKyAq LworI2RlZmluZSBBNlhYX1BST1RFQ1RfUlcoX3JlZywgX2xlbikgXAorCSgoMSA8PCAzMSkgfCBc CisJKCgoX2xlbikgJiAweDNGRkYpIDw8IDE4KSB8ICgoX3JlZykgJiAweDNGRkZGKSkKKworLyoK KyAqIFNhbWUgYXMgYWJvdmUsIGJ1dCBhbGxvdyByZWFkcyBvdmVyIHRoZSByYW5nZS4gRm9yIGFy ZWFzIG9mIG1peGVkIHVzZSAoc3VjaAorICogYXMgcGVyZm9ybWFuY2UgY291bnRlcnMpIHRoaXMg YWxsb3dzIHVzIHRvIHByb3RlY3QgYSBtdWNoIGxhcmdlciByYW5nZSB3aXRoIGEKKyAqIHNpbmds ZSByZWdpc3RlcgorICovCisjZGVmaW5lIEE2WFhfUFJPVEVDVF9SRE9OTFkoX3JlZywgX2xlbikg XAorCSgoKChfbGVuKSAmIDB4M0ZGRikgPDwgMTgpIHwgKChfcmVnKSAmIDB4M0ZGRkYpKQorCisK K2ludCBhNnh4X2dtdV9yZXN1bWUoc3RydWN0IGE2eHhfZ3B1ICpncHUpOworaW50IGE2eHhfZ211 X3N0b3Aoc3RydWN0IGE2eHhfZ3B1ICpncHUpOworCitpbnQgYTZ4eF9nbXVfd2FpdF9mb3JfaWRs ZShzdHJ1Y3QgYTZ4eF9ncHUgKmdwdSk7CisKK2ludCBhNnh4X2dtdV9yZXNldChzdHJ1Y3QgYTZ4 eF9ncHUgKmE2eHhfZ3B1KTsKK2Jvb2wgYTZ4eF9nbXVfaXNpZGxlKHN0cnVjdCBhNnh4X2dtdSAq Z211KTsKKworaW50IGE2eHhfZ211X3NldF9vb2Ioc3RydWN0IGE2eHhfZ211ICpnbXUsIGVudW0g YTZ4eF9nbXVfb29iX3N0YXRlIHN0YXRlKTsKK3ZvaWQgYTZ4eF9nbXVfY2xlYXJfb29iKHN0cnVj dCBhNnh4X2dtdSAqZ211LCBlbnVtIGE2eHhfZ211X29vYl9zdGF0ZSBzdGF0ZSk7CisKK2ludCBh Nnh4X2dtdV9wcm9iZShzdHJ1Y3QgYTZ4eF9ncHUgKmE2eHhfZ3B1LCBzdHJ1Y3QgZGV2aWNlX25v ZGUgKm5vZGUpOwordm9pZCBhNnh4X2dtdV9yZW1vdmUoc3RydWN0IGE2eHhfZ3B1ICphNnh4X2dw dSk7CisKKyNlbmRpZiAvKiBfX0E2WFhfR1BVX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9n cHUvZHJtL21zbS9hZHJlbm8vYTZ4eF9oZmkuYyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vYWRyZW5v L2E2eHhfaGZpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwLi4yMjFl YWFmYzhiNWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2FkcmVuby9h Nnh4X2hmaS5jCkBAIC0wLDAgKzEsNDM1IEBACisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjog R1BMLTIuMAorLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggVGhlIExpbnV4IEZvdW5kYXRpb24u IEFsbCByaWdodHMgcmVzZXJ2ZWQuICovCisKKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+ CisjaW5jbHVkZSA8bGludXgvY2lyY19idWYuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisK KyNpbmNsdWRlICJhNnh4X2dtdS5oIgorI2luY2x1ZGUgImE2eHhfZ211LnhtbC5oIgorCisjZGVm aW5lIEhGSV9NU0dfSUQodmFsKSBbdmFsXSA9ICN2YWwKKworc3RhdGljIGNvbnN0IGNoYXIgKiBj b25zdCBhNnh4X2hmaV9tc2dfaWRbXSA9IHsKKwlIRklfTVNHX0lEKEhGSV9IMkZfTVNHX0lOSVQp LAorCUhGSV9NU0dfSUQoSEZJX0gyRl9NU0dfRldfVkVSU0lPTiksCisJSEZJX01TR19JRChIRklf SDJGX01TR19CV19UQUJMRSksCisJSEZJX01TR19JRChIRklfSDJGX01TR19QRVJGX1RBQkxFKSwK KwlIRklfTVNHX0lEKEhGSV9IMkZfTVNHX1RFU1QpLAorfTsKKworc3RhdGljIGludCBhNnh4X2hm aV9xdWV1ZV9yZWFkKHN0cnVjdCBhNnh4X2hmaV9xdWV1ZSAqcXVldWUsIHUzMiAqZGF0YSwKKwkJ dTMyIGR3b3JkcykKK3sKKwlzdHJ1Y3QgYTZ4eF9oZmlfcXVldWVfaGVhZGVyICpoZWFkZXIgPSBx dWV1ZS0+aGVhZGVyOworCXUzMiBpLCBoZHIsIGluZGV4ID0gaGVhZGVyLT5yZWFkX2luZGV4Owor CisJaWYgKGhlYWRlci0+cmVhZF9pbmRleCA9PSBoZWFkZXItPndyaXRlX2luZGV4KSB7CisJCWhl YWRlci0+cnhfcmVxdWVzdCA9IDE7CisJCXJldHVybiAwOworCX0KKworCWhkciA9IHF1ZXVlLT5k YXRhW2luZGV4XTsKKworCS8qCisJICogSWYgd2UgYXJlIHRvIGFzc3VtZSB0aGF0IHRoZSBHTVUg ZmlybXdhcmUgaXMgaW4gZmFjdCBhIHJhdGlvbmFsIGFjdG9yCisJICogYW5kIGlzIHByb2dyYW1t ZWQgdG8gbm90IHNlbmQgdXMgYSBsYXJnZXIgcmVzcG9uc2UgdGhhbiB3ZSBleHBlY3QKKwkgKiB0 aGVuIHdlIGNhbiBhbHNvIGFzc3VtZSB0aGF0IGlmIHRoZSBoZWFkZXIgc2l6ZSBpcyB1bmV4cGVj dGVkbHkgbGFyZ2UKKwkgKiB0aGF0IGl0IGlzIGR1ZSB0byBtZW1vcnkgY29ycnVwdGlvbiBhbmQv b3IgaGFyZHdhcmUgZmFpbHVyZS4gSW4gdGhpcworCSAqIGNhc2UgdGhlIG9ubHkgcmVhc29uYWJs ZSBjb3Vyc2Ugb2YgYWN0aW9uIGlzIHRvIEJVRygpIHRvIGhlbHAgaGFyZGVuCisJICogdGhlIGZh aWx1cmUuCisJICovCisKKwlCVUdfT04oSEZJX0hFQURFUl9TSVpFKGhkcikgPiBkd29yZHMpOwor CisJZm9yIChpID0gMDsgaSA8IEhGSV9IRUFERVJfU0laRShoZHIpOyBpKyspIHsKKwkJZGF0YVtp XSA9IHF1ZXVlLT5kYXRhW2luZGV4XTsKKwkJaW5kZXggPSAoaW5kZXggKyAxKSAlIGhlYWRlci0+ c2l6ZTsKKwl9CisKKwloZWFkZXItPnJlYWRfaW5kZXggPSBpbmRleDsKKwlyZXR1cm4gSEZJX0hF QURFUl9TSVpFKGhkcik7Cit9CisKK3N0YXRpYyBpbnQgYTZ4eF9oZmlfcXVldWVfd3JpdGUoc3Ry dWN0IGE2eHhfZ211ICpnbXUsCisJc3RydWN0IGE2eHhfaGZpX3F1ZXVlICpxdWV1ZSwgdTMyICpk YXRhLCB1MzIgZHdvcmRzKQoreworCXN0cnVjdCBhNnh4X2hmaV9xdWV1ZV9oZWFkZXIgKmhlYWRl ciA9IHF1ZXVlLT5oZWFkZXI7CisJdTMyIGksIHNwYWNlLCBpbmRleCA9IGhlYWRlci0+d3JpdGVf aW5kZXg7CisKKwlzcGluX2xvY2soJnF1ZXVlLT5sb2NrKTsKKworCXNwYWNlID0gQ0lSQ19TUEFD RShoZWFkZXItPndyaXRlX2luZGV4LCBoZWFkZXItPnJlYWRfaW5kZXgsCisJCWhlYWRlci0+c2l6 ZSk7CisJaWYgKHNwYWNlIDwgZHdvcmRzKSB7CisJCWhlYWRlci0+ZHJvcHBlZCsrOworCQlzcGlu X3VubG9jaygmcXVldWUtPmxvY2spOworCQlyZXR1cm4gLUVOT1NQQzsKKwl9CisKKwlmb3IgKGkg PSAwOyBpIDwgZHdvcmRzOyBpKyspIHsKKwkJcXVldWUtPmRhdGFbaW5kZXhdID0gZGF0YVtpXTsK KwkJaW5kZXggPSAoaW5kZXggKyAxKSAlIGhlYWRlci0+c2l6ZTsKKwl9CisKKwloZWFkZXItPndy aXRlX2luZGV4ID0gaW5kZXg7CisJc3Bpbl91bmxvY2soJnF1ZXVlLT5sb2NrKTsKKworCWdtdV93 cml0ZShnbXUsIFJFR19BNlhYX0dNVV9IT1NUMkdNVV9JTlRSX1NFVCwgMHgwMSk7CisJcmV0dXJu IDA7Cit9CisKK3N0cnVjdCBhNnh4X2hmaV9yZXNwb25zZSB7CisJdTMyIGlkOworCXUzMiBzZXFu dW07CisJc3RydWN0IGxpc3RfaGVhZCBub2RlOworCXN0cnVjdCBjb21wbGV0aW9uIGNvbXBsZXRl OworCisJdTMyIGVycm9yOworCXUzMiBwYXlsb2FkWzE2XTsKK307CisKKy8qCisgKiBJbmNvbWlu ZyBIRkkgYWNrIG1lc3NhZ2VzIGNhbiBjb21lIGluIG91dCBvZiBvcmRlciBzbyB3ZSBuZWVkIHRv IHN0b3JlIGFsbAorICogdGhlIHBlbmRpbmcgbWVzc2FnZXMgb24gYSBsaXN0IHVudGlsIHRoZXkg YXJlIGhhbmRsZWQuCisgKi8KK3N0YXRpYyBzcGlubG9ja190IGhmaV9hY2tfbG9jayA9IF9fU1BJ Tl9MT0NLX1VOTE9DS0VEKG1lc3NhZ2VfbG9jayk7CitzdGF0aWMgTElTVF9IRUFEKGhmaV9hY2tf bGlzdCk7CisKK3N0YXRpYyB2b2lkIGE2eHhfaGZpX2hhbmRsZV9hY2soc3RydWN0IGE2eHhfZ211 ICpnbXUsCisJCXN0cnVjdCBhNnh4X2hmaV9tc2dfcmVzcG9uc2UgKm1zZykKK3sKKwlzdHJ1Y3Qg YTZ4eF9oZmlfcmVzcG9uc2UgKnJlc3A7CisJdTMyIGlkLCBzZXFudW07CisKKwkvKiBtc2ctPnJl dF9oZWFkZXIgY29udGFpbnMgdGhlIGhlYWRlciBvZiB0aGUgbWVzc2FnZSBiZWluZyBhY2tlZCAq LworCWlkID0gSEZJX0hFQURFUl9JRChtc2ctPnJldF9oZWFkZXIpOworCXNlcW51bSA9IEhGSV9I RUFERVJfU0VRTlVNKG1zZy0+cmV0X2hlYWRlcik7CisKKwlzcGluX2xvY2soJmhmaV9hY2tfbG9j ayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShyZXNwLCAmaGZpX2Fja19saXN0LCBub2RlKSB7CisJ CWlmIChyZXNwLT5pZCA9PSBpZCAmJiByZXNwLT5zZXFudW0gPT0gc2VxbnVtKSB7CisJCQlyZXNw LT5lcnJvciA9IG1zZy0+ZXJyb3I7CisJCQltZW1jcHkocmVzcC0+cGF5bG9hZCwgbXNnLT5wYXls b2FkLAorCQkJCXNpemVvZihyZXNwLT5wYXlsb2FkKSk7CisKKwkJCWNvbXBsZXRlKCZyZXNwLT5j b21wbGV0ZSk7CisJCQlzcGluX3VubG9jaygmaGZpX2Fja19sb2NrKTsKKwkJCXJldHVybjsKKwkJ fQorCX0KKwlzcGluX3VubG9jaygmaGZpX2Fja19sb2NrKTsKKworCWRldl9lcnIoZ211LT5kZXYs ICJOb2JvZHkgd2FzIHdhaXRpbmcgZm9yIEhGSSBtZXNzYWdlICVkXG4iLCBzZXFudW0pOworfQor CitzdGF0aWMgdm9pZCBhNnh4X2hmaV9oYW5kbGVfZXJyb3Ioc3RydWN0IGE2eHhfZ211ICpnbXUs CisJCXN0cnVjdCBhNnh4X2hmaV9tc2dfcmVzcG9uc2UgKm1zZykKK3sKKwlzdHJ1Y3QgYTZ4eF9o ZmlfbXNnX2Vycm9yICplcnJvciA9IChzdHJ1Y3QgYTZ4eF9oZmlfbXNnX2Vycm9yICopIG1zZzsK KworCWRldl9lcnIoZ211LT5kZXYsICJHTVUgZmlybXdhcmUgZXJyb3IgJWRcbiIsIGVycm9yLT5j b2RlKTsKK30KKwordm9pZCBhNnh4X2hmaV90YXNrKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlz dHJ1Y3QgYTZ4eF9nbXUgKmdtdSA9IChzdHJ1Y3QgYTZ4eF9nbXUgKikgZGF0YTsKKwlzdHJ1Y3Qg YTZ4eF9oZmlfcXVldWUgKnF1ZXVlID0gJmdtdS0+cXVldWVzW0hGSV9SRVNQT05TRV9RVUVVRV07 CisJc3RydWN0IGE2eHhfaGZpX21zZ19yZXNwb25zZSByZXNwOworCisJZm9yICg7OykgeworCQl1 MzIgaWQ7CisJCWludCByZXQgPSBhNnh4X2hmaV9xdWV1ZV9yZWFkKHF1ZXVlLCAodTMyICopICZy ZXNwLAorCQkJc2l6ZW9mKHJlc3ApID4+IDIpOworCisJCS8qIFJldHVybnMgdGhlIG51bWJlciBv ZiBieXRlcyBjb3BpZWQgb3IgbmVnYXRpdmUgb24gZXJyb3IgKi8KKwkJaWYgKHJldCA8PSAwKSB7 CisJCQlpZiAocmV0IDwgMCkKKwkJCQlkZXZfZXJyKGdtdS0+ZGV2LAorCQkJCQkiVW5hYmxlIHRv IHJlYWQgdGhlIEhGSSBtZXNzYWdlIHF1ZXVlXG4iKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWQg PSBIRklfSEVBREVSX0lEKHJlc3AuaGVhZGVyKTsKKworCQlpZiAoaWQgPT0gSEZJX0YySF9NU0df QUNLKQorCQkJYTZ4eF9oZmlfaGFuZGxlX2FjayhnbXUsICZyZXNwKTsKKwkJZWxzZSBpZiAoaWQg PT0gSEZJX0YySF9NU0dfRVJST1IpCisJCQlhNnh4X2hmaV9oYW5kbGVfZXJyb3IoZ211LCAmcmVz cCk7CisJfQorfQorCitzdGF0aWMgaW50IGE2eHhfaGZpX3NlbmRfbXNnKHN0cnVjdCBhNnh4X2dt dSAqZ211LCBpbnQgaWQsCisJCXZvaWQgKmRhdGEsIHUzMiBzaXplLCB1MzIgKnBheWxvYWQsIHUz MiBwYXlsb2FkX3NpemUpCit7CisJc3RydWN0IGE2eHhfaGZpX3F1ZXVlICpxdWV1ZSA9ICZnbXUt PnF1ZXVlc1tIRklfQ09NTUFORF9RVUVVRV07CisJc3RydWN0IGE2eHhfaGZpX3Jlc3BvbnNlIHJl c3AgPSB7IDAgfTsKKwlpbnQgcmV0LCBkd29yZHMgPSBzaXplID4+IDI7CisJdTMyIHNlcW51bTsK KworCXNlcW51bSA9IGF0b21pY19pbmNfcmV0dXJuKCZxdWV1ZS0+c2VxbnVtKSAlIDB4ZmZmOwor CisJLyogRmlyc3QgZHdvcmQgb2YgdGhlIG1lc3NhZ2UgaXMgdGhlIG1lc3NhZ2UgaGVhZGVyIC0g ZmlsbCBpdCBpbiAqLworCSooKHUzMiAqKSBkYXRhKSA9IChzZXFudW0gPDwgMjApIHwgKEhGSV9N U0dfQ01EIDw8IDE2KSB8CisJCShkd29yZHMgPDwgOCkgfCBpZDsKKworCWluaXRfY29tcGxldGlv bigmcmVzcC5jb21wbGV0ZSk7CisJcmVzcC5pZCA9IGlkOworCXJlc3Auc2VxbnVtID0gc2VxbnVt OworCisJc3Bpbl9sb2NrX2JoKCZoZmlfYWNrX2xvY2spOworCWxpc3RfYWRkX3RhaWwoJnJlc3Au bm9kZSwgJmhmaV9hY2tfbGlzdCk7CisJc3Bpbl91bmxvY2tfYmgoJmhmaV9hY2tfbG9jayk7CisK KwlyZXQgPSBhNnh4X2hmaV9xdWV1ZV93cml0ZShnbXUsIHF1ZXVlLCBkYXRhLCBkd29yZHMpOwor CWlmIChyZXQpIHsKKwkJZGV2X2VycihnbXUtPmRldiwgIlVuYWJsZSB0byBzZW5kIG1lc3NhZ2Ug JXMgaWQgJWRcbiIsCisJCQlhNnh4X2hmaV9tc2dfaWRbaWRdLCBzZXFudW0pOworCQlnb3RvIG91 dDsKKwl9CisKKwkvKiBXYWl0IHVwIHRvIDUgc2Vjb25kcyBmb3IgdGhlIHJlc3BvbnNlICovCisJ cmV0ID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZyZXNwLmNvbXBsZXRlLAorCQltc2Vj c190b19qaWZmaWVzKDUwMDApKTsKKwlpZiAoIXJldCkgeworCQlkZXZfZXJyKGdtdS0+ZGV2LAor CQkJIk1lc3NhZ2UgJXMgaWQgJWQgdGltZWQgb3V0IHdhaXRpbmcgZm9yIHJlc3BvbnNlXG4iLAor CQkJYTZ4eF9oZmlfbXNnX2lkW2lkXSwgc2VxbnVtKTsKKwkJcmV0ID0gLUVUSU1FRE9VVDsKKwl9 IGVsc2UKKwkJcmV0ID0gMDsKKworb3V0OgorCXNwaW5fbG9ja19iaCgmaGZpX2Fja19sb2NrKTsK KwlsaXN0X2RlbCgmcmVzcC5ub2RlKTsKKwlzcGluX3VubG9ja19iaCgmaGZpX2Fja19sb2NrKTsK KworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAocmVzcC5lcnJvcikgeworCQlkZXZf ZXJyKGdtdS0+ZGV2LCAiTWVzc2FnZSAlcyBpZCAlZCByZXR1cm5lZCBlcnJvciAlZFxuIiwKKwkJ CWE2eHhfaGZpX21zZ19pZFtpZF0sIHNlcW51bSwgcmVzcC5lcnJvcik7CisJCXJldHVybiAtRUlO VkFMOworCX0KKworCWlmIChwYXlsb2FkICYmIHBheWxvYWRfc2l6ZSkgeworCQlpbnQgY29weSA9 IG1pbl90KHUzMiwgcGF5bG9hZF9zaXplLCBzaXplb2YocmVzcC5wYXlsb2FkKSk7CisKKwkJbWVt Y3B5KHBheWxvYWQsIHJlc3AucGF5bG9hZCwgY29weSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisK K3N0YXRpYyBpbnQgYTZ4eF9oZmlfc2VuZF9nbXVfaW5pdChzdHJ1Y3QgYTZ4eF9nbXUgKmdtdSwg aW50IGJvb3Rfc3RhdGUpCit7CisJc3RydWN0IGE2eHhfaGZpX21zZ19nbXVfaW5pdF9jbWQgbXNn ID0geyAwIH07CisKKwltc2cuZGJnX2J1ZmZlcl9hZGRyID0gKHUzMikgZ211LT5kZWJ1Zy0+aW92 YTsKKwltc2cuZGJnX2J1ZmZlcl9zaXplID0gKHUzMikgZ211LT5kZWJ1Zy0+c2l6ZTsKKwltc2cu Ym9vdF9zdGF0ZSA9IGJvb3Rfc3RhdGU7CisKKwlyZXR1cm4gYTZ4eF9oZmlfc2VuZF9tc2coZ211 LCBIRklfSDJGX01TR19JTklULCAmbXNnLCBzaXplb2YobXNnKSwKKwkJTlVMTCwgMCk7Cit9CisK K3N0YXRpYyBpbnQgYTZ4eF9oZmlfZ2V0X2Z3X3ZlcnNpb24oc3RydWN0IGE2eHhfZ211ICpnbXUs IHUzMiAqdmVyc2lvbikKK3sKKwlzdHJ1Y3QgYTZ4eF9oZmlfbXNnX2Z3X3ZlcnNpb24gbXNnID0g eyAwIH07CisKKwkvKiBDdXJyZW50bHkgc3VwcG9ydGluZyB2ZXJzaW9uIDEuMSAqLworCW1zZy5z dXBwb3J0ZWRfdmVyc2lvbiA9ICgxIDw8IDI4KSB8ICgxIDw8IDE2KTsKKworCXJldHVybiBhNnh4 X2hmaV9zZW5kX21zZyhnbXUsIEhGSV9IMkZfTVNHX0ZXX1ZFUlNJT04sICZtc2csIHNpemVvZiht c2cpLAorCQl2ZXJzaW9uLCBzaXplb2YoKnZlcnNpb24pKTsKK30KKworc3RhdGljIGludCBhNnh4 X2hmaV9zZW5kX3BlcmZfdGFibGUoc3RydWN0IGE2eHhfZ211ICpnbXUpCit7CisJc3RydWN0IGE2 eHhfaGZpX21zZ19wZXJmX3RhYmxlIG1zZyA9IHsgMCB9OworCWludCBpOworCisJbXNnLm51bV9n cHVfbGV2ZWxzID0gZ211LT5ucl9ncHVfZnJlcXM7CisJbXNnLm51bV9nbXVfbGV2ZWxzID0gZ211 LT5ucl9nbXVfZnJlcXM7CisKKwlmb3IgKGkgPSAwOyBpIDwgZ211LT5ucl9ncHVfZnJlcXM7IGkr KykgeworCQltc2cuZ3hfdm90ZXNbaV0udm90ZSA9IGdtdS0+Z3hfYXJjX3ZvdGVzW2ldOworCQlt c2cuZ3hfdm90ZXNbaV0udm90ZSA9IGdtdS0+Z3B1X2ZyZXFzW2ldIC8gMTAwMDsKKwl9CisKKwlm b3IgKGkgPSAwOyBpIDwgZ211LT5ucl9nbXVfZnJlcXM7IGkrKykgeworCQltc2cuY3hfdm90ZXNb aV0udm90ZSA9IGdtdS0+Y3hfYXJjX3ZvdGVzW2ldOworCQltc2cuY3hfdm90ZXNbaV0udm90ZSA9 IGdtdS0+Z211X2ZyZXFzW2ldIC8gMTAwMDsKKwl9CisKKwlyZXR1cm4gYTZ4eF9oZmlfc2VuZF9t c2coZ211LCBIRklfSDJGX01TR19QRVJGX1RBQkxFLCAmbXNnLCBzaXplb2YobXNnKSwKKwkJTlVM TCwgMCk7Cit9CisKK3N0YXRpYyBpbnQgYTZ4eF9oZmlfc2VuZF9id190YWJsZShzdHJ1Y3QgYTZ4 eF9nbXUgKmdtdSkKK3sKKwlzdHJ1Y3QgYTZ4eF9oZmlfbXNnX2J3X3RhYmxlIG1zZyA9IHsgMCB9 OworCisJLyoKKwkgKiBUaGUgc2RtODQ1IEdNVSBkb2Vzbid0IGRvIGJ1cyBmcmVxdWVuY3kgc2Nh bGluZyBvbiBpdHMgb3duIGJ1dCBpdAorCSAqIGRvZXMgbmVlZCBhdCBsZWFzdCBvbmUgZW50cnkg aW4gdGhlIGxpc3QgYmVjYXVzZSBpdCBtaWdodCBiZSBhY2Nlc3NlZAorCSAqIHdoZW4gdGhlIEdN VSBpcyBzaHV0dGluZyBkb3duLiBTZW5kIGEgc2luZ2xlICJvZmYiIGVudHJ5LgorCSAqLworCisJ bXNnLmJ3X2xldmVsX251bSA9IDE7CisKKwltc2cuZGRyX2NtZHNfbnVtID0gMzsKKwltc2cuZGRy X3dhaXRfYml0bWFzayA9IDB4MDc7CisKKwltc2cuZGRyX2NtZHNfYWRkcnNbMF0gPSAweDUwMDAw OworCW1zZy5kZHJfY21kc19hZGRyc1sxXSA9IDB4NTAwNWM7CisJbXNnLmRkcl9jbWRzX2FkZHJz WzJdID0gMHg1MDAwYzsKKworCW1zZy5kZHJfY21kc19kYXRhWzBdWzBdID0gIDB4NDAwMDAwMDA7 CisJbXNnLmRkcl9jbWRzX2RhdGFbMF1bMV0gPSAgMHg0MDAwMDAwMDsKKwltc2cuZGRyX2NtZHNf ZGF0YVswXVsyXSA9ICAweDQwMDAwMDAwOworCisJLyoKKwkgKiBUaGVzZSBhcmUgdGhlIENYIChD Tk9DKSB2b3Rlcy4gIFRoaXMgaXMgdXNlZCBidXQgdGhlIHZhbHVlcyBmb3IgdGhlCisJICogc2Rt ODQ1IEdNVSBhcmUga25vd24gYW5kIGZpeGVkIHNvIHdlIGNhbiBoYXJkIGNvZGUgdGhlbS4KKwkg Ki8KKworCW1zZy5jbm9jX2NtZHNfbnVtID0gMzsKKwltc2cuY25vY193YWl0X2JpdG1hc2sgPSAw eDA1OworCisJbXNnLmNub2NfY21kc19hZGRyc1swXSA9IDB4NTAwMzQ7CisJbXNnLmNub2NfY21k c19hZGRyc1sxXSA9IDB4NTAwN2M7CisJbXNnLmNub2NfY21kc19hZGRyc1syXSA9IDB4NTAwNGM7 CisKKwltc2cuY25vY19jbWRzX2RhdGFbMF1bMF0gPSAgMHg0MDAwMDAwMDsKKwltc2cuY25vY19j bWRzX2RhdGFbMF1bMV0gPSAgMHgwMDAwMDAwMDsKKwltc2cuY25vY19jbWRzX2RhdGFbMF1bMl0g PSAgMHg0MDAwMDAwMDsKKworCW1zZy5jbm9jX2NtZHNfZGF0YVsxXVswXSA9ICAweDYwMDAwMDAx OworCW1zZy5jbm9jX2NtZHNfZGF0YVsxXVsxXSA9ICAweDIwMDAwMDAxOworCW1zZy5jbm9jX2Nt ZHNfZGF0YVsxXVsyXSA9ICAweDYwMDAwMDAxOworCisJcmV0dXJuIGE2eHhfaGZpX3NlbmRfbXNn KGdtdSwgSEZJX0gyRl9NU0dfQldfVEFCTEUsICZtc2csIHNpemVvZihtc2cpLAorCQlOVUxMLCAw KTsKK30KKworc3RhdGljIGludCBhNnh4X2hmaV9zZW5kX3Rlc3Qoc3RydWN0IGE2eHhfZ211ICpn bXUpCit7CisJc3RydWN0IGE2eHhfaGZpX21zZ190ZXN0IG1zZyA9IHsgMCB9OworCisJcmV0dXJu IGE2eHhfaGZpX3NlbmRfbXNnKGdtdSwgSEZJX0gyRl9NU0dfVEVTVCwgJm1zZywgc2l6ZW9mKG1z ZyksCisJCU5VTEwsIDApOworfQorCitpbnQgYTZ4eF9oZmlfc3RhcnQoc3RydWN0IGE2eHhfZ211 ICpnbXUsIGludCBib290X3N0YXRlKQoreworCWludCByZXQ7CisKKwlyZXQgPSBhNnh4X2hmaV9z ZW5kX2dtdV9pbml0KGdtdSwgYm9vdF9zdGF0ZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsK KworCXJldCA9IGE2eHhfaGZpX2dldF9md192ZXJzaW9uKGdtdSwgTlVMTCk7CisJaWYgKHJldCkK KwkJcmV0dXJuIHJldDsKKworCS8qCisJICogV2UgaGF2ZSB0byBnZXQgZXhjaGFuZ2UgdmVyc2lv biBudW1iZXJzIHBlciB0aGUgc2VxdWVuY2UgYnV0IGF0IHRoaXMKKwkgKiBwb2ludCB0aCBrZXJu ZWwgZHJpdmVyIGRvZXNuJ3QgbmVlZCB0byBrbm93IHRoZSBleGFjdCB2ZXJzaW9uIG9mCisJICog dGhlIEdNVSBmaXJtd2FyZQorCSAqLworCisJcmV0ID0gYTZ4eF9oZmlfc2VuZF9wZXJmX3RhYmxl KGdtdSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGE2eHhfaGZpX3NlbmRf YndfdGFibGUoZ211KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyoKKwkgKiBMZXQg dGhlIEdNVSBrbm93IHRoYXQgdGhlcmUgd29uJ3QgYmUgYW55IG1vcmUgSEZJIG1lc3NhZ2VzIHVu dGlsIG5leHQKKwkgKiBib290CisJICovCisJYTZ4eF9oZmlfc2VuZF90ZXN0KGdtdSk7CisKKwly ZXR1cm4gMDsKK30KKwordm9pZCBhNnh4X2hmaV9zdG9wKHN0cnVjdCBhNnh4X2dtdSAqZ211KQor eworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZ211LT5xdWV1ZXMpOyBp KyspIHsKKwkJc3RydWN0IGE2eHhfaGZpX3F1ZXVlICpxdWV1ZSA9ICZnbXUtPnF1ZXVlc1tpXTsK KworCQlpZiAoIXF1ZXVlLT5oZWFkZXIpCisJCQljb250aW51ZTsKKworCQlpZiAocXVldWUtPmhl YWRlci0+cmVhZF9pbmRleCAhPSBxdWV1ZS0+aGVhZGVyLT53cml0ZV9pbmRleCkKKwkJCWRldl9l cnIoZ211LT5kZXYsICJIRkkgcXVldWUgJWQgaXMgbm90IGVtcHR5XG4iLCBpKTsKKworCQlxdWV1 ZS0+aGVhZGVyLT5yZWFkX2luZGV4ID0gMDsKKwkJcXVldWUtPmhlYWRlci0+d3JpdGVfaW5kZXgg PSAwOworCX0KK30KKworc3RhdGljIHZvaWQgYTZ4eF9oZmlfcXVldWVfaW5pdChzdHJ1Y3QgYTZ4 eF9oZmlfcXVldWUgKnF1ZXVlLAorCQlzdHJ1Y3QgYTZ4eF9oZmlfcXVldWVfaGVhZGVyICpoZWFk ZXIsIHZvaWQgKnZpcnQsIHU2NCBpb3ZhLAorCQl1MzIgaWQpCit7CisJc3Bpbl9sb2NrX2luaXQo JnF1ZXVlLT5sb2NrKTsKKwlxdWV1ZS0+aGVhZGVyID0gaGVhZGVyOworCXF1ZXVlLT5kYXRhID0g dmlydDsKKwlhdG9taWNfc2V0KCZxdWV1ZS0+c2VxbnVtLCAwKTsKKworCS8qIFNldCB1cCB0aGUg c2hhcmVkIG1lbW9yeSBoZWFkZXIgKi8KKwloZWFkZXItPmlvdmEgPSBpb3ZhOworCWhlYWRlci0+ dHlwZSA9ICAxMCA8PCA4IHwgaWQ7CisJaGVhZGVyLT5zdGF0dXMgPSAxOworCWhlYWRlci0+c2l6 ZSA9IFNaXzRLID4+IDI7CisJaGVhZGVyLT5tc2dfc2l6ZSA9IDA7CisJaGVhZGVyLT5kcm9wcGVk ID0gMDsKKwloZWFkZXItPnJ4X3dhdGVybWFyayA9IDE7CisJaGVhZGVyLT50eF93YXRlcm1hcmsg PSAxOworCWhlYWRlci0+cnhfcmVxdWVzdCA9IDE7CisJaGVhZGVyLT50eF9yZXF1ZXN0ID0gMDsK KwloZWFkZXItPnJlYWRfaW5kZXggPSAwOworCWhlYWRlci0+d3JpdGVfaW5kZXggPSAwOworfQor Cit2b2lkIGE2eHhfaGZpX2luaXQoc3RydWN0IGE2eHhfZ211ICpnbXUpCit7CisJc3RydWN0IGE2 eHhfZ211X2JvICpoZmkgPSBnbXUtPmhmaTsKKwlzdHJ1Y3QgYTZ4eF9oZmlfcXVldWVfdGFibGVf aGVhZGVyICp0YWJsZSA9IGhmaS0+dmlydDsKKwlzdHJ1Y3QgYTZ4eF9oZmlfcXVldWVfaGVhZGVy ICpoZWFkZXJzID0gaGZpLT52aXJ0ICsgc2l6ZW9mKCp0YWJsZSk7CisJdTY0IG9mZnNldDsKKwlp bnQgdGFibGVfc2l6ZTsKKworCS8qCisJICogVGhlIHRhYmxlIHNpemUgaXMgdGhlIHNpemUgb2Yg dGhlIHRhYmxlIGhlYWRlciBwbHVzIGFsbCBvZiB0aGUgcXVldWUKKwkgKiBoZWFkZXJzCisJICov CisJdGFibGVfc2l6ZSA9IHNpemVvZigqdGFibGUpOworCXRhYmxlX3NpemUgKz0gKEFSUkFZX1NJ WkUoZ211LT5xdWV1ZXMpICoKKwkJc2l6ZW9mKHN0cnVjdCBhNnh4X2hmaV9xdWV1ZV9oZWFkZXIp KTsKKworCXRhYmxlLT52ZXJzaW9uID0gMDsKKwl0YWJsZS0+c2l6ZSA9IHRhYmxlX3NpemU7CisJ LyogRmlyc3QgcXVldWUgaGVhZGVyIGlzIGxvY2F0ZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIHRh YmxlIGhlYWRlciAqLworCXRhYmxlLT5xaGRyMF9vZmZzZXQgPSBzaXplb2YoKnRhYmxlKSA+PiAy OworCXRhYmxlLT5xaGRyX3NpemUgPSBzaXplb2Yoc3RydWN0IGE2eHhfaGZpX3F1ZXVlX2hlYWRl cikgPj4gMjsKKwl0YWJsZS0+bnVtX3F1ZXVlcyA9IEFSUkFZX1NJWkUoZ211LT5xdWV1ZXMpOwor CXRhYmxlLT5hY3RpdmVfcXVldWVzID0gQVJSQVlfU0laRShnbXUtPnF1ZXVlcyk7CisKKwkvKiBD b21tYW5kIHF1ZXVlICovCisJb2Zmc2V0ID0gU1pfNEs7CisJYTZ4eF9oZmlfcXVldWVfaW5pdCgm Z211LT5xdWV1ZXNbMF0sICZoZWFkZXJzWzBdLCBoZmktPnZpcnQgKyBvZmZzZXQsCisJCWhmaS0+ aW92YSArIG9mZnNldCwgMCk7CisKKwkvKiBHTVUgcmVzcG9uc2UgcXVldWUgKi8KKwlvZmZzZXQg Kz0gU1pfNEs7CisJYTZ4eF9oZmlfcXVldWVfaW5pdCgmZ211LT5xdWV1ZXNbMV0sICZoZWFkZXJz WzFdLCBoZmktPnZpcnQgKyBvZmZzZXQsCisJCWhmaS0+aW92YSArIG9mZnNldCwgNCk7Cit9CmRp ZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL2FkcmVuby9hNnh4X2hmaS5oIGIvZHJpdmVy cy9ncHUvZHJtL21zbS9hZHJlbm8vYTZ4eF9oZmkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl eCAwMDAwMDAwMDAwMDAuLjYwZDEzMTlmYTQ0ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMv Z3B1L2RybS9tc20vYWRyZW5vL2E2eHhfaGZpLmgKQEAgLTAsMCArMSwxMjcgQEAKKy8qIFNQRFgt TGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wICovCisvKiBDb3B5cmlnaHQgKGMpIDIwMTcgVGhl IExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuICovCisKKyNpZm5kZWYgX0E2 WFhfSEZJX0hfCisjZGVmaW5lIF9BNlhYX0hGSV9IXworCitzdHJ1Y3QgYTZ4eF9oZmlfcXVldWVf dGFibGVfaGVhZGVyIHsKKwl1MzIgdmVyc2lvbjsKKwl1MzIgc2l6ZTsJCS8qIFNpemUgb2YgdGhl IHF1ZXVlIHRhYmxlIGluIGR3b3JkcyAqLworCXUzMiBxaGRyMF9vZmZzZXQ7CS8qIE9mZnNldCBv ZiB0aGUgZmlyc3QgcXVldWUgaGVhZGVyICovCisJdTMyIHFoZHJfc2l6ZTsJCS8qIFNpemUgb2Yg dGhlIHF1ZXVlIGhlYWRlcnMgKi8KKwl1MzIgbnVtX3F1ZXVlczsJCS8qIE51bWJlciBvZiB0b3Rh bCBxdWV1ZXMgKi8KKwl1MzIgYWN0aXZlX3F1ZXVlczsJLyogTnVtYmVyIG9mIGFjdGl2ZSBxdWV1 ZXMgKi8KK307CisKK3N0cnVjdCBhNnh4X2hmaV9xdWV1ZV9oZWFkZXIgeworCXUzMiBzdGF0dXM7 CisJdTMyIGlvdmE7CisJdTMyIHR5cGU7CisJdTMyIHNpemU7CisJdTMyIG1zZ19zaXplOworCXUz MiBkcm9wcGVkOworCXUzMiByeF93YXRlcm1hcms7CisJdTMyIHR4X3dhdGVybWFyazsKKwl1MzIg cnhfcmVxdWVzdDsKKwl1MzIgdHhfcmVxdWVzdDsKKwl1MzIgcmVhZF9pbmRleDsKKwl1MzIgd3Jp dGVfaW5kZXg7Cit9OworCitzdHJ1Y3QgYTZ4eF9oZmlfcXVldWUgeworCXN0cnVjdCBhNnh4X2hm aV9xdWV1ZV9oZWFkZXIgKmhlYWRlcjsKKwlzcGlubG9ja190IGxvY2s7CisJdTMyICpkYXRhOwor CWF0b21pY190IHNlcW51bTsKK307CisKKy8qIFRoaXMgaXMgdGhlIG91dGdvaW5nIHF1ZXVlIHRv IHRoZSBHTVUgKi8KKyNkZWZpbmUgSEZJX0NPTU1BTkRfUVVFVUUgMAorCisvKiBUSGlzIGlzIHRo ZSBpbmNvbWluZyByZXNwb25zZSBxdWV1ZSBmcm9tIHRoZSBHTVUgKi8KKyNkZWZpbmUgSEZJX1JF U1BPTlNFX1FVRVVFIDEKKworI2RlZmluZSBIRklfSEVBREVSX0lEKG1zZykgKChtc2cpICYgMHhm ZikKKyNkZWZpbmUgSEZJX0hFQURFUl9TSVpFKG1zZykgKCgobXNnKSA+PiA4KSAmIDB4ZmYpCisj ZGVmaW5lIEhGSV9IRUFERVJfU0VRTlVNKG1zZykgKCgobXNnKSA+PiAyMCkgJiAweGZmZikKKwor LyogRklYTUU6IERvIHdlIG5lZWQgdGhpcyBvciBjYW4gd2UgdXNlIEFSUkFZX1NJWkU/ICovCisj ZGVmaW5lIEhGSV9SRVNQT05TRV9QQVlMT0FEX1NJWkUgMTYKKworLyogSEZJIG1lc3NhZ2UgdHlw ZXMgKi8KKworI2RlZmluZSBIRklfTVNHX0NNRCAwCisjZGVmaW5lIEhGSV9NU0dfQUNLIDIKKwor I2RlZmluZSBIRklfRjJIX01TR19BQ0sgMTI2CisKK3N0cnVjdCBhNnh4X2hmaV9tc2dfcmVzcG9u c2UgeworCXUzMiBoZWFkZXI7CisJdTMyIHJldF9oZWFkZXI7CisJdTMyIGVycm9yOworCXUzMiBw YXlsb2FkW0hGSV9SRVNQT05TRV9QQVlMT0FEX1NJWkVdOworfTsKKworI2RlZmluZSBIRklfRjJI X01TR19FUlJPUiAxMDAKKworc3RydWN0IGE2eHhfaGZpX21zZ19lcnJvciB7CisJdTMyIGhlYWRl cjsKKwl1MzIgY29kZTsKKwl1MzIgcGF5bG9hZFsyXTsKK307CisKKyNkZWZpbmUgSEZJX0gyRl9N U0dfSU5JVCAwCisKK3N0cnVjdCBhNnh4X2hmaV9tc2dfZ211X2luaXRfY21kIHsKKwl1MzIgaGVh ZGVyOworCXUzMiBzZWdfaWQ7CisJdTMyIGRiZ19idWZmZXJfYWRkcjsKKwl1MzIgZGJnX2J1ZmZl cl9zaXplOworCXUzMiBib290X3N0YXRlOworfTsKKworI2RlZmluZSBIRklfSDJGX01TR19GV19W RVJTSU9OIDEKKworc3RydWN0IGE2eHhfaGZpX21zZ19md192ZXJzaW9uIHsKKwl1MzIgaGVhZGVy OworCXUzMiBzdXBwb3J0ZWRfdmVyc2lvbjsKK307CisKKyNkZWZpbmUgSEZJX0gyRl9NU0dfUEVS Rl9UQUJMRSA0CisKK3N0cnVjdCBwZXJmX2xldmVsIHsKKwl1MzIgdm90ZTsKKwl1MzIgZnJlcTsK K307CisKK3N0cnVjdCBhNnh4X2hmaV9tc2dfcGVyZl90YWJsZSB7CisJdTMyIGhlYWRlcjsKKwl1 MzIgbnVtX2dwdV9sZXZlbHM7CisJdTMyIG51bV9nbXVfbGV2ZWxzOworCisJc3RydWN0IHBlcmZf bGV2ZWwgZ3hfdm90ZXNbMTZdOworCXN0cnVjdCBwZXJmX2xldmVsIGN4X3ZvdGVzWzRdOworfTsK KworI2RlZmluZSBIRklfSDJGX01TR19CV19UQUJMRSAzCisKK3N0cnVjdCBhNnh4X2hmaV9tc2df YndfdGFibGUgeworCXUzMiBoZWFkZXI7CisJdTMyIGJ3X2xldmVsX251bTsKKwl1MzIgY25vY19j bWRzX251bTsKKwl1MzIgZGRyX2NtZHNfbnVtOworCXUzMiBjbm9jX3dhaXRfYml0bWFzazsKKwl1 MzIgZGRyX3dhaXRfYml0bWFzazsKKwl1MzIgY25vY19jbWRzX2FkZHJzWzZdOworCXUzMiBjbm9j X2NtZHNfZGF0YVsyXVs2XTsKKwl1MzIgZGRyX2NtZHNfYWRkcnNbOF07CisJdTMyIGRkcl9jbWRz X2RhdGFbMTZdWzhdOworfTsKKworI2RlZmluZSBIRklfSDJGX01TR19URVNUIDUKKworc3RydWN0 IGE2eHhfaGZpX21zZ190ZXN0IHsKKwl1MzIgaGVhZGVyOworfTsKKworI2VuZGlmCmRpZmYgLS1n aXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL2FkcmVuby9hZHJlbm9fZGV2aWNlLmMgYi9kcml2ZXJz L2dwdS9kcm0vbXNtL2FkcmVuby9hZHJlbm9fZGV2aWNlLmMKaW5kZXggMzc3NDZmMWQ1NGNmLi43 ZDNlOWExMjlhYzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tc20vYWRyZW5vL2FkcmVu b19kZXZpY2UuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2FkcmVuby9hZHJlbm9fZGV2aWNl LmMKQEAgLTExMSw2ICsxMTEsMTYgQEAgc3RhdGljIGNvbnN0IHN0cnVjdCBhZHJlbm9faW5mbyBn cHVsaXN0W10gPSB7CiAJCQlBRFJFTk9fUVVJUktfRkFVTFRfREVURUNUX01BU0ssCiAJCS5pbml0 ID0gYTV4eF9ncHVfaW5pdCwKIAkJLnphcGZ3ID0gImE1MzBfemFwLm1kdCIsCisJfSwgeworCQku cmV2ID0gQURSRU5PX1JFVig2LCAzLCAwLCBBTllfSUQpLAorCQkucmV2biA9IDYzMCwKKwkJLm5h bWUgPSAiQTYzMCIsCisJCS5mdyA9IHsKKwkJCVtBRFJFTk9fRldfU1FFXSA9ICJhNjMwX3NxZS5m dyIsCisJCQlbQURSRU5PX0ZXX0dNVV0gPSAiYTYzMF9nbXUuYmluIiwKKwkJfSwKKwkJLmdtZW0g PSBTWl8xTSwKKwkJLmluaXQgPSBhNnh4X2dwdV9pbml0LAogCX0sCiB9OwogCkBAIC0xMjcsNiAr MTM3LDggQEAgTU9EVUxFX0ZJUk1XQVJFKCJxY29tL2E1MzBfemFwLm1kdCIpOwogTU9EVUxFX0ZJ Uk1XQVJFKCJxY29tL2E1MzBfemFwLmIwMCIpOwogTU9EVUxFX0ZJUk1XQVJFKCJxY29tL2E1MzBf emFwLmIwMSIpOwogTU9EVUxFX0ZJUk1XQVJFKCJxY29tL2E1MzBfemFwLmIwMiIpOworTU9EVUxF X0ZJUk1XQVJFKCJxY29tL2E2MzBfc3FlLmZ3Iik7CitNT0RVTEVfRklSTVdBUkUoInFjb20vYTYz MF9nbXUuYmluIik7CiAKIHN0YXRpYyBpbmxpbmUgYm9vbCBfcmV2X21hdGNoKHVpbnQ4X3QgZW50 cnksIHVpbnQ4X3QgaWQpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL2FkcmVu by9hZHJlbm9fZ3B1LmggYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2FkcmVuby9hZHJlbm9fZ3B1LmgK aW5kZXggODEzOTc5MzVkODQ3Li4xYThhMWQ2YWM5OWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1 L2RybS9tc20vYWRyZW5vL2FkcmVub19ncHUuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2Fk cmVuby9hZHJlbm9fZ3B1LmgKQEAgLTUwLDcgKzUwLDkgQEAgZW51bSBhZHJlbm9fcmVncyB7CiAK IGVudW0gewogCUFEUkVOT19GV19QTTQgPSAwLAorCUFEUkVOT19GV19TUUUgPSAwLCAvKiBhNnh4 ICovCiAJQURSRU5PX0ZXX1BGUCA9IDEsCisJQURSRU5PX0ZXX0dNVSA9IDEsIC8qIGE2eHggKi8K IAlBRFJFTk9fRldfR1BNVSA9IDIsCiAJQURSRU5PX0ZXX01BWCwKIH07CkBAIC0zMjksNiArMzMx LDcgQEAgc3RhdGljIGlubGluZSB2b2lkIGFkcmVub19ncHVfd3JpdGUoc3RydWN0IGFkcmVub19n cHUgKmdwdSwKIHN0cnVjdCBtc21fZ3B1ICphM3h4X2dwdV9pbml0KHN0cnVjdCBkcm1fZGV2aWNl ICpkZXYpOwogc3RydWN0IG1zbV9ncHUgKmE0eHhfZ3B1X2luaXQoc3RydWN0IGRybV9kZXZpY2Ug KmRldik7CiBzdHJ1Y3QgbXNtX2dwdSAqYTV4eF9ncHVfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAq ZGV2KTsKK3N0cnVjdCBtc21fZ3B1ICphNnh4X2dwdV9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpk ZXYpOwogCiBzdGF0aWMgaW5saW5lIHZvaWQgYWRyZW5vX2dwdV93cml0ZTY0KHN0cnVjdCBhZHJl bm9fZ3B1ICpncHUsCiAJCWVudW0gYWRyZW5vX3JlZ3MgbG8sIGVudW0gYWRyZW5vX3JlZ3MgaGks IHU2NCBkYXRhKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9tc21fZ3B1LmMgYi9k cml2ZXJzL2dwdS9kcm0vbXNtL21zbV9ncHUuYwppbmRleCA4Mjc2NDRmMGUxYTcuLjg1M2ViNWYx NjFlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL21zbS9tc21fZ3B1LmMKKysrIGIvZHJp dmVycy9ncHUvZHJtL21zbS9tc21fZ3B1LmMKQEAgLTg3LDcgKzg3LDcgQEAgc3RhdGljIHN0cnVj dCBkZXZmcmVxX2Rldl9wcm9maWxlIG1zbV9kZXZmcmVxX3Byb2ZpbGUgPSB7CiBzdGF0aWMgdm9p ZCBtc21fZGV2ZnJlcV9pbml0KHN0cnVjdCBtc21fZ3B1ICpncHUpCiB7CiAJLyogV2UgbmVlZCB0 YXJnZXQgc3VwcG9ydCB0byBkbyBkZXZmcmVxICovCi0JaWYgKCFncHUtPmZ1bmNzLT5ncHVfYnVz eSkKKwlpZiAoIWdwdS0+ZnVuY3MtPmdwdV9idXN5IHx8ICFncHUtPmNvcmVfY2xrKQogCQlyZXR1 cm47CiAKIAltc21fZGV2ZnJlcV9wcm9maWxlLmluaXRpYWxfZnJlcSA9IGdwdS0+ZmFzdF9yYXRl OwotLSAKMi4xNy4xCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fXwpGcmVlZHJlbm8gbWFpbGluZyBsaXN0CkZyZWVkcmVub0BsaXN0cy5mcmVlZGVza3RvcC5v cmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9mcmVlZHJl bm8K