From mboxrd@z Thu Jan 1 00:00:00 1970 From: =?UTF-8?q?Noralf=20Tr=C3=B8nnes?= Subject: [RFC v4 25/25] drm/client: Hack: Add DRM VT console client Date: Sat, 14 Apr 2018 13:53:18 +0200 Message-ID: <20180414115318.14500-26-noralf@tronnes.org> References: <20180414115318.14500-1-noralf@tronnes.org> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <20180414115318.14500-1-noralf@tronnes.org> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: dri-devel@lists.freedesktop.org Cc: intel-gfx@lists.freedesktop.org List-Id: dri-devel@lists.freedesktop.org QSBoYWNrIHRvIHRlc3QgdGhlIGNsaWVudCBBUEkuCgpTaWduZWQtb2ZmLWJ5OiBOb3JhbGYgVHLD uG5uZXMgPG5vcmFsZkB0cm9ubmVzLm9yZz4KLS0tCiBkcml2ZXJzL2dwdS9kcm0vTWFrZWZpbGUg ICAgICAgICAgIHwgICAxICsKIGRyaXZlcnMvZ3B1L2RybS9jbGllbnQvS2NvbmZpZyAgICAgfCAg IDUgKwogZHJpdmVycy9ncHUvZHJtL2NsaWVudC9NYWtlZmlsZSAgICB8ICAgMyArCiBkcml2ZXJz L2dwdS9kcm0vY2xpZW50L2RybV92dGNvbi5jIHwgNzg1ICsrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysKIDQgZmlsZXMgY2hhbmdlZCwgNzk0IGluc2VydGlvbnMoKykKIGNyZWF0 ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dwdS9kcm0vY2xpZW50L01ha2VmaWxlCiBjcmVhdGUgbW9k ZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL2NsaWVudC9kcm1fdnRjb24uYwoKZGlmZiAtLWdpdCBh L2RyaXZlcnMvZ3B1L2RybS9NYWtlZmlsZSBiL2RyaXZlcnMvZ3B1L2RybS9NYWtlZmlsZQppbmRl eCAzODg1MjcwOTNmODAuLmVhNjNlYjllOTNlYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJt L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9NYWtlZmlsZQpAQCAtNDcsNiArNDcsNyBA QCBvYmotJChDT05GSUdfRFJNX0tNU19IRUxQRVIpICs9IGRybV9rbXNfaGVscGVyLm8KIG9iai0k KENPTkZJR19EUk1fREVCVUdfTU1fU0VMRlRFU1QpICs9IHNlbGZ0ZXN0cy8KIAogb2JqLSQoQ09O RklHX0RSTSkJKz0gZHJtLm8KK29iai15CQkJKz0gY2xpZW50Lwogb2JqLSQoQ09ORklHX0RSTV9N SVBJX0RTSSkgKz0gZHJtX21pcGlfZHNpLm8KIG9iai0kKENPTkZJR19EUk1fUEFORUxfT1JJRU5U QVRJT05fUVVJUktTKSArPSBkcm1fcGFuZWxfb3JpZW50YXRpb25fcXVpcmtzLm8KIG9iai0kKENP TkZJR19EUk1fQVJNKQkrPSBhcm0vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vY2xpZW50 L0tjb25maWcgYi9kcml2ZXJzL2dwdS9kcm0vY2xpZW50L0tjb25maWcKaW5kZXggNmIwMWYyZTUx ZmIzLi5iMDNmM2JhZjhiM2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9jbGllbnQvS2Nv bmZpZworKysgYi9kcml2ZXJzL2dwdS9kcm0vY2xpZW50L0tjb25maWcKQEAgLTYsNCArNiw5IEBA IGNvbmZpZyBEUk1fQ0xJRU5UX0JPT1RTUExBU0gKIAloZWxwCiAJICBEUk0gQm9vdHNwbGFzaAog Citjb25maWcgRFJNX0NMSUVOVF9WVENPTgorCXRyaXN0YXRlICJEUk0gVlQgY29uc29sZSIKKwlo ZWxwCisJICBEUk0gVlQgY29uc29sZQorCiBlbmRtZW51CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dw dS9kcm0vY2xpZW50L01ha2VmaWxlIGIvZHJpdmVycy9ncHUvZHJtL2NsaWVudC9NYWtlZmlsZQpu ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAuLjdkMzlmMWJjMmI2OAotLS0g L2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9jbGllbnQvTWFrZWZpbGUKQEAgLTAsMCAr MSwzIEBACisjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCisKK29iai0kKENPTkZJ R19EUk1fQ0xJRU5UX1ZUQ09OKSArPSBkcm1fdnRjb24ubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9n cHUvZHJtL2NsaWVudC9kcm1fdnRjb24uYyBiL2RyaXZlcnMvZ3B1L2RybS9jbGllbnQvZHJtX3Z0 Y29uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwLi45MTBiNGVjMWE2 ODYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vY2xpZW50L2RybV92dGNvbi5j CkBAIC0wLDAgKzEsNzg1IEBACisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAor Ly8gQ29weXJpZ2h0IDIwMTggTm9yYWxmIFRyw7hubmVzCisKKyNpbmNsdWRlIDxsaW51eC9jb25z b2xlLmg+CisjaW5jbHVkZSA8bGludXgvZm9udC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5o PgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Cisj aW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3Z0X2J1ZmZlci5oPgorI2lu Y2x1ZGUgPGxpbnV4L3Z0X2tlcm4uaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKwor I2luY2x1ZGUgPGRybS9kcm1fY2xpZW50Lmg+CisjaW5jbHVkZSA8ZHJtL2RybV9kcnYuaD4KKyNp bmNsdWRlIDxkcm0vZHJtX2ZvdXJjYy5oPgorI2luY2x1ZGUgPGRybS9kcm1fbW9kZXMuaD4KKyNp bmNsdWRlIDxkcm0vZHJtX3ByaW50Lmg+CisKKy8qIFRPRE86IFNjcm9sbGluZyAqLworCisvKgor ICogVGhlIGNvZGUgY29uc2lzdHMgb2YgMyBwYXJ0czoKKyAqCisgKiAxLiBUaGUgRFJNIGNsaWVu dAorICogICAgR2V0cyBhIGRpc3BsYXksIHVzZXMgdGhlIGZpcnN0IG1vZGUgdG8gZmluZCBhIGZv bnQsCisgKiAgICBzZXRzIHRoZSBtYXggY29scy9yb3dzIGFuZCBhIG1hdGNoaW5nIHRleHQgYnVm ZmVyLgorICoKKyAqIDIuIFRoZSBWVCBjb25zb2xlCisgKiAgICBXcml0ZXMgdG8gdGhlIHRleHQg YnVmZmVyIHdoaWNoIGNvbnNpc3RzIG9mIENHQSBjb2xvcmVkIGNoYXJhY3RlcnMuCisgKiAgICBT Y2hlZHVsZXMgdGhlIHdvcmtlciB3aGVuIGl0IG5lZWRzIHJlbmRlcmluZyBvciBibGFua2luZy4K KyAqCisgKiAzLiBXb3JrZXIKKyAqICAgIERvZXMgbW9kZXNldHRpbmcsIGJsYW5raW5nIGFuZCBy ZW5kZXJpbmcuCisgKiAgICBJdCB0YWtlcyBhIHNuYXBzaG90IG9mIHRoZSBWVCB0ZXh0IGJ1ZmZl ciBhbmQgcmVuZGVycyB0aGUgY2hhbmdlcyBzaW5jZQorICogICAgbGFzdC4KKyAqLworCitzdHJ1 Y3QgZHJtX3Z0Y29uX3ZjIHsKKwlzdHJ1Y3QgbXV0ZXggbG9jazsKKworCXUxNiAqdGV4dF9idWY7 CisJc2l6ZV90IGJ1Zl9sZW47CisKKwl1bnNpZ25lZCBpbnQgcm93czsKKwl1bnNpZ25lZCBpbnQg Y29sczsKKwl1bnNpZ25lZCBpbnQgbWF4X3Jvd3M7CisJdW5zaWduZWQgaW50IG1heF9jb2xzOwor CWNvbnN0IHN0cnVjdCBmb250X2Rlc2MgKmZvbnQ7CisJYm9vbCBibGFuazsKKwl1bnNpZ25lZCBs b25nIGN1cnNvcl9ibGlua19qaWZmaWVzOworfTsKKworc3RhdGljIHN0cnVjdCBkcm1fdnRjb25f dmMgKmRybV92dGNvbl92YzsKKworc3RydWN0IGRybV92dGNvbiB7CisJc3RydWN0IGRybV9jbGll bnRfZGV2ICpjbGllbnQ7CisJc3RydWN0IGRybV9jbGllbnRfZGlzcGxheSAqZGlzcGxheTsKKwlz dHJ1Y3QgZHJtX2NsaWVudF9idWZmZXIgKmJ1ZmZlcjsKKworCXVuc2lnbmVkIGludCByb3dzOwor CXVuc2lnbmVkIGludCBjb2xzOworCisJdTE2ICp0ZXh0X2J1ZlsyXTsKKwlzaXplX3QgYnVmX2xl bjsKKwl1bnNpZ25lZCBpbnQgYnVmX2lkeDsKKwlib29sIGJsYW5rOworfTsKKworc3RhdGljIHN0 cnVjdCBkcm1fdnRjb24gKnZ0Y29uX2luc3RhbmNlOworCitzdGF0aWMgaW50IGRybV92dGNvbl9k ZXZfaWQ7Cittb2R1bGVfcGFyYW1fbmFtZWQoZGV2LCBkcm1fdnRjb25fZGV2X2lkLCBpbnQsIDA2 MDApOworTU9EVUxFX1BBUk1fREVTQyhkcm1fdnRjb25fZGV2X2lkLCAiRFJNIGRldmljZSBpZCBb ZGVmYXVsdD0wXSIpOworCisjZGVmaW5lIGRybV92dGNvbl9kZWJ1Zyh2YywgZm10LCAuLi4pIFwK Kwlwcl9kZWJ1ZygiJXNbJXVdOiAiIGZtdCwgX19mdW5jX18sIHZjLT52Y19udW0sICMjX19WQV9B UkdTX18pCisKKy8qIENHQSBjb2xvciBwYWxldHRlOiA0LWJpdCBSR0JJOiBpbnRlbnNlIHJlZCBn cmVlbiBibHVlICovCitzdGF0aWMgY29uc3QgdTMyIGRybV92dGNvbl9wYWxldHRlWDg4OFsxNl0g PSB7CisJMHgwMDAwMDAwMCwgLyogIDAgYmxhY2sgKi8KKwkweDAwMDAwMGFhLCAvKiAgMSBibHVl ICovCisJMHgwMDAwYWEwMCwgLyogIDIgZ3JlZW4gKi8KKwkweDAwMDBhYWFhLCAvKiAgMyBjeWFu ICovCisJMHgwMGFhMDAwMCwgLyogIDQgcmVkICovCisJMHgwMGFhMDBhYSwgLyogIDUgbWFnZW50 YSAqLworCTB4MDBhYTU1MDAsIC8qICA2IGJyb3duICovCisJMHgwMGFhYWFhYSwgLyogIDcgbGln aHQgZ3JheSAqLworCTB4MDA1NTU1NTUsIC8qICA4IGRhcmsgZ3JheSAqLworCTB4MDA1NTU1ZmYs IC8qICA5IGJyaWdodCBibHVlICovCisJMHgwMDU1ZmY1NSwgLyogMTAgYnJpZ2h0IGdyZWVuICov CisJMHgwMDU1ZmZmZiwgLyogMTEgYnJpZ2h0IGN5YW4gKi8KKwkweDAwZmY1NTU1LCAvKiAxMiBi cmlnaHQgcmVkICovCisJMHgwMGZmNTVmZiwgLyogMTMgYnJpZ2h0IG1hZ2VudGEgKi8KKwkweDAw ZmZmZjU1LCAvKiAxNCB5ZWxsb3cgKi8KKwkweDAwZmZmZmZmICAvKiAxNSB3aGl0ZSAqLworfTsK Kworc3RhdGljIHZvaWQKK2RybV92dGNvbl9yZW5kZXJfY2hhcihzdHJ1Y3QgZHJtX3Z0Y29uICp2 dGNvbiwgdW5zaWduZWQgaW50IHgsIHVuc2lnbmVkIGludCB5LAorCQkgICAgICB1MTYgY2MsIGNv bnN0IHN0cnVjdCBmb250X2Rlc2MgKmZvbnQpCit7CisJc3RydWN0IGRybV9jbGllbnRfYnVmZmVy ICpidWZmZXIgPSB2dGNvbi0+YnVmZmVyOworCXVuc2lnbmVkIGludCBoLCB3OworCWNvbnN0IHU4 ICpzcmM7CisJdm9pZCAqZHN0OworCXUzMiAqcGl4OworCXUzMiBmZ19jb2wgPSBkcm1fdnRjb25f cGFsZXR0ZVg4ODhbKGNjICYgMHgwZjAwKSA+PiA4XTsKKwl1MzIgYmdfY29sID0gZHJtX3Z0Y29u X3BhbGV0dGVYODg4W2NjID4+IDEyXTsKKworCXNyYyA9IGZvbnQtPmRhdGEgKyAoY2MgJiAweGZm KSAqIGZvbnQtPmhlaWdodDsKKwlkc3QgPSB2dGNvbi0+YnVmZmVyLT52YWRkciArIHkgKiBidWZm ZXItPnBpdGNoICsgeCAqIHNpemVvZih1MzIpOworCisJZm9yIChoID0gMDsgaCA8IGZvbnQtPmhl aWdodDsgaCsrKSB7CisJCXU4IGZvbnRsaW5lID0gKihzcmMgKyBoKTsKKworCQlwaXggPSBkc3Q7 CisJCWZvciAodyA9IDA7IHcgPCBmb250LT53aWR0aDsgdysrKQorCQkJcGl4W3ddID0gZm9udGxp bmUgJiBCSVQoNyAtIHcpID8gZmdfY29sIDogYmdfY29sOworCQlkc3QgKz0gYnVmZmVyLT5waXRj aDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZHJtX3Z0Y29uX21vZGVzZXQoc3RydWN0IGRybV92dGNv biAqdnRjb24sIHVuc2lnbmVkIGludCBjb2xzLAorCQkJICAgICB1bnNpZ25lZCBpbnQgcm93cywg Y29uc3Qgc3RydWN0IGZvbnRfZGVzYyAqZm9udCkKK3sKKwlzdHJ1Y3QgZHJtX2NsaWVudF9kaXNw bGF5ICpkaXNwbGF5ID0gdnRjb24tPmRpc3BsYXk7CisJc3RydWN0IGRybV9jbGllbnRfZGV2ICpj bGllbnQgPSB2dGNvbi0+Y2xpZW50OworCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlLCAq YmVzdF9tb2RlID0gTlVMTDsKKwl1bnNpZ25lZCBpbnQgYmVzdF9jb2xzID0gfjAsIGJlc3Rfcm93 cyA9IH4wOworCXN0cnVjdCBkcm1fY2xpZW50X2J1ZmZlciAqYnVmZmVyOworCWludCByZXQ7CisK KwlEUk1fREVWX0lORk8oY2xpZW50LT5kZXYtPmRldiwgIklOICV1eCV1XG4iLCBjb2xzLCByb3dz KTsKKworCS8qIEZpbmQgdGhlIHNtYWxsZXN0IG1vZGUgdGhhdCBmaXRzICovCisJZHJtX2NsaWVu dF9kaXNwbGF5X2Zvcl9lYWNoX21vZGUobW9kZSwgZGlzcGxheSkgeworCQl1bnNpZ25lZCBpbnQg bW9kZV9jb2xzID0gbW9kZS0+aGRpc3BsYXkgLyBmb250LT53aWR0aDsKKwkJdW5zaWduZWQgaW50 IG1vZGVfcm93cyA9IG1vZGUtPnZkaXNwbGF5IC8gZm9udC0+aGVpZ2h0OworCisJCURSTV9ERVZf SU5GTyhjbGllbnQtPmRldi0+ZGV2LAorCQkJICAgICAidHJ5OiAldXgldVxuIiwgbW9kZV9jb2xz LCBtb2RlX3Jvd3MpOworCisJCWlmIChtb2RlX2NvbHMgPCBjb2xzIHx8IG1vZGVfcm93cyA8IHJv d3MpCisJCQlicmVhazsKKworCQlpZiAobW9kZV9jb2xzID49IGJlc3RfY29scyB8fCBtb2RlX3Jv d3MgPj0gYmVzdF9yb3dzKQorCQkJY29udGludWU7CisKKwkJYmVzdF9jb2xzID0gbW9kZV9jb2xz OworCQliZXN0X3Jvd3MgPSBtb2RlX3Jvd3M7CisJCWJlc3RfbW9kZSA9IG1vZGU7CisJfQorCisJ aWYgKCFiZXN0X21vZGUpIHsKKwkJRFJNX0RFVl9JTkZPKGNsaWVudC0+ZGV2LT5kZXYsICJDb3Vs ZG4ndCBmaW5kIG1vZGUgZm9yICV1eCV1XG4iLCBjb2xzLCByb3dzKTsKKwkJcmV0dXJuIC1FSU5W QUw7CisJfQorCisJRFJNX0RFVl9JTkZPKGNsaWVudC0+ZGV2LT5kZXYsICJDaG9zZW46ICV1eCV1 XG4iLCBiZXN0X2NvbHMsIGJlc3Rfcm93cyk7CisKKwlidWZmZXIgPSBkcm1fY2xpZW50X2ZyYW1l YnVmZmVyX2NyZWF0ZShjbGllbnQsIGJlc3RfbW9kZSwgRFJNX0ZPUk1BVF9YUkdCODg4OCk7CisJ aWYgKElTX0VSUihidWZmZXIpKSB7CisJCXJldCA9IFBUUl9FUlIoYnVmZmVyKTsKKwkJRFJNX0RF Vl9FUlJPUihjbGllbnQtPmRldi0+ZGV2LAorCQkJICAgICAgIkZhaWxlZCB0byBjcmVhdGUgZnJh bWVidWZmZXI6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IGRybV9j bGllbnRfZGlzcGxheV9jb21taXQoZGlzcGxheSwgYnVmZmVyLT5mYiwgYmVzdF9tb2RlKTsKKwlp ZiAocmV0KSB7CisJCURSTV9ERVZfRVJST1IoY2xpZW50LT5kZXYtPmRldiwKKwkJCSAgICAgICJG YWlsZWQgdG8gY29tbWl0IG1vZGU6ICVkXG4iLCByZXQpOworCQlnb3RvIGVycl9mcmVlX2J1ZmZl cjsKKwl9CisKKwlkcm1fY2xpZW50X2ZyYW1lYnVmZmVyX2RlbGV0ZSh2dGNvbi0+YnVmZmVyKTsK KworCXZ0Y29uLT5idWZmZXIgPSBidWZmZXI7CisJdnRjb24tPmNvbHMgPSBjb2xzOworCXZ0Y29u LT5yb3dzID0gcm93czsKKworCURSTV9ERVZfSU5GTyhjbGllbnQtPmRldi0+ZGV2LCAiT1VUXG4i KTsKKworCXJldHVybiAwOworCitlcnJfZnJlZV9idWZmZXI6CisJZHJtX2NsaWVudF9mcmFtZWJ1 ZmZlcl9kZWxldGUoYnVmZmVyKTsKKworCURSTV9ERVZfSU5GTyhjbGllbnQtPmRldi0+ZGV2LCAi T1VUIHJldD0lZFxuIiwgcmV0KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGRy bV92dGNvbl9ibGFuayhzdHJ1Y3QgZHJtX3Z0Y29uICp2dGNvbiwgYm9vbCBibGFuaykKK3sKKwlp bnQgbW9kZSA9IGJsYW5rID8gRFJNX01PREVfRFBNU19PRkYgOiBEUk1fTU9ERV9EUE1TX09OOwor CisJZHJtX2NsaWVudF9kaXNwbGF5X2RwbXModnRjb24tPmRpc3BsYXksIG1vZGUpOworCXZ0Y29u LT5ibGFuayA9IGJsYW5rOworfQorCitzdGF0aWMgaW50IGRybV92dGNvbl9yZXNpemVfYnVmKHN0 cnVjdCBkcm1fdnRjb24gKnZ0Y29uLCBzaXplX3QgbGVuKQoreworCXUxNiAqdGV4dF9idWZbMl07 CisKKwl0ZXh0X2J1ZlswXSA9IGt6YWxsb2MobGVuLCBHRlBfS0VSTkVMKTsKKwl0ZXh0X2J1Zlsx XSA9IGt6YWxsb2MobGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXRleHRfYnVmWzBdIHx8ICF0ZXh0 X2J1ZlsxXSkgeworCQlrZnJlZSh0ZXh0X2J1ZlswXSk7CisJCWtmcmVlKHRleHRfYnVmWzFdKTsK KwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJa2ZyZWUodnRjb24tPnRleHRfYnVmWzBdKTsKKwlr ZnJlZSh2dGNvbi0+dGV4dF9idWZbMV0pOworCisJdnRjb24tPnRleHRfYnVmWzBdID0gdGV4dF9i dWZbMF07CisJdnRjb24tPnRleHRfYnVmWzFdID0gdGV4dF9idWZbMV07CisJdnRjb24tPmJ1Zl9s ZW4gPSBsZW47CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZHJtX3Z0Y29uX3dvcmtf Zm4oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBkcm1fdnRjb24gKnZ0Y29u ID0gdnRjb25faW5zdGFuY2U7CisJdW5zaWduZWQgaW50IHZjX2NvbHMsIHZjX3Jvd3MsIGNvbCwg cm93LCB4LCB5OworCWNvbnN0IHN0cnVjdCBmb250X2Rlc2MgKmZvbnQ7CisJdTE2IHByZXYsIGN1 cnI7CisJYm9vbCBibGFuaywgcmVuZGVyX2FsbCA9IGZhbHNlOworCXN0cnVjdCBkcm1fY2xpcF9y ZWN0IGNsaXAgPSB7CisJCS54MSA9IH4wLAorCQkueTEgPSB+MCwKKwkJLngyID0gMCwKKwkJLnky ID0gMCwKKwl9OworCWNoYXIgKnN0cjsKKwlpbnQgcmV0OworCisJaWYgKCF2dGNvbi0+ZGlzcGxh eSkKKwkJcmV0dXJuOworCisJbXV0ZXhfbG9jaygmZHJtX3Z0Y29uX3ZjLT5sb2NrKTsKKworCXZj X2NvbHMgPSBkcm1fdnRjb25fdmMtPmNvbHM7CisJdmNfcm93cyA9IGRybV92dGNvbl92Yy0+cm93 czsKKwlmb250ID0gZHJtX3Z0Y29uX3ZjLT5mb250OworCWJsYW5rID0gZHJtX3Z0Y29uX3ZjLT5i bGFuazsKKworCWlmICh2dGNvbi0+YnVmX2xlbiAhPSBkcm1fdnRjb25fdmMtPmJ1Zl9sZW4pIHsK KwkJcmV0ID0gZHJtX3Z0Y29uX3Jlc2l6ZV9idWYodnRjb24sIGRybV92dGNvbl92Yy0+YnVmX2xl bik7CisJCWlmIChyZXQpIHsKKwkJCW11dGV4X3VubG9jaygmZHJtX3Z0Y29uX3ZjLT5sb2NrKTsK KwkJCXJldHVybjsKKwkJfQorCQlyZW5kZXJfYWxsID0gdHJ1ZTsKKwl9CisKKwl2dGNvbi0+YnVm X2lkeCA9ICF2dGNvbi0+YnVmX2lkeDsKKwltZW1jcHkodnRjb24tPnRleHRfYnVmW3Z0Y29uLT5i dWZfaWR4XSwgZHJtX3Z0Y29uX3ZjLT50ZXh0X2J1ZiwKKwkgICAgICAgdmNfY29scyAqIHZjX3Jv d3MgKiBzaXplb2YodTE2KSk7CisKKwltdXRleF91bmxvY2soJmRybV92dGNvbl92Yy0+bG9jayk7 CisKKwlpZiAodnRjb24tPmNvbHMgIT0gdmNfY29scyB8fCB2dGNvbi0+cm93cyAhPSB2Y19yb3dz KSB7CisJCXJldCA9IGRybV92dGNvbl9tb2Rlc2V0KHZ0Y29uLCB2Y19jb2xzLCB2Y19yb3dzLCBm b250KTsKKwkJaWYgKHJldCkKKwkJCXJldHVybjsKKwkJcmVuZGVyX2FsbCA9IHRydWU7CisJfSBl bHNlIGlmICh2dGNvbi0+YmxhbmsgIT0gYmxhbmspIHsKKwkJZHJtX3Z0Y29uX2JsYW5rKHZ0Y29u LCBibGFuayk7CisJfQorCisJc3RyID0ga21hbGxvYyh2Y19jb2xzICsgMSwgR0ZQX0tFUk5FTCk7 CisJaWYgKCFzdHIpCisJCXJldHVybjsKKworCWZvciAocm93ID0gMDsgcm93IDwgdmNfcm93czsg cm93KyspIHsKKwkJZm9yIChjb2wgPSAwOyBjb2wgPCB2Y19jb2xzOyBjb2wrKykgeworCQkJcHJl diA9IHZ0Y29uLT50ZXh0X2J1ZlshdnRjb24tPmJ1Zl9pZHhdW2NvbCArIChyb3cgKiB2Y19jb2xz KV07CisJCQljdXJyID0gdnRjb24tPnRleHRfYnVmW3Z0Y29uLT5idWZfaWR4XVtjb2wgKyAocm93 ICogdmNfY29scyldOworCisJCQlpZiAocmVuZGVyX2FsbCB8fCBwcmV2ICE9IGN1cnIpIHsKKwkJ CQlzdHJbY29sXSA9IGN1cnI7CisJCQkJeCA9IGNvbCAqIGZvbnQtPndpZHRoOworCQkJCXkgPSBy b3cgKiBmb250LT5oZWlnaHQ7CisKKwkJCQljbGlwLngxID0gbWluX3QodTMyLCBjbGlwLngxLCB4 KTsKKwkJCQljbGlwLnkxID0gbWluX3QodTMyLCBjbGlwLnkxLCB5KTsKKwkJCQljbGlwLngyID0g bWF4X3QodTMyLCBjbGlwLngyLCB4ICsgZm9udC0+d2lkdGgpOworCQkJCWNsaXAueTIgPSBtYXhf dCh1MzIsIGNsaXAueTIsIHkgKyBmb250LT5oZWlnaHQpOworCisJCQkJZHJtX3Z0Y29uX3JlbmRl cl9jaGFyKHZ0Y29uLCB4LCB5LCBjdXJyLCBmb250KTsKKwkJCX0gZWxzZSB7CisJCQkJc3RyW2Nv bF0gPSAnICc7CisJCQl9CisJCX0KKwkJc3RyW3ZjX2NvbHNdID0gJ1wwJzsKKy8vCQlwcl9pbmZv KCIlMDJ1fCVzXG4iLCByb3csIHN0cik7CisJfQorCisJa2ZyZWUoc3RyKTsKKworCWlmIChjbGlw LngxIDwgY2xpcC54MikKKwkJZHJtX2NsaWVudF9mcmFtZWJ1ZmZlcl9mbHVzaCh2dGNvbi0+YnVm ZmVyLCAmY2xpcCk7Cit9CisKK3N0YXRpYyBERUNMQVJFX1dPUksoZHJtX3Z0Y29uX3dvcmssIGRy bV92dGNvbl93b3JrX2ZuKTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmRybV92dGNvbl9jb25fc3Rh cnR1cCh2b2lkKQoreworCXJldHVybiAiZHJtLXZ0IjsKK30KKworc3RhdGljIHZvaWQgZHJtX3Z0 Y29uX2Nvbl9pbml0KHN0cnVjdCB2Y19kYXRhICp2YywgaW50IGluaXQpCit7CisJZHJtX3Z0Y29u X2RlYnVnKHZjLCAiKGluaXQ9JWQpIGRybV92dGNvbl92Yz0lcFxuIiwgaW5pdCwgZHJtX3Z0Y29u X3ZjKTsKKworCXZjLT52Y19jYW5fZG9fY29sb3IgPSAxOworCisJaWYgKGluaXQpIHsKKwkJdmMt PnZjX2NvbHMgPSBkcm1fdnRjb25fdmMtPmNvbHM7CisJCXZjLT52Y19yb3dzID0gZHJtX3Z0Y29u X3ZjLT5yb3dzOworCX0gZWxzZSB7CisJCXZjX3Jlc2l6ZSh2YywgZHJtX3Z0Y29uX3ZjLT5jb2xz LCBkcm1fdnRjb25fdmMtPnJvd3MpOworCX0KK30KKworc3RhdGljIHZvaWQgZHJtX3Z0Y29uX2Nv bl9kZWluaXQoc3RydWN0IHZjX2RhdGEgKnZjKQoreworCWRybV92dGNvbl9kZWJ1Zyh2YywgIlxu Iik7Cit9CisKK3N0YXRpYyB2b2lkIGRybV92dGNvbl9jb25fcHV0Y3Moc3RydWN0IHZjX2RhdGEg KnZjLCBjb25zdCB1bnNpZ25lZCBzaG9ydCAqcywKKwkJCQlpbnQgY291bnQsIGludCB5LCBpbnQg eCkKK3sKKwl1MTYgKmRlc3Q7CisKKwlkZXN0ID0gJmRybV92dGNvbl92Yy0+dGV4dF9idWZbeCAr ICh5ICogZHJtX3Z0Y29uX3ZjLT5jb2xzKV07CisKKwlmb3IgKDsgY291bnQgPiAwOyBjb3VudC0t KQorCQlzY3Jfd3JpdGV3KHNjcl9yZWFkdyhzKyspLCBkZXN0KyspOworCisJc2NoZWR1bGVfd29y aygmZHJtX3Z0Y29uX3dvcmspOworfQorCitzdGF0aWMgdm9pZCBkcm1fdnRjb25fY29uX3B1dGMo c3RydWN0IHZjX2RhdGEgKnZjLCBpbnQgY2gsIGludCB5LCBpbnQgeCkKK3sKKwl1bnNpZ25lZCBz aG9ydCBjaHI7CisKKwlzY3Jfd3JpdGV3KGNoLCAmY2hyKTsKKwlkcm1fdnRjb25fY29uX3B1dGNz KHZjLCAmY2hyLCAxLCB5LCB4KTsKK30KKworLyogVE9ETzogSG93IGRvIEkgYWN0dWFsbHkgdGVz dCB0aGlzPyAqLworc3RhdGljIHZvaWQgZHJtX3Z0Y29uX2Nvbl9jbGVhcihzdHJ1Y3QgdmNfZGF0 YSAqdmMsIGludCB5LCBpbnQgeCwKKwkJCQlpbnQgaGVpZ2h0LCBpbnQgd2lkdGgpCit7CisJZHJt X3Z0Y29uX2RlYnVnKHZjLCAiXG4iKTsKKworCXNjcl9tZW1jcHl3KGRybV92dGNvbl92Yy0+dGV4 dF9idWYsICh1bnNpZ25lZCBzaG9ydCAqKXZjLT52Y19wb3MsCisJCSAgICB2Yy0+dmNfY29scyAq IHZjLT52Y19yb3dzKTsKKwlzY2hlZHVsZV93b3JrKCZkcm1fdnRjb25fd29yayk7Cit9CisKK3N0 YXRpYyBpbnQgZHJtX3Z0Y29uX2Nvbl9zd2l0Y2goc3RydWN0IHZjX2RhdGEgKnZjKQoreworCWRy bV92dGNvbl9kZWJ1Zyh2YywgIiV1eCV1XG4iLCB2Yy0+dmNfY29scywgdmMtPnZjX3Jvd3MpOwor CisJbXV0ZXhfbG9jaygmZHJtX3Z0Y29uX3ZjLT5sb2NrKTsKKwlkcm1fdnRjb25fdmMtPmNvbHMg PSB2Yy0+dmNfY29sczsKKwlkcm1fdnRjb25fdmMtPnJvd3MgPSB2Yy0+dmNfcm93czsKKwltdXRl eF91bmxvY2soJmRybV92dGNvbl92Yy0+bG9jayk7CisKKwlyZXR1cm4gMTsgLyogcmVkcmF3ICov Cit9CisKK3N0YXRpYyBpbnQgZHJtX3Z0Y29uX2Nvbl9yZXNpemUoc3RydWN0IHZjX2RhdGEgKnZj LCB1bnNpZ25lZCBpbnQgd2lkdGgsCisJCQkJdW5zaWduZWQgaW50IGhlaWdodCwgdW5zaWduZWQg aW50IHVzZXIpCit7CisJaW50IHJldCA9IDA7CisKKwlkcm1fdnRjb25fZGVidWcodmMsICJ3aWR0 aD0ldSwgaGVpZ2h0PSV1LCB1c2VyPSV1XG4iLCB3aWR0aCwgaGVpZ2h0LCB1c2VyKTsKKworCW11 dGV4X2xvY2soJmRybV92dGNvbl92Yy0+bG9jayk7CisKKwlpZiAod2lkdGggPiBkcm1fdnRjb25f dmMtPm1heF9jb2xzIHx8IGhlaWdodCA+IGRybV92dGNvbl92Yy0+bWF4X3Jvd3MpCisJCXJldCA9 IC1FSU5WQUw7CisKKwltdXRleF91bmxvY2soJmRybV92dGNvbl92Yy0+bG9jayk7CisKKwlkcm1f dnRjb25fZGVidWcodmMsICJyZXQ9JWRcbiIsIHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorCitz dGF0aWMgdm9pZCBkcm1fdnRjb25fY29uX3NldF9wYWxldHRlKHN0cnVjdCB2Y19kYXRhICp2YywK KwkJCQkgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICp0YWJsZSkKK3sKKwlkcm1fdnRjb25fZGVi dWcodmMsICJcbiIpOworfQorCitzdGF0aWMgaW50IGRybV92dGNvbl9jb25fYmxhbmsoc3RydWN0 IHZjX2RhdGEgKnZjLCBpbnQgYmxhbmssIGludCBtb2RlX3N3aXRjaCkKK3sKKwlkcm1fdnRjb25f ZGVidWcodmMsICIoYmxhbms9JWQsIG1vZGVfc3dpdGNoPSVkKVxuIiwgYmxhbmssIG1vZGVfc3dp dGNoKTsKKworCW11dGV4X2xvY2soJmRybV92dGNvbl92Yy0+bG9jayk7CisJZHJtX3Z0Y29uX3Zj LT5ibGFuayA9IGJsYW5rOworCW11dGV4X3VubG9jaygmZHJtX3Z0Y29uX3ZjLT5sb2NrKTsKKwor CXNjaGVkdWxlX3dvcmsoJmRybV92dGNvbl93b3JrKTsKKworCXJldHVybiAwOworfQorCitzdGF0 aWMgdm9pZCBkcm1fdnRjb25fY29uX3Njcm9sbGRlbHRhKHN0cnVjdCB2Y19kYXRhICp2YywgaW50 IGxpbmVzKQoreworCWRybV92dGNvbl9kZWJ1Zyh2YywgIihsaW5lcz0lZClcbiIsIGxpbmVzKTsK K30KKworc3RhdGljIHZvaWQgZHJtX3Z0Y29uX2Nvbl9jdXJzb3JfZHJhdyhib29sIHNob3cpCit7 CisJc3RhdGljIHVuc2lnbmVkIHNob3J0IHNldF9jaHIsIHNhdmVkX2NocjsKKwlzdGF0aWMgaW50 IHByZXZfeCwgcHJldl95OworCXN0cnVjdCB2Y19kYXRhICp2YyA9IHZjX2NvbnNbZmdfY29uc29s ZV0uZDsKKwl1bnNpZ25lZCBzaG9ydCAqcG9zOworCisJaWYgKHNhdmVkX2NocikgeworCQlwb3Mg PSAmZHJtX3Z0Y29uX3ZjLT50ZXh0X2J1ZltwcmV2X3ggKyAocHJldl95ICogZHJtX3Z0Y29uX3Zj LT5jb2xzKV07CisJCWlmICgqcG9zID09IHNldF9jaHIpCisJCQkqcG9zID0gc2F2ZWRfY2hyOwor CQlzYXZlZF9jaHIgPSAwOworCX0KKworCWlmIChzaG93KSB7CisJCXBvcyA9ICZkcm1fdnRjb25f dmMtPnRleHRfYnVmW3ZjLT52Y194ICsgKHZjLT52Y195ICogZHJtX3Z0Y29uX3ZjLT5jb2xzKV07 CisJCSpwb3MgPSBzY3JfcmVhZHcoKHUxNiAqKXZjLT52Y19wb3MpOworCQlzYXZlZF9jaHIgPSAq cG9zOworCQlzZXRfY2hyID0gKnBvcyAmIDB4ZmYwMDsKKwkJc2V0X2NociB8PSAnXyc7CisJCSpw b3MgPSBzZXRfY2hyOworCQlwcmV2X3ggPSB2Yy0+dmNfeDsKKwkJcHJldl95ID0gdmMtPnZjX3k7 CisJfQorCisJc2NoZWR1bGVfd29yaygmZHJtX3Z0Y29uX3dvcmspOworfQorCitzdGF0aWMgdm9p ZCBkcm1fdnRjb25fY29uX2N1cnNvcl90aW1lcl9oYW5kbGVyKHN0cnVjdCB0aW1lcl9saXN0ICp0 KQoreworCXN0YXRpYyBib29sIHNob3c7CisKKwlzaG93ID0gIXNob3c7CisJZHJtX3Z0Y29uX2Nv bl9jdXJzb3JfZHJhdyhzaG93KTsKKwltb2RfdGltZXIodCwgamlmZmllcyArIGRybV92dGNvbl92 Yy0+Y3Vyc29yX2JsaW5rX2ppZmZpZXMpOworfQorCitzdGF0aWMgREVGSU5FX1RJTUVSKGRybV92 dGNvbl9jb25fY3Vyc29yX3RpbWVyLCBkcm1fdnRjb25fY29uX2N1cnNvcl90aW1lcl9oYW5kbGVy KTsKKworc3RhdGljIHZvaWQgZHJtX3Z0Y29uX2Nvbl9jdXJzb3Ioc3RydWN0IHZjX2RhdGEgKnZj LCBpbnQgbW9kZSkKK3sKKwkvL2RybV92dGNvbl9kZWJ1Zyh2YywgIihtb2RlPSVkKVxuIiwgbW9k ZSk7CisKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIENNX0VSQVNFOgorCQlkcm1fdnRjb25fY29u X2N1cnNvcl9kcmF3KGZhbHNlKTsKKwkJZGVsX3RpbWVyX3N5bmMoJmRybV92dGNvbl9jb25fY3Vy c29yX3RpbWVyKTsKKwkJYnJlYWs7CisJY2FzZSBDTV9NT1ZFOgorCWNhc2UgQ01fRFJBVzoKKwkJ ZHJtX3Z0Y29uX3ZjLT5jdXJzb3JfYmxpbmtfamlmZmllcyA9IG1zZWNzX3RvX2ppZmZpZXModmMt PnZjX2N1cl9ibGlua19tcyk7CisJCW1vZF90aW1lcigmZHJtX3Z0Y29uX2Nvbl9jdXJzb3JfdGlt ZXIsCisJCQkgIGppZmZpZXMgKyBkcm1fdnRjb25fdmMtPmN1cnNvcl9ibGlua19qaWZmaWVzKTsK KwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgYm9vbCBkcm1fdnRjb25fY29uX3Njcm9sbChzdHJ1 Y3QgdmNfZGF0YSAqdmMsIHVuc2lnbmVkIGludCB0b3AsCisJCQkJIHVuc2lnbmVkIGludCBib3R0 b20sIGVudW0gY29uX3Njcm9sbCBkaXIsCisJCQkJIHVuc2lnbmVkIGludCBsaW5lcykKK3sKKwlz aXplX3QgY291bnQ7CisKKwlzd2l0Y2ggKGRpcikgeworCWNhc2UgU01fVVA6CisJCWNvdW50ID0g dmMtPnZjX2NvbHMgKiAodmMtPnZjX3Jvd3MgLSBsaW5lcyk7CisJCW1lbW1vdmUoZHJtX3Z0Y29u X3ZjLT50ZXh0X2J1ZiwgZHJtX3Z0Y29uX3ZjLT50ZXh0X2J1ZiArIHZjLT52Y19jb2xzLCBjb3Vu dCAqIHNpemVvZih1MTYpKTsKKwkJbWVtc2V0KGRybV92dGNvbl92Yy0+dGV4dF9idWYgKyBjb3Vu dCwgMCwgdmMtPnZjX2NvbHMgKiBsaW5lcyAqIHNpemVvZih1MTYpKTsKKwkJYnJlYWs7CisJY2Fz ZSBTTV9ET1dOOgorCQlkcm1fdnRjb25fZGVidWcodmMsICJUT0RPXG4iKTsKKwkJYnJlYWs7CisJ fQorCisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGNvbnN3IGRybV92 dGNvbl9jb25zdyA9IHsKKwkvKiBvd25lciBpcyBub3Qgc2V0LCBpdCBibG9ja3MgbW9kdWxlIHVu bG9hZCAqLworCS5jb25fc3RhcnR1cAkJPSBkcm1fdnRjb25fY29uX3N0YXJ0dXAsCisJLmNvbl9p bml0CQk9IGRybV92dGNvbl9jb25faW5pdCwKKwkuY29uX2RlaW5pdAkJPSBkcm1fdnRjb25fY29u X2RlaW5pdCwKKwkuY29uX2NsZWFyCQk9IGRybV92dGNvbl9jb25fY2xlYXIsCisJLmNvbl9wdXRj CQk9IGRybV92dGNvbl9jb25fcHV0YywKKwkuY29uX3B1dGNzCQk9IGRybV92dGNvbl9jb25fcHV0 Y3MsCisJLmNvbl9jdXJzb3IJCT0gZHJtX3Z0Y29uX2Nvbl9jdXJzb3IsCisJLmNvbl9zY3JvbGwJ CT0gZHJtX3Z0Y29uX2Nvbl9zY3JvbGwsCisJLmNvbl9zd2l0Y2gJCT0gZHJtX3Z0Y29uX2Nvbl9z d2l0Y2gsCisJLmNvbl9ibGFuawkJPSBkcm1fdnRjb25fY29uX2JsYW5rLAorCS5jb25fcmVzaXpl CQk9IGRybV92dGNvbl9jb25fcmVzaXplLAorCS5jb25fc2V0X3BhbGV0dGUJPSBkcm1fdnRjb25f Y29uX3NldF9wYWxldHRlLAorCS5jb25fc2Nyb2xsZGVsdGEJPSBkcm1fdnRjb25fY29uX3Njcm9s bGRlbHRhLAorfTsKKworc3RhdGljIGludCBkcm1fdnRjb25fdmNfc2V0X21heChzdHJ1Y3QgZHJt X2Rpc3BsYXlfbW9kZSAqbW9kZSkKK3sKKwl1MTYgKm5ld19idWYgPSBOVUxMLCAqb2xkX2J1ZiA9 IE5VTEw7CisJY29uc3Qgc3RydWN0IGZvbnRfZGVzYyAqZm9udDsKKwl1bnNpZ25lZCBpbnQgY29s cywgcm93cywgaTsKKwlzaXplX3QgYnVmX2xlbjsKKworCS8qIG9ubHkgOCBiaXQgd2lkZSBhbmQg OCBvciAxNi1iaXQgaGlnaCAqLworCWZvbnQgPSBnZXRfZGVmYXVsdF9mb250KG1vZGUtPmhkaXNw bGF5LCBtb2RlLT52ZGlzcGxheSwKKwkJCQlCSVQoOCAtIDEpLCBCSVQoOCAtIDEpIHwgQklUKDE2 IC0gMSkpOworCWlmICghZm9udCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlwcl9pbmZvKCIlczog Zm9udDogJXNcbiIsIF9fZnVuY19fLCBmb250LT5uYW1lKTsKKworCWNvbHMgPSBtb2RlLT5oZGlz cGxheSAvIGZvbnQtPndpZHRoOworCXJvd3MgPSBtb2RlLT52ZGlzcGxheSAvIGZvbnQtPmhlaWdo dDsKKworCXByX2luZm8oIiVzOiBBU0tFRDogY29scz0ldSwgcm93cz0ldVxuIiwgX19mdW5jX18s IGNvbHMsIHJvd3MpOworCisJaWYgKGRybV92dGNvbl92Yy0+bWF4X2NvbHMgPT0gY29scyAmJiBk cm1fdnRjb25fdmMtPm1heF9yb3dzID09IHJvd3MgJiYKKwkgICAgZHJtX3Z0Y29uX3ZjLT5mb250 ID09IGZvbnQpCisJCXJldHVybiAwOworCisJYnVmX2xlbiA9IGNvbHMgKiByb3dzICogc2l6ZW9m KHUxNik7CisJaWYgKGJ1Zl9sZW4gPiBkcm1fdnRjb25fdmMtPmJ1Zl9sZW4pIHsKKwkJbmV3X2J1 ZiA9IGt6YWxsb2MoYnVmX2xlbiwgR0ZQX0tFUk5FTCk7CisJCWlmICghbmV3X2J1ZikKKwkJCXJl dHVybiAtRU5PTUVNOworCX0KKworCW11dGV4X2xvY2soJmRybV92dGNvbl92Yy0+bG9jayk7CisK KwlpZiAobmV3X2J1ZikgeworCQlEUk1fSU5GTygiQWxsb2NhdGVkIG5ldyBidWY6IGJ1Zl9sZW49 JXp1XG4iLCBidWZfbGVuKTsKKwkJb2xkX2J1ZiA9IGRybV92dGNvbl92Yy0+dGV4dF9idWY7CisJ CWRybV92dGNvbl92Yy0+dGV4dF9idWYgPSBuZXdfYnVmOworCQlkcm1fdnRjb25fdmMtPmJ1Zl9s ZW4gPSBidWZfbGVuOworCX0KKworCWRybV92dGNvbl92Yy0+bWF4X2NvbHMgPSBjb2xzOworCWRy bV92dGNvbl92Yy0+bWF4X3Jvd3MgPSByb3dzOworCWRybV92dGNvbl92Yy0+Zm9udCA9IGZvbnQ7 CisKKwltdXRleF91bmxvY2soJmRybV92dGNvbl92Yy0+bG9jayk7CisKKwlwcl9pbmZvKCIlczog bWF4X2NvbHM9JXUsIG1heF9yb3dzPSV1XG4iLCBfX2Z1bmNfXywgZHJtX3Z0Y29uX3ZjLT5tYXhf Y29scywKKwkJZHJtX3Z0Y29uX3ZjLT5tYXhfcm93cyk7CisKKwljb25zb2xlX2xvY2soKTsKKwlm b3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorCQl2Y19yZXNpemUodmNfY29uc1tpXS5kLCBkcm1fdnRj b25fdmMtPm1heF9jb2xzLAorCQkJICBkcm1fdnRjb25fdmMtPm1heF9yb3dzKTsKKwljb25zb2xl X3VubG9jaygpOworCisJa2ZyZWUob2xkX2J1Zik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGlj IGludCBkcm1fdnRjb25fc2V0dXBfZGV2KHN0cnVjdCBkcm1fdnRjb24gKnZ0Y29uKQoreworCXN0 cnVjdCBkcm1fY2xpZW50X2RldiAqY2xpZW50ID0gdnRjb24tPmNsaWVudDsKKwlzdHJ1Y3QgZHJt X2NsaWVudF9kaXNwbGF5ICpkaXNwbGF5OworCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2Rl OworCWludCByZXQ7CisKKwlkaXNwbGF5ID0gZHJtX2NsaWVudF9maW5kX2Rpc3BsYXkoY2xpZW50 LT5kZXYsIDAsIDApOworCWlmIChJU19FUlIoZGlzcGxheSkpCisJCXJldHVybiBQVFJfRVJSKGRp c3BsYXkpOworCWlmICghZGlzcGxheSkKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwltb2RlID0gZGlz cGxheS0+bW9kZTsKKwlpZiAoIW1vZGUpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnJf ZnJlZV9kaXNwbGF5OworCX0KKworCXJldCA9IGRybV92dGNvbl92Y19zZXRfbWF4KG1vZGUpOwor CWlmIChyZXQpCisJCWdvdG8gZXJyX2ZyZWVfZGlzcGxheTsKKworCXByX2luZm8oIiVzOiBjb2xz PSV1LCByb3dzPSV1XG4iLCBfX2Z1bmNfXywgZHJtX3Z0Y29uX3ZjLT5jb2xzLCBkcm1fdnRjb25f dmMtPnJvd3MpOworCisJdnRjb24tPmRpc3BsYXkgPSBkaXNwbGF5OworCisJc2NoZWR1bGVfd29y aygmZHJtX3Z0Y29uX3dvcmspOworCisJcmV0dXJuIDA7CisKK2Vycl9mcmVlX2Rpc3BsYXk6CisJ ZHJtX2NsaWVudF9kaXNwbGF5X2ZyZWUoZGlzcGxheSk7CisKKwlyZXR1cm4gcmV0OworfQorCitz dGF0aWMgaW50IGRybV92dGNvbl9jbGllbnRfaG90cGx1ZyhzdHJ1Y3QgZHJtX2NsaWVudF9kZXYg KmNsaWVudCkKK3sKKwlzdHJ1Y3QgZHJtX3Z0Y29uICp2dGNvbiA9IGNsaWVudC0+cHJpdmF0ZTsK KwlpbnQgcmV0ID0gMDsKKworCWlmICghdnRjb24tPmRpc3BsYXkpCisJCXJldCA9IGRybV92dGNv bl9zZXR1cF9kZXYodnRjb24pOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBk cm1fY2xpZW50X2RldiAqdnRjb25fY2xpZW50Oworc3RhdGljIERFRklORV9NVVRFWCh2dGNvbl9j bGllbnRfbG9jayk7CisKK3N0YXRpYyBpbnQgZHJtX3Z0Y29uX2NsaWVudF9yZW1vdmUoc3RydWN0 IGRybV9jbGllbnRfZGV2ICpjbGllbnQpCit7CisJc3RydWN0IGRybV92dGNvbiAqdnRjb24gPSBj bGllbnQtPnByaXZhdGU7CisJc3RydWN0IGRybV9jbGllbnRfZGlzcGxheSAqZGlzcGxheSA9IHZ0 Y29uLT5kaXNwbGF5OworCisJbXV0ZXhfbG9jaygmdnRjb25fY2xpZW50X2xvY2spOworCisJdnRj b25fY2xpZW50ID0gTlVMTDsKKworCWlmICghZGlzcGxheSkKKwkJZ290byBvdXRfdW5sb2NrOwor CisJdnRjb24tPmRpc3BsYXkgPSBOVUxMOworCWZsdXNoX3dvcmsoJmRybV92dGNvbl93b3JrKTsK KwlrZnJlZSh2dGNvbi0+dGV4dF9idWZbMF0pOworCWtmcmVlKHZ0Y29uLT50ZXh0X2J1ZlsxXSk7 CisJZHJtX2NsaWVudF9mcmFtZWJ1ZmZlcl9kZWxldGUodnRjb24tPmJ1ZmZlcik7CisJdnRjb24t PmJ1ZmZlciA9IE5VTEw7CisJZHJtX2NsaWVudF9kaXNwbGF5X2ZyZWUoZGlzcGxheSk7CisKK291 dF91bmxvY2s6CisJbXV0ZXhfdW5sb2NrKCZ2dGNvbl9jbGllbnRfbG9jayk7CisKKwlyZXR1cm4g MDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fY2xpZW50X2Z1bmNzIGRybV92dGNvbl9j bGllbnRfZnVuY3MgPSB7CisJLm5hbWUJCT0gInZ0Y29uIiwKKwkucmVtb3ZlCQk9IGRybV92dGNv bl9jbGllbnRfcmVtb3ZlLAorCS5ob3RwbHVnCT0gZHJtX3Z0Y29uX2NsaWVudF9ob3RwbHVnLAor fTsKKworc3RhdGljIHN0cnVjdCBkcm1fY2xpZW50X2RldiAqZHJtX3Z0Y29uX2NsaWVudF9uZXco dW5zaWduZWQgaW50IGRldl9pZCkKK3sKKwlzdHJ1Y3QgZHJtX3Z0Y29uICp2dGNvbiA9IHZ0Y29u X2luc3RhbmNlOworCXN0cnVjdCBkcm1fY2xpZW50X2RldiAqY2xpZW50OworCisJaWYgKHZ0Y29u LT5jbGllbnQpCisJCXJldHVybiBFUlJfUFRSKC1FQlVTWSk7CisKKwljbGllbnQgPSBkcm1fY2xp ZW50X25ld19mcm9tX2lkKGRldl9pZCwgJmRybV92dGNvbl9jbGllbnRfZnVuY3MpOworCWlmIChJ U19FUlIoY2xpZW50KSkKKwkJcmV0dXJuIGNsaWVudDsKKworCXZ0Y29uLT5jbGllbnQgPSBjbGll bnQ7CisJY2xpZW50LT5wcml2YXRlID0gdnRjb247CisKKwkvKgorCSAqIHZjNCBpc24ndCBkb25l IHdpdGggaXQncyBzZXR1cCB3aGVuIGRybV9kZXZfcmVnaXN0ZXIoKSBpcyBjYWxsZWQuCisJICog SXQgc2hvdWxkIGhhdmUgc2hvdWxkbid0IGl0PworCSAqIFNvIHRvIGtlZXAgaXQgZnJvbSBjcmFz aGluZyBkZWZlciBzZXR1cCB0byBob3RwbHVnLi4uCisJICovCisJaWYgKGNsaWVudC0+ZGV2LT5t b2RlX2NvbmZpZy5tYXhfd2lkdGgpCisJCWRybV92dGNvbl9jbGllbnRfaG90cGx1ZyhjbGllbnQp OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRybV92dGNvbl90ZWFyZG93bih2b2lk KQoreworCXN0cnVjdCBkcm1fdnRjb24gKnZ0Y29uID0gdnRjb25faW5zdGFuY2U7CisKKwlpZiAo IWRybV92dGNvbl92YykKKwkJcmV0dXJuOworCisJa2ZyZWUoZHJtX3Z0Y29uX3ZjLT50ZXh0X2J1 Zik7CisJbXV0ZXhfZGVzdHJveSgmZHJtX3Z0Y29uX3ZjLT5sb2NrKTsKKwlrZnJlZShkcm1fdnRj b25fdmMpOworCWtmcmVlKHZ0Y29uKTsKK30KKworc3RhdGljIGludCBfX2luaXQgZHJtX3Z0Y29u X3NldHVwKHZvaWQpCit7CisJc3RydWN0IGRybV92dGNvbiAqdnRjb247CisKKwlkcm1fdnRjb25f dmMgPSBremFsbG9jKHNpemVvZigqZHJtX3Z0Y29uX3ZjKSwgR0ZQX0tFUk5FTCk7CisJdnRjb24g PSBremFsbG9jKHNpemVvZigqdnRjb24pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRybV92dGNvbl92 YyB8fCAhdnRjb24pCisJCWdvdG8gZXJyX2ZyZWU7CisKKwlkcm1fdnRjb25fdmMtPm1heF9jb2xz ID0gODA7CisJZHJtX3Z0Y29uX3ZjLT5tYXhfcm93cyA9IDI1OworCWRybV92dGNvbl92Yy0+Y29s cyA9IGRybV92dGNvbl92Yy0+bWF4X2NvbHM7CisJZHJtX3Z0Y29uX3ZjLT5yb3dzID0gZHJtX3Z0 Y29uX3ZjLT5tYXhfcm93czsKKwlwcl9pbmZvKCIlczogY29scz0ldSwgcm93cz0ldVxuIiwgX19m dW5jX18sIGRybV92dGNvbl92Yy0+Y29scywgZHJtX3Z0Y29uX3ZjLT5yb3dzKTsKKworCWRybV92 dGNvbl92Yy0+YnVmX2xlbiA9IGRybV92dGNvbl92Yy0+bWF4X2NvbHMgKiBkcm1fdnRjb25fdmMt Pm1heF9yb3dzICogc2l6ZW9mKHUxNik7CisJZHJtX3Z0Y29uX3ZjLT50ZXh0X2J1ZiA9IGt6YWxs b2MoZHJtX3Z0Y29uX3ZjLT5idWZfbGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRybV92dGNvbl92 Yy0+dGV4dF9idWYpCisJCWdvdG8gZXJyX2ZyZWU7CisKKwltdXRleF9pbml0KCZkcm1fdnRjb25f dmMtPmxvY2spOworCXZ0Y29uX2luc3RhbmNlID0gdnRjb247CisKKwlyZXR1cm4gMDsKKworZXJy X2ZyZWU6CisJa2ZyZWUoZHJtX3Z0Y29uX3ZjKTsKKwlrZnJlZSh2dGNvbik7CisKKwlyZXR1cm4g LUVOT01FTTsKK30KKworc3RhdGljIGludCBfX2luaXQgZHJtX3Z0Y29uX21vZHVsZV9pbml0KHZv aWQpCit7CisJaW50IHJldDsKKworCWlmIChkcm1fdnRjb25fZGV2X2lkIDwgMCkKKwkJcmV0dXJu IDA7CisKKwlyZXQgPSBkcm1fdnRjb25fc2V0dXAoKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0 OworCisJdnRjb25fY2xpZW50ID0gZHJtX3Z0Y29uX2NsaWVudF9uZXcoZHJtX3Z0Y29uX2Rldl9p ZCk7CisJaWYgKElTX0VSUih2dGNvbl9jbGllbnQpKSB7CisJCXJldCA9IFBUUl9FUlIodnRjb25f Y2xpZW50KTsKKwkJZHJtX3Z0Y29uX2Rldl9pZCA9IHJldDsKKwkJZ290byBlcnJfZnJlZTsKKwl9 CisKKwljb25zb2xlX2xvY2soKTsKKwlyZXQgPSBkb190YWtlX292ZXJfY29uc29sZSgmZHJtX3Z0 Y29uX2NvbnN3LCAwLCAxLCAwKTsKKwljb25zb2xlX3VubG9jaygpOworCWlmIChyZXQpCisJCWdv dG8gZXJyX3JlbW92ZTsKKworCXJldHVybiAwOworCitlcnJfcmVtb3ZlOgorCWRybV9jbGllbnRf cmVtb3ZlKHZ0Y29uX2NsaWVudCk7CitlcnJfZnJlZToKKwlkcm1fdnRjb25fdGVhcmRvd24oKTsK KworCXJldHVybiByZXQ7Cit9Cittb2R1bGVfaW5pdChkcm1fdnRjb25fbW9kdWxlX2luaXQpOwor CitzdGF0aWMgdm9pZCBfX2V4aXQgZHJtX3Z0Y29uX21vZHVsZV9leGl0KHZvaWQpCit7CisJaWYg KGRybV92dGNvbl9kZXZfaWQgPCAwKQorCQlyZXR1cm47CisKKwltdXRleF9sb2NrKCZ2dGNvbl9j bGllbnRfbG9jayk7CisJZHJtX2NsaWVudF9yZW1vdmUodnRjb25fY2xpZW50KTsKKwltdXRleF91 bmxvY2soJnZ0Y29uX2NsaWVudF9sb2NrKTsKKworCWNvbnNvbGVfbG9jaygpOworCWRvX3VuYmlu ZF9jb25fZHJpdmVyKCZkcm1fdnRjb25fY29uc3csIDAsIDEsIDApOworCWRvX3VucmVnaXN0ZXJf Y29uX2RyaXZlcigmZHJtX3Z0Y29uX2NvbnN3KTsKKwljb25zb2xlX3VubG9jaygpOworCisJZGVs X3RpbWVyX3N5bmMoJmRybV92dGNvbl9jb25fY3Vyc29yX3RpbWVyKTsKKwlmbHVzaF93b3JrKCZk cm1fdnRjb25fd29yayk7CisJZHJtX3Z0Y29uX3RlYXJkb3duKCk7Cit9Cittb2R1bGVfZXhpdChk cm1fdnRjb25fbW9kdWxlX2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0tIAoyLjE1 LjEKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmRyaS1k ZXZlbCBtYWlsaW5nIGxpc3QKZHJpLWRldmVsQGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczov L2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2RyaS1kZXZlbAo=