From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jordan Crouse Subject: [PATCH 2/2] drm/msm/adreno: Add A6XX device support Date: Wed, 31 Jan 2018 11:25:50 -0700 Message-ID: <1517423150-19209-3-git-send-email-jcrouse@codeaurora.org> References: <1517423150-19209-1-git-send-email-jcrouse@codeaurora.org> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <1517423150-19209-1-git-send-email-jcrouse@codeaurora.org> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: freedreno@lists.freedesktop.org Cc: linux-arm-msm@vger.kernel.org, dri-devel@lists.freedesktop.org List-Id: linux-arm-msm@vger.kernel.org QWRkIHN1cHBvcnQgZm9yIHRoZSBBNlhYIGZhbWlseSBvZiBBZHJlbm8gR1BVcy4gVGhlIGJpZ2dl c3QgYWRkaXRpb24KaXMgdGhlIEdNVSAoR3JhcGhpY3MgTWFuYWdlbWVudCBVbml0KSB3aGljaCB0 YWtlcyBvdmVyIG1vc3Qgb2YgdGhlCnBvd2VyIG1hbmFnZW1lbnQgb2YgdGhlIEdQVSBpdHNlbGYg YnV0IGluIGEgaXJvbmljIHR3aXN0IG9mIGZhdGUKbmVlZHMgYSBnb29kbHkgYW1vdW50IG9mIG1h bmFnZW1lbnQgaXRzZWxmLiBBZGQgc3VwcG9ydCBmb3IgdGhlCkE2WFggY29yZSBjb2RlLCB0aGUg R01VIGFuZCB0aGUgSEZJIChoYXJkd2FyZSBmaXJtd2FyZSBpbnRlcmZhY2UpCnF1ZXVlIHRoYXQg dGhlIENQVSB1c2VzIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIEdNVS4KClNpZ25lZC1vZmYtYnk6 IEpvcmRhbiBDcm91c2UgPGpjcm91c2VAY29kZWF1cm9yYS5vcmc+Ci0tLQogZHJpdmVycy9ncHUv ZHJtL21zbS9NYWtlZmlsZSAgICAgICAgICAgICAgIHwgICAgMyArCiBkcml2ZXJzL2dwdS9kcm0v bXNtL2FkcmVuby9hNnh4X2dtdS5jICAgICAgfCAxMjIwICsrKysrKysrKysrKysrKysrKysrKysr KysrKysKIGRyaXZlcnMvZ3B1L2RybS9tc20vYWRyZW5vL2E2eHhfZ211LmggICAgICB8ICAxNzQg KysrKwogZHJpdmVycy9ncHUvZHJtL21zbS9hZHJlbm8vYTZ4eF9ncHUuYyAgICAgIHwgIDgxOSAr KysrKysrKysrKysrKysrKysrCiBkcml2ZXJzL2dwdS9kcm0vbXNtL2FkcmVuby9hNnh4X2dwdS5o ICAgICAgfCAgIDY5ICsrCiBkcml2ZXJzL2dwdS9kcm0vbXNtL2FkcmVuby9hNnh4X2hmaS5jICAg ICAgfCAgNDQ4ICsrKysrKysrKysKIGRyaXZlcnMvZ3B1L2RybS9tc20vYWRyZW5vL2E2eHhfaGZp LmggICAgICB8ICAxMzcgKysrKwogZHJpdmVycy9ncHUvZHJtL21zbS9hZHJlbm8vYWRyZW5vX2Rl dmljZS5jIHwgICAxMSArCiBkcml2ZXJzL2dwdS9kcm0vbXNtL2FkcmVuby9hZHJlbm9fZ3B1Lmgg ICAgfCAgICAyICstCiBkcml2ZXJzL2dwdS9kcm0vbXNtL21zbV9ncHUuYyAgICAgICAgICAgICAg fCAgICAyICstCiAxMCBmaWxlcyBjaGFuZ2VkLCAyODgzIGluc2VydGlvbnMoKyksIDIgZGVsZXRp b25zKC0pCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL21zbS9hZHJlbm8vYTZ4 eF9nbXUuYwogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1L2RybS9tc20vYWRyZW5vL2E2 eHhfZ211LmgKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dwdS9kcm0vbXNtL2FkcmVuby9h Nnh4X2dwdS5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL21zbS9hZHJlbm8v YTZ4eF9ncHUuaAogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1L2RybS9tc20vYWRyZW5v L2E2eHhfaGZpLmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dwdS9kcm0vbXNtL2FkcmVu by9hNnh4X2hmaS5oCgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9NYWtlZmlsZSBi L2RyaXZlcnMvZ3B1L2RybS9tc20vTWFrZWZpbGUKaW5kZXggOTJiMzg0NC4uMDAzM2E1ZCAxMDA2 NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL21zbS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2dwdS9k cm0vbXNtL01ha2VmaWxlCkBAIC0xMCw2ICsxMCw5IEBAIG1zbS15IDo9IFwKIAlhZHJlbm8vYTV4 eF9ncHUubyBcCiAJYWRyZW5vL2E1eHhfcG93ZXIubyBcCiAJYWRyZW5vL2E1eHhfcHJlZW1wdC5v IFwKKwlhZHJlbm8vYTZ4eF9ncHUubyBcCisJYWRyZW5vL2E2eHhfZ211Lm8gXAorCWFkcmVuby9h Nnh4X2hmaS5vIFwKIAloZG1pL2hkbWkubyBcCiAJaGRtaS9oZG1pX2F1ZGlvLm8gXAogCWhkbWkv aGRtaV9icmlkZ2UubyBcCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL2FkcmVuby9h Nnh4X2dtdS5jIGIvZHJpdmVycy9ncHUvZHJtL21zbS9hZHJlbm8vYTZ4eF9nbXUuYwpuZXcgZmls ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzYxMTQ0Ci0tLSAvZGV2L251bGwKKysrIGIv ZHJpdmVycy9ncHUvZHJtL21zbS9hZHJlbm8vYTZ4eF9nbXUuYwpAQCAtMCwwICsxLDEyMjAgQEAK Ky8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmln aHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3Ug Y2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMg b2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkg dmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgor ICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdp bGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4g dGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZP UiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBM aWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jbGsu aD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9vcHAuaD4K KyNpbmNsdWRlIDxzb2MvcWNvbS9jbWQtZGIuaD4KKworI2luY2x1ZGUgImE2eHhfZ3B1LmgiCisj aW5jbHVkZSAiYTZ4eF9nbXUueG1sLmgiCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBhNnh4X2dtdV9p cnEoaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgYTZ4eF9nbXUgKmdtdSA9IGRhdGE7 CisJdTMyIHN0YXR1czsKKworCXN0YXR1cyA9IGdtdV9yZWFkKGdtdSwgUkVHX0E2WFhfR01VX0FP X0hPU1RfSU5URVJSVVBUX1NUQVRVUyk7CisJZ211X3dyaXRlKGdtdSwgUkVHX0E2WFhfR01VX0FP X0hPU1RfSU5URVJSVVBUX0NMUiwgc3RhdHVzKTsKKworCWlmIChzdGF0dXMgJiBBNlhYX0dNVV9B T19IT1NUX0lOVEVSUlVQVF9TVEFUVVNfV0RPR19CSVRFKSB7CisJCWRldl9lcnJfcmF0ZWxpbWl0 ZWQoZ211LT5kZXYsICJHTVUgd2F0Y2hkb2cgZXhwaXJlZFxuIik7CisKKwkJLyogVGVtcG9yYXJ5 IHVudGlsIHdlIGNhbiByZWNvdmVyIHNhZmVseSAqLworCQlCVUcoKTsKKwl9CisKKwlpZiAoc3Rh dHVzICYgIEE2WFhfR01VX0FPX0hPU1RfSU5URVJSVVBUX1NUQVRVU19IT1NUX0FIQl9CVVNfRVJS T1IpCisJCWRldl9lcnJfcmF0ZWxpbWl0ZWQoZ211LT5kZXYsICJHTVUgQUhCIGJ1cyBlcnJvclxu Iik7CisKKwlpZiAoc3RhdHVzICYgQTZYWF9HTVVfQU9fSE9TVF9JTlRFUlJVUFRfU1RBVFVTX0ZF TkNFX0VSUikKKwkJZGV2X2Vycl9yYXRlbGltaXRlZChnbXUtPmRldiwgIkdNVSBmZW5jZSBlcnJv cjogMHgleFxuIiwKKwkJCWdtdV9yZWFkKGdtdSwgUkVHX0E2WFhfR01VX0FIQl9GRU5DRV9TVEFU VVMpKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGlycXJldHVybl90IGE2 eHhfaGZpX2lycShpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBhNnh4X2dtdSAqZ211 ID0gZGF0YTsKKwl1MzIgc3RhdHVzOworCisJc3RhdHVzID0gZ211X3JlYWQoZ211LCBSRUdfQTZY WF9HTVVfR01VMkhPU1RfSU5UUl9JTkZPKTsKKwlnbXVfd3JpdGUoZ211LCBSRUdfQTZYWF9HTVVf R01VMkhPU1RfSU5UUl9DTFIsIHN0YXR1cyk7CisKKwlpZiAoc3RhdHVzICYgQTZYWF9HTVVfR01V MkhPU1RfSU5UUl9JTkZPX01TR1EpCisJCXRhc2tsZXRfc2NoZWR1bGUoJmdtdS0+aGZpX3Rhc2ts ZXQpOworCisJaWYgKHN0YXR1cyAmIEE2WFhfR01VX0dNVTJIT1NUX0lOVFJfSU5GT19DTTNfRkFV TFQpIHsKKwkJZGV2X2Vycl9yYXRlbGltaXRlZChnbXUtPmRldiwgIkdNVSBmaXJtd2FyZSBmYXVs dFxuIik7CisKKwkJLyogVGVtcG9yYXJ5IHVudGlsIHdlIGNhbiByZWNvdmVyIHNhZmVseSAqLwor CQlCVUcoKTsKKwl9CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qIENoZWNrIHRvIHNl ZSBpZiB0aGUgR1ggcmFpbCBpcyBzdGlsbCBwb3dlcmVkICovCitzdGF0aWMgYm9vbCBhNnh4X2dt dV9neF9pc19vbihzdHJ1Y3QgYTZ4eF9nbXUgKmdtdSkKK3sKKwl1MzIgdmFsICA9IGdtdV9yZWFk KGdtdSwgUkVHX0E2WFhfR01VX1NQVFBSQUNfUFdSX0NMS19TVEFUVVMpOworCisJcmV0dXJuICEo dmFsICYKKwkJKEE2WFhfR01VX1NQVFBSQUNfUFdSX0NMS19TVEFUVVNfU1BUUFJBQ19HRFNDX1BP V0VSX09GRiB8CisJCUE2WFhfR01VX1NQVFBSQUNfUFdSX0NMS19TVEFUVVNfR1hfSE1fQ0xLX09G RikpOworfQorCisjZGVmaW5lIEdYX09GRl9NQVNLIFwKKwkoQTZYWF9HTVVfU1BUUFJBQ19QV1Jf Q0xLX1NUQVRVU19TUFRQUkFDX0dEU0NfUE9XRVJfT0ZGCXwgXAorCSBBNlhYX0dNVV9TUFRQUkFD X1BXUl9DTEtfU1RBVFVTX0dYX0hNX0NMS19PRkYpCisKK3N0YXRpYyBib29sIGE2eHhfZ211X2No ZWNrX2lkbGVfbGV2ZWwoc3RydWN0IGE2eHhfZ211ICpnbXUpCit7CisJdTMyIHZhbDsKKwlpbnQg bG9jYWwgPSBnbXUtPmlkbGVfbGV2ZWw7CisKKwkvKiBTUFRQIGFuZCBJRlBDIGJvdGggcmVwb3J0 IGFzIElGUEMgKi8KKwlpZiAoZ211LT5pZGxlX2xldmVsID09IEdNVV9JRExFX1NUQVRFX1NQVFAp CisJCWxvY2FsID0gR01VX0lETEVfU1RBVEVfSUZQQzsKKworCXZhbCA9IGdtdV9yZWFkKGdtdSwg UkVHX0E2WFhfR1BVX0dNVV9DWF9HTVVfUlBNSF9QT1dFUl9TVEFURSk7CisKKwlpZiAodmFsID09 IGxvY2FsKSB7CisJCWlmIChnbXUtPmlkbGVfbGV2ZWwgIT0gR01VX0lETEVfU1RBVEVfSUZQQyB8 fAorCQkJIWE2eHhfZ211X2d4X2lzX29uKGdtdSkpCisJCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwly ZXR1cm4gZmFsc2U7Cit9CisKKy8qIFdhaXQgZm9yIHRoZSBHTVUgdG8gZ2V0IHRvIGl0cyBtb3N0 IGlkbGUgc3RhdGUgKi8KK2ludCBhNnh4X2dtdV93YWl0X2Zvcl9pZGxlKHN0cnVjdCBhNnh4X2dw dSAqYTZ4eF9ncHUpCit7CisJc3RydWN0IGE2eHhfZ211ICpnbXUgPSAmYTZ4eF9ncHUtPmdtdTsK KworCXJldHVybiBzcGluX3VudGlsKGE2eHhfZ211X2NoZWNrX2lkbGVfbGV2ZWwoZ211KSk7Cit9 CisKK3N0YXRpYyBpbnQgYTZ4eF9nbXVfc3RhcnQoc3RydWN0IGE2eHhfZ211ICpnbXUpCit7CisJ aW50IHJldDsKKwl1MzIgdmFsOworCisJZ211X3dyaXRlKGdtdSwgUkVHX0E2WFhfR01VX0NNM19T WVNSRVNFVCwgMSk7CisJLyogV2FpdCBmb3IgdGhlIG1lbW9yeSB3cml0ZSB0byBwb3N0ICovCisJ d21iKCk7CisJZ211X3dyaXRlKGdtdSwgUkVHX0E2WFhfR01VX0NNM19TWVNSRVNFVCwgMCk7CisK KwlyZXQgPSBnbXVfcG9sbF90aW1lb3V0KGdtdSwgUkVHX0E2WFhfR01VX0NNM19GV19JTklUX1JF U1VMVCwgdmFsLAorCQl2YWwgPT0gMHhiYWJlZmFjZSwgMTAwLCAxMDAwMCk7CisKKwlpZiAocmV0 KQorCQlkZXZfZXJyKGdtdS0+ZGV2LCAiR01VIGZpcm13YXJlIGluaXRhbGl6YXRpb24gdGltZWQg b3V0XG4iKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYTZ4eF9nbXVfaGZpX3N0 YXJ0KHN0cnVjdCBhNnh4X2dtdSAqZ211KQoreworCXUzMiB2YWw7CisJaW50IHJldDsKKworCWdt dV9ybXcoZ211LCBSRUdfQTZYWF9HTVVfR01VMkhPU1RfSU5UUl9NQVNLLAorCQlBNlhYX0dNVV9H TVUySE9TVF9JTlRSX0lORk9fTVNHUSwgMCk7CisKKwlnbXVfd3JpdGUoZ211LCBSRUdfQTZYWF9H TVVfSEZJX0NUUkxfSU5JVCwgMSk7CisKKwlyZXQgPSBnbXVfcG9sbF90aW1lb3V0KGdtdSwgUkVH X0E2WFhfR01VX0hGSV9DVFJMX1NUQVRVUywgdmFsLAorCQl2YWwgJiAxLCAxMDAsIDEwMDAwKTsK KwlpZiAocmV0KQorCQlkZXZfZXJyKGdtdS0+ZGV2LCAiVW5hYmxlIHRvIHN0YXJ0IHRoZSBIRkkg cXVldWVzXG4iKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qIFRyaWdnZXIgYSBPT0IgKG91dCBv ZiBiYW5kKSByZXF1ZXN0IHRvIHRoZSBHTVUgKi8KK2ludCBhNnh4X2dtdV9zZXRfb29iKHN0cnVj dCBhNnh4X2dtdSAqZ211LCBlbnVtIGE2eHhfZ211X29vYl9zdGF0ZSBzdGF0ZSkKK3sKKwlpbnQg cmV0OworCXUzMiB2YWw7CisJaW50IHJlcXVlc3QsIGFjazsKKwljb25zdCBjaGFyICpuYW1lOwor CisJc3dpdGNoIChzdGF0ZSkgeworCWNhc2UgR01VX09PQl9HUFVfU0VUOgorCQlyZXF1ZXN0ID0g R01VX09PQl9HUFVfU0VUX1JFUVVFU1Q7CisJCWFjayA9IEdNVV9PT0JfR1BVX1NFVF9BQ0s7CisJ CW5hbWUgPSAiR1BVX1NFVCI7CisJCWJyZWFrOworCWNhc2UgR01VX09PQl9CT09UX1NMVU1CRVI6 CisJCXJlcXVlc3QgPSBHTVVfT09CX0JPT1RfU0xVTUJFUl9SRVFVRVNUOworCQlhY2sgPSBHTVVf T09CX0JPT1RfU0xVTUJFUl9BQ0s7CisJCW5hbWUgPSAiQk9PVF9TTFVNQkVSIjsKKwkJYnJlYWs7 CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogVHJpZ2dlciB0aGUgZXF1 ZXN0ZWQgT09CIG9wZXJhdGlvbiAqLworCWdtdV93cml0ZShnbXUsIFJFR19BNlhYX0dNVV9IT1NU MkdNVV9JTlRSX1NFVCwgMSA8PCByZXF1ZXN0KTsKKworCS8qIFdhaXQgZm9yIHRoZSBhY2tub3ds ZWRnZSBpbnRlcnJ1cHQgKi8KKwlyZXQgPSBnbXVfcG9sbF90aW1lb3V0KGdtdSwgUkVHX0E2WFhf R01VX0dNVTJIT1NUX0lOVFJfSU5GTywgdmFsLAorCQl2YWwgJiAoMSA8PCBhY2spLCAxMDAsIDEw MDAwKTsKKworCWlmIChyZXQpCisJCWRldl9lcnIoZ211LT5kZXYsCisJCQkiVGltZW91dCB3YWl0 aW5nIGZvciBHTVUgT09CIHNldCAlczogMHgleFxuIiwKKwkJCQluYW1lLAorCQkJCWdtdV9yZWFk KGdtdSwgUkVHX0E2WFhfR01VX0dNVTJIT1NUX0lOVFJfSU5GTykpOworCisJLyogQ2xlYXIgdGhl IGFja25vd2xlZGdlIGludGVycnVwdCAqLworCWdtdV93cml0ZShnbXUsIFJFR19BNlhYX0dNVV9H TVUySE9TVF9JTlRSX0NMUiwgYWNrKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qIENsZWFyIGEg cGVuZGluZyBPT0Igc3RhdGUgaW4gdGhlIEdNVSAqLwordm9pZCBhNnh4X2dtdV9jbGVhcl9vb2Io c3RydWN0IGE2eHhfZ211ICpnbXUsIGVudW0gYTZ4eF9nbXVfb29iX3N0YXRlIHN0YXRlKQorewor CXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIEdNVV9PT0JfR1BVX1NFVDoKKwkJZ211X3dyaXRlKGdt dSwgUkVHX0E2WFhfR01VX0hPU1QyR01VX0lOVFJfU0VULAorCQkJMSA8PCBHTVVfT09CX0dQVV9T RVRfQ0xFQVIpOworCQlicmVhazsKKwljYXNlIEdNVV9PT0JfQk9PVF9TTFVNQkVSOgorCQlnbXVf d3JpdGUoZ211LCBSRUdfQTZYWF9HTVVfSE9TVDJHTVVfSU5UUl9TRVQsCisJCQkxIDw8IEdNVV9P T0JfQk9PVF9TTFVNQkVSX0NMRUFSKTsKKwkJYnJlYWs7CisJfQorfQorCisvKiBFbmFibGUgQ1BV IGNvbnRyb2wgb2YgU1BUUCBwb3dlciBwb3dlciBjb2xsYXBzZSAqLworc3RhdGljIGludCBhNnh4 X3NwdHByYWNfZW5hYmxlKHN0cnVjdCBhNnh4X2dtdSAqZ211KQoreworCWludCByZXQ7CisJdTMy IHZhbDsKKworCWdtdV93cml0ZShnbXUsIFJFR19BNlhYX0dNVV9HWF9TUFRQUkFDX1BPV0VSX0NP TlRST0wsIDB4Nzc4MDAwKTsKKworCXJldCA9IGdtdV9wb2xsX3RpbWVvdXQoZ211LCBSRUdfQTZY WF9HTVVfU1BUUFJBQ19QV1JfQ0xLX1NUQVRVUywgdmFsLAorCQkodmFsICYgMHgzOCkgPT0gMHgy OCwgMSwgMTAwKTsKKworCWlmIChyZXQpIHsKKwkJZGV2X2VycihnbXUtPmRldiwgIlVuYWJsZSB0 byBwb3dlciBvbiBTUFRQUkFDOiAweCV4XG4iLAorCQkJZ211X3JlYWQoZ211LCBSRUdfQTZYWF9H TVVfU1BUUFJBQ19QV1JfQ0xLX1NUQVRVUykpOworCX0KKworCXJldHVybiAwOworfQorCisvKiBE aXNhYmxlIENQVSBjb250cm9sIG9mIFNQVFAgcG93ZXIgcG93ZXIgY29sbGFwc2UgKi8KK3N0YXRp YyB2b2lkIGE2eHhfc3B0cHJhY19kaXNhYmxlKHN0cnVjdCBhNnh4X2dtdSAqZ211KQoreworCXUz MiB2YWw7CisJaW50IHJldDsKKworCS8qIE1ha2Ugc3VyZSByZXRlbnRpb24gaXMgb24gKi8KKwln bXVfcm13KGdtdSwgUkVHX0E2WFhfR1BVX0NDX0dYX0dEU0NSLCAwLCAoMSA8PCAxMSkpOworCisJ Z211X3dyaXRlKGdtdSwgUkVHX0E2WFhfR01VX0dYX1NQVFBSQUNfUE9XRVJfQ09OVFJPTCwgMHg3 NzgwMDEpOworCisJcmV0ID0gZ211X3BvbGxfdGltZW91dChnbXUsIFJFR19BNlhYX0dNVV9TUFRQ UkFDX1BXUl9DTEtfU1RBVFVTLCB2YWwsCisJCSh2YWwgJiAweDA0KSwgMTAwLCAxMDAwMCk7CisK KwlpZiAocmV0KQorCQlkZXZfZXJyKGdtdS0+ZGV2LCAiZmFpbGVkIHRvIHBvd2VyIG9mZiBTUFRQ UkFDOiAweCV4XG4iLAorCQkJZ211X3JlYWQoZ211LCBSRUdfQTZYWF9HTVVfU1BUUFJBQ19QV1Jf Q0xLX1NUQVRVUykpOworfQorCisvKiBMZXQgdGhlIEdNVSBrbm93IHdlIGFyZSBzdGFydGluZyBh IGJvb3Qgc2VxdWVuY2UgKi8KK3N0YXRpYyBpbnQgYTZ4eF9nbXVfZ2Z4X3JhaWxfb24oc3RydWN0 IGE2eHhfZ211ICpnbXUpCit7CisJdTMyIHZvdGU7CisKKwkvKiBMZXQgdGhlIEdNVSBrbm93IHdl IGFyZSBnZXR0aW5nIHJlYWR5IGZvciBib290ICovCisJZ211X3dyaXRlKGdtdSwgUkVHX0E2WFhf R01VX0JPT1RfU0xVTUJFUl9PUFRJT04sIDApOworCisJLyogQ2hvb3NlIHRoZSAiZGVmYXVsdCIg cG93ZXIgbGV2ZWwgYXMgdGhlIGhpZ2hlc3QgYXZhaWxhYmxlICovCisJdm90ZSA9IGdtdS0+Z3hf YXJjX3ZvdGVzW2dtdS0+bnJfZ3B1X2ZyZXFzIC0gMV07CisKKwlnbXVfd3JpdGUoZ211LCBSRUdf QTZYWF9HTVVfR1hfVk9URV9JRFgsIHZvdGUgJiAweGZmKTsKKwlnbXVfd3JpdGUoZ211LCBSRUdf QTZYWF9HTVVfTVhfVk9URV9JRFgsICh2b3RlID4+IDgpICYgMHhmZik7CisKKwkvKiBMZXQgdGhl IEdNVSBrbm93IHRoZSBib290IHNlcXVlbmNlIGhhcyBzdGFydGVkICovCisJcmV0dXJuIGE2eHhf Z211X3NldF9vb2IoZ211LCBHTVVfT09CX0JPT1RfU0xVTUJFUik7Cit9CisKKy8qIExldCB0aGUg R01VIGtub3cgdGhhdCB3ZSBhcmUgYWJvdXQgdG8gZ28gaW50byBzbHVtYmVyICovCitzdGF0aWMg aW50IGE2eHhfZ211X25vdGlmeV9zbHVtYmVyKHN0cnVjdCBhNnh4X2dtdSAqZ211KQoreworCWlu dCByZXQ7CisKKwkvKiBEaXNhYmxlIHRoZSBwb3dlciBjb3VudGVyIHNvIHRoZSBHTVUgaXNuJ3Qg YnVzeSAqLworCWdtdV93cml0ZShnbXUsIFJFR19BNlhYX0dNVV9DWF9HTVVfUE9XRVJfQ09VTlRF Ul9FTkFCTEUsIDApOworCisJLyogRGlzYWJsZSBTUFRQX1BDIGlmIHRoZSBDUFUgaXMgcmVzcG9u c2libGUgZm9yIGl0ICovCisJaWYgKGdtdS0+aWRsZV9sZXZlbCA8IEdNVV9JRExFX1NUQVRFX1NQ VFApCisJCWE2eHhfc3B0cHJhY19kaXNhYmxlKGdtdSk7CisKKwkvKiBUZWxsIHRoZSBHTVUgdG8g Z2V0IHJlYWR5IHRvIHNsdW1iZXIgKi8KKwlnbXVfd3JpdGUoZ211LCBSRUdfQTZYWF9HTVVfQk9P VF9TTFVNQkVSX09QVElPTiwgMSk7CisKKwlyZXQgPSBhNnh4X2dtdV9zZXRfb29iKGdtdSwgR01V X09PQl9CT09UX1NMVU1CRVIpOworCWE2eHhfZ211X2NsZWFyX29vYihnbXUsIEdNVV9PT0JfQk9P VF9TTFVNQkVSKTsKKworCWlmICghcmV0KSB7CisJCS8qIENoZWNrIHRvIHNlZSBpZiB0aGUgR01V IHJlYWxseSBkaWQgc2x1bWJlciAqLworCQlpZiAoZ211X3JlYWQoZ211LCBSRUdfQTZYWF9HUFVf R01VX0NYX0dNVV9SUE1IX1BPV0VSX1NUQVRFKQorCQkJIT0gMHgwZikgeworCQkJZGV2X2Vycihn bXUtPmRldiwgIlRoZSBHTVUgZGlkIG5vdCBnbyBpbnRvIHNsdW1iZXJcbiIpOworCQkJcmV0ID0g LUVUSU1FRE9VVDsKKwkJfQorCX0KKworCS8qIFB1dCBmZW5jZSBpbnRvIGFsbG93IG1vZGUgKi8K KwlnbXVfd3JpdGUoZ211LCBSRUdfQTZYWF9HTVVfQU9fQUhCX0ZFTkNFX0NUUkwsIDApOworCXJl dHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYTZ4eF9ycG1oX3N0YXJ0KHN0cnVjdCBhNnh4X2dt dSAqZ211KQoreworCWludCByZXQ7CisJdTMyIHZhbDsKKworCWdtdV93cml0ZShnbXUsIFJFR19B NlhYX0dNVV9SU0NDX0NPTlRST0xfUkVRLCAxIDw8IDEpOworCS8qIFdhaXQgZm9yIHRoZSByZWdp c3RlciB0byBmaW5pc2ggcG9zdGluZyAqLworCXdtYigpOworCisJcmV0ID0gZ211X3BvbGxfdGlt ZW91dChnbXUsIFJFR19BNlhYX0dNVV9SU0NDX0NPTlRST0xfQUNLLCB2YWwsCisJCXZhbCAmICgx IDw8IDEpLCAxMDAsIDEwMDAwKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZ211LT5kZXYsICJV bmFibGUgdG8gcG93ZXIgb24gdGhlIEdQVSBSU0NcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKwor CXJldCA9IGdtdV9wb2xsX3RpbWVvdXQoZ211LCBSRUdfQTZYWF9SU0NDX1NFUV9CVVNZX0RSVjAs IHZhbCwKKwkJIXZhbCwgMTAwLCAxMDAwMCk7CisKKwlpZiAoIXJldCkgeworCQlnbXVfd3JpdGUo Z211LCBSRUdfQTZYWF9HTVVfUlNDQ19DT05UUk9MX1JFUSwgMCk7CisKKwkJLyogUmUtZW5hYmxl IHRoZSBwb3dlciBjb3VudGVyICovCisJCWdtdV93cml0ZShnbXUsIFJFR19BNlhYX0dNVV9DWF9H TVVfUE9XRVJfQ09VTlRFUl9FTkFCTEUsIDEpOworCQlyZXR1cm4gMDsKKwl9CisKKwlkZXZfZXJy KGdtdS0+ZGV2LCAiR1BVIFJTQyBzZXF1ZW5jZSBzdHVjayB3aGlsZSB3YWtpbmcgdXAgdGhlIEdQ VVxuIik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgYTZ4eF9ycG1oX3N0b3Aoc3Ry dWN0IGE2eHhfZ211ICpnbXUpCit7CisJaW50IHJldDsKKwl1MzIgdmFsOworCisJZ211X3dyaXRl KGdtdSwgUkVHX0E2WFhfR01VX1JTQ0NfQ09OVFJPTF9SRVEsIDEpOworCisJcmV0ID0gZ211X3Bv bGxfdGltZW91dChnbXUsIFJFR19BNlhYX0dQVV9SU0NDX1JTQ19TVEFUVVMwX0RSVjAsCisJCXZh bCwgdmFsICYgKDEgPDwgMTYpLCAxMDAsIDEwMDAwKTsKKwlpZiAocmV0KQorCQlkZXZfZXJyKGdt dS0+ZGV2LCAiVW5hYmxlIHRvIHBvd2VyIG9mZiB0aGUgR1BVIFJTQ1xuIik7CisKKwlnbXVfd3Jp dGUoZ211LCBSRUdfQTZYWF9HTVVfUlNDQ19DT05UUk9MX1JFUSwgMCk7Cit9CisKK3N0YXRpYyB2 b2lkIGE2eHhfZ211X3JwbWhfaW5pdChzdHJ1Y3QgYTZ4eF9nbXUgKmdtdSkKK3sKKwkvKiBEaXNh YmxlIFNERSBjbG9jayBnYXRpbmcgKi8KKwlnbXVfd3JpdGUoZ211LCBSRUdfQTZYWF9HUFVfUlND Q19SU0NfU1RBVFVTMF9EUlYwLCBCSVQoMjQpKTsKKworCS8qIFNldHVwIFJTQyBQREMgaGFuZHNo YWtlIGZvciBzbGVlcCBhbmQgd2FrZXVwICovCisJZ211X3dyaXRlKGdtdSwgUkVHX0E2WFhfUlND Q19QRENfU0xBVkVfSURfRFJWMCwgMSk7CisJZ211X3dyaXRlKGdtdSwgUkVHX0E2WFhfUlNDQ19I SURERU5fVENTX0NNRDBfREFUQSwgMCk7CisJZ211X3dyaXRlKGdtdSwgUkVHX0E2WFhfUlNDQ19I SURERU5fVENTX0NNRDBfQUREUiwgMCk7CisJZ211X3dyaXRlKGdtdSwgUkVHX0E2WFhfUlNDQ19I SURERU5fVENTX0NNRDBfREFUQSArIDIsIDApOworCWdtdV93cml0ZShnbXUsIFJFR19BNlhYX1JT Q0NfSElEREVOX1RDU19DTUQwX0FERFIgKyAyLCAwKTsKKwlnbXVfd3JpdGUoZ211LCBSRUdfQTZY WF9SU0NDX0hJRERFTl9UQ1NfQ01EMF9EQVRBICsgNCwgMHg4MDAwMDAwMCk7CisJZ211X3dyaXRl KGdtdSwgUkVHX0E2WFhfUlNDQ19ISURERU5fVENTX0NNRDBfQUREUiArIDQsIDApOworCWdtdV93 cml0ZShnbXUsIFJFR19BNlhYX1JTQ0NfT1ZFUlJJREVfU1RBUlRfQUREUiwgMCk7CisJZ211X3dy aXRlKGdtdSwgUkVHX0E2WFhfUlNDQ19QRENfU0VRX1NUQVJUX0FERFIsIDB4NDUyMCk7CisJZ211 X3dyaXRlKGdtdSwgUkVHX0E2WFhfUlNDQ19QRENfTUFUQ0hfVkFMVUVfTE8sIDB4NDUxMCk7CisJ Z211X3dyaXRlKGdtdSwgUkVHX0E2WFhfUlNDQ19QRENfTUFUQ0hfVkFMVUVfSEksIDB4NDUxNCk7 CisKKwkvKiBMb2FkIFJTQyBzZXF1ZW5jZXIgdUNvZGUgZm9yIHNsZWVwIGFuZCB3YWtldXAgKi8K KwlnbXVfd3JpdGUoZ211LCBSRUdfQTZYWF9SU0NDX1NFUV9NRU1fMF9EUlYwLCAweGE3YTUwNmEw KTsKKwlnbXVfd3JpdGUoZ211LCBSRUdfQTZYWF9SU0NDX1NFUV9NRU1fMF9EUlYwICsgMSwgMHhh MWU2YTZlNyk7CisJZ211X3dyaXRlKGdtdSwgUkVHX0E2WFhfUlNDQ19TRVFfTUVNXzBfRFJWMCAr IDIsIDB4YTJlMDgxZTEpOworCWdtdV93cml0ZShnbXUsIFJFR19BNlhYX1JTQ0NfU0VRX01FTV8w X0RSVjAgKyAzLCAweGU5YTk4MmUyKTsKKwlnbXVfd3JpdGUoZ211LCBSRUdfQTZYWF9SU0NDX1NF UV9NRU1fMF9EUlYwICsgNCwgMHgwMDIwZThhOCk7CisKKwkvKiBMb2FkIFBEQyBzZXF1ZW5jZXIg dUNvZGUgZm9yIHBvd2VyIHVwIGFuZCBwb3dlciBkb3duIHNlcXVlbmNlICovCisJcGRjX3dyaXRl KGdtdSwgUkVHX0E2WFhfUERDX0dQVV9TRVFfTUVNXzAsIDB4ZmViZWExZTEpOworCXBkY193cml0 ZShnbXUsIFJFR19BNlhYX1BEQ19HUFVfU0VRX01FTV8wICsgMSwgMHhhNWE0YTNhMik7CisJcGRj X3dyaXRlKGdtdSwgUkVHX0E2WFhfUERDX0dQVV9TRVFfTUVNXzAgKyAyLCAweDgzODJhNmUwKTsK KwlwZGNfd3JpdGUoZ211LCBSRUdfQTZYWF9QRENfR1BVX1NFUV9NRU1fMCArIDMsIDB4YmNlM2Uy ODQpOworCXBkY193cml0ZShnbXUsIFJFR19BNlhYX1BEQ19HUFVfU0VRX01FTV8wICsgNCwgMHgw MDIwODFmYyk7CisKKwkvKiBTZXQgVENTIGNvbW1hbmRzIHVzZWQgYnkgUERDIHNlcXVlbmNlIGZv ciBsb3cgcG93ZXIgbW9kZXMgKi8KKwlwZGNfd3JpdGUoZ211LCBSRUdfQTZYWF9QRENfR1BVX1RD UzFfQ01EX0VOQUJMRV9CQU5LLCA3KTsKKwlwZGNfd3JpdGUoZ211LCBSRUdfQTZYWF9QRENfR1BV X1RDUzFfQ01EX1dBSVRfRk9SX0NNUExfQkFOSywgMCk7CisJcGRjX3dyaXRlKGdtdSwgUkVHX0E2 WFhfUERDX0dQVV9UQ1MxX0NPTlRST0wsIDApOworCXBkY193cml0ZShnbXUsIFJFR19BNlhYX1BE Q19HUFVfVENTMV9DTUQwX01TR0lELCAweDEwMTA4KTsKKwlwZGNfd3JpdGUoZ211LCBSRUdfQTZY WF9QRENfR1BVX1RDUzFfQ01EMF9BRERSLCAweDMwMDEwKTsKKwlwZGNfd3JpdGUoZ211LCBSRUdf QTZYWF9QRENfR1BVX1RDUzFfQ01EMF9EQVRBLCAxKTsKKwlwZGNfd3JpdGUoZ211LCBSRUdfQTZY WF9QRENfR1BVX1RDUzFfQ01EMF9NU0dJRCArIDQsIDB4MTAxMDgpOworCXBkY193cml0ZShnbXUs IFJFR19BNlhYX1BEQ19HUFVfVENTMV9DTUQwX0FERFIgKyA0LCAweDMwMDAwKTsKKwlwZGNfd3Jp dGUoZ211LCBSRUdfQTZYWF9QRENfR1BVX1RDUzFfQ01EMF9EQVRBICsgNCwgMHgwKTsKKwlwZGNf d3JpdGUoZ211LCBSRUdfQTZYWF9QRENfR1BVX1RDUzFfQ01EMF9NU0dJRCArIDgsIDB4MTAxMDgp OworCXBkY193cml0ZShnbXUsIFJFR19BNlhYX1BEQ19HUFVfVENTMV9DTUQwX0FERFIgKyA4LCAw eDMwMDgwKTsKKwlwZGNfd3JpdGUoZ211LCBSRUdfQTZYWF9QRENfR1BVX1RDUzFfQ01EMF9EQVRB ICsgOCwgMHgwKTsKKwlwZGNfd3JpdGUoZ211LCBSRUdfQTZYWF9QRENfR1BVX1RDUzNfQ01EX0VO QUJMRV9CQU5LLCA3KTsKKwlwZGNfd3JpdGUoZ211LCBSRUdfQTZYWF9QRENfR1BVX1RDUzNfQ01E X1dBSVRfRk9SX0NNUExfQkFOSywgMCk7CisJcGRjX3dyaXRlKGdtdSwgUkVHX0E2WFhfUERDX0dQ VV9UQ1MzX0NPTlRST0wsIDApOworCXBkY193cml0ZShnbXUsIFJFR19BNlhYX1BEQ19HUFVfVENT M19DTUQwX01TR0lELCAweDEwMTA4KTsKKwlwZGNfd3JpdGUoZ211LCBSRUdfQTZYWF9QRENfR1BV X1RDUzNfQ01EMF9BRERSLCAweDMwMDEwKTsKKwlwZGNfd3JpdGUoZ211LCBSRUdfQTZYWF9QRENf R1BVX1RDUzNfQ01EMF9EQVRBLCAyKTsKKwlwZGNfd3JpdGUoZ211LCBSRUdfQTZYWF9QRENfR1BV X1RDUzNfQ01EMF9NU0dJRCArIDQsIDB4MTAxMDgpOworCXBkY193cml0ZShnbXUsIFJFR19BNlhY X1BEQ19HUFVfVENTM19DTUQwX0FERFIgKyA0LCAweDMwMDAwKTsKKwlwZGNfd3JpdGUoZ211LCBS RUdfQTZYWF9QRENfR1BVX1RDUzNfQ01EMF9EQVRBICsgNCwgMHgzKTsKKwlwZGNfd3JpdGUoZ211 LCBSRUdfQTZYWF9QRENfR1BVX1RDUzNfQ01EMF9NU0dJRCArIDgsIDB4MTAxMDgpOworCXBkY193 cml0ZShnbXUsIFJFR19BNlhYX1BEQ19HUFVfVENTM19DTUQwX0FERFIgKyA4LCAweDMwMDgwKTsK KwlwZGNfd3JpdGUoZ211LCBSRUdfQTZYWF9QRENfR1BVX1RDUzNfQ01EMF9EQVRBICsgOCwgMHgz KTsKKworCS8qIFNldHVwIEdQVSBQREMgKi8KKwlwZGNfd3JpdGUoZ211LCBSRUdfQTZYWF9QRENf R1BVX1NFUV9TVEFSVF9BRERSLCAwKTsKKwlwZGNfd3JpdGUoZ211LCBSRUdfQTZYWF9QRENfR1BV X0VOQUJMRV9QREMsIDB4ODAwMDAwMDEpOworCisJLyogZW5zdXJlIG5vIHdyaXRlcyBoYXBwZW4g YmVmb3JlIHRoZSB1Q29kZSBpcyBmdWxseSB3cml0dGVuICovCisJd21iKCk7Cit9CisKKy8qCisg KiBUaGUgbG93ZXN0IDE2IGJpdHMgb2YgdGhpcyB2YWx1ZSBhcmUgdGhlIG51bWJlciBvZiBYTyBj bG9jayBjeWNsZXMgZm9yIG1haW4KKyAqIGh5c3RlcmVzaXMgd2hpY2ggaXMgc2V0IGF0IDB4MTY4 MCBjeWNsZXMgKDMwMCB1cykuICBUaGUgaGlnaGVyIDE2IGJpdHMgYXJlCisgKiBmb3IgdGhlIHNo b3J0ZXIgaHlzdGVyZXNpcyB0aGF0IGhhcHBlbnMgYWZ0ZXIgbWFpbiAtIHRoaXMgaXMgMHhhICgu NSB1cykKKyAqLworCisjZGVmaW5lIEdNVV9QV1JfQ09MX0hZU1QgMHgwMDBhMTY4MAorCisvKiBT ZXQgdXAgdGhlIGlkbGUgc3RhdGUgZm9yIHRoZSBHTVUgKi8KK3N0YXRpYyB2b2lkIGE2eHhfZ211 X3Bvd2VyX2NvbmZpZyhzdHJ1Y3QgYTZ4eF9nbXUgKmdtdSkKK3sKKwkvKiBEaXNhYmxlIEdNVSBX Qi9SQiBidWZmZXIgKi8KKwlnbXVfd3JpdGUoZ211LCBSRUdfQTZYWF9HTVVfU1lTX0JVU19DT05G SUcsIDB4MSk7CisKKwlnbXVfd3JpdGUoZ211LCBSRUdfQTZYWF9HTVVfUFdSX0NPTF9JTlRFUl9G UkFNRV9DVFJMLCAweDljNDA0MDApOworCisJc3dpdGNoIChnbXUtPmlkbGVfbGV2ZWwpIHsKKwlj YXNlIEdNVV9JRExFX1NUQVRFX0lGUEM6CisJCWdtdV93cml0ZShnbXUsIFJFR19BNlhYX0dNVV9Q V1JfQ09MX0lOVEVSX0ZSQU1FX0hZU1QsCisJCQlHTVVfUFdSX0NPTF9IWVNUKTsKKwkJZ211X3Jt dyhnbXUsIFJFR19BNlhYX0dNVV9QV1JfQ09MX0lOVEVSX0ZSQU1FX0NUUkwsIDAsCisJCQlBNlhY X0dNVV9QV1JfQ09MX0lOVEVSX0ZSQU1FX0NUUkxfSUZQQ19FTkFCTEUgfAorCQkJQTZYWF9HTVVf UFdSX0NPTF9JTlRFUl9GUkFNRV9DVFJMX0hNX1BPV0VSX0NPTExBUFNFX0VOQUJMRSk7CisJCS8q IEZhbGwgdGhyb3VnaCAqLworCWNhc2UgR01VX0lETEVfU1RBVEVfU1BUUDoKKwkJZ211X3dyaXRl KGdtdSwgUkVHX0E2WFhfR01VX1BXUl9DT0xfU1BUUFJBQ19IWVNULAorCQkJR01VX1BXUl9DT0xf SFlTVCk7CisJCWdtdV9ybXcoZ211LCBSRUdfQTZYWF9HTVVfUFdSX0NPTF9JTlRFUl9GUkFNRV9D VFJMLCAwLAorCQkJQTZYWF9HTVVfUFdSX0NPTF9JTlRFUl9GUkFNRV9DVFJMX0lGUENfRU5BQkxF IHwKKwkJCUE2WFhfR01VX1BXUl9DT0xfSU5URVJfRlJBTUVfQ1RSTF9TUFRQUkFDX1BPV0VSX0NP TlRST0xfRU5BQkxFKTsKKwl9CisKKwkvKiBFbmFibGUgUlBNaCBHUFUgY2xpZW50ICovCisJZ211 X3JtdyhnbXUsIFJFR19BNlhYX0dNVV9SUE1IX0NUUkwsIDAsCisJCUE2WFhfR01VX1JQTUhfQ1RS TF9SUE1IX0lOVEVSRkFDRV9FTkFCTEUgfAorCQlBNlhYX0dNVV9SUE1IX0NUUkxfTExDX1ZPVEVf RU5BQkxFIHwKKwkJQTZYWF9HTVVfUlBNSF9DVFJMX0REUl9WT1RFX0VOQUJMRSB8CisJCUE2WFhf R01VX1JQTUhfQ1RSTF9NWF9WT1RFX0VOQUJMRSB8CisJCUE2WFhfR01VX1JQTUhfQ1RSTF9DWF9W T1RFX0VOQUJMRSB8CisJCUE2WFhfR01VX1JQTUhfQ1RSTF9HRlhfVk9URV9FTkFCTEUpOworfQor CitzdGF0aWMgaW50IGE2eHhfZ211X2Z3X3N0YXJ0KHN0cnVjdCBhNnh4X2dtdSAqZ211LCB1bnNp Z25lZCBpbnQgc3RhdGUpCit7CisJc3RhdGljIGJvb2wgcnBtaF9pbml0OworCXN0cnVjdCBhNnh4 X2dwdSAqYTZ4eF9ncHUgPSBjb250YWluZXJfb2YoZ211LCBzdHJ1Y3QgYTZ4eF9ncHUsIGdtdSk7 CisJc3RydWN0IGFkcmVub19ncHUgKmFkcmVub19ncHUgPSAmYTZ4eF9ncHUtPmJhc2U7CisJaW50 IGksIHJldDsKKwl1MzIgY2hpcGlkOworCXUzMiAqaW1hZ2U7CisKKwlpZiAoc3RhdGUgPT0gR01V X1dBUk1fQk9PVCkgeworCQlyZXQgPSBhNnh4X3JwbWhfc3RhcnQoZ211KTsKKwkJaWYgKHJldCkK KwkJCXJldHVybiByZXQ7CisJfSBlbHNlIHsKKworCQkvKiBMb2FkIHRoZSBHTVUgbWljcm9jb2Rl IGlmIHdlIGhhdmVuJ3QgYWxyZWFkeSAqLworCQlpZiAoIWdtdS0+dWNvZGUpIHsKKwkJCWNvbnN0 IHN0cnVjdCBmaXJtd2FyZSAqZncgPQorCQkJCWFkcmVub19yZXF1ZXN0X2Z3KGFkcmVub19ncHUs CisJCQkJCWFkcmVub19ncHUtPmluZm8tPnBvd2VyZncpOworCisJCQlpZiAoSVNfRVJSKGZ3KSkK KwkJCQlyZXR1cm4gUFRSX0VSUihmdyk7CisKKwkJCS8qIFRoZSBHTVUgZmlybXdhcmUgcmVnaW9u IGlzIDMyayAqLworCQkJaWYgKGZ3LT5zaXplID4gMHg4MDAwKSB7CisJCQkJZGV2X2VycihnbXUt PmRldiwKKwkJCQkJIkdNVSBmaXJtd2FyZSBpcyBiaWdnZXIgdGhhbiB0aGUgYXZhaWxhYmxlIHJl Z2lvblxuIik7CisJCQkJcmVsZWFzZV9maXJtd2FyZShmdyk7CisKKwkJCQlyZXR1cm4gLUVJTlZB TDsKKwkJCX0KKworCQkJZ211LT51Y29kZSA9IGZ3OworCQl9CisKKwkJLyogVHVybiBvbiByZWdp c3RlciByZXRlbnRpb24gKi8KKwkJZ211X3dyaXRlKGdtdSwgUkVHX0E2WFhfR01VX0dFTkVSQUxf NywgMSk7CisKKwkJLyogV2Ugb25seSBuZWVkIHRvIGxvYWQgdGhlIFJQTWggbWljcm9jb2RlIG9u Y2UgKi8KKwkJaWYgKCFycG1oX2luaXQpIHsKKwkJCWE2eHhfZ211X3JwbWhfaW5pdChnbXUpOwor CQkJcnBtaF9pbml0ID0gdHJ1ZTsKKwkJfSBlbHNlIGlmIChzdGF0ZSAhPSBHTVVfUkVTRVQpIHsK KwkJCXJldCA9IGE2eHhfcnBtaF9zdGFydChnbXUpOworCQkJaWYgKHJldCkKKwkJCQlyZXR1cm4g cmV0OworCQl9CisKKwkJaW1hZ2UgPSAodTMyICopIGdtdS0+dWNvZGUtPmRhdGE7CisKKwkJZm9y IChpID0gMDsgaSA8IGdtdS0+dWNvZGUtPnNpemUgPj4gMjsgaSsrKQorCQkJZ211X3dyaXRlKGdt dSwgUkVHX0E2WFhfR01VX0NNM19JVENNX1NUQVJUICsgaSwKKwkJCQlpbWFnZVtpXSk7CisKKwkJ LyogV2FpdCBmb3IgdGhlIGZpcm13YXJlIHRvIGZpbmlzaCB3cml0aW5nICovCisJCXdtYigpOwor CX0KKworCWdtdV93cml0ZShnbXUsIFJFR19BNlhYX0dNVV9DTTNfRldfSU5JVF9SRVNVTFQsIDAp OworCWdtdV93cml0ZShnbXUsIFJFR19BNlhYX0dNVV9DTTNfQk9PVF9DT05GSUcsIDB4MDIpOwor CisJLyogV3JpdGUgdGhlIGlvdmEgb2YgdGhlIEhGSSB0YWJsZSAqLworCWdtdV93cml0ZShnbXUs IFJFR19BNlhYX0dNVV9IRklfUVRCTF9BRERSLCBnbXUtPmhmaS0+aW92YSk7CisJZ211X3dyaXRl KGdtdSwgUkVHX0E2WFhfR01VX0hGSV9RVEJMX0lORk8sIDEpOworCisJZ211X3dyaXRlKGdtdSwg UkVHX0E2WFhfR01VX0FIQl9GRU5DRV9SQU5HRV8wLAorCQkoMSA8PCAzMSkgfCAoMHhhIDw8IDE4 KSB8ICgweGEwKSk7CisKKwljaGlwaWQgPSBhZHJlbm9fZ3B1LT5yZXYuY29yZSA8PCAyNDsKKwlj aGlwaWQgfD0gYWRyZW5vX2dwdS0+cmV2Lm1ham9yIDw8IDE2OworCWNoaXBpZCB8PSBhZHJlbm9f Z3B1LT5yZXYubWlub3IgPDwgMTI7CisJY2hpcGlkIHw9IGFkcmVub19ncHUtPnJldi5wYXRjaGlk IDw8IDg7CisKKwlnbXVfd3JpdGUoZ211LCBSRUdfQTZYWF9HTVVfSEZJX1NGUl9BRERSLCBjaGlw aWQpOworCisJLyogU2V0IHVwIHRoZSBsb3dlc3QgaWRsZSBsZXZlbCBvbiB0aGUgR01VICovCisJ YTZ4eF9nbXVfcG93ZXJfY29uZmlnKGdtdSk7CisKKwlyZXQgPSBhNnh4X2dtdV9zdGFydChnbXUp OworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBhNnh4X2dtdV9nZnhfcmFpbF9v bihnbXUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiBFbmFibGUgU1BUUF9QQyBp ZiB0aGUgQ1BVIGlzIHJlc3BvbnNpYmxlIGZvciBpdCAqLworCWlmIChnbXUtPmlkbGVfbGV2ZWwg PCBHTVVfSURMRV9TVEFURV9TUFRQKSB7CisJCXJldCA9IGE2eHhfc3B0cHJhY19lbmFibGUoZ211 KTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gYTZ4eF9nbXVfaGZp X3N0YXJ0KGdtdSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qIEZJWE1FOiBEbyB3 ZSBuZWVkIHRoaXMgd21iKCkgaGVyZT8gKi8KKwl3bWIoKTsKKworCXJldHVybiAwOworfQorCisj ZGVmaW5lIEE2WFhfSEZJX0lSUV9NQVNLIFwKKwkoQTZYWF9HTVVfR01VMkhPU1RfSU5UUl9JTkZP X01TR1EgfCBcCisJIEE2WFhfR01VX0dNVTJIT1NUX0lOVFJfSU5GT19DTTNfRkFVTFQpCisKKyNk ZWZpbmUgQTZYWF9HTVVfSVJRX01BU0sgXAorCShBNlhYX0dNVV9BT19IT1NUX0lOVEVSUlVQVF9T VEFUVVNfV0RPR19CSVRFIHwgXAorCSBBNlhYX0dNVV9BT19IT1NUX0lOVEVSUlVQVF9TVEFUVVNf SE9TVF9BSEJfQlVTX0VSUk9SIHwgXAorCSBBNlhYX0dNVV9BT19IT1NUX0lOVEVSUlVQVF9TVEFU VVNfRkVOQ0VfRVJSKQorCitzdGF0aWMgdm9pZCBhNnh4X2dtdV9pcnFfZW5hYmxlKHN0cnVjdCBh Nnh4X2dtdSAqZ211KQoreworCWdtdV93cml0ZShnbXUsIFJFR19BNlhYX0dNVV9BT19IT1NUX0lO VEVSUlVQVF9DTFIsIH4wKTsKKwlnbXVfd3JpdGUoZ211LCBSRUdfQTZYWF9HTVVfR01VMkhPU1Rf SU5UUl9DTFIsIH4wKTsKKworCWdtdV93cml0ZShnbXUsIFJFR19BNlhYX0dNVV9BT19IT1NUX0lO VEVSUlVQVF9NQVNLLAorCQl+QTZYWF9HTVVfSVJRX01BU0spOworCWdtdV93cml0ZShnbXUsIFJF R19BNlhYX0dNVV9HTVUySE9TVF9JTlRSX01BU0ssCisJCX5BNlhYX0hGSV9JUlFfTUFTSyk7CisK KwllbmFibGVfaXJxKGdtdS0+Z211X2lycSk7CisJZW5hYmxlX2lycShnbXUtPmhmaV9pcnEpOwor fQorCitzdGF0aWMgdm9pZCBhNnh4X2dtdV9pcnFfZGlzYWJsZShzdHJ1Y3QgYTZ4eF9nbXUgKmdt dSkKK3sKKwlkaXNhYmxlX2lycShnbXUtPmdtdV9pcnEpOworCWRpc2FibGVfaXJxKGdtdS0+aGZp X2lycSk7CisKKwlnbXVfd3JpdGUoZ211LCBSRUdfQTZYWF9HTVVfQU9fSE9TVF9JTlRFUlJVUFRf TUFTSywgfjApOworCWdtdV93cml0ZShnbXUsIFJFR19BNlhYX0dNVV9HTVUySE9TVF9JTlRSX01B U0ssIH4wKTsKK30KKworc3RhdGljIHZvaWQgYTZ4eF9nbXVfZGlzYWJsZV9jbG9ja3Moc3RydWN0 IGE2eHhfZ211ICpnbXUpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZ211LT5ucl9j bG9ja3M7IGkrKykKKwkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGdtdS0+Y2xvY2tzW2ldKTsKK30K Kworc3RhdGljIHZvaWQgYTZ4eF9nbXVfZGlzYWJsZV9nZHNjKHN0cnVjdCBhNnh4X2dtdSAqZ211 KQoreworCWlmIChnbXUtPmN4KQorCQlyZWd1bGF0b3JfZGlzYWJsZShnbXUtPmN4KTsKK30KKwor c3RhdGljIGludCBhNnh4X2dtdV9lbmFibGVfZ2RzYyhzdHJ1Y3QgYTZ4eF9nbXUgKmdtdSkKK3sK KwlpbnQgcmV0ID0gMDsKKworCWlmIChnbXUtPmN4KQorCQlyZXQgPSByZWd1bGF0b3JfZW5hYmxl KGdtdS0+Y3gpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgYTZ4eF9nbXVfZW5h YmxlX2Nsb2NrcyhzdHJ1Y3QgYTZ4eF9nbXUgKmdtdSkKK3sKKwlpbnQgaTsKKworCS8qIFVzZSBh IGtub3duIHJhdGUgdG8gYnJpbmcgdXAgdGhlIEdNVSAqLworCWNsa19zZXRfcmF0ZShnbXUtPmNv cmVfY2xrLCAyMDAwMDAwMDApOworCisJZm9yIChpID0gMDsgaSA8IGdtdS0+bnJfY2xvY2tzOyBp KyspCisJCWNsa19wcmVwYXJlX2VuYWJsZShnbXUtPmNsb2Nrc1tpXSk7Cit9CisKK2ludCBhNnh4 X2dtdV9yZXNldChzdHJ1Y3QgYTZ4eF9ncHUgKmE2eHhfZ3B1KQoreworCXN0cnVjdCBhNnh4X2dt dSAqZ211ID0gJmE2eHhfZ3B1LT5nbXU7CisJaW50IHJldDsKKwl1MzIgdmFsOworCisJLyogRmx1 c2ggYWxsIHRoZSBxdWV1ZXMgKi8KKwlhNnh4X2hmaV9zdG9wKGdtdSk7CisKKwkvKiBTdG9wIHRo ZSBpbnRlcnJ1cHRzICovCisJYTZ4eF9nbXVfaXJxX2Rpc2FibGUoZ211KTsKKworCS8qIEZvcmNl IG9mZiBTUFRQIGluIGNhc2UgdGhlIEdNVSBpcyBtYW5hZ2luZyBpdCAqLworCWE2eHhfc3B0cHJh Y19kaXNhYmxlKGdtdSk7CisKKwkvKiBNYWtlIHN1cmUgdGhlcmUgYXJlIG5vIG91dHN0YW5kaW5n IFJQTWggdm90ZXMgKi8KKwlnbXVfcG9sbF90aW1lb3V0KGdtdSwgUkVHX0E2WFhfUlNDQ19UQ1Mw X0RSVjBfU1RBVFVTLCB2YWwsCisJCSh2YWwgJiAxKSwgMTAwLCAxMDAwMCk7CisJZ211X3BvbGxf dGltZW91dChnbXUsIFJFR19BNlhYX1JTQ0NfVENTMV9EUlYwX1NUQVRVUywgdmFsLAorCQkodmFs ICYgMSksIDEwMCwgMTAwMDApOworCWdtdV9wb2xsX3RpbWVvdXQoZ211LCBSRUdfQTZYWF9SU0ND X1RDUzJfRFJWMF9TVEFUVVMsIHZhbCwKKwkJKHZhbCAmIDEpLCAxMDAsIDEwMDAwKTsKKwlnbXVf cG9sbF90aW1lb3V0KGdtdSwgUkVHX0E2WFhfUlNDQ19UQ1MzX0RSVjBfU1RBVFVTLCB2YWwsCisJ CSh2YWwgJiAxKSwgMTAwLCAxMDAwKTsKKworCS8qIEZvcmNlIG9mZiB0aGUgR1ggR1NEQyAqLwor CXJlZ3VsYXRvcl9mb3JjZV9kaXNhYmxlKGdtdS0+Z3gpOworCisJLyogRGlzYWJsZSB0aGUgcmVz b3VyY2VzICovCisJYTZ4eF9nbXVfZGlzYWJsZV9jbG9ja3MoZ211KTsKKwlhNnh4X2dtdV9kaXNh YmxlX2dkc2MoZ211KTsKKworCS8qIFJlLWVuYWJsZSB0aGUgcmVzb3VyY2VzICovCisJYTZ4eF9n bXVfZW5hYmxlX2dkc2MoZ211KTsKKwlhNnh4X2dtdV9lbmFibGVfY2xvY2tzKGdtdSk7CisJYTZ4 eF9nbXVfaXJxX2VuYWJsZShnbXUpOworCisJcmV0ID0gYTZ4eF9nbXVfZndfc3RhcnQoZ211LCBH TVVfUkVTRVQpOworCWlmICghcmV0KQorCQlyZXQgPSBhNnh4X2hmaV9zdGFydChnbXUsIEdNVV9D T0xEX0JPT1QpOworCisJaWYgKHJldCkKKwkJYTZ4eF9nbXVfY2xlYXJfb29iKGdtdSwgR01VX09P Ql9CT09UX1NMVU1CRVIpOworCisJcmV0dXJuIHJldDsKK30KKworaW50IGE2eHhfZ211X3Jlc3Vt ZShzdHJ1Y3QgYTZ4eF9ncHUgKmE2eHhfZ3B1KQoreworCXN0cnVjdCBhNnh4X2dtdSAqZ211ID0g JmE2eHhfZ3B1LT5nbXU7CisJaW50IHN0YXR1cywgcmV0OworCisJaWYgKFdBUk4oIWdtdS0+bW1p bywgIlRoZSBHTVUgaXMgbm90IHNldCB1cCB5ZXRcbiIpKQorCQlyZXR1cm4gMDsKKworCS8qIFR1 cm4gb24gdGhlIHJlc291cmNlcyAqLworCWE2eHhfZ211X2VuYWJsZV9nZHNjKGdtdSk7CisJYTZ4 eF9nbXVfZW5hYmxlX2Nsb2NrcyhnbXUpOworCWE2eHhfZ211X2lycV9lbmFibGUoZ211KTsKKwor CS8qIENoZWNrIHRvIHNlZSBpZiB3ZSBhcmUgZG9pbmcgYSBjb2xkIG9yIHdhcm0gYm9vdCAqLwor CXN0YXR1cyA9IGdtdV9yZWFkKGdtdSwgUkVHX0E2WFhfR01VX0dFTkVSQUxfNykgPT0gMSA/CisJ CUdNVV9XQVJNX0JPT1QgOiBHTVVfQ09MRF9CT09UOworCisJIHJldCA9IGE2eHhfZ211X2Z3X3N0 YXJ0KGdtdSwgc3RhdHVzKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCSByZXQgPSBhNnh4 X2hmaV9zdGFydChnbXUsIHN0YXR1cyk7CisKK291dDoKKwkvKiBNYWtlIHN1cmUgdG8gdHVybiBv ZmYgdGhlIGJvb3QgT09CIHJlcXVlc3Qgb24gZXJyb3IgKi8KKwlpZiAocmV0KQorCQlhNnh4X2dt dV9jbGVhcl9vb2IoZ211LCBHTVVfT09CX0JPT1RfU0xVTUJFUik7CisKKwlyZXR1cm4gcmV0Owor fQorCitib29sIGE2eHhfZ211X2lzaWRsZShzdHJ1Y3QgYTZ4eF9nbXUgKmdtdSkKK3sKKwl1MzIg cmVnOworCisJaWYgKCFnbXUtPm1taW8pCisJCXJldHVybiB0cnVlOworCisJcmVnID0gZ211X3Jl YWQoZ211LCBSRUdfQTZYWF9HUFVfR01VX0FPX0dQVV9DWF9CVVNZX1NUQVRVUyk7CisKKwlpZiAo cmVnICYgIEE2WFhfR1BVX0dNVV9BT19HUFVfQ1hfQlVTWV9TVEFUVVNfR1BVQlVTWUlHTkFIQikK KwkJcmV0dXJuIGZhbHNlOworCisJcmV0dXJuIHRydWU7Cit9CisKK2ludCBhNnh4X2dtdV9zdG9w KHN0cnVjdCBhNnh4X2dwdSAqYTZ4eF9ncHUpCit7CisJc3RydWN0IGE2eHhfZ211ICpnbXUgPSAm YTZ4eF9ncHUtPmdtdTsKKwl1MzIgdmFsOworCisJLyoKKwkgKiBUaGUgR01VIG1heSBzdGlsbCBi ZSBpbiBzbHVtYmVyIHVubGVzcyB0aGUgR1BVIHN0YXJ0ZWQgc28gY2hlY2sgYW5kCisJICogc2tp cCBwdXR0aW5nIGl0IGJhY2sgaW50byBzbHVtYmVyIGlmIHNvCisJICovCisJdmFsID0gZ211X3Jl YWQoZ211LCBSRUdfQTZYWF9HUFVfR01VX0NYX0dNVV9SUE1IX1BPV0VSX1NUQVRFKTsKKworCWlm ICh2YWwgIT0gMHhmKSB7CisJCWludCByZXQgPSBhNnh4X2dtdV93YWl0X2Zvcl9pZGxlKGE2eHhf Z3B1KTsKKworCQkvKiBUZW1wb3JhcnkgdW50aWwgd2UgY2FuIHJlY292ZXIgc2FmZWx5ICovCisJ CUJVR19PTihyZXQpOworCisJCS8qIHRlbGwgdGhlIEdNVSB3ZSB3YW50IHRvIHNsdW1iZXIgKi8K KwkJYTZ4eF9nbXVfbm90aWZ5X3NsdW1iZXIoZ211KTsKKworCQlyZXQgPSBnbXVfcG9sbF90aW1l b3V0KGdtdSwKKwkJCVJFR19BNlhYX0dQVV9HTVVfQU9fR1BVX0NYX0JVU1lfU1RBVFVTLCB2YWws CisJCQkhKHZhbCAmIEE2WFhfR1BVX0dNVV9BT19HUFVfQ1hfQlVTWV9TVEFUVVNfR1BVQlVTWUlH TkFIQiksCisJCQkxMDAsIDEwMDAwKTsKKworCQkvKgorCQkgKiBMZXQgdGhlIHVzZXIga25vdyB3 ZSBmYWlsZWQgdG8gc2x1bWJlciBidXQgZG9uJ3Qgd29ycnkgdG9vCisJCSAqIG11Y2ggYmVjYXVz ZSB3ZSBhcmUgcG93ZXJpbmcgZG93biBhbnl3YXkKKwkJICovCisKKwkJaWYgKHJldCkKKwkJCWRl dl9lcnIoZ211LT5kZXYsCisJCQkJIlVuYWJsZSB0byBzbHVtYmVyIEdNVTogc3RhdHVzID0gMCV4 LzAleFxuIiwKKwkJCQlnbXVfcmVhZChnbXUsIFJFR19BNlhYX0dQVV9HTVVfQU9fR1BVX0NYX0JV U1lfU1RBVFVTKSwKKwkJCQlnbXVfcmVhZChnbXUsIFJFR19BNlhYX0dQVV9HTVVfQU9fR1BVX0NY X0JVU1lfU1RBVFVTMikpOworCX0KKworCS8qIFR1cm4gb2ZmIEhGSSAqLworCWE2eHhfaGZpX3N0 b3AoZ211KTsKKworCS8qIFN0b3AgdGhlIGludGVycnVwdHMgYW5kIG1hc2sgdGhlIGhhcmR3YXJl ICovCisJYTZ4eF9nbXVfaXJxX2Rpc2FibGUoZ211KTsKKworCS8qIFRlbGwgUlBNaCB0byBwb3dl ciBvZmYgdGhlIEdQVSAqLworCWE2eHhfcnBtaF9zdG9wKGdtdSk7CisKKwlhNnh4X2dtdV9kaXNh YmxlX2Nsb2NrcyhnbXUpOworCWE2eHhfZ211X2Rpc2FibGVfZ2RzYyhnbXUpOworCisJcmV0dXJu IDA7Cit9CisKK3N0YXRpYyB2b2lkIGE2eHhfZ211X21lbW9yeV9mcmVlKHN0cnVjdCBhNnh4X2dt dSAqZ211LCBzdHJ1Y3QgYTZ4eF9nbXVfYm8gKmJvKQoreworCWludCBjb3VudCwgaTsKKwl1NjQg aW92YTsKKworCWlmIChJU19FUlJfT1JfTlVMTChibykpCisJCXJldHVybjsKKworCWNvdW50ID0g Ym8tPnNpemUgPj4gUEFHRV9TSElGVDsKKwlpb3ZhID0gYm8tPmlvdmE7CisKKwlmb3IgKGkgPSAw OyBpIDwgY291bnQ7IGkrKywgaW92YSArPSBQQUdFX1NJWkUpIHsKKwkJaW9tbXVfdW5tYXAoZ211 LT5kb21haW4sIGlvdmEsIFBBR0VfU0laRSk7CisJCV9fZnJlZV9wYWdlcyhiby0+cGFnZXNbaV0s IDApOworCX0KKworCWtmcmVlKGJvLT5wYWdlcyk7CisJa2ZyZWUoYm8pOworfQorCitzdGF0aWMg c3RydWN0IGE2eHhfZ211X2JvICphNnh4X2dtdV9tZW1vcnlfYWxsb2Moc3RydWN0IGE2eHhfZ211 ICpnbXUsCisJCXNpemVfdCBzaXplKQoreworCXN0cnVjdCBhNnh4X2dtdV9ibyAqYm87CisJaW50 IHJldCA9IC1FTk9NRU0sIGNvdW50LCBpOworCisJYm8gPSBremFsbG9jKHNpemVvZigqYm8pLCBH RlBfS0VSTkVMKTsKKwlpZiAoIWJvKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCWJv LT5zaXplID0gUEFHRV9BTElHTihzaXplKTsKKworCWNvdW50ID0gYm8tPnNpemUgPj4gUEFHRV9T SElGVDsKKworCWJvLT5wYWdlcyA9IGtjYWxsb2MoY291bnQsIHNpemVvZihzdHJ1Y3QgcGFnZSAq KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFiby0+cGFnZXMpIHsKKwkJa2ZyZWUoYm8pOworCQlyZXR1 cm4gRVJSX1BUUigtRU5PTUVNKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykg eworCQliby0+cGFnZXNbaV0gPSBhbGxvY19wYWdlKEdGUF9LRVJORUwpOworCQlpZiAoIWJvLT5w YWdlc1tpXSkKKwkJCWdvdG8gZXJyOworCX0KKworCWJvLT5pb3ZhID0gZ211LT51bmNhY2hlZF9p b3ZhX2Jhc2U7CisKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQlyZXQgPSBpb21t dV9tYXAoZ211LT5kb21haW4sCisJCQliby0+aW92YSArIChQQUdFX1NJWkUgKiBpKSwKKwkJCXBh Z2VfdG9fcGh5cyhiby0+cGFnZXNbaV0pLCBQQUdFX1NJWkUsCisJCQlJT01NVV9SRUFEIHwgSU9N TVVfV1JJVEUpOworCisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoZ211LT5kZXYsICJVbmFibGUg dG8gbWFwIEdNVSBidWZmZXIgb2JqZWN0XG4iKTsKKworCQkJZm9yIChpID0gaSAtIDEgOyBpID49 IDA7IGktLSkgeworCQkJCWlvbW11X3VubWFwKGdtdS0+ZG9tYWluLAorCQkJCQliby0+aW92YSAr IChQQUdFX1NJWkUgKiBpKSwKKwkJCQkJUEFHRV9TSVpFKTsKKwkJCX0KKworCQkJZ290byBlcnI7 CisJCX0KKwl9CisKKwliby0+dmlydCA9IHZtYXAoYm8tPnBhZ2VzLCBjb3VudCwgVk1fSU9SRU1B UCwKKwkJcGdwcm90X3dyaXRlY29tYmluZShQQUdFX0tFUk5FTCkpOworCWlmICghYm8tPnZpcnQp CisJCWdvdG8gZXJyOworCisJLyogQWxpZ24gZnV0dXJlIElPVkEgYWRkcmVzc2VzIG9uIDFNQiBi b3VuZGFyaWVzICovCisJZ211LT51bmNhY2hlZF9pb3ZhX2Jhc2UgKz0gQUxJR04oc2l6ZSwgU1pf MU0pOworCisJcmV0dXJuIGJvOworCitlcnI6CisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKysp IHsKKwkJaWYgKGJvLT5wYWdlc1tpXSkKKwkJCV9fZnJlZV9wYWdlcyhiby0+cGFnZXNbaV0sIDAp OworCX0KKworCWtmcmVlKGJvLT5wYWdlcyk7CisJa2ZyZWUoYm8pOworCisJcmV0dXJuIEVSUl9Q VFIocmV0KTsKK30KKworc3RhdGljIGludCBhNnh4X2dtdV9tZW1vcnlfcHJvYmUoc3RydWN0IGE2 eHhfZ211ICpnbXUpCit7CisJaW50IHJldDsKKworCWdtdS0+ZG9tYWluID0gaW9tbXVfZG9tYWlu X2FsbG9jKCZwbGF0Zm9ybV9idXNfdHlwZSk7CisJaWYgKCFnbXUtPmRvbWFpbikKKwkJcmV0dXJu IC1FTk9ERVY7CisKKwlyZXQgPSBpb21tdV9hdHRhY2hfZGV2aWNlKGdtdS0+ZG9tYWluLCBnbXUt PmRldik7CisJaWYgKHJldCkgeworCQlpb21tdV9kb21haW5fZnJlZShnbXUtPmRvbWFpbik7CisJ CWdtdS0+ZG9tYWluID0gTlVMTDsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKgorCSAqIFRoaXMg aXMgdGhlIHN0YXJ0IG9mIHRoZSB1bmNhY2hlZCBzZWdtZW50IGluIHRoZSBHTVUgbWVtb3J5CisJ ICogbWFwLiBGb3Igbm93LCBhbGwgc2hhcmVkIGJ1ZmZlciBvYmplY3RzIGdvIGluIGhlcmUKKwkg Ki8KKwlnbXUtPnVuY2FjaGVkX2lvdmFfYmFzZSA9IDB4NjAwMDAwMDA7CisJcmV0dXJuIHJldDsK K30KKworLyogR2V0IHRoZSBsaXN0IG9mIFJQTWggdm9sdGFnZSBsZXZlbHMgZnJvbSBjbWQtZGIg Ki8KK3N0YXRpYyBpbnQgYTZ4eF9nbXVfcnBtaF9hcmNfY21kcyhjb25zdCBjaGFyICppZCwgdm9p ZCAqdmFscywgaW50IHNpemUpCit7CisJdTMyIGxlbiA9IGNtZF9kYl9nZXRfYXV4X2RhdGFfbGVu KGlkKTsKKworCWlmICghbGVuKQorCQlyZXR1cm4gMDsKKworCWlmIChXQVJOX09OKGxlbiA+IHNp emUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWNtZF9kYl9nZXRfYXV4X2RhdGEoaWQsIHZhbHMs IGxlbik7CisKKwkvKgorCSAqIFRoZSBkYXRhIGNvbWVzIGJhY2sgYXMgYW4gYXJyYXkgb2YgdW5z aWduZWQgc2hvcnRzIHNvIGFkanVzdCB0aGUKKwkgKiBjb3VudCBhY2NvcmRpbmdseQorCSAqLwor CXJldHVybiBsZW4gPj4gMTsKK30KKworc3RhdGljIGludCBhNnh4X2dtdV9ycG1oX2FyY192b3Rl c19pbml0KHN0cnVjdCBkZXZpY2UgKmRldiwgdTMyICp2b3RlcywKKwkJdW5zaWduZWQgbG9uZyAq ZnJlcXMsIGludCBmcmVxc19jb3VudCwKKwkJdTE2ICpwcmksIGludCBwcmlfY291bnQsCisJCXUx NiAqc2VjLCBpbnQgc2VjX2NvdW50KQoreworCWludCBpLCBqOworCisJLyogQ29uc3RydWN0IGEg dm90ZSBmb3IgZWFjaCBmcmVxdWVuY3kgKi8KKwlmb3IgKGkgPSAwOyBpIDwgZnJlcXNfY291bnQ7 IGkrKykgeworCQl1OCBwaW5kZXggPSAwLCBzaW5kZXggPSAwOworCQl1MTYgdm9sdGFnZSA9IDA7 CisJCXN0cnVjdCBkZXZfcG1fb3BwICpvcHA7CisKKwkJLyogR2V0IHRoZSB2b2x0YWdlIGZvciB0 aGUgT1BQIGxldmVsICovCisJCWlmIChmcmVxc1tpXSkgeworCQkJb3BwICA9IGRldl9wbV9vcHBf ZmluZF9mcmVxX2V4YWN0KGRldiwgZnJlcXNbaV0sIHRydWUpOworCQkJaWYgKCFJU19FUlIob3Bw KSkgeworCQkJCXZvbHRhZ2UgPSBkZXZfcG1fb3BwX2dldF92b2x0YWdlKG9wcCkgLSAxOworCQkJ CWRldl9wbV9vcHBfcHV0KG9wcCk7CisJCQl9CisJCX0KKworCQkvKiBHZXQgdGhlIHByaW1hcnkg aW5kZXggdGhhdCBtYXRjaGVzIHRoZSB2b2x0YWdlIGxldmVsICovCisJCWZvciAoaiA9IDA7IGog PCBwcmlfY291bnQ7IGorKykgeworCQkJaWYgKHByaVtqXSA9PSB2b2x0YWdlKSB7CisJCQkJcGlu ZGV4ID0gajsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmIChqID09IHByaV9jb3VudCkg eworCQkJZGV2X2VycihkZXYsCisJCQkJIlZvbHRhZ2UgJXUgbm90IGZvdW5kIGluIGluIHRoZSBS UE1oIGxldmVsc1xuIiwKKwkJCQl2b2x0YWdlKTsKKwkJCWRldl9lcnIoZGV2LCAiQXZhaWxhYmxl IHZvbHRhZ2VzOlxuIik7CisJCQlmb3IgKGogPSAwOyBqIDwgcHJpX2NvdW50OyBqKyspCisJCQkJ ZGV2X2VycihkZXYsICIgICV1XG4iLCBwcmlbal0pOworCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJ fQorCisJCS8qIExvb2sgZm9yIGEgdm9sdGFnZSBpbiBpbiB0aGUgc2Vjb25kYXJ5IGxpc3QgdGhh dCBtYXRjaGVzICovCisKKwkJLyogSWYgbm90aGluZyBlbHNlIG1hdGNoZXMsIHVzZSB0aGUgbWF4 aW11bSAqLworCQlzaW5kZXggPSBzZWNfY291bnQgLSAxOworCisJCWZvciAoaiA9IDA7IGogPCBz ZWNfY291bnQgLSAxOyBqKyspIHsKKwkJCWlmIChzZWNbal0gPj0gdm9sdGFnZSkKKwkJCQlzaW5k ZXggPSBqOworCQl9CisKKwkJLyogQ29uc3RydWN0IHRoZSB2b3RlICovCisJCXZvdGVzW2ldID0g KHZvbHRhZ2UgPDwgMTYpIHwgc2luZGV4IDw8IDggfCBwaW5kZXg7CisJfQorCisJcmV0dXJuIDA7 Cit9CisKKy8qCisgKiBUaGUgR01VIHZvdGVzIHdpdGggdGhlIFJQTWggZm9yIGl0c2VsZiBhbmQg b24gYmVoYWxmIG9mIHRoZSBHUFUgYnV0IHdlIG5lZWQKKyAqIHRvIGNvbnN0cnVjdCB0aGUgbGlz dCBvZiB2b3RlcyBvbiB0aGUgQ1BVIGFuZCBzZW5kIGl0IG92ZXIuIFF1ZXJ5IHRoZSBSUE1oCisg KiB2b2x0YWdlIGxldmVscyBhbmQgYnVpbGQgdGhlIHZvdGVzCisgKi8KKworc3RhdGljIGludCBh Nnh4X2dtdV9ycG1oX3ZvdGVzX2luaXQoc3RydWN0IGE2eHhfZ211ICpnbXUpCit7CisJc3RydWN0 IGE2eHhfZ3B1ICphNnh4X2dwdSA9IGNvbnRhaW5lcl9vZihnbXUsIHN0cnVjdCBhNnh4X2dwdSwg Z211KTsKKwlzdHJ1Y3QgYWRyZW5vX2dwdSAqYWRyZW5vX2dwdSA9ICZhNnh4X2dwdS0+YmFzZTsK KwlzdHJ1Y3QgbXNtX2dwdSAqZ3B1ID0gJmFkcmVub19ncHUtPmJhc2U7CisKKwl1MTYgZ3hbMTZd LCBjeFsxNl0sIG14WzE2XTsKKwl1MzIgZ3hjb3VudCwgY3hjb3VudCwgbXhjb3VudDsKKwlpbnQg cmV0OworCisJLyogR2V0IHRoZSBsaXN0IG9mIGF2YWlsYWJsZSB2b2x0YWdlIGxldmVscyBmb3Ig ZWFjaCBjb21wb25lbnQgKi8KKwlneGNvdW50ID0gYTZ4eF9nbXVfcnBtaF9hcmNfY21kcygiZ2Z4 Lmx2bCIsIGd4LCBzaXplb2YoZ3gpKTsKKwljeGNvdW50ID0gYTZ4eF9nbXVfcnBtaF9hcmNfY21k cygiY3gubHZsIiwgY3gsIHNpemVvZihjeCkpOworCW14Y291bnQgPSBhNnh4X2dtdV9ycG1oX2Fy Y19jbWRzKCJteC5sdmwiLCBteCwgc2l6ZW9mKG14KSk7CisKKwkvKiBCdWlsZCB0aGUgR1ggdm90 ZXMgKi8KKwlyZXQgPSBhNnh4X2dtdV9ycG1oX2FyY192b3Rlc19pbml0KCZncHUtPnBkZXYtPmRl diwgZ211LT5neF9hcmNfdm90ZXMsCisJCWdtdS0+Z3B1X2ZyZXFzLCBnbXUtPm5yX2dwdV9mcmVx cywKKwkJZ3gsIGd4Y291bnQsIG14LCBteGNvdW50KTsKKworCS8qIEJ1aWxkIHRoZSBDWCB2b3Rl cyAqLworCXJldCB8PSBhNnh4X2dtdV9ycG1oX2FyY192b3Rlc19pbml0KGdtdS0+ZGV2LCBnbXUt PmN4X2FyY192b3RlcywKKwkJZ211LT5nbXVfZnJlcXMsIGdtdS0+bnJfZ211X2ZyZXFzLAorCQlj eCwgY3hjb3VudCwgbXgsIG14Y291bnQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlu dCBhNnh4X2dtdV9idWlsZF9mcmVxX3RhYmxlKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQg bG9uZyAqZnJlcXMsCisJCXUzMiBzaXplKQoreworCWludCBjb3VudCA9IGRldl9wbV9vcHBfZ2V0 X29wcF9jb3VudChkZXYpOworCXN0cnVjdCBkZXZfcG1fb3BwICpvcHA7CisJaW50IGksIGluZGV4 ID0gMDsKKwl1bnNpZ25lZCBsb25nIGZyZXE7CisKKwkvKgorCSAqIFRoZSBPUFAgdGFibGUgZG9l c24ndCBjb250YWluIHRoZSAib2ZmIiBmcmVxdWVuY3kgbGV2ZWwgc28gd2UgbmVlZCB0bworCSAq IGFkZCAxIHRvIHRoZSB0YWJsZSBzaXplIHRvIGFjY291bnQgZm9yIGl0CisJICovCisKKwlpZiAo V0FSTihjb3VudCArIDEgPiBzaXplLAorCQkiVGhlIEdNVSBmcmVxdWVuY3kgdGFibGUgaXMgYmVp bmcgdHJ1bmNhdGVkXG4iKSkKKwkJY291bnQgPSBzaXplIC0gMTsKKworCS8qIFNldCB0aGUgIm9m ZiIgZnJlcXVlbmN5ICovCisJZnJlcXNbaW5kZXgrK10gPSAwOworCisJZm9yIChpID0gMDsgaSA8 IGNvdW50OyBpKyspIHsKKwkJb3BwID0gZGV2X3BtX29wcF9maW5kX2ZyZXFfY2VpbChkZXYsICZm cmVxKTsKKwkJaWYgKElTX0VSUihvcHApKQorCQkJYnJlYWs7CisKKwkJZnJlcXNbaW5kZXgrK10g PSBmcmVxOworCX0KKworCXJldHVybiBpbmRleDsKK30KKworc3RhdGljIGludCBhNnh4X2dtdV9w d3JsZXZlbHNfcHJvYmUoc3RydWN0IGE2eHhfZ211ICpnbXUpCit7CisJc3RydWN0IGE2eHhfZ3B1 ICphNnh4X2dwdSA9IGNvbnRhaW5lcl9vZihnbXUsIHN0cnVjdCBhNnh4X2dwdSwgZ211KTsKKwlz dHJ1Y3QgYWRyZW5vX2dwdSAqYWRyZW5vX2dwdSA9ICZhNnh4X2dwdS0+YmFzZTsKKwlzdHJ1Y3Qg bXNtX2dwdSAqZ3B1ID0gJmFkcmVub19ncHUtPmJhc2U7CisKKwlpbnQgcmV0ID0gMDsKKworCS8q CisJICogVGhlIEdNVSBoYW5kbGVzIGl0cyBvd24gZnJlcXVlbmN5IHN3aXRjaGluZyBzbyBidWls ZCBhIGxpc3Qgb2YKKwkgKiBhdmFpbGFibGUgZnJlcXVlbmNpZXMgdG8gc2VuZCBkdXJpbmcgaW5p dGFsaXphdGlvbgorCSAqLworCXJldCA9IGRldl9wbV9vcHBfb2ZfYWRkX3RhYmxlKGdtdS0+ZGV2 KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZ211LT5kZXYsICJVbmFibGUgdG8gc2V0IHRoZSBP UFAgdGFibGUgZm9yIHRoZSBHTVVcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCWdtdS0+bnJf Z211X2ZyZXFzID0gYTZ4eF9nbXVfYnVpbGRfZnJlcV90YWJsZShnbXUtPmRldiwKKwkJZ211LT5n bXVfZnJlcXMsIEFSUkFZX1NJWkUoZ211LT5nbXVfZnJlcXMpKTsKKworCS8qCisJICogVGhlIEdN VSBhbHNvIGhhbmRsZXMgR1BVIGZyZXF1ZW5jeSBzd2l0Y2hpbmcgc28gYnVpbGQgYSBsaXN0CisJ ICogZnJvbSB0aGUgR1BVIE9QUCB0YWJsZQorCSAqLworCWdtdS0+bnJfZ3B1X2ZyZXFzID0gYTZ4 eF9nbXVfYnVpbGRfZnJlcV90YWJsZSgmZ3B1LT5wZGV2LT5kZXYsCisJCWdtdS0+Z3B1X2ZyZXFz LCBBUlJBWV9TSVpFKGdtdS0+Z3B1X2ZyZXFzKSk7CisKKwkvKiBCdWlsZCB0aGUgbGlzdCBvZiBS UE1oIHZvdGVzIHRoYXQgd2UnbGwgc2VuZCB0byB0aGUgR01VICovCisJcmV0dXJuIGE2eHhfZ211 X3JwbWhfdm90ZXNfaW5pdChnbXUpOworfQorCitzdGF0aWMgaW50IGE2eHhfZ211X2Nsb2Nrc19w cm9iZShzdHJ1Y3QgYTZ4eF9nbXUgKmdtdSkKK3sKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CisJ Y29uc3QgY2hhciAqbmFtZTsKKwlpbnQgaSA9IDA7CisKKwlnbXUtPm5yX2Nsb2NrcyA9IG9mX3By b3BlcnR5X2NvdW50X3N0cmluZ3MoZ211LT5kZXYtPm9mX25vZGUsCisJCSJjbG9jay1uYW1lcyIp OworCisJaWYgKGdtdS0+bnJfY2xvY2tzIDwgMSkgeworCQlkZXZfZXJyKGdtdS0+ZGV2LCAiTm8g Y2xvY2tzIGhhdmUgYmVlbiBkZWZpbmVkXG4iKTsKKwkJZ211LT5ucl9jbG9ja3MgPSAwOworCQly ZXR1cm4gMDsKKwl9CisKKwlnbXUtPmNsb2NrcyA9IGRldm1fa2NhbGxvYyhnbXUtPmRldiwgc2l6 ZW9mKHN0cnVjdCBjbGsgKiksCisJCWdtdS0+bnJfY2xvY2tzLCBHRlBfS0VSTkVMKTsKKwlpZiAo IWdtdS0+Y2xvY2tzKSB7CisJCWdtdS0+bnJfY2xvY2tzID0gMDsKKwkJcmV0dXJuIC1FTk9NRU07 CisJfQorCisJb2ZfcHJvcGVydHlfZm9yX2VhY2hfc3RyaW5nKGdtdS0+ZGV2LT5vZl9ub2RlLCAi Y2xvY2stbmFtZXMiLCBwcm9wLAorCQluYW1lKSB7CisJCWdtdS0+Y2xvY2tzW2ldID0gZGV2bV9j bGtfZ2V0KGdtdS0+ZGV2LCBuYW1lKTsKKwkJaWYgKElTX0VSUihnbXUtPmNsb2Nrc1tpXSkpIHsK KwkJCWludCByZXQgPSBQVFJfRVJSKGdtdS0+Y2xvY2tzW2ldKTsKKworCQkJZGV2X2VycihnbXUt PmRldiwgIlVuYWJsZSB0byBhbGxvY2F0ZSBjbG9jayAlczogJWRcbiIsCisJCQkJbmFtZSwgcmV0 KTsKKwkJfQorCisJCWlmIChzdHJjbXAobmFtZSwgImdtdSIpIHx8IHN0cmNtcChuYW1lLCAiZ211 X2NsayIpKQorCQkJZ211LT5jb3JlX2NsayA9IGdtdS0+Y2xvY2tzW2ldOworCisJCWkrKzsKKwl9 CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19pb21lbSAqYTZ4eF9nbXVfZ2V0X21t aW8oc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJY29uc3QgY2hhciAqbmFtZSkKK3sK Kwl2b2lkIF9faW9tZW0gKnJldDsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlcyA9IHBsYXRmb3JtX2dl dF9yZXNvdXJjZV9ieW5hbWUocGRldiwKKwkJCUlPUkVTT1VSQ0VfTUVNLCBuYW1lKTsKKworCWlm ICghcmVzKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIlVuYWJsZSB0byBmaW5kIHRoZSAlcyBy ZWdpc3RlcnNcbiIsIG5hbWUpOworCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwl9CisKKwly ZXQgPSBkZXZtX2lvcmVtYXAoJnBkZXYtPmRldiwgcmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShy ZXMpKTsKKwlpZiAoIXJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJVbmFibGUgdG8gbWFw IHRoZSAlcyByZWdpc3RlcnNcbiIsIG5hbWUpOworCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsK Kwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGE2eHhfZ211X2dldF9pcnEoc3Ry dWN0IGE2eHhfZ211ICpnbXUsIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJCWNvbnN0 IGNoYXIgKm5hbWUsIGlycV9oYW5kbGVyX3QgaGFuZGxlcikKK3sKKwlpbnQgaXJxLCByZXQ7CisK KwlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxX2J5bmFtZShwZGV2LCBuYW1lKTsKKworCXJldCA9IGRl dm1fcmVxdWVzdF9pcnEoJnBkZXYtPmRldiwgaXJxLCBoYW5kbGVyLCBJUlFGX1RSSUdHRVJfSElH SCwKKwkJbmFtZSwgZ211KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIlVu YWJsZSB0byBnZXQgaW50ZXJydXB0ICVzXG4iLCBuYW1lKTsKKwkJcmV0dXJuIHJldDsKKwl9CisK KwlkaXNhYmxlX2lycShpcnEpOworCisJcmV0dXJuIGlycTsKK30KKwordm9pZCBhNnh4X2dtdV9y ZW1vdmUoc3RydWN0IGE2eHhfZ3B1ICphNnh4X2dwdSkKK3sKKwlzdHJ1Y3QgYTZ4eF9nbXUgKmdt dSA9ICZhNnh4X2dwdS0+Z211OworCisJaWYgKElTX0VSUl9PUl9OVUxMKGdtdS0+bW1pbykpCisJ CXJldHVybjsKKworCWE2eHhfZ211X3N0b3AoYTZ4eF9ncHUpOworCisJYTZ4eF9nbXVfaXJxX2Rp c2FibGUoZ211KTsKKwlhNnh4X2dtdV9tZW1vcnlfZnJlZShnbXUsIGdtdS0+aGZpKTsKKworCWlv bW11X2RldGFjaF9kZXZpY2UoZ211LT5kb21haW4sIGdtdS0+ZGV2KTsKKwlpb21tdV9kb21haW5f ZnJlZShnbXUtPmRvbWFpbik7Cit9CisKK2ludCBhNnh4X2dtdV9wcm9iZShzdHJ1Y3QgYTZ4eF9n cHUgKmE2eHhfZ3B1LCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUpCit7CisJc3RydWN0IGE2eHhf Z211ICpnbXUgPSAmYTZ4eF9ncHUtPmdtdTsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2 ID0gb2ZfZmluZF9kZXZpY2VfYnlfbm9kZShub2RlKTsKKwlpbnQgcmV0OworCisJaWYgKCFwZGV2 KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWdtdS0+ZGV2ID0gJnBkZXYtPmRldjsKKworCW9mX2Rt YV9jb25maWd1cmUoZ211LT5kZXYsIG5vZGUpOworCisJLyogRm93IG5vdywgZG9uJ3QgZG8gYW55 dGhpbmcgZmFuY3kgdW50aWwgd2UgZ2V0IG91ciBmZWV0IHVuZGVyIHVzICovCisJZ211LT5pZGxl X2xldmVsID0gR01VX0lETEVfU1RBVEVfQUNUSVZFOworCisJZ211LT5jeCA9IGRldm1fcmVndWxh dG9yX2dldChnbXUtPmRldiwgInZkZGN4Iik7CisJZ211LT5neCA9IGRldm1fcmVndWxhdG9yX2dl dChnbXUtPmRldiwgInZkZCIpOworCisJLyogR2V0IHRoZSBsaXN0IG9mIGNsb2NrcyAqLworCXJl dCA9IGE2eHhfZ211X2Nsb2Nrc19wcm9iZShnbXUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7 CisKKwkvKiBTZXQgdXAgdGhlIElPTU1VIGNvbnRleHQgYmFuayAqLworCXJldCA9IGE2eHhfZ211 X21lbW9yeV9wcm9iZShnbXUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiBBbGxv Y2F0ZSBtZW1vcnkgZm9yIGZvciB0aGUgSEZJIHF1ZXVlcyAqLworCWdtdS0+aGZpID0gYTZ4eF9n bXVfbWVtb3J5X2FsbG9jKGdtdSwgU1pfMTZLKTsKKwlpZiAoSVNfRVJSKGdtdS0+aGZpKSkKKwkJ Z290byBlcnI7CisKKwkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBHTVUgZGVidWcgcmVnaW9u ICovCisJZ211LT5kZWJ1ZyA9IGE2eHhfZ211X21lbW9yeV9hbGxvYyhnbXUsIFNaXzE2Syk7CisJ aWYgKElTX0VSUihnbXUtPmRlYnVnKSkKKwkJZ290byBlcnI7CisKKwkvKiBNYXAgdGhlIEdNVSBy ZWdpc3RlcnMgKi8KKwlnbXUtPm1taW8gPSBhNnh4X2dtdV9nZXRfbW1pbyhwZGV2LCAiZ211X3Jl ZyIpOworCisJLyogTWFwIHRoZSBHUFUgcG93ZXIgZG9tYWluIGNvbnRyb2xsZXIgcmVnaXN0ZXJz ICovCisJZ211LT5wZGNfbW1pbyA9IGE2eHhfZ211X2dldF9tbWlvKHBkZXYsICJnbXVfcGRjX3Jl ZyIpOworCisJaWYgKElTX0VSUihnbXUtPm1taW8pIHx8IElTX0VSUihnbXUtPnBkY19tbWlvKSkK KwkJZ290byBlcnI7CisKKwkvKiBHZXQgdGhlIEhGSSBhbmQgR01VIGludGVycnVwdHMgKi8KKwln bXUtPmhmaV9pcnEgPSBhNnh4X2dtdV9nZXRfaXJxKGdtdSwgcGRldiwgImhmaV9pcnEiLCBhNnh4 X2hmaV9pcnEpOworCWdtdS0+Z211X2lycSA9IGE2eHhfZ211X2dldF9pcnEoZ211LCBwZGV2LCAi Z211X2lycSIsIGE2eHhfZ211X2lycSk7CisKKwlpZiAoZ211LT5oZmlfaXJxIDwgMCB8fCBnbXUt PmdtdV9pcnEgPCAwKQorCQlnb3RvIGVycjsKKworCS8qIFNldCB1cCBhIHRhc2tsZXQgdG8gaGFu ZGxlIEdNVSBIRkkgcmVzcG9uc2VzICovCisJdGFza2xldF9pbml0KCZnbXUtPmhmaV90YXNrbGV0 LCBhNnh4X2hmaV90YXNrLCAodW5zaWduZWQgbG9uZykgZ211KTsKKworCS8qIEdldCB0aGUgcG93 ZXIgbGV2ZWxzIGZvciB0aGUgR01VIGFuZCBHUFUgKi8KKwlhNnh4X2dtdV9wd3JsZXZlbHNfcHJv YmUoZ211KTsKKworCS8qIFNldCB1cCB0aGUgSEZJIHF1ZXVlcyAqLworCWE2eHhfaGZpX2luaXQo Z211KTsKKworCXJldHVybiAwOworZXJyOgorCWE2eHhfZ211X21lbW9yeV9mcmVlKGdtdSwgZ211 LT5oZmkpOworCisJaWYgKGdtdS0+ZG9tYWluKSB7CisJCWlvbW11X2RldGFjaF9kZXZpY2UoZ211 LT5kb21haW4sIGdtdS0+ZGV2KTsKKwkJaW9tbXVfZG9tYWluX2ZyZWUoZ211LT5kb21haW4pOwor CX0KKworCXJldHVybiAtRU5PREVWOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21z bS9hZHJlbm8vYTZ4eF9nbXUuaCBiL2RyaXZlcnMvZ3B1L2RybS9tc20vYWRyZW5vL2E2eHhfZ211 LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM2ZDkzZgotLS0gL2Rldi9u dWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vYWRyZW5vL2E2eHhfZ211LmgKQEAgLTAsMCAr MSwxNzQgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNyBUaGUgTGludXggRm91bmRhdGlvbi4gQWxs IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsg eW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRl cm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBv bmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlv bi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBp dCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBl dmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVT UyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJs aWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaWZuZGVmIF9BNlhYX0dN VV9IXworI2RlZmluZSBfQTZYWF9HTVVfSF8KKworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5o PgorI2luY2x1ZGUgIm1zbV9kcnYuaCIKKyNpbmNsdWRlICJhNnh4X2hmaS5oIgorCitzdHJ1Y3Qg YTZ4eF9nbXVfYm8geworCXZvaWQgKnZpcnQ7CisJc2l6ZV90IHNpemU7CisJdTY0IGlvdmE7CisJ c3RydWN0IHBhZ2UgKipwYWdlczsKK307CisKKy8qCisgKiBUaGVzZSBkZWZpbmUgdGhlIGRpZmZl cmVudCBHTVUgd2FrZSB1cCBvcHRpb25zIC0gdGhlc2UgZGVmaW5lIGhvdyBib3RoIHRoZQorICog Q1BVIGFuZCB0aGUgR01VIGJyaW5nIHVwIHRoZSBoYXJkd2FyZQorICovCisKKy8qIFRIZSBHTVUg aGFzIGFscmVhZHkgYmVlbiBib290ZWQgYW5kIHRoZSByZW50ZW50aW9uIHJlZ2lzdGVycyBhcmUg YWN0aXZlICovCisjZGVmaW5lIEdNVV9XQVJNX0JPT1QgMAorCisvKiB0aGUgR01VIGlzIGNvbWlu ZyB1cCBmb3IgdGhlIGZpcnN0IHRpbWUgb3IgYmFjayBmcm9tIGEgcG93ZXIgY29sbGFwc2UgKi8K KyNkZWZpbmUgR01VX0NPTERfQk9PVCAxCisKKy8qIFRoZSBHTVUgaXMgYmVpbmcgc29mdCByZXNl dCBhZnRlciBhIGZhdWx0ICovCisjZGVmaW5lIEdNVV9SRVNFVCAyCisKKy8qCisgKiBUaGVzZSBk ZWZpbmUgdGhlIGxldmVsIG9mIGNvbnRyb2wgdGhhdCB0aGUgR01VIGhhcyAtIHRoZSBoaWdoZXIg dGhlIG51bWJlcgorICogdGhlIG1vcmUgdGhpbmdzIHRoYXQgdGhlIEdNVSBoYXJkd2FyZSBjb250 cm9scyBvbiBpdHMgb3duLgorICovCisKKy8qIFRoZSBHTVUgZG9lcyBub3QgZG8gYW55IGlkbGUg c3RhdGUgbWFuYWdlbWVudCAqLworI2RlZmluZSBHTVVfSURMRV9TVEFURV9BQ1RJVkUgMAorCisv KiBUaGUgR01VIG1hbmFnZXMgU1BUUCBwb3dlciBjb2xsYXBzZSAqLworI2RlZmluZSBHTVVfSURM RV9TVEFURV9TUFRQIDIKKworLyogVGhlIEdNVSBkb2VzIGF1dG9tYXRpYyBJRlBDIChpbnRyYS1m cmFtZSBwb3dlciBjb2xsYXBzZSkgKi8KKyNkZWZpbmUgR01VX0lETEVfU1RBVEVfSUZQQyAzCisK K3N0cnVjdCBhNnh4X2dtdSB7CisJc3RydWN0IGRldmljZSAqZGV2OworCisJdm9pZCAqIF9faW9t ZW0gbW1pbzsKKwl2b2lkICogX19pb21lbSBwZGNfbW1pbzsKKworCWludCBoZmlfaXJxOworCWlu dCBnbXVfaXJxOworCisJc3RydWN0IHJlZ3VsYXRvciAqY3g7CisJc3RydWN0IHJlZ3VsYXRvciAq Z3g7CisKKwlzdHJ1Y3QgaW9tbXVfZG9tYWluICpkb21haW47CisJdTY0IHVuY2FjaGVkX2lvdmFf YmFzZTsKKworCWludCBpZGxlX2xldmVsOworCisJc3RydWN0IGE2eHhfZ211X2JvICpoZmk7CisJ c3RydWN0IGE2eHhfZ211X2JvICpkZWJ1ZzsKKworCWludCBucl9jbG9ja3M7CisJc3RydWN0IGNs ayAqKmNsb2NrczsKKwlzdHJ1Y3QgY2xrICpjb3JlX2NsazsKKworCWludCBucl9ncHVfZnJlcXM7 CisJdW5zaWduZWQgbG9uZyBncHVfZnJlcXNbMTZdOworCXUzMiBneF9hcmNfdm90ZXNbMTZdOwor CisJaW50IG5yX2dtdV9mcmVxczsKKwl1bnNpZ25lZCBsb25nIGdtdV9mcmVxc1s0XTsKKwl1MzIg Y3hfYXJjX3ZvdGVzWzRdOworCisJc3RydWN0IGE2eHhfaGZpX3F1ZXVlIHF1ZXVlc1syXTsKKwor CXN0cnVjdCB0YXNrbGV0X3N0cnVjdCBoZmlfdGFza2xldDsKKworCWNvbnN0IHN0cnVjdCBmaXJt d2FyZSAqdWNvZGU7Cit9OworCitzdGF0aWMgaW5saW5lIHUzMiBnbXVfcmVhZChzdHJ1Y3QgYTZ4 eF9nbXUgKmdtdSwgdTMyIG9mZnNldCkKK3sKKwlyZXR1cm4gbXNtX3JlYWRsKGdtdS0+bW1pbyAr IChvZmZzZXQgPDwgMikpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ211X3dyaXRlKHN0cnVj dCBhNnh4X2dtdSAqZ211LCB1MzIgb2Zmc2V0LCB1MzIgdmFsdWUpCit7CisJcmV0dXJuIG1zbV93 cml0ZWwodmFsdWUsIGdtdS0+bW1pbyArIChvZmZzZXQgPDwgMikpOworfQorCitzdGF0aWMgaW5s aW5lIHZvaWQgcGRjX3dyaXRlKHN0cnVjdCBhNnh4X2dtdSAqZ211LCB1MzIgb2Zmc2V0LCB1MzIg dmFsdWUpCit7CisJcmV0dXJuIG1zbV93cml0ZWwodmFsdWUsIGdtdS0+cGRjX21taW8gKyAob2Zm c2V0IDw8IDIpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGdtdV9ybXcoc3RydWN0IGE2eHhf Z211ICpnbXUsIHUzMiByZWcsIHUzMiBtYXNrLCB1MzIgb3IpCit7CisJdTMyIHZhbCA9IGdtdV9y ZWFkKGdtdSwgcmVnKTsKKworCXZhbCAmPSB+bWFzazsKKworCWdtdV93cml0ZShnbXUsIHJlZywg dmFsIHwgb3IpOworfQorCisjZGVmaW5lIGdtdV9wb2xsX3RpbWVvdXQoZ211LCBhZGRyLCB2YWws IGNvbmQsIGludGVydmFsLCB0aW1lb3V0KSBcCisJcmVhZGxfcG9sbF90aW1lb3V0KChnbXUpLT5t bWlvICsgKChhZGRyKSA8PCAyKSwgdmFsLCBjb25kLCBcCisJCWludGVydmFsLCB0aW1lb3V0KQor CisvKgorICogVGhlc2UgYXJlIHRoZSBhdmFpbGFibGUgT09CIChvdXQgb2YgYmFuZCByZXF1ZXN0 cykgdG8gdGhlIEdNVSB3aGVyZSAib3V0IG9mCisgKiBiYW5kIiBtZWFucyB0aGF0IHRoZSBDUFUg dGFsa3MgdG8gdGhlIEdNVSBkaXJlY3RseSBhbmQgbm90IHRocm91Z2ggSEZJLgorICogTm9ybWFs bHkgdGhpcyB3b3JrcyBieSB3cml0aW5nIGEgSVRDTS9EVENNIHJlZ2lzdGVyIGFuZCB0aGVuIHRy aWdnZXJpbmcgYQorICogaW50ZXJydXB0ICh0aGUgInJlcXVlc3QiIGJpdCkgYW5kIHdhaXRpbmcg Zm9yIGFuIGFja25vd2xlZGdtZW50ICh0aGUgImFjayIKKyAqIGJpdCkuIFRoZSBzdGF0ZSBpcyBj bGVhcmVkIGJ5IHdyaXRpbmcgdGhlICJjbGVhcicgYml0IHRvIHRoZSBHTVUgaW50ZXJydXB0Lgor ICoKKyAqIFRoZXNlIGFyZSB1c2VkIHRvIGZvcmNlIHRoZSBHTVUvR1BVIHRvIHN0YXkgb24gZHVy aW5nIGEgY3JpdGljYWwgc2VxdWVuY2Ugb3IKKyAqIGZvciBoYXJkd2FyZSB3b3JrYXJvdW5kcy4K KyAqLworCitlbnVtIGE2eHhfZ211X29vYl9zdGF0ZSB7CisJR01VX09PQl9CT09UX1NMVU1CRVIg PSAwLAorCUdNVV9PT0JfR1BVX1NFVCwKK307CisKKy8qIFRoZXNlIGFyZSB0aGUgaW50ZXJydXB0 IC8gYWNrIGJpdHMgZm9yIGVhY2ggT09CIHJlcXVlc3QgdGhhdCBhcmUgc2V0CisgKiBpbiBhNnh4 X2dtdV9zZXRfb29iIGFuZCBhNnh4X2NsZWFyX29vYgorICovCisKKy8qCisgKiBMZXQgdGhlIEdN VSBrbm93IHRoYXQgYSBib290IG9yIHNsdW1iZXIgb3BlcmF0aW9uIGhhcyBzdGFydGVkLiBUaGUg dmFsdWUgaW4KKyAqIFJFR19BNlhYX0dNVV9CT09UX1NMVU1CRVJfT1BUSU9OIGxldHMgdGhlIEdN VSBrbm93IHdoaWNoIG9wZXJhdGlvbiB3ZSBhcmUKKyAqIGRvaW5nCisgKi8KKyNkZWZpbmUgR01V X09PQl9CT09UX1NMVU1CRVJfUkVRVUVTVAkyMgorI2RlZmluZSBHTVVfT09CX0JPT1RfU0xVTUJF Ul9BQ0sJMzAKKyNkZWZpbmUgR01VX09PQl9CT09UX1NMVU1CRVJfQ0xFQVIJMzAKKworLyoKKyAq IFNldCBhIG5ldyBwb3dlciBsZXZlbCBmb3IgdGhlIEdQVSB3aGVuIHRoZSBDUFUgaXMgZG9pbmcg ZnJlcXVlbmN5IHNjYWxpbmcKKyAqLworI2RlZmluZSBHTVVfT09CX0RDVlNfUkVRVUVTVAkyMwor I2RlZmluZSBHTVVfT09CX0RDVlNfQUNLCTMxCisjZGVmaW5lIEdNVV9PT0JfRENWU19DTEVBUgkz MQorCisvKgorICogTGV0IHRoZSBHTVUga25vdyB0byBub3QgdHVybiBvZmYgYW55IEdQVSByZWdp c3RlcnMgd2hpbGUgdGhlIENQVSBpcyBpbiBhCisgKiBjcml0aWNhbCBzZWN0aW9uCisgKi8KKyNk ZWZpbmUgR01VX09PQl9HUFVfU0VUX1JFUVVFU1QJMTYKKyNkZWZpbmUgR01VX09PQl9HUFVfU0VU X0FDSwkyNAorI2RlZmluZSBHTVVfT09CX0dQVV9TRVRfQ0xFQVIJMjQKKworCit2b2lkIGE2eHhf aGZpX2luaXQoc3RydWN0IGE2eHhfZ211ICpnbXUpOworaW50IGE2eHhfaGZpX3N0YXJ0KHN0cnVj dCBhNnh4X2dtdSAqZ211LCBpbnQgYm9vdF9zdGF0ZSk7Cit2b2lkIGE2eHhfaGZpX3N0b3Aoc3Ry dWN0IGE2eHhfZ211ICpnbXUpOworCit2b2lkIGE2eHhfaGZpX3Rhc2sodW5zaWduZWQgbG9uZyBk YXRhKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL2FkcmVuby9h Nnh4X2dwdS5jIGIvZHJpdmVycy9ncHUvZHJtL21zbS9hZHJlbm8vYTZ4eF9ncHUuYwpuZXcgZmls ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjA0MjY1Ci0tLSAvZGV2L251bGwKKysrIGIv ZHJpdmVycy9ncHUvZHJtL21zbS9hZHJlbm8vYTZ4eF9ncHUuYwpAQCAtMCwwICsxLDgxOSBAQAor LyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdo dHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBj YW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBv ZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2 ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisg KgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2ls bCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0 aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9S IEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExp Y2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworCisjaW5jbHVkZSAibXNtX2dlbS5o IgorI2luY2x1ZGUgIm1zbV9tbXUuaCIKKyNpbmNsdWRlICJhNnh4X2dwdS5oIgorI2luY2x1ZGUg ImE2eHhfZ211LnhtbC5oIgorCitzdGF0aWMgaW5saW5lIGJvb2wgX2E2eHhfY2hlY2tfaWRsZShz dHJ1Y3QgbXNtX2dwdSAqZ3B1KQoreworCXN0cnVjdCBhZHJlbm9fZ3B1ICphZHJlbm9fZ3B1ID0g dG9fYWRyZW5vX2dwdShncHUpOworCXN0cnVjdCBhNnh4X2dwdSAqYTZ4eF9ncHUgPSB0b19hNnh4 X2dwdShhZHJlbm9fZ3B1KTsKKworCS8qIENoZWNrIHRoYXQgdGhlIEdNVSBpcyBpZGxlICovCisJ aWYgKCFhNnh4X2dtdV9pc2lkbGUoJmE2eHhfZ3B1LT5nbXUpKQorCQlyZXR1cm4gZmFsc2U7CisK KwkvKiBDaGVjayB0aGEgdGhlIENYIG1hc3RlciBpcyBpZGxlICovCisJaWYgKGdwdV9yZWFkKGdw dSwgUkVHX0E2WFhfUkJCTV9TVEFUVVMpICYKKwkJCX5BNlhYX1JCQk1fU1RBVFVTX0NQX0FIQl9C VVNZX0NYX01BU1RFUikKKwkJcmV0dXJuIGZhbHNlOworCisJcmV0dXJuICEoZ3B1X3JlYWQoZ3B1 LCBSRUdfQTZYWF9SQkJNX0lOVF8wX1NUQVRVUykgJgorCQlBNlhYX1JCQk1fSU5UXzBfTUFTS19S QkJNX0hBTkdfREVURUNUKTsKK30KKworYm9vbCBhNnh4X2lkbGUoc3RydWN0IG1zbV9ncHUgKmdw dSwgc3RydWN0IG1zbV9yaW5nYnVmZmVyICpyaW5nKQoreworCS8qIHdhaXQgZm9yIENQIHRvIGRy YWluIHJpbmdidWZmZXI6ICovCisJaWYgKCFhZHJlbm9faWRsZShncHUsIHJpbmcpKQorCQlyZXR1 cm4gZmFsc2U7CisKKwlpZiAoc3Bpbl91bnRpbChfYTZ4eF9jaGVja19pZGxlKGdwdSkpKSB7CisJ CURSTV9FUlJPUigiJXM6ICVwczogdGltZW91dCB3YWl0aW5nIGZvciBHUFUgdG8gaWRsZTogc3Rh dHVzICU4LjhYIGlycSAlOC44WCBycHRyL3dwdHIgJWQvJWRcbiIsCisJCQlncHUtPm5hbWUsIF9f YnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSwKKwkJCWdwdV9yZWFkKGdwdSwgUkVHX0E2WFhfUkJC TV9TVEFUVVMpLAorCQkJZ3B1X3JlYWQoZ3B1LCBSRUdfQTZYWF9SQkJNX0lOVF8wX1NUQVRVUyks CisJCQlncHVfcmVhZChncHUsIFJFR19BNlhYX0NQX1JCX1JQVFIpLAorCQkJZ3B1X3JlYWQoZ3B1 LCBSRUdfQTZYWF9DUF9SQl9XUFRSKSk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlyZXR1cm4g dHJ1ZTsKK30KKworc3RhdGljIHZvaWQgYTZ4eF9mbHVzaChzdHJ1Y3QgbXNtX2dwdSAqZ3B1LCBz dHJ1Y3QgbXNtX3JpbmdidWZmZXIgKnJpbmcpCit7CisJdWludDMyX3Qgd3B0cjsKKwl1bnNpZ25l ZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnJpbmctPmxvY2ssIGZsYWdzKTsK KworCS8qIENvcHkgdGhlIHNoYWRvdyB0byB0aGUgYWN0dWFsIHJlZ2lzdGVyICovCisJcmluZy0+ Y3VyID0gcmluZy0+bmV4dDsKKworCS8qIE1ha2Ugc3VyZSB0byB3cmFwIHdwdHIgaWYgd2UgbmVl ZCB0byAqLworCXdwdHIgPSBnZXRfd3B0cihyaW5nKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3Rv cmUoJnJpbmctPmxvY2ssIGZsYWdzKTsKKworCS8qIE1ha2Ugc3VyZSBldmVyeXRoaW5nIGlzIHBv c3RlZCBiZWZvcmUgbWFraW5nIGEgZGVjaXNpb24gKi8KKwltYigpOworCisJZ3B1X3dyaXRlKGdw dSwgUkVHX0E2WFhfQ1BfUkJfV1BUUiwgd3B0cik7Cit9CisKK3N0YXRpYyB2b2lkIGE2eHhfc3Vi bWl0KHN0cnVjdCBtc21fZ3B1ICpncHUsIHN0cnVjdCBtc21fZ2VtX3N1Ym1pdCAqc3VibWl0LAor CXN0cnVjdCBtc21fZmlsZV9wcml2YXRlICpjdHgpCit7CisJc3RydWN0IG1zbV9kcm1fcHJpdmF0 ZSAqcHJpdiA9IGdwdS0+ZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgbXNtX3JpbmdidWZmZXIg KnJpbmcgPSBzdWJtaXQtPnJpbmc7CisJdW5zaWduZWQgaW50IGk7CisKKwkvKiBJbnZhbGlkYXRl IENDVSBkZXB0aCBhbmQgY29sb3IgKi8KKwlPVVRfUEtUNyhyaW5nLCBDUF9FVkVOVF9XUklURSwg MSk7CisJT1VUX1JJTkcocmluZywgUENfQ0NVX0lOVkFMSURBVEVfREVQVEgpOworCisJT1VUX1BL VDcocmluZywgQ1BfRVZFTlRfV1JJVEUsIDEpOworCU9VVF9SSU5HKHJpbmcsIFBDX0NDVV9JTlZB TElEQVRFX0NPTE9SKTsKKworCS8qIFN1Ym1pdCB0aGUgY29tbWFuZHMgKi8KKwlmb3IgKGkgPSAw OyBpIDwgc3VibWl0LT5ucl9jbWRzOyBpKyspIHsKKwkJc3dpdGNoIChzdWJtaXQtPmNtZFtpXS50 eXBlKSB7CisJCWNhc2UgTVNNX1NVQk1JVF9DTURfSUJfVEFSR0VUX0JVRjoKKwkJCWJyZWFrOwor CQljYXNlIE1TTV9TVUJNSVRfQ01EX0NUWF9SRVNUT1JFX0JVRjoKKwkJCWlmIChwcml2LT5sYXN0 Y3R4ID09IGN0eCkKKwkJCQlicmVhazsKKwkJY2FzZSBNU01fU1VCTUlUX0NNRF9CVUY6CisJCQlP VVRfUEtUNyhyaW5nLCBDUF9JTkRJUkVDVF9CVUZGRVJfUEZFLCAzKTsKKwkJCU9VVF9SSU5HKHJp bmcsIGxvd2VyXzMyX2JpdHMoc3VibWl0LT5jbWRbaV0uaW92YSkpOworCQkJT1VUX1JJTkcocmlu ZywgdXBwZXJfMzJfYml0cyhzdWJtaXQtPmNtZFtpXS5pb3ZhKSk7CisJCQlPVVRfUklORyhyaW5n LCBzdWJtaXQtPmNtZFtpXS5zaXplKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyogV3JpdGUg dGhlIGZlbmNlIHRvIHRoZSBzY3JhdGNoIHJlZ2lzdGVyICovCisJT1VUX1BLVDQocmluZywgUkVH X0E2WFhfQ1BfU0NSQVRDSF9SRUcoMiksIDEpOworCU9VVF9SSU5HKHJpbmcsIHN1Ym1pdC0+c2Vx bm8pOworCisJLyoKKwkgKiBFeGVjdXRlIGEgQ0FDSEVfRkxVU0hfVFMgZXZlbnQuIFRoaXMgd2ls bCBlbnN1cmUgdGhhdCB0aGUKKwkgKiB0aW1lc3RhbXAgaXMgd3JpdHRlbiB0byB0aGUgbWVtb3J5 IGFuZCB0aGVuIHRyaWdnZXJzIHRoZSBpbnRlcnJ1cHQKKwkgKi8KKwlPVVRfUEtUNyhyaW5nLCBD UF9FVkVOVF9XUklURSwgNCk7CisJT1VUX1JJTkcocmluZywgQ0FDSEVfRkxVU0hfVFMgfCAoMSA8 PCAzMSkpOworCU9VVF9SSU5HKHJpbmcsIGxvd2VyXzMyX2JpdHMocmJtZW1wdHIocmluZywgZmVu Y2UpKSk7CisJT1VUX1JJTkcocmluZywgdXBwZXJfMzJfYml0cyhyYm1lbXB0cihyaW5nLCBmZW5j ZSkpKTsKKwlPVVRfUklORyhyaW5nLCBzdWJtaXQtPnNlcW5vKTsKKworCWE2eHhfZmx1c2goZ3B1 LCByaW5nKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB7CisJdTMyIG9mZnNldDsKKwl1MzIg dmFsdWU7Cit9IGE2eHhfaHdjZ1tdID0geworCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0NOVExfU1Aw LCAweDIyMjIyMjIyfSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9DS19DTlRMX1NQMSwgMHgyMjIyMjIy Mn0sCisJe1JFR19BNlhYX1JCQk1fQ0xPQ0tfQ05UTF9TUDIsIDB4MjIyMjIyMjJ9LAorCXtSRUdf QTZYWF9SQkJNX0NMT0NLX0NOVExfU1AzLCAweDIyMjIyMjIyfSwKKwl7UkVHX0E2WFhfUkJCTV9D TE9DS19DTlRMMl9TUDAsIDB4MDIwMjIyMjB9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0NOVEwy X1NQMSwgMHgwMjAyMjIyMH0sCisJe1JFR19BNlhYX1JCQk1fQ0xPQ0tfQ05UTDJfU1AyLCAweDAy MDIyMjIwfSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9DS19DTlRMMl9TUDMsIDB4MDIwMjIyMjB9LAor CXtSRUdfQTZYWF9SQkJNX0NMT0NLX0RFTEFZX1NQMCwgMHgwMDAwZjNjZn0sCisJe1JFR19BNlhY X1JCQk1fQ0xPQ0tfREVMQVlfU1AxLCAweDAwMDBmM2NmfSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9D S19ERUxBWV9TUDIsIDB4MDAwMGYzY2Z9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0RFTEFZX1NQ MywgMHgwMDAwZjNjZn0sCisJe1JFR19BNlhYX1JCQk1fQ0xPQ0tfSFlTVF9TUDAsIDB4MDAwMDAw ODB9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0hZU1RfU1AxLCAweDAwMDAwMDgwfSwKKwl7UkVH X0E2WFhfUkJCTV9DTE9DS19IWVNUX1NQMiwgMHgwMDAwMDA4MH0sCisJe1JFR19BNlhYX1JCQk1f Q0xPQ0tfSFlTVF9TUDMsIDB4MDAwMDAwODB9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0NOVExf VFAwLCAweDAyMjIyMjIyfSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9DS19DTlRMX1RQMSwgMHgwMjIy MjIyMn0sCisJe1JFR19BNlhYX1JCQk1fQ0xPQ0tfQ05UTF9UUDIsIDB4MDIyMjIyMjJ9LAorCXtS RUdfQTZYWF9SQkJNX0NMT0NLX0NOVExfVFAzLCAweDAyMjIyMjIyfSwKKwl7UkVHX0E2WFhfUkJC TV9DTE9DS19DTlRMMl9UUDAsIDB4MjIyMjIyMjJ9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0NO VEwyX1RQMSwgMHgyMjIyMjIyMn0sCisJe1JFR19BNlhYX1JCQk1fQ0xPQ0tfQ05UTDJfVFAyLCAw eDIyMjIyMjIyfSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9DS19DTlRMMl9UUDMsIDB4MjIyMjIyMjJ9 LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0NOVEwzX1RQMCwgMHgyMjIyMjIyMn0sCisJe1JFR19B NlhYX1JCQk1fQ0xPQ0tfQ05UTDNfVFAxLCAweDIyMjIyMjIyfSwKKwl7UkVHX0E2WFhfUkJCTV9D TE9DS19DTlRMM19UUDIsIDB4MjIyMjIyMjJ9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0NOVEwz X1RQMywgMHgyMjIyMjIyMn0sCisJe1JFR19BNlhYX1JCQk1fQ0xPQ0tfQ05UTDRfVFAwLCAweDAw MDIyMjIyfSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9DS19DTlRMNF9UUDEsIDB4MDAwMjIyMjJ9LAor CXtSRUdfQTZYWF9SQkJNX0NMT0NLX0NOVEw0X1RQMiwgMHgwMDAyMjIyMn0sCisJe1JFR19BNlhY X1JCQk1fQ0xPQ0tfQ05UTDRfVFAzLCAweDAwMDIyMjIyfSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9D S19IWVNUX1RQMCwgMHg3Nzc3Nzc3N30sCisJe1JFR19BNlhYX1JCQk1fQ0xPQ0tfSFlTVF9UUDEs IDB4Nzc3Nzc3Nzd9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0hZU1RfVFAyLCAweDc3Nzc3Nzc3 fSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9DS19IWVNUX1RQMywgMHg3Nzc3Nzc3N30sCisJe1JFR19B NlhYX1JCQk1fQ0xPQ0tfSFlTVDJfVFAwLCAweDc3Nzc3Nzc3fSwKKwl7UkVHX0E2WFhfUkJCTV9D TE9DS19IWVNUMl9UUDEsIDB4Nzc3Nzc3Nzd9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0hZU1Qy X1RQMiwgMHg3Nzc3Nzc3N30sCisJe1JFR19BNlhYX1JCQk1fQ0xPQ0tfSFlTVDJfVFAzLCAweDc3 Nzc3Nzc3fSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9DS19IWVNUM19UUDAsIDB4MDc3Nzc3Nzd9LAor CXtSRUdfQTZYWF9SQkJNX0NMT0NLX0hZU1QzX1RQMSwgMHgwNzc3Nzc3N30sCisJe1JFR19BNlhY X1JCQk1fQ0xPQ0tfSFlTVDNfVFAyLCAweDA3Nzc3Nzc3fSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9D S19IWVNUM19UUDMsIDB4MDc3Nzc3Nzd9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0hZU1Q0X1RQ MCwgMHgwMDA3Nzc3N30sCisJe1JFR19BNlhYX1JCQk1fQ0xPQ0tfSFlTVDRfVFAxLCAweDAwMDc3 Nzc3fSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9DS19IWVNUNF9UUDIsIDB4MDAwNzc3Nzd9LAorCXtS RUdfQTZYWF9SQkJNX0NMT0NLX0hZU1Q0X1RQMywgMHgwMDA3Nzc3N30sCisJe1JFR19BNlhYX1JC Qk1fQ0xPQ0tfREVMQVlfVFAwLCAweDExMTExMTExfSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9DS19E RUxBWV9UUDEsIDB4MTExMTExMTF9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0RFTEFZX1RQMiwg MHgxMTExMTExMX0sCisJe1JFR19BNlhYX1JCQk1fQ0xPQ0tfREVMQVlfVFAzLCAweDExMTExMTEx fSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9DS19ERUxBWTJfVFAwLCAweDExMTExMTExfSwKKwl7UkVH X0E2WFhfUkJCTV9DTE9DS19ERUxBWTJfVFAxLCAweDExMTExMTExfSwKKwl7UkVHX0E2WFhfUkJC TV9DTE9DS19ERUxBWTJfVFAyLCAweDExMTExMTExfSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9DS19E RUxBWTJfVFAzLCAweDExMTExMTExfSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9DS19ERUxBWTNfVFAw LCAweDExMTExMTExfSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9DS19ERUxBWTNfVFAxLCAweDExMTEx MTExfSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9DS19ERUxBWTNfVFAyLCAweDExMTExMTExfSwKKwl7 UkVHX0E2WFhfUkJCTV9DTE9DS19ERUxBWTNfVFAzLCAweDExMTExMTExfSwKKwl7UkVHX0E2WFhf UkJCTV9DTE9DS19ERUxBWTRfVFAwLCAweDAwMDExMTExfSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9D S19ERUxBWTRfVFAxLCAweDAwMDExMTExfSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9DS19ERUxBWTRf VFAyLCAweDAwMDExMTExfSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9DS19ERUxBWTRfVFAzLCAweDAw MDExMTExfSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9DS19DTlRMX1VDSEUsIDB4MjIyMjIyMjJ9LAor CXtSRUdfQTZYWF9SQkJNX0NMT0NLX0NOVEwyX1VDSEUsIDB4MjIyMjIyMjJ9LAorCXtSRUdfQTZY WF9SQkJNX0NMT0NLX0NOVEwzX1VDSEUsIDB4MjIyMjIyMjJ9LAorCXtSRUdfQTZYWF9SQkJNX0NM T0NLX0NOVEw0X1VDSEUsIDB4MDAyMjIyMjJ9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0hZU1Rf VUNIRSwgMHgwMDAwMDAwNH0sCisJe1JFR19BNlhYX1JCQk1fQ0xPQ0tfREVMQVlfVUNIRSwgMHgw MDAwMDAwMn0sCisJe1JFR19BNlhYX1JCQk1fQ0xPQ0tfQ05UTF9SQjAsIDB4MjIyMjIyMjJ9LAor CXtSRUdfQTZYWF9SQkJNX0NMT0NLX0NOVExfUkIxLCAweDIyMjIyMjIyfSwKKwl7UkVHX0E2WFhf UkJCTV9DTE9DS19DTlRMX1JCMiwgMHgyMjIyMjIyMn0sCisJe1JFR19BNlhYX1JCQk1fQ0xPQ0tf Q05UTF9SQjMsIDB4MjIyMjIyMjJ9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0NOVEwyX1JCMCwg MHgwMDAwMjIyMn0sCisJe1JFR19BNlhYX1JCQk1fQ0xPQ0tfQ05UTDJfUkIxLCAweDAwMDAyMjIy fSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9DS19DTlRMMl9SQjIsIDB4MDAwMDIyMjJ9LAorCXtSRUdf QTZYWF9SQkJNX0NMT0NLX0NOVEwyX1JCMywgMHgwMDAwMjIyMn0sCisJe1JFR19BNlhYX1JCQk1f Q0xPQ0tfQ05UTF9DQ1UwLCAweDAwMDAyMjIwfSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9DS19DTlRM X0NDVTEsIDB4MDAwMDIyMjB9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0NOVExfQ0NVMiwgMHgw MDAwMjIyMH0sCisJe1JFR19BNlhYX1JCQk1fQ0xPQ0tfQ05UTF9DQ1UzLCAweDAwMDAyMjIwfSwK Kwl7UkVHX0E2WFhfUkJCTV9DTE9DS19IWVNUX1JCX0NDVTAsIDB4MDAwNDBmMDB9LAorCXtSRUdf QTZYWF9SQkJNX0NMT0NLX0hZU1RfUkJfQ0NVMSwgMHgwMDA0MGYwMH0sCisJe1JFR19BNlhYX1JC Qk1fQ0xPQ0tfSFlTVF9SQl9DQ1UyLCAweDAwMDQwZjAwfSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9D S19IWVNUX1JCX0NDVTMsIDB4MDAwNDBmMDB9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0NOVExf UkFDLCAweDA1MDIyMDIyfSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9DS19DTlRMMl9SQUMsIDB4MDAw MDU1NTV9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0RFTEFZX1JBQywgMHgwMDAxMDAxMX0sCisJ e1JFR19BNlhYX1JCQk1fQ0xPQ0tfSFlTVF9SQUMsIDB4MDA0NDUwNDR9LAorCXtSRUdfQTZYWF9S QkJNX0NMT0NLX0NOVExfVFNFX1JBU19SQkJNLCAweDA0MjIyMjIyfSwKKwl7UkVHX0E2WFhfUkJC TV9DTE9DS19NT0RFX0dQQywgMHgwMjIyMjIyMn0sCisJe1JFR19BNlhYX1JCQk1fQ0xPQ0tfTU9E RV9WRkQsIDB4MDAwMDIyMjJ9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0hZU1RfVFNFX1JBU19S QkJNLCAweDAwMDAwMDAwfSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9DS19IWVNUX0dQQywgMHgwNDEw NDAwNH0sCisJe1JFR19BNlhYX1JCQk1fQ0xPQ0tfSFlTVF9WRkQsIDB4MDAwMDAwMDB9LAorCXtS RUdfQTZYWF9SQkJNX0NMT0NLX0RFTEFZX0hMU1EsIDB4MDAwMDAwMDB9LAorCXtSRUdfQTZYWF9S QkJNX0NMT0NLX0RFTEFZX1RTRV9SQVNfUkJCTSwgMHgwMDAwNDAwMH0sCisJe1JFR19BNlhYX1JC Qk1fQ0xPQ0tfREVMQVlfR1BDLCAweDAwMDAwMjAwfSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9DS19E RUxBWV9WRkQsIDB4MDAwMDIyMjJ9LAorCXtSRUdfQTZYWF9SQkJNX0NMT0NLX0RFTEFZX0hMU1Ff MiwgMHgwMDAwMDAwMn0sCisJe1JFR19BNlhYX1JCQk1fQ0xPQ0tfTU9ERV9ITFNRLCAweDAwMDAy MjIyfSwKKwl7UkVHX0E2WFhfUkJCTV9DTE9DS19DTlRMX0dNVV9HWCwgMHgwMDAwMDIyMn0sCisJ e1JFR19BNlhYX1JCQk1fQ0xPQ0tfREVMQVlfR01VX0dYLCAweDAwMDAwMTExfSwKKwl7UkVHX0E2 WFhfUkJCTV9DTE9DS19IWVNUX0dNVV9HWCwgMHgwMDAwMDU1NX0KK307CisKK2ludCBhNnh4X3Nl dF9od2NnKHN0cnVjdCBtc21fZ3B1ICpncHUsIGJvb2wgc3RhdGUpCit7CisJc3RydWN0IGFkcmVu b19ncHUgKmFkcmVub19ncHUgPSB0b19hZHJlbm9fZ3B1KGdwdSk7CisJc3RydWN0IGE2eHhfZ3B1 ICphNnh4X2dwdSA9IHRvX2E2eHhfZ3B1KGFkcmVub19ncHUpOworCXN0cnVjdCBhNnh4X2dtdSAq Z211ID0gJmE2eHhfZ3B1LT5nbXU7CisJdW5zaWduZWQgaW50IGk7CisJaW50IHJldDsKKwl1MzIg dmFsOworCisJdmFsID0gZ3B1X3JlYWQoZ3B1LCBSRUdfQTZYWF9SQkJNX0NMT0NLX0NOVEwpOwor CisJLyogRG9uJ3QgcmUtcHJvZ3JhbSB0aGUgcmVnaXN0ZXJzIGlmIHRoZXkgYXJlIGFscmVhZHkg Y29ycmVjdCAqLworCWlmICgoIXN0YXRlICYmICF2YWwpIHx8IChzdGF0ZSAmJiAodmFsID09IDB4 OGFhOGFhMDIpKSkKKwkJcmV0dXJuIDA7CisKKwkvKiBEaXNhYmxlIFNQIGNsb2NrIGJlZm9yZSBw cm9ncmFtbWluZyBIV0NHIHJlZ2lzdGVycyAqLworCWdtdV9ybXcoZ211LCBSRUdfQTZYWF9HUFVf R01VX0dYX1NQVFBSQUNfQ0xPQ0tfQ09OVFJPTCwgMSwgMCk7CisKKwlmb3IgKGkgPSAwOyBpIDwg QVJSQVlfU0laRShhNnh4X2h3Y2cpOyBpKyspCisJCWdwdV93cml0ZShncHUsIGE2eHhfaHdjZ1tp XS5vZmZzZXQsCisJCQlzdGF0ZSA/IGE2eHhfaHdjZ1tpXS52YWx1ZSA6IDApOworCisJLyogRW5h YmxlIFNQIGNsb2NrICovCisJZ211X3JtdyhnbXUsIFJFR19BNlhYX0dQVV9HTVVfR1hfU1BUUFJB Q19DTE9DS19DT05UUk9MLCAwLCAxKTsKKworCWdwdV93cml0ZShncHUsIFJFR19BNlhYX1JCQk1f Q0xPQ0tfQ05UTCwgc3RhdGUgPyAweDhhYThhYTAyIDogMCk7CisJcmV0dXJuIHJldDsKK30KKwor c3RhdGljIGludCBhNnh4X2NwX2luaXQoc3RydWN0IG1zbV9ncHUgKmdwdSkKK3sKKwlzdHJ1Y3Qg bXNtX3JpbmdidWZmZXIgKnJpbmcgPSBncHUtPnJiWzBdOworCisJT1VUX1BLVDcocmluZywgQ1Bf TUVfSU5JVCwgOCk7CisKKwlPVVRfUklORyhyaW5nLCAweDAwMDAwMDJmKTsKKworCS8qIEVuYWJs ZSBtdWx0aXBsZSBoYXJkd2FyZSBjb250ZXh0cyAqLworCU9VVF9SSU5HKHJpbmcsIDB4MDAwMDAw MDMpOworCisJLyogRW5hYmxlIGVycm9yIGRldGVjdGlvbiAqLworCU9VVF9SSU5HKHJpbmcsIDB4 MjAwMDAwMDApOworCisJLyogRG9uJ3QgZW5hYmxlIGhlYWRlciBkdW1wICovCisJT1VUX1JJTkco cmluZywgMHgwMDAwMDAwMCk7CisJT1VUX1JJTkcocmluZywgMHgwMDAwMDAwMCk7CisKKwkvKiBO byB3b3JrYXJvdW5kcyBlbmFibGVkICovCisJT1VUX1JJTkcocmluZywgMHgwMDAwMDAwMCk7CisK KwkvKiBQYWQgcmVzdCBvZiB0aGUgY21kcyB3aXRoIDAncyAqLworCU9VVF9SSU5HKHJpbmcsIDB4 MDAwMDAwMDApOworCU9VVF9SSU5HKHJpbmcsIDB4MDAwMDAwMDApOworCisJYTZ4eF9mbHVzaChn cHUsIHJpbmcpOworCXJldHVybiBhNnh4X2lkbGUoZ3B1LCByaW5nKSA/IDAgOiAtRUlOVkFMOwor fQorCitzdGF0aWMgaW50IGE2eHhfdWNvZGVfaW5pdChzdHJ1Y3QgbXNtX2dwdSAqZ3B1KQorewor CXN0cnVjdCBhZHJlbm9fZ3B1ICphZHJlbm9fZ3B1ID0gdG9fYWRyZW5vX2dwdShncHUpOworCXN0 cnVjdCBhNnh4X2dwdSAqYTZ4eF9ncHUgPSB0b19hNnh4X2dwdShhZHJlbm9fZ3B1KTsKKworCWlm ICghYTZ4eF9ncHUtPnNxZV9ibykgeworCQlhNnh4X2dwdS0+c3FlX2JvID0gYWRyZW5vX3JlcXVl c3RfZndfYm8oZ3B1LAorCQkJYWRyZW5vX2dwdS0+aW5mby0+cG00ZncsICZhNnh4X2dwdS0+c3Fl X2lvdmEpOworCisJCWlmIChJU19FUlIoYTZ4eF9ncHUtPnNxZV9ibykpIHsKKwkJCWludCByZXQg PSBQVFJfRVJSKGE2eHhfZ3B1LT5zcWVfYm8pOworCisJCQlhNnh4X2dwdS0+c3FlX2JvID0gTlVM TDsKKwkJCURSTV9ERVZfRVJST1IoJmdwdS0+cGRldi0+ZGV2LAorCQkJCSJDb3VsZCBub3QgYWxs b2NhdGUgU1FFIHVjb2RlOiAlZFxuIiwgcmV0KTsKKworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0K KworCWdwdV93cml0ZTY0KGdwdSwgUkVHX0E2WFhfQ1BfU1FFX0lOU1RSX0JBU0VfTE8sCisJCVJF R19BNlhYX0NQX1NRRV9JTlNUUl9CQVNFX0hJLCBhNnh4X2dwdS0+c3FlX2lvdmEpOworCisJcmV0 dXJuIDA7Cit9CisKKyNkZWZpbmUgQTZYWF9JTlRfTUFTSyAoQTZYWF9SQkJNX0lOVF8wX01BU0tf Q1BfQUhCX0VSUk9SIHwgXAorCSAgQTZYWF9SQkJNX0lOVF8wX01BU0tfUkJCTV9BVEJfQVNZTkNG SUZPX09WRVJGTE9XIHwgXAorCSAgQTZYWF9SQkJNX0lOVF8wX01BU0tfQ1BfSFdfRVJST1IgfCBc CisJICBBNlhYX1JCQk1fSU5UXzBfTUFTS19DUF9JQjIgfCBcCisJICBBNlhYX1JCQk1fSU5UXzBf TUFTS19DUF9JQjEgfCBcCisJICBBNlhYX1JCQk1fSU5UXzBfTUFTS19DUF9SQiB8IFwKKwkgIEE2 WFhfUkJCTV9JTlRfMF9NQVNLX0NQX0NBQ0hFX0ZMVVNIX1RTIHwgXAorCSAgQTZYWF9SQkJNX0lO VF8wX01BU0tfUkJCTV9BVEJfQlVTX09WRVJGTE9XIHwgXAorCSAgQTZYWF9SQkJNX0lOVF8wX01B U0tfUkJCTV9IQU5HX0RFVEVDVCB8IFwKKwkgIEE2WFhfUkJCTV9JTlRfMF9NQVNLX1VDSEVfT09C X0FDQ0VTUyB8IFwKKwkgIEE2WFhfUkJCTV9JTlRfMF9NQVNLX1VDSEVfVFJBUF9JTlRSKQorCitz dGF0aWMgaW50IGE2eHhfaHdfaW5pdChzdHJ1Y3QgbXNtX2dwdSAqZ3B1KQoreworCXN0cnVjdCBh ZHJlbm9fZ3B1ICphZHJlbm9fZ3B1ID0gdG9fYWRyZW5vX2dwdShncHUpOworCXN0cnVjdCBhNnh4 X2dwdSAqYTZ4eF9ncHUgPSB0b19hNnh4X2dwdShhZHJlbm9fZ3B1KTsKKwlpbnQgcmV0OworCisJ LyogTWFrZSBzdXJlIHRoZSBHTVUga2VlcHMgdGhlIEdQVSBvbiB3aGlsZSB3ZSBzZXQgaXQgdXAg Ki8KKwlhNnh4X2dtdV9zZXRfb29iKCZhNnh4X2dwdS0+Z211LCBHTVVfT09CX0dQVV9TRVQpOwor CisJZ3B1X3dyaXRlKGdwdSwgUkVHX0E2WFhfUkJCTV9TRUNWSURfVFNCX0NOVEwsIDApOworCisJ LyoKKwkgKiBEaXNhYmxlIHRoZSB0cnVzdGVkIG1lbW9yeSByYW5nZSAtIHdlIGRvbid0IGFjdHVh bGx5IHN1cHBvcnRlZCBzZWN1cmUKKwkgKiBtZW1vcnkgcmVuZGVyaW5nIGF0IHRoaXMgcG9pbnQg aW4gdGltZSBhbmQgd2UgZG9uJ3Qgd2FudCB0byBibG9jayBvZmYKKwkgKiBwYXJ0IG9mIHRoZSB2 aXJ0dWFsIG1lbW9yeSBzcGFjZS4KKwkgKi8KKwlncHVfd3JpdGU2NChncHUsIFJFR19BNlhYX1JC Qk1fU0VDVklEX1RTQl9UUlVTVEVEX0JBU0VfTE8sCisJCVJFR19BNlhYX1JCQk1fU0VDVklEX1RT Ql9UUlVTVEVEX0JBU0VfSEksIDB4MDAwMDAwMDApOworCWdwdV93cml0ZShncHUsIFJFR19BNlhY X1JCQk1fU0VDVklEX1RTQl9UUlVTVEVEX1NJWkUsIDB4MDAwMDAwMDApOworCisJLyogZW5hYmxl IGhhcmR3YXJlIGNsb2NrZ2F0aW5nICovCisJYTZ4eF9zZXRfaHdjZyhncHUsIHRydWUpOworCisJ LyogVkJJRiBzdGFydCAqLworCWdwdV93cml0ZShncHUsIFJFR19BNlhYX1ZCSUZfR0FURV9PRkZf V1JSRVFfRU4sIDB4MDAwMDAwMDkpOworCWdwdV93cml0ZShncHUsIFJFR19BNlhYX1JCQk1fVkJJ Rl9DTElFTlRfUU9TX0NOVEwsIDB4Myk7CisKKwkvKiBNYWtlIGFsbCBibG9ja3MgY29udHJpYnV0 ZSB0byB0aGUgR1BVIEJVU1kgcGVyZiBjb3VudGVyICovCisJZ3B1X3dyaXRlKGdwdSwgUkVHX0E2 WFhfUkJCTV9QRVJGQ1RSX0dQVV9CVVNZX01BU0tFRCwgMHhmZmZmZmZmZik7CisKKwkvKiBEaXNh YmxlIEwyIGJ5cGFzcyBpbiB0aGUgVUNIRSAqLworCWdwdV93cml0ZShncHUsIFJFR19BNlhYX1VD SEVfV1JJVEVfUkFOR0VfTUFYX0xPLCAweGZmZmZmZmMwKTsKKwlncHVfd3JpdGUoZ3B1LCBSRUdf QTZYWF9VQ0hFX1dSSVRFX1JBTkdFX01BWF9ISSwgMHgwMDAxZmZmZik7CisJZ3B1X3dyaXRlKGdw dSwgUkVHX0E2WFhfVUNIRV9UUkFQX0JBU0VfTE8sIDB4ZmZmZmYwMDApOworCWdwdV93cml0ZShn cHUsIFJFR19BNlhYX1VDSEVfVFJBUF9CQVNFX0hJLCAweDAwMDFmZmZmKTsKKwlncHVfd3JpdGUo Z3B1LCBSRUdfQTZYWF9VQ0hFX1dSSVRFX1RIUlVfQkFTRV9MTywgMHhmZmZmZjAwMCk7CisJZ3B1 X3dyaXRlKGdwdSwgUkVHX0E2WFhfVUNIRV9XUklURV9USFJVX0JBU0VfSEksIDB4MDAwMWZmZmYp OworCisJLyogU2V0IHRoZSBHTUVNIFZBIHJhbmdlIFsweDEwMDAwMDoweDEwMDAwMCArIGdwdS0+ Z21lbSAtIDFdICovCisJZ3B1X3dyaXRlNjQoZ3B1LCBSRUdfQTZYWF9VQ0hFX0dNRU1fUkFOR0Vf TUlOX0xPLAorCQlSRUdfQTZYWF9VQ0hFX0dNRU1fUkFOR0VfTUlOX0hJLCAweDAwMTAwMDAwKTsK KworCWdwdV93cml0ZTY0KGdwdSwgUkVHX0E2WFhfVUNIRV9HTUVNX1JBTkdFX01BWF9MTywKKwkJ UkVHX0E2WFhfVUNIRV9HTUVNX1JBTkdFX01BWF9ISSwKKwkJMHgwMDEwMDAwMCArIGFkcmVub19n cHUtPmdtZW0gLSAxKTsKKworCWdwdV93cml0ZShncHUsIFJFR19BNlhYX1VDSEVfRklMVEVSX0NO VEwsIDB4ODA0KTsKKwlncHVfd3JpdGUoZ3B1LCBSRUdfQTZYWF9VQ0hFX0NBQ0hFX1dBWVMsIDB4 NCk7CisKKwlncHVfd3JpdGUoZ3B1LCBSRUdfQTZYWF9DUF9ST1FfVEhSRVNIT0xEU18yLCAweDAx MDAwMGMwKTsKKwlncHVfd3JpdGUoZ3B1LCBSRUdfQTZYWF9DUF9ST1FfVEhSRVNIT0xEU18xLCAw eDgwNDAzNjJjKTsKKworCS8qIFNldHRpbmcgdGhlIG1lbSBwb29sIHNpemUgKi8KKwlncHVfd3Jp dGUoZ3B1LCBSRUdfQTZYWF9DUF9NRU1fUE9PTF9TSVpFLCAxMjgpOworCisJLyogU2V0dGluZyB0 aGUgcHJpbUZpZm8gdGhyZXNob2xkcyBkZWZhdWx0IHZhbHVlcyAqLworCWdwdV93cml0ZShncHUs IFJFR19BNlhYX1BDX0RCR19FQ09fQ05UTCwgKDB4MzAwIDw8IDExKSk7CisKKwkvKiBTZXQgdGhl IEFIQiBkZWZhdWx0IHNsYXZlIHJlc3BvbnNlIHRvICJFUlJPUiIgKi8KKwlncHVfd3JpdGUoZ3B1 LCBSRUdfQTZYWF9DUF9BSEJfQ05UTCwgMHgxKTsKKworCS8qIFR1cm4gb24gcGVyZm9ybWFuY2Ug Y291bnRlcnMgKi8KKwlncHVfd3JpdGUoZ3B1LCBSRUdfQTZYWF9SQkJNX1BFUkZDVFJfQ05UTCwg MHgxKTsKKworCS8qIFNlbGVjdCBDUDAgdG8gYWx3YXlzIGNvdW50IGN5Y2xlcyAqLworCWdwdV93 cml0ZShncHUsIFJFR19BNlhYX0NQX1BFUkZDVFJfQ1BfU0VMXzAsIFBFUkZfQ1BfQUxXQVlTX0NP VU5UKTsKKworCS8qIEZJWE1FOiBub3Qgc3VyZSBpZiB0aGlzIHNob3VsZCBsaXZlIGhlcmUgb3Ig aW4gYTZ4eF9nbXUuYyAqLworCWdtdV93cml0ZSgmYTZ4eF9ncHUtPmdtdSwgIFJFR19BNlhYX0dQ VV9HTVVfQU9fR1BVX0NYX0JVU1lfTUFTSywKKwkJMHhmZjAwMDAwMCk7CisJZ211X3JtdygmYTZ4 eF9ncHUtPmdtdSwgUkVHX0E2WFhfR01VX0NYX0dNVV9QT1dFUl9DT1VOVEVSX1NFTEVDVF8wLAor CQkweGZmLCAweDIwKTsKKwlnbXVfd3JpdGUoJmE2eHhfZ3B1LT5nbXUsIFJFR19BNlhYX0dNVV9D WF9HTVVfUE9XRVJfQ09VTlRFUl9FTkFCTEUsCisJCTB4MDEpOworCisJZ3B1X3dyaXRlKGdwdSwg UkVHX0E2WFhfUkJfTkNfTU9ERV9DTlRMLCAyIDw8IDEpOworCWdwdV93cml0ZShncHUsIFJFR19B NlhYX1RQTDFfTkNfTU9ERV9DTlRMLCAyIDw8IDEpOworCWdwdV93cml0ZShncHUsIFJFR19BNlhY X1NQX05DX01PREVfQ05UTCwgMiA8PCAxKTsKKwlncHVfd3JpdGUoZ3B1LCBSRUdfQTZYWF9VQ0hF X01PREVfQ05UTCwgMiA8PCAyMSk7CisKKwkvKiBFbmFibGUgZmF1bHQgZGV0ZWN0aW9uICovCisJ Z3B1X3dyaXRlKGdwdSwgUkVHX0E2WFhfUkJCTV9JTlRFUkZBQ0VfSEFOR19JTlRfQ05UTCwKKwkJ KDEgPDwgMzApIHwgMHgxZmZmZmYpOworCisJZ3B1X3dyaXRlKGdwdSwgUkVHX0E2WFhfVUNIRV9D TElFTlRfUEYsIDEpOworCisJLyogUHJvdGVjdCByZWdpc3RlcnMgZnJvbSB0aGUgQ1AgKi8KKwln cHVfd3JpdGUoZ3B1LCBSRUdfQTZYWF9DUF9QUk9URUNUX0NOVEwsIDB4MDAwMDAwMDMpOworCisJ Z3B1X3dyaXRlKGdwdSwgUkVHX0E2WFhfQ1BfUFJPVEVDVCgwKSwKKwkJQTZYWF9QUk9URUNUX1JE T05MWSgweDYwMCwgMHg1MSkpOworCWdwdV93cml0ZShncHUsIFJFR19BNlhYX0NQX1BST1RFQ1Qo MSksIEE2WFhfUFJPVEVDVF9SVygweGFlNTAsIDB4MikpOworCWdwdV93cml0ZShncHUsIFJFR19B NlhYX0NQX1BST1RFQ1QoMiksIEE2WFhfUFJPVEVDVF9SVygweDk2MjQsIDB4MTMpKTsKKwlncHVf d3JpdGUoZ3B1LCBSRUdfQTZYWF9DUF9QUk9URUNUKDMpLCBBNlhYX1BST1RFQ1RfUlcoMHg4NjMw LCAweDgpKTsKKwlncHVfd3JpdGUoZ3B1LCBSRUdfQTZYWF9DUF9QUk9URUNUKDQpLCBBNlhYX1BS T1RFQ1RfUlcoMHg5ZTcwLCAweDEpKTsKKwlncHVfd3JpdGUoZ3B1LCBSRUdfQTZYWF9DUF9QUk9U RUNUKDUpLCBBNlhYX1BST1RFQ1RfUlcoMHg5ZTc4LCAweDE4NykpOworCWdwdV93cml0ZShncHUs IFJFR19BNlhYX0NQX1BST1RFQ1QoNiksIEE2WFhfUFJPVEVDVF9SVygweGYwMDAsIDB4ODEwKSk7 CisJZ3B1X3dyaXRlKGdwdSwgUkVHX0E2WFhfQ1BfUFJPVEVDVCg3KSwKKwkJQTZYWF9QUk9URUNU X1JET05MWSgweGZjMDAsIDB4MykpOworCWdwdV93cml0ZShncHUsIFJFR19BNlhYX0NQX1BST1RF Q1QoOCksIEE2WFhfUFJPVEVDVF9SVygweDUwZSwgMHgwKSk7CisJZ3B1X3dyaXRlKGdwdSwgUkVH X0E2WFhfQ1BfUFJPVEVDVCg5KSwgQTZYWF9QUk9URUNUX1JET05MWSgweDUwZiwgMHgwKSk7CisJ Z3B1X3dyaXRlKGdwdSwgUkVHX0E2WFhfQ1BfUFJPVEVDVCgxMCksIEE2WFhfUFJPVEVDVF9SVygw eDUxMCwgMHgwKSk7CisJZ3B1X3dyaXRlKGdwdSwgUkVHX0E2WFhfQ1BfUFJPVEVDVCgxMSksCisJ CUE2WFhfUFJPVEVDVF9SRE9OTFkoMHgwLCAweDRmOSkpOworCWdwdV93cml0ZShncHUsIFJFR19B NlhYX0NQX1BST1RFQ1QoMTIpLAorCQlBNlhYX1BST1RFQ1RfUkRPTkxZKDB4NTAxLCAweGEpKTsK KwlncHVfd3JpdGUoZ3B1LCBSRUdfQTZYWF9DUF9QUk9URUNUKDEzKSwKKwkJQTZYWF9QUk9URUNU X1JET05MWSgweDUxMSwgMHg0NCkpOworCWdwdV93cml0ZShncHUsIFJFR19BNlhYX0NQX1BST1RF Q1QoMTQpLCBBNlhYX1BST1RFQ1RfUlcoMHhlMDAsIDB4ZSkpOworCWdwdV93cml0ZShncHUsIFJF R19BNlhYX0NQX1BST1RFQ1QoMTUpLCBBNlhYX1BST1RFQ1RfUlcoMHg4ZTAwLCAweDApKTsKKwln cHVfd3JpdGUoZ3B1LCBSRUdfQTZYWF9DUF9QUk9URUNUKDE2KSwgQTZYWF9QUk9URUNUX1JXKDB4 OGU1MCwgMHhmKSk7CisJZ3B1X3dyaXRlKGdwdSwgUkVHX0E2WFhfQ1BfUFJPVEVDVCgxNyksIEE2 WFhfUFJPVEVDVF9SVygweGJlMDIsIDB4MCkpOworCWdwdV93cml0ZShncHUsIFJFR19BNlhYX0NQ X1BST1RFQ1QoMTgpLAorCQlBNlhYX1BST1RFQ1RfUlcoMHhiZTIwLCAweDExZjMpKTsKKwlncHVf d3JpdGUoZ3B1LCBSRUdfQTZYWF9DUF9QUk9URUNUKDE5KSwgQTZYWF9QUk9URUNUX1JXKDB4ODAw LCAweDgyKSk7CisJZ3B1X3dyaXRlKGdwdSwgUkVHX0E2WFhfQ1BfUFJPVEVDVCgyMCksIEE2WFhf UFJPVEVDVF9SVygweDhhMCwgMHg4KSk7CisJZ3B1X3dyaXRlKGdwdSwgUkVHX0E2WFhfQ1BfUFJP VEVDVCgyMSksIEE2WFhfUFJPVEVDVF9SVygweDhhYiwgMHgxOSkpOworCWdwdV93cml0ZShncHUs IFJFR19BNlhYX0NQX1BST1RFQ1QoMjIpLCBBNlhYX1BST1RFQ1RfUlcoMHg5MDAsIDB4NGQpKTsK KwlncHVfd3JpdGUoZ3B1LCBSRUdfQTZYWF9DUF9QUk9URUNUKDIzKSwgQTZYWF9QUk9URUNUX1JX KDB4OThkLCAweDc2KSk7CisJZ3B1X3dyaXRlKGdwdSwgUkVHX0E2WFhfQ1BfUFJPVEVDVCgyNCks CisJCQlBNlhYX1BST1RFQ1RfUkRPTkxZKDB4OGQwLCAweDIzKSk7CisJZ3B1X3dyaXRlKGdwdSwg UkVHX0E2WFhfQ1BfUFJPVEVDVCgyNSksCisJCQlBNlhYX1BST1RFQ1RfUkRPTkxZKDB4OTgwLCAw eDQpKTsKKwlncHVfd3JpdGUoZ3B1LCBSRUdfQTZYWF9DUF9QUk9URUNUKDI2KSwgQTZYWF9QUk9U RUNUX1JXKDB4YTYzMCwgMHgwKSk7CisKKwkvKiBFbmFibGUgaW50ZXJydXB0cyAqLworCWdwdV93 cml0ZShncHUsIFJFR19BNlhYX1JCQk1fSU5UXzBfTUFTSywgQTZYWF9JTlRfTUFTSyk7CisKKwly ZXQgPSBhZHJlbm9faHdfaW5pdChncHUpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJcmV0 ID0gYTZ4eF91Y29kZV9pbml0KGdwdSk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwkvKiBB bHdheXMgY29tZSB1cCBvbiByYiAwICovCisJYTZ4eF9ncHUtPmN1cl9yaW5nID0gZ3B1LT5yYlsw XTsKKworCS8qIEVuYWJsZSB0aGUgU1FFX3RvIHN0YXJ0IHRoZSBDUCBlbmdpbmUgKi8KKwlncHVf d3JpdGUoZ3B1LCBSRUdfQTZYWF9DUF9TUUVfQ05UTCwgMSk7CisKKwlyZXQgPSBhNnh4X2NwX2lu aXQoZ3B1KTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCWdwdV93cml0ZShncHUsIFJFR19B NlhYX1JCQk1fU0VDVklEX1RSVVNUX0NOVEwsIDB4MCk7CisKK291dDoKKwkvKgorCSAqIFRlbGwg dGhlIEdNVSB0aGF0IHdlIGFyZSBkb25lIHRvdWNoaW5nIHRoZSBHUFUgYW5kIGl0IGNhbiBzdGFy dCBwb3dlcgorCSAqIG1hbmFnZW1lbnQKKwkgKi8KKwlhNnh4X2dtdV9jbGVhcl9vb2IoJmE2eHhf Z3B1LT5nbXUsIEdNVV9PT0JfR1BVX1NFVCk7CisKKwkvKiBUYWtlIHRoZSBHTVUgb3V0IG9mIGl0 cyBzcGVjaWFsIGJvb3QgbW9kZSAqLworCWE2eHhfZ211X2NsZWFyX29vYigmYTZ4eF9ncHUtPmdt dSwgR01VX09PQl9CT09UX1NMVU1CRVIpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZv aWQgYTZ4eF9kdW1wKHN0cnVjdCBtc21fZ3B1ICpncHUpCit7CisJZGV2X2luZm8oJmdwdS0+cGRl di0+ZGV2LCAic3RhdHVzOiAgICUwOHhcbiIsCisJCQlncHVfcmVhZChncHUsIFJFR19BNlhYX1JC Qk1fU1RBVFVTKSk7CisJYWRyZW5vX2R1bXAoZ3B1KTsKK30KKworI2RlZmluZSBWQklGX1JFU0VU X0FDS19USU1FT1VUCTEwMAorI2RlZmluZSBWQklGX1JFU0VUX0FDS19NQVNLCTB4MDBmMAorCitz dGF0aWMgdm9pZCBhNnh4X3JlY292ZXIoc3RydWN0IG1zbV9ncHUgKmdwdSkKK3sKKwlpbnQgaTsK KworCWFkcmVub19kdW1wX2luZm8oZ3B1KTsKKworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJ CWRldl9pbmZvKCZncHUtPnBkZXYtPmRldiwgIkNQX1NDUkFUQ0hfUkVHJWQ6ICV1XG4iLCBpLAor CQkJZ3B1X3JlYWQoZ3B1LCBSRUdfQTZYWF9DUF9TQ1JBVENIX1JFRyhpKSkpOworCisJaWYgKGhh bmdfZGVidWcpCisJCWE2eHhfZHVtcChncHUpOworCisJZ3B1LT5mdW5jcy0+cG1fc3VzcGVuZChn cHUpOworCWdwdS0+ZnVuY3MtPnBtX3Jlc3VtZShncHUpOworCisJbXNtX2dwdV9od19pbml0KGdw dSk7Cit9CisKK3N0YXRpYyBpbnQgYTZ4eF9mYXVsdF9oYW5kbGVyKHZvaWQgKmFyZywgdW5zaWdu ZWQgbG9uZyBpb3ZhLCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IG1zbV9ncHUgKmdwdSA9IGFyZzsK KworCXByX3dhcm5fcmF0ZWxpbWl0ZWQoIioqKiBncHUgZmF1bHQ6IGlvdmE9JTA4bHgsIGZsYWdz PSVkICgldSwldSwldSwldSlcbiIsCisJCQlpb3ZhLCBmbGFncywKKwkJCWdwdV9yZWFkKGdwdSwg UkVHX0E2WFhfQ1BfU0NSQVRDSF9SRUcoNCkpLAorCQkJZ3B1X3JlYWQoZ3B1LCBSRUdfQTZYWF9D UF9TQ1JBVENIX1JFRyg1KSksCisJCQlncHVfcmVhZChncHUsIFJFR19BNlhYX0NQX1NDUkFUQ0hf UkVHKDYpKSwKKwkJCWdwdV9yZWFkKGdwdSwgUkVHX0E2WFhfQ1BfU0NSQVRDSF9SRUcoNykpKTsK KworCXJldHVybiAtRUZBVUxUOworfQorCitzdGF0aWMgdm9pZCBhNnh4X2NwX2h3X2Vycl9pcnEo c3RydWN0IG1zbV9ncHUgKmdwdSkKK3sKKwl1MzIgc3RhdHVzID0gZ3B1X3JlYWQoZ3B1LCBSRUdf QTZYWF9DUF9JTlRFUlJVUFRfU1RBVFVTKTsKKworCWlmIChzdGF0dXMgJiBBNlhYX0NQX0lOVF9D UF9PUENPREVfRVJST1IpIHsKKwkJdTMyIHZhbDsKKworCQlncHVfd3JpdGUoZ3B1LCBSRUdfQTZY WF9DUF9TUUVfU1RBVF9BRERSLCAxKTsKKwkJdmFsID0gZ3B1X3JlYWQoZ3B1LCBSRUdfQTZYWF9D UF9TUUVfU1RBVF9EQVRBKTsKKwkJZGV2X2Vycl9yYXRlbGltaXRlZCgmZ3B1LT5wZGV2LT5kZXYs CisJCQkiQ1AgfCBvcGNvZGUgZXJyb3IgfCBwb3NzaWJsZSBvcGNvZGU9MHglOC44WFxuIiwKKwkJ CXZhbCk7CisJfQorCisJaWYgKHN0YXR1cyAmIEE2WFhfQ1BfSU5UX0NQX1VDT0RFX0VSUk9SKQor CQlkZXZfZXJyX3JhdGVsaW1pdGVkKCZncHUtPnBkZXYtPmRldiwKKwkJCSJDUCB1Y29kZSBlcnJv ciBpbnRlcnJ1cHRcbiIpOworCisJaWYgKHN0YXR1cyAmIEE2WFhfQ1BfSU5UX0NQX0hXX0ZBVUxU X0VSUk9SKQorCQlkZXZfZXJyX3JhdGVsaW1pdGVkKCZncHUtPnBkZXYtPmRldiwgIkNQIHwgSFcg ZmF1bHQgfCBzdGF0dXM9MHglOC44WFxuIiwKKwkJCWdwdV9yZWFkKGdwdSwgUkVHX0E2WFhfQ1Bf SFdfRkFVTFQpKTsKKworCWlmIChzdGF0dXMgJiBBNlhYX0NQX0lOVF9DUF9SRUdJU1RFUl9QUk9U RUNUSU9OX0VSUk9SKSB7CisJCXUzMiB2YWwgPSBncHVfcmVhZChncHUsIFJFR19BNlhYX0NQX1BS T1RFQ1RfU1RBVFVTKTsKKworCQlkZXZfZXJyX3JhdGVsaW1pdGVkKCZncHUtPnBkZXYtPmRldiwK KwkJCSJDUCB8IHByb3RlY3RlZCBtb2RlIGVycm9yIHwgJXMgfCBhZGRyPTB4JTguOFggfCBzdGF0 dXM9MHglOC44WFxuIiwKKwkJCXZhbCAmICgxIDw8IDIwKSA/ICJSRUFEIiA6ICJXUklURSIsCisJ CQkodmFsICYgMHgzZmZmZiksIHZhbCk7CisJfQorCisJaWYgKHN0YXR1cyAmIEE2WFhfQ1BfSU5U X0NQX0FIQl9FUlJPUikKKwkJZGV2X2Vycl9yYXRlbGltaXRlZCgmZ3B1LT5wZGV2LT5kZXYsICJD UCBBSEIgZXJyb3IgaW50ZXJydXB0XG4iKTsKKworCWlmIChzdGF0dXMgJiBBNlhYX0NQX0lOVF9D UF9WU0RfUEFSSVRZX0VSUk9SKQorCQlkZXZfZXJyX3JhdGVsaW1pdGVkKCZncHUtPnBkZXYtPmRl diwgIkNQIFZTRCBkZWNvZGVyIHBhcml0eSBlcnJvclxuIik7CisKKwlpZiAoc3RhdHVzICYgQTZY WF9DUF9JTlRfQ1BfSUxMRUdBTF9JTlNUUl9FUlJPUikKKwkJZGV2X2Vycl9yYXRlbGltaXRlZCgm Z3B1LT5wZGV2LT5kZXYsICJDUCBpbGxlZ2FsIGluc3RydWN0aW9uIGVycm9yXG4iKTsKKworfQor CitzdGF0aWMgdm9pZCBhNnh4X2ZhdWx0X2RldGVjdF9pcnEoc3RydWN0IG1zbV9ncHUgKmdwdSkK K3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZ3B1LT5kZXY7CisJc3RydWN0IG1zbV9kcm1f cHJpdmF0ZSAqcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG1zbV9yaW5nYnVmZmVy ICpyaW5nID0gZ3B1LT5mdW5jcy0+YWN0aXZlX3JpbmcoZ3B1KTsKKworCURSTV9ERVZfRVJST1Io JmdwdS0+cGRldi0+ZGV2LAorCQkiZ3B1IGZhdWx0IHJpbmcgJWQgZmVuY2UgJXggc3RhdHVzICU4 LjhYIHJiICU0LjR4LyU0LjR4IGliMSAlMTYuMTZsbFgvJTQuNHggaWIyICUxNi4xNmxsWC8lNC40 eFxuIiwKKwkJcmluZyA/IHJpbmctPmlkIDogLTEsIHJpbmcgPyByaW5nLT5zZXFubyA6IDAsCisJ CWdwdV9yZWFkKGdwdSwgUkVHX0E2WFhfUkJCTV9TVEFUVVMpLAorCQlncHVfcmVhZChncHUsIFJF R19BNlhYX0NQX1JCX1JQVFIpLAorCQlncHVfcmVhZChncHUsIFJFR19BNlhYX0NQX1JCX1dQVFIp LAorCQlncHVfcmVhZDY0KGdwdSwgUkVHX0E2WFhfQ1BfSUIxX0JBU0UsIFJFR19BNlhYX0NQX0lC MV9CQVNFX0hJKSwKKwkJZ3B1X3JlYWQoZ3B1LCBSRUdfQTZYWF9DUF9JQjFfUkVNX1NJWkUpLAor CQlncHVfcmVhZDY0KGdwdSwgUkVHX0E2WFhfQ1BfSUIyX0JBU0UsIFJFR19BNlhYX0NQX0lCMl9C QVNFX0hJKSwKKwkJZ3B1X3JlYWQoZ3B1LCBSRUdfQTZYWF9DUF9JQjJfUkVNX1NJWkUpKTsKKwor CS8qIFR1cm4gb2ZmIHRoZSBoYW5nY2hlY2sgdGltZXIgdG8ga2VlcCBpdCBmcm9tIGJvdGhlcmlu ZyB1cyAqLworCWRlbF90aW1lcigmZ3B1LT5oYW5nY2hlY2tfdGltZXIpOworCisJcXVldWVfd29y ayhwcml2LT53cSwgJmdwdS0+cmVjb3Zlcl93b3JrKTsKK30KKworc3RhdGljIGlycXJldHVybl90 IGE2eHhfaXJxKHN0cnVjdCBtc21fZ3B1ICpncHUpCit7CisJdTMyIHN0YXR1cyA9IGdwdV9yZWFk KGdwdSwgUkVHX0E2WFhfUkJCTV9JTlRfMF9TVEFUVVMpOworCisJZ3B1X3dyaXRlKGdwdSwgUkVH X0E2WFhfUkJCTV9JTlRfQ0xFQVJfQ01ELCBzdGF0dXMpOworCisJaWYgKHN0YXR1cyAmIEE2WFhf UkJCTV9JTlRfMF9NQVNLX1JCQk1fSEFOR19ERVRFQ1QpCisJCWE2eHhfZmF1bHRfZGV0ZWN0X2ly cShncHUpOworCisJaWYgKHN0YXR1cyAmIEE2WFhfUkJCTV9JTlRfMF9NQVNLX0NQX0FIQl9FUlJP UikKKwkJZGV2X2Vycl9yYXRlbGltaXRlZCgmZ3B1LT5wZGV2LT5kZXYsICJDUCB8IEFIQiBidXMg ZXJyb3JcbiIpOworCisJaWYgKHN0YXR1cyAmIEE2WFhfUkJCTV9JTlRfMF9NQVNLX0NQX0hXX0VS Uk9SKQorCQlhNnh4X2NwX2h3X2Vycl9pcnEoZ3B1KTsKKworCWlmIChzdGF0dXMgJiBBNlhYX1JC Qk1fSU5UXzBfTUFTS19SQkJNX0FUQl9BU1lOQ0ZJRk9fT1ZFUkZMT1cpCisJCWRldl9lcnJfcmF0 ZWxpbWl0ZWQoJmdwdS0+cGRldi0+ZGV2LCAiUkJCTSB8IEFUQiBBU1lOQyBvdmVyZmxvd1xuIik7 CisKKwlpZiAoc3RhdHVzICYgQTZYWF9SQkJNX0lOVF8wX01BU0tfUkJCTV9BVEJfQlVTX09WRVJG TE9XKQorCQlkZXZfZXJyX3JhdGVsaW1pdGVkKCZncHUtPnBkZXYtPmRldiwgIlJCQk0gfCBBVEIg YnVzIG92ZXJmbG93XG4iKTsKKworCWlmIChzdGF0dXMgJiBBNlhYX1JCQk1fSU5UXzBfTUFTS19V Q0hFX09PQl9BQ0NFU1MpCisJCWRldl9lcnJfcmF0ZWxpbWl0ZWQoJmdwdS0+cGRldi0+ZGV2LCAi VUNIRSB8IE91dCBvZiBib3VuZHMgYWNjZXNzXG4iKTsKKworCWlmIChzdGF0dXMgJiBBNlhYX1JC Qk1fSU5UXzBfTUFTS19DUF9DQUNIRV9GTFVTSF9UUykKKwkJbXNtX2dwdV9yZXRpcmUoZ3B1KTsK KworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGNvbnN0IHUzMiBhNnh4X3JlZ2lz dGVyX29mZnNldHNbUkVHX0FEUkVOT19SRUdJU1RFUl9NQVhdID0geworCVJFR19BRFJFTk9fREVG SU5FKFJFR19BRFJFTk9fQ1BfUkJfQkFTRSwgUkVHX0E2WFhfQ1BfUkJfQkFTRSksCisJUkVHX0FE UkVOT19ERUZJTkUoUkVHX0FEUkVOT19DUF9SQl9CQVNFX0hJLCBSRUdfQTZYWF9DUF9SQl9CQVNF X0hJKSwKKwlSRUdfQURSRU5PX0RFRklORShSRUdfQURSRU5PX0NQX1JCX1JQVFJfQUREUiwKKwkJ UkVHX0E2WFhfQ1BfUkJfUlBUUl9BRERSX0xPKSwKKwlSRUdfQURSRU5PX0RFRklORShSRUdfQURS RU5PX0NQX1JCX1JQVFJfQUREUl9ISSwKKwkJUkVHX0E2WFhfQ1BfUkJfUlBUUl9BRERSX0hJKSwK KwlSRUdfQURSRU5PX0RFRklORShSRUdfQURSRU5PX0NQX1JCX1JQVFIsIFJFR19BNlhYX0NQX1JC X1JQVFIpLAorCVJFR19BRFJFTk9fREVGSU5FKFJFR19BRFJFTk9fQ1BfUkJfV1BUUiwgUkVHX0E2 WFhfQ1BfUkJfV1BUUiksCisJUkVHX0FEUkVOT19ERUZJTkUoUkVHX0FEUkVOT19DUF9SQl9DTlRM LCBSRUdfQTZYWF9DUF9SQl9DTlRMKSwKK307CisKK3N0YXRpYyBjb25zdCB1MzIgYTZ4eF9yZWdp c3RlcnNbXSA9IHsKKwkweDAwMDAsIDB4MDAwMiwgMHgwMDEwLCAweDAwMTAsIDB4MDAxMiwgMHgw MDEyLCAweDAwMTgsIDB4MDAxYiwKKwkweDAwMWUsIDB4MDAzMiwgMHgwMDM4LCAweDAwM2MsIDB4 MDA0MiwgMHgwMDQyLCAweDAwNDQsIDB4MDA0NCwKKwkweDAwNDcsIDB4MDA0NywgMHgwMDU2LCAw eDAwNTYsIDB4MDBhZCwgMHgwMGFlLCAweDAwYjAsIDB4MDBmYiwKKwkweDAxMDAsIDB4MDExZCwg MHgwMjAwLCAweDAyMGQsIDB4MDIxMCwgMHgwMjEzLCAweDAyMTgsIDB4MDIzZCwKKwkweDA0MDAs IDB4MDRmOSwgMHgwNTAwLCAweDA1MDAsIDB4MDUwNSwgMHgwNTBiLCAweDA1MGUsIDB4MDUxMSwK KwkweDA1MzMsIDB4MDUzMywgMHgwNTQwLCAweDA1NTUsIDB4MDgwMCwgMHgwODA4LCAweDA4MTAs IDB4MDgxMywKKwkweDA4MjAsIDB4MDgyMSwgMHgwODIzLCAweDA4MjcsIDB4MDgzMCwgMHgwODMz LCAweDA4NDAsIDB4MDg0MywKKwkweDA4NGYsIDB4MDg2ZiwgMHgwODgwLCAweDA4OGEsIDB4MDhh MCwgMHgwOGFiLCAweDA4YzAsIDB4MDhjNCwKKwkweDA4ZDAsIDB4MDhkZCwgMHgwOGYwLCAweDA4 ZjMsIDB4MDkwMCwgMHgwOTAzLCAweDA5MDgsIDB4MDkxMSwKKwkweDA5MjgsIDB4MDkzZSwgMHgw OTQyLCAweDA5NGQsIDB4MDk4MCwgMHgwOTg0LCAweDA5OGQsIDB4MDk5NiwKKwkweDA5OTgsIDB4 MDk5ZSwgMHgwOWEwLCAweDA5YTYsIDB4MDlhOCwgMHgwOWFlLCAweDA5YjAsIDB4MDliMSwKKwkw eDA5YzIsIDB4MDljOCwgMHgwYTAwLCAweDBhMDMsIDB4MGMwMCwgMHgwYzA0LCAweDBjMDYsIDB4 MGMwNiwKKwkweDBjMTAsIDB4MGNkOSwgMHgwZTAwLCAweDBlMGUsIDB4MGUxMCwgMHgwZTEzLCAw eDBlMTcsIDB4MGUxOSwKKwkweDBlMWMsIDB4MGUyYiwgMHgwZTMwLCAweDBlMzIsIDB4MGUzOCwg MHgwZTM5LCAweDg2MDAsIDB4ODYwMSwKKwkweDg2MTAsIDB4ODYxYiwgMHg4NjIwLCAweDg2MjAs IDB4ODYyOCwgMHg4NjJiLCAweDg2MzAsIDB4ODYzNywKKwkweDhlMDEsIDB4OGUwMSwgMHg4ZTA0 LCAweDhlMDUsIDB4OGUwNywgMHg4ZTA4LCAweDhlMGMsIDB4OGUwYywKKwkweDhlMTAsIDB4OGUx YywgMHg4ZTIwLCAweDhlMjUsIDB4OGUyOCwgMHg4ZTI4LCAweDhlMmMsIDB4OGUyZiwKKwkweDhl M2IsIDB4OGUzZSwgMHg4ZTQwLCAweDhlNDMsIDB4OGU1MCwgMHg4ZTVlLCAweDhlNzAsIDB4OGU3 NywKKwkweDk2MDAsIDB4OTYwNCwgMHg5NjI0LCAweDk2MzcsIDB4OWUwMCwgMHg5ZTAxLCAweDll MDMsIDB4OWUwZSwKKwkweDllMTEsIDB4OWUxNiwgMHg5ZTE5LCAweDllMTksIDB4OWUxYywgMHg5 ZTFjLCAweDllMjAsIDB4OWUyMywKKwkweDllMzAsIDB4OWUzMSwgMHg5ZTM0LCAweDllMzQsIDB4 OWU3MCwgMHg5ZTcyLCAweDllNzgsIDB4OWU3OSwKKwkweDllODAsIDB4OWZmZiwgMHhhNjAwLCAw eGE2MDEsIDB4YTYwMywgMHhhNjAzLCAweGE2MGEsIDB4YTYwYSwKKwkweGE2MTAsIDB4YTYxNywg MHhhNjMwLCAweGE2MzAsCisJfjAKK307CisKK3N0YXRpYyBpbnQgYTZ4eF9wbV9yZXN1bWUoc3Ry dWN0IG1zbV9ncHUgKmdwdSkKK3sKKwlzdHJ1Y3QgYWRyZW5vX2dwdSAqYWRyZW5vX2dwdSA9IHRv X2FkcmVub19ncHUoZ3B1KTsKKwlzdHJ1Y3QgYTZ4eF9ncHUgKmE2eHhfZ3B1ID0gdG9fYTZ4eF9n cHUoYWRyZW5vX2dwdSk7CisJaW50IHJldDsKKworCXJldCA9IGE2eHhfZ211X3Jlc3VtZShhNnh4 X2dwdSk7CisKKwlncHUtPm5lZWRzX2h3X2luaXQgPSB0cnVlOworCisJcmV0dXJuIHJldDsKK30K Kworc3RhdGljIGludCBhNnh4X3BtX3N1c3BlbmQoc3RydWN0IG1zbV9ncHUgKmdwdSkKK3sKKwlz dHJ1Y3QgYWRyZW5vX2dwdSAqYWRyZW5vX2dwdSA9IHRvX2FkcmVub19ncHUoZ3B1KTsKKwlzdHJ1 Y3QgYTZ4eF9ncHUgKmE2eHhfZ3B1ID0gdG9fYTZ4eF9ncHUoYWRyZW5vX2dwdSk7CisKKwkvKgor CSAqIE1ha2Ugc3VyZSB0aGUgR01VIGlzIGlkbGUgYmVmb3JlIGNvbnRpbnVpbmcgKGJlY2F1c2Ug c29tZSB0cmFuc2l0aW9ucworCSAqIG1heSB1c2UgVkJJRgorCSAqLworCWE2eHhfZ211X3dhaXRf Zm9yX2lkbGUoYTZ4eF9ncHUpOworCisJLyogQ2xlYXIgdGhlIFZCSUYgcGlwZSBiZWZvcmUgc2h1 dHRpbmcgZG93biAqLworCS8qIEZJWE1FOiBUaGlzIGFjY2Vzc2VzIHRoZSBHUFUgLSBkbyB3ZSBu ZWVkIHRvIG1ha2Ugc3VyZSBpdCBpcyBvbj8gKi8KKwlncHVfd3JpdGUoZ3B1LCBSRUdfQTZYWF9W QklGX1hJTl9IQUxUX0NUUkwwLCAweGYpOworCXNwaW5fdW50aWwoKGdwdV9yZWFkKGdwdSwgUkVH X0E2WFhfVkJJRl9YSU5fSEFMVF9DVFJMMSkgJiAweGYpID09IDB4Zik7CisJZ3B1X3dyaXRlKGdw dSwgUkVHX0E2WFhfVkJJRl9YSU5fSEFMVF9DVFJMMCwgMCk7CisKKwlyZXR1cm4gYTZ4eF9nbXVf c3RvcChhNnh4X2dwdSk7Cit9CisKK3N0YXRpYyBpbnQgYTZ4eF9nZXRfdGltZXN0YW1wKHN0cnVj dCBtc21fZ3B1ICpncHUsIHVpbnQ2NF90ICp2YWx1ZSkKK3sKKwlzdHJ1Y3QgYWRyZW5vX2dwdSAq YWRyZW5vX2dwdSA9IHRvX2FkcmVub19ncHUoZ3B1KTsKKwlzdHJ1Y3QgYTZ4eF9ncHUgKmE2eHhf Z3B1ID0gdG9fYTZ4eF9ncHUoYWRyZW5vX2dwdSk7CisKKwkvKiBGb3JjZSB0aGUgR1BVIHBvd2Vy IG9uIHNvIHdlIGNhbiByZWFkIHRoaXMgcmVnaXN0ZXIgKi8KKwlhNnh4X2dtdV9zZXRfb29iKCZh Nnh4X2dwdS0+Z211LCBHTVVfT09CX0dQVV9TRVQpOworCisJKnZhbHVlID0gZ3B1X3JlYWQ2NChn cHUsIFJFR19BNlhYX1JCQk1fUEVSRkNUUl9DUF8wX0xPLAorCQlSRUdfQTZYWF9SQkJNX1BFUkZD VFJfQ1BfMF9ISSk7CisKKwlhNnh4X2dtdV9jbGVhcl9vb2IoJmE2eHhfZ3B1LT5nbXUsIEdNVV9P T0JfR1BVX1NFVCk7CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfREVCVUdfRlMKK3N0 YXRpYyB2b2lkIGE2eHhfc2hvdyhzdHJ1Y3QgbXNtX2dwdSAqZ3B1LCBzdHJ1Y3Qgc2VxX2ZpbGUg Km0pCit7CisJZ3B1LT5mdW5jcy0+cG1fcmVzdW1lKGdwdSk7CisKKwlzZXFfcHJpbnRmKG0sICJz dGF0dXM6ICAgJTA4eFxuIiwKKwkJCWdwdV9yZWFkKGdwdSwgUkVHX0E2WFhfUkJCTV9TVEFUVVMp KTsKKwlncHUtPmZ1bmNzLT5wbV9zdXNwZW5kKGdwdSk7CisKKwlhZHJlbm9fc2hvdyhncHUsIG0p OworfQorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgbXNtX3JpbmdidWZmZXIgKmE2eHhfYWN0aXZl X3Jpbmcoc3RydWN0IG1zbV9ncHUgKmdwdSkKK3sKKwlzdHJ1Y3QgYWRyZW5vX2dwdSAqYWRyZW5v X2dwdSA9IHRvX2FkcmVub19ncHUoZ3B1KTsKKwlzdHJ1Y3QgYTZ4eF9ncHUgKmE2eHhfZ3B1ID0g dG9fYTZ4eF9ncHUoYWRyZW5vX2dwdSk7CisKKwlyZXR1cm4gYTZ4eF9ncHUtPmN1cl9yaW5nOwor fQorCitzdGF0aWMgdm9pZCBhNnh4X2Rlc3Ryb3koc3RydWN0IG1zbV9ncHUgKmdwdSkKK3sKKwlz dHJ1Y3QgYWRyZW5vX2dwdSAqYWRyZW5vX2dwdSA9IHRvX2FkcmVub19ncHUoZ3B1KTsKKwlzdHJ1 Y3QgYTZ4eF9ncHUgKmE2eHhfZ3B1ID0gdG9fYTZ4eF9ncHUoYWRyZW5vX2dwdSk7CisKKwlpZiAo YTZ4eF9ncHUtPnNxZV9ibykgeworCQlpZiAoYTZ4eF9ncHUtPnNxZV9pb3ZhKQorCQkJbXNtX2dl bV9wdXRfaW92YShhNnh4X2dwdS0+c3FlX2JvLCBncHUtPmFzcGFjZSk7CisJCWRybV9nZW1fb2Jq ZWN0X3VucmVmZXJlbmNlX3VubG9ja2VkKGE2eHhfZ3B1LT5zcWVfYm8pOworCX0KKworCWE2eHhf Z211X3JlbW92ZShhNnh4X2dwdSk7CisKKwlhZHJlbm9fZ3B1X2NsZWFudXAoYWRyZW5vX2dwdSk7 CisJa2ZyZWUoYTZ4eF9ncHUpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGFkcmVub19ncHVf ZnVuY3MgZnVuY3MgPSB7CisJLmJhc2UgPSB7CisJCS5nZXRfcGFyYW0gPSBhZHJlbm9fZ2V0X3Bh cmFtLAorCQkuaHdfaW5pdCA9IGE2eHhfaHdfaW5pdCwKKwkJLnBtX3N1c3BlbmQgPSBhNnh4X3Bt X3N1c3BlbmQsCisJCS5wbV9yZXN1bWUgPSBhNnh4X3BtX3Jlc3VtZSwKKwkJLnJlY292ZXIgPSBh Nnh4X3JlY292ZXIsCisJCS5zdWJtaXQgPSBhNnh4X3N1Ym1pdCwKKwkJLmZsdXNoID0gYTZ4eF9m bHVzaCwKKwkJLmFjdGl2ZV9yaW5nID0gYTZ4eF9hY3RpdmVfcmluZywKKwkJLmlycSA9IGE2eHhf aXJxLAorCQkuZGVzdHJveSA9IGE2eHhfZGVzdHJveSwKKyNpZmRlZiBDT05GSUdfREVCVUdfRlMK KwkJLnNob3cgPSBhNnh4X3Nob3csCisjZW5kaWYKKwl9LAorCS5nZXRfdGltZXN0YW1wID0gYTZ4 eF9nZXRfdGltZXN0YW1wLAorfTsKKworc3RydWN0IG1zbV9ncHUgKmE2eHhfZ3B1X2luaXQoc3Ry dWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbXNtX2RybV9wcml2YXRlICpwcml2ID0g ZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gcHJpdi0+ Z3B1X3BkZXY7CisJc3RydWN0IGRldmljZV9ub2RlICpub2RlOworCXN0cnVjdCBhNnh4X2dwdSAq YTZ4eF9ncHU7CisJc3RydWN0IGFkcmVub19ncHUgKmFkcmVub19ncHU7CisJc3RydWN0IG1zbV9n cHUgKmdwdTsKKwlpbnQgcmV0OworCisJYTZ4eF9ncHUgPSBremFsbG9jKHNpemVvZigqYTZ4eF9n cHUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWE2eHhfZ3B1KQorCQlyZXR1cm4gRVJSX1BUUigtRU5P TUVNKTsKKworCWFkcmVub19ncHUgPSAmYTZ4eF9ncHUtPmJhc2U7CisJZ3B1ID0gJmFkcmVub19n cHUtPmJhc2U7CisKKwlhZHJlbm9fZ3B1LT5yZWdpc3RlcnMgPSBhNnh4X3JlZ2lzdGVyczsKKwlh ZHJlbm9fZ3B1LT5yZWdfb2Zmc2V0cyA9IGE2eHhfcmVnaXN0ZXJfb2Zmc2V0czsKKworCXJldCA9 IGFkcmVub19ncHVfaW5pdChkZXYsIHBkZXYsIGFkcmVub19ncHUsICZmdW5jcywgMSk7CisJaWYg KHJldCkgeworCQlhNnh4X2Rlc3Ryb3koJihhNnh4X2dwdS0+YmFzZS5iYXNlKSk7CisJCXJldHVy biBFUlJfUFRSKHJldCk7CisJfQorCisJLyogQ2hlY2sgaWYgdGhlcmUgaXMgYSBHTVUgcGhhbmRs ZSBhbmQgc2V0IGl0IHVwICovCisJbm9kZSA9IG9mX3BhcnNlX3BoYW5kbGUocGRldi0+ZGV2Lm9m X25vZGUsICJnbXUiLCAwKTsKKworCS8qIEZJWE1FOiBIb3cgZG8gd2UgZ3JhY2VmdWxseSBoYW5k bGUgdGhpcz8gKi8KKwlCVUdfT04oIW5vZGUpOworCisJcmV0ID0gYTZ4eF9nbXVfcHJvYmUoYTZ4 eF9ncHUsIG5vZGUpOworCWlmIChyZXQpIHsKKwkJYTZ4eF9kZXN0cm95KCYoYTZ4eF9ncHUtPmJh c2UuYmFzZSkpOworCQlyZXR1cm4gRVJSX1BUUihyZXQpOworCX0KKworCWlmIChncHUtPmFzcGFj ZSkKKwkJbXNtX21tdV9zZXRfZmF1bHRfaGFuZGxlcihncHUtPmFzcGFjZS0+bW11LCBncHUsCisJ CQkJYTZ4eF9mYXVsdF9oYW5kbGVyKTsKKworCXJldHVybiBncHU7Cit9CmRpZmYgLS1naXQgYS9k cml2ZXJzL2dwdS9kcm0vbXNtL2FkcmVuby9hNnh4X2dwdS5oIGIvZHJpdmVycy9ncHUvZHJtL21z bS9hZHJlbm8vYTZ4eF9ncHUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4w NmU5M2ZkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9hZHJlbm8vYTZ4 eF9ncHUuaApAQCAtMCwwICsxLDY5IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIExpbnV4 IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlz IGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAq IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVy c2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNv ZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGlu IHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FS UkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRB QklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICog R05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKyNp Zm5kZWYgX19BNlhYX0dQVV9IX18KKyNkZWZpbmUgX19BNlhYX0dQVV9IX18KKworCisjaW5jbHVk ZSAiYWRyZW5vX2dwdS5oIgorI2luY2x1ZGUgImE2eHgueG1sLmgiCisKKyNpbmNsdWRlICJhNnh4 X2dtdS5oIgorCitleHRlcm4gYm9vbCBoYW5nX2RlYnVnOworCitzdHJ1Y3QgYTZ4eF9ncHUgewor CXN0cnVjdCBhZHJlbm9fZ3B1IGJhc2U7CisKKwlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKnNxZV9i bzsKKwl1aW50NjRfdCBzcWVfaW92YTsKKworCXN0cnVjdCBtc21fcmluZ2J1ZmZlciAqY3VyX3Jp bmc7CisKKwlzdHJ1Y3QgYTZ4eF9nbXUgZ211OworfTsKKworI2RlZmluZSB0b19hNnh4X2dwdSh4 KSBjb250YWluZXJfb2YoeCwgc3RydWN0IGE2eHhfZ3B1LCBiYXNlKQorCisvKgorICogR2l2ZW4g YSByZWdpc3RlciBhbmQgYSBjb3VudCwgcmV0dXJuIGEgdmFsdWUgdG8gcHJvZ3JhbSBpbnRvCisg KiBSRUdfQ1BfUFJPVEVDVF9SRUcobikgLSB0aGlzIHdpbGwgYmxvY2sgYm90aCByZWFkcyBhbmQg d3JpdGVzIGZvciBfbGVuCisgKiByZWdpc3RlcnMgc3RhcnRpbmcgYXQgX3JlZy4KKyAqLworI2Rl ZmluZSBBNlhYX1BST1RFQ1RfUlcoX3JlZywgX2xlbikgXAorCSgoMSA8PCAzMSkgfCBcCisJKCgo X2xlbikgJiAweDNGRkYpIDw8IDE4KSB8ICgoX3JlZykgJiAweDNGRkZGKSkKKworLyoKKyAqIFNh bWUgYXMgYWJvdmUsIGJ1dCBhbGxvdyByZWFkcyBvdmVyIHRoZSByYW5nZS4gRm9yIGFyZWFzIG9m IG1peGVkIHVzZSAoc3VjaAorICogYXMgcGVyZm9ybWFuY2UgY291bnRlcnMpIHRoaXMgYWxsb3dz IHVzIHRvIHByb3RlY3QgYSBtdWNoIGxhcmdlciByYW5nZSB3aXRoIGEKKyAqIHNpbmdsZSByZWdp c3RlcgorICovCisjZGVmaW5lIEE2WFhfUFJPVEVDVF9SRE9OTFkoX3JlZywgX2xlbikgXAorCSgo KChfbGVuKSAmIDB4M0ZGRikgPDwgMTgpIHwgKChfcmVnKSAmIDB4M0ZGRkYpKQorCisKK2ludCBh Nnh4X2dtdV9yZXN1bWUoc3RydWN0IGE2eHhfZ3B1ICpncHUpOworaW50IGE2eHhfZ211X3N0b3Ao c3RydWN0IGE2eHhfZ3B1ICpncHUpOworCitpbnQgYTZ4eF9nbXVfd2FpdF9mb3JfaWRsZShzdHJ1 Y3QgYTZ4eF9ncHUgKmdwdSk7CisKK2ludCBhNnh4X2dtdV9yZXNldChzdHJ1Y3QgYTZ4eF9ncHUg KmE2eHhfZ3B1KTsKK2Jvb2wgYTZ4eF9nbXVfaXNpZGxlKHN0cnVjdCBhNnh4X2dtdSAqZ211KTsK KworaW50IGE2eHhfZ211X3NldF9vb2Ioc3RydWN0IGE2eHhfZ211ICpnbXUsIGVudW0gYTZ4eF9n bXVfb29iX3N0YXRlIHN0YXRlKTsKK3ZvaWQgYTZ4eF9nbXVfY2xlYXJfb29iKHN0cnVjdCBhNnh4 X2dtdSAqZ211LCBlbnVtIGE2eHhfZ211X29vYl9zdGF0ZSBzdGF0ZSk7CisKK2ludCBhNnh4X2dt dV9wcm9iZShzdHJ1Y3QgYTZ4eF9ncHUgKmE2eHhfZ3B1LCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5v ZGUpOwordm9pZCBhNnh4X2dtdV9yZW1vdmUoc3RydWN0IGE2eHhfZ3B1ICphNnh4X2dwdSk7CisK KyNlbmRpZiAvKiBfX0E2WFhfR1BVX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJt L21zbS9hZHJlbm8vYTZ4eF9oZmkuYyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vYWRyZW5vL2E2eHhf aGZpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjUxZjM3MwotLS0gL2Rl di9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vYWRyZW5vL2E2eHhfaGZpLmMKQEAgLTAs MCArMSw0NDggQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IFRoZSBMaW51eCBGb3VuZGF0 aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNv ZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRl ciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBh bmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBG b3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9w ZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3 aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBv ciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5l cmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpbmNsdWRl IDxsaW51eC9jb21wbGV0aW9uLmg+CisjaW5jbHVkZSA8bGludXgvY2lyY19idWYuaD4KKyNpbmNs dWRlIDxsaW51eC9saXN0Lmg+CisKKyNpbmNsdWRlICJhNnh4X2dtdS5oIgorI2luY2x1ZGUgImE2 eHhfZ211LnhtbC5oIgorCisjZGVmaW5lIEhGSV9NU0dfSUQodmFsKSBbdmFsXSA9ICN2YWwKKwor c3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhNnh4X2hmaV9tc2dfaWRbXSA9IHsKKwlIRklfTVNH X0lEKEhGSV9IMkZfTVNHX0lOSVQpLAorCUhGSV9NU0dfSUQoSEZJX0gyRl9NU0dfRldfVkVSU0lP TiksCisJSEZJX01TR19JRChIRklfSDJGX01TR19CV19UQUJMRSksCisJSEZJX01TR19JRChIRklf SDJGX01TR19QRVJGX1RBQkxFKSwKKwlIRklfTVNHX0lEKEhGSV9IMkZfTVNHX1RFU1QpLAorfTsK Kworc3RhdGljIGludCBhNnh4X2hmaV9xdWV1ZV9yZWFkKHN0cnVjdCBhNnh4X2hmaV9xdWV1ZSAq cXVldWUsIHUzMiAqZGF0YSwKKwkJdTMyIGR3b3JkcykKK3sKKwlzdHJ1Y3QgYTZ4eF9oZmlfcXVl dWVfaGVhZGVyICpoZWFkZXIgPSBxdWV1ZS0+aGVhZGVyOworCXUzMiBpLCBoZHIsIGluZGV4ID0g aGVhZGVyLT5yZWFkX2luZGV4OworCisJaWYgKGhlYWRlci0+cmVhZF9pbmRleCA9PSBoZWFkZXIt PndyaXRlX2luZGV4KSB7CisJCWhlYWRlci0+cnhfcmVxdWVzdCA9IDE7CisJCXJldHVybiAwOwor CX0KKworCWhkciA9IHF1ZXVlLT5kYXRhW2luZGV4XTsKKworCS8qCisJICogSWYgd2UgYXJlIHRv IGFzc3VtZSB0aGF0IHRoZSBHTVUgZmlybXdhcmUgaXMgaW4gZmFjdCBhIHJhdGlvbmFsIGFjdG9y CisJICogYW5kIGlzIHByb2dyYW1tZWQgdG8gbm90IHNlbmQgdXMgYSBsYXJnZXIgcmVzcG9uc2Ug dGhhbiB3ZSBleHBlY3QKKwkgKiB0aGVuIHdlIGNhbiBhbHNvIGFzc3VtZSB0aGF0IGlmIHRoZSBo ZWFkZXIgc2l6ZSBpcyB1bmV4cGVjdGVkbHkgbGFyZ2UKKwkgKiB0aGF0IGl0IGlzIGR1ZSB0byBt ZW1vcnkgY29ycnVwdGlvbiBhbmQvb3IgaGFyZHdhcmUgZmFpbHVyZS4gSW4gdGhpcworCSAqIGNh c2UgdGhlIG9ubHkgcmVhc29uYWJsZSBjb3Vyc2Ugb2YgYWN0aW9uIGlzIHRvIEJVRygpIHRvIGhl bHAgaGFyZGVuCisJICogdGhlIGZhaWx1cmUuCisJICovCisKKwlCVUdfT04oSEZJX0hFQURFUl9T SVpFKGhkcikgPiBkd29yZHMpOworCisJZm9yIChpID0gMDsgaSA8IEhGSV9IRUFERVJfU0laRSho ZHIpOyBpKyspIHsKKwkJZGF0YVtpXSA9IHF1ZXVlLT5kYXRhW2luZGV4XTsKKwkJaW5kZXggPSAo aW5kZXggKyAxKSAlIGhlYWRlci0+c2l6ZTsKKwl9CisKKwloZWFkZXItPnJlYWRfaW5kZXggPSBp bmRleDsKKwlyZXR1cm4gSEZJX0hFQURFUl9TSVpFKGhkcik7Cit9CisKK3N0YXRpYyBpbnQgYTZ4 eF9oZmlfcXVldWVfd3JpdGUoc3RydWN0IGE2eHhfZ211ICpnbXUsCisJc3RydWN0IGE2eHhfaGZp X3F1ZXVlICpxdWV1ZSwgdTMyICpkYXRhLCB1MzIgZHdvcmRzKQoreworCXN0cnVjdCBhNnh4X2hm aV9xdWV1ZV9oZWFkZXIgKmhlYWRlciA9IHF1ZXVlLT5oZWFkZXI7CisJdTMyIGksIHNwYWNlLCBp bmRleCA9IGhlYWRlci0+d3JpdGVfaW5kZXg7CisKKwlzcGluX2xvY2soJnF1ZXVlLT5sb2NrKTsK KworCXNwYWNlID0gQ0lSQ19TUEFDRShoZWFkZXItPndyaXRlX2luZGV4LCBoZWFkZXItPnJlYWRf aW5kZXgsCisJCWhlYWRlci0+c2l6ZSk7CisJaWYgKHNwYWNlIDwgZHdvcmRzKSB7CisJCWhlYWRl ci0+ZHJvcHBlZCsrOworCQlzcGluX3VubG9jaygmcXVldWUtPmxvY2spOworCQlyZXR1cm4gLUVO T1NQQzsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgZHdvcmRzOyBpKyspIHsKKwkJcXVldWUtPmRh dGFbaW5kZXhdID0gZGF0YVtpXTsKKwkJaW5kZXggPSAoaW5kZXggKyAxKSAlIGhlYWRlci0+c2l6 ZTsKKwl9CisKKwloZWFkZXItPndyaXRlX2luZGV4ID0gaW5kZXg7CisJc3Bpbl91bmxvY2soJnF1 ZXVlLT5sb2NrKTsKKworCS8qIE1ha2Ugc3VyZSB0aGUgY29tbWFuZCBpcyB3cml0dGVuIHRvIHRo ZSBxdWV1ZSAqLworCXdtYigpOworCisJZ211X3dyaXRlKGdtdSwgUkVHX0E2WFhfR01VX0hPU1Qy R01VX0lOVFJfU0VULCAweDAxKTsKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGE2eHhfaGZpX3Jl c3BvbnNlIHsKKwl1MzIgaWQ7CisJdTMyIHNlcW51bTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIG5vZGU7 CisJc3RydWN0IGNvbXBsZXRpb24gY29tcGxldGU7CisKKwl1MzIgZXJyb3I7CisJdTMyIHBheWxv YWRbMTZdOworfTsKKworLyoKKyAqIEluY29taW5nIEhGSSBhY2sgbWVzc2FnZXMgY2FuIGNvbWUg aW4gb3V0IG9mIG9yZGVyIHNvIHdlIG5lZWQgdG8gc3RvcmUgYWxsCisgKiB0aGUgcGVuZGluZyBt ZXNzYWdlcyBvbiBhIGxpc3QgdW50aWwgdGhleSBhcmUgaGFuZGxlZC4KKyAqLworc3RhdGljIHNw aW5sb2NrX3QgaGZpX2Fja19sb2NrID0gX19TUElOX0xPQ0tfVU5MT0NLRUQobWVzc2FnZV9sb2Nr KTsKK3N0YXRpYyBMSVNUX0hFQUQoaGZpX2Fja19saXN0KTsKKworc3RhdGljIHZvaWQgYTZ4eF9o ZmlfaGFuZGxlX2FjayhzdHJ1Y3QgYTZ4eF9nbXUgKmdtdSwKKwkJc3RydWN0IGE2eHhfaGZpX21z Z19yZXNwb25zZSAqbXNnKQoreworCXN0cnVjdCBhNnh4X2hmaV9yZXNwb25zZSAqcmVzcDsKKwl1 MzIgaWQsIHNlcW51bTsKKworCS8qIG1zZy0+cmV0X2hlYWRlciBjb250YWlucyB0aGUgaGVhZGVy IG9mIHRoZSBtZXNzYWdlIGJlaW5nIGFja2VkICovCisJaWQgPSBIRklfSEVBREVSX0lEKG1zZy0+ cmV0X2hlYWRlcik7CisJc2VxbnVtID0gSEZJX0hFQURFUl9TRVFOVU0obXNnLT5yZXRfaGVhZGVy KTsKKworCXNwaW5fbG9jaygmaGZpX2Fja19sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJl c3AsICZoZmlfYWNrX2xpc3QsIG5vZGUpIHsKKwkJaWYgKHJlc3AtPmlkID09IGlkICYmIHJlc3At PnNlcW51bSA9PSBzZXFudW0pIHsKKwkJCXJlc3AtPmVycm9yID0gbXNnLT5lcnJvcjsKKwkJCW1l bWNweShyZXNwLT5wYXlsb2FkLCBtc2ctPnBheWxvYWQsCisJCQkJc2l6ZW9mKHJlc3AtPnBheWxv YWQpKTsKKworCQkJY29tcGxldGUoJnJlc3AtPmNvbXBsZXRlKTsKKwkJCXNwaW5fdW5sb2NrKCZo ZmlfYWNrX2xvY2spOworCQkJcmV0dXJuOworCQl9CisJfQorCXNwaW5fdW5sb2NrKCZoZmlfYWNr X2xvY2spOworCisJZGV2X2VycihnbXUtPmRldiwgIk5vYm9keSB3YXMgd2FpdGluZyBmb3IgSEZJ IG1lc3NhZ2UgJWRcbiIsIHNlcW51bSk7Cit9CisKK3N0YXRpYyB2b2lkIGE2eHhfaGZpX2hhbmRs ZV9lcnJvcihzdHJ1Y3QgYTZ4eF9nbXUgKmdtdSwKKwkJc3RydWN0IGE2eHhfaGZpX21zZ19yZXNw b25zZSAqbXNnKQoreworCXN0cnVjdCBhNnh4X2hmaV9tc2dfZXJyb3IgKmVycm9yID0gKHN0cnVj dCBhNnh4X2hmaV9tc2dfZXJyb3IgKikgbXNnOworCisJZGV2X2VycihnbXUtPmRldiwgIkdNVSBm aXJtd2FyZSBlcnJvciAlZFxuIiwgZXJyb3ItPmNvZGUpOworfQorCit2b2lkIGE2eHhfaGZpX3Rh c2sodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBhNnh4X2dtdSAqZ211ID0gKHN0cnVj dCBhNnh4X2dtdSAqKSBkYXRhOworCXN0cnVjdCBhNnh4X2hmaV9xdWV1ZSAqcXVldWUgPSAmZ211 LT5xdWV1ZXNbSEZJX1JFU1BPTlNFX1FVRVVFXTsKKwlzdHJ1Y3QgYTZ4eF9oZmlfbXNnX3Jlc3Bv bnNlIHJlc3A7CisKKwlmb3IgKDs7KSB7CisJCXUzMiBpZDsKKwkJaW50IHJldCA9IGE2eHhfaGZp X3F1ZXVlX3JlYWQocXVldWUsICh1MzIgKikgJnJlc3AsCisJCQlzaXplb2YocmVzcCkgPj4gMik7 CisKKwkJLyogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvcGllZCBvciBuZWdhdGl2ZSBv biBlcnJvciAqLworCQlpZiAocmV0IDw9IDApIHsKKwkJCWlmIChyZXQgPCAwKQorCQkJCWRldl9l cnIoZ211LT5kZXYsCisJCQkJCSJVbmFibGUgdG8gcmVhZCB0aGUgSEZJIG1lc3NhZ2UgcXVldWVc biIpOworCQkJYnJlYWs7CisJCX0KKworCQlpZCA9IEhGSV9IRUFERVJfSUQocmVzcC5oZWFkZXIp OworCisJCWlmIChpZCA9PSBIRklfRjJIX01TR19BQ0spCisJCQlhNnh4X2hmaV9oYW5kbGVfYWNr KGdtdSwgJnJlc3ApOworCQllbHNlIGlmIChpZCA9PSBIRklfRjJIX01TR19FUlJPUikKKwkJCWE2 eHhfaGZpX2hhbmRsZV9lcnJvcihnbXUsICZyZXNwKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgYTZ4 eF9oZmlfc2VuZF9tc2coc3RydWN0IGE2eHhfZ211ICpnbXUsIGludCBpZCwKKwkJdm9pZCAqZGF0 YSwgdTMyIHNpemUsIHUzMiAqcGF5bG9hZCwgdTMyIHBheWxvYWRfc2l6ZSkKK3sKKwlzdHJ1Y3Qg YTZ4eF9oZmlfcXVldWUgKnF1ZXVlID0gJmdtdS0+cXVldWVzW0hGSV9DT01NQU5EX1FVRVVFXTsK KwlzdHJ1Y3QgYTZ4eF9oZmlfcmVzcG9uc2UgcmVzcCA9IHsgMCB9OworCWludCByZXQsIGR3b3Jk cyA9IHNpemUgPj4gMjsKKwl1MzIgc2VxbnVtOworCisJc2VxbnVtID0gYXRvbWljX2luY19yZXR1 cm4oJnF1ZXVlLT5zZXFudW0pICUgMHhmZmY7CisKKwkvKiBGaXJzdCBkd29yZCBvZiB0aGUgbWVz c2FnZSBpcyB0aGUgbWVzc2FnZSBoZWFkZXIgLSBmaWxsIGl0IGluICovCisJKigodTMyICopIGRh dGEpID0gKHNlcW51bSA8PCAyMCkgfCAoSEZJX01TR19DTUQgPDwgMTYpIHwKKwkJKGR3b3JkcyA8 PCA4KSB8IGlkOworCisJaW5pdF9jb21wbGV0aW9uKCZyZXNwLmNvbXBsZXRlKTsKKwlyZXNwLmlk ID0gaWQ7CisJcmVzcC5zZXFudW0gPSBzZXFudW07CisKKwlzcGluX2xvY2tfYmgoJmhmaV9hY2tf bG9jayk7CisJbGlzdF9hZGRfdGFpbCgmcmVzcC5ub2RlLCAmaGZpX2Fja19saXN0KTsKKwlzcGlu X3VubG9ja19iaCgmaGZpX2Fja19sb2NrKTsKKworCXJldCA9IGE2eHhfaGZpX3F1ZXVlX3dyaXRl KGdtdSwgcXVldWUsIGRhdGEsIGR3b3Jkcyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGdtdS0+ ZGV2LCAiVW5hYmxlIHRvIHNlbmQgbWVzc2FnZSAlcyBpZCAlZFxuIiwKKwkJCWE2eHhfaGZpX21z Z19pZFtpZF0sIHNlcW51bSk7CisJCWdvdG8gb3V0OworCX0KKworCS8qIFdhaXQgdXAgdG8gNSBz ZWNvbmRzIGZvciB0aGUgcmVzcG9uc2UgKi8KKwlyZXQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3Rp bWVvdXQoJnJlc3AuY29tcGxldGUsCisJCW1zZWNzX3RvX2ppZmZpZXMoNTAwMCkpOworCWlmICgh cmV0KSB7CisJCWRldl9lcnIoZ211LT5kZXYsCisJCQkiTWVzc2FnZSAlcyBpZCAlZCB0aW1lZCBv dXQgd2FpdGluZyBmb3IgcmVzcG9uc2VcbiIsCisJCQlhNnh4X2hmaV9tc2dfaWRbaWRdLCBzZXFu dW0pOworCQlyZXQgPSAtRVRJTUVET1VUOworCX0gZWxzZQorCQlyZXQgPSAwOworCitvdXQ6CisJ c3Bpbl9sb2NrX2JoKCZoZmlfYWNrX2xvY2spOworCWxpc3RfZGVsKCZyZXNwLm5vZGUpOworCXNw aW5fdW5sb2NrX2JoKCZoZmlfYWNrX2xvY2spOworCisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsK KworCWlmIChyZXNwLmVycm9yKSB7CisJCWRldl9lcnIoZ211LT5kZXYsICJNZXNzYWdlICVzIGlk ICVkIHJldHVybmVkIGVycm9yICVkXG4iLAorCQkJYTZ4eF9oZmlfbXNnX2lkW2lkXSwgc2VxbnVt LCByZXNwLmVycm9yKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHBheWxvYWQgJiYg cGF5bG9hZF9zaXplKSB7CisJCWludCBjb3B5ID0gbWluX3QodTMyLCBwYXlsb2FkX3NpemUsIHNp emVvZihyZXNwLnBheWxvYWQpKTsKKworCQltZW1jcHkocGF5bG9hZCwgcmVzcC5wYXlsb2FkLCBj b3B5KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhNnh4X2hmaV9zZW5kX2dt dV9pbml0KHN0cnVjdCBhNnh4X2dtdSAqZ211LCBpbnQgYm9vdF9zdGF0ZSkKK3sKKwlzdHJ1Y3Qg YTZ4eF9oZmlfbXNnX2dtdV9pbml0X2NtZCBtc2cgPSB7IDAgfTsKKworCW1zZy5kYmdfYnVmZmVy X2FkZHIgPSAodTMyKSBnbXUtPmRlYnVnLT5pb3ZhOworCW1zZy5kYmdfYnVmZmVyX3NpemUgPSAo dTMyKSBnbXUtPmRlYnVnLT5zaXplOworCW1zZy5ib290X3N0YXRlID0gYm9vdF9zdGF0ZTsKKwor CXJldHVybiBhNnh4X2hmaV9zZW5kX21zZyhnbXUsIEhGSV9IMkZfTVNHX0lOSVQsICZtc2csIHNp emVvZihtc2cpLAorCQlOVUxMLCAwKTsKK30KKworc3RhdGljIGludCBhNnh4X2hmaV9nZXRfZndf dmVyc2lvbihzdHJ1Y3QgYTZ4eF9nbXUgKmdtdSwgdTMyICp2ZXJzaW9uKQoreworCXN0cnVjdCBh Nnh4X2hmaV9tc2dfZndfdmVyc2lvbiBtc2cgPSB7IDAgfTsKKworCS8qIEN1cnJlbnRseSBzdXBw b3J0aW5nIHZlcnNpb24gMS4xICovCisJbXNnLnN1cHBvcnRlZF92ZXJzaW9uID0gKDEgPDwgMjgp IHwgKDEgPDwgMTYpOworCisJcmV0dXJuIGE2eHhfaGZpX3NlbmRfbXNnKGdtdSwgSEZJX0gyRl9N U0dfRldfVkVSU0lPTiwgJm1zZywgc2l6ZW9mKG1zZyksCisJCXZlcnNpb24sIHNpemVvZigqdmVy c2lvbikpOworfQorCitzdGF0aWMgaW50IGE2eHhfaGZpX3NlbmRfcGVyZl90YWJsZShzdHJ1Y3Qg YTZ4eF9nbXUgKmdtdSkKK3sKKwlzdHJ1Y3QgYTZ4eF9oZmlfbXNnX3BlcmZfdGFibGUgbXNnID0g eyAwIH07CisJaW50IGk7CisKKwltc2cubnVtX2dwdV9sZXZlbHMgPSBnbXUtPm5yX2dwdV9mcmVx czsKKwltc2cubnVtX2dtdV9sZXZlbHMgPSBnbXUtPm5yX2dtdV9mcmVxczsKKworCWZvciAoaSA9 IDA7IGkgPCBnbXUtPm5yX2dwdV9mcmVxczsgaSsrKSB7CisJCW1zZy5neF92b3Rlc1tpXS52b3Rl ID0gZ211LT5neF9hcmNfdm90ZXNbaV07CisJCW1zZy5neF92b3Rlc1tpXS52b3RlID0gZ211LT5n cHVfZnJlcXNbaV0gLyAxMDAwOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBnbXUtPm5yX2dtdV9m cmVxczsgaSsrKSB7CisJCW1zZy5jeF92b3Rlc1tpXS52b3RlID0gZ211LT5jeF9hcmNfdm90ZXNb aV07CisJCW1zZy5jeF92b3Rlc1tpXS52b3RlID0gZ211LT5nbXVfZnJlcXNbaV0gLyAxMDAwOwor CX0KKworCXJldHVybiBhNnh4X2hmaV9zZW5kX21zZyhnbXUsIEhGSV9IMkZfTVNHX1BFUkZfVEFC TEUsICZtc2csIHNpemVvZihtc2cpLAorCQlOVUxMLCAwKTsKK30KKworc3RhdGljIGludCBhNnh4 X2hmaV9zZW5kX2J3X3RhYmxlKHN0cnVjdCBhNnh4X2dtdSAqZ211KQoreworCXN0cnVjdCBhNnh4 X2hmaV9tc2dfYndfdGFibGUgbXNnID0geyAwIH07CisKKwkvKgorCSAqIFRoZSBzZG04NDUgR01V IGRvZXNuJ3QgZG8gYnVzIGZyZXF1ZW5jeSBzY2FsaW5nIG9uIGl0cyBvd24gYnV0IGl0CisJICog ZG9lcyBuZWVkIGF0IGxlYXN0IG9uZSBlbnRyeSBpbiB0aGUgbGlzdCBiZWNhdXNlIGl0IG1pZ2h0 IGJlIGFjY2Vzc2VkCisJICogd2hlbiB0aGUgR01VIGlzIHNodXR0aW5nIGRvd24uIFNlbmQgYSBz aW5nbGUgIm9mZiIgZW50cnkuCisJICovCisKKwltc2cuYndfbGV2ZWxfbnVtID0gMTsKKworCW1z Zy5kZHJfY21kc19udW0gPSAzOworCW1zZy5kZHJfd2FpdF9iaXRtYXNrID0gMHgwNzsKKworCW1z Zy5kZHJfY21kc19hZGRyc1swXSA9IDB4NTAwMDA7CisJbXNnLmRkcl9jbWRzX2FkZHJzWzFdID0g MHg1MDA1YzsKKwltc2cuZGRyX2NtZHNfYWRkcnNbMl0gPSAweDUwMDBjOworCisJbXNnLmRkcl9j bWRzX2RhdGFbMF1bMF0gPSAgMHg0MDAwMDAwMDsKKwltc2cuZGRyX2NtZHNfZGF0YVswXVsxXSA9 ICAweDQwMDAwMDAwOworCW1zZy5kZHJfY21kc19kYXRhWzBdWzJdID0gIDB4NDAwMDAwMDA7CisK KwkvKgorCSAqIFRoZXNlIGFyZSB0aGUgQ1ggKENOT0MpIHZvdGVzLiAgVGhpcyBpcyB1c2VkIGJ1 dCB0aGUgdmFsdWVzIGZvciB0aGUKKwkgKiBzZG04NDUgR01VIGFyZSBrbm93biBhbmQgZml4ZWQg c28gd2UgY2FuIGhhcmQgY29kZSB0aGVtLgorCSAqLworCisJbXNnLmNub2NfY21kc19udW0gPSAz OworCW1zZy5jbm9jX3dhaXRfYml0bWFzayA9IDB4MDU7CisKKwltc2cuY25vY19jbWRzX2FkZHJz WzBdID0gMHg1MDAzNDsKKwltc2cuY25vY19jbWRzX2FkZHJzWzFdID0gMHg1MDA3YzsKKwltc2cu Y25vY19jbWRzX2FkZHJzWzJdID0gMHg1MDA0YzsKKworCW1zZy5jbm9jX2NtZHNfZGF0YVswXVsw XSA9ICAweDQwMDAwMDAwOworCW1zZy5jbm9jX2NtZHNfZGF0YVswXVsxXSA9ICAweDAwMDAwMDAw OworCW1zZy5jbm9jX2NtZHNfZGF0YVswXVsyXSA9ICAweDQwMDAwMDAwOworCisJbXNnLmNub2Nf Y21kc19kYXRhWzFdWzBdID0gIDB4NjAwMDAwMDE7CisJbXNnLmNub2NfY21kc19kYXRhWzFdWzFd ID0gIDB4MjAwMDAwMDE7CisJbXNnLmNub2NfY21kc19kYXRhWzFdWzJdID0gIDB4NjAwMDAwMDE7 CisKKwlyZXR1cm4gYTZ4eF9oZmlfc2VuZF9tc2coZ211LCBIRklfSDJGX01TR19CV19UQUJMRSwg Jm1zZywgc2l6ZW9mKG1zZyksCisJCU5VTEwsIDApOworfQorCitzdGF0aWMgaW50IGE2eHhfaGZp X3NlbmRfdGVzdChzdHJ1Y3QgYTZ4eF9nbXUgKmdtdSkKK3sKKwlzdHJ1Y3QgYTZ4eF9oZmlfbXNn X3Rlc3QgbXNnID0geyAwIH07CisKKwlyZXR1cm4gYTZ4eF9oZmlfc2VuZF9tc2coZ211LCBIRklf SDJGX01TR19URVNULCAmbXNnLCBzaXplb2YobXNnKSwKKwkJTlVMTCwgMCk7Cit9CisKK2ludCBh Nnh4X2hmaV9zdGFydChzdHJ1Y3QgYTZ4eF9nbXUgKmdtdSwgaW50IGJvb3Rfc3RhdGUpCit7CisJ aW50IHJldDsKKworCXJldCA9IGE2eHhfaGZpX3NlbmRfZ211X2luaXQoZ211LCBib290X3N0YXRl KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gYTZ4eF9oZmlfZ2V0X2Z3X3Zl cnNpb24oZ211LCBOVUxMKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyoKKwkgKiBX ZSBoYXZlIHRvIGdldCBleGNoYW5nZSB2ZXJzaW9uIG51bWJlcnMgcGVyIHRoZSBzZXF1ZW5jZSBi dXQgYXQgdGhpcworCSAqIHBvaW50IHRoIGtlcm5lbCBkcml2ZXIgZG9lc24ndCBuZWVkIHRvIGtu b3cgdGhlIGV4YWN0IHZlcnNpb24gb2YKKwkgKiB0aGUgR01VIGZpcm13YXJlCisJICovCisKKwly ZXQgPSBhNnh4X2hmaV9zZW5kX3BlcmZfdGFibGUoZ211KTsKKwlpZiAocmV0KQorCQlyZXR1cm4g cmV0OworCisJcmV0ID0gYTZ4eF9oZmlfc2VuZF9id190YWJsZShnbXUpOworCWlmIChyZXQpCisJ CXJldHVybiByZXQ7CisKKwkvKgorCSAqIExldCB0aGUgR01VIGtub3cgdGhhdCB0aGVyZSB3b24n dCBiZSBhbnkgbW9yZSBIRkkgbWVzc2FnZXMgdW50aWwgbmV4dAorCSAqIGJvb3QKKwkgKi8KKwlh Nnh4X2hmaV9zZW5kX3Rlc3QoZ211KTsKKworCXJldHVybiAwOworfQorCit2b2lkIGE2eHhfaGZp X3N0b3Aoc3RydWN0IGE2eHhfZ211ICpnbXUpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBp IDwgQVJSQVlfU0laRShnbXUtPnF1ZXVlcyk7IGkrKykgeworCQlzdHJ1Y3QgYTZ4eF9oZmlfcXVl dWUgKnF1ZXVlID0gJmdtdS0+cXVldWVzW2ldOworCisJCWlmICghcXVldWUtPmhlYWRlcikKKwkJ CWNvbnRpbnVlOworCisJCWlmIChxdWV1ZS0+aGVhZGVyLT5yZWFkX2luZGV4ICE9IHF1ZXVlLT5o ZWFkZXItPndyaXRlX2luZGV4KQorCQkJZGV2X2VycihnbXUtPmRldiwgIkhGSSBxdWV1ZSAlZCBp cyBub3QgZW1wdHlcbiIsIGkpOworCisJCXF1ZXVlLT5oZWFkZXItPnJlYWRfaW5kZXggPSAwOwor CQlxdWV1ZS0+aGVhZGVyLT53cml0ZV9pbmRleCA9IDA7CisJfQorfQorCitzdGF0aWMgdm9pZCBh Nnh4X2hmaV9xdWV1ZV9pbml0KHN0cnVjdCBhNnh4X2hmaV9xdWV1ZSAqcXVldWUsCisJCXN0cnVj dCBhNnh4X2hmaV9xdWV1ZV9oZWFkZXIgKmhlYWRlciwgdm9pZCAqdmlydCwgdTY0IGlvdmEsCisJ CXUzMiBpZCkKK3sKKwlzcGluX2xvY2tfaW5pdCgmcXVldWUtPmxvY2spOworCXF1ZXVlLT5oZWFk ZXIgPSBoZWFkZXI7CisJcXVldWUtPmRhdGEgPSB2aXJ0OworCWF0b21pY19zZXQoJnF1ZXVlLT5z ZXFudW0sIDApOworCisJLyogU2V0IHVwIHRoZSBzaGFyZWQgbWVtb3J5IGhlYWRlciAqLworCWhl YWRlci0+aW92YSA9IGlvdmE7CisJaGVhZGVyLT50eXBlID0gIDEwIDw8IDggfCBpZDsKKwloZWFk ZXItPnN0YXR1cyA9IDE7CisJaGVhZGVyLT5zaXplID0gU1pfNEsgPj4gMjsKKwloZWFkZXItPm1z Z19zaXplID0gMDsKKwloZWFkZXItPmRyb3BwZWQgPSAwOworCWhlYWRlci0+cnhfd2F0ZXJtYXJr ID0gMTsKKwloZWFkZXItPnR4X3dhdGVybWFyayA9IDE7CisJaGVhZGVyLT5yeF9yZXF1ZXN0ID0g MTsKKwloZWFkZXItPnR4X3JlcXVlc3QgPSAwOworCWhlYWRlci0+cmVhZF9pbmRleCA9IDA7CisJ aGVhZGVyLT53cml0ZV9pbmRleCA9IDA7Cit9CisKK3ZvaWQgYTZ4eF9oZmlfaW5pdChzdHJ1Y3Qg YTZ4eF9nbXUgKmdtdSkKK3sKKwlzdHJ1Y3QgYTZ4eF9nbXVfYm8gKmhmaSA9IGdtdS0+aGZpOwor CXN0cnVjdCBhNnh4X2hmaV9xdWV1ZV90YWJsZV9oZWFkZXIgKnRhYmxlID0gaGZpLT52aXJ0Owor CXN0cnVjdCBhNnh4X2hmaV9xdWV1ZV9oZWFkZXIgKmhlYWRlcnMgPSBoZmktPnZpcnQgKyBzaXpl b2YoKnRhYmxlKTsKKwl1NjQgb2Zmc2V0OworCWludCB0YWJsZV9zaXplOworCisJLyoKKwkgKiBU aGUgdGFibGUgc2l6ZSBpcyB0aGUgc2l6ZSBvZiB0aGUgdGFibGUgaGVhZGVyIHBsdXMgYWxsIG9m IHRoZSBxdWV1ZQorCSAqIGhlYWRlcnMKKwkgKi8KKwl0YWJsZV9zaXplID0gc2l6ZW9mKCp0YWJs ZSk7CisJdGFibGVfc2l6ZSArPSAoQVJSQVlfU0laRShnbXUtPnF1ZXVlcykgKgorCQlzaXplb2Yo c3RydWN0IGE2eHhfaGZpX3F1ZXVlX2hlYWRlcikpOworCisJdGFibGUtPnZlcnNpb24gPSAwOwor CXRhYmxlLT5zaXplID0gdGFibGVfc2l6ZTsKKwkvKiBGaXJzdCBxdWV1ZSBoZWFkZXIgaXMgbG9j YXRlZCBpbW1lZGlhdGVseSBhZnRlciB0aGUgdGFibGUgaGVhZGVyICovCisJdGFibGUtPnFoZHIw X29mZnNldCA9IHNpemVvZigqdGFibGUpID4+IDI7CisJdGFibGUtPnFoZHJfc2l6ZSA9IHNpemVv ZihzdHJ1Y3QgYTZ4eF9oZmlfcXVldWVfaGVhZGVyKSA+PiAyOworCXRhYmxlLT5udW1fcXVldWVz ID0gQVJSQVlfU0laRShnbXUtPnF1ZXVlcyk7CisJdGFibGUtPmFjdGl2ZV9xdWV1ZXMgPSBBUlJB WV9TSVpFKGdtdS0+cXVldWVzKTsKKworCS8qIENvbW1hbmQgcXVldWUgKi8KKwlvZmZzZXQgPSBT Wl80SzsKKwlhNnh4X2hmaV9xdWV1ZV9pbml0KCZnbXUtPnF1ZXVlc1swXSwgJmhlYWRlcnNbMF0s IGhmaS0+dmlydCArIG9mZnNldCwKKwkJaGZpLT5pb3ZhICsgb2Zmc2V0LCAwKTsKKworCS8qIEdN VSByZXNwb25zZSBxdWV1ZSAqLworCW9mZnNldCArPSBTWl80SzsKKwlhNnh4X2hmaV9xdWV1ZV9p bml0KCZnbXUtPnF1ZXVlc1sxXSwgJmhlYWRlcnNbMV0sIGhmaS0+dmlydCArIG9mZnNldCwKKwkJ aGZpLT5pb3ZhICsgb2Zmc2V0LCA0KTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9t c20vYWRyZW5vL2E2eHhfaGZpLmggYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2FkcmVuby9hNnh4X2hm aS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmMDdhNGQKLS0tIC9kZXYv bnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2FkcmVuby9hNnh4X2hmaS5oCkBAIC0wLDAg KzEsMTM3IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFs bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7 IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0 ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICog b25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRp b24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQg aXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQg ZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5F U1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVi bGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2lmbmRlZiBfQTZYWF9I RklfSF8KKyNkZWZpbmUgX0E2WFhfSEZJX0hfCisKK3N0cnVjdCBhNnh4X2hmaV9xdWV1ZV90YWJs ZV9oZWFkZXIgeworCXUzMiB2ZXJzaW9uOworCXUzMiBzaXplOwkJLyogU2l6ZSBvZiB0aGUgcXVl dWUgdGFibGUgaW4gZHdvcmRzICovCisJdTMyIHFoZHIwX29mZnNldDsJLyogT2Zmc2V0IG9mIHRo ZSBmaXJzdCBxdWV1ZSBoZWFkZXIgKi8KKwl1MzIgcWhkcl9zaXplOwkJLyogU2l6ZSBvZiB0aGUg cXVldWUgaGVhZGVycyAqLworCXUzMiBudW1fcXVldWVzOwkJLyogTnVtYmVyIG9mIHRvdGFsIHF1 ZXVlcyAqLworCXUzMiBhY3RpdmVfcXVldWVzOwkvKiBOdW1iZXIgb2YgYWN0aXZlIHF1ZXVlcyAq LworfTsKKworc3RydWN0IGE2eHhfaGZpX3F1ZXVlX2hlYWRlciB7CisJdTMyIHN0YXR1czsKKwl1 MzIgaW92YTsKKwl1MzIgdHlwZTsKKwl1MzIgc2l6ZTsKKwl1MzIgbXNnX3NpemU7CisJdTMyIGRy b3BwZWQ7CisJdTMyIHJ4X3dhdGVybWFyazsKKwl1MzIgdHhfd2F0ZXJtYXJrOworCXUzMiByeF9y ZXF1ZXN0OworCXUzMiB0eF9yZXF1ZXN0OworCXUzMiByZWFkX2luZGV4OworCXUzMiB3cml0ZV9p bmRleDsKK307CisKK3N0cnVjdCBhNnh4X2hmaV9xdWV1ZSB7CisJc3RydWN0IGE2eHhfaGZpX3F1 ZXVlX2hlYWRlciAqaGVhZGVyOworCXNwaW5sb2NrX3QgbG9jazsKKwl1MzIgKmRhdGE7CisJYXRv bWljX3Qgc2VxbnVtOworfTsKKworLyogVGhpcyBpcyB0aGUgb3V0Z29pbmcgcXVldWUgdG8gdGhl IEdNVSAqLworI2RlZmluZSBIRklfQ09NTUFORF9RVUVVRSAwCisKKy8qIFRIaXMgaXMgdGhlIGlu Y29taW5nIHJlc3BvbnNlIHF1ZXVlIGZyb20gdGhlIEdNVSAqLworI2RlZmluZSBIRklfUkVTUE9O U0VfUVVFVUUgMQorCisjZGVmaW5lIEhGSV9IRUFERVJfSUQobXNnKSAoKG1zZykgJiAweGZmKQor I2RlZmluZSBIRklfSEVBREVSX1NJWkUobXNnKSAoKChtc2cpID4+IDgpICYgMHhmZikKKyNkZWZp bmUgSEZJX0hFQURFUl9TRVFOVU0obXNnKSAoKChtc2cpID4+IDIwKSAmIDB4ZmZmKQorCisvKiBG SVhNRTogRG8gd2UgbmVlZCB0aGlzIG9yIGNhbiB3ZSB1c2UgQVJSQVlfU0laRT8gKi8KKyNkZWZp bmUgSEZJX1JFU1BPTlNFX1BBWUxPQURfU0laRSAxNgorCisvKiBIRkkgbWVzc2FnZSB0eXBlcyAq LworCisjZGVmaW5lIEhGSV9NU0dfQ01EIDAKKyNkZWZpbmUgSEZJX01TR19BQ0sgMgorCisjZGVm aW5lIEhGSV9GMkhfTVNHX0FDSyAxMjYKKworc3RydWN0IGE2eHhfaGZpX21zZ19yZXNwb25zZSB7 CisJdTMyIGhlYWRlcjsKKwl1MzIgcmV0X2hlYWRlcjsKKwl1MzIgZXJyb3I7CisJdTMyIHBheWxv YWRbSEZJX1JFU1BPTlNFX1BBWUxPQURfU0laRV07Cit9OworCisjZGVmaW5lIEhGSV9GMkhfTVNH X0VSUk9SIDEwMAorCitzdHJ1Y3QgYTZ4eF9oZmlfbXNnX2Vycm9yIHsKKwl1MzIgaGVhZGVyOwor CXUzMiBjb2RlOworCXUzMiBwYXlsb2FkWzJdOworfTsKKworI2RlZmluZSBIRklfSDJGX01TR19J TklUIDAKKworc3RydWN0IGE2eHhfaGZpX21zZ19nbXVfaW5pdF9jbWQgeworCXUzMiBoZWFkZXI7 CisJdTMyIHNlZ19pZDsKKwl1MzIgZGJnX2J1ZmZlcl9hZGRyOworCXUzMiBkYmdfYnVmZmVyX3Np emU7CisJdTMyIGJvb3Rfc3RhdGU7Cit9OworCisjZGVmaW5lIEhGSV9IMkZfTVNHX0ZXX1ZFUlNJ T04gMQorCitzdHJ1Y3QgYTZ4eF9oZmlfbXNnX2Z3X3ZlcnNpb24geworCXUzMiBoZWFkZXI7CisJ dTMyIHN1cHBvcnRlZF92ZXJzaW9uOworfTsKKworI2RlZmluZSBIRklfSDJGX01TR19QRVJGX1RB QkxFIDQKKworc3RydWN0IHBlcmZfbGV2ZWwgeworCXUzMiB2b3RlOworCXUzMiBmcmVxOworfTsK Kworc3RydWN0IGE2eHhfaGZpX21zZ19wZXJmX3RhYmxlIHsKKwl1MzIgaGVhZGVyOworCXUzMiBu dW1fZ3B1X2xldmVsczsKKwl1MzIgbnVtX2dtdV9sZXZlbHM7CisKKwlzdHJ1Y3QgcGVyZl9sZXZl bCBneF92b3Rlc1sxNl07CisJc3RydWN0IHBlcmZfbGV2ZWwgY3hfdm90ZXNbNF07Cit9OworCisj ZGVmaW5lIEhGSV9IMkZfTVNHX0JXX1RBQkxFIDMKKworc3RydWN0IGE2eHhfaGZpX21zZ19id190 YWJsZSB7CisJdTMyIGhlYWRlcjsKKwl1MzIgYndfbGV2ZWxfbnVtOworCXUzMiBjbm9jX2NtZHNf bnVtOworCXUzMiBkZHJfY21kc19udW07CisJdTMyIGNub2Nfd2FpdF9iaXRtYXNrOworCXUzMiBk ZHJfd2FpdF9iaXRtYXNrOworCXUzMiBjbm9jX2NtZHNfYWRkcnNbNl07CisJdTMyIGNub2NfY21k c19kYXRhWzJdWzZdOworCXUzMiBkZHJfY21kc19hZGRyc1s4XTsKKwl1MzIgZGRyX2NtZHNfZGF0 YVsxNl1bOF07Cit9OworCisjZGVmaW5lIEhGSV9IMkZfTVNHX1RFU1QgNQorCitzdHJ1Y3QgYTZ4 eF9oZmlfbXNnX3Rlc3QgeworCXUzMiBoZWFkZXI7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBh L2RyaXZlcnMvZ3B1L2RybS9tc20vYWRyZW5vL2FkcmVub19kZXZpY2UuYyBiL2RyaXZlcnMvZ3B1 L2RybS9tc20vYWRyZW5vL2FkcmVub19kZXZpY2UuYwppbmRleCAxYTAxMDBkMC4uMTA3ZGQ0ZCAx MDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL21zbS9hZHJlbm8vYWRyZW5vX2RldmljZS5jCisr KyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vYWRyZW5vL2FkcmVub19kZXZpY2UuYwpAQCAtODYsNiAr ODYsMTUgQEAKIAkJLmluaXQgPSBhNXh4X2dwdV9pbml0LAogCQkucG93ZXJmdyA9ICJhNTMwdjNf Z3BtdS5mdzIiLAogCQkuemFwZncgPSAiYTUzMF96YXAubWR0IiwKKwl9LCB7CisJCS5yZXYgPSBB RFJFTk9fUkVWKDYsIDMsIDAsIEFOWV9JRCksCisJCS5yZXZuID0gNjMwLAorCQkubmFtZSA9ICJB NjMwIiwKKwkJLnBtNGZ3ID0gImE2MzBfc3FlLmZ3IiwKKwkJLnBmcGZ3ID0gTlVMTCwKKwkJLnBv d2VyZncgPSAiYTYzMF9nbXUuYmluIiwKKwkJLmdtZW0gPSBTWl8xTSwKKwkJLmluaXQgPSBhNnh4 X2dwdV9pbml0LAogCX0sCiB9OwogCkBAIC0xMDIsNiArMTExLDggQEAKIE1PRFVMRV9GSVJNV0FS RSgicWNvbS9hNTMwX3phcC5iMDAiKTsKIE1PRFVMRV9GSVJNV0FSRSgicWNvbS9hNTMwX3phcC5i MDEiKTsKIE1PRFVMRV9GSVJNV0FSRSgicWNvbS9hNTMwX3phcC5iMDIiKTsKK01PRFVMRV9GSVJN V0FSRSgicWNvbS9hNjMwX3NxZS5mdyIpOworTU9EVUxFX0ZJUk1XQVJFKCJxY29tL2E2MzBfZ211 LmJpbiIpOwogCiBzdGF0aWMgaW5saW5lIGJvb2wgX3Jldl9tYXRjaCh1aW50OF90IGVudHJ5LCB1 aW50OF90IGlkKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9hZHJlbm8vYWRy ZW5vX2dwdS5oIGIvZHJpdmVycy9ncHUvZHJtL21zbS9hZHJlbm8vYWRyZW5vX2dwdS5oCmluZGV4 IGY2M2E1NzguLjEyMzkyNTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tc20vYWRyZW5v L2FkcmVub19ncHUuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2FkcmVuby9hZHJlbm9fZ3B1 LmgKQEAgLTE0Miw3ICsxNDIsNiBAQCBzdHJ1Y3QgYWRyZW5vX3BsYXRmb3JtX2NvbmZpZyB7CiAJ X19yZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogfSkK IAotCiBzdGF0aWMgaW5saW5lIGJvb2wgYWRyZW5vX2lzX2EzeHgoc3RydWN0IGFkcmVub19ncHUg KmdwdSkKIHsKIAlyZXR1cm4gKGdwdS0+cmV2biA+PSAzMDApICYmIChncHUtPnJldm4gPCA0MDAp OwpAQCAtMzE5LDYgKzMxOCw3IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBhZHJlbm9fZ3B1X3dyaXRl KHN0cnVjdCBhZHJlbm9fZ3B1ICpncHUsCiBzdHJ1Y3QgbXNtX2dwdSAqYTN4eF9ncHVfaW5pdChz dHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIHN0cnVjdCBtc21fZ3B1ICphNHh4X2dwdV9pbml0KHN0 cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogc3RydWN0IG1zbV9ncHUgKmE1eHhfZ3B1X2luaXQoc3Ry dWN0IGRybV9kZXZpY2UgKmRldik7CitzdHJ1Y3QgbXNtX2dwdSAqYTZ4eF9ncHVfaW5pdChzdHJ1 Y3QgZHJtX2RldmljZSAqZGV2KTsKIAogc3RhdGljIGlubGluZSB2b2lkIGFkcmVub19ncHVfd3Jp dGU2NChzdHJ1Y3QgYWRyZW5vX2dwdSAqZ3B1LAogCQllbnVtIGFkcmVub19yZWdzIGxvLCBlbnVt IGFkcmVub19yZWdzIGhpLCB1NjQgZGF0YSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9t c20vbXNtX2dwdS5jIGIvZHJpdmVycy9ncHUvZHJtL21zbS9tc21fZ3B1LmMKaW5kZXggMmE4MGVm ZC4uZWRkOTI5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL21zbS9tc21fZ3B1LmMKKysr IGIvZHJpdmVycy9ncHUvZHJtL21zbS9tc21fZ3B1LmMKQEAgLTg3LDcgKzg3LDcgQEAgc3RhdGlj IGludCBtc21fZGV2ZnJlcV9nZXRfY3VyX2ZyZXEoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25l ZCBsb25nICpmcmVxKQogc3RhdGljIHZvaWQgbXNtX2RldmZyZXFfaW5pdChzdHJ1Y3QgbXNtX2dw dSAqZ3B1KQogewogCS8qIFdlIG5lZWQgdGFyZ2V0IHN1cHBvcnQgdG8gZG8gZGV2ZnJlcSAqLwot CWlmICghZ3B1LT5mdW5jcy0+Z3B1X2J1c3kpCisJaWYgKCFncHUtPmZ1bmNzLT5ncHVfYnVzeSB8 fCAhZ3B1LT5jb3JlX2NsaykKIAkJcmV0dXJuOwogCiAJbXNtX2RldmZyZXFfcHJvZmlsZS5pbml0 aWFsX2ZyZXEgPSBncHUtPmZhc3RfcmF0ZTsKLS0gCjEuOS4xCgpfX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fXwpkcmktZGV2ZWwgbWFpbGluZyBsaXN0CmRyaS1k ZXZlbEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcv bWFpbG1hbi9saXN0aW5mby9kcmktZGV2ZWwK