From mboxrd@z Thu Jan 1 00:00:00 1970 Return-path: Received: from metis.ext.pengutronix.de ([2001:67c:670:201:290:27ff:fe1d:cc33]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1k6DVV-0003mO-Kr for barebox@lists.infradead.org; Thu, 13 Aug 2020 13:43:14 +0000 From: Sascha Hauer Date: Thu, 13 Aug 2020 15:42:53 +0200 Message-Id: <20200813134257.24627-17-s.hauer@pengutronix.de> In-Reply-To: <20200813134257.24627-1-s.hauer@pengutronix.de> References: <20200813134257.24627-1-s.hauer@pengutronix.de> MIME-Version: 1.0 List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "barebox" Errors-To: barebox-bounces+u.kleine-koenig=pengutronix.de@lists.infradead.org Subject: [PATCH 16/20] fastboot net: implement fastboot over UDP To: Barebox List Cc: Edmund Henniges , =?UTF-8?q?Daniel=20Gl=C3=B6ckner?= RnJvbTogRWRtdW5kIEhlbm5pZ2VzIDxlaEBlbWxpeC5jb20+CgpUaGlzIGltcGxlbWVudHMgdGhl IFVEUCB2YXJpYW50IG9mIHRoZSBmYXN0Ym9vdCBwcm90b2NvbC4gVGhlIG9ubHkgd2F5IHRvCnN0 YXJ0IHRoZSBzZXJ2aWNlIGZvciBub3cgaXMgdG8gY29tcGlsZSB3aXRoIENPTkZJR19GQVNUQk9P VF9ORVRfT05fQk9PVC4KVGhlIHNlcnZpY2Ugd2lsbCBiaW5kIHRvIHRoZSBuZXR3b3JrIGludGVy ZmFjZSB0aGF0IHByb3ZpZGVzIHRoZSBJUHY0CmdhdGV3YXkuCgpTZW5kaW5nIGFuIE9LQVkgcGFj a2V0IGJlZm9yZSBwZXJmb3JtaW5nIGEgcmVzdGFydCBpcyBuZWNlc3Nhcnkgc2luY2UKY29udHJh cnkgdG8gVVNCIHRoZSBob3N0IHdpbGwgbm90IG5vdGljZSB3aGVuIGEgVURQIHNlcnZlciBkaXNh cHBlYXJzLgoKU2lnbmVkLW9mZi1ieTogRWRtdW5kIEhlbm5pZ2VzIDxlaEBlbWxpeC5jb20+ClNp Z25lZC1vZmYtYnk6IERhbmllbCBHbMO2Y2tuZXIgPGRnQGVtbGl4LmNvbT4KU2lnbmVkLW9mZi1i eTogU2FzY2hhIEhhdWVyIDxzLmhhdWVyQHBlbmd1dHJvbml4LmRlPgotLS0KIGNvbW1vbi9mYXN0 Ym9vdC5jICAgICAgfCAgIDMgKwogaW5jbHVkZS9mYXN0Ym9vdC5oICAgICB8ICAgMyArCiBpbmNs dWRlL2Zhc3Rib290X25ldC5oIHwgIDEyICsKIG5ldC9LY29uZmlnICAgICAgICAgICAgfCAgMTAg KwogbmV0L01ha2VmaWxlICAgICAgICAgICB8ICAgMSArCiBuZXQvZmFzdGJvb3QuYyAgICAgICAg IHwgNTgwICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCiA2IGZpbGVz IGNoYW5nZWQsIDYwOSBpbnNlcnRpb25zKCspCiBjcmVhdGUgbW9kZSAxMDA2NDQgaW5jbHVkZS9m YXN0Ym9vdF9uZXQuaAogY3JlYXRlIG1vZGUgMTAwNjQ0IG5ldC9mYXN0Ym9vdC5jCgpkaWZmIC0t Z2l0IGEvY29tbW9uL2Zhc3Rib290LmMgYi9jb21tb24vZmFzdGJvb3QuYwppbmRleCAzZjYxMjA4 YTIxLi5kNzM3MTA3ZDE5IDEwMDY0NAotLS0gYS9jb21tb24vZmFzdGJvb3QuYworKysgYi9jb21t b24vZmFzdGJvb3QuYwpAQCAtMjQ1LDYgKzI0NSw3IEBAIHN0YXRpYyBjaGFyICpmYXN0Ym9vdF9t c2dbXSA9IHsKIAlbRkFTVEJPT1RfTVNHX0ZBSUxdID0gIkZBSUwiLAogCVtGQVNUQk9PVF9NU0df SU5GT10gPSAiSU5GTyIsCiAJW0ZBU1RCT09UX01TR19EQVRBXSA9ICJEQVRBIiwKKwlbRkFTVEJP T1RfTVNHX05PTkVdID0gIiIsCiB9OwogCiBpbnQgZmFzdGJvb3RfdHhfcHJpbnQoc3RydWN0IGZh c3Rib290ICpmYiwgZW51bSBmYXN0Ym9vdF9tc2dfdHlwZSB0eXBlLApAQCAtMjczLDYgKzI3NCw3 IEBAIGludCBmYXN0Ym9vdF90eF9wcmludChzdHJ1Y3QgZmFzdGJvb3QgKmZiLCBlbnVtIGZhc3Ri b290X21zZ190eXBlIHR5cGUsCiAJY2FzZSBGQVNUQk9PVF9NU0dfSU5GTzoKIAkJcHJfaW5mbygi JXBWXG4iLCAmdmFmKTsKIAkJYnJlYWs7CisJY2FzZSBGQVNUQk9PVF9NU0dfTk9ORToKIAljYXNl IEZBU1RCT09UX01TR19EQVRBOgogCQlicmVhazsKIAl9CkBAIC0yODcsNiArMjg5LDcgQEAgaW50 IGZhc3Rib290X3R4X3ByaW50KHN0cnVjdCBmYXN0Ym9vdCAqZmIsIGVudW0gZmFzdGJvb3RfbXNn X3R5cGUgdHlwZSwKIAogc3RhdGljIHZvaWQgY2JfcmVib290KHN0cnVjdCBmYXN0Ym9vdCAqZmIs IGNvbnN0IGNoYXIgKmNtZCkKIHsKKwlmYXN0Ym9vdF90eF9wcmludChmYiwgRkFTVEJPT1RfTVNH X09LQVksICIiKTsKIAlyZXN0YXJ0X21hY2hpbmUoKTsKIH0KIApkaWZmIC0tZ2l0IGEvaW5jbHVk ZS9mYXN0Ym9vdC5oIGIvaW5jbHVkZS9mYXN0Ym9vdC5oCmluZGV4IDc3MTgzOTBhZTUuLmZhODI2 YTE2MjIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZmFzdGJvb3QuaAorKysgYi9pbmNsdWRlL2Zhc3Ri b290LmgKQEAgLTUsNiArNSw4IEBACiAjaW5jbHVkZSA8ZmlsZS1saXN0Lmg+CiAjaW5jbHVkZSA8 bmV0Lmg+CiAKKyNkZWZpbmUgRkFTVEJPT1RfTUFYX0NNRF9MRU4gIDY0CisKIC8qCiAgKiBSZXR1 cm4gY29kZXMgZm9yIHRoZSBleGVjX2NtZCBjYWxsYmFjayBhYm92ZToKICAqCkBAIC01MSw2ICs1 Myw3IEBAIGVudW0gZmFzdGJvb3RfbXNnX3R5cGUgewogCUZBU1RCT09UX01TR19GQUlMLAogCUZB U1RCT09UX01TR19JTkZPLAogCUZBU1RCT09UX01TR19EQVRBLAorCUZBU1RCT09UX01TR19OT05F LAogfTsKIAogZXh0ZXJuIGludCBmYXN0Ym9vdF9iYnU7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2Zh c3Rib290X25ldC5oIGIvaW5jbHVkZS9mYXN0Ym9vdF9uZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0 NAppbmRleCAwMDAwMDAwMDAwLi5lNGI5ZDk4MDkxCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVk ZS9mYXN0Ym9vdF9uZXQuaApAQCAtMCwwICsxLDEyIEBACisvKiBTUERYLUxpY2Vuc2UtSWRlbnRp ZmllcjogR1BMLTIuMCsgKi8KKyNpZm5kZWYgX19GQVNUQk9PVF9ORVRfXworI2RlZmluZSBfX0ZB U1RCT09UX05FVF9fCisKKyNpbmNsdWRlIDxmYXN0Ym9vdC5oPgorCitzdHJ1Y3QgZmFzdGJvb3Rf bmV0OworCitzdHJ1Y3QgZmFzdGJvb3RfbmV0ICpmYXN0Ym9vdF9uZXRfaW5pdChzdHJ1Y3QgZmFz dGJvb3Rfb3B0cyAqb3B0cyk7Cit2b2lkIGZhc3Rib290X25ldF9mcmVlKHN0cnVjdCBmYXN0Ym9v dF9uZXQgKmZibik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0L0tjb25maWcgYi9uZXQvS2Nv bmZpZwppbmRleCAxMmI2YmRiNTZkLi5hM2M4YzEwZjMzIDEwMDY0NAotLS0gYS9uZXQvS2NvbmZp ZworKysgYi9uZXQvS2NvbmZpZwpAQCAtMzEsNCArMzEsMTQgQEAgY29uZmlnIE5FVF9TTlRQCiAJ Ym9vbAogCXByb21wdCAic250cCBzdXBwb3J0IgogCitjb25maWcgTkVUX0ZBU1RCT09UCisJYm9v bAorCXNlbGVjdCBCQU5ORVIKKwlzZWxlY3QgRklMRV9MSVNUCisJc2VsZWN0IEZBU1RCT09UX0JB U0UKKwlwcm9tcHQgIkFuZHJvaWQgRmFzdGJvb3Qgc3VwcG9ydCIKKwloZWxwCisJICBUaGlzIG9w dGlvbiBhZGRzIHN1cHBvcnQgZm9yIHRoZSBVRFAgdmFyaWFudCBvZiB0aGUgRmFzdGJvb3QKKwkg IHByb3RvY29sLgorCiBlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0L01ha2VmaWxlIGIvbmV0L01ha2Vm aWxlCmluZGV4IGViOGQ0MzkxNTAuLjk2MmIyZGVjNTggMTAwNjQ0Ci0tLSBhL25ldC9NYWtlZmls ZQorKysgYi9uZXQvTWFrZWZpbGUKQEAgLTgsMyArOCw0IEBAIG9iai0kKENPTkZJR19DTURfUElO RykJKz0gcGluZy5vCiBvYmotJChDT05GSUdfTkVUX1JFU09MVikrPSBkbnMubwogb2JqLSQoQ09O RklHX05FVF9ORVRDT05TT0xFKSArPSBuZXRjb25zb2xlLm8KIG9iai0kKENPTkZJR19ORVRfSUZV UCkJKz0gaWZ1cC5vCitvYmotJChDT05GSUdfTkVUX0ZBU1RCT09UKSArPSBmYXN0Ym9vdC5vCmRp ZmYgLS1naXQgYS9uZXQvZmFzdGJvb3QuYyBiL25ldC9mYXN0Ym9vdC5jCm5ldyBmaWxlIG1vZGUg MTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAuLjljNjViNWMwYjEKLS0tIC9kZXYvbnVsbAorKysgYi9u ZXQvZmFzdGJvb3QuYwpAQCAtMCwwICsxLDU4MCBAQAorLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZp ZXI6IEJTRC0yLUNsYXVzZQorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBP cGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogQ29weXJpZ2h0IDIwMjAgRWRtdW5kIEhlbm5pZ2Vz IDxlaEBlbWxpeC5jb20+CisgKiBDb3B5cmlnaHQgMjAyMCBEYW5pZWwgR2zDtmNrbmVyIDxkZ0Bl bWxpeC5jb20+CisgKiBQb3J0ZWQgZnJvbSBVLUJvb3QgdG8gQmFyZWJveAorICovCisKKyNkZWZp bmUgcHJfZm10KGZtdCkgIm5ldCBmYXN0Ym9vdDogIiBmbXQKKworI2luY2x1ZGUgPGNvbW1vbi5o PgorI2luY2x1ZGUgPG5ldC5oPgorI2luY2x1ZGUgPGZhc3Rib290Lmg+CisjaW5jbHVkZSA8ZmFz dGJvb3RfbmV0Lmg+CisjaW5jbHVkZSA8ZW52aXJvbm1lbnQuaD4KKyNpbmNsdWRlIDxwcm9ncmVz cy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGluaXQuaD4KKyNpbmNsdWRlIDx3 b3JrLmg+CisjaW5jbHVkZSA8Z2xvYmFsdmFyLmg+CisjaW5jbHVkZSA8bWFnaWN2YXIuaD4KKwor I2RlZmluZSBGQVNUQk9PVF9QT1JUIDU1NTQKKyNkZWZpbmUgTUFYX01UVSAxNTAwCisjZGVmaW5l IFBBQ0tFVF9TSVpFIChtaW4oUEtUU0laRSwgTUFYX01UVSArIEVUSEVSX0hEUl9TSVpFKSBcCisJ CSAgICAgIC0gKG5ldF9ldGhfdG9fdWRwX3BheWxvYWQoMCkgLSAoY2hhciAqKTApKQorCitlbnVt IHsKKwlGQVNUQk9PVF9FUlJPUiA9IDAsCisJRkFTVEJPT1RfUVVFUlkgPSAxLAorCUZBU1RCT09U X0lOSVQgPSAyLAorCUZBU1RCT09UX0ZBU1RCT09UID0gMywKK307CisKK2VudW0gbWF5X3NlbmQg eworCU1BWV9OT1RfU0VORCwKKwlNQVlfU0VORF9NRVNTQUdFLAorCU1BWV9TRU5EX0FDSywKK307 CisKK3N0cnVjdCBfX3BhY2tlZCBmYXN0Ym9vdF9oZWFkZXIgeworCXU4IGlkOworCXU4IGZsYWdz OworCXUxNiBzZXE7Cit9OworCisjZGVmaW5lIEZBU1RCT09UX01BWF9NU0dfTEVOIDY0CisKK3N0 cnVjdCBmYXN0Ym9vdF9uZXQgeworCXN0cnVjdCBmYXN0Ym9vdCBmYXN0Ym9vdDsKKworCXN0cnVj dCBuZXRfY29ubmVjdGlvbiAqbmV0X2NvbjsKKwlzdHJ1Y3QgZmFzdGJvb3RfaGVhZGVyIHJlc3Bv bnNlX2hlYWRlcjsKKwlzdHJ1Y3QgcG9sbGVyX3N0cnVjdCBwb2xsZXI7CisJc3RydWN0IHdvcmtf cXVldWUgd3E7CisJdTY0IGhvc3Rfd2FpdHNfc2luY2U7CisJdTY0IGxhc3RfZG93bmxvYWRfcGt0 OworCWJvb2wgc2VxdWVuY2VfbnVtYmVyX3NlZW47CisJYm9vbCBhY3RpdmVfZG93bmxvYWQ7CisJ Ym9vbCByZWluaXQ7CisJYm9vbCBzZW5kX2tlZXBfYWxpdmU7CisJZW51bSBtYXlfc2VuZCBtYXlf c2VuZDsKKworCUlQYWRkcl90IGhvc3RfYWRkcjsKKwl1MTYgaG9zdF9wb3J0OworCXU4IGhvc3Rf bWFjW0VUSF9BTEVOXTsKKwl1MTYgc2VxdWVuY2VfbnVtYmVyOworCXUxNiBsYXN0X3BheWxvYWRf bGVuOworCXZvaWQgKmxhc3RfcGF5bG9hZDsKK307CisKK3N0YXRpYyBjb25zdCB1c2hvcnQgdWRw X3ZlcnNpb24gPSAxOworCitzdGF0aWMgYm9vbCBpc19jdXJyZW50X2Nvbm5lY3Rpb24oc3RydWN0 IGZhc3Rib290X25ldCAqZmJuKQoreworCXJldHVybiBmYm4tPmhvc3RfYWRkciA9PSBuZXRfcmVh ZF9pcCgmZmJuLT5uZXRfY29uLT5pcC0+ZGFkZHIpICYmCisJICAgICAgIGZibi0+aG9zdF9wb3J0 ID09IGZibi0+bmV0X2Nvbi0+dWRwLT51aF9kcG9ydDsKK30KKworc3RhdGljIHZvaWQgZmFzdGJv b3RfbmV0X2Fib3J0KHN0cnVjdCBmYXN0Ym9vdF9uZXQgKmZibikKK3sKKwlmYm4tPnJlaW5pdCA9 IHRydWU7CisKKwlmYXN0Ym9vdF9hYm9ydCgmZmJuLT5mYXN0Ym9vdCk7CisKKwlmYm4tPmFjdGl2 ZV9kb3dubG9hZCA9IGZhbHNlOworCisJcG9sbGVyX3VucmVnaXN0ZXIoJmZibi0+cG9sbGVyKTsK KworCS8qCisJICogSWYgdGhlIGhvc3Qgc2VuZHMgYSBkYXRhIHBhY2tldCBhdCBhIHRpbWUgd2hl biBhbiBlbXB0eSBwYWNrZXQgd2FzCisJICogZXhwZWN0ZWQsIGZhc3Rib290X2Fib3J0IGlzIGNh bGxlZCBhbmQgYW4gZXJyb3IgbWVzc2FnZSBpcyBzZW50LgorCSAqIFdlIGRvbid0IHdhbnQgdG8g ZXhlY3V0ZSB0aGUgY29udGVudHMgb2YgdGhlIGJhZCBwYWNrZXQgYWZ0ZXJ3YXJkcy4KKwkgKiBD bGVhcmluZyBjb21tYW5kIGFsc28gdGVsbHMgb3VyIGtlZXAtYWxpdmUgcG9sbGVyIHRvIHN0b3Ag c2VuZGluZworCSAqIG1lc3NhZ2VzLgorCSAqLworCXdxX2NhbmNlbF93b3JrKCZmYm4tPndxKTsK KworCWZyZWUoZmJuLT5sYXN0X3BheWxvYWQpOworCWZibi0+bGFzdF9wYXlsb2FkID0gTlVMTDsK K30KKworc3RhdGljIHZvaWQgZmFzdGJvb3RfbmV0X3NhdmVfcGF5bG9hZChzdHJ1Y3QgZmFzdGJv b3RfbmV0ICpmYm4sIHZvaWQgKnBhY2tldCwKKwkJCQkgICAgICBpbnQgbGVuKQoreworCS8qIFNh dmUgcGFja2V0IGZvciByZXRyYW5zbWl0dGluZyAqLworCisJZmJuLT5sYXN0X3BheWxvYWRfbGVu ID0gbGVuOworCWZyZWUoZmJuLT5sYXN0X3BheWxvYWQpOworCWZibi0+bGFzdF9wYXlsb2FkID0g bWVtZHVwKHBhY2tldCwgbGVuKTsKK30KKworc3RhdGljIHZvaWQgZmFzdGJvb3Rfc2VuZChzdHJ1 Y3QgZmFzdGJvb3RfbmV0ICpmYm4sCisJCQkgIHN0cnVjdCBmYXN0Ym9vdF9oZWFkZXIgaGVhZGVy LAorCQkJICBjb25zdCBjaGFyICplcnJvcl9tc2cpCit7CisJc2hvcnQgdG1wOworCXVjaGFyICpw YWNrZXQgPSBuZXRfdWRwX2dldF9wYXlsb2FkKGZibi0+bmV0X2Nvbik7CisJdWNoYXIgKnBhY2tl dF9iYXNlID0gcGFja2V0OworCWJvb2wgY3VycmVudF9zZXNzaW9uID0gZmFsc2U7CisKKwlpZiAo ZmJuLT5zZXF1ZW5jZV9udW1iZXIgPT0gbnRvaHMoaGVhZGVyLnNlcSkgJiYKKwkgICAgaXNfY3Vy cmVudF9jb25uZWN0aW9uKGZibikpCisJCWN1cnJlbnRfc2Vzc2lvbiA9IHRydWU7CisKKwlpZiAo ZXJyb3JfbXNnKQorCQloZWFkZXIuaWQgPSBGQVNUQk9PVF9FUlJPUjsKKworCS8qIHNlbmQgaGVh ZGVyICovCisJbWVtY3B5KHBhY2tldCwgJmhlYWRlciwgc2l6ZW9mKGhlYWRlcikpOworCXBhY2tl dCArPSBzaXplb2YoaGVhZGVyKTsKKworCXN3aXRjaCAoaGVhZGVyLmlkKSB7CisJY2FzZSBGQVNU Qk9PVF9RVUVSWToKKwkJLyogc2VuZCBzZXF1ZW5jZSBudW1iZXIgKi8KKwkJdG1wID0gaHRvbnMo ZmJuLT5zZXF1ZW5jZV9udW1iZXIpOworCQltZW1jcHkocGFja2V0LCAmdG1wLCBzaXplb2YodG1w KSk7CisJCXBhY2tldCArPSBzaXplb2YodG1wKTsKKwkJYnJlYWs7CisJY2FzZSBGQVNUQk9PVF9J TklUOgorCQkvKiBzZW5kIHVkcCB2ZXJzaW9uIGFuZCBwYWNrZXQgc2l6ZSAqLworCQl0bXAgPSBo dG9ucyh1ZHBfdmVyc2lvbik7CisJCW1lbWNweShwYWNrZXQsICZ0bXAsIHNpemVvZih0bXApKTsK KwkJcGFja2V0ICs9IHNpemVvZih0bXApOworCQl0bXAgPSBodG9ucyhQQUNLRVRfU0laRSk7CisJ CW1lbWNweShwYWNrZXQsICZ0bXAsIHNpemVvZih0bXApKTsKKwkJcGFja2V0ICs9IHNpemVvZih0 bXApOworCQlicmVhazsKKwljYXNlIEZBU1RCT09UX0VSUk9SOgorCQlwcl9lcnIoIiVzXG4iLCBl cnJvcl9tc2cpOworCisJCS8qIHNlbmQgZXJyb3IgbWVzc2FnZSAqLworCQl0bXAgPSBzdHJsZW4o ZXJyb3JfbXNnKTsKKwkJbWVtY3B5KHBhY2tldCwgZXJyb3JfbXNnLCB0bXApOworCQlwYWNrZXQg Kz0gdG1wOworCisJCWlmIChjdXJyZW50X3Nlc3Npb24pCisJCQlmYXN0Ym9vdF9uZXRfYWJvcnQo ZmJuKTsKKworCQlicmVhazsKKwl9CisKKwlpZiAoY3VycmVudF9zZXNzaW9uICYmIGhlYWRlci5p ZCAhPSBGQVNUQk9PVF9RVUVSWSkgeworCQlmYm4tPnNlcXVlbmNlX251bWJlcisrOworCQlmYm4t PnNlcXVlbmNlX251bWJlcl9zZWVuID0gZmFsc2U7CisJCWZhc3Rib290X25ldF9zYXZlX3BheWxv YWQoZmJuLCBwYWNrZXRfYmFzZSwgcGFja2V0IC0gcGFja2V0X2Jhc2UpOworCX0KKwluZXRfdWRw X3NlbmQoZmJuLT5uZXRfY29uLCBwYWNrZXQgLSBwYWNrZXRfYmFzZSk7Cit9CisKK3N0YXRpYyBp bnQgZmFzdGJvb3RfbmV0X3dhaXRfbWF5X3NlbmQoc3RydWN0IGZhc3Rib290X25ldCAqZmJuKQor eworCXVpbnQ2NF90IHN0YXJ0ID0gZ2V0X3RpbWVfbnMoKTsKKworCXdoaWxlICghaXNfdGltZW91 dChzdGFydCwgMiAqIFNFQ09ORCkpIHsKKwkJaWYgKGZibi0+bWF5X3NlbmQgIT0gTUFZX05PVF9T RU5EKQorCQkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIC1FVElNRURPVVQ7Cit9CisKK3N0YXRp YyBpbnQgZmFzdGJvb3Rfd3JpdGVfbmV0KHN0cnVjdCBmYXN0Ym9vdCAqZmIsIGNvbnN0IGNoYXIg KmJ1ZiwKKwkJCSAgICAgIHVuc2lnbmVkIGludCBuKQoreworCXN0cnVjdCBmYXN0Ym9vdF9uZXQg KmZibiA9IGNvbnRhaW5lcl9vZihmYiwgc3RydWN0IGZhc3Rib290X25ldCwKKwkJCQkJCWZhc3Ri b290KTsKKwlzdHJ1Y3QgZmFzdGJvb3RfaGVhZGVyIHJlc3BvbnNlX2hlYWRlcjsKKwl1Y2hhciAq cGFja2V0OworCXVjaGFyICpwYWNrZXRfYmFzZTsKKwlpbnQgcmV0OworCisJaWYgKGZibi0+cmVp bml0KQorCQlyZXR1cm4gMDsKKworCS8qCisJICogVGhpcyBmdW5jdGlvbiBpcyBlaXRoZXIgY2Fs bGVkIGluIGNvbW1hbmQgY29udGV4dCwgaW4gd2hpY2gKKwkgKiBjYXNlIHdlIG1heSB3YWl0LCBv ciBmcm9tIHRoZSBrZWVwYWxpdmUgcG9sbGVyIHdoaWNoIGV4cGxpY2l0bHkKKwkgKiBvbmx5IGNh bGxzIHVzIHdoZW4gd2UgZG9uJ3QgaGF2ZSB0byB3YWl0IGhlcmUuCisJICovCisJcmV0ID0gZmFz dGJvb3RfbmV0X3dhaXRfbWF5X3NlbmQoZmJuKTsKKwlpZiAocmV0KSB7CisJCWZhc3Rib290X25l dF9hYm9ydChmYm4pOworCQlyZXR1cm4gcmV0OworCX0KKworCWlmIChuICYmIGZibi0+bWF5X3Nl bmQgPT0gTUFZX1NFTkRfQUNLKSB7CisJCWZhc3Rib290X3NlbmQoZmJuLCBmYm4tPnJlc3BvbnNl X2hlYWRlciwKKwkJCQkiSGF2ZSBtZXNzYWdlIGJ1dCBvbmx5IEFDSyBhbGxvd2VkIik7CisJCXJl dHVybiAtRVBST1RPOworCX0gZWxzZSBpZiAoIW4gJiYgZmJuLT5tYXlfc2VuZCA9PSBNQVlfU0VO RF9NRVNTQUdFKSB7CisJCWZhc3Rib290X3NlbmQoZmJuLCBmYm4tPnJlc3BvbnNlX2hlYWRlciwK KwkJCQkiV2FudCB0byBzZW5kIEFDSyBidXQgbWVzc2FnZSBleHBlY3RlZCIpOworCQlyZXR1cm4g LUVQUk9UTzsKKwl9CisKKwlyZXNwb25zZV9oZWFkZXIgPSBmYm4tPnJlc3BvbnNlX2hlYWRlcjsK KwlyZXNwb25zZV9oZWFkZXIuZmxhZ3MgPSAwOworCXJlc3BvbnNlX2hlYWRlci5zZXEgPSBodG9u cyhmYm4tPnNlcXVlbmNlX251bWJlcik7CisJKytmYm4tPnNlcXVlbmNlX251bWJlcjsKKwlmYm4t PnNlcXVlbmNlX251bWJlcl9zZWVuID0gZmFsc2U7CisKKwlwYWNrZXQgPSBuZXRfdWRwX2dldF9w YXlsb2FkKGZibi0+bmV0X2Nvbik7CisJcGFja2V0X2Jhc2UgPSBwYWNrZXQ7CisKKwkvKiBXcml0 ZSBoZWFkZXJzICovCisJbWVtY3B5KHBhY2tldCwgJnJlc3BvbnNlX2hlYWRlciwgc2l6ZW9mKHJl c3BvbnNlX2hlYWRlcikpOworCXBhY2tldCArPSBzaXplb2YocmVzcG9uc2VfaGVhZGVyKTsKKwkv KiBXcml0ZSByZXNwb25zZSAqLworCW1lbWNweShwYWNrZXQsIGJ1Ziwgbik7CisJcGFja2V0ICs9 IG47CisKKwlmYXN0Ym9vdF9uZXRfc2F2ZV9wYXlsb2FkKGZibiwgcGFja2V0X2Jhc2UsIHBhY2tl dCAtIHBhY2tldF9iYXNlKTsKKworCW1lbWNweShmYm4tPm5ldF9jb24tPmV0LT5ldF9kZXN0LCBm Ym4tPmhvc3RfbWFjLCBFVEhfQUxFTik7CisJbmV0X3dyaXRlX2lwKCZmYm4tPm5ldF9jb24tPmlw LT5kYWRkciwgZmJuLT5ob3N0X2FkZHIpOworCWZibi0+bmV0X2Nvbi0+dWRwLT51aF9kcG9ydCA9 IGZibi0+aG9zdF9wb3J0OworCisJZmJuLT5tYXlfc2VuZCA9IE1BWV9OT1RfU0VORDsKKworCW5l dF91ZHBfc2VuZChmYm4tPm5ldF9jb24sIGZibi0+bGFzdF9wYXlsb2FkX2xlbik7CisKKwlyZXR1 cm4gMDsKK30KKworc3RhdGljIHZvaWQgZmFzdGJvb3Rfc3RhcnRfZG93bmxvYWRfbmV0KHN0cnVj dCBmYXN0Ym9vdCAqZmIpCit7CisJc3RydWN0IGZhc3Rib290X25ldCAqZmJuID0gY29udGFpbmVy X29mKGZiLCBzdHJ1Y3QgZmFzdGJvb3RfbmV0LAorCQkJCQkJZmFzdGJvb3QpOworCisJZmFzdGJv b3Rfc3RhcnRfZG93bmxvYWRfZ2VuZXJpYyhmYik7CisJZmJuLT5hY3RpdmVfZG93bmxvYWQgPSB0 cnVlOworCWZibi0+bGFzdF9kb3dubG9hZF9wa3QgPSBnZXRfdGltZV9ucygpOworfQorCisvKiBt dXN0IHNlbmQgZXhhY3RseSBvbmUgcGFja2V0IG9uIGFsbCBjb2RlIHBhdGhzICovCitzdGF0aWMg dm9pZCBmYXN0Ym9vdF9kYXRhX2Rvd25sb2FkKHN0cnVjdCBmYXN0Ym9vdF9uZXQgKmZibiwKKwkJ CQkgICBjb25zdCB2b2lkICpmYXN0Ym9vdF9kYXRhLAorCQkJCSAgIHVuc2lnbmVkIGludCBmYXN0 Ym9vdF9kYXRhX2xlbikKK3sKKwlpbnQgcmV0OworCisJaWYgKGZhc3Rib290X2RhdGFfbGVuID09 IDAgfHwKKwkgICAgKGZibi0+ZmFzdGJvb3QuZG93bmxvYWRfYnl0ZXMgKyBmYXN0Ym9vdF9kYXRh X2xlbikgPgorCSAgICBmYm4tPmZhc3Rib290LmRvd25sb2FkX3NpemUpIHsKKwkJZmFzdGJvb3Rf c2VuZChmYm4sIGZibi0+cmVzcG9uc2VfaGVhZGVyLAorCQkJICAgICAgIlJlY2VpdmVkIGludmFs aWQgZGF0YSBsZW5ndGgiKTsKKwkJcmV0dXJuOworCX0KKworCXJldCA9IGZhc3Rib290X2hhbmRs ZV9kb3dubG9hZF9kYXRhKCZmYm4tPmZhc3Rib290LCBmYXN0Ym9vdF9kYXRhLAorCQkJCQkgICAg ZmFzdGJvb3RfZGF0YV9sZW4pOworCWlmIChyZXQgPCAwKSB7CisJCWZhc3Rib290X3NlbmQoZmJu LCBmYm4tPnJlc3BvbnNlX2hlYWRlciwgc3RyZXJyb3IoLXJldCkpOworCQlyZXR1cm47CisJfQor CisJZmFzdGJvb3RfdHhfcHJpbnQoJmZibi0+ZmFzdGJvb3QsIEZBU1RCT09UX01TR19OT05FLCAi Iik7Cit9CisKK3N0cnVjdCBmYXN0Ym9vdF93b3JrIHsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29y azsKKwlzdHJ1Y3QgZmFzdGJvb3RfbmV0ICpmYm47CisJYm9vbCBkb3dubG9hZF9maW5pc2hlZDsK KwljaGFyIGNvbW1hbmRbRkFTVEJPT1RfTUFYX0NNRF9MRU4gKyAxXTsKK307CisKK3N0YXRpYyB2 b2lkIGZhc3Rib290X2hhbmRsZV90eXBlX2Zhc3Rib290KHN0cnVjdCBmYXN0Ym9vdF9uZXQgKmZi biwKKwkJCQkJICBzdHJ1Y3QgZmFzdGJvb3RfaGVhZGVyIGhlYWRlciwKKwkJCQkJICBjaGFyICpm YXN0Ym9vdF9kYXRhLAorCQkJCQkgIHVuc2lnbmVkIGludCBmYXN0Ym9vdF9kYXRhX2xlbikKK3sK KwlzdHJ1Y3QgZmFzdGJvb3Rfd29yayAqdzsKKworCWZibi0+cmVzcG9uc2VfaGVhZGVyID0gaGVh ZGVyOworCWZibi0+aG9zdF93YWl0c19zaW5jZSA9IGdldF90aW1lX25zKCk7CisJZmJuLT5tYXlf c2VuZCA9IGZhc3Rib290X2RhdGFfbGVuID8gTUFZX1NFTkRfQUNLIDogTUFZX1NFTkRfTUVTU0FH RTsKKworCWlmIChmYm4tPmFjdGl2ZV9kb3dubG9hZCkgeworCQlmYm4tPmxhc3RfZG93bmxvYWRf cGt0ID0gZ2V0X3RpbWVfbnMoKTsKKworCQlpZiAoIWZhc3Rib290X2RhdGFfbGVuICYmIGZibi0+ ZmFzdGJvb3QuZG93bmxvYWRfYnl0ZXMKKwkJCQkJICAgPT0gZmJuLT5mYXN0Ym9vdC5kb3dubG9h ZF9zaXplKSB7CisKKwkJCWZibi0+YWN0aXZlX2Rvd25sb2FkID0gZmFsc2U7CisKKwkJCXcgPSB4 emFsbG9jKHNpemVvZigqdykpOworCQkJdy0+ZmJuID0gZmJuOworCQkJdy0+ZG93bmxvYWRfZmlu aXNoZWQgPSB0cnVlOworCisJCQl3cV9xdWV1ZV93b3JrKCZmYm4tPndxLCAmdy0+d29yayk7CisJ CX0gZWxzZSB7CisJCQlmYXN0Ym9vdF9kYXRhX2Rvd25sb2FkKGZibiwgZmFzdGJvb3RfZGF0YSwK KwkJCQkJICAgICAgIGZhc3Rib290X2RhdGFfbGVuKTsKKwkJfQorCQlyZXR1cm47CisJfQorCisJ aWYgKGZhc3Rib290X2RhdGFfbGVuID4gRkFTVEJPT1RfTUFYX0NNRF9MRU4pIHsKKwkJZmFzdGJv b3Rfc2VuZChmYm4sIGhlYWRlciwgImNvbW1hbmQgdG9vIGxvbmciKTsKKwkJcmV0dXJuOworCX0K KworCWlmICghbGlzdF9lbXB0eSgmZmJuLT53cS53b3JrKSkKKwkJcmV0dXJuOworCisJaWYgKGZh c3Rib290X2RhdGFfbGVuKSB7CisJCXcgPSB4emFsbG9jKHNpemVvZigqdykpOworCQl3LT5mYm4g PSBmYm47CisJCW1lbWNweSh3LT5jb21tYW5kLCBmYXN0Ym9vdF9kYXRhLCBmYXN0Ym9vdF9kYXRh X2xlbik7CisJCXctPmNvbW1hbmRbZmFzdGJvb3RfZGF0YV9sZW5dID0gMDsKKworCQl3cV9xdWV1 ZV93b3JrKCZmYm4tPndxLCAmdy0+d29yayk7CisJfQorfQorCitzdGF0aWMgdm9pZCBmYXN0Ym9v dF9jaGVja19yZXRyYW5zbWl0KHN0cnVjdCBmYXN0Ym9vdF9uZXQgKmZibiwKKwkJCQkgICAgICBz dHJ1Y3QgZmFzdGJvb3RfaGVhZGVyIGhlYWRlcikKK3sKKwlpZiAobnRvaHMoaGVhZGVyLnNlcSkg PT0gZmJuLT5zZXF1ZW5jZV9udW1iZXIgLSAxICYmCisJICAgIGlzX2N1cnJlbnRfY29ubmVjdGlv bihmYm4pKSB7CisJCS8qIFJldHJhbnNtaXQgbGFzdCBzZW50IHBhY2tldCAqLworCQltZW1jcHko bmV0X3VkcF9nZXRfcGF5bG9hZChmYm4tPm5ldF9jb24pLAorCQkgICAgICAgZmJuLT5sYXN0X3Bh eWxvYWQsIGZibi0+bGFzdF9wYXlsb2FkX2xlbik7CisJCW5ldF91ZHBfc2VuZChmYm4tPm5ldF9j b24sIGZibi0+bGFzdF9wYXlsb2FkX2xlbik7CisJfQorfQorCitzdGF0aWMgdm9pZCBmYXN0Ym9v dF9oYW5kbGVyKHZvaWQgKmN0eCwgY2hhciAqcGFja2V0LCB1bnNpZ25lZCBpbnQgcmF3X2xlbikK K3sKKwl1bnNpZ25lZCBpbnQgbGVuID0gbmV0X2V0aF90b191ZHBsZW4ocGFja2V0KTsKKwlzdHJ1 Y3QgZXRoZXJuZXQgKmV0aF9oZWFkZXIgPSAoc3RydWN0IGV0aGVybmV0ICopcGFja2V0OworCXN0 cnVjdCBpcGhkciAqaXBfaGVhZGVyID0gbmV0X2V0aF90b19pcGhkcihwYWNrZXQpOworCXN0cnVj dCB1ZHBoZHIgKnVkcF9oZWFkZXIgPSBuZXRfZXRoX3RvX3VkcGhkcihwYWNrZXQpOworCWNoYXIg KnBheWxvYWQgPSBuZXRfZXRoX3RvX3VkcF9wYXlsb2FkKHBhY2tldCk7CisJc3RydWN0IGZhc3Ri b290X25ldCAqZmJuID0gY3R4OworCXN0cnVjdCBmYXN0Ym9vdF9oZWFkZXIgaGVhZGVyOworCWNo YXIgKmZhc3Rib290X2RhdGEgPSBwYXlsb2FkICsgc2l6ZW9mKGhlYWRlcik7CisJdTE2IHRvdF9s ZW4gPSBudG9ocyhpcF9oZWFkZXItPnRvdF9sZW4pOworCWludCByZXQ7CisKKwkvKiBjYXRjaCBi b2d1cyB0b3RfbGVuIHZhbHVlcyAqLworCWlmICgoY2hhciAqKWlwX2hlYWRlciAtIHBhY2tldCAr IHRvdF9sZW4gPiByYXdfbGVuKQorCQlyZXR1cm47CisKKwkvKiBjYXRjaCBwYWNrZXRzIHNwbGl0 IGludG8gZnJhZ21lbnRzIHRoYXQgYXJlIHRvbyBzbWFsbCB0byByZXBseSAqLworCWlmIChmYXN0 Ym9vdF9kYXRhIC0gKGNoYXIgKilpcF9oZWFkZXIgPiB0b3RfbGVuKQorCQlyZXR1cm47CisKKwkv KiBjYXRjaCBwYWNrZXRzIHRvbyBzbWFsbCB0byBiZSB2YWxpZCAqLworCWlmIChsZW4gPCBzaXpl b2Yoc3RydWN0IGZhc3Rib290X2hlYWRlcikpCisJCXJldHVybjsKKworCW1lbWNweSgmaGVhZGVy LCBwYXlsb2FkLCBzaXplb2YoaGVhZGVyKSk7CisJaGVhZGVyLmZsYWdzID0gMDsKKwlsZW4gLT0g c2l6ZW9mKGhlYWRlcik7CisKKwkvKiBjYXRjaCByZW1haW5pbmcgZnJhZ21lbnRlZCBwYWNrZXRz ICovCisJaWYgKGZhc3Rib290X2RhdGEgLSAoY2hhciAqKWlwX2hlYWRlciArIGxlbiA+IHRvdF9s ZW4pIHsKKwkJZmFzdGJvb3Rfc2VuZChmYm4sIGhlYWRlciwKKwkJCSAgICAgICJjYW4ndCByZWFz c2VtYmxlIGZyYWdtZW50ZWQgZnJhbWVzIik7CisJCXJldHVybjsKKwl9CisJLyogY2F0Y2ggdG9v IGxhcmdlIHBhY2tldHMgKi8KKwlpZiAobGVuID4gUEFDS0VUX1NJWkUpIHsKKwkJZmFzdGJvb3Rf c2VuZChmYm4sIGhlYWRlciwgInBhY2tldCB0b28gbGFyZ2UiKTsKKwkJcmV0dXJuOworCX0KKwor CW1lbWNweShmYm4tPm5ldF9jb24tPmV0LT5ldF9kZXN0LCBldGhfaGVhZGVyLT5ldF9zcmMsIEVU SF9BTEVOKTsKKwluZXRfY29weV9pcCgmZmJuLT5uZXRfY29uLT5pcC0+ZGFkZHIsICZpcF9oZWFk ZXItPnNhZGRyKTsKKwlmYm4tPm5ldF9jb24tPnVkcC0+dWhfZHBvcnQgPSB1ZHBfaGVhZGVyLT51 aF9zcG9ydDsKKworCXN3aXRjaCAoaGVhZGVyLmlkKSB7CisJY2FzZSBGQVNUQk9PVF9RVUVSWToK KwkJZmFzdGJvb3Rfc2VuZChmYm4sIGhlYWRlciwgTlVMTCk7CisJCWJyZWFrOworCWNhc2UgRkFT VEJPT1RfSU5JVDoKKwkJaWYgKG50b2hzKGhlYWRlci5zZXEpICE9IGZibi0+c2VxdWVuY2VfbnVt YmVyKSB7CisJCQlmYXN0Ym9vdF9jaGVja19yZXRyYW5zbWl0KGZibiwgaGVhZGVyKTsKKwkJCWJy ZWFrOworCQl9CisJCWZibi0+aG9zdF9hZGRyID0gbmV0X3JlYWRfaXAoJmlwX2hlYWRlci0+c2Fk ZHIpOworCQlmYm4tPmhvc3RfcG9ydCA9IHVkcF9oZWFkZXItPnVoX3Nwb3J0OworCQltZW1jcHko ZmJuLT5ob3N0X21hYywgZXRoX2hlYWRlci0+ZXRfc3JjLCBFVEhfQUxFTik7CisJCWZhc3Rib290 X25ldF9hYm9ydChmYm4pOworCQkvKiBwb2xsZXIganVzdCB1bnJlZ2lzdGVyZWQgaW4gZmFzdGJv b3RfbmV0X2Fib3J0KCkgKi8KKwkJcmV0ID0gcG9sbGVyX3JlZ2lzdGVyKCZmYm4tPnBvbGxlciwg ImZhc3Rib290Iik7CisJCWlmIChyZXQpIHsKKwkJCXByX2VycigiQ2Fubm90IHJlZ2lzdGVyIHBv bGxlcjogJXNcbiIsIHN0cmVycm9yKC1yZXQpKTsKKwkJCXJldHVybjsKKwkJfQorCQlmYXN0Ym9v dF9zZW5kKGZibiwgaGVhZGVyLCBOVUxMKTsKKwkJYnJlYWs7CisJY2FzZSBGQVNUQk9PVF9GQVNU Qk9PVDoKKwkJaWYgKCFpc19jdXJyZW50X2Nvbm5lY3Rpb24oZmJuKSkKKwkJCWJyZWFrOworCQlt ZW1jcHkoZmJuLT5ob3N0X21hYywgZXRoX2hlYWRlci0+ZXRfc3JjLCBFVEhfQUxFTik7CisKKwkJ aWYgKG50b2hzKGhlYWRlci5zZXEpICE9IGZibi0+c2VxdWVuY2VfbnVtYmVyKSB7CisJCQlmYXN0 Ym9vdF9jaGVja19yZXRyYW5zbWl0KGZibiwgaGVhZGVyKTsKKwkJfSBlbHNlIGlmICghZmJuLT5z ZXF1ZW5jZV9udW1iZXJfc2VlbikgeworCQkJZmJuLT5zZXF1ZW5jZV9udW1iZXJfc2VlbiA9IHRy dWU7CisJCQlmYXN0Ym9vdF9oYW5kbGVfdHlwZV9mYXN0Ym9vdChmYm4sIGhlYWRlciwKKwkJCQkJ CSAgICAgIGZhc3Rib290X2RhdGEsIGxlbik7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJ ZmFzdGJvb3Rfc2VuZChmYm4sIGhlYWRlciwgInVua25vd24gcGFja2V0IHR5cGUiKTsKKwkJYnJl YWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBmYXN0Ym9vdF9kb193b3JrKHN0cnVjdCB3b3JrX3N0 cnVjdCAqdykKK3sKKwlzdHJ1Y3QgZmFzdGJvb3Rfd29yayAqZncgPSBjb250YWluZXJfb2Yodywg c3RydWN0IGZhc3Rib290X3dvcmssIHdvcmspOworCXN0cnVjdCBmYXN0Ym9vdF9uZXQgKmZibiA9 IGZ3LT5mYm47CisKKwlpZiAoZnctPmRvd25sb2FkX2ZpbmlzaGVkKSB7CisJCWZhc3Rib290X2Rv d25sb2FkX2ZpbmlzaGVkKCZmYm4tPmZhc3Rib290KTsKKwkJZ290byBvdXQ7CisJfQorCisJZmJu LT5yZWluaXQgPSBmYWxzZTsKKwlmYXN0Ym9vdF90eF9wcmludCgmZmJuLT5mYXN0Ym9vdCwgRkFT VEJPT1RfTVNHX05PTkUsICIiKTsKKworCWZibi0+c2VuZF9rZWVwX2FsaXZlID0gdHJ1ZTsKKwor CWZhc3Rib290X2V4ZWNfY21kKCZmYm4tPmZhc3Rib290LCBmdy0+Y29tbWFuZCk7CisJZmJuLT5z ZW5kX2tlZXBfYWxpdmUgPSBmYWxzZTsKK291dDoKKwlmcmVlKGZ3KTsKK30KKworc3RhdGljIHZv aWQgZmFzdGJvb3Rfd29ya19jYW5jZWwoc3RydWN0IHdvcmtfc3RydWN0ICp3KQoreworCXN0cnVj dCBmYXN0Ym9vdF93b3JrICpmdyA9IGNvbnRhaW5lcl9vZih3LCBzdHJ1Y3QgZmFzdGJvb3Rfd29y aywgd29yayk7CisKKwlmcmVlKGZ3KTsKK30KKworc3RhdGljIHZvaWQgZmFzdGJvb3RfcG9sbChz dHJ1Y3QgcG9sbGVyX3N0cnVjdCAqcG9sbGVyKQoreworCXN0cnVjdCBmYXN0Ym9vdF9uZXQgKmZi biA9IGNvbnRhaW5lcl9vZihwb2xsZXIsIHN0cnVjdCBmYXN0Ym9vdF9uZXQsCisJCQkJCSAgICAg ICBwb2xsZXIpOworCisJaWYgKGZibi0+YWN0aXZlX2Rvd25sb2FkICYmIGlzX3RpbWVvdXQoZmJu LT5sYXN0X2Rvd25sb2FkX3BrdCwKKwkgICAgNSAqIFNFQ09ORCkpIHsKKwkJcHJfZXJyKCJObyBw cm9ncmVzcyBmb3IgNXMsIGFib3J0aW5nXG4iKTsKKwkJZmFzdGJvb3RfbmV0X2Fib3J0KGZibik7 CisJCXJldHVybjsKKwl9CisKKwlpZiAoIWZibi0+c2VuZF9rZWVwX2FsaXZlKQorCQlyZXR1cm47 CisKKwlpZiAoIWlzX3RpbWVvdXQoZmJuLT5ob3N0X3dhaXRzX3NpbmNlLCAzMFVMTCAqIFNFQ09O RCkpCisJCXJldHVybjsKKworCWlmIChmYm4tPm1heV9zZW5kICE9IE1BWV9TRU5EX01FU1NBR0Up CisJCXJldHVybjsKKworCWZhc3Rib290X3R4X3ByaW50KCZmYm4tPmZhc3Rib290LCBGQVNUQk9P VF9NU0dfSU5GTywgInN0aWxsIGJ1c3kiKTsKK30KKwordm9pZCBmYXN0Ym9vdF9uZXRfZnJlZShz dHJ1Y3QgZmFzdGJvb3RfbmV0ICpmYm4pCit7CisJZmFzdGJvb3RfZ2VuZXJpY19jbG9zZSgmZmJu LT5mYXN0Ym9vdCk7CisJbmV0X3VucmVnaXN0ZXIoZmJuLT5uZXRfY29uKTsKKwlmYXN0Ym9vdF9n ZW5lcmljX2ZyZWUoJmZibi0+ZmFzdGJvb3QpOworCXdxX3VucmVnaXN0ZXIoJmZibi0+d3EpOwor CWZyZWUoZmJuLT5sYXN0X3BheWxvYWQpOworCWZyZWUoZmJuKTsKK30KKworc3RydWN0IGZhc3Ri b290X25ldCAqZmFzdGJvb3RfbmV0X2luaXQoc3RydWN0IGZhc3Rib290X29wdHMgKm9wdHMpCit7 CisJc3RydWN0IGZhc3Rib290X25ldCAqZmJuOworCWludCByZXQ7CisKKwlmYm4gPSB4emFsbG9j KHNpemVvZigqZmJuKSk7CisJZmJuLT5mYXN0Ym9vdC53cml0ZSA9IGZhc3Rib290X3dyaXRlX25l dDsKKwlmYm4tPmZhc3Rib290LnN0YXJ0X2Rvd25sb2FkID0gZmFzdGJvb3Rfc3RhcnRfZG93bmxv YWRfbmV0OworCisJaWYgKG9wdHMpIHsKKwkJZmJuLT5mYXN0Ym9vdC5maWxlcyA9IG9wdHMtPmZp bGVzOworCQlmYm4tPmZhc3Rib290LmNtZF9leGVjID0gb3B0cy0+Y21kX2V4ZWM7CisJCWZibi0+ ZmFzdGJvb3QuY21kX2ZsYXNoID0gb3B0cy0+Y21kX2ZsYXNoOworCQlyZXQgPSBmYXN0Ym9vdF9n ZW5lcmljX2luaXQoJmZibi0+ZmFzdGJvb3QsIG9wdHMtPmV4cG9ydF9iYnUpOworCX0gZWxzZSB7 CisJCWZibi0+ZmFzdGJvb3QuZmlsZXMgPSBmaWxlX2xpc3RfcGFyc2UoZmFzdGJvb3RfcGFydGl0 aW9ucworCQkJCQkJICAgICAgPyBmYXN0Ym9vdF9wYXJ0aXRpb25zCisJCQkJCQkgICAgICA6ICIi KTsKKwkJcmV0ID0gZmFzdGJvb3RfZ2VuZXJpY19pbml0KCZmYm4tPmZhc3Rib290LCBmYXN0Ym9v dF9iYnUpOworCX0KKwlpZiAocmV0KQorCQlnb3RvIGZhaWxfZ2VuZXJpY19pbml0OworCisJZmJu LT5uZXRfY29uID0gbmV0X3VkcF9uZXcoSVBfQlJPQURDQVNULCBGQVNUQk9PVF9QT1JULAorCQkJ CSAgIGZhc3Rib290X2hhbmRsZXIsIGZibik7CisJaWYgKElTX0VSUihmYm4tPm5ldF9jb24pKSB7 CisJCXJldCA9IFBUUl9FUlIoZmJuLT5uZXRfY29uKTsKKwkJZ290byBmYWlsX25ldF9jb247CisJ fQorCW5ldF91ZHBfYmluZChmYm4tPm5ldF9jb24sIEZBU1RCT09UX1BPUlQpOworCisJZXRoX29w ZW4oZmJuLT5uZXRfY29uLT5lZGV2KTsKKworCWZibi0+cG9sbGVyLmZ1bmMgPSBmYXN0Ym9vdF9w b2xsOworCisJZmJuLT53cS5mbiA9IGZhc3Rib290X2RvX3dvcms7CisJZmJuLT53cS5jYW5jZWwg PSBmYXN0Ym9vdF93b3JrX2NhbmNlbDsKKworCXdxX3JlZ2lzdGVyKCZmYm4tPndxKTsKKworCXJl dHVybiBmYm47CisKK2ZhaWxfbmV0X2NvbjoKKwlmYXN0Ym9vdF9nZW5lcmljX2ZyZWUoJmZibi0+ ZmFzdGJvb3QpOworZmFpbF9nZW5lcmljX2luaXQ6CisJZnJlZShmYm4pOworCXJldHVybiBFUlJf UFRSKHJldCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmFzdGJvb3RfbmV0ICpmYXN0Ym9vdF9uZXRf b2JqOworc3RhdGljIGludCBmYXN0Ym9vdF9uZXRfYXV0b3N0YXJ0OworCitzdGF0aWMgaW50IGZh c3Rib290X29uX2Jvb3Qodm9pZCkKK3sKKwlzdHJ1Y3QgZmFzdGJvb3RfbmV0ICpmYm47CisKKwln bG9iYWx2YXJfYWRkX3NpbXBsZV9ib29sKCJmYXN0Ym9vdC5uZXQuYXV0b3N0YXJ0IiwKKwkJCQkg ICZmYXN0Ym9vdF9uZXRfYXV0b3N0YXJ0KTsKKworCWlmICghZmFzdGJvb3RfbmV0X2F1dG9zdGFy dCkKKwkJcmV0dXJuIDA7CisKKwlpZnVwX2FsbCgwKTsKKwlmYm4gPSBmYXN0Ym9vdF9uZXRfaW5p dChOVUxMKTsKKworCWlmIChJU19FUlIoZmJuKSkKKwkJcmV0dXJuIFBUUl9FUlIoZmJuKTsKKwor CWZhc3Rib290X25ldF9vYmogPSBmYm47CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGZh c3Rib290X25ldF9leGl0KHZvaWQpCit7CisJaWYgKGZhc3Rib290X25ldF9vYmopCisJCWZhc3Ri b290X25ldF9mcmVlKGZhc3Rib290X25ldF9vYmopOworfQorCitwb3N0ZW52aXJvbm1lbnRfaW5p dGNhbGwoZmFzdGJvb3Rfb25fYm9vdCk7CitwcmVkZXZzaHV0ZG93bl9leGl0Y2FsbChmYXN0Ym9v dF9uZXRfZXhpdCk7CisKK0JBUkVCT1hfTUFHSUNWQVJfTkFNRUQoZ2xvYmFsX2Zhc3Rib290X25l dF9hdXRvc3RhcnQsCisJCSAgICAgICBnbG9iYWwuZmFzdGJvb3QubmV0LmF1dG9zdGFydCwKKwkJ ICAgICAgICJJZiB0cnVlLCBhdXRvbWF0aWNhbGx5IHN0YXJ0IGZhc3Rib290IG92ZXIgVURQIGR1 cmluZyBzdGFydHVwIik7Ci0tIAoyLjI4LjAKCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fXwpiYXJlYm94IG1haWxpbmcgbGlzdApiYXJlYm94QGxpc3RzLmlu ZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9i YXJlYm94Cg==